summaryrefslogtreecommitdiffstats
path: root/src/bin
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:44:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:44:03 +0000
commit293913568e6a7a86fd1479e1cff8e2ecb58d6568 (patch)
treefc3b469a3ec5ab71b36ea97cc7aaddb838423a0c /src/bin
parentInitial commit. (diff)
downloadpostgresql-16-293913568e6a7a86fd1479e1cff8e2ecb58d6568.tar.xz
postgresql-16-293913568e6a7a86fd1479e1cff8e2ecb58d6568.zip
Adding upstream version 16.2.upstream/16.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/Makefile44
-rw-r--r--src/bin/initdb/.gitignore5
-rw-r--r--src/bin/initdb/Makefile71
-rw-r--r--src/bin/initdb/findtimezone.c1777
-rw-r--r--src/bin/initdb/initdb.c3450
-rw-r--r--src/bin/initdb/meson.build38
-rw-r--r--src/bin/initdb/nls.mk16
-rw-r--r--src/bin/initdb/po/LINGUAS1
-rw-r--r--src/bin/initdb/po/cs.po1162
-rw-r--r--src/bin/initdb/po/de.po1065
-rw-r--r--src/bin/initdb/po/el.po1096
-rw-r--r--src/bin/initdb/po/es.po1076
-rw-r--r--src/bin/initdb/po/fr.po1352
-rw-r--r--src/bin/initdb/po/he.po1053
-rw-r--r--src/bin/initdb/po/it.po1168
-rw-r--r--src/bin/initdb/po/ja.po1053
-rw-r--r--src/bin/initdb/po/ka.po1056
-rw-r--r--src/bin/initdb/po/ko.po1137
-rw-r--r--src/bin/initdb/po/meson.build3
-rw-r--r--src/bin/initdb/po/pl.po1054
-rw-r--r--src/bin/initdb/po/pt_BR.po1053
-rw-r--r--src/bin/initdb/po/ru.po1295
-rw-r--r--src/bin/initdb/po/sv.po1093
-rw-r--r--src/bin/initdb/po/tr.po1159
-rw-r--r--src/bin/initdb/po/uk.po1053
-rw-r--r--src/bin/initdb/po/vi.po1044
-rw-r--r--src/bin/initdb/po/zh_CN.po1004
-rw-r--r--src/bin/initdb/po/zh_TW.po1369
-rw-r--r--src/bin/initdb/t/001_initdb.pl190
-rw-r--r--src/bin/meson.build22
-rw-r--r--src/bin/pg_amcheck/.gitignore3
-rw-r--r--src/bin/pg_amcheck/Makefile51
-rw-r--r--src/bin/pg_amcheck/README21
-rw-r--r--src/bin/pg_amcheck/meson.build35
-rw-r--r--src/bin/pg_amcheck/nls.mk12
-rw-r--r--src/bin/pg_amcheck/pg_amcheck.c2177
-rw-r--r--src/bin/pg_amcheck/po/LINGUAS1
-rw-r--r--src/bin/pg_amcheck/po/de.po533
-rw-r--r--src/bin/pg_amcheck/po/el.po545
-rw-r--r--src/bin/pg_amcheck/po/es.po533
-rw-r--r--src/bin/pg_amcheck/po/fr.po605
-rw-r--r--src/bin/pg_amcheck/po/it.po531
-rw-r--r--src/bin/pg_amcheck/po/ja.po545
-rw-r--r--src/bin/pg_amcheck/po/ka.po592
-rw-r--r--src/bin/pg_amcheck/po/ko.po566
-rw-r--r--src/bin/pg_amcheck/po/meson.build3
-rw-r--r--src/bin/pg_amcheck/po/ru.po607
-rw-r--r--src/bin/pg_amcheck/po/sv.po546
-rw-r--r--src/bin/pg_amcheck/po/uk.po516
-rw-r--r--src/bin/pg_amcheck/po/zh_CN.po500
-rw-r--r--src/bin/pg_amcheck/po/zh_TW.po538
-rw-r--r--src/bin/pg_amcheck/t/001_basic.pl14
-rw-r--r--src/bin/pg_amcheck/t/002_nonesuch.pl398
-rw-r--r--src/bin/pg_amcheck/t/003_check.pl520
-rw-r--r--src/bin/pg_amcheck/t/004_verify_heapam.pl766
-rw-r--r--src/bin/pg_amcheck/t/005_opclass_damage.pl60
-rw-r--r--src/bin/pg_archivecleanup/.gitignore3
-rw-r--r--src/bin/pg_archivecleanup/Makefile36
-rw-r--r--src/bin/pg_archivecleanup/meson.build31
-rw-r--r--src/bin/pg_archivecleanup/nls.mk5
-rw-r--r--src/bin/pg_archivecleanup/pg_archivecleanup.c375
-rw-r--r--src/bin/pg_archivecleanup/po/LINGUAS1
-rw-r--r--src/bin/pg_archivecleanup/po/cs.po198
-rw-r--r--src/bin/pg_archivecleanup/po/de.po183
-rw-r--r--src/bin/pg_archivecleanup/po/el.po189
-rw-r--r--src/bin/pg_archivecleanup/po/es.po185
-rw-r--r--src/bin/pg_archivecleanup/po/fr.po218
-rw-r--r--src/bin/pg_archivecleanup/po/it.po184
-rw-r--r--src/bin/pg_archivecleanup/po/ja.po183
-rw-r--r--src/bin/pg_archivecleanup/po/ka.po197
-rw-r--r--src/bin/pg_archivecleanup/po/ko.po189
-rw-r--r--src/bin/pg_archivecleanup/po/meson.build3
-rw-r--r--src/bin/pg_archivecleanup/po/pl.po178
-rw-r--r--src/bin/pg_archivecleanup/po/pt_BR.po185
-rw-r--r--src/bin/pg_archivecleanup/po/ru.po212
-rw-r--r--src/bin/pg_archivecleanup/po/sv.po184
-rw-r--r--src/bin/pg_archivecleanup/po/tr.po185
-rw-r--r--src/bin/pg_archivecleanup/po/uk.po173
-rw-r--r--src/bin/pg_archivecleanup/po/vi.po183
-rw-r--r--src/bin/pg_archivecleanup/po/zh_CN.po179
-rw-r--r--src/bin/pg_archivecleanup/po/zh_TW.po185
-rw-r--r--src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl107
-rw-r--r--src/bin/pg_basebackup/.gitignore5
-rw-r--r--src/bin/pg_basebackup/Makefile84
-rw-r--r--src/bin/pg_basebackup/bbstreamer.h226
-rw-r--r--src/bin/pg_basebackup/bbstreamer_file.c395
-rw-r--r--src/bin/pg_basebackup/bbstreamer_gzip.c364
-rw-r--r--src/bin/pg_basebackup/bbstreamer_inject.c249
-rw-r--r--src/bin/pg_basebackup/bbstreamer_lz4.c422
-rw-r--r--src/bin/pg_basebackup/bbstreamer_tar.c516
-rw-r--r--src/bin/pg_basebackup/bbstreamer_zstd.c368
-rw-r--r--src/bin/pg_basebackup/meson.build96
-rw-r--r--src/bin/pg_basebackup/nls.mk22
-rw-r--r--src/bin/pg_basebackup/pg_basebackup.c2764
-rw-r--r--src/bin/pg_basebackup/pg_receivewal.c927
-rw-r--r--src/bin/pg_basebackup/pg_recvlogical.c1038
-rw-r--r--src/bin/pg_basebackup/po/LINGUAS1
-rw-r--r--src/bin/pg_basebackup/po/cs.po1647
-rw-r--r--src/bin/pg_basebackup/po/de.po1804
-rw-r--r--src/bin/pg_basebackup/po/el.po1846
-rw-r--r--src/bin/pg_basebackup/po/es.po1809
-rw-r--r--src/bin/pg_basebackup/po/fr.po2209
-rw-r--r--src/bin/pg_basebackup/po/he.po1405
-rw-r--r--src/bin/pg_basebackup/po/it.po1937
-rw-r--r--src/bin/pg_basebackup/po/ja.po1805
-rw-r--r--src/bin/pg_basebackup/po/ka.po1847
-rw-r--r--src/bin/pg_basebackup/po/ko.po1909
-rw-r--r--src/bin/pg_basebackup/po/meson.build3
-rw-r--r--src/bin/pg_basebackup/po/pl.po1345
-rw-r--r--src/bin/pg_basebackup/po/pt_BR.po1147
-rw-r--r--src/bin/pg_basebackup/po/ru.po2190
-rw-r--r--src/bin/pg_basebackup/po/sv.po1817
-rw-r--r--src/bin/pg_basebackup/po/tr.po1535
-rw-r--r--src/bin/pg_basebackup/po/uk.po1751
-rw-r--r--src/bin/pg_basebackup/po/vi.po1520
-rw-r--r--src/bin/pg_basebackup/po/zh_CN.po1431
-rw-r--r--src/bin/pg_basebackup/po/zh_TW.po1890
-rw-r--r--src/bin/pg_basebackup/receivelog.c1268
-rw-r--r--src/bin/pg_basebackup/receivelog.h57
-rw-r--r--src/bin/pg_basebackup/streamutil.c861
-rw-r--r--src/bin/pg_basebackup/streamutil.h68
-rw-r--r--src/bin/pg_basebackup/t/010_pg_basebackup.pl952
-rw-r--r--src/bin/pg_basebackup/t/011_in_place_tablespace.pl40
-rw-r--r--src/bin/pg_basebackup/t/020_pg_receivewal.pl326
-rw-r--r--src/bin/pg_basebackup/t/030_pg_recvlogical.pl113
-rw-r--r--src/bin/pg_basebackup/walmethods.c1383
-rw-r--r--src/bin/pg_basebackup/walmethods.h134
-rw-r--r--src/bin/pg_checksums/.gitignore3
-rw-r--r--src/bin/pg_checksums/Makefile47
-rw-r--r--src/bin/pg_checksums/meson.build33
-rw-r--r--src/bin/pg_checksums/nls.mk7
-rw-r--r--src/bin/pg_checksums/pg_checksums.c651
-rw-r--r--src/bin/pg_checksums/po/LINGUAS1
-rw-r--r--src/bin/pg_checksums/po/cs.po312
-rw-r--r--src/bin/pg_checksums/po/de.po330
-rw-r--r--src/bin/pg_checksums/po/el.po337
-rw-r--r--src/bin/pg_checksums/po/es.po332
-rw-r--r--src/bin/pg_checksums/po/fr.po374
-rw-r--r--src/bin/pg_checksums/po/it.po327
-rw-r--r--src/bin/pg_checksums/po/ja.po339
-rw-r--r--src/bin/pg_checksums/po/ka.po351
-rw-r--r--src/bin/pg_checksums/po/ko.po343
-rw-r--r--src/bin/pg_checksums/po/meson.build3
-rw-r--r--src/bin/pg_checksums/po/pt_BR.po328
-rw-r--r--src/bin/pg_checksums/po/ru.po352
-rw-r--r--src/bin/pg_checksums/po/sv.po329
-rw-r--r--src/bin/pg_checksums/po/tr.po304
-rw-r--r--src/bin/pg_checksums/po/uk.po328
-rw-r--r--src/bin/pg_checksums/po/zh_CN.po308
-rw-r--r--src/bin/pg_checksums/po/zh_TW.po342
-rw-r--r--src/bin/pg_checksums/t/001_basic.pl13
-rw-r--r--src/bin/pg_checksums/t/002_actions.pl253
-rw-r--r--src/bin/pg_config/.gitignore2
-rw-r--r--src/bin/pg_config/Makefile44
-rw-r--r--src/bin/pg_config/meson.build31
-rw-r--r--src/bin/pg_config/nls.mk3
-rw-r--r--src/bin/pg_config/pg_config.c189
-rw-r--r--src/bin/pg_config/po/LINGUAS1
-rw-r--r--src/bin/pg_config/po/cs.po280
-rw-r--r--src/bin/pg_config/po/de.po255
-rw-r--r--src/bin/pg_config/po/el.po265
-rw-r--r--src/bin/pg_config/po/es.po279
-rw-r--r--src/bin/pg_config/po/fr.po333
-rw-r--r--src/bin/pg_config/po/he.po316
-rw-r--r--src/bin/pg_config/po/it.po297
-rw-r--r--src/bin/pg_config/po/ja.po247
-rw-r--r--src/bin/pg_config/po/ka.po261
-rw-r--r--src/bin/pg_config/po/ko.po265
-rw-r--r--src/bin/pg_config/po/meson.build3
-rw-r--r--src/bin/pg_config/po/nb.po251
-rw-r--r--src/bin/pg_config/po/pl.po273
-rw-r--r--src/bin/pg_config/po/pt_BR.po249
-rw-r--r--src/bin/pg_config/po/ro.po279
-rw-r--r--src/bin/pg_config/po/ru.po322
-rw-r--r--src/bin/pg_config/po/sv.po259
-rw-r--r--src/bin/pg_config/po/ta.po269
-rw-r--r--src/bin/pg_config/po/tr.po281
-rw-r--r--src/bin/pg_config/po/uk.po231
-rw-r--r--src/bin/pg_config/po/vi.po300
-rw-r--r--src/bin/pg_config/po/zh_CN.po255
-rw-r--r--src/bin/pg_config/po/zh_TW.po326
-rw-r--r--src/bin/pg_config/t/001_pg_config.pl21
-rw-r--r--src/bin/pg_controldata/.gitignore2
-rw-r--r--src/bin/pg_controldata/Makefile44
-rw-r--r--src/bin/pg_controldata/meson.build31
-rw-r--r--src/bin/pg_controldata/nls.mk5
-rw-r--r--src/bin/pg_controldata/pg_controldata.c332
-rw-r--r--src/bin/pg_controldata/po/LINGUAS1
-rw-r--r--src/bin/pg_controldata/po/cs.po559
-rw-r--r--src/bin/pg_controldata/po/de.po512
-rw-r--r--src/bin/pg_controldata/po/el.po521
-rw-r--r--src/bin/pg_controldata/po/es.po515
-rw-r--r--src/bin/pg_controldata/po/fr.po569
-rw-r--r--src/bin/pg_controldata/po/it.po547
-rw-r--r--src/bin/pg_controldata/po/ja.po526
-rw-r--r--src/bin/pg_controldata/po/ka.po515
-rw-r--r--src/bin/pg_controldata/po/ko.po504
-rw-r--r--src/bin/pg_controldata/po/meson.build3
-rw-r--r--src/bin/pg_controldata/po/pl.po464
-rw-r--r--src/bin/pg_controldata/po/pt_BR.po512
-rw-r--r--src/bin/pg_controldata/po/ru.po585
-rw-r--r--src/bin/pg_controldata/po/sv.po518
-rw-r--r--src/bin/pg_controldata/po/tr.po555
-rw-r--r--src/bin/pg_controldata/po/uk.po480
-rw-r--r--src/bin/pg_controldata/po/vi.po476
-rw-r--r--src/bin/pg_controldata/po/zh_CN.po505
-rw-r--r--src/bin/pg_controldata/po/zh_TW.po587
-rw-r--r--src/bin/pg_controldata/t/001_pg_controldata.pl46
-rw-r--r--src/bin/pg_ctl/.gitignore2
-rw-r--r--src/bin/pg_ctl/Makefile53
-rw-r--r--src/bin/pg_ctl/meson.build34
-rw-r--r--src/bin/pg_ctl/nls.mk7
-rw-r--r--src/bin/pg_ctl/pg_ctl.c2520
-rw-r--r--src/bin/pg_ctl/po/LINGUAS1
-rw-r--r--src/bin/pg_ctl/po/cs.po949
-rw-r--r--src/bin/pg_ctl/po/de.po843
-rw-r--r--src/bin/pg_ctl/po/el.po869
-rw-r--r--src/bin/pg_ctl/po/es.po862
-rw-r--r--src/bin/pg_ctl/po/fr.po1013
-rw-r--r--src/bin/pg_ctl/po/he.po884
-rw-r--r--src/bin/pg_ctl/po/it.po863
-rw-r--r--src/bin/pg_ctl/po/ja.po836
-rw-r--r--src/bin/pg_ctl/po/ka.po854
-rw-r--r--src/bin/pg_ctl/po/ko.po858
-rw-r--r--src/bin/pg_ctl/po/meson.build3
-rw-r--r--src/bin/pg_ctl/po/pl.po956
-rw-r--r--src/bin/pg_ctl/po/pt_BR.po832
-rw-r--r--src/bin/pg_ctl/po/ru.po1025
-rw-r--r--src/bin/pg_ctl/po/sv.po858
-rw-r--r--src/bin/pg_ctl/po/tr.po962
-rw-r--r--src/bin/pg_ctl/po/uk.po798
-rw-r--r--src/bin/pg_ctl/po/zh_CN.po879
-rw-r--r--src/bin/pg_ctl/po/zh_TW.po983
-rw-r--r--src/bin/pg_ctl/t/001_start_stop.pl103
-rw-r--r--src/bin/pg_ctl/t/002_status.pl29
-rw-r--r--src/bin/pg_ctl/t/003_promote.pl66
-rw-r--r--src/bin/pg_ctl/t/004_logrotate.pl140
-rw-r--r--src/bin/pg_dump/.gitignore5
-rw-r--r--src/bin/pg_dump/Makefile74
-rw-r--r--src/bin/pg_dump/common.c1089
-rw-r--r--src/bin/pg_dump/compress_gzip.c422
-rw-r--r--src/bin/pg_dump/compress_gzip.h24
-rw-r--r--src/bin/pg_dump/compress_io.c299
-rw-r--r--src/bin/pg_dump/compress_io.h207
-rw-r--r--src/bin/pg_dump/compress_lz4.c789
-rw-r--r--src/bin/pg_dump/compress_lz4.h24
-rw-r--r--src/bin/pg_dump/compress_none.c215
-rw-r--r--src/bin/pg_dump/compress_none.h24
-rw-r--r--src/bin/pg_dump/compress_zstd.c542
-rw-r--r--src/bin/pg_dump/compress_zstd.h25
-rw-r--r--src/bin/pg_dump/dumputils.c884
-rw-r--r--src/bin/pg_dump/dumputils.h66
-rw-r--r--src/bin/pg_dump/meson.build107
-rw-r--r--src/bin/pg_dump/nls.mk34
-rw-r--r--src/bin/pg_dump/parallel.c1801
-rw-r--r--src/bin/pg_dump/parallel.h85
-rw-r--r--src/bin/pg_dump/pg_backup.h331
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c4873
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.h455
-rw-r--r--src/bin/pg_dump/pg_backup_custom.c1031
-rw-r--r--src/bin/pg_dump/pg_backup_db.c569
-rw-r--r--src/bin/pg_dump/pg_backup_db.h26
-rw-r--r--src/bin/pg_dump/pg_backup_directory.c871
-rw-r--r--src/bin/pg_dump/pg_backup_null.c228
-rw-r--r--src/bin/pg_dump/pg_backup_tar.c1207
-rw-r--r--src/bin/pg_dump/pg_backup_tar.h37
-rw-r--r--src/bin/pg_dump/pg_backup_utils.c104
-rw-r--r--src/bin/pg_dump/pg_backup_utils.h41
-rw-r--r--src/bin/pg_dump/pg_dump.c18556
-rw-r--r--src/bin/pg_dump/pg_dump.h756
-rw-r--r--src/bin/pg_dump/pg_dump_sort.c1561
-rw-r--r--src/bin/pg_dump/pg_dumpall.c1927
-rw-r--r--src/bin/pg_dump/pg_restore.c496
-rw-r--r--src/bin/pg_dump/po/LINGUAS1
-rw-r--r--src/bin/pg_dump/po/cs.po2965
-rw-r--r--src/bin/pg_dump/po/de.po2793
-rw-r--r--src/bin/pg_dump/po/el.po2948
-rw-r--r--src/bin/pg_dump/po/es.po2801
-rw-r--r--src/bin/pg_dump/po/fr.po3597
-rw-r--r--src/bin/pg_dump/po/he.po2883
-rw-r--r--src/bin/pg_dump/po/it.po2939
-rw-r--r--src/bin/pg_dump/po/ja.po2790
-rw-r--r--src/bin/pg_dump/po/ka.po2833
-rw-r--r--src/bin/pg_dump/po/ko.po2924
-rw-r--r--src/bin/pg_dump/po/meson.build3
-rw-r--r--src/bin/pg_dump/po/pl.po2739
-rw-r--r--src/bin/pg_dump/po/pt_BR.po2579
-rw-r--r--src/bin/pg_dump/po/ru.po3637
-rw-r--r--src/bin/pg_dump/po/sv.po2819
-rw-r--r--src/bin/pg_dump/po/tr.po3070
-rw-r--r--src/bin/pg_dump/po/uk.po2713
-rw-r--r--src/bin/pg_dump/po/zh_CN.po2643
-rw-r--r--src/bin/pg_dump/po/zh_TW.po3300
-rw-r--r--src/bin/pg_dump/t/001_basic.pl229
-rw-r--r--src/bin/pg_dump/t/002_pg_dump.pl4968
-rw-r--r--src/bin/pg_dump/t/003_pg_dump_with_server.pl40
-rw-r--r--src/bin/pg_dump/t/004_pg_dump_parallel.pl81
-rw-r--r--src/bin/pg_dump/t/010_dump_connstr.pl233
-rw-r--r--src/bin/pg_resetwal/.gitignore2
-rw-r--r--src/bin/pg_resetwal/Makefile44
-rw-r--r--src/bin/pg_resetwal/meson.build32
-rw-r--r--src/bin/pg_resetwal/nls.mk7
-rw-r--r--src/bin/pg_resetwal/pg_resetwal.c1148
-rw-r--r--src/bin/pg_resetwal/po/LINGUAS1
-rw-r--r--src/bin/pg_resetwal/po/cs.po719
-rw-r--r--src/bin/pg_resetwal/po/de.po657
-rw-r--r--src/bin/pg_resetwal/po/el.po679
-rw-r--r--src/bin/pg_resetwal/po/es.po671
-rw-r--r--src/bin/pg_resetwal/po/fr.po837
-rw-r--r--src/bin/pg_resetwal/po/it.po666
-rw-r--r--src/bin/pg_resetwal/po/ja.po657
-rw-r--r--src/bin/pg_resetwal/po/ka.po662
-rw-r--r--src/bin/pg_resetwal/po/ko.po670
-rw-r--r--src/bin/pg_resetwal/po/meson.build3
-rw-r--r--src/bin/pg_resetwal/po/pl.po626
-rw-r--r--src/bin/pg_resetwal/po/pt_BR.po657
-rw-r--r--src/bin/pg_resetwal/po/ru.po786
-rw-r--r--src/bin/pg_resetwal/po/sv.po668
-rw-r--r--src/bin/pg_resetwal/po/tr.po751
-rw-r--r--src/bin/pg_resetwal/po/uk.po624
-rw-r--r--src/bin/pg_resetwal/po/zh_CN.po638
-rw-r--r--src/bin/pg_resetwal/po/zh_TW.po807
-rw-r--r--src/bin/pg_resetwal/t/001_basic.pl32
-rw-r--r--src/bin/pg_resetwal/t/002_corrupted.pl58
-rw-r--r--src/bin/pg_rewind/.gitignore6
-rw-r--r--src/bin/pg_rewind/Makefile60
-rw-r--r--src/bin/pg_rewind/datapagemap.c127
-rw-r--r--src/bin/pg_rewind/datapagemap.h29
-rw-r--r--src/bin/pg_rewind/file_ops.c468
-rw-r--r--src/bin/pg_rewind/file_ops.h29
-rw-r--r--src/bin/pg_rewind/filemap.c831
-rw-r--r--src/bin/pg_rewind/filemap.h113
-rw-r--r--src/bin/pg_rewind/libpq_source.c675
-rw-r--r--src/bin/pg_rewind/local_source.c187
-rw-r--r--src/bin/pg_rewind/meson.build50
-rw-r--r--src/bin/pg_rewind/nls.mk20
-rw-r--r--src/bin/pg_rewind/parsexlog.c462
-rw-r--r--src/bin/pg_rewind/pg_rewind.c1193
-rw-r--r--src/bin/pg_rewind/pg_rewind.h56
-rw-r--r--src/bin/pg_rewind/po/LINGUAS1
-rw-r--r--src/bin/pg_rewind/po/cs.po1019
-rw-r--r--src/bin/pg_rewind/po/de.po1000
-rw-r--r--src/bin/pg_rewind/po/el.po1022
-rw-r--r--src/bin/pg_rewind/po/es.po1003
-rw-r--r--src/bin/pg_rewind/po/fr.po1312
-rw-r--r--src/bin/pg_rewind/po/it.po1190
-rw-r--r--src/bin/pg_rewind/po/ja.po1001
-rw-r--r--src/bin/pg_rewind/po/ka.po1024
-rw-r--r--src/bin/pg_rewind/po/ko.po1062
-rw-r--r--src/bin/pg_rewind/po/meson.build3
-rw-r--r--src/bin/pg_rewind/po/pl.po891
-rw-r--r--src/bin/pg_rewind/po/pt_BR.po859
-rw-r--r--src/bin/pg_rewind/po/ru.po1228
-rw-r--r--src/bin/pg_rewind/po/sv.po1022
-rw-r--r--src/bin/pg_rewind/po/tr.po966
-rw-r--r--src/bin/pg_rewind/po/uk.po968
-rw-r--r--src/bin/pg_rewind/po/zh_CN.po959
-rw-r--r--src/bin/pg_rewind/po/zh_TW.po1093
-rw-r--r--src/bin/pg_rewind/rewind_source.h86
-rw-r--r--src/bin/pg_rewind/t/001_basic.pl194
-rw-r--r--src/bin/pg_rewind/t/002_databases.pl77
-rw-r--r--src/bin/pg_rewind/t/003_extrafiles.pl119
-rw-r--r--src/bin/pg_rewind/t/004_pg_xlog_symlink.pl80
-rw-r--r--src/bin/pg_rewind/t/005_same_timeline.pl24
-rw-r--r--src/bin/pg_rewind/t/006_options.pl45
-rw-r--r--src/bin/pg_rewind/t/007_standby_source.pl178
-rw-r--r--src/bin/pg_rewind/t/008_min_recovery_point.pl168
-rw-r--r--src/bin/pg_rewind/t/009_growing_files.pl77
-rw-r--r--src/bin/pg_rewind/t/RewindTest.pm385
-rw-r--r--src/bin/pg_rewind/timeline.c130
-rw-r--r--src/bin/pg_test_fsync/.gitignore3
-rw-r--r--src/bin/pg_test_fsync/Makefile36
-rw-r--r--src/bin/pg_test_fsync/meson.build31
-rw-r--r--src/bin/pg_test_fsync/nls.mk5
-rw-r--r--src/bin/pg_test_fsync/pg_test_fsync.c648
-rw-r--r--src/bin/pg_test_fsync/po/LINGUAS1
-rw-r--r--src/bin/pg_test_fsync/po/cs.po210
-rw-r--r--src/bin/pg_test_fsync/po/de.po224
-rw-r--r--src/bin/pg_test_fsync/po/el.po228
-rw-r--r--src/bin/pg_test_fsync/po/es.po228
-rw-r--r--src/bin/pg_test_fsync/po/fr.po242
-rw-r--r--src/bin/pg_test_fsync/po/it.po226
-rw-r--r--src/bin/pg_test_fsync/po/ja.po237
-rw-r--r--src/bin/pg_test_fsync/po/ka.po226
-rw-r--r--src/bin/pg_test_fsync/po/ko.po228
-rw-r--r--src/bin/pg_test_fsync/po/meson.build3
-rw-r--r--src/bin/pg_test_fsync/po/pl.po189
-rw-r--r--src/bin/pg_test_fsync/po/pt_BR.po227
-rw-r--r--src/bin/pg_test_fsync/po/ru.po238
-rw-r--r--src/bin/pg_test_fsync/po/sv.po229
-rw-r--r--src/bin/pg_test_fsync/po/tr.po194
-rw-r--r--src/bin/pg_test_fsync/po/uk.po211
-rw-r--r--src/bin/pg_test_fsync/po/vi.po195
-rw-r--r--src/bin/pg_test_fsync/po/zh_CN.po176
-rw-r--r--src/bin/pg_test_fsync/po/zh_TW.po221
-rw-r--r--src/bin/pg_test_fsync/t/001_basic.pl29
-rw-r--r--src/bin/pg_test_timing/.gitignore3
-rw-r--r--src/bin/pg_test_timing/Makefile36
-rw-r--r--src/bin/pg_test_timing/meson.build31
-rw-r--r--src/bin/pg_test_timing/nls.mk3
-rw-r--r--src/bin/pg_test_timing/pg_test_timing.c208
-rw-r--r--src/bin/pg_test_timing/po/LINGUAS1
-rw-r--r--src/bin/pg_test_timing/po/cs.po80
-rw-r--r--src/bin/pg_test_timing/po/de.po84
-rw-r--r--src/bin/pg_test_timing/po/el.po86
-rw-r--r--src/bin/pg_test_timing/po/es.po86
-rw-r--r--src/bin/pg_test_timing/po/fr.po90
-rw-r--r--src/bin/pg_test_timing/po/it.po84
-rw-r--r--src/bin/pg_test_timing/po/ja.po86
-rw-r--r--src/bin/pg_test_timing/po/ka.po84
-rw-r--r--src/bin/pg_test_timing/po/ko.po82
-rw-r--r--src/bin/pg_test_timing/po/meson.build3
-rw-r--r--src/bin/pg_test_timing/po/pl.po76
-rw-r--r--src/bin/pg_test_timing/po/pt_BR.po85
-rw-r--r--src/bin/pg_test_timing/po/ru.po88
-rw-r--r--src/bin/pg_test_timing/po/sv.po83
-rw-r--r--src/bin/pg_test_timing/po/tr.po78
-rw-r--r--src/bin/pg_test_timing/po/uk.po86
-rw-r--r--src/bin/pg_test_timing/po/vi.po78
-rw-r--r--src/bin/pg_test_timing/po/zh_CN.po83
-rw-r--r--src/bin/pg_test_timing/po/zh_TW.po84
-rw-r--r--src/bin/pg_test_timing/t/001_basic.pl29
-rw-r--r--src/bin/pg_upgrade/.gitignore8
-rw-r--r--src/bin/pg_upgrade/IMPLEMENTATION98
-rw-r--r--src/bin/pg_upgrade/Makefile60
-rw-r--r--src/bin/pg_upgrade/TESTING66
-rw-r--r--src/bin/pg_upgrade/check.c1453
-rw-r--r--src/bin/pg_upgrade/controldata.c733
-rw-r--r--src/bin/pg_upgrade/dump.c71
-rw-r--r--src/bin/pg_upgrade/exec.c459
-rw-r--r--src/bin/pg_upgrade/file.c377
-rw-r--r--src/bin/pg_upgrade/function.c194
-rw-r--r--src/bin/pg_upgrade/info.c662
-rw-r--r--src/bin/pg_upgrade/meson.build50
-rw-r--r--src/bin/pg_upgrade/nls.mk24
-rw-r--r--src/bin/pg_upgrade/option.c507
-rw-r--r--src/bin/pg_upgrade/parallel.c341
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.c862
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.h473
-rw-r--r--src/bin/pg_upgrade/po/LINGUAS1
-rw-r--r--src/bin/pg_upgrade/po/cs.po1804
-rw-r--r--src/bin/pg_upgrade/po/de.po1833
-rw-r--r--src/bin/pg_upgrade/po/es.po1829
-rw-r--r--src/bin/pg_upgrade/po/fr.po2158
-rw-r--r--src/bin/pg_upgrade/po/ja.po1828
-rw-r--r--src/bin/pg_upgrade/po/ka.po1910
-rw-r--r--src/bin/pg_upgrade/po/ko.po1882
-rw-r--r--src/bin/pg_upgrade/po/meson.build3
-rw-r--r--src/bin/pg_upgrade/po/ru.po2272
-rw-r--r--src/bin/pg_upgrade/po/sv.po1903
-rw-r--r--src/bin/pg_upgrade/po/tr.po1668
-rw-r--r--src/bin/pg_upgrade/po/uk.po1698
-rw-r--r--src/bin/pg_upgrade/po/zh_CN.po1850
-rw-r--r--src/bin/pg_upgrade/po/zh_TW.po1805
-rw-r--r--src/bin/pg_upgrade/relfilenumber.c259
-rw-r--r--src/bin/pg_upgrade/server.c377
-rw-r--r--src/bin/pg_upgrade/t/001_basic.pl13
-rw-r--r--src/bin/pg_upgrade/t/002_pg_upgrade.pl461
-rw-r--r--src/bin/pg_upgrade/tablespace.c111
-rw-r--r--src/bin/pg_upgrade/util.c355
-rw-r--r--src/bin/pg_upgrade/version.c461
-rw-r--r--src/bin/pg_verifybackup/.gitignore2
-rw-r--r--src/bin/pg_verifybackup/Makefile49
-rw-r--r--src/bin/pg_verifybackup/meson.build45
-rw-r--r--src/bin/pg_verifybackup/nls.mk16
-rw-r--r--src/bin/pg_verifybackup/parse_manifest.c760
-rw-r--r--src/bin/pg_verifybackup/parse_manifest.h46
-rw-r--r--src/bin/pg_verifybackup/pg_verifybackup.c997
-rw-r--r--src/bin/pg_verifybackup/po/LINGUAS1
-rw-r--r--src/bin/pg_verifybackup/po/de.po518
-rw-r--r--src/bin/pg_verifybackup/po/el.po525
-rw-r--r--src/bin/pg_verifybackup/po/es.po523
-rw-r--r--src/bin/pg_verifybackup/po/fr.po537
-rw-r--r--src/bin/pg_verifybackup/po/it.po500
-rw-r--r--src/bin/pg_verifybackup/po/ja.po520
-rw-r--r--src/bin/pg_verifybackup/po/ka.po519
-rw-r--r--src/bin/pg_verifybackup/po/ko.po529
-rw-r--r--src/bin/pg_verifybackup/po/meson.build3
-rw-r--r--src/bin/pg_verifybackup/po/ru.po539
-rw-r--r--src/bin/pg_verifybackup/po/sv.po548
-rw-r--r--src/bin/pg_verifybackup/po/uk.po511
-rw-r--r--src/bin/pg_verifybackup/po/zh_CN.po494
-rw-r--r--src/bin/pg_verifybackup/po/zh_TW.po583
-rw-r--r--src/bin/pg_verifybackup/t/001_basic.pl38
-rw-r--r--src/bin/pg_verifybackup/t/002_algorithm.pl61
-rw-r--r--src/bin/pg_verifybackup/t/003_corruption.pl292
-rw-r--r--src/bin/pg_verifybackup/t/004_options.pl117
-rw-r--r--src/bin/pg_verifybackup/t/005_bad_manifest.pl209
-rw-r--r--src/bin/pg_verifybackup/t/006_encoding.pl34
-rw-r--r--src/bin/pg_verifybackup/t/007_wal.pl79
-rw-r--r--src/bin/pg_verifybackup/t/008_untar.pl135
-rw-r--r--src/bin/pg_verifybackup/t/009_extract.pl97
-rw-r--r--src/bin/pg_verifybackup/t/010_client_untar.pl163
-rw-r--r--src/bin/pg_waldump/.gitignore32
-rw-r--r--src/bin/pg_waldump/Makefile56
-rw-r--r--src/bin/pg_waldump/compat.c64
-rw-r--r--src/bin/pg_waldump/meson.build39
-rw-r--r--src/bin/pg_waldump/nls.mk9
-rw-r--r--src/bin/pg_waldump/pg_waldump.c1319
-rw-r--r--src/bin/pg_waldump/po/LINGUAS1
-rw-r--r--src/bin/pg_waldump/po/cs.po338
-rw-r--r--src/bin/pg_waldump/po/de.po574
-rw-r--r--src/bin/pg_waldump/po/el.po608
-rw-r--r--src/bin/pg_waldump/po/es.po576
-rw-r--r--src/bin/pg_waldump/po/fr.po693
-rw-r--r--src/bin/pg_waldump/po/it.po532
-rw-r--r--src/bin/pg_waldump/po/ja.po572
-rw-r--r--src/bin/pg_waldump/po/ka.po580
-rw-r--r--src/bin/pg_waldump/po/ko.po615
-rw-r--r--src/bin/pg_waldump/po/meson.build3
-rw-r--r--src/bin/pg_waldump/po/ru.po709
-rw-r--r--src/bin/pg_waldump/po/sv.po581
-rw-r--r--src/bin/pg_waldump/po/tr.po306
-rw-r--r--src/bin/pg_waldump/po/uk.po542
-rw-r--r--src/bin/pg_waldump/po/vi.po309
-rw-r--r--src/bin/pg_waldump/po/zh_CN.po307
-rw-r--r--src/bin/pg_waldump/po/zh_TW.po591
-rw-r--r--src/bin/pg_waldump/rmgrdesc.c99
-rw-r--r--src/bin/pg_waldump/rmgrdesc.h23
-rw-r--r--src/bin/pg_waldump/t/001_basic.pl13
-rw-r--r--src/bin/pg_waldump/t/002_save_fullpage.pl113
-rw-r--r--src/bin/pgbench/.gitignore5
-rw-r--r--src/bin/pgbench/Makefile63
-rw-r--r--src/bin/pgbench/exprparse.c2114
-rw-r--r--src/bin/pgbench/exprparse.h110
-rw-r--r--src/bin/pgbench/exprparse.y531
-rw-r--r--src/bin/pgbench/exprscan.c2843
-rw-r--r--src/bin/pgbench/exprscan.l473
-rw-r--r--src/bin/pgbench/meson.build48
-rw-r--r--src/bin/pgbench/pgbench.c7841
-rw-r--r--src/bin/pgbench/pgbench.h167
-rw-r--r--src/bin/pgbench/t/001_pgbench_with_server.pl1475
-rw-r--r--src/bin/pgbench/t/002_pgbench_no_server.pl387
-rw-r--r--src/bin/pgevent/MSG00001.binbin0 -> 28 bytes
-rw-r--r--src/bin/pgevent/Makefile39
-rw-r--r--src/bin/pgevent/README20
-rw-r--r--src/bin/pgevent/exports.txt3
-rw-r--r--src/bin/pgevent/meson.build32
-rw-r--r--src/bin/pgevent/pgevent.c160
-rw-r--r--src/bin/pgevent/pgevent.def5
-rw-r--r--src/bin/pgevent/pgmsgevent.h46
-rw-r--r--src/bin/pgevent/pgmsgevent.mc5
-rw-r--r--src/bin/pgevent/pgmsgevent.rc2
-rw-r--r--src/bin/psql/.gitignore5
-rw-r--r--src/bin/psql/Makefile90
-rw-r--r--src/bin/psql/command.c5798
-rw-r--r--src/bin/psql/command.h49
-rw-r--r--src/bin/psql/common.c2427
-rw-r--r--src/bin/psql/common.h47
-rw-r--r--src/bin/psql/copy.c726
-rw-r--r--src/bin/psql/copy.h24
-rw-r--r--src/bin/psql/create_help.pl233
-rw-r--r--src/bin/psql/crosstabview.c713
-rw-r--r--src/bin/psql/crosstabview.h29
-rw-r--r--src/bin/psql/describe.c7108
-rw-r--r--src/bin/psql/describe.h152
-rw-r--r--src/bin/psql/help.c772
-rw-r--r--src/bin/psql/help.h21
-rw-r--r--src/bin/psql/input.c551
-rw-r--r--src/bin/psql/input.h51
-rw-r--r--src/bin/psql/large_obj.c264
-rw-r--r--src/bin/psql/large_obj.h15
-rw-r--r--src/bin/psql/mainloop.c662
-rw-r--r--src/bin/psql/mainloop.h17
-rw-r--r--src/bin/psql/meson.build74
-rw-r--r--src/bin/psql/nls.mk30
-rw-r--r--src/bin/psql/po/LINGUAS1
-rw-r--r--src/bin/psql/po/cs.po6600
-rw-r--r--src/bin/psql/po/de.po6577
-rw-r--r--src/bin/psql/po/el.po6644
-rw-r--r--src/bin/psql/po/es.po6500
-rw-r--r--src/bin/psql/po/fr.po7124
-rw-r--r--src/bin/psql/po/he.po5800
-rw-r--r--src/bin/psql/po/it.po6643
-rw-r--r--src/bin/psql/po/ja.po6567
-rw-r--r--src/bin/psql/po/ka.po6577
-rw-r--r--src/bin/psql/po/ko.po6693
-rw-r--r--src/bin/psql/po/meson.build3
-rw-r--r--src/bin/psql/po/pl.po5762
-rw-r--r--src/bin/psql/po/pt_BR.po6561
-rw-r--r--src/bin/psql/po/ru.po7179
-rw-r--r--src/bin/psql/po/sv.po6593
-rw-r--r--src/bin/psql/po/tr.po8604
-rw-r--r--src/bin/psql/po/uk.po6287
-rw-r--r--src/bin/psql/po/zh_CN.po6476
-rw-r--r--src/bin/psql/po/zh_TW.po7811
-rw-r--r--src/bin/psql/prompt.c384
-rw-r--r--src/bin/psql/prompt.h17
-rw-r--r--src/bin/psql/psqlrc.sample8
-rw-r--r--src/bin/psql/psqlscanslash.c3502
-rw-r--r--src/bin/psql/psqlscanslash.h40
-rw-r--r--src/bin/psql/psqlscanslash.l846
-rw-r--r--src/bin/psql/settings.h174
-rw-r--r--src/bin/psql/sql_help.c6259
-rw-r--r--src/bin/psql/sql_help.h30
-rw-r--r--src/bin/psql/startup.c1268
-rw-r--r--src/bin/psql/stringutils.c342
-rw-r--r--src/bin/psql/stringutils.h28
-rw-r--r--src/bin/psql/t/001_basic.pl385
-rw-r--r--src/bin/psql/t/010_tab_completion.pl434
-rw-r--r--src/bin/psql/t/020_cancel.pl80
-rw-r--r--src/bin/psql/tab-complete.c6361
-rw-r--r--src/bin/psql/tab-complete.h17
-rw-r--r--src/bin/psql/variables.c421
-rw-r--r--src/bin/psql/variables.h97
-rw-r--r--src/bin/scripts/.gitignore10
-rw-r--r--src/bin/scripts/Makefile62
-rw-r--r--src/bin/scripts/clusterdb.c286
-rw-r--r--src/bin/scripts/common.c167
-rw-r--r--src/bin/scripts/common.h26
-rw-r--r--src/bin/scripts/createdb.c316
-rw-r--r--src/bin/scripts/createuser.c456
-rw-r--r--src/bin/scripts/dropdb.c190
-rw-r--r--src/bin/scripts/dropuser.c187
-rw-r--r--src/bin/scripts/meson.build62
-rw-r--r--src/bin/scripts/nls.mk22
-rw-r--r--src/bin/scripts/pg_isready.c242
-rw-r--r--src/bin/scripts/po/LINGUAS1
-rw-r--r--src/bin/scripts/po/cs.po1267
-rw-r--r--src/bin/scripts/po/de.po1304
-rw-r--r--src/bin/scripts/po/el.po1286
-rw-r--r--src/bin/scripts/po/es.po1283
-rw-r--r--src/bin/scripts/po/fr.po1538
-rw-r--r--src/bin/scripts/po/he.po1079
-rw-r--r--src/bin/scripts/po/it.po1228
-rw-r--r--src/bin/scripts/po/ja.po1283
-rw-r--r--src/bin/scripts/po/ka.po1282
-rw-r--r--src/bin/scripts/po/ko.po1347
-rw-r--r--src/bin/scripts/po/meson.build3
-rw-r--r--src/bin/scripts/po/pl.po1146
-rw-r--r--src/bin/scripts/po/pt_BR.po1169
-rw-r--r--src/bin/scripts/po/ru.po1589
-rw-r--r--src/bin/scripts/po/sv.po1275
-rw-r--r--src/bin/scripts/po/tr.po1223
-rw-r--r--src/bin/scripts/po/uk.po1210
-rw-r--r--src/bin/scripts/po/zh_CN.po1147
-rw-r--r--src/bin/scripts/reindexdb.c777
-rw-r--r--src/bin/scripts/t/010_clusterdb.pl38
-rw-r--r--src/bin/scripts/t/011_clusterdb_all.pl38
-rw-r--r--src/bin/scripts/t/020_createdb.pl195
-rw-r--r--src/bin/scripts/t/040_createuser.pl83
-rw-r--r--src/bin/scripts/t/050_dropdb.pl43
-rw-r--r--src/bin/scripts/t/070_dropuser.pl28
-rw-r--r--src/bin/scripts/t/080_pg_isready.pl25
-rw-r--r--src/bin/scripts/t/090_reindexdb.pl265
-rw-r--r--src/bin/scripts/t/091_reindexdb_all.pl35
-rw-r--r--src/bin/scripts/t/100_vacuumdb.pl212
-rw-r--r--src/bin/scripts/t/101_vacuumdb_all.pl33
-rw-r--r--src/bin/scripts/t/102_vacuumdb_stages.pl40
-rw-r--r--src/bin/scripts/t/200_connstr.pl44
-rw-r--r--src/bin/scripts/vacuumdb.c1197
651 files changed, 528567 insertions, 0 deletions
diff --git a/src/bin/Makefile b/src/bin/Makefile
new file mode 100644
index 0000000..373077b
--- /dev/null
+++ b/src/bin/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin (client programs)
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/bin
+top_builddir = ../..
+include $(top_builddir)/src/Makefile.global
+
+SUBDIRS = \
+ initdb \
+ pg_amcheck \
+ pg_archivecleanup \
+ pg_basebackup \
+ pg_checksums \
+ pg_config \
+ pg_controldata \
+ pg_ctl \
+ pg_dump \
+ pg_resetwal \
+ pg_rewind \
+ pg_test_fsync \
+ pg_test_timing \
+ pg_upgrade \
+ pg_verifybackup \
+ pg_waldump \
+ pgbench \
+ psql \
+ scripts
+
+ifeq ($(PORTNAME), win32)
+SUBDIRS += pgevent
+else
+ALWAYS_SUBDIRS += pgevent
+endif
+
+$(recurse)
+$(recurse_always)
diff --git a/src/bin/initdb/.gitignore b/src/bin/initdb/.gitignore
new file mode 100644
index 0000000..b3167c4
--- /dev/null
+++ b/src/bin/initdb/.gitignore
@@ -0,0 +1,5 @@
+/localtime.c
+
+/initdb
+
+/tmp_check/
diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile
new file mode 100644
index 0000000..d69bd89
--- /dev/null
+++ b/src/bin/initdb/Makefile
@@ -0,0 +1,71 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/initdb
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/initdb/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "initdb - initialize a new database cluster"
+PGAPPICON=win32
+
+subdir = src/bin/initdb
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(ICU_CFLAGS) $(CPPFLAGS)
+
+# Note: it's important that we link to encnames.o from libpgcommon, not
+# from libpq, else we have risks of version skew if we run with a libpq
+# shared library from a different PG version. The libpq_pgport macro
+# should ensure that that happens.
+#
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(ICU_LIBS)
+
+# use system timezone data?
+ifneq (,$(with_system_tzdata))
+override CPPFLAGS += '-DSYSTEMTZDIR="$(with_system_tzdata)"'
+endif
+
+OBJS = \
+ $(WIN32RES) \
+ findtimezone.o \
+ initdb.o \
+ localtime.o
+
+all: initdb
+
+initdb: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+# We must pull in localtime.c from src/timezones
+localtime.c: % : $(top_srcdir)/src/timezone/%
+ rm -f $@ && $(LN_S) $< .
+
+install: all installdirs
+ $(INSTALL_PROGRAM) initdb$(X) '$(DESTDIR)$(bindir)/initdb$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/initdb$(X)'
+
+clean distclean maintainer-clean:
+ rm -f initdb$(X) $(OBJS) localtime.c
+ rm -rf tmp_check
+
+# ensure that changes in datadir propagate into object file
+initdb.o: initdb.c $(top_builddir)/src/Makefile.global
+
+export with_icu
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/initdb/findtimezone.c b/src/bin/initdb/findtimezone.c
new file mode 100644
index 0000000..5bf2a30
--- /dev/null
+++ b/src/bin/initdb/findtimezone.c
@@ -0,0 +1,1777 @@
+/*-------------------------------------------------------------------------
+ *
+ * findtimezone.c
+ * Functions for determining the default timezone to use.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/initdb/findtimezone.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "pgtz.h"
+
+/* Ideally this would be in a .h file, but it hardly seems worth the trouble */
+extern const char *select_default_timezone(const char *share_path);
+
+
+#ifndef SYSTEMTZDIR
+static char tzdirpath[MAXPGPATH];
+#endif
+
+
+/*
+ * Return full pathname of timezone data directory
+ *
+ * In this file, tzdirpath is assumed to be set up by select_default_timezone.
+ */
+static const char *
+pg_TZDIR(void)
+{
+#ifndef SYSTEMTZDIR
+ /* normal case: timezone stuff is under our share dir */
+ return tzdirpath;
+#else
+ /* we're configured to use system's timezone database */
+ return SYSTEMTZDIR;
+#endif
+}
+
+
+/*
+ * Given a timezone name, open() the timezone data file. Return the
+ * file descriptor if successful, -1 if not.
+ *
+ * This is simpler than the backend function of the same name because
+ * we assume that the input string has the correct case already, so there
+ * is no need for case-folding. (This is obviously true if we got the file
+ * name from the filesystem to start with. The only other place it can come
+ * from is the environment variable TZ, and there seems no need to allow
+ * case variation in that; other programs aren't likely to.)
+ *
+ * If "canonname" is not NULL, then on success the canonical spelling of the
+ * given name is stored there (the buffer must be > TZ_STRLEN_MAX bytes!).
+ * This is redundant but kept for compatibility with the backend code.
+ */
+int
+pg_open_tzfile(const char *name, char *canonname)
+{
+ char fullname[MAXPGPATH];
+
+ if (canonname)
+ strlcpy(canonname, name, TZ_STRLEN_MAX + 1);
+
+ strlcpy(fullname, pg_TZDIR(), sizeof(fullname));
+ if (strlen(fullname) + 1 + strlen(name) >= MAXPGPATH)
+ return -1; /* not gonna fit */
+ strcat(fullname, "/");
+ strcat(fullname, name);
+
+ return open(fullname, O_RDONLY | PG_BINARY, 0);
+}
+
+
+
+/*
+ * Load a timezone definition.
+ * Does not verify that the timezone is acceptable!
+ *
+ * This corresponds to the backend's pg_tzset(), except that we only support
+ * one loaded timezone at a time.
+ */
+static pg_tz *
+pg_load_tz(const char *name)
+{
+ static pg_tz tz;
+
+ if (strlen(name) > TZ_STRLEN_MAX)
+ return NULL; /* not going to fit */
+
+ /*
+ * "GMT" is always sent to tzparse(); see comments for pg_tzset().
+ */
+ if (strcmp(name, "GMT") == 0)
+ {
+ if (!tzparse(name, &tz.state, true))
+ {
+ /* This really, really should not happen ... */
+ return NULL;
+ }
+ }
+ else if (tzload(name, NULL, &tz.state, true) != 0)
+ {
+ if (name[0] == ':' || !tzparse(name, &tz.state, false))
+ {
+ return NULL; /* unknown timezone */
+ }
+ }
+
+ strcpy(tz.TZname, name);
+
+ return &tz;
+}
+
+
+/*
+ * The following block of code attempts to determine which timezone in our
+ * timezone database is the best match for the active system timezone.
+ *
+ * On most systems, we rely on trying to match the observable behavior of
+ * the C library's localtime() function. The database zone that matches
+ * furthest into the past is the one to use. Often there will be several
+ * zones with identical rankings (since the IANA database assigns multiple
+ * names to many zones). We break ties by first checking for "preferred"
+ * names (such as "UTC"), and then arbitrarily by preferring shorter, then
+ * alphabetically earlier zone names. (If we did not explicitly prefer
+ * "UTC", we would get the alias name "UCT" instead due to alphabetic
+ * ordering.)
+ *
+ * Many modern systems use the IANA database, so if we can determine the
+ * system's idea of which zone it is using and its behavior matches our zone
+ * of the same name, we can skip the rather-expensive search through all the
+ * zones in our database. This short-circuit path also ensures that we spell
+ * the zone name the same way the system setting does, even in the presence
+ * of multiple aliases for the same zone.
+ *
+ * Win32's native knowledge about timezones appears to be too incomplete
+ * and too different from the IANA database for the above matching strategy
+ * to be of any use. But there is just a limited number of timezones
+ * available, so we can rely on a handmade mapping table instead.
+ */
+
+#ifndef WIN32
+
+#define T_DAY ((time_t) (60*60*24))
+#define T_WEEK ((time_t) (60*60*24*7))
+#define T_MONTH ((time_t) (60*60*24*31))
+
+#define MAX_TEST_TIMES (52*100) /* 100 years */
+
+struct tztry
+{
+ int n_test_times;
+ time_t test_times[MAX_TEST_TIMES];
+};
+
+static bool check_system_link_file(const char *linkname, struct tztry *tt,
+ char *bestzonename);
+static void scan_available_timezones(char *tzdir, char *tzdirsub,
+ struct tztry *tt,
+ int *bestscore, char *bestzonename);
+
+
+/*
+ * Get GMT offset from a system struct tm
+ */
+static int
+get_timezone_offset(struct tm *tm)
+{
+#if defined(HAVE_STRUCT_TM_TM_ZONE)
+ return tm->tm_gmtoff;
+#elif defined(HAVE_INT_TIMEZONE)
+ return -TIMEZONE_GLOBAL;
+#else
+#error No way to determine TZ? Can this happen?
+#endif
+}
+
+/*
+ * Convenience subroutine to convert y/m/d to time_t (NOT pg_time_t)
+ */
+static time_t
+build_time_t(int year, int month, int day)
+{
+ struct tm tm;
+
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_mday = day;
+ tm.tm_mon = month - 1;
+ tm.tm_year = year - 1900;
+ tm.tm_isdst = -1;
+
+ return mktime(&tm);
+}
+
+/*
+ * Does a system tm value match one we computed ourselves?
+ */
+static bool
+compare_tm(struct tm *s, struct pg_tm *p)
+{
+ if (s->tm_sec != p->tm_sec ||
+ s->tm_min != p->tm_min ||
+ s->tm_hour != p->tm_hour ||
+ s->tm_mday != p->tm_mday ||
+ s->tm_mon != p->tm_mon ||
+ s->tm_year != p->tm_year ||
+ s->tm_wday != p->tm_wday ||
+ s->tm_yday != p->tm_yday ||
+ s->tm_isdst != p->tm_isdst)
+ return false;
+ return true;
+}
+
+/*
+ * See how well a specific timezone setting matches the system behavior
+ *
+ * We score a timezone setting according to the number of test times it
+ * matches. (The test times are ordered later-to-earlier, but this routine
+ * doesn't actually know that; it just scans until the first non-match.)
+ *
+ * We return -1 for a completely unusable setting; this is worse than the
+ * score of zero for a setting that works but matches not even the first
+ * test time.
+ */
+static int
+score_timezone(const char *tzname, struct tztry *tt)
+{
+ int i;
+ pg_time_t pgtt;
+ struct tm *systm;
+ struct pg_tm *pgtm;
+ char cbuf[TZ_STRLEN_MAX + 1];
+ pg_tz *tz;
+
+ /* Load timezone definition */
+ tz = pg_load_tz(tzname);
+ if (!tz)
+ return -1; /* unrecognized zone name */
+
+ /* Reject if leap seconds involved */
+ if (!pg_tz_acceptable(tz))
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "Reject TZ \"%s\": uses leap seconds\n", tzname);
+#endif
+ return -1;
+ }
+
+ /* Check for match at all the test times */
+ for (i = 0; i < tt->n_test_times; i++)
+ {
+ pgtt = (pg_time_t) (tt->test_times[i]);
+ pgtm = pg_localtime(&pgtt, tz);
+ if (!pgtm)
+ return -1; /* probably shouldn't happen */
+ systm = localtime(&(tt->test_times[i]));
+ if (!systm)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" scores %d: at %ld %04d-%02d-%02d %02d:%02d:%02d %s, system had no data\n",
+ tzname, i, (long) pgtt,
+ pgtm->tm_year + 1900, pgtm->tm_mon + 1, pgtm->tm_mday,
+ pgtm->tm_hour, pgtm->tm_min, pgtm->tm_sec,
+ pgtm->tm_isdst ? "dst" : "std");
+#endif
+ return i;
+ }
+ if (!compare_tm(systm, pgtm))
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" scores %d: at %ld %04d-%02d-%02d %02d:%02d:%02d %s versus %04d-%02d-%02d %02d:%02d:%02d %s\n",
+ tzname, i, (long) pgtt,
+ pgtm->tm_year + 1900, pgtm->tm_mon + 1, pgtm->tm_mday,
+ pgtm->tm_hour, pgtm->tm_min, pgtm->tm_sec,
+ pgtm->tm_isdst ? "dst" : "std",
+ systm->tm_year + 1900, systm->tm_mon + 1, systm->tm_mday,
+ systm->tm_hour, systm->tm_min, systm->tm_sec,
+ systm->tm_isdst ? "dst" : "std");
+#endif
+ return i;
+ }
+ if (systm->tm_isdst >= 0)
+ {
+ /* Check match of zone names, too */
+ if (pgtm->tm_zone == NULL)
+ return -1; /* probably shouldn't happen */
+ memset(cbuf, 0, sizeof(cbuf));
+ strftime(cbuf, sizeof(cbuf) - 1, "%Z", systm); /* zone abbr */
+ if (strcmp(cbuf, pgtm->tm_zone) != 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" scores %d: at %ld \"%s\" versus \"%s\"\n",
+ tzname, i, (long) pgtt,
+ pgtm->tm_zone, cbuf);
+#endif
+ return i;
+ }
+ }
+ }
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" gets max score %d\n", tzname, i);
+#endif
+
+ return i;
+}
+
+/*
+ * Test whether given zone name is a perfect match to localtime() behavior
+ */
+static bool
+perfect_timezone_match(const char *tzname, struct tztry *tt)
+{
+ return (score_timezone(tzname, tt) == tt->n_test_times);
+}
+
+
+/*
+ * Try to identify a timezone name (in our terminology) that best matches the
+ * observed behavior of the system localtime() function.
+ */
+static const char *
+identify_system_timezone(void)
+{
+ static char resultbuf[TZ_STRLEN_MAX + 1];
+ time_t tnow;
+ time_t t;
+ struct tztry tt;
+ struct tm *tm;
+ int thisyear;
+ int bestscore;
+ char tmptzdir[MAXPGPATH];
+ int std_ofs;
+ char std_zone_name[TZ_STRLEN_MAX + 1],
+ dst_zone_name[TZ_STRLEN_MAX + 1];
+ char cbuf[TZ_STRLEN_MAX + 1];
+
+ /* Initialize OS timezone library */
+ tzset();
+
+ /*
+ * Set up the list of dates to be probed to see how well our timezone
+ * matches the system zone. We first probe January and July of the
+ * current year; this serves to quickly eliminate the vast majority of the
+ * TZ database entries. If those dates match, we probe every week for 100
+ * years backwards from the current July. (Weekly resolution is good
+ * enough to identify DST transition rules, since everybody switches on
+ * Sundays.) This is sufficient to cover most of the Unix time_t range,
+ * and we don't want to look further than that since many systems won't
+ * have sane TZ behavior further back anyway. The further back the zone
+ * matches, the better we score it. This may seem like a rather random
+ * way of doing things, but experience has shown that system-supplied
+ * timezone definitions are likely to have DST behavior that is right for
+ * the recent past and not so accurate further back. Scoring in this way
+ * allows us to recognize zones that have some commonality with the IANA
+ * database, without insisting on exact match. (Note: we probe Thursdays,
+ * not Sundays, to avoid triggering DST-transition bugs in localtime
+ * itself.)
+ */
+ tnow = time(NULL);
+ tm = localtime(&tnow);
+ if (!tm)
+ return NULL; /* give up if localtime is broken... */
+ thisyear = tm->tm_year + 1900;
+
+ t = build_time_t(thisyear, 1, 15);
+
+ /*
+ * Round back to GMT midnight Thursday. This depends on the knowledge
+ * that the time_t origin is Thu Jan 01 1970. (With a different origin
+ * we'd be probing some other day of the week, but it wouldn't matter
+ * anyway unless localtime() had DST-transition bugs.)
+ */
+ t -= (t % T_WEEK);
+
+ tt.n_test_times = 0;
+ tt.test_times[tt.n_test_times++] = t;
+
+ t = build_time_t(thisyear, 7, 15);
+ t -= (t % T_WEEK);
+
+ tt.test_times[tt.n_test_times++] = t;
+
+ while (tt.n_test_times < MAX_TEST_TIMES)
+ {
+ t -= T_WEEK;
+ tt.test_times[tt.n_test_times++] = t;
+ }
+
+ /*
+ * Try to avoid the brute-force search by seeing if we can recognize the
+ * system's timezone setting directly.
+ *
+ * Currently we just check /etc/localtime; there are other conventions for
+ * this, but that seems to be the only one used on enough platforms to be
+ * worth troubling over.
+ */
+ if (check_system_link_file("/etc/localtime", &tt, resultbuf))
+ return resultbuf;
+
+ /* No luck, so search for the best-matching timezone file */
+ strlcpy(tmptzdir, pg_TZDIR(), sizeof(tmptzdir));
+ bestscore = -1;
+ resultbuf[0] = '\0';
+ scan_available_timezones(tmptzdir, tmptzdir + strlen(tmptzdir) + 1,
+ &tt,
+ &bestscore, resultbuf);
+ if (bestscore > 0)
+ {
+ /* Ignore IANA's rather silly "Factory" zone; use GMT instead */
+ if (strcmp(resultbuf, "Factory") == 0)
+ return NULL;
+ return resultbuf;
+ }
+
+ /*
+ * Couldn't find a match in the database, so next we try constructed zone
+ * names (like "PST8PDT").
+ *
+ * First we need to determine the names of the local standard and daylight
+ * zones. The idea here is to scan forward from today until we have seen
+ * both zones, if both are in use.
+ */
+ memset(std_zone_name, 0, sizeof(std_zone_name));
+ memset(dst_zone_name, 0, sizeof(dst_zone_name));
+ std_ofs = 0;
+
+ tnow = time(NULL);
+
+ /*
+ * Round back to a GMT midnight so results don't depend on local time of
+ * day
+ */
+ tnow -= (tnow % T_DAY);
+
+ /*
+ * We have to look a little further ahead than one year, in case today is
+ * just past a DST boundary that falls earlier in the year than the next
+ * similar boundary. Arbitrarily scan up to 14 months.
+ */
+ for (t = tnow; t <= tnow + T_MONTH * 14; t += T_MONTH)
+ {
+ tm = localtime(&t);
+ if (!tm)
+ continue;
+ if (tm->tm_isdst < 0)
+ continue;
+ if (tm->tm_isdst == 0 && std_zone_name[0] == '\0')
+ {
+ /* found STD zone */
+ memset(cbuf, 0, sizeof(cbuf));
+ strftime(cbuf, sizeof(cbuf) - 1, "%Z", tm); /* zone abbr */
+ strcpy(std_zone_name, cbuf);
+ std_ofs = get_timezone_offset(tm);
+ }
+ if (tm->tm_isdst > 0 && dst_zone_name[0] == '\0')
+ {
+ /* found DST zone */
+ memset(cbuf, 0, sizeof(cbuf));
+ strftime(cbuf, sizeof(cbuf) - 1, "%Z", tm); /* zone abbr */
+ strcpy(dst_zone_name, cbuf);
+ }
+ /* Done if found both */
+ if (std_zone_name[0] && dst_zone_name[0])
+ break;
+ }
+
+ /* We should have found a STD zone name by now... */
+ if (std_zone_name[0] == '\0')
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not determine system time zone\n");
+#endif
+ return NULL; /* go to GMT */
+ }
+
+ /* If we found DST then try STD<ofs>DST */
+ if (dst_zone_name[0] != '\0')
+ {
+ snprintf(resultbuf, sizeof(resultbuf), "%s%d%s",
+ std_zone_name, -std_ofs / 3600, dst_zone_name);
+ if (score_timezone(resultbuf, &tt) > 0)
+ return resultbuf;
+ }
+
+ /* Try just the STD timezone (works for GMT at least) */
+ strcpy(resultbuf, std_zone_name);
+ if (score_timezone(resultbuf, &tt) > 0)
+ return resultbuf;
+
+ /* Try STD<ofs> */
+ snprintf(resultbuf, sizeof(resultbuf), "%s%d",
+ std_zone_name, -std_ofs / 3600);
+ if (score_timezone(resultbuf, &tt) > 0)
+ return resultbuf;
+
+ /*
+ * Did not find the timezone. Fallback to use a GMT zone. Note that the
+ * IANA timezone database names the GMT-offset zones in POSIX style: plus
+ * is west of Greenwich. It's unfortunate that this is opposite of SQL
+ * conventions. Should we therefore change the names? Probably not...
+ */
+ snprintf(resultbuf, sizeof(resultbuf), "Etc/GMT%s%d",
+ (-std_ofs > 0) ? "+" : "", -std_ofs / 3600);
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not recognize system time zone, using \"%s\"\n",
+ resultbuf);
+#endif
+ return resultbuf;
+}
+
+/*
+ * Examine a system-provided symlink file to see if it tells us the timezone.
+ *
+ * Unfortunately, there is little standardization of how the system default
+ * timezone is determined in the absence of a TZ environment setting.
+ * But a common strategy is to create a symlink at a well-known place.
+ * If "linkname" identifies a readable symlink, and the tail of its contents
+ * matches a zone name we know, and the actual behavior of localtime() agrees
+ * with what we think that zone means, then we may use that zone name.
+ *
+ * We insist on a perfect behavioral match, which might not happen if the
+ * system has a different IANA database version than we do; but in that case
+ * it seems best to fall back to the brute-force search.
+ *
+ * linkname is the symlink file location to probe.
+ *
+ * tt tells about the system timezone behavior we need to match.
+ *
+ * If we successfully identify a zone name, store it in *bestzonename and
+ * return true; else return false. bestzonename must be a buffer of length
+ * TZ_STRLEN_MAX + 1.
+ */
+static bool
+check_system_link_file(const char *linkname, struct tztry *tt,
+ char *bestzonename)
+{
+#ifdef HAVE_READLINK
+ char link_target[MAXPGPATH];
+ int len;
+ const char *cur_name;
+
+ /*
+ * Try to read the symlink. If not there, not a symlink, etc etc, just
+ * quietly fail; the precise reason needn't concern us.
+ */
+ len = readlink(linkname, link_target, sizeof(link_target));
+ if (len < 0 || len >= sizeof(link_target))
+ return false;
+ link_target[len] = '\0';
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "symbolic link \"%s\" contains \"%s\"\n",
+ linkname, link_target);
+#endif
+
+ /*
+ * The symlink is probably of the form "/path/to/zones/zone/name", or
+ * possibly it is a relative path. Nobody puts their zone DB directly in
+ * the root directory, so we can definitely skip the first component; but
+ * after that it's trial-and-error to identify which path component begins
+ * the zone name.
+ */
+ cur_name = link_target;
+ while (*cur_name)
+ {
+ /* Advance to next segment of path */
+ cur_name = strchr(cur_name + 1, '/');
+ if (cur_name == NULL)
+ break;
+ /* If there are consecutive slashes, skip all, as the kernel would */
+ do
+ {
+ cur_name++;
+ } while (*cur_name == '/');
+
+ /*
+ * Test remainder of path to see if it is a matching zone name.
+ * Relative paths might contain ".."; we needn't bother testing if the
+ * first component is that. Also defend against overlength names.
+ */
+ if (*cur_name && *cur_name != '.' &&
+ strlen(cur_name) <= TZ_STRLEN_MAX &&
+ perfect_timezone_match(cur_name, tt))
+ {
+ /* Success! */
+ strcpy(bestzonename, cur_name);
+ return true;
+ }
+ }
+
+ /* Couldn't extract a matching zone name */
+ return false;
+#else
+ /* No symlinks? Forget it */
+ return false;
+#endif
+}
+
+/*
+ * Given a timezone name, determine whether it should be preferred over other
+ * names which are equally good matches. The output is arbitrary but we will
+ * use 0 for "neutral" default preference; larger values are more preferred.
+ */
+static int
+zone_name_pref(const char *zonename)
+{
+ /*
+ * Prefer UTC over alternatives such as UCT. Also prefer Etc/UTC over
+ * Etc/UCT; but UTC is preferred to Etc/UTC.
+ */
+ if (strcmp(zonename, "UTC") == 0)
+ return 50;
+ if (strcmp(zonename, "Etc/UTC") == 0)
+ return 40;
+
+ /*
+ * We don't want to pick "localtime" or "posixrules", unless we can find
+ * no other name for the prevailing zone. Those aren't real zone names.
+ */
+ if (strcmp(zonename, "localtime") == 0 ||
+ strcmp(zonename, "posixrules") == 0)
+ return -50;
+
+ return 0;
+}
+
+/*
+ * Recursively scan the timezone database looking for the best match to
+ * the system timezone behavior.
+ *
+ * tzdir points to a buffer of size MAXPGPATH. On entry, it holds the
+ * pathname of a directory containing TZ files. We internally modify it
+ * to hold pathnames of sub-directories and files, but must restore it
+ * to its original contents before exit.
+ *
+ * tzdirsub points to the part of tzdir that represents the subfile name
+ * (ie, tzdir + the original directory name length, plus one for the
+ * first added '/').
+ *
+ * tt tells about the system timezone behavior we need to match.
+ *
+ * *bestscore and *bestzonename on entry hold the best score found so far
+ * and the name of the best zone. We overwrite them if we find a better
+ * score. bestzonename must be a buffer of length TZ_STRLEN_MAX + 1.
+ */
+static void
+scan_available_timezones(char *tzdir, char *tzdirsub, struct tztry *tt,
+ int *bestscore, char *bestzonename)
+{
+ int tzdir_orig_len = strlen(tzdir);
+ char **names;
+ char **namep;
+
+ names = pgfnames(tzdir);
+ if (!names)
+ return;
+
+ for (namep = names; *namep; namep++)
+ {
+ char *name = *namep;
+ struct stat statbuf;
+
+ /* Ignore . and .., plus any other "hidden" files */
+ if (name[0] == '.')
+ continue;
+
+ snprintf(tzdir + tzdir_orig_len, MAXPGPATH - tzdir_orig_len,
+ "/%s", name);
+
+ if (stat(tzdir, &statbuf) != 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not stat \"%s\": %s\n",
+ tzdir, strerror(errno));
+#endif
+ tzdir[tzdir_orig_len] = '\0';
+ continue;
+ }
+
+ if (S_ISDIR(statbuf.st_mode))
+ {
+ /* Recurse into subdirectory */
+ scan_available_timezones(tzdir, tzdirsub, tt,
+ bestscore, bestzonename);
+ }
+ else
+ {
+ /* Load and test this file */
+ int score = score_timezone(tzdirsub, tt);
+
+ if (score > *bestscore)
+ {
+ *bestscore = score;
+ strlcpy(bestzonename, tzdirsub, TZ_STRLEN_MAX + 1);
+ }
+ else if (score == *bestscore)
+ {
+ /* Consider how to break a tie */
+ int namepref = (zone_name_pref(tzdirsub) -
+ zone_name_pref(bestzonename));
+
+ if (namepref > 0 ||
+ (namepref == 0 &&
+ (strlen(tzdirsub) < strlen(bestzonename) ||
+ (strlen(tzdirsub) == strlen(bestzonename) &&
+ strcmp(tzdirsub, bestzonename) < 0))))
+ strlcpy(bestzonename, tzdirsub, TZ_STRLEN_MAX + 1);
+ }
+ }
+
+ /* Restore tzdir */
+ tzdir[tzdir_orig_len] = '\0';
+ }
+
+ pgfnames_cleanup(names);
+}
+#else /* WIN32 */
+
+static const struct
+{
+ const char *stdname; /* Windows name of standard timezone */
+ const char *dstname; /* Windows name of daylight timezone */
+ const char *pgtzname; /* Name of pgsql timezone to map to */
+} win32_tzmap[] =
+
+{
+ /*
+ * This list was built from the contents of the registry at
+ * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time
+ * Zones on Windows 7, Windows 10, and Windows Server 2019. Some recent
+ * additions have been made by comparing to the CLDR project's
+ * windowsZones.xml file.
+ *
+ * The zones have been matched to IANA timezones based on CLDR's mapping
+ * for "territory 001".
+ */
+ {
+ /* (UTC+04:30) Kabul */
+ "Afghanistan Standard Time", "Afghanistan Daylight Time",
+ "Asia/Kabul"
+ },
+ {
+ /* (UTC-09:00) Alaska */
+ "Alaskan Standard Time", "Alaskan Daylight Time",
+ "America/Anchorage"
+ },
+ {
+ /* (UTC-10:00) Aleutian Islands */
+ "Aleutian Standard Time", "Aleutian Daylight Time",
+ "America/Adak"
+ },
+ {
+ /* (UTC+07:00) Barnaul, Gorno-Altaysk */
+ "Altai Standard Time", "Altai Daylight Time",
+ "Asia/Barnaul"
+ },
+ {
+ /* (UTC+03:00) Kuwait, Riyadh */
+ "Arab Standard Time", "Arab Daylight Time",
+ "Asia/Riyadh"
+ },
+ {
+ /* (UTC+04:00) Abu Dhabi, Muscat */
+ "Arabian Standard Time", "Arabian Daylight Time",
+ "Asia/Dubai"
+ },
+ {
+ /* (UTC+03:00) Baghdad */
+ "Arabic Standard Time", "Arabic Daylight Time",
+ "Asia/Baghdad"
+ },
+ {
+ /* (UTC-03:00) City of Buenos Aires */
+ "Argentina Standard Time", "Argentina Daylight Time",
+ "America/Buenos_Aires"
+ },
+ {
+ /* (UTC+04:00) Baku, Tbilisi, Yerevan */
+ "Armenian Standard Time", "Armenian Daylight Time",
+ "Asia/Yerevan"
+ },
+ {
+ /* (UTC+04:00) Astrakhan, Ulyanovsk */
+ "Astrakhan Standard Time", "Astrakhan Daylight Time",
+ "Europe/Astrakhan"
+ },
+ {
+ /* (UTC-04:00) Atlantic Time (Canada) */
+ "Atlantic Standard Time", "Atlantic Daylight Time",
+ "America/Halifax"
+ },
+ {
+ /* (UTC+09:30) Darwin */
+ "AUS Central Standard Time", "AUS Central Daylight Time",
+ "Australia/Darwin"
+ },
+ {
+ /* (UTC+08:45) Eucla */
+ "Aus Central W. Standard Time", "Aus Central W. Daylight Time",
+ "Australia/Eucla"
+ },
+ {
+ /* (UTC+10:00) Canberra, Melbourne, Sydney */
+ "AUS Eastern Standard Time", "AUS Eastern Daylight Time",
+ "Australia/Sydney"
+ },
+ {
+ /* (UTC+04:00) Baku */
+ "Azerbaijan Standard Time", "Azerbaijan Daylight Time",
+ "Asia/Baku"
+ },
+ {
+ /* (UTC-01:00) Azores */
+ "Azores Standard Time", "Azores Daylight Time",
+ "Atlantic/Azores"
+ },
+ {
+ /* (UTC-03:00) Salvador */
+ "Bahia Standard Time", "Bahia Daylight Time",
+ "America/Bahia"
+ },
+ {
+ /* (UTC+06:00) Dhaka */
+ "Bangladesh Standard Time", "Bangladesh Daylight Time",
+ "Asia/Dhaka"
+ },
+ {
+ /* (UTC+03:00) Minsk */
+ "Belarus Standard Time", "Belarus Daylight Time",
+ "Europe/Minsk"
+ },
+ {
+ /* (UTC+11:00) Bougainville Island */
+ "Bougainville Standard Time", "Bougainville Daylight Time",
+ "Pacific/Bougainville"
+ },
+ {
+ /* (UTC-01:00) Cabo Verde Is. */
+ "Cabo Verde Standard Time", "Cabo Verde Daylight Time",
+ "Atlantic/Cape_Verde"
+ },
+ {
+ /* (UTC-06:00) Saskatchewan */
+ "Canada Central Standard Time", "Canada Central Daylight Time",
+ "America/Regina"
+ },
+ {
+ /* (UTC-01:00) Cape Verde Is. */
+ "Cape Verde Standard Time", "Cape Verde Daylight Time",
+ "Atlantic/Cape_Verde"
+ },
+ {
+ /* (UTC+04:00) Yerevan */
+ "Caucasus Standard Time", "Caucasus Daylight Time",
+ "Asia/Yerevan"
+ },
+ {
+ /* (UTC+09:30) Adelaide */
+ "Cen. Australia Standard Time", "Cen. Australia Daylight Time",
+ "Australia/Adelaide"
+ },
+ {
+ /* (UTC-06:00) Central America */
+ "Central America Standard Time", "Central America Daylight Time",
+ "America/Guatemala"
+ },
+ {
+ /* (UTC+06:00) Astana */
+ "Central Asia Standard Time", "Central Asia Daylight Time",
+ "Asia/Almaty"
+ },
+ {
+ /* (UTC-04:00) Cuiaba */
+ "Central Brazilian Standard Time", "Central Brazilian Daylight Time",
+ "America/Cuiaba"
+ },
+ {
+ /* (UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague */
+ "Central Europe Standard Time", "Central Europe Daylight Time",
+ "Europe/Budapest"
+ },
+ {
+ /* (UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb */
+ "Central European Standard Time", "Central European Daylight Time",
+ "Europe/Warsaw"
+ },
+ {
+ /* (UTC+11:00) Solomon Is., New Caledonia */
+ "Central Pacific Standard Time", "Central Pacific Daylight Time",
+ "Pacific/Guadalcanal"
+ },
+ {
+ /* (UTC-06:00) Central Time (US & Canada) */
+ "Central Standard Time", "Central Daylight Time",
+ "America/Chicago"
+ },
+ {
+ /* (UTC-06:00) Guadalajara, Mexico City, Monterrey */
+ "Central Standard Time (Mexico)", "Central Daylight Time (Mexico)",
+ "America/Mexico_City"
+ },
+ {
+ /* (UTC+12:45) Chatham Islands */
+ "Chatham Islands Standard Time", "Chatham Islands Daylight Time",
+ "Pacific/Chatham"
+ },
+ {
+ /* (UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi */
+ "China Standard Time", "China Daylight Time",
+ "Asia/Shanghai"
+ },
+ {
+ /* (UTC) Coordinated Universal Time */
+ "Coordinated Universal Time", "Coordinated Universal Time",
+ "UTC"
+ },
+ {
+ /* (UTC-05:00) Havana */
+ "Cuba Standard Time", "Cuba Daylight Time",
+ "America/Havana"
+ },
+ {
+ /* (UTC-12:00) International Date Line West */
+ "Dateline Standard Time", "Dateline Daylight Time",
+ "Etc/GMT+12"
+ },
+ {
+ /* (UTC+03:00) Nairobi */
+ "E. Africa Standard Time", "E. Africa Daylight Time",
+ "Africa/Nairobi"
+ },
+ {
+ /* (UTC+10:00) Brisbane */
+ "E. Australia Standard Time", "E. Australia Daylight Time",
+ "Australia/Brisbane"
+ },
+ {
+ /* (UTC+02:00) Chisinau */
+ "E. Europe Standard Time", "E. Europe Daylight Time",
+ "Europe/Chisinau"
+ },
+ {
+ /* (UTC-03:00) Brasilia */
+ "E. South America Standard Time", "E. South America Daylight Time",
+ "America/Sao_Paulo"
+ },
+ {
+ /* (UTC-06:00) Easter Island */
+ "Easter Island Standard Time", "Easter Island Daylight Time",
+ "Pacific/Easter"
+ },
+ {
+ /* (UTC-05:00) Eastern Time (US & Canada) */
+ "Eastern Standard Time", "Eastern Daylight Time",
+ "America/New_York"
+ },
+ {
+ /* (UTC-05:00) Chetumal */
+ "Eastern Standard Time (Mexico)", "Eastern Daylight Time (Mexico)",
+ "America/Cancun"
+ },
+ {
+ /* (UTC+02:00) Cairo */
+ "Egypt Standard Time", "Egypt Daylight Time",
+ "Africa/Cairo"
+ },
+ {
+ /* (UTC+05:00) Ekaterinburg */
+ "Ekaterinburg Standard Time", "Ekaterinburg Daylight Time",
+ "Asia/Yekaterinburg"
+ },
+ {
+ /* (UTC+12:00) Fiji */
+ "Fiji Standard Time", "Fiji Daylight Time",
+ "Pacific/Fiji"
+ },
+ {
+ /* (UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius */
+ "FLE Standard Time", "FLE Daylight Time",
+ "Europe/Kiev"
+ },
+ {
+ /* (UTC+04:00) Tbilisi */
+ "Georgian Standard Time", "Georgian Daylight Time",
+ "Asia/Tbilisi"
+ },
+ {
+ /* (UTC+00:00) Dublin, Edinburgh, Lisbon, London */
+ "GMT Standard Time", "GMT Daylight Time",
+ "Europe/London"
+ },
+ {
+ /* (UTC-03:00) Greenland */
+ "Greenland Standard Time", "Greenland Daylight Time",
+ "America/Godthab"
+ },
+ {
+ /*
+ * Windows uses this zone name in various places that lie near the
+ * prime meridian, but are not in the UK. However, most people
+ * probably think that "Greenwich" means UK civil time, or maybe even
+ * straight-up UTC. Atlantic/Reykjavik is a decent match for that
+ * interpretation because Iceland hasn't observed DST since 1968.
+ */
+ /* (UTC+00:00) Monrovia, Reykjavik */
+ "Greenwich Standard Time", "Greenwich Daylight Time",
+ "Atlantic/Reykjavik"
+ },
+ {
+ /* (UTC+02:00) Athens, Bucharest */
+ "GTB Standard Time", "GTB Daylight Time",
+ "Europe/Bucharest"
+ },
+ {
+ /* (UTC-05:00) Haiti */
+ "Haiti Standard Time", "Haiti Daylight Time",
+ "America/Port-au-Prince"
+ },
+ {
+ /* (UTC-10:00) Hawaii */
+ "Hawaiian Standard Time", "Hawaiian Daylight Time",
+ "Pacific/Honolulu"
+ },
+ {
+ /* (UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi */
+ "India Standard Time", "India Daylight Time",
+ "Asia/Calcutta"
+ },
+ {
+ /* (UTC+03:30) Tehran */
+ "Iran Standard Time", "Iran Daylight Time",
+ "Asia/Tehran"
+ },
+ {
+ /* (UTC+02:00) Jerusalem */
+ "Israel Standard Time", "Israel Daylight Time",
+ "Asia/Jerusalem"
+ },
+ {
+ /* (UTC+02:00) Jerusalem (old spelling of zone name) */
+ "Jerusalem Standard Time", "Jerusalem Daylight Time",
+ "Asia/Jerusalem"
+ },
+ {
+ /* (UTC+02:00) Amman */
+ "Jordan Standard Time", "Jordan Daylight Time",
+ "Asia/Amman"
+ },
+ {
+ /* (UTC+02:00) Kaliningrad */
+ "Kaliningrad Standard Time", "Kaliningrad Daylight Time",
+ "Europe/Kaliningrad"
+ },
+ {
+ /* (UTC+12:00) Petropavlovsk-Kamchatsky - Old */
+ "Kamchatka Standard Time", "Kamchatka Daylight Time",
+ "Asia/Kamchatka"
+ },
+ {
+ /* (UTC+09:00) Seoul */
+ "Korea Standard Time", "Korea Daylight Time",
+ "Asia/Seoul"
+ },
+ {
+ /* (UTC+02:00) Tripoli */
+ "Libya Standard Time", "Libya Daylight Time",
+ "Africa/Tripoli"
+ },
+ {
+ /* (UTC+14:00) Kiritimati Island */
+ "Line Islands Standard Time", "Line Islands Daylight Time",
+ "Pacific/Kiritimati"
+ },
+ {
+ /* (UTC+10:30) Lord Howe Island */
+ "Lord Howe Standard Time", "Lord Howe Daylight Time",
+ "Australia/Lord_Howe"
+ },
+ {
+ /* (UTC+11:00) Magadan */
+ "Magadan Standard Time", "Magadan Daylight Time",
+ "Asia/Magadan"
+ },
+ {
+ /* (UTC-03:00) Punta Arenas */
+ "Magallanes Standard Time", "Magallanes Daylight Time",
+ "America/Punta_Arenas"
+ },
+ {
+ /* (UTC+08:00) Kuala Lumpur, Singapore */
+ "Malay Peninsula Standard Time", "Malay Peninsula Daylight Time",
+ "Asia/Kuala_Lumpur"
+ },
+ {
+ /* (UTC-09:30) Marquesas Islands */
+ "Marquesas Standard Time", "Marquesas Daylight Time",
+ "Pacific/Marquesas"
+ },
+ {
+ /* (UTC+04:00) Port Louis */
+ "Mauritius Standard Time", "Mauritius Daylight Time",
+ "Indian/Mauritius"
+ },
+ {
+ /* (UTC-06:00) Guadalajara, Mexico City, Monterrey */
+ "Mexico Standard Time", "Mexico Daylight Time",
+ "America/Mexico_City"
+ },
+ {
+ /* (UTC-07:00) Chihuahua, La Paz, Mazatlan */
+ "Mexico Standard Time 2", "Mexico Daylight Time 2",
+ "America/Chihuahua"
+ },
+ {
+ /* (UTC-02:00) Mid-Atlantic - Old */
+ "Mid-Atlantic Standard Time", "Mid-Atlantic Daylight Time",
+ "Atlantic/South_Georgia"
+ },
+ {
+ /* (UTC+02:00) Beirut */
+ "Middle East Standard Time", "Middle East Daylight Time",
+ "Asia/Beirut"
+ },
+ {
+ /* (UTC-03:00) Montevideo */
+ "Montevideo Standard Time", "Montevideo Daylight Time",
+ "America/Montevideo"
+ },
+ {
+ /* (UTC+01:00) Casablanca */
+ "Morocco Standard Time", "Morocco Daylight Time",
+ "Africa/Casablanca"
+ },
+ {
+ /* (UTC-07:00) Mountain Time (US & Canada) */
+ "Mountain Standard Time", "Mountain Daylight Time",
+ "America/Denver"
+ },
+ {
+ /* (UTC-07:00) Chihuahua, La Paz, Mazatlan */
+ "Mountain Standard Time (Mexico)", "Mountain Daylight Time (Mexico)",
+ "America/Chihuahua"
+ },
+ {
+ /* (UTC+06:30) Yangon (Rangoon) */
+ "Myanmar Standard Time", "Myanmar Daylight Time",
+ "Asia/Rangoon"
+ },
+ {
+ /* (UTC+07:00) Novosibirsk */
+ "N. Central Asia Standard Time", "N. Central Asia Daylight Time",
+ "Asia/Novosibirsk"
+ },
+ {
+ /* (UTC+02:00) Windhoek */
+ "Namibia Standard Time", "Namibia Daylight Time",
+ "Africa/Windhoek"
+ },
+ {
+ /* (UTC+05:45) Kathmandu */
+ "Nepal Standard Time", "Nepal Daylight Time",
+ "Asia/Katmandu"
+ },
+ {
+ /* (UTC+12:00) Auckland, Wellington */
+ "New Zealand Standard Time", "New Zealand Daylight Time",
+ "Pacific/Auckland"
+ },
+ {
+ /* (UTC-03:30) Newfoundland */
+ "Newfoundland Standard Time", "Newfoundland Daylight Time",
+ "America/St_Johns"
+ },
+ {
+ /* (UTC+11:00) Norfolk Island */
+ "Norfolk Standard Time", "Norfolk Daylight Time",
+ "Pacific/Norfolk"
+ },
+ {
+ /* (UTC+08:00) Irkutsk */
+ "North Asia East Standard Time", "North Asia East Daylight Time",
+ "Asia/Irkutsk"
+ },
+ {
+ /* (UTC+07:00) Krasnoyarsk */
+ "North Asia Standard Time", "North Asia Daylight Time",
+ "Asia/Krasnoyarsk"
+ },
+ {
+ /* (UTC+09:00) Pyongyang */
+ "North Korea Standard Time", "North Korea Daylight Time",
+ "Asia/Pyongyang"
+ },
+ {
+ /* (UTC+07:00) Novosibirsk */
+ "Novosibirsk Standard Time", "Novosibirsk Daylight Time",
+ "Asia/Novosibirsk"
+ },
+ {
+ /* (UTC+06:00) Omsk */
+ "Omsk Standard Time", "Omsk Daylight Time",
+ "Asia/Omsk"
+ },
+ {
+ /* (UTC-04:00) Santiago */
+ "Pacific SA Standard Time", "Pacific SA Daylight Time",
+ "America/Santiago"
+ },
+ {
+ /* (UTC-08:00) Pacific Time (US & Canada) */
+ "Pacific Standard Time", "Pacific Daylight Time",
+ "America/Los_Angeles"
+ },
+ {
+ /* (UTC-08:00) Baja California */
+ "Pacific Standard Time (Mexico)", "Pacific Daylight Time (Mexico)",
+ "America/Tijuana"
+ },
+ {
+ /* (UTC+05:00) Islamabad, Karachi */
+ "Pakistan Standard Time", "Pakistan Daylight Time",
+ "Asia/Karachi"
+ },
+ {
+ /* (UTC-04:00) Asuncion */
+ "Paraguay Standard Time", "Paraguay Daylight Time",
+ "America/Asuncion"
+ },
+ {
+ /* (UTC+05:00) Qyzylorda */
+ "Qyzylorda Standard Time", "Qyzylorda Daylight Time",
+ "Asia/Qyzylorda"
+ },
+ {
+ /* (UTC+01:00) Brussels, Copenhagen, Madrid, Paris */
+ "Romance Standard Time", "Romance Daylight Time",
+ "Europe/Paris"
+ },
+ {
+ /* (UTC+04:00) Izhevsk, Samara */
+ "Russia Time Zone 3", "Russia Time Zone 3",
+ "Europe/Samara"
+ },
+ {
+ /* (UTC+11:00) Chokurdakh */
+ "Russia Time Zone 10", "Russia Time Zone 10",
+ "Asia/Srednekolymsk"
+ },
+ {
+ /* (UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky */
+ "Russia Time Zone 11", "Russia Time Zone 11",
+ "Asia/Kamchatka"
+ },
+ {
+ /* (UTC+02:00) Kaliningrad */
+ "Russia TZ 1 Standard Time", "Russia TZ 1 Daylight Time",
+ "Europe/Kaliningrad"
+ },
+ {
+ /* (UTC+03:00) Moscow, St. Petersburg */
+ "Russia TZ 2 Standard Time", "Russia TZ 2 Daylight Time",
+ "Europe/Moscow"
+ },
+ {
+ /* (UTC+04:00) Izhevsk, Samara */
+ "Russia TZ 3 Standard Time", "Russia TZ 3 Daylight Time",
+ "Europe/Samara"
+ },
+ {
+ /* (UTC+05:00) Ekaterinburg */
+ "Russia TZ 4 Standard Time", "Russia TZ 4 Daylight Time",
+ "Asia/Yekaterinburg"
+ },
+ {
+ /* (UTC+06:00) Novosibirsk (RTZ 5) */
+ "Russia TZ 5 Standard Time", "Russia TZ 5 Daylight Time",
+ "Asia/Novosibirsk"
+ },
+ {
+ /* (UTC+07:00) Krasnoyarsk */
+ "Russia TZ 6 Standard Time", "Russia TZ 6 Daylight Time",
+ "Asia/Krasnoyarsk"
+ },
+ {
+ /* (UTC+08:00) Irkutsk */
+ "Russia TZ 7 Standard Time", "Russia TZ 7 Daylight Time",
+ "Asia/Irkutsk"
+ },
+ {
+ /* (UTC+09:00) Yakutsk */
+ "Russia TZ 8 Standard Time", "Russia TZ 8 Daylight Time",
+ "Asia/Yakutsk"
+ },
+ {
+ /* (UTC+10:00) Vladivostok */
+ "Russia TZ 9 Standard Time", "Russia TZ 9 Daylight Time",
+ "Asia/Vladivostok"
+ },
+ {
+ /* (UTC+11:00) Chokurdakh */
+ "Russia TZ 10 Standard Time", "Russia TZ 10 Daylight Time",
+ "Asia/Magadan"
+ },
+ {
+ /* (UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky */
+ "Russia TZ 11 Standard Time", "Russia TZ 11 Daylight Time",
+ "Asia/Anadyr"
+ },
+ {
+ /* (UTC+03:00) Moscow, St. Petersburg */
+ "Russian Standard Time", "Russian Daylight Time",
+ "Europe/Moscow"
+ },
+ {
+ /* (UTC-03:00) Cayenne, Fortaleza */
+ "SA Eastern Standard Time", "SA Eastern Daylight Time",
+ "America/Cayenne"
+ },
+ {
+ /* (UTC-05:00) Bogota, Lima, Quito, Rio Branco */
+ "SA Pacific Standard Time", "SA Pacific Daylight Time",
+ "America/Bogota"
+ },
+ {
+ /* (UTC-04:00) Georgetown, La Paz, Manaus, San Juan */
+ "SA Western Standard Time", "SA Western Daylight Time",
+ "America/La_Paz"
+ },
+ {
+ /* (UTC-03:00) Saint Pierre and Miquelon */
+ "Saint Pierre Standard Time", "Saint Pierre Daylight Time",
+ "America/Miquelon"
+ },
+ {
+ /* (UTC+11:00) Sakhalin */
+ "Sakhalin Standard Time", "Sakhalin Daylight Time",
+ "Asia/Sakhalin"
+ },
+ {
+ /* (UTC+13:00) Samoa */
+ "Samoa Standard Time", "Samoa Daylight Time",
+ "Pacific/Apia"
+ },
+ {
+ /* (UTC+00:00) Sao Tome */
+ "Sao Tome Standard Time", "Sao Tome Daylight Time",
+ "Africa/Sao_Tome"
+ },
+ {
+ /* (UTC+04:00) Saratov */
+ "Saratov Standard Time", "Saratov Daylight Time",
+ "Europe/Saratov"
+ },
+ {
+ /* (UTC+07:00) Bangkok, Hanoi, Jakarta */
+ "SE Asia Standard Time", "SE Asia Daylight Time",
+ "Asia/Bangkok"
+ },
+ {
+ /* (UTC+08:00) Kuala Lumpur, Singapore */
+ "Singapore Standard Time", "Singapore Daylight Time",
+ "Asia/Singapore"
+ },
+ {
+ /* (UTC+02:00) Harare, Pretoria */
+ "South Africa Standard Time", "South Africa Daylight Time",
+ "Africa/Johannesburg"
+ },
+ {
+ /* (UTC+02:00) Juba */
+ "South Sudan Standard Time", "South Sudan Daylight Time",
+ "Africa/Juba"
+ },
+ {
+ /* (UTC+05:30) Sri Jayawardenepura */
+ "Sri Lanka Standard Time", "Sri Lanka Daylight Time",
+ "Asia/Colombo"
+ },
+ {
+ /* (UTC+02:00) Khartoum */
+ "Sudan Standard Time", "Sudan Daylight Time",
+ "Africa/Khartoum"
+ },
+ {
+ /* (UTC+02:00) Damascus */
+ "Syria Standard Time", "Syria Daylight Time",
+ "Asia/Damascus"
+ },
+ {
+ /* (UTC+08:00) Taipei */
+ "Taipei Standard Time", "Taipei Daylight Time",
+ "Asia/Taipei"
+ },
+ {
+ /* (UTC+10:00) Hobart */
+ "Tasmania Standard Time", "Tasmania Daylight Time",
+ "Australia/Hobart"
+ },
+ {
+ /* (UTC-03:00) Araguaina */
+ "Tocantins Standard Time", "Tocantins Daylight Time",
+ "America/Araguaina"
+ },
+ {
+ /* (UTC+09:00) Osaka, Sapporo, Tokyo */
+ "Tokyo Standard Time", "Tokyo Daylight Time",
+ "Asia/Tokyo"
+ },
+ {
+ /* (UTC+07:00) Tomsk */
+ "Tomsk Standard Time", "Tomsk Daylight Time",
+ "Asia/Tomsk"
+ },
+ {
+ /* (UTC+13:00) Nuku'alofa */
+ "Tonga Standard Time", "Tonga Daylight Time",
+ "Pacific/Tongatapu"
+ },
+ {
+ /* (UTC+09:00) Chita */
+ "Transbaikal Standard Time", "Transbaikal Daylight Time",
+ "Asia/Chita"
+ },
+ {
+ /* (UTC+03:00) Istanbul */
+ "Turkey Standard Time", "Turkey Daylight Time",
+ "Europe/Istanbul"
+ },
+ {
+ /* (UTC-05:00) Turks and Caicos */
+ "Turks And Caicos Standard Time", "Turks And Caicos Daylight Time",
+ "America/Grand_Turk"
+ },
+ {
+ /* (UTC+08:00) Ulaanbaatar */
+ "Ulaanbaatar Standard Time", "Ulaanbaatar Daylight Time",
+ "Asia/Ulaanbaatar"
+ },
+ {
+ /* (UTC-05:00) Indiana (East) */
+ "US Eastern Standard Time", "US Eastern Daylight Time",
+ "America/Indianapolis"
+ },
+ {
+ /* (UTC-07:00) Arizona */
+ "US Mountain Standard Time", "US Mountain Daylight Time",
+ "America/Phoenix"
+ },
+ {
+ /* (UTC) Coordinated Universal Time */
+ "UTC", "UTC",
+ "UTC"
+ },
+ {
+ /* (UTC+12:00) Coordinated Universal Time+12 */
+ "UTC+12", "UTC+12",
+ "Etc/GMT-12"
+ },
+ {
+ /* (UTC+13:00) Coordinated Universal Time+13 */
+ "UTC+13", "UTC+13",
+ "Etc/GMT-13"
+ },
+ {
+ /* (UTC-02:00) Coordinated Universal Time-02 */
+ "UTC-02", "UTC-02",
+ "Etc/GMT+2"
+ },
+ {
+ /* (UTC-08:00) Coordinated Universal Time-08 */
+ "UTC-08", "UTC-08",
+ "Etc/GMT+8"
+ },
+ {
+ /* (UTC-09:00) Coordinated Universal Time-09 */
+ "UTC-09", "UTC-09",
+ "Etc/GMT+9"
+ },
+ {
+ /* (UTC-11:00) Coordinated Universal Time-11 */
+ "UTC-11", "UTC-11",
+ "Etc/GMT+11"
+ },
+ {
+ /* (UTC-04:00) Caracas */
+ "Venezuela Standard Time", "Venezuela Daylight Time",
+ "America/Caracas"
+ },
+ {
+ /* (UTC+10:00) Vladivostok */
+ "Vladivostok Standard Time", "Vladivostok Daylight Time",
+ "Asia/Vladivostok"
+ },
+ {
+ /* (UTC+04:00) Volgograd */
+ "Volgograd Standard Time", "Volgograd Daylight Time",
+ "Europe/Volgograd"
+ },
+ {
+ /* (UTC+08:00) Perth */
+ "W. Australia Standard Time", "W. Australia Daylight Time",
+ "Australia/Perth"
+ },
+ {
+ /* (UTC+01:00) West Central Africa */
+ "W. Central Africa Standard Time", "W. Central Africa Daylight Time",
+ "Africa/Lagos"
+ },
+ {
+ /* (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna */
+ "W. Europe Standard Time", "W. Europe Daylight Time",
+ "Europe/Berlin"
+ },
+ {
+ /* (UTC+07:00) Hovd */
+ "W. Mongolia Standard Time", "W. Mongolia Daylight Time",
+ "Asia/Hovd"
+ },
+ {
+ /* (UTC+05:00) Ashgabat, Tashkent */
+ "West Asia Standard Time", "West Asia Daylight Time",
+ "Asia/Tashkent"
+ },
+ {
+ /* (UTC+02:00) Gaza, Hebron */
+ "West Bank Gaza Standard Time", "West Bank Gaza Daylight Time",
+ "Asia/Gaza"
+ },
+ {
+ /* (UTC+02:00) Gaza, Hebron */
+ "West Bank Standard Time", "West Bank Daylight Time",
+ "Asia/Hebron"
+ },
+ {
+ /* (UTC+10:00) Guam, Port Moresby */
+ "West Pacific Standard Time", "West Pacific Daylight Time",
+ "Pacific/Port_Moresby"
+ },
+ {
+ /* (UTC+09:00) Yakutsk */
+ "Yakutsk Standard Time", "Yakutsk Daylight Time",
+ "Asia/Yakutsk"
+ },
+ {
+ /* (UTC-07:00) Yukon */
+ "Yukon Standard Time", "Yukon Daylight Time",
+ "America/Whitehorse"
+ },
+ {
+ NULL, NULL, NULL
+ }
+};
+
+static const char *
+identify_system_timezone(void)
+{
+ int i;
+ char tzname[128];
+ char localtzname[256];
+ time_t t = time(NULL);
+ struct tm *tm = localtime(&t);
+ HKEY rootKey;
+ int idx;
+
+ if (!tm)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not identify system time zone: localtime() failed\n");
+#endif
+ return NULL; /* go to GMT */
+ }
+
+ memset(tzname, 0, sizeof(tzname));
+ strftime(tzname, sizeof(tzname) - 1, "%Z", tm);
+
+ for (i = 0; win32_tzmap[i].stdname != NULL; i++)
+ {
+ if (strcmp(tzname, win32_tzmap[i].stdname) == 0 ||
+ strcmp(tzname, win32_tzmap[i].dstname) == 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" matches system time zone \"%s\"\n",
+ win32_tzmap[i].pgtzname, tzname);
+#endif
+ return win32_tzmap[i].pgtzname;
+ }
+ }
+
+ /*
+ * Localized Windows versions return localized names for the timezone.
+ * Scan the registry to find the English name, and then try matching
+ * against our table again.
+ */
+ memset(localtzname, 0, sizeof(localtzname));
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
+ 0,
+ KEY_READ,
+ &rootKey) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not open registry key to identify system time zone: error code %lu\n",
+ GetLastError());
+#endif
+ return NULL; /* go to GMT */
+ }
+
+ for (idx = 0;; idx++)
+ {
+ char keyname[256];
+ char zonename[256];
+ DWORD namesize;
+ FILETIME lastwrite;
+ HKEY key;
+ LONG r;
+
+ memset(keyname, 0, sizeof(keyname));
+ namesize = sizeof(keyname);
+ if ((r = RegEnumKeyEx(rootKey,
+ idx,
+ keyname,
+ &namesize,
+ NULL,
+ NULL,
+ NULL,
+ &lastwrite)) != ERROR_SUCCESS)
+ {
+ if (r == ERROR_NO_MORE_ITEMS)
+ break;
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not enumerate registry subkeys to identify system time zone: %d\n",
+ (int) r);
+#endif
+ break;
+ }
+
+ if ((r = RegOpenKeyEx(rootKey, keyname, 0, KEY_READ, &key)) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not open registry subkey to identify system time zone: %d\n",
+ (int) r);
+#endif
+ break;
+ }
+
+ memset(zonename, 0, sizeof(zonename));
+ namesize = sizeof(zonename);
+ if ((r = RegQueryValueEx(key, "Std", NULL, NULL, (unsigned char *) zonename, &namesize)) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not query value for key \"std\" to identify system time zone \"%s\": %d\n",
+ keyname, (int) r);
+#endif
+ RegCloseKey(key);
+ continue; /* Proceed to look at the next timezone */
+ }
+ if (strcmp(tzname, zonename) == 0)
+ {
+ /* Matched zone */
+ strcpy(localtzname, keyname);
+ RegCloseKey(key);
+ break;
+ }
+ memset(zonename, 0, sizeof(zonename));
+ namesize = sizeof(zonename);
+ if ((r = RegQueryValueEx(key, "Dlt", NULL, NULL, (unsigned char *) zonename, &namesize)) != ERROR_SUCCESS)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not query value for key \"dlt\" to identify system time zone \"%s\": %d\n",
+ keyname, (int) r);
+#endif
+ RegCloseKey(key);
+ continue; /* Proceed to look at the next timezone */
+ }
+ if (strcmp(tzname, zonename) == 0)
+ {
+ /* Matched DST zone */
+ strcpy(localtzname, keyname);
+ RegCloseKey(key);
+ break;
+ }
+
+ RegCloseKey(key);
+ }
+
+ RegCloseKey(rootKey);
+
+ if (localtzname[0])
+ {
+ /* Found a localized name, so scan for that one too */
+ for (i = 0; win32_tzmap[i].stdname != NULL; i++)
+ {
+ if (strcmp(localtzname, win32_tzmap[i].stdname) == 0 ||
+ strcmp(localtzname, win32_tzmap[i].dstname) == 0)
+ {
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "TZ \"%s\" matches localized system time zone \"%s\" (\"%s\")\n",
+ win32_tzmap[i].pgtzname, tzname, localtzname);
+#endif
+ return win32_tzmap[i].pgtzname;
+ }
+ }
+ }
+
+#ifdef DEBUG_IDENTIFY_TIMEZONE
+ fprintf(stderr, "could not find a match for system time zone \"%s\"\n",
+ tzname);
+#endif
+ return NULL; /* go to GMT */
+}
+#endif /* WIN32 */
+
+
+/*
+ * Return true if the given zone name is valid and is an "acceptable" zone.
+ */
+static bool
+validate_zone(const char *tzname)
+{
+ pg_tz *tz;
+
+ if (!tzname || !tzname[0])
+ return false;
+
+ tz = pg_load_tz(tzname);
+ if (!tz)
+ return false;
+
+ if (!pg_tz_acceptable(tz))
+ return false;
+
+ return true;
+}
+
+/*
+ * Identify a suitable default timezone setting based on the environment.
+ *
+ * The installation share_path must be passed in, as that is the default
+ * location for the timezone database directory.
+ *
+ * We first look to the TZ environment variable. If not found or not
+ * recognized by our own code, we see if we can identify the timezone
+ * from the behavior of the system timezone library. When all else fails,
+ * return NULL, indicating that we should default to GMT.
+ */
+const char *
+select_default_timezone(const char *share_path)
+{
+ const char *tzname;
+
+ /* Initialize timezone directory path, if needed */
+#ifndef SYSTEMTZDIR
+ snprintf(tzdirpath, sizeof(tzdirpath), "%s/timezone", share_path);
+#endif
+
+ /* Check TZ environment variable */
+ tzname = getenv("TZ");
+ if (validate_zone(tzname))
+ return tzname;
+
+ /* Nope, so try to identify the system timezone */
+ tzname = identify_system_timezone();
+ if (validate_zone(tzname))
+ return tzname;
+
+ return NULL;
+}
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
new file mode 100644
index 0000000..3afe14c
--- /dev/null
+++ b/src/bin/initdb/initdb.c
@@ -0,0 +1,3450 @@
+/*-------------------------------------------------------------------------
+ *
+ * initdb --- initialize a PostgreSQL installation
+ *
+ * initdb creates (initializes) a PostgreSQL database cluster (site,
+ * instance, installation, whatever). A database cluster is a
+ * collection of PostgreSQL databases all managed by the same server.
+ *
+ * To create the database cluster, we create the directory that contains
+ * all its data, create the files that hold the global tables, create
+ * a few other control files for it, and create three databases: the
+ * template databases "template0" and "template1", and a default user
+ * database "postgres".
+ *
+ * The template databases are ordinary PostgreSQL databases. template0
+ * is never supposed to change after initdb, whereas template1 can be
+ * changed to add site-local standard data. Either one can be copied
+ * to produce a new database.
+ *
+ * For largely-historical reasons, the template1 database is the one built
+ * by the basic bootstrap process. After it is complete, template0 and
+ * the default database, postgres, are made just by copying template1.
+ *
+ * To create template1, we run the postgres (backend) program in bootstrap
+ * mode and feed it data from the postgres.bki library file. After this
+ * initial bootstrap phase, some additional stuff is created by normal
+ * SQL commands fed to a standalone backend. Some of those commands are
+ * just embedded into this program (yeah, it's ugly), but larger chunks
+ * are taken from script files.
+ *
+ *
+ * Note:
+ * The program has some memory leakage - it isn't worth cleaning it up.
+ *
+ * This is a C implementation of the previous shell script for setting up a
+ * PostgreSQL cluster location, and should be highly compatible with it.
+ * author of C translation: Andrew Dunstan mailto:andrew@dunslane.net
+ *
+ * This code is released under the terms of the PostgreSQL License.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/initdb/initdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#ifdef USE_ICU
+#include <unicode/ucol.h>
+#endif
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+
+#ifdef HAVE_SHM_OPEN
+#include "sys/mman.h"
+#endif
+
+#include "access/xlog_internal.h"
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_class_d.h" /* pgrminclude ignore */
+#include "catalog/pg_collation_d.h"
+#include "catalog/pg_database_d.h" /* pgrminclude ignore */
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "common/pg_prng.h"
+#include "common/restricted_token.h"
+#include "common/string.h"
+#include "common/username.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "mb/pg_wchar.h"
+#include "miscadmin.h"
+
+
+/* Ideally this would be in a .h file, but it hardly seems worth the trouble */
+extern const char *select_default_timezone(const char *share_path);
+
+/* simple list of strings */
+typedef struct _stringlist
+{
+ char *str;
+ struct _stringlist *next;
+} _stringlist;
+
+static const char *const auth_methods_host[] = {
+ "trust", "reject", "scram-sha-256", "md5", "password", "ident", "radius",
+#ifdef ENABLE_GSS
+ "gss",
+#endif
+#ifdef ENABLE_SSPI
+ "sspi",
+#endif
+#ifdef USE_PAM
+ "pam", "pam ",
+#endif
+#ifdef USE_BSD_AUTH
+ "bsd",
+#endif
+#ifdef USE_LDAP
+ "ldap",
+#endif
+#ifdef USE_SSL
+ "cert",
+#endif
+ NULL
+};
+static const char *const auth_methods_local[] = {
+ "trust", "reject", "scram-sha-256", "md5", "password", "peer", "radius",
+#ifdef USE_PAM
+ "pam", "pam ",
+#endif
+#ifdef USE_BSD_AUTH
+ "bsd",
+#endif
+#ifdef USE_LDAP
+ "ldap",
+#endif
+ NULL
+};
+
+/*
+ * these values are passed in by makefile defines
+ */
+static char *share_path = NULL;
+
+/* values to be obtained from arguments */
+static char *pg_data = NULL;
+static char *encoding = NULL;
+static char *locale = NULL;
+static char *lc_collate = NULL;
+static char *lc_ctype = NULL;
+static char *lc_monetary = NULL;
+static char *lc_numeric = NULL;
+static char *lc_time = NULL;
+static char *lc_messages = NULL;
+static char locale_provider = COLLPROVIDER_LIBC;
+static char *icu_locale = NULL;
+static char *icu_rules = NULL;
+static const char *default_text_search_config = NULL;
+static char *username = NULL;
+static bool pwprompt = false;
+static char *pwfilename = NULL;
+static char *superuser_password = NULL;
+static const char *authmethodhost = NULL;
+static const char *authmethodlocal = NULL;
+static _stringlist *extra_guc_names = NULL;
+static _stringlist *extra_guc_values = NULL;
+static bool debug = false;
+static bool noclean = false;
+static bool noinstructions = false;
+static bool do_sync = true;
+static bool sync_only = false;
+static bool show_setting = false;
+static bool data_checksums = false;
+static char *xlog_dir = NULL;
+static char *str_wal_segment_size_mb = NULL;
+static int wal_segment_size_mb;
+
+
+/* internal vars */
+static const char *progname;
+static int encodingid;
+static char *bki_file;
+static char *hba_file;
+static char *ident_file;
+static char *conf_file;
+static char *dictionary_file;
+static char *info_schema_file;
+static char *features_file;
+static char *system_constraints_file;
+static char *system_functions_file;
+static char *system_views_file;
+static bool success = false;
+static bool made_new_pgdata = false;
+static bool found_existing_pgdata = false;
+static bool made_new_xlogdir = false;
+static bool found_existing_xlogdir = false;
+static char infoversion[100];
+static bool caught_signal = false;
+static bool output_failed = false;
+static int output_errno = 0;
+static char *pgdata_native;
+
+/* defaults */
+static int n_connections = 10;
+static int n_buffers = 50;
+static const char *dynamic_shared_memory_type = NULL;
+static const char *default_timezone = NULL;
+
+/*
+ * Warning messages for authentication methods
+ */
+#define AUTHTRUST_WARNING \
+"# CAUTION: Configuring the system for local \"trust\" authentication\n" \
+"# allows any local user to connect as any PostgreSQL user, including\n" \
+"# the database superuser. If you do not trust all your local users,\n" \
+"# use another authentication method.\n"
+static bool authwarning = false;
+
+/*
+ * Centralized knowledge of switches to pass to backend
+ *
+ * Note: we run the backend with -F (fsync disabled) and then do a single
+ * pass of fsync'ing at the end. This is faster than fsync'ing each step.
+ *
+ * Note: in the shell-script version, we also passed PGDATA as a -D switch,
+ * but here it is more convenient to pass it as an environment variable
+ * (no quoting to worry about).
+ */
+static const char *boot_options = "-F -c log_checkpoints=false";
+static const char *backend_options = "--single -F -O -j -c search_path=pg_catalog -c exit_on_error=true -c log_checkpoints=false";
+
+/* Additional switches to pass to backend (either boot or standalone) */
+static char *extra_options = "";
+
+static const char *const subdirs[] = {
+ "global",
+ "pg_wal/archive_status",
+ "pg_commit_ts",
+ "pg_dynshmem",
+ "pg_notify",
+ "pg_serial",
+ "pg_snapshots",
+ "pg_subtrans",
+ "pg_twophase",
+ "pg_multixact",
+ "pg_multixact/members",
+ "pg_multixact/offsets",
+ "base",
+ "base/1",
+ "pg_replslot",
+ "pg_tblspc",
+ "pg_stat",
+ "pg_stat_tmp",
+ "pg_xact",
+ "pg_logical",
+ "pg_logical/snapshots",
+ "pg_logical/mappings"
+};
+
+
+/* path to 'initdb' binary directory */
+static char bin_path[MAXPGPATH];
+static char backend_exec[MAXPGPATH];
+
+static char **replace_token(char **lines,
+ const char *token, const char *replacement);
+static char **replace_guc_value(char **lines,
+ const char *guc_name, const char *guc_value,
+ bool mark_as_comment);
+static bool guc_value_requires_quotes(const char *guc_value);
+static char **readfile(const char *path);
+static void writefile(char *path, char **lines);
+static FILE *popen_check(const char *command, const char *mode);
+static char *get_id(void);
+static int get_encoding_id(const char *encoding_name);
+static void set_input(char **dest, const char *filename);
+static void check_input(char *path);
+static void write_version_file(const char *extrapath);
+static void set_null_conf(void);
+static void test_config_settings(void);
+static bool test_specific_config_settings(int test_conns, int test_buffs);
+static void setup_config(void);
+static void bootstrap_template1(void);
+static void setup_auth(FILE *cmdfd);
+static void get_su_pwd(void);
+static void setup_depend(FILE *cmdfd);
+static void setup_run_file(FILE *cmdfd, const char *filename);
+static void setup_description(FILE *cmdfd);
+static void setup_collation(FILE *cmdfd);
+static void setup_privileges(FILE *cmdfd);
+static void set_info_version(void);
+static void setup_schema(FILE *cmdfd);
+static void load_plpgsql(FILE *cmdfd);
+static void vacuum_db(FILE *cmdfd);
+static void make_template0(FILE *cmdfd);
+static void make_postgres(FILE *cmdfd);
+static void trapsig(SIGNAL_ARGS);
+static void check_ok(void);
+static char *escape_quotes(const char *src);
+static char *escape_quotes_bki(const char *src);
+static int locale_date_order(const char *locale);
+static void check_locale_name(int category, const char *locale,
+ char **canonname);
+static bool check_locale_encoding(const char *locale, int user_enc);
+static void setlocales(void);
+static void usage(const char *progname);
+void setup_pgdata(void);
+void setup_bin_paths(const char *argv0);
+void setup_data_file_paths(void);
+void setup_locale_encoding(void);
+void setup_signals(void);
+void setup_text_search(void);
+void create_data_directory(void);
+void create_xlog_or_symlink(void);
+void warn_on_mount_point(int error);
+void initialize_data_directory(void);
+
+/*
+ * macros for running pipes to postgres
+ */
+#define PG_CMD_DECL char cmd[MAXPGPATH]; FILE *cmdfd
+
+#define PG_CMD_OPEN \
+do { \
+ cmdfd = popen_check(cmd, "w"); \
+ if (cmdfd == NULL) \
+ exit(1); /* message already printed by popen_check */ \
+} while (0)
+
+#define PG_CMD_CLOSE \
+do { \
+ if (pclose_check(cmdfd)) \
+ exit(1); /* message already printed by pclose_check */ \
+} while (0)
+
+#define PG_CMD_PUTS(line) \
+do { \
+ if (fputs(line, cmdfd) < 0 || fflush(cmdfd) < 0) \
+ output_failed = true, output_errno = errno; \
+} while (0)
+
+#define PG_CMD_PRINTF(fmt, ...) \
+do { \
+ if (fprintf(cmdfd, fmt, __VA_ARGS__) < 0 || fflush(cmdfd) < 0) \
+ output_failed = true, output_errno = errno; \
+} while (0)
+
+/*
+ * Escape single quotes and backslashes, suitably for insertions into
+ * configuration files or SQL E'' strings.
+ */
+static char *
+escape_quotes(const char *src)
+{
+ char *result = escape_single_quotes_ascii(src);
+
+ if (!result)
+ pg_fatal("out of memory");
+ return result;
+}
+
+/*
+ * Escape a field value to be inserted into the BKI data.
+ * Run the value through escape_quotes (which will be inverted
+ * by the backend's DeescapeQuotedString() function), then wrap
+ * the value in single quotes, even if that isn't strictly necessary.
+ */
+static char *
+escape_quotes_bki(const char *src)
+{
+ char *result;
+ char *data = escape_quotes(src);
+ char *resultp;
+ char *datap;
+
+ result = (char *) pg_malloc(strlen(data) + 3);
+ resultp = result;
+ *resultp++ = '\'';
+ for (datap = data; *datap; datap++)
+ *resultp++ = *datap;
+ *resultp++ = '\'';
+ *resultp = '\0';
+
+ free(data);
+ return result;
+}
+
+/*
+ * Add an item at the end of a stringlist.
+ */
+static void
+add_stringlist_item(_stringlist **listhead, const char *str)
+{
+ _stringlist *newentry = pg_malloc(sizeof(_stringlist));
+ _stringlist *oldentry;
+
+ newentry->str = pg_strdup(str);
+ newentry->next = NULL;
+ if (*listhead == NULL)
+ *listhead = newentry;
+ else
+ {
+ for (oldentry = *listhead; oldentry->next; oldentry = oldentry->next)
+ /* skip */ ;
+ oldentry->next = newentry;
+ }
+}
+
+/*
+ * Modify the array of lines, replacing "token" by "replacement"
+ * the first time it occurs on each line.
+ *
+ * The array must be a malloc'd array of individually malloc'd strings.
+ * We free any discarded strings.
+ *
+ * This does most of what sed was used for in the shell script, but
+ * doesn't need any regexp stuff.
+ */
+static char **
+replace_token(char **lines, const char *token, const char *replacement)
+{
+ int toklen,
+ replen,
+ diff;
+
+ toklen = strlen(token);
+ replen = strlen(replacement);
+ diff = replen - toklen;
+
+ for (int i = 0; lines[i]; i++)
+ {
+ char *where;
+ char *newline;
+ int pre;
+
+ /* nothing to do if no change needed */
+ if ((where = strstr(lines[i], token)) == NULL)
+ continue;
+
+ /* if we get here a change is needed - set up new line */
+
+ newline = (char *) pg_malloc(strlen(lines[i]) + diff + 1);
+
+ pre = where - lines[i];
+
+ memcpy(newline, lines[i], pre);
+
+ memcpy(newline + pre, replacement, replen);
+
+ strcpy(newline + pre + replen, lines[i] + pre + toklen);
+
+ free(lines[i]);
+ lines[i] = newline;
+ }
+
+ return lines;
+}
+
+/*
+ * Modify the array of lines, replacing the possibly-commented-out
+ * assignment of parameter guc_name with a live assignment of guc_value.
+ * The value will be suitably quoted.
+ *
+ * If mark_as_comment is true, the replacement line is prefixed with '#'.
+ * This is used for fixing up cases where the effective default might not
+ * match what is in postgresql.conf.sample.
+ *
+ * We assume there's at most one matching assignment. If we find no match,
+ * append a new line with the desired assignment.
+ *
+ * The array must be a malloc'd array of individually malloc'd strings.
+ * We free any discarded strings.
+ */
+static char **
+replace_guc_value(char **lines, const char *guc_name, const char *guc_value,
+ bool mark_as_comment)
+{
+ int namelen = strlen(guc_name);
+ PQExpBuffer newline = createPQExpBuffer();
+ int i;
+
+ /* prepare the replacement line, except for possible comment and newline */
+ if (mark_as_comment)
+ appendPQExpBufferChar(newline, '#');
+ appendPQExpBuffer(newline, "%s = ", guc_name);
+ if (guc_value_requires_quotes(guc_value))
+ appendPQExpBuffer(newline, "'%s'", escape_quotes(guc_value));
+ else
+ appendPQExpBufferStr(newline, guc_value);
+
+ for (i = 0; lines[i]; i++)
+ {
+ const char *where;
+
+ /*
+ * Look for a line assigning to guc_name. Typically it will be
+ * preceded by '#', but that might not be the case if a -c switch
+ * overrides a previous assignment. We allow leading whitespace too,
+ * although normally there wouldn't be any.
+ */
+ where = lines[i];
+ while (*where == '#' || isspace((unsigned char) *where))
+ where++;
+ if (strncmp(where, guc_name, namelen) != 0)
+ continue;
+ where += namelen;
+ while (isspace((unsigned char) *where))
+ where++;
+ if (*where != '=')
+ continue;
+
+ /* found it -- append the original comment if any */
+ where = strrchr(where, '#');
+ if (where)
+ {
+ /*
+ * We try to preserve original indentation, which is tedious.
+ * oldindent and newindent are measured in de-tab-ified columns.
+ */
+ const char *ptr;
+ int oldindent = 0;
+ int newindent;
+
+ for (ptr = lines[i]; ptr < where; ptr++)
+ {
+ if (*ptr == '\t')
+ oldindent += 8 - (oldindent % 8);
+ else
+ oldindent++;
+ }
+ /* ignore the possibility of tabs in guc_value */
+ newindent = newline->len;
+ /* append appropriate tabs and spaces, forcing at least one */
+ oldindent = Max(oldindent, newindent + 1);
+ while (newindent < oldindent)
+ {
+ int newindent_if_tab = newindent + 8 - (newindent % 8);
+
+ if (newindent_if_tab <= oldindent)
+ {
+ appendPQExpBufferChar(newline, '\t');
+ newindent = newindent_if_tab;
+ }
+ else
+ {
+ appendPQExpBufferChar(newline, ' ');
+ newindent++;
+ }
+ }
+ /* and finally append the old comment */
+ appendPQExpBufferStr(newline, where);
+ /* we'll have appended the original newline; don't add another */
+ }
+ else
+ appendPQExpBufferChar(newline, '\n');
+
+ free(lines[i]);
+ lines[i] = newline->data;
+
+ break; /* assume there's only one match */
+ }
+
+ if (lines[i] == NULL)
+ {
+ /*
+ * No match, so append a new entry. (We rely on the bootstrap server
+ * to complain if it's not a valid GUC name.)
+ */
+ appendPQExpBufferChar(newline, '\n');
+ lines = pg_realloc_array(lines, char *, i + 2);
+ lines[i++] = newline->data;
+ lines[i] = NULL; /* keep the array null-terminated */
+ }
+
+ free(newline); /* but don't free newline->data */
+
+ return lines;
+}
+
+/*
+ * Decide if we should quote a replacement GUC value. We aren't too tense
+ * here, but we'd like to avoid quoting simple identifiers and numbers
+ * with units, which are common cases.
+ */
+static bool
+guc_value_requires_quotes(const char *guc_value)
+{
+ /* Don't use <ctype.h> macros here, they might accept too much */
+#define LETTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+#define DIGITS "0123456789"
+
+ if (*guc_value == '\0')
+ return true; /* empty string must be quoted */
+ if (strchr(LETTERS, *guc_value))
+ {
+ if (strspn(guc_value, LETTERS DIGITS) == strlen(guc_value))
+ return false; /* it's an identifier */
+ return true; /* nope */
+ }
+ if (strchr(DIGITS, *guc_value))
+ {
+ /* skip over digits */
+ guc_value += strspn(guc_value, DIGITS);
+ /* there can be zero or more unit letters after the digits */
+ if (strspn(guc_value, LETTERS) == strlen(guc_value))
+ return false; /* it's a number, possibly with units */
+ return true; /* nope */
+ }
+ return true; /* all else must be quoted */
+}
+
+/*
+ * get the lines from a text file
+ *
+ * The result is a malloc'd array of individually malloc'd strings.
+ */
+static char **
+readfile(const char *path)
+{
+ char **result;
+ FILE *infile;
+ StringInfoData line;
+ int maxlines;
+ int n;
+
+ if ((infile = fopen(path, "r")) == NULL)
+ pg_fatal("could not open file \"%s\" for reading: %m", path);
+
+ initStringInfo(&line);
+
+ maxlines = 1024;
+ result = (char **) pg_malloc(maxlines * sizeof(char *));
+
+ n = 0;
+ while (pg_get_line_buf(infile, &line))
+ {
+ /* make sure there will be room for a trailing NULL pointer */
+ if (n >= maxlines - 1)
+ {
+ maxlines *= 2;
+ result = (char **) pg_realloc(result, maxlines * sizeof(char *));
+ }
+
+ result[n++] = pg_strdup(line.data);
+ }
+ result[n] = NULL;
+
+ pfree(line.data);
+
+ fclose(infile);
+
+ return result;
+}
+
+/*
+ * write an array of lines to a file
+ *
+ * "lines" must be a malloc'd array of individually malloc'd strings.
+ * All that data is freed here.
+ *
+ * This is only used to write text files. Use fopen "w" not PG_BINARY_W
+ * so that the resulting configuration files are nicely editable on Windows.
+ */
+static void
+writefile(char *path, char **lines)
+{
+ FILE *out_file;
+ char **line;
+
+ if ((out_file = fopen(path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\" for writing: %m", path);
+ for (line = lines; *line != NULL; line++)
+ {
+ if (fputs(*line, out_file) < 0)
+ pg_fatal("could not write file \"%s\": %m", path);
+ free(*line);
+ }
+ if (fclose(out_file))
+ pg_fatal("could not close file \"%s\": %m", path);
+ free(lines);
+}
+
+/*
+ * Open a subcommand with suitable error messaging
+ */
+static FILE *
+popen_check(const char *command, const char *mode)
+{
+ FILE *cmdfd;
+
+ fflush(NULL);
+ errno = 0;
+ cmdfd = popen(command, mode);
+ if (cmdfd == NULL)
+ pg_log_error("could not execute command \"%s\": %m", command);
+ return cmdfd;
+}
+
+/*
+ * clean up any files we created on failure
+ * if we created the data directory remove it too
+ */
+static void
+cleanup_directories_atexit(void)
+{
+ if (success)
+ return;
+
+ if (!noclean)
+ {
+ if (made_new_pgdata)
+ {
+ pg_log_info("removing data directory \"%s\"", pg_data);
+ if (!rmtree(pg_data, true))
+ pg_log_error("failed to remove data directory");
+ }
+ else if (found_existing_pgdata)
+ {
+ pg_log_info("removing contents of data directory \"%s\"",
+ pg_data);
+ if (!rmtree(pg_data, false))
+ pg_log_error("failed to remove contents of data directory");
+ }
+
+ if (made_new_xlogdir)
+ {
+ pg_log_info("removing WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, true))
+ pg_log_error("failed to remove WAL directory");
+ }
+ else if (found_existing_xlogdir)
+ {
+ pg_log_info("removing contents of WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, false))
+ pg_log_error("failed to remove contents of WAL directory");
+ }
+ /* otherwise died during startup, do nothing! */
+ }
+ else
+ {
+ if (made_new_pgdata || found_existing_pgdata)
+ pg_log_info("data directory \"%s\" not removed at user's request",
+ pg_data);
+
+ if (made_new_xlogdir || found_existing_xlogdir)
+ pg_log_info("WAL directory \"%s\" not removed at user's request",
+ xlog_dir);
+ }
+}
+
+/*
+ * find the current user
+ *
+ * on unix make sure it isn't root
+ */
+static char *
+get_id(void)
+{
+ const char *username;
+
+#ifndef WIN32
+ if (geteuid() == 0) /* 0 is root's uid */
+ {
+ pg_log_error("cannot be run as root");
+ pg_log_error_hint("Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process.");
+ exit(1);
+ }
+#endif
+
+ username = get_user_name_or_exit(progname);
+
+ return pg_strdup(username);
+}
+
+static char *
+encodingid_to_string(int enc)
+{
+ char result[20];
+
+ sprintf(result, "%d", enc);
+ return pg_strdup(result);
+}
+
+/*
+ * get the encoding id for a given encoding name
+ */
+static int
+get_encoding_id(const char *encoding_name)
+{
+ int enc;
+
+ if (encoding_name && *encoding_name)
+ {
+ if ((enc = pg_valid_server_encoding(encoding_name)) >= 0)
+ return enc;
+ }
+ pg_fatal("\"%s\" is not a valid server encoding name",
+ encoding_name ? encoding_name : "(null)");
+}
+
+/*
+ * Support for determining the best default text search configuration.
+ * We key this off the first part of LC_CTYPE (ie, the language name).
+ */
+struct tsearch_config_match
+{
+ const char *tsconfname;
+ const char *langname;
+};
+
+static const struct tsearch_config_match tsearch_config_languages[] =
+{
+ {"arabic", "ar"},
+ {"arabic", "Arabic"},
+ {"armenian", "hy"},
+ {"armenian", "Armenian"},
+ {"basque", "eu"},
+ {"basque", "Basque"},
+ {"catalan", "ca"},
+ {"catalan", "Catalan"},
+ {"danish", "da"},
+ {"danish", "Danish"},
+ {"dutch", "nl"},
+ {"dutch", "Dutch"},
+ {"english", "C"},
+ {"english", "POSIX"},
+ {"english", "en"},
+ {"english", "English"},
+ {"finnish", "fi"},
+ {"finnish", "Finnish"},
+ {"french", "fr"},
+ {"french", "French"},
+ {"german", "de"},
+ {"german", "German"},
+ {"greek", "el"},
+ {"greek", "Greek"},
+ {"hindi", "hi"},
+ {"hindi", "Hindi"},
+ {"hungarian", "hu"},
+ {"hungarian", "Hungarian"},
+ {"indonesian", "id"},
+ {"indonesian", "Indonesian"},
+ {"irish", "ga"},
+ {"irish", "Irish"},
+ {"italian", "it"},
+ {"italian", "Italian"},
+ {"lithuanian", "lt"},
+ {"lithuanian", "Lithuanian"},
+ {"nepali", "ne"},
+ {"nepali", "Nepali"},
+ {"norwegian", "no"},
+ {"norwegian", "Norwegian"},
+ {"portuguese", "pt"},
+ {"portuguese", "Portuguese"},
+ {"romanian", "ro"},
+ {"russian", "ru"},
+ {"russian", "Russian"},
+ {"serbian", "sr"},
+ {"serbian", "Serbian"},
+ {"spanish", "es"},
+ {"spanish", "Spanish"},
+ {"swedish", "sv"},
+ {"swedish", "Swedish"},
+ {"tamil", "ta"},
+ {"tamil", "Tamil"},
+ {"turkish", "tr"},
+ {"turkish", "Turkish"},
+ {"yiddish", "yi"},
+ {"yiddish", "Yiddish"},
+ {NULL, NULL} /* end marker */
+};
+
+/*
+ * Look for a text search configuration matching lc_ctype, and return its
+ * name; return NULL if no match.
+ */
+static const char *
+find_matching_ts_config(const char *lc_type)
+{
+ int i;
+ char *langname,
+ *ptr;
+
+ /*
+ * Convert lc_ctype to a language name by stripping everything after an
+ * underscore (usual case) or a hyphen (Windows "locale name"; see
+ * comments at IsoLocaleName()).
+ *
+ * XXX Should ' ' be a stop character? This would select "norwegian" for
+ * the Windows locale "Norwegian (Nynorsk)_Norway.1252". If we do so, we
+ * should also accept the "nn" and "nb" Unix locales.
+ *
+ * Just for paranoia, we also stop at '.' or '@'.
+ */
+ if (lc_type == NULL)
+ langname = pg_strdup("");
+ else
+ {
+ ptr = langname = pg_strdup(lc_type);
+ while (*ptr &&
+ *ptr != '_' && *ptr != '-' && *ptr != '.' && *ptr != '@')
+ ptr++;
+ *ptr = '\0';
+ }
+
+ for (i = 0; tsearch_config_languages[i].tsconfname; i++)
+ {
+ if (pg_strcasecmp(tsearch_config_languages[i].langname, langname) == 0)
+ {
+ free(langname);
+ return tsearch_config_languages[i].tsconfname;
+ }
+ }
+
+ free(langname);
+ return NULL;
+}
+
+
+/*
+ * set name of given input file variable under data directory
+ */
+static void
+set_input(char **dest, const char *filename)
+{
+ *dest = psprintf("%s/%s", share_path, filename);
+}
+
+/*
+ * check that given input file exists
+ */
+static void
+check_input(char *path)
+{
+ struct stat statbuf;
+
+ if (stat(path, &statbuf) != 0)
+ {
+ if (errno == ENOENT)
+ {
+ pg_log_error("file \"%s\" does not exist", path);
+ pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
+ }
+ else
+ {
+ pg_log_error("could not access file \"%s\": %m", path);
+ pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
+ }
+ exit(1);
+ }
+ if (!S_ISREG(statbuf.st_mode))
+ {
+ pg_log_error("file \"%s\" is not a regular file", path);
+ pg_log_error_hint("This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L.");
+ exit(1);
+ }
+}
+
+/*
+ * write out the PG_VERSION file in the data dir, or its subdirectory
+ * if extrapath is not NULL
+ */
+static void
+write_version_file(const char *extrapath)
+{
+ FILE *version_file;
+ char *path;
+
+ if (extrapath == NULL)
+ path = psprintf("%s/PG_VERSION", pg_data);
+ else
+ path = psprintf("%s/%s/PG_VERSION", pg_data, extrapath);
+
+ if ((version_file = fopen(path, PG_BINARY_W)) == NULL)
+ pg_fatal("could not open file \"%s\" for writing: %m", path);
+ if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 ||
+ fclose(version_file))
+ pg_fatal("could not write file \"%s\": %m", path);
+ free(path);
+}
+
+/*
+ * set up an empty config file so we can check config settings by launching
+ * a test backend
+ */
+static void
+set_null_conf(void)
+{
+ FILE *conf_file;
+ char *path;
+
+ path = psprintf("%s/postgresql.conf", pg_data);
+ conf_file = fopen(path, PG_BINARY_W);
+ if (conf_file == NULL)
+ pg_fatal("could not open file \"%s\" for writing: %m", path);
+ if (fclose(conf_file))
+ pg_fatal("could not write file \"%s\": %m", path);
+ free(path);
+}
+
+/*
+ * Determine which dynamic shared memory implementation should be used on
+ * this platform. POSIX shared memory is preferable because the default
+ * allocation limits are much higher than the limits for System V on most
+ * systems that support both, but the fact that a platform has shm_open
+ * doesn't guarantee that that call will succeed when attempted. So, we
+ * attempt to reproduce what the postmaster will do when allocating a POSIX
+ * segment in dsm_impl.c; if it doesn't work, we assume it won't work for
+ * the postmaster either, and configure the cluster for System V shared
+ * memory instead.
+ *
+ * We avoid choosing Solaris's implementation of shm_open() by default. It
+ * can sleep and fail spuriously under contention.
+ */
+static const char *
+choose_dsm_implementation(void)
+{
+#if defined(HAVE_SHM_OPEN) && !defined(__sun__)
+ int ntries = 10;
+ pg_prng_state prng_state;
+
+ /* Initialize prng; this function is its only user in this program. */
+ pg_prng_seed(&prng_state, (uint64) (getpid() ^ time(NULL)));
+
+ while (ntries > 0)
+ {
+ uint32 handle;
+ char name[64];
+ int fd;
+
+ handle = pg_prng_uint32(&prng_state);
+ snprintf(name, 64, "/PostgreSQL.%u", handle);
+ if ((fd = shm_open(name, O_CREAT | O_RDWR | O_EXCL, 0600)) != -1)
+ {
+ close(fd);
+ shm_unlink(name);
+ return "posix";
+ }
+ if (errno != EEXIST)
+ break;
+ --ntries;
+ }
+#endif
+
+#ifdef WIN32
+ return "windows";
+#else
+ return "sysv";
+#endif
+}
+
+/*
+ * Determine platform-specific config settings
+ *
+ * Use reasonable values if kernel will let us, else scale back.
+ */
+static void
+test_config_settings(void)
+{
+ /*
+ * This macro defines the minimum shared_buffers we want for a given
+ * max_connections value. The arrays show the settings to try.
+ */
+#define MIN_BUFS_FOR_CONNS(nconns) ((nconns) * 10)
+
+ static const int trial_conns[] = {
+ 100, 50, 40, 30, 20
+ };
+ static const int trial_bufs[] = {
+ 16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536,
+ 1000, 900, 800, 700, 600, 500,
+ 400, 300, 200, 100, 50
+ };
+
+ const int connslen = sizeof(trial_conns) / sizeof(int);
+ const int bufslen = sizeof(trial_bufs) / sizeof(int);
+ int i,
+ test_conns,
+ test_buffs,
+ ok_buffers = 0;
+
+ /*
+ * Need to determine working DSM implementation first so that subsequent
+ * tests don't fail because DSM setting doesn't work.
+ */
+ printf(_("selecting dynamic shared memory implementation ... "));
+ fflush(stdout);
+ dynamic_shared_memory_type = choose_dsm_implementation();
+ printf("%s\n", dynamic_shared_memory_type);
+
+ /*
+ * Probe for max_connections before shared_buffers, since it is subject to
+ * more constraints than shared_buffers.
+ */
+ printf(_("selecting default max_connections ... "));
+ fflush(stdout);
+
+ for (i = 0; i < connslen; i++)
+ {
+ test_conns = trial_conns[i];
+ test_buffs = MIN_BUFS_FOR_CONNS(test_conns);
+
+ if (test_specific_config_settings(test_conns, test_buffs))
+ {
+ ok_buffers = test_buffs;
+ break;
+ }
+ }
+ if (i >= connslen)
+ i = connslen - 1;
+ n_connections = trial_conns[i];
+
+ printf("%d\n", n_connections);
+
+ printf(_("selecting default shared_buffers ... "));
+ fflush(stdout);
+
+ for (i = 0; i < bufslen; i++)
+ {
+ /* Use same amount of memory, independent of BLCKSZ */
+ test_buffs = (trial_bufs[i] * 8192) / BLCKSZ;
+ if (test_buffs <= ok_buffers)
+ {
+ test_buffs = ok_buffers;
+ break;
+ }
+
+ if (test_specific_config_settings(n_connections, test_buffs))
+ break;
+ }
+ n_buffers = test_buffs;
+
+ if ((n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
+ printf("%dMB\n", (n_buffers * (BLCKSZ / 1024)) / 1024);
+ else
+ printf("%dkB\n", n_buffers * (BLCKSZ / 1024));
+
+ printf(_("selecting default time zone ... "));
+ fflush(stdout);
+ default_timezone = select_default_timezone(share_path);
+ printf("%s\n", default_timezone ? default_timezone : "GMT");
+}
+
+/*
+ * Test a specific combination of configuration settings.
+ */
+static bool
+test_specific_config_settings(int test_conns, int test_buffs)
+{
+ PQExpBuffer cmd = createPQExpBuffer();
+ _stringlist *gnames,
+ *gvalues;
+ int status;
+
+ /* Set up the test postmaster invocation */
+ printfPQExpBuffer(cmd,
+ "\"%s\" --check %s %s "
+ "-c max_connections=%d "
+ "-c shared_buffers=%d "
+ "-c dynamic_shared_memory_type=%s",
+ backend_exec, boot_options, extra_options,
+ test_conns, test_buffs,
+ dynamic_shared_memory_type);
+
+ /* Add any user-given setting overrides */
+ for (gnames = extra_guc_names, gvalues = extra_guc_values;
+ gnames != NULL; /* assume lists have the same length */
+ gnames = gnames->next, gvalues = gvalues->next)
+ {
+ appendPQExpBuffer(cmd, " -c %s=", gnames->str);
+ appendShellString(cmd, gvalues->str);
+ }
+
+ appendPQExpBuffer(cmd,
+ " < \"%s\" > \"%s\" 2>&1",
+ DEVNULL, DEVNULL);
+
+ fflush(NULL);
+ status = system(cmd->data);
+
+ destroyPQExpBuffer(cmd);
+
+ return (status == 0);
+}
+
+/*
+ * Calculate the default wal_size with a "pretty" unit.
+ */
+static char *
+pretty_wal_size(int segment_count)
+{
+ int sz = wal_segment_size_mb * segment_count;
+ char *result = pg_malloc(14);
+
+ if ((sz % 1024) == 0)
+ snprintf(result, 14, "%dGB", sz / 1024);
+ else
+ snprintf(result, 14, "%dMB", sz);
+
+ return result;
+}
+
+/*
+ * set up all the config files
+ */
+static void
+setup_config(void)
+{
+ char **conflines;
+ char repltok[MAXPGPATH];
+ char path[MAXPGPATH];
+ _stringlist *gnames,
+ *gvalues;
+
+ fputs(_("creating configuration files ... "), stdout);
+ fflush(stdout);
+
+ /* postgresql.conf */
+
+ conflines = readfile(conf_file);
+
+ snprintf(repltok, sizeof(repltok), "%d", n_connections);
+ conflines = replace_guc_value(conflines, "max_connections",
+ repltok, false);
+
+ if ((n_buffers * (BLCKSZ / 1024)) % 1024 == 0)
+ snprintf(repltok, sizeof(repltok), "%dMB",
+ (n_buffers * (BLCKSZ / 1024)) / 1024);
+ else
+ snprintf(repltok, sizeof(repltok), "%dkB",
+ n_buffers * (BLCKSZ / 1024));
+ conflines = replace_guc_value(conflines, "shared_buffers",
+ repltok, false);
+
+ conflines = replace_guc_value(conflines, "lc_messages",
+ lc_messages, false);
+
+ conflines = replace_guc_value(conflines, "lc_monetary",
+ lc_monetary, false);
+
+ conflines = replace_guc_value(conflines, "lc_numeric",
+ lc_numeric, false);
+
+ conflines = replace_guc_value(conflines, "lc_time",
+ lc_time, false);
+
+ switch (locale_date_order(lc_time))
+ {
+ case DATEORDER_YMD:
+ strcpy(repltok, "iso, ymd");
+ break;
+ case DATEORDER_DMY:
+ strcpy(repltok, "iso, dmy");
+ break;
+ case DATEORDER_MDY:
+ default:
+ strcpy(repltok, "iso, mdy");
+ break;
+ }
+ conflines = replace_guc_value(conflines, "datestyle",
+ repltok, false);
+
+ snprintf(repltok, sizeof(repltok), "pg_catalog.%s",
+ default_text_search_config);
+ conflines = replace_guc_value(conflines, "default_text_search_config",
+ repltok, false);
+
+ if (default_timezone)
+ {
+ conflines = replace_guc_value(conflines, "timezone",
+ default_timezone, false);
+ conflines = replace_guc_value(conflines, "log_timezone",
+ default_timezone, false);
+ }
+
+ conflines = replace_guc_value(conflines, "dynamic_shared_memory_type",
+ dynamic_shared_memory_type, false);
+
+ /* Caution: these depend on wal_segment_size_mb, they're not constants */
+ conflines = replace_guc_value(conflines, "min_wal_size",
+ pretty_wal_size(DEFAULT_MIN_WAL_SEGS), false);
+
+ conflines = replace_guc_value(conflines, "max_wal_size",
+ pretty_wal_size(DEFAULT_MAX_WAL_SEGS), false);
+
+ /*
+ * Fix up various entries to match the true compile-time defaults. Since
+ * these are indeed defaults, keep the postgresql.conf lines commented.
+ */
+ conflines = replace_guc_value(conflines, "unix_socket_directories",
+ DEFAULT_PGSOCKET_DIR, true);
+
+ conflines = replace_guc_value(conflines, "port",
+ DEF_PGPORT_STR, true);
+
+#if DEFAULT_BACKEND_FLUSH_AFTER > 0
+ snprintf(repltok, sizeof(repltok), "%dkB",
+ DEFAULT_BACKEND_FLUSH_AFTER * (BLCKSZ / 1024));
+ conflines = replace_guc_value(conflines, "backend_flush_after",
+ repltok, true);
+#endif
+
+#if DEFAULT_BGWRITER_FLUSH_AFTER > 0
+ snprintf(repltok, sizeof(repltok), "%dkB",
+ DEFAULT_BGWRITER_FLUSH_AFTER * (BLCKSZ / 1024));
+ conflines = replace_guc_value(conflines, "bgwriter_flush_after",
+ repltok, true);
+#endif
+
+#if DEFAULT_CHECKPOINT_FLUSH_AFTER > 0
+ snprintf(repltok, sizeof(repltok), "%dkB",
+ DEFAULT_CHECKPOINT_FLUSH_AFTER * (BLCKSZ / 1024));
+ conflines = replace_guc_value(conflines, "checkpoint_flush_after",
+ repltok, true);
+#endif
+
+#ifndef USE_PREFETCH
+ conflines = replace_guc_value(conflines, "effective_io_concurrency",
+ "0", true);
+#endif
+
+#ifdef WIN32
+ conflines = replace_guc_value(conflines, "update_process_title",
+ "off", true);
+#endif
+
+ /*
+ * Change password_encryption setting to md5 if md5 was chosen as an
+ * authentication method, unless scram-sha-256 was also chosen.
+ */
+ if ((strcmp(authmethodlocal, "md5") == 0 &&
+ strcmp(authmethodhost, "scram-sha-256") != 0) ||
+ (strcmp(authmethodhost, "md5") == 0 &&
+ strcmp(authmethodlocal, "scram-sha-256") != 0))
+ {
+ conflines = replace_guc_value(conflines, "password_encryption",
+ "md5", false);
+ }
+
+ /*
+ * If group access has been enabled for the cluster then it makes sense to
+ * ensure that the log files also allow group access. Otherwise a backup
+ * from a user in the group would fail if the log files were not
+ * relocated.
+ */
+ if (pg_dir_create_mode == PG_DIR_MODE_GROUP)
+ {
+ conflines = replace_guc_value(conflines, "log_file_mode",
+ "0640", false);
+ }
+
+ /*
+ * Now replace anything that's overridden via -c switches.
+ */
+ for (gnames = extra_guc_names, gvalues = extra_guc_values;
+ gnames != NULL; /* assume lists have the same length */
+ gnames = gnames->next, gvalues = gvalues->next)
+ {
+ conflines = replace_guc_value(conflines, gnames->str,
+ gvalues->str, false);
+ }
+
+ /* ... and write out the finished postgresql.conf file */
+ snprintf(path, sizeof(path), "%s/postgresql.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+
+ /* postgresql.auto.conf */
+
+ conflines = pg_malloc_array(char *, 3);
+ conflines[0] = pg_strdup("# Do not edit this file manually!\n");
+ conflines[1] = pg_strdup("# It will be overwritten by the ALTER SYSTEM command.\n");
+ conflines[2] = NULL;
+
+ sprintf(path, "%s/postgresql.auto.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+
+ /* pg_hba.conf */
+
+ conflines = readfile(hba_file);
+
+ conflines = replace_token(conflines, "@remove-line-for-nolocal@", "");
+
+
+ /*
+ * Probe to see if there is really any platform support for IPv6, and
+ * comment out the relevant pg_hba line if not. This avoids runtime
+ * warnings if getaddrinfo doesn't actually cope with IPv6. Particularly
+ * useful on Windows, where executables built on a machine with IPv6 may
+ * have to run on a machine without.
+ */
+ {
+ struct addrinfo *gai_result;
+ struct addrinfo hints;
+ int err = 0;
+
+#ifdef WIN32
+ /* need to call WSAStartup before calling getaddrinfo */
+ WSADATA wsaData;
+
+ err = WSAStartup(MAKEWORD(2, 2), &wsaData);
+#endif
+
+ /* for best results, this code should match parse_hba_line() */
+ hints.ai_flags = AI_NUMERICHOST;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = 0;
+ hints.ai_protocol = 0;
+ hints.ai_addrlen = 0;
+ hints.ai_canonname = NULL;
+ hints.ai_addr = NULL;
+ hints.ai_next = NULL;
+
+ if (err != 0 ||
+ getaddrinfo("::1", NULL, &hints, &gai_result) != 0)
+ {
+ conflines = replace_token(conflines,
+ "host all all ::1",
+ "#host all all ::1");
+ conflines = replace_token(conflines,
+ "host replication all ::1",
+ "#host replication all ::1");
+ }
+ }
+
+ /* Replace default authentication methods */
+ conflines = replace_token(conflines,
+ "@authmethodhost@",
+ authmethodhost);
+ conflines = replace_token(conflines,
+ "@authmethodlocal@",
+ authmethodlocal);
+
+ conflines = replace_token(conflines,
+ "@authcomment@",
+ (strcmp(authmethodlocal, "trust") == 0 || strcmp(authmethodhost, "trust") == 0) ? AUTHTRUST_WARNING : "");
+
+ snprintf(path, sizeof(path), "%s/pg_hba.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+
+ /* pg_ident.conf */
+
+ conflines = readfile(ident_file);
+
+ snprintf(path, sizeof(path), "%s/pg_ident.conf", pg_data);
+
+ writefile(path, conflines);
+ if (chmod(path, pg_file_create_mode) != 0)
+ pg_fatal("could not change permissions of \"%s\": %m", path);
+
+ check_ok();
+}
+
+
+/*
+ * run the BKI script in bootstrap mode to create template1
+ */
+static void
+bootstrap_template1(void)
+{
+ PG_CMD_DECL;
+ char **line;
+ char **bki_lines;
+ char headerline[MAXPGPATH];
+ char buf[64];
+
+ printf(_("running bootstrap script ... "));
+ fflush(stdout);
+
+ bki_lines = readfile(bki_file);
+
+ /* Check that bki file appears to be of the right version */
+
+ snprintf(headerline, sizeof(headerline), "# PostgreSQL %s\n",
+ PG_MAJORVERSION);
+
+ if (strcmp(headerline, *bki_lines) != 0)
+ {
+ pg_log_error("input file \"%s\" does not belong to PostgreSQL %s",
+ bki_file, PG_VERSION);
+ pg_log_error_hint("Specify the correct path using the option -L.");
+ exit(1);
+ }
+
+ /* Substitute for various symbols used in the BKI file */
+
+ sprintf(buf, "%d", NAMEDATALEN);
+ bki_lines = replace_token(bki_lines, "NAMEDATALEN", buf);
+
+ sprintf(buf, "%d", (int) sizeof(Pointer));
+ bki_lines = replace_token(bki_lines, "SIZEOF_POINTER", buf);
+
+ bki_lines = replace_token(bki_lines, "ALIGNOF_POINTER",
+ (sizeof(Pointer) == 4) ? "i" : "d");
+
+ bki_lines = replace_token(bki_lines, "FLOAT8PASSBYVAL",
+ FLOAT8PASSBYVAL ? "true" : "false");
+
+ bki_lines = replace_token(bki_lines, "POSTGRES",
+ escape_quotes_bki(username));
+
+ bki_lines = replace_token(bki_lines, "ENCODING",
+ encodingid_to_string(encodingid));
+
+ bki_lines = replace_token(bki_lines, "LC_COLLATE",
+ escape_quotes_bki(lc_collate));
+
+ bki_lines = replace_token(bki_lines, "LC_CTYPE",
+ escape_quotes_bki(lc_ctype));
+
+ bki_lines = replace_token(bki_lines, "ICU_LOCALE",
+ icu_locale ? escape_quotes_bki(icu_locale) : "_null_");
+
+ bki_lines = replace_token(bki_lines, "ICU_RULES",
+ icu_rules ? escape_quotes_bki(icu_rules) : "_null_");
+
+ sprintf(buf, "%c", locale_provider);
+ bki_lines = replace_token(bki_lines, "LOCALE_PROVIDER", buf);
+
+ /* Also ensure backend isn't confused by this environment var: */
+ unsetenv("PGCLIENTENCODING");
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" --boot -X %d %s %s %s %s",
+ backend_exec,
+ wal_segment_size_mb * (1024 * 1024),
+ data_checksums ? "-k" : "",
+ boot_options, extra_options,
+ debug ? "-d 5" : "");
+
+
+ PG_CMD_OPEN;
+
+ for (line = bki_lines; *line != NULL; line++)
+ {
+ PG_CMD_PUTS(*line);
+ free(*line);
+ }
+
+ PG_CMD_CLOSE;
+
+ free(bki_lines);
+
+ check_ok();
+}
+
+/*
+ * set up the shadow password table
+ */
+static void
+setup_auth(FILE *cmdfd)
+{
+ /*
+ * The authid table shouldn't be readable except through views, to ensure
+ * passwords are not publicly visible.
+ */
+ PG_CMD_PUTS("REVOKE ALL ON pg_authid FROM public;\n\n");
+
+ if (superuser_password)
+ PG_CMD_PRINTF("ALTER USER \"%s\" WITH PASSWORD E'%s';\n\n",
+ username, escape_quotes(superuser_password));
+}
+
+/*
+ * get the superuser password if required
+ */
+static void
+get_su_pwd(void)
+{
+ char *pwd1;
+
+ if (pwprompt)
+ {
+ /*
+ * Read password from terminal
+ */
+ char *pwd2;
+
+ printf("\n");
+ fflush(stdout);
+ pwd1 = simple_prompt("Enter new superuser password: ", false);
+ pwd2 = simple_prompt("Enter it again: ", false);
+ if (strcmp(pwd1, pwd2) != 0)
+ {
+ fprintf(stderr, _("Passwords didn't match.\n"));
+ exit(1);
+ }
+ free(pwd2);
+ }
+ else
+ {
+ /*
+ * Read password from file
+ *
+ * Ideally this should insist that the file not be world-readable.
+ * However, this option is mainly intended for use on Windows where
+ * file permissions may not exist at all, so we'll skip the paranoia
+ * for now.
+ */
+ FILE *pwf = fopen(pwfilename, "r");
+
+ if (!pwf)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ pwfilename);
+ pwd1 = pg_get_line(pwf, NULL);
+ if (!pwd1)
+ {
+ if (ferror(pwf))
+ pg_fatal("could not read password from file \"%s\": %m",
+ pwfilename);
+ else
+ pg_fatal("password file \"%s\" is empty",
+ pwfilename);
+ }
+ fclose(pwf);
+
+ (void) pg_strip_crlf(pwd1);
+ }
+
+ superuser_password = pwd1;
+}
+
+/*
+ * set up pg_depend
+ */
+static void
+setup_depend(FILE *cmdfd)
+{
+ /*
+ * Advance the OID counter so that subsequently-created objects aren't
+ * pinned.
+ */
+ PG_CMD_PUTS("SELECT pg_stop_making_pinned_objects();\n\n");
+}
+
+/*
+ * Run external file
+ */
+static void
+setup_run_file(FILE *cmdfd, const char *filename)
+{
+ char **lines;
+
+ lines = readfile(filename);
+
+ for (char **line = lines; *line != NULL; line++)
+ {
+ PG_CMD_PUTS(*line);
+ free(*line);
+ }
+
+ PG_CMD_PUTS("\n\n");
+
+ free(lines);
+}
+
+/*
+ * fill in extra description data
+ */
+static void
+setup_description(FILE *cmdfd)
+{
+ /* Create default descriptions for operator implementation functions */
+ PG_CMD_PUTS("WITH funcdescs AS ( "
+ "SELECT p.oid as p_oid, o.oid as o_oid, oprname "
+ "FROM pg_proc p JOIN pg_operator o ON oprcode = p.oid ) "
+ "INSERT INTO pg_description "
+ " SELECT p_oid, 'pg_proc'::regclass, 0, "
+ " 'implementation of ' || oprname || ' operator' "
+ " FROM funcdescs "
+ " WHERE NOT EXISTS (SELECT 1 FROM pg_description "
+ " WHERE objoid = p_oid AND classoid = 'pg_proc'::regclass) "
+ " AND NOT EXISTS (SELECT 1 FROM pg_description "
+ " WHERE objoid = o_oid AND classoid = 'pg_operator'::regclass"
+ " AND description LIKE 'deprecated%');\n\n");
+}
+
+/*
+ * populate pg_collation
+ */
+static void
+setup_collation(FILE *cmdfd)
+{
+ /*
+ * Set the collation version for collations defined in pg_collation.dat,
+ * but not the ones where we know that the collation behavior will never
+ * change.
+ */
+ PG_CMD_PUTS("UPDATE pg_collation SET collversion = pg_collation_actual_version(oid) WHERE collname = 'unicode';\n\n");
+
+ /* Import all collations we can find in the operating system */
+ PG_CMD_PUTS("SELECT pg_import_system_collations('pg_catalog');\n\n");
+}
+
+/*
+ * Set up privileges
+ *
+ * We mark most system catalogs as world-readable. We don't currently have
+ * to touch functions, languages, or databases, because their default
+ * permissions are OK.
+ *
+ * Some objects may require different permissions by default, so we
+ * make sure we don't overwrite privilege sets that have already been
+ * set (NOT NULL).
+ *
+ * Also populate pg_init_privs to save what the privileges are at init
+ * time. This is used by pg_dump to allow users to change privileges
+ * on catalog objects and to have those privilege changes preserved
+ * across dump/reload and pg_upgrade.
+ *
+ * Note that pg_init_privs is only for per-database objects and therefore
+ * we don't include databases or tablespaces.
+ */
+static void
+setup_privileges(FILE *cmdfd)
+{
+ PG_CMD_PRINTF("UPDATE pg_class "
+ " SET relacl = (SELECT array_agg(a.acl) FROM "
+ " (SELECT E'=r/\"%s\"' as acl "
+ " UNION SELECT unnest(pg_catalog.acldefault("
+ " CASE WHEN relkind = " CppAsString2(RELKIND_SEQUENCE) " THEN 's' "
+ " ELSE 'r' END::\"char\"," CppAsString2(BOOTSTRAP_SUPERUSERID) "::oid))"
+ " ) as a) "
+ " WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_SEQUENCE) ")"
+ " AND relacl IS NULL;\n\n",
+ escape_quotes(username));
+ PG_CMD_PUTS("GRANT USAGE ON SCHEMA pg_catalog, public TO PUBLIC;\n\n");
+ PG_CMD_PUTS("REVOKE ALL ON pg_largeobject FROM PUBLIC;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_class'),"
+ " 0,"
+ " relacl,"
+ " 'i'"
+ " FROM"
+ " pg_class"
+ " WHERE"
+ " relacl IS NOT NULL"
+ " AND relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_SEQUENCE) ");\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " pg_class.oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_class'),"
+ " pg_attribute.attnum,"
+ " pg_attribute.attacl,"
+ " 'i'"
+ " FROM"
+ " pg_class"
+ " JOIN pg_attribute ON (pg_class.oid = pg_attribute.attrelid)"
+ " WHERE"
+ " pg_attribute.attacl IS NOT NULL"
+ " AND pg_class.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_SEQUENCE) ");\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_proc'),"
+ " 0,"
+ " proacl,"
+ " 'i'"
+ " FROM"
+ " pg_proc"
+ " WHERE"
+ " proacl IS NOT NULL;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_type'),"
+ " 0,"
+ " typacl,"
+ " 'i'"
+ " FROM"
+ " pg_type"
+ " WHERE"
+ " typacl IS NOT NULL;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_language'),"
+ " 0,"
+ " lanacl,"
+ " 'i'"
+ " FROM"
+ " pg_language"
+ " WHERE"
+ " lanacl IS NOT NULL;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE "
+ " relname = 'pg_largeobject_metadata'),"
+ " 0,"
+ " lomacl,"
+ " 'i'"
+ " FROM"
+ " pg_largeobject_metadata"
+ " WHERE"
+ " lomacl IS NOT NULL;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE relname = 'pg_namespace'),"
+ " 0,"
+ " nspacl,"
+ " 'i'"
+ " FROM"
+ " pg_namespace"
+ " WHERE"
+ " nspacl IS NOT NULL;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class WHERE "
+ " relname = 'pg_foreign_data_wrapper'),"
+ " 0,"
+ " fdwacl,"
+ " 'i'"
+ " FROM"
+ " pg_foreign_data_wrapper"
+ " WHERE"
+ " fdwacl IS NOT NULL;\n\n");
+ PG_CMD_PUTS("INSERT INTO pg_init_privs "
+ " (objoid, classoid, objsubid, initprivs, privtype)"
+ " SELECT"
+ " oid,"
+ " (SELECT oid FROM pg_class "
+ " WHERE relname = 'pg_foreign_server'),"
+ " 0,"
+ " srvacl,"
+ " 'i'"
+ " FROM"
+ " pg_foreign_server"
+ " WHERE"
+ " srvacl IS NOT NULL;\n\n");
+}
+
+/*
+ * extract the strange version of version required for information schema
+ * (09.08.0007abc)
+ */
+static void
+set_info_version(void)
+{
+ char *letterversion;
+ long major = 0,
+ minor = 0,
+ micro = 0;
+ char *endptr;
+ char *vstr = pg_strdup(PG_VERSION);
+ char *ptr;
+
+ ptr = vstr + (strlen(vstr) - 1);
+ while (ptr != vstr && (*ptr < '0' || *ptr > '9'))
+ ptr--;
+ letterversion = ptr + 1;
+ major = strtol(vstr, &endptr, 10);
+ if (*endptr)
+ minor = strtol(endptr + 1, &endptr, 10);
+ if (*endptr)
+ micro = strtol(endptr + 1, &endptr, 10);
+ snprintf(infoversion, sizeof(infoversion), "%02ld.%02ld.%04ld%s",
+ major, minor, micro, letterversion);
+}
+
+/*
+ * load info schema and populate from features file
+ */
+static void
+setup_schema(FILE *cmdfd)
+{
+ setup_run_file(cmdfd, info_schema_file);
+
+ PG_CMD_PRINTF("UPDATE information_schema.sql_implementation_info "
+ " SET character_value = '%s' "
+ " WHERE implementation_info_name = 'DBMS VERSION';\n\n",
+ infoversion);
+
+ PG_CMD_PRINTF("COPY information_schema.sql_features "
+ " (feature_id, feature_name, sub_feature_id, "
+ " sub_feature_name, is_supported, comments) "
+ " FROM E'%s';\n\n",
+ escape_quotes(features_file));
+}
+
+/*
+ * load PL/pgSQL server-side language
+ */
+static void
+load_plpgsql(FILE *cmdfd)
+{
+ PG_CMD_PUTS("CREATE EXTENSION plpgsql;\n\n");
+}
+
+/*
+ * clean everything up in template1
+ */
+static void
+vacuum_db(FILE *cmdfd)
+{
+ /* Run analyze before VACUUM so the statistics are frozen. */
+ PG_CMD_PUTS("ANALYZE;\n\nVACUUM FREEZE;\n\n");
+}
+
+/*
+ * copy template1 to template0
+ */
+static void
+make_template0(FILE *cmdfd)
+{
+ /*
+ * pg_upgrade tries to preserve database OIDs across upgrades. It's smart
+ * enough to drop and recreate a conflicting database with the same name,
+ * but if the same OID were used for one system-created database in the
+ * old cluster and a different system-created database in the new cluster,
+ * it would fail. To avoid that, assign a fixed OID to template0 rather
+ * than letting the server choose one.
+ *
+ * (Note that, while the user could have dropped and recreated these
+ * objects in the old cluster, the problem scenario only exists if the OID
+ * that is in use in the old cluster is also used in the new cluster - and
+ * the new cluster should be the result of a fresh initdb.)
+ *
+ * We use "STRATEGY = file_copy" here because checkpoints during initdb
+ * are cheap. "STRATEGY = wal_log" would generate more WAL, which would be
+ * a little bit slower and make the new cluster a little bit bigger.
+ */
+ PG_CMD_PUTS("CREATE DATABASE template0 IS_TEMPLATE = true ALLOW_CONNECTIONS = false"
+ " OID = " CppAsString2(Template0DbOid)
+ " STRATEGY = file_copy;\n\n");
+
+ /*
+ * template0 shouldn't have any collation-dependent objects, so unset the
+ * collation version. This disables collation version checks when making
+ * a new database from it.
+ */
+ PG_CMD_PUTS("UPDATE pg_database SET datcollversion = NULL WHERE datname = 'template0';\n\n");
+
+ /*
+ * While we are here, do set the collation version on template1.
+ */
+ PG_CMD_PUTS("UPDATE pg_database SET datcollversion = pg_database_collation_actual_version(oid) WHERE datname = 'template1';\n\n");
+
+ /*
+ * Explicitly revoke public create-schema and create-temp-table privileges
+ * in template1 and template0; else the latter would be on by default
+ */
+ PG_CMD_PUTS("REVOKE CREATE,TEMPORARY ON DATABASE template1 FROM public;\n\n");
+ PG_CMD_PUTS("REVOKE CREATE,TEMPORARY ON DATABASE template0 FROM public;\n\n");
+
+ PG_CMD_PUTS("COMMENT ON DATABASE template0 IS 'unmodifiable empty database';\n\n");
+
+ /*
+ * Finally vacuum to clean up dead rows in pg_database
+ */
+ PG_CMD_PUTS("VACUUM pg_database;\n\n");
+}
+
+/*
+ * copy template1 to postgres
+ */
+static void
+make_postgres(FILE *cmdfd)
+{
+ /*
+ * Just as we did for template0, and for the same reasons, assign a fixed
+ * OID to postgres and select the file_copy strategy.
+ */
+ PG_CMD_PUTS("CREATE DATABASE postgres OID = " CppAsString2(PostgresDbOid)
+ " STRATEGY = file_copy;\n\n");
+ PG_CMD_PUTS("COMMENT ON DATABASE postgres IS 'default administrative connection database';\n\n");
+}
+
+/*
+ * signal handler in case we are interrupted.
+ *
+ * The Windows runtime docs at
+ * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/signal
+ * specifically forbid a number of things being done from a signal handler,
+ * including IO, memory allocation and system calls, and only allow jmpbuf
+ * if you are handling SIGFPE.
+ *
+ * I avoided doing the forbidden things by setting a flag instead of calling
+ * exit() directly.
+ *
+ * Also note the behaviour of Windows with SIGINT, which says this:
+ * SIGINT is not supported for any Win32 application. When a CTRL+C interrupt
+ * occurs, Win32 operating systems generate a new thread to specifically
+ * handle that interrupt. This can cause a single-thread application, such as
+ * one in UNIX, to become multithreaded and cause unexpected behavior.
+ *
+ * I have no idea how to handle this. (Strange they call UNIX an application!)
+ * So this will need some testing on Windows.
+ */
+static void
+trapsig(SIGNAL_ARGS)
+{
+ /* handle systems that reset the handler, like Windows (grr) */
+ pqsignal(postgres_signal_arg, trapsig);
+ caught_signal = true;
+}
+
+/*
+ * call exit() if we got a signal, or else output "ok".
+ */
+static void
+check_ok(void)
+{
+ if (caught_signal)
+ {
+ printf(_("caught signal\n"));
+ fflush(stdout);
+ exit(1);
+ }
+ else if (output_failed)
+ {
+ printf(_("could not write to child process: %s\n"),
+ strerror(output_errno));
+ fflush(stdout);
+ exit(1);
+ }
+ else
+ {
+ /* all seems well */
+ printf(_("ok\n"));
+ fflush(stdout);
+ }
+}
+
+/* Hack to suppress a warning about %x from some versions of gcc */
+static inline size_t
+my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm)
+{
+ return strftime(s, max, fmt, tm);
+}
+
+/*
+ * Determine likely date order from locale
+ */
+static int
+locale_date_order(const char *locale)
+{
+ struct tm testtime;
+ char buf[128];
+ char *posD;
+ char *posM;
+ char *posY;
+ char *save;
+ size_t res;
+ int result;
+
+ result = DATEORDER_MDY; /* default */
+
+ save = setlocale(LC_TIME, NULL);
+ if (!save)
+ return result;
+ save = pg_strdup(save);
+
+ setlocale(LC_TIME, locale);
+
+ memset(&testtime, 0, sizeof(testtime));
+ testtime.tm_mday = 22;
+ testtime.tm_mon = 10; /* November, should come out as "11" */
+ testtime.tm_year = 133; /* 2033 */
+
+ res = my_strftime(buf, sizeof(buf), "%x", &testtime);
+
+ setlocale(LC_TIME, save);
+ free(save);
+
+ if (res == 0)
+ return result;
+
+ posM = strstr(buf, "11");
+ posD = strstr(buf, "22");
+ posY = strstr(buf, "33");
+
+ if (!posM || !posD || !posY)
+ return result;
+
+ if (posY < posM && posM < posD)
+ result = DATEORDER_YMD;
+ else if (posD < posM)
+ result = DATEORDER_DMY;
+ else
+ result = DATEORDER_MDY;
+
+ return result;
+}
+
+/*
+ * Verify that locale name is valid for the locale category.
+ *
+ * If successful, and canonname isn't NULL, a malloc'd copy of the locale's
+ * canonical name is stored there. This is especially useful for figuring out
+ * what locale name "" means (ie, the environment value). (Actually,
+ * it seems that on most implementations that's the only thing it's good for;
+ * we could wish that setlocale gave back a canonically spelled version of
+ * the locale name, but typically it doesn't.)
+ *
+ * this should match the backend's check_locale() function
+ */
+static void
+check_locale_name(int category, const char *locale, char **canonname)
+{
+ char *save;
+ char *res;
+
+ if (canonname)
+ *canonname = NULL; /* in case of failure */
+
+ save = setlocale(category, NULL);
+ if (!save)
+ pg_fatal("setlocale() failed");
+
+ /* save may be pointing at a modifiable scratch variable, so copy it. */
+ save = pg_strdup(save);
+
+ /* for setlocale() call */
+ if (!locale)
+ locale = "";
+
+ /* set the locale with setlocale, to see if it accepts it. */
+ res = setlocale(category, locale);
+
+ /* save canonical name if requested. */
+ if (res && canonname)
+ *canonname = pg_strdup(res);
+
+ /* restore old value. */
+ if (!setlocale(category, save))
+ pg_fatal("failed to restore old locale \"%s\"", save);
+ free(save);
+
+ /* complain if locale wasn't valid */
+ if (res == NULL)
+ {
+ if (*locale)
+ {
+ pg_log_error("invalid locale name \"%s\"", locale);
+ pg_log_error_hint("If the locale name is specific to ICU, use --icu-locale.");
+ exit(1);
+ }
+ else
+ {
+ /*
+ * If no relevant switch was given on command line, locale is an
+ * empty string, which is not too helpful to report. Presumably
+ * setlocale() found something it did not like in the environment.
+ * Ideally we'd report the bad environment variable, but since
+ * setlocale's behavior is implementation-specific, it's hard to
+ * be sure what it didn't like. Print a safe generic message.
+ */
+ pg_fatal("invalid locale settings; check LANG and LC_* environment variables");
+ }
+ }
+}
+
+/*
+ * check if the chosen encoding matches the encoding required by the locale
+ *
+ * this should match the similar check in the backend createdb() function
+ */
+static bool
+check_locale_encoding(const char *locale, int user_enc)
+{
+ int locale_enc;
+
+ locale_enc = pg_get_encoding_from_locale(locale, true);
+
+ /* See notes in createdb() to understand these tests */
+ if (!(locale_enc == user_enc ||
+ locale_enc == PG_SQL_ASCII ||
+ locale_enc == -1 ||
+#ifdef WIN32
+ user_enc == PG_UTF8 ||
+#endif
+ user_enc == PG_SQL_ASCII))
+ {
+ pg_log_error("encoding mismatch");
+ pg_log_error_detail("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.",
+ pg_encoding_to_char(user_enc),
+ pg_encoding_to_char(locale_enc));
+ pg_log_error_hint("Rerun %s and either do not specify an encoding explicitly, "
+ "or choose a matching combination.",
+ progname);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * check if the chosen encoding matches is supported by ICU
+ *
+ * this should match the similar check in the backend createdb() function
+ */
+static bool
+check_icu_locale_encoding(int user_enc)
+{
+ if (!(is_encoding_supported_by_icu(user_enc)))
+ {
+ pg_log_error("encoding mismatch");
+ pg_log_error_detail("The encoding you selected (%s) is not supported with the ICU provider.",
+ pg_encoding_to_char(user_enc));
+ pg_log_error_hint("Rerun %s and either do not specify an encoding explicitly, "
+ "or choose a matching combination.",
+ progname);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Convert to canonical BCP47 language tag. Must be consistent with
+ * icu_language_tag().
+ */
+static char *
+icu_language_tag(const char *loc_str)
+{
+#ifdef USE_ICU
+ UErrorCode status;
+ char *langtag;
+ size_t buflen = 32; /* arbitrary starting buffer size */
+ const bool strict = true;
+
+ /*
+ * A BCP47 language tag doesn't have a clearly-defined upper limit (cf.
+ * RFC5646 section 4.4). Additionally, in older ICU versions,
+ * uloc_toLanguageTag() doesn't always return the ultimate length on the
+ * first call, necessitating a loop.
+ */
+ langtag = pg_malloc(buflen);
+ while (true)
+ {
+ status = U_ZERO_ERROR;
+ uloc_toLanguageTag(loc_str, langtag, buflen, strict, &status);
+
+ /* try again if the buffer is not large enough */
+ if (status == U_BUFFER_OVERFLOW_ERROR ||
+ status == U_STRING_NOT_TERMINATED_WARNING)
+ {
+ buflen = buflen * 2;
+ langtag = pg_realloc(langtag, buflen);
+ continue;
+ }
+
+ break;
+ }
+
+ if (U_FAILURE(status))
+ {
+ pg_free(langtag);
+
+ pg_fatal("could not convert locale name \"%s\" to language tag: %s",
+ loc_str, u_errorName(status));
+ }
+
+ return langtag;
+#else
+ pg_fatal("ICU is not supported in this build");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+/*
+ * Perform best-effort check that the locale is a valid one. Should be
+ * consistent with pg_locale.c, except that it doesn't need to open the
+ * collator (that will happen during post-bootstrap initialization).
+ */
+static void
+icu_validate_locale(const char *loc_str)
+{
+#ifdef USE_ICU
+ UErrorCode status;
+ char lang[ULOC_LANG_CAPACITY];
+ bool found = false;
+
+ /* validate that we can extract the language */
+ status = U_ZERO_ERROR;
+ uloc_getLanguage(loc_str, lang, ULOC_LANG_CAPACITY, &status);
+ if (U_FAILURE(status))
+ {
+ pg_fatal("could not get language from locale \"%s\": %s",
+ loc_str, u_errorName(status));
+ return;
+ }
+
+ /* check for special language name */
+ if (strcmp(lang, "") == 0 ||
+ strcmp(lang, "root") == 0 || strcmp(lang, "und") == 0)
+ found = true;
+
+ /* search for matching language within ICU */
+ for (int32_t i = 0; !found && i < uloc_countAvailable(); i++)
+ {
+ const char *otherloc = uloc_getAvailable(i);
+ char otherlang[ULOC_LANG_CAPACITY];
+
+ status = U_ZERO_ERROR;
+ uloc_getLanguage(otherloc, otherlang, ULOC_LANG_CAPACITY, &status);
+ if (U_FAILURE(status))
+ continue;
+
+ if (strcmp(lang, otherlang) == 0)
+ found = true;
+ }
+
+ if (!found)
+ pg_fatal("locale \"%s\" has unknown language \"%s\"",
+ loc_str, lang);
+#else
+ pg_fatal("ICU is not supported in this build");
+#endif
+}
+
+/*
+ * set up the locale variables
+ *
+ * assumes we have called setlocale(LC_ALL, "") -- see set_pglocale_pgservice
+ */
+static void
+setlocales(void)
+{
+ char *canonname;
+
+ /* set empty lc_* and iculocale values to locale config if set */
+
+ if (locale)
+ {
+ if (!lc_ctype)
+ lc_ctype = locale;
+ if (!lc_collate)
+ lc_collate = locale;
+ if (!lc_numeric)
+ lc_numeric = locale;
+ if (!lc_time)
+ lc_time = locale;
+ if (!lc_monetary)
+ lc_monetary = locale;
+ if (!lc_messages)
+ lc_messages = locale;
+ if (!icu_locale && locale_provider == COLLPROVIDER_ICU)
+ icu_locale = locale;
+ }
+
+ /*
+ * canonicalize locale names, and obtain any missing values from our
+ * current environment
+ */
+ check_locale_name(LC_CTYPE, lc_ctype, &canonname);
+ lc_ctype = canonname;
+ check_locale_name(LC_COLLATE, lc_collate, &canonname);
+ lc_collate = canonname;
+ check_locale_name(LC_NUMERIC, lc_numeric, &canonname);
+ lc_numeric = canonname;
+ check_locale_name(LC_TIME, lc_time, &canonname);
+ lc_time = canonname;
+ check_locale_name(LC_MONETARY, lc_monetary, &canonname);
+ lc_monetary = canonname;
+#if defined(LC_MESSAGES) && !defined(WIN32)
+ check_locale_name(LC_MESSAGES, lc_messages, &canonname);
+ lc_messages = canonname;
+#else
+ /* when LC_MESSAGES is not available, use the LC_CTYPE setting */
+ check_locale_name(LC_CTYPE, lc_messages, &canonname);
+ lc_messages = canonname;
+#endif
+
+ if (locale_provider == COLLPROVIDER_ICU)
+ {
+ char *langtag;
+
+ /* acquire default locale from the environment, if not specified */
+ if (icu_locale == NULL)
+ pg_fatal("ICU locale must be specified");
+
+ /* canonicalize to a language tag */
+ langtag = icu_language_tag(icu_locale);
+ printf(_("Using language tag \"%s\" for ICU locale \"%s\".\n"),
+ langtag, icu_locale);
+ pg_free(icu_locale);
+ icu_locale = langtag;
+
+ icu_validate_locale(icu_locale);
+
+ /*
+ * In supported builds, the ICU locale ID will be opened during
+ * post-bootstrap initialization, which will perform extra checks.
+ */
+#ifndef USE_ICU
+ pg_fatal("ICU is not supported in this build");
+#endif
+ }
+}
+
+/*
+ * print help text
+ */
+static void
+usage(const char *progname)
+{
+ printf(_("%s initializes a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -A, --auth=METHOD default authentication method for local connections\n"));
+ printf(_(" --auth-host=METHOD default authentication method for local TCP/IP connections\n"));
+ printf(_(" --auth-local=METHOD default authentication method for local-socket connections\n"));
+ printf(_(" [-D, --pgdata=]DATADIR location for this database cluster\n"));
+ printf(_(" -E, --encoding=ENCODING set default encoding for new databases\n"));
+ printf(_(" -g, --allow-group-access allow group read/execute on data directory\n"));
+ printf(_(" --icu-locale=LOCALE set ICU locale ID for new databases\n"));
+ printf(_(" --icu-rules=RULES set additional ICU collation rules for new databases\n"));
+ printf(_(" -k, --data-checksums use data page checksums\n"));
+ printf(_(" --locale=LOCALE set default locale for new databases\n"));
+ printf(_(" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+ " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+ " set default locale in the respective category for\n"
+ " new databases (default taken from environment)\n"));
+ printf(_(" --no-locale equivalent to --locale=C\n"));
+ printf(_(" --locale-provider={libc|icu}\n"
+ " set default locale provider for new databases\n"));
+ printf(_(" --pwfile=FILE read password for the new superuser from file\n"));
+ printf(_(" -T, --text-search-config=CFG\n"
+ " default text search configuration\n"));
+ printf(_(" -U, --username=NAME database superuser name\n"));
+ printf(_(" -W, --pwprompt prompt for a password for the new superuser\n"));
+ printf(_(" -X, --waldir=WALDIR location for the write-ahead log directory\n"));
+ printf(_(" --wal-segsize=SIZE size of WAL segments, in megabytes\n"));
+ printf(_("\nLess commonly used options:\n"));
+ printf(_(" -c, --set NAME=VALUE override default setting for server parameter\n"));
+ printf(_(" -d, --debug generate lots of debugging output\n"));
+ printf(_(" --discard-caches set debug_discard_caches=1\n"));
+ printf(_(" -L DIRECTORY where to find the input files\n"));
+ printf(_(" -n, --no-clean do not clean up after errors\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" --no-instructions do not print instructions for next steps\n"));
+ printf(_(" -s, --show show internal settings\n"));
+ printf(_(" -S, --sync-only only sync database files to disk, then exit\n"));
+ printf(_("\nOther options:\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf the data directory is not specified, the environment variable PGDATA\n"
+ "is used.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+static void
+check_authmethod_unspecified(const char **authmethod)
+{
+ if (*authmethod == NULL)
+ {
+ authwarning = true;
+ *authmethod = "trust";
+ }
+}
+
+static void
+check_authmethod_valid(const char *authmethod, const char *const *valid_methods, const char *conntype)
+{
+ const char *const *p;
+
+ for (p = valid_methods; *p; p++)
+ {
+ if (strcmp(authmethod, *p) == 0)
+ return;
+ /* with space = param */
+ if (strchr(authmethod, ' '))
+ if (strncmp(authmethod, *p, (authmethod - strchr(authmethod, ' '))) == 0)
+ return;
+ }
+
+ pg_fatal("invalid authentication method \"%s\" for \"%s\" connections",
+ authmethod, conntype);
+}
+
+static void
+check_need_password(const char *authmethodlocal, const char *authmethodhost)
+{
+ if ((strcmp(authmethodlocal, "md5") == 0 ||
+ strcmp(authmethodlocal, "password") == 0 ||
+ strcmp(authmethodlocal, "scram-sha-256") == 0) &&
+ (strcmp(authmethodhost, "md5") == 0 ||
+ strcmp(authmethodhost, "password") == 0 ||
+ strcmp(authmethodhost, "scram-sha-256") == 0) &&
+ !(pwprompt || pwfilename))
+ pg_fatal("must specify a password for the superuser to enable password authentication");
+}
+
+
+void
+setup_pgdata(void)
+{
+ char *pgdata_get_env;
+
+ if (!pg_data)
+ {
+ pgdata_get_env = getenv("PGDATA");
+ if (pgdata_get_env && strlen(pgdata_get_env))
+ {
+ /* PGDATA found */
+ pg_data = pg_strdup(pgdata_get_env);
+ }
+ else
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("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.");
+ exit(1);
+ }
+ }
+
+ pgdata_native = pg_strdup(pg_data);
+ canonicalize_path(pg_data);
+
+ /*
+ * we have to set PGDATA for postgres rather than pass it on the command
+ * line to avoid dumb quoting problems on Windows, and we would especially
+ * need quotes otherwise on Windows because paths there are most likely to
+ * have embedded spaces.
+ */
+ if (setenv("PGDATA", pg_data, 1) != 0)
+ pg_fatal("could not set environment");
+}
+
+
+void
+setup_bin_paths(const char *argv0)
+{
+ int ret;
+
+ if ((ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
+ backend_exec)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "postgres", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "postgres", full_path, progname);
+ }
+
+ /* store binary directory */
+ strcpy(bin_path, backend_exec);
+ *last_dir_separator(bin_path) = '\0';
+ canonicalize_path(bin_path);
+
+ if (!share_path)
+ {
+ share_path = pg_malloc(MAXPGPATH);
+ get_share_path(backend_exec, share_path);
+ }
+ else if (!is_absolute_path(share_path))
+ pg_fatal("input file location must be an absolute path");
+
+ canonicalize_path(share_path);
+}
+
+void
+setup_locale_encoding(void)
+{
+ setlocales();
+
+ if (locale_provider == COLLPROVIDER_LIBC &&
+ strcmp(lc_ctype, lc_collate) == 0 &&
+ strcmp(lc_ctype, lc_time) == 0 &&
+ strcmp(lc_ctype, lc_numeric) == 0 &&
+ strcmp(lc_ctype, lc_monetary) == 0 &&
+ strcmp(lc_ctype, lc_messages) == 0 &&
+ (!icu_locale || strcmp(lc_ctype, icu_locale) == 0))
+ printf(_("The database cluster will be initialized with locale \"%s\".\n"), lc_ctype);
+ else
+ {
+ printf(_("The database cluster will be initialized with this locale configuration:\n"));
+ printf(_(" provider: %s\n"), collprovider_name(locale_provider));
+ if (icu_locale)
+ printf(_(" ICU locale: %s\n"), icu_locale);
+ printf(_(" LC_COLLATE: %s\n"
+ " LC_CTYPE: %s\n"
+ " LC_MESSAGES: %s\n"
+ " LC_MONETARY: %s\n"
+ " LC_NUMERIC: %s\n"
+ " LC_TIME: %s\n"),
+ lc_collate,
+ lc_ctype,
+ lc_messages,
+ lc_monetary,
+ lc_numeric,
+ lc_time);
+ }
+
+ if (!encoding)
+ {
+ int ctype_enc;
+
+ ctype_enc = pg_get_encoding_from_locale(lc_ctype, true);
+
+ /*
+ * If ctype_enc=SQL_ASCII, it's compatible with any encoding. ICU does
+ * not support SQL_ASCII, so select UTF-8 instead.
+ */
+ if (locale_provider == COLLPROVIDER_ICU && ctype_enc == PG_SQL_ASCII)
+ ctype_enc = PG_UTF8;
+
+ if (ctype_enc == -1)
+ {
+ /* Couldn't recognize the locale's codeset */
+ pg_log_error("could not find suitable encoding for locale \"%s\"",
+ lc_ctype);
+ pg_log_error_hint("Rerun %s with the -E option.", progname);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ else if (!pg_valid_server_encoding_id(ctype_enc))
+ {
+ /*
+ * We recognized it, but it's not a legal server encoding. On
+ * Windows, UTF-8 works with any locale, so we can fall back to
+ * UTF-8.
+ */
+#ifdef WIN32
+ encodingid = PG_UTF8;
+ printf(_("Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+ "The default database encoding will be set to \"%s\" instead.\n"),
+ pg_encoding_to_char(ctype_enc),
+ pg_encoding_to_char(encodingid));
+#else
+ pg_log_error("locale \"%s\" requires unsupported encoding \"%s\"",
+ lc_ctype, pg_encoding_to_char(ctype_enc));
+ pg_log_error_detail("Encoding \"%s\" is not allowed as a server-side encoding.",
+ pg_encoding_to_char(ctype_enc));
+ pg_log_error_hint("Rerun %s with a different locale selection.",
+ progname);
+ exit(1);
+#endif
+ }
+ else
+ {
+ encodingid = ctype_enc;
+ printf(_("The default database encoding has accordingly been set to \"%s\".\n"),
+ pg_encoding_to_char(encodingid));
+ }
+ }
+ else
+ encodingid = get_encoding_id(encoding);
+
+ if (!check_locale_encoding(lc_ctype, encodingid) ||
+ !check_locale_encoding(lc_collate, encodingid))
+ exit(1); /* check_locale_encoding printed the error */
+
+ if (locale_provider == COLLPROVIDER_ICU &&
+ !check_icu_locale_encoding(encodingid))
+ exit(1);
+}
+
+
+void
+setup_data_file_paths(void)
+{
+ set_input(&bki_file, "postgres.bki");
+ set_input(&hba_file, "pg_hba.conf.sample");
+ set_input(&ident_file, "pg_ident.conf.sample");
+ set_input(&conf_file, "postgresql.conf.sample");
+ set_input(&dictionary_file, "snowball_create.sql");
+ set_input(&info_schema_file, "information_schema.sql");
+ set_input(&features_file, "sql_features.txt");
+ set_input(&system_constraints_file, "system_constraints.sql");
+ set_input(&system_functions_file, "system_functions.sql");
+ set_input(&system_views_file, "system_views.sql");
+
+ if (show_setting || debug)
+ {
+ fprintf(stderr,
+ "VERSION=%s\n"
+ "PGDATA=%s\nshare_path=%s\nPGPATH=%s\n"
+ "POSTGRES_SUPERUSERNAME=%s\nPOSTGRES_BKI=%s\n"
+ "POSTGRESQL_CONF_SAMPLE=%s\n"
+ "PG_HBA_SAMPLE=%s\nPG_IDENT_SAMPLE=%s\n",
+ PG_VERSION,
+ pg_data, share_path, bin_path,
+ username, bki_file,
+ conf_file,
+ hba_file, ident_file);
+ if (show_setting)
+ exit(0);
+ }
+
+ check_input(bki_file);
+ check_input(hba_file);
+ check_input(ident_file);
+ check_input(conf_file);
+ check_input(dictionary_file);
+ check_input(info_schema_file);
+ check_input(features_file);
+ check_input(system_constraints_file);
+ check_input(system_functions_file);
+ check_input(system_views_file);
+}
+
+
+void
+setup_text_search(void)
+{
+ if (!default_text_search_config)
+ {
+ default_text_search_config = find_matching_ts_config(lc_ctype);
+ if (!default_text_search_config)
+ {
+ pg_log_info("could not find suitable text search configuration for locale \"%s\"",
+ lc_ctype);
+ default_text_search_config = "simple";
+ }
+ }
+ else
+ {
+ const char *checkmatch = find_matching_ts_config(lc_ctype);
+
+ if (checkmatch == NULL)
+ {
+ pg_log_warning("suitable text search configuration for locale \"%s\" is unknown",
+ lc_ctype);
+ }
+ else if (strcmp(checkmatch, default_text_search_config) != 0)
+ {
+ pg_log_warning("specified text search configuration \"%s\" might not match locale \"%s\"",
+ default_text_search_config, lc_ctype);
+ }
+ }
+
+ printf(_("The default text search configuration will be set to \"%s\".\n"),
+ default_text_search_config);
+}
+
+
+void
+setup_signals(void)
+{
+ /* some of these are not valid on Windows */
+#ifdef SIGHUP
+ pqsignal(SIGHUP, trapsig);
+#endif
+#ifdef SIGINT
+ pqsignal(SIGINT, trapsig);
+#endif
+#ifdef SIGQUIT
+ pqsignal(SIGQUIT, trapsig);
+#endif
+#ifdef SIGTERM
+ pqsignal(SIGTERM, trapsig);
+#endif
+
+ /* Ignore SIGPIPE when writing to backend, so we can clean up */
+#ifdef SIGPIPE
+ pqsignal(SIGPIPE, SIG_IGN);
+#endif
+
+ /* Prevent SIGSYS so we can probe for kernel calls that might not work */
+#ifdef SIGSYS
+ pqsignal(SIGSYS, SIG_IGN);
+#endif
+}
+
+
+void
+create_data_directory(void)
+{
+ int ret;
+
+ switch ((ret = pg_check_dir(pg_data)))
+ {
+ case 0:
+ /* PGDATA not there, must create it */
+ printf(_("creating directory %s ... "),
+ pg_data);
+ fflush(stdout);
+
+ if (pg_mkdir_p(pg_data, pg_dir_create_mode) != 0)
+ pg_fatal("could not create directory \"%s\": %m", pg_data);
+ else
+ check_ok();
+
+ made_new_pgdata = true;
+ break;
+
+ case 1:
+ /* Present but empty, fix permissions and use it */
+ printf(_("fixing permissions on existing directory %s ... "),
+ pg_data);
+ fflush(stdout);
+
+ if (chmod(pg_data, pg_dir_create_mode) != 0)
+ pg_fatal("could not change permissions of directory \"%s\": %m",
+ pg_data);
+ else
+ check_ok();
+
+ found_existing_pgdata = true;
+ break;
+
+ case 2:
+ case 3:
+ case 4:
+ /* Present and not empty */
+ pg_log_error("directory \"%s\" exists but is not empty", pg_data);
+ if (ret != 4)
+ warn_on_mount_point(ret);
+ else
+ pg_log_error_hint("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\".",
+ pg_data, progname, pg_data);
+ exit(1); /* no further message needed */
+
+ default:
+ /* Trouble accessing directory */
+ pg_fatal("could not access directory \"%s\": %m", pg_data);
+ }
+}
+
+
+/* Create WAL directory, and symlink if required */
+void
+create_xlog_or_symlink(void)
+{
+ char *subdirloc;
+
+ /* form name of the place for the subdirectory or symlink */
+ subdirloc = psprintf("%s/pg_wal", pg_data);
+
+ if (xlog_dir)
+ {
+ int ret;
+
+ /* clean up xlog directory name, check it's absolute */
+ canonicalize_path(xlog_dir);
+ if (!is_absolute_path(xlog_dir))
+ pg_fatal("WAL directory location must be an absolute path");
+
+ /* check if the specified xlog directory exists/is empty */
+ switch ((ret = pg_check_dir(xlog_dir)))
+ {
+ case 0:
+ /* xlog directory not there, must create it */
+ printf(_("creating directory %s ... "),
+ xlog_dir);
+ fflush(stdout);
+
+ if (pg_mkdir_p(xlog_dir, pg_dir_create_mode) != 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ xlog_dir);
+ else
+ check_ok();
+
+ made_new_xlogdir = true;
+ break;
+
+ case 1:
+ /* Present but empty, fix permissions and use it */
+ printf(_("fixing permissions on existing directory %s ... "),
+ xlog_dir);
+ fflush(stdout);
+
+ if (chmod(xlog_dir, pg_dir_create_mode) != 0)
+ pg_fatal("could not change permissions of directory \"%s\": %m",
+ xlog_dir);
+ else
+ check_ok();
+
+ found_existing_xlogdir = true;
+ break;
+
+ case 2:
+ case 3:
+ case 4:
+ /* Present and not empty */
+ pg_log_error("directory \"%s\" exists but is not empty", xlog_dir);
+ if (ret != 4)
+ warn_on_mount_point(ret);
+ else
+ pg_log_error_hint("If you want to store the WAL there, either remove or empty the directory \"%s\".",
+ xlog_dir);
+ exit(1);
+
+ default:
+ /* Trouble accessing directory */
+ pg_fatal("could not access directory \"%s\": %m", xlog_dir);
+ }
+
+ if (symlink(xlog_dir, subdirloc) != 0)
+ pg_fatal("could not create symbolic link \"%s\": %m",
+ subdirloc);
+ }
+ else
+ {
+ /* Without -X option, just make the subdirectory normally */
+ if (mkdir(subdirloc, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ subdirloc);
+ }
+
+ free(subdirloc);
+}
+
+
+void
+warn_on_mount_point(int error)
+{
+ if (error == 2)
+ pg_log_error_detail("It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.");
+ else if (error == 3)
+ pg_log_error_detail("It contains a lost+found directory, perhaps due to it being a mount point.");
+
+ pg_log_error_hint("Using a mount point directly as the data directory is not recommended.\n"
+ "Create a subdirectory under the mount point.");
+}
+
+
+void
+initialize_data_directory(void)
+{
+ PG_CMD_DECL;
+ int i;
+
+ setup_signals();
+
+ /*
+ * Set mask based on requested PGDATA permissions. pg_mode_mask, and
+ * friends like pg_dir_create_mode, are set to owner-only by default and
+ * then updated if -g is passed in by calling SetDataDirectoryCreatePerm()
+ * when parsing our options (see above).
+ */
+ umask(pg_mode_mask);
+
+ create_data_directory();
+
+ create_xlog_or_symlink();
+
+ /* Create required subdirectories (other than pg_wal) */
+ printf(_("creating subdirectories ... "));
+ fflush(stdout);
+
+ for (i = 0; i < lengthof(subdirs); i++)
+ {
+ char *path;
+
+ path = psprintf("%s/%s", pg_data, subdirs[i]);
+
+ /*
+ * The parent directory already exists, so we only need mkdir() not
+ * pg_mkdir_p() here, which avoids some failure modes; cf bug #13853.
+ */
+ if (mkdir(path, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", path);
+
+ free(path);
+ }
+
+ check_ok();
+
+ /* Top level PG_VERSION is checked by bootstrapper, so make it first */
+ write_version_file(NULL);
+
+ /* Select suitable configuration settings */
+ set_null_conf();
+ test_config_settings();
+
+ /* Now create all the text config files */
+ setup_config();
+
+ /* Bootstrap template1 */
+ bootstrap_template1();
+
+ /*
+ * Make the per-database PG_VERSION for template1 only after init'ing it
+ */
+ write_version_file("base/1");
+
+ /*
+ * Create the stuff we don't need to use bootstrap mode for, using a
+ * backend running in simple standalone mode.
+ */
+ fputs(_("performing post-bootstrap initialization ... "), stdout);
+ fflush(stdout);
+
+ snprintf(cmd, sizeof(cmd),
+ "\"%s\" %s %s template1 >%s",
+ backend_exec, backend_options, extra_options,
+ DEVNULL);
+
+ PG_CMD_OPEN;
+
+ setup_auth(cmdfd);
+
+ setup_run_file(cmdfd, system_constraints_file);
+
+ setup_run_file(cmdfd, system_functions_file);
+
+ setup_depend(cmdfd);
+
+ /*
+ * Note that no objects created after setup_depend() will be "pinned".
+ * They are all droppable at the whim of the DBA.
+ */
+
+ setup_run_file(cmdfd, system_views_file);
+
+ setup_description(cmdfd);
+
+ setup_collation(cmdfd);
+
+ setup_run_file(cmdfd, dictionary_file);
+
+ setup_privileges(cmdfd);
+
+ setup_schema(cmdfd);
+
+ load_plpgsql(cmdfd);
+
+ vacuum_db(cmdfd);
+
+ make_template0(cmdfd);
+
+ make_postgres(cmdfd);
+
+ PG_CMD_CLOSE;
+
+ check_ok();
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"pgdata", required_argument, NULL, 'D'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"locale", required_argument, NULL, 1},
+ {"lc-collate", required_argument, NULL, 2},
+ {"lc-ctype", required_argument, NULL, 3},
+ {"lc-monetary", required_argument, NULL, 4},
+ {"lc-numeric", required_argument, NULL, 5},
+ {"lc-time", required_argument, NULL, 6},
+ {"lc-messages", required_argument, NULL, 7},
+ {"no-locale", no_argument, NULL, 8},
+ {"text-search-config", required_argument, NULL, 'T'},
+ {"auth", required_argument, NULL, 'A'},
+ {"auth-local", required_argument, NULL, 10},
+ {"auth-host", required_argument, NULL, 11},
+ {"pwprompt", no_argument, NULL, 'W'},
+ {"pwfile", required_argument, NULL, 9},
+ {"username", required_argument, NULL, 'U'},
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"debug", no_argument, NULL, 'd'},
+ {"show", no_argument, NULL, 's'},
+ {"noclean", no_argument, NULL, 'n'}, /* for backwards compatibility */
+ {"no-clean", no_argument, NULL, 'n'},
+ {"nosync", no_argument, NULL, 'N'}, /* for backwards compatibility */
+ {"no-sync", no_argument, NULL, 'N'},
+ {"no-instructions", no_argument, NULL, 13},
+ {"set", required_argument, NULL, 'c'},
+ {"sync-only", no_argument, NULL, 'S'},
+ {"waldir", required_argument, NULL, 'X'},
+ {"wal-segsize", required_argument, NULL, 12},
+ {"data-checksums", no_argument, NULL, 'k'},
+ {"allow-group-access", no_argument, NULL, 'g'},
+ {"discard-caches", no_argument, NULL, 14},
+ {"locale-provider", required_argument, NULL, 15},
+ {"icu-locale", required_argument, NULL, 16},
+ {"icu-rules", required_argument, NULL, 17},
+ {NULL, 0, NULL, 0}
+ };
+
+ /*
+ * options with no short version return a low integer, the rest return
+ * their short version value
+ */
+ int c;
+ int option_index;
+ char *effective_user;
+ PQExpBuffer start_db_cmd;
+ char pg_ctl_path[MAXPGPATH];
+
+ /*
+ * Ensure that buffering behavior of stdout matches what it is in
+ * interactive usage (at least on most platforms). This prevents
+ * unexpected output ordering when, eg, output is redirected to a file.
+ * POSIX says we must do this before any other usage of these files.
+ */
+ setvbuf(stdout, NULL, PG_IOLBF, 0);
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("initdb (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /* process command-line options */
+
+ while ((c = getopt_long(argc, argv, "A:c:dD:E:gkL:nNsST:U:WX:",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'A':
+ authmethodlocal = authmethodhost = pg_strdup(optarg);
+
+ /*
+ * When ident is specified, use peer for local connections.
+ * Mirrored, when peer is specified, use ident for TCP/IP
+ * connections.
+ */
+ if (strcmp(authmethodhost, "ident") == 0)
+ authmethodlocal = "peer";
+ else if (strcmp(authmethodlocal, "peer") == 0)
+ authmethodhost = "ident";
+ break;
+ case 10:
+ authmethodlocal = pg_strdup(optarg);
+ break;
+ case 11:
+ authmethodhost = pg_strdup(optarg);
+ break;
+ case 'c':
+ {
+ char *buf = pg_strdup(optarg);
+ char *equals = strchr(buf, '=');
+
+ if (!equals)
+ {
+ pg_log_error("-c %s requires a value", buf);
+ pg_log_error_hint("Try \"%s --help\" for more information.",
+ progname);
+ exit(1);
+ }
+ *equals++ = '\0'; /* terminate variable name */
+ add_stringlist_item(&extra_guc_names, buf);
+ add_stringlist_item(&extra_guc_values, equals);
+ pfree(buf);
+ }
+ break;
+ case 'D':
+ pg_data = pg_strdup(optarg);
+ break;
+ case 'E':
+ encoding = pg_strdup(optarg);
+ break;
+ case 'W':
+ pwprompt = true;
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'd':
+ debug = true;
+ printf(_("Running in debug mode.\n"));
+ break;
+ case 'n':
+ noclean = true;
+ printf(_("Running in no-clean mode. Mistakes will not be cleaned up.\n"));
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'S':
+ sync_only = true;
+ break;
+ case 'k':
+ data_checksums = true;
+ break;
+ case 'L':
+ share_path = pg_strdup(optarg);
+ break;
+ case 1:
+ locale = pg_strdup(optarg);
+ break;
+ case 2:
+ lc_collate = pg_strdup(optarg);
+ break;
+ case 3:
+ lc_ctype = pg_strdup(optarg);
+ break;
+ case 4:
+ lc_monetary = pg_strdup(optarg);
+ break;
+ case 5:
+ lc_numeric = pg_strdup(optarg);
+ break;
+ case 6:
+ lc_time = pg_strdup(optarg);
+ break;
+ case 7:
+ lc_messages = pg_strdup(optarg);
+ break;
+ case 8:
+ locale = "C";
+ break;
+ case 9:
+ pwfilename = pg_strdup(optarg);
+ break;
+ case 's':
+ show_setting = true;
+ break;
+ case 'T':
+ default_text_search_config = pg_strdup(optarg);
+ break;
+ case 'X':
+ xlog_dir = pg_strdup(optarg);
+ break;
+ case 12:
+ str_wal_segment_size_mb = pg_strdup(optarg);
+ break;
+ case 13:
+ noinstructions = true;
+ break;
+ case 'g':
+ SetDataDirectoryCreatePerm(PG_DIR_MODE_GROUP);
+ break;
+ case 14:
+ extra_options = psprintf("%s %s",
+ extra_options,
+ "-c debug_discard_caches=1");
+ break;
+ case 15:
+ if (strcmp(optarg, "icu") == 0)
+ locale_provider = COLLPROVIDER_ICU;
+ else if (strcmp(optarg, "libc") == 0)
+ locale_provider = COLLPROVIDER_LIBC;
+ else
+ pg_fatal("unrecognized locale provider: %s", optarg);
+ break;
+ case 16:
+ icu_locale = pg_strdup(optarg);
+ break;
+ case 17:
+ icu_rules = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+
+ /*
+ * Non-option argument specifies data directory as long as it wasn't
+ * already specified with -D / --pgdata
+ */
+ if (optind < argc && !pg_data)
+ {
+ pg_data = pg_strdup(argv[optind]);
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (icu_locale && locale_provider != COLLPROVIDER_ICU)
+ pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen",
+ "--icu-locale", "icu");
+
+ if (icu_rules && locale_provider != COLLPROVIDER_ICU)
+ pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen",
+ "--icu-rules", "icu");
+
+ atexit(cleanup_directories_atexit);
+
+ /* If we only need to fsync, just do it and exit */
+ if (sync_only)
+ {
+ setup_pgdata();
+
+ /* must check that directory is readable */
+ if (pg_check_dir(pg_data) <= 0)
+ pg_fatal("could not access directory \"%s\": %m", pg_data);
+
+ fputs(_("syncing data to disk ... "), stdout);
+ fflush(stdout);
+ fsync_pgdata(pg_data, PG_VERSION_NUM);
+ check_ok();
+ return 0;
+ }
+
+ if (pwprompt && pwfilename)
+ pg_fatal("password prompt and password file cannot be specified together");
+
+ check_authmethod_unspecified(&authmethodlocal);
+ check_authmethod_unspecified(&authmethodhost);
+
+ check_authmethod_valid(authmethodlocal, auth_methods_local, "local");
+ check_authmethod_valid(authmethodhost, auth_methods_host, "host");
+
+ check_need_password(authmethodlocal, authmethodhost);
+
+ /* set wal segment size */
+ if (str_wal_segment_size_mb == NULL)
+ wal_segment_size_mb = (DEFAULT_XLOG_SEG_SIZE) / (1024 * 1024);
+ else
+ {
+ char *endptr;
+
+ /* check that the argument is a number */
+ wal_segment_size_mb = strtol(str_wal_segment_size_mb, &endptr, 10);
+
+ /* verify that wal segment size is valid */
+ if (endptr == str_wal_segment_size_mb || *endptr != '\0')
+ pg_fatal("argument of --wal-segsize must be a number");
+ if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024))
+ pg_fatal("argument of --wal-segsize must be a power of two between 1 and 1024");
+ }
+
+ get_restricted_token();
+
+ setup_pgdata();
+
+ setup_bin_paths(argv[0]);
+
+ effective_user = get_id();
+ if (!username)
+ username = effective_user;
+
+ if (strncmp(username, "pg_", 3) == 0)
+ pg_fatal("superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"", username);
+
+ printf(_("The files belonging to this database system will be owned "
+ "by user \"%s\".\n"
+ "This user must also own the server process.\n\n"),
+ effective_user);
+
+ set_info_version();
+
+ setup_data_file_paths();
+
+ setup_locale_encoding();
+
+ setup_text_search();
+
+ printf("\n");
+
+ if (data_checksums)
+ printf(_("Data page checksums are enabled.\n"));
+ else
+ printf(_("Data page checksums are disabled.\n"));
+
+ if (pwprompt || pwfilename)
+ get_su_pwd();
+
+ printf("\n");
+
+ initialize_data_directory();
+
+ if (do_sync)
+ {
+ fputs(_("syncing data to disk ... "), stdout);
+ fflush(stdout);
+ fsync_pgdata(pg_data, PG_VERSION_NUM);
+ check_ok();
+ }
+ else
+ printf(_("\nSync to disk skipped.\nThe data directory might become corrupt if the operating system crashes.\n"));
+
+ if (authwarning)
+ {
+ printf("\n");
+ pg_log_warning("enabling \"trust\" authentication for local connections");
+ pg_log_warning_hint("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.");
+ }
+
+ if (!noinstructions)
+ {
+ /*
+ * Build up a shell command to tell the user how to start the server
+ */
+ start_db_cmd = createPQExpBuffer();
+
+ /* Get directory specification used to start initdb ... */
+ strlcpy(pg_ctl_path, argv[0], sizeof(pg_ctl_path));
+ canonicalize_path(pg_ctl_path);
+ get_parent_directory(pg_ctl_path);
+ /* ... and tag on pg_ctl instead */
+ join_path_components(pg_ctl_path, pg_ctl_path, "pg_ctl");
+
+ /* Convert the path to use native separators */
+ make_native_path(pg_ctl_path);
+
+ /* path to pg_ctl, properly quoted */
+ appendShellString(start_db_cmd, pg_ctl_path);
+
+ /* add -D switch, with properly quoted data directory */
+ appendPQExpBufferStr(start_db_cmd, " -D ");
+ appendShellString(start_db_cmd, pgdata_native);
+
+ /* add suggested -l switch and "start" command */
+ /* translator: This is a placeholder in a shell command. */
+ appendPQExpBuffer(start_db_cmd, " -l %s start", _("logfile"));
+
+ printf(_("\nSuccess. You can now start the database server using:\n\n"
+ " %s\n\n"),
+ start_db_cmd->data);
+
+ destroyPQExpBuffer(start_db_cmd);
+ }
+
+
+ success = true;
+ return 0;
+}
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
new file mode 100644
index 0000000..4974363
--- /dev/null
+++ b/src/bin/initdb/meson.build
@@ -0,0 +1,38 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+initdb_sources = files(
+ 'findtimezone.c',
+ 'initdb.c'
+)
+
+initdb_sources += timezone_localtime_source
+
+#fixme: reimplement libpq_pgport logic
+
+if host_system == 'windows'
+ initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'initdb',
+ '--FILEDESC', 'initdb - initialize a new database cluster',])
+endif
+
+initdb = executable('initdb',
+ initdb_sources,
+ include_directories: [timezone_inc],
+ dependencies: [frontend_code, libpq, icu, icu_i18n],
+ kwargs: default_bin_args,
+)
+bin_targets += initdb
+
+tests += {
+ 'name': 'initdb',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_initdb.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/initdb/nls.mk b/src/bin/initdb/nls.mk
new file mode 100644
index 0000000..80af642
--- /dev/null
+++ b/src/bin/initdb/nls.mk
@@ -0,0 +1,16 @@
+# src/bin/initdb/nls.mk
+CATALOG_NAME = initdb
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ findtimezone.c \
+ initdb.c \
+ ../../common/exec.c \
+ ../../common/fe_memutils.c \
+ ../../common/file_utils.c \
+ ../../common/pgfnames.c \
+ ../../common/restricted_token.c \
+ ../../common/rmtree.c \
+ ../../common/username.c \
+ ../../common/wait_error.c \
+ ../../port/dirmod.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/initdb/po/LINGUAS b/src/bin/initdb/po/LINGUAS
new file mode 100644
index 0000000..fb4e1ca
--- /dev/null
+++ b/src/bin/initdb/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/initdb/po/cs.po b/src/bin/initdb/po/cs.po
new file mode 100644
index 0000000..b31d414
--- /dev/null
+++ b/src/bin/initdb/po/cs.po
@@ -0,0 +1,1162 @@
+# Czech translation of initdb
+#
+# Karel Žák, 2004.
+# Zdeněk Kotala, 2009, 2011, 2012, 2013.
+# Tomáš Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2020-10-31 21:46+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "chyba: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "varování: "
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze Äíst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze pÅ™eÄíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+#: initdb.c:325
+#, c-format
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/file_utils.c:79 ../../common/file_utils.c:181
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "nelze získat informace o souboru \"%s\": %m"
+
+#: ../../common/file_utils.c:158 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: ../../common/file_utils.c:192 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze Äíst z adresáře \"%s\": %m"
+
+#: ../../common/file_utils.c:224 ../../common/file_utils.c:283
+#: ../../common/file_utils.c:357
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: ../../common/file_utils.c:295 ../../common/file_utils.c:365
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "nelze provést fsync souboru \"%s\": %m"
+
+#: ../../common/file_utils.c:375
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "soubor \"%s\" nelze přejmenovat na \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "nelze zavřít adresář \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+#| msgid "could not load library \"%s\": %s"
+msgid "could not load library \"%s\": error code %lu"
+msgstr "nelze naÄíst knihovnu \"%s\": kód chyby %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+#| msgid "cannot create restricted tokens on this platform"
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "na této platformě nelze vytvářet vyhrazené tokeny: kód chyby %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "nelze otevřít token procesu: chybový kód %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "nelze alokovat SIDs: chybový kód %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "nelze vytvořit vyhrazený token: chybový kód %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "nelze nastartovat proces pro příkaz \"%s\": chybový kód %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "nelze znovu spustit s vyhrazeným tokenem: chybový kód %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "nelze získat návratový kód z podprovesu: chybový kód %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "nelze získat informace o souboru nebo adresáři \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "nelze smazat soubor nebo adresář \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nelze urÄit efektivní user ID: %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "uživatel neexistuje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "vyhledání uživatelského jména selhalo: chybový kód %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skonÄil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukonÄen vyjímkou 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukonÄen signálem %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skonÄil s nerozponaným stavem %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "nelze nastavit propojení \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "nelze najít funkci pro \"%s\": %s\n"
+
+#: initdb.c:481 initdb.c:1505
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "nelze otevřít soubor \"%s\" pro Ätení: %m"
+
+#: initdb.c:536 initdb.c:846 initdb.c:872
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "nelze otevřít soubor \"%s\" pro zápis: %m"
+
+#: initdb.c:543 initdb.c:550 initdb.c:852 initdb.c:877
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "nelze zapsat soubor \"%s\": %m"
+
+#: initdb.c:568
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "nelze spustit příkaz \"%s\": %m"
+
+#: initdb.c:586
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "odstraňuji datový adresář \"%s\""
+
+#: initdb.c:588
+#, c-format
+msgid "failed to remove data directory"
+msgstr "selhalo odstranění datového adresáře"
+
+#: initdb.c:592
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "odstraňuji obsah datového adresáře \"%s\""
+
+#: initdb.c:595
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "selhalo odstranění obsahu datového adresáře"
+
+#: initdb.c:600
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "odstraňuji WAL adresář \"%s\""
+
+#: initdb.c:602
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "selhalo odstranění WAL adresáře"
+
+#: initdb.c:606
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "odstraňuji obsah WAL adresáře \"%s\""
+
+#: initdb.c:608
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "selhalo odstranění obsahu WAL adresáře"
+
+#: initdb.c:615
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "datový adresář \"%s\" nebyl na žádost uživatele odstraněn"
+
+#: initdb.c:619
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL adresář \"%s\" nebyl na žádost uživatele odstraněn"
+
+#: initdb.c:637
+#, c-format
+msgid "cannot be run as root"
+msgstr "nelze spouštět jako root"
+
+#: initdb.c:639
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"Prosím přihlaste se jako (neprivilegovaný) uživatel, který bude vlastníkem\n"
+"serverového procesu (například pomocí příkazu \"su\").\n"
+
+#: initdb.c:672
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" není platný název kódování znaků"
+
+#: initdb.c:805
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "soubor \"%s\" neexistuje"
+
+#: initdb.c:807 initdb.c:814 initdb.c:823
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"To znamená, že vaše instalace je poškozena, nebo jste\n"
+"zadal chybný adresář v parametru -L při spuštění.\n"
+
+#: initdb.c:812
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "nelze přistupit k souboru \"%s\": %m"
+
+#: initdb.c:821
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "soubor \"%s\" není běžný soubor"
+
+#: initdb.c:966
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "vybírám implementaci dynamické sdílené paměti ... "
+
+#: initdb.c:975
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "vybírám implicitní nastavení max_connections ... "
+
+#: initdb.c:1006
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "vybírám implicitní nastavení shared_buffers ... "
+
+#: initdb.c:1040
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "vybírám implicitní Äasovou zónu ... "
+
+#: initdb.c:1074
+msgid "creating configuration files ... "
+msgstr "vytvářím konfiguraÄní soubory ... "
+
+#: initdb.c:1227 initdb.c:1246 initdb.c:1332 initdb.c:1347
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "nelze změnit práva pro \"%s\": %m"
+
+#: initdb.c:1369
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "spouštím bootstrap script ... "
+
+#: initdb.c:1381
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "vstupní soubor \"%s\" nenáleží PostgreSQL %s"
+
+#: initdb.c:1384
+#, c-format
+msgid "Check your installation or specify the correct path using the option -L.\n"
+msgstr "Zkontrolujte vaši instalaci nebo zadejte platnou cestu pomocí parametru -L.\n"
+
+#: initdb.c:1482
+msgid "Enter new superuser password: "
+msgstr "Zadejte nové heslo pro superuživatele: "
+
+#: initdb.c:1483
+msgid "Enter it again: "
+msgstr "Zadejte ho znovu: "
+
+#: initdb.c:1486
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Hesla nesouhlasí.\n"
+
+#: initdb.c:1512
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "nemohu pÅ™eÄíst heslo ze souboru \"%s\": %m"
+
+#: initdb.c:1515
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "soubor s hesly \"%s\" je prázdný"
+
+#: initdb.c:2043
+#, c-format
+msgid "caught signal\n"
+msgstr "signál obdržen\n"
+
+#: initdb.c:2049
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "nemohu zapsat do potomka: %s\n"
+
+#: initdb.c:2057
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2147
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() selhalo"
+
+#: initdb.c:2168
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "selhala obnova staré locale \"%s\""
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "neplatný název národního nastavení (locale) \"%s\""
+
+#: initdb.c:2188
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "neplatné nastavení locale; zkontrolujte LANG a LC_* proměnné prostředí"
+
+#: initdb.c:2215
+#, c-format
+msgid "encoding mismatch"
+msgstr "nesouhlasí kódování znaků"
+
+#: initdb.c:2217
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"Vybrané kódování znaků (%s) a kódování použité vybraným\n"
+"národním nastavením (%s) si neodpovídají. To může vést k neoÄekávanému\n"
+"chování různých funkcí pro manipulaci s řetězci. Pro opravu této situace\n"
+"spusÅ¥te znovu %s a buÄ nespecifikujte kódování znaků explicitnÄ›, nebo\n"
+"vyberte takovou kombinaci, která si odpovídá.\n"
+
+#: initdb.c:2289
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inicializuji PostgreSQL klastr\n"
+"\n"
+
+#: initdb.c:2290
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: initdb.c:2291
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [DATAADR]\n"
+
+#: initdb.c:2292
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe:\n"
+
+#: initdb.c:2293
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METODA výchozí autentizaÄní metoda pro lokální spojení\n"
+
+#: initdb.c:2294
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD výchozí autentikaÄní metoda pro lokální TCP/IP spojení\n"
+
+#: initdb.c:2295
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD výchozí autentikaÄní metoda pro spojení pro lokální socket\n"
+
+#: initdb.c:2296
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATAADR umístění tohoto databázového klastru\n"
+
+#: initdb.c:2297
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=KÓDOVÃNà nastavení výchozího kódování pro nové databáze\n"
+
+#: initdb.c:2298
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access povolit Ätení/spouÅ¡tÄ›ní pro skupinu na datovém adresáři\n"
+
+#: initdb.c:2299
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE nastavení implicitního národního nastavení pro novou databázi\n"
+
+#: initdb.c:2300
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" nastaví implicitní národním nastavení\n"
+" v příslušných kategoriích (výchozí hodnoty se \n"
+" vezmou z nastavení prostředí)\n"
+
+#: initdb.c:2304
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale ekvivalent --locale=C\n"
+
+#: initdb.c:2305
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=SOUBOR naÄti heslo pro nového superuživatele ze souboru\n"
+
+#: initdb.c:2306
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" implicitní configurace fulltextového vyhledávání\n"
+
+#: initdb.c:2308
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=JMÉNO jméno databázového superuživatele\n"
+
+#: initdb.c:2309
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt zeptej se na heslo pro nového superuživatele\n"
+
+#: initdb.c:2310
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR umístÄ›ní adresáře s transakÄním logem\n"
+
+#: initdb.c:2311
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE velikost WAL segmentů, v megabytech\n"
+
+#: initdb.c:2312
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"MénÄ› Äasto používané pÅ™epínaÄe:\n"
+
+#: initdb.c:2313
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug generuj spoustu ladicích informací\n"
+
+#: initdb.c:2314
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums použij kontrolní souÄty datových stránek\n"
+
+#: initdb.c:2315
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY kde se nalézají vstupní soubory\n"
+
+#: initdb.c:2316
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean neuklízet po chybách\n"
+
+#: initdb.c:2317
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync neÄekat na bezpeÄné zapsání zmÄ›n na disk\n"
+
+#: initdb.c:2318
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show ukaž interní nastavení\n"
+
+#: initdb.c:2319
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr " -S, --sync-only pouze provést sync datového adresáře\n"
+
+#: initdb.c:2320
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Ostatní pÅ™epínaÄe:\n"
+
+#: initdb.c:2321
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypiÅ¡ informace o verzi, potom skonÄi\n"
+
+#: initdb.c:2322
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukaž tuto nápovÄ›du, potom skonÄi\n"
+
+#: initdb.c:2323
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Pokud není specifikován datový adresář, použije se proměnná\n"
+"prostředí PGDATA.\n"
+
+#: initdb.c:2325
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: initdb.c:2326
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: initdb.c:2354
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "neplatná autentikaÄní metoda \"%s\" pro \"%s\" spojení"
+
+#: initdb.c:2370
+#, c-format
+msgid "must specify a password for the superuser to enable %s authentication"
+msgstr "musíte zadat heslo superuživatele pro použití autentizace typu %s"
+
+#: initdb.c:2397
+#, c-format
+msgid "no data directory specified"
+msgstr "není specifikován datový adresář"
+
+#: initdb.c:2399
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"Musíte zadat adresář, ve kterém se bude nacházet tato databáze.\n"
+"UÄiňte tak buÄ použitím pÅ™epínaÄe -D nebo nastavením promÄ›nné\n"
+"prostředí PGDATA.\n"
+
+#: initdb.c:2434
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+"adresáři jako \"%s\".\n"
+"Zkontrolujte vaši instalaci."
+
+#: initdb.c:2439
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" byl nalezen pomocí \"%s\",\n"
+"ale nebyl ve stejné verzi jako %s.\n"
+"Zkontrolujte vaši instalaci."
+
+#: initdb.c:2458
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "cesta k umístění vstupního souboru musí být absolutní"
+
+#: initdb.c:2475
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Databázový klastr bude inicializován s locale %s.\n"
+
+#: initdb.c:2478
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"Databázový klastr bude inicializován s národním nastavením\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2502
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "nemohu najít vhodné kódování pro locale \"%s\""
+
+#: initdb.c:2504
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "SpusÅ¥te znovu %s s pÅ™epínaÄem -E.\n"
+
+#: initdb.c:2505 initdb.c:3127 initdb.c:3148
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: initdb.c:2518
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Kódování %s vyplývající z locale není povoleno jako kódování na serveru.\n"
+"Implicitní kódování databáze bude nastaveno na %s.\n"
+
+#: initdb.c:2523
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "locale \"%s\" vyžaduje nepodporované kódování \"%s\""
+
+#: initdb.c:2526
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"Kódování %s není povoleno jako kódování na serveru.\n"
+"Pusťte znovu %s s jiným nastavením locale.\n"
+
+#: initdb.c:2535
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Výchozí kódování pro databáze bylo odpovídajícím způsobem nastaveno na %s.\n"
+
+#: initdb.c:2597
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "nemohu najít vhodnou konfiguraci fulltextového vyhledávání \"%s\""
+
+#: initdb.c:2608
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "vhodná konfigurace fulltextového vyhledávání pro locale \"%s\" není známa"
+
+#: initdb.c:2613
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "zvolená konfigurace fulltextového vyhledávání \"%s\" nemusí souhlasit s locale \"%s\""
+
+#: initdb.c:2618
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Implicitní konfigurace fulltextového vyhledávání bude nastavena na \"%s\".\n"
+
+#: initdb.c:2662 initdb.c:2744
+#, c-format
+msgid "creating directory %s ... "
+msgstr "vytvářím adresář %s ... "
+
+#: initdb.c:2668 initdb.c:2750 initdb.c:2815 initdb.c:2877
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "nelze vytvořit adresář \"%s\": %m"
+
+#: initdb.c:2679 initdb.c:2762
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "opravuji oprávnění pro existující adresář %s ... "
+
+#: initdb.c:2685 initdb.c:2768
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "nelze změnit práva adresáře \"%s\": %m"
+
+#: initdb.c:2699 initdb.c:2782
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "adresář \"%s\" existuje, ale není prázdný"
+
+#: initdb.c:2704
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"Pokud chcete v tomto adresáři inicializovat databázi, odstraňte nebo\n"
+"vyprázdněte adresář \"%s\" nebo spusťte %s\n"
+"s argumentem jiným než \"%s\".\n"
+
+#: initdb.c:2712 initdb.c:2794 initdb.c:3163
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "nelze přístoupit k adresáři \"%s\": %m"
+
+#: initdb.c:2735
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "cesta k umístění WAL adresáře musí být absolutní"
+
+#: initdb.c:2787
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory\n"
+"\"%s\".\n"
+msgstr ""
+"Pokud v tomto adresáři chcete ukládat transakÄní log, odstraňte nebo\n"
+"vyprázdněte adresář \"%s\".\n"
+
+#: initdb.c:2801
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "nelze vytvořit symbolický odkaz na \"%s\": %m"
+
+#: initdb.c:2806
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "na této platformě nejsou podporovány symbolické linky"
+
+#: initdb.c:2830
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n"
+msgstr "Obsahuje neviditelný soubor / soubor s teÄkou na zaÄátku názvu, možná proto že se jedná o mount point.\n"
+
+#: initdb.c:2833
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr "Obsahuje lost+found adresář, možná proto že se jedná o mount point.\n"
+
+#: initdb.c:2836
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"Použití mount pointu přímo jako datového adresáře se nedoporuÄuje.\n"
+"Vytvořte v mount pointu podadresář.\n"
+
+#: initdb.c:2862
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "vytvářím adresáře ... "
+
+#: initdb.c:2908
+msgid "performing post-bootstrap initialization ... "
+msgstr "provádím post-bootstrap inicializaci ... "
+
+#: initdb.c:3065
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Běžím v ladicím režimu.\n"
+
+#: initdb.c:3069
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Běžím v režimu \"no-clean\". Chybné kroky nebudou uklizeny.\n"
+
+#: initdb.c:3146
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: initdb.c:3167 initdb.c:3256
+msgid "syncing data to disk ... "
+msgstr "zapisuji data na disk ... "
+
+#: initdb.c:3176
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "dotaz na heslo a soubor s heslem nemohou být vyžadovány najednou"
+
+#: initdb.c:3201
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argument pro --wal-segsize musí být Äíslo"
+
+#: initdb.c:3206
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argument pro --wal-segsize musí být mocnina 2 mezi 1 a 1024"
+
+#: initdb.c:3223
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "superuživatelské jméno \"%s\" není povoleno; názvy rolí nemohou zaÄínat \"pg_\""
+
+#: initdb.c:3227
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Soubory patřící k této databázi budou vlastněny uživatelem \"%s\".\n"
+"Tento uživatel musí být také vlastníkem serverového procesu.\n"
+"\n"
+
+#: initdb.c:3243
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Kontrolní souÄty datových stránek jsou zapnuty.\n"
+
+#: initdb.c:3245
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Kontrolní souÄty datových stránek jsou vypnuty.\n"
+
+#: initdb.c:3262
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Zápis na disk pÅ™eskoÄen.\n"
+"Datový adresář může být v případÄ› pádu operaÄního systému poÅ¡kozený.\n"
+
+#: initdb.c:3267
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "povoluji \"trust\" autentizaÄní metodu pro lokální spojení"
+
+#: initdb.c:3268
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"Toto můžete změnit upravením pg_hba.conf nebo použitím volby -A,\n"
+"nebo --auth-local a --auth-host, při dalším spuštění initdb.\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3293
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3295
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Povedlo se. Můžete zaÄít používat databázový server spuÅ¡tÄ›ním:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze Äíst symbolický link \"%s\""
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: nelze provést stat souboru \"%s\": %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : nelze otevřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: nelze naÄíst adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\": %s\n"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "nelze otevřít adresář \"%s\": %s\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukonÄen signálem %s"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: nedostatek paměti\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\" pro Ätení: %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: nelze zapsat do souboru \"%s\": %s\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s: nelze vykonat příkaz \"%s\": %s\n"
+
+#~ msgid "%s: failed to restore old locale \"%s\"\n"
+#~ msgstr "%s: selhala obnova původní locale \"%s\"\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: nelze vytvořít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: nelze vytvořit symbolický link \"%s\": %s\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: odstraňuji adresář s transakÄním logem \"%s\"\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: selhalo odstraňení adresáře s transakÄním logem\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: odstraňuji obsah adresáře s transakÄním logem \"%s\"\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: selhalo odstranÄ›ní obsahu adresáře s transakÄním logem\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s: adresář s transakÄním logem \"%s\" nebyl na žádost uživatele odstranÄ›n\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: nelze získat informace o aktualním uživateli: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: nelze získat jméno aktuálního uživatele: %s\n"
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "vytvářím databázi template1 v %s/base/1 ... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "inicializuji pg_authid ... "
+
+#~ msgid "setting password ... "
+#~ msgstr "nastavuji heslo ... "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "inicializuji závislosti ... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "vytvářím systémové pohledy ... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "nahrávám popisy systémových objektů ... "
+
+#~ msgid "creating collations ... "
+#~ msgstr "vytvářím collations ... "
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s: jméno locale je příliš dlouhé, přeskakuji: %s\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s: jméno locale obsahuje ne-ASCII znaky, přeskakuji: %s\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Nebylo nalezené žádné použitelné systémové nárovní nastavení (locales).\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Pro více detailů použijte volbu \"--debug\".\n"
+
+#~ msgid "not supported on this platform\n"
+#~ msgstr "na této platformě není podporováno\n"
+
+#~ msgid "creating conversions ... "
+#~ msgstr "vytvářím konverze ... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "vytvářím adresáře ... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "nastavuji oprávnění pro vestavěné objekty ... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "vytvářím informaÄní schéma ... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "naÄítám PL/pgSQL jazyk ... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "pouštím VACUUM na databázi template1 ... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "kopíruji template1 do template0 ... "
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "kopíruji template1 do postgres ... "
+
+#~ msgid "Using the top-level directory of a mount point is not recommended.\n"
+#~ msgstr "Použití top-level adresáře mount pointu se nedoporuÄuje.\n"
+
+#~ msgid "%s: could not determine valid short version string\n"
+#~ msgstr "%s: nemohu zjistit platné krátké oznaÄení verze\n"
+
+#~ msgid "%s: The password file was not generated. Please report this problem.\n"
+#~ msgstr "%s: Soubor s hesly nebyl vytvořen. Prosíme oznamte tento problém tvůrcům.\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Program \"postgres\" byl nalezen pomocí \"%s\",\n"
+#~ "ale nebyl ve stejné verzi jako %s.\n"
+#~ "Zkontrolujte vaši instalaci."
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Program \"postgres\" je vyžadován aplikací %s, ale nebyl nalezen ve\n"
+#~ "stejném adresáři jako \"%s\".\n"
+#~ "Zkontrolujte vaši instalaci."
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/initdb/po/de.po b/src/bin/initdb/po/de.po
new file mode 100644
index 0000000..9e066fe
--- /dev/null
+++ b/src/bin/initdb/po/de.po
@@ -0,0 +1,1065 @@
+# German message translation file for initdb.
+# Peter Eisentraut <peter@eisentraut.org>, 2003 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-29 23:20+0000\n"
+"PO-Revision-Date: 2023-08-30 08:08+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ungültige Programmdatei »%s«: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "konnte Programmdatei »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, c-format
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht fsyncen: %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht löschen: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "Benutzer existiert nicht"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "konnte Junction für »%s« nicht erzeugen: %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "konnte Junction für »%s« nicht ermitteln: %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "konnte Datei »%s« nicht zum Schreiben öffnen: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "konnte Befehl »%s« nicht ausführen: %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "entferne Datenverzeichnis »%s«"
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "konnte Datenverzeichnis nicht entfernen"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "entferne Inhalt des Datenverzeichnisses »%s«"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "entferne WAL-Verzeichnis »%s«"
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "konnte WAL-Verzeichnis nicht entfernen"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "kann nicht als root ausgeführt werden"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer ein, der Eigentümer des Serverprozesses sein soll."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "»%s« ist keine gültige Serverkodierung"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "Datei »%s« existiert nicht"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Das könnte bedeuten, dass Ihre Installation fehlerhaft ist oder dass Sie das falsche Verzeichnis mit der Kommandozeilenoption -L angegeben haben."
+
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "konnte nicht auf Datei »%s« zugreifen: %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "Datei »%s« ist keine normale Datei"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "wähle Implementierung von dynamischem Shared Memory ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "wähle Vorgabewert für max_connections ... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "wähle Vorgabewert für shared_buffers ... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "wähle Vorgabewert für Zeitzone ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "erzeuge Konfigurationsdateien ... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "konnte Zugriffsrechte von »%s« nicht ändern: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "führe Bootstrap-Skript aus ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "Eingabedatei »%s« gehört nicht zu PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Geben Sie den korrekten Pfad mit der Option -L an."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Geben Sie das neue Superuser-Passwort ein: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Geben Sie es noch einmal ein: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Passwörter stimmten nicht überein.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "konnte Passwort nicht aus Datei »%s« lesen: %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "Passwortdatei »%s« ist leer"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "Signal abgefangen\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "konnte nicht an Kindprozess schreiben: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() fehlgeschlagen"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "konnte alte Locale »%s« nicht wiederherstellen"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ungültiger Locale-Name: »%s«"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Wenn der Locale-Name nur für ICU gültig ist, verwenden Sie --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ungültige Locale-Einstellungen; prüfen Sie die Umgebungsvariablen LANG und LC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "unpassende Kodierungen"
+
+#: initdb.c:2204
+#, c-format
+msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions."
+msgstr "Die von Ihnen gewählte Kodierung (%s) und die von der gewählten Locale verwendete Kodierung (%s) passen nicht zu einander. Das würde in verschiedenen Zeichenkettenfunktionen zu Fehlverhalten führen."
+
+#: initdb.c:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Starten Sie %s erneut und geben Sie entweder keine Kodierung explizit an oder wählen Sie eine passende Kombination."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Die von Ihnen gewählte Kodierung (%s) wird vom ICU-Provider nicht unterstützt."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "konnte Locale-Namen »%s« nicht in Sprach-Tag umwandeln: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU wird in dieser Installation nicht unterstützt"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "konnte Sprache nicht aus Locale »%s« ermitteln: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "Locale »%s« hat unbekannte Sprache »%s«"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU-Locale muss angegeben werden"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "Verwende Sprach-Tag »%s« für ICU-Locale »%s«.\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s initialisiert einen PostgreSQL-Datenbankcluster.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHODE vorgegebene Authentifizierungsmethode für lokale Verbindungen\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=METHODE vorgegebene Authentifizierungsmethode für lokale\n"
+" TCP/IP-Verbindungen\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=METHODE vorgegebene Authentifizierungsmethode für Verbindungen\n"
+" auf lokalen Sockets\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATENVERZ Datenverzeichnis für diesen Datenbankcluster\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=KODIERUNG setze Standardkodierung für neue Datenbanken\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access Lese- und Ausführungsrechte am Datenverzeichnis\n"
+" für Gruppe setzen\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE setze ICU-Locale-ID für neue Datenbanken\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr ""
+" --icu-rules=REGELN setze zusätzliche ICU-Sortierfolgenregeln für neue\n"
+" Datenbanken\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums Datenseitenprüfsummen verwenden\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE setze Standardlocale für neue Datenbanken\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" setze Standardlocale in der jeweiligen Kategorie\n"
+" für neue Datenbanken (Voreinstellung aus der\n"
+" Umgebung entnommen)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale entspricht --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" setze Standard-Locale-Provider für neue Datenbanken\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=DATEI lese Passwort des neuen Superusers aus Datei\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=KFG\n"
+" Standardtextsuchekonfiguration\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME Datenbank-Superusername\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt frage nach Passwort für neuen Superuser\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabyte\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Weniger häufig verwendete Optionen:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=WERT Voreinstellung für Serverparameter setzen\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug erzeuge eine Menge Debug-Ausgaben\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_caches=1 setzen\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L VERZEICHNIS wo sind die Eingabedateien zu finden\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n"
+
+#: initdb.c:2461
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: initdb.c:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions Anleitung für nächste Schritte nicht ausgeben\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show zeige interne Einstellungen\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr ""
+" -S, --sync-only nur Datenbankdateien auf Festplatte synchronisieren,\n"
+" dann beenden\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Weitere Optionen:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, dann wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "ungültige Authentifizierungsmethode »%s« für »%s«-Verbindungen"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "Superuser-Passwort muss angegeben werden um Passwortauthentifizierung einzuschalten"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: initdb.c:2533
+#, c-format
+msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA."
+msgstr "Sie müssen das Verzeichnis angeben, wo dieses Datenbanksystem abgelegt werden soll. Machen Sie dies entweder mit der Kommandozeilenoption -D oder mit der Umgebungsvariable PGDATA."
+
+#: initdb.c:2550
+#, c-format
+msgid "could not set environment"
+msgstr "konnte Umgebung nicht setzen"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden"
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "Eingabedatei muss absoluten Pfad haben"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Der Datenbankcluster wird mit der Locale »%s« initialisiert werden.\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Der Datenbankcluster wird mit dieser Locale-Konfiguration initialisiert werden:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " Provider: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU-Locale: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "konnte keine passende Kodierung für Locale »%s« finden"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Führen Sie %s erneut mit der Option -E aus."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Die von der Locale gesetzte Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt.\n"
+"Die Standarddatenbankkodierung wird stattdessen auf »%s« gesetzt.\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "Locale »%s« benötigt nicht unterstützte Kodierung »%s«"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Starten Sie %s erneut mit einer anderen Locale-Wahl."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Die Standarddatenbankkodierung wurde entsprechend auf »%s« gesetzt.\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "konnte keine passende Textsuchekonfiguration für Locale »%s« finden"
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "passende Textsuchekonfiguration für Locale »%s« ist unbekannt"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "angegebene Textsuchekonfiguration »%s« passt möglicherweise nicht zur Locale »%s«"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Die Standardtextsuchekonfiguration wird auf »%s« gesetzt.\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "erzeuge Verzeichnis %s ... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "berichtige Zugriffsrechte des bestehenden Verzeichnisses %s ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "konnte Rechte des Verzeichnisses »%s« nicht ändern: %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "Verzeichnis »%s« existiert aber ist nicht leer"
+
+#: initdb.c:2840
+#, c-format
+msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"."
+msgstr "Wenn Sie ein neues Datenbanksystem erzeugen wollen, entfernen oder leeren Sie das Verzeichnis »%s« or führen Sie %s mit einem anderen Argument als »%s« aus."
+
+#: initdb.c:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-Verzeichnis muss absoluten Pfad haben"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Wenn Sie dort den WAL ablegen wollen, entfernen oder leeren Sie das Verzeichnis »%s«."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Es enthält eine unsichtbare Datei (beginnt mit Punkt), vielleicht weil es ein Einhängepunkt ist."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Es enthält ein Verzeichnis »lost+found«, vielleicht weil es ein Einhängepunkt ist."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Einen Einhängepunkt direkt als Datenverzeichnis zu verwenden wird nicht empfohlen.\n"
+"Erzeugen Sie ein Unterverzeichnis unter dem Einhängepunkt."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "erzeuge Unterverzeichnisse ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "führe Post-Bootstrap-Initialisierung durch ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s benötigt einen Wert"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Debug-Modus ist an.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "No-Clean-Modus ist an. Bei Fehlern wird nicht aufgeräumt.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "unbekannter Locale-Provider: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s kann nur angegeben werden, wenn Locale-Provider »%s« gewählt ist"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "synchronisiere Daten auf Festplatte ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "Passwortprompt und Passwortdatei können nicht zusammen angegeben werden"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "Argument von --wal-segsize muss eine Zahl sein"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "Superuser-Name »%s« nicht erlaubt; Rollennamen können nicht mit »pg_« anfangen"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Die Dateien, die zu diesem Datenbanksystem gehören, werden dem Benutzer\n"
+"»%s« gehören. Diesem Benutzer muss auch der Serverprozess gehören.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Datenseitenprüfsummen sind eingeschaltet.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Datenseitenprüfsummen sind ausgeschaltet.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Synchronisation auf Festplatte übersprungen.\n"
+"Das Datenverzeichnis könnte verfälscht werden, falls das Betriebssystem abstürzt.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "Authentifizierung für lokale Verbindungen auf »trust« gesetzt"
+
+#: initdb.c:3416
+#, c-format
+msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb."
+msgstr "Sie können dies ändern, indem Sie pg_hba.conf bearbeiten oder beim nächsten Aufruf von initdb die Option -A, oder --auth-local und --auth-host, verwenden."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "logdatei"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Erfolg. Sie können den Datenbankserver jetzt mit\n"
+"\n"
+" %s\n"
+"\n"
+"starten.\n"
+"\n"
diff --git a/src/bin/initdb/po/el.po b/src/bin/initdb/po/el.po
new file mode 100644
index 0000000..d162d6b
--- /dev/null
+++ b/src/bin/initdb/po/el.po
@@ -0,0 +1,1096 @@
+# Greek message translation file for initdb
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:19+0000\n"
+"PO-Revision-Date: 2023-08-15 11:59+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αÏχείο «%s»: %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετονομασία του αÏχείου «%s» σε «%s»: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "δεν ήταν δυνατό το άνοιγμα διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "δεν ήταν δυνατή η εκχώÏηση SID: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η εκκίνηση διεÏγασίας για την εντολή «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακÏιτικό πεÏιοÏισμοÏ: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "δεν ήταν δυνατή η απόκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¾ÏŒÎ´Î¿Ï… από την υποδιεÏγασία: κωδικός σφάλματος %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση του αÏχείου «%s»: %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση του καταλόγου «%s»: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ενεÏγής ταυτότητας χÏήστη %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ο χÏήστης δεν υπάÏχει"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βÏέθηκε"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "δεν ήταν δυνατός ο οÏισμός διασταÏÏωσης για «%s»: %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "δεν ήταν δυνατή η απόκτηση διασταÏÏωσης για «%s»: %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για ανάγνωση: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για εγγÏαφή: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "αφαιÏείται ο κατάλογος δεδομένων «%s»"
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "απέτυχε η αφαίÏεση καταλόγου δεδομένων"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "αφαιÏοÏνται πεÏιεχόμενα του καταλόγου δεδομένων «%s»"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "απέτυχε η αφαίÏεση πεÏιεχομένων του καταλόγου δεδομένων"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "αφαίÏεση καταλόγου WAL «%s»"
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "απέτυχε η αφαίÏεση καταλόγου WAL"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "αφαιÏοÏνται τα πεÏιεχόμενα του καταλόγου WAL «%s»"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "απέτυχε η αφαίÏεση πεÏιεχόμενων του καταλόγου WAL"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ο κατάλογος δεδομένων «%s» δεν αφαιÏείται κατα απαίτηση του χÏήστη"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ο κατάλογος WAL «%s» δεν αφαιÏέθηκε κατά απαίτηση του χÏήστη"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "δεν δÏναται η εκτέλεση ως υπεÏχÏήστης"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "ΠαÏακαλώ συνδεθείτε (χÏησιμοποιώντας, Ï€.χ. την εντολή «su») ως ο (μη Ï€ÏονομιοÏχος) χÏήστης που θα είναι κάτοχος της διεÏγασίας του διακομιστή."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "«%s» δεν είναι έγκυÏο όνομα κωδικοποίησης διακομιστή"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "το αÏχείο «%s» δεν υπάÏχει"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, 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:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του αÏχείο «%s»: %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "το αÏχείο «%s» δεν είναι ένα κανονικό αÏχείο"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "επιλογή εφαÏμογής δυναμικής κοινόχÏηστης μνήμης ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "επιλογή Ï€ÏοκαθοÏισμένης τιμής max_connections ... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "επιλογή Ï€ÏοκαθοÏισμένης τιμής shared_buffers ... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "επιλογή Ï€ÏοκαθοÏισμένης ζώνης ÏŽÏας ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "δημιουÏγία αÏχείων ÏÏθμισης ... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του «%s»: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "εκτέλεση σεναÏίου bootstrap ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "το αÏχείο εισόδου «%s» δεν ανήκει στην PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "ΚαθοÏίστε τη σωστή διαδÏομή χÏησιμοποιώντας την επιλογή -L."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Εισάγετε νέο κωδικό Ï€Ïόσβασης υπεÏχÏήστη: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Εισάγετε ξανά: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Οι κωδικοί Ï€Ïόσβασης δεν είναι ίδιοι.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης από το αÏχείο «%s»: %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "αÏχείο κωδικών Ï€Ïόσβασης «%s» είναι άδειο"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "συνελήφθει σήμα\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "δεν ήταν δυνατή η εγγÏαφή στην απογονική διεÏγασία: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "εντάξει\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() απέτυχε"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "απέτυχε να επαναφέÏει την παλαιά εντοπιότητα «%s»"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "άκυÏη ονομασία εντοπιότητας «%s»"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Αν το όνομα της εντοπιότητας είναι συγκεκÏιμένο για το ICU, χÏησιμοποιήστε --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "μη έγκυÏες Ïυθμίσεις εντοπιότητας, ελέγξτε τις μεταβλητές πεÏιβάλλοντος LANG και LC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "αναντιστοιχία κωδικοποίησης"
+
+#: initdb.c:2204
+#, 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:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Επανεκτελέστε %s και είτε μην καθοÏίσετε Ïητά μια κωδικοποίηση, είτε επιλέξτε ταιÏιαστό συνδυασμό."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Η κωδικοποίηση που επιλέξατε (%s) δεν υποστηÏίζεται από τον πάÏοχο ICU."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "δεν δÏναται η μετατÏοπή ονόματος locale «%s» σε ετικέτα γλώσσας: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU δεν υποστηÏίζεται σε αυτήν την πλατφόÏμα"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "δεν δÏναται ο οÏισμός της γλώσσας από το locale «%s»: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "εντοπιότητα «%s» έχει άγνωστη γλώσσα «%s»"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU εντοπιότητα Ï€Ïέπει να έχει καθοÏιστεί"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "ΧÏήση ετικέτας γλώσσας «%s» για την εντοπιότητα ICU «%s».\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s αÏχικοποιεί μία συστάδα PostgreSQL βάσης δεδομένων.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓH]... [DATADIR]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD Ï€ÏοκαθοÏισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD Ï€ÏοκαθοÏισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις Ï€Ïωτοκόλλου TCP/IP\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD Ï€ÏοκαθοÏισμένη μέθοδος ταυτοποίησης για συνδέσεις τοπικής υποδοχής\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR τοποθεσία για αυτή τη συστάδα βάσης δεδομένων\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING ÏŒÏισε την Ï€ÏοκαθοÏισμένη κωδικοποίηση για καινοÏÏιες βάσεις δεδομένων\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access επέτÏεψε εγγÏαφή/ανάγνωση για την ομάδα στο κατάλογο δεδομένων\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE ÏŒÏισε την ICU εντοπιότητα για καινοÏÏιες βάσεις δεδομένων\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=RULES ÏŒÏισε Ï€Ïόσθετους κανόνες ταξινόμησης ICU για νέες βάσεις δεδομένων\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums χÏησιμοποίησε αθÏοίσματα ελέγχου σελίδων δεδομένων\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE ÏŒÏισε την Ï€ÏοκαθοÏισμένη εντοπιότητα για καινοÏÏιες βάσεις δεδομένων\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" ÏŒÏισε την Ï€ÏοκαθοÏισμένη εντοπιότητα για τις σχετικές κατηγοÏίες\n"
+" καινοÏÏιων βάσεων δεδομένων (Ï€ÏοκαθοÏισμένη τιμή διαβάζεται από το πεÏιβάλλον)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale ισοδÏναμο με --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ÏŒÏισε τον Ï€ÏοκαθοÏισμένο πάÏοχο εντοπιότητας για νέες βάσεις δεδομένων\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE διάβασε τον κωδικό Ï€Ïόσβασης για τον νέο υπεÏχÏήστη από το αÏχείο\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" Ï€ÏοκαθοÏισμένη ÏÏθμιση αναζήτησης κειμένου\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME όνομα υπεÏχÏήστη βάσης δεδομένων\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt Ï€ÏοτÏοπή για κωδικό Ï€Ïόσβασης για τον νέο υπεÏχÏήστη\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"ΛιγότεÏο συχνά χÏησιμοποιοÏμενες επιλογές:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=VALUE παÏάκαμψε την Ï€Ïοεπιλεγμένη ÏÏθμιση για την παÏάμετÏο του διακομιστή\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug δημιοÏÏγησε πολλές καταγÏαφές αποσφαλμάτωσης\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches ÏŒÏισε debug_discard_caches=1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY τοποθεσία εÏÏεσης αÏχείων εισόδου\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean να μην καθαÏιστοÏν σφάλματα\n"
+
+#: initdb.c:2461
+#, 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:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions να μην εκτυπώσει οδηγίες για τα επόμενα βήματα\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show δείξε τις εσωτεÏικές Ïυθμίσεις\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only συγχÏόνισε μόνο αÏχεία της βάσης δεδομένων στον δίσκο, στη συνέχεια έξοδος\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Άλλες επιλογές:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοÏιστεί ο κατάλογος δεδομένων, χÏησιμοποιείται η\n"
+"μεταβλητή πεÏιβάλλοντος PGDATA.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "μη έγκυÏη μέθοδος ταυτοποίησης «%s» για συνδέσεις «%s»"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "απαιτείται ο καθοÏισμός ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης για τον υπεÏχÏήστη για να την ενεÏγοποίηση του ελέγχου ταυτότητας ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν οÏίστηκε κατάλογος δεδομένων"
+
+#: initdb.c:2533
+#, 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:2550
+#, c-format
+msgid "could not set environment"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση πεÏιβάλλοντος"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από το %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»."
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "η τοποθεσία του αÏχείου εισόδου Ï€Ïέπει να είναι μία πλήÏης διαδÏομή"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Η συστάδα βάσης δεδομένων θα αÏχικοποιηθεί με εντοπιότητα «%s».\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Η συστάδα βάσης δεδομένων θα αÏχικοποιηθεί με αυτή τη ÏÏθμιση εντοπιότητας:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " πάÏοχος: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU εντοπιότητα: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "δεν μπόÏεσε να βÏεθεί κατάλληλη κωδικοποίηση για την εντοπιότητα «%s»"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Επανεκτελέστε %s με την επιλογή -E."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Η κωδικοποίηση «%s» που υπονοείται από τις τοπικές Ïυθμίσεις δεν επιτÏέπεται ως κωδικοποίηση από την πλευÏά του διακομιστή.\n"
+"Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων θα οÏιστεί σε «%s».\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "εντοπιότητα «%s» Ï€Ïοαπαιτεί τη μην υποστηÏιζόμενη κωδικοποίηση«%s»"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Η κωδικοποίηση «%s» δεν επιτÏέπεται ως κωδικοποίηση από την πλευÏά του διακομιστή."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Επανεκτελέστε %s με διαφοÏετική επιλογή εντοπιότητας."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οÏιστεί ως «%s».\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "δεν ήταν δυνατή η εÏÏεση κατάλληλων Ïυθμίσεων για την μηχανή αναζήτησης για την εντοπιότητα «%s»"
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "οι κατάλληλες Ïυθμίσεις για την μηχανή αναζήτησης για την εντοπιότητα «%s» δεν είναι γνωστές"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "η οÏισμένη ÏÏθμιση μηχανής αναζήτησης «%s» μποÏεί να μην ταιÏιάζει με την εντοπιότητα «%s»"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Η Ï€ÏοκαθοÏισμένη ÏÏθμιση μηχανής αναζήτησης θα οÏιστεί ως «%s».\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "δημιουÏγία καταλόγου %s ... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "διοÏθώνονται τα δικαιώματα του υπάÏχοντος καταλόγου %s ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ο κατάλογος «%s» υπάÏχει και δεν είναι άδειος"
+
+#: initdb.c:2840
+#, 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:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του καταλόγου «%s»: %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "η τοποθεσία του καταλόγου WAL Ï€Ïέπει να είναι μία πλήÏης διαδÏομή"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Εάν θέλετε να αποθηκεÏσετε το WAL εκεί, είτε αφαιÏέστε ή αδειάστε τον κατάλογο «%s»."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "ΠεÏιέχει ένα αÏχείο με Ï€Ïόθεμα κουκκίδας/αόÏατο, ίσως επειδή είναι ένα σημείο Ï€ÏοσάÏτησης."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "ΠεÏιέχει έναν κατάλογο lost+found, ίσως επειδή είναι ένα σημείο Ï€ÏοσάÏτησης."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Δεν Ï€Ïοτείνεται η άμεση χÏήση ενός σημείου Ï€ÏοσάÏτησης ως καταλόγου δεδομένων.\n"
+"ΔημιουÏγείστε έναν υποκατάλογο υπό του σημείου Ï€ÏοσάÏτησης."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "δημιουÏγία υποκαταλόγων ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "Ï€Ïαγματοποίηση σταδίου αÏχικοποίησης post-bootstrap ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s απαιτεί μια τιμή"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Εκτέλεση σε λειτουÏγία αποσφαλμάτωσης.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Εκτέλεση σε λειτουÏγία μη καθαÏισμοÏ. Τα σφάλματα δεν θα καθαÏιστοÏν.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "μη αναγνωÏίσιμος πάÏοχος εντοπιότητας: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s δεν είναι δυνατό να καθοÏιστεί, εκτός εάν επιλεγεί «%s» ως πάÏοχος εντοπιότητας"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "συγχÏονίζονται δεδομένα στο δίσκο ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "η Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¹ÏƒÏŒÎ´Î¿Ï… και το αÏχείο ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¹ÏƒÏŒÎ´Î¿Ï… δεν δÏναται να οÏιστοÏν ταυτόχÏονα"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "η παÏάμετÏος --wal-segsize Ï€Ïέπει να είναι αÏιθμός"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "η παÏάμετÏος --wal-segsize Ï€Ïέπει να έχει τιμή δÏναμης 2 Î¼ÎµÏ„Î±Î¾Ï 1 και 1024"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "το όνομα υπεÏχÏήστη «%s» δεν επιτÏέπεται, τα ονόματα Ïόλων δεν δÏναται να αÏχίζουν με «pg_»"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Τα αÏχεία που ανήκουν σε αυτό το σÏστημα βάσης δεδομένων θα ανήκουν στο χÏήστη «%s».\n"
+"Αυτός ο χÏήστης Ï€Ïέπει επίσης να κατέχει τη διαδικασία διακομιστή.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Τα αθÏοίσματα ελέγχου σελίδων δεδομένων είναι ενεÏγοποιημένα.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Τα αθÏοίσματα ελέγχου των σελίδων δεδομένων είναι απενεÏγοποιημένα.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Ο συγχÏονισμός με το δίσκο παÏαλείφθηκε.\n"
+"Ο κατάλογος δεδομένων ενδέχεται να αλλοιωθεί εάν καταÏÏεÏσει το λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÏ…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ενεÏγοποιείται η μέθοδος ταυτοποίησης «trust» για τοπικές συνδέσεις"
+
+#: initdb.c:3416
+#, 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 ή χÏησιμοποιώντας την επιλογή -A ή --auth-local και --auth-host, την επόμενη φοÏά που θα εκτελέσετε το initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Επιτυχία. ΜποÏείτε Ï„ÏŽÏα να εκκινήσετε τον διακομιστή βάσης δεδομένων χÏησιμοποιώντας:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid " --clobber-cache use cache-clobbering debug option\n"
+#~ msgstr " --clobber-cache χÏησιμοποίησε την επιλογή ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½ cache-clobbering\n"
+
+#~ msgid "The default database encoding has been set to \"%s\".\n"
+#~ msgstr "Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οÏιστεί ως «%s».\n"
+
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu"
+
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m"
+
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu"
+
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»"
+
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#~ msgid "could not remove file or directory \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η αφαίÏεση αÏχείου ή καταλόγου «%s»: %m"
+
+#~ msgid "could not stat file or directory \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο ή κατάλογο «%s»: %m"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
+
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται στην παÏοÏσα πλατφόÏμα"
diff --git a/src/bin/initdb/po/es.po b/src/bin/initdb/po/es.po
new file mode 100644
index 0000000..449d202
--- /dev/null
+++ b/src/bin/initdb/po/es.po
@@ -0,0 +1,1076 @@
+# Spanish translation of initdb.
+#
+# Copyright (c) 2004-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Ãlvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2014, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:20+0000\n"
+"PO-Revision-Date: 2023-10-04 11:47+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binario «%s» no válido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "no se pudo leer el binario «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "no se pudo abrir el token de proceso: código de error %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "no se pudo emplazar los SIDs: código de error %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "no se pudo crear el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "no se pudo obtener el código de salida del subproceso: código de error %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "no se pudo eliminar el archivo «%s»: %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "no se pudo eliminar el directorio «%s»: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "el usuario no existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "no se pudo definir un junction para «%s»: %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "no se pudo obtener junction para «%s»: %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "no se pudo abrir el archivo «%s» para escritura: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "no se pudo ejecutar la orden «%s»: %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "eliminando el directorio de datos «%s»"
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "no se pudo eliminar el directorio de datos"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "eliminando el contenido del directorio «%s»"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "no se pudo eliminar el contenido del directorio de datos"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "eliminando el directorio de WAL «%s»"
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "no se pudo eliminar el directorio de WAL"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "eliminando el contenido del directorio de WAL «%s»"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "no se pudo eliminar el contenido del directorio de WAL"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directorio de datos «%s» no eliminado a petición del usuario"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "directorio de WAL «%s» no eliminado a petición del usuario"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "no se puede ejecutar como «root»"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado, quien ejecutará el proceso servidor."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "«%s» no es un nombre válido de codificación"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "el archivo «%s» no existe"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Esto puede significar que tiene una instalación corrupta o ha identificado el directorio equivocado con la opción -L."
+
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "no se pudo acceder al archivo «%s»: %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "el archivo «%s» no es un archivo regular"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "seleccionando implementación de memoria compartida dinámica ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "seleccionando el valor para max_connections ... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "seleccionando el valor para shared_buffers ... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "seleccionando el huso horario por omisión ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "creando archivos de configuración ... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "no se pudo cambiar los permisos de «%s»: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "ejecutando script de inicio (bootstrap) ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "el archivo de entrada «%s» no pertenece a PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Especifique la ruta correcta usando la opción -L."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Ingrese la nueva contraseña del superusuario: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Ingrésela nuevamente: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Las contraseñas no coinciden.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "no se pudo leer la contraseña desde el archivo «%s»: %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "el archivo de contraseña «%s» está vacío"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "se ha capturado una señal\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "no se pudo escribir al proceso hijo: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "hecho\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() falló"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "no se pudo restaurar la configuración regional anterior «%s»"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nombre de configuración regional «%s» no es válido"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Si el nombre de configuración regional es específico de ICU, use --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "configuración regional inválida; revise las variables de entorno LANG y LC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "codificaciones no coinciden"
+
+#: initdb.c:2204
+#, 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 "La codificación que seleccionó (%s) y la codificación de la configuración regional elegida (%s) no coinciden. Esto llevaría a comportamientos erráticos en ciertas funciones de procesamiento de cadenas de caracteres."
+
+#: initdb.c:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr ""
+"Vuelva a ejecutar %s sin escoger explícitamente una codificación, o bien\n"
+"escoja una combinación coincidente."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "La codificación que seleccionó (%s) no está soportada con el proveedor ICU."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "no se pudo convertir el nombre de configuración regional «%s» a etiqueta de lenguaje: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU no está soportado en este servidor"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "no se pudo obtener el lenguaje de la configuración regional «%s»: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "la configuración regional «%s» tiene lenguaje «%s» desconocido"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "el locale ICU debe ser especificado"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "Usando la marca de lenguaje «%s» para la configuración regional ICU «%s».\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inicializa un cluster de base de datos PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPCIÓN]... [DATADIR]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr ""
+" -A, --auth=MÉTODO método de autentificación por omisión para\n"
+" conexiones locales\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=MÉTODO método de autentificación por omisión para\n"
+" conexiones locales TCP/IP\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=MÉTODO método de autentificación por omisión para\n"
+" conexiones de socket local\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR ubicación para este cluster de bases de datos\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=CODIF codificación por omisión para nuevas bases de datos\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access dar al grupo permisos de lectura/ejecución sobre\n"
+" el directorio de datos\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr ""
+" --icu-locale=LOCALE definir el ID de configuración regional ICU para\n"
+" nuevas bases de datos\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=REGLAS reglas adicionales ICU en nuevas bases de datos\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums activar sumas de verificación en páginas de datos\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE configuración regional por omisión para \n"
+" nuevas bases de datos\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" inicializar usando esta configuración regional\n"
+" en la categoría respectiva (el valor por omisión\n"
+" es tomado de variables de ambiente)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale equivalente a --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" define el proveedor de configuración regional\n"
+" para nuevas bases de datos\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=ARCHIVO leer contraseña del nuevo superusuario del archivo\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CONF\n"
+" configuración de búsqueda en texto por omisión\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=USUARIO nombre del superusuario del cluster\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt pedir una contraseña para el nuevo superusuario\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR ubicación del directorio WAL\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMAÑO tamaño de los segmentos de WAL, en megabytes\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Opciones menos usadas:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NOMBRE=VALOR sobreescribe valor por omisión de parámetro de servidor\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug genera mucha salida de depuración\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches establece debug_discard_caches=1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORIO donde encontrar los archivos de entrada\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean no limpiar después de errores\n"
+
+#: initdb.c:2461
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: initdb.c:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions no mostrar instrucciones para los siguientes pasos\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show muestra variables internas\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only sólo sincronizar el directorio de datos y salir\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Otras opciones:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de version y salir\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Si el directorio de datos no es especificado, se usa la variable de\n"
+"ambiente PGDATA.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "método de autentificación «%s» no válido para conexiones «%s»"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "debe especificar una contraseña al superusuario para activar autentificación mediante contraseña"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó un directorio de datos"
+
+#: initdb.c:2533
+#, 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 "Debe especificar el directorio donde residirán los datos para este clúster. Hágalo usando la opción -D o la variable de ambiente PGDATA."
+
+#: initdb.c:2550
+#, c-format
+msgid "could not set environment"
+msgstr "no se pudo establecer el ambiente"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s pero se encontró en el mismo directorio que «%s»"
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "la ubicación de archivos de entrada debe ser una ruta absoluta"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "El cluster será inicializado con configuración regional «%s».\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "El cluster será inicializado con esta configuración regional:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " proveedor: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " Locale ICU: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "no se pudo encontrar una codificación apropiada para la configuración regional «%s»"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Ejecute %s nuevamente con la opción -E."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"La codificación «%s», implícita en la configuración regional,\n"
+"no puede ser usada como codificación del lado del servidor.\n"
+"La codificación por omisión será «%s».\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "la configuración regional «%s» requiere la codificación no soportada «%s»"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "La codificación «%s» no puede ser usada como codificación del lado del servidor."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Ejecute %s nuevamente con opciones de configuración regional diferente."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "La codificación por omisión ha sido por lo tanto definida a «%s».\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr ""
+"no se pudo encontrar una configuración para búsqueda en texto apropiada\n"
+"para la configuración regional «%s»"
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "la configuración de búsqueda en texto apropiada para la configuración regional «%s» es desconocida"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "la configuración de búsqueda en texto «%s» especificada podría no coincidir con la configuración regional «%s»"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "La configuración de búsqueda en texto ha sido definida a «%s».\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "creando el directorio %s ... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "corrigiendo permisos en el directorio existente %s ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "no se pudo cambiar los permisos del directorio «%s»: %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "el directorio «%s» existe pero no está vacío"
+
+#: initdb.c:2840
+#, 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 "Si quiere crear un nuevo cluster de bases de datos, elimine o vacíe el directorio «%s», o ejecute %s con un argumento distinto de «%s»."
+
+#: initdb.c:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Si quiere almacenar el WAL ahí, elimine o vacíe el directorio «%s»."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "no se pudo crear el enlace simbólico «%s»: %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Contiene un archivo invisible o que empieza con un punto (.), quizás por ser un punto de montaje."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Contiene un directorio lost+found, quizás por ser un punto de montaje."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Usar un punto de montaje directamente como directorio de datos no es recomendado.\n"
+"Cree un subdirectorio bajo el punto de montaje."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "creando subdirectorios ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "realizando inicialización post-bootstrap ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s requiere un valor"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Ejecutando en modo de depuración.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Ejecutando en modo no-clean. Los errores no serán limpiados.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "proveedor de ordenamiento no reconocido: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s no puede especificarse a menos que el proveedor de locale «%s» sea escogido"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "sincronizando los datos a disco ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr ""
+"la petición de contraseña y el archivo de contraseña no pueden\n"
+"ser especificados simultáneamente"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "el argumento de --wal-segsize debe ser un número"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "el argumento de --wal-segsize debe ser una potencia de dos entre 1 y 1024"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "nombre de superusuario «%s» no permitido; los nombres de rol no pueden comenzar con «pg_»"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Los archivos de este cluster serán de propiedad del usuario «%s».\n"
+"Este usuario también debe ser quien ejecute el proceso servidor.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Las sumas de verificación en páginas de datos han sido activadas.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Las sumas de verificación en páginas de datos han sido desactivadas.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"La sincronización a disco se ha omitido.\n"
+"El directorio de datos podría corromperse si el sistema operativo sufre\n"
+"una caída.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "activando el método de autentificación «trust» para conexiones locales"
+
+#: initdb.c:3416
+#, 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 "Puede cambiar esto editando pg_hba.conf o usando el parámetro -A, o --auth-local y --auth-host la próxima vez que ejecute initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "archivo_de_registro"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Completado. Ahora puede iniciar el servidor de bases de datos usando:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/fr.po b/src/bin/initdb/po/fr.po
new file mode 100644
index 0000000..a175e10
--- /dev/null
+++ b/src/bin/initdb/po/fr.po
@@ -0,0 +1,1352 @@
+# LANGUAGE message translation file for initdb
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 17:20+0000\n"
+"PO-Revision-Date: 2023-09-05 22:01+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binaire « %s » invalide : %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "n'a pas pu lire le binaire « %s » : %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "n'a pas pu allouer les SID : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "n'a pas pu supprimer le répertoire « %s » : %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utilisateur n'existe pas"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "n'a pas pu configurer la jonction pour « %s » : %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "n'a pas pu obtenir la jonction pour « %s » : %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » en écriture : %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "n'a pas pu exécuter la commande « %s » : %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "suppression du répertoire des données « %s »"
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "échec de la suppression du répertoire des données"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "suppression du contenu du répertoire des données « %s »"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "échec de la suppression du contenu du répertoire des données"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "suppression du répertoire des journaux de transactions « %s »"
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "échec de la suppression du répertoire des journaux de transactions"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "suppression du contenu du répertoire des journaux de transactions « %s »"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "échec de la suppression du contenu du répertoire des journaux de transactions"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "ne peut pas être exécuté en tant que root"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non privilégié) qui sera propriétaire du processus serveur."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "« %s » n'est pas un nom d'encodage serveur valide"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "le rôle « %s » n'existe pas"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Cela peut signifier que votre installation est corrompue ou que vous avez identifié le mauvais répertoire avec l'option -L."
+
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "n'a pas pu accéder au fichier « %s » : %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "le fichier « %s » n'est pas un fichier standard"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "sélection de l'implémentation de la mémoire partagée dynamique..."
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "sélection de la valeur par défaut pour max_connections... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "sélection de la valeur par défaut pour shared_buffers... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "sélection du fuseau horaire par défaut... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "création des fichiers de configuration... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "n'a pas pu modifier les droits de « %s » : %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "lancement du script bootstrap..."
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "le fichier en entrée « %s » n'appartient pas à PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Indiquez le bon chemin avec l'option -L."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Saisir le nouveau mot de passe du super-utilisateur : "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Saisir le mot de passe à nouveau : "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Les mots de passe ne sont pas identiques.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "n'a pas pu lire le mot de passe à partir du fichier « %s » : %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "le fichier de mots de passe « %s » est vide"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "signal reçu\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "n'a pas pu écrire au processus fils : %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "échec de setlocale()"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "a échoué pour restaurer l'ancienne locale « %s »"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nom de locale « %s » invalide"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Si le nom de la locale est spécifique à ICU, utilisez --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "configuration invalide de la locale ; vérifiez les variables d'environnement LANG et LC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "différence d'encodage"
+
+#: initdb.c:2204
+#, 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 "L'encodage que vous avez sélectionné (%s) et celui que la locale sélectionnée utilise (%s) ne sont pas compatibles. Cela peut conduire à des erreurs dans les fonctions de manipulation de chaînes de caractères."
+
+#: initdb.c:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Relancez %s et soit vous ne spécifiez pas explicitement d'encodage, soit vous choisissez une combinaison compatible."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "L'encodage que vous avez sélectionné (%s) n'est pas supporté avec le fournisseur ICU."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "n'a pas pu convertir le nom de locale « %s » en balise de langage : %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU n'est pas supporté dans cette installation"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "n'a pas pu obtenir la langue à partir de la locale « %s » : %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "la locale « %s » a le langage inconnu « %s »"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "la locale ICU doit être précisée"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "Utilisation de la balise de langage « %s » pour la locale ICU « %s ».\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s initialise une instance PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [RÉP_DONNÉES]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr ""
+" -A, --auth=MÉTHODE méthode d'authentification par défaut pour les\n"
+" connexions locales\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=MÉTHODE méthode d'authentification par défaut pour les\n"
+" connexions locales TCP/IP\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=MÉTHODE méthode d'authentification par défaut pour les\n"
+" connexions locales socket\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]RÉP_DONNÉES emplacement du répertoire principal des données\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr ""
+" -E, --encoding=ENCODAGE initialise l'encodage par défaut des nouvelles\n"
+" bases de données\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access autorise la lecture/écriture pour le groupe sur\n"
+" le répertoire des données\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE initialise l'identifiant de locale ICU pour les nouvelles bases de données\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=REGLES initialise les règles supplémentaires de la locale ICU pour les nouvelles bases de données\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr ""
+" -k, --data-checksums active les sommes de contrôle pour les blocs des\n"
+" fichiers de données\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE initialise la locale par défaut pour les\n"
+" nouvelles bases de données\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" initialise la locale par défaut dans la catégorie\n"
+" respective pour les nouvelles bases de données\n"
+" (les valeurs par défaut sont prises dans\n"
+" l'environnement)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale équivalent à --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" initialise le fournisseur de locale par défaut pour\n"
+" les nouvelles bases de données\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=FICHIER lit le mot de passe du nouveau super-utilisateur\n"
+" à partir de ce fichier\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG configuration par défaut de la recherche plein\n"
+" texte\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NOM nom du super-utilisateur de la base de données\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr ""
+" -W, --pwprompt demande un mot de passe pour le nouveau\n"
+" super-utilisateur\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" -X, --waldir=RÉP_WAL emplacement du répertoire des journaux de\n"
+" transactions\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Options moins utilisées :\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c NOM=VALEUR surcharge la configuration par défaut d'un paramètre serveur\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug engendre un grand nombre de traces de débogage\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches initialise debug_discard_caches à 1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr ""
+" -L RÉPERTOIRE indique où trouver les fichiers servant à la\n"
+" création de l'instance\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --noclean ne nettoie pas après des erreurs\n"
+
+#: initdb.c:2461
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: initdb.c:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr ""
+" --no-instructions n'affiche pas les instructions des prochaines\n"
+" étapes\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show affiche la configuration interne\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only synchronise uniquement le répertoire des données, puis quitte\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Autres options :\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Si le répertoire des données n'est pas indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "méthode d'authentification « %s » invalide pour « %s » connexions"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "doit indiquer un mot de passe pour le super-utilisateur afin d'activer l'authentification par mot de passe"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: initdb.c:2533
+#, 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 "Vous devez identifier le répertoire où résideront les données pour ce système de bases de données. Faites-le soit avec l'option -D soit avec la variable d'environnement PGDATA."
+
+#: initdb.c:2550
+#, c-format
+msgid "could not set environment"
+msgstr "n'a pas pu configurer l'environnement"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "l'emplacement du fichier d'entrée doit être indiqué avec un chemin absolu"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "L'instance sera initialisée avec la locale « %s ».\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "L'instance sera initialisée avec cette configuration de locale :\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " fournisseur: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " locale ICU : %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "n'a pas pu trouver un encodage adéquat pour la locale « %s »"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Relancez %s avec l'option -E."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"L'encodage « %s » a été déduit de la locale mais n'est pas autorisé en tant qu'encodage serveur.\n"
+"L'encodage par défaut des bases de données sera configuré à « %s ».\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "la locale « %s » nécessite l'encodage « %s » non supporté"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "L'encodage « %s » n'est pas autorisé en tant qu'encodage serveur."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Relancez %s avec une locale différente."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr ""
+"L'encodage par défaut des bases de données a été configuré en conséquence\n"
+"avec « %s ».\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "n'a pas pu trouver la configuration de la recherche plein texte en adéquation avec la locale « %s »"
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "la configuration de la recherche plein texte convenable pour la locale « %s » est inconnue"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "la configuration indiquée pour la recherche plein texte, « %s », pourrait ne pas correspondre à la locale « %s »"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "La configuration de la recherche plein texte a été initialisée à « %s ».\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "création du répertoire %s... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "correction des droits sur le répertoire existant %s... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "n'a pas pu modifier les droits du répertoire « %s » : %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "le répertoire « %s » existe mais n'est pas vide"
+
+#: initdb.c:2840
+#, 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 "Si vous voulez créer un nouveau système de bases de données, supprimez ou videz le répertoire « %s ». Vous pouvez aussi exécuter %s avec un argument autre que « %s »."
+
+#: initdb.c:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Si vous voulez enregistrer ici les WAL, supprimez ou videz le répertoire « %s »."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique « %s » : %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Il contient un fichier invisible, peut-être parce qu'il s'agit d'un point de montage."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Il contient un répertoire lost+found, peut-être parce qu'il s'agit d'un point de montage.\\"
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Utiliser un point de montage comme répertoire des données n'est pas recommandé.\n"
+"Créez un sous-répertoire sous le point de montage."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "création des sous-répertoires... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "exécution de l'initialisation après bootstrap... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s requiert une valeur"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Lancé en mode débogage.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Lancé en mode « sans nettoyage ». Les erreurs ne seront pas nettoyées.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "fournisseur de locale non reconnu : %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s ne peut pas être spécifié sauf si le fournisseur de locale « %s » est choisi"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "synchronisation des données sur disque... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr ""
+"les options d'invite du mot de passe et de fichier de mots de passe ne\n"
+"peuvent pas être indiquées simultanément"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argument de --wal-segsize doit être un nombre"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "le nom de superutilisateur « %s » n'est pas autorisé ; les noms de rôle ne peuvent pas commencer par « pg_ »"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Les fichiers de ce système de bases de données appartiendront à l'utilisateur « %s ».\n"
+"Le processus serveur doit également lui appartenir.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Les sommes de contrôle des pages de données sont activées.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Les sommes de contrôle des pages de données sont désactivées.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Synchronisation sur disque ignorée.\n"
+"Le répertoire des données pourrait être corrompu si le système d'exploitation s'arrêtait brutalement.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "activation de l'authentification « trust » pour les connexions locales"
+
+#: initdb.c:3416
+#, 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 "Vous pouvez changer cette configuration en éditant le fichier pg_hba.conf ou en utilisant l'option -A, ou --auth-local et --auth-host, à la prochaine exécution d'initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "fichier_de_trace"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Succès. Vous pouvez maintenant lancer le serveur de bases de données en utilisant :\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: The password file was not generated. Please report this problem.\n"
+#~ msgstr ""
+#~ "%s : le fichier de mots de passe n'a pas été créé.\n"
+#~ "Merci de rapporter ce problème.\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au fichier « %s » : %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n"
+
+#~ msgid "%s: could not determine valid short version string\n"
+#~ msgstr "%s : n'a pas pu déterminer une chaîne de version courte valide\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu exécuter la commande « %s » : %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir le nom de l'utilisateur courant : %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir d'informations sur l'utilisateur courant : %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for writing: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en écriture : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not to allocate SIDs: error code %lu\n"
+#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transaction\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s : échec de la suppression du répertoire des journaux de transaction\n"
+
+#~ msgid "%s: failed to restore old locale \"%s\"\n"
+#~ msgstr "%s : n'a pas pu restaurer l'ancienne locale « %s »\n"
+
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s : le fichier « %s » n'existe pas\n"
+
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s : nom de locale invalide (« %s »)\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s : le nom de la locale contient des caractères non ASCII, ignoré : « %s »\n"
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s : nom de locale trop long, ignoré : « %s »\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s : suppression du contenu du répertoire des journaux de transaction « %s »\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s : suppression du répertoire des journaux de transaction « %s »\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr ""
+#~ "%s : répertoire des journaux de transaction « %s » non supprimé à la demande\n"
+#~ "de l'utilisateur\n"
+
+#~ msgid "%s: unrecognized authentication method \"%s\"\n"
+#~ msgstr "%s : méthode d'authentification « %s » inconnue.\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Aucune locale système utilisable n'a été trouvée.\n"
+
+#, c-format
+#~ msgid "The default database encoding has been set to \"%s\".\n"
+#~ msgstr "L'encodage par défaut des bases de données a été configuré à « %s ».\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n"
+#~ "le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n"
+#~ "version que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Utilisez l'option « --debug » pour voir le détail.\n"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "copie de template1 vers postgres... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "copie de template1 vers template0... "
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#, c-format
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "n'a pas pu lire le binaire « %s »"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#, c-format
+#~ msgid "could not remove file or directory \"%s\": %m"
+#~ msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %m"
+
+#, c-format
+#~ msgid "could not stat file or directory \"%s\": %m"
+#~ msgstr ""
+#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n"
+#~ "« %s » : %m"
+
+#~ msgid "could not stat file or directory \"%s\": %s\n"
+#~ msgstr ""
+#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n"
+#~ "« %s » : %s\n"
+
+#~ msgid "creating collations ... "
+#~ msgstr "création des collationnements... "
+
+#~ msgid "creating conversions ... "
+#~ msgstr "création des conversions... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "création des dictionnaires... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "création du schéma d'informations... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "création des vues système... "
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "création de la base de données template1 dans %s/base/1... "
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "initialisation des dépendances... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "initialisation de pg_authid... "
+
+#, c-format
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "binaire « %s » invalide"
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "chargement du langage PL/pgSQL... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "chargement de la description des objets système... "
+
+#~ msgid "not supported on this platform\n"
+#~ msgstr "non supporté sur cette plateforme\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "setting password ... "
+#~ msgstr "initialisation du mot de passe... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "initialisation des droits sur les objets internes... "
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "les liens symboliques ne sont pas supportés sur cette plateforme"
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "lancement du vacuum sur la base de données template1... "
diff --git a/src/bin/initdb/po/he.po b/src/bin/initdb/po/he.po
new file mode 100644
index 0000000..03c6a23
--- /dev/null
+++ b/src/bin/initdb/po/he.po
@@ -0,0 +1,1053 @@
+# Hebrew message translation file for initdb
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldbrg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-12 20:33+0300\n"
+"PO-Revision-Date: 2017-05-14 16:16+0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.1\n"
+"Last-Translator: Michael Goldberg <mic.goldbrg@gmail.com>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: he_IL\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "×œ× ×™×•×›×œ לזהות ×ת הספריה הנוכחית: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "בינ×רי ×œ× ×—×•×§×™ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×‘×™× ×רי \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× \"%s\" לביצוע"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "×œ× ×œ×©× ×•×ª לשנות ספריות ל \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת הקישור הסימבולי \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "נכשלpclose : %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "×ין זיכרון פנוי\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "×œ× × ×™×ª×Ÿ לשכפל מצביע ריק (שגי××” פנימית)\n"
+
+#: ../../common/file_utils.c:82 ../../common/file_utils.c:186
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×” ניתן לקבל מידע (stat) על קובץ \"%s\": %s\n"
+
+#: ../../common/file_utils.c:162
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח תיקייה \"%s\": %s\n"
+
+#: ../../common/file_utils.c:198
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ž×ª×™×§×™×™×” \"%s\": %s\n"
+
+#: ../../common/file_utils.c:231 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:367
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח קובץ \"%s\": %s\n"
+
+#: ../../common/file_utils.c:304 ../../common/file_utils.c:376
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להעביר תוכן הקובץ (fsync) לדיסק \"%s\": %s\n"
+
+#: ../../common/file_utils.c:387
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לשנות ×©× ×”×§×•×‘×¥ \"%s\" \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:45
+#, c-format
+msgid "could not open directory \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לפתוח תיקייה \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:72
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ž×ª×™×§×™×™×” \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:84
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "×œ× ×™× ×™×ª×Ÿ לסגור ×ת מדריך \"%s\": %s\n"
+
+#: ../../common/restricted_token.c:68
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr ""
+"תכנית %s: ×זהרה: ×ין ×פשרות ליצור ×סימוני גישה ×ž×•×’×‘×œ×™× ×‘×¤×œ×˜×¤×•×¨×ž×” זו\n"
+
+#: ../../common/restricted_token.c:77
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח ×ת התהליך token: קוד שגי××” % lu\n"
+
+#: ../../common/restricted_token.c:90
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להקצות SID: קוד שגי××” % lu\n"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "תכנית %s: ×ין ×פשרות ליצור ×סימוני גישה: קוד שגי××” %lu\n"
+
+#: ../../common/restricted_token.c:132
+#, c-format
+msgid "%s: could not start process for command \"%s\": error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להפעיל תהליך עבור הפקודה \"%s\": קוד שגי××” % lu\n"
+
+#: ../../common/restricted_token.c:170
+#, c-format
+msgid "%s: could not re-execute with restricted token: error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לבצע מחדש ×¢× ×סימון גישה מוגבל: קוד שגי××” % lu\n"
+
+#: ../../common/restricted_token.c:186
+#, c-format
+msgid "%s: could not get exit code from subprocess: error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לקבל קוד היצי××” מן תהליך משנה: קוד שגי××” % lu\n"
+
+#: ../../common/rmtree.c:77
+#, c-format
+msgid "could not stat file or directory \"%s\": %s\n"
+msgstr "יכול ×œ× stat קובץ ×ו ספריה \"%s\": %s\n"
+
+#: ../../common/rmtree.c:104 ../../common/rmtree.c:121
+#, c-format
+msgid "could not remove file or directory \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות להסיר קובץ ×ו ספריה \"%s\": %s\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "×œ× ×™×›×•×œ לחפש יעיל ×ת המשתמש ×¢× ×ž×–×”×” % ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "משתמש ×œ× ×§×™×™×"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "כישלון בדיקה עבור ×©× ×”×ž×©×ª×ž×©: קוד שגי××” % lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "×œ× × ×™×ª×Ÿ לבצע ×ת הפקודה"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "הפקודה ×œ× × ×ž×¦××”"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי חריגה 0 0x %X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× ×ž×¦×‘ ×œ× ×ž×–×•×”×” %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות להגדיר ×ת הצומת של \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לקבל צומת עבור \"%s\": %s\n"
+
+#: initdb.c:331
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "תכנית %s: ×ין זיכרון פנוי\n"
+
+#: initdb.c:441 initdb.c:1442
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח קובץ \"%s\" לקרי××”: %s\n"
+
+#: initdb.c:497 initdb.c:813 initdb.c:841
+#, c-format
+msgid "%s: could not open file \"%s\" for writing: %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח הקובץ \"%s\" לכתיבה: %s\n"
+
+#: initdb.c:505 initdb.c:513 initdb.c:820 initdb.c:847
+#, c-format
+msgid "%s: could not write file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לכתוב ×ת הקובץ \"%s\": %s\n"
+
+#: initdb.c:532
+#, c-format
+msgid "%s: could not execute command \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×” ניתן לבצע ×ת הפקודה \"%s\": %s\n"
+
+#: initdb.c:548
+#, c-format
+msgid "%s: removing data directory \"%s\"\n"
+msgstr "תכנית %s: הסרת ספריית × ×ª×•× ×™× \"%s\"\n"
+
+#: initdb.c:551
+#, c-format
+msgid "%s: failed to remove data directory\n"
+msgstr "תכנית %s: כשל בלהסיר ×ת ספריית הנתוני×\n"
+
+#: initdb.c:557
+#, c-format
+msgid "%s: removing contents of data directory \"%s\"\n"
+msgstr "תכנית %s: הסרת התוכן של ספריית ×”× ×ª×•× ×™× \"%s\"\n"
+
+#: initdb.c:560
+#, c-format
+msgid "%s: failed to remove contents of data directory\n"
+msgstr "תכנית %s: כשל בלהסיר ×ת התוכן של ספריית הנתוני×\n"
+
+#: initdb.c:566
+#, c-format
+msgid "%s: removing WAL directory \"%s\"\n"
+msgstr "תכנית %s: הסרת ספריית WAL \"%s\"\n"
+
+#: initdb.c:569
+#, c-format
+msgid "%s: failed to remove WAL directory\n"
+msgstr "תכנית %s: כשל בלהסיר מדריך ×ת תיקיית WAL\n"
+
+#: initdb.c:575
+#, c-format
+msgid "%s: removing contents of WAL directory \"%s\"\n"
+msgstr "תכנית %s: הסרת התוכן של תיקיית WAL \"%s\"\n"
+
+#: initdb.c:578
+#, c-format
+msgid "%s: failed to remove contents of WAL directory\n"
+msgstr "תכנית %s: כשל בלהסיר ×ת התוכן של הספרית WAL\n"
+
+#: initdb.c:587
+#, c-format
+msgid "%s: data directory \"%s\" not removed at user's request\n"
+msgstr "תכנית %s: תיקיית ×”× ×ª×•× ×™× \"%s\" ×œ× ×”×•×¡×¨×” לבקשת המשתמש\n"
+
+#: initdb.c:592
+#, c-format
+msgid "%s: WAL directory \"%s\" not removed at user's request\n"
+msgstr "תכנית %s: תיקייה WAL \"%s\" ×œ× ×”×•×¡×¨×” לבקשת המשתמש\n"
+
+#: initdb.c:613
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"תכנית %s: ×œ× × ×™×ª×Ÿ להפעיל ×¢\"×™ root\n"
+"× × ×œ×”×™×›× ×¡ (ב×מצעות, למשל, \" su\") כמו המשתמש (×œ×œ× ×”×¨×©×ות)\n"
+"שתהליך השרת יהיה בבעלותו\n"
+
+#: initdb.c:649
+#, c-format
+msgid "%s: \"%s\" is not a valid server encoding name\n"
+msgstr "תכנית %s: \"%s\" ×ינו ×©× ×§×™×“×•×“ חוקי\n"
+
+#: initdb.c:769
+#, c-format
+msgid "%s: file \"%s\" does not exist\n"
+msgstr "תכנית %s: הקובץ '%s' ×ינו קיי×\n"
+
+#: initdb.c:771 initdb.c:780 initdb.c:790
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"המשמעות יכולה להיות שהתקנה פגומה\n"
+"×ו זוהה הספריה ×”×œ× × ×›×•×Ÿ ×¢× ×ופציה לקרי××” -L.\n"
+" \n"
+
+#: initdb.c:777
+#, c-format
+msgid "%s: could not access file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לגשת לקובץ \"%s\": %s\n"
+
+#: initdb.c:788
+#, c-format
+msgid "%s: file \"%s\" is not a regular file\n"
+msgstr "תכנית %s: קובץ '%s' ×ינו קובץ רגיל\n"
+
+#: initdb.c:933
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "בחירת ברירת המחדל max_connections... "
+
+#: initdb.c:963
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "בחירת ברירת המחדל shared_buffers... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "בחירת ×™×™×©×•× ×–×™×›×¨×•×Ÿ דינמי משותף... "
+
+#: initdb.c:1014
+msgid "creating configuration files ... "
+msgstr "יצירת קבצי תצורה... "
+
+#: initdb.c:1146 initdb.c:1166 initdb.c:1253 initdb.c:1269
+#, c-format
+msgid "%s: could not change permissions of \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשנות הרש×ות עבור \"%s\": %s\n"
+
+#: initdb.c:1293
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "הפעלת סקריפט ×תחול... "
+
+#: initdb.c:1309
+#, c-format
+msgid ""
+"%s: input file \"%s\" does not belong to PostgreSQL %s\n"
+"Check your installation or specify the correct path using the option -L.\n"
+msgstr ""
+"תכנית %s: קובץ הקלט '%s' ×ינו שייך ל PostgreSQL %s \n"
+"תבדוק ×ת ההתקנה שלך ×ו תציין ×ת הנתיב הנכון ב×מצעות ×”×פשרות -L.\n"
+
+#: initdb.c:1419
+msgid "Enter new superuser password: "
+msgstr "הזן סיסמת משתמש על חדשה: "
+
+#: initdb.c:1420
+msgid "Enter it again: "
+msgstr "הזן שוב: "
+
+#: initdb.c:1423
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "סיסמ×ות ×ינן תו×מות.\n"
+
+#: initdb.c:1449
+#, c-format
+msgid "%s: could not read password from file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ×œ×§×¨×•× ×ת הסיסמה מהקובץ \"%s\": %s\n"
+
+#: initdb.c:1452
+#, c-format
+msgid "%s: password file \"%s\" is empty\n"
+msgstr "תכנית %s: קובץ הסיסמה \"%s\" ריק\n"
+
+#: initdb.c:2012
+#, c-format
+msgid "caught signal\n"
+msgstr "×ות הנתפס\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לכתוב לתהליך צ×צ×: %s\n"
+
+#: initdb.c:2026
+#, c-format
+msgid "ok\n"
+msgstr "×ישור\n"
+
+#: initdb.c:2116
+#, c-format
+msgid "%s: setlocale() failed\n"
+msgstr "תכנית %s: נכשל התהליך להגדרת הגדרות ×זוריות (setlocale())\n"
+
+#: initdb.c:2134
+#, c-format
+msgid "%s: failed to restore old locale \"%s\"\n"
+msgstr "תכנית %s: כשל בשחזור הגדרת ×”×זור הישנה \"%s\"\n"
+
+#: initdb.c:2144
+#, c-format
+msgid "%s: invalid locale name \"%s\"\n"
+msgstr "תכנית %s: הגדרת ×זור ×œ× ×—×•×§×™×ª ×‘×©× \"%s\"\n"
+
+#: initdb.c:2156
+#, c-format
+msgid ""
+"%s: invalid locale settings; check LANG and LC_* environment variables\n"
+msgstr ""
+"תכנית %s: הגדרות ×זור ×œ× ×—×•×§×™×•×ª; בדוק ×ת משתני הסביבה LANG ו- LC_ *\n"
+
+#: initdb.c:2184
+#, c-format
+msgid "%s: encoding mismatch\n"
+msgstr "תכנית %s: ××™-הת×מת בקידוד\n"
+
+#: initdb.c:2186
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"קידוד ×ותו נבחרת (%s) ו×ת הקידוד\n"
+"בו משתמש הגדרה ×זורית שנבחרה (%s) ××™× × ×ª×•×מי×. ×–×” להוביל\n"
+"להתנהגות בלתי צפויה בפונקציות שונות לעיבוד מחרוזת תווי×.\n"
+"הפעל מחדש ×ת %s ו ×ו ×ל תציין במפורש הקידוד, ×ו תבחר ×ת שילוב התו××.\n"
+
+#: initdb.c:2258
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"תכנית %s: ×תחול ×”×שכול של מסד × ×ª×•× ×™× PostgreSQL \n"
+"\n"
+
+#: initdb.c:2259
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: initdb.c:2260
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr ""
+" שימוש\n"
+"%s [×פשרות]... [תיקיית נתוני×]\n"
+
+#: initdb.c:2261
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"×פשרויות:\n"
+
+#: initdb.c:2262
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr ""
+" -A\n"
+" --auth=METHOD\n"
+"שיטת ×ימות ברירת המחדל עבור ×—×™×‘×•×¨×™× ×ž×§×•×ž×™×™×\n"
+
+#: initdb.c:2263
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr ""
+" --auth-host=METHOD\n"
+"שיטת ×ימות ברירת המחדל עבור חיבורי TCP / IP מקומיי×\n"
+
+#: initdb.c:2264
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr ""
+" --auth-local=METHOD\n"
+"שיטת ×ימות ברירת המחדל עבור חיבורי שקע מקומי\n"
+
+#: initdb.c:2265
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr ""
+" [-D, --pgdata=]DATADIR\n"
+"×ž×™×§×•× ×¢×‘×•×¨ ×שכול שלמסד הנתוני×\n"
+
+#: initdb.c:2266
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr ""
+" -E\n"
+" --encoding=ENCODING\n"
+"קידוד שנקבע כברירת מחדל עבור מסדי ×”× ×ª×•× ×™× ×”×—×“×©×™×\n"
+
+#: initdb.c:2267
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE\n"
+"להגדיר הגדרות ×זוריות ברירת המחדל עבור מסדי ×”× ×ª×•× ×™× ×”×—×“×©×™×\n"
+
+#: initdb.c:2268
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=LOCALE\n"
+" --lc-ctype=LOCALE\n"
+" --lc-messages=LOCALE\n"
+" --lc-monetary=LOCALE\n"
+" --lc-numeric=LOCALE\n"
+" --lc\n"
+"מגדיר הגדרות ×זוריות ברירת המחדל בקטרגוריה המת×ימה עבור\n"
+"מסדי ×”× ×ª×•× ×™× ×”×—×“×©×™× (ברירת מחדל נלקחת מהסביבה)\n"
+
+#: initdb.c:2272
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr ""
+" --no-locale\n"
+"מקבילה ל --locale=C\n"
+
+#: initdb.c:2273
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=FILE\n"
+"×œ×§×¨×•× ×¡×™×¡×ž×ª משתמש העל החדש מקובץ\n"
+
+#: initdb.c:2274
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T\n"
+" --text-search-config=CFG\n"
+"תצורת חיפוש טקסט ברירת המחדל\n"
+
+#: initdb.c:2276
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr ""
+" -U,\n"
+" --username=NAME\n"
+"×©× ×©×œ משתמש על מסד הנתוני×\n"
+
+#: initdb.c:2277
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr ""
+" -W\n"
+" --pwprompt\n"
+"בקשה להזנת סיסמת משתמש חדש\n"
+
+#: initdb.c:2278
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" -X\n"
+" --waldir = WALDIR\n"
+"×ž×™×§×•× ×¢×‘×•×¨ ספריית ×”×¨×™×©×•× ×›×ª×™×‘×ª WAL לוגי×\n"
+
+#: initdb.c:2279
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"×פשרויות פחות נפוצות:\n"
+
+#: initdb.c:2280
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr ""
+" -d\n"
+" --debug\n"
+"מפיק פלט מרובה מ×יתור הב××’×™×\n"
+
+#: initdb.c:2281
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr ""
+" -k\n"
+" --data-checksums\n"
+"להשתמש בבדיקות ×¡×™×›×•× ×“×£ נתוני×\n"
+
+#: initdb.c:2282
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr ""
+" -L DIRECTORY\n"
+"×יפה ×œ×ž×¦×•× ×ת קבצי הקלט\n"
+
+#: initdb.c:2283
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr ""
+" -n\n"
+" --no-clean\n"
+"×œ× ×œ× ×§×•×ª ל×חר שגי×ות\n"
+
+#: initdb.c:2284
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N\n"
+" --no-sync\n"
+"×œ× ×œ×—×›×•×ª עד ×שר ×”×©×™× ×•×™×™× ×™×™×›×ª×‘×• בבטחה לדיסק\n"
+
+#: initdb.c:2285
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr ""
+" -s\n"
+" --show \n"
+"הצג הגדרות פנימיות\n"
+
+#: initdb.c:2286
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr ""
+" -S\n"
+" --sync-only\n"
+"לסנכרן ספריית × ×ª×•× ×™× ×‘×œ×‘×“\n"
+
+#: initdb.c:2287
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"×פשרויות נוספות:\n"
+
+#: initdb.c:2288
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V\n"
+" --version\n"
+"להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: initdb.c:2289
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?\n"
+" --help\n"
+"להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: initdb.c:2290
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"×× ×”×¡×¤×¨×™×ª × ×ª×•× ×™× ×œ× ×¦×•×™× ×”, נעשה שימוש במשתנה סביבה PGDATA.\n"
+"\n"
+
+#: initdb.c:2292
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: initdb.c:2300
+msgid ""
+"\n"
+"WARNING: enabling \"trust\" authentication for local connections\n"
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"\n"
+"×זהרה: הפעלת \"×מון\" ×ימות עבור התקשרויות מקומיות\n"
+"ניתן לשנות ×–×ת על-ידי עריכת pg_hba.conf ×ו שימוש ב×פשרות - A, ×ו\n"
+"--auth-local ו --auth-host, בהפעלת initdb הב××”\n"
+
+#: initdb.c:2322
+#, c-format
+msgid "%s: invalid authentication method \"%s\" for \"%s\" connections\n"
+msgstr "תכנית %s: שיטת ×ימות ×œ× ×—×•×§×™×ª \"%s\" עבור ×—×™×‘×•×¨×™× \"%s\"\n"
+
+#: initdb.c:2338
+#, c-format
+msgid ""
+"%s: must specify a password for the superuser to enable %s authentication\n"
+msgstr "תכנית %s: עליך לציין סיסמה עבור משתמש העל על מנת ל×פשר ×ימות %s\n"
+
+#: initdb.c:2366
+#, c-format
+msgid ""
+"%s: no data directory specified\n"
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"תכנית %s: ×œ× ×¦×•×™× ×” תיקיית הנתוני×\n"
+"עליך לציין ×ת התיקייה ×יפה ×”× ×ª×•× ×™× ×¢×‘×•×¨ מערכת מסד ×”× ×ª×•× ×™× ×–×”\n"
+"ימקמו. לעשות ×–×ת ניתן ×¢× ×פשרות -D ×ו\n"
+"להגדיר ×ת משתנה הסביבה PGDATA.\n"
+
+#: initdb.c:2404
+#, c-format
+msgid ""
+"The program \"postgres\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"התוכנית \"postgres\" נדרשת על-ידי %s ×בל ×œ× × ×ž×¦××” \n"
+"ב×ותה ספריה כמו \"%s\".\n"
+"יש לבדוק ×ת ההתקנה שלך.\n"
+
+#: initdb.c:2411
+#, c-format
+msgid ""
+"The program \"postgres\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"התוכנית \"postgres\" נמצ××” על ידי \"%s\"\n"
+"×בל ×œ× ×”×™×™×ª×” מגירסה ×–×”×” כמו %s.\n"
+"יש לבדוק ×ת ההתקנה שלך.\n"
+
+#: initdb.c:2430
+#, c-format
+msgid "%s: input file location must be an absolute path\n"
+msgstr "תכנית %s: ×ž×™×§×•× ×§×•×‘×¥ הקלט חייב להיות נתיב מוחלט\n"
+
+#: initdb.c:2449
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "×”×שכול מסד ×”× ×ª×•× ×™× ×™×ותחל ×¢× ×”×’×“×¨×” ×זורית \"%s\".\n"
+
+#: initdb.c:2452
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"×”×שכול מסד ×”× ×ª×•× ×™× ×™×ותחל ×¢× ×”×’×“×¨×•×ª ×זוריות\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2476
+#, c-format
+msgid "%s: could not find suitable encoding for locale \"%s\"\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×§×™×“×•×“ מת××™× ×¢×‘×•×¨ הגדרות ×זור \"%s\"\n"
+
+#: initdb.c:2478
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "הפעל מחדש ×ת %s ×¢× ×”×פשרות -E.\n"
+
+#: initdb.c:2479 initdb.c:3103 initdb.c:3124
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: initdb.c:2491
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side "
+"encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"קידוד \"%s\" המשתמע בהגדרה ×זורית ×סור ×›×™ קידוד בצד השרת.\n"
+"קידוד ברירת המחדל של מסד ×”× ×ª×•× ×™× ×™×•×’×“×¨ ל \"%s\" במקו×.\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "%s: locale \"%s\" requires unsupported encoding \"%s\"\n"
+msgstr "תכנית %s: הגדרה ×זורית \"%s\" דורשת קידוד ×שר ×œ× × ×ª×ž×š \"%s\"\n"
+
+#: initdb.c:2502
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"קידוד '%s' ×ינו מותר בקידוד בצד השרת.\n"
+"הפעל מחדש ×ת %s ×¢× ×‘×—×™×¨×” של הגדרה ×זורית שונה.\n"
+
+#: initdb.c:2511
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "קידוד ברירת המחדל של מסד ×”× ×ª×•× ×™× ×‘×”×ª×× ×”×•×’×“×¨ ל \"%s\".\n"
+
+#: initdb.c:2582
+#, c-format
+msgid ""
+"%s: could not find suitable text search configuration for locale \"%s\"\n"
+msgstr ""
+"תכנית %s: ×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×ª×¦×•×¨×ª חיפוש טקסט מת××™× ×¢×‘×•×¨ הגדרות ×זור \"%s"
+"\"\n"
+
+#: initdb.c:2593
+#, c-format
+msgid ""
+"%s: warning: suitable text search configuration for locale \"%s\" is "
+"unknown\n"
+msgstr ""
+"תכנית %s: ×זהרה: תצורת חיפוש טקסט מת××™× ×¢×‘×•×¨ הגדרות ×זוריות '%s' ×ינו "
+"ידוע\n"
+
+#: initdb.c:2598
+#, c-format
+msgid ""
+"%s: warning: specified text search configuration \"%s\" might not match "
+"locale \"%s\"\n"
+msgstr ""
+"תכנית %s: ×זהרה: תצורה חיפוש טקסט ×שר צוינה \"%s\" עלולה ×œ× ×œ×”×ª××™× ×œ×”×’×“×¨×•×ª "
+"×זוריות \"%s\"\n"
+
+#: initdb.c:2603
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "תצורת ברירת המחדל של חיפוש טקסט תוגדר \"%s\".\n"
+
+#: initdb.c:2647 initdb.c:2733
+#, c-format
+msgid "creating directory %s ... "
+msgstr "יצירת הספריה %s... "
+
+#: initdb.c:2653 initdb.c:2739 initdb.c:2807 initdb.c:2863
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור תיקייה \"%s\": %s\n"
+
+#: initdb.c:2665 initdb.c:2751
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "תיקון הרש×ות בספריה קיימת %s... "
+
+#: initdb.c:2671 initdb.c:2757
+#, c-format
+msgid "%s: could not change permissions of directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשנות הרש×ות עבור תיקייה \"%s\": %s\n"
+
+#: initdb.c:2686 initdb.c:2772
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "תכנית %s: תיקייה \"%s\" קיימת, ×ך ××™× ×” ריקה\n"
+
+#: initdb.c:2692
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"×× ×‘×¨×¦×•× ×š ליצור מערכת מסד × ×ª×•× ×™× ×—×“×©, הסר ×ו לרוקן ×ת הספריה\n"
+"\"%s\" ×ו להפעיל ×ת %s\n"
+"×¢× ×רגומנט ש×ינו \"%s\".\n"
+
+#: initdb.c:2700 initdb.c:2785 initdb.c:3137
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לגשת לתיקייה \"%s\": %s\n"
+
+#: initdb.c:2724
+#, c-format
+msgid "%s: WAL directory location must be an absolute path\n"
+msgstr "תכנית %s: ×”×ž×™×§×•× ×”×ª×™×§×™×™×” עבור WAL חייב להיות נתיב מוחלט\n"
+
+#: initdb.c:2778
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory\n"
+"\"%s\".\n"
+msgstr ""
+"×× ×‘×¨×¦×•× ×š ל×חסן ×ת WAL ש×, הסר ×ו לרוקן ×ת הספריה\n"
+"\"%s\"\n"
+
+#: initdb.c:2793
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ליצור קישור סמלי \"%s\": %s\n"
+
+#: initdb.c:2798
+#, c-format
+msgid "%s: symlinks are not supported on this platform"
+msgstr "תכנית %s: ×§×™×©×•×¨×™× ×¡×™×ž×‘×•×œ×™×™× ××™× × × ×ª×ž×›×™× ×‘×¤×œ×˜×¤×•×¨×ž×” זו"
+
+#: initdb.c:2822
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point.\n"
+msgstr ""
+"×”×•× ×ž×›×™×œ קובץ שר מתחיל בנקודה/בלתי-נר××”, ×ולי עקב היותו נקודת ×¢×’×™× ×”.\n"
+
+#: initdb.c:2825
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr "×”×•× ×ž×›×™×œ תיקייה ×בדות ומצי×ות, ×ולי עקב היותו נקודת ×¢×’×™× ×”.\n"
+
+#: initdb.c:2828
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"ב×מצעות נקודת ×¢×’×™× ×” ישירות כספריית ×”× ×ª×•× ×™× ×ינו מומלץ.\n"
+"יש ליצור ספריית משנה תחת נקודת עגינה .\n"
+
+#: initdb.c:2848
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "יצירת ספריות משנה... "
+
+#: initdb.c:2895
+msgid "performing post-bootstrap initialization ... "
+msgstr "מבצע ×יניצי×ליזציה של×חר ×”×תחול... "
+
+#: initdb.c:3047
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "פועל במצב ×יתור ב××’×™×.\n"
+
+#: initdb.c:3051
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "פועל במצב no-clean. טעויות ×œ× ×™× ×•×§×•.\n"
+
+#: initdb.c:3122
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "תכנית %s: יותר מדי ××¨×’×•×ž× ×˜×™× ×©×œ שורת הפקודה (הר×שון ×”×•× \"%s\")\n"
+
+#: initdb.c:3142 initdb.c:3208
+msgid "syncing data to disk ... "
+msgstr "סינכרון × ×ª×•× ×™× ×‘×“×™×¡×§... "
+
+#: initdb.c:3151
+#, c-format
+msgid "%s: password prompt and password file cannot be specified together\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לציין ×ת דרישת הסיסמה ממשתמש ו×ת קובץ הסיסמה יחד\n"
+
+#: initdb.c:3175
+#, c-format
+msgid ""
+"%s: superuser name \"%s\" is disallowed; role names cannot begin with \"pg_"
+"\"\n"
+msgstr ""
+"תכנית %s: משתמש על ×‘×©× \"%s\" מוגדר ×›×סור; שמות ×”×ª×¤×§×™×“×™× ××™× × ×™×›×•×œ×™× "
+"להתחיל מ\"pg_\"\n"
+
+#: initdb.c:3179
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"×”×§×‘×¦×™× ×”×©×™×™×›×™× ×œ×ž×¡×“ × ×ª×•× ×™× ×–×” יהיו בבעלות המשתמש \"%s\".\n"
+"תהליך השרת ×™×”×™×” בבעלות של משתמש ×–×” ×’× .\n"
+"\n"
+
+#: initdb.c:3195
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "בדיקת דף ×”× ×ª×•× ×™× ×–×ž×™× ×”.\n"
+
+#: initdb.c:3197
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "בדיקת דף ×”× ×ª×•× ×™× ××™× ×” זמינה.\n"
+
+#: initdb.c:3214
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"דילוג על סנכרון לדיסק.\n"
+"הספרית ×”× ×ª×•× ×™× ×¢×œ×•×œ×” להפוך למושחתת ×× ×ž×¢×¨×›×ª ההפעלה תקרוס.\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3240
+msgid "logfile"
+msgstr "יומן"
+
+#: initdb.c:3242
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"הצלחה. עכשיו ×תה יכול להפעיל ×ת שרת מסד ×”× ×ª×•× ×™× ×‘×מצעות:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/it.po b/src/bin/initdb/po/it.po
new file mode 100644
index 0000000..3a3b764
--- /dev/null
+++ b/src/bin/initdb/po/it.po
@@ -0,0 +1,1168 @@
+#
+# initdb.po
+# Italian message translation file for initdb
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+# Flavio Spada <flavio.spada@itpug.org>, 2010
+# Ottavio Campana <campana@oc-si.it>, 2007.
+# Fabrizio Mazzoni <veramente@libero.it>, 2003.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2023-09-05 07:54+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "impossibile identificare la directory corrente: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: initdb.c:334
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "fsync del file \"%s\" fallito: %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "non è stato possibile rinominare il file \"%s\" in \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "impossibile caricare la libreria \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "impossibile aprire il token di processo: codice di errore %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "impossibile allocare i SID: codice di errore %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "impossibile creare token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "impossibile rieseguire con token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "impossibile rimuovere il file o la directory \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "impossibile cercare l'ID utente effettivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utente non esiste"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ricerca del nome utente fallita: codice di errore %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "il processo figlio è stato terminato dal segnale %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "non è stato possibile impostare la giunzione per \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "non è stato possibile ottenere la giunzione per \"%s\": %s\n"
+
+#: initdb.c:464 initdb.c:1459
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "apertura del file \"%s\" in lettura fallita: %m"
+
+#: initdb.c:505 initdb.c:809 initdb.c:829
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "apertura del file \"%s\" in scrittura fallita: %m"
+
+#: initdb.c:509 initdb.c:812 initdb.c:831
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: initdb.c:513
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: initdb.c:529
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "esecuzione del comando \"%s\" fallita: %m"
+
+#: initdb.c:547
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "rimozione della directory dei dati \"%s\""
+
+#: initdb.c:549
+#, c-format
+msgid "failed to remove data directory"
+msgstr "impossibile rimuovere la directory dei dati"
+
+#: initdb.c:553
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "rimozione del contenuto della directory dei dati \"%s\""
+
+#: initdb.c:556
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "impossibile rimuovere il contenuto della directory dei dati"
+
+#: initdb.c:561
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "rimozione della directory WAL \"%s\""
+
+#: initdb.c:563
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "impossibile rimuovere la directory WAL"
+
+#: initdb.c:567
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "rimozione del contenuto della directory WAL \"%s\""
+
+#: initdb.c:569
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "impossibile rimuovere il contenuto della directory WAL"
+
+#: initdb.c:576
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directory dati \"%s\" non rimossa su richiesta dell'utente"
+
+#: initdb.c:580
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "Directory WAL \"%s\" non rimossa su richiesta dell'utente"
+
+#: initdb.c:598
+#, c-format
+msgid "cannot be run as root"
+msgstr "non può essere eseguito come root"
+
+#: initdb.c:599
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Effettua il login (usando, ad esempio, \"su\") come utente (senza privilegi) che sarà proprietario del processo del server."
+
+#: initdb.c:631
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" non è un nome di codifica del server valido"
+
+#: initdb.c:775
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "il file \"%s\" non esiste"
+
+#: initdb.c:776 initdb.c:781 initdb.c:788
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Ciò potrebbe significare che hai un'installazione danneggiata o che hai identificato la directory errata con l'opzione di chiamata -L."
+
+#: initdb.c:780
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "accesso al file \"%s\" fallito: %m"
+
+#: initdb.c:787
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "il file \"%s\" non è un file normale"
+
+#: initdb.c:922
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "selezione dell'implementazione della memoria dinamica ... "
+
+#: initdb.c:931
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "selezione del parametro max_connections predefinito ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "selezione di shared_buffers predefinito ... "
+
+#: initdb.c:996
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "selezione del fuso orario predefinito... "
+
+#: initdb.c:1030
+msgid "creating configuration files ... "
+msgstr "creazione dei file di configurazione ... "
+
+#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "impossibile modificare le autorizzazioni di \"%s\": %m"
+
+#: initdb.c:1319
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "esecuzione dello script di bootstrap ... "
+
+#: initdb.c:1331
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "il file di input \"%s\" non appartiene a PostgreSQL %s"
+
+#: initdb.c:1333
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Specificare il percorso corretto utilizzando l'opzione -L."
+
+#: initdb.c:1437
+msgid "Enter new superuser password: "
+msgstr "Inserisci la nuova password del superutente: "
+
+#: initdb.c:1438
+msgid "Enter it again: "
+msgstr "Conferma password: "
+
+#: initdb.c:1441
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Le password non corrispondono.\n"
+
+#: initdb.c:1465
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "impossibile leggere la password dal file \"%s\": %m"
+
+#: initdb.c:1468
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "il file della password \"%s\" è vuoto"
+
+#: initdb.c:1915
+#, c-format
+msgid "caught signal\n"
+msgstr "intercettato segnale\n"
+
+#: initdb.c:1921
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "scrittura verso il processo figlio fallita: %s\n"
+
+#: initdb.c:1929
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2018
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() non è riuscito"
+
+#: initdb.c:2036
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "impossibile ripristinare la vecchia lingua \"%s\""
+
+#: initdb.c:2043
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nome locale \"%s\" non valido"
+
+#: initdb.c:2054
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "impostazioni locali non valide; controlla le variabili di ambiente LANG e LC_*"
+
+#: initdb.c:2080 initdb.c:2104
+#, c-format
+msgid "encoding mismatch"
+msgstr "mancata corrispondenza della codifica"
+
+#: initdb.c:2081
+#, 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 "La codifica selezionata (%s) e la codifica utilizzata dalla locale selezionata (%s) non corrispondono. Ciò comporterebbe un comportamento scorretto in varie funzioni di elaborazione delle stringhe di caratteri."
+
+#: initdb.c:2086 initdb.c:2107
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Riesegui %s e non specificare una codifica in modo esplicito oppure scegli una combinazione corrispondente."
+
+#: initdb.c:2105
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "La codifica selezionata (%s) non è supportata dal provider di terapia intensiva."
+
+#: initdb.c:2169
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "È necessario specificare la lingua dell'ICU"
+
+#: initdb.c:2176
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU non supportato in questo build"
+
+#: initdb.c:2187
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inizializza un cluster di database PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2188
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: initdb.c:2189
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPZIONE]... [DATADIR]\n"
+
+#: initdb.c:2190
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: initdb.c:2191
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr ""
+" -A, --auth=METODO metodo di autenticazione predefinito per le\n"
+" connessioni locali\n"
+
+#: initdb.c:2192
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr ""
+" --auth-host=METODO metodo di autenticazione predefinito per le\n"
+" connessioni TCP/IP\n"
+
+#: initdb.c:2193
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr ""
+" --auth-local=METODO metodo di autenticazione predefinito per le\n"
+" connessioni locali\n"
+
+#: initdb.c:2194
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR dove creare questo cluster di database\n"
+
+#: initdb.c:2195
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr ""
+" -E, --encoding=ENCODING imposta la codifica predefinita per i nuovi\n"
+" database\n"
+
+#: initdb.c:2196
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access permette read/execute di gruppo sulla directory dati\n"
+
+#: initdb.c:2197
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE imposta l'ID locale ICU per i nuovi database\n"
+
+#: initdb.c:2198
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums usa i checksum delle pagine dati\n"
+
+#: initdb.c:2199
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE imposta il locale predefinito per i nuovi\n"
+" database\n"
+
+#: initdb.c:2200
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" inizializza il nuovo cluster di database con il\n"
+" locale specificato nella categoria corrispondente.\n"
+" Il valore predefinito viene preso dalle variabili\n"
+" d'ambiente\n"
+
+#: initdb.c:2204
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale equivalente a --locale=C\n"
+
+#: initdb.c:2205
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" impostare il provider delle impostazioni locali predefinito per i nuovi database\n"
+
+#: initdb.c:2207
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE leggi la password per il nuovo superutente dal file\n"
+
+#: initdb.c:2208
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" configurazione predefinita per la ricerca di testo\n"
+
+#: initdb.c:2210
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NOME nome del superutente del database\n"
+
+#: initdb.c:2211
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt richiedi la password per il nuovo superutente\n"
+
+#: initdb.c:2212
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR locazione della la directory di write-ahead log\n"
+
+#: initdb.c:2213
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE dimensioni dei segmenti WAL, in megabyte\n"
+
+#: initdb.c:2214
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Opzioni utilizzate meno frequentemente:\n"
+
+#: initdb.c:2215
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug genera molto output di debug\n"
+
+#: initdb.c:2216
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches imposta debug_discard_caches=1\n"
+
+#: initdb.c:2217
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY dove trovare i file di input\n"
+
+#: initdb.c:2218
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean non ripulire dopo gli errori\n"
+
+#: initdb.c:2219
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync non aspettare che i dati siano scritti con sicurezza\n"
+" sul disco\n"
+
+#: initdb.c:2220
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions non stampa le istruzioni per i passaggi successivi\n"
+
+#: initdb.c:2221
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show mostra le impostazioni interne\n"
+
+#: initdb.c:2222
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only only sync database files to disk, then exit\n"
+
+#: initdb.c:2223
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Altre opzioni:\n"
+
+#: initdb.c:2224
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: initdb.c:2225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: initdb.c:2226
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Se la directory dati non è specificata, viene usata la variabile\n"
+"d'ambiente PGDATA.\n"
+
+#: initdb.c:2228
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: initdb.c:2229
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: initdb.c:2257
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "metodo di autenticazione \"%s\" non valido per le connessioni \"%s\""
+
+#: initdb.c:2271
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "deve specificare una password per il superutente per abilitare l'autenticazione della password"
+
+#: initdb.c:2290
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: initdb.c:2291
+#, 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 "È necessario identificare la directory in cui risiedono i dati per questo sistema di database. Fallo con l'opzione di chiamata -D o la variabile di ambiente PGDATA."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not set environment"
+msgstr "non è stato possibile impostare l'ambiente"
+
+#: initdb.c:2326
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: initdb.c:2329
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: initdb.c:2344
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "il percorso del file di input deve essere un percorso assoluto"
+
+#: initdb.c:2361
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Il cluster di database sarà inizializzato con il locale \"%s\".\n"
+
+#: initdb.c:2364
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Il cluster di database verrà inizializzato con questa configurazione locale:\n"
+
+#: initdb.c:2365
+#, c-format
+msgid " provider: %s\n"
+msgstr " fornitore: %s\n"
+
+#: initdb.c:2367
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " Locale ICU: %s\n"
+
+#: initdb.c:2368
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+"LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGGI: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2385
+#, c-format
+msgid "The default database encoding has been set to \"%s\".\n"
+msgstr "La codifica del database predefinita è stata impostata su \"%s\".\n"
+
+#: initdb.c:2397
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "non è stato possibile trovare la codifica adatta per la locale \"%s\""
+
+#: initdb.c:2399
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Riesegui %s con l'opzione -E."
+
+#: initdb.c:2400 initdb.c:3021 initdb.c:3041
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: initdb.c:2412
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"La codifica \"%s\" implicata dal locale non è consentita come codifica lato server.\n"
+"La codifica predefinita dei database sarà impostata invece a \"%s\".\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "la lingua \"%s\" richiede una codifica non supportata \"%s\""
+
+#: initdb.c:2419
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "La codifica \"%s\" non è consentita come codifica lato server."
+
+#: initdb.c:2421
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Riesegui %s con una selezione di locale diversa."
+
+#: initdb.c:2429
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "La codifica predefinita del database è stata impostata a \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "non è stato possibile trovare una configurazione di ricerca del testo adatta per la locale \"%s\""
+
+#: initdb.c:2509
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "la configurazione di ricerca del testo adatta per la locale \"%s\" è sconosciuta"
+
+#: initdb.c:2514
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "la configurazione di ricerca del testo specificata \"%s\" potrebbe non corrispondere alla locale \"%s\""
+
+#: initdb.c:2519
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "La configurazione predefinita di ricerca testo sarà impostata a \"%s\".\n"
+
+#: initdb.c:2562 initdb.c:2633
+#, c-format
+msgid "creating directory %s ... "
+msgstr "creazione della directory %s ... "
+
+#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: initdb.c:2576 initdb.c:2648
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "correzione dei permessi sulla directory esistente %s ... "
+
+#: initdb.c:2581 initdb.c:2653
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "impossibile modificare i permessi della directory \"%s\": %m"
+
+#: initdb.c:2593 initdb.c:2665
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "la directory \"%s\" esiste ma non è vuota"
+
+#: initdb.c:2597
+#, 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 "Se vuoi creare un nuovo sistema di database, rimuovi o svuota la directory \"%s\" oppure esegui %s con un argomento diverso da \"%s\"."
+
+#: initdb.c:2605 initdb.c:2675 initdb.c:3058
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "accesso alla directory \"%s\" fallito: %m"
+
+#: initdb.c:2626
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "Il percorso della directory WAL deve essere un percorso assoluto"
+
+#: initdb.c:2669
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Se vuoi archiviare il WAL lì, rimuovi o svuota la directory \"%s\"."
+
+#: initdb.c:2680
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "creazione del link simbolico \"%s\" fallita: %m"
+
+#: initdb.c:2683
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "i collegamenti simbolici non sono supportati su questa piattaforma"
+
+#: initdb.c:2702
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Contiene un file con prefisso punto/invisibile, forse perché è un punto di montaggio."
+
+#: initdb.c:2704
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Contiene una directory persa + trovata, forse a causa del fatto che è un punto di montaggio."
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Non è consigliabile utilizzare un punto di montaggio direttamente come directory dei dati.\n"
+"Crea una sottodirectory sotto il punto di montaggio."
+
+#: initdb.c:2732
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "creazione delle sottodirectory ... "
+
+#: initdb.c:2775
+msgid "performing post-bootstrap initialization ... "
+msgstr "esecuzione dell'inizializzazione successiva al bootstrap ... "
+
+#: initdb.c:2940
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Esecuzione in modalità debug\n"
+
+#: initdb.c:2944
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Esecuzione in modalità senza pulizia. Gli errori non verranno ripuliti.\n"
+
+#: initdb.c:3014
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "provider locale non riconosciuto: %s"
+
+#: initdb.c:3039
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: initdb.c:3046
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s non può essere specificato a meno che non venga scelto il provider di impostazioni locali \"%s\""
+
+#: initdb.c:3060 initdb.c:3137
+msgid "syncing data to disk ... "
+msgstr "sincronizzazione dati sul disco ... "
+
+#: initdb.c:3068
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "la richiesta della password e il file della password non possono essere specificati insieme"
+
+#: initdb.c:3090
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argomento di --wal-segsize deve essere un numero"
+
+#: initdb.c:3092
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argomento di --wal-segsize deve essere una potenza di 2 tra 1 e 1024"
+
+#: initdb.c:3106
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "il nome del superutente \"%s\" non è consentito; i nomi dei ruoli non possono iniziare con \"pg_\""
+
+#: initdb.c:3108
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"I file di questo database apparterranno all'utente \"%s\".\n"
+"Questo utente deve inoltre possedere il processo server.\n"
+"\n"
+
+#: initdb.c:3124
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "La somma di controllo dei dati delle pagine è abilitata.\n"
+
+#: initdb.c:3126
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "La somma di controllo dei dati delle pagine è disabilitata.\n"
+
+#: initdb.c:3143
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Sync sul disco saltato.\n"
+"La directory dei dati potrebbe diventare corrotta in caso di crash del sistema operativo.\n"
+
+#: initdb.c:3148
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "abilitare l'autenticazione \"trust\" per le connessioni locali"
+
+#: initdb.c:3149
+#, 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 "Puoi cambiarlo modificando pg_hba.conf o usando l'opzione -A, o --auth-local e --auth-host, la prossima volta che esegui initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3179
+msgid "logfile"
+msgstr "file_log"
+
+#: initdb.c:3181
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Successo. Ora puoi avviare il server database con:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: accesso alla directory \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s: accesso al file \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: creazione del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s: esecuzione del comando \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: fsync del file \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: errore nell'apertura del file \"%s\" per la lettura: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for writing: %s\n"
+#~ msgstr "%s: errore nell'apertura del file \"%s\" per la scrittura: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile rinominare il file \"%s\" in \"%s\": %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile ottenere informazioni sul file \"%s\": %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: errore nella scrittura del file \"%s\": %s\n"
+
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s: il file \"%s\" non esiste\n"
+
+#~ msgid ""
+#~ "%s: input file \"%s\" does not belong to PostgreSQL %s\n"
+#~ "Check your installation or specify the correct path using the option -L.\n"
+#~ msgstr ""
+#~ "%s: il file di input \"%s\" non appartiene a PostgreSQL %s\n"
+#~ "Controlla la correttezza dell'installazione oppure specifica\n"
+#~ "il percorso corretto con l'opzione -L.\n"
+
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s: nome locale non valido \"%s\"\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: memoria esaurita\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"postgres\" è richiesto da %s ma non è stato trovato\n"
+#~ "nella stessa directory \"%s\".\n"
+#~ "Verifica la correttezza dell'installazione.\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"postgres\" è stato trovato da \"%s\"\n"
+#~ "ma non ha la stessa versione di %s.\n"
+#~ "Verifica la correttezza dell'installazione.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "could not stat file or directory \"%s\": %s\n"
+#~ msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %s\n"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
diff --git a/src/bin/initdb/po/ja.po b/src/bin/initdb/po/ja.po
new file mode 100644
index 0000000..dc943b5
--- /dev/null
+++ b/src/bin/initdb/po/ja.po
@@ -0,0 +1,1053 @@
+# Japanese message translation file for initdb
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-30 09:20+0900\n"
+"PO-Revision-Date: 2023-08-30 09:53+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ä¸æ­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行ã™ã‚‹\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "プロセストークンをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "制é™ä»˜ãトークンを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "コマンド\"%s\"ã®ãŸã‚ã®ãƒ—ロセスを起動ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "制é™ä»˜ãトークンã§å†å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ: %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "サブプロセスã®çµ‚了コードをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "実効ユーザーID %ld ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ユーザーåã®å‚ç…§ã«å¤±æ•—: エラーコード %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "コマンドã¯å®Ÿè¡Œå½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­ãƒ—ロセスãŒçµ‚了コード%dã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­ãƒ—ロセスãŒä¾‹å¤–0x%Xã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­ãƒ—ロセスã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­ãƒ—ロセスãŒæœªçŸ¥ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹%dã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\"ã®junctionを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\"ã®junctionを入手ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "ファイル\"%s\"を書ãè¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "データディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™"
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "データディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "データディレクトリ\"%s\"ã®å†…容を削除ã—ã¦ã„ã¾ã™"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "データディレクトリã®å†…容ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™"
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL ディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"ã®ä¸­èº«ã‚’削除ã—ã¦ã„ã¾ã™"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL ディレクトリã®ä¸­èº«ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Šãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Š WAL ディレクトリ\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "root ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "サーãƒãƒ¼ãƒ—ロセスã®æ‰€æœ‰è€…ã¨ãªã‚‹(éžç‰¹æ¨©)ユーザーã¨ã—ã¦(例ãˆã°\"su\"を使用ã—ã¦)ログインã—ã¦ãã ã•ã„。"
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\"ã¯æœ‰åŠ¹ãªã‚µãƒ¼ãƒãƒ¼ç¬¦å·åŒ–æ–¹å¼åã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "ファイル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, 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:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "ファイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "ファイル\"%s\"ã¯é€šå¸¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "動的共有メモリã®å®Ÿè£…ã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "デフォルトã®max_connectionsã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "デフォルトã®shared_buffersã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "デフォルトã®æ™‚間帯をé¸æŠžã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "設定ファイルを作æˆã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\"ã®æ¨©é™ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "ブートストラップスクリプトを実行ã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "入力ファイル\"%s\"㯠PostgreSQL %s ã®ã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "-Lオプションを使用ã—ã¦æ­£ã—ã„パスを指定ã—ã¦ãã ã•ã„。"
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "æ–°ã—ã„スーパーユーザーã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„:"
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "å†å…¥åŠ›ã—ã¦ãã ã•ã„:"
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“。\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "ファイル\"%s\"ã‹ã‚‰ãƒ‘スワードを読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "パスワードファイル\"%s\"ãŒç©ºã§ã™"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "シグナルãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "å­ãƒ—ロセスã¸ã®æ›¸ãè¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale()ãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "å¤ã„ロケール\"%s\"を復元ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ロケールå\"%s\"ã¯ä¸æ­£ã§ã™"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "ロケールåãŒICU特有ã®ã‚‚ã®ã§ã‚ã‚‹å ´åˆã¯ã€--icu-localeを使用ã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ä¸æ­£ãªãƒ­ã‚±ãƒ¼ãƒ«è¨­å®š; 環境変数LANGãŠã‚ˆã³LC_* を確èªã—ã¦ãã ã•ã„"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "符å·åŒ–æ–¹å¼ãŒåˆã„ã¾ã›ã‚“"
+
+#: initdb.c:2204
+#, 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:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "%sã‚’å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„ã€ãã®éš›ã«ã¯ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’明示的ã«æŒ‡å®šã—ãªã„ã‹ã€é©åˆã™ã‚‹çµ„ã¿åˆã‚ã›ã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "指定ã•ã‚ŒãŸç¬¦å·åŒ–æ–¹å¼(%s)ã¯ICUプロãƒã‚¤ãƒ€ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“。"
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "ロケールå\"%s\"ã‚’ã€è¨€èªžã‚¿ã‚°ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ã“ã®ãƒ“ルドã§ã¯ICUã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "ロケール\"%s\"ã‹ã‚‰è¨€èªžã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "ロケール\"%s\"ã¯æœªçŸ¥ã®è¨€èªž\"%s\"ã‚’å«ã‚“ã§ã„ã¾ã™"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICUロケールã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "ICUロケール\"%s\"ã«å¯¾ã—ã¦è¨€èªžã‚¿ã‚°\"%s\"を使用ã—ã¾ã™ã€‚\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%sã¯PostgreSQLデータベースクラスタをåˆæœŸåŒ–ã—ã¾ã™ã€‚\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD ローカル接続ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆèªè¨¼æ–¹å¼\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD ローカルTCP/IP接続ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆèªè¨¼æ–¹å¼\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD ローカルソケット接続ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆèªè¨¼æ–¹å¼\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR データベースクラスタã®å ´æ‰€\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING æ–°è¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆç¬¦å·åŒ–æ–¹å¼\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access データディレクトリã®ã‚°ãƒ«ãƒ¼ãƒ—読ã¿å–ã‚Š/実行を許å¯\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE æ–°ã—ã„データベースã®ICUロケールIDを設定\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=RULES æ–°ã—ã„データベースã«è¿½åŠ ã™ã‚‹ICUç…§åˆé †åºãƒ«ãƒ¼ãƒ«(群)\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums データページã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE æ–°ã—ã„データベースã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ­ã‚±ãƒ¼ãƒ«ã‚’セット\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=ロケールå\n"
+" --lc-monetary, --lc-numeric, --lc-time=ロケールå\n"
+" æ–°ã—ã„データベースã§ä½¿ç”¨ã™ã‚‹ã€ãŠã®ãŠã®ã®ã‚«ãƒ†ã‚´ãƒªã®\n"
+" デフォルトロケールを設定(デフォルト値ã¯ç’°å¢ƒå¤‰æ•°ã‹ã‚‰\n"
+" å–å¾—)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale --locale=C ã¨åŒã˜\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" æ–°ã—ã„データベースã«ãŠã‘るデフォルトã®ãƒ­ã‚±ãƒ¼ãƒ«\n"
+" プロãƒã‚¤ãƒ€ã‚’設定\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=ファイルå æ–°ã—ã„スーパーユーザーã®ãƒ‘スワードをファイルã‹ã‚‰\n"
+" 読ã¿è¾¼ã‚€\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\\\n"
+" デフォルトã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®š\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME データベースã®ã‚¹ãƒ¼ãƒ‘ーユーザーã®åå‰\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt æ–°è¦ã‚¹ãƒ¼ãƒ‘ーユーザーã«å¯¾ã—ã¦ãƒ‘スワード入力を促ã™\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR 先行書ãè¾¼ã¿ãƒ­ã‚°ç”¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä½ç½®\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WALセグメントã®ã‚µã‚¤ã‚ºã€ãƒ¡ã‚¬ãƒã‚¤ãƒˆå˜ä½\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"使用頻度ã®ä½Žã„オプション:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=VALUE サーãƒãƒ¼ãƒ‘ラメータã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’上書ã設定\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug 多ãã®ãƒ‡ãƒãƒƒã‚°ç”¨ã®å‡ºåŠ›ã‚’生æˆ\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_cachesã‚’1ã«è¨­å®šã™ã‚‹\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 入力ファイルã®å ´æ‰€ã‚’指定\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean エラー発生後ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã‚’è¡Œã‚ãªã„\n"
+
+#: initdb.c:2461
+#, 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:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions 次ã®æ‰‹é †ã®æŒ‡ç¤ºã‚’表示ã—ãªã„\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 内部設定を表示\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only データベースファイルã®syncã®ã¿ã‚’実行ã—ã¦çµ‚了\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"ãã®ä»–ã®ã‚ªãƒ—ション:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"データディレクトリãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€PGDATA環境変数ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "\"%2$s\"接続ã§ã¯èªè¨¼æ–¹å¼\"%1$s\"ã¯ç„¡åŠ¹ã§ã™"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "パスワードèªè¨¼ã‚’有効ã«ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã®ãƒ‘スワードを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: initdb.c:2533
+#, 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:2550
+#, c-format
+msgid "could not set environment"
+msgstr "環境を設定ã§ãã¾ã›ã‚“"
+
+#: initdb.c:2568
+#, 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:2571
+#, 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:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "入力ファイルã®å ´æ‰€ã¯çµ¶å¯¾ãƒ‘スã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "データベースクラスタã¯ãƒ­ã‚±ãƒ¼ãƒ«\"%s\"ã§åˆæœŸåŒ–ã•ã‚Œã¾ã™ã€‚\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "データベースクラスタã¯ä»¥ä¸‹ã®ãƒ­ã‚±ãƒ¼ãƒ«æ§‹æˆã§åˆæœŸåŒ–ã•ã‚Œã¾ã™ã€‚\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " プロãƒã‚¤ãƒ€: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICUロケール: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "ロケール\"%s\"ã«å¯¾ã—ã¦é©åˆ‡ãªç¬¦å·åŒ–æ–¹å¼ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "-Eオプションを付ã‘ã¦%sã‚’å†å®Ÿè¡Œã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"ロケールã«ã‚ˆã‚Šæš—黙的ã«æŒ‡å®šã•ã‚Œã‚‹ç¬¦å·åŒ–æ–¹å¼\"%s\"ã¯ã‚µãƒ¼ãƒãƒ¼å´ã®\n"
+"符å·åŒ–æ–¹å¼ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。\n"
+"デフォルトã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç¬¦å·åŒ–æ–¹å¼ã¯ä»£ã‚ã‚Šã«\"%s\"ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "ロケール\"%s\"ã¯éžã‚µãƒãƒ¼ãƒˆã®ç¬¦å·åŒ–æ–¹å¼\"%s\"ã‚’å¿…è¦ã¨ã—ã¾ã™"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "符å·åŒ–æ–¹å¼\"%s\"ã¯ã‚µãƒ¼ãƒãƒ¼å´ã®ç¬¦å·åŒ–æ–¹å¼ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。"
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "別ã®ãƒ­ãƒ¼ã‚±ãƒ«ã‚’é¸æŠžã—ã¦%sã‚’å†å®Ÿè¡Œã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "デフォルトã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç¬¦å·åŒ–æ–¹å¼ã¯ãã‚Œã«å¯¾å¿œã—ã¦%sã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "ロケール\"%s\"用ã®é©åˆ‡ãªãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "ロケール\"%s\"ã«é©ã—ãŸãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šãŒä¸æ˜Žã§ã™"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "指定ã—ãŸãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®š\"%s\"ãŒãƒ­ã‚±ãƒ¼ãƒ«\"%s\"ã«åˆã‚ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "デフォルトã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢æ§‹æˆã¯ %s ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "ディレクトリ%sを作æˆã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "ディレクトリ%sã®æ¨©é™ã‚’設定ã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: initdb.c:2840
+#, 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:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL ディレクトリã®ä½ç½®ã¯ã€çµ¶å¯¾ãƒ‘スã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "ãã“ã«WALã‚’æ ¼ç´ã—ãŸã„å ´åˆã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã™ã‚‹ã‹ç©ºã«ã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "ãŠãらãマウントãƒã‚¤ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã«èµ·å› ã—ãŸå…ˆé ­ãŒãƒ‰ãƒƒãƒˆã§ã‚るファイルã€ã¾ãŸã¯ä¸å¯è¦–ãªãƒ•ã‚¡ã‚¤ãƒ«ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "ãŠãらãマウントãƒã‚¤ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã«èµ·å› ã—ãŸlost+foundディレクトリãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"マウントãƒã‚¤ãƒ³ãƒˆã§ã‚るディレクトリをデータディレクトリã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ãŠå‹§ã‚ã—ã¾ã›ã‚“。\n"
+"ã“ã®ä¸‹ã«ã‚µãƒ–ディレクトリを作æˆã—ã¦ãã ã•ã„。"
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "サブディレクトリを作æˆã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "ブートストラップ後ã®åˆæœŸåŒ–を実行ã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %sã¯å€¤ãŒå¿…è¦ã§ã™"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã§å®Ÿè¡Œã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "no-clean モードã§å®Ÿè¡Œã—ã¦ã„ã¾ã™ã€‚失敗ã—ãŸçŠ¶æ³ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“。\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "èªè­˜ã§ããªã„ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "ロケールプロãƒã‚¤ãƒ€\"%2$s\"ãŒé¸æŠžã•ã‚Œã¦ã„ãªã‘ã‚Œã°%1$sã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "データをディスクã«åŒæœŸã—ã¦ã„ã¾ã™ ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "パスワードプロンプトã¨ãƒ‘スワードファイルã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize ã®å¼•æ•°ã¯æ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize ã®ãƒ‘ラメータã¯1ã‹ã‚‰1024ã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "スーパーユーザーå\"%s\"ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“; ロールåã¯\"pg_\"ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"データベースシステム内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‰€æœ‰è€…ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ãªã‚Šã¾ã™ã€‚\n"
+"ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’サーãƒãƒ¼ãƒ—ロセスã®æ‰€æœ‰è€…ã¨ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "データページã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æœ‰åŠ¹ã§ã™ã€‚\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "データベージã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯ç„¡åŠ¹ã§ã™ã€‚\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"ディスクã¸ã®åŒæœŸãŒã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã—ãŸã€‚\n"
+"オペレーティングシステムãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ãŸå ´åˆãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ç ´æã•ã‚Œã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ローカル接続ã«å¯¾ã—ã¦\"trust\"èªè¨¼ã‚’有効ã«ã—ã¾ã™ "
+
+#: initdb.c:3416
+#, 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:3446
+msgid "logfile"
+msgstr "ログファイル"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"æˆåŠŸã—ã¾ã—ãŸã€‚以下ã®ã‚ˆã†ã«ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã‚’èµ·å‹•ã§ãã¾ã™:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/ka.po b/src/bin/initdb/po/ka.po
new file mode 100644
index 0000000..30bf00c
--- /dev/null
+++ b/src/bin/initdb/po/ka.po
@@ -0,0 +1,1056 @@
+# Georgian message translation file for initdb
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-31 20:20+0000\n"
+"PO-Revision-Date: 2023-09-02 07:09+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "„%s“ ბრძáƒáƒœáƒ”ბის პრáƒáƒªáƒ”სის დáƒáƒ¬áƒ§áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შესრულებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ბრძáƒáƒœáƒ”ბრგáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•áƒ”"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\"-ისთვის შეერთების დáƒáƒ§áƒ”ნებრვერ მáƒáƒ®áƒ”რხდáƒ: %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\"-ისთვის შეერთების მიღებრვერ მáƒáƒ®áƒ”რხდáƒ: %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\""
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ \"%s\""
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\""
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "root-ით ვერ გáƒáƒ”შვებáƒ"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "შედით (áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"su\") áƒáƒ áƒáƒžáƒ áƒ˜áƒ•áƒ˜áƒšáƒ”გირებული მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით, რáƒáƒ›áƒ”ლიც სერვერს პრáƒáƒªáƒ”სის მფლáƒáƒ‘ელი იქნებáƒ."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" კáƒáƒ“ირების სწáƒáƒ  სáƒáƒ®áƒ”ლს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, 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:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "ფáƒáƒ˜áƒš \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "დინáƒáƒ›áƒ˜áƒ™áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების იმპლემენტáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "ნáƒáƒ’ულისხმები max_connections-ის áƒáƒ áƒ©áƒ”ვრ… "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "ნáƒáƒ’ულისხმები shared_buffers-ის áƒáƒ áƒ©áƒ”ვრ… "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "დრáƒáƒ˜áƒ¡ ნáƒáƒ’ულისხმები სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრ… "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის შექმნრ… "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\"-ის წვდáƒáƒ›áƒ”ბის შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "მáƒáƒ¡áƒáƒ›áƒ–áƒáƒ“ებელი სკრიპტის გáƒáƒ¨áƒ•áƒ”ბრ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\" PostgreSQL %s -ს áƒáƒ  ეკუთვნის"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "მიუთითეთ სწáƒáƒ áƒ˜ ბილიკი -L პáƒáƒ áƒáƒ›áƒ”ტრით."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "შეიყვáƒáƒœáƒ”თ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "შეიყვáƒáƒœáƒ”თ კდევ ერთხელ: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევáƒ.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ (\"%s\") ცáƒáƒ áƒ˜áƒ”ლიáƒ"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "მიღებულირსიგნáƒáƒšáƒ˜\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "შვილáƒáƒ‘ილი პრáƒáƒªáƒ”სისთვის ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "დიáƒáƒ®\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale()-ის შეცდáƒáƒ›áƒ"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "ძველი ენის (\"%s\") áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ენის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\""
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "თუ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი მხáƒáƒšáƒáƒ“ მითითებული ICU-სთვისრხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ენის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები; გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ები: LANG დრLC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "კáƒáƒ“ირებრáƒáƒ  ემთხვევáƒ"
+
+#: initdb.c:2204
+#, 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:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "თáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒ˜áƒ— %s დრკáƒáƒ“ირებრáƒáƒœ áƒáƒ  მიუთითáƒáƒ—, áƒáƒœ სწáƒáƒ áƒáƒ“ მიუთითეთ."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "თქვენს მიერ შერჩეული კáƒáƒ“ირებრ(%s) ICU -ის მáƒáƒ›áƒ¬áƒáƒ“ებელთáƒáƒœ ერთáƒáƒ“ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "მდებáƒáƒ áƒ”áƒáƒ‘ის კáƒáƒ“ის \"%s\" ენის ჭდეში (%s) გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ ICU-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბბს"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ“áƒáƒœ \"%s\" ენის მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ \"%s\" ენრ\"%s\" უცნáƒáƒ‘იáƒ"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "სáƒáƒ­áƒ áƒáƒ ICU ენის მითითებáƒ"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "ვიყენებ ენის ჭდეს \"%s\" ICU ლáƒáƒ™áƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\".\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ბáƒáƒ–ის კლáƒáƒ¡áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒ“ენს.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=მეთáƒáƒ“ი áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმები მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ შეერთებებისთვის\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ TCP/IP შეერთების áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმები მეთáƒáƒ“ი\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტის შეერთების áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმები მეთáƒáƒ“ი\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=კáƒáƒ“ირებრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების ნáƒáƒ’ულისხმები კáƒáƒ“ირებáƒ\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე ჯგუფის კითხვáƒ/გáƒáƒ¨áƒ•áƒ”ბის წვდáƒáƒ›áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=კáƒáƒ“ირებრICU ენის ID áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=წესები áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის დáƒáƒ›áƒáƒ¢áƒ”ბითი ICUკáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წესების დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=ენრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების ნáƒáƒ’ულისხმები ენის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" დáƒáƒáƒ§áƒ”ნეთ ნáƒáƒ’ულისხმები ენრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¨áƒ˜\n"
+" áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის (ნáƒáƒ’ულისხმები áƒáƒ¦áƒ”ბულირგáƒáƒ áƒ”მáƒáƒ“áƒáƒœ)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale იგივე, რáƒáƒª --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის ენის ნáƒáƒ’ულისხმები მიმწáƒáƒ“ებლის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE áƒáƒ®áƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვáƒ\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" ტექსტის ძებნის ნáƒáƒ’ულისხმები კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=სáƒáƒ®áƒ”ლი ბáƒáƒ–ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ კითხვáƒ\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR წინáƒáƒ¡áƒ¬áƒáƒ  ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ (WAL) სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ზáƒáƒ›áƒ WAL სეგმენტების ზáƒáƒ›áƒ, მეგáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"იშვიáƒáƒ—áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=VALUE სერვერის ნáƒáƒ’ულისხმები პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_caches=1 დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის შემცველი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜ áƒáƒ  გáƒáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ\n"
+
+#: initdb.c:2461
+#, 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:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions შემდეგი ნáƒáƒ‘იჯის ინსტრუქციები ნáƒáƒ©áƒ•áƒ”ნები áƒáƒ  იქნებáƒ\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show შიდრპáƒáƒ áƒáƒ›áƒ”ტრების ჩვენებáƒ\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only ბáƒáƒ–ის ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"სხვრპáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"თუ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრ\n"
+"გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ \"%s\" შეერთებებისთვის"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ— áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ მითითებáƒ"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: initdb.c:2533
+#, 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:2550
+#, c-format
+msgid "could not set environment"
+msgstr "გáƒáƒ áƒ”მáƒáƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ „%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სტáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ენით \"%s\".\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ენის áƒáƒ› კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ— მáƒáƒ®áƒ“ებáƒ:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU ენáƒ: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "ენისთვის (\"%s\") შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ კáƒáƒ“ირებრვერ ვიპáƒáƒ•áƒ”"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "გáƒáƒ£áƒ¨áƒ•áƒ˜áƒ— %s თáƒáƒ•áƒ˜áƒ“áƒáƒœ -E პáƒáƒ áƒáƒ›áƒ”ტრით."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"ენის ნáƒáƒ’ულისხმები „%s“ კáƒáƒ“ირების დáƒáƒ§áƒ”ნებáƒ, სერვერის დáƒáƒ¡áƒáƒ¨áƒ˜áƒ¤áƒ áƒáƒ“ შეუძლებელიáƒ.\n"
+"სáƒáƒœáƒáƒªáƒ•áƒšáƒáƒ“, ბáƒáƒ–ის ნáƒáƒ’ულისხმევი კáƒáƒ“ირებრდáƒáƒ§áƒ”ნდებრ„%s“.\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "ენáƒáƒ¡ (\"%s\") მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი კáƒáƒ“ირებრ(\"%s\") სჭირდებáƒ"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "%s სერვერის მხáƒáƒ áƒ”ს კáƒáƒ“ირებრვერ იქნებáƒ."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "%s-ის თáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ¨áƒ•áƒ”ბრენის სხვრáƒáƒ áƒ©áƒ”ვáƒáƒœáƒ˜áƒ—."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "ბáƒáƒ–ის ნáƒáƒ’ულისხმები კáƒáƒ“ირებრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ დáƒáƒ§áƒ”ნებულირ„%s“-ზე.\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "ტექსტის ძებნის ენისთვის შესáƒáƒ¤áƒ”რისი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ: \"%s\""
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "ტექსტის ძებნის ენისთვის შესáƒáƒ¤áƒ”რისი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\""
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "ტექსტის ძებნის მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" ენáƒáƒ¡ (\"%s\") áƒáƒ  ემთხვევáƒ"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "ტექსტის ძებნის ნáƒáƒ’ულისხმები კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" იქნებáƒ.\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შექმნრ.... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "áƒáƒ áƒ¡áƒ”ბულ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე (\"%s\") წვდáƒáƒ›áƒ”ბის ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის შეცვლრშეუძლებელირ\"%s\": %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ"
+
+#: initdb.c:2840
+#, 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:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "თუ გსურთ WAL-ის იქ შენáƒáƒ®áƒ•áƒ, წáƒáƒ¨áƒáƒšáƒ”თ áƒáƒœ დáƒáƒáƒªáƒáƒ áƒ˜áƒ”ლეთ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე „%s“."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ %s: %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "ის შეიცáƒáƒ•áƒ¡ წერტილით დáƒáƒ¬áƒ§áƒ”ბულ/უხილáƒáƒ• ფáƒáƒ˜áƒšáƒ¡, შესáƒáƒ«áƒšáƒáƒ იმის გáƒáƒ›áƒ, რáƒáƒ› ის მიმáƒáƒ’რების წერტილიáƒ."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "ის შეიცáƒáƒ•áƒ¡ lost+found სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს. áƒáƒšáƒ‘áƒáƒ— იმის გáƒáƒ›áƒ, რáƒáƒ› ის მიმáƒáƒ’რების წერტილიáƒ."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"მიმáƒáƒ’რების წერტილის პირდáƒáƒžáƒ˜áƒ  მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ედ გáƒáƒ›áƒáƒ§áƒ”ნებრრეკáƒáƒ›áƒ”ნდებული áƒáƒ áƒáƒ.\n"
+"შექმენით ქვესáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მიმáƒáƒ’რების წერტილის ქვეშ."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "ქვესáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების შექმნრ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "პირველáƒáƒ“ი მáƒáƒ›áƒ–áƒáƒ“ების შემდგáƒáƒ›áƒ˜ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შესრულებრ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s მნიშვნელáƒáƒ‘რსჭირდებáƒ"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბულირგáƒáƒ›áƒáƒ áƒ—ვის რეჟიმში.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბულირმáƒáƒ£áƒ¬áƒ›áƒ”ნდáƒáƒ• რეჟიმში. შეცდáƒáƒ›áƒ”ბი áƒáƒ  გáƒáƒ˜áƒ¬áƒ›áƒ˜áƒœáƒ“ებáƒ.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "ენის უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s ვერ იქნებრმითითებული, თუ ენის მáƒáƒ›áƒ¬áƒáƒ“ებლáƒáƒ“ „%s“ áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ული"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დისკზე ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒ დრპáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ერთდრáƒáƒ£áƒšáƒáƒ“ მითითებრშეუძებელიáƒ"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segisze -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize -ის áƒáƒ áƒ’უმენტი 2-ის ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1-1024 დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი \"%s\" უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ. რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლებირ\"pg_\"-ით ვერ დáƒáƒ˜áƒ¬áƒ§áƒ”ბáƒ"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"áƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის ფáƒáƒ˜áƒšáƒ”ბი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის \"%s\"-ის მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜áƒ.\n"
+"ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი სერვერის პრáƒáƒªáƒ”სსáƒáƒª უნდრფლáƒáƒ‘დეს.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულიáƒ.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"დისკთáƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულიáƒ.\n"
+"áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒšáƒ˜ სისტემის სიკვდილის შემთხვევáƒáƒ¨áƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე შეიძლებრდáƒáƒ–იáƒáƒœáƒ“ეს.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ შეერთებებისთვის \"trust\" áƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ"
+
+#: initdb.c:3416
+#, 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:3446
+msgid "logfile"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"წáƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ. áƒáƒ®áƒšáƒ ბáƒáƒ–ის სერვერის შემდეგი ბრძáƒáƒœáƒ”ბით გáƒáƒ¨áƒ•áƒ”ბრშეგიძლიáƒáƒ—:\n"
+"\n"
+" %s\n"
+"\n"
+
+#, c-format
+#~ msgid "Using default ICU locale \"%s\".\n"
+#~ msgstr "ვიყენებ ნáƒáƒ’ულისხმებ ICU ლáƒáƒ™áƒáƒšáƒ¡ \"%s\".\n"
diff --git a/src/bin/initdb/po/ko.po b/src/bin/initdb/po/ko.po
new file mode 100644
index 0000000..871c7ca
--- /dev/null
+++ b/src/bin/initdb/po/ko.po
@@ -0,0 +1,1137 @@
+# Korean message translation file for PostgreSQL initdb
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:50+0000\n"
+"PO-Revision-Date: 2023-09-08 16:09+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" 실행 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "\"%s\" 경로를 절대 경로로 바꿀 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (내부 오류)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ fsync 실패: %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "ì œí•œëœ í† í°ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" 명령용 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "ì œí•œëœ í† í°ìœ¼ë¡œ 재실행할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 지울 수 ì—†ìŒ: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "%ld UID를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ì‚¬ìš©ìž ì—†ìŒ"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "해당 명령어 ì—†ìŒ"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 종료 코드 %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외로 하위 프로세스가 종료ë˜ì—ˆìŒ."
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, ì‹œê·¸ë„ %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 알수 없는 ìƒíƒœ %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\" 파ì¼ì˜ ì—°ê²°ì„ ì„¤ì •í•  수 ì—†ìŒ: %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\" 파ì¼ì˜ ì •ì…˜ì„ êµ¬í•  수 ì—†ìŒ: %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "\"%s\" íŒŒì¼ ì—´ê¸° 실패: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "\"%s\" ë°ì´í„° 디렉터리를 지우는 중"
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "ë°ì´í„° 디렉터리를 ì§€ìš°ëŠ”ë° ì‹¤íŒ¨"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "\"%s\" ë°ì´í„° 디렉터리 ì•ˆì˜ ë‚´ìš©ì„ ì§€ìš°ëŠ” 중"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "ë°ì´í„° 디렉터리 ë‚´ìš©ì„ ì§€ìš°ëŠ”ë° ì‹¤íŒ¨"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리를 지우는 중"
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL 디렉터리를 ì§€ìš°ëŠ”ë° ì‹¤íŒ¨"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리 ì•ˆì˜ ë‚´ìš©ì„ ì§€ìš°ëŠ” 중"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL 디렉터리 ë‚´ìš©ì„ ì§€ìš°ëŠ”ë° ì‹¤íŒ¨"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "\"%s\" ë°ì´í„° 디렉터리가 사용ìžì˜ 요청으로 ì‚­ì œë˜ì§€ 않았ìŒ"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "\"%s\" WAL 디렉터리가 사용ìžì˜ 요청으로 ì‚­ì œë˜ì§€ 않았ìŒ"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "root 권한으로 실행할 수 ì—†ìŒ"
+
+#: initdb.c:756
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own "
+"the server process."
+msgstr ""
+"ì‹œìŠ¤í…œê´€ë¦¬ìž ê¶Œí•œì´ ì—†ëŠ”, ì„œë²„í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë  ì¼ë°˜ 사용ìžë¡œ ë¡œê·¸ì¸ í•´"
+"ì„œ(\"su\" ê°™ì€ ëª…ë ¹ ì´ìš©) 실행하십시오."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" ì¸ì½”ë”©ì€ ì„œë²„ ì¸ì½”딩 ì´ë¦„ì„ ì‚¬ìš©í•  수 ì—†ìŒ"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "\"%s\" íŒŒì¼ ì—†ìŒ"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, 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:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì— 액세스할 수 ì—†ìŒ: %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "\"%s\" 파ì¼ì€ ì¼ë°˜ 파ì¼ì´ 아님"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "사용할 ë™ì  공유 메모리 관리방ì‹ì„ ì„ íƒí•˜ëŠ” 중 ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "max_connections ì´ˆê¸°ê°’ì„ ì„ íƒí•˜ëŠ” 중 ..."
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "기본 shared_buffers를 ì„ íƒí•˜ëŠ” 중... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "기본 지역 시간대를 ì„ íƒ ì¤‘ ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "환경설정 파ì¼ì„ 만드는 중 ..."
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\" ì ‘ê·¼ ê¶Œí•œì„ ë°”ê¿€ 수 ì—†ìŒ: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "부트스트랩 스í¬ë¦½íŠ¸ 실행 중 ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "\"%s\" ìž…ë ¥ 파ì¼ì´ PostgreSQL %s ìš©ì´ ì•„ë‹˜"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "-L 옵션으로 바른 경로를 지정하십시오."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "새 superuser 암호를 입력하십시오:"
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "암호 확ì¸:"
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "암호가 서로 틀립니다.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì—ì„œ 암호를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "\"%s\" 패스워드 파ì¼ì´ 비어있ìŒ"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "ì‹œìŠ¤í…œì˜ ê°„ì„­ 신호(signal) 받았ìŒ\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "하위 í”„ë¡œì„¸ìŠ¤ì— ì“¸ 수 ì—†ìŒ: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "완료\n"
+
+# # search5 ë
+# # advance 부분
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() 실패"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "\"%s\" 옛 로케ì¼ì„ ë³µì›í•  수 ì—†ìŒ"
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "ICU ë¡œì¼€ì¼ ì´ë¦„ì„ ì‚¬ìš©í•˜ë ¤ë©´, --icu-locale ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ìž˜ëª»ëœ ë¡œì¼€ì¼ ì„¤ì •; LANG ë˜ëŠ” LC_* OS 환경 변수를 확ì¸í•˜ì„¸ìš”"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "ì¸ì½”딩 불ì¼ì¹˜"
+
+#: initdb.c:2204
+#, 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:2209 initdb.c:2230
+#, c-format
+msgid ""
+"Rerun %s and either do not specify an encoding explicitly, or choose a "
+"matching combination."
+msgstr ""
+"암묵ì ìœ¼ë¡œ ì§€ì •ëœ ì¸ì½”ë”©ì´ ë§ˆìŒì— 들지 않으면 지정할 수 있는 ì¸ì½”ë”©ì„ ì§€ì •í•´"
+"ì„œ %s ìž‘ì—…ì„ ë‹¤ì‹œ 하세요."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "지정한 %s ì¸ì½”ë”©ì„ ICU 제공ìžê°€ 지ì›í•˜ì§€ 않습니다."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì„ ë¡œì¼€ì¼ íƒœê·¸ë¡œ 바꿀 수 ì—†ìŒ: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU ì§€ì› ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다."
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "\"%s\" 로케ì¼ì—ì„œ 언어를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "\"%s\" 로케ì¼ì€ \"%s\" ë¼ëŠ” ì•Œ 수 없는 언어를 사용함"
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU 로케ì¼ì„ 지정해야합니다."
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "\"%s\" ë¡œì¼€ì¼ íƒœê·¸ë¥¼ 사용함, 해당 ICU 로케ì¼: \"%s\"\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ë¥¼ 초기화 하는 프로그램.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [옵션]... [DATADIR]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr " -A, --auth=METHOD 로컬 ì—°ê²°ì˜ ê¸°ë³¸ ì¸ì¦ 방법\n"
+
+#: initdb.c:2432
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr " --auth-host=METHOD local TCP/IP ì—°ê²°ì— ëŒ€í•œ 기본 ì¸ì¦ 방법\n"
+
+#: initdb.c:2433
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr " --auth-local=METHOD local-socket ì—°ê²°ì— ëŒ€í•œ 기본 ì¸ì¦ 방법\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR 새 ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ë¥¼ 만들 디렉터리\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ 기본 ì¸ì½”딩\n"
+
+#: initdb.c:2436
+#, c-format
+msgid ""
+" -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access ë°ì´í„° 디렉터리를 ê·¸ë£¹ì´ ì½ê³  접근할 있게 함\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ICU ë¡œì¼€ì¼ ID 지정\n"
+
+#: initdb.c:2438
+#, c-format
+msgid ""
+" --icu-rules=RULES set additional ICU collation rules for new "
+"databases\n"
+msgstr ""
+" --icu-rules=RULES 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ 추가 ICU 문ìžì—´ ì •ë ¬ ê·œì¹™ì„ ì§€"
+"ì •\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 사용\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ 기본 ë¡œì¼€ì¼ ì„¤ì •\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ê° ë²”ì£¼ì— ê¸°ë³¸ ë¡œì¼€ì¼ ì„¤ì •\n"
+" (환경ì—ì„œ 가져온 기본 ê°’)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale -locale=C와 ê°™ìŒ\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ë¡œì¼€ì¼ ì œê³µìž ì§€ì •\n"
+
+#: initdb.c:2448
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE 파ì¼ì—ì„œ 새 superuserì˜ ì•”í˜¸ ì½ê¸°\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" 기본 í…스트 검색 구성\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME ë°ì´í„°ë² ì´ìŠ¤ superuser ì´ë¦„\n"
+
+#: initdb.c:2452
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt 새 superuser 암호를 ìž…ë ¥ ë°›ìŒ\n"
+
+#: initdb.c:2453
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR 트랜잭션 로그 디렉터리 위치\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL ì¡°ê° íŒŒì¼ í¬ê¸°, MB단위\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"ëœ ì¼ë°˜ì ìœ¼ë¡œ 사용ë˜ëŠ” 옵션들:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid ""
+" -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=VALUE 서버 매개 변수 기본 ì„¤ì •ì„ ë°”ê¿ˆ\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug ë””ë²„ê¹…ì— í•„ìš”í•œ ì •ë³´ë“¤ë„ í•¨ê»˜ 출력함\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches debug_discard_caches=1 지정\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 입력파ì¼ë“¤ì´ 있는 디렉터리\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 오류가 ë°œìƒë˜ì—ˆì„ 경우 그대로 ë‘ \n"
+
+#: initdb.c:2461
+#, 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:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions ë‹¤ìŒ ìž‘ì—…ì„ ìœ„í•´ 구성 정보를 출력 안함\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 내부 ì„¤ì •ê°’ë“¤ì„ ë³´ì—¬ì¤Œ\n"
+
+#: initdb.c:2464
+#, c-format
+msgid ""
+" -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only ë°ì´í„° 디렉터리만 ë™ê¸°í™”하고 마침\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"기타 옵션:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"ë°ì´í„° 디렉터리를 지정하지 않으면, PGDATA 환경 ë³€ìˆ˜ê°’ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "\"%s\" ì¸ì¦ ë°©ë²•ì€ \"%s\" ì—°ê²°ì—서는 사용할 수 ì—†ìŒ"
+
+#: initdb.c:2513
+#, c-format
+msgid ""
+"must specify a password for the superuser to enable password authentication"
+msgstr "비밀번호 ì¸ì¦ë°©ì‹ì„ 사용하려면, 반드시 superuserì˜ ì•”í˜¸ë¥¼ 지정해야함"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "ë°ì´í„° 디렉터리를 지정하지 않았ìŒ"
+
+#: initdb.c:2533
+#, 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:2550
+#, c-format
+msgid "could not set environment"
+msgstr "환경 변수를 지정할 수 ì—†ìŒ"
+
+#: initdb.c:2568
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s ìž‘ì—…ì—ì„œ 필요합니다. 그런ë°, ì´ íŒŒì¼ì´ \"%s\" 파ì¼ì´ 있"
+"는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤."
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—… ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€ %s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ "
+"다릅니다."
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "ìž…ë ¥ íŒŒì¼ ìœ„ì¹˜ëŠ” 반드시 절대경로여야함"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ëŠ” \"%s\" 로케ì¼ìœ¼ë¡œ ì´ˆê¸°í™”ë  ê²ƒìž…ë‹ˆë‹¤.\n"
+
+#: initdb.c:2606
+#, c-format
+msgid ""
+"The database cluster will be initialized with this locale configuration:\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ëŠ” 아래 ë¡œì¼€ì¼ í™˜ê²½ìœ¼ë¡œ ì´ˆê¸°í™”ë  ê²ƒìž…ë‹ˆë‹¤:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " 제공ìž: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU 로케ì¼: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "\"%s\" 로케ì¼ì— ì•Œë§žì€ ì¸ì½”ë”©ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "-E 옵션 지정해서 %s ìž‘ì—…ì„ ë‹¤ì‹œ 하세요."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"\"%s\" ì¸ì½”ë”©ì„ ì„œë²„ì¸¡ ì¸ì½”딩으로 사용할 수 없습니다.\n"
+"기본 ë°ì´í„°ë² ì´ìŠ¤ëŠ” \"%s\" ì¸ì½”딩으로 지정ë©ë‹ˆë‹¤.\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "\"%s\" 로케ì¼ì€ 지ì›í•˜ì§€ 않는 \"%s\" ì¸ì½”ë”©ì„ í•„ìš”ë¡œ 함"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "\"%s\" ì¸ì½”ë”©ì„ ì„œë²„ì¸¡ ì¸ì½”딩으로 사용할 수 없습니다."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "다른 로케ì¼ì„ 지정해서 %s ìž‘ì—…ì„ ë‹¤ì‹œ 하세요."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "기본 ë°ì´í„°ë² ì´ìŠ¤ ì¸ì½”ë”©ì€ \"%s\" ì¸ì½”딩으로 설정ë˜ì—ˆìŠµë‹ˆë‹¤.\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "\"%s\" 로케ì¼ì— ì•Œë§žì€ ì „ë¬¸ê²€ìƒ‰ ì„¤ì •ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "\"%s\" 로케ì¼ì— ì•Œë§žì€ ì „ë¬¸ê²€ìƒ‰ ì„¤ì •ì„ ì•Œ 수 ì—†ìŒ"
+
+#: initdb.c:2757
+#, c-format
+msgid ""
+"specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "지정한 \"%s\" 전문검색 ì„¤ì •ì€ \"%s\" 로케ì¼ê³¼ ì¼ì¹˜í•˜ì§€ ì•ŠìŒ"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "기본 í…스트 검색 êµ¬ì„±ì´ \"%s\"(으)ë¡œ 설정ë©ë‹ˆë‹¤.\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "%s 디렉터리 만드는 중 ..."
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "ì´ë¯¸ 있는 %s ë””ë ‰í„°ë¦¬ì˜ ì•¡ì„¸ìŠ¤ ê¶Œí•œì„ ê³ ì¹˜ëŠ” 중 ..."
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "\"%s\" ë””ë ‰í„°ë¦¬ì˜ ì•¡ì„¸ìŠ¤ ê¶Œí•œì„ ë°”ê¿€ 수 없습니다: %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" 디렉터리가 있지만 비어 있지 ì•ŠìŒ"
+
+#: initdb.c:2840
+#, 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:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL 디렉터리 위치는 절대 경로여야 함"
+
+#: initdb.c:2912
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory \"%s"
+"\"."
+msgstr ""
+"트랜잭션 로그를 해당 ìœ„ì¹˜ì— ì €ìž¥í•˜ë ¤ë©´ \"%s\" 디렉터리를 제거하거나 비우십시"
+"오."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m"
+
+#: initdb.c:2941
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point."
+msgstr ""
+"ì (.)으로 시작하는 ìˆ¨ì€ íŒŒì¼ì´ í¬í•¨ë˜ì–´ 있습니다. 마운트 최ìƒìœ„ 디렉터리 같습"
+"니다."
+
+#: initdb.c:2943
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "lost-found 디렉터리가 있습니다. 마운트 최ìƒìœ„ 디렉터리 같습니다."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"마운트 최ìƒìœ„ 디렉터리를 ë°ì´í„° 디렉터리로 사용하는 ê²ƒì€ ê¶Œìž¥í•˜ì§€ 않습니다.\n"
+"하위 디렉터리를 만들어서 ê·¸ê²ƒì„ ë°ì´í„° 디렉터리로 사용하세요."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "하위 디렉터리 만드는 중 ..."
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "부트스트랩 ë‹¤ìŒ ì´ˆê¸°í™” ìž‘ì—… 중 ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s ì„¤ì •ì€ ê°’ì„ í•„ìš”ë¡œ 합니다."
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "디버그 모드로 실행 중.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "지저분 모드로 실행 중. 오류가 ë°œìƒë˜ì–´ë„ 뒷정리를 안합니다.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "ì•Œ 수 없는 ë¡œì¼€ì¼ ì œê³µìž ì´ë¦„: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s ì˜µì…˜ì€ \"%s\" ë¡œì¼€ì¼ ì œê³µìžë¥¼ 사용할 때만 사용할 수 있습니다."
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "ìžë£Œë¥¼ 디스í¬ì— ë™ê¸°í™” 하는 중 ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr ""
+"암호를 입력받는 옵션과 암호를 파ì¼ì—ì„œ 가져오는 ì˜µì…˜ì€ ë™ì‹œì— ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize 옵션 ê°’ì€ ìˆ«ìžì—¬ì•¼ 함"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize ì˜µì…˜ê°’ì€ 1ì—ì„œ 1024ì‚¬ì´ 2^n ê°’ì´ì—¬ì•¼ 함"
+
+#: initdb.c:3373
+#, c-format
+msgid ""
+"superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr ""
+"\"%s\" 사용ìžëŠ” 슈í¼ìœ ì € ì´ë¦„으로 쓸 수 없습니다. \"pg_\"ë¡œ 시작하는롤 ì´ë¦„"
+"ì€ í—ˆìš©í•˜ì§€ ì•ŠìŒ"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"ì´ ë°ì´í„°ë² ì´ìŠ¤ 시스템ì—ì„œ 만들어지는 파ì¼ë“¤ì€ ê·¸ 소유주가 \"%s\" idë¡œ\n"
+"ì§€ì •ë  ê²ƒìž…ë‹ˆë‹¤. ë˜í•œ ì´ ì‚¬ìš©ìžëŠ” 서버 í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë©ë‹ˆë‹¤.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 기능 사용함.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 기능 사용 하지 ì•ŠìŒ\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì€ ìƒëžµí–ˆìŠµë‹ˆë‹¤.\n"
+"ì´ ìƒíƒœì—ì„œ OSê°€ ê°‘ìžê¸° 중지 ë˜ë©´ ë°ì´í„° 디렉토리 ì•ˆì— ìžˆëŠ” ìžë£Œê°€ 깨질 수 있"
+"습니다.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "로컬 ì ‘ì†ìš© \"trust\" ì¸ì¦ì„ 설정 함"
+
+#: initdb.c:3416
+#, 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 ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ initdb ìž‘ì—…ì„ í•˜ì„¸"
+"ìš”."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "로그파ì¼"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"작업완료. ì´ì œ ë‹¤ìŒ ëª…ë ¹ì„ ì´ìš©í•´ì„œ 서버를 ê°€ë™ í•  수 있습니다:\n"
+"\n"
+" %s\n"
+"\n"
+
+#, c-format
+#~ msgid "Using default ICU locale \"%s\".\n"
+#~ msgstr "기본 ICU 로케ì¼ë¡œ \"%s\" 사용함.\n"
+
+#, c-format
+#~ msgid "could not open collator for default locale: %s"
+#~ msgstr "기본 로케ì¼ìš© 문ìžì—´ ì •ë ¬ ê·œì¹™ì„ ì—´ 수 ì—†ìŒ: %s"
+
+#, c-format
+#~ msgid "could not determine default ICU locale"
+#~ msgstr "기본 ICU 로케ì¼ì„ ê²°ì •í•  수 ì—†ìŒ"
diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build
new file mode 100644
index 0000000..ad19398
--- /dev/null
+++ b/src/bin/initdb/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('initdb-' + pg_version_major.to_string())]
diff --git a/src/bin/initdb/po/pl.po b/src/bin/initdb/po/pl.po
new file mode 100644
index 0000000..fa8af5c
--- /dev/null
+++ b/src/bin/initdb/po/pl.po
@@ -0,0 +1,1054 @@
+# INITDB Translated Messages into the Polish Language
+# Copyright (c) 2005 toczek, xxxtoczekxxx@wp.pl
+# Distributed under the same licensing terms as PostgreSQL itself.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-03-14 17:45+0000\n"
+"PO-Revision-Date: 2017-03-14 19:41+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "nie można zidentyfikować aktualnego katalogu: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "niepoprawny binarny \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nie można odczytać binarnego \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nie znaleziono \"%s\" do wykonania"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "nie można zmienić katalogu na \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "nie można odczytać odwołania symbolicznego \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose nie powiodło się: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/file_utils.c:82 ../../common/file_utils.c:167
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "%s: nie można wykonać stat na pliku \"%s\": %s\n"
+
+#: ../../common/file_utils.c:143
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "%s: nie można otworzyć katalogu \"%s\": %s\n"
+
+#: ../../common/file_utils.c:179
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "%s: nie można odczytać katalogu \"%s\": %s\n"
+
+#: ../../common/file_utils.c:212 ../../common/file_utils.c:272
+#: ../../common/file_utils.c:348
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\": %s\n"
+
+#: ../../common/file_utils.c:285 ../../common/file_utils.c:357
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "%s: nie można wykonać fsync na pliku \"%s\": %s\n"
+
+#: ../../common/file_utils.c:368
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "%s: nie można zmienić nazwy pliku \"%s\" na \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:45
+#, c-format
+msgid "could not open directory \"%s\": %s\n"
+msgstr "nie można otworzyć katalogu \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:72
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "nie można czytać katalogu \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:84
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "nie można zamknąć katalogu \"%s\": %s\n"
+
+#: ../../common/restricted_token.c:68
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: OSTRZEŻENIE: nie można tworzyć ograniczonych tokenów na tej platformie\n"
+
+#: ../../common/restricted_token.c:77
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: nie można otworzyć tokenu procesu: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:90
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: nie udało się przydzielić SIDów: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: nie udało się utworzyć ograniczonego tokena: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:132
+#, c-format
+msgid "%s: could not start process for command \"%s\": error code %lu\n"
+msgstr "%s: nie udało się uruchomić procesu dla polecenia \"%s\": kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:170
+#, c-format
+msgid "%s: could not re-execute with restricted token: error code %lu\n"
+msgstr "%s: nie udało się ponownie wykonać ograniczonego tokena: %lu\n"
+
+#: ../../common/restricted_token.c:186
+#, c-format
+msgid "%s: could not get exit code from subprocess: error code %lu\n"
+msgstr "%s: nie udało uzyskać kodu wyjścia z usługi podrzędnej: kod błędu %lu\n"
+
+#: ../../common/rmtree.c:77
+#, c-format
+msgid "could not stat file or directory \"%s\": %s\n"
+msgstr "nie można wykonać polecenia stat na pliku lub katalogu \"%s\": %s\n"
+
+#: ../../common/rmtree.c:104 ../../common/rmtree.c:121
+#, c-format
+msgid "could not remove file or directory \"%s\": %s\n"
+msgstr "nie można usunąć pliku lub katalogu \"%s\": %s\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nie udało się odnaleźć efektywnego ID użytkownika %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "użytkownik nie istnieje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "niepowodzenie wyszukiwania nazwy użytkownika: kod błędu %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "polecenie nie wykonywalne"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "polecenia nie znaleziono"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "proces potomny zakończył działanie z kodem %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "proces potomny został zatrzymany przez wyjątek 0x%X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "proces potomny został zatrzymany przez sygnał %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "proces potomny został zatrzymany przez sygnał %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "proces potomny zakończył działanie z nieznanym stanem %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "nie można ustanowić złączenia dla \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "nie można pobrać złączenia dla \"%s\": %s\n"
+
+#: initdb.c:330
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: brak pamięci\n"
+
+#: initdb.c:440 initdb.c:1441
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\" do odczytu: %s\n"
+
+#: initdb.c:496 initdb.c:812 initdb.c:840
+#, c-format
+msgid "%s: could not open file \"%s\" for writing: %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\" do zapisu: %s\n"
+
+#: initdb.c:504 initdb.c:512 initdb.c:819 initdb.c:846
+#, c-format
+msgid "%s: could not write file \"%s\": %s\n"
+msgstr "%s: nie można zapisać pliku \"%s\": %s\n"
+
+#: initdb.c:531
+#, c-format
+msgid "%s: could not execute command \"%s\": %s\n"
+msgstr "%s: nie można wykonać komendy \"%s\": %s\n"
+
+#: initdb.c:547
+#, c-format
+msgid "%s: removing data directory \"%s\"\n"
+msgstr "%s: usuwanie katalogu danych \"%s\"\n"
+
+#: initdb.c:550
+#, c-format
+msgid "%s: failed to remove data directory\n"
+msgstr "%s: nie udało się usunięcie katalogu danych\n"
+
+#: initdb.c:556
+#, c-format
+msgid "%s: removing contents of data directory \"%s\"\n"
+msgstr "%s: usuwanie zawartości w katalogu danych \"%s\"\n"
+
+#: initdb.c:559
+#, c-format
+msgid "%s: failed to remove contents of data directory\n"
+msgstr "%s: nie udało się usunąć zawartości w katalogu danych\n"
+
+#: initdb.c:565
+#, c-format
+msgid "%s: removing transaction log directory \"%s\"\n"
+msgstr "%s: usuwanie katalogu dziennika transakcji \"%s\"\n"
+
+#: initdb.c:568
+#, c-format
+msgid "%s: failed to remove transaction log directory\n"
+msgstr "%s: nie udało się usunięcie katalogu dziennika transakcji\n"
+
+#: initdb.c:574
+#, c-format
+msgid "%s: removing contents of transaction log directory \"%s\"\n"
+msgstr "%s: usuwanie zawartości katalogu dziennika transakcji \"%s\"\n"
+
+#: initdb.c:577
+#, c-format
+msgid "%s: failed to remove contents of transaction log directory\n"
+msgstr "%s: nie udało się usunąć zawartości w katalogu dziennika transakcji\n"
+
+#: initdb.c:586
+#, c-format
+msgid "%s: data directory \"%s\" not removed at user's request\n"
+msgstr "%s: katalog \"%s\" nie został usunięty na żądanie użytkownika\n"
+
+#: initdb.c:591
+#, c-format
+msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+msgstr "%s: katalog \"%s\" nie został usunięty na żądanie użytkownika\n"
+
+#: initdb.c:612
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: nie można uruchomić jako root\n"
+"Proszę zalogować się (używając np: \"su\") na (nieuprzywilejowanego) "
+"użytkownika, który\n"
+"będzie właścicielem procesu.\n"
+
+#: initdb.c:648
+#, c-format
+msgid "%s: \"%s\" is not a valid server encoding name\n"
+msgstr "%s: \"%s\" nie jest poprawnÄ… nazwÄ… kodowania\n"
+
+#: initdb.c:768
+#, c-format
+msgid "%s: file \"%s\" does not exist\n"
+msgstr "%s: plik \"%s\" nie istnieje\n"
+
+#: initdb.c:770 initdb.c:779 initdb.c:789
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"Oznacza to iż posiadasz uszkodzoną instalację lub wskazałeś\n"
+"zły katalog przy użyciu opcji -L.\n"
+
+#: initdb.c:776
+#, c-format
+msgid "%s: could not access file \"%s\": %s\n"
+msgstr "%s: nie można uzyskać dostępu do pliku \"%s\": %s\n"
+
+#: initdb.c:787
+#, c-format
+msgid "%s: file \"%s\" is not a regular file\n"
+msgstr "%s: plik \"%s\" nie jest zwykłym plikiem\n"
+
+#: initdb.c:932
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "wybieranie domyślnej wartości max_connections ... "
+
+#: initdb.c:962
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "wybieranie domyślnej wartości shared_buffers ... "
+
+#: initdb.c:995
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "wybór implementacji dynamicznej pamięci współdzielonej ... "
+
+#: initdb.c:1013
+msgid "creating configuration files ... "
+msgstr "tworzenie plików konfiguracyjnych ... "
+
+#: initdb.c:1145 initdb.c:1165 initdb.c:1252 initdb.c:1268
+#, c-format
+msgid "%s: could not change permissions of \"%s\": %s\n"
+msgstr "%s: nie można zmienić uprawnień do \"%s\": %s\n"
+
+#: initdb.c:1292
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "wykonywanie skryptu ładowania wstępnego ... "
+
+#: initdb.c:1308
+#, c-format
+msgid ""
+"%s: input file \"%s\" does not belong to PostgreSQL %s\n"
+"Check your installation or specify the correct path using the option -L.\n"
+msgstr ""
+"%s: plik wejściowy \"%s\" nie należy do bazy danych PostgreSQL %s\n"
+"Sprawdź swoją instalację lub podaj poprawą ścieżkę przy pomocy zmiennej -L.\n"
+
+#: initdb.c:1418
+msgid "Enter new superuser password: "
+msgstr "Podaj hasło superużytkownika: "
+
+#: initdb.c:1419
+msgid "Enter it again: "
+msgstr "Powtórz podane hasło: "
+
+#: initdb.c:1422
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Podane hasła różnią się.\n"
+
+#: initdb.c:1448
+#, c-format
+msgid "%s: could not read password from file \"%s\": %s\n"
+msgstr "%s: nie można odczytać hasła z pliku \"%s\": %s\n"
+
+#: initdb.c:1451
+#, c-format
+msgid "%s: password file \"%s\" is empty\n"
+msgstr "%s: plik hasła \"%s\" jest pusty\n"
+
+#: initdb.c:2011
+#, c-format
+msgid "caught signal\n"
+msgstr "sygnał otrzymany\n"
+
+#: initdb.c:2017
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "nie można zapisać do procesu potomnego: %s\n"
+
+#: initdb.c:2025
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2115
+#, c-format
+msgid "%s: setlocale() failed\n"
+msgstr "%s: setlocale() nie powiodła się\n"
+
+#: initdb.c:2133
+#, c-format
+msgid "%s: failed to restore old locale \"%s\"\n"
+msgstr "%s: nie udało się odtworzyć poprzedniej lokalizacji \"%s\"\n"
+
+#: initdb.c:2143
+#, c-format
+msgid "%s: invalid locale name \"%s\"\n"
+msgstr "%s: błędna nazwa lokalizacji \"%s\"\n"
+
+#: initdb.c:2155
+#, c-format
+msgid "%s: invalid locale settings; check LANG and LC_* environment variables\n"
+msgstr "%s: nieprawidłowe ustawienia regionalne; sprawdź zmienne środowiskowe LANG i "
+"LC_*\n"
+
+#: initdb.c:2183
+#, c-format
+msgid "%s: encoding mismatch\n"
+msgstr "%s: niezgodność kodowania\n"
+
+#: initdb.c:2185
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"Wybrane kodowanie (%s) i kodowanie używane przez\n"
+"lokalizację (%s) nie zgadzają się. Może to prowadzić\n"
+"do błędów w wielu funkcjach przetwarzających ciągi znaków.\n"
+"Aby poprawić ten błąd uruchom ponownie %s i albo nie ustawiaj kodowania\n"
+"albo wybierz pasujÄ…cÄ… kombinacjÄ™.\n"
+
+#: initdb.c:2257
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inicjuje klaster bazy danych PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2258
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: initdb.c:2259
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPCJA]... [KATALOG-DOCELOWY]\n"
+
+#: initdb.c:2260
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcje:\n"
+
+#: initdb.c:2261
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METODA podstawowa metoda autoryzacji dla lokalnych "
+"połączeń\n"
+
+#: initdb.c:2262
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METODA podstawowa metoda autoryzacji dla lokalnych "
+"połączeń TCP/IP\n"
+
+#: initdb.c:2263
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METODA podstawowa metoda autoryzacji dla lokalnych "
+"gniazd połączeń\n"
+
+#: initdb.c:2264
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]KATALOG-DOCELOWY lokalizacja klastra bazy danych\n"
+
+#: initdb.c:2265
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=KODOWANIE ustawia podstawowe kodowanie dla nowej bazy\n"
+
+#: initdb.c:2266
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOKALIZACJA ustawia domyślną lokalizację dla nowych baz "
+"danych\n"
+
+#: initdb.c:2267
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" ustawia domyślną lokalizację w odpowiedniej "
+"kategorii\n"
+" dla nowych baz danych (domyślnie pobierana ze "
+"środowiska)\n"
+
+#: initdb.c:2271
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale równoważna z opcją --locale=C\n"
+
+#: initdb.c:2272
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=PLIK czyta hasło dla właściciela bazy z pliku\n"
+
+#: initdb.c:2273
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" domyślna konfiguracja wyszukiwania tekstowego\n"
+
+#: initdb.c:2275
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAZWA superużytkownik bazy danych\n"
+
+#: initdb.c:2276
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt proś o hasło dla nowego superużytkownika\n"
+
+#: initdb.c:2277
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR umiejscowienie folderu dziennika zapisu z "
+"wyprzedzeniem\n"
+
+#: initdb.c:2278
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Rzadziej używane opcje:\n"
+
+#: initdb.c:2279
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug wyświetlanie informacji debugger'a\n"
+
+#: initdb.c:2280
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums użycie sum kontrolnych danych stron\n"
+
+#: initdb.c:2281
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L KATALOG gdzie szukać plików wejściowych\n"
+
+#: initdb.c:2282
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean błędy nie będą porządkowane\n"
+
+#: initdb.c:2283
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync nie czekać aż zmiany zostaną bezpiecznie "
+"zapisane na dysk\n"
+
+#: initdb.c:2284
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show pokaż wewnętrzne ustawienia\n"
+
+#: initdb.c:2285
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr " -S, --sync-only synchronizować tylko katalog danych\n"
+
+#: initdb.c:2286
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Pozostałe opcje:\n"
+
+#: initdb.c:2287
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: initdb.c:2288
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: initdb.c:2289
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Jeśli katalog nie jest wskazany wtedy używana jest zmienna PGDATA\n"
+"do określenia tegoż katalogu.\n"
+
+#: initdb.c:2291
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: initdb.c:2299
+msgid ""
+"\n"
+"WARNING: enabling \"trust\" authentication for local connections\n"
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"\n"
+"OSTRZEŻENIE: metoda autoryzacji ustawiona jako \"trust\" dla połączeń "
+"lokalnych\n"
+"Można to zmienić edytując plik pg_hba.conf, używając opcji -A, lub\n"
+"--auth-local oraz --auth-host przy kolejnym uruchomieniu initdb.\n"
+
+#: initdb.c:2321
+#, c-format
+msgid "%s: invalid authentication method \"%s\" for \"%s\" connections\n"
+msgstr "%s: niepoprawna metoda autoryzacji \"%s\" dla połączeń \"%s\"\n"
+
+#: initdb.c:2337
+#, c-format
+msgid "%s: must specify a password for the superuser to enable %s authentication\n"
+msgstr "%s: musisz podać hasło superużytkownika aby aktywować %s autoryzację\n"
+
+#: initdb.c:2365
+#, c-format
+msgid ""
+"%s: no data directory specified\n"
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"%s: nieustawiony katalog danych\n"
+"Musisz podać katalog gdzie będą przechowywane dane bazy danych.\n"
+"Możesz tego dokonać używając opcji -D lub przy pomocy\n"
+"zmiennej środowiskowej PGDATA.\n"
+
+#: initdb.c:2403
+#, c-format
+msgid ""
+"The program \"postgres\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"postgres\" jest wymagany przez %s ale nie został znaleziony \n"
+"w tym samym folderze co \"%s\".\n"
+"Sprawdź instalację.\n"
+
+#: initdb.c:2410
+#, c-format
+msgid ""
+"The program \"postgres\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"postgres\" został znaleziony przez \"%s\"\n"
+"ale nie jest w tej samej wersji co %s.\n"
+"Sprawdź instalację.\n"
+
+#: initdb.c:2429
+#, c-format
+msgid "%s: input file location must be an absolute path\n"
+msgstr "%s: położenie plików wejściowych musi być ścieżką bezwzględną\n"
+
+#: initdb.c:2448
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Klaster bazy zostanie utworzony z zestawem reguł językowych \"%s\".\n"
+
+#: initdb.c:2451
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"Klaster bazy danych zostanie utworzony z zestawem reguł językowych\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2475
+#, c-format
+msgid "%s: could not find suitable encoding for locale \"%s\"\n"
+msgstr "%s: nie można znaleźć odpowiedniego kodowania dla lokalizacji \"%s\"\n"
+
+#: initdb.c:2477
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "WÅ‚Ä…cz polecenie %s ponownie z opcjÄ… -E.\n"
+
+#: initdb.c:2478 initdb.c:3102 initdb.c:3123
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: initdb.c:2490
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Kodowanie \"%s\" określone przez lokalizację jest niedozwolone jako kodowanie "
+"po stronie serwera.\n"
+"Kodowanie bazy danych będzie zamiast tego ustawiona na \"%s\".\n"
+
+#: initdb.c:2498
+#, c-format
+msgid "%s: locale \"%s\" requires unsupported encoding \"%s\"\n"
+msgstr "%s: lokalizacja \"%s\" wymaga nie wspieranego kodowania \"%s\"\n"
+
+#: initdb.c:2501
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"Kodowanie \"%s\" jest niedozwolone jako kodowanie po stronie serwera.\n"
+"Uruchom ponownie %s z wybranÄ… innÄ… lokalizacjÄ….\n"
+
+#: initdb.c:2510
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Podstawowe kodowanie bazy danych zostało ustawione jako \"%s\".\n"
+
+#: initdb.c:2581
+#, c-format
+msgid "%s: could not find suitable text search configuration for locale \"%s\"\n"
+msgstr "%s: nie można znaleźć odpowiedniej konfiguracji wyszukiwania tekstowego dla "
+"lokalizacji \"%s\"\n"
+
+#: initdb.c:2592
+#, c-format
+msgid "%s: warning: suitable text search configuration for locale \"%s\" is unknown\n"
+msgstr "%s: ostrzeżenie: nie jest znana odpowiednia konfiguracja wyszukiwania "
+"tekstowego dla lokalizacji \"%s\"\n"
+
+#: initdb.c:2597
+#, c-format
+msgid "%s: warning: specified text search configuration \"%s\" might not match locale \"%s\"\n"
+msgstr "%s: ostrzeżenie: wskazana konfiguracja wyszukiwania tekstu \"%s\" może nie "
+"pasować do lokalizacji \"%s\"\n"
+
+#: initdb.c:2602
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Domyślna konfiguracja wyszukiwania tekstowego zostanie ustawiona na \"%s\".\n"
+
+#: initdb.c:2646 initdb.c:2732
+#, c-format
+msgid "creating directory %s ... "
+msgstr "tworzenie katalogu %s ... "
+
+#: initdb.c:2652 initdb.c:2738 initdb.c:2806 initdb.c:2862
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "%s: nie można utworzyć katalogu \"%s\": %s\n"
+
+#: initdb.c:2664 initdb.c:2750
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "ustalanie uprawnień katalogu %s ... "
+
+#: initdb.c:2670 initdb.c:2756
+#, c-format
+msgid "%s: could not change permissions of directory \"%s\": %s\n"
+msgstr "%s: nie można zmienić uprawnień katalogu \"%s\": %s\n"
+
+#: initdb.c:2685 initdb.c:2771
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "%s: folder \"%s\" nie jest pusty\n"
+
+#: initdb.c:2691
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"Jeśli chcesz utworzyć nową bazę danych, usuń lub wyczyść\n"
+"katalog \"%s\" lub uruchom program %s\n"
+"z argumentem wskazującym katalog innym niż \"%s\".\n"
+
+#: initdb.c:2699 initdb.c:2784 initdb.c:3136
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: brak dostępu do katalogu \"%s\": %s\n"
+
+#: initdb.c:2723
+#, c-format
+msgid "%s: transaction log directory location must be an absolute path\n"
+msgstr "%s: położenie folderu dziennika transakcji musi być ścieżką bezwzględną\n"
+
+#: initdb.c:2777
+#, c-format
+msgid ""
+"If you want to store the transaction log there, either\n"
+"remove or empty the directory \"%s\".\n"
+msgstr ""
+"Jeśli chcesz tam przechowywać dziennik transakcji, albo\n"
+"usuń albo wyczyść zawartość folderu \"%s\".\n"
+
+#: initdb.c:2792
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "%s: nie można utworzyć linku symbolicznego \"%s\": %s\n"
+
+#: initdb.c:2797
+#, c-format
+msgid "%s: symlinks are not supported on this platform"
+msgstr "%s: linki symb. nie są obsługiwane na tej platformie"
+
+#: initdb.c:2821
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n"
+msgstr "Zawiera on tylko zaczynający się kropką/niewidoczny plik, być może dlatego, "
+"że był to punkt podłączenia.\n"
+
+#: initdb.c:2824
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr "Zawiera on folder lost+found, być może dlatego, że był to punkt podłączenia.\n"
+
+#: initdb.c:2827
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"Użycie punktu zamontowania bezpośrednio jako folderu danych nie jest "
+"zalecane.\n"
+"Lepiej utworzyć podfolder punktu montowania.\n"
+
+#: initdb.c:2847
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "tworzenie podkatalogów ... "
+
+#: initdb.c:2894
+msgid "performing post-bootstrap initialization ... "
+msgstr "wykonywanie inicjacji po ładowaniu wstępnym ... "
+
+#: initdb.c:3046
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Działanie w trybie debug.\n"
+
+#: initdb.c:3050
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Działanie w trybie no-clean. Błędy nie będą porządkowane.\n"
+
+#: initdb.c:3121
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: initdb.c:3141 initdb.c:3207
+msgid "syncing data to disk ... "
+msgstr "synchronizacja danych na dysk ... "
+
+#: initdb.c:3150
+#, c-format
+msgid "%s: password prompt and password file cannot be specified together\n"
+msgstr "%s: prośba o hasło i plik hasła nie mogą być podane jednocześnie\n"
+
+#: initdb.c:3174
+#, c-format
+msgid "%s: superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"\n"
+msgstr "%s: nazwa superużytkownika \"%s\" jest zabroniona; nazwy ról nie mogą zaczynać "
+"siÄ™ od \"pg_\"\n"
+
+#: initdb.c:3178
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Właścicielem plików należących do sytemu bazy danych będzie użytkownik \"%s\".\n"
+"Ten użytkownik musi jednocześnie być właścicielem procesu serwera.\n"
+"\n"
+
+#: initdb.c:3194
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Sumy kontrolne stron danych są włączone.\n"
+
+#: initdb.c:3196
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Sumy kontrolne stron danych sÄ… zablokowane.\n"
+
+#: initdb.c:3213
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Pominięto synchronizację na dysk.\n"
+"Folder danych może zostać uszkodzona jeśli system operacyjny ulegnie awarii.\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3239
+msgid "logfile"
+msgstr "plik dziennika"
+
+#: initdb.c:3241
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Sukces. Teraz możesz uruchomić serwer bazy danych używając:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "tworzenie bazy template1 w folderze %s/base/1 ... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "inicjowanie pg_authid ... "
+
+#~ msgid "setting password ... "
+#~ msgstr "ustawianie hasła ... "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "inicjowanie powiązań ... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "tworzenie widoków systemowych ... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "wczytywanie opisów obiektów systemowych ... "
+
+#~ msgid "creating collations ... "
+#~ msgstr "tworzenie porównań ... "
+
+#~ msgid "not supported on this platform\n"
+#~ msgstr "nieobsługiwane na tej platformie\n"
+
+#~ msgid "creating conversions ... "
+#~ msgstr "tworzenie konwersji ... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "tworzenie słowników ... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "ustawianie uprawnień dla wbudowanych obiektów ... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "tworzenie schematu informacyjnego ... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "pobieranie języka PL/pgSQL używanego po stronie serwera ... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "odkurzanie bazy template1 ... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "kopiowanie bazy template1 do bazy template0 ... "
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "kopiowanie bazy template1 do bazy postgres ... "
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: nie można otrzymać informacji o bieżącym użytkowniku: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: nie można otrzymać bieżącej nazwy użytkownika: %s\n"
+
+#~ msgid "Using the top-level directory of a mount point is not recommended.\n"
+#~ msgstr "Używanie folderu głównego punktu podłączenia nie jest zalecane.\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "nie można zmienić katalogu na \"%s\""
+
+#~ msgid "%s: could not to allocate SIDs: error code %lu\n"
+#~ msgstr "%s: nie udało się przydzielić SIDów: kod błędu %lu\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: nie można zamknąć katalogu \"%s\": %s\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Użyj opcji \"--debug\" by zobaczyć szczegóły.\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Nie znaleziono lokalizacji systemowej nadajÄ…cej siÄ™ do wykorzystania.\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s: nazwa lokalizacji zawiera znak spoza ASCII, pominięto: \"%s\"\n"
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s: nazwa lokalizacji zbyt długa, pominięto: \"%s\"\n"
diff --git a/src/bin/initdb/po/pt_BR.po b/src/bin/initdb/po/pt_BR.po
new file mode 100644
index 0000000..fd7d406
--- /dev/null
+++ b/src/bin/initdb/po/pt_BR.po
@@ -0,0 +1,1053 @@
+# Brazilian Portuguese message translation file for initdb
+#
+# Copyright (C) 2003-2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2003-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 12:54-0300\n"
+"PO-Revision-Date: 2010-09-25 00:45-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binário \"%s\" é inválido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "não pôde ler o binário \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "não pôde resolver caminho \"%s\" para forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, c-format
+msgid "out of memory"
+msgstr "sem memória"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "não pôde executar stat no arquivo \"%s\": %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "não pôde ler diretório \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "não pôde executar fsync no arquivo \"%s\": %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "não pôde renomear arquivo \"%s\" para \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "não pôde fechar diretório \"%s\": %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "não pôde abrir informação sobre processo: código de erro %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "não pôde alocar SIDs: código de erro %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "não pôde criar informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "não pôde iniciar processo para comando \"%s\": código de erro %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "não pôde executar novamente com informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "não pôde obter código de saída de subprocesso: código de erro %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "não pôde remover arquivo \"%s\": %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "não pôde remover diretório \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "não pôde encontrar ID de usuário efetivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "usuário não existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "falhou ao pesquisar nome de usuário: código de erro %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "comando não é executável"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "comando não encontrado"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo filho terminou com código de saída %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo filho foi terminado pela exceção 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo filho foi terminado pelo sinal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo filho terminou com status desconhecido %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "não pôde definir junção para \"%s\": %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "não pôde obter junção para \"%s\": %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "não pôde abrir arquivo \"%s\" para escrita: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "não pôde escrever no arquivo \"%s\": %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "não pôde fechar arquivo \"%s\": %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "não pôde executar comando \"%s\": %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "removendo diretório de dados \"%s\""
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "falhou ao remover diretório de dados"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "removendo conteúdo do diretório de dados \"%s\""
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "falhou ao remover conteúdo do diretório de dados"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "removendo diretório do WAL \"%s\""
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "falhou ao remover diretório do WAL"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "removendo conteúdo do diretório do WAL \"%s\""
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "falhou ao remover conteúdo do diretório do WAL"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "diretório de dados \"%s\" não foi removido a pedido do usuário"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "diretório do WAL \"%s\" não foi removido a pedido do usuário"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "não pode ser executado como root"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Por favor entre (utilizando, e.g., \"su\") como usuário (sem privilégios) que será o dono do processo do servidor."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" não é um nome de codificação do servidor válido"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "arquivo \"%s\" não existe"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Isso significa que você tem uma instalação corrompida ou especificou o diretório errado com a invocação da opção -L."
+
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "não pôde acessar arquivo \"%s\": %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "arquivo \"%s\" não é um arquivo regular"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "selecionando implementação de memória compartilhada dinâmica ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "selecionando max_connections padrão ... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "selecionando shared_buffers padrão ... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "selecionando fuso horário padrão ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "criando arquivos de configuração ... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "não pôde mudar permissões de \"%s\": %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "executando script de inicialização ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "arquivo de entrada \"%s\" não pertence ao PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Especifique o caminho correto utilizando a opção -L."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Digite nova senha de super-usuário: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Digite-a novamente: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Senhas não correspondem.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "não pôde ler senha do arquivo \"%s\": %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "arquivo de senhas \"%s\" está vazio"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "sinal foi recebido\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "não pôde escrever em processo filho: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() falhou"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "falhou ao restaurar configuração regional antiga \"%s\""
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "nome de configuração regional \"%s\" é inválido"
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Se o nome da configuração regional é específico do ICU, utilize --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "definições de configuração regional inválidas; verifique as variáveis de ambiente LANG e LC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "codificação não corresponde"
+
+#: initdb.c:2204
+#, 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 "A codificação que você escolheu (%s) e a codificação que a configuração regional selecionada utiliza (%s) não tem correspondência. Isto pode conduzir a um comportamento inesperado em funções de processamento de cadeia de caracteres."
+
+#: initdb.c:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Execute %s novamente e não especifique uma codificação explicitamente ou escolha uma outra combinação."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "A codificação que você selecionou (%s) não é suportada com o provedor ICU."
+
+#: initdb.c:2279
+#, fuzzy, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "não pôde converter nome de configuração regional \"%s\" para tag da língua: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU não é suportado por essa construção"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "não pôde obter língua de configuração regional \"%s\": %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "configuração regional \"%s\" tem língua desconhecida \"%s\""
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "configuração regional ICU deve ser especificado"
+
+#: initdb.c:2404
+#, fuzzy, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "Utilizando tag da língua \"%s\" para configuração regional ICU \"%s\".\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s inicializa um agrupamento de banco de dados PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPÇÃO]... [DIRDADOS]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=MÉTODO método de autenticação padrão para conexões locais\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=MÉTODO método de autenticação padrão para conexões TCP/IP locais\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=MÉTODO método de autenticação padrão para conexões de soquete locais\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DIRDADOS local do agrupamento de banco de dados\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=CODIFICAÇÃO ajusta a codificação padrão para novos bancos de dados\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access permite leitura/execução do grupo no diretório de dados\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE ajusta ID de configuração regional ICU para novos bancos de dados\n"
+
+#: initdb.c:2438
+#, fuzzy, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=REGRAS ajusta regras adicionais de agregação ICU para novos bancos de dados\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums verificações de páginas de dados\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE ajusta configuração regional padrão para novos bancos de dados\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" ajusta configuração regional padrão na respectiva categoria\n"
+" para novos bancos de dados (o ambiente é assumido como padrão)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale equivalente a --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ajusta provedor de configuração regional padrão para novos bancos de dados\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=ARQUIVO lê senha do novo super-usuário a partir do arquivo\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" configuração de busca textual padrão\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NOME nome do super-usuário do banco de dados\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt pergunta senha do novo super-usuário\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=DIRWAL local do diretório do log de transação\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Opções utilizadas com menos frequência:\n"
+
+#: initdb.c:2456
+#, fuzzy, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NOME=VALOR sobrescreve o valor padrão para parâmetro do servidor\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug mostra saída da depuração\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches define debug_discard_caches=1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRETÓRIO onde encontrar os arquivos de entrada\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean não remove após erros\n"
+
+#: initdb.c:2461
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync não espera mudanças serem escritas com segurança no disco\n"
+
+#: initdb.c:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions não mostra instruções para próximos passos\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show mostra definições internas\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only sincroniza somente os arquivos de banco de dados no disco e termina\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Outras opções:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Se o diretório de dados não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "método de autenticação \"%s\" é inválido para conexões \"%s\""
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "você precisa especificar uma senha para o super-usuário para habilitar a autenticação password"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: initdb.c:2533
+#, 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 "Você deve identificar o diretório onde os dados para esse sistema de banco de dados irá residir. Faça isso especificando a opção -D ou definindo a variável de ambiente PGDATA."
+
+#: initdb.c:2550
+#, c-format
+msgid "could not set environment"
+msgstr "não pôde definir variável de ambiente"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "O programa \"%s\" é requerido pelo %s mas não foi encontrado no mesmo diretório que \"%s\""
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "O programa \"%s\" foi encontrado pelo \"%s\" mas não tem a mesma versão que %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "local do arquivo de entrada deve ser um caminho absoluto"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "O agrupamento de banco de dados será inicializado com configuração regional \"%s\".\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "O agrupamento de banco de dados será inicializado com essa configuração regional:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " provedor: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " configuração regional ICU: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "não pôde encontrar codificação ideal para configuração regional \"%s\""
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Execute novamente %s com a opção -E."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Codificação \"%s\" sugerida pela configuração regional não é permitida como uma codificação do servidor.\n"
+"A codificação do banco de dados padrão será definida como \"%s\".\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "configuração regional \"%s\" requer codificação \"%s\" que não é suportada"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Codificação \"%s\" não é permitida como uma codificação do servidor."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Execute novamente %s com uma seleção de configuração regional diferente."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "A codificação padrão do banco de dados foi definida para \"%s\".\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "não pôde encontrar configuração de busca textual ideal para configuração regional \"%s\""
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "configuração de busca textual ideal para configuração regional \"%s\" é desconhecida"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "configuração de busca textual especificada \"%s\" pode não corresponder a configuração regional \"%s\""
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "A configuração de busca textual padrão será definida como \"%s\".\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "criando diretório %s ... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "não pôde criar diretório \"%s\": %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "alterando permissões no diretório existente %s ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "não pôde mudar permissões do diretório \"%s\": %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "diretório \"%s\" existe mas não está vazio"
+
+#: initdb.c:2840
+#, 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 "Se você quer criar um novo sistema de banco de dados, remova ou esvazie o diretório \"%s\" ou execute %s com um argumento ao invés de \"%s\"."
+
+#: initdb.c:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "não pôde acessar diretório \"%s\": %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "local do diretório do WAL deve ser um caminho absoluto"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Se você quer armazenar o WAL no mesmo, remova ou esvazie o diretório \"%s\"."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "não pôde criar link simbólico \"%s\": %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Ele contém um arquivo iniciado por ponto/invisível, talvez por ser um ponto de montagem."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Ele contém um diretório lost+found, talvez por ser um ponto de montagem."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Utilizar um ponto de montagem diretamente como diretório de dados não é recomendado.\n"
+"Crie um subdiretório no ponto de montagem."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "criando subdiretórios ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "executando pós-inicialização ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s requer um valor"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Executando no modo de depuração.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Executando no modo sem limpeza. Erros não serão removidos.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "provedor de configuração regional é desconhecido: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s não pode ser especificado a não ser que o provedor de configuração regional \"%s\" seja escolhido"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "sincronizando dados no disco ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "opção para perguntar a senha e um arquivo de senhas não podem ser especificados juntos"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumento de --wal-segsize deve ser um número"
+
+#: initdb.c:3359
+#, fuzzy, c-format
+#| msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "argumento de --wal-segsize deve ser uma potência de 2 entre 1 e 1024"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "nome de super-usuário \"%s\" não é permitido; nomes de roles não podem começar com \"pg_\""
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Os arquivos deste sistema de banco de dados pertencerão ao usuário \"%s\".\n"
+"Esse usuário deve ser o dono do processo do servidor também.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Verificações de páginas de dados estão habilitadas.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Verificações de páginas de dados estão desabilitadas.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Sincronização com o disco foi ignorada.\n"
+"O diretório de dados pode ser danificado se houver uma queda do sistema operacional.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "habilitando autenticação \"trust\" para conexões locais"
+
+#: initdb.c:3416
+#, 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 "Você pode mudá-lo editando o pg_hba.conf ou utilizando a opção -A, ou --auth-local e --auth-host, na próxima vez que você executar o initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "arquivolog"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Sucesso. Você pode iniciar o servidor de banco de dados utilizando:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/ru.po b/src/bin/initdb/po/ru.po
new file mode 100644
index 0000000..d05b42c
--- /dev/null
+++ b/src/bin/initdb/po/ru.po
@@ -0,0 +1,1295 @@
+# Russian message translation file for initdb
+# Copyright (C) 2004-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2004-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009.
+# Andrey Sudnik <sudnikand@yandex.ru>, 2010.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-02-02 18:10+0300\n"
+"PO-Revision-Date: 2023-09-11 16:13+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "неверный иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\""
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "ошибка при удалении каталога \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "пользователь не ÑущеÑтвует"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "не удалоÑÑŒ Ñоздать ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "не удалоÑÑŒ получить ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s\n"
+
+#: initdb.c:618 initdb.c:1605
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "удаление каталога данных \"%s\""
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "ошибка при удалении каталога данных"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "удаление Ñодержимого каталога данных \"%s\""
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "ошибка при удалении Ñодержимого каталога данных"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "удаление каталога WAL \"%s\""
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "ошибка при удалении каталога WAL"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "удаление Ñодержимого каталога WAL \"%s\""
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "ошибка при удалении Ñодержимого каталога WAL"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "каталог данных \"%s\" не был удалён по запроÑу пользователÑ"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "каталог WAL \"%s\" не был удалён по запроÑу пользователÑ"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "программу не должен запуÑкать root"
+
+#: initdb.c:756
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own "
+"the server process."
+msgstr ""
+"ПожалуйÑта, переключитеÑÑŒ на обычного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ "
+"\"su\"), которому будет принадлежать Ñерверный процеÑÑ."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" — некорректное Ð¸Ð¼Ñ Ñерверной кодировки"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "файл \"%s\" не ÑущеÑтвует"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified the wrong "
+"directory with the invocation option -L."
+msgstr ""
+"Это означает, что ваша уÑтановка PostgreSQL иÑпорчена или в параметре -L "
+"задан неправильный каталог."
+
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "нет доÑтупа к файлу \"%s\": %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "\"%s\" — не обычный файл"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "выбираетÑÑ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкой разделÑемой памÑти... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "выбираетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ max_connections по умолчанию... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "выбираетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ shared_buffers по умолчанию... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "выбираетÑÑ Ñ‡Ð°Ñовой поÑÑ Ð¿Ð¾ умолчанию... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "Ñоздание конфигурационных файлов... "
+
+#: initdb.c:1359 initdb.c:1373 initdb.c:1440 initdb.c:1451
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "не удалоÑÑŒ поменÑÑ‚ÑŒ права Ð´Ð»Ñ \"%s\": %m"
+
+#: initdb.c:1469
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "выполнÑетÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¹ Ñкрипт... "
+
+#: initdb.c:1481
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "входной файл \"%s\" не принадлежит PostgreSQL %s"
+
+#: initdb.c:1483
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Укажите корректный путь в параметре -L."
+
+#: initdb.c:1583
+msgid "Enter new superuser password: "
+msgstr "Введите новый пароль ÑуперпользователÑ: "
+
+#: initdb.c:1584
+msgid "Enter it again: "
+msgstr "Повторите его: "
+
+#: initdb.c:1587
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Пароли не Ñовпадают.\n"
+
+#: initdb.c:1611
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать пароль из файла \"%s\": %m"
+
+#: initdb.c:1614
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "файл Ð¿Ð°Ñ€Ð¾Ð»Ñ \"%s\" пуÑÑ‚"
+
+#: initdb.c:2026
+#, c-format
+msgid "caught signal\n"
+msgstr "получен Ñигнал\n"
+
+#: initdb.c:2032
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "не удалоÑÑŒ запиÑать в поток дочернего процеÑÑа: %s\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "ok\n"
+msgstr "ок\n"
+
+#: initdb.c:2129
+#, c-format
+msgid "setlocale() failed"
+msgstr "ошибка в setlocale()"
+
+#: initdb.c:2147
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль \"%s\""
+
+#: initdb.c:2155
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ошибочное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\""
+
+#: initdb.c:2156
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "ЕÑли Ñта локаль ÑвойÑтвенна ICU, укажите --icu-locale."
+
+#: initdb.c:2169
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "неверные уÑтановки локали; проверьте переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ LANG и LC_*"
+
+#: initdb.c:2195 initdb.c:2219
+#, c-format
+msgid "encoding mismatch"
+msgstr "неÑоответÑтвие кодировки"
+
+#: initdb.c:2196
+#, 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:2201 initdb.c:2222
+#, c-format
+msgid ""
+"Rerun %s and either do not specify an encoding explicitly, or choose a "
+"matching combination."
+msgstr ""
+"Ð”Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтите %s, не ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÑƒ Ñвно, либо выберите "
+"подходÑщее Ñочетание параметров локализации."
+
+#: initdb.c:2220
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð²Ð°Ð¼Ð¸ кодировка (%s) не поддерживаетÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU."
+
+#: initdb.c:2271
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "не удалоÑÑŒ получить из Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" метку Ñзыка: %s"
+
+#: initdb.c:2277 initdb.c:2329 initdb.c:2408
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU не поддерживаетÑÑ Ð² данной Ñборке"
+
+#: initdb.c:2300
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "не удалоÑÑŒ определить Ñзык Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\": %s"
+
+#: initdb.c:2326
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" получен неизвеÑтный Ñзык \"%s\""
+
+#: initdb.c:2392
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "необходимо задать локаль ICU"
+
+#: initdb.c:2396
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "Ð”Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU \"%s\" иÑпользуетÑÑ Ð¼ÐµÑ‚ÐºÐ° Ñзыка \"%s\".\n"
+
+#: initdb.c:2419
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s инициализирует клаÑтер PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2420
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: initdb.c:2421
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ПÐРÐМЕТР]... [КÐТÐЛОГ]\n"
+
+#: initdb.c:2422
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: initdb.c:2423
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr ""
+" -A, --auth=МЕТОД метод проверки подлинноÑти по умолчанию\n"
+" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… подключений\n"
+
+#: initdb.c:2424
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr ""
+" --auth-host=МЕТОД метод проверки подлинноÑти по умолчанию\n"
+" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… TCP/IP-подключений\n"
+
+#: initdb.c:2425
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr ""
+" --auth-local=МЕТОД метод проверки подлинноÑти по умолчанию\n"
+" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… подключений через Ñокет\n"
+
+#: initdb.c:2426
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]КÐТÐЛОГ раÑположение данных Ñтого клаÑтера БД\n"
+
+#: initdb.c:2427
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=КОДИРОВКРкодировка по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n"
+
+#: initdb.c:2428
+#, c-format
+msgid ""
+" -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access разрешить чтение/выполнение в каталоге данных "
+"длÑ\n"
+" группы\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=ЛОКÐЛЬ идентификатор локали ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+" --icu-rules=RULES set additional ICU collation rules for new "
+"databases\n"
+msgstr ""
+" --icu-rules=ПРÐВИЛРдополнительные правила Ñортировки ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… "
+"баз\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums включить контроль целоÑтноÑти Ñтраниц\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=ЛОКÐЛЬ локаль по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n"
+
+#: initdb.c:2433
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=ЛОКÐЛЬ\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=ЛОКÐЛЬ\n"
+" уÑтановить ÑоответÑтвующий параметр локали\n"
+" Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз (вмеÑто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· окружениÑ)\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale Ñквивалентно --locale=C\n"
+
+#: initdb.c:2438
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" провайдер оÑновной локали Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n"
+
+#: initdb.c:2440
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr ""
+" --pwfile=ФÐЙЛ прочитать пароль ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· файла\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=КОÐФИГУРÐЦИЯ\n"
+" ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка по умолчанию\n"
+
+#: initdb.c:2443
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”\n"
+
+#: initdb.c:2444
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt запроÑить пароль ÑуперпользователÑ\n"
+
+#: initdb.c:2445
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=КÐТÐЛОГ раÑположение журнала предзапиÑи\n"
+
+#: initdb.c:2446
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=РÐЗМЕР размер Ñегментов WAL (в мегабайтах)\n"
+
+#: initdb.c:2447
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Редко иÑпользуемые параметры:\n"
+
+#: initdb.c:2448
+#, c-format
+msgid ""
+" -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr ""
+" -c, --set ИМЯ=ЗÐÐЧЕÐИЕ переопределить значение Ñерверного параметра по\n"
+" умолчанию\n"
+
+#: initdb.c:2449
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug выдавать много отладочных Ñообщений\n"
+
+#: initdb.c:2450
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches уÑтановить debug_discard_caches=1\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L КÐТÐЛОГ раÑположение входных файлов\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищать поÑле ошибок\n"
+
+#: initdb.c:2453
+#, 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:2454
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr ""
+" --no-instructions не выводить инÑтрукции Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ñ… дейÑтвий\n"
+
+#: initdb.c:2455
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show показать внутренние уÑтановки\n"
+
+#: initdb.c:2456
+#, c-format
+msgid ""
+" -S, --sync-only only sync database files to disk, then exit\n"
+msgstr ""
+" -S, --sync-only только Ñинхронизировать Ñ Ð¤Ð¡ файлы базы и "
+"завершитьÑÑ\n"
+
+#: initdb.c:2457
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Другие параметры:\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: initdb.c:2460
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"ЕÑли каталог данных не указан, иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n"
+
+#: initdb.c:2462
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: initdb.c:2463
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: initdb.c:2491
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr ""
+"нераÑпознанный метод проверки подлинноÑти \"%s\" Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ \"%s\""
+
+#: initdb.c:2505
+#, c-format
+msgid ""
+"must specify a password for the superuser to enable password authentication"
+msgstr ""
+"Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ по паролю необходимо указать пароль "
+"ÑуперпользователÑ"
+
+#: initdb.c:2524
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: initdb.c:2525
+#, 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:2542
+#, c-format
+msgid "could not set environment"
+msgstr "не удалоÑÑŒ задать переменную окружениÑ"
+
+#: initdb.c:2560
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\""
+
+#: initdb.c:2563
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ "
+"верÑии %s"
+
+#: initdb.c:2578
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "раÑположение входных файлов должно задаватьÑÑ Ð°Ð±Ñолютным путём"
+
+#: initdb.c:2595
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "КлаÑтер баз данных будет инициализирован Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÑŽ \"%s\".\n"
+
+#: initdb.c:2598
+#, c-format
+msgid ""
+"The database cluster will be initialized with this locale configuration:\n"
+msgstr ""
+"КлаÑтер баз данных будет инициализирован Ñо Ñледующими параметрами локали:\n"
+
+#: initdb.c:2599
+#, c-format
+msgid " provider: %s\n"
+msgstr " провайдер: %s\n"
+
+#: initdb.c:2601
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " локаль ICU: %s\n"
+
+#: initdb.c:2602
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2632
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "не удалоÑÑŒ найти подходÑщую кодировку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\""
+
+#: initdb.c:2634
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "ПерезапуÑтите %s Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -E."
+
+#: initdb.c:2635 initdb.c:3168 initdb.c:3276 initdb.c:3296
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: initdb.c:2647
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Кодировка \"%s\", Ð¿Ð¾Ð´Ñ€Ð°Ð·ÑƒÐ¼ÐµÐ²Ð°ÐµÐ¼Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÑŽ, не годитÑÑ Ð´Ð»Ñ Ñервера.\n"
+"ВмеÑто неё в качеÑтве кодировки БД по умолчанию будет выбрана \"%s\".\n"
+
+#: initdb.c:2652
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" требуетÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\""
+
+#: initdb.c:2654
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Кодировка \"%s\" недопуÑтима в качеÑтве Ñерверной кодировки."
+
+#: initdb.c:2656
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "ПерезапуÑтите %s, выбрав другую локаль."
+
+#: initdb.c:2664
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr ""
+"Кодировка БД по умолчанию, Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð² ÑоответÑтвии Ñ Ð½Ð°Ñтройками: \"%s\".\n"
+
+#: initdb.c:2733
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr ""
+"не удалоÑÑŒ найти подходÑщую конфигурацию текÑтового поиÑка Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\""
+
+#: initdb.c:2744
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr ""
+"внимание: Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" нет извеÑтной конфигурации текÑтового поиÑка"
+
+#: initdb.c:2749
+#, c-format
+msgid ""
+"specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr ""
+"ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" может не ÑоответÑтвовать "
+"локали \"%s\""
+
+#: initdb.c:2754
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Выбрана ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка по умолчанию \"%s\".\n"
+
+#: initdb.c:2797 initdb.c:2868
+#, c-format
+msgid "creating directory %s ... "
+msgstr "Ñоздание каталога %s... "
+
+#: initdb.c:2802 initdb.c:2873 initdb.c:2921 initdb.c:2977
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m"
+
+#: initdb.c:2811 initdb.c:2883
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "иÑправление прав Ð´Ð»Ñ ÑущеÑтвующего каталога %s... "
+
+#: initdb.c:2816 initdb.c:2888
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "не удалоÑÑŒ поменÑÑ‚ÑŒ права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %m"
+
+#: initdb.c:2828 initdb.c:2900
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚"
+
+#: initdb.c:2832
+#, 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:2840 initdb.c:2910 initdb.c:3317
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доÑтупа к каталогу \"%s\": %m"
+
+#: initdb.c:2861
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "раÑположение каталога WAL должно определÑÑ‚ÑŒÑÑ Ð°Ð±Ñолютным путём"
+
+#: initdb.c:2904
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory "
+"\"%s\"."
+msgstr "ЕÑли вы хотите хранить WAL здеÑÑŒ, удалите или очиÑтите каталог \"%s\"."
+
+#: initdb.c:2914
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#: initdb.c:2933
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point."
+msgstr ""
+"Он Ñодержит файл Ñ Ñ‚Ð¾Ñ‡ÐºÐ¾Ð¹ (невидимый), возможно, Ñто точка монтированиÑ."
+
+#: initdb.c:2935
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Он Ñодержит подкаталог lost+found, возможно, Ñто точка монтированиÑ."
+
+#: initdb.c:2937
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"ИÑпользовать в качеÑтве каталога данных точку Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ "
+"рекомендуетÑÑ.\n"
+"Создайте в монтируемом реÑурÑе подкаталог и иÑпользуйте его."
+
+#: initdb.c:2963
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "Ñоздание подкаталогов... "
+
+#: initdb.c:3006
+msgid "performing post-bootstrap initialization ... "
+msgstr "выполнÑетÑÑ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ... "
+
+#: initdb.c:3167
+#, c-format
+msgid "-c %s requires a value"
+msgstr "Ð´Ð»Ñ -c %s требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ"
+
+#: initdb.c:3192
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Программа запущена в режиме отладки.\n"
+
+#: initdb.c:3196
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr ""
+"Программа запущена в режиме 'no-clean' - очиÑтки и иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº не "
+"будет.\n"
+
+#: initdb.c:3266
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нераÑпознанный провайдер локали: %s"
+
+#: initdb.c:3294
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: initdb.c:3301 initdb.c:3305
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s можно указать, только еÑли выбран провайдер локали \"%s\""
+
+#: initdb.c:3319 initdb.c:3396
+msgid "syncing data to disk ... "
+msgstr "Ñохранение данных на диÑке... "
+
+#: initdb.c:3327
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ запроÑить пароль и прочитать пароль из файла"
+
+#: initdb.c:3349
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргументом --wal-segsize должно быть чиÑло"
+
+#: initdb.c:3351
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "аргументом --wal-segsize должна быть Ñтепень двух от 1 до 1024"
+
+#: initdb.c:3365
+#, c-format
+msgid ""
+"superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr ""
+"Ð¸Ð¼Ñ \"%s\" Ð´Ð»Ñ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ допуÑкаетÑÑ; имена ролей не могут "
+"начинатьÑÑ Ñ \"pg_\""
+
+#: initdb.c:3367
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Файлы, отноÑÑщиеÑÑ Ðº Ñтой СУБД, будут принадлежать пользователю \"%s\".\n"
+"От его имени также будет запуÑкатьÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ñервера.\n"
+"\n"
+
+#: initdb.c:3383
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Контроль целоÑтноÑти Ñтраниц данных включён.\n"
+
+#: initdb.c:3385
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Контроль целоÑтноÑти Ñтраниц данных отключён.\n"
+
+#: initdb.c:3402
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Сохранение данных на диÑк пропуÑкаетÑÑ.\n"
+"Каталог данных может повредитьÑÑ Ð¿Ñ€Ð¸ Ñбое операционной ÑиÑтемы.\n"
+
+#: initdb.c:3407
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "включение метода аутентификации \"trust\" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… подключений"
+
+#: initdb.c:3408
+#, 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:3438
+msgid "logfile"
+msgstr "файл_журнала"
+
+#: initdb.c:3440
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Готово. Теперь вы можете запуÑтить Ñервер баз данных:\n"
+"\n"
+" %s\n"
+"\n"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)"
+
+#, c-format
+#~ msgid "could not stat file or directory \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m"
+
+#, c-format
+#~ msgid "could not remove file or directory \"%s\": %m"
+#~ msgstr "ошибка при удалении файла или каталога \"%s\": %m"
+
+#, c-format
+#~ msgid "The default database encoding has been set to \"%s\".\n"
+#~ msgstr "Ð’ качеÑтве кодировки БД по умолчанию уÑтановлена \"%s\".\n"
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "ÑимволичеÑкие ÑÑылки не поддерживаютÑÑ Ð² Ñтой ОС"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ открыть каталог \"%s\": %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ прочитать каталог \"%s\": %s\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %s"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памÑти\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: удаление каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: ошибка при удалении каталога журнала транзакций\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: очиÑтка каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: ошибка при очиÑтке каталога журнала транзакций\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr ""
+#~ "%s: каталог журнала транзакций \"%s\" не был удалён по запроÑу "
+#~ "пользователÑ\n"
+
+#~ msgid "%s: locale name too long, skipped: \"%s\"\n"
+#~ msgstr "%s: Ñлишком длинное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸, пропущено: \"%s\"\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n"
+#~ msgstr "%s: Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ Ñодержит не ASCII-Ñимволы, пропущено: \"%s\"\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Пригодные локали в ÑиÑтеме не найдены.\n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Добавьте параметр \"--debug\", чтобы узнать подробноÑти.\n"
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "Ñоздание базы template1 в %s/base/1... "
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ pg_authid... "
+
+#~ msgid "setting password ... "
+#~ msgstr "уÑтановка паролÑ... "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑтей... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "Ñоздание ÑиÑтемных предÑтавлений... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "загрузка опиÑаний ÑиÑтемных объектов... "
+
+#~ msgid "creating collations ... "
+#~ msgstr "Ñоздание правил Ñортировки... "
+
+#~ msgid "creating conversions ... "
+#~ msgstr "Ñоздание преобразований... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "Ñоздание Ñловарей... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "уÑтановка прав Ð´Ð»Ñ Ð²Ñтроенных объектов... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "Ñоздание информационной Ñхемы... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "загрузка Ñерверного Ñзыка PL/pgSQL... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "очиÑтка базы данных template1... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "копирование template1 в template0... "
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "копирование template1 в postgres... "
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ закрыть каталог \"%s\": %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ получить информацию о текущем пользователе: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ узнать Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ: %s\n"
+
+#~ msgid "Using the top-level directory of a mount point is not recommended.\n"
+#~ msgstr ""
+#~ "ИÑпользовать в качеÑтве оÑновного каталога точку Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ "
+#~ "рекомендуетÑÑ.\n"
diff --git a/src/bin/initdb/po/sv.po b/src/bin/initdb/po/sv.po
new file mode 100644
index 0000000..dc5e8fd
--- /dev/null
+++ b/src/bin/initdb/po/sv.po
@@ -0,0 +1,1093 @@
+# Swedish message translation file for initdb
+# Dennis Björklund <db@zigo.dhs.org>, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Magnus Hagander <magnus@hagander.net>, 2007.
+# Peter Eisentraut <peter_e@gmx.net>, 2009.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-31 19:50+0000\n"
+"PO-Revision-Date: 2023-08-31 21:59+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ogiltig binär \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "kunde inte läsa binär \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "kunde inte fsync:a fil \"%s\": %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "kunde inte öppna process-token: felkod %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "kunde inte allokera SID: felkod %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kunde inte skapa token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "kunde inte starta process för kommando \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "kunde inte hämta statuskod för underprocess: felkod %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "kunde inte ta bort fil \"%s\": %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "kunde inte ta bort katalog \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "kunde inte slå upp effektivt användar-id %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "användaren finns inte"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "misslyckad sökning efter användarnamn: felkod %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "kunde inte sätta en knutpunkt (junction) för \"%s\": %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "kunde inte få en knutpunkt (junction) för \"%s\": %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "kunde inte öppna fil \"%s\" för skrivning: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "kunde inte köra kommandot \"%s\": %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "tar bort datakatalog \"%s\""
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "misslyckades med att ta bort datakatalog"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "tar bort innehållet i datakatalog \"%s\""
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "misslyckades med att ta bort innehållet i datakatalogen"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "tar bort WAL-katalog \"%s\""
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "misslyckades med att ta bort WAL-katalog"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "tar bort innehållet i WAL-katalog \"%s\""
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "misslyckades med att ta bort innehållet i WAL-katalogen"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "datakatalog \"%s\" är ej borttagen på användares begäran"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-katalog \"%s\" är ej borttagen på användares begäran"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "kan inte köras som root"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Logga in (t.ex. med \"su\") som den (opriviligerade) användare som skall äga serverprocessen."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" är inte en giltig teckenkodning för servern"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "filen \"%s\" finns inte"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "Detta kan betyda att du har en korrupt installation eller att du har angivit felaktig katalog till flaggan -L."
+
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "kunde inte komma åt filen \"%s\": %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "filen \"%s\" är inte en normal fil"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "väljer mekanism för dynamiskt, delat minne ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "sätter förvalt värde för max_connections ... "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "sätter förvalt värde för shared_buffers ... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "sätter förvalt värde för tidszon ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "skapar konfigurationsfiler ... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "kunde inte ändra rättigheter på \"%s\": %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "kör uppsättningsskript..."
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "indatafil \"%s\" tillhör inte PostgreSQL %s"
+
+# The expected string length of bki_file (for the first "%s")
+# with a standard directory "/usr/local/pgsql", is such that
+# the translated message string produces a reasonable output.
+#
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Ange korrekt sökväg med flaggan -L."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Mata in ett nytt lösenord för superuser: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Mata in det igen: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Lösenorden stämde inte överens.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "kunde inte läsa lösenord i filen \"%s\": %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "lösenordsfilen \"%s\" är tom"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "mottog signal\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "kunde inte skriva till barnprocess: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() misslyckades"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "misslyckades med att återställa gamla lokalen \"%s\""
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "ogiltigt lokalnamn \"%s\""
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Om lokalnamnet är specifikt för ICU, använd --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "ogiltig lokalinställning. Kontrollera miljövariablerna LANG och LC_*"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "teckenkodning matchar inte"
+
+#: initdb.c:2204
+#, 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 "Teckenkodningen du har valt (%s) och teckenkodningen som valda lokalen använder (%s) passar inte ihop. Detta kommer leda till problem för funktioner som arbetar med strängar."
+
+#: initdb.c:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "Kör %s igen och ange antingen ingen explicit kodning eller välj en matchande kombination."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Den valda teckenkodningen (%s) stöds inte av ICU."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "kunde inte konvertera lokalnamn \"%s\" till språktagg: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU stöds inte av detta bygge"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "kunde inte härleda språk från lokalen \"%s\": %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "lokalen \"%s\" har ett okänt språk \"%s\""
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "ICU-lokal måste anges"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "Använder språktagg \"%s\" för ICU-lokal \"%s\".\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s initierar ett databaskluster för PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [FLAGGA]... [DATAKATALOG]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METOD förvald autentiseringsmetod för alla anslutningar\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METOD autentiseringsmetod för TCP/IP-anslutningar\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METOD autentiseringsmetod för anslutningar via unix-uttag\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATAKATALOG läge för detta databaskluster\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=KODNING sätter teckenkodning för nya databaser\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access tillåt läs/kör för grupp på datakatalogen\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOKAL sätt ID för ICU-lokal för nya databaser\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=REGLER sätt ytterligare ICU-jämförelseregler för nya databaser\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums använd checksummor på datablock\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOKAL sätt standardlokal för nya databaser\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOKAL\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOKAL\n"
+" sätter standardlokal i utvald kategori för\n"
+" nya databaser (förval hämtas ur omgivningen)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale samma som --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" sätt standard lokalleverantör för nya databaser\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FIL läser lösenord för superuser från fil\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" standardkonfiguration för textsökning\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAMN namn på databasens superuser\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt efterfråga lösenord för superuser\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR katalog för write-ahead-log (WAL)\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Mindre vanliga flaggor:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAMN=VÄRDE ersätt standardinställning för serverparameter\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug generera massor med debug-utskrifter\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches sätt debug_discard_caches=1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L KATALOG katalog där indatafiler skall sökas\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean städa inte upp efter fel\n"
+
+#: initdb.c:2461
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: initdb.c:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions skriv inte instruktioner för nästa steg\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show visa interna inställningar\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only synka bara databasfiler till disk, avsluta seden\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Andra flaggor:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Om datakatalogen inte anges så tas den från omgivningsvariabeln PGDATA.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "ogiltig autentiseringsmetod \"%s\" för anslutning av typen \"%s\""
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "du måste ange ett lösenord för superuser för att kunna slå på lösenordsautentisering"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: initdb.c:2533
+#, 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 "Du måste uppge den katalog där data för detta databassystem skall lagras. Gör det antingen med flaggan -D eller genom att sätta omgivningsvariabeln PGDATA."
+
+#: initdb.c:2550
+#, c-format
+msgid "could not set environment"
+msgstr "kunde inte sätta omgivningen"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "plats för indatafiler måste vara en absolut sökväg"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Databasklustret kommer att skapas med lokalnamn \"%s\".\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "Databasklustret kommer att initieras med denna lokalkonfiguration:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " leverantör: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU-lokal: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "kunde inte välja en lämplig kodning för lokal \"%s\""
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "Kör %s igen men med flaggan -E."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Teckenkodning \"%s\", tagen ur lokalnamnet, är inte godtagbar för servern.\n"
+"I dess ställe sättes databasens förvalda teckenkodning till \"%s\".\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "lokalen \"%s\" kräver ej supportad teckenkodning \"%s\""
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "Teckenkodning \"%s\" tillåts inte som serverteckenkodning."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "Kör %s igen men välj en annan lokal."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "kunde inte hitta en lämplig textsökningskonfiguration för lokalnamn \"%s\""
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "ingen lämplig textsökningskonfiguration för lokalnamn \"%s\""
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "uppgiven textsökningskonfiguration \"%s\" passar kanske inte till lokalnamn \"%s\""
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Förvald textsökningskonfiguration för databaser är satt till \"%s\".\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "skapar katalog %s ... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "sätter rättigheter på existerande katalog %s ... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "kunde inte ändra rättigheter på katalogen \"%s\": %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "katalogen \"%s\" existerar men är inte tom"
+
+#: initdb.c:2840
+#, 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 "Om du vill skapa ett nytt databassystem, tag då antingen bort eller töm katalogen \"%s\" eller kör %s med annat argument än \"%s\"."
+
+#: initdb.c:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-katalogen måste vara en absolut sökväg"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Om du vill spara WAL där, antingen radera eller töm katalogen \"%s\"."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "kan inte skapa symbolisk länk \"%s\": %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Den innehåller en gömd fil, med inledande punkt i namnet; kanske är detta en monteringspunkt."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Den innehåller \"lost+found\"; kanske är detta en monteringspunkt."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Att använda en monteringspunkt som datakatalog rekommenderas inte.\n"
+"Skapa först en underkatalog under monteringspunkten."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "Skapar underkataloger ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "utför initiering efter uppstättning..."
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s kräver ett värde"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Kör i debug-läge.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Kör i no-clean-läge. Misstag kommer inte städas bort.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "okänd lokalleverantör: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s kan inte anges om inte lokalleverantör \"%s\" valts"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "synkar data till disk ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "lösenordsfråga och lösenordsfil kan inte anges samtidigt"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumentet till --wal-segsize måste vara ett tal"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "argumentet till --wal-segsize måste vara en tvåpotens mellan 1 och 1024"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "superuser-namn \"%s\" tillåts inte; rollnamn får inte börja på \"pg_\""
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Filer tillhörande databasen kommer att ägas av användaren \"%s\".\n"
+"Denna användare måste också vara ägare av server-processen.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Checksummor för datablock är aktiva.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Checksummor för datablock är avstängda.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Avstod från synkning mot lagringsmedium.\n"
+"Datakatalogen kan komma att fördärvas om operativsystemet störtar.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "slår på autentiseringsmetod \"trust\" för lokala anslutningar"
+
+#: initdb.c:3416
+#, 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 "Du kan ändra detta genom att redigera pg_hba.conf eller genom att sätta flaggor -A eller --auth-local och --auth-host nästa gång du kör initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "loggfil"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Lyckades. Du kan nu starta databasservern med:\n"
+"\n"
+" %s\n"
+"\n"
+
+#, c-format
+#~ msgid "The default database encoding has been set to \"%s\".\n"
+#~ msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "kan inte skapa token för begränsad åtkomst på denna plattorm: felkod %lu"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#, c-format
+#~ msgid "could not remove file or directory \"%s\": %m"
+#~ msgstr "kunde inte ta bort fil eller katalog \"%s\": %m"
+
+#, c-format
+#~ msgid "could not stat file or directory \"%s\": %m"
+#~ msgstr "kunde inte ta status på fil eller katalog \"%s\": %m"
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "symboliska länkar stöds inte på denna plattform"
diff --git a/src/bin/initdb/po/tr.po b/src/bin/initdb/po/tr.po
new file mode 100644
index 0000000..c26ab1a
--- /dev/null
+++ b/src/bin/initdb/po/tr.po
@@ -0,0 +1,1159 @@
+# translation of initdb.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006, 2007.
+# Nicolai Tufar <ntufar@gmail.com>, 2004, 2005, 2006, 2007.
+# Abdullah GÃœLNER <agulne@gmail.com>, 2018, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-06-17 21:44+0000\n"
+"PO-Revision-Date: 2019-06-18 09:56+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"X-Poedit-Basepath: ../postgresql-8.0.3/src\n"
+
+#: ../../../src/common/logging.c:188
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/common/logging.c:195
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/common/logging.c:202
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "geçerli dizin tespit edilemedi: %m"
+
+#: ../../common/exec.c:157
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:207
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:271 ../../common/exec.c:310
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %m"
+
+#: ../../common/exec.c:288
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" okuma hatası: %m"
+
+#: ../../common/exec.c:541
+#, c-format
+msgid "pclose failed: %m"
+msgstr "pclose başarısız oldu: %m"
+
+#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807
+#: initdb.c:339
+#, c-format
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/file_utils.c:81 ../../common/file_utils.c:183
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" dosyası durumlanamadı: %m"
+
+#: ../../common/file_utils.c:160 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" dizini açılamıyor: %m"
+
+#: ../../common/file_utils.c:194 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" dizini okunamıyor: %m"
+
+#: ../../common/file_utils.c:226 ../../common/file_utils.c:285
+#: ../../common/file_utils.c:359
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" dosyası açılamıyor: %m"
+
+#: ../../common/file_utils.c:297 ../../common/file_utils.c:367
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" dosyası fsync hatası: %m"
+
+#: ../../common/file_utils.c:377
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" -- \"%s\" ad değiştirme hatası: %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" dizini kapatılamadı: %m"
+
+#: ../../common/restricted_token.c:69
+#, c-format
+msgid "cannot create restricted tokens on this platform"
+msgstr "bu platformda kısıtlı andaç (restricted token) oluşturulamıyor"
+
+#: ../../common/restricted_token.c:78
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "process token açma başarısız: hata kodu %lu"
+
+#: ../../common/restricted_token.c:91
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDler ayrılamadı: hata kodu %lu"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kısıtlı andaç (restricted token) oluşturulamadı: hata kodu %lu"
+
+#: ../../common/restricted_token.c:131
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" komutu için işlem (process) başlatılamadı: hata kodu %lu"
+
+#: ../../common/restricted_token.c:169
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kısıtlı andaç (restricted token) ile tekrar çalıştırılamadı: hata kodu %lu"
+
+#: ../../common/restricted_token.c:185
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "alt-işlemden çıkış kodu alınamadı: hata kodu %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "\"%s\" dosya ya da dizininin durumu görüntülenemedi (stat): %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "\"%s\" dosyası ya da dizini silinemedi: %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "geçerli kullanıcı ID si bulunamadı %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "kullanıcı mevcut değil"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "kullanıcı adı arama başarısız: hata kodu %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "komut çalıştırılabilir değil"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "komut bulunamadı"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "\"%s\" için junction ayarlanamadı: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "\"%s\" için junction bulunamadı: %s\n"
+
+#: initdb.c:495 initdb.c:1534
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" dosyası, okunmak için açılamadı: %m"
+
+#: initdb.c:550 initdb.c:858 initdb.c:884
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "\"%s\" dosyası, yazmak için açılamadı: %m"
+
+#: initdb.c:557 initdb.c:564 initdb.c:864 initdb.c:889
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" dosyasına yazma hatası: %m"
+
+#: initdb.c:582
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "\"%s\" komutu yürütülemedi: %m"
+
+#: initdb.c:600
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "\"%s\" veri dizini siliniyor"
+
+#: initdb.c:602
+#, c-format
+msgid "failed to remove data directory"
+msgstr "veri dizini silme başarısız"
+
+#: initdb.c:606
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "\"%s\" veri dizininin içindekiler siliniyor"
+
+#: initdb.c:609
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "veri dizininin içindekileri silme işlemi başarısız"
+
+#: initdb.c:614
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "\"%s\" WAL dizini siliniyor"
+
+#: initdb.c:616
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL dizini silme başarısız"
+
+#: initdb.c:620
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "\"%s\" WAL dizininin içindekiler siliniyor"
+
+#: initdb.c:622
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL dizininin içeriğini silme işlemi başarısız"
+
+#: initdb.c:629
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "\"%s\" veri dizini kullanıcının isteği üzerine silinmedi"
+
+#: initdb.c:633
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "\"%s\" WAL dizini kullanıcının isteği üzerine silinmedi"
+
+#: initdb.c:651
+#, c-format
+msgid "cannot be run as root"
+msgstr "root kullanıcısıyla çalıştırılamaz"
+
+#: initdb.c:653
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"Lütfen (örneğin \"su\" kullanarak ) sunucu sürecinin sahibi olacak\n"
+"(ayrıcalıksız) bir kullanıcıyla giriş yapın.\n"
+
+#: initdb.c:686
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" geçerli bir sunucu dil kodlaması adı değil"
+
+#: initdb.c:817
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "\"%s\" dosyası mevcut değil"
+
+#: initdb.c:819 initdb.c:826 initdb.c:835
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"Bu durum, bozulmus bir kurulumunuz olduÄŸu ya da\n"
+"-L parametresi ile yanlış dizin belirttiğiniz anlamına gelir.\n"
+
+#: initdb.c:824
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "\"%s\" dosyası erişim hatası: %m"
+
+#: initdb.c:833
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "\"%s\" düzgün bir dosya değildir"
+
+#: initdb.c:978
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "dinamik paylaşılan bellek (shared memory) uygulaması seçimi ... "
+
+#: initdb.c:987
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "ön tanımlı max_connections seçiliyor ... "
+
+#: initdb.c:1018
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "öntanımlı shared_buffers değeri seçiliyor ... "
+
+#: initdb.c:1052
+#, c-format
+msgid "selecting default timezone ... "
+msgstr "ön tanımlı saat dilimi (timezone) seçiliyor ... "
+
+#: initdb.c:1086
+msgid "creating configuration files ... "
+msgstr "yapılandırma dosyaları yaratılıyor ... "
+
+#: initdb.c:1239 initdb.c:1258 initdb.c:1344 initdb.c:1359
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "\"%s\" için erişim hakları değiştirilemdi: %m"
+
+#: initdb.c:1381
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "önyükleme komut dosyası çalıştırılıyor ..."
+
+#: initdb.c:1393
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "\"%s\" girdi dosyası PostgreSQL'e ait değil %s"
+
+#: initdb.c:1396
+#, c-format
+msgid "Check your installation or specify the correct path using the option -L.\n"
+msgstr "Kurulumunuzu kontrol edin ya da -L seçeneği ile doğru dizini belirtin.\n"
+
+#: initdb.c:1511
+msgid "Enter new superuser password: "
+msgstr "Yeni superuser parolasını giriniz: "
+
+#: initdb.c:1512
+msgid "Enter it again: "
+msgstr "Bir kez daha giriniz: "
+
+#: initdb.c:1515
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Parolalar uyuşmadı.\n"
+
+#: initdb.c:1541
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "\"%s\" dosyasından parola okunamadı: %m"
+
+#: initdb.c:1544
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "\"%s\" parola dosyası boş"
+
+#: initdb.c:2107
+#, c-format
+msgid "caught signal\n"
+msgstr "sinyal yakalandı\n"
+
+#: initdb.c:2113
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "alt (child) sürece yazılamadı: %s\n"
+
+#: initdb.c:2121
+#, c-format
+msgid "ok\n"
+msgstr "tamam\n"
+
+#: initdb.c:2211
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() başarısız"
+
+#: initdb.c:2232
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "Eski \"%s\" yerel ayarlarını (locale) geri yükleme başarısız oldu"
+
+#: initdb.c:2241
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "geçersiz yerel ayar (locale) adı \"%s\""
+
+#: initdb.c:2252
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "geçersiz yerel ayarlar; LANG ve LC_ * ortam değişkenlerini kontrol edin"
+
+#: initdb.c:2279
+#, c-format
+msgid "encoding mismatch"
+msgstr "dil kodlaması uyuşmazlığı"
+
+#: initdb.c:2281
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"Seçtiğiniz (%s) dil kodlaması ve seçilen yerelin kullandığı dil \n"
+"kodlaması (%s) uyuşmamaktadır. Bu durum, çeşitli metin işleme \n"
+" fonksiyonlarının yanlış çalışmasına neden olabilir. Bu durumu \n"
+" düzeltebilmek için %s komutunu yeniden çalıştırın ve de ya kodlama \n"
+" belirtmeyin ya da eşleştirilebilir bir kodlama seçin.\n"
+
+#: initdb.c:2353
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%sbir PostgreSQL Veritabanı kümesini ilklendirir.\n"
+"\n"
+
+#: initdb.c:2354
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: initdb.c:2355
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [SEÇENEK]... [DATADIR]\n"
+
+#: initdb.c:2356
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: initdb.c:2357
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD yerel bağlantılar için ön tanımlı kimlik doğrulama yöntemi\n"
+
+#: initdb.c:2358
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD yerel TCP/IP bağlantıları için ön tanımlı kimlik doğrulama yöntemi\n"
+
+#: initdb.c:2359
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD yerel soket bağlantıları için ön tanımlı kimlik doğrulama yöntemi\n"
+
+#: initdb.c:2360
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr "[-D, --pgdata=]DATADIR bu veritabanı kümesi için yer\n"
+
+#: initdb.c:2361
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING yeni veritabanları için öntanımlı dil kodlamasını ayarlar\n"
+
+#: initdb.c:2362
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access veri dizininde grup erişimine (okuma/yürütme) izin ver\n"
+
+#: initdb.c:2363
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE yeni veritabanı için öntanımlı yerel\n"
+
+#: initdb.c:2364
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" yeni veritabanları için ilgili kategorideki öntanımlı yerel bilgisini\n"
+" çevre değişkenlerinden al\n"
+
+#: initdb.c:2368
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale --locale=C'ye eÅŸdeÄŸer\n"
+
+#: initdb.c:2369
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=DOSYA yeni superuser için parolayı dosyadan oku\n"
+
+#: initdb.c:2370
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" öntanımlı metin arama yapılandırması\n"
+
+#: initdb.c:2372
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME veritabanı superuser kullanıcısı adı\n"
+
+#: initdb.c:2373
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt yeni superuser için parola sorar\n"
+
+#: initdb.c:2374
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR transaction log dizininin yeri\n"
+
+#: initdb.c:2375
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL segmentlerinin boyutu, megabayt olarak\n"
+
+#: initdb.c:2376
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Daha az kullanılan seçenekler:\n"
+
+#: initdb.c:2377
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug bol miktarda debug çıktısı üretir\n"
+
+#: initdb.c:2378
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums veri sayfası (data page) doğrulamasını kullan\n"
+
+#: initdb.c:2379
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY girdi dosyalarının nerede bulunacağını belirtir\n"
+
+#: initdb.c:2380
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean hatalardan sonra temizlik yapma\n"
+
+#: initdb.c:2381
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync değişikliklerin diske yazılmasını bekleme\n"
+
+#: initdb.c:2382
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show dahili ayarları gösterir\n"
+
+#: initdb.c:2383
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr " -S, --sync-only sadece veri dizinini sync et\n"
+
+#: initdb.c:2384
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Diğer seçenekler:\n"
+
+#: initdb.c:2385
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: initdb.c:2386
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: initdb.c:2387
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Eğer veri dizini belirtilmezse, PGDATA çevresel değişkeni kullanılacaktır\n"
+
+#: initdb.c:2389
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: initdb.c:2417
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "\"%2$s\"bağlantıları için geçersiz kimlik doğrulama yöntemi \"%1$s\""
+
+#: initdb.c:2433
+#, c-format
+msgid "must specify a password for the superuser to enable %s authentication"
+msgstr "%s kimlik doğrulamasını etkinleştirmek için superuser'a parola atamanız gerekmektedir."
+
+#: initdb.c:2460
+#, c-format
+msgid "no data directory specified"
+msgstr "hiçbir veri dizini belirtilmedi"
+
+#: initdb.c:2462
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"Bu veritabanı sistemi için verinin hangi dizinde duracağını belirtmeniz\n"
+"gerekmektedir. Bunu ya -D komut satırı seçeneği ile ya da \n"
+"PGDATA çevresel değişkeni ile yapabilirsiniz.\n"
+
+#: initdb.c:2497
+#, c-format
+msgid ""
+"The program \"postgres\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%s, \"postgres\" programına gereksinim duymaktadır, ancak bu program \"%s\"\n"
+"ile aynı dizinde bulunamadı.\n"
+"Kurulumunuzu kontrol ediniz."
+
+#: initdb.c:2502
+#, c-format
+msgid ""
+"The program \"postgres\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"\"postgres\" programı \"%s\" tarafından bulundu; ancak bu program\n"
+"%s ile aynı sürüm numarasına sahip değil.\n"
+"Kurulumunuzu kontrol ediniz."
+
+#: initdb.c:2521
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "girdi dosyasının yeri mutlak bir yol olarak verilmeli"
+
+#: initdb.c:2538
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "Veritabanı kümesi \"%s\" yerel ayarları ile oluşturulacak.\n"
+
+#: initdb.c:2541
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"Veritabanı kümesi aşağıdaki yerellerle ilklendirilecek:\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2565
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "\"%s\" yerel ayarları için uygun dil kodlaması bulunamadı"
+
+#: initdb.c:2567
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "%s komutunu -E seçeneği ile yeniden çalıştırın.\n"
+
+#: initdb.c:2568 initdb.c:3196 initdb.c:3217
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Ayrıntılı bilgi için \"%s --help\" komutunu deneyebilirsiniz.\n"
+
+#: initdb.c:2581
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"\"%s\" dil kodlaması sunucu tarafında izin verilen bir dil kodlaması değildir\n"
+"Bunun yerine, öntanımlı veritabanı dil kodlaması \"%s\" olacaktır.\n"
+
+#: initdb.c:2586
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "\"%s\" yereli desteklenmeyen \"%s\" dil kodlamasını gerektirir"
+
+#: initdb.c:2589
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"\"%s\" dil kodlaması sunucu tarafında izin verilen bir dil kodlaması değildir\n"
+" %s değişik bir yerel ayar (locale) ile tekrar çalıştırılmalı.\n"
+
+#: initdb.c:2598
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Öntanımlı veritabanı dil kodlaması buna göre \"%s\" olarak ayarlandı.\n"
+
+#: initdb.c:2666
+#, c-format
+msgid "%s: could not find suitable text search configuration for locale \"%s\"\n"
+msgstr "%s: \"%s\" yereli için uygun metin arama yapılandırması bulunamadı\n"
+
+#: initdb.c:2677
+#, c-format
+msgid "%s: warning: suitable text search configuration for locale \"%s\" is unknown\n"
+msgstr "%s: uyarı: \"%s\" yereli için uygun metin arama yapılandırması bilinmiyor.\n"
+
+#: initdb.c:2682
+#, c-format
+msgid "%s: warning: specified text search configuration \"%s\" might not match locale \"%s\"\n"
+msgstr "%s: uyarı: belirtilen metin arama yapılandırması \"%s\", \"%s\" yereli ile eşleşmeyebilir\n"
+
+#: initdb.c:2687
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Öntanımlı metin arama yapılandırması \"%s\" olarak ayarlanacak.\n"
+
+#: initdb.c:2731 initdb.c:2813
+#, c-format
+msgid "creating directory %s ... "
+msgstr "%s dizini yaratılıyor ... "
+
+#: initdb.c:2737 initdb.c:2819 initdb.c:2884 initdb.c:2946
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" dizini oluşturulamadı: %m"
+
+#: initdb.c:2748 initdb.c:2831
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "mevcut %s dizininin izinleri düzeltiliyor ... "
+
+#: initdb.c:2754 initdb.c:2837
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "\"%s\" dizininin erişim hakları değiştirilemedi: %m"
+
+#: initdb.c:2768 initdb.c:2851
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" dizini mevcut, ama boÅŸ deÄŸil"
+
+#: initdb.c:2773
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"Yeni bir veritabanı sistemi yaratmak istiyorsanız, ya \"%s\" dizinini \n"
+"kaldırın, ya boşaltın ya da %s 'i \n"
+"\"%s\" argümanından başka bir argüman ile çalıştırın.\n"
+
+#: initdb.c:2781 initdb.c:2863 initdb.c:3232
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" dizine erişim hatası: %m"
+
+#: initdb.c:2804
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL dizininin yeri mutlak bir yol olarak verilmeli"
+
+#: initdb.c:2856
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory\n"
+"\"%s\".\n"
+msgstr ""
+"Eğer transaction kayıt dosyasını saklamak istiyorsanız, \n"
+"\"%s\" dizinini kaldırın ya da boşaltın\n"
+
+#: initdb.c:2870
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" oluşturma hatası: %m"
+
+#: initdb.c:2875
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "bu platformda sembolik bağlantı (symlink) desteklenmemektedir"
+
+#: initdb.c:2899
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n"
+msgstr " noktayla başlayan/gizli dosya içeriyor, muhtemelen bu bir bağlanma noktası (mount point) .\n"
+
+#: initdb.c:2902
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr ""
+"lost+found klasörü içeriyor, muhtemelen bu bir bağlanma noktası (mount point) .\n"
+"\n"
+
+#: initdb.c:2905
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"Bir bağlama noktasının doğrudan veri dizini olarak kullanılması önerilmez.\n"
+"Bağlama noktası altında bir alt dizin oluşturun.\n"
+
+#: initdb.c:2931
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "alt dizinler oluÅŸturuluyor ... "
+
+#: initdb.c:2977
+msgid "performing post-bootstrap initialization ... "
+msgstr "önyükleme sonrası başlatmayı gerçekleştirme ..."
+
+#: initdb.c:3134
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Debug modunda çalışıyor.\n"
+
+#: initdb.c:3138
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "noclean modunda çalışıyor. Hatalar temizlenmeyecektir.\n"
+
+#: initdb.c:3215
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı girdisi var (ilki \"%s\")"
+
+#: initdb.c:3236 initdb.c:3325
+msgid "syncing data to disk ... "
+msgstr "veriyi diske senkronize etme ..."
+
+#: initdb.c:3245
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "parola istemi (prompt) ve parola dosyası birlikte belirtilemez"
+
+#: initdb.c:3270
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize'ın argümanı bir sayı olmalıdır"
+
+#: initdb.c:3275
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize'ın argümanı 2'nin 1 ve 1024 arasındaki bir üssü olmalıdır"
+
+#: initdb.c:3292
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "superuser adı \"%s\"e izin verilmiyor; rol adları \"pg_\" ile başlayamaz"
+
+#: initdb.c:3296
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Bu veritabanı sistemine ait olan dosyaların sahibi \"%s\" kullanıcısı olacaktır.\n"
+"Bu kullanıcı aynı zamanda sunucu sürecinin de sahibi olmalıdır.\n"
+"\n"
+
+#: initdb.c:3312
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Veri sayfası (data page) doğrulama etkinleştirilmiştir.\n"
+
+#: initdb.c:3314
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Veri sayfası (data page) doğrulama devre dışı bırakılmıştır.\n"
+
+#: initdb.c:3331
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Diske senkronizasyon atlandı.\n"
+"İşletim sistemi çökerse veri dizini bozulabilir.\n"
+
+#: initdb.c:3336
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "yerel bağlantıları için \"trust\" kimlik doğrulaması etkinleştiriliyor"
+
+#: initdb.c:3337
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"Bunu, pg_hba.conf dosyasını düzenleyerek ya da initdb'yi yeniden çalıştırdığınızda\n"
+" -A parametresi ile veya --auth-local ve --auth-host ile deÄŸiÅŸtirebilirsiniz..\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3362
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3364
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"İşlem başarılı. Veritabanı sunucusunu aşağıdaki gibi başlatabilirsiniz:\n"
+"\n"
+" %s\n"
+"\n"
+"\n"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "\"%s\" sembolik linki okunamadı"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasının durumu görüntülenemedi (stat): %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini açılamadı: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini okunamadı: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası açılamadı: %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası fsync işlemi başarısız: %s\n"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "\"%s\": \"%s\" dosyasının adı \"%s\" olarak değiştirilemedi: %s\n"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini açma başarısız: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini okuma başarısız: %s\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s: process token açma başarısız: hata kodu %lu\n"
+
+#~ msgid "could not stat file or directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dosya ya da dizini bulunamadı: %s\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: yetersiz bellek\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: \"%s\" dosyası, okunmak için açılamadı: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for writing: %s\n"
+#~ msgstr "%s: \"%s\" dosyası, yazılmak için açılamadı: %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasına yazılamadı: %s\n"
+
+#~ msgid "%s: could not execute command \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" komutu yürütme başlatma hatası: %s\n"
+
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s: \"%s\" dosyası mevcut değil\n"
+
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasına erişim hatası: %s\n"
+
+#~ msgid "%s: failed to restore old locale \"%s\"\n"
+#~ msgstr "%s: \"%s\" eski yerel ayar (locale) dosyasının geri yüklenmesi başarısız\n"
+
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s: geçersiz yerel ayar (locale) adı \"%s\"\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini oluşturma başarısız: %s\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizine erişim hatası: %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: symbolic link \"%s\" oluşturma hatası: %s\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s: bu platformda sembolik bağlantı (symlink) desteklenmemektedir\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: transaction log dizini siliniyor \"%s\"\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: transaction log dizini silme başarısız\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: transaction log dizininin içindekileri siliniyor \"%s\"\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: transaction log dizininin içindekilerinin silme işlemini başarısız\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s: \"%s\" transaction log dizini kullanıcının isteği üzerine silinmedi\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: geçerli kullanıcı hakkında bilgi alınamadı: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: geçerli kullanıcı adı alınamadı: %s\n"
+
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "%s/base/1 içinde template1 veritabanı yaratılıyor."
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "pg_authid ilklendiriliyor ... "
+
+#~ msgid "setting password ... "
+#~ msgstr "şifre ayarlanıyor ... "
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "bağlılıklar ilklendiriliyor ... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "sistem viewları yaratılıyor ... "
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "sistem nesnelerinin açıklamaları yükleniyor ... "
+
+#~ msgid "creating collations ... "
+#~ msgstr "dönüşümler yükleniyor ..."
+
+#~ msgid "%s: locale name too long, skipped: %s\n"
+#~ msgstr "%s:yerel adı çok uzun,: %s atlandı\n"
+
+#~ msgid "%s: locale name has non-ASCII characters, skipped: %s\n"
+#~ msgstr "%s:yerel adı ASCII olmayan karakterler içeriyor, atlanan: %s\n"
+
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "Kullanılabilir sistem yerelleri bulunamadı. \n"
+
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "Ayrıntıları görmek için \"--debug\" seçeneğini kullanınız. \n"
+
+#~ msgid "not supported on this platform\n"
+#~ msgstr "bu platformda desteklenmiyor\n"
+
+#~ msgid "creating conversions ... "
+#~ msgstr "dönüşümler yükleniyor ... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "sözlükler oluşturuluyor ... "
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "gömülü nesnelerdeki izinler ayarlanıyor ... "
+
+#~ msgid "creating information schema ... "
+#~ msgstr "information schema yaratılıyor ... "
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "PL/pgSQL sunucu tarafı dili yükleniyor ... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "template1 veritabanı vakumlanıyor ... "
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "template1 template0'a kopyalanıyor ... "
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "template1, postgres'e kopyalanıyor ... "
+
+#~ msgid "%s: unrecognized authentication method \"%s\"\n"
+#~ msgstr "%s: bilinmeyen yetkilendirme yöntemi\"%s\".\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
diff --git a/src/bin/initdb/po/uk.po b/src/bin/initdb/po/uk.po
new file mode 100644
index 0000000..bcda4ce
--- /dev/null
+++ b/src/bin/initdb/po/uk.po
@@ -0,0 +1,1053 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:19+0000\n"
+"PO-Revision-Date: 2023-12-19 16:43+0100\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/initdb.pot\n"
+"X-Crowdin-File-ID: 943\n"
+"X-Generator: Poedit 3.4.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "невірний бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m"
+
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не вдалоÑÑ fsync файл \"%s\": %m"
+
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu"
+
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не можливо видалити файл \"%s\": %m"
+
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "кориÑтувача не Ñ–Ñнує"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s\n"
+
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m"
+
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу: %m"
+
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m"
+
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\""
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\""
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ WAL директорії \"%s\""
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ директорію WAL"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії WAL \"%s\""
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії WAL"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… \"%s\" не видалена за запитом кориÑтувача"
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ WAL \"%s\" не видалена за запитом кориÑтувача"
+
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "не може виконуватиÑÑŒ Ñк root"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "Будь лаÑка, увійдіть (за допомогою, наприклад, \"su\") Ñк (непривілейований) кориÑтувач, від імені Ñкого буде запущено Ñерверний процеÑ."
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" невірне ім'Ñ Ñерверного кодуваннÑ"
+
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "файл \"%s\" не Ñ–Ñнує"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, 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:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "немає доÑтупу до файлу \"%s\": %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "файл \"%s\" не є звичайним файлом"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "обираєтьÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— Ñпільної пам'ÑÑ‚Ñ– ... "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr ""
+"обираєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ max_connections ... \n"
+" "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "обираєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ shared_buffers... "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "обираєтьÑÑ Ñ‡Ð°Ñовий поÑÑ Ð·Ð° замовчуваннÑм ... "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð¸Ñ… файлів... "
+
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "неможливо змінити дозволи \"%s\": %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "виконуємо Ñценарій ініціалізації ... "
+
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "вхідний файл \"%s\" не належить PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "Вкажіть правильний шлÑÑ… за допомогою параметру -L."
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "Введіть новий пароль Ð´Ð»Ñ superuser: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "Введіть знову: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Паролі не Ñпівпадають.\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ пароль з файлу \"%s\": %m"
+
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "файл з паролÑми \"%s\" Ñ” порожнім"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "отримано Ñигнал\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "не вдалоÑÑ Ð½Ð°Ð¿Ð¸Ñати у дочірній процеÑ: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() завершивÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾"
+
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ñтару локаль \"%s\""
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "не допуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\""
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "Якщо ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– характерне Ð´Ð»Ñ ICU, викориÑтовуйте --icu-locale."
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "неприпуÑтимі параметри локалі; перевірте LANG та LC_* змінні Ñередовища"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "невідповідніÑÑ‚ÑŒ кодуваннÑ"
+
+#: initdb.c:2204
+#, 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:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "ПерезапуÑÑ‚Ñ–Ñ‚ÑŒ %s Ñ– або не вказуйте ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ñмо або виберіть відповідну комбінацію."
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "Обране вами ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ (%s) не підтримуєтьÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU."
+
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ локальну назву \"%s\" на мітку мови: %s"
+
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "ICU не підтримуєтьÑÑ Ð² цій збірці"
+
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ мову з локалі \"%s\": %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "locale \"%s\" має невідому мову \"%s\""
+
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "Ðеобхідно вказати локаль ICU"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ мови \"%s\" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– ICU \"%s\".\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s ініціалізує клаÑтер баз даних PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметри:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, -- auth=METHOD метод аутентифікації за замовчуваннÑм Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… підключень\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD метод аутентифікації за замовчуваннÑм Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ TCP/IP підключеннÑ\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD метод аутентифікації за замовчуваннÑм Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· Ñокет\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D - pgdata =] DATADIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ð°Ñтеру цієї бази даних\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— бази даних\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access дозволити читати/виконувати у каталозі даних Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE вÑтановлює ідентифікатор мови ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=RULES вÑтановити додаткові правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums викориÑтовувати контрольні Ñуми Ñторінок\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE вÑтановлює локаль за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– за замовчуваннÑм Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñ— категорії в\n"
+" нових базах даних (заміÑÑ‚ÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· Ñередовища)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale еквівалентно --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" вÑтановлює провайдер локалі за замовченнÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE прочитати пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑуперкориÑтувача з файлу\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr " -T, --text-search-config=CFG ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку за замовчуваннÑм\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME ім'Ñ ÑуперкориÑтувача бази даних\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt запитувати пароль нового ÑуперкориÑтувача\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ попереднього запиÑу\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE розмір Ñегментів WAL у мегабайтах\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Рідковживані параметри:\n"
+
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=VALUE перевизначити параметр за замовчуваннÑм Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° Ñервера\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug генерувати багато налагоджувальних повідомлень\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches вÑтановити debug_discard_caches=1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… файлів\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr ""
+" -n, --no-clean не очищувати піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº\n"
+" \n"
+
+#: initdb.c:2461
+#, 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:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions не друкувати інÑтрукції Ð´Ð»Ñ Ð½Ð°Ñтупних кроків\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show показати внутрішні налаштуваннÑ\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only лише Ñинхронізувати файли бази даних на диÑк, потім вийти\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Інші параметри:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Якщо каталог даних не вказано, викориÑтовуєтьÑÑ Ð·Ð¼Ñ–Ð½Ð½Ð° Ñередовища PGDATA.\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "неприпуÑтимий ÑпоÑіб автентифікації \"%s\" Ð´Ð»Ñ \"%s\" підключеннÑ"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "необхідно вказати пароль ÑуперкориÑтувача Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— автентифікації за допомогою паролÑ"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: initdb.c:2533
+#, 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:2550
+#, c-format
+msgid "could not set environment"
+msgstr "не вдалоÑÑ Ð²Ñтановити Ñередовище"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ файлу має бути абÑолютним шлÑхом"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "КлаÑтер бази даних буде ініціалізовано з локалізацією \"%s\".\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "КлаÑтер бази даних буде ініціалізовано з локалізацією:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " поÑтачальник: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " Локаль ICU: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\""
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "ПерезапуÑÑ‚Ñ–Ñ‚ÑŒ %s з параметром -E."
+
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\", що очікуєтьÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ”ÑŽ, не дозволено у ÑкоÑÑ‚Ñ– ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера.\n"
+"ЗаміÑÑ‚ÑŒ нього буде вÑтановлене ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" за замовчуваннÑм.\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ \"%s\" потребує ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\", що не підтримуєтьÑÑ"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не допуÑкаєтьÑÑ Ñк ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера."
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "ПерезапуÑÑ‚Ñ–Ñ‚ÑŒ %s з іншим вибором локалі."
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм вÑтановлено: \"%s\".\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідну конфігурацію текÑтового пошуку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–\"%s\""
+
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "відповідна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\" невідома"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "вказана ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку \"%s\" може не підходити локалі \"%s\""
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку за замовчуваннÑм буде вÑтановлена в \"%s\".\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ %s... "
+
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "виправлÑÑŽ дозволи Ð´Ð»Ñ Ñтвореного каталогу %s... "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ дозволи каталогу \"%s\": %m"
+
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній"
+
+#: initdb.c:2840
+#, 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:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доÑтупу до каталогу \"%s\": %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL каталогу має бути абÑолютним шлÑхом"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "Якщо ви хочете зберігати дані з WAL там, потрібно видалити або очиÑтити директорію \"%s\"."
+
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "Він міÑтить файл з крапкою або невидимий файл, можливо це точка під'єднаннÑ."
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "Він міÑтить каталог lost+found, можливо це точка під'єднаннÑ."
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"Ðе рекомендуєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати точку під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñƒ ÑкоÑÑ‚Ñ– каталогу даних.\n"
+"Створіть підкаталог Ñ– викориÑтайте його."
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñ–Ð²... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "виконуєтьÑÑ ÐºÑ–Ð½Ñ†ÐµÐ²Ð° фаза ініціалізації ... "
+
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s необхідне значеннÑ"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "ВиконуєтьÑÑ Ñƒ режимі налагодженнÑ.\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "ВиконуєтьÑÑ Ñƒ режимі 'no-clean'. Помилки не будуть виправлені.\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нерозпізнаний поÑтачальник локалів: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "%s не може бути вказано, поки не буде обрано поÑтачальник локалі \"%s\""
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… з диÑком ... "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "неможливо вказати одночаÑно пароль Ñ– файл паролю"
+
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргумент --wal-segsize повинен бути чиÑлом"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "аргумент --wal-segsize повинен бути Ñтупенем 2 між 1 Ñ– 1024"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "неприпуÑтиме ім'Ñ ÑуперкориÑтувача \"%s\"; імена ролей не можуть починатиÑÑ Ð½Ð° \"pg_\""
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Файли цієї бази даних будуть належати кориÑтувачеві \"%s\".\n"
+"Від імені цього кориÑтувача повинен запуÑкатиÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñервера.\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Контроль ціліÑноÑÑ‚Ñ– Ñторінок даних увімкнено.\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Контроль ціліÑноÑÑ‚Ñ– Ñторінок даних вимкнено.\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð· диÑком пропущена.\n"
+"Каталог з даними може бути пошкоджено під Ñ‡Ð°Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ операційної ÑиÑтеми.\n"
+
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"довіри\" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… підключень"
+
+#: initdb.c:3416
+#, 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 або ÑкориÑтавшиÑÑŒ опцією -A, або --auth-local Ñ– --auth-host, наÑтупного разу, коли ви запуÑкаєте initdb."
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Готово. Тепер ви можете запуÑтити Ñервер бази даних командою:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/vi.po b/src/bin/initdb/po/vi.po
new file mode 100644
index 0000000..0a9875f
--- /dev/null
+++ b/src/bin/initdb/po/vi.po
@@ -0,0 +1,1044 @@
+# LANGUAGE message translation file for initdb
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:17+0000\n"
+"PO-Revision-Date: 2018-04-29 00:02+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: vi_VN\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "không thể xác định thư mục hiện tại: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "tệp nhị phân không hợp lệ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "không thể Ä‘á»c tệp nhị phân \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "không thể tìm thấy file \"%s\" để thực thi"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "không thể thay đổi thư mục thành \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "không thể Ä‘á»c symbolic link \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose lá»—i: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "hết bộ nhớ\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "không thể nhân đôi con trỠnull (lỗi nội bộ)\n"
+
+#: ../../common/file_utils.c:82 ../../common/file_utils.c:186
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "%s: không thể hiện thị trạng thái tệp \"%s\": %s\n"
+
+#: ../../common/file_utils.c:162
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "%s: không thể mở thư mục \"%s\": %s\n"
+
+#: ../../common/file_utils.c:198
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "%s: không thể Ä‘á»c thÆ° mục \"%s\": %s\n"
+
+#: ../../common/file_utils.c:231 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:367
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "%s: không thể mở tệp \"%s\": %s\n"
+
+#: ../../common/file_utils.c:304 ../../common/file_utils.c:376
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "%s: không thể đồng bộ tệp \"%s\": %s\n"
+
+#: ../../common/file_utils.c:387
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "%s: không thể đổi tên tệp \"%s\" thành \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:45
+#, c-format
+msgid "could not open directory \"%s\": %s\n"
+msgstr "không thể mở thư mục \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:72
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "không thể Ä‘á»c thÆ° mục \"%s\": %s\n"
+
+#: ../../common/pgfnames.c:84
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "không thể đóng thư mục \"%s\": %s\n"
+
+#: ../../common/restricted_token.c:68
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr ""
+"%s: CẢNH BÃO: không thể tạo restricted tokens trên hệ Ä‘iá»u hành hiện tại\n"
+
+#: ../../common/restricted_token.c:77
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: không thể mở process token: mã lỗi %lu\n"
+
+#: ../../common/restricted_token.c:90
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: không thể cấp phát SIDs: mã lỗi %lu\n"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: không thể tạo restricted token: mã lỗi %lu\n"
+
+#: ../../common/restricted_token.c:132
+#, c-format
+msgid "%s: could not start process for command \"%s\": error code %lu\n"
+msgstr "%s: không thể khởi động tiến trình cho câu lệnh \"%s\": mã lỗi %lu\n"
+
+#: ../../common/restricted_token.c:170
+#, c-format
+msgid "%s: could not re-execute with restricted token: error code %lu\n"
+msgstr "%s: không thể thực thi lại với restricted token: mã lỗi %lu\n"
+
+#: ../../common/restricted_token.c:186
+#, c-format
+msgid "%s: could not get exit code from subprocess: error code %lu\n"
+msgstr "%s: không thể lấy giá trị trả vỠcủa tiến trình con: mã lỗi %lu\n"
+
+#: ../../common/rmtree.c:77
+#, c-format
+msgid "could not stat file or directory \"%s\": %s\n"
+msgstr "không thể hiển thị trạng thái tệp hoặc thư mục \"%s\": %s\n"
+
+#: ../../common/rmtree.c:104 ../../common/rmtree.c:121
+#, c-format
+msgid "could not remove file or directory \"%s\": %s\n"
+msgstr "không thể xóa tệp hoặc thư mục \"%s\": %s\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "không thể tra cứu được ID của ngÆ°á»i dùng có hiệu lá»±c %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ngÆ°á»i dùng không tồn tại"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "lá»—i tra cứu tên ngÆ°á»i dùng: mã lá»—i %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "câu lệnh không thể thực thi"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "không tìm thấy lệnh"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "tiến trình con đã thoát với giá trị trả vỠ%d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "tiến trình con đã bị kết thúc bởi exception 0x%X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "tiến trình con đã bị kết thúc bởi tín hiệu %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "child process was terminated by signal %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "tiến trình con đã kết thúc với trạng thái không xác định %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "không thể thiết lập junction cho \"%s\": %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "không thể lấy được junction cho \"%s\": %s\n"
+
+#: initdb.c:339
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: hết bộ nhớ\n"
+
+#: initdb.c:495 initdb.c:1538
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: không thể mở tệp \"%s\" để Ä‘á»c: %s\n"
+
+#: initdb.c:551 initdb.c:867 initdb.c:895
+#, c-format
+msgid "%s: could not open file \"%s\" for writing: %s\n"
+msgstr "%s: không thể mở tệp \"%s\" để ghi: %s\n"
+
+#: initdb.c:559 initdb.c:567 initdb.c:874 initdb.c:901
+#, c-format
+msgid "%s: could not write file \"%s\": %s\n"
+msgstr "%s: không thể ghi tệp \"%s\": %s\n"
+
+#: initdb.c:586
+#, c-format
+msgid "%s: could not execute command \"%s\": %s\n"
+msgstr "%s: không thể thực hiện lệnh \"%s\": %s\n"
+
+#: initdb.c:602
+#, c-format
+msgid "%s: removing data directory \"%s\"\n"
+msgstr "%s: đang xoá thư mục dữ liệu \"%s\"\n"
+
+#: initdb.c:605
+#, c-format
+msgid "%s: failed to remove data directory\n"
+msgstr "%s: không thể xóa thư mục dữ liệu\n"
+
+#: initdb.c:611
+#, c-format
+msgid "%s: removing contents of data directory \"%s\"\n"
+msgstr "%s: đang xóa nội dung của thư mục dữ liệu \"%s\"\n"
+
+#: initdb.c:614
+#, c-format
+msgid "%s: failed to remove contents of data directory\n"
+msgstr "%s: không thể xóa nội dung của thư mục dữ liệu\n"
+
+#: initdb.c:620
+#, c-format
+msgid "%s: removing WAL directory \"%s\"\n"
+msgstr "%s: đang xóa thư mục WAL \"%s\"\n"
+
+#: initdb.c:623
+#, c-format
+msgid "%s: failed to remove WAL directory\n"
+msgstr "%s: không thể xóa thư mục WAL\n"
+
+#: initdb.c:629
+#, c-format
+msgid "%s: removing contents of WAL directory \"%s\"\n"
+msgstr "%s: đang xóa nội dung của thư mục WAL \"%s\"\n"
+
+#: initdb.c:632
+#, c-format
+msgid "%s: failed to remove contents of WAL directory\n"
+msgstr "%s: không thể xóa nội dung của thư mục WAL\n"
+
+#: initdb.c:641
+#, c-format
+msgid "%s: data directory \"%s\" not removed at user's request\n"
+msgstr "%s: thÆ° mục dữ liệu \"%s\" không bị xóa theo yêu cầu của ngÆ°á»i dùng\n"
+
+#: initdb.c:646
+#, c-format
+msgid "%s: WAL directory \"%s\" not removed at user's request\n"
+msgstr "%s: thÆ° mục WAL \"%s\" không bị xóa theo yêu cầu của ngÆ°á»i dùng\n"
+
+#: initdb.c:667
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: không thể chạy dÆ°á»›i quyá»n root\n"
+"Vui lòng đăng nhập (sá»­ dụng, ví dụ: \"su\") bằng ngÆ°á»i dùng không có đặc "
+"quyá»n,\n"
+"ngÆ°á»i dùng này sẽ sở hữu tiến trình server.\n"
+
+#: initdb.c:703
+#, c-format
+msgid "%s: \"%s\" is not a valid server encoding name\n"
+msgstr "%s: \"%s\" không phải là server encoding hợp lệ\n"
+
+#: initdb.c:823
+#, c-format
+msgid "%s: file \"%s\" does not exist\n"
+msgstr "%s: tệp \"%s\" không tồn tại\n"
+
+#: initdb.c:825 initdb.c:834 initdb.c:844
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"Äiá»u này có nghÄ©a là bạn đã bị lá»—i trong quá trình cài đặt hoặc \n"
+"chỉ định sai thÆ° mục trong tùy chá»n -L.\n"
+
+#: initdb.c:831
+#, c-format
+msgid "%s: could not access file \"%s\": %s\n"
+msgstr "%s: không thể truy cập tệp \"%s\": %s\n"
+
+#: initdb.c:842
+#, c-format
+msgid "%s: file \"%s\" is not a regular file\n"
+msgstr "%s: tệp \"%s\" không phải là tệp thông thÆ°á»ng\n"
+
+#: initdb.c:987
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "Ä‘ang chá»n giá trị mặc định cho max_connections ... "
+
+#: initdb.c:1017
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "Ä‘ang chá»n giá trị mặc định cho shared_buffers ... "
+
+#: initdb.c:1050
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "Ä‘ang chá»n triển khai bá»™ nhá»› chia sẻ Ä‘á»™ng (DSM) ... "
+
+#: initdb.c:1085
+msgid "creating configuration files ... "
+msgstr "đang tạo tệp cấu hình ... "
+
+#: initdb.c:1239 initdb.c:1259 initdb.c:1346 initdb.c:1362
+#, c-format
+msgid "%s: could not change permissions of \"%s\": %s\n"
+msgstr "%s: không thể thay đổi quyá»n của \"%s\": %s\n"
+
+#: initdb.c:1385
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "đang chạy tập lệnh khởi động ... "
+
+#: initdb.c:1398
+#, c-format
+msgid ""
+"%s: input file \"%s\" does not belong to PostgreSQL %s\n"
+"Check your installation or specify the correct path using the option -L.\n"
+msgstr ""
+"%s: tệp đầu vào \"%s\" không thuộc vỠPostgreSQL %s\n"
+"Kiểm tra cài đặt của bạn hoặc chỉ định Ä‘Æ°á»ng dẫn đúng bằng tùy chá»n -L.\n"
+
+#: initdb.c:1515
+msgid "Enter new superuser password: "
+msgstr "Nhập mật khẩu cho superuser mới: "
+
+#: initdb.c:1516
+msgid "Enter it again: "
+msgstr "Nhập lại: "
+
+#: initdb.c:1519
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Mật khẩu không khớp.\n"
+
+#: initdb.c:1545
+#, c-format
+msgid "%s: could not read password from file \"%s\": %s\n"
+msgstr "%s: không thể Ä‘á»c mật khẩu từ tệp \"%s\": %s\n"
+
+#: initdb.c:1548
+#, c-format
+msgid "%s: password file \"%s\" is empty\n"
+msgstr "%s: tệp mật khẩu \"%s\" trống\n"
+
+#: initdb.c:2123
+#, c-format
+msgid "caught signal\n"
+msgstr "nhận được tín hiệu\n"
+
+#: initdb.c:2129
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "không thể ghi tới tiến trình con: %s\n"
+
+#: initdb.c:2137
+#, c-format
+msgid "ok\n"
+msgstr "ok\n"
+
+#: initdb.c:2227
+#, c-format
+msgid "%s: setlocale() failed\n"
+msgstr "%s: setlocale() lá»—i\n"
+
+#: initdb.c:2249
+#, c-format
+msgid "%s: failed to restore old locale \"%s\"\n"
+msgstr "%s: lỗi khi khôi phục ngôn ngữ cũ \"%s\"\n"
+
+#: initdb.c:2259
+#, c-format
+msgid "%s: invalid locale name \"%s\"\n"
+msgstr "%s: tên ngôn ngữ không hợp lệ \"%s\"\n"
+
+#: initdb.c:2271
+#, c-format
+msgid ""
+"%s: invalid locale settings; check LANG and LC_* environment variables\n"
+msgstr ""
+"%s: cài đặt ngôn ngữ không hợp lệ; kiểm tra biến môi trÆ°á»ng LANG và LC_ *\n"
+
+#: initdb.c:2299
+#, c-format
+msgid "%s: encoding mismatch\n"
+msgstr "%s: mã hóa không khớp\n"
+
+#: initdb.c:2301
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"Mã hóa bạn đã chá»n (%s) và mã hóa mà ngôn ngữ được chá»n \n"
+"sá»­ dụng (%s) không khá»›p. Äiá»u này có thể dãn đến xá»­ lý không \n"
+"đúng trong các hàm xử lý chuỗi ký tự. Chạy lại lệnh %s và không \n"
+"chỉ định mã hóa, hoặc chá»n mã hóa phù hợp.\n"
+
+#: initdb.c:2373
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s khởi tạo thư mục dữ liệu cho PostgreSQL.\n"
+"\n"
+
+#: initdb.c:2374
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: initdb.c:2375
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: initdb.c:2376
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Tùy chá»n:\n"
+
+#: initdb.c:2377
+#, c-format
+msgid ""
+" -A, --auth=METHOD default authentication method for local "
+"connections\n"
+msgstr ""
+" -A, --auth=METHOD phương pháp xác thực mặc định cho kết nối cục "
+"bá»™\n"
+
+#: initdb.c:2378
+#, c-format
+msgid ""
+" --auth-host=METHOD default authentication method for local TCP/IP "
+"connections\n"
+msgstr ""
+" --auth-host=METHOD phương thức xác thực mặc định cho các kết nối "
+"TCP/IP cục bộ\n"
+
+#: initdb.c:2379
+#, c-format
+msgid ""
+" --auth-local=METHOD default authentication method for local-socket "
+"connections\n"
+msgstr ""
+" --auth-local=METHOD phương thức xác thực mặc định cho các kết nối "
+"socket cục bộ\n"
+
+#: initdb.c:2380
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR vị trí cho thư mục cơ sở dữ liệu này\n"
+
+#: initdb.c:2381
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr ""
+" -E, --encoding=ENCODING đặt mã hóa mặc định cho cơ sở dữ liệu mới\n"
+
+#: initdb.c:2382
+#, c-format
+msgid ""
+" -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr ""
+" -g, --allow-group-access cho phép Ä‘á»c/thá»±c thi theo nhóm trên thÆ° mục dữ "
+"liệu\n"
+
+#: initdb.c:2383
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr ""
+" --locale=LOCALE đặt ngôn ngữ mặc định cho cơ sở dữ liệu mới\n"
+
+#: initdb.c:2384
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category "
+"for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" đặt ngôn ngữ mặc định trong danh mục tương "
+"ứng \n"
+" cho sở dữ liệu mới (mặc định được lấy từ môi "
+"trÆ°á»ng)\n"
+
+#: initdb.c:2388
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale tÆ°Æ¡ng Ä‘Æ°Æ¡ng vá»›i --locale=C\n"
+
+#: initdb.c:2389
+#, c-format
+msgid ""
+" --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE đặt mật khẩu cho superuser mới từ tệp\n"
+
+#: initdb.c:2390
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" cấu hình tìm kiếm văn bản mặc định\n"
+
+#: initdb.c:2392
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME tên superuser cơ sở dữ liệu\n"
+
+#: initdb.c:2393
+#, c-format
+msgid ""
+" -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt yêu cầu nhập mật khẩu cho superuser mới\n"
+
+#: initdb.c:2394
+#, c-format
+msgid ""
+" -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" -X, --waldir=WALDIR chỉ định vị trí cho thư mục write-ahead log "
+"(WAL)\n"
+
+#: initdb.c:2395
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr ""
+" --wal-segsize=SIZE kích thước của từng tệp WAL, tính bằng "
+"megabyte\n"
+
+#: initdb.c:2396
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"Các tùy chá»n ít được sá»­ dụng hÆ¡n:\n"
+
+#: initdb.c:2397
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr ""
+" -d, --debug xuất nhiá»u thông tin debug\n"
+" \n"
+
+#: initdb.c:2398
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums sử dụng checksums cho page dữ liệu\n"
+
+#: initdb.c:2399
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY nơi để tìm các tập tin đầu vào\n"
+
+#: initdb.c:2400
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean không dá»n dẹp sau khi lá»—i\n"
+
+#: initdb.c:2401
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync không thực hiện đồng bộ (sync) dữ liệu xuống "
+"đĩa luôn\n"
+
+#: initdb.c:2402
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show hiển thị thiết lập nội bộ\n"
+
+#: initdb.c:2403
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr " -S, --sync-only chỉ đồng bộ thư mục cơ sở dữ liệu\n"
+
+#: initdb.c:2404
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Các tùy chá»n khác:\n"
+
+#: initdb.c:2405
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V, --version hiển thị thông tin phiên bản, sau đó thoát\n"
+
+#: initdb.c:2406
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?, --help hiển thị nội dung hướng dẫn này, sau đó thoát\n"
+
+#: initdb.c:2407
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"Nếu thÆ° mục dữ liệu không được chỉ định, thì biến môi trÆ°á»ng PGDATA\n"
+"sẽ được sử dụng.\n"
+
+#: initdb.c:2409
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Báo cáo bugs qua email <pgsql-bugs@postgresql.org>.\n"
+
+#: initdb.c:2417
+msgid ""
+"\n"
+"WARNING: enabling \"trust\" authentication for local connections\n"
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"\n"
+"CẢNH BÃO: đã thiết lập xác thá»±c \"trust\" cho kết nối cục bá»™\n"
+"Bạn có thể thay đổi Ä‘iá»u này bằng cách chỉnh sá»­a pg_hba.conf hoặc sá»­ dụng "
+"tùy chá»n -A,\n"
+"hoặc --auth-local và --auth-host cho lần chạy initdb sau.\n"
+
+#: initdb.c:2439
+#, c-format
+msgid "%s: invalid authentication method \"%s\" for \"%s\" connections\n"
+msgstr "%s: phương pháp xác thực không hợp lệ \"%s\" cho kết nối \"%s\"\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"%s: must specify a password for the superuser to enable %s authentication\n"
+msgstr "%s: phải chỉ định mật khẩu cho superuser để thiết lập xác thực %s\n"
+
+#: initdb.c:2483
+#, c-format
+msgid ""
+"%s: no data directory specified\n"
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"%s: không có thư mục dữ liệu nào được chỉ định\n"
+"Bạn phải xác định thư mục nơi chứa dữ liệu cho hệ thống cơ sở dữ liệu này.\n"
+"Bạn có thể làm Ä‘iá»u này vá»›i tùy chá»n gá»i -D hoặc\n"
+"biến môi trÆ°á»ng PGDATA.\n"
+
+#: initdb.c:2521
+#, c-format
+msgid ""
+"The program \"postgres\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"Chương trình \"postgres\" là cần thiết bởi %s nhưng không được tìm thấy\n"
+"trong cùng thư mục với \"%s\".\n"
+"Xin vui lòng kiểm tra cài đặt của bạn.\n"
+
+#: initdb.c:2528
+#, c-format
+msgid ""
+"The program \"postgres\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"Chương trình \"postgres\" được tìm thấy bởi \"%s\"\n"
+"nhưng không cùng phiên bản với %s.\n"
+"Xin vui lòng kiểm tra cài đặt của bạn.\n"
+
+#: initdb.c:2547
+#, c-format
+msgid "%s: input file location must be an absolute path\n"
+msgstr "%s: vị trí tệp đầu vào phải là Ä‘Æ°á»ng dẫn tuyệt đối\n"
+
+#: initdb.c:2564
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "database cluster sẽ được khởi tạo với ngôn ngữ \"%s\".\n"
+
+#: initdb.c:2567
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"database cluster sẽ được khởi tạo bằng ngôn ngữ\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2591
+#, c-format
+msgid "%s: could not find suitable encoding for locale \"%s\"\n"
+msgstr "%s: không thể tìm thấy encoding phù hợp cho ngôn ngữ \"%s\"\n"
+
+#: initdb.c:2593
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "Chạy lại %s vá»›i tùy chá»n -E.\n"
+
+#: initdb.c:2594 initdb.c:3235 initdb.c:3256
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: initdb.c:2607
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side "
+"encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"Encoding \"%s\" được ngụ ý bởi ngôn ngữ không được phép làm encoding cho "
+"server.\n"
+"Thay vào đó, mặc định encoding cho cơ sở dữ liệu sẽ được đặt thành \"%s\".\n"
+
+#: initdb.c:2613
+#, c-format
+msgid "%s: locale \"%s\" requires unsupported encoding \"%s\"\n"
+msgstr "%s: ngôn ngữ \"%s\" yêu cầu encoding không được hỗ trợ \"%s\"\n"
+
+#: initdb.c:2616
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"Encoding \"%s\" không được cho phép làm encoding cho server.\n"
+"Chạy lại %s vá»›i má»™t lá»±a chá»n ngôn ngữ khác.\n"
+
+#: initdb.c:2625
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "Mặc định encoding cho cơ sở dữ liệu đã được đặt thành \"%s\".\n"
+
+#: initdb.c:2695
+#, c-format
+msgid ""
+"%s: could not find suitable text search configuration for locale \"%s\"\n"
+msgstr ""
+"%s: không thể tìm thấy cấu hình tìm kiếm văn bản phù hợp cho ngôn ngữ \"%s"
+"\"\n"
+
+#: initdb.c:2706
+#, c-format
+msgid ""
+"%s: warning: suitable text search configuration for locale \"%s\" is "
+"unknown\n"
+msgstr ""
+"%s: cảnh báo: cấu hình tìm kiếm văn bản phù hợp cho ngôn ngữ \"%s\" không "
+"xác định\n"
+
+#: initdb.c:2711
+#, c-format
+msgid ""
+"%s: warning: specified text search configuration \"%s\" might not match "
+"locale \"%s\"\n"
+msgstr ""
+"%s: cảnh báo: cấu hình tìm kiếm văn bản được chỉ định \"%s\" có thể không "
+"khớp với ngôn ngữ \"%s\"\n"
+
+#: initdb.c:2716
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "Cấu hình tìm kiếm văn bản mặc định sẽ được đặt thành \"%s\".\n"
+
+#: initdb.c:2760 initdb.c:2846
+#, c-format
+msgid "creating directory %s ... "
+msgstr "đang tạo thư mục %s ... "
+
+#: initdb.c:2766 initdb.c:2852 initdb.c:2920 initdb.c:2982
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "%s: không thể tạo thư mục \"%s\": %s\n"
+
+#: initdb.c:2778 initdb.c:2864
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "Ä‘ang sá»­a các quyá»n trên thÆ° mục hiện tại %s ... "
+
+#: initdb.c:2784 initdb.c:2870
+#, c-format
+msgid "%s: could not change permissions of directory \"%s\": %s\n"
+msgstr "%s: không thể thay đổi quyá»n của thÆ° mục \"%s\": %s\n"
+
+#: initdb.c:2799 initdb.c:2885
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "%s: thư mục \"%s\" tồn tại nhưng không trống\n"
+
+#: initdb.c:2805
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"Nếu bạn muốn tạo hệ thống cơ sở dữ liệu mới, hãy xóa hoặc làm trống\n"
+"thư mục \"%s\" hoặc chạy %s\n"
+"với một đối số khác với \"%s\".\n"
+
+#: initdb.c:2813 initdb.c:2898 initdb.c:3269
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: không thể truy cập thư mục \"%s\": %s\n"
+
+#: initdb.c:2837
+#, c-format
+msgid "%s: WAL directory location must be an absolute path\n"
+msgstr "%s: Vị trí thÆ° mục WAL phải là Ä‘Æ°á»ng dẫn tuyệt đối\n"
+
+#: initdb.c:2891
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory\n"
+"\"%s\".\n"
+msgstr ""
+"Nếu bạn muốn lưu trữ WAL ở thư mục đã chỉ định, hãy xóa hoặc làm trống thư "
+"mục\n"
+"\"%s\".\n"
+
+#: initdb.c:2906
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "%s: không thể tạo symbolic link \"%s\": %s\n"
+
+#: initdb.c:2911
+#, c-format
+msgid "%s: symlinks are not supported on this platform"
+msgstr "%s: symlinks không được há»— trợ trên hệ Ä‘iá»u hành này"
+
+#: initdb.c:2935
+#, c-format
+msgid ""
+"It contains a dot-prefixed/invisible file, perhaps due to it being a mount "
+"point.\n"
+msgstr ""
+"ÄÆ°á»ng dẫn chứa tập tin có tiá»n tố . hoặc vô hình, có lẽ do nó là má»™t mount "
+"point.\n"
+
+#: initdb.c:2938
+#, c-format
+msgid ""
+"It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr "ÄÆ°á»ng dẫn chứa thÆ° mục lost+found, có lẽ do nó là má»™t mount point.\n"
+
+#: initdb.c:2941
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"Sử dụng trực tiếp mount point cho thư mục dữ liệu là không được khuyến "
+"nghị.\n"
+"Tạo một thư mục con dưới mount point.\n"
+
+#: initdb.c:2967
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "tạo thư mục con ... "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "thực hiện khởi tạo sau-bootstrap ... "
+
+#: initdb.c:3173
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "Chạy trong chế độ debug.\n"
+
+#: initdb.c:3177
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "Chạy ở chế Ä‘á»™ không dá»n dẹp. lá»—i xảy ra sẽ khá»™ng được dá»n dẹp.\n"
+
+#: initdb.c:3254
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: quá nhiá»u đối số cho câu lệnh (đầu tiên là \"%s\")\n"
+
+#: initdb.c:3274 initdb.c:3367
+msgid "syncing data to disk ... "
+msgstr "đồng bộ dữ liệu xuống đĩa cứng ... "
+
+#: initdb.c:3283
+#, c-format
+msgid "%s: password prompt and password file cannot be specified together\n"
+msgstr "%s: không thể chỉ định yêu cầu mật khẩu và tệp mật khẩu cùng lúc\n"
+
+#: initdb.c:3309
+#, c-format
+msgid "%s: argument of --wal-segsize must be a number\n"
+msgstr "%s: đối số của --wal-segsize phải là một số\n"
+
+#: initdb.c:3316
+#, c-format
+msgid ""
+"%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n"
+msgstr "%s: đối số của --wal-segsize phải là lũy thừa của 2 từ 1 đến 1024\n"
+
+#: initdb.c:3334
+#, c-format
+msgid ""
+"%s: superuser name \"%s\" is disallowed; role names cannot begin with \"pg_"
+"\"\n"
+msgstr ""
+"%s: tên superuser \"%s\" không được phép, tên role không thể bắt đầu bằng "
+"\"pg_\"\n"
+
+#: initdb.c:3338
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"Các tệp thuá»™c hệ thống cÆ¡ sở dữ liệu này sẽ được sở hữu bởi ngÆ°á»i dùng \"%s"
+"\".\n"
+"NgÆ°á»i dùng này cÅ©ng phải sở hữu tiến trình server.\n"
+"\n"
+
+#: initdb.c:3354
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "Checksums cho page dữ liệu đã được thiết lập.\n"
+
+#: initdb.c:3356
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "Thiết lập checksums cho page dữ liệu đã bị hủy.\n"
+
+#: initdb.c:3373
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"Äồng bá»™ hóa xuống Ä‘Ä©a cứng bị bá» qua.\n"
+"ThÆ° mục dữ liệu có thể bị há»ng nếu hệ Ä‘iá»u hành bị sá»± cố.\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3399
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3401
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"Thành công. Bây giỠbạn có thể khởi động hệ thống cơ sở dữ liệu bằng cách "
+"sử dụng:\n"
+"\n"
+" %s\n"
+"\n"
diff --git a/src/bin/initdb/po/zh_CN.po b/src/bin/initdb/po/zh_CN.po
new file mode 100644
index 0000000..9876679
--- /dev/null
+++ b/src/bin/initdb/po/zh_CN.po
@@ -0,0 +1,1004 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当å‰ç›®å½•: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+#: initdb.c:331
+#, 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:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法å–文件 \"%s\" 的状æ€: %m"
+
+#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读å–目录 \"%s\": %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "无法 fsync 文件 \"%s\": %m"
+
+#: ../../common/file_utils.c:383
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "无法把文件 \"%s\" é‡å‘½å为 \"%s\": %m"
+
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "无法加载库 \"%s\": é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "无法为该平å°åˆ›å»ºå—é™åˆ¶çš„令牌:é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "无法打开进程令牌 (token): é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "无法分é…SID: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "无法创建å—é™ä»¤ç‰Œ: 错误ç ä¸º %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "无法为命令 \"%s\"创建进程: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "无法使用å—é™ä»¤ç‰Œå†æ¬¡æ‰§è¡Œ: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "无法从å­è¿›ç¨‹å¾—到退出ç : é”™è¯¯ç  %lu"
+
+#: ../../common/rmtree.c:79
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "无法统计文件或目录\"%s\": %m"
+
+#: ../../common/rmtree.c:101 ../../common/rmtree.c:113
+#, c-format
+msgid "could not remove file or directory \"%s\": %m"
+msgstr "无法删除文件或目录 \"%s\": %m"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "无法找到有效的用户ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "用户ä¸å­˜åœ¨"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "用户å查找失败:错误代ç %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "无法执行命令"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, 退出ç ä¸º %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¿›ç¨‹è¢«ä¾‹å¤–(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¿›ç¨‹è¢«ä¿¡å· %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, æœªçŸ¥çŠ¶æ€ %d"
+
+#: ../../port/dirmod.c:221
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "无法为 \"%s\"设置连接: %s\n"
+
+#: ../../port/dirmod.c:298
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "无法为\"%s\"得到连接: %s\n"
+
+#: initdb.c:464 initdb.c:1496
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读å–, 无法打开文件 \"%s\": %m"
+
+#: initdb.c:508 initdb.c:830 initdb.c:856
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "为了写入, 无法打开文件 \"%s\": %m"
+
+#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: initdb.c:540
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "无法执行命令 \"%s\": %m"
+
+#: initdb.c:558
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "删除数æ®ç›®å½• \"%s\""
+
+#: initdb.c:560
+#, c-format
+msgid "failed to remove data directory"
+msgstr "删除数æ®ç›®å½•å¤±è´¥"
+
+#: initdb.c:564
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "删除数æ®ç›®å½• \"%s\" 的内容"
+
+#: initdb.c:567
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "删除数æ®ç›®å½•å†…容失败"
+
+#: initdb.c:572
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "正在删除WAL目录\"%s\""
+
+#: initdb.c:574
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "删除WAL目录失败"
+
+#: initdb.c:578
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "正在删除WAL目录 \"%s\" 的内容"
+
+#: initdb.c:580
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "删除WAL目录内容失败"
+
+#: initdb.c:587
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "在用户的è¦æ±‚下数æ®åº“目录 \"%s\" ä¸è¢«åˆ é™¤"
+
+#: initdb.c:591
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "在用户的è¦æ±‚下WAL目录 \"%s\" ä¸è¢«åˆ é™¤"
+
+#: initdb.c:609
+#, c-format
+msgid "cannot be run as root"
+msgstr "ä¸èƒ½ä½¿ç”¨root用户è¿è¡Œ"
+
+#: initdb.c:611
+#, c-format
+msgid ""
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"请以æœåŠ¡å™¨è¿›ç¨‹æ‰€æœ‰è€…的用户 (无特æƒ) 身份\n"
+"登陆 (使用, e.g., \"su\").\n"
+
+#: initdb.c:644
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„æœåŠ¡å™¨ç¼–ç åå­—"
+
+#: initdb.c:789
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "文件 \"%s\" ä¸å­˜åœ¨"
+
+#: initdb.c:791 initdb.c:798 initdb.c:807
+#, c-format
+msgid ""
+"This might mean you have a corrupted installation or identified\n"
+"the wrong directory with the invocation option -L.\n"
+msgstr ""
+"è¿™æ„味ç€æ‚¨çš„安装å‘生了错误或\n"
+"使用 -L 选项指定了错误的路径.\n"
+
+#: initdb.c:796
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "无法访问文件 \"%s\": %m"
+
+#: initdb.c:805
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "文件 \"%s\" ä¸æ˜¯å¸¸è§„文件"
+
+#: initdb.c:950
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "选择动æ€å…±äº«å†…存实现 ......"
+
+#: initdb.c:959
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "选择默认最大è”接数 (max_connections) ... "
+
+#: initdb.c:990
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "é€‰æ‹©é»˜è®¤å…±äº«ç¼“å†²åŒºå¤§å° (shared_buffers) ... "
+
+#: initdb.c:1024
+msgid "selecting default time zone ... "
+msgstr "选择默认时区 ... "
+
+#: initdb.c:1058
+msgid "creating configuration files ... "
+msgstr "创建é…置文件 ... "
+
+#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "无法改å˜\"%s\"çš„æƒé™: %m"
+
+#: initdb.c:1359
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "正在è¿è¡Œè‡ªä¸¾è„šæœ¬ ..."
+
+#: initdb.c:1371
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "输入文件 \"%s\" ä¸å±žäºŽPostgreSQL %s"
+
+#: initdb.c:1374
+#, c-format
+msgid "Check your installation or specify the correct path using the option -L.\n"
+msgstr "检查你的安装或使用 -L 选项指定正确的路径.\n"
+
+#: initdb.c:1473
+msgid "Enter new superuser password: "
+msgstr "输入新的超级用户å£ä»¤: "
+
+#: initdb.c:1474
+msgid "Enter it again: "
+msgstr "å†è¾“入一é: "
+
+#: initdb.c:1477
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "å£ä»¤ä¸åŒ¹é….\n"
+
+#: initdb.c:1504
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "无法从文件 \"%s\" 读å–å£ä»¤: %m"
+
+#: initdb.c:1507
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "å£ä»¤æ–‡ä»¶\"%s\"为空"
+
+#: initdb.c:1998
+#, c-format
+msgid "caught signal\n"
+msgstr "æ•èŽ·ä¿¡å·\n"
+
+#: initdb.c:2004
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "无法写到å­è¿›ç¨‹: %s\n"
+
+#: initdb.c:2012
+#, c-format
+msgid "ok\n"
+msgstr "æˆåŠŸ\n"
+
+#: initdb.c:2102
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale()调用失败"
+
+#: initdb.c:2123
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "还原旧区域\"%s\"失败"
+
+#: initdb.c:2132
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "无效的语言环境å称 \"%s\""
+
+#: initdb.c:2143
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "无效的本地化设置; 请检查环境å˜é‡LANGå’ŒLC_*的值"
+
+#: initdb.c:2170
+#, c-format
+msgid "encoding mismatch"
+msgstr "ç¼–ç ä¸åŒ¹é…"
+
+#: initdb.c:2172
+#, c-format
+msgid ""
+"The encoding you selected (%s) and the encoding that the\n"
+"selected locale uses (%s) do not match. This would lead to\n"
+"misbehavior in various character string processing functions.\n"
+"Rerun %s and either do not specify an encoding explicitly,\n"
+"or choose a matching combination.\n"
+msgstr ""
+"æ‚¨é€‰æ‹©çš„ç¼–ç  (%s) å’Œæ‰€é€‰æ‹©çš„è¯­è¨€çŽ¯å¢ƒä½¿ç”¨çš„ç¼–ç  (%s) ä¸åŒ¹é…çš„.\n"
+"这样将导致处ç†ä¸åŒå­—符串的函数时产生错误.\n"
+"è¦ä¿®å¤æ­¤é—®é¢˜, é‡æ–°è¿è¡Œ %s 并且ä¸è¦æ˜Žç¡®æŒ‡å®šç¼–ç , 或者先选择一个匹é…\n"
+"组åˆç±»åž‹.\n"
+"\n"
+
+#: initdb.c:2244
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s åˆå§‹åŒ–一个 PostgreSQL æ•°æ®åº“ç°‡.\n"
+"\n"
+
+#: initdb.c:2245
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: initdb.c:2246
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [选项]... [DATADIR]\n"
+
+#: initdb.c:2247
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: initdb.c:2248
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD 本地连接的默认认è¯æ–¹æ³•\n"
+
+#: initdb.c:2249
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD 本地的TCP/IP连接的默认认è¯æ–¹æ³•\n"
+
+#: initdb.c:2250
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD 本地socket连接的默认认è¯æ–¹æ³•\n"
+
+#: initdb.c:2251
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " -D, --pgdata=DATADIR 当å‰æ•°æ®åº“簇的ä½ç½®\n"
+
+#: initdb.c:2252
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING 为新数æ®åº“设置默认编ç \n"
+
+#: initdb.c:2253
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access å…许组对数æ®ç›®å½•è¿›è¡Œè¯»/执行\n"
+
+#: initdb.c:2254
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums 使用数æ®é¡µäº§ç”Ÿæ•ˆéªŒå’Œ\n"
+
+#: initdb.c:2255
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE 为新数æ®åº“设置默认语言环境\n"
+
+#: initdb.c:2256
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate, --lc-ctype, --lc-messages=LOCALE\n"
+" --lc-monetary, --lc-numeric, --lc-time=LOCALE\n"
+" 为新的数æ®åº“簇在å„自的目录中分别\n"
+" 设定缺çœè¯­è¨€çŽ¯å¢ƒï¼ˆé»˜è®¤ä½¿ç”¨çŽ¯å¢ƒå˜é‡)\n"
+
+#: initdb.c:2260
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale ç­‰åŒäºŽ --locale=C\n"
+
+#: initdb.c:2261
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE 对于新的超级用户从文件读å–å£ä»¤\n"
+
+#: initdb.c:2262
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" 缺çœçš„文本æœç´¢é…ç½®\n"
+
+#: initdb.c:2264
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME æ•°æ®åº“超级用户å\n"
+
+#: initdb.c:2265
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt 对于新的超级用户æ示输入å£ä»¤\n"
+
+#: initdb.c:2266
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR 预写日志目录的ä½ç½®\n"
+
+#: initdb.c:2267
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL段的大å°ï¼ˆå…†å­—节)\n"
+
+#: initdb.c:2268
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"éžæ™®é€šä½¿ç”¨é€‰é¡¹:\n"
+
+#: initdb.c:2269
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug 产生大é‡çš„除错信æ¯\n"
+
+#: initdb.c:2270
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches 设置debug_discard_caches=1\n"
+
+#: initdb.c:2271
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 输入文件的ä½ç½®\n"
+
+#: initdb.c:2272
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 出错åŽä¸æ¸…ç†\n"
+
+#: initdb.c:2273
+#, 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:2274
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions ä¸è¦æ‰“å°åŽç»­æ­¥éª¤çš„说明\n"
+
+#: initdb.c:2275
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 显示内部设置\n"
+
+#: initdb.c:2276
+#, c-format
+msgid " -S, --sync-only only sync data directory\n"
+msgstr " -S, --sync-only åªåŒæ­¥æ•°æ®ç›®å½•\n"
+
+#: initdb.c:2277
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"其它选项:\n"
+
+#: initdb.c:2278
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: initdb.c:2279
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: initdb.c:2280
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"如果没有指定数æ®ç›®å½•, 将使用环境å˜é‡ PGDATA\n"
+
+#: initdb.c:2282
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: initdb.c:2283
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: initdb.c:2311
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "无效认è¯æ–¹æ³• \"%s\" 用于 \"%s\" 连接"
+
+#: initdb.c:2327
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "为了å¯åŠ¨å¯†ç è®¤è¯, 你需è¦ä¸ºè¶…级用户指定一个å£ä»¤"
+
+#: initdb.c:2348
+#, c-format
+msgid "no data directory specified"
+msgstr "没有指定数æ®ç›®å½•"
+
+#: initdb.c:2350
+#, c-format
+msgid ""
+"You must identify the directory where the data for this database system\n"
+"will reside. Do this with either the invocation option -D or the\n"
+"environment variable PGDATA.\n"
+msgstr ""
+"您必须确认此数æ®åº“系统的数æ®æ‰€åœ¨ç›®å½•\n"
+"存在. 使用 -D 选项或者\n"
+"环境å˜é‡ PGDATA.\n"
+
+#: initdb.c:2368
+msgid "could not set environment"
+msgstr "无法设置环境"
+
+#: initdb.c:2388
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需è¦ç¨‹åº\"%1$s\"\n"
+"但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n"
+"检查您的安装."
+
+#: initdb.c:2393
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程åº\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本ä¸åŒ.\n"
+"检查您的安装."
+
+#: initdb.c:2412
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "输入文件ä½ç½®å¿…须为ç»å¯¹è·¯å¾„"
+
+#: initdb.c:2429
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "æ•°æ®åº“簇将使用本地化语言 \"%s\"进行åˆå§‹åŒ–.\n"
+
+#: initdb.c:2432
+#, c-format
+msgid ""
+"The database cluster will be initialized with locales\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+msgstr ""
+"æ•°æ®åº“簇将带有一下 locales åˆå§‹åŒ–\n"
+" COLLATE: %s\n"
+" CTYPE: %s\n"
+" MESSAGES: %s\n"
+" MONETARY: %s\n"
+" NUMERIC: %s\n"
+" TIME: %s\n"
+
+#: initdb.c:2456
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "无法为locale(本地化语言)\"%s\"找到åˆé€‚çš„ç¼–ç "
+
+#: initdb.c:2458
+#, c-format
+msgid "Rerun %s with the -E option.\n"
+msgstr "带 -E 选项é‡æ–°è¿è¡Œ %s.\n"
+
+#: initdb.c:2459 initdb.c:3099 initdb.c:3120
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: initdb.c:2472
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"本地化éšå«çš„ç¼–ç  \"%s\" ä¸å…许作为æœåŠ¡å™¨ç«¯çš„ç¼–ç .\n"
+"默认的数æ®åº“ç¼–ç å°†é‡‡ç”¨ \"%s\" 作为代替.\n"
+
+#: initdb.c:2477
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "本地化语言环境 \"%s\"è¦æ±‚使用ä¸æ”¯æŒçš„ç¼–ç \"%s\""
+
+#: initdb.c:2480
+#, c-format
+msgid ""
+"Encoding \"%s\" is not allowed as a server-side encoding.\n"
+"Rerun %s with a different locale selection.\n"
+msgstr ""
+"ä¸å…许将编ç \"%s\"作为æœåŠ¡å™¨ç«¯ç¼–ç .\n"
+"使用一个ä¸åŒçš„本地化语言环境é‡æ–°è¿è¡Œ%s.\n"
+
+#: initdb.c:2489
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "默认的数æ®åº“ç¼–ç å·²ç»ç›¸åº”的设置为 \"%s\".\n"
+
+#: initdb.c:2555
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "无法为本地化语言环境\"%s\"找到åˆé€‚的文本æœç´¢é…ç½®"
+
+#: initdb.c:2566
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "对于本地化语言环境\"%s\"åˆé€‚的文本æœç´¢é…置未知"
+
+#: initdb.c:2571
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "所指定的文本æœç´¢é…ç½®\"%s\"å¯èƒ½ä¸Žæœ¬åœ°è¯­è¨€çŽ¯å¢ƒ\"%s\"ä¸åŒ¹é…"
+
+#: initdb.c:2576
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "缺çœçš„文本æœç´¢é…置将会被设置到\"%s\"\n"
+
+#: initdb.c:2620 initdb.c:2702
+#, c-format
+msgid "creating directory %s ... "
+msgstr "创建目录 %s ... "
+
+#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: initdb.c:2637 initdb.c:2720
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "ä¿®å¤å·²å­˜åœ¨ç›®å½• %s çš„æƒé™ ... "
+
+#: initdb.c:2643 initdb.c:2726
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "无法改å˜ç›®å½• \"%s\" çš„æƒé™: %m"
+
+#: initdb.c:2657 initdb.c:2740
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "目录\"%s\"已存在,但ä¸æ˜¯ç©ºçš„"
+
+#: initdb.c:2662
+#, c-format
+msgid ""
+"If you want to create a new database system, either remove or empty\n"
+"the directory \"%s\" or run %s\n"
+"with an argument other than \"%s\".\n"
+msgstr ""
+"如果您想创建一个新的数æ®åº“系统, 请删除或清空\n"
+"目录 \"%s\" 或者è¿è¡Œå¸¦å‚æ•°çš„ %s\n"
+"而ä¸æ˜¯ \"%s\".\n"
+
+#: initdb.c:2670 initdb.c:2752 initdb.c:3135
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "无法访问目录 \"%s\": %m"
+
+#: initdb.c:2693
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL目录的ä½ç½®å¿…须为ç»å¯¹è·¯å¾„"
+
+#: initdb.c:2745
+#, c-format
+msgid ""
+"If you want to store the WAL there, either remove or empty the directory\n"
+"\"%s\".\n"
+msgstr "如果您è¦å­˜å‚¨WAL日志,需è¦åˆ é™¤æˆ–者清空目录\"%s\".\n"
+
+#: initdb.c:2759
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "无法创建符å·é“¾æŽ¥ \"%s\": %m"
+
+#: initdb.c:2764
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "在这个平å°ä¸Šä¸æ”¯æŒç¬¦å·é“¾æŽ¥"
+
+#: initdb.c:2788
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n"
+msgstr "它包å«ä¸€ä¸ªä¸å¯è§çš„带固定点的文件,å¯èƒ½å› ä¸ºå®ƒæ˜¯ä¸€ä¸ªè£…载点。\n"
+
+#: initdb.c:2791
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n"
+msgstr "它包å«å为lost+found的目录,å¯èƒ½å› ä¸ºå®ƒæ˜¯ä¸€ä¸ªåŠ è½½ç‚¹.\n"
+
+#: initdb.c:2794
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point.\n"
+msgstr ""
+"ä¸æŽ¨è将加载点作为数æ®ç›®å½•.\n"
+"通常在加载点下边创建一个å­ç›®å½•.\n"
+
+#: initdb.c:2820
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "正在创建å­ç›®å½• ... "
+
+#: initdb.c:2866
+msgid "performing post-bootstrap initialization ... "
+msgstr "正在执行自举åŽåˆå§‹åŒ– ..."
+
+#: initdb.c:3029
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "è¿è¡Œåœ¨é™¤é”™æ¨¡å¼ä¸­. \n"
+
+#: initdb.c:3033
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "è¿è¡Œåœ¨ no-clean 模å¼ä¸­. 错误将ä¸è¢«æ¸…ç†.\n"
+
+#: initdb.c:3118
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: initdb.c:3139 initdb.c:3228
+msgid "syncing data to disk ... "
+msgstr "åŒæ­¥æ•°æ®åˆ°ç£ç›˜..."
+
+#: initdb.c:3148
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "å£ä»¤æ示和å£ä»¤æ–‡ä»¶ä¸èƒ½åŒæ—¶éƒ½æŒ‡å®š"
+
+#: initdb.c:3173
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsizeçš„å‚数必须是一个数字"
+
+#: initdb.c:3178
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsizeçš„å‚数必须是2的幂次方(在1å’Œ1024之间)"
+
+#: initdb.c:3195
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "超级用户å\"%s\"是ä¸å…许的;角色å称ä¸èƒ½ä»¥\"pg_\"开始"
+
+#: initdb.c:3199
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"属于此数æ®åº“系统的文件宿主为用户 \"%s\".\n"
+"此用户也必须为æœåŠ¡å™¨è¿›ç¨‹çš„宿主.\n"
+
+#: initdb.c:3215
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "å…许生æˆæ•°æ®é¡µæ ¡éªŒå’Œ.\n"
+
+#: initdb.c:3217
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "ç¦æ­¢ä¸ºæ•°æ®é¡µç”Ÿæˆæ ¡éªŒå’Œ.\n"
+
+#: initdb.c:3234
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"跳过åŒæ­¥åˆ°ç£ç›˜æ“作.\n"
+"如果æ“作系统宕机,数æ®ç›®å½•å¯èƒ½ä¼šæ¯å.\n"
+
+#: initdb.c:3239
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "为本地连接å¯ç”¨\"trust\"身份验è¯"
+
+#: initdb.c:3240
+#, c-format
+msgid ""
+"You can change this by editing pg_hba.conf or using the option -A, or\n"
+"--auth-local and --auth-host, the next time you run initdb.\n"
+msgstr ""
+"ä½ å¯ä»¥é€šè¿‡ç¼–辑 pg_hba.conf 更改或你下次\n"
+"执行 initdb 时使用 -A或者--auth-local和--auth-host选项.\n"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3270
+msgid "logfile"
+msgstr "日志文件"
+
+#: initdb.c:3272
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"æˆåŠŸã€‚您现在å¯ä»¥ç”¨ä¸‹é¢çš„命令开å¯æ•°æ®åº“æœåŠ¡å™¨ï¼š\n"
+"\n"
+" %s\n"
+"\n"
+
diff --git a/src/bin/initdb/po/zh_TW.po b/src/bin/initdb/po/zh_TW.po
new file mode 100644
index 0000000..b350093
--- /dev/null
+++ b/src/bin/initdb/po/zh_TW.po
@@ -0,0 +1,1369 @@
+# Traditional Chinese message translation file for initdb
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the initdb (PostgreSQL) package.
+# 2004-12-13 Zhenbang Wei <znbang@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: initdb (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 20:50+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# command.c:122
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "無效的執行檔 \"%s\": %m"
+
+# command.c:1103
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "無法讀å–執行檔 \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\""
+
+# utils/error/elog.c:1128
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "無法將路徑 \"%s\" 解æžç‚ºçµ•å°è·¯å¾‘: %m"
+
+# fe-misc.c:991
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 失敗: %m"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: initdb.c:349
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體ä¸è¶³\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+# access/transam/xlog.c:1936 access/transam/xlog.c:2038
+# access/transam/xlog.c:5291
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "無法å–得檔案 \"%s\" 的狀態: %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48
+#: ../../common/rmtree.c:63
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄 \"%s\": %m"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69
+#: ../../common/rmtree.c:104
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "無法讀å–目錄 \"%s\": %m"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案 \"%s\": %m"
+
+# access/transam/slru.c:673 access/transam/xlog.c:1562
+# access/transam/xlog.c:1686 access/transam/xlog.c:3008
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "無法 fsync 檔案 \"%s\": %m"
+
+# access/transam/xlog.c:3037 access/transam/xlog.c:3819
+# access/transam/xlog.c:3862 commands/user.c:282 commands/user.c:412
+# postmaster/pgarch.c:597
+#: ../../common/file_utils.c:379
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "無法將檔案 \"%s\" æ›´å為 \"%s\": %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: ../../common/pgfnames.c:74
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "無法關閉目錄 \"%s\": %m"
+
+# port/win32/security.c:39
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "無法開啟行程 token: 錯誤碼 %lu"
+
+# port/pg_sema.c:117 port/sysv_sema.c:117
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "無法é…ç½® SID: 錯誤碼 %lu"
+
+# port/win32/signal.c:239
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "無法建立å—é™ token: 錯誤碼 %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "無法為指令 \"%s\" 啟動行程: 錯誤碼 %lu"
+
+# port/win32/signal.c:239
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "無法使用å—é™ token é‡æ–°åŸ·è¡Œ: 錯誤碼 %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "無法從å­è¡Œç¨‹å–å¾—çµæŸç¢¼: 錯誤碼 %lu"
+
+# access/transam/xlog.c:1944 access/transam/xlog.c:5453
+# access/transam/xlog.c:5607 postmaster/postmaster.c:3504
+#: ../../common/rmtree.c:95
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "無法刪除檔案 \"%s\": %m"
+
+# commands/tablespace.c:610
+#: ../../common/rmtree.c:122
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "無法刪除目錄 \"%s\": %m"
+
+# libpq/be-secure.c:689
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "找ä¸åˆ°æœ‰æ•ˆçš„使用者 ID %ld: %s"
+
+# commands/user.c:899 commands/user.c:1012 commands/user.c:1104
+# commands/user.c:1233 commands/variable.c:664 utils/cache/lsyscache.c:2064
+# utils/init/miscinit.c:335
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "使用者ä¸å­˜åœ¨"
+
+# port/win32/security.c:39
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "找ä¸åˆ°ä½¿ç”¨è€…å稱: 錯誤碼 %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "無法執行指令"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "找ä¸åˆ°æŒ‡ä»¤"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¡Œç¨‹å› ç•°å¸¸ 0x%X 而åœæ­¢"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¡Œç¨‹å› ä¿¡è™Ÿ %d 而åœæ­¢: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¡Œç¨‹å› ä¸æ˜Žç‹€æ…‹ %d 而åœæ­¢"
+
+#: ../../port/dirmod.c:287
+#, c-format
+msgid "could not set junction for \"%s\": %s\n"
+msgstr "無法設置 junction 至 \"%s\": %s\n"
+
+#: ../../port/dirmod.c:367
+#, c-format
+msgid "could not get junction for \"%s\": %s\n"
+msgstr "無法å–å¾— \"%s\" çš„ junction: %s\n"
+
+# commands/copy.c:1031
+#: initdb.c:618 initdb.c:1613
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "無法開啟檔案 \"%s\" 以進行讀å–: %m"
+
+# commands/copy.c:1094
+#: initdb.c:662 initdb.c:966 initdb.c:986
+#, c-format
+msgid "could not open file \"%s\" for writing: %m"
+msgstr "無法開啟檔案 \"%s\" 以進行寫入: %m"
+
+# access/transam/xlog.c:5319 access/transam/xlog.c:5439
+#: initdb.c:666 initdb.c:969 initdb.c:988
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: initdb.c:670
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "無法關閉檔案 \"%s\": %m"
+
+#: initdb.c:686
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "無法執行指令 \"%s\": %m"
+
+#: initdb.c:704
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "刪除資料目錄 \"%s\""
+
+#: initdb.c:706
+#, c-format
+msgid "failed to remove data directory"
+msgstr "無法刪除資料目錄"
+
+#: initdb.c:710
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "刪除資料目錄 \"%s\" 的內容"
+
+#: initdb.c:713
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "無法刪除資料目錄的內容"
+
+#: initdb.c:718
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "刪除 WAL 目錄 \"%s\""
+
+#: initdb.c:720
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "無法刪除 WAL 目錄"
+
+#: initdb.c:724
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "刪除 WAL 目錄 \"%s\" 的內容"
+
+#: initdb.c:726
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "無法刪除 WAL 目錄的內容"
+
+#: initdb.c:733
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "根據使用者è¦æ±‚,未刪除資料目錄 \"%s\""
+
+#: initdb.c:737
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "根據使用者è¦æ±‚,未刪除WAL目錄 \"%s\""
+
+# translator: %s represents an SQL statement name
+# access/transam/xact.c:2195
+#: initdb.c:755
+#, c-format
+msgid "cannot be run as root"
+msgstr "無法以 root 執行"
+
+#: initdb.c:756
+#, c-format
+msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process."
+msgstr "請以æ“有伺æœå™¨è¡Œç¨‹çš„(éžç‰¹æ¬Š)使用者身分登入(例如用 \"su\" 命令)。"
+
+#: initdb.c:788
+#, c-format
+msgid "\"%s\" is not a valid server encoding name"
+msgstr "\"%s\" ä¸æ˜¯æœ‰æ•ˆçš„伺æœå™¨ç·¨ç¢¼å稱"
+
+# commands/comment.c:582
+#: initdb.c:932
+#, c-format
+msgid "file \"%s\" does not exist"
+msgstr "檔案 \"%s\" ä¸å­˜åœ¨"
+
+#: initdb.c:933 initdb.c:938 initdb.c:945
+#, c-format
+msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L."
+msgstr "這å¯èƒ½è¡¨ç¤ºæ‚¨çš„安è£æ壞或使用錯誤的目錄é¸é … -L。"
+
+# utils/fmgr/dfmgr.c:107 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:263
+#: initdb.c:937
+#, c-format
+msgid "could not access file \"%s\": %m"
+msgstr "無法存å–檔案 \"%s\": %m"
+
+#: initdb.c:944
+#, c-format
+msgid "file \"%s\" is not a regular file"
+msgstr "檔案 \"%s\" ä¸æ˜¯ä¸€èˆ¬æª”案"
+
+#: initdb.c:1077
+#, c-format
+msgid "selecting dynamic shared memory implementation ... "
+msgstr "é¸æ“‡å‹•æ…‹å…±äº«è¨˜æ†¶é«”實作方å¼â€¦ "
+
+#: initdb.c:1086
+#, c-format
+msgid "selecting default max_connections ... "
+msgstr "é¸æ“‡é è¨­ max_connections … "
+
+#: initdb.c:1106
+#, c-format
+msgid "selecting default shared_buffers ... "
+msgstr "é¸æ“‡é è¨­ shared_buffers … "
+
+#: initdb.c:1129
+#, c-format
+msgid "selecting default time zone ... "
+msgstr "é¸æ“‡é è¨­æ™‚å€ â€¦ "
+
+#: initdb.c:1206
+msgid "creating configuration files ... "
+msgstr "建立組態檔… "
+
+# libpq/pqcomm.c:520
+#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459
+#, c-format
+msgid "could not change permissions of \"%s\": %m"
+msgstr "無法修改檔案 \"%s\" 的權é™: %m"
+
+#: initdb.c:1477
+#, c-format
+msgid "running bootstrap script ... "
+msgstr "執行啟動腳本… "
+
+# tcop/utility.c:92
+#: initdb.c:1489
+#, c-format
+msgid "input file \"%s\" does not belong to PostgreSQL %s"
+msgstr "輸入檔 \"%s\" ä¸å±¬æ–¼ PostgreSQL %s"
+
+#: initdb.c:1491
+#, c-format
+msgid "Specify the correct path using the option -L."
+msgstr "使用é¸é … -L 指定正確的路徑。"
+
+#: initdb.c:1591
+msgid "Enter new superuser password: "
+msgstr "輸入超級使用者的新密碼: "
+
+#: initdb.c:1592
+msgid "Enter it again: "
+msgstr "è«‹é‡æ–°è¼¸å…¥: "
+
+#: initdb.c:1595
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "密碼ä¸ä¸€è‡´ã€‚\n"
+
+#: initdb.c:1619
+#, c-format
+msgid "could not read password from file \"%s\": %m"
+msgstr "無法從檔案 \"%s\" 讀å–密碼: %m"
+
+# commands/tablespace.c:334
+#: initdb.c:1622
+#, c-format
+msgid "password file \"%s\" is empty"
+msgstr "密碼檔 \"%s\" 是空的"
+
+#: initdb.c:2034
+#, c-format
+msgid "caught signal\n"
+msgstr "æ•æ‰åˆ°ä¿¡è™Ÿ\n"
+
+#: initdb.c:2040
+#, c-format
+msgid "could not write to child process: %s\n"
+msgstr "無法寫入至å­è¡Œç¨‹: %s\n"
+
+#: initdb.c:2048
+#, c-format
+msgid "ok\n"
+msgstr ""
+
+# fe-misc.c:991
+#: initdb.c:2137
+#, c-format
+msgid "setlocale() failed"
+msgstr "setlocale() 失敗"
+
+# utils/init/miscinit.c:648
+#: initdb.c:2155
+#, c-format
+msgid "failed to restore old locale \"%s\""
+msgstr "無法還原舊的å€åŸŸè¨­å®š \"%s\""
+
+#: initdb.c:2163
+#, c-format
+msgid "invalid locale name \"%s\""
+msgstr "無效的å€åŸŸå稱 \"%s\""
+
+#: initdb.c:2164
+#, c-format
+msgid "If the locale name is specific to ICU, use --icu-locale."
+msgstr "如果å€åŸŸå稱是 ICU 專用的,請使用 --icu-locale。"
+
+#: initdb.c:2177
+#, c-format
+msgid "invalid locale settings; check LANG and LC_* environment variables"
+msgstr "無效的å€åŸŸè¨­å®šï¼›è«‹æª¢æŸ¥ LANG å’Œ LC_* 環境變數"
+
+#: initdb.c:2203 initdb.c:2227
+#, c-format
+msgid "encoding mismatch"
+msgstr "編碼ä¸ä¸€è‡´"
+
+#: initdb.c:2204
+#, 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:2209 initdb.c:2230
+#, c-format
+msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination."
+msgstr "é‡æ–°åŸ·è¡Œ %s 且ä¸æ˜Žç¢ºæŒ‡å®šç·¨ç¢¼æˆ–é¸æ“‡ä¸€å€‹ç›¸ç¬¦çš„組åˆã€‚"
+
+#: initdb.c:2228
+#, c-format
+msgid "The encoding you selected (%s) is not supported with the ICU provider."
+msgstr "您所é¸æ“‡çš„編碼方å¼(%s)ä¸å— ICU æ供者支æ´ã€‚"
+
+# rewrite/rewriteDefine.c:421
+#: initdb.c:2279
+#, c-format
+msgid "could not convert locale name \"%s\" to language tag: %s"
+msgstr "無法將å€åŸŸå稱 \"%s\" 轉æ›ç‚ºèªžè¨€æ¨™ç±¤: %s"
+
+# input.c:213
+#: initdb.c:2285 initdb.c:2337 initdb.c:2416
+#, c-format
+msgid "ICU is not supported in this build"
+msgstr "此版本ä¸æ”¯æ´ ICU"
+
+# utils/init/miscinit.c:792 utils/misc/guc.c:5074
+#: initdb.c:2308
+#, c-format
+msgid "could not get language from locale \"%s\": %s"
+msgstr "無法從å€åŸŸè¨­å®š \"%s\" ç²å¾—語言: %s"
+
+#: initdb.c:2334
+#, c-format
+msgid "locale \"%s\" has unknown language \"%s\""
+msgstr "å€åŸŸè¨­å®š \"%s\" 具有未知的語言 \"%s\""
+
+# commands/aggregatecmds.c:111
+#: initdb.c:2400
+#, c-format
+msgid "ICU locale must be specified"
+msgstr "必須指定 ICU å€åŸŸè¨­å®š"
+
+#: initdb.c:2404
+#, c-format
+msgid "Using language tag \"%s\" for ICU locale \"%s\".\n"
+msgstr "使用語言標籤 \"%s\" 來設定 ICU å€åŸŸ \"%s\"。\n"
+
+#: initdb.c:2427
+#, c-format
+msgid ""
+"%s initializes a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s åˆå§‹åŒ– PostgreSQL 資料庫å¢é›†ã€‚\n"
+"\n"
+
+#: initdb.c:2428
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: initdb.c:2429
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: initdb.c:2430
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"é¸é …:\n"
+
+#: initdb.c:2431
+#, c-format
+msgid " -A, --auth=METHOD default authentication method for local connections\n"
+msgstr " -A, --auth=METHOD 本機連線的é è¨­é©—證方法\n"
+
+#: initdb.c:2432
+#, c-format
+msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n"
+msgstr " --auth-host=METHOD 本機 TCP/IP 連線的é è¨­é©—證方法\n"
+
+#: initdb.c:2433
+#, c-format
+msgid " --auth-local=METHOD default authentication method for local-socket connections\n"
+msgstr " --auth-local=METHOD 本機 socket 連線的é è¨­é©—證方法\n"
+
+#: initdb.c:2434
+#, c-format
+msgid " [-D, --pgdata=]DATADIR location for this database cluster\n"
+msgstr " [-D, --pgdata=]DATADIR 資料庫å¢é›†çš„ä½ç½®\n"
+
+#: initdb.c:2435
+#, c-format
+msgid " -E, --encoding=ENCODING set default encoding for new databases\n"
+msgstr " -E, --encoding=ENCODING 設定新資料庫的é è¨­ç·¨ç¢¼\n"
+
+#: initdb.c:2436
+#, c-format
+msgid " -g, --allow-group-access allow group read/execute on data directory\n"
+msgstr " -g, --allow-group-access å…許群組å°æ•¸æ“šç›®éŒ„進行讀å–和執行æ“作\n"
+
+#: initdb.c:2437
+#, c-format
+msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n"
+msgstr " --icu-locale=LOCALE 設定新資料庫的 ICU å€åŸŸè­˜åˆ¥ç¢¼\n"
+
+#: initdb.c:2438
+#, c-format
+msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n"
+msgstr " --icu-rules=RULES 設定新資料庫的é¡å¤– ICU 排åºè¦å‰‡\n"
+
+#: initdb.c:2439
+#, c-format
+msgid " -k, --data-checksums use data page checksums\n"
+msgstr " -k, --data-checksums 使用資料é æª¢æŸ¥\n"
+
+#: initdb.c:2440
+#, c-format
+msgid " --locale=LOCALE set default locale for new databases\n"
+msgstr " --locale=LOCALE 定新資料庫的é è¨­å€åŸŸ\n"
+
+#: initdb.c:2441
+#, c-format
+msgid ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" set default locale in the respective category for\n"
+" new databases (default taken from environment)\n"
+msgstr ""
+" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n"
+" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n"
+" 設定新資料庫相應類別的é è¨­å€åŸŸ(é è¨­å€¼å–自環境)\n"
+
+#: initdb.c:2445
+#, c-format
+msgid " --no-locale equivalent to --locale=C\n"
+msgstr " --no-locale åŒ --locale=C\n"
+
+#: initdb.c:2446
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" set default locale provider for new databases\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" 設定新資料庫的é è¨­åŸŸæ供者\n"
+
+#: initdb.c:2448
+#, c-format
+msgid " --pwfile=FILE read password for the new superuser from file\n"
+msgstr " --pwfile=FILE 從檔案中讀å–新超級使用者的密碼\n"
+
+#: initdb.c:2449
+#, c-format
+msgid ""
+" -T, --text-search-config=CFG\n"
+" default text search configuration\n"
+msgstr ""
+" -T, --text-search-config=CFG\n"
+" é è¨­æ–‡å­—æœå°‹é…ç½®\n"
+
+#: initdb.c:2451
+#, c-format
+msgid " -U, --username=NAME database superuser name\n"
+msgstr " -U, --username=NAME 資料庫超級使用者å稱\n"
+
+#: initdb.c:2452
+#, c-format
+msgid " -W, --pwprompt prompt for a password for the new superuser\n"
+msgstr " -W, --pwprompt æ示輸入新超級使用者的密碼\n"
+
+#: initdb.c:2453
+#, c-format
+msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " -X, --waldir=WALDIR write-ahead 日誌目錄的ä½ç½®\n"
+
+#: initdb.c:2454
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL 片段的大å°ï¼Œå–®ä½æ˜¯ MB\n"
+
+#: initdb.c:2455
+#, c-format
+msgid ""
+"\n"
+"Less commonly used options:\n"
+msgstr ""
+"\n"
+"較少使用的é¸é …:\n"
+
+# postmaster/postmaster.c:1022 tcop/postgres.c:2120
+#: initdb.c:2456
+#, c-format
+msgid " -c, --set NAME=VALUE override default setting for server parameter\n"
+msgstr " -c, --set NAME=VALUE 覆寫伺æœå™¨åƒæ•¸çš„é è¨­è¨­å®š\n"
+
+#: initdb.c:2457
+#, c-format
+msgid " -d, --debug generate lots of debugging output\n"
+msgstr " -d, --debug 產生大é‡çš„除錯訊æ¯\n"
+
+#: initdb.c:2458
+#, c-format
+msgid " --discard-caches set debug_discard_caches=1\n"
+msgstr " --discard-caches 設定 debug_discard_caches=1\n"
+
+#: initdb.c:2459
+#, c-format
+msgid " -L DIRECTORY where to find the input files\n"
+msgstr " -L DIRECTORY 指定尋找輸入檔案的路徑\n"
+
+#: initdb.c:2460
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 錯誤發生後ä¸åŸ·è¡Œæ¸…ç†å‹•ä½œ\n"
+
+#: initdb.c:2461
+#, 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:2462
+#, c-format
+msgid " --no-instructions do not print instructions for next steps\n"
+msgstr " --no-instructions ä¸é¡¯ç¤ºä¸‹ä¸€æ­¥æ“作的指示\n"
+
+#: initdb.c:2463
+#, c-format
+msgid " -s, --show show internal settings\n"
+msgstr " -s, --show 顯示內部設定\n"
+
+#: initdb.c:2464
+#, c-format
+msgid " -S, --sync-only only sync database files to disk, then exit\n"
+msgstr " -S, --sync-only åªåŒæ­¥è³‡æ–™åº«æª”案至ç£ç¢Ÿï¼Œç„¶å¾ŒçµæŸ\n"
+
+#: initdb.c:2465
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"其他é¸é …:\n"
+
+#: initdb.c:2466
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: initdb.c:2467
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: initdb.c:2468
+#, c-format
+msgid ""
+"\n"
+"If the data directory is not specified, the environment variable PGDATA\n"
+"is used.\n"
+msgstr ""
+"\n"
+"如果未指定資料目錄,則將使用環境變數 PGDATA。\n"
+
+#: initdb.c:2470
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: initdb.c:2471
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+#: initdb.c:2499
+#, c-format
+msgid "invalid authentication method \"%s\" for \"%s\" connections"
+msgstr "無效的身份驗證方法 \"%s\" 用於 \"%s\" 連線"
+
+#: initdb.c:2513
+#, c-format
+msgid "must specify a password for the superuser to enable password authentication"
+msgstr "必須為超級使用者指定密碼以啟用密碼驗證"
+
+#: initdb.c:2532
+#, c-format
+msgid "no data directory specified"
+msgstr "未指定資料目錄"
+
+#: initdb.c:2533
+#, 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:2550
+#, c-format
+msgid "could not set environment"
+msgstr "無法設定環境"
+
+#: initdb.c:2568
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "ç¨‹å¼ \"%s\" 為 %s 所需,但未在åŒä¸€ç›®éŒ„中找到 \"%s\""
+
+#: initdb.c:2571
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本ä¸åŒæ–¼ %s"
+
+#: initdb.c:2586
+#, c-format
+msgid "input file location must be an absolute path"
+msgstr "輸入檔案的ä½ç½®å¿…須是絕å°è·¯å¾‘"
+
+#: initdb.c:2603
+#, c-format
+msgid "The database cluster will be initialized with locale \"%s\".\n"
+msgstr "資料庫å¢é›†å°‡ä»¥å€åŸŸ \"%s\" 進行åˆå§‹åŒ–。\n"
+
+#: initdb.c:2606
+#, c-format
+msgid "The database cluster will be initialized with this locale configuration:\n"
+msgstr "資料庫å¢é›†å°‡ä»¥æ­¤èªžè¨€ç’°å¢ƒè¨­å®šé€²è¡Œåˆå§‹åŒ–:\n"
+
+#: initdb.c:2607
+#, c-format
+msgid " provider: %s\n"
+msgstr " æ供者: %s\n"
+
+#: initdb.c:2609
+#, c-format
+msgid " ICU locale: %s\n"
+msgstr " ICU å€åŸŸ: %s\n"
+
+#: initdb.c:2610
+#, c-format
+msgid ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+msgstr ""
+" LC_COLLATE: %s\n"
+" LC_CTYPE: %s\n"
+" LC_MESSAGES: %s\n"
+" LC_MONETARY: %s\n"
+" LC_NUMERIC: %s\n"
+" LC_TIME: %s\n"
+
+#: initdb.c:2640
+#, c-format
+msgid "could not find suitable encoding for locale \"%s\""
+msgstr "找ä¸åˆ°é©åˆå€åŸŸ \"%s\" 的編碼"
+
+#: initdb.c:2642
+#, c-format
+msgid "Rerun %s with the -E option."
+msgstr "以 -E é¸é …é‡æ–°åŸ·è¡Œ %s。"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: initdb.c:2655
+#, c-format
+msgid ""
+"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n"
+"The default database encoding will be set to \"%s\" instead.\n"
+msgstr ""
+"ç”±å€åŸŸéš±å«çš„編碼 \"%s\" ä¸è¢«å…許作為伺æœå™¨ç«¯çš„編碼。\n"
+"é è¨­çš„資料庫編碼將設定為 \"%s\"。\n"
+
+#: initdb.c:2660
+#, c-format
+msgid "locale \"%s\" requires unsupported encoding \"%s\""
+msgstr "å€åŸŸ \"%s\" 需è¦ä¸æ”¯æ´çš„編碼 \"%s\"。"
+
+#: initdb.c:2662
+#, c-format
+msgid "Encoding \"%s\" is not allowed as a server-side encoding."
+msgstr "編碼 \"%s\" ä¸å…許作為伺æœå™¨ç«¯ç·¨ç¢¼ã€‚"
+
+#: initdb.c:2664
+#, c-format
+msgid "Rerun %s with a different locale selection."
+msgstr "以ä¸åŒçš„å€åŸŸé‡æ–°åŸ·è¡Œ %s。"
+
+#: initdb.c:2672
+#, c-format
+msgid "The default database encoding has accordingly been set to \"%s\".\n"
+msgstr "é è¨­è³‡æ–™åº«ç·¨ç¢¼å·²è¢«è¨­ç‚º \"%s\"。\n"
+
+#: initdb.c:2741
+#, c-format
+msgid "could not find suitable text search configuration for locale \"%s\""
+msgstr "無法找到é©ç”¨æ–¼å€åŸŸ \"%s\" 的文字æœå°‹é…ç½®"
+
+# utils/misc/guc.c:2507
+#: initdb.c:2752
+#, c-format
+msgid "suitable text search configuration for locale \"%s\" is unknown"
+msgstr "無法確定é©ç”¨æ–¼å€åŸŸ \"%s\" 的文字æœå°‹é…ç½®"
+
+#: initdb.c:2757
+#, c-format
+msgid "specified text search configuration \"%s\" might not match locale \"%s\""
+msgstr "指定的文字æœå°‹é…ç½® \"%s\" å¯èƒ½èˆ‡å€åŸŸ \"%s\" ä¸ç›¸ç¬¦"
+
+#: initdb.c:2762
+#, c-format
+msgid "The default text search configuration will be set to \"%s\".\n"
+msgstr "é è¨­æ–‡å­—æœå°‹é…置將被設為 \"%s\"。\n"
+
+#: initdb.c:2805 initdb.c:2876
+#, c-format
+msgid "creating directory %s ... "
+msgstr "建立目錄 %s… "
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄 \"%s\": %m"
+
+#: initdb.c:2819 initdb.c:2891
+#, c-format
+msgid "fixing permissions on existing directory %s ... "
+msgstr "修復ç¾æœ‰ç›®éŒ„ %s 的權é™â€¦ "
+
+#: initdb.c:2824 initdb.c:2896
+#, c-format
+msgid "could not change permissions of directory \"%s\": %m"
+msgstr "無法變更目錄 \"%s\" 的權é™: %m"
+
+# commands/tablespace.c:334
+#: initdb.c:2836 initdb.c:2908
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "目錄 \"%s\" 已存在,但ä¸æ˜¯ç©ºç›®éŒ„。"
+
+#: initdb.c:2840
+#, 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\" 以外的åƒæ•¸ã€‚"
+
+# utils/init/postinit.c:283
+#: initdb.c:2848 initdb.c:2918 initdb.c:3325
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "無法存å–目錄 \"%s\": %m"
+
+#: initdb.c:2869
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL 目錄的ä½ç½®å¿…須是絕å°è·¯å¾‘"
+
+#: initdb.c:2912
+#, c-format
+msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"."
+msgstr "如果您想將 WAL 存儲在這個ä½ç½®ï¼Œè«‹åˆªé™¤æˆ–清空目錄 \"%s\"。"
+
+# commands/tablespace.c:355 commands/tablespace.c:984
+#: initdb.c:2922
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "ç„¡æ³•å»ºç«‹ç¬¦è™Ÿé€£çµ \"%s\": %m"
+
+#: initdb.c:2941
+#, c-format
+msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point."
+msgstr "其中包å«ä¸€å€‹ä»¥é»žè™Ÿé–‹é ­çš„éš±è—檔案,å¯èƒ½æ˜¯å› ç‚ºå®ƒæ˜¯ä¸€å€‹æŽ›è¼‰é»žã€‚"
+
+#: initdb.c:2943
+#, c-format
+msgid "It contains a lost+found directory, perhaps due to it being a mount point."
+msgstr "這包å«ä¸€å€‹ lost+found 目錄,å¯èƒ½æ˜¯å› ç‚ºå®ƒæ˜¯ä¸€å€‹æŽ›è¼‰é»žã€‚"
+
+#: initdb.c:2945
+#, c-format
+msgid ""
+"Using a mount point directly as the data directory is not recommended.\n"
+"Create a subdirectory under the mount point."
+msgstr ""
+"ä¸å»ºè­°ç›´æŽ¥ä½¿ç”¨æŽ›è¼‰é»žä½œç‚ºè³‡æ–™ç›®éŒ„。\n"
+"請在掛載點下建立一個å­ç›®éŒ„。"
+
+#: initdb.c:2971
+#, c-format
+msgid "creating subdirectories ... "
+msgstr "建立å­ç›®éŒ„… "
+
+#: initdb.c:3014
+msgid "performing post-bootstrap initialization ... "
+msgstr "執行啟動後的åˆå§‹åŒ–程åºâ€¦ "
+
+# bootstrap/bootstrap.c:304 postmaster/postmaster.c:500 tcop/postgres.c:2507
+#: initdb.c:3175
+#, c-format
+msgid "-c %s requires a value"
+msgstr "-c %s 需è¦æ供一個值"
+
+#: initdb.c:3200
+#, c-format
+msgid "Running in debug mode.\n"
+msgstr "以除錯模å¼åŸ·è¡Œã€‚\n"
+
+#: initdb.c:3204
+#, c-format
+msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n"
+msgstr "以ä¸æ¸…ç†æ¨¡å¼åŸ·è¡Œï¼ŒéŒ¯èª¤å°‡ä¸æœƒè¢«æ¸…除。\n"
+
+#: initdb.c:3274
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "未能識別的å€åŸŸæ供者: %s"
+
+#: initdb.c:3302
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: initdb.c:3309 initdb.c:3313
+#, c-format
+msgid "%s cannot be specified unless locale provider \"%s\" is chosen"
+msgstr "除éžé¸æ“‡äº†èªžè¨€æ供者 \"%2$s\",å¦å‰‡ä¸èƒ½æŒ‡å®š %1$s"
+
+#: initdb.c:3327 initdb.c:3404
+msgid "syncing data to disk ... "
+msgstr "åŒæ­¥è³‡æ–™åˆ°ç£ç¢Ÿâ€¦ "
+
+#: initdb.c:3335
+#, c-format
+msgid "password prompt and password file cannot be specified together"
+msgstr "ä¸èƒ½åŒæ™‚指定密碼æ示和密碼檔案"
+
+# commands/define.c:197
+#: initdb.c:3357
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize çš„åƒæ•¸å¿…須是數字"
+
+#: initdb.c:3359
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize çš„åƒæ•¸å¿…須是1å’Œ1024之間的二的次方數"
+
+#: initdb.c:3373
+#, c-format
+msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\""
+msgstr "ä¸å…許使用超級使用者å稱 \"%s\",角色å稱ä¸èƒ½ä»¥ \"pg_\" é–‹é ­"
+
+#: initdb.c:3375
+#, c-format
+msgid ""
+"The files belonging to this database system will be owned by user \"%s\".\n"
+"This user must also own the server process.\n"
+"\n"
+msgstr ""
+"資料庫系統的檔案屬於使用者 \"%s\",該使用者也必須æ“有伺æœå™¨è¡Œç¨‹ã€‚\n"
+"\n"
+
+#: initdb.c:3391
+#, c-format
+msgid "Data page checksums are enabled.\n"
+msgstr "已啟動資料é æª¢æŸ¥ã€‚\n"
+
+#: initdb.c:3393
+#, c-format
+msgid "Data page checksums are disabled.\n"
+msgstr "å·²åœç”¨è³‡æ–™é æª¢æŸ¥ã€‚\n"
+
+#: initdb.c:3410
+#, c-format
+msgid ""
+"\n"
+"Sync to disk skipped.\n"
+"The data directory might become corrupt if the operating system crashes.\n"
+msgstr ""
+"\n"
+"已略éŽåŒæ­¥è‡³ç£ç¢Ÿã€‚\n"
+"如果作業系統當機,資料目錄å¯èƒ½æœƒæ壞。\n"
+
+# libpq/auth.c:465
+#: initdb.c:3415
+#, c-format
+msgid "enabling \"trust\" authentication for local connections"
+msgstr "啟動本機連線的 \"trust\" 身份驗證"
+
+#: initdb.c:3416
+#, 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 "您å¯ä»¥åœ¨ä¸‹æ¬¡åŸ·è¡Œ initdb 時é€éŽç·¨è¼¯ pg_hba.conf 或用é¸é … -A 或 --auth-local å’Œ --auth-host 來變更這個設定。"
+
+#. translator: This is a placeholder in a shell command.
+#: initdb.c:3446
+msgid "logfile"
+msgstr "logfile"
+
+#: initdb.c:3448
+#, c-format
+msgid ""
+"\n"
+"Success. You can now start the database server using:\n"
+"\n"
+" %s\n"
+"\n"
+msgstr ""
+"\n"
+"æˆåŠŸï¼Œæ‚¨ç¾åœ¨å¯ä»¥ç”¨ä¸‹åˆ—命令啟動資料庫伺æœå™¨:\n"
+"\n"
+" %s\n"
+"\n"
+
+#~ msgid " --locale=LOCALE initialize database cluster with given locale\n"
+#~ msgstr " --locale=LOCALE 以指定的localeåˆå§‹åŒ–資料庫cluster\n"
+
+#~ msgid "%s: The password file was not generated. Please report this problem.\n"
+#~ msgstr "%s:無法產生密碼檔,請回報這個錯誤。\n"
+
+#, c-format
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: 無法存å–目錄 \"%s\": %s\n"
+
+# utils/fmgr/dfmgr.c:107 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:263
+#, c-format
+#~ msgid "%s: could not access file \"%s\": %s\n"
+#~ msgstr "%s: 無法存å–檔案 \"%s\":%s\n"
+
+#, c-format
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: 無法建立目錄\"%s\": %s\n"
+
+# commands/tablespace.c:355 commands/tablespace.c:984
+#, c-format
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: ç„¡æ³•å»ºç«‹ç¬¦è™Ÿé€£çµ \"%s\":%s\n"
+
+#~ msgid "%s: could not determine valid short version string\n"
+#~ msgstr "%s:無法å–得短版本字串\n"
+
+#, c-format
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: 無法å–å¾—ç›®å‰ä½¿ç”¨è€…å稱: %s\n"
+
+#, c-format
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: 無法å–å¾—ç›®å‰ä½¿ç”¨è€…資訊; %s\n"
+
+#, c-format
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: 無法開啟檔案\"%s\"讀å–資料: %s\n"
+
+#, c-format
+#~ msgid "%s: could not open file \"%s\" for writing: %s\n"
+#~ msgstr "%s: 無法開啟檔案\"%s\"寫入資料: %s\n"
+
+#, c-format
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: 無法寫入檔案\"%s\"; %s\n"
+
+#~ msgid "%s: failed\n"
+#~ msgstr "%s:失敗\n"
+
+#, c-format
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: 無法移除交易日誌目錄的內容\n"
+
+#, c-format
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: 無法移除交易日誌目錄\n"
+
+#, c-format
+#~ msgid "%s: file \"%s\" does not exist\n"
+#~ msgstr "%s: 檔案 \"%s\" ä¸å­˜åœ¨\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s: input file \"%s\" does not belong to PostgreSQL %s\n"
+#~ "Check your installation or specify the correct path using the option -L.\n"
+#~ msgstr ""
+#~ "%s: 輸入檔 \"%s\" ä¸å±¬æ–¼ PostgreSQL %s\n"
+#~ "請檢查你的安è£æˆ–用 -L é¸é …指定正確的路徑。\n"
+
+#, c-format
+#~ msgid "%s: invalid locale name \"%s\"\n"
+#~ msgstr "%s: 無效的å€åŸŸå稱 \"%s\"\n"
+
+#, c-format
+#~ msgid "%s: locale name has non-ASCII characters, skipped: %s\n"
+#~ msgstr "%s: å€åŸŸå稱有éžASCII字元,忽略: %s\n"
+
+#, c-format
+#~ msgid "%s: locale name too long, skipped: %s\n"
+#~ msgstr "%s: å€åŸŸå稱太長,忽略: %s\n"
+
+#, c-format
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: 記憶體用盡\n"
+
+#, c-format
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: 正在移除交易日誌目錄的內容 \"%s\"\n"
+
+# access/transam/xlog.c:2163
+#, c-format
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: 正在移除交易日誌目錄 \"%s\"\n"
+
+# commands/tablespace.c:386 commands/tablespace.c:483
+#, c-format
+#~ msgid "%s: symlinks are not supported on this platform"
+#~ msgstr "%s: 此平å°ä¸æ”¯æ´ç¬¦è™Ÿé€£çµ"
+
+#, c-format
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s: 無法ä¾ä½¿ç”¨è€…è¦æ±‚刪除交易日誌目錄 \"%s\"\n"
+
+#, c-format
+#~ msgid "%s: unrecognized authentication method \"%s\"\n"
+#~ msgstr "%s: 無法辨èªçš„驗證方å¼\"%s\"\n"
+
+# describe.c:1542
+#, c-format
+#~ msgid "No usable system locales were found.\n"
+#~ msgstr "找ä¸åˆ°å¯ç”¨çš„系統å€åŸŸã€‚\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "%s 需è¦ç¨‹å¼ \"postgres\",但是在與\"%s\"相åŒçš„目錄中找ä¸åˆ°ã€‚\n"
+#~ "請檢查你的安è£ã€‚\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"%s\" å·²æ‰¾åˆ°ç¨‹å¼ \"postgres\",但是與 %s 的版本ä¸ç¬¦ã€‚\n"
+#~ "請檢查你的安è£ã€‚\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "執行\"%s --help\"å–得更多資訊。\n"
+
+#, c-format
+#~ msgid "Use the option \"--debug\" to see details.\n"
+#~ msgstr "用 \"--debug\" é¸é …å–得詳細資訊。\n"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s 終止"
+
+#~ msgid "copying template1 to postgres ... "
+#~ msgstr "複製 template1 到 postgres..."
+
+#~ msgid "copying template1 to template0 ... "
+#~ msgstr "複製 template1 到 template0 ..."
+
+#, c-format
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "無法切æ›ç›®éŒ„至\"%s\""
+
+#, c-format
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "無法識別目å‰çš„目錄:%s"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#, c-format
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "無法開啟目錄 \"%s\":%s\n"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#, c-format
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "無法讀å–目錄 \"%s\":%s\n"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "無法讀å–符號連çµ\"%s\""
+
+# commands/tablespace.c:610
+#, c-format
+#~ msgid "could not remove file or directory \"%s\": %s\n"
+#~ msgstr "無法移除檔案或目錄 \"%s\":%s\n"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#, c-format
+#~ msgid "could not stat file or directory \"%s\": %s\n"
+#~ msgstr "無法å°æª”案或目錄 \"%s\" 執行 stat 函å¼:%s\n"
+
+#~ msgid "creating collations ... "
+#~ msgstr "å»ºç«‹å®šåº ... "
+
+#~ msgid "creating conversions ... "
+#~ msgstr "å»ºç«‹è½‰æ› ... "
+
+#~ msgid "creating dictionaries ... "
+#~ msgstr "建立字典..."
+
+#~ msgid "creating directory %s/%s ... "
+#~ msgstr "建立目錄 %s/%s ..."
+
+#~ msgid "creating information schema ... "
+#~ msgstr "建立information schema ... "
+
+#~ msgid "creating system views ... "
+#~ msgstr "建立系統views..."
+
+#, c-format
+#~ msgid "creating template1 database in %s/base/1 ... "
+#~ msgstr "建立 template1 資料庫於 %s/base/1 ... "
+
+#~ msgid "enabling unlimited row size for system tables ... "
+#~ msgstr "啟用系統資料表的無資料筆數é™åˆ¶ ..."
+
+#~ msgid "initializing dependencies ... "
+#~ msgstr "åˆå§‹åŒ–相ä¾æ€§..."
+
+#~ msgid "initializing pg_authid ... "
+#~ msgstr "åˆå§‹åŒ– pg_authid..."
+
+#~ msgid "loading PL/pgSQL server-side language ... "
+#~ msgstr "載入 PL/pgSQL 伺æœå™¨ç«¯èªžè¨€ ..."
+
+#~ msgid "loading system objects' descriptions ... "
+#~ msgstr "正在載入系統物件的æè¿°..."
+
+# commands/tablespace.c:386 commands/tablespace.c:483
+#, c-format
+#~ msgid "not supported on this platform\n"
+#~ msgstr "在此平å°ä¸æ”¯æ´\n"
+
+#, c-format
+#~ msgid "setting password ... "
+#~ msgstr "設定密碼..."
+
+#~ msgid "setting privileges on built-in objects ... "
+#~ msgstr "è¨­å®šå…§å»ºç‰©ä»¶çš„æ¬Šé™ ... "
+
+#~ msgid "vacuuming database template1 ... "
+#~ msgstr "é‡æ•´è³‡æ–™åº«template1 ..."
diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl
new file mode 100644
index 0000000..2d7469d
--- /dev/null
+++ b/src/bin/initdb/t/001_initdb.pl
@@ -0,0 +1,190 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# To test successful data directory creation with an additional feature, first
+# try to elaborate the "successful creation" test instead of adding a test.
+# Successful initdb consumes much time and I/O.
+
+use strict;
+use warnings;
+use Fcntl ':mode';
+use File::stat qw{lstat};
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $xlogdir = "$tempdir/pgxlog";
+my $datadir = "$tempdir/data";
+
+program_help_ok('initdb');
+program_version_ok('initdb');
+program_options_handling_ok('initdb');
+
+command_fails([ 'initdb', '-S', "$tempdir/nonexistent" ],
+ 'sync missing data directory');
+
+mkdir $xlogdir;
+mkdir "$xlogdir/lost+found";
+command_fails(
+ [ 'initdb', '-X', $xlogdir, $datadir ],
+ 'existing nonempty xlog directory');
+rmdir "$xlogdir/lost+found";
+command_fails(
+ [ 'initdb', '-X', 'pgxlog', $datadir ],
+ 'relative xlog directory not allowed');
+
+command_fails(
+ [ 'initdb', '-U', 'pg_test', $datadir ],
+ 'role names cannot begin with "pg_"');
+
+mkdir $datadir;
+
+# make sure we run one successful test without a TZ setting so we test
+# initdb's time zone setting code
+{
+
+ # delete local only works from perl 5.12, so use the older way to do this
+ local (%ENV) = %ENV;
+ delete $ENV{TZ};
+
+ # while we are here, also exercise -T and -c options
+ command_ok(
+ [
+ 'initdb', '-N', '-T', 'german', '-c',
+ 'default_text_search_config=german',
+ '-X', $xlogdir, $datadir
+ ],
+ 'successful creation');
+
+ # Permissions on PGDATA should be default
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($datadir, 0700, 0600),
+ "check PGDATA permissions");
+ }
+}
+
+# Control file should tell that data checksums are disabled by default.
+command_like(
+ [ 'pg_controldata', $datadir ],
+ qr/Data page checksum version:.*0/,
+ 'checksums are disabled in control file');
+# pg_checksums fails with checksums disabled by default. This is
+# not part of the tests included in pg_checksums to save from
+# the creation of an extra instance.
+command_fails([ 'pg_checksums', '-D', $datadir ],
+ "pg_checksums fails with data checksum disabled");
+
+command_ok([ 'initdb', '-S', $datadir ], 'sync only');
+command_fails([ 'initdb', $datadir ], 'existing data directory');
+
+# Check group access on PGDATA
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 2
+ if ($windows_os);
+
+ # Init a new db with group access
+ my $datadir_group = "$tempdir/data_group";
+
+ command_ok(
+ [ 'initdb', '-g', $datadir_group ],
+ 'successful creation with group access');
+
+ ok(check_mode_recursive($datadir_group, 0750, 0640),
+ 'check PGDATA permissions');
+}
+
+# Locale provider tests
+
+if ($ENV{with_icu} eq 'yes')
+{
+ command_fails_like(
+ [ 'initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2" ],
+ qr/initdb: error: ICU locale must be specified/,
+ 'locale provider ICU requires --icu-locale');
+
+ command_ok(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--icu-locale=en',
+ "$tempdir/data3"
+ ],
+ 'option --icu-locale');
+
+ command_like(
+ [
+ 'initdb', '--no-sync',
+ '-A', 'trust',
+ '--locale-provider=icu', '--locale=und',
+ '--lc-collate=C', '--lc-ctype=C',
+ '--lc-messages=C', '--lc-numeric=C',
+ '--lc-monetary=C', '--lc-time=C',
+ "$tempdir/data4"
+ ],
+ qr/^\s+ICU locale:\s+und\n/ms,
+ 'options --locale-provider=icu --locale=und --lc-*=C');
+
+ command_fails_like(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--icu-locale=@colNumeric=lower',
+ "$tempdir/dataX"
+ ],
+ qr/could not open collator for locale/,
+ 'fails for invalid ICU locale');
+
+ command_fails_like(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--encoding=SQL_ASCII',
+ '--icu-locale=en', "$tempdir/dataX"
+ ],
+ qr/error: encoding mismatch/,
+ 'fails for encoding not supported by ICU');
+
+ command_fails_like(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--icu-locale=nonsense-nowhere',
+ "$tempdir/dataX"
+ ],
+ qr/error: locale "nonsense-nowhere" has unknown language "nonsense"/,
+ 'fails for nonsense language');
+
+ command_fails_like(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=icu', '--icu-locale=@colNumeric=lower',
+ "$tempdir/dataX"
+ ],
+ qr/could not open collator for locale "und-u-kn-lower": U_ILLEGAL_ARGUMENT_ERROR/,
+ 'fails for invalid collation argument');
+}
+else
+{
+ command_fails(
+ [ 'initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2" ],
+ 'locale provider ICU fails since no ICU support');
+}
+
+command_fails(
+ [ 'initdb', '--no-sync', '--locale-provider=xyz', "$tempdir/dataX" ],
+ 'fails for invalid locale provider');
+
+command_fails(
+ [
+ 'initdb', '--no-sync',
+ '--locale-provider=libc', '--icu-locale=en',
+ "$tempdir/dataX"
+ ],
+ 'fails for invalid option combination');
+
+command_fails([ 'initdb', '--no-sync', '--set', 'foo=bar', "$tempdir/dataX" ],
+ 'fails for invalid --set option');
+
+done_testing();
diff --git a/src/bin/meson.build b/src/bin/meson.build
new file mode 100644
index 0000000..67cb506
--- /dev/null
+++ b/src/bin/meson.build
@@ -0,0 +1,22 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+subdir('initdb')
+subdir('pg_amcheck')
+subdir('pg_archivecleanup')
+subdir('pg_basebackup')
+subdir('pg_checksums')
+subdir('pg_config')
+subdir('pg_controldata')
+subdir('pg_ctl')
+subdir('pg_dump')
+subdir('pg_resetwal')
+subdir('pg_rewind')
+subdir('pg_test_fsync')
+subdir('pg_test_timing')
+subdir('pg_upgrade')
+subdir('pg_verifybackup')
+subdir('pg_waldump')
+subdir('pgbench')
+subdir('pgevent')
+subdir('psql')
+subdir('scripts')
diff --git a/src/bin/pg_amcheck/.gitignore b/src/bin/pg_amcheck/.gitignore
new file mode 100644
index 0000000..c21a14d
--- /dev/null
+++ b/src/bin/pg_amcheck/.gitignore
@@ -0,0 +1,3 @@
+pg_amcheck
+
+/tmp_check/
diff --git a/src/bin/pg_amcheck/Makefile b/src/bin/pg_amcheck/Makefile
new file mode 100644
index 0000000..947f226
--- /dev/null
+++ b/src/bin/pg_amcheck/Makefile
@@ -0,0 +1,51 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_amcheck
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_amcheck/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_amcheck - detect corruption within database relations"
+PGAPPICON=win32
+
+EXTRA_INSTALL=contrib/amcheck contrib/pageinspect
+
+subdir = src/bin/pg_amcheck
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ pg_amcheck.o
+
+all: pg_amcheck
+
+pg_amcheck: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_amcheck$(X) '$(DESTDIR)$(bindir)/pg_amcheck$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_amcheck$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_amcheck$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_amcheck/README b/src/bin/pg_amcheck/README
new file mode 100644
index 0000000..dd6f0c5
--- /dev/null
+++ b/src/bin/pg_amcheck/README
@@ -0,0 +1,21 @@
+src/bin/pg_amcheck/README
+
+pg_amcheck is a command-line tool for running the amcheck extension.
+
+Running the regression tests
+============================
+
+NOTE: You must have given the --enable-tap-tests argument to configure.
+Also, to use "make installcheck", you must have built and installed
+contrib/amcheck and contrib/pageinspect in addition to the core code.
+
+Run
+ make check
+or
+ make installcheck
+You can use "make installcheck" if you previously did "make install".
+In that case, the code in the installation tree is tested. With
+"make check", a temporary installation tree is built from the current
+sources and then tested.
+
+See src/test/perl/README for more info about running these tests.
diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build
new file mode 100644
index 0000000..2ade5ab
--- /dev/null
+++ b/src/bin/pg_amcheck/meson.build
@@ -0,0 +1,35 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_amcheck_sources = files(
+ 'pg_amcheck.c',
+)
+
+if host_system == 'windows'
+ pg_amcheck_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_amcheck',
+ '--FILEDESC', 'pg_amcheck - detect corruption within database relations',])
+endif
+
+pg_amcheck = executable('pg_amcheck',
+ pg_amcheck_sources,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_amcheck
+
+tests += {
+ 'name': 'pg_amcheck',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_nonesuch.pl',
+ 't/003_check.pl',
+ 't/004_verify_heapam.pl',
+ 't/005_opclass_damage.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_amcheck/nls.mk b/src/bin/pg_amcheck/nls.mk
new file mode 100644
index 0000000..5e61719
--- /dev/null
+++ b/src/bin/pg_amcheck/nls.mk
@@ -0,0 +1,12 @@
+# src/bin/pg_amcheck/nls.mk
+CATALOG_NAME = pg_amcheck
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_amcheck.c \
+ ../../fe_utils/cancel.c \
+ ../../fe_utils/connect_utils.c \
+ ../../fe_utils/option_utils.c \
+ ../../fe_utils/query_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ log_no_match
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ log_no_match:1:c-format
diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c
new file mode 100644
index 0000000..57df14b
--- /dev/null
+++ b/src/bin/pg_amcheck/pg_amcheck.c
@@ -0,0 +1,2177 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_amcheck.c
+ * Detects corruption within database relations.
+ *
+ * Copyright (c) 2017-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_amcheck/pg_amcheck.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <limits.h>
+#include <time.h>
+
+#include "catalog/pg_am_d.h"
+#include "catalog/pg_namespace_d.h"
+#include "common/logging.h"
+#include "common/username.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/parallel_slot.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h" /* pgrminclude ignore */
+#include "pgtime.h"
+#include "storage/block.h"
+
+typedef struct PatternInfo
+{
+ const char *pattern; /* Unaltered pattern from the command line */
+ char *db_regex; /* Database regexp parsed from pattern, or
+ * NULL */
+ char *nsp_regex; /* Schema regexp parsed from pattern, or NULL */
+ char *rel_regex; /* Relation regexp parsed from pattern, or
+ * NULL */
+ bool heap_only; /* true if rel_regex should only match heap
+ * tables */
+ bool btree_only; /* true if rel_regex should only match btree
+ * indexes */
+ bool matched; /* true if the pattern matched in any database */
+} PatternInfo;
+
+typedef struct PatternInfoArray
+{
+ PatternInfo *data;
+ size_t len;
+} PatternInfoArray;
+
+/* pg_amcheck command line options controlled by user flags */
+typedef struct AmcheckOptions
+{
+ bool dbpattern;
+ bool alldb;
+ bool echo;
+ bool verbose;
+ bool strict_names;
+ bool show_progress;
+ int jobs;
+
+ /*
+ * Whether to install missing extensions, and optionally the name of the
+ * schema in which to install the extension's objects.
+ */
+ bool install_missing;
+ char *install_schema;
+
+ /* Objects to check or not to check, as lists of PatternInfo structs. */
+ PatternInfoArray include;
+ PatternInfoArray exclude;
+
+ /*
+ * As an optimization, if any pattern in the exclude list applies to heap
+ * tables, or similarly if any such pattern applies to btree indexes, or
+ * to schemas, then these will be true, otherwise false. These should
+ * always agree with what you'd conclude by grep'ing through the exclude
+ * list.
+ */
+ bool excludetbl;
+ bool excludeidx;
+ bool excludensp;
+
+ /*
+ * If any inclusion pattern exists, then we should only be checking
+ * matching relations rather than all relations, so this is true iff
+ * include is empty.
+ */
+ bool allrel;
+
+ /* heap table checking options */
+ bool no_toast_expansion;
+ bool reconcile_toast;
+ bool on_error_stop;
+ int64 startblock;
+ int64 endblock;
+ const char *skip;
+
+ /* btree index checking options */
+ bool parent_check;
+ bool rootdescend;
+ bool heapallindexed;
+
+ /* heap and btree hybrid option */
+ bool no_btree_expansion;
+} AmcheckOptions;
+
+static AmcheckOptions opts = {
+ .dbpattern = false,
+ .alldb = false,
+ .echo = false,
+ .verbose = false,
+ .strict_names = true,
+ .show_progress = false,
+ .jobs = 1,
+ .install_missing = false,
+ .install_schema = "pg_catalog",
+ .include = {NULL, 0},
+ .exclude = {NULL, 0},
+ .excludetbl = false,
+ .excludeidx = false,
+ .excludensp = false,
+ .allrel = true,
+ .no_toast_expansion = false,
+ .reconcile_toast = true,
+ .on_error_stop = false,
+ .startblock = -1,
+ .endblock = -1,
+ .skip = "none",
+ .parent_check = false,
+ .rootdescend = false,
+ .heapallindexed = false,
+ .no_btree_expansion = false
+};
+
+static const char *progname = NULL;
+
+/* Whether all relations have so far passed their corruption checks */
+static bool all_checks_pass = true;
+
+/* Time last progress report was displayed */
+static pg_time_t last_progress_report = 0;
+static bool progress_since_last_stderr = false;
+
+typedef struct DatabaseInfo
+{
+ char *datname;
+ char *amcheck_schema; /* escaped, quoted literal */
+} DatabaseInfo;
+
+typedef struct RelationInfo
+{
+ const DatabaseInfo *datinfo; /* shared by other relinfos */
+ Oid reloid;
+ bool is_heap; /* true if heap, false if btree */
+ char *nspname;
+ char *relname;
+ int relpages;
+ int blocks_to_check;
+ char *sql; /* set during query run, pg_free'd after */
+} RelationInfo;
+
+/*
+ * Query for determining if contrib's amcheck is installed. If so, selects the
+ * namespace name where amcheck's functions can be found.
+ */
+static const char *amcheck_sql =
+"SELECT n.nspname, x.extversion FROM pg_catalog.pg_extension x"
+"\nJOIN pg_catalog.pg_namespace n ON x.extnamespace = n.oid"
+"\nWHERE x.extname = 'amcheck'";
+
+static void prepare_heap_command(PQExpBuffer sql, RelationInfo *rel,
+ PGconn *conn);
+static void prepare_btree_command(PQExpBuffer sql, RelationInfo *rel,
+ PGconn *conn);
+static void run_command(ParallelSlot *slot, const char *sql);
+static bool verify_heap_slot_handler(PGresult *res, PGconn *conn,
+ void *context);
+static bool verify_btree_slot_handler(PGresult *res, PGconn *conn, void *context);
+static void help(const char *progname);
+static void progress_report(uint64 relations_total, uint64 relations_checked,
+ uint64 relpages_total, uint64 relpages_checked,
+ const char *datname, bool force, bool finished);
+
+static void append_database_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_schema_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_relation_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_heap_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void append_btree_pattern(PatternInfoArray *pia, const char *pattern,
+ int encoding);
+static void compile_database_list(PGconn *conn, SimplePtrList *databases,
+ const char *initial_dbname);
+static void compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations,
+ const DatabaseInfo *dat,
+ uint64 *pagecount);
+
+#define log_no_match(...) do { \
+ if (opts.strict_names) \
+ pg_log_error(__VA_ARGS__); \
+ else \
+ pg_log_warning(__VA_ARGS__); \
+ } while(0)
+
+#define FREE_AND_SET_NULL(x) do { \
+ pg_free(x); \
+ (x) = NULL; \
+ } while (0)
+
+int
+main(int argc, char *argv[])
+{
+ PGconn *conn = NULL;
+ SimplePtrListCell *cell;
+ SimplePtrList databases = {NULL, NULL};
+ SimplePtrList relations = {NULL, NULL};
+ bool failed = false;
+ const char *latest_datname;
+ int parallel_workers;
+ ParallelSlotArray *sa;
+ PQExpBufferData sql;
+ uint64 reltotal = 0;
+ uint64 pageschecked = 0;
+ uint64 pagestotal = 0;
+ uint64 relprogress = 0;
+ int pattern_id;
+
+ static struct option long_options[] = {
+ /* Connection options */
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"maintenance-db", required_argument, NULL, 1},
+
+ /* check options */
+ {"all", no_argument, NULL, 'a'},
+ {"database", required_argument, NULL, 'd'},
+ {"exclude-database", required_argument, NULL, 'D'},
+ {"echo", no_argument, NULL, 'e'},
+ {"index", required_argument, NULL, 'i'},
+ {"exclude-index", required_argument, NULL, 'I'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"progress", no_argument, NULL, 'P'},
+ {"relation", required_argument, NULL, 'r'},
+ {"exclude-relation", required_argument, NULL, 'R'},
+ {"schema", required_argument, NULL, 's'},
+ {"exclude-schema", required_argument, NULL, 'S'},
+ {"table", required_argument, NULL, 't'},
+ {"exclude-table", required_argument, NULL, 'T'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"no-dependent-indexes", no_argument, NULL, 2},
+ {"no-dependent-toast", no_argument, NULL, 3},
+ {"exclude-toast-pointers", no_argument, NULL, 4},
+ {"on-error-stop", no_argument, NULL, 5},
+ {"skip", required_argument, NULL, 6},
+ {"startblock", required_argument, NULL, 7},
+ {"endblock", required_argument, NULL, 8},
+ {"rootdescend", no_argument, NULL, 9},
+ {"no-strict-names", no_argument, NULL, 10},
+ {"heapallindexed", no_argument, NULL, 11},
+ {"parent-check", no_argument, NULL, 12},
+ {"install-missing", optional_argument, NULL, 13},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ int optindex;
+ int c;
+
+ const char *db = NULL;
+ const char *maintenance_db = NULL;
+
+ const char *host = NULL;
+ const char *port = NULL;
+ const char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ int encoding = pg_get_encoding_from_locale(NULL, false);
+ ConnParams cparams;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_amcheck"));
+
+ handle_help_version_opts(argc, argv, progname, help);
+
+ /* process command-line options */
+ while ((c = getopt_long(argc, argv, "ad:D:eh:Hi:I:j:p:Pr:R:s:S:t:T:U:vwW",
+ long_options, &optindex)) != -1)
+ {
+ char *endptr;
+ unsigned long optval;
+
+ switch (c)
+ {
+ case 'a':
+ opts.alldb = true;
+ break;
+ case 'd':
+ opts.dbpattern = true;
+ append_database_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'D':
+ opts.dbpattern = true;
+ append_database_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 'e':
+ opts.echo = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'i':
+ opts.allrel = false;
+ append_btree_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'I':
+ opts.excludeidx = true;
+ append_btree_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 'j':
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &opts.jobs))
+ exit(1);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'P':
+ opts.show_progress = true;
+ break;
+ case 'r':
+ opts.allrel = false;
+ append_relation_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'R':
+ opts.excludeidx = true;
+ opts.excludetbl = true;
+ append_relation_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 's':
+ opts.allrel = false;
+ append_schema_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'S':
+ opts.excludensp = true;
+ append_schema_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 't':
+ opts.allrel = false;
+ append_heap_pattern(&opts.include, optarg, encoding);
+ break;
+ case 'T':
+ opts.excludetbl = true;
+ append_heap_pattern(&opts.exclude, optarg, encoding);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'v':
+ opts.verbose = true;
+ pg_logging_increase_verbosity();
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 1:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 2:
+ opts.no_btree_expansion = true;
+ break;
+ case 3:
+ opts.no_toast_expansion = true;
+ break;
+ case 4:
+ opts.reconcile_toast = false;
+ break;
+ case 5:
+ opts.on_error_stop = true;
+ break;
+ case 6:
+ if (pg_strcasecmp(optarg, "all-visible") == 0)
+ opts.skip = "all-visible";
+ else if (pg_strcasecmp(optarg, "all-frozen") == 0)
+ opts.skip = "all-frozen";
+ else if (pg_strcasecmp(optarg, "none") == 0)
+ opts.skip = "none";
+ else
+ pg_fatal("invalid argument for option %s", "--skip");
+ break;
+ case 7:
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ pg_fatal("invalid start block");
+ if (optval > MaxBlockNumber)
+ pg_fatal("start block out of bounds");
+ opts.startblock = optval;
+ break;
+ case 8:
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ pg_fatal("invalid end block");
+ if (optval > MaxBlockNumber)
+ pg_fatal("end block out of bounds");
+ opts.endblock = optval;
+ break;
+ case 9:
+ opts.rootdescend = true;
+ opts.parent_check = true;
+ break;
+ case 10:
+ opts.strict_names = false;
+ break;
+ case 11:
+ opts.heapallindexed = true;
+ break;
+ case 12:
+ opts.parent_check = true;
+ break;
+ case 13:
+ opts.install_missing = true;
+ if (optarg)
+ opts.install_schema = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (opts.endblock >= 0 && opts.endblock < opts.startblock)
+ pg_fatal("end block precedes start block");
+
+ /*
+ * A single non-option arguments specifies a database name or connection
+ * string.
+ */
+ if (optind < argc)
+ {
+ db = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.dbname = NULL;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ /* choose the database for our initial connection */
+ if (opts.alldb)
+ {
+ if (db != NULL)
+ pg_fatal("cannot specify a database name with --all");
+ cparams.dbname = maintenance_db;
+ }
+ else if (db != NULL)
+ {
+ if (opts.dbpattern)
+ pg_fatal("cannot specify both a database name and database patterns");
+ cparams.dbname = db;
+ }
+
+ if (opts.alldb || opts.dbpattern)
+ {
+ conn = connectMaintenanceDatabase(&cparams, progname, opts.echo);
+ compile_database_list(conn, &databases, NULL);
+ }
+ else
+ {
+ if (cparams.dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ cparams.dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ cparams.dbname = getenv("PGUSER");
+ else
+ cparams.dbname = get_user_name_or_exit(progname);
+ }
+ conn = connectDatabase(&cparams, progname, opts.echo, false, true);
+ compile_database_list(conn, &databases, PQdb(conn));
+ }
+
+ if (databases.head == NULL)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ pg_log_warning("no databases to check");
+ exit(0);
+ }
+
+ /*
+ * Compile a list of all relations spanning all databases to be checked.
+ */
+ for (cell = databases.head; cell; cell = cell->next)
+ {
+ PGresult *result;
+ int ntups;
+ const char *amcheck_schema = NULL;
+ DatabaseInfo *dat = (DatabaseInfo *) cell->ptr;
+
+ cparams.override_dbname = dat->datname;
+ if (conn == NULL || strcmp(PQdb(conn), dat->datname) != 0)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ conn = connectDatabase(&cparams, progname, opts.echo, false, true);
+ }
+
+ /*
+ * Optionally install amcheck if not already installed in this
+ * database.
+ */
+ if (opts.install_missing)
+ {
+ char *schema;
+ char *install_sql;
+
+ /*
+ * Must re-escape the schema name for each database, as the
+ * escaping rules may change.
+ */
+ schema = PQescapeIdentifier(conn, opts.install_schema,
+ strlen(opts.install_schema));
+ install_sql = psprintf("CREATE EXTENSION IF NOT EXISTS amcheck WITH SCHEMA %s",
+ schema);
+
+ executeCommand(conn, install_sql, opts.echo);
+ pfree(install_sql);
+ pfree(schema);
+ }
+
+ /*
+ * Verify that amcheck is installed for this next database. User
+ * error could result in a database not having amcheck that should
+ * have it, but we also could be iterating over multiple databases
+ * where not all of them have amcheck installed (for example,
+ * 'template1').
+ */
+ result = executeQuery(conn, amcheck_sql, opts.echo);
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ /* Querying the catalog failed. */
+ pg_log_error("database \"%s\": %s",
+ PQdb(conn), PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", amcheck_sql);
+ PQclear(result);
+ disconnectDatabase(conn);
+ exit(1);
+ }
+ ntups = PQntuples(result);
+ if (ntups == 0)
+ {
+ /* Querying the catalog succeeded, but amcheck is missing. */
+ pg_log_warning("skipping database \"%s\": amcheck is not installed",
+ PQdb(conn));
+ disconnectDatabase(conn);
+ conn = NULL;
+ continue;
+ }
+ amcheck_schema = PQgetvalue(result, 0, 0);
+ if (opts.verbose)
+ pg_log_info("in database \"%s\": using amcheck version \"%s\" in schema \"%s\"",
+ PQdb(conn), PQgetvalue(result, 0, 1), amcheck_schema);
+ dat->amcheck_schema = PQescapeIdentifier(conn, amcheck_schema,
+ strlen(amcheck_schema));
+ PQclear(result);
+
+ compile_relation_list_one_db(conn, &relations, dat, &pagestotal);
+ }
+
+ /*
+ * Check that all inclusion patterns matched at least one schema or
+ * relation that we can check.
+ */
+ for (pattern_id = 0; pattern_id < opts.include.len; pattern_id++)
+ {
+ PatternInfo *pat = &opts.include.data[pattern_id];
+
+ if (!pat->matched && (pat->nsp_regex != NULL || pat->rel_regex != NULL))
+ {
+ failed = opts.strict_names;
+
+ if (pat->heap_only)
+ log_no_match("no heap tables to check matching \"%s\"",
+ pat->pattern);
+ else if (pat->btree_only)
+ log_no_match("no btree indexes to check matching \"%s\"",
+ pat->pattern);
+ else if (pat->rel_regex == NULL)
+ log_no_match("no relations to check in schemas matching \"%s\"",
+ pat->pattern);
+ else
+ log_no_match("no relations to check matching \"%s\"",
+ pat->pattern);
+ }
+ }
+
+ if (failed)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ exit(1);
+ }
+
+ /*
+ * Set parallel_workers to the lesser of opts.jobs and the number of
+ * relations.
+ */
+ parallel_workers = 0;
+ for (cell = relations.head; cell; cell = cell->next)
+ {
+ reltotal++;
+ if (parallel_workers < opts.jobs)
+ parallel_workers++;
+ }
+
+ if (reltotal == 0)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ pg_fatal("no relations to check");
+ }
+ progress_report(reltotal, relprogress, pagestotal, pageschecked,
+ NULL, true, false);
+
+ /*
+ * Main event loop.
+ *
+ * We use server-side parallelism to check up to parallel_workers
+ * relations in parallel. The list of relations was computed in database
+ * order, which minimizes the number of connects and disconnects as we
+ * process the list.
+ */
+ latest_datname = NULL;
+ sa = ParallelSlotsSetup(parallel_workers, &cparams, progname, opts.echo,
+ NULL);
+ if (conn != NULL)
+ {
+ ParallelSlotsAdoptConn(sa, conn);
+ conn = NULL;
+ }
+
+ initPQExpBuffer(&sql);
+ for (relprogress = 0, cell = relations.head; cell; cell = cell->next)
+ {
+ ParallelSlot *free_slot;
+ RelationInfo *rel;
+
+ rel = (RelationInfo *) cell->ptr;
+
+ if (CancelRequested)
+ {
+ failed = true;
+ break;
+ }
+
+ /*
+ * The list of relations is in database sorted order. If this next
+ * relation is in a different database than the last one seen, we are
+ * about to start checking this database. Note that other slots may
+ * still be working on relations from prior databases.
+ */
+ latest_datname = rel->datinfo->datname;
+
+ progress_report(reltotal, relprogress, pagestotal, pageschecked,
+ latest_datname, false, false);
+
+ relprogress++;
+ pageschecked += rel->blocks_to_check;
+
+ /*
+ * Get a parallel slot for the next amcheck command, blocking if
+ * necessary until one is available, or until a previously issued slot
+ * command fails, indicating that we should abort checking the
+ * remaining objects.
+ */
+ free_slot = ParallelSlotsGetIdle(sa, rel->datinfo->datname);
+ if (!free_slot)
+ {
+ /*
+ * Something failed. We don't need to know what it was, because
+ * the handler should already have emitted the necessary error
+ * messages.
+ */
+ failed = true;
+ break;
+ }
+
+ if (opts.verbose)
+ PQsetErrorVerbosity(free_slot->connection, PQERRORS_VERBOSE);
+
+ /*
+ * Execute the appropriate amcheck command for this relation using our
+ * slot's database connection. We do not wait for the command to
+ * complete, nor do we perform any error checking, as that is done by
+ * the parallel slots and our handler callback functions.
+ */
+ if (rel->is_heap)
+ {
+ if (opts.verbose)
+ {
+ if (opts.show_progress && progress_since_last_stderr)
+ fprintf(stderr, "\n");
+ pg_log_info("checking heap table \"%s.%s.%s\"",
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ progress_since_last_stderr = false;
+ }
+ prepare_heap_command(&sql, rel, free_slot->connection);
+ rel->sql = pstrdup(sql.data); /* pg_free'd after command */
+ ParallelSlotSetHandler(free_slot, verify_heap_slot_handler, rel);
+ run_command(free_slot, rel->sql);
+ }
+ else
+ {
+ if (opts.verbose)
+ {
+ if (opts.show_progress && progress_since_last_stderr)
+ fprintf(stderr, "\n");
+
+ pg_log_info("checking btree index \"%s.%s.%s\"",
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ progress_since_last_stderr = false;
+ }
+ prepare_btree_command(&sql, rel, free_slot->connection);
+ rel->sql = pstrdup(sql.data); /* pg_free'd after command */
+ ParallelSlotSetHandler(free_slot, verify_btree_slot_handler, rel);
+ run_command(free_slot, rel->sql);
+ }
+ }
+ termPQExpBuffer(&sql);
+
+ if (!failed)
+ {
+
+ /*
+ * Wait for all slots to complete, or for one to indicate that an
+ * error occurred. Like above, we rely on the handler emitting the
+ * necessary error messages.
+ */
+ if (sa && !ParallelSlotsWaitCompletion(sa))
+ failed = true;
+
+ progress_report(reltotal, relprogress, pagestotal, pageschecked, NULL, true, true);
+ }
+
+ if (sa)
+ {
+ ParallelSlotsTerminate(sa);
+ FREE_AND_SET_NULL(sa);
+ }
+
+ if (failed)
+ exit(1);
+
+ if (!all_checks_pass)
+ exit(2);
+}
+
+/*
+ * prepare_heap_command
+ *
+ * Creates a SQL command for running amcheck checking on the given heap
+ * relation. The command is phrased as a SQL query, with column order and
+ * names matching the expectations of verify_heap_slot_handler, which will
+ * receive and handle each row returned from the verify_heapam() function.
+ *
+ * The constructed SQL command will silently skip temporary tables, as checking
+ * them would needlessly draw errors from the underlying amcheck function.
+ *
+ * sql: buffer into which the heap table checking command will be written
+ * rel: relation information for the heap table to be checked
+ * conn: the connection to be used, for string escaping purposes
+ */
+static void
+prepare_heap_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn)
+{
+ resetPQExpBuffer(sql);
+ appendPQExpBuffer(sql,
+ "SELECT v.blkno, v.offnum, v.attnum, v.msg "
+ "FROM pg_catalog.pg_class c, %s.verify_heapam("
+ "\nrelation := c.oid, on_error_stop := %s, check_toast := %s, skip := '%s'",
+ rel->datinfo->amcheck_schema,
+ opts.on_error_stop ? "true" : "false",
+ opts.reconcile_toast ? "true" : "false",
+ opts.skip);
+
+ if (opts.startblock >= 0)
+ appendPQExpBuffer(sql, ", startblock := " INT64_FORMAT, opts.startblock);
+ if (opts.endblock >= 0)
+ appendPQExpBuffer(sql, ", endblock := " INT64_FORMAT, opts.endblock);
+
+ appendPQExpBuffer(sql,
+ "\n) v WHERE c.oid = %u "
+ "AND c.relpersistence != 't'",
+ rel->reloid);
+}
+
+/*
+ * prepare_btree_command
+ *
+ * Creates a SQL command for running amcheck checking on the given btree index
+ * relation. The command does not select any columns, as btree checking
+ * functions do not return any, but rather return corruption information by
+ * raising errors, which verify_btree_slot_handler expects.
+ *
+ * The constructed SQL command will silently skip temporary indexes, and
+ * indexes being reindexed concurrently, as checking them would needlessly draw
+ * errors from the underlying amcheck functions.
+ *
+ * sql: buffer into which the heap table checking command will be written
+ * rel: relation information for the index to be checked
+ * conn: the connection to be used, for string escaping purposes
+ */
+static void
+prepare_btree_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn)
+{
+ resetPQExpBuffer(sql);
+
+ if (opts.parent_check)
+ appendPQExpBuffer(sql,
+ "SELECT %s.bt_index_parent_check("
+ "index := c.oid, heapallindexed := %s, rootdescend := %s)"
+ "\nFROM pg_catalog.pg_class c, pg_catalog.pg_index i "
+ "WHERE c.oid = %u "
+ "AND c.oid = i.indexrelid "
+ "AND c.relpersistence != 't' "
+ "AND i.indisready AND i.indisvalid AND i.indislive",
+ rel->datinfo->amcheck_schema,
+ (opts.heapallindexed ? "true" : "false"),
+ (opts.rootdescend ? "true" : "false"),
+ rel->reloid);
+ else
+ appendPQExpBuffer(sql,
+ "SELECT %s.bt_index_check("
+ "index := c.oid, heapallindexed := %s)"
+ "\nFROM pg_catalog.pg_class c, pg_catalog.pg_index i "
+ "WHERE c.oid = %u "
+ "AND c.oid = i.indexrelid "
+ "AND c.relpersistence != 't' "
+ "AND i.indisready AND i.indisvalid AND i.indislive",
+ rel->datinfo->amcheck_schema,
+ (opts.heapallindexed ? "true" : "false"),
+ rel->reloid);
+}
+
+/*
+ * run_command
+ *
+ * Sends a command to the server without waiting for the command to complete.
+ * Logs an error if the command cannot be sent, but otherwise any errors are
+ * expected to be handled by a ParallelSlotHandler.
+ *
+ * If reconnecting to the database is necessary, the cparams argument may be
+ * modified.
+ *
+ * slot: slot with connection to the server we should use for the command
+ * sql: query to send
+ */
+static void
+run_command(ParallelSlot *slot, const char *sql)
+{
+ if (opts.echo)
+ printf("%s\n", sql);
+
+ if (PQsendQuery(slot->connection, sql) == 0)
+ {
+ pg_log_error("error sending command to database \"%s\": %s",
+ PQdb(slot->connection),
+ PQerrorMessage(slot->connection));
+ pg_log_error_detail("Command was: %s", sql);
+ exit(1);
+ }
+}
+
+/*
+ * should_processing_continue
+ *
+ * Checks a query result returned from a query (presumably issued on a slot's
+ * connection) to determine if parallel slots should continue issuing further
+ * commands.
+ *
+ * Note: Heap relation corruption is reported by verify_heapam() via the result
+ * set, rather than an ERROR, but running verify_heapam() on a corrupted heap
+ * table may still result in an error being returned from the server due to
+ * missing relation files, bad checksums, etc. The btree corruption checking
+ * functions always use errors to communicate corruption messages. We can't
+ * just abort processing because we got a mere ERROR.
+ *
+ * res: result from an executed sql query
+ */
+static bool
+should_processing_continue(PGresult *res)
+{
+ const char *severity;
+
+ switch (PQresultStatus(res))
+ {
+ /* These are expected and ok */
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ case PGRES_NONFATAL_ERROR:
+ break;
+
+ /* This is expected but requires closer scrutiny */
+ case PGRES_FATAL_ERROR:
+ severity = PQresultErrorField(res, PG_DIAG_SEVERITY_NONLOCALIZED);
+ if (severity == NULL)
+ return false; /* libpq failure, probably lost connection */
+ if (strcmp(severity, "FATAL") == 0)
+ return false;
+ if (strcmp(severity, "PANIC") == 0)
+ return false;
+ break;
+
+ /* These are unexpected */
+ case PGRES_BAD_RESPONSE:
+ case PGRES_EMPTY_QUERY:
+ case PGRES_COPY_OUT:
+ case PGRES_COPY_IN:
+ case PGRES_COPY_BOTH:
+ case PGRES_SINGLE_TUPLE:
+ case PGRES_PIPELINE_SYNC:
+ case PGRES_PIPELINE_ABORTED:
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Returns a copy of the argument string with all lines indented four spaces.
+ *
+ * The caller should pg_free the result when finished with it.
+ */
+static char *
+indent_lines(const char *str)
+{
+ PQExpBufferData buf;
+ const char *c;
+ char *result;
+
+ initPQExpBuffer(&buf);
+ appendPQExpBufferStr(&buf, " ");
+ for (c = str; *c; c++)
+ {
+ appendPQExpBufferChar(&buf, *c);
+ if (c[0] == '\n' && c[1] != '\0')
+ appendPQExpBufferStr(&buf, " ");
+ }
+ result = pstrdup(buf.data);
+ termPQExpBuffer(&buf);
+
+ return result;
+}
+
+/*
+ * verify_heap_slot_handler
+ *
+ * ParallelSlotHandler that receives results from a heap table checking command
+ * created by prepare_heap_command and outputs the results for the user.
+ *
+ * res: result from an executed sql query
+ * conn: connection on which the sql query was executed
+ * context: the sql query being handled, as a cstring
+ */
+static bool
+verify_heap_slot_handler(PGresult *res, PGconn *conn, void *context)
+{
+ RelationInfo *rel = (RelationInfo *) context;
+
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ int i;
+ int ntups = PQntuples(res);
+
+ if (ntups > 0)
+ all_checks_pass = false;
+
+ for (i = 0; i < ntups; i++)
+ {
+ const char *msg;
+
+ /* The message string should never be null, but check */
+ if (PQgetisnull(res, i, 3))
+ msg = "NO MESSAGE";
+ else
+ msg = PQgetvalue(res, i, 3);
+
+ if (!PQgetisnull(res, i, 2))
+ printf(_("heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname,
+ PQgetvalue(res, i, 0), /* blkno */
+ PQgetvalue(res, i, 1), /* offnum */
+ PQgetvalue(res, i, 2)); /* attnum */
+
+ else if (!PQgetisnull(res, i, 1))
+ printf(_("heap table \"%s.%s.%s\", block %s, offset %s:\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname,
+ PQgetvalue(res, i, 0), /* blkno */
+ PQgetvalue(res, i, 1)); /* offnum */
+
+ else if (!PQgetisnull(res, i, 0))
+ printf(_("heap table \"%s.%s.%s\", block %s:\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname,
+ PQgetvalue(res, i, 0)); /* blkno */
+
+ else
+ printf(_("heap table \"%s.%s.%s\":\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname);
+
+ printf(" %s\n", msg);
+ }
+ }
+ else if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ char *msg = indent_lines(PQerrorMessage(conn));
+
+ all_checks_pass = false;
+ printf(_("heap table \"%s.%s.%s\":\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ printf("%s", msg);
+ if (opts.verbose)
+ printf(_("query was: %s\n"), rel->sql);
+ FREE_AND_SET_NULL(msg);
+ }
+
+ FREE_AND_SET_NULL(rel->sql);
+ FREE_AND_SET_NULL(rel->nspname);
+ FREE_AND_SET_NULL(rel->relname);
+
+ return should_processing_continue(res);
+}
+
+/*
+ * verify_btree_slot_handler
+ *
+ * ParallelSlotHandler that receives results from a btree checking command
+ * created by prepare_btree_command and outputs them for the user. The results
+ * from the btree checking command is assumed to be empty, but when the results
+ * are an error code, the useful information about the corruption is expected
+ * in the connection's error message.
+ *
+ * res: result from an executed sql query
+ * conn: connection on which the sql query was executed
+ * context: unused
+ */
+static bool
+verify_btree_slot_handler(PGresult *res, PGconn *conn, void *context)
+{
+ RelationInfo *rel = (RelationInfo *) context;
+
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ int ntups = PQntuples(res);
+
+ if (ntups > 1)
+ {
+ /*
+ * We expect the btree checking functions to return one void row
+ * each, or zero rows if the check was skipped due to the object
+ * being in the wrong state to be checked, so we should output
+ * some sort of warning if we get anything more, not because it
+ * indicates corruption, but because it suggests a mismatch
+ * between amcheck and pg_amcheck versions.
+ *
+ * In conjunction with --progress, anything written to stderr at
+ * this time would present strangely to the user without an extra
+ * newline, so we print one. If we were multithreaded, we'd have
+ * to avoid splitting this across multiple calls, but we're in an
+ * event loop, so it doesn't matter.
+ */
+ if (opts.show_progress && progress_since_last_stderr)
+ fprintf(stderr, "\n");
+ pg_log_warning("btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d",
+ rel->datinfo->datname, rel->nspname, rel->relname, ntups);
+ if (opts.verbose)
+ pg_log_warning_detail("Query was: %s", rel->sql);
+ pg_log_warning_hint("Are %s's and amcheck's versions compatible?",
+ progname);
+ progress_since_last_stderr = false;
+ }
+ }
+ else
+ {
+ char *msg = indent_lines(PQerrorMessage(conn));
+
+ all_checks_pass = false;
+ printf(_("btree index \"%s.%s.%s\":\n"),
+ rel->datinfo->datname, rel->nspname, rel->relname);
+ printf("%s", msg);
+ if (opts.verbose)
+ printf(_("query was: %s\n"), rel->sql);
+ FREE_AND_SET_NULL(msg);
+ }
+
+ FREE_AND_SET_NULL(rel->sql);
+ FREE_AND_SET_NULL(rel->nspname);
+ FREE_AND_SET_NULL(rel->relname);
+
+ return should_processing_continue(res);
+}
+
+/*
+ * help
+ *
+ * Prints help page for the program
+ *
+ * progname: the name of the executed program, such as "pg_amcheck"
+ */
+static void
+help(const char *progname)
+{
+ printf(_("%s checks objects in a PostgreSQL database for corruption.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nTarget options:\n"));
+ printf(_(" -a, --all check all databases\n"));
+ printf(_(" -d, --database=PATTERN check matching database(s)\n"));
+ printf(_(" -D, --exclude-database=PATTERN do NOT check matching database(s)\n"));
+ printf(_(" -i, --index=PATTERN check matching index(es)\n"));
+ printf(_(" -I, --exclude-index=PATTERN do NOT check matching index(es)\n"));
+ printf(_(" -r, --relation=PATTERN check matching relation(s)\n"));
+ printf(_(" -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"));
+ printf(_(" -s, --schema=PATTERN check matching schema(s)\n"));
+ printf(_(" -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"));
+ printf(_(" -t, --table=PATTERN check matching table(s)\n"));
+ printf(_(" -T, --exclude-table=PATTERN do NOT check matching table(s)\n"));
+ printf(_(" --no-dependent-indexes do NOT expand list of relations to include indexes\n"));
+ printf(_(" --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"));
+ printf(_(" --no-strict-names do NOT require patterns to match objects\n"));
+ printf(_("\nTable checking options:\n"));
+ printf(_(" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"));
+ printf(_(" --on-error-stop stop checking at end of first corrupt page\n"));
+ printf(_(" --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"));
+ printf(_(" --startblock=BLOCK begin checking table(s) at the given block number\n"));
+ printf(_(" --endblock=BLOCK check table(s) only up to the given block number\n"));
+ printf(_("\nB-tree index checking options:\n"));
+ printf(_(" --heapallindexed check that all heap tuples are found within indexes\n"));
+ printf(_(" --parent-check check index parent/child relationships\n"));
+ printf(_(" --rootdescend search from root page to refind tuples\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nOther options:\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -j, --jobs=NUM use this many concurrent connections to the server\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --install-missing install missing extensions\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Print a progress report based on the global variables.
+ *
+ * Progress report is written at maximum once per second, unless the force
+ * parameter is set to true.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+static void
+progress_report(uint64 relations_total, uint64 relations_checked,
+ uint64 relpages_total, uint64 relpages_checked,
+ const char *datname, bool force, bool finished)
+{
+ int percent_rel = 0;
+ int percent_pages = 0;
+ char checked_rel[32];
+ char total_rel[32];
+ char checked_pages[32];
+ char total_pages[32];
+ pg_time_t now;
+
+ if (!opts.show_progress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !force && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ if (relations_total)
+ percent_rel = (int) (relations_checked * 100 / relations_total);
+ if (relpages_total)
+ percent_pages = (int) (relpages_checked * 100 / relpages_total);
+
+ snprintf(checked_rel, sizeof(checked_rel), UINT64_FORMAT, relations_checked);
+ snprintf(total_rel, sizeof(total_rel), UINT64_FORMAT, relations_total);
+ snprintf(checked_pages, sizeof(checked_pages), UINT64_FORMAT, relpages_checked);
+ snprintf(total_pages, sizeof(total_pages), UINT64_FORMAT, relpages_total);
+
+#define VERBOSE_DATNAME_LENGTH 35
+ if (opts.verbose)
+ {
+ if (!datname)
+
+ /*
+ * No datname given, so clear the status line (used for first and
+ * last call)
+ */
+ fprintf(stderr,
+ _("%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"),
+ (int) strlen(total_rel),
+ checked_rel, total_rel, percent_rel,
+ (int) strlen(total_pages),
+ checked_pages, total_pages, percent_pages,
+ VERBOSE_DATNAME_LENGTH + 2, "");
+ else
+ {
+ bool truncate = (strlen(datname) > VERBOSE_DATNAME_LENGTH);
+
+ fprintf(stderr,
+ _("%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"),
+ (int) strlen(total_rel),
+ checked_rel, total_rel, percent_rel,
+ (int) strlen(total_pages),
+ checked_pages, total_pages, percent_pages,
+ /* Prefix with "..." if we do leading truncation */
+ truncate ? "..." : "",
+ truncate ? VERBOSE_DATNAME_LENGTH - 3 : VERBOSE_DATNAME_LENGTH,
+ truncate ? VERBOSE_DATNAME_LENGTH - 3 : VERBOSE_DATNAME_LENGTH,
+ /* Truncate datname at beginning if it's too long */
+ truncate ? datname + strlen(datname) - VERBOSE_DATNAME_LENGTH + 3 : datname);
+ }
+ }
+ else
+ fprintf(stderr,
+ _("%*s/%s relations (%d%%), %*s/%s pages (%d%%)"),
+ (int) strlen(total_rel),
+ checked_rel, total_rel, percent_rel,
+ (int) strlen(total_pages),
+ checked_pages, total_pages, percent_pages);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ if (!finished && isatty(fileno(stderr)))
+ {
+ fputc('\r', stderr);
+ progress_since_last_stderr = true;
+ }
+ else
+ fputc('\n', stderr);
+}
+
+/*
+ * Extend the pattern info array to hold one additional initialized pattern
+ * info entry.
+ *
+ * Returns a pointer to the new entry.
+ */
+static PatternInfo *
+extend_pattern_info_array(PatternInfoArray *pia)
+{
+ PatternInfo *result;
+
+ pia->len++;
+ pia->data = (PatternInfo *) pg_realloc(pia->data, pia->len * sizeof(PatternInfo));
+ result = &pia->data[pia->len - 1];
+ memset(result, 0, sizeof(*result));
+
+ return result;
+}
+
+/*
+ * append_database_pattern
+ *
+ * Adds the given pattern interpreted as a database name pattern.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the database name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_database_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ PQExpBufferData buf;
+ int dotcnt;
+ PatternInfo *info = extend_pattern_info_array(pia);
+
+ initPQExpBuffer(&buf);
+ patternToSQLRegex(encoding, NULL, NULL, &buf, pattern, false, false,
+ &dotcnt);
+ if (dotcnt > 0)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s", pattern);
+ exit(2);
+ }
+ info->pattern = pattern;
+ info->db_regex = pstrdup(buf.data);
+
+ termPQExpBuffer(&buf);
+}
+
+/*
+ * append_schema_pattern
+ *
+ * Adds the given pattern interpreted as a schema name pattern.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the schema name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_schema_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ PQExpBufferData dbbuf;
+ PQExpBufferData nspbuf;
+ int dotcnt;
+ PatternInfo *info = extend_pattern_info_array(pia);
+
+ initPQExpBuffer(&dbbuf);
+ initPQExpBuffer(&nspbuf);
+
+ patternToSQLRegex(encoding, NULL, &dbbuf, &nspbuf, pattern, false, false,
+ &dotcnt);
+ if (dotcnt > 1)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s", pattern);
+ exit(2);
+ }
+ info->pattern = pattern;
+ if (dbbuf.data[0])
+ {
+ opts.dbpattern = true;
+ info->db_regex = pstrdup(dbbuf.data);
+ }
+ if (nspbuf.data[0])
+ info->nsp_regex = pstrdup(nspbuf.data);
+
+ termPQExpBuffer(&dbbuf);
+ termPQExpBuffer(&nspbuf);
+}
+
+/*
+ * append_relation_pattern_helper
+ *
+ * Adds to a list the given pattern interpreted as a relation pattern.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ * heap_only: whether the pattern should only be matched against heap tables
+ * btree_only: whether the pattern should only be matched against btree indexes
+ */
+static void
+append_relation_pattern_helper(PatternInfoArray *pia, const char *pattern,
+ int encoding, bool heap_only, bool btree_only)
+{
+ PQExpBufferData dbbuf;
+ PQExpBufferData nspbuf;
+ PQExpBufferData relbuf;
+ int dotcnt;
+ PatternInfo *info = extend_pattern_info_array(pia);
+
+ initPQExpBuffer(&dbbuf);
+ initPQExpBuffer(&nspbuf);
+ initPQExpBuffer(&relbuf);
+
+ patternToSQLRegex(encoding, &dbbuf, &nspbuf, &relbuf, pattern, false,
+ false, &dotcnt);
+ if (dotcnt > 2)
+ {
+ pg_log_error("improper relation name (too many dotted names): %s", pattern);
+ exit(2);
+ }
+ info->pattern = pattern;
+ if (dbbuf.data[0])
+ {
+ opts.dbpattern = true;
+ info->db_regex = pstrdup(dbbuf.data);
+ }
+ if (nspbuf.data[0])
+ info->nsp_regex = pstrdup(nspbuf.data);
+ if (relbuf.data[0])
+ info->rel_regex = pstrdup(relbuf.data);
+
+ termPQExpBuffer(&dbbuf);
+ termPQExpBuffer(&nspbuf);
+ termPQExpBuffer(&relbuf);
+
+ info->heap_only = heap_only;
+ info->btree_only = btree_only;
+}
+
+/*
+ * append_relation_pattern
+ *
+ * Adds the given pattern interpreted as a relation pattern, to be matched
+ * against both heap tables and btree indexes.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_relation_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ append_relation_pattern_helper(pia, pattern, encoding, false, false);
+}
+
+/*
+ * append_heap_pattern
+ *
+ * Adds the given pattern interpreted as a relation pattern, to be matched only
+ * against heap tables.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_heap_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ append_relation_pattern_helper(pia, pattern, encoding, true, false);
+}
+
+/*
+ * append_btree_pattern
+ *
+ * Adds the given pattern interpreted as a relation pattern, to be matched only
+ * against btree indexes.
+ *
+ * pia: the pattern info array to be appended
+ * pattern: the relation name pattern
+ * encoding: client encoding for parsing the pattern
+ */
+static void
+append_btree_pattern(PatternInfoArray *pia, const char *pattern, int encoding)
+{
+ append_relation_pattern_helper(pia, pattern, encoding, false, true);
+}
+
+/*
+ * append_db_pattern_cte
+ *
+ * Appends to the buffer the body of a Common Table Expression (CTE) containing
+ * the database portions filtered from the list of patterns expressed as two
+ * columns:
+ *
+ * pattern_id: the index of this pattern in pia->data[]
+ * rgx: the database regular expression parsed from the pattern
+ *
+ * Patterns without a database portion are skipped. Patterns with more than
+ * just a database portion are optionally skipped, depending on argument
+ * 'inclusive'.
+ *
+ * buf: the buffer to be appended
+ * pia: the array of patterns to be inserted into the CTE
+ * conn: the database connection
+ * inclusive: whether to include patterns with schema and/or relation parts
+ *
+ * Returns whether any database patterns were appended.
+ */
+static bool
+append_db_pattern_cte(PQExpBuffer buf, const PatternInfoArray *pia,
+ PGconn *conn, bool inclusive)
+{
+ int pattern_id;
+ const char *comma;
+ bool have_values;
+
+ comma = "";
+ have_values = false;
+ for (pattern_id = 0; pattern_id < pia->len; pattern_id++)
+ {
+ PatternInfo *info = &pia->data[pattern_id];
+
+ if (info->db_regex != NULL &&
+ (inclusive || (info->nsp_regex == NULL && info->rel_regex == NULL)))
+ {
+ if (!have_values)
+ appendPQExpBufferStr(buf, "\nVALUES");
+ have_values = true;
+ appendPQExpBuffer(buf, "%s\n(%d, ", comma, pattern_id);
+ appendStringLiteralConn(buf, info->db_regex, conn);
+ appendPQExpBufferChar(buf, ')');
+ comma = ",";
+ }
+ }
+
+ if (!have_values)
+ appendPQExpBufferStr(buf, "\nSELECT NULL, NULL, NULL WHERE false");
+
+ return have_values;
+}
+
+/*
+ * compile_database_list
+ *
+ * If any database patterns exist, or if --all was given, compiles a distinct
+ * list of databases to check using a SQL query based on the patterns plus the
+ * literal initial database name, if given. If no database patterns exist and
+ * --all was not given, the query is not necessary, and only the initial
+ * database name (if any) is added to the list.
+ *
+ * conn: connection to the initial database
+ * databases: the list onto which databases should be appended
+ * initial_dbname: an optional extra database name to include in the list
+ */
+static void
+compile_database_list(PGconn *conn, SimplePtrList *databases,
+ const char *initial_dbname)
+{
+ PGresult *res;
+ PQExpBufferData sql;
+ int ntups;
+ int i;
+ bool fatal;
+
+ if (initial_dbname)
+ {
+ DatabaseInfo *dat = (DatabaseInfo *) pg_malloc0(sizeof(DatabaseInfo));
+
+ /* This database is included. Add to list */
+ if (opts.verbose)
+ pg_log_info("including database \"%s\"", initial_dbname);
+
+ dat->datname = pstrdup(initial_dbname);
+ simple_ptr_list_append(databases, dat);
+ }
+
+ initPQExpBuffer(&sql);
+
+ /* Append the include patterns CTE. */
+ appendPQExpBufferStr(&sql, "WITH include_raw (pattern_id, rgx) AS (");
+ if (!append_db_pattern_cte(&sql, &opts.include, conn, true) &&
+ !opts.alldb)
+ {
+ /*
+ * None of the inclusion patterns (if any) contain database portions,
+ * so there is no need to query the database to resolve database
+ * patterns.
+ *
+ * Since we're also not operating under --all, we don't need to query
+ * the exhaustive list of connectable databases, either.
+ */
+ termPQExpBuffer(&sql);
+ return;
+ }
+
+ /* Append the exclude patterns CTE. */
+ appendPQExpBufferStr(&sql, "),\nexclude_raw (pattern_id, rgx) AS (");
+ append_db_pattern_cte(&sql, &opts.exclude, conn, false);
+ appendPQExpBufferStr(&sql, "),");
+
+ /*
+ * Append the database CTE, which includes whether each database is
+ * connectable and also joins against exclude_raw to determine whether
+ * each database is excluded.
+ */
+ appendPQExpBufferStr(&sql,
+ "\ndatabase (datname) AS ("
+ "\nSELECT d.datname "
+ "FROM pg_catalog.pg_database d "
+ "LEFT OUTER JOIN exclude_raw e "
+ "ON d.datname ~ e.rgx "
+ "\nWHERE d.datallowconn AND datconnlimit != -2 "
+ "AND e.pattern_id IS NULL"
+ "),"
+
+ /*
+ * Append the include_pat CTE, which joins the include_raw CTE against the
+ * databases CTE to determine if all the inclusion patterns had matches,
+ * and whether each matched pattern had the misfortune of only matching
+ * excluded or unconnectable databases.
+ */
+ "\ninclude_pat (pattern_id, checkable) AS ("
+ "\nSELECT i.pattern_id, "
+ "COUNT(*) FILTER ("
+ "WHERE d IS NOT NULL"
+ ") AS checkable"
+ "\nFROM include_raw i "
+ "LEFT OUTER JOIN database d "
+ "ON d.datname ~ i.rgx"
+ "\nGROUP BY i.pattern_id"
+ "),"
+
+ /*
+ * Append the filtered_databases CTE, which selects from the database CTE
+ * optionally joined against the include_raw CTE to only select databases
+ * that match an inclusion pattern. This appears to duplicate what the
+ * include_pat CTE already did above, but here we want only databases, and
+ * there we wanted patterns.
+ */
+ "\nfiltered_databases (datname) AS ("
+ "\nSELECT DISTINCT d.datname "
+ "FROM database d");
+ if (!opts.alldb)
+ appendPQExpBufferStr(&sql,
+ " INNER JOIN include_raw i "
+ "ON d.datname ~ i.rgx");
+ appendPQExpBufferStr(&sql,
+ ")"
+
+ /*
+ * Select the checkable databases and the unmatched inclusion patterns.
+ */
+ "\nSELECT pattern_id, datname FROM ("
+ "\nSELECT pattern_id, NULL::TEXT AS datname "
+ "FROM include_pat "
+ "WHERE checkable = 0 "
+ "UNION ALL"
+ "\nSELECT NULL, datname "
+ "FROM filtered_databases"
+ ") AS combined_records"
+ "\nORDER BY pattern_id NULLS LAST, datname");
+
+ res = executeQuery(conn, sql.data, opts.echo);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", sql.data);
+ disconnectDatabase(conn);
+ exit(1);
+ }
+ termPQExpBuffer(&sql);
+
+ ntups = PQntuples(res);
+ for (fatal = false, i = 0; i < ntups; i++)
+ {
+ int pattern_id = -1;
+ const char *datname = NULL;
+
+ if (!PQgetisnull(res, i, 0))
+ pattern_id = atoi(PQgetvalue(res, i, 0));
+ if (!PQgetisnull(res, i, 1))
+ datname = PQgetvalue(res, i, 1);
+
+ if (pattern_id >= 0)
+ {
+ /*
+ * Current record pertains to an inclusion pattern that matched no
+ * checkable databases.
+ */
+ fatal = opts.strict_names;
+ if (pattern_id >= opts.include.len)
+ pg_fatal("internal error: received unexpected database pattern_id %d",
+ pattern_id);
+ log_no_match("no connectable databases to check matching \"%s\"",
+ opts.include.data[pattern_id].pattern);
+ }
+ else
+ {
+ DatabaseInfo *dat;
+
+ /* Current record pertains to a database */
+ Assert(datname != NULL);
+
+ /* Avoid entering a duplicate entry matching the initial_dbname */
+ if (initial_dbname != NULL && strcmp(initial_dbname, datname) == 0)
+ continue;
+
+ /* This database is included. Add to list */
+ if (opts.verbose)
+ pg_log_info("including database \"%s\"", datname);
+
+ dat = (DatabaseInfo *) pg_malloc0(sizeof(DatabaseInfo));
+ dat->datname = pstrdup(datname);
+ simple_ptr_list_append(databases, dat);
+ }
+ }
+ PQclear(res);
+
+ if (fatal)
+ {
+ if (conn != NULL)
+ disconnectDatabase(conn);
+ exit(1);
+ }
+}
+
+/*
+ * append_rel_pattern_raw_cte
+ *
+ * Appends to the buffer the body of a Common Table Expression (CTE) containing
+ * the given patterns as six columns:
+ *
+ * pattern_id: the index of this pattern in pia->data[]
+ * db_regex: the database regexp parsed from the pattern, or NULL if the
+ * pattern had no database part
+ * nsp_regex: the namespace regexp parsed from the pattern, or NULL if the
+ * pattern had no namespace part
+ * rel_regex: the relname regexp parsed from the pattern, or NULL if the
+ * pattern had no relname part
+ * heap_only: true if the pattern applies only to heap tables (not indexes)
+ * btree_only: true if the pattern applies only to btree indexes (not tables)
+ *
+ * buf: the buffer to be appended
+ * patterns: the array of patterns to be inserted into the CTE
+ * conn: the database connection
+ */
+static void
+append_rel_pattern_raw_cte(PQExpBuffer buf, const PatternInfoArray *pia,
+ PGconn *conn)
+{
+ int pattern_id;
+ const char *comma;
+ bool have_values;
+
+ comma = "";
+ have_values = false;
+ for (pattern_id = 0; pattern_id < pia->len; pattern_id++)
+ {
+ PatternInfo *info = &pia->data[pattern_id];
+
+ if (!have_values)
+ appendPQExpBufferStr(buf, "\nVALUES");
+ have_values = true;
+ appendPQExpBuffer(buf, "%s\n(%d::INTEGER, ", comma, pattern_id);
+ if (info->db_regex == NULL)
+ appendPQExpBufferStr(buf, "NULL");
+ else
+ appendStringLiteralConn(buf, info->db_regex, conn);
+ appendPQExpBufferStr(buf, "::TEXT, ");
+ if (info->nsp_regex == NULL)
+ appendPQExpBufferStr(buf, "NULL");
+ else
+ appendStringLiteralConn(buf, info->nsp_regex, conn);
+ appendPQExpBufferStr(buf, "::TEXT, ");
+ if (info->rel_regex == NULL)
+ appendPQExpBufferStr(buf, "NULL");
+ else
+ appendStringLiteralConn(buf, info->rel_regex, conn);
+ if (info->heap_only)
+ appendPQExpBufferStr(buf, "::TEXT, true::BOOLEAN");
+ else
+ appendPQExpBufferStr(buf, "::TEXT, false::BOOLEAN");
+ if (info->btree_only)
+ appendPQExpBufferStr(buf, ", true::BOOLEAN");
+ else
+ appendPQExpBufferStr(buf, ", false::BOOLEAN");
+ appendPQExpBufferChar(buf, ')');
+ comma = ",";
+ }
+
+ if (!have_values)
+ appendPQExpBufferStr(buf,
+ "\nSELECT NULL::INTEGER, NULL::TEXT, NULL::TEXT, "
+ "NULL::TEXT, NULL::BOOLEAN, NULL::BOOLEAN "
+ "WHERE false");
+}
+
+/*
+ * append_rel_pattern_filtered_cte
+ *
+ * Appends to the buffer a Common Table Expression (CTE) which selects
+ * all patterns from the named raw CTE, filtered by database. All patterns
+ * which have no database portion or whose database portion matches our
+ * connection's database name are selected, with other patterns excluded.
+ *
+ * The basic idea here is that if we're connected to database "foo" and we have
+ * patterns "foo.bar.baz", "alpha.beta" and "one.two.three", we only want to
+ * use the first two while processing relations in this database, as the third
+ * one is not relevant.
+ *
+ * buf: the buffer to be appended
+ * raw: the name of the CTE to select from
+ * filtered: the name of the CTE to create
+ * conn: the database connection
+ */
+static void
+append_rel_pattern_filtered_cte(PQExpBuffer buf, const char *raw,
+ const char *filtered, PGconn *conn)
+{
+ appendPQExpBuffer(buf,
+ "\n%s (pattern_id, nsp_regex, rel_regex, heap_only, btree_only) AS ("
+ "\nSELECT pattern_id, nsp_regex, rel_regex, heap_only, btree_only "
+ "FROM %s r"
+ "\nWHERE (r.db_regex IS NULL "
+ "OR ",
+ filtered, raw);
+ appendStringLiteralConn(buf, PQdb(conn), conn);
+ appendPQExpBufferStr(buf, " ~ r.db_regex)");
+ appendPQExpBufferStr(buf,
+ " AND (r.nsp_regex IS NOT NULL"
+ " OR r.rel_regex IS NOT NULL)"
+ "),");
+}
+
+/*
+ * compile_relation_list_one_db
+ *
+ * Compiles a list of relations to check within the currently connected
+ * database based on the user supplied options, sorted by descending size,
+ * and appends them to the given list of relations.
+ *
+ * The cells of the constructed list contain all information about the relation
+ * necessary to connect to the database and check the object, including which
+ * database to connect to, where contrib/amcheck is installed, and the Oid and
+ * type of object (heap table vs. btree index). Rather than duplicating the
+ * database details per relation, the relation structs use references to the
+ * same database object, provided by the caller.
+ *
+ * conn: connection to this next database, which should be the same as in 'dat'
+ * relations: list onto which the relations information should be appended
+ * dat: the database info struct for use by each relation
+ * pagecount: gets incremented by the number of blocks to check in all
+ * relations added
+ */
+static void
+compile_relation_list_one_db(PGconn *conn, SimplePtrList *relations,
+ const DatabaseInfo *dat,
+ uint64 *pagecount)
+{
+ PGresult *res;
+ PQExpBufferData sql;
+ int ntups;
+ int i;
+
+ initPQExpBuffer(&sql);
+ appendPQExpBufferStr(&sql, "WITH");
+
+ /* Append CTEs for the relation inclusion patterns, if any */
+ if (!opts.allrel)
+ {
+ appendPQExpBufferStr(&sql,
+ " include_raw (pattern_id, db_regex, nsp_regex, rel_regex, heap_only, btree_only) AS (");
+ append_rel_pattern_raw_cte(&sql, &opts.include, conn);
+ appendPQExpBufferStr(&sql, "\n),");
+ append_rel_pattern_filtered_cte(&sql, "include_raw", "include_pat", conn);
+ }
+
+ /* Append CTEs for the relation exclusion patterns, if any */
+ if (opts.excludetbl || opts.excludeidx || opts.excludensp)
+ {
+ appendPQExpBufferStr(&sql,
+ " exclude_raw (pattern_id, db_regex, nsp_regex, rel_regex, heap_only, btree_only) AS (");
+ append_rel_pattern_raw_cte(&sql, &opts.exclude, conn);
+ appendPQExpBufferStr(&sql, "\n),");
+ append_rel_pattern_filtered_cte(&sql, "exclude_raw", "exclude_pat", conn);
+ }
+
+ /* Append the relation CTE. */
+ appendPQExpBufferStr(&sql,
+ " relation (pattern_id, oid, nspname, relname, reltoastrelid, relpages, is_heap, is_btree) AS ("
+ "\nSELECT DISTINCT ON (c.oid");
+ if (!opts.allrel)
+ appendPQExpBufferStr(&sql, ", ip.pattern_id) ip.pattern_id,");
+ else
+ appendPQExpBufferStr(&sql, ") NULL::INTEGER AS pattern_id,");
+ appendPQExpBuffer(&sql,
+ "\nc.oid, n.nspname, c.relname, c.reltoastrelid, c.relpages, "
+ "c.relam = %u AS is_heap, "
+ "c.relam = %u AS is_btree"
+ "\nFROM pg_catalog.pg_class c "
+ "INNER JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+ if (!opts.allrel)
+ appendPQExpBuffer(&sql,
+ "\nINNER JOIN include_pat ip"
+ "\nON (n.nspname ~ ip.nsp_regex OR ip.nsp_regex IS NULL)"
+ "\nAND (c.relname ~ ip.rel_regex OR ip.rel_regex IS NULL)"
+ "\nAND (c.relam = %u OR NOT ip.heap_only)"
+ "\nAND (c.relam = %u OR NOT ip.btree_only)",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+ if (opts.excludetbl || opts.excludeidx || opts.excludensp)
+ appendPQExpBuffer(&sql,
+ "\nLEFT OUTER JOIN exclude_pat ep"
+ "\nON (n.nspname ~ ep.nsp_regex OR ep.nsp_regex IS NULL)"
+ "\nAND (c.relname ~ ep.rel_regex OR ep.rel_regex IS NULL)"
+ "\nAND (c.relam = %u OR NOT ep.heap_only OR ep.rel_regex IS NULL)"
+ "\nAND (c.relam = %u OR NOT ep.btree_only OR ep.rel_regex IS NULL)",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+
+ /*
+ * Exclude temporary tables and indexes, which must necessarily belong to
+ * other sessions. (We don't create any ourselves.) We must ultimately
+ * exclude indexes marked invalid or not ready, but we delay that decision
+ * until firing off the amcheck command, as the state of an index may
+ * change by then.
+ */
+ appendPQExpBufferStr(&sql, "\nWHERE c.relpersistence != 't'");
+ if (opts.excludetbl || opts.excludeidx || opts.excludensp)
+ appendPQExpBufferStr(&sql, "\nAND ep.pattern_id IS NULL");
+
+ /*
+ * We need to be careful not to break the --no-dependent-toast and
+ * --no-dependent-indexes options. By default, the btree indexes, toast
+ * tables, and toast table btree indexes associated with primary heap
+ * tables are included, using their own CTEs below. We implement the
+ * --exclude-* options by not creating those CTEs, but that's no use if
+ * we've already selected the toast and indexes here. On the other hand,
+ * we want inclusion patterns that match indexes or toast tables to be
+ * honored. So, if inclusion patterns were given, we want to select all
+ * tables, toast tables, or indexes that match the patterns. But if no
+ * inclusion patterns were given, and we're simply matching all relations,
+ * then we only want to match the primary tables here.
+ */
+ if (opts.allrel)
+ appendPQExpBuffer(&sql,
+ " AND c.relam = %u "
+ "AND c.relkind IN ('r', 'S', 'm', 't') "
+ "AND c.relnamespace != %u",
+ HEAP_TABLE_AM_OID, PG_TOAST_NAMESPACE);
+ else
+ appendPQExpBuffer(&sql,
+ " AND c.relam IN (%u, %u)"
+ "AND c.relkind IN ('r', 'S', 'm', 't', 'i') "
+ "AND ((c.relam = %u AND c.relkind IN ('r', 'S', 'm', 't')) OR "
+ "(c.relam = %u AND c.relkind = 'i'))",
+ HEAP_TABLE_AM_OID, BTREE_AM_OID,
+ HEAP_TABLE_AM_OID, BTREE_AM_OID);
+
+ appendPQExpBufferStr(&sql,
+ "\nORDER BY c.oid)");
+
+ if (!opts.no_toast_expansion)
+ {
+ /*
+ * Include a CTE for toast tables associated with primary heap tables
+ * selected above, filtering by exclusion patterns (if any) that match
+ * toast table names.
+ */
+ appendPQExpBufferStr(&sql,
+ ", toast (oid, nspname, relname, relpages) AS ("
+ "\nSELECT t.oid, 'pg_toast', t.relname, t.relpages"
+ "\nFROM pg_catalog.pg_class t "
+ "INNER JOIN relation r "
+ "ON r.reltoastrelid = t.oid");
+ if (opts.excludetbl || opts.excludensp)
+ appendPQExpBufferStr(&sql,
+ "\nLEFT OUTER JOIN exclude_pat ep"
+ "\nON ('pg_toast' ~ ep.nsp_regex OR ep.nsp_regex IS NULL)"
+ "\nAND (t.relname ~ ep.rel_regex OR ep.rel_regex IS NULL)"
+ "\nAND ep.heap_only"
+ "\nWHERE ep.pattern_id IS NULL"
+ "\nAND t.relpersistence != 't'");
+ appendPQExpBufferStr(&sql,
+ "\n)");
+ }
+ if (!opts.no_btree_expansion)
+ {
+ /*
+ * Include a CTE for btree indexes associated with primary heap tables
+ * selected above, filtering by exclusion patterns (if any) that match
+ * btree index names.
+ */
+ appendPQExpBufferStr(&sql,
+ ", index (oid, nspname, relname, relpages) AS ("
+ "\nSELECT c.oid, r.nspname, c.relname, c.relpages "
+ "FROM relation r"
+ "\nINNER JOIN pg_catalog.pg_index i "
+ "ON r.oid = i.indrelid "
+ "INNER JOIN pg_catalog.pg_class c "
+ "ON i.indexrelid = c.oid "
+ "AND c.relpersistence != 't'");
+ if (opts.excludeidx || opts.excludensp)
+ appendPQExpBufferStr(&sql,
+ "\nINNER JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid"
+ "\nLEFT OUTER JOIN exclude_pat ep "
+ "ON (n.nspname ~ ep.nsp_regex OR ep.nsp_regex IS NULL) "
+ "AND (c.relname ~ ep.rel_regex OR ep.rel_regex IS NULL) "
+ "AND ep.btree_only"
+ "\nWHERE ep.pattern_id IS NULL");
+ else
+ appendPQExpBufferStr(&sql,
+ "\nWHERE true");
+ appendPQExpBuffer(&sql,
+ " AND c.relam = %u "
+ "AND c.relkind = 'i'",
+ BTREE_AM_OID);
+ if (opts.no_toast_expansion)
+ appendPQExpBuffer(&sql,
+ " AND c.relnamespace != %u",
+ PG_TOAST_NAMESPACE);
+ appendPQExpBufferStr(&sql, "\n)");
+ }
+
+ if (!opts.no_toast_expansion && !opts.no_btree_expansion)
+ {
+ /*
+ * Include a CTE for btree indexes associated with toast tables of
+ * primary heap tables selected above, filtering by exclusion patterns
+ * (if any) that match the toast index names.
+ */
+ appendPQExpBufferStr(&sql,
+ ", toast_index (oid, nspname, relname, relpages) AS ("
+ "\nSELECT c.oid, 'pg_toast', c.relname, c.relpages "
+ "FROM toast t "
+ "INNER JOIN pg_catalog.pg_index i "
+ "ON t.oid = i.indrelid"
+ "\nINNER JOIN pg_catalog.pg_class c "
+ "ON i.indexrelid = c.oid "
+ "AND c.relpersistence != 't'");
+ if (opts.excludeidx)
+ appendPQExpBufferStr(&sql,
+ "\nLEFT OUTER JOIN exclude_pat ep "
+ "ON ('pg_toast' ~ ep.nsp_regex OR ep.nsp_regex IS NULL) "
+ "AND (c.relname ~ ep.rel_regex OR ep.rel_regex IS NULL) "
+ "AND ep.btree_only "
+ "WHERE ep.pattern_id IS NULL");
+ else
+ appendPQExpBufferStr(&sql,
+ "\nWHERE true");
+ appendPQExpBuffer(&sql,
+ " AND c.relam = %u"
+ " AND c.relkind = 'i')",
+ BTREE_AM_OID);
+ }
+
+ /*
+ * Roll-up distinct rows from CTEs.
+ *
+ * Relations that match more than one pattern may occur more than once in
+ * the list, and indexes and toast for primary relations may also have
+ * matched in their own right, so we rely on UNION to deduplicate the
+ * list.
+ */
+ appendPQExpBufferStr(&sql,
+ "\nSELECT pattern_id, is_heap, is_btree, oid, nspname, relname, relpages "
+ "FROM (");
+ appendPQExpBufferStr(&sql,
+ /* Inclusion patterns that failed to match */
+ "\nSELECT pattern_id, is_heap, is_btree, "
+ "NULL::OID AS oid, "
+ "NULL::TEXT AS nspname, "
+ "NULL::TEXT AS relname, "
+ "NULL::INTEGER AS relpages"
+ "\nFROM relation "
+ "WHERE pattern_id IS NOT NULL "
+ "UNION"
+ /* Primary relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, "
+ "is_heap, is_btree, oid, nspname, relname, relpages "
+ "FROM relation");
+ if (!opts.no_toast_expansion)
+ appendPQExpBufferStr(&sql,
+ " UNION"
+ /* Toast tables for primary relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, TRUE AS is_heap, "
+ "FALSE AS is_btree, oid, nspname, relname, relpages "
+ "FROM toast");
+ if (!opts.no_btree_expansion)
+ appendPQExpBufferStr(&sql,
+ " UNION"
+ /* Indexes for primary relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, FALSE AS is_heap, "
+ "TRUE AS is_btree, oid, nspname, relname, relpages "
+ "FROM index");
+ if (!opts.no_toast_expansion && !opts.no_btree_expansion)
+ appendPQExpBufferStr(&sql,
+ " UNION"
+ /* Indexes for toast relations */
+ "\nSELECT NULL::INTEGER AS pattern_id, FALSE AS is_heap, "
+ "TRUE AS is_btree, oid, nspname, relname, relpages "
+ "FROM toast_index");
+ appendPQExpBufferStr(&sql,
+ "\n) AS combined_records "
+ "ORDER BY relpages DESC NULLS FIRST, oid");
+
+ res = executeQuery(conn, sql.data, opts.echo);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", sql.data);
+ disconnectDatabase(conn);
+ exit(1);
+ }
+ termPQExpBuffer(&sql);
+
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ int pattern_id = -1;
+ bool is_heap = false;
+ bool is_btree PG_USED_FOR_ASSERTS_ONLY = false;
+ Oid oid = InvalidOid;
+ const char *nspname = NULL;
+ const char *relname = NULL;
+ int relpages = 0;
+
+ if (!PQgetisnull(res, i, 0))
+ pattern_id = atoi(PQgetvalue(res, i, 0));
+ if (!PQgetisnull(res, i, 1))
+ is_heap = (PQgetvalue(res, i, 1)[0] == 't');
+ if (!PQgetisnull(res, i, 2))
+ is_btree = (PQgetvalue(res, i, 2)[0] == 't');
+ if (!PQgetisnull(res, i, 3))
+ oid = atooid(PQgetvalue(res, i, 3));
+ if (!PQgetisnull(res, i, 4))
+ nspname = PQgetvalue(res, i, 4);
+ if (!PQgetisnull(res, i, 5))
+ relname = PQgetvalue(res, i, 5);
+ if (!PQgetisnull(res, i, 6))
+ relpages = atoi(PQgetvalue(res, i, 6));
+
+ if (pattern_id >= 0)
+ {
+ /*
+ * Current record pertains to an inclusion pattern. Record that
+ * it matched.
+ */
+
+ if (pattern_id >= opts.include.len)
+ pg_fatal("internal error: received unexpected relation pattern_id %d",
+ pattern_id);
+
+ opts.include.data[pattern_id].matched = true;
+ }
+ else
+ {
+ /* Current record pertains to a relation */
+
+ RelationInfo *rel = (RelationInfo *) pg_malloc0(sizeof(RelationInfo));
+
+ Assert(OidIsValid(oid));
+ Assert((is_heap && !is_btree) || (is_btree && !is_heap));
+
+ rel->datinfo = dat;
+ rel->reloid = oid;
+ rel->is_heap = is_heap;
+ rel->nspname = pstrdup(nspname);
+ rel->relname = pstrdup(relname);
+ rel->relpages = relpages;
+ rel->blocks_to_check = relpages;
+ if (is_heap && (opts.startblock >= 0 || opts.endblock >= 0))
+ {
+ /*
+ * We apply --startblock and --endblock to heap tables, but
+ * not btree indexes, and for progress purposes we need to
+ * track how many blocks we expect to check.
+ */
+ if (opts.endblock >= 0 && rel->blocks_to_check > opts.endblock)
+ rel->blocks_to_check = opts.endblock + 1;
+ if (opts.startblock >= 0)
+ {
+ if (rel->blocks_to_check > opts.startblock)
+ rel->blocks_to_check -= opts.startblock;
+ else
+ rel->blocks_to_check = 0;
+ }
+ }
+ *pagecount += rel->blocks_to_check;
+
+ simple_ptr_list_append(relations, rel);
+ }
+ }
+ PQclear(res);
+}
diff --git a/src/bin/pg_amcheck/po/LINGUAS b/src/bin/pg_amcheck/po/LINGUAS
new file mode 100644
index 0000000..2358abb
--- /dev/null
+++ b/src/bin/pg_amcheck/po/LINGUAS
@@ -0,0 +1 @@
+de el es fr it ja ka ko ru sv uk zh_CN zh_TW
diff --git a/src/bin/pg_amcheck/po/de.po b/src/bin/pg_amcheck/po/de.po
new file mode 100644
index 0000000..cf5b3b9
--- /dev/null
+++ b/src/bin/pg_amcheck/po/de.po
@@ -0,0 +1,533 @@
+# German message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:50+0000\n"
+"PO-Revision-Date: 2022-05-11 22:10+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Abbruchsanforderung gesendet\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Konnte Abbruchsanforderung nicht senden: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1645 pg_amcheck.c:2090
+#, c-format
+msgid "query failed: %s"
+msgstr "Anfrage fehlgeschlagen: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091
+#, c-format
+msgid "Query was: %s"
+msgstr "Anfrage war: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ungültiges Argument für Option %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "ungültiger Startblock"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "Startblock außerhalb des gültigen Bereichs"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "ungültiger Endblock"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "Endblock außerhalb des gültigen Bereichs"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "Endblock kommt vor dem Startblock"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "ein Datenbankname kann nicht mit --all angegeben werden"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "Datenbankname und Datenbankmuster können nicht zusammen angegeben werden"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "keine zu prüfenden Datenbanken"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "Datenbank »%s«: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "Datenbank »%s« übersprungen: amcheck nicht installiert"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "in Datenbank »%s«: verwende amcheck Version »%s« in Schema »%s«"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "keine zu prüfenden Tabellen, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "keine zu prüfenden B-Tree-Indexe, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "keine zu prüfenden Relationen in Schemas, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "keine zu prüfenden Relationen, die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "keine zu prüfenden Relationen"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "prüfe Heap-Tabelle »%s.%s.%s«"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "prüfe B-Tree-Index »%s.%s.%s«"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "Fehler beim Senden von Befehl an Datenbank »%s«: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Die Anweisung war: %s"
+
+#: pg_amcheck.c:1013
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s, Attribut %s:\n"
+
+#: pg_amcheck.c:1020
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s:\n"
+
+#: pg_amcheck.c:1026
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "Heap-Tabelle »%s.%s.%s«, Block %s:\n"
+
+#: pg_amcheck.c:1031 pg_amcheck.c:1042
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "Heap-Tabelle »%s.%s.%s«:\n"
+
+#: pg_amcheck.c:1046 pg_amcheck.c:1115
+#, c-format
+msgid "query was: %s\n"
+msgstr "Anfrage war: %s\n"
+
+#: pg_amcheck.c:1097
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "B-Tree-Index »%s.%s.%s«: B-Tree-Prüffunktion gab unerwartete Anzahl Zeilen zurück: %d"
+
+#: pg_amcheck.c:1101
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Sind die Versionen von %s und amcheck kompatibel?"
+
+#: pg_amcheck.c:1111
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "B-Tree-Index »%s.%s.%s«:\n"
+
+#: pg_amcheck.c:1136
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s prüft Objekte in einer PostgreSQL-Datenbank auf Beschädigung.\n"
+"\n"
+
+#: pg_amcheck.c:1137
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Zieloptionen:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all alle Datenbanken prüfen\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=MUSTER übereinstimmende Datenbanken prüfen\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=MUSTER übereinstimmende Datenbanken NICHT prüfen\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=MUSTER übereinstimmende Indexe prüfen\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=MUSTER übereinstimmende Indexe NICHT prüfen\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=MUSTER übereinstimmende Relationen prüfen\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=MUSTER übereinstimmende Relationen NICHT prüfen\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=MUSTER übereinstimmende Schemas prüfen\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=MUSTER übereinstimmende Schemas NICHT prüfen\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=MUSTER übereinstimmende Tabellen prüfen\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=MUSTER übereinstimmende Tabellen NICHT prüfen\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes Liste der Relationen NICHT um Indexe erweitern\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast Liste der Relationen NICHT um TOAST-Tabellen erweitern\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names Muster müssen NICHT mit Objekten übereinstimmen\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Optionen für Tabellen:\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers TOAST-Zeigern NICHT folgen\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop Prüfung nach der ersten beschädigten Seite beenden\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION Blöcke mit »all-frozen« oder »all-visible« NICHT prüfen\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK Prüfen der Tabelle(n) bei angegebener Blocknummer beginnen\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK Tabelle(n) nur bis zur angegebenen Blocknummer prüfen\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Optionen für B-Tree-Indexe:\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed prüfen, dass alle Heap-Tupel in Indexen zu finden sind\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check Index-Eltern/Kind-Beziehungen prüfen\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend Tupel erneut von der Wurzelseite aus suchen\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password Passwortfrage erzwingen\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Weitere Optionen:\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo zeige die Befehle, die an den Server\n"
+" gesendet werden\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr ""
+" -j, --jobs=NUM so viele parallele Verbindungen zum Server\n"
+" verwenden\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing fehlende Erweiterungen installieren\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_amcheck.c:1234
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) %*s"
+
+#: pg_amcheck.c:1245
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1260
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%)"
+
+#: pg_amcheck.c:1319 pg_amcheck.c:1352
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "falscher qualifizierter Name (zu viele Namensteile): %s"
+
+#: pg_amcheck.c:1397
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "falscher Relationsname (zu viele Namensteile): %s"
+
+#: pg_amcheck.c:1550 pg_amcheck.c:1689
+#, c-format
+msgid "including database \"%s\""
+msgstr "Datenbank »%s« einbezogen"
+
+#: pg_amcheck.c:1671
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "interner Fehler: unerwartete pattern_id %d für Datenbank empfangen"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "keine Datenbanken, mit denen verbunden werden kann und die mit »%s« übereinstimmen"
+
+#: pg_amcheck.c:2131
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "interner Fehler: unerwartete pattern_id %d für Relation empfangen"
diff --git a/src/bin/pg_amcheck/po/el.po b/src/bin/pg_amcheck/po/el.po
new file mode 100644
index 0000000..a75941b
--- /dev/null
+++ b/src/bin/pg_amcheck/po/el.po
@@ -0,0 +1,545 @@
+# Greek message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 16:50+0000\n"
+"PO-Revision-Date: 2023-04-13 13:49+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Αίτηση ακÏÏωσης εστάλη\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακÏÏωσης: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "δεν ήταν δυνατή η σÏνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "το εÏώτημα απέτυχε: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "Το εÏώτημα ήταν: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "μη έγκυÏη παÏάμετÏος για την επιλογή %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "μη έγκυÏο μπλοκ εκκίνησης"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "μπλοκ εκκίνησης εκτός οÏίων"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "μη έγκυÏο μπλοκ τεÏματισμοÏ"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "μπλοκ τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎµÎºÏ„ÏŒÏ‚ οÏίων"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "μπλοκ τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Ï€Ïοηγείται του μπλοκ εκκίνησης"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "δεν είναι δυνατό να οÏιστεί ένα όνομα βάσης δεδομένων μαζί με --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "δεν είναι δυνατός ο καθοÏισμός τόσο ενός ονόματος βάσης δεδομένων όσο και μοτίβων βάσης δεδομένων"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "καθόλου βάσεις δεδομένων για έλεγχο"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "βάση δεδομένων «%s»: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "παÏακάμπτει βάση δεδομένων «%s»: το amcheck δεν είναι εγκαταστημένο"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "στη βάση δεδομένων «%s»: χÏησιμοποιώντας την έκδοση «%s» του amcheck στο σχήμα «%s»"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "δεν υπάÏχουν πίνακες heap για έλεγχο που ταιÏιάζουν με «%s»"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "δεν υπάÏχουν ευÏετήÏια BTREE για έλεγχο που ταιÏιάζουν με «%s»"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "καθόλου σχέσεις για έλεγχο σε σχήματα που ταιÏιάζουν με «%s»"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "καθόλου σχέσεις για έλεγχο που ταιÏιάζουν με «%s»"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "καθόλου σχέσεις για έλεγχο"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "ελέγχει τον πίνακα heap «%s.%s.%s»"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "ελέγχει το ευÏετήÏιο btree «%s.%s.%s»"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "εντολή αποστολής σφάλματος στη βάση δεδομένων «%s»: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Η εντολή ήταν: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s, μετατόπιση %s, χαÏακτηÏιστικό %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s, μετατόπιση %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "πίνακας heap «%s.%s.%s», μπλοκ %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "πίνακας heap «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "το εÏώτημα ήταν: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "ευÏετήÏιο btree «%s.%s.%s»: η συνάÏτηση ελέγχου btree επέστÏεψε απÏοσδόκητο αÏιθμό γÏαμμών: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Είναι συμβατές οι εκδόσεις του %s και του amcheck;"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "ευÏετήÏιο btree «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s ελέγχει αντικείμενα σε μια βάση δεδομένων PostgreSQL για αλλοίωση.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Επιλογές στόχου:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all έλεγξε όλες τις βάσεις δεδομένων\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN έλεγξε ταιÏιαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN να ΜΗΠελέγξει ταιÏιαστή(-ες) με το μοτίβο βάση(-εις) δεδομένων\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN έλεγξε ταιÏιαστό(-ά) με το μοτίβο ευÏετήÏιο(-ά)\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN να ΜΗΠελέγξει ταιÏιαστό(-ά) με το μοτίβο ευÏετήÏιο(-ά)\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -i, --index=PATTERN έλεγξε ταιÏιαστή(-ές) με το μοτίβο σχέση(-εις)\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN να ΜΗΠελέγξει ταιÏιαστή(-ές) με το μοτίβο σχέση(-εις)\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN έλεγξε ταιÏιαστό(-ά) με το μοτίβο σχήμα(-τα)\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN να ΜΗΠελέγξει ταιÏιαστό(-ά) με το μοτίβο σχήμα(-τα)\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN έλεγξε ταιÏιαστό(-οÏÏ‚) με το μοτίβο πίνακα(-ες)\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN να ΜΗΠελέγξει ταιÏιαστό(-οÏÏ‚) με το μοτίβο πίνακα(-ες)\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes να ΜΗΠεπεκτείνεις τη λίστα σχέσεων ώστε να συμπεÏιλάβει ευÏετήÏια\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast να ΜΗΠεπεκτείνεις τη λίστα σχέσεων ώστε να συμπεÏιλάβει πίνακες TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names να ΜΗΠαπαιτήσει μοτίβα για την αντιστοίχιση αντικειμένων\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Επιλογές ελέγχου πίνακα:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers να ΜΗΠακολουθήσει τους δείκτες σχέσεων TOAST\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop διακοπή ελέγχου στο τέλος της Ï€Ïώτης αλλοιωμένης σελίδας\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION να ΜΗΠελέγξει τα «all-frozen» ή «all-visible» μπλοκ\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK εκκίνηση του ελέγχου πίνακα(-ων) από τον δοσμένο αÏιθμό μπλοκ\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK τεÏματισμός του ελέγχου πίνακα(-ων) από τον δοσμένο αÏιθμό μπλοκ\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Επιλογές ελέγχου ευÏετηÏίου B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed έλεγξε ότι όλες οι πλειάδες heap πεÏιλαμβάνονται σε ευÏετήÏια\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check έλεγξε σχέσεις γονέα/απογόνου ευÏετηÏίου\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend αναζήτησε από τη Ïιζική σελίδα για την επανεÏÏεση πλειάδων\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σÏνδεσης:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήÏησης\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Άλλες επιλογές:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM χÏησιμοποιήσε τόσες πολλές ταυτόχÏονες συνδέσεις με το διακομιστή\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing εγκατάστησε επεκτάσεις που λείπουν\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s σχέσεις (%d%%), %*s/%s σελίδες (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ακατάλληλο αναγνωÏισμένο όνομα (πάÏα πολλά διάστικτα ονόματα): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ακατάλληλο όνομα σχέσης (πολλά διάστικτα ονόματα): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "συμπεÏιλαμβανομένης της βάσης δεδομένων «%s»"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "εσωτεÏικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "δεν υπάÏχουν βάσεις δεδομένων με δυνατότητα σÏνδεσης για έλεγχο που να ταιÏιάζουν με «%s»"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "εσωτεÏικό σφάλμα: ελήφθη μη αναμενόμενο pattern_id σχέσης %d"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n"
+
+#~ msgid "command was: %s"
+#~ msgstr "η εντολή ήταν: %s"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "ο αÏιθμός παÏάλληλων εÏγασιών Ï€Ïέπει να είναι τουλάχιστον 1"
diff --git a/src/bin/pg_amcheck/po/es.po b/src/bin/pg_amcheck/po/es.po
new file mode 100644
index 0000000..ed8cb6e
--- /dev/null
+++ b/src/bin/pg_amcheck/po/es.po
@@ -0,0 +1,533 @@
+# Spanish translation file for pg_amcheck
+#
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-24 23:20+0000\n"
+"PO-Revision-Date: 2023-05-22 12:05+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Petición de cancelación enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "No se pudo enviar la petición de cancelación: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "no se pudo conectar a la base de datos %s: memoria agotada"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "la consulta falló: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "La consulta era: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento no válido para la opción %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "bloque de inicio no válido"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "bloque de inicio fuera de rango"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "bloque final no válido"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "bloque final fuera de rango"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "bloque final precede al bloque de inicio"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "no se puede especificar un nombre de base de datos al usar --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "no se puede especificar al mismo tiempo un nombre de base de datos junto con patrones de bases de datos"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "no hay bases de datos para revisar"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "base de datos «%s»: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "omitiendo la base de datos «%s»: amcheck no está instalado"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "en base de datos «%s»: usando amcheck versión «%s» en esquema «%s»"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "no hay tablas heap para revisar que coincidan con «%s»"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "no hay índices btree para revisar que coincidan con «%s»"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "no hay relaciones para revisar en esquemas que coincidan con «%s»"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "no hay relaciones para revisar que coincidan con «%s»"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "no hay relaciones para revisar"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "revisando tabla heap «%s.%s.%s»"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "revisando índice btree «%s.%s.%s»"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "error al enviar orden a la base de datos «%s»: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "La orden era: % s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s, atributo %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "tabla heap «%s.%s.%s», bloque %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "tabla heap «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "la consulta era: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "índice btree «%s.%s.%s»: la función de comprobación de btree devolvió un número inesperado de registros: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "¿Son compatibles la versión de %s con la de amcheck?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "índice btree «%s.%s.%s»:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s busca corrupción en objetos de una base de datos PostgreSQL.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Opciones de objetivo:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all revisar todas las bases de datos\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATRÓN revisar la(s) base(s) de datos que coincida(n)\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATRÓN NO revisar la(s) base(s) de datos que coincida(n)\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATRÓN revisar el(los) índice(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATRÓN NO revisar el(los) índice(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATRÓN revisar la(s) relación(es) que coincida(n)\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATRÓN NO revisar la(s) relación(es) que coincida(n)\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATRÓN revisar el(los) esquema(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATRÓN NO revisar el(los) esquema(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATRÓN revisar la(s) tabla(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATRÓN NO revisar la(s) tabla(s) que coincida(n)\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes NO expandir la lista de relaciones para incluir índices\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast NO expandir lista de relaciones para incluir tablas TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names NO requerir que los patrones coincidan con los objetos\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Opciones para revisión de tabla:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers NO seguir punteros TOAST de la relación\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop detener la revisión al final de la primera página corrupta\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION NO revisar bloques «all-frozen» u «all-visible»\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOQUE empezar la revisión de la(s) tabla(s) en el número de bloque especificado\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOQUE solo revisar la(s) tabla(s) hasta el número de bloque especificado\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Opciones para revisión de índices B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed revisar que todas las tuplas heap se encuentren en los índices\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check revisar relaciones padre/hijo de índice\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend buscar desde la página raíz para volver a encontrar tuplas\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor de base de datos\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forzar la petición de contraseña\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Otras opciones:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes hacia el servidor\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing instalar extensiones faltantes\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%), (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "el nombre no es válido (demasiados puntos): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "el nombre de relación no es válido (demasiados puntos): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "incluyendo base de datos «%s»"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "error interno: se recibió pattern_id de base de datos inesperado (%d)"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "no hay bases de datos a las que se pueda conectar que coincidan con «%s»"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "error interno: se recibió pattern_id de relación inesperado (%d)"
diff --git a/src/bin/pg_amcheck/po/fr.po b/src/bin/pg_amcheck/po/fr.po
new file mode 100644
index 0000000..9fc553f
--- /dev/null
+++ b/src/bin/pg_amcheck/po/fr.po
@@ -0,0 +1,605 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2021-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2021-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:19+0000\n"
+"PO-Revision-Date: 2022-05-14 17:15+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requête d'annulation envoyée\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "N'a pas pu envoyer la requête d'annulation : "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1645 pg_amcheck.c:2090
+#, c-format
+msgid "query failed: %s"
+msgstr "échec de la requête : %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091
+#, c-format
+msgid "Query was: %s"
+msgstr "La requête était : %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argument invalide pour l'option %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "bloc de début invalide"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "bloc de début hors des limites"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "bloc de fin invalide"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "bloc de fin hors des limites"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "le bloc de fin précède le bloc de début"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "ne peut pas spécifier un nom de base de données avec --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "ne peut pas spécifier à la fois le nom d'une base de données et des motifs de noms de base"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "aucune base de données à vérifier"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "base de données « %s » : %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "ignore la base « %s » : amcheck n'est pas installé"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "dans la base de données « %s » : utilisation de la version « %s » d'amcheck dans le schéma « %s »"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "aucune table heap à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "aucun index btree à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "aucune relation à vérifier dans les schémas correspondant à « %s »"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "aucune relation à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "aucune relation à vérifier"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "vérification de la table heap « %s %s.%s »"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "vérification de l'index btree « %s %s.%s »"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "erreur de l'envoi d'une commande à la base de données « %s » : %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "La commande était : %s"
+
+#: pg_amcheck.c:1013
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "table heap « %s.%s.%s », bloc %s, décalage %s, attribut %s :\n"
+
+#: pg_amcheck.c:1020
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "table heap « %s.%s.%s », bloc %s, décalage %s :\n"
+
+#: pg_amcheck.c:1026
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "table heap « %s %s.%s », bloc %s :\n"
+
+#: pg_amcheck.c:1031 pg_amcheck.c:1042
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "table heap « %s %s.%s » :\n"
+
+#: pg_amcheck.c:1046 pg_amcheck.c:1115
+#, c-format
+msgid "query was: %s\n"
+msgstr "la requête était : %s\n"
+
+#: pg_amcheck.c:1097
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "index btree « %s.%s.%s » : la fonction de vérification des index btree a renvoyé un nombre de lignes inattendu : %d"
+
+#: pg_amcheck.c:1101
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "est-ce que les versions de %s et d'amcheck sont compatibles ?"
+
+#: pg_amcheck.c:1111
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "vérification de l'index btree« %s %s.%s » :\n"
+
+#: pg_amcheck.c:1136
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s utilise le module amcheck pour vérifier si les objets d' une base\n"
+"PostgreSQL sont corrompus.\n"
+"\n"
+
+#: pg_amcheck.c:1137
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [BASE]\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Options de la cible :\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all vérifie toutes les bases\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=MOTIF vérifie les bases correspondantes\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=MOTIF ne vérifie PAS les bases correspondantes\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=MOTIF vérifie les index correspondants\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=MOTIF ne vérifie PAS les index correspondants\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=MOTIF vérifie les relations correspondantes\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=MOTIF ne vérifie PAS les relations correspondantes\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=MOTIF vérifie les schémas correspondants\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=MOTIF ne vérifie PAS les schémas correspondants\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=MOTIF vérifie les tables correspondantes\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=MOTIF ne vérifie PAS les tables correspondantes\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr ""
+" --no-dependent-indexes n'étend PAS la liste des relations pour inclure\n"
+" les index\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr ""
+" --no-dependent-toast n'étend PAS la liste des relations pour inclure\n"
+" les TOAST\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names ne requiert PAS que les motifs correspondent à\n"
+" des objets\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Options de vérification des tables :\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers ne suit PAS les pointeurs de TOAST\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr ""
+" --on-error-stop arrête la vérification à la fin du premier bloc\n"
+" corrompu\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr ""
+" --skip=OPTION ne vérifie PAS les blocs « all-frozen » et\n"
+" « all-visible »\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr ""
+" --startblock=BLOC commence la vérification des tables au numéro\n"
+" de bloc indiqué\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr ""
+" --endblock=BLOC vérifie les tables jusqu'au numéro de bloc\n"
+" indiqué\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Options de vérification des index Btree :\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr ""
+" --heapallindexed vérifie que tous les enregistrements de la\n"
+" table sont référencés dans les index\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr ""
+" --parent-check vérifie les relations parent/enfants dans les\n"
+" index\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr ""
+" --rootdescend recherche à partir de la racine pour trouver\n"
+" les lignes\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HÔTE IP/alias du serveur ou répertoire du socket\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais un mot de passe\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password force la saisie d'un mot de passe\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE change la base de maintenance\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Autres options :\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de connexions simultanées au\n"
+" serveur\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing installe les extensions manquantes\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_amcheck.c:1234
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) %*s"
+
+#: pg_amcheck.c:1245
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1260
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%)"
+
+#: pg_amcheck.c:1319 pg_amcheck.c:1352
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s"
+
+#: pg_amcheck.c:1397
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nom de relation incorrecte (trop de points entre les noms) : %s"
+
+#: pg_amcheck.c:1550 pg_amcheck.c:1689
+#, c-format
+msgid "including database \"%s\""
+msgstr "en incluant la base de données : « %s »"
+
+#: pg_amcheck.c:1671
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "erreur interne : a reçu un pattern_id %d inattendu de la base"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "aucune base de données connectable à vérifier correspondant à « %s »"
+
+#: pg_amcheck.c:2131
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "erreur interne : a reçu un pattern_id %d inattendu de la relation"
+
+#~ msgid ""
+#~ "\n"
+#~ "Other Options:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Autres options:\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version, puis quitte\n"
+
+#~ msgid " -e, --echo show the commands being sent to the server\n"
+#~ msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet n'écrit aucun message\n"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet n'écrit aucun message\n"
+
+#~ msgid " -v, --verbose write a lot of output\n"
+#~ msgstr " -v, --verbose mode verbeux\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "command was: %s"
+#~ msgstr "la commande était : %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "invalid skip option"
+#~ msgstr "option skip invalide"
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1"
+
+#~ msgid "number of parallel jobs must be at least 1\n"
+#~ msgstr "le nombre de jobs parallèles doit être au moins de 1\n"
diff --git a/src/bin/pg_amcheck/po/it.po b/src/bin/pg_amcheck/po/it.po
new file mode 100644
index 0000000..ed4974f
--- /dev/null
+++ b/src/bin/pg_amcheck/po/it.po
@@ -0,0 +1,531 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2023-09-05 08:02+0200\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Richiesta di annullamento inviata\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Impossibile inviare la richiesta di annullamento: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "impossibile connettersi al database %s: memoria insufficiente"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "query fallita: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "La richiesta era: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argomento non valido per l'opzione %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "blocco di avvio non valido"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "blocco di partenza fuori limite"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "blocco finale non valido"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "blocco finale fuori limite"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "il blocco finale precede il blocco iniziale"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "non è possibile specificare un nome di database con --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "non è possibile specificare sia il nome del database che i modelli del database"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "nessun database da controllare"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "database \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "saltando il database \"%s\": amcheck non è installato"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "nel database \"%s\": utilizzando la versione amcheck \"%s\" nello schema \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "nessuna tabella heap per verificare la corrispondenza \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "nessun indice btree per verificare la corrispondenza \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "nessuna relazione da archiviare negli schemi corrispondenti a \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "nessuna relazione da verificare corrispondente a \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "nessuna relazione da controllare"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "controllo della tabella heap \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "controllo dell'indice btree \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "errore durante l'invio del comando al database \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Il comando era: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "tabella heap \"%s.%s.%s\", blocco %s, offset %s, attributo %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "tabella heap \"%s.%s.%s\", blocco %s, offset %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "tabella heap \"%s.%s.%s\", blocco %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "tabella heap \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "la query era: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btree index \"%s.%s.%s\": la funzione di controllo btree ha restituito un numero imprevisto di righe: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Le versioni di %s e amcheck sono compatibili?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree index \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s verifica la corruzione degli oggetti in un database PostgreSQL.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPZIONE]... [NOMEDB]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Opzioni di destinazione:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all controlla tutti i database\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN controlla i database corrispondenti\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN Non controlla i database corrispondenti\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN controlla gli indici corrispondenti\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN Non controlla gli indici corrispondenti\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN controlla le relazioni di corrispondenza\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN Non controlla le relazioni corrispondenti\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN controlla gli schemi corrispondenti\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN Non controlla gli schemi corrispondenti\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN controlla le tabelle corrispondenti\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN Non controlla le tabelle corrispondenti\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes Non espande l'elenco di relazioni per includere gli indici\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast Non espande l'elenco delle relazioni per includere le tabelle TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names Non richiede modelli per abbinare gli oggetti\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Opzioni di controllo della tabella:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers NON seguono i puntatori TOAST di relazione\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop interrompe il controllo alla fine della prima pagina danneggiata\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPZIONE Non controlla i blocchi \"tutto congelato\" o \"tutto visibile\".\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCCO inizia a controllare le tabelle al numero di blocco dato\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCCO controlla le tabelle solo fino al numero di blocco specificato\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Opzioni di controllo dell'indice B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed controlla che tutte le tuple dell'heap si trovino all'interno degli indici\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check controlla le relazioni genitore/figlio dell'indice\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend cerca dalla pagina principale per trovare le tuple\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del database o directory socket\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT porta del server del database\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME nome utente con cui connettersi\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non richiede mai la password\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forza la richiesta della password\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME database di manutenzione alternativo\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Altre opzioni:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi inviati al server\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee al server\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra molti messaggi\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing installa le estensioni mancanti\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s relazioni (%d%%), %*s/%s pagine (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s relazioni (%d%%), %*s/%s pagine (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s relazioni (%d%%), %*s/%s pagine (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificato improprio (troppi nomi puntati): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nome di relazione improprio (troppi nomi puntati): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "incluso il database \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "errore interno: ricevuto database imprevisto pattern_id %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "nessun database collegabile per verificare la corrispondenza \"%s\""
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "errore interno: ricevuta relazione imprevista pattern_id %d"
diff --git a/src/bin/pg_amcheck/po/ja.po b/src/bin/pg_amcheck/po/ja.po
new file mode 100644
index 0000000..6fa8208
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ja.po
@@ -0,0 +1,545 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 11:31+0900\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "キャンセルè¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "キャンセルè¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "データベース%sã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: メモリä¸è¶³ã§ã™"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sã¯%d..%dã®ç¯„囲ã«ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "å•ã„åˆã‚ã›: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "オプション%sã®å¼•æ•°ãŒä¸æ­£ã§ã™"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "ä¸æ­£ãªé–‹å§‹ãƒ–ロック"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "開始ブロックãŒç¯„囲外ã§ã™"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "ä¸æ­£ãªçµ‚了ブロック"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "終了ブロックãŒç¯„囲外ã§ã™"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "終了ブロックãŒé–‹å§‹ãƒ–ロックよりå‰ã«ãªã£ã¦ã„ã¾ã™"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "--allã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "データベースåã¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‘ターンã¯åŒæ™‚ã«æŒ‡å®šã¯ã§ãã¾ã›ã‚“"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "検査ã™ã¹ãデータベースãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "データベース\"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "データベース\"%s\"をスキップã—ã¾ã™: amcheckãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "データベース\"%1$s\"内: スキーマ\"%3$s\"内ã§amcheck ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%2$s\"を使用中"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®ãƒ’ープテーブルãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®btreeインデックスãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžå†…ã«æ¤œæŸ»å¯¾è±¡ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "検査対象ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "ヒープテーブル\"%s.%s.%s\"を検査"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "btreeインデックス\"%s.%s.%s\"を検査"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "データベース\"%s\"ã¸ã®ã‚³ãƒžãƒ³ãƒ‰é€å‡ºä¸­ã®ã‚¨ãƒ©ãƒ¼: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "コマンド: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "ヒープテーブル\"%s.%s.%s\"ã€ãƒ–ロック%sã€ã‚ªãƒ•ã‚»ãƒƒãƒˆ%sã€å±žæ€§%s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "ヒープテーブル\"%s.%s.%s\"ã€ãƒ–ロック%sã€ã‚ªãƒ•ã‚»ãƒƒãƒˆ%s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "ヒープテーブル\"%s.%s.%s\"ã€ãƒ–ロック%s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "ヒープテーブル\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "å•ã„åˆã‚ã›: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btreeインデックス\"%s.%s.%s\": btree検索関数ãŒäºˆæœŸã—ãªã„æ•°ã®è¡Œã‚’è¿”å´ã—ã¾ã—ãŸ: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%sã¨amcheckã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯åˆã£ã¦ã„ã¾ã™ã‹?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btreeインデックス\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベース内ã®ã‚ªãƒ–ジェクトã®ç ´æを検査ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [オプション]... [データベースå]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"対象指定オプション:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN åˆè‡´ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN åˆè‡´ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN åˆè‡´ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’検査\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN åˆè‡´ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’検査「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN åˆè‡´ã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’検査\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN åˆè‡´ã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’検査「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN åˆè‡´ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžã‚’検査\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN åˆè‡´ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžã‚’検査「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN åˆè‡´ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルを検査\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN åˆè‡´ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルを検査「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr ""
+" --no-dependent-indexes リレーションã®ãƒªã‚¹ãƒˆã‚’インデックスをå«ã‚€ã‚ˆã†ã«\n"
+" 拡張「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr ""
+" --no-dependent-toast リレーションã®ãƒªã‚¹ãƒˆã‚’TOASTテーブルをå«ã‚€\n"
+" よã†ã«æ‹¡å¼µã€Œã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names パターンãŒã‚ªãƒ–ジェクトã«åˆè‡´ã™ã‚‹ã“ã¨ã‚’å¿…é ˆã¨\n"
+" ã—ãªã„\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"テーブル検査オプション:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers リレーションã®TOASTãƒã‚¤ãƒ³ã‚¿ã‚’追跡「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop 最åˆã®ç ´æページã®çµ‚ã‚ã‚Šã§æ¤œæŸ»ã‚’中断ã™ã‚‹\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr ""
+" --skip=OPTION \"all-frozen\"ãŠã‚ˆã³\"all-visible\"ã§ã‚ã‚‹\n"
+" ブロックを検査「ã—ãªã„ã€\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr ""
+" --startblock=BLOCK 指定ã—ãŸãƒ–ロック番å·ã‹ã‚‰ãƒ†ãƒ¼ãƒ–ルã®æ¤œæŸ»ã‚’\n"
+" 開始ã™ã‚‹\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK 指定ã—ãŸãƒ–ロック番å·ã¾ã§ãƒ‡ãƒ¼ãƒ–ルã®æ¤œæŸ»ã‚’è¡Œã†\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B-treeインデックス検査オプション:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr ""
+" --heapallindexed ã™ã¹ã¦ã®ãƒ’ープタプルãŒã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†…ã«\n"
+" 見ã¤ã‹ã‚‹ã“ã¨ã‚’検査\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check インデックスã®è¦ªå­é–¢ä¿‚を検査\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend タプルå†æŽ¢ç´¢ã‚’ルートページã‹ã‚‰å®Ÿè¡Œã™ã‚‹\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯\n"
+" ソケットディレクトリ\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆ\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 接続ã«ç”¨ã„るユーザーå\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力をè¦æ±‚ã—ãªã„\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password パスワード入力è¦æ±‚を強制ã™ã‚‹\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 代替ã®ä¿å®ˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"ãã®ä»–ã®ã‚ªãƒ—ション:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーãƒãƒ¼ã«é€ã‚‰ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM サーãƒãƒ¼ã«å¯¾ã—ã¦æŒ‡å®šã—ãŸæ•°ã®æŽ¥ç¶šã‚’使用ã™ã‚‹\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状æ³ã‚’表示\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力ã—ã¾ã™\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing 機能拡張ãŒãªã„å ´åˆã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s個ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(%d%%), %*s/%sページ(%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s個ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(%d%%), %*s/%sページ(%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s個ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(%d%%), %*s/%sページ(%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "リレーションåãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "データベース\"%s\"ã‚’å«ã‚ã¾ã™"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "内部エラー: 予期ã—ãªã„データベースパターンID %dã‚’å—ä¿¡"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®æŽ¥ç¶šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "内部エラー: 予期ã—ãªã„リレーションパターンID %dã‚’å—ä¿¡"
diff --git a/src/bin/pg_amcheck/po/ka.po b/src/bin/pg_amcheck/po/ka.po
new file mode 100644
index 0000000..99b2c56
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ka.po
@@ -0,0 +1,592 @@
+# Georgian message translation file for pg_amcheck
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:50+0000\n"
+"PO-Revision-Date: 2022-07-04 11:33+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ შეუძლებელიáƒ: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ (%s) მიერთებრშეუძლებელიáƒ: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შინáƒáƒáƒ áƒ¡áƒ˜: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის: %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბლáƒáƒ™áƒ˜"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბლáƒáƒ™áƒ˜ სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბáƒáƒšáƒ ბლáƒáƒ™áƒ˜"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "ბáƒáƒšáƒ ბლáƒáƒ™áƒ˜ სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "ბáƒáƒšáƒ ბლáƒáƒ™áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡ ბლáƒáƒ™áƒáƒ›áƒ“ე მდებáƒáƒ áƒ”áƒáƒ‘ს"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "--all -თáƒáƒœ ერთáƒáƒ“ ბáƒáƒ–ის სáƒáƒ®áƒ”ლს ვერ მიუთითებთ"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "áƒáƒ áƒ˜áƒ•áƒ”ს, ბáƒáƒ–ის სáƒáƒ®áƒ”ლსრდრმის შáƒáƒ‘ლáƒáƒœáƒ¡ ვერ მიუთითებთ"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "შემáƒáƒ¡áƒáƒ›áƒáƒ¬áƒ›áƒ”ბელი ბáƒáƒ–ის გáƒáƒ áƒ”შე"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "ბáƒáƒ–რ\"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "\"%s\" ბáƒáƒ–ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ: amcheck დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრamcheck-ის ვერსირ\"%s\" სქემáƒáƒ¨áƒ˜ \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "მეხსირების ცხრილები, რáƒáƒ›áƒšáƒ”ბიც ემთხვევრ\"%s\"-ს, áƒáƒ  áƒáƒ áƒ¡áƒ”ბბს"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "áƒáƒ áƒáƒ‘ით ხის ინდექსები, რáƒáƒ›áƒšáƒ”ბიც ემთხვევრ\"%s\"-ს, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "\"%s\"-ს áƒáƒ áƒª ერთი სქემრáƒáƒ  ემთხვევáƒ"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "\"%s\"-ს áƒáƒ áƒª ერთი ურთიერთáƒáƒ‘რáƒáƒ  ემთხვევáƒ"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "შესáƒáƒ›áƒáƒ¬áƒ›áƒ”ბელი ურთიერთáƒáƒ‘ების გáƒáƒ áƒ”შე"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "მეხსიერების ცხრილის შემáƒáƒ¬áƒ›áƒ”ბáƒ\"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "áƒáƒ áƒáƒ‘ითი ხის ინდექსის შემáƒáƒ¬áƒ›áƒ”ბრ\"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "ბáƒáƒ–ისთვის ბრძáƒáƒœáƒ”ბის გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "ბრძáƒáƒœáƒ”ბრიყáƒ: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr ""
+"მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%s, áƒáƒ¢áƒ áƒ˜áƒ‘უტი %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "ცხრილი მეხსიერებáƒáƒ¨áƒ˜ \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შინáƒáƒáƒ áƒ¡áƒ˜: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid ""
+"btree index \"%s.%s.%s\": btree checking function returned unexpected number "
+"of rows: %d"
+msgstr ""
+"áƒáƒ áƒáƒ‘ითი ხის ინდექსი\"%s.%s.%s\": áƒáƒ áƒáƒ‘ითი ხის შემáƒáƒ¬áƒ›áƒ”ბის ფუნქციáƒáƒ› მწკრივების "
+"მáƒáƒ£áƒšáƒáƒ“ნელი რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "áƒáƒ áƒ˜áƒáƒœ %s\"-ის დრamcheck-ის ვერსიები თáƒáƒ•áƒ¡áƒ”ბáƒáƒ“ი?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree index \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL -ის ბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბულ áƒáƒ‘იექტებს დáƒáƒ–იáƒáƒœáƒ”ბებზე შეáƒáƒ›áƒáƒ¬áƒ›áƒ”ბს.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"სáƒáƒ›áƒ˜áƒ–ნის პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all ყველრბáƒáƒ–ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ბáƒáƒ–(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ბáƒáƒ–(ებ)ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ინდექს(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr ""
+" -I, --exclude-index=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ შáƒáƒ‘ლáƒáƒœ(ებ)-ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr ""
+" -r, --relation=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ურთითერთáƒáƒ‘(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr ""
+" -R, --exclude-relation=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ურთიერთáƒáƒ‘(ებ)-ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემ(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr ""
+" -S, --exclude-schema=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემ(ებ)-ის áƒáƒ  შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილ(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr ""
+" -T, --exclude-table=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილ(ებ)-ი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid ""
+" --no-dependent-indexes do NOT expand list of relations to include "
+"indexes\n"
+msgstr ""
+" --no-dependent-indexes ურთერთáƒáƒ‘ების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბისáƒáƒ¡ ინდექსები "
+"áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბდებáƒ\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+" --no-dependent-toast do NOT expand list of relations to include "
+"TOAST tables\n"
+msgstr ""
+" --no-dependent-toast ურთიერთáƒáƒ‘ების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბისáƒáƒ¡ TOAST "
+"ცხრილები áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ“ებრ\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+" --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბში შáƒáƒ‘ლáƒáƒœáƒ–ე დáƒáƒ›áƒ—ხვევრჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ áƒáƒ  "
+"იქნებáƒ\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"ცხრილის შემáƒáƒ¬áƒ›áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid ""
+" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr ""
+" --exclude-toast-pointers ურთიერთáƒáƒ‘ის TOAST მáƒáƒ©áƒ•áƒ”ნებლებს áƒáƒ  "
+"გáƒáƒ°áƒ§áƒ•áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid ""
+" --on-error-stop stop checking at end of first corrupt "
+"page\n"
+msgstr ""
+" --on-error-stop მუშáƒáƒáƒ‘ის პირველი დáƒáƒ–იáƒáƒœáƒ”ბული გვერდის "
+"ბáƒáƒšáƒáƒ¨áƒ˜ შეწყვეტáƒ\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid ""
+" --skip=OPTION do NOT check \"all-frozen\" or \"all-"
+"visible\" blocks\n"
+msgstr ""
+" --skip=პáƒáƒ áƒáƒ›áƒ”ტრი \"all-frozen\" დრ\"all-visible\" "
+"ბლáƒáƒ™áƒ”ბი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+" --startblock=BLOCK begin checking table(s) at the given block "
+"number\n"
+msgstr ""
+" --startblock=ბლáƒáƒ™áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბის ბლáƒáƒ™áƒ˜áƒ¡ მითითებული ნáƒáƒ›áƒ áƒ˜áƒ“áƒáƒœ "
+"დáƒáƒ¬áƒ§áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid ""
+" --endblock=BLOCK check table(s) only up to the given block "
+"number\n"
+msgstr ""
+" --endblock=ბლáƒáƒ™áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბის მითითებულ ბლáƒáƒ™áƒ–ე დáƒáƒ›áƒ—áƒáƒ•áƒ áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"áƒáƒ áƒáƒ‘ითი ხის ინდექსის შემáƒáƒ¬áƒ›áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid ""
+" --heapallindexed check that all heap tuples are found "
+"within indexes\n"
+msgstr ""
+" --heapallindexed შემáƒáƒ¬áƒ›áƒ”ბáƒ, მეხსიერების ცხრილში ყველრ"
+"მáƒáƒœáƒáƒªáƒ”მი áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, თუ áƒáƒ áƒ\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+" --parent-check check index parent/child relationships\n"
+msgstr ""
+" --parent-check ინდექსის მშáƒáƒ‘ელი/შვილის ურთიერთáƒáƒ‘ის "
+"შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid ""
+" --rootdescend search from root page to refind tuples\n"
+msgstr ""
+" --rootdescend მáƒáƒœáƒáƒªáƒ”მების თáƒáƒ•áƒ˜áƒ“áƒáƒœ სáƒáƒžáƒáƒ•áƒœáƒ”ლáƒáƒ“ ძებნის root "
+"გვერდიდáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბáƒ\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი ბáƒáƒ–ის სერვერის სáƒáƒ®áƒ”ლი áƒáƒœ სáƒáƒ™áƒ”ტის "
+"სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=პáƒáƒ áƒ¢áƒ˜ ბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი მისáƒáƒ”რთებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password პáƒáƒ áƒáƒšáƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•áƒœáƒ áƒáƒ  მáƒáƒ®áƒ“ებáƒ\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყველრშემთხვევáƒáƒ¨áƒ˜ კითხვáƒ\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ სáƒáƒáƒ•áƒáƒ áƒ˜áƒ ბáƒáƒ–áƒ\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"სხვრპáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"the server\n"
+msgstr ""
+" -j, --jobs=რიცხვი სერვერთáƒáƒœ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის "
+"მიერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s ურთიერთáƒáƒ‘რ(%d%%), %*s/%s გვერდი (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s ურთიერთáƒáƒ‘áƒ(%d%%), %*s/%s გვერდი (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s ურთიერთáƒáƒ‘რ(%d%%), %*s/%s გვერდი (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "შიდრშეცდáƒáƒ›áƒ: მიღებულრბáƒáƒ–ის მáƒáƒ£áƒšáƒáƒ“ნელი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡_id: %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "\"%s\"-ის დáƒáƒ›áƒ—ხვევის შესáƒáƒ›áƒáƒ¬áƒ›áƒ”ბლáƒáƒ“ მიერთებáƒáƒ“ი ბáƒáƒ–რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "შიდრშეცდáƒáƒ›áƒ: მიღებულრურთიერთáƒáƒ‘ის მáƒáƒ£áƒšáƒáƒ“ნელი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡_id: %d"
diff --git a/src/bin/pg_amcheck/po/ko.po b/src/bin/pg_amcheck/po/ko.po
new file mode 100644
index 0000000..cef3583
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ko.po
@@ -0,0 +1,566 @@
+# Korean message translation file for pg_amcheck
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:51+0000\n"
+"PO-Revision-Date: 2023-05-30 12:37+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "취소 요청 보냄\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "취소 요청 보내기 실패: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²° í•  수 ì—†ìŒ: 메모리 부족"
+
+#: ../../fe_utils/connect_utils.c:116
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" ê°’ì€ %s ì˜µì…˜ì˜ ê°’ìœ¼ë¡œ ì ë‹¹í•˜ì§€ ì•ŠìŒ"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s ê°’ì€ %d부터 %d까지만 허용합니다"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "쿼리 실패: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "사용한 쿼리: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "시작 블ë¡ì´ 유효하지 ì•ŠìŒ"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "시작 블ë¡ì´ 범위를 벗어남"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "마지막 블ë¡ì´ 유효하지 ì•ŠìŒ"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "마지막 블ë¡ì´ 범위를 벗어남"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "마지막 블ë¡ì´ 시작 블ë¡ë³´ë‹¤ ì•žì— ì¡´ìž¬í•¨"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì„ â€”all 와 ê°™ì´ ì§€ì •í•  수 없습니다"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ê³¼ 형ì‹ì„ 지정할 수 없습니다"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "확ì¸í•  ë°ì´í„°ë² ì´ìŠ¤ê°€ 없습니다"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ “%sâ€: %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ìƒëžµ “%sâ€: amcheck ê°€ 설치ë˜ì§€ ì•ŠìŒ"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ “%sâ€: 사용하는 amcheck 버전 “%s†스키마 “%sâ€"
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” heap í…Œì´ë¸”ì„ ì°¾ì„ ìˆ˜ 없습니다"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” btree ì¸ë±ìŠ¤ë¥¼ ì°¾ì„ ìˆ˜ 없습니다"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "스키마ì—ì„œ “%s†와 ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ ì°¾ì„ ìˆ˜ 없습니다"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ ì°¾ì„ ìˆ˜ 없습니다"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "확ì¸í•  릴레ì´ì…˜ì´ 없습니다"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "heap í…Œì´ë¸” í™•ì¸ â€œ%s.%s.%sâ€"
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "btree ì¸ë±ìŠ¤ í™•ì¸ â€œ%s.%s.%sâ€"
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ì— ëª…ë ¹ì„ ë³´ë‚´ëŠ” 중 오류 ë°œìƒ â€œ%sâ€: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "사용한 명령: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€, ë¸”ë¡ %s, 오프셋 %s, ì—트리뷰트 %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€, ë¸”ë¡ %s, 오프셋 %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€, ë¸”ë¡ %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€:\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "사용한 쿼리: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid ""
+"btree index \"%s.%s.%s\": btree checking function returned unexpected number "
+"of rows: %d"
+msgstr "btree ì¸ë±ìŠ¤ “%s.%s.%sâ€: btree í™•ì¸ ì¤‘ì— ì˜ˆê¸°ì¹˜ ì•Šì€ í–‰ìˆ˜ë¥¼ 반환함: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%s 버전과 amcheckì˜ ë²„ì „ì´ í˜¸í™˜ 가능합니까?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree ì¸ë±ìŠ¤ “%s.%s.%sâ€:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s ê°€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ 개체 ì†ìƒ 여부를 검사합니다.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [옵션]... [DBì´ë¦„]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"사용가능한 옵션들:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, —all 모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 검사\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, —database=PATTERN ì¼ì¹˜í•˜ëŠ” 모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 검사\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr ""
+" -D, —exclude-database=PATTERN ì¼ì¹˜í•˜ëŠ” ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 제외 하고 검사\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, —index=PATTERN ì¼ì¹˜í•˜ëŠ” ì¸ë±ìŠ¤ë¥¼ 검사\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, —exclude-index=PATTERN ì¼ì¹˜í•˜ëŠ” ì¸ë±ìŠ¤ë¥¼ 제외하고 검사\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, —relation=PATTERN ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ 검사\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, —exclude-relation=PATTERN ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ 제외하고 검사\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, —schema=PATTERN ì¼ì¹˜í•˜ëŠ” 스키마를 검사\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, —exclude-schema=PATTERN ì¼ì¹˜í•˜ëŠ” 스키마를 제외하고 검사\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, —table=PATTERN ì¼ì¹˜í•˜ëŠ” í…Œì´ë¸”ì„ ê²€ì‚¬\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, —exclude-table=PATTERN ì¼ì¹˜í•˜ëŠ” í…Œì´ë¸”ì„ ì œì™¸í•˜ê³  검사\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid ""
+" --no-dependent-indexes do NOT expand list of relations to include "
+"indexes\n"
+msgstr " —no-dependent-indexes 릴레ì´ì…˜ì— ì¸ë±ìŠ¤ë¥¼ í¬í•¨í•˜ì§€ ì•ŠìŒ \n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+" --no-dependent-toast do NOT expand list of relations to include "
+"TOAST tables\n"
+msgstr ""
+" —no-dependent-toast 릴레ì´ì…˜ì— TOAST í…Œì´ë¸”ì„ í¬í•¨í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+" --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" —no-strict-names 개체가 패턴과 ì¼ì¹˜í•˜ì§€ ì•Šì•„ë„ í—ˆìš©í•¨\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"í…Œì´ë¸” 검사 옵션들:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid ""
+" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " —exclude-toast-pointers TOAST í¬ì¸í„°ë¥¼ 확ì¸í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid ""
+" --on-error-stop stop checking at end of first corrupt "
+"page\n"
+msgstr " —on-error-stop ì†ìƒëœ 페ì´ì§€ ëì—ì„œ 검사를 멈춤\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid ""
+" --skip=OPTION do NOT check \"all-frozen\" or \"all-"
+"visible\" blocks\n"
+msgstr ""
+" —skip=OPTION “all-frozen†ë˜ëŠ” “all-visible†블ë¡ì„ 검사"
+"하지 ì•ŠìŒ\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+" --startblock=BLOCK begin checking table(s) at the given block "
+"number\n"
+msgstr ""
+" —startblock=BLOCK ì§€ì •ëœ ë¸”ë¡ ë²ˆí˜¸ë¶€í„° í…Œì´ë¸” 검사를 시작\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid ""
+" --endblock=BLOCK check table(s) only up to the given block "
+"number\n"
+msgstr ""
+" —endblock=BLOCK ì§€ì •ëœ ë¸”ë¡ ë²ˆí˜¸ê¹Œì§€ í…Œì´ë¸” 검사 마침 \n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B-tree ì¸ë±ìŠ¤ 검사 옵션들:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid ""
+" --heapallindexed check that all heap tuples are found "
+"within indexes\n"
+msgstr ""
+" —heapallindexed 모든 heap íŠœí”Œì´ ì¸ë±ìŠ¤ ë‚´ì— ìžˆëŠ”ì§€ 검사\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+" --parent-check check index parent/child relationships\n"
+msgstr " —parent-check ì¸ë±ìŠ¤ì˜ 부모/ìžì‹ 관계를 검사\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid ""
+" --rootdescend search from root page to refind tuples\n"
+msgstr " —rootdescend 루트 페ì´ì§€ 부터 íŠœí”Œì„ ë‹¤ì‹œ ì°¾ìŒ \n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, —host=HOSTNAME ë°ì´í„°ë² ì´ìŠ¤ 서버 호스트 ë˜ëŠ” ì†Œì¼“ì˜ ë””ë ‰í„°"
+"리\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, —port=PORT ë°ì´í„°ë² ì´ìŠ¤ 서버 í¬íŠ¸\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, —username=USERNAME ì—°ê²°í•  유저 ì´ë¦„\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, —no-password 암호 ìž…ë ¥ 프롬프트가 나타나지 ì•ŠìŒ\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, —password 암호 입력 프롬프트가 나타남\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " —maintenance-db=DBNAME 대체 ì—°ê²° ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"기타 옵션:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo 서버로 보내는 ëª…ë ¹ë“¤ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"the server\n"
+msgstr " -j, —jobs=NUM ì„œë²„ì— ë™ì‹œ ì—°ê²°í•  수를 지정\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, —progress 진행 사항 정보를 보여줌\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose ìž‘ì—…ë‚´ì—­ì˜ ìžì„¸í•œ 출력\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " —install-missing 누ë½ëœ ìµìŠ¤í…ì…˜ì„ ì„¤ì¹˜\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ë„움ë§ì„ 표시하고 종료\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s 릴레ì´ì…˜ (%d%%), %*s/%s 페ì´ì§€ (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s 릴레ì´ì…˜ (%d%%), %*s/%s 페ì´ì§€ (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s 릴레ì´ì…˜ (%d%%), %*s/%s 페ì´ì§€ (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "바르지 못한 규정 ì´ë¦„(ì ìœ¼ë¡œ êµ¬ë¶„ëœ ì´ë¦„ì´ ë„ˆë¬´ 많ìŒ): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "바르지 못한 릴레ì´ì…˜ ì´ë¦„(ì ìœ¼ë¡œ êµ¬ë¶„ëœ ì´ë¦„ì´ ë„ˆë¬´ 많ìŒ): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "“%s†ë°ì´í„°ë² ì´ìŠ¤ë¥¼ í¬í•¨í•©ë‹ˆë‹¤"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "내부 오류: 올바르지 ì•Šì€ ë°ì´í„°ë² ì´ìŠ¤ 패턴 ì•„ì´ë”” %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” ì—°ê²° 가능한 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "내부 오류: 올바르지 ì•Šì€ ë¦´ë ˆì´ì…˜ 패턴 ì•„ì´ë”” %d"
diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build
new file mode 100644
index 0000000..618de4f
--- /dev/null
+++ b/src/bin/pg_amcheck/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_amcheck-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_amcheck/po/ru.po b/src/bin/pg_amcheck/po/ru.po
new file mode 100644
index 0000000..c6be3ba
--- /dev/null
+++ b/src/bin/pg_amcheck/po/ru.po
@@ -0,0 +1,607 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-28 07:59+0300\n"
+"PO-Revision-Date: 2022-09-05 13:33+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Сигнал отмены отправлен\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе %s (нехватка памÑти)"
+
+#: ../../fe_utils/connect_utils.c:116
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "ошибка при выполнении запроÑа: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "ВыполнÑлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "недопуÑтимый аргумент параметра %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "неверный начальный блок"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "начальный блок вне допуÑтимых пределов"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "неверный конечный блок"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "конечный блок вне допуÑтимых пределов"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "конечный блок предшеÑтвует начальному"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ñ --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ одновременно Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных и шаблоны имён"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "не указаны базы Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "база данных \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "база \"%s\" пропуÑкаетÑÑ: раÑширение amcheck не уÑтановлено"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "база \"%s\": иÑпользуетÑÑ amcheck верÑии \"%s\" в Ñхеме \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "не найдены подлежащие проверке базовые таблицы, ÑоответÑтвующие \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "не найдены подлежащие проверке индекÑÑ‹ btree, ÑоответÑтвующие \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr ""
+"не найдены подлежащие проверке Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð² Ñхемах, ÑоответÑтвующих \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "не найдены подлежащие проверке отношениÑ, ÑоответÑтвующие \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "не найдены Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "проверка базовой таблицы \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "проверка индекÑа btree \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "ошибка передачи команды базе \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "ВыполнÑлаÑÑŒ команда: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\", блок %s, Ñмещение %s, атрибут %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\", блок %s, Ñмещение %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\", блок %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "запроÑ: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid ""
+"btree index \"%s.%s.%s\": btree checking function returned unexpected number "
+"of rows: %d"
+msgstr ""
+"Ð¸Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\": Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ btree выдала неожиданное "
+"количеÑтво Ñтрок: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "СовмеÑтимы ли верÑии %s и amcheck?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s проверÑет объекты в базе данных PostgreSQL на предмет повреждений.\n"
+"\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Параметры выбора объектов:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all проверить вÑе базы\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr ""
+" -d, --database=ШÐБЛОРпроверить ÑоответÑтвующие шаблону базы\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr ""
+" -D, --exclude-database=ШÐБЛОРне проверÑÑ‚ÑŒ ÑоответÑтвующие шаблону базы\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr ""
+" -i, --index=ШÐБЛОРпроверить ÑоответÑтвующие шаблону индекÑÑ‹\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr ""
+" -I, --exclude-index=ШÐБЛОРне проверÑÑ‚ÑŒ ÑоответÑтвующие шаблону "
+"индекÑÑ‹\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr ""
+" -r, --relation=ШÐБЛОРпроверить ÑоответÑтвующие шаблону "
+"отношениÑ\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr ""
+" -R, --exclude-relation=ШÐБЛОРне проверÑÑ‚ÑŒ ÑоответÑтвующие шаблону "
+"отношениÑ\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr ""
+" -s, --schema=ШÐБЛОРпроверить ÑоответÑтвующие шаблону Ñхемы\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr ""
+" -S, --exclude-schema=ШÐБЛОРне проверÑÑ‚ÑŒ ÑоответÑтвующие шаблону "
+"Ñхемы\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr ""
+" -t, --table=ШÐБЛОРпроверить ÑоответÑтвующие шаблону таблицы\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr ""
+" -T, --exclude-table=ШÐБЛОРне проверÑÑ‚ÑŒ ÑоответÑтвующие шаблону "
+"таблицы\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid ""
+" --no-dependent-indexes do NOT expand list of relations to include "
+"indexes\n"
+msgstr ""
+" --no-dependent-indexes не включать в ÑпиÑок проверÑемых отношений "
+"индекÑÑ‹\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+" --no-dependent-toast do NOT expand list of relations to include "
+"TOAST tables\n"
+msgstr ""
+" --no-dependent-toast не включать в ÑпиÑок проверÑемых отношений "
+"TOAST-таблицы\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+" --no-strict-names do NOT require patterns to match objects\n"
+msgstr ""
+" --no-strict-names не требовать Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð², "
+"ÑоответÑтвующих шаблонам\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Параметры проверки таблиц:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid ""
+" --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr ""
+" --exclude-toast-pointers не переходить по указателÑм в TOAST\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid ""
+" --on-error-stop stop checking at end of first corrupt "
+"page\n"
+msgstr ""
+" --on-error-stop прекратить проверку по доÑтижении конца "
+"первой повреждённой Ñтраницы\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid ""
+" --skip=OPTION do NOT check \"all-frozen\" or \"all-"
+"visible\" blocks\n"
+msgstr ""
+" --skip=ТИП_БЛОКРне проверÑÑ‚ÑŒ блоки типа \"all-frozen\" или "
+"\"all-visible\"\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+" --startblock=BLOCK begin checking table(s) at the given block "
+"number\n"
+msgstr ""
+" --startblock=БЛОК начать проверку таблиц(Ñ‹) Ñ Ð±Ð»Ð¾ÐºÐ° Ñ "
+"заданным номером\n"
+
+# skip-rule: no-space-before-parentheses
+#: pg_amcheck.c:1161
+#, c-format
+msgid ""
+" --endblock=BLOCK check table(s) only up to the given block "
+"number\n"
+msgstr ""
+" --endblock=БЛОК проверить таблицы(у) до блока Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ "
+"номером\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Параметры проверки индекÑов-B-деревьев:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid ""
+" --heapallindexed check that all heap tuples are found "
+"within indexes\n"
+msgstr ""
+" --heapallindexed проверить, что вÑем кортежам кучи "
+"находитÑÑ ÑоответÑтвие в индекÑах\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+" --parent-check check index parent/child relationships\n"
+msgstr ""
+" --parent-check проверить ÑвÑзи родитель/потомок в "
+"индекÑах\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid ""
+" --rootdescend search from root page to refind tuples\n"
+msgstr ""
+" --rootdescend перепроверÑÑ‚ÑŒ поиÑк кортежей от корневой "
+"Ñтраницы\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключениÑ:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог "
+"Ñокетов\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº "
+"Ñерверу\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запроÑить пароль\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ИМЯ_БД Ð´Ñ€ÑƒÐ³Ð°Ñ Ð¾Ð¿Ð¾Ñ€Ð½Ð°Ñ Ð±Ð°Ð·Ð° данных\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Другие параметры:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr ""
+" -e, --echo отображать команды, отправлÑемые Ñерверу\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"the server\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО уÑтанавливать заданное чиÑло подключений к "
+"Ñерверу\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing уÑтановить недоÑтающие раÑширениÑ\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "отношений: %*s/%s (%d%%), Ñтраниц: %*s/%s (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "отношений: %*s/%s (%d%%), Ñтраниц: %*s/%s (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "отношений: %*s/%s (%d%%), Ñтраниц: %*s/%s (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неверное Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ (Ñлишком много компонентов): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "выбираетÑÑ Ð±Ð°Ð·Ð° \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: получен неожиданный идентификатор шаблона базы %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr ""
+"не найдены подлежащие проверке доÑтупные базы, ÑоответÑтвующие шаблону \"%s\""
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr ""
+"внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: получен неожиданный идентификатор шаблона Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %d"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "чиÑло параллельных заданий должно быть не меньше 1"
diff --git a/src/bin/pg_amcheck/po/sv.po b/src/bin/pg_amcheck/po/sv.po
new file mode 100644
index 0000000..2a9ee08
--- /dev/null
+++ b/src/bin/pg_amcheck/po/sv.po
@@ -0,0 +1,546 @@
+# SWEDISH message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:50+0000\n"
+"PO-Revision-Date: 2023-09-05 08:59+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Förfrågan om avbrytning skickad\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Kunde inte skicka förfrågan om avbrytning: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "kunde inte ansluta till databas %s: slut på minne"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1645 pg_amcheck.c:2090
+#, c-format
+msgid "query failed: %s"
+msgstr "fråga misslyckades: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091
+#, c-format
+msgid "Query was: %s"
+msgstr "Frågan var: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ogiltigt argument för flaggan %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "ogiltigt startblock"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "startblocket utanför giltig gräns"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "ogiltigt slutblock"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "slutblocket utanför giltig gräns"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "slutblocket kommer före startblocket"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "kan inte ange databasnamn tillsammans med --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "kan inte ange både ett databasnamn och ett databasmönster"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "inga databaser att kontrollera"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "databas \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "hoppar över databas \"%s\": amcheck är inte installerad"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "i databas \"%s\": använder amcheck version \"%s\" i schema \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "finns inga heap-tabeller för att kontrollera matchning \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "finns inga btree-index för att kontrollera matching \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "finns inga relationer att kontrollera i schemamatchning \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "finns inga relations för att kontrollera matching \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "finns inga relationer att kontrollera"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "kontrollerar heap-tabell \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "kontrollerar btree-index \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "fel vid skickande av kommando till databas \"%s\": %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Kommandot var: %s"
+
+#: pg_amcheck.c:1013
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s, attribut %s:\n"
+
+#: pg_amcheck.c:1020
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s:\n"
+
+#: pg_amcheck.c:1026
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "heap-tabell \"%s.%s.%s\", block %s:\n"
+
+#: pg_amcheck.c:1031 pg_amcheck.c:1042
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "heap-tabell \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1046 pg_amcheck.c:1115
+#, c-format
+msgid "query was: %s\n"
+msgstr "frågan var: %s\n"
+
+#: pg_amcheck.c:1097
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btree-index \"%s.%s.%s\": kontrollfunktion för btree returnerade oväntat antal rader: %d"
+
+#: pg_amcheck.c:1101
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Är versionerna på %s och amcheck kompatibla?"
+
+#: pg_amcheck.c:1111
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree-index \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1136
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s kontrollerar objekt i en PostgreSQL-database för att hitta korruption.\n"
+"\n"
+
+#: pg_amcheck.c:1137
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [FLAGGA]... [DBNAMN]\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"Flaggor för destinationen:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all kontrollera alla databaser\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=MALL kontrollera matchande databas(er)\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=MALL kontrollera INTE matchande databas(er)\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=MALL kontrollera matchande index\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=MALL kontrollera INTE matchande index\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=MALL kontrollera matchande relation(er)\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=MALL kontrollera INTE matchande relation(er)\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=MALL kontrollera matchande schema(n)\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=MALL kontrollera INTE matchande schema(n)\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=MALL kontollera matchande tabell(er)\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=MALL kontollera INTE matchande tabell(er)\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes expandera INTE listan med relationer för att inkludera index\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast expandera inte listan av relationer för att inkludera TOAST-tabeller\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names kräv INTE mallar för matcha objekt\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"Flaggor för kontroll av tabeller:\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers följ INTE relationers TOAST-pekare\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop sluta kontrollera efter första korrupta sidan\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=FLAGGA kontrollera INTE block som är \"all-frozen\" eller \"all-visible\"\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK börja kontollera tabell(er) vid angivet blocknummer\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK kontrollera tabell(er) fram till angivet blocknummer\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"Flaggor för kontroll av B-tree-index:\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed kontrollera att alla heap-tupler hittas i index\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check kontrollera förhållandet mellan barn/förälder i index\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend sök från root-sidan för att återfinna tupler\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga ej efter lösenord\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password tvinga fram lösenordsfråga\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAMN val av underhållsdatabas\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"Andra flaggor:\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM antal samtidiga anslutningar till servern\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing installera utökningar som saknas\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_amcheck.c:1234
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) %*s"
+
+#: pg_amcheck.c:1245
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1260
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%)"
+
+#: pg_amcheck.c:1319 pg_amcheck.c:1352
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s"
+
+#: pg_amcheck.c:1397
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ej korrekt relationsnamn (för många namn med punkt): %s"
+
+#: pg_amcheck.c:1550 pg_amcheck.c:1689
+#, c-format
+msgid "including database \"%s\""
+msgstr "inkludera databas \"%s\""
+
+#: pg_amcheck.c:1671
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "internt fel: tog emot oväntat pattern_id %d för databas"
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "finns inga anslutningsbara databaser att kontrollera som matchar \"%s\""
+
+#: pg_amcheck.c:2131
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "internt fel: tog emot oväntat pattern_id %d för relation"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#, c-format
+#~ msgid "command was: %s"
+#~ msgstr "kommandot var: %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatalt: "
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "antalet parallella jobb måste vara minst 1"
diff --git a/src/bin/pg_amcheck/po/uk.po b/src/bin/pg_amcheck/po/uk.po
new file mode 100644
index 0000000..601e043
--- /dev/null
+++ b/src/bin/pg_amcheck/po/uk.po
@@ -0,0 +1,516 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:50+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_amcheck.pot\n"
+"X-Crowdin-File-ID: 892\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не можливо під'єднатиÑÑ Ð´Ð¾ бази даних %s: не виÑтачає пам'ÑÑ‚Ñ–"
+
+#: ../../fe_utils/connect_utils.c:117
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "запит не вдавÑÑ: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "Запит був: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "неприпуÑтимий початковий блок"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "початковий блок поза межами"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "неприпуÑтимий кінцевий блок"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "кінцевий блок поза межами"
+
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "кінцевий блок передує початковому блоку"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "не можна вказати назву бази даних з --all"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "не можна вказати одночаÑно ім'Ñ Ð±Ð°Ð·Ð¸ даних Ñ– шаблони бази даних"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "немає баз даних Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "база даних \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "пропуÑк бази даних \"%s\": amcheck не вÑтановлено"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "у базі даних \"%s\": викориÑтовуєтьÑÑ amcheck верÑÑ–Ñ— \"%s\" у Ñхемі \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "немає таблиць в динамічній пам'ÑÑ‚Ñ– Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ відповідноÑÑ‚Ñ– \"%s\""
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "немає індекÑів btree Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ відповідноÑÑ‚Ñ– \"%s\""
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "немає відношень Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ в Ñхемах, відповідних \"%s\""
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "немає відношень Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ відповідноÑÑ‚Ñ– \"%s\""
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "немає зв'Ñзків Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "перевірка таблиць динамічної пам'ÑÑ‚Ñ– \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "перевірка індекÑу btree \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ до бази даних \"%s: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "Команда була: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'ÑÑ‚Ñ– \"%s.%s.%s\", блок %s, зÑув %s, атрибут %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'ÑÑ‚Ñ– \"%s.%s.%s\", блок %s, зÑув %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'ÑÑ‚Ñ– \"%s.%s.%s\", блок %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'ÑÑ‚Ñ– \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "запит був: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "Ñ–Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\": Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ btree повернула неочікувану кількіÑÑ‚ÑŒ Ñ€Ñдків: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "Чи ÑуміÑні верÑÑ–Ñ— %s Ñ– amcheck?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "Ñ–Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid "%s checks objects in a PostgreSQL database for corruption.\n\n"
+msgstr "%s перевірÑÑ” об'єкти бази даних PostgreSQL на пошкодженнÑ.\n\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid "\n"
+"Target options:\n"
+msgstr "\n"
+"Цільові параметри:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all перевірити вÑÑ– бази даних\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN перевірити відповідні бази даних\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN ÐЕ перевірÑти відповідні бази даних\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN перевірити відповідні індекÑи\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN ÐЕ перевірÑти відповідні індекÑи\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN перевірити відповідні відношеннÑ\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN ÐЕ перевірÑти відповідні відношеннÑ\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN перевірити відповідні Ñхеми\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN ÐЕ перевірÑти відповідні Ñхеми\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN перевірити відповідні таблиці\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN ÐЕ перевірÑти відповідні таблиці\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes ÐЕ розширювати ÑпиÑок відноÑин, щоб включити індекÑи\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast ÐЕ розширювати ÑпиÑок відноÑин, щоб включити таблиці TOAST\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names ÐЕ вимагати відповідноÑÑ‚Ñ– шаблонів об'єктам\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid "\n"
+"Table checking options:\n"
+msgstr "\n"
+"Параметри перевірки таблиць:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers ÐЕ Ñлідувати покажчикам відношень TOAST\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop зупинити перевірку наприкінці першої пошкодженої Ñторінки\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION ÐЕ перевірÑти \"вÑÑ– заморожені\" або \"вÑÑ– видимі\" блоки\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK почати перевірку таблиць за поданим номером блоку\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK перевірÑти таблиці лише до поданого номеру блоку\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid "\n"
+"B-tree index checking options:\n"
+msgstr "\n"
+"Параметри перевірки індекÑів B-tree:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed перевірити чи вÑÑ– кортежі динамічної пам'ÑÑ‚Ñ– міÑÑ‚ÑÑ‚ÑŒÑÑ Ð² індекÑах\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check перевірити Ñ–Ð½Ð´ÐµÐºÑ Ð±Ð°Ñ‚ÑŒÐºÑ–Ð²Ñьких/дочірніх відноÑин\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend шукати з кореневої Ñторінки, Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ пошуку кортежів\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT порт Ñерверу бази даних\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password примуÑовий запит паролÑ\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME база даних альтернативного обÑлуговуваннÑ\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid "\n"
+"Other options:\n"
+msgstr "\n"
+"Інші параметри:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM викориÑтати цю кількіÑÑ‚ÑŒ одночаÑних з'єднань з Ñервером\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показати інформацію про прогреÑ\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато інформації\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing вÑтановити відÑутні розширеннÑ\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю Ñправку, потім вийти\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s відношень (%d%%), %*s/%s Ñторінок (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s відношень (%d%%), %*s/%s Ñторінок (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s відношень (%d%%), %*s/%s Ñторінок (%d%%)"
+
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неправильне повне ім'Ñ (забагато компонентів): %s"
+
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неправильне ім'Ñ Ð·Ð²'Ñзку (забагато компонентів): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "включаючи базу даних \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: отримано неочікувану помилку шаблону бази даних %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "немає бази даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ, щоб перевірити відповідніÑÑ‚ÑŒ\"%s\""
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: отримано неочікувану помилку шаблону Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %d"
+
diff --git a/src/bin/pg_amcheck/po/zh_CN.po b/src/bin/pg_amcheck/po/zh_CN.po
new file mode 100644
index 0000000..5ca9f01
--- /dev/null
+++ b/src/bin/pg_amcheck/po/zh_CN.po
@@ -0,0 +1,500 @@
+# LANGUAGE message translation file for pg_amcheck
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Jie Zhang <zhangjie2@fujitsu.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的:"
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "å–消å‘é€çš„请求\n"
+
+#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210
+msgid "Could not send cancel request: "
+msgstr "无法å‘é€å–消请求: "
+
+#: ../../fe_utils/connect_utils.c:92
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "无法连接到数æ®åº“ %s:内存ä¸è¶³"
+
+#: ../../fe_utils/connect_utils.c:120
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1646 pg_amcheck.c:2085
+#, c-format
+msgid "query failed: %s"
+msgstr "查询失败: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:597 pg_amcheck.c:1116 pg_amcheck.c:1647 pg_amcheck.c:2086
+#, c-format
+msgid "query was: %s"
+msgstr "查询是: %s"
+
+#: pg_amcheck.c:332
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "并行工作的数é‡å¿…须至少为1"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "选项%sçš„å‚数无效"
+
+#: pg_amcheck.c:413
+#, c-format
+msgid "invalid start block"
+msgstr "起始å—无效"
+
+#: pg_amcheck.c:418
+#, c-format
+msgid "start block out of bounds"
+msgstr "起始å—超出范围"
+
+#: pg_amcheck.c:426
+#, c-format
+msgid "invalid end block"
+msgstr "无效的结æŸå—"
+
+#: pg_amcheck.c:431
+#, c-format
+msgid "end block out of bounds"
+msgstr "结æŸå—超出范围"
+
+#: pg_amcheck.c:455 pg_amcheck.c:481
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_amcheck.c:463
+#, c-format
+msgid "end block precedes start block"
+msgstr "结æŸå—在开始å—之å‰"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_amcheck.c:500
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "无法使用--all指定数æ®åº“å称"
+
+#: pg_amcheck.c:509
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "ä¸èƒ½åŒæ—¶æŒ‡å®šæ•°æ®åº“å称和数æ®åº“模å¼"
+
+#: pg_amcheck.c:539
+#, c-format
+msgid "no databases to check"
+msgstr "没有è¦æ£€æŸ¥çš„æ•°æ®åº“"
+
+#: pg_amcheck.c:595
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "æ•°æ®åº“ \"%s\": %s"
+
+#: pg_amcheck.c:606
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "正在跳过数æ®åº“\"%s\":未安装amcheck"
+
+#: pg_amcheck.c:614
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "在数æ®åº“\"%1$s\"中:在模å¼\"%3$s\"中使用amcheck版本\"%2$s\""
+
+#: pg_amcheck.c:638
+msgid "no heap tables to check matching \"%s\""
+msgstr "没有è¦æ£€æŸ¥åŒ¹é…\"%s\"的堆表"
+
+#: pg_amcheck.c:641
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "没有è¦æ£€æŸ¥åŒ¹é…\"%s\"çš„B树索引"
+
+#: pg_amcheck.c:644
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "在模å¼ä¸­æ²¡æœ‰è¦æ£€æŸ¥åŒ¹é…\"%s\"的关系"
+
+#: pg_amcheck.c:647
+msgid "no relations to check matching \"%s\""
+msgstr "没有è¦æ£€æŸ¥åŒ¹é…\"%s\"的关系"
+
+#: pg_amcheck.c:676
+#, c-format
+msgid "no relations to check"
+msgstr "没有è¦æ£€æŸ¥çš„关系"
+
+#: pg_amcheck.c:762
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "正在检查堆表\"%s.%s.%s\""
+
+#: pg_amcheck.c:778
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "检查B树索引\"%s.%s.%s\""
+
+#: pg_amcheck.c:911
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "å‘æ•°æ®åº“\"%s\"å‘é€å‘½ä»¤æ—¶å‡ºé”™: %s"
+
+#: pg_amcheck.c:914
+#, c-format
+msgid "command was: %s"
+msgstr "命令是: %s"
+
+#: pg_amcheck.c:1031
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "堆表\"%s.%s.%s\",å—%s,å移é‡%s,属性%s:\n"
+
+#: pg_amcheck.c:1038
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "堆表\"%s.%s.%s\",å—%s,å移é‡%s:\n"
+
+#: pg_amcheck.c:1044
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "堆表\"%s.%s.%s\",å—%s:\n"
+
+#: pg_amcheck.c:1049 pg_amcheck.c:1060
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "堆表\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1064 pg_amcheck.c:1131
+msgid "query was: %s\n"
+msgstr "查询是: %s\n"
+
+#: pg_amcheck.c:1113
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "B树索引\"%s.%s.%s\":B树检查函数返回了æ„外的行数: %d"
+
+#: pg_amcheck.c:1117
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%s和amcheck的版本兼容�"
+
+#: pg_amcheck.c:1127
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "B树索引\"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr ""
+"%s检查PostgreSQLæ•°æ®åº“中的对象是å¦æŸå.\n"
+"\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [选项]... [æ•°æ®åº“åå­—]\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"目标选项:\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all 检查所有数æ®åº“\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN 检查匹é…çš„æ•°æ®åº“\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN ä¸æ£€æŸ¥åŒ¹é…çš„æ•°æ®åº“\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN 检查匹é…的索引\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN ä¸æ£€æŸ¥åŒ¹é…的索引\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN 检查匹é…的关系\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN ä¸æ£€æŸ¥åŒ¹é…的关系\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN 检查匹é…的模å¼\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN ä¸æ£€æŸ¥åŒ¹é…模å¼\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN 检查匹é…的表\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN ä¸æ£€æŸ¥åŒ¹çš„é…表\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes ä¸è¦å±•å¼€å…³ç³»åˆ—表以包å«ç´¢å¼•\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast ä¸è¦å±•å¼€å…³ç³»åˆ—表以包括TOAST表\n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names ä¸éœ€è¦æ¨¡å¼æ¥åŒ¹é…对象\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"表检查选项:\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers ä¸è¦éµå¾ªå…³ç³»TOAST指示\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop 在第一个æŸå页的末尾åœæ­¢æ£€æŸ¥\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION ä¸è¦æ£€æŸ¥\"all-frozen\"或\"all-visible\"å—\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK 在给定的å—ç¼–å·å¤„开始检查表\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK 检查表仅é™äºŽç»™å®šçš„å—ç¼–å·\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B树索引检查选项:\n"
+
+#: pg_amcheck.c:1177
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed 检查是å¦åœ¨ç´¢å¼•ä¸­æ‰¾åˆ°æ‰€æœ‰å †å…ƒç»„\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check 检查索引父/å­å…³ç³»\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend 从根页æœç´¢åˆ°é‡æ–°å¡«å……元组\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"è”接选项:\n"
+
+#: pg_amcheck.c:1181
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME æ•°æ®åº“æœåŠ¡å™¨ä¸»æœºæˆ–套接字目录\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT æ•°æ®åº“æœåŠ¡å™¨ç«¯å£\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME è¦è¿žæŽ¥çš„用户å\n"
+
+#: pg_amcheck.c:1184
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 从ä¸æ示输入密ç \n"
+
+#: pg_amcheck.c:1185
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 强制密ç æ示\n"
+
+#: pg_amcheck.c:1186
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 备用维护数æ®åº“\n"
+
+#: pg_amcheck.c:1187
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"其它选项:\n"
+
+#: pg_amcheck.c:1188
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示å‘é€åˆ°æœåŠ¡ç«¯çš„命令\n"
+
+#: pg_amcheck.c:1189
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM 使用这么多到æœåŠ¡å™¨çš„并å‘连接\n"
+
+#: pg_amcheck.c:1190
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ä¸å†™ä»»ä½•ä¿¡æ¯\n"
+
+#: pg_amcheck.c:1191
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 显示进度信æ¯\n"
+
+#: pg_amcheck.c:1192
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大é‡çš„输出\n"
+
+#: pg_amcheck.c:1193
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_amcheck.c:1194
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing 安装缺少的扩展\n"
+
+#: pg_amcheck.c:1195
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_amcheck.c:1197
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_amcheck.c:1198
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_amcheck.c:1256
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%) %*s"
+
+#: pg_amcheck.c:1267
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1282
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s 关系 (%d%%), %*s/%s 页 (%d%%)"
+
+#: pg_amcheck.c:1551 pg_amcheck.c:1693
+#, c-format
+msgid "including database \"%s\""
+msgstr "包å«çš„æ•°æ®åº“\"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "内部错误:收到æ„外的数æ®åº“pattern_id %d"
+
+#: pg_amcheck.c:1677
+msgid "no connectable databases to check matching \"%s\""
+msgstr "没有å¯è¿žæŽ¥çš„æ•°æ®åº“æ¥æ£€æŸ¥åŒ¹é…çš„\"%s\""
+
+#: pg_amcheck.c:2127
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "内部错误:收到æ„外的关系pattern_id %d"
diff --git a/src/bin/pg_amcheck/po/zh_TW.po b/src/bin/pg_amcheck/po/zh_TW.po
new file mode 100644
index 0000000..96a82be
--- /dev/null
+++ b/src/bin/pg_amcheck/po/zh_TW.po
@@ -0,0 +1,538 @@
+# Traditional Chinese message translation file for pg_amcheck
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_amcheck (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:51+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "已傳é€å–消請求\n"
+
+# fe-connect.c:1427
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "無法傳é€å–消請求: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "無法連線至資料庫 %s: 記憶體ä¸è¶³"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: ../../fe_utils/connect_utils.c:116
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+# utils/adt/formatting.c:2044
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "值 \"%s\" å°æ–¼ \"%s\" 是無效的"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#: pg_amcheck.c:1647 pg_amcheck.c:2092
+#, c-format
+msgid "query failed: %s"
+msgstr "查詢失敗: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093
+#, c-format
+msgid "Query was: %s"
+msgstr "查詢是: %s"
+
+#: pg_amcheck.c:399
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ"
+
+#: pg_amcheck.c:405
+#, c-format
+msgid "invalid start block"
+msgstr "起始å€å¡Šç„¡æ•ˆ"
+
+#: pg_amcheck.c:407
+#, c-format
+msgid "start block out of bounds"
+msgstr "起始å€å¡Šè¶…出範åœ"
+
+#: pg_amcheck.c:414
+#, c-format
+msgid "invalid end block"
+msgstr "çµæŸå€å¡Šç„¡æ•ˆ"
+
+#: pg_amcheck.c:416
+#, c-format
+msgid "end block out of bounds"
+msgstr "çµæŸå€å¡Šè¶…出範åœ"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_amcheck.c:439 pg_amcheck.c:461
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_amcheck.c:445
+#, c-format
+msgid "end block precedes start block"
+msgstr "çµæŸå€å¡Šæ—©æ–¼èµ·å§‹å€å¡Š"
+
+#: pg_amcheck.c:459
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_amcheck.c:479
+#, c-format
+msgid "cannot specify a database name with --all"
+msgstr "無法用 --all åƒæ•¸æŒ‡å®šè³‡æ–™åº«å稱"
+
+#: pg_amcheck.c:485
+#, c-format
+msgid "cannot specify both a database name and database patterns"
+msgstr "無法åŒæ™‚使用資料庫å稱和資料庫å稱表é”å¼"
+
+#: pg_amcheck.c:513
+#, c-format
+msgid "no databases to check"
+msgstr "無需檢查任何資料庫"
+
+#: pg_amcheck.c:569
+#, c-format
+msgid "database \"%s\": %s"
+msgstr "資料庫 \"%s\": %s"
+
+#: pg_amcheck.c:580
+#, c-format
+msgid "skipping database \"%s\": amcheck is not installed"
+msgstr "è·³éŽè³‡æ–™åº« \"%s\": æœªå®‰è£ amcheck"
+
+#: pg_amcheck.c:588
+#, c-format
+msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\""
+msgstr "在資料庫 \"%s\": schema \"%s\" 使用 amcheck 版本 \"%s\""
+
+#: pg_amcheck.c:610
+#, c-format
+msgid "no heap tables to check matching \"%s\""
+msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„ heap 資料表需è¦æª¢æŸ¥"
+
+#: pg_amcheck.c:613
+#, c-format
+msgid "no btree indexes to check matching \"%s\""
+msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„ btree 索引需è¦æª¢æŸ¥"
+
+#: pg_amcheck.c:616
+#, c-format
+msgid "no relations to check in schemas matching \"%s\""
+msgstr "ç¬¦åˆ \"%s\" çš„ schema 中沒有關è¯éœ€è¦æª¢æŸ¥"
+
+#: pg_amcheck.c:619
+#, c-format
+msgid "no relations to check matching \"%s\""
+msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„é—œè¯éœ€è¦æª¢æŸ¥"
+
+#: pg_amcheck.c:647
+#, c-format
+msgid "no relations to check"
+msgstr "沒有關è¯éœ€è¦æª¢æŸ¥"
+
+#: pg_amcheck.c:730
+#, c-format
+msgid "checking heap table \"%s.%s.%s\""
+msgstr "檢查 heap 資料表 \"%s.%s.%s\""
+
+#: pg_amcheck.c:746
+#, c-format
+msgid "checking btree index \"%s.%s.%s\""
+msgstr "檢查 btree 索引 \"%s.%s.%s\""
+
+#: pg_amcheck.c:893
+#, c-format
+msgid "error sending command to database \"%s\": %s"
+msgstr "傳é€å‘½ä»¤è‡³è³‡æ–™åº« \"%s\" 發生錯誤: %s"
+
+#: pg_amcheck.c:896
+#, c-format
+msgid "Command was: %s"
+msgstr "命令是: %s"
+
+#: pg_amcheck.c:1015
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n"
+msgstr "heap 資料表 \"%s.%s.%s\",å€å¡Š %s,ä½ç§» %s,屬性 %s:\n"
+
+#: pg_amcheck.c:1022
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n"
+msgstr "heap 資料表 \"%s.%s.%s\",å€å¡Š %s,ä½ç§» %s:\n"
+
+#: pg_amcheck.c:1028
+#, c-format
+msgid "heap table \"%s.%s.%s\", block %s:\n"
+msgstr "heap 資料表 \"%s.%s.%s\",å€å¡Š %s:\n"
+
+#: pg_amcheck.c:1033 pg_amcheck.c:1044
+#, c-format
+msgid "heap table \"%s.%s.%s\":\n"
+msgstr "heap 資料表 \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1048 pg_amcheck.c:1117
+#, c-format
+msgid "query was: %s\n"
+msgstr "查詢是: %s\n"
+
+#: pg_amcheck.c:1099
+#, c-format
+msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d"
+msgstr "btree 索引 \"%s.%s.%s\": btree 檢查函數回傳éžé æœŸæ•¸é‡çš„資料列: %d"
+
+#: pg_amcheck.c:1103
+#, c-format
+msgid "Are %s's and amcheck's versions compatible?"
+msgstr "%s å’Œ amcheck 的版本是å¦ç›¸å®¹?"
+
+#: pg_amcheck.c:1113
+#, c-format
+msgid "btree index \"%s.%s.%s\":\n"
+msgstr "btree 索引 \"%s.%s.%s\":\n"
+
+#: pg_amcheck.c:1138
+#, c-format
+msgid ""
+"%s checks objects in a PostgreSQL database for corruption.\n"
+"\n"
+msgstr "%s 檢查 PostgreSQL 資料庫中的物件是å¦æ壞。\n"
+
+#: pg_amcheck.c:1139
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_amcheck.c:1140
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_amcheck.c:1141
+#, c-format
+msgid ""
+"\n"
+"Target options:\n"
+msgstr ""
+"\n"
+"目標é¸é …:\n"
+
+#: pg_amcheck.c:1142
+#, c-format
+msgid " -a, --all check all databases\n"
+msgstr " -a, --all 檢查所有資料庫\n"
+
+#: pg_amcheck.c:1143
+#, c-format
+msgid " -d, --database=PATTERN check matching database(s)\n"
+msgstr " -d, --database=PATTERN 檢查符åˆçš„資料庫\n"
+
+#: pg_amcheck.c:1144
+#, c-format
+msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n"
+msgstr " -D, --exclude-database=PATTERN ä¸æª¢æŸ¥ç¬¦åˆçš„資料庫\n"
+
+#: pg_amcheck.c:1145
+#, c-format
+msgid " -i, --index=PATTERN check matching index(es)\n"
+msgstr " -i, --index=PATTERN 檢查符åˆçš„索引\n"
+
+#: pg_amcheck.c:1146
+#, c-format
+msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n"
+msgstr " -I, --exclude-index=PATTERN ä¸æª¢æŸ¥ç¬¦åˆçš„索引\n"
+
+#: pg_amcheck.c:1147
+#, c-format
+msgid " -r, --relation=PATTERN check matching relation(s)\n"
+msgstr " -r, --relation=PATTERN 檢查符åˆçš„é—œè¯\n"
+
+#: pg_amcheck.c:1148
+#, c-format
+msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n"
+msgstr " -R, --exclude-relation=PATTERN ä¸æª¢æŸ¥ç¬¦åˆçš„é—œè¯\n"
+
+#: pg_amcheck.c:1149
+#, c-format
+msgid " -s, --schema=PATTERN check matching schema(s)\n"
+msgstr " -s, --schema=PATTERN 檢查符åˆçš„ schema\n"
+
+#: pg_amcheck.c:1150
+#, c-format
+msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n"
+msgstr " -S, --exclude-schema=PATTERN ä¸æª¢æŸ¥ç¬¦åˆçš„ schema\n"
+
+#: pg_amcheck.c:1151
+#, c-format
+msgid " -t, --table=PATTERN check matching table(s)\n"
+msgstr " -t, --table=PATTERN 檢查符åˆçš„資料表\n"
+
+#: pg_amcheck.c:1152
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n"
+msgstr " -T, --exclude-table=PATTERN ä¸æª¢æŸ¥ç¬¦åˆçš„資料表\n"
+
+#: pg_amcheck.c:1153
+#, c-format
+msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n"
+msgstr " --no-dependent-indexes ä¸å±•é–‹é—œè¯æ¸…單以包å«ç´¢å¼•\n"
+
+#: pg_amcheck.c:1154
+#, c-format
+msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n"
+msgstr " --no-dependent-toast ä¸å±•é–‹é—œè¯æ¸…å–®ä»¥åŒ…å« TOAST 資料表\n"
+
+#: pg_amcheck.c:1155
+#, c-format
+msgid " --no-strict-names do NOT require patterns to match objects\n"
+msgstr " --no-strict-names ä¸è¦æ±‚表é”å¼å¿…須符åˆç‰©ä»¶\n"
+
+#: pg_amcheck.c:1156
+#, c-format
+msgid ""
+"\n"
+"Table checking options:\n"
+msgstr ""
+"\n"
+"資料表檢查é¸é …:\n"
+
+#: pg_amcheck.c:1157
+#, c-format
+msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n"
+msgstr " --exclude-toast-pointers ä¸è¦è¿½è¹¤é—œè¯ TOAST 指標\n"
+
+#: pg_amcheck.c:1158
+#, c-format
+msgid " --on-error-stop stop checking at end of first corrupt page\n"
+msgstr " --on-error-stop 在第一個æ壞資料é çš„çµå°¾åœæ­¢æª¢æŸ¥\n"
+
+#: pg_amcheck.c:1159
+#, c-format
+msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n"
+msgstr " --skip=OPTION ä¸æª¢æŸ¥ \"all-frozen\" 或 \"all-visible\" å€å¡Š\n"
+
+#: pg_amcheck.c:1160
+#, c-format
+msgid " --startblock=BLOCK begin checking table(s) at the given block number\n"
+msgstr " --startblock=BLOCK 從指定的å€å¡Šç·¨è™Ÿé–‹å§‹æª¢æŸ¥è³‡æ–™è¡¨\n"
+
+#: pg_amcheck.c:1161
+#, c-format
+msgid " --endblock=BLOCK check table(s) only up to the given block number\n"
+msgstr " --endblock=BLOCK åªæª¢æŸ¥è³‡æ–™è¡¨ç›´åˆ°æŒ‡å®šçš„å€å¡Šç·¨è™Ÿç‚ºæ­¢\n"
+
+#: pg_amcheck.c:1162
+#, c-format
+msgid ""
+"\n"
+"B-tree index checking options:\n"
+msgstr ""
+"\n"
+"B-tree 索引檢查é¸é …:\n"
+
+#: pg_amcheck.c:1163
+#, c-format
+msgid " --heapallindexed check that all heap tuples are found within indexes\n"
+msgstr " --heapallindexed 檢查所有 heap tuple 是å¦éƒ½åœ¨ç´¢å¼•å…§æ‰¾åˆ°\n"
+
+#: pg_amcheck.c:1164
+#, c-format
+msgid " --parent-check check index parent/child relationships\n"
+msgstr " --parent-check 檢查索引的父å­é—œä¿‚\n"
+
+#: pg_amcheck.c:1165
+#, c-format
+msgid " --rootdescend search from root page to refind tuples\n"
+msgstr " --rootdescend 從根資料é æœç´¢ä»¥é‡æ–°å°‹æ‰¾ tuple\n"
+
+#: pg_amcheck.c:1166
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"連線é¸é …:\n"
+
+#: pg_amcheck.c:1167
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ– socket 目錄\n"
+
+#: pg_amcheck.c:1168
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ \n"
+
+#: pg_amcheck.c:1169
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 連線的使用者å稱\n"
+
+#: pg_amcheck.c:1170
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ä¸è©¢å•å¯†ç¢¼\n"
+
+#: pg_amcheck.c:1171
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password è¦æ±‚è©¢å•å¯†ç¢¼\n"
+
+#: pg_amcheck.c:1172
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 替代的維護資料庫\n"
+
+#: pg_amcheck.c:1173
+#, c-format
+msgid ""
+"\n"
+"Other options:\n"
+msgstr ""
+"\n"
+"其他é¸é …:\n"
+
+#: pg_amcheck.c:1174
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 顯示被é€åˆ°ä¼ºæœå™¨çš„命令\n"
+
+#: pg_amcheck.c:1175
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to the server\n"
+msgstr " -j, --jobs=NUM 用這麼多連線至伺æœå™¨\n"
+
+#: pg_amcheck.c:1176
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 顯示進度資訊\n"
+
+#: pg_amcheck.c:1177
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 產生詳細輸出\n"
+
+#: pg_amcheck.c:1178
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_amcheck.c:1179
+#, c-format
+msgid " --install-missing install missing extensions\n"
+msgstr " --install-missing 安è£ç¼ºå°‘的擴充模組\n"
+
+#: pg_amcheck.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_amcheck.c:1182
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_amcheck.c:1183
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+#: pg_amcheck.c:1236
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s"
+msgstr "%*s/%s é—œè¯ (%d%%),%*s/%s è³‡æ–™é  (%d%%) %*s"
+
+#: pg_amcheck.c:1247
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)"
+msgstr "%*s/%s é—œè¯ (%d%%),%*s/%s è³‡æ–™é  (%d%%) (%s%-*.*s)"
+
+#: pg_amcheck.c:1262
+#, c-format
+msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)"
+msgstr "%*s/%s é—œè¯ (%d%%),%*s/%s è³‡æ–™é  (%d%%)"
+
+# catalog/namespace.c:1201 gram.y:2516 gram.y:7422 parser/parse_expr.c:1183
+# parser/parse_target.c:734
+#: pg_amcheck.c:1321 pg_amcheck.c:1354
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "完整å稱ä¸æ­£ç¢º(太多å«é»žå稱): %s"
+
+# catalog/namespace.c:1313
+#: pg_amcheck.c:1399
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "é—œè¯å稱ä¸æ­£ç¢º(太多å«é»žå稱): %s"
+
+#: pg_amcheck.c:1552 pg_amcheck.c:1691
+#, c-format
+msgid "including database \"%s\""
+msgstr "包括資料庫 \"%s\""
+
+#: pg_amcheck.c:1673
+#, c-format
+msgid "internal error: received unexpected database pattern_id %d"
+msgstr "內部錯誤: 收到éžé æœŸçš„資料庫 pattern_id %d"
+
+#: pg_amcheck.c:1675
+#, c-format
+msgid "no connectable databases to check matching \"%s\""
+msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„å¯é€£ç·šè³‡æ–™åº«éœ€è¦æª¢æŸ¥"
+
+#: pg_amcheck.c:2133
+#, c-format
+msgid "internal error: received unexpected relation pattern_id %d"
+msgstr "內部錯誤: 收到éžé æœŸçš„é—œè¯ pattern_id %d"
diff --git a/src/bin/pg_amcheck/t/001_basic.pl b/src/bin/pg_amcheck/t/001_basic.pl
new file mode 100644
index 0000000..1f1e332
--- /dev/null
+++ b/src/bin/pg_amcheck/t/001_basic.pl
@@ -0,0 +1,14 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_amcheck');
+program_version_ok('pg_amcheck');
+program_options_handling_ok('pg_amcheck');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/002_nonesuch.pl b/src/bin/pg_amcheck/t/002_nonesuch.pl
new file mode 100644
index 0000000..99b94dd
--- /dev/null
+++ b/src/bin/pg_amcheck/t/002_nonesuch.pl
@@ -0,0 +1,398 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Test set-up
+my ($node, $port);
+$node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->start;
+$port = $node->port;
+
+# Load the amcheck extension, upon which pg_amcheck depends
+$node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
+
+#########################################
+# Test non-existent databases
+
+# Failing to connect to the initial database is an error.
+$node->command_checks_all(
+ [ 'pg_amcheck', 'qqq' ],
+ 1, [qr/^$/],
+ [qr/FATAL: database "qqq" does not exist/],
+ 'checking a non-existent database');
+
+# Failing to resolve a database pattern is an error by default.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'qqq', '-d', 'postgres' ],
+ 1,
+ [qr/^$/],
+ [qr/pg_amcheck: error: no connectable databases to check matching "qqq"/],
+ 'checking an unresolvable database pattern');
+
+# But only a warning under --no-strict-names
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-d', 'qqq', '-d', 'postgres' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: no connectable databases to check matching "qqq"/
+ ],
+ 'checking an unresolvable database pattern under --no-strict-names');
+
+# Check that a substring of an existent database name does not get interpreted
+# as a matching pattern.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'post', '-d', 'postgres' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "post"/
+ ],
+ 'checking an unresolvable database pattern (substring of existent database)'
+);
+
+# Check that a superstring of an existent database name does not get interpreted
+# as a matching pattern.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgresql', '-d', 'postgres' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "postgresql"/
+ ],
+ 'checking an unresolvable database pattern (superstring of existent database)'
+);
+
+#########################################
+# Test connecting with a non-existent user
+
+# Failing to connect to the initial database due to bad username is an error.
+$node->command_checks_all([ 'pg_amcheck', '-U', 'no_such_user', 'postgres' ],
+ 1, [qr/^$/], [], 'checking with a non-existent user');
+
+#########################################
+# Test checking databases without amcheck installed
+
+# Attempting to check a database by name where amcheck is not installed should
+# raise a warning. If all databases are skipped, having no relations to check
+# raises an error.
+$node->command_checks_all(
+ [ 'pg_amcheck', 'template1' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: error: no relations to check/
+ ],
+ 'checking a database by name without amcheck installed, no other databases'
+);
+
+# Again, but this time with another database to check, so no error is raised.
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'template1', '-d', 'postgres' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/
+ ],
+ 'checking a database by name without amcheck installed, with other databases'
+);
+
+# Again, but by way of checking all databases
+$node->command_checks_all(
+ [ 'pg_amcheck', '--all' ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/
+ ],
+ 'checking a database by pattern without amcheck installed, with other databases'
+);
+
+#########################################
+# Test unreasonable patterns
+
+# Check three-part unreasonable pattern that has zero-length names
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgres', '-t', '..' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "\.\."/
+ ],
+ 'checking table pattern ".."');
+
+# Again, but with non-trivial schema and relation parts
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgres', '-t', '.foo.bar' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "\.foo\.bar"/
+ ],
+ 'checking table pattern ".foo.bar"');
+
+# Check two-part unreasonable pattern that has zero-length names
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'postgres', '-t', '.' ],
+ 1,
+ [qr/^$/],
+ [qr/pg_amcheck: error: no heap tables to check matching "\."/],
+ 'checking table pattern "."');
+
+# Check that a multipart database name is rejected
+$node->command_checks_all(
+ [ 'pg_amcheck', '-d', 'localhost.postgres' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): localhost\.postgres/
+ ],
+ 'multipart database patterns are rejected');
+
+# Check that a three-part schema name is rejected
+$node->command_checks_all(
+ [ 'pg_amcheck', '-s', 'localhost.postgres.pg_catalog' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): localhost\.postgres\.pg_catalog/
+ ],
+ 'three part schema patterns are rejected');
+
+# Check that a four-part table name is rejected
+$node->command_checks_all(
+ [ 'pg_amcheck', '-t', 'localhost.postgres.pg_catalog.pg_class' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper relation name \(too many dotted names\): localhost\.postgres\.pg_catalog\.pg_class/
+ ],
+ 'four part table patterns are rejected');
+
+# Check that too many dotted names still draws an error under --no-strict-names
+# That flag means that it is ok for the object to be missing, not that it is ok
+# for the object name to be ungrammatical
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names',
+ '-t', 'this.is.a.really.long.dotted.string'
+ ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper relation name \(too many dotted names\): this\.is\.a\.really\.long\.dotted\.string/
+ ],
+ 'ungrammatical table names still draw errors under --no-strict-names');
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names', '-s',
+ 'postgres.long.dotted.string'
+ ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): postgres\.long\.dotted\.string/
+ ],
+ 'ungrammatical schema names still draw errors under --no-strict-names');
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names', '-d',
+ 'postgres.long.dotted.string'
+ ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): postgres\.long\.dotted\.string/
+ ],
+ 'ungrammatical database names still draw errors under --no-strict-names');
+
+# Likewise for exclusion patterns
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-T', 'a.b.c.d' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper relation name \(too many dotted names\): a\.b\.c\.d/
+ ],
+ 'ungrammatical table exclusions still draw errors under --no-strict-names'
+);
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-S', 'a.b.c' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): a\.b\.c/
+ ],
+ 'ungrammatical schema exclusions still draw errors under --no-strict-names'
+);
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-strict-names', '-D', 'a.b' ],
+ 2,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: improper qualified name \(too many dotted names\): a\.b/
+ ],
+ 'ungrammatical database exclusions still draw errors under --no-strict-names'
+);
+
+
+#########################################
+# Test checking non-existent databases, schemas, tables, and indexes
+
+# Use --no-strict-names and a single existent table so we only get warnings
+# about the failed pattern matches
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--no-strict-names',
+ '-t', 'no_such_table',
+ '-t', 'no*such*table',
+ '-i', 'no_such_index',
+ '-i', 'no*such*index',
+ '-r', 'no_such_relation',
+ '-r', 'no*such*relation',
+ '-d', 'no_such_database',
+ '-d', 'no*such*database',
+ '-r', 'none.none',
+ '-r', 'none.none.none',
+ '-r', 'postgres.none.none',
+ '-r', 'postgres.pg_catalog.none',
+ '-r', 'postgres.none.pg_class',
+ '-t', 'postgres.pg_catalog.pg_class', # This exists
+ ],
+ 0,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: no heap tables to check matching "no_such_table"/,
+ qr/pg_amcheck: warning: no heap tables to check matching "no\*such\*table"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "no_such_index"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "no\*such\*index"/,
+ qr/pg_amcheck: warning: no relations to check matching "no_such_relation"/,
+ qr/pg_amcheck: warning: no relations to check matching "no\*such\*relation"/,
+ qr/pg_amcheck: warning: no heap tables to check matching "no\*such\*table"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no\*such\*database"/,
+ qr/pg_amcheck: warning: no relations to check matching "none\.none"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "none\.none\.none"/,
+ qr/pg_amcheck: warning: no relations to check matching "postgres\.none\.none"/,
+ qr/pg_amcheck: warning: no relations to check matching "postgres\.pg_catalog\.none"/,
+ qr/pg_amcheck: warning: no relations to check matching "postgres\.none\.pg_class"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no\*such\*database"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "none\.none\.none"/,
+ ],
+ 'many unmatched patterns and one matched pattern under --no-strict-names'
+);
+
+
+#########################################
+# Test that an invalid / partially dropped database won't be targeted
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '-d', 'regression_invalid'
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "regression_invalid"/,
+ ],
+ 'checking handling of invalid database');
+
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '-d', 'postgres',
+ '-t', 'regression_invalid.public.foo',
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: error: no connectable databases to check matching "regression_invalid.public.foo"/,
+ ],
+ 'checking handling of object in invalid database');
+
+
+#########################################
+# Test checking otherwise existent objects but in databases where they do not exist
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE TABLE public.foo (f integer);
+ CREATE INDEX foo_idx ON foo(f);
+));
+$node->safe_psql('postgres', q(CREATE DATABASE another_db));
+
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '-d',
+ 'postgres', '--no-strict-names',
+ '-t', 'template1.public.foo',
+ '-t', 'another_db.public.foo',
+ '-t', 'no_such_database.public.foo',
+ '-i', 'template1.public.foo_idx',
+ '-i', 'another_db.public.foo_idx',
+ '-i', 'no_such_database.public.foo_idx',
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: warning: no heap tables to check matching "template1\.public\.foo"/,
+ qr/pg_amcheck: warning: no heap tables to check matching "another_db\.public\.foo"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database\.public\.foo"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "template1\.public\.foo_idx"/,
+ qr/pg_amcheck: warning: no btree indexes to check matching "another_db\.public\.foo_idx"/,
+ qr/pg_amcheck: warning: no connectable databases to check matching "no_such_database\.public\.foo_idx"/,
+ qr/pg_amcheck: error: no relations to check/,
+ ],
+ 'checking otherwise existent objects in the wrong databases');
+
+
+#########################################
+# Test schema exclusion patterns
+
+# Check with only schema exclusion patterns
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--all', '--no-strict-names', '-S',
+ 'public', '-S', 'pg_catalog', '-S',
+ 'pg_toast', '-S', 'information_schema',
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: error: no relations to check/
+ ],
+ 'schema exclusion patterns exclude all relations');
+
+# Check with schema exclusion patterns overriding relation and schema inclusion patterns
+$node->command_checks_all(
+ [
+ 'pg_amcheck', '--all', '--no-strict-names', '-s',
+ 'public', '-s', 'pg_catalog', '-s',
+ 'pg_toast', '-s', 'information_schema', '-t',
+ 'pg_catalog.pg_class', '-S*'
+ ],
+ 1,
+ [qr/^$/],
+ [
+ qr/pg_amcheck: warning: skipping database "template1": amcheck is not installed/,
+ qr/pg_amcheck: error: no relations to check/
+ ],
+ 'schema exclusion pattern overrides all inclusion patterns');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/003_check.pl b/src/bin/pg_amcheck/t/003_check.pl
new file mode 100644
index 0000000..d577cff
--- /dev/null
+++ b/src/bin/pg_amcheck/t/003_check.pl
@@ -0,0 +1,520 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+my ($node, $port, %corrupt_page, %remove_relation);
+
+# Returns the filesystem path for the named relation.
+#
+# Assumes the test node is running
+sub relation_filepath
+{
+ my ($dbname, $relname) = @_;
+
+ my $pgdata = $node->data_dir;
+ my $rel =
+ $node->safe_psql($dbname, qq(SELECT pg_relation_filepath('$relname')));
+ die "path not found for relation $relname" unless defined $rel;
+ return "$pgdata/$rel";
+}
+
+# Returns the name of the toast relation associated with the named relation.
+#
+# Assumes the test node is running
+sub relation_toast
+{
+ my ($dbname, $relname) = @_;
+
+ my $rel = $node->safe_psql(
+ $dbname, qq(
+ SELECT c.reltoastrelid::regclass
+ FROM pg_catalog.pg_class c
+ WHERE c.oid = '$relname'::regclass
+ AND c.reltoastrelid != 0
+ ));
+ return $rel;
+}
+
+# Adds the relation file for the given (dbname, relname) to the list
+# to be corrupted by means of overwriting junk in the first page.
+#
+# Assumes the test node is running.
+sub plan_to_corrupt_first_page
+{
+ my ($dbname, $relname) = @_;
+ my $relpath = relation_filepath($dbname, $relname);
+ $corrupt_page{$relpath} = 1;
+}
+
+# Adds the relation file for the given (dbname, relname) to the list
+# to be corrupted by means of removing the file..
+#
+# Assumes the test node is running
+sub plan_to_remove_relation_file
+{
+ my ($dbname, $relname) = @_;
+ my $relpath = relation_filepath($dbname, $relname);
+ $remove_relation{$relpath} = 1;
+}
+
+# For the given (dbname, relname), if a corresponding toast table
+# exists, adds that toast table's relation file to the list to be
+# corrupted by means of removing the file.
+#
+# Assumes the test node is running.
+sub plan_to_remove_toast_file
+{
+ my ($dbname, $relname) = @_;
+ my $toastname = relation_toast($dbname, $relname);
+ plan_to_remove_relation_file($dbname, $toastname) if ($toastname);
+}
+
+# Corrupts the first page of the given file path
+sub corrupt_first_page
+{
+ my ($relpath) = @_;
+
+ my $fh;
+ open($fh, '+<', $relpath)
+ or BAIL_OUT("open failed: $!");
+ binmode $fh;
+
+ # Corrupt some line pointers. The values are chosen to hit the
+ # various line-pointer-corruption checks in verify_heapam.c
+ # on both little-endian and big-endian architectures.
+ sysseek($fh, 32, 0)
+ or BAIL_OUT("sysseek failed: $!");
+ syswrite(
+ $fh,
+ pack("L*",
+ 0xAAA15550, 0xAAA0D550, 0x00010000, 0x00008000,
+ 0x0000800F, 0x001e8000, 0xFFFFFFFF)
+ ) or BAIL_OUT("syswrite failed: $!");
+ close($fh)
+ or BAIL_OUT("close failed: $!");
+}
+
+# Stops the node, performs all the corruptions previously planned, and
+# starts the node again.
+#
+sub perform_all_corruptions()
+{
+ $node->stop();
+ for my $relpath (keys %corrupt_page)
+ {
+ corrupt_first_page($relpath);
+ }
+ for my $relpath (keys %remove_relation)
+ {
+ unlink($relpath);
+ }
+ $node->start;
+}
+
+# Test set-up
+$node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->append_conf('postgresql.conf', 'autovacuum=off');
+$node->start;
+$port = $node->port;
+
+for my $dbname (qw(db1 db2 db3))
+{
+ # Create the database
+ $node->safe_psql('postgres', qq(CREATE DATABASE $dbname));
+
+ # Load the amcheck extension, upon which pg_amcheck depends. Put the
+ # extension in an unexpected location to test that pg_amcheck finds it
+ # correctly. Create tables with names that look like pg_catalog names to
+ # check that pg_amcheck does not get confused by them. Create functions in
+ # schema public that look like amcheck functions to check that pg_amcheck
+ # does not use them.
+ $node->safe_psql(
+ $dbname, q(
+ CREATE SCHEMA amcheck_schema;
+ CREATE EXTENSION amcheck WITH SCHEMA amcheck_schema;
+ CREATE TABLE amcheck_schema.pg_database (junk text);
+ CREATE TABLE amcheck_schema.pg_namespace (junk text);
+ CREATE TABLE amcheck_schema.pg_class (junk text);
+ CREATE TABLE amcheck_schema.pg_operator (junk text);
+ CREATE TABLE amcheck_schema.pg_proc (junk text);
+ CREATE TABLE amcheck_schema.pg_tablespace (junk text);
+
+ CREATE FUNCTION public.bt_index_check(index regclass,
+ heapallindexed boolean default false)
+ RETURNS VOID AS $$
+ BEGIN
+ RAISE EXCEPTION 'Invoked wrong bt_index_check!';
+ END;
+ $$ LANGUAGE plpgsql;
+
+ CREATE FUNCTION public.bt_index_parent_check(index regclass,
+ heapallindexed boolean default false,
+ rootdescend boolean default false)
+ RETURNS VOID AS $$
+ BEGIN
+ RAISE EXCEPTION 'Invoked wrong bt_index_parent_check!';
+ END;
+ $$ LANGUAGE plpgsql;
+
+ CREATE FUNCTION public.verify_heapam(relation regclass,
+ on_error_stop boolean default false,
+ check_toast boolean default false,
+ skip text default 'none',
+ startblock bigint default null,
+ endblock bigint default null,
+ blkno OUT bigint,
+ offnum OUT integer,
+ attnum OUT integer,
+ msg OUT text)
+ RETURNS SETOF record AS $$
+ BEGIN
+ RAISE EXCEPTION 'Invoked wrong verify_heapam!';
+ END;
+ $$ LANGUAGE plpgsql;
+ ));
+
+ # Create schemas, tables and indexes in five separate
+ # schemas. The schemas are all identical to start, but
+ # we will corrupt them differently later.
+ #
+ for my $schema (qw(s1 s2 s3 s4 s5))
+ {
+ $node->safe_psql(
+ $dbname, qq(
+ CREATE SCHEMA $schema;
+ CREATE SEQUENCE $schema.seq1;
+ CREATE SEQUENCE $schema.seq2;
+ CREATE TABLE $schema.t1 (
+ i INTEGER,
+ b BOX,
+ ia int4[],
+ ir int4range,
+ t TEXT
+ );
+ CREATE TABLE $schema.t2 (
+ i INTEGER,
+ b BOX,
+ ia int4[],
+ ir int4range,
+ t TEXT
+ );
+ CREATE VIEW $schema.t2_view AS (
+ SELECT i*2, t FROM $schema.t2
+ );
+ ALTER TABLE $schema.t2
+ ALTER COLUMN t
+ SET STORAGE EXTERNAL;
+
+ INSERT INTO $schema.t1 (i, b, ia, ir, t)
+ (SELECT gs::INTEGER AS i,
+ box(point(gs,gs+5),point(gs*2,gs*3)) AS b,
+ array[gs, gs + 1]::int4[] AS ia,
+ int4range(gs, gs+100) AS ir,
+ repeat('foo', gs) AS t
+ FROM generate_series(1,10000,3000) AS gs);
+
+ INSERT INTO $schema.t2 (i, b, ia, ir, t)
+ (SELECT gs::INTEGER AS i,
+ box(point(gs,gs+5),point(gs*2,gs*3)) AS b,
+ array[gs, gs + 1]::int4[] AS ia,
+ int4range(gs, gs+100) AS ir,
+ repeat('foo', gs) AS t
+ FROM generate_series(1,10000,3000) AS gs);
+
+ CREATE MATERIALIZED VIEW $schema.t1_mv AS SELECT * FROM $schema.t1;
+ CREATE MATERIALIZED VIEW $schema.t2_mv AS SELECT * FROM $schema.t2;
+
+ create table $schema.p1 (a int, b int) PARTITION BY list (a);
+ create table $schema.p2 (a int, b int) PARTITION BY list (a);
+
+ create table $schema.p1_1 partition of $schema.p1 for values in (1, 2, 3);
+ create table $schema.p1_2 partition of $schema.p1 for values in (4, 5, 6);
+ create table $schema.p2_1 partition of $schema.p2 for values in (1, 2, 3);
+ create table $schema.p2_2 partition of $schema.p2 for values in (4, 5, 6);
+
+ CREATE INDEX t1_btree ON $schema.t1 USING BTREE (i);
+ CREATE INDEX t2_btree ON $schema.t2 USING BTREE (i);
+
+ CREATE INDEX t1_hash ON $schema.t1 USING HASH (i);
+ CREATE INDEX t2_hash ON $schema.t2 USING HASH (i);
+
+ CREATE INDEX t1_brin ON $schema.t1 USING BRIN (i);
+ CREATE INDEX t2_brin ON $schema.t2 USING BRIN (i);
+
+ CREATE INDEX t1_gist ON $schema.t1 USING GIST (b);
+ CREATE INDEX t2_gist ON $schema.t2 USING GIST (b);
+
+ CREATE INDEX t1_gin ON $schema.t1 USING GIN (ia);
+ CREATE INDEX t2_gin ON $schema.t2 USING GIN (ia);
+
+ CREATE INDEX t1_spgist ON $schema.t1 USING SPGIST (ir);
+ CREATE INDEX t2_spgist ON $schema.t2 USING SPGIST (ir);
+ ));
+ }
+}
+
+# Database 'db1' corruptions
+#
+
+# Corrupt indexes in schema "s1"
+plan_to_remove_relation_file('db1', 's1.t1_btree');
+plan_to_corrupt_first_page('db1', 's1.t2_btree');
+
+# Corrupt tables in schema "s2"
+plan_to_remove_relation_file('db1', 's2.t1');
+plan_to_corrupt_first_page('db1', 's2.t2');
+
+# Corrupt tables, partitions, matviews, and btrees in schema "s3"
+plan_to_remove_relation_file('db1', 's3.t1');
+plan_to_corrupt_first_page('db1', 's3.t2');
+
+plan_to_remove_relation_file('db1', 's3.t1_mv');
+plan_to_remove_relation_file('db1', 's3.p1_1');
+
+plan_to_corrupt_first_page('db1', 's3.t2_mv');
+plan_to_corrupt_first_page('db1', 's3.p2_1');
+
+plan_to_remove_relation_file('db1', 's3.t1_btree');
+plan_to_corrupt_first_page('db1', 's3.t2_btree');
+
+# Corrupt toast table, partitions, and materialized views in schema "s4"
+plan_to_remove_toast_file('db1', 's4.t2');
+
+# Corrupt all other object types in schema "s5". We don't have amcheck support
+# for these types, but we check that their corruption does not trigger any
+# errors in pg_amcheck
+plan_to_remove_relation_file('db1', 's5.seq1');
+plan_to_remove_relation_file('db1', 's5.t1_hash');
+plan_to_remove_relation_file('db1', 's5.t1_gist');
+plan_to_remove_relation_file('db1', 's5.t1_gin');
+plan_to_remove_relation_file('db1', 's5.t1_brin');
+plan_to_remove_relation_file('db1', 's5.t1_spgist');
+
+plan_to_corrupt_first_page('db1', 's5.seq2');
+plan_to_corrupt_first_page('db1', 's5.t2_hash');
+plan_to_corrupt_first_page('db1', 's5.t2_gist');
+plan_to_corrupt_first_page('db1', 's5.t2_gin');
+plan_to_corrupt_first_page('db1', 's5.t2_brin');
+plan_to_corrupt_first_page('db1', 's5.t2_spgist');
+
+
+# Database 'db2' corruptions
+#
+plan_to_remove_relation_file('db2', 's1.t1');
+plan_to_remove_relation_file('db2', 's1.t1_btree');
+
+
+# Leave 'db3' uncorrupted
+#
+
+# Standard first arguments to PostgreSQL::Test::Utils functions
+my @cmd = ('pg_amcheck', '-p', $port);
+
+# Regular expressions to match various expected output
+my $no_output_re = qr/^$/;
+my $line_pointer_corruption_re = qr/line pointer/;
+my $missing_file_re = qr/could not open file ".*": No such file or directory/;
+my $index_missing_relation_fork_re =
+ qr/index ".*" lacks a main relation fork/;
+
+# We have created test databases with tables populated with data, but have not
+# yet corrupted anything. As such, we expect no corruption and verify that
+# none is reported
+#
+$node->command_checks_all([ @cmd, '-d', 'db1', '-d', 'db2', '-d', 'db3' ],
+ 0, [$no_output_re], [$no_output_re], 'pg_amcheck prior to corruption');
+
+# Perform the corruptions we planned above using only a single database restart.
+#
+perform_all_corruptions();
+
+
+# Checking databases with amcheck installed and corrupt relations, pg_amcheck
+# command itself should return exit status = 2, because tables and indexes are
+# corrupt, not exit status = 1, which would mean the pg_amcheck command itself
+# failed. Corruption messages should go to stdout, and nothing to stderr.
+#
+$node->command_checks_all(
+ [ @cmd, 'db1' ],
+ 2,
+ [
+ $index_missing_relation_fork_re, $line_pointer_corruption_re,
+ $missing_file_re,
+ ],
+ [$no_output_re],
+ 'pg_amcheck all schemas, tables and indexes in database db1');
+
+$node->command_checks_all(
+ [ @cmd, '-d', 'db1', '-d', 'db2', '-d', 'db3' ],
+ 2,
+ [
+ $index_missing_relation_fork_re, $line_pointer_corruption_re,
+ $missing_file_re,
+ ],
+ [$no_output_re],
+ 'pg_amcheck all schemas, tables and indexes in databases db1, db2, and db3'
+);
+
+# Scans of indexes in s1 should detect the specific corruption that we created
+# above. For missing relation forks, we know what the error message looks
+# like. For corrupted index pages, the error might vary depending on how the
+# page was formatted on disk, including variations due to alignment differences
+# between platforms, so we accept any non-empty error message.
+#
+# If we don't limit the check to databases with amcheck installed, we expect
+# complaint on stderr, but otherwise stderr should be quiet.
+#
+$node->command_checks_all(
+ [ @cmd, '--all', '-s', 's1', '-i', 't1_btree' ],
+ 2,
+ [$index_missing_relation_fork_re],
+ [
+ qr/pg_amcheck: warning: skipping database "postgres": amcheck is not installed/
+ ],
+ 'pg_amcheck index s1.t1_btree reports missing main relation fork');
+
+$node->command_checks_all(
+ [ @cmd, '-d', 'db1', '-s', 's1', '-i', 't2_btree' ],
+ 2,
+ [qr/.+/], # Any non-empty error message is acceptable
+ [$no_output_re],
+ 'pg_amcheck index s1.s2 reports index corruption');
+
+# Checking db1.s1 with indexes excluded should show no corruptions because we
+# did not corrupt any tables in db1.s1. Verify that both stdout and stderr
+# are quiet.
+#
+$node->command_checks_all(
+ [ @cmd, '-t', 's1.*', '--no-dependent-indexes', 'db1' ],
+ 0, [$no_output_re], [$no_output_re],
+ 'pg_amcheck of db1.s1 excluding indexes');
+
+# Checking db2.s1 should show table corruptions if indexes are excluded
+#
+$node->command_checks_all(
+ [ @cmd, '-t', 's1.*', '--no-dependent-indexes', 'db2' ],
+ 2, [$missing_file_re], [$no_output_re],
+ 'pg_amcheck of db2.s1 excluding indexes');
+
+# In schema db1.s3, the tables and indexes are both corrupt. We should see
+# corruption messages on stdout, and nothing on stderr.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's3', 'db1' ],
+ 2,
+ [
+ $index_missing_relation_fork_re, $line_pointer_corruption_re,
+ $missing_file_re,
+ ],
+ [$no_output_re],
+ 'pg_amcheck schema s3 reports table and index errors');
+
+# In schema db1.s4, only toast tables are corrupt. Check that under default
+# options the toast corruption is reported, but when excluding toast we get no
+# error reports.
+$node->command_checks_all([ @cmd, '-s', 's4', 'db1' ],
+ 2, [$missing_file_re], [$no_output_re],
+ 'pg_amcheck in schema s4 reports toast corruption');
+
+$node->command_checks_all(
+ [
+ @cmd, '--no-dependent-toast', '--exclude-toast-pointers', '-s', 's4',
+ 'db1'
+ ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck in schema s4 excluding toast reports no corruption');
+
+# Check that no corruption is reported in schema db1.s5
+$node->command_checks_all([ @cmd, '-s', 's5', 'db1' ],
+ 0, [$no_output_re], [$no_output_re],
+ 'pg_amcheck over schema s5 reports no corruption');
+
+# In schema db1.s1, only indexes are corrupt. Verify that when we exclude
+# the indexes, no corruption is reported about the schema.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's1', '-I', 't1_btree', '-I', 't2_btree', 'db1' ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck over schema s1 with corrupt indexes excluded reports no corruption'
+);
+
+# In schema db1.s1, only indexes are corrupt. Verify that when we provide only
+# table inclusions, and disable index expansion, no corruption is reported
+# about the schema.
+#
+$node->command_checks_all(
+ [ @cmd, '-t', 's1.*', '--no-dependent-indexes', 'db1' ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck over schema s1 with all indexes excluded reports no corruption'
+);
+
+# In schema db1.s2, only tables are corrupt. Verify that when we exclude those
+# tables that no corruption is reported.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's2', '-T', 't1', '-T', 't2', 'db1' ],
+ 0,
+ [$no_output_re],
+ [$no_output_re],
+ 'pg_amcheck over schema s2 with corrupt tables excluded reports no corruption'
+);
+
+# Check errors about bad block range command line arguments. We use schema s5
+# to avoid getting messages about corrupt tables or indexes.
+#
+command_fails_like(
+ [ @cmd, '-s', 's5', '--startblock', 'junk', 'db1' ],
+ qr/invalid start block/,
+ 'pg_amcheck rejects garbage startblock');
+
+command_fails_like(
+ [ @cmd, '-s', 's5', '--endblock', '1234junk', 'db1' ],
+ qr/invalid end block/,
+ 'pg_amcheck rejects garbage endblock');
+
+command_fails_like(
+ [ @cmd, '-s', 's5', '--startblock', '5', '--endblock', '4', 'db1' ],
+ qr/end block precedes start block/,
+ 'pg_amcheck rejects invalid block range');
+
+# Check bt_index_parent_check alternates. We don't create any index corruption
+# that would behave differently under these modes, so just smoke test that the
+# arguments are handled sensibly.
+#
+$node->command_checks_all(
+ [ @cmd, '-s', 's1', '-i', 't1_btree', '--parent-check', 'db1' ],
+ 2,
+ [$index_missing_relation_fork_re],
+ [$no_output_re],
+ 'pg_amcheck smoke test --parent-check');
+
+$node->command_checks_all(
+ [
+ @cmd, '-s', 's1', '-i', 't1_btree', '--heapallindexed',
+ '--rootdescend', 'db1'
+ ],
+ 2,
+ [$index_missing_relation_fork_re],
+ [$no_output_re],
+ 'pg_amcheck smoke test --heapallindexed --rootdescend');
+
+$node->command_checks_all(
+ [ @cmd, '-d', 'db1', '-d', 'db2', '-d', 'db3', '-S', 's*' ],
+ 0, [$no_output_re], [$no_output_re],
+ 'pg_amcheck excluding all corrupt schemas');
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/004_verify_heapam.pl b/src/bin/pg_amcheck/t/004_verify_heapam.pl
new file mode 100644
index 0000000..1b5027c
--- /dev/null
+++ b/src/bin/pg_amcheck/t/004_verify_heapam.pl
@@ -0,0 +1,766 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+# This regression test demonstrates that the pg_amcheck binary correctly
+# identifies specific kinds of corruption within pages. To test this, we need
+# a mechanism to create corrupt pages with predictable, repeatable corruption.
+# The postgres backend cannot be expected to help us with this, as its design
+# is not consistent with the goal of intentionally corrupting pages.
+#
+# Instead, we create a table to corrupt, and with careful consideration of how
+# postgresql lays out heap pages, we seek to offsets within the page and
+# overwrite deliberately chosen bytes with specific values calculated to
+# corrupt the page in expected ways. We then verify that pg_amcheck reports
+# the corruption, and that it runs without crashing. Note that the backend
+# cannot simply be started to run queries against the corrupt table, as the
+# backend will crash, at least for some of the corruption types we generate.
+#
+# Autovacuum potentially touching the table in the background makes the exact
+# behavior of this test harder to reason about. We turn it off to keep things
+# simpler. We use a "belt and suspenders" approach, turning it off for the
+# system generally in postgresql.conf, and turning it off specifically for the
+# test table.
+#
+# This test depends on the table being written to the heap file exactly as we
+# expect it to be, so we take care to arrange the columns of the table, and
+# insert rows of the table, that give predictable sizes and locations within
+# the table page.
+#
+# The HeapTupleHeaderData has 23 bytes of fixed size fields before the variable
+# length t_bits[] array. We have exactly 3 columns in the table, so natts = 3,
+# t_bits is 1 byte long, and t_hoff = MAXALIGN(23 + 1) = 24.
+#
+# We're not too fussy about which datatypes we use for the test, but we do care
+# about some specific properties. We'd like to test both fixed size and
+# varlena types. We'd like some varlena data inline and some toasted. And
+# we'd like the layout of the table such that the datums land at predictable
+# offsets within the tuple. We choose a structure without padding on all
+# supported architectures:
+#
+# a BIGINT
+# b TEXT
+# c TEXT
+#
+# We always insert a 7-ascii character string into field 'b', which with a
+# 1-byte varlena header gives an 8 byte inline value. We always insert a long
+# text string in field 'c', long enough to force toast storage.
+#
+# We choose to read and write binary copies of our table's tuples, using perl's
+# pack() and unpack() functions. Perl uses a packing code system in which:
+#
+# l = "signed 32-bit Long",
+# L = "Unsigned 32-bit Long",
+# S = "Unsigned 16-bit Short",
+# C = "Unsigned 8-bit Octet",
+#
+# Each tuple in our table has a layout as follows:
+#
+# xx xx xx xx t_xmin: xxxx offset = 0 L
+# xx xx xx xx t_xmax: xxxx offset = 4 L
+# xx xx xx xx t_field3: xxxx offset = 8 L
+# xx xx bi_hi: xx offset = 12 S
+# xx xx bi_lo: xx offset = 14 S
+# xx xx ip_posid: xx offset = 16 S
+# xx xx t_infomask2: xx offset = 18 S
+# xx xx t_infomask: xx offset = 20 S
+# xx t_hoff: x offset = 22 C
+# xx t_bits: x offset = 23 C
+# xx xx xx xx xx xx xx xx 'a': xxxxxxxx offset = 24 LL
+# xx xx xx xx xx xx xx xx 'b': xxxxxxxx offset = 32 CCCCCCCC
+# xx xx xx xx xx xx xx xx 'c': xxxxxxxx offset = 40 CCllLL
+# xx xx xx xx xx xx xx xx : xxxxxxxx ...continued
+# xx xx : xx ...continued
+#
+# We could choose to read and write columns 'b' and 'c' in other ways, but
+# it is convenient enough to do it this way. We define packing code
+# constants here, where they can be compared easily against the layout.
+
+use constant HEAPTUPLE_PACK_CODE => 'LLLSSSSSCCLLCCCCCCCCCCllLL';
+use constant HEAPTUPLE_PACK_LENGTH => 58; # Total size
+
+# Read a tuple of our table from a heap page.
+#
+# Takes an open filehandle to the heap file, and the offset of the tuple.
+#
+# Rather than returning the binary data from the file, unpacks the data into a
+# perl hash with named fields. These fields exactly match the ones understood
+# by write_tuple(), below. Returns a reference to this hash.
+#
+sub read_tuple
+{
+ my ($fh, $offset) = @_;
+ my ($buffer, %tup);
+ sysseek($fh, $offset, 0)
+ or BAIL_OUT("sysseek failed: $!");
+ defined(sysread($fh, $buffer, HEAPTUPLE_PACK_LENGTH))
+ or BAIL_OUT("sysread failed: $!");
+
+ @_ = unpack(HEAPTUPLE_PACK_CODE, $buffer);
+ %tup = (
+ t_xmin => shift,
+ t_xmax => shift,
+ t_field3 => shift,
+ bi_hi => shift,
+ bi_lo => shift,
+ ip_posid => shift,
+ t_infomask2 => shift,
+ t_infomask => shift,
+ t_hoff => shift,
+ t_bits => shift,
+ a_1 => shift,
+ a_2 => shift,
+ b_header => shift,
+ b_body1 => shift,
+ b_body2 => shift,
+ b_body3 => shift,
+ b_body4 => shift,
+ b_body5 => shift,
+ b_body6 => shift,
+ b_body7 => shift,
+ c_va_header => shift,
+ c_va_vartag => shift,
+ c_va_rawsize => shift,
+ c_va_extinfo => shift,
+ c_va_valueid => shift,
+ c_va_toastrelid => shift);
+ # Stitch together the text for column 'b'
+ $tup{b} = join('', map { chr($tup{"b_body$_"}) } (1 .. 7));
+ return \%tup;
+}
+
+# Write a tuple of our table to a heap page.
+#
+# Takes an open filehandle to the heap file, the offset of the tuple, and a
+# reference to a hash with the tuple values, as returned by read_tuple().
+# Writes the tuple fields from the hash into the heap file.
+#
+# The purpose of this function is to write a tuple back to disk with some
+# subset of fields modified. The function does no error checking. Use
+# cautiously.
+#
+sub write_tuple
+{
+ my ($fh, $offset, $tup) = @_;
+ my $buffer = pack(
+ HEAPTUPLE_PACK_CODE,
+ $tup->{t_xmin}, $tup->{t_xmax},
+ $tup->{t_field3}, $tup->{bi_hi},
+ $tup->{bi_lo}, $tup->{ip_posid},
+ $tup->{t_infomask2}, $tup->{t_infomask},
+ $tup->{t_hoff}, $tup->{t_bits},
+ $tup->{a_1}, $tup->{a_2},
+ $tup->{b_header}, $tup->{b_body1},
+ $tup->{b_body2}, $tup->{b_body3},
+ $tup->{b_body4}, $tup->{b_body5},
+ $tup->{b_body6}, $tup->{b_body7},
+ $tup->{c_va_header}, $tup->{c_va_vartag},
+ $tup->{c_va_rawsize}, $tup->{c_va_extinfo},
+ $tup->{c_va_valueid}, $tup->{c_va_toastrelid});
+ sysseek($fh, $offset, 0)
+ or BAIL_OUT("sysseek failed: $!");
+ defined(syswrite($fh, $buffer, HEAPTUPLE_PACK_LENGTH))
+ or BAIL_OUT("syswrite failed: $!");
+ return;
+}
+
+# Set umask so test directories and files are created with default permissions
+umask(0077);
+
+my $pred_xmax;
+my $pred_posid;
+my $aborted_xid;
+# Set up the node. Once we create and corrupt the table,
+# autovacuum workers visiting the table could crash the backend.
+# Disable autovacuum so that won't happen.
+my $node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->append_conf('postgresql.conf', 'autovacuum=off');
+$node->append_conf('postgresql.conf', 'max_prepared_transactions=10');
+
+# Start the node and load the extensions. We depend on both
+# amcheck and pageinspect for this test.
+$node->start;
+my $port = $node->port;
+my $pgdata = $node->data_dir;
+$node->safe_psql('postgres', "CREATE EXTENSION amcheck");
+$node->safe_psql('postgres', "CREATE EXTENSION pageinspect");
+
+# Get a non-zero datfrozenxid
+$node->safe_psql('postgres', qq(VACUUM FREEZE));
+
+# Create the test table with precisely the schema that our corruption function
+# expects.
+$node->safe_psql(
+ 'postgres', qq(
+ CREATE TABLE public.test (a BIGINT, b TEXT, c TEXT);
+ ALTER TABLE public.test SET (autovacuum_enabled=false);
+ ALTER TABLE public.test ALTER COLUMN c SET STORAGE EXTERNAL;
+ CREATE INDEX test_idx ON public.test(a, b);
+ ));
+
+# We want (0 < datfrozenxid < test.relfrozenxid). To achieve this, we freeze
+# an otherwise unused table, public.junk, prior to inserting data and freezing
+# public.test
+$node->safe_psql(
+ 'postgres', qq(
+ CREATE TABLE public.junk AS SELECT 'junk'::TEXT AS junk_column;
+ ALTER TABLE public.junk SET (autovacuum_enabled=false);
+ VACUUM FREEZE public.junk
+ ));
+
+my $rel = $node->safe_psql('postgres',
+ qq(SELECT pg_relation_filepath('public.test')));
+my $relpath = "$pgdata/$rel";
+
+# Initial setup for the public.test table.
+# $ROWCOUNT is the total number of rows that we expect to insert into the page.
+# $ROWCOUNT_BASIC is the number of those rows that are related to basic
+# tuple validation, rather than update chain validation.
+my $ROWCOUNT = 44;
+my $ROWCOUNT_BASIC = 16;
+
+# First insert data needed for tests unrelated to update chain validation.
+# Then freeze the page. These tuples are at offset numbers 1 to 16.
+$node->safe_psql(
+ 'postgres', qq(
+ INSERT INTO public.test (a, b, c)
+ SELECT
+ x'DEADF9F9DEADF9F9'::bigint,
+ 'abcdefg',
+ repeat('w', 10000)
+ FROM generate_series(1, $ROWCOUNT_BASIC);
+ VACUUM FREEZE public.test;)
+);
+
+# Create some simple HOT update chains for line pointer validation. After
+# the page is HOT pruned, we'll have two redirects line pointers each pointing
+# to a tuple. We'll then change the second redirect to point to the same
+# tuple as the first one and verify that we can detect corruption.
+$node->safe_psql(
+ 'postgres', qq(
+ INSERT INTO public.test (a, b, c)
+ VALUES ( x'DEADF9F9DEADF9F9'::bigint, 'abcdefg',
+ generate_series(1,2)); -- offset numbers 17 and 18
+ UPDATE public.test SET c = 'a' WHERE c = '1'; -- offset number 19
+ UPDATE public.test SET c = 'a' WHERE c = '2'; -- offset number 20
+ ));
+
+# Create some more HOT update chains.
+$node->safe_psql(
+ 'postgres', qq(
+ INSERT INTO public.test (a, b, c)
+ VALUES ( x'DEADF9F9DEADF9F9'::bigint, 'abcdefg',
+ generate_series(3,6)); -- offset numbers 21 through 24
+ UPDATE public.test SET c = 'a' WHERE c = '3'; -- offset number 25
+ UPDATE public.test SET c = 'a' WHERE c = '4'; -- offset number 26
+ ));
+
+# Negative test case of HOT-pruning with aborted tuple.
+$node->safe_psql(
+ 'postgres', qq(
+ BEGIN;
+ UPDATE public.test SET c = 'a' WHERE c = '5'; -- offset number 27
+ ABORT;
+ VACUUM FREEZE public.test;
+ ));
+
+# Next update on any tuple will be stored at the same place of tuple inserted
+# by aborted transaction. This should not cause the table to appear corrupt.
+$node->safe_psql(
+ 'postgres', qq(
+ UPDATE public.test SET c = 'a' WHERE c = '6'; -- offset number 27 again
+ VACUUM FREEZE public.test;
+ ));
+
+# Data for HOT chain validation, so not calling VACUUM FREEZE.
+$node->safe_psql(
+ 'postgres', qq(
+ INSERT INTO public.test (a, b, c)
+ VALUES ( x'DEADF9F9DEADF9F9'::bigint, 'abcdefg',
+ generate_series(7,15)); -- offset numbers 28 to 36
+ UPDATE public.test SET c = 'a' WHERE c = '7'; -- offset number 37
+ UPDATE public.test SET c = 'a' WHERE c = '10'; -- offset number 38
+ UPDATE public.test SET c = 'a' WHERE c = '11'; -- offset number 39
+ UPDATE public.test SET c = 'a' WHERE c = '12'; -- offset number 40
+ UPDATE public.test SET c = 'a' WHERE c = '13'; -- offset number 41
+ UPDATE public.test SET c = 'a' WHERE c = '14'; -- offset number 42
+ UPDATE public.test SET c = 'a' WHERE c = '15'; -- offset number 43
+ ));
+
+# Need one aborted transaction to test corruption in HOT chains.
+$node->safe_psql(
+ 'postgres', qq(
+ BEGIN;
+ UPDATE public.test SET c = 'a' WHERE c = '9'; -- offset number 44
+ ABORT;
+ ));
+
+# Need one in-progress transaction to test few corruption in HOT chains.
+# We are creating PREPARE TRANSACTION here as these will not be aborted
+# even if we stop the node.
+$node->safe_psql(
+ 'postgres', qq(
+ BEGIN;
+ PREPARE TRANSACTION 'in_progress_tx';
+ ));
+my $in_progress_xid = $node->safe_psql(
+ 'postgres', qq(
+ SELECT transaction FROM pg_prepared_xacts;
+ ));
+
+my $relfrozenxid = $node->safe_psql('postgres',
+ q(select relfrozenxid from pg_class where relname = 'test'));
+my $datfrozenxid = $node->safe_psql('postgres',
+ q(select datfrozenxid from pg_database where datname = 'postgres'));
+
+# Sanity check that our 'test' table has a relfrozenxid newer than the
+# datfrozenxid for the database, and that the datfrozenxid is greater than the
+# first normal xid. We rely on these invariants in some of our tests.
+if ($datfrozenxid <= 3 || $datfrozenxid >= $relfrozenxid)
+{
+ $node->clean_node;
+ plan skip_all =>
+ "Xid thresholds not as expected: got datfrozenxid = $datfrozenxid, relfrozenxid = $relfrozenxid";
+ exit;
+}
+
+# Find where each of the tuples is located on the page. If a particular
+# line pointer is a redirect rather than a tuple, we record the offset as -1.
+my @lp_off = split '\n', $node->safe_psql(
+ 'postgres', qq(
+ SELECT CASE WHEN lp_flags = 2 THEN -1 ELSE lp_off END
+ FROM heap_page_items(get_raw_page('test', 'main', 0))
+ )
+);
+scalar @lp_off == $ROWCOUNT or BAIL_OUT("row offset counts mismatch");
+
+# Sanity check that our 'test' table on disk layout matches expectations. If
+# this is not so, we will have to skip the test until somebody updates the test
+# to work on this platform.
+$node->stop;
+my $file;
+open($file, '+<', $relpath)
+ or BAIL_OUT("open failed: $!");
+binmode $file;
+
+my $ENDIANNESS;
+for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++)
+{
+ my $offnum = $tupidx + 1; # offnum is 1-based, not zero-based
+ my $offset = $lp_off[$tupidx];
+ next if $offset == -1; # ignore redirect line pointers
+ my $tup = read_tuple($file, $offset);
+
+ # Sanity-check that the data appears on the page where we expect.
+ my $a_1 = $tup->{a_1};
+ my $a_2 = $tup->{a_2};
+ my $b = $tup->{b};
+ if ($a_1 != 0xDEADF9F9 || $a_2 != 0xDEADF9F9 || $b ne 'abcdefg')
+ {
+ close($file); # ignore errors on close; we're exiting anyway
+ $node->clean_node;
+ plan skip_all =>
+ sprintf(
+ "Page layout of index %d differs from our expectations: expected (%x, %x, \"%s\"), got (%x, %x, \"%s\")",
+ $tupidx, 0xDEADF9F9, 0xDEADF9F9, "abcdefg", $a_1, $a_2, $b);
+ exit;
+ }
+
+ # Determine endianness of current platform from the 1-byte varlena header
+ $ENDIANNESS = $tup->{b_header} == 0x11 ? "little" : "big";
+}
+close($file)
+ or BAIL_OUT("close failed: $!");
+$node->start;
+
+# Ok, Xids and page layout look ok. We can run corruption tests.
+
+# Check that pg_amcheck runs against the uncorrupted table without error.
+$node->command_ok(
+ [ 'pg_amcheck', '-p', $port, 'postgres' ],
+ 'pg_amcheck test table, prior to corruption');
+
+# Check that pg_amcheck runs against the uncorrupted table and index without error.
+$node->command_ok([ 'pg_amcheck', '-p', $port, 'postgres' ],
+ 'pg_amcheck test table and index, prior to corruption');
+
+$node->stop;
+
+# Some #define constants from access/htup_details.h for use while corrupting.
+use constant HEAP_HASNULL => 0x0001;
+use constant HEAP_XMAX_LOCK_ONLY => 0x0080;
+use constant HEAP_XMIN_COMMITTED => 0x0100;
+use constant HEAP_XMIN_INVALID => 0x0200;
+use constant HEAP_XMAX_COMMITTED => 0x0400;
+use constant HEAP_XMAX_INVALID => 0x0800;
+use constant HEAP_NATTS_MASK => 0x07FF;
+use constant HEAP_XMAX_IS_MULTI => 0x1000;
+use constant HEAP_KEYS_UPDATED => 0x2000;
+use constant HEAP_HOT_UPDATED => 0x4000;
+use constant HEAP_ONLY_TUPLE => 0x8000;
+use constant HEAP_UPDATED => 0x2000;
+
+# Helper function to generate a regular expression matching the header we
+# expect verify_heapam() to return given which fields we expect to be non-null.
+sub header
+{
+ my ($blkno, $offnum, $attnum) = @_;
+ return
+ qr/heap table "postgres\.public\.test", block $blkno, offset $offnum, attribute $attnum:\s+/ms
+ if (defined $attnum);
+ return
+ qr/heap table "postgres\.public\.test", block $blkno, offset $offnum:\s+/ms
+ if (defined $offnum);
+ return qr/heap table "postgres\.public\.test", block $blkno:\s+/ms
+ if (defined $blkno);
+ return qr/heap table "postgres\.public\.test":\s+/ms;
+}
+
+# Corrupt the tuples, one type of corruption per tuple. Some types of
+# corruption cause verify_heapam to skip to the next tuple without
+# performing any remaining checks, so we can't exercise the system properly if
+# we focus all our corruption on a single tuple.
+#
+my @expected;
+open($file, '+<', $relpath)
+ or BAIL_OUT("open failed: $!");
+binmode $file;
+
+for (my $tupidx = 0; $tupidx < $ROWCOUNT; $tupidx++)
+{
+ my $offnum = $tupidx + 1; # offnum is 1-based, not zero-based
+ my $offset = $lp_off[$tupidx];
+ my $header = header(0, $offnum, undef);
+
+ # Read tuple, if there is one.
+ my $tup = $offset == -1 ? undef : read_tuple($file, $offset);
+
+ if ($offnum == 1)
+ {
+ # Corruptly set xmin < relfrozenxid
+ my $xmin = $relfrozenxid - 1;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ # Expected corruption report
+ push @expected,
+ qr/${header}xmin $xmin precedes relation freeze threshold 0:\d+/;
+ }
+ elsif ($offnum == 2)
+ {
+ # Corruptly set xmin < datfrozenxid
+ my $xmin = 3;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ push @expected,
+ qr/${$header}xmin $xmin precedes oldest valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 3)
+ {
+ # Corruptly set xmin < datfrozenxid, further back, noting circularity
+ # of xid comparison.
+ my $xmin = 4026531839;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ push @expected,
+ qr/${$header}xmin ${xmin} precedes oldest valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 4)
+ {
+ # Corruptly set xmax < relminmxid;
+ my $xmax = 4026531839;
+ $tup->{t_xmax} = $xmax;
+ $tup->{t_infomask} &= ~HEAP_XMAX_INVALID;
+
+ push @expected,
+ qr/${$header}xmax ${xmax} precedes oldest valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 5)
+ {
+ # Corrupt the tuple t_hoff, but keep it aligned properly
+ $tup->{t_hoff} += 128;
+
+ push @expected,
+ qr/${$header}data begins at offset 152 beyond the tuple length 58/,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 152 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 6)
+ {
+ # Corrupt the tuple t_hoff, wrong alignment
+ $tup->{t_hoff} += 3;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 27 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 7)
+ {
+ # Corrupt the tuple t_hoff, underflow but correct alignment
+ $tup->{t_hoff} -= 8;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 16 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 8)
+ {
+ # Corrupt the tuple t_hoff, underflow and wrong alignment
+ $tup->{t_hoff} -= 3;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 24, but actually begins at byte 21 \(3 attributes, no nulls\)/;
+ }
+ elsif ($offnum == 9)
+ {
+ # Corrupt the tuple to look like it has lots of attributes, not just 3
+ $tup->{t_infomask2} |= HEAP_NATTS_MASK;
+
+ push @expected,
+ qr/${$header}number of attributes 2047 exceeds maximum expected for table 3/;
+ }
+ elsif ($offnum == 10)
+ {
+ # Corrupt the tuple to look like it has lots of attributes, some of
+ # them null. This falsely creates the impression that the t_bits
+ # array is longer than just one byte, but t_hoff still says otherwise.
+ $tup->{t_infomask} |= HEAP_HASNULL;
+ $tup->{t_infomask2} |= HEAP_NATTS_MASK;
+ $tup->{t_bits} = 0xAA;
+
+ push @expected,
+ qr/${$header}tuple data should begin at byte 280, but actually begins at byte 24 \(2047 attributes, has nulls\)/;
+ }
+ elsif ($offnum == 11)
+ {
+ # Same as above, but this time t_hoff plays along
+ $tup->{t_infomask} |= HEAP_HASNULL;
+ $tup->{t_infomask2} |= (HEAP_NATTS_MASK & 0x40);
+ $tup->{t_bits} = 0xAA;
+ $tup->{t_hoff} = 32;
+
+ push @expected,
+ qr/${$header}number of attributes 67 exceeds maximum expected for table 3/;
+ }
+ elsif ($offnum == 12)
+ {
+ # Overwrite column 'b' 1-byte varlena header and initial characters to
+ # look like a long 4-byte varlena
+ #
+ # On little endian machines, bytes ending in two zero bits (xxxxxx00 bytes)
+ # are 4-byte length word, aligned, uncompressed data (up to 1G). We set the
+ # high six bits to 111111 and the lower two bits to 00, then the next three
+ # bytes with 0xFF using 0xFCFFFFFF.
+ #
+ # On big endian machines, bytes starting in two zero bits (00xxxxxx bytes)
+ # are 4-byte length word, aligned, uncompressed data (up to 1G). We set the
+ # low six bits to 111111 and the high two bits to 00, then the next three
+ # bytes with 0xFF using 0x3FFFFFFF.
+ #
+ $tup->{b_header} = $ENDIANNESS eq 'little' ? 0xFC : 0x3F;
+ $tup->{b_body1} = 0xFF;
+ $tup->{b_body2} = 0xFF;
+ $tup->{b_body3} = 0xFF;
+
+ $header = header(0, $offnum, 1);
+ push @expected,
+ qr/${header}attribute with length \d+ ends at offset \d+ beyond total tuple length \d+/;
+ }
+ elsif ($offnum == 13)
+ {
+ # Corrupt the bits in column 'c' toast pointer
+ $tup->{c_va_valueid} = 0xFFFFFFFF;
+
+ $header = header(0, $offnum, 2);
+ push @expected, qr/${header}toast value \d+ not found in toast table/;
+ }
+ elsif ($offnum == 14)
+ {
+ # Set both HEAP_XMAX_COMMITTED and HEAP_XMAX_IS_MULTI
+ $tup->{t_infomask} |= HEAP_XMAX_COMMITTED;
+ $tup->{t_infomask} |= HEAP_XMAX_IS_MULTI;
+ $tup->{t_xmax} = 4;
+
+ push @expected,
+ qr/${header}multitransaction ID 4 equals or exceeds next valid multitransaction ID 1/;
+ }
+ elsif ($offnum == 15)
+ {
+ # Set both HEAP_XMAX_COMMITTED and HEAP_XMAX_IS_MULTI
+ $tup->{t_infomask} |= HEAP_XMAX_COMMITTED;
+ $tup->{t_infomask} |= HEAP_XMAX_IS_MULTI;
+ $tup->{t_xmax} = 4000000000;
+
+ push @expected,
+ qr/${header}multitransaction ID 4000000000 precedes relation minimum multitransaction ID threshold 1/;
+ }
+ elsif ($offnum == 16) # Last offnum must equal ROWCOUNT
+ {
+ # Corruptly set xmin > next_xid to be in the future.
+ my $xmin = 123456;
+ $tup->{t_xmin} = $xmin;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ $tup->{t_infomask} &= ~HEAP_XMIN_INVALID;
+
+ push @expected,
+ qr/${$header}xmin ${xmin} equals or exceeds next valid transaction ID 0:\d+/;
+ }
+ elsif ($offnum == 17)
+ {
+ # at offnum 19 we will unset HEAP_ONLY_TUPLE flag
+ die "offnum $offnum should be a redirect" if defined $tup;
+ push @expected,
+ qr/${header}redirected line pointer points to a non-heap-only tuple at offset \d+/;
+ }
+ elsif ($offnum == 18)
+ {
+ # rewrite line pointer with lp_off = 17, lp_flags = 2, lp_len = 0.
+ die "offnum $offnum should be a redirect" if defined $tup;
+ sysseek($file, 92, 0) or BAIL_OUT("sysseek failed: $!");
+ syswrite($file,
+ pack("L", $ENDIANNESS eq 'little' ? 0x00010011 : 0x00230000))
+ or BAIL_OUT("syswrite failed: $!");
+ push @expected,
+ qr/${header}redirected line pointer points to another redirected line pointer at offset \d+/;
+ }
+ elsif ($offnum == 19)
+ {
+ # unset HEAP_ONLY_TUPLE flag, so that update chain validation will
+ # complain about offset 17
+ $tup->{t_infomask2} &= ~HEAP_ONLY_TUPLE;
+ }
+ elsif ($offnum == 22)
+ {
+ # rewrite line pointer with lp.off = 25, lp_flags = 2, lp_len = 0
+ sysseek($file, 108, 0) or BAIL_OUT("sysseek failed: $!");
+ syswrite($file,
+ pack("L", $ENDIANNESS eq 'little' ? 0x00010019 : 0x00330000))
+ or BAIL_OUT("syswrite failed: $!");
+ push @expected,
+ qr/${header}redirect line pointer points to offset \d+, but offset \d+ also points there/;
+ }
+ elsif ($offnum == 28)
+ {
+ $tup->{t_infomask2} &= ~HEAP_HOT_UPDATED;
+ push @expected,
+ qr/${header}non-heap-only update produced a heap-only tuple at offset \d+/;
+
+ # Save these values so we can insert them into the tuple at offnum 29.
+ $pred_xmax = $tup->{t_xmax};
+ $pred_posid = $tup->{ip_posid};
+ }
+ elsif ($offnum == 29)
+ {
+ # Copy these values from the tuple at offset 28.
+ $tup->{t_xmax} = $pred_xmax;
+ $tup->{ip_posid} = $pred_posid;
+ push @expected,
+ qr/${header}tuple points to new version at offset \d+, but offset \d+ also points there/;
+ }
+ elsif ($offnum == 30)
+ {
+ # Save xid, so we can insert into into tuple at offset 31.
+ $aborted_xid = $tup->{t_xmax};
+ }
+ elsif ($offnum == 31)
+ {
+ # Set xmin to xmax of tuple at offset 30.
+ $tup->{t_xmin} = $aborted_xid;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ push @expected,
+ qr/${header}tuple with aborted xmin \d+ was updated to produce a tuple at offset \d+ with committed xmin \d+/;
+ }
+ elsif ($offnum == 32)
+ {
+ $tup->{t_infomask2} |= HEAP_ONLY_TUPLE;
+ push @expected,
+ qr/${header}tuple is root of chain but is marked as heap-only tuple/;
+ push @expected,
+ qr/${header}tuple is heap only, but not the result of an update/;
+ }
+ elsif ($offnum == 33)
+ {
+ # Tuple at offset 40 is the successor of this one; we'll corrupt it to
+ # be non-heap-only.
+ push @expected,
+ qr/${header}heap-only update produced a non-heap only tuple at offset \d+/;
+ }
+ elsif ($offnum == 34)
+ {
+ $tup->{t_xmax} = 0;
+ push @expected,
+ qr/${header}tuple has been HOT updated, but xmax is 0/;
+ }
+ elsif ($offnum == 35)
+ {
+ $tup->{t_xmin} = $in_progress_xid;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ push @expected,
+ qr/${header}tuple with in-progress xmin \d+ was updated to produce a tuple at offset \d+ with committed xmin \d+/;
+ }
+ elsif ($offnum == 36)
+ {
+ # Tuple at offset 43 is the successor of this one; we'll corrupt it to
+ # have xmin = $in_progress_xid. By setting the xmax of this tuple to
+ # the same value, we make it look like an update chain with an
+ # in-progress XID following a committed one.
+ $tup->{t_xmin} = $aborted_xid;
+ $tup->{t_xmax} = $in_progress_xid;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ push @expected,
+ qr/${header}tuple with aborted xmin \d+ was updated to produce a tuple at offset \d+ with in-progress xmin \d+/;
+ }
+ elsif ($offnum == 40)
+ {
+ # Tuple at offset 33 is the predecessor of this one; the error will
+ # be reported there.
+ $tup->{t_infomask2} &= ~HEAP_ONLY_TUPLE;
+ }
+ elsif ($offnum == 43)
+ {
+ # Tuple at offset 36 is the predecessor of this one; the error will
+ # be reported there.
+ $tup->{t_xmin} = $in_progress_xid;
+ $tup->{t_infomask} &= ~HEAP_XMIN_COMMITTED;
+ }
+ else
+ {
+ # The tests for update chain validation end up creating a bunch of
+ # tuples that aren't corrupted in any way e.g. because only one of
+ # the two tuples in the update chain needs to be corrupted for the
+ # test, or because one update chain is being made to erroneously
+ # point into the middle of another that has nothing wrong with it.
+ # In all such cases we need not write the tuple back to the file.
+ next;
+ }
+
+ write_tuple($file, $offset, $tup) if defined $tup;
+}
+close($file)
+ or BAIL_OUT("close failed: $!");
+$node->start;
+
+# Run pg_amcheck against the corrupt table with epoch=0, comparing actual
+# corruption messages against the expected messages
+$node->command_checks_all(
+ [ 'pg_amcheck', '--no-dependent-indexes', '-p', $port, 'postgres' ],
+ 2, [@expected], [], 'Expected corruption message output');
+$node->safe_psql(
+ 'postgres', qq(
+ COMMIT PREPARED 'in_progress_tx';
+ ));
+
+$node->teardown_node;
+$node->clean_node;
+
+done_testing();
diff --git a/src/bin/pg_amcheck/t/005_opclass_damage.pl b/src/bin/pg_amcheck/t/005_opclass_damage.pl
new file mode 100644
index 0000000..fd47617
--- /dev/null
+++ b/src/bin/pg_amcheck/t/005_opclass_damage.pl
@@ -0,0 +1,60 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# This regression test checks the behavior of the btree validation in the
+# presence of breaking sort order changes.
+#
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('test');
+$node->init;
+$node->start;
+
+# Create a custom operator class and an index which uses it.
+$node->safe_psql(
+ 'postgres', q(
+ CREATE EXTENSION amcheck;
+
+ CREATE FUNCTION int4_asc_cmp (a int4, b int4) RETURNS int LANGUAGE sql AS $$
+ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN 1 ELSE -1 END; $$;
+
+ CREATE OPERATOR CLASS int4_fickle_ops FOR TYPE int4 USING btree AS
+ OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4),
+ OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4),
+ OPERATOR 5 > (int4, int4), FUNCTION 1 int4_asc_cmp(int4, int4);
+
+ CREATE TABLE int4tbl (i int4);
+ INSERT INTO int4tbl (SELECT * FROM generate_series(1,1000) gs);
+ CREATE INDEX fickleidx ON int4tbl USING btree (i int4_fickle_ops);
+));
+
+# We have not yet broken the index, so we should get no corruption
+$node->command_like([ 'pg_amcheck', '-p', $node->port, 'postgres' ],
+ qr/^$/,
+ 'pg_amcheck all schemas, tables and indexes reports no corruption');
+
+# Change the operator class to use a function which sorts in a different
+# order to corrupt the btree index
+$node->safe_psql(
+ 'postgres', q(
+ CREATE FUNCTION int4_desc_cmp (int4, int4) RETURNS int LANGUAGE sql AS $$
+ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN -1 ELSE 1 END; $$;
+ UPDATE pg_catalog.pg_amproc
+ SET amproc = 'int4_desc_cmp'::regproc
+ WHERE amproc = 'int4_asc_cmp'::regproc
+));
+
+# Index corruption should now be reported
+$node->command_checks_all(
+ [ 'pg_amcheck', '-p', $node->port, 'postgres' ],
+ 2,
+ [qr/item order invariant violated for index "fickleidx"/],
+ [],
+ 'pg_amcheck all schemas, tables and indexes reports fickleidx corruption'
+);
+
+done_testing();
diff --git a/src/bin/pg_archivecleanup/.gitignore b/src/bin/pg_archivecleanup/.gitignore
new file mode 100644
index 0000000..bd05d00
--- /dev/null
+++ b/src/bin/pg_archivecleanup/.gitignore
@@ -0,0 +1,3 @@
+/pg_archivecleanup
+
+/tmp_check/
diff --git a/src/bin/pg_archivecleanup/Makefile b/src/bin/pg_archivecleanup/Makefile
new file mode 100644
index 0000000..49935d6
--- /dev/null
+++ b/src/bin/pg_archivecleanup/Makefile
@@ -0,0 +1,36 @@
+# src/bin/pg_archivecleanup/Makefile
+
+PGFILEDESC = "pg_archivecleanup - cleans archive when used with streaming replication"
+PGAPPICON = win32
+
+subdir = src/bin/pg_archivecleanup
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_archivecleanup.o
+
+all: pg_archivecleanup
+
+pg_archivecleanup: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_archivecleanup$(X) '$(DESTDIR)$(bindir)/pg_archivecleanup$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_archivecleanup$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_archivecleanup$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build
new file mode 100644
index 0000000..28349db
--- /dev/null
+++ b/src/bin/pg_archivecleanup/meson.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_archivecleanup_sources = files(
+ 'pg_archivecleanup.c',
+)
+
+if host_system == 'windows'
+ pg_archivecleanup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_archivecleanup',
+ '--FILEDESC', 'pg_archivecleanup - cleans archive when used with streaming replication',])
+endif
+
+pg_archivecleanup = executable('pg_archivecleanup',
+ pg_archivecleanup_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_archivecleanup
+
+tests += {
+ 'name': 'pg_archivecleanup',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/010_pg_archivecleanup.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_archivecleanup/nls.mk b/src/bin/pg_archivecleanup/nls.mk
new file mode 100644
index 0000000..801cf1c
--- /dev/null
+++ b/src/bin/pg_archivecleanup/nls.mk
@@ -0,0 +1,5 @@
+# src/bin/pg_archivecleanup/nls.mk
+CATALOG_NAME = pg_archivecleanup
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_archivecleanup.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
new file mode 100644
index 0000000..7726d05
--- /dev/null
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -0,0 +1,375 @@
+/*
+ * pg_archivecleanup.c
+ *
+ * To be used as archive_cleanup_command to clean an archive when using
+ * standby mode.
+ *
+ * src/bin/pg_archivecleanup/pg_archivecleanup.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/time.h>
+
+#include "access/xlog_internal.h"
+#include "common/logging.h"
+#include "pg_getopt.h"
+
+const char *progname;
+
+/* Options and defaults */
+bool dryrun = false; /* are we performing a dry-run operation? */
+char *additional_ext = NULL; /* Extension to remove from filenames */
+
+char *archiveLocation; /* where to find the archive? */
+char *restartWALFileName; /* the file from which we can restart restore */
+char exclusiveCleanupFileName[MAXFNAMELEN]; /* the oldest file we want
+ * to remain in archive */
+
+
+/* =====================================================================
+ *
+ * Customizable section
+ *
+ * =====================================================================
+ *
+ * Currently, this section assumes that the Archive is a locally
+ * accessible directory. If you want to make other assumptions,
+ * such as using a vendor-specific archive and access API, these
+ * routines are the ones you'll need to change. You're
+ * encouraged to submit any changes to pgsql-hackers@lists.postgresql.org
+ * or personally to the current maintainer. Those changes may be
+ * folded in to later versions of this program.
+ */
+
+/*
+ * Initialize allows customized commands into the archive cleanup program.
+ *
+ * You may wish to add code to check for tape libraries, etc..
+ */
+static void
+Initialize(void)
+{
+ /*
+ * This code assumes that archiveLocation is a directory, so we use stat
+ * to test if it's accessible.
+ */
+ struct stat stat_buf;
+
+ if (stat(archiveLocation, &stat_buf) != 0 ||
+ !S_ISDIR(stat_buf.st_mode))
+ {
+ pg_log_error("archive location \"%s\" does not exist",
+ archiveLocation);
+ exit(2);
+ }
+}
+
+static void
+TrimExtension(char *filename, char *extension)
+{
+ int flen;
+ int elen;
+
+ if (extension == NULL)
+ return;
+
+ elen = strlen(extension);
+ flen = strlen(filename);
+
+ if (flen > elen && strcmp(filename + flen - elen, extension) == 0)
+ filename[flen - elen] = '\0';
+}
+
+static void
+CleanupPriorWALFiles(void)
+{
+ int rc;
+ DIR *xldir;
+ struct dirent *xlde;
+ char walfile[MAXPGPATH];
+
+ if ((xldir = opendir(archiveLocation)) != NULL)
+ {
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ /*
+ * Truncation is essentially harmless, because we skip names of
+ * length other than XLOG_FNAME_LEN. (In principle, one could use
+ * a 1000-character additional_ext and get trouble.)
+ */
+ strlcpy(walfile, xlde->d_name, MAXPGPATH);
+ TrimExtension(walfile, additional_ext);
+
+ /*
+ * We ignore the timeline part of the XLOG segment identifiers in
+ * deciding whether a segment is still needed. This ensures that
+ * we won't prematurely remove a segment from a parent timeline.
+ * We could probably be a little more proactive about removing
+ * segments of non-parent timelines, but that would be a whole lot
+ * more complicated.
+ *
+ * We use the alphanumeric sorting property of the filenames to
+ * decide which ones are earlier than the exclusiveCleanupFileName
+ * file. Note that this means files are not removed in the order
+ * they were originally written, in case this worries you.
+ */
+ if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) &&
+ strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
+ {
+ char WALFilePath[MAXPGPATH * 2]; /* the file path
+ * including archive */
+
+ /*
+ * Use the original file name again now, including any
+ * extension that might have been chopped off before testing
+ * the sequence.
+ */
+ snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s",
+ archiveLocation, xlde->d_name);
+
+ if (dryrun)
+ {
+ /*
+ * Prints the name of the file to be removed and skips the
+ * actual removal. The regular printout is so that the
+ * user can pipe the output into some other program.
+ */
+ printf("%s\n", WALFilePath);
+ pg_log_debug("file \"%s\" would be removed", WALFilePath);
+ continue;
+ }
+
+ pg_log_debug("removing file \"%s\"", WALFilePath);
+
+ rc = unlink(WALFilePath);
+ if (rc != 0)
+ pg_fatal("could not remove file \"%s\": %m",
+ WALFilePath);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read archive location \"%s\": %m",
+ archiveLocation);
+ if (closedir(xldir))
+ pg_fatal("could not close archive location \"%s\": %m",
+ archiveLocation);
+ }
+ else
+ pg_fatal("could not open archive location \"%s\": %m",
+ archiveLocation);
+}
+
+/*
+ * SetWALFileNameForCleanup()
+ *
+ * Set the earliest WAL filename that we want to keep on the archive
+ * and decide whether we need cleanup
+ */
+static void
+SetWALFileNameForCleanup(void)
+{
+ bool fnameOK = false;
+
+ TrimExtension(restartWALFileName, additional_ext);
+
+ /*
+ * If restartWALFileName is a WAL file name then just use it directly. If
+ * restartWALFileName is a .partial or .backup filename, make sure we use
+ * the prefix of the filename, otherwise we will remove wrong files since
+ * 000000010000000000000010.partial and
+ * 000000010000000000000010.00000020.backup are after
+ * 000000010000000000000010.
+ */
+ if (IsXLogFileName(restartWALFileName))
+ {
+ strcpy(exclusiveCleanupFileName, restartWALFileName);
+ fnameOK = true;
+ }
+ else if (IsPartialXLogFileName(restartWALFileName))
+ {
+ int args;
+ uint32 tli = 1,
+ log = 0,
+ seg = 0;
+
+ args = sscanf(restartWALFileName, "%08X%08X%08X.partial",
+ &tli, &log, &seg);
+ if (args == 3)
+ {
+ fnameOK = true;
+
+ /*
+ * Use just the prefix of the filename, ignore everything after
+ * first period
+ */
+ XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
+ }
+ }
+ else if (IsBackupHistoryFileName(restartWALFileName))
+ {
+ int args;
+ uint32 tli = 1,
+ log = 0,
+ seg = 0,
+ offset = 0;
+
+ args = sscanf(restartWALFileName, "%08X%08X%08X.%08X.backup", &tli, &log, &seg, &offset);
+ if (args == 4)
+ {
+ fnameOK = true;
+
+ /*
+ * Use just the prefix of the filename, ignore everything after
+ * first period
+ */
+ XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
+ }
+ }
+
+ if (!fnameOK)
+ {
+ pg_log_error("invalid file name argument");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+}
+
+/* =====================================================================
+ * End of Customizable section
+ * =====================================================================
+ */
+
+static void
+usage(void)
+{
+ printf(_("%s removes older WAL files from PostgreSQL archives.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -d generate debug output (verbose mode)\n"));
+ printf(_(" -n dry run, show the names of the files that would be removed\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -x EXT clean up files if they have this extension\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\n"
+ "For use as archive_cleanup_command in postgresql.conf:\n"
+ " archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+ "e.g.\n"
+ " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"));
+ printf(_("\n"
+ "Or for use as a standalone archive cleaner:\n"
+ "e.g.\n"
+ " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*------------ MAIN ----------------------------------------*/
+int
+main(int argc, char **argv)
+{
+ int c;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_archivecleanup"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_archivecleanup (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt(argc, argv, "dnx:")) != -1)
+ {
+ switch (c)
+ {
+ case 'd': /* Debug mode */
+ pg_logging_increase_verbosity();
+ break;
+ case 'n': /* Dry-Run mode */
+ dryrun = true;
+ break;
+ case 'x':
+ additional_ext = pg_strdup(optarg); /* Extension to remove
+ * from xlogfile names */
+ break;
+ default:
+ /* getopt already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+ }
+
+ /*
+ * We will go to the archiveLocation to check restartWALFileName.
+ * restartWALFileName may not exist anymore, which would not be an error,
+ * so we separate the archiveLocation and restartWALFileName so we can
+ * check separately whether archiveLocation exists, if not that is an
+ * error
+ */
+ if (optind < argc)
+ {
+ archiveLocation = argv[optind];
+ optind++;
+ }
+ else
+ {
+ pg_log_error("must specify archive location");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+
+ if (optind < argc)
+ {
+ restartWALFileName = argv[optind];
+ optind++;
+ }
+ else
+ {
+ pg_log_error("must specify oldest kept WAL file");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(2);
+ }
+
+ /*
+ * Check archive exists and other initialization if required.
+ */
+ Initialize();
+
+ /*
+ * Check filename is a valid name, then process to find cut-off
+ */
+ SetWALFileNameForCleanup();
+
+ pg_log_debug("keeping WAL file \"%s/%s\" and later",
+ archiveLocation, exclusiveCleanupFileName);
+
+ /*
+ * Remove WAL files older than cut-off
+ */
+ CleanupPriorWALFiles();
+
+ exit(0);
+}
diff --git a/src/bin/pg_archivecleanup/po/LINGUAS b/src/bin/pg_archivecleanup/po/LINGUAS
new file mode 100644
index 0000000..4cc8bed
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_archivecleanup/po/cs.po b/src/bin/pg_archivecleanup/po/cs.po
new file mode 100644
index 0000000..3a9419c
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/cs.po
@@ -0,0 +1,198 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2020-10-31 21:37+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "archivní lokace \"%s\" neexistuje"
+
+#: pg_archivecleanup.c:152
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "nelze odstranit soubor \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "nelze naÄíst archivní lokaci \"%s\": %m"
+
+#: pg_archivecleanup.c:163
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "nelze uzavřít archivní lokaci \"%s\": %m"
+
+#: pg_archivecleanup.c:167
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "nelze otevřít archivní lokaci \"%s\": %m"
+
+#: pg_archivecleanup.c:240
+#, c-format
+msgid "invalid file name argument"
+msgstr "chybný argument jména souboru"
+
+#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336
+#: pg_archivecleanup.c:348 pg_archivecleanup.c:355
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s odstraní starší WAL soubory z PostgreSQL archivů.\n"
+"\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe:\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d vygeneruje debug výstup (více informací)\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n zkušební běh, ukazuje jména souborů které by byly odstraněny\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypíše informaci o verzi, pak skonÄí\n"
+
+#: pg_archivecleanup.c:261
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT vyÄistí soubory pokud mají tuto příponu\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovÄ›du, a skonÄí\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Pro použití jako archive_cleanup_command v recovery.conf pokud standby_mode = on:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:268
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Nebo jako samostatný ÄistiÄ archivu:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:272
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_archivecleanup.c:273
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_archivecleanup.c:335
+#, c-format
+msgid "must specify archive location"
+msgstr "nutno zadat archivní lokaci"
+
+#: pg_archivecleanup.c:347
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "nutno zadat nejstarÄí uchovávaný WAL soubor"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "too many command-line arguments"
+msgstr "příliš mnoho argumentů na příkazové řádce"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: soubor \"%s\" by byl odstraněn\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: odstraňuji soubor \"%s\"\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s: ERROR: nelze odstranit soubor \"%s\": %s\n"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: uchovávám WAL soubor \"%s\" a novější\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_archivecleanup/po/de.po b/src/bin/pg_archivecleanup/po/de.po
new file mode 100644
index 0000000..64ff8d9
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/de.po
@@ -0,0 +1,183 @@
+# pg_archivecleanup message translation file for pg_archivecleanup
+# Copyright (C) 2019-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Peter Eisentraut <peter@eisentraut.org>, 2019 - 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:50+0000\n"
+"PO-Revision-Date: 2022-05-11 22:07+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "Archivverzeichnis »%s« existiert nicht"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "konnte Archivverzeichnis »%s« nicht lesen: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "konnte Archivverzeichnis »%s« nicht schließen: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "konnte Archivverzeichnis »%s« nicht öffnen: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ungültiges Dateinamenargument"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s entfernt alte WAL-Dateien aus PostgreSQL-Archiven.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... ARCHIVVERZEICHNIS ÄLTESTE-ZU-BEHALTENE-WALDATEI\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d Debug-Ausgaben erzeugen (Verbose-Modus)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n Probelauf, Namen der Dateien anzeigen, die entfernt würden\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x ERW Dateien mit dieser Erweiterung aufräumen\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Verwendung als archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVVERZ %%r'\n"
+"z.B.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiv %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Oder alleinstehende Verwendung zum Aufräumen eines Archivs:\n"
+"z.B.\n"
+" pg_archivecleanup /mnt/server/archiv 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "Archivverzeichnis muss angegeben werden"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "älteste zu behaltene WAL-Datei muss angegeben werden"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "zu viele Kommandozeilenargumente"
diff --git a/src/bin/pg_archivecleanup/po/el.po b/src/bin/pg_archivecleanup/po/el.po
new file mode 100644
index 0000000..5a1b7a6
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/el.po
@@ -0,0 +1,189 @@
+# Greek message translation file for pg_archivecleanup
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 16:50+0000\n"
+"PO-Revision-Date: 2023-04-13 13:51+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "η τοποθεσία της αÏχειοθήκης «%s» δεν υπάÏχει"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση του αÏχείου «%s»: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση της τοποθεσίας αÏχειοθήκης «%s»: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο της τοποθεσίας αÏχειοθήκης «%s»: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα της τοποθεσίας αÏχειοθήκης «%s»: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "μη έγκυÏη παÏάμετÏος ονόματος αÏχείου"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s αφαιÏεί παλαιότεÏα αÏχεία WAL από αÏχειοθήκες PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d δημιουÏγία εξόδου αποσφαλμάτωσης (πεÏιφÏαστική λειτουÏγία)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n ξηÏή λειτουÏγία, εμφάνιση των ονομάτων των αÏχείων που θα αφαιÏεθοÏν\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT εκκαθάÏιση αÏχείων εάν πεÏιέχουν αυτήν την επέκταση\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Για χÏήση ως archive_cleanup_command στο postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [ΕΠΙΛΟΓΗ]... ARCHIVELOCATION %%r’\n"
+"π.χ.\n"
+" archive_cleanup_command = ‘pg_archivecleanup /mnt/διακομιστής/αÏχειοθήκη %%r’\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Ή για χÏήση ως αυτόνομο εκκαθαÏιστικό αÏχειοθήκης:\n"
+"π.χ.\n"
+" pg_archivecleanup /mnt/server/archiverdir 0000000100000000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "Ï€Ïέπει να καθοÏίσετε τη τοποθεσία αÏχειοθήκης"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "Ï€Ïέπει να καθοÏίσετε το παλαιότεÏο κÏατημένο αÏχείο WAL"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
diff --git a/src/bin/pg_archivecleanup/po/es.po b/src/bin/pg_archivecleanup/po/es.po
new file mode 100644
index 0000000..902f4a8
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/es.po
@@ -0,0 +1,185 @@
+# Spanish message translation file for pg_archivecleanup
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:21+0000\n"
+"PO-Revision-Date: 2023-05-22 12:05+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.0\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "ubicación de archivador «%s» no existe"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "no se pudo eliminar el archivo «%s»: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "no se pudo leer la ubicación del archivador «%s»: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "no se pudo cerrar la ubicación del archivador «%s»: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "no se pudo abrir la ubicación del archivador «%s»: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "el nombre de archivo usado como argumento no es válido"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s elimina archivos de WAL antiguos del archivador de PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPCIÓN].... UBICACIÓNARCHIVADOR WALMÃSANTIGUOAMANTENER\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d genera salida de depuración (modo verboso)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n simulacro, muestra el nombre de los archivos que se eliminarían\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version muestra información de la versión, luego sale\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT hace limpieza de archivos que tengan esta extensión\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help muestra esta ayuda, luego sale\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Para usar como archive_cleanup_command en postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPCIÓN]... UBICACIÓNARCHIVADOR %%r'\n"
+"por ej.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/servidor/directorioarchivador %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"O para usar como un limpiador de archivador de forma independiente:\n"
+"por ej.\n"
+" pg_archivecleanup /mnt/servidor/directorioarchivador 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "debe especificar la ubicación del archivador"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "debe especificar el fichero WAL más antiguo a mantener"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "demasiados argumentos de línea de órdenes"
diff --git a/src/bin/pg_archivecleanup/po/fr.po b/src/bin/pg_archivecleanup/po/fr.po
new file mode 100644
index 0000000..0ac310c
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/fr.po
@@ -0,0 +1,218 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:280
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:291
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:298
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "l'emplacement d'archivage « %s » n'existe pas"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "n'a pas pu lire l'emplacement de l'archive « %s » : %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "n'a pas pu fermer l'emplacement de l'archive « %s » : %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "n'a pas pu ouvrir l'emplacement de l'archive « %s » : %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "argument du nom de fichier invalide"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s supprime les anciens fichiers WAL des archives de PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... EMPLACEMENTARCHIVE PLUSANCIENFICHIERWALCONSERVÉ\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d affiche des informations de débugage (mode verbeux)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n test, affiche le nom des fichiers qui seraient supprimés\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version et quitte\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT nettoie les fichiers s'ils ont cette extension\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide et quitte\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Pour utiliser comme archive_cleanup_command dans postgresql.conf :\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... EMPLACEMENTARCHIVE %%r'\n"
+"Par exemple :\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/serveur/reparchives %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Ou pour utiliser comme nettoyeur autonome d'archives :\n"
+"Par exemple :\n"
+" pg_archivecleanup /mnt/serveur/reparchives 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "doit spécifier l'emplacement de l'archive"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "doit spécifier le plus ancien journal de transactions conservé"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "trop d'arguments en ligne de commande"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s : ERREUR : n'a pas pu supprimer le fichier « %s » : %s\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s : le fichier « %s » serait supprimé\n"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s : conservation du fichier WAL « %s » et des suivants\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s : suppression du fichier « %s »\n"
+
+#~ msgid "%s: too many parameters\n"
+#~ msgstr "%s : trop de paramètres\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
diff --git a/src/bin/pg_archivecleanup/po/it.po b/src/bin/pg_archivecleanup/po/it.po
new file mode 100644
index 0000000..59f77c2
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/it.po
@@ -0,0 +1,184 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2023-09-05 08:03+0200\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore:"
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "il percorso di archiviazione \"%s\" non esiste"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "rimozione del file \"%s\" fallita: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "impossibile leggere la posizione dell'archivio \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "impossibile chiudere la posizione dell'archivio \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "impossibile aprire la posizione dell'archivio \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "argomento nome file non valido"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s rimuove i file WAL meno recenti dagli archivi PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr "%s [OPZIONE]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d genera output di debug (modalità dettagliata)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n dry run, mostra i nomi dei file che verrebbero rimossi\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT ripulisce i file se hanno questa estensione\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Da utilizzare come archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPZIONE]... ARCHIVELOCATION %%r'\n"
+"per esempio.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"O per l'uso come pulitore di archivi autonomo:\n"
+"per esempio.\n"
+" pg_archivecleanup /mnt/server/archiverdir 0000000100000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "deve specificare la posizione dell'archivio"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "deve specificare il file WAL più vecchio conservato"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "troppi argomenti della riga di comando"
diff --git a/src/bin/pg_archivecleanup/po/ja.po b/src/bin/pg_archivecleanup/po/ja.po
new file mode 100644
index 0000000..ea705fb
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ja.po
@@ -0,0 +1,183 @@
+# Japanese message translation file for pg_archivecleanup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-04 09:43+0900\n"
+"PO-Revision-Date: 2023-07-04 09:48+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "アーカイブã®å ´æ‰€\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "アーカイブã®å ´æ‰€\"%s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "アーカイブã®å ´æ‰€\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "アーカイブã®å ´æ‰€\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ファイルå引数ãŒç„¡åŠ¹ã§ã™"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‹ã‚‰å¤ã„WALファイルを削除ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "使用法:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr "%s [オプション] ... {アーカイブã®å ´æ‰€} {ä¿å­˜ã™ã‚‹æœ€å¤ã® WAL ファイルå}\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d デãƒãƒƒã‚°æƒ…報を出力(冗長モード)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n リãƒãƒ¼ã‚µãƒ«ã€å‰Šé™¤å¯¾è±¡ã®ãƒ•ã‚¡ã‚¤ãƒ«åを表示\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦ã€çµ‚了ã—ã¾ã™\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT ã“ã®æ‹¡å¼µå­ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã™ã‚‹\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦ã€çµ‚了ã—ã¾ã™\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"postgresql.confã§archive_cleanup_commandã¨ã—ã¦ä½¿ç”¨ã™ã‚‹å ´åˆã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™:\n"
+" archive_cleanup_command = 'pg_archivecleanup [オプション]... アーカイブã®å ´æ‰€ %%r'\n"
+"例ã¨ã—ã¦ã¯:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"ã‚‚ã—ãã¯ã‚¹ã‚¿ãƒ³ãƒ‰ã‚¢ãƒ­ãƒ³ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–クリーナーã¨ã—ã¦ä½¿ã†å ´åˆã¯:\n"
+"使用例\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "アーカイブã®å ´æ‰€ã‚’指定ã—ã¦ãã ã•ã„"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "ä¿å­˜ã™ã‚‹æœ€å¤ã®WALファイルを指定ã—ã¦ãã ã•ã„"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™"
diff --git a/src/bin/pg_archivecleanup/po/ka.po b/src/bin/pg_archivecleanup/po/ka.po
new file mode 100644
index 0000000..6bfc887
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ka.po
@@ -0,0 +1,197 @@
+# Georgian message translation file for pg_archivecleanup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:50+0000\n"
+"PO-Revision-Date: 2022-07-04 09:06+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ\"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ\"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ\"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბიდáƒáƒœ ძველი WAL ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡áƒ›áƒ“გáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რუძველესიშენáƒáƒ®áƒ£áƒšáƒ˜WALფáƒáƒ˜áƒšáƒ˜\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr ""
+" -d, --debug გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ(verbose mode)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be "
+"removed\n"
+msgstr ""
+" -n მშრáƒáƒšáƒ˜ გáƒáƒ¨áƒ•áƒ”ბáƒ. ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ˜áƒ¡ მáƒáƒ’იერ მხáƒáƒšáƒáƒ“ მáƒáƒ—ი "
+"სáƒáƒ®áƒ”ლების ჩვენებáƒ\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr ""
+" -x EXT ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბáƒ, თუ მáƒáƒ— ეს გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir "
+"%%r'\n"
+msgstr ""
+"\n"
+"გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“, რáƒáƒ’áƒáƒ áƒª archive_cleanup_command postgresql.conf-ში: \n"
+" archive_cleanup_command = 'pg_archivecleanup [პáƒáƒ áƒáƒ›áƒ”ტრი]... "
+"áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡áƒ›áƒ“ებáƒáƒ áƒ”áƒáƒ‘რ%%r'\n"
+"მáƒáƒ’: \n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir "
+"%%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"áƒáƒœ ეული áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ გáƒáƒ›áƒ¬áƒ›áƒ”ნდáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+"მáƒáƒ’:\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "დáƒáƒ¢áƒáƒ•áƒ”ბული უძველესი WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი"
diff --git a/src/bin/pg_archivecleanup/po/ko.po b/src/bin/pg_archivecleanup/po/ko.po
new file mode 100644
index 0000000..a4601e2
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ko.po
@@ -0,0 +1,189 @@
+# LANGUAGE 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.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:51+0000\n"
+"PO-Revision-Date: 2023-05-30 12:38+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "\"%s\" ì´ë¦„ì˜ ì•„ì¹´ì´ë¸Œ 위치가 ì—†ìŒ"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ìž˜ëª»ëœ íŒŒì¼ ì´ë¦„ 매개변수"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s ëª…ë ¹ì€ PostgreSQL ì•„ì¹´ì´ë¸Œ 보관소ì—ì„œ 오래ëœ\n"
+"WAL 파ì¼ì„ 지ì›ë‹ˆë‹¤.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [옵션]... ì•„ì¹´ì´ë¸Œìœ„치 보관할제ì¼ì˜¤ëž˜ëœíŒŒì¼\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d 보다 ìžì„¸í•œ ìž‘ì—… ë‚´ìš© 출력\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be removed\n"
+msgstr " -n 지울 대ìƒë§Œ 확ì¸í•˜ê³  지우지는 ì•ŠìŒ\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT 해당 í™•ìž¥ìž íŒŒì¼ë“¤ì„ ìž‘ì—… 대ìƒìœ¼ë¡œ 함\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"postgresql.conf 파ì¼ì—ì„œ archive_cleanup_command 설정 방법:\n"
+" archive_cleanup_command = 'pg_archivecleanup [옵션]... ì•„ì¹´ì´ë¸Œìœ„치 %%r'\n"
+"사용예:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"ë˜ëŠ” 명령행ì—ì„œ ë…립ì ìœ¼ë¡œ 사용하는 경우:\n"
+"사용예:\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "ì•„ì¹´ì´ë¸Œ 위치는 지정해야 함"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "남길 가장 ì˜¤ëž˜ëœ WAL 파ì¼ì€ 지정해야 함"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했ìŒ"
diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build
new file mode 100644
index 0000000..c6f33ed
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_archivecleanup/po/pl.po b/src/bin/pg_archivecleanup/po/pl.po
new file mode 100644
index 0000000..0b5e9d4
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/pl.po
@@ -0,0 +1,178 @@
+# LANGUAGE 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.
+# grzegorz <begina.felicysym@wp.eu>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-03-14 17:45+0000\n"
+"PO-Revision-Date: 2017-03-14 19:43+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: pg_archivecleanup.c:73
+#, c-format
+msgid "%s: archive location \"%s\" does not exist\n"
+msgstr "%s: lokacja archiwum \"%s\" nie istnieje\n"
+
+#: pg_archivecleanup.c:149
+#, c-format
+msgid "%s: file \"%s\" would be removed\n"
+msgstr "%s: plik \"%s\" zostanie usunięty\n"
+
+#: pg_archivecleanup.c:155
+#, c-format
+msgid "%s: removing file \"%s\"\n"
+msgstr "%s: usuwanie pliku \"%s\"\n"
+
+#: pg_archivecleanup.c:161
+#, c-format
+msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+msgstr "%s: BÅÄ„D: nie daÅ‚o siÄ™ usunąć pliku \"%s\": %s\n"
+
+#: pg_archivecleanup.c:169
+#, c-format
+msgid "%s: could not read archive location \"%s\": %s\n"
+msgstr "%s: nie można czytać z lokacji archiwum \"%s\": %s\n"
+
+#: pg_archivecleanup.c:172
+#, c-format
+msgid "%s: could not close archive location \"%s\": %s\n"
+msgstr "%s: nie można zamknąć lokacji archiwum \"%s\": %s\n"
+
+#: pg_archivecleanup.c:176
+#, c-format
+msgid "%s: could not open archive location \"%s\": %s\n"
+msgstr "%s: nie można otworzyć lokacji archiwum \"%s\": %s\n"
+
+#: pg_archivecleanup.c:249
+#, c-format
+msgid "%s: invalid filename input\n"
+msgstr "%s: niepoprawna nazwa pliku wejścia\n"
+
+#: pg_archivecleanup.c:250 pg_archivecleanup.c:322 pg_archivecleanup.c:343
+#: pg_archivecleanup.c:355 pg_archivecleanup.c:362
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Użyj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s usuwa starsze pliki WAL z archiwów PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:264
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPCJA]... LOKACJAARCHIWUM NAJSTARSZYZACHOWANYPLIKWAL\n"
+
+#: pg_archivecleanup.c:266
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcje:\n"
+
+#: pg_archivecleanup.c:267
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d generuje informacje diagnostyczne (trym rozgadany)\n"
+
+#: pg_archivecleanup.c:268
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n przebieg próbny, pokazuje nazwy plików do usunięcia\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version wypisuje informacje o wersji i kończy\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT czyści pliki jeśli mają takie rozszerzenie\n"
+
+#: pg_archivecleanup.c:271
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokazuje ten ekran pomocy i kończy\n"
+
+#: pg_archivecleanup.c:272
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in recovery.conf when standby_mode = on:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Do użycia jako archive_cleanup_command w recovery.conf kiedy standby_mode = "
+"on:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPCJA]... LOKACJAARCHIWUM %%"
+"r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:277
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Lub by użyć podczas samodzielnego czyszczenia archiwów:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:281
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_archivecleanup.c:342
+#, c-format
+msgid "%s: must specify archive location\n"
+msgstr "%s: wymagane wskazanie lokacji archiwum\n"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "%s: must specify restartfilename\n"
+msgstr "%s: wymagane wskazanie nazwy pliku restartu\n"
+
+#: pg_archivecleanup.c:361
+#, c-format
+msgid "%s: too many parameters\n"
+msgstr "%s: za dużo parametrów\n"
+
+#: pg_archivecleanup.c:380
+#, c-format
+msgid "%s: keep WAL file \"%s\" and later\n"
+msgstr "%s: zachowaj plik WAL \"%s\" a następnie\n"
diff --git a/src/bin/pg_archivecleanup/po/pt_BR.po b/src/bin/pg_archivecleanup/po/pt_BR.po
new file mode 100644
index 0000000..9e6eb51
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/pt_BR.po
@@ -0,0 +1,185 @@
+# Brazilian Portuguese message translation file for pg_archivecleanup
+
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2023-08-17 16:32+0200\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "local da cópia de segurança \"%s\" não existe"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "não pôde remover arquivo \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "não pôde ler local da cópia de segurança \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "não pôde fechar local da cópia de segurança \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "não pôde abrir local da cópia de segurança \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "argumento de nome de arquivo é inválido"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s remove arquivos mais antigos do WAL da cópia de segurança do PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPÇÃO]... LOCALARCHIVE ARQUIVOWALMAISANTIGO\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d gera saída de depuração (modo detalhe)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n execução simulada, mostra os nomes dos arquivos que seriam removidos\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT limpa arquivos se eles têm esta extensão\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Para usar com archive_cleanup_command no postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPÇÃO]... LOCALARCHIVE %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Ou para usar como um limpador autônomo da cópia de segurança:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "deve especificar local da cópia de segurança"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "deve especificar o arquvo do WAL mais antigo a ser mantido"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "muitos argumentos de linha de comando"
diff --git a/src/bin/pg_archivecleanup/po/ru.po b/src/bin/pg_archivecleanup/po/ru.po
new file mode 100644
index 0000000..c28de42
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/ru.po
@@ -0,0 +1,212 @@
+# 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.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2019, 2020, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "раÑположение архива \"%s\" не ÑущеÑтвует"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать раÑположение архива \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть раÑположение архива \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть раÑположение архива \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "неверный аргумент Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ файла"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s удалÑет Ñтарые файлы WAL из архивов PostgreSQL.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr ""
+" %s [ПÐРÐМЕТР]... РÐСПОЛОЖЕÐИЕ_ÐРХИВРСТÐРЕЙШИЙ_СОХРÐÐЯЕМЫЙ_ФÐЙЛ_WAL\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d генерировать подробные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (отладочный режим)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be removed\n"
+msgstr ""
+" -n холоÑтой запуÑк, только показать имена файлов, которые "
+"будут удалены\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+# well-spelled: РСШ
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x РСШ убрать файлы Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ раÑширением\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве archive_cleanup_command в postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [ПÐРÐМЕТР]... "
+"РÐСПОЛОЖЕÐИЕ_ÐРХИВР%%r'\n"
+"например:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Либо Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве отдельного ÑредÑтва очиÑтки архива,\n"
+"например:\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "необходимо задать раÑположение архива"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "необходимо задать Ð¸Ð¼Ñ Ñтарейшего ÑохранÑемого файла WAL"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "Ñлишком много аргументов командной Ñтроки"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: файл \"%s\" не будет удалён\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: удаление файла \"%s\"\n"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: будет Ñохранён файл WAL \"%s\" и поÑледующие\n"
diff --git a/src/bin/pg_archivecleanup/po/sv.po b/src/bin/pg_archivecleanup/po/sv.po
new file mode 100644
index 0000000..6cebbc1
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/sv.po
@@ -0,0 +1,184 @@
+# Swedish 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.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 13:50+0000\n"
+"PO-Revision-Date: 2022-04-11 16:06+0200\n"
+"Last-Translator: FDennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:268
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:275
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:287
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "arkivplats \"%s\" finns inte"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "kunde inte ta bort fil \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "kunde inte läsa arkivplats \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "kunde inte stänga arkivplats \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "kunde inte öppna arkivplats \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "ogiltigt filnamnsargument"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s tar bort gamla WAL-filer från PostgreSQLs arkiv.\n"
+"\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [FLAGGA]... ARKIVPLATS ÄLDSTASPARADEWALFIL\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d generera debugutskrift (utförligt läge)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n gör inga ändringar visa namn på de filer som skulle ha tagits bort\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x SUF städa upp filer om de har detta suffix\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"För att använda som archive_cleanup_command i postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [FLAGGA]... ARKIVPLATS %%r'\n"
+"t.ex.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Eller för att använda som en separat arkivstädare:\n"
+"t.ex.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "måste ange en arkivplats"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "måste ange äldsta sparade WAL-filen"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "för många kommandoradsargument"
diff --git a/src/bin/pg_archivecleanup/po/tr.po b/src/bin/pg_archivecleanup/po/tr.po
new file mode 100644
index 0000000..fac3be6
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/tr.po
@@ -0,0 +1,185 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:48+0000\n"
+"PO-Revision-Date: 2021-09-16 09:39+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: pg_archivecleanup.c:68
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "\"%s\" arÅŸiv lokasyonu mevcut deÄŸil"
+
+#: pg_archivecleanup.c:153
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" dosyası silinemedi: %m"
+
+#: pg_archivecleanup.c:161
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "\"%s\" arşiv lokasyonu okunamadı: %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "\"%s\" arşiv lokasyonu kapatılamadı: %m"
+
+#: pg_archivecleanup.c:168
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "\"%s\" arşiv lokasyonu açılamadı: %m"
+
+#: pg_archivecleanup.c:241
+#, c-format
+msgid "invalid file name argument"
+msgstr "geçersiz dosya adı argümanı"
+
+#: pg_archivecleanup.c:242 pg_archivecleanup.c:315 pg_archivecleanup.c:336
+#: pg_archivecleanup.c:348 pg_archivecleanup.c:355
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr "%s daha eski WAL dosyalarını PostgreSQL arşivlerinden kaldırır.\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [SECENEK]... ARSIVLOKASYONU TUTULANENESKIWALDOSYASI\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d hata ayıklama çıktısı oluştur (ayrıntılı açıklamalı mod)\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n tatbikat modu, sadece kaldırılacak dosyaların adlarını göster\n"
+
+#: pg_archivecleanup.c:261
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT bu uzantıya sahip dosyaları temizle\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_archivecleanup.c:264
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"postgresql.conf'da archive_cleanup_command olarak kullanmak için:\n"
+" archive_cleanup_command = 'pg_archivecleanup [SECENEK]... ARSIVLOKASYONU %%r'\n"
+"örnek:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+"\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Veya bağımsız bir arşiv temizleyici olarak kullanmak için: \n"
+"örnek:\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:273
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_archivecleanup.c:335
+#, c-format
+msgid "must specify archive location"
+msgstr "arÅŸiv lokasyonu belirtilmeli"
+
+#: pg_archivecleanup.c:347
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "tutulan en eski WAL dosyası belirtilmeli"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "too many command-line arguments"
+msgstr "çok fazla komut-satırı argümanı"
+
+#~ msgid "%s: keeping WAL file \"%s\" and later\n"
+#~ msgstr "%s: \"%s\" ve sonrasındaki WAl dosyaları tutuluyor\n"
+
+#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+#~ msgstr "%s: HATA: \"%s\" dosyası kaldırılamadı: %s\n"
+
+#~ msgid "%s: removing file \"%s\"\n"
+#~ msgstr "%s: \"%s\" dosyası kaldırılıyor\n"
+
+#~ msgid "%s: file \"%s\" would be removed\n"
+#~ msgstr "%s: \"%s\" dosyası kaldırılacak\n"
diff --git a/src/bin/pg_archivecleanup/po/uk.po b/src/bin/pg_archivecleanup/po/uk.po
new file mode 100644
index 0000000..120f799
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/uk.po
@@ -0,0 +1,173 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:51+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_archivecleanup.pot\n"
+"X-Crowdin-File-ID: 898\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "архівного Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує"
+
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не можливо видалити файл \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "недійÑна назва файла з аргументом"
+
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid "%s removes older WAL files from PostgreSQL archives.\n\n"
+msgstr "%s видалÑÑ” Ñтарі WAL-файли з архівів PostgreSQL.\n\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... РОЗТÐШУВÐÐÐЯ_ÐРХІВРÐÐЙДÐÐ’ÐІШИЙ_ЗБЕРЕЖЕÐИЙ_WAL_ФÐЙЛ\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d генерує налагоджувальні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ (детальний режим)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n Ñухий запуÑк, показує тільки Ñ‚Ñ– файли, Ñкі будуть видалені\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показати верÑÑ–ÑŽ, потім вийти\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT прибрати файли з цим розширеннÑм\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid "\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr "\n"
+"Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñк archive_cleanup_command у postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"напр.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid "\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr "\n"
+"Ðбо Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² ÑкоÑÑ‚Ñ– окремого заÑобу Ð´Ð»Ñ Ñ‡Ð¸Ñтки архівів,\n"
+"наприклад:\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "необхідно вказати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð°"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "необхідно вказати найдавніший збережений WAL-файл"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "занадто багато аргументів командного Ñ€Ñдка"
+
diff --git a/src/bin/pg_archivecleanup/po/vi.po b/src/bin/pg_archivecleanup/po/vi.po
new file mode 100644
index 0000000..e35f818
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/vi.po
@@ -0,0 +1,183 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-23 02:27+0900\n"
+"PO-Revision-Date: 2018-05-04 22:03+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: vi_VN\n"
+
+#: pg_archivecleanup.c:72
+#, c-format
+msgid "%s: archive location \"%s\" does not exist\n"
+msgstr "%s: vị trí lưu trữ \"%s\" không tồn tại\n"
+
+#: pg_archivecleanup.c:148
+#, c-format
+msgid "%s: file \"%s\" would be removed\n"
+msgstr "%s: tệp \"%s\" sẽ bị xóa\n"
+
+#: pg_archivecleanup.c:154
+#, c-format
+msgid "%s: removing file \"%s\"\n"
+msgstr "%s: đang xóa tệp \"%s\"\n"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "%s: ERROR: could not remove file \"%s\": %s\n"
+msgstr "%s: LỖI: không thể xóa tệp \"%s\": %s\n"
+
+#: pg_archivecleanup.c:168
+#, c-format
+msgid "%s: could not read archive location \"%s\": %s\n"
+msgstr "%s: không thể Ä‘á»c vị trí lÆ°u trữ \"%s\": %s\n"
+
+#: pg_archivecleanup.c:171
+#, c-format
+msgid "%s: could not close archive location \"%s\": %s\n"
+msgstr "%s: không thể đóng vị trí lưu trữ \"%s\": %s\n"
+
+#: pg_archivecleanup.c:175
+#, c-format
+msgid "%s: could not open archive location \"%s\": %s\n"
+msgstr "%s: không thể mở vị trí lưu trữ \"%s\": %s\n"
+
+#: pg_archivecleanup.c:248
+#, c-format
+msgid "%s: invalid file name argument\n"
+msgstr "%s: đối số tên tệp không hợp lệ\n"
+
+#: pg_archivecleanup.c:249 pg_archivecleanup.c:321 pg_archivecleanup.c:342
+#: pg_archivecleanup.c:354 pg_archivecleanup.c:361
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr "%s xóa các tệp WAL cÅ© hÆ¡n khá»i lÆ°u trữ PostgreSQL.\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: pg_archivecleanup.c:264
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [Tùy chá»n]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Tùy chá»n:\n"
+
+#: pg_archivecleanup.c:266
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d xuất debug log (chế độ chi tiết)\n"
+
+#: pg_archivecleanup.c:267
+#, c-format
+msgid ""
+" -n dry run, show the names of the files that would be "
+"removed\n"
+msgstr " -n chạy khô, hiển thị tên của các tệp sẽ bị xóa\n"
+
+#: pg_archivecleanup.c:268
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version xuất thông tin bản, sau đó kết thúc\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT dá»n dẹp các tập tin nếu chúng có phần mở rá»™ng này\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help hiển thị trợ giúp này, sau đó thoát\n"
+
+#: pg_archivecleanup.c:271
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in recovery.conf when standby_mode = "
+"on:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION "
+"%%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir "
+"%%r'\n"
+msgstr ""
+"\n"
+"Äể sá»­ dụng nhÆ° archive_cleanup_command trong recovery.conf khi "
+"standby_mode = on:\n"
+" archive_cleanup_command = 'pg_archivecleanup [TÙY CHỌN] ... "
+"ARCHIVELOCATION %%r'\n"
+"ví dụ.\n"
+" archive_cleanup_command = 'pg_archivecleanup/mnt/server/archiverdir "
+"%%r'\n"
+
+#: pg_archivecleanup.c:276
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"Hoặc để sá»­ dụng nhÆ° má»™t trình dá»n dẹp lÆ°u trữ Ä‘á»™c lập:\n"
+"ví dụ.\n"
+" pg_archivecleanup /mnt/server/archiverdir "
+"000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:280
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Báo cáo bugs qua email <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_archivecleanup.c:341
+#, c-format
+msgid "%s: must specify archive location\n"
+msgstr "%s: phải chỉ định vị trí lưu trữ\n"
+
+#: pg_archivecleanup.c:353
+#, c-format
+msgid "%s: must specify oldest kept WAL file\n"
+msgstr "%s: phải chỉ định tệp WAL được giữ lâu nhất\n"
+
+#: pg_archivecleanup.c:360
+#, c-format
+msgid "%s: too many command-line arguments\n"
+msgstr "%s: có quá nhiá»u đối số dòng lệnh\n"
+
+#: pg_archivecleanup.c:379
+#, c-format
+msgid "%s: keeping WAL file \"%s\" and later\n"
+msgstr "%s: giữ tệp WAL \"%s\" và những tệp tiếp theo\n"
diff --git a/src/bin/pg_archivecleanup/po/zh_CN.po b/src/bin/pg_archivecleanup/po/zh_CN.po
new file mode 100644
index 0000000..e8c3348
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/zh_CN.po
@@ -0,0 +1,179 @@
+# LANGUAGE message translation file for pg_archivecleanup
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-14 19:40+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "存档ä½ç½®\"%s\"ä¸å­˜åœ¨"
+
+#: pg_archivecleanup.c:152
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "无法删除文件 \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "无法读å–存档ä½ç½®\"%s\": %m"
+
+#: pg_archivecleanup.c:163
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "无法关闭存档ä½ç½® \"%s\": %m"
+
+#: pg_archivecleanup.c:167
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "无法打开存档ä½ç½®\"%s\": %m"
+
+#: pg_archivecleanup.c:240
+#, c-format
+msgid "invalid file name argument"
+msgstr "文件åå‚数无效"
+
+#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336
+#: pg_archivecleanup.c:348 pg_archivecleanup.c:355
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr ""
+"%s 从PostgreSQL存档中删除旧的WAL文件.\n"
+"\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... 归档文件ä½ç½® 最早ä¿å­˜çš„WAL文件\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d 生æˆè°ƒè¯•è¾“出(详细模å¼ï¼‰\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n dryè¿è¡Œï¼Œæ˜¾ç¤ºè¦åˆ é™¤çš„文件的å称\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯ï¼Œç„¶åŽé€€å‡º\n"
+
+#: pg_archivecleanup.c:261
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT 如果文件具有此扩展å,则清除文件\n"
+
+#: pg_archivecleanup.c:262
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示帮助信æ¯ï¼Œç„¶åŽé€€å‡º\n"
+
+#: pg_archivecleanup.c:263
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"在postgresql.conf中,archive_cleanup_command的用法 \n"
+" archive_cleanup_command = 'pg_archivecleanup [选项]... 存档ä½ç½® %%r'\n"
+"例.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:268
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"或者,用作独立存档清ç†ç¨‹åº:\n"
+"例.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:272
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_archivecleanup.c:273
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_archivecleanup.c:335
+#, c-format
+msgid "must specify archive location"
+msgstr "必须指定存档ä½ç½®"
+
+#: pg_archivecleanup.c:347
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "必须指定最早ä¿å­˜çš„WAL文件"
+
+#: pg_archivecleanup.c:354
+#, c-format
+msgid "too many command-line arguments"
+msgstr "命令行å‚数太多"
+
diff --git a/src/bin/pg_archivecleanup/po/zh_TW.po b/src/bin/pg_archivecleanup/po/zh_TW.po
new file mode 100644
index 0000000..b793aba
--- /dev/null
+++ b/src/bin/pg_archivecleanup/po/zh_TW.po
@@ -0,0 +1,185 @@
+# Traditional Chinese message translation file for pg_archivecleanup
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_archivecleanup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:51+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+#: pg_archivecleanup.c:66
+#, c-format
+msgid "archive location \"%s\" does not exist"
+msgstr "å°å­˜æª”ä½ç½® \"%s\" ä¸å­˜åœ¨"
+
+# access/transam/xlog.c:1944 access/transam/xlog.c:5453
+# access/transam/xlog.c:5607 postmaster/postmaster.c:3504
+#: pg_archivecleanup.c:151
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "無法刪除檔案 \"%s\": %m"
+
+#: pg_archivecleanup.c:157
+#, c-format
+msgid "could not read archive location \"%s\": %m"
+msgstr "無法讀å–å°å­˜æª”ä½ç½® \"%s\": %m"
+
+#: pg_archivecleanup.c:160
+#, c-format
+msgid "could not close archive location \"%s\": %m"
+msgstr "無法關閉å°å­˜æª”ä½ç½® \"%s\": %m"
+
+#: pg_archivecleanup.c:164
+#, c-format
+msgid "could not open archive location \"%s\": %m"
+msgstr "無法開啟å°å­˜æª”ä½ç½® \"%s\": %m"
+
+#: pg_archivecleanup.c:237
+#, c-format
+msgid "invalid file name argument"
+msgstr "無效的檔案å稱åƒæ•¸"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333
+#: pg_archivecleanup.c:345 pg_archivecleanup.c:352
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_archivecleanup.c:251
+#, c-format
+msgid ""
+"%s removes older WAL files from PostgreSQL archives.\n"
+"\n"
+msgstr "%s 從 PostgreSQL å°å­˜æª”中移除較舊的 WAL 檔\n"
+
+#: pg_archivecleanup.c:252
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_archivecleanup.c:253
+#, c-format
+msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+msgstr " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"
+
+#: pg_archivecleanup.c:254
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"é¸é …:\n"
+
+#: pg_archivecleanup.c:255
+#, c-format
+msgid " -d generate debug output (verbose mode)\n"
+msgstr " -d 產生除錯輸出(詳細模å¼)\n"
+
+#: pg_archivecleanup.c:256
+#, c-format
+msgid " -n dry run, show the names of the files that would be removed\n"
+msgstr " -n 模擬執行,顯示將被移除的檔案å稱\n"
+
+#: pg_archivecleanup.c:257
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_archivecleanup.c:258
+#, c-format
+msgid " -x EXT clean up files if they have this extension\n"
+msgstr " -x EXT 清除有此副檔å的檔案\n"
+
+#: pg_archivecleanup.c:259
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_archivecleanup.c:260
+#, c-format
+msgid ""
+"\n"
+"For use as archive_cleanup_command in postgresql.conf:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"e.g.\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+msgstr ""
+"\n"
+"用於 postgresql.conf 中的 archive_cleanup_command:\n"
+" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n"
+"例如:\n"
+" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n"
+
+#: pg_archivecleanup.c:265
+#, c-format
+msgid ""
+"\n"
+"Or for use as a standalone archive cleaner:\n"
+"e.g.\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+msgstr ""
+"\n"
+"或者作為ç¨ç«‹çš„å°å­˜æª”清ç†å·¥å…·ä½¿ç”¨:\n"
+"例如:\n"
+" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n"
+
+#: pg_archivecleanup.c:269
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_archivecleanup.c:270
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+#: pg_archivecleanup.c:332
+#, c-format
+msgid "must specify archive location"
+msgstr "必需指定å°å­˜æª”ä½ç½®"
+
+#: pg_archivecleanup.c:344
+#, c-format
+msgid "must specify oldest kept WAL file"
+msgstr "必須指定最早ä¿ç•™çš„ WAL 檔"
+
+#: pg_archivecleanup.c:351
+#, c-format
+msgid "too many command-line arguments"
+msgstr "命令列åƒæ•¸éŽå¤š"
diff --git a/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl
new file mode 100644
index 0000000..cc3386d
--- /dev/null
+++ b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl
@@ -0,0 +1,107 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_archivecleanup');
+program_version_ok('pg_archivecleanup');
+program_options_handling_ok('pg_archivecleanup');
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my @walfiles = (
+ '00000001000000370000000C.gz', '00000001000000370000000D',
+ '00000001000000370000000E', '00000001000000370000000F.partial',);
+
+sub create_files
+{
+ foreach my $fn (@walfiles, 'unrelated_file')
+ {
+ open my $file, '>', "$tempdir/$fn";
+ print $file 'CONTENT';
+ close $file;
+ }
+ return;
+}
+
+create_files();
+
+command_fails_like(
+ ['pg_archivecleanup'],
+ qr/must specify archive location/,
+ 'fails if archive location is not specified');
+
+command_fails_like(
+ [ 'pg_archivecleanup', $tempdir ],
+ qr/must specify oldest kept WAL file/,
+ 'fails if oldest kept WAL file name is not specified');
+
+command_fails_like(
+ [ 'pg_archivecleanup', 'notexist', 'foo' ],
+ qr/archive location .* does not exist/,
+ 'fails if archive location does not exist');
+
+command_fails_like(
+ [ 'pg_archivecleanup', $tempdir, 'foo', 'bar' ],
+ qr/too many command-line arguments/,
+ 'fails with too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_archivecleanup', $tempdir, 'foo' ],
+ qr/invalid file name argument/,
+ 'fails with invalid restart file name');
+
+{
+ # like command_like but checking stderr
+ my $stderr;
+ my $result =
+ IPC::Run::run [ 'pg_archivecleanup', '-d', '-n', $tempdir,
+ $walfiles[2] ],
+ '2>', \$stderr;
+ ok($result, "pg_archivecleanup dry run: exit code 0");
+ like(
+ $stderr,
+ qr/$walfiles[1].*would be removed/,
+ "pg_archivecleanup dry run: matches");
+ foreach my $fn (@walfiles)
+ {
+ ok(-f "$tempdir/$fn", "$fn not removed");
+ }
+}
+
+sub run_check
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($suffix, $test_name) = @_;
+
+ create_files();
+
+ command_ok(
+ [
+ 'pg_archivecleanup', '-x', '.gz', $tempdir,
+ $walfiles[2] . $suffix
+ ],
+ "$test_name: runs");
+
+ ok(!-f "$tempdir/$walfiles[0]",
+ "$test_name: first older WAL file was cleaned up");
+ ok(!-f "$tempdir/$walfiles[1]",
+ "$test_name: second older WAL file was cleaned up");
+ ok(-f "$tempdir/$walfiles[2]",
+ "$test_name: restartfile was not cleaned up");
+ ok(-f "$tempdir/$walfiles[3]",
+ "$test_name: newer WAL file was not cleaned up");
+ ok(-f "$tempdir/unrelated_file",
+ "$test_name: unrelated file was not cleaned up");
+ return;
+}
+
+run_check('', 'pg_archivecleanup');
+run_check('.partial', 'pg_archivecleanup with .partial file');
+run_check('.00000020.backup', 'pg_archivecleanup with .backup file');
+
+done_testing();
diff --git a/src/bin/pg_basebackup/.gitignore b/src/bin/pg_basebackup/.gitignore
new file mode 100644
index 0000000..26048bd
--- /dev/null
+++ b/src/bin/pg_basebackup/.gitignore
@@ -0,0 +1,5 @@
+/pg_basebackup
+/pg_receivewal
+/pg_recvlogical
+
+/tmp_check/
diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile
new file mode 100644
index 0000000..893a75c
--- /dev/null
+++ b/src/bin/pg_basebackup/Makefile
@@ -0,0 +1,84 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_basebackup
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_basebackup/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_basebackup/pg_receivewal/pg_recvlogical - streaming WAL and backup receivers"
+PGAPPICON=win32
+
+EXTRA_INSTALL=contrib/test_decoding
+
+subdir = src/bin/pg_basebackup
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# make these available to TAP test scripts
+export LZ4
+export TAR
+# Note that GZIP cannot be used directly as this environment variable is
+# used by the command "gzip" to pass down options, so stick with a different
+# name.
+export GZIP_PROGRAM=$(GZIP)
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ receivelog.o \
+ streamutil.o \
+ walmethods.o
+
+# If you add or remove files here, also update Mkvcbuild.pm, which only knows
+# about OBJS, not BBOBJS, and thus has to be manually updated to stay in sync
+# with this list.
+BBOBJS = \
+ pg_basebackup.o \
+ bbstreamer_file.o \
+ bbstreamer_gzip.o \
+ bbstreamer_inject.o \
+ bbstreamer_lz4.o \
+ bbstreamer_tar.o \
+ bbstreamer_zstd.o
+
+all: pg_basebackup pg_receivewal pg_recvlogical
+
+pg_basebackup: $(BBOBJS) $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $(BBOBJS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_receivewal: pg_receivewal.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_receivewal.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_recvlogical: pg_recvlogical.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_recvlogical.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_basebackup$(X) '$(DESTDIR)$(bindir)/pg_basebackup$(X)'
+ $(INSTALL_PROGRAM) pg_receivewal$(X) '$(DESTDIR)$(bindir)/pg_receivewal$(X)'
+ $(INSTALL_PROGRAM) pg_recvlogical$(X) '$(DESTDIR)$(bindir)/pg_recvlogical$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_basebackup$(X)'
+ rm -f '$(DESTDIR)$(bindir)/pg_receivewal$(X)'
+ rm -f '$(DESTDIR)$(bindir)/pg_recvlogical$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_basebackup$(X) pg_receivewal$(X) pg_recvlogical$(X) \
+ $(BBOBJS) pg_receivewal.o pg_recvlogical.o \
+ $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_basebackup/bbstreamer.h b/src/bin/pg_basebackup/bbstreamer.h
new file mode 100644
index 0000000..f999e63
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer.h
@@ -0,0 +1,226 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer.h
+ *
+ * Each tar archive returned by the server is passed to one or more
+ * bbstreamer objects for further processing. The bbstreamer may do
+ * something simple, like write the archive to a file, perhaps after
+ * compressing it, but it can also do more complicated things, like
+ * annotating the byte stream to indicate which parts of the data
+ * correspond to tar headers or trailing padding, vs. which parts are
+ * payload data. A subsequent bbstreamer may use this information to
+ * make further decisions about how to process the data; for example,
+ * it might choose to modify the archive contents.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer.h
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef BBSTREAMER_H
+#define BBSTREAMER_H
+
+#include "common/compression.h"
+#include "lib/stringinfo.h"
+#include "pqexpbuffer.h"
+
+struct bbstreamer;
+struct bbstreamer_ops;
+typedef struct bbstreamer bbstreamer;
+typedef struct bbstreamer_ops bbstreamer_ops;
+
+/*
+ * Each chunk of archive data passed to a bbstreamer is classified into one
+ * of these categories. When data is first received from the remote server,
+ * each chunk will be categorized as BBSTREAMER_UNKNOWN, and the chunks will
+ * be of whatever size the remote server chose to send.
+ *
+ * If the archive is parsed (e.g. see bbstreamer_tar_parser_new()), then all
+ * chunks should be labelled as one of the other types listed here. In
+ * addition, there should be exactly one BBSTREAMER_MEMBER_HEADER chunk and
+ * exactly one BBSTREAMER_MEMBER_TRAILER chunk per archive member, even if
+ * that means a zero-length call. There can be any number of
+ * BBSTREAMER_MEMBER_CONTENTS chunks in between those calls. There
+ * should exactly BBSTREAMER_ARCHIVE_TRAILER chunk, and it should follow the
+ * last BBSTREAMER_MEMBER_TRAILER chunk.
+ *
+ * In theory, we could need other classifications here, such as a way of
+ * indicating an archive header, but the "tar" format doesn't need anything
+ * else, so for the time being there's no point.
+ */
+typedef enum
+{
+ BBSTREAMER_UNKNOWN,
+ BBSTREAMER_MEMBER_HEADER,
+ BBSTREAMER_MEMBER_CONTENTS,
+ BBSTREAMER_MEMBER_TRAILER,
+ BBSTREAMER_ARCHIVE_TRAILER
+} bbstreamer_archive_context;
+
+/*
+ * Each chunk of data that is classified as BBSTREAMER_MEMBER_HEADER,
+ * BBSTREAMER_MEMBER_CONTENTS, or BBSTREAMER_MEMBER_TRAILER should also
+ * pass a pointer to an instance of this struct. The details are expected
+ * to be present in the archive header and used to fill the struct, after
+ * which all subsequent calls for the same archive member are expected to
+ * pass the same details.
+ */
+typedef struct
+{
+ char pathname[MAXPGPATH];
+ pgoff_t size;
+ mode_t mode;
+ uid_t uid;
+ gid_t gid;
+ bool is_directory;
+ bool is_link;
+ char linktarget[MAXPGPATH];
+} bbstreamer_member;
+
+/*
+ * Generally, each type of bbstreamer will define its own struct, but the
+ * first element should be 'bbstreamer base'. A bbstreamer that does not
+ * require any additional private data could use this structure directly.
+ *
+ * bbs_ops is a pointer to the bbstreamer_ops object which contains the
+ * function pointers appropriate to this type of bbstreamer.
+ *
+ * bbs_next is a pointer to the successor bbstreamer, for those types of
+ * bbstreamer which forward data to a successor. It need not be used and
+ * should be set to NULL when not relevant.
+ *
+ * bbs_buffer is a buffer for accumulating data for temporary storage. Each
+ * type of bbstreamer makes its own decisions about whether and how to use
+ * this buffer.
+ */
+struct bbstreamer
+{
+ const bbstreamer_ops *bbs_ops;
+ bbstreamer *bbs_next;
+ StringInfoData bbs_buffer;
+};
+
+/*
+ * There are three callbacks for a bbstreamer. The 'content' callback is
+ * called repeatedly, as described in the bbstreamer_archive_context comments.
+ * Then, the 'finalize' callback is called once at the end, to give the
+ * bbstreamer a chance to perform cleanup such as closing files. Finally,
+ * because this code is running in a frontend environment where, as of this
+ * writing, there are no memory contexts, the 'free' callback is called to
+ * release memory. These callbacks should always be invoked using the static
+ * inline functions defined below.
+ */
+struct bbstreamer_ops
+{
+ void (*content) (bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+ void (*finalize) (bbstreamer *streamer);
+ void (*free) (bbstreamer *streamer);
+};
+
+/* Send some content to a bbstreamer. */
+static inline void
+bbstreamer_content(bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ Assert(streamer != NULL);
+ streamer->bbs_ops->content(streamer, member, data, len, context);
+}
+
+/* Finalize a bbstreamer. */
+static inline void
+bbstreamer_finalize(bbstreamer *streamer)
+{
+ Assert(streamer != NULL);
+ streamer->bbs_ops->finalize(streamer);
+}
+
+/* Free a bbstreamer. */
+static inline void
+bbstreamer_free(bbstreamer *streamer)
+{
+ Assert(streamer != NULL);
+ streamer->bbs_ops->free(streamer);
+}
+
+/*
+ * This is a convenience method for use when implementing a bbstreamer; it is
+ * not for use by outside callers. It adds the amount of data specified by
+ * 'nbytes' to the bbstreamer's buffer and adjusts '*len' and '*data'
+ * accordingly.
+ */
+static inline void
+bbstreamer_buffer_bytes(bbstreamer *streamer, const char **data, int *len,
+ int nbytes)
+{
+ Assert(nbytes <= *len);
+
+ appendBinaryStringInfo(&streamer->bbs_buffer, *data, nbytes);
+ *len -= nbytes;
+ *data += nbytes;
+}
+
+/*
+ * This is a convenience method for use when implementing a bbstreamer; it is
+ * not for use by outsider callers. It attempts to add enough data to the
+ * bbstreamer's buffer to reach a length of target_bytes and adjusts '*len'
+ * and '*data' accordingly. It returns true if the target length has been
+ * reached and false otherwise.
+ */
+static inline bool
+bbstreamer_buffer_until(bbstreamer *streamer, const char **data, int *len,
+ int target_bytes)
+{
+ int buflen = streamer->bbs_buffer.len;
+
+ if (buflen >= target_bytes)
+ {
+ /* Target length already reached; nothing to do. */
+ return true;
+ }
+
+ if (buflen + *len < target_bytes)
+ {
+ /* Not enough data to reach target length; buffer all of it. */
+ bbstreamer_buffer_bytes(streamer, data, len, *len);
+ return false;
+ }
+
+ /* Buffer just enough to reach the target length. */
+ bbstreamer_buffer_bytes(streamer, data, len, target_bytes - buflen);
+ return true;
+}
+
+/*
+ * Functions for creating bbstreamer objects of various types. See the header
+ * comments for each of these functions for details.
+ */
+extern bbstreamer *bbstreamer_plain_writer_new(char *pathname, FILE *file);
+extern bbstreamer *bbstreamer_gzip_writer_new(char *pathname, FILE *file,
+ pg_compress_specification *compress);
+extern bbstreamer *bbstreamer_extractor_new(const char *basepath,
+ const char *(*link_map) (const char *),
+ void (*report_output_file) (const char *));
+
+extern bbstreamer *bbstreamer_gzip_decompressor_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_lz4_compressor_new(bbstreamer *next,
+ pg_compress_specification *compress);
+extern bbstreamer *bbstreamer_lz4_decompressor_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_zstd_compressor_new(bbstreamer *next,
+ pg_compress_specification *compress);
+extern bbstreamer *bbstreamer_zstd_decompressor_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_tar_parser_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_tar_terminator_new(bbstreamer *next);
+extern bbstreamer *bbstreamer_tar_archiver_new(bbstreamer *next);
+
+extern bbstreamer *bbstreamer_recovery_injector_new(bbstreamer *next,
+ bool is_recovery_guc_supported,
+ PQExpBuffer recoveryconfcontents);
+extern void bbstreamer_inject_file(bbstreamer *streamer, char *pathname,
+ char *data, int len);
+
+#endif
diff --git a/src/bin/pg_basebackup/bbstreamer_file.c b/src/bin/pg_basebackup/bbstreamer_file.c
new file mode 100644
index 0000000..45f3297
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_file.c
@@ -0,0 +1,395 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_file.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_file.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "common/file_perm.h"
+#include "common/string.h"
+
+typedef struct bbstreamer_plain_writer
+{
+ bbstreamer base;
+ char *pathname;
+ FILE *file;
+ bool should_close_file;
+} bbstreamer_plain_writer;
+
+typedef struct bbstreamer_extractor
+{
+ bbstreamer base;
+ char *basepath;
+ const char *(*link_map) (const char *);
+ void (*report_output_file) (const char *);
+ char filename[MAXPGPATH];
+ FILE *file;
+} bbstreamer_extractor;
+
+static void bbstreamer_plain_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_plain_writer_finalize(bbstreamer *streamer);
+static void bbstreamer_plain_writer_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_plain_writer_ops = {
+ .content = bbstreamer_plain_writer_content,
+ .finalize = bbstreamer_plain_writer_finalize,
+ .free = bbstreamer_plain_writer_free
+};
+
+static void bbstreamer_extractor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_extractor_finalize(bbstreamer *streamer);
+static void bbstreamer_extractor_free(bbstreamer *streamer);
+static void extract_directory(const char *filename, mode_t mode);
+static void extract_link(const char *filename, const char *linktarget);
+static FILE *create_file_for_extract(const char *filename, mode_t mode);
+
+const bbstreamer_ops bbstreamer_extractor_ops = {
+ .content = bbstreamer_extractor_content,
+ .finalize = bbstreamer_extractor_finalize,
+ .free = bbstreamer_extractor_free
+};
+
+/*
+ * Create a bbstreamer that just writes data to a file.
+ *
+ * The caller must specify a pathname and may specify a file. The pathname is
+ * used for error-reporting purposes either way. If file is NULL, the pathname
+ * also identifies the file to which the data should be written: it is opened
+ * for writing and closed when done. If file is not NULL, the data is written
+ * there.
+ */
+bbstreamer *
+bbstreamer_plain_writer_new(char *pathname, FILE *file)
+{
+ bbstreamer_plain_writer *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_plain_writer));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_plain_writer_ops;
+
+ streamer->pathname = pstrdup(pathname);
+ streamer->file = file;
+
+ if (file == NULL)
+ {
+ streamer->file = fopen(pathname, "wb");
+ if (streamer->file == NULL)
+ pg_fatal("could not create file \"%s\": %m", pathname);
+ streamer->should_close_file = true;
+ }
+
+ return &streamer->base;
+}
+
+/*
+ * Write archive content to file.
+ */
+static void
+bbstreamer_plain_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member, const char *data,
+ int len, bbstreamer_archive_context context)
+{
+ bbstreamer_plain_writer *mystreamer;
+
+ mystreamer = (bbstreamer_plain_writer *) streamer;
+
+ if (len == 0)
+ return;
+
+ errno = 0;
+ if (fwrite(data, len, 1, mystreamer->file) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m",
+ mystreamer->pathname);
+ }
+}
+
+/*
+ * End-of-archive processing when writing to a plain file consists of closing
+ * the file if we opened it, but not if the caller provided it.
+ */
+static void
+bbstreamer_plain_writer_finalize(bbstreamer *streamer)
+{
+ bbstreamer_plain_writer *mystreamer;
+
+ mystreamer = (bbstreamer_plain_writer *) streamer;
+
+ if (mystreamer->should_close_file && fclose(mystreamer->file) != 0)
+ pg_fatal("could not close file \"%s\": %m",
+ mystreamer->pathname);
+
+ mystreamer->file = NULL;
+ mystreamer->should_close_file = false;
+}
+
+/*
+ * Free memory associated with this bbstreamer.
+ */
+static void
+bbstreamer_plain_writer_free(bbstreamer *streamer)
+{
+ bbstreamer_plain_writer *mystreamer;
+
+ mystreamer = (bbstreamer_plain_writer *) streamer;
+
+ Assert(!mystreamer->should_close_file);
+ Assert(mystreamer->base.bbs_next == NULL);
+
+ pfree(mystreamer->pathname);
+ pfree(mystreamer);
+}
+
+/*
+ * Create a bbstreamer that extracts an archive.
+ *
+ * All pathnames in the archive are interpreted relative to basepath.
+ *
+ * Unlike e.g. bbstreamer_plain_writer_new() we can't do anything useful here
+ * with untyped chunks; we need typed chunks which follow the rules described
+ * in bbstreamer.h. Assuming we have that, we don't need to worry about the
+ * original archive format; it's enough to just look at the member information
+ * provided and write to the corresponding file.
+ *
+ * 'link_map' is a function that will be applied to the target of any
+ * symbolic link, and which should return a replacement pathname to be used
+ * in its place. If NULL, the symbolic link target is used without
+ * modification.
+ *
+ * 'report_output_file' is a function that will be called each time we open a
+ * new output file. The pathname to that file is passed as an argument. If
+ * NULL, the call is skipped.
+ */
+bbstreamer *
+bbstreamer_extractor_new(const char *basepath,
+ const char *(*link_map) (const char *),
+ void (*report_output_file) (const char *))
+{
+ bbstreamer_extractor *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_extractor));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_extractor_ops;
+ streamer->basepath = pstrdup(basepath);
+ streamer->link_map = link_map;
+ streamer->report_output_file = report_output_file;
+
+ return &streamer->base;
+}
+
+/*
+ * Extract archive contents to the filesystem.
+ */
+static void
+bbstreamer_extractor_content(bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_extractor *mystreamer = (bbstreamer_extractor *) streamer;
+ int fnamelen;
+
+ Assert(member != NULL || context == BBSTREAMER_ARCHIVE_TRAILER);
+ Assert(context != BBSTREAMER_UNKNOWN);
+
+ switch (context)
+ {
+ case BBSTREAMER_MEMBER_HEADER:
+ Assert(mystreamer->file == NULL);
+
+ /* Prepend basepath. */
+ snprintf(mystreamer->filename, sizeof(mystreamer->filename),
+ "%s/%s", mystreamer->basepath, member->pathname);
+
+ /* Remove any trailing slash. */
+ fnamelen = strlen(mystreamer->filename);
+ if (mystreamer->filename[fnamelen - 1] == '/')
+ mystreamer->filename[fnamelen - 1] = '\0';
+
+ /* Dispatch based on file type. */
+ if (member->is_directory)
+ extract_directory(mystreamer->filename, member->mode);
+ else if (member->is_link)
+ {
+ const char *linktarget = member->linktarget;
+
+ if (mystreamer->link_map)
+ linktarget = mystreamer->link_map(linktarget);
+ extract_link(mystreamer->filename, linktarget);
+ }
+ else
+ mystreamer->file =
+ create_file_for_extract(mystreamer->filename,
+ member->mode);
+
+ /* Report output file change. */
+ if (mystreamer->report_output_file)
+ mystreamer->report_output_file(mystreamer->filename);
+ break;
+
+ case BBSTREAMER_MEMBER_CONTENTS:
+ if (mystreamer->file == NULL)
+ break;
+
+ errno = 0;
+ if (len > 0 && fwrite(data, len, 1, mystreamer->file) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m",
+ mystreamer->filename);
+ }
+ break;
+
+ case BBSTREAMER_MEMBER_TRAILER:
+ if (mystreamer->file == NULL)
+ break;
+ fclose(mystreamer->file);
+ mystreamer->file = NULL;
+ break;
+
+ case BBSTREAMER_ARCHIVE_TRAILER:
+ break;
+
+ default:
+ /* Shouldn't happen. */
+ pg_fatal("unexpected state while extracting archive");
+ }
+}
+
+/*
+ * Should we tolerate an already-existing directory?
+ *
+ * When streaming WAL, pg_wal (or pg_xlog for pre-9.6 clusters) will have been
+ * created by the wal receiver process. Also, when the WAL directory location
+ * was specified, pg_wal (or pg_xlog) has already been created as a symbolic
+ * link before starting the actual backup. So just ignore creation failures
+ * on related directories.
+ *
+ * If in-place tablespaces are used, pg_tblspc and subdirectories may already
+ * exist when we get here. So tolerate that case, too.
+ */
+static bool
+should_allow_existing_directory(const char *pathname)
+{
+ const char *filename = last_dir_separator(pathname) + 1;
+
+ if (strcmp(filename, "pg_wal") == 0 ||
+ strcmp(filename, "pg_xlog") == 0 ||
+ strcmp(filename, "archive_status") == 0 ||
+ strcmp(filename, "pg_tblspc") == 0)
+ return true;
+
+ if (strspn(filename, "0123456789") == strlen(filename))
+ {
+ const char *pg_tblspc = strstr(pathname, "/pg_tblspc/");
+
+ return pg_tblspc != NULL && pg_tblspc + 11 == filename;
+ }
+
+ return false;
+}
+
+/*
+ * Create a directory.
+ */
+static void
+extract_directory(const char *filename, mode_t mode)
+{
+ if (mkdir(filename, pg_dir_create_mode) != 0 &&
+ (errno != EEXIST || !should_allow_existing_directory(filename)))
+ pg_fatal("could not create directory \"%s\": %m",
+ filename);
+
+#ifndef WIN32
+ if (chmod(filename, mode))
+ pg_fatal("could not set permissions on directory \"%s\": %m",
+ filename);
+#endif
+}
+
+/*
+ * Create a symbolic link.
+ *
+ * It's most likely a link in pg_tblspc directory, to the location of a
+ * tablespace. Apply any tablespace mapping given on the command line
+ * (--tablespace-mapping). (We blindly apply the mapping without checking that
+ * the link really is inside pg_tblspc. We don't expect there to be other
+ * symlinks in a data directory, but if there are, you can call it an
+ * undocumented feature that you can map them too.)
+ */
+static void
+extract_link(const char *filename, const char *linktarget)
+{
+ if (symlink(linktarget, filename) != 0)
+ pg_fatal("could not create symbolic link from \"%s\" to \"%s\": %m",
+ filename, linktarget);
+}
+
+/*
+ * Create a regular file.
+ *
+ * Return the resulting handle so we can write the content to the file.
+ */
+static FILE *
+create_file_for_extract(const char *filename, mode_t mode)
+{
+ FILE *file;
+
+ file = fopen(filename, "wb");
+ if (file == NULL)
+ pg_fatal("could not create file \"%s\": %m", filename);
+
+#ifndef WIN32
+ if (chmod(filename, mode))
+ pg_fatal("could not set permissions on file \"%s\": %m",
+ filename);
+#endif
+
+ return file;
+}
+
+/*
+ * End-of-stream processing for extracting an archive.
+ *
+ * There's nothing to do here but sanity checking.
+ */
+static void
+bbstreamer_extractor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_extractor *mystreamer PG_USED_FOR_ASSERTS_ONLY
+ = (bbstreamer_extractor *) streamer;
+
+ Assert(mystreamer->file == NULL);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_extractor_free(bbstreamer *streamer)
+{
+ bbstreamer_extractor *mystreamer = (bbstreamer_extractor *) streamer;
+
+ pfree(mystreamer->basepath);
+ pfree(mystreamer);
+}
diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c
new file mode 100644
index 0000000..3bdbfa0
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_gzip.c
@@ -0,0 +1,364 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_gzip.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_gzip.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "common/file_perm.h"
+#include "common/string.h"
+
+#ifdef HAVE_LIBZ
+typedef struct bbstreamer_gzip_writer
+{
+ bbstreamer base;
+ char *pathname;
+ gzFile gzfile;
+} bbstreamer_gzip_writer;
+
+typedef struct bbstreamer_gzip_decompressor
+{
+ bbstreamer base;
+ z_stream zstream;
+ size_t bytes_written;
+} bbstreamer_gzip_decompressor;
+
+static void bbstreamer_gzip_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_gzip_writer_finalize(bbstreamer *streamer);
+static void bbstreamer_gzip_writer_free(bbstreamer *streamer);
+static const char *get_gz_error(gzFile gzf);
+
+const bbstreamer_ops bbstreamer_gzip_writer_ops = {
+ .content = bbstreamer_gzip_writer_content,
+ .finalize = bbstreamer_gzip_writer_finalize,
+ .free = bbstreamer_gzip_writer_free
+};
+
+static void bbstreamer_gzip_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_gzip_decompressor_finalize(bbstreamer *streamer);
+static void bbstreamer_gzip_decompressor_free(bbstreamer *streamer);
+static void *gzip_palloc(void *opaque, unsigned items, unsigned size);
+static void gzip_pfree(void *opaque, void *address);
+
+const bbstreamer_ops bbstreamer_gzip_decompressor_ops = {
+ .content = bbstreamer_gzip_decompressor_content,
+ .finalize = bbstreamer_gzip_decompressor_finalize,
+ .free = bbstreamer_gzip_decompressor_free
+};
+#endif
+
+/*
+ * Create a bbstreamer that just compresses data using gzip, and then writes
+ * it to a file.
+ *
+ * As in the case of bbstreamer_plain_writer_new, pathname is always used
+ * for error reporting purposes; if file is NULL, it is also the opened and
+ * closed so that the data may be written there.
+ */
+bbstreamer *
+bbstreamer_gzip_writer_new(char *pathname, FILE *file,
+ pg_compress_specification *compress)
+{
+#ifdef HAVE_LIBZ
+ bbstreamer_gzip_writer *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_gzip_writer));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_gzip_writer_ops;
+
+ streamer->pathname = pstrdup(pathname);
+
+ if (file == NULL)
+ {
+ streamer->gzfile = gzopen(pathname, "wb");
+ if (streamer->gzfile == NULL)
+ pg_fatal("could not create compressed file \"%s\": %m",
+ pathname);
+ }
+ else
+ {
+ int fd = dup(fileno(file));
+
+ if (fd < 0)
+ pg_fatal("could not duplicate stdout: %m");
+
+ streamer->gzfile = gzdopen(fd, "wb");
+ if (streamer->gzfile == NULL)
+ pg_fatal("could not open output file: %m");
+ }
+
+ if (gzsetparams(streamer->gzfile, compress->level, Z_DEFAULT_STRATEGY) != Z_OK)
+ pg_fatal("could not set compression level %d: %s",
+ compress->level, get_gz_error(streamer->gzfile));
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support compression with %s", "gzip");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef HAVE_LIBZ
+/*
+ * Write archive content to gzip file.
+ */
+static void
+bbstreamer_gzip_writer_content(bbstreamer *streamer,
+ bbstreamer_member *member, const char *data,
+ int len, bbstreamer_archive_context context)
+{
+ bbstreamer_gzip_writer *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_writer *) streamer;
+
+ if (len == 0)
+ return;
+
+ errno = 0;
+ if (gzwrite(mystreamer->gzfile, data, len) != len)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to compressed file \"%s\": %s",
+ mystreamer->pathname, get_gz_error(mystreamer->gzfile));
+ }
+}
+
+/*
+ * End-of-archive processing when writing to a gzip file consists of just
+ * calling gzclose.
+ *
+ * It makes no difference whether we opened the file or the caller did it,
+ * because libz provides no way of avoiding a close on the underlying file
+ * handle. Notice, however, that bbstreamer_gzip_writer_new() uses dup() to
+ * work around this issue, so that the behavior from the caller's viewpoint
+ * is the same as for bbstreamer_plain_writer.
+ */
+static void
+bbstreamer_gzip_writer_finalize(bbstreamer *streamer)
+{
+ bbstreamer_gzip_writer *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_writer *) streamer;
+
+ errno = 0; /* in case gzclose() doesn't set it */
+ if (gzclose(mystreamer->gzfile) != 0)
+ pg_fatal("could not close compressed file \"%s\": %m",
+ mystreamer->pathname);
+
+ mystreamer->gzfile = NULL;
+}
+
+/*
+ * Free memory associated with this bbstreamer.
+ */
+static void
+bbstreamer_gzip_writer_free(bbstreamer *streamer)
+{
+ bbstreamer_gzip_writer *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_writer *) streamer;
+
+ Assert(mystreamer->base.bbs_next == NULL);
+ Assert(mystreamer->gzfile == NULL);
+
+ pfree(mystreamer->pathname);
+ pfree(mystreamer);
+}
+
+/*
+ * Helper function for libz error reporting.
+ */
+static const char *
+get_gz_error(gzFile gzf)
+{
+ int errnum;
+ const char *errmsg;
+
+ errmsg = gzerror(gzf, &errnum);
+ if (errnum == Z_ERRNO)
+ return strerror(errno);
+ else
+ return errmsg;
+}
+#endif
+
+/*
+ * Create a new base backup streamer that performs decompression of gzip
+ * compressed blocks.
+ */
+bbstreamer *
+bbstreamer_gzip_decompressor_new(bbstreamer *next)
+{
+#ifdef HAVE_LIBZ
+ bbstreamer_gzip_decompressor *streamer;
+ z_stream *zs;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_gzip_decompressor));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_gzip_decompressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+
+ /* Initialize internal stream state for decompression */
+ zs = &streamer->zstream;
+ zs->zalloc = gzip_palloc;
+ zs->zfree = gzip_pfree;
+ zs->next_out = (uint8 *) streamer->base.bbs_buffer.data;
+ zs->avail_out = streamer->base.bbs_buffer.maxlen;
+
+ /*
+ * Data compression was initialized using deflateInit2 to request a gzip
+ * header. Similarly, we are using inflateInit2 to initialize data
+ * decompression.
+ *
+ * Per the documentation for inflateInit2, the second argument is
+ * "windowBits" and its value must be greater than or equal to the value
+ * provided while compressing the data, so we are using the maximum
+ * possible value for safety.
+ */
+ if (inflateInit2(zs, 15 + 16) != Z_OK)
+ pg_fatal("could not initialize compression library");
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support compression with %s", "gzip");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef HAVE_LIBZ
+/*
+ * Decompress the input data to output buffer until we run out of input
+ * data. Each time the output buffer is full, pass on the decompressed data
+ * to the next streamer.
+ */
+static void
+bbstreamer_gzip_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_gzip_decompressor *mystreamer;
+ z_stream *zs;
+
+ mystreamer = (bbstreamer_gzip_decompressor *) streamer;
+
+ zs = &mystreamer->zstream;
+ zs->next_in = (uint8 *) data;
+ zs->avail_in = len;
+
+ /* Process the current chunk */
+ while (zs->avail_in > 0)
+ {
+ int res;
+
+ Assert(mystreamer->bytes_written < mystreamer->base.bbs_buffer.maxlen);
+
+ zs->next_out = (uint8 *)
+ mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
+ zs->avail_out =
+ mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+
+ /*
+ * This call decompresses data starting at zs->next_in and updates
+ * zs->next_in * and zs->avail_in. It generates output data starting
+ * at zs->next_out and updates zs->next_out and zs->avail_out
+ * accordingly.
+ */
+ res = inflate(zs, Z_NO_FLUSH);
+
+ if (res == Z_STREAM_ERROR)
+ pg_log_error("could not decompress data: %s", zs->msg);
+
+ mystreamer->bytes_written =
+ mystreamer->base.bbs_buffer.maxlen - zs->avail_out;
+
+ /* If output buffer is full then pass data to next streamer */
+ if (mystreamer->bytes_written >= mystreamer->base.bbs_buffer.maxlen)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen, context);
+ mystreamer->bytes_written = 0;
+ }
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_gzip_decompressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_gzip_decompressor *mystreamer;
+
+ mystreamer = (bbstreamer_gzip_decompressor *) streamer;
+
+ /*
+ * End of the stream, if there is some pending data in output buffers then
+ * we must forward it to next streamer.
+ */
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_gzip_decompressor_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+
+/*
+ * Wrapper function to adjust the signature of palloc to match what libz
+ * expects.
+ */
+static void *
+gzip_palloc(void *opaque, unsigned items, unsigned size)
+{
+ return palloc(items * size);
+}
+
+/*
+ * Wrapper function to adjust the signature of pfree to match what libz
+ * expects.
+ */
+static void
+gzip_pfree(void *opaque, void *address)
+{
+ pfree(address);
+}
+#endif
diff --git a/src/bin/pg_basebackup/bbstreamer_inject.c b/src/bin/pg_basebackup/bbstreamer_inject.c
new file mode 100644
index 0000000..a7de2a1
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_inject.c
@@ -0,0 +1,249 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_inject.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_inject.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "bbstreamer.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+
+typedef struct bbstreamer_recovery_injector
+{
+ bbstreamer base;
+ bool skip_file;
+ bool is_recovery_guc_supported;
+ bool is_postgresql_auto_conf;
+ bool found_postgresql_auto_conf;
+ PQExpBuffer recoveryconfcontents;
+ bbstreamer_member member;
+} bbstreamer_recovery_injector;
+
+static void bbstreamer_recovery_injector_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_recovery_injector_finalize(bbstreamer *streamer);
+static void bbstreamer_recovery_injector_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_recovery_injector_ops = {
+ .content = bbstreamer_recovery_injector_content,
+ .finalize = bbstreamer_recovery_injector_finalize,
+ .free = bbstreamer_recovery_injector_free
+};
+
+/*
+ * Create a bbstreamer that can edit recoverydata into an archive stream.
+ *
+ * The input should be a series of typed chunks (not BBSTREAMER_UNKNOWN) as
+ * per the conventions described in bbstreamer.h; the chunks forwarded to
+ * the next bbstreamer will be similarly typed, but the
+ * BBSTREAMER_MEMBER_HEADER chunks may be zero-length in cases where we've
+ * edited the archive stream.
+ *
+ * Our goal is to do one of the following three things with the content passed
+ * via recoveryconfcontents: (1) if is_recovery_guc_supported is false, then
+ * put the content into recovery.conf, replacing any existing archive member
+ * by that name; (2) if is_recovery_guc_supported is true and
+ * postgresql.auto.conf exists in the archive, then append the content
+ * provided to the existing file; and (3) if is_recovery_guc_supported is
+ * true but postgresql.auto.conf does not exist in the archive, then create
+ * it with the specified content.
+ *
+ * In addition, if is_recovery_guc_supported is true, then we create a
+ * zero-length standby.signal file, dropping any file with that name from
+ * the archive.
+ */
+extern bbstreamer *
+bbstreamer_recovery_injector_new(bbstreamer *next,
+ bool is_recovery_guc_supported,
+ PQExpBuffer recoveryconfcontents)
+{
+ bbstreamer_recovery_injector *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_recovery_injector));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_recovery_injector_ops;
+ streamer->base.bbs_next = next;
+ streamer->is_recovery_guc_supported = is_recovery_guc_supported;
+ streamer->recoveryconfcontents = recoveryconfcontents;
+
+ return &streamer->base;
+}
+
+/*
+ * Handle each chunk of tar content while injecting recovery configuration.
+ */
+static void
+bbstreamer_recovery_injector_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_recovery_injector *mystreamer;
+
+ mystreamer = (bbstreamer_recovery_injector *) streamer;
+ Assert(member != NULL || context == BBSTREAMER_ARCHIVE_TRAILER);
+
+ switch (context)
+ {
+ case BBSTREAMER_MEMBER_HEADER:
+ /* Must copy provided data so we have the option to modify it. */
+ memcpy(&mystreamer->member, member, sizeof(bbstreamer_member));
+
+ /*
+ * On v12+, skip standby.signal and edit postgresql.auto.conf; on
+ * older versions, skip recovery.conf.
+ */
+ if (mystreamer->is_recovery_guc_supported)
+ {
+ mystreamer->skip_file =
+ (strcmp(member->pathname, "standby.signal") == 0);
+ mystreamer->is_postgresql_auto_conf =
+ (strcmp(member->pathname, "postgresql.auto.conf") == 0);
+ if (mystreamer->is_postgresql_auto_conf)
+ {
+ /* Remember we saw it so we don't add it again. */
+ mystreamer->found_postgresql_auto_conf = true;
+
+ /* Increment length by data to be injected. */
+ mystreamer->member.size +=
+ mystreamer->recoveryconfcontents->len;
+
+ /*
+ * Zap data and len because the archive header is no
+ * longer valid; some subsequent bbstreamer must
+ * regenerate it if it's necessary.
+ */
+ data = NULL;
+ len = 0;
+ }
+ }
+ else
+ mystreamer->skip_file =
+ (strcmp(member->pathname, "recovery.conf") == 0);
+
+ /* Do not forward if the file is to be skipped. */
+ if (mystreamer->skip_file)
+ return;
+ break;
+
+ case BBSTREAMER_MEMBER_CONTENTS:
+ /* Do not forward if the file is to be skipped. */
+ if (mystreamer->skip_file)
+ return;
+ break;
+
+ case BBSTREAMER_MEMBER_TRAILER:
+ /* Do not forward it the file is to be skipped. */
+ if (mystreamer->skip_file)
+ return;
+
+ /* Append provided content to whatever we already sent. */
+ if (mystreamer->is_postgresql_auto_conf)
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->recoveryconfcontents->data,
+ mystreamer->recoveryconfcontents->len,
+ BBSTREAMER_MEMBER_CONTENTS);
+ break;
+
+ case BBSTREAMER_ARCHIVE_TRAILER:
+ if (mystreamer->is_recovery_guc_supported)
+ {
+ /*
+ * If we didn't already find (and thus modify)
+ * postgresql.auto.conf, inject it as an additional archive
+ * member now.
+ */
+ if (!mystreamer->found_postgresql_auto_conf)
+ bbstreamer_inject_file(mystreamer->base.bbs_next,
+ "postgresql.auto.conf",
+ mystreamer->recoveryconfcontents->data,
+ mystreamer->recoveryconfcontents->len);
+
+ /* Inject empty standby.signal file. */
+ bbstreamer_inject_file(mystreamer->base.bbs_next,
+ "standby.signal", "", 0);
+ }
+ else
+ {
+ /* Inject recovery.conf file with specified contents. */
+ bbstreamer_inject_file(mystreamer->base.bbs_next,
+ "recovery.conf",
+ mystreamer->recoveryconfcontents->data,
+ mystreamer->recoveryconfcontents->len);
+ }
+
+ /* Nothing to do here. */
+ break;
+
+ default:
+ /* Shouldn't happen. */
+ pg_fatal("unexpected state while injecting recovery settings");
+ }
+
+ bbstreamer_content(mystreamer->base.bbs_next, &mystreamer->member,
+ data, len, context);
+}
+
+/*
+ * End-of-stream processing for this bbstreamer.
+ */
+static void
+bbstreamer_recovery_injector_finalize(bbstreamer *streamer)
+{
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with this bbstreamer.
+ */
+static void
+bbstreamer_recovery_injector_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer);
+}
+
+/*
+ * Inject a member into the archive with specified contents.
+ */
+void
+bbstreamer_inject_file(bbstreamer *streamer, char *pathname, char *data,
+ int len)
+{
+ bbstreamer_member member;
+
+ strlcpy(member.pathname, pathname, MAXPGPATH);
+ member.size = len;
+ member.mode = pg_file_create_mode;
+ member.is_directory = false;
+ member.is_link = false;
+ member.linktarget[0] = '\0';
+
+ /*
+ * There seems to be no principled argument for these values, but they are
+ * what PostgreSQL has historically used.
+ */
+ member.uid = 04000;
+ member.gid = 02000;
+
+ /*
+ * We don't know here how to generate valid member headers and trailers
+ * for the archiving format in use, so if those are needed, some successor
+ * bbstreamer will have to generate them using the data from 'member'.
+ */
+ bbstreamer_content(streamer, &member, NULL, 0,
+ BBSTREAMER_MEMBER_HEADER);
+ bbstreamer_content(streamer, &member, data, len,
+ BBSTREAMER_MEMBER_CONTENTS);
+ bbstreamer_content(streamer, &member, NULL, 0,
+ BBSTREAMER_MEMBER_TRAILER);
+}
diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c
new file mode 100644
index 0000000..395fcb9
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_lz4.c
@@ -0,0 +1,422 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_lz4.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_lz4.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+#endif
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "common/file_perm.h"
+#include "common/string.h"
+
+#ifdef USE_LZ4
+typedef struct bbstreamer_lz4_frame
+{
+ bbstreamer base;
+
+ LZ4F_compressionContext_t cctx;
+ LZ4F_decompressionContext_t dctx;
+ LZ4F_preferences_t prefs;
+
+ size_t bytes_written;
+ bool header_written;
+} bbstreamer_lz4_frame;
+
+static void bbstreamer_lz4_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_lz4_compressor_finalize(bbstreamer *streamer);
+static void bbstreamer_lz4_compressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_lz4_compressor_ops = {
+ .content = bbstreamer_lz4_compressor_content,
+ .finalize = bbstreamer_lz4_compressor_finalize,
+ .free = bbstreamer_lz4_compressor_free
+};
+
+static void bbstreamer_lz4_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_lz4_decompressor_finalize(bbstreamer *streamer);
+static void bbstreamer_lz4_decompressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_lz4_decompressor_ops = {
+ .content = bbstreamer_lz4_decompressor_content,
+ .finalize = bbstreamer_lz4_decompressor_finalize,
+ .free = bbstreamer_lz4_decompressor_free
+};
+#endif
+
+/*
+ * Create a new base backup streamer that performs lz4 compression of tar
+ * blocks.
+ */
+bbstreamer *
+bbstreamer_lz4_compressor_new(bbstreamer *next, pg_compress_specification *compress)
+{
+#ifdef USE_LZ4
+ bbstreamer_lz4_frame *streamer;
+ LZ4F_errorCode_t ctxError;
+ LZ4F_preferences_t *prefs;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_lz4_frame));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_lz4_compressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ streamer->header_written = false;
+
+ /* Initialize stream compression preferences */
+ prefs = &streamer->prefs;
+ memset(prefs, 0, sizeof(LZ4F_preferences_t));
+ prefs->frameInfo.blockSizeID = LZ4F_max256KB;
+ prefs->compressionLevel = compress->level;
+
+ ctxError = LZ4F_createCompressionContext(&streamer->cctx, LZ4F_VERSION);
+ if (LZ4F_isError(ctxError))
+ pg_log_error("could not create lz4 compression context: %s",
+ LZ4F_getErrorName(ctxError));
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support compression with %s", "LZ4");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_LZ4
+/*
+ * Compress the input data to output buffer.
+ *
+ * Find out the compression bound based on input data length for each
+ * invocation to make sure that output buffer has enough capacity to
+ * accommodate the compressed data. In case if the output buffer
+ * capacity falls short of compression bound then forward the content
+ * of output buffer to next streamer and empty the buffer.
+ */
+static void
+bbstreamer_lz4_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_lz4_frame *mystreamer;
+ uint8 *next_in,
+ *next_out;
+ size_t out_bound,
+ compressed_size,
+ avail_out;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ next_in = (uint8 *) data;
+
+ /* Write header before processing the first input chunk. */
+ if (!mystreamer->header_written)
+ {
+ compressed_size = LZ4F_compressBegin(mystreamer->cctx,
+ (uint8 *) mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ &mystreamer->prefs);
+
+ if (LZ4F_isError(compressed_size))
+ pg_log_error("could not write lz4 header: %s",
+ LZ4F_getErrorName(compressed_size));
+
+ mystreamer->bytes_written += compressed_size;
+ mystreamer->header_written = true;
+ }
+
+ /*
+ * Update the offset and capacity of output buffer based on number of
+ * bytes written to output buffer.
+ */
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
+ avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+
+ /*
+ * Find out the compression bound and make sure that output buffer has the
+ * required capacity for the success of LZ4F_compressUpdate. If needed
+ * forward the content to next streamer and empty the buffer.
+ */
+ out_bound = LZ4F_compressBound(len, &mystreamer->prefs);
+ if (avail_out < out_bound)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->bytes_written,
+ context);
+
+ /* Enlarge buffer if it falls short of out bound. */
+ if (mystreamer->base.bbs_buffer.maxlen < out_bound)
+ enlargeStringInfo(&mystreamer->base.bbs_buffer, out_bound);
+
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->bytes_written = 0;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ }
+
+ /*
+ * This call compresses the data starting at next_in and generates the
+ * output starting at next_out. It expects the caller to provide the size
+ * of input buffer and capacity of output buffer by providing parameters
+ * len and avail_out.
+ *
+ * It returns the number of bytes compressed to output buffer.
+ */
+ compressed_size = LZ4F_compressUpdate(mystreamer->cctx,
+ next_out, avail_out,
+ next_in, len, NULL);
+
+ if (LZ4F_isError(compressed_size))
+ pg_log_error("could not compress data: %s",
+ LZ4F_getErrorName(compressed_size));
+
+ mystreamer->bytes_written += compressed_size;
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_lz4_compressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+ uint8 *next_out;
+ size_t footer_bound,
+ compressed_size,
+ avail_out;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+
+ /* Find out the footer bound and update the output buffer. */
+ footer_bound = LZ4F_compressBound(0, &mystreamer->prefs);
+ if ((mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written) <
+ footer_bound)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->bytes_written,
+ BBSTREAMER_UNKNOWN);
+
+ /* Enlarge buffer if it falls short of footer bound. */
+ if (mystreamer->base.bbs_buffer.maxlen < footer_bound)
+ enlargeStringInfo(&mystreamer->base.bbs_buffer, footer_bound);
+
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->bytes_written = 0;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ }
+ else
+ {
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data + mystreamer->bytes_written;
+ avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+ }
+
+ /*
+ * Finalize the frame and flush whatever data remaining in compression
+ * context.
+ */
+ compressed_size = LZ4F_compressEnd(mystreamer->cctx,
+ next_out, avail_out, NULL);
+
+ if (LZ4F_isError(compressed_size))
+ pg_log_error("could not end lz4 compression: %s",
+ LZ4F_getErrorName(compressed_size));
+
+ mystreamer->bytes_written += compressed_size;
+
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->bytes_written,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_lz4_compressor_free(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ bbstreamer_free(streamer->bbs_next);
+ LZ4F_freeCompressionContext(mystreamer->cctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
+
+/*
+ * Create a new base backup streamer that performs decompression of lz4
+ * compressed blocks.
+ */
+bbstreamer *
+bbstreamer_lz4_decompressor_new(bbstreamer *next)
+{
+#ifdef USE_LZ4
+ bbstreamer_lz4_frame *streamer;
+ LZ4F_errorCode_t ctxError;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_lz4_frame));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_lz4_decompressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+
+ /* Initialize internal stream state for decompression */
+ ctxError = LZ4F_createDecompressionContext(&streamer->dctx, LZ4F_VERSION);
+ if (LZ4F_isError(ctxError))
+ pg_fatal("could not initialize compression library: %s",
+ LZ4F_getErrorName(ctxError));
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support compression with %s", "LZ4");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_LZ4
+/*
+ * Decompress the input data to output buffer until we run out of input
+ * data. Each time the output buffer is full, pass on the decompressed data
+ * to the next streamer.
+ */
+static void
+bbstreamer_lz4_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_lz4_frame *mystreamer;
+ uint8 *next_in,
+ *next_out;
+ size_t avail_in,
+ avail_out;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ next_in = (uint8 *) data;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ avail_in = len;
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+
+ while (avail_in > 0)
+ {
+ size_t ret,
+ read_size,
+ out_size;
+
+ read_size = avail_in;
+ out_size = avail_out;
+
+ /*
+ * This call decompresses the data starting at next_in and generates
+ * the output data starting at next_out. It expects the caller to
+ * provide size of the input buffer and total capacity of the output
+ * buffer by providing the read_size and out_size parameters
+ * respectively.
+ *
+ * Per the documentation of LZ4, parameters read_size and out_size
+ * behaves as dual parameters. On return, the number of bytes consumed
+ * from the input buffer will be written back to read_size and the
+ * number of bytes decompressed to output buffer will be written back
+ * to out_size respectively.
+ */
+ ret = LZ4F_decompress(mystreamer->dctx,
+ next_out, &out_size,
+ next_in, &read_size, NULL);
+
+ if (LZ4F_isError(ret))
+ pg_log_error("could not decompress data: %s",
+ LZ4F_getErrorName(ret));
+
+ /* Update input buffer based on number of bytes consumed */
+ avail_in -= read_size;
+ next_in += read_size;
+
+ mystreamer->bytes_written += out_size;
+
+ /*
+ * If output buffer is full then forward the content to next streamer
+ * and update the output buffer.
+ */
+ if (mystreamer->bytes_written >= mystreamer->base.bbs_buffer.maxlen)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ context);
+
+ avail_out = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->bytes_written = 0;
+ next_out = (uint8 *) mystreamer->base.bbs_buffer.data;
+ }
+ else
+ {
+ avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written;
+ next_out += mystreamer->bytes_written;
+ }
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_lz4_decompressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+
+ /*
+ * End of the stream, if there is some pending data in output buffers then
+ * we must forward it to next streamer.
+ */
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_lz4_decompressor_free(bbstreamer *streamer)
+{
+ bbstreamer_lz4_frame *mystreamer;
+
+ mystreamer = (bbstreamer_lz4_frame *) streamer;
+ bbstreamer_free(streamer->bbs_next);
+ LZ4F_freeDecompressionContext(mystreamer->dctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
diff --git a/src/bin/pg_basebackup/bbstreamer_tar.c b/src/bin/pg_basebackup/bbstreamer_tar.c
new file mode 100644
index 0000000..03d7fd3
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_tar.c
@@ -0,0 +1,516 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_tar.c
+ *
+ * This module implements three types of tar processing. A tar parser
+ * expects unlabelled chunks of data (e.g. BBSTREAMER_UNKNOWN) and splits
+ * it into labelled chunks (any other value of bbstreamer_archive_context).
+ * A tar archiver does the reverse: it takes a bunch of labelled chunks
+ * and produces a tarfile, optionally replacing member headers and trailers
+ * so that upstream bbstreamer objects can perform surgery on the tarfile
+ * contents without knowing the details of the tar format. A tar terminator
+ * just adds two blocks of NUL bytes to the end of the file, since older
+ * server versions produce files with this terminator omitted.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_tar.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <time.h>
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+#include "pgtar.h"
+
+typedef struct bbstreamer_tar_parser
+{
+ bbstreamer base;
+ bbstreamer_archive_context next_context;
+ bbstreamer_member member;
+ size_t file_bytes_sent;
+ size_t pad_bytes_expected;
+} bbstreamer_tar_parser;
+
+typedef struct bbstreamer_tar_archiver
+{
+ bbstreamer base;
+ bool rearchive_member;
+} bbstreamer_tar_archiver;
+
+static void bbstreamer_tar_parser_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_tar_parser_finalize(bbstreamer *streamer);
+static void bbstreamer_tar_parser_free(bbstreamer *streamer);
+static bool bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer);
+
+const bbstreamer_ops bbstreamer_tar_parser_ops = {
+ .content = bbstreamer_tar_parser_content,
+ .finalize = bbstreamer_tar_parser_finalize,
+ .free = bbstreamer_tar_parser_free
+};
+
+static void bbstreamer_tar_archiver_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_tar_archiver_finalize(bbstreamer *streamer);
+static void bbstreamer_tar_archiver_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_tar_archiver_ops = {
+ .content = bbstreamer_tar_archiver_content,
+ .finalize = bbstreamer_tar_archiver_finalize,
+ .free = bbstreamer_tar_archiver_free
+};
+
+static void bbstreamer_tar_terminator_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_tar_terminator_finalize(bbstreamer *streamer);
+static void bbstreamer_tar_terminator_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_tar_terminator_ops = {
+ .content = bbstreamer_tar_terminator_content,
+ .finalize = bbstreamer_tar_terminator_finalize,
+ .free = bbstreamer_tar_terminator_free
+};
+
+/*
+ * Create a bbstreamer that can parse a stream of content as tar data.
+ *
+ * The input should be a series of BBSTREAMER_UNKNOWN chunks; the bbstreamer
+ * specified by 'next' will receive a series of typed chunks, as per the
+ * conventions described in bbstreamer.h.
+ */
+extern bbstreamer *
+bbstreamer_tar_parser_new(bbstreamer *next)
+{
+ bbstreamer_tar_parser *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_tar_parser));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_tar_parser_ops;
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ streamer->next_context = BBSTREAMER_MEMBER_HEADER;
+
+ return &streamer->base;
+}
+
+/*
+ * Parse unknown content as tar data.
+ */
+static void
+bbstreamer_tar_parser_content(bbstreamer *streamer, bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_tar_parser *mystreamer = (bbstreamer_tar_parser *) streamer;
+ size_t nbytes;
+
+ /* Expect unparsed input. */
+ Assert(member == NULL);
+ Assert(context == BBSTREAMER_UNKNOWN);
+
+ while (len > 0)
+ {
+ switch (mystreamer->next_context)
+ {
+ case BBSTREAMER_MEMBER_HEADER:
+
+ /*
+ * If we're expecting an archive member header, accumulate a
+ * full block of data before doing anything further.
+ */
+ if (!bbstreamer_buffer_until(streamer, &data, &len,
+ TAR_BLOCK_SIZE))
+ return;
+
+ /*
+ * Now we can process the header and get ready to process the
+ * file contents; however, we might find out that what we
+ * thought was the next file header is actually the start of
+ * the archive trailer. Switch modes accordingly.
+ */
+ if (bbstreamer_tar_header(mystreamer))
+ {
+ if (mystreamer->member.size == 0)
+ {
+ /* No content; trailer is zero-length. */
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ NULL, 0,
+ BBSTREAMER_MEMBER_TRAILER);
+
+ /* Expect next header. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_HEADER;
+ }
+ else
+ {
+ /* Expect contents. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_CONTENTS;
+ }
+ mystreamer->base.bbs_buffer.len = 0;
+ mystreamer->file_bytes_sent = 0;
+ }
+ else
+ mystreamer->next_context = BBSTREAMER_ARCHIVE_TRAILER;
+ break;
+
+ case BBSTREAMER_MEMBER_CONTENTS:
+
+ /*
+ * Send as much content as we have, but not more than the
+ * remaining file length.
+ */
+ Assert(mystreamer->file_bytes_sent < mystreamer->member.size);
+ nbytes = mystreamer->member.size - mystreamer->file_bytes_sent;
+ nbytes = Min(nbytes, len);
+ Assert(nbytes > 0);
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ data, nbytes,
+ BBSTREAMER_MEMBER_CONTENTS);
+ mystreamer->file_bytes_sent += nbytes;
+ data += nbytes;
+ len -= nbytes;
+
+ /*
+ * If we've not yet sent the whole file, then there's more
+ * content to come; otherwise, it's time to expect the file
+ * trailer.
+ */
+ Assert(mystreamer->file_bytes_sent <= mystreamer->member.size);
+ if (mystreamer->file_bytes_sent == mystreamer->member.size)
+ {
+ if (mystreamer->pad_bytes_expected == 0)
+ {
+ /* Trailer is zero-length. */
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ NULL, 0,
+ BBSTREAMER_MEMBER_TRAILER);
+
+ /* Expect next header. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_HEADER;
+ }
+ else
+ {
+ /* Trailer is not zero-length. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_TRAILER;
+ }
+ mystreamer->base.bbs_buffer.len = 0;
+ }
+ break;
+
+ case BBSTREAMER_MEMBER_TRAILER:
+
+ /*
+ * If we're expecting an archive member trailer, accumulate
+ * the expected number of padding bytes before sending
+ * anything onward.
+ */
+ if (!bbstreamer_buffer_until(streamer, &data, &len,
+ mystreamer->pad_bytes_expected))
+ return;
+
+ /* OK, now we can send it. */
+ bbstreamer_content(mystreamer->base.bbs_next,
+ &mystreamer->member,
+ data, mystreamer->pad_bytes_expected,
+ BBSTREAMER_MEMBER_TRAILER);
+
+ /* Expect next file header. */
+ mystreamer->next_context = BBSTREAMER_MEMBER_HEADER;
+ mystreamer->base.bbs_buffer.len = 0;
+ break;
+
+ case BBSTREAMER_ARCHIVE_TRAILER:
+
+ /*
+ * We've seen an end-of-archive indicator, so anything more is
+ * buffered and sent as part of the archive trailer. But we
+ * don't expect more than 2 blocks.
+ */
+ bbstreamer_buffer_bytes(streamer, &data, &len, len);
+ if (len > 2 * TAR_BLOCK_SIZE)
+ pg_fatal("tar file trailer exceeds 2 blocks");
+ return;
+
+ default:
+ /* Shouldn't happen. */
+ pg_fatal("unexpected state while parsing tar archive");
+ }
+ }
+}
+
+/*
+ * Parse a file header within a tar stream.
+ *
+ * The return value is true if we found a file header and passed it on to the
+ * next bbstreamer; it is false if we have reached the archive trailer.
+ */
+static bool
+bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer)
+{
+ bool has_nonzero_byte = false;
+ int i;
+ bbstreamer_member *member = &mystreamer->member;
+ char *buffer = mystreamer->base.bbs_buffer.data;
+
+ Assert(mystreamer->base.bbs_buffer.len == TAR_BLOCK_SIZE);
+
+ /* Check whether we've got a block of all zero bytes. */
+ for (i = 0; i < TAR_BLOCK_SIZE; ++i)
+ {
+ if (buffer[i] != '\0')
+ {
+ has_nonzero_byte = true;
+ break;
+ }
+ }
+
+ /*
+ * If the entire block was zeros, this is the end of the archive, not the
+ * start of the next file.
+ */
+ if (!has_nonzero_byte)
+ return false;
+
+ /*
+ * Parse key fields out of the header.
+ *
+ * FIXME: It's terrible that we use hard-coded values here instead of some
+ * more principled approach. It's been like this for a long time, but we
+ * ought to do better.
+ */
+ strlcpy(member->pathname, &buffer[0], MAXPGPATH);
+ if (member->pathname[0] == '\0')
+ pg_fatal("tar member has empty name");
+ member->size = read_tar_number(&buffer[124], 12);
+ member->mode = read_tar_number(&buffer[100], 8);
+ member->uid = read_tar_number(&buffer[108], 8);
+ member->gid = read_tar_number(&buffer[116], 8);
+ member->is_directory = (buffer[156] == '5');
+ member->is_link = (buffer[156] == '2');
+ if (member->is_link)
+ strlcpy(member->linktarget, &buffer[157], 100);
+
+ /* Compute number of padding bytes. */
+ mystreamer->pad_bytes_expected = tarPaddingBytesRequired(member->size);
+
+ /* Forward the entire header to the next bbstreamer. */
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ buffer, TAR_BLOCK_SIZE,
+ BBSTREAMER_MEMBER_HEADER);
+
+ return true;
+}
+
+/*
+ * End-of-stream processing for a tar parser.
+ */
+static void
+bbstreamer_tar_parser_finalize(bbstreamer *streamer)
+{
+ bbstreamer_tar_parser *mystreamer = (bbstreamer_tar_parser *) streamer;
+
+ if (mystreamer->next_context != BBSTREAMER_ARCHIVE_TRAILER &&
+ (mystreamer->next_context != BBSTREAMER_MEMBER_HEADER ||
+ mystreamer->base.bbs_buffer.len > 0))
+ pg_fatal("COPY stream ended before last file was finished");
+
+ /* Send the archive trailer, even if empty. */
+ bbstreamer_content(streamer->bbs_next, NULL,
+ streamer->bbs_buffer.data, streamer->bbs_buffer.len,
+ BBSTREAMER_ARCHIVE_TRAILER);
+
+ /* Now finalize successor. */
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with a tar parser.
+ */
+static void
+bbstreamer_tar_parser_free(bbstreamer *streamer)
+{
+ pfree(streamer->bbs_buffer.data);
+ bbstreamer_free(streamer->bbs_next);
+}
+
+/*
+ * Create an bbstreamer that can generate a tar archive.
+ *
+ * This is intended to be usable either for generating a brand-new tar archive
+ * or for modifying one on the fly. The input should be a series of typed
+ * chunks (i.e. not BBSTREAMER_UNKNOWN). See also the comments for
+ * bbstreamer_tar_parser_content.
+ */
+extern bbstreamer *
+bbstreamer_tar_archiver_new(bbstreamer *next)
+{
+ bbstreamer_tar_archiver *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer_tar_archiver));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_tar_archiver_ops;
+ streamer->base.bbs_next = next;
+
+ return &streamer->base;
+}
+
+/*
+ * Fix up the stream of input chunks to create a valid tar file.
+ *
+ * If a BBSTREAMER_MEMBER_HEADER chunk is of size 0, it is replaced with a
+ * newly-constructed tar header. If it is of size TAR_BLOCK_SIZE, it is
+ * passed through without change. Any other size is a fatal error (and
+ * indicates a bug).
+ *
+ * Whenever a new BBSTREAMER_MEMBER_HEADER chunk is constructed, the
+ * corresponding BBSTREAMER_MEMBER_TRAILER chunk is also constructed from
+ * scratch. Specifically, we construct a block of zero bytes sufficient to
+ * pad out to a block boundary, as required by the tar format. Other
+ * BBSTREAMER_MEMBER_TRAILER chunks are passed through without change.
+ *
+ * Any BBSTREAMER_MEMBER_CONTENTS chunks are passed through without change.
+ *
+ * The BBSTREAMER_ARCHIVE_TRAILER chunk is replaced with two
+ * blocks of zero bytes. Not all tar programs require this, but apparently
+ * some do. The server does not supply this trailer. If no archive trailer is
+ * present, one will be added by bbstreamer_tar_parser_finalize.
+ */
+static void
+bbstreamer_tar_archiver_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_tar_archiver *mystreamer = (bbstreamer_tar_archiver *) streamer;
+ char buffer[2 * TAR_BLOCK_SIZE];
+
+ Assert(context != BBSTREAMER_UNKNOWN);
+
+ if (context == BBSTREAMER_MEMBER_HEADER && len != TAR_BLOCK_SIZE)
+ {
+ Assert(len == 0);
+
+ /* Replace zero-length tar header with a newly constructed one. */
+ tarCreateHeader(buffer, member->pathname, NULL,
+ member->size, member->mode, member->uid, member->gid,
+ time(NULL));
+ data = buffer;
+ len = TAR_BLOCK_SIZE;
+
+ /* Also make a note to replace padding, in case size changed. */
+ mystreamer->rearchive_member = true;
+ }
+ else if (context == BBSTREAMER_MEMBER_TRAILER &&
+ mystreamer->rearchive_member)
+ {
+ int pad_bytes = tarPaddingBytesRequired(member->size);
+
+ /* Also replace padding, if we regenerated the header. */
+ memset(buffer, 0, pad_bytes);
+ data = buffer;
+ len = pad_bytes;
+
+ /* Don't do this again unless we replace another header. */
+ mystreamer->rearchive_member = false;
+ }
+ else if (context == BBSTREAMER_ARCHIVE_TRAILER)
+ {
+ /* Trailer should always be two blocks of zero bytes. */
+ memset(buffer, 0, 2 * TAR_BLOCK_SIZE);
+ data = buffer;
+ len = 2 * TAR_BLOCK_SIZE;
+ }
+
+ bbstreamer_content(streamer->bbs_next, member, data, len, context);
+}
+
+/*
+ * End-of-stream processing for a tar archiver.
+ */
+static void
+bbstreamer_tar_archiver_finalize(bbstreamer *streamer)
+{
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with a tar archiver.
+ */
+static void
+bbstreamer_tar_archiver_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer);
+}
+
+/*
+ * Create a bbstreamer that blindly adds two blocks of NUL bytes to the
+ * end of an incomplete tarfile that the server might send us.
+ */
+bbstreamer *
+bbstreamer_tar_terminator_new(bbstreamer *next)
+{
+ bbstreamer *streamer;
+
+ streamer = palloc0(sizeof(bbstreamer));
+ *((const bbstreamer_ops **) &streamer->bbs_ops) =
+ &bbstreamer_tar_terminator_ops;
+ streamer->bbs_next = next;
+
+ return streamer;
+}
+
+/*
+ * Pass all the content through without change.
+ */
+static void
+bbstreamer_tar_terminator_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ /* Expect unparsed input. */
+ Assert(member == NULL);
+ Assert(context == BBSTREAMER_UNKNOWN);
+
+ /* Just forward it. */
+ bbstreamer_content(streamer->bbs_next, member, data, len, context);
+}
+
+/*
+ * At the end, blindly add the two blocks of NUL bytes which the server fails
+ * to supply.
+ */
+static void
+bbstreamer_tar_terminator_finalize(bbstreamer *streamer)
+{
+ char buffer[2 * TAR_BLOCK_SIZE];
+
+ memset(buffer, 0, 2 * TAR_BLOCK_SIZE);
+ bbstreamer_content(streamer->bbs_next, NULL, buffer,
+ 2 * TAR_BLOCK_SIZE, BBSTREAMER_UNKNOWN);
+ bbstreamer_finalize(streamer->bbs_next);
+}
+
+/*
+ * Free memory associated with a tar terminator.
+ */
+static void
+bbstreamer_tar_terminator_free(bbstreamer *streamer)
+{
+ bbstreamer_free(streamer->bbs_next);
+ pfree(streamer);
+}
diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c
new file mode 100644
index 0000000..58e32ca
--- /dev/null
+++ b/src/bin/pg_basebackup/bbstreamer_zstd.c
@@ -0,0 +1,368 @@
+/*-------------------------------------------------------------------------
+ *
+ * bbstreamer_zstd.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/bbstreamer_zstd.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#ifdef USE_ZSTD
+#include <zstd.h>
+#endif
+
+#include "bbstreamer.h"
+#include "common/logging.h"
+
+#ifdef USE_ZSTD
+
+typedef struct bbstreamer_zstd_frame
+{
+ bbstreamer base;
+
+ ZSTD_CCtx *cctx;
+ ZSTD_DCtx *dctx;
+ ZSTD_outBuffer zstd_outBuf;
+} bbstreamer_zstd_frame;
+
+static void bbstreamer_zstd_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_zstd_compressor_finalize(bbstreamer *streamer);
+static void bbstreamer_zstd_compressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_zstd_compressor_ops = {
+ .content = bbstreamer_zstd_compressor_content,
+ .finalize = bbstreamer_zstd_compressor_finalize,
+ .free = bbstreamer_zstd_compressor_free
+};
+
+static void bbstreamer_zstd_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context);
+static void bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer);
+static void bbstreamer_zstd_decompressor_free(bbstreamer *streamer);
+
+const bbstreamer_ops bbstreamer_zstd_decompressor_ops = {
+ .content = bbstreamer_zstd_decompressor_content,
+ .finalize = bbstreamer_zstd_decompressor_finalize,
+ .free = bbstreamer_zstd_decompressor_free
+};
+#endif
+
+/*
+ * Create a new base backup streamer that performs zstd compression of tar
+ * blocks.
+ */
+bbstreamer *
+bbstreamer_zstd_compressor_new(bbstreamer *next, pg_compress_specification *compress)
+{
+#ifdef USE_ZSTD
+ bbstreamer_zstd_frame *streamer;
+ size_t ret;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_zstd_frame));
+
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_zstd_compressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ enlargeStringInfo(&streamer->base.bbs_buffer, ZSTD_DStreamOutSize());
+
+ streamer->cctx = ZSTD_createCCtx();
+ if (!streamer->cctx)
+ pg_fatal("could not create zstd compression context");
+
+ /* Set compression level */
+ ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_compressionLevel,
+ compress->level);
+ if (ZSTD_isError(ret))
+ pg_fatal("could not set zstd compression level to %d: %s",
+ compress->level, ZSTD_getErrorName(ret));
+
+ /* Set # of workers, if specified */
+ if ((compress->options & PG_COMPRESSION_OPTION_WORKERS) != 0)
+ {
+ /*
+ * On older versions of libzstd, this option does not exist, and
+ * trying to set it will fail. Similarly for newer versions if they
+ * are compiled without threading support.
+ */
+ ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_nbWorkers,
+ compress->workers);
+ if (ZSTD_isError(ret))
+ pg_fatal("could not set compression worker count to %d: %s",
+ compress->workers, ZSTD_getErrorName(ret));
+ }
+
+ if ((compress->options & PG_COMPRESSION_OPTION_LONG_DISTANCE) != 0)
+ {
+ ret = ZSTD_CCtx_setParameter(streamer->cctx,
+ ZSTD_c_enableLongDistanceMatching,
+ compress->long_distance);
+ if (ZSTD_isError(ret))
+ {
+ pg_log_error("could not enable long-distance mode: %s",
+ ZSTD_getErrorName(ret));
+ exit(1);
+ }
+ }
+
+ /* Initialize the ZSTD output buffer. */
+ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data;
+ streamer->zstd_outBuf.size = streamer->base.bbs_buffer.maxlen;
+ streamer->zstd_outBuf.pos = 0;
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support compression with %s", "ZSTD");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_ZSTD
+/*
+ * Compress the input data to output buffer.
+ *
+ * Find out the compression bound based on input data length for each
+ * invocation to make sure that output buffer has enough capacity to
+ * accommodate the compressed data. In case if the output buffer
+ * capacity falls short of compression bound then forward the content
+ * of output buffer to next streamer and empty the buffer.
+ */
+static void
+bbstreamer_zstd_compressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+ ZSTD_inBuffer inBuf = {data, len, 0};
+
+ while (inBuf.pos < inBuf.size)
+ {
+ size_t yet_to_flush;
+ size_t max_needed = ZSTD_compressBound(inBuf.size - inBuf.pos);
+
+ /*
+ * If the output buffer is not left with enough space, send the
+ * compressed bytes to the next streamer, and empty the buffer.
+ */
+ if (mystreamer->zstd_outBuf.size - mystreamer->zstd_outBuf.pos <
+ max_needed)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ context);
+
+ /* Reset the ZSTD output buffer. */
+ mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data;
+ mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->zstd_outBuf.pos = 0;
+ }
+
+ yet_to_flush =
+ ZSTD_compressStream2(mystreamer->cctx, &mystreamer->zstd_outBuf,
+ &inBuf, ZSTD_e_continue);
+
+ if (ZSTD_isError(yet_to_flush))
+ pg_log_error("could not compress data: %s",
+ ZSTD_getErrorName(yet_to_flush));
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_zstd_compressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+ size_t yet_to_flush;
+
+ do
+ {
+ ZSTD_inBuffer in = {NULL, 0, 0};
+ size_t max_needed = ZSTD_compressBound(0);
+
+ /*
+ * If the output buffer is not left with enough space, send the
+ * compressed bytes to the next streamer, and empty the buffer.
+ */
+ if (mystreamer->zstd_outBuf.size - mystreamer->zstd_outBuf.pos <
+ max_needed)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ BBSTREAMER_UNKNOWN);
+
+ /* Reset the ZSTD output buffer. */
+ mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data;
+ mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->zstd_outBuf.pos = 0;
+ }
+
+ yet_to_flush = ZSTD_compressStream2(mystreamer->cctx,
+ &mystreamer->zstd_outBuf,
+ &in, ZSTD_e_end);
+
+ if (ZSTD_isError(yet_to_flush))
+ pg_log_error("could not compress data: %s",
+ ZSTD_getErrorName(yet_to_flush));
+
+ } while (yet_to_flush > 0);
+
+ /* Make sure to pass any remaining bytes to the next streamer. */
+ if (mystreamer->zstd_outBuf.pos > 0)
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_zstd_compressor_free(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+
+ bbstreamer_free(streamer->bbs_next);
+ ZSTD_freeCCtx(mystreamer->cctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
+
+/*
+ * Create a new base backup streamer that performs decompression of zstd
+ * compressed blocks.
+ */
+bbstreamer *
+bbstreamer_zstd_decompressor_new(bbstreamer *next)
+{
+#ifdef USE_ZSTD
+ bbstreamer_zstd_frame *streamer;
+
+ Assert(next != NULL);
+
+ streamer = palloc0(sizeof(bbstreamer_zstd_frame));
+ *((const bbstreamer_ops **) &streamer->base.bbs_ops) =
+ &bbstreamer_zstd_decompressor_ops;
+
+ streamer->base.bbs_next = next;
+ initStringInfo(&streamer->base.bbs_buffer);
+ enlargeStringInfo(&streamer->base.bbs_buffer, ZSTD_DStreamOutSize());
+
+ streamer->dctx = ZSTD_createDCtx();
+ if (!streamer->dctx)
+ pg_fatal("could not create zstd decompression context");
+
+ /* Initialize the ZSTD output buffer. */
+ streamer->zstd_outBuf.dst = streamer->base.bbs_buffer.data;
+ streamer->zstd_outBuf.size = streamer->base.bbs_buffer.maxlen;
+ streamer->zstd_outBuf.pos = 0;
+
+ return &streamer->base;
+#else
+ pg_fatal("this build does not support compression with %s", "ZSTD");
+ return NULL; /* keep compiler quiet */
+#endif
+}
+
+#ifdef USE_ZSTD
+/*
+ * Decompress the input data to output buffer until we run out of input
+ * data. Each time the output buffer is full, pass on the decompressed data
+ * to the next streamer.
+ */
+static void
+bbstreamer_zstd_decompressor_content(bbstreamer *streamer,
+ bbstreamer_member *member,
+ const char *data, int len,
+ bbstreamer_archive_context context)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+ ZSTD_inBuffer inBuf = {data, len, 0};
+
+ while (inBuf.pos < inBuf.size)
+ {
+ size_t ret;
+
+ /*
+ * If output buffer is full then forward the content to next streamer
+ * and update the output buffer.
+ */
+ if (mystreamer->zstd_outBuf.pos >= mystreamer->zstd_outBuf.size)
+ {
+ bbstreamer_content(mystreamer->base.bbs_next, member,
+ mystreamer->zstd_outBuf.dst,
+ mystreamer->zstd_outBuf.pos,
+ context);
+
+ /* Reset the ZSTD output buffer. */
+ mystreamer->zstd_outBuf.dst = mystreamer->base.bbs_buffer.data;
+ mystreamer->zstd_outBuf.size = mystreamer->base.bbs_buffer.maxlen;
+ mystreamer->zstd_outBuf.pos = 0;
+ }
+
+ ret = ZSTD_decompressStream(mystreamer->dctx,
+ &mystreamer->zstd_outBuf, &inBuf);
+
+ if (ZSTD_isError(ret))
+ pg_log_error("could not decompress data: %s",
+ ZSTD_getErrorName(ret));
+ }
+}
+
+/*
+ * End-of-stream processing.
+ */
+static void
+bbstreamer_zstd_decompressor_finalize(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+
+ /*
+ * End of the stream, if there is some pending data in output buffers then
+ * we must forward it to next streamer.
+ */
+ if (mystreamer->zstd_outBuf.pos > 0)
+ bbstreamer_content(mystreamer->base.bbs_next, NULL,
+ mystreamer->base.bbs_buffer.data,
+ mystreamer->base.bbs_buffer.maxlen,
+ BBSTREAMER_UNKNOWN);
+
+ bbstreamer_finalize(mystreamer->base.bbs_next);
+}
+
+/*
+ * Free memory.
+ */
+static void
+bbstreamer_zstd_decompressor_free(bbstreamer *streamer)
+{
+ bbstreamer_zstd_frame *mystreamer = (bbstreamer_zstd_frame *) streamer;
+
+ bbstreamer_free(streamer->bbs_next);
+ ZSTD_freeDCtx(mystreamer->dctx);
+ pfree(streamer->bbs_buffer.data);
+ pfree(streamer);
+}
+#endif
diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build
new file mode 100644
index 0000000..c426173
--- /dev/null
+++ b/src/bin/pg_basebackup/meson.build
@@ -0,0 +1,96 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+common_sources = files(
+ 'bbstreamer_file.c',
+ 'bbstreamer_gzip.c',
+ 'bbstreamer_inject.c',
+ 'bbstreamer_lz4.c',
+ 'bbstreamer_tar.c',
+ 'bbstreamer_zstd.c',
+ 'receivelog.c',
+ 'streamutil.c',
+ 'walmethods.c',
+)
+
+pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd]
+pg_basebackup_common = static_library('libpg_basebackup_common',
+ common_sources,
+ dependencies: pg_basebackup_deps,
+ kwargs: internal_lib_args,
+)
+
+pg_basebackup_sources = files(
+ 'pg_basebackup.c',
+)
+
+if host_system == 'windows'
+ pg_basebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_basebackup',
+ '--FILEDESC', 'pg_basebackup - streaming WAL and backup receivers',])
+endif
+
+pg_basebackup = executable('pg_basebackup',
+ pg_basebackup_sources,
+ link_with: [pg_basebackup_common],
+ dependencies: pg_basebackup_deps,
+ kwargs: default_bin_args,
+)
+bin_targets += pg_basebackup
+
+
+pg_receivewal_sources = files(
+ 'pg_receivewal.c',
+)
+
+if host_system == 'windows'
+ pg_receivewal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_receivewal',
+ '--FILEDESC', 'pg_receivewal - streaming WAL and backup receivers',])
+endif
+
+pg_receivewal = executable('pg_receivewal',
+ pg_receivewal_sources,
+ link_with: [pg_basebackup_common],
+ dependencies: pg_basebackup_deps,
+ kwargs: default_bin_args,
+)
+bin_targets += pg_receivewal
+
+
+pg_recvlogical_sources = files(
+ 'pg_recvlogical.c',
+)
+
+if host_system == 'windows'
+ pg_recvlogical_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_recvlogical',
+ '--FILEDESC', 'pg_recvlogical - streaming WAL and backup receivers',])
+endif
+
+pg_recvlogical = executable('pg_recvlogical',
+ pg_recvlogical_sources,
+ link_with: [pg_basebackup_common],
+ dependencies: pg_basebackup_deps,
+ kwargs: default_bin_args,
+)
+bin_targets += pg_recvlogical
+
+tests += {
+ 'name': 'pg_basebackup',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'GZIP_PROGRAM': gzip.path(),
+ 'TAR': tar.path(),
+ 'LZ4': program_lz4.found() ? program_lz4.path() : '',
+ },
+ 'tests': [
+ 't/010_pg_basebackup.pl',
+ 't/011_in_place_tablespace.pl',
+ 't/020_pg_receivewal.pl',
+ 't/030_pg_recvlogical.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_basebackup/nls.mk b/src/bin/pg_basebackup/nls.mk
new file mode 100644
index 0000000..fc47500
--- /dev/null
+++ b/src/bin/pg_basebackup/nls.mk
@@ -0,0 +1,22 @@
+# src/bin/pg_basebackup/nls.mk
+CATALOG_NAME = pg_basebackup
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ bbstreamer_file.c \
+ bbstreamer_gzip.c \
+ bbstreamer_inject.c \
+ bbstreamer_lz4.c \
+ bbstreamer_tar.c \
+ bbstreamer_zstd.c \
+ pg_basebackup.c \
+ pg_receivewal.c \
+ pg_recvlogical.c \
+ receivelog.c \
+ streamutil.c \
+ walmethods.c \
+ ../../common/compression.c \
+ ../../common/fe_memutils.c \
+ ../../common/file_utils.c \
+ ../../fe_utils/option_utils.c \
+ ../../fe_utils/recovery_gen.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
new file mode 100644
index 0000000..444fbff
--- /dev/null
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -0,0 +1,2764 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_basebackup.c - receive a base backup using streaming replication protocol
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/pg_basebackup.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+#include <dirent.h>
+#include <limits.h>
+#include <sys/select.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <time.h>
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "access/xlog_internal.h"
+#include "backup/basebackup.h"
+#include "bbstreamer.h"
+#include "common/compression.h"
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/recovery_gen.h"
+#include "getopt_long.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+#define ERRCODE_DATA_CORRUPTED "XX001"
+
+typedef struct TablespaceListCell
+{
+ struct TablespaceListCell *next;
+ char old_dir[MAXPGPATH];
+ char new_dir[MAXPGPATH];
+} TablespaceListCell;
+
+typedef struct TablespaceList
+{
+ TablespaceListCell *head;
+ TablespaceListCell *tail;
+} TablespaceList;
+
+typedef struct ArchiveStreamState
+{
+ int tablespacenum;
+ pg_compress_specification *compress;
+ bbstreamer *streamer;
+ bbstreamer *manifest_inject_streamer;
+ PQExpBuffer manifest_buffer;
+ char manifest_filename[MAXPGPATH];
+ FILE *manifest_file;
+} ArchiveStreamState;
+
+typedef struct WriteTarState
+{
+ int tablespacenum;
+ bbstreamer *streamer;
+} WriteTarState;
+
+typedef struct WriteManifestState
+{
+ char filename[MAXPGPATH];
+ FILE *file;
+} WriteManifestState;
+
+typedef void (*WriteDataCallback) (size_t nbytes, char *buf,
+ void *callback_data);
+
+/*
+ * pg_xlog has been renamed to pg_wal in version 10. This version number
+ * should be compared with PQserverVersion().
+ */
+#define MINIMUM_VERSION_FOR_PG_WAL 100000
+
+/*
+ * Temporary replication slots are supported from version 10.
+ */
+#define MINIMUM_VERSION_FOR_TEMP_SLOTS 100000
+
+/*
+ * Backup manifests are supported from version 13.
+ */
+#define MINIMUM_VERSION_FOR_MANIFESTS 130000
+
+/*
+ * Before v15, tar files received from the server will be improperly
+ * terminated.
+ */
+#define MINIMUM_VERSION_FOR_TERMINATED_TARFILE 150000
+
+/*
+ * Different ways to include WAL
+ */
+typedef enum
+{
+ NO_WAL,
+ FETCH_WAL,
+ STREAM_WAL
+} IncludeWal;
+
+/*
+ * Different places to perform compression
+ */
+typedef enum
+{
+ COMPRESS_LOCATION_UNSPECIFIED,
+ COMPRESS_LOCATION_CLIENT,
+ COMPRESS_LOCATION_SERVER
+} CompressionLocation;
+
+/* Global options */
+static char *basedir = NULL;
+static TablespaceList tablespace_dirs = {NULL, NULL};
+static char *xlog_dir = NULL;
+static char format = '\0'; /* p(lain)/t(ar) */
+static char *label = "pg_basebackup base backup";
+static bool noclean = false;
+static bool checksum_failure = false;
+static bool showprogress = false;
+static bool estimatesize = true;
+static int verbose = 0;
+static IncludeWal includewal = STREAM_WAL;
+static bool fastcheckpoint = false;
+static bool writerecoveryconf = false;
+static bool do_sync = true;
+static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
+static pg_time_t last_progress_report = 0;
+static int32 maxrate = 0; /* no limit by default */
+static char *replication_slot = NULL;
+static bool temp_replication_slot = true;
+static char *backup_target = NULL;
+static bool create_slot = false;
+static bool no_slot = false;
+static bool verify_checksums = true;
+static bool manifest = true;
+static bool manifest_force_encode = false;
+static char *manifest_checksums = NULL;
+
+static bool success = false;
+static bool made_new_pgdata = false;
+static bool found_existing_pgdata = false;
+static bool made_new_xlogdir = false;
+static bool found_existing_xlogdir = false;
+static bool made_tablespace_dirs = false;
+static bool found_tablespace_dirs = false;
+
+/* Progress indicators */
+static uint64 totalsize_kb;
+static uint64 totaldone;
+static int tablespacecount;
+static char *progress_filename = NULL;
+
+/* Pipe to communicate with background wal receiver process */
+#ifndef WIN32
+static int bgpipe[2] = {-1, -1};
+#endif
+
+/* Handle to child process */
+static pid_t bgchild = -1;
+static bool in_log_streamer = false;
+
+/* Flag to indicate if child process exited unexpectedly */
+static volatile sig_atomic_t bgchild_exited = false;
+
+/* End position for xlog streaming, empty string if unknown yet */
+static XLogRecPtr xlogendptr;
+
+#ifndef WIN32
+static int has_xlogendptr = 0;
+#else
+static volatile LONG has_xlogendptr = 0;
+#endif
+
+/* Contents of configuration file to be generated */
+static PQExpBuffer recoveryconfcontents = NULL;
+
+/* Function headers */
+static void usage(void);
+static void verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found);
+static void progress_update_filename(const char *filename);
+static void progress_report(int tablespacenum, bool force, bool finished);
+
+static bbstreamer *CreateBackupStreamer(char *archive_name, char *spclocation,
+ bbstreamer **manifest_inject_streamer_p,
+ bool is_recovery_guc_supported,
+ bool expect_unterminated_tarfile,
+ pg_compress_specification *compress);
+static void ReceiveArchiveStreamChunk(size_t r, char *copybuf,
+ void *callback_data);
+static char GetCopyDataByte(size_t r, char *copybuf, size_t *cursor);
+static char *GetCopyDataString(size_t r, char *copybuf, size_t *cursor);
+static uint64 GetCopyDataUInt64(size_t r, char *copybuf, size_t *cursor);
+static void GetCopyDataEnd(size_t r, char *copybuf, size_t cursor);
+static void ReportCopyDataParseError(size_t r, char *copybuf);
+static void ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation,
+ bool tablespacenum, pg_compress_specification *compress);
+static void ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data);
+static void ReceiveBackupManifest(PGconn *conn);
+static void ReceiveBackupManifestChunk(size_t r, char *copybuf,
+ void *callback_data);
+static void ReceiveBackupManifestInMemory(PGconn *conn, PQExpBuffer buf);
+static void ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf,
+ void *callback_data);
+static void BaseBackup(char *compression_algorithm, char *compression_detail,
+ CompressionLocation compressloc,
+ pg_compress_specification *client_compress);
+
+static bool reached_end_position(XLogRecPtr segendpos, uint32 timeline,
+ bool segment_finished);
+
+static const char *get_tablespace_mapping(const char *dir);
+static void tablespace_list_append(const char *arg);
+
+
+static void
+cleanup_directories_atexit(void)
+{
+ if (success || in_log_streamer)
+ return;
+
+ if (!noclean && !checksum_failure)
+ {
+ if (made_new_pgdata)
+ {
+ pg_log_info("removing data directory \"%s\"", basedir);
+ if (!rmtree(basedir, true))
+ pg_log_error("failed to remove data directory");
+ }
+ else if (found_existing_pgdata)
+ {
+ pg_log_info("removing contents of data directory \"%s\"", basedir);
+ if (!rmtree(basedir, false))
+ pg_log_error("failed to remove contents of data directory");
+ }
+
+ if (made_new_xlogdir)
+ {
+ pg_log_info("removing WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, true))
+ pg_log_error("failed to remove WAL directory");
+ }
+ else if (found_existing_xlogdir)
+ {
+ pg_log_info("removing contents of WAL directory \"%s\"", xlog_dir);
+ if (!rmtree(xlog_dir, false))
+ pg_log_error("failed to remove contents of WAL directory");
+ }
+ }
+ else
+ {
+ if ((made_new_pgdata || found_existing_pgdata) && !checksum_failure)
+ pg_log_info("data directory \"%s\" not removed at user's request", basedir);
+
+ if (made_new_xlogdir || found_existing_xlogdir)
+ pg_log_info("WAL directory \"%s\" not removed at user's request", xlog_dir);
+ }
+
+ if ((made_tablespace_dirs || found_tablespace_dirs) && !checksum_failure)
+ pg_log_info("changes to tablespace directories will not be undone");
+}
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
+
+#ifndef WIN32
+/*
+ * If the bgchild exits prematurely and raises a SIGCHLD signal, we can abort
+ * processing rather than wait until the backup has finished and error out at
+ * that time. On Windows, we use a background thread which can communicate
+ * without the need for a signal handler.
+ */
+static void
+sigchld_handler(SIGNAL_ARGS)
+{
+ bgchild_exited = true;
+}
+
+/*
+ * On windows, our background thread dies along with the process. But on
+ * Unix, if we have started a subprocess, we want to kill it off so it
+ * doesn't remain running trying to stream data.
+ */
+static void
+kill_bgchild_atexit(void)
+{
+ if (bgchild > 0 && !bgchild_exited)
+ kill(bgchild, SIGTERM);
+}
+#endif
+
+/*
+ * Split argument into old_dir and new_dir and append to tablespace mapping
+ * list.
+ */
+static void
+tablespace_list_append(const char *arg)
+{
+ TablespaceListCell *cell = (TablespaceListCell *) pg_malloc0(sizeof(TablespaceListCell));
+ char *dst;
+ char *dst_ptr;
+ const char *arg_ptr;
+
+ dst_ptr = dst = cell->old_dir;
+ for (arg_ptr = arg; *arg_ptr; arg_ptr++)
+ {
+ if (dst_ptr - dst >= MAXPGPATH)
+ pg_fatal("directory name too long");
+
+ if (*arg_ptr == '\\' && *(arg_ptr + 1) == '=')
+ ; /* skip backslash escaping = */
+ else if (*arg_ptr == '=' && (arg_ptr == arg || *(arg_ptr - 1) != '\\'))
+ {
+ if (*cell->new_dir)
+ pg_fatal("multiple \"=\" signs in tablespace mapping");
+ else
+ dst = dst_ptr = cell->new_dir;
+ }
+ else
+ *dst_ptr++ = *arg_ptr;
+ }
+
+ if (!*cell->old_dir || !*cell->new_dir)
+ pg_fatal("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"", arg);
+
+ /*
+ * All tablespaces are created with absolute directories, so specifying a
+ * non-absolute path here would just never match, possibly confusing
+ * users. Since we don't know whether the remote side is Windows or not,
+ * and it might be different than the local side, permit any path that
+ * could be absolute under either set of rules.
+ *
+ * (There is little practical risk of confusion here, because someone
+ * running entirely on Linux isn't likely to have a relative path that
+ * begins with a backslash or something that looks like a drive
+ * specification. If they do, and they also incorrectly believe that a
+ * relative path is acceptable here, we'll silently fail to warn them of
+ * their mistake, and the -T option will just not get applied, same as if
+ * they'd specified -T for a nonexistent tablespace.)
+ */
+ if (!is_nonwindows_absolute_path(cell->old_dir) &&
+ !is_windows_absolute_path(cell->old_dir))
+ pg_fatal("old directory is not an absolute path in tablespace mapping: %s",
+ cell->old_dir);
+
+ if (!is_absolute_path(cell->new_dir))
+ pg_fatal("new directory is not an absolute path in tablespace mapping: %s",
+ cell->new_dir);
+
+ /*
+ * Comparisons done with these values should involve similarly
+ * canonicalized path values. This is particularly sensitive on Windows
+ * where path values may not necessarily use Unix slashes.
+ */
+ canonicalize_path(cell->old_dir);
+ canonicalize_path(cell->new_dir);
+
+ if (tablespace_dirs.tail)
+ tablespace_dirs.tail->next = cell;
+ else
+ tablespace_dirs.head = cell;
+ tablespace_dirs.tail = cell;
+}
+
+
+static void
+usage(void)
+{
+ printf(_("%s takes a base backup of a running PostgreSQL server.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+ printf(_("\nOptions controlling the output:\n"));
+ printf(_(" -D, --pgdata=DIRECTORY receive base backup into directory\n"));
+ printf(_(" -F, --format=p|t output format (plain (default), tar)\n"));
+ printf(_(" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+ " (in kB/s, or use suffix \"k\" or \"M\")\n"));
+ printf(_(" -R, --write-recovery-conf\n"
+ " write configuration for replication\n"));
+ printf(_(" -t, --target=TARGET[:DETAIL]\n"
+ " backup target (if other than client)\n"));
+ printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+ " relocate tablespace in OLDDIR to NEWDIR\n"));
+ printf(_(" --waldir=WALDIR location for the write-ahead log directory\n"));
+ printf(_(" -X, --wal-method=none|fetch|stream\n"
+ " include required WAL files with specified method\n"));
+ printf(_(" -z, --gzip compress tar output\n"));
+ printf(_(" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+ " compress on client or server as specified\n"));
+ printf(_(" -Z, --compress=none do not compress tar output\n"));
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -c, --checkpoint=fast|spread\n"
+ " set fast or spread checkpointing\n"));
+ printf(_(" -C, --create-slot create replication slot\n"));
+ printf(_(" -l, --label=LABEL set backup label\n"));
+ printf(_(" -n, --no-clean do not clean up after errors\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -S, --slot=SLOTNAME replication slot to use\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+ " use algorithm for manifest checksums\n"));
+ printf(_(" --manifest-force-encode\n"
+ " hex encode all file names in manifest\n"));
+ printf(_(" --no-estimate-size do not estimate backup size in server side\n"));
+ printf(_(" --no-manifest suppress generation of backup manifest\n"));
+ printf(_(" --no-slot prevent creation of temporary replication slot\n"));
+ printf(_(" --no-verify-checksums\n"
+ " do not verify checksums\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=CONNSTR connection string\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -s, --status-interval=INTERVAL\n"
+ " time between status packets sent to server (in seconds)\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * Called in the background process every time data is received.
+ * On Unix, we check to see if there is any data on our pipe
+ * (which would mean we have a stop position), and if it is, check if
+ * it is time to stop.
+ * On Windows, we are in a single process, so we can just check if it's
+ * time to stop.
+ */
+static bool
+reached_end_position(XLogRecPtr segendpos, uint32 timeline,
+ bool segment_finished)
+{
+ if (!has_xlogendptr)
+ {
+#ifndef WIN32
+ fd_set fds;
+ struct timeval tv = {0};
+ int r;
+
+ /*
+ * Don't have the end pointer yet - check our pipe to see if it has
+ * been sent yet.
+ */
+ FD_ZERO(&fds);
+ FD_SET(bgpipe[0], &fds);
+
+ r = select(bgpipe[0] + 1, &fds, NULL, NULL, &tv);
+ if (r == 1)
+ {
+ char xlogend[64] = {0};
+ uint32 hi,
+ lo;
+
+ r = read(bgpipe[0], xlogend, sizeof(xlogend) - 1);
+ if (r < 0)
+ pg_fatal("could not read from ready pipe: %m");
+
+ if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse write-ahead log location \"%s\"",
+ xlogend);
+ xlogendptr = ((uint64) hi) << 32 | lo;
+ has_xlogendptr = 1;
+
+ /*
+ * Fall through to check if we've reached the point further
+ * already.
+ */
+ }
+ else
+ {
+ /*
+ * No data received on the pipe means we don't know the end
+ * position yet - so just say it's not time to stop yet.
+ */
+ return false;
+ }
+#else
+
+ /*
+ * On win32, has_xlogendptr is set by the main thread, so if it's not
+ * set here, we just go back and wait until it shows up.
+ */
+ return false;
+#endif
+ }
+
+ /*
+ * At this point we have an end pointer, so compare it to the current
+ * position to figure out if it's time to stop.
+ */
+ if (segendpos >= xlogendptr)
+ return true;
+
+ /*
+ * Have end pointer, but haven't reached it yet - so tell the caller to
+ * keep streaming.
+ */
+ return false;
+}
+
+typedef struct
+{
+ PGconn *bgconn;
+ XLogRecPtr startptr;
+ char xlog[MAXPGPATH]; /* directory or tarfile depending on mode */
+ char *sysidentifier;
+ int timeline;
+ pg_compress_algorithm wal_compress_algorithm;
+ int wal_compress_level;
+} logstreamer_param;
+
+static int
+LogStreamerMain(logstreamer_param *param)
+{
+ StreamCtl stream = {0};
+
+ in_log_streamer = true;
+
+ stream.startpos = param->startptr;
+ stream.timeline = param->timeline;
+ stream.sysidentifier = param->sysidentifier;
+ stream.stream_stop = reached_end_position;
+#ifndef WIN32
+ stream.stop_socket = bgpipe[0];
+#else
+ stream.stop_socket = PGINVALID_SOCKET;
+#endif
+ stream.standby_message_timeout = standby_message_timeout;
+ stream.synchronous = false;
+ /* fsync happens at the end of pg_basebackup for all data */
+ stream.do_sync = false;
+ stream.mark_done = true;
+ stream.partial_suffix = NULL;
+ stream.replication_slot = replication_slot;
+ if (format == 'p')
+ stream.walmethod = CreateWalDirectoryMethod(param->xlog,
+ PG_COMPRESSION_NONE, 0,
+ stream.do_sync);
+ else
+ stream.walmethod = CreateWalTarMethod(param->xlog,
+ param->wal_compress_algorithm,
+ param->wal_compress_level,
+ stream.do_sync);
+
+ if (!ReceiveXlogStream(param->bgconn, &stream))
+ {
+ /*
+ * Any errors will already have been reported in the function process,
+ * but we need to tell the parent that we didn't shutdown in a nice
+ * way.
+ */
+#ifdef WIN32
+ /*
+ * In order to signal the main thread of an ungraceful exit we set the
+ * same flag that we use on Unix to signal SIGCHLD.
+ */
+ bgchild_exited = true;
+#endif
+ return 1;
+ }
+
+ if (!stream.walmethod->ops->finish(stream.walmethod))
+ {
+ pg_log_error("could not finish writing WAL files: %m");
+#ifdef WIN32
+ bgchild_exited = true;
+#endif
+ return 1;
+ }
+
+ PQfinish(param->bgconn);
+
+ stream.walmethod->ops->free(stream.walmethod);
+
+ return 0;
+}
+
+/*
+ * Initiate background process for receiving xlog during the backup.
+ * The background stream will use its own database connection so we can
+ * stream the logfile in parallel with the backups.
+ */
+static void
+StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier,
+ pg_compress_algorithm wal_compress_algorithm,
+ int wal_compress_level)
+{
+ logstreamer_param *param;
+ uint32 hi,
+ lo;
+ char statusdir[MAXPGPATH];
+
+ param = pg_malloc0(sizeof(logstreamer_param));
+ param->timeline = timeline;
+ param->sysidentifier = sysidentifier;
+ param->wal_compress_algorithm = wal_compress_algorithm;
+ param->wal_compress_level = wal_compress_level;
+
+ /* Convert the starting position */
+ if (sscanf(startpos, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse write-ahead log location \"%s\"",
+ startpos);
+ param->startptr = ((uint64) hi) << 32 | lo;
+ /* Round off to even segment position */
+ param->startptr -= XLogSegmentOffset(param->startptr, WalSegSz);
+
+#ifndef WIN32
+ /* Create our background pipe */
+ if (pipe(bgpipe) < 0)
+ pg_fatal("could not create pipe for background process: %m");
+#endif
+
+ /* Get a second connection */
+ param->bgconn = GetConnection();
+ if (!param->bgconn)
+ /* Error message already written in GetConnection() */
+ exit(1);
+
+ /* In post-10 cluster, pg_xlog has been renamed to pg_wal */
+ snprintf(param->xlog, sizeof(param->xlog), "%s/%s",
+ basedir,
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
+ "pg_xlog" : "pg_wal");
+
+ /* Temporary replication slots are only supported in 10 and newer */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_TEMP_SLOTS)
+ temp_replication_slot = false;
+
+ /*
+ * Create replication slot if requested
+ */
+ if (temp_replication_slot && !replication_slot)
+ replication_slot = psprintf("pg_basebackup_%u",
+ (unsigned int) PQbackendPID(param->bgconn));
+ if (temp_replication_slot || create_slot)
+ {
+ if (!CreateReplicationSlot(param->bgconn, replication_slot, NULL,
+ temp_replication_slot, true, true, false, false))
+ exit(1);
+
+ if (verbose)
+ {
+ if (temp_replication_slot)
+ pg_log_info("created temporary replication slot \"%s\"",
+ replication_slot);
+ else
+ pg_log_info("created replication slot \"%s\"",
+ replication_slot);
+ }
+ }
+
+ if (format == 'p')
+ {
+ /*
+ * Create pg_wal/archive_status or pg_xlog/archive_status (and thus
+ * pg_wal or pg_xlog) depending on the target server so we can write
+ * to basedir/pg_wal or basedir/pg_xlog as the directory entry in the
+ * tar file may arrive later.
+ */
+ snprintf(statusdir, sizeof(statusdir), "%s/%s/archive_status",
+ basedir,
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
+ "pg_xlog" : "pg_wal");
+
+ if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && errno != EEXIST)
+ pg_fatal("could not create directory \"%s\": %m", statusdir);
+ }
+
+ /*
+ * Start a child process and tell it to start streaming. On Unix, this is
+ * a fork(). On Windows, we create a thread.
+ */
+#ifndef WIN32
+ bgchild = fork();
+ if (bgchild == 0)
+ {
+ /* in child process */
+ exit(LogStreamerMain(param));
+ }
+ else if (bgchild < 0)
+ pg_fatal("could not create background process: %m");
+
+ /*
+ * Else we are in the parent process and all is well.
+ */
+ atexit(kill_bgchild_atexit);
+#else /* WIN32 */
+ bgchild = _beginthreadex(NULL, 0, (void *) LogStreamerMain, param, 0, NULL);
+ if (bgchild == 0)
+ pg_fatal("could not create background thread: %m");
+#endif
+}
+
+/*
+ * Verify that the given directory exists and is empty. If it does not
+ * exist, it is created. If it exists but is not empty, an error will
+ * be given and the process ended.
+ */
+static void
+verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found)
+{
+ switch (pg_check_dir(dirname))
+ {
+ case 0:
+
+ /*
+ * Does not exist, so create
+ */
+ if (pg_mkdir_p(dirname, pg_dir_create_mode) == -1)
+ pg_fatal("could not create directory \"%s\": %m", dirname);
+ if (created)
+ *created = true;
+ return;
+ case 1:
+
+ /*
+ * Exists, empty
+ */
+ if (found)
+ *found = true;
+ return;
+ case 2:
+ case 3:
+ case 4:
+
+ /*
+ * Exists, not empty
+ */
+ pg_fatal("directory \"%s\" exists but is not empty", dirname);
+ case -1:
+
+ /*
+ * Access problem
+ */
+ pg_fatal("could not access directory \"%s\": %m", dirname);
+ }
+}
+
+/*
+ * Callback to update our notion of the current filename.
+ *
+ * No other code should modify progress_filename!
+ */
+static void
+progress_update_filename(const char *filename)
+{
+ /* We needn't maintain this variable if not doing verbose reports. */
+ if (showprogress && verbose)
+ {
+ free(progress_filename);
+ if (filename)
+ progress_filename = pg_strdup(filename);
+ else
+ progress_filename = NULL;
+ }
+}
+
+/*
+ * Print a progress report based on the global variables. If verbose output
+ * is enabled, also print the current file name.
+ *
+ * Progress report is written at maximum once per second, unless the force
+ * parameter is set to true.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+static void
+progress_report(int tablespacenum, bool force, bool finished)
+{
+ int percent;
+ char totaldone_str[32];
+ char totalsize_str[32];
+ pg_time_t now;
+
+ if (!showprogress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !force && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ percent = totalsize_kb ? (int) ((totaldone / 1024) * 100 / totalsize_kb) : 0;
+
+ /*
+ * Avoid overflowing past 100% or the full size. This may make the total
+ * size number change as we approach the end of the backup (the estimate
+ * will always be wrong if WAL is included), but that's better than having
+ * the done column be bigger than the total.
+ */
+ if (percent > 100)
+ percent = 100;
+ if (totaldone / 1024 > totalsize_kb)
+ totalsize_kb = totaldone / 1024;
+
+ snprintf(totaldone_str, sizeof(totaldone_str), UINT64_FORMAT,
+ totaldone / 1024);
+ snprintf(totalsize_str, sizeof(totalsize_str), UINT64_FORMAT, totalsize_kb);
+
+#define VERBOSE_FILENAME_LENGTH 35
+ if (verbose)
+ {
+ if (!progress_filename)
+
+ /*
+ * No filename given, so clear the status line (used for last
+ * call)
+ */
+ fprintf(stderr,
+ ngettext("%*s/%s kB (100%%), %d/%d tablespace %*s",
+ "%*s/%s kB (100%%), %d/%d tablespaces %*s",
+ tablespacecount),
+ (int) strlen(totalsize_str),
+ totaldone_str, totalsize_str,
+ tablespacenum, tablespacecount,
+ VERBOSE_FILENAME_LENGTH + 5, "");
+ else
+ {
+ bool truncate = (strlen(progress_filename) > VERBOSE_FILENAME_LENGTH);
+
+ fprintf(stderr,
+ ngettext("%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)",
+ "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)",
+ tablespacecount),
+ (int) strlen(totalsize_str),
+ totaldone_str, totalsize_str, percent,
+ tablespacenum, tablespacecount,
+ /* Prefix with "..." if we do leading truncation */
+ truncate ? "..." : "",
+ truncate ? VERBOSE_FILENAME_LENGTH - 3 : VERBOSE_FILENAME_LENGTH,
+ truncate ? VERBOSE_FILENAME_LENGTH - 3 : VERBOSE_FILENAME_LENGTH,
+ /* Truncate filename at beginning if it's too long */
+ truncate ? progress_filename + strlen(progress_filename) - VERBOSE_FILENAME_LENGTH + 3 : progress_filename);
+ }
+ }
+ else
+ fprintf(stderr,
+ ngettext("%*s/%s kB (%d%%), %d/%d tablespace",
+ "%*s/%s kB (%d%%), %d/%d tablespaces",
+ tablespacecount),
+ (int) strlen(totalsize_str),
+ totaldone_str, totalsize_str, percent,
+ tablespacenum, tablespacecount);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+static int32
+parse_max_rate(char *src)
+{
+ double result;
+ char *after_num;
+ char *suffix = NULL;
+
+ errno = 0;
+ result = strtod(src, &after_num);
+ if (src == after_num)
+ pg_fatal("transfer rate \"%s\" is not a valid value", src);
+ if (errno != 0)
+ pg_fatal("invalid transfer rate \"%s\": %m", src);
+
+ if (result <= 0)
+ {
+ /*
+ * Reject obviously wrong values here.
+ */
+ pg_fatal("transfer rate must be greater than zero");
+ }
+
+ /*
+ * Evaluate suffix, after skipping over possible whitespace. Lack of
+ * suffix means kilobytes.
+ */
+ while (*after_num != '\0' && isspace((unsigned char) *after_num))
+ after_num++;
+
+ if (*after_num != '\0')
+ {
+ suffix = after_num;
+ if (*after_num == 'k')
+ {
+ /* kilobyte is the expected unit. */
+ after_num++;
+ }
+ else if (*after_num == 'M')
+ {
+ after_num++;
+ result *= 1024.0;
+ }
+ }
+
+ /* The rest can only consist of white space. */
+ while (*after_num != '\0' && isspace((unsigned char) *after_num))
+ after_num++;
+
+ if (*after_num != '\0')
+ pg_fatal("invalid --max-rate unit: \"%s\"", suffix);
+
+ /* Valid integer? */
+ if ((uint64) result != (uint64) ((uint32) result))
+ pg_fatal("transfer rate \"%s\" exceeds integer range", src);
+
+ /*
+ * The range is checked on the server side too, but avoid the server
+ * connection if a nonsensical value was passed.
+ */
+ if (result < MAX_RATE_LOWER || result > MAX_RATE_UPPER)
+ pg_fatal("transfer rate \"%s\" is out of range", src);
+
+ return (int32) result;
+}
+
+/*
+ * Basic parsing of a value specified for -Z/--compress.
+ *
+ * We're not concerned here with understanding exactly what behavior the
+ * user wants, but we do need to know whether the user is requesting client
+ * or server side compression or leaving it unspecified, and we need to
+ * separate the name of the compression algorithm from the detail string.
+ *
+ * For instance, if the user writes --compress client-lz4:6, we want to
+ * separate that into (a) client-side compression, (b) algorithm "lz4",
+ * and (c) detail "6". Note, however, that all the client/server prefix is
+ * optional, and so is the detail. The algorithm name is required, unless
+ * the whole string is an integer, in which case we assume "gzip" as the
+ * algorithm and use the integer as the detail.
+ *
+ * We're not concerned with validation at this stage, so if the user writes
+ * --compress client-turkey:sandwich, the requested algorithm is "turkey"
+ * and the detail string is "sandwich". We'll sort out whether that's legal
+ * at a later stage.
+ */
+static void
+backup_parse_compress_options(char *option, char **algorithm, char **detail,
+ CompressionLocation *locationres)
+{
+ /*
+ * Strip off any "client-" or "server-" prefix, calculating the location.
+ */
+ if (strncmp(option, "server-", 7) == 0)
+ {
+ *locationres = COMPRESS_LOCATION_SERVER;
+ option += 7;
+ }
+ else if (strncmp(option, "client-", 7) == 0)
+ {
+ *locationres = COMPRESS_LOCATION_CLIENT;
+ option += 7;
+ }
+ else
+ *locationres = COMPRESS_LOCATION_UNSPECIFIED;
+
+ /* fallback to the common parsing for the algorithm and detail */
+ parse_compress_options(option, algorithm, detail);
+}
+
+/*
+ * Read a stream of COPY data and invoke the provided callback for each
+ * chunk.
+ */
+static void
+ReceiveCopyData(PGconn *conn, WriteDataCallback callback,
+ void *callback_data)
+{
+ PGresult *res;
+
+ /* Get the COPY data stream. */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COPY_OUT)
+ pg_fatal("could not get COPY data stream: %s",
+ PQerrorMessage(conn));
+ PQclear(res);
+
+ /* Loop over chunks until done. */
+ while (1)
+ {
+ int r;
+ char *copybuf;
+
+ r = PQgetCopyData(conn, &copybuf, 0);
+ if (r == -1)
+ {
+ /* End of chunk. */
+ break;
+ }
+ else if (r == -2)
+ pg_fatal("could not read COPY data: %s",
+ PQerrorMessage(conn));
+
+ if (bgchild_exited)
+ pg_fatal("background process terminated unexpectedly");
+
+ (*callback) (r, copybuf, callback_data);
+
+ PQfreemem(copybuf);
+ }
+}
+
+/*
+ * Figure out what to do with an archive received from the server based on
+ * the options selected by the user. We may just write the results directly
+ * to a file, or we might compress first, or we might extract the tar file
+ * and write each member separately. This function doesn't do any of that
+ * directly, but it works out what kind of bbstreamer we need to create so
+ * that the right stuff happens when, down the road, we actually receive
+ * the data.
+ */
+static bbstreamer *
+CreateBackupStreamer(char *archive_name, char *spclocation,
+ bbstreamer **manifest_inject_streamer_p,
+ bool is_recovery_guc_supported,
+ bool expect_unterminated_tarfile,
+ pg_compress_specification *compress)
+{
+ bbstreamer *streamer = NULL;
+ bbstreamer *manifest_inject_streamer = NULL;
+ bool inject_manifest;
+ bool is_tar,
+ is_tar_gz,
+ is_tar_lz4,
+ is_tar_zstd,
+ is_compressed_tar;
+ bool must_parse_archive;
+ int archive_name_len = strlen(archive_name);
+
+ /*
+ * Normally, we emit the backup manifest as a separate file, but when
+ * we're writing a tarfile to stdout, we don't have that option, so
+ * include it in the one tarfile we've got.
+ */
+ inject_manifest = (format == 't' && strcmp(basedir, "-") == 0 && manifest);
+
+ /* Is this a tar archive? */
+ is_tar = (archive_name_len > 4 &&
+ strcmp(archive_name + archive_name_len - 4, ".tar") == 0);
+
+ /* Is this a .tar.gz archive? */
+ is_tar_gz = (archive_name_len > 7 &&
+ strcmp(archive_name + archive_name_len - 7, ".tar.gz") == 0);
+
+ /* Is this a .tar.lz4 archive? */
+ is_tar_lz4 = (archive_name_len > 8 &&
+ strcmp(archive_name + archive_name_len - 8, ".tar.lz4") == 0);
+
+ /* Is this a .tar.zst archive? */
+ is_tar_zstd = (archive_name_len > 8 &&
+ strcmp(archive_name + archive_name_len - 8, ".tar.zst") == 0);
+
+ /* Is this any kind of compressed tar? */
+ is_compressed_tar = is_tar_gz || is_tar_lz4 || is_tar_zstd;
+
+ /*
+ * Injecting the manifest into a compressed tar file would be possible if
+ * we decompressed it, parsed the tarfile, generated a new tarfile, and
+ * recompressed it, but compressing and decompressing multiple times just
+ * to inject the manifest seems inefficient enough that it's probably not
+ * what the user wants. So, instead, reject the request and tell the user
+ * to specify something more reasonable.
+ */
+ if (inject_manifest && is_compressed_tar)
+ {
+ pg_log_error("cannot inject manifest into a compressed tar file");
+ pg_log_error_hint("Use client-side compression, send the output to a directory rather than standard output, or use %s.",
+ "--no-manifest");
+ exit(1);
+ }
+
+ /*
+ * We have to parse the archive if (1) we're suppose to extract it, or if
+ * (2) we need to inject backup_manifest or recovery configuration into
+ * it. However, we only know how to parse tar archives.
+ */
+ must_parse_archive = (format == 'p' || inject_manifest ||
+ (spclocation == NULL && writerecoveryconf));
+
+ /* At present, we only know how to parse tar archives. */
+ if (must_parse_archive && !is_tar && !is_compressed_tar)
+ {
+ pg_log_error("cannot parse archive \"%s\"", archive_name);
+ pg_log_error_detail("Only tar archives can be parsed.");
+ if (format == 'p')
+ pg_log_error_detail("Plain format requires pg_basebackup to parse the archive.");
+ if (inject_manifest)
+ pg_log_error_detail("Using - as the output directory requires pg_basebackup to parse the archive.");
+ if (writerecoveryconf)
+ pg_log_error_detail("The -R option requires pg_basebackup to parse the archive.");
+ exit(1);
+ }
+
+ if (format == 'p')
+ {
+ const char *directory;
+
+ /*
+ * In plain format, we must extract the archive. The data for the main
+ * tablespace will be written to the base directory, and the data for
+ * other tablespaces will be written to the directory where they're
+ * located on the server, after applying any user-specified tablespace
+ * mappings.
+ *
+ * In the case of an in-place tablespace, spclocation will be a
+ * relative path. We just convert it to an absolute path by prepending
+ * basedir.
+ */
+ if (spclocation == NULL)
+ directory = basedir;
+ else if (!is_absolute_path(spclocation))
+ directory = psprintf("%s/%s", basedir, spclocation);
+ else
+ directory = get_tablespace_mapping(spclocation);
+ streamer = bbstreamer_extractor_new(directory,
+ get_tablespace_mapping,
+ progress_update_filename);
+ }
+ else
+ {
+ FILE *archive_file;
+ char archive_filename[MAXPGPATH];
+
+ /*
+ * In tar format, we just write the archive without extracting it.
+ * Normally, we write it to the archive name provided by the caller,
+ * but when the base directory is "-" that means we need to write to
+ * standard output.
+ */
+ if (strcmp(basedir, "-") == 0)
+ {
+ snprintf(archive_filename, sizeof(archive_filename), "-");
+ archive_file = stdout;
+ }
+ else
+ {
+ snprintf(archive_filename, sizeof(archive_filename),
+ "%s/%s", basedir, archive_name);
+ archive_file = NULL;
+ }
+
+ if (compress->algorithm == PG_COMPRESSION_NONE)
+ streamer = bbstreamer_plain_writer_new(archive_filename,
+ archive_file);
+ else if (compress->algorithm == PG_COMPRESSION_GZIP)
+ {
+ strlcat(archive_filename, ".gz", sizeof(archive_filename));
+ streamer = bbstreamer_gzip_writer_new(archive_filename,
+ archive_file, compress);
+ }
+ else if (compress->algorithm == PG_COMPRESSION_LZ4)
+ {
+ strlcat(archive_filename, ".lz4", sizeof(archive_filename));
+ streamer = bbstreamer_plain_writer_new(archive_filename,
+ archive_file);
+ streamer = bbstreamer_lz4_compressor_new(streamer, compress);
+ }
+ else if (compress->algorithm == PG_COMPRESSION_ZSTD)
+ {
+ strlcat(archive_filename, ".zst", sizeof(archive_filename));
+ streamer = bbstreamer_plain_writer_new(archive_filename,
+ archive_file);
+ streamer = bbstreamer_zstd_compressor_new(streamer, compress);
+ }
+ else
+ {
+ Assert(false); /* not reachable */
+ }
+
+ /*
+ * If we need to parse the archive for whatever reason, then we'll
+ * also need to re-archive, because, if the output format is tar, the
+ * only point of parsing the archive is to be able to inject stuff
+ * into it.
+ */
+ if (must_parse_archive)
+ streamer = bbstreamer_tar_archiver_new(streamer);
+ progress_update_filename(archive_filename);
+ }
+
+ /*
+ * If we're supposed to inject the backup manifest into the results, it
+ * should be done here, so that the file content can be injected directly,
+ * without worrying about the details of the tar format.
+ */
+ if (inject_manifest)
+ manifest_inject_streamer = streamer;
+
+ /*
+ * If this is the main tablespace and we're supposed to write recovery
+ * information, arrange to do that.
+ */
+ if (spclocation == NULL && writerecoveryconf)
+ {
+ Assert(must_parse_archive);
+ streamer = bbstreamer_recovery_injector_new(streamer,
+ is_recovery_guc_supported,
+ recoveryconfcontents);
+ }
+
+ /*
+ * If we're doing anything that involves understanding the contents of the
+ * archive, we'll need to parse it. If not, we can skip parsing it, but
+ * old versions of the server send improperly terminated tarfiles, so if
+ * we're talking to such a server we'll need to add the terminator here.
+ */
+ if (must_parse_archive)
+ streamer = bbstreamer_tar_parser_new(streamer);
+ else if (expect_unterminated_tarfile)
+ streamer = bbstreamer_tar_terminator_new(streamer);
+
+ /*
+ * If the user has requested a server compressed archive along with
+ * archive extraction at client then we need to decompress it.
+ */
+ if (format == 'p')
+ {
+ if (is_tar_gz)
+ streamer = bbstreamer_gzip_decompressor_new(streamer);
+ else if (is_tar_lz4)
+ streamer = bbstreamer_lz4_decompressor_new(streamer);
+ else if (is_tar_zstd)
+ streamer = bbstreamer_zstd_decompressor_new(streamer);
+ }
+
+ /* Return the results. */
+ *manifest_inject_streamer_p = manifest_inject_streamer;
+ return streamer;
+}
+
+/*
+ * Receive all of the archives the server wants to send - and the backup
+ * manifest if present - as a single COPY stream.
+ */
+static void
+ReceiveArchiveStream(PGconn *conn, pg_compress_specification *compress)
+{
+ ArchiveStreamState state;
+
+ /* Set up initial state. */
+ memset(&state, 0, sizeof(state));
+ state.tablespacenum = -1;
+ state.compress = compress;
+
+ /* All the real work happens in ReceiveArchiveStreamChunk. */
+ ReceiveCopyData(conn, ReceiveArchiveStreamChunk, &state);
+
+ /* If we wrote the backup manifest to a file, close the file. */
+ if (state.manifest_file !=NULL)
+ {
+ fclose(state.manifest_file);
+ state.manifest_file = NULL;
+ }
+
+ /*
+ * If we buffered the backup manifest in order to inject it into the
+ * output tarfile, do that now.
+ */
+ if (state.manifest_inject_streamer != NULL &&
+ state.manifest_buffer != NULL)
+ {
+ bbstreamer_inject_file(state.manifest_inject_streamer,
+ "backup_manifest",
+ state.manifest_buffer->data,
+ state.manifest_buffer->len);
+ destroyPQExpBuffer(state.manifest_buffer);
+ state.manifest_buffer = NULL;
+ }
+
+ /* If there's still an archive in progress, end processing. */
+ if (state.streamer != NULL)
+ {
+ bbstreamer_finalize(state.streamer);
+ bbstreamer_free(state.streamer);
+ state.streamer = NULL;
+ }
+}
+
+/*
+ * Receive one chunk of data sent by the server as part of a single COPY
+ * stream that includes all archives and the manifest.
+ */
+static void
+ReceiveArchiveStreamChunk(size_t r, char *copybuf, void *callback_data)
+{
+ ArchiveStreamState *state = callback_data;
+ size_t cursor = 0;
+
+ /* Each CopyData message begins with a type byte. */
+ switch (GetCopyDataByte(r, copybuf, &cursor))
+ {
+ case 'n':
+ {
+ /* New archive. */
+ char *archive_name;
+ char *spclocation;
+
+ /*
+ * We force a progress report at the end of each tablespace. A
+ * new tablespace starts when the previous one ends, except in
+ * the case of the very first one.
+ */
+ if (++state->tablespacenum > 0)
+ progress_report(state->tablespacenum, true, false);
+
+ /* Sanity check. */
+ if (state->manifest_buffer != NULL ||
+ state->manifest_file !=NULL)
+ pg_fatal("archives must precede manifest");
+
+ /* Parse the rest of the CopyData message. */
+ archive_name = GetCopyDataString(r, copybuf, &cursor);
+ spclocation = GetCopyDataString(r, copybuf, &cursor);
+ GetCopyDataEnd(r, copybuf, cursor);
+
+ /*
+ * Basic sanity checks on the archive name: it shouldn't be
+ * empty, it shouldn't start with a dot, and it shouldn't
+ * contain a path separator.
+ */
+ if (archive_name[0] == '\0' || archive_name[0] == '.' ||
+ strchr(archive_name, '/') != NULL ||
+ strchr(archive_name, '\\') != NULL)
+ pg_fatal("invalid archive name: \"%s\"",
+ archive_name);
+
+ /*
+ * An empty spclocation is treated as NULL. We expect this
+ * case to occur for the data directory itself, but not for
+ * any archives that correspond to tablespaces.
+ */
+ if (spclocation[0] == '\0')
+ spclocation = NULL;
+
+ /* End processing of any prior archive. */
+ if (state->streamer != NULL)
+ {
+ bbstreamer_finalize(state->streamer);
+ bbstreamer_free(state->streamer);
+ state->streamer = NULL;
+ }
+
+ /*
+ * Create an appropriate backup streamer, unless a backup
+ * target was specified. In that case, it's up to the server
+ * to put the backup wherever it needs to go.
+ */
+ if (backup_target == NULL)
+ {
+ /*
+ * We know that recovery GUCs are supported, because this
+ * protocol can only be used on v15+.
+ */
+ state->streamer =
+ CreateBackupStreamer(archive_name,
+ spclocation,
+ &state->manifest_inject_streamer,
+ true, false,
+ state->compress);
+ }
+ break;
+ }
+
+ case 'd':
+ {
+ /* Archive or manifest data. */
+ if (state->manifest_buffer != NULL)
+ {
+ /* Manifest data, buffer in memory. */
+ appendPQExpBuffer(state->manifest_buffer, copybuf + 1,
+ r - 1);
+ }
+ else if (state->manifest_file !=NULL)
+ {
+ /* Manifest data, write to disk. */
+ if (fwrite(copybuf + 1, r - 1, 1,
+ state->manifest_file) != 1)
+ {
+ /*
+ * If fwrite() didn't set errno, assume that the
+ * problem is that we're out of disk space.
+ */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m",
+ state->manifest_filename);
+ }
+ }
+ else if (state->streamer != NULL)
+ {
+ /* Archive data. */
+ bbstreamer_content(state->streamer, NULL, copybuf + 1,
+ r - 1, BBSTREAMER_UNKNOWN);
+ }
+ else
+ pg_fatal("unexpected payload data");
+ break;
+ }
+
+ case 'p':
+ {
+ /*
+ * Progress report.
+ *
+ * The remainder of the message is expected to be an 8-byte
+ * count of bytes completed.
+ */
+ totaldone = GetCopyDataUInt64(r, copybuf, &cursor);
+ GetCopyDataEnd(r, copybuf, cursor);
+
+ /*
+ * The server shouldn't send progress report messages too
+ * often, so we force an update each time we receive one.
+ */
+ progress_report(state->tablespacenum, true, false);
+ break;
+ }
+
+ case 'm':
+ {
+ /*
+ * Manifest data will be sent next. This message is not
+ * expected to have any further payload data.
+ */
+ GetCopyDataEnd(r, copybuf, cursor);
+
+ /*
+ * If a backup target was specified, figuring out where to put
+ * the manifest is the server's problem. Otherwise, we need to
+ * deal with it.
+ */
+ if (backup_target == NULL)
+ {
+ /*
+ * If we're supposed inject the manifest into the archive,
+ * we prepare to buffer it in memory; otherwise, we
+ * prepare to write it to a temporary file.
+ */
+ if (state->manifest_inject_streamer != NULL)
+ state->manifest_buffer = createPQExpBuffer();
+ else
+ {
+ snprintf(state->manifest_filename,
+ sizeof(state->manifest_filename),
+ "%s/backup_manifest.tmp", basedir);
+ state->manifest_file =
+ fopen(state->manifest_filename, "wb");
+ if (state->manifest_file == NULL)
+ pg_fatal("could not create file \"%s\": %m",
+ state->manifest_filename);
+ }
+ }
+ break;
+ }
+
+ default:
+ ReportCopyDataParseError(r, copybuf);
+ break;
+ }
+}
+
+/*
+ * Get a single byte from a CopyData message.
+ *
+ * Bail out if none remain.
+ */
+static char
+GetCopyDataByte(size_t r, char *copybuf, size_t *cursor)
+{
+ if (*cursor >= r)
+ ReportCopyDataParseError(r, copybuf);
+
+ return copybuf[(*cursor)++];
+}
+
+/*
+ * Get a NUL-terminated string from a CopyData message.
+ *
+ * Bail out if the terminating NUL cannot be found.
+ */
+static char *
+GetCopyDataString(size_t r, char *copybuf, size_t *cursor)
+{
+ size_t startpos = *cursor;
+ size_t endpos = startpos;
+
+ while (1)
+ {
+ if (endpos >= r)
+ ReportCopyDataParseError(r, copybuf);
+ if (copybuf[endpos] == '\0')
+ break;
+ ++endpos;
+ }
+
+ *cursor = endpos + 1;
+ return &copybuf[startpos];
+}
+
+/*
+ * Get an unsigned 64-bit integer from a CopyData message.
+ *
+ * Bail out if there are not at least 8 bytes remaining.
+ */
+static uint64
+GetCopyDataUInt64(size_t r, char *copybuf, size_t *cursor)
+{
+ uint64 result;
+
+ if (*cursor + sizeof(uint64) > r)
+ ReportCopyDataParseError(r, copybuf);
+ memcpy(&result, &copybuf[*cursor], sizeof(uint64));
+ *cursor += sizeof(uint64);
+ return pg_ntoh64(result);
+}
+
+/*
+ * Bail out if we didn't parse the whole message.
+ */
+static void
+GetCopyDataEnd(size_t r, char *copybuf, size_t cursor)
+{
+ if (r != cursor)
+ ReportCopyDataParseError(r, copybuf);
+}
+
+/*
+ * Report failure to parse a CopyData message from the server. Then exit.
+ *
+ * As a debugging aid, we try to give some hint about what kind of message
+ * provoked the failure. Perhaps this is not detailed enough, but it's not
+ * clear that it's worth expending any more code on what should be a
+ * can't-happen case.
+ */
+static void
+ReportCopyDataParseError(size_t r, char *copybuf)
+{
+ if (r == 0)
+ pg_fatal("empty COPY message");
+ else
+ pg_fatal("malformed COPY message of type %d, length %zu",
+ copybuf[0], r);
+}
+
+/*
+ * Receive raw tar data from the server, and stream it to the appropriate
+ * location. If we're writing a single tarfile to standard output, also
+ * receive the backup manifest and inject it into that tarfile.
+ */
+static void
+ReceiveTarFile(PGconn *conn, char *archive_name, char *spclocation,
+ bool tablespacenum, pg_compress_specification *compress)
+{
+ WriteTarState state;
+ bbstreamer *manifest_inject_streamer;
+ bool is_recovery_guc_supported;
+ bool expect_unterminated_tarfile;
+
+ /* Pass all COPY data through to the backup streamer. */
+ memset(&state, 0, sizeof(state));
+ is_recovery_guc_supported =
+ PQserverVersion(conn) >= MINIMUM_VERSION_FOR_RECOVERY_GUC;
+ expect_unterminated_tarfile =
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_TERMINATED_TARFILE;
+ state.streamer = CreateBackupStreamer(archive_name, spclocation,
+ &manifest_inject_streamer,
+ is_recovery_guc_supported,
+ expect_unterminated_tarfile,
+ compress);
+ state.tablespacenum = tablespacenum;
+ ReceiveCopyData(conn, ReceiveTarCopyChunk, &state);
+ progress_update_filename(NULL);
+
+ /*
+ * The decision as to whether we need to inject the backup manifest into
+ * the output at this stage is made by CreateBackupStreamer; if that is
+ * needed, manifest_inject_streamer will be non-NULL; otherwise, it will
+ * be NULL.
+ */
+ if (manifest_inject_streamer != NULL)
+ {
+ PQExpBufferData buf;
+
+ /* Slurp the entire backup manifest into a buffer. */
+ initPQExpBuffer(&buf);
+ ReceiveBackupManifestInMemory(conn, &buf);
+ if (PQExpBufferDataBroken(buf))
+ pg_fatal("out of memory");
+
+ /* Inject it into the output tarfile. */
+ bbstreamer_inject_file(manifest_inject_streamer, "backup_manifest",
+ buf.data, buf.len);
+
+ /* Free memory. */
+ termPQExpBuffer(&buf);
+ }
+
+ /* Cleanup. */
+ bbstreamer_finalize(state.streamer);
+ bbstreamer_free(state.streamer);
+
+ progress_report(tablespacenum, true, false);
+
+ /*
+ * Do not sync the resulting tar file yet, all files are synced once at
+ * the end.
+ */
+}
+
+/*
+ * Receive one chunk of tar-format data from the server.
+ */
+static void
+ReceiveTarCopyChunk(size_t r, char *copybuf, void *callback_data)
+{
+ WriteTarState *state = callback_data;
+
+ bbstreamer_content(state->streamer, NULL, copybuf, r, BBSTREAMER_UNKNOWN);
+
+ totaldone += r;
+ progress_report(state->tablespacenum, false, false);
+}
+
+
+/*
+ * Retrieve tablespace path, either relocated or original depending on whether
+ * -T was passed or not.
+ */
+static const char *
+get_tablespace_mapping(const char *dir)
+{
+ TablespaceListCell *cell;
+ char canon_dir[MAXPGPATH];
+
+ /* Canonicalize path for comparison consistency */
+ strlcpy(canon_dir, dir, sizeof(canon_dir));
+ canonicalize_path(canon_dir);
+
+ for (cell = tablespace_dirs.head; cell; cell = cell->next)
+ if (strcmp(canon_dir, cell->old_dir) == 0)
+ return cell->new_dir;
+
+ return dir;
+}
+
+/*
+ * Receive the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifest(PGconn *conn)
+{
+ WriteManifestState state;
+
+ snprintf(state.filename, sizeof(state.filename),
+ "%s/backup_manifest.tmp", basedir);
+ state.file = fopen(state.filename, "wb");
+ if (state.file == NULL)
+ pg_fatal("could not create file \"%s\": %m", state.filename);
+
+ ReceiveCopyData(conn, ReceiveBackupManifestChunk, &state);
+
+ fclose(state.file);
+}
+
+/*
+ * Receive one chunk of the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifestChunk(size_t r, char *copybuf, void *callback_data)
+{
+ WriteManifestState *state = callback_data;
+
+ errno = 0;
+ if (fwrite(copybuf, r, 1, state->file) != 1)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to file \"%s\": %m", state->filename);
+ }
+}
+
+/*
+ * Receive the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifestInMemory(PGconn *conn, PQExpBuffer buf)
+{
+ ReceiveCopyData(conn, ReceiveBackupManifestInMemoryChunk, buf);
+}
+
+/*
+ * Receive one chunk of the backup manifest file and write it out to a file.
+ */
+static void
+ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf,
+ void *callback_data)
+{
+ PQExpBuffer buf = callback_data;
+
+ appendPQExpBuffer(buf, copybuf, r);
+}
+
+static void
+BaseBackup(char *compression_algorithm, char *compression_detail,
+ CompressionLocation compressloc, pg_compress_specification *client_compress)
+{
+ PGresult *res;
+ char *sysidentifier;
+ TimeLineID latesttli;
+ TimeLineID starttli;
+ char *basebkp;
+ int i;
+ char xlogstart[64];
+ char xlogend[64] = {0};
+ int minServerMajor,
+ maxServerMajor;
+ int serverVersion,
+ serverMajor;
+ int writing_to_stdout;
+ bool use_new_option_syntax = false;
+ PQExpBufferData buf;
+
+ Assert(conn != NULL);
+ initPQExpBuffer(&buf);
+
+ /*
+ * Check server version. BASE_BACKUP command was introduced in 9.1, so we
+ * can't work with servers older than 9.1.
+ */
+ minServerMajor = 901;
+ maxServerMajor = PG_VERSION_NUM / 100;
+ serverVersion = PQserverVersion(conn);
+ serverMajor = serverVersion / 100;
+ if (serverMajor < minServerMajor || serverMajor > maxServerMajor)
+ {
+ const char *serverver = PQparameterStatus(conn, "server_version");
+
+ pg_fatal("incompatible server version %s",
+ serverver ? serverver : "'unknown'");
+ }
+ if (serverMajor >= 1500)
+ use_new_option_syntax = true;
+
+ /*
+ * If WAL streaming was requested, also check that the server is new
+ * enough for that.
+ */
+ if (includewal == STREAM_WAL && !CheckServerVersionForStreaming(conn))
+ {
+ /*
+ * Error message already written in CheckServerVersionForStreaming(),
+ * but add a hint about using -X none.
+ */
+ pg_log_error_hint("Use -X none or -X fetch to disable log streaming.");
+ exit(1);
+ }
+
+ /*
+ * Build contents of configuration file if requested
+ */
+ if (writerecoveryconf)
+ recoveryconfcontents = GenerateRecoveryConfig(conn, replication_slot);
+
+ /*
+ * Run IDENTIFY_SYSTEM so we can get the timeline
+ */
+ if (!RunIdentifySystem(conn, &sysidentifier, &latesttli, NULL, NULL))
+ exit(1);
+
+ /*
+ * Start the actual backup
+ */
+ AppendStringCommandOption(&buf, use_new_option_syntax, "LABEL", label);
+ if (estimatesize)
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "PROGRESS");
+ if (includewal == FETCH_WAL)
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "WAL");
+ if (fastcheckpoint)
+ {
+ if (use_new_option_syntax)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "CHECKPOINT", "fast");
+ else
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "FAST");
+ }
+ if (includewal != NO_WAL)
+ {
+ if (use_new_option_syntax)
+ AppendIntegerCommandOption(&buf, use_new_option_syntax, "WAIT", 0);
+ else
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "NOWAIT");
+ }
+ if (maxrate > 0)
+ AppendIntegerCommandOption(&buf, use_new_option_syntax, "MAX_RATE",
+ maxrate);
+ if (format == 't')
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "TABLESPACE_MAP");
+ if (!verify_checksums)
+ {
+ if (use_new_option_syntax)
+ AppendIntegerCommandOption(&buf, use_new_option_syntax,
+ "VERIFY_CHECKSUMS", 0);
+ else
+ AppendPlainCommandOption(&buf, use_new_option_syntax,
+ "NOVERIFY_CHECKSUMS");
+ }
+
+ if (manifest)
+ {
+ AppendStringCommandOption(&buf, use_new_option_syntax, "MANIFEST",
+ manifest_force_encode ? "force-encode" : "yes");
+ if (manifest_checksums != NULL)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "MANIFEST_CHECKSUMS", manifest_checksums);
+ }
+
+ if (backup_target != NULL)
+ {
+ char *colon;
+
+ if (serverMajor < 1500)
+ pg_fatal("backup targets are not supported by this server version");
+
+ if (writerecoveryconf)
+ pg_fatal("recovery configuration cannot be written when a backup target is used");
+
+ AppendPlainCommandOption(&buf, use_new_option_syntax, "TABLESPACE_MAP");
+
+ if ((colon = strchr(backup_target, ':')) == NULL)
+ {
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET", backup_target);
+ }
+ else
+ {
+ char *target;
+
+ target = pnstrdup(backup_target, colon - backup_target);
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET", target);
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET_DETAIL", colon + 1);
+ }
+ }
+ else if (serverMajor >= 1500)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "TARGET", "client");
+
+ if (compressloc == COMPRESS_LOCATION_SERVER)
+ {
+ if (!use_new_option_syntax)
+ pg_fatal("server does not support server-side compression");
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "COMPRESSION", compression_algorithm);
+ if (compression_detail != NULL)
+ AppendStringCommandOption(&buf, use_new_option_syntax,
+ "COMPRESSION_DETAIL",
+ compression_detail);
+ }
+
+ if (verbose)
+ pg_log_info("initiating base backup, waiting for checkpoint to complete");
+
+ if (showprogress && !verbose)
+ {
+ fprintf(stderr, _("waiting for checkpoint"));
+ if (isatty(fileno(stderr)))
+ fprintf(stderr, "\r");
+ else
+ fprintf(stderr, "\n");
+ }
+
+ if (use_new_option_syntax && buf.len > 0)
+ basebkp = psprintf("BASE_BACKUP (%s)", buf.data);
+ else
+ basebkp = psprintf("BASE_BACKUP %s", buf.data);
+
+ if (PQsendQuery(conn, basebkp) == 0)
+ pg_fatal("could not send replication command \"%s\": %s",
+ "BASE_BACKUP", PQerrorMessage(conn));
+
+ /*
+ * Get the starting WAL location
+ */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not initiate base backup: %s",
+ PQerrorMessage(conn));
+ if (PQntuples(res) != 1)
+ pg_fatal("server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
+
+ strlcpy(xlogstart, PQgetvalue(res, 0, 0), sizeof(xlogstart));
+
+ if (verbose)
+ pg_log_info("checkpoint completed");
+
+ /*
+ * 9.3 and later sends the TLI of the starting point. With older servers,
+ * assume it's the same as the latest timeline reported by
+ * IDENTIFY_SYSTEM.
+ */
+ if (PQnfields(res) >= 2)
+ starttli = atoi(PQgetvalue(res, 0, 1));
+ else
+ starttli = latesttli;
+ PQclear(res);
+
+ if (verbose && includewal != NO_WAL)
+ pg_log_info("write-ahead log start point: %s on timeline %u",
+ xlogstart, starttli);
+
+ /*
+ * Get the header
+ */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not get backup header: %s",
+ PQerrorMessage(conn));
+ if (PQntuples(res) < 1)
+ pg_fatal("no data returned from server");
+
+ /*
+ * Sum up the total size, for progress reporting
+ */
+ totalsize_kb = totaldone = 0;
+ tablespacecount = PQntuples(res);
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ totalsize_kb += atol(PQgetvalue(res, i, 2));
+
+ /*
+ * Verify tablespace directories are empty. Don't bother with the
+ * first once since it can be relocated, and it will be checked before
+ * we do anything anyway.
+ *
+ * Note that this is skipped for tar format backups and backups that
+ * the server is storing to a target location, since in that case we
+ * won't be storing anything into these directories and thus should
+ * not create them.
+ */
+ if (backup_target == NULL && format == 'p' && !PQgetisnull(res, i, 1))
+ {
+ char *path = PQgetvalue(res, i, 1);
+
+ if (is_absolute_path(path))
+ path = unconstify(char *, get_tablespace_mapping(path));
+ else
+ {
+ /* This is an in-place tablespace, so prepend basedir. */
+ path = psprintf("%s/%s", basedir, path);
+ }
+
+ verify_dir_is_empty_or_create(path, &made_tablespace_dirs, &found_tablespace_dirs);
+ }
+ }
+
+ /*
+ * When writing to stdout, require a single tablespace
+ */
+ writing_to_stdout = format == 't' && basedir != NULL &&
+ strcmp(basedir, "-") == 0;
+ if (writing_to_stdout && PQntuples(res) > 1)
+ pg_fatal("can only write single tablespace to stdout, database has %d",
+ PQntuples(res));
+
+ /*
+ * If we're streaming WAL, start the streaming session before we start
+ * receiving the actual data chunks.
+ */
+ if (includewal == STREAM_WAL)
+ {
+ pg_compress_algorithm wal_compress_algorithm;
+ int wal_compress_level;
+
+ if (verbose)
+ pg_log_info("starting background WAL receiver");
+
+ if (client_compress->algorithm == PG_COMPRESSION_GZIP)
+ {
+ wal_compress_algorithm = PG_COMPRESSION_GZIP;
+ wal_compress_level = client_compress->level;
+ }
+ else
+ {
+ wal_compress_algorithm = PG_COMPRESSION_NONE;
+ wal_compress_level = 0;
+ }
+
+ StartLogStreamer(xlogstart, starttli, sysidentifier,
+ wal_compress_algorithm,
+ wal_compress_level);
+ }
+
+ if (serverMajor >= 1500)
+ {
+ /* Receive a single tar stream with everything. */
+ ReceiveArchiveStream(conn, client_compress);
+ }
+ else
+ {
+ /* Receive a tar file for each tablespace in turn */
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char archive_name[MAXPGPATH];
+ char *spclocation;
+
+ /*
+ * If we write the data out to a tar file, it will be named
+ * base.tar if it's the main data directory or <tablespaceoid>.tar
+ * if it's for another tablespace. CreateBackupStreamer() will
+ * arrange to add an extension to the archive name if
+ * pg_basebackup is performing compression, depending on the
+ * compression type.
+ */
+ if (PQgetisnull(res, i, 0))
+ {
+ strlcpy(archive_name, "base.tar", sizeof(archive_name));
+ spclocation = NULL;
+ }
+ else
+ {
+ snprintf(archive_name, sizeof(archive_name),
+ "%s.tar", PQgetvalue(res, i, 0));
+ spclocation = PQgetvalue(res, i, 1);
+ }
+
+ ReceiveTarFile(conn, archive_name, spclocation, i,
+ client_compress);
+ }
+
+ /*
+ * Now receive backup manifest, if appropriate.
+ *
+ * If we're writing a tarfile to stdout, ReceiveTarFile will have
+ * already processed the backup manifest and included it in the output
+ * tarfile. Such a configuration doesn't allow for writing multiple
+ * files.
+ *
+ * If we're talking to an older server, it won't send a backup
+ * manifest, so don't try to receive one.
+ */
+ if (!writing_to_stdout && manifest)
+ ReceiveBackupManifest(conn);
+ }
+
+ if (showprogress)
+ {
+ progress_update_filename(NULL);
+ progress_report(PQntuples(res), true, true);
+ }
+
+ PQclear(res);
+
+ /*
+ * Get the stop position
+ */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("backup failed: %s",
+ PQerrorMessage(conn));
+ if (PQntuples(res) != 1)
+ pg_fatal("no write-ahead log end position returned from server");
+ strlcpy(xlogend, PQgetvalue(res, 0, 0), sizeof(xlogend));
+ if (verbose && includewal != NO_WAL)
+ pg_log_info("write-ahead log end point: %s", xlogend);
+ PQclear(res);
+
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
+
+ if (sqlstate &&
+ strcmp(sqlstate, ERRCODE_DATA_CORRUPTED) == 0)
+ {
+ pg_log_error("checksum error occurred");
+ checksum_failure = true;
+ }
+ else
+ {
+ pg_log_error("final receive failed: %s",
+ PQerrorMessage(conn));
+ }
+ exit(1);
+ }
+
+ if (bgchild > 0)
+ {
+#ifndef WIN32
+ int status;
+ pid_t r;
+#else
+ DWORD status;
+
+ /*
+ * get a pointer sized version of bgchild to avoid warnings about
+ * casting to a different size on WIN64.
+ */
+ intptr_t bgchild_handle = bgchild;
+ uint32 hi,
+ lo;
+#endif
+
+ if (verbose)
+ pg_log_info("waiting for background process to finish streaming ...");
+
+#ifndef WIN32
+ if (write(bgpipe[1], xlogend, strlen(xlogend)) != strlen(xlogend))
+ pg_fatal("could not send command to background pipe: %m");
+
+ /* Just wait for the background process to exit */
+ r = waitpid(bgchild, &status, 0);
+ if (r == (pid_t) -1)
+ pg_fatal("could not wait for child process: %m");
+ if (r != bgchild)
+ pg_fatal("child %d died, expected %d", (int) r, (int) bgchild);
+ if (status != 0)
+ pg_fatal("%s", wait_result_to_str(status));
+ /* Exited normally, we're happy! */
+#else /* WIN32 */
+
+ /*
+ * On Windows, since we are in the same process, we can just store the
+ * value directly in the variable, and then set the flag that says
+ * it's there.
+ */
+ if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse write-ahead log location \"%s\"",
+ xlogend);
+ xlogendptr = ((uint64) hi) << 32 | lo;
+ InterlockedIncrement(&has_xlogendptr);
+
+ /* First wait for the thread to exit */
+ if (WaitForSingleObjectEx((HANDLE) bgchild_handle, INFINITE, FALSE) !=
+ WAIT_OBJECT_0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("could not wait for child thread: %m");
+ }
+ if (GetExitCodeThread((HANDLE) bgchild_handle, &status) == 0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("could not get child thread exit status: %m");
+ }
+ if (status != 0)
+ pg_fatal("child thread exited with error %u",
+ (unsigned int) status);
+ /* Exited normally, we're happy */
+#endif
+ }
+
+ /* Free the configuration file contents */
+ destroyPQExpBuffer(recoveryconfcontents);
+
+ /*
+ * End of copy data. Final result is already checked inside the loop.
+ */
+ PQclear(res);
+ PQfinish(conn);
+ conn = NULL;
+
+ /*
+ * Make data persistent on disk once backup is completed. For tar format
+ * sync the parent directory and all its contents as each tar file was not
+ * synced after being completed. In plain format, all the data of the
+ * base directory is synced, taking into account all the tablespaces.
+ * Errors are not considered fatal.
+ *
+ * If, however, there's a backup target, we're not writing anything
+ * locally, so in that case we skip this step.
+ */
+ if (do_sync && backup_target == NULL)
+ {
+ if (verbose)
+ pg_log_info("syncing data to disk ...");
+ if (format == 't')
+ {
+ if (strcmp(basedir, "-") != 0)
+ (void) fsync_dir_recurse(basedir);
+ }
+ else
+ {
+ (void) fsync_pgdata(basedir, serverVersion);
+ }
+ }
+
+ /*
+ * After synchronizing data to disk, perform a durable rename of
+ * backup_manifest.tmp to backup_manifest, if we wrote such a file. This
+ * way, a failure or system crash before we reach this point will leave us
+ * without a backup_manifest file, decreasing the chances that a directory
+ * we leave behind will be mistaken for a valid backup.
+ */
+ if (!writing_to_stdout && manifest && backup_target == NULL)
+ {
+ char tmp_filename[MAXPGPATH];
+ char filename[MAXPGPATH];
+
+ if (verbose)
+ pg_log_info("renaming backup_manifest.tmp to backup_manifest");
+
+ snprintf(tmp_filename, MAXPGPATH, "%s/backup_manifest.tmp", basedir);
+ snprintf(filename, MAXPGPATH, "%s/backup_manifest", basedir);
+
+ if (do_sync)
+ {
+ /* durable_rename emits its own log message in case of failure */
+ if (durable_rename(tmp_filename, filename) != 0)
+ exit(1);
+ }
+ else
+ {
+ if (rename(tmp_filename, filename) != 0)
+ pg_fatal("could not rename file \"%s\" to \"%s\": %m",
+ tmp_filename, filename);
+ }
+ }
+
+ if (verbose)
+ pg_log_info("base backup completed");
+}
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"format", required_argument, NULL, 'F'},
+ {"checkpoint", required_argument, NULL, 'c'},
+ {"create-slot", no_argument, NULL, 'C'},
+ {"max-rate", required_argument, NULL, 'r'},
+ {"write-recovery-conf", no_argument, NULL, 'R'},
+ {"slot", required_argument, NULL, 'S'},
+ {"target", required_argument, NULL, 't'},
+ {"tablespace-mapping", required_argument, NULL, 'T'},
+ {"wal-method", required_argument, NULL, 'X'},
+ {"gzip", no_argument, NULL, 'z'},
+ {"compress", required_argument, NULL, 'Z'},
+ {"label", required_argument, NULL, 'l'},
+ {"no-clean", no_argument, NULL, 'n'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"status-interval", required_argument, NULL, 's'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"progress", no_argument, NULL, 'P'},
+ {"waldir", required_argument, NULL, 1},
+ {"no-slot", no_argument, NULL, 2},
+ {"no-verify-checksums", no_argument, NULL, 3},
+ {"no-estimate-size", no_argument, NULL, 4},
+ {"no-manifest", no_argument, NULL, 5},
+ {"manifest-force-encode", no_argument, NULL, 6},
+ {"manifest-checksums", required_argument, NULL, 7},
+ {NULL, 0, NULL, 0}
+ };
+ int c;
+
+ int option_index;
+ char *compression_algorithm = "none";
+ char *compression_detail = NULL;
+ CompressionLocation compressloc = COMPRESS_LOCATION_UNSPECIFIED;
+ pg_compress_specification client_compress;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "-V") == 0
+ || strcmp(argv[1], "--version") == 0)
+ {
+ puts("pg_basebackup (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ atexit(cleanup_directories_atexit);
+
+ while ((c = getopt_long(argc, argv, "c:Cd:D:F:h:l:nNp:Pr:Rs:S:t:T:U:vwWX:zZ:",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ if (pg_strcasecmp(optarg, "fast") == 0)
+ fastcheckpoint = true;
+ else if (pg_strcasecmp(optarg, "spread") == 0)
+ fastcheckpoint = false;
+ else
+ pg_fatal("invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"",
+ optarg);
+ break;
+ case 'C':
+ create_slot = true;
+ break;
+ case 'd':
+ connection_string = pg_strdup(optarg);
+ break;
+ case 'D':
+ basedir = pg_strdup(optarg);
+ break;
+ case 'F':
+ if (strcmp(optarg, "p") == 0 || strcmp(optarg, "plain") == 0)
+ format = 'p';
+ else if (strcmp(optarg, "t") == 0 || strcmp(optarg, "tar") == 0)
+ format = 't';
+ else
+ pg_fatal("invalid output format \"%s\", must be \"plain\" or \"tar\"",
+ optarg);
+ break;
+ case 'h':
+ dbhost = pg_strdup(optarg);
+ break;
+ case 'l':
+ label = pg_strdup(optarg);
+ break;
+ case 'n':
+ noclean = true;
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'p':
+ dbport = pg_strdup(optarg);
+ break;
+ case 'P':
+ showprogress = true;
+ break;
+ case 'r':
+ maxrate = parse_max_rate(optarg);
+ break;
+ case 'R':
+ writerecoveryconf = true;
+ break;
+ case 's':
+ if (!option_parse_int(optarg, "-s/--status-interval", 0,
+ INT_MAX / 1000,
+ &standby_message_timeout))
+ exit(1);
+ standby_message_timeout *= 1000;
+ break;
+ case 'S':
+
+ /*
+ * When specifying replication slot name, use a permanent
+ * slot.
+ */
+ replication_slot = pg_strdup(optarg);
+ temp_replication_slot = false;
+ break;
+ case 't':
+ backup_target = pg_strdup(optarg);
+ break;
+ case 'T':
+ tablespace_list_append(optarg);
+ break;
+ case 'U':
+ dbuser = pg_strdup(optarg);
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'w':
+ dbgetpassword = -1;
+ break;
+ case 'W':
+ dbgetpassword = 1;
+ break;
+ case 'X':
+ if (strcmp(optarg, "n") == 0 ||
+ strcmp(optarg, "none") == 0)
+ {
+ includewal = NO_WAL;
+ }
+ else if (strcmp(optarg, "f") == 0 ||
+ strcmp(optarg, "fetch") == 0)
+ {
+ includewal = FETCH_WAL;
+ }
+ else if (strcmp(optarg, "s") == 0 ||
+ strcmp(optarg, "stream") == 0)
+ {
+ includewal = STREAM_WAL;
+ }
+ else
+ pg_fatal("invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"",
+ optarg);
+ break;
+ case 'z':
+ compression_algorithm = "gzip";
+ compression_detail = NULL;
+ compressloc = COMPRESS_LOCATION_UNSPECIFIED;
+ break;
+ case 'Z':
+ backup_parse_compress_options(optarg, &compression_algorithm,
+ &compression_detail, &compressloc);
+ break;
+ case 1:
+ xlog_dir = pg_strdup(optarg);
+ break;
+ case 2:
+ no_slot = true;
+ break;
+ case 3:
+ verify_checksums = false;
+ break;
+ case 4:
+ estimatesize = false;
+ break;
+ case 5:
+ manifest = false;
+ break;
+ case 6:
+ manifest_force_encode = true;
+ break;
+ case 7:
+ manifest_checksums = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Any non-option arguments?
+ */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Setting the backup target to 'client' is equivalent to leaving out the
+ * option. This logic allows us to assume elsewhere that the backup is
+ * being stored locally if and only if backup_target == NULL.
+ */
+ if (backup_target != NULL && strcmp(backup_target, "client") == 0)
+ {
+ pg_free(backup_target);
+ backup_target = NULL;
+ }
+
+ /*
+ * Can't use --format with --target. Without --target, default format is
+ * tar.
+ */
+ if (backup_target != NULL && format != '\0')
+ {
+ pg_log_error("cannot specify both format and backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (format == '\0')
+ format = 'p';
+
+ /*
+ * Either directory or backup target should be specified, but not both
+ */
+ if (basedir == NULL && backup_target == NULL)
+ {
+ pg_log_error("must specify output directory or backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (basedir != NULL && backup_target != NULL)
+ {
+ pg_log_error("cannot specify both output directory and backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * If the user has not specified where to perform backup compression,
+ * default to the client, unless the user specified --target, in which
+ * case the server is the only choice.
+ */
+ if (compressloc == COMPRESS_LOCATION_UNSPECIFIED)
+ {
+ if (backup_target == NULL)
+ compressloc = COMPRESS_LOCATION_CLIENT;
+ else
+ compressloc = COMPRESS_LOCATION_SERVER;
+ }
+
+ /*
+ * If any compression that we're doing is happening on the client side, we
+ * must try to parse the compression algorithm and detail, but if it's all
+ * on the server side, then we're just going to pass through whatever was
+ * requested and let the server decide what to do.
+ */
+ if (compressloc == COMPRESS_LOCATION_CLIENT)
+ {
+ pg_compress_algorithm alg;
+ char *error_detail;
+
+ if (!parse_compress_algorithm(compression_algorithm, &alg))
+ pg_fatal("unrecognized compression algorithm: \"%s\"",
+ compression_algorithm);
+
+ parse_compress_specification(alg, compression_detail, &client_compress);
+ error_detail = validate_compress_specification(&client_compress);
+ if (error_detail != NULL)
+ pg_fatal("invalid compression specification: %s",
+ error_detail);
+ }
+ else
+ {
+ Assert(compressloc == COMPRESS_LOCATION_SERVER);
+ client_compress.algorithm = PG_COMPRESSION_NONE;
+ client_compress.options = 0;
+ }
+
+ /*
+ * Can't perform client-side compression if the backup is not being sent
+ * to the client.
+ */
+ if (backup_target != NULL && compressloc == COMPRESS_LOCATION_CLIENT)
+ {
+ pg_log_error("client-side compression is not possible when a backup target is specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Client-side compression doesn't make sense unless tar format is in use.
+ */
+ if (format == 'p' && compressloc == COMPRESS_LOCATION_CLIENT &&
+ client_compress.algorithm != PG_COMPRESSION_NONE)
+ {
+ pg_log_error("only tar mode backups can be compressed");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Sanity checks for WAL method.
+ */
+ if (backup_target != NULL && includewal == STREAM_WAL)
+ {
+ pg_log_error("WAL cannot be streamed when a backup target is specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (format == 't' && includewal == STREAM_WAL && strcmp(basedir, "-") == 0)
+ {
+ pg_log_error("cannot stream write-ahead logs in tar mode to stdout");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (replication_slot && includewal != STREAM_WAL)
+ {
+ pg_log_error("replication slots can only be used with WAL streaming");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Sanity checks for replication slot options.
+ */
+ if (no_slot)
+ {
+ if (replication_slot)
+ {
+ pg_log_error("--no-slot cannot be used with slot name");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ temp_replication_slot = false;
+ }
+
+ if (create_slot)
+ {
+ if (!replication_slot)
+ {
+ pg_log_error("%s needs a slot to be specified using --slot",
+ "--create-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (no_slot)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--create-slot", "--no-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Sanity checks on WAL directory.
+ */
+ if (xlog_dir)
+ {
+ if (backup_target != NULL)
+ {
+ pg_log_error("WAL directory location cannot be specified along with a backup target");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (format != 'p')
+ {
+ pg_log_error("WAL directory location can only be specified in plain mode");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* clean up xlog directory name, check it's absolute */
+ canonicalize_path(xlog_dir);
+ if (!is_absolute_path(xlog_dir))
+ {
+ pg_log_error("WAL directory location must be an absolute path");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Sanity checks for progress reporting options.
+ */
+ if (showprogress && !estimatesize)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--progress", "--no-estimate-size");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Sanity checks for backup manifest options.
+ */
+ if (!manifest && manifest_checksums != NULL)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--no-manifest", "--manifest-checksums");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (!manifest && manifest_force_encode)
+ {
+ pg_log_error("%s and %s are incompatible options",
+ "--no-manifest", "--manifest-force-encode");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* connection in replication mode to server */
+ conn = GetConnection();
+ if (!conn)
+ {
+ /* Error message already written in GetConnection() */
+ exit(1);
+ }
+ atexit(disconnect_atexit);
+
+#ifndef WIN32
+
+ /*
+ * Trap SIGCHLD to be able to handle the WAL stream process exiting. There
+ * is no SIGCHLD on Windows, there we rely on the background thread
+ * setting the signal variable on unexpected but graceful exit. If the WAL
+ * stream thread crashes on Windows it will bring down the entire process
+ * as it's a thread, so there is nothing to catch should that happen. A
+ * crash on UNIX will be caught by the signal handler.
+ */
+ pqsignal(SIGCHLD, sigchld_handler);
+#endif
+
+ /*
+ * Set umask so that directories/files are created with the same
+ * permissions as directories/files in the source data directory.
+ *
+ * pg_mode_mask is set to owner-only by default and then updated in
+ * GetConnection() where we get the mode from the server-side with
+ * RetrieveDataDirCreatePerm() and then call SetDataDirectoryCreatePerm().
+ */
+ umask(pg_mode_mask);
+
+ /* Backup manifests are supported in 13 and newer versions */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_MANIFESTS)
+ manifest = false;
+
+ /*
+ * If an output directory was specified, verify that it exists, or create
+ * it. Note that for a tar backup, an output directory of "-" means we are
+ * writing to stdout, so do nothing in that case.
+ */
+ if (basedir != NULL && (format == 'p' || strcmp(basedir, "-") != 0))
+ verify_dir_is_empty_or_create(basedir, &made_new_pgdata, &found_existing_pgdata);
+
+ /* determine remote server's xlog segment size */
+ if (!RetrieveWalSegSize(conn))
+ exit(1);
+
+ /* Create pg_wal symlink, if required */
+ if (xlog_dir)
+ {
+ char *linkloc;
+
+ verify_dir_is_empty_or_create(xlog_dir, &made_new_xlogdir, &found_existing_xlogdir);
+
+ /*
+ * Form name of the place where the symlink must go. pg_xlog has been
+ * renamed to pg_wal in post-10 clusters.
+ */
+ linkloc = psprintf("%s/%s", basedir,
+ PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
+ "pg_xlog" : "pg_wal");
+
+ if (symlink(xlog_dir, linkloc) != 0)
+ pg_fatal("could not create symbolic link \"%s\": %m", linkloc);
+ free(linkloc);
+ }
+
+ BaseBackup(compression_algorithm, compression_detail, compressloc,
+ &client_compress);
+
+ success = true;
+ return 0;
+}
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
new file mode 100644
index 0000000..d0a4079
--- /dev/null
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -0,0 +1,927 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_receivewal.c - receive streaming WAL data and write it
+ * to a local file.
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/pg_receivewal.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+#endif
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "access/xlog_internal.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "libpq-fe.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+/* Time to sleep between reconnection attempts */
+#define RECONNECT_SLEEP_TIME 5
+
+/* Global options */
+static char *basedir = NULL;
+static int verbose = 0;
+static int compresslevel = 0;
+static bool noloop = false;
+static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
+static volatile sig_atomic_t time_to_stop = false;
+static bool do_create_slot = false;
+static bool slot_exists_ok = false;
+static bool do_drop_slot = false;
+static bool do_sync = true;
+static bool synchronous = false;
+static char *replication_slot = NULL;
+static pg_compress_algorithm compression_algorithm = PG_COMPRESSION_NONE;
+static XLogRecPtr endpos = InvalidXLogRecPtr;
+
+
+static void usage(void);
+static DIR *get_destination_dir(char *dest_folder);
+static void close_destination_dir(DIR *dest_dir, char *dest_folder);
+static XLogRecPtr FindStreamingStart(uint32 *tli);
+static void StreamLog(void);
+static bool stop_streaming(XLogRecPtr xlogpos, uint32 timeline,
+ bool segment_finished);
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
+
+static void
+usage(void)
+{
+ printf(_("%s receives PostgreSQL streaming write-ahead logs.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -D, --directory=DIR receive write-ahead log files into this directory\n"));
+ printf(_(" -E, --endpos=LSN exit after receiving the specified LSN\n"));
+ printf(_(" --if-not-exists do not error if slot already exists when creating a slot\n"));
+ printf(_(" -n, --no-loop do not loop on connection lost\n"));
+ printf(_(" --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -s, --status-interval=SECS\n"
+ " time between status packets sent to server (default: %d)\n"), (standby_message_timeout / 1000));
+ printf(_(" -S, --slot=SLOTNAME replication slot to use\n"));
+ printf(_(" --synchronous flush write-ahead log immediately after writing\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -Z, --compress=METHOD[:DETAIL]\n"
+ " compress as specified\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=CONNSTR connection string\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_("\nOptional actions:\n"));
+ printf(_(" --create-slot create a new replication slot (for the slot's name see --slot)\n"));
+ printf(_(" --drop-slot drop the replication slot (for the slot's name see --slot)\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * Check if the filename looks like a WAL file, letting caller know if this
+ * WAL segment is partial and/or compressed.
+ */
+static bool
+is_xlogfilename(const char *filename, bool *ispartial,
+ pg_compress_algorithm *wal_compression_algorithm)
+{
+ size_t fname_len = strlen(filename);
+ size_t xlog_pattern_len = strspn(filename, "0123456789ABCDEF");
+
+ /* File does not look like a WAL file */
+ if (xlog_pattern_len != XLOG_FNAME_LEN)
+ return false;
+
+ /* File looks like a completed uncompressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN)
+ {
+ *ispartial = false;
+ *wal_compression_algorithm = PG_COMPRESSION_NONE;
+ return true;
+ }
+
+ /* File looks like a completed gzip-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".gz") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".gz") == 0)
+ {
+ *ispartial = false;
+ *wal_compression_algorithm = PG_COMPRESSION_GZIP;
+ return true;
+ }
+
+ /* File looks like a completed LZ4-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".lz4") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".lz4") == 0)
+ {
+ *ispartial = false;
+ *wal_compression_algorithm = PG_COMPRESSION_LZ4;
+ return true;
+ }
+
+ /* File looks like a partial uncompressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".partial") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".partial") == 0)
+ {
+ *ispartial = true;
+ *wal_compression_algorithm = PG_COMPRESSION_NONE;
+ return true;
+ }
+
+ /* File looks like a partial gzip-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".gz.partial") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".gz.partial") == 0)
+ {
+ *ispartial = true;
+ *wal_compression_algorithm = PG_COMPRESSION_GZIP;
+ return true;
+ }
+
+ /* File looks like a partial LZ4-compressed WAL file */
+ if (fname_len == XLOG_FNAME_LEN + strlen(".lz4.partial") &&
+ strcmp(filename + XLOG_FNAME_LEN, ".lz4.partial") == 0)
+ {
+ *ispartial = true;
+ *wal_compression_algorithm = PG_COMPRESSION_LZ4;
+ return true;
+ }
+
+ /* File does not look like something we know */
+ return false;
+}
+
+static bool
+stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
+{
+ static uint32 prevtimeline = 0;
+ static XLogRecPtr prevpos = InvalidXLogRecPtr;
+
+ /* we assume that we get called once at the end of each segment */
+ if (verbose && segment_finished)
+ pg_log_info("finished segment at %X/%X (timeline %u)",
+ LSN_FORMAT_ARGS(xlogpos),
+ timeline);
+
+ if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos)
+ {
+ if (verbose)
+ pg_log_info("stopped log streaming at %X/%X (timeline %u)",
+ LSN_FORMAT_ARGS(xlogpos),
+ timeline);
+ time_to_stop = true;
+ return true;
+ }
+
+ /*
+ * Note that we report the previous, not current, position here. After a
+ * timeline switch, xlogpos points to the beginning of the segment because
+ * that's where we always begin streaming. Reporting the end of previous
+ * timeline isn't totally accurate, because the next timeline can begin
+ * slightly before the end of the WAL that we received on the previous
+ * timeline, but it's close enough for reporting purposes.
+ */
+ if (verbose && prevtimeline != 0 && prevtimeline != timeline)
+ pg_log_info("switched to timeline %u at %X/%X",
+ timeline,
+ LSN_FORMAT_ARGS(prevpos));
+
+ prevtimeline = timeline;
+ prevpos = xlogpos;
+
+ if (time_to_stop)
+ {
+ if (verbose)
+ pg_log_info("received interrupt signal, exiting");
+ return true;
+ }
+ return false;
+}
+
+
+/*
+ * Get destination directory.
+ */
+static DIR *
+get_destination_dir(char *dest_folder)
+{
+ DIR *dir;
+
+ Assert(dest_folder != NULL);
+ dir = opendir(dest_folder);
+ if (dir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", dest_folder);
+
+ return dir;
+}
+
+
+/*
+ * Close existing directory.
+ */
+static void
+close_destination_dir(DIR *dest_dir, char *dest_folder)
+{
+ Assert(dest_dir != NULL && dest_folder != NULL);
+ if (closedir(dest_dir))
+ pg_fatal("could not close directory \"%s\": %m", dest_folder);
+}
+
+
+/*
+ * Determine starting location for streaming, based on any existing xlog
+ * segments in the directory. We start at the end of the last one that is
+ * complete (size matches wal segment size), on the timeline with highest ID.
+ *
+ * If there are no WAL files in the directory, returns InvalidXLogRecPtr.
+ */
+static XLogRecPtr
+FindStreamingStart(uint32 *tli)
+{
+ DIR *dir;
+ struct dirent *dirent;
+ XLogSegNo high_segno = 0;
+ uint32 high_tli = 0;
+ bool high_ispartial = false;
+
+ dir = get_destination_dir(basedir);
+
+ while (errno = 0, (dirent = readdir(dir)) != NULL)
+ {
+ uint32 tli;
+ XLogSegNo segno;
+ pg_compress_algorithm wal_compression_algorithm;
+ bool ispartial;
+
+ if (!is_xlogfilename(dirent->d_name,
+ &ispartial, &wal_compression_algorithm))
+ continue;
+
+ /*
+ * Looks like an xlog file. Parse its position.
+ */
+ XLogFromFileName(dirent->d_name, &tli, &segno, WalSegSz);
+
+ /*
+ * Check that the segment has the right size, if it's supposed to be
+ * completed. For non-compressed segments just check the on-disk size
+ * and see if it matches a completed segment. For gzip-compressed
+ * segments, look at the last 4 bytes of the compressed file, which is
+ * where the uncompressed size is located for files with a size lower
+ * than 4GB, and then compare it to the size of a completed segment.
+ * The 4 last bytes correspond to the ISIZE member according to
+ * http://www.zlib.org/rfc-gzip.html.
+ *
+ * For LZ4-compressed segments, uncompress the file in a throw-away
+ * buffer keeping track of the uncompressed size, then compare it to
+ * the size of a completed segment. Per its protocol, LZ4 does not
+ * store the uncompressed size of an object by default. contentSize
+ * is one possible way to do that, but we need to rely on a method
+ * where WAL segments could have been compressed by a different source
+ * than pg_receivewal, like an archive_command with lz4.
+ */
+ if (!ispartial && wal_compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ struct stat statbuf;
+ char fullpath[MAXPGPATH * 2];
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
+ if (stat(fullpath, &statbuf) != 0)
+ pg_fatal("could not stat file \"%s\": %m", fullpath);
+
+ if (statbuf.st_size != WalSegSz)
+ {
+ pg_log_warning("segment file \"%s\" has incorrect size %lld, skipping",
+ dirent->d_name, (long long int) statbuf.st_size);
+ continue;
+ }
+ }
+ else if (!ispartial && wal_compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ int fd;
+ char buf[4];
+ int bytes_out;
+ char fullpath[MAXPGPATH * 2];
+ int r;
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
+
+ fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ pg_fatal("could not open compressed file \"%s\": %m",
+ fullpath);
+ if (lseek(fd, (off_t) (-4), SEEK_END) < 0)
+ pg_fatal("could not seek in compressed file \"%s\": %m",
+ fullpath);
+ r = read(fd, (char *) buf, sizeof(buf));
+ if (r != sizeof(buf))
+ {
+ if (r < 0)
+ pg_fatal("could not read compressed file \"%s\": %m",
+ fullpath);
+ else
+ pg_fatal("could not read compressed file \"%s\": read %d of %zu",
+ fullpath, r, sizeof(buf));
+ }
+
+ close(fd);
+ bytes_out = (buf[3] << 24) | (buf[2] << 16) |
+ (buf[1] << 8) | buf[0];
+
+ if (bytes_out != WalSegSz)
+ {
+ pg_log_warning("compressed segment file \"%s\" has incorrect uncompressed size %d, skipping",
+ dirent->d_name, bytes_out);
+ continue;
+ }
+ }
+ else if (!ispartial && wal_compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+#ifdef USE_LZ4
+#define LZ4_CHUNK_SZ 64 * 1024 /* 64kB as maximum chunk size read */
+ int fd;
+ ssize_t r;
+ size_t uncompressed_size = 0;
+ char fullpath[MAXPGPATH * 2];
+ char *outbuf;
+ char *readbuf;
+ LZ4F_decompressionContext_t ctx = NULL;
+ LZ4F_decompressOptions_t dec_opt;
+ LZ4F_errorCode_t status;
+
+ memset(&dec_opt, 0, sizeof(dec_opt));
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
+
+ fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\": %m", fullpath);
+
+ status = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
+ if (LZ4F_isError(status))
+ pg_fatal("could not create LZ4 decompression context: %s",
+ LZ4F_getErrorName(status));
+
+ outbuf = pg_malloc0(LZ4_CHUNK_SZ);
+ readbuf = pg_malloc0(LZ4_CHUNK_SZ);
+ do
+ {
+ char *readp;
+ char *readend;
+
+ r = read(fd, readbuf, LZ4_CHUNK_SZ);
+ if (r < 0)
+ pg_fatal("could not read file \"%s\": %m", fullpath);
+
+ /* Done reading the file */
+ if (r == 0)
+ break;
+
+ /* Process one chunk */
+ readp = readbuf;
+ readend = readbuf + r;
+ while (readp < readend)
+ {
+ size_t out_size = LZ4_CHUNK_SZ;
+ size_t read_size = readend - readp;
+
+ memset(outbuf, 0, LZ4_CHUNK_SZ);
+ status = LZ4F_decompress(ctx, outbuf, &out_size,
+ readp, &read_size, &dec_opt);
+ if (LZ4F_isError(status))
+ pg_fatal("could not decompress file \"%s\": %s",
+ fullpath,
+ LZ4F_getErrorName(status));
+
+ readp += read_size;
+ uncompressed_size += out_size;
+ }
+
+ /*
+ * No need to continue reading the file when the
+ * uncompressed_size exceeds WalSegSz, even if there are still
+ * data left to read. However, if uncompressed_size is equal
+ * to WalSegSz, it should verify that there is no more data to
+ * read.
+ */
+ } while (uncompressed_size <= WalSegSz && r > 0);
+
+ close(fd);
+ pg_free(outbuf);
+ pg_free(readbuf);
+
+ status = LZ4F_freeDecompressionContext(ctx);
+ if (LZ4F_isError(status))
+ pg_fatal("could not free LZ4 decompression context: %s",
+ LZ4F_getErrorName(status));
+
+ if (uncompressed_size != WalSegSz)
+ {
+ pg_log_warning("compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping",
+ dirent->d_name, uncompressed_size);
+ continue;
+ }
+#else
+ pg_log_error("cannot check file \"%s\": compression with %s not supported by this build",
+ dirent->d_name, "LZ4");
+ exit(1);
+#endif
+ }
+
+ /* Looks like a valid segment. Remember that we saw it. */
+ if ((segno > high_segno) ||
+ (segno == high_segno && tli > high_tli) ||
+ (segno == high_segno && tli == high_tli && high_ispartial && !ispartial))
+ {
+ high_segno = segno;
+ high_tli = tli;
+ high_ispartial = ispartial;
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", basedir);
+
+ close_destination_dir(dir, basedir);
+
+ if (high_segno > 0)
+ {
+ XLogRecPtr high_ptr;
+
+ /*
+ * Move the starting pointer to the start of the next segment, if the
+ * highest one we saw was completed. Otherwise start streaming from
+ * the beginning of the .partial segment.
+ */
+ if (!high_ispartial)
+ high_segno++;
+
+ XLogSegNoOffsetToRecPtr(high_segno, 0, WalSegSz, high_ptr);
+
+ *tli = high_tli;
+ return high_ptr;
+ }
+ else
+ return InvalidXLogRecPtr;
+}
+
+/*
+ * Start the log streaming
+ */
+static void
+StreamLog(void)
+{
+ XLogRecPtr serverpos;
+ TimeLineID servertli;
+ StreamCtl stream = {0};
+ char *sysidentifier;
+
+ /*
+ * Connect in replication mode to the server
+ */
+ if (conn == NULL)
+ conn = GetConnection();
+ if (!conn)
+ /* Error message already written in GetConnection() */
+ return;
+
+ if (!CheckServerVersionForStreaming(conn))
+ {
+ /*
+ * Error message already written in CheckServerVersionForStreaming().
+ * There's no hope of recovering from a version mismatch, so don't
+ * retry.
+ */
+ exit(1);
+ }
+
+ /*
+ * Identify server, obtaining start LSN position and current timeline ID
+ * at the same time, necessary if not valid data can be found in the
+ * existing output directory.
+ */
+ if (!RunIdentifySystem(conn, &sysidentifier, &servertli, &serverpos, NULL))
+ exit(1);
+
+ /*
+ * Figure out where to start streaming. First scan the local directory.
+ */
+ stream.startpos = FindStreamingStart(&stream.timeline);
+ if (stream.startpos == InvalidXLogRecPtr)
+ {
+ /*
+ * Try to get the starting point from the slot if any. This is
+ * supported in PostgreSQL 15 and newer.
+ */
+ if (replication_slot != NULL &&
+ PQserverVersion(conn) >= 150000)
+ {
+ if (!GetSlotInformation(conn, replication_slot, &stream.startpos,
+ &stream.timeline))
+ {
+ /* Error is logged by GetSlotInformation() */
+ return;
+ }
+ }
+
+ /*
+ * If it the starting point is still not known, use the current WAL
+ * flush value as last resort.
+ */
+ if (stream.startpos == InvalidXLogRecPtr)
+ {
+ stream.startpos = serverpos;
+ stream.timeline = servertli;
+ }
+ }
+
+ Assert(stream.startpos != InvalidXLogRecPtr &&
+ stream.timeline != 0);
+
+ /*
+ * Always start streaming at the beginning of a segment
+ */
+ stream.startpos -= XLogSegmentOffset(stream.startpos, WalSegSz);
+
+ /*
+ * Start the replication
+ */
+ if (verbose)
+ pg_log_info("starting log streaming at %X/%X (timeline %u)",
+ LSN_FORMAT_ARGS(stream.startpos),
+ stream.timeline);
+
+ stream.stream_stop = stop_streaming;
+ stream.stop_socket = PGINVALID_SOCKET;
+ stream.standby_message_timeout = standby_message_timeout;
+ stream.synchronous = synchronous;
+ stream.do_sync = do_sync;
+ stream.mark_done = false;
+ stream.walmethod = CreateWalDirectoryMethod(basedir,
+ compression_algorithm,
+ compresslevel,
+ stream.do_sync);
+ stream.partial_suffix = ".partial";
+ stream.replication_slot = replication_slot;
+ stream.sysidentifier = sysidentifier;
+
+ ReceiveXlogStream(conn, &stream);
+
+ if (!stream.walmethod->ops->finish(stream.walmethod))
+ {
+ pg_log_info("could not finish writing WAL files: %m");
+ return;
+ }
+
+ PQfinish(conn);
+ conn = NULL;
+
+ stream.walmethod->ops->free(stream.walmethod);
+}
+
+/*
+ * When SIGINT/SIGTERM are caught, just tell the system to exit at the next
+ * possible moment.
+ */
+#ifndef WIN32
+
+static void
+sigexit_handler(SIGNAL_ARGS)
+{
+ time_to_stop = true;
+}
+#endif
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"directory", required_argument, NULL, 'D'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"endpos", required_argument, NULL, 'E'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-loop", no_argument, NULL, 'n'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"status-interval", required_argument, NULL, 's'},
+ {"slot", required_argument, NULL, 'S'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"compress", required_argument, NULL, 'Z'},
+/* action */
+ {"create-slot", no_argument, NULL, 1},
+ {"drop-slot", no_argument, NULL, 2},
+ {"if-not-exists", no_argument, NULL, 3},
+ {"synchronous", no_argument, NULL, 4},
+ {"no-sync", no_argument, NULL, 5},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ int option_index;
+ char *db_name;
+ uint32 hi,
+ lo;
+ pg_compress_specification compression_spec;
+ char *compression_detail = NULL;
+ char *compression_algorithm_str = "none";
+ char *error_detail = NULL;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "-V") == 0 ||
+ strcmp(argv[1], "--version") == 0)
+ {
+ puts("pg_receivewal (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "d:D:E:h:np:s:S:U:vwWZ:",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'd':
+ connection_string = pg_strdup(optarg);
+ break;
+ case 'D':
+ basedir = pg_strdup(optarg);
+ break;
+ case 'E':
+ if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse end position \"%s\"", optarg);
+ endpos = ((uint64) hi) << 32 | lo;
+ break;
+ case 'h':
+ dbhost = pg_strdup(optarg);
+ break;
+ case 'n':
+ noloop = true;
+ break;
+ case 'p':
+ dbport = pg_strdup(optarg);
+ break;
+ case 's':
+ if (!option_parse_int(optarg, "-s/--status-interval", 0,
+ INT_MAX / 1000,
+ &standby_message_timeout))
+ exit(1);
+ standby_message_timeout *= 1000;
+ break;
+ case 'S':
+ replication_slot = pg_strdup(optarg);
+ break;
+ case 'U':
+ dbuser = pg_strdup(optarg);
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 'w':
+ dbgetpassword = -1;
+ break;
+ case 'W':
+ dbgetpassword = 1;
+ break;
+ case 'Z':
+ parse_compress_options(optarg, &compression_algorithm_str,
+ &compression_detail);
+ break;
+ case 1:
+ do_create_slot = true;
+ break;
+ case 2:
+ do_drop_slot = true;
+ break;
+ case 3:
+ slot_exists_ok = true;
+ break;
+ case 4:
+ synchronous = true;
+ break;
+ case 5:
+ do_sync = false;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Any non-option arguments?
+ */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (do_drop_slot && do_create_slot)
+ {
+ pg_log_error("cannot use --create-slot together with --drop-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (replication_slot == NULL && (do_drop_slot || do_create_slot))
+ {
+ /* translator: second %s is an option name */
+ pg_log_error("%s needs a slot to be specified using --slot",
+ do_drop_slot ? "--drop-slot" : "--create-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (synchronous && !do_sync)
+ {
+ pg_log_error("cannot use --synchronous together with --no-sync");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Required arguments
+ */
+ if (basedir == NULL && !do_drop_slot && !do_create_slot)
+ {
+ pg_log_error("no target directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Compression options
+ */
+ if (!parse_compress_algorithm(compression_algorithm_str,
+ &compression_algorithm))
+ pg_fatal("unrecognized compression algorithm: \"%s\"",
+ compression_algorithm_str);
+
+ parse_compress_specification(compression_algorithm, compression_detail,
+ &compression_spec);
+ error_detail = validate_compress_specification(&compression_spec);
+ if (error_detail != NULL)
+ pg_fatal("invalid compression specification: %s",
+ error_detail);
+
+ /* Extract the compression level */
+ compresslevel = compression_spec.level;
+
+ if (compression_algorithm == PG_COMPRESSION_ZSTD)
+ pg_fatal("compression with %s is not yet supported", "ZSTD");
+
+ /*
+ * Check existence of destination folder.
+ */
+ if (!do_drop_slot && !do_create_slot)
+ {
+ DIR *dir = get_destination_dir(basedir);
+
+ close_destination_dir(dir, basedir);
+ }
+
+ /*
+ * Obtain a connection before doing anything.
+ */
+ conn = GetConnection();
+ if (!conn)
+ /* error message already written in GetConnection() */
+ exit(1);
+ atexit(disconnect_atexit);
+
+ /*
+ * Trap signals. (Don't do this until after the initial password prompt,
+ * if one is needed, in GetConnection.)
+ */
+#ifndef WIN32
+ pqsignal(SIGINT, sigexit_handler);
+ pqsignal(SIGTERM, sigexit_handler);
+#endif
+
+ /*
+ * Run IDENTIFY_SYSTEM to make sure we've successfully have established a
+ * replication connection and haven't connected using a database specific
+ * connection.
+ */
+ if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name))
+ exit(1);
+
+ /*
+ * Check that there is a database associated with connection, none should
+ * be defined in this context.
+ */
+ if (db_name)
+ pg_fatal("replication connection using slot \"%s\" is unexpectedly database specific",
+ replication_slot);
+
+ /*
+ * Set umask so that directories/files are created with the same
+ * permissions as directories/files in the source data directory.
+ *
+ * pg_mode_mask is set to owner-only by default and then updated in
+ * GetConnection() where we get the mode from the server-side with
+ * RetrieveDataDirCreatePerm() and then call SetDataDirectoryCreatePerm().
+ */
+ umask(pg_mode_mask);
+
+ /*
+ * Drop a replication slot.
+ */
+ if (do_drop_slot)
+ {
+ if (verbose)
+ pg_log_info("dropping replication slot \"%s\"", replication_slot);
+
+ if (!DropReplicationSlot(conn, replication_slot))
+ exit(1);
+ exit(0);
+ }
+
+ /* Create a replication slot */
+ if (do_create_slot)
+ {
+ if (verbose)
+ pg_log_info("creating replication slot \"%s\"", replication_slot);
+
+ if (!CreateReplicationSlot(conn, replication_slot, NULL, false, true, false,
+ slot_exists_ok, false))
+ exit(1);
+ exit(0);
+ }
+
+ /* determine remote server's xlog segment size */
+ if (!RetrieveWalSegSize(conn))
+ exit(1);
+
+ /*
+ * Don't close the connection here so that subsequent StreamLog() can
+ * reuse it.
+ */
+
+ while (true)
+ {
+ StreamLog();
+ if (time_to_stop)
+ {
+ /*
+ * We've been Ctrl-C'ed or end of streaming position has been
+ * willingly reached, so exit without an error code.
+ */
+ exit(0);
+ }
+ else if (noloop)
+ pg_fatal("disconnected");
+ else
+ {
+ /* translator: check source for value for %d */
+ pg_log_info("disconnected; waiting %d seconds to try again",
+ RECONNECT_SLEEP_TIME);
+ pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
+ }
+ }
+}
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c
new file mode 100644
index 0000000..f3c7937
--- /dev/null
+++ b/src/bin/pg_basebackup/pg_recvlogical.c
@@ -0,0 +1,1038 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_recvlogical.c - receive data from a logical decoding slot in a streaming
+ * fashion and write it to a local file.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/pg_recvlogical.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <sys/select.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "libpq-fe.h"
+#include "libpq/pqsignal.h"
+#include "pqexpbuffer.h"
+#include "streamutil.h"
+
+/* Time to sleep between reconnection attempts */
+#define RECONNECT_SLEEP_TIME 5
+
+/* Global Options */
+static char *outfile = NULL;
+static int verbose = 0;
+static bool two_phase = false;
+static int noloop = 0;
+static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
+static int fsync_interval = 10 * 1000; /* 10 sec = default */
+static XLogRecPtr startpos = InvalidXLogRecPtr;
+static XLogRecPtr endpos = InvalidXLogRecPtr;
+static bool do_create_slot = false;
+static bool slot_exists_ok = false;
+static bool do_start_slot = false;
+static bool do_drop_slot = false;
+static char *replication_slot = NULL;
+
+/* filled pairwise with option, value. value may be NULL */
+static char **options;
+static size_t noptions = 0;
+static const char *plugin = "test_decoding";
+
+/* Global State */
+static int outfd = -1;
+static volatile sig_atomic_t time_to_abort = false;
+static volatile sig_atomic_t output_reopen = false;
+static bool output_isfile;
+static TimestampTz output_last_fsync = -1;
+static bool output_needs_fsync = false;
+static XLogRecPtr output_written_lsn = InvalidXLogRecPtr;
+static XLogRecPtr output_fsync_lsn = InvalidXLogRecPtr;
+
+static void usage(void);
+static void StreamLogicalLog(void);
+static bool flushAndSendFeedback(PGconn *conn, TimestampTz *now);
+static void prepareToTerminate(PGconn *conn, XLogRecPtr endpos,
+ bool keepalive, XLogRecPtr lsn);
+
+static void
+usage(void)
+{
+ printf(_("%s controls PostgreSQL logical decoding streams.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+ printf(_("\nAction to be performed:\n"));
+ printf(_(" --create-slot create a new replication slot (for the slot's name see --slot)\n"));
+ printf(_(" --drop-slot drop the replication slot (for the slot's name see --slot)\n"));
+ printf(_(" --start start streaming in a replication slot (for the slot's name see --slot)\n"));
+ printf(_("\nOptions:\n"));
+ printf(_(" -E, --endpos=LSN exit after receiving the specified LSN\n"));
+ printf(_(" -f, --file=FILE receive log into this file, - for stdout\n"));
+ printf(_(" -F --fsync-interval=SECS\n"
+ " time between fsyncs to the output file (default: %d)\n"), (fsync_interval / 1000));
+ printf(_(" --if-not-exists do not error if slot already exists when creating a slot\n"));
+ printf(_(" -I, --startpos=LSN where in an existing slot should the streaming start\n"));
+ printf(_(" -n, --no-loop do not loop on connection lost\n"));
+ printf(_(" -o, --option=NAME[=VALUE]\n"
+ " pass option NAME with optional value VALUE to the\n"
+ " output plugin\n"));
+ printf(_(" -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"), plugin);
+ printf(_(" -s, --status-interval=SECS\n"
+ " time between status packets sent to server (default: %d)\n"), (standby_message_timeout / 1000));
+ printf(_(" -S, --slot=SLOTNAME name of the logical replication slot\n"));
+ printf(_(" -t, --two-phase enable decoding of prepared transactions when creating a slot\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=DBNAME database to connect to\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Send a Standby Status Update message to server.
+ */
+static bool
+sendFeedback(PGconn *conn, TimestampTz now, bool force, bool replyRequested)
+{
+ static XLogRecPtr last_written_lsn = InvalidXLogRecPtr;
+ static XLogRecPtr last_fsync_lsn = InvalidXLogRecPtr;
+
+ char replybuf[1 + 8 + 8 + 8 + 8 + 1];
+ int len = 0;
+
+ /*
+ * we normally don't want to send superfluous feedback, but if it's
+ * because of a timeout we need to, otherwise wal_sender_timeout will kill
+ * us.
+ */
+ if (!force &&
+ last_written_lsn == output_written_lsn &&
+ last_fsync_lsn == output_fsync_lsn)
+ return true;
+
+ if (verbose)
+ pg_log_info("confirming write up to %X/%X, flush to %X/%X (slot %s)",
+ LSN_FORMAT_ARGS(output_written_lsn),
+ LSN_FORMAT_ARGS(output_fsync_lsn),
+ replication_slot);
+
+ replybuf[len] = 'r';
+ len += 1;
+ fe_sendint64(output_written_lsn, &replybuf[len]); /* write */
+ len += 8;
+ fe_sendint64(output_fsync_lsn, &replybuf[len]); /* flush */
+ len += 8;
+ fe_sendint64(InvalidXLogRecPtr, &replybuf[len]); /* apply */
+ len += 8;
+ fe_sendint64(now, &replybuf[len]); /* sendTime */
+ len += 8;
+ replybuf[len] = replyRequested ? 1 : 0; /* replyRequested */
+ len += 1;
+
+ startpos = output_written_lsn;
+ last_written_lsn = output_written_lsn;
+ last_fsync_lsn = output_fsync_lsn;
+
+ if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send feedback packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+
+ return true;
+}
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
+
+static bool
+OutputFsync(TimestampTz now)
+{
+ output_last_fsync = now;
+
+ output_fsync_lsn = output_written_lsn;
+
+ if (fsync_interval <= 0)
+ return true;
+
+ if (!output_needs_fsync)
+ return true;
+
+ output_needs_fsync = false;
+
+ /* can only fsync if it's a regular file */
+ if (!output_isfile)
+ return true;
+
+ if (fsync(outfd) != 0)
+ pg_fatal("could not fsync file \"%s\": %m", outfile);
+
+ return true;
+}
+
+/*
+ * Start the log streaming
+ */
+static void
+StreamLogicalLog(void)
+{
+ PGresult *res;
+ char *copybuf = NULL;
+ TimestampTz last_status = -1;
+ int i;
+ PQExpBuffer query;
+
+ output_written_lsn = InvalidXLogRecPtr;
+ output_fsync_lsn = InvalidXLogRecPtr;
+
+ /*
+ * Connect in replication mode to the server
+ */
+ if (!conn)
+ conn = GetConnection();
+ if (!conn)
+ /* Error message already written in GetConnection() */
+ return;
+
+ /*
+ * Start the replication
+ */
+ if (verbose)
+ pg_log_info("starting log streaming at %X/%X (slot %s)",
+ LSN_FORMAT_ARGS(startpos),
+ replication_slot);
+
+ /* Initiate the replication stream at specified location */
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X",
+ replication_slot, LSN_FORMAT_ARGS(startpos));
+
+ /* print options if there are any */
+ if (noptions)
+ appendPQExpBufferStr(query, " (");
+
+ for (i = 0; i < noptions; i++)
+ {
+ /* separator */
+ if (i > 0)
+ appendPQExpBufferStr(query, ", ");
+
+ /* write option name */
+ appendPQExpBuffer(query, "\"%s\"", options[(i * 2)]);
+
+ /* write option value if specified */
+ if (options[(i * 2) + 1] != NULL)
+ appendPQExpBuffer(query, " '%s'", options[(i * 2) + 1]);
+ }
+
+ if (noptions)
+ appendPQExpBufferChar(query, ')');
+
+ res = PQexec(conn, query->data);
+ if (PQresultStatus(res) != PGRES_COPY_BOTH)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ query->data, PQresultErrorMessage(res));
+ PQclear(res);
+ goto error;
+ }
+ PQclear(res);
+ resetPQExpBuffer(query);
+
+ if (verbose)
+ pg_log_info("streaming initiated");
+
+ while (!time_to_abort)
+ {
+ int r;
+ int bytes_left;
+ int bytes_written;
+ TimestampTz now;
+ int hdr_len;
+ XLogRecPtr cur_record_lsn = InvalidXLogRecPtr;
+
+ if (copybuf != NULL)
+ {
+ PQfreemem(copybuf);
+ copybuf = NULL;
+ }
+
+ /*
+ * Potentially send a status message to the primary.
+ */
+ now = feGetCurrentTimestamp();
+
+ if (outfd != -1 &&
+ feTimestampDifferenceExceeds(output_last_fsync, now,
+ fsync_interval))
+ {
+ if (!OutputFsync(now))
+ goto error;
+ }
+
+ if (standby_message_timeout > 0 &&
+ feTimestampDifferenceExceeds(last_status, now,
+ standby_message_timeout))
+ {
+ /* Time to send feedback! */
+ if (!sendFeedback(conn, now, true, false))
+ goto error;
+
+ last_status = now;
+ }
+
+ /* got SIGHUP, close output file */
+ if (outfd != -1 && output_reopen && strcmp(outfile, "-") != 0)
+ {
+ now = feGetCurrentTimestamp();
+ if (!OutputFsync(now))
+ goto error;
+ close(outfd);
+ outfd = -1;
+ }
+ output_reopen = false;
+
+ /* open the output file, if not open yet */
+ if (outfd == -1)
+ {
+ struct stat statbuf;
+
+ if (strcmp(outfile, "-") == 0)
+ outfd = fileno(stdout);
+ else
+ outfd = open(outfile, O_CREAT | O_APPEND | O_WRONLY | PG_BINARY,
+ S_IRUSR | S_IWUSR);
+ if (outfd == -1)
+ {
+ pg_log_error("could not open log file \"%s\": %m", outfile);
+ goto error;
+ }
+
+ if (fstat(outfd, &statbuf) != 0)
+ {
+ pg_log_error("could not stat file \"%s\": %m", outfile);
+ goto error;
+ }
+
+ output_isfile = S_ISREG(statbuf.st_mode) && !isatty(outfd);
+ }
+
+ r = PQgetCopyData(conn, &copybuf, 1);
+ if (r == 0)
+ {
+ /*
+ * In async mode, and no data available. We block on reading but
+ * not more than the specified timeout, so that we can send a
+ * response back to the client.
+ */
+ fd_set input_mask;
+ TimestampTz message_target = 0;
+ TimestampTz fsync_target = 0;
+ struct timeval timeout;
+ struct timeval *timeoutptr = NULL;
+
+ if (PQsocket(conn) < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(conn));
+ goto error;
+ }
+
+ FD_ZERO(&input_mask);
+ FD_SET(PQsocket(conn), &input_mask);
+
+ /* Compute when we need to wakeup to send a keepalive message. */
+ if (standby_message_timeout)
+ message_target = last_status + (standby_message_timeout - 1) *
+ ((int64) 1000);
+
+ /* Compute when we need to wakeup to fsync the output file. */
+ if (fsync_interval > 0 && output_needs_fsync)
+ fsync_target = output_last_fsync + (fsync_interval - 1) *
+ ((int64) 1000);
+
+ /* Now compute when to wakeup. */
+ if (message_target > 0 || fsync_target > 0)
+ {
+ TimestampTz targettime;
+ long secs;
+ int usecs;
+
+ targettime = message_target;
+
+ if (fsync_target > 0 && fsync_target < targettime)
+ targettime = fsync_target;
+
+ feTimestampDifference(now,
+ targettime,
+ &secs,
+ &usecs);
+ if (secs <= 0)
+ timeout.tv_sec = 1; /* Always sleep at least 1 sec */
+ else
+ timeout.tv_sec = secs;
+ timeout.tv_usec = usecs;
+ timeoutptr = &timeout;
+ }
+
+ r = select(PQsocket(conn) + 1, &input_mask, NULL, NULL, timeoutptr);
+ if (r == 0 || (r < 0 && errno == EINTR))
+ {
+ /*
+ * Got a timeout or signal. Continue the loop and either
+ * deliver a status packet to the server or just go back into
+ * blocking.
+ */
+ continue;
+ }
+ else if (r < 0)
+ {
+ pg_log_error("%s() failed: %m", "select");
+ goto error;
+ }
+
+ /* Else there is actually data on the socket */
+ if (PQconsumeInput(conn) == 0)
+ {
+ pg_log_error("could not receive data from WAL stream: %s",
+ PQerrorMessage(conn));
+ goto error;
+ }
+ continue;
+ }
+
+ /* End of copy stream */
+ if (r == -1)
+ break;
+
+ /* Failure while reading the copy stream */
+ if (r == -2)
+ {
+ pg_log_error("could not read COPY data: %s",
+ PQerrorMessage(conn));
+ goto error;
+ }
+
+ /* Check the message type. */
+ if (copybuf[0] == 'k')
+ {
+ int pos;
+ bool replyRequested;
+ XLogRecPtr walEnd;
+ bool endposReached = false;
+
+ /*
+ * Parse the keepalive message, enclosed in the CopyData message.
+ * We just check if the server requested a reply, and ignore the
+ * rest.
+ */
+ pos = 1; /* skip msgtype 'k' */
+ walEnd = fe_recvint64(&copybuf[pos]);
+ output_written_lsn = Max(walEnd, output_written_lsn);
+
+ pos += 8; /* read walEnd */
+
+ pos += 8; /* skip sendTime */
+
+ if (r < pos + 1)
+ {
+ pg_log_error("streaming header too small: %d", r);
+ goto error;
+ }
+ replyRequested = copybuf[pos];
+
+ if (endpos != InvalidXLogRecPtr && walEnd >= endpos)
+ {
+ /*
+ * If there's nothing to read on the socket until a keepalive
+ * we know that the server has nothing to send us; and if
+ * walEnd has passed endpos, we know nothing else can have
+ * committed before endpos. So we can bail out now.
+ */
+ endposReached = true;
+ }
+
+ /* Send a reply, if necessary */
+ if (replyRequested || endposReached)
+ {
+ if (!flushAndSendFeedback(conn, &now))
+ goto error;
+ last_status = now;
+ }
+
+ if (endposReached)
+ {
+ prepareToTerminate(conn, endpos, true, InvalidXLogRecPtr);
+ time_to_abort = true;
+ break;
+ }
+
+ continue;
+ }
+ else if (copybuf[0] != 'w')
+ {
+ pg_log_error("unrecognized streaming header: \"%c\"",
+ copybuf[0]);
+ goto error;
+ }
+
+ /*
+ * Read the header of the XLogData message, enclosed in the CopyData
+ * message. We only need the WAL location field (dataStart), the rest
+ * of the header is ignored.
+ */
+ hdr_len = 1; /* msgtype 'w' */
+ hdr_len += 8; /* dataStart */
+ hdr_len += 8; /* walEnd */
+ hdr_len += 8; /* sendTime */
+ if (r < hdr_len + 1)
+ {
+ pg_log_error("streaming header too small: %d", r);
+ goto error;
+ }
+
+ /* Extract WAL location for this block */
+ cur_record_lsn = fe_recvint64(&copybuf[1]);
+
+ if (endpos != InvalidXLogRecPtr && cur_record_lsn > endpos)
+ {
+ /*
+ * We've read past our endpoint, so prepare to go away being
+ * cautious about what happens to our output data.
+ */
+ if (!flushAndSendFeedback(conn, &now))
+ goto error;
+ prepareToTerminate(conn, endpos, false, cur_record_lsn);
+ time_to_abort = true;
+ break;
+ }
+
+ output_written_lsn = Max(cur_record_lsn, output_written_lsn);
+
+ bytes_left = r - hdr_len;
+ bytes_written = 0;
+
+ /* signal that a fsync is needed */
+ output_needs_fsync = true;
+
+ while (bytes_left)
+ {
+ int ret;
+
+ ret = write(outfd,
+ copybuf + hdr_len + bytes_written,
+ bytes_left);
+
+ if (ret < 0)
+ {
+ pg_log_error("could not write %d bytes to log file \"%s\": %m",
+ bytes_left, outfile);
+ goto error;
+ }
+
+ /* Write was successful, advance our position */
+ bytes_written += ret;
+ bytes_left -= ret;
+ }
+
+ if (write(outfd, "\n", 1) != 1)
+ {
+ pg_log_error("could not write %d bytes to log file \"%s\": %m",
+ 1, outfile);
+ goto error;
+ }
+
+ if (endpos != InvalidXLogRecPtr && cur_record_lsn == endpos)
+ {
+ /* endpos was exactly the record we just processed, we're done */
+ if (!flushAndSendFeedback(conn, &now))
+ goto error;
+ prepareToTerminate(conn, endpos, false, cur_record_lsn);
+ time_to_abort = true;
+ break;
+ }
+ }
+
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) == PGRES_COPY_OUT)
+ {
+ PQclear(res);
+
+ /*
+ * We're doing a client-initiated clean exit and have sent CopyDone to
+ * the server. Drain any messages, so we don't miss a last-minute
+ * ErrorResponse. The walsender stops generating XLogData records once
+ * it sees CopyDone, so expect this to finish quickly. After CopyDone,
+ * it's too late for sendFeedback(), even if this were to take a long
+ * time. Hence, use synchronous-mode PQgetCopyData().
+ */
+ while (1)
+ {
+ int r;
+
+ if (copybuf != NULL)
+ {
+ PQfreemem(copybuf);
+ copybuf = NULL;
+ }
+ r = PQgetCopyData(conn, &copybuf, 0);
+ if (r == -1)
+ break;
+ if (r == -2)
+ {
+ pg_log_error("could not read COPY data: %s",
+ PQerrorMessage(conn));
+ time_to_abort = false; /* unclean exit */
+ goto error;
+ }
+ }
+
+ res = PQgetResult(conn);
+ }
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("unexpected termination of replication stream: %s",
+ PQresultErrorMessage(res));
+ goto error;
+ }
+ PQclear(res);
+
+ if (outfd != -1 && strcmp(outfile, "-") != 0)
+ {
+ TimestampTz t = feGetCurrentTimestamp();
+
+ /* no need to jump to error on failure here, we're finishing anyway */
+ OutputFsync(t);
+
+ if (close(outfd) != 0)
+ pg_log_error("could not close file \"%s\": %m", outfile);
+ }
+ outfd = -1;
+error:
+ if (copybuf != NULL)
+ {
+ PQfreemem(copybuf);
+ copybuf = NULL;
+ }
+ destroyPQExpBuffer(query);
+ PQfinish(conn);
+ conn = NULL;
+}
+
+/*
+ * Unfortunately we can't do sensible signal handling on windows...
+ */
+#ifndef WIN32
+
+/*
+ * When SIGINT/SIGTERM are caught, just tell the system to exit at the next
+ * possible moment.
+ */
+static void
+sigexit_handler(SIGNAL_ARGS)
+{
+ time_to_abort = true;
+}
+
+/*
+ * Trigger the output file to be reopened.
+ */
+static void
+sighup_handler(SIGNAL_ARGS)
+{
+ output_reopen = true;
+}
+#endif
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+/* general options */
+ {"file", required_argument, NULL, 'f'},
+ {"fsync-interval", required_argument, NULL, 'F'},
+ {"no-loop", no_argument, NULL, 'n'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"two-phase", no_argument, NULL, 't'},
+ {"version", no_argument, NULL, 'V'},
+ {"help", no_argument, NULL, '?'},
+/* connection options */
+ {"dbname", required_argument, NULL, 'd'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+/* replication options */
+ {"startpos", required_argument, NULL, 'I'},
+ {"endpos", required_argument, NULL, 'E'},
+ {"option", required_argument, NULL, 'o'},
+ {"plugin", required_argument, NULL, 'P'},
+ {"status-interval", required_argument, NULL, 's'},
+ {"slot", required_argument, NULL, 'S'},
+/* action */
+ {"create-slot", no_argument, NULL, 1},
+ {"start", no_argument, NULL, 2},
+ {"drop-slot", no_argument, NULL, 3},
+ {"if-not-exists", no_argument, NULL, 4},
+ {NULL, 0, NULL, 0}
+ };
+ int c;
+ int option_index;
+ uint32 hi,
+ lo;
+ char *db_name;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "-V") == 0 ||
+ strcmp(argv[1], "--version") == 0)
+ {
+ puts("pg_recvlogical (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "E:f:F:ntvd:h:p:U:wWI:o:P:s:S:",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+/* general options */
+ case 'f':
+ outfile = pg_strdup(optarg);
+ break;
+ case 'F':
+ if (!option_parse_int(optarg, "-F/--fsync-interval", 0,
+ INT_MAX / 1000,
+ &fsync_interval))
+ exit(1);
+ fsync_interval *= 1000;
+ break;
+ case 'n':
+ noloop = 1;
+ break;
+ case 't':
+ two_phase = true;
+ break;
+ case 'v':
+ verbose++;
+ break;
+/* connection options */
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'h':
+ dbhost = pg_strdup(optarg);
+ break;
+ case 'p':
+ dbport = pg_strdup(optarg);
+ break;
+ case 'U':
+ dbuser = pg_strdup(optarg);
+ break;
+ case 'w':
+ dbgetpassword = -1;
+ break;
+ case 'W':
+ dbgetpassword = 1;
+ break;
+/* replication options */
+ case 'I':
+ if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse start position \"%s\"", optarg);
+ startpos = ((uint64) hi) << 32 | lo;
+ break;
+ case 'E':
+ if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("could not parse end position \"%s\"", optarg);
+ endpos = ((uint64) hi) << 32 | lo;
+ break;
+ case 'o':
+ {
+ char *data = pg_strdup(optarg);
+ char *val = strchr(data, '=');
+
+ if (val != NULL)
+ {
+ /* remove =; separate data from val */
+ *val = '\0';
+ val++;
+ }
+
+ noptions += 1;
+ options = pg_realloc(options, sizeof(char *) * noptions * 2);
+
+ options[(noptions - 1) * 2] = data;
+ options[(noptions - 1) * 2 + 1] = val;
+ }
+
+ break;
+ case 'P':
+ plugin = pg_strdup(optarg);
+ break;
+ case 's':
+ if (!option_parse_int(optarg, "-s/--status-interval", 0,
+ INT_MAX / 1000,
+ &standby_message_timeout))
+ exit(1);
+ standby_message_timeout *= 1000;
+ break;
+ case 'S':
+ replication_slot = pg_strdup(optarg);
+ break;
+/* action */
+ case 1:
+ do_create_slot = true;
+ break;
+ case 2:
+ do_start_slot = true;
+ break;
+ case 3:
+ do_drop_slot = true;
+ break;
+ case 4:
+ slot_exists_ok = true;
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Any non-option arguments?
+ */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Required arguments
+ */
+ if (replication_slot == NULL)
+ {
+ pg_log_error("no slot specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (do_start_slot && outfile == NULL)
+ {
+ pg_log_error("no target file specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (!do_drop_slot && dbname == NULL)
+ {
+ pg_log_error("no database specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (!do_drop_slot && !do_create_slot && !do_start_slot)
+ {
+ pg_log_error("at least one action needs to be specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (do_drop_slot && (do_create_slot || do_start_slot))
+ {
+ pg_log_error("cannot use --create-slot or --start together with --drop-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (startpos != InvalidXLogRecPtr && (do_create_slot || do_drop_slot))
+ {
+ pg_log_error("cannot use --create-slot or --drop-slot together with --startpos");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (endpos != InvalidXLogRecPtr && !do_start_slot)
+ {
+ pg_log_error("--endpos may only be specified with --start");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (two_phase && !do_create_slot)
+ {
+ pg_log_error("--two-phase may only be specified with --create-slot");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Obtain a connection to server. Notably, if we need a password, we want
+ * to collect it from the user immediately.
+ */
+ conn = GetConnection();
+ if (!conn)
+ /* Error message already written in GetConnection() */
+ exit(1);
+ atexit(disconnect_atexit);
+
+ /*
+ * Trap signals. (Don't do this until after the initial password prompt,
+ * if one is needed, in GetConnection.)
+ */
+#ifndef WIN32
+ pqsignal(SIGINT, sigexit_handler);
+ pqsignal(SIGTERM, sigexit_handler);
+ pqsignal(SIGHUP, sighup_handler);
+#endif
+
+ /*
+ * Run IDENTIFY_SYSTEM to make sure we connected using a database specific
+ * replication connection.
+ */
+ if (!RunIdentifySystem(conn, NULL, NULL, NULL, &db_name))
+ exit(1);
+
+ if (db_name == NULL)
+ pg_fatal("could not establish database-specific replication connection");
+
+ /*
+ * Set umask so that directories/files are created with the same
+ * permissions as directories/files in the source data directory.
+ *
+ * pg_mode_mask is set to owner-only by default and then updated in
+ * GetConnection() where we get the mode from the server-side with
+ * RetrieveDataDirCreatePerm() and then call SetDataDirectoryCreatePerm().
+ */
+ umask(pg_mode_mask);
+
+ /* Drop a replication slot. */
+ if (do_drop_slot)
+ {
+ if (verbose)
+ pg_log_info("dropping replication slot \"%s\"", replication_slot);
+
+ if (!DropReplicationSlot(conn, replication_slot))
+ exit(1);
+ }
+
+ /* Create a replication slot. */
+ if (do_create_slot)
+ {
+ if (verbose)
+ pg_log_info("creating replication slot \"%s\"", replication_slot);
+
+ if (!CreateReplicationSlot(conn, replication_slot, plugin, false,
+ false, false, slot_exists_ok, two_phase))
+ exit(1);
+ startpos = InvalidXLogRecPtr;
+ }
+
+ if (!do_start_slot)
+ exit(0);
+
+ /* Stream loop */
+ while (true)
+ {
+ StreamLogicalLog();
+ if (time_to_abort)
+ {
+ /*
+ * We've been Ctrl-C'ed or reached an exit limit condition. That's
+ * not an error, so exit without an errorcode.
+ */
+ exit(0);
+ }
+ else if (noloop)
+ pg_fatal("disconnected");
+ else
+ {
+ /* translator: check source for value for %d */
+ pg_log_info("disconnected; waiting %d seconds to try again",
+ RECONNECT_SLEEP_TIME);
+ pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
+ }
+ }
+}
+
+/*
+ * Fsync our output data, and send a feedback message to the server. Returns
+ * true if successful, false otherwise.
+ *
+ * If successful, *now is updated to the current timestamp just before sending
+ * feedback.
+ */
+static bool
+flushAndSendFeedback(PGconn *conn, TimestampTz *now)
+{
+ /* flush data to disk, so that we send a recent flush pointer */
+ if (!OutputFsync(*now))
+ return false;
+ *now = feGetCurrentTimestamp();
+ if (!sendFeedback(conn, *now, true, false))
+ return false;
+
+ return true;
+}
+
+/*
+ * Try to inform the server about our upcoming demise, but don't wait around or
+ * retry on failure.
+ */
+static void
+prepareToTerminate(PGconn *conn, XLogRecPtr endpos, bool keepalive, XLogRecPtr lsn)
+{
+ (void) PQputCopyEnd(conn, NULL);
+ (void) PQflush(conn);
+
+ if (verbose)
+ {
+ if (keepalive)
+ pg_log_info("end position %X/%X reached by keepalive",
+ LSN_FORMAT_ARGS(endpos));
+ else
+ pg_log_info("end position %X/%X reached by WAL record at %X/%X",
+ LSN_FORMAT_ARGS(endpos), LSN_FORMAT_ARGS(lsn));
+ }
+}
diff --git a/src/bin/pg_basebackup/po/LINGUAS b/src/bin/pg_basebackup/po/LINGUAS
new file mode 100644
index 0000000..fb4e1ca
--- /dev/null
+++ b/src/bin/pg_basebackup/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_basebackup/po/cs.po b/src/bin/pg_basebackup/po/cs.po
new file mode 100644
index 0000000..f74b659
--- /dev/null
+++ b/src/bin/pg_basebackup/po/cs.po
@@ -0,0 +1,1647 @@
+# Czech message translation file for pg_basebackup
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2020-10-31 21:35+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "chyba: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "varování: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/file_utils.c:79 ../../common/file_utils.c:181
+#: pg_receivewal.c:266 pg_recvlogical.c:340
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "nelze přistoupit k souboru \"%s\": %m"
+
+#: ../../common/file_utils.c:158 pg_receivewal.c:169
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: ../../common/file_utils.c:192 pg_receivewal.c:337
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze Äíst z adresáře \"%s\": %m"
+
+#: ../../common/file_utils.c:224 ../../common/file_utils.c:283
+#: ../../common/file_utils.c:357 ../../fe_utils/recovery_gen.c:134
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: ../../common/file_utils.c:295 ../../common/file_utils.c:365
+#: pg_recvlogical.c:193
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "nelze provést fsync souboru \"%s\": %m"
+
+#: ../../common/file_utils.c:375
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "nelze přejmenovat soubor \"%s\" na \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49
+#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100
+#: ../../fe_utils/recovery_gen.c:171 pg_basebackup.c:1248
+#, c-format
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../fe_utils/recovery_gen.c:140 pg_basebackup.c:1021 pg_basebackup.c:1714
+#: pg_basebackup.c:1770
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "nelze zapsat do souboru \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:152 pg_basebackup.c:1166 pg_basebackup.c:1671
+#: pg_basebackup.c:1747
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "nelze vytvořit soubor \"%s\": %m"
+
+#: pg_basebackup.c:224
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "odstraňuji datový adresář \"%s\""
+
+#: pg_basebackup.c:226
+#, c-format
+msgid "failed to remove data directory"
+msgstr "selhalo odstranění datového adresáře"
+
+#: pg_basebackup.c:230
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "odstraňuji obsah datového adresáře \"%s\""
+
+#: pg_basebackup.c:232
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "selhalo odstranění obsahu datového adresáře"
+
+#: pg_basebackup.c:237
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "odstraňuji WAL adresář \"%s\""
+
+#: pg_basebackup.c:239
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "selhalo odstranění WAL adresáře"
+
+#: pg_basebackup.c:243
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "odstraňuji obsah WAL adresáře \"%s\""
+
+#: pg_basebackup.c:245
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "selhalo odstranění obsahu WAL adresáře"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "datový adresář \"%s\" nebyl na žádost uživatele odstraněn"
+
+#: pg_basebackup.c:254
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL adresář \"%s\" nebyl na žádost uživatele odstraněn"
+
+#: pg_basebackup.c:258
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "změny v tablespace adresářích nebudou vráceny zpět"
+
+#: pg_basebackup.c:299
+#, c-format
+msgid "directory name too long"
+msgstr "jméno adresáře je příliš dlouhé"
+
+#: pg_basebackup.c:309
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "více \"=\" znaků v tablespace mapování"
+
+#: pg_basebackup.c:321
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "chybný formát tablespace mapování \"%s\", musí být \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "starý adresář v tablespace mapování není zadán jako absolutní cesta: %s"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "nový adresář v tablespace mapování není zadán jako absolutní cesta: %s"
+
+#: pg_basebackup.c:379
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s vytvoří base backup běžícího PostgreSQL serveru.\n"
+"\n"
+
+#: pg_basebackup.c:381 pg_receivewal.c:79 pg_recvlogical.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_basebackup.c:382 pg_receivewal.c:80 pg_recvlogical.c:76
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [VOLBA]...\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Volby ovlivňující výstup:\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=ADRESÃŘ ulož base backup do adresáře\n"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t výstupní formát (plain (výchozí), tar)\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE maximální rychlost pro přenos datového adresáře\n"
+" (v kB/s, nebo použijte příponu \"k\" nebo \"M\")\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" zapíše konfiguraci pro replikaci\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" přemístit tablespace z OLDDIR do NEWDIR\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR umístÄ›ní adresáře s transakÄním logem\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" zahrne potřebné WAL soubory zvolenou metodou\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip komprimuj výstup taru\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr " -Z, --compress=0-9 komprimuj výstup taru zvolenou úrovní komprese\n"
+
+#: pg_basebackup.c:397
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Obecné volby:\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" nastav fast nebo spread checkpointing\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot vytvoÅ™ replikaÄní slot\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=NÃZEV nastav jmenovku zálohy\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean neuklízet po chybě\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync neÄekat na bezpeÄné zapsání zmÄ›n na disk\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress zobrazuj informace o průběhu\n"
+
+#: pg_basebackup.c:405 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME použít tento replikaÄní slot\n"
+
+#: pg_basebackup.c:406 pg_receivewal.c:91 pg_recvlogical.c:96
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose zobrazuj podrobnější zprávy\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:92 pg_recvlogical.c:97
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypiÅ¡ informace o verzi, potom skonÄi\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" použij algoritmus pro kontrolní souÄet manifestu\n"
+
+#: pg_basebackup.c:410
+#, c-format
+#| msgid ""
+#| " --no-verify-checksums\n"
+#| " do not verify checksums\n"
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" všechna jména souborů v manifestu kóduj pomocí hex\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size neodhaduj velikost backupu na stranÄ› serveru\n"
+
+#: pg_basebackup.c:413
+#, c-format
+#| msgid " --no-slot prevent creation of temporary replication slot\n"
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest zamezí vytvoření backup manifestu\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot zamezí vytvoÅ™ení doÄasného replikaÄního slotu\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" neověřovat kontrolní souÄty\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:94 pg_recvlogical.c:98
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukaž tuto nápovÄ›du, potom skonÄi\n"
+
+#: pg_basebackup.c:418 pg_receivewal.c:95 pg_recvlogical.c:99
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Volby spojení:\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:96
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR connection string\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:97 pg_recvlogical.c:101
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host databázového serveru nebo adresář se sockety\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:98 pg_recvlogical.c:102
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" Äas mezi zasíláním packetů se stavem na server (ve vteÅ™inách)\n"
+
+#: pg_basebackup.c:424 pg_receivewal.c:99 pg_recvlogical.c:103
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=JMÉNO připoj se jako uvedený databázový uživatel\n"
+
+#: pg_basebackup.c:425 pg_receivewal.c:100 pg_recvlogical.c:104
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nikdy se neptej na heslo\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:101 pg_recvlogical.c:105
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password vynuť dotaz na heslo (mělo by se dít automaticky)\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:105 pg_recvlogical.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:106 pg_recvlogical.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_basebackup.c:471
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "nelze Äíst z ready roury: %m"
+
+#: pg_basebackup.c:477 pg_basebackup.c:608 pg_basebackup.c:2133
+#: streamutil.c:450
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "nelze naparsovat pozici v transakÄním logu \"%s\""
+
+#: pg_basebackup.c:573 pg_receivewal.c:441
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "nelze dokonÄit zápis WAL souborů: %m"
+
+#: pg_basebackup.c:620
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "nelze vytvořit roury pro background procesy: %m"
+
+#: pg_basebackup.c:655
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "vytvoÅ™en doÄasný replikaÄní slot \"%s\""
+
+#: pg_basebackup.c:658
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "vytvoÅ™en replikaÄní slot \"%s\""
+
+#: pg_basebackup.c:678 pg_basebackup.c:731 pg_basebackup.c:1620
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "nelze vytvořit adresář \"%s\": %m"
+
+#: pg_basebackup.c:696
+#, c-format
+msgid "could not create background process: %m"
+msgstr "nelze vytvořit background procesy: %m"
+
+#: pg_basebackup.c:708
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "nelze vytvořit background vlákno: %m"
+
+#: pg_basebackup.c:752
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "adresář \"%s\" existuje, ale není prázdný"
+
+#: pg_basebackup.c:759
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "nelze přístoupit k adresáři \"%s\": %m"
+
+#: pg_basebackup.c:824
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespacy %*s"
+msgstr[2] "%*s/%s kB (100%%), %d/%d tablespacy %*s"
+
+#: pg_basebackup.c:836
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:852
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d tablespaces"
+
+#: pg_basebackup.c:877
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "přenosová rychlost \"%s\" není platná hodnota"
+
+#: pg_basebackup.c:882
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "chybná přenosová rychlost \"%s\": %m"
+
+#: pg_basebackup.c:891
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "přenosová rychlost musí být větší než nula"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "neplatná --max-rate jednotka: \"%s\""
+
+#: pg_basebackup.c:930
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "pÅ™enosová rychlost \"%s\" pÅ™eÄkraÄuje rozsah typu integer"
+
+#: pg_basebackup.c:940
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "přenosová rychlost \"%s\" je mimo rozsah"
+
+#: pg_basebackup.c:961
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "nelze získat COPY data stream: %s"
+
+#: pg_basebackup.c:981 pg_recvlogical.c:435 pg_recvlogical.c:607
+#: receivelog.c:965
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "nelze Äíst COPY data: %s"
+
+#: pg_basebackup.c:1007
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "nelze zapsat do komprimovaného souboru \"%s\": %s"
+
+#: pg_basebackup.c:1071
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "nelze duplikovat stdout: %m"
+
+#: pg_basebackup.c:1078
+#, c-format
+msgid "could not open output file: %m"
+msgstr "nelze otevřít výstupní soubor: %m"
+
+#: pg_basebackup.c:1085 pg_basebackup.c:1106 pg_basebackup.c:1135
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "nelze nastavit úroveň komprese %d: %s"
+
+#: pg_basebackup.c:1155
+#, c-format
+msgid "could not create compressed file \"%s\": %s"
+msgstr "nelze vytvořit komprimovaný soubor \"%s\": %s"
+
+#: pg_basebackup.c:1267
+#, c-format
+msgid "could not close compressed file \"%s\": %s"
+msgstr "nelze uzavřít komprimovaný soubor \"%s\": %s"
+
+#: pg_basebackup.c:1279 pg_recvlogical.c:632
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "nelze uzavřít soubor \"%s\": %m"
+
+#: pg_basebackup.c:1541
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY stream skonÄil pÅ™ed dokonÄením posledního souboru"
+
+#: pg_basebackup.c:1570
+#, c-format
+msgid "invalid tar block header size: %zu"
+msgstr "neplatná velikost hlaviÄky tar bloku: %zu"
+
+#: pg_basebackup.c:1627
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "nelze nastavit přístupová práva na adresáři \"%s\": %m"
+
+#: pg_basebackup.c:1651
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "nelze vytvořit symbolický odkaz z \"%s\" na \"%s\": %m"
+
+#: pg_basebackup.c:1658
+#, c-format
+msgid "unrecognized link indicator \"%c\""
+msgstr "nerozpoznaný indikátor odkazu \"%c\""
+
+#: pg_basebackup.c:1677
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "nelze nastavit přístupová práva na souboru \"%s\": %m"
+
+#: pg_basebackup.c:1831
+#, c-format
+msgid "incompatible server version %s"
+msgstr "nekompatibilní verze serveru %s"
+
+#: pg_basebackup.c:1846
+#, c-format
+msgid "HINT: use -X none or -X fetch to disable log streaming"
+msgstr "HINT: použijte -X none nebo -X fetch pro vypnutí streamování logu"
+
+#: pg_basebackup.c:1882
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "inicializuji base backup, Äekám na dokonÄení checkpointu"
+
+#: pg_basebackup.c:1908 pg_recvlogical.c:262 receivelog.c:481 receivelog.c:530
+#: receivelog.c:569 streamutil.c:297 streamutil.c:370 streamutil.c:422
+#: streamutil.c:533 streamutil.c:578
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "nelze zaslat replikaÄní příkaz \"%s\": %s"
+
+#: pg_basebackup.c:1919
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "nelze inicializovat base backup: %s"
+
+#: pg_basebackup.c:1925
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "server vrátil neoÄekávanou odpovÄ›Ä na BASE_BACKUP příkaz; pÅ™iÅ¡lo %d řádeka %d položek, oÅ™ekáváno %d řádek a %d položek"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "checkpoint completed"
+msgstr "checkpoint dokonÄen"
+
+#: pg_basebackup.c:1948
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "poÄáteÄní pozice we write-ahead logu: %s na timeline %u"
+
+#: pg_basebackup.c:1957
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "nelze získat hlaviÄku zálohy: %s"
+
+#: pg_basebackup.c:1963
+#, c-format
+msgid "no data returned from server"
+msgstr "ze serveru nebyla vrácena žádná data"
+
+#: pg_basebackup.c:1995
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "na stdout lze zapsat jen jeden tablespace, databáze má %d"
+
+#: pg_basebackup.c:2007
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "starting background WAL receiver"
+
+#: pg_basebackup.c:2046
+#, c-format
+msgid "could not get write-ahead log end position from server: %s"
+msgstr "ze serveru nelze získat koncovou pozici v transakÄním logu: %s"
+
+#: pg_basebackup.c:2052
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "ze serveru nebyla vrácena žádná koncová pozice v transakÄním logu"
+
+#: pg_basebackup.c:2057
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "koncová pozice ve write-ahead logu: %s"
+
+#: pg_basebackup.c:2068
+#, c-format
+msgid "checksum error occurred"
+msgstr "doÅ¡lo k chybÄ› kontrolního souÄtu"
+
+#: pg_basebackup.c:2073
+#, c-format
+msgid "final receive failed: %s"
+msgstr "závÄ›reÄný receive selhal: %s"
+
+#: pg_basebackup.c:2097
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "Äekám na background proces pro ukoÄení streamování ..."
+
+#: pg_basebackup.c:2102
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "nelze zaslat příkaz přes background rouru: %m"
+
+#: pg_basebackup.c:2110
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "nelze poÄkat na podřízený (child) proces: %m"
+
+#: pg_basebackup.c:2115
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "potomek %d zemÅ™el, oÄekáváno %d"
+
+#: pg_basebackup.c:2120 streamutil.c:92
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2145
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "nelze poÄkat na podřízené (child) vlákno: %m"
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "nelze získat návratový kód podřízeného vlákna: %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "podřízené vlákno skonÄilo s chybou %u"
+
+#: pg_basebackup.c:2184
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "zapisuji data na disk ..."
+
+#: pg_basebackup.c:2209
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "přejmenovávám backup_manifest.tmp na backup_manifest"
+
+#: pg_basebackup.c:2220
+#, c-format
+msgid "base backup completed"
+msgstr "base backup dokonÄen"
+
+#: pg_basebackup.c:2305
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "chybný formát výstupu \"%s\", musí být \"plain\" nebo \"tar\""
+
+#: pg_basebackup.c:2349
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "neplatná wal-metoda \"%s\", musí být \"fetch\", \"stream\" nebo \"none\""
+
+#: pg_basebackup.c:2377 pg_receivewal.c:580
+#, c-format
+msgid "invalid compression level \"%s\""
+msgstr "chybná úroveň komprese \"%s\""
+
+#: pg_basebackup.c:2388
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "chybný checkpoint argument \"%s\", musí být \"fast\" nebo \"spread\""
+
+#: pg_basebackup.c:2415 pg_receivewal.c:555 pg_recvlogical.c:820
+#, c-format
+msgid "invalid status interval \"%s\""
+msgstr "neplatný interval zasílání stavu \"%s\""
+
+#: pg_basebackup.c:2445 pg_basebackup.c:2458 pg_basebackup.c:2469
+#: pg_basebackup.c:2480 pg_basebackup.c:2488 pg_basebackup.c:2496
+#: pg_basebackup.c:2506 pg_basebackup.c:2519 pg_basebackup.c:2527
+#: pg_basebackup.c:2538 pg_basebackup.c:2548 pg_basebackup.c:2565
+#: pg_basebackup.c:2573 pg_basebackup.c:2581 pg_receivewal.c:605
+#: pg_receivewal.c:618 pg_receivewal.c:626 pg_receivewal.c:636
+#: pg_receivewal.c:644 pg_receivewal.c:655 pg_recvlogical.c:846
+#: pg_recvlogical.c:859 pg_recvlogical.c:870 pg_recvlogical.c:878
+#: pg_recvlogical.c:886 pg_recvlogical.c:894 pg_recvlogical.c:902
+#: pg_recvlogical.c:910 pg_recvlogical.c:918
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_basebackup.c:2456 pg_receivewal.c:616 pg_recvlogical.c:857
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_basebackup.c:2468 pg_receivewal.c:654
+#, c-format
+msgid "no target directory specified"
+msgstr "nebyl zadán cílový adresář"
+
+#: pg_basebackup.c:2479
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "pouze tar zálohy mohou být komprimované"
+
+#: pg_basebackup.c:2487
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "v tar módu s výstupem na stdout nelze streamovat write-ahead logy"
+
+#: pg_basebackup.c:2495
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "replikaÄní sloty lze použít pouze s WAL streamováním"
+
+#: pg_basebackup.c:2505
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot nelze použít spoleÄnÄ› se jménem slotu"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2517 pg_receivewal.c:634
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s vyžaduje aby byl zadán slot pomocí --slot"
+
+#: pg_basebackup.c:2526
+#, c-format
+msgid "--create-slot and --no-slot are incompatible options"
+msgstr "--create-slot a --no-slot jsou nekompatibilní volby"
+
+#: pg_basebackup.c:2537
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "umístění WAL adresáře lze zadat pouze v plain módu"
+
+#: pg_basebackup.c:2547
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "cesta k adresáři transakÄního logu musí být absolutní"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:663
+#, c-format
+msgid "this build does not support compression"
+msgstr "tento build nepodporuje kompresi"
+
+#: pg_basebackup.c:2564
+#, c-format
+#| msgid "--create-slot and --no-slot are incompatible options"
+msgid "--progress and --no-estimate-size are incompatible options"
+msgstr "--progress a --no-estimate-size jsou nekompatibilní volby"
+
+#: pg_basebackup.c:2572
+#, c-format
+#| msgid "--create-slot and --no-slot are incompatible options"
+msgid "--no-manifest and --manifest-checksums are incompatible options"
+msgstr "--no-manifest a --manifest-checksums jsou nekompatibilní volby"
+
+#: pg_basebackup.c:2580
+#, c-format
+#| msgid "--create-slot and --no-slot are incompatible options"
+msgid "--no-manifest and --manifest-force-encode are incompatible options"
+msgstr "--no-manifest a --manifest-force-encode jsou nekompatibilní volby"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "nelze vytvořit symbolický odkaz na \"%s\": %m"
+
+#: pg_basebackup.c:2643
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "na této platformě nejsou symbolické linky podporovány"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s pÅ™ijímá PostgreSQL streamované transakÄní logy\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:81
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Obecné volby:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR soubory transakÄního logu ukládej do tohoto adresáře\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:82
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN skonÄí po dosažení zadaného LSN\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:86
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists vytváření slotu neskonÄí chybou pokud slot již existuje\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:88
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop neopakovat pokus o spojení v případě selhání\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync neÄekat na bezpeÄné zapsání zmÄ›n na disk\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:93
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" Äas mezi zasíláním packetů se stavem na server (implicitnÄ›: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous vynutí flush write-ahead logu okamžitě po zapsání\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+msgstr " -Z, --compress=0-9 komprimuj logy zvolenou úrovní komprese\n"
+
+#: pg_receivewal.c:102
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Nepovinné volby:\n"
+
+#: pg_receivewal.c:103 pg_recvlogical.c:78
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot vytvoří nový replikaÄní slot (pro jméno slotu viz --slot)\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot odstraní replikaÄní slot (pro jméno slotu viz --slot)\n"
+
+#: pg_receivewal.c:117
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "dokonÄen segment na %X/%X (timeline %u)"
+
+#: pg_receivewal.c:124
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "konÄím streamování logu na %X/%X (timeline %u)"
+
+#: pg_receivewal.c:140
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "přepnuto na timeline %u v %X/%X"
+
+#: pg_receivewal.c:150
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "pÅ™ijat signál k pÅ™eruÅ¡ení, ukonÄuji"
+
+#: pg_receivewal.c:186
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "zavřít adresář \"%s\": %m"
+
+#: pg_receivewal.c:272
+#, c-format
+msgid "segment file \"%s\" has incorrect size %d, skipping"
+msgstr "segment soubor \"%s\" má neplatnou velikost %d, přeskakuji"
+
+#: pg_receivewal.c:290
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "nelze otevřít komprimovaný soubor \"%s\": %m"
+
+#: pg_receivewal.c:296
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "nelze nastavit pozici (seek) v komprimovaném souboru \"%s\": %m"
+
+#: pg_receivewal.c:304
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "nelze Äíst komprimovaný soubor \"%s\": %m"
+
+#: pg_receivewal.c:307
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "nelze Äíst komprimovaný soubor \"%s\": pÅ™eÄteno %d z %zu"
+
+#: pg_receivewal.c:318
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "komprimovaný segment soubor \"%s\" má po dekompresi neplatnou velikost %d, přeskakuji"
+
+#: pg_receivewal.c:422
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "zaÄínám streamování logu na %X/%X (timeline %u)"
+
+#: pg_receivewal.c:537 pg_recvlogical.c:762
+#, c-format
+msgid "invalid port number \"%s\""
+msgstr "neplatné Äíslo portu: \"%s\""
+
+#: pg_receivewal.c:565 pg_recvlogical.c:788
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "nelze zpracovat koncovou pozici \"%s\""
+
+#: pg_receivewal.c:625
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "nelze použít --create-slot spoleÄnÄ› s --drop-slot"
+
+#: pg_receivewal.c:643
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "nelze použít --synchronous spoleÄnÄ› s --no-sync"
+
+#: pg_receivewal.c:719
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "replikaÄní spojení používající slot \"%s\" je neoÄekávanÄ› specifické pro databázi"
+
+#: pg_receivewal.c:730 pg_recvlogical.c:966
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "odstraňuji replikaÄní slot \"%s\""
+
+#: pg_receivewal.c:741 pg_recvlogical.c:976
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "vytvářím replikaÄní slot \"%s\""
+
+#: pg_receivewal.c:767 pg_recvlogical.c:1001
+#, c-format
+msgid "disconnected"
+msgstr "odpojeno"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:773 pg_recvlogical.c:1007
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "odpojeno; Äekám %d vteÅ™in pro další pokus"
+
+#: pg_recvlogical.c:73
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s ovládá streamy PostgreSQL logického dekódování.\n"
+"\n"
+
+#: pg_recvlogical.c:77
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Akce která se má vykonat:\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE log zapisuj do tohoto souboru, - pro stdout\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" interval mezi voláním fsync na výstupním souboru (implicitně: %d)\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN kde v existujícím slotu má zaÄít streamování\n"
+
+#: pg_recvlogical.c:89
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=JMÉNO[=HODNOTA]\n"
+" předá volbu JMÉNO s nepovinnou hodnotou HODNOTA\n"
+" výstupnímu pluginu\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN použije výstupní plugin PLUGIN (implicitně: %s)\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME jméno logického replikaÄního slotu\n"
+
+#: pg_recvlogical.c:100
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME databáze ke které se připojit\n"
+
+#: pg_recvlogical.c:133
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "potvrzuji zápis až do %X/%X, flush do %X/%X (slot %s)"
+
+#: pg_recvlogical.c:157 receivelog.c:343
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "nelze zaslat packet se zpětnou vazbou: %s"
+
+#: pg_recvlogical.c:230
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "zaÄínám streamování logu na %X/%X (slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "streamování inicializováno"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "nelze otevřít log soubor \"%s\": %m"
+
+#: pg_recvlogical.c:361 receivelog.c:873
+#, c-format
+msgid "invalid socket: %s"
+msgstr "neplatný socket: %s"
+
+#: pg_recvlogical.c:414 receivelog.c:901
+#, c-format
+msgid "select() failed: %m"
+msgstr "volání select() selhalo: %m"
+
+#: pg_recvlogical.c:421 receivelog.c:951
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "nelze získat data z WAL streamu: %s"
+
+#: pg_recvlogical.c:463 pg_recvlogical.c:514 receivelog.c:995 receivelog.c:1061
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "hlaviÄka streamu je příliÅ¡ malá: %d"
+
+#: pg_recvlogical.c:498 receivelog.c:833
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "nerozpoznaná hlaviÄka streamu: \"%c\""
+
+#: pg_recvlogical.c:552 pg_recvlogical.c:564
+#, c-format
+msgid "could not write %u bytes to log file \"%s\": %m"
+msgstr "nelze zapsat %u bytů do log souboru \"%s\": %m"
+
+#: pg_recvlogical.c:618 receivelog.c:629 receivelog.c:666
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "neoÄekávané ukonÄení replikaÄního streamu: %s"
+
+#: pg_recvlogical.c:742
+#, c-format
+msgid "invalid fsync interval \"%s\""
+msgstr "neplatný fsync interval \"%s\""
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "nelze zpracovat poÄáteÄní pozici \"%s\""
+
+#: pg_recvlogical.c:869
+#, c-format
+msgid "no slot specified"
+msgstr "slot není specifikován"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "no target file specified"
+msgstr "nebyl zadán cílový soubor"
+
+#: pg_recvlogical.c:885
+#, c-format
+msgid "no database specified"
+msgstr "není specifikována databáze"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "alespoň jedna akce musí být zadána"
+
+#: pg_recvlogical.c:901
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "nelze použít use-slot nebo --start spoleÄnÄ› s --drop-slot"
+
+#: pg_recvlogical.c:909
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "nelze použít --create-slot nebo --drop-slot spoleÄnÄ› s --startpos"
+
+#: pg_recvlogical.c:917
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos může být použito pouze spoleÄnÄ› s --start"
+
+#: pg_recvlogical.c:948
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "nelze otevřít database-specific replikaÄní spojení"
+
+#: pg_recvlogical.c:1047
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "koncová pozice %X/%X dosažena keepalive"
+
+#: pg_recvlogical.c:1050
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "koncová pozice %X/%X doražena WAL záznamem na %X/%X"
+
+#: receivelog.c:69
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "nelze vytvořit soubor se stavem archivace \"%s\": %s"
+
+#: receivelog.c:116
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "nelze získat velikost write-ahead log souboru \"%s\": %s"
+
+#: receivelog.c:126
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "nelze otevřít existující soubor transakÄního logu \"%s\": %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "nelze provést fsync existujícího souboru write-ahead logu \"%s\": %s"
+
+#: receivelog.c:148
+#, c-format
+msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d"
+msgstr[0] "soubor transakÄního logu \"%s\" má %d bytů, mÄ›l by mít 0 nebo %d"
+msgstr[1] "soubor transakÄního logu \"%s\" má %d bytů, mÄ›l by mít 0 nebo %d"
+msgstr[2] "soubor transakÄního logu \"%s\" má %d bytů, mÄ›l by mít 0 nebo %d"
+
+#: receivelog.c:163
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "nelze otevřít soubor write-ahead logu \"%s\": %s"
+
+#: receivelog.c:189
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "nelze urÄit pozici pro seek v souboru \"%s\": %s"
+
+#: receivelog.c:203
+#, c-format
+msgid "not renaming \"%s%s\", segment is not complete"
+msgstr "nepřejmenovávám \"%s%s\", segment není kompletní"
+
+#: receivelog.c:215 receivelog.c:300 receivelog.c:675
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "nelze uzavřít soubor \"%s\": %s"
+
+#: receivelog.c:272
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "server ohlásil neoÄekávané jméno souboru s historií pro timeline %u: %s"
+
+#: receivelog.c:280
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "nelze vytvořit soubor s timeline historií \"%s\": %s"
+
+#: receivelog.c:287
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "nelze zapsat do souboru s timeline historií \"%s\": %s"
+
+#: receivelog.c:377
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "nekompatibilní verze serveru %s; klient nepodporuje streamování ze serverů s verzí starší než %s"
+
+#: receivelog.c:386
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "nekompatibilní verze serveru %s; klient nepodporuje streamování ze serverů s verzí novější než %s"
+
+#: receivelog.c:488 streamutil.c:430 streamutil.c:467
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "nelze identifikovat systém, naÄteno %d řádek a %d položek, oÄekáváno %d řádek a %d nebo více položek"
+
+#: receivelog.c:495
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "identifikátor systému mezi base backupem a streamovacím spojením neodpovídá"
+
+#: receivelog.c:501
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "poÄáteÄní timeline %u není pÅ™itomna na serveru"
+
+#: receivelog.c:542
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "neoÄekávaná odpovÄ›Ä na TIMELINE_HISTORY příkaz: naÄteno %d řádek a %d položek, oÄekáváno %d řádek a %d položek"
+
+#: receivelog.c:613
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "server ohlásil neoÄekávanou další timeline %u, následující timeline %u"
+
+#: receivelog.c:619
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "server pÅ™estal streamovat timeline %u at %X/%X, ale zaÄátek další timelineoznámil %u na %X/%X"
+
+#: receivelog.c:659
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "replikaÄní stream byl ukonÄen pÅ™ed bodem zastavení (stop point)"
+
+#: receivelog.c:705
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "neoÄekávaný výsledek po konci timeline: získáno %d řádek a %d položek, oÄekáváno %d řádek a %d položek"
+
+#: receivelog.c:714
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "nelze naparsovat poÄáteÄní bod další timeline \"%s\""
+
+#: receivelog.c:763 receivelog.c:1015
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "nelze provést fsync souboru \"%s\": %s"
+
+#: receivelog.c:1078
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "pÅ™ijat záznam z transakÄního logu pro offset %u bez otevÅ™eného souboru"
+
+#: receivelog.c:1088
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "získán WAL data offset %08x, oÄekáván %08x"
+
+#: receivelog.c:1122
+#, c-format
+msgid "could not write %u bytes to WAL file \"%s\": %s"
+msgstr "nelze zapsat %u bytů do WAL souboru %s: %s"
+
+#: receivelog.c:1147 receivelog.c:1187 receivelog.c:1218
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "nelze zaslat copy-end packet: %s"
+
+#: streamutil.c:160
+msgid "Password: "
+msgstr "Heslo: "
+
+#: streamutil.c:185
+#, c-format
+msgid "could not connect to server"
+msgstr "nelze se připojit k serveru"
+
+#: streamutil.c:202
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "nelze se připojit k serveru: %s"
+
+#: streamutil.c:231
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "nelze vyÄistit search_path: %s"
+
+#: streamutil.c:247
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "nelze zjistit nastavení volby integer_datetimes na serveru"
+
+#: streamutil.c:254
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes pÅ™epínaÄ kompilace neodpovídá serveru"
+
+#: streamutil.c:305
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "nelze identifikovat systém, naÄteno %d řádek a %d položek, oÄekáváno %d řádek a %d nebo více položek"
+
+#: streamutil.c:315
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "velikost WAL segmentu nelze naparsovat"
+
+#: streamutil.c:333
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale vzdálený server vrátil hodnotu %d bytů"
+msgstr[1] "velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale vzdálený server vrátil hodnotu %d byty"
+msgstr[2] "velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale vzdálený server vrátil hodnotu %d bytů"
+
+#: streamutil.c:378
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "nelze identifikovat systém, naÄteno %d řádek a %d položek, oÄekáváno %d řádek a %d nebo více položek"
+
+#: streamutil.c:387
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "flag skupinového přístupu nelze naparsovat: %s"
+
+#: streamutil.c:544
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "nelze vytvoÅ™it replikaÄní slot \"%s\": naÄteno %d řádek a %d položek, oÄekáváno %d řádek a %d položek"
+
+#: streamutil.c:588
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "nelze odstranit replikaÄní slot \"%s\": naÄteno %d řádek a %d položek, oÄekáváno %d řádek a %d položek"
+
+#: walmethods.c:438 walmethods.c:927
+msgid "could not compress data"
+msgstr "nelze komprimovat data"
+
+#: walmethods.c:470
+msgid "could not reset compression stream"
+msgstr "nelze resetovat kompresní stream"
+
+#: walmethods.c:568
+msgid "could not initialize compression library"
+msgstr "nelze inicializovat kompresní knihovnu"
+
+#: walmethods.c:580
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "chyba implementace: tar soubory nemohou mít otevřeno více než jeden soubor"
+
+#: walmethods.c:594
+msgid "could not create tar header"
+msgstr "nelze vytvoÅ™it tar hlaviÄku"
+
+#: walmethods.c:608 walmethods.c:648 walmethods.c:843 walmethods.c:854
+msgid "could not change compression parameters"
+msgstr "nelze změnit kompresní stream"
+
+#: walmethods.c:730
+msgid "unlink not supported with compression"
+msgstr "unlink není podporován s kompresí"
+
+#: walmethods.c:952
+msgid "could not close compression stream"
+msgstr "nelze uzavřít kompresní stream"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: nelze naÄíst stav souboru \"%s\": %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: nelze naÄíst adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\": %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: nelze vytvořít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not write to file \"%s\": %s\n"
+#~ msgstr "%s: nelze zapsat do souboru \"%s\": %s\n"
+
+#~ msgid "%s: could not close file \"%s\": %s\n"
+#~ msgstr "%s: nelze uzavřít soubor \"%s\": %s\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: nedostatek paměti\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s: podřízený proces neskonÄil standardnÄ›\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s: podřízený proces skonÄil s chybou %d\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: nelze vytvořit symbolický link \"%s\": %s\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s: symlinks nejsou na této platformě podporovány\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: nelze uzavřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: invalid port number \"%s\"\n"
+#~ msgstr "%s: neplatné Äíslo portu \"%s\"\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s: nelze provést fsync log souboru \"%s\": %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít logovací soubor \"%s\": %s\n"
+
+#~ msgid "%s: select() failed: %s\n"
+#~ msgstr "%s: select() selhal: %s\n"
+
+#~ msgid "%s: could not connect to server\n"
+#~ msgstr "%s: nelze se připojit k serveru\n"
+
+#~ msgid "%s: could not connect to server: %s"
+#~ msgstr "%s: nelze se připojit k serveru: %s"
+
+#~ msgid "%s: could not clear search_path: %s"
+#~ msgstr "%s: nelze vyÄistit search_path: %s"
+
+#~ msgid "%s: could not read copy data: %s\n"
+#~ msgstr "%s: nelze naÄíst copy data: %s\n"
+
+#~ msgid "%s: could not close file %s: %s\n"
+#~ msgstr "%s: nelze zavřít soubor %s: %s\n"
+
+#~ msgid "%s: could not get current position in file %s: %s\n"
+#~ msgstr "%s: nelze získat aktuální pozici v souboru %s: %s\n"
+
+#~ msgid "%s: could not pad WAL segment %s: %s\n"
+#~ msgstr "%s: nelze doplnit WAL segment %s: %s\n"
+
+#~ msgid "%s: could not stat WAL segment %s: %s\n"
+#~ msgstr "%s: nelze naÄíst stav WAL segmentu %s: %s\n"
+
+#~ msgid "%s: Could not open WAL segment %s: %s\n"
+#~ msgstr "%s: nelze otevřít WAL segment %s: %s\n"
+
+#~ msgid "%s: could not parse log start position from value \"%s\"\n"
+#~ msgstr "%s: nelze naparsovat poÄáteÄní pozici logu z hodnoty \"%s\"\n"
+
+#~ msgid "%s: could not identify system: %s\n"
+#~ msgstr "%s: nelze identifikovat systém: %s\n"
+
+#~ msgid " -v, --verbose output verbose messages\n"
+#~ msgstr " -v, --verbose vypisuj podrobnější zprávy\n"
+
+#~ msgid "%s: could not send base backup command: %s"
+#~ msgstr "%s: nelze poslat base backup příkaz: %s"
+
+#~ msgid "%s: could not identify system: %s"
+#~ msgstr "%s: nelze identifikovat systém: %s"
+
+#~ msgid "%s: invalid format of xlog location: %s\n"
+#~ msgstr "%s: neplatný formát xlog pozice: %s\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version zobraz informaci o verzi, poté skonÄi\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help zobraz tuto nápovÄ›du, poté skonÄi\n"
+
+#~ msgid "%s: timeline does not match between base backup and streaming connection\n"
+#~ msgstr "%s: timeline mezi base backupem a streamovacím spojením neodpovídá\n"
+
+#~ msgid "%s: no start point returned from server\n"
+#~ msgstr "%s: server nevráti žádný poÄáteÄní bod (start point)\n"
+
+#~ msgid "%s: could not rename file \"%s\": %s\n"
+#~ msgstr "%s: nelze přejmenovat soubor \"%s\": %s\n"
+
+#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n"
+#~ msgstr "%s: nelze skoÄit zpÄ›t na zaÄátek souboru transakÄního logu \"%s\": %s\n"
+
+#~ msgid "%s: could not pad transaction log file \"%s\": %s\n"
+#~ msgstr "%s: nelze doplnit soubor transakÄního logu \"%s\": %s\n"
+
+#~ msgid "%s: could not stat transaction log file \"%s\": %s\n"
+#~ msgstr "%s: nelze udÄ›lat stat souboru transakÄního logu \"%s\": %s\n"
+
+#~ msgid "%s: could not parse transaction log file name \"%s\"\n"
+#~ msgstr "%s: nelze naparsovat jméno souboru transakÄního logu \"%s\"\n"
+
+#~ msgid "%s: cannot specify both --xlog and --xlog-method\n"
+#~ msgstr "%s: volby --xlog a --xlog-method nelze zadat spoleÄnÄ›\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s: nelze naÄíst mód souboru\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s: nelze naÄíst velikost souboru\n"
+
+#~ msgid " -x, --xlog include required WAL files in backup (fetch mode)\n"
+#~ msgstr " -x, --xlog zahrne potřebné WAL soubory do zálohy (fetch mód)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_basebackup/po/de.po b/src/bin/pg_basebackup/po/de.po
new file mode 100644
index 0000000..3862d33
--- /dev/null
+++ b/src/bin/pg_basebackup/po/de.po
@@ -0,0 +1,1804 @@
+# German message translation file for pg_basebackup
+# Copyright (C) 2011 - 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-19 17:19+0000\n"
+"PO-Revision-Date: 2023-05-19 20:49+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "diese Installation unterstützt keine Komprimierung mit %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "leere Zeichenkette gefunden wo eine Komprimierungsoption erwartet wurde"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "unbekannte Komprimierungsoption: »%s«"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "Komprimierungsoption »%s« benötigt einen Wert"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "Wert für Komprimierungsoption »%s« muss eine ganze Zahl sein"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "Wert für Komprimierungsoption »%s« muss ein Boole’scher Wert sein"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "Komprimierungsalgorithmus »%s« akzeptiert kein Komprimierungsniveau"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "Komprimierungsalgorithmus »%s« erwartet ein Komprimierungsniveau zwischen %d und %d (Standard bei %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "Komprimierungsalgorithmus »%s« akzeptiert keine Worker-Anzahl"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "Komprimierungsalgorithmus »%s« unterstützt keinen Long-Distance-Modus"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht fsyncen: %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "konnte nicht in Datei »%s« schreiben: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht erstellen: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "unerwarteter Zustand beim Extrahieren des Archivs"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m"
+
+#: bbstreamer_file.c:344
+#, 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:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht erzeugen: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "konnte Standardausgabe nicht duplizieren: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "konnte Ausgabedatei nicht öffnen: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "konnte Komprimierungsniveau %d nicht setzen: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "konnte nicht in komprimierte Datei »%s« schreiben: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht schließen: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "konnte Daten nicht dekomprimieren: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "unerwarteter Zustand beim Einfügen der Recovery-Einstellungen"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "konnte lz4-Komprimierungskontext nicht erzeugen: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+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
+#, c-format
+msgid "could not compress data: %s"
+msgstr "konnte Daten nicht komprimieren: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "konnte lz4-Komprimierung nicht beenden: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "Tar-Datei-Trailer überschreitet 2 Blöcke"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "unerwarteter Zustand beim Parsen des Tar-Archivs"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "Tar-Mitglied hat leeren Namen"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY-Strom endete vor dem Ende der letzten Datei"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "konnte zstd-Komprimierungskontext nicht erzeugen"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "konnte zstd-Komprimierungsniveau nicht auf %d setzen: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "konnte Komprimierungs-Worker-Anzahl nicht auf %d setzen: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "konnte Long-Distance-Modus nicht einschalten: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "konnte zstd-Dekomprimierungskontext nicht erzeugen"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "entferne Datenverzeichnis »%s«"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "konnte Datenverzeichnis nicht entfernen"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "entferne Inhalt des Datenverzeichnisses »%s«"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "entferne WAL-Verzeichnis »%s«"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "konnte WAL-Verzeichnis nicht entfernen"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "Änderungen in Tablespace-Verzeichnissen werden nicht rückgängig gemacht"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "Verzeichnisname zu lang"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "mehrere »=«-Zeichen im Tablespace-Mapping"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ungültiges Tablespace-Mapping-Format »%s«, muss »ALTES_VERZ=NEUES_VERZ« sein"
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "altes Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "neues Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s erzeugt eine Basissicherung eines laufenden PostgreSQL-Servers.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Optionen die die Ausgabe kontrollieren:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=VERZ Basissicherung in dieses Verzeichnis empfangen\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t Ausgabeformat (plain (Voreinstellung), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE maximale Transferrate für Übertragung des Datenver-\n"
+" zeichnisses (in kB/s, oder Suffix »k« oder »M« abgeben)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" Konfiguration für Replikation schreiben\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=ZIEL[:DETAIL]\n"
+" Backup-Ziel (wenn nicht Client)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=ALTES_VERZ=NEUES_VERZ\n"
+" Tablespace in ALTES_VERZ nach NEUES_VERZ verlagern\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" benötigte WAL-Dateien mit angegebener Methode einbeziehen\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip Tar-Ausgabe komprimieren\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n"
+" auf Client oder Server wie angegeben komprimieren\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none Tar-Ausgabe nicht komprimieren\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allgemeine Optionen:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" schnelles oder verteiltes Checkpointing einstellen\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot Replikations-Slot erzeugen\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL Backup-Label setzen\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME zu verwendender Replikations-Slot\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" Algorithmus für Manifest-Prüfsummen\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" alle Dateinamen im Manifest hex-kodieren\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size nicht die Backup-Größe auf dem Server schätzen\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest kein Backup-Manifest erzeugen\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot keinen temporären Replikations-Slot erzeugen\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" Prüfsummen nicht überprüfen\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=VERBDG Verbindungsparameter\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT Portnummer des Datenbankservers\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVALL\n"
+" Zeit zwischen an Server gesendeten Statuspaketen (in Sekunden)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "konnte nicht aus bereiter Pipe lesen: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "konnte Write-Ahead-Log-Position »%s« nicht interpretieren"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "konnte WAL-Dateien nicht zu Ende schreiben: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "konnte Pipe für Hintergrundprozess nicht erzeugen: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "temporärer Replikations-Slot »%s« wurde erzeugt"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "Replikations-Slot »%s« wurde erzeugt"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "konnte Hintergrundprozess nicht erzeugen: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "konnte Hintergrund-Thread nicht erzeugen: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "Verzeichnis »%s« existiert aber ist nicht leer"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d Tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d Tablespaces %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "Transferrate »%s« ist kein gültiger Wert"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "ungültige Transferrate »%s«: %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "Transferrate muss größer als null sein"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "ungültige Einheit für --max-rate: »%s«"
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "Transferrate »%s« überschreitet Bereich für ganze Zahlen"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "Transferrate »%s« ist außerhalb des gültigen Bereichs"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "konnte COPY-Datenstrom nicht empfangen: %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "konnte COPY-Daten nicht lesen: %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "Hintergrundprozess beendete unerwartet"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "Manifest kann nicht in eine komprimierte Tar-Datei eingefügt werden"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Verwenden Sie clientseitige Komprimierung, senden Sie die Ausgabe in ein Verzeichnis statt auf die Standardausgabe, oder verwenden Sie %s."
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "kann Archiv »%s« nicht parsen"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Nur Tar-Archive können geparst werden."
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Format »plain« benötigt pg_basebackup, um das Archiv zu parsen."
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Wenn - als Ausgabeverzeichnis verwendet wird, wird pg_basebackup benötigt, um das Archiv zu parsen."
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Die Option -R benötigt pg_basebackup, um das Archiv zu parsen."
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "Archive müssen vor dem Manifest kommen"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "ungültiger Archivname: »%s«"
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "unerwartete Payload-Daten"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "leere COPY-Nachricht"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "fehlerhafte COPY-Nachricht vom Typ %d, Länge %zu"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "inkompatible Serverversion %s"
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Verwenden Sie -X none oder -X fetch, um Log-Streaming abzuschalten."
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "Backup-Ziele werden von dieser Serverversion nicht unterstützt"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "Recovery-Konfiguration kann nicht geschrieben werden, wenn ein Backup-Ziel verwendet wird"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "Server unterstützt keine serverseitige Komprimierung"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "Basissicherung eingeleitet, warte auf Abschluss des Checkpoints"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "Warten auf Checkpoint"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "konnte Replikationsbefehl »%s« nicht senden: %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "konnte Basissicherung nicht starten: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "unerwartete Antwort auf Befehl BASE_BACKUP: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "Checkpoint abgeschlossen"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "Write-Ahead-Log-Startpunkt: %s auf Zeitleiste %u"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "konnte Kopf der Sicherung nicht empfangen: %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "keine Daten vom Server zurückgegeben"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "kann nur einen einzelnen Tablespace auf die Standardausgabe schreiben, Datenbank hat %d"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "Hintergrund-WAL-Receiver wird gestartet"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "Backup fehlgeschlagen: %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "keine Write-Ahead-Log-Endposition vom Server zurückgegeben"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "Write-Ahead-Log-Endposition: %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "ein Prüfsummenfehler ist aufgetreten"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "letztes Empfangen fehlgeschlagen: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "warte bis Hintergrundprozess Streaming beendet hat ..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "konnte Befehl nicht an Hintergrund-Pipe senden: %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "konnte nicht auf Kindprozess warten: %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "Kindprozess %d endete, aber %d wurde erwartet"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "konnte nicht auf Kind-Thread warten: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "konnte Statuscode des Kind-Threads nicht ermitteln: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "Kind-Thread hat mit Fehler %u beendet"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "synchronisiere Daten auf Festplatte ..."
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "umbenennen von backup_manifest.tmp nach backup_manifest"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "Basissicherung abgeschlossen"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "ungültiges Checkpoint-Argument »%s«, muss »fast« oder »spread« sein"
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "ungültiges Ausgabeformat »%s«, muss »plain« oder »tar« sein"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "ungültige Option »%s« für --wal-method, muss »fetch«, »stream« oder »none« sein"
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "Format und Backup-Ziel können nicht beide angegeben werden"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "Ausgabeverzeichnis oder Backup-Ziel muss angegeben werden"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "Ausgabeverzeichnis und Backup-Ziel können nicht beide angegeben werden"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "unbekannter Komprimierungsalgorithmus: »%s«"
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ungültige Komprimierungsangabe: %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "clientseitige Komprimierung ist nicht möglich, wenn ein Backup-Ziel angegeben ist"
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "nur Sicherungen im Tar-Modus können komprimiert werden"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "WAL-Streaming ist nicht möglich, wenn ein Backup-Ziel angegeben ist"
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "im Tar-Modus können Write-Ahead-Logs nicht auf Standardausgabe geschrieben werden"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "Replikations-Slots können nur mit WAL-Streaming verwendet werden"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot kann nicht zusammen mit einem Slot-Namen verwendet werden"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "für %s muss ein Slot mit --slot angegeben werden"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s und %s sind inkompatible Optionen"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WAL-Verzeichnis kann nicht zusammen mit einem Backup-Ziel angegeben werden"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL-Verzeichnis kann nur im »plain«-Modus angegeben werden"
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-Verzeichnis muss absoluten Pfad haben"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s empfängt PostgreSQL-Write-Ahead-Logs.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=VERZ Write-Ahead-Log-Dateien in dieses Verzeichnis empfangen\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN nach Empfang der angegebenen LSN beenden\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists keinen Fehler ausgeben, wenn Slot beim Erzeugen schon existiert\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop bei Verbindungsverlust nicht erneut probieren\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEK\n"
+" Zeit zwischen an Server gesendeten Statuspaketen (Standard: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous Write-Ahead-Log sofort nach dem Schreiben flushen\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHODE[:DETAIL]\n"
+" wie angegeben komprimieren\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Optionale Aktionen:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot neuen Replikations-Slot erzeugen (Slot-Name siehe --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot Replikations-Slot löschen (Slot-Name siehe --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "Segment bei %X/%X abgeschlossen (Zeitleiste %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "Log-Streaming gestoppt bei %X/%X (Zeitleiste %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "auf Zeitleiste %u umgeschaltet bei %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "Interrupt-Signal erhalten, beende"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "Segmentdatei »%s« hat falsche Größe %lld, wird übersprungen"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht öffnen: %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "konnte Positionszeiger in komprimierter Datei »%s« nicht setzen: %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "konnte komprimierte Datei »%s« nicht lesen: %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %d, wird übersprungen"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "konnte LZ4-Dekomprimierungskontext nicht erzeugen: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht dekomprimieren: %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "konnte LZ4-Dekomprimierungskontext nicht freigeben: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %zu, wird übersprungen"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "kann Datei »%s« nicht prüfen: Komprimierung mit %s wird von dieser Installation nicht unterstützt"
+
+#: pg_receivewal.c:578
+#, c-format
+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:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "konnte Endposition »%s« nicht parsen"
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot kann nicht zusammen mit --drop-slot verwendet werden"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous kann nicht zusammen mit --no-sync verwendet werden"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "kein Zielverzeichnis angegeben"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "Komprimierung mit %s wird noch nicht unterstützt"
+
+#: pg_receivewal.c:859
+#, c-format
+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:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "lösche Replikations-Slot »%s«"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "erzeuge Replikations-Slot »%s«"
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "Verbindung beendet"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "Verbindung beendet; erneuter Versuch in %d Sekunden"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s kontrolliert logische Dekodierungsströme von PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Auszuführende Aktion:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start Streaming in einem Replikations-Slot starten (Slot-Name siehe --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=DATEI Log in diese Datei empfangen, - für Standardausgabe\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SEK\n"
+" Zeit zwischen Fsyncs der Ausgabedatei (Standard: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN wo in einem bestehenden Slot das Streaming starten soll\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=WERT]\n"
+" Option NAME mit optionalem Wert WERT an den\n"
+" Ausgabe-Plugin übergeben\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN Ausgabe-Plugin PLUGIN verwenden (Standard: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME Name des logischen Replikations-Slots\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr ""
+" -t, --two-phase Dekodieren von vorbereiteten Transaktionen beim Erzeugen\n"
+" eines Slots einschalten\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME Datenbank, mit der verbunden werden soll\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "bestätige Schreiben bis %X/%X, Flush bis %X/%X (Slot %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "konnte Rückmeldungspaket nicht senden: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "starte Log-Streaming bei %X/%X (Slot %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "Streaming eingeleitet"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "ungültiges Socket: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "konnte keine Daten vom WAL-Stream empfangen: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "Streaming-Header zu klein: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "unbekannter Streaming-Header: »%c«"
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, 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:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "unerwarteter Abbruch des Replikations-Streams: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "konnte Startposition »%s« nicht parsen"
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "kein Slot angegeben"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "keine Zieldatei angegeben"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "keine Datenbank angegeben"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "mindestens eine Aktion muss angegeben werden"
+
+#: pg_recvlogical.c:884
+#, 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:891
+#, 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:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos kann nur zusammen mit --start angegeben werden"
+
+#: pg_recvlogical.c:905
+#, 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:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "konnte keine datenbankspezifische Replikationsverbindung herstellen"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "Endposition %X/%X durch Keepalive erreicht"
+
+#: pg_recvlogical.c:1035
+#, 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"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "konnte Archivstatusdatei »%s« nicht schließen: %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "konnte Größe der Write-Ahead-Log-Datei »%s« nicht ermittlen: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "konnte bestehende Write-Ahead-Log-Datei »%s« nicht öffnen: %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "konnte bestehende Write-Ahead-Log-Datei »%s« nicht fsyncen: %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "Write-Ahead-Log-Datei »%s« hat %zd Byte, sollte 0 oder %d sein"
+msgstr[1] "Write-Ahead-Log-Datei »%s« hat %zd Bytes, sollte 0 oder %d sein"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "konnte Write-Ahead-Log-Datei »%s« nicht öffnen: %s"
+
+#: receivelog.c:216
+#, c-format
+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
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht schließen: %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "Server berichtete unerwarteten History-Dateinamen für Zeitleiste %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "konnte Zeitleisten-History-Datei »%s« nicht erzeugen: %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "konnte Zeitleisten-History-Datei »%s« nicht schreiben: %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "inkompatible Serverversion %s; Client unterstützt Streaming nicht mit Serverversionen älter als %s"
+
+#: receivelog.c:403
+#, c-format
+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
+#, 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
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "Startzeitleiste %u ist auf dem Server nicht vorhanden"
+
+#: receivelog.c:555
+#, 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
+#, 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
+#, 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
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "Replikationsstrom wurde vor Stopppunkt abgebrochen"
+
+#: receivelog.c:718
+#, 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
+#, 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:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht fsyncen: %s"
+
+#: receivelog.c:1083
+#, 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
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "WAL-Daten-Offset %08x erhalten, %08x erwartet"
+
+#: receivelog.c:1128
+#, 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
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "konnte COPY-Ende-Paket nicht senden: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Passwort: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "konnte nicht mit Server verbinden"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "konnte search_path nicht auf leer setzen: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "konnte Servereinstellung für integer_datetimes nicht ermitteln"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "Kompilieroption »integer_datetimes« stimmt nicht mit Server überein"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "konnte WAL-Segmentgröße nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL-Segmentgröße konnte nicht interpretiert werden"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Byte an"
+msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Bytes an"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "konnte Gruppenzugriffseinstellung nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "Gruppenzugriffseinstellung konnte nicht interpretiert werden: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+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:510
+#, 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:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "Replikations-Slot »%s« existiert nicht"
+
+#: streamutil.c:533
+#, 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:547
+#, 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:664
+#, 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:708
+#, 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"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "konnte Daten nicht komprimieren"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "konnte Komprimierungsstrom nicht zurücksetzen"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "Implementierungsfehler: Tar-Dateien können nicht mehr als eine offene Datei haben"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "konnte Tar-Dateikopf nicht erzeugen"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "konnte Komprimierungsparameter nicht ändern"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "Unlink wird bei Komprimierung nicht unterstützt"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "konnte Komprimierungsstrom nicht schließen"
diff --git a/src/bin/pg_basebackup/po/el.po b/src/bin/pg_basebackup/po/el.po
new file mode 100644
index 0000000..c75216c
--- /dev/null
+++ b/src/bin/pg_basebackup/po/el.po
@@ -0,0 +1,1846 @@
+# Greek message translation file for pg_basebackup
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:18+0000\n"
+"PO-Revision-Date: 2023-08-15 13:17+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "η παÏοÏσα κατασκευή δεν υποστηÏίζει συμπίεση με %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "βÏέθηκε κενή συμβολοσειÏά όπου αναμενόταν μια επιλογή συμπίεσης"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "μη αναγνωÏίσιμη παÏάμετÏος συμπίεσης: «%s»"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "η επιλογή συμπίεσης «%s» απαιτεί τιμή"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "η τιμή της επιλογής συμπίεσης «%s» Ï€Ïέπει να είναι ακέÏαια"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "η τιμή της επιλογής συμπίεσης «%s» Ï€Ïέπει να είναι Δυαδική τιμή"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν δέχεται επίπεδο συμπίεσης"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» αναμένει ένα επίπεδο συμπίεσης Î¼ÎµÏ„Î±Î¾Ï %d και %d (Ï€Ïοεπιλογμένο %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν δέχεται μέγεθος εÏγατών"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν υποστηÏίζει λειτουÏγία μεγάλων αποστάσεων"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αÏχείο «%s»: %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετονομασία του αÏχείου «%s» σε «%s»: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή στο αÏχείο «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία αÏχείου «%s»: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "μη αναμενόμενη κατάσταση κατά την εξαγωγή αÏχειοθήκης"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… από «%s» σε «%s»: %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "δεν ήταν δυνατός ο οÏισμός δικαιωμάτων στο αÏχείο «%s»: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία συμπιεσμένου αÏχείου «%s»: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "δεν ήταν δυνατή η αναπαÏαγωγή τυπικής εξόδου: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου εξόδου %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση επιπέδου συμπίεσης %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή σε συμπιεσμένο αÏχείο «%s»: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του συμπιεσμένου αÏχείου «%s»: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση της βιβλιοθήκης συμπίεσης"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "απÏοσδόκητη κατάσταση κατά την έγχυση Ïυθμίσεων αποκατάστασης"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "δεν ήταν δυνατή η δημιουÏγία lz4 πεÏιεχομένου συμπίεσης: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή κεφαλίδας lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "δεν ήταν δυνατός ο τεÏματισμός συμπίεσης lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση της βιβλιοθήκης συμπίεσης: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "το αÏχείο tar υπεÏβαίνει τα 2 μπλοκ"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "μη αναμενόμενη κατάσταση κατά την ανάλυση αÏχειοθήκης tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "το μέλος tar έχει κενό όνομα"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "η Ïοή COPY τεÏματίστηκε Ï€Ïιν ολοκληÏωθεί το τελευταίο αÏχείο"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "δεν ήταν δυνατή η δημιουÏγία zstd πεÏιεχομένου συμπίεσης"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση επιπέδου συμπίεσης zstd σε %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση αÏÎ¹Î¸Î¼Î¿Ï ÎµÏγατών συμπίεσης %d: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "δεν δÏναται να ενεÏγοποιήσει τη λειτουÏγία μεγάλων αποστάσεων: «%s»"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "δεν ήταν δυνατή η δημιουÏγία zstd πεÏιεχομένου αποσυμπίεσης"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "αφαιÏείται ο κατάλογος δεδομένων «%s»"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "απέτυχε η αφαίÏεση καταλόγου δεδομένων"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "αφαιÏοÏνται πεÏιεχόμενα του καταλόγου δεδομένων «%s»"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "απέτυχε η αφαίÏεση πεÏιεχομένων του καταλόγου δεδομένων"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "αφαίÏεση καταλόγου WAL «%s»"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "απέτυχε η αφαίÏεση καταλόγου WAL"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "αφαιÏοÏνται τα πεÏιεχόμενα του καταλόγου WAL «%s»"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "απέτυχε η αφαίÏεση πεÏιεχόμενων του καταλόγου WAL"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ο κατάλογος δεδομένων «%s» δεν αφαιÏείται κατα απαίτηση του χÏήστη"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "κατάλογος WAL «%s» δεν αφαιÏέθηκε κατά απαίτηση του χÏήστη"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "οι αλλαγές στους καταλόγους πινακοχώÏων δεν θα αναιÏεθοÏν"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ ÏŒÎ½Î¿Î¼Î± καταλόγου"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "πολλαπλά σÏμβολα \"=\" στην αντιστοίχιση πινακοχώÏου"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "μη έγκυÏη μοÏφή αντιστοίχισης πινακοχώÏου «%s», Ï€Ïέπει να είναι «OLDDIR=NEWDIR»"
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "ο παλιός κατάλογος δεν είναι απόλυτη διαδÏομή στην αντιστοίχιση πινακοχώÏου: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "ο νέος κατάλογος δεν είναι μια απόλυτη διαδÏομή στην αντιστοίχιση πινακοχώÏου: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s λαμβάνει ένα αντίγÏαφο ασφαλείας βάσης ενός διακομιστή PostgreSQL που εκτελείται.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Επιλογές που ελέγχουν το πεÏιεχόμενο εξόδου:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY λάβε το αντίγÏαφο ασφαλείας βάσης στον κατάλογο\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t μοÏφή εξόδου (απλή (Ï€Ïοεπιλογή), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE μέγιστος Ïυθμός μεταφοÏάς για τη μεταφοÏά καταλόγου δεδομένων\n"
+" (σε kB/s, ή χÏησιμοποιήστε το επίθημα «k» ή «M»)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" εγγÏαφή των Ïυθμίσεων αναπαÏαγωγής\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" Ï€ÏοοÏισμός αντιγÏάφων ασφαλείας (εάν είναι άλλος από τον πελάτη)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" μετακίνησε τον πινακοχώÏο από OLDDIR σε NEWDIR\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" πεÏιέλαβε τα απαιτοÏμενα αÏχεία WAL με την οÏισμένη μέθοδο\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip συμπίεσε την έξοδο tar\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" συμπίεσε στον πελάτη ή στον διακομιστή όπως οÏίζεται\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr ""
+" -Z, --compress=none να μην συμπιέσει την έξοδο tar\n"
+"\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Γενικές επιλογές:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" ÏŒÏισε fast ή spread λειτουÏγία λήψης σημείων ελέγχου\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot δημιοÏÏγησε υποδοχή αναπαÏαγωγής\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL ÏŒÏισε ετικέτα αντιγÏάφου ασφαλείας\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean να μην καθαÏιστοÏν σφάλματα\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME υποδοχή αναπαÏαγωγής για χÏήση\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose πεÏιφÏαστικά μηνÏματα εξόδου\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" χÏησιμοποίησε αυτόν τον αλγόÏιθμο για τα αθÏοίσματα ελέγχου διακήÏυξης\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" χÏήση δεκαεξαδικής κωδικοποίησης για όλα\n"
+" τα ονόματα αÏχείων στη διακήÏυξη\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size να μην εκτιμήσει το μέγεθος του αντιγÏάφου ασφαλείας στην πλευÏά του διακομιστή\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest κατάστειλε τη δημιουÏγία της διακήÏυξης αντιγÏάφων ασφαλείας\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot εμπόδισε την δημιουÏγία Ï€ÏοσωÏινής υποδοχής αναπαÏαγωγής\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" να μην επιβεβαιώσει τα αθÏοίσματα ελέγχου\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σÏνδεσης:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR συμβολοσειÏά σÏνδεσης\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" χÏόνος Î¼ÎµÏ„Î±Î¾Ï Î±Ï€Î¿ÏƒÏ„Î¿Î»Î®Ï‚ πακέτων κατάστασης στον διακομιστή (σε δευτεÏόλεπτα)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME σÏνδεση ως ο οÏισμένος χÏήστης βάσης δεδομένων\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης (Ï€Ïέπει να συμβεί αυτόματα)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από έτοιμη pipe: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της τοποθεσίας write-ahead log «%s»"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "δεν ήταν δυνατός ο τεÏματισμός εγγÏαφής αÏχείων WAL: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία pipe για διεÏγασίες παÏασκηνίου : %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "δημιουÏγήθηκε Ï€ÏοσωÏινή υποδοχή αναπαÏαγωγής «%s»"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "δημιουÏγήθηκε υποδοχή αναπαÏαγωγής «%s»"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία διαδικασίας παÏασκηνίου: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία νήματος παÏασκηνίου: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ο κατάλογος «%s» υπάÏχει και δεν είναι άδειος"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του καταλόγου «%s»: %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d πινακοχώÏος %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d πινακοχώÏοι %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d πινακοχώÏος (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d πινακοχώÏοι (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d πινακοχώÏος"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d πινακοχώÏοι"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "η τιμή ÏÏ…Î¸Î¼Î¿Ï Î¼ÎµÏ„Î±Ï†Î¿Ïάς «%s» δεν είναι έγκυÏη"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "μη έγκυÏος Ïυθμός μεταφοÏάς «%s»: %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "ο Ïυθμός μεταφοÏάς Ï€Ïέπει να είναι μεγαλÏτεÏος από μηδέν"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "μη έγκυÏη μονάδα --max-rate: «%s»"
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "ο Ïυθμός μεταφοÏάς «%s» υπεÏβαίνει το εÏÏος ακεÏαίων"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "ο Ïυθμός μεταφοÏάς «%s» βÏίσκεται εκτός εÏÏους τιμών"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "δεν ήταν δυνατή η λήψη Ïοής δεδομένων COPY: %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "δεν ήταν δυνατή η ανάγνωση δεδομένων COPY: %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "διεÏγασία παÏασκηνίου τεÏματίστηκε απÏόσμενα"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "δεν είναι δυνατή η έγχυση διακÏÏηξης σε συμπιεσμένο αÏχείο tarfile"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "ΧÏησιμοποιήστε συμπίεση από την πλευÏά του πελάτη, στείλτε την έξοδο σε έναν κατάλογο αντί για την τυπική έξοδο, ή χÏησιμοποιήστε %s."
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση αÏχειοθήκης «%s»"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Μόνο οι αÏχειοθήκες tar μποÏοÏν να συμπιεστοÏν."
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Η απλή μοÏφή απαιτεί pg_basebackup για την ανάλυση του αÏχείου."
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Η χÏήση του - ως καταλόγου εξόδου απαιτεί την ανάλυση του αÏχείου από το pg_basebackup."
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Η επιλογή -R απαιτεί pg_basebackup για την ανάλυση του αÏχείου."
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "τα αÏχεία Ï€Ïέπει να Ï€ÏοηγοÏνται του μανιφέστου"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "άκυÏη ονομασία αÏχειοθήκης «%s»"
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "μη αναμενόμενα δεδομένα φοÏτίου"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "κενό μήνυμα COPY"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "κακοσχηματισμένο μήνυμα COPY Ï„Ïπου %d, μήκους %zu"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "μη συμβατή έκδοση διακομιστή %s"
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "ΧÏησιμοποίησε -X none ή -X fetch για την απενεÏγοποίηση της Ïοής καταγÏαφής."
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "οι στόχοι αντιγÏάφων ασφαλείας δεν υποστηÏίζονται από αυτήν την έκδοση διακομιστή"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "δεν είναι δυνατή η σÏνταξη αÏχείου Ïυθμίσεων αποκατάστασης όταν χÏησιμοποιείται Ï€ÏοοÏισμός αντιγÏάφων ασφαλείας"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "ο διακομιστής δεν υποστηÏίζει συμπίεση από την πλευÏά του διακομιστή"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "έναÏξη δημιουÏγίας αντιγÏάφων ασφαλείας βάσης, αναμονή ολοκλήÏωσης του σημείου ελέγχου"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "αναμονή για το σημείο ελέγχου"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "δεν ήταν δυνατή η αποστολή εντολής αναπαÏαγωγής «%s»: %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "δεν ήταν δυνατή η έναÏξη αντιγÏάφου ασφαλείας βάσης: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "ο διακομιστής επέστÏεψε μη αναμενόμενη απόκÏιση στην εντολή BASE_BACKUP· έλαβε %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d πεδία"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "ολοκληÏώθηκε το σημείο ελέγχου"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "σημείο εκκίνησης write-ahead: %s στην χÏονογÏαμμή %u"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "δεν ήταν δυνατή η απόκτηση κεφαλίδας αντιγÏάφου ασφαλείας: %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "δεν επιστÏάφηκαν δεδομένα από τον διακομιστή"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "μποÏεί να γÏάψει μόνο έναν πινακοχώÏο στην τυπική έξοδο, η βάση δεδομένων διαθέτει %d"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "εκκίνηση λήψης WAL στο παÏασκήνιο"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "η δημιουÏγία αντιγÏάφων ασφαλείας απέτυχε: %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "δεν επιστÏάφηκε τελική θέση write-ahead log από τον διακομιστή"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "τελικό σημείο write-ahead log: %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "Ï€Ïοέκυψε σφάλμα αθÏοίσματος ελέγχου"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "απέτυχε η τελική λήψη: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "αναμένει τη διαδικασία παÏασκηνίου να ολοκληÏώσει τη Ïοή ..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "δεν ήταν δυνατή η αποστολή της εντολής σε pipe παÏασκηνίου: %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "δεν ήταν δυνατή η αναμονή απογονικής διεÏγασίας: %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "απόγονος %d πέθανε, ανέμενε %d"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "δεν ήταν δυνατή η αναμονή Î±Ï€Î¿Î³Î¿Î½Î¹ÎºÎ¿Ï Î½Î®Î¼Î±Ï„Î¿Ï‚: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "δεν ήταν δυνατή η απόκτηση κατάστασης εξόδου Î±Ï€Î¿Î³Î¿Î½Î¹ÎºÎ¿Ï Î½Î®Î¼Î±Ï„Î¿Ï‚: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "το απογονικό νήμα εξήλθε με σφάλμα %u"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "συγχÏονίζονται δεδομένα στο δίσκο …"
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "μετονομάζει backup_manifest.tmp σε backup_manifest"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "ολοκληÏώθηκε το αντίγÏαφο ασφαλείας βάσης"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "μη έγκυÏη παÏάμετÏος σημείου ελέγχου «%s», Ï€Ïέπει να είναι «fast» ή «spread»"
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "μη έγκυÏη μοÏφή εξόδου «%s», Ï€Ïέπει να είναι «plain» ή «tar»"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "μη έγκυÏη επιλογή μεθόδου wal «%s», Ï€Ïέπει να είναι «fetch», «stream», ή «none»"
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "δεν είναι δυνατός ο καθοÏισμός τόσο ενός ονόματος βάσης δεδομένων όσο και στόχου αντιγÏάφων ασφαλείας"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "Ï€Ïέπει να καθοÏίσετε τον κατάλογο εξόδου ή το στόχο δημιουÏγίας αντιγÏάφων ασφαλείας"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "δεν είναι δυνατός ο καθοÏισμός τόσο του καταλόγου εξόδου όσο και του Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î±Î½Ï„Î¹Î³Ïάφων ασφαλείας"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "μη αναγνωÏίσιμος αλγόÏιθμος συμπίεσης: «%s»"
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή συμπίεσης: %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "η συμπίεση από την πλευÏά του πελάτη δεν είναι δυνατή όταν έχει καθοÏιστεί ένας στόχος δημιουÏγίας αντιγÏάφων ασφαλείας"
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "μόνο τα αντίγÏαφα ασφαλείας tar μποÏοÏν να συμπιεστοÏν"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "δεν είναι δυνατή η Ïοή WAL όταν καθοÏίζεται στόχος αντιγÏάφου ασφαλείας"
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "δεν είναι δυνατή η Ïοή write-ahead logs σε λειτουÏγία tar στην τυπική έξοδο"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "οι υποδοχές αναπαÏαγωγής μποÏοÏν να χÏησιμοποιηθοÏν μόνο με Ïοή WAL"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot δεν μποÏεί να χÏησιμοποιηθεί σε συνδυασμό με όνομα υποδοχής"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s χÏειάζεται να έχει οÏιστεί μία υποδοχή με --slot"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s και %s αποτελοÏν μη συμβατές επιλογές"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "η τοποθεσία του καταλόγου WAL δεν μποÏεί να καθοÏιστεί μαζί με στόχο αντιγÏάφου ασφαλείας"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "η τοποθεσία του καταλόγου WAL μποÏεί να καθοÏιστεί μόνο σε λειτουÏγία plain"
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "η τοποθεσία του καταλόγου WAL Ï€Ïέπει να είναι μία πλήÏης διαδÏομή"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s λαμβάνει Ïοές PostgreSQL write-ahead logs.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR να λάβει αÏχεία write-ahead log files into this directory\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN έξοδος μετά τη λήψη του καθοÏισμένου LSN\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists μην θεωÏηθεί ÏŽÏ‚ σφάλμα η ήδη ÏπαÏξη υποδοχής κατά τη δημιουÏγία μιας υποδοχής\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop να μην εισέλθει σε βÏόχο κατά την απώλεια σÏνδεσης\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" χÏόνος Î¼ÎµÏ„Î±Î¾Ï Ï€Î±ÎºÎ­Ï„Ï‰Î½ κατάστασης που αποστέλλονται στο διακομιστή (Ï€Ïοεπιλογή: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous flush write-ahead log αμέσως μετά τη γÏαφή\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" συμπίεσε όπως οÏίζεται\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"ΠÏοαιÏετικές δÏάσεις:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot δημιοÏÏγησε μια νέα υποδοχή αναπαÏαγωγής (για το όνομα της υποδοχής, δείτε --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot εγκατάληψη της υποδοχής αναπαÏαγωγής (για το όνομα της υποδοχής δείτε --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "τελείωσε το τμήμα σε %X/%X (χÏονογÏαμμή %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "διακοπή Ïοής αÏχείων καταγÏαφής σε %X/%X (χÏονογÏαμμή %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "μεταπήδησε στη χÏονογÏαμμή %u στο %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "λήψη σήματος διακοπής, έξοδος"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "το αÏχείο τμήματος «%s» έχει εσφαλμένο μέγεθος %lld, θα παÏαληφθεί"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του συμπιεσμένου αÏχείου «%s»: %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο συμπιεσμένο αÏχείο «%s»: %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμπιεσμένου αÏχείου «%s»: %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "δεν ήταν δυνατή η ανάγνωση του συμπιεσμένου αÏχείου «%s»: ανέγνωσε %d από %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "συμπιεσμένο αÏχείο τμήματος «%s» έχει εσφαλμένο μη συμπιεσμένο μέγεθος %d, θα παÏαληφθεί"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "δεν ήταν δυνατή η δημιουÏγία LZ4 πεÏιεχομένου αποσυμπίεσης: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η αποσυμπιέση αÏχείου «%s»: %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "δεν ήταν δυνατή η απελευθέÏωση LZ4 πεÏιεχομένου αποσυμπίεσης: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "συμπιεσμένο αÏχείο τμήματος «%s» έχει εσφαλμένο μη συμπιεσμένο μέγεθος %zu, θα παÏαληφθεί"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "δεν είναι δυνατός ο έλεγχος του αÏχείου «%s»: η συμπίεση με %s δεν υποστηÏίζεται από αυτήν την κατασκευή"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "έναÏξη Ïοής αÏχείων καταγÏαφής σε %X/%X (χÏονογÏαμμή %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της τελικής τοποθεσίας «%s»"
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "δεν είναι δυνατή η χÏήση --create-slot σε συνδυασμό με --drop-slot"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "δεν είναι δυνατή η χÏήση --synchronous σε συνδυασμό με --no-sync"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "δεν καθοÏίστηκε κατάλογος δεδομένων Ï€ÏοοÏισμοÏ"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "η συμπίεση με %s δεν υποστηÏίζεται ακόμα"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "η σÏνδεση αναπαÏαγωγής χÏησιμοποιώντας την υποδοχή «%s» είναι απÏοσδόκητα συνυφασμένη με βάση δεδομένων"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "κατάÏγηση υποδοχής αναπαÏαγωγής «%s»"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "δημιουÏγία υποδοχής αναπαÏαγωγής «%s»"
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "αποσυνδέθηκε"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "αποσυνδέθηκε· αναμένει %d δεÏτεÏα για να Ï€Ïοσπαθήσει ξανά"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s ελέγχει Ïοές λογικής αποκωδικοποίησης PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"ΔÏάση που θα Ï€Ïαγματοποιηθεί:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start εκκίνηση Ïοής σε μια υποδοχή αναπαÏαγωγής (για το όνομα της υποδοχής δείτε --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE λάβε το log σε αυτό το αÏείο, - για τυπική έξοδο\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" χÏόνος Î¼ÎµÏ„Î±Î¾Ï fsyncs του αÏχείου εξόδου (Ï€Ïοεπιλογή: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN από Ï€Î¿Ï Î¸Î± ξεκινήσει η Ïοή σε μια υπάÏχουσα υποδοχή\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" πέÏασε την επιλογή NAME με Ï€ÏοαιÏετική τιμή VALUE στο\n"
+" plugin εξόδου\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN χÏησιμοποίησε το plugin εξόδου PLUGIN (Ï€Ïοεπιλογή: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME όνομα της λογικής υποδοχής αναπαÏαγωγής\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase ενεÏγοποιήσε την αποκωδικοποίηση των Ï€Ïοετοιμασμένων συναλλαγών κατά τη δημιουÏγία μιας υποδοχής\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για να συνδεθεί\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "επιβεβαίωση εγγÏαφής έως %X/%X, flush σε %X/%X (υποδοχή %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "δεν ήταν δυνατή η αποστολή πακέτου σχολίων: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "έναÏξη Ïοής αÏχείων καταγÏαφής σε %X/%X (υποδοχή %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "έναÏξη Ïοής"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου καταγÏαφής «%s»: %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "άκυÏος υποδοχέας: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "δεν ήταν δυνατή η λήψη δεδομένων από τη Ïοή WAL: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "Ï€Î¿Î»Ï Î¼Î¹ÎºÏή κεφαλίδα Ïοής: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "μη αναγνωÏίσιμη κεφαλίδα Ïοής: «%c»"
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή %d bytes στο αÏχείο καταγÏαφής «%s»: %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "μη αναμενόμενος τεÏματισμός της Ïοής αναπαÏαγωγής: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της θέσης έναÏξης «%s»"
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "δεν καθοÏίστηκε υποδοχή"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "δεν καθοÏίστηκε αÏχείο Ï€ÏοοÏισμοÏ"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "δεν καθοÏίστηκε βάση δεδομένων"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "Ï€Ïέπει να οÏιστεί τουλάχιστον μία Ï€Ïάξη"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "δεν είναι δυνατή η χÏήση --create-slot ή --start σε συνδυασμό με --drop-slot"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "δεν είναι δυνατή η χÏήση --create-slot ή --start σε συνδυασμό με --startpos"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos μποÏεί να καθοÏιστεί μόνο με --start"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase μποÏεί να καθοÏιστεί μόνο με --create-slot"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "δεν ήταν δυνατή η δημιουÏγία σÏνδεσης αναπαÏαγωγής συγκεκÏιμένης βάσης δεδομένων"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "τελική θέση %X/%X που επιτεÏχθηκε από keepalive"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "τελική θέση %X/%X που επιτεÏχθηκε από εγγÏαφή WAL στο %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η δημιουÏγία αÏχείου κατάστασης αÏχειοθήκης «%s»: %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου κατάστασης αÏχειοθήκης «%s»: %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η απόκτηση μεγέθους του υπάÏχοντος αÏχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το άνοιγμα του υπάÏχοντος αÏχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το fsync του υπάÏχοντος αÏχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "το αÏχείο write-ahead log «%s» έχει %zd byte, θα έπÏεπε να είναι 0 ή %d"
+msgstr[1] "το αÏχείο write-ahead log «%s» έχει %zd bytes, θα έπÏεπε να είναι 0 ή %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου write-ahead log «%s»: %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "δεν μετονομάζει «%s», το τμήμα δεν είναι πλήÏες"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "ο διακομιστής ανέφεÏε μη αναμενόμενο όνομα αÏχείου ιστοÏÎ¹ÎºÎ¿Ï Î³Î¹Î± την χÏονογÏαμμή %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η δημιουÏγία αÏχείου ιστοÏÎ¹ÎºÎ¿Ï Ï‡ÏονογÏαμμής «%s»: %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου ιστοÏÎ¹ÎºÎ¿Ï Ï‡ÏονογÏαμμής «%s»: %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "μη συμβατή έκδοση διακομιστή %s· Ο πελάτης δεν υποστηÏίζει Ïοή από εκδόσεις διακομιστών παλαιότεÏες από %s"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "μη συμβατή έκδοση διακομιστή %s· Ο πελάτης δεν υποστηÏίζει Ïοή από εκδόσεις διακομιστών νεότεÏες από %s"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "το αναγνωÏιστικό συστήματος δεν αντιστοιχεί Î¼ÎµÏ„Î±Î¾Ï Î²Î±ÏƒÎ¹ÎºÎ¿Ï Î±Î½Ï„Î¹Î³Ïάφου ασφαλείας και σÏνδεσης Ïοής"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "η χÏονογÏαμμή εκκίνησης %u δεν υπάÏχει στο διακομιστή"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "μη αναμενόμενη απόκÏιση στην εντολή TIMELINE_HISTORY: έλαβε %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d πεδία"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "ο διακομιστής ανέφεÏε απÏοσδόκητη επόμενη χÏονογÏαμμή %u, ακολουθώντας τη χÏονογÏαμμή %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "ο διακομιστής σταμάτησε τη Ïοή χÏονογÏαμμής %u στο %X/%X, αλλά ανέφεÏε ότι η επόμενη χÏονογÏαμμή %u να ξεκινήσει από το %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "η Ïοή αναπαÏαγωγής τεÏματίστηκε Ï€Ïιν από το σημείο διακοπής"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "μη αναμενόμενο σÏνολο αποτελεσμάτων μετά το τέλος της χÏονογÏαμμής: έλαβε %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d πεδία"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση του σημείου εκκίνησης «%s» της επόμενης χÏονογÏαμμής"
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αÏχείο «%s»: %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "έλαβε εγγÏαφή write-ahead log για μετατόπιση %u χωÏίς ανοικτό αÏχείου"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "έλαβε μετατόπιση δεδομένων WAL %08x, ανέμενε %08x"
+
+#: receivelog.c:1128
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή %d bytes στο αÏχείο WAL «%s»: %s"
+
+#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "δεν ήταν δυνατή η αποστολή πακέτου copy-end: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Κωδικός Ï€Ïόσβασης: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "δεν ήταν δυνατή η σÏνδεση με το διακομιστή"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "δεν ήταν δυνατή η εκκαθάÏιση του search_path: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός της ÏÏθμισης διακομιστή για integer_datetimes"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "η επισήμανση μεταγλώττισης integer_datetimes δεν συμφωνεί με το διακομιστή"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "δεν ήταν δυνατή η λήψη μεγέθους τμήματος WAL: %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d ή πεÏισσότεÏα πεδία"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "δεν ήταν δυνατή η ανάλυση του μεγέθους του τμήματος WAL"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "το μέγεθος τμήματος WAL Ï€Ïέπει να έχει τιμή δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά ο απομακÏυσμένος διακομιστής ανέφεÏε τιμή %d byte"
+msgstr[1] "το μέγεθος τμήματος WAL Ï€Ïέπει να έχει τιμή δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά ο απομακÏυσμένος διακομιστής ανέφεÏε τιμή %d bytes"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "δεν ήταν δυνατή η λήψη επισήμανσης Ï€Ïόσβασης group: %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d ή πεÏισσότεÏα πεδία"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "δεν ήταν δυνατή η ανάλυση της σημαίας Ï€Ïόσβασης γκÏουπ: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "δεν ήταν δυνατή η αναγνώÏιση του συστήματος: έλαβε %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d ή πεÏισσότεÏα πεδία"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "δεν ήταν δυνατή η ανάγνωση της υποδοχής αναπαÏαγωγής «%s»: έλαβε %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d πεδία"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "η υποδοχή αναπαÏαγωγής «%s» δεν υπάÏχει"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "αναμένεται μια φυσική υποδοχή αναπαÏαγωγής, πήÏε τον Ï„Ïπο «%s» αντ 'αυτοÏ"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση restart_lsn «%s» για την υποδοχή αναπαÏαγωγής «%s»"
+
+#: streamutil.c:664
+#, 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 πεδία"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "δεν ήταν δυνατή η κατάÏγηση της υποδοχής αναπαÏαγωγής «%s»: έλαβε %d σειÏές και %d πεδία, ανέμενε %d σειÏές και %d πεδία"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "δεν ήταν δυνατή η επαναφοÏά της Ïοής συμπίεσης"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "σφάλμα υλοποίησης: τα αÏχεία tar δεν μποÏοÏν να έχουν πεÏισσότεÏα από ένα ανοιχτά αÏχεία"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "δεν ήταν δυνατή η δημιουÏγία κεφαλίδας tar"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "δεν ήταν δυνατή η αλλαγή παÏαμέτÏων συμπίεσης"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "το unlink δεν υποστηÏίζεται με συμπίεση"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "δεν ήταν δυνατό το κλείσιμο της Ïοής συμπίεσης"
+
+#~ msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 συμπίεσε logs με το οÏισμένο επίπεδο συμπίεσης\n"
+
+#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 συμπίεσε την έξοδο tar με το οÏισμένο επίπεδο συμπίεσης\n"
+
+#~ msgid "could not determine seek position in file \"%s\": %s"
+#~ msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός της θέσης αναζήτησης στο αÏχείο «%s»: %s"
+
+#~ msgid "could not get write-ahead log end position from server: %s"
+#~ msgstr "δεν ήταν δυνατή η απόκτηση τελικής θέσης write-ahead log από τον διακομιστή: %s"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid compression level \"%s\""
+#~ msgstr "μη έγκυÏο επίπεδο συμπίεσης «%s»"
+
+#~ msgid "invalid fsync interval \"%s\""
+#~ msgstr "μη έγκυÏο διάστημα FSYNC «%s»"
+
+#~ msgid "invalid port number \"%s\""
+#~ msgstr "μη έγκυÏος αÏιθμός Ï€Ïλης: «%s»"
+
+#~ msgid "invalid status interval \"%s\""
+#~ msgstr "μη έγκυÏο διάστημα status «%s»"
+
+#~ msgid "invalid tar block header size: %zu"
+#~ msgstr "μη έγκυÏο μέγεθος κεφαλίδας μπλοκ tar: %zu"
+
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται στην παÏοÏσα πλατφόÏμα"
+
+#~ msgid "this build does not support gzip compression"
+#~ msgstr "η παÏοÏσα κατασκευή δεν υποστηÏίζει συμπίεση gzip"
+
+#~ msgid "this build does not support lz4 compression"
+#~ msgstr "η παÏοÏσα κατασκευή δεν υποστηÏίζει συμπίεση lz4"
+
+#~ msgid "this build does not support zstd compression"
+#~ msgstr "η παÏοÏσα κατασκευή δεν υποστηÏίζει συμπίεση zstd"
+
+#~ msgid "unrecognized link indicator \"%c\""
+#~ msgstr "μη αναγνωÏίσιμος δείκτης σÏνδεσης «%c»"
diff --git a/src/bin/pg_basebackup/po/es.po b/src/bin/pg_basebackup/po/es.po
new file mode 100644
index 0000000..c4dbf4a
--- /dev/null
+++ b/src/bin/pg_basebackup/po/es.po
@@ -0,0 +1,1809 @@
+# Spanish message translation file for pg_basebackup
+#
+# Copyright (c) 2011-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Ãlvaro Herrera <alvherre@alvh.no-ip.org>, 2011-2014.
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:19+0000\n"
+"PO-Revision-Date: 2023-10-04 11:47+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "esta instalación no soporta compresión con %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "se encontró una cadena vacía donde se esperaba una opción de compresión"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "opción de compresión no reconocida: «%s»"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "la opción de compresión «%s» requiere un valor"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "el valor para la opción de compresión «%s» debe ser un entero"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "el valor para la opción de compresión «%s» debe ser booleano"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "el algoritmo de compresión «%s» no acepta un nivel de compresión"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "el algoritmo de compresión «%s» espera un nivel de compresión entre %d y %d (por omisión %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ayudantes"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "el algoritmo de compresión «%s» no acepta modo de larga distancia"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción «%s»"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "no se pudo escribir a archivo «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "no se pudo crear archivo «%s»: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "estado inesperado mientras se extraía el archivo"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "no se pudo definir los permisos del directorio «%s»: %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "no se pudo crear un enlace simbólico desde «%s» a «%s»: %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "no se pudo definir los permisos al archivo «%s»: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "no se pudo crear el archivo comprimido «%s»: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "no se pudo duplicar stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "no se pudo abrir el archivo de salida: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "no se pudo definir el nivel de compresión %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "no se pudo escribir al archivo comprimido «%s»: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo comprimido «%s»: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "no se pudo inicializar la biblioteca de compresión"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "no se pudo descomprimir datos: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "formato de resultados inesperado mientras se inyectaban los parámetros de recuperación"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "no se pudo crear un contexto de compresión lz4: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "no se pudo escribir la cabecera lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "no se pudo comprimir datos: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "no se pudo terminar la compresión lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "no se pudo inicializar la biblioteca de compresión: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "la terminación del archivo tar excede de 2 bloques"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "se encontró un estado inesperado mientras se interpretaba el archivo tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "miembro de tar tiene nombre vacío"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "el flujo COPY terminó antes que el último archivo estuviera completo"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "no se pudo restablecer el contexto de compresión zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "no se pudo definir el nivel de compresión zstd a %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "no se pudo definir la cantidad de procesos ayudantes de compresión a %d: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "no se pudo habilitar el modo “long-distanceâ€: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "no se pudo crear el contexto de descompresión zstd"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "eliminando el directorio de datos «%s»"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "no se pudo eliminar el directorio de datos"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "eliminando el contenido del directorio «%s»"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "no se pudo eliminar el contenido del directorio de datos"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "eliminando el directorio de WAL «%s»"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "no se pudo eliminar el directorio de WAL"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "eliminando el contenido del directorio de WAL «%s»"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "no se pudo eliminar el contenido del directorio de WAL"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directorio de datos «%s» no eliminado a petición del usuario"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "directorio de WAL «%s» no eliminado a petición del usuario"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "los cambios a los directorios de tablespaces no se desharán"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "nombre de directorio demasiado largo"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "múltiples signos «=» en mapeo de tablespace"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "formato de mapeo de tablespace «%s» no válido, debe ser «ANTIGUO=NUEVO»"
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "directorio antiguo no es una ruta absoluta en mapeo de tablespace: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "directorio nuevo no es una ruta absoluta en mapeo de tablespace: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s obtiene un respaldo base a partir de un servidor PostgreSQL en ejecución.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCIÓN]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Opciones que controlan la salida:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIR directorio en el cual recibir el respaldo base\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t formato de salida (plano (por omisión), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=TASA máxima tasa a la que transferir el directorio de datos\n"
+" (en kB/s, o use sufijos «k» o «M»)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" escribe configuración para replicación\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=DESTINO:[DETALLE]\n"
+" destino del respaldo base (si no es el cliente)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=ANTIGUO=NUEVO\n"
+" reubicar el directorio de tablespace de ANTIGUO a NUEVO\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=DIRWAL ubicación para el directorio WAL\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" incluye los archivos WAL necesarios,\n"
+" en el modo especificado\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip comprimir la salida de tar\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]MÉTODO[:DETALLE]\n"
+" comprimir en cliente o servidor como se especifica\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none no comprimir la salida tar\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opciones generales:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" utilizar checkpoint rápido o extendido\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot crear un slot de replicación\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ETIQUETA establecer etiqueta del respaldo\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean no hacer limpieza tras errores\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOMBRE slot de replicación a usar\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose desplegar mensajes verbosos\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" usar algoritmo para sumas de comprobación del manifiesto\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" codifica a hexadecimal todos los nombres de archivo en el manifiesto\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size no estimar el tamaño del la copia de seguridad en el lado del servidor\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest suprimir la generación del manifiesto de la copia de seguridad\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot evitar la creación de un slot de replicación temporal\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" no verificar checksums\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONSTR cadena de conexión\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN dirección del servidor o directorio del socket\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT número de port del servidor\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVALO (segundos)\n"
+" tiempo entre envíos de paquetes de estado al servidor\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOMBRE conectarse con el usuario especificado\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forzar un prompt para la contraseña\n"
+" (debería ser automático)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "no se pudo leer desde la tubería: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "no se pudo interpretar la ubicación del WAL «%s»"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "no se pudo completar la escritura de archivos WAL: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "no se pudo crear la tubería para el proceso en segundo plano: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "se creó slot temporal de replicación «%s»"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "se creó el slot de replicación «%s»"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "no se pudo lanzar el proceso en segundo plano: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "no se pudo lanzar el hilo en segundo plano: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "el directorio «%s» existe pero no está vacío"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "tasa de transferencia «%s» no es un valor válido"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "tasa de transferencia «%s» no válida: %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "tasa de transferencia debe ser mayor que cero"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "unidad de --max-rato no válida: «%s»"
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "la tasa de transferencia «%s» excede el rango de enteros"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "la tasa de transferencia «%s» está fuera de rango"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "no se pudo obtener un flujo de datos COPY: %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "no fue posible leer datos COPY: %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "un proceso en segundo plano terminó inesperadamente"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "no se pueden inyectar un manifiesto en un archivo tar comprimido"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Use compresión del lado del cliente, envíe la salida a un directorio en lugar de a salida estándar, o use %s."
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "no se pudo interpretar el archivo «%s»"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Sólo los archivos tar pueden ser interpretados."
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "El formato plano requiere que pg_basebackup interprete el archivo."
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Usar - como directorio de salida requiere que pg_basebackup interprete el archivo."
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "La opción -R requiere que pg_basebackup interprete el archivo."
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "los archivos deben preceder al manifiesto"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "nombre de archivo no válido: «%s»"
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "datos inesperados"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "mensaje COPY vacío"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "mensaje COPY mal formado de tipo %d, largo %zu"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "versión del servidor %s incompatible"
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Use -X none o -X fetch para deshabilitar el flujo de log."
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "los destinos de respaldo no están soportados por esta versión de servidor"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "la configuración de recuperación no puede ser escrita cuando se usa un destino de respaldo base"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "el servidor no soporta compresión del lado del servidor"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "iniciando el respaldo base, esperando que el checkpoint se complete"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "esperando al checkpoint"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "no se pudo ejecutar la orden de replicación «%s»: %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "no se pudo iniciar el respaldo base: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "el servidor envió una respuesta inesperada a la orden BASE_BACKUP; se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "el checkpoint se ha completado"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "punto de inicio del WAL: %s en el timeline %u"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "no se pudo obtener la cabecera de respaldo: %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "el servidor no retornó datos"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "sólo se puede escribir un tablespace a stdout, la base de datos tiene %d"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "iniciando el receptor de WAL en segundo plano"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "el respaldo falló: %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "el servidor no retornó la posición final del WAL"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "posición final del WAL: %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "ocurrió un error de checksums"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "la recepción final falló: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "esperando que el proceso en segundo plano complete el flujo..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "no se pudo enviar una orden a la tubería de segundo plano: %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "no se pudo esperar al proceso hijo: %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "el hijo %d murió, pero se esperaba al %d"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "no se pudo esperar el hilo hijo: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "no se pudo obtener la cabecera de respaldo: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "el hilo hijo terminó con error %u"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "sincronizando datos a disco ..."
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "renombrando backup_manifest.tmp a backup_manifest"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "el respaldo base se ha completado"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "argumento de checkpoint «%s» no válido, debe ser «fast» o «spread»"
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "formato de salida «%s» no válido, debe ser «plain» o «tar»"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "opción de wal-method «%s» no válida, debe ser «fetch», «stream» o «none»"
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "no se puede especificar un formato junto con un destino de respaldo"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "debe especificar un directorio de salida o destino de respaldo base"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "no se puede especificar un directorio de salida junto con un destino de respaldo"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algoritmo de compresión no reconocido: «%s»"
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "especificación de compresión no válida: %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "la compresión del lado del cliente no es posible cuando se especifica un destino del respaldo base"
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "sólo los respaldos de modo tar pueden ser comprimidos"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "no se puede enviar WAL cuando se especifica un destino del respaldo base"
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "no se puede enviar WALs en modo tar a stdout"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "los slots de replicación sólo pueden usarse con flujo de WAL"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "no se puede usar --no-slot junto con nombre de slot"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "la opcón %s necesita que se especifique un slot con --slot"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s y %s son opciones incompatibles"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "la ubicación del directorio de WAL no puede especificarse junto con un destino de respaldo"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "la ubicación del directorio de WAL sólo puede especificarse en modo «plain»"
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "no se pudo crear el enlace simbólico «%s»: %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s recibe flujos del WAL de PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR recibir los archivos de WAL en este directorio\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN salir luego de recibir el LSN especificado\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists no abandonar si el slot ya existe al crear un slot\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop no entrar en bucle al perder la conexión\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" tiempo entre envíos de paquetes de estado al servidor\n"
+" (por omisión: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous sincronizar el WAL inmediatamente después de escribir\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=MÉTODO[:DETALLE]\n"
+" comprimir como se indica\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Acciones optativas:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot crear un nuevo slot de replicación (para el nombre, vea --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot eliminar un slot de replicación (para el nombre, vea --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "terminó el segmento en %X/%X (timeline %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "detenido el flujo de log en %X/%X (timeline %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "cambiado al timeline %u en %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "se recibió una señal de interrupción, saliendo"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %lld, ignorando"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "no se pudo abrir el archivo comprimido «%s»: %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "no se pudo buscar en el archivo comprimido «%s»: %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "no se pudo leer el archivo comprimido «%s»: %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "no se pudo leer el archivo comprimido «%s»: leídos %d de %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %d al descomprimirse, ignorando"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "no se pudo crear un contexto de descompresión LZ4: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "no se pudo descomprimir el archivo «%s»: %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "no se pudo liberar el contexto de descompresión LZ4: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %zu al descomprimirse, ignorando"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "no se puede verificar el archivo «%s»: la compresión con %s no está soportada en este servidor"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "iniciando el flujo de log en %X/%X (timeline %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "no se pudo interpretar la posición final «%s»"
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "no puede usarse --create-slot junto con --drop-slot"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "no puede usarse --synchronous junto con --no-sync"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "no se especificó un directorio de salida"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "el método de compresión %s no está soportado aún"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "la conexión de replicación usando el slot «%s» es inesperadamente específica a una base de datos"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "eliminando el slot de replicación «%s»"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "creando el slot de replicación «%s»"
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "desconectado"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "desconectado; esperando %d segundos para intentar nuevamente"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s controla flujos de decodificación lógica de PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Acciones a ejecutar:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start iniciar flujo en un slot de replicación (para el nombre, vea --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=ARCHIVO recibir el log en este archivo, - para stdout\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F, --fsync-interval=SEGS\n"
+" tiempo entre fsyncs del archivo de salida (omisión: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN dónde en un slot existente debe empezar el flujo\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOMBRE[=VALOR]\n"
+" pasar opción NOMBRE con valor opcional VALOR al\n"
+" plugin de salida\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN usar plug-in de salida PLUGIN (omisión: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=NOMBRE-SLOT nombre del slot de replicación lógica\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase activa decodificación de transacciones preparadas al crear un slot\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=BASE base de datos a la cual conectarse\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "confirmando escritura hasta %X/%X, fsync hasta %X/%X (slot %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "no se pudo enviar el paquete de retroalimentación: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "iniciando el flujo de log en %X/%X (slot %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "flujo iniciado"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "el socket no es válido: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "no se pudo recibir datos desde el flujo de WAL: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "cabecera de flujo demasiado pequeña: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "cabecera de flujo no reconocida: «%c»"
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "no se pudo escribir %d bytes al archivo de registro «%s»: %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "término inesperado del flujo de replicación: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "no se pudo interpretar la posición de inicio «%s»"
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "no se especificó slot"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "no se especificó un archivo de destino"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "no se especificó una base de datos"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "debe especificarse al menos una operación"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "no puede usarse --create-slot o --start junto con --drop-slot"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "no puede usarse --create-slot o --drop-slot junto con --startpos"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos sólo se puede utilizar con --start"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase sólo se puede utilizar con --create-slot"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "no se pudo establecer una conexión de replicación específica a una base de datos"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "ubicación de término %X/%X alcanzado por «keep-alive»"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "ubicación de término %X/%X alcanzado por registro WAL en %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "no se pudo crear el archivo de estado «%s»: %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "no se pudo cerrar el archivo de estado «%s»: %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "no se pudo obtener el tamaño del archivo de WAL «%s»: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "no se pudo abrir el archivo de WAL «%s»: %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "no se pudo sincronizar (fsync) el archivo de WAL «%s»: %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "el archivo de WAL «%s» mide %zd byte, debería ser 0 o %d"
+msgstr[1] "el archivo de WAL «%s» mide %zd bytes, debería ser 0 o %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "no se pudo abrir archivo de WAL «%s»: %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "no se cambiará el nombre a «%s», el segmento no está completo"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "no se pudo cerrar el archivo «%s»: %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "el servidor reportó un nombre inesperado para el archivo de historia de timeline %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "no se pudo crear el archivo de historia de timeline «%s»: %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "no se pudo escribir al archivo de historia de timeline «%s»: %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "versión de servidor %s incompatible; el cliente no soporta flujos de servidores anteriores a la versión %s"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "versión de servidor %s incompatible; el cliente no soporta flujos de servidores posteriores a %s"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "el identificador de sistema no coincide entre el respaldo base y la conexión de flujo"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "el timeline de inicio %u no está presente en el servidor"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "respuesta inesperada a la orden TIMELINE_HISTORY: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "el servidor reportó un timeline siguiente %u inesperado, a continuación del timeline %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "el servidor paró la transmisión del timeline %u en %X/%X, pero reportó que el siguiente timeline %u comienza en %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "el flujo de replicación terminó antes del punto de término"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "respuesta inesperada después del fin-de-timeline: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "no se pudo interpretar el punto de inicio del siguiente timeline «%s»"
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "se recibió un registro de WAL para el desplazamiento %u sin ningún archivo abierto"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "se obtuvo desplazamiento de datos WAL %08x, se esperaba %08x"
+
+#: receivelog.c:1128
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "no se pudo escribir %d bytes al archivo WAL «%s»: %s"
+
+#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "no se pudo enviar el paquete copy-end: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "no se pudo conectar al servidor"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "no se pudo limpiar search_path: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "no se pudo determinar la opción integer_datetimes del servidor"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "la opción de compilación integer_datetimes no coincide con el servidor"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "no se pudo obtener el tamaño del segmento de WAL: se obtuvo %d filas y %d campos, se esperaban %d filas y %d o más campos"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "el tamaño de segmento de WAL no pudo ser analizado"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "el tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el servidor remoto reportó un valor de %d byte"
+msgstr[1] "el tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el servidor remoto reportó un valor de %d bytes"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "no se pudo obtener el indicador de acceso de grupo: se obtuvo %d filas y %d campos, se esperaban %d filas y %d o más campos"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "el indicador de acceso de grupo no pudo ser analizado: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "no se pudo identificar al sistema: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d o más campos"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "no se pudo leer el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "no existe el slot de replicación «%s»"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "se esperaba un slot de replicación físico, en cambio se obtuvo tipo «%s»"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "no se pudo interpretar restart_lsn de WAL «%s» para el slot de replicación «%s»"
+
+#: streamutil.c:664
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "no se pudo create el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "no se pudo eliminar el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "no se pudo comprimir datos"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "no se pudo restablecer el flujo comprimido"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "error de implementación: los archivos tar no pueden tener abierto más de un fichero"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "no se pudo crear la cabecera del archivo tar"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "no se pudo cambiar los parámetros de compresión"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "unlink no soportado con compresión"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "no se pudo cerrar el flujo comprimido"
+
+#, c-format
+#~ msgid "could not set compression flag for %s: %s"
+#~ msgstr "no se pudo definir una opción de compresión para %s: %s"
diff --git a/src/bin/pg_basebackup/po/fr.po b/src/bin/pg_basebackup/po/fr.po
new file mode 100644
index 0000000..54a388a
--- /dev/null
+++ b/src/bin/pg_basebackup/po/fr.po
@@ -0,0 +1,2209 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2011-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:18+0000\n"
+"PO-Revision-Date: 2023-07-29 22:45+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "cette construction ne supporte pas la compression avec %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "option de compression inconnue : « %s »"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "l'option de compression « %s » requiert une valeur"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "la valeur pour l'option de compression « %s » doit être un entier"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "la valeur pour l'option de compression « %s » doit être un booléen"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "l'algorithme de compression « %s » n'accepte pas un mode distance longue"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "n'a pas pu écrire dans le fichier « %s » : %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "n'a pas pu créer le fichier « %s » : %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "état inattendu lors de l'extraction de l'archive"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique de « %s » vers « %s » : %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "n'a pas pu créer le fichier compressé « %s » : %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "n'a pas pu dupliquer la sortie (stdout) : %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "n'a pas pu configurer le niveau de compression %d : %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "n'a pas pu écrire dans le fichier compressé « %s » : %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier compressé « %s » : %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "n'a pas pu initialiser la bibliothèque de compression"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "n'a pas pu décompresser les données : %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "état inattendu lors de l'injection des paramètres de restauration"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "n'a pas pu créer le contexte de compression lz4 : %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "n'a pas pu écrire l'entête lz4 : %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "n'a pas pu compresser les données : %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "n'a pas pu terminer la compression lz4 : %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "n'a pas pu initialiser la bibliothèque de compression : %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "la fin du fichier tar fait plus de 2 blocs"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "état inattendu lors de l'analyse de l'archive tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "le membre de tar a un nom vide"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "le flux COPY s'est terminé avant que le dernier fichier soit terminé"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "n'a pas pu créer le contexte de compression zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "n'a pas pu configurer le niveau de compression zstd à %d : %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "n'a pas pu configurer le nombre de workers de compression à %d : %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "n'a pas pu activer le mode distance longue : %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "n'a pas pu créer le contexte de décompression zstd"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "suppression du répertoire des données « %s »"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "échec de la suppression du répertoire des données"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "suppression du contenu du répertoire des données « %s »"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "échec de la suppression du contenu du répertoire des données"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "suppression du répertoire des journaux de transactions « %s »"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "échec de la suppression du répertoire des journaux de transactions"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "suppression du contenu du répertoire des journaux de transactions « %s »"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "échec de la suppression du contenu du répertoire des journaux de transactions"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "les modifications des répertoires des tablespaces ne seront pas annulées"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "nom du répertoire trop long"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "multiple signes « = » dans la correspondance de tablespace"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "format de correspondance de tablespace « %s » invalide, doit être « ANCIENREPERTOIRE=NOUVEAUREPERTOIRE »"
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "l'ancien répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "le nouveau répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s prend une sauvegarde binaire d'un serveur PostgreSQL en cours\n"
+"d'exécution.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Options contrôlant la sortie :\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=RÉPERTOIRE reçoit la sauvegarde de base dans ce répertoire\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t format en sortie (plain (par défaut), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=TAUX taux maximum de transfert du répertoire de\n"
+" données (en Ko/s, ou utiliser le suffixe « k »\n"
+" ou « M »)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr " -R, --write-recovery-conf écrit la configuration pour la réplication\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr " -t, --target=CIBLE[:DETAIL] cible de sauvegarde (si autre que client)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=ANCIENREP=NOUVEAUREP\n"
+" déplace le répertoire ANCIENREP en NOUVEAUREP\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" --waldir=RÉP_WAL emplacement du répertoire des journaux de\n"
+" transactions\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" inclut les journaux de transactions requis avec\n"
+" la méthode spécifiée\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip compresse la sortie tar\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n"
+" compresse sur le client ou le serveur comme indiqué\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none ne compresse pas la sortie tar\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Options générales :\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr " -c, --checkpoint=fast|spread exécute un CHECKPOINT rapide ou réparti\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " --create-slot crée un slot de réplication\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL configure le label de sauvegarde\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean ne nettoie pas en cas d'erreur\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression de la sauvegarde\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOMREP slot de réplication à utiliser\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose affiche des messages verbeux\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" utilise cet algorithme pour les sommes de\n"
+" contrôle du manifeste\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode encode tous les noms de fichier dans le\n"
+" manifeste en hexadécimal\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr ""
+" --no-estimate-size ne réalise pas d'estimation sur la taille de la\n"
+" sauvegarde côté serveur\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr ""
+" --no-manifest supprime la génération de manifeste de\n"
+" sauvegarde\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot empêche la création de slots de réplication\n"
+" temporaires\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr " --no-verify-checksums ne vérifie pas les sommes de contrôle\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CHAÎNE_CONNEX chaîne de connexion\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL durée entre l'envoi de paquets de statut au\n"
+" serveur (en secondes)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=UTILISATEUR se connecte avec cet utilisateur\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais le mot de passe\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password force la demande du mot de passe (devrait\n"
+" survenir automatiquement)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "n'a pas pu lire à partir du tube : %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "n'a pas pu finir l'écriture dans les fichiers de transactions : %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "n'a pas pu créer un tube pour le processus en tâche de fond : %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "a créé le slot de réplication temporaire « %s »"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "a créé le slot de réplication « %s »"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "n'a pas pu créer un processus en tâche de fond : %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "n'a pas pu créer un thread en tâche de fond : %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "le répertoire « %s » existe mais n'est pas vide"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s Ko (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s Ko (100%%), %d/%d tablespaces %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "le taux de transfert « %s » ne correspond pas à une valeur valide"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "taux de transfert invalide (« %s ») : %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "le taux de transfert doit être supérieur à zéro"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "unité invalide pour --max-rate : « %s »"
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "le taux de transfert « %s » dépasse l'échelle des entiers"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "le taux de transfert « %s » est en dehors des limites"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "n'a pas pu obtenir le flux de données de COPY : %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "n'a pas pu lire les données du COPY : %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "un processus worker s'est arrêté de façon inattendue"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "ne peut pas injecter le manifeste dans un fichier tar compressé"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Utilisez la compression côté client, envoyez la sortie dans un répertoire plutôt que sur la sortie standard, ou utilisez %s."
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "n'a pas pu analyser l'archive « %s »"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Seules les archives tar peuvent être analysées"
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Le format plain requiert que pg_basebackup analyse l'archive."
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Utiliser - comme répertoire de sortie requiert que pg_basebackup analyse l'archive."
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "L'option -R requiert que pg_basebackup analyse l'archive."
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "les archives doivent précéder le manifeste"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "nom d'archive invalide : « %s »"
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "donnée de charge inattendue"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "message COPY vide"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "message COPY malformé de type %d, longueur %zu"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "version « %s » du serveur incompatible"
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Utilisez -X none ou -X fetch pour désactiver la réplication en flux."
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "les cibles de sauvegarde ne sont pas supportées par cette version du serveur"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "la configuration de la restauration ne peut pas être écrite quand une cible de restauration est utilisée"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "le serveur ne supporte pas la compression côté serveur"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "début de la sauvegarde de base, en attente de la fin du checkpoint"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "en attente du checkpoint"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "n'a pas pu envoyer la commande de réplication « %s » : %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "n'a pas pu initier la sauvegarde de base : %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "le serveur a renvoyé une réponse inattendue à la commande BASE_BACKUP ; a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "checkpoint terminé"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "point de départ du journal de transactions : %s sur la timeline %u"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "n'a pas pu obtenir l'en-tête du serveur : %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "aucune donnée renvoyée du serveur"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "peut seulement écrire un tablespace sur la sortie standard, la base en a %d"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "lance le récepteur de journaux de transactions en tâche de fond"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "échec de la sauvegarde : %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "aucune position de fin du journal de transactions renvoyée par le serveur"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "point final du journal de transactions : %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "erreur de somme de contrôle"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "échec lors de la réception finale : %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "en attente que le processus en tâche de fond termine le flux..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "n'a pas pu envoyer la commande au tube du processus : %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "n'a pas pu attendre le processus fils : %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "le fils %d est mort, %d attendu"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "n'a pas pu attendre le thread : %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "n'a pas pu obtenir le code de sortie du thread : %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "le thread a quitté avec le code d'erreur %u"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "synchronisation des données sur disque..."
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "renommage de backup_manifest.tmp en backup_manifest"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "sauvegarde de base terminée"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "argument « %s » invalide pour le CHECKPOINT, doit être soit « fast » soit « spread »"
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "format de sortie « %s » invalide, doit être soit « plain » soit « tar »"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "option wal-method « %s » invalide, doit être soit « fetch » soit « stream » soit « none »"
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "ne peut pas spécifier à la fois le format et la cible de sauvegarde"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "doit spécifier un répertoire de sortie ou une cible de sauvegarde"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "ne peut pas spécifier à la fois le répertoire en sortie et la cible de sauvegarde"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algorithme de compression inconnu : « %s »"
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "spécification de compression invalide : %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "la compression client n'est pas possible quand une cible de restauration est indiquée."
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "seules les sauvegardes en mode tar peuvent être compressées"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "Les journaux de transactions ne peuvent pas être envoyés en flux quand une cible de sauvegarde est indiquée."
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "ne peut pas envoyer les journaux de transactions vers stdout en mode tar"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "les slots de réplications peuvent seulement être utilisés avec la réplication en flux des WAL"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot ne peut pas être utilisé avec un nom de slot"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s a besoin du slot avec l'option --slot"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s et %s sont des options incompatibles"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "l'emplacement du répertoire des journaux de transactions ne peut pas être indiqué avec une cible de sauvegarde"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué uniquement dans le mode plain"
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique « %s » : %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s reçoit le flux des journaux de transactions PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=RÉPERTOIRE reçoit les journaux de transactions dans ce\n"
+" répertoire\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN quitte après avoir reçu le LSN spécifié\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr ""
+" --if-not-exists ne pas renvoyer une erreur si le slot existe\n"
+" déjà lors de sa création\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop ne boucle pas en cas de perte de la connexion\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n"
+" (par défaut %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr ""
+" --synchronous vide le journal de transactions immédiatement\n"
+" après son écriture\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compresse comme indiqué\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Actions optionnelles :\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --create-slot crée un nouveau slot de réplication\n"
+" (pour le nom du slot, voir --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --drop-slot supprime un nouveau slot de réplication\n"
+" (pour le nom du slot, voir --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "segment terminé à %X/%X (timeline %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "arrêt du flux streaming à %X/%X (timeline %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "a basculé sur la timeline %u à %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "a reçu un signal d'interruption, quitte"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "le segment « %s » a une taille incorrecte (%lld), ignoré"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier compressé « %s » : %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "n'a pas pu chercher dans le fichier compressé « %s » : %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier compressé « %s » : %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "n'a pas pu lire le fichier compressé « %s » : a lu %d sur %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "le segment compressé « %s » a une taille %d non compressé incorrecte, ignoré"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "n'a pas pu décompresser le fichier « %s » : %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "le fichier segment compressé « %s » a une taille %zu décompressée incorrecte, ignoré"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "ne peut pas vérifier le fichier « %s » : la compression avec %s n'a pas été intégrée lors de la compilation"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "commence le flux des journaux à %X/%X (timeline %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "n'a pas pu analyser la position finale « %s »"
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "ne peut pas utiliser --create-slot avec --drop-slot"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "ne peut pas utiliser --synchronous avec --no-sync"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "aucun répertoire cible indiqué"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "la méthode de compression %s n'est pas encore supportée"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "la connexion de réplication utilisant le slot « %s » est spécifique à une base, ce qui est inattendu"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "suppression du slot de réplication « %s »"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "création du slot de réplication « %s »"
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "déconnecté"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "déconnecté, attente de %d secondes avant une nouvelle tentative"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s contrôle le flux des modifications logiques de PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Action à réaliser :\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --start lance le flux dans un slot de réplication (pour\n"
+" le nom du slot, voir --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f, --file=FICHIER trace la réception dans ce fichier, - pour\n"
+" stdout\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS durée entre les fsyncs vers le fichier de sortie\n"
+" (par défaut %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr ""
+" -I, --startpos=LSN position de début du streaming dans le slot\n"
+" existant\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOM[=VALEUR] passe l'option NOM avec la valeur optionnelle\n"
+" VALEUR au plugin en sortie\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P, --plugin=PLUGIN utilise le plugin PLUGIN en sortie (par défaut\n"
+" %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOT nom du slot de réplication logique\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase active le décodage des transactions préparées lors de la création d'un slot\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=BASE base de données de connexion\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "confirmation d'écriture jusqu'à %X/%X et de synchronisation jusqu'à %X/%X (slot %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "n'a pas pu envoyer le paquet d'informations en retour : %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "commence le flux des journaux à %X/%X (slot %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "flux lancé"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "socket invalide : %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "n'a pas pu recevoir des données du flux de WAL : %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "en-tête de flux trop petit : %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "entête non reconnu du flux : « %c »"
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "fin inattendue du flux de réplication : %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "n'a pas pu analyser la position de départ « %s »"
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "aucun slot de réplication indiqué"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "aucun fichier cible indiqué"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "aucune base de données indiquée"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "au moins une action doit être indiquée"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "ne peut pas utiliser --create-slot ou --start avec --drop-slot"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "ne peut pas utiliser --create-slot ou --drop-slot avec --startpos"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos peut seulement être spécifié avec --start"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase peut seulement être spécifié avec --create-slot"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "n'a pas pu établir une connexion de réplication spécifique à la base"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "position finale %X/%X atteinte par keepalive"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "position finale %X/%X atteinte à l'enregistrement WAL %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "n'a pas pu fermer le fichier de statut d'archivage « %s » : %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu obtenir la taille du journal de transactions « %s » : %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu ouvrir le journal des transactions « %s » existant : %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu synchroniser sur disque le journal de transactions « %s » existant : %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "le journal de transactions « %s » comprend %zd octet, cela devrait être 0 ou %d"
+msgstr[1] "le journal de transactions « %s » comprend %zd octets, cela devrait être 0 ou %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "n'a pas pu ouvrir le journal de transactions « %s » : %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "pas de renommage de « %s », le segment n'est pas complet"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "n'a pas pu fermer le fichier « %s » : %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "le serveur a renvoyé un nom de fichier historique inattendu pour la timeline %u : %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "n'a pas pu créer le fichier historique de la timeline « %s » : %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "n'a pas pu écrire dans le fichier historique de la timeline « %s » : %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus anciennes que %s"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus récentes que %s"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "l'identifiant système ne correspond pas entre la sauvegarde des fichiers et la connexion de réplication"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "la timeline %u de départ n'est pas dans le serveur"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "réponse inattendue à la commande TIMELINE_HISTORY : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "le serveur a renvoyé une timeline suivante %u inattendue, après la timeline %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "le serveur a arrêté l'envoi de la timeline %u à %X/%X, mais a indiqué que la timeline suivante, %u, commence à %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "le flux de réplication a été abandonné avant d'arriver au point d'arrêt"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "ensemble de résultats inattendu après la fin de la timeline : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "n'a pas pu analyser la position de départ de la prochaine timeline « %s »"
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "a reçu l'enregistrement du journal de transactions pour le décalage %u sans fichier ouvert"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "a obtenu le décalage %08x pour les données du journal, attendait %08x"
+
+#: receivelog.c:1128
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %s"
+
+#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "n'a pas pu envoyer le paquet de fin de copie : %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "n'a pas pu se connecter au serveur"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "n'a pas pu effacer search_path : %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "n'a pas pu déterminer la configuration serveur de integer_datetimes"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "l'option de compilation integer_datetimes ne correspond pas au serveur"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "n'a pas pu récupéré la taille d'un segment WAL : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "la taille du segment WAL n'a pas pu être analysée"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octet"
+msgstr[1] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octets"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "n'a pas pu récupérer les options d'accès du groupe : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "l'option d'accès du groupe n'a pas pu être analysé : %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "n'a pas pu identifier le système : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)."
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "n'a pas pu lire le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "le slot de réplication « %s » n'existe pas"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "attendait un slot de réplication physique, a obtenu le type « %s » à la place"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "n'a pas pu analyser le champ restart_lsn « %s » pour le slot de réplication « %s »"
+
+#: streamutil.c:664
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "n'a pas pu créer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "n'a pas pu supprimer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "n'a pas pu compresser les données"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "n'a pas pu réinitialiser le flux de compression"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "erreur d'implémentation : les fichiers tar ne peuvent pas avoir plus d'un fichier ouvert"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "n'a pas pu créer l'en-tête du fichier tar"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "n'a pas pu modifier les paramètres de compression"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "suppression non supportée avec la compression"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "n'a pas pu fermer le flux de compression"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid ""
+#~ " --compression-method=METHOD\n"
+#~ " method to compress logs\n"
+#~ msgstr ""
+#~ " --compression-method=METHODE\n"
+#~ " méthode pour compresser les journaux\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version puis quitte\n"
+
+#, c-format
+#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 compresse la sortie tar avec le niveau de\n"
+#~ " compression indiqué\n"
+
+#, c-format
+#~ msgid " -Z, --compress=1-9 compress logs with given compression level\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 compresse les journaux avec le niveau de\n"
+#~ " compression indiqué\n"
+
+#~ msgid " -x, --xlog include required WAL files in backup (fetch mode)\n"
+#~ msgstr ""
+#~ " -x, --xlog inclut les journaux de transactions nécessaires\n"
+#~ " dans la sauvegarde (mode fetch)\n"
+
+#~ msgid "%s: WAL directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s : répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur\n"
+
+#~ msgid "%s: WAL directory location must be an absolute path\n"
+#~ msgstr ""
+#~ "%s : l'emplacement du répertoire des journaux de transactions doit être\n"
+#~ "indiqué avec un chemin absolu\n"
+
+#~ msgid "%s: WAL streaming can only be used in plain mode\n"
+#~ msgstr "%s : le flux de journaux de transactions peut seulement être utilisé en mode plain\n"
+
+#~ msgid "%s: cannot specify both --xlog and --xlog-method\n"
+#~ msgstr "%s : ne peut pas spécifier à la fois --xlog et --xlog-method\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s : le processus fils n'a pas quitté normalement\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s : le processus fils a quitté avec le code erreur %d\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not clear search_path: %s"
+#~ msgstr "%s : n'a pas pu effacer search_path : %s"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not close file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not close file %s: %s\n"
+#~ msgstr "%s : n'a pas pu fermer le fichier %s : %s\n"
+
+#~ msgid "%s: could not connect to server\n"
+#~ msgstr "%s : n'a pas pu se connecter au serveur\n"
+
+#~ msgid "%s: could not connect to server: %s"
+#~ msgstr "%s : n'a pas pu se connecter au serveur : %s"
+
+#~ msgid "%s: could not create archive status file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier de statut d'archivage « %s » : %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not get current position in file %s: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir la position courant dans le fichier %s : %s\n"
+
+#~ msgid "%s: could not identify system: %s"
+#~ msgstr "%s : n'a pas pu identifier le système : %s"
+
+#~ msgid "%s: could not identify system: %s\n"
+#~ msgstr "%s : n'a pas pu identifier le système : %s\n"
+
+#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+#~ msgstr ""
+#~ "%s : n'a pas pu identifier le système, a récupéré %d lignes et %d champs,\n"
+#~ "attendait %d lignes et %d champs (ou plus)\n"
+
+#~ msgid "%s: could not open WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le segment WAL %s : %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n"
+
+#~ msgid "%s: could not open timeline history file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal historique de la timeline « %s » : %s\n"
+
+#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal de transactions « %s » : %s\n"
+
+#~ msgid "%s: could not pad WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu terminer le segment WAL %s : %s\n"
+
+#~ msgid "%s: could not pad transaction log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu remplir de zéros le journal de transactions « %s » : %s\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s : n'a pas pu analyser le mode du fichier\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s : n'a pas pu analyser la taille du fichier\n"
+
+#~ msgid "%s: could not parse log start position from value \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser la position de départ des WAL à partir de la valeur « %s »\n"
+
+#~ msgid "%s: could not parse transaction log file name \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser le nom du journal de transactions « %s »\n"
+
+#~ msgid "%s: could not read copy data: %s\n"
+#~ msgstr "%s : n'a pas pu lire les données du COPY : %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not receive data from WAL stream: %s"
+#~ msgstr "%s : n'a pas pu recevoir des données du flux de WAL : %s"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n"
+
+#~ msgid "%s: could not rename file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu renommer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not seek back to beginning of WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu se déplacer au début du segment WAL %s : %s\n"
+
+#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu rechercher le début du journal de transaction « %s » : %s\n"
+
+#~ msgid "%s: could not send base backup command: %s"
+#~ msgstr "%s : n'a pas pu envoyer la commande de sauvegarde de base : %s"
+
+#~ msgid "%s: could not set permissions on directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas configurer les droits sur le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not set permissions on file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu configurer les droits sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat WAL segment %s: %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le segment WAL %s : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat transaction log file \"%s\": %s\n"
+#~ msgstr ""
+#~ "%s : n'a pas pu récupérer les informations sur le journal de transactions\n"
+#~ "« %s » : %s\n"
+
+#~ msgid "%s: could not write to file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu écrire dans le fichier « %s » : %s\n"
+
+#~ msgid "%s: data directory \"%s\" not removed at user's request\n"
+#~ msgstr "%s : répertoire des données « %s » non supprimé à la demande de l'utilisateur\n"
+
+#~ msgid "%s: directory \"%s\" exists but is not empty\n"
+#~ msgstr "%s : le répertoire « %s » existe mais n'est pas vide\n"
+
+#~ msgid "%s: failed to remove WAL directory\n"
+#~ msgstr "%s : échec de la suppression du répertoire des journaux de transactions\n"
+
+#~ msgid "%s: failed to remove contents of WAL directory\n"
+#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transactions\n"
+
+#~ msgid "%s: failed to remove contents of data directory\n"
+#~ msgstr "%s : échec de la suppression du contenu du répertoire des données\n"
+
+#~ msgid "%s: failed to remove data directory\n"
+#~ msgstr "%s : échec de la suppression du répertoire des données\n"
+
+#~ msgid "%s: invalid format of xlog location: %s\n"
+#~ msgstr "%s : format invalide de l'emplacement du journal de transactions : %s\n"
+
+#~ msgid "%s: invalid port number \"%s\"\n"
+#~ msgstr "%s : numéro de port invalide : « %s »\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s : socket invalide : %s"
+
+#~ msgid "%s: keepalive message has incorrect size %d\n"
+#~ msgstr "%s : le message keepalive a une taille %d incorrecte\n"
+
+#~ msgid "%s: no start point returned from server\n"
+#~ msgstr "%s : aucun point de redémarrage renvoyé du serveur\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: removing WAL directory \"%s\"\n"
+#~ msgstr "%s : suppression du répertoire des journaux de transactions « %s »\n"
+
+#~ msgid "%s: removing contents of WAL directory \"%s\"\n"
+#~ msgstr "%s : suppression du contenu du répertoire des journaux de transactions « %s »\n"
+
+#~ msgid "%s: removing contents of data directory \"%s\"\n"
+#~ msgstr "%s : suppression du contenu du répertoire des données « %s »\n"
+
+#~ msgid "%s: removing data directory \"%s\"\n"
+#~ msgstr "%s : suppression du répertoire des données « %s »\n"
+
+#~ msgid "%s: select() failed: %s\n"
+#~ msgstr "%s : échec de select() : %s\n"
+
+#~ msgid "%s: socket not open"
+#~ msgstr "%s : socket non ouvert"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n"
+
+#~ msgid "%s: timeline does not match between base backup and streaming connection\n"
+#~ msgstr ""
+#~ "%s : la timeline ne correspond pas entre la sauvegarde des fichiers et la\n"
+#~ "connexion de réplication\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "--create-slot and --no-slot are incompatible options"
+#~ msgstr "--create-slot et --no-slot sont des options incompatibles"
+
+#~ msgid "--no-manifest and --manifest-checksums are incompatible options"
+#~ msgstr "--no-manifest et --manifest-checksums sont des options incompatibles"
+
+#~ msgid "--no-manifest and --manifest-force-encode are incompatible options"
+#~ msgstr "--no-manifest et --manifest-force-encode sont des options incompatibles"
+
+#~ msgid "--progress and --no-estimate-size are incompatible options"
+#~ msgstr "--progress et --no-estimate-size sont des options incompatibles"
+
+#, c-format
+#~ msgid "This build does not support compression with %s."
+#~ msgstr "Cette construction ne supporte pas la compression avec %s."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "cannot use --compress with --compression-method=%s"
+#~ msgstr "ne peut pas utiliser --compress avec --compression-method=%s"
+
+#, c-format
+#~ msgid "could not check file \"%s\""
+#~ msgstr "n'a pas pu vérifier le fichier « %s »"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "n'a pas pu se connecter au serveur : %s"
+
+#, c-format
+#~ msgid "could not determine seek position in file \"%s\": %s"
+#~ msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive « %s » : %s"
+
+#, c-format
+#~ msgid "could not find replication slot \"%s\""
+#~ msgstr "n'a pas pu trouver le slot de réplication « %s »"
+
+#, c-format
+#~ msgid "could not get write-ahead log end position from server: %s"
+#~ msgstr "n'a pas pu obtenir la position finale des journaux de transactions à partir du serveur : %s"
+
+#~ msgid "deflate failed"
+#~ msgstr "échec en décompression"
+
+#~ msgid "deflateEnd failed"
+#~ msgstr "échec de deflateEnd"
+
+#~ msgid "deflateInit2 failed"
+#~ msgstr "échec de deflateInit2"
+
+#~ msgid "deflateParams failed"
+#~ msgstr "échec de deflateParams"
+
+#~ msgid "deflateReset failed"
+#~ msgstr "échec de deflateReset"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid compression level \"%s\""
+#~ msgstr "niveau de compression « %s » invalide"
+
+#, c-format
+#~ msgid "invalid fsync interval \"%s\""
+#~ msgstr "intervalle fsync « %s » invalide"
+
+#, c-format
+#~ msgid "invalid port number \"%s\""
+#~ msgstr "numéro de port invalide : « %s »"
+
+#, c-format
+#~ msgid "invalid status interval \"%s\""
+#~ msgstr "intervalle « %s » invalide du statut"
+
+#, c-format
+#~ msgid "invalid tar block header size: %zu"
+#~ msgstr "taille invalide de l'en-tête de bloc du fichier tar : %zu"
+
+#, c-format
+#~ msgid "log streamer with pid %d exiting"
+#~ msgstr "le processus d'envoi des journaux de PID %d quitte"
+
+#, c-format
+#~ msgid "no value specified for --compress, switching to default"
+#~ msgstr "aucune valeur indiquée pour --compression, utilise la valeur par défaut"
+
+#~ msgid "select() failed: %m"
+#~ msgstr "échec de select() : %m"
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "les liens symboliques ne sont pas supportés sur cette plateforme"
+
+#, c-format
+#~ msgid "this build does not support gzip compression"
+#~ msgstr "cette construction ne supporte pas la compression gzip"
+
+#, c-format
+#~ msgid "this build does not support lz4 compression"
+#~ msgstr "cette construction ne supporte pas la compression lz4"
+
+#, c-format
+#~ msgid "this build does not support zstd compression"
+#~ msgstr "cette construction ne supporte pas la compression zstd"
+
+#, c-format
+#~ msgid "unknown compression option \"%s\""
+#~ msgstr "option de compression « %s » inconnue"
+
+#, c-format
+#~ msgid "unrecognized link indicator \"%c\""
+#~ msgstr "indicateur de lien « %c » non reconnu"
diff --git a/src/bin/pg_basebackup/po/he.po b/src/bin/pg_basebackup/po/he.po
new file mode 100644
index 0000000..7bdd08e
--- /dev/null
+++ b/src/bin/pg_basebackup/po/he.po
@@ -0,0 +1,1405 @@
+# Hebrew message translation file for pg_basebackup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldbrg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-17 03:16+0000\n"
+"PO-Revision-Date: 2017-05-17 14:22+0300\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Last-Translator: Michael Goldberg <mic.goldbrg@gmail.com>, 2017.\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.0.2\n"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "×ין זיכרון פנוי\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "×œ× × ×™×ª×Ÿ לשכפל מצביע ריק (שגי××” פנימית)\n"
+
+#: ../../common/file_utils.c:82 ../../common/file_utils.c:186
+#: pg_receivewal.c:252 pg_recvlogical.c:353
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×” ניתן לקבל מידע (stat) על קובץ \"%s\": %s\n"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:153
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח תיקייה \"%s\": %s\n"
+
+#: ../../common/file_utils.c:198 pg_receivewal.c:320
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ž×ª×™×§×™×™×” \"%s\": %s\n"
+
+#: ../../common/file_utils.c:231 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:367
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח קובץ \"%s\": %s\n"
+
+#: ../../common/file_utils.c:304 ../../common/file_utils.c:376 receivelog.c:802
+#: receivelog.c:1059
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להעביר תוכן הקובץ (fsync) לדיסק \"%s\": %s\n"
+
+#: ../../common/file_utils.c:387
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לשנות ×©× ×”×§×•×‘×¥ \"%s\" \"%s\": %s\n"
+
+#: pg_basebackup.c:159
+#, c-format
+msgid "%s: removing data directory \"%s\"\n"
+msgstr "תכנית %s: הסרת ספריית × ×ª×•× ×™× \"%s\"\n"
+
+#: pg_basebackup.c:162
+#, c-format
+msgid "%s: failed to remove data directory\n"
+msgstr "תכנית %s: כשל בלהסיר ×ת ספריית הנתוני×\n"
+
+#: pg_basebackup.c:168
+#, c-format
+msgid "%s: removing contents of data directory \"%s\"\n"
+msgstr "תכנית %s: הסרת התוכן של ספריית ×”× ×ª×•× ×™× \"%s\"\n"
+
+#: pg_basebackup.c:171
+#, c-format
+msgid "%s: failed to remove contents of data directory\n"
+msgstr "תכנית %s: כשל בלהסיר ×ת התוכן של ספריית הנתוני×\n"
+
+#: pg_basebackup.c:177
+#, c-format
+msgid "%s: removing WAL directory \"%s\"\n"
+msgstr "תכנית %s: הסרת ספריית WAL \"%s\"\n"
+
+#: pg_basebackup.c:180
+#, c-format
+msgid "%s: failed to remove WAL directory\n"
+msgstr "תכנית %s: כשל בלהסיר מדריך ×ת תיקיית WAL\n"
+
+#: pg_basebackup.c:186
+#, c-format
+msgid "%s: removing contents of WAL directory \"%s\"\n"
+msgstr "תכנית %s: הסרת התוכן של תיקיית WAL \"%s\"\n"
+
+#: pg_basebackup.c:189
+#, c-format
+msgid "%s: failed to remove contents of WAL directory\n"
+msgstr "תכנית %s: כשל בלהסיר ×ת התוכן של הספרית WAL\n"
+
+#: pg_basebackup.c:197
+#, c-format
+msgid "%s: data directory \"%s\" not removed at user's request\n"
+msgstr "תכנית %s: תיקיית ×”× ×ª×•× ×™× \"%s\" ×œ× ×”×•×¡×¨×” לבקשת המשתמש\n"
+
+#: pg_basebackup.c:202
+#, c-format
+msgid "%s: WAL directory \"%s\" not removed at user's request\n"
+msgstr "תכנית %s: תיקייה WAL \"%s\" ×œ× ×”×•×¡×¨×” לבקשת המשתמש\n"
+
+#: pg_basebackup.c:208
+#, c-format
+msgid "%s: changes to tablespace directories will not be undone\n"
+msgstr "תכנית %s: ×©×™× ×•×™×™× ×¡×¤×¨×™×•×ª מרחב טבל×ות ×œ× ×™×‘×•×˜×œ×•\n"
+
+#: pg_basebackup.c:250
+#, c-format
+msgid "%s: directory name too long\n"
+msgstr "תכנית %s: ×©× ×”×¡×¤×¨×™×™×” יותר מדי ×רוך\n"
+
+#: pg_basebackup.c:260
+#, c-format
+msgid "%s: multiple \"=\" signs in tablespace mapping\n"
+msgstr "תכנית %s: ×¡×™×ž× ×™× \"=\" ×ž×¨×•×‘×™× ×‘×ž×™×¤×•×™ מרחב טבל×ות\n"
+
+#: pg_basebackup.c:273
+#, c-format
+msgid "%s: invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"\n"
+msgstr "תכנית %s: תבנית המיפוי ×œ× ×—×•×§×™ \"%s\" של מרחב טבל×ות, חייב להיות \"OLDDIR = NEWDIR\"\n"
+
+#: pg_basebackup.c:286
+#, c-format
+msgid "%s: old directory is not an absolute path in tablespace mapping: %s\n"
+msgstr "תכנית %s: ספרייה הישנה ××™× ×” נתיב מוחלט במיפוי מרחב טבל×ות: %s\n"
+
+#: pg_basebackup.c:293
+#, c-format
+msgid "%s: new directory is not an absolute path in tablespace mapping: %s\n"
+msgstr "תכנית %s: הספריה החדשה ××™× ×” נתיב מוחלט במיפוי מרחב טל×ות: %s\n"
+
+#: pg_basebackup.c:327
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"תכנית %s לוקח גיבוי בסיסי של שרת PostgreSQL פועל.\n"
+"\n"
+
+#: pg_basebackup.c:329 pg_receivewal.c:76 pg_recvlogical.c:77
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: pg_basebackup.c:330 pg_receivewal.c:77 pg_recvlogical.c:78
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"×פשרויות שליטה בפלט:\n"
+
+#: pg_basebackup.c:332
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr ""
+" -D\n"
+" --pgdata=DIRECTORY\n"
+"לקבל גיבוי בסיס לתוך הספריה\n"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr ""
+" -F\n"
+" --format=p|t\n"
+"תבנית פלט (רגיל (ברירת המחדל), tar)\n"
+
+#: pg_basebackup.c:334
+#, c-format
+msgid " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+msgstr ""
+" -r\n"
+" --max-rate=RATE\n"
+"קצב המירבי להעברת × ×ª×•× ×™× ×œ×¡×¤×¨×™×™×”\n"
+
+#: pg_basebackup.c:335
+#, c-format
+msgid " (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr " (ב- kB/s, ×ו תשתמש בסיומת \"k\" ×ו \"M\")\n"
+
+#: pg_basebackup.c:336
+#, c-format
+msgid " -R, --write-recovery-conf\n"
+msgstr ""
+" -R\n"
+" --write-recovery-conf\n"
+
+#: pg_basebackup.c:337
+#, c-format
+msgid " write recovery.conf for replication\n"
+msgstr " לכתוב recovery.conf עבור שכפול\n"
+
+#: pg_basebackup.c:338 pg_receivewal.c:84
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr ""
+" -S\n"
+" --slot=SLOTNAME\n"
+"חריץ שכפול לשימוש\n"
+
+#: pg_basebackup.c:339
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot\n"
+"למנוע יצירה של חריץ שכפול זמני\n"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid " -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+msgstr ""
+" -T\n"
+" --tablespace-mapping=OLDDIR=NEWDIR\n"
+
+#: pg_basebackup.c:341
+#, c-format
+msgid " relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr " לעבור מרחב טבל×ות מ OLDDIR ל NEWDIR\n"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid " -X, --wal-method=none|fetch|stream\n"
+msgstr ""
+" -X\n"
+" --wal-method=none|fetch|stream\n"
+
+#: pg_basebackup.c:343
+#, c-format
+msgid " include required WAL files with specified method\n"
+msgstr " כלול קבצי WAL ×”× ×“×¨×©×™× ×¢× ×©×™×˜×” שצוינה\n"
+
+#: pg_basebackup.c:344
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" --waldir = WALDIR\n"
+"×ž×™×§×•× ×¢×‘×•×¨ ספריית WAL\n"
+
+#: pg_basebackup.c:345
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr ""
+" -z\n"
+" --gzip\n"
+"לדחוס פלט tar \n"
+
+#: pg_basebackup.c:346
+#, c-format
+msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr ""
+" -Z\n"
+" --compress=0-9\n"
+"לדחוס ×™×•×ž× ×™× ×‘×¨×ž×ª דחיסה שצוינה\n"
+
+#: pg_basebackup.c:347
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"×פשרויות כלליות:\n"
+
+#: pg_basebackup.c:348
+#, c-format
+msgid " -c, --checkpoint=fast|spread\n"
+msgstr ""
+" -c\n"
+" --checkpoint=fast|spread\n"
+
+#: pg_basebackup.c:349
+#, c-format
+msgid " set fast or spread checkpointing\n"
+msgstr " הגדר ביצוע של נקודת הביקורת: מהר ×ו ל×\n"
+
+#: pg_basebackup.c:350
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr ""
+" -l\n"
+" --label=LABEL\n"
+"להגדיר תווית גיבוי\n"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr ""
+" -n\n"
+" --no-clean\n"
+"×œ× ×œ× ×§×•×ª ל×חר שגי×ות\n"
+
+#: pg_basebackup.c:352
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N\n"
+" --no-sync\n"
+"×œ× ×œ×—×›×•×ª עד ×שר ×”×©×™× ×•×™×™× ×™×™×›×ª×‘×• בבטחה לדיסק\n"
+
+#: pg_basebackup.c:353
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr ""
+" -P\n"
+" --progress\n"
+"הצג מידע ×ודות התקדמות\n"
+
+#: pg_basebackup.c:354 pg_receivewal.c:86 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr ""
+" -v\n"
+" --verbose\n"
+"הצג הודעות פלט מילוליות\n"
+
+#: pg_basebackup.c:355 pg_receivewal.c:87 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V\n"
+" --version\n"
+"להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: pg_basebackup.c:356 pg_receivewal.c:89 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?\n"
+" --help\n"
+"להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: pg_basebackup.c:357 pg_receivewal.c:90 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"×פשרויות חיבור:\n"
+
+#: pg_basebackup.c:358 pg_receivewal.c:91
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr ""
+" -d\n"
+"--dbname=CONNSTR\n"
+"מחרוזת חיבור\n"
+
+#: pg_basebackup.c:359 pg_receivewal.c:92 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h\n"
+" --host=HOSTNAME\n"
+"שרת מ×רח של מסד ×”× ×ª×•× ×™× ×ו ספריית שקע\n"
+
+#: pg_basebackup.c:360 pg_receivewal.c:93 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr ""
+" -p\n"
+" --port=PORT\n"
+"פורט שרת מסד נתוני×\n"
+
+#: pg_basebackup.c:361
+#, c-format
+msgid " -s, --status-interval=INTERVAL\n"
+msgstr ""
+" -s\n"
+" --status-interval=INTERVAL\n"
+
+#: pg_basebackup.c:362
+#, c-format
+msgid " time between status packets sent to server (in seconds)\n"
+msgstr " זמן בין מנות המצב הנשלחות לשרת (בשניות)\n"
+
+#: pg_basebackup.c:363 pg_receivewal.c:94 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr ""
+" -U\n"
+" --username=NAME\n"
+"להתחבר כמשתמש מסד ×”× ×ª×•× ×™× ×”×ž×¦×•×™×Ÿ\n"
+
+#: pg_basebackup.c:364 pg_receivewal.c:95 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr ""
+" -w\n"
+" --no-password\n"
+"×œ×¢×•×œ× ×œ× ×œ×‘×§×© סיסמה\n"
+
+#: pg_basebackup.c:365 pg_receivewal.c:96 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W\n"
+" --password\n"
+"נדרשת בקשת סיסמה (צריך לקרות ב×ופן ×וטומטי)\n"
+
+#: pg_basebackup.c:366 pg_receivewal.c:100 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid "%s: could not read from ready pipe: %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ×œ×§×¨×•× ×ž×¦×™× ×•×¨ מוכן: %s\n"
+
+#: pg_basebackup.c:417 pg_basebackup.c:552 pg_basebackup.c:2001
+#: streamutil.c:285
+#, c-format
+msgid "%s: could not parse write-ahead log location \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח ×ת ×”×ž×™×§×•× ×©×œ WAL \"%s\"\n"
+
+#: pg_basebackup.c:515 pg_receivewal.c:428
+#, c-format
+msgid "%s: could not finish writing WAL files: %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ ×œ×¡×™×™× ×ת כתיבת קבצי WAL: %s\n"
+
+#: pg_basebackup.c:565
+#, c-format
+msgid "%s: could not create pipe for background process: %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ ליצור צינור עבור תהליך הרקע: %s\n"
+
+#: pg_basebackup.c:605 pg_basebackup.c:661 pg_basebackup.c:1419
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור תיקייה \"%s\": %s\n"
+
+#: pg_basebackup.c:624
+#, c-format
+msgid "%s: could not create background process: %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור תהליך רקע: %s\n"
+
+#: pg_basebackup.c:636
+#, c-format
+msgid "%s: could not create background thread: %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור הליך רקע משנה: %s\n"
+
+#: pg_basebackup.c:684
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "תכנית %s: תיקייה \"%s\" קיימת, ×ך ××™× ×” ריקה\n"
+
+#: pg_basebackup.c:692
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לגשת לתיקייה \"%s\": %s\n"
+
+#: pg_basebackup.c:754
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "סטטוס: %*s/%s kB (100%%), %d/%d מרחב טבל×ות %*s"
+msgstr[1] "סטטוס: %*s/%s kB (100%%), %d/%d מרחבי טבל×ות %*s"
+
+#: pg_basebackup.c:766
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "סטטוס: %*s/%s kB (%d%%), %d/%d מרחב טבל×ות (%s%-*.*s)"
+msgstr[1] "סטטוס: %*s/%s kB (%d%%), %d/%d מרחבי טבל×ות (%s%-*.*s)"
+
+#: pg_basebackup.c:782
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "סטטוס: %*s/%s kB (%d%%), %d/%d מרחב טבל×ות"
+msgstr[1] "סטטוס: %*s/%s kB (%d%%), %d/%d מרחבי טבל×ות"
+
+#: pg_basebackup.c:804
+#, c-format
+msgid "%s: transfer rate \"%s\" is not a valid value\n"
+msgstr "תכנית %s: קצב העברה '%s' ×ינו ערך חוקי\n"
+
+#: pg_basebackup.c:811
+#, c-format
+msgid "%s: invalid transfer rate \"%s\": %s\n"
+msgstr "תכנית %s: קצב העברה ×œ× ×—×•×§×™ \"%s\": %s\n"
+
+#: pg_basebackup.c:821
+#, c-format
+msgid "%s: transfer rate must be greater than zero\n"
+msgstr "תכנית %s: קצב ההעברה חייב להיות גדול מ×פס\n"
+
+#: pg_basebackup.c:855
+#, c-format
+msgid "%s: invalid --max-rate unit: \"%s\"\n"
+msgstr "תכנית %s: יחידת --max-rate ×œ× ×—×•×§×™×ª \"%s\"\n"
+
+#: pg_basebackup.c:864
+#, c-format
+msgid "%s: transfer rate \"%s\" exceeds integer range\n"
+msgstr "תכנית %s: קצב ההעברה \"%s\" חורג טווח מספר של×\n"
+
+#: pg_basebackup.c:876
+#, c-format
+msgid "%s: transfer rate \"%s\" is out of range\n"
+msgstr "תכנית %s: קצב ההעברה \"%s\" × ×ž×¦× ×ž×—×•×¥ לטווח\n"
+
+#: pg_basebackup.c:900
+#, c-format
+msgid "%s: could not write to compressed file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×ž×¦×œ×™×— לכתוב לקובץ דחוס \"%s\": %s\n"
+
+#: pg_basebackup.c:910 pg_basebackup.c:1513 pg_basebackup.c:1679
+#, c-format
+msgid "%s: could not write to file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לכתוב לקובץ \"%s\": %s\n"
+
+#: pg_basebackup.c:965 pg_basebackup.c:986 pg_basebackup.c:1014
+#, c-format
+msgid "%s: could not set compression level %d: %s\n"
+msgstr "תכנתי %s: ×œ× ×”×™×ª×” ×פשרות להגדיר ×ת רמת הדחיסה % d: %s\n"
+
+#: pg_basebackup.c:1035
+#, c-format
+msgid "%s: could not create compressed file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור קובץ דחוס \"%s\": %s\n"
+
+#: pg_basebackup.c:1046 pg_basebackup.c:1473 pg_basebackup.c:1672
+#, c-format
+msgid "%s: could not create file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור קובץ \"%s\": %s\n"
+
+#: pg_basebackup.c:1058 pg_basebackup.c:1326
+#, c-format
+msgid "%s: could not get COPY data stream: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לקבל COPY ×ž× ×ª×•× ×™× ×ž×•×¢×ª×§×™×: %s"
+
+#: pg_basebackup.c:1115
+#, c-format
+msgid "%s: could not close compressed file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לסגור קובץ דחוס \"%s\": %s\n"
+
+#: pg_basebackup.c:1128 pg_recvlogical.c:631 receivelog.c:221 receivelog.c:306
+#: receivelog.c:712
+#, c-format
+msgid "%s: could not close file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לסגור הקובץ \"%s\": %s\n"
+
+#: pg_basebackup.c:1139 pg_basebackup.c:1355 pg_recvlogical.c:453
+#: receivelog.c:1007
+#, c-format
+msgid "%s: could not read COPY data: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ×œ×§×¨×•× × ×ª×•× ×™× ×ž COPY: %s"
+
+#: pg_basebackup.c:1369
+#, c-format
+msgid "%s: invalid tar block header size: %d\n"
+msgstr "תכנית %s: גודל הכותרת של בלוק tar ×œ× ×—×•×§×™: %d\n"
+
+#: pg_basebackup.c:1427
+#, c-format
+msgid "%s: could not set permissions on directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להגדיר הרש×ות בספריה \"%s\": %s\n"
+
+#: pg_basebackup.c:1451
+#, c-format
+msgid "%s: could not create symbolic link from \"%s\" to \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור קישור סימבולי מ \"%s\" ל- \"%s\": %s\n"
+
+#: pg_basebackup.c:1460
+#, c-format
+msgid "%s: unrecognized link indicator \"%c\"\n"
+msgstr "תכנית %s: מחוון קישור ×œ× ×ž×–×•×”×” '%c'\n"
+
+#: pg_basebackup.c:1480
+#, c-format
+msgid "%s: could not set permissions on file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להגדיר הרש×ות הקובץ \"%s\": %s\n"
+
+#: pg_basebackup.c:1539
+#, c-format
+msgid "%s: COPY stream ended before last file was finished\n"
+msgstr "תכנית %s: הזרמת COPY הסתיימה לפני שקובץ ×”×חרון הסתיי×\n"
+
+#: pg_basebackup.c:1567 pg_basebackup.c:1587 pg_basebackup.c:1594
+#: pg_basebackup.c:1647
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "תכנית %s: ×ין זיכרון פנוי\n"
+
+#: pg_basebackup.c:1720
+#, c-format
+msgid "%s: incompatible server version %s\n"
+msgstr "תכנית %s: גירסת שרת ×œ× ×ª×•×מת %s\n"
+
+#: pg_basebackup.c:1735
+#, c-format
+msgid "HINT: use -X none or -X fetch to disable log streaming\n"
+msgstr "רמז: השתמש ב -X none ×ו ב -X fetch להשבתת הזרמה ליומן\n"
+
+#: pg_basebackup.c:1761
+#, c-format
+msgid "%s: initiating base backup, waiting for checkpoint to complete\n"
+msgstr "תכנית %s: ×™×™×–×•× ×’×™×‘×•×™ בסיס, ממתין להשלמת צ'ק-פוינט\n"
+
+#: pg_basebackup.c:1779 pg_recvlogical.c:270 receivelog.c:490 receivelog.c:561
+#: receivelog.c:601 streamutil.c:255 streamutil.c:363 streamutil.c:409
+#, c-format
+msgid "%s: could not send replication command \"%s\": %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח פקודת השכפול \"%s\": %s"
+
+#: pg_basebackup.c:1790
+#, c-format
+msgid "%s: could not initiate base backup: %s"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ ×œ×™×–×•× ×’×™×‘×•×™ בסיס: %s"
+
+#: pg_basebackup.c:1797
+#, c-format
+msgid "%s: server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "תכנית %s: השרת החזיר תגובה ×œ× ×¦×¤×•×™×” לפקודה BASE_BACKUP; יש %d שורות ו- %d שדות, הצפי ל %d שורות ו %dשדות\n"
+
+#: pg_basebackup.c:1805
+#, c-format
+msgid "%s: checkpoint completed\n"
+msgstr "תכנית %s: ×ž×—×¡×•× ×”×•×©×œ×\n"
+
+#: pg_basebackup.c:1820
+#, c-format
+msgid "%s: write-ahead log start point: %s on timeline %u\n"
+msgstr "תכנית %s: נקודת התחלה של WAL: %s בציר הזמן %u\n"
+
+#: pg_basebackup.c:1829
+#, c-format
+msgid "%s: could not get backup header: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לקבל כותרת גיבוי: %s"
+
+#: pg_basebackup.c:1835
+#, c-format
+msgid "%s: no data returned from server\n"
+msgstr "תכנית %s: ×ין × ×ª×•× ×™× ×©×”×•×—×–×¨×• משרת\n"
+
+#: pg_basebackup.c:1867
+#, c-format
+msgid "%s: can only write single tablespace to stdout, database has %d\n"
+msgstr "תכנית %s: יכול לכתוב רק מחרב טבל×ות יחיד ל stdout, למסד ×”× ×ª×•× ×™× ×™×© %d\n"
+
+#: pg_basebackup.c:1879
+#, c-format
+msgid "%s: starting background WAL receiver\n"
+msgstr "תכנית %s: החל מקלט רקע של WAL\n"
+
+#: pg_basebackup.c:1910
+#, c-format
+msgid "%s: could not get write-ahead log end position from server: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לקבל ×ž×™×§×•× ×¡×•×¤×™ בWAL משרת: %s"
+
+#: pg_basebackup.c:1917
+#, c-format
+msgid "%s: no write-ahead log end position returned from server\n"
+msgstr "תכנית %s: ×ž×™×§×•× ×¡×•×¤×™ בWAK ×œ× ×”×•×—×–×¨ מהשרת\n"
+
+#: pg_basebackup.c:1923
+#, c-format
+msgid "%s: write-ahead log end point: %s\n"
+msgstr "תכנית %s: נקודת ×¡×™×•× ×©×š WAL: %s\n"
+
+#: pg_basebackup.c:1929
+#, c-format
+msgid "%s: final receive failed: %s"
+msgstr "תכנית %s: השליחה הסופית נכשלה: %s"
+
+#: pg_basebackup.c:1953
+#, c-format
+msgid "%s: waiting for background process to finish streaming ...\n"
+msgstr "תכנית %s: מחכה לתהליך רקע ×œ×¡×™×™× ×–×¨×™×ž×”...\n"
+
+#: pg_basebackup.c:1959
+#, c-format
+msgid "%s: could not send command to background pipe: %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח פקודה לצינור רקע: %s\n"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "%s: could not wait for child process: %s\n"
+msgstr "תכנתי %s: ×œ× ×™×›×•×œ ×”×™×” לחכות לתהליך צ×צ×: %s\n"
+
+#: pg_basebackup.c:1974
+#, c-format
+msgid "%s: child %d died, expected %d\n"
+msgstr "תכנית %s: תהליך צ××¦× %d הופסק, צפוי %d\n"
+
+#: pg_basebackup.c:1980
+#, c-format
+msgid "%s: child process did not exit normally\n"
+msgstr "תכנתי %s: תהליך צ××¦× ×œ× ×™×¦× ×›×”×œ×›×”\n"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "%s: child process exited with error %d\n"
+msgstr "תכנתי %s: תהליך צ××¦× ×¢× ×©×’×™××” %d\n"
+
+#: pg_basebackup.c:2013
+#, c-format
+msgid "%s: could not wait for child thread: %s\n"
+msgstr "תכנתי %s: ×œ× ×™×›×•×œ ×”×™×” לחכות תהליך צ××¦× ×ž×©× ×”: %s\n"
+
+#: pg_basebackup.c:2020
+#, c-format
+msgid "%s: could not get child thread exit status: %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לקבל ×ת מצב היצי××” של תהליך צ××¦× ×”×ž×©× ×”: %s\n"
+
+#: pg_basebackup.c:2026
+#, c-format
+msgid "%s: child thread exited with error %u\n"
+msgstr "תכנית %s: תהליך צ××¦× ×ž×©× ×”×™×¦× ×¢× ×©×’×™××” %u\n"
+
+#: pg_basebackup.c:2064
+#, c-format
+msgid "%s: base backup completed\n"
+msgstr "תכנתי %s: הגיבוי הבסיסי הושל×\n"
+
+#: pg_basebackup.c:2141
+#, c-format
+msgid "%s: invalid output format \"%s\", must be \"plain\" or \"tar\"\n"
+msgstr "תכנית %s: תבנית הפלט ×œ× ×—×•×§×™×ª \"%s\", חייבת להיות \"plain\" ×ו \"tar\"\n"
+
+#: pg_basebackup.c:2186
+#, c-format
+msgid "%s: invalid wal-method option \"%s\", must be \"fetch\", \"stream\" or \"none\"\n"
+msgstr "תכנית %s: ×ופציה wal-method ×œ× ×—×•×§×™×ª \"%s\", חייב להיות \"fetch\", \"stream\" ×ו \"none\"\n"
+
+#: pg_basebackup.c:2214 pg_receivewal.c:556
+#, c-format
+msgid "%s: invalid compression level \"%s\"\n"
+msgstr "תכנית %s: רמת הדחיסה ×œ× ×—×•×§×™×ª \"%s\"\n"
+
+#: pg_basebackup.c:2226
+#, c-format
+msgid "%s: invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"\n"
+msgstr "תכנית %s: ×רגומנט ×”×ž×—×¡×•× ×œ× ×—×•×§×™ \"%s\", חייב להיות \"fast\" ×ו \"spread\"\n"
+
+#: pg_basebackup.c:2253 pg_receivewal.c:538 pg_recvlogical.c:825
+#, c-format
+msgid "%s: invalid status interval \"%s\"\n"
+msgstr "תכנית %s: מרווח מצב ×œ× ×—×•×§×™ \"%s\"\n"
+
+#: pg_basebackup.c:2269 pg_basebackup.c:2283 pg_basebackup.c:2294
+#: pg_basebackup.c:2307 pg_basebackup.c:2317 pg_basebackup.c:2327
+#: pg_basebackup.c:2339 pg_basebackup.c:2353 pg_basebackup.c:2364
+#: pg_receivewal.c:579 pg_receivewal.c:593 pg_receivewal.c:601
+#: pg_receivewal.c:611 pg_receivewal.c:622 pg_recvlogical.c:852
+#: pg_recvlogical.c:866 pg_recvlogical.c:877 pg_recvlogical.c:885
+#: pg_recvlogical.c:893 pg_recvlogical.c:901 pg_recvlogical.c:909
+#: pg_recvlogical.c:917 pg_recvlogical.c:927
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: pg_basebackup.c:2281 pg_receivewal.c:591 pg_recvlogical.c:864
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "תכנית %s: יותר מדי ××¨×’×•×ž× ×˜×™× ×©×œ שורת הפקודה (הר×שון ×”×•× \"%s\")\n"
+
+#: pg_basebackup.c:2293 pg_receivewal.c:621
+#, c-format
+msgid "%s: no target directory specified\n"
+msgstr "תכנית %s: ×œ× ×¦×•×™× ×” ספריית היעד\n"
+
+#: pg_basebackup.c:2305
+#, c-format
+msgid "%s: only tar mode backups can be compressed\n"
+msgstr "תכנית %s: רק ×’×™×‘×•×™×™× ×‘×ž×¦×‘ tar ניתן לדחוס\n"
+
+#: pg_basebackup.c:2315
+#, c-format
+msgid "%s: cannot stream write-ahead logs in tar mode to stdout\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להציגWAL במצב tar ב stdout\n"
+
+#: pg_basebackup.c:2325
+#, c-format
+msgid "%s: replication slots can only be used with WAL streaming\n"
+msgstr "תכנית %s: חריצי שכפול ×™×›×•×œ×™× ×œ×©×ž×© רק ×¢× ×”×–×¨×ž×ª WAL\n"
+
+#: pg_basebackup.c:2337
+#, c-format
+msgid "%s: --no-slot cannot be used with slot name\n"
+msgstr "תכנית %s: ×ין ×פשרות להשתמש ב --no-slot ×¢× ×©× ×—×¨×™×¥\n"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "%s: WAL directory location can only be specified in plain mode\n"
+msgstr "תכנית %s: ניתן לציין ×ž×™×§×•× ×¡×¤×¨×™×™×ª WAL רק במצב רגיל\n"
+
+#: pg_basebackup.c:2362
+#, c-format
+msgid "%s: WAL directory location must be an absolute path\n"
+msgstr "תכנית %s: ×”×ž×™×§×•× ×”×ª×™×§×™×™×” עבור WAL חייב להיות נתיב מוחלט\n"
+
+#: pg_basebackup.c:2374 pg_receivewal.c:631
+#, c-format
+msgid "%s: this build does not support compression\n"
+msgstr "תכנית %s: הבילד ×”×–×” ×ינו תומך דחיסה\n"
+
+#: pg_basebackup.c:2414
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ליצור קישור סמלי \"%s\": %s\n"
+
+#: pg_basebackup.c:2419
+#, c-format
+msgid "%s: symlinks are not supported on this platform\n"
+msgstr "תכנית %s: ×§×™×©×•×¨×™× ×¡×™×ž×‘×•×œ×™×™× ××™× × × ×ª×ž×›×™× ×‘×¤×œ×˜×¤×•×¨×ž×” זו\n"
+
+#: pg_receivewal.c:74
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"תכנית %s מקבלת הזרמת WAL של PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:78 pg_recvlogical.c:83
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"×פשרויות:\n"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D\n"
+" --directory=DIR\n"
+"לקבל קבצי WAL לספריה זו\n"
+
+#: pg_receivewal.c:80 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr ""
+" --if-not-exists\n"
+"×œ× ×œ×–×¨×•×§ שגי××” ×× ×—×¨×™×¥ ×§×™×™× ×›×‘×¨ בעת יצירתו\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:90
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr ""
+" -n\n"
+" --no-loop\n"
+"×ל תיכנס ללול××” ×›×שר החיבור ×בד\n"
+
+#: pg_receivewal.c:82 pg_recvlogical.c:95
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s\n"
+" --status-interval=SECS\n"
+"זמן בין מנות המצב הנשלחות לשרת (ברירת מחדל: %d)\n"
+
+#: pg_receivewal.c:85
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr ""
+" --synchronous\n"
+"לסמוק WAL מיד ל×חר הכתיבה\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+msgstr ""
+" -Z\n"
+" --compress=0-9\n"
+"לדחוס ×™×•×ž× ×™× ×‘×¨×ž×ª דחיסה שצוינה\n"
+
+#: pg_receivewal.c:97
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"פעולות ×ופציונליי×:\n"
+
+#: pg_receivewal.c:98 pg_recvlogical.c:80
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --create-slot\n"
+"ליצור חריץ שכפול חדש (עבור ×”×©× ×©×œ החריץ ר×ו --slot)\n"
+
+#: pg_receivewal.c:99 pg_recvlogical.c:81
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --drop-slot\n"
+"להוריד חריץ השכפול (עבור ×”×©× ×©×œ החריץ ר×ו --slot)\n"
+
+#: pg_receivewal.c:111
+#, c-format
+msgid "%s: finished segment at %X/%X (timeline %u)\n"
+msgstr "תכנית %s: ×ž×¡×™×™× ×ž×§×˜×¢ %X/%X (ציר זמן %u)\n"
+
+#: pg_receivewal.c:124
+#, c-format
+msgid "%s: switched to timeline %u at %X/%X\n"
+msgstr ""
+"תכנית %s: החלפת ציר הזמן %u ב %X/%X\n"
+"\n"
+
+#: pg_receivewal.c:133
+#, c-format
+msgid "%s: received interrupt signal, exiting\n"
+msgstr "תכנית %s: נתקבל ×יתות הפסיקה, יוצ×\n"
+
+#: pg_receivewal.c:171
+#, c-format
+msgid "%s: could not close directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לסגור תיקייה \"%s\": %s\n"
+
+#: pg_receivewal.c:260
+#, c-format
+msgid "%s: segment file \"%s\" has incorrect size %d, skipping\n"
+msgstr "תכנית %s: לקטע הקובץ \"%s\" יש גודל שגוי %d, מדלג\n"
+
+#: pg_receivewal.c:277
+#, c-format
+msgid "%s: could not open compressed file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח קובץ דחוס \"%s\": %s\n"
+
+#: pg_receivewal.c:283
+#, c-format
+msgid "%s: could not seek compressed file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לחפש ×חר הקובץ הדחוס \"%s\": %s\n"
+
+#: pg_receivewal.c:289
+#, c-format
+msgid "%s: could not read compressed file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ×œ×§×¨×•× ×§×•×‘×¥ דחוס \"%s\": %s\n"
+
+#: pg_receivewal.c:301
+#, c-format
+msgid "%s: compressed segment file \"%s\" has incorrect uncompressed size %d, skipping\n"
+msgstr "תכנית %s: לקובץ קטע דחוס \"%s\" יש גודל ×œ× ×“×—×•×¡ שגוי %d, מדלג\n"
+
+#: pg_receivewal.c:407
+#, c-format
+msgid "%s: starting log streaming at %X/%X (timeline %u)\n"
+msgstr "תכנית %s: החל יומן בכתובת %X/%X (ציר זמן %u)\n"
+
+#: pg_receivewal.c:519 pg_recvlogical.c:762
+#, c-format
+msgid "%s: invalid port number \"%s\"\n"
+msgstr "תכנית %s: מספר הפורט ×œ× ×—×•×§×™ \"%s\"\n"
+
+#: pg_receivewal.c:600
+#, c-format
+msgid "%s: cannot use --create-slot together with --drop-slot\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ להשתמש ב --create-slot יחד ×¢× --drop-slot\n"
+
+#. translator: second %s is an option name
+#: pg_receivewal.c:609
+#, c-format
+msgid "%s: %s needs a slot to be specified using --slot\n"
+msgstr "תכנית %s: %s חריץ חייב להיות צוין ×¢× --slot\n"
+
+#: pg_receivewal.c:674
+#, c-format
+msgid "%s: replication connection using slot \"%s\" is unexpectedly database specific\n"
+msgstr "תכנית %s: חיבור שכפול ב×מצעות חריץ \"%s\" ×”×•× ×‘×œ×ª×™ צפוי של מסד × ×ª×•× ×™× ×¡×¤×¦×™×¤×™\n"
+
+#: pg_receivewal.c:686 pg_recvlogical.c:967
+#, c-format
+msgid "%s: dropping replication slot \"%s\"\n"
+msgstr "תכנית %s: נשירת חריץ שכפול \"%s\"\n"
+
+#: pg_receivewal.c:699 pg_recvlogical.c:979
+#, c-format
+msgid "%s: creating replication slot \"%s\"\n"
+msgstr "תכנית %s: יצירת חריץ שכפול \"%s\"\n"
+
+#: pg_receivewal.c:726 pg_recvlogical.c:1005
+#, c-format
+msgid "%s: disconnected\n"
+msgstr "תכנית %s: מנותק\n"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:733 pg_recvlogical.c:1012
+#, c-format
+msgid "%s: disconnected; waiting %d seconds to try again\n"
+msgstr "תכנית %s: מנותק; מחכה %d שניות כדי לנסות שוב\n"
+
+#: pg_recvlogical.c:75
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"תכנית %s שולטת בזרמי פענוח ×œ×•×’×™×™× ×©×œ PostgreSQL\n"
+"\n"
+
+#: pg_recvlogical.c:79
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"פעולה שיש לבצע:\n"
+
+#: pg_recvlogical.c:82
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --start\n"
+"להתחיל הזרמת בחריץ שכפול (עבור ×”×©× ×©×œ החריץ ר×ו --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f\n"
+"--file=FILE\n"
+"לקבל יומן לקובץ זה,ל - stdout\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F\n"
+" --fsync-interval=SECS\n"
+"זמן בין fsyncs לקובץ הפלט (ברירת מחדל: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr ""
+" -I\n"
+" --startpos=LSN\n"
+"היכן בחריץ ×”×§×™×™× ×¦×¨×™×›×” להתחיל ההזרמה\n"
+
+#: pg_recvlogical.c:89
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr ""
+" -E\n"
+" --endpos=LSN\n"
+"לצ×ת ל×חר שקיבל ×ת LSN שצוין\n"
+
+#: pg_recvlogical.c:91
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o\n"
+" --option=NAME[=VALUE]\n"
+"להעביר ×פשרות NAME ×¢× ×¢×¨×š ×ופציונלי VALUE לתוסף פלט\n"
+
+#: pg_recvlogical.c:94
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P\n"
+" --plugin=PLUGIN\n"
+"שימוש בתוסף הפלט PLUGIN (ברירת מחדל: %s)\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr ""
+" -S\n"
+" --slot=SLOTNAME\n"
+"×©× ×©×œ חריץ שכפול לוגי\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr ""
+" -d\n"
+" --dbname = DBNAME\n"
+"מסד × ×ª×•× ×™× ×œ×”×ª×—×‘×¨ ×ליו\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "%s: confirming write up to %X/%X, flush to %X/%X (slot %s)\n"
+msgstr "תכנית %s: מ×שר לכתוב עד % X/%X, סומק ל %X/%X (חריץ %s)\n"
+
+#: pg_recvlogical.c:160 receivelog.c:349
+#, c-format
+msgid "%s: could not send feedback packet: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח מנת המשוב: %s"
+
+#: pg_recvlogical.c:199
+#, c-format
+msgid "%s: could not fsync log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להעביר תוכן הקובץ יומן (fsync) לדיסק \"%s\": %s\n"
+
+#: pg_recvlogical.c:238
+#, c-format
+msgid "%s: starting log streaming at %X/%X (slot %s)\n"
+msgstr "תכנית %s: החל הזרמת היומן בכתובת %X/%X (חריץ %s)\n"
+
+#: pg_recvlogical.c:280
+#, c-format
+msgid "%s: streaming initiated\n"
+msgstr "תכנית %s: זרימה יזומה\n"
+
+#: pg_recvlogical.c:346
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח קובץ יומן ×”×¨×™×©×•× \"%s\": %s\n"
+
+#: pg_recvlogical.c:376 receivelog.c:912
+#, c-format
+msgid "%s: invalid socket: %s"
+msgstr "תכנית %s: שקע ×œ× ×—×•×§×™×ª: %s"
+
+#: pg_recvlogical.c:430 receivelog.c:941
+#, c-format
+msgid "%s: select() failed: %s\n"
+msgstr ""
+"תכנית %s: נכשל select(): %s\n"
+"\n"
+
+#: pg_recvlogical.c:439 receivelog.c:993
+#, c-format
+msgid "%s: could not receive data from WAL stream: %s"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לקבל × ×ª×•× ×™× ×ž×”×–×¨× WAL: %s"
+
+#: pg_recvlogical.c:481 pg_recvlogical.c:533 receivelog.c:1038
+#: receivelog.c:1105
+#, c-format
+msgid "%s: streaming header too small: %d\n"
+msgstr "תכנית %s: כותרת הזרימה קטן מדי: %d\n"
+
+#: pg_recvlogical.c:517 receivelog.c:872
+#, c-format
+msgid "%s: unrecognized streaming header: \"%c\"\n"
+msgstr "תכנית %s: כותרת זרימה בלתי מוכרת: \"%c\"\n"
+
+#: pg_recvlogical.c:573 pg_recvlogical.c:587
+#, c-format
+msgid "%s: could not write %u bytes to log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×ž×¦×œ×™×— לכתוב %u ×‘×ª×™× ×œ×§×•×‘×¥ יומן \"%s\": %s\n"
+
+#: pg_recvlogical.c:617 receivelog.c:665 receivelog.c:703
+#, c-format
+msgid "%s: unexpected termination of replication stream: %s"
+msgstr "תכנית %s: ×¡×™×•× ×‘×œ×ª×™ צפוי של ×–×¨× ×”×©×›×¤×•×œ: %s"
+
+#: pg_recvlogical.c:741
+#, c-format
+msgid "%s: invalid fsync interval \"%s\"\n"
+msgstr "תכנית %s : מרווח fsync ×œ× ×—×•×§×™ \"%s\"\n"
+
+#: pg_recvlogical.c:782
+#, c-format
+msgid "%s: could not parse start position \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח ×ž×™×§×•× ×”×”×ª×—×œ×” \"%s\"\n"
+
+#: pg_recvlogical.c:792
+#, c-format
+msgid "%s: could not parse end position \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח ×ž×™×§×•× ×§×¦×” \"%s\"\n"
+
+#: pg_recvlogical.c:876
+#, c-format
+msgid "%s: no slot specified\n"
+msgstr "תכנית %s: ×œ× ×¦×•×™×Ÿ חריץ\n"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "%s: no target file specified\n"
+msgstr "תכנית %s: ×œ× ×¦×•×™×Ÿ קובץ היעד\n"
+
+#: pg_recvlogical.c:892
+#, c-format
+msgid "%s: no database specified\n"
+msgstr "תכנית %s: ×œ× ×¦×•×™×Ÿ מסד נתוני×\n"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "%s: at least one action needs to be specified\n"
+msgstr "תכנית %s: ×—×™×™×‘×™× ×œ×¦×™×™×Ÿ פעולה ×חת לפחות\n"
+
+#: pg_recvlogical.c:908
+#, c-format
+msgid "%s: cannot use --create-slot or --start together with --drop-slot\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ להשתמש ב --create-slot ×ו --start יחד ×¢× --drop-slot\n"
+
+#: pg_recvlogical.c:916
+#, c-format
+msgid "%s: cannot use --create-slot or --drop-slot together with --startpos\n"
+msgstr ""
+"תכנית %s: ×œ× ×™×›×•×œ להשתמש ב --create-slot ×ו ב --drop-slot יחד ×¢× --startpos\n"
+"\n"
+
+#: pg_recvlogical.c:925
+#, c-format
+msgid "%s: --endpos may only be specified with --start\n"
+msgstr ""
+"תכנית %s: ×פשר לציין --endpos רק ×¢× --start\n"
+"\n"
+
+#: pg_recvlogical.c:957
+#, c-format
+msgid "%s: could not establish database-specific replication connection\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור חיבור ×©×›×¤×•×œ×™× ×¡×¤×¦×™×¤×™×ª למסד נתוני×\n"
+
+#: receivelog.c:71
+#, c-format
+msgid "%s: could not create archive status file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור קובץ מצב ×”×רכיון \"%s\": %s\n"
+
+#: receivelog.c:119
+#, c-format
+msgid "%s: could not get size of write-ahead log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לקבל ×ת הגודל של קובץ WAL \"%s\": %s\n"
+
+#: receivelog.c:130
+#, c-format
+msgid "%s: could not open existing write-ahead log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח קובץ ×™WAL ×§×™×™× \"%s\": %s\n"
+
+#: receivelog.c:139
+#, c-format
+msgid "%s: could not sync existing write-ahead log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לסנכרן קובץ WAL ×§×™×™× \"%s\": %s\n"
+
+#: receivelog.c:154
+#, c-format
+msgid "%s: write-ahead log file \"%s\" has %d bytes, should be 0 or %d\n"
+msgstr "תכנית %s: לקובץ WAL \"%s\" יש %d בתי×, צריך להיות 0 ×ו %d\n"
+
+#: receivelog.c:167
+#, c-format
+msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח קובץ ×™WAL \"%s\": %s\n"
+
+#: receivelog.c:194
+#, c-format
+msgid "%s: could not determine seek position in file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לקבוע ×ת ×”×ž×™×§×•× ×”×—×™×¤×•×© בקובץ '%s': %s\n"
+
+#: receivelog.c:209
+#, c-format
+msgid "%s: not renaming \"%s%s\", segment is not complete\n"
+msgstr "תכנית %s: ×œ× ×ž×©× ×” ×©× \"%s%s\", קטע ××™× ×” שלמה\n"
+
+#: receivelog.c:278
+#, c-format
+msgid "%s: server reported unexpected history file name for timeline %u: %s\n"
+msgstr "תכנית %s: שרת דיווח ×©× ×§×•×‘×¥ היסטוריה ×œ× ×¦×¤×•×™ עבור ציר הזמן % u: %s\n"
+
+#: receivelog.c:286
+#, c-format
+msgid "%s: could not create timeline history file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ ליצור קובץ ההיסטוריה עבור ציר הזמן \"%s\": %s\n"
+
+#: receivelog.c:293
+#, c-format
+msgid "%s: could not write timeline history file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לכתבו לקובץ ההיסטוריה עבור ציר הזמן \"%s\": %s\n"
+
+#: receivelog.c:383
+#, c-format
+msgid "%s: incompatible server version %s; client does not support streaming from server versions older than %s\n"
+msgstr "תכנית %s: גירסת שרת ×œ× ×ª×•×מת %s; הלקוח ×ינו תומך בהזרמה ×ž×©×¨×ª×™× ×©×’×¨×¡×ות מתחת ל %s\n"
+
+#: receivelog.c:393
+#, c-format
+msgid "%s: incompatible server version %s; client does not support streaming from server versions newer than %s\n"
+msgstr "תכנית %s: גירסת שרת ×œ× ×ª×•×מת %s; הלקוח ×ינו תומך בהזרמה ×ž×©×¨×ª×™× ×©×’×¨×¡×ות מעל %s\n"
+
+#: receivelog.c:498 streamutil.c:264 streamutil.c:303
+#, c-format
+msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+msgstr "תכנית %s: ×œ× ×™×•×›×œ לזהות ×ת המערכת: נתקבלו %d שורות ו- %d שדות, צפי ל %d שורות ו- %d ×ו יותר שדות\n"
+
+#: receivelog.c:506
+#, c-format
+msgid "%s: system identifier does not match between base backup and streaming connection\n"
+msgstr "תכנית %s: המזהה של מערכת ×ינו תו×× ×‘×™×Ÿ גיבוי בסיס וזרימת חיבור\n"
+
+#: receivelog.c:514
+#, c-format
+msgid "%s: starting timeline %u is not present in the server\n"
+msgstr "תכנית %s: ציר הזמן התחלתי %u ×ינו × ×ž×¦× ×‘×©×¨×ª\n"
+
+#: receivelog.c:533
+#, c-format
+msgid "%s: could not create temporary replication slot \"%s\": %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור חריץ שכפול זמני \"%s\": %s"
+
+#: receivelog.c:574
+#, c-format
+msgid "%s: unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "תכנית %s: תגובה ×œ× ×¦×¤×•×™×” לפקודה TIMELINE_HISTORY: יש לי %d שורות ו- %d שדות, צפוי ל %d שורות ו %d שדות\n"
+
+#: receivelog.c:646
+#, c-format
+msgid "%s: server reported unexpected next timeline %u, following timeline %u\n"
+msgstr "תכנתי %s: שרת דיווח ציר הזמן ×”×‘× ×œ× ×¦×¤×•×™ %u, ל×חר ציר הזמן %u\n"
+
+#: receivelog.c:653
+#, c-format
+msgid "%s: server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X\n"
+msgstr "תכנית %s: שרת הפסיק הזרמת ציר הזמן %u ב- %X/%X, ×ך דיווח ציר הזמן ×”×‘× %u שתתחיל ב %X/%X\n"
+
+#: receivelog.c:694
+#, c-format
+msgid "%s: replication stream was terminated before stop point\n"
+msgstr "תכנית %s: שכפול ×–×¨× ×”×¡×ª×™×™× ×œ×¤× ×™ נקודת עצירה\n"
+
+#: receivelog.c:743
+#, c-format
+msgid "%s: unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "תכנית %s: תוצ××” בלתי צפויה שנקבעה ל×חר ×¡×™×•× ×¦×™×¨ הזמן: יש %d שורות ו- %d שדות, צפוי %d שורות ו %d שדות\n"
+
+#: receivelog.c:753
+#, c-format
+msgid "%s: could not parse next timeline's starting point \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח נקודת ההתחלה של ציר הזמן ×”×‘× \"%s\"\n"
+
+#: receivelog.c:1124
+#, c-format
+msgid "%s: received write-ahead log record for offset %u with no file open\n"
+msgstr "תכנית %s: נתקבלה רשומת WAL עבור היסט %u ×¢× ××£ קובץ פתוח\n"
+
+#: receivelog.c:1135
+#, c-format
+msgid "%s: got WAL data offset %08x, expected %08x\n"
+msgstr "תכנית %s: יש WAL נתוני היסט %08x, צפוי %08x\n"
+
+#: receivelog.c:1170
+#, c-format
+msgid "%s: could not write %u bytes to WAL file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×ž×¦×œ×™×— לכתוב %u ×‘×ª×™× ×œ×§×•×‘×¥ WAL \"%s\": %s\n"
+
+#: receivelog.c:1195 receivelog.c:1236 receivelog.c:1267
+#, c-format
+msgid "%s: could not send copy-end packet: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח ×ת מנת ×¡×™×•× ×”×”×¢×ª×§×”: %s"
+
+#: streamutil.c:148
+msgid "Password: "
+msgstr "סיסמה: "
+
+#: streamutil.c:173
+#, c-format
+msgid "%s: could not connect to server\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להתחבר לשרת\n"
+
+#: streamutil.c:191
+#, c-format
+msgid "%s: could not connect to server: %s"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להתחבר לשרת: %s"
+
+#: streamutil.c:215
+#, c-format
+msgid "%s: could not determine server setting for integer_datetimes\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לקבוע הגדרת השרת עבור integer_datetimes\n"
+
+#: streamutil.c:224
+#, c-format
+msgid "%s: integer_datetimes compile flag does not match server\n"
+msgstr "תכנית %s: דגל הקומפילציה integer_datetimes ×ינו תו×× ×©×¨×ª\n"
+
+#: streamutil.c:375
+#, c-format
+msgid "%s: could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור חריץ שכפול \"%s\": נתקבלו שורות %d ו- %d שדות, היו ×¦×¤×•×™×™× ×©×•×¨×•×ª %d ושדות %d\n"
+
+#: streamutil.c:420
+#, c-format
+msgid "%s: could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להוריד חריץ שכפול \"%s\": נתקבלו שורות %d ו- %d שדות, היו ×¦×¤×•×™×™× ×©×•×¨×•×ª %d ושדות %d\n"
diff --git a/src/bin/pg_basebackup/po/it.po b/src/bin/pg_basebackup/po/it.po
new file mode 100644
index 0000000..28f1253
--- /dev/null
+++ b/src/bin/pg_basebackup/po/it.po
@@ -0,0 +1,1937 @@
+#
+# pg_basebackup.po
+# Italian message translation file for pg_basebackup
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2023-09-05 08:07+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/compression.c:130 ../../common/compression.c:139
+#: ../../common/compression.c:148
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "questa build non supporta la compressione con %s"
+
+#: ../../common/compression.c:203
+msgid "found empty string where a compression option was expected"
+msgstr "trovata una stringa vuota in cui era prevista un'opzione di compressione"
+
+#: ../../common/compression.c:237
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "opzione di colonna \"%s\" non riconosciuta"
+
+#: ../../common/compression.c:276
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "l'opzione di compressione \"%s\" richiede un valore"
+
+#: ../../common/compression.c:285
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "il valore per l'opzione di compressione \"%s\" deve essere un numero intero"
+
+#: ../../common/compression.c:335
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "l'algoritmo di compressione \"%s\" non accetta un livello di compressione"
+
+#: ../../common/compression.c:342
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "l'algoritmo di compressione \"%s\" prevede un livello di compressione compreso tra %d e %d (impostazione predefinita a %d)"
+
+#: ../../common/compression.c:353
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "l'algoritmo di compressione \"%s\" non accetta un conteggio di lavoro"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:451
+#: pg_receivewal.c:380 pg_recvlogical.c:341
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: ../../common/file_utils.c:166 pg_receivewal.c:303
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:200 pg_receivewal.c:532
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:232 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:447
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../common/file_utils.c:303 ../../common/file_utils.c:373
+#: pg_recvlogical.c:196
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "fsync del file \"%s\" fallito: %m"
+
+#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "non è stato possibile rinominare il file \"%s\" in \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" per \"%s\" non valido"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339
+#: pg_basebackup.c:1497 pg_basebackup.c:1706
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "creazione del file \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:635
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "stato imprevisto durante l'estrazione dell'archivio"
+
+#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:304
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "impostazione dei permessi sulla directory \"%s\" fallita: %m"
+
+#: bbstreamer_file.c:323
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "impossibile creare un collegamento simbolico da \"%s\" a \"%s\": %m"
+
+#: bbstreamer_file.c:343
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "impossibile impostare i permessi sul file \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "impossibile creare il file compresso \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "impossibile duplicare lo stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "impossibile aprire il file di output: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "impossibile impostare il livello di compressione %d: %s"
+
+#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249
+#, c-format
+msgid "this build does not support gzip compression"
+msgstr "questa build non supporta la compressione gzip"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "impossibile scrivere nel file compresso \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "impossibile chiudere il file compresso \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:869
+#, c-format
+msgid "could not initialize compression library"
+msgstr "inizializzazione della libreria di compressione fallita"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "impossibile decomprimere i dati: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "stato imprevisto durante l'iniezione delle impostazioni di ripristino"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "impossibile creare il contesto di compressione lz4: %s"
+
+#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298
+#, c-format
+msgid "this build does not support lz4 compression"
+msgstr "questa build non supporta la compressione lz4"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "impossibile scrivere l'intestazione lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210
+#, c-format
+msgid "could not compress data: %s"
+msgstr "impossibile comprimere i dati: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "impossibile terminare la compressione lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "impossibile inizializzare la libreria di compressione: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "il trailer del file tar supera i 2 blocchi"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "stato imprevisto durante l'analisi dell'archivio tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "il membro tar ha un nome vuoto"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "Il flusso COPY è terminato prima che l'ultimo file fosse terminato"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "impossibile creare il contesto di compressione zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "impossibile impostare il livello di compressione zstd su %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "impossibile impostare il conteggio degli operatori di compressione su %d: %s"
+
+#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271
+#, c-format
+msgid "this build does not support zstd compression"
+msgstr "questa build non supporta la compressione zstd"
+
+#: bbstreamer_zstd.c:262
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "impossibile creare il contesto di decompressione zstd"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "rimozione della directory dei dati \"%s\""
+
+#: pg_basebackup.c:242
+#, c-format
+msgid "failed to remove data directory"
+msgstr "impossibile rimuovere la directory dei dati"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "rimozione del contenuto della directory dei dati \"%s\""
+
+#: pg_basebackup.c:248
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "impossibile rimuovere il contenuto della directory dei dati"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "rimozione della directory WAL \"%s\""
+
+#: pg_basebackup.c:255
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "impossibile rimuovere la directory WAL"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "rimozione del contenuto della directory WAL \"%s\""
+
+#: pg_basebackup.c:261
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "più segni \"=\" nella mappatura del tablespace"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "directory dati \"%s\" non rimossa su richiesta dell'utente"
+
+#: pg_basebackup.c:270
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "Directory WAL \"%s\" non rimossa su richiesta dell'utente"
+
+#: pg_basebackup.c:274
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "le modifiche alle directory del tablespace non verranno annullate"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid "directory name too long"
+msgstr "nome della directory troppo lungo"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "più segni \"=\" nella mappatura del tablespace"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "formato di mappatura tablespace non valido \"%s\", deve essere \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:351
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "la vecchia directory non è un percorso assoluto nella mappatura del tablespace: %s"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "nuova directory non è un percorso assoluto nella mappatura del tablespace: %s"
+
+#: pg_basebackup.c:377
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s crea un backup di base di un server PostgreSQL in esecuzione.\n"
+"\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPZIONE]...\n"
+
+#: pg_basebackup.c:381
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Opzioni di controllo del'output:\n"
+
+#: pg_basebackup.c:382
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY directory in cui ricevere il backup di base\n"
+
+#: pg_basebackup.c:383
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t formato di output (plain (default), tar)\n"
+
+#: pg_basebackup.c:384
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE transfer rate massimo per trasferire la directory dei dati\n"
+" (in kB/s, oppure usa i suffissi \"k\" o \"M\")\n"
+
+#: pg_basebackup.c:386
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" scrivere la configurazione per la replica\n"
+
+#: pg_basebackup.c:388
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETTAGLIO]\n"
+" destinazione di backup (se diversa dal client)\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=VECCHIADIR=NUOVADIR\n"
+" sposta il tablespace da VECCHIADIR a NUOVADIR\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR posizione della directory del write-ahead log\n"
+
+#: pg_basebackup.c:393
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" includi i file di WAL richiesti col metodo specificato\n"
+
+#: pg_basebackup.c:395
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip comprimi l'output tar\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METODO[:DETTAGLIO]\n"
+" comprimere su client o server come specificato\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none non comprime l'output tar\n"
+
+#: pg_basebackup.c:399
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opzioni generali:\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" imposta punti di controllo più veloci o più radi\n"
+
+#: pg_basebackup.c:402
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot crea uno slot di replica\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL imposta l'etichetta del backup\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean non rimuovere i file in caso di errore\n"
+
+#: pg_basebackup.c:405
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync non aspettare che le modifiche siano scritte con sicurezza su disco\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra informazioni sull'esecuzione\n"
+
+#: pg_basebackup.c:407 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOMESLOT slot di replicazione da usare\n"
+
+#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose messaggi di output più numerosi\n"
+
+#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NESSUNO\n"
+" utilizzare l'algoritmo per i checksum manifest\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" hex codifica tutti i nomi di file in manifest\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size non stima la dimensione del backup sul lato server\n"
+
+#: pg_basebackup.c:415
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr ""
+
+#: pg_basebackup.c:416
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot impedisci la creazione di uno slot di replica temporaneo\n"
+
+#: pg_basebackup.c:417
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" non verificare i checksum\n"
+
+#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: pg_basebackup.c:421 pg_receivewal.c:99
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR stringa di connessione\n"
+
+#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del server database o directory del socket\n"
+
+#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numero di porta del server database\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" intervallo tra i pacchetti di stato inviati al server\n"
+" (in secondi)\n"
+
+#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME connettiti al database col nome utente specificato\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non chiedere mai la password\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forza la richiesta della password\n"
+" (dovrebbe essere automatico)\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_basebackup.c:472
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "impossibile leggere dalla pipe pronta: %m"
+
+#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170
+#: streamutil.c:444
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "impossibile analizzare la posizione del registro write-ahead \"%s\""
+
+#: pg_basebackup.c:581 pg_receivewal.c:663
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "impossibile completare la scrittura dei file WAL: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "impossibile creare pipe per il processo in background: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "creato slot di replica temporanea \"%s\""
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "slot di replica creato \"%s\""
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "impossibile creare un processo in background: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "impossibile creare thread in background: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "la directory \"%s\" esiste ma non è vuota"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "accesso alla directory \"%s\" fallito: %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "la velocità di trasferimento \"%s\" non è un valore valido"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "velocità di trasferimento non valida \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "la velocità di trasferimento deve essere maggiore di zero"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "unità --max-rate non valida: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "la velocità di trasferimento \"%s\" supera l'intervallo di numeri interi"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "la velocità di trasferimento \"%s\" non è compresa nell'intervallo"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "impossibile ottenere il flusso di dati COPY: %s"
+
+#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610
+#: receivelog.c:981
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "impossibile leggere i dati COPY: %s"
+
+#: pg_basebackup.c:1051
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "processo in background terminato in modo imprevisto"
+
+#: pg_basebackup.c:1122
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "impossibile iniettare manifest in un file tar compresso"
+
+#: pg_basebackup.c:1123
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "Usa la compressione lato client, invia l'output a una directory anziché all'output standard o usa %s."
+
+#: pg_basebackup.c:1139
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "impossibile analizzare l'archivio \"%s\""
+
+#: pg_basebackup.c:1140
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "È possibile analizzare solo gli archivi tar."
+
+#: pg_basebackup.c:1142
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Il formato normale richiede pg_basebackup per analizzare l'archivio."
+
+#: pg_basebackup.c:1144
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "L'utilizzo di - come directory di output richiede pg_basebackup per analizzare l'archivio."
+
+#: pg_basebackup.c:1146
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "L'opzione -R richiede pg_basebackup per analizzare l'archivio."
+
+#: pg_basebackup.c:1357
+#, c-format
+msgid "archives must precede manifest"
+msgstr "gli archivi devono precedere manifest"
+
+#: pg_basebackup.c:1372
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "nome archivio non valido: \"%s\""
+
+#: pg_basebackup.c:1444
+#, c-format
+msgid "unexpected payload data"
+msgstr "dati di carico utile imprevisti"
+
+#: pg_basebackup.c:1587
+#, c-format
+msgid "empty COPY message"
+msgstr "messaggio COPIA vuoto"
+
+#: pg_basebackup.c:1589
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "messaggio COPY non corretto di tipo %d, lunghezza %zu"
+
+#: pg_basebackup.c:1787
+#, c-format
+msgid "incompatible server version %s"
+msgstr "versione server incompatibile %s"
+
+#: pg_basebackup.c:1803
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Usa -X nessuno o -X fetch per disabilitare lo streaming del registro."
+
+#: pg_basebackup.c:1871
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "le destinazioni di backup non sono supportate da questa versione del server"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "non è possibile scrivere la configurazione di ripristino quando viene utilizzata una destinazione di backup"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "il server non supporta la compressione lato server"
+
+#: pg_basebackup.c:1911
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "avvio del backup di base, in attesa del completamento del checkpoint"
+
+#: pg_basebackup.c:1915
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "in attesa del checkpoint"
+
+#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588
+#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504
+#: streamutil.c:656 streamutil.c:701
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "impossibile inviare il comando di replica \"%s\": %s"
+
+#: pg_basebackup.c:1936
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "impossibile avviare il backup di base: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "il server ha restituito una risposta imprevista al comando BASE_BACKUP; ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: pg_basebackup.c:1945
+#, c-format
+msgid "checkpoint completed"
+msgstr "posto di blocco completato"
+
+#: pg_basebackup.c:1960
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "punto di inizio registro write-ahead: %s sulla sequenza temporale %u"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "impossibile ottenere l'intestazione del backup: %s"
+
+#: pg_basebackup.c:1971
+#, c-format
+msgid "no data returned from server"
+msgstr "nessun dato restituito dal server"
+
+#: pg_basebackup.c:2006
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "può scrivere solo un singolo tablespace su stdout, il database ha %d"
+
+#: pg_basebackup.c:2019
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "ricevitore WAL in background iniziale"
+
+#: pg_basebackup.c:2101
+#, c-format
+msgid "backup failed: %s"
+msgstr "backup fallito: %s"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "nessuna posizione finale del registro write-ahead restituita dal server"
+
+#: pg_basebackup.c:2107
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "punto finale del registro write-ahead: %s"
+
+#: pg_basebackup.c:2118
+#, c-format
+msgid "checksum error occurred"
+msgstr "si è verificato un errore di checksum"
+
+#: pg_basebackup.c:2123
+#, c-format
+msgid "final receive failed: %s"
+msgstr "ricezione finale non riuscita: %s"
+
+#: pg_basebackup.c:2147
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "in attesa che il processo in background finisca lo streaming..."
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "impossibile inviare il comando alla pipe in background: %m"
+
+#: pg_basebackup.c:2156
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "non potevo aspettare il processo figlio: %m"
+
+#: pg_basebackup.c:2158
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "processo figlio %d interrotto, atteso %d"
+
+#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2180
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "non potevo aspettare il thread figlio: %m"
+
+#: pg_basebackup.c:2185
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "impossibile ottenere lo stato di uscita del thread figlio: %m"
+
+#: pg_basebackup.c:2188
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "thread figlio terminato con errore %u"
+
+#: pg_basebackup.c:2217
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "sincronizzazione dei dati su disco..."
+
+#: pg_basebackup.c:2242
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "rinominando backup_manifest.tmp in backup_manifest"
+
+#: pg_basebackup.c:2262
+#, c-format
+msgid "base backup completed"
+msgstr "backup di base completato"
+
+#: pg_basebackup.c:2351
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "formato di output \"%s\" non valido, deve essere \"normale\" o \"tar\""
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "opzione wal-method \"%s\" non valida, deve essere \"fetch\", \"stream\" o \"none\""
+
+#: pg_basebackup.c:2425
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "argomento checkpoint non valido \"%s\", deve essere \"fast\" o \"spread\""
+
+#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510
+#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580
+#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607
+#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638
+#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665
+#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697
+#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826
+#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849
+#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849
+#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873
+#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894
+#: pg_recvlogical.c:901 pg_recvlogical.c:908
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "non è possibile specificare sia il formato che la destinazione del backup"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "deve specificare la directory di output o la destinazione del backup"
+
+#: pg_basebackup.c:2527
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "non è possibile specificare sia la directory di output che la destinazione del backup"
+
+#: pg_basebackup.c:2557 pg_receivewal.c:868
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algoritmo di compressione non riconosciuto: \"%s\""
+
+#: pg_basebackup.c:2563 pg_receivewal.c:875
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "specifica di compressione non valida: %s"
+
+#: pg_basebackup.c:2579
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "la compressione lato client non è possibile quando viene specificata una destinazione di backup"
+
+#: pg_basebackup.c:2590
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "solo i backup in modalità tar possono essere compressi"
+
+#: pg_basebackup.c:2600
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "Non è possibile eseguire lo streaming di WAL quando viene specificata una destinazione di backup"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "impossibile eseguire lo streaming di registri write-ahead in modalità tar su stdout"
+
+#: pg_basebackup.c:2613
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "gli slot di replica possono essere utilizzati solo con lo streaming WAL"
+
+#: pg_basebackup.c:2625
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot non può essere utilizzato con il nome dello slot"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2636 pg_receivewal.c:840
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s ha bisogno di uno slot da specificare usando --slot"
+
+#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695
+#: pg_basebackup.c:2703
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s e %s sono opzioni incompatibili"
+
+#: pg_basebackup.c:2658
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "Non è possibile specificare il percorso della directory WAL insieme a una destinazione di backup"
+
+#: pg_basebackup.c:2664
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "Il percorso della directory WAL può essere specificato solo in modalità normale"
+
+#: pg_basebackup.c:2673
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "Il percorso della directory WAL deve essere un percorso assoluto"
+
+#: pg_basebackup.c:2774
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "creazione del link simbolico \"%s\" fallita: %m"
+
+#: pg_basebackup.c:2776
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "i collegamenti simbolici non sono supportati su questa piattaforma"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s serve a ricevere il flusso dei write-ahead log di PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR ricevi i file di write-ahead log in questa directory\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN esci dopo aver ricevuto la posizione LSN specificata\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists non dare un errore se esiste già uno slot con lo stesso nome\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop non ri-eseguire se la connessione è persa\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync non aspettare che i cambiamenti siano scritti sul disco in sicurezza\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEC\n"
+" tempo tra i pacchetti di status inviati al server (default: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous esegui il flush del write-ahead log immediatamente dopo la scrittura\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METODO[:DETTAGLIO]\n"
+" comprimere come specificato\n"
+
+#: pg_receivewal.c:105
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Azioni opzionali:\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot crea un nuovo slot di replica (per il nome vedi --slot)\n"
+
+#: pg_receivewal.c:107 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot elimina lo slot di replica (per il nome vedi --slot)\n"
+
+#: pg_receivewal.c:252
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "segmento finito alle %X/%X (timeline %u)"
+
+#: pg_receivewal.c:259
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "flusso di log interrotto alle %X/%X (timeline %u)"
+
+#: pg_receivewal.c:275
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "passato alla sequenza temporale %u alle %X/%X"
+
+#: pg_receivewal.c:285
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "segnale di interruzione ricevuto, in uscita"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_receivewal.c:384
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "il file di segmento \"%s\" ha una dimensione errata %lld, saltando"
+
+#: pg_receivewal.c:401
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "impossibile aprire il file compresso \"%s\": %m"
+
+#: pg_receivewal.c:404
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "impossibile cercare nel file compresso \"%s\": %m"
+
+#: pg_receivewal.c:410
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "impossibile leggere il file compresso \"%s\": %m"
+
+#: pg_receivewal.c:413
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "impossibile leggere il file compresso \"%s\": leggere %d di %zu"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "il file del segmento compresso \"%s\" ha una dimensione non compressa %d errata, saltando"
+
+#: pg_receivewal.c:451
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "impossibile creare il contesto di decompressione LZ4: %s"
+
+#: pg_receivewal.c:463
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: pg_receivewal.c:481
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "impossibile decomprimere il file \"%s\": %s"
+
+#: pg_receivewal.c:504
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "impossibile liberare il contesto di decompressione LZ4: %s"
+
+#: pg_receivewal.c:509
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "il file del segmento compresso \"%s\" ha una dimensione non compressa %zu errata, saltando"
+
+#: pg_receivewal.c:514
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "impossibile controllare il file \"%s\": compressione con %s non supportata da questa build"
+
+#: pg_receivewal.c:641
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "avvio del flusso di log alle %X/%X (timeline %u)"
+
+#: pg_receivewal.c:783 pg_recvlogical.c:785
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "impossibile analizzare la posizione finale \"%s\""
+
+#: pg_receivewal.c:832
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "non è possibile utilizzare --create-slot insieme a --drop-slot"
+
+#: pg_receivewal.c:848
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "impossibile utilizzare --synchronous insieme a --no-sync"
+
+#: pg_receivewal.c:858
+#, c-format
+msgid "no target directory specified"
+msgstr "nessuna directory di destinazione specificata"
+
+#: pg_receivewal.c:882
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "la compressione con %s non è ancora supportata"
+
+#: pg_receivewal.c:924
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "la connessione di replica che utilizza lo slot \"%s\" è inaspettatamente specifica del database"
+
+#: pg_receivewal.c:943 pg_recvlogical.c:955
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "eliminazione dello slot di replica \"%s\""
+
+#: pg_receivewal.c:954 pg_recvlogical.c:965
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "creazione dello slot di replica \"%s\""
+
+#: pg_receivewal.c:983 pg_recvlogical.c:989
+#, c-format
+msgid "disconnected"
+msgstr "disconnesso"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:987 pg_recvlogical.c:993
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "disconnesso; in attesa di %d secondi per riprovare"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s controlla i flussi di decodifica logica di PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Azioni da effettuare:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start avvia lo streaming in uno slot di replica (per il nome vedi --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE riceve i log in questo file, - per stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SEC\n"
+" tempo tra i sync del file di output (default: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN dove deve partire lo streaming in uno slot esistente\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOME[=VALORE]\n"
+" passa l'opzione NOME col valore opzionale VALORE\n"
+" al plugin di output\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN usa il plugin di output PLUGIN (default: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=NOMESLOT nome dello slot di replica logica\n"
+
+#: pg_recvlogical.c:99
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase abilita la decodifica delle transazioni preparate durante la creazione di uno slot\n"
+
+#: pg_recvlogical.c:104
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=NOMEDB database a cui connettersi\n"
+
+#: pg_recvlogical.c:137
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "conferma scrittura fino a %X/%X, svuota fino a %X/%X (slot %s)"
+
+#: pg_recvlogical.c:161 receivelog.c:366
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "impossibile inviare il pacchetto di feedback: %s"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "avvio dello streaming del registro a %X/%X (slot %s)"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "streaming initiated"
+msgstr "streaming avviato"
+
+#: pg_recvlogical.c:335
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "apertura del file di log \"%s\" fallita: %m"
+
+#: pg_recvlogical.c:364 receivelog.c:889
+#, c-format
+msgid "invalid socket: %s"
+msgstr "socket non valido: %s"
+
+#: pg_recvlogical.c:417 receivelog.c:917
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: pg_recvlogical.c:424 receivelog.c:967
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "ricezione dati dallo stream WAL fallita: %s"
+
+#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011
+#: receivelog.c:1074
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "intestazione streaming troppo piccola: %d"
+
+#: pg_recvlogical.c:501 receivelog.c:849
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "intestazione streaming non riconosciuta: \"%c\""
+
+#: pg_recvlogical.c:555 pg_recvlogical.c:567
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "impossibile scrivere %d byte nel file di registro \"%s\": %m"
+
+#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "interruzione imprevista del flusso di replica: %s"
+
+#: pg_recvlogical.c:780
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "impossibile analizzare la posizione iniziale \"%s\""
+
+#: pg_recvlogical.c:858
+#, c-format
+msgid "no slot specified"
+msgstr "nessuno slot specificato"
+
+#: pg_recvlogical.c:865
+#, c-format
+msgid "no target file specified"
+msgstr "nessun file di destinazione specificato"
+
+#: pg_recvlogical.c:872
+#, c-format
+msgid "no database specified"
+msgstr "nessun database specificato"
+
+#: pg_recvlogical.c:879
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "è necessario specificare almeno un'azione"
+
+#: pg_recvlogical.c:886
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "non può usare --create-slot o --start insieme a --drop-slot"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "non è possibile utilizzare --create-slot o --drop-slot insieme a --startpos"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos può essere specificato solo con --start"
+
+#: pg_recvlogical.c:907
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase può essere specificato solo con --create-slot"
+
+#: pg_recvlogical.c:939
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "non è stato possibile stabilire una connessione di replica specifica del database"
+
+#: pg_recvlogical.c:1033
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "posizione finale %X/%X raggiunta da keepalive"
+
+#: pg_recvlogical.c:1036
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "posizione finale %X/%X raggiunta dal record WAL a %X/%X"
+
+#: receivelog.c:68
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "impossibile creare il file di stato dell'archivio \"%s\": %s"
+
+#: receivelog.c:75
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "impossibile chiudere il file di stato dell'archivio \"%s\": %s"
+
+#: receivelog.c:123
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "impossibile ottenere la dimensione del file di registro write-ahead \"%s\": %s"
+
+#: receivelog.c:134
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "impossibile aprire il file di registro write-ahead esistente \"%s\": %s"
+
+#: receivelog.c:143
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "impossibile sincronizzare il file di registro write-ahead esistente \"%s\": %s"
+
+#: receivelog.c:158
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "il file di registro write-ahead \"%s\" contiene %zd byte, dovrebbe essere 0 o %d"
+msgstr[1] "il files di registro write-ahead \"%s\" contengono %zd byte, dovrebbe essere 0 o %d"
+
+#: receivelog.c:174
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "impossibile aprire il file di registro write-ahead \"%s\": %s"
+
+#: receivelog.c:208
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "impossibile determinare la posizione di ricerca nel file \"%s\": %s"
+
+#: receivelog.c:223
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "non rinominando \"%s\", il segmento non è completo"
+
+#: receivelog.c:234 receivelog.c:323 receivelog.c:694
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "impossibile chiudere il file \"%s\": %s"
+
+#: receivelog.c:295
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "il server ha segnalato il nome del file della cronologia imprevisto per la sequenza temporale %u: %s"
+
+#: receivelog.c:303
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "impossibile creare il file della cronologia della sequenza temporale \"%s\": %s"
+
+#: receivelog.c:310
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "impossibile scrivere il file della cronologia della sequenza temporale \"%s\": %s"
+
+#: receivelog.c:400
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "versione server incompatibile %s; il client non supporta lo streaming da versioni del server precedenti a %s"
+
+#: receivelog.c:409
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "versione server incompatibile %s; il client non supporta lo streaming da versioni del server successive a %s"
+
+#: receivelog.c:514
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "l'identificatore di sistema non corrisponde tra il backup di base e la connessione in streaming"
+
+#: receivelog.c:522
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "sequenza temporale di inizio %u non è presente nel server"
+
+#: receivelog.c:561
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "risposta inaspettata al comando TIMELINE_HISTORY: ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: receivelog.c:632
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "il server ha segnalato la sequenza temporale successiva inaspettata %u, dopo la sequenza temporale %u"
+
+#: 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 "il server ha interrotto lo streaming della sequenza temporale %u alle %X/%X, ma ha segnalato che la sequenza temporale successiva %u inizia alle %X/%X"
+
+#: receivelog.c:678
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "flusso di replica è stato terminato prima del punto di arresto"
+
+#: 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 "set di risultati imprevisti dopo la fine della sequenza temporale: ottenuto %d righe e %d campi, previsti %d righe e %d campi"
+
+#: receivelog.c:733
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "impossibile analizzare il punto iniziale della sequenza temporale successiva \"%s\""
+
+#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "impossibile sincronizzare il file \"%s\": %s"
+
+#: receivelog.c:1091
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "ha ricevuto il record di registro write-ahead per l'offset %u senza file aperti"
+
+#: receivelog.c:1101
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "ottenuto offset dati WAL %08x, previsto %08x"
+
+#: receivelog.c:1135
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "impossibile scrivere %d byte nel file WAL \"%s\": %s"
+
+#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "impossibile inviare il pacchetto di fine copia: %s"
+
+#: streamutil.c:159
+msgid "Password: "
+msgstr "Password: "
+
+#: streamutil.c:182
+#, c-format
+msgid "could not connect to server"
+msgstr "non poteva collegarsi al server"
+
+#: streamutil.c:225
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "pulizia del search_path fallita: %s"
+
+#: streamutil.c:241
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "impossibile determinare l'impostazione del server per integer_datetimes"
+
+#: streamutil.c:248
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes flag di compilazione non corrisponde al server"
+
+#: streamutil.c:299
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "impossibile recuperare la dimensione del segmento WAL: ottenuto %d righe e %d campi, previsto %d righe e %d o più campi"
+
+#: streamutil.c:309
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "Impossibile analizzare la dimensione del segmento WAL"
+
+#: streamutil.c:327
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "La dimensione del segmento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il server remoto ha riportato un valore di %d byte"
+msgstr[1] "La dimensione dei segmenti WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il server remoto ha riportato un valore di %d byte"
+
+#: streamutil.c:372
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "impossibile recuperare il flag di accesso al gruppo: ottenuto %d righe e %d campi, previsto %d righe e %d o più campi"
+
+#: streamutil.c:381
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "Impossibile analizzare il flag di accesso al gruppo: %s"
+
+#: streamutil.c:424 streamutil.c:461
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "impossibile identificare il sistema: ottenuto %d righe e %d campi, previsto %d righe e %d o più campi"
+
+#: streamutil.c:513
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "impossibile leggere lo slot di replica \"%s\": ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: streamutil.c:525
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "lo slot di replica \"%s\" non esiste"
+
+#: streamutil.c:536
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "previsto uno slot di replica fisico, è stato invece ottenuto il tipo \"%s\"."
+
+#: streamutil.c:550
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "impossibile analizzare restart_lsn \"%s\" per lo slot di replica \"%s\""
+
+#: streamutil.c:667
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "impossibile creare lo slot di replica \"%s\": ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: streamutil.c:711
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "impossibile eliminare lo slot di replica \"%s\": ottenuto %d righe e %d campi, previsto %d righe e %d campi"
+
+#: walmethods.c:720 walmethods.c:1267
+msgid "could not compress data"
+msgstr "compressione dei dati fallita"
+
+#: walmethods.c:749
+msgid "could not reset compression stream"
+msgstr "reset dello stream di compressione fallito"
+
+#: walmethods.c:880
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "errore di implementazione: i file tar non possono avere più di un file aperto"
+
+#: walmethods.c:894
+msgid "could not create tar header"
+msgstr "creazione dell'intestazione del tar fallita"
+
+#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183
+msgid "could not change compression parameters"
+msgstr "modifica dei parametri di compressione fallita"
+
+#: walmethods.c:1055
+msgid "unlink not supported with compression"
+msgstr "unlink non supportato con la compressione"
+
+#: walmethods.c:1291
+msgid "could not close compression stream"
+msgstr "chiusura dello stream di compressione fallita"
+
+#~ msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 comprimi i log con questo livello di compressoine\n"
+
+#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 comprimi l'output tar a questo livello di compressione\n"
+
+#~ msgid "%s: --create-slot and --no-slot are incompatible options\n"
+#~ msgstr "%s: --create-slot e --no-slot sono opzioni incompatibili\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s: il processo figlio non è terminato normalmente\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s: il processo figlio è terminato con errore %d\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: accesso alla directory \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not clear search_path: %s"
+#~ msgstr "%s: pulizia del search_path fallita: %s"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: chiusura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not close file \"%s\": %s\n"
+#~ msgstr "%s: chiusura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not connect to server\n"
+#~ msgstr "%s: connessione al server fallita\n"
+
+#~ msgid "%s: could not connect to server: %s"
+#~ msgstr "%s: connessione al server fallita: %s"
+
+#~ msgid "%s: could not create archive status file \"%s\": %s\n"
+#~ msgstr "%s: creazione del file di stato dell'archivio \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create file \"%s\": %s\n"
+#~ msgstr "%s: creazione del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: creazione del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: fsync del file \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s: fsync del file di log \"%s\" fallito: %s\n"
+
+#~ msgid "%s: could not get write-ahead log end position from server: %s"
+#~ msgstr "%s: non è stato possibile ottenere la posizione finale del write-ahead log dal server: %s"
+
+#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+#~ msgstr "%s: identificazione del sistema fallita: ricevute %d righe e %d campi, attese %d righe e %d o più campi\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di log \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di write-ahead log \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not receive data from WAL stream: %s"
+#~ msgstr "%s: ricezione dati dallo stream WAL fallita: %s"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile rinominare il file di storia della timeline \"%s\" in \"%s\": %s\n"
+
+#~ msgid "%s: could not set permissions on directory \"%s\": %s\n"
+#~ msgstr "%s: impostazione dei permessi sulla directory \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not set permissions on file \"%s\": %s\n"
+#~ msgstr "%s: impostazione dei permessi sul file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: non è stato possibile ottenere informazioni sul file \"%s\": %s\n"
+
+#~ msgid "%s: could not write to file \"%s\": %s\n"
+#~ msgstr "%s: scrittura nel file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: invalid compression level \"%s\"\n"
+#~ msgstr "%s: livello di compressione non valido \"%s\"\n"
+
+#~ msgid "%s: invalid fsync interval \"%s\"\n"
+#~ msgstr "%s: intervallo di fsync \"%s\" non valido\n"
+
+#~ msgid "%s: invalid port number \"%s\"\n"
+#~ msgstr "%s: numero di porta non valido \"%s\"\n"
+
+#~ msgid "%s: invalid status interval \"%s\"\n"
+#~ msgstr "%s: intervallo di status \"%s\" non valido\n"
+
+#~ msgid "%s: invalid tar block header size: %d\n"
+#~ msgstr "%s: dimensione del blocco di intestazione del file tar non valida: %d\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: memoria esaurita\n"
+
+#~ msgid "%s: select() failed: %s\n"
+#~ msgstr "%s: select() fallita: %s\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s: questa piattaforma non supporta i link simbolici\n"
+
+#~ msgid "%s: unrecognized link indicator \"%c\"\n"
+#~ msgstr "%s: indicatore di link sconosciuto \"%c\"\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po
new file mode 100644
index 0000000..b27acff
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ja.po
@@ -0,0 +1,1805 @@
+# pg_basebackup.po
+# Japanese message translation file for pg_basebackup
+#
+# Copyright (C) 2013-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# <iwata.aya@jp.fujitsu.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 09:35+0900\n"
+"PO-Revision-Date: 2023-05-22 09:48+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "ã“ã®ãƒ“ルドã§ã¯%sã«ã‚ˆã‚‹åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "圧縮オプションãŒã‚ã‚‹ã¯ãšã®å ´æ‰€ã«ç©ºæ–‡å­—列ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "èªè­˜ã§ããªã„圧縮オプション: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "圧縮オプション\"%s\"ã«ã¯å€¤ãŒå¿…è¦ã§ã™"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "圧縮オプション\"%s\"ã®å€¤ã¯æ•´æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "圧縮オプション\"%s\"ã®å€¤ã¯çœŸå½å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "圧縮アルゴリズム\"%s\"ã¯åœ§ç¸®ãƒ¬ãƒ™ãƒ«ã‚’å—ã‘付ã‘ã¾ã›ã‚“"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "圧縮アルゴリズム\"%s\"ã§ã¯%dã‹ã‚‰%dã¾ã§ã®åœ§ç¸®ãƒ¬ãƒ™ãƒ«ãŒæŒ‡å®šå¯èƒ½ã§ã™(デフォルトã¯%d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "圧縮アルゴリズム\"%s\"ã¯ãƒ¯ãƒ¼ã‚«ãƒ¼æ•°ã‚’å—ã‘付ã‘ã¾ã›ã‚“"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "圧縮アルゴリズム\"%s\"ã¯é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“ (内部エラー)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "メモリä¸è¶³ã§ã™"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "アーカイブã®æŠ½å‡ºä¸­ã«æƒ³å®šå¤–ã®çŠ¶æ…‹"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã«æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ã®ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "標準出力ã®è¤‡è£½ã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "出力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "圧縮レベルを%dã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "圧縮ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"をクローズã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "圧縮ライブラリをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "データを伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "リカãƒãƒªè¨­å®šã®å‡ºåŠ›ä¸­ã«æƒ³å®šå¤–ã®çŠ¶æ…‹"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "lz4圧縮コンテクストを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "lz4ヘッダを出力ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "データを圧縮ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "lz4圧縮を終了ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "圧縮ライブラリをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tarファイル後続ブロックãŒ2ブロックを超ãˆã¦ã„ã¾ã™"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "tarアーカイブã®ãƒ‘ース中ã«æƒ³å®šå¤–ã®çŠ¶æ…‹"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tarメンãƒãƒ¼ã®åå‰ãŒç©ºã§ã™"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "最後ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒçµ‚ã‚ã‚‹å‰ã«COPYストリームãŒçµ‚了ã—ã¾ã—ãŸ"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "zstd圧縮コンテクストを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "zstd圧縮レベルを%dã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "圧縮ワーカー数を%dã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’有効化ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "zstd伸張コンテクストを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "データディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "データディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "データディレクトリ\"%s\"ã®å†…容を削除ã—ã¦ã„ã¾ã™"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "データディレクトリã®ä¸­èº«ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL ディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "WAL ディレクトリ\"%s\"ã®ä¸­èº«ã‚’削除ã—ã¦ã„ã¾ã™"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL ディレクトリã®ä¸­èº«ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Šã€ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Šã€WAL ディレクトリ\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "テーブル空間用ディレクトリã¸ã®å¤‰æ›´ã¯å–り消ã•ã‚Œã¾ã›ã‚“"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "ディレクトリåãŒé•·ã™ãŽã¾ã™"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«è¤‡æ•°ã®\"=\"記å·ãŒã‚ã‚Šã¾ã™"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ング形å¼\"%s\"ãŒä¸æ­£ã§ã™ã€‚\"æ—§DIR=æ–°DIR\"ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«ãŠã„ã¦ã€æ—§ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒçµ¶å¯¾ãƒ‘スã§ã¯ã‚ã‚Šã¾ã›ã‚“: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«ãŠã„ã¦ã€æ–°ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒçµ¶å¯¾ãƒ‘スã§ã¯ã‚ã‚Šã¾ã›ã‚“: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%sã¯å®Ÿè¡Œä¸­ã®PostgreSQLサーãƒãƒ¼ã®ãƒ™ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å–å¾—ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [オプション]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"出力を制御ã™ã‚‹ã‚ªãƒ—ション:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—をディレクトリ内ã«æ ¼ç´\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t 出力フォーマット(プレイン(デフォルト)ã¾ãŸã¯tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE データディレクトリ転é€ã®éš›ã®æœ€å¤§è»¢é€é€Ÿåº¦\n"
+" (kB/s å˜ä½ã€ã¾ãŸã¯ 接尾辞 \"k\" ã‹\"M\" を使用)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" レプリケーションã®ãŸã‚ã®è¨­å®šã‚’書ã込む\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=ターゲット[:詳細]\n"
+" ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲット(クライアント以外ã®å ´åˆ)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=æ—§DIR=æ–°DIR\n"
+" テーブル空間を旧DIRã‹ã‚‰æ–°DIRã«ç§»å‹•ã™ã‚‹\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR 先行書ãè¾¼ã¿ãƒ­ã‚°ç”¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä½ç½®\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" è¦æ±‚ã•ã‚ŒãŸWALファイルを指定ã®æ–¹å¼ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—\n"
+" ã«å«ã‚ã‚‹\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip tar ã®å‡ºåŠ›ã‚’圧縮ã™ã‚‹\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]æ–¹å¼[:詳細]\n"
+" 指定ã«å¾“ã£ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼å´ã§åœ§ç¸®\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none tar出力を圧縮ã—ãªã„\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"汎用オプション:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" 高速ã¾ãŸã¯åˆ†æ•£ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆå‡¦ç†ã®æŒ‡å®š\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot æ–°ã—ã„レプリケーションスロットを作æˆã™ã‚‹\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ラベルã®è¨­å®š\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --noclean エラー発生後作æˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®å‰Šé™¤ã‚’è¡Œã‚ãªã„\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --nosync ディスクã¸ã®å®‰å…¨ãªæ›¸ãè¾¼ã¿ã‚’å¾…æ©Ÿã—ãªã„\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状æ³ã®è¡¨ç¤º\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=スロットå 使用ã™ã‚‹ãƒ¬ãƒ—リケーションスロット\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 冗長メッセージã®å‡ºåŠ›\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" 目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã«ä½¿ç”¨ã™ã‚‹ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ \n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" 目録中ã®å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«åã‚’16進エンコードã™ã‚‹\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size サーãƒãƒ¼å´ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—サイズを見ç©ã‚‚らãªã„\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ã®ä½œæˆã‚’çœç•¥ã™ã‚‹\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot 一時レプリケーションスロットã®ä½œæˆã‚’è¡Œã‚ãªã„\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’検証ã—ãªã„\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR 接続文字列\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME データベースサーãƒãƒ¼ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" サーãƒãƒ¼ã¸é€å‡ºã™ã‚‹ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ‘ケットã®é–“éš”(秒å˜ä½)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 指定ã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§æŽ¥ç¶š\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワードã®å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password パスワード入力è¦æ±‚を強制(自動的ã«è¡Œã‚れるã¯ãš)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "準備ãŒã§ããŸãƒ‘イプã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®ä½ç½®\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "WALファイルã®æ›¸ãè¾¼ã¿ã‚’終了ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ—ロセス用ã®ãƒ‘イプを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: \"%m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "一時レプリケーションスロット\"%s\"を作æˆã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "レプリケーションスロット\"%s\"を作æˆã—ã¦ã„ã¾ã—ãŸ"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ—ロセスを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d テーブル空間 %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間 (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "転é€é€Ÿåº¦\"%s\"ã¯ç„¡åŠ¹ãªå€¤ã§ã™"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "転é€é€Ÿåº¦\"%s\"ã¯ç„¡åŠ¹ã§ã™: %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "転é€é€Ÿåº¦ã¯0より大ããªå€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "--max-rate ã®å˜ä½ãŒä¸æ­£ã§ã™: \"%s\""
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "転é€é€Ÿåº¦\"%s\"ãŒintegerã®ç¯„囲を超ãˆã¦ã„ã¾ã™"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "転é€é€Ÿåº¦\"%s\"ãŒç¯„囲外ã§ã™"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "COPYデータストリームをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "COPYデータを読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ—ロセスãŒçªç„¶çµ‚了ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "圧縮tarファイルã«ã¯ç›®éŒ²ã¯å‡ºåŠ›ã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "クライアントサイド圧縮を使用ã—ã¦æ¨™æº–出力ã§ã¯ãªãディレクトリã«å‡ºåŠ›ã™ã‚‹ã€ã¾ãŸã¯ %s を使用ã—ã¦ãã ã•ã„。"
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "アーカイブ\"%s\"ã®ãƒ‘ースãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "tarアーカイブã®ã¿ãƒ‘ースå¯èƒ½ã§ã™ã€‚"
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Plainフォーマットã§ã¯pg_basebackupãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をパースã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "出力ディレクトリ㫠- を指定ã™ã‚‹éš›ã«ã¯pg_basebackupãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をパースã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "-Rオプションを指定ã™ã‚‹å ´åˆã¯pg_basebackupãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をパースã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "アーカイブã¯ç›®éŒ²ã‚ˆã‚Šå…ˆã«ã‚ã‚‹ã¯ãšã§ã™"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "ä¸æ­£ãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å: \"%s\""
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "予期ã—ãªã„ペイロードã®ãƒ‡ãƒ¼ã‚¿"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "空ã®COPYメッセージ"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "タイプ%dã€é•·ã•%zuã®COPYメッセージã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆç•°å¸¸"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "éžäº’æ›ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ \"%s\""
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "-X none ã¾ãŸã¯ -X fetch ã§ãƒ­ã‚°ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’無効ã«ã§ãã¾ã™ã€‚"
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã¯ãƒªã‚«ãƒãƒªè¨­å®šã¯å‡ºåŠ›ã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "サーãƒãƒ¼ã¯ã‚µãƒ¼ãƒãƒ¼ã‚µã‚¤ãƒ‰åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を開始ã—ã¦ã„ã¾ã™ - ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®å®Œäº†ã‚’待機中"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚’å¾…ã£ã¦ã„ã¾ã™"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "レプリケーションコマンド\"%s\"ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を開始ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "サーãƒãƒ¼ãŒ BASE_BACKUP コマンドã«æœŸå¾…ã—ã¦ã„ãªã„応答を返ã—ã¾ã—ãŸ; %dè¡Œ %d列をå—ä¿¡ã—ã¾ã—ãŸãŒæœŸå¾…㯠%d列 %dè¡Œã§ã—ãŸ"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒå®Œäº†ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®é–‹å§‹ãƒã‚¤ãƒ³ãƒˆ: タイムライン %2$u 上㮠%1$s"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ヘッダをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "サーãƒãƒ¼ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒè¿”ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "標準出力ã«æ›¸ã出ã›ã‚‹ãƒ†ãƒ¼ãƒ–ル空間ã¯ï¼‘ã¤ã ã‘ã§ã™ãŒã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã¯%d個ã‚ã‚Šã¾ã™"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰WALå—信処ç†ã‚’èµ·å‹•ã—ã¾ã™"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "サーãƒãƒ¼ã‹ã‚‰å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã®çµ‚了ä½ç½®ãŒè¿”ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®çµ‚了ãƒã‚¤ãƒ³ãƒˆ: %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "終端ã®å—ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ—ロセスãŒã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°å‡¦ç†ãŒçµ‚ã‚ã‚‹ã¾ã§å¾…æ©Ÿã—ã¾ã™ ..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ã¸ã®ãƒ‘イプã«ã‚³ãƒžãƒ³ãƒ‰ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "å­ãƒ—ロセスã®å¾…æ©ŸãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "å­ãƒ—ロセス %d ãŒçµ‚了ã—ã¾ã—ãŸãŒã€æœŸå¾…ã—ã¦ã„ãŸã®ã¯ %d ã§ã—ãŸ"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "å­ã‚¹ãƒ¬ãƒƒãƒ‰ã®å¾…æ©ŸãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "å­ã‚¹ãƒ¬ãƒƒãƒ‰ã®çµ‚了ステータスをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "å­ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã‚¨ãƒ©ãƒ¼%uã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "データをディスクã«åŒæœŸã—ã¦ã„ã¾ã™..."
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "backup_manifest.tmp ã®åå‰ã‚’ backup_manifest ã«å¤‰æ›´ã—ã¦ãã ã•ã„"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå®Œäº†ã—ã¾ã—ãŸ"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "ä¸æ­£ãª checkpoint ã®å¼•æ•°\"%s\"ã€\"fast\" ã¾ãŸã¯ \"spreadã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "ä¸æ­£ãªå‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ\"%s\"ã€\"plain\"ã‹\"tar\"ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "ä¸æ­£ãª wal-method オプション\"%s\"ã€\"fetch\"ã€\"stream\" ã¾ãŸã¯ \"none\" ã®ã„ãšã‚Œã‹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šéŽãŽã¾ã™(先頭ã¯\"%s\"ã§ã™)"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "フォーマットã¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "出力ディレクトリã‹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "出力先ディレクトリã¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "èªè­˜ã§ããªã„圧縮アルゴリズム\"%s\""
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ä¸æ­£ãªåœ§ç¸®æŒ‡å®š: %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚µã‚¤ãƒ‰åœ§ç¸®ã¯ã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "tarモードã§ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ã¿ãŒåœ§ç¸®å¯èƒ½ã§ã™"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲット指定ã•ã‚Œã¦ã„ã‚‹ã¨WALã¯ã‚¹ãƒˆãƒªãƒ¼ãƒ å‡ºåŠ›ã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "標準出力ã¸ã® tar モードã§ã¯æ›¸ãè¾¼ã¿å…ˆè¡Œãƒ­ã‚°ã‚’ストリーム出力ã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "レプリケーションスロットã¯WALストリーミングã§ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot ã¯ã‚¹ãƒ­ãƒƒãƒˆåã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s 㯠--slot ã§ã‚¹ãƒ­ãƒƒãƒˆã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s 㨠%s ã¯éžäº’æ›ãªã‚ªãƒ—ションã§ã™"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WALディレクトリã®ä½ç½®ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WALディレクトリã®ä½ç½®ã¯ plainモードã§ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™"
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WALディレクトリã®ä½ç½®ã¯ã€çµ¶å¯¾ãƒ‘スã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’å—ä¿¡ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR å—ä¿¡ã—ãŸå…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã®æ ¼ç´ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN 指定ã—ãŸLSNã®å—信後ã«çµ‚了\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr "   --if-not-exists スロットã®ä½œæˆæ™‚ã«æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¦ã‚‚エラーã¨ã—ãªã„\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop 接続断ã®éš›ã«ãƒ«ãƒ¼ãƒ—ã—ãªã„\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync ディスクã¸ã®å®‰å…¨ãªæ›¸ãè¾¼ã¿ã®å¾…æ©Ÿã‚’è¡Œã‚ãªã„\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" サーãƒãƒ¼ã¸é€å‡ºã™ã‚‹ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ‘ケットã®é–“éš”\n"
+" (デフォルト: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous 先行書ãè¾¼ã¿ãƒ­ã‚°ã‚’書ãè¾¼ã¿å¾Œç›´ã¡ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=æ–¹å¼[:詳細]\n"
+" 指定ã®ã¨ãŠã‚Šåœ§ç¸®\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"追加ã®å‹•ä½œ:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --create-slot æ–°ã—ã„レプリケーションスロットを作æˆã™ã‚‹\n"
+" (スロットåã«ã¤ã„ã¦ã¯ --slot ã‚’å‚ç…§)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --drop-slot レプリケーションスロットを削除ã™ã‚‹\n"
+" (スロットåã«ã¤ã„ã¦ã¯ --slot ã‚’å‚ç…§)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "%X/%X (タイムライン %u)ã§ã‚»ã‚°ãƒ¡ãƒ³ãƒˆãŒå®Œäº†"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "%X/%X (タイムライン %u)ã§ãƒ­ã‚°ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’åœæ­¢ã—ã¾ã—ãŸ"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "%3$X/%2$X㧠タイムライン%1$uã«åˆ‡ã‚Šæ›¿ãˆã¾ã—ãŸ"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "割り込ã¿ã‚·ã‚°ãƒŠãƒ«ã‚’å—ä¿¡ã€çµ‚了ã—ã¾ã™"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "セグメントファイル\"%s\"ã®ã‚µã‚¤ã‚º%lldãŒé–“é•ã£ã¦ã„ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"ã§seekã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "圧縮ファイル\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "圧縮ファイル\"%1$s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿æ¸ˆã¿"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "圧縮セグメントファイル\"%s\"ã®å±•é–‹å¾Œã‚µã‚¤ã‚º%dãŒä¸æ­£ã§ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "LZ4伸張コンテキストを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "ファイル\"%s\"を伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "LZ4伸張コンテクストを解放ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "圧縮セグメントファイル\"%s\"ã®ä¼¸å¼µå¾Œã®ã‚µã‚¤ã‚º%zuãŒä¸æ­£ã§ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "ファイル\"%s\"ã®ç¢ºèªãŒã§ãã¾ã›ã‚“: %sã«ã‚ˆã‚‹åœ§ç¸®ã¯ã“ã®ãƒ“ルドã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "%X/%X (タイムライン %u)ã‹ã‚‰ãƒ­ã‚°ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’開始"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "終了ä½ç½®\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot 㯠--drop-slot ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous 㯠--no-sync ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "æ ¼ç´å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "%sã«ã‚ˆã‚‹åœ§ç¸®`ã¾ã ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "スロット\"%s\"を使用ã™ã‚‹ãƒ¬ãƒ—リケーション接続ã§ã€æƒ³å®šã«åã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã™"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "レプリケーションスロット\"%s\"を削除ã—ã¦ã„ã¾ã™"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "レプリケーションスロット\"%s\"を作æˆã—ã¦ã„ã¾ã™"
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "切断ã—ã¾ã—ãŸ"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "切断ã—ã¾ã—ãŸ; %d秒待機ã—ã¦å†è©¦è¡Œã—ã¾ã™"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s ã¯PostgreSQLã®è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’制御ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"実行ã™ã‚‹å‹•ä½œ:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr ""
+" --start レプリケーションスロットã§ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’開始ã™ã‚‹\n"
+" (スロットåã«ã¤ã„ã¦ã¯ --slot ã‚’å‚ç…§)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ãƒ­ã‚°ã‚’å—ã‘å–る〠- ã§æ¨™æº–出力\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" 出力ファイルã¸ã®fsync時間間隔(デフォルト: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN 既存スロット内ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°é–‹å§‹ä½ç½®\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" 出力プラグインã«ã‚ªãƒ—ションNAMEをオプション値VALUEã¨\n"
+" ã¨ã‚‚ã«æ¸¡ã™\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN 出力プラグインPLUGINを使ã†(デフォルト: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME è«–ç†ãƒ¬ãƒ—リケーションスロットã®åå‰\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase スロット作æˆæ™‚ã«ãƒ—リペアドトランザクションã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’有効ã«ã™ã‚‹\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME 接続先データベース\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "PrecPpg%X/%Xã¾ã§ã®æ›¸ãè¾¼ã¿ã¨ã€%X/%X (スロット %s)ã¾ã§ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "フィードãƒãƒƒã‚¯ãƒ‘ケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "%X/%X (スロット %s)ã‹ã‚‰ãƒ­ã‚°ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’開始ã—ã¾ã™"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "ストリーミングを開始ã—ã¾ã—ãŸ"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "無効ãªã‚½ã‚±ãƒƒãƒˆ: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "WAL ストリームã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "ストリーミングヘッダãŒå°ã•éŽãŽã¾ã™: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "ストリーミングヘッダをèªè­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "%dãƒã‚¤ãƒˆã‚’ログファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "レプリケーションストリームãŒçªç„¶çµ‚了ã—ã¾ã—ãŸ: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "開始ä½ç½®\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "スロットãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "ターゲットファイルãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "データベースãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "å°‘ãªãã¨ã‚‚一ã¤ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot ã‚„ --start 㯠--drop-slot ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot ã‚„ --drop-slot 㯠--startpos ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos 㯠--start ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã«ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phaseã¯--create-slotãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã«ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "データベース指定ã®ãƒ¬ãƒ—リケーション接続ãŒç¢ºç«‹ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "キープアライブã§çµ‚了ä½ç½® %X/%X ã«åˆ°é”ã—ã¾ã—㟠"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "%X/%X ã®WALレコードã§çµ‚了ä½ç½® %X/%X ã«åˆ°é”ã—ã¾ã—ãŸ"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "アーカイブステータスファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "アーカイブステータスファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ã‚µã‚¤ã‚ºã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "既存ã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "既存ã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "先行書ãè¾¼ã¿ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã¯%zdãƒã‚¤ãƒˆã§ã™ãŒã€0ã¾ãŸã¯%dã§ã‚ã‚‹ã¯ãšã§ã™"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "\"%s\"ã®åå‰ã‚’変更ã—ã¾ã›ã‚“ã€ã‚»ã‚°ãƒ¡ãƒ³ãƒˆãŒå®Œæˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "サーãƒãƒ¼ãŒã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®å±¥æ­´ãƒ•ã‚¡ã‚¤ãƒ«åを通知ã—ã¦ãã¾ã—ãŸ: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "タイムライン履歴ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "タイムライン履歴ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "éžäº’æ›ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯%sよりå¤ã„サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "éžäº’æ›ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯%sより新ã—ã„サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "システム識別å­ãŒãƒ™ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°æŽ¥ç¶šã®é–“ã§ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "開始タイムライン%uãŒã‚µãƒ¼ãƒãƒ¼ã«å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "TIMELINE_HISTORYコマンドã¸ã®æƒ³å®šå¤–ã®å¿œç­”: å—ä¿¡ã—ãŸã®ã¯%dè¡Œ%d列ã€æƒ³å®šã¯%dè¡Œ%d列"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "サーãƒãƒ¼ãŒã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%2$uã«ç¶šã„ã¦æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%1$uを通知ã—ã¦ãã¾ã—ãŸ"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "サーãƒãƒ¼ã¯ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’%X/%Xã§åœæ­¢ã—ã¾ã—ãŸã€ã—ã‹ã—次ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uãŒ%X/%Xã‹ã‚‰é–‹å§‹ã™ã‚‹ã¨é€šçŸ¥ã—ã¦ãã¦ã„ã¾ã™"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "レプリケーションストリームãŒåœæ­¢ãƒã‚¤ãƒ³ãƒˆã‚ˆã‚Šå‰ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "タイムライン終了後ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œ%d列ã€æƒ³å®šã¯%dè¡Œ%d列"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "次ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®é–‹å§‹ãƒã‚¤ãƒ³ãƒˆ\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "ファイルãŒã‚ªãƒ¼ãƒ—ンã•ã‚Œã¦ã„ãªã„状態ã§ã€ã‚ªãƒ•ã‚»ãƒƒãƒˆ%uã«å¯¾ã™ã‚‹å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "WALデータオフセット%08xã‚’å—ä¿¡ã€æƒ³å®šã¯%08x"
+
+#: receivelog.c:1128
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "WALファイル\"%2$s\"ã«%1$dãƒã‚¤ãƒˆæ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$s"
+
+#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "コピー終端パケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "パスワード: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_pathを消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "integer_datetimesã®ã‚µãƒ¼ãƒãƒ¼è¨­å®šã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimesコンパイル時フラグãŒã‚µãƒ¼ãƒãƒ¼ã¨ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "WALセグメントサイズをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œã§%d列ã€æƒ³å®šã¯%dè¡Œã§%d列以上"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WALセグメントサイズãŒãƒ‘ースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºæŒ‡å®šã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—対å‘サーãƒãƒ¼ã¯%dãƒã‚¤ãƒˆã¨å ±å‘Šã—ã¦ãã¾ã—ãŸ"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "グループアクセスフラグをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œã§%d列ã€æƒ³å®šã¯%dè¡Œã§%d列以上"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "グループアクセスフラグãŒãƒ‘ースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "システムを識別ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œ%d列ã€æƒ³å®šã¯%dè¡Œ%d列以上"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "レプリケーションスロット\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œ%d列ã€æƒ³å®šã¯%dè¡Œ%d列"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "レプリケーションスロット\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "物ç†ãƒ¬ãƒ—リケーションスロットãŒå¿…è¦ã§ã™ãŒã€ã‚¿ã‚¤ãƒ—ã¯\"%s\"ã§ã—ãŸ"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "レプリケーションスロット\"%2$s\"ã®restart_lsn\"%1$s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: streamutil.c:664
+#, 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列"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "レプリケーションスロット\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œ%d列ã€æƒ³å®šã¯%dè¡Œ%d列"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "データを圧縮ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "圧縮ストリームをリセットã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "実装エラー: tarファイルã§ã¯2ã¤ä»¥ä¸Šã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’オープンã§ãã¾ã›ã‚“"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "tarヘッダを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "圧縮パラメータを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "圧縮時ã®unlinkã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "圧縮ストリームをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ"
diff --git a/src/bin/pg_basebackup/po/ka.po b/src/bin/pg_basebackup/po/ka.po
new file mode 100644
index 0000000..31848d6
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ka.po
@@ -0,0 +1,1847 @@
+# Georgian message translation file for pg_basebackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-05 06:18+0000\n"
+"PO-Revision-Date: 2023-07-05 12:31+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒ’იერ მáƒáƒ¬áƒáƒ“ებული სტრიქáƒáƒœáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ს მნიშვნელáƒáƒ‘რსჭირდებáƒ"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "შემუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ის ნიშვნელáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რ\"%s\" ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” áƒáƒ  მიეთითებáƒ"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის \"%s\" შეკუმშვის დáƒáƒœáƒ” %d-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡ (ნáƒáƒ’ულისხმები %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  მიეთითებáƒ"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" long-distance რეჟიმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე \"%s\" წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "%s-დáƒáƒœ %s-მდე სიმბმულის შექმნრშეუძლებელიáƒ: %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ–ე \"%s\" წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "ვერ შექმნრშეკუმშული ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "stdout-ის დუბლირების შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "შეკუმშვის დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "უცნáƒáƒ‘ი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რáƒáƒ¦áƒ“გენის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¡áƒ›áƒ˜áƒ¡áƒáƒ¡"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "lz4 თáƒáƒ•áƒ¡áƒáƒ áƒ—ის ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების შეკუმშვრშეუძლებელიáƒ: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "lz4 შეკუმშვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–ებრვერ მáƒáƒ®áƒ”რხდáƒ: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¡áƒáƒ áƒ—ი 2 ბლáƒáƒ™áƒ¡ სცდებáƒ"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რtar áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბისáƒáƒ¡"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar-ის წევრს ცáƒáƒ áƒ˜áƒ”ლი სáƒáƒ®áƒ”ლი áƒáƒ¥áƒ•áƒ¡"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY-ის ნáƒáƒ™áƒáƒ“ი ბáƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒáƒ›áƒ“ე დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "zstd შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "zstd შეკუმშვის დáƒáƒœáƒ˜áƒ¡ %d-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "შეკუმშვის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რიცხვის %d-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "long-distance რეჟიმი ვერ ჩáƒáƒ•áƒ áƒ—ე: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "zstd გáƒáƒ¨áƒšáƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\""
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ \"%s\""
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\""
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡áƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების ცვლილებების დáƒáƒ‘რუნებრშეუძლებელიáƒ"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "ცხრილების სივრცის მიბმáƒáƒ¨áƒ˜ ერთზე მეტი \"=\" ნიშáƒáƒœáƒ˜áƒ"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ცხრილების მიბმის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%s\", უნდრიყáƒáƒ¡ \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "ძველი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ცხრილის სივრცის მიბმáƒáƒ¨áƒ˜ áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ცხრილის სივრცის მიბმáƒáƒ¨áƒ˜ áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s გáƒáƒ¨áƒ•áƒ”ბული PostgreSQL სერვერის მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ იღებს.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბენ გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ¡:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=სáƒáƒ¥áƒáƒ¦áƒšáƒ“ე იღებს ბáƒáƒ–ის სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (plain (ნáƒáƒ’ულისხმები), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მისáƒáƒ¡\n"
+" (kB/s-ში, áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ სუფიქსი \"k\" áƒáƒœ \"M\")\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრ\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" სáƒáƒ›áƒ˜áƒ–ნის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜(თუ კლიენტისგáƒáƒœ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბულიáƒ)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" ცხრილების სივრცის OLDDIR -დáƒáƒœ NEWDIR-ში გáƒáƒ“áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR წინáƒáƒ¡áƒ¬áƒáƒ  ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ (WAL) სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" სáƒáƒ­áƒ˜áƒ áƒ WAL ფáƒáƒ˜áƒšáƒ”ბის მითითებული მეთáƒáƒ“ით ჩáƒáƒ¡áƒ›áƒ\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip შექნილი tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ შეკუმშვáƒ\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" შეკუმშვის ჩáƒáƒ áƒ—ვრსერვერზე áƒáƒœ კლიენტზე, მითითებისáƒáƒ›áƒ”ბრ\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none შექმნილი tar áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜ áƒáƒ  შეიკუმშებáƒ\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" სწრáƒáƒ¤áƒ˜ áƒáƒœ გáƒáƒ¤áƒáƒœáƒ¢áƒ£áƒšáƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილები\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნáƒ\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდის შექმნáƒ\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜ áƒáƒ  გáƒáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•áƒ”ლáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებელი სლáƒáƒ¢áƒ˜\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" მáƒáƒœáƒ˜áƒ¤áƒ”სტების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ—ვლელი áƒáƒšáƒ¤áƒáƒ áƒ˜áƒ—მი\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" მáƒáƒœáƒ˜áƒ¤áƒ”სტში ყველრფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის თექვსმეტáƒáƒ‘ითში კáƒáƒ“ირებáƒ\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ზáƒáƒ›áƒ სერვერის მხáƒáƒ áƒ”ს áƒáƒ  გáƒáƒ˜áƒ–áƒáƒ›áƒ”ბáƒ\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტი áƒáƒ  შეიქმნებáƒ\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ”ბითი სლáƒáƒ¢áƒ˜áƒ¡ შექმნის თáƒáƒ•áƒ˜áƒ“áƒáƒœ áƒáƒªáƒ˜áƒšáƒ”ბáƒ\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ სტრიქáƒáƒœáƒ˜\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL=INTERVAL\n"
+" სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒš სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ პáƒáƒ™áƒ”ტებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒáƒ•áƒœáƒ”ბáƒ(წáƒáƒ›áƒ”ბში)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•áƒ”ლთვის კითხვრ(áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ უნდრხდებáƒáƒ“ეს)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "მზრფáƒáƒ˜áƒ¤áƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "\"WAL\" ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¬áƒ”რის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სისთვის ფáƒáƒ˜áƒ¤áƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "შექმნილირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ”ბითი სლáƒáƒ¢áƒ˜ %s"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "შექმნილირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ %s"
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სის შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ ნáƒáƒ™áƒáƒ“ის შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s კბ (100%%), %d/%d ცხრილების სივრცე %*s"
+msgstr[1] "%*s/%s კბ (100%%), %d/%d ცხრილების სივრცე %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე (%s%-*.*s)"
+msgstr[1] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე"
+msgstr[1] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "გáƒáƒ“áƒáƒªáƒ”მის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიჩქáƒáƒ áƒ” \"%s\": %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ” ნულზე მეტი უნდრიყáƒáƒ¡"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "--max-rate -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ერთეული: \"%s\""
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ” მთელი რიცხვის დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბáƒ: %s"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %s"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "\"COPY\"-ის მáƒáƒœáƒáƒªáƒ”მების ნáƒáƒ™áƒáƒ“ის მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "\"COPY\"-ის მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "შეკუმშულ tar ფáƒáƒ˜áƒšáƒ¨áƒ˜ მáƒáƒœáƒ˜áƒ¤áƒ”სტის შეჩურთვრშეუძლებელიáƒ"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ კლიენტის მხáƒáƒ áƒ”ს შეკუმშვრდრგáƒáƒáƒ’ზáƒáƒ•áƒœáƒ”თ გáƒáƒ›áƒáƒœáƒáƒ¢áƒáƒœáƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში stdout-ის მáƒáƒ’იერ, áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ %s."
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "შესáƒáƒ«áƒšáƒ”ბელირმხáƒáƒšáƒáƒ“ tar áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბáƒ."
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Plain-ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლáƒáƒ“ pg_basebackup-ს მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡."
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ედ - -ის მითითებრáƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლáƒáƒ“ pg_basebackup-ს მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡."
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "-R პáƒáƒ áƒáƒ›áƒ”ტრს áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლáƒáƒ“ pg_basebackup-ს მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡."
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბი წინ უნდრუსწრებდეს მáƒáƒœáƒ˜áƒ¤áƒ”სტს"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\""
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი შიგთáƒáƒ•áƒ¡áƒ˜"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "შეტყáƒáƒ‘ინებრCOPY ცáƒáƒ áƒ˜áƒ”ლიáƒ"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ COPY შეტყáƒáƒ‘ინებრტიპით %d, სიგრძე %zu"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "სერვერის შეუთáƒáƒ•áƒ¡áƒ”ბელი ვერსირ%s"
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის გáƒáƒ¡áƒáƒ—იშáƒáƒ“ -X none áƒáƒœ -X fetch გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ."
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "სერვერის áƒáƒ› ვერსიáƒáƒ¡ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრმáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, შეუძლებელიáƒ"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "სერვერს თáƒáƒ•áƒ˜áƒ¡ მხáƒáƒ áƒ”ს შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ პრáƒáƒ¤áƒ”სი დáƒáƒ˜áƒ¬áƒ§áƒ. ველáƒáƒ“ები სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის მáƒáƒšáƒáƒ“ინი"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის (\"%s\") გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "სერვერმრBASE_BACKUP ბრძáƒáƒœáƒ”ბáƒáƒ–ე მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ დáƒáƒáƒ‘რუნáƒ; მივიღე %d მწკრივი დრ%d ველი, მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d ველს"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილი დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ წერტილი: %s დრáƒáƒ¡ ხáƒáƒ–ზე %u"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ თáƒáƒ•áƒ¡áƒáƒ áƒ—ის მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "სერვერიდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒ‘რუნებულáƒ"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "stdout-ში მხáƒáƒšáƒáƒ“ ერთი ცხრილების სივრცის ჩáƒáƒ¬áƒ”რრშეუძლიáƒ. ბáƒáƒ–áƒáƒ¡ კი %d áƒáƒ¥áƒ•áƒ¡"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ WAL მიმღების გáƒáƒ¨áƒ•áƒ”ბáƒ"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "სერვერიდáƒáƒœ წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ბáƒáƒšáƒ პáƒáƒ–იცირáƒáƒ  დáƒáƒ‘რუნებულáƒ"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ბáƒáƒšáƒ წერტილი: %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "მიღების დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სის მიერ ნáƒáƒ™áƒáƒ“ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის მáƒáƒšáƒáƒ“ინი ..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ ფáƒáƒ˜áƒ¤áƒ˜áƒ¡áƒ—ვის ბრძáƒáƒœáƒ”ბის გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "შვულეულ პრáƒáƒªáƒ”სს ვერ დáƒáƒ•áƒ”ლáƒáƒ“ები: %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "%d შვილი მáƒáƒ™áƒ•áƒ“áƒ, მáƒáƒ•áƒ”ლáƒáƒ“ი %d"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "შვილეულ ნáƒáƒ™áƒáƒ“ს ვერ დáƒáƒ•áƒ”ლáƒáƒ“ები %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "შვილეული ნáƒáƒ™áƒáƒ“ის გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "შვილეული ნáƒáƒ™áƒáƒ“ის შეცდáƒáƒ›áƒ: %u"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დისკზე ..."
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "backup_manifest.tmp -ის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრbackup_manifest"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი %s: უნდრიყáƒáƒ¡ \"fast\" an \"spread\""
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "\"%s\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜. უნდრიყáƒáƒ¡: \"plain\" áƒáƒœ \"tar\""
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "wal-method-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s. უნდრიყáƒáƒ¡ \"fetch\", \"stream\" áƒáƒœ \"none\""
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "ერთდრáƒáƒ£áƒšáƒáƒ“ შეუძლებელირáƒáƒ áƒ˜áƒ•áƒ”, ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მითითებáƒ"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის áƒáƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "áƒáƒ áƒ˜áƒ•áƒ”, გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის დრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მითითებრერთდრáƒáƒ£áƒšáƒáƒ“ შეუძლებელიáƒ"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "შეკუმშვის უცხრáƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\""
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "რáƒáƒªáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მითითებულიáƒ, კლიენტის-მხრის შეკუმშვის მითითებრშეუძლებელიáƒ"
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "შესáƒáƒ«áƒšáƒ”ბელირმხáƒáƒšáƒáƒ“ tar რეჟიმის მáƒáƒ áƒ¥áƒáƒ¤áƒ”ბის შეკუმშვáƒ"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "WAL-ის ნáƒáƒ™áƒáƒ“ი მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მითითებულიáƒ, შეუძლებელიáƒ"
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის tar-ის რეჟიმში stdout-ზე გáƒáƒ›áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ WAL ნáƒáƒ™áƒáƒ“თáƒáƒœ ერთáƒáƒ“áƒáƒ შესáƒáƒ«áƒšáƒ”ბელი"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლთáƒáƒœ ერთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s-სთვის სáƒáƒ­áƒ˜áƒ áƒáƒ სლáƒáƒ¢áƒ˜áƒ¡ მითითებრ--slot პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები %s დრ%s შეუთáƒáƒ•áƒ¡áƒ”ბელიáƒ"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘რმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნესთáƒáƒœ ერთáƒáƒ“ მითითებული áƒáƒ  შეიძლებრიყáƒáƒ¡"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL-ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘ის მითითებრმხáƒáƒšáƒáƒ“ უბრáƒáƒšáƒ რეჟიმშირშესáƒáƒ«áƒšáƒ”ბელი"
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ %s: %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის ნáƒáƒ™áƒáƒ“ური წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ¡ áƒáƒ®áƒ“ენს.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მითითებულ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში ჩáƒáƒ¬áƒ”რáƒ\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ მითითებული LSN-ის მიღების შემდეგ\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists სლáƒáƒ¢áƒ˜áƒ¡ შექმნისáƒáƒ¡ მისი áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემთხვევáƒáƒ¨áƒ˜ ფáƒáƒ¥áƒ¢áƒ˜ შეცდáƒáƒ›áƒáƒ“ áƒáƒ  ჩáƒáƒ˜áƒ—ვლებáƒ\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop შეერთების დáƒáƒ™áƒáƒ áƒ’ვისáƒáƒ¡ თáƒáƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ  ცდáƒ\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync áƒáƒ  დáƒáƒ•áƒ”ლáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" შუáƒáƒšáƒ”დი სერვერზე სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ პáƒáƒ™áƒ”ტების გáƒáƒ’ზáƒáƒ•áƒœáƒ”ბს შáƒáƒ áƒ˜áƒ¡ (ნáƒáƒ’ულისხმები: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous მისი ჩáƒáƒ¬áƒ”რის შემდეგ წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ დáƒáƒ£áƒ§áƒáƒ•áƒœáƒ”ბლივი გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბáƒ\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=მეთáƒáƒ“ი[:წვრილმáƒáƒœáƒ˜]\n"
+" შეკუმშვის მითითებáƒ\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულრქმედებები:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot áƒáƒ®áƒáƒšáƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნრ(სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის იხილეთ --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ’დებრ(რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის იხილეთ --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "სეგმენტის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის მისáƒáƒ›áƒáƒ áƒ—ირ%X/%X (დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ი შეჩერდრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X (დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "გáƒáƒ“áƒáƒ•áƒ”რთე %u-ე დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე მისáƒáƒ›áƒáƒ áƒ—ით %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "მიღებულირშეწყვეტის სიგნáƒáƒšáƒ˜. გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "სეგმენტის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ %lld, გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "შეკუმშული სეგმენტის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ზáƒáƒ›áƒ %d, გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "შეკუმშული სეგმენტის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ ზáƒáƒ›áƒ %zu, გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შემáƒáƒ¬áƒ›áƒ”ბრშეუძლებელიáƒ: áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ი დáƒáƒ˜áƒ¬áƒ§áƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X (დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "ბáƒáƒšáƒ პáƒáƒ–იციის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot -ს დრ--drop-slot -ს ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous -ს --no-sync -თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "%s-სთáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრჯერ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეერთებრსლáƒáƒ¢áƒ˜áƒ— \"%s\" მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ ბáƒáƒ–áƒáƒ–ერდáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ: %s"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნრ\"%s\""
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "გáƒáƒ—იშულიáƒ"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "გáƒáƒ—იშულიáƒ; თáƒáƒ•áƒ˜áƒ“áƒáƒœ ცდáƒáƒ›áƒ“ე დáƒáƒ§áƒáƒ•áƒœáƒ”ბრ%d წáƒáƒ›áƒ˜áƒ"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL_ის ლáƒáƒ’იკური გáƒáƒ¨áƒ˜áƒ¤áƒ•áƒ áƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ებს áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბს.\n"
+"\n"
+" \n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"შესáƒáƒ¡áƒ áƒ£áƒšáƒ”ბელი ქმედებები:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ¨áƒ˜ ნáƒáƒ™áƒáƒ“ის გáƒáƒ¨áƒ•áƒ”ბრ(სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის იხილეთ --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE ჟურნáƒáƒšáƒ˜áƒ¡ მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მიღებáƒ. stdout-ისთვის -\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" შუáƒáƒšáƒ”დი გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ fsync-ებს შáƒáƒ áƒ˜áƒ¡ (ნáƒáƒ’ულისხმები: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN ნáƒáƒ™áƒáƒ“ის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ áƒáƒ áƒ¡áƒ”ბული სლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=სáƒáƒ®áƒ”ლი[=მნიშვნელáƒáƒ‘áƒ]\n"
+" გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბისთვის მითითებული სáƒáƒ®áƒ”ლის, áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულრმნიშვნელáƒáƒ‘ით,\n"
+" გáƒáƒ“áƒáƒªáƒ”მáƒ\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მითითებული დáƒáƒ›áƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრ(ნáƒáƒ’ულისხმები: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase სლáƒáƒ¢áƒ˜áƒ¡ შექმნისáƒáƒ¡ მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის დეკáƒáƒ“ერის ჩáƒáƒ áƒ—ვáƒ\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME მისáƒáƒ”რთებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "ჩáƒáƒ¬áƒ”რის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრ%X/%X-მდე, %X/%X-მდე მáƒáƒªáƒ˜áƒšáƒ”ბრ(სლáƒáƒ¢áƒ˜ %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "უკუკáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის დáƒáƒ¬áƒ§áƒ”ბრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X (სლáƒáƒ¢áƒ˜ %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "ნáƒáƒ™áƒáƒ“ი ინიცირებულიáƒ"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒ”ტი: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "\"WAL\" ნáƒáƒ™áƒáƒ“იდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "ნáƒáƒ™áƒáƒ“ის თáƒáƒ•áƒ¡áƒáƒ áƒ—ი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "ნáƒáƒ™áƒáƒ“ის უცნáƒáƒ‘ი თáƒáƒ•áƒ¡áƒáƒ áƒ—ი: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "%d ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "სლáƒáƒ¢áƒ˜ მითითებული áƒáƒ áƒáƒ"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ˜ მითითებული áƒáƒ áƒáƒ"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "ბáƒáƒ–რმითითებული áƒáƒ áƒáƒ"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ, სულ ცáƒáƒ¢áƒ, ერთი ქმედების მითითებáƒ"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot -ს დრ---start-ს -drop-slot -თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot -ს დრ--drop-slot-ს --startpos -თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos -ის მითითებრმხáƒáƒšáƒáƒ“ --start -თáƒáƒœ ერთáƒáƒ“ შეიძლებáƒ"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase -ის მითითებრმხáƒáƒšáƒáƒ“ --create-slot -თáƒáƒœ ერთáƒáƒ“ შეიძლებáƒ"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "ბáƒáƒ–áƒáƒ–ე-დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეერთების დáƒáƒ›áƒ§áƒáƒ áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "ბáƒáƒšáƒ მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X keepalive-ის მიერ მიღწეული"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "ბáƒáƒšáƒ მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X WAL ჩáƒáƒœáƒáƒ¬áƒ”რის მიერ მიღწეულირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" ზáƒáƒ›áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" fsync()-ის შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¡ \"%s\" áƒáƒ¥áƒ•áƒ¡ %zd ბáƒáƒ˜áƒ¢áƒ˜. უნდრიყáƒáƒ¡ 0 áƒáƒœ %d"
+msgstr[1] "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¡ \"%s\" áƒáƒ¥áƒ•áƒ¡ %zd ბáƒáƒ˜áƒ¢áƒ˜. უნდრიყáƒáƒ¡ 0 áƒáƒœ %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "\"%s\"-ის სáƒáƒ®áƒ”ლი áƒáƒ  შეიცვლებáƒ. სეგმენტი დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელიáƒ"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "სერვერის პáƒáƒ¡áƒ£áƒ®áƒ¨áƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელი ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლიáƒ, დრáƒáƒ˜áƒ¡ ხáƒáƒ–ისთვის %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "სერვერის შეუთáƒáƒ•áƒ¡áƒ”ბელი ვერსირ%s: კლიენტს ნáƒáƒ™áƒáƒ“ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრსერვერებიდáƒáƒœ, რáƒáƒ›áƒšáƒ˜áƒ¡ ვერსიáƒáƒª დáƒáƒ‘áƒáƒšáƒ˜áƒ %s-ზე, áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "სერვერის შეუთáƒáƒ•áƒ¡áƒ”ბელი ვერსირ%s: კლიენტს ნáƒáƒ™áƒáƒ“ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრსერვერებიდáƒáƒœ, რáƒáƒ›áƒšáƒ˜áƒ¡ ვერსიáƒáƒª მáƒáƒ¦áƒáƒšáƒ˜áƒ %s-ზე, áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ ბáƒáƒ–ს მáƒáƒ áƒ¥áƒáƒ¤áƒ¡áƒ დრნáƒáƒ™áƒáƒ“ურ შეერთებáƒáƒ¡ შáƒáƒ áƒ˜áƒ¡ áƒáƒ  ემთხვევáƒ"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "დáƒáƒ¬áƒ§áƒ”ბის დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u სერვერზე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ TIMELINE_HISTORY ბრძáƒáƒœáƒ”ბáƒáƒ–ე: მივიღე %d მწკრივი დრ%d ველი, ველáƒáƒ“ებáƒáƒ“ი %d მწკრივს დრ%d ველს"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "სერვერის პáƒáƒ¡áƒ£áƒ®áƒ¨áƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელი შემდეგი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ირ(%u), დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის შემდეგ: %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "სერვერმრშეწყვიტრდრáƒáƒ˜áƒ¡ ხáƒáƒ–ის %u ნáƒáƒ™áƒáƒ“ი მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, მáƒáƒ’რáƒáƒ› მáƒáƒ˜áƒ¬áƒ”რáƒ, რáƒáƒ› შემდეგი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X იწყებáƒ"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ი გáƒáƒ©áƒ”რების წერტილáƒáƒ›áƒ“ე შეწყდáƒ"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი შედეგების ნáƒáƒ™áƒ áƒ”ბი დრáƒáƒ˜áƒ¡-ხáƒáƒ–ის-დáƒáƒ›áƒ—áƒáƒ•áƒ áƒ”ბის შემდეგ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d ველს"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "შემდეგი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის დáƒáƒ¬áƒ§áƒ”ბის წერტილის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") fsync-ის შეცდáƒáƒ›áƒ: %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "მიღებულირწინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რი წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბისთვის %u მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ ფáƒáƒ˜áƒšáƒ”ბი ღირáƒáƒ áƒáƒ"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "მიღებული WAL მáƒáƒœáƒáƒªáƒ”მის წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%08x, მáƒáƒ•áƒ”ლáƒáƒ“ი %08x"
+
+#: receivelog.c:1128
+#, 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
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "copy-end პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "პáƒáƒ áƒáƒšáƒ˜: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "სერვერთáƒáƒœ მიერთების პრáƒáƒ‘ლემáƒ"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბის პრáƒáƒ‘ლემáƒ: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "სერვერის პáƒáƒ áƒáƒ›áƒ”ტრის \"integer_datetimes\" დáƒáƒ“გენრშეუძლებელიáƒ"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "áƒáƒ’ებისáƒáƒ¡ მითითებული áƒáƒšáƒáƒ›áƒ˜ integer_datetimes სერვერისáƒáƒ¡ áƒáƒ  ემთხვვევáƒ"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "შეცდáƒáƒ›áƒ WAL-ის სეგმენტის ზáƒáƒ›áƒ˜áƒ¡ მიღებისáƒáƒ¡: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d áƒáƒœ მეტ ველს"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL სეგმენტის ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL-ის სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ"
+msgstr[1] "WAL-ის სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "ჯგუფის წვდáƒáƒ›áƒ˜áƒ¡ áƒáƒšáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d áƒáƒœ მეტ ველს"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "ჯგუფის წვდáƒáƒ›áƒ˜áƒ¡ áƒáƒšáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "სისტემის áƒáƒ›áƒáƒªáƒœáƒáƒ‘ის შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d áƒáƒœ მეტ ველს"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d ველს"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ¡. მივიღე: %s"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "restart_lsn \"%s\"-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\""
+
+#: streamutil.c:664
+#, 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 ველს"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") გáƒáƒ“áƒáƒ’დების შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•áƒ”ლáƒáƒ“ი %d მწკრივს დრ%d ველს"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების შეკუმშვის შეცდáƒáƒ›áƒ"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის თáƒáƒ•áƒ˜áƒ“áƒáƒœ დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლების შეცდáƒáƒ›áƒ: tar ფáƒáƒ˜áƒšáƒ”ბს ერთზე მეტი ღირფáƒáƒ˜áƒšáƒ˜ ვერ ექნებáƒáƒ—"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "tar-ის თáƒáƒ•áƒ¡áƒáƒ áƒ—ის შექმნის შეცდáƒáƒ›áƒ"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლრშეუძლებელáƒ"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "წáƒáƒ¨áƒšáƒ შეკუმშვით მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#, c-format
+#~ msgid "This build does not support compression with %s."
+#~ msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#, c-format
+#~ msgid "could not check file \"%s\""
+#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბრშეუძლებელიáƒ: %s"
+
+#, c-format
+#~ msgid "could not determine seek position in file \"%s\": %s"
+#~ msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ %s გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ“გენრშეუძლებელიáƒ: %s"
+
+#, c-format
+#~ msgid "could not find replication slot \"%s\""
+#~ msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s"
+
+#, c-format
+#~ msgid "could not set compression flag for %s: %s"
+#~ msgstr "%s-სთვის შეკუმშვის დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#, c-format
+#~ msgid "log streamer with pid %d exiting"
+#~ msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის პრáƒáƒªáƒ”სი pid-ით %d áƒáƒ¡áƒ áƒ£áƒšáƒ”ბს მუშáƒáƒáƒ‘áƒáƒ¡"
+
+#, c-format
+#~ msgid "no value specified for --compress, switching to default"
+#~ msgstr "--compress -ის მნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრნáƒáƒ’ულისხმები"
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "სიმბმულები áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#, c-format
+#~ msgid "this build does not support gzip compression"
+#~ msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ gzip შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#, c-format
+#~ msgid "this build does not support lz4 compression"
+#~ msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ lz4 შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#, c-format
+#~ msgid "this build does not support zstd compression"
+#~ msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ zstd შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#, c-format
+#~ msgid "unknown compression option \"%s\""
+#~ msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\""
diff --git a/src/bin/pg_basebackup/po/ko.po b/src/bin/pg_basebackup/po/ko.po
new file mode 100644
index 0000000..a6c688e
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ko.po
@@ -0,0 +1,1909 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2015 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2015
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:49+0000\n"
+"PO-Revision-Date: 2023-05-26 13:20+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "ì´ ë²„ì „ì€ %s 압축 ê¸°ëŠ¥ì„ í¬í•¨ 하지 ì•Šê³  빌드 ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "압축 ì˜µì…˜ì„ ì§€ì •í•˜ëŠ” ìžë¦¬ì— 빈 문ìžì—´ì´ 있습니다."
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "ì¸ì‹í•  수 없는 압축 옵션: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "\"%s\" 압축 옵션ì—는 ê·¸ ì§€ì •ê°’ì´ í•„ìš”í•©ë‹ˆë‹¤."
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "\"%s\" 압축 옵션 ê°’ì€ ì •ìˆ˜ì—¬ì•¼ 합니다."
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "\"%s\" 압축 옵션 ê°’ì€ ë¶€ìš¸ë¦°í˜•ì—¬ì•¼ 합니다."
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• ìˆ˜ì¤€ì„ ì§€ì •í•  수 없습니다."
+
+#: ../../common/compression.c:386
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• 수준값으로 %dì—ì„œ %d까지만 허용함 (기본값 %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ë³‘ë ¬ ìž‘ì—… 수를 지정할 수 없습니다."
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ì›ê±°ë¦¬ 모드를 지ì›í•˜ì§€ 않습니다."
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(내부 오류)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ fsync 실패: %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2238 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" ê°’ì€ \"%s\" 옵션값으로 유효하지 ì•ŠìŒ"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다."
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1610
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1407 pg_basebackup.c:1701
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1471 pg_basebackup.c:1680
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "ì•„ì¹´ì´ë¸Œ 추출 중 예ìƒì¹˜ 못한 ìƒíƒœê°’ 발견"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:687 pg_basebackup.c:731
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 액세스 ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ \"%s\" 심볼릭 ë§í¬ë¡œ 만들 수 ì—†ìŒ: %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "íŒŒì¼ \"%s\" ì˜ ì ‘ê·¼ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 íŒŒì¼ ë§Œë“¤ê¸° 실패: %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "stdoutì„ ì¤‘ë³µí•  수 ì—†ìŒ: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "출력파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "ìž˜ëª»ëœ ì••ì¶• 수위 %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "\"%s\" 압축 íŒŒì¼ ì“°ê¸° 실패: %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 íŒŒì¼ ë‹«ê¸° 실패: %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "압축 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화할 수 ì—†ìŒ"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "압축 풀기 실패: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "ë³µì› ê´€ë ¨ ì„¤ì •ì„ ì¶”ê°€ 하는 ë„중 예ìƒì¹˜ 못한 ìƒíƒœ 발견"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "lz4 압축 컨í…스트 정보를 ìƒì„±í•  수 없습니다: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "lz4 í—¤ë”를 쓸 수 ì—†ìŒ: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "ìžë£Œë¥¼ 압축할 수 ì—†ìŒ: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "lz4 ì••ì¶•ì„ ë낼 수 ì—†ìŒ: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "압축 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화 í•  수 ì—†ìŒ: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tar íŒŒì¼ ë부분ì—ì„œ 2 블ë¡ì´ 초과ë¨"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "tar ì•„ì¹´ì´ë¸Œ ë¶„ì„ ì¤‘ 예ìƒì¹˜ 못한 ìƒíƒœ 발견"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar ë§´ë²„ì— ì´ë¦„ì´ ì—†ìŒ"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "마지막 파ì¼ì„ ë내기 ì „ì— COPY ìŠ¤íŠ¸ë¦¼ì´ ë났ìŒ"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "zstd 압축 컨í…스트를 만들 수 ì—†ìŒ"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "zstd 압축 ìˆ˜ì¤€ì„ %d 값으로 지정할 수 ì—†ìŒ: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "압축용 병렬 ìž‘ì—…ìž ìˆ˜ë¥¼ %d 값으로 지정할 수 ì—†ìŒ: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "ì›ê±°ë¦¬ 모드를 활성화 í•  수 ì—†ìŒ: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "zstd 압축 컨í…스트를 만들 수 ì—†ìŒ"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "\"%s\" 디렉터리를 지우는 중"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "ë°ì´í„° 디렉터리 ì‚­ì œ 실패"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "\"%s\" ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ë‚´ìš©ì„ ì§€ìš°ëŠ” 중"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ë‚´ìš©ì„ ì§€ìš¸ 수 ì—†ìŒ"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리를 지우는 중"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL 디렉터리 삭제 실패"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "\"%s\" WAL 디렉터리 ë‚´ìš©ì„ ì§€ìš°ëŠ” 중"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL ë””ë ‰í„°ë¦¬ì˜ ë‚´ìš©ì„ ì§€ìš¸ 수 ì—†ìŒ"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "ì‚¬ìš©ìž ìš”ì²­ìœ¼ë¡œ \"%s\" ë°ì´í„° 디렉터리를 지우지 않았ìŒ"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "ì‚¬ìš©ìž ìš”ì²­ìœ¼ë¡œ \"%s\" WAL 디렉터리를 지우지 않았ìŒ"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "ì•„ì§ ë§ˆë¬´ë¦¬ ë˜ì§€ ì•Šì€ í…Œì´ë¸”스페ì´ìŠ¤ 디렉터리 변경함"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "디렉터리 ì´ë¦„ì´ ë„ˆë¬´ ê¹€"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ 맵핑 하는 ê³³ì—ì„œ \"=\" 문ìžê°€ 중복 ë˜ì–´ 있ìŒ"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr ""
+"\"%s\" 형ì‹ì˜ í…Œì´ë¸”스페ì´ìŠ¤ ë§µí•‘ì´ ìž˜ëª» ë˜ì—ˆìŒ, \"OLDDIR=NEWDIR\" 형ì‹ì´ì–´"
+"야 함"
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ 맵핑용 옛 디렉터리가 절대 경로가 아님: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ 맵핑용 새 디렉터리가 절대 경로가 아님: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ ìš´ì˜ ì¤‘ì¸ PostgreSQL ì„œë²„ì— ëŒ€í•´ì„œ ë² ì´ìŠ¤ ë°±ì—…ì„ í•˜ëŠ” ë„구입니"
+"다.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [옵션]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"ì¶œë ¥ë¬¼ì„ ì œì–´ì•¼í•˜ëŠ” 옵션들:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=디렉터리 ë² ì´ìŠ¤ 백업 ê²°ê³¼ë¬¼ì´ ì €ìž¥ë  ë””ë ‰í„°ë¦¬\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t 출력 í˜•ì‹ (plain (초기값), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=ì†ë„ 최대 전송 ì†ë„\n"
+" (단위는 kB/s, ë˜ëŠ” ìˆ«ìž ë’¤ì— \"k\" ë˜ëŠ” \"M\" 단위 "
+"ë¬¸ìž ì§€ì • 가능)\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" 복제를 위한 환경 설정 함\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" 백업 타겟 지정 (ì´ê³³ ë˜ëŠ” 다른 ê³³)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=옛DIR=새DIR\n"
+" í…Œì´ë¸”스페ì´ìŠ¤ 디렉터리 새 맵핑\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR 트랜잭션 로그 디렉터리 지정\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" 필요한 WAL 파ì¼ì„ 백업하는 방법\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip tar ì¶œë ¥ë¬¼ì„ ì••ì¶•\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" 압축 관련 설정\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none tar 출력ì—ì„œ 압축 안함\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"ì¼ë°˜ 옵션들:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" ì²´í¬í¬ì¸íŠ¸ 방법\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot 새 복제 ìŠ¬ë¡¯ì„ ë§Œë“¬\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ë¼ë²¨ 백업 ë¼ë²¨ 지정\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 오류 ë°œìƒ ì‹œ 정리하지 ì•ŠìŒ\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr " -N, --no-sync ë””ìŠ¤í¬ ì“°ê¸° ë’¤ sync ìž‘ì—… ìƒëžµ\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 진행 과정 보여줌\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=슬롯ì´ë¦„ 지정한 복제 ìŠ¬ë¡¯ì„ ì‚¬ìš©í•¨\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose ìžì„¸í•œ ìž‘ì—… 메시지 보여줌\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보 보여주고 마침\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" 사용할 manifest ì²´í¬ì„¬ 알고리즘\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" manifest ë‚´ 모든 íŒŒì¼ ì´ë¦„ì„ 16진수 ì¸ì½”딩함\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size 서버측 백업 í¬ê¸°ë¥¼ 예ìƒí•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest 백업 매니페스트 만들지 ì•ŠìŒ\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot ìž„ì‹œ 복제 슬롯 만들지 ì•ŠìŒ\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" ì²´í¬ì„¬ 검사 안함\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=ì ‘ì†ë¬¸ìžì—´ 서버 ì ‘ì† ë¬¸ìžì—´\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=호스트ì´ë¦„ ì ‘ì†í•  ë°ì´í„°ë² ì´ìŠ¤ 서버나 소켓 디렉터리\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=í¬íŠ¸ ë°ì´í„°ë² ì´ìŠ¤ 서버 í¬íŠ¸ 번호\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in "
+"seconds)\n"
+msgstr ""
+" -s, --status-interval=ì´ˆ\n"
+" ì´ˆ 단위 매번 서버로 ìƒíƒœ íŒ¨í‚·ì„ ë³´ëƒ„\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=ì‚¬ìš©ìž ì ‘ì†í•  특정 ë°ì´í„°ë² ì´ìŠ¤ 사용ìž\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 비밀번호 물어 보지 ì•ŠìŒ\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password í•­ìƒ ë¹„ë°€ë²ˆí˜¸ 프롬프트 ë³´ìž„ (ìžë™ìœ¼ë¡œ íŒë‹¨ 함)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "ì¤€ë¹„ëœ íŒŒì´í”„로부터 ì½ê¸° 실패: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2152
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "트랜잭션 로그 위치 \"%s\" ë¶„ì„ ì‹¤íŒ¨"
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "WAL íŒŒì¼ ì“°ê¸° 마무리 실패: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "백그ë¼ìš´ë“œ 프로세스를 위한 파ì´í”„ 만들기 실패: %m"
+
+#: pg_basebackup.c:665
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "\"%s\" ìž„ì‹œ 복제 ìŠ¬ë¡¯ì„ ë§Œë“¦"
+
+#: pg_basebackup.c:668
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¦"
+
+#: pg_basebackup.c:702
+#, c-format
+msgid "could not create background process: %m"
+msgstr "백그ë¼ìš´ë“œ 프로세스 만들기 실패: %m"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "백그ë¼ìš´ë“œ 스래드 만들기 실패: %m"
+
+#: pg_basebackup.c:750
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" 디렉터리가 있지만 비어 있지 ì•ŠìŒ"
+
+#: pg_basebackup.c:756
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d í…Œì´ë¸”스페ì´ìŠ¤ %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d í…Œì´ë¸”스페ì´ìŠ¤ (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d í…Œì´ë¸”스페ì´ìŠ¤"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "\"%s\" 전송 ì†ë„는 ìž˜ëª»ëœ ê°’ìž„"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "ìž˜ëª»ëœ ì „ì†¡ ì†ë„ \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "전송 ì†ë„는 0보다 커야 함"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "ìž˜ëª»ëœ --max-rate 단위: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "\"%s\" 전송 ì†ë„는 정수형 범위가 아님"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "\"%s\" 전송 ì†ë„는 범위 초과"
+
+#: pg_basebackup.c:996
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "COPY ë°ì´í„° ìŠ¤íŠ¸ë¦¼ì„ ì‚¬ìš©í•  수 ì—†ìŒ: %s"
+
+#: pg_basebackup.c:1013 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "COPY ìžë£Œë¥¼ ì½ì„ 수 ì—†ìŒ: %s"
+
+#: pg_basebackup.c:1017
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "백그ë¼ìš´ë“œ 프로세스가 예ìƒì¹˜ 않게 종료ë¨"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "ì••ì¶•ëœ tar 파ì¼ì—는 manifest를 ë„£ì„ ìˆ˜ 없습니다."
+
+#: pg_basebackup.c:1089
+#, c-format
+msgid ""
+"Use client-side compression, send the output to a directory rather than "
+"standard output, or use %s."
+msgstr ""
+"ê²°ê³¼ë¬¼ì„ í‘œì¤€ 출력으로 보내지 ë§ê³ , 디렉터리로 보낸 ë’¤ í´ë¼ì´ì–¸íŠ¸ 측ì—ì„œ ì••"
+"축 하거나, %s ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”."
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "\"%s\" ì•„ì¹´ì´ë¸Œë¥¼ 구문분ì„í•  수 ì—†ìŒ"
+
+#: pg_basebackup.c:1106
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "tar 형ì‹ë§Œ 구문분ì„í•  수 있ìŒ"
+
+#: pg_basebackup.c:1108
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "ì•„ì¹´ì´ë¸Œë¥¼ 분ì„하기 위해서는 ì¼ë°˜ ì–‘ì‹ì´ì–´ì•¼ 합니다."
+
+#: pg_basebackup.c:1110
+#, c-format
+msgid ""
+"Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "ì•„ì¹´ì´ë¸Œë¥¼ 분ì„하기 위해 출력 디렉터리 ì´ë¦„으로 - 문ìžë¥¼ 사용하세요."
+
+#: pg_basebackup.c:1112
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "ì•„ì¹´ì´ë¸Œë¥¼ 분ì„하기 위해 -R ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”."
+
+#: pg_basebackup.c:1331
+#, c-format
+msgid "archives must precede manifest"
+msgstr "ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì€ ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ë³´ë‹¤ 앞서야합니다"
+
+#: pg_basebackup.c:1346
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "ìž˜ëª»ëœ ì•„ì¹´ì´ë¸Œ ì´ë¦„: \"%s\""
+
+#: pg_basebackup.c:1418
+#, c-format
+msgid "unexpected payload data"
+msgstr "ë¹„ì •ìƒ payload ìžë£Œ"
+
+#: pg_basebackup.c:1561
+#, c-format
+msgid "empty COPY message"
+msgstr "빈 COPY 메시지"
+
+#: pg_basebackup.c:1563
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "타입 %dì˜ ìž˜ëª»ëœ COPY 메시지, 길ì´: %zu"
+
+#: pg_basebackup.c:1761
+#, c-format
+msgid "incompatible server version %s"
+msgstr "호환하지 않는 서버 버전 %s"
+
+#: pg_basebackup.c:1777
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr ""
+"트랜잭션 로그 스트리ë°ì„ 사용하지 않으려면 -X none ë˜ëŠ” -X fetch ì˜µì…˜ì„ ì‚¬ìš©"
+"하세요."
+
+#: pg_basebackup.c:1845
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "ì´ ì„œë²„ëŠ” 백업 íƒ€ì¼“ì„ ì§€ì›í•˜ì§€ ì•ŠìŒ."
+
+#: pg_basebackup.c:1848
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "백업 íƒ€ê²Ÿì„ ì‚¬ìš©í•  때는 ì› í™˜ê²½ ì„¤ì •ì„ ê¸°ë¡í•  수 없습니다."
+
+#: pg_basebackup.c:1875
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "ì´ ì„œë²„ëŠ” 서버 측 ì••ì¶•ì„ ì§€ì›í•˜ì§€ 않습니다"
+
+#: pg_basebackup.c:1885
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "ë² ì´ìŠ¤ ë°±ì—…ì„ ì´ˆê¸°í™” 중, ì²´í¬í¬ì¸íŠ¸ 완료를 기다리는 중"
+
+#: pg_basebackup.c:1889
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "ì²´í¬í¬ì¸íŠ¸ê°€ ë나길 기다리는 중"
+
+#: pg_basebackup.c:1902 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "\"%s\" 복제 ëª…ë ¹ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s"
+
+#: pg_basebackup.c:1910
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "ë² ì´ìŠ¤ ë°±ì—…ì„ ì´ˆê¸°í™” í•  수 ì—†ìŒ: %s"
+
+#: pg_basebackup.c:1913
+#, c-format
+msgid ""
+"server returned unexpected response to BASE_BACKUP command; got %d rows and "
+"%d fields, expected %d rows and %d fields"
+msgstr ""
+"서버가 BASE_BACKUP ëª…ë ¹ì— ëŒ€í•´ì„œ ìž˜ëª»ëœ ì‘ë‹µì„ í–ˆìŠµë‹ˆë‹¤; ì‘답값: %d 로우, %d "
+"필드, (기대값: %d 로우, %d 필드)"
+
+#: pg_basebackup.c:1919
+#, c-format
+msgid "checkpoint completed"
+msgstr "ì²´í¬í¬ì¸íŠ¸ 완료"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "트랙잭션 로그 시작 위치: %s, 타임ë¼ì¸: %u"
+
+#: pg_basebackup.c:1941
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "백업 í—¤ë”를 구할 수 ì—†ìŒ: %s"
+
+#: pg_basebackup.c:1944
+#, c-format
+msgid "no data returned from server"
+msgstr "서버가 아무런 ìžë£Œë„ 주지 않았ìŒ"
+
+#: pg_basebackup.c:1987
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr ""
+"표준 출력으로는 í•˜ë‚˜ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë§Œ 쓸 수 있ìŒ, ë°ì´í„°ë² ì´ìŠ¤ëŠ” %d ê°œì˜ í…Œ"
+"ì´ë¸” 스페ì´ìŠ¤ê°€ 있ìŒ"
+
+#: pg_basebackup.c:2000
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "백그ë¼ìš´ë“œ WAL ìˆ˜ì‹ ìž ì‹œìž‘ 중"
+
+#: pg_basebackup.c:2083
+#, c-format
+msgid "backup failed: %s"
+msgstr "백업 실패: %s"
+
+#: pg_basebackup.c:2086
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "서버ì—ì„œ 트랜잭션 로그 마지막 위치가 수신 ë˜ì§€ 않았ìŒ"
+
+#: pg_basebackup.c:2089
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "트랜잭션 로그 마지막 위치: %s"
+
+#: pg_basebackup.c:2100
+#, c-format
+msgid "checksum error occurred"
+msgstr "ì²´í¬ì„¬ 오류 ë°œìƒ"
+
+#: pg_basebackup.c:2105
+#, c-format
+msgid "final receive failed: %s"
+msgstr "수신 작업 마무리 실패: %s"
+
+#: pg_basebackup.c:2129
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "스트리ë°ì„ ë내기 위해서 백그ë¼ìš´ë“œ 프로세스를 기다리는 중 ..."
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "백그ë¼ìš´ë“œ 파ì´í”„ë¡œ ëª…ë ¹ì„ ë³´ë‚¼ 수 ì—†ìŒ: %m"
+
+#: pg_basebackup.c:2138
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "하위 프로세스를 기다릴 수 ì—†ìŒ: %m"
+
+#: pg_basebackup.c:2140
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "%d ê°œì˜ í•˜ìœ„ 프로세스가 종료ë¨, 기대값 %d"
+
+#: pg_basebackup.c:2142 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2162
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "하위 스레드를 기다릴 수 ì—†ìŒ: %m"
+
+#: pg_basebackup.c:2167
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "하위 스레드 종료 ìƒíƒœê°€ ì •ìƒì ì´ì§€ ì•ŠìŒ: %m"
+
+#: pg_basebackup.c:2170
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "하위 스레드가 ë¹„ì •ìƒ ì¢…ë£Œë¨: 오류 코드 %u"
+
+#: pg_basebackup.c:2199
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "ìžë£Œë¥¼ 디스í¬ì— ë™ê¸°í™” 하는 중 ... "
+
+#: pg_basebackup.c:2224
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "backup_manifest.tmp 파ì¼ì„ backup_manifestë¡œ 바꾸는 중"
+
+#: pg_basebackup.c:2244
+#, c-format
+msgid "base backup completed"
+msgstr "ë² ì´ìŠ¤ 백업 완료"
+
+#: pg_basebackup.c:2327
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "ìž˜ëª»ëœ ì²´í¬í¬ì¸íŠ¸ 옵션값 \"%s\", \"fast\" ë˜ëŠ” \"spread\"만 사용 가능"
+
+#: pg_basebackup.c:2345
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ ì¶œë ¥ 형ì‹, \"plain\" ë˜ëŠ” \"tar\" 만 사용 가능"
+
+#: pg_basebackup.c:2423
+#, c-format
+msgid ""
+"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr ""
+"\"%s\" ê°’ì€ ìž˜ëª»ëœ wal-method 옵션값, \"fetch\", \"stream\" ë˜ëŠ” \"none\"만 "
+"사용 가능"
+
+#: pg_basebackup.c:2458 pg_basebackup.c:2470 pg_basebackup.c:2492
+#: pg_basebackup.c:2504 pg_basebackup.c:2510 pg_basebackup.c:2562
+#: pg_basebackup.c:2573 pg_basebackup.c:2583 pg_basebackup.c:2589
+#: pg_basebackup.c:2596 pg_basebackup.c:2608 pg_basebackup.c:2620
+#: pg_basebackup.c:2628 pg_basebackup.c:2641 pg_basebackup.c:2647
+#: pg_basebackup.c:2656 pg_basebackup.c:2668 pg_basebackup.c:2679
+#: pg_basebackup.c:2687 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_basebackup.c:2468 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_basebackup.c:2491
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "백업 ì–‘ì‹ê³¼ 백업 íƒ€ê²Ÿì„ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_basebackup.c:2503
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "출력 디렉터리를 지정하거나, 백업 íƒ€ê²Ÿì„ ì§€ì •í•˜ì„¸ìš”."
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "출력 디렉터리와 백업 íƒ€ê²Ÿì€ í•¨ê»˜ 지정할 수 ì—†ìŒ"
+
+#: pg_basebackup.c:2539 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "알 수 없는 압축 알고리즘: \"%s\""
+
+#: pg_basebackup.c:2545 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ìž˜ëª»ëœ ì••ì¶• ì •ë³´: %s"
+
+#: pg_basebackup.c:2561
+#, c-format
+msgid ""
+"client-side compression is not possible when a backup target is specified"
+msgstr "백업 íƒ€ì¼“ì„ ì‚¬ìš©í•  때는 í´ë¼ì´ì–¸íŠ¸ 측 ì••ì¶•ì„ ì‚¬ìš©í•  수 없습니다."
+
+#: pg_basebackup.c:2572
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "tar 형ì‹ë§Œ ì••ì¶•ì„ ì‚¬ìš©í•  수 있ìŒ"
+
+#: pg_basebackup.c:2582
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "백업 íƒ€ê²Ÿì„ ì§€ì •í•  때는 WAL 스트리ë°ì„ 사용할 수 없습니다."
+
+#: pg_basebackup.c:2588
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "tar ë°©ì‹ì—ì„œ stdout으로 트랜잭션 로그 ìŠ¤íŠ¸ë¦¬ë° ë¶ˆê°€"
+
+#: pg_basebackup.c:2595
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "복제 ìŠ¬ë¡¯ì€ WAL ìŠ¤íŠ¸ë¦¬ë° ë°©ì‹ì—서만 사용할 수 있ìŒ"
+
+#: pg_basebackup.c:2607
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "슬롯 ì´ë¦„ì„ ì§€ì •í•œ 경우 --no-slot ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2618 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s ì˜µì…˜ì€ --slot ì˜µì…˜ì„ í•¨ê»˜ 사용해야 함"
+
+#: pg_basebackup.c:2626 pg_basebackup.c:2666 pg_basebackup.c:2677
+#: pg_basebackup.c:2685
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s 옵션과 %s ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_basebackup.c:2640
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "트랜잭션 로그 디렉터리 위치는 백업 타켓과 함께 지정할 수 ì—†ìŒ"
+
+#: pg_basebackup.c:2646
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "트랜잭션 로그 디렉터리 위치는 plain 모드ì—서만 사용할 수 있ìŒ"
+
+#: pg_basebackup.c:2655
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "트랜잭션 로그 디렉터리 위치는 절대 경로여야 함"
+
+#: pg_basebackup.c:2755
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ìŠ¤íŠ¸ë¦¬ë° íŠ¸ëžœìž­ì…˜ 로그를 수신하는 ë„구입니다.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid ""
+" -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=DIR 지정한 디렉터리로 트랜잭션 로그 파ì¼ì„ 백업함\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN 지정한 LSN까지 받고 종료함\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid ""
+" --if-not-exists do not error if slot already exists when creating a "
+"slot\n"
+msgstr ""
+" --if-not-exists ìŠ¬ë¡¯ì„ ìƒˆë¡œ 만들 ë•Œ ì´ë¯¸ ìžˆì–´ë„ ì˜¤ë¥˜ 내지 ì•ŠìŒ\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop ì ‘ì†ì´ ëŠê²¼ì„ ë•Œ 재연결 하지 ì•ŠìŒ\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr " --no-sync ë””ìŠ¤í¬ ì“°ê¸° ë’¤ sync ìž‘ì—… ìƒëžµ\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server "
+"(default: %d)\n"
+msgstr ""
+" -s, --status-interval=ì´ˆ\n"
+" 지정한 ì´ˆ 간격으로 서버로 ìƒíƒœ íŒ¨í‚·ì„ ë³´ëƒ„ (초기값: "
+"%d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid ""
+" --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous 쓰기 작업 후 즉시 트랜잭션 로그를 플러시 함\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" 압축 관련 ì†ì„± 지정\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"추가 기능:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid ""
+" --create-slot create a new replication slot (for the slot's name "
+"see --slot)\n"
+msgstr ""
+" --create-slot 새 복제 ìŠ¬ë¡¯ì„ ë§Œë“¬ (--slot 옵션ì—ì„œ 슬롯 ì´ë¦„ 지"
+"ì •)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid ""
+" --drop-slot drop the replication slot (for the slot's name see "
+"--slot)\n"
+msgstr ""
+" --drop-slot 복제 슬롯 ì‚­ì œ (--slot 옵션ì—ì„œ 슬롯 ì´ë¦„ 지정)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "ë§ˆë¬´ë¦¬ëœ ì„¸ê·¸ë¨¼íŠ¸ 위치: %X/%X (타임ë¼ì¸ %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì¤‘ì§€ëœ ìœ„ì¹˜: %X/%X (타임ë¼ì¸ %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "전환ë¨: 타임ë¼ì¸ %u, 위치 %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "ì¸í„°ëŸ½í„° 시그ë„ì„ ë°›ìŒ, 종료함"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "\"%s\" ì¡°ê° íŒŒì¼ì€ ìž˜ëª»ëœ í¬ê¸°ìž„: %lld, 무시함"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 íŒŒì¼ ì—´ê¸° 실패: %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 íŒŒì¼ ìž‘ì—… 위치 찾기 실패: %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "\"%s\" 압축 íŒŒì¼ ì½ê¸° 실패: %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "\"%s\" 압축 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "\"%s\" 압축 파ì¼ì€ 압축 í’€ì—ˆì„ ë•Œ ìž˜ëª»ëœ í¬ê¸°ìž„: %d, 무시함"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "LZ4 압축 컨í…스트 정보를 ìƒì„±í•  수 없습니다: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "\"%s\" íŒŒì¼ ì••ì¶• 풀기 실패: %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "LZ4 압축 í•´ì œ 컨í…스트 반환 실패: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "\"%s\" ì••ì¶•ëœ ì¡°ê° íŒŒì¼ì€ 압축 í’€ì—ˆì„ ë•Œ ìž˜ëª»ëœ í¬ê¸°ìž„: %zu, 무시함"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid ""
+"cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "\"%s\" íŒŒì¼ ê²€ì‚¬ 실패: %s ì••ì¶•ì„ ì§€ì› ì•ˆí•˜ê²Œ 빌드ë˜ì—ˆìŒ"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 위치: %X/%X (타임ë¼ì¸ %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "시작 위치 êµ¬ë¬¸ì´ ìž˜ëª»ë¨ \"%s\""
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot 옵션과 --drop-slot ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous 옵션과 --no-sync ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "ëŒ€ìƒ ë””ë ‰í„°ë¦¬ë¥¼ 지정하지 ì•ŠìŒ"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "%s ì••ì¶•ì„ ì•„ì§ ì§€ì›í•˜ì§€ ì•ŠìŒ"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid ""
+"replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "\"%s\" ìŠ¬ë¡¯ì„ ì´ìš©í•œ 복제 ì—°ê²°ì€ ì´ ë°ì´í„°ë² ì´ìŠ¤ì—ì„œ 사용할 수 ì—†ìŒ"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ì‚­ì œ 중"
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“œëŠ” 중"
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "ì—°ê²° ëŠê¹€"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "ì—°ê²° ëŠê¹€; 다시 ì—°ê²° 하기 위해 %d 초를 기다리는 중"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ ë…¼ë¦¬ 디코딩 ìŠ¤íŠ¸ë¦¼ì„ ì œì–´í•˜ëŠ” ë„구입니다.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"ì„±ëŠ¥ì— ê´€ê³„ëœ ê¸°ëŠ¥ë“¤:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid ""
+" --start start streaming in a replication slot (for the "
+"slot's name see --slot)\n"
+msgstr ""
+" --start 복제 ìŠ¬ë¡¯ì„ ì´ìš©í•œ ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ (--slot 옵션ì—ì„œ 슬"
+"롯 ì´ë¦„ 지정)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=íŒŒì¼ ìž‘ì—… 로그를 해당 파ì¼ì— 기ë¡, 표준 ì¶œë ¥ì€ -\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: "
+"%d)\n"
+msgstr ""
+" -F --fsync-interval=ì´ˆ\n"
+" 지정한 ì´ˆ 간격으로 íŒŒì¼ fsync ìž‘ì—…ì„ í•¨ (초기값: "
+"%d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid ""
+" -I, --startpos=LSN where in an existing slot should the streaming "
+"start\n"
+msgstr " -I, --startpos=LSN 스트리ë°ì„ 시작할 기존 슬롯 위치\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=ì´ë¦„[=ê°’]\n"
+" 출력 플러그ì¸ì—ì„œ 사용할 ì˜µì…˜ë“¤ì˜ ì˜µì…˜ ì´ë¦„ê³¼ ê·¸ "
+"ê°’\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN 사용할 출력 í”ŒëŸ¬ê·¸ì¸ (초기값: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=슬롯ì´ë¦„ 논리 복제 슬롯 ì´ë¦„\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid ""
+" -t, --two-phase enable decoding of prepared transactions when "
+"creating a slot\n"
+msgstr ""
+" -t, --two-phase ìŠ¬ë¡¯ì„ ë§Œë“¤ ë•Œ 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ 디코딩 활성화\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=디비ì´ë¦„ ì ‘ì†í•  ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "쓰기 í™•ì¸ ìœ„ì¹˜: %X/%X, 플러시 위치 %X/%X (슬롯 %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "피드백 íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 함, 위치: %X/%X (슬롯 %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "ìŠ¤íŠ¸ë¦¬ë° ì´ˆê¸°í™” ë¨"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" 잠금파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "ìž˜ëª»ëœ ì†Œì¼“: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "WAL 스트림ì—ì„œ ìžë£Œ 받기 실패: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "ìŠ¤íŠ¸ë¦¬ë° í—¤ë” í¬ê¸°ê°€ 너무 ìž‘ìŒ: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "ì•Œ 수 없는 ìŠ¤íŠ¸ë¦¬ë° í—¤ë”: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "%d ë°”ì´íŠ¸ 쓰기 실패, ëŒ€ìƒ ë¡œê·¸íŒŒì¼ \"%s\": %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "복제 ìŠ¤íŠ¸ë¦¼ì˜ ì˜ˆìƒì¹˜ 못한 종료: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "시작 위치 êµ¬ë¬¸ì´ ìž˜ëª»ë¨ \"%s\""
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "ìŠ¬ë¡¯ì„ ì§€ì •í•˜ì§€ 않았ìŒ"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "ëŒ€ìƒ íŒŒì¼ì„ 지정하지 않았ìŒ"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 지정하지 않았ìŒ"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "ì ì–´ë„ 하나 ì´ìƒì˜ ìž‘ì—… ë°©ë²•ì„ ì§€ì •í•´ì•¼ 함"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr ""
+"--create-slot 옵션 ë˜ëŠ” --start ì˜µì…˜ì€ --drop-slot 옵션과 함께 사용할 수 ì—†ìŒ"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr ""
+" --create-slot 옵션ì´ë‚˜ --drop-slot ì˜µì…˜ì€ --startpos 옵션과 함께 쓸 수 ì—†ìŒ"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos ì˜µì…˜ì€ --start 옵션과 함께 사용해야 함"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase ì˜µì…˜ì€ --create-slot ì˜µì…˜ì„ ì“¸ 때만 사용 가능함"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì˜ì¡´ì ì¸ 복제 ì—°ê²°ì„ í•  수 ì—†ìŒ"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "keepaliveì— ì˜í•´ì„œ %X/%X 마지막 ìœ„ì¹˜ì— ë„달했ìŒ"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "%X/%X 마지막 위치가 WAL 레코드 %X/%X 위치ì—ì„œ ë„달했ìŒ"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "\"%s\" archive status 파ì¼ì„ 만들 수 없습니다: %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "\"%s\" archive status 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다: %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "\"%s\" WAL íŒŒì¼ í¬ê¸°ë¥¼ ì•Œ 수 ì—†ìŒ: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "ì´ë¯¸ 있는 \"%s\" 트랜잭션 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "ì´ë¯¸ 있는 \"%s\" WAL íŒŒì¼ fsync 실패: %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] ""
+"\"%s\" 트랜잭션 로그파ì¼ì˜ í¬ê¸°ê°€ %zd ë°”ì´íŠ¸ìž„, 0 ë˜ëŠ” %d ë°”ì´íŠ¸ì—¬ì•¼ 함"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "\"%s\" WAL 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "\"%s\" ì´ë¦„ 변경 실패, 세그먼트가 완료ë˜ì§€ 않았ìŒ"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "타임ë¼ì¸ %u ë²ˆì„ ìœ„í•œ ë‚´ì—­ íŒŒì¼ ì´ë¦„ì´ ìž˜ëª» ë˜ì—ˆìŒ: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "\"%s\" 타임ë¼ì¸ ë‚´ì—­ 파ì¼ì„ 만들 수 ì—†ìŒ: %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "\"%s\" 타임ë¼ì¸ ë‚´ì—­ 파ì¼ì— 쓸 수 ì—†ìŒ: %s"
+
+#: receivelog.c:394
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions older than %s"
+msgstr ""
+"%s 서버 ë²„ì „ì€ í˜¸í™˜ë˜ì§€ ì•ŠìŒ; í´ë¼ì´ì–¸íŠ¸ëŠ” %s 버전 보다 ì˜¤ëž˜ëœ ì„œë²„ì˜ ìŠ¤íŠ¸ë¦¬"
+"ë°ì€ 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: receivelog.c:403
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions newer than %s"
+msgstr ""
+"%s 서버 ë²„ì „ì€ í˜¸í™˜ë˜ì§€ ì•ŠìŒ; í´ë¼ì´ì–¸íŠ¸ëŠ” %s 버전 보다 새로운 ì„œë²„ì˜ ìŠ¤íŠ¸ë¦¬"
+"ë°ì€ 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: receivelog.c:508
+#, c-format
+msgid ""
+"system identifier does not match between base backup and streaming connection"
+msgstr "시스템 ì‹ë³„ìžê°€ ë² ì´ìŠ¤ 백업과 ìŠ¤íŠ¸ë¦¬ë° ì—°ê²°ì—ì„œ 서로 다름"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "%u 타임ë¼ì¸ìœ¼ë¡œ 시작하는 ê²ƒì„ ì„œë²„ì—ì„œ 제공 하지 ì•ŠìŒ"
+
+#: receivelog.c:555
+#, c-format
+msgid ""
+"unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"TIMELINE_HISTORY 명령 결과가 잘못ë¨: ë°›ì€ ê°’: 로우수 %d, 필드수 %d, 예ìƒê°’: "
+"로우수 %d, 필드수 %d"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "서버가 ìž˜ëª»ëœ ë‹¤ìŒ íƒ€ìž„ë¼ì¸ 번호 %u 보고함, ì´ì „ 타임ë¼ì¸ 번호 %u"
+
+#: receivelog.c:632
+#, c-format
+msgid ""
+"server stopped streaming timeline %u at %X/%X, but reported next timeline %u "
+"to begin at %X/%X"
+msgstr ""
+"ì„œë²„ì˜ ì¤‘ì§€ 위치: 타임ë¼ì¸ %u, 위치 %X/%X, 하지만 ë³´ê³  ë°›ì€ ìœ„ì¹˜: 타임ë¼ì¸ "
+"%u 위치 %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "복제 ìŠ¤íŠ¸ë¦¼ì´ ì¤‘ì§€ 위치 ì „ì— ì¢…ë£Œ ë˜ì—ˆìŒ"
+
+#: receivelog.c:718
+#, c-format
+msgid ""
+"unexpected result set after end-of-timeline: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"타임ë¼ì¸ ëì— ìž˜ëª»ëœ ê²°ê³¼ê°€ 발견 ë¨: 로우수 %d, 필드수 %d / 예ìƒê°’: 로우수 "
+"%d, 필드수 %d"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "ë‹¤ìŒ íƒ€ìž„ë¼ì¸ 시작 위치 ë¶„ì„ ì‹¤íŒ¨ \"%s\""
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "\"%s\" íŒŒì¼ fsync 실패: %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "%u ìœ„ì¹˜ì˜ ìˆ˜ì‹ ëœ íŠ¸ëžœìž­ì…˜ 로그 ë ˆì½”ë“œì— íŒŒì¼ì„ ì—´ 수 ì—†ìŒ"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "ìž˜ëª»ëœ WAL ìžë£Œ 위치 %08x, 기대값 %08x"
+
+#: receivelog.c:1128
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "%d ë°”ì´íŠ¸ë¥¼ \"%s\" WAL 파ì¼ì— 쓸 수 ì—†ìŒ: %s"
+
+#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "copy-end íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "암호: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "서버 ì ‘ì† ì‹¤íŒ¨"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path를 지울 수 ì—†ìŒ: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "integer_datetimes 서버 ì„¤ì •ì„ ì•Œ 수 ì—†ìŒ"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes ì»´íŒŒì¼ í”Œëž˜ê·¸ê°€ 서버와 ì¼ì¹˜í•˜ì§€ ì•ŠìŒ"
+
+#: streamutil.c:296
+#, c-format
+msgid ""
+"could not fetch WAL segment size: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"WAL ì¡°ê° í¬ê¸° 계산 실패: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, 필드수 %d "
+"ì´ìƒ"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL ì¡°ê° í¬ê¸° ë¶„ì„ ëª»í•¨"
+
+#: streamutil.c:324
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d bytes"
+msgstr[0] ""
+"WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—ì„œ 1GBì‚¬ì´ 2ì˜ ì œê³± í¬ê¸°ì—¬ì•¼ 하는ë°, ì›ê²© 서버는 "
+"%d ë°”ì´íŠ¸ìž…니다."
+
+#: streamutil.c:369
+#, c-format
+msgid ""
+"could not fetch group access flag: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"그룹 ì ‘ê·¼ 플래그를 가져올 수 ì—†ìŒ: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, "
+"필드수 %d ì´ìƒ"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "그룹 ì ‘ê·¼ 플래그를 ë¶„ì„ ëª»í•¨: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid ""
+"could not identify system: got %d rows and %d fields, expected %d rows and "
+"%d or more fields"
+msgstr ""
+"ì‹œìŠ¤í…œì„ ì‹ë³„í•  수 ì—†ìŒ: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, 필드수 %d "
+"ì´ìƒ"
+
+#: streamutil.c:510
+#, c-format
+msgid ""
+"could not read replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"\"%s\" 복제 ìŠ¬ë¡¯ì„ ì½ì„ 수 ì—†ìŒ: 로우수 %d, 필드수 %d, 기대값 로우수 %d, í•„ë“œ"
+"수 %d"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "물리 복제 ìŠ¬ë¡¯ì„ ì‚¬ìš©í•´ì•¼ 함, \"%s\" 복제 슬롯임"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "\"%s\" restart_lsn 위치를 í•´ì„í•  수 ì—†ìŒ, 해당 슬롯: \"%s\""
+
+#: streamutil.c:664
+#, 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"
+
+#: streamutil.c:708
+#, c-format
+msgid ""
+"could not drop replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"\"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•  수 ì—†ìŒ: 로우수 %d, 필드수 %d, 기대값 로우수 %d, í•„"
+"드수 %d"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "ìžë£Œë¥¼ 압축할 수 ì—†ìŒ"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "압축 ìŠ¤íŠ¸ë¦¼ì„ ë¦¬ì…‹í•  수 ì—†ìŒ"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "구현 오류: tar 파ì¼ì€ 하나 ì´ìƒ ì—´ 수 ì—†ìŒ"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "tar í•´ë”를 만들 수 ì—†ìŒ"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "압축 매개 변수를 바꿀 수 ì—†ìŒ"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "압축 ìƒíƒœì—ì„œ íŒŒì¼ ì‚­ì œëŠ” 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "압축 ìŠ¤íŠ¸ë¦¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ"
diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build
new file mode 100644
index 0000000..2a39f5f
--- /dev/null
+++ b/src/bin/pg_basebackup/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_basebackup-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_basebackup/po/pl.po b/src/bin/pg_basebackup/po/pl.po
new file mode 100644
index 0000000..b0e647b
--- /dev/null
+++ b/src/bin/pg_basebackup/po/pl.po
@@ -0,0 +1,1345 @@
+# Polish message translation file for pg_basebackup
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL 9.5)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-03-14 17:45+0000\n"
+"PO-Revision-Date: 2017-03-14 19:40+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/file_utils.c:82 ../../common/file_utils.c:167
+#: pg_receivewal.c:252 pg_recvlogical.c:353
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "%s: nie można wykonać stat na pliku \"%s\": %s\n"
+
+#: ../../common/file_utils.c:143 pg_receivewal.c:153
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "%s: nie można otworzyć katalogu \"%s\": %s\n"
+
+#: ../../common/file_utils.c:179 pg_receivewal.c:320
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "%s: nie można odczytać katalogu \"%s\": %s\n"
+
+#: ../../common/file_utils.c:212 ../../common/file_utils.c:272
+#: ../../common/file_utils.c:348
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\": %s\n"
+
+#: ../../common/file_utils.c:285 ../../common/file_utils.c:357
+#: receivelog.c:791 receivelog.c:1034
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "%s: nie można wykonać fsync na pliku \"%s\": %s\n"
+
+#: ../../common/file_utils.c:368
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "%s: nie można zmienić nazwy pliku \"%s\" na \"%s\": %s\n"
+
+#: pg_basebackup.c:159
+#, c-format
+msgid "%s: removing data directory \"%s\"\n"
+msgstr "%s: usuwanie katalogu danych \"%s\"\n"
+
+#: pg_basebackup.c:162
+#, c-format
+msgid "%s: failed to remove data directory\n"
+msgstr "%s: nie udało się usunięcie katalogu danych\n"
+
+#: pg_basebackup.c:168
+#, c-format
+msgid "%s: removing contents of data directory \"%s\"\n"
+msgstr "%s: usuwanie zawartości w katalogu danych \"%s\"\n"
+
+#: pg_basebackup.c:171
+#, c-format
+msgid "%s: failed to remove contents of data directory\n"
+msgstr "%s: nie udało się usunąć zawartości w katalogu danych\n"
+
+#: pg_basebackup.c:177
+#, c-format
+msgid "%s: removing transaction log directory \"%s\"\n"
+msgstr "%s: usuwanie katalogu dziennika transakcji \"%s\"\n"
+
+#: pg_basebackup.c:180
+#, c-format
+msgid "%s: failed to remove transaction log directory\n"
+msgstr "%s: nie udało się usunięcie katalogu dziennika transakcji\n"
+
+#: pg_basebackup.c:186
+#, c-format
+msgid "%s: removing contents of transaction log directory \"%s\"\n"
+msgstr "%s: usuwanie zawartości katalogu dziennika transakcji \"%s\"\n"
+
+#: pg_basebackup.c:189
+#, c-format
+msgid "%s: failed to remove contents of transaction log directory\n"
+msgstr "%s: nie udało się usunąć zawartości w katalogu dziennika transakcji\n"
+
+#: pg_basebackup.c:197
+#, c-format
+msgid "%s: data directory \"%s\" not removed at user's request\n"
+msgstr "%s: katalog \"%s\" nie został usunięty na żądanie użytkownika\n"
+
+#: pg_basebackup.c:202
+#, c-format
+msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+msgstr "%s: katalog \"%s\" nie został usunięty na żądanie użytkownika\n"
+
+#: pg_basebackup.c:208
+#, c-format
+msgid "%s: changes to tablespace directories will not be undone\n"
+msgstr "%s: zmiane na folderach przestrzeni tabel nie mogą być wycofane\n"
+
+#: pg_basebackup.c:250
+#, c-format
+msgid "%s: directory name too long\n"
+msgstr "%s: zbyt długa nazwa folderu\n"
+
+#: pg_basebackup.c:260
+#, c-format
+msgid "%s: multiple \"=\" signs in tablespace mapping\n"
+msgstr "%s: wiele znaków \"=\" signs w mapowaniu przestrzeni tabel\n"
+
+#: pg_basebackup.c:273
+#, c-format
+msgid "%s: invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"\n"
+msgstr "%s: niepoprawny format mapowania przestrzeni tabel \"%s\", musi być "
+"\"POPRZFLDR=NOWYFLDR\"\n"
+
+#: pg_basebackup.c:286
+#, c-format
+msgid "%s: old directory is not an absolute path in tablespace mapping: %s\n"
+msgstr "%s: poprzedni folder to nie ścieżka bezwzględna w mapowaniu przestrzeni "
+"tabel: %s\n"
+
+#: pg_basebackup.c:293
+#, c-format
+msgid "%s: new directory is not an absolute path in tablespace mapping: %s\n"
+msgstr "%s: nowy folder to nie ścieżka bezwzględna w mapowaniu przestrzeni tabel: %s\n"
+
+#: pg_basebackup.c:327
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s bierze podstawową kopię zapasową działającego serwera PostgreSQL.\n"
+"\n"
+
+#: pg_basebackup.c:329 pg_receivewal.c:76 pg_recvlogical.c:77
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_basebackup.c:330 pg_receivewal.c:77 pg_recvlogical.c:78
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCJA]...\n"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Opcje kontroli wyjścia:\n"
+
+#: pg_basebackup.c:332
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=FOLDER dostarcza kopiÄ™ zapasowÄ… bazy do katalogu\n"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t format wyjścia (plain (domyślny), tar)\n"
+
+#: pg_basebackup.c:334
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE maksymalna prędkość transferu przenoszenia "
+"folderu danych\n"
+" (w kB/s, albo użyj sufiksu \"k\" lub \"M\")\n"
+
+#: pg_basebackup.c:336
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write recovery.conf for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" zapisuje recovery.conf po replikacji\n"
+
+#: pg_basebackup.c:338 pg_receivewal.c:84
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME gniazdo replikacji do użycia\n"
+
+#: pg_basebackup.c:339
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot zapobiega tworzeniu tymczasowego gniazda replikacji\n"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=POPRZFLDR=NOWYFLDR\n"
+" przenosi przestrzeń tabel z POPRZFLDR do NOWYFLDR\n"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" dołącza wymagane pliki WAL wskazaną metodą\n"
+
+#: pg_basebackup.c:344
+#, c-format
+msgid " --waldir=WALDIR location for the transaction log directory\n"
+msgstr " --waldir=WALFLDR umiejscowienie folderu dziennika transakcji\n"
+
+#: pg_basebackup.c:345
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip wyjście jako spakowany tar\n"
+
+#: pg_basebackup.c:346
+#, c-format
+msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr " -Z, --compress=0-9 wyjście jako spakowany tar z określonym poziomem "
+"kompresji\n"
+
+#: pg_basebackup.c:347
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opcje ogólne:\n"
+
+#: pg_basebackup.c:348
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" ustawia szybkie lub rozszerzone sprawdzenia\n"
+
+#: pg_basebackup.c:350
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ETYKIETA ustala etykietÄ™ kopii zapasowej\n"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean błędy nie będą porządkowane\n"
+
+#: pg_basebackup.c:352
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync nie czekać aż zmiany zostaną bezpiecznie "
+"zapisane na dysk\n"
+
+#: pg_basebackup.c:353
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress pokazanie informacji o postępie\n"
+
+#: pg_basebackup.c:354 pg_receivewal.c:86 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose szczegółowe komunikaty na wyjściu\n"
+
+#: pg_basebackup.c:355 pg_receivewal.c:87 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: pg_basebackup.c:356 pg_receivewal.c:89 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_basebackup.c:357 pg_receivewal.c:90 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opcje połączenia:\n"
+
+#: pg_basebackup.c:358 pg_receivewal.c:91
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CGPOLACZ połączenie do bazy danych o tym ciągu połączenia\n"
+
+#: pg_basebackup.c:359 pg_receivewal.c:92 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NAZWAHOSTA host serwera bazy danych lub katalog gniazda\n"
+
+#: pg_basebackup.c:360 pg_receivewal.c:93 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numer portu na serwera bazy dnaych\n"
+
+#: pg_basebackup.c:361
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERWAÅ \n"
+" czas pomiędzy wysłaniami pakietów stanu na serwer "
+"(w sekundach)\n"
+
+#: pg_basebackup.c:363 pg_receivewal.c:94 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAZWA połączenie jako wskazany użytkownik bazy\n"
+
+#: pg_basebackup.c:364 pg_receivewal.c:95 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nie pytaj nigdy o hasło\n"
+
+#: pg_basebackup.c:365 pg_receivewal.c:96 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password wymuś pytanie o hasło (powinno nastąpić "
+"automatycznie)\n"
+
+#: pg_basebackup.c:366 pg_receivewal.c:100 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_basebackup.c:409
+#, c-format
+msgid "%s: could not read from ready pipe: %s\n"
+msgstr "%s: nie można odczytać z przygotowanej rury: %s\n"
+
+#: pg_basebackup.c:417 pg_basebackup.c:547 pg_basebackup.c:1996
+#: streamutil.c:285
+#, c-format
+msgid "%s: could not parse transaction log location \"%s\"\n"
+msgstr "%s: nie można sparsować położenia dziennika transakcji \"%s\"\n"
+
+#: pg_basebackup.c:510 pg_receivewal.c:427
+#, c-format
+msgid "%s: could not finish writing WAL files: %s\n"
+msgstr "%s: nie można zapisać plików WAL: %s\n"
+
+#: pg_basebackup.c:560
+#, c-format
+msgid "%s: could not create pipe for background process: %s\n"
+msgstr "%s: nie udało się utworzyć rury do procesu w tle: %s\n"
+
+#: pg_basebackup.c:600 pg_basebackup.c:656 pg_basebackup.c:1414
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "%s: nie można utworzyć katalogu \"%s\": %s\n"
+
+#: pg_basebackup.c:619
+#, c-format
+msgid "%s: could not create background process: %s\n"
+msgstr "%s: nie udało się utworzenie procesu w tle: %s\n"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "%s: could not create background thread: %s\n"
+msgstr "%s: nie udało się utworzenie wątku w tle: %s\n"
+
+#: pg_basebackup.c:679
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "%s: folder \"%s\" nie jest pusty\n"
+
+#: pg_basebackup.c:687
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: brak dostępu do katalogu \"%s\": %s\n"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d przestrzeń tabel %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d przestrzenie tabel %*s"
+msgstr[2] "%*s/%s kB (100%%), %d/%d przestrzeni tabel %*s"
+
+#: pg_basebackup.c:761
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d przestrzeń tabel (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d przestrzenie tabel (%s%-*.*s)"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d przestrzeni tabel (%s%-*.*s)"
+
+#: pg_basebackup.c:777
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d przestrzeń tabel"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d przestrzenie tabel"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d przestrzeni tabel"
+
+#: pg_basebackup.c:799
+#, c-format
+msgid "%s: transfer rate \"%s\" is not a valid value\n"
+msgstr "%s: szybkość transferu \"%s\" nie jest poprawną wartością\n"
+
+#: pg_basebackup.c:806
+#, c-format
+msgid "%s: invalid transfer rate \"%s\": %s\n"
+msgstr "%s: błędna szybkość transferu \"%s\": %s\n"
+
+#: pg_basebackup.c:816
+#, c-format
+msgid "%s: transfer rate must be greater than zero\n"
+msgstr "%s: szybkość transferu musi być większa niż zero\n"
+
+#: pg_basebackup.c:850
+#, c-format
+msgid "%s: invalid --max-rate unit: \"%s\"\n"
+msgstr "%s: niepoprawna jednostka --max-rate: \"%s\"\n"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%s: transfer rate \"%s\" exceeds integer range\n"
+msgstr "%s: szybkość transferu \"%s\" jest spoza zakresu typu integer\n"
+
+#: pg_basebackup.c:871
+#, c-format
+msgid "%s: transfer rate \"%s\" is out of range\n"
+msgstr "%s: szybkość transferu \"%s\" jest spoza zakresu\n"
+
+#: pg_basebackup.c:895
+#, c-format
+msgid "%s: could not write to compressed file \"%s\": %s\n"
+msgstr "%s: nie można pisać do spakowanego pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:905 pg_basebackup.c:1508 pg_basebackup.c:1674
+#, c-format
+msgid "%s: could not write to file \"%s\": %s\n"
+msgstr "%s: nie można pisać do pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:960 pg_basebackup.c:981 pg_basebackup.c:1009
+#, c-format
+msgid "%s: could not set compression level %d: %s\n"
+msgstr "%s: nie można ustawić poziomu kompresji %d: %s\n"
+
+#: pg_basebackup.c:1030
+#, c-format
+msgid "%s: could not create compressed file \"%s\": %s\n"
+msgstr "%s: nie można utworzyć spakowanego pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:1041 pg_basebackup.c:1468 pg_basebackup.c:1667
+#, c-format
+msgid "%s: could not create file \"%s\": %s\n"
+msgstr "%s: nie można utworzyć pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:1053 pg_basebackup.c:1321
+#, c-format
+msgid "%s: could not get COPY data stream: %s"
+msgstr "%s: nie można pobrać strumienia danych COPY: %s"
+
+#: pg_basebackup.c:1110
+#, c-format
+msgid "%s: could not close compressed file \"%s\": %s\n"
+msgstr "%s: nie można zamknąć spakowanego pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:1123 pg_recvlogical.c:631 receivelog.c:217 receivelog.c:302
+#: receivelog.c:701
+#, c-format
+msgid "%s: could not close file \"%s\": %s\n"
+msgstr "%s: nie można zamknąć pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:1134 pg_basebackup.c:1350 pg_recvlogical.c:453
+#: receivelog.c:982
+#, c-format
+msgid "%s: could not read COPY data: %s"
+msgstr "%s: nie można odczytać danych COPY: %s"
+
+#: pg_basebackup.c:1364
+#, c-format
+msgid "%s: invalid tar block header size: %d\n"
+msgstr "%s: nieprawidłowy rozmiar nagłówka bloku tar: %d\n"
+
+#: pg_basebackup.c:1422
+#, c-format
+msgid "%s: could not set permissions on directory \"%s\": %s\n"
+msgstr "%s: nie można ustawić uprawnień do folderu \"%s\": %s\n"
+
+#: pg_basebackup.c:1446
+#, c-format
+msgid "%s: could not create symbolic link from \"%s\" to \"%s\": %s\n"
+msgstr "%s: nie można utworzyć linku symbolicznego dla \"%s\" na \"%s\": %s\n"
+
+#: pg_basebackup.c:1455
+#, c-format
+msgid "%s: unrecognized link indicator \"%c\"\n"
+msgstr "%s: nierozpoznany wskaźnik linku \"%c\"\n"
+
+#: pg_basebackup.c:1475
+#, c-format
+msgid "%s: could not set permissions on file \"%s\": %s\n"
+msgstr "%s: nie można ustawić uprawnień do pliku \"%s\": %s\n"
+
+#: pg_basebackup.c:1534
+#, c-format
+msgid "%s: COPY stream ended before last file was finished\n"
+msgstr "%s: strumień COPY zakończony zanim skończył się ostatni plik\n"
+
+#: pg_basebackup.c:1562 pg_basebackup.c:1582 pg_basebackup.c:1589
+#: pg_basebackup.c:1642
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: brak pamięci\n"
+
+#: pg_basebackup.c:1715
+#, c-format
+msgid "%s: incompatible server version %s\n"
+msgstr "%s: niezgodna wersja serwera %s\n"
+
+#: pg_basebackup.c:1730
+#, c-format
+msgid "HINT: use -X none or -X fetch to disable log streaming\n"
+msgstr "WSKAZÓWKA: użyj -X none albo -X fetch by zablokować zapis do dziennika\n"
+
+#: pg_basebackup.c:1756
+#, c-format
+msgid "%s: initiating base backup, waiting for checkpoint to complete\n"
+msgstr "%s: inicjowanie kopii zapasowej bazy, oczekiwanie na utworzenie punktu "
+"kontrolnego\n"
+
+#: pg_basebackup.c:1774 pg_recvlogical.c:270 receivelog.c:479 receivelog.c:550
+#: receivelog.c:590 streamutil.c:255 streamutil.c:359 streamutil.c:405
+#, c-format
+msgid "%s: could not send replication command \"%s\": %s"
+msgstr "%s: nie można wysłać komendy replikacji \"%s\": %s"
+
+#: pg_basebackup.c:1785
+#, c-format
+msgid "%s: could not initiate base backup: %s"
+msgstr "%s: nie można zainicjować kopii zapasowej bazy: %s"
+
+#: pg_basebackup.c:1792
+#, c-format
+msgid "%s: server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: serwer zwrócił nieoczekiwaną odpowiedź na polecenie BASE_BACKUP; jest %d "
+"wierszy i %d pól, oczekiwano %d wierszy i %d pól\n"
+
+#: pg_basebackup.c:1800
+#, c-format
+msgid "%s: checkpoint completed\n"
+msgstr "%s: utworzono punkt kontrolny\n"
+
+#: pg_basebackup.c:1815
+#, c-format
+msgid "%s: transaction log start point: %s on timeline %u\n"
+msgstr "%s: punkt poczÄ…tkowy dziennika transakcji: %s na linii czasu %u\n"
+
+#: pg_basebackup.c:1824
+#, c-format
+msgid "%s: could not get backup header: %s"
+msgstr "%s: nie można pobrać nagłówka kopii zapasowej: %s"
+
+#: pg_basebackup.c:1830
+#, c-format
+msgid "%s: no data returned from server\n"
+msgstr "%s: nie zwrócono żadnych danych z serwera\n"
+
+#: pg_basebackup.c:1862
+#, c-format
+msgid "%s: can only write single tablespace to stdout, database has %d\n"
+msgstr "%s: można zapisać tylko pojedynczą przestrzeń tabel do stdout, baza danych "
+"ma %d\n"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "%s: starting background WAL receiver\n"
+msgstr "%s: uruchamianie odbiornika WAL w tle\n"
+
+#: pg_basebackup.c:1905
+#, c-format
+msgid "%s: could not get transaction log end position from server: %s"
+msgstr "%s: nie można pobrać pozycji końca dziennika transakcji z serwera: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "%s: no transaction log end position returned from server\n"
+msgstr "%s: nie zwrócono pozycji końca dziennika transakcji z serwera\n"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "%s: transaction log end point: %s\n"
+msgstr "%s: pozycja końca dziennika transakcji: %s\n"
+
+#: pg_basebackup.c:1924
+#, c-format
+msgid "%s: final receive failed: %s"
+msgstr "%s: ostateczne pobieranie nie powiodło się: %s"
+
+#: pg_basebackup.c:1948
+#, c-format
+msgid "%s: waiting for background process to finish streaming ...\n"
+msgstr "%s: oczekiwanie na zakończenie transmisji strumieniowej przez proces w tle "
+"...\n"
+
+#: pg_basebackup.c:1954
+#, c-format
+msgid "%s: could not send command to background pipe: %s\n"
+msgstr "%s: nie udało się przesyłanie polecenia do rury w tle: %s\n"
+
+#: pg_basebackup.c:1963
+#, c-format
+msgid "%s: could not wait for child process: %s\n"
+msgstr "%s: nie można czekać na proces potomny: %s\n"
+
+#: pg_basebackup.c:1969
+#, c-format
+msgid "%s: child %d died, expected %d\n"
+msgstr "%s: zginÄ…Å‚ potomek %d, oczekiwano %d\n"
+
+#: pg_basebackup.c:1975
+#, c-format
+msgid "%s: child process did not exit normally\n"
+msgstr "%s: proces potomny nie zakończył poprawnie działania\n"
+
+#: pg_basebackup.c:1981
+#, c-format
+msgid "%s: child process exited with error %d\n"
+msgstr "%s: proces potomny zakończył działanie z błędem %d\n"
+
+#: pg_basebackup.c:2008
+#, c-format
+msgid "%s: could not wait for child thread: %s\n"
+msgstr "%s: nie można czekać na wątek potomny: %s\n"
+
+#: pg_basebackup.c:2015
+#, c-format
+msgid "%s: could not get child thread exit status: %s\n"
+msgstr "%s: nie można pobrać statusu wyjścia wątku potomnego: %s\n"
+
+#: pg_basebackup.c:2021
+#, c-format
+msgid "%s: child thread exited with error %u\n"
+msgstr "%s: wątek potomny zakończył działanie z błędem %u\n"
+
+#: pg_basebackup.c:2059
+#, c-format
+msgid "%s: base backup completed\n"
+msgstr "%s: kopia zapasowa bazy utworzona\n"
+
+#: pg_basebackup.c:2136
+#, c-format
+msgid "%s: invalid output format \"%s\", must be \"plain\" or \"tar\"\n"
+msgstr "%s: niepoprawny format wyjścia \"%s\", musi być \"plain\" lub \"tar\"\n"
+
+#: pg_basebackup.c:2181
+#, c-format
+msgid "%s: invalid wal-method option \"%s\", must be \"fetch\", \"stream\" or \"none\"\n"
+msgstr "%s: niepoprawna opcja wal-method \"%s\", musi być \"fetch\", \"stream\" albo "
+"\"none\"\n"
+
+#: pg_basebackup.c:2209 pg_receivewal.c:555
+#, c-format
+msgid "%s: invalid compression level \"%s\"\n"
+msgstr "%s: niepoprawny poziom kompresji \"%s\"\n"
+
+#: pg_basebackup.c:2221
+#, c-format
+msgid "%s: invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"\n"
+msgstr "%s: niepoprawny argument checkpoint \"%s\", musi być \"fast\" lub \"spread\"\n"
+
+#: pg_basebackup.c:2248 pg_receivewal.c:537 pg_recvlogical.c:825
+#, c-format
+msgid "%s: invalid status interval \"%s\"\n"
+msgstr "%s: niepoprawny interwał stanu \"%s\"\n"
+
+#: pg_basebackup.c:2264 pg_basebackup.c:2278 pg_basebackup.c:2289
+#: pg_basebackup.c:2302 pg_basebackup.c:2312 pg_basebackup.c:2322
+#: pg_basebackup.c:2334 pg_basebackup.c:2348 pg_basebackup.c:2359
+#: pg_receivewal.c:578 pg_receivewal.c:592 pg_receivewal.c:600
+#: pg_receivewal.c:610 pg_receivewal.c:621 pg_recvlogical.c:852
+#: pg_recvlogical.c:866 pg_recvlogical.c:877 pg_recvlogical.c:885
+#: pg_recvlogical.c:893 pg_recvlogical.c:901 pg_recvlogical.c:909
+#: pg_recvlogical.c:917 pg_recvlogical.c:927
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_basebackup.c:2276 pg_receivewal.c:590 pg_recvlogical.c:864
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_basebackup.c:2288 pg_receivewal.c:620
+#, c-format
+msgid "%s: no target directory specified\n"
+msgstr "%s: nie wskazano folderu docelowego\n"
+
+#: pg_basebackup.c:2300
+#, c-format
+msgid "%s: only tar mode backups can be compressed\n"
+msgstr "%s: tylko kopie zapasowe w trybie tar mogą być spakowane\n"
+
+#: pg_basebackup.c:2310
+#, c-format
+msgid "%s: cannot stream transaction logs in tar mode to stdout\n"
+msgstr "%s: nie można strumieniować dziennika transakcji w trybie tar na standardowe "
+"wyjście\n"
+
+#: pg_basebackup.c:2320
+#, c-format
+msgid "%s: replication slots can only be used with WAL streaming\n"
+msgstr "%s: gniazda replikacji mogą być użyte tylko ze strumieniowaniem WAL\n"
+
+#: pg_basebackup.c:2332
+#, c-format
+msgid "%s: --no-slot cannot be used with slot name\n"
+msgstr "%s: --no-slot nie może być użyta z nazwą gniazda\n"
+
+#: pg_basebackup.c:2346
+#, c-format
+msgid "%s: transaction log directory location can only be specified in plain mode\n"
+msgstr "%s: położenie folderu dziennika transakcji może być wskazana tylko w trybie "
+"tekstowym\n"
+
+#: pg_basebackup.c:2357
+#, c-format
+msgid "%s: transaction log directory location must be an absolute path\n"
+msgstr "%s: położenie folderu dziennika transakcji musi być ścieżką bezwzględną\n"
+
+#: pg_basebackup.c:2369 pg_receivewal.c:630
+#, c-format
+msgid "%s: this build does not support compression\n"
+msgstr "%s: ta kompilacja nie obsługuje kompresji\n"
+
+#: pg_basebackup.c:2409
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "%s: nie można utworzyć linku symbolicznego \"%s\": %s\n"
+
+#: pg_basebackup.c:2414
+#, c-format
+msgid "%s: symlinks are not supported on this platform\n"
+msgstr "%s: linki symb. nie są obsługiwane na tej platformie\n"
+
+#: pg_receivewal.c:74
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming transaction logs.\n"
+"\n"
+msgstr ""
+"%s odbiera logi strumieniowania transakcji PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:78 pg_recvlogical.c:83
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcje:\n"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid " -D, --directory=DIR receive transaction log files into this directory\n"
+msgstr " -D, --directory=FOLDER odbiera pliki dziennika do tego katalogu\n"
+
+#: pg_receivewal.c:80 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists nie pokazuj błędu gdy gniazdo już istnieje podczas "
+"tworzenia gniazda\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:90
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --noloop nie wchodzi w pętlę po stracie połączenia\n"
+
+#: pg_receivewal.c:82 pg_recvlogical.c:95
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEKUNDY\n"
+" czas pomiędzy wysłaniami pakietów stanu na serwer "
+"(domyślnie %d)\n"
+
+#: pg_receivewal.c:85
+#, c-format
+msgid " --synchronous flush transaction log immediately after writing\n"
+msgstr " --synchronous czyść dziennik transakcji bezpośrednio po zapisie\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+msgstr " -Z, --compress=0-9 pakuje dziennik z określonym poziomem kompresji\n"
+
+#: pg_receivewal.c:97
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Akcje opcjonalne:\n"
+
+#: pg_receivewal.c:98 pg_recvlogical.c:80
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot tworzy nowe gniazdo replikacji (nazwa gniazda "
+"patrz --slot)\n"
+
+#: pg_receivewal.c:99 pg_recvlogical.c:81
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot usuwa gniazdo replikacji (nazwa gniazda patrz "
+"--slot)\n"
+
+#: pg_receivewal.c:111
+#, c-format
+msgid "%s: finished segment at %X/%X (timeline %u)\n"
+msgstr "%s: zakończono segment na %X/%X (oś czasu %u)\n"
+
+#: pg_receivewal.c:124
+#, c-format
+msgid "%s: switched to timeline %u at %X/%X\n"
+msgstr "%s: przełączono na linię czasu %u na %X/%X\n"
+
+#: pg_receivewal.c:133
+#, c-format
+msgid "%s: received interrupt signal, exiting\n"
+msgstr "%s: odebrano sygnał przerwania, wyjście\n"
+
+#: pg_receivewal.c:171
+#, c-format
+msgid "%s: could not close directory \"%s\": %s\n"
+msgstr "%s: nie można zamknąć katalogu \"%s\": %s\n"
+
+#: pg_receivewal.c:260
+#, c-format
+msgid "%s: segment file \"%s\" has incorrect size %d, skipping\n"
+msgstr "%s: plik segmentu \"%s\" ma niepoprawny rozmiar %d, pominięto\n"
+
+#: pg_receivewal.c:277
+#, c-format
+msgid "%s: could not open compressed file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć spakowanego pliku \"%s\": %s\n"
+
+#: pg_receivewal.c:283
+#, c-format
+msgid "%s: could not seek compressed file \"%s\": %s\n"
+msgstr "%s: nie można pozycjonować spakowanego pliku \"%s\": %s\n"
+
+#: pg_receivewal.c:289
+#, c-format
+msgid "%s: could not read compressed file \"%s\": %s\n"
+msgstr "%s: nie można czytać ze spakowanego pliku \"%s\": %s\n"
+
+#: pg_receivewal.c:301
+#, c-format
+msgid "%s: compressed segment file \"%s\" has incorrect uncompressed size %d, skipping\n"
+msgstr "%s: spakowany plik segmentu \"%s\" ma niepoprawny rozmiar po rozpakowaniu %d, "
+"pominięto\n"
+
+#: pg_receivewal.c:407
+#, c-format
+msgid "%s: starting log streaming at %X/%X (timeline %u)\n"
+msgstr "%s: rozpoczęto przesyłanie dziennika na %X/%X (oś czasu %u)\n"
+
+#: pg_receivewal.c:518 pg_recvlogical.c:762
+#, c-format
+msgid "%s: invalid port number \"%s\"\n"
+msgstr "%s: nieprawidłowy numer portu \"%s\"\n"
+
+#: pg_receivewal.c:599
+#, c-format
+msgid "%s: cannot use --create-slot together with --drop-slot\n"
+msgstr "%s: nie można użyć --create-slot razem z --drop-slot\n"
+
+#. translator: second %s is an option name
+#: pg_receivewal.c:608
+#, c-format
+msgid "%s: %s needs a slot to be specified using --slot\n"
+msgstr "%s: %s wymaga wskazania gniazda przy użyciu --slot\n"
+
+#: pg_receivewal.c:673
+#, c-format
+msgid "%s: replication connection using slot \"%s\" is unexpectedly database specific\n"
+msgstr "%s: połączenie replikacji używające gniazda \"%s\" jest nieoczekiwanie "
+"specyficzny dla bazy danych\n"
+
+#: pg_receivewal.c:685 pg_recvlogical.c:967
+#, c-format
+msgid "%s: dropping replication slot \"%s\"\n"
+msgstr "%s: kasowanie gniazda replikacji \"%s\"\n"
+
+#: pg_receivewal.c:698 pg_recvlogical.c:979
+#, c-format
+msgid "%s: creating replication slot \"%s\"\n"
+msgstr "%s: tworzenie gniazda replikacji \"%s\"\n"
+
+#: pg_receivewal.c:725 pg_recvlogical.c:1005
+#, c-format
+msgid "%s: disconnected\n"
+msgstr "%s: rozłączono\n"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:732 pg_recvlogical.c:1012
+#, c-format
+msgid "%s: disconnected; waiting %d seconds to try again\n"
+msgstr "%s: rozłączono; czekam %d sekund i ponawiam próbę\n"
+
+#: pg_recvlogical.c:75
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s kontroluje dekodujÄ…ce strumienie logiczne PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:79
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Akcja do wykonania:\n"
+
+#: pg_recvlogical.c:82
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start rozpoczyna przesyłanie na gnieździe replikacji "
+"(nazwa gniazda patrz --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=NAZWAPLIKU nazwa pliku lub folderu wyjścia logów, - do "
+"standardowego strumienia\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F, --fsync-interval=SEKUNDY\n"
+" czas pomiędzy fsyncami do pliku wyjścia "
+"(domyślnie: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN gdzie w istniejącym gnieździe strumień powinien "
+"się zacząć\n"
+
+#: pg_recvlogical.c:89
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN wychodzi po otrzymaniu wskazanego LSN\n"
+
+#: pg_recvlogical.c:91
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAZWA[=WARTOŚĆ]\n"
+" przekazuje opcję NAZWA o opcjonalnej wartości "
+"WARTOŚĆ, \n"
+" do wtyczki wyjścia\n"
+
+#: pg_recvlogical.c:94
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=WTYCZKA użyj wtyczki wyjścia WTYCZKA (domyślnie: %s)\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME nazwa logicznego gniazda replikacji\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=NAZWADB baza danych do połączenia\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "%s: confirming write up to %X/%X, flush to %X/%X (slot %s)\n"
+msgstr "%s: potwierdzenie zapisu aż do %X/%X, zrzut do %X/%X (gniazdo %s)\n"
+
+#: pg_recvlogical.c:160 receivelog.c:345
+#, c-format
+msgid "%s: could not send feedback packet: %s"
+msgstr "%s: nie można wysłać pakietu zwrotnego: %s"
+
+#: pg_recvlogical.c:199
+#, c-format
+msgid "%s: could not fsync log file \"%s\": %s\n"
+msgstr "%s: nie można wykonać fsync na pliku dziennika \"%s\": %s\n"
+
+#: pg_recvlogical.c:238
+#, c-format
+msgid "%s: starting log streaming at %X/%X (slot %s)\n"
+msgstr "%s: rozpoczęto przesyłanie dziennika na %X/%X (gniazdo %s)\n"
+
+#: pg_recvlogical.c:280
+#, c-format
+msgid "%s: streaming initiated\n"
+msgstr "%s: uruchomiono przepływ\n"
+
+#: pg_recvlogical.c:346
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku logów \"%s\": %s\n"
+
+#: pg_recvlogical.c:376 receivelog.c:896
+#, c-format
+msgid "%s: invalid socket: %s"
+msgstr "%s: niepoprawne gniazdo: %s"
+
+#: pg_recvlogical.c:430 receivelog.c:918
+#, c-format
+msgid "%s: select() failed: %s\n"
+msgstr "%s: select() nie powiodła się: %s\n"
+
+#: pg_recvlogical.c:439 receivelog.c:968
+#, c-format
+msgid "%s: could not receive data from WAL stream: %s"
+msgstr "%s: nie można otrzymać danych ze strumienia WAL: %s"
+
+#: pg_recvlogical.c:481 pg_recvlogical.c:533 receivelog.c:1013
+#: receivelog.c:1080
+#, c-format
+msgid "%s: streaming header too small: %d\n"
+msgstr "%s: nagłówek strumienia jest za krótki: %d\n"
+
+#: pg_recvlogical.c:517 receivelog.c:861
+#, c-format
+msgid "%s: unrecognized streaming header: \"%c\"\n"
+msgstr "%s: nierozpoznany nagłówek strumienia: \"%c\"\n"
+
+#: pg_recvlogical.c:573 pg_recvlogical.c:587
+#, c-format
+msgid "%s: could not write %u bytes to log file \"%s\": %s\n"
+msgstr "%s: nie można pisać %u bajtów do pliku dziennika \"%s\": %s\n"
+
+#: pg_recvlogical.c:617 receivelog.c:654 receivelog.c:692
+#, c-format
+msgid "%s: unexpected termination of replication stream: %s"
+msgstr "%s: nieoczekiwane zakończenie strumienia replikacji: %s"
+
+#: pg_recvlogical.c:741
+#, c-format
+msgid "%s: invalid fsync interval \"%s\"\n"
+msgstr "%s: niepoprawny interwał fsync \"%s\"\n"
+
+#: pg_recvlogical.c:782
+#, c-format
+msgid "%s: could not parse start position \"%s\"\n"
+msgstr "%s: nie można odczytać pozycji początkowej \"%s\"\n"
+
+#: pg_recvlogical.c:792
+#, c-format
+msgid "%s: could not parse end position \"%s\"\n"
+msgstr "%s: nie można odczytać pozycji końcowej \"%s\"\n"
+
+#: pg_recvlogical.c:876
+#, c-format
+msgid "%s: no slot specified\n"
+msgstr "%s: nie wskazano gniazda\n"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "%s: no target file specified\n"
+msgstr "%s: nie wskazano pliku docelowego\n"
+
+#: pg_recvlogical.c:892
+#, c-format
+msgid "%s: no database specified\n"
+msgstr "%s: nie wskazano bazy danych\n"
+
+#: pg_recvlogical.c:900
+#, c-format
+msgid "%s: at least one action needs to be specified\n"
+msgstr "%s: wymagane wskazanie co najmniej jednej akcji\n"
+
+#: pg_recvlogical.c:908
+#, c-format
+msgid "%s: cannot use --create-slot or --start together with --drop-slot\n"
+msgstr "%s: nie można użyć --create-slot ani --start razem z --drop-slot\n"
+
+#: pg_recvlogical.c:916
+#, c-format
+msgid "%s: cannot use --create-slot or --drop-slot together with --startpos\n"
+msgstr "%s: nie można użyć --create-slot ani --drop-slot razem ze --startpost\n"
+
+#: pg_recvlogical.c:925
+#, c-format
+msgid "%s: --endpos may only be specified with --start\n"
+msgstr "%s: --endpos może być użyta tylko ze --start\n"
+
+#: pg_recvlogical.c:957
+#, c-format
+msgid "%s: could not establish database-specific replication connection\n"
+msgstr "%s: nie można ustanowić specyficznego dla bazy danych połączenia replikacji\n"
+
+#: receivelog.c:70
+#, c-format
+msgid "%s: could not create archive status file \"%s\": %s\n"
+msgstr "%s: nie można utworzyć pliku stanu archiwum \"%s\": %s\n"
+
+#: receivelog.c:118
+#, c-format
+msgid "%s: could not get size of transaction log file \"%s\": %s\n"
+msgstr "%s: nie można uzyskać rozmiaru pliku dziennika transakcji \"%s\": %s\n"
+
+#: receivelog.c:129
+#, c-format
+msgid "%s: could not open existing transaction log file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć istniejącego pliku dziennika transakcji \"%s\": %s\n"
+
+#: receivelog.c:150
+#, c-format
+msgid "%s: transaction log file \"%s\" has %d bytes, should be 0 or %d\n"
+msgstr "%s: plik dziennika transakcji \"%s\" ma %d bajtów, powinno być 0 lub %d\n"
+
+#: receivelog.c:163
+#, c-format
+msgid "%s: could not open transaction log file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku dziennika transakcji \"%s\": %s\n"
+
+#: receivelog.c:190
+#, c-format
+msgid "%s: could not determine seek position in file \"%s\": %s\n"
+msgstr "%s: nie można określić pozycji przesunięcia w pliku \"%s\": %s\n"
+
+#: receivelog.c:205
+#, c-format
+msgid "%s: not renaming \"%s%s\", segment is not complete\n"
+msgstr "%s: nie będzie wykonana zmiana nazwy \"%s%s\", segment nie jest zakończony\n"
+
+#: receivelog.c:274
+#, c-format
+msgid "%s: server reported unexpected history file name for timeline %u: %s\n"
+msgstr "%s: serwer zgłosił nieoczekiwaną nazwę pliku historii dla linii czasu %u: %s\n"
+
+#: receivelog.c:282
+#, c-format
+msgid "%s: could not create timeline history file \"%s\": %s\n"
+msgstr "%s: nie można utworzyć pliku historii linii czasu \"%s\": %s\n"
+
+#: receivelog.c:289
+#, c-format
+msgid "%s: could not write timeline history file \"%s\": %s\n"
+msgstr "%s: nie można pisać do pliku historii linii czasu \"%s\": %s\n"
+
+#: receivelog.c:379
+#, c-format
+msgid "%s: incompatible server version %s; client does not support streaming from server versions older than %s\n"
+msgstr "%s: niezgodna wersja serwera %s; klient nie obsługuje transmisji "
+"strumieniowej z wersji serwera starszych niż %s\n"
+
+#: receivelog.c:389
+#, c-format
+msgid "%s: incompatible server version %s; client does not support streaming from server versions newer than %s\n"
+msgstr "%s: niezgodna wersja serwera %s; klient nie obsługuje transmisji "
+"strumieniowej z wersji serwera nowszych niż %s\n"
+
+#: receivelog.c:487 streamutil.c:264 streamutil.c:303
+#, c-format
+msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+msgstr "%s: nie można określić systemu: jest %d wierszy i %d pól, oczekiwano %d "
+"wierszy i %d lub więcej pól\n"
+
+#: receivelog.c:495
+#, c-format
+msgid "%s: system identifier does not match between base backup and streaming connection\n"
+msgstr "%s: identyfikator systemu różni się pomiędzy bazową kopią zapasową i "
+"połączeniem strumieniowym\n"
+
+#: receivelog.c:503
+#, c-format
+msgid "%s: starting timeline %u is not present in the server\n"
+msgstr "%s: brak poczÄ…tkowej linii czasu %u na serwerze\n"
+
+#: receivelog.c:522
+#, c-format
+msgid "%s: could not create temporary replication slot \"%s\": %s"
+msgstr "%s: nie można utworzyć tymczasowego gniazda replikacji \"%s\": %s"
+
+#: receivelog.c:563
+#, c-format
+msgid "%s: unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: nieoczekiwana odpowiedź na polecenie TIMELINE_HISTORY: jest %d wierszy i "
+"%d pól, oczekiwano %d wierszy i %d pól\n"
+
+#: receivelog.c:635
+#, c-format
+msgid "%s: server reported unexpected next timeline %u, following timeline %u\n"
+msgstr "%s: serwer zgłosił nieoczekiwaną kolejną linię czasu %u, za linią %u\n"
+
+#: receivelog.c:642
+#, c-format
+msgid "%s: server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X\n"
+msgstr "%s: serwer zakończył przepływ linii czasu %u na %X/%X, ale zgłosił kolejną "
+"liniÄ™ czasu %u o poczÄ…tku %X/%X\n"
+
+#: receivelog.c:683
+#, c-format
+msgid "%s: replication stream was terminated before stop point\n"
+msgstr "%s: strumień replikacji zakończył się przed punktem zatrzymania\n"
+
+#: receivelog.c:732
+#, c-format
+msgid "%s: unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: nieoczekiwany zestaw wyników po end-of-timeline: jest %d wierszy i %d "
+"pól, oczekiwano %d wierszy i %d pól\n"
+
+#: receivelog.c:742
+#, c-format
+msgid "%s: could not parse next timeline's starting point \"%s\"\n"
+msgstr "%s: nie można sparsować początku następnej linii czasu \"%s\"\n"
+
+#: receivelog.c:1099
+#, c-format
+msgid "%s: received transaction log record for offset %u with no file open\n"
+msgstr "%s: otrzymano rekord dziennika transakcji dla przesunięcia %u bez otwartego "
+"pliku\n"
+
+#: receivelog.c:1110
+#, c-format
+msgid "%s: got WAL data offset %08x, expected %08x\n"
+msgstr "%s: otrzymano przesunięcie danych WAL %08x, oczekiwano %08x\n"
+
+#: receivelog.c:1145
+#, c-format
+msgid "%s: could not write %u bytes to WAL file \"%s\": %s\n"
+msgstr "%s: nie można pisać %u bajtów do pliku WAL \"%s\": %s\n"
+
+#: receivelog.c:1170 receivelog.c:1211 receivelog.c:1242
+#, c-format
+msgid "%s: could not send copy-end packet: %s"
+msgstr "%s: nie można wysłać pakietu końca kopii: %s"
+
+#: streamutil.c:148
+msgid "Password: "
+msgstr "Hasło: "
+
+#: streamutil.c:173
+#, c-format
+msgid "%s: could not connect to server\n"
+msgstr "%s: nie można połączyć z serwerem\n"
+
+#: streamutil.c:191
+#, c-format
+msgid "%s: could not connect to server: %s"
+msgstr "%s: nie można połączyć z serwerem: %s"
+
+#: streamutil.c:215
+#, c-format
+msgid "%s: could not determine server setting for integer_datetimes\n"
+msgstr "%s: nie można ustalić ustawienia serwera dla integer_datetimes\n"
+
+#: streamutil.c:224
+#, c-format
+msgid "%s: integer_datetimes compile flag does not match server\n"
+msgstr "%s: flaga kompilacji integer_datetimes nie jest zgodna z serwerem\n"
+
+#: streamutil.c:371
+#, c-format
+msgid "%s: could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: nie można utworzyć gniazda replikacji \"%s\": jest %d wierszy i %d pól, "
+"oczekiwano %d wierszy i %d pól\n"
+
+#: streamutil.c:416
+#, c-format
+msgid "%s: could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: nie można skasować gniazda replikacji \"%s\": jest %d wierszy i %d pól, "
+"oczekiwano %d wierszy i %d pól\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s: nie można odczytać rozmiaru pliku\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s: nie można odczytać trybu pliku\n"
+
+#~ msgid "%s: socket not open"
+#~ msgstr "%s: gniazdo nie jest otwarte"
+
+#~ msgid "%s: could not open timeline history file \"%s\": %s\n"
+#~ msgstr "%s: nie można otworzyć pliku historii linii czasu \"%s\": %s\n"
+
+#~ msgid "%s: could not rename file \"%s\": %s\n"
+#~ msgstr "%s: nie udało się zmienić nazwy pliku \"%s\": %s\n"
+
+#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n"
+#~ msgstr "%s: nie można przejść do początku pliku dziennika transakcji \"%s\": %s\n"
+
+#~ msgid "%s: could not pad transaction log file \"%s\": %s\n"
+#~ msgstr "%s: nie można wykonać pad na pliku dziennika transakcji \"%s\": %s\n"
+
+#~ msgid "%s: WAL streaming can only be used in plain mode\n"
+#~ msgstr "%s: strumieniowanie WAL może być użyte tylko w trybie tekstowym\n"
+
+#~ msgid "%s: cannot specify both --xlog and --xlog-method\n"
+#~ msgstr "%s: nie można wskazać jednocześnie --xlog oraz --xlog-method\n"
+
+#~ msgid " -x, --xlog include required WAL files in backup (fetch mode)\n"
+#~ msgstr " -x, --xlog dołącza wymagane pliki WAL do kopii zapasowej (tryb pobierania)\n"
diff --git a/src/bin/pg_basebackup/po/pt_BR.po b/src/bin/pg_basebackup/po/pt_BR.po
new file mode 100644
index 0000000..60ca723
--- /dev/null
+++ b/src/bin/pg_basebackup/po/pt_BR.po
@@ -0,0 +1,1147 @@
+# Brazilian Portuguese message translation file for pg_basebackup
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Euler Taveira de Oliveira <euler@timbira.com>, 2012-2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 9.5\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2015-09-17 22:32-0300\n"
+"PO-Revision-Date: 2011-08-20 23:33-0300\n"
+"Last-Translator: Euler Taveira de Oliveira <euler@timbira.com>\n"
+"Language-Team: Brazilian Portuguese <pgbr-dev@listas.postgresql.org.br>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"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
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: pg_basebackup.c:154
+#, c-format
+msgid "%s: directory name too long\n"
+msgstr "%s: nome de diretório é muito longo\n"
+
+#: pg_basebackup.c:164
+#, c-format
+msgid "%s: multiple \"=\" signs in tablespace mapping\n"
+msgstr "%s: múltiplos sinais \"=\" em mapeamento de tablespace\n"
+
+#: pg_basebackup.c:177
+#, c-format
+msgid "%s: invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"\n"
+msgstr "%s: formato de mapeamento de tablespace \"%s\" é inválido, deve ser \"DIRANTIGO=DIRNOVO\"\n"
+
+#: pg_basebackup.c:190
+#, c-format
+msgid "%s: old directory is not an absolute path in tablespace mapping: %s\n"
+msgstr "%s: diretório antigo não é um caminho absoluto no mapeamento de tablespace: %s\n"
+
+#: pg_basebackup.c:197
+#, c-format
+msgid "%s: new directory is not an absolute path in tablespace mapping: %s\n"
+msgstr "%s: diretório novo não é um caminho absoluto no mapeamento de tablespace: %s\n"
+
+#: pg_basebackup.c:231
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s faz uma cópia de segurança base de um servidor PostgreSQL em execução.\n"
+"\n"
+
+#: pg_basebackup.c:233 pg_receivexlog.c:66 pg_recvlogical.c:69
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_basebackup.c:234 pg_receivexlog.c:67 pg_recvlogical.c:70
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPÇÃO]...\n"
+
+#: pg_basebackup.c:235
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Opções que controlam a saída:\n"
+
+#: pg_basebackup.c:236
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRETÓRIO armazena a cópia de segurança base no diretório\n"
+
+#: pg_basebackup.c:237
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t formato de saída (texto (padrão), tar)\n"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=TAXA taxa de transferência máxima para enviar diretório de dados\n"
+" (em kB/s ou utilize sufixo \"k\" ou \"M\")\n"
+
+#: pg_basebackup.c:240
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write recovery.conf after backup\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" escreve recovery.conf após cópia de segurança\n"
+
+#: pg_basebackup.c:242
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=DIRANTIGO=DIRNOVO\n"
+" realoca tablespace de DIRANTIGO para DIRNOVO\n"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid " -x, --xlog include required WAL files in backup (fetch mode)\n"
+msgstr " -x, --xlog inclui os arquivos do WAL requeridos na cópia de segurança (modo busca)\n"
+
+#: pg_basebackup.c:245
+#, c-format
+msgid ""
+" -X, --xlog-method=fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --xlog-method=fetch|stream\n"
+" inclui os arquivos do WAL requeridos na cópia de segurança\n"
+
+#: pg_basebackup.c:247
+#, c-format
+msgid " --xlogdir=XLOGDIR location for the transaction log directory\n"
+msgstr " --xlogdir=DIRXLOG local do log de transação\n"
+
+#: pg_basebackup.c:248
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip comprime saída do tar\n"
+
+#: pg_basebackup.c:249
+#, c-format
+msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr " -Z, --compress=0-9 comprime saída do tar com o nível de compressão informado\n"
+
+#: pg_basebackup.c:250
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opções gerais:\n"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" define ponto de controle rápido ou distribuído\n"
+
+#: pg_basebackup.c:253
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=RÓTULO define rótulo da cópia de segurança\n"
+
+#: pg_basebackup.c:254
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra informação de progresso\n"
+
+#: pg_basebackup.c:255 pg_receivexlog.c:76 pg_recvlogical.c:89
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose mostra mensagens de detalhe\n"
+
+#: pg_basebackup.c:256 pg_receivexlog.c:77 pg_recvlogical.c:90
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_basebackup.c:257 pg_receivexlog.c:78 pg_recvlogical.c:91
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_basebackup.c:258 pg_receivexlog.c:79 pg_recvlogical.c:92
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opções de conexão:\n"
+
+#: pg_basebackup.c:259 pg_receivexlog.c:80
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=TEXTO cadeia de caracteres de conexão\n"
+
+#: pg_basebackup.c:260 pg_receivexlog.c:81 pg_recvlogical.c:94
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: pg_basebackup.c:261 pg_receivexlog.c:82 pg_recvlogical.c:95
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORTA número da porta do servidor de banco de dados\n"
+
+#: pg_basebackup.c:262
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVALO\n"
+" tempo entre envio de pacotes de status ao servidor (em segundos)\n"
+
+#: pg_basebackup.c:264 pg_receivexlog.c:83 pg_recvlogical.c:96
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOME conecta como usuário do banco de dados especificado\n"
+
+#: pg_basebackup.c:265 pg_receivexlog.c:84 pg_recvlogical.c:97
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pergunta senha\n"
+
+#: pg_basebackup.c:266 pg_receivexlog.c:85 pg_recvlogical.c:98
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password pergunta senha (pode ocorrer automaticamente)\n"
+
+#: pg_basebackup.c:267 pg_receivexlog.c:89 pg_recvlogical.c:99
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Relate erros a <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_basebackup.c:310
+#, c-format
+msgid "%s: could not read from ready pipe: %s\n"
+msgstr "%s: não pôde ler do pipe: %s\n"
+
+#: pg_basebackup.c:318 pg_basebackup.c:411 pg_basebackup.c:1879
+#: streamutil.c:285
+#, c-format
+msgid "%s: could not parse transaction log location \"%s\"\n"
+msgstr "%s: não pôde validar local do log de transação \"%s\"\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid "%s: could not create pipe for background process: %s\n"
+msgstr "%s: não pôde criar pipe para processo em segundo plano: %s\n"
+
+#: pg_basebackup.c:449 pg_basebackup.c:504 pg_basebackup.c:1262
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "%s: não pôde criar diretório \"%s\": %s\n"
+
+#: pg_basebackup.c:467
+#, c-format
+msgid "%s: could not create background process: %s\n"
+msgstr "%s: não pôde criar processo em segundo plano: %s\n"
+
+#: pg_basebackup.c:479
+#, c-format
+msgid "%s: could not create background thread: %s\n"
+msgstr "%s: não pôde criar thread em segundo plano: %s\n"
+
+#: pg_basebackup.c:523
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "%s: diretório \"%s\" existe mas não está vazio\n"
+
+#: pg_basebackup.c:531
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: não pôde acessar diretório \"%s\": %s\n"
+
+#: pg_basebackup.c:593
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+
+#: pg_basebackup.c:605
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+
+#: pg_basebackup.c:621
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces"
+
+#: pg_basebackup.c:643
+#, c-format
+msgid "%s: transfer rate \"%s\" is not a valid value\n"
+msgstr "%s: taxa de transferência \"%s\" não é um valor válido\n"
+
+#: pg_basebackup.c:650
+#, c-format
+msgid "%s: invalid transfer rate \"%s\": %s\n"
+msgstr "%s: taxa de transferência \"%s\" é inválida: %s\n"
+
+#: pg_basebackup.c:660
+#, c-format
+msgid "%s: transfer rate must be greater than zero\n"
+msgstr "%s: taxa de transferência deve ser maior do que zero\n"
+
+#: pg_basebackup.c:694
+#, c-format
+msgid "%s: invalid --max-rate unit: \"%s\"\n"
+msgstr "%s: unidade de --max-rate é inválida: \"%s\"\n"
+
+#: pg_basebackup.c:703
+#, c-format
+msgid "%s: transfer rate \"%s\" exceeds integer range\n"
+msgstr "%s: taxa de transferência \"%s\" excede intervalo de inteiros\n"
+
+#: pg_basebackup.c:715
+#, c-format
+msgid "%s: transfer rate \"%s\" is out of range\n"
+msgstr "%s: taxa de transferência \"%s\" está fora do intervalo\n"
+
+#: pg_basebackup.c:739
+#, c-format
+msgid "%s: could not write to compressed file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo comprimido \"%s\": %s\n"
+
+#: pg_basebackup.c:749 pg_basebackup.c:1356 pg_basebackup.c:1574
+#, c-format
+msgid "%s: could not write to file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo \"%s\": %s\n"
+
+#: pg_basebackup.c:804 pg_basebackup.c:825 pg_basebackup.c:853
+#, c-format
+msgid "%s: could not set compression level %d: %s\n"
+msgstr "%s: não pôde definir nível de compressão %d: %s\n"
+
+#: pg_basebackup.c:874
+#, c-format
+msgid "%s: could not create compressed file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo comprimido \"%s\": %s\n"
+
+#: pg_basebackup.c:885 pg_basebackup.c:1316 pg_basebackup.c:1567
+#, c-format
+msgid "%s: could not create file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo \"%s\": %s\n"
+
+#: pg_basebackup.c:897 pg_basebackup.c:1161
+#, c-format
+msgid "%s: could not get COPY data stream: %s"
+msgstr "%s: não pôde obter fluxo de dados do COPY: %s"
+
+#: pg_basebackup.c:954
+#, c-format
+msgid "%s: could not close compressed file \"%s\": %s\n"
+msgstr "%s: não pôde fechar arquivo comprimido \"%s\": %s\n"
+
+#: pg_basebackup.c:967 pg_recvlogical.c:569 receivelog.c:213 receivelog.c:362
+#: receivelog.c:754
+#, c-format
+msgid "%s: could not close file \"%s\": %s\n"
+msgstr "%s: não pôde fechar arquivo \"%s\": %s\n"
+
+#: pg_basebackup.c:978 pg_basebackup.c:1190 pg_recvlogical.c:435
+#: receivelog.c:1044
+#, c-format
+msgid "%s: could not read COPY data: %s"
+msgstr "%s: não pôde ler dados do COPY: %s"
+
+#: pg_basebackup.c:1204
+#, c-format
+msgid "%s: invalid tar block header size: %d\n"
+msgstr "%s: tamanho do cabeçalho do bloco tar é inválido: %d\n"
+
+#: pg_basebackup.c:1212
+#, c-format
+msgid "%s: could not parse file size\n"
+msgstr "%s: não pôde obter tamanho do arquivo\n"
+
+#: pg_basebackup.c:1220
+#, c-format
+msgid "%s: could not parse file mode\n"
+msgstr "%s: não pôde obter modo do arquivo\n"
+
+#: pg_basebackup.c:1270
+#, c-format
+msgid "%s: could not set permissions on directory \"%s\": %s\n"
+msgstr "%s: não pôde definir permissões no diretório \"%s\": %s\n"
+
+#: pg_basebackup.c:1294
+#, c-format
+msgid "%s: could not create symbolic link from \"%s\" to \"%s\": %s\n"
+msgstr "%s: não pôde criar link simbólico de \"%s\" para \"%s\": %s\n"
+
+#: pg_basebackup.c:1303
+#, c-format
+msgid "%s: unrecognized link indicator \"%c\"\n"
+msgstr "%s: indicador de link \"%c\" desconhecido\n"
+
+#: pg_basebackup.c:1323
+#, c-format
+msgid "%s: could not set permissions on file \"%s\": %s\n"
+msgstr "%s: não pôde definir permissões no arquivo \"%s\": %s\n"
+
+#: pg_basebackup.c:1382
+#, c-format
+msgid "%s: COPY stream ended before last file was finished\n"
+msgstr "%s: fluxo do COPY terminou antes que o último arquivo estivesse completo\n"
+
+#: pg_basebackup.c:1468 pg_basebackup.c:1488 pg_basebackup.c:1495
+#: pg_basebackup.c:1542
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: sem memória\n"
+
+#: pg_basebackup.c:1619
+#, c-format
+msgid "%s: incompatible server version %s\n"
+msgstr "%s: versão do servidor %s é incompatível\n"
+
+#: pg_basebackup.c:1666 pg_recvlogical.c:261 receivelog.c:549 receivelog.c:600
+#: receivelog.c:641 streamutil.c:255 streamutil.c:353 streamutil.c:399
+#, c-format
+msgid "%s: could not send replication command \"%s\": %s"
+msgstr "%s: não pôde enviar comando de replicação \"%s\": %s"
+
+#: pg_basebackup.c:1677
+#, c-format
+msgid "%s: could not initiate base backup: %s"
+msgstr "%s: não pôde inicializar cópia de segurança base: %s"
+
+#: pg_basebackup.c:1684
+#, c-format
+msgid "%s: server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: servidor retornou resposta inesperada para comando BASE_BACKUP; recebeu %d registros e %d campos, esperado %d registros e %d campos\n"
+
+#: pg_basebackup.c:1704
+#, c-format
+msgid "transaction log start point: %s on timeline %u\n"
+msgstr "ponto de início do log de transação: %s na linha do tempo %u\n"
+
+#: pg_basebackup.c:1713
+#, c-format
+msgid "%s: could not get backup header: %s"
+msgstr "%s: não pôde obter cabeçalho da cópia de segurança: %s"
+
+#: pg_basebackup.c:1719
+#, c-format
+msgid "%s: no data returned from server\n"
+msgstr "%s: nenhum dado foi retornado do servidor\n"
+
+#: pg_basebackup.c:1751
+#, c-format
+msgid "%s: can only write single tablespace to stdout, database has %d\n"
+msgstr "%s: só pode escrever uma tablespace para saída padrão, banco de dados tem %d\n"
+
+#: pg_basebackup.c:1763
+#, c-format
+msgid "%s: starting background WAL receiver\n"
+msgstr "%s: iniciando receptor do WAL em segundo plano\n"
+
+#: pg_basebackup.c:1794
+#, c-format
+msgid "%s: could not get transaction log end position from server: %s"
+msgstr "%s: não pôde obter posição final do log de transação do servidor: %s"
+
+#: pg_basebackup.c:1801
+#, c-format
+msgid "%s: no transaction log end position returned from server\n"
+msgstr "%s: nenhuma posição final do log de transação foi retornada do servidor\n"
+
+#: pg_basebackup.c:1813
+#, c-format
+msgid "%s: final receive failed: %s"
+msgstr "%s: recepção final falhou: %s"
+
+#: pg_basebackup.c:1831
+#, c-format
+msgid "%s: waiting for background process to finish streaming ...\n"
+msgstr "%s: esperando processo em segundo plano terminar o envio ...\n"
+
+#: pg_basebackup.c:1837
+#, c-format
+msgid "%s: could not send command to background pipe: %s\n"
+msgstr "%s: não pôde enviar comando para pipe em segundo plano: %s\n"
+
+#: pg_basebackup.c:1846
+#, c-format
+msgid "%s: could not wait for child process: %s\n"
+msgstr "%s: não pôde esperar por processo filho: %s\n"
+
+#: pg_basebackup.c:1852
+#, c-format
+msgid "%s: child %d died, expected %d\n"
+msgstr "%s: processo filho %d morreu, esperado %d\n"
+
+#: pg_basebackup.c:1858
+#, c-format
+msgid "%s: child process did not exit normally\n"
+msgstr "%s: processo filho não terminou normalmente\n"
+
+#: pg_basebackup.c:1864
+#, c-format
+msgid "%s: child process exited with error %d\n"
+msgstr "%s: processo filho terminou com código de saída %d\n"
+
+#: pg_basebackup.c:1891
+#, c-format
+msgid "%s: could not wait for child thread: %s\n"
+msgstr "%s: não pôde esperar por thread filho: %s\n"
+
+#: pg_basebackup.c:1898
+#, c-format
+msgid "%s: could not get child thread exit status: %s\n"
+msgstr "%s: não pôde obter status de saída de thread filho: %s\n"
+
+#: pg_basebackup.c:1904
+#, c-format
+msgid "%s: child thread exited with error %u\n"
+msgstr "%s: thread filho terminou com erro %u\n"
+
+#: pg_basebackup.c:1993
+#, c-format
+msgid "%s: invalid output format \"%s\", must be \"plain\" or \"tar\"\n"
+msgstr "%s: formato de saída \"%s\" é inválido, deve ser \"plain\" ou \"tar\"\n"
+
+#: pg_basebackup.c:2011 pg_basebackup.c:2023
+#, c-format
+msgid "%s: cannot specify both --xlog and --xlog-method\n"
+msgstr "%s: não pode especificar ambas opções --xlog e --xlog-method\n"
+
+#: pg_basebackup.c:2038
+#, c-format
+msgid "%s: invalid xlog-method option \"%s\", must be \"fetch\" or \"stream\"\n"
+msgstr "%s: opção de xlog-method \"%s\" é inválida, deve ser \"fetch\" ou \"stream\"\n"
+
+#: pg_basebackup.c:2060
+#, c-format
+msgid "%s: invalid compression level \"%s\"\n"
+msgstr "%s: nível de compressão \"%s\" é inválido\n"
+
+#: pg_basebackup.c:2072
+#, c-format
+msgid "%s: invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"\n"
+msgstr "%s: argumento de ponto de controle \"%s\" é inválido, deve ser \"fast\" ou \"spread\"\n"
+
+#: pg_basebackup.c:2099 pg_receivexlog.c:439 pg_recvlogical.c:752
+#, c-format
+msgid "%s: invalid status interval \"%s\"\n"
+msgstr "%s: intervalo do status \"%s\" é inválido\n"
+
+#: pg_basebackup.c:2115 pg_basebackup.c:2129 pg_basebackup.c:2140
+#: pg_basebackup.c:2153 pg_basebackup.c:2163 pg_basebackup.c:2175
+#: pg_basebackup.c:2186 pg_receivexlog.c:471 pg_receivexlog.c:485
+#: pg_receivexlog.c:493 pg_receivexlog.c:503 pg_receivexlog.c:514
+#: pg_recvlogical.c:779 pg_recvlogical.c:793 pg_recvlogical.c:804
+#: pg_recvlogical.c:812 pg_recvlogical.c:820 pg_recvlogical.c:828
+#: pg_recvlogical.c:836 pg_recvlogical.c:844
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_basebackup.c:2127 pg_receivexlog.c:483 pg_recvlogical.c:791
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_basebackup.c:2139 pg_receivexlog.c:513
+#, c-format
+msgid "%s: no target directory specified\n"
+msgstr "%s: nenhum diretório de destino foi especificado\n"
+
+#: pg_basebackup.c:2151
+#, c-format
+msgid "%s: only tar mode backups can be compressed\n"
+msgstr "%s: somente cópias de segurança com modo tar podem ser comprimidas\n"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "%s: WAL streaming can only be used in plain mode\n"
+msgstr "%s: envio do WAL só pode ser utilizado no modo plain\n"
+
+#: pg_basebackup.c:2173
+#, c-format
+msgid "%s: transaction log directory location can only be specified in plain mode\n"
+msgstr "%s: diretório do log de transação só pode ser especificado no modo plain\n"
+
+#: pg_basebackup.c:2184
+#, c-format
+msgid "%s: transaction log directory location must be an absolute path\n"
+msgstr "%s: diretório do log de transação deve ter um caminho absoluto\n"
+
+#: pg_basebackup.c:2196
+#, c-format
+msgid "%s: this build does not support compression\n"
+msgstr "%s: esse programa binário não suporta compressão\n"
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "%s: não pôde criar link simbólico \"%s\": %s\n"
+
+#: pg_basebackup.c:2228
+#, c-format
+msgid "%s: symlinks are not supported on this platform\n"
+msgstr "%s: links simbólicos não são suportados nessa plataforma\n"
+
+#: pg_receivexlog.c:64
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming transaction logs.\n"
+"\n"
+msgstr ""
+"%s recebe fluxo de logs de transação do PostgreSQL.\n"
+"\n"
+
+#: pg_receivexlog.c:68 pg_recvlogical.c:75
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_receivexlog.c:69
+#, c-format
+msgid " -D, --directory=DIR receive transaction log files into this directory\n"
+msgstr " -D, --directory=DIR recebe arquivos de log de transação neste diretório\n"
+
+#: pg_receivexlog.c:70 pg_recvlogical.c:79
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists não emite erro se a entrada já existe ao criar uma entrada\n"
+
+#: pg_receivexlog.c:71 pg_recvlogical.c:81
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop não tentar novamente ao perder a conexão\n"
+
+#: pg_receivexlog.c:72 pg_recvlogical.c:86
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=INTERVALO\n"
+" tempo entre envio de pacotes de status ao servidor (padrâo: %d)\n"
+
+#: pg_receivexlog.c:74
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=NOME entrada de replicação a ser utilizada\n"
+
+#: pg_receivexlog.c:75
+#, c-format
+msgid " --synchronous flush transaction log immediately after writing\n"
+msgstr " --synchronous escreve log de transação no disco imediatamente após a escrita\n"
+
+#: pg_receivexlog.c:86
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Ações opcionais:\n"
+
+#: pg_receivexlog.c:87 pg_recvlogical.c:72
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot cria uma nova entrada de replicação (para nome da entrada veja --slot)\n"
+
+#: pg_receivexlog.c:88 pg_recvlogical.c:73
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot remove a entrada de replicação (para nome da entrada veja --slot)\n"
+
+#: pg_receivexlog.c:100
+#, c-format
+msgid "%s: finished segment at %X/%X (timeline %u)\n"
+msgstr "%s: terminou o segmento em %X/%X (linha do tempo %u)\n"
+
+#: pg_receivexlog.c:113
+#, c-format
+msgid "%s: switched to timeline %u at %X/%X\n"
+msgstr "%s: passou para linha do tempo %u em %X/%X\n"
+
+#: pg_receivexlog.c:122
+#, c-format
+msgid "%s: received interrupt signal, exiting\n"
+msgstr "%s: recebeu sinal de interrupção, terminando\n"
+
+#: pg_receivexlog.c:142
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "%s: não pôde abrir diretório \"%s\": %s\n"
+
+#: pg_receivexlog.c:160
+#, c-format
+msgid "%s: could not close directory \"%s\": %s\n"
+msgstr "%s: não pôde fechar diretório \"%s\": %s\n"
+
+#: pg_receivexlog.c:218 pg_recvlogical.c:343
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "%s: não pôde executar stat no arquivo \"%s\": %s\n"
+
+#: pg_receivexlog.c:226
+#, c-format
+msgid "%s: segment file \"%s\" has incorrect size %d, skipping\n"
+msgstr "%s: arquivo de segmento \"%s\" tem tamanho incorreto %d, ignorando\n"
+
+#: pg_receivexlog.c:245
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "%s: não pôde ler diretório \"%s\": %s\n"
+
+#: pg_receivexlog.c:331
+#, c-format
+msgid "%s: starting log streaming at %X/%X (timeline %u)\n"
+msgstr "%s: iniciando fluxo de log em %X/%X (linha do tempo %u)\n"
+
+#: pg_receivexlog.c:420 pg_recvlogical.c:699
+#, c-format
+msgid "%s: invalid port number \"%s\"\n"
+msgstr "%s: número de porta inválido: \"%s\"\n"
+
+#: pg_receivexlog.c:492
+#, c-format
+msgid "%s: cannot use --create-slot together with --drop-slot\n"
+msgstr "%s: não pode utilizar --create-slot junto com --drop-slot\n"
+
+#. translator: second %s is an option name
+#: pg_receivexlog.c:501
+#, c-format
+msgid "%s: %s needs a slot to be specified using --slot\n"
+msgstr "%s: %s precisa que uma entrada seja especificada utilizando --slot\n"
+
+#: pg_receivexlog.c:556
+#, c-format
+msgid "%s: replication connection using slot \"%s\" is unexpectedly database specific\n"
+msgstr "%s: conexão de replicação utilizando entrada \"%s\" é inesperadamente específica a um banco de dados\n"
+
+#: pg_receivexlog.c:568 pg_recvlogical.c:884
+#, c-format
+msgid "%s: dropping replication slot \"%s\"\n"
+msgstr "%s: removendo entrada de replicação \"%s\"\n"
+
+#: pg_receivexlog.c:581 pg_recvlogical.c:896
+#, c-format
+msgid "%s: creating replication slot \"%s\"\n"
+msgstr "%s: criando entrada de replicação \"%s\"\n"
+
+#: pg_receivexlog.c:608 pg_recvlogical.c:922
+#, c-format
+msgid "%s: disconnected\n"
+msgstr "%s: desconectado\n"
+
+#. translator: check source for value for %d
+#: pg_receivexlog.c:615 pg_recvlogical.c:929
+#, c-format
+msgid "%s: disconnected; waiting %d seconds to try again\n"
+msgstr "%s: desconectado; esperando %d segundos para tentar novamente\n"
+
+#: pg_recvlogical.c:67
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s controla fluxos de replicação lógica do PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:71
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Ação a ser executada:\n"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start inicia fluxo na entrada de replicação (para nome da entrada veja --slot)\n"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=ARQUIVO recebe log neste arquivo, - para saída padrão\n"
+
+#: pg_recvlogical.c:77
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F, --fsync-interval=SEGS\n"
+" tempo entre fsyncs no arquivo de saída (padrão: %d)\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN onde o fluxo deve iniciar na entrada existente\n"
+
+#: pg_recvlogical.c:82
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NOME[=VALOR]\n"
+" passa opção NOME com valor opcional VALOR para o\n"
+" plugin de saída\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN utiliza o plugin de saída PLUGIN (padrão: %s)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=NOME nome da entrada de replicação lógica\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=NOMEBD banco de dados ao qual quer se conectar\n"
+
+#: pg_recvlogical.c:126
+#, c-format
+msgid "%s: confirming write up to %X/%X, flush to %X/%X (slot %s)\n"
+msgstr "%s: confirmando escrita até %X/%X, escrita no disco até %X/%X (entrada %s)\n"
+
+#: pg_recvlogical.c:151 receivelog.c:415
+#, c-format
+msgid "%s: could not send feedback packet: %s"
+msgstr "%s: não pôde enviar pacote de retorno: %s"
+
+#: pg_recvlogical.c:190
+#, c-format
+msgid "%s: could not fsync log file \"%s\": %s\n"
+msgstr "%s: não pôde executar fsync no arquivo de log \"%s\": %s\n"
+
+#: pg_recvlogical.c:229
+#, c-format
+msgid "%s: starting log streaming at %X/%X (slot %s)\n"
+msgstr "%s: iniciando fluxo de log em %X/%X (entrada %s)\n"
+
+#: pg_recvlogical.c:271
+#, c-format
+msgid "%s: streaming initiated\n"
+msgstr "%s: fluxo iniciado\n"
+
+#: pg_recvlogical.c:336
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo de log \"%s\": %s\n"
+
+#: pg_recvlogical.c:412 receivelog.c:980
+#, c-format
+msgid "%s: select() failed: %s\n"
+msgstr "%s: select() falhou: %s\n"
+
+#: pg_recvlogical.c:421 receivelog.c:1030
+#, c-format
+msgid "%s: could not receive data from WAL stream: %s"
+msgstr "%s: não pôde receber dados do fluxo do WAL: %s"
+
+#: pg_recvlogical.c:462 pg_recvlogical.c:501 receivelog.c:1075
+#: receivelog.c:1144
+#, c-format
+msgid "%s: streaming header too small: %d\n"
+msgstr "%s: cabeçalho de fluxo muito pequeno: %d\n"
+
+#: pg_recvlogical.c:484 receivelog.c:924
+#, c-format
+msgid "%s: unrecognized streaming header: \"%c\"\n"
+msgstr "%s: cabeçalho de fluxo desconhecido: \"%c\"\n"
+
+#: pg_recvlogical.c:530 pg_recvlogical.c:544
+#, c-format
+msgid "%s: could not write %u bytes to log file \"%s\": %s\n"
+msgstr "%s: não pôde escrever %u bytes no arquivo de log \"%s\": %s\n"
+
+#: pg_recvlogical.c:555 receivelog.c:707 receivelog.c:745
+#, c-format
+msgid "%s: unexpected termination of replication stream: %s"
+msgstr "%s: término inesperado do fluxo de replicação: %s"
+
+#: pg_recvlogical.c:678
+#, c-format
+msgid "%s: invalid fsync interval \"%s\"\n"
+msgstr "%s: intervalo de fsync \"%s\" é inválido\n"
+
+#: pg_recvlogical.c:719
+#, c-format
+msgid "%s: could not parse start position \"%s\"\n"
+msgstr "%s: não pôde validar posição inicial \"%s\"\n"
+
+#: pg_recvlogical.c:803
+#, c-format
+msgid "%s: no slot specified\n"
+msgstr "%s: nenhuma entrada especificada\n"
+
+#: pg_recvlogical.c:811
+#, c-format
+msgid "%s: no target file specified\n"
+msgstr "%s: nenhum arquivo de destino foi especificado\n"
+
+#: pg_recvlogical.c:819
+#, c-format
+msgid "%s: no database specified\n"
+msgstr "%s: nenhum banco de dados especificado\n"
+
+#: pg_recvlogical.c:827
+#, c-format
+msgid "%s: at least one action needs to be specified\n"
+msgstr "%s: pelo menos uma ação precisa ser especificada\n"
+
+#: pg_recvlogical.c:835
+#, c-format
+msgid "%s: cannot use --create-slot or --start together with --drop-slot\n"
+msgstr "%s: não pode utilizar --create-slot ou --start junto com --drop-slot\n"
+
+#: pg_recvlogical.c:843
+#, c-format
+msgid "%s: cannot use --create-slot or --drop-slot together with --startpos\n"
+msgstr "%s: não pode utilizar --create-slot ou --drop-slot junto com --startpos\n"
+
+#: pg_recvlogical.c:874
+#, c-format
+msgid "%s: could not establish database-specific replication connection\n"
+msgstr "%s: não pôde estabelecer conexão de replicação a um banco de dados específico\n"
+
+#: receivelog.c:75
+#, c-format
+msgid "%s: could not create archive status file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo de status do arquivador \"%s\": %s\n"
+
+#: receivelog.c:82 receivelog.c:206 receivelog.c:355 receivelog.c:848
+#: receivelog.c:1096
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "%s: não pôde executar fsync no arquivo \"%s\": %s\n"
+
+#: receivelog.c:121
+#, c-format
+msgid "%s: could not open transaction log file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo de log de transação \"%s\": %s\n"
+
+#: receivelog.c:133
+#, c-format
+msgid "%s: could not stat transaction log file \"%s\": %s\n"
+msgstr "%s: não pôde executar stat no arquivo de log de transação \"%s\": %s\n"
+
+#: receivelog.c:147
+#, c-format
+msgid "%s: transaction log file \"%s\" has %d bytes, should be 0 or %d\n"
+msgstr "%s: arquivo de log de transação \"%s\" tem %d bytes, deveria ser 0 ou %d\n"
+
+#: receivelog.c:160
+#, c-format
+msgid "%s: could not pad transaction log file \"%s\": %s\n"
+msgstr "%s: não pôde preencher arquivo de log de transação \"%s\": %s\n"
+
+#: receivelog.c:173
+#, c-format
+msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n"
+msgstr "%s: não pôde buscar início do arquivo de log de transação \"%s\": %s\n"
+
+#: receivelog.c:199
+#, c-format
+msgid "%s: could not determine seek position in file \"%s\": %s\n"
+msgstr "%s: não pôde determinar posição de busca no arquivo \"%s\": %s\n"
+
+#: receivelog.c:232
+#, c-format
+msgid "%s: could not rename file \"%s\": %s\n"
+msgstr "%s: não pôde renomear arquivo \"%s\": %s\n"
+
+#: receivelog.c:239
+#, c-format
+msgid "%s: not renaming \"%s%s\", segment is not complete\n"
+msgstr "%s: não renomeará \"%s%s\", segmento não está completo\n"
+
+#: receivelog.c:285
+#, c-format
+msgid "%s: could not open timeline history file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo de histórico da linha do tempo \"%s\": %s\n"
+
+#: receivelog.c:313
+#, c-format
+msgid "%s: server reported unexpected history file name for timeline %u: %s\n"
+msgstr "%s: servidor relatou nome de arquivo de histórico inesperado para linha do tempo %u: %s\n"
+
+#: receivelog.c:330
+#, c-format
+msgid "%s: could not create timeline history file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo de histórico da linha do tempo \"%s\": %s\n"
+
+#: receivelog.c:347
+#, c-format
+msgid "%s: could not write timeline history file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo de histórico da linha do tempo \"%s\": %s\n"
+
+#: receivelog.c:372
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "%s: não pôde renomear arquivo \"%s\" para \"%s\": %s\n"
+
+#: receivelog.c:449
+#, c-format
+msgid "%s: incompatible server version %s; client does not support streaming from server versions older than %s\n"
+msgstr "%s: versão do servidor %s é incompatível; cliente não suporta fluxo de versões do servidor mais antigas do que %s\n"
+
+#: receivelog.c:459
+#, c-format
+msgid "%s: incompatible server version %s; client does not support streaming from server versions newer than %s\n"
+msgstr "%s: versão do servidor %s é incompatível; cliente não suporta fluxo de versões do servidor mais novas do que %s\n"
+
+#: receivelog.c:557 streamutil.c:264 streamutil.c:299
+#, c-format
+msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+msgstr "%s: não pôde identificar sistema: recebeu %d registros e %d campos, esperado %d registros e %d ou mais campos\n"
+
+#: receivelog.c:565
+#, c-format
+msgid "%s: system identifier does not match between base backup and streaming connection\n"
+msgstr "%s: identificador do sistema não corresponde entre cópia base e conexão de envio do WAL\n"
+
+#: receivelog.c:573
+#, c-format
+msgid "%s: starting timeline %u is not present in the server\n"
+msgstr "%s: linha do tempo inicial %u não está presente no servidor\n"
+
+#: receivelog.c:613
+#, c-format
+msgid "%s: unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: resposta inesperada para comando TIMELINE_HISTORY: recebeu %d registros e %d campos, esperado %d registros e %d campos\n"
+
+#: receivelog.c:688
+#, c-format
+msgid "%s: server reported unexpected next timeline %u, following timeline %u\n"
+msgstr "%s: servidor relatou próxima linha do tempo %u inesperada, seguindo linha do tempo %u\n"
+
+#: receivelog.c:695
+#, c-format
+msgid "%s: server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X\n"
+msgstr "%s: servidor parou de enviar linha do tempo %u em %X/%X, mas relatou próxima linha do tempo %u começando em %X/%X\n"
+
+#: receivelog.c:736
+#, c-format
+msgid "%s: replication stream was terminated before stop point\n"
+msgstr "%s: fluxo de replicação foi terminado antes do ponto de parada\n"
+
+#: receivelog.c:785
+#, c-format
+msgid "%s: unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: conjunto de resultados inesperado após fim da linha do tempo: recebeu %d registros e %d campos, esperado %d registros e %d campos\n"
+
+#: receivelog.c:795
+#, c-format
+msgid "%s: could not parse next timeline's starting point \"%s\"\n"
+msgstr "%s: não pôde validar ponto de partida da próxima linha do tempo \"%s\"\n"
+
+#: receivelog.c:959
+#, c-format
+msgid "%s: socket not open"
+msgstr "%s: soquete não está aberto"
+
+#: receivelog.c:1163
+#, c-format
+msgid "%s: received transaction log record for offset %u with no file open\n"
+msgstr "%s: recebeu registro do log de transação para posição %u sem um arquivo aberto\n"
+
+#: receivelog.c:1175
+#, c-format
+msgid "%s: got WAL data offset %08x, expected %08x\n"
+msgstr "%s: recebeu dados do WAL da posição %08x, esperada %08x\n"
+
+#: receivelog.c:1212
+#, c-format
+msgid "%s: could not write %u bytes to WAL file \"%s\": %s\n"
+msgstr "%s: não pôde escrever %u bytes no arquivo do WAL \"%s\": %s\n"
+
+#: receivelog.c:1237 receivelog.c:1279 receivelog.c:1311
+#, c-format
+msgid "%s: could not send copy-end packet: %s"
+msgstr "%s: não pôde enviar pacote indicando fim de cópia: %s"
+
+#: streamutil.c:145
+msgid "Password: "
+msgstr "Senha: "
+
+#: streamutil.c:169
+#, c-format
+msgid "%s: could not connect to server\n"
+msgstr "%s: não pôde se conectar ao servidor\n"
+
+#: streamutil.c:187
+#, c-format
+msgid "%s: could not connect to server: %s"
+msgstr "%s: não pôde se conectar ao servidor: %s"
+
+#: streamutil.c:211
+#, c-format
+msgid "%s: could not determine server setting for integer_datetimes\n"
+msgstr "%s: não pôde determinar valor do parâmetro integer_datetimes do servidor\n"
+
+#: streamutil.c:224
+#, c-format
+msgid "%s: integer_datetimes compile flag does not match server\n"
+msgstr "%s: opção de compilação integer_datetimes não corresponde com a do servidor\n"
+
+#: streamutil.c:365
+#, c-format
+msgid "%s: could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: não pôde criar entrada de replicação \"%s\": recebeu %d registros e %d campos, esperado %d registros e %d campos\n"
+
+#: streamutil.c:410
+#, c-format
+msgid "%s: could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"
+msgstr "%s: não pôde remover entrada de replicação \"%s\": recebeu %d registros e %d campos, esperado %d registros e %d campos\n"
diff --git a/src/bin/pg_basebackup/po/ru.po b/src/bin/pg_basebackup/po/ru.po
new file mode 100644
index 0000000..8057d72
--- /dev/null
+++ b/src/bin/pg_basebackup/po/ru.po
@@ -0,0 +1,2190 @@
+# Russian message translation file for pg_basebackup
+# Copyright (C) 2012-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 15:31+0300\n"
+"PO-Revision-Date: 2023-08-29 09:42+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "Ñта Ñборка программы не поддерживает Ñжатие %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "вмеÑто ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° пуÑÑ‚Ð°Ñ Ñтрока"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "нераÑпознанный параметр ÑжатиÑ: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть целочиÑленным"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть булевÑким"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ уровень ÑжатиÑ"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" ожидаетÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¾Ñ‚ %d до %d (по "
+"умолчанию %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ чиÑло потоков"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "алгоритм ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" не поддерживает режим большой диÑтанции"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2238 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1610
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памÑти"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1407 pg_basebackup.c:1701
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать в файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1471 pg_basebackup.c:1680
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "неожиданное ÑоÑтоÑние при извлечении архива"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:687 pg_basebackup.c:731
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "не удалоÑÑŒ уÑтановить права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\" в \"%s\": %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "не удалоÑÑŒ уÑтановить права доÑтупа Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать Ñжатый файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "не удалоÑÑŒ продублировать stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не удалоÑÑŒ открыть выходной файл: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "не удалоÑÑŒ уÑтановить уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "не удалоÑÑŒ запиÑать Ñжатый файл \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть Ñжатый файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "не удалоÑÑŒ раÑпаковать данные: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "неожиданное ÑоÑтоÑние при внедрении параметров воÑÑтановлениÑ"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ ÑÐ¶Ð°Ñ‚Ð¸Ñ lz4: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "не удалоÑÑŒ запиÑать заголовок lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не удалоÑÑŒ Ñжать данные: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "не удалоÑÑŒ завершить Ñжатие lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "окончание файла tar занимает больше 2 блоков"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "неожиданное ÑоÑтоÑние при разборе архива tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "пуÑтое Ð¸Ð¼Ñ Ñƒ компонента tar"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "поток COPY закончилÑÑ Ð´Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего файла"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ ÑÐ¶Ð°Ñ‚Ð¸Ñ zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "не удалоÑÑŒ уÑтановить Ð´Ð»Ñ zstd уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "не удалоÑÑŒ уÑтановить Ð´Ð»Ñ zstd чиÑло потоков %d: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "не удалоÑÑŒ включить режим большой диÑтанции: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ раÑпаковки zstd"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "удаление каталога данных \"%s\""
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "ошибка при удалении каталога данных"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "удаление Ñодержимого каталога данных \"%s\""
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "ошибка при удалении Ñодержимого каталога данных"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "удаление каталога WAL \"%s\""
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "ошибка при удалении каталога WAL"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "удаление Ñодержимого каталога WAL \"%s\""
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "ошибка при удалении Ñодержимого каталога WAL"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "каталог данных \"%s\" не был удалён по запроÑу пользователÑ"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "каталог WAL \"%s\" не был удалён по запроÑу пользователÑ"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² каталогах табличных проÑтранÑтв не будут отменены"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "Ñлишком длинное Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "неÑколько знаков \"=\" в ÑопоÑтавлении табличного проÑтранÑтва"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr ""
+"ÑопоÑтавление табл. проÑтранÑтва запиÑано неверно: \"%s\"; должно быть "
+"\"СТÐРЫЙ_КÐТÐЛОГ=ÐОВЫЙ_КÐТÐЛОГ\""
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr ""
+"Ñтарый каталог в ÑопоÑтавлении табл. проÑтранÑтва задан не абÑолютным путём: "
+"%s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr ""
+"новый каталог в ÑопоÑтавлении табл. проÑтранÑтва задан не абÑолютным путём: "
+"%s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s делает базовую резервную копию работающего Ñервера PostgreSQL.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ПÐРÐМЕТР]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Параметры, управлÑющие выводом:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=КÐТÐЛОГ Ñохранить базовую копию в указанный каталог\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr ""
+" -F, --format=p|t формат вывода (p (по умолчанию) - проÑтой, t - "
+"tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=СКОРОСТЬ макÑ. ÑкороÑÑ‚ÑŒ передачи данных в целевой каталог\n"
+" (в КБ/Ñ, либо добавьте ÑÑƒÑ„Ñ„Ð¸ÐºÑ \"k\" или \"M\")\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" запиÑать конфигурацию Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n"
+
+# well-spelled: ИÐФО
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=ПОЛУЧÐТЕЛЬ[:ДОП_ИÐФО]\n"
+" получатель копии (еÑли отличаетÑÑ Ð¾Ñ‚ client)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=СТÐРЫЙ_КÐТÐЛОГ=ÐОВЫЙ_КÐТÐЛОГ\n"
+" перенеÑти табличное проÑтранÑтво из Ñтарого "
+"каталога\n"
+" в новый\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr ""
+" --waldir=КÐТÐЛОГ_WAL\n"
+" раÑположение каталога Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð¼ предзапиÑи\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" включить в копию требуемые файлы WAL, иÑпользуÑ\n"
+" заданный метод\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip Ñжать выходной tar\n"
+
+# well-spelled: ИÐФО
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]МЕТОД[:ДОП_ИÐФО]\n"
+" выполнÑÑ‚ÑŒ Ñжатие на клиенте или Ñервере как "
+"указано\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none не Ñжимать вывод tar\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Общие параметры:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" режим быÑтрых или раÑпределённых контрольных точек\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot Ñоздать Ñлот репликации\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=МЕТКРуÑтановить метку резервной копии\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищать поÑле ошибок\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑке\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=ИМЯ_СЛОТРиÑпользовать заданный Ñлот репликации\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose выводить подробные ÑообщениÑ\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" алгоритм подÑчёта контрольных Ñумм в манифеÑте\n"
+
+# skip-rule: capital-letter-first
+# well-spelled: шеÑтнадц
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" запиÑывать вÑе имена файлов в манифеÑте в шеÑтнадц. "
+"виде\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr ""
+" --no-estimate-size не раÑÑчитывать размер копии на Ñтороне Ñервера\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest отключить Ñоздание манифеÑта копии\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid ""
+" --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot предотвратить Ñоздание временного Ñлота репликации\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" не проверÑÑ‚ÑŒ контрольные Ñуммы\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключениÑ:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=СТРОКРÑтрока подключениÑ\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=ПОРТ номер порта Ñервера БД\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in "
+"seconds)\n"
+msgstr ""
+" -s, --status-interval=ИÐТЕРВÐЛ\n"
+" интервал между передаваемыми Ñерверу\n"
+" пакетами ÑоÑтоÑÐ½Ð¸Ñ (в Ñекундах)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr ""
+" -U, --username=NAME connect as specified database user\n"
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð°Ð· данных\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password запрашивать пароль вÑегда (обычно не требуетÑÑ)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "не удалоÑÑŒ прочитать из готового канала: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2152
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "не удалоÑÑŒ разобрать положение в журнале предзапиÑи \"%s\""
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "не удалоÑÑŒ завершить запиÑÑŒ файлов WAL: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "не удалоÑÑŒ Ñоздать канал Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ процеÑÑа: %m"
+
+#: pg_basebackup.c:665
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "Ñоздан временный Ñлот репликации \"%s\""
+
+#: pg_basebackup.c:668
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "Ñоздан Ñлот репликации \"%s\""
+
+#: pg_basebackup.c:702
+#, c-format
+msgid "could not create background process: %m"
+msgstr "не удалоÑÑŒ Ñоздать фоновый процеÑÑ: %m"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "не удалоÑÑŒ Ñоздать фоновый поток выполнениÑ: %m"
+
+#: pg_basebackup.c:750
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚"
+
+#: pg_basebackup.c:756
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доÑтупа к каталогу \"%s\": %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s КБ (100%%), табличное проÑтранÑтво %d/%d %*s"
+msgstr[1] "%*s/%s КБ (100%%), табличное проÑтранÑтво %d/%d %*s"
+msgstr[2] "%*s/%s КБ (100%%), табличное проÑтранÑтво %d/%d %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d (%s%-*.*s)"
+msgstr[1] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d (%s%-*.*s)"
+msgstr[2] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d"
+msgstr[1] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d"
+msgstr[2] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "неверное значение (\"%s\") Ð´Ð»Ñ ÑкороÑти передачи данных"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ передачи данных \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "ÑкороÑÑ‚ÑŒ передачи должна быть больше 0"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð² --max-rate: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "ÑкороÑÑ‚ÑŒ передачи \"%s\" вне целочиÑленного диапазона"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "ÑкороÑÑ‚ÑŒ передачи \"%s\" вне диапазона"
+
+#: pg_basebackup.c:996
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "не удалоÑÑŒ получить поток данных COPY: %s"
+
+#: pg_basebackup.c:1013 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "не удалоÑÑŒ прочитать данные COPY: %s"
+
+#: pg_basebackup.c:1017
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "фоновый процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "манифеÑÑ‚ Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ð½ÐµÐ´Ñ€Ð¸Ñ‚ÑŒ в Ñжатый архив tar"
+
+#: pg_basebackup.c:1089
+#, c-format
+msgid ""
+"Use client-side compression, send the output to a directory rather than "
+"standard output, or use %s."
+msgstr ""
+"Примените Ñжатие на Ñтороне клиента, передайте вывод в каталог, а не в "
+"Ñтандартный вывод, или иÑпользуйте %s."
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "обработать архив \"%s\" невозможно"
+
+#: pg_basebackup.c:1106
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Возможна обработка только архивов tar."
+
+#: pg_basebackup.c:1108
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr ""
+"Когда иÑпользуетÑÑ Ð¿Ñ€Ð¾Ñтой формат, программа pg_basebackup должна обработать "
+"архив."
+
+#: pg_basebackup.c:1110
+#, c-format
+msgid ""
+"Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr ""
+"Когда в качеÑтве выходного каталога иÑпользуетÑÑ \"-\", программа "
+"pg_basebackup должна обработать архив."
+
+#: pg_basebackup.c:1112
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr ""
+"Когда иÑпользуетÑÑ ÐºÐ»ÑŽÑ‡ -R, программа pg_basebackup должна обработать архив."
+
+#: pg_basebackup.c:1331
+#, c-format
+msgid "archives must precede manifest"
+msgstr "архивы должны предшеÑтвовать манифеÑту"
+
+#: pg_basebackup.c:1346
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "неверное Ð¸Ð¼Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°: \"%s\""
+
+#: pg_basebackup.c:1418
+#, c-format
+msgid "unexpected payload data"
+msgstr "неожиданно получены данные"
+
+#: pg_basebackup.c:1561
+#, c-format
+msgid "empty COPY message"
+msgstr "пуÑтое Ñообщение COPY"
+
+#: pg_basebackup.c:1563
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "неправильное Ñообщение COPY типа %d, длины %zu"
+
+#: pg_basebackup.c:1761
+#, c-format
+msgid "incompatible server version %s"
+msgstr "неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñервера %s"
+
+#: pg_basebackup.c:1777
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Укажите -X none или -X fetch Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½ÑлÑции журнала."
+
+#: pg_basebackup.c:1845
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "получатели копий не поддерживаютÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ верÑией Ñервера"
+
+#: pg_basebackup.c:1848
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr ""
+"при иÑпользовании Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ запиÑать конфигурацию воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ "
+"нельзÑ"
+
+#: pg_basebackup.c:1875
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "Ñервер не поддерживает Ñжатие на Ñтороне Ñервера"
+
+#: pg_basebackup.c:1885
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr ""
+"начинаетÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ðµ резервное копирование, ожидаетÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ðµ контрольной "
+"точки"
+
+#: pg_basebackup.c:1889
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "ожидание контрольной точки"
+
+#: pg_basebackup.c:1902 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "не удалоÑÑŒ передать команду репликации \"%s\": %s"
+
+#: pg_basebackup.c:1910
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "не удалоÑÑŒ инициализировать базовое резервное копирование: %s"
+
+#: pg_basebackup.c:1913
+#, c-format
+msgid ""
+"server returned unexpected response to BASE_BACKUP command; got %d rows and "
+"%d fields, expected %d rows and %d fields"
+msgstr ""
+"Ñервер вернул неожиданный ответ на команду BASE_BACKUP; получено Ñтрок: %d, "
+"полей: %d, а ожидалоÑÑŒ Ñтрок: %d, полей: %d"
+
+#: pg_basebackup.c:1919
+#, c-format
+msgid "checkpoint completed"
+msgstr "ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° завершена"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "ÑÑ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в журнале предзапиÑи: %s на линии времени %u"
+
+#: pg_basebackup.c:1941
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "не удалоÑÑŒ получить заголовок резервной копии: %s"
+
+#: pg_basebackup.c:1944
+#, c-format
+msgid "no data returned from server"
+msgstr "Ñервер не вернул данные"
+
+#: pg_basebackup.c:1987
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr ""
+"в stdout можно вывеÑти только одно табличное проÑтранÑтво, вÑего в СУБД их %d"
+
+#: pg_basebackup.c:2000
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "запуÑк фонового процеÑÑа ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ WAL"
+
+#: pg_basebackup.c:2083
+#, c-format
+msgid "backup failed: %s"
+msgstr "ошибка при Ñоздании копии: %s"
+
+#: pg_basebackup.c:2086
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "Ñервер не передал конечную позицию в журнале предзапиÑи"
+
+#: pg_basebackup.c:2089
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в журнале предзапиÑи: %s"
+
+#: pg_basebackup.c:2100
+#, c-format
+msgid "checksum error occurred"
+msgstr "выÑвлена ошибка контрольной Ñуммы"
+
+#: pg_basebackup.c:2105
+#, c-format
+msgid "final receive failed: %s"
+msgstr "ошибка в конце передачи: %s"
+
+#: pg_basebackup.c:2129
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð¹ передачи фоновым процеÑÑом..."
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "не удалоÑÑŒ отправить команду в канал фонового процеÑÑа: %m"
+
+#: pg_basebackup.c:2138
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "Ñбой при ожидании дочернего процеÑÑа: %m"
+
+#: pg_basebackup.c:2140
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "завершилÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¹ процеÑÑ %d вмеÑто ожидаемого %d"
+
+#: pg_basebackup.c:2142 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2162
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "Ñбой при ожидании дочернего потока: %m"
+
+#: pg_basebackup.c:2167
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "не удалоÑÑŒ получить ÑоÑтоÑние Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½ÐµÐ³Ð¾ потока: %m"
+
+#: pg_basebackup.c:2170
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "дочерний поток завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ %u"
+
+#: pg_basebackup.c:2199
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "Ñохранение данных на диÑке..."
+
+#: pg_basebackup.c:2224
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "переименование backup_manifest.tmp в backup_manifest"
+
+#: pg_basebackup.c:2244
+#, c-format
+msgid "base backup completed"
+msgstr "базовое резервное копирование завершено"
+
+#: pg_basebackup.c:2327
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr ""
+"неверный аргумент режима контрольных точек \"%s\"; должен быть \"fast\" или "
+"\"spread\""
+
+#: pg_basebackup.c:2345
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "неверный формат вывода \"%s\", должен быть \"plain\" или \"tar\""
+
+#: pg_basebackup.c:2423
+#, c-format
+msgid ""
+"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr ""
+"неверный аргумент Ð´Ð»Ñ wal-method — \"%s\", допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ \"fetch\", "
+"\"stream\" или \"none\""
+
+#: pg_basebackup.c:2458 pg_basebackup.c:2470 pg_basebackup.c:2492
+#: pg_basebackup.c:2504 pg_basebackup.c:2510 pg_basebackup.c:2562
+#: pg_basebackup.c:2573 pg_basebackup.c:2583 pg_basebackup.c:2589
+#: pg_basebackup.c:2596 pg_basebackup.c:2608 pg_basebackup.c:2620
+#: pg_basebackup.c:2628 pg_basebackup.c:2641 pg_basebackup.c:2647
+#: pg_basebackup.c:2656 pg_basebackup.c:2668 pg_basebackup.c:2679
+#: pg_basebackup.c:2687 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_basebackup.c:2468 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_basebackup.c:2491
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "указать и формат, и Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ одновременно нельзÑ"
+
+#: pg_basebackup.c:2503
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "необходимо указать выходной каталог или Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "указать и выходной каталог, и Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ одновременно нельзÑ"
+
+#: pg_basebackup.c:2539 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "нераÑпознанный алгоритм ÑжатиÑ: \"%s\""
+
+#: pg_basebackup.c:2545 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "неправильное указание ÑжатиÑ: %s"
+
+#: pg_basebackup.c:2561
+#, c-format
+msgid ""
+"client-side compression is not possible when a backup target is specified"
+msgstr "Ñжатие на Ñтороне клиента невозможно при указании Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸"
+
+#: pg_basebackup.c:2572
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "ÑжиматьÑÑ Ð¼Ð¾Ð³ÑƒÑ‚ только резервные копии в архиве tar"
+
+#: pg_basebackup.c:2582
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° WAL невозможна при указании Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸"
+
+#: pg_basebackup.c:2588
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "транÑлировать журналы предзапиÑи в режиме tar в поток stdout нельзÑ"
+
+#: pg_basebackup.c:2595
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "Ñлоты репликации можно иÑпользовать только при потоковой передаче WAL"
+
+#: pg_basebackup.c:2607
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñлота"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2618 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "Ð´Ð»Ñ %s необходимо задать Ñлот Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ параметра --slot"
+
+#: pg_basebackup.c:2626 pg_basebackup.c:2666 pg_basebackup.c:2677
+#: pg_basebackup.c:2685
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "параметры %s и %s неÑовмеÑтимы"
+
+#: pg_basebackup.c:2640
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "раÑположение каталога WAL Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ вмеÑте Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»ÐµÐ¼ копии"
+
+#: pg_basebackup.c:2646
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "раÑположение каталога WAL можно указать только в режиме plain"
+
+#: pg_basebackup.c:2655
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "раÑположение каталога WAL должно определÑÑ‚ÑŒÑÑ Ð°Ð±Ñолютным путём"
+
+#: pg_basebackup.c:2755
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s получает транÑлируемые журналы предзапиÑи PostgreSQL.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid ""
+" -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr ""
+" -D, --directory=ПУТЬ ÑохранÑÑ‚ÑŒ файлы журнала предзапиÑи в данный "
+"каталог\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr ""
+" -E, --endpos=LSN определÑет позицию, поÑле которой нужно "
+"оÑтановитьÑÑ\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid ""
+" --if-not-exists do not error if slot already exists when creating a "
+"slot\n"
+msgstr ""
+" --if-not-exists не выдавать ошибку при попытке Ñоздать уже "
+"ÑущеÑтвующий Ñлот\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop прерывать работу при потере ÑоединениÑ\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" --no-sync не ждать надёжного ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ на диÑке\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server "
+"(default: %d)\n"
+msgstr ""
+" -s, --status-interval=СЕК\n"
+" интервал между отправкой ÑтатуÑных пакетов Ñерверу "
+"(по умолчанию: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid ""
+" --synchronous flush write-ahead log immediately after writing\n"
+msgstr ""
+" --synchronous ÑбраÑывать журнал предзапиÑи Ñразу поÑле запиÑи\n"
+
+# well-spelled: ИÐФО
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=МЕТОД[:ДОП_ИÐФО]\n"
+" выполнÑÑ‚ÑŒ Ñжатие как указано\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Дополнительные дейÑтвиÑ:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid ""
+" --create-slot create a new replication slot (for the slot's name "
+"see --slot)\n"
+msgstr ""
+" --create-slot Ñоздать новый Ñлот репликации (Ð¸Ð¼Ñ Ñлота задаёт "
+"параметр --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid ""
+" --drop-slot drop the replication slot (for the slot's name see "
+"--slot)\n"
+msgstr ""
+" --drop-slot удалить Ñлот репликации (Ð¸Ð¼Ñ Ñлота задаёт параметр "
+"--slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "завершён Ñегмент %X/%X (Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "завершена передача журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X (Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "переключение на линию времени %u (Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X)"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "получен Ñигнал прерываниÑ, работа завершаетÑÑ"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "файл Ñегмента \"%s\" имеет неправильный размер %lld, файл пропуÑкаетÑÑ"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть Ñжатый файл \"%s\": %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "ошибка Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñжатом файле \"%s\": %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать Ñжатый файл \"%s\": %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "не удалоÑÑŒ прочитать Ñжатый файл \"%s\" (прочитано байт: %d из %zu)"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr ""
+"файл Ñжатого Ñегмента \"%s\" имеет неправильный иÑходный размер %d, файл "
+"пропуÑкаетÑÑ"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ раÑпаковки LZ4: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "не удалоÑÑŒ раÑпаковать файл \"%s\": %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "не удалоÑÑŒ оÑвободить контекÑÑ‚ раÑпаковки LZ4: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid ""
+"compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr ""
+"файл Ñжатого Ñегмента \"%s\" имеет неправильный иÑходный размер %zu, файл "
+"пропуÑкаетÑÑ"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid ""
+"cannot check file \"%s\": compression with %s not supported by this build"
+msgstr ""
+"не удалоÑÑŒ проверить файл \"%s\": Ñжатие методом %s не поддерживаетÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ "
+"Ñборкой"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "начало передачи журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X (Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "не удалоÑÑŒ разобрать конечную позицию \"%s\""
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑ‚ÑŒ вмеÑте Ñ --drop-slot"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑ‚ÑŒ вмеÑте Ñ --no-sync"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "целевой каталог не указан"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "метод ÑÐ¶Ð°Ñ‚Ð¸Ñ %s ещё не поддерживаетÑÑ"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid ""
+"replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr ""
+"подключение Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ через Ñлот \"%s\" оказалоÑÑŒ привÑзано к базе "
+"данных"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "удаление Ñлота репликации \"%s\""
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "Ñоздание Ñлота репликации \"%s\""
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "отключение"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "отключение; через %d Ñек. поÑледует повторное подключение"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s управлÑет потоками логичеÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ PostgreSQL.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"ДейÑтвие, которое будет выполнено:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid ""
+" --start start streaming in a replication slot (for the "
+"slot's name see --slot)\n"
+msgstr ""
+" --start начать передачу в Ñлоте репликации (Ð¸Ð¼Ñ Ñлота "
+"задаёт параметр --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f, --file=ФÐЙЛ ÑохранÑÑ‚ÑŒ журнал в Ñтот файл, - обозначает stdout\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: "
+"%d)\n"
+msgstr ""
+" -F --fsync-interval=СЕК\n"
+" периодичноÑÑ‚ÑŒ ÑброÑа на диÑк выходного файла (по "
+"умолчанию: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid ""
+" -I, --startpos=LSN where in an existing slot should the streaming "
+"start\n"
+msgstr ""
+" -I, --startpos=LSN определÑет, Ñ ÐºÐ°ÐºÐ¾Ð¹ позиции в ÑущеÑтвующем Ñлоте "
+"начнётÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=ИМЯ[=ЗÐÐЧЕÐИЕ]\n"
+" передать параметр Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ именем и "
+"необÑзательным\n"
+" значением модулю вывода\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P, --plugin=МОДУЛЬ иÑпользовать заданный модуль вывода (по умолчанию: "
+"%s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=ИМЯ_Ð¡Ð›ÐžÐ¢Ð Ð¸Ð¼Ñ Ñлота логичеÑкой репликации\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid ""
+" -t, --two-phase enable decoding of prepared transactions when "
+"creating a slot\n"
+msgstr ""
+" -t, --two-phase включить декодирование подготовленных транзакций "
+"при Ñоздании Ñлота\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=ИМЯ_БД Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ð±Ð°Ð·Ð° данных\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "подтверждаетÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ до %X/%X, ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ð¤Ð¡ до %X/%X (Ñлот %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "не удалоÑÑŒ отправить пакет ответа: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "начало передачи журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X (Ñлот %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "передача запущена"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "неверный Ñокет: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "не удалоÑÑŒ получить данные из потока WAL: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "заголовок потока Ñлишком мал: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "нераÑпознанный заголовок потока: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать %d Б в файл журнала \"%s\": %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "неожиданный конец потока репликации: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "не удалоÑÑŒ разобрать начальную позицию \"%s\""
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "Ñлот не указан"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "целевой файл не задан"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "база данных не задана"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "необходимо задать минимум одно дейÑтвие"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot или --start Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑ‚ÑŒ вмеÑте Ñ --drop-slot"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot или --drop-slot Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑÑ‚ÑŒ вмеÑте Ñ --startpos"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos можно задать только вмеÑте Ñ --start"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase можно задать только вмеÑте Ñ --create-slot"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr ""
+"не удалоÑÑŒ уÑтановить подключение Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ к определённой базе данных"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X доÑтигнута при обработке keepalive"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X доÑтигнута при обработке запиÑи WAL %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "не удалоÑÑŒ Ñоздать файл ÑтатуÑа архива \"%s\": %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "не удалоÑÑŒ закрыть файл ÑтатуÑа архива \"%s\": %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "не удалоÑÑŒ получить размер файла журнала предзапиÑи \"%s\": %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "не удалоÑÑŒ открыть ÑущеÑтвующий файл журнала предзапиÑи \"%s\": %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr ""
+"не удалоÑÑŒ ÑброÑить на диÑк ÑущеÑтвующий файл журнала предзапиÑи \"%s\": %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] ""
+"файл журнала предзапиÑи \"%s\" имеет размер %zd Б, а должен — 0 или %d"
+msgstr[1] ""
+"файл журнала предзапиÑи \"%s\" имеет размер %zd Б, а должен — 0 или %d"
+msgstr[2] ""
+"файл журнала предзапиÑи \"%s\" имеет размер %zd Б, а должен — 0 или %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "не удалоÑÑŒ открыть файл журнала предзапиÑи \"%s\": %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "файл Ñегмента \"%s\" не переименовываетÑÑ, так как он неполный"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "Ñервер Ñообщил неожиданное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° иÑтории Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "не удалоÑÑŒ Ñоздать файл иÑтории линии времени \"%s\": %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "не удалоÑÑŒ запиÑать файл иÑтории линии времени \"%s\": %s"
+
+#: receivelog.c:394
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions older than %s"
+msgstr ""
+"неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñервера %s; клиент не поддерживает репликацию Ñ "
+"Ñерверов верÑии ниже %s"
+
+#: receivelog.c:403
+#, c-format
+msgid ""
+"incompatible server version %s; client does not support streaming from "
+"server versions newer than %s"
+msgstr ""
+"неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñервера %s; клиент не поддерживает репликацию Ñ "
+"Ñерверов верÑии выше %s"
+
+#: receivelog.c:508
+#, c-format
+msgid ""
+"system identifier does not match between base backup and streaming connection"
+msgstr ""
+"ÑиÑтемный идентификатор базовой резервной копии отличаетÑÑ Ð¾Ñ‚ идентификатора "
+"потоковой передачи"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "на Ñервере нет начальной линии времени %u"
+
+#: receivelog.c:555
+#, c-format
+msgid ""
+"unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"Ñервер вернул неожиданный ответ на команду TIMELINE_HISTORY; получено Ñтрок: "
+"%d, полей: %d, а ожидалоÑÑŒ Ñтрок: %d, полей: %d"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "Ñервер неожиданно Ñообщил линию времени %u поÑле линии времени %u"
+
+#: receivelog.c:632
+#, c-format
+msgid ""
+"server stopped streaming timeline %u at %X/%X, but reported next timeline %u "
+"to begin at %X/%X"
+msgstr ""
+"Ñервер прекратил передачу линии времени %u в %X/%X, но Ñообщил, что "
+"ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u начнётÑÑ Ð² %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "поток репликации закончилÑÑ Ð´Ð¾ точки оÑтановки"
+
+#: receivelog.c:718
+#, c-format
+msgid ""
+"unexpected result set after end-of-timeline: got %d rows and %d fields, "
+"expected %d rows and %d fields"
+msgstr ""
+"Ñервер вернул неожиданный набор данных поÑле конца линии времени; получено "
+"Ñтрок: %d, полей: %d, а ожидалоÑÑŒ Ñтрок: %d, полей: %d"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "не удалоÑÑŒ разобрать начальную точку Ñледующей линии времени \"%s\""
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "получена запиÑÑŒ журнала предзапиÑи по Ñмещению %u, но файл не открыт"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "получено Ñмещение данных WAL %08x, но ожидалоÑÑŒ %08x"
+
+#: receivelog.c:1128
+#, 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
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "не удалоÑÑŒ отправить пакет \"конец COPY\": %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Пароль: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не удалоÑÑŒ очиÑтить search_path: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "не удалоÑÑŒ получить наÑтройку Ñервера integer_datetimes"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "флаг компилÑции integer_datetimes не ÑоответÑтвует наÑтройке Ñервера"
+
+#: streamutil.c:296
+#, c-format
+msgid ""
+"could not fetch WAL segment size: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"не удалоÑÑŒ извлечь размер Ñегмента WAL; получено Ñтрок: %d, полей: %d "
+"(ожидалоÑÑŒ: %d и %d (или более))"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "разобрать размер Ñегмента WAL не удалоÑÑŒ"
+
+#: streamutil.c:324
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"remote server reported a value of %d bytes"
+msgstr[0] ""
+"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но удалённый Ñервер Ñообщил значение: %d"
+msgstr[1] ""
+"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но удалённый Ñервер Ñообщил значение: %d"
+msgstr[2] ""
+"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но удалённый Ñервер Ñообщил значение: %d"
+
+#: streamutil.c:369
+#, c-format
+msgid ""
+"could not fetch group access flag: got %d rows and %d fields, expected %d "
+"rows and %d or more fields"
+msgstr ""
+"не удалоÑÑŒ извлечь флаг доÑтупа группы; получено Ñтрок: %d, полей: %d "
+"(ожидалоÑÑŒ: %d и %d (или более))"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "не удалоÑÑŒ разобрать флаг доÑтупа группы: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid ""
+"could not identify system: got %d rows and %d fields, expected %d rows and "
+"%d or more fields"
+msgstr ""
+"не удалоÑÑŒ идентифицировать ÑиÑтему; получено Ñтрок: %d, полей: %d "
+"(ожидалоÑÑŒ: %d и %d (или более))"
+
+#: streamutil.c:510
+#, c-format
+msgid ""
+"could not read replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"прочитать из Ñлота репликации \"%s\" не удалоÑÑŒ; получено Ñтрок: %d, полей: "
+"%d (ожидалоÑÑŒ: %d и %d)"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "Ñлот репликации \"%s\" не ÑущеÑтвует"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "ожидалÑÑ Ñлот физичеÑкой репликации, вмеÑто Ñтого получен тип \"%s\""
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr ""
+"не удалоÑÑŒ разобрать позицию restart_lsn \"%s\" Ð´Ð»Ñ Ñлота репликации \"%s\""
+
+#: streamutil.c:664
+#, 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)"
+
+#: streamutil.c:708
+#, c-format
+msgid ""
+"could not drop replication slot \"%s\": got %d rows and %d fields, expected "
+"%d rows and %d fields"
+msgstr ""
+"удалить Ñлот репликации \"%s\" не получилоÑÑŒ; получено Ñтрок: %d, полей: %d "
+"(ожидалоÑÑŒ: %d и %d)"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "не удалоÑÑŒ Ñжать данные"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "не удалоÑÑŒ ÑброÑить поток Ñжатых данных"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr ""
+"ошибка реализации: в файлах tar не может быть больше одно открытого файла"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "не удалоÑÑŒ Ñоздать заголовок tar"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "не удалоÑÑŒ изменить параметры ÑжатиÑ"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "Ñо Ñжатием закрытие файла Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸ÐµÐ¼ не поддерживаетÑÑ"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных"
+
+#, c-format
+#~ msgid "this build does not support gzip compression"
+#~ msgstr "Ñта Ñборка программы не поддерживает Ñжатие gzip"
+
+#, c-format
+#~ msgid "this build does not support lz4 compression"
+#~ msgstr "Ñта Ñборка программы не поддерживает Ñжатие lz4"
+
+#, c-format
+#~ msgid "this build does not support zstd compression"
+#~ msgstr "Ñта Ñборка программы не поддерживает Ñжатие zstd"
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "ÑимволичеÑкие ÑÑылки не поддерживаютÑÑ Ð² Ñтой ОС"
+
+#, c-format
+#~ msgid "could not determine seek position in file \"%s\": %s"
+#~ msgstr "не удалоÑÑŒ определить текущую позицию в файле \"%s\": %s"
+
+#~ msgid "unknown compression option \"%s\""
+#~ msgstr "неизвеÑтный параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\""
+
+#~ msgid "could not check file \"%s\""
+#~ msgstr "не удалоÑÑŒ проверить файл \"%s\""
+
+#~ msgid "This build does not support compression with %s."
+#~ msgstr "Эта Ñборка программы не поддерживает Ñжатие %s."
+
+#~ msgid "no value specified for --compress, switching to default"
+#~ msgstr ""
+#~ "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° --compress не задано значение, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ по "
+#~ "умолчанию"
+
+#~ msgid "could not find replication slot \"%s\""
+#~ msgstr "не удалоÑÑŒ найти Ñлот репликации \"%s\""
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid ""
+#~ " -Z, --compress=0-9 compress tar output with given compression "
+#~ "level\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 уÑтановить уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ архива\n"
+
+#~ msgid "invalid tar block header size: %zu"
+#~ msgstr "неверный размер заголовка блока tar: %zu"
+
+#~ msgid "unrecognized link indicator \"%c\""
+#~ msgstr "нераÑпознанный индикатор ÑвÑзи \"%c\""
+
+#~ msgid "could not get write-ahead log end position from server: %s"
+#~ msgstr ""
+#~ "не удалоÑÑŒ получить от Ñервера конечную позицию в журнале предзапиÑи: %s"
+
+#~ msgid "invalid status interval \"%s\""
+#~ msgstr "неверный интервал Ñообщений о ÑоÑтоÑнии \"%s\""
+
+#~ msgid ""
+#~ " -Z, --compress=0-9 compress logs with given compression level\n"
+#~ msgstr " -Z, --compress=0-9 уÑтановить уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð²\n"
+
+#~ msgid "invalid fsync interval \"%s\""
+#~ msgstr "неверный интервал Ñинхронизации Ñ Ð¤Ð¡ \"%s\""
+
+#~ msgid "--progress and --no-estimate-size are incompatible options"
+#~ msgstr "параметры --progress и --no-estimate-size неÑовмеÑтимы"
+
+#~ msgid "--no-manifest and --manifest-checksums are incompatible options"
+#~ msgstr "параметры --no-manifest и --manifest-checksums неÑовмеÑтимы"
+
+#~ msgid "--no-manifest and --manifest-force-encode are incompatible options"
+#~ msgstr "параметры --no-manifest и --manifest-force-encode неÑовмеÑтимы"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памÑти\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s: дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ ненормально\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s: дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ %d\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл журнала \"%s\": %s\n"
+
+#~ msgid "%s: removing transaction log directory \"%s\"\n"
+#~ msgstr "%s: удаление каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove transaction log directory\n"
+#~ msgstr "%s: ошибка при удалении каталога журнала транзакций\n"
+
+#~ msgid "%s: removing contents of transaction log directory \"%s\"\n"
+#~ msgstr "%s: очиÑтка каталога журнала транзакций \"%s\"\n"
+
+#~ msgid "%s: failed to remove contents of transaction log directory\n"
+#~ msgstr "%s: ошибка при очиÑтке каталога журнала транзакций\n"
+
+#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n"
+#~ msgstr ""
+#~ "%s: каталог журнала транзакций \"%s\" не был удалён по запроÑу "
+#~ "пользователÑ\n"
+
+#~ msgid "%s: could not open transaction log file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ открыть файл журнала транзакций \"%s\": %s\n"
+
+#~ msgid ""
+#~ " -x, --xlog include required WAL files in backup (fetch "
+#~ "mode)\n"
+#~ msgstr ""
+#~ " -x, --xlog включить в копию требуемые файлы WAL (режим "
+#~ "fetch)\n"
+
+#~ msgid "%s: WAL streaming can only be used in plain mode\n"
+#~ msgstr "%s: Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° WAL поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в режиме plain\n"
+
+#~ msgid "%s: could not stat transaction log file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ проверить файл журнала транзакций \"%s\": %s\n"
+
+#~ msgid "%s: could not pad transaction log file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ дополнить файл журнала транзакций \"%s\": %s\n"
+
+#~ msgid "%s: could not rename file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ переименовать файл \"%s\": %s\n"
+
+#~ msgid "%s: could not open timeline history file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ открыть файл иÑтории линии времени \"%s\": %s\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s: не удалоÑÑŒ разобрать размер файла\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s: не удалоÑÑŒ разобрать режим файла\n"
+
+#~ msgid "%s: socket not open"
+#~ msgstr "%s: Ñокет не открыт"
+
+#~ msgid "%s: could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "%s: ошибка при удалении ÑимволичеÑкой ÑÑылки \"%s\": %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Replication options:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Параметры репликации:\n"
+
+#~ msgid "%s: initializing replication slot \"%s\"\n"
+#~ msgstr "%s: инициализируетÑÑ Ñлот репликации \"%s\"\n"
+
+#~ msgid ""
+#~ "%s: could not init logical replication: got %d rows and %d fields, "
+#~ "expected %d rows and %d fields\n"
+#~ msgstr ""
+#~ "%s: не удалоÑÑŒ инициализировать логичеÑкую репликацию; получено Ñтрок: "
+#~ "%d, полей: %d (ожидалоÑÑŒ: %d и %d)\n"
+
+#~ msgid "%s: no start point returned from server\n"
+#~ msgstr "%s: Ñервер не вернул Ñтартовую точку\n"
+
+#~ msgid ""
+#~ "%s: timeline does not match between base backup and streaming connection\n"
+#~ msgstr ""
+#~ "%s: Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ базовой резервной копии отличаетÑÑ Ð¾Ñ‚ линии времени "
+#~ "потоковой передачи\n"
+
+#~ msgid "%s: keepalive message has incorrect size %d\n"
+#~ msgstr "%s: контрольное Ñообщение имеет некорректный размер: %d\n"
+
+#~ msgid "%s: could not close file %s: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ закрыть файл %s: %s\n"
+
+#~ msgid "%s: invalid format of xlog location: %s\n"
+#~ msgstr "%s: неверный формат позиции в xlog: %s\n"
+
+#~ msgid "%s: could not identify system: %s"
+#~ msgstr "%s: не удалоÑÑŒ идентифицировать ÑиÑтему: %s"
+
+#~ msgid "%s: could not send base backup command: %s"
+#~ msgstr ""
+#~ "%s: не удалоÑÑŒ отправить команду базового резервного копированиÑ: %s"
+
+#~ msgid "%s: could not identify system: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ идентифицировать ÑиÑтему: %s\n"
+
+#~ msgid "%s: could not open WAL segment %s: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ открыть Ñегмент WAL %s: %s\n"
+
+#~ msgid "%s: could not stat WAL segment %s: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ получить информацию о Ñегменте WAL %s: %s\n"
+
+#~ msgid "%s: could not pad WAL segment %s: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ дополнить Ñегмент WAL %s: %s\n"
+
+#~ msgid "%s: could not get current position in file %s: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ получить текущую позицию в файле %s: %s\n"
diff --git a/src/bin/pg_basebackup/po/sv.po b/src/bin/pg_basebackup/po/sv.po
new file mode 100644
index 0000000..af0305e
--- /dev/null
+++ b/src/bin/pg_basebackup/po/sv.po
@@ -0,0 +1,1817 @@
+# SWEDISH message translation file for pg_basebackup
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-01 14:19+0000\n"
+"PO-Revision-Date: 2023-09-05 09:00+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "detta bygge stöder inte komprimering med %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "hittade en tom sträng där en komprimeringsinställning förväntades"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "okänd komprimeringsflagga: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "komprimeringsflaggan \"%s\" kräver ett värde"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "värdet på komprimeringsflaggan \"%s\" måste vara ett heltal"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "värdet på komprimeringsflaggan \"%s\" måste vara en boolean"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "komprimeringsalgoritmen \"%s\" stöder inte komprimeringsnivåer"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivå mellan %d och %d (standard är %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "komprimeringsalgoritmen \"%s\" stöder inte inställning av antal arbetarprocesser"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "komprimeringsalgoritmen \"%s\" stöder inte långdistansläge"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "kunde inte fsync:a fil \"%s\": %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "kunde inte skriva till fil \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1470 pg_basebackup.c:1679
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "kunde inte skapa fil \"%s\": %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "oväntat tillstånd vid uppackning av arkiv"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "kunde inte sätta rättigheter på katalogen \"%s\": %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "kunde inte skapa symbolisk länk från \"%s\" till \"%s\": %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "kunde inte sätta rättigheter på filen \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "kunde inte skapa komprimerad fil \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "kunde inte duplicera stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "kunde inte öppna utdatafilen: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "kunde inte sätta komprimeringsnivå %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "kunde inte skriva till komprimerad fil \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "kunde inte stänga komprimerad fil \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "kunde inte initierar komprimeringsbibliotek"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "kunde inte dekomprimera data: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "oväntat tillstånd vid injicering av återställningsinställningar"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "kunde inte skapa kontext för lz4-komprimering: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "kunde inte skriva lz4-header: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "kunde inte komprimera data: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "kunde inte avsluta lz4-komprimering: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "kunde inte initiera komprimeringsbibliotek: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tarfilens slutdel överskred 2 block"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "oväntat tillstånd vid parsning av tar-arkiv"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar-medlem har tomt namn"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY-ström avslutade innan sista filen var klar"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "kunde inte skapa kontext för zstd-komprimering"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "kunde inte sätta zstd-komprimeringsnivå till %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "kunde inte sätta komprimeringsarbetarantalet till %d: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "kunde inte aktivera långdistansläge: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "kunde inte skapa kontext för zstd-dekomprimering"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "tar bort datakatalog \"%s\""
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "misslyckades med att ta bort datakatalog"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "tar bort innehållet i datakatalog \"%s\""
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "misslyckades med att ta bort innehållet i datakatalogen"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "tar bort WAL-katalog \"%s\""
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "misslyckades med att ta bort WAL-katalog"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "tar bort innehållet i WAL-katalog \"%s\""
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "misslyckades med att ta bort innehållet i WAL-katalogen"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "datakatalog \"%s\" är ej borttagen på användares begäran"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "WAL-katalog \"%s\" är ej borttagen på användares begäran"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "ändringar av tablespace-kataloger kan inte backas"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "katalognamn för långt"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "multipla \"=\"-tecken i tablespace-mappning"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ogiltigt tablespace-mappningsformat \"%s\", måste vara \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "gammal katalog är inte en absolut sökväg i tablespace-mappning: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "ny katalog är inte en absolut sökväg i tablespace-mappning: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s tar en basbackup av en körande PostgreSQL-server.\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [FLAGGA]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Flaggor som styr utmatning:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=KATALOG ta emot basbackup till katalog\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t utdataformat (plain (standard), tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE maximal överföringshastighet för att överföra datakatalog\n"
+" (i kB/s, eller använd suffix \"k\" resp. \"M\")\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" skriv konfiguration för replikering\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=MÃ…L[:DETALJ]\n"
+" backupmål (om annat än klienten)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=GAMMALKAT=NYKAT\n"
+" flytta tablespace i GAMMALKAT till NYKAT\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALKAT plats för write-ahead-logg-katalog\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" inkludera behövda WAL-filer med angiven metod\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip komprimera tar-utdata\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METOD[:DETALJ]\n"
+" komprimera på klient- eller serversida\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none komprimera inte tar-utdata\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allmänna flaggor:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" ställ in \"fast\" eller \"spread\" checkpoint-metod\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " --create-slot skapa en replikeringsslot\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ETIKETT sätt backup-etikett\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean städa inte upp efter fel\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändringar skall skrivas säkert till disk\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAMN replikerings-slot att använda\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose mata ut utförliga meddelanden\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" använd algoritm för manifestchecksummor\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" hex-koda alla filnamn i manifestet\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size estimerar inte backupstorlek på serversidan\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest förhindra att backupmanifest genereras\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot förhindra skapande av temporär replikerings-slot\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" verifiera inte checksummor\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR anslutningssträng\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAMN databasserverns värdnamn eller socket-katalog\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT databasserverns postnummer\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" tid mellan att statuspaket skickas till servern (i sekunder)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAMN ansluta som angiven databasanvändare\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga aldrig efter lösenord\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password tvinga fram lösenordsfråga (skall ske automatiskt)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "kunde inte läsa från rör (pipe) som har data: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "kunde inte parsa write-ahead-logg-plats \"%s\""
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "kunde inte slutföra skrivning av WAL-filer: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "kunde inte skapa rör (pipe) för bakgrundsprocess: %m"
+
+#: pg_basebackup.c:664
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "skapade en temporär replikeringsslot \"%s\""
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "skapade en replikeringsslot \"%s\""
+
+#: pg_basebackup.c:701
+#, c-format
+msgid "could not create background process: %m"
+msgstr "kunde inte skapa bakgrundsprocess: %m"
+
+#: pg_basebackup.c:710
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "kunde inte skapa bakgrundstråd: %m"
+
+#: pg_basebackup.c:749
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "katalogen \"%s\" existerar men är inte tom"
+
+#: pg_basebackup.c:755
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: pg_basebackup.c:831
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+
+#: pg_basebackup.c:843
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:859
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace"
+
+#: pg_basebackup.c:883
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "överföringshastighet \"%s\" är inte ett giltigt värde"
+
+#: pg_basebackup.c:885
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "ogiltig överföringshastighet \"%s\": %m"
+
+#: pg_basebackup.c:892
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "överföringshastigheten måste vara större än noll"
+
+#: pg_basebackup.c:922
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "ogiltig enhet för --max-rate: \"%s\""
+
+#: pg_basebackup.c:926
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "överföringshastighet \"%s\" överskrider heltalsintervall"
+
+#: pg_basebackup.c:933
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "överföringshastighet \"%s\" är utanför sitt intervall"
+
+#: pg_basebackup.c:995
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "kunde inte hämta COPY-data-ström: %s"
+
+#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "kunde inte läsa COPY-data: %s"
+
+#: pg_basebackup.c:1016
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "en bakgrundsprocess avslutade oväntat"
+
+#: pg_basebackup.c:1087
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "kan inte injicera manifest in i en komprimerad tarfil"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "använd komprimering på klientsidan, skicka utdatan till en katalog istället för till standard ut eller använd %s."
+
+#: pg_basebackup.c:1104
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "kunde inte parsa arkiv \"%s\""
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Bara tar-arkiv kan parsas."
+
+#: pg_basebackup.c:1107
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "Enkelt format kräver pg_basebackup för att parsa arkivet."
+
+#: pg_basebackup.c:1109
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "Att använda - som utkatalog kräver att pg_basebackup parsar arkivet."
+
+#: pg_basebackup.c:1111
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Flaggan -R kräver att pg_basebackup parsar arkivet."
+
+#: pg_basebackup.c:1330
+#, c-format
+msgid "archives must precede manifest"
+msgstr "arkiv skall komma före manifest"
+
+#: pg_basebackup.c:1345
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "ogiltigt arkivnamn: \"%s\""
+
+#: pg_basebackup.c:1417
+#, c-format
+msgid "unexpected payload data"
+msgstr "oväntat datainnehåll"
+
+#: pg_basebackup.c:1560
+#, c-format
+msgid "empty COPY message"
+msgstr "tomt COPY-meddelande"
+
+#: pg_basebackup.c:1562
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "felaktigt COPY-meddelande av typ %d, längd %zu"
+
+#: pg_basebackup.c:1760
+#, c-format
+msgid "incompatible server version %s"
+msgstr "inkompatibel serverversion %s"
+
+#: pg_basebackup.c:1776
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "Använd -X none eller -X fetch för att stänga av logg-strömning"
+
+#: pg_basebackup.c:1844
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "backupmål stöds inte av denna serverversion"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "återställningskonfiguration kan inte skrivas när backupmål används"
+
+#: pg_basebackup.c:1874
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "servern stöder inte komprimering på serversidan"
+
+#: pg_basebackup.c:1884
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "initierar basbackup, väntar på att checkpoint skall gå klart"
+
+#: pg_basebackup.c:1888
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "väntar på checkpoint"
+
+#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "kunde inte skicka replikeringskommando \"%s\": %s"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "kunde inte initiera basbackup: %s"
+
+#: pg_basebackup.c:1912
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "servern retunerade ett oväntat svar på BASE_BACKUP-kommandot; fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: pg_basebackup.c:1918
+#, c-format
+msgid "checkpoint completed"
+msgstr "checkpoint klar"
+
+#: pg_basebackup.c:1932
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "write-ahead-loggens startposition: %s på tidslinje %u"
+
+#: pg_basebackup.c:1940
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "kunde inte hämta backup-header: %s"
+
+#: pg_basebackup.c:1943
+#, c-format
+msgid "no data returned from server"
+msgstr "ingen data returnerades från servern"
+
+#: pg_basebackup.c:1986
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "kunde bara skriva en endaste tablespace till stdout, databasen har %d"
+
+#: pg_basebackup.c:1999
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "startar bakgrunds-WAL-mottagare"
+
+#: pg_basebackup.c:2082
+#, c-format
+msgid "backup failed: %s"
+msgstr "backup misslyckades: %s"
+
+#: pg_basebackup.c:2085
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "ingen write-ahead-logg-slutposition returnerad från servern"
+
+#: pg_basebackup.c:2088
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "write-ahead-logg-slutposition: %s"
+
+#: pg_basebackup.c:2099
+#, c-format
+msgid "checksum error occurred"
+msgstr "felaktig kontrollsumma upptäcktes"
+
+#: pg_basebackup.c:2104
+#, c-format
+msgid "final receive failed: %s"
+msgstr "sista mottagning misslyckades: %s"
+
+#: pg_basebackup.c:2128
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "väntat på att bakgrundsprocess skall avsluta strömmande ..."
+
+#: pg_basebackup.c:2132
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "kunde inte skicka kommando till bakgrundsrör (pipe): %m"
+
+#: pg_basebackup.c:2137
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "kunde inte vänta på barnprocess: %m"
+
+#: pg_basebackup.c:2139
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "barn %d dog, förväntade %d"
+
+#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2161
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "kunde inte vänta på barntråd: %m"
+
+#: pg_basebackup.c:2166
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "kunde inte hämta barntrådens slutstatus: %m"
+
+#: pg_basebackup.c:2169
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "barntråd avslutade med fel %u"
+
+#: pg_basebackup.c:2198
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "synkar data till disk ..."
+
+#: pg_basebackup.c:2223
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "byter namn på backup_manifest.tmp till backup_manifest"
+
+#: pg_basebackup.c:2243
+#, c-format
+msgid "base backup completed"
+msgstr "basbackup klar"
+
+#: pg_basebackup.c:2326
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "ogiltigt checkpoint-argument \"%s\", måste vara \"fast\" eller \"spread\""
+
+#: pg_basebackup.c:2344
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "ogiltigt utdataformat \"%s\", måste vara \"plain\" eller \"tar\""
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "ogiltig wal-metod-flagga \"%s\", måste vara \"fetch\", \"stream\" eller \"none\""
+
+#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491
+#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561
+#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588
+#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619
+#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646
+#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678
+#: pg_basebackup.c:2686 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_basebackup.c:2490
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "kan inte ange både format och backupmål"
+
+#: pg_basebackup.c:2502
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "måste ange utkatalog eller backupmål"
+
+#: pg_basebackup.c:2508
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "kan inte ange både utdatakatalog och backupmål"
+
+#: pg_basebackup.c:2538 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "okänd komprimeringsalgoritm: \"%s\""
+
+#: pg_basebackup.c:2544 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ogiltig komprimeringsangivelse: %s"
+
+#: pg_basebackup.c:2560
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "komprimering på klientsidan är inte möjlig när backupmål angivits"
+
+#: pg_basebackup.c:2571
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "bara backupper i tar-läge kan komprimeras"
+
+#: pg_basebackup.c:2581
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "WAL kan inte strömmas när ett backupmål angivits"
+
+#: pg_basebackup.c:2587
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "kan inte strömma write-ahead-logg i tar-läge till stdout"
+
+#: pg_basebackup.c:2594
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "replikerings-slot kan bara användas med WAL-strömning"
+
+#: pg_basebackup.c:2606
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot kan inte användas tillsammans med slot-namn"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2617 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s kräver att en slot anges med --slot"
+
+#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676
+#: pg_basebackup.c:2684
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s och %s är inkompatibla flaggor"
+
+#: pg_basebackup.c:2639
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "WAL-katalogplats kan inte anges tillsammans med backupmål"
+
+#: pg_basebackup.c:2645
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL-katalogplats kan bara anges i läget \"plain\""
+
+#: pg_basebackup.c:2654
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL-katalogen måste vara en absolut sökväg"
+
+#: pg_basebackup.c:2754
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "kan inte skapa symbolisk länk \"%s\": %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s tar emot PostgreSQL-strömning-write-ahead-logg.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=KAT ta emot write-ahead-logg-filer till denna katalog\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN avsluta efter att ha taget emot den angivna LSN\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists inget fel om slot:en redan finns när vi skapar slot:en\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop loopa inte om anslutning tappas\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync vänta inte på att ändringar skall skrivas säkert till disk\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SEKS\n"
+" tid mellan att statuspaket skickas till serverb (standard: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous flush:a write-ahead-logg direkt efter skrivning\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METOD[:DETALJ]\n"
+" komprimera enligt detta\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Valfria handlingar:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot skapa en ny replikeringsslot (angående slot:ens namn, se --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot släng replikeringsslot (angående slot:ens namn, se --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "slutförde segment vid %X/%X (tidslinje %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "stoppade logg-strömning vid %X/%X (tidslinje %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "bytte till tidslinje %u vid %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "mottog avbrottsignal, avslutar"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "segmentfil \"%s\" har inkorrekt storlek %lld, hoppar över"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "kunde inte öppna komprimerad fil \"%s\": %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "kunde inte söka i komprimerad fil \"%s\": %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "kunde inte läsa komprimerad fil \"%s\": %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "kunde inte läsa komprimerad fil \"%s\": läste %d av %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %d, hoppar över"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "kunde inte skapa kontext för LZ4-dekomprimering: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "kunde inte dekomprimera fil \"%s\": %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "kunde inte frigöra kontext för LZ4-dekomprimering: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %zu, hoppar över"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "kan inte kontrollera filen \"%s\": komprimering med %s stöds inte av detta bygge"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "startar logg-strömning vid %X/%X (tidslinje %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "kunde inte parsa slutposition \"%s\""
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "kan inte använda --create-slot tillsammans med --drop-slot"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "kan inte använda --synchronous tillsammans med --no-sync"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "ingen målkatalog angiven"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "komprimering med %s stöds inte än"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "replikeringsanslutning som använder slot \"%s\" är oväntat databasspecifik"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "slänger replikeringsslot \"%s\""
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "skapar replikeringsslot \"%s\""
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "nerkopplad"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "nerkopplad; väntar %d sekunder för att försöka igen"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s styr PostgreSQL:s logiskt avkodade strömmar.\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Handling att utföra:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start starta strömning i en replikeringsslot (angående slot:ens namn, se --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FIL ta emot logg till denna fil, - för stdout\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SEK\n"
+" tid mellan fsync av utdatafil (standard: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN var i en existerande slot skall strömningen starta\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAMN[=VÄRDE]\n"
+" skicka vidare flaggan NAMN med ev. värde VÄRDE till\n"
+" utmatnings-plugin:en\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN använd utmatnings-plugin:en PLUGIN (standard: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAMN namn på den logiska replikerings-slotten\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase slå på avkodning av förberedda transaktioner när en slot skapas\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAMN databas att ansluta till\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "bekräftar skrivning fram till %X/%X, flush till %X/%X (slot %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "kunde inte skicka feedback-paket: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "startar logg-strömning vid %X/%X (slot %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "strömning initierad"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "kunde inte öppna loggfil \"%s\": %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "ogiltigt uttag: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "kunde inte ta emot data från WAL-ström: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "strömningsheader för liten: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "okänd strömningsheader: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "kunde inte skriva %d byte till loggfil \"%s\": %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "oväntad terminering av replikeringsström: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "kunde inte parsa startposition \"%s\""
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "ingen slot angiven"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "ingen målfil angiven"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "ingen databas angiven"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "minst en handling måste anges"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "kan inte använda --create-slot eller --start tillsammans med --drop-slot"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "kan inte använda --create-slot eller --drop-slot tillsammans med --startpos"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos får bara anges tillsammans med --start"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase får bara anges tillsammans med --create-slot"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "kunde inte upprätta databasspecifik replikeringsanslutning"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "slutposition %X/%X nådd av keepalive"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "slutposition %X/%X nådd av WAL-post vid %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "kunde inte stänga arkiveringsstatusfil \"%s\": %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "kunde inte hämta storleken på write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "kunde inte öppna existerande write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "kunde inte fsync:a befintlig write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d"
+msgstr[1] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "kunde inte öppna write-ahead-logg-fil \"%s\": %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "byter inte namn på \"%s\", segmentet är inte komplett"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "kunde inte stänga fil \"%s\": %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "servern rapporterade oväntat historikfilnamn för tidslinje %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "kunde inte skapa tidslinjehistorikfil \"%s\": %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "kunde inte skriva tidslinjehistorikfil \"%s\": %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "inkompatibel serverversion %s; klienten stöder inte stömning från serverversioner äldre än %s"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "inkompatibel serverversion %s; klienten stöder inte stömning från serverversioner nyare än %s"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "systemidentifieraren matchar inte mellan basbackup och strömningsanslutning"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "starttidslinje %u finns inte tillgänglig i servern"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "oväntat svar på TIMELINE_HISTORY-kommando: fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "servern rapporterade oväntad nästa tidslinje %u, följer på tidslinje %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "servern stoppade strömning av tidslinje %u vid %X/%X men rapporterade nästa tidslinje %u skulle börja vid %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "replikeringsström avslutades innan stoppunkt"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "oväntad resultatmängd efter slut-på-tidslinje: fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "kunde inte parsa nästa tidslinjens startpunkt \"%s\""
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "kunde inte fsync:a fil \"%s\": %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "tog emot write-ahead-logg-post för offset %u utan att ha någon öppen fil"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "fick WAL-data-offset %08x, förväntade %08x"
+
+#: receivelog.c:1128
+#, c-format
+msgid "could not write %d bytes to WAL file \"%s\": %s"
+msgstr "kunde inte skriva %d byte till WAL-fil \"%s\": %s"
+
+#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "kunde inte skicka \"copy-end\"-paket: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "kunde inte ansluta till server"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "kunde inte nollställa search_path: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "kunde inte lista ut serverns inställning för integer_datetimes"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "kompileringsflaggan integer_datetimes matchar inte servern"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "kunde inte hämta WAL-segmentstorlek: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL-segment-storlek kunde inte parsas"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte"
+msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "kunde inte hämta gruppaccessflagga: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "gruppaccessflagga kunde inte parsas: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "kunde inte läsa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "replikeringsslot \"%s\" existerar inte"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "förväntade en fysisk replikeringsslot men fick av typen \"%s\" istället"
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "kunde inte parsa restart_lsn \"%s\" för replikeringsslot \"%s\""
+
+#: streamutil.c:664
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "kunde inte skapa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "kunde inte slänga replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "kunde inte komprimera data"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "kunde inte nollställa komprimeringsström"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "implementationsfel: tar-filer kan inte ha mer än en öppen fil"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "kunde inte skapa tar-header"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "kunde inte ändra komprimeringsparametrar"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "unlink stöds inte med komprimering"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "kunde inte stänga komprimeringsström"
+
+#, c-format
+#~ msgid "could not determine seek position in file \"%s\": %s"
+#~ msgstr "kunde inte fastställa sökposition i fil \"%s\": %s"
+
+#, c-format
+#~ msgid "symlinks are not supported on this platform"
+#~ msgstr "symboliska länkar stöds inte på denna plattform"
+
+#, c-format
+#~ msgid "this build does not support gzip compression"
+#~ msgstr "detta bygge stöder inte gzip-komprimering"
+
+#, c-format
+#~ msgid "this build does not support lz4 compression"
+#~ msgstr "detta bygge stöder inte lz4-komprimering"
+
+#, c-format
+#~ msgid "this build does not support zstd compression"
+#~ msgstr "detta bygge stöder inte zstd-komprimering"
diff --git a/src/bin/pg_basebackup/po/tr.po b/src/bin/pg_basebackup/po/tr.po
new file mode 100644
index 0000000..92e0513
--- /dev/null
+++ b/src/bin/pg_basebackup/po/tr.po
@@ -0,0 +1,1535 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 9.2\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:46+0000\n"
+"PO-Revision-Date: 2019-05-28 13:56+0300\n"
+"Last-Translator: Abdullah G. GÃœLNER <agulner@gmail.com>\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/file_utils.c:81 ../../common/file_utils.c:183
+#: pg_receivewal.c:267 pg_recvlogical.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" dosyası durumlanamadı: %m"
+
+#: ../../common/file_utils.c:160 pg_receivewal.c:170
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" dizini açılamıyor: %m"
+
+#: ../../common/file_utils.c:194 pg_receivewal.c:338
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" dizini okunamıyor: %m"
+
+#: ../../common/file_utils.c:226 ../../common/file_utils.c:285
+#: ../../common/file_utils.c:359 pg_basebackup.c:1761
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" dosyası açılamıyor: %m"
+
+#: ../../common/file_utils.c:297 ../../common/file_utils.c:367
+#: pg_recvlogical.c:195
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" dosyası fsync hatası: %m"
+
+#: ../../common/file_utils.c:377
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" -- \"%s\" ad değiştirme hatası: %m"
+
+#: pg_basebackup.c:171
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "\"%s\" veri dizini siliniyor"
+
+#: pg_basebackup.c:173
+#, c-format
+msgid "failed to remove data directory"
+msgstr "veri dizini silme başarısız"
+
+#: pg_basebackup.c:177
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "\"%s\" veri dizininin içindekiler siliniyor"
+
+#: pg_basebackup.c:179
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "veri dizininin içindekileri silme işlemi başarısız"
+
+#: pg_basebackup.c:184
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "\"%s\" WAL dizini siliniyor"
+
+#: pg_basebackup.c:186
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "WAL dizini silme başarısız"
+
+#: pg_basebackup.c:190
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "\"%s\" WAL dizininin içindekiler siliniyor"
+
+#: pg_basebackup.c:192
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "WAL dizininin içindekileri silme işlemi başarısız"
+
+#: pg_basebackup.c:198
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "\"%s\" veri dizini kullanıcının isteği üzerine silinmedi"
+
+#: pg_basebackup.c:201
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "\"%s\" WAL dizini kullanıcının isteği üzerine silinmedi"
+
+#: pg_basebackup.c:205
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "tablespace dzinlerine yapılacak değişiklikler geri alınamayacak"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "directory name too long"
+msgstr "dizin adı çok uzun"
+
+#: pg_basebackup.c:256
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "tablespace eÅŸleÅŸtirmesinde birden fazla \"=\" iÅŸareti"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "geçersiz tablespace eşleştirme biçimi \"%s\", \"ESKIDIZIN=YENIDIZIN\" olmalı"
+
+#: pg_basebackup.c:280
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "tablespace eÅŸleÅŸtirmesinde eski dizin mutlak bir yol deÄŸil: %s"
+
+#: pg_basebackup.c:287
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "tablespace eÅŸleÅŸtirmesinde yeni dizin mutlak bir yol deÄŸil: %s"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s çalışan bir PostgreSQL sunucusunun temel yedeğini (base backup) alır. \n"
+"\n"
+
+#: pg_basebackup.c:328 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_basebackup.c:329 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [SEÇENEK]...\n"
+
+#: pg_basebackup.c:330
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Çıktıyı kontrol eden seçenekler: \n"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DİZİN temel yedeğin alınacağı dizin\n"
+
+#: pg_basebackup.c:332
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t çıktı formatı (düz metin(varsayılan), tar)\n"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=HIZ very dizinini aktarma için azami transfer hızı\n"
+" ( kB/s olarak , veya \"k\" ya da \"M\" sonekini kullanın)\n"
+
+#: pg_basebackup.c:335
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" replikasyon için yapılandırmayı yaz\n"
+
+#: pg_basebackup.c:337
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" eski dizindeki tablespace yerini NEWDIR yeni dizin olarak deÄŸiÅŸtir \n"
+
+#: pg_basebackup.c:339
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR write-ahead log dizini\n"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" gerekli WAL dosyalarını belirtilen yöntemle dahil et\n"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr ""
+" -z, --gzip tar çıktısını sıkıştır\n"
+"\n"
+
+#: pg_basebackup.c:343
+#, c-format
+msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr " -Z, --compress=0-9 tar çıktısını belirtilen sıkıştırma seviyesinde sıkıştır\n"
+
+#: pg_basebackup.c:344
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Genel seçenekler:\n"
+
+#: pg_basebackup.c:345
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" checkpoint iÅŸlemini fast ya da spread olarak ayarla\n"
+
+#: pg_basebackup.c:347
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot replikasyon slotu oluÅŸtur\n"
+
+#: pg_basebackup.c:348
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=ETÄ°KET yedek etiketini ayarla\n"
+
+#: pg_basebackup.c:349
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean hatalardan sonar temizlik yapma\n"
+
+#: pg_basebackup.c:350
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync değişikliklerin diske yazılmasını bekleme\n"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress ilerleme bilgisini göster\n"
+
+#: pg_basebackup.c:352 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTADI kullanılacak replikasyon slotu\n"
+
+#: pg_basebackup.c:353 pg_receivewal.c:93 pg_recvlogical.c:99
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose detaylı (verbose) mesajlar göster\n"
+
+#: pg_basebackup.c:354 pg_receivewal.c:94 pg_recvlogical.c:100
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot geçici replikasyon slotlarının oluşturulmasını engelle\n"
+
+#: pg_basebackup.c:356
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" sağlamaları (checksum) doğrulama\n"
+
+#: pg_basebackup.c:358 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_basebackup.c:359 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Bağlantı Seçenekleri:\n"
+
+#: pg_basebackup.c:360 pg_receivewal.c:98
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR bağlantı dizesi\n"
+
+#: pg_basebackup.c:361 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: pg_basebackup.c:362 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT veritabanı sunucusunun port numarası\n"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=SURE\n"
+" sunucuya yollanan durum paketleri arasındaki süre (saniye)\n"
+
+#: pg_basebackup.c:365 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: pg_basebackup.c:366 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password bağlanmak için parola sorma\n"
+
+#: pg_basebackup.c:367 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password şifre sor (otomatik olarak her zaman açık)\n"
+
+#: pg_basebackup.c:368 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "ready pipe'tan okunamadı: %m"
+
+#: pg_basebackup.c:417 pg_basebackup.c:545 pg_basebackup.c:2099
+#: streamutil.c:450
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "\"%s\" write-ahead log konumu ayrıştırılamadı"
+
+#: pg_basebackup.c:510 pg_receivewal.c:442
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "WAL dosyalarının yazılması bitirilemedi: %m"
+
+#: pg_basebackup.c:557
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "artalan süreçleri için pipe oluşturulamadı: %m"
+
+#: pg_basebackup.c:592
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "geçici replikasyon slotu \"%s\" oluşturuldu"
+
+#: pg_basebackup.c:595
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "replikasyon slotu \"%s\" oluÅŸturuldu"
+
+#: pg_basebackup.c:615 pg_basebackup.c:668 pg_basebackup.c:1503
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" dizini oluşturulamadı: %m"
+
+#: pg_basebackup.c:633
+#, c-format
+msgid "could not create background process: %m"
+msgstr "artalan süreci oluşturulamadı: %m"
+
+#: pg_basebackup.c:645
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "artalan iş parçacığı (thread) oluşturulamadı: %m"
+
+#: pg_basebackup.c:689
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" dizini mevcut, ama boÅŸ deÄŸil"
+
+#: pg_basebackup.c:696
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" dizine erişim hatası: %m"
+
+#: pg_basebackup.c:757
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s"
+
+#: pg_basebackup.c:769
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:785
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+
+#: pg_basebackup.c:809
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "\"%s\" aktarım hızı geçerli bir değer değil"
+
+#: pg_basebackup.c:814
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "geçersiz aktarım hızı \"%s\": %m"
+
+#: pg_basebackup.c:823
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "aktarım hızı sıfırdan büyük ya da eşit olmalı"
+
+#: pg_basebackup.c:855
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "geçersiz --max-rate (azami hız) birimi: \"%s\""
+
+#: pg_basebackup.c:862
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "\"%s\" aktarım hızı tamsayı aralığını aşıyor"
+
+#: pg_basebackup.c:872
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "\"%s\" aktarım hızı aralık dışındadır"
+
+#: pg_basebackup.c:894
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "\"%s\" sıkıştırılmış dosyasına yazılamadı: %s"
+
+#: pg_basebackup.c:904 pg_basebackup.c:1592 pg_basebackup.c:1767
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "\"%s\" dosyası yazma hatası: %m"
+
+#: pg_basebackup.c:969 pg_basebackup.c:989 pg_basebackup.c:1016
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "%d sıkıştırma seviyesi ayarlanamadı: %s"
+
+#: pg_basebackup.c:1036
+#, c-format
+msgid "could not create compressed file \"%s\": %s"
+msgstr "\"%s\" sıkıştırılmış dosyası yaratılamadı: %s"
+
+#: pg_basebackup.c:1047 pg_basebackup.c:1553 pg_basebackup.c:1779
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "\"%s\" dosyası oluşturulamıyor: %m"
+
+#: pg_basebackup.c:1058 pg_basebackup.c:1412
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "COPY veri akımı (stream) alınamadı: %s"
+
+#: pg_basebackup.c:1143
+#, c-format
+msgid "could not close compressed file \"%s\": %s"
+msgstr "\"%s\" sıkıştırılmış dosyası kapatılamadı: %s"
+
+#: pg_basebackup.c:1155 pg_recvlogical.c:608
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" dosyası kapatılamıyor: %m"
+
+#: pg_basebackup.c:1166 pg_basebackup.c:1441 pg_recvlogical.c:437
+#: receivelog.c:968
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "COPY verisi okunamadı: %s"
+
+#: pg_basebackup.c:1455
+#, c-format
+msgid "invalid tar block header size: %d"
+msgstr "geçersiz tar blok başlık boyutu: %d"
+
+#: pg_basebackup.c:1510
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "dizin \"%s\" için erişim hakları ayarlanamadı: %m"
+
+#: pg_basebackup.c:1533
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "\"%s\" dosyasından \"%s\" dosyasına sembolik bağlantı oluşturulamadı: %m"
+
+#: pg_basebackup.c:1540
+#, c-format
+msgid "unrecognized link indicator \"%c\""
+msgstr "tanımlanamayan bağlantı göstergesi \"%c\""
+
+#: pg_basebackup.c:1559
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "\"%s\" dosyasının erişim hakları atanamıyor: %m"
+
+#: pg_basebackup.c:1616
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY akımı (stream) son dosya tamamlanmadan sona erdi"
+
+#: pg_basebackup.c:1643 pg_basebackup.c:1663 pg_basebackup.c:1677
+#: pg_basebackup.c:1728
+#, c-format
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: pg_basebackup.c:1820
+#, c-format
+msgid "incompatible server version %s"
+msgstr "uyumsuz sunucu sürümü %s"
+
+#: pg_basebackup.c:1835
+#, c-format
+msgid "HINT: use -X none or -X fetch to disable log streaming"
+msgstr "İPUCU: log akışını (streaming) devre dışı bırakmak için -X none veya -X fetch kullanın"
+
+#: pg_basebackup.c:1860
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "yedekleme (base backup) başlatılıyor, checkpoint işleminin tamamlanması bekleniyor"
+
+#: pg_basebackup.c:1884 pg_recvlogical.c:264 receivelog.c:484 receivelog.c:533
+#: receivelog.c:572 streamutil.c:299 streamutil.c:370 streamutil.c:422
+#: streamutil.c:533 streamutil.c:578
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "\"%s\" replikasyon komutu gönderilemedi: %s"
+
+#: pg_basebackup.c:1895
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "yedek (base backup) başlatılamadı: %s"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "sunucu BASE_BACKUP komutuna beklenmedik cevap döndü; %d satır ve %d alan alındı, %d satır ve %d alan bekleniyordu"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "checkpoint completed"
+msgstr "checkpoint tamamlandı"
+
+#: pg_basebackup.c:1924
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "write-ahead log başlama noktası: %2$u zaman çizelgesinde %1$s"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "yedek başlığı alınamadı: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "no data returned from server"
+msgstr "sunucudan veri dönmedi"
+
+#: pg_basebackup.c:1970
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "stdout'a sadece bir tablespace yazılabilir, veritabanında %d var"
+
+#: pg_basebackup.c:1982
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "artalan WAL alıcısı başlatılıyor"
+
+#: pg_basebackup.c:2012
+#, c-format
+msgid "could not get write-ahead log end position from server: %s"
+msgstr "sunucudan write-ahead log bitiş pozisyonu alınamadı: %s"
+
+#: pg_basebackup.c:2018
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "sunucudan write-ahead log bitiş pozisyonu dönmedi"
+
+#: pg_basebackup.c:2023
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "write-ahead log bitiş noktası (end point): %s"
+
+#: pg_basebackup.c:2034
+#, c-format
+msgid "checksum error occurred"
+msgstr "sağlama (checksum) hatası oluştu"
+
+#: pg_basebackup.c:2039
+#, c-format
+msgid "final receive failed: %s"
+msgstr "son alma işlemi başarısız oldu: %s"
+
+#: pg_basebackup.c:2063
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "artalan sürecinin akımı (streaming) bitirmesi bekleniyor ..."
+
+#: pg_basebackup.c:2068
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "artalan pipe'ına komut gönderilemedi: %m"
+
+#: pg_basebackup.c:2076
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "alt süreç için beklenemedi: %m"
+
+#: pg_basebackup.c:2081
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "alt süreç %d sonlandı, beklenen %d"
+
+#: pg_basebackup.c:2086 streamutil.c:94
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2111
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "alt iş parçacığı (thread) için beklenemedi: %m"
+
+#: pg_basebackup.c:2117
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "alt iş parçacığı (thread) bitiş durumu alınamadı %m"
+
+#: pg_basebackup.c:2122
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "alt iş parçacığı (thread) %u hata kodu ile sonlandı"
+
+#: pg_basebackup.c:2150
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "veri diske yazılıyor (syncing) ... "
+
+#: pg_basebackup.c:2163
+#, c-format
+msgid "base backup completed"
+msgstr "temel (base) yedek tamamlandı"
+
+#: pg_basebackup.c:2244
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"\n"
+msgstr "geçersiz çıktı biçimi \"%s\", \"plain\" ya da \"tar\" olmalı\n"
+
+#: pg_basebackup.c:2288
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "geçersiz wal-yöntemi seçeneği \"%s\", \"fetch\", \"stream\" ya da \"none\" olmalı"
+
+#: pg_basebackup.c:2316
+#, c-format
+msgid "invalid compression level \"%s\"\n"
+msgstr "geçersiz sıkıştırma seviyesi \"%s\"\n"
+
+#: pg_basebackup.c:2327
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "geçersiz checkpoint argümanı \"%s\", \"fast\" ya da \"spread\" olmalı"
+
+#: pg_basebackup.c:2354 pg_receivewal.c:556 pg_recvlogical.c:796
+#, c-format
+msgid "invalid status interval \"%s\""
+msgstr "geçersiz durum aralığı \"%s\""
+
+#: pg_basebackup.c:2372 pg_basebackup.c:2385 pg_basebackup.c:2396
+#: pg_basebackup.c:2407 pg_basebackup.c:2415 pg_basebackup.c:2423
+#: pg_basebackup.c:2433 pg_basebackup.c:2446 pg_basebackup.c:2454
+#: pg_basebackup.c:2465 pg_basebackup.c:2475 pg_receivewal.c:606
+#: pg_receivewal.c:619 pg_receivewal.c:627 pg_receivewal.c:637
+#: pg_receivewal.c:645 pg_receivewal.c:656 pg_recvlogical.c:822
+#: pg_recvlogical.c:835 pg_recvlogical.c:846 pg_recvlogical.c:854
+#: pg_recvlogical.c:862 pg_recvlogical.c:870 pg_recvlogical.c:878
+#: pg_recvlogical.c:886 pg_recvlogical.c:894
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Ayrıntılı bilgi için \"%s --help\" komutunu deneyebilirsiniz.\n"
+
+#: pg_basebackup.c:2383 pg_receivewal.c:617 pg_recvlogical.c:833
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı girdisi var (ilki \"%s\")"
+
+#: pg_basebackup.c:2395 pg_receivewal.c:655
+#, c-format
+msgid "no target directory specified"
+msgstr "hedef dizin belirtilmedi"
+
+#: pg_basebackup.c:2406
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "sadece tar mod yedekleri sıkıştırılabilir"
+
+#: pg_basebackup.c:2414
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "tar modunda write-ahead logları stdout'a stream edilemiyor"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "replikasyon slotları sadece WAL streaming ile kullanılabilir"
+
+#: pg_basebackup.c:2432
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot slot adıyla birlikte kullanılamaz"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2444 pg_receivewal.c:635
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s bir slotun --slot kullanılarak tanımlanmasını gerektirir"
+
+#: pg_basebackup.c:2453
+#, c-format
+msgid "--create-slot and --no-slot are incompatible options"
+msgstr "--create-slot ve --no-slot uyumsuz seçeneklerdir"
+
+#: pg_basebackup.c:2464
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL dizini lokasyonu sadece plain modunda belitrilebilir"
+
+#: pg_basebackup.c:2474
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL dizini mutlak bir yol olmalıdır"
+
+#: pg_basebackup.c:2484 pg_receivewal.c:664
+#, c-format
+msgid "this build does not support compression"
+msgstr "bu kurulum sıkıştırmayı desteklemiyor"
+
+#: pg_basebackup.c:2538
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" oluşturma hatası: %m"
+
+#: pg_basebackup.c:2542
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "bu platformda sembolik bağlantı (symlink) desteklenmemektedir"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s stream eden PostgreSQL write-ahead loglarını alır.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIZIN write-ahead logları bu dizine al\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr ""
+" -E, --endpos=LSN belirtilen LSN alındıktan sonra çık\n"
+"\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists zaten mevcut olan bir slot oluşturulmaya çalışıldığında hata verme\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop bağlantı sunucusunda loop yapma\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync değişikliklerin diske yazılmasını bekleme\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" sunucuya yollanan durum paketleri arasındaki süre (varsayılan: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous write-ahead logu yazıldıktan hemen sonra temizle\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+msgstr " -Z, --compress=0-9 logları belirtilen sıkıştırma seviyesinde sıkıştır\n"
+
+#: pg_receivewal.c:104
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Opsiyonel eylemler:\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot yeni bir replikasyon slotu oluştur(slotun adı için bkz. --slot)\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot replikasyon slotunu sil (slotun adı için bkz. --slot)\n"
+
+#: pg_receivewal.c:118
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "segment %X/%X de bitirildi (zaman çizelgesi %u)"
+
+#: pg_receivewal.c:125
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "log streaming %X/%X de durduruldu (zaman çizelgesi %u)"
+
+#: pg_receivewal.c:141
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "%2$X/%3$X konumunda%1$u zaman çizelgesine geçildi"
+
+#: pg_receivewal.c:151
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "kesme sinyali alındı, çıkılıyor"
+
+#: pg_receivewal.c:187
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" dizini kapatılamadı: %m"
+
+#: pg_receivewal.c:273
+#, c-format
+msgid "segment file \"%s\" has incorrect size %d, skipping"
+msgstr "\"%s\" segment dosyasının boyutu %d yanlış, atlanıyor"
+
+#: pg_receivewal.c:291
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "\"%s\" sıkıştırılmış dosyası açılamadı: %m"
+
+#: pg_receivewal.c:297
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "\"%s\" sıkıştırılmış dosyasında arama yapılamadı: %m"
+
+#: pg_receivewal.c:305
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "\"%s\" sıkıştırılmış dosyası okunamadı: %m"
+
+#: pg_receivewal.c:308
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "\"%1$s\" sıkıştırılmış dosyası okuma hatası: %3$zu nun %2$d si okundu"
+
+#: pg_receivewal.c:319
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "%s sıkıştırılmış segment dosyasının sıkıştırılmamış boyutu %d yanlış, atlanıyor"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "%X/%X de log streaming başlatılıyor (zaman çizelgesi %u)"
+
+#: pg_receivewal.c:538 pg_recvlogical.c:738
+#, c-format
+msgid "invalid port number \"%s\""
+msgstr "geçersiz port numarası \"%s\""
+
+#: pg_receivewal.c:566 pg_recvlogical.c:764
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "\"%s\" bitiş pozisyonu ayrıştırılamadı"
+
+#: pg_receivewal.c:581
+#, c-format
+msgid "invalid compression level \"%s\""
+msgstr "geçersiz sıkıştırma seviyesi \"%s\""
+
+#: pg_receivewal.c:626
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "--create-slot ile --drop-slot beraber kullanılamaz"
+
+#: pg_receivewal.c:644
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "--synchronous ile --no-sync beraber kullanılamaz"
+
+#: pg_receivewal.c:720
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "\"%s\" slotunu kullanan replikasyon bağlantısı beklenmedik şekilde veritabanı spesifik"
+
+#: pg_receivewal.c:731 pg_recvlogical.c:942
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "\"%s\" replikasyon slotu siliniyor"
+
+#: pg_receivewal.c:742 pg_recvlogical.c:952
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "\"%s\" replikasyon slotu oluÅŸturuluyor"
+
+#: pg_receivewal.c:768 pg_recvlogical.c:977
+#, c-format
+msgid "disconnected"
+msgstr "bağlantı kesildi"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:774 pg_recvlogical.c:983
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "bağlantı kesildi; tekrar denemek için %d saniye bekleniyor"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr "%s PostgreSQL mantıksal kod çözme akımlarını (stream) kontrol eder\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Gerçekleştirilecek eylem:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start bir replikasyon slotunda streaming'i başlat (slotun ismi için bkz. --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr ""
+" -f, --file=DOSYAADI logu bu dosyaya al, - stdout için\n"
+" \n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SANIYE\n"
+" çıktı dosyasına yapılan fsync işlemleri arasındaki, süre (varsayılan: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN mevcut bir slot'ta streaming işşleminin başlayacağı konum\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" çıktı eklentisine NAME seçeneğini VALUE opsiyonel\n"
+" değeriyle geçir\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=EKLENTI EKLENTI çıktı eklentisini kullan(varsayılan: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTADI mantıksal replikasyon slot'unun adı\n"
+
+#: pg_recvlogical.c:103
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=VERITABANI_ADI bağlanılacak veritabanı adı\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "%X/%X e kadar yazma, %X/%X'e kadar boşaltma (flush) için onaylama (slot %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:346
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "geribesleme (feedback) paketi gönderilemedi: %s"
+
+#: pg_recvlogical.c:232
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "%X/%X de log streaming işlemi başlatılıyor (slot %s)"
+
+#: pg_recvlogical.c:273
+#, c-format
+msgid "streaming initiated"
+msgstr "streaming işlemi başlatıldı"
+
+#: pg_recvlogical.c:337
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" log dosyası açılamadı: %m"
+
+#: pg_recvlogical.c:363 receivelog.c:876
+#, c-format
+msgid "invalid socket: %s"
+msgstr "geçersiz soket: %s"
+
+#: pg_recvlogical.c:416 receivelog.c:904
+#, c-format
+msgid "select() failed: %m"
+msgstr "select() başarısız oldu: %m"
+
+#: pg_recvlogical.c:423 receivelog.c:954
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "Sunucudan WAL stream alınamadı: %s"
+
+#: pg_recvlogical.c:465 pg_recvlogical.c:516 receivelog.c:998 receivelog.c:1064
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "streaming üst bilgisi (header) çok küçük: %d"
+
+#: pg_recvlogical.c:500 receivelog.c:836
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "tanınmayan streaming üst bilgisi (header): \"%c\""
+
+#: pg_recvlogical.c:554 pg_recvlogical.c:566
+#, c-format
+msgid "could not write %u bytes to log file \"%s\": %m"
+msgstr "%u bayt \"%s\" log dosyasına yazılamadı: %m"
+
+#: pg_recvlogical.c:594 receivelog.c:632 receivelog.c:669
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "replikasyon akımında (stream) beklenmeyen sonlanma: %s"
+
+#: pg_recvlogical.c:718
+#, c-format
+msgid "invalid fsync interval \"%s\""
+msgstr "geçersiz fsync süresi \"%s\""
+
+#: pg_recvlogical.c:756
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "\"%s\" başlama pozisyonu ayrıştırılamadı"
+
+#: pg_recvlogical.c:845
+#, c-format
+msgid "no slot specified"
+msgstr "slot belirtilmedi"
+
+#: pg_recvlogical.c:853
+#, c-format
+msgid "no target file specified"
+msgstr "hedef dosya belirtilmedi"
+
+#: pg_recvlogical.c:861
+#, c-format
+msgid "no database specified"
+msgstr "veritabanı belirtilmedi"
+
+#: pg_recvlogical.c:869
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "en az bir eylem belirtilmesi gerekiyor"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create slot veya --start together --drop slot ile beraber kullanılamaz"
+
+#: pg_recvlogical.c:885
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create slot veya --drop slot --startpos ile beraber kullanılamaz"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos sadece --start ile birlikte belirtilebilir"
+
+#: pg_recvlogical.c:924
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "veritabanına özel replikasyon bağlantısı kurulamadı"
+
+#: pg_recvlogical.c:1023
+#, c-format
+msgid "endpos %X/%X reached by keepalive"
+msgstr "keepalive tarafından endpos %X/%X'a ulaşıldı"
+
+#: pg_recvlogical.c:1026
+#, c-format
+msgid "endpos %X/%X reached by record at %X/%X"
+msgstr "%3$X/%4$X deki kayıt tarafından endpos %1$X/%2$X'e ulaşıldı"
+
+#: receivelog.c:72
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "\"%s\" arşiv durum dosyası oluşturulamadı: %s"
+
+#: receivelog.c:119
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "\"%s\" write-ahead log dosyasının boyutu alınamadı: %s"
+
+#: receivelog.c:129
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "\"%s\" mevcut write-ahead log dosyası açılamadı: %s"
+
+#: receivelog.c:137
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "\"%s\" mevcut write-ahead log dosyası fsync edilemedi: %s"
+
+#: receivelog.c:151
+#, c-format
+msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d"
+msgstr[0] "\"%s\" write-ahead log dosyası %d bayt, 0 veya %d olmalı"
+
+#: receivelog.c:166
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "\"%s\" write-ahead log dosyası açma hatası: %s"
+
+#: receivelog.c:192
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "\"%s\" dosyasınde arama pozisyonu belirlenemedi: %s"
+
+#: receivelog.c:206
+#, c-format
+msgid "not renaming \"%s%s\", segment is not complete"
+msgstr "\"%s%s\" isim değişikliği yapılmıyor, segment tamam değil"
+
+#: receivelog.c:218 receivelog.c:303 receivelog.c:678
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "\"%s\" dosyası kapatılamadı: %s"
+
+#: receivelog.c:275
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "sunucu %u zaman çizelgesi için beklenmeyen geçmiş dosyası adı bildirdi: %s"
+
+#: receivelog.c:283
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "\"%s\" zaman çizelgesi geçmiş dosyası yaratılamadı: %s"
+
+#: receivelog.c:290
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "\"%s\" zaman çizelgesi geçmiş dosyasına yazılamadı: %s"
+
+#: receivelog.c:380
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "uyumsuz sunucu sürümü %s; istemci %s den daha eski sunucu sürümlerinden streaming işlemini desteklemiyor"
+
+#: receivelog.c:389
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "uyumsuz sunucu sürümü %s; istemci %s den daha yeni sunucu sürümlerinden streaming işlemini desteklemiyor"
+
+#: receivelog.c:491 streamutil.c:430 streamutil.c:467
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "sistem belirlenemedi: %d satır ve %d alan alındı, beklenen %d satır ve %d veya daha fazla alan"
+
+#: receivelog.c:498
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "system tanımlayıcısı temel yedek ve streaming bağlantısı ile eşleşmiyor"
+
+#: receivelog.c:504
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "başlama zaman çizelgesi %u sunucuda mevcut değil"
+
+#: receivelog.c:545
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "TIMELINE_HISTORY komutuna beklenmedik cevap; %d satır ve %d alan alındı, %d satır ve %d alan bekleniyordu"
+
+#: receivelog.c:616
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "sunucu %2$u zaman çizelgesini takiben beklenmedik sonraki zaman çizelgesi %1$u bildirdi"
+
+#: receivelog.c:622
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "sunucu %u streaming zaman çizelgesini %X/%X de durdurdu, fakat sonraki %u zaman çizelgesinin %X/%X de başlayacağını bildirdi"
+
+#: receivelog.c:662
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "replikasyon akımı durma nokatasından önce sonlandırıldı"
+
+#: receivelog.c:708
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "zaman çizelgesi sonundan sonra beklenmedik sonuç kümesi: %d satır ve %d alan alındı, %d satır ve %d alan bekleniyordu"
+
+#: receivelog.c:717
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "bir sonraki zaman çizelgesinin (timeline) başlama noktası \"%s\" ayrıştırılamadı"
+
+#: receivelog.c:766 receivelog.c:1018
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "\"%s\" dosyası fsync hatası: %s"
+
+#: receivelog.c:1081
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "açık dosya yokken %u offset için write-ahead log kaydı alındı"
+
+#: receivelog.c:1091
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "%08x WAL data offset'i alındı , %08x bekleniyordu"
+
+#: receivelog.c:1125
+#, c-format
+msgid "could not write %u bytes to WAL file \"%s\": %s"
+msgstr "%u bayt, \"%s\" WAL dosyasına yazılamadı: %s"
+
+#: receivelog.c:1150 receivelog.c:1190 receivelog.c:1221
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "copy-end paketi gönderilemedi: %s"
+
+#: streamutil.c:162
+msgid "Password: "
+msgstr "Åžifre: "
+
+#: streamutil.c:187
+#, c-format
+msgid "could not connect to server"
+msgstr "sunucuya bağlanamadı"
+
+#: streamutil.c:204
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "sunucuya bağlanamadı: %s"
+
+#: streamutil.c:233
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path temizlenemedi: %s"
+
+#: streamutil.c:249
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "integer_datetimes için sunucu ayarı belirlenemedi"
+
+#: streamutil.c:256
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes derleme seçeneği sunucu ile eşleşmiyor"
+
+#: streamutil.c:307
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "WAL segment boyutu belirlenemedi: %d satır ve %d alan alındı, %d satır ve %d veya daha fazla alan bekleniyordu"
+
+#: streamutil.c:317
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "WAL segment boyutu ayrıştırılamadı"
+
+#: streamutil.c:332
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat uzak sunucu %d bayt bildirdi"
+
+#: streamutil.c:378
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "grup erişim ayarı belirlenemedi: %d satır ve %d alan alındı, %d satır ve %d veya daha fazla alan bekleniyordu"
+
+#: streamutil.c:387
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "grup erişim ayarı ayrıştırılamadı: %s"
+
+#: streamutil.c:544
+#, c-format
+msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "\"%s\" replikasyon slot'u oluşturulamadı: %d satır ve %d alan alındı,%d satır ve %d alan bekleniyordu"
+
+#: streamutil.c:588
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "\"%s\" replikasyon slot'u silinemedi: %d satır ve %d alan alındı, %d satır ve %d alan bekleniyordu"
+
+#: walmethods.c:439 walmethods.c:928
+msgid "could not compress data"
+msgstr "veri sıkıştırılamadı"
+
+#: walmethods.c:471
+msgid "could not reset compression stream"
+msgstr "sıkıştırma akımı sıfırlanamadı (reset)"
+
+#: walmethods.c:569
+msgid "could not initialize compression library"
+msgstr "sıkıştırma kütüphanesi ilklendirilemedi"
+
+#: walmethods.c:581
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "uygulama hatası: tar dosyalarının birden fazla açık dosyası olamaz"
+
+#: walmethods.c:595
+msgid "could not create tar header"
+msgstr "tar başlığı (header) oluşturulamadı"
+
+#: walmethods.c:609 walmethods.c:649 walmethods.c:844 walmethods.c:855
+msgid "could not change compression parameters"
+msgstr "sıkıştırma parametreleri değiştirilemedi"
+
+#: walmethods.c:731
+msgid "unlink not supported with compression"
+msgstr "unlink, sıkıştırma seçeneği ile desteklenmiyor"
+
+#: walmethods.c:953
+msgid "could not close compression stream"
+msgstr "sıkıştırma akımı kapatılamadı"
+
+#~ msgid "%s: no start point returned from server\n"
+#~ msgstr "%s:sunucudan bir başlangıç noktası dönmedi\n"
+
+#~ msgid "%s: could not parse file mode\n"
+#~ msgstr "%s: dosya modu ayıklanamadı\n"
+
+#~ msgid "%s: could not parse file size\n"
+#~ msgstr "%s: dosya boyutu ayıklanamadı\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini gösterir ve çıkar\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı gösterir ve çıkar\n"
+
+#~ msgid "%s: could not clear search_path: %s"
+#~ msgstr "%s: search_path temizlenemedi: %s"
+
+#~ msgid "%s: could not connect to server: %s"
+#~ msgstr "%s: sunucuya bağlanılamadı: %s"
+
+#~ msgid "%s: could not connect to server\n"
+#~ msgstr "%s: sunucuya bağlanılamadı\n"
+
+#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"
+#~ msgstr "%s: sistem belirlenemedi: %d satır ve %d alan alındı, %d satır ve %d veya daha fazla alan bekleniyordu\n"
+
+#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" write-ahead log dosyası açılamadı: %s\n"
+
+#~ msgid "%s: could not create archive status file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" arşiv durum dosyası oluşturulamadı: %s\n"
+
+#~ msgid "%s: could not receive data from WAL stream: %s"
+#~ msgstr "%s: WAL stream'den veri alınamadı: %s"
+
+#~ msgid "%s: select() failed: %s\n"
+#~ msgstr "%s: select() başarısız oldu: %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" kayıt dosyası açılamıyor: %s\n"
+
+#~ msgid "%s: could not fsync log file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası fsync edilemiyor: %s\n"
+
+#~ msgid "%s: invalid port number \"%s\"\n"
+#~ msgstr "%s: geçersiz port numarası: \"%s\"\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini kapatılamadı: %s\n"
+
+#~ msgid "%s: symlinks are not supported on this platform\n"
+#~ msgstr "%s: bu platformda sembolik bağlantı (symlink) desteklenmemektedir\n"
+
+#~ msgid "%s: could not create symbolic link \"%s\": %s\n"
+#~ msgstr "%s: symbolic link \"%s\" oluşturma hatası: %s\n"
+
+#~ msgid "%s: child process exited with error %d\n"
+#~ msgstr "%s: alt süreç %d hata kodu ile sonlandı\n"
+
+#~ msgid "%s: child process did not exit normally\n"
+#~ msgstr "%s: alt süreç normal olarak sonlanmadı\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: yetersiz bellek\n"
+
+#~ msgid "%s: could not set permissions on file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasının izinleri ayarlanamadı: %s\n"
+
+#~ msgid "%s: could not set permissions on directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizininde izinler ayarlanamadı: %s\n"
+
+#~ msgid "%s: could not close file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası kapatılamadı: %s\n"
+
+#~ msgid "%s: could not create file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası yaratılamadı: %s\n"
+
+#~ msgid "%s: could not write to file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\":dosyasına yazılamadı: %s\n"
+
+#~ msgid "%s: could not access directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizine erişim hatası: %s\n"
+
+#~ msgid "%s: could not create directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini oluşturma başarısız: %s\n"
+
+#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasının ismi \"%s\" olarak değiştirilemedi : %s\n"
+
+#~ msgid "%s: could not fsync file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası fsync işlemi başarısız: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası açılamadı: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini okuma başarısız: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini açılamadı: %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasının durumu görüntülenemedi (stat): %s\n"
diff --git a/src/bin/pg_basebackup/po/uk.po b/src/bin/pg_basebackup/po/uk.po
new file mode 100644
index 0000000..91dfe4e
--- /dev/null
+++ b/src/bin/pg_basebackup/po/uk.po
@@ -0,0 +1,1751 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:18+0000\n"
+"PO-Revision-Date: 2023-12-19 15:37\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_basebackup.pot\n"
+"X-Crowdin-File-ID: 949\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "знайдено порожній Ñ€Ñдок, де очікувавÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ÑтиÑканнÑ"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" потребує значеннÑ"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути цілим чиÑлом"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути логічним значеннÑм"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" не приймає рівень ÑтиÑканнÑ"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d (за замовчуваннÑм %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не приймає кількіÑÑ‚ÑŒ працівників"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не підтримує режим довгої відÑтані"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не вдалоÑÑ fsync файл \"%s\": %m"
+
+#: ../../common/file_utils.c:379 pg_basebackup.c:2238 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1610
+#, c-format
+msgid "out of memory"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1407 pg_basebackup.c:1701
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "неможливо запиÑати до файлу \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1471 pg_basebackup.c:1680
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "неможливо Ñтворити файл \"%s\": %m"
+
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "неочікуваний Ñтан під Ñ‡Ð°Ñ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ"
+
+#: bbstreamer_file.c:320 pg_basebackup.c:687 pg_basebackup.c:731
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m"
+
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñтановити права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ \"%s\": %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ Ð· \"%s\" на \"%s\": %m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñтановити права на файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити ÑтиÑнутий файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "не вдалоÑÑ Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ stdout: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити рівень ÑтиÑÐºÐ°Ð½Ð½Ñ %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до ÑтиÑнутого файлу \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑканнÑ"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "неочікуваний Ñтан під Ñ‡Ð°Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ відновленнÑ"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ ÑтиÑÐ½ÐµÐ½Ð½Ñ lz4: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати заголовок lz4: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не вдалоÑÑ ÑтиÑнути дані: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚Ð¸ ÑтиÑÐºÐ°Ð½Ð½Ñ lz4: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑненнÑ: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "причіп файлу tar перевищує 2 блоки"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "неочікуваний Ñтан під Ñ‡Ð°Ñ Ñ€Ð¾Ð·Ð±Ð¾Ñ€Ñƒ архіву tar"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "чаÑтина tar міÑтить порожню назву"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "потік COPY завершивÑÑ Ð´Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ñтаннього файлу"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ ÑтиÑÐ½ÐµÐ½Ð½Ñ zstd"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити рівень ÑтиÑÐºÐ°Ð½Ð½Ñ zstd на %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити кількіÑÑ‚ÑŒ процеÑів ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° %d: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "не вдалоÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ режим довгої відÑтані: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ zstd декомпреÑÑ–Ñ—"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\""
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\""
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ WAL директорії \"%s\""
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ директорію WAL"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії WAL \"%s\""
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії WAL"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… \"%s\" не видалена за запитом кориÑтувача"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ WAL \"%s\" не видалена за запитом кориÑтувача"
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "зміни в каталогах табличних проÑторів незворотні"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "ім'Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ— задовге"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "кілька знаків \"=\" зіÑтавленні табличних проÑторів"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "неприпуÑтимий табличний проÑÑ‚Ñ–Ñ€ зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ \"%s\", має бути \"OLDDIR = NEWDIR\""
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "Ñтарий каталог не Ñ” абÑолютним шлÑхом у зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "новий каталог не Ñ” абÑолютним шлÑхом у зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid "%s takes a base backup of a running PostgreSQL server.\n\n"
+msgstr "%s робить базову резервну копію працюючого Ñервера PostgreSQL.\n\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s: [OPTION]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid "\n"
+"Options controlling the output:\n"
+msgstr "\n"
+"Параметри, що контролюють вивід:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, -- pgdata=DIRECTORY директоріÑ, в Ñку зберегти резервну копію бази\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|Ñ‚ формат виводу (звичайний за замовчуваннÑм, tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr " -r, --max-rate=RATE макÑимальна швидкіÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… до директорії\n"
+" (у кБ/Ñ Ð°Ð±Ð¾ з викориÑтаннÑм ÑуфікÑів \"k\" або \"Ðœ\")\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid " -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr " -R, --write-recovery-conf\n"
+" запиÑати конфігурацію Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid " -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr " -t, --target=TARGET[:DETAIL]\n"
+" ціль резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ (Ñкщо не клієнт)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid " -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr " -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" перенеÑÑ‚b табличний проÑÑ‚Ñ–Ñ€ з OLDDIR до NEWDIR\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr "--waldir=WALDIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ попереднього запиÑу\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid " -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr " -X, --wal-method=none|fetch|stream\n"
+" додати необхідні WAL файли за допомогою вказаного методу\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip ÑтиÑнути вихідний tar\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" ÑтиÑкати на клієнті або Ñервері, Ñк зазначено\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none не ÑтиÑкати вивід tar\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid "\n"
+"General options:\n"
+msgstr "\n"
+"ОÑновні налаштуваннÑ:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid " -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr " -c, --checkpoint=fast|spread\n"
+" режим швидких або розділених контрольних точок\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot Ñтворити Ñлот Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL вÑтановити мітку резервної копії\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean не очищати піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… на диÑку\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress відображати інформацію про прогреÑ\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=ИМ'Я_СЛОТРвикориÑтовувати вказаний Ñлот реплікації\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose виводити детальні повідомленнÑ\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr " --manifest-checksums=SHA{224,256,384,512}|CRC32C|ÐЕ\n"
+" викориÑтовувати алгоритм Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум маніфеÑту\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid " --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr " --manifest-force-encode\n"
+" кодувати у hex вÑÑ– імена файлів у маніфеÑÑ‚Ñ–\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size не оцінювати розмір резервної копії на Ñтороні Ñервера\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest пропуÑтити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту резервного копіюваннÑ\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot не Ñтворювати тимчаÑового Ñлоту реплікації\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid " --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr " --no-verify-checksums\n"
+" не перевірÑти контрольні Ñуми\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR Ñ€Ñдок з'єднаннÑ\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT порт Ñервера бази даних\n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid " -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr " -s, --status-interval=INTERVAL чаÑу між пакетами ÑтатуÑу до Ñервера (у Ñекундах)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME підключатиÑÑŒ Ñк вказаний кориÑтувач бази даних\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не питати пароль\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password обов'Ñзково питати пароль (повинно відбуватиÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "не можливо прочитати з готових каналів: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2152
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ наперед журнал локації \"%s\""
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "не можливо закінчити напиÑÐ°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² WAL: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "не можливо Ñтворити канал Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ процеÑу: %m"
+
+#: pg_basebackup.c:665
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "Ñтворено Ñлот тимчаÑових реплікацій \"%s\""
+
+#: pg_basebackup.c:668
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "Ñтворено Ñлот реплікацій \"%s\""
+
+#: pg_basebackup.c:702
+#, c-format
+msgid "could not create background process: %m"
+msgstr "не можливо Ñтворити фоновий процеÑ: %m"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "не можливо Ñтворити фоновий потік: %m"
+
+#: pg_basebackup.c:750
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній"
+
+#: pg_basebackup.c:756
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доÑтупу до каталогу \"%s\": %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d табличний проÑÑ‚Ñ–Ñ€ %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d табличних проÑтори %*s"
+msgstr[2] "%*s/%s kB (100%%), %d/%d табличних проÑторів %*s"
+msgstr[3] "%*s/%s kB (100%%), %d/%d табличних проÑторів %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d табличний проÑÑ‚Ñ–Ñ€ (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d табличних проÑтори (%s%-*.*s)"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d табличних проÑторів (%s%-*.*s)"
+msgstr[3] "%*s/%s kB (%d%%), %d/%d табличних проÑторів (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d табличний проÑÑ‚Ñ–Ñ€"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d табличних проÑтори"
+msgstr[2] "%*s/%s kB (%d%%), %d/%d табличних проÑторів"
+msgstr[3] "%*s/%s kB (%d%%), %d/%d табличних проÑторів"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "чаÑтота передач \"%s\" не Ñ” припуÑтимим значеннÑм"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "неприпуÑтима чаÑтота передач \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "чаÑтота передач повинна бути більша за нуль"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "неприпуÑтима Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð²Ð¸Ð¼Ñ–Ñ€Ñƒ в --max-rate: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "швидкіÑÑ‚ÑŒ передачі \"%s\" перевищує діапазон цілого чиÑла"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "швидкіÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ \"%s\" поза діапазоном"
+
+#: pg_basebackup.c:996
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ потік даних COPY: %s"
+
+#: pg_basebackup.c:1013 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дані COPY: %s"
+
+#: pg_basebackup.c:1017
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "фоновий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½ÐµÑподівано перервано"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "неможливо підÑтавити маніфеÑÑ‚ в ÑтиÑнений tar-файл"
+
+#: pg_basebackup.c:1089
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "ВикориÑтайте ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° клієнті та Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… в каталог заміÑÑ‚ÑŒ Ñтандартного виводу, або викориÑтайте %s."
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "неможливо розібрати архів \"%s\""
+
+#: pg_basebackup.c:1106
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "Тільки архів tar може бути проаналізований."
+
+#: pg_basebackup.c:1108
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "ПроÑтий формат потребує обробки архіву в pg_basebackup Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸."
+
+#: pg_basebackup.c:1110
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ - в ÑкоÑÑ‚Ñ– вихідного каталогу потребує pg_basebackup Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ архіву."
+
+#: pg_basebackup.c:1112
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "Параметр -R потребує викориÑÑ‚Ð°Ð½Ð½Ñ pg_basebackup Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ архіву."
+
+#: pg_basebackup.c:1331
+#, c-format
+msgid "archives must precede manifest"
+msgstr "архіви повинні передувати маніфеÑту"
+
+#: pg_basebackup.c:1346
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "неприпуÑтиме ім'Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ: \"%s\""
+
+#: pg_basebackup.c:1418
+#, c-format
+msgid "unexpected payload data"
+msgstr "неочікувані дані кориÑного навантаженнÑ"
+
+#: pg_basebackup.c:1561
+#, c-format
+msgid "empty COPY message"
+msgstr "порожнє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ COPY"
+
+#: pg_basebackup.c:1563
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ COPY з типом %d, довжина %zu"
+
+#: pg_basebackup.c:1761
+#, c-format
+msgid "incompatible server version %s"
+msgstr "неÑуміÑна верÑÑ–Ñ Ñерверу %s"
+
+#: pg_basebackup.c:1777
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "ВикориÑтайте -X none або -X fetch, щоб вимкнути потокову передачу журналу."
+
+#: pg_basebackup.c:1845
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "цілі резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ верÑією Ñервера"
+
+#: pg_basebackup.c:1848
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ може бути запиÑана під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ð»Ñ– резервного копіюваннÑ"
+
+#: pg_basebackup.c:1875
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "Ñервер не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° Ñервері"
+
+#: pg_basebackup.c:1885
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "початок базового резервного копіюваннÑ, очікуєтьÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки"
+
+#: pg_basebackup.c:1889
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки"
+
+#: pg_basebackup.c:1902 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ реплікаційну команду \"%s\": %s"
+
+#: pg_basebackup.c:1910
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ базове резервне копіюваннÑ: %s"
+
+#: pg_basebackup.c:1913
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "Ñервер повернув неочікувану відповідь на команду BASE_BACKUP; отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів"
+
+#: pg_basebackup.c:1919
+#, c-format
+msgid "checkpoint completed"
+msgstr "контрольна точка завершена"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "Ñтартова точка у випереджувальному журналюванні: %s на чаÑовій шкалі %u"
+
+#: pg_basebackup.c:1941
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок резервної копії: %s"
+
+#: pg_basebackup.c:1944
+#, c-format
+msgid "no data returned from server"
+msgstr "Ñервер не повернув дані"
+
+#: pg_basebackup.c:1987
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "можна запиÑати лише один табличний проÑÑ‚Ñ–Ñ€ в stdout, вÑього Ñ—Ñ… в базі даних %d"
+
+#: pg_basebackup.c:2000
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "запуÑк фонового процеÑу Ð·Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ WAL"
+
+#: pg_basebackup.c:2083
+#, c-format
+msgid "backup failed: %s"
+msgstr "помилка резервного копіюваннÑ: %s"
+
+#: pg_basebackup.c:2086
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "Ñервер не повернув кінцеву позицію у випереджувальному журналюванні"
+
+#: pg_basebackup.c:2089
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "кінцева точка у випереджувальному журналюванні: %s"
+
+#: pg_basebackup.c:2100
+#, c-format
+msgid "checksum error occurred"
+msgstr "ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° контрольної Ñуми"
+
+#: pg_basebackup.c:2105
+#, c-format
+msgid "final receive failed: %s"
+msgstr "помилка в кінці передачі: %s"
+
+#: pg_basebackup.c:2129
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¸Ð¼ процеÑом ..."
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати команду до канала фонового процеÑу: %m"
+
+#: pg_basebackup.c:2138
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "збій при очікуванні дочірнього процеÑу: %m"
+
+#: pg_basebackup.c:2140
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "завершивÑÑ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½Ñ–Ð¹ Ð¿Ñ€Ð¾Ñ†ÐµÑ %d, очікувалоÑÑ %d"
+
+#: pg_basebackup.c:2142 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2162
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "неможливо дочекатиÑÑ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ потоку: %m"
+
+#: pg_basebackup.c:2167
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "не можливо отримати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ потоку: %m"
+
+#: pg_basebackup.c:2170
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "дочірній потік завершивÑÑ Ð· помилкою %u"
+
+#: pg_basebackup.c:2199
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… з диÑком ..."
+
+#: pg_basebackup.c:2224
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ backup_manifest.tmp в backup_manifest"
+
+#: pg_basebackup.c:2244
+#, c-format
+msgid "base backup completed"
+msgstr "базове резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾"
+
+#: pg_basebackup.c:2327
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "неприпуÑтимий аргумент контрольної точки \"%s\", повинен бути \"fast\" або \"spread\""
+
+#: pg_basebackup.c:2345
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "неприпуÑтимий формат виводу \"%s\", повинен бути \"plain\" або \"tar\""
+
+#: pg_basebackup.c:2423
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "неприпуÑтимий параметр wal-method \"%s\", повинен бути \"fetch\", \"stream\" або \"none\""
+
+#: pg_basebackup.c:2458 pg_basebackup.c:2470 pg_basebackup.c:2492
+#: pg_basebackup.c:2504 pg_basebackup.c:2510 pg_basebackup.c:2562
+#: pg_basebackup.c:2573 pg_basebackup.c:2583 pg_basebackup.c:2589
+#: pg_basebackup.c:2596 pg_basebackup.c:2608 pg_basebackup.c:2620
+#: pg_basebackup.c:2628 pg_basebackup.c:2641 pg_basebackup.c:2647
+#: pg_basebackup.c:2656 pg_basebackup.c:2668 pg_basebackup.c:2679
+#: pg_basebackup.c:2687 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_basebackup.c:2468 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_basebackup.c:2491
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "неможливо одночаÑно вказати формат Ñ– ціль резервного копіюваннÑ"
+
+#: pg_basebackup.c:2503
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "потрібно вказати вихідний каталог або ціль резервного копіюваннÑ"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "неможливо одночаÑно вказати вихідну директорію Ñ– ціль резервного копіюваннÑ"
+
+#: pg_basebackup.c:2539 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\""
+
+#: pg_basebackup.c:2545 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑтиÑканнÑ: %s"
+
+#: pg_basebackup.c:2561
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° Ñтороні клієнта неможливе, коли вказана ціль резервного копіюваннÑ"
+
+#: pg_basebackup.c:2572
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "лише резервні копії в архіві tar можуть ÑтиÑкатиÑÑŒ"
+
+#: pg_basebackup.c:2582
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "неможливо передавати WAL, коли вказана ціль резервного копіюваннÑ"
+
+#: pg_basebackup.c:2588
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "транÑлювати випереджувальні Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð² режимі tar в потік stdout не можна"
+
+#: pg_basebackup.c:2595
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "Ñлоти реплікації можуть викориÑтовуватиÑÑŒ тільки з потоковим передаваннÑм WAL"
+
+#: pg_basebackup.c:2607
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot не можна викориÑтовувати з іменем Ñлота"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2618 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "Ð´Ð»Ñ %s потрібно вказати Ñлот за допомогою --slot"
+
+#: pg_basebackup.c:2626 pg_basebackup.c:2666 pg_basebackup.c:2677
+#: pg_basebackup.c:2685
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "параметри %s Ñ– %s неÑуміÑні"
+
+#: pg_basebackup.c:2640
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "Ðе можна вказати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ— WAL разом з ціллю резервного копіюваннÑ"
+
+#: pg_basebackup.c:2646
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° WAL можна вказати лише в режимі plain"
+
+#: pg_basebackup.c:2655
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL каталогу має бути абÑолютним шлÑхом"
+
+#: pg_basebackup.c:2755
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid "%s receives PostgreSQL streaming write-ahead logs.\n\n"
+msgstr "%s отримує передачу випереджувальних журналів PostgreSQL.\n\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR зберігати файли випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ цього каталогу\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN вийти піÑÐ»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ LSN\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists не видавати помилку, при Ñтворенні Ñлота, Ñкщо Ñлот вже Ñ–Ñнує\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop переривати роботу при втраті підключеннÑ\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync не чекати безпечного Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid " -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr " -s, --status-interval=SECS\n"
+" інтервал між відправкою ÑтатуÑних пакетів Ñерверу (за замовчуваннÑм: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous очиÑтити випереджувальне Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñ€Ð°Ð·Ñƒ піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñу\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid " -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr " -Z, --compress=METHOD[:DETAIL]\n"
+" ÑтиÑкати Ñк вказано\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid "\n"
+"Optional actions:\n"
+msgstr "\n"
+"Додаткові дії:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot Ñтворити новий Ñлот реплікації (ім'Ñ Ñлота задає параметр --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot видалити Ñлот реплікації (ім'Ñ Ñлота задає параметр --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "завершено Ñегмент в позиції %X/%X (чаÑова шкала %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "зупинено потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ в позиції %X/%X (чаÑова шкала %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "переключено на чаÑову шкалу %u в позиції %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "отримано Ñигнал перериваннÑ, Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
+
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "файл Ñегменту \"%s\" має неправильний розмір %lld, пропуÑкаєтьÑÑ"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в ÑтиÑнутому файлі \"%s\": %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": прочитано %d з %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "файл ÑтиÑнутого Ñегменту \"%s\" має неправильний розмір без ÑтиÑÐºÐ°Ð½Ð½Ñ %d, пропуÑкаєтьÑÑ"
+
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s"
+
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\": %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "не вдалоÑÑ Ð·Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ‚Ð¸ контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "файл ÑтиÑнутого Ñегменту \"%s\" має неправильний розмір не ÑтиÑнутого розміру %zu, пропуÑкаєтьÑÑ"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "неможливо перевірити файл \"%s\": ÑтиÑÐ½ÐµÐ½Ð½Ñ %s не підтримуєтьÑÑ Ð´Ð°Ð½Ð¾ÑŽ збіркою"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "початок потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ в позиції %X/%X (чаÑова шкала %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцеву позицію \"%s\""
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "викориÑтовувати --create-slot разом з --drop-slot не можна"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "викориÑтовувати --synchronous разом з --no-sync не можна"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "цільовий каталог не вказано"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s ще не підтримуєтьÑÑ"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— з викориÑтаннÑм Ñлоту \"%s\" неочікувано виÑвилоÑÑŒ прив'Ñзаним до бази даних"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñлоту реплікації \"%s\""
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñлоту реплікації \"%s\""
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "роз’єднано"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "роз’єднано; через %d Ñекунд буде повторна Ñпроба"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid "%s controls PostgreSQL logical decoding streams.\n\n"
+msgstr "%s керує потоковими передаваннÑми логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ PostgreSQL.\n\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid "\n"
+"Action to be performed:\n"
+msgstr "\n"
+"Ð”Ñ–Ñ Ð´Ð¾ виконаннÑ:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start почати потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð² Ñлоті реплікації (ім'Ñ Ñлоту задає параметр --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE зберігати журнал до цього файлу, - позначає stdout\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid " -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr " -F --fsync-interval=SECS\n"
+" Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ fsyncs до файлу виводу (за замовчуваннÑм: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN де в Ñ–Ñнуючому Ñлоті Ñлід почати потокове передаваннÑ\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr " -o, --option=NAME[=VALUE]\n"
+" передати параметр NAME з додатковим значеннÑм VALUE до\n"
+" плагіну виводу\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN викориÑтовувати плагін виводу PLUGIN (за замовчуваннÑм: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME ім'Ñ Ñлоту логічної реплікації\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase активувати Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ… транзакцій під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñлоту\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME бази даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу до %X/%X, Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾ %X/%X (Ñлот %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ пакет зворотнього зв'Ñзку: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "початок потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ в позиції %X/%X (Ñлот %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð¹Ð¾Ð²Ð°Ð½Ð¾"
+
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "неприпуÑтимий Ñокет: %s"
+
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані з WAL потоку: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "заголовок потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ малий: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "нерозпізнаний заголовок потокового передаваннÑ: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати %d байт до файлу журналу \"%s\": %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "неочікуване Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потоку реплікації: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початкову позицію \"%s\""
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "Ñлот не вказано"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "цільовий файл не вказано"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "база даних не вказана"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "необхідно вказати щонайменше одну дію"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "викориÑтовувати --create-slot або --start разом з --drop-slot не можна"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "викориÑтовувати --create-slot або --drop-slot разом з --startpos не можна"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos можна вказати лише з --start"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase може бути вказано тільки з --create-slot"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "не вдалоÑÑ Ð²Ñтановити Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— до вказаної бази даних"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr "кінцева Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X доÑÑгнута наживо"
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr "кінцева Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X доÑÑгнута WAL запиÑом %X/%X"
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "не вдалоÑÑ Ñтворити файл ÑтатуÑу архіву \"%s\": %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл ÑтатуÑу архіву \"%s\": %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розмір файлу випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñ–Ñнуючий файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "не вдалоÑÑ fsync Ñ–Ñнуючий файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" має %zd байт, а повинен мати 0 або %d"
+msgstr[1] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" має %zd байти, а повинен мати 0 або %d"
+msgstr[2] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" має %zd байтів, а повинен мати 0 або %d"
+msgstr[3] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" має %zd байтів, а повинен мати 0 або %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "не перейменовуєтьÑÑ \"%s\", Ñегмент не завершений"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "Ñервер повідомив неочікуване ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñ–Ñторії чаÑової шкали %u: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "не вдалоÑÑ Ñтворити файл Ñ–Ñторії чаÑової шкали \"%s\": %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл Ñ–Ñторії чаÑової шкали \"%s\": %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "неÑуміÑна верÑÑ–Ñ Ñерверу %s; клієнт не підтримує потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð· верÑій Ñерверу Ñтаріших, ніж %s"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "неÑуміÑна верÑÑ–Ñ Ñерверу %s; клієнт не підтримує потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð· верÑій Ñерверу новіших, ніж %s"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "ÑиÑтемний ідентифікатор базової резервної копії не відповідає ідентифікатору потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "початкова чаÑова шкала %u не Ñ–Ñнує на Ñервері"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "неочікувана відповідь на команду TIMELINE_HISTORY: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "Ñервер неочікувано повідомив наÑтупну чаÑову шкалу %u піÑÐ»Ñ Ñ‡Ð°Ñової шкали %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "Ñервер зупинив потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‡Ð°Ñової шкали %u в позиції %X/%X, але повідомив, що наÑтупна чаÑова шкала %u почнетьÑÑ Ð² позиції %X/%X"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "потік реплікації перервано до точки зупинки"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "неочікуваний набір результатів піÑÐ»Ñ ÐºÑ–Ð½Ñ†Ñ Ñ‡Ð°Ñової шкали: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початкову точку наÑтупної чаÑової шкали \"%s\""
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "не вдалоÑÑ fsync файл \"%s\": %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "отримано Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð·Ñуву %u з закритим файлом"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "отримано дані зÑуву WAL %08x, очікувалоÑÑŒ %08x"
+
+#: receivelog.c:1128
+#, 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
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ пакет ÐºÑ–Ð½Ñ†Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"copy-end\": %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "Пароль: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑŒ до Ñерверу"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити search_path: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ наÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ Ñерверу Ð´Ð»Ñ integer_datetimes"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "параметри компілÑції integer_datetimes не відповідають Ñерверу"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розмір Ñегменту WAL: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ розмір Ñегмента WAL"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байт"
+msgstr[1] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байти"
+msgstr[2] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байтів"
+msgstr[3] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байтів"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ позначку доÑтупа групи: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ позначку доÑтупа групи: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "не вдалоÑÑ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ ÑиÑтему: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñлот реплікації \"%s\": отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "Ñлот реплікації \"%s\" не Ñ–Ñнує"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "очікувавÑÑ Ñлот фізичної реплікації, а натоміÑÑ‚ÑŒ знайдено \"%s\""
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ restart_lsn \"%s\" Ð´Ð»Ñ Ñлоту реплікації \"%s\""
+
+#: streamutil.c:664
+#, 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 полів"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлот реплікації \"%s\": отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "не вдалоÑÑ ÑтиÑнути дані"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "не вдалоÑÑ Ñкинути потік ÑтиÑканнÑ"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "помилка реалізації: файли tar не можуть мати більше одного відкритого файлу"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "не вдалоÑÑ Ñтворити заголовок tar"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ параметри ÑтиÑканнÑ"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "unink не підтримуєтьÑÑ Ð·Ñ– ÑтиÑканнÑм"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ потік ÑтиÑканнÑ"
+
diff --git a/src/bin/pg_basebackup/po/vi.po b/src/bin/pg_basebackup/po/vi.po
new file mode 100644
index 0000000..19fcce3
--- /dev/null
+++ b/src/bin/pg_basebackup/po/vi.po
@@ -0,0 +1,1520 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:16+0000\n"
+"PO-Revision-Date: 2018-05-06 01:24+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Language: vi_VN\n"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "hết bộ nhớ\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "không thể nhân đôi con trỠnull (lỗi nội bộ)\n"
+
+#: ../../common/file_utils.c:82 ../../common/file_utils.c:186
+#: pg_receivewal.c:268 pg_recvlogical.c:354
+#, c-format
+msgid "%s: could not stat file \"%s\": %s\n"
+msgstr "%s: không thể lấy thông tin trạng thái tệp \"%s\": %s\n"
+
+#: ../../common/file_utils.c:162 pg_receivewal.c:169
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "%s: không thể mở thư mục \"%s\": %s\n"
+
+#: ../../common/file_utils.c:198 pg_receivewal.c:336
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "%s: không thể Ä‘á»c thÆ° mục \"%s\": %s\n"
+
+#: ../../common/file_utils.c:231 ../../common/file_utils.c:291
+#: ../../common/file_utils.c:367
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "%s: không thể mở tệp \"%s\": %s\n"
+
+#: ../../common/file_utils.c:304 ../../common/file_utils.c:376 receivelog.c:788
+#: receivelog.c:1045
+#, c-format
+msgid "%s: could not fsync file \"%s\": %s\n"
+msgstr "%s: không thể đồng bộ (fsync) tệp \"%s\": %s\n"
+
+#: ../../common/file_utils.c:387
+#, c-format
+msgid "%s: could not rename file \"%s\" to \"%s\": %s\n"
+msgstr "%s: không thể đổi tên tệp \"%s\" thành \"%s\": %s\n"
+
+#: pg_basebackup.c:166
+#, c-format
+msgid "%s: removing data directory \"%s\"\n"
+msgstr "%s: đang xóa thư mục \"%s\"\n"
+
+#: pg_basebackup.c:169
+#, c-format
+msgid "%s: failed to remove data directory\n"
+msgstr "%s: không thể xóa thư mục dữ liệu\n"
+
+#: pg_basebackup.c:175
+#, c-format
+msgid "%s: removing contents of data directory \"%s\"\n"
+msgstr "%s: đang xóa nội dung của thư mục dữ liệu \"%s\"\n"
+
+#: pg_basebackup.c:178
+#, c-format
+msgid "%s: failed to remove contents of data directory\n"
+msgstr "%s: không thể xóa nội dung thư mục dữ liệu\n"
+
+#: pg_basebackup.c:184
+#, c-format
+msgid "%s: removing WAL directory \"%s\"\n"
+msgstr "%s: đang xóa thư mục WAL \"%s\"\n"
+
+#: pg_basebackup.c:187
+#, c-format
+msgid "%s: failed to remove WAL directory\n"
+msgstr "%s: không thể xóa thư mục WAL\n"
+
+#: pg_basebackup.c:193
+#, c-format
+msgid "%s: removing contents of WAL directory \"%s\"\n"
+msgstr "%s: đang xóa nội dung thư mục WAL \"%s\"\n"
+
+#: pg_basebackup.c:196
+#, c-format
+msgid "%s: failed to remove contents of WAL directory\n"
+msgstr "%s: không thể xóa nội dung thư mục WAL\n"
+
+#: pg_basebackup.c:204
+#, c-format
+msgid "%s: data directory \"%s\" not removed at user's request\n"
+msgstr "%s: thÆ° mục dữ liệu \"%s\" không bị xóa theo yêu cầu của ngÆ°á»i dùng\n"
+
+#: pg_basebackup.c:209
+#, c-format
+msgid "%s: WAL directory \"%s\" not removed at user's request\n"
+msgstr "%s: thÆ° mục WAL \"%s\" không bị xóa theo yêu cầu của ngÆ°á»i dùng\n"
+
+#: pg_basebackup.c:215
+#, c-format
+msgid "%s: changes to tablespace directories will not be undone\n"
+msgstr "%s: các thay đổi đối với thư mục tablespace sẽ không được hoàn tác\n"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "%s: directory name too long\n"
+msgstr "%s: tên thư mục quá dài\n"
+
+#: pg_basebackup.c:267
+#, c-format
+msgid "%s: multiple \"=\" signs in tablespace mapping\n"
+msgstr "%s: nhiá»u dấu \"=\" trong ánh xạ tablespace\n"
+
+#: pg_basebackup.c:280
+#, c-format
+msgid ""
+"%s: invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"\n"
+msgstr ""
+"%s: định dạng ánh xạ tablespace không hợp lệ \"%s\", phải là \"OLDDIR=NEWDIR"
+"\"\n"
+
+#: pg_basebackup.c:293
+#, c-format
+msgid "%s: old directory is not an absolute path in tablespace mapping: %s\n"
+msgstr ""
+"%s: thÆ° mục cÅ© không phải là Ä‘Æ°á»ng dẫn tuyệt đối trong ánh xạ tablespace: "
+"%s\n"
+
+#: pg_basebackup.c:300
+#, c-format
+msgid "%s: new directory is not an absolute path in tablespace mapping: %s\n"
+msgstr ""
+"%s: thÆ° mục má»›i không phải là Ä‘Æ°á»ng dẫn tuyệt đối trong ánh xạ tablespace: "
+"%s\n"
+
+#: pg_basebackup.c:339
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s lấy bản sao lưu cơ sở của PostgreSQL server đang chạy.\n"
+"\n"
+
+#: pg_basebackup.c:341 pg_receivewal.c:79 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: pg_basebackup.c:342 pg_receivewal.c:80 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [TÙYCHỌN]...\n"
+
+#: pg_basebackup.c:343
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"Tùy chá»n kiểm soát đầu ra:\n"
+
+#: pg_basebackup.c:344
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY chỉ định thư mục lưu bản sao lưu cơ sở\n"
+
+#: pg_basebackup.c:345
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t định dạng đầu ra (plain (mặc định), tar)\n"
+
+#: pg_basebackup.c:346
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE tốc Ä‘á»™ truyá»n tối Ä‘a khi chuyển thÆ° mục dữ liệu\n"
+" (đơn vị kB/s, hoặc sử dụng hậu tố \"k\" hay \"M\")\n"
+
+#: pg_basebackup.c:348
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write recovery.conf for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" viết tệp recovery.conf cho replication\n"
+
+#: pg_basebackup.c:350
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" định vị lại tablespace trong OLDDIR thành NEWDIR\n"
+
+#: pg_basebackup.c:352
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR chỉ định cho thư mục WAL\n"
+
+#: pg_basebackup.c:353
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" lưu các tệp WAL được yêu cầu với phương thức\n"
+" được chỉ định\n"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip nén đầu ra định dạng tar\n"
+
+#: pg_basebackup.c:356
+#, c-format
+msgid ""
+" -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr ""
+" -Z, --compress=0-9 nén đầu ra định dạng tar với mức nén nhất định\n"
+
+#: pg_basebackup.c:357
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Tùy chá»n chung:\n"
+
+#: pg_basebackup.c:358
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" thiết lập chế độ checkpoint là nhanh(fast)\n"
+" hay dàn trải(spread)\n"
+
+#: pg_basebackup.c:360
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot tạo slot cho replication\n"
+
+#: pg_basebackup.c:361
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL chỉ định backup label\n"
+
+#: pg_basebackup.c:362
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean không dá»n dẹp sau khi có lá»—i\n"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync không đợi những thay đổi được ghi một cách an toàn\n"
+" vào đĩa\n"
+
+#: pg_basebackup.c:364
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress hiển thị thông tin vỠtiến độ\n"
+
+#: pg_basebackup.c:365 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME chỉ định replication slot\n"
+
+#: pg_basebackup.c:366
+#, c-format
+msgid ""
+" --no-slot prevent creation of temporary replication slot\n"
+msgstr ""
+" --no-slot ngăn chặn tạo ra các slot tạm thá»i cho replication\n"
+
+#: pg_basebackup.c:367
+#, c-format
+msgid ""
+" -k, --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" -k, --no-verify-checksums\n"
+" không xác minh checksum\n"
+
+#: pg_basebackup.c:369 pg_receivewal.c:91 pg_recvlogical.c:99
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose xuất thông báo chi tiết\n"
+
+#: pg_basebackup.c:370 pg_receivewal.c:92 pg_recvlogical.c:100
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version hiển thị thông tin phiên bản, sau đó thoát\n"
+
+#: pg_basebackup.c:371 pg_receivewal.c:94 pg_recvlogical.c:101
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help hiển thị trợ giúp này, sau đó thoát\n"
+
+#: pg_basebackup.c:372 pg_receivewal.c:95 pg_recvlogical.c:102
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Tùy chá»n kết nối:\n"
+
+#: pg_basebackup.c:373 pg_receivewal.c:96
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR chuỗi kết nối\n"
+
+#: pg_basebackup.c:374 pg_receivewal.c:97 pg_recvlogical.c:104
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host của database server hay thư mục socket\n"
+
+#: pg_basebackup.c:375 pg_receivewal.c:98 pg_recvlogical.c:105
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT số port của database server\n"
+
+#: pg_basebackup.c:376
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in "
+"seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" thá»i gian giữa các gói trạng thái được gá»­i tá»›i\n"
+" server (tính bằng giây)\n"
+
+#: pg_basebackup.c:378 pg_receivewal.c:99 pg_recvlogical.c:106
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr ""
+" -U, --username=NAME kết nối vá»›i ngÆ°á»i dùng cÆ¡ sở dữ liệu được chỉ định\n"
+
+#: pg_basebackup.c:379 pg_receivewal.c:100 pg_recvlogical.c:107
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password không bao giỠnhắc mật khẩu\n"
+
+#: pg_basebackup.c:380 pg_receivewal.c:101 pg_recvlogical.c:108
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr " -W, --password yêu cầu nhập mật khẩu (sẽ xảy ra tự động)\n"
+
+#: pg_basebackup.c:381 pg_receivewal.c:105 pg_recvlogical.c:109
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Báo cáo lỗi tới <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid "%s: could not read from ready pipe: %s\n"
+msgstr "%s: không thể Ä‘á»c từ pipe đã sẵn sàng: %s\n"
+
+#: pg_basebackup.c:432 pg_basebackup.c:563 pg_basebackup.c:2064
+#: streamutil.c:458
+#, c-format
+msgid "%s: could not parse write-ahead log location \"%s\"\n"
+msgstr "%s: không thể phân tích cú pháp vị trí WAL \"%s\"\n"
+
+#: pg_basebackup.c:526 pg_receivewal.c:443
+#, c-format
+msgid "%s: could not finish writing WAL files: %s\n"
+msgstr "%s: không thể kết thúc việc ghi tệp WAL: %s\n"
+
+#: pg_basebackup.c:576
+#, c-format
+msgid "%s: could not create pipe for background process: %s\n"
+msgstr "%s: không thể tạo pipe cho tiến trình ná»n: %s\n"
+
+#: pg_basebackup.c:612
+#, c-format
+msgid "%s: created temporary replication slot \"%s\"\n"
+msgstr "%s: đã tạo slot tạm thá»i cho replication \"%s\"\n"
+
+#: pg_basebackup.c:615
+#, c-format
+msgid "%s: created replication slot \"%s\"\n"
+msgstr "%s: đã tạo replication slot \"%s\"\n"
+
+#: pg_basebackup.c:636 pg_basebackup.c:692 pg_basebackup.c:1462
+#, c-format
+msgid "%s: could not create directory \"%s\": %s\n"
+msgstr "%s: không thể tạo thư mục \"%s\": %s\n"
+
+#: pg_basebackup.c:655
+#, c-format
+msgid "%s: could not create background process: %s\n"
+msgstr "%s: không thể tạo tiến trình ná»n: %s\n"
+
+#: pg_basebackup.c:667
+#, c-format
+msgid "%s: could not create background thread: %s\n"
+msgstr "%s: không thể tạo luồng ná»n: %s\n"
+
+#: pg_basebackup.c:715
+#, c-format
+msgid "%s: directory \"%s\" exists but is not empty\n"
+msgstr "%s: thư mục \"%s\" tồn tại nhưng không trống\n"
+
+#: pg_basebackup.c:723
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: không thể truy cập thư mục \"%s\": %s\n"
+
+#: pg_basebackup.c:785
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+
+#: pg_basebackup.c:797
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+
+#: pg_basebackup.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace"
+
+#: pg_basebackup.c:838
+#, c-format
+msgid "%s: transfer rate \"%s\" is not a valid value\n"
+msgstr "%s: tốc Ä‘á»™ truyá»n \"%s\" không phải là giá trị hợp lệ\n"
+
+#: pg_basebackup.c:845
+#, c-format
+msgid "%s: invalid transfer rate \"%s\": %s\n"
+msgstr "%s: tốc Ä‘á»™ truyá»n không hợp lệ \"%s\": %s\n"
+
+#: pg_basebackup.c:855
+#, c-format
+msgid "%s: transfer rate must be greater than zero\n"
+msgstr "%s: tốc Ä‘á»™ truyá»n phải lá»›n hÆ¡n 0\n"
+
+#: pg_basebackup.c:889
+#, c-format
+msgid "%s: invalid --max-rate unit: \"%s\"\n"
+msgstr "%s: đơn vị --max-rate không hợp lệ: \"%s\"\n"
+
+#: pg_basebackup.c:898
+#, c-format
+msgid "%s: transfer rate \"%s\" exceeds integer range\n"
+msgstr "%s: tốc Ä‘á»™ truyá»n \"%s\" vượt quá phạm vi integer\n"
+
+#: pg_basebackup.c:910
+#, c-format
+msgid "%s: transfer rate \"%s\" is out of range\n"
+msgstr "%s: tốc Ä‘á»™ truyá»n \"%s\" ngoài phạm vi\n"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "%s: could not write to compressed file \"%s\": %s\n"
+msgstr "%s: không thể ghi vào tệp nén \"%s\": %s\n"
+
+#: pg_basebackup.c:944 pg_basebackup.c:1556 pg_basebackup.c:1722
+#, c-format
+msgid "%s: could not write to file \"%s\": %s\n"
+msgstr "%s: không thể ghi vào tệp \"%s\": %s\n"
+
+#: pg_basebackup.c:1003 pg_basebackup.c:1024 pg_basebackup.c:1052
+#, c-format
+msgid "%s: could not set compression level %d: %s\n"
+msgstr "%s: không thể thiết lập mức nén %d: %s\n"
+
+#: pg_basebackup.c:1073
+#, c-format
+msgid "%s: could not create compressed file \"%s\": %s\n"
+msgstr "%s: không thể tạo tệp nén \"%s\": %s\n"
+
+#: pg_basebackup.c:1084 pg_basebackup.c:1516 pg_basebackup.c:1715
+#, c-format
+msgid "%s: could not create file \"%s\": %s\n"
+msgstr "%s: không thể tạo tệp \"%s\": %s\n"
+
+#: pg_basebackup.c:1096 pg_basebackup.c:1369
+#, c-format
+msgid "%s: could not get COPY data stream: %s"
+msgstr "%s: không thể nhận luồng dữ liệu COPY: %s"
+
+#: pg_basebackup.c:1153
+#, c-format
+msgid "%s: could not close compressed file \"%s\": %s\n"
+msgstr "%s: không thể đóng tệp nén \"%s\": %s\n"
+
+#: pg_basebackup.c:1166 pg_recvlogical.c:632 receivelog.c:224 receivelog.c:309
+#: receivelog.c:698
+#, c-format
+msgid "%s: could not close file \"%s\": %s\n"
+msgstr "%s: không thể đóng tệp \"%s\": %s\n"
+
+#: pg_basebackup.c:1177 pg_basebackup.c:1398 pg_recvlogical.c:454
+#: receivelog.c:993
+#, c-format
+msgid "%s: could not read COPY data: %s"
+msgstr "%s: không thể Ä‘á»c dữ liệu COPY: %s"
+
+#: pg_basebackup.c:1412
+#, c-format
+msgid "%s: invalid tar block header size: %d\n"
+msgstr "%s: kích thước tiêu đỠkhối tar không hợp lệ: %d\n"
+
+#: pg_basebackup.c:1470
+#, c-format
+msgid "%s: could not set permissions on directory \"%s\": %s\n"
+msgstr "%s: không thể đặt quyá»n cho thÆ° mục \"%s\": %s\n"
+
+#: pg_basebackup.c:1494
+#, c-format
+msgid "%s: could not create symbolic link from \"%s\" to \"%s\": %s\n"
+msgstr "%s: không thể tạo symbolic link từ \"%s\" tới \"%s\": %s\n"
+
+#: pg_basebackup.c:1503
+#, c-format
+msgid "%s: unrecognized link indicator \"%c\"\n"
+msgstr "%s: không thể nhận ra liên kết indicator \"%c\"\n"
+
+#: pg_basebackup.c:1523
+#, c-format
+msgid "%s: could not set permissions on file \"%s\": %s\n"
+msgstr "%s: không thể đặt quyá»n đối vá»›i tệp \"%s\": %s\n"
+
+#: pg_basebackup.c:1582
+#, c-format
+msgid "%s: COPY stream ended before last file was finished\n"
+msgstr "%s: Dòng COPY đã kết thúc trước khi tệp cuối cùng được hoàn tất\n"
+
+#: pg_basebackup.c:1610 pg_basebackup.c:1630 pg_basebackup.c:1637
+#: pg_basebackup.c:1690
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: hết bộ nhớ\n"
+
+#: pg_basebackup.c:1763
+#, c-format
+msgid "%s: incompatible server version %s\n"
+msgstr "%s: phiên bản server không tương thích %s\n"
+
+#: pg_basebackup.c:1778
+#, c-format
+msgid "HINT: use -X none or -X fetch to disable log streaming\n"
+msgstr "Gợi ý: sử dụng -X none hay -X fetch để tắt tính năng log streaming\n"
+
+#: pg_basebackup.c:1804
+#, c-format
+msgid "%s: initiating base backup, waiting for checkpoint to complete\n"
+msgstr "%s: bắt đầu sao lưu cơ sở, chỠcheckpoint để hoàn thành\n"
+
+#: pg_basebackup.c:1829 pg_recvlogical.c:271 receivelog.c:493 receivelog.c:546
+#: receivelog.c:586 streamutil.c:428 streamutil.c:542 streamutil.c:588
+#, c-format
+msgid "%s: could not send replication command \"%s\": %s"
+msgstr "%s: không thể gửi lệnh replication \"%s\": %s"
+
+#: pg_basebackup.c:1840
+#, c-format
+msgid "%s: could not initiate base backup: %s"
+msgstr "%s: không thể bắt đầu sao lưu cơ sở: %s"
+
+#: pg_basebackup.c:1847
+#, c-format
+msgid ""
+"%s: server returned unexpected response to BASE_BACKUP command; got %d rows "
+"and %d fields, expected %d rows and %d fields\n"
+msgstr ""
+"%s: server trả vỠphản hồi không mong muốn cho lệnh BASE_BACKUP, có %d hàng "
+"và %d trÆ°á»ng, dá»± kiến %d hàng và %d trÆ°á»ng\n"
+
+#: pg_basebackup.c:1855
+#, c-format
+msgid "%s: checkpoint completed\n"
+msgstr "%s: checkpoint hoàn thành\n"
+
+#: pg_basebackup.c:1870
+#, c-format
+msgid "%s: write-ahead log start point: %s on timeline %u\n"
+msgstr "%s: Äiểm bắt đầu WAL: %s ở timeline %u\n"
+
+#: pg_basebackup.c:1879
+#, c-format
+msgid "%s: could not get backup header: %s"
+msgstr "%s: không thể lấy tiêu đỠbackup: %s"
+
+#: pg_basebackup.c:1885
+#, c-format
+msgid "%s: no data returned from server\n"
+msgstr "%s: không có dữ liệu nào được trả vỠtừ server\n"
+
+#: pg_basebackup.c:1917
+#, c-format
+msgid "%s: can only write single tablespace to stdout, database has %d\n"
+msgstr "%s: chỉ có thể ghi tablespace đơn qua stdout, cơ sở dữ liệu có %d\n"
+
+#: pg_basebackup.c:1929
+#, c-format
+msgid "%s: starting background WAL receiver\n"
+msgstr "%s: khởi Ä‘á»™ng tiến trình ná»n để nhận WAL\n"
+
+#: pg_basebackup.c:1961
+#, c-format
+msgid "%s: could not get write-ahead log end position from server: %s"
+msgstr "%s: không thể nhận được vị trí kết thúc WAL từ server: %s"
+
+#: pg_basebackup.c:1968
+#, c-format
+msgid "%s: no write-ahead log end position returned from server\n"
+msgstr "%s: vị trí cuối của WAL không được trả vỠtừ server\n"
+
+#: pg_basebackup.c:1974
+#, c-format
+msgid "%s: write-ahead log end point: %s\n"
+msgstr "%s: điểm kết thúc WAL: %s\n"
+
+#: pg_basebackup.c:1985
+#, c-format
+msgid "%s: checksum error occured\n"
+msgstr "%s: xảy ra lỗi checksum\n"
+
+#: pg_basebackup.c:1991
+#, c-format
+msgid "%s: final receive failed: %s"
+msgstr "%s: lỗi khi nhận cuối cùng: %s"
+
+#: pg_basebackup.c:2016
+#, c-format
+msgid "%s: waiting for background process to finish streaming ...\n"
+msgstr "%s: Ä‘ang chá» tiến trình ná»n hoàn thành truyá»n ...\n"
+
+#: pg_basebackup.c:2022
+#, c-format
+msgid "%s: could not send command to background pipe: %s\n"
+msgstr "%s: không thể gá»­i lệnh tá»›i pipe của tiến trình ná»n: %s\n"
+
+#: pg_basebackup.c:2031
+#, c-format
+msgid "%s: could not wait for child process: %s\n"
+msgstr "%s: không thể chỠtiến trình con: %s\n"
+
+#: pg_basebackup.c:2037
+#, c-format
+msgid "%s: child %d died, expected %d\n"
+msgstr "%s: tiến trình con %d bị kết thúc, kỳ vá»ng %d\n"
+
+#: pg_basebackup.c:2043
+#, c-format
+msgid "%s: child process did not exit normally\n"
+msgstr "%s: tiến trình con kết thúc không bình thÆ°á»ng\n"
+
+#: pg_basebackup.c:2049
+#, c-format
+msgid "%s: child process exited with error %d\n"
+msgstr "%s: tiến trình con đã thoát với lỗi %d\n"
+
+#: pg_basebackup.c:2076
+#, c-format
+msgid "%s: could not wait for child thread: %s\n"
+msgstr "%s: không thể đợi luồng con: %s\n"
+
+#: pg_basebackup.c:2083
+#, c-format
+msgid "%s: could not get child thread exit status: %s\n"
+msgstr "%s: không thể nhận được trạng thái kết thúc của luồng con: %s\n"
+
+#: pg_basebackup.c:2089
+#, c-format
+msgid "%s: child thread exited with error %u\n"
+msgstr "%s: luồng con kết thúc với lỗi %u\n"
+
+#: pg_basebackup.c:2127
+#, c-format
+msgid "%s: base backup completed\n"
+msgstr "%s: sao lưu cơ sở đã hoàn thành\n"
+
+#: pg_basebackup.c:2208
+#, c-format
+msgid "%s: invalid output format \"%s\", must be \"plain\" or \"tar\"\n"
+msgstr ""
+"%s: định dạng đầu ra không hợp lệ \"%s\", phải là \"plain\" hoặc \"tar\"\n"
+
+#: pg_basebackup.c:2253
+#, c-format
+msgid ""
+"%s: invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or "
+"\"none\"\n"
+msgstr ""
+"%s: tùy chá»n phÆ°Æ¡ng thức wal không hợp lệ \"%s\", phải là \"fetch\", \"stream"
+"\" hoặc \"none\"\n"
+
+#: pg_basebackup.c:2281 pg_receivewal.c:585
+#, c-format
+msgid "%s: invalid compression level \"%s\"\n"
+msgstr "%s: mức độ nén không hợp lệ \"%s\"\n"
+
+#: pg_basebackup.c:2293
+#, c-format
+msgid ""
+"%s: invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"\n"
+msgstr ""
+"%s: đối số cho checkpoint không hợp lệ \"%s\", phải là \"fast\" hoặc \"spread"
+"\"\n"
+
+#: pg_basebackup.c:2320 pg_receivewal.c:557 pg_recvlogical.c:826
+#, c-format
+msgid "%s: invalid status interval \"%s\"\n"
+msgstr "%s: giá trị status-interval không hợp lệ \"%s\"\n"
+
+#: pg_basebackup.c:2339 pg_basebackup.c:2353 pg_basebackup.c:2364
+#: pg_basebackup.c:2377 pg_basebackup.c:2387 pg_basebackup.c:2397
+#: pg_basebackup.c:2409 pg_basebackup.c:2423 pg_basebackup.c:2433
+#: pg_basebackup.c:2446 pg_basebackup.c:2457 pg_receivewal.c:611
+#: pg_receivewal.c:625 pg_receivewal.c:633 pg_receivewal.c:643
+#: pg_receivewal.c:651 pg_receivewal.c:662 pg_recvlogical.c:853
+#: pg_recvlogical.c:867 pg_recvlogical.c:878 pg_recvlogical.c:886
+#: pg_recvlogical.c:894 pg_recvlogical.c:902 pg_recvlogical.c:910
+#: pg_recvlogical.c:918 pg_recvlogical.c:928
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_basebackup.c:2351 pg_receivewal.c:623 pg_recvlogical.c:865
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: quá nhiá»u đối số dòng lệnh (đầu tiên là \"%s\")\n"
+
+#: pg_basebackup.c:2363 pg_receivewal.c:661
+#, c-format
+msgid "%s: no target directory specified\n"
+msgstr "%s: không có thư mục đích được chỉ định\n"
+
+#: pg_basebackup.c:2375
+#, c-format
+msgid "%s: only tar mode backups can be compressed\n"
+msgstr "%s: chỉ có chế độ backup dạng tar mới có thể được nén\n"
+
+#: pg_basebackup.c:2385
+#, c-format
+msgid "%s: cannot stream write-ahead logs in tar mode to stdout\n"
+msgstr "%s: không thể truyá»n WAL ở chế Ä‘á»™ tar qua stdout\n"
+
+#: pg_basebackup.c:2395
+#, c-format
+msgid "%s: replication slots can only be used with WAL streaming\n"
+msgstr ""
+"%s: các replication slots chỉ có thể được sá»­ dụng vá»›i việc truyá»n WAL\n"
+
+#: pg_basebackup.c:2407
+#, c-format
+msgid "%s: --no-slot cannot be used with slot name\n"
+msgstr "%s: --no-slot không thể được sử dụng với tên slot\n"
+
+#: pg_basebackup.c:2421
+#, c-format
+msgid "%s: --create-slot needs a slot to be specified using --slot\n"
+msgstr "%s: --create-slot cần một slot được chỉ định để sử dụng --slot\n"
+
+#: pg_basebackup.c:2431
+#, c-format
+msgid "%s: --create-slot and --no-slot are incompatible options\n"
+msgstr "%s: --create-slot và --no-slot là các tùy chá»n không tÆ°Æ¡ng thích\n"
+
+#: pg_basebackup.c:2444
+#, c-format
+msgid "%s: WAL directory location can only be specified in plain mode\n"
+msgstr "%s: Vị trí thư mục WAL chỉ được chỉ định ở chế độ plain\n"
+
+#: pg_basebackup.c:2455
+#, c-format
+msgid "%s: WAL directory location must be an absolute path\n"
+msgstr "%s: Vị trí thÆ° mục WAL phải là Ä‘Æ°á»ng dẫn tuyệt đối\n"
+
+#: pg_basebackup.c:2467 pg_receivewal.c:671
+#, c-format
+msgid "%s: this build does not support compression\n"
+msgstr "%s: phiên bản binary này không hỗ trợ nén\n"
+
+#: pg_basebackup.c:2521
+#, c-format
+msgid "%s: could not create symbolic link \"%s\": %s\n"
+msgstr "%s: không thể tạo symbolic link \"%s\": %s\n"
+
+#: pg_basebackup.c:2526
+#, c-format
+msgid "%s: symlinks are not supported on this platform\n"
+msgstr "%s: symlink không được há»— trợ trên hệ Ä‘iá»u hành này\n"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s nhận PostgreSQL WAL.\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Tùy chá»n:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid ""
+" -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR nhận tệp WAL vào thư mục này\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr ""
+" -E, --endpos=LSN kết thúc trước khi nhật LSN đã được chỉ định\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:89
+#, c-format
+msgid ""
+" --if-not-exists do not error if slot already exists when creating a "
+"slot\n"
+msgstr " --if-not-exists không xuất lỗi khi tạo slot đã có sẵn\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop không lặp khi bị mất kết nối\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" --no-sync không đợi những thay đổi được ghi một cách an toàn\n"
+" vào đĩa\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server "
+"(default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" thá»i gian giữa các gói trạng thái được gá»­i tá»›i\n"
+" server (mặc định: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid ""
+" --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous flush WAL ngay sau khi write\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+msgstr " -Z, --compress=0-9 nén log với mức độ nén được chỉ định\n"
+
+#: pg_receivewal.c:102
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"Tác vụ tùy chá»n:\n"
+
+#: pg_receivewal.c:103 pg_recvlogical.c:81
+#, c-format
+msgid ""
+" --create-slot create a new replication slot (for the slot's name "
+"see --slot)\n"
+msgstr ""
+" --create-slot tạo replication slot mới (vỠtên slot xem --slot)\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:82
+#, c-format
+msgid ""
+" --drop-slot drop the replication slot (for the slot's name see "
+"--slot)\n"
+msgstr ""
+" --drop-slot xóa replication slot (vỠtên slot xem --slot)\n"
+
+#: pg_receivewal.c:116
+#, c-format
+msgid "%s: finished segment at %X/%X (timeline %u)\n"
+msgstr "%s: kết thúc phân đoạn tại %X/%X (timeline %u)\n"
+
+#: pg_receivewal.c:123
+#, c-format
+msgid "%s: stopped streaming at %X/%X (timeline %u)\n"
+msgstr "%s: kết thúc truyá»n tại %X/%X (timeline %u)\n"
+
+#: pg_receivewal.c:139
+#, c-format
+msgid "%s: switched to timeline %u at %X/%X\n"
+msgstr "%s: chuyển qua timeline %u tại %X/%X\n"
+
+#: pg_receivewal.c:149
+#, c-format
+msgid "%s: received interrupt signal, exiting\n"
+msgstr "%s: nhận được tín hiệu ngắt, đang thoát\n"
+
+#: pg_receivewal.c:187
+#, c-format
+msgid "%s: could not close directory \"%s\": %s\n"
+msgstr "%s: không thể đóng thư mục \"%s\": %s\n"
+
+#: pg_receivewal.c:276
+#, c-format
+msgid "%s: segment file \"%s\" has incorrect size %d, skipping\n"
+msgstr "%s: tệp phân đoạn \"%s\" có kích thước không đúng %d, bỠqua\n"
+
+#: pg_receivewal.c:293
+#, c-format
+msgid "%s: could not open compressed file \"%s\": %s\n"
+msgstr "%s: không thể mở tệp nén \"%s\": %s\n"
+
+#: pg_receivewal.c:299
+#, c-format
+msgid "%s: could not seek in compressed file \"%s\": %s\n"
+msgstr "%s: không thể tìm kiếm trong tệp nén \"%s\": %s\n"
+
+#: pg_receivewal.c:305
+#, c-format
+msgid "%s: could not read compressed file \"%s\": %s\n"
+msgstr "%s: không thể Ä‘á»c tệp nén \"%s\": %s\n"
+
+#: pg_receivewal.c:317
+#, c-format
+msgid ""
+"%s: compressed segment file \"%s\" has incorrect uncompressed size %d, "
+"skipping\n"
+msgstr ""
+"%s: tệp phân đoạn nén \"%s\" có kích thước giải nén không đúng %d, bỠqua\n"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "%s: starting log streaming at %X/%X (timeline %u)\n"
+msgstr "%s: bắt đầu truyá»n log tại %X/%X (timeline %u)\n"
+
+#: pg_receivewal.c:538 pg_recvlogical.c:763
+#, c-format
+msgid "%s: invalid port number \"%s\"\n"
+msgstr "%s: số port không hợp lệ \"%s\"\n"
+
+#: pg_receivewal.c:569 pg_recvlogical.c:793
+#, c-format
+msgid "%s: could not parse end position \"%s\"\n"
+msgstr "%s: không thể phân tích cú pháp vị trí kết thúc \"%s\"\n"
+
+#: pg_receivewal.c:632
+#, c-format
+msgid "%s: cannot use --create-slot together with --drop-slot\n"
+msgstr "%s: không thể sử dụng --create-slot cùng với --drop-slot\n"
+
+#. translator: second %s is an option name
+#: pg_receivewal.c:641
+#, c-format
+msgid "%s: %s needs a slot to be specified using --slot\n"
+msgstr "%s: %s cần một slot được chỉ định để sử dụng --slot\n"
+
+#: pg_receivewal.c:650
+#, c-format
+msgid "%s: cannot use --synchronous together with --no-sync\n"
+msgstr "%s: không thể sử dụng --synchronous cùng với --no-sync\n"
+
+#: pg_receivewal.c:728
+#, c-format
+msgid ""
+"%s: replication connection using slot \"%s\" is unexpectedly database "
+"specific\n"
+msgstr ""
+"%s: kết nối replication sử dụng slot \"%s\" không mong đợi database-"
+"specific\n"
+
+#: pg_receivewal.c:740 pg_recvlogical.c:978
+#, c-format
+msgid "%s: dropping replication slot \"%s\"\n"
+msgstr "%s: đang xóa replication slot \"%s\"\n"
+
+#: pg_receivewal.c:753 pg_recvlogical.c:990
+#, c-format
+msgid "%s: creating replication slot \"%s\"\n"
+msgstr "%s: đang tạo replication slot \"%s\"\n"
+
+#: pg_receivewal.c:780 pg_recvlogical.c:1016
+#, c-format
+msgid "%s: disconnected\n"
+msgstr "%s: đã ngắt kết nối\n"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:787 pg_recvlogical.c:1023
+#, c-format
+msgid "%s: disconnected; waiting %d seconds to try again\n"
+msgstr "%s: đã ngắt kết nối; đợi %d giây để thử lại\n"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s kiểm soát luồng PostgreSQL logical decoding.\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"Hành động được thực hiện:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid ""
+" --start start streaming in a replication slot (for the "
+"slot's name see --slot)\n"
+msgstr ""
+" --start bắt đầu truyá»n trong má»™t replication slot\n"
+" (vỠtên slot xem --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE nhận log vào tệp này, - cho stdout\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: "
+"%d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" thá»i gian giữa các fsync cho tệp xuất (mặc định: "
+"%d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -I, --startpos=LSN where in an existing slot should the streaming "
+"start\n"
+msgstr " -I, --startpos=LSN nÆ¡i trong má»™t slot cho Ä‘iểm bắt đầu truyá»n\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" đặt tùy chá»n NAME vá»›i giá trị tùy chá»n VALUE vào\n"
+" plugin đầu ra\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr ""
+" -P, --plugin=PLUGIN sử dụng plugin đầu ra là PLUGIN (mặc định: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME tên của logical replication slot\n"
+
+#: pg_recvlogical.c:103
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME cở sở dữ liệu kết nối tới\n"
+
+#: pg_recvlogical.c:136
+#, c-format
+msgid "%s: confirming write up to %X/%X, flush to %X/%X (slot %s)\n"
+msgstr "%s: xác nhận ghi đến %X/%X, flush đến %X/%X (slot %s)\n"
+
+#: pg_recvlogical.c:161 receivelog.c:352
+#, c-format
+msgid "%s: could not send feedback packet: %s"
+msgstr "%s: không thể gửi gói phản hồi: %s"
+
+#: pg_recvlogical.c:200
+#, c-format
+msgid "%s: could not fsync log file \"%s\": %s\n"
+msgstr "%s: không thể fsync tệp log \"%s\": %s\n"
+
+#: pg_recvlogical.c:239
+#, c-format
+msgid "%s: starting log streaming at %X/%X (slot %s)\n"
+msgstr "%s: bắt đầu truyá»n log ở %X /%X (slot %s)\n"
+
+#: pg_recvlogical.c:281
+#, c-format
+msgid "%s: streaming initiated\n"
+msgstr "%s: khởi tạo luồng truyá»n\n"
+
+#: pg_recvlogical.c:347
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: không thể mở tệp log \"%s\": %s\n"
+
+#: pg_recvlogical.c:377 receivelog.c:898
+#, c-format
+msgid "%s: invalid socket: %s"
+msgstr "%s: socket không hợp lệ: %s"
+
+#: pg_recvlogical.c:431 receivelog.c:927
+#, c-format
+msgid "%s: select() failed: %s\n"
+msgstr "%s: lá»—i select(): %s\n"
+
+#: pg_recvlogical.c:440 receivelog.c:979
+#, c-format
+msgid "%s: could not receive data from WAL stream: %s"
+msgstr "%s: không thể nhận dữ liệu từ luồng truyá»n WAL: %s"
+
+#: pg_recvlogical.c:482 pg_recvlogical.c:534 receivelog.c:1024
+#: receivelog.c:1091
+#, c-format
+msgid "%s: streaming header too small: %d\n"
+msgstr "%s: tiêu Ä‘á» của luồng truyá»n quá nhá»: %d\n"
+
+#: pg_recvlogical.c:518 receivelog.c:858
+#, c-format
+msgid "%s: unrecognized streaming header: \"%c\"\n"
+msgstr "%s: không thể xác định tiêu Ä‘á» luồng truyá»n: \"%c\"\n"
+
+#: pg_recvlogical.c:574 pg_recvlogical.c:588
+#, c-format
+msgid "%s: could not write %u bytes to log file \"%s\": %s\n"
+msgstr "%s: không thể ghi %u byte vào tệp log \"%s\": %s\n"
+
+#: pg_recvlogical.c:618 receivelog.c:650 receivelog.c:689
+#, c-format
+msgid "%s: unexpected termination of replication stream: %s"
+msgstr "%s: luồng truyá»n replication kết thúc không mong đợi: %s"
+
+#: pg_recvlogical.c:742
+#, c-format
+msgid "%s: invalid fsync interval \"%s\"\n"
+msgstr "%s: khoảng thá»i gian fsync không hợp lệ \"%s\"\n"
+
+#: pg_recvlogical.c:783
+#, c-format
+msgid "%s: could not parse start position \"%s\"\n"
+msgstr "%s: không thể phân tích cú pháp vị trí bắt đầu \"%s\"\n"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "%s: no slot specified\n"
+msgstr "%s: không có slot nào được chỉ định\n"
+
+#: pg_recvlogical.c:885
+#, c-format
+msgid "%s: no target file specified\n"
+msgstr "%s: không có tệp đích nào được chỉ định\n"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "%s: no database specified\n"
+msgstr "%s: không có cơ sở dữ liệu nào được chỉ định\n"
+
+#: pg_recvlogical.c:901
+#, c-format
+msgid "%s: at least one action needs to be specified\n"
+msgstr "%s: cần chỉ định ít nhất một hành động\n"
+
+#: pg_recvlogical.c:909
+#, c-format
+msgid "%s: cannot use --create-slot or --start together with --drop-slot\n"
+msgstr "%s: không thể sử dụng --create-slot hay --start cùng với --drop-slot\n"
+
+#: pg_recvlogical.c:917
+#, c-format
+msgid "%s: cannot use --create-slot or --drop-slot together with --startpos\n"
+msgstr ""
+"%s: không thể sử dụng --create-slot hay --drop-slot cùng với --startpos\n"
+
+#: pg_recvlogical.c:926
+#, c-format
+msgid "%s: --endpos may only be specified with --start\n"
+msgstr "%s: --endpos có thể chỉ được chỉ định với --start\n"
+
+#: pg_recvlogical.c:958
+#, c-format
+msgid "%s: could not establish database-specific replication connection\n"
+msgstr "%s: không thể thiết lập kết nối database-specific replication\n"
+
+#: receivelog.c:71
+#, c-format
+msgid "%s: could not create archive status file \"%s\": %s\n"
+msgstr "%s: không thể tạo tệp trạng thái archive \"%s\": %s\n"
+
+#: receivelog.c:119
+#, c-format
+msgid "%s: could not get size of write-ahead log file \"%s\": %s\n"
+msgstr "%s: không thể xác định được kích thước của tệp WAL \"%s\": %s\n"
+
+#: receivelog.c:130
+#, c-format
+msgid "%s: could not open existing write-ahead log file \"%s\": %s\n"
+msgstr "%s: không thể mở tệp WAL đang tồn tại \"%s\": %s\n"
+
+#: receivelog.c:139
+#, c-format
+msgid "%s: could not fsync existing write-ahead log file \"%s\": %s\n"
+msgstr "%s: không thể đồng bộ (fsync) tệp WAL đang tồn tại \"%s\": %s\n"
+
+#: receivelog.c:154
+#, c-format
+msgid "%s: write-ahead log file \"%s\" has %d byte, should be 0 or %d\n"
+msgid_plural ""
+"%s: write-ahead log file \"%s\" has %d bytes, should be 0 or %d\n"
+msgstr[0] "%s: Tệp WAL \"%s\" có %d byte, phải nên là 0 hoặc %d\n"
+
+#: receivelog.c:170
+#, c-format
+msgid "%s: could not open write-ahead log file \"%s\": %s\n"
+msgstr "%s: không thể mở tệp WAL \"%s\": %s\n"
+
+#: receivelog.c:197
+#, c-format
+msgid "%s: could not determine seek position in file \"%s\": %s\n"
+msgstr "%s: không thể xác định vị trí tìm kiếm trong tệp \"%s\": %s\n"
+
+#: receivelog.c:212
+#, c-format
+msgid "%s: not renaming \"%s%s\", segment is not complete\n"
+msgstr "%s: không đổi tên \"%s%s\", phân đoạn chưa hoàn thành\n"
+
+#: receivelog.c:281
+#, c-format
+msgid "%s: server reported unexpected history file name for timeline %u: %s\n"
+msgstr ""
+"%s: server báo cáo tên tệp lịch sử không mong đợi cho timeline %u: %s\n"
+
+#: receivelog.c:289
+#, c-format
+msgid "%s: could not create timeline history file \"%s\": %s\n"
+msgstr "%s: không thể tạo tệp lịch sử cho timeline \"%s\": %s\n"
+
+#: receivelog.c:296
+#, c-format
+msgid "%s: could not write timeline history file \"%s\": %s\n"
+msgstr "%s: không thể ghi tệp lịch sử timeline \"%s\": %s\n"
+
+#: receivelog.c:386
+#, c-format
+msgid ""
+"%s: incompatible server version %s; client does not support streaming from "
+"server versions older than %s\n"
+msgstr ""
+"%s: phiên bản server không tÆ°Æ¡ng thích %s; client không há»— trợ truyá»n từ "
+"phiên bản server cũ hơn %s\n"
+
+#: receivelog.c:396
+#, c-format
+msgid ""
+"%s: incompatible server version %s; client does not support streaming from "
+"server versions newer than %s\n"
+msgstr ""
+"%s: phiên bản server không tÆ°Æ¡ng thích %s; client không há»— trợ truyá»n từ "
+"phiên bản server mới hơn %s\n"
+"\n"
+
+#: receivelog.c:501 streamutil.c:437 streamutil.c:476
+#, c-format
+msgid ""
+"%s: could not identify system: got %d rows and %d fields, expected %d rows "
+"and %d or more fields\n"
+msgstr ""
+"%s: không thể xác định hệ thống: có %d hàng và %d trÆ°á»ng, kỳ vá»ng %d hàng và "
+"%d hay nhiá»u hÆ¡n trÆ°á»ng\n"
+
+#: receivelog.c:509
+#, c-format
+msgid ""
+"%s: system identifier does not match between base backup and streaming "
+"connection\n"
+msgstr ""
+"%s: số nhận dạng hệ thống không khớp giữa sao lưu cơ sở và kết nối luồng "
+"truyá»n\n"
+
+#: receivelog.c:517
+#, c-format
+msgid "%s: starting timeline %u is not present in the server\n"
+msgstr "%s: timeline bắt đầu %u không tồn tại trong server\n"
+
+#: receivelog.c:559
+#, c-format
+msgid ""
+"%s: unexpected response to TIMELINE_HISTORY command: got %d rows and %d "
+"fields, expected %d rows and %d fields\n"
+msgstr ""
+"%s: phản hồi không mong muốn đối với lệnh TIMELINE_HISTORY: có %d hàng và %d "
+"trÆ°á»ng, kỳ vá»ng %d hàng và %d trÆ°á»ng\n"
+
+#: receivelog.c:631
+#, c-format
+msgid ""
+"%s: server reported unexpected next timeline %u, following timeline %u\n"
+msgstr ""
+"%s: server báo cáo không mong đợi timeline tiếp theo %u, timeline sau %u\n"
+
+#: receivelog.c:638
+#, c-format
+msgid ""
+"%s: server stopped streaming timeline %u at %X/%X, but reported next "
+"timeline %u to begin at %X/%X\n"
+msgstr ""
+"%s: server ngừng phát timeline %u ở %X/%X, nhưng đã báo cáo timeline tiếp "
+"theo %u để bắt đầu ở %X/%X\n"
+"\n"
+
+#: receivelog.c:680
+#, c-format
+msgid "%s: replication stream was terminated before stop point\n"
+msgstr "%s: luồng replication đã bị chấm dứt trước điểm dừng\n"
+
+#: receivelog.c:729
+#, c-format
+msgid ""
+"%s: unexpected result set after end-of-timeline: got %d rows and %d fields, "
+"expected %d rows and %d fields\n"
+msgstr ""
+"%s: tập hợp kết quả không mong muốn sau end-of-timeline: có %d hàng và %d "
+"trÆ°á»ng, kỳ vá»ng %d hàng và %d trÆ°á»ng\n"
+
+#: receivelog.c:739
+#, c-format
+msgid "%s: could not parse next timeline's starting point \"%s\"\n"
+msgstr ""
+"%s: không thể phân tích cú pháp điểm bắt đầu của timeline tiếp theo \"%s\"\n"
+
+#: receivelog.c:1110
+#, c-format
+msgid "%s: received write-ahead log record for offset %u with no file open\n"
+msgstr "%s: đã nhận bản ghi WAL cho offset %u với không tệp mở nào\n"
+
+#: receivelog.c:1121
+#, c-format
+msgid "%s: got WAL data offset %08x, expected %08x\n"
+msgstr "%s: có dữ liệu WAL offset %08x, kỳ vá»ng %08x\n"
+
+#: receivelog.c:1156
+#, c-format
+msgid "%s: could not write %u bytes to WAL file \"%s\": %s\n"
+msgstr "%s: không thể viết %u byte vào tệp WAL \"%s\": %s\n"
+
+#: receivelog.c:1181 receivelog.c:1222 receivelog.c:1253
+#, c-format
+msgid "%s: could not send copy-end packet: %s"
+msgstr "%s: không thể gửi gói tin copy-end: %s"
+
+#: streamutil.c:161
+msgid "Password: "
+msgstr "Mật khẩu: "
+
+#: streamutil.c:186
+#, c-format
+msgid "%s: could not connect to server\n"
+msgstr "%s: không thể kết nối tới server\n"
+
+#: streamutil.c:204
+#, c-format
+msgid "%s: could not connect to server: %s"
+msgstr "%s: không thể kết nối tới server: %s"
+
+#: streamutil.c:233
+#, c-format
+msgid "%s: could not clear search_path: %s\n"
+msgstr "%s: không thể xóa search_path: %s\n"
+
+#: streamutil.c:250
+#, c-format
+msgid "%s: could not determine server setting for integer_datetimes\n"
+msgstr "%s: không thể xác định thiết lập ở server cho integer_datetimes\n"
+
+#: streamutil.c:259
+#, c-format
+msgid "%s: integer_datetimes compile flag does not match server\n"
+msgstr "%s: flag biên dịch integer_datetimes không khớp với server\n"
+
+#: streamutil.c:303 streamutil.c:375
+#, c-format
+msgid "%s: could not send replication command \"%s\": %s\n"
+msgstr "%s: không thể gửi lệnh replication \"%s\": %s\n"
+
+#: streamutil.c:312
+#, c-format
+msgid ""
+"%s: could not fetch WAL segment size: got %d rows and %d fields, expected %d "
+"rows and %d or more fields\n"
+msgstr ""
+"%s: không thể fetch kích thÆ°á»›c phân Ä‘oạn WAL: có %d hàng và %d trÆ°á»ng, kỳ "
+"vá»ng %d hàng và %d hoặc nhiá»u hÆ¡n trÆ°á»ng\n"
+
+#: streamutil.c:322
+#, c-format
+msgid "%s: WAL segment size could not be parsed\n"
+msgstr "%s: Không thể phân tích cú pháp kích thước phân đoạn WAL\n"
+
+#: streamutil.c:339
+#, c-format
+msgid ""
+"%s: WAL segment size must be a power of two between 1MB and 1GB, but the "
+"remote server reported a value of %d bytes\n"
+msgstr ""
+"%s: kích thước phân đoạn WAL phải là lũy thừa của hai giữa 1MB và 1GB, nhưng "
+"remote server đã báo cáo giá trị %d byte\n"
+
+#: streamutil.c:384
+#, c-format
+msgid ""
+"%s: could not fetch group access flag: got %d rows and %d fields, expected "
+"%d rows and %d or more fields\n"
+msgstr ""
+"%s: không thể fetch cá» truy cập nhóm: có %d hàng và %d trÆ°á»ng, kỳ vá»ng %d "
+"hàng và %d hoặc nhiá»u hÆ¡n trÆ°á»ng\n"
+
+#: streamutil.c:393
+#, c-format
+msgid "%s: group access flag could not be parsed: %s\n"
+msgstr "%s: không thể phân tích cú pháp cỠtruy cập nhóm: %s\n"
+
+#: streamutil.c:554
+#, c-format
+msgid ""
+"%s: could not create replication slot \"%s\": got %d rows and %d fields, "
+"expected %d rows and %d fields\n"
+msgstr ""
+"%s: không thể tạo replication slot \"%s\": có %d hàng và %d trÆ°á»ng, kỳ vá»ng "
+"%d hàng và %d trÆ°á»ng\n"
+
+#: streamutil.c:599
+#, c-format
+msgid ""
+"%s: could not drop replication slot \"%s\": got %d rows and %d fields, "
+"expected %d rows and %d fields\n"
+msgstr ""
+"%s: không thể xóa replication slot \"%s\": có %d hàng và %d trÆ°á»ng, kỳ vá»ng "
+"%d hàng và %d trÆ°á»ng\n"
+
+#: walmethods.c:436 walmethods.c:906
+msgid "could not compress data"
+msgstr "không thể nén dữ liệu"
+
+#: walmethods.c:460
+msgid "could not reset compression stream"
+msgstr "không thể đặt lại luồng nén"
+
+#: walmethods.c:562
+msgid "could not initialize compression library"
+msgstr "không thể khởi tạo thư viện nén"
+
+#: walmethods.c:574
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "lá»—i triển khai: tệp tar không thể có nhiá»u hÆ¡n má»™t tệp mở"
+
+#: walmethods.c:588
+msgid "could not create tar header"
+msgstr "không thể tạo tiêu đỠtar"
+
+#: walmethods.c:602 walmethods.c:640 walmethods.c:829 walmethods.c:840
+msgid "could not change compression parameters"
+msgstr "không thể thay đổi thông số nén"
+
+#: walmethods.c:722
+msgid "unlink not supported with compression"
+msgstr "hủy liên kết không được hỗ trợ với nén"
+
+#: walmethods.c:922
+msgid "could not close compression stream"
+msgstr "không thể đóng luồng nén"
diff --git a/src/bin/pg_basebackup/po/zh_CN.po b/src/bin/pg_basebackup/po/zh_CN.po
new file mode 100644
index 0000000..8583ac2
--- /dev/null
+++ b/src/bin/pg_basebackup/po/zh_CN.po
@@ -0,0 +1,1431 @@
+# LANGUAGE message translation file for pg_basebackup
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 12\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-05-22 17:56+0800\n"
+"PO-Revision-Date: 2019-05-30 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@cn.fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@cn.fujitsu.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:188
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:195
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:202
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "内存溢出\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/file_utils.c:81 ../../common/file_utils.c:183
+#: pg_receivewal.c:267 pg_recvlogical.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法å–文件 \"%s\" 的状æ€: %m"
+
+#: ../../common/file_utils.c:160 pg_receivewal.c:170
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: ../../common/file_utils.c:194 pg_receivewal.c:338
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读å–目录 \"%s\": %m"
+
+#: ../../common/file_utils.c:226 ../../common/file_utils.c:285
+#: ../../common/file_utils.c:359 pg_basebackup.c:1761
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../common/file_utils.c:297 ../../common/file_utils.c:367
+#: pg_recvlogical.c:195
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "无法 fsync 文件 \"%s\": %m"
+
+#: ../../common/file_utils.c:377
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "无法把文件 \"%s\" é‡å‘½å为 \"%s\": %m"
+
+#: pg_basebackup.c:171
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "删除数æ®ç›®å½• \"%s\""
+
+#: pg_basebackup.c:173
+#, c-format
+msgid "failed to remove data directory"
+msgstr "删除数æ®ç›®å½•å¤±è´¥"
+
+#: pg_basebackup.c:177
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "删除数æ®ç›®å½• \"%s\" 的内容"
+
+#: pg_basebackup.c:179
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "删除数æ®ç›®å½•å†…容失败"
+
+#: pg_basebackup.c:184
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "正在删除WAL目录\"%s\""
+
+#: pg_basebackup.c:186
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "删除WAL目录失败"
+
+#: pg_basebackup.c:190
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "正在删除WAL目录 \"%s\" 的内容"
+
+#: pg_basebackup.c:192
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "删除WAL目录内容失败"
+
+#: pg_basebackup.c:198
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "在用户的è¦æ±‚下数æ®åº“目录 \"%s\" ä¸è¢«åˆ é™¤"
+
+#: pg_basebackup.c:201
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "在用户的è¦æ±‚下数æ®åº“目录 \"%s\" ä¸è¢«åˆ é™¤"
+
+#: pg_basebackup.c:205
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "对表空间目录的更改将ä¸ä¼šæ’¤æ¶ˆ"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "directory name too long"
+msgstr "å­—å…¸å太长"
+
+#: pg_basebackup.c:256
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "多个 \"=\" å·å‡ºçŽ°åœ¨è¡¨ç©ºé—´çš„映射中"
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "无效表空间映射表格å¼: \"%s\", 有效格å¼å¿…须为: \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:280
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "在表空间映射表:%s中的旧目录ä¸æ˜¯ä¸€ä¸ªç»å¯¹è·¯å¾„"
+
+#: pg_basebackup.c:287
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "在表空间映射表:%s中的新目录ä¸æ˜¯ä¸€ä¸ªç»å¯¹è·¯å¾„"
+
+#: pg_basebackup.c:326
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s 在è¿è¡Œçš„PostgreSQLæœåŠ¡å™¨ä¸Šæ‰§è¡ŒåŸºç¡€å¤‡ä»½.\n"
+"\n"
+
+#: pg_basebackup.c:328 pg_receivewal.c:81 pg_recvlogical.c:78
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_basebackup.c:329 pg_receivewal.c:82 pg_recvlogical.c:79
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [选项]...\n"
+
+#: pg_basebackup.c:330
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"控制输出的选项:\n"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY 接收基础备份到指定目录\n"
+
+#: pg_basebackup.c:332
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t è¾“å‡ºæ ¼å¼ (纯文本 (缺çœå€¼), tar压缩格å¼)\n"
+
+#: pg_basebackup.c:333
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE 传输数æ®ç›®å½•çš„最大传输速率\n"
+" (å•ä½ kB/s, 也å¯ä»¥ä½¿ç”¨åŽç¼€\"k\" 或 \"M\")\n"
+
+#: pg_basebackup.c:335
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" 为å¤åˆ¶å†™é…置文件\n"
+
+#: pg_basebackup.c:337
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" 将表空间由 OLDDIR é‡å®šä½åˆ° NEWDIR\n"
+
+#: pg_basebackup.c:339
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR 预写日志目录的ä½ç½®\n"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" 按指定的模å¼åŒ…å«å¿…需的WAL日志文件\n"
+
+#: pg_basebackup.c:342
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip 对tar文件进行压缩输出\n"
+
+#: pg_basebackup.c:343
+#, c-format
+msgid " -Z, --compress=0-9 compress tar output with given compression level\n"
+msgstr " -Z, --compress=0-9 按给定的压缩级别对tar文件进行压缩输出\n"
+
+#: pg_basebackup.c:344
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般选项:\n"
+
+#: pg_basebackup.c:345
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" 设置检查点方å¼(fast或者spread)\n"
+
+#: pg_basebackup.c:347
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot 创建å¤åˆ¶æ§½\n"
+
+#: pg_basebackup.c:348
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL 设置备份标签\n"
+
+#: pg_basebackup.c:349
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 出错åŽä¸æ¸…ç†\n"
+
+#: pg_basebackup.c:350
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ä¸ç”¨ç­‰å¾…å˜åŒ–安全的写入ç£ç›˜\n"
+
+#: pg_basebackup.c:351
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 显示进度信æ¯\n"
+
+#: pg_basebackup.c:352 pg_receivewal.c:91
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME 用于å¤åˆ¶çš„槽å\n"
+
+#: pg_basebackup.c:353 pg_receivewal.c:93 pg_recvlogical.c:99
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 输出详细的消æ¯\n"
+
+#: pg_basebackup.c:354 pg_receivewal.c:94 pg_recvlogical.c:100
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_basebackup.c:355
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot 防止创建临时å¤åˆ¶æ§½\n"
+
+#: pg_basebackup.c:356
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" ä¸éªŒè¯æ ¡éªŒå’Œ\n"
+
+#: pg_basebackup.c:358 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示帮助, 然åŽé€€å‡º\n"
+
+#: pg_basebackup.c:359 pg_receivewal.c:97 pg_recvlogical.c:102
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"è”接选项:\n"
+
+#: pg_basebackup.c:360 pg_receivewal.c:98
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR 连接串\n"
+
+#: pg_basebackup.c:361 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME æ•°æ®åº“æœåŠ¡å™¨ä¸»æœºæˆ–者是socket目录\n"
+
+#: pg_basebackup.c:362 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT æ•°æ®åº“æœåŠ¡å™¨ç«¯å£å·\n"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" å‘å¾€æœåŠ¡å™¨çš„状æ€åŒ…的时间间隔 (以秒计)\n"
+
+#: pg_basebackup.c:365 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 指定连接所需的数æ®åº“用户å\n"
+
+#: pg_basebackup.c:366 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ç¦ç”¨è¾“入密ç çš„æ示\n"
+
+#: pg_basebackup.c:367 pg_receivewal.c:103 pg_recvlogical.c:108
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password 强制æç¤ºè¾“å…¥å¯†ç  (应该自动å‘生)\n"
+
+#: pg_basebackup.c:368 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"报告错误至 <pgsql-bugs@lists.postgresql.org>.\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "无法从准备就绪的管é“: %m读"
+
+#: pg_basebackup.c:417 pg_basebackup.c:545 pg_basebackup.c:2099
+#: streamutil.c:450
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "无法解æžæ¥è‡ª \"%s\"的预写日志"
+
+#: pg_basebackup.c:510 pg_receivewal.c:442
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "无法完æˆå†™å…¥WAL文件: %m"
+
+#: pg_basebackup.c:557
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "无法为åŽå°è¿›ç¨‹: %m创建管é“"
+
+#: pg_basebackup.c:592
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "已创建临时å¤åˆ¶æ§½\"%s\""
+
+#: pg_basebackup.c:595
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "已创建å¤åˆ¶æ§½\"%s\""
+
+#: pg_basebackup.c:615 pg_basebackup.c:668 pg_basebackup.c:1503
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: pg_basebackup.c:633
+#, c-format
+msgid "could not create background process: %m"
+msgstr "无法创建åŽå°è¿›ç¨‹: %m"
+
+#: pg_basebackup.c:645
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "无法创建åŽå°çº¿ç¨‹: %m"
+
+#: pg_basebackup.c:689
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "目录\"%s\"已存在,但ä¸æ˜¯ç©ºçš„"
+
+#: pg_basebackup.c:696
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "无法访问目录 \"%s\": %m"
+
+#: pg_basebackup.c:757
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d 表空间 %*s"
+msgstr[1] "%*s/%s kB (100%%), %d/%d 多个表空间 %*s"
+
+#: pg_basebackup.c:769
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d 表空间 (%s%-*.*s)"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d 多个表空间 (%s%-*.*s)"
+
+#: pg_basebackup.c:785
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d 表空间"
+msgstr[1] "%*s/%s kB (%d%%), %d/%d 多个表空间"
+
+#: pg_basebackup.c:809
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "传输速率\"%s\"ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆå€¼"
+
+#: pg_basebackup.c:814
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "无效的传输速率\"%s\": %m"
+
+#: pg_basebackup.c:823
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "传输速率必须大于0"
+
+#: pg_basebackup.c:855
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "无效的 --max-rate å•ä½: \"%s\""
+
+#: pg_basebackup.c:862
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "传输速率 \"%s\" 超出了整数范围"
+
+#: pg_basebackup.c:872
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "传输速率 \"%s\" 超出范围"
+
+#: pg_basebackup.c:894
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "无法往压缩文件里写\"%s\": %s"
+
+#: pg_basebackup.c:904 pg_basebackup.c:1592 pg_basebackup.c:1767
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: pg_basebackup.c:969 pg_basebackup.c:989 pg_basebackup.c:1016
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "无法设置压缩级别 %d: %s"
+
+#: pg_basebackup.c:1036
+#, c-format
+msgid "could not create compressed file \"%s\": %s"
+msgstr "无法创建压缩文件 \"%s\": %s"
+
+#: pg_basebackup.c:1047 pg_basebackup.c:1553 pg_basebackup.c:1779
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "无法创建文件 \"%s\": %m"
+
+#: pg_basebackup.c:1058 pg_basebackup.c:1412
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "无法得到å¤åˆ¶æ•°æ®æµ: %s"
+
+#: pg_basebackup.c:1143
+#, c-format
+msgid "could not close compressed file \"%s\": %s"
+msgstr "无法关闭压缩文件 \"%s\": %s"
+
+#: pg_basebackup.c:1155 pg_recvlogical.c:608
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: pg_basebackup.c:1166 pg_basebackup.c:1441 pg_recvlogical.c:437
+#: receivelog.c:968
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "无法读å–å¤åˆ¶æ•°æ®: %s"
+
+#: pg_basebackup.c:1455
+#, c-format
+msgid "invalid tar block header size: %d"
+msgstr "无效的tar压缩å—头大å°: %d"
+
+#: pg_basebackup.c:1510
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "无法为目录 \"%s\" 的设置æƒé™: %m"
+
+#: pg_basebackup.c:1533
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "无法创建从 \"%s\" 到 \"%s\"的符å·é“¾æŽ¥: %m"
+
+#: pg_basebackup.c:1540
+#, c-format
+msgid "unrecognized link indicator \"%c\""
+msgstr "无法识别的链接标识符 \"%c\""
+
+#: pg_basebackup.c:1559
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "无法设置文件 \"%s\" çš„æƒé™: %m"
+
+#: pg_basebackup.c:1616
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "å¤åˆ¶æµåœ¨æœ€åŽä¸€ä¸ªæ–‡ä»¶ç»“æŸå‰ç»ˆæ­¢"
+
+#: pg_basebackup.c:1643 pg_basebackup.c:1663 pg_basebackup.c:1677
+#: pg_basebackup.c:1728
+#, c-format
+msgid "out of memory"
+msgstr "内存用尽"
+
+#: pg_basebackup.c:1820
+#, c-format
+msgid "incompatible server version %s"
+msgstr "ä¸å…¼å®¹çš„æœåŠ¡å™¨ç‰ˆæœ¬å· %s"
+
+#: pg_basebackup.c:1835
+#, c-format
+msgid "HINT: use -X none or -X fetch to disable log streaming"
+msgstr "æ示:使用-X none或-X fetchç¦ç”¨æ—¥å¿—æµ"
+
+#: pg_basebackup.c:1860
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "开始基础备份,等待检查点完æˆ"
+
+#: pg_basebackup.c:1884 pg_recvlogical.c:264 receivelog.c:484 receivelog.c:533
+#: receivelog.c:572 streamutil.c:299 streamutil.c:370 streamutil.c:422
+#: streamutil.c:533 streamutil.c:578
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "无法å‘é€å¤åˆ¶å‘½ä»¤ \"%s\": %s"
+
+#: pg_basebackup.c:1895
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "无法å‘起基础备份: %s"
+
+#: pg_basebackup.c:1901
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "æœåŠ¡å™¨å¯¹BASE_BACKUP命令返回æ„外的å“应; 得到 %d 行和 %d 列, 期望值为: %d 行和 %d 列"
+
+#: pg_basebackup.c:1909
+#, c-format
+msgid "checkpoint completed"
+msgstr "已完æˆæ£€æŸ¥ç‚¹"
+
+#: pg_basebackup.c:1924
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "预写日志起始于时间点: %s, 基于时间轴%u"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "无法得到备份头: %s"
+
+#: pg_basebackup.c:1939
+#, c-format
+msgid "no data returned from server"
+msgstr "æœåŠ¡å™¨æ²¡æœ‰æ•°æ®è¿”回"
+
+#: pg_basebackup.c:1970
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "åªèƒ½æŠŠè¡¨ç©ºé—´å†™å¾€æ ‡å‡†è¾“出, æ•°æ®åº“拥有标准输出: %d"
+
+#: pg_basebackup.c:1982
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "å¯åŠ¨åŽå° WAL 接收进程"
+
+#: pg_basebackup.c:2012
+#, c-format
+msgid "could not get write-ahead log end position from server: %s"
+msgstr "无法得到æ¥è‡ªæœåŠ¡å™¨çš„预写日志终止ä½ç½®: %s"
+
+#: pg_basebackup.c:2018
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "æœåŠ¡å™¨ç«¯æ²¡æœ‰è¿”回预写日志的终止ä½ç½®"
+
+#: pg_basebackup.c:2023
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "预写日志结æŸç‚¹: %s"
+
+#: pg_basebackup.c:2034
+#, c-format
+msgid "checksum error occurred"
+msgstr "å‘生校验和错误"
+
+#: pg_basebackup.c:2039
+#, c-format
+msgid "final receive failed: %s"
+msgstr "最终接收失败: %s"
+
+#: pg_basebackup.c:2063
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "等待åŽå°è¿›ç¨‹ç»“æŸæµæ“作..."
+
+#: pg_basebackup.c:2068
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "无法å‘é€å‘½ä»¤åˆ°åŽå°ç®¡é“: %m"
+
+#: pg_basebackup.c:2076
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "无法等待å­è¿›ç¨‹: %m"
+
+#: pg_basebackup.c:2081
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "å­è¿›ç¨‹ %d 已终止, 期望值为 %d"
+
+#: pg_basebackup.c:2086 streamutil.c:94
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2111
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "无法等待å­çº¿ç¨‹: %m"
+
+#: pg_basebackup.c:2117
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "无法得到å­çº¿ç¨‹é€€å‡ºçŠ¶æ€: %m"
+
+#: pg_basebackup.c:2122
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "å­çº¿ç¨‹é€€å‡º, 错误ç ä¸º: %u"
+
+#: pg_basebackup.c:2150
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "åŒæ­¥æ•°æ®åˆ°ç£ç›˜..."
+
+#: pg_basebackup.c:2163
+#, c-format
+msgid "base backup completed"
+msgstr "基础备份已完æˆ"
+
+#: pg_basebackup.c:2244
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"\n"
+msgstr "无效输出格å¼: \"%s\", 有效值为: \"plain\" 或者 \"tar\"\n"
+
+#: pg_basebackup.c:2288
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "无效的wal-method 选项: \"%s\", 必须是: \"fetch\" 或者 \"stream\" 或者 \"none\""
+
+#: pg_basebackup.c:2316
+#, c-format
+msgid "invalid compression level \"%s\"\n"
+msgstr "无效的压缩级别值: \"%s\"\n"
+
+#: pg_basebackup.c:2327
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "无效的检查点å‚æ•°: \"%s\", 必须是: \"fast\" 或 \"spread\""
+
+#: pg_basebackup.c:2354 pg_receivewal.c:556 pg_recvlogical.c:796
+#, c-format
+msgid "invalid status interval \"%s\""
+msgstr "无效的状æ€é—´éš”值: \"%s\""
+
+#: pg_basebackup.c:2372 pg_basebackup.c:2385 pg_basebackup.c:2396
+#: pg_basebackup.c:2407 pg_basebackup.c:2415 pg_basebackup.c:2423
+#: pg_basebackup.c:2433 pg_basebackup.c:2446 pg_basebackup.c:2454
+#: pg_basebackup.c:2465 pg_basebackup.c:2475 pg_receivewal.c:606
+#: pg_receivewal.c:619 pg_receivewal.c:627 pg_receivewal.c:637
+#: pg_receivewal.c:645 pg_receivewal.c:656 pg_recvlogical.c:822
+#: pg_recvlogical.c:835 pg_recvlogical.c:846 pg_recvlogical.c:854
+#: pg_recvlogical.c:862 pg_recvlogical.c:870 pg_recvlogical.c:878
+#: pg_recvlogical.c:886 pg_recvlogical.c:894
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_basebackup.c:2383 pg_receivewal.c:617 pg_recvlogical.c:833
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_basebackup.c:2395 pg_receivewal.c:655
+#, c-format
+msgid "no target directory specified"
+msgstr "没有指定目标目录"
+
+#: pg_basebackup.c:2406
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "åªæœ‰tar模å¼å¤‡ä»½æ‰èƒ½è¿›è¡ŒåŽ‹ç¼©"
+
+#: pg_basebackup.c:2414
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "无法将tar模å¼ä¸‹çš„预写日志æµå¼ä¼ è¾“到stdout"
+
+#: pg_basebackup.c:2422
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "å¤åˆ¶æ§½åªèƒ½å’ŒWALæµå¤åˆ¶ä¸€èµ·ä½¿ç”¨"
+
+#: pg_basebackup.c:2432
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot ä¸èƒ½ä¸Žæ§½å称一起使用"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2444 pg_receivewal.c:635
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s需è¦ä½¿ç”¨--slot指定一个槽"
+
+#: pg_basebackup.c:2453
+#, c-format
+msgid "--create-slot and --no-slot are incompatible options"
+msgstr "--create-slot å’Œ --no-slot 是互ä¸å…¼å®¹çš„选项"
+
+#: pg_basebackup.c:2464
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL目录的ä½ç½®åªèƒ½åœ¨ç®€å•æ¨¡å¼é‡ŒæŒ‡å®š"
+
+#: pg_basebackup.c:2474
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL目录的ä½ç½®å¿…须为ç»å¯¹è·¯å¾„"
+
+#: pg_basebackup.c:2484 pg_receivewal.c:664
+#, c-format
+msgid "this build does not support compression"
+msgstr "这个编译版本ä¸æ”¯æŒåŽ‹ç¼©"
+
+#: pg_basebackup.c:2538
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "无法创建符å·é“¾æŽ¥ \"%s\": %m"
+
+#: pg_basebackup.c:2542
+#, c-format
+msgid "symlinks are not supported on this platform"
+msgstr "在这个平å°ä¸Šä¸æ”¯æŒç¬¦å·é“¾æŽ¥"
+
+#: pg_receivewal.c:79
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s 接收PostgreSQLçš„æµé¢„写日志.\n"
+"\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:84
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_receivewal.c:84
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR 接收预写日志到指定的目录\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:85
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN 收到指定LSNåŽé€€å‡º\n"
+
+#: pg_receivewal.c:86 pg_recvlogical.c:89
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists 在创建一个槽时如果槽已ç»å­˜åœ¨åˆ™ä¸äº§ç”Ÿé”™è¯¯\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:91
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop 连接丢失时ä¸è¿›è¡Œå¾ªçŽ¯å¤„ç†\n"
+
+#: pg_receivewal.c:88
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync ä¸ç”¨ç­‰å¾…å˜åŒ–安全写入ç£ç›˜\n"
+
+#: pg_receivewal.c:89 pg_recvlogical.c:96
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" å‘å¾€æœåŠ¡å™¨çš„状æ€åŒ…的时间间隔 (默认为: %d)\n"
+
+#: pg_receivewal.c:92
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous 在写入åŽç«‹å³åˆ·å†™é¢„写日志\n"
+
+#: pg_receivewal.c:95
+#, c-format
+msgid " -Z, --compress=0-9 compress logs with given compression level\n"
+msgstr " -Z, --compress=0-9 按给定的压缩级别对日志文件进行压缩\n"
+
+#: pg_receivewal.c:104
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"å¯é€‰åŠ¨ä½œï¼š\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:81
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot 创建新的å¤åˆ¶æ§½(槽å请å‚考选项 --slot)\n"
+
+#: pg_receivewal.c:106 pg_recvlogical.c:82
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot 删除å¤åˆ¶æ§½ (槽å请å‚考选项 --slot)\n"
+
+#: pg_receivewal.c:118
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "在 %X/%X (时间线 %u)处完æˆæ®µ"
+
+#: pg_receivewal.c:125
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "在时间点: %X/%X (时间线%u)åœæ­¢æ—¥å¿—çš„æµæ“作"
+
+#: pg_receivewal.c:141
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "切æ¢åˆ°æ—¶é—´è¡¨ %u 在 %X/%X"
+
+#: pg_receivewal.c:151
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "接收到终断信å·, 正在退出"
+
+#: pg_receivewal.c:187
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_receivewal.c:273
+#, c-format
+msgid "segment file \"%s\" has incorrect size %d, skipping"
+msgstr "段文件 \"%s\" 大å°å€¼: %dä¸æ­£ç¡®, 跳过"
+
+#: pg_receivewal.c:291
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "无法打开压缩文件 \"%s\": %m"
+
+#: pg_receivewal.c:297
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "无法在压缩文件\"%s\"进行查找: %m"
+
+#: pg_receivewal.c:305
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "无法读å–压缩文件\"%s\": %m"
+
+#: pg_receivewal.c:308
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "无法读å–压缩的文件\"%1$s\":读å–了%3$zu中的%2$d"
+
+#: pg_receivewal.c:319
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "压缩的段文件\"%s\"未压缩大å°å€¼: %dä¸æ­£ç¡®, 跳过"
+
+#: pg_receivewal.c:423
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "在时间点: %X/%X (时间线%u)å¯åŠ¨æ—¥å¿—çš„æµæ“作"
+
+#: pg_receivewal.c:538 pg_recvlogical.c:738
+#, c-format
+msgid "invalid port number \"%s\""
+msgstr "无效端å£å·: \"%s\""
+
+#: pg_receivewal.c:566 pg_recvlogical.c:764
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "无法解æžç»“æŸä½ç½®\"%s\""
+
+#: pg_receivewal.c:581
+#, c-format
+msgid "invalid compression level \"%s\""
+msgstr "无效的压缩级别值: \"%s\""
+
+#: pg_receivewal.c:626
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "ä¸èƒ½æŠŠ--create-slotå’Œ--drop-slot一起使用"
+
+#: pg_receivewal.c:644
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "ä¸èƒ½æŠŠ--synchronouså’Œ--no-sync一起使用"
+
+#: pg_receivewal.c:720
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "使用槽\"%s\"çš„å¤åˆ¶è¿žæŽ¥æ„外地ä¸æ˜¯æŒ‡å®šçš„æ•°æ®åº“"
+
+#: pg_receivewal.c:731 pg_recvlogical.c:942
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "删除å¤åˆ¶æ§½\"%s\""
+
+#: pg_receivewal.c:742 pg_recvlogical.c:952
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "创建å¤åˆ¶æ§½ \"%s\""
+
+#: pg_receivewal.c:768 pg_recvlogical.c:977
+#, c-format
+msgid "disconnected"
+msgstr "连接已断开"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:774 pg_recvlogical.c:983
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "连接已断开, 将于%d 秒åŽå°è¯•é‡è¿ž"
+
+#: pg_recvlogical.c:76
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s 控制PostgreSQL逻辑解ç æµã€‚\n"
+"\n"
+
+#: pg_recvlogical.c:80
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"å³å°†æ‰§è¡Œçš„动作:\n"
+
+#: pg_recvlogical.c:83
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start å¤åˆ¶æ§½ä¸­å¯åŠ¨æµå¤åˆ¶(槽å请å‚考选项 --slot)\n"
+
+#: pg_recvlogical.c:86
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE 接收日志到这个文件, - 为标准输出\n"
+
+#: pg_recvlogical.c:87
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" 写往输出文件的文件åŒæ­¥çš„时间间隔 (默认值为: %d)\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN 在当å‰æ§½ä¸­æµå¤åˆ¶å¯åŠ¨çš„起始ä½ç½®\n"
+
+#: pg_recvlogical.c:92
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" 选项NAME附带å¯é€‰å€¼VALUEç»™\n"
+" 输出æ’件\n"
+
+#: pg_recvlogical.c:95
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN 使用输出æ’件PLUGIN (默认为: %s)\n"
+
+#: pg_recvlogical.c:98
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME 逻辑å¤åˆ¶æ§½çš„åå­—\n"
+
+#: pg_recvlogical.c:103
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME è¦è¿žæŽ¥çš„目标数æ®åº“\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "确认上写至%X/%X, 并刷写回至 %X/%X (槽 %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:346
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "无法å‘é€å›žé¦ˆåŒ…: %s"
+
+#: pg_recvlogical.c:232
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "在%X/%X (槽 %s)ä½ç½®å¯åŠ¨æ—¥å¿—æµ"
+
+#: pg_recvlogical.c:273
+#, c-format
+msgid "streaming initiated"
+msgstr "æµå·²åˆå§‹åŒ–"
+
+#: pg_recvlogical.c:337
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "无法打开事务日志文件 \"%s\": %m"
+
+#: pg_recvlogical.c:363 receivelog.c:876
+#, c-format
+msgid "invalid socket: %s"
+msgstr "无效套接字: %s"
+
+#: pg_recvlogical.c:416 receivelog.c:904
+#, c-format
+msgid "select() failed: %m"
+msgstr "select() 失败: %m"
+
+#: pg_recvlogical.c:423 receivelog.c:954
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "无法从WALæµä¸­èŽ·å¾—æ•°æ®: %s"
+
+#: pg_recvlogical.c:465 pg_recvlogical.c:516 receivelog.c:998
+#: receivelog.c:1064
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "æµå¤´å¤§å°: %d 值太å°"
+
+#: pg_recvlogical.c:500 receivelog.c:836
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "无法识别的æµå¤´: \"%c\""
+
+#: pg_recvlogical.c:554 pg_recvlogical.c:566
+#, c-format
+msgid "could not write %u bytes to log file \"%s\": %m"
+msgstr "无法写入 %u 字节到日志文件 \"%s\": %m"
+
+#: pg_recvlogical.c:594 receivelog.c:632 receivelog.c:669
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "æµå¤åˆ¶å¼‚常终止: %s"
+
+#: pg_recvlogical.c:718
+#, c-format
+msgid "invalid fsync interval \"%s\""
+msgstr "无效的fsyncåŒæ­¥æ—¶é—´é—´éš”值: \"%s\""
+
+#: pg_recvlogical.c:756
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "无法解æžèµ·å§‹ä½ç½®\"%s\""
+
+#: pg_recvlogical.c:845
+#, c-format
+msgid "no slot specified"
+msgstr "没有指定槽"
+
+#: pg_recvlogical.c:853
+#, c-format
+msgid "no target file specified"
+msgstr "没有指定目标文件"
+
+#: pg_recvlogical.c:861
+#, c-format
+msgid "no database specified"
+msgstr "没有指定数æ®åº“"
+
+#: pg_recvlogical.c:869
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "至少è¦æŒ‡å®šä¸€ä¸ªæ“作"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "ä¸èƒ½ä½¿ç”¨ --create-slot 选项或 åŒæ—¶ä½¿ç”¨--startå’Œ--drop-slot两个选项"
+
+#: pg_recvlogical.c:885
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "ä¸èƒ½ä½¿ç”¨ --create-slot 选项或 åŒæ—¶ä½¿ç”¨--drop-slotå’Œ--startpos两个选项"
+
+#: pg_recvlogical.c:893
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "åªèƒ½ç”¨--start选项指定--endpos选项"
+
+#: pg_recvlogical.c:924
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "无法建立数æ®åº“相关的å¤åˆ¶è¿žæŽ¥"
+
+#: pg_recvlogical.c:1023
+#, c-format
+msgid "endpos %X/%X reached by keepalive"
+msgstr "keepalive已到达endpos %X/%X"
+
+#: pg_recvlogical.c:1026
+#, c-format
+msgid "endpos %X/%X reached by record at %X/%X"
+msgstr "记录在%X/%X到达了endpos %X/%X"
+
+#: receivelog.c:72
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "无法创建归档状æ€æ–‡ä»¶ \"%s\": %s"
+
+#: receivelog.c:119
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "无法获得预写日志文件\"%s\"的大å°: %s"
+
+#: receivelog.c:129
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "无法打开存在的预写日志文件\"%s\": %s"
+
+#: receivelog.c:137
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "无法åŒæ­¥å­˜åœ¨çš„预写日志文件\"%s\": %s"
+
+#: receivelog.c:151
+#, c-format
+msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d"
+msgstr[0] "预写日志文件 \"%s\"有%d个字节,应该是0或者 %d"
+msgstr[1] "预写日志文件 \"%s\"有%d个字节,应该是0或者 %d"
+
+#: receivelog.c:166
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "无法打开预写日志文件 \"%s\": %s"
+
+#: receivelog.c:192
+#, c-format
+msgid "could not determine seek position in file \"%s\": %s"
+msgstr "无法确定文件 \"%s\"的当å‰ä½ç½®: %s"
+
+#: receivelog.c:206
+#, c-format
+msgid "not renaming \"%s%s\", segment is not complete"
+msgstr "没有é‡å‘½å \"%s%s\", 段ä¸å®Œæ•´"
+
+#: receivelog.c:218 receivelog.c:303 receivelog.c:678
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "无法关闭文件\"%s\": %s"
+
+#: receivelog.c:275
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "æœåŠ¡å™¨ä¸ºæ—¶é—´è¡¨æŠ¥å‘Šç”Ÿæˆçš„æ„外历å²æ–‡ä»¶å %u:%s"
+
+#: receivelog.c:283
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "无法创建时间表历å²æ–‡ä»¶ \"%s\": %s"
+
+#: receivelog.c:290
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "无法写时间表历å²æ–‡ä»¶ \"%s\": %s"
+
+#: receivelog.c:380
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "ä¸å…¼å®¹çš„æœåŠ¡å™¨ç‰ˆæœ¬å· %s; 当æœåŠ¡å™¨ç‰ˆæœ¬ä½ŽäºŽ%s时客户端ä¸æ”¯æŒæµå¤åˆ¶"
+
+#: receivelog.c:389
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "ä¸å…¼å®¹çš„æœåŠ¡å™¨ç‰ˆæœ¬å· %s; 当æœåŠ¡å™¨ç‰ˆæœ¬é«˜äºŽ%s时客户端ä¸æ”¯æŒæµå¤åˆ¶"
+
+#: receivelog.c:491 streamutil.c:430 streamutil.c:467
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "无法识别系统: 得到 %d 行和 %d 列, 期望值为: %d 行和 %d 列"
+
+#: receivelog.c:498
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "基础备份和æµè¿žæŽ¥çš„系统标识符ä¸åŒ¹é…"
+
+#: receivelog.c:504
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "æœåŠ¡å™¨ä¸Šæ²¡æœ‰èµ·å§‹æ—¶é—´è¡¨ %u"
+
+#: receivelog.c:545
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "获得命令TIMELINE_HISTORYçš„æ„外å“应: 得到 %d 行和 %d 列, 期望值为: %d 行和 %d 列"
+
+#: receivelog.c:616
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "æœåŠ¡å™¨æŠ¥å‡ºçš„下次æ„外时间表 %u, 紧跟时间表 %u之åŽ"
+
+#: receivelog.c:622
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "æœåŠ¡å™¨åœ¨%2$X/%3$Xæ—¶åœæ­¢æµæ“作时间表%1$u, 但是报出将在%5$X/%6$X时开始下一个时间表%4$u"
+
+#: receivelog.c:662
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "æµå¤åˆ¶åœ¨åœæ­¢ç‚¹ä¹‹å‰å¼‚常终止"
+
+#: receivelog.c:708
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "终点时间表的æ„外结果集: 得到 %d 行和 %d 列, 期望值为: %d 行和 %d 列"
+
+#: receivelog.c:717
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "无法解æžä¸‹æ¬¡æ—¶é—´è¡¨çš„起始点\"%s\""
+
+#: receivelog.c:766 receivelog.c:1018
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "无法 fsync 文件 \"%s\": %s"
+
+#: receivelog.c:1081
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "å移ä½ç½® %u 处接收到的预写日志记录没有打开文件"
+
+#: receivelog.c:1091
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "得到WALæ•°æ®å移 %08x, 期望值为 %08x"
+
+#: receivelog.c:1125
+#, c-format
+msgid "could not write %u bytes to WAL file \"%s\": %s"
+msgstr "无法写入 %u 字节到 WAL 文件 \"%s\": %s"
+
+#: receivelog.c:1150 receivelog.c:1190 receivelog.c:1221
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "无法å‘é€å‰¯æœ¬ç»“æŸåŒ…: %s"
+
+#: streamutil.c:162
+msgid "Password: "
+msgstr "å£ä»¤: "
+
+#: streamutil.c:187
+#, c-format
+msgid "could not connect to server"
+msgstr "无法连接到æœåŠ¡å™¨"
+
+#: streamutil.c:204
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "无法连接到æœåŠ¡å™¨ï¼š%s"
+
+#: streamutil.c:233
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "无法清除search_path: %s"
+
+#: streamutil.c:249
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "无法确定æœåŠ¡å™¨ä¸Šinteger_datetimesçš„é…ç½®"
+
+#: streamutil.c:256
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes编译开关与æœåŠ¡å™¨ç«¯ä¸åŒ¹é…"
+
+#: streamutil.c:307
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "无法获å–WAL段的大å°ï¼šå¾—到 %d 行和 %d 列, 期望值为: %d 行和 %d 列"
+
+#: streamutil.c:317
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "ä¸èƒ½è§£æžWAL段的大å°"
+
+#: streamutil.c:332
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL段的大å°å¿…须是2的幂次方(在1MBå’Œ1GB之间),但是远程æœåŠ¡å™¨æŠ¥å‘Šçš„值是%d字节"
+msgstr[1] " WAL段的大å°å¿…须是2的幂次方(在1MBå’Œ1GB之间),但是远程æœåŠ¡å™¨æŠ¥å‘Šçš„值是%d字节"
+
+#: streamutil.c:378
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "无法获å–组访问标志:得到 %d 行和 %d 列,期望值为: %d 行和 %d 列"
+
+#: streamutil.c:387
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "ä¸èƒ½è§£æžç»„访问标志: %s"
+
+#: streamutil.c:544
+#, 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列"
+
+#: streamutil.c:588
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "无法删除å¤åˆ¶æ§½ \"%s\": 得到%dè¡Œ%d列, 但期望值为%dè¡Œ%d列"
+
+#: walmethods.c:439 walmethods.c:928
+msgid "could not compress data"
+msgstr "无法压缩数æ®"
+
+#: walmethods.c:471
+msgid "could not reset compression stream"
+msgstr "无法é‡ç½®åŽ‹ç¼©æµ"
+
+#: walmethods.c:569
+msgid "could not initialize compression library"
+msgstr "无法åˆå§‹åŒ–压缩库"
+
+#: walmethods.c:581
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "实现错误:tar文件ä¸èƒ½æœ‰å¤šä¸ªæ‰“开的文件"
+
+#: walmethods.c:595
+msgid "could not create tar header"
+msgstr "无法创建tar头"
+
+#: walmethods.c:609 walmethods.c:649 walmethods.c:844 walmethods.c:855
+msgid "could not change compression parameters"
+msgstr "无法更改压缩å‚æ•°"
+
+#: walmethods.c:731
+msgid "unlink not supported with compression"
+msgstr "压缩ä¸æ”¯æŒå–消链接"
+
+#: walmethods.c:953
+msgid "could not close compression stream"
+msgstr "无法关闭压缩æµ"
diff --git a/src/bin/pg_basebackup/po/zh_TW.po b/src/bin/pg_basebackup/po/zh_TW.po
new file mode 100644
index 0000000..15c887e
--- /dev/null
+++ b/src/bin/pg_basebackup/po/zh_TW.po
@@ -0,0 +1,1890 @@
+# Traditional Chinese message translation file for pg_basebackup
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_basebackup (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_basebackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:48+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+#: ../../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
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "此版本ä¸æ”¯æ´ä½¿ç”¨ %s 進行壓縮"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "在é æœŸå£“縮é¸é …的地方發ç¾ç©ºå­—串"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "無法辨識的壓縮é¸é …: %s"
+
+# bootstrap/bootstrap.c:304 postmaster/postmaster.c:500 tcop/postgres.c:2507
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "壓縮é¸é … \"%s\" 需è¦æ供數值"
+
+# commands/define.c:233
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "壓縮é¸é … \"%s\" 的數值必須是整數"
+
+# commands/define.c:233
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "壓縮é¸é … \"%s\" 的數值必須是布林值"
+
+# commands/indexcmds.c:623
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "壓縮演算法 \"%s\" ä¸æŽ¥å—壓縮等級"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "壓縮演算法 \"%s\" é æœŸçš„壓縮等級應在 %d 到 %d 之間(é è¨­å€¼ %d)"
+
+# commands/indexcmds.c:623
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "壓縮演算法 \"%s\" ä¸æ”¯æ´å·¥ä½œåŸ·è¡Œç·’數目設定"
+
+# commands/indexcmds.c:224
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "壓縮演算法 \"%s\" ä¸æ”¯æ´é•·è·é›¢æ¨¡å¼"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體ä¸è¶³\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+# access/transam/xlog.c:1936 access/transam/xlog.c:2038
+# access/transam/xlog.c:5291
+#: ../../common/file_utils.c:87 ../../common/file_utils.c:447
+#: pg_receivewal.c:319 pg_recvlogical.c:339
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "無法å–得檔案 \"%s\" 的狀態: %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: ../../common/file_utils.c:162 pg_receivewal.c:242
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄 \"%s\": %m"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#: ../../common/file_utils.c:196 pg_receivewal.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "無法讀å–目錄 \"%s\": %m"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: ../../common/file_utils.c:228 ../../common/file_utils.c:287
+#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121
+#: pg_receivewal.c:386
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案 \"%s\": %m"
+
+# access/transam/slru.c:673 access/transam/xlog.c:1562
+# access/transam/xlog.c:1686 access/transam/xlog.c:3008
+#: ../../common/file_utils.c:299 ../../common/file_utils.c:369
+#: pg_recvlogical.c:194
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "無法 fsync 檔案 \"%s\": %m"
+
+# access/transam/xlog.c:3037 access/transam/xlog.c:3819
+# access/transam/xlog.c:3862 commands/user.c:282 commands/user.c:412
+# postmaster/pgarch.c:597
+#: ../../common/file_utils.c:379 pg_basebackup.c:2238 walmethods.c:462
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "無法將檔案 \"%s\" æ›´å為 \"%s\": %m"
+
+# utils/adt/formatting.c:2044
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "é¸é … %2$s 的值 \"%1$s\" 無效"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1610
+#, c-format
+msgid "out of memory"
+msgstr "記憶體ä¸è¶³"
+
+# access/transam/xlog.c:1555 access/transam/xlog.c:1679
+# access/transam/xlog.c:2964 access/transam/xlog.c:3002 commands/copy.c:1117
+# commands/tablespace.c:668 commands/tablespace.c:674
+# postmaster/postmaster.c:3430 utils/init/miscinit.c:832
+# utils/init/miscinit.c:841 utils/misc/guc.c:4934 utils/misc/guc.c:4998
+#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121
+#: bbstreamer_file.c:258 pg_basebackup.c:1407 pg_basebackup.c:1701
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+# access/transam/slru.c:645 access/transam/xlog.c:1526
+# access/transam/xlog.c:1646 access/transam/xlog.c:2911
+# access/transam/xlog.c:5308 access/transam/xlog.c:5426
+# postmaster/postmaster.c:3366
+#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360
+#: pg_basebackup.c:1471 pg_basebackup.c:1680
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "無法建立檔案 \"%s\": %m"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: bbstreamer_file.c:138 pg_recvlogical.c:633
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "無法關閉檔案 \"%s\": %m"
+
+#: bbstreamer_file.c:275
+#, c-format
+msgid "unexpected state while extracting archive"
+msgstr "解壓縮å°å­˜æª”時出ç¾éžé æœŸçš„ç‹€æ³"
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: bbstreamer_file.c:320 pg_basebackup.c:687 pg_basebackup.c:731
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄 \"%s\": %m"
+
+# commands/tablespace.c:325 commands/tablespace.c:969
+#: bbstreamer_file.c:325
+#, c-format
+msgid "could not set permissions on directory \"%s\": %m"
+msgstr "無法設定目錄 \"%s\" 的權é™: %m"
+
+#: bbstreamer_file.c:344
+#, c-format
+msgid "could not create symbolic link from \"%s\" to \"%s\": %m"
+msgstr "ç„¡æ³•å»ºç«‹ç¬¦è™Ÿé€£çµ \"%s\" 至 \"%s\":%m"
+
+#: bbstreamer_file.c:364
+#, c-format
+msgid "could not set permissions on file \"%s\": %m"
+msgstr "無法設定檔案 \"%s\" 的權é™: %m"
+
+#: bbstreamer_gzip.c:95
+#, c-format
+msgid "could not create compressed file \"%s\": %m"
+msgstr "無法建立壓縮檔 \"%s\": %m"
+
+#: bbstreamer_gzip.c:103
+#, c-format
+msgid "could not duplicate stdout: %m"
+msgstr "無法複製標準輸出: %m"
+
+#: bbstreamer_gzip.c:107
+#, c-format
+msgid "could not open output file: %m"
+msgstr "無法開啟輸出檔: %m"
+
+#: bbstreamer_gzip.c:111
+#, c-format
+msgid "could not set compression level %d: %s"
+msgstr "無法設定壓縮等級 %d: %s"
+
+#: bbstreamer_gzip.c:143
+#, c-format
+msgid "could not write to compressed file \"%s\": %s"
+msgstr "無法寫入壓縮檔 \"%s\": %s"
+
+#: bbstreamer_gzip.c:167
+#, c-format
+msgid "could not close compressed file \"%s\": %m"
+msgstr "無法關閉壓縮檔 \"%s\": %m"
+
+#: bbstreamer_gzip.c:245 walmethods.c:876
+#, c-format
+msgid "could not initialize compression library"
+msgstr "無法åˆå§‹åŒ–壓縮程å¼åº«"
+
+#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "無法解壓縮資料: %s"
+
+#: bbstreamer_inject.c:189
+#, c-format
+msgid "unexpected state while injecting recovery settings"
+msgstr "注入還原設定時出ç¾éžé æœŸçš„狀態"
+
+#: bbstreamer_lz4.c:95
+#, c-format
+msgid "could not create lz4 compression context: %s"
+msgstr "無法建立 lz4 壓縮 context: %s"
+
+#: bbstreamer_lz4.c:140
+#, c-format
+msgid "could not write lz4 header: %s"
+msgstr "無法寫入 lz4 標頭: %s"
+
+#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223
+#, c-format
+msgid "could not compress data: %s"
+msgstr "無法壓縮資料: %s"
+
+#: bbstreamer_lz4.c:241
+#, c-format
+msgid "could not end lz4 compression: %s"
+msgstr "ç„¡æ³•å®Œæˆ lz4 壓縮: %s"
+
+#: bbstreamer_lz4.c:293
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "無法åˆå§‹åŒ–壓縮程å¼åº«: %s"
+
+#: bbstreamer_tar.c:244
+#, c-format
+msgid "tar file trailer exceeds 2 blocks"
+msgstr "tar æª”çš„å°¾éƒ¨è¶…éŽ 2 個å€å¡Š"
+
+#: bbstreamer_tar.c:249
+#, c-format
+msgid "unexpected state while parsing tar archive"
+msgstr "è§£æž tar å°å­˜æª”時出ç¾éžé æœŸçš„狀態"
+
+#: bbstreamer_tar.c:296
+#, c-format
+msgid "tar member has empty name"
+msgstr "tar æˆå“¡çš„å稱是空的"
+
+#: bbstreamer_tar.c:328
+#, c-format
+msgid "COPY stream ended before last file was finished"
+msgstr "COPY 串æµåœ¨æœ€å¾Œä¸€å€‹æª”案完æˆä¹‹å‰çµæŸ"
+
+#: bbstreamer_zstd.c:85
+#, c-format
+msgid "could not create zstd compression context"
+msgstr "無法建立 zstd 壓縮 context"
+
+#: bbstreamer_zstd.c:91
+#, c-format
+msgid "could not set zstd compression level to %d: %s"
+msgstr "無法設定 zstd 壓縮等級至 %d: %s"
+
+#: bbstreamer_zstd.c:105
+#, c-format
+msgid "could not set compression worker count to %d: %s"
+msgstr "無法設定壓縮工作數é‡è‡³ %d: %s"
+
+#: bbstreamer_zstd.c:116
+#, c-format
+msgid "could not enable long-distance mode: %s"
+msgstr "無法啟動 long-distance 模å¼: %s"
+
+#: bbstreamer_zstd.c:275
+#, c-format
+msgid "could not create zstd decompression context"
+msgstr "無法建立 zstd 解壓縮 context"
+
+#: pg_basebackup.c:238
+#, c-format
+msgid "removing data directory \"%s\""
+msgstr "刪除資料目錄 \"%s\""
+
+#: pg_basebackup.c:240
+#, c-format
+msgid "failed to remove data directory"
+msgstr "無法刪除資料目錄"
+
+#: pg_basebackup.c:244
+#, c-format
+msgid "removing contents of data directory \"%s\""
+msgstr "刪除資料目錄 \"%s\" 的內容"
+
+#: pg_basebackup.c:246
+#, c-format
+msgid "failed to remove contents of data directory"
+msgstr "無法刪除資料目錄的內容"
+
+#: pg_basebackup.c:251
+#, c-format
+msgid "removing WAL directory \"%s\""
+msgstr "刪除 WAL 目錄 \"%s\""
+
+#: pg_basebackup.c:253
+#, c-format
+msgid "failed to remove WAL directory"
+msgstr "無法刪除 WAL 目錄"
+
+#: pg_basebackup.c:257
+#, c-format
+msgid "removing contents of WAL directory \"%s\""
+msgstr "刪除 WAL 目錄 \"%s\" 的內容"
+
+#: pg_basebackup.c:259
+#, c-format
+msgid "failed to remove contents of WAL directory"
+msgstr "無法刪除 WAL 目錄的內容"
+
+#: pg_basebackup.c:265
+#, c-format
+msgid "data directory \"%s\" not removed at user's request"
+msgstr "使用者è¦æ±‚ä¸åˆªé™¤è³‡æ–™ç›®éŒ„ \"%s\""
+
+#: pg_basebackup.c:268
+#, c-format
+msgid "WAL directory \"%s\" not removed at user's request"
+msgstr "使用者è¦æ±‚ä¸åˆªé™¤ WAL 目錄 \"%s\""
+
+#: pg_basebackup.c:272
+#, c-format
+msgid "changes to tablespace directories will not be undone"
+msgstr "å°è¡¨ç©ºé–“目錄的變更將無法撤銷"
+
+#: pg_basebackup.c:324
+#, c-format
+msgid "directory name too long"
+msgstr "目錄å稱éŽé•·"
+
+#: pg_basebackup.c:331
+#, c-format
+msgid "multiple \"=\" signs in tablespace mapping"
+msgstr "表空間映射中有多個 \"=\" 符號"
+
+#: pg_basebackup.c:340
+#, c-format
+msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\""
+msgstr "ç„¡æ•ˆçš„è¡¨ç©ºé–“æ˜ å°„æ ¼å¼ \"%s\",必須是 \"OLDDIR=NEWDIR\""
+
+#: pg_basebackup.c:359
+#, c-format
+msgid "old directory is not an absolute path in tablespace mapping: %s"
+msgstr "表空間映射中的舊目錄ä¸æ˜¯çµ•å°è·¯å¾‘: %s"
+
+#: pg_basebackup.c:363
+#, c-format
+msgid "new directory is not an absolute path in tablespace mapping: %s"
+msgstr "表空間映射中的新目錄ä¸æ˜¯çµ•å°è·¯å¾‘: %s"
+
+#: pg_basebackup.c:385
+#, c-format
+msgid ""
+"%s takes a base backup of a running PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s å°æ­£åœ¨é‹è¡Œçš„ PostgreSQL 伺æœå™¨é€²è¡ŒåŸºæœ¬å‚™ä»½ã€‚\n"
+"\n"
+
+#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_basebackup.c:389
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output:\n"
+msgstr ""
+"\n"
+"控制輸出的é¸é …:\n"
+
+#: pg_basebackup.c:390
+#, c-format
+msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n"
+msgstr " -D, --pgdata=DIRECTORY 將基本備份接收到目錄中\n"
+
+#: pg_basebackup.c:391
+#, c-format
+msgid " -F, --format=p|t output format (plain (default), tar)\n"
+msgstr " -F, --format=p|t 輸出格å¼(純文字(é è¨­)ã€tar)\n"
+
+#: pg_basebackup.c:392
+#, c-format
+msgid ""
+" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n"
+" (in kB/s, or use suffix \"k\" or \"M\")\n"
+msgstr ""
+" -r, --max-rate=RATE 資料目錄最大傳輸速率\n"
+" (å–®ä½æ˜¯ kB/s,或用後綴 \"k\" 或 \"M\")\n"
+
+#: pg_basebackup.c:394
+#, c-format
+msgid ""
+" -R, --write-recovery-conf\n"
+" write configuration for replication\n"
+msgstr ""
+" -R, --write-recovery-conf\n"
+" 複寫的寫入組態\n"
+
+#: pg_basebackup.c:396
+#, c-format
+msgid ""
+" -t, --target=TARGET[:DETAIL]\n"
+" backup target (if other than client)\n"
+msgstr ""
+" -t, --target=TARGET[:DETAIL]\n"
+" 備份目標(如果ä¸åŒæ–¼å®¢æˆ¶ç«¯)\n"
+
+#: pg_basebackup.c:398
+#, c-format
+msgid ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" relocate tablespace in OLDDIR to NEWDIR\n"
+msgstr ""
+" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
+" å°‡ OLDDIR 中的表空間æ¬åˆ° NEWDIR\n"
+
+#: pg_basebackup.c:400
+#, c-format
+msgid " --waldir=WALDIR location for the write-ahead log directory\n"
+msgstr " --waldir=WALDIR write-ahead 日誌目錄的ä½ç½®\n"
+
+#: pg_basebackup.c:401
+#, c-format
+msgid ""
+" -X, --wal-method=none|fetch|stream\n"
+" include required WAL files with specified method\n"
+msgstr ""
+" -X, --wal-method=none|fetch|stream\n"
+" 用指定的方å¼åŒ…括必è¦çš„ WAL 檔\n"
+
+#: pg_basebackup.c:403
+#, c-format
+msgid " -z, --gzip compress tar output\n"
+msgstr " -z, --gzip 壓縮 tar 輸出\n"
+
+#: pg_basebackup.c:404
+#, c-format
+msgid ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" compress on client or server as specified\n"
+msgstr ""
+" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n"
+" ä¾æŒ‡å®šæ–¹å¼åœ¨å®¢æˆ¶ç«¯æˆ–伺æœå™¨é€²è¡Œå£“縮\n"
+
+#: pg_basebackup.c:406
+#, c-format
+msgid " -Z, --compress=none do not compress tar output\n"
+msgstr " -Z, --compress=none ä¸å£“縮 tar 輸出\n"
+
+#: pg_basebackup.c:407
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般é¸é …:\n"
+
+#: pg_basebackup.c:408
+#, c-format
+msgid ""
+" -c, --checkpoint=fast|spread\n"
+" set fast or spread checkpointing\n"
+msgstr ""
+" -c, --checkpoint=fast|spread\n"
+" 設定 fast 或 spread 檢查點\n"
+
+#: pg_basebackup.c:410
+#, c-format
+msgid " -C, --create-slot create replication slot\n"
+msgstr " -C, --create-slot 建立複寫æ’槽\n"
+
+#: pg_basebackup.c:411
+#, c-format
+msgid " -l, --label=LABEL set backup label\n"
+msgstr " -l, --label=LABEL 設定備份標籤\n"
+
+#: pg_basebackup.c:412
+#, c-format
+msgid " -n, --no-clean do not clean up after errors\n"
+msgstr " -n, --no-clean 發生錯誤後ä¸æ¸…ç†\n"
+
+#: pg_basebackup.c:413
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n"
+
+#: pg_basebackup.c:414
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 顯示進度資訊\n"
+
+#: pg_basebackup.c:415 pg_receivewal.c:89
+#, c-format
+msgid " -S, --slot=SLOTNAME replication slot to use\n"
+msgstr " -S, --slot=SLOTNAME 複寫æ’槽å稱\n"
+
+#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 顯示詳細訊æ¯\n"
+
+#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_basebackup.c:418
+#, c-format
+msgid ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" use algorithm for manifest checksums\n"
+msgstr ""
+" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n"
+" 使用指定算法驗證清單檢查碼\n"
+
+#: pg_basebackup.c:420
+#, c-format
+msgid ""
+" --manifest-force-encode\n"
+" hex encode all file names in manifest\n"
+msgstr ""
+" --manifest-force-encode\n"
+" 將清單中所有檔å進行å六進ä½ç·¨ç¢¼\n"
+
+#: pg_basebackup.c:422
+#, c-format
+msgid " --no-estimate-size do not estimate backup size in server side\n"
+msgstr " --no-estimate-size ä¸åœ¨ä¼ºæœå™¨ç«¯ä¼°ç®—備份大å°\n"
+
+#: pg_basebackup.c:423
+#, c-format
+msgid " --no-manifest suppress generation of backup manifest\n"
+msgstr " --no-manifest ç¦æ­¢ç”¢ç”Ÿå‚™ä»½æ¸…å–®\n"
+
+#: pg_basebackup.c:424
+#, c-format
+msgid " --no-slot prevent creation of temporary replication slot\n"
+msgstr " --no-slot 阻止建立臨時複寫æ’槽\n"
+
+#: pg_basebackup.c:425
+#, c-format
+msgid ""
+" --no-verify-checksums\n"
+" do not verify checksums\n"
+msgstr ""
+" --no-verify-checksums\n"
+" ä¸é©—證檢查碼\n"
+
+#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"連線é¸é …:\n"
+
+#: pg_basebackup.c:429 pg_receivewal.c:97
+#, c-format
+msgid " -d, --dbname=CONNSTR connection string\n"
+msgstr " -d, --dbname=CONNSTR 連線字串\n"
+
+#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ–socket目錄\n"
+
+#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ \n"
+
+#: pg_basebackup.c:432
+#, c-format
+msgid ""
+" -s, --status-interval=INTERVAL\n"
+" time between status packets sent to server (in seconds)\n"
+msgstr ""
+" -s, --status-interval=INTERVAL\n"
+" å‘伺æœå™¨ç™¼é€ç‹€æ…‹å°åŒ…的時間間隔(以秒為單ä½)\n"
+
+#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 以指定的資料庫使用者連線\n"
+
+#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ä¸è©¢å•å¯†ç¢¼\n"
+
+#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password è¦æ±‚輸入密碼(應該是自動的)\n"
+
+#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+#: pg_basebackup.c:477
+#, c-format
+msgid "could not read from ready pipe: %m"
+msgstr "無法從就緒的管é“讀å–: %m"
+
+#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2152
+#: streamutil.c:441
+#, c-format
+msgid "could not parse write-ahead log location \"%s\""
+msgstr "ç„¡æ³•è§£æž write-ahead 日誌ä½ç½® \"%s\""
+
+#: pg_basebackup.c:585 pg_receivewal.c:600
+#, c-format
+msgid "could not finish writing WAL files: %m"
+msgstr "無法完æˆå¯«å…¥ WAL 檔: %m"
+
+#: pg_basebackup.c:631
+#, c-format
+msgid "could not create pipe for background process: %m"
+msgstr "無法為背景行程建立管é“: %m"
+
+#: pg_basebackup.c:665
+#, c-format
+msgid "created temporary replication slot \"%s\""
+msgstr "已建立臨時複寫æ’槽 \"%s\""
+
+#: pg_basebackup.c:668
+#, c-format
+msgid "created replication slot \"%s\""
+msgstr "已建立複寫æ’槽 \"%s\""
+
+#: pg_basebackup.c:702
+#, c-format
+msgid "could not create background process: %m"
+msgstr "無法建立背景行程: %m"
+
+#: pg_basebackup.c:711
+#, c-format
+msgid "could not create background thread: %m"
+msgstr "無法建立背景執行緒: %m"
+
+# commands/tablespace.c:334
+#: pg_basebackup.c:750
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "目錄 \"%s\" 已存在,但ä¸æ˜¯ç©ºç›®éŒ„"
+
+# utils/init/postinit.c:283
+#: pg_basebackup.c:756
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "無法存å–目錄 \"%s\": %m"
+
+#: pg_basebackup.c:832
+#, c-format
+msgid "%*s/%s kB (100%%), %d/%d tablespace %*s"
+msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s"
+msgstr[0] "%*s/%s kB (100%%), %d/%d 表空間 %*s"
+
+#: pg_basebackup.c:844
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d 表空間 (%s%-*.*s)"
+
+#: pg_basebackup.c:860
+#, c-format
+msgid "%*s/%s kB (%d%%), %d/%d tablespace"
+msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces"
+msgstr[0] "%*s/%s kB (%d%%), %d/%d 表空間"
+
+#: pg_basebackup.c:884
+#, c-format
+msgid "transfer rate \"%s\" is not a valid value"
+msgstr "傳輸速率 \"%s\" ä¸æ˜¯æœ‰æ•ˆçš„數值"
+
+#: pg_basebackup.c:886
+#, c-format
+msgid "invalid transfer rate \"%s\": %m"
+msgstr "無效的傳輸速率 \"%s\": %m"
+
+#: pg_basebackup.c:893
+#, c-format
+msgid "transfer rate must be greater than zero"
+msgstr "傳輸速率必須大於零"
+
+#: pg_basebackup.c:923
+#, c-format
+msgid "invalid --max-rate unit: \"%s\""
+msgstr "無效的 --max-rate å–®ä½: \"%s\""
+
+#: pg_basebackup.c:927
+#, c-format
+msgid "transfer rate \"%s\" exceeds integer range"
+msgstr "傳輸速率 \"%s\" 超出整數範åœ"
+
+#: pg_basebackup.c:934
+#, c-format
+msgid "transfer rate \"%s\" is out of range"
+msgstr "傳輸速率 \"%s\" 超出範åœ"
+
+#: pg_basebackup.c:996
+#, c-format
+msgid "could not get COPY data stream: %s"
+msgstr "無法å–å¾— COPY 資料æµ: %s"
+
+#: pg_basebackup.c:1013 pg_recvlogical.c:436 pg_recvlogical.c:608
+#: receivelog.c:973
+#, c-format
+msgid "could not read COPY data: %s"
+msgstr "ç„¡æ³•è®€å– COPY 資料: %s"
+
+#: pg_basebackup.c:1017
+#, c-format
+msgid "background process terminated unexpectedly"
+msgstr "背景行程æ„外終止"
+
+#: pg_basebackup.c:1088
+#, c-format
+msgid "cannot inject manifest into a compressed tar file"
+msgstr "無法將清單注入到壓縮的 tar 檔案中"
+
+#: pg_basebackup.c:1089
+#, c-format
+msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s."
+msgstr "使用客戶端壓縮,將輸出é€è‡³ç›®éŒ„而éžæ¨™æº–輸出,或使用 %s。"
+
+#: pg_basebackup.c:1105
+#, c-format
+msgid "cannot parse archive \"%s\""
+msgstr "無法解æžå°å­˜æª” \"%s\""
+
+#: pg_basebackup.c:1106
+#, c-format
+msgid "Only tar archives can be parsed."
+msgstr "åªèƒ½è§£æž tar å°å­˜æª”"
+
+#: pg_basebackup.c:1108
+#, c-format
+msgid "Plain format requires pg_basebackup to parse the archive."
+msgstr "純文字格å¼éœ€è¦ pg_basebackup 來解æžå°å­˜æª”。"
+
+#: pg_basebackup.c:1110
+#, c-format
+msgid "Using - as the output directory requires pg_basebackup to parse the archive."
+msgstr "使用 - ä½œç‚ºè¼¸å‡ºç›®éŒ„éœ€è¦ pg_basebackup 來解æžå°å­˜æª”。"
+
+#: pg_basebackup.c:1112
+#, c-format
+msgid "The -R option requires pg_basebackup to parse the archive."
+msgstr "使用 -R é¸é …éœ€è¦ pg_basebackup 來解æžå°å­˜æª”。"
+
+#: pg_basebackup.c:1331
+#, c-format
+msgid "archives must precede manifest"
+msgstr "å°å­˜æª”å¿…é ˆä½æ–¼æ¸…單之å‰"
+
+#: pg_basebackup.c:1346
+#, c-format
+msgid "invalid archive name: \"%s\""
+msgstr "無效的å°å­˜æª”å: \"%s\""
+
+#: pg_basebackup.c:1418
+#, c-format
+msgid "unexpected payload data"
+msgstr "éžé æœŸçš„負載資料"
+
+#: pg_basebackup.c:1561
+#, c-format
+msgid "empty COPY message"
+msgstr "空的 COPY 訊æ¯"
+
+#: pg_basebackup.c:1563
+#, c-format
+msgid "malformed COPY message of type %d, length %zu"
+msgstr "COPY 訊æ¯æ ¼å¼éŒ¯èª¤ï¼Œé¡žåž‹ %d,長度 %zu"
+
+#: pg_basebackup.c:1761
+#, c-format
+msgid "incompatible server version %s"
+msgstr "ä¸ç›¸å®¹çš„伺æœå™¨ç‰ˆæœ¬ %s"
+
+#: pg_basebackup.c:1777
+#, c-format
+msgid "Use -X none or -X fetch to disable log streaming."
+msgstr "用 -X none 或 -X fetch 關閉日誌串æµã€‚"
+
+#: pg_basebackup.c:1845
+#, c-format
+msgid "backup targets are not supported by this server version"
+msgstr "此伺æœå™¨ç‰ˆæœ¬ä¸æ”¯æ´å‚™ä»½ç›®æ¨™"
+
+#: pg_basebackup.c:1848
+#, c-format
+msgid "recovery configuration cannot be written when a backup target is used"
+msgstr "使用備份目標時無法寫入復原組態"
+
+#: pg_basebackup.c:1875
+#, c-format
+msgid "server does not support server-side compression"
+msgstr "伺æœå™¨ä¸æ”¯æ´ä¼ºæœå™¨ç«¯å£“縮"
+
+#: pg_basebackup.c:1885
+#, c-format
+msgid "initiating base backup, waiting for checkpoint to complete"
+msgstr "正在啟動基本備份,等待檢查點完æˆ"
+
+#: pg_basebackup.c:1889
+#, c-format
+msgid "waiting for checkpoint"
+msgstr "等待檢查點"
+
+#: pg_basebackup.c:1902 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582
+#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501
+#: streamutil.c:653 streamutil.c:698
+#, c-format
+msgid "could not send replication command \"%s\": %s"
+msgstr "無法傳é€è¤‡å¯«å‘½ä»¤ \"%s\": %s"
+
+#: pg_basebackup.c:1910
+#, c-format
+msgid "could not initiate base backup: %s"
+msgstr "無法啟動基本備份: %s"
+
+#: pg_basebackup.c:1913
+#, c-format
+msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "伺æœå™¨å›žå‚³éžé æœŸå›žæ‡‰çµ¦ BASE_BACKUP 命令,收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 欄"
+
+#: pg_basebackup.c:1919
+#, c-format
+msgid "checkpoint completed"
+msgstr "檢查點完æˆ"
+
+#: pg_basebackup.c:1933
+#, c-format
+msgid "write-ahead log start point: %s on timeline %u"
+msgstr "write-ahead 日誌起始點:%s,時間線 %u"
+
+#: pg_basebackup.c:1941
+#, c-format
+msgid "could not get backup header: %s"
+msgstr "無法å–得備份標頭: %s"
+
+#: pg_basebackup.c:1944
+#, c-format
+msgid "no data returned from server"
+msgstr "未從伺æœå™¨å›žå‚³ä»»ä½•è³‡æ–™"
+
+#: pg_basebackup.c:1987
+#, c-format
+msgid "can only write single tablespace to stdout, database has %d"
+msgstr "åªèƒ½å°‡å–®ä¸€è¡¨ç©ºé–“寫入標準輸出,資料庫有 %d 個"
+
+#: pg_basebackup.c:2000
+#, c-format
+msgid "starting background WAL receiver"
+msgstr "啟動背景 WAL 接收程åº"
+
+#: pg_basebackup.c:2083
+#, c-format
+msgid "backup failed: %s"
+msgstr "備份失敗: %s"
+
+#: pg_basebackup.c:2086
+#, c-format
+msgid "no write-ahead log end position returned from server"
+msgstr "伺æœå™¨æœªè¿”回 write-ahead 日誌çµæŸä½ç½®"
+
+#: pg_basebackup.c:2089
+#, c-format
+msgid "write-ahead log end point: %s"
+msgstr "write-ahead 日誌çµæŸé»ž: %s"
+
+#: pg_basebackup.c:2100
+#, c-format
+msgid "checksum error occurred"
+msgstr "發生檢查碼錯誤"
+
+#: pg_basebackup.c:2105
+#, c-format
+msgid "final receive failed: %s"
+msgstr "最終接收失敗: %s"
+
+#: pg_basebackup.c:2129
+#, c-format
+msgid "waiting for background process to finish streaming ..."
+msgstr "等待背景行程完æˆä¸²æµ..."
+
+#: pg_basebackup.c:2133
+#, c-format
+msgid "could not send command to background pipe: %m"
+msgstr "無法å‘背景管é“傳é€æŒ‡ä»¤: %m"
+
+#: pg_basebackup.c:2138
+#, c-format
+msgid "could not wait for child process: %m"
+msgstr "無法等待å­é€²ç¨‹: %m"
+
+#: pg_basebackup.c:2140
+#, c-format
+msgid "child %d died, expected %d"
+msgstr "å­è¡Œç¨‹ %d 終止,é æœŸç‚º %d"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: pg_basebackup.c:2142 streamutil.c:91 streamutil.c:196
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_basebackup.c:2162
+#, c-format
+msgid "could not wait for child thread: %m"
+msgstr "無法等待å­åŸ·è¡Œç·’: %m"
+
+#: pg_basebackup.c:2167
+#, c-format
+msgid "could not get child thread exit status: %m"
+msgstr "無法å–å¾—å­åŸ·è¡Œç·’çµæŸç¢¼: %m"
+
+#: pg_basebackup.c:2170
+#, c-format
+msgid "child thread exited with error %u"
+msgstr "å­åŸ·è¡Œç·’çµæŸç™¼ç”ŸéŒ¯èª¤ %u"
+
+#: pg_basebackup.c:2199
+#, c-format
+msgid "syncing data to disk ..."
+msgstr "åŒæ­¥è³‡æ–™åˆ°ç£ç¢Ÿâ€¦"
+
+#: pg_basebackup.c:2224
+#, c-format
+msgid "renaming backup_manifest.tmp to backup_manifest"
+msgstr "å°‡ backup_manifest.tmp æ›´å為 backup_manifest"
+
+#: pg_basebackup.c:2244
+#, c-format
+msgid "base backup completed"
+msgstr "基本備份完æˆ"
+
+#: pg_basebackup.c:2327
+#, c-format
+msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\""
+msgstr "無效的檢查點åƒæ•¸ \"%s\",必須為 \"fast\" 或 \"spread\""
+
+#: pg_basebackup.c:2345
+#, c-format
+msgid "invalid output format \"%s\", must be \"plain\" or \"tar\""
+msgstr "ç„¡æ•ˆçš„è¼¸å‡ºæ ¼å¼ \"%s\",必須為 \"plain\" 或 \"tar\""
+
+#: pg_basebackup.c:2423
+#, c-format
+msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\""
+msgstr "無效的 wal-method é¸é … \"%s\",必須為 \"fetch\"ã€\"stream\" 或 \"none\""
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_basebackup.c:2458 pg_basebackup.c:2470 pg_basebackup.c:2492
+#: pg_basebackup.c:2504 pg_basebackup.c:2510 pg_basebackup.c:2562
+#: pg_basebackup.c:2573 pg_basebackup.c:2583 pg_basebackup.c:2589
+#: pg_basebackup.c:2596 pg_basebackup.c:2608 pg_basebackup.c:2620
+#: pg_basebackup.c:2628 pg_basebackup.c:2641 pg_basebackup.c:2647
+#: pg_basebackup.c:2656 pg_basebackup.c:2668 pg_basebackup.c:2679
+#: pg_basebackup.c:2687 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:835 pg_recvlogical.c:847
+#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871
+#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892
+#: pg_recvlogical.c:899 pg_recvlogical.c:906
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_basebackup.c:2468 pg_receivewal.c:758 pg_recvlogical.c:845
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_basebackup.c:2491
+#, c-format
+msgid "cannot specify both format and backup target"
+msgstr "無法åŒæ™‚指定格å¼å’Œå‚™ä»½ç›®æ¨™"
+
+#: pg_basebackup.c:2503
+#, c-format
+msgid "must specify output directory or backup target"
+msgstr "必須指定輸出目錄或備份目標"
+
+#: pg_basebackup.c:2509
+#, c-format
+msgid "cannot specify both output directory and backup target"
+msgstr "無法åŒæ™‚指定輸出目錄和備份目標"
+
+# access/transam/xlog.c:3720
+#: pg_basebackup.c:2539 pg_receivewal.c:802
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "無法識別的壓縮演算法: \" %s \""
+
+# fe-connect.c:2675
+#: pg_basebackup.c:2545 pg_receivewal.c:809
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "無效的壓縮è¦æ ¼: %s"
+
+#: pg_basebackup.c:2561
+#, c-format
+msgid "client-side compression is not possible when a backup target is specified"
+msgstr "指定備份目標時無法進行客戶端端壓縮"
+
+#: pg_basebackup.c:2572
+#, c-format
+msgid "only tar mode backups can be compressed"
+msgstr "åªæœ‰ tar 模å¼çš„備份å¯ä»¥é€²è¡Œå£“縮"
+
+#: pg_basebackup.c:2582
+#, c-format
+msgid "WAL cannot be streamed when a backup target is specified"
+msgstr "æŒ‡å®šå‚™ä»½ç›®æ¨™æ™‚ç„¡æ³•ä¸²æµ WAL"
+
+#: pg_basebackup.c:2588
+#, c-format
+msgid "cannot stream write-ahead logs in tar mode to stdout"
+msgstr "無法將 tar 模å¼ä¸‹çš„ write-ahead 日誌串æµè‡³æ¨™æº–輸出"
+
+#: pg_basebackup.c:2595
+#, c-format
+msgid "replication slots can only be used with WAL streaming"
+msgstr "複寫æ’槽僅å¯èˆ‡ WAL 串æµä¸€åŒä½¿ç”¨"
+
+#: pg_basebackup.c:2607
+#, c-format
+msgid "--no-slot cannot be used with slot name"
+msgstr "--no-slot ä¸èƒ½èˆ‡æ’槽å稱一åŒä½¿ç”¨"
+
+#. translator: second %s is an option name
+#: pg_basebackup.c:2618 pg_receivewal.c:774
+#, c-format
+msgid "%s needs a slot to be specified using --slot"
+msgstr "%s 需è¦ä½¿ç”¨ --slot 指定一個æ’槽"
+
+#: pg_basebackup.c:2626 pg_basebackup.c:2666 pg_basebackup.c:2677
+#: pg_basebackup.c:2685
+#, c-format
+msgid "%s and %s are incompatible options"
+msgstr "%s å’Œ %s 是ä¸ç›¸å®¹çš„é¸é …"
+
+#: pg_basebackup.c:2640
+#, c-format
+msgid "WAL directory location cannot be specified along with a backup target"
+msgstr "無法在指定備份目標時指定 WAL 目錄ä½ç½®"
+
+#: pg_basebackup.c:2646
+#, c-format
+msgid "WAL directory location can only be specified in plain mode"
+msgstr "WAL 目錄ä½ç½®åªèƒ½åœ¨ç´”文字模å¼ä¸‹æŒ‡å®š"
+
+#: pg_basebackup.c:2655
+#, c-format
+msgid "WAL directory location must be an absolute path"
+msgstr "WAL 目錄的ä½ç½®å¿…須是絕å°è·¯å¾‘"
+
+# commands/tablespace.c:355 commands/tablespace.c:984
+#: pg_basebackup.c:2755
+#, c-format
+msgid "could not create symbolic link \"%s\": %m"
+msgstr "ç„¡æ³•å»ºç«‹ç¬¦è™Ÿé€£çµ \"%s\": %m"
+
+#: pg_receivewal.c:77
+#, c-format
+msgid ""
+"%s receives PostgreSQL streaming write-ahead logs.\n"
+"\n"
+msgstr ""
+"%s 接收 PostgreSQL çš„ä¸²æµ write-ahead 日誌\n"
+"\n"
+
+#: pg_receivewal.c:81 pg_recvlogical.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"é¸é …:\n"
+
+#: pg_receivewal.c:82
+#, c-format
+msgid " -D, --directory=DIR receive write-ahead log files into this directory\n"
+msgstr " -D, --directory=DIR 接收 write-ahead 日誌檔到此目錄\n"
+
+#: pg_receivewal.c:83 pg_recvlogical.c:83
+#, c-format
+msgid " -E, --endpos=LSN exit after receiving the specified LSN\n"
+msgstr " -E, --endpos=LSN 收到指定的 LSN 後çµæŸ\n"
+
+#: pg_receivewal.c:84 pg_recvlogical.c:87
+#, c-format
+msgid " --if-not-exists do not error if slot already exists when creating a slot\n"
+msgstr " --if-not-exists 建立æ’槽時如果æ’槽已存在則ä¸ç”¢ç”ŸéŒ¯èª¤\n"
+
+#: pg_receivewal.c:85 pg_recvlogical.c:89
+#, c-format
+msgid " -n, --no-loop do not loop on connection lost\n"
+msgstr " -n, --no-loop 連線中斷時ä¸å¾ªç’°\n"
+
+#: pg_receivewal.c:86
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n"
+
+#: pg_receivewal.c:87 pg_recvlogical.c:94
+#, c-format
+msgid ""
+" -s, --status-interval=SECS\n"
+" time between status packets sent to server (default: %d)\n"
+msgstr ""
+" -s, --status-interval=SECS\n"
+" å‘伺æœå™¨ç™¼é€ç‹€æ…‹å°åŒ…的時間間隔(é è¨­: %d)\n"
+
+#: pg_receivewal.c:90
+#, c-format
+msgid " --synchronous flush write-ahead log immediately after writing\n"
+msgstr " --synchronous 寫入 write-ahead æ—¥èªŒå¾Œç«‹å³ flush\n"
+
+#: pg_receivewal.c:93
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" 指定壓縮方å¼\n"
+
+#: pg_receivewal.c:103
+#, c-format
+msgid ""
+"\n"
+"Optional actions:\n"
+msgstr ""
+"\n"
+"é¸æ“‡æ€§æ“作:\n"
+
+#: pg_receivewal.c:104 pg_recvlogical.c:79
+#, c-format
+msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n"
+msgstr " --create-slot 建立新的複寫æ’槽(æ’槽å稱請åƒè¦‹ --slot)\n"
+
+#: pg_receivewal.c:105 pg_recvlogical.c:80
+#, c-format
+msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n"
+msgstr " --drop-slot 刪除複寫æ’槽(æ’槽å稱請åƒè¦‹ --slot)\n"
+
+#: pg_receivewal.c:191
+#, c-format
+msgid "finished segment at %X/%X (timeline %u)"
+msgstr "完æˆç‰‡æ–·ï¼Œä½ç½® %X/%X (時間軸 %u)"
+
+#: pg_receivewal.c:198
+#, c-format
+msgid "stopped log streaming at %X/%X (timeline %u)"
+msgstr "åœæ­¢æ—¥èªŒä¸²æµï¼Œä½ç½® %X/%X (時間軸 %u)"
+
+#: pg_receivewal.c:214
+#, c-format
+msgid "switched to timeline %u at %X/%X"
+msgstr "切æ›è‡³æ™‚間軸 %u,ä½ç½® %X/%X"
+
+#: pg_receivewal.c:224
+#, c-format
+msgid "received interrupt signal, exiting"
+msgstr "收到中斷信號,çµæŸ"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_receivewal.c:256
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "無法關閉目錄 \"%s\": %m"
+
+#: pg_receivewal.c:323
+#, c-format
+msgid "segment file \"%s\" has incorrect size %lld, skipping"
+msgstr "片斷檔 \"%s\" å¤§å° %lld ä¸æ­£ç¢ºï¼Œè·³éŽ"
+
+#: pg_receivewal.c:340
+#, c-format
+msgid "could not open compressed file \"%s\": %m"
+msgstr "無法開啟壓縮檔 \"%s\": %m"
+
+#: pg_receivewal.c:343
+#, c-format
+msgid "could not seek in compressed file \"%s\": %m"
+msgstr "無法 seek 壓縮檔 \"%s\": %m"
+
+#: pg_receivewal.c:349
+#, c-format
+msgid "could not read compressed file \"%s\": %m"
+msgstr "無法讀å–壓縮檔 \"%s\": %m"
+
+#: pg_receivewal.c:352
+#, c-format
+msgid "could not read compressed file \"%s\": read %d of %zu"
+msgstr "無法讀å–壓縮檔 \"%s\": å·²è®€å– %d / %zu"
+
+#: pg_receivewal.c:362
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping"
+msgstr "壓縮片斷檔 \"%s\" çš„æœªå£“ç¸®å¤§å° %d ä¸æ­£ç¢ºï¼Œè·³éŽ"
+
+# libpq/be-secure.c:649
+#: pg_receivewal.c:390
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "無法建立 LZ4 解壓縮 context: %s"
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: pg_receivewal.c:402
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "無法讀å–檔案 \"%s\": %m"
+
+#: pg_receivewal.c:420
+#, c-format
+msgid "could not decompress file \"%s\": %s"
+msgstr "無法解壓縮檔案 \"%s\": %s"
+
+#: pg_receivewal.c:443
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "無法釋放 LZ4 解壓縮 context: %s"
+
+#: pg_receivewal.c:448
+#, c-format
+msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping"
+msgstr "壓縮片斷檔 \"%s\" çš„æœªå£“ç¸®å¤§å° %zu ä¸æ­£ç¢ºï¼Œè·³éŽ"
+
+#: pg_receivewal.c:453
+#, c-format
+msgid "cannot check file \"%s\": compression with %s not supported by this build"
+msgstr "無法檢查檔案 \"%s\": 此版本ä¸æ”¯æ´ %s 壓縮"
+
+#: pg_receivewal.c:578
+#, c-format
+msgid "starting log streaming at %X/%X (timeline %u)"
+msgstr "開始日誌串æµï¼Œä½ç½® %X/%X (時間軸 %u)"
+
+#: pg_receivewal.c:693 pg_recvlogical.c:783
+#, c-format
+msgid "could not parse end position \"%s\""
+msgstr "無法解æžçµæŸä½ç½® \"%s\""
+
+#: pg_receivewal.c:766
+#, c-format
+msgid "cannot use --create-slot together with --drop-slot"
+msgstr "無法åŒæ™‚使用 --create-slot å’Œ --drop-slot"
+
+#: pg_receivewal.c:782
+#, c-format
+msgid "cannot use --synchronous together with --no-sync"
+msgstr "無法åŒæ™‚使用 --synchronous å’Œ --no-sync"
+
+#: pg_receivewal.c:792
+#, c-format
+msgid "no target directory specified"
+msgstr "未指定目標目錄"
+
+#: pg_receivewal.c:816
+#, c-format
+msgid "compression with %s is not yet supported"
+msgstr "å°šæœªæ”¯æ´ %s 壓縮"
+
+#: pg_receivewal.c:859
+#, c-format
+msgid "replication connection using slot \"%s\" is unexpectedly database specific"
+msgstr "使用æ’槽 \"%s\" 的複寫連線æ„外的åªèƒ½ç”¨æ–¼ç‰¹å®šè³‡æ–™åº«"
+
+#: pg_receivewal.c:878 pg_recvlogical.c:954
+#, c-format
+msgid "dropping replication slot \"%s\""
+msgstr "刪除複寫æ’槽 \"%s\""
+
+#: pg_receivewal.c:889 pg_recvlogical.c:964
+#, c-format
+msgid "creating replication slot \"%s\""
+msgstr "建立複寫æ’槽 \"%s\""
+
+#: pg_receivewal.c:918 pg_recvlogical.c:988
+#, c-format
+msgid "disconnected"
+msgstr "連線中斷"
+
+#. translator: check source for value for %d
+#: pg_receivewal.c:922 pg_recvlogical.c:992
+#, c-format
+msgid "disconnected; waiting %d seconds to try again"
+msgstr "連線中斷,等待 %d 秒後é‡è©¦"
+
+#: pg_recvlogical.c:74
+#, c-format
+msgid ""
+"%s controls PostgreSQL logical decoding streams.\n"
+"\n"
+msgstr ""
+"%s 控制 PostgreSQL é‚輯解碼串æµ\n"
+"\n"
+
+#: pg_recvlogical.c:78
+#, c-format
+msgid ""
+"\n"
+"Action to be performed:\n"
+msgstr ""
+"\n"
+"è¦åŸ·è¡Œçš„æ“作:\n"
+
+#: pg_recvlogical.c:81
+#, c-format
+msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n"
+msgstr " --start 開始在複寫æ’槽的串æµ(æ’槽ä½å稱請åƒè¦‹ --slot)\n"
+
+#: pg_recvlogical.c:84
+#, c-format
+msgid " -f, --file=FILE receive log into this file, - for stdout\n"
+msgstr " -f, --file=FILE 將日誌接收到此檔案,- 表示標準輸出\n"
+
+#: pg_recvlogical.c:85
+#, c-format
+msgid ""
+" -F --fsync-interval=SECS\n"
+" time between fsyncs to the output file (default: %d)\n"
+msgstr ""
+" -F --fsync-interval=SECS\n"
+" fsync 輸出檔的時間間隔(é è¨­: %d)\n"
+
+#: pg_recvlogical.c:88
+#, c-format
+msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n"
+msgstr " -I, --startpos=LSN ç¾æœ‰æ’槽中串æµé–‹å§‹ä½ç½®\n"
+
+#: pg_recvlogical.c:90
+#, c-format
+msgid ""
+" -o, --option=NAME[=VALUE]\n"
+" pass option NAME with optional value VALUE to the\n"
+" output plugin\n"
+msgstr ""
+" -o, --option=NAME[=VALUE]\n"
+" å°‡é¸é … NAME å’Œé¸æ“‡æ€§çš„值 VALUE 傳給輸出外掛程å¼\n"
+
+#: pg_recvlogical.c:93
+#, c-format
+msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n"
+msgstr " -P, --plugin=PLUGIN ä½¿ç”¨è¼¸å‡ºå¤–æŽ›ç¨‹å¼ PLUGIN(é è¨­: %s)\n"
+
+#: pg_recvlogical.c:96
+#, c-format
+msgid " -S, --slot=SLOTNAME name of the logical replication slot\n"
+msgstr " -S, --slot=SLOTNAME é‚輯複寫æ’槽的å稱\n"
+
+#: pg_recvlogical.c:97
+#, c-format
+msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n"
+msgstr " -t, --two-phase 建立æ’槽時啟動已準備交易解碼\n"
+
+#: pg_recvlogical.c:102
+#, c-format
+msgid " -d, --dbname=DBNAME database to connect to\n"
+msgstr " -d, --dbname=DBNAME è¦é€£ç·šçš„資料庫\n"
+
+#: pg_recvlogical.c:135
+#, c-format
+msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)"
+msgstr "確èªå¯«å…¥è‡³ %X/%X,flush 至 %X/%X (æ’槽 %s)"
+
+#: pg_recvlogical.c:159 receivelog.c:360
+#, c-format
+msgid "could not send feedback packet: %s"
+msgstr "無法傳é€å饋å°åŒ…: %s"
+
+#: pg_recvlogical.c:227
+#, c-format
+msgid "starting log streaming at %X/%X (slot %s)"
+msgstr "開始日誌串æµï¼Œä½ç½® %X/%X (æ’槽 %s)"
+
+#: pg_recvlogical.c:269
+#, c-format
+msgid "streaming initiated"
+msgstr "已啟動串æµ"
+
+# utils/init/miscinit.c:533
+#: pg_recvlogical.c:333
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "無法開啟日誌檔 \"%s\": %m"
+
+#: pg_recvlogical.c:362 receivelog.c:882
+#, c-format
+msgid "invalid socket: %s"
+msgstr "無效的 socket: %s"
+
+# fe-misc.c:991
+#: pg_recvlogical.c:415 receivelog.c:910
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 失敗: %m"
+
+# fe-misc.c:610
+# fe-misc.c:701
+#: pg_recvlogical.c:422 receivelog.c:959
+#, c-format
+msgid "could not receive data from WAL stream: %s"
+msgstr "無法從 WAL 串æµæŽ¥æ”¶è³‡æ–™: %s"
+
+#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003
+#: receivelog.c:1066
+#, c-format
+msgid "streaming header too small: %d"
+msgstr "串æµæ¨™é ­å¤ªå°: %d"
+
+#: pg_recvlogical.c:499 receivelog.c:843
+#, c-format
+msgid "unrecognized streaming header: \"%c\""
+msgstr "無法識別的串æµæ¨™é ­: \"%c\""
+
+#: pg_recvlogical.c:553 pg_recvlogical.c:565
+#, c-format
+msgid "could not write %d bytes to log file \"%s\": %m"
+msgstr "無法寫入 %d 個ä½å…ƒçµ„至日誌檔 \"%s\": %m"
+
+#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679
+#, c-format
+msgid "unexpected termination of replication stream: %s"
+msgstr "複寫串æµæ„外終止: %s"
+
+#: pg_recvlogical.c:778
+#, c-format
+msgid "could not parse start position \"%s\""
+msgstr "無法解æžé–‹å§‹ä½ç½: \"%s\""
+
+#: pg_recvlogical.c:856
+#, c-format
+msgid "no slot specified"
+msgstr "未指定æ’槽"
+
+#: pg_recvlogical.c:863
+#, c-format
+msgid "no target file specified"
+msgstr "未指定目標檔"
+
+#: pg_recvlogical.c:870
+#, c-format
+msgid "no database specified"
+msgstr "未指定資料庫"
+
+#: pg_recvlogical.c:877
+#, c-format
+msgid "at least one action needs to be specified"
+msgstr "至少需è¦æŒ‡å®šä¸€å€‹æ“作"
+
+#: pg_recvlogical.c:884
+#, c-format
+msgid "cannot use --create-slot or --start together with --drop-slot"
+msgstr "--create-slot 或 --start 無法和 --drop-slot 一起使用"
+
+#: pg_recvlogical.c:891
+#, c-format
+msgid "cannot use --create-slot or --drop-slot together with --startpos"
+msgstr "--create-slot 或 --drop-slot 無法和 --startpos 一起使用"
+
+#: pg_recvlogical.c:898
+#, c-format
+msgid "--endpos may only be specified with --start"
+msgstr "--endpos åªèƒ½èˆ‡ --start 一åŒä½¿ç”¨"
+
+#: pg_recvlogical.c:905
+#, c-format
+msgid "--two-phase may only be specified with --create-slot"
+msgstr "--two-phase åªèƒ½èˆ‡ --create-slot 一åŒä½¿ç”¨"
+
+#: pg_recvlogical.c:938
+#, c-format
+msgid "could not establish database-specific replication connection"
+msgstr "無法建立特定資料庫的複寫連線"
+
+#: pg_recvlogical.c:1032
+#, c-format
+msgid "end position %X/%X reached by keepalive"
+msgstr ""
+
+#: pg_recvlogical.c:1035
+#, c-format
+msgid "end position %X/%X reached by WAL record at %X/%X"
+msgstr ""
+
+#: receivelog.c:66
+#, c-format
+msgid "could not create archive status file \"%s\": %s"
+msgstr "無法建立å°å­˜ç‹€æ…‹æª” \"%s\": %s"
+
+#: receivelog.c:73
+#, c-format
+msgid "could not close archive status file \"%s\": %s"
+msgstr "無法關閉å°å­˜ç‹€æ…‹æª” \"%s\": %s"
+
+#: receivelog.c:122
+#, c-format
+msgid "could not get size of write-ahead log file \"%s\": %s"
+msgstr "無法å–å¾— write-ahead 日誌檔 \"%s\" 的大å°: %s"
+
+#: receivelog.c:133
+#, c-format
+msgid "could not open existing write-ahead log file \"%s\": %s"
+msgstr "無法開啟已存在的 write-ahead 日誌檔 \"%s\": %s"
+
+#: receivelog.c:142
+#, c-format
+msgid "could not fsync existing write-ahead log file \"%s\": %s"
+msgstr "無法 fsync 已存在的 write-ahead 日誌檔 \"%s\": %s"
+
+#: receivelog.c:157
+#, c-format
+msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d"
+msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d"
+msgstr[0] "write-ahead 日誌檔 \"%s\" 大å°ç‚º %zd 個ä½å…ƒçµ„,應為 0 或 %d"
+
+#: receivelog.c:175
+#, c-format
+msgid "could not open write-ahead log file \"%s\": %s"
+msgstr "無法開啟 write-head 日誌檔 \"%s\": %s"
+
+#: receivelog.c:216
+#, c-format
+msgid "not renaming \"%s\", segment is not complete"
+msgstr "未更å \"%s\",片段未完æˆ"
+
+#: receivelog.c:227 receivelog.c:317 receivelog.c:688
+#, c-format
+msgid "could not close file \"%s\": %s"
+msgstr "無法關閉檔案 \"%s\": %s"
+
+#: receivelog.c:288
+#, c-format
+msgid "server reported unexpected history file name for timeline %u: %s"
+msgstr "伺æœå™¨å›žå ±éžé æœŸçš„時間線 %u æ­·å²æª”案å稱: %s"
+
+#: receivelog.c:297
+#, c-format
+msgid "could not create timeline history file \"%s\": %s"
+msgstr "無法建立時間軸歷å²æª” \"%s\": %s"
+
+#: receivelog.c:304
+#, c-format
+msgid "could not write timeline history file \"%s\": %s"
+msgstr "無法寫入時間軸歷å²æª” \"%s\": %s"
+
+#: receivelog.c:394
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions older than %s"
+msgstr "ä¸ç›¸å®¹çš„伺æœå™¨ç‰ˆæœ¬ %s;客戶端ä¸æ”¯æ´ä¾†è‡ªèˆŠæ–¼ %s 的伺æœå™¨ç‰ˆæœ¬çš„串æµ"
+
+#: receivelog.c:403
+#, c-format
+msgid "incompatible server version %s; client does not support streaming from server versions newer than %s"
+msgstr "ä¸ç›¸å®¹çš„伺æœå™¨ç‰ˆæœ¬ %s;客戶端ä¸æ”¯æ´ä¾†è‡ªæ–°æ–¼ %s 的伺æœå™¨ç‰ˆæœ¬çš„串æµ"
+
+#: receivelog.c:508
+#, c-format
+msgid "system identifier does not match between base backup and streaming connection"
+msgstr "基本備份和串æµé€£ç·šä¹‹é–“的系統識別碼ä¸ä¸€è‡´"
+
+#: receivelog.c:516
+#, c-format
+msgid "starting timeline %u is not present in the server"
+msgstr "伺æœå™¨ä¸­ä¸å­˜åœ¨èµ·å§‹æ™‚間軸 %u"
+
+#: receivelog.c:555
+#, c-format
+msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "TIMELINE_HISTORY 命令出ç¾éžé å›žæ‡‰: 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 欄"
+
+#: receivelog.c:626
+#, c-format
+msgid "server reported unexpected next timeline %u, following timeline %u"
+msgstr "伺æœå™¨å›žå ±éžé æœŸçš„下一個時間軸 %u,所跟隨的時間軸 %u"
+
+#: receivelog.c:632
+#, c-format
+msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X"
+msgstr "伺æœå™¨åœæ­¢ä¸²æµæ™‚間軸 %u,ä½ç½® %X/%X,但是回報下一個時間軸 %u 將從 %X/%X 開始"
+
+#: receivelog.c:672
+#, c-format
+msgid "replication stream was terminated before stop point"
+msgstr "複寫串æµåœ¨åœæ­¢é»žä¹‹å‰è¢«çµ‚çµ"
+
+#: receivelog.c:718
+#, c-format
+msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "時間軸çµæŸå¾Œå‡ºç¾æ„外的çµæžœé›†: 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 欄"
+
+#: receivelog.c:727
+#, c-format
+msgid "could not parse next timeline's starting point \"%s\""
+msgstr "無法解æžä¸‹ä¸€å€‹æ™‚間軸的啟始點 \"%s\""
+
+#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201
+#, c-format
+msgid "could not fsync file \"%s\": %s"
+msgstr "無法 fsync 檔案 \"%s\": %s"
+
+#: receivelog.c:1083
+#, c-format
+msgid "received write-ahead log record for offset %u with no file open"
+msgstr "收到 write-ahead 日誌記錄給å移 %u 但無開啟的檔案"
+
+#: receivelog.c:1093
+#, c-format
+msgid "got WAL data offset %08x, expected %08x"
+msgstr "收到 WAL 資料å移 %08x,é æœŸ %08x"
+
+#: receivelog.c:1128
+#, 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
+#, c-format
+msgid "could not send copy-end packet: %s"
+msgstr "ç„¡æ³•å‚³é€ copy-end å°åŒ…: %s"
+
+#: streamutil.c:158
+msgid "Password: "
+msgstr "密碼: "
+
+#: streamutil.c:181
+#, c-format
+msgid "could not connect to server"
+msgstr "無法連線至資料庫"
+
+#: streamutil.c:222
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "無法清除 search_path: %s"
+
+#: streamutil.c:238
+#, c-format
+msgid "could not determine server setting for integer_datetimes"
+msgstr "無法確定伺æœå™¨çš„ integer_datetimes 設定"
+
+#: streamutil.c:245
+#, c-format
+msgid "integer_datetimes compile flag does not match server"
+msgstr "integer_datetimes 的編譯旗標與伺æœå™¨ä¸ä¸€è‡´"
+
+#: streamutil.c:296
+#, c-format
+msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "無法å–å¾— WAL 片段大å°: 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 或更多欄"
+
+#: streamutil.c:306
+#, c-format
+msgid "WAL segment size could not be parsed"
+msgstr "ç„¡æ³•è§£æž WAL 片段大å°"
+
+#: streamutil.c:324
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes"
+msgstr[0] "WAL 片段大å°å¿…須是介於 1MB 到 1GB 之間的二的次方,但é ç«¯ä¼ºæœå™¨å ±å‘Šçš„值為 %d ä½å…ƒçµ„"
+
+#: streamutil.c:369
+#, c-format
+msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "無法å–得群組存å–標誌: 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 或更多欄"
+
+#: streamutil.c:378
+#, c-format
+msgid "group access flag could not be parsed: %s"
+msgstr "無法解æžç¾¤çµ„å­˜å–標誌: %s"
+
+#: streamutil.c:421 streamutil.c:458
+#, c-format
+msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields"
+msgstr "無法識別系統: 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 或更多欄"
+
+#: streamutil.c:510
+#, c-format
+msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "無法讀å–複寫æ’槽 \"%s\": 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 欄"
+
+#: streamutil.c:522
+#, c-format
+msgid "replication slot \"%s\" does not exist"
+msgstr "複寫æ’槽 \"%s\" ä¸å­˜åœ¨"
+
+#: streamutil.c:533
+#, c-format
+msgid "expected a physical replication slot, got type \"%s\" instead"
+msgstr "é æœŸæ˜¯ç‰©ç†è¤‡å¯«æ§½ä½å»å¾—到類型 \"%s\""
+
+#: streamutil.c:547
+#, c-format
+msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\""
+msgstr "無法解æžè¤‡å¯«æ§½ä½ \"%2$s\" çš„ restart_lsn \"%1$s\""
+
+#: streamutil.c:664
+#, 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 欄"
+
+#: streamutil.c:708
+#, c-format
+msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields"
+msgstr "無法刪除複寫æ’槽 \"%s\": 收到 %d 列和 %d 欄,é æœŸ %d 列和 %d 欄"
+
+#: walmethods.c:721 walmethods.c:1264
+msgid "could not compress data"
+msgstr "無法壓縮資料"
+
+#: walmethods.c:750
+msgid "could not reset compression stream"
+msgstr "無法é‡è¨­å£“縮串æµ"
+
+#: walmethods.c:888
+msgid "implementation error: tar files can't have more than one open file"
+msgstr "實作錯誤: tar 檔ä¸èƒ½æœ‰å¤šå€‹å·²é–‹å•Ÿçš„檔案"
+
+#: walmethods.c:903
+msgid "could not create tar header"
+msgstr "無法建立 tar 標頭"
+
+#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179
+msgid "could not change compression parameters"
+msgstr "無法變更壓縮åƒæ•¸"
+
+#: walmethods.c:1052
+msgid "unlink not supported with compression"
+msgstr "壓縮模å¼ä¸æ”¯æ´ unlink"
+
+#: walmethods.c:1288
+msgid "could not close compression stream"
+msgstr "無法關閉壓縮串æµ: %s"
diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
new file mode 100644
index 0000000..504d82b
--- /dev/null
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -0,0 +1,1268 @@
+/*-------------------------------------------------------------------------
+ *
+ * receivelog.c - receive WAL files using the streaming
+ * replication protocol.
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/receivelog.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/select.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "libpq-fe.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+/* currently open WAL file */
+static Walfile *walfile = NULL;
+static bool reportFlushPosition = false;
+static XLogRecPtr lastFlushPosition = InvalidXLogRecPtr;
+
+static bool still_sending = true; /* feedback still needs to be sent? */
+
+static PGresult *HandleCopyStream(PGconn *conn, StreamCtl *stream,
+ XLogRecPtr *stoppos);
+static int CopyStreamPoll(PGconn *conn, long timeout_ms, pgsocket stop_socket);
+static int CopyStreamReceive(PGconn *conn, long timeout, pgsocket stop_socket,
+ char **buffer);
+static bool ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf,
+ int len, XLogRecPtr blockpos, TimestampTz *last_status);
+static bool ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
+ XLogRecPtr *blockpos);
+static PGresult *HandleEndOfCopyStream(PGconn *conn, StreamCtl *stream, char *copybuf,
+ XLogRecPtr blockpos, XLogRecPtr *stoppos);
+static bool CheckCopyStreamStop(PGconn *conn, StreamCtl *stream, XLogRecPtr blockpos);
+static long CalculateCopyStreamSleeptime(TimestampTz now, int standby_message_timeout,
+ TimestampTz last_status);
+
+static bool ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos,
+ uint32 *timeline);
+
+static bool
+mark_file_as_archived(StreamCtl *stream, const char *fname)
+{
+ Walfile *f;
+ static char tmppath[MAXPGPATH];
+
+ snprintf(tmppath, sizeof(tmppath), "archive_status/%s.done",
+ fname);
+
+ f = stream->walmethod->ops->open_for_write(stream->walmethod, tmppath,
+ NULL, 0);
+ if (f == NULL)
+ {
+ pg_log_error("could not create archive status file \"%s\": %s",
+ tmppath, GetLastWalMethodError(stream->walmethod));
+ return false;
+ }
+
+ if (stream->walmethod->ops->close(f, CLOSE_NORMAL) != 0)
+ {
+ pg_log_error("could not close archive status file \"%s\": %s",
+ tmppath, GetLastWalMethodError(stream->walmethod));
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Open a new WAL file in the specified directory.
+ *
+ * Returns true if OK; on failure, returns false after printing an error msg.
+ * On success, 'walfile' is set to the opened WAL file.
+ *
+ * The file will be padded to 16Mb with zeroes.
+ */
+static bool
+open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
+{
+ Walfile *f;
+ char *fn;
+ ssize_t size;
+ XLogSegNo segno;
+ char walfile_name[MAXPGPATH];
+
+ XLByteToSeg(startpoint, segno, WalSegSz);
+ XLogFileName(walfile_name, stream->timeline, segno, WalSegSz);
+
+ /* Note that this considers the compression used if necessary */
+ fn = stream->walmethod->ops->get_file_name(stream->walmethod,
+ walfile_name,
+ stream->partial_suffix);
+
+ /*
+ * When streaming to files, if an existing file exists we verify that it's
+ * either empty (just created), or a complete WalSegSz segment (in which
+ * case it has been created and padded). Anything else indicates a corrupt
+ * file. Compressed files have no need for padding, so just ignore this
+ * case.
+ *
+ * When streaming to tar, no file with this name will exist before, so we
+ * never have to verify a size.
+ */
+ if (stream->walmethod->compression_algorithm == PG_COMPRESSION_NONE &&
+ stream->walmethod->ops->existsfile(stream->walmethod, fn))
+ {
+ size = stream->walmethod->ops->get_file_size(stream->walmethod, fn);
+ if (size < 0)
+ {
+ pg_log_error("could not get size of write-ahead log file \"%s\": %s",
+ fn, GetLastWalMethodError(stream->walmethod));
+ pg_free(fn);
+ return false;
+ }
+ if (size == WalSegSz)
+ {
+ /* Already padded file. Open it for use */
+ f = stream->walmethod->ops->open_for_write(stream->walmethod, walfile_name, stream->partial_suffix, 0);
+ if (f == NULL)
+ {
+ pg_log_error("could not open existing write-ahead log file \"%s\": %s",
+ fn, GetLastWalMethodError(stream->walmethod));
+ pg_free(fn);
+ return false;
+ }
+
+ /* fsync file in case of a previous crash */
+ if (stream->walmethod->ops->sync(f) != 0)
+ {
+ pg_log_error("could not fsync existing write-ahead log file \"%s\": %s",
+ fn, GetLastWalMethodError(stream->walmethod));
+ stream->walmethod->ops->close(f, CLOSE_UNLINK);
+ exit(1);
+ }
+
+ walfile = f;
+ pg_free(fn);
+ return true;
+ }
+ if (size != 0)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_log_error(ngettext("write-ahead log file \"%s\" has %zd byte, should be 0 or %d",
+ "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d",
+ size),
+ fn, size, WalSegSz);
+ pg_free(fn);
+ return false;
+ }
+ /* File existed and was empty, so fall through and open */
+ }
+
+ /* No file existed, so create one */
+
+ f = stream->walmethod->ops->open_for_write(stream->walmethod,
+ walfile_name,
+ stream->partial_suffix,
+ WalSegSz);
+ if (f == NULL)
+ {
+ pg_log_error("could not open write-ahead log file \"%s\": %s",
+ fn, GetLastWalMethodError(stream->walmethod));
+ pg_free(fn);
+ return false;
+ }
+
+ pg_free(fn);
+ walfile = f;
+ return true;
+}
+
+/*
+ * Close the current WAL file (if open), and rename it to the correct
+ * filename if it's complete. On failure, prints an error message to stderr
+ * and returns false, otherwise returns true.
+ */
+static bool
+close_walfile(StreamCtl *stream, XLogRecPtr pos)
+{
+ char *fn;
+ off_t currpos;
+ int r;
+ char walfile_name[MAXPGPATH];
+
+ if (walfile == NULL)
+ return true;
+
+ strlcpy(walfile_name, walfile->pathname, MAXPGPATH);
+ currpos = walfile->currpos;
+
+ /* Note that this considers the compression used if necessary */
+ fn = stream->walmethod->ops->get_file_name(stream->walmethod,
+ walfile_name,
+ stream->partial_suffix);
+
+ if (stream->partial_suffix)
+ {
+ if (currpos == WalSegSz)
+ r = stream->walmethod->ops->close(walfile, CLOSE_NORMAL);
+ else
+ {
+ pg_log_info("not renaming \"%s\", segment is not complete", fn);
+ r = stream->walmethod->ops->close(walfile, CLOSE_NO_RENAME);
+ }
+ }
+ else
+ r = stream->walmethod->ops->close(walfile, CLOSE_NORMAL);
+
+ walfile = NULL;
+
+ if (r != 0)
+ {
+ pg_log_error("could not close file \"%s\": %s",
+ fn, GetLastWalMethodError(stream->walmethod));
+
+ pg_free(fn);
+ return false;
+ }
+
+ pg_free(fn);
+
+ /*
+ * Mark file as archived if requested by the caller - pg_basebackup needs
+ * to do so as files can otherwise get archived again after promotion of a
+ * new node. This is in line with walreceiver.c always doing a
+ * XLogArchiveForceDone() after a complete segment.
+ */
+ if (currpos == WalSegSz && stream->mark_done)
+ {
+ /* writes error message if failed */
+ if (!mark_file_as_archived(stream, walfile_name))
+ return false;
+ }
+
+ lastFlushPosition = pos;
+ return true;
+}
+
+
+/*
+ * Check if a timeline history file exists.
+ */
+static bool
+existsTimeLineHistoryFile(StreamCtl *stream)
+{
+ char histfname[MAXFNAMELEN];
+
+ /*
+ * Timeline 1 never has a history file. We treat that as if it existed,
+ * since we never need to stream it.
+ */
+ if (stream->timeline == 1)
+ return true;
+
+ TLHistoryFileName(histfname, stream->timeline);
+
+ return stream->walmethod->ops->existsfile(stream->walmethod, histfname);
+}
+
+static bool
+writeTimeLineHistoryFile(StreamCtl *stream, char *filename, char *content)
+{
+ int size = strlen(content);
+ char histfname[MAXFNAMELEN];
+ Walfile *f;
+
+ /*
+ * Check that the server's idea of how timeline history files should be
+ * named matches ours.
+ */
+ TLHistoryFileName(histfname, stream->timeline);
+ if (strcmp(histfname, filename) != 0)
+ {
+ pg_log_error("server reported unexpected history file name for timeline %u: %s",
+ stream->timeline, filename);
+ return false;
+ }
+
+ f = stream->walmethod->ops->open_for_write(stream->walmethod,
+ histfname, ".tmp", 0);
+ if (f == NULL)
+ {
+ pg_log_error("could not create timeline history file \"%s\": %s",
+ histfname, GetLastWalMethodError(stream->walmethod));
+ return false;
+ }
+
+ if ((int) stream->walmethod->ops->write(f, content, size) != size)
+ {
+ pg_log_error("could not write timeline history file \"%s\": %s",
+ histfname, GetLastWalMethodError(stream->walmethod));
+
+ /*
+ * If we fail to make the file, delete it to release disk space
+ */
+ stream->walmethod->ops->close(f, CLOSE_UNLINK);
+
+ return false;
+ }
+
+ if (stream->walmethod->ops->close(f, CLOSE_NORMAL) != 0)
+ {
+ pg_log_error("could not close file \"%s\": %s",
+ histfname, GetLastWalMethodError(stream->walmethod));
+ return false;
+ }
+
+ /* Maintain archive_status, check close_walfile() for details. */
+ if (stream->mark_done)
+ {
+ /* writes error message if failed */
+ if (!mark_file_as_archived(stream, histfname))
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Send a Standby Status Update message to server.
+ */
+static bool
+sendFeedback(PGconn *conn, XLogRecPtr blockpos, TimestampTz now, bool replyRequested)
+{
+ char replybuf[1 + 8 + 8 + 8 + 8 + 1];
+ int len = 0;
+
+ replybuf[len] = 'r';
+ len += 1;
+ fe_sendint64(blockpos, &replybuf[len]); /* write */
+ len += 8;
+ if (reportFlushPosition)
+ fe_sendint64(lastFlushPosition, &replybuf[len]); /* flush */
+ else
+ fe_sendint64(InvalidXLogRecPtr, &replybuf[len]); /* flush */
+ len += 8;
+ fe_sendint64(InvalidXLogRecPtr, &replybuf[len]); /* apply */
+ len += 8;
+ fe_sendint64(now, &replybuf[len]); /* sendTime */
+ len += 8;
+ replybuf[len] = replyRequested ? 1 : 0; /* replyRequested */
+ len += 1;
+
+ if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send feedback packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Check that the server version we're connected to is supported by
+ * ReceiveXlogStream().
+ *
+ * If it's not, an error message is printed to stderr, and false is returned.
+ */
+bool
+CheckServerVersionForStreaming(PGconn *conn)
+{
+ int minServerMajor,
+ maxServerMajor;
+ int serverMajor;
+
+ /*
+ * The message format used in streaming replication changed in 9.3, so we
+ * cannot stream from older servers. And we don't support servers newer
+ * than the client; it might work, but we don't know, so err on the safe
+ * side.
+ */
+ minServerMajor = 903;
+ maxServerMajor = PG_VERSION_NUM / 100;
+ serverMajor = PQserverVersion(conn) / 100;
+ if (serverMajor < minServerMajor)
+ {
+ const char *serverver = PQparameterStatus(conn, "server_version");
+
+ pg_log_error("incompatible server version %s; client does not support streaming from server versions older than %s",
+ serverver ? serverver : "'unknown'",
+ "9.3");
+ return false;
+ }
+ else if (serverMajor > maxServerMajor)
+ {
+ const char *serverver = PQparameterStatus(conn, "server_version");
+
+ pg_log_error("incompatible server version %s; client does not support streaming from server versions newer than %s",
+ serverver ? serverver : "'unknown'",
+ PG_VERSION);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Receive a log stream starting at the specified position.
+ *
+ * Individual parameters are passed through the StreamCtl structure.
+ *
+ * If sysidentifier is specified, validate that both the system
+ * identifier and the timeline matches the specified ones
+ * (by sending an extra IDENTIFY_SYSTEM command)
+ *
+ * All received segments will be written to the directory
+ * specified by basedir. This will also fetch any missing timeline history
+ * files.
+ *
+ * The stream_stop callback will be called every time data
+ * is received, and whenever a segment is completed. If it returns
+ * true, the streaming will stop and the function
+ * return. As long as it returns false, streaming will continue
+ * indefinitely.
+ *
+ * If stream_stop() checks for external input, stop_socket should be set to
+ * the FD it checks. This will allow such input to be detected promptly
+ * rather than after standby_message_timeout (which might be indefinite).
+ * Note that signals will interrupt waits for input as well, but that is
+ * race-y since a signal received while busy won't interrupt the wait.
+ *
+ * standby_message_timeout controls how often we send a message
+ * back to the primary letting it know our progress, in milliseconds.
+ * Zero means no messages are sent.
+ * This message will only contain the write location, and never
+ * flush or replay.
+ *
+ * If 'partial_suffix' is not NULL, files are initially created with the
+ * given suffix, and the suffix is removed once the file is finished. That
+ * allows you to tell the difference between partial and completed files,
+ * so that you can continue later where you left.
+ *
+ * If 'synchronous' is true, the received WAL is flushed as soon as written,
+ * otherwise only when the WAL file is closed.
+ *
+ * Note: The WAL location *must* be at a log segment start!
+ */
+bool
+ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
+{
+ char query[128];
+ char slotcmd[128];
+ PGresult *res;
+ XLogRecPtr stoppos;
+
+ /*
+ * The caller should've checked the server version already, but doesn't do
+ * any harm to check it here too.
+ */
+ if (!CheckServerVersionForStreaming(conn))
+ return false;
+
+ /*
+ * Decide whether we want to report the flush position. If we report the
+ * flush position, the primary will know what WAL we'll possibly
+ * re-request, and it can then remove older WAL safely. We must always do
+ * that when we are using slots.
+ *
+ * Reporting the flush position makes one eligible as a synchronous
+ * replica. People shouldn't include generic names in
+ * synchronous_standby_names, but we've protected them against it so far,
+ * so let's continue to do so unless specifically requested.
+ */
+ if (stream->replication_slot != NULL)
+ {
+ reportFlushPosition = true;
+ sprintf(slotcmd, "SLOT \"%s\" ", stream->replication_slot);
+ }
+ else
+ {
+ if (stream->synchronous)
+ reportFlushPosition = true;
+ else
+ reportFlushPosition = false;
+ slotcmd[0] = 0;
+ }
+
+ if (stream->sysidentifier != NULL)
+ {
+ char *sysidentifier = NULL;
+ TimeLineID servertli;
+
+ /*
+ * Get the server system identifier and timeline, and validate them.
+ */
+ if (!RunIdentifySystem(conn, &sysidentifier, &servertli, NULL, NULL))
+ {
+ pg_free(sysidentifier);
+ return false;
+ }
+
+ if (strcmp(stream->sysidentifier, sysidentifier) != 0)
+ {
+ pg_log_error("system identifier does not match between base backup and streaming connection");
+ pg_free(sysidentifier);
+ return false;
+ }
+ pg_free(sysidentifier);
+
+ if (stream->timeline > servertli)
+ {
+ pg_log_error("starting timeline %u is not present in the server",
+ stream->timeline);
+ return false;
+ }
+ }
+
+ /*
+ * initialize flush position to starting point, it's the caller's
+ * responsibility that that's sane.
+ */
+ lastFlushPosition = stream->startpos;
+
+ while (1)
+ {
+ /*
+ * Fetch the timeline history file for this timeline, if we don't have
+ * it already. When streaming log to tar, this will always return
+ * false, as we are never streaming into an existing file and
+ * therefore there can be no pre-existing timeline history file.
+ */
+ if (!existsTimeLineHistoryFile(stream))
+ {
+ snprintf(query, sizeof(query), "TIMELINE_HISTORY %u", stream->timeline);
+ res = PQexec(conn, query);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ /* FIXME: we might send it ok, but get an error */
+ pg_log_error("could not send replication command \"%s\": %s",
+ "TIMELINE_HISTORY", PQresultErrorMessage(res));
+ PQclear(res);
+ return false;
+ }
+
+ /*
+ * The response to TIMELINE_HISTORY is a single row result set
+ * with two fields: filename and content
+ */
+ if (PQnfields(res) != 2 || PQntuples(res) != 1)
+ {
+ pg_log_warning("unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
+ }
+
+ /* Write the history file to disk */
+ writeTimeLineHistoryFile(stream,
+ PQgetvalue(res, 0, 0),
+ PQgetvalue(res, 0, 1));
+
+ PQclear(res);
+ }
+
+ /*
+ * Before we start streaming from the requested location, check if the
+ * callback tells us to stop here.
+ */
+ if (stream->stream_stop(stream->startpos, stream->timeline, false))
+ 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);
+ if (PQresultStatus(res) != PGRES_COPY_BOTH)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "START_REPLICATION", PQresultErrorMessage(res));
+ PQclear(res);
+ return false;
+ }
+ PQclear(res);
+
+ /* Stream the WAL */
+ res = HandleCopyStream(conn, stream, &stoppos);
+ if (res == NULL)
+ goto error;
+
+ /*
+ * Streaming finished.
+ *
+ * There are two possible reasons for that: a controlled shutdown, or
+ * we reached the end of the current timeline. In case of
+ * end-of-timeline, the server sends a result set after Copy has
+ * finished, containing information about the next timeline. Read
+ * that, and restart streaming from the next timeline. In case of
+ * controlled shutdown, stop here.
+ */
+ if (PQresultStatus(res) == PGRES_TUPLES_OK)
+ {
+ /*
+ * End-of-timeline. Read the next timeline's ID and starting
+ * position. Usually, the starting position will match the end of
+ * the previous timeline, but there are corner cases like if the
+ * server had sent us half of a WAL record, when it was promoted.
+ * The new timeline will begin at the end of the last complete
+ * record in that case, overlapping the partial WAL record on the
+ * old timeline.
+ */
+ uint32 newtimeline;
+ bool parsed;
+
+ parsed = ReadEndOfStreamingResult(res, &stream->startpos, &newtimeline);
+ PQclear(res);
+ if (!parsed)
+ goto error;
+
+ /* Sanity check the values the server gave us */
+ if (newtimeline <= stream->timeline)
+ {
+ pg_log_error("server reported unexpected next timeline %u, following timeline %u",
+ newtimeline, stream->timeline);
+ goto error;
+ }
+ if (stream->startpos > stoppos)
+ {
+ pg_log_error("server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X",
+ stream->timeline, LSN_FORMAT_ARGS(stoppos),
+ newtimeline, LSN_FORMAT_ARGS(stream->startpos));
+ goto error;
+ }
+
+ /* Read the final result, which should be CommandComplete. */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("unexpected termination of replication stream: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+ goto error;
+ }
+ PQclear(res);
+
+ /*
+ * Loop back to start streaming from the new timeline. Always
+ * start streaming at the beginning of a segment.
+ */
+ stream->timeline = newtimeline;
+ stream->startpos = stream->startpos -
+ XLogSegmentOffset(stream->startpos, WalSegSz);
+ continue;
+ }
+ else if (PQresultStatus(res) == PGRES_COMMAND_OK)
+ {
+ PQclear(res);
+
+ /*
+ * End of replication (ie. controlled shut down of the server).
+ *
+ * Check if the callback thinks it's OK to stop here. If not,
+ * complain.
+ */
+ if (stream->stream_stop(stoppos, stream->timeline, false))
+ return true;
+ else
+ {
+ pg_log_error("replication stream was terminated before stop point");
+ goto error;
+ }
+ }
+ else
+ {
+ /* Server returned an error. */
+ pg_log_error("unexpected termination of replication stream: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+ goto error;
+ }
+ }
+
+error:
+ if (walfile != NULL && stream->walmethod->ops->close(walfile, CLOSE_NO_RENAME) != 0)
+ pg_log_error("could not close file \"%s\": %s",
+ walfile->pathname, GetLastWalMethodError(stream->walmethod));
+ walfile = NULL;
+ return false;
+}
+
+/*
+ * Helper function to parse the result set returned by server after streaming
+ * has finished. On failure, prints an error to stderr and returns false.
+ */
+static bool
+ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos, uint32 *timeline)
+{
+ uint32 startpos_xlogid,
+ startpos_xrecoff;
+
+ /*----------
+ * The result set consists of one row and two columns, e.g:
+ *
+ * next_tli | next_tli_startpos
+ * ----------+-------------------
+ * 4 | 0/9949AE0
+ *
+ * next_tli is the timeline ID of the next timeline after the one that
+ * just finished streaming. next_tli_startpos is the WAL location where
+ * the server switched to it.
+ *----------
+ */
+ if (PQnfields(res) < 2 || PQntuples(res) != 1)
+ {
+ pg_log_error("unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
+ return false;
+ }
+
+ *timeline = atoi(PQgetvalue(res, 0, 0));
+ if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &startpos_xlogid,
+ &startpos_xrecoff) != 2)
+ {
+ pg_log_error("could not parse next timeline's starting point \"%s\"",
+ PQgetvalue(res, 0, 1));
+ return false;
+ }
+ *startpos = ((uint64) startpos_xlogid << 32) | startpos_xrecoff;
+
+ return true;
+}
+
+/*
+ * The main loop of ReceiveXlogStream. Handles the COPY stream after
+ * initiating streaming with the START_REPLICATION command.
+ *
+ * If the COPY ends (not necessarily successfully) due a message from the
+ * server, returns a PGresult and sets *stoppos to the last byte written.
+ * On any other sort of error, returns NULL.
+ */
+static PGresult *
+HandleCopyStream(PGconn *conn, StreamCtl *stream,
+ XLogRecPtr *stoppos)
+{
+ char *copybuf = NULL;
+ TimestampTz last_status = -1;
+ XLogRecPtr blockpos = stream->startpos;
+
+ still_sending = true;
+
+ while (1)
+ {
+ int r;
+ TimestampTz now;
+ long sleeptime;
+
+ /*
+ * Check if we should continue streaming, or abort at this point.
+ */
+ if (!CheckCopyStreamStop(conn, stream, blockpos))
+ goto error;
+
+ now = feGetCurrentTimestamp();
+
+ /*
+ * If synchronous option is true, issue sync command as soon as there
+ * are WAL data which has not been flushed yet.
+ */
+ if (stream->synchronous && lastFlushPosition < blockpos && walfile != NULL)
+ {
+ if (stream->walmethod->ops->sync(walfile) != 0)
+ pg_fatal("could not fsync file \"%s\": %s",
+ walfile->pathname, GetLastWalMethodError(stream->walmethod));
+ lastFlushPosition = blockpos;
+
+ /*
+ * Send feedback so that the server sees the latest WAL locations
+ * immediately.
+ */
+ if (!sendFeedback(conn, blockpos, now, false))
+ goto error;
+ last_status = now;
+ }
+
+ /*
+ * Potentially send a status message to the primary
+ */
+ if (still_sending && stream->standby_message_timeout > 0 &&
+ feTimestampDifferenceExceeds(last_status, now,
+ stream->standby_message_timeout))
+ {
+ /* Time to send feedback! */
+ if (!sendFeedback(conn, blockpos, now, false))
+ goto error;
+ last_status = now;
+ }
+
+ /*
+ * Calculate how long send/receive loops should sleep
+ */
+ sleeptime = CalculateCopyStreamSleeptime(now, stream->standby_message_timeout,
+ last_status);
+
+ r = CopyStreamReceive(conn, sleeptime, stream->stop_socket, &copybuf);
+ while (r != 0)
+ {
+ if (r == -1)
+ goto error;
+ if (r == -2)
+ {
+ PGresult *res = HandleEndOfCopyStream(conn, stream, copybuf, blockpos, stoppos);
+
+ if (res == NULL)
+ goto error;
+ else
+ return res;
+ }
+
+ /* Check the message type. */
+ if (copybuf[0] == 'k')
+ {
+ if (!ProcessKeepaliveMsg(conn, stream, copybuf, r, blockpos,
+ &last_status))
+ goto error;
+ }
+ else if (copybuf[0] == 'w')
+ {
+ if (!ProcessXLogDataMsg(conn, stream, copybuf, r, &blockpos))
+ goto error;
+
+ /*
+ * Check if we should continue streaming, or abort at this
+ * point.
+ */
+ if (!CheckCopyStreamStop(conn, stream, blockpos))
+ goto error;
+ }
+ else
+ {
+ pg_log_error("unrecognized streaming header: \"%c\"",
+ copybuf[0]);
+ goto error;
+ }
+
+ /*
+ * Process the received data, and any subsequent data we can read
+ * without blocking.
+ */
+ r = CopyStreamReceive(conn, 0, stream->stop_socket, &copybuf);
+ }
+ }
+
+error:
+ PQfreemem(copybuf);
+ return NULL;
+}
+
+/*
+ * Wait until we can read a CopyData message,
+ * or timeout, or occurrence of a signal or input on the stop_socket.
+ * (timeout_ms < 0 means wait indefinitely; 0 means don't wait.)
+ *
+ * Returns 1 if data has become available for reading, 0 if timed out
+ * or interrupted by signal or stop_socket input, and -1 on an error.
+ */
+static int
+CopyStreamPoll(PGconn *conn, long timeout_ms, pgsocket stop_socket)
+{
+ int ret;
+ fd_set input_mask;
+ int connsocket;
+ int maxfd;
+ struct timeval timeout;
+ struct timeval *timeoutptr;
+
+ connsocket = PQsocket(conn);
+ if (connsocket < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(conn));
+ return -1;
+ }
+
+ FD_ZERO(&input_mask);
+ FD_SET(connsocket, &input_mask);
+ maxfd = connsocket;
+ if (stop_socket != PGINVALID_SOCKET)
+ {
+ FD_SET(stop_socket, &input_mask);
+ maxfd = Max(maxfd, stop_socket);
+ }
+
+ if (timeout_ms < 0)
+ timeoutptr = NULL;
+ else
+ {
+ timeout.tv_sec = timeout_ms / 1000L;
+ timeout.tv_usec = (timeout_ms % 1000L) * 1000L;
+ timeoutptr = &timeout;
+ }
+
+ ret = select(maxfd + 1, &input_mask, NULL, NULL, timeoutptr);
+
+ if (ret < 0)
+ {
+ if (errno == EINTR)
+ return 0; /* Got a signal, so not an error */
+ pg_log_error("%s() failed: %m", "select");
+ return -1;
+ }
+ if (ret > 0 && FD_ISSET(connsocket, &input_mask))
+ return 1; /* Got input on connection socket */
+
+ return 0; /* Got timeout or input on stop_socket */
+}
+
+/*
+ * Receive CopyData message available from XLOG stream, blocking for
+ * maximum of 'timeout' ms.
+ *
+ * If data was received, returns the length of the data. *buffer is set to
+ * point to a buffer holding the received message. The buffer is only valid
+ * until the next CopyStreamReceive call.
+ *
+ * Returns 0 if no data was available within timeout, or if wait was
+ * interrupted by signal or stop_socket input.
+ * -1 on error. -2 if the server ended the COPY.
+ */
+static int
+CopyStreamReceive(PGconn *conn, long timeout, pgsocket stop_socket,
+ char **buffer)
+{
+ char *copybuf = NULL;
+ int rawlen;
+
+ PQfreemem(*buffer);
+ *buffer = NULL;
+
+ /* Try to receive a CopyData message */
+ rawlen = PQgetCopyData(conn, &copybuf, 1);
+ if (rawlen == 0)
+ {
+ int ret;
+
+ /*
+ * No data available. Wait for some to appear, but not longer than
+ * the specified timeout, so that we can ping the server. Also stop
+ * waiting if input appears on stop_socket.
+ */
+ ret = CopyStreamPoll(conn, timeout, stop_socket);
+ if (ret <= 0)
+ return ret;
+
+ /* Now there is actually data on the socket */
+ if (PQconsumeInput(conn) == 0)
+ {
+ pg_log_error("could not receive data from WAL stream: %s",
+ PQerrorMessage(conn));
+ return -1;
+ }
+
+ /* Now that we've consumed some input, try again */
+ rawlen = PQgetCopyData(conn, &copybuf, 1);
+ if (rawlen == 0)
+ return 0;
+ }
+ if (rawlen == -1) /* end-of-streaming or error */
+ return -2;
+ if (rawlen == -2)
+ {
+ pg_log_error("could not read COPY data: %s", PQerrorMessage(conn));
+ return -1;
+ }
+
+ /* Return received messages to caller */
+ *buffer = copybuf;
+ return rawlen;
+}
+
+/*
+ * Process the keepalive message.
+ */
+static bool
+ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
+ XLogRecPtr blockpos, TimestampTz *last_status)
+{
+ int pos;
+ bool replyRequested;
+ TimestampTz now;
+
+ /*
+ * Parse the keepalive message, enclosed in the CopyData message. We just
+ * check if the server requested a reply, and ignore the rest.
+ */
+ pos = 1; /* skip msgtype 'k' */
+ pos += 8; /* skip walEnd */
+ pos += 8; /* skip sendTime */
+
+ if (len < pos + 1)
+ {
+ pg_log_error("streaming header too small: %d", len);
+ return false;
+ }
+ replyRequested = copybuf[pos];
+
+ /* If the server requested an immediate reply, send one. */
+ if (replyRequested && still_sending)
+ {
+ if (reportFlushPosition && lastFlushPosition < blockpos &&
+ walfile != NULL)
+ {
+ /*
+ * If a valid flush location needs to be reported, flush the
+ * current WAL file so that the latest flush location is sent back
+ * to the server. This is necessary to see whether the last WAL
+ * data has been successfully replicated or not, at the normal
+ * shutdown of the server.
+ */
+ if (stream->walmethod->ops->sync(walfile) != 0)
+ pg_fatal("could not fsync file \"%s\": %s",
+ walfile->pathname, GetLastWalMethodError(stream->walmethod));
+ lastFlushPosition = blockpos;
+ }
+
+ now = feGetCurrentTimestamp();
+ if (!sendFeedback(conn, blockpos, now, false))
+ return false;
+ *last_status = now;
+ }
+
+ return true;
+}
+
+/*
+ * Process XLogData message.
+ */
+static bool
+ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
+ XLogRecPtr *blockpos)
+{
+ int xlogoff;
+ int bytes_left;
+ int bytes_written;
+ int hdr_len;
+
+ /*
+ * Once we've decided we don't want to receive any more, just ignore any
+ * subsequent XLogData messages.
+ */
+ if (!(still_sending))
+ return true;
+
+ /*
+ * Read the header of the XLogData message, enclosed in the CopyData
+ * message. We only need the WAL location field (dataStart), the rest of
+ * the header is ignored.
+ */
+ hdr_len = 1; /* msgtype 'w' */
+ hdr_len += 8; /* dataStart */
+ hdr_len += 8; /* walEnd */
+ hdr_len += 8; /* sendTime */
+ if (len < hdr_len)
+ {
+ pg_log_error("streaming header too small: %d", len);
+ return false;
+ }
+ *blockpos = fe_recvint64(&copybuf[1]);
+
+ /* Extract WAL location for this block */
+ xlogoff = XLogSegmentOffset(*blockpos, WalSegSz);
+
+ /*
+ * Verify that the initial location in the stream matches where we think
+ * we are.
+ */
+ if (walfile == NULL)
+ {
+ /* No file open yet */
+ if (xlogoff != 0)
+ {
+ pg_log_error("received write-ahead log record for offset %u with no file open",
+ xlogoff);
+ return false;
+ }
+ }
+ else
+ {
+ /* More data in existing segment */
+ if (walfile->currpos != xlogoff)
+ {
+ pg_log_error("got WAL data offset %08x, expected %08x",
+ xlogoff, (int) walfile->currpos);
+ return false;
+ }
+ }
+
+ bytes_left = len - hdr_len;
+ bytes_written = 0;
+
+ while (bytes_left)
+ {
+ int bytes_to_write;
+
+ /*
+ * If crossing a WAL boundary, only write up until we reach wal
+ * segment size.
+ */
+ if (xlogoff + bytes_left > WalSegSz)
+ bytes_to_write = WalSegSz - xlogoff;
+ else
+ bytes_to_write = bytes_left;
+
+ if (walfile == NULL)
+ {
+ if (!open_walfile(stream, *blockpos))
+ {
+ /* Error logged by open_walfile */
+ return false;
+ }
+ }
+
+ if (stream->walmethod->ops->write(walfile,
+ copybuf + hdr_len + bytes_written,
+ bytes_to_write) != bytes_to_write)
+ {
+ pg_log_error("could not write %d bytes to WAL file \"%s\": %s",
+ bytes_to_write, walfile->pathname,
+ GetLastWalMethodError(stream->walmethod));
+ return false;
+ }
+
+ /* Write was successful, advance our position */
+ bytes_written += bytes_to_write;
+ bytes_left -= bytes_to_write;
+ *blockpos += bytes_to_write;
+ xlogoff += bytes_to_write;
+
+ /* Did we reach the end of a WAL segment? */
+ if (XLogSegmentOffset(*blockpos, WalSegSz) == 0)
+ {
+ if (!close_walfile(stream, *blockpos))
+ /* Error message written in close_walfile() */
+ return false;
+
+ xlogoff = 0;
+
+ if (still_sending && stream->stream_stop(*blockpos, stream->timeline, true))
+ {
+ if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+ still_sending = false;
+ return true; /* ignore the rest of this XLogData packet */
+ }
+ }
+ }
+ /* No more data left to write, receive next copy packet */
+
+ return true;
+}
+
+/*
+ * Handle end of the copy stream.
+ */
+static PGresult *
+HandleEndOfCopyStream(PGconn *conn, StreamCtl *stream, char *copybuf,
+ XLogRecPtr blockpos, XLogRecPtr *stoppos)
+{
+ PGresult *res = PQgetResult(conn);
+
+ /*
+ * The server closed its end of the copy stream. If we haven't closed
+ * ours already, we need to do so now, unless the server threw an error,
+ * in which case we don't.
+ */
+ if (still_sending)
+ {
+ if (!close_walfile(stream, blockpos))
+ {
+ /* Error message written in close_walfile() */
+ PQclear(res);
+ return NULL;
+ }
+ if (PQresultStatus(res) == PGRES_COPY_IN)
+ {
+ if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
+ PQclear(res);
+ return NULL;
+ }
+ res = PQgetResult(conn);
+ }
+ still_sending = false;
+ }
+ PQfreemem(copybuf);
+ *stoppos = blockpos;
+ return res;
+}
+
+/*
+ * Check if we should continue streaming, or abort at this point.
+ */
+static bool
+CheckCopyStreamStop(PGconn *conn, StreamCtl *stream, XLogRecPtr blockpos)
+{
+ if (still_sending && stream->stream_stop(blockpos, stream->timeline, false))
+ {
+ if (!close_walfile(stream, blockpos))
+ {
+ /* Potential error message is written by close_walfile */
+ return false;
+ }
+ if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
+ {
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
+ return false;
+ }
+ still_sending = false;
+ }
+
+ return true;
+}
+
+/*
+ * Calculate how long send/receive loops should sleep
+ */
+static long
+CalculateCopyStreamSleeptime(TimestampTz now, int standby_message_timeout,
+ TimestampTz last_status)
+{
+ TimestampTz status_targettime = 0;
+ long sleeptime;
+
+ if (standby_message_timeout && still_sending)
+ status_targettime = last_status +
+ (standby_message_timeout - 1) * ((int64) 1000);
+
+ if (status_targettime > 0)
+ {
+ long secs;
+ int usecs;
+
+ feTimestampDifference(now,
+ status_targettime,
+ &secs,
+ &usecs);
+ /* Always sleep at least 1 sec */
+ if (secs <= 0)
+ {
+ secs = 1;
+ usecs = 0;
+ }
+
+ sleeptime = secs * 1000 + usecs / 1000;
+ }
+ else
+ sleeptime = -1;
+
+ return sleeptime;
+}
diff --git a/src/bin/pg_basebackup/receivelog.h b/src/bin/pg_basebackup/receivelog.h
new file mode 100644
index 0000000..805c1c2
--- /dev/null
+++ b/src/bin/pg_basebackup/receivelog.h
@@ -0,0 +1,57 @@
+/*-------------------------------------------------------------------------
+ *
+ * receivelog.h
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/receivelog.h
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef RECEIVELOG_H
+#define RECEIVELOG_H
+
+#include "access/xlogdefs.h"
+#include "libpq-fe.h"
+#include "walmethods.h"
+
+/*
+ * Called before trying to read more data or when a segment is
+ * finished. Return true to stop streaming.
+ */
+typedef bool (*stream_stop_callback) (XLogRecPtr segendpos, uint32 timeline, bool segment_finished);
+
+/*
+ * Global parameters when receiving xlog stream. For details about the individual fields,
+ * see the function comment for ReceiveXlogStream().
+ */
+typedef struct StreamCtl
+{
+ XLogRecPtr startpos; /* Start position for streaming */
+ TimeLineID timeline; /* Timeline to stream data from */
+ char *sysidentifier; /* Validate this system identifier and
+ * timeline */
+ int standby_message_timeout; /* Send status messages this often */
+ bool synchronous; /* Flush immediately WAL data on write */
+ bool mark_done; /* Mark segment as done in generated archive */
+ bool do_sync; /* Flush to disk to ensure consistent state of
+ * data */
+
+ stream_stop_callback stream_stop; /* Stop streaming when returns true */
+
+ pgsocket stop_socket; /* if valid, watch for input on this socket
+ * and check stream_stop() when there is any */
+
+ WalWriteMethod *walmethod; /* How to write the WAL */
+ char *partial_suffix; /* Suffix appended to partially received files */
+ char *replication_slot; /* Replication slot to use, or NULL */
+} StreamCtl;
+
+
+
+extern bool CheckServerVersionForStreaming(PGconn *conn);
+extern bool ReceiveXlogStream(PGconn *conn,
+ StreamCtl *stream);
+
+#endif /* RECEIVELOG_H */
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
new file mode 100644
index 0000000..1551459
--- /dev/null
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -0,0 +1,861 @@
+/*-------------------------------------------------------------------------
+ *
+ * streamutil.c - utility functions for pg_basebackup, pg_receivewal and
+ * pg_recvlogical
+ *
+ * Author: Magnus Hagander <magnus@hagander.net>
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/streamutil.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/time.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/connect.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "datatype/timestamp.h"
+#include "port/pg_bswap.h"
+#include "pqexpbuffer.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+#define ERRCODE_DUPLICATE_OBJECT "42710"
+
+int WalSegSz;
+
+static bool RetrieveDataDirCreatePerm(PGconn *conn);
+
+/* SHOW command for replication connection was introduced in version 10 */
+#define MINIMUM_VERSION_FOR_SHOW_CMD 100000
+
+/*
+ * Group access is supported from version 11.
+ */
+#define MINIMUM_VERSION_FOR_GROUP_ACCESS 110000
+
+const char *progname;
+char *connection_string = NULL;
+char *dbhost = NULL;
+char *dbuser = NULL;
+char *dbport = NULL;
+char *dbname = NULL;
+int dbgetpassword = 0; /* 0=auto, -1=never, 1=always */
+static char *password = NULL;
+PGconn *conn = NULL;
+
+/*
+ * Connect to the server. Returns a valid PGconn pointer if connected,
+ * or NULL on non-permanent error. On permanent error, the function will
+ * call exit(1) directly.
+ */
+PGconn *
+GetConnection(void)
+{
+ PGconn *tmpconn;
+ int argcount = 7; /* dbname, replication, fallback_app_name,
+ * host, user, port, password */
+ int i;
+ const char **keywords;
+ const char **values;
+ const char *tmpparam;
+ bool need_password;
+ PQconninfoOption *conn_opts = NULL;
+ PQconninfoOption *conn_opt;
+ char *err_msg = NULL;
+
+ /* pg_recvlogical uses dbname only; others use connection_string only. */
+ Assert(dbname == NULL || connection_string == NULL);
+
+ /*
+ * Merge the connection info inputs given in form of connection string,
+ * options and default values (dbname=replication, replication=true, etc.)
+ * Explicitly discard any dbname value in the connection string;
+ * otherwise, PQconnectdbParams() would interpret that value as being
+ * itself a connection string.
+ */
+ i = 0;
+ if (connection_string)
+ {
+ conn_opts = PQconninfoParse(connection_string, &err_msg);
+ if (conn_opts == NULL)
+ pg_fatal("%s", err_msg);
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ argcount++;
+ }
+
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ {
+ keywords[i] = conn_opt->keyword;
+ values[i] = conn_opt->val;
+ i++;
+ }
+ }
+ }
+ else
+ {
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+ }
+
+ keywords[i] = "dbname";
+ values[i] = dbname == NULL ? "replication" : dbname;
+ i++;
+ keywords[i] = "replication";
+ values[i] = dbname == NULL ? "true" : "database";
+ i++;
+ keywords[i] = "fallback_application_name";
+ values[i] = progname;
+ i++;
+
+ if (dbhost)
+ {
+ keywords[i] = "host";
+ values[i] = dbhost;
+ i++;
+ }
+ if (dbuser)
+ {
+ keywords[i] = "user";
+ values[i] = dbuser;
+ i++;
+ }
+ if (dbport)
+ {
+ keywords[i] = "port";
+ values[i] = dbport;
+ i++;
+ }
+
+ /* If -W was given, force prompt for password, but only the first time */
+ need_password = (dbgetpassword == 1 && !password);
+
+ do
+ {
+ /* Get a new password if appropriate */
+ if (need_password)
+ {
+ free(password);
+ password = simple_prompt("Password: ", false);
+ need_password = false;
+ }
+
+ /* Use (or reuse, on a subsequent connection) password if we have it */
+ if (password)
+ {
+ keywords[i] = "password";
+ values[i] = password;
+ }
+ else
+ {
+ keywords[i] = NULL;
+ values[i] = NULL;
+ }
+
+ tmpconn = PQconnectdbParams(keywords, values, true);
+
+ /*
+ * If there is too little memory even to allocate the PGconn object
+ * and PQconnectdbParams returns NULL, we call exit(1) directly.
+ */
+ if (!tmpconn)
+ pg_fatal("could not connect to server");
+
+ /* If we need a password and -w wasn't given, loop back and get one */
+ if (PQstatus(tmpconn) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(tmpconn) &&
+ dbgetpassword != -1)
+ {
+ PQfinish(tmpconn);
+ need_password = true;
+ }
+ }
+ while (need_password);
+
+ if (PQstatus(tmpconn) != CONNECTION_OK)
+ {
+ pg_log_error("%s", PQerrorMessage(tmpconn));
+ PQfinish(tmpconn);
+ free(values);
+ free(keywords);
+ PQconninfoFree(conn_opts);
+ return NULL;
+ }
+
+ /* Connection ok! */
+ free(values);
+ free(keywords);
+ PQconninfoFree(conn_opts);
+
+ /*
+ * Set always-secure search path, so malicious users can't get control.
+ * The capacity to run normal SQL queries was added in PostgreSQL 10, so
+ * the search path cannot be changed (by us or attackers) on earlier
+ * versions.
+ */
+ if (dbname != NULL && PQserverVersion(tmpconn) >= 100000)
+ {
+ PGresult *res;
+
+ res = PQexec(tmpconn, ALWAYS_SECURE_SEARCH_PATH_SQL);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not clear search_path: %s",
+ PQerrorMessage(tmpconn));
+ PQclear(res);
+ PQfinish(tmpconn);
+ exit(1);
+ }
+ PQclear(res);
+ }
+
+ /*
+ * Ensure we have the same value of integer_datetimes (now always "on") as
+ * the server we are connecting to.
+ */
+ tmpparam = PQparameterStatus(tmpconn, "integer_datetimes");
+ if (!tmpparam)
+ {
+ pg_log_error("could not determine server setting for integer_datetimes");
+ PQfinish(tmpconn);
+ exit(1);
+ }
+
+ if (strcmp(tmpparam, "on") != 0)
+ {
+ pg_log_error("integer_datetimes compile flag does not match server");
+ PQfinish(tmpconn);
+ exit(1);
+ }
+
+ /*
+ * Retrieve the source data directory mode and use it to construct a umask
+ * for creating directories and files.
+ */
+ if (!RetrieveDataDirCreatePerm(tmpconn))
+ {
+ PQfinish(tmpconn);
+ exit(1);
+ }
+
+ return tmpconn;
+}
+
+/*
+ * From version 10, explicitly set wal segment size using SHOW wal_segment_size
+ * since ControlFile is not accessible here.
+ */
+bool
+RetrieveWalSegSize(PGconn *conn)
+{
+ PGresult *res;
+ char xlog_unit[3];
+ int xlog_val,
+ multiplier = 1;
+
+ /* check connection existence */
+ Assert(conn != NULL);
+
+ /* for previous versions set the default xlog seg size */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_SHOW_CMD)
+ {
+ WalSegSz = DEFAULT_XLOG_SEG_SIZE;
+ return true;
+ }
+
+ res = PQexec(conn, "SHOW wal_segment_size");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "SHOW wal_segment_size", PQerrorMessage(conn));
+
+ PQclear(res);
+ return false;
+ }
+ if (PQntuples(res) != 1 || PQnfields(res) < 1)
+ {
+ pg_log_error("could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 1);
+
+ PQclear(res);
+ return false;
+ }
+
+ /* fetch xlog value and unit from the result */
+ if (sscanf(PQgetvalue(res, 0, 0), "%d%2s", &xlog_val, xlog_unit) != 2)
+ {
+ pg_log_error("WAL segment size could not be parsed");
+ PQclear(res);
+ return false;
+ }
+
+ PQclear(res);
+
+ /* set the multiplier based on unit to convert xlog_val to bytes */
+ if (strcmp(xlog_unit, "MB") == 0)
+ multiplier = 1024 * 1024;
+ else if (strcmp(xlog_unit, "GB") == 0)
+ multiplier = 1024 * 1024 * 1024;
+
+ /* convert and set WalSegSz */
+ WalSegSz = xlog_val * multiplier;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ {
+ pg_log_error(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte",
+ "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes",
+ WalSegSz),
+ WalSegSz);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * RetrieveDataDirCreatePerm
+ *
+ * This function is used to determine the privileges on the server's PG data
+ * directory and, based on that, set what the permissions will be for
+ * directories and files we create.
+ *
+ * PG11 added support for (optionally) group read/execute rights to be set on
+ * the data directory. Prior to PG11, only the owner was allowed to have rights
+ * on the data directory.
+ */
+static bool
+RetrieveDataDirCreatePerm(PGconn *conn)
+{
+ PGresult *res;
+ int data_directory_mode;
+
+ /* check connection existence */
+ Assert(conn != NULL);
+
+ /* for previous versions leave the default group access */
+ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_GROUP_ACCESS)
+ return true;
+
+ res = PQexec(conn, "SHOW data_directory_mode");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "SHOW data_directory_mode", PQerrorMessage(conn));
+
+ PQclear(res);
+ return false;
+ }
+ if (PQntuples(res) != 1 || PQnfields(res) < 1)
+ {
+ pg_log_error("could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 1);
+
+ PQclear(res);
+ return false;
+ }
+
+ if (sscanf(PQgetvalue(res, 0, 0), "%o", &data_directory_mode) != 1)
+ {
+ pg_log_error("group access flag could not be parsed: %s",
+ PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+ return false;
+ }
+
+ SetDataDirectoryCreatePerm(data_directory_mode);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Run IDENTIFY_SYSTEM through a given connection and give back to caller
+ * some result information if requested:
+ * - System identifier
+ * - Current timeline ID
+ * - Start LSN position
+ * - Database name (NULL in servers prior to 9.4)
+ */
+bool
+RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
+ XLogRecPtr *startpos, char **db_name)
+{
+ PGresult *res;
+ uint32 hi,
+ lo;
+
+ /* Check connection existence */
+ Assert(conn != NULL);
+
+ res = PQexec(conn, "IDENTIFY_SYSTEM");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "IDENTIFY_SYSTEM", PQerrorMessage(conn));
+
+ PQclear(res);
+ return false;
+ }
+ if (PQntuples(res) != 1 || PQnfields(res) < 3)
+ {
+ pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 3);
+
+ PQclear(res);
+ return false;
+ }
+
+ /* Get system identifier */
+ if (sysid != NULL)
+ *sysid = pg_strdup(PQgetvalue(res, 0, 0));
+
+ /* Get timeline ID to start streaming from */
+ if (starttli != NULL)
+ *starttli = atoi(PQgetvalue(res, 0, 1));
+
+ /* Get LSN start position if necessary */
+ if (startpos != NULL)
+ {
+ if (sscanf(PQgetvalue(res, 0, 2), "%X/%X", &hi, &lo) != 2)
+ {
+ pg_log_error("could not parse write-ahead log location \"%s\"",
+ PQgetvalue(res, 0, 2));
+
+ PQclear(res);
+ return false;
+ }
+ *startpos = ((uint64) hi) << 32 | lo;
+ }
+
+ /* Get database name, only available in 9.4 and newer versions */
+ if (db_name != NULL)
+ {
+ *db_name = NULL;
+ if (PQserverVersion(conn) >= 90400)
+ {
+ if (PQnfields(res) < 4)
+ {
+ pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
+ PQntuples(res), PQnfields(res), 1, 4);
+
+ PQclear(res);
+ return false;
+ }
+ if (!PQgetisnull(res, 0, 3))
+ *db_name = pg_strdup(PQgetvalue(res, 0, 3));
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Run READ_REPLICATION_SLOT through a given connection and give back to
+ * caller some result information if requested for this slot:
+ * - Start LSN position, InvalidXLogRecPtr if unknown.
+ * - Current timeline ID, 0 if unknown.
+ * Returns false on failure, and true otherwise.
+ */
+bool
+GetSlotInformation(PGconn *conn, const char *slot_name,
+ XLogRecPtr *restart_lsn, TimeLineID *restart_tli)
+{
+ PGresult *res;
+ PQExpBuffer query;
+ XLogRecPtr lsn_loc = InvalidXLogRecPtr;
+ TimeLineID tli_loc = 0;
+
+ if (restart_lsn)
+ *restart_lsn = lsn_loc;
+ if (restart_tli)
+ *restart_tli = tli_loc;
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "READ_REPLICATION_SLOT %s", slot_name);
+ res = PQexec(conn, query->data);
+ destroyPQExpBuffer(query);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ "READ_REPLICATION_SLOT", PQerrorMessage(conn));
+ PQclear(res);
+ return false;
+ }
+
+ /* The command should always return precisely one tuple and three fields */
+ if (PQntuples(res) != 1 || PQnfields(res) != 3)
+ {
+ pg_log_error("could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
+ slot_name, PQntuples(res), PQnfields(res), 1, 3);
+ PQclear(res);
+ return false;
+ }
+
+ /*
+ * When the slot doesn't exist, the command returns a tuple with NULL
+ * values. This checks only the slot type field.
+ */
+ if (PQgetisnull(res, 0, 0))
+ {
+ pg_log_error("replication slot \"%s\" does not exist", slot_name);
+ PQclear(res);
+ return false;
+ }
+
+ /*
+ * Note that this cannot happen as READ_REPLICATION_SLOT supports only
+ * physical slots, but play it safe.
+ */
+ if (strcmp(PQgetvalue(res, 0, 0), "physical") != 0)
+ {
+ pg_log_error("expected a physical replication slot, got type \"%s\" instead",
+ PQgetvalue(res, 0, 0));
+ PQclear(res);
+ return false;
+ }
+
+ /* restart LSN */
+ if (!PQgetisnull(res, 0, 1))
+ {
+ uint32 hi,
+ lo;
+
+ if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &hi, &lo) != 2)
+ {
+ pg_log_error("could not parse restart_lsn \"%s\" for replication slot \"%s\"",
+ PQgetvalue(res, 0, 1), slot_name);
+ PQclear(res);
+ return false;
+ }
+ lsn_loc = ((uint64) hi) << 32 | lo;
+ }
+
+ /* current TLI */
+ if (!PQgetisnull(res, 0, 2))
+ tli_loc = (TimeLineID) atol(PQgetvalue(res, 0, 2));
+
+ PQclear(res);
+
+ /* Assign results if requested */
+ if (restart_lsn)
+ *restart_lsn = lsn_loc;
+ if (restart_tli)
+ *restart_tli = tli_loc;
+
+ return true;
+}
+
+/*
+ * Create a replication slot for the given connection. This function
+ * returns true in case of success.
+ */
+bool
+CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
+ bool is_temporary, bool is_physical, bool reserve_wal,
+ bool slot_exists_ok, bool two_phase)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ bool use_new_option_syntax = (PQserverVersion(conn) >= 150000);
+
+ query = createPQExpBuffer();
+
+ Assert((is_physical && plugin == NULL) ||
+ (!is_physical && plugin != NULL));
+ Assert(!(two_phase && is_physical));
+ Assert(slot_name != NULL);
+
+ /* Build base portion of query */
+ appendPQExpBuffer(query, "CREATE_REPLICATION_SLOT \"%s\"", slot_name);
+ if (is_temporary)
+ appendPQExpBufferStr(query, " TEMPORARY");
+ if (is_physical)
+ appendPQExpBufferStr(query, " PHYSICAL");
+ else
+ appendPQExpBuffer(query, " LOGICAL \"%s\"", plugin);
+
+ /* Add any requested options */
+ if (use_new_option_syntax)
+ appendPQExpBufferStr(query, " (");
+ if (is_physical)
+ {
+ if (reserve_wal)
+ AppendPlainCommandOption(query, use_new_option_syntax,
+ "RESERVE_WAL");
+ }
+ else
+ {
+ if (two_phase && PQserverVersion(conn) >= 150000)
+ AppendPlainCommandOption(query, use_new_option_syntax,
+ "TWO_PHASE");
+
+ if (PQserverVersion(conn) >= 100000)
+ {
+ /* pg_recvlogical doesn't use an exported snapshot, so suppress */
+ if (use_new_option_syntax)
+ AppendStringCommandOption(query, use_new_option_syntax,
+ "SNAPSHOT", "nothing");
+ else
+ AppendPlainCommandOption(query, use_new_option_syntax,
+ "NOEXPORT_SNAPSHOT");
+ }
+ }
+ if (use_new_option_syntax)
+ {
+ /* Suppress option list if it would be empty, otherwise terminate */
+ if (query->data[query->len - 1] == '(')
+ {
+ query->len -= 2;
+ query->data[query->len] = '\0';
+ }
+ else
+ appendPQExpBufferChar(query, ')');
+ }
+
+ /* Now run the query */
+ res = PQexec(conn, query->data);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
+
+ if (slot_exists_ok &&
+ sqlstate &&
+ strcmp(sqlstate, ERRCODE_DUPLICATE_OBJECT) == 0)
+ {
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return true;
+ }
+ else
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ query->data, PQerrorMessage(conn));
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+ }
+
+ if (PQntuples(res) != 1 || PQnfields(res) != 4)
+ {
+ pg_log_error("could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
+ slot_name,
+ PQntuples(res), PQnfields(res), 1, 4);
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Drop a replication slot for the given connection. This function
+ * returns true in case of success.
+ */
+bool
+DropReplicationSlot(PGconn *conn, const char *slot_name)
+{
+ PQExpBuffer query;
+ PGresult *res;
+
+ Assert(slot_name != NULL);
+
+ query = createPQExpBuffer();
+
+ /* Build query */
+ appendPQExpBuffer(query, "DROP_REPLICATION_SLOT \"%s\"",
+ slot_name);
+ res = PQexec(conn, query->data);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("could not send replication command \"%s\": %s",
+ query->data, PQerrorMessage(conn));
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+
+ if (PQntuples(res) != 0 || PQnfields(res) != 0)
+ {
+ pg_log_error("could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
+ slot_name,
+ PQntuples(res), PQnfields(res), 0, 0);
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return false;
+ }
+
+ destroyPQExpBuffer(query);
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Append a "plain" option - one with no value - to a server command that
+ * is being constructed.
+ *
+ * In the old syntax, all options were parser keywords, so you could just
+ * 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).
+ */
+void
+AppendPlainCommandOption(PQExpBuffer buf, bool use_new_option_syntax,
+ char *option_name)
+{
+ if (buf->len > 0 && buf->data[buf->len - 1] != '(')
+ {
+ if (use_new_option_syntax)
+ appendPQExpBufferStr(buf, ", ");
+ else
+ appendPQExpBufferChar(buf, ' ');
+ }
+
+ appendPQExpBuffer(buf, " %s", option_name);
+}
+
+/*
+ * Append an option with an associated string value to a server command that
+ * is being constructed.
+ *
+ * See comments for AppendPlainCommandOption, above.
+ */
+void
+AppendStringCommandOption(PQExpBuffer buf, bool use_new_option_syntax,
+ char *option_name, 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);
+ }
+}
+
+/*
+ * Append an option with an associated integer value to a server command
+ * is being constructed.
+ *
+ * See comments for AppendPlainCommandOption, above.
+ */
+void
+AppendIntegerCommandOption(PQExpBuffer buf, bool use_new_option_syntax,
+ char *option_name, int32 option_value)
+{
+ AppendPlainCommandOption(buf, use_new_option_syntax, option_name);
+
+ appendPQExpBuffer(buf, " %d", option_value);
+}
+
+/*
+ * Frontend version of GetCurrentTimestamp(), since we are not linked with
+ * backend code.
+ */
+TimestampTz
+feGetCurrentTimestamp(void)
+{
+ TimestampTz result;
+ struct timeval tp;
+
+ gettimeofday(&tp, NULL);
+
+ result = (TimestampTz) tp.tv_sec -
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+ result = (result * USECS_PER_SEC) + tp.tv_usec;
+
+ return result;
+}
+
+/*
+ * Frontend version of TimestampDifference(), since we are not linked with
+ * backend code.
+ */
+void
+feTimestampDifference(TimestampTz start_time, TimestampTz stop_time,
+ long *secs, int *microsecs)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ if (diff <= 0)
+ {
+ *secs = 0;
+ *microsecs = 0;
+ }
+ else
+ {
+ *secs = (long) (diff / USECS_PER_SEC);
+ *microsecs = (int) (diff % USECS_PER_SEC);
+ }
+}
+
+/*
+ * Frontend version of TimestampDifferenceExceeds(), since we are not
+ * linked with backend code.
+ */
+bool
+feTimestampDifferenceExceeds(TimestampTz start_time,
+ TimestampTz stop_time,
+ int msec)
+{
+ TimestampTz diff = stop_time - start_time;
+
+ return (diff >= msec * INT64CONST(1000));
+}
+
+/*
+ * Converts an int64 to network byte order.
+ */
+void
+fe_sendint64(int64 i, char *buf)
+{
+ uint64 n64 = pg_hton64(i);
+
+ memcpy(buf, &n64, sizeof(n64));
+}
+
+/*
+ * Converts an int64 from network byte order to native format.
+ */
+int64
+fe_recvint64(char *buf)
+{
+ uint64 n64;
+
+ memcpy(&n64, buf, sizeof(n64));
+
+ return pg_ntoh64(n64);
+}
diff --git a/src/bin/pg_basebackup/streamutil.h b/src/bin/pg_basebackup/streamutil.h
new file mode 100644
index 0000000..268c163
--- /dev/null
+++ b/src/bin/pg_basebackup/streamutil.h
@@ -0,0 +1,68 @@
+/*-------------------------------------------------------------------------
+ *
+ * streamutil.h
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/streamutil.h
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef STREAMUTIL_H
+#define STREAMUTIL_H
+
+#include "access/xlogdefs.h"
+#include "datatype/timestamp.h"
+#include "libpq-fe.h"
+#include "pqexpbuffer.h"
+
+extern const char *progname;
+extern char *connection_string;
+extern char *dbhost;
+extern char *dbuser;
+extern char *dbport;
+extern char *dbname;
+extern int dbgetpassword;
+extern int WalSegSz;
+
+/* Connection kept global so we can disconnect easily */
+extern PGconn *conn;
+
+extern PGconn *GetConnection(void);
+
+/* Replication commands */
+extern bool CreateReplicationSlot(PGconn *conn, const char *slot_name,
+ const char *plugin, bool is_temporary,
+ bool is_physical, bool reserve_wal,
+ bool slot_exists_ok, bool two_phase);
+extern bool DropReplicationSlot(PGconn *conn, const char *slot_name);
+extern bool RunIdentifySystem(PGconn *conn, char **sysid,
+ TimeLineID *starttli,
+ XLogRecPtr *startpos,
+ char **db_name);
+
+extern void AppendPlainCommandOption(PQExpBuffer buf,
+ bool use_new_option_syntax,
+ char *option_name);
+extern void AppendStringCommandOption(PQExpBuffer buf,
+ bool use_new_option_syntax,
+ char *option_name, char *option_value);
+extern void AppendIntegerCommandOption(PQExpBuffer buf,
+ bool use_new_option_syntax,
+ char *option_name, int32 option_value);
+
+extern bool GetSlotInformation(PGconn *conn, const char *slot_name,
+ XLogRecPtr *restart_lsn,
+ TimeLineID *restart_tli);
+extern bool RetrieveWalSegSize(PGconn *conn);
+extern TimestampTz feGetCurrentTimestamp(void);
+extern void feTimestampDifference(TimestampTz start_time, TimestampTz stop_time,
+ long *secs, int *microsecs);
+
+extern bool feTimestampDifferenceExceeds(TimestampTz start_time, TimestampTz stop_time,
+ int msec);
+extern void fe_sendint64(int64 i, char *buf);
+extern int64 fe_recvint64(char *buf);
+
+#endif /* STREAMUTIL_H */
diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
new file mode 100644
index 0000000..b9f5e12
--- /dev/null
+++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
@@ -0,0 +1,952 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use File::Basename qw(basename dirname);
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_basebackup');
+program_version_ok('pg_basebackup');
+program_options_handling_ok('pg_basebackup');
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+
+# For nearly all pg_basebackup invocations some options should be specified,
+# to keep test times reasonable. Using @pg_basebackup_defs as the first
+# element of the array passed to IPC::Run interpolate the array (as it is
+# not a reference to an array)...
+my @pg_basebackup_defs = ('pg_basebackup', '--no-sync', '-cfast');
+
+
+# Set umask so test directories and files are created with default permissions
+umask(0077);
+
+# Initialize node without replication settings
+$node->init(
+ extra => ['--data-checksums'],
+ auth_extra => [ '--create-role', 'backupuser' ]);
+$node->start;
+my $pgdata = $node->data_dir;
+
+$node->command_fails(['pg_basebackup'],
+ 'pg_basebackup needs target directory specified');
+
+# Sanity checks for options
+$node->command_fails_like(
+ [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none:1' ],
+ qr/\Qcompression algorithm "none" does not accept a compression level/,
+ 'failure if method "none" specified with compression level');
+$node->command_fails_like(
+ [ 'pg_basebackup', '-D', "$tempdir/backup", '--compress', 'none+' ],
+ qr/\Qunrecognized compression algorithm: "none+"/,
+ 'failure on incorrect separator to define compression level');
+
+# Some Windows ANSI code pages may reject this filename, in which case we
+# quietly proceed without this bit of test coverage.
+if (open my $badchars, '>>', "$tempdir/pgdata/FOO\xe0\xe0\xe0BAR")
+{
+ print $badchars "test backup of file with non-UTF8 name\n";
+ close $badchars;
+}
+
+$node->set_replication_conf();
+$node->reload;
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup" ],
+ 'pg_basebackup fails because of WAL configuration');
+
+ok(!-d "$tempdir/backup", 'backup directory was cleaned up');
+
+# Create a backup directory that is not empty so the next command will fail
+# but leave the data directory behind
+mkdir("$tempdir/backup")
+ or BAIL_OUT("unable to create $tempdir/backup");
+append_to_file("$tempdir/backup/dir-not-empty.txt", "Some data");
+
+$node->command_fails([ @pg_basebackup_defs, '-D', "$tempdir/backup", '-n' ],
+ 'failing run with no-clean option');
+
+ok(-d "$tempdir/backup", 'backup directory was created and left behind');
+rmtree("$tempdir/backup");
+
+open my $conf, '>>', "$pgdata/postgresql.conf";
+print $conf "max_replication_slots = 10\n";
+print $conf "max_wal_senders = 10\n";
+print $conf "wal_level = replica\n";
+close $conf;
+$node->restart;
+
+# Now that we have a server that supports replication commands, test whether
+# certain invalid compression commands fail on the client side with client-side
+# compression and on the server side with server-side compression.
+SKIP:
+{
+ skip "postgres was not built with ZLIB support", 6
+ if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+ my $client_fails = 'pg_basebackup: error: ';
+ my $server_fails =
+ 'pg_basebackup: error: could not initiate base backup: ERROR: ';
+ my @compression_failure_tests = (
+ [
+ 'extrasquishy',
+ 'unrecognized compression algorithm: "extrasquishy"',
+ 'failure on invalid compression algorithm'
+ ],
+ [
+ 'gzip:',
+ 'invalid compression specification: found empty string where a compression option was expected',
+ 'failure on empty compression options list'
+ ],
+ [
+ 'gzip:thunk',
+ 'invalid compression specification: unrecognized compression option: "thunk"',
+ 'failure on unknown compression option'
+ ],
+ [
+ 'gzip:level',
+ 'invalid compression specification: compression option "level" requires a value',
+ 'failure on missing compression level'
+ ],
+ [
+ 'gzip:level=',
+ 'invalid compression specification: value for compression option "level" must be an integer',
+ 'failure on empty compression level'
+ ],
+ [
+ 'gzip:level=high',
+ 'invalid compression specification: value for compression option "level" must be an integer',
+ 'failure on non-numeric compression level'
+ ],
+ [
+ 'gzip:level=236',
+ 'invalid compression specification: compression algorithm "gzip" expects a compression level between 1 and 9',
+ 'failure on out-of-range compression level'
+ ],
+ [
+ 'gzip:level=9,',
+ 'invalid compression specification: found empty string where a compression option was expected',
+ 'failure on extra, empty compression option'
+ ],
+ [
+ 'gzip:workers=3',
+ 'invalid compression specification: compression algorithm "gzip" does not accept a worker count',
+ 'failure on worker count for gzip'
+ ],
+ [
+ 'gzip:long',
+ 'invalid compression specification: compression algorithm "gzip" does not support long-distance mode',
+ 'failure on long mode for gzip'
+ ],);
+
+ for my $cft (@compression_failure_tests)
+ {
+ my $cfail = quotemeta($client_fails . $cft->[1]);
+ my $sfail = quotemeta($server_fails . $cft->[1]);
+ $node->command_fails_like(
+ [
+ 'pg_basebackup', '-D',
+ "$tempdir/backup", '--compress',
+ $cft->[0]
+ ],
+ qr/$cfail/,
+ 'client ' . $cft->[2]);
+ $node->command_fails_like(
+ [
+ 'pg_basebackup', '-D',
+ "$tempdir/backup", '--compress',
+ 'server-' . $cft->[0]
+ ],
+ qr/$sfail/,
+ 'server ' . $cft->[2]);
+ }
+}
+
+# Write some files to test that they are not copied.
+foreach my $filename (
+ qw(backup_label tablespace_map postgresql.auto.conf.tmp
+ current_logfiles.tmp global/pg_internal.init.123))
+{
+ open my $file, '>>', "$pgdata/$filename";
+ print $file "DONOTCOPY";
+ close $file;
+}
+
+# Connect to a database to create global/pg_internal.init. If this is removed
+# the test to ensure global/pg_internal.init is not copied will return a false
+# positive.
+$node->safe_psql('postgres', 'SELECT 1;');
+
+# Create an unlogged table to test that forks other than init are not copied.
+$node->safe_psql('postgres', 'CREATE UNLOGGED TABLE base_unlogged (id int)');
+
+my $baseUnloggedPath = $node->safe_psql('postgres',
+ q{select pg_relation_filepath('base_unlogged')});
+
+# Make sure main and init forks exist
+ok(-f "$pgdata/${baseUnloggedPath}_init", 'unlogged init fork in base');
+ok(-f "$pgdata/$baseUnloggedPath", 'unlogged main fork in base');
+
+# Create files that look like temporary relations to ensure they are ignored.
+my $postgresOid = $node->safe_psql('postgres',
+ q{select oid from pg_database where datname = 'postgres'});
+
+my @tempRelationFiles =
+ qw(t999_999 t9999_999.1 t999_9999_vm t99999_99999_vm.1);
+
+foreach my $filename (@tempRelationFiles)
+{
+ append_to_file("$pgdata/base/$postgresOid/$filename", 'TEMP_RELATION');
+}
+
+# Run base backup.
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup", '-X', 'none' ],
+ 'pg_basebackup runs');
+ok(-f "$tempdir/backup/PG_VERSION", 'backup was created');
+ok(-f "$tempdir/backup/backup_manifest", 'backup manifest included');
+
+# Permissions on backup should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive("$tempdir/backup", 0700, 0600),
+ "check backup dir permissions");
+}
+
+# Only archive_status directory should be copied in pg_wal/.
+is_deeply(
+ [ sort(slurp_dir("$tempdir/backup/pg_wal/")) ],
+ [ sort qw(. .. archive_status) ],
+ 'no WAL files copied');
+
+# Contents of these directories should not be copied.
+foreach my $dirname (
+ qw(pg_dynshmem pg_notify pg_replslot pg_serial pg_snapshots pg_stat_tmp pg_subtrans)
+ )
+{
+ is_deeply(
+ [ sort(slurp_dir("$tempdir/backup/$dirname/")) ],
+ [ sort qw(. ..) ],
+ "contents of $dirname/ not copied");
+}
+
+# These files should not be copied.
+foreach my $filename (
+ qw(postgresql.auto.conf.tmp postmaster.opts postmaster.pid tablespace_map current_logfiles.tmp
+ global/pg_internal.init global/pg_internal.init.123))
+{
+ ok(!-f "$tempdir/backup/$filename", "$filename not copied");
+}
+
+# Unlogged relation forks other than init should not be copied
+ok(-f "$tempdir/backup/${baseUnloggedPath}_init",
+ 'unlogged init fork in backup');
+ok( !-f "$tempdir/backup/$baseUnloggedPath",
+ 'unlogged main fork not in backup');
+
+# Temp relations should not be copied.
+foreach my $filename (@tempRelationFiles)
+{
+ ok( !-f "$tempdir/backup/base/$postgresOid/$filename",
+ "base/$postgresOid/$filename not copied");
+}
+
+# Make sure existing backup_label was ignored.
+isnt(slurp_file("$tempdir/backup/backup_label"),
+ 'DONOTCOPY', 'existing backup_label not copied');
+rmtree("$tempdir/backup");
+
+# Now delete the bogus backup_label file since it will interfere with startup
+unlink("$pgdata/backup_label")
+ or BAIL_OUT("unable to unlink $pgdata/backup_label");
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup2", '--no-manifest',
+ '--waldir', "$tempdir/xlog2"
+ ],
+ 'separate xlog directory');
+ok(-f "$tempdir/backup2/PG_VERSION", 'backup was created');
+ok(!-f "$tempdir/backup2/backup_manifest", 'manifest was suppressed');
+ok(-d "$tempdir/xlog2/", 'xlog directory was created');
+rmtree("$tempdir/backup2");
+rmtree("$tempdir/xlog2");
+
+$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/tarbackup", '-Ft' ],
+ 'tar format');
+ok(-f "$tempdir/tarbackup/base.tar", 'backup tar was created');
+rmtree("$tempdir/tarbackup");
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ],
+ '-T with empty old directory fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=" ],
+ '-T with empty new directory fails');
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp',
+ "-T/foo=/bar=/baz"
+ ],
+ '-T with multiple = fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo=/bar" ],
+ '-T with old directory not absolute fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=bar" ],
+ '-T with new directory not absolute fails');
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ],
+ '-T with invalid format fails');
+
+my $superlongname = "superlongname_" . ("x" x 100);
+# Tar format doesn't support filenames longer than 100 bytes.
+SKIP:
+{
+ my $superlongpath = "$pgdata/$superlongname";
+
+ skip "File path too long", 1
+ if $windows_os && length($superlongpath) > 255;
+
+ open my $file, '>', "$superlongpath"
+ or die "unable to create file $superlongpath";
+ close $file;
+ $node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l1", '-Ft' ],
+ 'pg_basebackup tar with long name fails');
+ unlink "$superlongpath";
+}
+
+# The following tests are for symlinks.
+
+# Move pg_replslot out of $pgdata and create a symlink to it.
+$node->stop;
+
+# Set umask so test directories and files are created with group permissions
+umask(0027);
+
+# Enable group permissions on PGDATA
+chmod_recursive("$pgdata", 0750, 0640);
+
+# Create a temporary directory in the system location.
+my $sys_tempdir = PostgreSQL::Test::Utils::tempdir_short;
+
+# On Windows use the short location to avoid path length issues.
+# Elsewhere use $tempdir to avoid file system boundary issues with moving.
+my $tmploc = $windows_os ? $sys_tempdir : $tempdir;
+
+rename("$pgdata/pg_replslot", "$tmploc/pg_replslot")
+ or BAIL_OUT "could not move $pgdata/pg_replslot";
+dir_symlink("$tmploc/pg_replslot", "$pgdata/pg_replslot")
+ or BAIL_OUT "could not symlink to $pgdata/pg_replslot";
+
+$node->start;
+
+# Test backup of a tablespace using tar format.
+# Symlink the system located tempdir to our physical temp location.
+# That way we can use shorter names for the tablespace directories,
+# which hopefully won't run afoul of the 99 character length limit.
+my $real_sys_tempdir = "$sys_tempdir/tempdir";
+dir_symlink "$tempdir", $real_sys_tempdir;
+
+mkdir "$tempdir/tblspc1";
+my $realTsDir = "$real_sys_tempdir/tblspc1";
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE tblspc1 LOCATION '$realTsDir';");
+$node->safe_psql('postgres',
+ "CREATE TABLE test1 (a int) TABLESPACE tblspc1;"
+ . "INSERT INTO test1 VALUES (1234);");
+$node->backup('tarbackup2', backup_options => ['-Ft']);
+# empty test1, just so that it's different from the to-be-restored data
+$node->safe_psql('postgres', "TRUNCATE TABLE test1;");
+
+# basic checks on the output
+my $backupdir = $node->backup_dir . '/tarbackup2';
+ok(-f "$backupdir/base.tar", 'backup tar was created');
+ok(-f "$backupdir/pg_wal.tar", 'WAL tar was created');
+my @tblspc_tars = glob "$backupdir/[0-9]*.tar";
+is(scalar(@tblspc_tars), 1, 'one tablespace tar was created');
+
+# Try to verify the tar-format backup by restoring it.
+# For this, we use the tar program identified by configure.
+SKIP:
+{
+ my $tar = $ENV{TAR};
+ # don't check for a working tar here, to accommodate various odd
+ # cases such as AIX. If tar doesn't work the init_from_backup below
+ # will fail.
+ skip "no tar program available", 1
+ if (!defined $tar || $tar eq '');
+
+ my $node2 = PostgreSQL::Test::Cluster->new('replica');
+
+ # Recover main data directory
+ $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar);
+
+ # Recover tablespace into a new directory (not where it was!)
+ my $repTsDir = "$tempdir/tblspc1replica";
+ my $realRepTsDir = "$real_sys_tempdir/tblspc1replica";
+ mkdir $repTsDir;
+ PostgreSQL::Test::Utils::system_or_bail($tar, 'xf', $tblspc_tars[0],
+ '-C', $repTsDir);
+
+ # Update tablespace map to point to new directory.
+ # XXX Ideally pg_basebackup would handle this.
+ $tblspc_tars[0] =~ m|/([0-9]*)\.tar$|;
+ my $tblspcoid = $1;
+ my $escapedRepTsDir = $realRepTsDir;
+ $escapedRepTsDir =~ s/\\/\\\\/g;
+ open my $mapfile, '>', $node2->data_dir . '/tablespace_map';
+ print $mapfile "$tblspcoid $escapedRepTsDir\n";
+ close $mapfile;
+
+ $node2->start;
+ my $result = $node2->safe_psql('postgres', 'SELECT * FROM test1');
+ is($result, '1234', "tablespace data restored from tar-format backup");
+ $node2->stop;
+}
+
+# Create an unlogged table to test that forks other than init are not copied.
+$node->safe_psql('postgres',
+ 'CREATE UNLOGGED TABLE tblspc1_unlogged (id int) TABLESPACE tblspc1;');
+
+my $tblspc1UnloggedPath = $node->safe_psql('postgres',
+ q{select pg_relation_filepath('tblspc1_unlogged')});
+
+# Make sure main and init forks exist
+ok( -f "$pgdata/${tblspc1UnloggedPath}_init",
+ 'unlogged init fork in tablespace');
+ok(-f "$pgdata/$tblspc1UnloggedPath", 'unlogged main fork in tablespace');
+
+# Create files that look like temporary relations to ensure they are ignored
+# in a tablespace.
+@tempRelationFiles = qw(t888_888 t888888_888888_vm.1);
+my $tblSpc1Id = basename(
+ dirname(
+ dirname(
+ $node->safe_psql(
+ 'postgres', q{select pg_relation_filepath('test1')}))));
+
+foreach my $filename (@tempRelationFiles)
+{
+ append_to_file(
+ "$real_sys_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename",
+ 'TEMP_RELATION');
+}
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup1", '-Fp' ],
+ 'plain format with tablespaces fails without tablespace mapping');
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup1", '-Fp',
+ "-T$realTsDir=$tempdir/tbackup/tblspc1",
+ ],
+ 'plain format with tablespaces succeeds with tablespace mapping');
+ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated');
+
+# This symlink check is not supported on Windows as -l
+# doesn't work with junctions
+SKIP:
+{
+ skip "symlink check not implemented on Windows", 1
+ if ($windows_os);
+ opendir(my $dh, "$pgdata/pg_tblspc") or die;
+ ok( ( grep {
+ -l "$tempdir/backup1/pg_tblspc/$_"
+ and readlink "$tempdir/backup1/pg_tblspc/$_" eq
+ "$tempdir/tbackup/tblspc1"
+ } readdir($dh)),
+ "tablespace symlink was updated");
+ closedir $dh;
+}
+
+# Group access should be enabled on all backup files
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive("$tempdir/backup1", 0750, 0640),
+ "check backup dir permissions");
+}
+
+# Unlogged relation forks other than init should not be copied
+my ($tblspc1UnloggedBackupPath) =
+ $tblspc1UnloggedPath =~ /[^\/]*\/[^\/]*\/[^\/]*$/g;
+
+ok(-f "$tempdir/tbackup/tblspc1/${tblspc1UnloggedBackupPath}_init",
+ 'unlogged init fork in tablespace backup');
+ok(!-f "$tempdir/tbackup/tblspc1/$tblspc1UnloggedBackupPath",
+ 'unlogged main fork not in tablespace backup');
+
+# Temp relations should not be copied.
+foreach my $filename (@tempRelationFiles)
+{
+ ok(!-f "$tempdir/tbackup/tblspc1/$tblSpc1Id/$postgresOid/$filename",
+ "[tblspc1]/$postgresOid/$filename not copied");
+
+ # Also remove temp relation files or tablespace drop will fail.
+ my $filepath =
+ "$real_sys_tempdir/tblspc1/$tblSpc1Id/$postgresOid/$filename";
+
+ unlink($filepath)
+ or BAIL_OUT("unable to unlink $filepath");
+}
+
+ok( -d "$tempdir/backup1/pg_replslot",
+ 'pg_replslot symlink copied as directory');
+rmtree("$tempdir/backup1");
+
+mkdir "$tempdir/tbl=spc2";
+$realTsDir = "$real_sys_tempdir/tbl=spc2";
+$node->safe_psql('postgres', "DROP TABLE test1;");
+$node->safe_psql('postgres', "DROP TABLE tblspc1_unlogged;");
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc1;");
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE tblspc2 LOCATION '$realTsDir';");
+$realTsDir =~ s/=/\\=/;
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup3", '-Fp',
+ "-T$realTsDir=$tempdir/tbackup/tbl\\=spc2",
+ ],
+ 'mapping tablespace with = sign in path');
+ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated');
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc2;");
+rmtree("$tempdir/backup3");
+
+mkdir "$tempdir/$superlongname";
+$realTsDir = "$real_sys_tempdir/$superlongname";
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE tblspc3 LOCATION '$realTsDir';");
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l3", '-Ft' ],
+ 'pg_basebackup tar with long symlink target');
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc3;");
+rmtree("$tempdir/tarbackup_l3");
+
+$node->command_ok([ @pg_basebackup_defs, '-D', "$tempdir/backupR", '-R' ],
+ 'pg_basebackup -R runs');
+ok(-f "$tempdir/backupR/postgresql.auto.conf", 'postgresql.auto.conf exists');
+ok(-f "$tempdir/backupR/standby.signal", 'standby.signal was created');
+my $recovery_conf = slurp_file "$tempdir/backupR/postgresql.auto.conf";
+rmtree("$tempdir/backupR");
+
+my $port = $node->port;
+like(
+ $recovery_conf,
+ qr/^primary_conninfo = '.*port=$port.*'\n/m,
+ 'postgresql.auto.conf sets primary_conninfo');
+
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxd" ],
+ 'pg_basebackup runs in default xlog mode');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxd/pg_wal")),
+ 'WAL files copied');
+rmtree("$tempdir/backupxd");
+
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxf", '-X', 'fetch' ],
+ 'pg_basebackup -X fetch runs');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_wal")),
+ 'WAL files copied');
+rmtree("$tempdir/backupxf");
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxs", '-X', 'stream' ],
+ 'pg_basebackup -X stream runs');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxs/pg_wal")),
+ 'WAL files copied');
+rmtree("$tempdir/backupxs");
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backupxst", '-X', 'stream',
+ '-Ft'
+ ],
+ 'pg_basebackup -X stream runs in tar mode');
+ok(-f "$tempdir/backupxst/pg_wal.tar", "tar file was created");
+rmtree("$tempdir/backupxst");
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupnoslot", '-X',
+ 'stream', '--no-slot'
+ ],
+ 'pg_basebackup -X stream runs with --no-slot');
+rmtree("$tempdir/backupnoslot");
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxf", '-X', 'fetch' ],
+ 'pg_basebackup -X fetch runs');
+
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'blackhole' ],
+ qr/WAL cannot be streamed when a backup target is specified/,
+ 'backup target requires -X');
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'stream' ],
+ qr/WAL cannot be streamed when a backup target is specified/,
+ 'backup target requires -X other than -X stream');
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'bogus', '-X', 'none' ],
+ qr/unrecognized target/,
+ 'backup target unrecognized');
+$node->command_fails_like(
+ [
+ @pg_basebackup_defs, '--target', 'blackhole', '-X',
+ 'none', '-D', "$tempdir/blackhole"
+ ],
+ qr/cannot specify both output directory and backup target/,
+ 'backup target and output directory');
+$node->command_fails_like(
+ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none', '-Ft' ],
+ qr/cannot specify both format and backup target/,
+ 'backup target and output directory');
+$node->command_ok(
+ [ @pg_basebackup_defs, '--target', 'blackhole', '-X', 'none' ],
+ 'backup target blackhole');
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '--target',
+ "server:$tempdir/backuponserver", '-X',
+ 'none'
+ ],
+ 'backup target server');
+ok(-f "$tempdir/backuponserver/base.tar", 'backup tar was created');
+rmtree("$tempdir/backuponserver");
+
+$node->command_ok(
+ [qw(createuser --replication --role=pg_write_server_files backupuser)],
+ 'create backup user');
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-U', 'backupuser', '--target',
+ "server:$tempdir/backuponserver",
+ '-X', 'none'
+ ],
+ 'backup target server');
+ok( -f "$tempdir/backuponserver/base.tar",
+ 'backup tar was created as non-superuser');
+rmtree("$tempdir/backuponserver");
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_sl_fail", '-X',
+ 'stream', '-S',
+ 'slot0'
+ ],
+ 'pg_basebackup fails with nonexistent replication slot');
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C' ],
+ 'pg_basebackup -C fails without slot name');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot", '-C',
+ '-S', 'slot0',
+ '--no-slot'
+ ],
+ 'pg_basebackup fails with -C -S --no-slot');
+$node->command_fails_like(
+ [
+ @pg_basebackup_defs, '--target', 'blackhole', '-D',
+ "$tempdir/blackhole"
+ ],
+ qr/cannot specify both output directory and backup target/,
+ 'backup target and output directory');
+
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backuptr/co", '-X', 'none' ],
+ 'pg_basebackup -X fetch runs');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_sl_fail", '-X',
+ 'stream', '-S',
+ 'slot0'
+ ],
+ 'pg_basebackup fails with nonexistent replication slot');
+
+$node->command_fails(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backupxs_slot", '-C' ],
+ 'pg_basebackup -C fails without slot name');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot", '-C',
+ '-S', 'slot0',
+ '--no-slot'
+ ],
+ 'pg_basebackup fails with -C -S --no-slot');
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot", '-C',
+ '-S', 'slot0'
+ ],
+ 'pg_basebackup -C runs');
+rmtree("$tempdir/backupxs_slot");
+
+is( $node->safe_psql(
+ 'postgres',
+ q{SELECT slot_name FROM pg_replication_slots WHERE slot_name = 'slot0'}
+ ),
+ 'slot0',
+ 'replication slot was created');
+isnt(
+ $node->safe_psql(
+ 'postgres',
+ q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot0'}
+ ),
+ '',
+ 'restart LSN of new slot is not null');
+
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backupxs_slot1", '-C',
+ '-S', 'slot0'
+ ],
+ 'pg_basebackup fails with -C -S and a previously existing slot');
+
+$node->safe_psql('postgres',
+ q{SELECT * FROM pg_create_physical_replication_slot('slot1')});
+my $lsn = $node->safe_psql('postgres',
+ q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}
+);
+is($lsn, '', 'restart LSN of new slot is null');
+$node->command_fails(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/fail", '-S',
+ 'slot1', '-X', 'none'
+ ],
+ 'pg_basebackup with replication slot fails without WAL streaming');
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backupxs_sl", '-X',
+ 'stream', '-S', 'slot1'
+ ],
+ 'pg_basebackup -X stream with replication slot runs');
+$lsn = $node->safe_psql('postgres',
+ q{SELECT restart_lsn FROM pg_replication_slots WHERE slot_name = 'slot1'}
+);
+like($lsn, qr!^0/[0-9A-Z]{7,8}$!, 'restart LSN of slot has advanced');
+rmtree("$tempdir/backupxs_sl");
+
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D', "$tempdir/backupxs_sl_R", '-X',
+ 'stream', '-S', 'slot1', '-R',
+ ],
+ 'pg_basebackup with replication slot and -R runs');
+like(
+ slurp_file("$tempdir/backupxs_sl_R/postgresql.auto.conf"),
+ qr/^primary_slot_name = 'slot1'\n/m,
+ 'recovery conf file sets primary_slot_name');
+
+my $checksum = $node->safe_psql('postgres', 'SHOW data_checksums;');
+is($checksum, 'on', 'checksums are enabled');
+rmtree("$tempdir/backupxs_sl_R");
+
+# create tables to corrupt and get their relfilenodes
+my $file_corrupt1 = $node->safe_psql('postgres',
+ q{CREATE TABLE corrupt1 AS SELECT a FROM generate_series(1,10000) AS a; ALTER TABLE corrupt1 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt1')}
+);
+my $file_corrupt2 = $node->safe_psql('postgres',
+ q{CREATE TABLE corrupt2 AS SELECT b FROM generate_series(1,2) AS b; ALTER TABLE corrupt2 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt2')}
+);
+
+# get block size for corruption steps
+my $block_size = $node->safe_psql('postgres', 'SHOW block_size;');
+
+# induce corruption
+$node->stop;
+$node->corrupt_page_checksum($file_corrupt1, 0);
+$node->start;
+
+$node->command_checks_all(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt" ],
+ 1,
+ [qr{^$}],
+ [qr/^WARNING.*checksum verification failed/s],
+ 'pg_basebackup reports checksum mismatch');
+rmtree("$tempdir/backup_corrupt");
+
+# induce further corruption in 5 more blocks
+$node->stop;
+for my $i (1 .. 5)
+{
+ $node->corrupt_page_checksum($file_corrupt1, $i * $block_size);
+}
+$node->start;
+
+$node->command_checks_all(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt2" ],
+ 1,
+ [qr{^$}],
+ [qr/^WARNING.*further.*failures.*will.not.be.reported/s],
+ 'pg_basebackup does not report more than 5 checksum mismatches');
+rmtree("$tempdir/backup_corrupt2");
+
+# induce corruption in a second file
+$node->stop;
+$node->corrupt_page_checksum($file_corrupt2, 0);
+$node->start;
+
+$node->command_checks_all(
+ [ @pg_basebackup_defs, '-D', "$tempdir/backup_corrupt3" ],
+ 1,
+ [qr{^$}],
+ [qr/^WARNING.*7 total checksum verification failures/s],
+ 'pg_basebackup correctly report the total number of checksum mismatches');
+rmtree("$tempdir/backup_corrupt3");
+
+# do not verify checksums, should return ok
+$node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_corrupt4", '--no-verify-checksums',
+ ],
+ 'pg_basebackup with -k does not report checksum mismatch');
+rmtree("$tempdir/backup_corrupt4");
+
+$node->safe_psql('postgres', "DROP TABLE corrupt1;");
+$node->safe_psql('postgres', "DROP TABLE corrupt2;");
+
+note "Testing pg_basebackup with compression methods";
+
+# Check ZLIB compression if available.
+SKIP:
+{
+ skip "postgres was not built with ZLIB support", 7
+ if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+ $node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_gzip", '--compress',
+ '1', '--format',
+ 't'
+ ],
+ 'pg_basebackup with --compress');
+ $node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_gzip2", '--gzip',
+ '--format', 't'
+ ],
+ 'pg_basebackup with --gzip');
+ $node->command_ok(
+ [
+ @pg_basebackup_defs, '-D',
+ "$tempdir/backup_gzip3", '--compress',
+ 'gzip:1', '--format',
+ 't'
+ ],
+ 'pg_basebackup with --compress=gzip:1');
+
+ # Verify that the stored files are generated with their expected
+ # names.
+ my @zlib_files = glob "$tempdir/backup_gzip/*.tar.gz";
+ is(scalar(@zlib_files), 2,
+ "two files created with --compress=NUM (base.tar.gz and pg_wal.tar.gz)"
+ );
+ my @zlib_files2 = glob "$tempdir/backup_gzip2/*.tar.gz";
+ is(scalar(@zlib_files2), 2,
+ "two files created with --gzip (base.tar.gz and pg_wal.tar.gz)");
+ my @zlib_files3 = glob "$tempdir/backup_gzip3/*.tar.gz";
+ is(scalar(@zlib_files3), 2,
+ "two files created with --compress=gzip:NUM (base.tar.gz and pg_wal.tar.gz)"
+ );
+
+ # Check the integrity of the files generated.
+ my $gzip = $ENV{GZIP_PROGRAM};
+ skip "program gzip is not found in your system", 1
+ if (!defined $gzip
+ || $gzip eq '');
+
+ my $gzip_is_valid =
+ system_log($gzip, '--test', @zlib_files, @zlib_files2, @zlib_files3);
+ is($gzip_is_valid, 0, "gzip verified the integrity of compressed data");
+ rmtree("$tempdir/backup_gzip");
+ rmtree("$tempdir/backup_gzip2");
+ rmtree("$tempdir/backup_gzip3");
+}
+
+# Test background stream process terminating before the basebackup has
+# finished, the main process should exit gracefully with an error message on
+# stderr. To reduce the risk of timing related issues we invoke the base
+# backup with rate throttling enabled.
+$node->safe_psql('postgres',
+ q{CREATE TABLE t AS SELECT a FROM generate_series(1,10000) AS a;});
+
+my $sigchld_bb_timeout =
+ IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default);
+my ($sigchld_bb_stdin, $sigchld_bb_stdout, $sigchld_bb_stderr) = ('', '', '');
+my $sigchld_bb = IPC::Run::start(
+ [
+ @pg_basebackup_defs, '--wal-method=stream',
+ '-D', "$tempdir/sigchld",
+ '--max-rate=32', '-d',
+ $node->connstr('postgres')
+ ],
+ '<',
+ \$sigchld_bb_stdin,
+ '>',
+ \$sigchld_bb_stdout,
+ '2>',
+ \$sigchld_bb_stderr,
+ $sigchld_bb_timeout);
+
+is( $node->poll_query_until(
+ 'postgres',
+ "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE "
+ . "application_name = '010_pg_basebackup.pl' AND wait_event = 'WalSenderMain' "
+ . "AND backend_type = 'walsender' AND query ~ 'START_REPLICATION'"),
+ "1",
+ "Walsender killed");
+
+ok( pump_until(
+ $sigchld_bb, $sigchld_bb_timeout,
+ \$sigchld_bb_stderr, qr/background process terminated unexpectedly/),
+ 'background process exit message');
+$sigchld_bb->finish();
+
+# Test that we can back up an in-place tablespace
+$node->safe_psql('postgres',
+ "SET allow_in_place_tablespaces = on; CREATE TABLESPACE tblspc2 LOCATION '';"
+);
+$node->safe_psql('postgres',
+ "CREATE TABLE test2 (a int) TABLESPACE tblspc2;"
+ . "INSERT INTO test2 VALUES (1234);");
+my $tblspc_oid = $node->safe_psql('postgres',
+ "SELECT oid FROM pg_tablespace WHERE spcname = 'tblspc2';");
+$node->backup('backup3');
+$node->safe_psql('postgres', "DROP TABLE test2;");
+$node->safe_psql('postgres', "DROP TABLESPACE tblspc2;");
+
+# check that the in-place tablespace exists in the backup
+$backupdir = $node->backup_dir . '/backup3';
+my @dst_tblspc = glob "$backupdir/pg_tblspc/$tblspc_oid/PG_*";
+is(@dst_tblspc, 1, 'tblspc directory copied');
+
+done_testing();
diff --git a/src/bin/pg_basebackup/t/011_in_place_tablespace.pl b/src/bin/pg_basebackup/t/011_in_place_tablespace.pl
new file mode 100644
index 0000000..d58696e
--- /dev/null
+++ b/src/bin/pg_basebackup/t/011_in_place_tablespace.pl
@@ -0,0 +1,40 @@
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+# For nearly all pg_basebackup invocations some options should be specified,
+# to keep test times reasonable. Using @pg_basebackup_defs as the first
+# element of the array passed to IPC::Run interpolate the array (as it is
+# not a reference to an array)...
+my @pg_basebackup_defs = ('pg_basebackup', '--no-sync', '-cfast');
+
+# Set up an instance.
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init('allows_streaming' => 1);
+$node->start();
+
+# Create an in-place tablespace.
+$node->safe_psql('postgres', <<EOM);
+SET allow_in_place_tablespaces = on;
+CREATE TABLESPACE inplace LOCATION '';
+EOM
+
+# Back it up.
+my $backupdir = $tempdir . '/backup';
+$node->command_ok(
+ [ @pg_basebackup_defs, '-D', $backupdir, '-Ft', '-X', 'none' ],
+ 'pg_basebackup runs');
+
+# Make sure we got base.tar and one tablespace.
+ok(-f "$backupdir/base.tar", 'backup tar was created');
+my @tblspc_tars = glob "$backupdir/[0-9]*.tar";
+is(scalar(@tblspc_tars), 1, 'one tablespace tar was created');
+
+# All good.
+done_testing();
diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl
new file mode 100644
index 0000000..374f090
--- /dev/null
+++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl
@@ -0,0 +1,326 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+program_help_ok('pg_receivewal');
+program_version_ok('pg_receivewal');
+program_options_handling_ok('pg_receivewal');
+
+# Set umask so test directories and files are created with default permissions
+umask(0077);
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1, extra => ['--wal-segsize=1']);
+$primary->start;
+
+my $stream_dir = $primary->basedir . '/archive_wal';
+mkdir($stream_dir);
+
+# Sanity checks for command line options.
+$primary->command_fails(['pg_receivewal'],
+ 'pg_receivewal needs target directory specified');
+$primary->command_fails(
+ [ 'pg_receivewal', '-D', $stream_dir, '--create-slot', '--drop-slot' ],
+ 'failure if both --create-slot and --drop-slot specified');
+$primary->command_fails(
+ [ 'pg_receivewal', '-D', $stream_dir, '--create-slot' ],
+ 'failure if --create-slot specified without --slot');
+$primary->command_fails(
+ [ 'pg_receivewal', '-D', $stream_dir, '--synchronous', '--no-sync' ],
+ 'failure if --synchronous specified with --no-sync');
+$primary->command_fails_like(
+ [ 'pg_receivewal', '-D', $stream_dir, '--compress', 'none:1', ],
+ qr/\Qpg_receivewal: error: invalid compression specification: compression algorithm "none" does not accept a compression level/,
+ 'failure if --compress none:N (where N > 0)');
+
+# Slot creation and drop
+my $slot_name = 'test';
+$primary->command_ok(
+ [ 'pg_receivewal', '--slot', $slot_name, '--create-slot' ],
+ 'creating a replication slot');
+my $slot = $primary->slot($slot_name);
+is($slot->{'slot_type'}, 'physical', 'physical replication slot was created');
+is($slot->{'restart_lsn'}, '', 'restart LSN of new slot is null');
+$primary->command_ok([ 'pg_receivewal', '--slot', $slot_name, '--drop-slot' ],
+ 'dropping a replication slot');
+is($primary->slot($slot_name)->{'slot_type'},
+ '', 'replication slot was removed');
+
+# Generate some WAL. Use --synchronous at the same time to add more
+# code coverage. Switch to the next segment first so that subsequent
+# restarts of pg_receivewal will see this segment as full..
+$primary->psql('postgres', 'CREATE TABLE test_table(x integer PRIMARY KEY);');
+$primary->psql('postgres', 'SELECT pg_switch_wal();');
+my $nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (1);');
+
+# Stream up to the given position. This is necessary to have a fixed
+# started point for the next commands done in this test, with or without
+# compression involved.
+$primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--synchronous', '--no-loop'
+ ],
+ 'streaming some WAL with --synchronous');
+
+# Verify that one partial file was generated and keep track of it
+my @partial_wals = glob "$stream_dir/*\.partial";
+is(scalar(@partial_wals), 1, "one partial WAL segment was created");
+
+note "Testing pg_receivewal with compression methods";
+
+# Check ZLIB compression if available.
+SKIP:
+{
+ skip "postgres was not built with ZLIB support", 5
+ if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+ # Generate more WAL worth one completed, compressed, segment.
+ $primary->psql('postgres', 'SELECT pg_switch_wal();');
+ $nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+ chomp($nextlsn);
+ $primary->psql('postgres', 'INSERT INTO test_table VALUES (2);');
+
+ $primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--compress', 'gzip:1',
+ '--no-loop'
+ ],
+ "streaming some WAL using ZLIB compression");
+
+ # Verify that the stored files are generated with their expected
+ # names.
+ my @zlib_wals = glob "$stream_dir/*.gz";
+ is(scalar(@zlib_wals), 1,
+ "one WAL segment compressed with ZLIB was created");
+ my @zlib_partial_wals = glob "$stream_dir/*.gz.partial";
+ is(scalar(@zlib_partial_wals),
+ 1, "one partial WAL segment compressed with ZLIB was created");
+
+ # Verify that the start streaming position is computed correctly by
+ # comparing it with the partial file generated previously. The name
+ # of the previous partial, now-completed WAL segment is updated, keeping
+ # its base number.
+ $partial_wals[0] =~ s/\.partial$/.gz/;
+ is($zlib_wals[0] eq $partial_wals[0],
+ 1, "one partial WAL segment is now completed");
+ # Update the list of partial wals with the current one.
+ @partial_wals = @zlib_partial_wals;
+
+ # Check the integrity of the completed segment, if gzip is a command
+ # available.
+ my $gzip = $ENV{GZIP_PROGRAM};
+ skip "program gzip is not found in your system", 1
+ if (!defined $gzip
+ || $gzip eq '');
+
+ my $gzip_is_valid = system_log($gzip, '--test', @zlib_wals);
+ is($gzip_is_valid, 0,
+ "gzip verified the integrity of compressed WAL segments");
+}
+
+# Check LZ4 compression if available
+SKIP:
+{
+ skip "postgres was not built with LZ4 support", 5
+ if (!check_pg_config("#define USE_LZ4 1"));
+
+ # Generate more WAL including one completed, compressed segment.
+ $primary->psql('postgres', 'SELECT pg_switch_wal();');
+ $nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+ chomp($nextlsn);
+ $primary->psql('postgres', 'INSERT INTO test_table VALUES (3);');
+
+ # Stream up to the given position.
+ $primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--no-loop', '--compress',
+ 'lz4'
+ ],
+ 'streaming some WAL using --compress=lz4');
+
+ # Verify that the stored files are generated with their expected
+ # names.
+ my @lz4_wals = glob "$stream_dir/*.lz4";
+ is(scalar(@lz4_wals), 1,
+ "one WAL segment compressed with LZ4 was created");
+ my @lz4_partial_wals = glob "$stream_dir/*.lz4.partial";
+ is(scalar(@lz4_partial_wals),
+ 1, "one partial WAL segment compressed with LZ4 was created");
+
+ # Verify that the start streaming position is computed correctly by
+ # comparing it with the partial file generated previously. The name
+ # of the previous partial, now-completed WAL segment is updated, keeping
+ # its base number.
+ $partial_wals[0] =~ s/(\.gz)?\.partial$/.lz4/;
+ is($lz4_wals[0] eq $partial_wals[0],
+ 1, "one partial WAL segment is now completed");
+ # Update the list of partial wals with the current one.
+ @partial_wals = @lz4_partial_wals;
+
+ # Check the integrity of the completed segment, if LZ4 is an available
+ # command.
+ my $lz4 = $ENV{LZ4};
+ skip "program lz4 is not found in your system", 1
+ if (!defined $lz4
+ || $lz4 eq '');
+
+ my $lz4_is_valid = system_log($lz4, '-t', @lz4_wals);
+ is($lz4_is_valid, 0,
+ "lz4 verified the integrity of compressed WAL segments");
+}
+
+# Verify that the start streaming position is computed and that the value is
+# correct regardless of whether any compression is available.
+$primary->psql('postgres', 'SELECT pg_switch_wal();');
+$nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (4);');
+$primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $stream_dir, '--verbose',
+ '--endpos', $nextlsn, '--no-loop'
+ ],
+ "streaming some WAL");
+
+$partial_wals[0] =~ s/(\.gz|\.lz4)?.partial//;
+ok(-e $partial_wals[0], "check that previously partial WAL is now complete");
+
+# Permissions on WAL files should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($stream_dir, 0700, 0600),
+ "check stream dir permissions");
+}
+
+note "Testing pg_receivewal with slot as starting streaming point";
+
+# When using a replication slot, archiving should be resumed from the slot's
+# restart LSN. Use a new archive location and new slot for this test.
+my $slot_dir = $primary->basedir . '/slot_wal';
+mkdir($slot_dir);
+$slot_name = 'archive_slot';
+
+# Setup the slot, reserving WAL at creation (corresponding to the
+# last redo LSN here, actually, so use a checkpoint to reduce the
+# number of segments archived).
+$primary->psql('postgres', 'checkpoint;');
+$primary->psql('postgres',
+ "SELECT pg_create_physical_replication_slot('$slot_name', true);");
+
+# Get the segment name associated with the slot's restart LSN, that should
+# be archived.
+my $walfile_streamed = $primary->safe_psql(
+ 'postgres',
+ "SELECT pg_walfile_name(restart_lsn)
+ FROM pg_replication_slots
+ WHERE slot_name = '$slot_name';");
+
+# Switch to a new segment, to make sure that the segment retained by the
+# slot is still streamed. This may not be necessary, but play it safe.
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (5);');
+$primary->psql('postgres', 'SELECT pg_switch_wal();');
+$nextlsn =
+ $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+
+# Add a bit more data to accelerate the end of the next pg_receivewal
+# commands.
+$primary->psql('postgres', 'INSERT INTO test_table VALUES (6);');
+
+# Check case where the slot does not exist.
+$primary->command_fails_like(
+ [
+ 'pg_receivewal', '-D', $slot_dir, '--slot',
+ 'nonexistentslot', '-n', '--no-sync', '--verbose',
+ '--endpos', $nextlsn
+ ],
+ qr/pg_receivewal: error: replication slot "nonexistentslot" does not exist/,
+ 'pg_receivewal fails with non-existing slot');
+$primary->command_ok(
+ [
+ 'pg_receivewal', '-D', $slot_dir, '--slot',
+ $slot_name, '-n', '--no-sync', '--verbose',
+ '--endpos', $nextlsn
+ ],
+ "WAL streamed from the slot's restart_lsn");
+ok(-e "$slot_dir/$walfile_streamed",
+ "WAL from the slot's restart_lsn has been archived");
+
+# Test timeline switch using a replication slot, requiring a promoted
+# standby.
+my $backup_name = "basebackup";
+$primary->backup($backup_name);
+my $standby = PostgreSQL::Test::Cluster->new("standby");
+$standby->init_from_backup($primary, $backup_name, has_streaming => 1);
+$standby->start;
+
+# Create a replication slot on this new standby
+my $archive_slot = "archive_slot";
+$standby->psql(
+ '',
+ "CREATE_REPLICATION_SLOT $archive_slot PHYSICAL (RESERVE_WAL)",
+ replication => 1);
+# Wait for standby catchup
+$primary->wait_for_catchup($standby);
+# Get a walfilename from before the promotion to make sure it is archived
+# after promotion
+my $standby_slot = $standby->slot($archive_slot);
+my $replication_slot_lsn = $standby_slot->{'restart_lsn'};
+
+# pg_walfile_name() is not supported while in recovery, so use the primary
+# to build the segment name. Both nodes are on the same timeline, so this
+# produces a segment name with the timeline we are switching from.
+my $walfile_before_promotion =
+ $primary->safe_psql('postgres',
+ "SELECT pg_walfile_name('$replication_slot_lsn');");
+# Everything is setup, promote the standby to trigger a timeline switch.
+$standby->promote;
+
+# Force a segment switch to make sure at least one full WAL is archived
+# on the new timeline.
+my $walfile_after_promotion = $standby->safe_psql('postgres',
+ "SELECT pg_walfile_name(pg_current_wal_insert_lsn());");
+$standby->psql('postgres', 'INSERT INTO test_table VALUES (7);');
+$standby->psql('postgres', 'SELECT pg_switch_wal();');
+$nextlsn =
+ $standby->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+chomp($nextlsn);
+# This speeds up the operation.
+$standby->psql('postgres', 'INSERT INTO test_table VALUES (8);');
+
+# Now try to resume from the slot after the promotion.
+my $timeline_dir = $primary->basedir . '/timeline_wal';
+mkdir($timeline_dir);
+
+$standby->command_ok(
+ [
+ 'pg_receivewal', '-D', $timeline_dir, '--verbose',
+ '--endpos', $nextlsn, '--slot', $archive_slot,
+ '--no-sync', '-n'
+ ],
+ "Stream some wal after promoting, resuming from the slot's position");
+ok(-e "$timeline_dir/$walfile_before_promotion",
+ "WAL segment $walfile_before_promotion archived after timeline jump");
+ok(-e "$timeline_dir/$walfile_after_promotion",
+ "WAL segment $walfile_after_promotion archived after timeline jump");
+ok(-e "$timeline_dir/00000002.history",
+ "timeline history file archived after timeline jump");
+
+done_testing();
diff --git a/src/bin/pg_basebackup/t/030_pg_recvlogical.pl b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl
new file mode 100644
index 0000000..62dca5b
--- /dev/null
+++ b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl
@@ -0,0 +1,113 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+program_help_ok('pg_recvlogical');
+program_version_ok('pg_recvlogical');
+program_options_handling_ok('pg_recvlogical');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+
+# Initialize node without replication settings
+$node->init(allows_streaming => 1, has_archiving => 1);
+$node->append_conf(
+ 'postgresql.conf', q{
+wal_level = 'logical'
+max_replication_slots = 4
+max_wal_senders = 4
+log_min_messages = 'debug1'
+log_error_verbosity = verbose
+max_prepared_transactions = 10
+});
+$node->dump_info;
+$node->start;
+
+$node->command_fails(['pg_recvlogical'], 'pg_recvlogical needs a slot name');
+$node->command_fails([ 'pg_recvlogical', '-S', 'test' ],
+ 'pg_recvlogical needs a database');
+$node->command_fails([ 'pg_recvlogical', '-S', 'test', '-d', 'postgres' ],
+ 'pg_recvlogical needs an action');
+$node->command_fails(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--start'
+ ],
+ 'no destination file');
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--create-slot'
+ ],
+ 'slot created');
+
+my $slot = $node->slot('test');
+isnt($slot->{'restart_lsn'}, '', 'restart lsn is defined for new slot');
+
+$node->psql('postgres', 'CREATE TABLE test_table(x integer)');
+$node->psql('postgres',
+ 'INSERT INTO test_table(x) SELECT y FROM generate_series(1, 10) a(y);');
+my $nextlsn =
+ $node->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn()');
+chomp($nextlsn);
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S', 'test', '-d', $node->connstr('postgres'),
+ '--start', '--endpos', "$nextlsn", '--no-loop', '-f', '-'
+ ],
+ 'replayed a transaction');
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--drop-slot'
+ ],
+ 'slot dropped');
+
+#test with two-phase option enabled
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--create-slot',
+ '--two-phase'
+ ],
+ 'slot with two-phase created');
+
+$slot = $node->slot('test');
+isnt($slot->{'restart_lsn'}, '', 'restart lsn is defined for new slot');
+
+$node->safe_psql('postgres',
+ "BEGIN; INSERT INTO test_table values (11); PREPARE TRANSACTION 'test'");
+$node->safe_psql('postgres', "COMMIT PREPARED 'test'");
+$nextlsn = $node->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn()');
+chomp($nextlsn);
+
+$node->command_fails(
+ [
+ 'pg_recvlogical', '-S',
+ 'test', '-d',
+ $node->connstr('postgres'), '--start',
+ '--endpos', "$nextlsn",
+ '--two-phase', '--no-loop',
+ '-f', '-'
+ ],
+ 'incorrect usage');
+
+$node->command_ok(
+ [
+ 'pg_recvlogical', '-S', 'test', '-d', $node->connstr('postgres'),
+ '--start', '--endpos', "$nextlsn", '--no-loop', '-f', '-'
+ ],
+ 'replayed a two-phase transaction');
+
+done_testing();
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c
new file mode 100644
index 0000000..376ddf7
--- /dev/null
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -0,0 +1,1383 @@
+/*-------------------------------------------------------------------------
+ *
+ * walmethods.c - implementations of different ways to write received wal
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/walmethods.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+#endif
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "pgtar.h"
+#include "receivelog.h"
+#include "streamutil.h"
+
+/* Size of zlib buffer for .tar.gz */
+#define ZLIB_OUT_SIZE 4096
+
+/* Size of LZ4 input chunk for .lz4 */
+#define LZ4_IN_SIZE 4096
+
+/*-------------------------------------------------------------------------
+ * WalDirectoryMethod - write wal to a directory looking like pg_wal
+ *-------------------------------------------------------------------------
+ */
+
+static Walfile *dir_open_for_write(WalWriteMethod *wwmethod,
+ const char *pathname,
+ const char *temp_suffix,
+ size_t pad_to_size);
+static int dir_close(Walfile *f, WalCloseMethod method);
+static bool dir_existsfile(WalWriteMethod *wwmethod, const char *pathname);
+static ssize_t dir_get_file_size(WalWriteMethod *wwmethod,
+ const char *pathname);
+static char *dir_get_file_name(WalWriteMethod *wwmethod,
+ const char *pathname, const char *temp_suffix);
+static ssize_t dir_write(Walfile *f, const void *buf, size_t count);
+static int dir_sync(Walfile *f);
+static bool dir_finish(WalWriteMethod *wwmethod);
+static void dir_free(WalWriteMethod *wwmethod);
+
+const WalWriteMethodOps WalDirectoryMethodOps = {
+ .open_for_write = dir_open_for_write,
+ .close = dir_close,
+ .existsfile = dir_existsfile,
+ .get_file_size = dir_get_file_size,
+ .get_file_name = dir_get_file_name,
+ .write = dir_write,
+ .sync = dir_sync,
+ .finish = dir_finish,
+ .free = dir_free
+};
+
+/*
+ * Global static data for this method
+ */
+typedef struct DirectoryMethodData
+{
+ WalWriteMethod base;
+ char *basedir;
+} DirectoryMethodData;
+
+/*
+ * Local file handle
+ */
+typedef struct DirectoryMethodFile
+{
+ Walfile base;
+ int fd;
+ char *fullpath;
+ char *temp_suffix;
+#ifdef HAVE_LIBZ
+ gzFile gzfp;
+#endif
+#ifdef USE_LZ4
+ LZ4F_compressionContext_t ctx;
+ size_t lz4bufsize;
+ void *lz4buf;
+#endif
+} DirectoryMethodFile;
+
+#define clear_error(wwmethod) \
+ ((wwmethod)->lasterrstring = NULL, (wwmethod)->lasterrno = 0)
+
+static char *
+dir_get_file_name(WalWriteMethod *wwmethod,
+ const char *pathname, const char *temp_suffix)
+{
+ char *filename = pg_malloc0(MAXPGPATH * sizeof(char));
+
+ snprintf(filename, MAXPGPATH, "%s%s%s",
+ pathname,
+ wwmethod->compression_algorithm == PG_COMPRESSION_GZIP ? ".gz" :
+ wwmethod->compression_algorithm == PG_COMPRESSION_LZ4 ? ".lz4" : "",
+ temp_suffix ? temp_suffix : "");
+
+ return filename;
+}
+
+static Walfile *
+dir_open_for_write(WalWriteMethod *wwmethod, const char *pathname,
+ const char *temp_suffix, size_t pad_to_size)
+{
+ DirectoryMethodData *dir_data = (DirectoryMethodData *) wwmethod;
+ char tmppath[MAXPGPATH];
+ char *filename;
+ int fd;
+ DirectoryMethodFile *f;
+#ifdef HAVE_LIBZ
+ gzFile gzfp = NULL;
+#endif
+#ifdef USE_LZ4
+ LZ4F_compressionContext_t ctx = NULL;
+ size_t lz4bufsize = 0;
+ void *lz4buf = NULL;
+#endif
+
+ clear_error(wwmethod);
+
+ filename = dir_get_file_name(wwmethod, pathname, temp_suffix);
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, filename);
+ pg_free(filename);
+
+ /*
+ * Open a file for non-compressed as well as compressed files. Tracking
+ * the file descriptor is important for dir_sync() method as gzflush()
+ * does not do any system calls to fsync() to make changes permanent on
+ * disk.
+ */
+ fd = open(tmppath, O_WRONLY | O_CREAT | PG_BINARY, pg_file_create_mode);
+ if (fd < 0)
+ {
+ wwmethod->lasterrno = errno;
+ return NULL;
+ }
+
+#ifdef HAVE_LIBZ
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ gzfp = gzdopen(fd, "wb");
+ if (gzfp == NULL)
+ {
+ wwmethod->lasterrno = errno;
+ close(fd);
+ return NULL;
+ }
+
+ if (gzsetparams(gzfp, wwmethod->compression_level,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ wwmethod->lasterrno = errno;
+ gzclose(gzfp);
+ return NULL;
+ }
+ }
+#endif
+#ifdef USE_LZ4
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ size_t ctx_out;
+ size_t header_size;
+ LZ4F_preferences_t prefs;
+
+ ctx_out = LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
+ if (LZ4F_isError(ctx_out))
+ {
+ wwmethod->lasterrstring = LZ4F_getErrorName(ctx_out);
+ close(fd);
+ return NULL;
+ }
+
+ lz4bufsize = LZ4F_compressBound(LZ4_IN_SIZE, NULL);
+ lz4buf = pg_malloc0(lz4bufsize);
+
+ /* assign the compression level, default is 0 */
+ memset(&prefs, 0, sizeof(prefs));
+ prefs.compressionLevel = wwmethod->compression_level;
+
+ /* add the header */
+ header_size = LZ4F_compressBegin(ctx, lz4buf, lz4bufsize, &prefs);
+ if (LZ4F_isError(header_size))
+ {
+ wwmethod->lasterrstring = LZ4F_getErrorName(header_size);
+ (void) LZ4F_freeCompressionContext(ctx);
+ pg_free(lz4buf);
+ close(fd);
+ return NULL;
+ }
+
+ errno = 0;
+ if (write(fd, lz4buf, header_size) != header_size)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ wwmethod->lasterrno = errno ? errno : ENOSPC;
+ (void) LZ4F_freeCompressionContext(ctx);
+ pg_free(lz4buf);
+ close(fd);
+ return NULL;
+ }
+ }
+#endif
+
+ /* Do pre-padding on non-compressed files */
+ if (pad_to_size && wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ ssize_t rc;
+
+ rc = pg_pwrite_zeros(fd, pad_to_size, 0);
+
+ if (rc < 0)
+ {
+ wwmethod->lasterrno = errno;
+ close(fd);
+ return NULL;
+ }
+
+ /*
+ * pg_pwrite() (called via pg_pwrite_zeros()) may have moved the file
+ * position, so reset it (see win32pwrite.c).
+ */
+ if (lseek(fd, 0, SEEK_SET) != 0)
+ {
+ wwmethod->lasterrno = errno;
+ close(fd);
+ return NULL;
+ }
+ }
+
+ /*
+ * fsync WAL file and containing directory, to ensure the file is
+ * persistently created and zeroed (if padded). That's particularly
+ * important when using synchronous mode, where the file is modified and
+ * fsynced in-place, without a directory fsync.
+ */
+ if (wwmethod->sync)
+ {
+ if (fsync_fname(tmppath, false) != 0 ||
+ fsync_parent_path(tmppath) != 0)
+ {
+ wwmethod->lasterrno = errno;
+#ifdef HAVE_LIBZ
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ gzclose(gzfp);
+ else
+#endif
+#ifdef USE_LZ4
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ (void) LZ4F_compressEnd(ctx, lz4buf, lz4bufsize, NULL);
+ (void) LZ4F_freeCompressionContext(ctx);
+ pg_free(lz4buf);
+ close(fd);
+ }
+ else
+#endif
+ close(fd);
+ return NULL;
+ }
+ }
+
+ f = pg_malloc0(sizeof(DirectoryMethodFile));
+#ifdef HAVE_LIBZ
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ f->gzfp = gzfp;
+#endif
+#ifdef USE_LZ4
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ f->ctx = ctx;
+ f->lz4buf = lz4buf;
+ f->lz4bufsize = lz4bufsize;
+ }
+#endif
+
+ f->base.wwmethod = wwmethod;
+ f->base.currpos = 0;
+ f->base.pathname = pg_strdup(pathname);
+ f->fd = fd;
+ f->fullpath = pg_strdup(tmppath);
+ if (temp_suffix)
+ f->temp_suffix = pg_strdup(temp_suffix);
+
+ return &f->base;
+}
+
+static ssize_t
+dir_write(Walfile *f, const void *buf, size_t count)
+{
+ ssize_t r;
+ DirectoryMethodFile *df = (DirectoryMethodFile *) f;
+
+ Assert(f != NULL);
+ clear_error(f->wwmethod);
+
+#ifdef HAVE_LIBZ
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ errno = 0;
+ r = (ssize_t) gzwrite(df->gzfp, buf, count);
+ if (r != count)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ }
+ }
+ else
+#endif
+#ifdef USE_LZ4
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ size_t chunk;
+ size_t remaining;
+ const void *inbuf = buf;
+
+ remaining = count;
+ while (remaining > 0)
+ {
+ size_t compressed;
+
+ if (remaining > LZ4_IN_SIZE)
+ chunk = LZ4_IN_SIZE;
+ else
+ chunk = remaining;
+
+ remaining -= chunk;
+ compressed = LZ4F_compressUpdate(df->ctx,
+ df->lz4buf, df->lz4bufsize,
+ inbuf, chunk,
+ NULL);
+
+ if (LZ4F_isError(compressed))
+ {
+ f->wwmethod->lasterrstring = LZ4F_getErrorName(compressed);
+ return -1;
+ }
+
+ errno = 0;
+ if (write(df->fd, df->lz4buf, compressed) != compressed)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+
+ inbuf = ((char *) inbuf) + chunk;
+ }
+
+ /* Our caller keeps track of the uncompressed size. */
+ r = (ssize_t) count;
+ }
+ else
+#endif
+ {
+ errno = 0;
+ r = write(df->fd, buf, count);
+ if (r != count)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ }
+ }
+ if (r > 0)
+ df->base.currpos += r;
+ return r;
+}
+
+static int
+dir_close(Walfile *f, WalCloseMethod method)
+{
+ int r;
+ DirectoryMethodFile *df = (DirectoryMethodFile *) f;
+ DirectoryMethodData *dir_data = (DirectoryMethodData *) f->wwmethod;
+ char tmppath[MAXPGPATH];
+ char tmppath2[MAXPGPATH];
+
+ Assert(f != NULL);
+ clear_error(f->wwmethod);
+
+#ifdef HAVE_LIBZ
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ errno = 0; /* in case gzclose() doesn't set it */
+ r = gzclose(df->gzfp);
+ }
+ else
+#endif
+#ifdef USE_LZ4
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ size_t compressed;
+
+ compressed = LZ4F_compressEnd(df->ctx,
+ df->lz4buf, df->lz4bufsize,
+ NULL);
+
+ if (LZ4F_isError(compressed))
+ {
+ f->wwmethod->lasterrstring = LZ4F_getErrorName(compressed);
+ return -1;
+ }
+
+ errno = 0;
+ if (write(df->fd, df->lz4buf, compressed) != compressed)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+
+ r = close(df->fd);
+ }
+ else
+#endif
+ r = close(df->fd);
+
+ if (r == 0)
+ {
+ /* Build path to the current version of the file */
+ if (method == CLOSE_NORMAL && df->temp_suffix)
+ {
+ char *filename;
+ char *filename2;
+
+ /*
+ * If we have a temp prefix, normal operation is to rename the
+ * file.
+ */
+ filename = dir_get_file_name(f->wwmethod, df->base.pathname,
+ df->temp_suffix);
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, filename);
+ pg_free(filename);
+
+ /* permanent name, so no need for the prefix */
+ filename2 = dir_get_file_name(f->wwmethod, df->base.pathname, NULL);
+ snprintf(tmppath2, sizeof(tmppath2), "%s/%s",
+ dir_data->basedir, filename2);
+ pg_free(filename2);
+ if (f->wwmethod->sync)
+ r = durable_rename(tmppath, tmppath2);
+ else
+ {
+ if (rename(tmppath, tmppath2) != 0)
+ {
+ pg_log_error("could not rename file \"%s\" to \"%s\": %m",
+ tmppath, tmppath2);
+ r = -1;
+ }
+ }
+ }
+ else if (method == CLOSE_UNLINK)
+ {
+ char *filename;
+
+ /* Unlink the file once it's closed */
+ filename = dir_get_file_name(f->wwmethod, df->base.pathname,
+ df->temp_suffix);
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, filename);
+ pg_free(filename);
+ r = unlink(tmppath);
+ }
+ else
+ {
+ /*
+ * Else either CLOSE_NORMAL and no temp suffix, or
+ * CLOSE_NO_RENAME. In this case, fsync the file and containing
+ * directory if sync mode is requested.
+ */
+ if (f->wwmethod->sync)
+ {
+ r = fsync_fname(df->fullpath, false);
+ if (r == 0)
+ r = fsync_parent_path(df->fullpath);
+ }
+ }
+ }
+
+ if (r != 0)
+ f->wwmethod->lasterrno = errno;
+
+#ifdef USE_LZ4
+ pg_free(df->lz4buf);
+ /* supports free on NULL */
+ LZ4F_freeCompressionContext(df->ctx);
+#endif
+
+ pg_free(df->base.pathname);
+ pg_free(df->fullpath);
+ pg_free(df->temp_suffix);
+ pg_free(df);
+
+ return r;
+}
+
+static int
+dir_sync(Walfile *f)
+{
+ int r;
+
+ Assert(f != NULL);
+ clear_error(f->wwmethod);
+
+ if (!f->wwmethod->sync)
+ return 0;
+
+#ifdef HAVE_LIBZ
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ if (gzflush(((DirectoryMethodFile *) f)->gzfp, Z_SYNC_FLUSH) != Z_OK)
+ {
+ f->wwmethod->lasterrno = errno;
+ return -1;
+ }
+ }
+#endif
+#ifdef USE_LZ4
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_LZ4)
+ {
+ DirectoryMethodFile *df = (DirectoryMethodFile *) f;
+ size_t compressed;
+
+ /* Flush any internal buffers */
+ compressed = LZ4F_flush(df->ctx, df->lz4buf, df->lz4bufsize, NULL);
+ if (LZ4F_isError(compressed))
+ {
+ f->wwmethod->lasterrstring = LZ4F_getErrorName(compressed);
+ return -1;
+ }
+
+ errno = 0;
+ if (write(df->fd, df->lz4buf, compressed) != compressed)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+ }
+#endif
+
+ r = fsync(((DirectoryMethodFile *) f)->fd);
+ if (r < 0)
+ f->wwmethod->lasterrno = errno;
+ return r;
+}
+
+static ssize_t
+dir_get_file_size(WalWriteMethod *wwmethod, const char *pathname)
+{
+ DirectoryMethodData *dir_data = (DirectoryMethodData *) wwmethod;
+ struct stat statbuf;
+ char tmppath[MAXPGPATH];
+
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, pathname);
+
+ if (stat(tmppath, &statbuf) != 0)
+ {
+ wwmethod->lasterrno = errno;
+ return -1;
+ }
+
+ return statbuf.st_size;
+}
+
+static bool
+dir_existsfile(WalWriteMethod *wwmethod, const char *pathname)
+{
+ DirectoryMethodData *dir_data = (DirectoryMethodData *) wwmethod;
+ char tmppath[MAXPGPATH];
+ int fd;
+
+ clear_error(wwmethod);
+
+ snprintf(tmppath, sizeof(tmppath), "%s/%s",
+ dir_data->basedir, pathname);
+
+ fd = open(tmppath, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ return false;
+ close(fd);
+ return true;
+}
+
+static bool
+dir_finish(WalWriteMethod *wwmethod)
+{
+ clear_error(wwmethod);
+
+ if (wwmethod->sync)
+ {
+ DirectoryMethodData *dir_data = (DirectoryMethodData *) wwmethod;
+
+ /*
+ * Files are fsynced when they are closed, but we need to fsync the
+ * directory entry here as well.
+ */
+ if (fsync_fname(dir_data->basedir, true) != 0)
+ {
+ wwmethod->lasterrno = errno;
+ return false;
+ }
+ }
+ return true;
+}
+
+static void
+dir_free(WalWriteMethod *wwmethod)
+{
+ DirectoryMethodData *dir_data = (DirectoryMethodData *) wwmethod;
+
+ pg_free(dir_data->basedir);
+ pg_free(wwmethod);
+}
+
+
+WalWriteMethod *
+CreateWalDirectoryMethod(const char *basedir,
+ pg_compress_algorithm compression_algorithm,
+ int compression_level, bool sync)
+{
+ DirectoryMethodData *wwmethod;
+
+ wwmethod = pg_malloc0(sizeof(DirectoryMethodData));
+ *((const WalWriteMethodOps **) &wwmethod->base.ops) =
+ &WalDirectoryMethodOps;
+ wwmethod->base.compression_algorithm = compression_algorithm;
+ wwmethod->base.compression_level = compression_level;
+ wwmethod->base.sync = sync;
+ clear_error(&wwmethod->base);
+ wwmethod->basedir = pg_strdup(basedir);
+
+ return &wwmethod->base;
+}
+
+
+/*-------------------------------------------------------------------------
+ * WalTarMethod - write wal to a tar file containing pg_wal contents
+ *-------------------------------------------------------------------------
+ */
+
+static Walfile *tar_open_for_write(WalWriteMethod *wwmethod,
+ const char *pathname,
+ const char *temp_suffix,
+ size_t pad_to_size);
+static int tar_close(Walfile *f, WalCloseMethod method);
+static bool tar_existsfile(WalWriteMethod *wwmethod, const char *pathname);
+static ssize_t tar_get_file_size(WalWriteMethod *wwmethod,
+ const char *pathname);
+static char *tar_get_file_name(WalWriteMethod *wwmethod,
+ const char *pathname, const char *temp_suffix);
+static ssize_t tar_write(Walfile *f, const void *buf, size_t count);
+static int tar_sync(Walfile *f);
+static bool tar_finish(WalWriteMethod *wwmethod);
+static void tar_free(WalWriteMethod *wwmethod);
+
+const WalWriteMethodOps WalTarMethodOps = {
+ .open_for_write = tar_open_for_write,
+ .close = tar_close,
+ .existsfile = tar_existsfile,
+ .get_file_size = tar_get_file_size,
+ .get_file_name = tar_get_file_name,
+ .write = tar_write,
+ .sync = tar_sync,
+ .finish = tar_finish,
+ .free = tar_free
+};
+
+typedef struct TarMethodFile
+{
+ Walfile base;
+ off_t ofs_start; /* Where does the *header* for this file start */
+ char header[TAR_BLOCK_SIZE];
+ size_t pad_to_size;
+} TarMethodFile;
+
+typedef struct TarMethodData
+{
+ WalWriteMethod base;
+ char *tarfilename;
+ int fd;
+ TarMethodFile *currentfile;
+#ifdef HAVE_LIBZ
+ z_streamp zp;
+ void *zlibOut;
+#endif
+} TarMethodData;
+
+#ifdef HAVE_LIBZ
+static bool
+tar_write_compressed_data(TarMethodData *tar_data, void *buf, size_t count,
+ bool flush)
+{
+ tar_data->zp->next_in = buf;
+ tar_data->zp->avail_in = count;
+
+ while (tar_data->zp->avail_in || flush)
+ {
+ int r;
+
+ r = deflate(tar_data->zp, flush ? Z_FINISH : Z_NO_FLUSH);
+ if (r == Z_STREAM_ERROR)
+ {
+ tar_data->base.lasterrstring = _("could not compress data");
+ return false;
+ }
+
+ if (tar_data->zp->avail_out < ZLIB_OUT_SIZE)
+ {
+ size_t len = ZLIB_OUT_SIZE - tar_data->zp->avail_out;
+
+ errno = 0;
+ if (write(tar_data->fd, tar_data->zlibOut, len) != len)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ tar_data->base.lasterrno = errno ? errno : ENOSPC;
+ return false;
+ }
+
+ tar_data->zp->next_out = tar_data->zlibOut;
+ tar_data->zp->avail_out = ZLIB_OUT_SIZE;
+ }
+
+ if (r == Z_STREAM_END)
+ break;
+ }
+
+ if (flush)
+ {
+ /* Reset the stream for writing */
+ if (deflateReset(tar_data->zp) != Z_OK)
+ {
+ tar_data->base.lasterrstring = _("could not reset compression stream");
+ return false;
+ }
+ }
+
+ return true;
+}
+#endif
+
+static ssize_t
+tar_write(Walfile *f, const void *buf, size_t count)
+{
+ TarMethodData *tar_data = (TarMethodData *) f->wwmethod;
+ ssize_t r;
+
+ Assert(f != NULL);
+ clear_error(f->wwmethod);
+
+ /* Tarfile will always be positioned at the end */
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ r = write(tar_data->fd, buf, count);
+ if (r != count)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+ f->currpos += r;
+ return r;
+ }
+#ifdef HAVE_LIBZ
+ else if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ if (!tar_write_compressed_data(tar_data, unconstify(void *, buf),
+ count, false))
+ return -1;
+ f->currpos += count;
+ return count;
+ }
+#endif
+ else
+ {
+ /* Can't happen - compression enabled with no method set */
+ f->wwmethod->lasterrno = ENOSYS;
+ return -1;
+ }
+}
+
+static bool
+tar_write_padding_data(TarMethodFile *f, size_t bytes)
+{
+ PGAlignedXLogBlock zerobuf;
+ size_t bytesleft = bytes;
+
+ memset(zerobuf.data, 0, XLOG_BLCKSZ);
+ while (bytesleft)
+ {
+ size_t bytestowrite = Min(bytesleft, XLOG_BLCKSZ);
+ ssize_t r = tar_write(&f->base, zerobuf.data, bytestowrite);
+
+ if (r < 0)
+ return false;
+ bytesleft -= r;
+ }
+
+ return true;
+}
+
+static char *
+tar_get_file_name(WalWriteMethod *wwmethod, const char *pathname,
+ const char *temp_suffix)
+{
+ char *filename = pg_malloc0(MAXPGPATH * sizeof(char));
+
+ snprintf(filename, MAXPGPATH, "%s%s",
+ pathname, temp_suffix ? temp_suffix : "");
+
+ return filename;
+}
+
+static Walfile *
+tar_open_for_write(WalWriteMethod *wwmethod, const char *pathname,
+ const char *temp_suffix, size_t pad_to_size)
+{
+ TarMethodData *tar_data = (TarMethodData *) wwmethod;
+ char *tmppath;
+
+ clear_error(wwmethod);
+
+ if (tar_data->fd < 0)
+ {
+ /*
+ * We open the tar file only when we first try to write to it.
+ */
+ tar_data->fd = open(tar_data->tarfilename,
+ O_WRONLY | O_CREAT | PG_BINARY,
+ pg_file_create_mode);
+ if (tar_data->fd < 0)
+ {
+ wwmethod->lasterrno = errno;
+ return NULL;
+ }
+
+#ifdef HAVE_LIBZ
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ tar_data->zp = (z_streamp) pg_malloc(sizeof(z_stream));
+ tar_data->zp->zalloc = Z_NULL;
+ tar_data->zp->zfree = Z_NULL;
+ tar_data->zp->opaque = Z_NULL;
+ tar_data->zp->next_out = tar_data->zlibOut;
+ tar_data->zp->avail_out = ZLIB_OUT_SIZE;
+
+ /*
+ * Initialize deflation library. Adding the magic value 16 to the
+ * default 15 for the windowBits parameter makes the output be
+ * gzip instead of zlib.
+ */
+ if (deflateInit2(tar_data->zp, wwmethod->compression_level,
+ Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ pg_free(tar_data->zp);
+ tar_data->zp = NULL;
+ wwmethod->lasterrstring =
+ _("could not initialize compression library");
+ return NULL;
+ }
+ }
+#endif
+
+ /* There's no tar header itself, the file starts with regular files */
+ }
+
+ if (tar_data->currentfile != NULL)
+ {
+ wwmethod->lasterrstring =
+ _("implementation error: tar files can't have more than one open file");
+ return NULL;
+ }
+
+ tar_data->currentfile = pg_malloc0(sizeof(TarMethodFile));
+ tar_data->currentfile->base.wwmethod = wwmethod;
+
+ tmppath = tar_get_file_name(wwmethod, pathname, temp_suffix);
+
+ /* Create a header with size set to 0 - we will fill out the size on close */
+ if (tarCreateHeader(tar_data->currentfile->header, tmppath, NULL, 0, S_IRUSR | S_IWUSR, 0, 0, time(NULL)) != TAR_OK)
+ {
+ pg_free(tar_data->currentfile);
+ pg_free(tmppath);
+ tar_data->currentfile = NULL;
+ wwmethod->lasterrstring = _("could not create tar header");
+ return NULL;
+ }
+
+ pg_free(tmppath);
+
+#ifdef HAVE_LIBZ
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Flush existing data */
+ if (!tar_write_compressed_data(tar_data, NULL, 0, true))
+ return NULL;
+
+ /* Turn off compression for header */
+ if (deflateParams(tar_data->zp, 0, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ wwmethod->lasterrstring =
+ _("could not change compression parameters");
+ return NULL;
+ }
+ }
+#endif
+
+ tar_data->currentfile->ofs_start = lseek(tar_data->fd, 0, SEEK_CUR);
+ if (tar_data->currentfile->ofs_start == -1)
+ {
+ wwmethod->lasterrno = errno;
+ pg_free(tar_data->currentfile);
+ tar_data->currentfile = NULL;
+ return NULL;
+ }
+ tar_data->currentfile->base.currpos = 0;
+
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ if (write(tar_data->fd, tar_data->currentfile->header,
+ TAR_BLOCK_SIZE) != TAR_BLOCK_SIZE)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ wwmethod->lasterrno = errno ? errno : ENOSPC;
+ pg_free(tar_data->currentfile);
+ tar_data->currentfile = NULL;
+ return NULL;
+ }
+ }
+#ifdef HAVE_LIBZ
+ else if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Write header through the zlib APIs but with no compression */
+ if (!tar_write_compressed_data(tar_data, tar_data->currentfile->header,
+ TAR_BLOCK_SIZE, true))
+ return NULL;
+
+ /* Re-enable compression for the rest of the file */
+ if (deflateParams(tar_data->zp, wwmethod->compression_level,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ wwmethod->lasterrstring = _("could not change compression parameters");
+ return NULL;
+ }
+ }
+#endif
+ else
+ {
+ /* not reachable */
+ Assert(false);
+ }
+
+ tar_data->currentfile->base.pathname = pg_strdup(pathname);
+
+ /*
+ * Uncompressed files are padded on creation, but for compression we can't
+ * do that
+ */
+ if (pad_to_size)
+ {
+ tar_data->currentfile->pad_to_size = pad_to_size;
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ /* Uncompressed, so pad now */
+ if (!tar_write_padding_data(tar_data->currentfile, pad_to_size))
+ return NULL;
+ /* Seek back to start */
+ if (lseek(tar_data->fd,
+ tar_data->currentfile->ofs_start + TAR_BLOCK_SIZE,
+ SEEK_SET) != tar_data->currentfile->ofs_start + TAR_BLOCK_SIZE)
+ {
+ wwmethod->lasterrno = errno;
+ return NULL;
+ }
+
+ tar_data->currentfile->base.currpos = 0;
+ }
+ }
+
+ return &tar_data->currentfile->base;
+}
+
+static ssize_t
+tar_get_file_size(WalWriteMethod *wwmethod, const char *pathname)
+{
+ clear_error(wwmethod);
+
+ /* Currently not used, so not supported */
+ wwmethod->lasterrno = ENOSYS;
+ return -1;
+}
+
+static int
+tar_sync(Walfile *f)
+{
+ TarMethodData *tar_data = (TarMethodData *) f->wwmethod;
+ int r;
+
+ Assert(f != NULL);
+ clear_error(f->wwmethod);
+
+ if (!f->wwmethod->sync)
+ return 0;
+
+ /*
+ * Always sync the whole tarfile, because that's all we can do. This makes
+ * no sense on compressed files, so just ignore those.
+ */
+ if (f->wwmethod->compression_algorithm != PG_COMPRESSION_NONE)
+ return 0;
+
+ r = fsync(tar_data->fd);
+ if (r < 0)
+ f->wwmethod->lasterrno = errno;
+ return r;
+}
+
+static int
+tar_close(Walfile *f, WalCloseMethod method)
+{
+ ssize_t filesize;
+ int padding;
+ TarMethodData *tar_data = (TarMethodData *) f->wwmethod;
+ TarMethodFile *tf = (TarMethodFile *) f;
+
+ Assert(f != NULL);
+ clear_error(f->wwmethod);
+
+ if (method == CLOSE_UNLINK)
+ {
+ if (f->wwmethod->compression_algorithm != PG_COMPRESSION_NONE)
+ {
+ f->wwmethod->lasterrstring = _("unlink not supported with compression");
+ return -1;
+ }
+
+ /*
+ * Unlink the file that we just wrote to the tar. We do this by
+ * truncating it to the start of the header. This is safe as we only
+ * allow writing of the very last file.
+ */
+ if (ftruncate(tar_data->fd, tf->ofs_start) != 0)
+ {
+ f->wwmethod->lasterrno = errno;
+ return -1;
+ }
+
+ pg_free(tf->base.pathname);
+ pg_free(tf);
+ tar_data->currentfile = NULL;
+
+ return 0;
+ }
+
+ /*
+ * Pad the file itself with zeroes if necessary. Note that this is
+ * different from the tar format padding -- this is the padding we asked
+ * for when the file was opened.
+ */
+ if (tf->pad_to_size)
+ {
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /*
+ * A compressed tarfile is padded on close since we cannot know
+ * the size of the compressed output until the end.
+ */
+ size_t sizeleft = tf->pad_to_size - tf->base.currpos;
+
+ if (sizeleft)
+ {
+ if (!tar_write_padding_data(tf, sizeleft))
+ return -1;
+ }
+ }
+ else
+ {
+ /*
+ * An uncompressed tarfile was padded on creation, so just adjust
+ * the current position as if we seeked to the end.
+ */
+ tf->base.currpos = tf->pad_to_size;
+ }
+ }
+
+ /*
+ * Get the size of the file, and pad out to a multiple of the tar block
+ * size.
+ */
+ filesize = f->currpos;
+ padding = tarPaddingBytesRequired(filesize);
+ if (padding)
+ {
+ char zerobuf[TAR_BLOCK_SIZE] = {0};
+
+ if (tar_write(f, zerobuf, padding) != padding)
+ return -1;
+ }
+
+
+#ifdef HAVE_LIBZ
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Flush the current buffer */
+ if (!tar_write_compressed_data(tar_data, NULL, 0, true))
+ return -1;
+ }
+#endif
+
+ /*
+ * Now go back and update the header with the correct filesize and
+ * possibly also renaming the file. We overwrite the entire current header
+ * when done, including the checksum.
+ */
+ print_tar_number(&(tf->header[124]), 12, filesize);
+
+ if (method == CLOSE_NORMAL)
+
+ /*
+ * We overwrite it with what it was before if we have no tempname,
+ * since we're going to write the buffer anyway.
+ */
+ strlcpy(&(tf->header[0]), tf->base.pathname, 100);
+
+ print_tar_number(&(tf->header[148]), 8, tarChecksum(((TarMethodFile *) f)->header));
+ if (lseek(tar_data->fd, tf->ofs_start, SEEK_SET) != ((TarMethodFile *) f)->ofs_start)
+ {
+ f->wwmethod->lasterrno = errno;
+ return -1;
+ }
+ if (f->wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ if (write(tar_data->fd, tf->header, TAR_BLOCK_SIZE) != TAR_BLOCK_SIZE)
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ f->wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return -1;
+ }
+ }
+#ifdef HAVE_LIBZ
+ else if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ /* Turn off compression */
+ if (deflateParams(tar_data->zp, 0, Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ f->wwmethod->lasterrstring = _("could not change compression parameters");
+ return -1;
+ }
+
+ /* Overwrite the header, assuming the size will be the same */
+ if (!tar_write_compressed_data(tar_data, tar_data->currentfile->header,
+ TAR_BLOCK_SIZE, true))
+ return -1;
+
+ /* Turn compression back on */
+ if (deflateParams(tar_data->zp, f->wwmethod->compression_level,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ {
+ f->wwmethod->lasterrstring = _("could not change compression parameters");
+ return -1;
+ }
+ }
+#endif
+ else
+ {
+ /* not reachable */
+ Assert(false);
+ }
+
+ /* Move file pointer back down to end, so we can write the next file */
+ if (lseek(tar_data->fd, 0, SEEK_END) < 0)
+ {
+ f->wwmethod->lasterrno = errno;
+ return -1;
+ }
+
+ /* Always fsync on close, so the padding gets fsynced */
+ if (tar_sync(f) < 0)
+ {
+ /* XXX this seems pretty bogus; why is only this case fatal? */
+ pg_fatal("could not fsync file \"%s\": %s",
+ tf->base.pathname, GetLastWalMethodError(f->wwmethod));
+ }
+
+ /* Clean up and done */
+ pg_free(tf->base.pathname);
+ pg_free(tf);
+ tar_data->currentfile = NULL;
+
+ return 0;
+}
+
+static bool
+tar_existsfile(WalWriteMethod *wwmethod, const char *pathname)
+{
+ clear_error(wwmethod);
+ /* We only deal with new tarfiles, so nothing externally created exists */
+ return false;
+}
+
+static bool
+tar_finish(WalWriteMethod *wwmethod)
+{
+ TarMethodData *tar_data = (TarMethodData *) wwmethod;
+ char zerobuf[1024] = {0};
+
+ clear_error(wwmethod);
+
+ if (tar_data->currentfile)
+ {
+ if (tar_close(&tar_data->currentfile->base, CLOSE_NORMAL) != 0)
+ return false;
+ }
+
+ /* A tarfile always ends with two empty blocks */
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_NONE)
+ {
+ errno = 0;
+ if (write(tar_data->fd, zerobuf, sizeof(zerobuf)) != sizeof(zerobuf))
+ {
+ /* If write didn't set errno, assume problem is no disk space */
+ wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return false;
+ }
+ }
+#ifdef HAVE_LIBZ
+ else if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ {
+ if (!tar_write_compressed_data(tar_data, zerobuf, sizeof(zerobuf),
+ false))
+ return false;
+
+ /* Also flush all data to make sure the gzip stream is finished */
+ tar_data->zp->next_in = NULL;
+ tar_data->zp->avail_in = 0;
+ while (true)
+ {
+ int r;
+
+ r = deflate(tar_data->zp, Z_FINISH);
+
+ if (r == Z_STREAM_ERROR)
+ {
+ wwmethod->lasterrstring = _("could not compress data");
+ return false;
+ }
+ if (tar_data->zp->avail_out < ZLIB_OUT_SIZE)
+ {
+ size_t len = ZLIB_OUT_SIZE - tar_data->zp->avail_out;
+
+ errno = 0;
+ if (write(tar_data->fd, tar_data->zlibOut, len) != len)
+ {
+ /*
+ * If write didn't set errno, assume problem is no disk
+ * space.
+ */
+ wwmethod->lasterrno = errno ? errno : ENOSPC;
+ return false;
+ }
+ }
+ if (r == Z_STREAM_END)
+ break;
+ }
+
+ if (deflateEnd(tar_data->zp) != Z_OK)
+ {
+ wwmethod->lasterrstring = _("could not close compression stream");
+ return false;
+ }
+ }
+#endif
+ else
+ {
+ /* not reachable */
+ Assert(false);
+ }
+
+ /* sync the empty blocks as well, since they're after the last file */
+ if (wwmethod->sync)
+ {
+ if (fsync(tar_data->fd) != 0)
+ {
+ wwmethod->lasterrno = errno;
+ return false;
+ }
+ }
+
+ if (close(tar_data->fd) != 0)
+ {
+ wwmethod->lasterrno = errno;
+ return false;
+ }
+
+ tar_data->fd = -1;
+
+ if (wwmethod->sync)
+ {
+ if (fsync_fname(tar_data->tarfilename, false) != 0 ||
+ fsync_parent_path(tar_data->tarfilename) != 0)
+ {
+ wwmethod->lasterrno = errno;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+static void
+tar_free(WalWriteMethod *wwmethod)
+{
+ TarMethodData *tar_data = (TarMethodData *) wwmethod;
+
+ pg_free(tar_data->tarfilename);
+#ifdef HAVE_LIBZ
+ if (wwmethod->compression_algorithm == PG_COMPRESSION_GZIP)
+ pg_free(tar_data->zlibOut);
+#endif
+ pg_free(wwmethod);
+}
+
+/*
+ * The argument compression_algorithm is currently ignored. It is in place for
+ * symmetry with CreateWalDirectoryMethod which uses it for distinguishing
+ * between the different compression methods. CreateWalTarMethod and its family
+ * of functions handle only zlib compression.
+ */
+WalWriteMethod *
+CreateWalTarMethod(const char *tarbase,
+ pg_compress_algorithm compression_algorithm,
+ int compression_level, bool sync)
+{
+ TarMethodData *wwmethod;
+ const char *suffix = (compression_algorithm == PG_COMPRESSION_GZIP) ?
+ ".tar.gz" : ".tar";
+
+ wwmethod = pg_malloc0(sizeof(TarMethodData));
+ *((const WalWriteMethodOps **) &wwmethod->base.ops) =
+ &WalTarMethodOps;
+ wwmethod->base.compression_algorithm = compression_algorithm;
+ wwmethod->base.compression_level = compression_level;
+ wwmethod->base.sync = sync;
+ clear_error(&wwmethod->base);
+
+ wwmethod->tarfilename = pg_malloc0(strlen(tarbase) + strlen(suffix) + 1);
+ sprintf(wwmethod->tarfilename, "%s%s", tarbase, suffix);
+ wwmethod->fd = -1;
+#ifdef HAVE_LIBZ
+ if (compression_algorithm == PG_COMPRESSION_GZIP)
+ wwmethod->zlibOut = (char *) pg_malloc(ZLIB_OUT_SIZE + 1);
+#endif
+
+ return &wwmethod->base;
+}
+
+const char *
+GetLastWalMethodError(WalWriteMethod *wwmethod)
+{
+ if (wwmethod->lasterrstring)
+ return wwmethod->lasterrstring;
+ return strerror(wwmethod->lasterrno);
+}
diff --git a/src/bin/pg_basebackup/walmethods.h b/src/bin/pg_basebackup/walmethods.h
new file mode 100644
index 0000000..54a22fe
--- /dev/null
+++ b/src/bin/pg_basebackup/walmethods.h
@@ -0,0 +1,134 @@
+/*-------------------------------------------------------------------------
+ *
+ * walmethods.h
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_basebackup/walmethods.h
+ *-------------------------------------------------------------------------
+ */
+
+#include "common/compression.h"
+
+struct WalWriteMethod;
+typedef struct WalWriteMethod WalWriteMethod;
+
+typedef struct
+{
+ WalWriteMethod *wwmethod;
+ off_t currpos;
+ char *pathname;
+
+ /*
+ * MORE DATA FOLLOWS AT END OF STRUCT
+ *
+ * Each WalWriteMethod is expected to embed this as the first member of a
+ * larger struct with method-specific fields following.
+ */
+} Walfile;
+
+typedef enum
+{
+ CLOSE_NORMAL,
+ CLOSE_UNLINK,
+ CLOSE_NO_RENAME
+} WalCloseMethod;
+
+/*
+ * Table of callbacks for a WalWriteMethod.
+ */
+typedef struct WalWriteMethodOps
+{
+ /*
+ * Open a target file. Returns Walfile, or NULL if open failed. If a temp
+ * suffix is specified, a file with that name will be opened, and then
+ * automatically renamed in close(). If pad_to_size is specified, the file
+ * will be padded with NUL up to that size, if supported by the Walmethod.
+ */
+ Walfile *(*open_for_write) (WalWriteMethod *wwmethod, const char *pathname, const char *temp_suffix, size_t pad_to_size);
+
+ /*
+ * Close an open Walfile, using one or more methods for handling automatic
+ * unlinking etc. Returns 0 on success, other values for error.
+ */
+ int (*close) (Walfile *f, WalCloseMethod method);
+
+ /* Check if a file exist */
+ bool (*existsfile) (WalWriteMethod *wwmethod, const char *pathname);
+
+ /* Return the size of a file, or -1 on failure. */
+ ssize_t (*get_file_size) (WalWriteMethod *wwmethod, const char *pathname);
+
+ /*
+ * Return the name of the current file to work on in pg_malloc()'d string,
+ * without the base directory. This is useful for logging.
+ */
+ char *(*get_file_name) (WalWriteMethod *wwmethod, const char *pathname, const char *temp_suffix);
+
+ /*
+ * Write count number of bytes to the file, and return the number of bytes
+ * actually written or -1 for error.
+ */
+ ssize_t (*write) (Walfile *f, const void *buf, size_t count);
+
+ /*
+ * fsync the contents of the specified file. Returns 0 on success.
+ */
+ int (*sync) (Walfile *f);
+
+ /*
+ * Clean up the Walmethod, closing any shared resources. For methods like
+ * tar, this includes writing updated headers. Returns true if the
+ * close/write/sync of shared resources succeeded, otherwise returns false
+ * (but the resources are still closed).
+ */
+ bool (*finish) (WalWriteMethod *wwmethod);
+
+ /*
+ * Free subsidiary data associated with the WalWriteMethod, and the
+ * WalWriteMethod itself.
+ */
+ void (*free) (WalWriteMethod *wwmethod);
+} WalWriteMethodOps;
+
+/*
+ * A WalWriteMethod structure represents a way of writing streaming WAL as
+ * it's received.
+ *
+ * All methods that have a failure return indicator will set lasterrstring
+ * or lasterrno (the former takes precedence) so that the caller can signal
+ * a suitable error.
+ */
+struct WalWriteMethod
+{
+ const WalWriteMethodOps *ops;
+ pg_compress_algorithm compression_algorithm;
+ int compression_level;
+ bool sync;
+ const char *lasterrstring; /* if set, takes precedence over lasterrno */
+ int lasterrno;
+
+ /*
+ * MORE DATA FOLLOWS AT END OF STRUCT
+ *
+ * Each WalWriteMethod is expected to embed this as the first member of a
+ * larger struct with method-specific fields following.
+ */
+};
+
+/*
+ * Available WAL methods:
+ * - WalDirectoryMethod - write WAL to regular files in a standard pg_wal
+ * - WalTarMethod - write WAL to a tarfile corresponding to pg_wal
+ * (only implements the methods required for pg_basebackup,
+ * not all those required for pg_receivewal)
+ */
+WalWriteMethod *CreateWalDirectoryMethod(const char *basedir,
+ pg_compress_algorithm compression_algorithm,
+ int compression_level, bool sync);
+WalWriteMethod *CreateWalTarMethod(const char *tarbase,
+ pg_compress_algorithm compression_algorithm,
+ int compression_level, bool sync);
+
+const char *GetLastWalMethodError(WalWriteMethod *wwmethod);
diff --git a/src/bin/pg_checksums/.gitignore b/src/bin/pg_checksums/.gitignore
new file mode 100644
index 0000000..7888625
--- /dev/null
+++ b/src/bin/pg_checksums/.gitignore
@@ -0,0 +1,3 @@
+/pg_checksums
+
+/tmp_check/
diff --git a/src/bin/pg_checksums/Makefile b/src/bin/pg_checksums/Makefile
new file mode 100644
index 0000000..4911f6b
--- /dev/null
+++ b/src/bin/pg_checksums/Makefile
@@ -0,0 +1,47 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_checksums
+#
+# Copyright (c) 1998-2023, PostgreSQL Global Development Group
+#
+# src/bin/pg_checksums/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_checksums - verify data checksums in an offline cluster"
+PGAPPICON=win32
+
+subdir = src/bin/pg_checksums
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ pg_checksums.o
+
+all: pg_checksums
+
+pg_checksums: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_checksums$(X) '$(DESTDIR)$(bindir)/pg_checksums$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_checksums$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_checksums$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build
new file mode 100644
index 0000000..5528526
--- /dev/null
+++ b/src/bin/pg_checksums/meson.build
@@ -0,0 +1,33 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_checksums_sources = files(
+ 'pg_checksums.c',
+)
+
+if host_system == 'windows'
+ pg_checksums_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_checksums',
+ '--FILEDESC', 'pg_checksums - verify data checksums in an offline cluster',])
+endif
+
+pg_checksums = executable('pg_checksums',
+ pg_checksums_sources,
+ include_directories: [timezone_inc],
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_checksums
+
+tests += {
+ 'name': 'pg_checksums',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_actions.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_checksums/nls.mk b/src/bin/pg_checksums/nls.mk
new file mode 100644
index 0000000..f7cd2a5
--- /dev/null
+++ b/src/bin/pg_checksums/nls.mk
@@ -0,0 +1,7 @@
+# src/bin/pg_checksums/nls.mk
+CATALOG_NAME = pg_checksums
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_checksums.c \
+ ../../fe_utils/option_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c
new file mode 100644
index 0000000..19eb67e
--- /dev/null
+++ b/src/bin/pg_checksums/pg_checksums.c
@@ -0,0 +1,651 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_checksums.c
+ * Checks, enables or disables page level checksums for an offline
+ * cluster
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_checksums/pg_checksums.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+static int64 files_scanned = 0;
+static int64 files_written = 0;
+static int64 blocks_scanned = 0;
+static int64 blocks_written = 0;
+static int64 badblocks = 0;
+static ControlFileData *ControlFile;
+
+static char *only_filenode = NULL;
+static bool do_sync = true;
+static bool verbose = false;
+static bool showprogress = false;
+
+typedef enum
+{
+ PG_MODE_CHECK,
+ PG_MODE_DISABLE,
+ PG_MODE_ENABLE
+} PgChecksumMode;
+
+/*
+ * Filename components.
+ *
+ * XXX: fd.h is not declared here as frontend side code is not able to
+ * interact with the backend-side definitions for the various fsync
+ * wrappers.
+ */
+#define PG_TEMP_FILES_DIR "pgsql_tmp"
+#define PG_TEMP_FILE_PREFIX "pgsql_tmp"
+
+static PgChecksumMode mode = PG_MODE_CHECK;
+
+static const char *progname;
+
+/*
+ * Progress status information.
+ */
+int64 total_size = 0;
+int64 current_size = 0;
+static pg_time_t last_progress_report = 0;
+
+static void
+usage(void)
+{
+ printf(_("%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -c, --check check data checksums (default)\n"));
+ printf(_(" -d, --disable disable data checksums\n"));
+ printf(_(" -e, --enable enable data checksums\n"));
+ printf(_(" -f, --filenode=FILENODE check only relation with specified filenode\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf no data directory (DATADIR) is specified, "
+ "the environment variable PGDATA\nis used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Definition of one element part of an exclusion list, used for files
+ * to exclude from checksum validation. "name" is the name of the file
+ * or path to check for exclusion. If "match_prefix" is true, any items
+ * matching the name as prefix are excluded.
+ */
+struct exclude_list_item
+{
+ const char *name;
+ bool match_prefix;
+};
+
+/*
+ * List of files excluded from checksum validation.
+ *
+ * Note: this list should be kept in sync with what basebackup.c includes.
+ */
+static const struct exclude_list_item skip[] = {
+ {"pg_control", false},
+ {"pg_filenode.map", false},
+ {"pg_internal.init", true},
+ {"PG_VERSION", false},
+#ifdef EXEC_BACKEND
+ {"config_exec_params", true},
+#endif
+ {NULL, false}
+};
+
+/*
+ * Report current progress status. Parts borrowed from
+ * src/bin/pg_basebackup/pg_basebackup.c.
+ */
+static void
+progress_report(bool finished)
+{
+ int percent;
+ pg_time_t now;
+
+ Assert(showprogress);
+
+ now = time(NULL);
+ if (now == last_progress_report && !finished)
+ return; /* Max once per second */
+
+ /* Save current time */
+ last_progress_report = now;
+
+ /* Adjust total size if current_size is larger */
+ if (current_size > total_size)
+ total_size = current_size;
+
+ /* Calculate current percentage of size done */
+ percent = total_size ? (int) ((current_size) * 100 / total_size) : 0;
+
+ fprintf(stderr, _("%lld/%lld MB (%d%%) computed"),
+ (long long) (current_size / (1024 * 1024)),
+ (long long) (total_size / (1024 * 1024)),
+ percent);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+static bool
+skipfile(const char *fn)
+{
+ int excludeIdx;
+
+ for (excludeIdx = 0; skip[excludeIdx].name != NULL; excludeIdx++)
+ {
+ int cmplen = strlen(skip[excludeIdx].name);
+
+ if (!skip[excludeIdx].match_prefix)
+ cmplen++;
+ if (strncmp(skip[excludeIdx].name, fn, cmplen) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+static void
+scan_file(const char *fn, int segmentno)
+{
+ PGIOAlignedBlock buf;
+ PageHeader header = (PageHeader) buf.data;
+ int f;
+ BlockNumber blockno;
+ int flags;
+ int64 blocks_written_in_file = 0;
+
+ Assert(mode == PG_MODE_ENABLE ||
+ mode == PG_MODE_CHECK);
+
+ flags = (mode == PG_MODE_ENABLE) ? O_RDWR : O_RDONLY;
+ f = open(fn, PG_BINARY | flags, 0);
+
+ if (f < 0)
+ pg_fatal("could not open file \"%s\": %m", fn);
+
+ files_scanned++;
+
+ for (blockno = 0;; blockno++)
+ {
+ uint16 csum;
+ int r = read(f, buf.data, BLCKSZ);
+
+ if (r == 0)
+ break;
+ if (r != BLCKSZ)
+ {
+ if (r < 0)
+ pg_fatal("could not read block %u in file \"%s\": %m",
+ blockno, fn);
+ else
+ pg_fatal("could not read block %u in file \"%s\": read %d of %d",
+ blockno, fn, r, BLCKSZ);
+ }
+ blocks_scanned++;
+
+ /*
+ * Since the file size is counted as total_size for progress status
+ * information, the sizes of all pages including new ones in the file
+ * should be counted as current_size. Otherwise the progress reporting
+ * calculated using those counters may not reach 100%.
+ */
+ current_size += r;
+
+ /* New pages have no checksum yet */
+ if (PageIsNew(buf.data))
+ continue;
+
+ csum = pg_checksum_page(buf.data, blockno + segmentno * RELSEG_SIZE);
+ if (mode == PG_MODE_CHECK)
+ {
+ if (csum != header->pd_checksum)
+ {
+ if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION)
+ pg_log_error("checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X",
+ fn, blockno, csum, header->pd_checksum);
+ badblocks++;
+ }
+ }
+ else if (mode == PG_MODE_ENABLE)
+ {
+ int w;
+
+ /*
+ * Do not rewrite if the checksum is already set to the expected
+ * value.
+ */
+ if (header->pd_checksum == csum)
+ continue;
+
+ blocks_written_in_file++;
+
+ /* Set checksum in page header */
+ header->pd_checksum = csum;
+
+ /* Seek back to beginning of block */
+ if (lseek(f, -BLCKSZ, SEEK_CUR) < 0)
+ pg_fatal("seek failed for block %u in file \"%s\": %m", blockno, fn);
+
+ /* Write block with checksum */
+ w = write(f, buf.data, BLCKSZ);
+ if (w != BLCKSZ)
+ {
+ if (w < 0)
+ pg_fatal("could not write block %u in file \"%s\": %m",
+ blockno, fn);
+ else
+ pg_fatal("could not write block %u in file \"%s\": wrote %d of %d",
+ blockno, fn, w, BLCKSZ);
+ }
+ }
+
+ if (showprogress)
+ progress_report(false);
+ }
+
+ if (verbose)
+ {
+ if (mode == PG_MODE_CHECK)
+ pg_log_info("checksums verified in file \"%s\"", fn);
+ if (mode == PG_MODE_ENABLE)
+ pg_log_info("checksums enabled in file \"%s\"", fn);
+ }
+
+ /* Update write counters if any write activity has happened */
+ if (blocks_written_in_file > 0)
+ {
+ files_written++;
+ blocks_written += blocks_written_in_file;
+ }
+
+ close(f);
+}
+
+/*
+ * Scan the given directory for items which can be checksummed and
+ * operate on each one of them. If "sizeonly" is true, the size of
+ * all the items which have checksums is computed and returned back
+ * to the caller without operating on the files. This is used to compile
+ * the total size of the data directory for progress reports.
+ */
+static int64
+scan_directory(const char *basedir, const char *subdir, bool sizeonly)
+{
+ int64 dirsize = 0;
+ char path[MAXPGPATH];
+ DIR *dir;
+ struct dirent *de;
+
+ snprintf(path, sizeof(path), "%s/%s", basedir, subdir);
+ dir = opendir(path);
+ if (!dir)
+ pg_fatal("could not open directory \"%s\": %m", path);
+ while ((de = readdir(dir)) != NULL)
+ {
+ char fn[MAXPGPATH];
+ struct stat st;
+
+ if (strcmp(de->d_name, ".") == 0 ||
+ strcmp(de->d_name, "..") == 0)
+ continue;
+
+ /* Skip temporary files */
+ if (strncmp(de->d_name,
+ PG_TEMP_FILE_PREFIX,
+ strlen(PG_TEMP_FILE_PREFIX)) == 0)
+ continue;
+
+ /* Skip temporary folders */
+ if (strncmp(de->d_name,
+ PG_TEMP_FILES_DIR,
+ strlen(PG_TEMP_FILES_DIR)) == 0)
+ continue;
+
+ snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name);
+ if (lstat(fn, &st) < 0)
+ pg_fatal("could not stat file \"%s\": %m", fn);
+ if (S_ISREG(st.st_mode))
+ {
+ char fnonly[MAXPGPATH];
+ char *forkpath,
+ *segmentpath;
+ int segmentno = 0;
+
+ if (skipfile(de->d_name))
+ continue;
+
+ /*
+ * Cut off at the segment boundary (".") to get the segment number
+ * in order to mix it into the checksum. Then also cut off at the
+ * fork boundary, to get the filenode the file belongs to for
+ * filtering.
+ */
+ strlcpy(fnonly, de->d_name, sizeof(fnonly));
+ segmentpath = strchr(fnonly, '.');
+ if (segmentpath != NULL)
+ {
+ *segmentpath++ = '\0';
+ segmentno = atoi(segmentpath);
+ if (segmentno == 0)
+ pg_fatal("invalid segment number %d in file name \"%s\"",
+ segmentno, fn);
+ }
+
+ forkpath = strchr(fnonly, '_');
+ if (forkpath != NULL)
+ *forkpath++ = '\0';
+
+ if (only_filenode && strcmp(only_filenode, fnonly) != 0)
+ /* filenode not to be included */
+ continue;
+
+ dirsize += st.st_size;
+
+ /*
+ * No need to work on the file when calculating only the size of
+ * the items in the data folder.
+ */
+ if (!sizeonly)
+ scan_file(fn, segmentno);
+ }
+ else if (S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode))
+ {
+ /*
+ * If going through the entries of pg_tblspc, we assume to operate
+ * on tablespace locations where only TABLESPACE_VERSION_DIRECTORY
+ * is valid, resolving the linked locations and dive into them
+ * directly.
+ */
+ if (strncmp("pg_tblspc", subdir, strlen("pg_tblspc")) == 0)
+ {
+ char tblspc_path[MAXPGPATH];
+ struct stat tblspc_st;
+
+ /*
+ * Resolve tablespace location path and check whether
+ * TABLESPACE_VERSION_DIRECTORY exists. Not finding a valid
+ * location is unexpected, since there should be no orphaned
+ * links and no links pointing to something else than a
+ * directory.
+ */
+ snprintf(tblspc_path, sizeof(tblspc_path), "%s/%s/%s",
+ path, de->d_name, TABLESPACE_VERSION_DIRECTORY);
+
+ if (lstat(tblspc_path, &tblspc_st) < 0)
+ pg_fatal("could not stat file \"%s\": %m",
+ tblspc_path);
+
+ /*
+ * Move backwards once as the scan needs to happen for the
+ * contents of TABLESPACE_VERSION_DIRECTORY.
+ */
+ snprintf(tblspc_path, sizeof(tblspc_path), "%s/%s",
+ path, de->d_name);
+
+ /* Looks like a valid tablespace location */
+ dirsize += scan_directory(tblspc_path,
+ TABLESPACE_VERSION_DIRECTORY,
+ sizeonly);
+ }
+ else
+ {
+ dirsize += scan_directory(path, de->d_name, sizeonly);
+ }
+ }
+ }
+ closedir(dir);
+ return dirsize;
+}
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"check", no_argument, NULL, 'c'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"disable", no_argument, NULL, 'd'},
+ {"enable", no_argument, NULL, 'e'},
+ {"filenode", required_argument, NULL, 'f'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"progress", no_argument, NULL, 'P'},
+ {"verbose", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0}
+ };
+
+ char *DataDir = NULL;
+ int c;
+ int option_index;
+ bool crc_ok;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_checksums (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "cdD:ef:NPv", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ mode = PG_MODE_CHECK;
+ break;
+ case 'd':
+ mode = PG_MODE_DISABLE;
+ break;
+ case 'D':
+ DataDir = optarg;
+ break;
+ case 'e':
+ mode = PG_MODE_ENABLE;
+ break;
+ case 'f':
+ if (!option_parse_int(optarg, "-f/--filenode", 0,
+ INT_MAX,
+ NULL))
+ exit(1);
+ only_filenode = pstrdup(optarg);
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'P':
+ showprogress = true;
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL)
+ {
+ if (optind < argc)
+ DataDir = argv[optind++];
+ else
+ DataDir = getenv("PGDATA");
+
+ /* If no DataDir was specified, and none could be found, error out */
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* filenode checking only works in --check mode */
+ if (mode != PG_MODE_CHECK && only_filenode)
+ {
+ pg_log_error("option -f/--filenode can only be used with --check");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* Read the control file and check compatibility */
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ if (!crc_ok)
+ pg_fatal("pg_control CRC value is incorrect");
+
+ if (ControlFile->pg_control_version != PG_CONTROL_VERSION)
+ pg_fatal("cluster is not compatible with this version of pg_checksums");
+
+ if (ControlFile->blcksz != BLCKSZ)
+ {
+ pg_log_error("database cluster is not compatible");
+ pg_log_error_detail("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.",
+ ControlFile->blcksz, BLCKSZ);
+ exit(1);
+ }
+
+ /*
+ * Check if cluster is running. A clean shutdown is required to avoid
+ * random checksum failures caused by torn pages. Note that this doesn't
+ * guard against someone starting the cluster concurrently.
+ */
+ if (ControlFile->state != DB_SHUTDOWNED &&
+ ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("cluster must be shut down");
+
+ if (ControlFile->data_checksum_version == 0 &&
+ mode == PG_MODE_CHECK)
+ pg_fatal("data checksums are not enabled in cluster");
+
+ if (ControlFile->data_checksum_version == 0 &&
+ mode == PG_MODE_DISABLE)
+ pg_fatal("data checksums are already disabled in cluster");
+
+ if (ControlFile->data_checksum_version > 0 &&
+ mode == PG_MODE_ENABLE)
+ pg_fatal("data checksums are already enabled in cluster");
+
+ /* Operate on all files if checking or enabling checksums */
+ if (mode == PG_MODE_CHECK || mode == PG_MODE_ENABLE)
+ {
+ /*
+ * If progress status information is requested, we need to scan the
+ * directory tree twice: once to know how much total data needs to be
+ * processed and once to do the real work.
+ */
+ if (showprogress)
+ {
+ total_size = scan_directory(DataDir, "global", true);
+ total_size += scan_directory(DataDir, "base", true);
+ total_size += scan_directory(DataDir, "pg_tblspc", true);
+ }
+
+ (void) scan_directory(DataDir, "global", false);
+ (void) scan_directory(DataDir, "base", false);
+ (void) scan_directory(DataDir, "pg_tblspc", false);
+
+ if (showprogress)
+ progress_report(true);
+
+ printf(_("Checksum operation completed\n"));
+ printf(_("Files scanned: %lld\n"), (long long) files_scanned);
+ printf(_("Blocks scanned: %lld\n"), (long long) blocks_scanned);
+ if (mode == PG_MODE_CHECK)
+ {
+ printf(_("Bad checksums: %lld\n"), (long long) badblocks);
+ printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
+
+ if (badblocks > 0)
+ exit(1);
+ }
+ else if (mode == PG_MODE_ENABLE)
+ {
+ printf(_("Files written: %lld\n"), (long long) files_written);
+ printf(_("Blocks written: %lld\n"), (long long) blocks_written);
+ }
+ }
+
+ /*
+ * Finally make the data durable on disk if enabling or disabling
+ * checksums. Flush first the data directory for safety, and then update
+ * the control file to keep the switch consistent.
+ */
+ if (mode == PG_MODE_ENABLE || mode == PG_MODE_DISABLE)
+ {
+ ControlFile->data_checksum_version =
+ (mode == PG_MODE_ENABLE) ? PG_DATA_CHECKSUM_VERSION : 0;
+
+ if (do_sync)
+ {
+ pg_log_info("syncing data directory");
+ fsync_pgdata(DataDir, PG_VERSION_NUM);
+ }
+
+ pg_log_info("updating control file");
+ update_controlfile(DataDir, ControlFile, do_sync);
+
+ if (verbose)
+ printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
+ if (mode == PG_MODE_ENABLE)
+ printf(_("Checksums enabled in cluster\n"));
+ else
+ printf(_("Checksums disabled in cluster\n"));
+ }
+
+ return 0;
+}
diff --git a/src/bin/pg_checksums/po/LINGUAS b/src/bin/pg_checksums/po/LINGUAS
new file mode 100644
index 0000000..ea6197d
--- /dev/null
+++ b/src/bin/pg_checksums/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_checksums/po/cs.po b/src/bin/pg_checksums/po/cs.po
new file mode 100644
index 0000000..df56be8
--- /dev/null
+++ b/src/bin/pg_checksums/po/cs.po
@@ -0,0 +1,312 @@
+# LANGUAGE message translation file for pg_checksums
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 12\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:17+0000\n"
+"PO-Revision-Date: 2020-10-31 21:31+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: pg_checksums.c:75
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s zapíná, vypíná, nebo ověřuje kontrolní souÄty v PostgreSQL databázovém clusteru.\n"
+"\n"
+
+#: pg_checksums.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_checksums.c:77
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [DATAADR]\n"
+
+#: pg_checksums.c:78
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe:\n"
+
+#: pg_checksums.c:79
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datový adresář\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check ověř kontrolní souÄty (implicitní)\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable vypni kontrolní souÄty\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable zapni kontrolní souÄty\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE zkontroluj pouze relaci se zadaným filenode\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync neÄekej na bezpeÄné zapsání zmÄ›n na disk\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress zobrazuj informace o průběhu\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose vypisuj podrobné informace\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version zobraz informaci o verzi, poté skonÄi\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobraz tuto nápovÄ›du, poté skonÄi\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li specifikován datový adresář, je použita proměnná prostředí\n"
+"PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_checksums.c:161
+#, c-format
+msgid "%*s/%s MB (%d%%) computed"
+msgstr "%*s/%s MB (%d%%) zpracováno"
+
+#: pg_checksums.c:207
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: pg_checksums.c:223
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "nelze pÅ™eÄíst blok %u v souboru \"%s\": %m"
+
+#: pg_checksums.c:226
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "nelze pÅ™eÄíst blok %u v souboru \"%s\": naÄteno %d z %d"
+
+#: pg_checksums.c:243
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "ověření kontrolnícou souÄtů selhalo v souboru \"%s\", blok %u: spoÄtený kontrolní souÄet %X ale klok obsahuje %X"
+
+#: pg_checksums.c:258
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "nastavení pozice (seek) selhalo pro blok %u v souboru \"%s\": %m"
+
+#: pg_checksums.c:267
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "nelze zapsat blok %u v souboru \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "nelze zapsat blok %u v souboru \"%s\": zapsáno %d z %d"
+
+#: pg_checksums.c:283
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "kontrolní souÄty ověřeny v souboru \"%s\""
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "kontrolní souÄty zapnuty v souboru \"%s\""
+
+#: pg_checksums.c:310
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: pg_checksums.c:337 pg_checksums.c:416
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "nelze naÄíst informace o souboru \"%s\": %m"
+
+#: pg_checksums.c:364
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "chybné Äíslo segmentu %d ve jménu souboru \"%s\""
+
+#: pg_checksums.c:497
+#, c-format
+msgid "invalid filenode specification, must be numeric: %s"
+msgstr "chybnÄ› zadaný filenode, vyžadována Äíselná hodnota: %s"
+
+#: pg_checksums.c:515 pg_checksums.c:531 pg_checksums.c:541 pg_checksums.c:550
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_checksums.c:530
+#, c-format
+msgid "no data directory specified"
+msgstr "datový adresář nebyl zadán"
+
+#: pg_checksums.c:539
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho parametrů na příkazové řádce (první je \"%s\")"
+
+#: pg_checksums.c:549
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "volba -f/--filenode může být použita pouze s volbou --check"
+
+#: pg_checksums.c:559
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC hodnota je neplatná"
+
+#: pg_checksums.c:565
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "cluster není kompatibilní s touto verzí pg_checksums"
+
+#: pg_checksums.c:571
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "databázový cluster není kompatibilní"
+
+#: pg_checksums.c:572
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"
+msgstr "Databázový cluster byl inicializován s bloky velikosti %u, ale pg_checksums byl zkompilován pro velikost bloku %u.\n"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "cluster must be shut down"
+msgstr "cluster musí být vypnutý"
+
+#: pg_checksums.c:592
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "kontrolní souÄty nejsou v clusteru zapnuty"
+
+#: pg_checksums.c:599
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "kontrolní souÄty jsou v clusteru již vypnuty"
+
+#: pg_checksums.c:606
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "kontrolní souÄty jsou v clusteru již zapnuty"
+
+#: pg_checksums.c:632
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operace s kontrolními souÄty dokonÄena\n"
+
+#: pg_checksums.c:633
+#, c-format
+msgid "Files scanned: %s\n"
+msgstr "Souborů pÅ™eÄteno: %s\n"
+
+#: pg_checksums.c:634
+#, c-format
+msgid "Blocks scanned: %s\n"
+msgstr "PÅ™eÄtené datové bloky: %s\n"
+
+#: pg_checksums.c:637
+#, c-format
+msgid "Bad checksums: %s\n"
+msgstr "Chybné kontrolní souÄty: %s\n"
+
+#: pg_checksums.c:638 pg_checksums.c:665
+#, c-format
+msgid "Data checksum version: %d\n"
+msgstr "Verze kontrolních souÄtů: %d\n"
+
+#: pg_checksums.c:657
+#, c-format
+msgid "syncing data directory"
+msgstr "provádím sync datového adresáře"
+
+#: pg_checksums.c:661
+#, c-format
+msgid "updating control file"
+msgstr "aktualizuji control coubor"
+
+#: pg_checksums.c:667
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Kontrolní souÄty zapnuty v clusteru\n"
+
+#: pg_checksums.c:669
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Kontrolní souÄty vypnuty v clusteru\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_checksums/po/de.po b/src/bin/pg_checksums/po/de.po
new file mode 100644
index 0000000..460b5b5
--- /dev/null
+++ b/src/bin/pg_checksums/po/de.po
@@ -0,0 +1,330 @@
+# German message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Peter Eisentraut <peter@eisentraut.org>, 2018 - 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:51+0000\n"
+"PO-Revision-Date: 2022-05-11 22:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s überprüft die Datenprüfsummen in einem PostgreSQL-Datenbankcluster oder schaltet sie ein oder aus.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check Datenprüfsummen prüfen (Voreinstellung)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable Datenprüfsummen ausschalten\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable Datenprüfsummen einschalten\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE nur Relation mit angegebenem Filenode prüfen\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) berechnet"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "konnte Block %u in Datei »%s« nicht lesen: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "konnte Block %u in Datei »%s« nicht lesen: %d von %d gelesen"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "Prüfsummenprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnete Prüfsumme ist %X, aber der Block enthält %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "seek fehlgeschlagen für Block %u in Datei »%s«: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "konnte Block %u in Datei »%s« nicht schreiben: %d von %d geschrieben"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "Prüfsummen wurden überprüft in Datei »%s«"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "Prüfsummen wurden eingeschaltet in Datei »%s«"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ungültige Segmentnummer %d in Dateiname »%s«"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "Option -f/--filenode kann nur mit --check verwendet werden"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "CRC-Wert in pg_control ist falsch"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "die Cluster sind nicht mit dieser Version von pg_checksums kompatibel"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "Datenbank-Cluster ist nicht kompatibel"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Der Datenbank-Cluster wurde mit Blockgröße %u initialisiert, aber pg_checksums wurde mit Blockgröße %u kompiliert."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "Cluster muss heruntergefahren sein"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster nicht eingeschaltet"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster bereits ausgeschaltet"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster bereits eingeschaltet"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Prüfsummenoperation abgeschlossen\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Überprüfte Dateien: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Überprüfte Blöcke: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Falsche Prüfsummen: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Datenprüfsummenversion: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Geschriebene Dateien: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Geschriebene Blöcke: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synchronisiere Datenverzeichnis"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "aktualisiere Kontrolldatei"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Prüfsummen wurden im Cluster eingeschaltet\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Prüfsummen wurden im Cluster ausgeschaltet\n"
diff --git a/src/bin/pg_checksums/po/el.po b/src/bin/pg_checksums/po/el.po
new file mode 100644
index 0000000..86395be
--- /dev/null
+++ b/src/bin/pg_checksums/po/el.po
@@ -0,0 +1,337 @@
+# Greek message translation file for pg_checksums
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:21+0000\n"
+"PO-Revision-Date: 2023-04-14 13:01+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s ενεÏγοποιεί, απενεÏγοποιεί ή επαληθεÏει τα αθÏοίσματα ελέγχου δεδομένων σε μία συστάδα βάσεων δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check έλεγξε αθÏοίσματα ελέγχου δεδομένων (Ï€Ïοεπιλογή)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable απενεÏγοποίησε τα αθÏοίσματα ελέγχου δεδομένων\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable ενεÏγοποίησε τα αθÏοίσματα ελέγχου δεδομένων\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE έλεγξε μόνο τη σχέση με το καθοÏισμένο filenode\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose πεÏιφÏαστικά μηνÏματα εξόδου\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοÏιστεί κατάλογος δεδομένων (DATADIR), χÏησιμοποιείται η\n"
+"μεταβλητή πεÏιβάλλοντος PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld ΜΒ (%d%%) υπολογισμένο"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του μπλοκ %u στο αÏχείο «%s»: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση του μπλοκ %u στο αÏχείο «%s»: ανάγνωσε %d από %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "επαλήθευση του αθÏοίσματος ελέγχου απέτυχε στο αÏχείο «%s», μπλοκ %u: υπολογισμένο άθÏοισμα ελέγχου %X αλλά το μπλοκ πεÏιέχει %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "αναζήτηση απέτυχε για μπλοκ %u στο αÏχείο «%s»: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή μπλοκ %u στο αÏχείο «%s»: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "δεν ήταν δυνατή η εγγÏαφή μπλοκ %u στο αÏχείο «%s»: έγÏαψε %d από %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "επαληθευμένα αθÏοίσματα ελέγχου στο αÏχείο «%s»"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ενεÏγοποιημένα αθÏοίσματα ελέγχου στο αÏχείο «%s»"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "μη έγκυÏος αÏιθμός τμήματος %d στο αÏχείο με όνομα «%s»"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν οÏίστηκε κατάλογος δεδομένων"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "η επιλογή -f/--filenode μποÏεί να χÏησιμοποιηθεί μόνο μαζί με την --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "η τιμή pg_control CRC είναι λανθασμένη"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "η συστάδα βάσεων δεδομένων δεν είναι συμβατή"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Η συστάδα βάσεων δεδομένων αÏχικοποιήθηκε με μέγεθος μπλοκ %u, αλλά το pg_checksums συντάχθηκε με μέγεθος μπλοκ %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "η συστάδα Ï€Ïέπει να τεÏματιστεί"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "τα αθÏοίσματα ελέγχου δεδομένων δεν είναι ενεÏγοποιημένα στη συστάδα"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "τα αθÏοίσματα ελέγχου δεδομένων είναι ήδη απενεÏγοποιημένα στη συστάδα"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "τα αθÏοίσματα ελέγχου δεδομένων είναι ήδη ενεÏγοποιημένα στη συστάδα"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "ΟλοκληÏώθηκε η λειτουÏγία του αθÏοίσματος ελέγχου\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "ΣαÏωμένα αÏχεία: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "ΣαÏωμένα μπλοκ: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Εσφαλμένα αθÏοίσματα ελέγχου: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Έκδοση αθÏοισμάτων ελέγχου: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "ΓÏαμμένα αÏχεία: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "ΓÏαμμένα μπλοκ: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "συγχÏονίζεται κατάλογος δεδομένων"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "ενημεÏώνεται αÏχείο ελέγχου"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "ΕνεÏγοποίηση των αθÏοισμάτων ελέγχου στη συστάδα\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Τα αθÏοίσματα ελέγχου δεδομένων είναι απενεÏγοποιημένα στη συστάδα\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή filenode, Ï€Ïέπει να είναι αÏιθμητική: %s"
diff --git a/src/bin/pg_checksums/po/es.po b/src/bin/pg_checksums/po/es.po
new file mode 100644
index 0000000..475406d
--- /dev/null
+++ b/src/bin/pg_checksums/po/es.po
@@ -0,0 +1,332 @@
+# Spanish message translation file for pg_checksums
+#
+# Copyright (c) 2019-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Ãlvaro Herrera <alvherre@alvh.no-ip.org>, 2019.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:23+0000\n"
+"PO-Revision-Date: 2023-05-22 12:05+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: pgsql-es-ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s activa, desactiva o verifica checksums de datos en un clúster PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPCIÓN]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check verificar checksums (por omisión)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable desactivar checksums\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable activar checksums\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE verificar sólo la relación con el filenode dado\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose desplegar mensajes verbosos\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un directorio de datos (DATADIR), se utilizará\n"
+"la variable de entorno PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calculado"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "no se pudo leer el bloque %u del archivo «%s»: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "no se pudo leer bloque %u en archivo «%s»: leídos %d de %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verificación de checksums falló en archivo «%s», bloque %u: checksum calculado %X pero bloque contiene %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "posicionamiento (seek) falló para el bloque %u en archivo «%s»: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "no se pudo escribir el bloque %u en el archivo «%s»: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "no se pudo escribir el bloque %u en el archivo «%s»: se escribieron %d de %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "checksums verificados en archivo «%s»"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "checksums activados en archivo «%s»"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:411
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "número de segmento %d no válido en nombre de archivo «%s»"
+
+#: pg_checksums.c:508 pg_checksums.c:524 pg_checksums.c:534 pg_checksums.c:542
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_checksums.c:523
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó el directorio de datos"
+
+#: pg_checksums.c:532
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_checksums.c:541
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "la opción -f/--filenode sólo puede usarse con --check"
+
+#: pg_checksums.c:549
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "el valor de CRC de pg_control es incorrecto"
+
+#: pg_checksums.c:552
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "el clúster no es compatible con esta versión de pg_checksums"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "el clúster de bases de datos no es compatible"
+
+#: pg_checksums.c:557
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "El clúster fue inicializado con tamaño de bloque %u, pero pg_checksums fue compilado con tamaño de bloques %u."
+
+#: pg_checksums.c:569
+#, c-format
+msgid "cluster must be shut down"
+msgstr "el clúster debe estar apagado"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "los checksums de datos no están activados en el clúster"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "los checksums de datos ya están desactivados en el clúster"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "los checksums de datos ya están activados en el clúster"
+
+#: pg_checksums.c:605
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operación de checksums completa\n"
+
+#: pg_checksums.c:606
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Archivos recorridos: %lld\n"
+
+#: pg_checksums.c:607
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Bloques recorridos: %lld\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Checksums incorrectos: %lld\n"
+
+#: pg_checksums.c:611 pg_checksums.c:643
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versión de checksums de datos: %u\n"
+
+#: pg_checksums.c:618
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Archivos escritos: %lld\n"
+
+#: pg_checksums.c:619
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Bloques escritos: %lld\n"
+
+#: pg_checksums.c:635
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizando directorio de datos"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "updating control file"
+msgstr "actualizando archivo de control"
+
+#: pg_checksums.c:645
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Checksums activos en el clúster\n"
+
+#: pg_checksums.c:647
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Checksums inactivos en el clúster\n"
diff --git a/src/bin/pg_checksums/po/fr.po b/src/bin/pg_checksums/po/fr.po
new file mode 100644
index 0000000..dcdb4c7
--- /dev/null
+++ b/src/bin/pg_checksums/po/fr.po
@@ -0,0 +1,374 @@
+# LANGUAGE message translation file for pg_verify_checksums
+# Copyright (C) 2018-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2018-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:21+0000\n"
+"PO-Revision-Date: 2022-05-14 17:15+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s active, désactive ou vérifie les sommes de contrôle de données dans\n"
+"une instance PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [RÉP_DONNÉES]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]REP_DONNEES répertoire des données\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check vérifie les sommes de contrôle (par défaut)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable désactive les sommes de contrôle\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable active les sommes de contrôle\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=FILENODE vérifie seulement la relation dont l'identifiant\n"
+" relfilenode est indiqué\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression de l'opération\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose affiche des messages verbeux\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld Mo (%d%%) traités"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %d lus sur %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : somme de contrôle calculée %X, alors que le bloc contient %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "n'a pas pu rechercher le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "n'a pas pu écrire le bloc %u du fichier « %s » : a écrit %d octets sur %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "sommes de contrôle vérifiées dans le fichier « %s »"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "sommes de contrôle activées dans le fichier « %s »"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "numéro de segment %d invalide dans le nom de fichier « %s »"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "l'option « -f/--filenode » peut seulement être utilisée avec --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "la valeur CRC de pg_control n'est pas correcte"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "l'instance n'est pas compatible avec cette version de pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "l'instance n'est pas compatible"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "L'instance a été initialisée avec une taille de bloc à %u alors que pg_checksums a été compilé avec une taille de bloc à %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "l'instance doit être arrêtée"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "les sommes de contrôle sur les données ne sont pas activées sur cette instance"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "les sommes de contrôle sur les données sont déjà désactivées sur cette instance"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "les sommes de contrôle sur les données sont déjà activées sur cette instance"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Opération sur les sommes de contrôle terminée\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Fichiers parcourus : %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocs parcourus : %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Mauvaises sommes de contrôle : %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Version des sommes de contrôle sur les données : %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Fichiers écrits : %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocs écrits : %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synchronisation du répertoire des données"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "mise à jour du fichier de contrôle"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Sommes de contrôle sur les données activées sur cette instance\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Sommes de contrôle sur les données désactivées sur cette instance\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version puis quitte\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: no data directory specified\n"
+#~ msgstr "%s : aucun répertoire de données indiqué\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "spécification invalide du relfilnode, doit être numérique : %s"
diff --git a/src/bin/pg_checksums/po/it.po b/src/bin/pg_checksums/po/it.po
new file mode 100644
index 0000000..359c084
--- /dev/null
+++ b/src/bin/pg_checksums/po/it.po
@@ -0,0 +1,327 @@
+# LANGUAGE message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:21+0000\n"
+"PO-Revision-Date: 2023-09-05 08:10+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%s abilita, disabilita o verifica i checksum dei dati in un cluster di database PostgreSQL.\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPZIONE]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check controlla i checksum dei dati (predefinito)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable disabilita i checksum dei dati\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable abilita i checksum dei dati\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE controlla solo la relazione con il filenode specificato\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync non attende che le modifiche vengano scritte in modo sicuro sul disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose genera messaggi dettagliati\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non viene specificata un directory per i dati (DATADIR) verrà usata la\n"
+"variabile d'ambiente PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calcolati"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "lettura del blocco %u nel file \"%s\" fallita: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "impossibile leggere il blocco %u nel file \"%s\": leggere %d di %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verifica del checksum non riuscita nel file \"%s\", blocco %u: checksum calcolato %X ma il blocco contiene %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ricerca non riuscita per il blocco %u nel file \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "scrittura del blocco %u nel file \"%s\" fallita: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "impossibile scrivere il blocco %u nel file \"%s\": ha scritto %d di %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "checksum verificati nel file \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "checksum abilitati nel file \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "numero segmento non valido %d nel nome file \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "l'opzione -f/--filenode può essere utilizzata solo con --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control Il valore CRC non è corretto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "cluster non è compatibile con questa versione di pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "il cluster di database non è compatibile"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Il cluster di database è stato inizializzato con la dimensione del blocco %u, ma pg_checksums è stato compilato con la dimensione del blocco %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "il cluster deve essere spento"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "i checksum dei dati non sono abilitati nel cluster"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "i checksum dei dati sono già disabilitati nel cluster"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "i checksum dei dati sono già abilitati nel cluster"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operazione di checksum completata\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "File scansionati: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocchi scansionati: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Checksum errati: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versione checksum dati: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "File scritti: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocchi scritti: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizzazione della directory dei dati"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "aggiornamento del file di controllo"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Checksum abilitati nel cluster\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Checksum disabilitati nel cluster\n"
diff --git a/src/bin/pg_checksums/po/ja.po b/src/bin/pg_checksums/po/ja.po
new file mode 100644
index 0000000..aacabde
--- /dev/null
+++ b/src/bin/pg_checksums/po/ja.po
@@ -0,0 +1,339 @@
+# Japanese message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 13:45+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%sã®ä¸æ­£ãªå€¤\"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベースクラスタã«ãŠã‘るデータãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æœ‰åŠ¹åŒ–ã€ç„¡åŠ¹åŒ–ãŠã‚ˆã³æ¤œè¨¼ã‚’è¡Œã„ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’検証(デフォルト)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’無効化\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’有効化\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 指定ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ãƒŽãƒ¼ãƒ‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã¿æ¤œè¨¼\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ディスクã¸ã®å®‰å…¨ãªæ›¸ãè¾¼ã¿ã‚’å¾…æ©Ÿã—ãªã„\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状æ³ã‚’表示\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 冗長メッセージを出力\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データディレクトリ(DATADIR)ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€PGDATA環境変数ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 完了"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\"ã§%1$uブロックを読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %3$m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr " ファイル\"%2$s\"ã®ãƒ–ロック%1$uãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %4$d中%3$d読ã¿è¾¼ã¿æ¸ˆã¿"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "ファイル\"%s\" ブロック%uã§ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ãŒå¤±æ•—: 算出ã—ãŸãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯%X ã€ã—ã‹ã—ブロック上ã®å€¤ã¯%X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\" ブロック%1$uã¸ã®ã‚·ãƒ¼ã‚¯å¤±æ•—: %3$m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\"ã§%1$uブロックãŒæ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %3$m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "ファイル\"%2$s\"ã®ãƒ–ロック%1$uã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %4$dãƒã‚¤ãƒˆä¸­%3$dãƒã‚¤ãƒˆã®ã¿æ›¸ãè¾¼ã¿ã¾ã—ãŸ"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æ¤œè¨¼ã•ã‚Œã¾ã—ãŸ"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¾ã—ãŸ"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ファイルå\"%2$s\"ã®ä¸æ­£ãªã‚»ã‚°ãƒ¡ãƒ³ãƒˆç•ªå·%1$d"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã«ã¤ã„ã¦ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ (最åˆã¯\"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "オプション-f/--filenodeã¯--checkを指定ã—ãŸã¨ãã®ã¿æŒ‡å®šå¯èƒ½"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_controlã®CRC値ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "クラスタã¯ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®pg_checksumsã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "データベースクラスタãŒéžäº’æ›ã§ã™"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "データベースクラスタã¯ãƒ–ロックサイズ%uã§åˆæœŸåŒ–ã•ã‚Œã¦ã„ã¾ã™ã€ã—ã‹ã—pg_checksumsã¯ãƒ–ロックサイズ%uã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "クラスタã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯ã™ã§ã«ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯ã™ã§ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ“作ãŒå®Œäº†ã—ã¾ã—ãŸ\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "スキャンã—ãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "スキャンã—ãŸãƒ–ロック数: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "ä¸æ­£ãªãƒã‚§ãƒƒã‚¯ã‚µãƒ æ•°: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "データãƒã‚§ãƒƒã‚¯ã‚µãƒ ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "スキャンã—ãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "スキャンã—ãŸãƒ–ロック数: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "データディレクトリをåŒæœŸã—ã¦ã„ã¾ã™"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "コントロールファイルを更新ã—ã¦ã„ã¾ã™"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "クラスタã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒæœ‰åŠ¹åŒ–ã•ã‚Œã¾ã—ãŸ\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "クラスタã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒç„¡åŠ¹åŒ–ã•ã‚Œã¾ã—ãŸ\n"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "ä¸æ­£ãªãƒ•ã‚¡ã‚¤ãƒ«ãƒŽãƒ¼ãƒ‰æŒ‡å®šã€æ•°å€¤ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™: %s"
+
+#~ msgid "could not update checksum of block %u in file \"%s\": %m"
+#~ msgstr "ファイル\"%2$s\" ブロック%1$uã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ›´æ–°å¤±æ•—: %3$m"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "ãƒã‚°ã¯ <pgsql-bugs@lists.postgresql.org> ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
diff --git a/src/bin/pg_checksums/po/ka.po b/src/bin/pg_checksums/po/ka.po
new file mode 100644
index 0000000..d202cd7
--- /dev/null
+++ b/src/bin/pg_checksums/po/ka.po
@@ -0,0 +1,351 @@
+# Georgian message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-04 17:50+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s ჩáƒáƒ áƒ—áƒáƒ•áƒ¡, გáƒáƒ›áƒáƒ áƒ—áƒáƒ•áƒ¡ დრშეáƒáƒ›áƒáƒ¬áƒ›áƒ”ბს მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბს "
+"PostgreSQL მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რში.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr ""
+" -c, --check მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ "
+"შემáƒáƒ¬áƒ›áƒ”ბáƒ(ნáƒáƒ’ულისხმები)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ áƒ—ვáƒ\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის ჩáƒáƒ áƒ—ვáƒ\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ™áƒ•áƒáƒœáƒ«áƒ˜ მხáƒáƒšáƒáƒ“ მითითებულ ფáƒáƒ˜áƒšáƒ˜áƒ¡ კვáƒáƒœáƒ«áƒ—áƒáƒœ ურთიერთáƒáƒ‘ის "
+"შემáƒáƒ¬áƒ›áƒ”ბáƒ\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync áƒáƒ  დáƒáƒ•áƒ”ლáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ "
+"ჩáƒáƒ¬áƒ”რáƒáƒ¡\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრ\n"
+"გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld მბ (%d%%) გáƒáƒ›áƒáƒ—ვლილიáƒ"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ—ვლის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\", ბლáƒáƒ™áƒ˜ \"%u\": გáƒáƒ›áƒáƒ—ვლილი "
+"სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ კáƒáƒ›áƒ˜áƒ %X, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜ შეიცáƒáƒ•áƒ¡: %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის შეცდáƒáƒ›áƒ ბლáƒáƒ™áƒ˜áƒ¡áƒ—ვის %u ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": ჩáƒáƒ¬áƒ”რილირ%d %d-დáƒáƒœ"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი შემáƒáƒ¬áƒ›áƒ”ბულირფáƒáƒ˜áƒšáƒ¨áƒ˜: \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულირფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ: \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "სეგმენტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი %d ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლში \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr ""
+"პáƒáƒ áƒáƒ›áƒ”ტრი -f/--filenode მხáƒáƒšáƒáƒ“ --check -თáƒáƒœ ერთáƒáƒ“ შეიძლებრიქნáƒáƒ¡ "
+"გáƒáƒ›áƒáƒ§áƒ”ნებული"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC მნიშვნელáƒáƒ‘რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რი შეუთáƒáƒ•áƒ¡áƒ”ბელირpg_checksums-ის áƒáƒ› ვერსიáƒáƒ¡áƒ—áƒáƒœ"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რი შეუთáƒáƒ•áƒ¡áƒ”ბელიáƒ"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ— %u მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ "
+"pg_checksums áƒáƒ’ებულირბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ—: %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რი უნდრგáƒáƒ›áƒáƒ˜áƒ áƒ—áƒáƒ¡"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ული áƒáƒ áƒáƒ"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი უკვე გáƒáƒ›áƒáƒ áƒ—ულიáƒ"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი უკვე ჩáƒáƒ áƒ—ულიáƒ"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "დáƒáƒ¡áƒ™áƒáƒœáƒ”რებულირფáƒáƒ˜áƒšáƒ”ბი: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "დáƒáƒ¡áƒ™áƒáƒ áƒ”რებული ბლáƒáƒ™áƒ”ბი: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "ცუდი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "ჩáƒáƒ¬áƒ”რილი ფáƒáƒ˜áƒšáƒ”ბი: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "ჩáƒáƒ¬áƒ”რილი ბლáƒáƒ™áƒ”ბი: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულიáƒ\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რში სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი გáƒáƒ›áƒáƒ áƒ—ულიáƒ\n"
diff --git a/src/bin/pg_checksums/po/ko.po b/src/bin/pg_checksums/po/ko.po
new file mode 100644
index 0000000..3c9a602
--- /dev/null
+++ b/src/bin/pg_checksums/po/ko.po
@@ -0,0 +1,343 @@
+# LANGUAGE message translation file for pg_verify_checksums
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:53+0000\n"
+"PO-Revision-Date: 2023-05-30 12:38+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: PostgreSQL Korea <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" ê°’ì€ \"%s\" 옵션값으로 유효하지 ì•ŠìŒ"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다."
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s ëª…ë ¹ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„° ë‚´ ìžë£Œ ì²´í¬ì„¬ì„ 활성화 ë˜ëŠ”\n"
+"비활성화 ë˜ëŠ” 유효성 검사를 합니다.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [옵션]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR ë°ì´í„° 디렉터리\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check 실 ìž‘ì—… ì—†ì´, 그냥 검사만 (기본값)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 비활성화\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 활성화\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 지정한 파ì¼ë…¸ë“œë§Œ 검사\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync ìž‘ì—… 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 진행 과정 보여줌\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose ìžì„¸í•œ ìž‘ì—… 메시지 보여줌\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"DATADIRì¸ ë°ì´í„° 디렉터리를 지정하지 않으며, PGDATA 환경 변수값ì„\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 계산ë¨"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—ì„œ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—ì„œ ì½ì„ 수 ì—†ìŒ: %d / %d ë°”ì´íŠ¸ë§Œ ì½ìŒ"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"\"%s\" 파ì¼, %u ë¸”ëŸ­ì˜ ì²´í¬ì„¬ 검사 실패: ê³„ì‚°ëœ ì²´í¬ì„¬ì€ %X ê°’ì´ì§€ë§Œ, 블럭ì—"
+"는 %X ê°’ì´ ìžˆìŒ"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—ì„œ ì°¾ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %d / %d ë°”ì´íŠ¸ë§Œ 씀"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ 검사 마침"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ 활성화 함"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:411
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ìž˜ëª»ëœ ì¡°ê° ë²ˆí˜¸ %d, 해당 파ì¼: \"%s\""
+
+#: pg_checksums.c:508 pg_checksums.c:524 pg_checksums.c:534 pg_checksums.c:542
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_checksums.c:523
+#, c-format
+msgid "no data directory specified"
+msgstr "ë°ì´í„° 디렉터리를 지정하지 않았ìŒ"
+
+#: pg_checksums.c:532
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ ì§€ì •í–ˆìŒ (ì²˜ìŒ \"%s\")"
+
+#: pg_checksums.c:541
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "-f/--filenode ì˜µì…˜ì€ --check 옵션만 사용할 수 있ìŒ"
+
+#: pg_checksums.c:549
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC ê°’ì´ ìž˜ëª»ë˜ì—ˆìŒ"
+
+#: pg_checksums.c:552
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "해당 í´ëŸ¬ìŠ¤í„°ëŠ” ì´ ë²„ì „ pg_checksumê³¼ 호환ë˜ì§€ ì•ŠìŒ"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ëŠ” 호환ë˜ì§€ ì•ŠìŒ"
+
+#: pg_checksums.c:557
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"ì´ ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ëŠ” %u ë¸”ë¡ í¬ê¸°ë¡œ 초기화 ë˜ì—ˆì§€ë§Œ, pg_checksumì€ %u "
+"ë¸”ë¡ í¬ê¸°ë¡œ ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤."
+
+#: pg_checksums.c:569
+#, c-format
+msgid "cluster must be shut down"
+msgstr "먼저 서버가 중지ë˜ì–´ì•¼ 함"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ìžë£Œ ì²´í¬ì„¬ì´ 비활성화 ìƒíƒœìž„"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ì´ë¯¸ ìžë£Œ ì²´í¬ì„¬ì´ 비활성화 ìƒíƒœìž„"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ì´ë¯¸ ìžë£Œ ì²´í¬ì„¬ì´ 활성화 ìƒíƒœìž„"
+
+#: pg_checksums.c:605
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "ì²´í¬ì„¬ ìž‘ì—… 완료\n"
+
+#: pg_checksums.c:606
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "조사한 파ì¼ìˆ˜: %lld\n"
+
+#: pg_checksums.c:607
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "조사한 블럭수: %lld\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "ìž˜ëª»ëœ ì²´í¬ì„¬: %lld\n"
+
+#: pg_checksums.c:611 pg_checksums.c:643
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "ìžë£Œ ì²´í¬ì„¬ 버전: %u\n"
+
+#: pg_checksums.c:618
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "기ë¡í•œ 파ì¼ìˆ˜: %lld\n"
+
+#: pg_checksums.c:619
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "기ë¡í•œ 블럭수: %lld\n"
+
+#: pg_checksums.c:635
+#, c-format
+msgid "syncing data directory"
+msgstr "ë°ì´í„° 디렉터리 fsync 중"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "updating control file"
+msgstr "컨트롤 íŒŒì¼ ë°”ê¾¸ëŠ” 중"
+
+#: pg_checksums.c:645
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ìžë£Œ ì²´í¬ì„¬ ì˜µì…˜ì´ í™œì„±í™” ë˜ì—ˆìŒ\n"
+
+#: pg_checksums.c:647
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ìžë£Œ ì²´í¬ì„¬ ì˜µì…˜ì´ ë¹„í™œì„±í™” ë˜ì—ˆìŒ\n"
diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build
new file mode 100644
index 0000000..97b20f2
--- /dev/null
+++ b/src/bin/pg_checksums/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_checksums-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_checksums/po/pt_BR.po b/src/bin/pg_checksums/po/pt_BR.po
new file mode 100644
index 0000000..c0ebf5d
--- /dev/null
+++ b/src/bin/pg_checksums/po/pt_BR.po
@@ -0,0 +1,328 @@
+# Brazilian Portuguese message translation file for pg_checksums
+
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2023-08-17 16:33+0200\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valor \"%s\" é inválido para opção %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve estar no intervalo de %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%s habilita, desabilita ou verifica somas de verificação de dados em um agrupamento de banco de dados do PostgreSQL.\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPÇÃO]... [DIRDADOS]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check verifica soma de verificação de dados (padrão)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable desabilita soma de verificação de dados\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable habilita soma de verificação de dados\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE verifica somente relação com o filenode especificado\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync não espera mudanças serem escritas com segurança no disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra informação de progresso\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose mostra mensagens de detalhe\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se o diretório de dados (DIRDADOS) não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calculado"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "não pôde ler bloco %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "não pôde ler bloco %u no arquivo \"%s\": leu %d de %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "comparação de soma de verificação falhou no arquivo \"%s\", bloco %u: soma de verificação calculada %X mas bloco contém %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "posicionamento falhou para block %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "não pôde escrever bloco %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "não pôde escrever bloco %u no arquivo \"%s\": escreveu %d de %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "somas de verificação comparadas no arquivo \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "somas de verificação habilitadas no arquivo \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "não pôde executar stat no arquivo \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "número de segmento %d é inválido no nome do arquivo \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "opção -f/--filenode só pode ser utilizado com --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "valor de CRC do pg_control está incorreto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "agrupamento de banco de dados não é compatível com esta versão do pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "agrupamento de banco de dados não é compatível"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "O agrupamento de banco de dados foi inicializado com tamanho de bloco %u, mas pg_checksums foi compilado com tamanho de bloco %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "agrupamento de banco de dados deve ser desligado"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "somas de verificação de dados não estão habilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "somas de verificação de dados já estão desabilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "somas de verificação de dados já estão habilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operação de soma de verificação concluída\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Arquivos verificados: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocos verificados: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Somas de verificação incorretas: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versão da soma de verificação de dados: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Arquivos verificados: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocos verificados: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizando diretório de dados"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "atualizando arquivo de controle"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Somas de verificação habilitadas no agrupamento de banco de dados\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Somas de verificação desabilitadas no agrupamento de banco de dados\n"
diff --git a/src/bin/pg_checksums/po/ru.po b/src/bin/pg_checksums/po/ru.po
new file mode 100644
index 0000000..b024869
--- /dev/null
+++ b/src/bin/pg_checksums/po/ru.po
@@ -0,0 +1,352 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2019, 2020, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verify_checksums (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-28 07:59+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s включает, отключает, проверÑет контрольные Ñуммы данных в клаÑтере БД "
+"PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ПÐРÐМЕТР]... [КÐТÐЛОГ]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КÐТ_ДÐÐÐЫХ каталог данных\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr ""
+" -c, --check проверить контрольные Ñуммы данных (по "
+"умолчанию)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable отключить контрольные Ñуммы\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable включить контрольные Ñуммы\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=ФÐЙЛ_УЗЕЛ проверить только отношение Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ файловым "
+"узлом\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑке\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose выводить подробные ÑообщениÑ\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"ЕÑли каталог данных (КÐТ_ДÐÐÐЫХ) не задан, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ\n"
+"переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld МБ (%d%%) обработано"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать блок %u в файле \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "не удалоÑÑŒ прочитать блок %u в файле \"%s\" (прочитано байт: %d из %d)"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"ошибка контрольных Ñумм в файле \"%s\", блоке %u: вычиÑлена ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ "
+"Ñумма %X, но блок Ñодержит %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ошибка при переходе к блоку %u в файле \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать блок %u в файл \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "не удалоÑÑŒ запиÑать блок %u в файле \"%s\" (запиÑано байт: %d из %d)"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "контрольные Ñуммы в файле \"%s\" проверены"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "контрольные Ñуммы в файле \"%s\" включены"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:411
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "неверный номер Ñегмента %d в имени файла \"%s\""
+
+#: pg_checksums.c:508 pg_checksums.c:524 pg_checksums.c:534 pg_checksums.c:542
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_checksums.c:523
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_checksums.c:532
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_checksums.c:541
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "параметр -f/--filenode можно иÑпользовать только Ñ --check"
+
+#: pg_checksums.c:549
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "ошибка контрольного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² pg_control"
+
+#: pg_checksums.c:552
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "клаÑтер неÑовмеÑтим Ñ Ñтой верÑией pg_checksums"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "неÑовмеÑтимый клаÑтер баз данных"
+
+#: pg_checksums.c:557
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"КлаÑтер баз данных был инициализирован Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð¼ блока %u, а утилита "
+"pg_checksums Ñкомпилирована Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° блока %u."
+
+#: pg_checksums.c:569
+#, c-format
+msgid "cluster must be shut down"
+msgstr "клаÑтер должен быть отключён"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "контрольные Ñуммы в клаÑтере не включены"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "контрольные Ñуммы в клаÑтере уже отключены"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "контрольные Ñуммы в клаÑтере уже включены"
+
+#: pg_checksums.c:605
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Обработка контрольных Ñумм завершена\n"
+
+#: pg_checksums.c:606
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "ПроÑканировано файлов: %lld\n"
+
+#: pg_checksums.c:607
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "ПроÑканировано блоков: %lld\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Ðеверные контрольные Ñуммы: %lld\n"
+
+#: pg_checksums.c:611 pg_checksums.c:643
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм данных: %u\n"
+
+#: pg_checksums.c:618
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "ЗапиÑано файлов: %lld\n"
+
+#: pg_checksums.c:619
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "ЗапиÑано блоков: %lld\n"
+
+#: pg_checksums.c:635
+#, c-format
+msgid "syncing data directory"
+msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "updating control file"
+msgstr "Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего файла"
+
+#: pg_checksums.c:645
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Контрольные Ñуммы в клаÑтере включены\n"
+
+#: pg_checksums.c:647
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Контрольные Ñуммы в клаÑтере отключены\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "неверное указание файлового узла, требуетÑÑ Ñ‡Ð¸Ñло: %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
diff --git a/src/bin/pg_checksums/po/sv.po b/src/bin/pg_checksums/po/sv.po
new file mode 100644
index 0000000..8e92a9e
--- /dev/null
+++ b/src/bin/pg_checksums/po/sv.po
@@ -0,0 +1,329 @@
+# Swedish message translation file for pg_checksums
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:52+0000\n"
+"PO-Revision-Date: 2022-05-09 21:46+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s slår på, slår av eller verifierar datakontrollsummor i ett PostgreSQL databaskluster.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [FLAGGA]... [DATAKATALOG]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATAKAT datakatalog\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check kontrollera datakontrollsummor (standard)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable slå av datakontrollsummor\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable slå på datakontrollsummor\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILNOD kontrollera bara relation med angiven filnod\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose visa utförliga meddelanden\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om ingen datakatalog (DATAKATALOG) har angivits så nyttjas omgivningsvariabeln\n"
+"PGDATA för detta syfte.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) beräknad"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "kunde inte läsa block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "kunde inte läsa block %u i fil \"%s\": läste %d av %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verifiering av kontrollsumma misslyckades i fil \"%s\", block %u: beräknad kontrollsumma är %X men blocket innehåller %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "seek misslyckades för block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "kunde inte skriva block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "kunde inte skriva block %u i fil \"%s\": skrev %d av %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "kontrollsummor verifierade i fil \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "kontrollsummor påslagen i fil \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ogiltigt segmentnummer %d i filnamn \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "inställningen -f/--filenode tillåts bara med --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC-värde är inkorrekt"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "klustret är inte kompatibelt med denna version av pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "databasklustret är inte kompatibelt"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Databasklustret initierades med blockstorlek %u men pg_checksums kompilerades med blockstorlek %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "klustret måste stängas ner"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "datakontrollsummor är inte påslaget i klustret"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "datakontrollsummor är redan avslaget i klustret"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "datakontrollsummor är redan påslagna i klustret"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Kontrollsummeoperation avslutad\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Skannade filer: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Skannade block: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Felaktiga kontrollsummor: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Datakontrollsummeversion: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Skrivna filer: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Skrivna block: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synkar datakatalogen"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "uppdaterar kontrollfil"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Kontrollsummor påslaget i klustret\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Kontrollsummor avslaget i klustret\n"
diff --git a/src/bin/pg_checksums/po/tr.po b/src/bin/pg_checksums/po/tr.po
new file mode 100644
index 0000000..3bd40db
--- /dev/null
+++ b/src/bin/pg_checksums/po/tr.po
@@ -0,0 +1,304 @@
+# LANGUAGE message translation file for pg_checksums
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+# Abdullah GÃœLNER <agulner@gmail.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 12\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-06-17 07:45+0000\n"
+"PO-Revision-Date: 2019-06-17 14:27+0300\n"
+"Last-Translator: Abdullah GÃœLNER\n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../../src/common/logging.c:188
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/common/logging.c:195
+#, c-format
+msgid "error: "
+msgstr "hata (error): "
+
+#: ../../../src/common/logging.c:202
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: pg_checksums.c:75
+#, c-format
+msgid ""
+"%s enables, disables or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanı kümesinde, veri sağlama toplamlarını etkinleştirir, devre dışı bırakır veya doğrulamasını yapar.\n"
+"\n"
+
+#: pg_checksums.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_checksums.c:77
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [SEÇENEK]... [DATADIR]\n"
+
+#: pg_checksums.c:78
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_checksums.c:79
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR veri dizini\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check veri sağlama toplamlarını denetle (varsayılan)\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable veri sağlama toplamlarını devre dışı bırak\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable veri sağlama toplamlarını etkinleştir\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE sadece belirtilen filenode'lu nesneyi denetle\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync değişikliklerin diske yazılmasını bekleme\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress ilerleme bilgisini göster\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose detaylı (verbose) mesajlar göster\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer hiçbir veri dizini (DATADIR) belirtilmezse, PGDATA çevresel değişkeni\n"
+"kullanılır.\n"
+"\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr "Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_checksums.c:149
+#, c-format
+msgid "%*s/%s MB (%d%%) computed"
+msgstr "%*s/%s MB (%d%%) hesaplandı"
+
+#: pg_checksums.c:186
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" dosyası açılamıyor: %m"
+
+#: pg_checksums.c:201
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "\"%2$s\" dosyasında %1$u bloğu okunamadı: %4$d nin %3$d si okundu"
+
+#: pg_checksums.c:218
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "\"%s\" dosyasında sağlama toplamı doğrulaması başarısız oldu, blok %u: %X sağlama toplamı hesaplandı fakat blok %X içeriyor"
+
+#: pg_checksums.c:231
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "\"%2$s\" dosyasında %1$u bloğu için arama (seek) başarısız oldu: %3$m"
+
+#: pg_checksums.c:238
+#, c-format
+msgid "could not update checksum of block %u in file \"%s\": %m"
+msgstr "\"%2$s\" dosyasında %1$u bloğu güncellenemedi: %3$m"
+
+#: pg_checksums.c:251
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "\"%s\" dosyasında sağlama toplamları doğrulandı"
+
+#: pg_checksums.c:253
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "\"%s\" dosyasında sağlama toplamları etkinleştirildi"
+
+#: pg_checksums.c:278
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" dizini açılamıyor: %m"
+
+#: pg_checksums.c:305
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" dosyası durumlanamadı: %m"
+
+#: pg_checksums.c:332
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "\"%2$s\" dosyasında geçersiz segment numarası %1$d"
+
+#: pg_checksums.c:420
+#, c-format
+msgid "invalid filenode specification, must be numeric: %s"
+msgstr "geçersiz filenode tanımlaması, sayısal olmalı: %s"
+
+#: pg_checksums.c:438 pg_checksums.c:454 pg_checksums.c:464 pg_checksums.c:473
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: pg_checksums.c:453
+#, c-format
+msgid "no data directory specified"
+msgstr "hiçbir veri dizini belirtilmemiş"
+
+#: pg_checksums.c:462
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı argümanı (ilki \"%s\")"
+
+#: pg_checksums.c:472
+#, c-format
+msgid "--filenode option only possible with --check"
+msgstr "--filenode seçeneği sadece --check ile kullanılabilir"
+
+#: pg_checksums.c:482
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC değeri yanlış"
+
+#: pg_checksums.c:488
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "küme (cluster), pg_verify_checksums'ın bu sürümüyle uyumlu değil"
+
+#: pg_checksums.c:494
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "veritabanı kümesi uyumlu değil"
+
+#: pg_checksums.c:495
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"
+msgstr "Veritabanı kümesi (cluster) %u blok boyutu ile ilklendirilmiştir, ancak pg_checksums %u blok boyutu ile derlenmiştir.\n"
+
+#: pg_checksums.c:508
+#, c-format
+msgid "cluster must be shut down"
+msgstr "küme (cluster) kapatılmalı"
+
+#: pg_checksums.c:515
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "kümede (cluster) veri sağlama toplamaları etkinleştirilmemiş"
+
+#: pg_checksums.c:522
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "kümede (cluster) veri sağlama toplamları zaten devre dışı bırakılmış"
+
+#: pg_checksums.c:529
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "kümede (cluster) veri sağlama toplamları zaten etkinleştirilmiş"
+
+#: pg_checksums.c:558
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Sağlama toplamı işlemi tamamlandı\n"
+
+#: pg_checksums.c:559
+#, c-format
+msgid "Files scanned: %s\n"
+msgstr "Taranan dosyalar: %s\n"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "Blocks scanned: %s\n"
+msgstr "Taranan bloklar: %s\n"
+
+#: pg_checksums.c:563
+#, c-format
+msgid "Bad checksums: %s\n"
+msgstr "Yanlış sağlama toplamları: %s\n"
+
+#: pg_checksums.c:564 pg_checksums.c:591
+#, c-format
+msgid "Data checksum version: %d\n"
+msgstr "Veri sağlama toplamı sürümü: %d\n"
+
+#: pg_checksums.c:583
+#, c-format
+msgid "syncing data directory"
+msgstr "veri dizini senkronize ediliyor"
+
+#: pg_checksums.c:587
+#, c-format
+msgid "updating control file"
+msgstr "kontrol dosyası güncelleniyor"
+
+#: pg_checksums.c:593
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Kümede sağlama toplamları etkinleştirildi\n"
+
+#: pg_checksums.c:595
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Kümede sağlama toplamları devre dışı bırakıldı\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#~ msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+#~ msgstr " -N, --no-sync değişikliklerin diske yazılmasını bekleme\n"
diff --git a/src/bin/pg_checksums/po/uk.po b/src/bin/pg_checksums/po/uk.po
new file mode 100644
index 0000000..f27bd1e
--- /dev/null
+++ b/src/bin/pg_checksums/po/uk.po
@@ -0,0 +1,328 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:52+0000\n"
+"PO-Revision-Date: 2023-09-05 10:04+0200\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_checksums.pot\n"
+"X-Crowdin-File-ID: 888\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s активує, деактивує або перевірÑÑ” контрольні Ñуми даних в клаÑтері бази даних PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметри:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог даних\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check перевірити контрольні Ñуми даних (за замовчуваннÑм)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable вимкнути контрольні Ñуми даних\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable активувати контрольні Ñуми даних\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE перевірÑти Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ із вказаним файлом\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати на безпечний Ð·Ð°Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показати інформацію про прогреÑ\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose виводити детальні повідомленнÑ\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Якщо каталог даних не вказано (DATADIR), викориÑтовуєтьÑÑ Ð·Ð¼Ñ–Ð½Ð½Ð° Ñередовища PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) обчиÑлено"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %u в файлі \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %u у файлі \"%s\": прочитано %d з %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "помилка перевірки контрольних Ñум у файлі \"%s\", блок %u: обчиÑлена контрольна Ñума %X, але блок міÑтить %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "помилка пошуку Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒ %u у файлі \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блок %u у файл \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блок %u у файлі \"%s\": запиÑано %d з %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "контрольні Ñуми у файлі \"%s\" перевірені"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "контрольні Ñуми у файлі \"%s\" активовані"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "неприпуÑтимий номер Ñегменту %d в імені файлу \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "параметр -f/--filenode може бути викориÑтаний тільки з --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ CRC pg_control неправильне"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "клаÑтер не ÑуміÑний з цією верÑією pg_checksum"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "клаÑтер бази даних не ÑуміÑний"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "КлаÑтер бази даних було ініціалізовано з розміром блоку %u, але pg_checksums було Ñкомпільовано з розміром блоку %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "клаÑтер повинен бути закритий"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "контрольні Ñуми в клаÑтері неактивовані"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "контрольні Ñуми вже неактивовані в клаÑтері"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "контрольні Ñуми вже активовані в клаÑтері"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми завершена\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Файлів проÑкановано: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Блоків відÑкановано: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Помилкові контрольні Ñуми: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "ВерÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум даних: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Файлів запиÑано: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Блоків запиÑано: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… каталогу"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Контрольні Ñуми активовані в клаÑтері\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Контрольні Ñуми вимкнені у клаÑтері\n"
diff --git a/src/bin/pg_checksums/po/zh_CN.po b/src/bin/pg_checksums/po/zh_CN.po
new file mode 100644
index 0000000..012872b
--- /dev/null
+++ b/src/bin/pg_checksums/po/zh_CN.po
@@ -0,0 +1,308 @@
+# LANGUAGE message translation file for pg_checksums
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <zhangjie2@cn.fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-06-05 01:47+0000\n"
+"PO-Revision-Date: 2020-06-21 16:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@cn.fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@cn.fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: pg_checksums.c:75
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%så¯ç”¨ã€ç¦ç”¨æˆ–验è¯PostgreSQLæ•°æ®åº“群集中的数æ®æ ¡éªŒå’Œ.\n"
+"\n"
+
+#: pg_checksums.c:76
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_checksums.c:77
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [选项]... [DATADIR]\n"
+
+#: pg_checksums.c:78
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_checksums.c:79
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR æ•°æ®ç›®å½•\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check 检查数æ®æ ¡éªŒå’Œï¼ˆé»˜è®¤ï¼‰\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable ç¦ç”¨æ•°æ®æ ¡éªŒå’Œ\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable å¯ç”¨æ•°æ®æ ¡éªŒå’Œ\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 仅检查与指定filenode的关系\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ä¸ç”¨ç­‰å¾…å˜åŒ–安全写入ç£ç›˜\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 显示进度信æ¯\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 输出详细的消æ¯\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有指定数æ®ç›®å½•(DATADIR), 将使用\n"
+"环境å˜é‡PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至 <%s>.\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_checksums.c:161
+#, c-format
+msgid "%*s/%s MB (%d%%) computed"
+msgstr "已计算%*s/%s MB (%d%%)"
+
+#: pg_checksums.c:204
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: pg_checksums.c:220
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "无法在文件\"%2$s\"中读å–å—%1$u: %3$m"
+
+#: pg_checksums.c:223
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "无法读å–文件\"%2$s\"中的å—%1$u:读å–第%3$d个,共%4$d个"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "校验和验è¯åœ¨æ–‡ä»¶\"%s\"中失败,å—%u:计算的校验和 %X ,但å—åŒ…å« %X"
+
+#: pg_checksums.c:255
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "在文件\"%2$s\"中查找å—%1$u失败: %3$m"
+
+#: pg_checksums.c:264
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "无法在文件 \"%2$s\"中写入å—%1$u: %3$m"
+
+#: pg_checksums.c:267
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "无法对文件\"%2$s\"写æ“作数æ®å—%1$u: 已写入%3$d个,共%4$d个"
+
+#: pg_checksums.c:280
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "在文件\"%s\"中验è¯çš„校验和"
+
+#: pg_checksums.c:282
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "文件\"%s\"中å¯ç”¨çš„校验和"
+
+#: pg_checksums.c:307
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: pg_checksums.c:334 pg_checksums.c:413
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法å–文件 \"%s\" 的状æ€: %m"
+
+#: pg_checksums.c:361
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "文件å\"%2$s\"中的无效段å·%1$d"
+
+#: pg_checksums.c:494
+#, c-format
+msgid "invalid filenode specification, must be numeric: %s"
+msgstr "filenode指定无效,必须是数字: %s"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:547
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "未指定数æ®ç›®å½•"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多(第一个是\"%s\")"
+
+#: pg_checksums.c:546
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr " -f/--filenode选项åªèƒ½ä¸Ž--check一起使用"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_controlçš„CRC值ä¸æ­£ç¡® "
+
+#: pg_checksums.c:562
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "群集与此版本的pg_checksumsä¸å…¼å®¹â€"
+
+#: pg_checksums.c:568
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "æ•°æ®åº“群集ä¸å…¼å®¹"
+
+#: pg_checksums.c:569
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"
+msgstr "æ•°æ®åº“群集是用å—大å°%uåˆå§‹åŒ–的,但pg_checksums是用å—大å°%u编译的.\n"
+
+#: pg_checksums.c:582
+#, c-format
+msgid "cluster must be shut down"
+msgstr "必须关闭群集"
+
+#: pg_checksums.c:589
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "群集中未å¯ç”¨æ•°æ®æ ¡éªŒå’Œ"
+
+#: pg_checksums.c:596
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "群集中已ç¦ç”¨æ•°æ®æ ¡éªŒå’Œ"
+
+#: pg_checksums.c:603
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "群集中已å¯ç”¨æ•°æ®æ ¡éªŒå’Œ"
+
+#: pg_checksums.c:632
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "校验和æ“作已完æˆ\n"
+
+#: pg_checksums.c:633
+#, c-format
+msgid "Files scanned: %s\n"
+msgstr "扫æ的文件: %s\n"
+
+#: pg_checksums.c:634
+#, c-format
+msgid "Blocks scanned: %s\n"
+msgstr "扫æçš„å—: %s\n"
+
+#: pg_checksums.c:637
+#, c-format
+msgid "Bad checksums: %s\n"
+msgstr "å校验和: %s\n"
+
+#: pg_checksums.c:638 pg_checksums.c:665
+#, c-format
+msgid "Data checksum version: %d\n"
+msgstr "æ•°æ®æ ¡éªŒå’Œç‰ˆæœ¬: %d\n"
+
+#: pg_checksums.c:657
+#, c-format
+msgid "syncing data directory"
+msgstr "åŒæ­¥æ•°æ®ç›®å½•"
+
+#: pg_checksums.c:661
+#, c-format
+msgid "updating control file"
+msgstr "正在更新控制文件"
+
+#: pg_checksums.c:667
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "群集中å¯ç”¨çš„校验和\n"
+
+#: pg_checksums.c:669
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "在群集中ç¦ç”¨æ ¡éªŒå’Œ\n" \ No newline at end of file
diff --git a/src/bin/pg_checksums/po/zh_TW.po b/src/bin/pg_checksums/po/zh_TW.po
new file mode 100644
index 0000000..aafef8e
--- /dev/null
+++ b/src/bin/pg_checksums/po/zh_TW.po
@@ -0,0 +1,342 @@
+# Traditional Chinese message translation file for pg_checksums
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:52+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# utils/adt/formatting.c:2044
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "é¸é … %2$s 的值 \"%1$s\" 無效"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s å¯ä»¥å•Ÿå‹•ã€é—œé–‰æˆ–é©—è­‰ PostgreSQL 資料庫å¢é›†ä¸­çš„資料檢查碼。\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"é¸é …:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 資料目錄\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check 檢查資料檢查碼(é è¨­)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable 關閉資料檢查碼\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable 啟動資料檢查碼\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE åªæª¢æŸ¥æŒ‡å®š filenode çš„é—œè¯\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 顯示進度資訊\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 顯示詳細訊æ¯\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"若未指定資料目錄(DATADIR)就用環境變數 PGDATA。\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "回報錯誤至 <%s>。\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 已被計算"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案\"%s\": %m"
+
+# utils/init/miscinit.c:539
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "無法讀å–檔案 \"%2$s\" çš„ block %1$u: %3$m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "無法讀å–檔案 \"%2$s\" çš„ block %1$u: å·²è®€å– %3$d / %4$d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "在檔案 \"%s\" 驗證檢查碼失敗,å€å¡Š %u: 算得檢查碼 %X 但是å€å¡Šç‚º %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "在檔案 \"%2$s\" 中 seek å€å¡Š %1$u 失敗: %3$m"
+
+# utils/init/miscinit.c:672 utils/init/miscinit.c:682
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "無法寫入檔案 \"%2$s\" 的 block %1$u: %3$m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "無法寫入檔案 \"%2$s\" 中的å€å¡Š %1$u: 已寫入 %3$d / %4$d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "檔案 \"%s\" 中已驗證檢查碼"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "檔案 \"%s\" 中已啟動檢查碼"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄\"%s\": %m"
+
+# access/transam/xlog.c:1936 access/transam/xlog.c:2038
+# access/transam/xlog.c:5291
+#: pg_checksums.c:342 pg_checksums.c:411
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "無法å–得檔案 \"%s\" 的狀態: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "檔å \"%2$s\" 中的片段編號 %1$d 無效"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_checksums.c:508 pg_checksums.c:524 pg_checksums.c:534 pg_checksums.c:542
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_checksums.c:523
+#, c-format
+msgid "no data directory specified"
+msgstr "未指定資料目錄"
+
+#: pg_checksums.c:532
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_checksums.c:541
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "é¸é … -f/--filenode åªèƒ½èˆ‡ --check 一起使用"
+
+#: pg_checksums.c:549
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control çš„ CRC 值ä¸æ­£ç¢º"
+
+#: pg_checksums.c:552
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "å¢é›†èˆ‡é€™ç‰ˆ pg_checksums ä¸ç›¸å®¹"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "資料庫å¢é›†ä¸ç›¸å®¹"
+
+#: pg_checksums.c:557
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "資料庫å¢é›†ä½¿ç”¨å€å¡Šå¤§å° %u 進行åˆå§‹åŒ–,但 pg_checksums 編譯時使用å€å¡Šå¤§å° %u。"
+
+#: pg_checksums.c:569
+#, c-format
+msgid "cluster must be shut down"
+msgstr "必須關閉å¢é›†"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "å¢é›†æœªå•Ÿå‹•è³‡æ–™æª¢æŸ¥ç¢¼"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "å¢é›†å·²é—œé–‰è³‡æ–™æª¢æŸ¥ç¢¼"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "å¢é›†å·²å•Ÿå‹•è³‡æ–™æª¢æŸ¥ç¢¼"
+
+#: pg_checksums.c:605
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "驗證檢查碼作業完æˆ\n"
+
+#: pg_checksums.c:606
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "已掃æ檔案: %lld\n"
+
+#: pg_checksums.c:607
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "已掃æå€å¡Š: %lld\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "ä¸æ­£ç¢ºçš„檢查碼: %lld\n"
+
+#: pg_checksums.c:611 pg_checksums.c:643
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "資料檢查碼版本: %u\n"
+
+#: pg_checksums.c:618
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "已寫入檔案: %lld\n"
+
+#: pg_checksums.c:619
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "已寫入å€å¡Š: %lld\n"
+
+#: pg_checksums.c:635
+#, c-format
+msgid "syncing data directory"
+msgstr "åŒæ­¥è³‡æ–™ç›®éŒ„"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "updating control file"
+msgstr "更新控制檔"
+
+#: pg_checksums.c:645
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "å¢é›†å·²å•Ÿå‹•æª¢æŸ¥ç¢¼\n"
+
+#: pg_checksums.c:647
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "å¢é›†å·²é—œé–‰æª¢æŸ¥ç¢¼\n"
diff --git a/src/bin/pg_checksums/t/001_basic.pl b/src/bin/pg_checksums/t/001_basic.pl
new file mode 100644
index 0000000..d3601a5
--- /dev/null
+++ b/src/bin/pg_checksums/t/001_basic.pl
@@ -0,0 +1,13 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_checksums');
+program_version_ok('pg_checksums');
+program_options_handling_ok('pg_checksums');
+
+done_testing();
diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl
new file mode 100644
index 0000000..2d63182
--- /dev/null
+++ b/src/bin/pg_checksums/t/002_actions.pl
@@ -0,0 +1,253 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Do basic sanity checks supported by pg_checksums using
+# an initialized cluster.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+
+# Utility routine to create and check a table with corrupted checksums
+# on a wanted tablespace. Note that this stops and starts the node
+# multiple times to perform the checks, leaving the node started
+# at the end.
+sub check_relation_corruption
+{
+ my $node = shift;
+ my $table = shift;
+ my $tablespace = shift;
+ my $pgdata = $node->data_dir;
+
+ # Create table and discover its filesystem location.
+ $node->safe_psql(
+ 'postgres',
+ "CREATE TABLE $table AS SELECT a FROM generate_series(1,10000) AS a;
+ ALTER TABLE $table SET (autovacuum_enabled=false);");
+
+ $node->safe_psql('postgres',
+ "ALTER TABLE " . $table . " SET TABLESPACE " . $tablespace . ";");
+
+ my $file_corrupted =
+ $node->safe_psql('postgres', "SELECT pg_relation_filepath('$table');");
+ my $relfilenode_corrupted = $node->safe_psql('postgres',
+ "SELECT relfilenode FROM pg_class WHERE relname = '$table';");
+
+ $node->stop;
+
+ # Checksums are correct for single relfilenode as the table is not
+ # corrupted yet.
+ command_ok(
+ [
+ 'pg_checksums', '--check',
+ '-D', $pgdata,
+ '--filenode', $relfilenode_corrupted
+ ],
+ "succeeds for single relfilenode on tablespace $tablespace with offline cluster"
+ );
+
+ # Time to create some corruption
+ $node->corrupt_page_checksum($file_corrupted, 0);
+
+ # Checksum checks on single relfilenode fail
+ $node->command_checks_all(
+ [
+ 'pg_checksums', '--check',
+ '-D', $pgdata,
+ '--filenode', $relfilenode_corrupted
+ ],
+ 1,
+ [qr/Bad checksums:.*1/],
+ [qr/checksum verification failed/],
+ "fails with corrupted data for single relfilenode on tablespace $tablespace"
+ );
+
+ # Global checksum checks fail as well
+ $node->command_checks_all(
+ [ 'pg_checksums', '--check', '-D', $pgdata ],
+ 1,
+ [qr/Bad checksums:.*1/],
+ [qr/checksum verification failed/],
+ "fails with corrupted data on tablespace $tablespace");
+
+ # Drop corrupted table again and make sure there is no more corruption.
+ $node->start;
+ $node->safe_psql('postgres', "DROP TABLE $table;");
+ $node->stop;
+ $node->command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds again after table drop on tablespace $tablespace");
+
+ $node->start;
+ return;
+}
+
+# Initialize node with checksums disabled.
+my $node = PostgreSQL::Test::Cluster->new('node_checksum');
+$node->init();
+my $pgdata = $node->data_dir;
+
+# Control file should know that checksums are disabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*0/,
+ 'checksums disabled in control file');
+
+# These are correct but empty files, so they should pass through.
+append_to_file "$pgdata/global/99999", "";
+append_to_file "$pgdata/global/99999.123", "";
+append_to_file "$pgdata/global/99999_fsm", "";
+append_to_file "$pgdata/global/99999_init", "";
+append_to_file "$pgdata/global/99999_vm", "";
+append_to_file "$pgdata/global/99999_init.123", "";
+append_to_file "$pgdata/global/99999_fsm.123", "";
+append_to_file "$pgdata/global/99999_vm.123", "";
+
+# These are temporary files and folders with dummy contents, which
+# should be ignored by the scan.
+append_to_file "$pgdata/global/pgsql_tmp_123", "foo";
+mkdir "$pgdata/global/pgsql_tmp";
+append_to_file "$pgdata/global/pgsql_tmp/1.1", "foo";
+append_to_file "$pgdata/global/pg_internal.init", "foo";
+append_to_file "$pgdata/global/pg_internal.init.123", "foo";
+
+# Enable checksums.
+command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "checksums successfully enabled in cluster");
+
+# Successive attempt to enable checksums fails.
+command_fails([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "enabling checksums fails if already enabled");
+
+# Control file should know that checksums are enabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*1/,
+ 'checksums enabled in control file');
+
+# Disable checksums again. Flush result here as that should be cheap.
+command_ok(
+ [ 'pg_checksums', '--disable', '-D', $pgdata ],
+ "checksums successfully disabled in cluster");
+
+# Successive attempt to disable checksums fails.
+command_fails(
+ [ 'pg_checksums', '--disable', '--no-sync', '-D', $pgdata ],
+ "disabling checksums fails if already disabled");
+
+# Control file should know that checksums are disabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*0/,
+ 'checksums disabled in control file');
+
+# Enable checksums again for follow-up tests.
+command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "checksums successfully enabled in cluster");
+
+# Control file should know that checksums are enabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*1/,
+ 'checksums enabled in control file');
+
+# Checksums pass on a newly-created cluster
+command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds with offline cluster");
+
+# Checksums are verified if no other arguments are specified
+command_ok(
+ [ 'pg_checksums', '-D', $pgdata ],
+ "verifies checksums as default action");
+
+# Specific relation files cannot be requested when action is --disable
+# or --enable.
+command_fails(
+ [ 'pg_checksums', '--disable', '--filenode', '1234', '-D', $pgdata ],
+ "fails when relfilenodes are requested and action is --disable");
+command_fails(
+ [ 'pg_checksums', '--enable', '--filenode', '1234', '-D', $pgdata ],
+ "fails when relfilenodes are requested and action is --enable");
+
+# Test postgres -C for an offline cluster.
+# Run-time GUCs are safe to query here. Note that a lock file is created,
+# then removed, leading to an extra LOG entry showing in stderr. This uses
+# log_min_messages=fatal to remove any noise. This test uses a startup
+# wrapped with pg_ctl to allow the case where this runs under a privileged
+# account on Windows.
+command_checks_all(
+ [
+ 'pg_ctl', 'start', '-D', $pgdata, '-s', '-o',
+ '-C data_checksums -c log_min_messages=fatal'
+ ],
+ 1,
+ [qr/^on$/],
+ [qr/could not start server/],
+ 'data_checksums=on is reported on an offline cluster');
+
+# Checks cannot happen with an online cluster
+$node->start;
+command_fails([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "fails with online cluster");
+
+# Check corruption of table on default tablespace.
+check_relation_corruption($node, 'corrupt1', 'pg_default');
+
+# Create tablespace to check corruptions in a non-default tablespace.
+my $basedir = $node->basedir;
+my $tablespace_dir = "$basedir/ts_corrupt_dir";
+mkdir($tablespace_dir);
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE ts_corrupt LOCATION '$tablespace_dir';");
+check_relation_corruption($node, 'corrupt2', 'ts_corrupt');
+
+# Utility routine to check that pg_checksums is able to detect
+# correctly-named relation files filled with some corrupted data.
+sub fail_corrupt
+{
+ my $node = shift;
+ my $file = shift;
+ my $pgdata = $node->data_dir;
+
+ # Create the file with some dummy data in it.
+ my $file_name = "$pgdata/global/$file";
+ append_to_file $file_name, "foo";
+
+ $node->command_checks_all(
+ [ 'pg_checksums', '--check', '-D', $pgdata ],
+ 1,
+ [qr/^$/],
+ [qr/could not read block 0 in file.*$file\":/],
+ "fails for corrupted data in $file");
+
+ # Remove file to prevent future lookup errors on conflicts.
+ unlink $file_name;
+ return;
+}
+
+# Stop instance for the follow-up checks.
+$node->stop;
+
+# Create a fake tablespace location that should not be scanned
+# when verifying checksums.
+mkdir "$tablespace_dir/PG_99_999999991/";
+append_to_file "$tablespace_dir/PG_99_999999991/foo", "123";
+command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds with foreign tablespace");
+
+# Authorized relation files filled with corrupted data cause the
+# checksum checks to fail. Make sure to use file names different
+# than the previous ones.
+fail_corrupt($node, "99990");
+fail_corrupt($node, "99990.123");
+fail_corrupt($node, "99990_fsm");
+fail_corrupt($node, "99990_init");
+fail_corrupt($node, "99990_vm");
+fail_corrupt($node, "99990_init.123");
+fail_corrupt($node, "99990_fsm.123");
+fail_corrupt($node, "99990_vm.123");
+
+done_testing();
diff --git a/src/bin/pg_config/.gitignore b/src/bin/pg_config/.gitignore
new file mode 100644
index 0000000..cc42247
--- /dev/null
+++ b/src/bin/pg_config/.gitignore
@@ -0,0 +1,2 @@
+/pg_config
+/tmp_check/
diff --git a/src/bin/pg_config/Makefile b/src/bin/pg_config/Makefile
new file mode 100644
index 0000000..1a405f9
--- /dev/null
+++ b/src/bin/pg_config/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_config
+#
+# Copyright (c) 1998-2023, PostgreSQL Global Development Group
+#
+# src/bin/pg_config/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_config - report configuration information"
+PGAPPICON=win32
+
+subdir = src/bin/pg_config
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_config.o
+
+all: pg_config
+
+pg_config: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_SCRIPT) pg_config$(X) '$(DESTDIR)$(bindir)/pg_config$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_config$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_config$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build
new file mode 100644
index 0000000..7fd7e94
--- /dev/null
+++ b/src/bin/pg_config/meson.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_config_sources = files(
+ 'pg_config.c',
+)
+
+if host_system == 'windows'
+ pg_config_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_config',
+ '--FILEDESC', 'pg_config - report configuration information',])
+endif
+
+pg_config = executable('pg_config',
+ pg_config_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_config
+
+tests += {
+ 'name': 'pg_config',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_pg_config.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_config/nls.mk b/src/bin/pg_config/nls.mk
new file mode 100644
index 0000000..d86c28c
--- /dev/null
+++ b/src/bin/pg_config/nls.mk
@@ -0,0 +1,3 @@
+# src/bin/pg_config/nls.mk
+CATALOG_NAME = pg_config
+GETTEXT_FILES = pg_config.c ../../common/config_info.c ../../common/exec.c
diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c
new file mode 100644
index 0000000..70cab81
--- /dev/null
+++ b/src/bin/pg_config/pg_config.c
@@ -0,0 +1,189 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_config.c
+ *
+ * This program reports various pieces of information about the
+ * installed version of PostgreSQL. Packages that interface to
+ * PostgreSQL can use it to configure their build.
+ *
+ * This is a C implementation of the previous shell script written by
+ * Peter Eisentraut <peter_e@gmx.net>, with adjustments made to
+ * accommodate the possibility that the installation has been relocated from
+ * the place originally configured.
+ *
+ * author of C translation: Andrew Dunstan mailto:andrew@dunslane.net
+ *
+ * This code is released under the terms of the PostgreSQL License.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/pg_config/pg_config.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "common/config_info.h"
+#include "port.h"
+
+static const char *progname;
+
+/*
+ * Table of known information items
+ *
+ * Be careful to keep this in sync with the help() display.
+ */
+typedef struct
+{
+ const char *switchname;
+ const char *configname;
+} InfoItem;
+
+static const InfoItem info_items[] = {
+ {"--bindir", "BINDIR"},
+ {"--docdir", "DOCDIR"},
+ {"--htmldir", "HTMLDIR"},
+ {"--includedir", "INCLUDEDIR"},
+ {"--pkgincludedir", "PKGINCLUDEDIR"},
+ {"--includedir-server", "INCLUDEDIR-SERVER"},
+ {"--libdir", "LIBDIR"},
+ {"--pkglibdir", "PKGLIBDIR"},
+ {"--localedir", "LOCALEDIR"},
+ {"--mandir", "MANDIR"},
+ {"--sharedir", "SHAREDIR"},
+ {"--sysconfdir", "SYSCONFDIR"},
+ {"--pgxs", "PGXS"},
+ {"--configure", "CONFIGURE"},
+ {"--cc", "CC"},
+ {"--cppflags", "CPPFLAGS"},
+ {"--cflags", "CFLAGS"},
+ {"--cflags_sl", "CFLAGS_SL"},
+ {"--ldflags", "LDFLAGS"},
+ {"--ldflags_ex", "LDFLAGS_EX"},
+ {"--ldflags_sl", "LDFLAGS_SL"},
+ {"--libs", "LIBS"},
+ {"--version", "VERSION"},
+ {NULL, NULL}
+};
+
+
+static void
+help(void)
+{
+ printf(_("\n%s provides information about the installed version of PostgreSQL.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" --bindir show location of user executables\n"));
+ printf(_(" --docdir show location of documentation files\n"));
+ printf(_(" --htmldir show location of HTML documentation files\n"));
+ printf(_(" --includedir show location of C header files of the client\n"
+ " interfaces\n"));
+ printf(_(" --pkgincludedir show location of other C header files\n"));
+ printf(_(" --includedir-server show location of C header files for the server\n"));
+ printf(_(" --libdir show location of object code libraries\n"));
+ printf(_(" --pkglibdir show location of dynamically loadable modules\n"));
+ printf(_(" --localedir show location of locale support files\n"));
+ printf(_(" --mandir show location of manual pages\n"));
+ printf(_(" --sharedir show location of architecture-independent support files\n"));
+ printf(_(" --sysconfdir show location of system-wide configuration files\n"));
+ printf(_(" --pgxs show location of extension makefile\n"));
+ printf(_(" --configure show options given to \"configure\" script when\n"
+ " PostgreSQL was built\n"));
+ printf(_(" --cc show CC value used when PostgreSQL was built\n"));
+ printf(_(" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"));
+ printf(_(" --cflags show CFLAGS value used when PostgreSQL was built\n"));
+ printf(_(" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"));
+ printf(_(" --ldflags show LDFLAGS value used when PostgreSQL was built\n"));
+ printf(_(" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"));
+ printf(_(" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"));
+ printf(_(" --libs show LIBS value used when PostgreSQL was built\n"));
+ printf(_(" --version show the PostgreSQL version\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nWith no arguments, all known items are shown.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+static void
+advice(void)
+{
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+}
+
+static void
+show_item(const char *configname,
+ ConfigData *configdata,
+ size_t configdata_len)
+{
+ int i;
+
+ for (i = 0; i < configdata_len; i++)
+ {
+ if (strcmp(configname, configdata[i].name) == 0)
+ printf("%s\n", configdata[i].setting);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ ConfigData *configdata;
+ size_t configdata_len;
+ char my_exec_path[MAXPGPATH];
+ int i;
+ int j;
+
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_config"));
+
+ progname = get_progname(argv[0]);
+
+ /* check for --help */
+ for (i = 1; i < argc; i++)
+ {
+ if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-?") == 0)
+ {
+ help();
+ exit(0);
+ }
+ }
+
+ if (find_my_exec(argv[0], my_exec_path) < 0)
+ {
+ fprintf(stderr, _("%s: could not find own program executable\n"), progname);
+ exit(1);
+ }
+
+ configdata = get_configdata(my_exec_path, &configdata_len);
+ /* no arguments -> print everything */
+ if (argc < 2)
+ {
+ for (i = 0; i < configdata_len; i++)
+ printf("%s = %s\n", configdata[i].name, configdata[i].setting);
+ exit(0);
+ }
+
+ /* otherwise print requested items */
+ for (i = 1; i < argc; i++)
+ {
+ for (j = 0; info_items[j].switchname != NULL; j++)
+ {
+ if (strcmp(argv[i], info_items[j].switchname) == 0)
+ {
+ show_item(info_items[j].configname,
+ configdata, configdata_len);
+ break;
+ }
+ }
+ if (info_items[j].switchname == NULL)
+ {
+ fprintf(stderr, _("%s: invalid argument: %s\n"),
+ progname, argv[i]);
+ advice();
+ exit(1);
+ }
+ }
+
+ return 0;
+}
diff --git a/src/bin/pg_config/po/LINGUAS b/src/bin/pg_config/po/LINGUAS
new file mode 100644
index 0000000..b4b51da
--- /dev/null
+++ b/src/bin/pg_config/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko nb pl pt_BR ro ru sv ta tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_config/po/cs.po b/src/bin/pg_config/po/cs.po
new file mode 100644
index 0000000..9a61683
--- /dev/null
+++ b/src/bin/pg_config/po/cs.po
@@ -0,0 +1,280 @@
+# Czech message translation file for pg_config
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:14+0000\n"
+"PO-Revision-Date: 2020-10-31 21:30+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "nezaznamenáno"
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze Äíst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít soubor \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze pÅ™eÄíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s poskytuje informace o nainstalované verzi PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [PŘEPÃNAÄŒ]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "PÅ™epínaÄe:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir ukáže umístění spustitelných souborů\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir ukáže umístění souborů s dokumentací\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir ukáže umístění souborl s HTML dokumentací\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir ukáže umístÄ›ní C hlaviÄkových souborů klientských\n"
+" rozhraní\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir ukáže umístÄ›ní dalších C hlaviÄkových souborů\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server ukáže umístÄ›ní C hlaviÄkových souborů pro server\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir ukáže umístění knihoven\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir ukáže umístění dynamicky zaváděných modulů\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir ukáže umístění souborů pro podporu locale\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir ukáže umístění souborů s manuálovými stránkami\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir ukáže umístění podpůrných souborů nezávislých na architektuře\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir ukáže umístÄ›ní konfiguraÄních souborů platných pro celý systém\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs ukáže umístění makefile souboru pro rozšíření\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure ukáže pÅ™epínaÄe použité pro \"configure\" skript ke\n"
+" kompilaci PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc ukáže hodnotu CC použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags ukáže hodnotu CPPFLAGS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags ukáže hodnotu CFLAGS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl ukáže hodnotu CFLAGS_SL použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags ukáže hodnotu LDFLAGS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex ukáže hodnotu LDFLAGS_EX použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl ukáže hodnotu LDFLAGS_SL použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs ukáže hodnotu LIBS použitou při buildu PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version ukáže verzi PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovÄ›du, a skonÄí\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Bez argumentů jsou vypsány všechny známé položky.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: neplatný parametr: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze Äíst symbolický link \"%s\""
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "potomek skonÄil s návratovým kódem %d"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "potomek byl ukonÄen vyjímkou 0x%X"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukonÄen signálem %s"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "potomek byl ukonÄen signálem %d"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "potomek skonÄil s nerozponaným stavem %d"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Oznámení o chybách zasílejte na <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_config/po/de.po b/src/bin/pg_config/po/de.po
new file mode 100644
index 0000000..f20b719
--- /dev/null
+++ b/src/bin/pg_config/po/de.po
@@ -0,0 +1,255 @@
+# German message translation file for pg_config
+# Peter Eisentraut <peter@eisentraut.org>, 2004 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-22 16:18+0000\n"
+"PO-Revision-Date: 2023-04-22 23:05+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "nicht aufgezeichnet"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ungültige Programmdatei »%s«: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "konnte Programmdatei »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s gibt Informationen über die installierte Version von PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir zeige Installationsverzeichnis der Benutzerprogramme\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir zeige Installationsverzeichnis der Dokumentation\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir zeige Installationsverzeichnis der HTML-Dokumentation\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir zeige Installationsverzeichnis der Headerdateien der\n"
+" Client-Schnittstellen\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir zeige Installationsverzeichnis von weiteren Headerdateien\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server zeige Installationsverzeichnis der Headerdateien des\n"
+" Servers\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir zeige Installationsverzeichnis der Objektbibliotheken\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir zeige Installationsverzeichnis der dynamisch\n"
+" ladbaren Module\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir zeige Installationsverzeichnis der Locale-Dateien\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir zeige Installationsverzeichnis der Manpages\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir zeige Installationsverzeichnis der architektur-\n"
+" unabhängigen Datendateien\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir zeige Installationsverzeichnis der systemweiten\n"
+" Konfigurationsdateien\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs zeige Ort der Erweiterungs-Makefile\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure zeige Optionen des »configure«-Skriptes beim Bauen\n"
+" von PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc zeige CC-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags zeige CPPFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags zeige CFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl zeige CFLAGS_SL-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags zeige LDFLAGS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex zeige LDFLAGS_EX-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl zeige LDFLAGS_SL-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs zeige LIBS-Wert, mit dem PostgreSQL gebaut wurde\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version zeige PostgreSQL-Version\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Ohne Argumente werden alle bekannten Informationen angezeigt.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: konnte eigene Programmdatei nicht finden\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: ungültiges Argument: %s\n"
diff --git a/src/bin/pg_config/po/el.po b/src/bin/pg_config/po/el.po
new file mode 100644
index 0000000..422d6d1
--- /dev/null
+++ b/src/bin/pg_config/po/el.po
@@ -0,0 +1,265 @@
+# Greek message translation file for pg_config
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:17+0000\n"
+"PO-Revision-Date: 2023-08-15 13:21+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "δεν έχει καταγÏαφεί"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s παÏέχει πληÏοφοÏίες σχετικά με την εγκατεστημένη έκδοση της PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [ΕΠΙΛΟΓΗ]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir εμφάνισε τη τοποθεσία των εκτελέσιμων αÏχείων του χÏήστη\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir εμφάνισε τη τοποθεσία των αÏχείων τεκμηÏίωσης\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir εμφάνισε τη τοποθεσία των αÏχείων τεκμηÏίωσης HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir εμφάνισε τη τοποθεσία των αÏχείων κεφαλίδας C\n"
+" των διεπαφών πελάτη\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir εμφάνισε τη τοποθεσία άλλων αÏχείων κεφαλίδας C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server εμφάνισε τη τοποθεσία των αÏχείων κεφαλίδας C για τον διακομιστή\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir εμφάνισε τη τοποθεσία των βιβλιοθηκών κώδικα αντικειμένων\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir εμφάνισε τη τοποθεσία των δυναμικά φοÏτώσιμων ενοτήτων\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir εμφάνισε τη τοποθεσία των αÏχείων υποστήÏιξης εντοπιότητας\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir εμφάνισε τη τοποθεσία των σελίδων τεκμηÏίωσης\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir εμφάνισε τη τοποθεσία των ανεξάÏτητων από την αÏχιτεκτονική αÏχείων υποστήÏιξης\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir εμφάνισε την τοποθεσία των αÏχείων ÏÏθμισης παÏαμέτÏων όλου του συστήματος\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs εμφάνισε τη τοποθεσία του makefile επέκτασης\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure εμφάνισε τις παÏαμέτÏους που δόθηκαν ώστε να «Ïυθμιστεί» το σενάÏιο\n"
+" κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc εμφάνισε την τιμή CC που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags εμφάνισε την τιμή CPPFLAGS που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags εμφάνισε την τιμή CFLAGS που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl εμφάνισε την τιμή CFLAGS_SL που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags εμφάνισε την τιμή LDFLAGS που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex εμφάνισε την τιμή LDFLAGS_EX που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl εμφάνισε την τιμή LDFLAGS_SL που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs εμφάνισε την τιμή LIBS που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version εμφάνισε την έκδοση PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"ΧωÏίς παÏαμέτÏους, εμφανίζονται όλα τα γνωστά στοιχεία.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: δεν ήταν δυνατή η εÏÏεση του ιδίου εκτελέσιμου Ï€ÏογÏάμματος\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: μη έγκυÏη παÏάμετÏος: %s\n"
+
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m"
+
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»"
+
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»"
diff --git a/src/bin/pg_config/po/es.po b/src/bin/pg_config/po/es.po
new file mode 100644
index 0000000..4ea5838
--- /dev/null
+++ b/src/bin/pg_config/po/es.po
@@ -0,0 +1,279 @@
+# pg_config spanish translation
+#
+# Copyright (c) 2004-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:18+0000\n"
+"PO-Revision-Date: 2023-05-22 12:05+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "no registrado"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binario «%s» no válido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "no se pudo leer el binario «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s provee información sobre la versión instalada de PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPCIÓN]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir muestra la ubicación de ejecutables de usuario\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir muestra la ubicación de archivos de documentación\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir muestra la ubicación de archivos de documentación HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir muestra la ubicación de archivos de encabezados C\n"
+" de las interfaces cliente\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir muestra la ubicación de otros archivos de\n"
+" encabezados C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server muestra la ubicación de archivos de encabezados C\n"
+" del servidor\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir muestra la ubicación de bibliotecas\n"
+" de código objeto\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir muestra la ubicación de módulos para carga dinámica\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir muestra la ubicación de archivos de soporte de\n"
+" configuraciones locales\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir muestra la ubicación de páginas de manual\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir muestra la ubicación de archivos de soporte\n"
+" independientes de arquitectura\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir muestra la ubicación de archivos de configuración\n"
+" global del sistema\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs muestra la ubicación del archivo makefile\n"
+" para extensiones\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure muestra las opciones que se dieron a «configure»\n"
+" cuando PostgreSQL fue construido\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc muestra el valor de CC cuando PostgreSQL fue construido\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags muestra el valor de CPPFLAGS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags muestra el valor de CFLAGS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl muestra el valor de CFLAGS_SL cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags muestra el valor de LDFLAGS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_ex muestra el valor de LDFLAGS_EX cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_sl muestra el valor de LDFLAGS_SL cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs muestra el valor de LIBS cuando PostgreSQL fue\n"
+" construido\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version muestra la versión de PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help muestra esta ayuda, luego sale\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se pasa ningún argumento, se muestra toda la información conocida\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Use «%s --help» para mayor información.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable propio\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: el argumento no es válido: %s\n"
diff --git a/src/bin/pg_config/po/fr.po b/src/bin/pg_config/po/fr.po
new file mode 100644
index 0000000..3517868
--- /dev/null
+++ b/src/bin/pg_config/po/fr.po
@@ -0,0 +1,333 @@
+# LANGUAGE message translation file for pg_config
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:18+0000\n"
+"PO-Revision-Date: 2023-07-30 08:09+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "non enregistré"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binaire « %s » invalide : %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "n'a pas pu lire le binaire « %s » : %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s fournit des informations sur la version installée de PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir affiche l'emplacement des exécutables utilisateur\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir affiche l'emplacement des fichiers de documentation\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir affiche l'emplacement des fichiers de documentation HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir affiche l'emplacement des fichiers d'en-tête C\n"
+" des interfaces client\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir affiche l'emplacement des autres fichiers d'en-tête C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server affiche l'emplacement des fichiers d'en-tête C du\n"
+" serveur\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir affiche l'emplacement des bibliothèques\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir affiche l'emplacement des modules chargeables\n"
+" dynamiquement\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir affiche l'emplacement des fichiers de support de la\n"
+" locale\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir affiche l'emplacement des pages man\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir affiche l'emplacement des fichiers de support\n"
+" indépendants de l'architecture\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir affiche l'emplacement des fichiers de configuration\n"
+" globaux du système\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs affiche l'emplacement du makefile des extensions\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure affiche les options passées au script « configure »\n"
+" lors de la construction de PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc affiche la valeur de CC utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags affiche la valeur de CPPFLAGS utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags affiche la valeur de CFLAGS utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl affiche la valeur de CFLAGS_SL utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags affiche la valeur de LDFLAGS utilisée à lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_ex affiche la valeur de LDFLAGS_EX utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_sl affiche la valeur de LDFLAGS_SL utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs affiche la valeur de LIBS utilisée lors de la\n"
+" construction de PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version affiche la version de PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Sans argument, tous les éléments connus sont affichés.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s : argument invalide : %s\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide puis quitte\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "le processus fils a été terminé par le signal %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#, c-format
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "n'a pas pu lire le binaire « %s »"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#, c-format
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "binaire « %s » invalide"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
diff --git a/src/bin/pg_config/po/he.po b/src/bin/pg_config/po/he.po
new file mode 100644
index 0000000..c8d2ab9
--- /dev/null
+++ b/src/bin/pg_config/po/he.po
@@ -0,0 +1,316 @@
+# Hebrew message translation file for pg_config
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldbrg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-16 22:38+0300\n"
+"PO-Revision-Date: 2017-05-16 22:56+0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Last-Translator: Michael Goldberg <mic.goldbrg@gmail.com>, 2017.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: he_IL\n"
+
+#: ../../common/config_info.c:131 ../../common/config_info.c:139
+#: ../../common/config_info.c:147 ../../common/config_info.c:155
+#: ../../common/config_info.c:163 ../../common/config_info.c:171
+#: ../../common/config_info.c:179 ../../common/config_info.c:187
+#: ../../common/config_info.c:195
+msgid "not recorded"
+msgstr "×œ× ×”×•×§×œ×˜"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "×œ× ×™×•×›×œ לזהות ×ת הספריה הנוכחית: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "בינ×רי ×œ× ×—×•×§×™ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×‘×™× ×רי \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× \"%s\" לביצוע"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "×œ× ×œ×©× ×•×ª לשנות ספריות ל \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת הקישור הסימבולי \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "נכשלpclose : %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"תכנית %s מספק מידע ×ודות הגירסה המותקנת של PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "×פשרויות:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ קבצי פעלה של משתמש\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr ""
+" --docdir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ קבצי תיעוד\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr ""
+" --htmldir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ קבצי תיעוד HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ קבצי כותרת C של ממשקי הלקוח\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ קבצי כותרות ×חרות C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-שרת\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ קבצי כותרות C עבור השרת\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir\n"
+"להציג ×ž×™×§×•× ×©×œ ספריות קוד ×ובייקט\n"
+
+#: pg_config.c:86
+#, c-format
+msgid ""
+" --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ ×ž×•×“×•×œ×™× × ×˜×¢× ×™× ×‘×ופן דינמי\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir\n"
+"להציג ×ž×™×§×•× ×©×œ קבצי תמיכה מקומיי×\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr ""
+" --mandir\n"
+"להציג ×ת ×”×ž×™×§×•× ×©×œ דפי הסבר (manual pages)\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir\n"
+"להציג ×ת ×ž×™×§×•× ×©×œ קבצי תמיכה ×שר ×œ× ×ª×œ×•×™×™× ×‘×רכיטקטורה\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir\n"
+"להציג ×ž×™×§×•× ×©×œ קבצי תצורה של המערכת כולה\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs\n"
+"להציג ×ž×™×§×•× ×©×œ makefile של הרחבה\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure\n"
+"להר×ות ×ת ×”×פשרויות שניתנו לסקירפט \"configure\", ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:94
+#, c-format
+msgid ""
+" --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" -cc\n"
+"להר×ות ערך CC ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cppflags\n"
+"להר×ות ערך CPPFLAGS ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags\n"
+"CFLAGS_SL\n"
+"להר×ות ערך CFLAGS ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+"\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cflags_sl\n"
+"להר×ות ערך CFLAGS_SL ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags\n"
+"להר×ות ערך LDFLAGS ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex\n"
+"להר×ות ערך LDFLAGS_EX ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl\n"
+"להר×ות ערך LDFLAGS_SL ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs\n"
+"להר×ות ערך LIBS ×שר ×”×™×” בשימוש ×›×שר PostgreSQL נבנה\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr ""
+" -version\n"
+"להר×ות ×ת הגירסה PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?\n"
+" --help\n"
+"להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"×œ×œ× ×רגומנטי×, ×ž×•×¦×’×™× ×›×œ ×”×¤×¨×™×˜×™× ×”×™×“×•×¢×™×.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ª×•×›× ×™×ª הפעלה משלו\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "תכנית %s: ×רגומנט ×œ× ×—×•×§×™: %s\n"
diff --git a/src/bin/pg_config/po/it.po b/src/bin/pg_config/po/it.po
new file mode 100644
index 0000000..17ddf95
--- /dev/null
+++ b/src/bin/pg_config/po/it.po
@@ -0,0 +1,297 @@
+#
+# pg_config.po
+# Italian message translation file for pg_config
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org> 2010
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:17+0000\n"
+"PO-Revision-Date: 2022-09-26 15:09+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "non registrato"
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "identificazione della directory corrente fallita: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s fornisce informazioni circa la versione di PostgreSQL installata.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPZIONE]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir mostra la posizione degli eseguibili utente\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir mostra la posizione dei file di documentazione\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir mostra la posizione dei file di documentazione HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir mostra la posizione dei file header C delle interfacce\n"
+" client\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir mostra la posizione degli altri file header C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server mostra la posizione dei file header C per il server\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir mostra la posizione delle librerie codice oggetto\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir mostra la posizione dei moduli caricabili dinamicamente\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir mostra la posizione dei file di supporto locale\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir mostra la posizione delle pagine del manuale\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir mostra la posizione dei file di supporto non dipendenti dall'architettura\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir mostra la posizione dei file di configurazione\n"
+" di sistema\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs mostra la posizione delle estensioni makefile\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure mostra le opzioni fornite allo script \"configure\"\n"
+" alla compilazione di PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc mostra il valore di CC usato alla compilazione di\n"
+" PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags mostra il valore di CPPFLAGS usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags mostra il valore di CFLAGS usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl mostra il valore di CFLAGS_SL usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags mostra il valore di LDFLAGS usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_ex mostra il valore di LDFLAGS_EX usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags_sl mostra il valore di LDFLAGS_SL usato alla compilazione\n"
+" di PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs mostra il valore LIBS usato alla compilazione di\n"
+" PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version mostra la versione di PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Senza argomenti, vengono mostrati tutti gli elementi conosciuti.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s pagina iniziale: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: il proprio programma eseguibile non è stato trovato\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: parametro non valido: %s\n"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
diff --git a/src/bin/pg_config/po/ja.po b/src/bin/pg_config/po/ja.po
new file mode 100644
index 0000000..b770bab
--- /dev/null
+++ b/src/bin/pg_config/po/ja.po
@@ -0,0 +1,247 @@
+# Japanese message translation file for pg_config
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-03-24 09:21+0900\n"
+"PO-Revision-Date: 2023-03-24 14:10+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "記録ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ä¸æ­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行ã™ã‚‹\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "メモリä¸è¶³ã§ã™"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%sã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚ŒãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®PostgreSQLã«é–¢ã™ã‚‹æƒ…報をæä¾›ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [オプション]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir ユーザー実行ファイルã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 文書ファイルã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir html文書ファイルã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " --includedir クライアントインタフェースã®Cヘッダファイルã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir ãã®ä»–ã®Cヘッダファイルã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server サーãƒãƒ¼ç”¨Cヘッダファイルã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir オブジェクトコードライブラリã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir 動的ロードå¯èƒ½ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir ロケールサãƒãƒ¼ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir マニュアルページã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir アーキテクãƒãƒ£éžä¾å­˜ã®ã‚µãƒãƒ¼ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir システム全体ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 機能拡張ã®makefileã®å ´æ‰€ã‚’表示\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL構築時ã«\"configure\"スクリプトã«ä¸ŽãˆãŸ\n"
+" オプションを表示\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸCCã®å€¤ã‚’表示\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸCPPFLAGSã®å€¤ã‚’表示\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸCFLAGSã®å€¤ã‚’表示\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸCFLAGS_SLã®å€¤ã‚’表示\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸLDFLAGSã®å€¤ã‚’表示\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸLDFLAGS_EXã®å€¤ã‚’表示\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸLDFLAGS_SLã®å€¤ã‚’表示\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL構築時ã«ä½¿ç”¨ã—ãŸLIBSã®å€¤ã‚’表示\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQLã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"引数ãŒãªã„å ´åˆã€æ—¢çŸ¥ã®é …目をã™ã¹ã¦è¡¨ç¤ºã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細ã¯\"%s --help\"ã‚’è¡Œã£ã¦ãã ã•ã„\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 実行ファイル自体ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: 無効ãªå¼•æ•°ã§ã™: %s\n"
diff --git a/src/bin/pg_config/po/ka.po b/src/bin/pg_config/po/ka.po
new file mode 100644
index 0000000..ee27824
--- /dev/null
+++ b/src/bin/pg_config/po/ka.po
@@ -0,0 +1,261 @@
+# Georgian message translation file for pg_config
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:17+0000\n"
+"PO-Revision-Date: 2023-04-20 08:19+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "ჩáƒáƒ¬áƒ”რილი áƒáƒ áƒáƒ"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ PostgreSQL-ის დáƒáƒ§áƒ”ნებული ვერსიის შესáƒáƒ®áƒ”ბ.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir HTML დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir კლიენტსი ინტერფეისის C თáƒáƒ•áƒ¡áƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის\n"
+" ჩვენებáƒ\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir დáƒáƒ áƒ©áƒ”ნილი C თáƒáƒ•áƒ¡áƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server სერვერის C-ის თáƒáƒ•áƒ¡áƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir áƒáƒ‘იექტის კáƒáƒ“ის ბიბლიáƒáƒ—ეკების მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir დინáƒáƒ›áƒ˜áƒ™áƒ£áƒ áƒáƒ“ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒáƒ“ი მáƒáƒ“ულების მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir ენის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir სáƒáƒ®áƒ”ლმძღვáƒáƒœáƒ”ლáƒáƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir áƒáƒ áƒ¥áƒ˜áƒ¢áƒ”ქტურისგáƒáƒœ დáƒáƒ›áƒáƒ£áƒ™áƒ˜áƒ“ებელი მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir სისტემური კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის makefile-ის მდებáƒáƒ áƒ”áƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ \"configure\" სკრიპტისთვის გáƒáƒ“áƒáƒªáƒ”მული\n"
+" პáƒáƒ áƒáƒ›áƒ”ტრების ჩვენებáƒ\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული CC-ის მნიშვნელáƒáƒ‘ის ჩვენებáƒ\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული CPPFLAGS-ის ჩვენებáƒ\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული CFLAGS-ის ჩვენებáƒ\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული CFLAGS_SL-ის ჩვენებáƒ\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL -ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული LDFLAGS-ის მნიშვნელáƒáƒ‘áƒ\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex PostgreSQL -ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული LDFLAGS_EX-ის მნიშვნელáƒáƒ‘áƒ\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული LDFLAGS_SL-ის ჩვენებáƒ\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL-ის áƒáƒ’ებისáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული LIBS-ის ჩვენებáƒ\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL-ის ვერსიის ჩვენებáƒ\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ áƒáƒ áƒ’უმენტებს áƒáƒ  მიუთითებთ, ნáƒáƒ©áƒ•áƒ”ნები იქნებრყველრცნáƒáƒ‘ილი ჩáƒáƒœáƒáƒ¬áƒ”რი.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•áƒœáƒ შეუძლებელიáƒ\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი: %s\n"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
diff --git a/src/bin/pg_config/po/ko.po b/src/bin/pg_config/po/ko.po
new file mode 100644
index 0000000..de90847
--- /dev/null
+++ b/src/bin/pg_config/po/ko.po
@@ -0,0 +1,265 @@
+# Korean message translation file for PostgreSQL pg_config
+# Ioseph Kim <ioseph@uri.sarang.net>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:48+0000\n"
+"PO-Revision-Date: 2023-05-26 13:20+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "기ë¡ë˜ì–´ 있지 ì•ŠìŒ"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행할 \"%s\" íŒŒì¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s í”„ë¡œê·¸ëž¨ì€ ì„¤ì¹˜ëœ PostgreSQL ë²„ì „ì— ëŒ€í•œ 정보를 제공합니다.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir 사용ìžê°€ 실행할 수 있는 ì‘ìš©í”„ë¡œê·¸ëž¨ë“¤ì´ ìžˆëŠ”\n"
+" 경로를 보여줌\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 문서 파ì¼ë“¤ì´ 있는 위치를 보여줌\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir HTML 문서 파ì¼ì˜ 위치를 보여줌\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir í´ë¼ì´ì–¸íŠ¸ ì¸í„°íŽ˜ì´ìŠ¤ì˜ C í—¤ë” íŒŒì¼ì´ 있는 경로를\n"
+" 보여줌\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir 기타 C í—¤ë” íŒŒì¼ ìœ„ì¹˜ë¥¼ 보여줌\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server 서버용 C í—¤ë” íŒŒì¼ ê²½ë¡œë¥¼ 보여줌\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir ë¼ì´ë¸ŒëŸ¬ë¦¬ 경로를 보여줌\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir ë™ì  호출 가능 ëª¨ë“ˆì˜ ê²½ë¡œë¥¼ 보여줌\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir ë¡œì¼€ì¸ ì§€ì› íŒŒì¼ë“¤ì˜ 위치를 보여줌\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir 맨페ì´ì§€ 위치를 보여줌\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir ê°ì¢… 공용으로 사용ë˜ëŠ” share 파ì¼ë“¤ì˜ 위치를 보여줌\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir 시스템 ì „ì—­ 환경 설정 파ì¼ì˜ 위치를 보여줌\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 확장 makefile 경로를 보여줌\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL 만들 ë•Œ 사용한 \"configure\" 스í¬ë¦½íŠ¸ì˜\n"
+" ì˜µì…˜ë“¤ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc PostgreSQL 만들 ë•Œ ì‚¬ìš©ëœ CC ê°’ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags PostgreSQL 만들 때 지정한 CPPFLAGS 값\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags PostgreSQL 만들 ë•Œ, 사용한 CFLAGS ê°’ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl PostgreSQL 만들 때 지정한 CFLAGS_SL 값\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags PostgreSQL 만들 ë•Œ, 사용한 LDFLAGS ê°’ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex PostgreSQL 만들 ë•Œ, 사용한 LDFLAGS_EX ê°’ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr " --ldflags_sl PostgreSQL 만들 때 지정한 LDFLAGS_SL 값\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL 만들 ë•Œ, 사용한 LIBS ê°’ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL ë²„ì „ì„ ë³´ì—¬ì¤Œ\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"명령행 ì¸ìˆ˜ê°€ 없으면 모든 í•­ëª©ì— ëŒ€í•œ 정보를 ë³´ì—¬ 줌\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 ìžì„¸í•œ ì •ë³´ê°€ 필요하면, \"%s --help\"\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 실행 가능한 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: ìž˜ëª»ëœ ì¸ìˆ˜: %s\n"
diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build
new file mode 100644
index 0000000..f515af8
--- /dev/null
+++ b/src/bin/pg_config/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_config-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_config/po/nb.po b/src/bin/pg_config/po/nb.po
new file mode 100644
index 0000000..05af975
--- /dev/null
+++ b/src/bin/pg_config/po/nb.po
@@ -0,0 +1,251 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 8.1\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2013-09-05 22:56-0400\n"
+"Last-Translator: Erik B. Ottesen <erikbagg@stud.ntnu.no>\n"
+"Language-Team: \n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Norwegian Bokmal\n"
+"X-Poedit-Country: NORWAY\n"
+
+#: pg_config.c:241
+#: pg_config.c:257
+#: pg_config.c:273
+#: pg_config.c:289
+#: pg_config.c:305
+#: pg_config.c:321
+#: pg_config.c:337
+#: pg_config.c:353
+#, c-format
+msgid "not recorded\n"
+msgstr "ikke bokført\n"
+
+#: pg_config.c:408
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s gir informasjon om den installerte versjonen av PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:409
+#, c-format
+msgid "Usage:\n"
+msgstr "Bruk:\n"
+
+#: pg_config.c:410
+#, c-format
+msgid ""
+" %s [ OPTION ... ]\n"
+"\n"
+msgstr ""
+" %s [ VALG ... ]\n"
+"\n"
+
+#: pg_config.c:411
+#, c-format
+msgid "Options:\n"
+msgstr "Valg:\n"
+
+#: pg_config.c:412
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir vis plasseringen til programfilene\n"
+
+#: pg_config.c:413
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir vis plasseringen til dokumentasjonsfilene\n"
+
+#: pg_config.c:414
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " --includedir vis plasseringen til C-deklarasjonsfilene for brukergrensesnittet\n"
+
+#: pg_config.c:416
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir vis plasseringen til andre C-deklarasjonsfilene\n"
+
+#: pg_config.c:417
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server vis plasseringen til C-deklarasjonsfilene for tjeneren\n"
+
+#: pg_config.c:418
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir vis plasseringen til kodebibliotekene\n"
+
+#: pg_config.c:419
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir vis plasseringen til de dynamiske modulene\n"
+
+#: pg_config.c:420
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir vis plasseringen til de lokale hjelpefilene\n"
+
+#: pg_config.c:421
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir vis plasseringen til manualfilene\n"
+
+#: pg_config.c:422
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir vis plasseringen til de arkitekturuavhengige hjelpefilene\n"
+
+#: pg_config.c:423
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir vis plasseringen til de globale konfigurasjonsfilene\n"
+
+#: pg_config.c:424
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs vis plasseringen til kompileringsfilen for tillegg\n"
+
+#: pg_config.c:425
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure vis alternativene gitt til «configure»-skriptet når\n"
+" PostgreSQL ble bygget\n"
+
+#: pg_config.c:427
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc vis verdien til CC brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:428
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags vis verdien til CPPFLAGS brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:429
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags vis verdien til CFLAGS brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:430
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl vis verdien til CFLAGS_SL brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:431
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags vis verdien til LDFLAGS brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:432
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl vis verdien til LDFLAGS_SL brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:433
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs vis verdien til LIBS brukt under bygging av PostgreSQL\n"
+
+#: pg_config.c:434
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version vis PostgreSQL-versjonen\n"
+
+#: pg_config.c:435
+#, c-format
+msgid " --help show this help, then exit\n"
+msgstr " --help vis denne hjelpetekst og avslutt\n"
+
+#: pg_config.c:436
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Uten noen argumenter er alle kjente elementer vist.\n"
+"\n"
+
+#: pg_config.c:437
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Rapporter feil til <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_config.c:443
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prøv «%s --help» for mer informasjon.\n"
+
+#: pg_config.c:482
+#, c-format
+msgid "%s: could not find own executable\n"
+msgstr "%s: klarte ikke finne egen programfil\n"
+
+#: pg_config.c:505
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: ugyldig argument: %s\n"
+
+#: ../../port/exec.c:193
+#: ../../port/exec.c:307
+#: ../../port/exec.c:350
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "klarte ikke identifisere gjeldene katalog: %s"
+
+#: ../../port/exec.c:212
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "ugyldig binærfil «%s»"
+
+#: ../../port/exec.c:261
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "klarte ikke lese binærfil «%s»"
+
+#: ../../port/exec.c:268
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "fant ikke «%s» for eksekvering"
+
+#: ../../port/exec.c:323
+#: ../../port/exec.c:359
+#, c-format
+msgid "could not change directory to \"%s\""
+msgstr "klarte ikke endre katalog til «%s»"
+
+#: ../../port/exec.c:338
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "klarte ikke lese den symbolsk lenken «%s»"
+
+#: ../../port/exec.c:584
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "underprosess avsluttet med kode %d"
+
+#: ../../port/exec.c:587
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "underprosess ble avsluttet med signal %d"
+
+#: ../../port/exec.c:590
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "underprosess avsluttet med ukjent status %d"
+
diff --git a/src/bin/pg_config/po/pl.po b/src/bin/pg_config/po/pl.po
new file mode 100644
index 0000000..f57a4c4
--- /dev/null
+++ b/src/bin/pg_config/po/pl.po
@@ -0,0 +1,273 @@
+# PG_CONFIG Translated Messages into the Polish Language
+# Copyright (c) 2005 toczek, xxxtoczekxxx@wp.pl
+# Distributed under the same licensing terms as PostgreSQL itself.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2016-07-03 03:13+0000\n"
+"PO-Revision-Date: 2016-07-03 17:31+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/config_info.c:131 ../../common/config_info.c:139
+#: ../../common/config_info.c:147 ../../common/config_info.c:155
+#: ../../common/config_info.c:163 ../../common/config_info.c:171
+#: ../../common/config_info.c:179 ../../common/config_info.c:187
+#: ../../common/config_info.c:195
+#| msgid "not recorded\n"
+msgid "not recorded"
+msgstr "niezarejestrowane"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "nie można zidentyfikować bieżącego katalogu: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "niepoprawny binarny \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nie można odczytać binarnego \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nie znaleziono \"%s\" do wykonania"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "nie można zmienić katalogu na \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "nie można odczytać odwołania symbolicznego \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose nie powiodło się: %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s dostarcza informacji na temat zainstalowanej wersji PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPCJA]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opcje:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir pokaż lokalizację plików użytkownika\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir pokaż położenie plików dokumentacji\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir pokaż lokalizację plików HTML dokumentacji\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir pokaż lokalizację nagłówków C interfejsu \n"
+" użytkownika\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir pokaż położenie innych plików nagłówkowych C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server pokaż lokalizację nagłówków C dla serwera\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir pokaż lokalizację bibliotek obiektów\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir pokaż lokalizację dynamicznych modułów\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir pokaż położenie plików obsługi lokalizacji\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir pokaż położenie plików podręcznika\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr ""
+" --sharedir pokaż położenie niezależnych od architektury\n"
+" plików obsługi\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir pokaż położenie ogólnosystemowych plików konfiguracyjnych\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs pokaż lokalizację makefile rozszerzeń\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure pokaż opcje użyte przy skrypcie \"configure\" \n"
+" podczas budowania PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc pokaż wartość CC użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags pokaż wartość CPPFLAGS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags pokaż wartość CFLAGS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl pokaż wartość CFLAGS_SL użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags pokaż wartość LDFLAGS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex pokaż wartość LDFLAGS_EX użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl pokaż wartość LDFLAGS_SL użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs pokaż wartość LIBS użytą podczas budowania PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version pokaż wersję PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Bez argumentów są pokazane wszystkie znane elementy.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nie można znaleźć programu wykonywalnego\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: niepoprawny parametr: %s\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "nie można zmienić katalogu na \"%s\""
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "proces potomny zakończył działanie z kodem %d"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "proces potomny został zatrzymany przez wyjątek 0x%X"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "proces potomny został zatrzymany przez sygnał %s"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "proces potomny został zatrzymany przez sygnał %d"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "proces potomny zakończył działanie z nieznanym stanem %d"
diff --git a/src/bin/pg_config/po/pt_BR.po b/src/bin/pg_config/po/pt_BR.po
new file mode 100644
index 0000000..306f9fa
--- /dev/null
+++ b/src/bin/pg_config/po/pt_BR.po
@@ -0,0 +1,249 @@
+# Brazilian Portuguese message translation file for pg_config
+#
+# Copyright (C) 2004-2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2004-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 13:00-0300\n"
+"PO-Revision-Date: 2005-10-04 22:15-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "não informado"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binário \"%s\" é inválido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "não pôde ler o binário \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "não pôde resolver caminho \"%s\" para forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "sem memória"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s fornece informação sobre a versão do PostgreSQL instalada.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPÇÃO]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir mostra local dos executáveis\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir mostra local dos arquivos da documentação\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir mostra local dos arquivos HTML da documentação\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir mostra local dos arquivos de cabeçalho das interfaces\n"
+" com cliente\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir mostra local dos outros arquivos de cabeçalho\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server mostra local dos arquivos de cabeçalho do servidor\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir mostra local das bibliotecas objeto\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir mostra local dos módulos carregáveis dinamicamente\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir mostra local dos arquivos de suporte a configurações regionais\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir mostra local das páginas de manual\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir mostra local dos arquivos de suporte independentes de arquitetura\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir mostra local dos arquivos de configuração do sistema\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs mostra local do makefile extensível\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure mostra opções informadas ao script \"configure\" quando\n"
+" o PostgreSQL foi construído\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc mostra valor de CC utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags mostra valor de CPPFLAGS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags mostra valor de CFLAGS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl mostra valor de CFLAGS_SL utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags mostra valor de LDFLAGS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex mostra valor de LDFLAGS_EX utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl mostra valor de LDFLAGS_SL utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs mostra valor de LIBS utilizado quando PostgreSQL foi construído\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version mostra a versão do PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Sem argumentos, todos os itens serão mostrados.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: não pôde encontrar executável\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: argumento inválido: %s\n"
diff --git a/src/bin/pg_config/po/ro.po b/src/bin/pg_config/po/ro.po
new file mode 100644
index 0000000..9b5461b
--- /dev/null
+++ b/src/bin/pg_config/po/ro.po
@@ -0,0 +1,279 @@
+# translation of pg_config-ro.po to Română
+#
+# Alin Vaida <alin.vaida@gmail.com>, 2004, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config-ro\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2010-09-02 18:00+0000\n"
+"PO-Revision-Date: 2013-09-05 23:01-0400\n"
+"Last-Translator: Max <max@oceanline.co.uk>\n"
+"Language-Team: Română <max@oceanline.co.uk>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"X-Poedit-Language: Romanian\n"
+"X-Poedit-Country: ROMANIA\n"
+
+#: pg_config.c:243
+#: pg_config.c:259
+#: pg_config.c:275
+#: pg_config.c:291
+#: pg_config.c:307
+#: pg_config.c:323
+#: pg_config.c:339
+#: pg_config.c:355
+#: pg_config.c:371
+#, c-format
+msgid "not recorded\n"
+msgstr "ne-înregistrat\n"
+
+#: pg_config.c:428
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s: furnizează informaţii despre versiunea de PostgreSQL instalată\n"
+"\n"
+
+#: pg_config.c:429
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizare:\n"
+
+#: pg_config.c:430
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPÈšIUNE]...\n"
+"\n"
+
+#: pg_config.c:431
+#, c-format
+msgid "Options:\n"
+msgstr "Opţiuni:\n"
+
+#: pg_config.c:432
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir afişează locaţia fişierelor executabile\n"
+
+#: pg_config.c:433
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir afişează locaţia documentaţiei\n"
+
+#: pg_config.c:434
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --docdir afişează locaţia documentaţiei HTML\n"
+
+#: pg_config.c:435
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " --includedir afişează locaţia fişierelor header C ale interfeţelor client\n"
+
+#: pg_config.c:437
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir afişează locaţia celorlalte fişiere header C\n"
+
+#: pg_config.c:438
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server afişează locaţia fişierelor header C pentru server\n"
+
+#: pg_config.c:439
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir afişează locaţia bibliotecilor de cod obiect\n"
+
+#: pg_config.c:440
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir afişează locaţia modulelor încărcabile dinamic\n"
+
+#: pg_config.c:441
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir afişează locaţia fişierelor de suport pentru localizare\n"
+
+#: pg_config.c:442
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir afişează locaţia paginilor de manual\n"
+
+#: pg_config.c:443
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir afişează locaţia fişierelor de suport independent de arhitectură\n"
+
+#: pg_config.c:444
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir afişează locaţia fişierelor de configurare pentru întreg sistemul\n"
+
+#: pg_config.c:445
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs afişează locaţia fişierului makefile pentru extensii\n"
+
+#: pg_config.c:446
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure afişează opţiunile cu care a fost rulat scriptul \"configure\"\n"
+" la compilarea PostgreSQL\n"
+
+#: pg_config.c:448
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc afişează valoarea CC folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:449
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags afişează valoarea CPPFLAGS folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:450
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags afişează valoarea CFLAGS folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:451
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl afişează valoarea CFLAGS_SL folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:452
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags afişează valoarea LDFLAGS folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:453
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl afişează valoarea LDFLAGS_SL folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:454
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl afişează valoarea LDFLAGS_SL folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:455
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs afişează valoarea LIBS folosită la compilarea PostgreSQL\n"
+
+#: pg_config.c:456
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version afişează versiunea PostgreSQL\n"
+
+#: pg_config.c:457
+#, c-format
+msgid " --help show this help, then exit\n"
+msgstr ""
+" --help afişează acest ajutor, apoi iese\n"
+"\n"
+
+#: pg_config.c:458
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Fără argumente, afişează toate elementele cunoscute\n"
+"\n"
+
+#: pg_config.c:459
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Raportaţi erorile la <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_config.c:465
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Încercaţi \"%s --help\" pentru mai multe informaţii.\n"
+
+#: pg_config.c:504
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: imposibil de găsit propriul program executabil\n"
+
+#: pg_config.c:527
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: argument incorect: %s\n"
+
+#: ../../port/exec.c:125
+#: ../../port/exec.c:239
+#: ../../port/exec.c:282
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "imposibil de identificat directorul curent: %s"
+
+#: ../../port/exec.c:144
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binar incorect \"%s\""
+
+#: ../../port/exec.c:193
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "imposibil de citit binar \"%s\""
+
+#: ../../port/exec.c:200
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "imposibil de găsit \"%s\" pentru executare"
+
+#: ../../port/exec.c:255
+#: ../../port/exec.c:291
+#, c-format
+msgid "could not change directory to \"%s\""
+msgstr "imposibil de schimbat directorul în \"%s\""
+
+#: ../../port/exec.c:270
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "imposibil de citit legătura simbolică \"%s\""
+
+#: ../../port/exec.c:516
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "procesul fiu a ieÅŸit cu codul %d"
+
+#: ../../port/exec.c:520
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "procesul fiu a fost terminat cu excepția 0x%X"
+
+#: ../../port/exec.c:529
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "procesul fiu a fost terminat cu semnalul %s"
+
+#: ../../port/exec.c:532
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "procesul fiu a fost terminat cu semnalul %d"
+
+#: ../../port/exec.c:536
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "procesul fiu a ieşit cu starea nerecunoscută %d"
+
diff --git a/src/bin/pg_config/po/ru.po b/src/bin/pg_config/po/ru.po
new file mode 100644
index 0000000..34e80c8
--- /dev/null
+++ b/src/bin/pg_config/po/ru.po
@@ -0,0 +1,322 @@
+# Russian message translation file for pg_config
+# Copyright (C) 2004-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2004-2005.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009, 2012.
+# Andrey Sudnik <sudnikand@gmail.com>, 2010.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2016, 2017, 2019, 2020, 2021, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-28 07:59+0300\n"
+"PO-Revision-Date: 2023-08-29 10:19+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "не запиÑано"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "неверный иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\""
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "нехватка памÑти"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s предоÑтавлÑет информацию об уÑтановленной верÑии PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [ПÐРÐМЕТР]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir показать раÑположение иÑполнÑемых файлов\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir показать раÑположение файлов документации\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr ""
+" --htmldir показать раÑположение HTML-файлов документации\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir показать раÑположение файлов-заголовков (.h) длÑ\n"
+" клиентÑких интерфейÑов на Ñзыке C\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir показать раÑположение других файлов-заголовков (.h)\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server показать раÑположение файлов-заголовков (.h) Ð´Ð»Ñ "
+"Ñервера\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir показать раÑположение библиотек объектного кода\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir показать раÑположение динамичеÑки загружаемых "
+"модулей\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr ""
+" --localedir показать раÑположение файлов опиÑÐ°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir показать раÑположение Ñправочных Ñтраниц\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir показать раÑположение платформенно-незавиÑимых "
+"файлов\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir показать раÑположение общеÑиÑтемных файлов "
+"конфигурации\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs показать раÑположение makefile Ð´Ð»Ñ Ñ€Ð°Ñширений\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure показать параметры Ñкрипта \"configure\", Ñ "
+"которыми\n"
+" был Ñобран PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением CC Ñобран PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cppflags показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением CPPFLAGS Ñобран "
+"PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags показать, Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ флагами C Ñобран PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags_sl показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением CFLAGS_SL Ñобран "
+"PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --ldflags показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением LDFLAGS Ñобран "
+"PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением LDFLAGS_EX Ñобран "
+"PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением LDFLAGS_SL Ñобран "
+"PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs показать, Ñ ÐºÐ°ÐºÐ¸Ð¼ значением LIBS Ñобран PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version показать верÑию PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"При запуÑке без аргументов выводÑÑ‚ÑÑ Ð²Ñе извеÑтные значениÑ.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый файл\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: неверный аргумент: %s\n"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %s"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d"
diff --git a/src/bin/pg_config/po/sv.po b/src/bin/pg_config/po/sv.po
new file mode 100644
index 0000000..2b5468e
--- /dev/null
+++ b/src/bin/pg_config/po/sv.po
@@ -0,0 +1,259 @@
+# Swedish message translation file for pg_config.
+# Dennis Björklund <db@zigo.dhs.org>, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-01 14:18+0000\n"
+"PO-Revision-Date: 2023-08-30 09:01+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "ej sparad"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ogiltig binär \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "kunde inte läsa binär \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s ger information on den installerade versionen av PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [FLAGGA]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir visa filkatalog för körbara filer\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir visa filkatalog för dokumentationsfiler\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir visa filkatalog för HTML-dokumentationsfiler\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir visa filkatalog för C-header-filerna med\n"
+" klientgränssnitt\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir visa filkatalog för C-header-filer\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server visa filkatalog för C-header-filerna till servern\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir visa filkatalog för bibliotekens objektfiler\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir visa filkatalog för dynamiskt laddade moduler\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir visa filkatalog för lokalstödsfiler\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir visa filkatalog för manualsidor\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir visa filkatalog för arkitekturoberoende filer\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir visa filkatalog för systemkonfigurationsfiler\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs visa plats för make-filen vid utvidgningar\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure dessa flaggor gavs till \"configure\"-skriptet när\n"
+" PostgreSQL byggdes\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc visa värde på CC när PostgreSQL byggdes\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags visa värde på CPPFLAGS när PostgreSQL byggdes\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags visa värde på CFLAGS när PostgreSQL byggdes\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl visa värde på CFLAGS_SL när PostgreSQL byggdes\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags visa värde på LDFLAGS när PostgreSQL byggdes\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex visa värde på LDFLAGS_EX när PostgreSQL byggdes\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl visa värde på LDFLAGS_SL när PostgreSQL byggdes\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs visa värde på LIBS när PostgreSQL byggdes\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version visa version för PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Utan argument visas alla kända värden.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: ogiltigt argument: %s\n"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "kan inte läsa symbolisk länk \"%s\": %m"
diff --git a/src/bin/pg_config/po/ta.po b/src/bin/pg_config/po/ta.po
new file mode 100644
index 0000000..0ffdbf2
--- /dev/null
+++ b/src/bin/pg_config/po/ta.po
@@ -0,0 +1,269 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: போஸà¯à®Ÿà¯à®•à®¿à®°à¯†à®¸à¯ தமிழாகà¯à®•à®•à¯ கà¯à®´à¯\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-22 03:19-0300\n"
+"PO-Revision-Date: 2013-09-04 22:09-0400\n"
+"Last-Translator: ஆமாசà¯à®šà¯ <amachu@ubuntu.com>\n"
+"Language-Team: தமிழ௠<ubuntu-l10n-tam@lists.ubuntu.com>\n"
+"Language: ta\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Tamil\n"
+"X-Poedit-Country: INDIA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: pg_config.c:231
+#: pg_config.c:247
+#: pg_config.c:263
+#: pg_config.c:279
+#: pg_config.c:295
+#: pg_config.c:311
+#: pg_config.c:327
+#: pg_config.c:343
+#, c-format
+msgid "not recorded\n"
+msgstr "பதிவà¯à®šà¯ செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ\n"
+
+#: pg_config.c:398
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+" %s நிறà¯à®µà®ªà¯ படà¯à®Ÿà¯à®³à¯à®³ போஸà¯à®Ÿà¯à®•à®¿à®°à¯†à®¸à¯ வெளà¯à®¯à¯€à®Ÿà¯ கà¯à®±à®¿à®¤à¯à®¤à®¤à¯ தகவலைத௠தரà¯à®•à®¿à®±à®¤à¯.\n"
+"\n"
+
+#: pg_config.c:399
+#, c-format
+msgid "Usage:\n"
+msgstr "பயனளவà¯:\n"
+
+#: pg_config.c:400
+#, c-format
+msgid ""
+" %s [ OPTION ... ]\n"
+"\n"
+msgstr ""
+" %s [ தேரà¯à®µà¯ ... ]\n"
+"\n"
+
+#: pg_config.c:401
+#, c-format
+msgid "Options:\n"
+msgstr "தேரà¯à®µà¯:\n"
+
+#: pg_config.c:402
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir பயனரால௠இயகà¯à®• வலà¯à®µà®©à®µà®±à¯à®±à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:403
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir ஆவணமாகà¯à®•à®•à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯à®•à®¾à®Ÿà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:404
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir வாஙà¯à®•à®¿à®•à¯à®•à®¾à®© C à®®à¯à®¤à®±à¯ கோபà¯à®ªà¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+" இடைமà¯à®•à®ªà¯à®ªà¯à®•à®³à¯\n"
+
+#: pg_config.c:406
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir à®à®©à¯ˆà®¯ C à®®à¯à®¤à®±à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:407
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server வழஙà¯à®•à®¿à®•à¯à®•à®¾à®© C à®®à¯à®¤à®±à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:408
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir பொரà¯à®³à¯ நிரல௠நிரலகஙà¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:409
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir அவà¯à®µà®ªà¯à®ªà¯Šà®´à¯à®¤à¯ மாற வலà¯à®² பாகஙà¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:410
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir அக ஆதரவà¯à®•à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:411
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir உதவிப௠பகà¯à®•à®™à¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:412
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir வடிவமைபà¯à®ªà¯ˆà®šà¯ சாராத ஆதரவà¯à®•à¯ கோபà¯à®ªà¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:413
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir மொதà¯à®¤ அமைபà¯à®ªà®¿à®±à¯à®•à®¾à®© வடிவமைபà¯à®ªà¯à®•à¯ கோபà¯à®ªà¯à®•à¯à®•à®³à®¿à®©à¯ இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯\n"
+
+#: pg_config.c:414
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs makefile விரிவின௠இரà¯à®ªà¯à®ªà®¿à®Ÿà®¤à¯à®¤à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:415
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠\n"
+" \"configure\" கà¯à®•à¯ கொடà¯à®•à¯à®•à®ªà¯ படà¯à®Ÿà®¤à¯ தேரà¯à®µà¯à®•à®³à¯ˆà®•à¯ காடà¯à®Ÿà®µà¯à®®à¯\n"
+
+#: pg_config.c:417
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ CC மதிபà¯à®ªà¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:418
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ CPPFLAGS மதிபà¯à®ªà¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:419
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ CFLAGS மதிபà¯à®ªà¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:420
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ CFLAGS_SL மதிபà¯à®ªà¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:421
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ LDFLAGS மதிபà¯à®ªà¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:422
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ LDFLAGS_SL மதிபà¯à®ªà®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:423
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL கடà¯à®Ÿà®®à¯ˆà®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ போத௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯ படà¯à®Ÿ LIBS மதிபà¯à®ªà¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:424
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL வெளியீடà¯à®Ÿà®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà¯à®•\n"
+
+#: pg_config.c:425
+#, c-format
+msgid " --help show this help, then exit\n"
+msgstr " --help இவà¯à®µà¯à®¤à®µà®¿à®¯à®¿à®©à¯ˆà®•à¯ காடà¯à®Ÿà®¿à®¯ பின௠வெளிவரவà¯à®®à¯\n"
+
+#: pg_config.c:426
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+" ஊடà¯à®Ÿà®®à¯‡à®¤à¯à®®à®¿à®²à¯à®²à®¾à®¤ வாறே, அறியப௠படà¯à®®à¯ அனைதà¯à®¤à¯ பாகஙà¯à®•à®³à¯à®®à¯ திரையிடபà¯à®ªà®Ÿà¯à®•à®¿à®©à®±à®©.\n"
+" \n"
+
+#: pg_config.c:427
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "<pgsql-bugs@postgresql.org> கà¯à®•à¯ வழà¯à®•à¯à®•à®³à¯ˆà®¤à¯ தெரியப௠படà¯à®¤à¯à®¤à®µà¯à®®à¯.\n"
+
+#: pg_config.c:433
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "மேலà¯à®®à¯ தகவலà¯à®•à®³à¯ˆà®ªà¯ பெற \"%s --help\" கொடà¯à®•à¯à®•à®µà¯à®®à¯\n"
+
+#: pg_config.c:472
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: தானாக இயகà¯à®• வலà¯à®² நிரலைக௠கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®• இயலவிலà¯à®²à¯ˆ\n"
+
+#: pg_config.c:495
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: செலà¯à®²à®¤à¯à®¤à®•à®¾à®¤ ஊடà¯à®Ÿà®®à¯: %s\n"
+
+#: ../../port/exec.c:192
+#: ../../port/exec.c:306
+#: ../../port/exec.c:349
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "தறà¯à®ªà¯‹à®¤à¯ˆà®¯ அடைவினை இனஙà¯à®•à®¾à®© à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ: %s"
+
+#: ../../port/exec.c:211
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "செலà¯à®²à®¤à¯à®¤à®•à®¾à®¤ இரà¯à®®à®®à¯ \"%s\""
+
+#: ../../port/exec.c:260
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "இரà¯à®®à®¤à¯à®¤à®¿à®©à¯ˆ வாசிகà¯à®• இயலவிலà¯à®²à¯ˆ \"%s\""
+
+#: ../../port/exec.c:267
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "இயகà¯à®•à¯à®®à¯ பொரà¯à®Ÿà¯à®Ÿà¯ \"%s\" ஒனà¯à®±à®¿à®©à¯ˆà®•à¯ கணà¯à®Ÿà¯†à®Ÿà¯à®•à¯à®• இயலவிலà¯à®²à¯ˆ"
+
+#: ../../port/exec.c:322
+#: ../../port/exec.c:358
+#, c-format
+msgid "could not change directory to \"%s\""
+msgstr "அடைவினை \"%s\" கà¯à®•à¯ மாறà¯à®± à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ"
+
+#: ../../port/exec.c:337
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "அடையாள இணைபà¯à®ªà¯ \"%s\" னை வாசிகà¯à®• இயலவிலà¯à®²à¯ˆ"
+
+#: ../../port/exec.c:583
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "தà¯à®£à¯ˆà®šà¯ செயல௠வெளியேறà¯à®±à®•à¯ கà¯à®±à®¿à®¯à¯€à®Ÿà¯ %d உடன௠வெளி வநà¯à®¤à®¤à¯"
+
+#: ../../port/exec.c:587
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "தà¯à®£à¯ˆà®šà¯ செயல௠0x%X விதிவிலகà¯à®•à®¿à®©à¯ காரணமாக தடைப௠படà¯à®Ÿà®¤à¯"
+
+#: ../../port/exec.c:596
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "தà¯à®£à¯ˆà®šà¯ செயல௠%s சமிகà¯à®žà¯ˆà®¯à®¾à®²à¯ தடைப௠படà¯à®Ÿà®¤à¯"
+
+#: ../../port/exec.c:599
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "தà¯à®£à¯ˆà®šà¯ செயல௠%d சமிகà¯à®žà¯ˆà®¯à®¾à®²à¯ தடைப௠படà¯à®Ÿà®¤à¯"
+
+#: ../../port/exec.c:603
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "இனமà¯à®ªà¯à®°à®¿à®¯à®¾à®¤ நிலை %d யால௠தà¯à®£à¯ˆà®šà¯ செயல௠வெளிவநà¯à®¤à®¤à¯"
+
diff --git a/src/bin/pg_config/po/tr.po b/src/bin/pg_config/po/tr.po
new file mode 100644
index 0000000..6a9988c
--- /dev/null
+++ b/src/bin/pg_config/po/tr.po
@@ -0,0 +1,281 @@
+# translation of pg_config-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2007.
+# Nicolai Tufar <ntufar@gmail.com>, 2005, 2007.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-11-27 07:44+0000\n"
+"PO-Revision-Date: 2021-09-16 09:40+0200\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../common/config_info.c:130 ../../common/config_info.c:138
+#: ../../common/config_info.c:146 ../../common/config_info.c:154
+#: ../../common/config_info.c:162 ../../common/config_info.c:170
+#: ../../common/config_info.c:178 ../../common/config_info.c:186
+#: ../../common/config_info.c:194
+msgid "not recorded"
+msgstr "kayıtlı değil"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "geçerli dizin tespit edilemedi: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "symbolic link \"%s\" okuma hatası"
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose başarısız oldu: %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s kurulu PostgreSQL sürümü hakkında bilgi verir.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [SEÇENEK]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir kullanıcı tarafından çalıştırılabilir dosyaların yerlerini göster\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir dokümantasyon dosyaların yerini göster\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --docdir HTML belge dosyalarının yerini göster\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir İstemci arabirimlerinin C başlık dosyalarının yerlerini\n"
+" göster\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir diğer C başlık dosyalarının yerlerini göster\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server Sunucu için C başlık dosyalarının yerlerini göster\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir nesne kod kütüphanelerinin yerini göster\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir Dinamik olarak yüklenebilen modüllerin yerlerini göster\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir yerel dil destek dosyalarının yerini göster\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir kullanıcı kılavuzu (man) dosyaların yerini göster\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir platform bağımsız dosyaların yerini göster\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir sistem geneli parametre dosyaların yerini göster\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs extension makefile dosyasının yerini göster\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure PostgreSQL yapılandırıldığında \"configure\" betiğine verilen\n"
+" seçeneklerin listesini göster\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CC değerini göster\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CPPFLAGS değerini göster\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CFLAGS değerini göster\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan CFLAGS_SL değerini göster\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan LDFLAGS değerini göster\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex PostgreSQL derlemesi sırasında kullanılan LDFLAGS_EX değerini göster\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags PostgreSQL derleme sırasında kullanılan LDFLAGS_SL değerini göster\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs PostgreSQL derleme sırasında kullanılan LIBS değerini göster\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version PostgreSQL sürümünü göster ve çık\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Parametre verilmediyse, tüm değerleri gösterilmektedir.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Hataları <pgsql-bugs@postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için\"%s --help\" parametresini kullanabilirsiniz\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: geçersiz argüman: %s\n"
+
+#~ msgid ""
+#~ " %s [ OPTION ... ]\n"
+#~ "\n"
+#~ msgstr ""
+#~ " %s [ SEÇENEK ... ]\n"
+#~ "\n"
+
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "alt süreç %d bilinmeyen durumu ile sonlandırıldı"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "alt süreç %d sinyali tarafından sonlandırıldı"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırıldı"
+
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "alt süreç 0x%X exception tarafından sonlandırıldı"
+
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "alt süreç %d çıkış koduyla sonuçlandı"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "not recorded\n"
+#~ msgstr "kayıtlı değil\n"
diff --git a/src/bin/pg_config/po/uk.po b/src/bin/pg_config/po/uk.po
new file mode 100644
index 0000000..d64a71c
--- /dev/null
+++ b/src/bin/pg_config/po/uk.po
@@ -0,0 +1,231 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:17+0000\n"
+"PO-Revision-Date: 2023-12-20 11:53\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_config.pot\n"
+"X-Crowdin-File-ID: 973\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "не запиÑано"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "невірний бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#: pg_config.c:74
+#, c-format
+msgid "\n"
+"%s provides information about the installed version of PostgreSQL.\n\n"
+msgstr "\n"
+"%s надає інформацію про інÑтальовану верÑÑ–ÑŽ PostgreSQL.\n\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid " %s [OPTION]...\n\n"
+msgstr " %s: [OPTION]...\n\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ð½Ð¸Ñ… файлів кориÑтувача\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² документації\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² документації HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid " --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " -includedir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ–Ð² файлів С клієнтÑьких інтерфейÑів\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " -pkgincludedir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ñ… файлів з заголовками C\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " -includedir-server показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ–Ð² файлів С Ñервера\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐº об'єктного коду\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir показує міÑце динамічно завантажувальних модулів\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir показує міÑце файлів перекладу\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñторінок мануала\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir показує міÑÑ†ÐµÑ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð½Ð¾ незалежних файлів підтримки\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir показує Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÑеÑиÑтемних файлів конфігурації\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs показує міÑÑ†ÐµÑ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ makefile Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½ÑŒ\n"
+
+#: pg_config.c:92
+#, c-format
+msgid " --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr " --configure показує параметри Ñкрипта \"configure\" збірки PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ CC збірки PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ CPPFLAGS збірки PostgreSQL \n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ CFLAGS збірки PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ CFLAGS_SL збірки PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDFLAGS збірки PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDFLAGS_EX збірки PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDFLAGS_SL збірки PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs показує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LIBS збірки PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version показує верÑÑ–ÑŽ PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показує цю довідку, потім вихід\n"
+
+#: pg_config.c:104
+#, c-format
+msgid "\n"
+"With no arguments, all known items are shown.\n\n"
+msgstr "\n"
+"Без аргументів, вÑÑ– відображаютьÑÑ Ð²Ñ–Ð´Ð¾Ð¼Ñ– елементи.\n\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ехе файл влаÑної програми\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: недопуÑтимий аргумент: %s\n"
+
diff --git a/src/bin/pg_config/po/vi.po b/src/bin/pg_config/po/vi.po
new file mode 100644
index 0000000..cd87cd7
--- /dev/null
+++ b/src/bin/pg_config/po/vi.po
@@ -0,0 +1,300 @@
+# LANGUAGE message translation file for pg_config
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:15+0000\n"
+"PO-Revision-Date: 2018-05-04 22:18+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: vi_VN\n"
+
+#: ../../common/config_info.c:130 ../../common/config_info.c:138
+#: ../../common/config_info.c:146 ../../common/config_info.c:154
+#: ../../common/config_info.c:162 ../../common/config_info.c:170
+#: ../../common/config_info.c:178 ../../common/config_info.c:186
+#: ../../common/config_info.c:194
+msgid "not recorded"
+msgstr "không được ghi lại"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "không thể xác định thư mục hiện tại: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "tệp nhị phân không hợp lệ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "không thể Ä‘á»c tệp nhị phân \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "không thể tìm thấy tệp \"%s\" để thực thi"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "không thể thay đổi thư mục thành \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "không thể Ä‘á»c symbolic link \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose lá»—i: %s"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s cung cấp thông tin vỠphiên bản đã cài đặt của PostgreSQL.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [TÙY CHỌN]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "Tùy chá»n:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr ""
+" --bindir hiển thị vị trí thÆ° mục tệp thá»±c thi của ngÆ°á»i "
+"dùng\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir hiển thị vị trí của các tệp tài liệu\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir hiển thị vị trí của các tệp tài liệu HTML\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir hiển thị vị trí của tệp header ngôn ngữ C của\n"
+" giao diện phía client\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr ""
+" --pkgincludedir hiện thị vị trí của các tệp header cho ngôn ngữ C "
+"khác\n"
+
+#: pg_config.c:84
+#, c-format
+msgid ""
+" --includedir-server show location of C header files for the server\n"
+msgstr ""
+" --includedir-server hiện thị vị trí của các tệp header ngôn ngữ C "
+"phía server\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr ""
+" --libdir hiện thị ví trí của các tệp thư viện chương "
+"trình\n"
+
+#: pg_config.c:86
+#, c-format
+msgid ""
+" --pkglibdir show location of dynamically loadable modules\n"
+msgstr ""
+" --pkglibdir hiển thị vị trí của các mô-đun có thể nạp động\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir hiển thị vị trí của tệp hỗ trợ ngôn ngữ\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir hiển thị vị trí của các trang hướng dẫn\n"
+
+#: pg_config.c:89
+#, c-format
+msgid ""
+" --sharedir show location of architecture-independent support "
+"files\n"
+msgstr ""
+" --sharedir hiển thị vị trí của các tệp hỗ trợ kiến trúc độc "
+"lập\n"
+
+#: pg_config.c:90
+#, c-format
+msgid ""
+" --sysconfdir show location of system-wide configuration files\n"
+msgstr ""
+" --sysconfdir hiển thị vị trí của tệp cấu hình trên toàn hệ "
+"thống\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr ""
+" --pgxs hiển thị vị trí tệp makefile của extension\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure hiện thị tùy chá»n chỉ định trong script "
+"\"configure\" \n"
+" khi built PostgreSQL\n"
+
+#: pg_config.c:94
+#, c-format
+msgid ""
+" --cc show CC value used when PostgreSQL was built\n"
+msgstr ""
+" --cc hiển thị giá trị CC được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:95
+#, c-format
+msgid ""
+" --cppflags show CPPFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cppflags hiện thị giá trị CPPFLAGS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:96
+#, c-format
+msgid ""
+" --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr ""
+" --cflags hiện thị giá trị CFLAGS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:97
+#, c-format
+msgid ""
+" --cflags_sl show CFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --cflags_sl hiện thị giá trị CFLAGS_SL được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:98
+#, c-format
+msgid ""
+" --ldflags show LDFLAGS value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags hiện thị giá trị LDFLAGS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:99
+#, c-format
+msgid ""
+" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_ex hiện thị giá trị LDFLAGS_EX được sử dụng khi "
+"built PostgreSQL\n"
+
+#: pg_config.c:100
+#, c-format
+msgid ""
+" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was "
+"built\n"
+msgstr ""
+" --ldflags_sl hiện thị giá trị LDFLAGS_SL được sử dụng khi "
+"built PostgreSQL\n"
+
+#: pg_config.c:101
+#, c-format
+msgid ""
+" --libs show LIBS value used when PostgreSQL was built\n"
+msgstr ""
+" --libs hiện thị giá trị LIBS được sử dụng khi built "
+"PostgreSQL\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version hiển thị phiên bản PostgreSQL\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help hiển thị trợ giúp này, sau đó thoát\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"Nếu không có đối số, tất cả các mục sẽ được hiện thị.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Báo cáo lỗi tới <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_config.c:111
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_config.c:153
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: không thể tìm thấy chương trình có thể thực thi\n"
+
+#: pg_config.c:180
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: đối số không hợp lệ: %s\n"
diff --git a/src/bin/pg_config/po/zh_CN.po b/src/bin/pg_config/po/zh_CN.po
new file mode 100644
index 0000000..8c32e10
--- /dev/null
+++ b/src/bin/pg_config/po/zh_CN.po
@@ -0,0 +1,255 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 17:25+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "没有被记录"
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当å‰ç›®å½•: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "内存ä¸è¶³"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s æä¾› PostgreSQL 的安装信æ¯.\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr " %s [选项]...\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir 显示执行文件所在ä½ç½®\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 显示文档所在ä½ç½®\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir 显示HTML文档文件所在ä½ç½®\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr ""
+" --includedir æ˜¾ç¤ºå®¢æˆ·ç«¯æŽ¥å£ C 头文件所在\n"
+" ä½ç½®\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir 显示其它C语言头文件所在的ä½ç½®\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server 显示æœåŠ¡ç«¯ C 头文件所在ä½ç½®\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir 显示目标代ç åº“文件所在ä½ç½®\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir 显示动æ€åŠ è½½åº“所在ä½ç½®\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir 显示语言环境支æŒæ–‡ä»¶æ‰€åœ¨ä½ç½®\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir 显示å‚考手册所在ä½ç½®\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir 显示独立架构支æŒæ–‡ä»¶æ‰€åœ¨ä½ç½®\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir 显示系统范围的é…置文件的所在ä½ç½®\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 显示扩展 makefile 所在ä½ç½®\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr ""
+" --configure 显示编译 PostgreSQL 时 \"configure\"\n"
+" 的选项\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc 显示在创建PostgreSQL时所使用的CC值\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags 当创建PostgreSQL时显示CPPFLAGS的值\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags 显示在创建PostgreSQL时所使用的CFLAG值\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl 当创建PostgreSQL时显示CFLAGS_SL的值\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags 显示在创建PostgreSQL时所使用的LDFLAG值\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex 当创建PostgreSQL时显示LDFLAGS_EX的值\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl 当创建PostgreSQL时显示LDFLAGS_SL的值\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs 显示在创建PostgreSQL时所使用的LIBS值\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version 显示PostgreSQL的版本信æ¯\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示帮助, 然åŽé€€å‡º\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"没有å‚æ•°,将显示所有已知的æˆå‘˜.\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: 无效å‚æ•°: %s\n"
+
diff --git a/src/bin/pg_config/po/zh_TW.po b/src/bin/pg_config/po/zh_TW.po
new file mode 100644
index 0000000..e5c695a
--- /dev/null
+++ b/src/bin/pg_config/po/zh_TW.po
@@ -0,0 +1,326 @@
+# Traditional Chinese message translation file for pg_config
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_config (PostgreSQL) package.
+# 2004-12-13 Zhenbang Wei <forth@zbwei.net>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_config (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-08 21:48+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+#: ../../common/config_info.c:134 ../../common/config_info.c:142
+#: ../../common/config_info.c:150 ../../common/config_info.c:158
+#: ../../common/config_info.c:166 ../../common/config_info.c:174
+#: ../../common/config_info.c:182 ../../common/config_info.c:190
+msgid "not recorded"
+msgstr "未紀錄"
+
+# command.c:122
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "無效的執行檔 \"%s\": %m"
+
+# command.c:1103
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "無法讀å–執行檔 \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\""
+
+# utils/error/elog.c:1128
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "無法將路徑 \"%s\" 解æžç‚ºçµ•å°è·¯å¾‘: %m"
+
+# fe-misc.c:991
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 失敗: %m"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "記憶體ä¸è¶³"
+
+#: pg_config.c:74
+#, c-format
+msgid ""
+"\n"
+"%s provides information about the installed version of PostgreSQL.\n"
+"\n"
+msgstr ""
+"\n"
+"%s æä¾›é—œæ–¼å·²å®‰è£ PostgreSQL 版本的資訊。\n"
+"\n"
+
+#: pg_config.c:75
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_config.c:76
+#, c-format
+msgid ""
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_config.c:77
+#, c-format
+msgid "Options:\n"
+msgstr "é¸é …:\n"
+
+#: pg_config.c:78
+#, c-format
+msgid " --bindir show location of user executables\n"
+msgstr " --bindir 顯示使用者å¯åŸ·è¡Œæª”çš„ä½ç½®\n"
+
+#: pg_config.c:79
+#, c-format
+msgid " --docdir show location of documentation files\n"
+msgstr " --docdir 顯示文件檔的ä½ç½®\n"
+
+#: pg_config.c:80
+#, c-format
+msgid " --htmldir show location of HTML documentation files\n"
+msgstr " --htmldir 顯示 HTML 文件檔的ä½ç½®\n"
+
+#: pg_config.c:81
+#, c-format
+msgid ""
+" --includedir show location of C header files of the client\n"
+" interfaces\n"
+msgstr " --includedir é¡¯ç¤ºå®¢æˆ¶ç«¯ä»‹é¢ C 標頭檔的ä½ç½®\n"
+
+#: pg_config.c:83
+#, c-format
+msgid " --pkgincludedir show location of other C header files\n"
+msgstr " --pkgincludedir 顯示其他 C 標頭檔的ä½ç½®\n"
+
+#: pg_config.c:84
+#, c-format
+msgid " --includedir-server show location of C header files for the server\n"
+msgstr " --includedir-server 顯示伺æœå™¨ C 標頭檔的ä½ç½®\n"
+
+#: pg_config.c:85
+#, c-format
+msgid " --libdir show location of object code libraries\n"
+msgstr " --libdir 顯示目的碼程å¼åº«çš„ä½ç½®\n"
+
+#: pg_config.c:86
+#, c-format
+msgid " --pkglibdir show location of dynamically loadable modules\n"
+msgstr " --pkglibdir 顯示動態載入模組的ä½ç½®\n"
+
+#: pg_config.c:87
+#, c-format
+msgid " --localedir show location of locale support files\n"
+msgstr " --localedir 顯示å€åŸŸæ”¯æ´æª”çš„ä½ç½®\n"
+
+#: pg_config.c:88
+#, c-format
+msgid " --mandir show location of manual pages\n"
+msgstr " --mandir 顯示使用手冊的ä½ç½®\n"
+
+#: pg_config.c:89
+#, c-format
+msgid " --sharedir show location of architecture-independent support files\n"
+msgstr " --sharedir 顯示與架構無關的支æ´æª”çš„ä½ç½®\n"
+
+#: pg_config.c:90
+#, c-format
+msgid " --sysconfdir show location of system-wide configuration files\n"
+msgstr " --sysconfdir 顯示系統全域組態檔的ä½ç½®\n"
+
+#: pg_config.c:91
+#, c-format
+msgid " --pgxs show location of extension makefile\n"
+msgstr " --pgxs 顯示擴充模組 makefile ä½ç½®\n"
+
+#: pg_config.c:92
+#, c-format
+msgid ""
+" --configure show options given to \"configure\" script when\n"
+" PostgreSQL was built\n"
+msgstr " --configure 顯示建立 PostgreSQL 時給 \"configure\" 腳本的åƒæ•¸\n"
+
+#: pg_config.c:94
+#, c-format
+msgid " --cc show CC value used when PostgreSQL was built\n"
+msgstr " --cc 顯示建立 PostgreSQL 時使用的 CC 值\n"
+
+#: pg_config.c:95
+#, c-format
+msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n"
+msgstr " --cppflags 顯示建立 PostgreSQL 時使用的 CPPFLAGS 值\n"
+
+#: pg_config.c:96
+#, c-format
+msgid " --cflags show CFLAGS value used when PostgreSQL was built\n"
+msgstr " --cflags 顯示建立 PostgreSQL 時使用的 CFLAGS 值\n"
+
+#: pg_config.c:97
+#, c-format
+msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --cflags_sl 顯示建立 PostgreSQL 時使用的 CFLAGS_SL 值\n"
+
+#: pg_config.c:98
+#, c-format
+msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n"
+msgstr " --ldflags 顯示建立 PostgreSQL 時使用的 LDFLAGS 值\n"
+
+#: pg_config.c:99
+#, c-format
+msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n"
+msgstr " --ldflags_ex 顯示建立 PostgreSQL 時使用的 LDFLAGS_EX 值\n"
+
+#: pg_config.c:100
+#, c-format
+msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n"
+msgstr " --ldflags_sl 顯示建立 PostgreSQL 時使用的 LDFLAGS_SL 值\n"
+
+#: pg_config.c:101
+#, c-format
+msgid " --libs show LIBS value used when PostgreSQL was built\n"
+msgstr " --libs 顯示建立 PostgreSQL 時使用的 LIBS 值\n"
+
+#: pg_config.c:102
+#, c-format
+msgid " --version show the PostgreSQL version\n"
+msgstr " --version 顯示 PostgreSQL 的版本\n"
+
+#: pg_config.c:103
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_config.c:104
+#, c-format
+msgid ""
+"\n"
+"With no arguments, all known items are shown.\n"
+"\n"
+msgstr ""
+"\n"
+"沒有åƒæ•¸æ™‚顯示所有已知項目。\n"
+"\n"
+
+#: pg_config.c:105
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "回報錯誤至 <%s>。\n"
+
+#: pg_config.c:106
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 首é : <%s>\n"
+
+# postmaster/postmaster.c:512 postmaster/postmaster.c:525
+#: pg_config.c:112
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "用 \"%s --help\" å–得更多資訊。\n"
+
+#: pg_config.c:154
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 找ä¸åˆ°è‡ªèº«çš„程å¼åŸ·è¡Œæª”\n"
+
+#: pg_config.c:181
+#, c-format
+msgid "%s: invalid argument: %s\n"
+msgstr "%s: 無效的åƒæ•¸: %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Try \"%s --help\" for more information\n"
+#~ msgstr ""
+#~ "\n"
+#~ "執行\"%s --help\"å–得更多資訊\n"
+
+#~ msgid ""
+#~ " %s OPTION...\n"
+#~ "\n"
+#~ msgstr ""
+#~ " %s é¸é …...\n"
+#~ "\n"
+
+#, c-format
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help 顯示說明然後çµæŸ\n"
+
+#~ msgid "%s: argument required\n"
+#~ msgstr "%s:ä¸èƒ½çœç•¥åƒæ•¸\n"
+
+#~ msgid "%s: could not find own executable\n"
+#~ msgstr "%s:找ä¸åˆ°åŸ·è¡Œæª”\n"
+
+#, c-format
+#~ msgid "child process exited with exit code %d"
+#~ msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸä»£ç¢¼ %d"
+
+#, c-format
+#~ msgid "child process exited with unrecognized status %d"
+#~ msgstr "å­è¡Œç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ä»£ç¢¼ %d"
+
+#, c-format
+#~ msgid "child process was terminated by exception 0x%X"
+#~ msgstr "å­è¡Œç¨‹è¢«ä¾‹å¤– 0x%X çµæŸ"
+
+#, c-format
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %d çµæŸ"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s çµæŸ"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "無法切æ›ç›®éŒ„至 \"%s\""
+
+#, c-format
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "無法識別目å‰çš„目錄: %s"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\""
diff --git a/src/bin/pg_config/t/001_pg_config.pl b/src/bin/pg_config/t/001_pg_config.pl
new file mode 100644
index 0000000..24acf78
--- /dev/null
+++ b/src/bin/pg_config/t/001_pg_config.pl
@@ -0,0 +1,21 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_config');
+program_version_ok('pg_config');
+program_options_handling_ok('pg_config');
+command_like([ 'pg_config', '--bindir' ], qr/bin/, 'pg_config single option')
+ ; # XXX might be wrong
+command_like([ 'pg_config', '--bindir', '--libdir' ],
+ qr/bin.*\n.*lib/, 'pg_config two options');
+command_like([ 'pg_config', '--libdir', '--bindir' ],
+ qr/lib.*\n.*bin/, 'pg_config two options different order');
+command_like(['pg_config'], qr/.*\n.*\n.*/,
+ 'pg_config without options prints many lines');
+
+done_testing();
diff --git a/src/bin/pg_controldata/.gitignore b/src/bin/pg_controldata/.gitignore
new file mode 100644
index 0000000..051d71d
--- /dev/null
+++ b/src/bin/pg_controldata/.gitignore
@@ -0,0 +1,2 @@
+/pg_controldata
+/tmp_check/
diff --git a/src/bin/pg_controldata/Makefile b/src/bin/pg_controldata/Makefile
new file mode 100644
index 0000000..aa5bd58
--- /dev/null
+++ b/src/bin/pg_controldata/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_controldata
+#
+# Copyright (c) 1998-2023, PostgreSQL Global Development Group
+#
+# src/bin/pg_controldata/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_controldata - reads the data from pg_control"
+PGAPPICON=win32
+
+subdir = src/bin/pg_controldata
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_controldata.o
+
+all: pg_controldata
+
+pg_controldata: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_controldata$(X) '$(DESTDIR)$(bindir)/pg_controldata$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_controldata$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_controldata$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build
new file mode 100644
index 0000000..03c9d0a
--- /dev/null
+++ b/src/bin/pg_controldata/meson.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_controldata_sources = files(
+ 'pg_controldata.c',
+)
+
+if host_system == 'windows'
+ pg_controldata_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_controldata',
+ '--FILEDESC', 'pg_controldata - reads the data from pg_control',])
+endif
+
+pg_controldata = executable('pg_controldata',
+ pg_controldata_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_controldata
+
+tests += {
+ 'name': 'pg_controldata',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_pg_controldata.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_controldata/nls.mk b/src/bin/pg_controldata/nls.mk
new file mode 100644
index 0000000..ab34205
--- /dev/null
+++ b/src/bin/pg_controldata/nls.mk
@@ -0,0 +1,5 @@
+# src/bin/pg_controldata/nls.mk
+CATALOG_NAME = pg_controldata
+GETTEXT_FILES = pg_controldata.c ../../common/controldata_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
new file mode 100644
index 0000000..c390ec5
--- /dev/null
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -0,0 +1,332 @@
+/*
+ * pg_controldata
+ *
+ * reads the data from $PGDATA/global/pg_control
+ *
+ * copyright (c) Oliver Elphick <olly@lfix.co.uk>, 2001;
+ * license: BSD
+ *
+ * src/bin/pg_controldata/pg_controldata.c
+ */
+
+/*
+ * We have to use postgres.h not postgres_fe.h here, because there's so much
+ * backend-only stuff in the XLOG include files we need. But we need a
+ * frontend-ish environment otherwise. Hence this ugly hack.
+ */
+#define FRONTEND 1
+
+#include "postgres.h"
+
+#include <time.h>
+
+#include "access/transam.h"
+#include "access/xlog.h"
+#include "access/xlog_internal.h"
+#include "catalog/pg_control.h"
+#include "common/controldata_utils.h"
+#include "common/logging.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+
+static void
+usage(const char *progname)
+{
+ printf(_("%s displays control information of a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION] [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf no data directory (DATADIR) is specified, "
+ "the environment variable PGDATA\nis used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+static const char *
+dbState(DBState state)
+{
+ switch (state)
+ {
+ case DB_STARTUP:
+ return _("starting up");
+ case DB_SHUTDOWNED:
+ return _("shut down");
+ case DB_SHUTDOWNED_IN_RECOVERY:
+ return _("shut down in recovery");
+ case DB_SHUTDOWNING:
+ return _("shutting down");
+ case DB_IN_CRASH_RECOVERY:
+ return _("in crash recovery");
+ case DB_IN_ARCHIVE_RECOVERY:
+ return _("in archive recovery");
+ case DB_IN_PRODUCTION:
+ return _("in production");
+ }
+ return _("unrecognized status code");
+}
+
+static const char *
+wal_level_str(WalLevel wal_level)
+{
+ switch (wal_level)
+ {
+ case WAL_LEVEL_MINIMAL:
+ return "minimal";
+ case WAL_LEVEL_REPLICA:
+ return "replica";
+ case WAL_LEVEL_LOGICAL:
+ return "logical";
+ }
+ return _("unrecognized wal_level");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"pgdata", required_argument, NULL, 'D'},
+ {NULL, 0, NULL, 0}
+ };
+
+ ControlFileData *ControlFile;
+ bool crc_ok;
+ char *DataDir = NULL;
+ time_t time_tmp;
+ char pgctime_str[128];
+ char ckpttime_str[128];
+ char mock_auth_nonce_str[MOCK_AUTH_NONCE_LEN * 2 + 1];
+ const char *strftime_fmt = "%c";
+ const char *progname;
+ char xlogfilename[MAXFNAMELEN];
+ int c;
+ int i;
+ int WalSegSz;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_controldata"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_controldata (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "D:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ DataDir = optarg;
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL)
+ {
+ if (optind < argc)
+ DataDir = argv[optind++];
+ else
+ DataDir = getenv("PGDATA");
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* get a copy of the control file */
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ if (!crc_ok)
+ printf(_("WARNING: Calculated CRC checksum does not match value stored in file.\n"
+ "Either the file is corrupt, or it has a different layout than this program\n"
+ "is expecting. The results below are untrustworthy.\n\n"));
+
+ /* set wal segment size */
+ WalSegSz = ControlFile->xlog_seg_size;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ {
+ printf(_("WARNING: invalid WAL segment size\n"));
+ printf(ngettext("The WAL segment size stored in the file, %d byte, is not a power of two\n"
+ "between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+ "untrustworthy.\n\n",
+ "The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+ "between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+ "untrustworthy.\n\n",
+ WalSegSz),
+ WalSegSz);
+ }
+
+ /*
+ * This slightly-chintzy coding will work as long as the control file
+ * timestamps are within the range of time_t; that should be the case in
+ * all foreseeable circumstances, so we don't bother importing the
+ * backend's timezone library into pg_controldata.
+ *
+ * Use variable for format to suppress overly-anal-retentive gcc warning
+ * about %c
+ */
+ time_tmp = (time_t) ControlFile->time;
+ strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt,
+ localtime(&time_tmp));
+ time_tmp = (time_t) ControlFile->checkPointCopy.time;
+ strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt,
+ localtime(&time_tmp));
+
+ /*
+ * Calculate name of the WAL file containing the latest checkpoint's REDO
+ * start point.
+ *
+ * A corrupted control file could report a WAL segment size of 0, and to
+ * guard against division by zero, we need to treat that specially.
+ */
+ if (WalSegSz != 0)
+ {
+ XLogSegNo segno;
+
+ XLByteToSeg(ControlFile->checkPointCopy.redo, segno, WalSegSz);
+ XLogFileName(xlogfilename, ControlFile->checkPointCopy.ThisTimeLineID,
+ segno, WalSegSz);
+ }
+ else
+ strcpy(xlogfilename, _("???"));
+
+ for (i = 0; i < MOCK_AUTH_NONCE_LEN; i++)
+ snprintf(&mock_auth_nonce_str[i * 2], 3, "%02x",
+ (unsigned char) ControlFile->mock_authentication_nonce[i]);
+
+ printf(_("pg_control version number: %u\n"),
+ ControlFile->pg_control_version);
+ printf(_("Catalog version number: %u\n"),
+ ControlFile->catalog_version_no);
+ printf(_("Database system identifier: %llu\n"),
+ (unsigned long long) ControlFile->system_identifier);
+ printf(_("Database cluster state: %s\n"),
+ dbState(ControlFile->state));
+ printf(_("pg_control last modified: %s\n"),
+ pgctime_str);
+ printf(_("Latest checkpoint location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->checkPoint));
+ printf(_("Latest checkpoint's REDO location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->checkPointCopy.redo));
+ printf(_("Latest checkpoint's REDO WAL file: %s\n"),
+ xlogfilename);
+ printf(_("Latest checkpoint's TimeLineID: %u\n"),
+ ControlFile->checkPointCopy.ThisTimeLineID);
+ printf(_("Latest checkpoint's PrevTimeLineID: %u\n"),
+ ControlFile->checkPointCopy.PrevTimeLineID);
+ printf(_("Latest checkpoint's full_page_writes: %s\n"),
+ ControlFile->checkPointCopy.fullPageWrites ? _("on") : _("off"));
+ printf(_("Latest checkpoint's NextXID: %u:%u\n"),
+ EpochFromFullTransactionId(ControlFile->checkPointCopy.nextXid),
+ XidFromFullTransactionId(ControlFile->checkPointCopy.nextXid));
+ printf(_("Latest checkpoint's NextOID: %u\n"),
+ ControlFile->checkPointCopy.nextOid);
+ printf(_("Latest checkpoint's NextMultiXactId: %u\n"),
+ ControlFile->checkPointCopy.nextMulti);
+ printf(_("Latest checkpoint's NextMultiOffset: %u\n"),
+ ControlFile->checkPointCopy.nextMultiOffset);
+ printf(_("Latest checkpoint's oldestXID: %u\n"),
+ ControlFile->checkPointCopy.oldestXid);
+ printf(_("Latest checkpoint's oldestXID's DB: %u\n"),
+ ControlFile->checkPointCopy.oldestXidDB);
+ printf(_("Latest checkpoint's oldestActiveXID: %u\n"),
+ ControlFile->checkPointCopy.oldestActiveXid);
+ printf(_("Latest checkpoint's oldestMultiXid: %u\n"),
+ ControlFile->checkPointCopy.oldestMulti);
+ printf(_("Latest checkpoint's oldestMulti's DB: %u\n"),
+ ControlFile->checkPointCopy.oldestMultiDB);
+ printf(_("Latest checkpoint's oldestCommitTsXid:%u\n"),
+ ControlFile->checkPointCopy.oldestCommitTsXid);
+ printf(_("Latest checkpoint's newestCommitTsXid:%u\n"),
+ ControlFile->checkPointCopy.newestCommitTsXid);
+ printf(_("Time of latest checkpoint: %s\n"),
+ ckpttime_str);
+ printf(_("Fake LSN counter for unlogged rels: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->unloggedLSN));
+ printf(_("Minimum recovery ending location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->minRecoveryPoint));
+ printf(_("Min recovery ending loc's timeline: %u\n"),
+ ControlFile->minRecoveryPointTLI);
+ printf(_("Backup start location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->backupStartPoint));
+ printf(_("Backup end location: %X/%X\n"),
+ LSN_FORMAT_ARGS(ControlFile->backupEndPoint));
+ printf(_("End-of-backup record required: %s\n"),
+ ControlFile->backupEndRequired ? _("yes") : _("no"));
+ printf(_("wal_level setting: %s\n"),
+ wal_level_str(ControlFile->wal_level));
+ printf(_("wal_log_hints setting: %s\n"),
+ ControlFile->wal_log_hints ? _("on") : _("off"));
+ printf(_("max_connections setting: %d\n"),
+ ControlFile->MaxConnections);
+ printf(_("max_worker_processes setting: %d\n"),
+ ControlFile->max_worker_processes);
+ printf(_("max_wal_senders setting: %d\n"),
+ ControlFile->max_wal_senders);
+ printf(_("max_prepared_xacts setting: %d\n"),
+ ControlFile->max_prepared_xacts);
+ printf(_("max_locks_per_xact setting: %d\n"),
+ ControlFile->max_locks_per_xact);
+ printf(_("track_commit_timestamp setting: %s\n"),
+ ControlFile->track_commit_timestamp ? _("on") : _("off"));
+ printf(_("Maximum data alignment: %u\n"),
+ ControlFile->maxAlign);
+ /* we don't print floatFormat since can't say much useful about it */
+ printf(_("Database block size: %u\n"),
+ ControlFile->blcksz);
+ printf(_("Blocks per segment of large relation: %u\n"),
+ ControlFile->relseg_size);
+ printf(_("WAL block size: %u\n"),
+ ControlFile->xlog_blcksz);
+ printf(_("Bytes per WAL segment: %u\n"),
+ ControlFile->xlog_seg_size);
+ printf(_("Maximum length of identifiers: %u\n"),
+ ControlFile->nameDataLen);
+ printf(_("Maximum columns in an index: %u\n"),
+ ControlFile->indexMaxKeys);
+ printf(_("Maximum size of a TOAST chunk: %u\n"),
+ ControlFile->toast_max_chunk_size);
+ printf(_("Size of a large-object chunk: %u\n"),
+ ControlFile->loblksize);
+ /* This is no longer configurable, but users may still expect to see it: */
+ printf(_("Date/time type storage: %s\n"),
+ _("64-bit integers"));
+ printf(_("Float8 argument passing: %s\n"),
+ (ControlFile->float8ByVal ? _("by value") : _("by reference")));
+ printf(_("Data page checksum version: %u\n"),
+ ControlFile->data_checksum_version);
+ printf(_("Mock authentication nonce: %s\n"),
+ mock_auth_nonce_str);
+ return 0;
+}
diff --git a/src/bin/pg_controldata/po/LINGUAS b/src/bin/pg_controldata/po/LINGUAS
new file mode 100644
index 0000000..4cc8bed
--- /dev/null
+++ b/src/bin/pg_controldata/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_controldata/po/cs.po b/src/bin/pg_controldata/po/cs.po
new file mode 100644
index 0000000..165b7d1
--- /dev/null
+++ b/src/bin/pg_controldata/po/cs.po
@@ -0,0 +1,559 @@
+# Czech message translation file for pg_controldata
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:17+0000\n"
+"PO-Revision-Date: 2020-10-31 20:50+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "nelze otevřít soubor \"%s\" pro Ätení: %m"
+
+#: ../../common/controldata_utils.c:89
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "nelze Äíst soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:101
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "nelze Äíst soubor \"%s\": naÄteno %d z %zu"
+
+#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "nelze uzavřít soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:135
+msgid "byte ordering mismatch"
+msgstr "pořadí bytů nesouhlasí"
+
+#: ../../common/controldata_utils.c:137
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"možný nesoulad v pořadí bytů\n"
+"Pořadí bytů používané pro uložení pg_control souboru nemusí odpovídat "
+"tomu\n"
+"používanému tímto programem. V tom případě by výsledky uvedené níže byly "
+"chybné, a\n"
+"PostgreSQL instalace by byla nekompatibilní s tímto datovým adresářem."
+
+#: ../../common/controldata_utils.c:203
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "nelze zapsat soubor \"%s\": %m"
+
+#: ../../common/controldata_utils.c:245
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "nelze provést fsync souboru \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s vypíše kontrolní informace o PostgreSQL databázi.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [VOLBY] [DATOVÃ-ADRESÃŘ]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Volby:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datový adresář\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypiÅ¡ informaci o verzi, potom skonÄi\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help vypiÅ¡ tuto nápovÄ›du, potom skonÄi\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li specifikován datový adresář, je použita proměnná prostředí\n"
+"PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domovská stránka: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "startování"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "ukonÄení"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "ukonÄení (shut down) bÄ›hem obnovy"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "ukonÄování"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "probíhá zotavení z pádu"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "probíhá obnova z archivu"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "v provozu"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "neznámý stavový kód"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "neznámý wal_level"
+
+#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_controldata.c:153
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "není specifikován datový adresář"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"UPOZORNÄšNÃ: SpoÄítaný CRC kontrolní souÄet nesouhlasí s hodnotou uloženou\n"
+"v souboru. BuÄ je soubor poÅ¡kozen nebo má jinou strukturu než tento "
+"program\n"
+"oÄekává. Níže uvedené výsledky jsou nedůvÄ›ryhodné.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "WARNING: neplatná velikost WAL segmentu\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Velikost WAL segmentu uloženého v souboru, %d byte, není mocnina dvou\n"
+"mezi 1 MB a 1 GB. Soubor je poškozený a výsledky uvedené níže jsou\n"
+"nedůvěryhodné.\n"
+"\n"
+msgstr[1] ""
+"Velikost WAL segmentu uloženého v souboru, %d bytů, není mocnina dvou\n"
+"mezi 1 MB a 1 GB. Soubor je poškozený a výsledky uvedené níže jsou\n"
+"nedůvěryhodné.\n"
+"\n"
+msgstr[2] ""
+"Velikost WAL segmentu uloženého v souboru, %d bytů, není mocnina dvou\n"
+"mezi 1 MB a 1 GB. Soubor je poškozený a výsledky uvedené níže jsou\n"
+"nedůvěryhodné.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Číslo verze pg_controlu: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Číslo verze katalogu: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identifikátor databázového systému: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Status databázového klastru: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Poslední modifikace pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Poslední umístění checkpointu: %X/%X\n"
+
+#: pg_controldata.c:241
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Poslední umístění REDO checkpointu: %X/%X\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "REDO WAL file posledního checkpointu: %s\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Poslední full_page_writes checkpointu: %s\n"
+
+#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308
+msgid "off"
+msgstr "vypnuto"
+
+#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308
+msgid "on"
+msgstr "zapnuto"
+
+#: pg_controldata.c:252
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID posledního checkpointu: %u:%u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Poslední umístění NextOID checkpointu: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId posledního checkpointu: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset posledního checkpointu: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB k oldestXID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID posledního checkpointu: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid posledního checkpointu: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB k oldestMulti posledního checkpointu: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Čas posledního checkpointu: %s\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "FaleÅ¡né LSN poÄítadlo pro unlogged relace: %X/%X\n"
+
+#: pg_controldata.c:280
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minimální pozice ukonÄení obnovy: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline minimální pozice ukonÄení obnovy: %u\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Pozice poÄátku backupu: %X/%X\n"
+
+#: pg_controldata.c:288
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Koncová pozice zálohy: %X/%X\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Vyžadován záznam konce backupu: %s\n"
+
+#: pg_controldata.c:292
+msgid "no"
+msgstr "ne"
+
+#: pg_controldata.c:292
+msgid "yes"
+msgstr "ano"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level hodnota: %s\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints hodnota: %s\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections hodnota: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes hodnota: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders setting: %d\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts hodnota: %d\n"
+
+#: pg_controldata.c:305
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact hodnota: %d\n"
+
+#: pg_controldata.c:307
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp hodnota: %s\n"
+
+#: pg_controldata.c:309
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximální zarovnání dat: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Velikost databázového bloku: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloků v segmentu velké relace: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Velikost WAL bloku: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytů ve WAL segmentu: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximální délka identifikátorů: %u\n"
+
+#: pg_controldata.c:322
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximální poÄet sloupců v indexu: %u\n"
+
+#: pg_controldata.c:324
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximální velikost úseku TOAST: %u\n"
+
+#: pg_controldata.c:326
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Velikost large-object chunku: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Způsob uložení typu date/time: %s\n"
+
+#: pg_controldata.c:330
+msgid "64-bit integers"
+msgstr "64-bitová Äísla"
+
+#: pg_controldata.c:331
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Způsob předávání float8 hodnot: %s\n"
+
+#: pg_controldata.c:332
+msgid "by reference"
+msgstr "odkazem"
+
+#: pg_controldata.c:332
+msgid "by value"
+msgstr "hodnotou"
+
+#: pg_controldata.c:333
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Verze kontrolních souÄtů datových stránek: %u\n"
+
+#: pg_controldata.c:335
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "ZkuÅ¡ební authentizaÄní nonce: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\" pro Ätení: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: nelze Äíst soubor \"%s\": %s\n"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Použití:\n"
+#~ " %s [PŘEPÃNAÄŒ] [ADRESÃŘ]\n"
+#~ "\n"
+#~ "PÅ™epínaÄe:\n"
+#~ " --help ukáže tuto nápovÄ›du a skonÄí\n"
+#~ " --version ukáže verzi tohoto programu a skonÄí\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "Äísla s plovoucí řádovou Äárkou"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help ukáže tuto nápovÄ›du, a skonÄí\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version vypíše informaci o verzi, pak skonÄí\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Způsob předávání float4 hodnot: %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Oznámení o chybách zasílejte na <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_controldata/po/de.po b/src/bin/pg_controldata/po/de.po
new file mode 100644
index 0000000..02b3a2d
--- /dev/null
+++ b/src/bin/pg_controldata/po/de.po
@@ -0,0 +1,512 @@
+# German message translation file for pg_controldata
+# Peter Eisentraut <peter@eisentraut.org>, 2002 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-10 13:51+0000\n"
+"PO-Revision-Date: 2022-04-10 20:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "falsche Byte-Reihenfolge"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"möglicherweise falsche Byte-Reihenfolge\n"
+"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n"
+"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n"
+"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n"
+"wäre inkompatibel mit diesem Datenverzeichnis."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht fsyncen: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s zeigt Kontrollinformationen über einen PostgreSQL-Datenbankcluster.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATENVERZEICHNIS]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "startet"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "heruntergefahren"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "in der Wiederherstellung heruntergefahren"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "fährt herunter"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "bei der Wiederherstellung nach Absturz"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "bei der Archivwiederherstellung"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "im Produktionsmodus"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "nicht erkannter Statuscode"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "unbekanntes wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"WARNUNG: Berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in der Datei\n"
+"überein. Entweder ist die Datei kaputt oder sie hat ein anderes Layout\n"
+"als von diesem Programm erwartet. Die Ergebnisse unten sind nicht\n"
+"verlässlich.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "WARNUNG: ungültige WAL-Segmentgröße\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Die in der Datei gespeicherte WAL-Segmentgröße, %d Byte, ist keine\n"
+"Zweierpotenz zwischen 1 MB und 1 GB. Die Datei ist kaputt und die\n"
+"Ergebnisse unten sind nicht verlässlich.\n"
+"\n"
+msgstr[1] ""
+"Die in der Datei gespeicherte WAL-Segmentgröße, %d Bytes, ist keine\n"
+"Zweierpotenz zwischen 1 MB und 1 GB. Die Datei ist kaputt und die\n"
+"Ergebnisse unten sind nicht verlässlich.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control-Versionsnummer: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversionsnummer: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Datenbanksystemidentifikation: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Datenbank-Cluster-Status: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control zuletzt geändert: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Position des letzten Checkpoints: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "REDO-Position des letzten Checkpoints: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "REDO-WAL-Datei des letzten Checkpoints: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes des letzten Checkpoints: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "aus"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "an"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID des letzten Checkpoints: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB der oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB des oldestMulti des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Zeit des letzten Checkpoints: %s\n"
+
+#: pg_controldata.c:275
+#, 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:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minimaler Wiederherstellungsendpunkt: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Zeitleiste des minimalen Wiederherstellungsendpunkts: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Backup-Startpunkt: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Backup-Endpunkt: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "End-of-Backup-Eintrag erforderlich: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "nein"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ja"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level-Einstellung: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints-Einstellung: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections-Einstellung: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes-Einstellung: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders-Einstellung: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts-Einstellung: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact-Einstellung: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp-Einstellung: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximale Datenausrichtung (Alignment): %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Datenbankblockgröße: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blöcke pro Segment: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL-Blockgröße: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes pro WAL-Segment: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximale Bezeichnerlänge: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximale Spalten in einem Index: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximale Größe eines Stücks TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Größe eines Large-Object-Chunks: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Speicherung von Datum/Zeit-Typen: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-Bit-Ganzzahlen"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Ãœbergabe von Float8-Argumenten: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "Referenz"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "Wert"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Datenseitenprüfsummenversion: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Mock-Authentifizierungs-Nonce: %s\n"
diff --git a/src/bin/pg_controldata/po/el.po b/src/bin/pg_controldata/po/el.po
new file mode 100644
index 0000000..f08b70f
--- /dev/null
+++ b/src/bin/pg_controldata/po/el.po
@@ -0,0 +1,521 @@
+# Greek message translation file for pg_controldata
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:20+0000\n"
+"PO-Revision-Date: 2023-04-14 13:09+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για ανάγνωση: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "αναντιστοιχία διάταξης byte"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"πιθανή αναντιστοιχία διάταξης byte\n"
+"Η διάταξη byte που χÏησιμοποιείται για την αποθήκευση του αÏχείου pg_control "
+"ενδέχεται να μην ταιÏιάζει με αυτήν\n"
+"που χÏησιμοποιείται από αυτό το Ï€ÏόγÏαμμα. Στην πεÏίπτωση αυτή, τα παÏακάτω "
+"αποτελέσματα θα ήταν εσφαλμένα, και\n"
+"η εγκατάσταση PostgreSQL θα ήταν ασÏμβατη με αυτόν τον κατάλογο δεδομένων."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αÏχείο «%s»: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s εμφανίζει πληÏοφοÏίες ελέγχου μίας συστάδας βάσεων δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, μετά έξοδος\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοÏιστεί κατάλογος δεδομένων (DATADIR), χÏησιμοποιείται η\n"
+"μεταβλητή πεÏιβάλλοντος PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "εκκίνηση"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "τεÏματισμός"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "τεÏματισμός σε αποκατάσταση"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "τεÏματίζει"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "σε αποκατάσταση από κÏασάÏισμα"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "σε αποκατάσταση αÏχειοθήκης"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "σε παÏαγωγή"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "μη αναγνωÏίσιμος κωδικός κατάστασης"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "μη αναγνωÏίσιμο wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν οÏίστηκε κατάλογος δεδομένων"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Το υπολογιζόμενο άθÏοισμα ελέγχου CRC δεν συμφωνεί με την τιμή που "
+"είναι αποθηκευμένη στο αÏχείο.\n"
+"Είτε το αÏχείο είναι αλλοιωμένο είτε έχει διαφοÏετική διάταξη από αυτή που "
+"πεÏιμένει\n"
+"αυτό το Ï€ÏόγÏαμμα. Τα παÏακάτω αποτελέσματα είναι αναξιόπιστα.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: μη έγκυÏο μέγεθος τμήματος WAL\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αÏχείο, %d byte, δεν είναι "
+"δÏναμη\n"
+"του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB. Το αÏχείο είναι αλλοιωμένο και τα παÏακάτω "
+"αποτελέσματα\n"
+"είναι αναξιόπιστα.\n"
+"\n"
+msgstr[1] ""
+"Το μέγεθος τμήματος WAL που είναι αποθηκευμένο στο αÏχείο, %d bytes, δεν είναι "
+"δÏναμη\n"
+"του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB. Το αÏχείο είναι αλλοιωμένο και τα παÏακάτω "
+"αποτελέσματα\n"
+"είναι αναξιόπιστα.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control αÏιθμός έκδοσης: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "ΑÏιθμός έκδοσης καταλόγου: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ΑναγνωÏιστικό συστήματος βάσης δεδομένων: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Κατάσταση συστάδας βάσης δεδομένων: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "πιο Ï€Ïόσφατη μετατÏοπή pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Πιο Ï€Ïόσφατη τοποθεσία σημείου ελέγχου: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Πιο Ï€Ïόσφατη τοποθεσία REDO του σημείου ελέγχου: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Πιο Ï€Ïόσφατο αÏχείο REDO WAL του σημείου ελέγχου: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο TimeLineID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο PrevTimeLineID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Πιο Ï€Ïόσφατο full_page_writes του σημείου ελέγχου: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "κλειστό"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "ανοικτό"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Πιο Ï€Ïόσφατο NextXID του σημείου ελέγχου: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο NextOID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Πιο Ï€Ïόσφατο NextMultiXactId του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Πιο Ï€Ïόσφατο NextMultiOffset του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestXID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestXID’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestActiveXID του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestMultiXid του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestMulti’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestCommitTsXid του σημείου ελέγχου:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Πιο Ï€Ïόσφατο newestCommitTsXid του σημείου ελέγχου:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "ÎÏα του πιο Ï€Ïόσφατου σημείου ελέγχου: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "ΨεÏτικος μετÏητής LSN για μη κενές rels: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Ελάχιστη τοποθεσία τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î±Î½Î¬ÎºÎ±Î¼ÏˆÎ·Ï‚: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "ΧÏονογÏαμμή ελάχιστης θέσης τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î±Î½Î¬ÎºÎ±Î¼ÏˆÎ·Ï‚: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Τοποθεσία εκκίνησης Backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Τοποθεσία τεÏματισμου Backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Απαιτείται εγγÏαφή end-of-backup: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "όχι"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ναι"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "ÏÏθμιση wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "ÏÏθμιση wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "ÏÏθμιση max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "ÏÏθμιση max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "ÏÏθμιση max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "ÏÏθμιση max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "ÏÏθμιση max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "ÏÏθμιση track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Μέγιστη στοίχιση δεδομένων: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Μέγεθος μπλοκ WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes ανά τμήμα WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Μέγιστο μήκος αναγνωÏιστικών: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Μέγιστες στήλες σε ένα ευÏετήÏιο: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "ΤÏπος αποθήκευσης ημεÏομηνίας/ÏŽÏας: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "ΑκέÏαιοι 64-bit"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Μεταβλητή Float8 τέθηκε: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "με αναφοÏά"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "με τιμή"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Έκδοση αθÏοίσματος ελέγχου σελίδας δεδομένων: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Μακέτα (mock) nonce ταυτοποίησης: %s\n"
diff --git a/src/bin/pg_controldata/po/es.po b/src/bin/pg_controldata/po/es.po
new file mode 100644
index 0000000..58127cb
--- /dev/null
+++ b/src/bin/pg_controldata/po/es.po
@@ -0,0 +1,515 @@
+# Spanish message translation file for pg_controldata
+#
+# Copyright (c) 2002-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Karim Mribti <karim@mribti.com>, 2002.
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2003-2014
+# Martín Marqués <martin@2ndquadrant.com>, 2013
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:22+0000\n"
+"PO-Revision-Date: 2023-05-22 12:05+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:236
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "discordancia en orden de bytes"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"posible discordancia en orden de bytes\n"
+"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n"
+"coincidir con el usado por este programa. En tal caso los resultados de abajo\n"
+"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n"
+"directorio de datos."
+
+#: ../../common/controldata_utils.c:186
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:205
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s muestra información de control del cluster de PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPCIÓN] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un directorio de datos (DATADIR), se utilizará\n"
+"la variable de entorno PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "iniciando"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "apagado"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "apagado durante recuperación"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "apagándose"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "en recuperación"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "en recuperación desde archivo"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "en producción"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "código de estado no reconocido"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level no reconocido"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó el directorio de datos"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ATENCIÓN: La suma de verificación calculada no coincide con el valor\n"
+"almacenado en el archivo. Puede ser que el archivo esté corrupto, o\n"
+"bien tiene una estructura diferente de la que este programa está\n"
+"esperando. Los resultados presentados a continuación no son confiables.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "PRECAUCIÓN: tamaño de segmento de WAL no válido\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"El tamaño de segmento de WAL almacenado en el archivo, %d byte,\n"
+"no es una potencia de dos entre 1 MB y 1 GB. El archivo está corrupto y los\n"
+"resultados de abajo no son confiables.\n"
+msgstr[1] ""
+"El tamaño de segmento de WAL almacenado en el archivo, %d bytes,\n"
+"no es una potencia de dos entre 1 MB y 1 GB. El archivo está corrupto y los\n"
+"resultados de abajo no son confiables.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Número de versión de pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número de versión del catálogo: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador de sistema: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Estado del sistema de base de datos: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Última modificación de pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Ubicación del último checkpoint: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Ubicación de REDO de último checkpoint: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Ubicación de REDO de último checkpoint: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID del último checkpoint: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID del último checkpoint: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes del último checkpoint: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "desactivado"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "activado"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID de último checkpoint: %u/%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID de último checkpoint: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId de último checkpoint: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset de último checkpoint: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID del último checkpoint: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB del oldestXID del último checkpoint: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID del último checkpoint: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid del último checkpoint: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB del oldestMultiXid del últ. checkpoint: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Instante de último checkpoint: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Contador de LSN falsas para rels. unlogged: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Punto final mínimo de recuperación: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline de dicho punto final mínimo: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Ubicación del inicio de backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Ubicación del fin de backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Registro fin-de-backup requerido: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "no"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "sí"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Parámetro wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Parámetro wal_log_hings: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Parámetro max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Parámetro max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Parámetro max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Parámetro max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Parámetro max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Parámetro track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Alineamiento máximo de datos: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamaño de bloque de la base de datos: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloques por segmento en relación grande: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamaño del bloque de WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Máxima longitud de identificadores: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo número de columnas de un índice: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longitud máxima de un trozo TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Longitud máx. de un trozo de objeto grande: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de almacenamiento de horas y fechas: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "enteros de 64 bits"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Paso de parámetros float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "por referencia"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "por valor"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versión de sumas de verificación de datos: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Nonce para autentificación simulada: %s\n"
diff --git a/src/bin/pg_controldata/po/fr.po b/src/bin/pg_controldata/po/fr.po
new file mode 100644
index 0000000..a22d809
--- /dev/null
+++ b/src/bin/pg_controldata/po/fr.po
@@ -0,0 +1,569 @@
+# LANGUAGE message translation file for pg_controldata
+# Copyright (C) 2002-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Loïc Hennequin <loic.hennequin@wanadoo.fr>, 2002.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "différence de l'ordre des octets"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"possible incohérence dans l'ordre des octets\n"
+"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n"
+"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n"
+"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n"
+"est incompatible avec ce répertoire des données."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s affiche les informations de contrôle de l'instance PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [RÉP_DONNÉES]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata] RÉP_DONNEES répertoire de la base de données\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "démarrage en cours"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "arrêt"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "arrêt pendant la restauration"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "arrêt en cours"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "restauration en cours (suite à un arrêt brutal)"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "restauration en cours (à partir des archives)"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "en production"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "code de statut inconnu"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level non reconnu"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ATTENTION : Les sommes de contrôle (CRC) calculées ne correspondent pas aux\n"
+"valeurs stockées dans le fichier.\n"
+"Soit le fichier est corrompu, soit son organisation diffère de celle\n"
+"attendue par le programme.\n"
+"Les résultats ci-dessous ne sont pas dignes de confiance.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ATTENTION : taille invalide du segment WAL\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"La taille d'un segment WAL enregistré dans le fichier, %d octet, n'est pas une puissance de deux "
+"entre 1 Mo et 1 Go. Le fichier est corrompu et les résultats ci-dessous ne proviennent pas d'une "
+"source fiable.\n"
+"\n"
+msgstr[1] ""
+"La taille d'un segment WAL enregistré dans le fichier, %d octets, n'est pas une puissance de deux "
+"entre 1 Mo et 1 Go. Le fichier est corrompu et les résultats ci-dessous ne proviennent pas d'une "
+"source fiable.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Numéro de version de pg_control : %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numéro de version du catalogue : %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identifiant du système de base de données : %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "État du cluster de base de données : %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Dernière modification de pg_control : %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Dernier point de contrôle : %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Dernier REDO (reprise) du point de contrôle : %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Dernier fichier WAL du rejeu du point de contrôle : %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Dernier TimeLineID du point de contrôle : %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Dernier PrevTimeLineID du point de contrôle : %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Dernier full_page_writes du point de contrôle : %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "désactivé"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "activé"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Dernier NextXID du point de contrôle : %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Dernier NextOID du point de contrôle : %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Dernier NextMultiXactId du point de contrôle : %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Dernier NextMultiOffset du point de contrôle : %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Dernier oldestXID du point de contrôle : %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Dernier oldestXID du point de contrôle de la base : %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Dernier oldestActiveXID du point de contrôle : %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Dernier oldestMultiXid du point de contrôle : %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Heure du dernier point de contrôle : %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Faux compteur LSN pour les relations non journalisés : %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Emplacement de fin de la récupération minimale : %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline de l'emplacement de fin de restauration : %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Début de la sauvegarde : %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Fin de la sauvegarde : %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Enregistrement de fin de sauvegarde requis : %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "non"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "oui"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Paramètrage actuel de wal_level : %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Paramétrage actuel de wal_log_hints : %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Paramètrage actuel de max_connections : %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Paramétrage actuel de max_worker_processes : %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Paramètrage actuel de max_wal_senders : %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Paramètrage actuel de max_prepared_xacts : %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Paramètrage actuel de max_locks_per_xact : %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Paramètrage actuel de track_commit_timestamp : %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Alignement maximal des données : %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Taille du bloc de la base de données : %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocs par segment des relations volumineuses : %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Taille de bloc du journal de transaction : %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Octets par segment du journal de transaction : %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Longueur maximale des identifiants : %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Nombre maximum de colonnes d'un index: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longueur maximale d'un morceau TOAST : %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Taille d'un morceau de Large Object : %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Stockage du type date/heure : %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "entiers 64-bits"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passage d'argument float8 : %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "par référence"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "par valeur"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Version des sommes de contrôle des pages de données : %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Nonce pour simuler une identité: %s\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide et quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version et quitte\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not read file \"%s\": read %d of %d\n"
+#~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Passage d'argument float4 : %s\n"
+
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "Point de contrôle précédent : %X/%X\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Usage :\n"
+#~ " %s [OPTION] [RÉP_DONNÉES]\n"
+#~ "\n"
+#~ "Options :\n"
+#~ " --help affiche cette aide et quitte\n"
+#~ " --version affiche les informations de version et quitte\n"
+
+#~ msgid "calculated CRC checksum does not match value stored in file"
+#~ msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "nombres à virgule flottante"
diff --git a/src/bin/pg_controldata/po/it.po b/src/bin/pg_controldata/po/it.po
new file mode 100644
index 0000000..cc35f96
--- /dev/null
+++ b/src/bin/pg_controldata/po/it.po
@@ -0,0 +1,547 @@
+#
+# pg_controldata.po
+# Italian message translation file for pg_controldata
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org> 2010
+# Mirko Tebaldi <mirko.tebaldi@libero.it>, 2004
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2022-09-26 15:19+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "apertura del file \"%s\" in lettura fallita: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "lettura del file \"%s\" fallita: letti %d di %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ordinamento dei byte non combaciante"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"possibile mancata corrispondenza dell'ordine dei byte\n"
+"L'ordine dei byte utilizzato per memorizzare il file pg_control potrebbe "
+"non corrispondere a quello\n"
+"utilizzato da questo programma. In tal caso i risultati seguenti non "
+"sarebbero corretti, e\n"
+"l'installazione di PostgreSQL sarebbe incompatibile con questa directory "
+"di dati."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "fsync del file \"%s\" fallito: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s mostra informazioni di controllo su un cluster di database PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPZIONE] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non viene specificata un directory per i dati (DATADIR) verrà usata la\n"
+"variabile d'ambiente PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s pagina iniziale: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "avvio in corso"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "spento"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "arresto durante il ripristino"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "arresto in corso"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "in fase di recupero da un crash"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "in fase di recupero di un archivio"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "in produzione"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "codice di stato sconosciuto"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level sconosciuto"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ATTENZIONE: Il codice di controllo CRC calcolato non combacia con quello\n"
+"memorizzato nel file. O il file è corrotto o ha un formato diverso da "
+"quanto\n"
+"questo programma si aspetta. I risultati seguenti non sono affidabili.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ATTENZIONE: dimensione del segmento WAL non valida\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"La dimensione del segmento WAL memorizzata nel file, %d byte, non è una\n"
+"potenza di 2 tra 1 MB e 1 GB. Il file è corrotto e i risultati\n"
+"sottostanti non sono affidabili.\n"
+"\n"
+msgstr[1] ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "numero di versione di pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numero di versione del catalogo: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificatore di sistema del database: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Stato del cluster di database: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "ultima modifica a pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Ultima posizione del checkpoint: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Locazione di REDO dell'ultimo checkpoint: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "File WAL di REDO dell'ultimo checkpoint: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineId dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Full_page_writes dell'ultimo checkpoint: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "disattivato"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "attivato"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID dell'ultimo checkpoint: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "OldestXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB dell'oldestXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "OldestActiveXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "OldestMultiXID dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB dell'oldestMulti dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "OldestCommitTsXid dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "NewestCommitTsXid dell'ultimo checkpoint: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Orario ultimo checkpoint: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Falso contatore LSN per rel. non loggate: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Posizione del minimum recovery ending: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline posiz. minimum recovery ending: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Posizione dell'inizio del backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Posizione della fine del backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Record di fine backup richiesto: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "no"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "sì"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "impostazione di wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "impostazione di wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "impostazione di max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "impostazione di max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "impostazione di max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "impostazione di max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "impostazione di max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "impostazione di track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Massimo allineamento dei dati: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Dimensione blocco database: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocchi per ogni segmento grosse tabelle: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Dimensione blocco WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Byte per segmento WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Lunghezza massima degli identificatori: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Massimo numero di colonne in un indice: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Massima dimensione di un segmento TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Dimensione di un blocco large-object: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Memorizzazione per tipi data/ora: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "interi a 64 bit"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passaggio di argomenti Float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "per riferimento"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "per valore"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versione somma di controllo dati pagine: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Finto nonce di autenticazione: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: apertura del file \"%s\" per la lettura fallita: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: lettura del file \"%s\" fallita: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": read %d of %d\n"
+#~ msgstr "%s: lettura del file \"%s\" fallita: letti %d di %d\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Passaggio di argomenti Float4: %s\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
diff --git a/src/bin/pg_controldata/po/ja.po b/src/bin/pg_controldata/po/ja.po
new file mode 100644
index 0000000..c6d728d
--- /dev/null
+++ b/src/bin/pg_controldata/po/ja.po
@@ -0,0 +1,526 @@
+# Japanese message translation file for pg_controldata
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL 16)\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 13:48+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ã®ä¸æ•´åˆ"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒç•°ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"pg_controlファイルを格ç´ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒæœ¬ãƒ—ログラムã§ä½¿ç”¨\n"
+"ã•ã‚Œã‚‹ã‚‚ã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n"
+"PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚"
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s ã¯PostgreSQLデータベースクラスタã®åˆ¶å¾¡æƒ…報を表示ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データディレクトリ(DATADIR)ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€PGDATA環境変数ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "起動処ç†ä¸­"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "シャットダウン"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "リカãƒãƒªä¸­ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ã‚‹"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "シャットダウン処ç†ä¸­"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "クラッシュリカãƒãƒªä¸­"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "アーカイブリカãƒãƒªä¸­"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "é‹ç”¨ä¸­"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "未知ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level ã‚’èªè­˜ã§ãã¾ã›ã‚“"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"警告: CRCãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®è¨ˆç®—çµæžœãŒãƒ•ã‚¡ã‚¤ãƒ«å†…ã®å€¤ã¨ä¸€è‡´ã—ã¾ã›ã‚“。\n"
+"ファイルã®ç ´æã€ã‚ã‚‹ã„ã¯ã€æœ¬ãƒ—ログラムãŒæƒ³å®šã™ã‚‹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ç•°ãªã‚‹\n"
+"å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚以下ã®çµæžœã¯ä¿¡é ¼ã§ãã¾ã›ã‚“。\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "警告: ä¸æ­£ãªWALセグメントサイズ\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"ファイル中ã®WALセグメントサイズ㯠%d ãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯\n"
+"1MBã‹ã‚‰1GBã¾ã§ã®2ã®ç´¯ä¹—ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯å£Šã‚Œã¦ãŠã‚Šã€\n"
+"以下ã®æƒ…å ±ã¯ä¿¡é ¼ã§ãã¾ã›ã‚“。\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_controlãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "カタログãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "データベースシステム識別å­: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "データベースクラスタã®çŠ¶æ…‹: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control最終更新: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®REDOä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®REDO WALファイル: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®æ™‚系列ID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "オフ"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "オン"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXIDã®DB: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiã®DB: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestCommitTsXid: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®newestCommitTsXid: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆæ™‚刻: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "UNLOGGEDリレーションã®å½ã®LSNカウンタ: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "最å°ãƒªã‚«ãƒãƒªçµ‚了ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "最å°ãƒªã‚«ãƒãƒªçµ‚了ä½ç½®ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—開始ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—終了ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "å¿…è¦ãªãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—最終レコード: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "ã„ã„ãˆ"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ã¯ã„"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_levelã®è¨­å®š: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hintsã®è¨­å®š: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connectionsã®è¨­å®š: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processesã®è¨­å®š: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_sendersã®è¨­å®š: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xactsã®è¨­å®š: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xactã®è¨­å®š: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestampã®è¨­å®š: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大データアラインメント: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "データベースã®ãƒ–ロックサイズ: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大ããªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆæ¯Žã®ãƒ–ロック数:%u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WALã®ãƒ–ロックサイズ: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WALセグメント当ãŸã‚Šã®ãƒã‚¤ãƒˆæ•°: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "識別å­ã®æœ€å¤§é•·: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "インデックス内ã®æœ€å¤§åˆ—æ•°: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOASTãƒãƒ£ãƒ³ã‚¯ã®æœ€å¤§ã‚µã‚¤ã‚º: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "ラージオブジェクトãƒãƒ£ãƒ³ã‚¯ã®ã‚µã‚¤ã‚º: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日付/時刻型ã®æ ¼ç´æ–¹å¼: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64ビット整数"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8引数ã®æ¸¡ã—æ–¹: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "å‚照渡ã—"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "値渡ã—"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "データベージãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "èªè¨¼ç”¨ã®ç–‘ä¼¼nonce: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: 読ã¿å–り用ã®\"%s\"ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\"ファイルã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": read %d of %d\n"
+#~ msgstr "%1$s: ファイル\"%2$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %4$dãƒã‚¤ãƒˆã®ã†ã¡%3$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ\n"
+
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "å‰å›žã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä½ç½®: %X/%X\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦ã€çµ‚了ã—ã¾ã™\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦ã€çµ‚了ã—ã¾ã™\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Float4引数ã®æ¸¡ã—æ–¹: %s\n"
diff --git a/src/bin/pg_controldata/po/ka.po b/src/bin/pg_controldata/po/ka.po
new file mode 100644
index 0000000..49044c0
--- /dev/null
+++ b/src/bin/pg_controldata/po/ka.po
@@ -0,0 +1,515 @@
+# Georgian message translation file for pg_controldata
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-04 20:26+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ "
+"გáƒáƒ›áƒáƒ§áƒ”ნებული \n"
+"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. "
+"áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n"
+"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრ"
+"სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•áƒ¡áƒ”ბელი იქნებáƒ."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ¡ PostgreSQL ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის შესáƒáƒ®áƒ”ბ.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრ\n"
+"გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბáƒ"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ვáƒ"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ვრáƒáƒ¦áƒ“გენსთვის"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒ›áƒáƒ áƒ—ვáƒ"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ¦áƒ“გენáƒ"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "წáƒáƒ áƒ›áƒáƒ”ბáƒáƒ¨áƒ˜ გáƒáƒ¨áƒ•áƒ”ბული"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ უცნáƒáƒ‘ი კáƒáƒ“ი"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "უცნáƒáƒ‘ი wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"გáƒáƒ¤áƒ áƒ—ხილებáƒ: გáƒáƒ›áƒáƒ—ვლილი CRC სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒš მნიშვნელáƒáƒ‘áƒáƒ¡ áƒáƒ  "
+"ემთხვევáƒ. \n"
+"ფáƒáƒ˜áƒšáƒ˜ áƒáƒœ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ, áƒáƒœ áƒáƒ¥áƒ•áƒ¡ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბული მიმდევრáƒáƒ‘áƒ. ვიდრე \n"
+"პრáƒáƒ’რáƒáƒ›áƒ ელáƒáƒ“ებáƒ. ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜ შედეგები áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "გáƒáƒ¤áƒ áƒ—ხლებáƒ: WAL-ის სეგმენტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ, %d ბáƒáƒ˜áƒ¢áƒ˜, áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ˜áƒ¡ \n"
+"ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜1 მბ-დáƒáƒœ 1 გბ-მდე. ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემáƒáƒ— მáƒáƒªáƒ”მულირშედეგები\n"
+"áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n"
+msgstr[1] ""
+"ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ, %d ბáƒáƒ˜áƒ¢áƒ˜, áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ˜áƒ¡ \n"
+"ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜1 მბ-დáƒáƒœ 1 გბ-მდე. ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემáƒáƒ— მáƒáƒªáƒ”მულირშედეგები\n"
+"áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control ვერსიის ნáƒáƒ›áƒ”რი: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "კáƒáƒ¢áƒáƒšáƒáƒ’ის ვერსიის ნáƒáƒ›áƒ”რი: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ბáƒáƒ–ის სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control-ის ბáƒáƒšáƒ ცვლილების დრáƒ: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის REDO-ის უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის REDO WAL ფáƒáƒ˜áƒšáƒ˜: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილისTimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ული"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "ჩáƒáƒ áƒ—"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID's DB: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMulti's DB: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestCommitTsXid:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის newestCommitTsXid:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒáƒšáƒ წერტილის დრáƒ: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "LSN-ის ყáƒáƒšáƒ‘ი მთვლელი áƒáƒ áƒáƒŸáƒ£áƒ áƒœáƒáƒšáƒ˜áƒ–ებáƒáƒ“ი ურთ-თვის: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "მინიმáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¦áƒ“გენის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "მინ. áƒáƒ¦áƒ“გ დáƒáƒ¡áƒáƒ¡áƒ  მდებáƒáƒ  დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡-ბáƒáƒšáƒ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "áƒáƒ áƒ"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "დიáƒáƒ®"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level პáƒáƒ áƒáƒ›áƒ”ტრი: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints პáƒáƒ áƒáƒ›áƒ”ტრი: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp პáƒáƒ áƒáƒ›áƒ”ტრი: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სწáƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "ბáƒáƒ–ის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "დიდი ურთიერთáƒáƒ‘ის სეგმენტები თითáƒáƒ”ულ ბლáƒáƒ™áƒ¨áƒ˜: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "ბáƒáƒ˜áƒ¢áƒ”ბი თითáƒáƒ”ულ WAL სეგმენტში: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "იდენტიფიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "ინდექსში სვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST ნáƒáƒ’ლეჯის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ტიპის სáƒáƒªáƒáƒ•áƒ˜: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-ბიტიáƒáƒœáƒ˜ მთელ რიცხვები"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მáƒ: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "ბმით"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "მნიშვნელáƒáƒ‘ით"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "ფსევდáƒáƒáƒ•áƒ—ენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ შემთხვევითი რიცხვი: %s\n"
diff --git a/src/bin/pg_controldata/po/ko.po b/src/bin/pg_controldata/po/ko.po
new file mode 100644
index 0000000..4b40dca
--- /dev/null
+++ b/src/bin/pg_controldata/po/ko.po
@@ -0,0 +1,504 @@
+# Korean message translation file for PostgreSQL pg_controldata
+# Ioseph Kim <ioseph@uri.sarang.net>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:52+0000\n"
+"PO-Revision-Date: 2023-05-30 12:38+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ê¸° 모드로 ì—´ 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:236
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다: %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ë°”ì´íŠ¸ 순서 불ì¼ì¹˜"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"ë°”ì´íŠ¸ 순서가 ì¼ì¹˜í•˜ì§€ 않습니다.\n"
+"pg_control 파ì¼ì„ 저장하는 ë° ì‚¬ìš©ëœ ë°”ì´íŠ¸ 순서는 \n"
+"ì´ í”„ë¡œê·¸ëž¨ì—ì„œ 사용하는 순서와 ì¼ì¹˜í•´ì•¼ 합니다. ì´ ê²½ìš° 아래 결과는\n"
+"올바르지 않으며 ì´ ë°ì´í„° ë””ë ‰í„°ë¦¬ì— PostgreSQLì„ ì„¤ì¹˜í•  수 없습니다."
+
+#: ../../common/controldata_utils.c:186
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:205
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 쓸 수 없습니다: %m"
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ fsync í•  수 없습니다: %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ì˜ 제어정보를 보여줌.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [옵션] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR ë°ì´í„° 디렉터리\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보 보여주고 마침\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"DATADIRì¸ ë°ì´í„° 디렉터리를 지정하지 않으며, PGDATA 환경 변수값ì„\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "시작 중"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "중지ë¨"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "복구 ìž‘ì—… 중 중지ë¨"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "중지 중"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "ë¹„ì •ìƒ ì¢…ë£Œ 복구 중"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "ìžë£Œ 복구 중"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "ì •ìƒê°€ë™ì¤‘"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "알수 없는 ìƒíƒœ 코드"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "알 수 없는 wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "ë°ì´í„° 디렉터리를 지정하지 않았습니다"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"경고: ê³„ì‚°ëœ CRC ì²´í¬ì„¬ê°’ì´ íŒŒì¼ì— 있는 ê°’ê³¼ 틀립니다.\n"
+"ì´ ê²½ìš°ëŠ” 파ì¼ì´ ì†ìƒë˜ì—ˆê±°ë‚˜, ì´ í”„ë¡œê·¸ëž¨ê³¼ 컨트롤 파ì¼ì˜ ë²„ì „ì´ í‹€ë¦°\n"
+"경우입니다. ê²°ê³¼ê°’ë“¤ì€ ë¯¿ì§€ 못할 ê°’ë“¤ì´ ì¶œë ¥ë  ìˆ˜ 있습니다.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "경고: ìž˜ëª»ëœ WAL ì¡°ê° í¬ê¸°\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"ì €ìž¥ëœ WAL ì¡°ê° íŒŒì¼ì˜ í¬ê¸°ëŠ” %d ë°”ì´íŠ¸ìž…니다. ì´ ê°’ì€ 1MB부터 1GB사ì´\n"
+"2^n ê°’ì´ ì•„ë‹™ë‹ˆë‹¤. 파ì¼ì´ ì†ìƒë˜ì—ˆìœ¼ë©°, ê²°ê³¼ ë˜í•œ ë¯¿ì„ ìˆ˜ 없습니다.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 버전 번호: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "카탈로그 버전 번호: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 시스템 ì‹ë³„ìž: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„° ìƒíƒœ: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control 마지막 변경시간: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ 위치: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ REDO 위치: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ REDO WAL 파ì¼: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ TimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "off"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "on"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ì˜¤ëž˜ëœXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ì˜¤ëž˜ëœXIDì˜ DB: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ì˜¤ëž˜ëœActiveXID:%u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ì˜¤ëž˜ëœMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ì˜¤ëž˜ëœë©€í‹°Xid DB:%u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ì˜¤ëž˜ëœCommitTsXid:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ 최신CommitTsXid: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ 시간: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "언로그 릴레ì´ì…˜ì˜ 가짜 LSN ì¹´ìš´í„°: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "최소 복구 마지막 위치: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "최소 복구 종료 ìœ„ì¹˜ì˜ íƒ€ìž„ë¼ì¸: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "백업 시작 위치: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "백업 종료 위치: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "백업 종료 레코드 필요 여부: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "아니오"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "예"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level 설정값: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints 설정값: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections 설정값: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes 설정값: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders 설정값: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts 설정값: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact 설정값: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp 설정값: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "최대 ìžë£Œ ì •ë ¬: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ë¸”ë¡ í¬ê¸°: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "대형 릴레ì´ì…˜ì˜ 세그먼트당 블럭 개수: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL ë¸”ë¡ í¬ê¸°: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WAL ì„¸ê·¸ë¨¼íŠ¸ì˜ í¬ê¸°(byte): %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "ì‹ë³„ìž ìµœëŒ€ 길ì´: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "ì¸ë±ìŠ¤ì—ì„œ 사용하는 최대 ì—´ 수: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST ì²­í¬ ìµœëŒ€ í¬ê¸°: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "대형 ê°ì²´ ì²­í¬ í¬ê¸°: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "날짜/시간형 ìžë£Œì˜ 저장방ì‹: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-비트 정수"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 ì¸ìˆ˜ 전달: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "참조별"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "값별"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "ë°ì´í„° 페ì´ì§€ ì²´í¬ì„¬ 버전: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "ìž„ì‹œ ëª¨ì˜ ì¸ì¦: %s\n"
diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build
new file mode 100644
index 0000000..685f1c1
--- /dev/null
+++ b/src/bin/pg_controldata/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_controldata-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_controldata/po/pl.po b/src/bin/pg_controldata/po/pl.po
new file mode 100644
index 0000000..7f52886
--- /dev/null
+++ b/src/bin/pg_controldata/po/pl.po
@@ -0,0 +1,464 @@
+# PG_CONTROLDATA Translated Messages into the Polish Language
+# Copyright (c) 2005 toczek, xxxtoczekxxx@wp.pl
+# Distributed under the same licensing terms as PostgreSQL itself.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-03-14 17:46+0000\n"
+"PO-Revision-Date: 2017-03-14 19:40+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/controldata_utils.c:61
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\" do odczytu: %s\n"
+
+#: ../../common/controldata_utils.c:74
+#, c-format
+msgid "%s: could not read file \"%s\": %s\n"
+msgstr "%s: nie można czytać z pliku \"%s\": %s\n"
+
+#: ../../common/controldata_utils.c:95
+msgid "byte ordering mismatch"
+msgstr "niepoprawna kolejność bajtów"
+
+#: ../../common/controldata_utils.c:97
+#, c-format
+msgid ""
+"WARNING: possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory.\n"
+msgstr ""
+"OSTRZEŻENIE: możliwe niepoprawna kolejność bajtów\n"
+"Kolejność bajtów używana do przechowywania plików pg_control może nie "
+"pasować\n"
+"do używanej przez ten program. W tym przypadku wynik poniżej jest błędny,\n"
+"a instalacja PostgreSQL byłaby niezgodna z tym folderem danych.\n"
+
+#: pg_controldata.c:33
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s wyświetla informacje kontrolne klastra bazy danych PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:34
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_controldata.c:35
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPCJA] [FOLDERDANYCH]\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcje:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " [-D] DATADIR data directory\n"
+msgstr " [-D] DATADIR folder bazy danych\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version wypisuje informacje o wersji i kończy\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokazuje ten ekran pomocy i kończy\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"W przypadku gdy katalog danych nie jest podany (DATADIR), zmienna "
+"środowiskowa PGDATA\n"
+"jest używana.\n"
+"\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_controldata.c:52
+msgid "starting up"
+msgstr "włączanie"
+
+#: pg_controldata.c:54
+msgid "shut down"
+msgstr "wyłącz bazę danych"
+
+#: pg_controldata.c:56
+msgid "shut down in recovery"
+msgstr "baza danych w trybie odzyskiwania"
+
+#: pg_controldata.c:58
+msgid "shutting down"
+msgstr "wyłączanie bazy danych"
+
+#: pg_controldata.c:60
+msgid "in crash recovery"
+msgstr "w trybie odzyskiwania po awarii programu"
+
+#: pg_controldata.c:62
+msgid "in archive recovery"
+msgstr "w trybie odzyskiwania z archiwum"
+
+#: pg_controldata.c:64
+msgid "in production"
+msgstr "baza danych w trybie produkcji"
+
+#: pg_controldata.c:66
+msgid "unrecognized status code"
+msgstr "nieznany kod statusu"
+
+#: pg_controldata.c:81
+msgid "unrecognized wal_level"
+msgstr "nierozpoznany wal_level"
+
+#: pg_controldata.c:130 pg_controldata.c:148 pg_controldata.c:156
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_controldata.c:146
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_controldata.c:155
+#, c-format
+msgid "%s: no data directory specified\n"
+msgstr "%s: katalog danych nie został ustawiony\n"
+
+#: pg_controldata.c:163
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"UWAGA: obliczona suma kontrolna CRC pliku nie zgadza siÄ™.\n"
+"Albo plik jest uszkodzony albo posiada inny układ niż program się "
+"spodziewał.\n"
+"Rezultaty mogą być niepewne.\n"
+"\n"
+
+#: pg_controldata.c:201
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control w wersji numer: %u\n"
+
+#: pg_controldata.c:203
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalog w wersji numer: %u\n"
+
+#: pg_controldata.c:205
+#, c-format
+msgid "Database system identifier: %s\n"
+msgstr "Identyfikator systemu bazy danych: %s\n"
+
+#: pg_controldata.c:207
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Stan klastra bazy danych: %s\n"
+
+#: pg_controldata.c:209
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control ostatnio modyfikowano: %s\n"
+
+#: pg_controldata.c:211
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Najnowsza lokalizacja punktu kontrolnego: %X/%X\n"
+
+#: pg_controldata.c:214
+#, c-format
+msgid "Prior checkpoint location: %X/%X\n"
+msgstr "Uprzednia lokalizacja punktu kontrolnego: %X/%X\n"
+
+#: pg_controldata.c:217
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Najnowsza lokalizacja punktu kontrolnego REDO: %X/%X\n"
+
+#: pg_controldata.c:220
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Najnowszy plik WAL REDO punktu kontrolnego: %s\n"
+
+#: pg_controldata.c:222
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:224
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:226
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes najnowszego punktu kontrolnego: %s\n"
+
+#: pg_controldata.c:227 pg_controldata.c:272 pg_controldata.c:282
+msgid "off"
+msgstr "wyłączone"
+
+#: pg_controldata.c:227 pg_controldata.c:272 pg_controldata.c:282
+msgid "on"
+msgstr "włączone"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID najnowszego punktu kontrolnego: %u:%u\n"
+
+#: pg_controldata.c:231
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:233
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:235
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:237
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "NextXID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:239
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB oldestXID'u najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:241
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:243
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:245
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB oldestMulti'u najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:247
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:249
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid najnowszego punktu kontrolnego: %u\n"
+
+#: pg_controldata.c:251
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Czas najnowszego punktu kontrolnego: %s\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Fałszywy licznik LSN dla niezalogowanych rel: %X/%X\n"
+
+#: pg_controldata.c:256
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Położenie zakończenia odzyskiwania minimalnego: %X/%X\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Położenie odzyskiwania min. zak. linii czasu: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Położenie początku kopii zapasowej: %X/%X\n"
+
+#: pg_controldata.c:264
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Położenie końca kopii zapasowej: %X/%X\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Wymagany rekord końca-kopii-zapasowej: %s\n"
+
+#: pg_controldata.c:268
+msgid "no"
+msgstr "nie"
+
+#: pg_controldata.c:268
+msgid "yes"
+msgstr "tak"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "ustawienie wal_level: %s\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "ustawienie wal_log_hints: %s\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "ustawienie max_connections: %d\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "ustawienie max_worker_processes: %d\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "ustawienie max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "ustawienie max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "ustawienie wal_log_hints: %s\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maksymalne wyrównanie danych: %u\n"
+
+#: pg_controldata.c:286
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Wielkość bloku bazy danych: %u\n"
+
+#: pg_controldata.c:288
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloki na segment sÄ… w relacji: %u\n"
+
+#: pg_controldata.c:290
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Wielkość bloku WAL: %u\n"
+
+#: pg_controldata.c:292
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bajtów na segment WAL: %u\n"
+
+#: pg_controldata.c:294
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maksymalna długość identyfikatorów: %u\n"
+
+#: pg_controldata.c:296
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maksymalna liczba kolumn w indeksie: %u\n"
+
+#: pg_controldata.c:298
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maksymalny rozmiar fragmentu TOAST: %u\n"
+
+#: pg_controldata.c:300
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Rozmiar fragmentu dużego obiektu: %u\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Typ przechowywania daty/czasu: %s\n"
+
+#: pg_controldata.c:304
+msgid "64-bit integers"
+msgstr "64-bitowe zmienne integer"
+
+#: pg_controldata.c:305
+#, c-format
+msgid "Float4 argument passing: %s\n"
+msgstr "Przekazywanie parametru float4: %s\n"
+
+#: pg_controldata.c:306 pg_controldata.c:308
+msgid "by reference"
+msgstr "przez referencjÄ™"
+
+#: pg_controldata.c:306 pg_controldata.c:308
+msgid "by value"
+msgstr "przez wartość"
+
+#: pg_controldata.c:307
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Przekazywanie parametru float8: %s\n"
+
+#: pg_controldata.c:309
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Suma kontrolna strony danych w wersji numer: %u\n"
+
+#: pg_controldata.c:311
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Makiety autoryzacji nonce: %s\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "liczby zmiennoprzecinkowe"
+
+#~ msgid "calculated CRC checksum does not match value stored in file"
+#~ msgstr "wyliczona suma kontrolna CRC nie pasuje do wartości przechowywanej w pliku"
diff --git a/src/bin/pg_controldata/po/pt_BR.po b/src/bin/pg_controldata/po/pt_BR.po
new file mode 100644
index 0000000..4a697d5
--- /dev/null
+++ b/src/bin/pg_controldata/po/pt_BR.po
@@ -0,0 +1,512 @@
+# Brazilian Portuguese message translation file for pg_controldata
+
+# Copyright (C) 2002-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Cesar Suga <sartre@linuxbr.com>, 2002.
+# Roberto Mello <rmello@fslc.usu.edu>, 2002.
+# Euler Taveira <euler@eulerto.com>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2023-09-05 08:59+0200\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "não pôde ler arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "não pôde ler arquivo \"%s\", leu %d de %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "não pôde fechar arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ordenação de bytes não corresponde"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"possível não correspondência da ordenação de bytes\n"
+"A ordenação de bytes utilizada para armazenar o arquivo pg_control pode não \n"
+"corresponder com a utilizada por este programa. Neste caso os resultados abaixo\n"
+"seriam incorretos, e a instalação do PostgreSQL seria incompatível com o diretório de dados."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "não pôde escrever no arquivo \"%s\": %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "não pôde executar fsync no arquivo \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s mostra informações de controle de um agrupamento de banco de dados PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPÇÃO] [DIRDADOS]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se o diretório de dados (DIRDADOS) não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "iniciando"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "desligado"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "desligado em recuperação"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "desligando"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "recuperando de uma queda"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "recuperando de uma cópia"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "em produção"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "código de status desconhecido"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "wal_level desconhecido"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"AVISO: A soma de verificação de CRC não é a mesma do valor armazenado no arquivo.\n"
+"O arquivo está corrompido ou tem um formato diferente do que este programa\n"
+"está esperando. Os resultados abaixo não são confiáveis.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "AVISO: tamanho do segmento do WAL inválido\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Tamanho do segmento do WAL armazenado no arquivo, %d byte, não é uma potência de\n"
+"dois entre 1 MB e 1 GB. O arquivo está corrompido e os resultados abaixos não são\n"
+"confiáveis.\n"
+msgstr[1] ""
+"Tamanho do segmento do WAL armazenado no arquivo, %d bytes, não é uma potência de\n"
+"dois entre 1 MB e 1 GB. O arquivo está corrompido e os resultados abaixos não são\n"
+"confiáveis.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "número da versão do pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número da versão do catálogo: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador do sistema de banco de dados: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Estado do agrupamento de banco de dados: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "Última modificação do pg_control: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Local do último ponto de controle: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Local de REDO do último ponto de controle: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Arquivo com REDO do último ponto de controle: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes do último ponto de controle: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "desabilitado"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "habilitado"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID do último ponto de controle: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId do último ponto de controle: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset do último ponto de controle: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "BD do oldestXID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID do último ponto de controle: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid do último ponto de controle: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "BD do oldestMulti do último ponto de controle: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Hora do último ponto de controle: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Contador LSN falso para relações unlogged: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Local final mínimo de recuperação: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Linha do tempo do local final mínimo de recuperação: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Local de início da cópia de segurança: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Local de fim da cópia de segurança: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Registro de fim-da-cópia-de-segurança requerido: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "não"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "sim"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Definição de wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Definição de wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Definição de max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Definição de max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Definição de max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Definição de max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Definição de max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Definição de track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Máximo alinhamento de dado: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamanho do bloco do banco de dados: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocos por segmento da relação grande: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamanho do bloco do WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento do WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Tamanho máximo de identificadores: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo de colunas em um índice: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Tamanho máximo do bloco TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Tamanho máximo do bloco de objeto grande: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de data/hora do repositório: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "inteiros de 64 bits"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passagem de argumento float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "por referência"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "por valor"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versão da verificação de páginas de dados: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "nonce para autenticação simulada: %s\n"
diff --git a/src/bin/pg_controldata/po/ru.po b/src/bin/pg_controldata/po/ru.po
new file mode 100644
index 0000000..430ec92
--- /dev/null
+++ b/src/bin/pg_controldata/po/ru.po
@@ -0,0 +1,585 @@
+# Russian message translation file for pg_controldata
+# Copyright (C) 2002-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2002-2004.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Andrey Sudnik <sudnikand@gmail.com>, 2011.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:08+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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/controldata_utils.c:83
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m"
+
+#: ../../common/controldata_utils.c:96
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:105
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)"
+
+#: ../../common/controldata_utils.c:118 ../../common/controldata_utils.c:266
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:154
+msgid "byte ordering mismatch"
+msgstr "неÑоответÑтвие порÑдка байт"
+
+#: ../../common/controldata_utils.c:156
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"возможно неÑоответÑтвие порÑдка байт\n"
+"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n"
+"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n"
+"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных."
+
+#: ../../common/controldata_utils.c:216
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:235
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:254
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s показывает информацию о работе клаÑтера баз PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [ПÐРÐМЕТР] [КÐТ_ДÐÐÐЫХ]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КÐТ_ДÐÐÐЫХ каталог данных\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"ЕÑли каталог данных (КÐТ_ДÐÐÐЫХ) не задан, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ\n"
+"переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "запуÑкаетÑÑ"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "выключен"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "выключен при воÑÑтановлении"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "выключение"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "воÑÑтановление поÑле ÑбоÑ"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "воÑÑтановление из архива"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "в работе"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "нераÑпознанный код ÑоÑтоÑниÑ"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "нераÑпознанный уровень WAL"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: ВычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма не Ñовпадает Ñо значением в "
+"файле.\n"
+"Либо файл повреждён, либо его формат отличаетÑÑ Ð¾Ñ‚ ожидаемого.\n"
+"Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть недоÑтоверной.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ПРЕДУПРЕЖДЕÐИЕ: неверный размер Ñегмента WAL\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ "
+"Ñтепенью\n"
+"двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n"
+"подлежит Ñомнению.\n"
+"\n"
+msgstr[1] ""
+"Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ "
+"Ñтепенью\n"
+"двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n"
+"подлежит Ñомнению.\n"
+"\n"
+msgstr[2] ""
+"Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ "
+"Ñтепенью\n"
+"двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n"
+"подлежит Ñомнению.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Ðомер верÑии pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Ðомер верÑии каталога: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Идентификатор ÑиÑтемы баз данных: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "СоÑтоÑние клаÑтера БД: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "ПоÑледнее обновление pg_control: %s\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Положение поÑледней конт. точки: %X/%X\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Положение REDO поÑледней конт. точки: %X/%X\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Файл WAL c REDO поÑледней к. Ñ‚.: %s\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "Пред. Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: no-space-after-period
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Режим full_page_writes поÑледней к.Ñ‚: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "выкл."
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "вкл."
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID поÑледней конт. точки: %u:%u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId поÑлед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset поÑлед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "БД Ñ oldestXID поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid поÑледней конт. точки: %u\n"
+
+# skip-rule: double-space, capital-letter-first
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "БД Ñ oldestMulti поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: double-space, capital-letter-first
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid поÑледней к. Ñ‚.: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней контрольной точки: %s\n"
+
+# skip-rule: capital-letter-first
+# well-spelled: нежурналир
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Фиктивный LSN Ð´Ð»Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€. таблиц: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Мин. положение конца воÑÑтановлениÑ: %X/%X\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ мин. Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ðº. в.: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Положение начала копии: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Положение конца копии: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "ТребуетÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ конец-копии: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "нет"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "да"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Значение wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Значение wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Значение max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Значение max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Значение max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Значение max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Значение max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Значение track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "МакÑ. предел Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Размер блока БД: %u\n"
+
+# skip-rule: double-space
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоков в макÑ. Ñегменте отношений: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Размер блока WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байт в Ñегменте WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификаторов: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "МакÑ. чиÑло Ñтолбцов в индекÑе: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "МакÑимальный размер порции TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Размер порции большого объекта: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-битные целые"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргумента float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "по ÑÑылке"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "по значению"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм Ñтраниц: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Случ. чиÑло Ð´Ð»Ñ Ð¿Ñевдоаутентификации: %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Передача аргумента Float4: %s\n"
+
+# skip-rule: capital-letter-first
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "Положение предыдущей конт. точки: %X/%X\n"
+
+#~ msgid "calculated CRC checksum does not match value stored in file"
+#~ msgstr ""
+#~ "вычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (CRC) не ÑоответÑтвует значению, "
+#~ "Ñохранённому в файле"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "чиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "ИÑпользование:\n"
+#~ " %s [ПÐРÐМЕТР] [КÐТÐЛОГ_ДÐÐÐЫХ]\n"
+#~ "\n"
+#~ "Параметры:\n"
+#~ " --help показать Ñту Ñправку и выйти\n"
+#~ " --version показать верÑию и выйти\n"
+
+#~ msgid "enabled"
+#~ msgstr "включен"
+
+#~ msgid "disabled"
+#~ msgstr "отключен"
diff --git a/src/bin/pg_controldata/po/sv.po b/src/bin/pg_controldata/po/sv.po
new file mode 100644
index 0000000..9836890
--- /dev/null
+++ b/src/bin/pg_controldata/po/sv.po
@@ -0,0 +1,518 @@
+# Swedish message translation file for pg_controldata
+# This file is put in the public domain.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-11 09:21+0000\n"
+"PO-Revision-Date: 2023-08-17 16:56+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "byte-ordning stämmer inte"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"möjligt fel i byteordning\n"
+"Den byteordning som filen från pg_control lagrats med passar kanske\n"
+"inte detta program. I så fall kan nedanstående resultat vara felaktiga\n"
+"och PostgreSQL-installationen vara inkompatibel med databaskatalogen."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "kunde inte fsync:a fil \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s visar kontrollinformation om ett databaskluster för PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [FLAGGA] [DATAKATALOG]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datakatalog\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om ingen datakatalog (DATAKATALOG) har angivits så nyttjas omgivningsvariabeln\n"
+"PGDATA för detta syfte.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "startar"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "avstängt"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "avslutat med återställning"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "stänger ner"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "återställer efter krash"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "utför arkivåterställning"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "i full drift"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "okänd statuskod"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "okänd wal_level"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"VARNING: Beräknad CRC-kontrollsumma matchar inte det värde som har sparats i filen.\n"
+"Antingen är filen trasig, eller så har den en annan uppbyggnad än vad detta\n"
+"program förväntade sig. Resultatet nedan är inte helt tillförlitligt.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "VARNING: ogiltig WAL-segmentstorlek\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"WAL-segmentstorleken sparad i filen, %d byte, är inte en tvåpotens\n"
+"mellan 1 MB och 1 GB. Filen är trasig och resultatet nedan går\n"
+"ej att lita på.\n"
+"\n"
+msgstr[1] ""
+"WAL-segmentstorleken sparad i filen, %d byte, är inte en tvåpotens\n"
+"mellan 1 MB och 1 GB. Filen är trasig och resultatet nedan går\n"
+"ej att lita på.\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+# Sep. 6th, 2014:
+# Insert additional spaces in translated strings for the
+# purpose of alignment. Of lingustic reasons the separation
+# used for English is insufficient for Swedish. New indenting
+# is consistent for all reporting statements: six additional
+# space characters.
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Versionsnummer för pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversion: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Databasens systemidentifierare: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Databasklustrets tillstånd: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control ändrades senast: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Läge för senaste kontrollpunkt: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "REDO-läge för senaste kontrollpunkt: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "REDO-WAL-fil vid senaste kontrollpunkt: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Senaste kontrollpunktens full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "av"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "på"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID vid senaste kontrollpunkt: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB för oldestXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid vid senaste kontrollpunkt: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB för oldestMulti vid senaste kontrollpkt: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid vid senaste kontrollpunkt:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid vid senaste kontrollpunkt:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Tidpunkt för senaste kontrollpunkt: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Beräknat LSN-tal av ologgade relationer: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minsta slutposition vid återställning: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Tidslinje för min slutpos vid återställning:%u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Startpunkt för backup: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Slutpunkt för backup: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Tvingande markering av backupslut: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "nej"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "ja"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Värde på wal_level: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Värde på wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Värde på max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Värde på max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Värde på max_wal_senders setting %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Värde på max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Nuvarande max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Värde på track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximal jämkning av data (alignment): %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Databasens blockstorlek: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Block per segment i en stor relation: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Blockstorlek i transaktionsloggen: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Segmentstorlek i transaktionsloggen: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximal längd för identifierare: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximalt antal kolonner i ett index: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximal storlek för en TOAST-enhet: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Storlek för large-object-enheter: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Representation av dag och tid: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-bitars heltal"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Överföring av float8-argument: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "med referens"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "med värde"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Checksummaversion för datasidor: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Fejkat authentiseringsvärde: %s\n"
diff --git a/src/bin/pg_controldata/po/tr.po b/src/bin/pg_controldata/po/tr.po
new file mode 100644
index 0000000..528889f
--- /dev/null
+++ b/src/bin/pg_controldata/po/tr.po
@@ -0,0 +1,555 @@
+# translation of pg_controldata.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006.
+# Nicolai TUFAR <ntufar@gmail.com>, 2004, 2005, 2006.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-11-27 07:46+0000\n"
+"PO-Revision-Date: 2018-11-27 16:39+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../common/controldata_utils.c:62
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: \"%s\" dosyası okunmak için açılamadı: %s\n"
+
+#: ../../common/controldata_utils.c:78
+#, c-format
+msgid "%s: could not read file \"%s\": %s\n"
+msgstr "%s: \"%s\" dosyası okunamadı: %s\n"
+
+#: ../../common/controldata_utils.c:90
+#, c-format
+msgid "%s: could not read file \"%s\": read %d of %d\n"
+msgstr ""
+"%1$s: \"%2$s\" dosyası okuma hatası: %4$d nin %3$d si okundu\n"
+
+#: ../../common/controldata_utils.c:112
+msgid "byte ordering mismatch"
+msgstr "byte sıralama uyuşmazlığı"
+
+#: ../../common/controldata_utils.c:114
+#, c-format
+msgid ""
+"WARNING: possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not "
+"match the one\n"
+"used by this program. In that case the results below would be "
+"incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this "
+"data directory.\n"
+msgstr ""
+"UYARI: olası bayt sıralama uyumsuzluğu\n"
+"pg_control dosyasını saklamak için kullanılan bayt sıralaması, "
+"bu program\n"
+"tarafından kullanılan sıralama ile uyuşmayabilir. Bu durumda "
+"aşağıdaki\n"
+"sonuçlar yanlış olacak ve PostgreSQL kurulumu bu veri dizini "
+"ile uyumsuz\n"
+"olacaktır.\n"
+
+#: pg_controldata.c:34
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL veritabanı kümesinin kontrol bilgisini "
+"gösterir.\n"
+"\n"
+
+#: pg_controldata.c:35
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [SEÇENEK] [DATADIR]\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR veri dizini\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid ""
+" -V, --version output version information, then "
+"exit\n"
+msgstr ""
+" -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment "
+"variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer hiçbir veri dizini (DATADIR) belirtilmezse, PGDATA "
+"çevresel değişkeni\n"
+"kullanılır.\n"
+"\n"
+
+#: pg_controldata.c:43
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"Hataları <pgsql-bugs@postgresql.org> adresine "
+"bildirebilirsiniz.\n"
+
+#: pg_controldata.c:53
+msgid "starting up"
+msgstr "başlıyor"
+
+#: pg_controldata.c:55
+msgid "shut down"
+msgstr "kapat"
+
+#: pg_controldata.c:57
+msgid "shut down in recovery"
+msgstr "kurtarma modunda kapatma"
+
+#: pg_controldata.c:59
+msgid "shutting down"
+msgstr "kapanıyor"
+
+#: pg_controldata.c:61
+msgid "in crash recovery"
+msgstr "çöküş (crash) kurtarma modunda"
+
+#: pg_controldata.c:63
+msgid "in archive recovery"
+msgstr "arÅŸiv kurtarma modunda"
+
+#: pg_controldata.c:65
+msgid "in production"
+msgstr "üretim modunda"
+
+#: pg_controldata.c:67
+msgid "unrecognized status code"
+msgstr "tanımlayamayan durum kodu"
+
+#: pg_controldata.c:82
+msgid "unrecognized wal_level"
+msgstr "tanımsız wal_level değeri"
+
+#: pg_controldata.c:136 pg_controldata.c:154 pg_controldata.c:162
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr ""
+"Ayrıntılı bilgi için \"%s --help\" komutunu "
+"kullanabilirsiniz.\n"
+
+#: pg_controldata.c:152
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: Çok fazla komut satırı girdisi var (ilki \"%s\")\n"
+
+#: pg_controldata.c:161
+#, c-format
+msgid "%s: no data directory specified\n"
+msgstr "%s: hiçbir veri dizini belirtilmedi\n"
+
+#: pg_controldata.c:169
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored "
+"in file.\n"
+"Either the file is corrupt, or it has a different layout than "
+"this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"UYARI: Hesaplanan CRC kontrol toplamı dosyadakinden farklı.\n"
+"Dosya zarar görmüş ya da bu programın beklediğinden farklı \n"
+"bir yapıya sahip olabilir. Aşağıdaki sonuçlar güvenilir "
+"deÄŸildir.\n"
+"\n"
+
+#: pg_controldata.c:178
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "UYARI: geçersiz WAL kesim boyutu (segment size)\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a "
+"power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results "
+"below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a "
+"power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results "
+"below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"Dosyada tutulan WAL segment boyutu, %d bayt, 1MB ve 1GB \n"
+"arasında ikinin bir üssü değil. Dosya bozuk ve aşağıdaki "
+"sonuçlar\n"
+"güvenilmez.\n"
+msgstr[1] ""
+"Dosyada tutulan WAL segment boyutu, %d bayt, 1MB ve 1GB \n"
+"arasında ikinin bir üssü değil. Dosya bozuk ve aşağıdaki "
+"sonuçlar\n"
+"güvenilmez.\n"
+
+#: pg_controldata.c:221
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control sürüm numarası: %u\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalog sürüm numarası: %u\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Database system identifier: %s\n"
+msgstr "Veritabanı sistem belirteci: %s\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Veritabanı kümesinin durumu: %s\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control son düzenlenme tarihi: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "En son checkpoint yeri: %X/%X\n"
+
+#: pg_controldata.c:247
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "En son checkpoint'in REDO yeri: %X/%X\n"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "En son checkpoint'in REDO WAL dosyası: %s\n"
+
+#: pg_controldata.c:252
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "En son checkpoint'in TimeLineID'si: %u\n"
+
+#: pg_controldata.c:254
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "En son checkpoint'in PrevTimeLineID'si: %u\n"
+
+#: pg_controldata.c:256
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "En son checkpoint'in full_page_writes'ı: %s\n"
+
+#: pg_controldata.c:257 pg_controldata.c:302 pg_controldata.c:312
+msgid "off"
+msgstr "kapalı"
+
+#: pg_controldata.c:257 pg_controldata.c:302 pg_controldata.c:312
+msgid "on"
+msgstr "açık"
+
+#: pg_controldata.c:258
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "En son checkpoint'in NextXID'si: %u:%u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "En son checkpoint'in NextOID'si: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "En son checkpoint'in NextMultiXactId'si: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "En son checkpoint'in NextMultiOffset'i: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "En son checkpoint'in oldestXID'si: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "En son checkpoint'in oldestXID'sini DB'si: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "En son checkpoint'in odestActiveXID'si: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "En son checkpoint'in oldestMultiXid'si: %u\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "En son checkpoint'in oldestMulti'sinin DB'si: %u\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "En son checkpoint'in oldestCommitTsXid'si: %u\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "En son checkpoint'in newestCommitTsXid'si: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "En son checkpoint'in zamanı: %s\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Loglanmayan nesneler için sahte LSN sayacı: %X/%X\n"
+
+#: pg_controldata.c:286
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Minimum kurtarma sonlandırma yeri: %X/%X\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr ""
+"Minimum kurtarma sonlandırma yerinin zaman çizelgesi: %u\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Yedek baÅŸlama yeri: %X/%X\n"
+
+#: pg_controldata.c:294
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Yedek bitiÅŸ yeri: %X/%X\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Yedek sonu kaydı gerekiyor: %s\n"
+
+#: pg_controldata.c:298
+msgid "no"
+msgstr "hayır"
+
+#: pg_controldata.c:298
+msgid "yes"
+msgstr "evet"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level ayarı: %s\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints ayarı: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections ayarı: %d\n"
+
+#: pg_controldata.c:305
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes ayarı: %d\n"
+
+#: pg_controldata.c:307
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts ayarı: %d\n"
+
+#: pg_controldata.c:309
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact ayarı: %d\n"
+
+#: pg_controldata.c:311
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp ayarı: %s\n"
+
+#: pg_controldata.c:313
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Azami veri hizalama: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Veritabanı blok boyutu: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Büyük ilişkilerin parçası başına blok sayısı: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL blok boyutu: %u\n"
+
+#: pg_controldata.c:322
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr ""
+"Her bir WAL parçası başına byte sayısı: %u\n"
+
+#: pg_controldata.c:324
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Belirteçlerin en fazla uzunluğu: %u\n"
+
+#: pg_controldata.c:326
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "İndekste en fazla kolon sayısı: %u\n"
+
+#: pg_controldata.c:328
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST parçasının en yüksek boyutu: %u\n"
+
+#: pg_controldata.c:330
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Bir büyük-nesne parçasının boyutu: %u\n"
+
+#: pg_controldata.c:333
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tarih/zaman tipi saklanması: %s\n"
+
+#: pg_controldata.c:334
+msgid "64-bit integers"
+msgstr "64-bit tamsayı"
+
+#: pg_controldata.c:335
+#, c-format
+msgid "Float4 argument passing: %s\n"
+msgstr "Float4 argument passing: %s\n"
+
+#: pg_controldata.c:336 pg_controldata.c:338
+msgid "by reference"
+msgstr "referans ile"
+
+#: pg_controldata.c:336 pg_controldata.c:338
+msgid "by value"
+msgstr "deÄŸer ile"
+
+#: pg_controldata.c:337
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 argument passing: %s\n"
+
+#: pg_controldata.c:339
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr ""
+"Veri sayfası sağlama (checksum) sürümü: %u\n"
+
+#: pg_controldata.c:341
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Sahte (mock) kimlik doğrulaması nonce'u: %s\n"
+
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "Kullanımı:\n"
+#~ " %s [SEÇENEK] [VERİ_DİZİNİ]\n"
+#~ "\n"
+#~ "SEÇENEKLER:\n"
+#~ " --help bu yardımı gösterir ve sonra çıkar\n"
+#~ " --version sürüm bilgisini gösterir ve çıkar\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "kayan noktalı sayılar"
+
+#~ msgid "Maximum length of locale name: %u\n"
+#~ msgstr "Yerel adının en fazla büyüklüğü: %u\n"
+
+#~ msgid "LC_COLLATE: %s\n"
+#~ msgstr "LC_COLLATE: %s\n"
+
+#~ msgid "LC_CTYPE: %s\n"
+#~ msgstr "LC_CTYPE: %s\n"
+
+#~ msgid "Prior checkpoint location: %X/%X\n"
+#~ msgstr "Önceki checkpoint yeri: %X/%X\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#~ msgid ""
+#~ " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#~ msgid " [-D] DATADIR data directory\n"
+#~ msgstr " [-D] DATADIR veri dizini\n"
diff --git a/src/bin/pg_controldata/po/uk.po b/src/bin/pg_controldata/po/uk.po
new file mode 100644
index 0000000..758c4c1
--- /dev/null
+++ b/src/bin/pg_controldata/po/uk.po
@@ -0,0 +1,480 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:51+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_controldata.pot\n"
+"X-Crowdin-File-ID: 924\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m"
+
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu"
+
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "неправильний порÑдок байтів"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid "possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr "можлива помилка у поÑлідовноÑÑ‚Ñ– байтів.\n"
+"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних."
+
+#: ../../common/controldata_utils.c:194
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:213
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m"
+
+#: ../../common/controldata_utils.c:232
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "не вдалоÑÑ fsync файл \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid "%s displays control information of a PostgreSQL database cluster.\n\n"
+msgstr "%s відображає контрольну інформацію щодо клаÑтеру PostgreSQL.\n\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог з даними\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid "\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n\n"
+msgstr "\n"
+"Якщо каталог даних не вказано (DATADIR), викориÑтовуєтьÑÑ Ð·Ð¼Ñ–Ð½Ð½Ð° Ñередовища PGDATA.\n\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "запуÑк"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ у відновленні"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ збої"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² архіві"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "у виробництві"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "невизнаний код ÑтатуÑу"
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "невизнаний wal_рівень"
+
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_controldata.c:170
+#, c-format
+msgid "WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n\n"
+msgstr "ПОПЕРЕДЖЕÐÐЯ: Контрольна Ñума CRC не відповідає збереженому значенню у файлі. Ðбо файл пошкоджено, або він міÑтить іншу Ñтруктуру, ніж очікує Ñ†Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð°. Результати нижче Ñ” недоÑтовірними.\n\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "ПОПЕРЕДЖЕÐÐЯ: неправильний розмір WAL Ñегменту \n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid "The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n\n"
+msgid_plural "The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n\n"
+msgstr[0] "Розмір WAL Ñегменту збережений у файлі, %d байт, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n"
+msgstr[1] "Розмір WAL Ñегменту збережений у файлі, %d байтів, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n"
+msgstr[2] "Розмір WAL Ñегменту збережений у файлі, %d байтів, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n"
+msgstr[3] "Розмір WAL Ñегменту збережений у файлі, %d байта, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control номер верÑÑ–Ñ—: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Ðомер верÑÑ–Ñ— каталогу: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "СиÑтемний ідентифікатор бази даних: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Стан клаÑтеру бази даних: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control був модифікований воÑтаннє: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "ОÑтаннє міÑце Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñтанньої контрольної точки: %X%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "ОÑтанній файл контрольної точки REDO WAL: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "ОÑтанній TimeLineID контрольної точки: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "ОÑтанній PrevTimeLineID контрольної точки: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "ОÑтанній full_page_writes контрольної точки: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "вимк"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "увімк"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "ОÑтанній NextXID контрольної точки: %u%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "ОÑтанній NextOID контрольної точки: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "ОÑтанній NextMultiXactId контрольної точки: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "ОÑтанній NextMultiOffset контрольної точки: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "ОÑтанній oldestXID контрольної точки: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтаннього oldestXID контрольної точки: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "ОÑтанній oldestActiveXID контрольної точки: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "ОÑтанній oldestMultiXid контрольної точки: %u \n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтанньої oldestMulti контрольної точки: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "ОÑтанній oldestCommitTsXid контрольної точки:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "ОÑтанній newestCommitTsXid контрольної точки: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Ð§Ð°Ñ Ð¾Ñтанньої контрольної точки: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Фіктивний LSN Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ без журналюваннÑ: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Мінімальне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Мінімальна Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ Ñ–Ñторії чаÑу Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "ВимагаєтьÑÑ Ð·Ð°Ð¿Ð¸Ñ ÐºÑ–Ð½Ñ†Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "ні"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "так"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ wal_рівнÑ: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ wal_log_hints: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_connections: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_worker_processes: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_wal_senders: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "МакÑимальне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Розмір блоку бази даних: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоків на Ñегмент великого відношеннÑ: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Pозмір блоку WAL: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байтів на Ñегмент WAL: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "МакÑимальна довжина ідентифікаторів: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ Ñтовпців в індекÑÑ–: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "МакÑимальний розмір Ñегменту TOAST: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Розмір Ñегменту великих обїєктів: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Дата/Ñ‡Ð°Ñ Ñ‚Ð¸Ð¿Ñƒ Ñховища: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64-бітні цілі"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргументу Float8: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "за поÑиланнÑм"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "за значеннÑм"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "ВерÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум Ñторінок даних: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Імітувати Ð½Ð¾Ð½Ñ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—: %s\n"
+
diff --git a/src/bin/pg_controldata/po/vi.po b/src/bin/pg_controldata/po/vi.po
new file mode 100644
index 0000000..019b7b0
--- /dev/null
+++ b/src/bin/pg_controldata/po/vi.po
@@ -0,0 +1,476 @@
+# LANGUAGE message translation file for pg_controldata
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:17+0000\n"
+"PO-Revision-Date: 2018-05-04 22:20+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: vi_VN\n"
+
+#: ../../common/controldata_utils.c:61
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: không thể mở tệp \"%s\" để Ä‘á»c: %s\n"
+
+#: ../../common/controldata_utils.c:74
+#, c-format
+msgid "%s: could not read file \"%s\": %s\n"
+msgstr "%s: không Ä‘á»c được tệp \"%s\": %s\n"
+
+#: ../../common/controldata_utils.c:95
+msgid "byte ordering mismatch"
+msgstr "thứ tự byte không khớp"
+
+#: ../../common/controldata_utils.c:97
+#, c-format
+msgid ""
+"WARNING: possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data "
+"directory.\n"
+msgstr ""
+"CẢNH BÃO: có thể sắp xếp thứ tá»± byte không khá»›p\n"
+"Thứ tự byte được sử dụng để lưu trữ tệp pg_control có thể không khớp với\n"
+"cái được sá»­ dụng bởi chÆ°Æ¡ng trình này. Trong trÆ°á»ng hợp đó, kết quả bên\n"
+"dưới sẽ không chính xác và cài đặt PostgreSQL sẽ không tương thích với \n"
+"thư mục dữ liệu này.\n"
+
+#: pg_controldata.c:34
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s hiển thị thông tin Ä‘iá»u khiển của hệ thống cÆ¡ sở dữ liệu PostgreSQL.\n"
+"\n"
+
+#: pg_controldata.c:35
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [TÙY CHỌN] [DATADIR]\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options:\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid " [-D,--pgdata=]DATADIR data directory\n"
+msgstr " [-D,--pgdata=]DATADIR thư mục dữ liệu\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V, --version hiện thị thông tin phiên bản, sau đó kết thúc\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?, --help hiện thị nội dung trợ giúp này, sau đó kết thúc\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Nếu thÆ° mục cÆ¡ sở dữ liệu(DATADIR) không được chỉ định, biến môi trÆ°á»ng \n"
+"PGDATA sẽ được sử dụng.\n"
+"\n"
+
+#: pg_controldata.c:43
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Báo cáo lỗi tới <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_controldata.c:53
+msgid "starting up"
+msgstr "đang khởi động"
+
+#: pg_controldata.c:55
+msgid "shut down"
+msgstr "đang ngưng hoạt động"
+
+#: pg_controldata.c:57
+msgid "shut down in recovery"
+msgstr "đang ngưng hoạt động ở chế độ khôi phục"
+
+#: pg_controldata.c:59
+msgid "shutting down"
+msgstr "đang tắt"
+
+#: pg_controldata.c:61
+msgid "in crash recovery"
+msgstr "đang trong chế độ khôi phục sự cố"
+
+#: pg_controldata.c:63
+msgid "in archive recovery"
+msgstr "đang trong chế độ phục hồi từ archive log"
+
+#: pg_controldata.c:65
+msgid "in production"
+msgstr "đang hoạt động"
+
+#: pg_controldata.c:67
+msgid "unrecognized status code"
+msgstr "mã trạng thái không được công nhận"
+
+#: pg_controldata.c:82
+msgid "unrecognized wal_level"
+msgstr "wal_level không được công nhận"
+
+#: pg_controldata.c:136 pg_controldata.c:154 pg_controldata.c:162
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_controldata.c:152
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: quá nhiá»u đối số dòng lệnh (đầu tiên là \"%s\")\n"
+
+#: pg_controldata.c:161
+#, c-format
+msgid "%s: no data directory specified\n"
+msgstr "%s: không có thư mục dữ liệu nào được chỉ định\n"
+
+#: pg_controldata.c:169
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"WARNING: Giá trị kiểm tra CRC checksum không khớp với giá trị lưu trữ \n"
+"trong tệp . Có thể tệp bị há»ng hoặc có bố cục khác vá»›i sá»± mong đợi của\n"
+"chương trình này. Các kết quả dưới đây là không đáng tin cậy.\n"
+"\n"
+
+#: pg_controldata.c:177
+#, c-format
+msgid ""
+"WARNING: invalid WAL segment size\n"
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr ""
+"CẢNH BÃO: kích thÆ°á»›c phân Ä‘oạn WAL không hợp lệ\n"
+"Kích thước phân đoạn WAL được lưu trữ trong tệp, %d byte, không phải \n"
+"là lÅ©y thừa của hai từ 1 MB đến 1 GB. Có thể tệp bị há»ng và kết quả bên\n"
+"dưới là không đáng tin cậy.\n"
+"\n"
+
+#: pg_controldata.c:215
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "phiên bản pg_control: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Phiên bản catalog: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %s\n"
+msgstr "Số định dạng hệ thống database: %s\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "Trạng thái hệ thống database: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control sửa đổi lần cuối: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "Vị trí checkpoint mới nhất: %X/%X\n"
+
+#: pg_controldata.c:241
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "Vị trí REDO của checkpoint gần nhất: %X/%X\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "Tệp REDO WAL của checkpoint gần nhất: %s\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "PrevTimeLineID của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Full_page_writes của checkpoint gần nhất: %s\n"
+
+#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:306
+msgid "off"
+msgstr "off"
+
+#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:306
+msgid "on"
+msgstr "on"
+
+#: pg_controldata.c:252
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID của checkpoint gần nhất: %u:%u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "OldestXID của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "OldestXID DB của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "OldestActiveXID của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "OldestMultiXid của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "OldestMulti DB của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "OldestCommitTsXid DB của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "NewestCommitTsXid của checkpoint gần nhất: %u\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "Thá»i gian của lần checkpoint gần nhấ: %s\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "Bộ đếm LSN giả cho các unlogged relations: %X/%X\n"
+
+#: pg_controldata.c:280
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "Tối thiểu hóa vị trí kết thúc cho phụ hồi: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "Timeline của vị trí kết thúc phục hồi tối thiểu: %u\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "Vị trí bắt đầu Backup: %X/%X\n"
+
+#: pg_controldata.c:288
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "Vị trí kết thúc Backup: %X/%X\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "Yêu cầu bản ghi kết thúc-backup : %s\n"
+
+#: pg_controldata.c:292
+msgid "no"
+msgstr "no"
+
+#: pg_controldata.c:292
+msgid "yes"
+msgstr "yes"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "giá trị thiết lập wal_level: %s\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "giá trị thiết lập wal_log_hints: %s\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "giá trị thiết lập max_connections: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "giá trị thiết lập max_worker_processes: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "giá trị thiết lập max_prepared_xacts: %d\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "giá trị thiết lập max_locks_per_xact: %d\n"
+
+#: pg_controldata.c:305
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "giá trị thiết lập track_commit_timestamp: %s\n"
+
+#: pg_controldata.c:307
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Căn chỉnh dữ liệu tối đa: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Kích thước block cơ sở dữ liệu: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Số block cho mỗi phân đoạn của relation lớn: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Kích thước block của WAL: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Số byte cho mỗi phân đoạn WAL: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Äá»™ dài tối Ä‘a cho má»—i số nhận dạng: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Số lượng cột tối đa cho một index: %u\n"
+
+#: pg_controldata.c:322
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Kích thước tối đa của đoạn TOAST: %u\n"
+
+#: pg_controldata.c:324
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Kích thước của một đoạn đối tượng lớn: %u\n"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Lưu trữ kiểu Date/time: %s\n"
+
+#: pg_controldata.c:328
+msgid "64-bit integers"
+msgstr "64-bit integers"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Float4 argument passing: %s\n"
+msgstr "Thiết lập đối số float4: %s\n"
+
+#: pg_controldata.c:330 pg_controldata.c:332
+msgid "by reference"
+msgstr "bằng cách tham chiếu"
+
+#: pg_controldata.c:330 pg_controldata.c:332
+msgid "by value"
+msgstr "theo giá trị"
+
+#: pg_controldata.c:331
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Thiết lập đối số float8: %s\n"
+
+#: pg_controldata.c:333
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Phiên bản checksum page dữ liệu: %u\n"
+
+#: pg_controldata.c:335
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "Xác thá»±c giả tạm thá»i: %s\n"
diff --git a/src/bin/pg_controldata/po/zh_CN.po b/src/bin/pg_controldata/po/zh_CN.po
new file mode 100644
index 0000000..d6d2140
--- /dev/null
+++ b/src/bin/pg_controldata/po/zh_CN.po
@@ -0,0 +1,505 @@
+# simplified Chinese translation file for pg_controldata and friends
+# Bao Wei <weibao@forevertek.com>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:49+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读å–, 无法打开文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:89
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读å–文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:101
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "无法读å–文件\"%1$s\":读å–了%3$zu中的%2$d"
+
+#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:135
+msgid "byte ordering mismatch"
+msgstr "字节排åºä¸åŒ¹é…"
+
+#: ../../common/controldata_utils.c:137
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the one\n"
+"used by this program. In that case the results below would be incorrect, and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"å¯èƒ½å­—节顺åºä¸åŒ¹é…\n"
+"用于存储文件pg_control的字节顺åºå¯èƒ½ä¸Žç¨‹åºä½¿ç”¨çš„ä¸åŒ¹é…\n"
+"在那ç§æƒ…况下结果将会是ä¸æ­£ç¡®çš„,并且所安装的PostgreSQL\n"
+"将会与这个数æ®ç›®å½•ä¸å…¼å®¹"
+
+#: ../../common/controldata_utils.c:203
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:245
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "无法 fsync 文件 \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s 显示 PostgreSQL æ•°æ®åº“簇控制信æ¯.\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_controldata.c:37
+#, c-format
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [选项][æ•°æ®ç›®å½•]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR æ•°æ®ç›®å½•\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有指定数æ®ç›®å½•(DATADIR), 将使用\n"
+"环境å˜é‡PGDATA.\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "正在å¯åŠ¨"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "关闭"
+
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "在æ¢å¤è¿‡ç¨‹ä¸­å…³é—­æ•°æ®åº“"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "正在关闭"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "在æ¢å¤ä¸­"
+
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "正在归档æ¢å¤"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "在è¿è¡Œä¸­"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "ä¸è¢«è®¤å¯çš„状æ€ç "
+
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "å‚æ•°wal_level的值无法识别"
+
+#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_controldata.c:153
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "没有指定数æ®ç›®å½•"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"警告: 计算出æ¥çš„CRC校验值与已ä¿å­˜åœ¨æ–‡ä»¶ä¸­çš„值ä¸åŒ¹é….\n"
+"ä¸æ˜¯æ–‡ä»¶å了,就是设计与程åºçš„期望值ä¸åŒ.\n"
+"下é¢çš„结果是ä¸å¯é çš„.\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "警告: 无效的WAL段大å°\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"WAL段的大å°ä¿å­˜åœ¨æ–‡ä»¶ä¸­ï¼Œ%d字节ä¸æ˜¯2的幂次方(在1MB至1BG之间)\n"
+"文件已æŸå,下é¢çš„结果ä¸å¯ä¿¡.\n"
+msgstr[1] ""
+"WAL段的大å°ä¿å­˜åœ¨æ–‡ä»¶ä¸­ï¼Œ%d字节ä¸æ˜¯2的幂次方(在1MB至1BG之间)\n"
+"文件已æŸå,下é¢çš„结果ä¸å¯ä¿¡.\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 版本: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Catalog 版本: %u\n"
+
+#: pg_controldata.c:232
+msgid "Database system identifier: %llu\n"
+msgstr "æ•°æ®åº“系统标识符: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "æ•°æ®åº“簇状æ€: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control 最åŽä¿®æ”¹: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "最新检查点ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "最新检查点的 REDO ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "最新检查点的é‡åšæ—¥å¿—文件: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最新检查点的 TimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "最新检查点的PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最新检查点的full_page_writes: %s\n"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "关闭"
+
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "å¼€å¯"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最新检查点的NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最新检查点的 NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最新检查点的NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最新检查点的NextMultiOffsetD: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最新检查点的oldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最新检查点的oldestXID所在的数æ®åº“:%u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最新检查点的oldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最新检查点的oldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最新检查点的oldestMulti所在的数æ®åº“:%u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最新检查点的oldestCommitTsXid:%u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最新检查点的newestCommitTsXid:%u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "最新检查点的时间: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "ä¸å¸¦æ—¥å¿—的关系: %X/%X使用虚å‡çš„LSN计数器\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "最å°æ¢å¤ç»“æŸä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "最å°æ¢å¤ç»“æŸä½ç½®æ—¶é—´è¡¨: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "开始进行备份的点ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "备份的最终ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "需è¦ç»ˆæ­¢å¤‡ä»½çš„记录: %s\n"
+
+#: pg_controldata.c:286
+msgid "no"
+msgstr "å¦"
+
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "是"
+
+#: pg_controldata.c:287
+#, c-format
+msgid "wal_level setting: %s\n"
+msgstr "wal_level设置: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints设置: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+msgid "max_connections setting: %d\n"
+msgstr "max_connections设置: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes设置: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders设置: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts设置: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact设置: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp设置: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大数æ®æ ¡å‡†: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "æ•°æ®åº“å—大å°: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大关系的æ¯æ®µå—æ•°: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WALçš„å—大å°: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "æ¯ä¸€ä¸ª WAL 段字节数: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "标识符的最大长度: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "在索引中å¯å…许使用最大的列数: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST区å—的最大长度: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "大对象区å—的大å°: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日期/时间 类型存储: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64ä½æ•´æ•°"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "正在传递Flloat8类型的å‚æ•°: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "由引用"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "由值"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "æ•°æ®é¡µæ ¡éªŒå’Œç‰ˆæœ¬: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "当å‰èº«ä»½éªŒè¯: %s\n"
+
diff --git a/src/bin/pg_controldata/po/zh_TW.po b/src/bin/pg_controldata/po/zh_TW.po
new file mode 100644
index 0000000..450aec7
--- /dev/null
+++ b/src/bin/pg_controldata/po/zh_TW.po
@@ -0,0 +1,587 @@
+# Traditional Chinese message translation file for pg_controldata
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_controldata (PostgreSQL) package.
+# 2004-11-01 Zhenbang Wei <forth@zbwei.net>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_controldata (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-08 21:52+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# commands/copy.c:1031
+#: ../../common/controldata_utils.c:73
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "無法開啟檔案 \"%s\" 以供讀å–: %m"
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: ../../common/controldata_utils.c:86
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "無法讀å–檔案 \"%s\": %m"
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: ../../common/controldata_utils.c:95
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "無法讀å–檔案 \"%s\": å·²è®€å– %d / %zu"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:236
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "無法關閉檔案 \"%s\": %m"
+
+#: ../../common/controldata_utils.c:124
+msgid "byte ordering mismatch"
+msgstr "ä½å…ƒçµ„é †åºä¸ä¸€è‡´"
+
+#: ../../common/controldata_utils.c:126
+#, c-format
+msgid ""
+"possible byte ordering mismatch\n"
+"The byte ordering used to store the pg_control file might not match the "
+"one\n"
+"used by this program. In that case the results below would be incorrect, "
+"and\n"
+"the PostgreSQL installation would be incompatible with this data directory."
+msgstr ""
+"ä½å…ƒçµ„é †åºå¯èƒ½ä¸ä¸€è‡´\n"
+"用於儲存 pg_control 檔案的ä½å…ƒçµ„é †åºå¯èƒ½èˆ‡æ­¤ç¨‹å¼ä½¿ç”¨çš„ä½å…ƒçµ„é †åºä¸åŒã€‚\n"
+"在這種情æ³ä¸‹ï¼Œä¸‹é¢çš„çµæžœå°‡ä¸æ­£ç¢ºï¼Œä¸” PostgreSQL 安è£å°‡èˆ‡é€™å€‹è³‡æ–™ç›®éŒ„\n"
+"ä¸ç›¸å®¹ã€‚"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: ../../common/controldata_utils.c:186
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案 \"%s\": %m"
+
+# access/transam/xlog.c:5319 access/transam/xlog.c:5439
+#: ../../common/controldata_utils.c:205
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+# access/transam/slru.c:673 access/transam/xlog.c:1562
+# access/transam/xlog.c:1686 access/transam/xlog.c:3008
+#: ../../common/controldata_utils.c:224
+#, c-format
+msgid "could not fsync file \"%s\": %m"
+msgstr "無法 fsync 檔案 \"%s\": %m"
+
+#: pg_controldata.c:35
+#, c-format
+msgid ""
+"%s displays control information of a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s 顯示 PostgreSQL 資料庫å¢é›†çš„控制資訊\n"
+"\n"
+
+#: pg_controldata.c:36
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_controldata.c:37
+#, c-format
+#| msgid " %s [OPTION]... [DATADIR]\n"
+msgid " %s [OPTION] [DATADIR]\n"
+msgstr " %s [OPTION] [DATADIR]\n"
+
+#: pg_controldata.c:38
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"é¸é …:\n"
+
+# postmaster/postmaster.c:1024 tcop/postgres.c:2122
+#: pg_controldata.c:39
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 資料目錄\n"
+
+#: pg_controldata.c:40
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_controldata.c:41
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_controldata.c:42
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"若未指定資料目錄(DATADIR)就用環境變數 PGDATA。\n"
+"\n"
+
+#: pg_controldata.c:44
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "回報錯誤至 <%s>。\n"
+
+#: pg_controldata.c:45
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 首é : <%s>\n"
+
+#: pg_controldata.c:55
+msgid "starting up"
+msgstr "啟動中"
+
+#: pg_controldata.c:57
+msgid "shut down"
+msgstr "關閉"
+
+# access/transam/xlog.c:3596
+#: pg_controldata.c:59
+msgid "shut down in recovery"
+msgstr "復原關閉中"
+
+#: pg_controldata.c:61
+msgid "shutting down"
+msgstr "關閉中"
+
+#: pg_controldata.c:63
+msgid "in crash recovery"
+msgstr "æ毀復原中"
+
+# access/transam/xlog.c:3596
+#: pg_controldata.c:65
+msgid "in archive recovery"
+msgstr "å°å­˜å¾©åŽŸä¸­"
+
+#: pg_controldata.c:67
+msgid "in production"
+msgstr "é‹ä½œä¸­"
+
+#: pg_controldata.c:69
+msgid "unrecognized status code"
+msgstr "無法識別的狀態碼"
+
+# access/transam/xlog.c:3720
+#: pg_controldata.c:84
+msgid "unrecognized wal_level"
+msgstr "無法識別的 wal_level"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_controldata.c:154
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_controldata.c:162
+#, c-format
+msgid "no data directory specified"
+msgstr "未指定資料目錄"
+
+#: pg_controldata.c:170
+#, c-format
+msgid ""
+"WARNING: Calculated CRC checksum does not match value stored in file.\n"
+"Either the file is corrupt, or it has a different layout than this "
+"program\n"
+"is expecting. The results below are untrustworthy.\n"
+"\n"
+msgstr ""
+"警告: 計算ç²å¾—çš„ CRC 檢查碼和存在檔案中的值ä¸ä¸€è‡´ã€‚\n"
+"å¯èƒ½æ˜¯æª”案æ壞,或是檔案çµæ§‹èˆ‡ç¨‹å¼æ‰€é æœŸçš„ä¸åŒã€‚\n"
+"以下的çµæžœä¸å¯ä¿¡ã€‚\n"
+"\n"
+
+#: pg_controldata.c:179
+#, c-format
+msgid "WARNING: invalid WAL segment size\n"
+msgstr "警告: 無效的 WAL 片段大å°\n"
+
+#: pg_controldata.c:180
+#, c-format
+msgid ""
+"The WAL segment size stored in the file, %d byte, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgid_plural ""
+"The WAL segment size stored in the file, %d bytes, is not a power of two\n"
+"between 1 MB and 1 GB. The file is corrupt and the results below are\n"
+"untrustworthy.\n"
+"\n"
+msgstr[0] ""
+"檔案中儲存的 WAL 片段大å°ç‚º %d ä½å…ƒçµ„,ä¸æ˜¯ä»‹æ–¼ 1MB å’Œ 1GB 之間的\n"
+" 2 的冪次方。該檔案已æ壞,以下的çµæžœä¸å¯ä¿¡ã€‚\n"
+"\n"
+
+#: pg_controldata.c:222
+msgid "???"
+msgstr "???"
+
+#: pg_controldata.c:228
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 版本號碼: %u\n"
+
+#: pg_controldata.c:230
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Catalog 版本號碼: %u\n"
+
+#: pg_controldata.c:232
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "資料庫系統識別碼: %llu\n"
+
+#: pg_controldata.c:234
+#, c-format
+msgid "Database cluster state: %s\n"
+msgstr "資料庫å¢é›†ç‹€æ…‹: %s\n"
+
+#: pg_controldata.c:236
+#, c-format
+msgid "pg_control last modified: %s\n"
+msgstr "pg_control 最後修改時間: %s\n"
+
+#: pg_controldata.c:238
+#, c-format
+msgid "Latest checkpoint location: %X/%X\n"
+msgstr "最新檢查點ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:240
+#, c-format
+msgid "Latest checkpoint's REDO location: %X/%X\n"
+msgstr "最新檢查點 REDO ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:242
+#, c-format
+msgid "Latest checkpoint's REDO WAL file: %s\n"
+msgstr "最新檢查點 REDO WAL 檔: %s\n"
+
+#: pg_controldata.c:244
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最新檢查點 TimeLineID: %u\n"
+
+#: pg_controldata.c:246
+#, c-format
+msgid "Latest checkpoint's PrevTimeLineID: %u\n"
+msgstr "最新檢查點 PrevTimeLineID: %u\n"
+
+#: pg_controldata.c:248
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最新檢查點 full_page_writes: %s\n"
+
+# help.c:48
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "off"
+msgstr "off"
+
+# help.c:48
+#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302
+msgid "on"
+msgstr "on"
+
+#: pg_controldata.c:250
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最新檢查點 NextXID: %u:%u\n"
+
+#: pg_controldata.c:253
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最新檢查點 NextOID: %u\n"
+
+#: pg_controldata.c:255
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最新檢查點 NextMultiXactId: %u\n"
+
+#: pg_controldata.c:257
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最新檢查點 NextMultiOffset: %u\n"
+
+#: pg_controldata.c:259
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最新檢查點 oldestXID: %u\n"
+
+#: pg_controldata.c:261
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最新檢查點 oldestXID 的資料庫: %u\n"
+
+#: pg_controldata.c:263
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最新檢查點 oldestActiveXID: %u\n"
+
+#: pg_controldata.c:265
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最新檢查點 oldestMultiXid: %u\n"
+
+#: pg_controldata.c:267
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最新檢查點 oldestMulti 的資料庫: %u\n"
+
+#: pg_controldata.c:269
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最新檢查點 oldestCommitTsXid: %u\n"
+
+#: pg_controldata.c:271
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最新檢查點 newestCommitTsXid: %u\n"
+
+#: pg_controldata.c:273
+#, c-format
+msgid "Time of latest checkpoint: %s\n"
+msgstr "最新檢查點的時間: %s\n"
+
+#: pg_controldata.c:275
+#, c-format
+msgid "Fake LSN counter for unlogged rels: %X/%X\n"
+msgstr "無日誌關è¯çš„虛擬 LSN 計數: %X/%X\n"
+
+#: pg_controldata.c:277
+#, c-format
+msgid "Minimum recovery ending location: %X/%X\n"
+msgstr "最å°é‚„原çµæŸä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:279
+#, c-format
+msgid "Min recovery ending loc's timeline: %u\n"
+msgstr "最å°é‚„原çµæŸä½ç½®çš„時間軸: %u\n"
+
+#: pg_controldata.c:281
+#, c-format
+msgid "Backup start location: %X/%X\n"
+msgstr "備份開始ä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:283
+#, c-format
+msgid "Backup end location: %X/%X\n"
+msgstr "備份çµæŸä½ç½®: %X/%X\n"
+
+#: pg_controldata.c:285
+#, c-format
+msgid "End-of-backup record required: %s\n"
+msgstr "需è¦å‚™ä»½çµæŸè¨˜éŒ„: %s\n"
+
+# describe.c:1262
+# describe.c:1638
+# describe.c:1692
+#: pg_controldata.c:286
+msgid "no"
+msgstr "no"
+
+# describe.c:1262
+# describe.c:1637
+# describe.c:1694
+#: pg_controldata.c:286
+msgid "yes"
+msgstr "yes"
+
+#: pg_controldata.c:287
+#, c-format
+#| msgid "Current wal_level setting: %s\n"
+msgid "wal_level setting: %s\n"
+msgstr "wal_level 設定: %s\n"
+
+#: pg_controldata.c:289
+#, c-format
+#| msgid "Current wal_level setting: %s\n"
+msgid "wal_log_hints setting: %s\n"
+msgstr "wal_log_hints 設定: %s\n"
+
+#: pg_controldata.c:291
+#, c-format
+#| msgid "Current max_connections setting: %d\n"
+msgid "max_connections setting: %d\n"
+msgstr "max_connections 設定: %d\n"
+
+#: pg_controldata.c:293
+#, c-format
+#| msgid "Current max_connections setting: %d\n"
+msgid "max_worker_processes setting: %d\n"
+msgstr "max_worker_processes 設定: %d\n"
+
+#: pg_controldata.c:295
+#, c-format
+#| msgid "Current wal_level setting: %s\n"
+msgid "max_wal_senders setting: %d\n"
+msgstr "max_wal_senders 設定: %d\n"
+
+#: pg_controldata.c:297
+#, c-format
+#| msgid "Current max_prepared_xacts setting: %d\n"
+msgid "max_prepared_xacts setting: %d\n"
+msgstr "max_prepared_xacts 設定: %d\n"
+
+#: pg_controldata.c:299
+#, c-format
+#| msgid "Current max_locks_per_xact setting: %d\n"
+msgid "max_locks_per_xact setting: %d\n"
+msgstr "max_locks_per_xact 設定: %d\n"
+
+#: pg_controldata.c:301
+#, c-format
+#| msgid "Current max_connections setting: %d\n"
+msgid "track_commit_timestamp setting: %s\n"
+msgstr "track_commit_timestamp 設定: %s\n"
+
+#: pg_controldata.c:303
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "資料å°é½Šä¸Šé™: %u\n"
+
+#: pg_controldata.c:306
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "資料庫å€å¡Šå¤§å°: %u\n"
+
+#: pg_controldata.c:308
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大型關è¯æ¯å€‹ç‰‡æ®µçš„å€å¡Šæ•¸: %u\n"
+
+#: pg_controldata.c:310
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL å€å¡Šå¤§å°: %u\n"
+
+#: pg_controldata.c:312
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "æ¯å€‹ WAL 片段的ä½å…ƒçµ„數: %u\n"
+
+#: pg_controldata.c:314
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "識別å稱長度上é™: %u\n"
+
+#: pg_controldata.c:316
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "索引欄ä½æ•¸ä¸Šé™: %u\n"
+
+#: pg_controldata.c:318
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST å€å¡Šå¤§å°ä¸Šé™: %u\n"
+
+#: pg_controldata.c:320
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "大物件å€å¡Šçš„大å°: %u\n"
+
+#: pg_controldata.c:323
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日期/時間類型的儲存方å¼: %s\n"
+
+#: pg_controldata.c:324
+msgid "64-bit integers"
+msgstr "64ä½å…ƒæ•´æ•¸"
+
+#: pg_controldata.c:325
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 åƒæ•¸å‚³éžæ–¹å¼: %s\n"
+
+#: pg_controldata.c:326
+msgid "by reference"
+msgstr "傳å€"
+
+#: pg_controldata.c:326
+msgid "by value"
+msgstr "傳值"
+
+#: pg_controldata.c:327
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "資料é æª¢æŸ¥ç¢¼ç‰ˆæœ¬: %u\n"
+
+#: pg_controldata.c:329
+#, c-format
+msgid "Mock authentication nonce: %s\n"
+msgstr "模擬的驗證 nonce: %s\n"
+
+#, c-format
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: 無法開啟檔案 \"%s\" 讀å–: %s\n"
+
+#, c-format
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: 無法讀å–檔案 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Float4 åƒæ•¸å‚³éžæ–¹å¼: %s\n"
+
+#~ msgid "Maximum number of function arguments: %u\n"
+#~ msgstr "函å¼åƒæ•¸çš„最大個數: %u\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "執行 \"%s --help\" 顯示更多資訊。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Usage:\n"
+#~ " %s [OPTION] [DATADIR]\n"
+#~ "\n"
+#~ "Options:\n"
+#~ " --help show this help, then exit\n"
+#~ " --version output version information, then exit\n"
+#~ msgstr ""
+#~ "用法:\n"
+#~ " %s [é¸é …] [資料目錄]\n"
+#~ "\n"
+#~ "é¸é …:\n"
+#~ " --help 顯示說明訊æ¯ç„¶å¾ŒçµæŸ\n"
+#~ " --version 顯示版本資訊然後çµæŸ\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "浮點數"
diff --git a/src/bin/pg_controldata/t/001_pg_controldata.pl b/src/bin/pg_controldata/t/001_pg_controldata.pl
new file mode 100644
index 0000000..0c64103
--- /dev/null
+++ b/src/bin/pg_controldata/t/001_pg_controldata.pl
@@ -0,0 +1,46 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_controldata');
+program_version_ok('pg_controldata');
+program_options_handling_ok('pg_controldata');
+command_fails(['pg_controldata'], 'pg_controldata without arguments fails');
+command_fails([ 'pg_controldata', 'nonexistent' ],
+ 'pg_controldata with nonexistent directory fails');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+command_like([ 'pg_controldata', $node->data_dir ],
+ qr/checkpoint/, 'pg_controldata produces output');
+
+
+# check with a corrupted pg_control
+
+my $pg_control = $node->data_dir . '/global/pg_control';
+my $size = (stat($pg_control))[7];
+
+open my $fh, '>', $pg_control or BAIL_OUT($!);
+binmode $fh;
+
+# fill file with zeros
+print $fh pack("x[$size]");
+close $fh;
+
+command_checks_all(
+ [ 'pg_controldata', $node->data_dir ],
+ 0,
+ [
+ qr/WARNING: Calculated CRC checksum does not match value stored in file/,
+ qr/WARNING: invalid WAL segment size/
+ ],
+ [qr/^$/],
+ 'pg_controldata with corrupted pg_control');
+
+done_testing();
diff --git a/src/bin/pg_ctl/.gitignore b/src/bin/pg_ctl/.gitignore
new file mode 100644
index 0000000..73ab4ed
--- /dev/null
+++ b/src/bin/pg_ctl/.gitignore
@@ -0,0 +1,2 @@
+/pg_ctl
+/tmp_check/
diff --git a/src/bin/pg_ctl/Makefile b/src/bin/pg_ctl/Makefile
new file mode 100644
index 0000000..4b6d47a
--- /dev/null
+++ b/src/bin/pg_ctl/Makefile
@@ -0,0 +1,53 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_ctl
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_ctl/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_ctl - starts/stops/restarts the PostgreSQL server"
+PGAPPICON=win32
+
+subdir = src/bin/pg_ctl
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# On Windows, we need to link with libpq, just for use of pqexpbuffer;
+# but let's not pull that in on platforms where we don't need it.
+ifeq ($(PORTNAME), win32)
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += $(libpq_pgport)
+SUBMAKE_LIBPQ := submake-libpq
+endif
+
+OBJS = \
+ $(WIN32RES) \
+ pg_ctl.o
+
+all: pg_ctl
+
+pg_ctl: $(OBJS) | submake-libpgport $(SUBMAKE_LIBPQ)
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_ctl$(X) '$(DESTDIR)$(bindir)/pg_ctl$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_ctl$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_ctl$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build
new file mode 100644
index 0000000..608a52f
--- /dev/null
+++ b/src/bin/pg_ctl/meson.build
@@ -0,0 +1,34 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_ctl_sources = files(
+ 'pg_ctl.c',
+)
+
+if host_system == 'windows'
+ pg_ctl_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_ctl',
+ '--FILEDESC', 'pg_ctl - starts/stops/restarts the PostgreSQL server',])
+endif
+
+pg_ctl = executable('pg_ctl',
+ pg_ctl_sources,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_ctl
+
+tests += {
+ 'name': 'pg_ctl',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_start_stop.pl',
+ 't/002_status.pl',
+ 't/003_promote.pl',
+ 't/004_logrotate.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_ctl/nls.mk b/src/bin/pg_ctl/nls.mk
new file mode 100644
index 0000000..fd63554
--- /dev/null
+++ b/src/bin/pg_ctl/nls.mk
@@ -0,0 +1,7 @@
+# src/bin/pg_ctl/nls.mk
+CATALOG_NAME = pg_ctl
+GETTEXT_FILES = pg_ctl.c \
+ ../../common/exec.c \
+ ../../common/fe_memutils.c \
+ ../../common/wait_error.c \
+ ../../port/path.c
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
new file mode 100644
index 0000000..fc160b0
--- /dev/null
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -0,0 +1,2520 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_ctl --- start/stops/restarts the PostgreSQL server
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/pg_ctl/pg_ctl.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/resource.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+
+#include "catalog/pg_control.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "getopt_long.h"
+#include "utils/pidfile.h"
+
+#ifdef WIN32 /* on Unix, we don't need libpq */
+#include "pqexpbuffer.h"
+#endif
+
+
+typedef enum
+{
+ SMART_MODE,
+ FAST_MODE,
+ IMMEDIATE_MODE
+} ShutdownMode;
+
+typedef enum
+{
+ POSTMASTER_READY,
+ POSTMASTER_STILL_STARTING,
+ POSTMASTER_FAILED
+} WaitPMResult;
+
+typedef enum
+{
+ NO_COMMAND = 0,
+ INIT_COMMAND,
+ START_COMMAND,
+ STOP_COMMAND,
+ RESTART_COMMAND,
+ RELOAD_COMMAND,
+ STATUS_COMMAND,
+ PROMOTE_COMMAND,
+ LOGROTATE_COMMAND,
+ KILL_COMMAND,
+ REGISTER_COMMAND,
+ UNREGISTER_COMMAND,
+ RUN_AS_SERVICE_COMMAND
+} CtlCommand;
+
+#define DEFAULT_WAIT 60
+
+#define USEC_PER_SEC 1000000
+
+#define WAITS_PER_SEC 10 /* should divide USEC_PER_SEC evenly */
+
+static bool do_wait = true;
+static int wait_seconds = DEFAULT_WAIT;
+static bool wait_seconds_arg = false;
+static bool silent_mode = false;
+static ShutdownMode shutdown_mode = FAST_MODE;
+static int sig = SIGINT; /* default */
+static CtlCommand ctl_command = NO_COMMAND;
+static char *pg_data = NULL;
+static char *pg_config = NULL;
+static char *pgdata_opt = NULL;
+static char *post_opts = NULL;
+static const char *progname;
+static char *log_file = NULL;
+static char *exec_path = NULL;
+static char *event_source = NULL;
+static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */
+static char *register_username = NULL;
+static char *register_password = NULL;
+static char *argv0 = NULL;
+static bool allow_core_files = false;
+static time_t start_time;
+
+static char postopts_file[MAXPGPATH];
+static char version_file[MAXPGPATH];
+static char pid_file[MAXPGPATH];
+static char backup_file[MAXPGPATH];
+static char promote_file[MAXPGPATH];
+static char logrotate_file[MAXPGPATH];
+
+static volatile pid_t postmasterPID = -1;
+
+#ifdef WIN32
+static DWORD pgctl_start_type = SERVICE_AUTO_START;
+static SERVICE_STATUS status;
+static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0;
+static HANDLE shutdownHandles[2];
+
+#define shutdownEvent shutdownHandles[0]
+#define postmasterProcess shutdownHandles[1]
+#endif
+
+
+static void write_stderr(const char *fmt,...) pg_attribute_printf(1, 2);
+static void do_advice(void);
+static void do_help(void);
+static void set_mode(char *modeopt);
+static void set_sig(char *signame);
+static void do_init(void);
+static void do_start(void);
+static void do_stop(void);
+static void do_restart(void);
+static void do_reload(void);
+static void do_status(void);
+static void do_promote(void);
+static void do_logrotate(void);
+static void do_kill(pid_t pid);
+static void print_msg(const char *msg);
+static void adjust_data_dir(void);
+
+#ifdef WIN32
+#include <versionhelpers.h>
+static bool pgwin32_IsInstalled(SC_HANDLE);
+static char *pgwin32_CommandLine(bool);
+static void pgwin32_doRegister(void);
+static void pgwin32_doUnregister(void);
+static void pgwin32_SetServiceStatus(DWORD);
+static void WINAPI pgwin32_ServiceHandler(DWORD);
+static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *);
+static void pgwin32_doRunAsService(void);
+static int CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service);
+static PTOKEN_PRIVILEGES GetPrivilegesToDelete(HANDLE hToken);
+#endif
+
+static pid_t get_pgpid(bool is_status_request);
+static char **readfile(const char *path, int *numlines);
+static void free_readfile(char **optlines);
+static pid_t start_postmaster(void);
+static void read_post_opts(void);
+
+static WaitPMResult wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint);
+static bool wait_for_postmaster_stop(void);
+static bool wait_for_postmaster_promote(void);
+static bool postmaster_is_alive(pid_t pid);
+
+#if defined(HAVE_GETRLIMIT)
+static void unlimit_core_size(void);
+#endif
+
+static DBState get_control_dbstate(void);
+
+
+#ifdef WIN32
+static void
+write_eventlog(int level, const char *line)
+{
+ static HANDLE evtHandle = INVALID_HANDLE_VALUE;
+
+ if (silent_mode && level == EVENTLOG_INFORMATION_TYPE)
+ return;
+
+ if (evtHandle == INVALID_HANDLE_VALUE)
+ {
+ evtHandle = RegisterEventSource(NULL,
+ event_source ? event_source : DEFAULT_EVENT_SOURCE);
+ if (evtHandle == NULL)
+ {
+ evtHandle = INVALID_HANDLE_VALUE;
+ return;
+ }
+ }
+
+ ReportEvent(evtHandle,
+ level,
+ 0,
+ 0, /* All events are Id 0 */
+ NULL,
+ 1,
+ 0,
+ &line,
+ NULL);
+}
+#endif
+
+/*
+ * Write errors to stderr (or by equal means when stderr is
+ * not available).
+ */
+static void
+write_stderr(const char *fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+#ifndef WIN32
+ /* On Unix, we just fprintf to stderr */
+ vfprintf(stderr, fmt, ap);
+#else
+
+ /*
+ * On Win32, we print to stderr if running on a console, or write to
+ * eventlog if running as a service
+ */
+ if (pgwin32_is_service()) /* Running as a service */
+ {
+ char errbuf[2048]; /* Arbitrary size? */
+
+ vsnprintf(errbuf, sizeof(errbuf), fmt, ap);
+
+ write_eventlog(EVENTLOG_ERROR_TYPE, errbuf);
+ }
+ else
+ /* Not running as service, write to stderr */
+ vfprintf(stderr, fmt, ap);
+#endif
+ va_end(ap);
+}
+
+/*
+ * Given an already-localized string, print it to stdout unless the
+ * user has specified that no messages should be printed.
+ */
+static void
+print_msg(const char *msg)
+{
+ if (!silent_mode)
+ {
+ fputs(msg, stdout);
+ fflush(stdout);
+ }
+}
+
+static pid_t
+get_pgpid(bool is_status_request)
+{
+ FILE *pidf;
+ int pid;
+ struct stat statbuf;
+
+ if (stat(pg_data, &statbuf) != 0)
+ {
+ if (errno == ENOENT)
+ write_stderr(_("%s: directory \"%s\" does not exist\n"), progname,
+ pg_data);
+ else
+ write_stderr(_("%s: could not access directory \"%s\": %s\n"), progname,
+ pg_data, strerror(errno));
+
+ /*
+ * The Linux Standard Base Core Specification 3.1 says this should
+ * return '4, program or service status is unknown'
+ * https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
+ */
+ exit(is_status_request ? 4 : 1);
+ }
+
+ if (stat(version_file, &statbuf) != 0 && errno == ENOENT)
+ {
+ write_stderr(_("%s: directory \"%s\" is not a database cluster directory\n"),
+ progname, pg_data);
+ exit(is_status_request ? 4 : 1);
+ }
+
+ pidf = fopen(pid_file, "r");
+ if (pidf == NULL)
+ {
+ /* No pid file, not an error on startup */
+ if (errno == ENOENT)
+ return 0;
+ else
+ {
+ write_stderr(_("%s: could not open PID file \"%s\": %s\n"),
+ progname, pid_file, strerror(errno));
+ exit(1);
+ }
+ }
+ if (fscanf(pidf, "%d", &pid) != 1)
+ {
+ /* Is the file empty? */
+ if (ftell(pidf) == 0 && feof(pidf))
+ write_stderr(_("%s: the PID file \"%s\" is empty\n"),
+ progname, pid_file);
+ else
+ write_stderr(_("%s: invalid data in PID file \"%s\"\n"),
+ progname, pid_file);
+ exit(1);
+ }
+ fclose(pidf);
+ return (pid_t) pid;
+}
+
+
+/*
+ * get the lines from a text file - return NULL if file can't be opened
+ *
+ * Trailing newlines are deleted from the lines (this is a change from pre-v10)
+ *
+ * *numlines is set to the number of line pointers returned; there is
+ * also an additional NULL pointer after the last real line.
+ */
+static char **
+readfile(const char *path, int *numlines)
+{
+ int fd;
+ int nlines;
+ char **result;
+ char *buffer;
+ char *linebegin;
+ int i;
+ int n;
+ int len;
+ struct stat statbuf;
+
+ *numlines = 0; /* in case of failure or empty file */
+
+ /*
+ * Slurp the file into memory.
+ *
+ * The file can change concurrently, so we read the whole file into memory
+ * with a single read() call. That's not guaranteed to get an atomic
+ * snapshot, but in practice, for a small file, it's close enough for the
+ * current use.
+ */
+ fd = open(path, O_RDONLY | PG_BINARY, 0);
+ if (fd < 0)
+ return NULL;
+ if (fstat(fd, &statbuf) < 0)
+ {
+ close(fd);
+ return NULL;
+ }
+ if (statbuf.st_size == 0)
+ {
+ /* empty file */
+ close(fd);
+ result = (char **) pg_malloc(sizeof(char *));
+ *result = NULL;
+ return result;
+ }
+ buffer = pg_malloc(statbuf.st_size + 1);
+
+ len = read(fd, buffer, statbuf.st_size + 1);
+ close(fd);
+ if (len != statbuf.st_size)
+ {
+ /* oops, the file size changed between fstat and read */
+ free(buffer);
+ return NULL;
+ }
+
+ /*
+ * Count newlines. We expect there to be a newline after each full line,
+ * including one at the end of file. If there isn't a newline at the end,
+ * any characters after the last newline will be ignored.
+ */
+ nlines = 0;
+ for (i = 0; i < len; i++)
+ {
+ if (buffer[i] == '\n')
+ nlines++;
+ }
+
+ /* set up the result buffer */
+ result = (char **) pg_malloc((nlines + 1) * sizeof(char *));
+ *numlines = nlines;
+
+ /* now split the buffer into lines */
+ linebegin = buffer;
+ n = 0;
+ for (i = 0; i < len; i++)
+ {
+ if (buffer[i] == '\n')
+ {
+ int slen = &buffer[i] - linebegin;
+ char *linebuf = pg_malloc(slen + 1);
+
+ memcpy(linebuf, linebegin, slen);
+ /* we already dropped the \n, but get rid of any \r too */
+ if (slen > 0 && linebuf[slen - 1] == '\r')
+ slen--;
+ linebuf[slen] = '\0';
+ result[n++] = linebuf;
+ linebegin = &buffer[i + 1];
+ }
+ }
+ result[n] = NULL;
+
+ free(buffer);
+
+ return result;
+}
+
+
+/*
+ * Free memory allocated for optlines through readfile()
+ */
+static void
+free_readfile(char **optlines)
+{
+ char *curr_line = NULL;
+ int i = 0;
+
+ if (!optlines)
+ return;
+
+ while ((curr_line = optlines[i++]))
+ free(curr_line);
+
+ free(optlines);
+}
+
+/*
+ * start/test/stop routines
+ */
+
+/*
+ * Start the postmaster and return its PID.
+ *
+ * Currently, on Windows what we return is the PID of the shell process
+ * that launched the postmaster (and, we trust, is waiting for it to exit).
+ * So the PID is usable for "is the postmaster still running" checks,
+ * but cannot be compared directly to postmaster.pid.
+ *
+ * On Windows, we also save aside a handle to the shell process in
+ * "postmasterProcess", which the caller should close when done with it.
+ */
+static pid_t
+start_postmaster(void)
+{
+ char *cmd;
+
+#ifndef WIN32
+ pid_t pm_pid;
+
+ /* Flush stdio channels just before fork, to avoid double-output problems */
+ fflush(NULL);
+
+#ifdef EXEC_BACKEND
+ pg_disable_aslr();
+#endif
+
+ pm_pid = fork();
+ if (pm_pid < 0)
+ {
+ /* fork failed */
+ write_stderr(_("%s: could not start server: %s\n"),
+ progname, strerror(errno));
+ exit(1);
+ }
+ if (pm_pid > 0)
+ {
+ /* fork succeeded, in parent */
+ return pm_pid;
+ }
+
+ /* fork succeeded, in child */
+
+ /*
+ * If possible, detach the postmaster process from the launching process
+ * group and make it a group leader, so that it doesn't get signaled along
+ * with the current group that launched it.
+ */
+#ifdef HAVE_SETSID
+ if (setsid() < 0)
+ {
+ write_stderr(_("%s: could not start server due to setsid() failure: %s\n"),
+ progname, strerror(errno));
+ exit(1);
+ }
+#endif
+
+ /*
+ * Since there might be quotes to handle here, it is easier simply to pass
+ * everything to a shell to process them. Use exec so that the postmaster
+ * has the same PID as the current child process.
+ */
+ if (log_file != NULL)
+ cmd = psprintf("exec \"%s\" %s%s < \"%s\" >> \"%s\" 2>&1",
+ exec_path, pgdata_opt, post_opts,
+ DEVNULL, log_file);
+ else
+ cmd = psprintf("exec \"%s\" %s%s < \"%s\" 2>&1",
+ exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ (void) execl("/bin/sh", "/bin/sh", "-c", cmd, (char *) NULL);
+
+ /* exec failed */
+ write_stderr(_("%s: could not start server: %s\n"),
+ progname, strerror(errno));
+ exit(1);
+
+ return 0; /* keep dumb compilers quiet */
+
+#else /* WIN32 */
+
+ /*
+ * As with the Unix case, it's easiest to use the shell (CMD.EXE) to
+ * handle redirection etc. Unfortunately CMD.EXE lacks any equivalent of
+ * "exec", so we don't get to find out the postmaster's PID immediately.
+ */
+ PROCESS_INFORMATION pi;
+ const char *comspec;
+
+ /* Find CMD.EXE location using COMSPEC, if it's set */
+ comspec = getenv("COMSPEC");
+ if (comspec == NULL)
+ comspec = "CMD";
+
+ if (log_file != NULL)
+ {
+ /*
+ * First, open the log file if it exists. The idea is that if the
+ * file is still locked by a previous postmaster run, we'll wait until
+ * it comes free, instead of failing with ERROR_SHARING_VIOLATION.
+ * (It'd be better to open the file in a sharing-friendly mode, but we
+ * can't use CMD.EXE to do that, so work around it. Note that the
+ * previous postmaster will still have the file open for a short time
+ * after removing postmaster.pid.)
+ *
+ * If the log file doesn't exist, we *must not* create it here. If we
+ * were launched with higher privileges than the restricted process
+ * will have, the log file might end up with permissions settings that
+ * prevent the postmaster from writing on it.
+ */
+ int fd = open(log_file, O_RDWR, 0);
+
+ if (fd == -1)
+ {
+ /*
+ * ENOENT is expectable since we didn't use O_CREAT. Otherwise
+ * complain. We could just fall through and let CMD.EXE report
+ * the problem, but its error reporting is pretty miserable.
+ */
+ if (errno != ENOENT)
+ {
+ write_stderr(_("%s: could not open log file \"%s\": %s\n"),
+ progname, log_file, strerror(errno));
+ exit(1);
+ }
+ }
+ else
+ close(fd);
+
+ cmd = psprintf("\"%s\" /D /C \"\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1\"",
+ comspec, exec_path, pgdata_opt, post_opts, DEVNULL, log_file);
+ }
+ else
+ cmd = psprintf("\"%s\" /D /C \"\"%s\" %s%s < \"%s\" 2>&1\"",
+ comspec, exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ if (!CreateRestrictedProcess(cmd, &pi, false))
+ {
+ write_stderr(_("%s: could not start server: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ exit(1);
+ }
+ /* Don't close command process handle here; caller must do so */
+ postmasterProcess = pi.hProcess;
+ CloseHandle(pi.hThread);
+ return pi.dwProcessId; /* Shell's PID, not postmaster's! */
+#endif /* WIN32 */
+}
+
+
+
+/*
+ * Wait for the postmaster to become ready.
+ *
+ * On Unix, pm_pid is the PID of the just-launched postmaster. On Windows,
+ * it may be the PID of an ancestor shell process, so we can't check the
+ * contents of postmaster.pid quite as carefully.
+ *
+ * On Windows, the static variable postmasterProcess is an implicit argument
+ * to this routine; it contains a handle to the postmaster process or an
+ * ancestor shell process thereof.
+ *
+ * Note that the checkpoint parameter enables a Windows service control
+ * manager checkpoint, it's got nothing to do with database checkpoints!!
+ */
+static WaitPMResult
+wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint)
+{
+ int i;
+
+ for (i = 0; i < wait_seconds * WAITS_PER_SEC; i++)
+ {
+ char **optlines;
+ int numlines;
+
+ /*
+ * Try to read the postmaster.pid file. If it's not valid, or if the
+ * status line isn't there yet, just keep waiting.
+ */
+ if ((optlines = readfile(pid_file, &numlines)) != NULL &&
+ numlines >= LOCK_FILE_LINE_PM_STATUS)
+ {
+ /* File is complete enough for us, parse it */
+ pid_t pmpid;
+ time_t pmstart;
+
+ /*
+ * Make sanity checks. If it's for the wrong PID, or the recorded
+ * start time is before pg_ctl started, then either we are looking
+ * at the wrong data directory, or this is a pre-existing pidfile
+ * that hasn't (yet?) been overwritten by our child postmaster.
+ * Allow 2 seconds slop for possible cross-process clock skew.
+ */
+ pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]);
+ pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]);
+ if (pmstart >= start_time - 2 &&
+#ifndef WIN32
+ pmpid == pm_pid
+#else
+ /* Windows can only reject standalone-backend PIDs */
+ pmpid > 0
+#endif
+ )
+ {
+ /*
+ * OK, seems to be a valid pidfile from our child. Check the
+ * status line (this assumes a v10 or later server).
+ */
+ char *pmstatus = optlines[LOCK_FILE_LINE_PM_STATUS - 1];
+
+ if (strcmp(pmstatus, PM_STATUS_READY) == 0 ||
+ strcmp(pmstatus, PM_STATUS_STANDBY) == 0)
+ {
+ /* postmaster is done starting up */
+ free_readfile(optlines);
+ return POSTMASTER_READY;
+ }
+ }
+ }
+
+ /*
+ * Free the results of readfile.
+ *
+ * This is safe to call even if optlines is NULL.
+ */
+ free_readfile(optlines);
+
+ /*
+ * Check whether the child postmaster process is still alive. This
+ * lets us exit early if the postmaster fails during startup.
+ *
+ * On Windows, we may be checking the postmaster's parent shell, but
+ * that's fine for this purpose.
+ */
+#ifndef WIN32
+ {
+ int exitstatus;
+
+ if (waitpid(pm_pid, &exitstatus, WNOHANG) == pm_pid)
+ return POSTMASTER_FAILED;
+ }
+#else
+ if (WaitForSingleObject(postmasterProcess, 0) == WAIT_OBJECT_0)
+ return POSTMASTER_FAILED;
+#endif
+
+ /* Startup still in process; wait, printing a dot once per second */
+ if (i % WAITS_PER_SEC == 0)
+ {
+#ifdef WIN32
+ if (do_checkpoint)
+ {
+ /*
+ * Increment the wait hint by 6 secs (connection timeout +
+ * sleep). We must do this to indicate to the SCM that our
+ * startup time is changing, otherwise it'll usually send a
+ * stop signal after 20 seconds, despite incrementing the
+ * checkpoint counter.
+ */
+ status.dwWaitHint += 6000;
+ status.dwCheckPoint++;
+ SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
+ }
+ else
+#endif
+ print_msg(".");
+ }
+
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+
+ /* out of patience; report that postmaster is still starting up */
+ return POSTMASTER_STILL_STARTING;
+}
+
+
+/*
+ * Wait for the postmaster to stop.
+ *
+ * Returns true if the postmaster stopped cleanly (i.e., removed its pidfile).
+ * Returns false if the postmaster dies uncleanly, or if we time out.
+ */
+static bool
+wait_for_postmaster_stop(void)
+{
+ int cnt;
+
+ for (cnt = 0; cnt < wait_seconds * WAITS_PER_SEC; cnt++)
+ {
+ pid_t pid;
+
+ if ((pid = get_pgpid(false)) == 0)
+ return true; /* pid file is gone */
+
+ if (kill(pid, 0) != 0)
+ {
+ /*
+ * Postmaster seems to have died. Check the pid file once more to
+ * avoid a race condition, but give up waiting.
+ */
+ if (get_pgpid(false) == 0)
+ return true; /* pid file is gone */
+ return false; /* postmaster died untimely */
+ }
+
+ if (cnt % WAITS_PER_SEC == 0)
+ print_msg(".");
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+ return false; /* timeout reached */
+}
+
+
+/*
+ * Wait for the postmaster to promote.
+ *
+ * Returns true on success, else false.
+ * To avoid waiting uselessly, we check for postmaster death here too.
+ */
+static bool
+wait_for_postmaster_promote(void)
+{
+ int cnt;
+
+ for (cnt = 0; cnt < wait_seconds * WAITS_PER_SEC; cnt++)
+ {
+ pid_t pid;
+ DBState state;
+
+ if ((pid = get_pgpid(false)) == 0)
+ return false; /* pid file is gone */
+ if (kill(pid, 0) != 0)
+ return false; /* postmaster died */
+
+ state = get_control_dbstate();
+ if (state == DB_IN_PRODUCTION)
+ return true; /* successful promotion */
+
+ if (cnt % WAITS_PER_SEC == 0)
+ print_msg(".");
+ pg_usleep(USEC_PER_SEC / WAITS_PER_SEC);
+ }
+ return false; /* timeout reached */
+}
+
+
+#if defined(HAVE_GETRLIMIT)
+static void
+unlimit_core_size(void)
+{
+ struct rlimit lim;
+
+ getrlimit(RLIMIT_CORE, &lim);
+ if (lim.rlim_max == 0)
+ {
+ write_stderr(_("%s: cannot set core file size limit; disallowed by hard limit\n"),
+ progname);
+ return;
+ }
+ else if (lim.rlim_max == RLIM_INFINITY || lim.rlim_cur < lim.rlim_max)
+ {
+ lim.rlim_cur = lim.rlim_max;
+ setrlimit(RLIMIT_CORE, &lim);
+ }
+}
+#endif
+
+static void
+read_post_opts(void)
+{
+ if (post_opts == NULL)
+ {
+ post_opts = ""; /* default */
+ if (ctl_command == RESTART_COMMAND)
+ {
+ char **optlines;
+ int numlines;
+
+ optlines = readfile(postopts_file, &numlines);
+ if (optlines == NULL)
+ {
+ write_stderr(_("%s: could not read file \"%s\"\n"), progname, postopts_file);
+ exit(1);
+ }
+ else if (numlines != 1)
+ {
+ write_stderr(_("%s: option file \"%s\" must have exactly one line\n"),
+ progname, postopts_file);
+ exit(1);
+ }
+ else
+ {
+ char *optline;
+ char *arg1;
+
+ optline = optlines[0];
+
+ /*
+ * Are we at the first option, as defined by space and
+ * double-quote?
+ */
+ if ((arg1 = strstr(optline, " \"")) != NULL)
+ {
+ *arg1 = '\0'; /* terminate so we get only program name */
+ post_opts = pg_strdup(arg1 + 1); /* point past whitespace */
+ }
+ if (exec_path == NULL)
+ exec_path = pg_strdup(optline);
+ }
+
+ /* Free the results of readfile. */
+ free_readfile(optlines);
+ }
+ }
+}
+
+/*
+ * SIGINT signal handler used while waiting for postmaster to start up.
+ * Forwards the SIGINT to the postmaster process, asking it to shut down,
+ * before terminating pg_ctl itself. This way, if the user hits CTRL-C while
+ * waiting for the server to start up, the server launch is aborted.
+ */
+static void
+trap_sigint_during_startup(SIGNAL_ARGS)
+{
+ if (postmasterPID != -1)
+ {
+ if (kill(postmasterPID, SIGINT) != 0)
+ write_stderr(_("%s: could not send stop signal (PID: %d): %s\n"),
+ progname, (int) postmasterPID, strerror(errno));
+ }
+
+ /*
+ * Clear the signal handler, and send the signal again, to terminate the
+ * process as normal.
+ */
+ pqsignal(postgres_signal_arg, SIG_DFL);
+ raise(postgres_signal_arg);
+}
+
+static char *
+find_other_exec_or_die(const char *argv0, const char *target, const char *versionstr)
+{
+ int ret;
+ char *found_path;
+
+ found_path = pg_malloc(MAXPGPATH);
+
+ if ((ret = find_other_exec(argv0, target, versionstr, found_path)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ write_stderr(_("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"),
+ target, progname, full_path);
+ else
+ write_stderr(_("program \"%s\" was found by \"%s\" but was not the same version as %s\n"),
+ target, full_path, progname);
+ exit(1);
+ }
+
+ return found_path;
+}
+
+static void
+do_init(void)
+{
+ char *cmd;
+
+ if (exec_path == NULL)
+ exec_path = find_other_exec_or_die(argv0, "initdb", "initdb (PostgreSQL) " PG_VERSION "\n");
+
+ if (pgdata_opt == NULL)
+ pgdata_opt = "";
+
+ if (post_opts == NULL)
+ post_opts = "";
+
+ if (!silent_mode)
+ cmd = psprintf("\"%s\" %s%s",
+ exec_path, pgdata_opt, post_opts);
+ else
+ cmd = psprintf("\"%s\" %s%s > \"%s\"",
+ exec_path, pgdata_opt, post_opts, DEVNULL);
+
+ fflush(NULL);
+ if (system(cmd) != 0)
+ {
+ write_stderr(_("%s: database system initialization failed\n"), progname);
+ exit(1);
+ }
+}
+
+static void
+do_start(void)
+{
+ pid_t old_pid = 0;
+ pid_t pm_pid;
+
+ if (ctl_command != RESTART_COMMAND)
+ {
+ old_pid = get_pgpid(false);
+ if (old_pid != 0)
+ write_stderr(_("%s: another server might be running; "
+ "trying to start server anyway\n"),
+ progname);
+ }
+
+ read_post_opts();
+
+ /* No -D or -D already added during server start */
+ if (ctl_command == RESTART_COMMAND || pgdata_opt == NULL)
+ pgdata_opt = "";
+
+ if (exec_path == NULL)
+ exec_path = find_other_exec_or_die(argv0, "postgres", PG_BACKEND_VERSIONSTR);
+
+#if defined(HAVE_GETRLIMIT)
+ if (allow_core_files)
+ unlimit_core_size();
+#endif
+
+ /*
+ * If possible, tell the postmaster our parent shell's PID (see the
+ * comments in CreateLockFile() for motivation). Windows hasn't got
+ * getppid() unfortunately.
+ */
+#ifndef WIN32
+ {
+ char env_var[32];
+
+ snprintf(env_var, sizeof(env_var), "%d", (int) getppid());
+ setenv("PG_GRANDPARENT_PID", env_var, 1);
+ }
+#endif
+
+ pm_pid = start_postmaster();
+
+ if (do_wait)
+ {
+ /*
+ * If the user interrupts the startup (e.g. with CTRL-C), we'd like to
+ * abort the server launch. Install a signal handler that will
+ * forward SIGINT to the postmaster process, while we wait.
+ *
+ * (We don't bother to reset the signal handler after the launch, as
+ * we're about to exit, anyway.)
+ */
+ postmasterPID = pm_pid;
+ pqsignal(SIGINT, trap_sigint_during_startup);
+
+ print_msg(_("waiting for server to start..."));
+
+ switch (wait_for_postmaster_start(pm_pid, false))
+ {
+ case POSTMASTER_READY:
+ print_msg(_(" done\n"));
+ print_msg(_("server started\n"));
+ break;
+ case POSTMASTER_STILL_STARTING:
+ print_msg(_(" stopped waiting\n"));
+ write_stderr(_("%s: server did not start in time\n"),
+ progname);
+ exit(1);
+ break;
+ case POSTMASTER_FAILED:
+ print_msg(_(" stopped waiting\n"));
+ write_stderr(_("%s: could not start server\n"
+ "Examine the log output.\n"),
+ progname);
+ exit(1);
+ break;
+ }
+ }
+ else
+ print_msg(_("server starting\n"));
+
+#ifdef WIN32
+ /* Now we don't need the handle to the shell process anymore */
+ CloseHandle(postmasterProcess);
+ postmasterProcess = INVALID_HANDLE_VALUE;
+#endif
+}
+
+
+static void
+do_stop(void)
+{
+ pid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot stop server; "
+ "single-user server is running (PID: %d)\n"),
+ progname, (int) pid);
+ exit(1);
+ }
+
+ if (kill(pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send stop signal (PID: %d): %s\n"), progname, (int) pid,
+ strerror(errno));
+ exit(1);
+ }
+
+ if (!do_wait)
+ {
+ print_msg(_("server shutting down\n"));
+ return;
+ }
+ else
+ {
+ print_msg(_("waiting for server to shut down..."));
+
+ if (!wait_for_postmaster_stop())
+ {
+ print_msg(_(" failed\n"));
+
+ write_stderr(_("%s: server does not shut down\n"), progname);
+ if (shutdown_mode == SMART_MODE)
+ write_stderr(_("HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+ "waiting for session-initiated disconnection.\n"));
+ exit(1);
+ }
+ print_msg(_(" done\n"));
+
+ print_msg(_("server stopped\n"));
+ }
+}
+
+
+/*
+ * restart/reload routines
+ */
+
+static void
+do_restart(void)
+{
+ pid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"),
+ progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ write_stderr(_("trying to start server anyway\n"));
+ do_start();
+ return;
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ if (postmaster_is_alive(pid))
+ {
+ write_stderr(_("%s: cannot restart server; "
+ "single-user server is running (PID: %d)\n"),
+ progname, (int) pid);
+ write_stderr(_("Please terminate the single-user server and try again.\n"));
+ exit(1);
+ }
+ }
+
+ if (postmaster_is_alive(pid))
+ {
+ if (kill(pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send stop signal (PID: %d): %s\n"), progname, (int) pid,
+ strerror(errno));
+ exit(1);
+ }
+
+ print_msg(_("waiting for server to shut down..."));
+
+ /* always wait for restart */
+ if (!wait_for_postmaster_stop())
+ {
+ print_msg(_(" failed\n"));
+
+ write_stderr(_("%s: server does not shut down\n"), progname);
+ if (shutdown_mode == SMART_MODE)
+ write_stderr(_("HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+ "waiting for session-initiated disconnection.\n"));
+ exit(1);
+ }
+
+ print_msg(_(" done\n"));
+ print_msg(_("server stopped\n"));
+ }
+ else
+ {
+ write_stderr(_("%s: old server process (PID: %d) seems to be gone\n"),
+ progname, (int) pid);
+ write_stderr(_("starting server anyway\n"));
+ }
+
+ do_start();
+}
+
+static void
+do_reload(void)
+{
+ pid_t pid;
+
+ pid = get_pgpid(false);
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot reload server; "
+ "single-user server is running (PID: %d)\n"),
+ progname, (int) pid);
+ write_stderr(_("Please terminate the single-user server and try again.\n"));
+ exit(1);
+ }
+
+ if (kill(pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send reload signal (PID: %d): %s\n"),
+ progname, (int) pid, strerror(errno));
+ exit(1);
+ }
+
+ print_msg(_("server signaled\n"));
+}
+
+
+/*
+ * promote
+ */
+
+static void
+do_promote(void)
+{
+ FILE *prmfile;
+ pid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot promote server; "
+ "single-user server is running (PID: %d)\n"),
+ progname, (int) pid);
+ exit(1);
+ }
+
+ if (get_control_dbstate() != DB_IN_ARCHIVE_RECOVERY)
+ {
+ write_stderr(_("%s: cannot promote server; "
+ "server is not in standby mode\n"),
+ progname);
+ exit(1);
+ }
+
+ snprintf(promote_file, MAXPGPATH, "%s/promote", pg_data);
+
+ if ((prmfile = fopen(promote_file, "w")) == NULL)
+ {
+ write_stderr(_("%s: could not create promote signal file \"%s\": %s\n"),
+ progname, promote_file, strerror(errno));
+ exit(1);
+ }
+ if (fclose(prmfile))
+ {
+ write_stderr(_("%s: could not write promote signal file \"%s\": %s\n"),
+ progname, promote_file, strerror(errno));
+ exit(1);
+ }
+
+ sig = SIGUSR1;
+ if (kill(pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send promote signal (PID: %d): %s\n"),
+ progname, (int) pid, strerror(errno));
+ if (unlink(promote_file) != 0)
+ write_stderr(_("%s: could not remove promote signal file \"%s\": %s\n"),
+ progname, promote_file, strerror(errno));
+ exit(1);
+ }
+
+ if (do_wait)
+ {
+ print_msg(_("waiting for server to promote..."));
+ if (wait_for_postmaster_promote())
+ {
+ print_msg(_(" done\n"));
+ print_msg(_("server promoted\n"));
+ }
+ else
+ {
+ print_msg(_(" stopped waiting\n"));
+ write_stderr(_("%s: server did not promote in time\n"),
+ progname);
+ exit(1);
+ }
+ }
+ else
+ print_msg(_("server promoting\n"));
+}
+
+/*
+ * log rotate
+ */
+
+static void
+do_logrotate(void)
+{
+ FILE *logrotatefile;
+ pid_t pid;
+
+ pid = get_pgpid(false);
+
+ if (pid == 0) /* no pid file */
+ {
+ write_stderr(_("%s: PID file \"%s\" does not exist\n"), progname, pid_file);
+ write_stderr(_("Is server running?\n"));
+ exit(1);
+ }
+ else if (pid < 0) /* standalone backend, not postmaster */
+ {
+ pid = -pid;
+ write_stderr(_("%s: cannot rotate log file; "
+ "single-user server is running (PID: %d)\n"),
+ progname, (int) pid);
+ exit(1);
+ }
+
+ snprintf(logrotate_file, MAXPGPATH, "%s/logrotate", pg_data);
+
+ if ((logrotatefile = fopen(logrotate_file, "w")) == NULL)
+ {
+ write_stderr(_("%s: could not create log rotation signal file \"%s\": %s\n"),
+ progname, logrotate_file, strerror(errno));
+ exit(1);
+ }
+ if (fclose(logrotatefile))
+ {
+ write_stderr(_("%s: could not write log rotation signal file \"%s\": %s\n"),
+ progname, logrotate_file, strerror(errno));
+ exit(1);
+ }
+
+ sig = SIGUSR1;
+ if (kill(pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send log rotation signal (PID: %d): %s\n"),
+ progname, (int) pid, strerror(errno));
+ if (unlink(logrotate_file) != 0)
+ write_stderr(_("%s: could not remove log rotation signal file \"%s\": %s\n"),
+ progname, logrotate_file, strerror(errno));
+ exit(1);
+ }
+
+ print_msg(_("server signaled to rotate log file\n"));
+}
+
+
+/*
+ * utility routines
+ */
+
+static bool
+postmaster_is_alive(pid_t pid)
+{
+ /*
+ * Test to see if the process is still there. Note that we do not
+ * consider an EPERM failure to mean that the process is still there;
+ * EPERM must mean that the given PID belongs to some other userid, and
+ * considering the permissions on $PGDATA, that means it's not the
+ * postmaster we are after.
+ *
+ * Don't believe that our own PID or parent shell's PID is the postmaster,
+ * either. (Windows hasn't got getppid(), though.)
+ */
+ if (pid == getpid())
+ return false;
+#ifndef WIN32
+ if (pid == getppid())
+ return false;
+#endif
+ if (kill(pid, 0) == 0)
+ return true;
+ return false;
+}
+
+static void
+do_status(void)
+{
+ pid_t pid;
+
+ pid = get_pgpid(true);
+ /* Is there a pid file? */
+ if (pid != 0)
+ {
+ /* standalone backend? */
+ if (pid < 0)
+ {
+ pid = -pid;
+ if (postmaster_is_alive(pid))
+ {
+ printf(_("%s: single-user server is running (PID: %d)\n"),
+ progname, (int) pid);
+ return;
+ }
+ }
+ else
+ /* must be a postmaster */
+ {
+ if (postmaster_is_alive(pid))
+ {
+ char **optlines;
+ char **curr_line;
+ int numlines;
+
+ printf(_("%s: server is running (PID: %d)\n"),
+ progname, (int) pid);
+
+ optlines = readfile(postopts_file, &numlines);
+ if (optlines != NULL)
+ {
+ for (curr_line = optlines; *curr_line != NULL; curr_line++)
+ puts(*curr_line);
+
+ /* Free the results of readfile */
+ free_readfile(optlines);
+ }
+ return;
+ }
+ }
+ }
+ printf(_("%s: no server running\n"), progname);
+
+ /*
+ * The Linux Standard Base Core Specification 3.1 says this should return
+ * '3, program is not running'
+ * https://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
+ */
+ exit(3);
+}
+
+
+
+static void
+do_kill(pid_t pid)
+{
+ if (kill(pid, sig) != 0)
+ {
+ write_stderr(_("%s: could not send signal %d (PID: %d): %s\n"),
+ progname, sig, (int) pid, strerror(errno));
+ exit(1);
+ }
+}
+
+#ifdef WIN32
+
+static bool
+pgwin32_IsInstalled(SC_HANDLE hSCM)
+{
+ SC_HANDLE hService = OpenService(hSCM, register_servicename, SERVICE_QUERY_CONFIG);
+ bool bResult = (hService != NULL);
+
+ if (bResult)
+ CloseServiceHandle(hService);
+ return bResult;
+}
+
+static char *
+pgwin32_CommandLine(bool registration)
+{
+ PQExpBuffer cmdLine = createPQExpBuffer();
+ char cmdPath[MAXPGPATH];
+ int ret;
+
+ if (registration)
+ {
+ ret = find_my_exec(argv0, cmdPath);
+ if (ret != 0)
+ {
+ write_stderr(_("%s: could not find own program executable\n"), progname);
+ exit(1);
+ }
+ }
+ else
+ {
+ ret = find_other_exec(argv0, "postgres", PG_BACKEND_VERSIONSTR,
+ cmdPath);
+ if (ret != 0)
+ {
+ write_stderr(_("%s: could not find postgres program executable\n"), progname);
+ exit(1);
+ }
+ }
+
+ /* if path does not end in .exe, append it */
+ if (strlen(cmdPath) < 4 ||
+ pg_strcasecmp(cmdPath + strlen(cmdPath) - 4, ".exe") != 0)
+ snprintf(cmdPath + strlen(cmdPath), sizeof(cmdPath) - strlen(cmdPath),
+ ".exe");
+
+ /* use backslashes in path to avoid problems with some third-party tools */
+ make_native_path(cmdPath);
+
+ /* be sure to double-quote the executable's name in the command */
+ appendPQExpBuffer(cmdLine, "\"%s\"", cmdPath);
+
+ /* append assorted switches to the command line, as needed */
+
+ if (registration)
+ appendPQExpBuffer(cmdLine, " runservice -N \"%s\"",
+ register_servicename);
+
+ if (pg_config)
+ {
+ /* We need the -D path to be absolute */
+ char *dataDir;
+
+ if ((dataDir = make_absolute_path(pg_config)) == NULL)
+ {
+ /* make_absolute_path already reported the error */
+ exit(1);
+ }
+ make_native_path(dataDir);
+ appendPQExpBuffer(cmdLine, " -D \"%s\"", dataDir);
+ free(dataDir);
+ }
+
+ if (registration && event_source != NULL)
+ appendPQExpBuffer(cmdLine, " -e \"%s\"", event_source);
+
+ if (registration && do_wait)
+ appendPQExpBufferStr(cmdLine, " -w");
+
+ /* Don't propagate a value from an environment variable. */
+ if (registration && wait_seconds_arg && wait_seconds != DEFAULT_WAIT)
+ appendPQExpBuffer(cmdLine, " -t %d", wait_seconds);
+
+ if (registration && silent_mode)
+ appendPQExpBufferStr(cmdLine, " -s");
+
+ if (post_opts)
+ {
+ if (registration)
+ appendPQExpBuffer(cmdLine, " -o \"%s\"", post_opts);
+ else
+ appendPQExpBuffer(cmdLine, " %s", post_opts);
+ }
+
+ return cmdLine->data;
+}
+
+static void
+pgwin32_doRegister(void)
+{
+ SC_HANDLE hService;
+ SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (hSCM == NULL)
+ {
+ write_stderr(_("%s: could not open service manager\n"), progname);
+ exit(1);
+ }
+ if (pgwin32_IsInstalled(hSCM))
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: service \"%s\" already registered\n"), progname, register_servicename);
+ exit(1);
+ }
+
+ if ((hService = CreateService(hSCM, register_servicename, register_servicename,
+ SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
+ pgctl_start_type, SERVICE_ERROR_NORMAL,
+ pgwin32_CommandLine(true),
+ NULL, NULL, "RPCSS\0", register_username, register_password)) == NULL)
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: could not register service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+}
+
+static void
+pgwin32_doUnregister(void)
+{
+ SC_HANDLE hService;
+ SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
+
+ if (hSCM == NULL)
+ {
+ write_stderr(_("%s: could not open service manager\n"), progname);
+ exit(1);
+ }
+ if (!pgwin32_IsInstalled(hSCM))
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: service \"%s\" not registered\n"), progname, register_servicename);
+ exit(1);
+ }
+
+ if ((hService = OpenService(hSCM, register_servicename, DELETE)) == NULL)
+ {
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: could not open service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+ if (!DeleteService(hService))
+ {
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+ write_stderr(_("%s: could not unregister service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCM);
+}
+
+static void
+pgwin32_SetServiceStatus(DWORD currentState)
+{
+ status.dwCurrentState = currentState;
+ SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
+}
+
+static void WINAPI
+pgwin32_ServiceHandler(DWORD request)
+{
+ switch (request)
+ {
+ case SERVICE_CONTROL_STOP:
+ case SERVICE_CONTROL_SHUTDOWN:
+
+ /*
+ * We only need a short wait hint here as it just needs to wait
+ * for the next checkpoint. They occur every 5 seconds during
+ * shutdown
+ */
+ status.dwWaitHint = 10000;
+ pgwin32_SetServiceStatus(SERVICE_STOP_PENDING);
+ SetEvent(shutdownEvent);
+ return;
+
+ case SERVICE_CONTROL_PAUSE:
+ /* Win32 config reloading */
+ status.dwWaitHint = 5000;
+ kill(postmasterPID, SIGHUP);
+ return;
+
+ /* FIXME: These could be used to replace other signals etc */
+ case SERVICE_CONTROL_CONTINUE:
+ case SERVICE_CONTROL_INTERROGATE:
+ default:
+ break;
+ }
+}
+
+static void WINAPI
+pgwin32_ServiceMain(DWORD argc, LPTSTR *argv)
+{
+ PROCESS_INFORMATION pi;
+ DWORD ret;
+
+ /* Initialize variables */
+ status.dwWin32ExitCode = S_OK;
+ status.dwCheckPoint = 0;
+ status.dwWaitHint = 60000;
+ status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
+ status.dwServiceSpecificExitCode = 0;
+ status.dwCurrentState = SERVICE_START_PENDING;
+
+ memset(&pi, 0, sizeof(pi));
+
+ read_post_opts();
+
+ /* Register the control request handler */
+ if ((hStatus = RegisterServiceCtrlHandler(register_servicename, pgwin32_ServiceHandler)) == (SERVICE_STATUS_HANDLE) 0)
+ return;
+
+ if ((shutdownEvent = CreateEvent(NULL, true, false, NULL)) == NULL)
+ return;
+
+ /* Start the postmaster */
+ pgwin32_SetServiceStatus(SERVICE_START_PENDING);
+ if (!CreateRestrictedProcess(pgwin32_CommandLine(false), &pi, true))
+ {
+ pgwin32_SetServiceStatus(SERVICE_STOPPED);
+ return;
+ }
+ postmasterPID = pi.dwProcessId;
+ postmasterProcess = pi.hProcess;
+ CloseHandle(pi.hThread);
+
+ if (do_wait)
+ {
+ write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Waiting for server startup...\n"));
+ if (wait_for_postmaster_start(postmasterPID, true) != POSTMASTER_READY)
+ {
+ write_eventlog(EVENTLOG_ERROR_TYPE, _("Timed out waiting for server startup\n"));
+ pgwin32_SetServiceStatus(SERVICE_STOPPED);
+ return;
+ }
+ write_eventlog(EVENTLOG_INFORMATION_TYPE, _("Server started and accepting connections\n"));
+ }
+
+ pgwin32_SetServiceStatus(SERVICE_RUNNING);
+
+ /* Wait for quit... */
+ ret = WaitForMultipleObjects(2, shutdownHandles, FALSE, INFINITE);
+
+ pgwin32_SetServiceStatus(SERVICE_STOP_PENDING);
+ switch (ret)
+ {
+ case WAIT_OBJECT_0: /* shutdown event */
+ {
+ /*
+ * status.dwCheckPoint can be incremented by
+ * wait_for_postmaster_start(), so it might not start from 0.
+ */
+ int maxShutdownCheckPoint = status.dwCheckPoint + 12;
+
+ kill(postmasterPID, SIGINT);
+
+ /*
+ * Increment the checkpoint and try again. Abort after 12
+ * checkpoints as the postmaster has probably hung.
+ */
+ while (WaitForSingleObject(postmasterProcess, 5000) == WAIT_TIMEOUT && status.dwCheckPoint < maxShutdownCheckPoint)
+ {
+ status.dwCheckPoint++;
+ SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
+ }
+ break;
+ }
+
+ case (WAIT_OBJECT_0 + 1): /* postmaster went down */
+ break;
+
+ default:
+ /* shouldn't get here? */
+ break;
+ }
+
+ CloseHandle(shutdownEvent);
+ CloseHandle(postmasterProcess);
+
+ pgwin32_SetServiceStatus(SERVICE_STOPPED);
+}
+
+static void
+pgwin32_doRunAsService(void)
+{
+ SERVICE_TABLE_ENTRY st[] = {{register_servicename, pgwin32_ServiceMain},
+ {NULL, NULL}};
+
+ if (StartServiceCtrlDispatcher(st) == 0)
+ {
+ write_stderr(_("%s: could not start service \"%s\": error code %lu\n"),
+ progname, register_servicename,
+ (unsigned long) GetLastError());
+ exit(1);
+ }
+}
+
+
+/*
+ * Set up STARTUPINFO for the new process to inherit this process' handles.
+ *
+ * Process started as services appear to have "empty" handles (GetStdHandle()
+ * returns NULL) rather than invalid ones. But passing down NULL ourselves
+ * doesn't work, it's interpreted as STARTUPINFO->hStd* not being set. But we
+ * can pass down INVALID_HANDLE_VALUE - which makes GetStdHandle() in the new
+ * process (and its child processes!) return INVALID_HANDLE_VALUE. Which
+ * achieves the goal of postmaster running in a similar environment as pg_ctl.
+ */
+static void
+InheritStdHandles(STARTUPINFO *si)
+{
+ si->dwFlags |= STARTF_USESTDHANDLES;
+ si->hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+ if (si->hStdInput == NULL)
+ si->hStdInput = INVALID_HANDLE_VALUE;
+ si->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+ if (si->hStdOutput == NULL)
+ si->hStdOutput = INVALID_HANDLE_VALUE;
+ si->hStdError = GetStdHandle(STD_ERROR_HANDLE);
+ if (si->hStdError == NULL)
+ si->hStdError = INVALID_HANDLE_VALUE;
+}
+
+/*
+ * Create a restricted token, a job object sandbox, and execute the specified
+ * process with it.
+ *
+ * Returns 0 on success, non-zero on failure, same as CreateProcess().
+ *
+ * NOTE! Job object will only work when running as a service, because it's
+ * automatically destroyed when pg_ctl exits.
+ */
+static int
+CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service)
+{
+ int r;
+ BOOL b;
+ STARTUPINFO si;
+ HANDLE origToken;
+ HANDLE restrictedToken;
+ BOOL inJob;
+ SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
+ SID_AND_ATTRIBUTES dropSids[2];
+ PTOKEN_PRIVILEGES delPrivs;
+
+ ZeroMemory(&si, sizeof(si));
+ si.cb = sizeof(si);
+
+ /*
+ * Set stdin/stdout/stderr handles to be inherited in the child process.
+ * That allows postmaster and the processes it starts to perform
+ * additional checks to see if running in a service (otherwise they get
+ * the default console handles - which point to "somewhere").
+ */
+ InheritStdHandles(&si);
+
+ /* Open the current token to use as a base for the restricted one */
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &origToken))
+ {
+ /*
+ * Most Windows targets make DWORD a 32-bit unsigned long, but in case
+ * it doesn't cast DWORD before printing.
+ */
+ write_stderr(_("%s: could not open process token: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return 0;
+ }
+
+ /* Allocate list of SIDs to remove */
+ ZeroMemory(&dropSids, sizeof(dropSids));
+ if (!AllocateAndInitializeSid(&NtAuthority, 2,
+ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0,
+ 0, &dropSids[0].Sid) ||
+ !AllocateAndInitializeSid(&NtAuthority, 2,
+ SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0,
+ 0, &dropSids[1].Sid))
+ {
+ write_stderr(_("%s: could not allocate SIDs: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return 0;
+ }
+
+ /* Get list of privileges to remove */
+ delPrivs = GetPrivilegesToDelete(origToken);
+ if (delPrivs == NULL)
+ /* Error message already printed */
+ return 0;
+
+ b = CreateRestrictedToken(origToken,
+ 0,
+ sizeof(dropSids) / sizeof(dropSids[0]),
+ dropSids,
+ delPrivs->PrivilegeCount, delPrivs->Privileges,
+ 0, NULL,
+ &restrictedToken);
+
+ free(delPrivs);
+ FreeSid(dropSids[1].Sid);
+ FreeSid(dropSids[0].Sid);
+ CloseHandle(origToken);
+
+ if (!b)
+ {
+ write_stderr(_("%s: could not create restricted token: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return 0;
+ }
+
+ AddUserToTokenDacl(restrictedToken);
+ r = CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, processInfo);
+
+ if (IsProcessInJob(processInfo->hProcess, NULL, &inJob))
+ {
+ if (!inJob)
+ {
+ /*
+ * Job objects are working, and the new process isn't in one, so
+ * we can create one safely. If any problems show up when setting
+ * it, we're going to ignore them.
+ */
+ HANDLE job;
+ char jobname[128];
+
+ sprintf(jobname, "PostgreSQL_%lu",
+ (unsigned long) processInfo->dwProcessId);
+
+ job = CreateJobObject(NULL, jobname);
+ if (job)
+ {
+ JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit;
+ JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions;
+ JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit;
+
+ ZeroMemory(&basicLimit, sizeof(basicLimit));
+ ZeroMemory(&uiRestrictions, sizeof(uiRestrictions));
+ ZeroMemory(&securityLimit, sizeof(securityLimit));
+
+ basicLimit.LimitFlags = JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | JOB_OBJECT_LIMIT_PRIORITY_CLASS;
+ basicLimit.PriorityClass = NORMAL_PRIORITY_CLASS;
+ SetInformationJobObject(job, JobObjectBasicLimitInformation, &basicLimit, sizeof(basicLimit));
+
+ uiRestrictions.UIRestrictionsClass = JOB_OBJECT_UILIMIT_DESKTOP | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS |
+ JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_READCLIPBOARD |
+ JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS | JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
+
+ SetInformationJobObject(job, JobObjectBasicUIRestrictions, &uiRestrictions, sizeof(uiRestrictions));
+
+ securityLimit.SecurityLimitFlags = JOB_OBJECT_SECURITY_NO_ADMIN | JOB_OBJECT_SECURITY_ONLY_TOKEN;
+ securityLimit.JobToken = restrictedToken;
+ SetInformationJobObject(job, JobObjectSecurityLimitInformation, &securityLimit, sizeof(securityLimit));
+
+ AssignProcessToJobObject(job, processInfo->hProcess);
+ }
+ }
+ }
+
+ CloseHandle(restrictedToken);
+
+ ResumeThread(processInfo->hThread);
+
+ /*
+ * We intentionally don't close the job object handle, because we want the
+ * object to live on until pg_ctl shuts down.
+ */
+ return r;
+}
+
+/*
+ * Get a list of privileges to delete from the access token. We delete all privileges
+ * except SeLockMemoryPrivilege which is needed to use large pages, and
+ * SeChangeNotifyPrivilege which is enabled by default in DISABLE_MAX_PRIVILEGE.
+ */
+static PTOKEN_PRIVILEGES
+GetPrivilegesToDelete(HANDLE hToken)
+{
+ int i,
+ j;
+ DWORD length;
+ PTOKEN_PRIVILEGES tokenPrivs;
+ LUID luidLockPages;
+ LUID luidChangeNotify;
+
+ if (!LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &luidLockPages) ||
+ !LookupPrivilegeValue(NULL, SE_CHANGE_NOTIFY_NAME, &luidChangeNotify))
+ {
+ write_stderr(_("%s: could not get LUIDs for privileges: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return NULL;
+ }
+
+ if (!GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &length) &&
+ GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ write_stderr(_("%s: could not get token information: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ return NULL;
+ }
+
+ tokenPrivs = (PTOKEN_PRIVILEGES) pg_malloc_extended(length,
+ MCXT_ALLOC_NO_OOM);
+ if (tokenPrivs == NULL)
+ {
+ write_stderr(_("%s: out of memory\n"), progname);
+ return NULL;
+ }
+
+ if (!GetTokenInformation(hToken, TokenPrivileges, tokenPrivs, length, &length))
+ {
+ write_stderr(_("%s: could not get token information: error code %lu\n"),
+ progname, (unsigned long) GetLastError());
+ free(tokenPrivs);
+ return NULL;
+ }
+
+ for (i = 0; i < tokenPrivs->PrivilegeCount; i++)
+ {
+ if (memcmp(&tokenPrivs->Privileges[i].Luid, &luidLockPages, sizeof(LUID)) == 0 ||
+ memcmp(&tokenPrivs->Privileges[i].Luid, &luidChangeNotify, sizeof(LUID)) == 0)
+ {
+ for (j = i; j < tokenPrivs->PrivilegeCount - 1; j++)
+ tokenPrivs->Privileges[j] = tokenPrivs->Privileges[j + 1];
+ tokenPrivs->PrivilegeCount--;
+ }
+ }
+
+ return tokenPrivs;
+}
+#endif /* WIN32 */
+
+static void
+do_advice(void)
+{
+ write_stderr(_("Try \"%s --help\" for more information.\n"), progname);
+}
+
+
+
+static void
+do_help(void)
+{
+ printf(_("%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"), progname);
+ printf(_(" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+ " [-o OPTIONS] [-p PATH] [-c]\n"), progname);
+ printf(_(" %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"), progname);
+ printf(_(" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+ " [-o OPTIONS] [-c]\n"), progname);
+ printf(_(" %s reload [-D DATADIR] [-s]\n"), progname);
+ printf(_(" %s status [-D DATADIR]\n"), progname);
+ printf(_(" %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"), progname);
+ printf(_(" %s logrotate [-D DATADIR] [-s]\n"), progname);
+ printf(_(" %s kill SIGNALNAME PID\n"), progname);
+#ifdef WIN32
+ printf(_(" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+ " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"), progname);
+ printf(_(" %s unregister [-N SERVICENAME]\n"), progname);
+#endif
+
+ printf(_("\nCommon options:\n"));
+ printf(_(" -D, --pgdata=DATADIR location of the database storage area\n"));
+#ifdef WIN32
+ printf(_(" -e SOURCE event source for logging when running as a service\n"));
+#endif
+ printf(_(" -s, --silent only print errors, no informational messages\n"));
+ printf(_(" -t, --timeout=SECS seconds to wait when using -w option\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -w, --wait wait until operation completes (default)\n"));
+ printf(_(" -W, --no-wait do not wait until operation completes\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("If the -D option is omitted, the environment variable PGDATA is used.\n"));
+
+ printf(_("\nOptions for start or restart:\n"));
+#if defined(HAVE_GETRLIMIT)
+ printf(_(" -c, --core-files allow postgres to produce core files\n"));
+#else
+ printf(_(" -c, --core-files not applicable on this platform\n"));
+#endif
+ printf(_(" -l, --log=FILENAME write (or append) server log to FILENAME\n"));
+ printf(_(" -o, --options=OPTIONS command line options to pass to postgres\n"
+ " (PostgreSQL server executable) or initdb\n"));
+ printf(_(" -p PATH-TO-POSTGRES normally not necessary\n"));
+ printf(_("\nOptions for stop or restart:\n"));
+ printf(_(" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"));
+
+ printf(_("\nShutdown modes are:\n"));
+ printf(_(" smart quit after all clients have disconnected\n"));
+ printf(_(" fast quit directly, with proper shutdown (default)\n"));
+ printf(_(" immediate quit without complete shutdown; will lead to recovery on restart\n"));
+
+ printf(_("\nAllowed signal names for kill:\n"));
+ printf(" ABRT HUP INT KILL QUIT TERM USR1 USR2\n");
+
+#ifdef WIN32
+ printf(_("\nOptions for register and unregister:\n"));
+ printf(_(" -N SERVICENAME service name with which to register PostgreSQL server\n"));
+ printf(_(" -P PASSWORD password of account to register PostgreSQL server\n"));
+ printf(_(" -U USERNAME user name of account to register PostgreSQL server\n"));
+ printf(_(" -S START-TYPE service start type to register PostgreSQL server\n"));
+
+ printf(_("\nStart types are:\n"));
+ printf(_(" auto start service automatically during system startup (default)\n"));
+ printf(_(" demand start service on demand\n"));
+#endif
+
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+
+static void
+set_mode(char *modeopt)
+{
+ if (strcmp(modeopt, "s") == 0 || strcmp(modeopt, "smart") == 0)
+ {
+ shutdown_mode = SMART_MODE;
+ sig = SIGTERM;
+ }
+ else if (strcmp(modeopt, "f") == 0 || strcmp(modeopt, "fast") == 0)
+ {
+ shutdown_mode = FAST_MODE;
+ sig = SIGINT;
+ }
+ else if (strcmp(modeopt, "i") == 0 || strcmp(modeopt, "immediate") == 0)
+ {
+ shutdown_mode = IMMEDIATE_MODE;
+ sig = SIGQUIT;
+ }
+ else
+ {
+ write_stderr(_("%s: unrecognized shutdown mode \"%s\"\n"), progname, modeopt);
+ do_advice();
+ exit(1);
+ }
+}
+
+
+
+static void
+set_sig(char *signame)
+{
+ if (strcmp(signame, "HUP") == 0)
+ sig = SIGHUP;
+ else if (strcmp(signame, "INT") == 0)
+ sig = SIGINT;
+ else if (strcmp(signame, "QUIT") == 0)
+ sig = SIGQUIT;
+ else if (strcmp(signame, "ABRT") == 0)
+ sig = SIGABRT;
+ else if (strcmp(signame, "KILL") == 0)
+ sig = SIGKILL;
+ else if (strcmp(signame, "TERM") == 0)
+ sig = SIGTERM;
+ else if (strcmp(signame, "USR1") == 0)
+ sig = SIGUSR1;
+ else if (strcmp(signame, "USR2") == 0)
+ sig = SIGUSR2;
+ else
+ {
+ write_stderr(_("%s: unrecognized signal name \"%s\"\n"), progname, signame);
+ do_advice();
+ exit(1);
+ }
+}
+
+
+#ifdef WIN32
+static void
+set_starttype(char *starttypeopt)
+{
+ if (strcmp(starttypeopt, "a") == 0 || strcmp(starttypeopt, "auto") == 0)
+ pgctl_start_type = SERVICE_AUTO_START;
+ else if (strcmp(starttypeopt, "d") == 0 || strcmp(starttypeopt, "demand") == 0)
+ pgctl_start_type = SERVICE_DEMAND_START;
+ else
+ {
+ write_stderr(_("%s: unrecognized start type \"%s\"\n"), progname, starttypeopt);
+ do_advice();
+ exit(1);
+ }
+}
+#endif
+
+/*
+ * adjust_data_dir
+ *
+ * If a configuration-only directory was specified, find the real data dir.
+ */
+static void
+adjust_data_dir(void)
+{
+ char filename[MAXPGPATH];
+ char *my_exec_path,
+ *cmd;
+ FILE *fd;
+
+ /* do nothing if we're working without knowledge of data dir */
+ if (pg_config == NULL)
+ return;
+
+ /* If there is no postgresql.conf, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/postgresql.conf", pg_config);
+ if ((fd = fopen(filename, "r")) == NULL)
+ return;
+ fclose(fd);
+
+ /* If PG_VERSION exists, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/PG_VERSION", pg_config);
+ if ((fd = fopen(filename, "r")) != NULL)
+ {
+ fclose(fd);
+ return;
+ }
+
+ /* Must be a configuration directory, so find the data directory */
+
+ /* we use a private my_exec_path to avoid interfering with later uses */
+ if (exec_path == NULL)
+ my_exec_path = find_other_exec_or_die(argv0, "postgres", PG_BACKEND_VERSIONSTR);
+ else
+ my_exec_path = pg_strdup(exec_path);
+
+ /* it's important for -C to be the first option, see main.c */
+ cmd = psprintf("\"%s\" -C data_directory %s%s",
+ my_exec_path,
+ pgdata_opt ? pgdata_opt : "",
+ post_opts ? post_opts : "");
+ fflush(NULL);
+
+ fd = popen(cmd, "r");
+ if (fd == NULL || fgets(filename, sizeof(filename), fd) == NULL || pclose(fd) != 0)
+ {
+ write_stderr(_("%s: could not determine the data directory using command \"%s\"\n"), progname, cmd);
+ exit(1);
+ }
+ free(my_exec_path);
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(filename);
+
+ free(pg_data);
+ pg_data = pg_strdup(filename);
+ canonicalize_path(pg_data);
+}
+
+
+static DBState
+get_control_dbstate(void)
+{
+ DBState ret;
+ bool crc_ok;
+ ControlFileData *control_file_data = get_controlfile(pg_data, &crc_ok);
+
+ if (!crc_ok)
+ {
+ write_stderr(_("%s: control file appears to be corrupt\n"), progname);
+ exit(1);
+ }
+
+ ret = control_file_data->state;
+ pfree(control_file_data);
+ return ret;
+}
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+ {"log", required_argument, NULL, 'l'},
+ {"mode", required_argument, NULL, 'm'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"options", required_argument, NULL, 'o'},
+ {"silent", no_argument, NULL, 's'},
+ {"timeout", required_argument, NULL, 't'},
+ {"core-files", no_argument, NULL, 'c'},
+ {"wait", no_argument, NULL, 'w'},
+ {"no-wait", no_argument, NULL, 'W'},
+ {NULL, 0, NULL, 0}
+ };
+
+ char *env_wait;
+ int option_index;
+ int c;
+ pid_t killproc = 0;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_ctl"));
+ start_time = time(NULL);
+
+ /*
+ * save argv[0] so do_start() can look for the postmaster if necessary. we
+ * don't look for postmaster here because in many cases we won't need it.
+ */
+ argv0 = argv[0];
+
+ /* Set restrictive mode mask until PGDATA permissions are checked */
+ umask(PG_MODE_MASK_OWNER);
+
+ /* support --help and --version even if invoked as root */
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ do_help();
+ exit(0);
+ }
+ else if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_ctl (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /*
+ * Disallow running as root, to forestall any possible security holes.
+ */
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ write_stderr(_("%s: cannot be run as root\n"
+ "Please log in (using, e.g., \"su\") as the "
+ "(unprivileged) user that will\n"
+ "own the server process.\n"),
+ progname);
+ exit(1);
+ }
+#endif
+
+ env_wait = getenv("PGCTLTIMEOUT");
+ if (env_wait != NULL)
+ wait_seconds = atoi(env_wait);
+
+ /*
+ * 'Action' can be before or after args so loop over both. Some
+ * getopt_long() implementations will reorder argv[] to place all flags
+ * first (GNU?), but we don't rely on it. Our /port version doesn't do
+ * that.
+ */
+ optind = 1;
+
+ /* process command-line options */
+ while (optind < argc)
+ {
+ while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW",
+ long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ {
+ char *pgdata_D;
+
+ pgdata_D = pg_strdup(optarg);
+ canonicalize_path(pgdata_D);
+ setenv("PGDATA", pgdata_D, 1);
+
+ /*
+ * We could pass PGDATA just in an environment
+ * variable but we do -D too for clearer postmaster
+ * 'ps' display
+ */
+ pgdata_opt = psprintf("-D \"%s\" ", pgdata_D);
+ free(pgdata_D);
+ break;
+ }
+ case 'e':
+ event_source = pg_strdup(optarg);
+ break;
+ case 'l':
+ log_file = pg_strdup(optarg);
+ break;
+ case 'm':
+ set_mode(optarg);
+ break;
+ case 'N':
+ register_servicename = pg_strdup(optarg);
+ break;
+ case 'o':
+ /* append option? */
+ if (!post_opts)
+ post_opts = pg_strdup(optarg);
+ else
+ {
+ char *old_post_opts = post_opts;
+
+ post_opts = psprintf("%s %s", old_post_opts, optarg);
+ free(old_post_opts);
+ }
+ break;
+ case 'p':
+ exec_path = pg_strdup(optarg);
+ break;
+ case 'P':
+ register_password = pg_strdup(optarg);
+ break;
+ case 's':
+ silent_mode = true;
+ break;
+ case 'S':
+#ifdef WIN32
+ set_starttype(optarg);
+#else
+ write_stderr(_("%s: -S option not supported on this platform\n"),
+ progname);
+ exit(1);
+#endif
+ break;
+ case 't':
+ wait_seconds = atoi(optarg);
+ wait_seconds_arg = true;
+ break;
+ case 'U':
+ if (strchr(optarg, '\\'))
+ register_username = pg_strdup(optarg);
+ else
+ /* Prepend .\ for local accounts */
+ register_username = psprintf(".\\%s", optarg);
+ break;
+ case 'w':
+ do_wait = true;
+ break;
+ case 'W':
+ do_wait = false;
+ break;
+ case 'c':
+ allow_core_files = true;
+ break;
+ default:
+ /* getopt_long already issued a suitable error message */
+ do_advice();
+ exit(1);
+ }
+ }
+
+ /* Process an action */
+ if (optind < argc)
+ {
+ if (ctl_command != NO_COMMAND)
+ {
+ write_stderr(_("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind]);
+ do_advice();
+ exit(1);
+ }
+
+ if (strcmp(argv[optind], "init") == 0
+ || strcmp(argv[optind], "initdb") == 0)
+ ctl_command = INIT_COMMAND;
+ else if (strcmp(argv[optind], "start") == 0)
+ ctl_command = START_COMMAND;
+ else if (strcmp(argv[optind], "stop") == 0)
+ ctl_command = STOP_COMMAND;
+ else if (strcmp(argv[optind], "restart") == 0)
+ ctl_command = RESTART_COMMAND;
+ else if (strcmp(argv[optind], "reload") == 0)
+ ctl_command = RELOAD_COMMAND;
+ else if (strcmp(argv[optind], "status") == 0)
+ ctl_command = STATUS_COMMAND;
+ else if (strcmp(argv[optind], "promote") == 0)
+ ctl_command = PROMOTE_COMMAND;
+ else if (strcmp(argv[optind], "logrotate") == 0)
+ ctl_command = LOGROTATE_COMMAND;
+ else if (strcmp(argv[optind], "kill") == 0)
+ {
+ if (argc - optind < 3)
+ {
+ write_stderr(_("%s: missing arguments for kill mode\n"), progname);
+ do_advice();
+ exit(1);
+ }
+ ctl_command = KILL_COMMAND;
+ set_sig(argv[++optind]);
+ killproc = atol(argv[++optind]);
+ }
+#ifdef WIN32
+ else if (strcmp(argv[optind], "register") == 0)
+ ctl_command = REGISTER_COMMAND;
+ else if (strcmp(argv[optind], "unregister") == 0)
+ ctl_command = UNREGISTER_COMMAND;
+ else if (strcmp(argv[optind], "runservice") == 0)
+ ctl_command = RUN_AS_SERVICE_COMMAND;
+#endif
+ else
+ {
+ write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]);
+ do_advice();
+ exit(1);
+ }
+ optind++;
+ }
+ }
+
+ if (ctl_command == NO_COMMAND)
+ {
+ write_stderr(_("%s: no operation specified\n"), progname);
+ do_advice();
+ exit(1);
+ }
+
+ /* Note we put any -D switch into the env var above */
+ pg_config = getenv("PGDATA");
+ if (pg_config)
+ {
+ pg_config = pg_strdup(pg_config);
+ canonicalize_path(pg_config);
+ pg_data = pg_strdup(pg_config);
+ }
+
+ /* -D might point at config-only directory; if so find the real PGDATA */
+ adjust_data_dir();
+
+ /* Complain if -D needed and not provided */
+ if (pg_config == NULL &&
+ ctl_command != KILL_COMMAND && ctl_command != UNREGISTER_COMMAND)
+ {
+ write_stderr(_("%s: no database directory specified and environment variable PGDATA unset\n"),
+ progname);
+ do_advice();
+ exit(1);
+ }
+
+ if (ctl_command == RELOAD_COMMAND)
+ {
+ sig = SIGHUP;
+ do_wait = false;
+ }
+
+ if (pg_data)
+ {
+ snprintf(postopts_file, MAXPGPATH, "%s/postmaster.opts", pg_data);
+ snprintf(version_file, MAXPGPATH, "%s/PG_VERSION", pg_data);
+ snprintf(pid_file, MAXPGPATH, "%s/postmaster.pid", pg_data);
+ snprintf(backup_file, MAXPGPATH, "%s/backup_label", pg_data);
+
+ /*
+ * Set mask based on PGDATA permissions,
+ *
+ * Don't error here if the data directory cannot be stat'd. This is
+ * handled differently based on the command and we don't want to
+ * interfere with that logic.
+ */
+ if (GetDataDirectoryCreatePerm(pg_data))
+ umask(pg_mode_mask);
+ }
+
+ switch (ctl_command)
+ {
+ case INIT_COMMAND:
+ do_init();
+ break;
+ case STATUS_COMMAND:
+ do_status();
+ break;
+ case START_COMMAND:
+ do_start();
+ break;
+ case STOP_COMMAND:
+ do_stop();
+ break;
+ case RESTART_COMMAND:
+ do_restart();
+ break;
+ case RELOAD_COMMAND:
+ do_reload();
+ break;
+ case PROMOTE_COMMAND:
+ do_promote();
+ break;
+ case LOGROTATE_COMMAND:
+ do_logrotate();
+ break;
+ case KILL_COMMAND:
+ do_kill(killproc);
+ break;
+#ifdef WIN32
+ case REGISTER_COMMAND:
+ pgwin32_doRegister();
+ break;
+ case UNREGISTER_COMMAND:
+ pgwin32_doUnregister();
+ break;
+ case RUN_AS_SERVICE_COMMAND:
+ pgwin32_doRunAsService();
+ break;
+#endif
+ default:
+ break;
+ }
+
+ exit(0);
+}
diff --git a/src/bin/pg_ctl/po/LINGUAS b/src/bin/pg_ctl/po/LINGUAS
new file mode 100644
index 0000000..00f815d
--- /dev/null
+++ b/src/bin/pg_ctl/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_ctl/po/cs.po b/src/bin/pg_ctl/po/cs.po
new file mode 100644
index 0000000..93ca06c
--- /dev/null
+++ b/src/bin/pg_ctl/po/cs.po
@@ -0,0 +1,949 @@
+# Czech message translation file for pg_ctl
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-24 03:48+0000\n"
+"PO-Revision-Date: 2023-04-24 08:53+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "neplatný binární soubor \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "nelze Äíst binární soubor \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít soubor \"%s\" ke spuštění"
+
+#: ../../common/exec.c:250
+#, fuzzy, c-format
+#| msgid "could not rename file \"%s\" to \"%s\": %m"
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "soubor \"%s\" nelze přejmenovat na \"%s\": %m"
+
+#: ../../common/exec.c:412
+#, fuzzy, c-format
+#| msgid "select() failed: %m"
+msgid "%s() failed: %m"
+msgstr "volání select() selhalo: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skonÄil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukonÄen vyjímkou 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukonÄen signálem %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skonÄil s nerozponaným stavem %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "nelze získat aktuální pracovní adresář: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: adresář \"%s\" neexistuje\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: nelze otevřít adresář \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: adresář \"%s\" není datový adresář databázového clusteru\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: nelze otevřít PID soubor \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID soubor \"%s\" je prázdný\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: neplatná data v PID souboru \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: nelze nastartovat server: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: nelze nastartovat server kvůli selhání setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: nelze otevřít logovací soubor \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: nelze nastartovat server: chybový kód %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: nelze nastavit limit pro core soubor; zakázáno hard limitem\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: nelze Äíst soubor \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: soubor s volbami \"%s\" musí mít přesně jednu řádku\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: nelze poslat stop signál (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" is needed by %s but was not found in the\n"
+#| "same directory as \"%s\".\n"
+#| "Check your installation."
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr ""
+"Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+"adresáři jako \"%s\".\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_ctl.c:886
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" was found by \"%s\"\n"
+#| "but was not the same version as %s.\n"
+#| "Check your installation."
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"Program \"%s\" byl nalezen pomocí \"%s\",\n"
+"ale nebyl ve stejné verzi jako %s.\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inicializace databáze selhala\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: další server možná běží; i tak zkouším start\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "Äekám na start serveru ..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " hotovo\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "server spuštěn\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " pÅ™estávám Äekat\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: server nenastartoval v Äasovém limitu\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: nelze spustit server\n"
+"Zkontrolujte záznam v logu.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "server startuje\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID soubor \"%s\" neexistuje\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Běží server?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: nemohu zastavit server; postgres běží v single-user módu (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "server se ukonÄuje\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "Äekám na ukonÄení serveru ..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " selhalo\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: server se neukonÄuje\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"TIP: Volba \"-m fast\" okamžitÄ› ukonÄí sezení namísto aby Äekala\n"
+"na odpojení iniciované přímo session.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "server zastaven\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "přesto zkouším server spustit\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: nemohu restartovat server; postgres běží v single-user módu (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Prosím ukonÄete single-user postgres a zkuste to znovu.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: starý proces serveru (PID: %d) zÅ™ejmÄ› skonÄil\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "přesto server spouštím\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: nemohu znovunaÄíst server; server běží v single-user módu (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: nelze poslat signál pro reload (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "server obdržel signál\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: nelze povýšit (promote) server; server běží v single-user módu (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: nelze povýšit (promote) server; server není ve standby módu\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: nelze vytvořit signální soubor pro povýšení (promote) \"%s\": %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: nelze zapsat do signálního souboru pro povýšení (promote) \"%s\": %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: nelze poslat signál pro povýšení (promote, PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: nelze odstranit signální soubor pro povýšení (promote) \"%s\": %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "Äekám na promote serveru ..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "server je povyšován (promote)\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: server neprovedl promote v Äasovém intervalu\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "server je povyšován (promote)\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: nemohu odrotovat log soubor; server běží v single-user módu (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: nelze vytvořit signální soubor pro odrotování logu \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: nelze zapsat do signálního souboru pro odrotování logu \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: nelze poslat signál pro odrotování logu (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: nelze odstranit signální soubor pro odrotování logu \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "server obdržel signál pro odrotování logu\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: server běží v single-user módu (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: server běží (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: žádný server neběží\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: nelze poslat signál pro reload %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: nelze najít spustitelný program postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: nelze otevřít manažera služeb\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: služba \"%s\" je již registrována\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: nelze zaregistrovat službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: služba \"%s\" není registrována\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: nelze otevřít službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: nelze odregistrovat službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Čekám na start serveru ...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "ÄŒasový limit pro Äekání na start serveru vyprÅ¡el\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Server nastartoval a přijímá spojení\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: nelze nastartovat službu \"%s\": chybový kód %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: nelze otevřít token procesu: chybový kód %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: nelze alokovat SIDs: chybový kód %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: nelze vytvořit vyhrazený token: chybový kód %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: nelze získat seznam LUID pro privilegia: chybový kód %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: nelze získat informace o tokenu: chybový kód %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: nedostatek paměti\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s je nástroj pro inicializaci, spuštění, zastavení, nebo ovládání PostgreSQL serveru.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s init[db] [-D ADRESÃŘ] [-s] [-o PŘEPÃNAÄŒE]\n"
+"\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D ADRESÃŘ] [-l SOUBOR] [-W] [-t SECS] [-s]\n"
+" [-o VOLBY] [-p CESTA] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D ADRESÃŘ] [-m MÓD-UKONÄŒENÃ] [-W] [-t SECS] [-s]\n"
+"\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D ADRESÃŘ] [-m MÓD-UKONÄŒENÃ] [-W] [-t SECS] [-s]\n"
+" [-o VOLBY] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D ADRESÃŘ] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D ADRESÃŘ]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D ADRESÃŘ] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D ADRESÃŘ] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NAZEVSIGNALU PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D ADRESÃŘ] [-N NÃZEVSLUŽBY] [-U UŽIVATEL] [-P HESLO]\n"
+" [-S MÓD-STARTU] [-e ZDROJ] [-W] [-t SECS] [-s] [-o VOLBY]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"SpoleÄné pÅ™epínaÄe:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=ADRESÃŘ umístÄ›ní úložiÅ¡tÄ› databáze\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE název zdroje pro logování při běhu jako služba\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent vypisuj jen chyby, žádné informativní zprávy\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS poÄet vteÅ™in pro Äekání pÅ™i využití volby -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypsat informace o verzi, potom skonÄit\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait Äekat na dokonÄení operace (výchozí)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait neÄekat na dokonÄení operace\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help vypsat tuto nápovÄ›du, potom skonÄit\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Pokud je vynechán parametr -D, použije se proměnná prostředí PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe pro start nebo restart:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files povolit postgresu vytvářet core soubory\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files nepoužitelné pro tuto platformu\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=SOUBOR zapisuj (nebo připoj na konec) log serveru do SOUBORU.\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=VOLBY pÅ™epínaÄe, které budou pÅ™edány postgresu\n"
+" (spustitelnému souboru PostgreSQL) Äi initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p CESTA-K-POSTGRESU za normálních okolností není potřeba\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe pro start nebo restart:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE může být \"smart\", \"fast\", or \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Módy ukonÄení jsou:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart skonÄi potom, co se odpojí vÅ¡ichni klienti\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast skonÄi okamžitÄ›, s korektním zastavením serveru (výchozí)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate skonÄi bez kompletního zastavení; po restartu se provede\n"
+" obnova po pádu (crash recovery)\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Povolené signály pro \"kill\":\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe pro register nebo unregister:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME jméno služby, pod kterým registrovat PostgreSQL server\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD heslo k úÄtu pro registraci PostgreSQL serveru\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME uživatelské jméno pro registraci PostgreSQL server\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TYP-STARTU typ spuštění služby pro registraci PostgreSQL serveru\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Módy spuštění jsou:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto spusť službu automaticky během startu systému (implicitní)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand spusť službu na vyžádání\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: neplatný mód ukonÄení mode \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: neplatné jméno signálu \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: neplatný typ spuštění \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: nelze najít datový adresář pomocí příkazu \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: control file se zdá být poškozený\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: nemůže běžet pod uživatelem root\n"
+"Prosím přihlaste se jako (neprivilegovaný) uživatel, který bude vlastníkem\n"
+"serverového procesu (například pomocí příkazu \"su\").\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S nepoužitelné pro tuto platformu\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: chýbějící parametr pro \"kill\" mód\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: neplatný mód operace \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: není specifikována operace\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: není zadán datový adresář a ani není nastavena proměnná prostředí PGDATA\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: -w volba nemůže používat relativně zadaný adresář socketu\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: -w volba není podporována při startu pre-9.1 serveru\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: this data directory appears to be running a pre-existing postmaster\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: zdá se že v tomto datovém adresáři již běží existující postmaster\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for stop, restart, or promote:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PÅ™epínaÄe pro zastavení, restart a promote:\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr " %s start [-w] [-t SECS] [-D ADRESÃŘ] [-s] [-l SOUBOR] [-o \"PŘEPÃNAÄŒE\"]\n"
+
+#~ msgid " fast promote quickly without waiting for checkpoint completion\n"
+#~ msgstr " fast promote rychlé bez Äekání na dokonÄení checkpointu\n"
+
+#~ msgid " smart promote after performing a checkpoint\n"
+#~ msgstr " smart promote po provedení checkpointu\n"
+
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s: nelze Äekat na server kvůli chybné konfiguraci\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Implicitní chování je Äekat na ukonÄení, ale ne pÅ™i startu nebo restartu.)\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+#~ "adresáři jako \"%s\".\n"
+#~ "Zkontrolujte vaši instalaci.\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Program \"%s\" byl nalezen pomocí \"%s\",\n"
+#~ "ale nebyl ve stejné verzi jako %s.\n"
+#~ "Zkontrolujte vaši instalaci.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "VAROVÃNÃ: online backup mód je aktivní\n"
+#~ "Shutdown nebude ukonÄen dokud nebude zavolán pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukonÄen signálem %s"
+
+#, c-format
+#~ msgid "pclose failed: %m"
+#~ msgstr "volání pclose selhalo: %m"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "server stále startuje\n"
diff --git a/src/bin/pg_ctl/po/de.po b/src/bin/pg_ctl/po/de.po
new file mode 100644
index 0000000..b4cad22
--- /dev/null
+++ b/src/bin/pg_ctl/po/de.po
@@ -0,0 +1,843 @@
+# German message translation file for pg_ctl
+# Peter Eisentraut <peter@eisentraut.org>, 2004 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-24 03:48+0000\n"
+"PO-Revision-Date: 2023-04-24 08:46+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ungültige Programmdatei »%s«: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "konnte Programmdatei »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: Verzeichnis »%s« existiert nicht\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: Verzeichnis »%s« ist kein Datenbankclusterverzeichnis\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: konnte PID-Datei »%s« nicht öffnen: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: die PID-Datei »%s« ist leer\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: ungültige Daten in PID-Datei »%s«\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: konnte Server nicht starten: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: konnte Server wegen setsid()-Fehler nicht starten: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: konnte Logdatei »%s« nicht öffnen: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: konnte Server nicht starten: Fehlercode %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: kann Grenzwert für Core-Datei-Größe nicht setzen; durch harten Grenzwert verboten\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: konnte Datei »%s« nicht lesen\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: Optionsdatei »%s« muss genau eine Zeile haben\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: konnte Stopp-Signal nicht senden (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: Initialisierung des Datenbanksystems fehlgeschlagen\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: ein anderer Server läuft möglicherweise; versuche trotzdem zu starten\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "warte auf Start des Servers..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " fertig\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "Server gestartet\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " Warten beendet\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: Starten des Servers hat nicht rechtzeitig abgeschlossen\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: konnte Server nicht starten\n"
+"Prüfen Sie die Logausgabe.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "Server startet\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID-Datei »%s« existiert nicht\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Läuft der Server?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: kann Server nicht anhalten; Einzelbenutzerserver läuft (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "Server fährt herunter\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "warte auf Herunterfahren des Servers..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " Fehler\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: Server fährt nicht herunter\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"TIPP: Die Option »-m fast« beendet Sitzungen sofort, statt auf das Beenden\n"
+"durch die Sitzungen selbst zu warten.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "Server angehalten\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "versuche Server trotzdem zu starten\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: kann Server nicht neu starten; Einzelbenutzerserver läuft (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Bitte beenden Sie den Einzelbenutzerserver und versuchen Sie es noch einmal.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: alter Serverprozess (PID: %d) scheint verschwunden zu sein\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "starte Server trotzdem\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: kann Server nicht neu laden; Einzelbenutzerserver läuft (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: konnte Signal zum Neuladen nicht senden (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "Signal an Server gesendet\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: kann Server nicht befördern; Einzelbenutzerserver läuft (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: kann Server nicht befördern; Server ist nicht im Standby-Modus\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht erzeugen: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht schreiben: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: konnte Signal zum Befördern nicht senden (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht entfernen: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "warte auf Befördern des Servers..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "Server wurde befördert\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: Befördern des Servers hat nicht rechtzeitig abgeschlossen\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "Server wird befördert\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: kann Logdatei nicht rotieren; Einzelbenutzerserver läuft (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht erzeugen: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht schreiben: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: konnte Signal zum Logrotieren nicht senden (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht entfernen: %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "Signal zum Logrotieren an Server gesendet\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: Einzelbenutzerserver läuft (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: Server läuft (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: kein Server läuft\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: konnte Signal %d nicht senden (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: konnte eigene Programmdatei nicht finden\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: konnte »postgres« Programmdatei nicht finden\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: konnte Servicemanager nicht öffnen\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: Systemdienst »%s« ist bereits registriert\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht registrieren: Fehlercode %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: Systemdienst »%s« ist nicht registriert\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht öffnen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht deregistrieren: Fehlercode %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Warte auf Start des Servers...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Zeitüberschreitung beim Warten auf Start des Servers\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Server wurde gestartet und nimmt Verbindungen an\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: konnte Systemdienst »%s« nicht starten: Fehlercode %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: konnte Prozess-Token nicht öffnen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: konnte SIDs nicht erzeugen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: konnte beschränktes Token nicht erzeugen: Fehlercode %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: konnte LUIDs für Privilegien nicht ermitteln: Fehlercode %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: konnte Token-Informationen nicht ermitteln: Fehlercode %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: Speicher aufgebraucht\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s ist ein Hilfsprogramm, um einen PostgreSQL-Server zu initialisieren, zu\n"
+"starten, anzuhalten oder zu steuern.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATENVERZ] [-s] [-o OPTIONEN]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATENVERZ] [-l DATEINAME] [-W] [-t SEK] [-s]\n"
+" [-o OPTIONEN] [-p PFAD] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n"
+" [-o OPTIONEN] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATENVERZ] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATENVERZ]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATENVERZ] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATENVERZ] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATENVERZ] [-N DIENSTNAME] [-U BENUTZERNAME] [-P PASSWORT]\n"
+" [-S STARTTYP] [-e QUELLE] [-W] [-t SEK] [-s] [-o OPTIONEN]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N DIENSTNAME]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Optionen für alle Modi:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATENVERZ Datenbankverzeichnis\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e QUELLE Ereignisquelle fürs Loggen, wenn als Systemdienst\n"
+" gestartet\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent nur Fehler zeigen, keine Informationsmeldungen\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEK Sekunden zu warten bei Option -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait warten bis Operation abgeschlossen ist (Voreinstellung)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait nicht warten bis Operation abgeschlossen ist\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr ""
+"Wenn die Option -D weggelassen wird, dann wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Optionen für Start oder Neustart:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files erlaubt postgres Core-Dateien zu erzeugen\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files betrifft diese Plattform nicht\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr ""
+" -l, --log=DATEINAME Serverlog in DATEINAME schreiben (wird an bestehende\n"
+" Datei angehängt)\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONEN Kommandozeilenoptionen für postgres (PostgreSQL-\n"
+" Serverprogramm) oder initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PFAD-ZU-POSTGRES normalerweise nicht notwendig\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Optionen für Anhalten oder Neustart:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODUS MODUS kann »smart«, »fast« oder »immediate« sein\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Shutdown-Modi sind:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart beenden nachdem alle Clientverbindungen geschlossen sind\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast sofort beenden, mit richtigem Shutdown (Voreinstellung)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate beenden ohne vollständigen Shutdown; führt zu Recovery-Lauf\n"
+" beim Neustart\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Erlaubte Signalnamen für »kill«:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Optionen für »register« und »unregister«:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N DIENSTNAME Systemdienstname für Registrierung des PostgreSQL-Servers\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD Passwort des Benutzers für Registrierung des PostgreSQL-Servers\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME Benutzername für Registrierung des PostgreSQL-Servers\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S STARTTYP Systemdienst-Starttyp für PostgreSQL-Server\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Starttypen sind:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto Dienst automatisch starten beim Start des Betriebssystems\n"
+" (Voreinstellung)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand Dienst bei Bedarf starten\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: unbekannter Shutdown-Modus »%s«\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: unbekannter Signalname »%s«\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: unbekannter Starttyp »%s«\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: konnte das Datenverzeichnis mit Befehl »%s« nicht ermitteln\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: Kontrolldatei scheint kaputt zu sein\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: kann nicht als root ausgeführt werden\n"
+"Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer\n"
+"ein, der Eigentümer des Serverprozesses sein soll.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: Option -S wird auf dieser Plattform nicht unterstützt\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: fehlende Argumente für »kill«-Modus\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: unbekannter Operationsmodus »%s«\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: keine Operation angegeben\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: kein Datenbankverzeichnis angegeben und Umgebungsvariable PGDATA nicht gesetzt\n"
diff --git a/src/bin/pg_ctl/po/el.po b/src/bin/pg_ctl/po/el.po
new file mode 100644
index 0000000..69fbd60
--- /dev/null
+++ b/src/bin/pg_ctl/po/el.po
@@ -0,0 +1,869 @@
+# Greek message translation file for pg_ctl
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:18+0000\n"
+"PO-Revision-Date: 2023-08-15 13:37+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βÏέθηκε"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "δεν ήταν δυνατή η επεξεÏγασία του Ï„Ïέχοντος καταλόγου εÏγασίας: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: ο κατάλογος «%s» δεν υπάÏχει\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η Ï€Ïόσβαση στον κατάλογο «%s»: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: ο κατάλογος «%s» δεν είναι κατάλογος συστάδας βάσης δεδομένων\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα αÏχείου PID «%s»: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: το αÏχείο PID «%s» είναι άδειο\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: μη έγκυÏα δεδομένα στο αÏχείο PID «%s»\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: δεν μπόÏεσε να εκκινήσει τον διακομιστή: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: δεν ήταν δυνατή η εκκίνηση του διακομιστή λόγω αποτυχίας του setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα του αÏχείου καταγÏαφής «%s»: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η εκκίνηση διακομιστή: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: δεν είναι δυνατός ο οÏισμός οÏίου μεγέθους αÏχείου πυÏήνα· απαγοÏεÏεται από το σκληÏÏŒ ÏŒÏιο\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: δεν ήταν δυνατή η ανάγνωση αÏχείου «%s»\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: το αÏχείο επιλογής «%s» Ï€Ïέπει να έχει ακÏιβώς μία γÏαμμή\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος διακοπής (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "το Ï€ÏόγÏαμμα «%s» χÏειάζεται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: αÏχικοποίηση του συστήματος βάσης δεδομένων απέτυχε\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: ενδέχεται να εκτελείται ένας άλλος διακομιστής· γίνεται Ï€Ïοσπάθεια εκκίνησης του διακομιστή οÏτως ή άλλως\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "αναμονή για την εκκίνηση του διακομιστή..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " ολοκλήÏωση\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "ο διακομιστής ξεκίνησε\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " διακοπή αναμονής\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: ο διακομιστής δεν ξεκίνησε εγκαίÏως\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: δεν ήταν δυνατή η εκκίνηση του διακομιστή\n"
+"Εξετάστε την έξοδο του αÏχείου καταγÏαφής.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "εκκίνηση διακομιστή\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: το αÏχείο PID «%s» δεν υπάÏχει\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Εκτελείται ο διακομιστής;\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: δεν είναι δυνατή η διακοπή του διακομιστή· εκτελείται διακομιστής μοναδικοÏ-χÏήστη (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "τεÏματισμός λειτουÏγίας διακομιστή\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "αναμονή για τεÏματισμό λειτουÏγίας του διακομιστή..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " απέτυχε.\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: ο διακομιστής δεν τεÏματίζεται\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"HINT: Η επιλογή \"-m fast\" αποσυνδέει αμέσως τις συνεδÏίες αντί\n"
+"να αναμένει για εκ’ συνεδÏίας εκκινοÏμενη αποσÏνδεση.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "ο διακομιστής διακόπηκε\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "Ï€Ïοσπάθεια εκκίνησης του διακομιστή οÏτως ή άλλως\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: δεν είναι δυνατή η επανεκκίνηση του διακομιστή· εκτελείται διακομιστής μοναδικοÏ-χÏήστη (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "ΤεÏματίστε το διακομιστή μοναδικοÏ-χÏήστη και Ï€Ïοσπαθήστε ξανά.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: παλεά διαδικασία διακομιστή (PID: %d) φαίνεται να έχει χαθεί\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "εκκίνηση του διακομιστή οÏτως ή άλλως\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: δεν είναι δυνατή η επαναφόÏτωση του διακομιστή· εκτελείται διακομιστής μοναδικοÏ-χÏήστη (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος επαναφόÏτωσης (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "στάλθηκε σήμα στον διακομιστή\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: δεν είναι δυνατή η Ï€Ïοβίβαση του διακομιστή· εκτελείται διακομιστής μοναδικοÏ-χÏήστη (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: δεν είναι δυνατή η Ï€Ïοβίβαση του διακομιστή· ο διακομιστής δεν βÏίσκεται σε κατάσταση αναμονής\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η δημιουÏγία του αÏχείου σήματος Ï€ÏÎ¿Î²Î¹Î²Î±ÏƒÎ¼Î¿Ï Â«%s»: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η εγγÏαφή του αÏχείου σήματος Ï€ÏÎ¿Î²Î¹Î²Î±ÏƒÎ¼Î¿Ï Â«%s»: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος Ï€ÏÎ¿Î²Î¹Î²Î±ÏƒÎ¼Î¿Ï (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η κατάÏγηση του αÏχείου σήματος Ï€ÏÎ¿Î²Î¹Î²Î±ÏƒÎ¼Î¿Ï Â«%s»: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "αναμονή για την Ï€Ïοβίβαση του διακομιστή..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "ο διακομιστής Ï€Ïοβιβάστηκε\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: ο διακομιστής δεν Ï€Ïοβιβάστηκε εγκαίÏως\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "Ï€Ïοβίβαση διακομιστή\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: δεν είναι δυνατή η πεÏιστÏοφή του αÏχείου καταγÏαφής· εκτελείται διακομιστής μοναδικοÏ-χÏήστη (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η δημιουÏγία αÏχείου σήματος πεÏιστÏοφής αÏχείου καταγÏαφής «%s»: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η εγγÏαφή του αÏχείου σήματος πεÏιστÏοφής αÏχείου καταγÏαφής «%s»: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος πεÏιστÏοφής αÏχείου καταγÏαφής (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: δεν ήταν δυνατή η κατάÏγηση του αÏχείου σήματος πεÏιστÏοφής αÏχείου καταγÏαφής «%s»: %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "ο διακομιστής έλαβε σήμα για την πεÏιστÏοφή του αÏχείου καταγÏαφής\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: εκτελείται διακομιστής μοναδικοÏ-χÏήστη (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: εκτελείται διακομιστής (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: δεν εκτελείται κανένας διακομιστής\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: δεν ήταν δυνατή η αποστολή %d σήματος (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: δεν ήταν δυνατή η εÏÏεση του ιδίου εκτελέσιμου Ï€ÏογÏάμματος\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: δεν ήταν δυνατή η εÏÏεση του εκτελέσιμου Ï€ÏογÏάμματος postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα του διαχειÏιστή υπηÏεσιών\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: η υπηÏεσία «%s» έχει ήδη καταχωÏηθεί\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η καταχώÏηση της υπηÏεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: η υπηÏεσία «%s» δεν έχει καταχωÏηθεί\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα της υπηÏεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η διαγÏαφή καταχώÏησης της υπηÏεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Αναμονή για εκκίνηση διακομιστή...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Λήξη χÏÎ¿Î½Î¹ÎºÎ¿Ï Î¿Ïίου αναμονής για εκκίνηση διακομιστή\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Ο διακομιστής ξεκίνησε και αποδέχτηκε συνδέσεις\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η εκκίνηση της υπηÏεσίας «%s»: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατό το άνοιγμα διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η εκχώÏηση SIDs: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η δημιουÏγία πεÏιοÏισμένου διακÏιτικοÏ: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η ανάκτηση LUIDs για δικαιώματα: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: δεν ήταν δυνατή η ανάκτηση πληÏοφοÏιών διακÏιτικοÏ: κωδικός σφάλματος %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: έλλειψη μνήμης\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s είναι ένα βοηθητικό Ï€ÏόγÏαμμα για την αÏχικοποίηση, την εκκίνηση, τη διακοπή ή τον έλεγχο ενός διακομιστή PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_ctl.c:1968
+#, 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:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+"\n"
+
+#: pg_ctl.c:1971
+#, 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"
+"\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1976
+#, 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:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %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:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Κοινές επιλογές:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " [-D, --pgdata=]DATADIR τοποθεσία για τη πεÏιοχή αποθήκευσης της βάσης δεδομένων\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE πηγή Ï€Ïοέλευσης συμβάντων για καταγÏαφή κατά την εκτέλεση ως υπηÏεσία\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent εκτÏπωση μόνο σφαλμάτων, χωÏίς ενημεÏωτικά μηνÏματα\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS δευτεÏόλεπτα αναμονής κατά τη χÏήση της επιλογής -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait πεÏίμενε μέχÏι να ολοκληÏωθεί η λειτουÏγία (Ï€Ïοεπιλογή)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait να μην πεÏιμένει μέχÏι να ολοκληÏωθεί η λειτουÏγία\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Εάν παÏαλειφθεί η επιλογή -D, χÏησιμοποιείται η μεταβλητή πεÏιβάλλοντος PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Επιλογές για έναÏξη ή επανεκκίνηση:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files επίτÏεψε στην postgres να παÏάγει αÏχεία αποτÏπωσης μνήμης\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files ανεφάÏμοστο σε αυτήν την πλατφόÏμα\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILENAME ενέγÏαψε (ή Ï€ÏοσάÏτησε) το αÏχείο καταγÏαφής διακομιστή στο FILENAME\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS επιλογές γÏαμμής εντολών που θα διαβιστοÏν στη postgres\n"
+" (εκτελέσιμο αÏχείο διακομιστή PostgreSQL) ή initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES κανονικά δεν είναι απαÏαίτητο\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Επιλογές διακοπής ή επανεκκίνησης:\n"
+
+#: pg_ctl.c:2009
+#, 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:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Οι λειτουÏγίες τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î»ÎµÎ¹Ï„Î¿Ï…Ïγίας είναι:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart διάκοψε μετά την αποσÏνδεση όλων των πελατών\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast διάκοψε απευθείας, με σωστό τεÏματισμό (Ï€Ïοεπιλογή)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate διάκοψε άμεσα χωÏίς πλήÏη τεÏματισμό· Θα οδηγήσει σε αποκατάσταση κατά την επανεκκίνηση\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"ΕπιτÏεπόμενα ονόματα σημάτων για θανάτωση:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Επιλογές καταχώÏησης και διαγÏαφής καταχώÏησης:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME όνομα υπηÏεσίας με το οποίο θα καταχωÏηθεί ο διακομιστής PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD κωδικός Ï€Ïόσβασης του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î³Î¹Î± την καταγÏαφή του διακομιστή PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME όνομα χÏήστη του λογαÏÎ¹Î±ÏƒÎ¼Î¿Ï Î³Î¹Î± την καταγÏαφή του διακομιστή PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE Ï„Ïπος έναÏξης υπηÏεσίας για την καταχώÏηση διακομιστή PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Οι Ï„Ïποι έναÏξης είναι:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto αυτόματη εκκίνηση της υπηÏεσίας κατά την εκκίνηση του συστήματος (Ï€Ïοεπιλογή)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand έναÏξη υπηÏεσίας κατ' απαίτηση\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: μη αναγνωÏισμένη λειτουÏγία τεÏÎ¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î»ÎµÎ¹Ï„Î¿Ï…Ïγίας «%s»\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: μη αναγνωÏισμένο όνομα σήματος «%s»\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: μη αναγνωÏίσιμος Ï„Ïπος έναÏξης «%s»\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός του καταλόγου δεδομένων με χÏήση της εντολής «%s»\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: το αÏχείο ελέγχου φαίνεται να είναι αλλοιωμένο\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: δεν είναι δυνατή η εκτέλεση ως υπεÏχÏήστης\n"
+"Συνδεθείτε (χÏησιμοποιώντας, Ï€.χ. \"su\") ως (μη Ï€ÏονομιοÏχο) χÏήστη που θα\n"
+"να είναι στην κατοχή της η διαδικασία διακομιστή.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: επιλογή -S δεν υποστηÏίζεται σε αυτήν την πλατφόÏμα\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: λείπουν παÏάμετÏοι για τη λειτουÏγία kill\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: μη αναγνωÏισμένη λειτουÏγία «%s»\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: δεν καθοÏίστηκε καμία λειτουÏγία\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: δεν έχει καθοÏιστεί κατάλογος βάσης δεδομένων και δεν έχει καθοÏιστεί μεταβλητή πεÏιβάλλοντος PGDATA\n"
+
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον\n"
+#~ "ίδιο κατάλογο με το «%s».\n"
+#~ "Ελέγξτε την εγκατάστασή σας.\n"
+
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το \"%s\"\n"
+#~ "αλλά δεν ήταν στην ίδια έκδοση με %s.\n"
+#~ "Ελέγξτε την εγκατάστασή σας.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "WARNING: Η λειτουÏγία δημιουÏγίας αντιγÏάφων ασφαλείας σε απευθείας σÏνδεση είναι ενεÏγή\n"
+#~ "Ο τεÏματισμός λειτουÏγίας δεν θα ολοκληÏωθεί μέχÏι να κληθεί pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
diff --git a/src/bin/pg_ctl/po/es.po b/src/bin/pg_ctl/po/es.po
new file mode 100644
index 0000000..ea82807
--- /dev/null
+++ b/src/bin/pg_ctl/po/es.po
@@ -0,0 +1,862 @@
+# Spanish translation of pg_ctl.
+#
+# Copyright (c) 2004-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2013
+# Martín Marqués <martin@2ndquadrant.com>, 2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:18+0000\n"
+"PO-Revision-Date: 2023-05-22 12:05+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binario «%s» no válido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "no se pudo leer el binario «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "no se pudo obtener el directorio de trabajo actual: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: el directorio «%s» no existe\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: no se pudo acceder al directorio «%s»: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: el directorio «%s» no es un directorio de base de datos\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: no se pudo abrir el archivo de PID «%s»: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: el archivo de PID «%s» está vacío\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: datos no válidos en archivo de PID «%s»\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: no se pudo iniciar el servidor: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: no se pudo iniciar el servidor debido a falla en setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: no se pudo abrir el archivo de log «%s»: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: no se pudo iniciar el servidor: código de error %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s: no se puede establecer el límite de archivos de volcado;\n"
+"impedido por un límite duro\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: no se pudo leer el archivo «%s»\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: archivo de opciones «%s» debe tener exactamente una línea\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: falló la señal de detención (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "el programa «%s» es requerido por %s, pero no fue encontrado en el mismo directorio que «%s»\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: falló la creación de la base de datos\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: otro servidor puede estar en ejecución; tratando de iniciarlo de todas formas.\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "esperando que el servidor se inicie..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " listo\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "servidor iniciado\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " abandonando la espera\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: el servidor no inició a tiempo\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: no se pudo iniciar el servidor.\n"
+"Examine el registro del servidor.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "servidor iniciándose\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: el archivo de PID «%s» no existe\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "¿Está el servidor en ejecución?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: no se puede detener el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "servidor deteniéndose\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "esperando que el servidor se detenga..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " falló\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: el servidor no se detiene\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"SUGERENCIA: La opción «-m fast» desconecta las sesiones inmediatamente\n"
+"en lugar de esperar que cada sesión finalice por sí misma.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "servidor detenido\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "intentando iniciae el servidor de todas maneras\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: no se puede reiniciar el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Por favor termine el servidor mono-usuario e intente nuevamente.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: el proceso servidor antiguo (PID: %d) parece no estar\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "iniciando el servidor de todas maneras\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: no se puede recargar el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: la señal de recarga falló (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "se ha enviado una señal al servidor\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: no se puede promover el servidor;\n"
+"un servidor en modo mono-usuario está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr ""
+"%s: no se puede promover el servidor;\n"
+"el servidor no está en modo «standby»\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: no se pudo crear el archivo de señal de promoción «%s»: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: no se pudo escribir al archivo de señal de promoción «%s»: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: no se pudo enviar la señal de promoción (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: no se pudo eliminar el archivo de señal de promoción «%s»: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "esperando que el servidor se promueva..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "servidor promovido\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: el servidor no se promovió a tiempo\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "servidor promoviendo\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: no se puede rotar el archivo de log; un servidor en modo mono-usuario está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: no se pudo crear el archivo de señal de rotación de log «%s»: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: no se pudo escribir al archivo de señal de rotación de log «%s»: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: no se pudo enviar la señal de rotación de log (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: no se pudo eliminar el archivo de señal de rotación de log «%s»: %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "se ha enviado una señal de rotación de log al servidor\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: un servidor en modo mono-usuario está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: el servidor está en ejecución (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: no hay servidor en ejecución\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: no se pudo enviar la señal %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable propio\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: no se pudo encontrar el ejecutable postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: no se pudo abrir el gestor de servicios\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: el servicio «%s» ya está registrado\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo registrar el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: el servicio «%s» no ha sido registrado\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo abrir el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo dar de baja el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Esperando que el servidor se inicie...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Se agotó el tiempo de espera al inicio del servidor\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Servidor iniciado y aceptando conexiones\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: no se pudo iniciar el servicio «%s»: código de error %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: no se pudo abrir el token de proceso: código de error %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: no se pudo emplazar los SIDs: código de error %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: no se pudo crear el token restringido: código de error %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: no se pudo obtener LUIDs para privilegios: código de error %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: no se pudo obtener información de token: código de error %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: memoria agotada\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Use «%s --help» para obtener más información.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s es un programa para inicializar, iniciar, detener o controlar\n"
+"un servidor PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATADIR] [-s] [-o OPCIONES]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l ARCHIVO] [-W] [-t SEGS] [-s]\n"
+" [-o OPCIONES] [-p RUTA] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATADIR] [-m MODO-DETENCIÓN] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m MODO-DETENCIÓN] [-W] [-t SEGS] [-s]\n"
+" [-o OPCIONES]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATADIR] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NOMBRE-SEÑAL ID-DE-PROCESO\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATADIR] [-N SERVICIO] [-U USUARIO] [-P PASSWORD]\n"
+" [-S TIPO-INICIO] [-e ORIGEN] [-W] [-t SEGS] [-o OPCIONES]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICIO]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opciones comunes:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata DATADIR ubicación del área de almacenamiento de datos\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ORIGEN origen para el log de eventos cuando se ejecuta como servicio\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent mostrar sólo errores, no mensajes de información\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEGS segundos a esperar cuando se use la opción -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait esperar hasta que la operación se haya completado (por omisión)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait no esperar hasta que la operación se haya completado\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Si la opción -D es omitida, se usa la variable de ambiente PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opciones para inicio y reinicio:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr ""
+" -c, --core-files permite que postgres produzca archivos\n"
+" de volcado (core)\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files no aplicable en esta plataforma\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l --log=ARCHIVO guardar el registro del servidor en ARCHIVO.\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPCIONES parámetros de línea de órdenes a pasar a postgres\n"
+" (ejecutable del servidor de PostgreSQL) o initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p RUTA-A-POSTGRES normalmente no es necesario\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opciones para detener o reiniciar:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODO puede ser «smart», «fast» o «immediate»\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Modos de detención son:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart salir después que todos los clientes se hayan desconectado\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast salir directamente, con apagado apropiado (por omisión)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate salir sin apagado completo; se ejecutará recuperación\n"
+" en el próximo inicio\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Nombres de señales permitidos para kill:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opciones para registrar y dar de baja:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr ""
+" -N SERVICIO nombre de servicio con el cual registrar\n"
+" el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P CONTRASEÑA contraseña de la cuenta con la cual registrar\n"
+" el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U USUARIO nombre de usuario de la cuenta con la cual\n"
+" registrar el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr ""
+" -S TIPO-INICIO tipo de inicio de servicio con que registrar\n"
+" el servidor PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Tipos de inicio del servicio son:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto iniciar automáticamente al inicio del sistema (por omisión)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand iniciar el servicio en demanda\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: modo de apagado «%s» no reconocido\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nombre de señal «%s» no reconocido\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: tipo de inicio «%s» no reconocido\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: no se pudo determinar el directorio de datos usando la orden «%s»\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: el archivo de control parece estar corrupto\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: no puede ser ejecutado como «root»\n"
+"Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado,\n"
+"quien ejecutará el proceso servidor.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: la opción -S no está soportada en esta plataforma\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: demasiados argumentos de línea de órdenes (el primero es «%s»)\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: argumentos faltantes para envío de señal\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: modo de operación «%s» no reconocido\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: no se especificó operación\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: no se especificó directorio de datos y la variable PGDATA no está definida\n"
diff --git a/src/bin/pg_ctl/po/fr.po b/src/bin/pg_ctl/po/fr.po
new file mode 100644
index 0000000..f5d95cd
--- /dev/null
+++ b/src/bin/pg_ctl/po/fr.po
@@ -0,0 +1,1013 @@
+# LANGUAGE message translation file for pg_ctl
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:18+0000\n"
+"PO-Revision-Date: 2023-07-29 22:45+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binaire « %s » invalide : %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "n'a pas pu lire le binaire « %s » : %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "n'a pas pu obtenir le répertoire de travail : %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s : le répertoire « %s » n'existe pas\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s : le répertoire « %s » n'est pas un répertoire d'instance\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s : n'a pas pu ouvrir le fichier de PID « %s » : %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s : le fichier PID « %s » est vide\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s : données invalides dans le fichier de PID « %s »\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s : n'a pas pu démarrer le serveur : %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s : n'a pas pu démarrer le serveur à cause d'un échec de setsid() : %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s : n'a pas pu démarrer le serveur : code d'erreur %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s : n'a pas pu initialiser la taille des fichiers core, ceci est interdit\n"
+"par une limite dure\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s : n'a pas pu lire le fichier « %s »\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s : le fichier d'options « %s » ne doit comporter qu'une seule ligne\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal d'arrêt (PID : %d) : %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s : l'initialisation du système a échoué\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr ""
+"%s : un autre serveur semble en cours d'exécution ; le démarrage du serveur\n"
+"va toutefois être tenté\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "en attente du démarrage du serveur..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " effectué\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "serveur démarré\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " attente arrêtée\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s : le serveur ne s'est pas lancé à temps\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s : n'a pas pu démarrer le serveur\n"
+"Examinez le journal applicatif.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "serveur en cours de démarrage\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s : le fichier de PID « %s » n'existe pas\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Le serveur est-il en cours d'exécution ?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s : ne peut pas arrêter le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "serveur en cours d'arrêt\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "en attente de l'arrêt du serveur..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " a échoué\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s : le serveur ne s'est pas arrêté\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"ASTUCE : l'option « -m fast » déconnecte immédiatement les sessions plutôt que\n"
+"d'attendre la déconnexion des sessions déjà présentes.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "serveur arrêté\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "tentative de lancement du serveur malgré tout\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s : ne peut pas relancer le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Merci d'arrêter le serveur mono-utilisateur et de réessayer.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s : l'ancien processus serveur (PID : %d) semble être parti\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "lancement du serveur malgré tout\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s : ne peut pas recharger le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal de rechargement (PID : %d) : %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "envoi d'un signal au serveur\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s : ne peut pas promouvoir le serveur ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s : ne peut pas promouvoir le serveur ; le serveur n'est pas en standby\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu créer le fichier « %s » signalant la promotion : %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu écrire le fichier « %s » signalant la promotion : %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal de promotion (PID : %d) : %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la promotion : %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "en attente du serveur à promouvoir..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "serveur promu\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s : le serveur ne s'est pas promu à temps\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "serveur en cours de promotion\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s : ne peut pas faire une rotation de fichier de traces ; le serveur mono-utilisateur est en\n"
+"cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu créer le fichier « %s » de demande de rotation des fichiers de trace : %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu écrire le fichier « %s » de demande de rotation des fichiers de trace : %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal de rotation des fichiers de trace (PID : %d) : %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la demande de rotation des fichiers de trace : %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "envoi d'un signal au serveur pour faire une rotation des traces\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s : le serveur mono-utilisateur est en cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s : le serveur est en cours d'exécution (PID : %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s : aucun serveur en cours d'exécution\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s : n'a pas pu envoyer le signal %d (PID : %d) : %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s : n'a pas pu trouver l'exécutable postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s : n'a pas pu ouvrir le gestionnaire de services\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s : le service « %s » est déjà enregistré\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu enregistrer le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s : le service « %s » n'est pas enregistré\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu ouvrir le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu supprimer le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "En attente du démarrage du serveur...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Dépassement du délai pour le démarrage du serveur\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Serveur lancé et acceptant les connexions\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s : n'a pas pu démarrer le service « %s » : code d'erreur %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s : n'a pas pu obtenir les LUID pour les droits : code d'erreur %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s : n'a pas pu obtenir l'information sur le jeton : code d'erreur %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s : mémoire épuisée\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s est un outil pour initialiser, démarrer, arrêter et contrôler un serveur\n"
+"PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D RÉP_DONNÉES] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D RÉP_DONNÉES] [-l FICHIER] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p CHEMIN] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D RÉP_DONNÉES]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D RÉP_DONNÉES] [-W] [-t SECS] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D RÉP_DONNÉES] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NOM_SIGNAL PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D RÉP_DONNÉES] [-N NOM_SERVICE] [-U NOM_UTILISATEUR] [-P MOT_DE_PASSE]\n"
+" [-S TYPE_DÉMARRAGE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N NOM_SERVICE]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Options générales :\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=RÉP_DONNÉES emplacement du répertoire des données de l'instance\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e SOURCE source de l'événement pour la trace lors de\n"
+" l'exécution en tant que service\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent affiche uniquement les erreurs, aucun message\n"
+" d'informations\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr ""
+" -t, --timeout=SECS durée en secondes à attendre lors de l'utilisation\n"
+" de l'option -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait attend la fin de l'opération (par défaut)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait n'attend pas la fin de l'opération\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Si l'option -D est omise, la variable d'environnement PGDATA est utilisée.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Options pour le démarrage ou le redémarrage :\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files autorise postgres à produire des fichiers core\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files non applicable à cette plateforme\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FICHIER écrit (ou ajoute) le journal du serveur dans FICHIER\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS options de la ligne de commande à passer à\n"
+" postgres (exécutable du serveur PostgreSQL)\n"
+" ou à initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p CHEMIN_POSTGRES normalement pas nécessaire\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Options pour l'arrêt ou le redémarrage :\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m, --mode=MODE MODE peut valoir « smart », « fast » ou\n"
+" « immediate »\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Les modes d'arrêt sont :\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart quitte après déconnexion de tous les clients\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast quitte directement, et arrête correctement (par défaut)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate quitte sans arrêt complet ; entraîne une restauration au démarrage\n"
+" suivant\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Signaux autorisés pour kill :\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Options d'enregistrement ou de dés-enregistrement :\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr ""
+" -N NOM_SERVICE nom du service utilisé pour l'enregistrement du\n"
+" serveur PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P MOT_DE_PASSE mot de passe du compte utilisé pour\n"
+" l'enregistrement du serveur PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U NOM_UTILISATEUR nom de l'utilisateur du compte utilisé pour\n"
+" l'enregistrement du serveur PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr ""
+" -S TYPE_DÉMARRAGE type de démarrage du service pour enregistrer le\n"
+" serveur PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Les types de démarrage sont :\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto démarre le service automatiquement lors du démarrage du système\n"
+" (par défaut)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand démarre le service à la demande\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s : mode d'arrêt non reconnu « %s »\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s : signal non reconnu « %s »\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s : type de redémarrage « %s » non reconnu\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s : n'a pas déterminer le répertoire des données en utilisant la commande « %s »\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s : le fichier de contrôle semble corrompu\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s : ne peut pas être exécuté en tant qu'utilisateur root\n"
+"Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non\n"
+" privilégié) qui sera propriétaire du processus serveur.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s : option -S non supportée sur cette plateforme\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s : arguments manquant pour le mode kill\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s : mode d'opération « %s » non reconnu\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s : aucune opération indiquée\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr ""
+"%s : aucun répertoire de bases de données indiqué et variable\n"
+"d'environnement PGDATA non initialisée\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s : l'option -w ne peut pas utiliser un chemin relatif vers le répertoire de\n"
+#~ "la socket\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s : l'option -w n'est pas supportée lors du démarrage d'un serveur pré-9.1\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: this data directory appears to be running a pre-existing postmaster\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s : ce répertoire des données semble être utilisé par un postmaster déjà existant\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for stop, restart, or promote:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Options pour l'arrêt, le redémarrage ou la promotion :\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr ""
+#~ " %s start [-w] [-t SECS] [-D RÉP_DONNÉES] [-s] [-l NOM_FICHIER]\n"
+#~ " [-o \"OPTIONS\"]\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid ""
+#~ "%s is a utility to start, stop, restart, reload configuration files,\n"
+#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s est un outil qui permet de démarrer, arrêter, redémarrer, recharger les\n"
+#~ "les fichiers de configuration, rapporter le statut d'un serveur PostgreSQL\n"
+#~ "ou d'envoyer un signal à un processus PostgreSQL\n"
+#~ "\n"
+
+#~ msgid "%s: could not create log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier de traces « %s » : %s\n"
+
+#~ msgid "%s: could not open process token: %lu\n"
+#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : %lu\n"
+
+#~ msgid "%s: could not start server: exit code was %d\n"
+#~ msgstr "%s : n'a pas pu démarrer le serveur : le code de sortie est %d\n"
+
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s : n'a pas pu attendre le serveur à cause d'une mauvaise configuration\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Le comportement par défaut attend l'arrêt, pas le démarrage ou le\n"
+#~ "redémarrage.)\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n"
+#~ "dans le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation.\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « %s » a été trouvé par « %s »\n"
+#~ "mais n'est pas de la même version que %s.\n"
+#~ "Vérifiez votre installation.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ATTENTION : le mode de sauvegarde en ligne est activé.\n"
+#~ "L'arrêt ne surviendra qu'au moment où pg_stop_backup() sera appelé.\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "le serveur est toujours en cours de démarrage\n"
diff --git a/src/bin/pg_ctl/po/he.po b/src/bin/pg_ctl/po/he.po
new file mode 100644
index 0000000..420e2f2
--- /dev/null
+++ b/src/bin/pg_ctl/po/he.po
@@ -0,0 +1,884 @@
+# Hebrew message translation file for pg_ctl
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldbrg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-15 03:45+0000\n"
+"PO-Revision-Date: 2017-05-16 18:13+0300\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Last-Translator: Michael Goldberg <mic.goldbrg@gmail.com>, 2017.\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.0.2\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "×œ× ×™×•×›×œ לזהות ×ת הספריה הנוכחית: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "בינ×רי ×œ× ×—×•×§×™ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×‘×™× ×רי \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× \"%s\" לביצוע"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "×œ× ×œ×©× ×•×ª לשנות ספריות ל \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת הקישור הסימבולי \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "נכשלpclose : %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../port/path.c:632 ../../port/path.c:670
+#: ../../port/path.c:687
+#, c-format
+msgid "out of memory\n"
+msgstr "×ין זיכרון פנוי\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "×œ× × ×™×ª×Ÿ לשכפל מצביע ריק (שגי××” פנימית)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "×œ× × ×™×ª×Ÿ לבצע ×ת הפקודה"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "הפקודה ×œ× × ×ž×¦××”"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי חריגה 0 0x %X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× ×ž×¦×‘ ×œ× ×ž×–×•×”×” %d"
+
+#: ../../port/path.c:654
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לקבל ×ת ספריית עבודה נוכחית: %s\n"
+
+#: pg_ctl.c:251
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "תכנית %s: הספרייה '%s' ××™× ×” קיימת\n"
+
+#: pg_ctl.c:254
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לגשת לתיקייה \"%s\": %s\n"
+
+#: pg_ctl.c:268
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "תכנית %s: ספרייה \"%s\" ×”×™× ×œ× ×¡×¤×¨×™×™×ª ×”×שכול של מסד נתוני×\n"
+
+#: pg_ctl.c:281
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח קובץ PID \"%s\": %s\n"
+
+#: pg_ctl.c:290
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "תכנית %s: קובץ PID \"%s\" הינו ריק\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "תכנית %s: × ×ª×•× ×™× ×œ× ×—×•×§×™×™× ×‘×§×•×‘×¥ PID \"%s\"\n"
+
+#: pg_ctl.c:443 pg_ctl.c:471
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להפעיל שרת: %s\n"
+
+#: pg_ctl.c:495
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להפעיל שרת: קוד שגי××” %lu\n"
+
+#: pg_ctl.c:572
+#, c-format
+msgid ""
+"\n"
+"%s: -w option is not supported when starting a pre-9.1 server\n"
+msgstr ""
+"\n"
+"תכנית %s: ×ופציה -w ××™× ×” נתמכת בעת הפעלת שרת טרו×-9.1\n"
+
+#: pg_ctl.c:637
+#, c-format
+msgid ""
+"\n"
+"%s: -w option cannot use a relative socket directory specification\n"
+msgstr ""
+"\n"
+"תכנית %s: ×ופציה -w ×œ× ×™×›×•×œ×” להשתמש במפרט ספריית שקע היחסי\n"
+
+#: pg_ctl.c:739
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "תכנית %s: ×ין ×פשרות להגדיר ×ת מגבלת הגודל של קובץ הליבה; הן ×סורה על פי מגבלה קשיחה\n"
+
+#: pg_ctl.c:764
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×§×•×‘×¥ \"%s\"\n"
+
+#: pg_ctl.c:769
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "תכנית %s: בקובץ ×”×ופציות \"%s\" חייב להיות קו ×חד בדיוק\n"
+
+#: pg_ctl.c:820
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"התוכנית \"%s\" נדרש על-ידי %s ×בל ×œ× × ×ž×¦×\n"
+"ב×ותה ספריה כמו \"%s\".\n"
+"בדוק ×ת ההתקנה.\n"
+
+#: pg_ctl.c:826
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"התוכנית \"%s\" נמצ××” על ידי \"%s\"\n"
+"×בל היתה ×œ× ×ž×’×™×¨×¡×” ×–×”×” ×‘×©× %s.\n"
+"×•×“× ×”×”×ª×§× ×” שלך.\n"
+
+#: pg_ctl.c:859
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "תכנית %s: ×תחול מסד × ×ª×•× ×™× ×ž×¢×¨×›×ª נכשל\n"
+
+#: pg_ctl.c:874
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "תכנית %s: ייתכן והשרת ×חר פוע; מנסה להפעיל שרת בכל מקרה\n"
+
+#: pg_ctl.c:912
+msgid "waiting for server to start..."
+msgstr "מחכה להפעלת השרת..."
+
+#: pg_ctl.c:917 pg_ctl.c:1024 pg_ctl.c:1115 pg_ctl.c:1244
+msgid " done\n"
+msgstr " בוצע\n"
+
+#: pg_ctl.c:918
+msgid "server started\n"
+msgstr "השרת עלה\n"
+
+#: pg_ctl.c:921 pg_ctl.c:925 pg_ctl.c:1249
+msgid " stopped waiting\n"
+msgstr " הפסיק לחכות\n"
+
+#: pg_ctl.c:922
+msgid "server is still starting up\n"
+msgstr "השרת עדיין עולה\n"
+
+#: pg_ctl.c:926
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"תכנית %s: ×œ× ×”×™×ª×” ×פשרות להפעיל שרת\n"
+"יש לבחון בפלט יומן.\n"
+
+#: pg_ctl.c:932 pg_ctl.c:1016 pg_ctl.c:1106
+msgid " failed\n"
+msgstr " נכשל\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: could not wait for server because of misconfiguration\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לחכות ל שרת בגלל בתצורה שגויה\n"
+
+#: pg_ctl.c:939
+msgid "server starting\n"
+msgstr "שרת עולה\n"
+
+#: pg_ctl.c:960 pg_ctl.c:1046 pg_ctl.c:1136 pg_ctl.c:1175
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "תכנית %s: הקובץ '%s' ×ינו קיי×\n"
+
+#: pg_ctl.c:961 pg_ctl.c:1048 pg_ctl.c:1137 pg_ctl.c:1176
+msgid "Is server running?\n"
+msgstr "×”×× ×”×©×¨×ª פועל?\n"
+
+#: pg_ctl.c:967
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ להפסיק ×ת השרת; מופעל שרת למשתמש יחיד (PID: %ld)\n"
+
+#: pg_ctl.c:975 pg_ctl.c:1070
+#, c-format
+msgid "%s: could not send stop signal (PID: %ld): %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח ×ות עצירה (PID: %ld): %s\n"
+
+#: pg_ctl.c:982
+msgid "server shutting down\n"
+msgstr "תהליך כיבוי השרת\n"
+
+#: pg_ctl.c:997 pg_ctl.c:1085
+msgid ""
+"WARNING: online backup mode is active\n"
+"Shutdown will not complete until pg_stop_backup() is called.\n"
+"\n"
+msgstr ""
+"×זהרה: מצב גיבוי מקוון פעיל\n"
+"הכיבוי ×œ× ×™×•×©×œ× ×¢×“ ש pg_stop_backup() נקר×.\n"
+"\n"
+
+#: pg_ctl.c:1001 pg_ctl.c:1089
+msgid "waiting for server to shut down..."
+msgstr "מחכה שהשרת יכובה..."
+
+#: pg_ctl.c:1018 pg_ctl.c:1108
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "תכנית %s: השרת ×ינו נכבה\n"
+
+#: pg_ctl.c:1020 pg_ctl.c:1110
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"רמז: ×ופציה \"-m fast\" מנתקת מיידי ×ת הפעלות\n"
+"×•×œ× ×ž×—×›×•×ª לניתוק ×”×ž×•×¤×¢×œ×™× ×‘×מצעות הפעלה.\n"
+
+#: pg_ctl.c:1026 pg_ctl.c:1116
+msgid "server stopped\n"
+msgstr "השרת הופסק\n"
+
+#: pg_ctl.c:1049 pg_ctl.c:1122
+msgid "starting server anyway\n"
+msgstr "מ×תחל לשרת בכל מקרה\n"
+
+#: pg_ctl.c:1058
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להפעיל מחדש ×ת השרת; מופעל שרת למשתמש יחיד (PID: %ld)\n"
+
+#: pg_ctl.c:1061 pg_ctl.c:1146
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "×× × ×›×‘×” ×ת שרת המשתמש היחיד ונסה שוב\n"
+
+#: pg_ctl.c:1120
+#, c-format
+msgid "%s: old server process (PID: %ld) seems to be gone\n"
+msgstr "תכנית %s: תהליך השרת הישן (PID: %ld) כנר××” פועל\n"
+
+#: pg_ctl.c:1143
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להפעיל מחדש ×ת השרת; מופעל שרת למשתמש יחיד (PID: %ld)\n"
+
+#: pg_ctl.c:1152
+#, c-format
+msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח ×ות להפעלה מחדש (PID: %ld): %s\n"
+
+#: pg_ctl.c:1157
+msgid "server signaled\n"
+msgstr "שרת ×יתת\n"
+
+#: pg_ctl.c:1182
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ×œ×§×“× ×©×¨×ª; מופעל שרת למשתמש יחיד (PID: %ld)\n"
+
+#: pg_ctl.c:1190
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ ×œ×§×“× ×©×¨×ª; שרת ×ינו במצב המתנה\n"
+
+#: pg_ctl.c:1205
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ליצור קובץ ×”×ות ×œ×§×™×“×•× \"%s\": %s\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×ž×¦×œ×™×— לכתוב לקובץ ×”×ות ×œ×§×™×“×•× \"%s\": %s\n"
+
+#: pg_ctl.c:1219
+#, c-format
+msgid "%s: could not send promote signal (PID: %ld): %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח ×ת ×”×ות לקד×(PID: %ld): %s\n"
+
+#: pg_ctl.c:1222
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: ×œ× ×”×™×ª×” ×פשרות להסיר ×ת קובץ ×”×ות ×œ×§×™×“×•× \"%s\": %s\n"
+
+#: pg_ctl.c:1231
+msgid "waiting for server to promote..."
+msgstr "מחכה שהשרת יקוד×..."
+
+#: pg_ctl.c:1245
+msgid "server promoted\n"
+msgstr "שרת קוד×\n"
+
+#: pg_ctl.c:1250
+msgid "server is still promoting\n"
+msgstr "השרת עדיין מקוד×\n"
+
+#: pg_ctl.c:1254
+msgid "server promoting\n"
+msgstr "שרת בקידו×\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: single-user server is running (PID: %ld)\n"
+msgstr "תכנית %s: שרת משתמש יחיד פועל (PID: %ld)\n"
+
+#: pg_ctl.c:1314
+#, c-format
+msgid "%s: server is running (PID: %ld)\n"
+msgstr "תכנית %s: שרת פועל (PID: %ld)\n"
+
+#: pg_ctl.c:1330
+#, c-format
+msgid "%s: no server running\n"
+msgstr "תכנית %s: ×ין ×©×¨×ª×™× ×¤×¢×™×œ×™×\n"
+
+#: pg_ctl.c:1348
+#, c-format
+msgid "%s: could not send signal %d (PID: %ld): %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לשלוח ×ות %d (PID: %ld): %s\n"
+
+#: pg_ctl.c:1405
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ª×•×›× ×™×ª הפעלה משלו\n"
+
+#: pg_ctl.c:1415
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×ª×•×›× ×™×ª הפעלה postgres\n"
+
+#: pg_ctl.c:1485 pg_ctl.c:1519
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח מנהל השירות\n"
+
+#: pg_ctl.c:1491
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "תכנית %s: שירות '%s' כבר רשו×\n"
+
+#: pg_ctl.c:1502
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "תכנית %s: ×ין ×פשרות ×œ×¨×©×•× ×ת השירות \"%s\": קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1525
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "תכנית %s: שירות '%s' ×ינו רשו×\n"
+
+#: pg_ctl.c:1532
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח שירות '%s': קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1541
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "תכנית %s: ×œ× ×™×›×•×œ לבטל ×ת השירות \"%s\": קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1628
+msgid "Waiting for server startup...\n"
+msgstr "מחכה להפעלת השרת...\n"
+
+#: pg_ctl.c:1631
+msgid "Timed out waiting for server startup\n"
+msgstr "×ª× ×–×ž×Ÿ המתנה להפעלת השרת\n"
+
+#: pg_ctl.c:1635
+msgid "Server started and accepting connections\n"
+msgstr "שרת עלה ומקבל חיבורי×\n"
+
+#: pg_ctl.c:1690
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות להפעיל שירות '%s': קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1764
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "תכנית %s: ×זהרה: ×ין ×פשרות ליצור ×סימוני גישה ×ž×•×’×‘×œ×™× ×‘×¤×œ×˜×¤×•×¨×ž×” זו\n"
+
+#: pg_ctl.c:1777
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לפתוח ×ת התהליך token: קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1791
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להקצות SID: קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1811
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "תכנית %s: ×ין ×פשרות ליצור ×סימוני גישה: קוד שגי××” %lu\n"
+
+#: pg_ctl.c:1842
+#, c-format
+msgid "%s: WARNING: could not locate all job object functions in system API\n"
+msgstr "תכנית %s: ×זהרה: ×œ× ×”×™×ª×” ×פשרות ל×תר כל פונקציות ×”×ובייקט העבודה בממשק API של מערכת\n"
+
+#: pg_ctl.c:1925
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: pg_ctl.c:1933
+#, 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:1934
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: pg_ctl.c:1935
+#, 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:1936
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+
+#: pg_ctl.c:1938
+#, 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:1939
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:1941
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1942
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1943
+#, 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:1944
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:1946
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %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:1948
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:1951
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"×פשרויות נפוצות:\n"
+
+#: pg_ctl.c:1952
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr ""
+" -D\n"
+" --pgdata=DATADIR\n"
+"×ž×™×§×•× ×©×œ ×זור ×חסון מסד נתוני×\n"
+
+#: pg_ctl.c:1954
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e SOURCE\n"
+"מקור ×”×ירוע עבור ×¨×™×©×•× ×‘×¢×ª הפעלת כשירות\n"
+
+#: pg_ctl.c:1956
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s\n"
+" --silent\n"
+"הדפס רק שגי×ות, ×ין הודעות ×ינפורמטיביות\n"
+
+#: pg_ctl.c:1957
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr ""
+" -t\n"
+" --timeout=SECS\n"
+"שניות שיש להמתין בעת שימוש ב×ופציה -w\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V\n"
+" --version\n"
+"להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: pg_ctl.c:1959
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr ""
+" -w\n"
+" --wait\n"
+"חכה עד השלמת פעולת (ברירת מחדל)\n"
+
+#: pg_ctl.c:1960
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr ""
+" -W\n"
+" --no-wait\n"
+"×ל ×—×›×” עד השלמת פעולת\n"
+
+#: pg_ctl.c:1961
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr ""
+" -?\n"
+" --help\n"
+"להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: pg_ctl.c:1962
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "×× ×”×ופציה -D מושמטת, נעשה שימוש במשתנה הסביבה PGDATA.\n"
+
+#: pg_ctl.c:1964
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"×פשרויות עבור ההתחלה ×ו הפעלה מחדש:\n"
+"\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr ""
+" -c\n"
+" --core-files\n"
+"ל×פשר postgres לייצר קובץ הליבה\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr ""
+" -c\n"
+" --core-files\n"
+"×œ× ×™×©×™× ×¢×œ פלטפורמה זו\n"
+
+#: pg_ctl.c:1970
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr ""
+" -l\n"
+" --log=FILENAME\n"
+"כתוב (×ו צרף) יומן שרת ל- FILENAME\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o\n"
+" --options=OPTIONS\n"
+"×פשרויות שורת הפקודה כדי להעביר ל postgres (תכנית ההפעלה של השרת PostgreSQL) ×ו initdb\n"
+
+#: pg_ctl.c:1973
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr ""
+" -p PATH-TO-POSTGRES\n"
+"בדרך כלל ×œ× ×”×›×¨×—×™\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"×פשרויות עבור עצירה ×ו הפעלה מחדש:\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m\n"
+" --mode=MODE\n"
+"ערך MODE יכול להיות \"smart\", \"fast\", ×ו \"immediate\"\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"מצבי כיבוי ×”×:\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr ""
+" smart\n"
+"×¦× ×חרי כל הלקוחות מנותקי×\n"
+
+#: pg_ctl.c:1979
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr ""
+" fast\n"
+"×¦× ×™×©×™×¨×•×ª, ×¢× ×›×™×‘×•×™ תקין (ברירת המחדל)\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate\n"
+"×¦× ×œ×œ× ×›×™×‘×•×™ מל×; תוביל להת×וששות על הפעלה\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"שמות ×ותות ×ž×•×¨×©×™× ×œ×‘×™×¦×•×¢ השבתה של תהליך (kill):\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"×פשרויות להרשמה וביטול רישו×:\n"
+
+#: pg_ctl.c:1987
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr ""
+" -N SERVICENAME\n"
+"×©× ×©×™×¨×•×ª ×שר שרת PostgreSQL ×™×™×¨×©× ×¢×\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P PASSWORD\n"
+"הסיסמה של חשבון ×œ×¨×©×•× ×©×¨×ª PostgreSQL\n"
+
+#: pg_ctl.c:1989
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U USERNAME\n"
+"×©× ×”×ž×©×ª×ž×© של החשבון כדי ×œ×¨×©×•× ×©×¨×ª PostgreSQL\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr ""
+" -S START-TYPE\n"
+"שירות מסוג התחלה ×œ×¨×©×•× ×©×¨×ª PostgreSQL\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"סוגי התחלה ×”×:\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto\n"
+"הפעלת שירות ב×ופן ×וטומטי במהלך הפעלת המערכת (ברירת המחדל)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " demand start service on demand\n"
+msgstr ""
+" demand\n"
+"להתחיל שירות על פי דרישה\n"
+
+#: pg_ctl.c:1997
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "תכנית %s: מצב כיבוי ×œ× ×ž×–×•×”×” \"%s\"\n"
+
+#: pg_ctl.c:2054
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "תכנית %s: ×©× ×ות ×œ× ×ž×–×•×”×” \"%s\"\n"
+
+#: pg_ctl.c:2071
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "תכנית %s: סוג ×תחול ×œ× ×ž×–×•×”×” \"%s\"\n"
+
+#: pg_ctl.c:2126
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות ל×תר ×ת הספרית ×”× ×ª×•× ×™× ×‘×מצעות הפקודה \"%s\"\n"
+
+#: pg_ctl.c:2151
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "תכנית %s: קובץ הבקרה נר××” פגו×\n"
+
+#: pg_ctl.c:2221
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"תכנית %s: ×œ× × ×™×ª×Ÿ להפעיל ×¢\"×™ root\n"
+"× × ×œ×”×™×›× ×¡ (ב×מצעות, למשל, \" su\") כמו המשתמש (×œ×œ× ×”×¨×©×ות)\n"
+"שתהליך השרת יהיה בבעלותו\n"
+
+#: pg_ctl.c:2305
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "תכנית %s: ×ופציה -S ××™× ×” × ×ª×ž×›×™× ×‘×¤×œ×˜×¤×•×¨×ž×” זו\n"
+
+#: pg_ctl.c:2342
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "תכנית %s: יותר מדי ××¨×’×•×ž× ×˜×™× ×©×œ שורת הפקודה (הר×שון ×”×•× \"%s\")\n"
+
+#: pg_ctl.c:2366
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "תכנית %s: ×—×¡×¨×™× ×”××¨×’×•×ž× ×˜×™× ×œ×ž×¦×‘ השבתת התהליך (kill)\n"
+
+#: pg_ctl.c:2384
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "תכנית %s: מצב עבודה ×œ× ×ž×–×•×”×” \"%s\"\n"
+
+#: pg_ctl.c:2394
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "תכנית %s: ×œ× ×¦×•×™× ×” פעולה\n"
+
+#: pg_ctl.c:2415
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "תכנית %s: ×œ× ×¦×•×™× ×” ספריית מסד ×”× ×ª×•× ×™× ×•×ž×©×ª× ×” הסביבה PGDATA ×ינו נקבע\n"
diff --git a/src/bin/pg_ctl/po/it.po b/src/bin/pg_ctl/po/it.po
new file mode 100644
index 0000000..07a0688
--- /dev/null
+++ b/src/bin/pg_ctl/po/it.po
@@ -0,0 +1,863 @@
+#
+# pg_ctl.po
+# Italian message translation file for pg_ctl
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Emanuele Zamprogno <emanuele.zamprogno@itpug.org>, 2010.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-24 03:48+0000\n"
+"PO-Revision-Date: 2023-09-05 08:14+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binario non valido \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "lettura del binario \"%s\" fallita: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:250
+#, fuzzy, c-format
+#| msgid "could not reopen file \"%s\" as stderr: %m"
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "riapertura del file \"%s\" come stderr fallita: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "il processo figlio è stato terminato dal segnale %d: %s\\"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "determinazione della directory corrente fallita: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: la directory \"%s\" non esiste\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: accesso alla directory \"%s\" fallito: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: la directory \"%s\" non è la directory di un cluster di database\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: apertura del file PID \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: il file PID \"%s\" è vuoto\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: dati non validi nel file PID \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: errore di avvio del server: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: impossibile avviare il server a causa di un errore di setid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: apertura del file di log \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: errore di avvio del server: codice dell'errore %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: non è possibile configurare il limite di grandezza dei core file; impedito dall'hard limit\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: lettura del file \"%s\" fallita\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: il file di opzione \"%s\" deve avere esattamente una riga\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: invio del segnale di arresto fallito (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\"\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inizializzazione del sistema di database fallita\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: un altro server potrebbe essere in esecuzione; si sta provando ad avviare il server ugualmente\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "in attesa che il server si avvii..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " fatto\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "il server è stato avviato\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " attesa interrotta\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: il server non è partito nel tempo previsto\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: l'avvio del server è fallito\n"
+"Esamina il log di output.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "il server si sta avviando\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: il file PID \"%s\" non esiste\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Il server è in esecuzione?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: non è possibile fermare il server; il server è in esecuzione in modalità a utente singolo (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "il server è in fase di arresto\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "in attesa dell'arresto del server...."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " fallito\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: il server non si è arrestato\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"NOTA: L'opzione \"-m fast\" disconnette le sessioni immediatamente invece di\n"
+"attendere che siano le sessioni a disconnettersi.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "il server è stato arrestato\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "si sta provando ad avviare il server ugualmente\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: non è possibile riavviare il server; il server è in esecuzione in modalità a utente singolo (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Si prega di terminare il server in modalità utente singolo e di riprovare.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: il vecchio processo del server (PID: %d) sembra non essere più attivo\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "il server si sta avviando comunque\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: non è possibile eseguire il reload del server; il server è in esecuzione in modalità a utente singolo (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: invio segnale di reload fallito (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "segnale inviato al server\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: non è possibile promuovere il server: il server è in esecuzione in modalità a utente singolo (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: non è possibile promuovere il server: il server non è in modalità standby\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: creazione del file di segnale di promozione \"%s\" fallito: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: scrittura del file di segnale di promozione \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: invio del segnale di promozione fallito (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: rimozione del file di segnale di promozione \"%s\" fallita: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "in attesa della promozione del server..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "server promosso\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: il server non è stato promosso nel tempo previsto\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "il server sta venendo promosso\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: impossibile ruotare il file di registro; il server per utente singolo è in esecuzione (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: impossibile creare il file del segnale di rotazione del registro \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: impossibile scrivere il file del segnale di rotazione del registro \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: impossibile inviare il segnale di rotazione del registro (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: impossibile rimuovere il file del segnale di rotazione del registro \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "il server ha segnalato di ruotare il file di registro\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: il server è in esecuzione in modalità a utente singolo (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: il server è in esecuzione (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: nessun server in esecuzione\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: invio del segnale %d fallito (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: il proprio programma eseguibile non è stato trovato\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: il programma eseguibile postgres non è stato trovato\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: apertura del service manager fallita\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: il servizio \"%s\" è già registrato\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: registrazione del servizio \"%s\" fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: il servizio \"%s\" non è registrato\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: apertura del servizio \"%s\" fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: rimozione della registrazione del servizio \"%s\" fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "In attesa che il server si avvii...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Il tempo di attesa per l'avvio del server è scaduto\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Il server è avviato e accetta connessioni\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: non è possibile avviare il servizio \"%s\": codice errore %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: apertura del token di processo fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: allocazione dei SID fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: creazione del token ristretto fallita: codice errore %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: errore nella lettura dei LUID per i privilegi: codice di errore %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: errore nella lettura del token di informazione: codice di errore %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: memoria esaurita\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s è un programma per inizializzare, avviare, fermare o controllare un server PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_ctl.c:1968
+#, 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:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPZIONI] [-p PERCORSO] [-c]\n"
+
+#: pg_ctl.c:1971
+#, 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:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPZIONI] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1976
+#, 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:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %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:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVIZIO]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opzioni comuni:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata DATADIR posizione dell'area di archiviazione del database\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SORGENTE sorgente eventi per il log quando eseguito come servizio\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent mostra solo gli errori, non i messaggi di informazione\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEC secondi da aspettare quando si usa l'opzione -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait aspetta fino al completamento dell'operazione (default)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait non aspettare fino al completamento dell'operazione\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Se l'opzione -D è omessa, viene usata la variabile d'ambiente PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opzioni per l'avvio o il riavvio:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files permette a postgres di produrre core file\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files non disponibile su questa piattaforma\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log NOMEFILE scrivi (o accoda) il log del server in NOMEFILE\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPZIONI opzioni da riga di comando da passare a postgres\n"
+" (programma eseguibile del server PostgreSQL) o initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES normalmente non necessario\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opzioni per l'arresto o il riavvio:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE MODE può essere \"smart\", \"fast\" o \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"I modi di spegnimento sono:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart termina dopo che tutti i client si sono disconnessi\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast termina direttamente, con una corretta procedura di arresto (default)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr ""
+" immediate termina senza un arresto completo: ciò porterà ad un recupero\n"
+" dei dati al riavvio\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Nomi di segnali permessi per kill:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opzioni per register e unregister:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVIZIO nome del servizio con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD password per l'account con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U UTENTE nome utente dell'account con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TIPO-AVVIO tipo di avvio del servizio con cui registrare il server PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"I tipi di avvio sono:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto avvia il servizio automaticamente durante l'avvio del sistema (predefinito)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand avvia il servizio quando richiesto\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: modalità di arresto sconosciuta \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nome del segnale sconosciuto \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: tipo di avvio sconosciuto \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: non è stato possibile determinare la directory dei dati usando il comando \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: il file di controllo sembra corrotto\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: non può essere eseguito da root\n"
+"Effettua il login (usando per esempio \"su\") con l'utente\n"
+"(non privilegiato) che controllerà il processo server.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: l'opzione -S non è supportata su questa piattaforma\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: troppi argomenti nella riga di comando (il primo è \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: mancano gli argomenti per la modalità di kill\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: modalità di operazione sconosciuta \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: nessuna operazione specificata\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: nessuna directory del database è stata specificata e la variabile d'ambiente PGDATA non è configurata\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ATTENZIONE: è attiva la modalità di backup online\n"
+#~ "L'arresto non sarà completato finché non sarà chiamata pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
diff --git a/src/bin/pg_ctl/po/ja.po b/src/bin/pg_ctl/po/ja.po
new file mode 100644
index 0000000..28a3546
--- /dev/null
+++ b/src/bin/pg_ctl/po/ja.po
@@ -0,0 +1,836 @@
+# pg_ctl.po
+# Japanese message translation file for pg_ctl
+#
+# Copyright (C) 2005-2022 PostgreSQL Global Development Group
+#
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-03-24 09:21+0900\n"
+"PO-Revision-Date: 2023-03-24 14:11+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ä¸æ­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行ã™ã‚‹\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "コマンドã¯å®Ÿè¡Œå½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­ãƒ—ロセスãŒçµ‚了コード%dã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­ãƒ—ロセスãŒä¾‹å¤–0x%Xã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­ãƒ—ロセスã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­ãƒ—ロセスãŒæœªçŸ¥ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹%dã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "ç¾åœ¨ã®ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: ディレクトリ \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: ディレクトリ\"%s\"ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: PIDファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PIDファイル\"%s\"ãŒç©ºã§ã™\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PIDファイル\"%s\"内ã«ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã™\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: setsid()ã«å¤±æ•—ã—ãŸãŸã‚サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: ログファイル \"%s\" をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: サーãƒãƒ¼ã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: コアファイルã®ã‚µã‚¤ã‚ºåˆ¶é™ã‚’設定ã§ãã¾ã›ã‚“:固定ã®åˆ¶é™ã«ã‚ˆã‚Šè¨±ã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: ファイル\"%s\"を読ã¿å–ã‚‹ã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: オプションファイル\"%s\"ã¯1è¡Œã®ã¿ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: åœæ­¢ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, 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:886
+#, 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:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: データベースシステムãŒåˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: ä»–ã®ã‚µãƒ¼ãƒãƒ¼ãŒå‹•ä½œä¸­ã®å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ãŒã€ã¨ã«ã‹ãpostmasterã®èµ·å‹•ã‚’試ã¿ã¾ã™ã€‚\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "サーãƒãƒ¼ã®èµ·å‹•å®Œäº†ã‚’å¾…ã£ã¦ã„ã¾ã™..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr "完了\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "サーãƒãƒ¼èµ·å‹•å®Œäº†\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " 待機処ç†ãŒåœæ­¢ã•ã‚Œã¾ã—ãŸ\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: サーãƒãƒ¼ã¯æ™‚間内ã«èµ·å‹•ã—ã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: サーãƒãƒ¼ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+"ログ出力を確èªã—ã¦ãã ã•ã„。\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "サーãƒãƒ¼ã¯èµ·å‹•ä¸­ã§ã™ã€‚\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PIDファイル\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "サーãƒãƒ¼ãŒå‹•ä½œã—ã¦ã„ã¾ã™ã‹?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: サーãƒãƒ¼ã‚’åœæ­¢ã§ãã¾ã›ã‚“。シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•ä½œã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "サーãƒãƒ¼ã®åœæ­¢ä¸­ã§ã™\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "サーãƒãƒ¼åœæ­¢å‡¦ç†ã®å®Œäº†ã‚’å¾…ã£ã¦ã„ã¾ã™..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr "失敗ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: サーãƒãƒ¼ã¯åœæ­¢ã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"ヒント: \"-m fast\"オプションã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³åˆ‡æ–­ãŒå§‹ã¾ã‚‹ã¾ã§å¾…æ©Ÿã™ã‚‹ã®ã§ã¯ãªã\n"
+"å³åº§ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’切断ã—ã¾ã™ã€‚\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "サーãƒãƒ¼ã¯åœæ­¢ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "ã¨ã«ã‹ãサーãƒãƒ¼ã®èµ·å‹•ã‚’試ã¿ã¾ã™\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: サーãƒãƒ¼ã‚’å†èµ·å‹•ã§ãã¾ã›ã‚“。シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•ä½œä¸­ã§ã™ã€‚\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "シングルユーザーサーãƒãƒ¼ã‚’終了ã•ã›ã¦ã‹ã‚‰ã€å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: å¤ã„サーãƒãƒ¼ãƒ—ロセス(PID: %d)ãŒå‹•ä½œã—ã¦ã„ãªã„よã†ã§ã™\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "ã¨ã«ã‹ãサーãƒãƒ¼ã‚’èµ·å‹•ã—ã¦ã„ã¾ã™\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: サーãƒãƒ¼ã‚’リロードã§ãã¾ã›ã‚“。シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•ä½œä¸­ã§ã™\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: リロードシグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "サーãƒãƒ¼ã«ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: サーãƒãƒ¼ã‚’昇格ã§ãã¾ã›ã‚“; シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•ä½œä¸­ã§ã™\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: サーãƒãƒ¼ã‚’昇格ã§ãã¾ã›ã‚“; サーãƒãƒ¼ã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: 昇格指示ファイル\"%s\"を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: 昇格指示ファイル\"%s\"ã«æ›¸ã出ã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: 昇格シグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—㟠(PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: 昇格指示ファイル\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "サーãƒãƒ¼ã®æ˜‡æ ¼ã‚’å¾…ã£ã¦ã„ã¾ã™..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "サーãƒãƒ¼ã¯æ˜‡æ ¼ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: サーãƒãƒ¼ã¯æ™‚間内ã«æ˜‡æ ¼ã—ã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "サーãƒãƒ¼ã‚’昇格中ã§ã™\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: ログをローテートã§ãã¾ã›ã‚“; シングルユーザーサーãƒãƒ¼ãŒå‹•ä½œä¸­ã§ã™ (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: ログローテート指示ファイル\"%s\"を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: ログローテート指示ファイル\"%s\"ã«æ›¸ã出ã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: ログローテートシグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—㟠(PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: ログローテーション指示ファイル\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "サーãƒãƒ¼ãŒãƒ­ã‚°ãƒ­ãƒ¼ãƒ†ãƒ¼ãƒˆã‚’シグナルã•ã‚Œã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: シングルユーザーサーãƒãƒ¼ãŒå‹•ä½œä¸­ã§ã™(PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: サーãƒãƒ¼ãŒå‹•ä½œä¸­ã§ã™(PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: サーãƒãƒ¼ãŒå‹•ä½œã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: シグナル%dã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ(PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 本プログラムã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã®æ¤œç´¢ã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: postgres ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: サービスマãƒãƒ¼ã‚¸ãƒ£ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: サービス\\\"%s\\\"ã¯ç™»éŒ²æ¸ˆã¿ã§ã™\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"ã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: サービス\"%s\"ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"ã®ç™»éŒ²å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "サーãƒãƒ¼ã®èµ·å‹•å®Œäº†ã‚’å¾…ã£ã¦ã„ã¾ã™...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "サーãƒãƒ¼ã®èµ·å‹•å¾…æ©ŸãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "サーãƒãƒ¼ã¯èµ·å‹•ã—ã€æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã™\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: サービス\"%s\"ã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: プロセストークンをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: SIDを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: 制é™ä»˜ãトークンを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: 権é™ã® LUID ã‚’å–å¾—ã§ãã¾ã›ã‚“: エラーコード %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: トークン情報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: メモリä¸è¶³ã§ã™\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。\n"
+
+#: pg_ctl.c:1966
+#, 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:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_ctl.c:1968
+#, 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:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+
+#: pg_ctl.c:1971
+#, 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:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1976
+#, 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:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %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:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"共通ã®ã‚ªãƒ—ション:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATADIR データベース格ç´é ˜åŸŸã®å ´æ‰€\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE サービスã¨ã—ã¦èµ·å‹•ã•ã›ãŸã¨ãã®ãƒ­ã‚°ã®ã‚¤ãƒ™ãƒ³ãƒˆã‚½ãƒ¼ã‚¹\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent エラーメッセージã®ã¿ã‚’表示ã€æƒ…報メッセージã¯è¡¨ç¤ºã—ãªã„\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS -wオプションを使用ã™ã‚‹æ™‚ã«å¾…æ©Ÿã™ã‚‹ç§’æ•°\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait æ“作ãŒå®Œäº†ã™ã‚‹ã¾ã§å¾…æ©Ÿ (デフォルト)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait 作業ã®å®Œäº†ã‚’å¾…ãŸãªã„\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "-Dオプションã®çœç•¥æ™‚ã¯PGDATA環境変数ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"èµ·å‹•ã€å†èµ·å‹•ã®ã‚ªãƒ—ション\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files postgresã®ã‚³ã‚¢ãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆã‚’許å¯\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files ã“ã®ãƒ—ラットフォームã§ã¯é©ç”¨ã•ã‚Œãªã„\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log FILENAME サーãƒãƒ¼ãƒ­ã‚°ã‚’FILENAMEã¸æ›¸ã込む(ã¾ãŸã¯è¿½åŠ ã™ã‚‹)\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS postgres(PostgreSQLサーãƒãƒ¼å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«)ã¾ãŸã¯\n"
+" initdb ã«æ¸¡ã™ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚ªãƒ—ション\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES 通常ã¯ä¸è¦\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"åœæ­¢ã€å†èµ·å‹•ã®ã‚ªãƒ—ション\n"
+
+#: pg_ctl.c:2009
+#, 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:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"シャットダウンモードã¯ä»¥ä¸‹ã®é€šã‚Š:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 全クライアントã®æŽ¥ç¶šåˆ‡æ–­å¾Œã«åœæ­¢\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast é©åˆ‡ãªæ‰‹ç¶šãã§ç›´ã¡ã«åœæ­¢(デフォルト)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate é©åˆ‡ãªæ‰‹ç¶šã抜ãã§åœæ­¢; å†èµ·å‹•æ™‚ã«ã¯ãƒªã‚«ãƒãƒªãŒå®Ÿè¡Œã•ã‚Œã‚‹\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"killモードã§åˆ©ç”¨ã§ãるシグナルå:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"登録ã€ç™»éŒ²è§£é™¤ã®ã‚ªãƒ—ション:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹éš›ã®ã‚µãƒ¼ãƒ“スå\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹ãŸã‚ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ‘スワード\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹ãŸã‚ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹éš›ã®ã‚µãƒ¼ãƒ“ス起動タイプ\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"起動タイプã¯ä»¥ä¸‹ã®é€šã‚Š:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto システムã®èµ·å‹•æ™‚ã«ã‚µãƒ¼ãƒ“スを自動的ã«é–‹å§‹(デフォルト)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand è¦æ±‚ã«å¿œã˜ã¦ã‚µãƒ¼ãƒ“スを開始\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: ä¸æ­£ãªã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ãƒ¢ãƒ¼ãƒ‰\"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: ä¸æ­£ãªã‚·ã‚°ãƒŠãƒ«å\"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: ä¸æ­£ãªèµ·å‹•ã‚¿ã‚¤ãƒ—\"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: コマンド\"%s\"を使用ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 制御ファイルãŒå£Šã‚Œã¦ã„るよã†ã§ã™\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: rootã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“\n"
+"サーãƒãƒ¼ãƒ—ロセスã®æ‰€æœ‰è€…ã¨ãªã‚‹(éžç‰¹æ¨©)ユーザーã¨ã—ã¦(\"su\"ãªã©ã‚’使用ã—ã¦)\n"
+"ログインã—ã¦ãã ã•ã„。\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -Sオプションã¯ã“ã®ãƒ—ラットフォームã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: killモード用ã®å¼•æ•°ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: æ“作モード\"%s\"ã¯ä¸æ˜Žã§ã™\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: æ“作モードãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: データベースã®æŒ‡å®šã‚‚ã€PGDATA環境変数ã®è¨­å®šã‚‚ã‚ã‚Šã¾ã›ã‚“\n"
diff --git a/src/bin/pg_ctl/po/ka.po b/src/bin/pg_ctl/po/ka.po
new file mode 100644
index 0000000..e52b8b2
--- /dev/null
+++ b/src/bin/pg_ctl/po/ka.po
@@ -0,0 +1,854 @@
+# Georgian message translation file for pg_ctl
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:18+0000\n"
+"PO-Revision-Date: 2023-04-20 08:19+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\":%m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ბრძáƒáƒœáƒ”ბრგáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•áƒ”"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ›áƒ£áƒ¨áƒáƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მიღების შეცდáƒáƒ›áƒ: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ %s წვდáƒáƒ›áƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•áƒ—: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜ \"%s\" ცáƒáƒ áƒ˜áƒ”ლიáƒ\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შიგთáƒáƒ•áƒ¡áƒ˜\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: სერვერის გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: სერვერის გáƒáƒ¨áƒ•áƒ”ბრშეუძლებელირsetsid()-ის შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: სერვერის გáƒáƒ¨áƒ•áƒ”ბრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s ბირთვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ ლიმიტის დáƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ hardlimit-ის მიერ\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: პáƒáƒ áƒáƒ›áƒ”ტრების ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ზუსტáƒáƒ“ ერთი ხáƒáƒ–ი უნდრიყáƒáƒ¡\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: გáƒáƒ©áƒ”რების სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ შეუძლებელირ(PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ „%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: შეიძლებრგáƒáƒ¨áƒ•áƒ”ბულირსხვრსერვერი; გáƒáƒ¨áƒ•áƒ”ბáƒáƒ¡ მáƒáƒ˜áƒœáƒª ვეცდები\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "სერვერის გáƒáƒ¨áƒ•áƒ”ბის მáƒáƒšáƒáƒ“ინი..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "სერვერი გáƒáƒ”შვáƒ\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " ლáƒáƒ“ინი შეწყვეტილიáƒ\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: სერვერი დრáƒáƒ–ე áƒáƒ  გáƒáƒ”შვáƒ\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: სერვერის გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ\n"
+"შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "სერვერი ეშვებáƒ\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID-ის ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "სერვერი გáƒáƒ¨áƒ•áƒ”ბიულიáƒ?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: სერვერის გáƒáƒ©áƒ”რების შეცდáƒáƒ›áƒ; გáƒáƒ¨áƒ•áƒ”ბულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს სერვერის გáƒáƒ›áƒáƒ áƒ—ვáƒ\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "სერვერის გáƒáƒ›áƒáƒ áƒ—ვის მáƒáƒšáƒáƒ“ინი..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი.\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s სერვერი áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"მინიშნებáƒ: \"-m fast\" პáƒáƒ áƒáƒ›áƒ”ტრი სესიებს მáƒáƒ¨áƒ˜áƒœáƒ•áƒ” წყვეტს,\n"
+"სესიის-ინიცირებული გáƒáƒ—იშვის მáƒáƒšáƒáƒ“ინის გáƒáƒ áƒ”შე.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "სერვერი გáƒáƒ›áƒáƒ˜áƒ áƒ—áƒ\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "სერვერის მáƒáƒ˜áƒœáƒª გáƒáƒ¨áƒ•áƒ”ბის მცდელáƒáƒ‘áƒ\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: სერვერის რესტáƒáƒ áƒ¢áƒ˜ შეუძლებელიáƒ; გáƒáƒ¨áƒ•áƒ”ბულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "შეáƒáƒ©áƒ”რეთ ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ სცáƒáƒ“ეთ.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: სერვერის ძველი პრáƒáƒªáƒ”სი (PID: %d) რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, მáƒáƒ™áƒ•áƒ“áƒ\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "სერვერის მáƒáƒ˜áƒœáƒª გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: სერვერის გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ; გáƒáƒ¨áƒ•áƒ”ბულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "სერვერს სიგნáƒáƒšáƒ˜ გáƒáƒ”გზáƒáƒ•áƒœáƒ\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: სერვერის წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის შეცდáƒáƒ›áƒ; გáƒáƒ¨áƒ•áƒ”ბულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s:სერვერის წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბრშეუძლებელიáƒ; სერვერი უქმე რეჟიმში áƒáƒ áƒáƒ\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნრშეუძლებელიáƒ: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ შეუძლებელიáƒ(PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "სერვერის დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბის მáƒáƒšáƒáƒ“ინი..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "სერვერი დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ“áƒ\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s სერვერი დრáƒáƒ–ე áƒáƒ  დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ“áƒ\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "სერვერის დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბáƒ\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის რáƒáƒ¢áƒáƒªáƒ˜áƒ შეუძლებელიáƒ; გáƒáƒ¨áƒ•áƒ”ბულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნრშეუძლებელიáƒ: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ : %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "სერვერმრგვáƒáƒœáƒ˜áƒ¨áƒœáƒ რáƒáƒ› ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ¡áƒáƒ¢áƒ áƒ˜áƒáƒšáƒ”ბელიáƒ\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: გáƒáƒ¨áƒ•áƒ”ბულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: სერვერი გáƒáƒ¨áƒ•áƒ”ბულირ(PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: სერვერი გáƒáƒ¨áƒ•áƒ”ბული áƒáƒ áƒ\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: სიგნáƒáƒšáƒ˜áƒ¡ (%d) გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•áƒœáƒ შეუძლებელიáƒ\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ˜ postgres áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: სერვისის მმáƒáƒ áƒ—ველის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: სერვისი %s უკვე რეგისტრირებულიáƒ\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (\"%s\") რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: სერვისი %s უკვე რეგისტრირებულიáƒ\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (%s) გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (\"%s\") რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "სერვერის გáƒáƒ¨áƒ•áƒ”ბის მáƒáƒšáƒáƒ“ინი...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "სერვერის გáƒáƒ¨áƒ•áƒ”ბის მáƒáƒšáƒáƒ“ინის ვáƒáƒ“რგáƒáƒ•áƒ˜áƒ“áƒ\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "სერვერი გáƒáƒ”შვრდრმზáƒáƒ“áƒáƒ შეერთებისთვის\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: სერვისის (%s) გáƒáƒ¨áƒ•áƒ”ბრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: პრივილეგიებისთვის LUID-ების მიღებრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: შეზღუდული კáƒáƒ“ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s წáƒáƒ áƒ›áƒáƒáƒ“გენს პრáƒáƒ’რáƒáƒ›áƒáƒ¡ PostgreSQL სერვერის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡, გáƒáƒ¨áƒ•áƒ”ბის, გáƒáƒ©áƒ”რების დრკáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡áƒ—ვის.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-s] [-o პáƒáƒ áƒáƒ›áƒ”ტრები]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-l ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n"
+" [-o პáƒáƒ áƒáƒ›áƒ”ტრი] [-p ბილიკი] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-m გáƒáƒ›áƒáƒ áƒ—ვის-რეჟიმი] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-m გáƒáƒ›áƒáƒ áƒ—ვის-რეჟიმი] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n"
+" [-o პáƒáƒ áƒáƒ›áƒ”ტრები] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill სიგნáƒáƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-N სერვისისსáƒáƒ®áƒ”ლი] [-U მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი] [-P პáƒáƒ áƒáƒšáƒ˜]\n"
+" [-S გáƒáƒ¨áƒ•áƒ”ბის-ტიპი] [-e წყáƒáƒ áƒ] [-W] [-t წáƒáƒ›áƒ˜] [-s] [-o პáƒáƒ áƒáƒ›áƒ”ტრები]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N სერვისისსáƒáƒ®áƒ”ლი]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " [-D, --pgdata=]DATADIR ბáƒáƒ–ის სáƒáƒªáƒáƒ•áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE მáƒáƒ•áƒšáƒ”ნების წყáƒáƒ áƒ სერვისáƒáƒ“ გáƒáƒ¨áƒ•áƒ”ბულáƒáƒ‘ის დრáƒáƒ¡ ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent მხáƒáƒšáƒáƒ“ შეცდáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ. სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ შეტყáƒáƒ‘ინებები áƒáƒ  გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=წáƒáƒ›áƒ˜ -w პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ მითითებული ლáƒáƒ“ინის დრáƒ\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait დáƒáƒšáƒáƒ“ებრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒáƒ›áƒ“ე(ნáƒáƒ’ულისხმები)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait áƒáƒ  დáƒáƒ”ლáƒáƒ“ებრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "თუ -D პáƒáƒ áƒáƒ›áƒ”ტრი მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრგáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"გáƒáƒ¨áƒ•áƒ”ბის áƒáƒœ თáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ¨áƒ•áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files postgres-ისთვის ბირთვის ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¬áƒ”რის უფლების მიცემáƒ\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე áƒáƒ  მუშáƒáƒáƒ‘ს\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი სერვერის ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრ(áƒáƒœ áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¨áƒ˜ მიწერáƒ)\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS postgres-ისთვის (PostgreSQL სერვერი) áƒáƒœ initdb-სთვის გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მი \n"
+" ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები \n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ბილიკი-POSTGRES-მდე ჩვეულებრივ სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"გáƒáƒ©áƒ”რებისრდრგáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=რეჟიმი რეჟიმი შეიძლებრიყáƒáƒ¡: (ჭკვიáƒáƒœáƒ˜)\"smart\", (ჩქáƒáƒ áƒ˜)\"fast\", áƒáƒœ (áƒáƒ®áƒšáƒáƒ•áƒ”)\"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"გáƒáƒ›áƒáƒ áƒ—ვის რეჟიმებიáƒ:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart გáƒáƒ¡áƒ•áƒšáƒ, რáƒáƒªáƒ ყველრკლიენტი გáƒáƒ˜áƒ—იშებáƒ\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast პირდáƒáƒžáƒ˜áƒ  გáƒáƒ¡áƒ•áƒšáƒ, სწáƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ áƒ—ვით (ნáƒáƒ’ულისხმები)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate სრული გáƒáƒ—იშვის გáƒáƒ áƒ”შე გáƒáƒ¡áƒ•áƒšáƒ; დიდი áƒáƒšáƒ‘áƒáƒ—áƒáƒ‘ით შემდეგ გáƒáƒ¨áƒ•áƒ”ბáƒáƒ–ე მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენრმáƒáƒ’იწევთ\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"მáƒáƒ¡áƒáƒ™áƒšáƒáƒ•áƒáƒ“ დáƒáƒ¨áƒ•áƒ”ბული სიგნáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლები:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡áƒ დრმისი მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N სერვისისსáƒáƒ®áƒ”ლი სერვისის სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლიც PostgreSQL სერვერი დáƒáƒ áƒ”გისტრირდებáƒ\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P პáƒáƒ áƒáƒšáƒ˜ PostgreSQL სერვერის დáƒáƒ¡áƒáƒ áƒ”გისტრირებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი PostgreSQL სერვერის დáƒáƒ¡áƒáƒ áƒ”გისტრირებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S გáƒáƒ¨áƒ•áƒ”ბის ტიპი PostgreSQL სერვერის გáƒáƒ¨áƒ•áƒ”ბის ტიპი\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"გáƒáƒ¨áƒ•áƒ”ბის ტიპები:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto სერვისი áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ”შვებრსისტემის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვისáƒáƒ¡ (ნáƒáƒ’ულისხმები)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand სáƒáƒ­áƒ˜áƒ áƒáƒ”ბის მიხედვით\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: მუშáƒáƒáƒ‘ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის უცნáƒáƒ‘ი რეჟიმი: \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: სიგნáƒáƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი: \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: გáƒáƒ¨áƒ•áƒ”ბის უცნáƒáƒ‘ი ტიპი \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: შეუძლებელირმáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის პáƒáƒ•áƒœáƒ ბრძáƒáƒœáƒ”ბით \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: áƒáƒ  შეიძლებრგáƒáƒ¨áƒ•áƒ”ბული რáƒáƒ’áƒáƒ áƒª root \n"
+"გთხáƒáƒ•áƒ— შეხვიდეთ (მáƒáƒ’. \"su\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებით) რáƒáƒ’áƒáƒ áƒª (áƒáƒ áƒáƒžáƒ áƒ˜áƒ•áƒ˜áƒšáƒ”გირებული)\n"
+"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი, რáƒáƒ›áƒ”ლიც ფლáƒáƒ‘ს სერვერის პრáƒáƒªáƒ”სს.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: პáƒáƒ áƒáƒ›áƒ”ტრი -S áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ áƒáƒ áƒ’უმენტები მáƒáƒ™áƒ•áƒšáƒ˜áƒ¡ რეჟიმისთვის\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი რეჟიმი \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ მითითებული áƒáƒ áƒáƒ\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: ბáƒáƒ–ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე დრგáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA მითითებული áƒáƒ áƒáƒ\n"
+
+#, c-format
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s: გáƒáƒ¤áƒ áƒ—ხილებáƒ: áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ\n"
+
+#, c-format
+#~ msgid "%s: WARNING: could not locate all job object functions in system API\n"
+#~ msgstr "%s: გáƒáƒ¤áƒ áƒ—ხილებáƒ: სისტემურ API-ში დáƒáƒ•áƒáƒšáƒ”ბის áƒáƒ‘იექტის ყველრფუნქცირáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
diff --git a/src/bin/pg_ctl/po/ko.po b/src/bin/pg_ctl/po/ko.po
new file mode 100644
index 0000000..03d2ac8
--- /dev/null
+++ b/src/bin/pg_ctl/po/ko.po
@@ -0,0 +1,858 @@
+# Korean message translation file for PostgreSQL pg_ctl
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:49+0000\n"
+"PO-Revision-Date: 2023-05-26 13:21+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행할 \"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(내부 오류)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "명령어를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 종료 코드 %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외처리로 하위 프로세스가 종료ë˜ì—ˆìŒ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, ì‹œê·¸ë„ %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 알수 없는 ìƒíƒœ %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "현재 ìž‘ì—… 디렉터리를 ì•Œ 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: \"%s\" 디렉터리 ì—†ìŒ\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: \"%s\" ë””ë ‰í„°ë¦¬ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: 지정한 \"%s\" 디렉터리는 ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤íŠ¸ 디렉터리가 아님\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: \"%s\" PID 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: \"%s\" PID 파ì¼ì— ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: \"%s\" PID 파ì¼ì´ 비었ìŒ\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: 서버를 시작 í•  수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: setsid() 실패로 서버를 시작 í•  수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: \"%s\" 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: 서버를 시작할 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s: 코어 íŒŒì¼ í¬ê¸° í•œë„를 설정할 수 ì—†ìŒ, 하드 ë””ìŠ¤í¬ ìš©ëŸ‰ 초과로 허용ë˜ì§€ ì•Š"
+"ìŒ\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: \"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: \"%s\" 환경설정파ì¼ì€ 반드시 í•œ ì¤„ì„ ê°€ì ¸ì•¼í•œë‹¤?\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: stop 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\"\n"
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s ìž‘ì—…ì—ì„œ 필요합니다. 그런ë°, ì´ íŒŒì¼ì´\n"
+"\"%s\" 파ì¼ì´ 있는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤.\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—… ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€\n"
+"%s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ 다릅니다.\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: ë°ì´í„°ë² ì´ìŠ¤ 초기화 실패\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: 다른 서버가 ê°€ë™ ì¤‘ì¸ ê²ƒ ê°™ìŒ; 어째든 서버 ê°€ë™ì„ ì‹œë„함\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "서버를 시작하기 위해 기다리는 중..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " 완료\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "서버 시작ë¨\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " 중지 기다리는 중\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: 서버가 ì œ ì‹œê°„ì— ì‹œìž‘ë˜ì§€ 못했ìŒ\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: 서버를 시작 í•  수 ì—†ìŒ\n"
+"로그 ì¶œë ¥ì„ ì‚´íŽ´ë³´ì‹­ì‹œì˜¤.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "서버를 시작합니다\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: \"%s\" PID 파ì¼ì´ 없습니다\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "서버가 실행 중입니까?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: 서버 중지 실패; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중 (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "서버를 멈춥니다\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "서버를 멈추기 위해 기다리는 중..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " 실패\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: 서버를 멈추지 못했ìŒ\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"힌트: \"-m fast\" ì˜µì…˜ì„ ì‚¬ìš©í•˜ë©´ ì ‘ì†í•œ ì„¸ì…˜ë“¤ì„ ì¦‰ì‹œ 정리합니다.\n"
+"ì´ ì˜µì…˜ì„ ì‚¬ìš©í•˜ì§€ 않으면 ì ‘ì†í•œ 세션들 스스로 ëŠì„ 때까지 기다립니다.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "서버 멈추었ìŒ\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "어째든 서버를 시작해 봅니다\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: 서버를 다시 시작 í•  수 ì—†ìŒ; 단ì¼ì‚¬ìš©ìž 서버가 실행 중임 (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ë¥¼ 멈추고 다시 ì‹œë„하십시오.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: ì´ì „ 서버 프로세스(PID: %d)ê°€ 없어졌습니다\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "어째든 서버를 시작합니다\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: 서버 í™˜ê²½ì„¤ì •ì„ ë‹¤ì‹œ 불러올 수 ì—†ìŒ; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중임 (PID: "
+"%d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: reload 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "서버가 시스템 시그ë„ì„ ë°›ì•˜ìŒ\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: ìš´ì˜ì„œë²„ 전환 실패; 단ì¼ì‚¬ìš©ìž 서버가 실행 중(PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: ìš´ì˜ì„œë²„ 전환 실패; 서버가 대기 모드로 ìƒíƒœê°€ 아님\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì— 쓰기 실패: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: ìš´ì˜ì „환 시그ë„ì„ ì„œë²„(PID: %d)ë¡œ 보낼 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "서버를 ìš´ì˜ ëª¨ë“œë¡œ 전환하는 중 ..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "ìš´ì˜ ëª¨ë“œ 전환 완료\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: 서버를 ì œ ì‹œê°„ì— ìš´ì˜ ëª¨ë“œë¡œ 전환하지 못했ìŒ\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "서버를 ìš´ì˜ ëª¨ë“œë¡œ 전환합니다\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: 서버 로그 파ì¼ì„ 바꿀 수 ì—†ìŒ; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중임 (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì— 쓰기 실패: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: 로그 전환 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "서버가 로그 전환 시그ë„ì„ ë°›ì•˜ìŒ\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: 단ì¼ì‚¬ìš©ìž 서버가 실행 중임 (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: 서버가 실행 중임 (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: ê°€ë™ ì¤‘ì¸ ì„œë²„ê°€ ì—†ìŒ\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: %d 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 실행 가능한 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: 실행 가능한 postgres í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: 서비스 관리ìžë¥¼ ì—´ 수 ì—†ìŒ\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: \"%s\" 서비스가 ì´ë¯¸ ë“±ë¡ ë˜ì–´ 있ìŒ\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 등ë¡í•  수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: \"%s\" 서비스가 등ë¡ë˜ì–´ 있지 ì•ŠìŒ\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 ì—´ 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 서비스 목ë¡ì—ì„œ 뺄 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "서버를 시작하기 위해 기다리는 중...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "서버 ì‹œìž‘ì„ ê¸°ë‹¤ë¦¬ëŠ” ë™ì•ˆ 시간 초과ë¨\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "서버가 시작ë˜ì—ˆìœ¼ë©° ì—°ê²°ì„ í—ˆìš©í•¨\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" 서비스를 시작할 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: 프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: restricted tokenì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: ì ‘ê·¼ 권한용 LUID를 구할 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: í† í° ì •ë³´ë¥¼ 구할 수 ì—†ìŒ: 오류 코드 %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: 메모리 부족\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\"\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL 서버를 초기화, 시작, 중지, 제어하는 ë„구입니다.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D ë°ì´í„°ë””렉터리] [-s] [-o 옵션]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D ë°ì´í„°ë””렉터리] [-l 파ì¼ì´ë¦„] [-W] [-t ì´ˆ] [-s]\n"
+" [-o 옵션] [-p 경로] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D ë°ì´í„°ë””렉터리] [-m 중지방법] [-W] [-t ì´ˆ] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D ë°ì´í„°ë””렉터리] [-m 중지방법] [-W] [-t ì´ˆ] [-s]\n"
+" [-o 옵션] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D ë°ì´í„°ë””렉터리] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D ë°ì´í„°ë””렉터리]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D ë°ì´í„°ë””렉터리] [-W] [-t ì´ˆ] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D ë°ì´í„°ë””렉터리] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill 시그ë„ì´ë¦„ PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o "
+"OPTIONS]\n"
+msgstr ""
+" %s register [-D ë°ì´í„°ë””렉터리] [-N 서비스ì´ë¦„] [-U 사용ìžì´ë¦„] [-P ì•”"
+"호]\n"
+" [-S 시작형태] [-e SOURCE] [-w] [-t 초] [-o 옵션]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N 서비스ì´ë¦„]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"ì¼ë°˜ 옵션들:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr ""
+" -D, --pgdata=ë°ì´í„°ë””렉터리 ë°ì´í„°ë² ì´ìŠ¤ ìžë£Œê°€ 저장ë˜ì–´ìžˆëŠ” 디렉터리\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid ""
+" -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e SOURCE 서비스가 실행 중ì¼ë•Œ ìŒ“ì„ ë¡œê·¸ë¥¼ 위한 ì´ë²¤íŠ¸ 소스\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent ì¼ë°˜ì ì¸ 메시지는 ë³´ì´ì§€ ì•Šê³ , 오류만 보여줌\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=초 -w 옵션 사용 시 대기 시간(초)\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait ìž‘ì—…ì´ ëë‚  때까지 기다림 (기본값)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait ìž‘ì—…ì´ ëë‚  때까지 기다리지 ì•ŠìŒ\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "-D ì˜µì…˜ì„ ì‚¬ìš©í•˜ì§€ 않으면, PGDATA í™˜ê²½ë³€ìˆ˜ê°’ì„ ì‚¬ìš©í•¨.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"start, restart 때 사용할 수 있는 옵션들:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files 코어 ë¤í”„ 파ì¼ì„ 만듬\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files ì´ í”Œëž«í¼ì—서는 사용할 수 ì—†ìŒ\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=ë¡œê·¸íŒŒì¼ ì„œë²„ 로그를 ì´ ë¡œê·¸íŒŒì¼ì— 기ë¡í•¨\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=옵션들 PostgreSQL ì„œë²„í”„ë¡œê·¸ëž¨ì¸ postgres나 initdb\n"
+" 명령ì—ì„œ 사용할 명령행 옵션들\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES ë³´í†µì€ í•„ìš”ì¹˜ ì•ŠìŒ\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"stop, restart 때 사용 할 수 있는 옵션들:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid ""
+" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m, --mode=모드 모드는 \"smart\", \"fast\", \"immediate\" 중 하나\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"중지방법 설명:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 모든 í´ë¼ì´ì–¸íŠ¸ì˜ ì—°ê²°ì´ ëŠê¸°ê²Œ ë˜ë©´ 중지 ë¨\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr ""
+" fast í´ë¼ì´ì–¸íŠ¸ì˜ ì—°ê²°ì„ ê°•ì œë¡œ ëŠê³  ì •ìƒì ìœ¼ë¡œ 중지 ë¨ (기본값)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid ""
+" immediate quit without complete shutdown; will lead to recovery on "
+"restart\n"
+msgstr ""
+" immediate 그냥 무조건 중지함; 다시 시작할 ë•Œ 복구 ìž‘ì—…ì„ í•  ìˆ˜ë„ ìžˆìŒ\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"사용할 수 있는 중지용(for kill) ì‹œê·¸ë„ ì´ë¦„:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"서비스 등ë¡/제거용 옵션들:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid ""
+" -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME 서비스 목ë¡ì— 등ë¡ë  PostgreSQL 서비스 ì´ë¦„\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD ì´ ì„œë¹„ìŠ¤ë¥¼ 실행할 사용ìžì˜ 암호\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME ì´ ì„œë¹„ìŠ¤ë¥¼ 실행할 ì‚¬ìš©ìž ì´ë¦„\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S 시작형태 서비스로 등ë¡ëœ PostgreSQL 서버 시작 방법\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"시작형태 설명:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid ""
+" auto start service automatically during system startup (default)\n"
+msgstr " auto ì‹œìŠ¤í…œì´ ì‹œìž‘ë˜ë©´ ìžë™ìœ¼ë¡œ 서비스가 ì‹œìž‘ë¨ (초기값)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand ìˆ˜ë™ ì‹œìž‘\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: ìž˜ëª»ëœ ì¤‘ì§€ 방법 \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: ìž˜ëª»ëœ ì‹œê·¸ë„ ì´ë¦„ \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: 알 수 없는 시작형태 \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: \"%s\" 명령ì—ì„œ 사용할 ë°ì´í„° 디렉터리를 ì•Œ 수 ì—†ìŒ\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 컨트롤 파ì¼ì´ 깨졌ìŒ\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: rootë¡œ ì´ í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì§€ 마십시오\n"
+"ì‹œìŠ¤í…œê´€ë¦¬ìž ê¶Œí•œì´ ì—†ëŠ”, ì„œë²„í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë  ì¼ë°˜ 사용ìžë¡œ\n"
+"ë¡œê·¸ì¸ í•´ì„œ(\"su\", \"runas\" ê°™ì€ ëª…ë ¹ ì´ìš©) 실행하십시오.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S ì˜µì…˜ì€ ì´ ìš´ì˜ì²´ì œì—서는 지ì›í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë“¤ (시작 \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: kill ìž‘ì—…ì— í•„ìš”í•œ ì¸ìˆ˜ê°€ 빠졌습니다\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: 알 수 없는 작업 모드 \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: 수행할 ìž‘ì—…ì„ ì§€ì •í•˜ì§€ 않았습니다\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid ""
+"%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: -D ì˜µì…˜ë„ ì—†ê³ , PGDATA í™˜ê²½ë³€ìˆ˜ê°’ë„ ì§€ì •ë˜ì–´ 있지 않습니다.\n"
diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build
new file mode 100644
index 0000000..3d35f7a
--- /dev/null
+++ b/src/bin/pg_ctl/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_ctl-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_ctl/po/pl.po b/src/bin/pg_ctl/po/pl.po
new file mode 100644
index 0000000..4f71b48
--- /dev/null
+++ b/src/bin/pg_ctl/po/pl.po
@@ -0,0 +1,956 @@
+# Polish message translation file for pg_ctl
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL 9.5)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-24 03:48+0000\n"
+"PO-Revision-Date: 2023-09-05 08:43+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "niepoprawny binarny \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "nie można odczytać binarnego \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nie znaleziono \"%s\" do wykonania"
+
+#: ../../common/exec.c:250
+#, fuzzy, c-format
+#| msgid "could not reopen file \"%s\" as stderr: %m"
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "nie można otworzyć ponownie pliku \"%s\" do jako standardowe wyjście błędów: %m"
+
+#: ../../common/exec.c:412
+#, fuzzy, c-format
+#| msgid "select() failed: %m"
+msgid "%s() failed: %m"
+msgstr "select() nie powiodła się: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "brak pamięci"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "polecenie nie wykonywalne"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "polecenia nie znaleziono"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "proces potomny zakończył działanie z kodem %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "proces potomny został zatrzymany przez wyjątek 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "proces potomny został zakończony przez sygnał %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "proces potomny zakończył działanie z nieznanym stanem %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "nie można zidentyfikować aktualnego folderu roboczego: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: folder \"%s\" nie istnieje\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: brak dostępu do katalogu \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: folder \"%s\" nie jest folderem klastra bazy danych\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku PID \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: plik PID \"%s\" jest pusty\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: niepoprawne dane w pliku PID \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: nie można uruchomić serwera: %s\n"
+
+#: pg_ctl.c:478
+#, fuzzy, c-format
+#| msgid "%s: could not start server: %s\n"
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: nie można uruchomić serwera: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku logów \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: nie udało się uruchomić serwera: kod błędu %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: nie można ustawić ograniczenia rozmiaru pliku jądra; zablokowane przez twardy limit\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: nie można czytać z pliku \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: plik opcji \"%s\" musi mieć dokładnie jedną linię\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: nie udało się wysłać sygnału zatrzymującego (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" is needed by %s but was not found in the\n"
+#| "same directory as \"%s\".\n"
+#| "Check your installation.\n"
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr ""
+"Program \"%s\" jest wymagany przez %s ale nie został znaleziony\n"
+"w tym samym folderze co \"%s\".\n"
+"Sprawdź instalację.\n"
+
+#: pg_ctl.c:886
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" was found by \"%s\"\n"
+#| "but was not the same version as %s.\n"
+#| "Check your installation.\n"
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"Program \"%s\" został znaleziony przez \"%s\"\n"
+"ale nie jest w tej samej wersji co %s.\n"
+"Sprawdź instalację.\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inicjacja systemu bazy danych nie powiodła się\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: inny serwer może być uruchomiony, próba uruchomienia serwera mimo to\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "oczekiwanie na uruchomienie serwera..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " zakończono\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "uruchomiono serwer\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " oczekiwanie zakończone\n"
+
+#: pg_ctl.c:991
+#, fuzzy, c-format
+#| msgid "%s: server does not shut down\n"
+msgid "%s: server did not start in time\n"
+msgstr "%s: serwer nie zatrzymał się\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: Nie udało się uruchomić serwera\n"
+"Sprawdź logi wyjścia.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "serwer w trakcie uruchamiania\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: plik PID \"%s\" nie istnieje\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Czy serwer działa?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: Nie można zatrzymać serwera; jest uruchomiony serwer pojedynczego użytkownika (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "zatrzymywanie serwera\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "oczekiwanie na zatrzymanie serwera..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " niepowodzenie\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: serwer nie zatrzymał się\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"PORADA: Opcja \"-m fast\" rozłącza natychmiast sesje zamiast\n"
+"czekać na odłączenie sesji przez użytkowników.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "serwer zatrzymany\n"
+
+#: pg_ctl.c:1086
+#, fuzzy
+#| msgid "starting server anyway\n"
+msgid "trying to start server anyway\n"
+msgstr "uruchomienie serwera mimo wszystko\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: Nie można zrestartować serwera; jest uruchomiony serwer pojedynczego użytkownika (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Proszę zakończyć działanie serwera pojedynczego użytkownika i spróbować raz jeszcze.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: poprzedni proces serwera (PID: %d) wydaje siÄ™ zginÄ…Å‚\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "uruchomienie serwera mimo wszystko\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: Nie można przeładować serwera; jest uruchomiony serwer pojedynczego użytkownika (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: nie udało się wysłać sygnału przeładowującego (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "serwer zasygnalizowany\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: Nie można rozgłosić serwera; jest uruchomiony serwer pojedynczego użytkownika (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: nie można rozgłosić serwera; nie jest w trybie gotowości\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: nie można utworzyć pliku sygnału rozgłoszenia \"%s\": %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: nie można zapisać pliku sygnału rozgłoszenia \"%s\": %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: nie udało się wysłać sygnału rozgłaszającego (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: nie można usunąć pliku sygnału rozgłoszenia \"%s\": %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "oczekiwanie na rozgłoszenie serwera..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "serwer rozgłoszony\n"
+
+#: pg_ctl.c:1244
+#, fuzzy, c-format
+#| msgid "server is still promoting\n"
+msgid "%s: server did not promote in time\n"
+msgstr "serwer ciągle się rozgłasza\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "serwer w trakcie rozgłaszania\n"
+
+#: pg_ctl.c:1274
+#, fuzzy, c-format
+#| msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: Nie można przeładować serwera; jest uruchomiony serwer pojedynczego użytkownika (PID: %ld)\n"
+
+#: pg_ctl.c:1284
+#, fuzzy, c-format
+#| msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: nie można utworzyć pliku sygnału rozgłoszenia \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, fuzzy, c-format
+#| msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: nie można zapisać pliku sygnału rozgłoszenia \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, fuzzy, c-format
+#| msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: nie udało się wysłać sygnału przeładowującego (PID: %ld): %s\n"
+
+#: pg_ctl.c:1301
+#, fuzzy, c-format
+#| msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: nie można usunąć pliku sygnału rozgłoszenia \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+#, fuzzy
+#| msgid "must be superuser to rotate log files"
+msgid "server signaled to rotate log file\n"
+msgstr "musisz być super użytkownikiem aby obrócić pliki dziennika"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: jest uruchomiony serwer pojedynczego użytkownika (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: jest uruchomiony serwer (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: brak uruchomionego serwera\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: nie udało się wysłać sygnału %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nie udało się znaleźć własnego programu wykonywalnego\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: nie udało się znaleźć programu wykonywalnego postgresa\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: nie udało się otworzyć menadżera usług\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: usługa \"%s\" jest już zarejestrowana\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: nie udało się zarejestrować usługi \"%s\": kod błędu %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: usługa \"%s\" niezarejestrowana\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: nie udało się otworzyć usługi \"%s\": kod błędu %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: nie udało się wyrejestrować usługi \"%s\": kod błędu %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Oczekiwanie na uruchomienie serwera...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "MinÄ…Å‚ czas oczekiwania na uruchomienie serwera\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Serwer uruchomiony i akceptuje połączenia\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: nie udało się uruchomić usługi \"%s\": kod błędu %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: nie można otworzyć tokenu procesu: kod błędu %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: nie udało się przydzielić SIDów: kod błędu %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: nie udało się utworzyć ograniczonego tokena: kod błędu %lu\n"
+
+#: pg_ctl.c:1911
+#, fuzzy, c-format
+#| msgid "%s: could not open service \"%s\": error code %lu\n"
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: nie udało się otworzyć usługi \"%s\": kod błędu %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, fuzzy, c-format
+#| msgid "%s: could not open process token: error code %lu\n"
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: nie można otworzyć tokenu procesu: kod błędu %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: brak pamięci\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s jest narzędziem do inicjacji, uruchamiania, zatrzymywania i kontroli serwera PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_ctl.c:1968
+#, fuzzy, c-format
+#| msgid " %s init[db] [-D DATADIR] [-s] [-o \"OPTIONS\"]\n"
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D KATDANE] [-s] [-o \"OPCJE\"]\n"
+
+#: pg_ctl.c:1969
+#, fuzzy, c-format
+#| msgid ""
+#| " %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
+#| " [-o \"OPTIONS\"]\n"
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s restart [-w] [-t SEKUNDY] [-D KATDANE] [-s] [-m TRYB-ZAMKNIECIA]\n"
+" [-o \"OPCJE\"]\n"
+
+#: pg_ctl.c:1971
+#, fuzzy, c-format
+#| msgid " %s stop [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-W] [-t SEKUNDY] [-D KATDANE] [-s] [-m TRYB-ZAMKNIECIA]\n"
+
+#: pg_ctl.c:1972
+#, fuzzy, c-format
+#| msgid ""
+#| " %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
+#| " [-o \"OPTIONS\"]\n"
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-w] [-t SEKUNDY] [-D KATDANE] [-s] [-m TRYB-ZAMKNIECIA]\n"
+" [-o \"OPCJE\"]\n"
+
+#: pg_ctl.c:1974
+#, fuzzy, c-format
+#| msgid " %s reload [-D DATADIR] [-s]\n"
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D KATDANE] [-s]\n"
+
+#: pg_ctl.c:1975
+#, fuzzy, c-format
+#| msgid " %s status [-D DATADIR]\n"
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D KATDANE]\n"
+
+#: pg_ctl.c:1976
+#, fuzzy, c-format
+#| msgid " %s promote [-w] [-t SECS] [-D DATADIR] [-s]\n"
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-w] [-t SEK] [-D KATDANE] [-s]\n"
+
+#: pg_ctl.c:1977
+#, fuzzy, c-format
+#| msgid " %s promote [-w] [-t SECS] [-D DATADIR] [-s]\n"
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s promote [-w] [-t SEK] [-D KATDANE] [-s]\n"
+
+#: pg_ctl.c:1978
+#, fuzzy, c-format
+#| msgid " %s kill SIGNALNAME PID\n"
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NAZWASYGNAÅU PID\n"
+
+#: pg_ctl.c:1980
+#, fuzzy, c-format
+#| msgid ""
+#| " %s register [-N SERVICENAME] [-U USERNAME] [-P PASSWORD] [-D DATADIR]\n"
+#| " [-S START-TYPE] [-w] [-t SECS] [-o \"OPTIONS\"]\n"
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-N NAZWAUSLUGI] [-U USERNAME] [-P PASSWORD] [-D KATDANE]\n"
+" [-S TYP-STARTU] [-w] [-t SEKUNDY] [-o \"OPCJE\"]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N NAZWAUSLUGI]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opcje ogólne:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=KATDANE położenie miejsca przechowywania bazy danych\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ŹRÓDÅO źródÅ‚o zdarzenia do logowania gdy uruchomiono jako usÅ‚ugÄ™\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent wypisz tylko błędy, bez komunikatów informacyjnych\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEKUNDY sekundy oczekiwania podczas użycia opcji -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait czekaj na zakończenie operacji (domyślnie)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait nie czekaj na zakończenie operacji\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Jeśli nie jest podana -D, używana jest zmienna środowiskowa PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opcje uruchomienia lub restartu:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files zezwól postgresowi utworzyć pliki jądra\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files niedostępne na tej platformie\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=NAZWAPLIKU zapisuje (lub dodaje) komunikaty serwera do NAZWAPLIKU\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPCJE opcje wiersza poleceń przekazywanych postgresowi\n"
+" (program wykonywalny PostgreSQL) lub initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ŚCIEŻKA-DO-POSTGRES zwykle niekonieczna\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opcje dla zatrzymania lub restartu:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=TRYB TRYB może być \"smart\", \"fast\" lub \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Tryby zamknięcia to:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart wyjście po rozłączeniu się wszystkich klientów\n"
+
+#: pg_ctl.c:2013
+#, fuzzy, c-format
+#| msgid " fast quit directly, with proper shutdown\n"
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast bezpośrednie wyjście, z właściwym zamknięciem\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate wyjście bez pełnego zamknięcia; doprowadzi do odzyskiwania przy restarcie\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Dopuszczalne nazwy sygnałów dla zabicia:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opcje rejestracji i wyrejestrowania:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME nazwa usługi, na której rejestruje się serwer PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD hasło konta rejestracji serwera PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME nazwa użytkownika konta rejestracji serwera PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TYP-STARTU typ startu usługi rejestracji serwera PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Rodzaje startu to:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto uruchamia usługę automatycznie w czasie startu systemu (domyślnie)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand uruchamia usługę na żądanie\n"
+
+#: pg_ctl.c:2031
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr ""
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: nierozpoznany tryb wyłączenia \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nierozpoznana nazwa sygnału \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: nierozpoznany tryb uruchomienia \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: nie można określić folderu danych przy użyciu polecenia \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: plik kontrolny wydaje siÄ™ uszkodzony\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: nie można uruchomić jako root\n"
+"Proszę zalogować się (używając np: \"su\") na (nieuprzywilejowanego) użytkownika który\n"
+"będzie właścicielem procesu.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: opcja -S nieobsługiwana na tej platformie\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: nie wskazano wszystkich argumentów trybu zabicia\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: nierozpoznany tryb autoryzacji \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: nie podano operacji\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: nie wskazano folderu bazy danych ani nie ustawiono zmiennej środowiska PGDATA\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: opcja -w nie może używać względnego wskazania katalogu gniazd\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: opcja -w nie jest wspierana przy uruchomieniu serwera pre-9.1\n"
+
+#, c-format
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr " %s start [-w] [-t SEKUNDY] [-D KATDANE] [-s] [-l NAZWAPLIKU] [-o \"OPCJE\"]\n"
+
+#, c-format
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s: OSTRZEŻENIE nie można tworzyć ograniczonych tokenów na tej platformie\n"
+
+#, c-format
+#~ msgid "%s: WARNING: could not locate all job object functions in system API\n"
+#~ msgstr "%s: OSTRZEŻENIE: nie może zlokalizować wszystkich funkcji obiektów zadań w systemowym API\n"
+
+#, c-format
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s: nie można czekać na serwer z powodu błędnej konfiguracji\n"
+
+#, c-format
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Oczekiwanie jest domyślne dla zamknięcia, ale nie dla uruchomienia i restartu.)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "OSTRZEŻENIE: jest aktywny tryb robienia kopii roboczej online\n"
+#~ "Zatrzymanie nie zakończy się póki wywoływana jest pg_stop_backup().\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "proces potomny został zatrzymany przez sygnał %s"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "nie można zmienić katalogu na \"%s\": %s"
+
+#, c-format
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "nie można zidentyfikować aktualnego katalogu: %s"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nie można odczytać linku symbolicznego \"%s\""
+
+#, c-format
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose nie powiodło się: %s"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "serwer ciÄ…gle siÄ™ uruchamia\n"
diff --git a/src/bin/pg_ctl/po/pt_BR.po b/src/bin/pg_ctl/po/pt_BR.po
new file mode 100644
index 0000000..b519356
--- /dev/null
+++ b/src/bin/pg_ctl/po/pt_BR.po
@@ -0,0 +1,832 @@
+# Brazilian Portuguese message translation file for pg_ctl
+#
+# Copyright (C) 2004-2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2004-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 13:01-0300\n"
+"PO-Revision-Date: 2005-10-04 22:15-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binário \"%s\" é inválido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "não pôde ler o binário \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "não pôde resolver caminho \"%s\" para forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "sem memória"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "comando não é executável"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "comando não foi encontrado"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo filho terminou com código de saída %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo filho foi terminado pela exceção 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo filho foi terminado pelo sinal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo filho terminou com status desconhecido %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "não pôde obter diretório de trabalho atual: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: diretório \"%s\" não existe\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: não pôde acessar diretório \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: diretório \"%s\" não é um diretório de agrupamento de banco dados\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo do PID \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: arquivo do PID \"%s\" está vazio\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: dado inválido no arquivo do PID \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: não pôde iniciar servidor: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: não pôde iniciar servidor devido a falha no setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: não pôde abrir arquivo de log \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: não pôde iniciar servidor: código de erro %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: não pode definir tamanho limite do arquivo core; não é permitido pelo limite superior\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: não pôde ler arquivo \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: arquivo de opções \"%s\" deve ter exatamente uma linha\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: não pôde enviar sinal de parada (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "O programa \"%s\" é requerido pelo %s mas não foi encontrado no mesmo diretório que \"%s\"\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "O programa \"%s\" foi encontrado pelo \"%s\" mas não tem a mesma versão que %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: inicialização do sistema de banco de dados falhou\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: outro servidor pode estar executando; tentando iniciar o servidor assim mesmo\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "esperando o servidor iniciar..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr "feito\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "servidor iniciado\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr "parou de esperar\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: servidor não iniciou a tempo\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: não pode iniciar o servidor\n"
+"Examine o arquivo de log.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "servidor está iniciando\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: arquivo do PID \"%s\" não existe\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "O servidor está executando?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: não pode parar servidor; servidor monousuário está executando (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "servidor está desligando\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "esperando o servidor desligar..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr "falhou\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: servidor não desligou\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr "DICA: A opção \"-m fast\" desconecta imediatamente sessões ao invés de esperar pela desconexão das sessões iniciadas.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "servidor está parado\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "tentando iniciar servidor mesmo assim\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: não pode reiniciar servidor; servidor monousuário está executando (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Por favor finalize o servidor monousuário e tente novamente.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: processo servidor antigo (PID: %d) parece estar terminado\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "iniciando servidor mesmo assim\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: não pode recarregar servidor; servidor monousuário está executando (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: não pôde enviar sinal de recarga (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "servidor foi sinalizado\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: não pode promover servidor; servidor monousuário está executando (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: não pode promover servidor; servidor não está no modo em espera\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo de sinal de promoção \"%s\": %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo de sinal de promoção \"%s\": %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: não pôde enviar sinal de promoção (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: não pôde remover arquivo de sinal de promoção \"%s\": %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "esperando servidor ser promovido..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "servidor promovido\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: servidor não foi promovido a tempo\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "servidor está sendo promovido\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: não pode rotacionar log do servidor; servidor monousuário está executando (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: não pôde criar arquivo de sinal de rotação de log \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: não pôde escrever no arquivo de sinal de rotação de log \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: não pôde enviar sinal de rotação de log (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: não pôde remover arquivo de sinal de rotação de log \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "servidor sinalizado para rotacionar arquivo de log\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: servidor monousuário está executando (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: servidor está executando (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: nenhum servidor está executando\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: não pôde enviar sinal %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: não pôde encontrar executável\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: não pôde encontrar o programa executável do postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: não pôde abrir gerenciador de serviço\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: serviço \"%s\" já está registrado\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: não pôde registrar serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: serviço \"%s\" não está registrado\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: não pôde abrir serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: não pôde remover registro do serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Esperando o servidor iniciar...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Tempo de espera esgotado para início do servidor\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Servidor foi iniciado e está aceitando conexões\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: não pôde iniciar serviço \"%s\": código de erro %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: não pôde abrir token de processo: código de erro %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: não pôde alocar SIDs: código de erro %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: não pôde criar token restrito: código de erro %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: não pôde obter LUIDs para privilégios: código de erro %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: não pôde obter informação sobre token: código de erro %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: sem memória\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s é um utilitário para inicializar, iniciar, parar e controlar um servidor PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DIRDADOS] [-s] [-o OPÇÕES]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DIRDADOS] [-l ARQUIVO] [-W] [-t SEGS] [-s]\n"
+" [-o OPÇÕES] [-p CAMINHO] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DIRDADOS] [-m MODO-DESLIGAMENTO] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DIRDADOS] [-m MODO-DESLIGAMENTO] [-W] [-t SEGS] [-s]\n"
+" [-o OPÇÕES] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DIRDADOS] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DIRDADOS]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DIRDADOS] [-W] [-t SEGS] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DIRDADOS] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill NOMESINAL PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DIRDADOS] [-N NOMESERVIÇO] [-U USUÃRIO] [-P SENHA]\n"
+" [-S TIPO-INÃCIO] [-e ORIGEM] [-W] [-t SEGS] [-s] [-o OPÇÕES]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N NOMESERVIÇO]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Opções comuns:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DIRDADOS local da área de armazenamento dos bancos de dados\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ORIGEM origem de eventos para registro quando executar como um serviço\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent mostra somente erros, nenhuma mensagem informativa\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout= SEGS segundos a esperar quando a opção -w for utilizada\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait espera até que a operação seja concluída (padrão)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait não espera até que a operação seja concluída\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Se a opção -D for omitida, a variável de ambiente PGDATA é utilizada.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Opções para início ou reinício:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files permite o postgres produzir arquivos core\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files não é aplicável a esta plataforma\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=ARQUIVO escreve (ou concatena) log do servidor para ARQUIVO\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPÇÕES opções de linha de comando passadas para o postgres\n"
+" (executável do servidor PostgreSQL) ou initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p CAMINHO-DO-POSTGRES normalmente não é necessário\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Opções para parada ou reinício:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODO MODO pode ser \"smart\", \"fast\" ou \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Modos de desligamento são:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart termina depois que todos os clientes desconectarem\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast termina diretamente, com desligamento apropriado (padrão)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate termina sem desligamento completo; conduzirá a uma recuperação durante o reinício\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Sinais permitidos para sinalização:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Opções para registrar ou remover registro:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N NOMESERVIÇO nome do serviço no qual se registrou o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P SENHA senha da conta que registrou o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USUÃRIO nome do usuário que registrou o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S TIPO-INÃCIO tipo de início do serviço para registrar o servidor PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Tipos de início são:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto inicia serviço automaticamente durante a inicialização do sistema (padrão)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand inicia serviço sob demanda\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: modo de desligamento \"%s\" desconhecido\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: nome de sinal \"%s\" desconhecido\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: tipo de início \"%s\" desconhecido\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: não pôde determinar diretório de dados utilizando comando \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: arquivo de controle parece estar corrompido\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: não pode ser executado como root\n"
+"Por favor entre (utilizando \"su\") como um usuário (sem privilégios) que\n"
+"será o dono do processo do servidor.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: opção -S não é suportada nessa plataforma\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: faltando argumento para modo kill\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: modo de operação \"%s\" é desconhecido\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: nenhuma operação especificada\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: nenhum diretório de banco de dados especificado e variável de ambiente PGDATA não foi definida\n"
diff --git a/src/bin/pg_ctl/po/ru.po b/src/bin/pg_ctl/po/ru.po
new file mode 100644
index 0000000..a5d7ee2
--- /dev/null
+++ b/src/bin/pg_ctl/po/ru.po
@@ -0,0 +1,1025 @@
+# Russian message translation file for pg_ctl
+# Copyright (C) 2004-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2004-2005.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009, 2012.
+# Andrey Sudnik <sudnikand@gmail.com>, 2010.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-28 07:59+0300\n"
+"PO-Revision-Date: 2023-08-29 10:20+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "неверный иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\""
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "не удалоÑÑŒ определить текущий рабочий каталог: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: каталог \"%s\" не ÑущеÑтвует\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: ошибка доÑтупа к каталогу \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: каталог \"%s\" не Ñодержит Ñтруктуры клаÑтера баз данных\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: не удалоÑÑŒ открыть файл PID \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: файл PID \"%s\" пуÑÑ‚\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: неверные данные в файле PID \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер из-за ошибки в setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: не удалоÑÑŒ открыть файл протокола \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер (код ошибки: %lu)\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr ""
+"%s: не удалоÑÑŒ ограничить размер дампа памÑти; запрещено жёÑтким "
+"ограничением\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: не удалоÑÑŒ прочитать файл \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: в файле параметров \"%s\" должна быть ровно одна Ñтрока\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: не удалоÑÑŒ отправить Ñигнал оÑтановки (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\"\n"
+msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ "
+"верÑии %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: Ñбой при инициализации ÑиÑтемы баз данных\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr ""
+"%s: возможно, уже работает другой Ñервер; вÑÑ‘ же пробуем запуÑтить Ñтот "
+"Ñервер\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "ожидание запуÑка Ñервера..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " готово\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "Ñервер запущен\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " прекращение ожиданиÑ\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: Ñервер не запуÑтилÑÑ Ð·Ð° отведённое времÑ\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: не удалоÑÑŒ запуÑтить Ñервер\n"
+"Изучите протокол выполнениÑ.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "Ñервер запуÑкаетÑÑ\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: файл PID \"%s\" не ÑущеÑтвует\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Запущен ли Ñервер?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: оÑтановить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "Ñервер оÑтанавливаетÑÑ\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñервера..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " ошибка\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: Ñервер не оÑтанавливаетÑÑ\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"ПОДСКÐЗКÐ: Параметр \"-m fast\" может ÑброÑить ÑеанÑÑ‹ принудительно,\n"
+"не дожидаÑÑÑŒ, пока они завершатÑÑ Ñами.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "Ñервер оÑтановлен\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "производитÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° запуÑка Ñервера в любом Ñлучае\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: перезапуÑтить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "ПожалуйÑта, оÑтановите его и повторите попытку.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: похоже, что Ñтарый Ñерверный процеÑÑ (PID: %d) иÑчез\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "Ñервер запуÑкаетÑÑ, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: перезагрузить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: не удалоÑÑŒ отправить Ñигнал перезагрузки (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "Ñигнал отправлен Ñерверу\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: повыÑить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он выполнÑетÑÑ Ð² монопольном режиме\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: повыÑить Ñервер Ð½ÐµÐ»ÑŒÐ·Ñ - он работает не в режиме резерва\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: не удалоÑÑŒ Ñоздать файл \"%s\" Ñ Ñигналом к повышению: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: не удалоÑÑŒ запиÑать файл \"%s\" Ñ Ñигналом к повышению: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: не удалоÑÑŒ отправить Ñигнал к повышению (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: ошибка при удалении файла \"%s\" Ñ Ñигналом к повышению: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "ожидание Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ñервера..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "Ñервер повышен\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: повышение Ñервера не завершилоÑÑŒ за отведённое времÑ\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "Ñервер повышаетÑÑ\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr ""
+"%s: не удалоÑÑŒ прокрутить файл журнала; Ñервер работает в монопольном режиме "
+"(PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: не удалоÑÑŒ Ñоздать файл \"%s\" Ñ Ñигналом к прокрутке журнала: %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: не удалоÑÑŒ запиÑать файл \"%s\" Ñ Ñигналом к прокрутке журнала: %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: не удалоÑÑŒ отправить Ñигнал к прокрутке журнала (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr ""
+"%s: ошибка при удалении файла \"%s\" Ñ Ñигналом к прокрутке журнала: %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "Ñигнал Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¸ файла журнала отправлен Ñерверу\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: Ñервер работает в монопольном режиме (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: Ñервер работает (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: Ñервер не работает\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: не удалоÑÑŒ отправить Ñигнал %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый файл\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: не удалоÑÑŒ найти иÑполнÑемый файл postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: не удалоÑÑŒ открыть менеджер Ñлужб\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: Ñлужба \"%s\" уже зарегиÑтрирована\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: не удалоÑÑŒ зарегиÑтрировать Ñлужбу \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: Ñлужба \"%s\" не зарегиÑтрирована\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: не удалоÑÑŒ открыть Ñлужбу \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: ошибка при удалении Ñлужбы \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Ожидание запуÑка Ñервера...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Превышено Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑƒÑка Ñервера\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Сервер запущен и принимает подключениÑ\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: не удалоÑÑŒ запуÑтить Ñлужбу \"%s\" (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: не удалоÑÑŒ получить LUID Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸Ð¹ (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: не удалоÑÑŒ получить информацию о маркере (код ошибки: %lu)\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: нехватка памÑти\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s - Ñто утилита Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸, запуÑка, оÑтановки и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñервером "
+"PostgreSQL.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s] [-o ПÐРÐМЕТРЫ]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-l ИМЯ-ФÐЙЛÐ] [-W] [-t СЕК] [-s]\n"
+" [-o ПÐРÐМЕТРЫ] [-p ПУТЬ] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-m РЕЖИМ-ОСТÐÐОВКИ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-m РЕЖИМ-ОСТÐÐОВКИ] [-W] [-t СЕК] [-s]\n"
+" [-o ПÐРÐМЕТРЫ] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D КÐТÐЛОГ-ДÐÐÐЫХ]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill СИГÐÐЛ PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o "
+"OPTIONS]\n"
+msgstr ""
+" %s register [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-N ИМЯ-СЛУЖБЫ] [-U ПОЛЬЗОВÐТЕЛЬ] [-P "
+"ПÐРОЛЬ]\n"
+" [-S ТИП-ЗÐПУСКÐ] [-e ИСТОЧÐИК] [-W] [-t СЕК] [-s] [-o "
+"ПÐРÐМЕТРЫ]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N ИМЯ-СЛУЖБЫ]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Общие параметры:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=КÐТÐЛОГ раÑположение хранилища баз данных\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid ""
+" -e SOURCE event source for logging when running as a service\n"
+msgstr ""
+" -e ИСТОЧÐИК иÑточник Ñобытий, уÑтанавливаемый при запиÑи в "
+"журнал,\n"
+" когда Ñервер работает в виде Ñлужбы\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr ""
+" -s, --silent выводить только ошибки, без информационных "
+"Ñообщений\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr ""
+" -t, --timeout=СЕК Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании параметра -w\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ (по умолчанию)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "ЕÑли параметр -D опущен, иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Параметры запуÑка и перезапуÑка:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files указать postgres Ñоздавать дампы памÑти\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files неприменимо на Ñтой платформе\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr ""
+" -l, --log=ФÐЙЛ запиÑывать (или добавлÑÑ‚ÑŒ) протокол Ñервера в "
+"ФÐЙЛ.\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=ПÐРÐМЕТРЫ передаваемые postgres (иÑполнÑемому файлу "
+"PostgreSQL)\n"
+" или initdb параметры командной Ñтроки\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ПУТЬ-К-POSTGRES обычно не требуетÑÑ\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Параметры оÑтановки и перезапуÑка:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid ""
+" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr ""
+" -m, --mode=РЕЖИМ может быть \"smart\", \"fast\" или \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Режимы оÑтановки:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart закончить работу поÑле Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñех клиентов\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast закончить Ñразу, в штатном режиме (по умолчанию)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid ""
+" immediate quit without complete shutdown; will lead to recovery on "
+"restart\n"
+msgstr ""
+" immediate закончить немедленно, в ÑкÑтренном режиме; влечёт за Ñобой\n"
+" воÑÑтановление при перезапуÑке\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Разрешённые Ñигналы Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ kill:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Параметры Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации и удалениÑ:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid ""
+" -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N ИМЯ-СЛУЖБЫ Ð¸Ð¼Ñ Ñлужбы Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr ""
+" -P ПÐРОЛЬ пароль учётной запиÑи Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr ""
+" -U ПОЛЬЗОВÐТЕЛЬ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S ТИП-ЗÐПУСКРтип запуÑка Ñлужбы Ñервера PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Типы запуÑка:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid ""
+" auto start service automatically during system startup (default)\n"
+msgstr ""
+" auto запуÑкать Ñлужбу автоматичеÑки при Ñтарте ÑиÑтемы (по "
+"умолчанию)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand запуÑкать Ñлужбу по требованию\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: неизвеÑтный режим оÑтановки \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: нераÑпознанное Ð¸Ð¼Ñ Ñигнала \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: нераÑпознанный тип запуÑка \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: не удалоÑÑŒ определить каталог данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: управлÑющий файл, по-видимому, иÑпорчен\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"ЗапуÑкать %s от имени root нельзÑ.\n"
+"ПожалуйÑта, переключитеÑÑŒ на обычного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например,\n"
+"иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ \"su\"), который будет запуÑкать Ñерверный процеÑÑ.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: параметр -S не поддерживаетÑÑ Ð² Ñтой ОС\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: Ñлишком много аргументов командной Ñтроки (первый: \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: отÑутÑтвуют аргументы Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° kill\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: нераÑпознанный режим работы \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: команда не указана\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid ""
+"%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr ""
+"%s: каталог баз данных не указан и Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA не "
+"уÑтановлена\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: в параметре -w Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ отноÑительный путь к каталогу "
+#~ "Ñокетов\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: параметр -w не поддерживаетÑÑ Ð¿Ñ€Ð¸ запуÑке Ñервера до верÑии 9.1\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: could not stat file \"%s\": %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: не удалоÑÑŒ получить информацию о файле \"%s\": %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s: this data directory appears to be running a pre-existing postmaster\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s: похоже, что Ñ Ñтим каталогом уже работает управлÑющий процеÑÑ "
+#~ "postmaster\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for start or stop:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Параметры запуÑка и оÑтановки Ñервера:\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Options for stop, restart, or promote:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Параметры оÑтановки, перезапуÑка и повышениÑ:\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Promotion modes are:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Режимы повышениÑ:\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " %s promote [-w] [-t SECS] [-D DATADIR] [-s]\n"
+#~ msgstr " %s promote [-w] [-t СЕК] [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s]\n"
+
+#~ msgid ""
+#~ " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "
+#~ "\"OPTIONS\"]\n"
+#~ msgstr ""
+#~ " %s start [-w] [-t СЕК] [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s] [-l ИМЯ-ФÐЙЛÐ]\n"
+#~ " [-o \"ПÐРÐМЕТРЫ\"]\n"
+
+#~ msgid ""
+#~ " -I, --idempotent don't error if server already running or "
+#~ "stopped\n"
+#~ msgstr ""
+#~ " -I, --idempotent не Ñчитать ошибкой, еÑли он уже запущен или "
+#~ "оÑтановлен\n"
+
+#~ msgid ""
+#~ " fast promote quickly without waiting for checkpoint completion\n"
+#~ msgstr ""
+#~ " fast быÑтрое повышение, без Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ "
+#~ "точки\n"
+
+#~ msgid " smart promote after performing a checkpoint\n"
+#~ msgstr " smart повышение поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ точки\n"
+
+#, c-format
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr ""
+#~ "%s: ПРЕДУПРЕЖДЕÐИЕ: в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s: WARNING: could not locate all job object functions in system API\n"
+#~ msgstr ""
+#~ "%s: ПРЕДУПРЕЖДЕÐИЕ: не удалоÑÑŒ найти вÑе функции Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°Ð¼Ð¸ в "
+#~ "ÑиÑтемном API\n"
+
+#~ msgid "%s: another server might be running\n"
+#~ msgstr "%s: возможно, работает другой Ñервер\n"
+
+#~ msgid "%s: could not create log file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ Ñоздать файл журнала \"%s\": %s\n"
+
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s: не удалоÑÑŒ дождатьÑÑ Ñервера вÑледÑтвие ошибки конфигурации\n"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(По умолчанию ожидание имеет меÑто при оÑтановке, но не при "
+#~ "(пере)запуÑке.)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕÐИЕ: активен режим ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\"\n"
+#~ "Выключение произойдёт только при вызове pg_stop_backup().\n"
+#~ "\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %s"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "Ñервер вÑÑ‘ ещё запуÑкаетÑÑ\n"
diff --git a/src/bin/pg_ctl/po/sv.po b/src/bin/pg_ctl/po/sv.po
new file mode 100644
index 0000000..3ab0f95
--- /dev/null
+++ b/src/bin/pg_ctl/po/sv.po
@@ -0,0 +1,858 @@
+# Swedish message translation file for pg_ctl
+# Dennis Björklund <db@zigo.dhs.org>, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Magnus Hagander <magnus@hagander.net>, 2010.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2013, 2014.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-01 14:18+0000\n"
+"PO-Revision-Date: 2023-08-30 09:01+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ogiltig binär \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "kunde inte läsa binär \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: katalogen \"%s\" existerar inte\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: kunde inte komma åt katalogen \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: katalogen \"%s\" innehåller inte något databaskluster.\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: kunde inte öppna PID-fil \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID-filen \"%s\" är tom\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: ogiltig data i PID-fil \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: kunde inte starta servern: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: kunde inte starta servern då setsid() misslyckades: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: kunde inte öppna logg-fil \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: kunde inte starta servern: felkod %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: kan inte sätta storleksgränsning på core-fil; tillåts inte av hård gräns\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: kunde inte läsa filen \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: inställningsfilen \"%s\" måste bestå av en enda rad.\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: kunde inte skicka stopp-signal (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: skapande av databaskluster misslyckades\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: en annan server verkar köra; försöker starta servern ändå.\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "väntar på att servern skall starta..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " klar\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "servern startad\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " avslutade väntan\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: servern startade inte i tid\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: kunde inte starta servern\n"
+"Undersök logg-utskriften.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "servern startar\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID-filen \"%s\" finns inte\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Kör servern?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: Kan inte stanna servern. En-användar-server i drift (PID: %d).\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "servern stänger ner\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "väntar på att servern skall stänga ner..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " misslyckades\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: servern stänger inte ner\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"TIPS: Flaggan \"-m fast\" avslutar sessioner omedelbart, i stället för att\n"
+"vänta på deras självvalda avslut.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "servern är stoppad\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "försöker starta servern ändå\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: kan inte starta om servern. En-användar-server kör (PID: %d).\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Var vänlig att stanna en-användar-servern och försök sedan igen.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: gamla serverprocessen (PID: %d) verkar vara borta\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "startar servern ändå\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: kan inte ladda om servern; en-användar-server kör (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: kunde inte skicka signalen \"reload\" (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "servern är signalerad\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: kan inte befordra servern; en-användar-server kör (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: kan inte befordra servern; servern är inte i beredskapsläge.\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skapa befordringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skriva befordringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: kunde inte skicka befordringssignal (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: kunde inte ta bort befordringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "väntar på att servern skall befordras..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "servern befordrad\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: servern befordrades inte i tid\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "servern befordras\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: kan inte rotera loggfil; en-användar-server kör (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skapa loggroteringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: kunde inte skriva loggroteringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: kunde inte skicka signalen för loggrotering (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: kunde inte ta bort loggroteringssignalfil \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "servern är signalerad att rotera loggfil\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: en-användar-server kör. (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: servern kör (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: ingen server kör\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: kunde inte skicka signal %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: kunde inte hitta körbar postgres.\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: kunde inte öppna tjänstehanteraren\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: tjänsten \"%s\" är redan registrerad\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte registrera tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: tjänsten \"%s\" är inte registrerad\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte öppna tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte avregistrera tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Väntar på serverstart...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Tidsfristen ute vid väntan på serverstart\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Server startad och accepterar nu anslutningar\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: kunde inte starta tjänsten \"%s\": felkod %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: kunde inte öppna process-token: felkod %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: kunde inte tilldela SID: felkod %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: kunde inte skapa restriktivt styrmärke (token): felkod %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: kunde inte hämta LUID:er för rättigheter: felkod %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: kunde inte hämta token-information: felkod %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: slut på minne\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s är ett verktyg för att initiera, starta, stanna och att styra\n"
+"PostgreSQL-tjänsten.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D DATAKAT] [-s] [-o FLAGGOR]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATAKAT] [-l FILNAMN] [-W] [-t SEK] [-s]\n"
+" [-o FLAGGOR] [-p SOKVÄG] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n"
+" [-o FLAGGOR] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATAKAT] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATAKAT]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D DATAKAT] [-W] [-t SEK] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATAKAT] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAMN PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D DATAKAT] [-N TJÄNSTENAMN] [-U ANVÄNDARNAMN] [-P LÖSENORD]\n"
+" [-S STARTTYPE] [-e KÄLLA] [-W] [-t SEK] [-s] [-o FLAGGOR]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N TJÄNSTNAMN]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Gemensamma flaggor:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATAKAT plats för databasens lagringsarea\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e KÄLLA händelsekälla för loggning när vi kör som en tjänst\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent skriv bara ut fel, inga informationsmeddelanden\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SEK antal sekunder att vänta när växeln -w används\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait vänta på att operationen slutförs (standard)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait vänta inte på att operationen slutförs\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Om flaggan -D inte har angivits så används omgivningsvariabeln PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Flaggor för start eller omstart:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files tillåt postgres att skapa core-filer\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files inte giltig för denna plattform\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILNAMN skriv, eller tillfoga, server-loggen till FILNAMN\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS kommandoradsflaggor som skickas vidare till postgres\n"
+" (PostgreSQL-serverns körbara fil) eller till initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr ""
+" -p SÖKVÄG-TILL-POSTGRES\n"
+" behövs normalt inte\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Flaggor för stopp eller omstart:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=METOD METOD kan vara \"smart\", \"fast\" eller \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Stängningsmetoder är:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart stäng när alla klienter har avslutat\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast stäng omedelbart, med en kontrollerad nedstängning (standard)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate stäng utan kontroller; kommer leda till återställning vid omstart\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"Tillåtna signalnamn för kommando \"kill\":\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Flaggor för registrering och avregistrering:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N TJÄNSTENAMN tjänstenamn att registrera PostgreSQL-servern med\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P LÖSENORD lösenord för konto vid registrering av PostgreSQL-servern\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U NAMN användarnamn för konto vid registrering av PostgreSQL-servern\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S STARTSÄTT sätt att registrera PostgreSQL-servern vid tjänstestart\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"Startmetoder är:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto starta tjänsten automatiskt vid systemstart (förval)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand starta tjänsten vid behov\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: ogiltig stängningsmetod \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: ogiltigt signalnamn \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: ogiltigt startvillkor \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: kunde inte bestämma databaskatalogen från kommandot \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: kontrollfilen verkar vara trasig\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: kan inte köras som root\n"
+"Logga in (t.ex. med \"su\") som den (opriviligerade) användare\n"
+"vilken skall äga serverprocessen.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: flaggan -S stöds inte på denna plattform.\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: för många kommandoradsargument (första är \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: saknar argument för \"kill\"-kommando.\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: okänd operationsmetod \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: ingen operation angiven\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: ingen databaskatalog angiven och omgivningsvariabeln PGDATA är inte satt\n"
+
+#, c-format
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s: VARNING: \"Restricted Token\" stöds inte av plattformen.\n"
+
+#, c-format
+#~ msgid "%s: WARNING: could not locate all job object functions in system API\n"
+#~ msgstr "%s: VARNING: kunde inte hitta alla jobb-funktioner system-API:et.\n"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "kan inte läsa symbolisk länk \"%s\": %m"
diff --git a/src/bin/pg_ctl/po/tr.po b/src/bin/pg_ctl/po/tr.po
new file mode 100644
index 0000000..a90dd50
--- /dev/null
+++ b/src/bin/pg_ctl/po/tr.po
@@ -0,0 +1,962 @@
+# translation of pg_ctl-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2007.
+# Nicolai Tufar <ntufar@gmail.com>, 2004, 2005, 2007.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-24 03:48+0000\n"
+"PO-Revision-Date: 2023-09-05 09:10+0200\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../common/exec.c:172
+#, fuzzy, c-format
+#| msgid "invalid binary \"%s\""
+msgid "invalid binary \"%s\": %m"
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:215
+#, fuzzy, c-format
+#| msgid "could not read binary \"%s\""
+msgid "could not read binary \"%s\": %m"
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:250
+#, fuzzy, c-format
+#| msgid "could not reopen file \"%s\" as stderr: %m"
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "\"%s\" dosyası stderr olarak yeiden açılamadı: %m"
+
+#: ../../common/exec.c:412
+#, fuzzy, c-format
+#| msgid "%s failed: %m"
+msgid "%s() failed: %m"
+msgstr "%s başarısız oldu: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "komut çalıştırılabilir değil"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "komut bulunamadı"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "geçerli dizin belirlenemedi: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: \"%s\" dizini mevcut deÄŸil\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: \"%s\" dizine erişim hatası: %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: \"%s\" dizini bir veritabanı kümesi dizini değil\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: \"%s\" PID dosyası açılamadı: %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: \"%s\" PID dosyası boştur\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: \"%s\" PID dosyasında geçersiz veri\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: sunucu başlatılamadı: %s\n"
+
+#: pg_ctl.c:478
+#, fuzzy, c-format
+#| msgid "%s: could not start server: %s\n"
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: sunucu başlatılamadı: %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: \"%s\" kayıt dosyası açılamıyor: %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: sunucu başlatılamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: core boyutu ayarlanamadı; hard limit tarafından sınırlanmış.\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: \"%s\" dosyası okunamadı\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: \"%s\" seçenek dosyası sadece 1 satır olmalıdır\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: durdurma sinyali başarısız oldu (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" is needed by %s but was not found in the\n"
+#| "same directory as \"%s\".\n"
+#| "Check your installation.\n"
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr ""
+"\"%s\" programına %s tarafından gereksinim duyuluyor, ancak \n"
+"\"%s\" ile aynı dizinde bulunamadı.\n"
+"Kurulumunuzu kontrol ediniz.\n"
+
+#: pg_ctl.c:886
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" was found by \"%s\"\n"
+#| "but was not the same version as %s.\n"
+#| "Check your installation.\n"
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"\"%s\" programı \"%s\" tarafından\n"
+"bulundu ancak %s ile aynı sürüm numarasına sahip değil.\n"
+"Kurulumunuzu kontrol ediniz.\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: veritabanı ilklendirme başarısız oldu\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: başka bir sunucu çalışıyor olabilir; yine de başlatmaya çalışılıyor.\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "sunucunun başlaması bekleniyor..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " tamam\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "sunucu başlatıldı\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr "bekleme durduruldu\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: sunucu zamanında başlamadı\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: sunucu başlatılamadı\n"
+"Kayıt dosyasını inceleyiniz\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "sunucu başlıyor\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: \"%s\" PID dosyası bulunamadı\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Sunucu çalışıyor mu?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: sunucu durdurulamadı; tek kullanıcılı sunucu çalışıyor (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "sunucu kapatılıyor\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "sunucunun kapanması bekleniyor..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " başarısız oldu\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: sunucu kapanmıyor\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"İPUCU: \"-m fast\" seçeneği oturumların kendilerinin bitmesini beklemektense\n"
+"oturumları aniden keser.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "sunucu durduruldu\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "sunucu yine de başlatılmaya çalışılıyor\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: sunucu başlatılamadı; tek kullanıcılı sunucu çalışıyor (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Lütfen tek kullanıcılı sunucuyu durdurun ve yeniden deneyin.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: eski sunucu süreci (PID: %d) kaybolmuştur\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "sunucu yine de başlatılıyor\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: sunucu yeniden yüklenemedi, tek kullanıcılı sunucu çalışıyor (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, fuzzy, c-format
+#| msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: yeniden yükleme sinyali gönderilemedi (PID: %ld): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "sunucuya sinyal gönderildi\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: sunucu yükseltilemedi (promote), tek kullanıcılı sunucu çalışıyor (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: sunucu yükseltilemiyor (promote), sunucu yedek (standby) modda değil\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyası yaratılamadı: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyasına yazılamadı: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: yükseltme (promote) sinyali gönderilemedi (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyası slinemedi: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "sunucunun yükseltilmesi (promote) bekleniyor..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "sunucu yükseltildi (promote)\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: sunucu zamanında yükseltilemedi (promote)\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "sunucu yükeltiliyor (promote)\n"
+
+#: pg_ctl.c:1274
+#, fuzzy, c-format
+#| msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n"
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: sunucu yeniden yüklenemedi, tek kullanıcılı sunucu çalışıyor (PID: %ld)\n"
+
+#: pg_ctl.c:1284
+#, fuzzy, c-format
+#| msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyası yaratılamadı: %s\n"
+
+#: pg_ctl.c:1290
+#, fuzzy, c-format
+#| msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyasına yazılamadı: %s\n"
+
+#: pg_ctl.c:1298
+#, fuzzy, c-format
+#| msgid "%s: could not send reload signal (PID: %ld): %s\n"
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: yeniden yükleme sinyali gönderilemedi (PID: %ld): %s\n"
+
+#: pg_ctl.c:1301
+#, fuzzy, c-format
+#| msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: \"%s\" yükseltme (promote) sinyal dosyası slinemedi: %s\n"
+
+#: pg_ctl.c:1306
+#, fuzzy
+#| msgid "server signaled\n"
+msgid "server signaled to rotate log file\n"
+msgstr "sunucuya sinyal gönderildi\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: sunucu, tek kullanıcı biçiminde çalışıyor (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: sunucu çalışıyor (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: çalışan sunucu yok\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: %d reload sinyali gönderilemedi (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s:Çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: çalıştırılabilir postgres programı bulunamadı\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: servis yöneticisi açılamadı\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: \"%s\" servisi daha önce kaydedilmiştir\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisi kayıt edilemedi: hata kodu %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: \"%s\" servisi kayıtlı değil\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisi açılamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisinin kaydı silinemedi: hata kodu %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "Sunucunun başlaması bekleniyor...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Sunucu başlarken zaman aşımı oldu\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Sunucu başladı ve bağlantı kabul ediyor\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: \"%s\" servisi başlatılamadı: Hata kodu %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: process token açma başarısız: hata kodu %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: SIDler ayrılamadı: Hata kodu %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: kısıtlı andaç (restricted token) oluşturulamıyor: hata kodu %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: yetkiler için LUID'ler alınamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: andaç (token) bilgisi alınamadı: hata kodu %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: yetersiz bellek\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" komutunu kullanabilirsiniz.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL sunucusunu ilklendirmek, başlatmak, durdurmak ya da kontrol etmek için bir araçtır.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_ctl.c:1968
+#, fuzzy, c-format
+#| msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D VERİDİZİN] [-s] [-o SEÇENEKLER]\n"
+
+#: pg_ctl.c:1969
+#, fuzzy, c-format
+#| msgid ""
+#| " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+#| " [-o OPTIONS] [-p PATH] [-c]\n"
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D VERÄ°DÄ°ZÄ°N] [-l DOSYAADI] [-W] [-t SANÄ°YE] [-s]\n"
+" [-o SECENEKLER] [-p YOL] [-c]\n"
+
+#: pg_ctl.c:1971
+#, fuzzy, c-format
+#| msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s stop [-D VERÄ°DÄ°ZÄ°NÄ°] [-m KAPATMA_MODU] [-W] [-t SANÄ°YE] [-s]\n"
+"\n"
+
+#: pg_ctl.c:1972
+#, fuzzy, c-format
+#| msgid ""
+#| " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+#| " [-o OPTIONS] [-c]\n"
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D VERÄ°DÄ°ZÄ°NÄ°] [-m KAPATMA-MODU] [-W] [-t SANÄ°YE] [-s]\n"
+" [-o SEÇENEKLER] [-c]\n"
+"\n"
+
+#: pg_ctl.c:1974
+#, fuzzy, c-format
+#| msgid " %s reload [-D DATADIR] [-s]\n"
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D VERÄ°_DÄ°ZÄ°NÄ°] [-s]\n"
+
+#: pg_ctl.c:1975
+#, fuzzy, c-format
+#| msgid " %s status [-D DATADIR]\n"
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D VERÄ°_DÄ°ZÄ°NÄ°]\n"
+
+#: pg_ctl.c:1976
+#, fuzzy, c-format
+#| msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr ""
+" %s promote [-D VERÄ°DÄ°ZÄ°NÄ°] [-W] [-t SANÄ°YE] [-s]\n"
+"\n"
+
+#: pg_ctl.c:1977
+#, fuzzy, c-format
+#| msgid " %s reload [-D DATADIR] [-s]\n"
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D VERÄ°_DÄ°ZÄ°NÄ°] [-s]\n"
+
+#: pg_ctl.c:1978
+#, fuzzy, c-format
+#| msgid " %s kill SIGNALNAME PID\n"
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SİNYAL_ADI SÜREÇ_NUMARASI\n"
+
+#: pg_ctl.c:1980
+#, fuzzy, c-format
+#| msgid ""
+#| " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+#| " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D VERÄ°DÄ°ZÄ°NÄ°] [-N SERVISADI] [-U KULLANICIADI] [-P PAROLA]\n"
+" [-S BAŞLATMA-TİPİ] [-e KAYNAK] [-W] [-t SANİYE] [-s] [-o SEÇENEKLER]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVÄ°S_ADI]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"Ortak seçenekler:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=VERİDİZİNİ verinin tutulacağı alan\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE servis olarak çalışırken loglama için olay (event) kaynağı\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent sadece hataları yazar, hiç bir bilgi mesajı yazmaz\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SANİYE -w seçeneğini kullanırken beklenecek saniye\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait işlem bitene kadar bekle (varsayılan)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait iÅŸlem bitene kadar bekleme\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Eğer -D seçeneği gözardı edilirse, PGDATA çevresel değişkeni kullanılacaktır.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"Başlamak ya da yeniden başlamak için seçenekler:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files postgres'in core dosyaları oluşturmasına izin ver\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files bu platformda uygulanmaz\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=DOSYA_ADI sunucu loglarını DOSYA_ADI dosyasına yaz (ya da dosyanın sonuna ekle).\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=SEÇENEKLER postgres'e (PostgreSQL sunucusu çalıştırılabilir dosyası)\n"
+" ya da initdb'ye geçilecek komut satırı seçenekleri\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES normalde gerekli deÄŸildir\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"Durdurmak ya da yeniden başlatmak için seçenekler:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MOD MOD \"smart\", \"fast\", veya \"immediate\" olabilir\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"Kapatma modları:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart tüm istemciler bağlantılarını kestikten sonra dur\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast düzgünce kapanarak direk olarak dur (varsayılan)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate tam bir kapanma gerçekleşmeden dur; yeniden başladığında kurtarma modunda açılır\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"kill için izin verilen sinyal adları:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"Kaydetmek ya da kaydı silmek için seçenekler:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME PostgreSQL sunucusunu kaydedeceğiniz servis adı\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD PostgreSQL sunucusunu kaydetmek için hesabın şifresi\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME PostgreSQL sunucusunu kaydetmek için gerekli kullanıcı adı\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE PostgreSQL sunucusunu kaydedeceÄŸiniz servis baÅŸlama tipi\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"BaÅŸlama tipleri: \n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto sistem açılışında servisi otomatik başlat (varsayılan)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand hizmeti talep üzerine başlat\n"
+
+#: pg_ctl.c:2031
+#, fuzzy, c-format
+#| msgid ""
+#| "\n"
+#| "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@postgresql.org> adresine bildiriniz.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr ""
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: geçersiz kapanma modu \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: geçersiz sinyal adı \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: geçersiz başlama tipi \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: \"%s\" komutu kullanılarak veri dizini belirlenemedi\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: kontrol dosyası bozuk görünüyor\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: root olarak çalıştırılamaz\n"
+"Lütfen (yani \"su\" kullanarak) sunucu sürecine sahip olacak (yetkisiz) kullanıcı\n"
+"ile sisteme giriş yapınız.\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S seçeneği bu platformda desteklenmiyor.\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: çok fazla komut satırı argümanı (ilki : \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: kill modu için eksik argümanlar\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: geçersiz işlem modu \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: hiçbir işlem belirtilmedi\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: Hiçbir veritabanı dizini belirtilmemiş ve PGDATA çevresel değişkeni boş\n"
+
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr " %s start [-w] [-t saniye] [-D VERİ_DİZİNİ] [-s] [-l DOSYA_ADI] [-o \"SEÇENEKLER\"]\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help Bu yardımı göster ve çık\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm numarasını yazar ve çıkar\n"
+
+#~ msgid ""
+#~ "%s is a utility to start, stop, restart, reload configuration files,\n"
+#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s başlatmak, durdurmak, yeniden başlatmak, yapılandırma dosyalarını yeniden yüklemek\n"
+#~ "PostgreSQL sunucusunun durumunu bildirmek, ya da PostgreSQL sürecini öldürmek için bir yardımcı programdır\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s: UYARI: bu platformda restricted token oluşturulamıyor\n"
+
+#, c-format
+#~ msgid "%s: WARNING: could not locate all job object functions in system API\n"
+#~ msgstr "%s: UYARI: sistem API içinde tüm iş nesnesi fonksiyonlarının yeri belirlenemedi\n"
+
+#~ msgid "%s: could not start server: exit code was %d\n"
+#~ msgstr "%s: sunucu başlatılamadı: çıkış kodu: %d\n"
+
+#, fuzzy
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "geçersiz ayarlarından dolayı autovacuum çalıştırılamadı"
+
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(Ön tanımlı işlem kapanmak için beklemektir; başlamak ya da yeniden başlamak değildir.)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "WARNING: çevrimiçi yedekleme modu etkin\n"
+#~ "pg_stop_backup() çalıştırılmadam sunucu kapatılmayacaktır.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
+
+#, c-format
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "geçerli dizin tespit edilemedi: %s"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "symbolic link \"%s\" okuma hatası"
+
+#, c-format
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose başarısız oldu: %s"
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "sunucu hala başlıyor\n"
diff --git a/src/bin/pg_ctl/po/uk.po b/src/bin/pg_ctl/po/uk.po
new file mode 100644
index 0000000..c1fcbe9
--- /dev/null
+++ b/src/bin/pg_ctl/po/uk.po
@@ -0,0 +1,798 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:18+0000\n"
+"PO-Revision-Date: 2023-12-19 15:37\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_ctl.pot\n"
+"X-Crowdin-File-ID: 937\n"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "невірний бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ поточний робочий каталог: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ \"%s\" не Ñ–Ñнує\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: немає доÑтупу до каталогу \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: каталог \"%s\" не Ñ” каталогом клаÑтера бази даних\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл PID \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: файл PID \"%s\" пуÑтий\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: невірні дані у файлі PID \"%s\"\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер через помилку setsid(): %s\n"
+
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер: код помилки %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: не вдалоÑÑ Ð²Ñтановити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір файлу; заборонено жорÑтким лімітом\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: файл параметрів \"%s\" повинен міÑтити рівно один Ñ€Ñдок\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñтоп-Ñигнал (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ ініціалізацію ÑиÑтеми бази даних\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: мабуть, інший Ñервер вже працює; у будь-Ñкому разі Ñпробуємо запуÑтити Ñервер\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "очікуєтьÑÑ Ð·Ð°Ð¿ÑƒÑк Ñерверу..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " готово\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "Ñервер запущено\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: Ñервер не було запущено вчаÑно\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid "%s: could not start server\n"
+"Examine the log output.\n"
+msgstr "%s: неможливо запуÑтити Ñервер\n"
+"ПередивітьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð» виконаннÑ.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "запуÑк Ñерверу\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: файл PID \"%s\" не Ñ–Ñнує\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "Сервер працює?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: не можливо зупинити Ñервер; Ñервер запущений в режимі single-user (PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "Ñервер зупинÑєтьÑÑ\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "очікуєтьÑÑ Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ° Ñерверу..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " помилка\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: Ñервер не зупинено\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr "ПІДКÐЗКÐ: Режим \"-m fast\" закриває ÑеÑÑ–Ñ— відразу, не чекаючи на Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð¹Ð¾Ð²Ð°Ð½Ñ– ÑеÑÑ–Ñми.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "Ñервер зупинено\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "Ñпроба запуÑку Ñерверу в будь-Ñкому разі\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: не можливо перезапуÑтити Ñервер; Ñервер запущений в режимі single-user (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "Будь лаÑка, припиніть однокориÑтувацький Ñервер та Ñпробуйте ще раз.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: Ñтарий Ñерверний Ð¿Ñ€Ð¾Ñ†ÐµÑ (PID: %d), здаєтьÑÑ, зник\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "запуÑк Ñерверу в будь-Ñкому разі\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: не можливо перезапуÑтити Ñервер; Ñервер запущений в режимі single-user (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: не можливо надіÑлати Ñигнал Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "Ñерверу надіÑлано Ñигнал\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: неможливо підвищити Ñервер; Ñервер запущено в режимі single-user (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: неможливо підвищити Ñервер; Ñервер запущено не в режимі резерву\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: неможливо Ñтворити файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: неможливо запиÑати файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: неможливо надіÑлати Ñигнал Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ (PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: неможливо видалити файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "очікуєтьÑÑ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñерверу..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "Ñервер підвищено\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: Ñервер не було підвищено вчаÑно\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "Ñервер підвищуєтьÑÑ\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: не можливо розвернути файл журналу; Ñервер працює в режимі одного кориÑтувача (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: не вдалоÑÑ Ñтворити файл Ñигналу розвороту журналу \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл Ñигналу розвороту журналу \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал розвороту журналу (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл Ñигналу розвороту журналу \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "Ñерверу надіÑлано Ñигнал Ð´Ð»Ñ Ñ€Ð¾Ð·Ð²Ð¾Ñ€Ð¾Ñ‚ файлу журналу\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: однокориÑтувацький Ñервер працює (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: Ñервер працює (PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: Ñервер не працює \n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ехе файл влаÑної програми\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ виконану програму postgres\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ менеджер Ñлужб\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: Ñлужба \"%s\" вже зареєÑтрована \n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати Ñлужбу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: Ñлужба \"%s\" не зареєÑтрована \n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñлужбу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлужбу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿ÑƒÑку Ñервера...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "Перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿ÑƒÑку Ñервера\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "Сервер запущений Ñ– приймає з'єднаннÑ\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ Ñлужбу \"%s\": код помилки %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ LUIDs Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²: код помилки %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію токену: код помилки %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: бракує пам'ÑÑ‚Ñ–\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n"
+msgstr "%s - це утиліта Ð´Ð»Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—, запуÑку, зупинки Ñ– контролю Ñерверу PostgreSQL.\n\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D КÐТÐЛОГ-ДÐÐИХ] [-s] [-o ПÐРÐМЕТРИ]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr " %s start [-D КÐТÐЛОГ-ДÐÐИХ] [-l ІМ'Я-ФÐЙЛ] [-W] [-t СЕК] [-s]\n"
+" [-o ПÐРÐМЕТРИ] [-p ШЛЯХ] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D КÐТÐЛОГ-ДÐÐИХ] [-m РЕЖИМ-ЗУПИÐКИ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr " %s restart [-D КÐТÐЛОГ-ДÐÐИХ] [-m РЕЖИМ-ЗУПИÐКИ] [-W] [-t СЕК] [-s]\n"
+" [-o ПÐРÐМЕТРИ] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D КÐТÐЛОГ-ДÐÐИХ] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D КÐТÐЛОГ-ДÐÐИХ] [-W] [-t СЕК] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill ІМ'Я-СИГÐÐЛУ PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr " %s register [-D КÐТÐЛОГ-ДÐÐИХ] [-N ІМ'Я-СЛУЖБИ] [-U ІМ'Я-КОРИСТУВÐЧÐ] [-P ПÐРОЛЬ]\n"
+" [-S ТИП-ЗÐПУСКУ] [-e ДЖЕРЕЛО] [-W] [-t СЕК] [-s] [-o ПÐРÐМЕТРИ]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N ІМ'Я-СЛУЖБИ]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid "\n"
+"Common options:\n"
+msgstr "\n"
+"Загальні параметри:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=КÐТÐЛОГ-ДÐÐИХ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñтору Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e ДЖЕРЕЛО джерело подій Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ при запуÑку в ÑкоÑÑ‚Ñ– поÑлуги\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent виводити лише помилки, без інформаційних повідомлень\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=СЕК Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ викориÑтанні -w параметра\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— (за замовчуваннÑм)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait не чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ—\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "Якщо -D параметр пропущено, викориÑтовувати змінну Ñередовища PGDATA.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid "\n"
+"Options for start or restart:\n"
+msgstr "\n"
+"Параметри запуÑку або перезапуÑку:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files дозволÑти postgres Ñтворювати дампи пам'ÑÑ‚Ñ–\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files недопуÑтимо цією платформою\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=ФÐЙЛ запиÑувати (або додавати) протокол Ñлужби до ФÐЙЛ\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid " -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr " -o, --options=ПÐРÐМЕТРИ параметри командного Ñ€Ñдку Ð´Ð»Ñ PostgreSQL або initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p ШЛЯХ-ДО-СЕРВЕРУ зазвичай зайвий\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid "\n"
+"Options for stop or restart:\n"
+msgstr "\n"
+"Параметри Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ перезапуÑку:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=РЕЖИМ РЕЖИМ може бути \"smart\", \"fast\", або \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid "\n"
+"Shutdown modes are:\n"
+msgstr "\n"
+"Режими зупинки:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart вийти піÑÐ»Ñ Ð²Ñ–Ð´'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÑƒÑÑ–Ñ… клієнтів\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast вийти негайно з коректним вимкненнÑм (за замовченнÑм)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate вийти негайно без повної процедури. Приведе до Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑку\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid "\n"
+"Allowed signal names for kill:\n"
+msgstr "\n"
+"Дозволенні Ñигнали Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ kill:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid "\n"
+"Options for register and unregister:\n"
+msgstr "\n"
+"Параметри Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації Ñ– видаленнÑ: \n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N ІМ'Я-СЛУЖБИ ім'Ñ Ñлужби під Ñким зареєÑтрувати Ñервер PostgreSQL\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P ПÐРОЛЬ пароль облікового запиÑу Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації Ñерверу PostgreSQL\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U КОРИСТУВÐЧ ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача під Ñким зареєÑтрувати Ñервер PostgreSQL\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S ТИП-ЗÐПУСКУ тип запуÑку Ñлужби Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації Ñерверу PostgreSQL\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid "\n"
+"Start types are:\n"
+msgstr "\n"
+"Типи запуÑку:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto запуÑкати Ñервер автоматично під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку ÑиÑтеми (за замовчуваннÑм)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand запуÑкати Ñервер за потреби\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: невідомий режим Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: невідомий Ñигнал \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: невідомий тип запуÑку \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: неможливо визначити каталог даних за допомогою команди \"%s\"\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: контрольний файл видаєтьÑÑ Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð¸Ð¼\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid "%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr "%s: не може бути запущеним від ім'Ñ Ñупер-кориÑтувача\n"
+" Будь лаÑка увійдіть (викориÑтовуючи наприклад, \"su\") Ñк (непривілейований) кориÑтувач Ñкий буде мати\n"
+"Ñвій Ñерверний процеÑ. \n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: параметр -S не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ платформою\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: забагато аргументів у командному Ñ€Ñдку (перший \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: відÑутні аргументи Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ kill\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: невідомий режим роботи \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: команда не вказана\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: не вказано каталог даних Ñ– змінна Ñередовища PGDATA не вÑтановлена\n"
+
diff --git a/src/bin/pg_ctl/po/zh_CN.po b/src/bin/pg_ctl/po/zh_CN.po
new file mode 100644
index 0000000..d678a9e
--- /dev/null
+++ b/src/bin/pg_ctl/po/zh_CN.po
@@ -0,0 +1,879 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-24 03:48+0000\n"
+"PO-Revision-Date: 2023-04-24 09:26+0200\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified)<zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../common/exec.c:172
+#, fuzzy, c-format
+#| msgid "invalid binary \"%s\""
+msgid "invalid binary \"%s\": %m"
+msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:215
+#, fuzzy, c-format
+#| msgid "could not read binary \"%s\""
+msgid "could not read binary \"%s\": %m"
+msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ"
+
+#: ../../common/exec.c:250
+#, fuzzy, c-format
+#| msgid "could not reopen file \"%s\" as stderr: %m"
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "无法作为标准错误é‡æ–°æ‰“开文件 \"%s\": %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "无法执行命令"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, 退出ç ä¸º %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¿›ç¨‹è¢«ä¾‹å¤–(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¿›ç¨‹è¢«ä¿¡å· %d 终止: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, æœªçŸ¥çŠ¶æ€ %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "无法得到当å‰å·¥ä½œç›®å½•: %s\n"
+
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: 目录 \"%s\" ä¸å­˜åœ¨\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: 无法访问目录 \"%s\": %s\n"
+
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: 目录 \"%s\"ä¸æ˜¯ä¸€ä¸ªæ•°æ®åº“集群目录\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: 无法打开 PID 文件 \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID 文件 \"%s\" 为空\n"
+
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PID文件 \"%s\" 中存在无效数æ®\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: 无法å¯åŠ¨æœåŠ¡å™¨ï¼š%s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: 由于setsid()调用失败无法å¯åŠ¨æœåŠ¡å™¨ï¼š%s\n"
+
+# command.c:1148
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s:无法开å¯æ—¥å¿—文件 \"%s\":%s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s:无法å¯åŠ¨æœåŠ¡å™¨ï¼šé”™è¯¯ä»£ç %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: ä¸èƒ½è®¾ç½®æ ¸å¿ƒæ–‡ä»¶å¤§å°çš„é™åˆ¶;ç£ç›˜é™é¢ä¸å…许\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: 无法读å–文件 \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: 选项文件 \"%s\" åªèƒ½æœ‰ä¸€è¡Œ\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: 无法å‘é€åœæ­¢ä¿¡å· (PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" is needed by %s but was not found in the\n"
+#| "same directory as \"%s\".\n"
+#| "Check your installation."
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr ""
+"%2$s需è¦ç¨‹åº\"%1$s\"\n"
+"但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n"
+"检查您的安装."
+
+#: pg_ctl.c:886
+#, fuzzy, c-format
+#| msgid ""
+#| "The program \"%s\" was found by \"%s\"\n"
+#| "but was not the same version as %s.\n"
+#| "Check your installation."
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr ""
+"程åº\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本ä¸åŒ.\n"
+"检查您的安装."
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: æ•°æ®åº“系统åˆå§‹åŒ–失败\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: 其他æœåŠ¡å™¨è¿›ç¨‹å¯èƒ½æ­£åœ¨è¿è¡Œ; å°è¯•å¯åŠ¨æœåŠ¡å™¨è¿›ç¨‹\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "等待æœåŠ¡å™¨è¿›ç¨‹å¯åŠ¨ ..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " 完æˆ\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "æœåŠ¡å™¨è¿›ç¨‹å·²ç»å¯åŠ¨\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " å·²åœæ­¢ç­‰å¾…\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: æœåŠ¡æ²¡æœ‰åŠæ—¶å¯åŠ¨\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: 无法å¯åŠ¨æœåŠ¡å™¨è¿›ç¨‹\n"
+"检查日志输出.\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "正在å¯åŠ¨æœåŠ¡å™¨è¿›ç¨‹\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID 文件 \"%s\" ä¸å­˜åœ¨\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "æœåŠ¡å™¨è¿›ç¨‹æ˜¯å¦æ­£åœ¨è¿è¡Œ?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: 无法åœæ­¢æœåŠ¡å™¨è¿›ç¨‹; 正在è¿è¡Œ å•ç”¨æˆ·æ¨¡å¼æœåŠ¡å™¨è¿›ç¨‹(PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "正在关闭æœåŠ¡å™¨è¿›ç¨‹\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "等待æœåŠ¡å™¨è¿›ç¨‹å…³é—­ ..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " 失败\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: server进程没有关闭\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr ""
+"æ示: \"-m fast\" 选项å¯ä»¥ç«‹å³æ–­å¼€ä¼šè¯, 而ä¸ç”¨\n"
+"等待会è¯å‘èµ·çš„æ–­è¿ž.\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "æœåŠ¡å™¨è¿›ç¨‹å·²ç»å…³é—­\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "å°è¯•å¯åŠ¨æœåŠ¡å™¨è¿›ç¨‹\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: 无法é‡å¯æœåŠ¡å™¨è¿›ç¨‹; å•ç”¨æˆ·æ¨¡å¼æœåŠ¡å™¨è¿›ç¨‹æ­£åœ¨è¿è¡Œ (PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "请终止å•ç”¨æˆ·æ¨¡å¼æœåŠ¡å™¨è¿›ç¨‹ï¼Œç„¶åŽå†é‡è¯•.\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: 原有的进程(PID: %d)å¯èƒ½å·²ç»ä¸å­˜åœ¨äº†\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "正在å¯åŠ¨æœåŠ¡å™¨è¿›ç¨‹\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: 无法é‡æ–°åŠ è½½æœåŠ¡å™¨è¿›ç¨‹ï¼›æ­£åœ¨è¿è¡Œå•ç”¨æˆ·æ¨¡å¼çš„æœåŠ¡å™¨è¿›ç¨‹ (PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: 无法å‘é€é‡è½½ä¿¡å· (PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "æœåŠ¡å™¨è¿›ç¨‹å‘出信å·\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: 无法é‡æ–°åŠ è½½æœåŠ¡å™¨è¿›ç¨‹ï¼›æ­£åœ¨è¿è¡Œå•ç”¨æˆ·æ¨¡å¼çš„æœåŠ¡å™¨è¿›ç¨‹ (PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: 无法é‡æ–°åŠ è½½æœåŠ¡å™¨è¿›ç¨‹ï¼›æœåŠ¡å™¨æ²¡æœ‰è¿è¡Œåœ¨standby模å¼ä¸‹\n"
+
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: 无法创建é‡æ–°åŠ è½½ä¿¡å·æ–‡ä»¶ \"%s\": %s\n"
+
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: 无法写入é‡æ–°åŠ è½½æ–‡ä»¶ \"%s\": %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: 无法å‘é€é‡è½½ä¿¡å·(PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: 无法移动é‡æ–°åŠ è½½ä¿¡å·æ–‡ä»¶ \"%s\": %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "等待æœåŠ¡å™¨è¿›ç¨‹åŠ è½½ ..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "æœåŠ¡å™¨åŠ è½½å®Œæ¯•\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: æœåŠ¡è¿›ç¨‹æ²¡æœ‰åŠæ—¶åŠ è½½\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "æœåŠ¡å™¨é‡æ–°åŠ è½½ä¸­\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: 无法轮æ¢æ—¥å¿—文件;正在è¿è¡Œå•ç”¨æˆ·æ¨¡å¼çš„æœåŠ¡å™¨è¿›ç¨‹ (PID: %d)\n"
+
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: 无法创建日志轮æ¢ä¿¡å·æ–‡ä»¶ \"%s\": %s\n"
+
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: 无法写入日志轮æ¢ä¿¡å·æ–‡ä»¶ \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: 无法å‘é€æ—¥å¿—è½®æ¢ä¿¡å· (PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: 无法删除日志轮æ¢ä¿¡å·æ–‡ä»¶ \"%s\": %s\n"
+
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "æœåŠ¡å™¨å‘出轮æ¢æ—¥å¿—文件的信å·\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: 正在è¿è¡Œå•ç”¨æˆ·æ¨¡å¼æœåŠ¡å™¨è¿›ç¨‹ (PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, fuzzy, c-format
+#| msgid "%s: server is running (PID: %ld)\n"
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: 正在è¿è¡ŒæœåŠ¡å™¨è¿›ç¨‹(PID: %ld)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s:没有æœåŠ¡å™¨è¿›ç¨‹æ­£åœ¨è¿è¡Œ\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: 无法å‘é€ä¿¡å· %d (PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: 无法找到postgres程åºçš„执行文件\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: 无法打开æœåŠ¡ç®¡ç†å™¨\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: æœåŠ¡ \"%s\" å·²ç»æ³¨å†Œäº†\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: 无法注册æœåŠ¡ \"%s\": é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: æœåŠ¡ \"%s\" 没有注册\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: 无法打开æœåŠ¡ \"%s\": é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: 无法注销æœåŠ¡ \"%s\": é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "等待æœåŠ¡å™¨è¿›ç¨‹å¯åŠ¨ ...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "在等待æœåŠ¡å™¨å¯åŠ¨æ—¶è¶…æ—¶\n"
+
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "æœåŠ¡å™¨è¿›ç¨‹å·²å¯åŠ¨å¹¶ä¸”接å—连接\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: 无法å¯åŠ¨æœåŠ¡ \"%s\": é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: 无法打开进程令牌 (token): é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: 无法分é…SID: é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: 无法创建继承套接字: 错误ç ä¸º %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: 由于æƒé™æ— æ³•èŽ·å–LUID: é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: 无法获得令牌信æ¯: é”™è¯¯ç  %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: 内存ä¸è¶³\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s 是一个用于åˆå§‹åŒ–ã€å¯åŠ¨ã€åœæ­¢æˆ–控制PostgreSQLæœåŠ¡å™¨çš„工具.\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_ctl.c:1968
+#, c-format
+msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n"
+msgstr " %s init[db] [-D æ•°æ®ç›®å½•] [-s] [-o 选项]\n"
+
+#: pg_ctl.c:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D æ•°æ®ç›®å½•] [-l 文件å] [-W] [-t 秒数] [-s]\n"
+" [-o 选项] [-p 路径] [-c]\n"
+
+#: pg_ctl.c:1971
+#, c-format
+msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+msgstr " %s stop [-D æ•°æ®ç›®å½•] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]\n"
+
+#: pg_ctl.c:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D æ•°æ®ç›®å½•] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]\n"
+" [-o 选项] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D æ•°æ®ç›®å½•] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D æ•°æ®ç›®å½•]\n"
+
+#: pg_ctl.c:1976
+#, c-format
+msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n"
+msgstr " %s promote [-D æ•°æ®ç›®å½•] [-W] [-t 秒数] [-s]\n"
+
+#: pg_ctl.c:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D æ•°æ®ç›®å½•] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill ä¿¡å·å称 进程å·\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %s register [-D æ•°æ®ç›®å½•] [-N æœåŠ¡å称] [-U 用户å] [-P å£ä»¤]\n"
+" [-S å¯åŠ¨ç±»åž‹] [-e æº] [-W] [-t 秒数] [-s] [-o 选项]\n"
+
+#: pg_ctl.c:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N æœåŠ¡å称]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"普通选项:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=æ•°æ®ç›®å½• æ•°æ®åº“存储区域的ä½ç½®\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE 当作为一个æœåŠ¡è¿è¡Œæ—¶è¦è®°å½•çš„事件的æ¥æº\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent åªæ‰“å°é”™è¯¯ä¿¡æ¯, 没有其他信æ¯\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS 当使用-w 选项时需è¦ç­‰å¾…的秒数\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait 等待直到æ“作完æˆ(默认)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait ä¸ç”¨ç­‰å¾…æ“作完æˆ\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "如果çœç•¥äº† -D 选项, 将使用 PGDATA 环境å˜é‡.\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"å¯åŠ¨æˆ–é‡å¯çš„选项:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files å…许postgres进程产生核心文件\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files 在这ç§å¹³å°ä¸Šä¸å¯ç”¨\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILENAME 写入 (或追加) æœåŠ¡å™¨æ—¥å¿—到文件FILENAME\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr ""
+" -o, --options=OPTIONS 传递给postgres的命令行选项\n"
+" (PostgreSQL æœåŠ¡å™¨æ‰§è¡Œæ–‡ä»¶)或initdb\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTMASTER 正常情况ä¸å¿…è¦\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"åœæ­¢æˆ–é‡å¯çš„选项:\n"
+
+#: pg_ctl.c:2009
+#, c-format
+msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n"
+msgstr " -m, --mode=MODE å¯ä»¥æ˜¯ \"smart\", \"fast\", 或者 \"immediate\"\n"
+
+#: pg_ctl.c:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"关闭模å¼æœ‰å¦‚下几ç§:\n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 所有客户端断开连接åŽé€€å‡º\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast 直接退出, 正确的关闭(默认)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate ä¸å®Œå…¨çš„关闭退出; é‡å¯åŽæ¢å¤\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"å…许关闭的信å·å称:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"注册或注销的选项:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N æœåŠ¡å称 注册到 PostgreSQL æœåŠ¡å™¨çš„æœåŠ¡å称\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P å£ä»¤ 注册到 PostgreSQL æœåŠ¡å™¨å¸æˆ·çš„å£ä»¤\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U 用户å 注册到 PostgreSQL æœåŠ¡å™¨å¸æˆ·çš„用户å\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE 注册到PostgreSQLæœåŠ¡å™¨çš„æœåŠ¡å¯åŠ¨ç±»åž‹\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"å¯åŠ¨ç±»åž‹æœ‰:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto 在系统å¯åŠ¨æ—¶è‡ªåŠ¨å¯åŠ¨æœåŠ¡(默认选项)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand 按需å¯åŠ¨æœåŠ¡\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: æ— æ•ˆçš„å…³é—­æ¨¡å¼ \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: 无效信å·å称 \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: 无法识别的å¯åŠ¨ç±»åž‹ \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: 使用命令 \"%s\"无法确定数æ®ç›®å½•\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 控制文件似乎已æŸå\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: 无法以 root 用户è¿è¡Œ\n"
+"请以æœåŠ¡å™¨è¿›ç¨‹æ‰€å±žç”¨æˆ· (éžç‰¹æƒç”¨æˆ·) 登录 (或使用 \"su\")\n"
+"\n"
+
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: -S 选项在该平å°ä¸Šä¸æ”¯æŒ\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 命令行å‚数太多 (第一个是 \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: 缺少 kill 模å¼å‚æ•°\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: 无效的æ“ä½œæ¨¡å¼ \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: 没有指定æ“作\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: 没有指定数æ®ç›®å½•, 并且没有设置 PGDATA 环境å˜é‡\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "%2$s需è¦ç¨‹åº\"%1$s\"\n"
+#~ "但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n"
+#~ "检查您的安装.\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "程åº\"%s\"是由\"%s\"找到的\n"
+#~ "但与%s的版本ä¸åŒ.\n"
+#~ "检查您的安装.\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "警告: 在线备份模å¼å¤„于激活状æ€\n"
+#~ "关闭命令将ä¸ä¼šå®Œæˆï¼Œç›´åˆ°è°ƒç”¨äº†pg_stop_backup().\n"
diff --git a/src/bin/pg_ctl/po/zh_TW.po b/src/bin/pg_ctl/po/zh_TW.po
new file mode 100644
index 0000000..a893775
--- /dev/null
+++ b/src/bin/pg_ctl/po/zh_TW.po
@@ -0,0 +1,983 @@
+# Traditional Chinese message translation file for pg_ctl
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_ctl (PostgreSQL) package.
+# 2004-12-13 Zhenbang Wei <znbang@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_ctl (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 20:48+0000\n"
+"PO-Revision-Date: 2023-09-11 08:37+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+# command.c:122
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "無效的執行檔 \"%s\": %m"
+
+# command.c:1103
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "無法讀å–執行檔 \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\""
+
+# utils/error/elog.c:1128
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "無法解æžè·¯å¾‘ \"%s\" 為絕å°è·¯å¾‘: %m"
+
+# fe-misc.c:991
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 失敗: %m"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "記憶體ä¸è¶³"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體ä¸è¶³\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "無法執行指令"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "找ä¸åˆ°æŒ‡ä»¤"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¡Œç¨‹å› ç•°å¸¸ 0x%X 而åœæ­¢"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¡Œç¨‹å› ä¿¡è™Ÿ %d 而åœæ­¢: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¡Œç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ç¢¼ %d"
+
+#: ../../port/path.c:775
+#, c-format
+msgid "could not get current working directory: %s\n"
+msgstr "無法å–å¾—ç›®å‰çš„工作目錄: %s\n"
+
+# postmaster/postmaster.c:892
+#: pg_ctl.c:255
+#, c-format
+msgid "%s: directory \"%s\" does not exist\n"
+msgstr "%s: 目錄 \"%s\" ä¸å­˜åœ¨\n"
+
+#: pg_ctl.c:258
+#, c-format
+msgid "%s: could not access directory \"%s\": %s\n"
+msgstr "%s: 無法存å–目錄 \"%s\": %s\n"
+
+# postmaster/postmaster.c:892
+#: pg_ctl.c:271
+#, c-format
+msgid "%s: directory \"%s\" is not a database cluster directory\n"
+msgstr "%s: 目錄 \"%s\" ä¸æ˜¯è³‡æ–™åº«å¢é›†ç›®éŒ„\n"
+
+#: pg_ctl.c:284
+#, c-format
+msgid "%s: could not open PID file \"%s\": %s\n"
+msgstr "%s: 無法開啟 PID 檔 \"%s\": %s\n"
+
+#: pg_ctl.c:293
+#, c-format
+msgid "%s: the PID file \"%s\" is empty\n"
+msgstr "%s: PID 檔 \"%s\" 是空的\n"
+
+# access/transam/xlog.c:5414 access/transam/xlog.c:5535
+# access/transam/xlog.c:5541 access/transam/xlog.c:5572
+# access/transam/xlog.c:5578
+#: pg_ctl.c:296
+#, c-format
+msgid "%s: invalid data in PID file \"%s\"\n"
+msgstr "%s: PID 檔 \"%s\" 中的資料無效\n"
+
+#: pg_ctl.c:458 pg_ctl.c:500
+#, c-format
+msgid "%s: could not start server: %s\n"
+msgstr "%s: 無法啟動伺æœå™¨: %s\n"
+
+#: pg_ctl.c:478
+#, c-format
+msgid "%s: could not start server due to setsid() failure: %s\n"
+msgstr "%s: 由於 setsid() 失敗,無法啟動伺æœå™¨: %s\n"
+
+# command.c:1148
+#: pg_ctl.c:548
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: 無法開啟日誌檔 \"%s\": %s\n"
+
+#: pg_ctl.c:565
+#, c-format
+msgid "%s: could not start server: error code %lu\n"
+msgstr "%s: 無法啟動伺æœå™¨: 錯誤碼 %lu\n"
+
+#: pg_ctl.c:782
+#, c-format
+msgid "%s: cannot set core file size limit; disallowed by hard limit\n"
+msgstr "%s: 無法設定核心檔案大å°é™åˆ¶ï¼Œè¢«ç¡¬é™åˆ¶ç¦æ­¢\n"
+
+#: pg_ctl.c:808
+#, c-format
+msgid "%s: could not read file \"%s\"\n"
+msgstr "%s: 無法讀å–檔案 \"%s\"\n"
+
+#: pg_ctl.c:813
+#, c-format
+msgid "%s: option file \"%s\" must have exactly one line\n"
+msgstr "%s: é¸é …檔 \"%s\" åªèƒ½æœ‰ä¸€è¡Œå…§å®¹\n"
+
+#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107
+#, c-format
+msgid "%s: could not send stop signal (PID: %d): %s\n"
+msgstr "%s: 無法發é€åœæ­¢ä¿¡è™Ÿ(PID: %d): %s\n"
+
+#: pg_ctl.c:883
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n"
+msgstr "ç¨‹å¼ \"%s\" 被 %s 所需,但在相åŒç›®éŒ„中並未找到 \"%s\"。\n"
+
+#: pg_ctl.c:886
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n"
+msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本與 %s ä¸ç›¸åŒã€‚\n"
+
+#: pg_ctl.c:918
+#, c-format
+msgid "%s: database system initialization failed\n"
+msgstr "%s: 資料庫系統åˆå§‹åŒ–失敗。\n"
+
+#: pg_ctl.c:933
+#, c-format
+msgid "%s: another server might be running; trying to start server anyway\n"
+msgstr "%s: å¯èƒ½æœ‰å¦ä¸€å€‹ä¼ºæœå™¨æ­£åœ¨åŸ·è¡Œï¼›å˜—試強制啟動伺æœå™¨\n"
+
+#: pg_ctl.c:981
+msgid "waiting for server to start..."
+msgstr "等待伺æœå™¨å•Ÿå‹•ä¸­..."
+
+#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238
+msgid " done\n"
+msgstr " 完æˆ\n"
+
+#: pg_ctl.c:987
+msgid "server started\n"
+msgstr "伺æœå™¨å·²å•Ÿå‹•\n"
+
+#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243
+msgid " stopped waiting\n"
+msgstr " åœæ­¢ç­‰å¾…\n"
+
+#: pg_ctl.c:991
+#, c-format
+msgid "%s: server did not start in time\n"
+msgstr "%s: 伺æœå™¨æœªèƒ½åŠæ™‚å•Ÿå‹•\n"
+
+#: pg_ctl.c:997
+#, c-format
+msgid ""
+"%s: could not start server\n"
+"Examine the log output.\n"
+msgstr ""
+"%s: 無法啟動伺æœå™¨\n"
+"請檢查日誌輸出。\n"
+
+#: pg_ctl.c:1005
+msgid "server starting\n"
+msgstr "伺æœå™¨å•Ÿå‹•ä¸­\n"
+
+#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267
+#, c-format
+msgid "%s: PID file \"%s\" does not exist\n"
+msgstr "%s: PID 檔 \"%s\" ä¸å­˜åœ¨\n"
+
+#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268
+msgid "Is server running?\n"
+msgstr "伺æœå™¨æ˜¯å¦åœ¨åŸ·è¡Œä¸­?\n"
+
+#: pg_ctl.c:1031
+#, c-format
+msgid "%s: cannot stop server; single-user server is running (PID: %d)\n"
+msgstr "%s: 無法åœæ­¢ä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+#: pg_ctl.c:1046
+msgid "server shutting down\n"
+msgstr "伺æœå™¨é—œé–‰ä¸­\n"
+
+#: pg_ctl.c:1051 pg_ctl.c:1112
+msgid "waiting for server to shut down..."
+msgstr "等待伺æœå™¨é—œé–‰ä¸­..."
+
+#: pg_ctl.c:1055 pg_ctl.c:1117
+msgid " failed\n"
+msgstr " 失敗\n"
+
+#: pg_ctl.c:1057 pg_ctl.c:1119
+#, c-format
+msgid "%s: server does not shut down\n"
+msgstr "%s: 伺æœå™¨æœªåœæ­¢\n"
+
+#: pg_ctl.c:1059 pg_ctl.c:1121
+msgid ""
+"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n"
+"waiting for session-initiated disconnection.\n"
+msgstr "æ示: 使用 \"-m fast\" é¸é …會立å³ä¸­æ–·å·¥ä½œéšŽæ®µï¼Œè€Œä¸æ˜¯ç­‰å¾…由工作階段發起的斷線。\n"
+
+#: pg_ctl.c:1065 pg_ctl.c:1127
+msgid "server stopped\n"
+msgstr "伺æœå™¨å·²åœæ­¢\n"
+
+#: pg_ctl.c:1086
+msgid "trying to start server anyway\n"
+msgstr "嘗試強制啟動伺æœå™¨ã€‚\n"
+
+#: pg_ctl.c:1095
+#, c-format
+msgid "%s: cannot restart server; single-user server is running (PID: %d)\n"
+msgstr "%s: 無法é‡æ–°å•Ÿå‹•ä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+#: pg_ctl.c:1098 pg_ctl.c:1157
+msgid "Please terminate the single-user server and try again.\n"
+msgstr "è«‹çµæŸå–®äººæ¨¡å¼ä¼ºæœå™¨ï¼Œç„¶å¾Œå†è©¦ä¸€æ¬¡ã€‚\n"
+
+#: pg_ctl.c:1131
+#, c-format
+msgid "%s: old server process (PID: %d) seems to be gone\n"
+msgstr "%s: 舊的伺æœå™¨è¡Œç¨‹(PID: %d) 似乎已經ä¸å­˜åœ¨\n"
+
+#: pg_ctl.c:1133
+msgid "starting server anyway\n"
+msgstr "強制啟動伺æœå™¨ä¸­\n"
+
+#: pg_ctl.c:1154
+#, c-format
+msgid "%s: cannot reload server; single-user server is running (PID: %d)\n"
+msgstr "%s: 無法é‡æ–°è¼‰å…¥ä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+#: pg_ctl.c:1163
+#, c-format
+msgid "%s: could not send reload signal (PID: %d): %s\n"
+msgstr "%s: 無法發é€é‡æ–°è¼‰å…¥ä¿¡è™Ÿ(PID: %d): %s\n"
+
+#: pg_ctl.c:1168
+msgid "server signaled\n"
+msgstr "伺æœå™¨å·²æ”¶åˆ°ä¿¡è™Ÿ\n"
+
+#: pg_ctl.c:1193
+#, c-format
+msgid "%s: cannot promote server; single-user server is running (PID: %d)\n"
+msgstr "%s: 無法å‡ç´šä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+#: pg_ctl.c:1201
+#, c-format
+msgid "%s: cannot promote server; server is not in standby mode\n"
+msgstr "%s: 無法å‡ç´šä¼ºæœå™¨ï¼Œä¼ºæœå™¨ä¸åœ¨å¾…機模å¼\n"
+
+# postmaster/postmaster.c:799
+#: pg_ctl.c:1211
+#, c-format
+msgid "%s: could not create promote signal file \"%s\": %s\n"
+msgstr "%s: 無法建立å‡ç´šä¿¡è™Ÿæª”案 \"%s\": %s\n"
+
+# postmaster/postmaster.c:799
+#: pg_ctl.c:1217
+#, c-format
+msgid "%s: could not write promote signal file \"%s\": %s\n"
+msgstr "%s: 無法寫入å‡ç´šä¿¡è™Ÿæª” \"%s\": %s\n"
+
+#: pg_ctl.c:1225
+#, c-format
+msgid "%s: could not send promote signal (PID: %d): %s\n"
+msgstr "%s: 無法發é€å‡ç´šä¿¡è™Ÿ(PID: %d): %s\n"
+
+#: pg_ctl.c:1228
+#, c-format
+msgid "%s: could not remove promote signal file \"%s\": %s\n"
+msgstr "%s: 無法刪除å‡ç´šä¿¡è™Ÿæª” \"%s\": %s\n"
+
+#: pg_ctl.c:1235
+msgid "waiting for server to promote..."
+msgstr "等得伺æœå™¨å‡ç´šä¸­..."
+
+#: pg_ctl.c:1239
+msgid "server promoted\n"
+msgstr "伺æœå™¨å·²å‡ç´š\n"
+
+#: pg_ctl.c:1244
+#, c-format
+msgid "%s: server did not promote in time\n"
+msgstr "%s: 伺æœå™¨æœªèƒ½åŠæ™‚å‡ç´š\n"
+
+#: pg_ctl.c:1250
+msgid "server promoting\n"
+msgstr "伺æœå™¨å‡ç´šä¸­\n"
+
+#: pg_ctl.c:1274
+#, c-format
+msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n"
+msgstr "%s: 無法輪替日誌檔,單人模å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+# postmaster/postmaster.c:799
+#: pg_ctl.c:1284
+#, c-format
+msgid "%s: could not create log rotation signal file \"%s\": %s\n"
+msgstr "%s: 無法建立日誌輪替信號檔 \"%s\": %s\n"
+
+# postmaster/postmaster.c:799
+#: pg_ctl.c:1290
+#, c-format
+msgid "%s: could not write log rotation signal file \"%s\": %s\n"
+msgstr "%s: 無法寫入日誌輪替信號檔 \"%s\": %s\n"
+
+#: pg_ctl.c:1298
+#, c-format
+msgid "%s: could not send log rotation signal (PID: %d): %s\n"
+msgstr "%s: 無法發é€æ—¥èªŒè¼ªæ›¿ä¿¡è™Ÿ(PID: %d): %s\n"
+
+#: pg_ctl.c:1301
+#, c-format
+msgid "%s: could not remove log rotation signal file \"%s\": %s\n"
+msgstr "%s: 無法刪除日誌輪替信號檔 \"%s\": %s\n"
+
+# commands/user.c:655
+#: pg_ctl.c:1306
+msgid "server signaled to rotate log file\n"
+msgstr "伺æœå™¨å·²æ”¶åˆ°æ—¥èªŒè¼ªæ›¿ä¿¡è™Ÿ\n"
+
+#: pg_ctl.c:1353
+#, c-format
+msgid "%s: single-user server is running (PID: %d)\n"
+msgstr "%s: 單人模å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+#: pg_ctl.c:1367
+#, c-format
+msgid "%s: server is running (PID: %d)\n"
+msgstr "%s: 伺æœå™¨åŸ·è¡Œä¸­(PID: %d)\n"
+
+#: pg_ctl.c:1383
+#, c-format
+msgid "%s: no server running\n"
+msgstr "%s: 沒有執行中的伺æœå™¨\n"
+
+#: pg_ctl.c:1400
+#, c-format
+msgid "%s: could not send signal %d (PID: %d): %s\n"
+msgstr "%s: 無法發é€ä¿¡è™Ÿ %d(PID: %d): %s\n"
+
+#: pg_ctl.c:1431
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 找ä¸åˆ°è‡ªèº«çš„程å¼åŸ·è¡Œæª”\n"
+
+#: pg_ctl.c:1441
+#, c-format
+msgid "%s: could not find postgres program executable\n"
+msgstr "%s: 找ä¸åˆ° postgres 程å¼çš„執行檔\n"
+
+#: pg_ctl.c:1511 pg_ctl.c:1545
+#, c-format
+msgid "%s: could not open service manager\n"
+msgstr "%s: 無法開啟æœå‹™ç®¡ç†å“¡\n"
+
+#: pg_ctl.c:1517
+#, c-format
+msgid "%s: service \"%s\" already registered\n"
+msgstr "%s: æœå‹™ \"%s\" 已註冊\n"
+
+#: pg_ctl.c:1528
+#, c-format
+msgid "%s: could not register service \"%s\": error code %lu\n"
+msgstr "%s: 無法註冊æœå‹™ \"%s\": 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1551
+#, c-format
+msgid "%s: service \"%s\" not registered\n"
+msgstr "%s: æœå‹™ \"%s\" 未註冊\n"
+
+#: pg_ctl.c:1558
+#, c-format
+msgid "%s: could not open service \"%s\": error code %lu\n"
+msgstr "%s: 無法開啟æœå‹™ \"%s\": 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1567
+#, c-format
+msgid "%s: could not unregister service \"%s\": error code %lu\n"
+msgstr "%s: 無法å–消註冊æœå‹™ \"%s\": 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1654
+msgid "Waiting for server startup...\n"
+msgstr "等待伺æœå™¨å•Ÿå‹•...\n"
+
+#: pg_ctl.c:1657
+msgid "Timed out waiting for server startup\n"
+msgstr "等待伺æœå™¨å•Ÿå‹•é€¾æ™‚\n"
+
+# utils/init/postinit.c:130
+#: pg_ctl.c:1661
+msgid "Server started and accepting connections\n"
+msgstr "伺æœå™¨å·²å•Ÿå‹•ä¸¦æŽ¥å—連線\n"
+
+#: pg_ctl.c:1716
+#, c-format
+msgid "%s: could not start service \"%s\": error code %lu\n"
+msgstr "%s: 無法啟動æœå‹™ \"%s\": 錯誤碼 %lu\n"
+
+# port/win32/security.c:39
+#: pg_ctl.c:1789
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: 無法開啟行程 token: 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1803
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: 無法é…ç½® SID: 錯誤碼 %lu\n"
+
+# port/win32/signal.c:239
+#: pg_ctl.c:1829
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: 無法建立å—é™åˆ¶çš„ token: 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1911
+#, c-format
+msgid "%s: could not get LUIDs for privileges: error code %lu\n"
+msgstr "%s: 無法å–得特權的LUID: 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1919 pg_ctl.c:1934
+#, c-format
+msgid "%s: could not get token information: error code %lu\n"
+msgstr "%s: 無法å–å¾— token 資訊: 錯誤碼 %lu\n"
+
+#: pg_ctl.c:1928
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: 記憶體ä¸è¶³\n"
+
+#: pg_ctl.c:1958
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "用 \"%s --help\" å–得更多資訊。\n"
+
+#: pg_ctl.c:1966
+#, c-format
+msgid ""
+"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n"
+"\n"
+msgstr ""
+"%s 是用於åˆå§‹åŒ–ã€å•Ÿå‹•ã€åœæ­¢æˆ–控制 PostgreSQL 伺æœå™¨çš„工具。\n"
+"\n"
+
+#: pg_ctl.c:1967
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_ctl.c:1968
+#, 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:1969
+#, c-format
+msgid ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+msgstr ""
+" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-p PATH] [-c]\n"
+
+#: pg_ctl.c:1971
+#, 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:1972
+#, c-format
+msgid ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+msgstr ""
+" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n"
+" [-o OPTIONS] [-c]\n"
+
+#: pg_ctl.c:1974
+#, c-format
+msgid " %s reload [-D DATADIR] [-s]\n"
+msgstr " %s reload [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1975
+#, c-format
+msgid " %s status [-D DATADIR]\n"
+msgstr " %s status [-D DATADIR]\n"
+
+#: pg_ctl.c:1976
+#, 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:1977
+#, c-format
+msgid " %s logrotate [-D DATADIR] [-s]\n"
+msgstr " %s logrotate [-D DATADIR] [-s]\n"
+
+#: pg_ctl.c:1978
+#, c-format
+msgid " %s kill SIGNALNAME PID\n"
+msgstr " %s kill SIGNALNAME PID\n"
+
+#: pg_ctl.c:1980
+#, c-format
+msgid ""
+" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n"
+" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n"
+msgstr ""
+" %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:1982
+#, c-format
+msgid " %s unregister [-N SERVICENAME]\n"
+msgstr " %s unregister [-N SERVICENAME]\n"
+
+#: pg_ctl.c:1985
+#, c-format
+msgid ""
+"\n"
+"Common options:\n"
+msgstr ""
+"\n"
+"常用é¸é …:\n"
+
+#: pg_ctl.c:1986
+#, c-format
+msgid " -D, --pgdata=DATADIR location of the database storage area\n"
+msgstr " -D, --pgdata=DATADIR 資料庫儲存å€åŸŸçš„ä½ç½®\n"
+
+#: pg_ctl.c:1988
+#, c-format
+msgid " -e SOURCE event source for logging when running as a service\n"
+msgstr " -e SOURCE 在作為æœå‹™é‹è¡Œæ™‚的記錄事件來æº\n"
+
+#: pg_ctl.c:1990
+#, c-format
+msgid " -s, --silent only print errors, no informational messages\n"
+msgstr " -s, --silent 僅顯示錯誤訊æ¯ï¼Œä¸é¡¯ç¤ºè³‡è¨Šæ€§è¨Šæ¯ã€‚\n"
+
+#: pg_ctl.c:1991
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when using -w option\n"
+msgstr " -t, --timeout=SECS 使用 -w é¸é …時等待的秒數\n"
+
+#: pg_ctl.c:1992
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_ctl.c:1993
+#, c-format
+msgid " -w, --wait wait until operation completes (default)\n"
+msgstr " -w, --wait 等待æ“作完æˆ(é è¨­å€¼)\n"
+
+#: pg_ctl.c:1994
+#, c-format
+msgid " -W, --no-wait do not wait until operation completes\n"
+msgstr " -W, --no-wait ä¸ç­‰å¾…æ“作完æˆ\n"
+
+#: pg_ctl.c:1995
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_ctl.c:1996
+#, c-format
+msgid "If the -D option is omitted, the environment variable PGDATA is used.\n"
+msgstr "è‹¥çœç•¥ -D é¸é …,將使用環境變數 PGDATA。\n"
+
+#: pg_ctl.c:1998
+#, c-format
+msgid ""
+"\n"
+"Options for start or restart:\n"
+msgstr ""
+"\n"
+"啟動或é‡æ–°å•Ÿå‹•çš„é¸é …:\n"
+
+#: pg_ctl.c:2000
+#, c-format
+msgid " -c, --core-files allow postgres to produce core files\n"
+msgstr " -c, --core-files å…許 PostgreSQL 生æˆæ ¸å¿ƒå‚¾å°\n"
+
+#: pg_ctl.c:2002
+#, c-format
+msgid " -c, --core-files not applicable on this platform\n"
+msgstr " -c, --core-files ä¸é©ç”¨æ­¤å¹³å°\n"
+
+#: pg_ctl.c:2004
+#, c-format
+msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n"
+msgstr " -l, --log=FILENAME 將伺æœå™¨æ—¥èªŒå¯«å…¥(或附加到)檔案 FILENAME\n"
+
+#: pg_ctl.c:2005
+#, c-format
+msgid ""
+" -o, --options=OPTIONS command line options to pass to postgres\n"
+" (PostgreSQL server executable) or initdb\n"
+msgstr " -o, --options=OPTIONS 傳éžçµ¦ postgres(PostgreSQL 伺æœå™¨åŸ·è¡Œæª”)或 initdb 的命令列é¸é …\n"
+
+#: pg_ctl.c:2007
+#, c-format
+msgid " -p PATH-TO-POSTGRES normally not necessary\n"
+msgstr " -p PATH-TO-POSTGRES 通常ä¸éœ€è¦\n"
+
+#: pg_ctl.c:2008
+#, c-format
+msgid ""
+"\n"
+"Options for stop or restart:\n"
+msgstr ""
+"\n"
+"åœæ­¢æˆ–é‡æ–°å•Ÿå‹•çš„é¸é …:\n"
+
+#: pg_ctl.c:2009
+#, 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:2011
+#, c-format
+msgid ""
+"\n"
+"Shutdown modes are:\n"
+msgstr ""
+"\n"
+"åœæ­¢æ¨¡å¼: \n"
+
+#: pg_ctl.c:2012
+#, c-format
+msgid " smart quit after all clients have disconnected\n"
+msgstr " smart 在所有客戶端中斷連線後çµæŸ\n"
+
+#: pg_ctl.c:2013
+#, c-format
+msgid " fast quit directly, with proper shutdown (default)\n"
+msgstr " fast 直接çµæŸï¼Œæ­£å¸¸åœæ­¢(é è¨­)\n"
+
+#: pg_ctl.c:2014
+#, c-format
+msgid " immediate quit without complete shutdown; will lead to recovery on restart\n"
+msgstr " immediate ç«‹å³çµæŸï¼Œä¸é€²è¡Œå®Œæ•´çš„åœæ­¢ï¼›é‡æ–°å•Ÿå‹•æ™‚將進行復原\n"
+
+#: pg_ctl.c:2016
+#, c-format
+msgid ""
+"\n"
+"Allowed signal names for kill:\n"
+msgstr ""
+"\n"
+"å…許用於 kill 命令的信號å稱:\n"
+
+#: pg_ctl.c:2020
+#, c-format
+msgid ""
+"\n"
+"Options for register and unregister:\n"
+msgstr ""
+"\n"
+"註冊和å–消註冊æœå‹™çš„é¸é …:\n"
+
+#: pg_ctl.c:2021
+#, c-format
+msgid " -N SERVICENAME service name with which to register PostgreSQL server\n"
+msgstr " -N SERVICENAME 註冊 PostgreSQL 伺æœå™¨çš„æœå‹™å稱\n"
+
+#: pg_ctl.c:2022
+#, c-format
+msgid " -P PASSWORD password of account to register PostgreSQL server\n"
+msgstr " -P PASSWORD 註冊 PostgreSQL 伺æœå™¨çš„帳號密碼\n"
+
+#: pg_ctl.c:2023
+#, c-format
+msgid " -U USERNAME user name of account to register PostgreSQL server\n"
+msgstr " -U USERNAME 註冊 PostgreSQL 伺æœå™¨çš„帳號å稱\n"
+
+#: pg_ctl.c:2024
+#, c-format
+msgid " -S START-TYPE service start type to register PostgreSQL server\n"
+msgstr " -S START-TYPE 註冊 PostgreSQL 伺æœå™¨çš„å•Ÿå‹•æ–¹å¼\n"
+
+#: pg_ctl.c:2026
+#, c-format
+msgid ""
+"\n"
+"Start types are:\n"
+msgstr ""
+"\n"
+"å•Ÿå‹•æ–¹å¼:\n"
+
+#: pg_ctl.c:2027
+#, c-format
+msgid " auto start service automatically during system startup (default)\n"
+msgstr " auto 系統啟動時自動啟動æœå‹™(é è¨­)\n"
+
+#: pg_ctl.c:2028
+#, c-format
+msgid " demand start service on demand\n"
+msgstr " demand 手動啟動æœå‹™\n"
+
+#: pg_ctl.c:2031
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_ctl.c:2032
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網é : <%s>\n"
+
+#: pg_ctl.c:2057
+#, c-format
+msgid "%s: unrecognized shutdown mode \"%s\"\n"
+msgstr "%s: 無法識別的關åœæ¨¡å¼ \"%s\"\n"
+
+#: pg_ctl.c:2086
+#, c-format
+msgid "%s: unrecognized signal name \"%s\"\n"
+msgstr "%s: 無法識別的信號å稱 \"%s\"\n"
+
+#: pg_ctl.c:2103
+#, c-format
+msgid "%s: unrecognized start type \"%s\"\n"
+msgstr "%s: ç„¡æ³•è­˜åˆ¥çš„å•Ÿå‹•æ–¹å¼ \"%s\"\n"
+
+#: pg_ctl.c:2159
+#, c-format
+msgid "%s: could not determine the data directory using command \"%s\"\n"
+msgstr "%s: 無法使用命令 \"%s\" 確定資料目錄\n"
+
+#: pg_ctl.c:2182
+#, c-format
+msgid "%s: control file appears to be corrupt\n"
+msgstr "%s: 控制檔似乎æ壞\n"
+
+#: pg_ctl.c:2250
+#, c-format
+msgid ""
+"%s: cannot be run as root\n"
+"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
+"own the server process.\n"
+msgstr ""
+"%s: 無法以 root 身分執行\n"
+"請以將會æ“有伺æœå‹™è¡Œç¨‹çš„(éžç‰¹æ¬Š)使用者登入(例如用 \"su\" 命令)。\n"
+
+# commands/tablespace.c:386 commands/tablespace.c:483
+#: pg_ctl.c:2333
+#, c-format
+msgid "%s: -S option not supported on this platform\n"
+msgstr "%s: 此平å°ä¸æ”¯æ´ -S é¸é …\n"
+
+#: pg_ctl.c:2370
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")\n"
+
+#: pg_ctl.c:2396
+#, c-format
+msgid "%s: missing arguments for kill mode\n"
+msgstr "%s: 未指定 kill 模å¼åƒæ•¸\n"
+
+#: pg_ctl.c:2414
+#, c-format
+msgid "%s: unrecognized operation mode \"%s\"\n"
+msgstr "%s: 無法識別的æ“ä½œæ¨¡å¼ \"%s\"\n"
+
+#: pg_ctl.c:2424
+#, c-format
+msgid "%s: no operation specified\n"
+msgstr "%s: 沒有任何æ“作\n"
+
+#: pg_ctl.c:2445
+#, c-format
+msgid "%s: no database directory specified and environment variable PGDATA unset\n"
+msgstr "%s: 未指定資料庫目錄,且未設定環境變數 PGDATA\n"
+
+#, c-format
+#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"
+#~ msgstr " %s start [-w] [-t 秒數] [-D 資料目錄] [-s] [-l 檔å] [-o \"é¸é …\"]\n"
+
+#, c-format
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help 顯示這份說明然後çµæŸ\n"
+
+#, c-format
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version 顯示版本資訊然後çµæŸ\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s is a utility to start, stop, restart, promote, reload configuration files,\n"
+#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s å¯ä»¥ç”¨ä¾†å•Ÿå‹•ã€åœæ­¢ã€é‡æ–°å•Ÿå‹•ã€æå‡ã€é‡æ–°è¼‰å…¥è¨­å®šæª”ã€\n"
+#~ "報告 PostgreSQL 伺æœå™¨ç‹€æ…‹ï¼Œæˆ–é€ä¿¡è™Ÿçµ¦ PostgreSQL 行程。\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%s: -w option cannot use a relative socket directory specification\n"
+#~ msgstr "%s: -w é¸é …ä¸èƒ½å’Œç›¸å° socket 目錄一起使用\n"
+
+#, c-format
+#~ msgid "%s: -w option is not supported when starting a pre-9.1 server\n"
+#~ msgstr "%s: å•Ÿå‹• pre-9.1 伺æœå™¨æ™‚ä¸æ”¯æ´ -w é¸é …\n"
+
+#~ msgid "%s: a standalone backend \"postgres\" is running (PID: %ld)\n"
+#~ msgstr "%s:一個ç¨ç«‹å¾Œç«¯\"postgres\"正在執行(PID:%ld)\n"
+
+#, c-format
+#~ msgid "%s: could not wait for server because of misconfiguration\n"
+#~ msgstr "%s: 無法等待伺æœå™¨ï¼Œè¨­å®šéŒ¯èª¤\n"
+
+#~ msgid "%s: invalid option %s\n"
+#~ msgstr "%s:無效的é¸é … %s\n"
+
+#~ msgid "%s: neither postmaster nor postgres running\n"
+#~ msgstr "%s:postmaster或postgres尚未執行\n"
+
+#, c-format
+#~ msgid "%s: this data directory is running a pre-existing postmaster\n"
+#~ msgstr "%s: 這個資料目錄正在執行以å‰çš„ postmaster\n"
+
+#, c-format
+#~ msgid ""
+#~ "(The default is to wait for shutdown, but not for start or restart.)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "(é è¨­æ˜¯é—œé–‰æ™‚而éžå•Ÿå‹•æˆ–é‡æ–°å•Ÿå‹•æ™‚等待。)\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "The program \"postmaster\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "%s 需è¦\"postmaster\"程å¼ï¼Œä½†æ˜¯åœ¨èˆ‡\"%s\"相åŒçš„目錄中找ä¸åˆ°ã€‚\n"
+#~ "檢查你的安è£ã€‚\n"
+
+#~ msgid ""
+#~ "The program \"postmaster\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"%s\"已找到程å¼\"postmaster\",但是與 %s 版本ä¸ç¬¦ã€‚\n"
+#~ "請檢查你的安è£ã€‚\n"
+
+#~ msgid ""
+#~ "WARNING: online backup mode is active\n"
+#~ "Shutdown will not complete until pg_stop_backup() is called.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "警告: 線上備份模å¼ä½œç”¨ä¸­\n"
+#~ "å¿…é ˆå‘¼å« pg_stop_backup(),關閉作業æ‰èƒ½å®Œæˆã€‚\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s çµæŸ"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "無法切æ›ç›®éŒ„至 \"%s\""
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\""
+
+#~ msgid "server is still starting up\n"
+#~ msgstr "伺æœå™¨ä»åœ¨å•Ÿå‹•ä¸­\n"
diff --git a/src/bin/pg_ctl/t/001_start_stop.pl b/src/bin/pg_ctl/t/001_start_stop.pl
new file mode 100644
index 0000000..f019fe1
--- /dev/null
+++ b/src/bin/pg_ctl/t/001_start_stop.pl
@@ -0,0 +1,103 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $tempdir_short = PostgreSQL::Test::Utils::tempdir_short;
+
+program_help_ok('pg_ctl');
+program_version_ok('pg_ctl');
+program_options_handling_ok('pg_ctl');
+
+command_exit_is([ 'pg_ctl', 'start', '-D', "$tempdir/nonexistent" ],
+ 1, 'pg_ctl start with nonexistent directory');
+
+command_ok([ 'pg_ctl', 'initdb', '-D', "$tempdir/data", '-o', '-N' ],
+ 'pg_ctl initdb');
+command_ok([ $ENV{PG_REGRESS}, '--config-auth', "$tempdir/data" ],
+ 'configure authentication');
+my $node_port = PostgreSQL::Test::Cluster::get_free_port();
+open my $conf, '>>', "$tempdir/data/postgresql.conf";
+print $conf "fsync = off\n";
+print $conf "port = $node_port\n";
+print $conf PostgreSQL::Test::Utils::slurp_file($ENV{TEMP_CONFIG})
+ if defined $ENV{TEMP_CONFIG};
+
+if ($use_unix_sockets)
+{
+ print $conf "listen_addresses = ''\n";
+ $tempdir_short =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os;
+ print $conf "unix_socket_directories = '$tempdir_short'\n";
+}
+else
+{
+ print $conf "listen_addresses = '127.0.0.1'\n";
+}
+close $conf;
+my $ctlcmd = [
+ 'pg_ctl', 'start', '-D', "$tempdir/data", '-l',
+ "$PostgreSQL::Test::Utils::log_path/001_start_stop_server.log"
+];
+command_like($ctlcmd, qr/done.*server started/s, 'pg_ctl start');
+
+# sleep here is because Windows builds can't check postmaster.pid exactly,
+# so they may mistake a pre-existing postmaster.pid for one created by the
+# postmaster they start. Waiting more than the 2 seconds slop time allowed
+# by wait_for_postmaster() prevents that mistake.
+sleep 3 if ($windows_os);
+command_fails([ 'pg_ctl', 'start', '-D', "$tempdir/data" ],
+ 'second pg_ctl start fails');
+command_ok([ 'pg_ctl', 'stop', '-D', "$tempdir/data" ], 'pg_ctl stop');
+command_fails([ 'pg_ctl', 'stop', '-D', "$tempdir/data" ],
+ 'second pg_ctl stop fails');
+
+# Log file for default permission test. The permissions won't be checked on
+# Windows but we still want to do the restart test.
+my $logFileName = "$tempdir/data/perm-test-600.log";
+
+command_ok([ 'pg_ctl', 'restart', '-D', "$tempdir/data", '-l', $logFileName ],
+ 'pg_ctl restart with server not running');
+
+# Permissions on log file should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 2
+ if ($windows_os);
+
+ ok(-f $logFileName);
+ ok(check_mode_recursive("$tempdir/data", 0700, 0600));
+}
+
+# Log file for group access test
+$logFileName = "$tempdir/data/perm-test-640.log";
+
+SKIP:
+{
+ skip "group access not supported on Windows", 3 if ($windows_os);
+
+ system_or_bail 'pg_ctl', 'stop', '-D', "$tempdir/data";
+
+ # Change the data dir mode so log file will be created with group read
+ # privileges on the next start
+ chmod_recursive("$tempdir/data", 0750, 0640);
+
+ command_ok(
+ [ 'pg_ctl', 'start', '-D', "$tempdir/data", '-l', $logFileName ],
+ 'start server to check group permissions');
+
+ ok(-f $logFileName);
+ ok(check_mode_recursive("$tempdir/data", 0750, 0640));
+}
+
+command_ok([ 'pg_ctl', 'restart', '-D', "$tempdir/data" ],
+ 'pg_ctl restart with server running');
+
+system_or_bail 'pg_ctl', 'stop', '-D', "$tempdir/data";
+
+done_testing();
diff --git a/src/bin/pg_ctl/t/002_status.pl b/src/bin/pg_ctl/t/002_status.pl
new file mode 100644
index 0000000..f5c50f6
--- /dev/null
+++ b/src/bin/pg_ctl/t/002_status.pl
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+command_exit_is([ 'pg_ctl', 'status', '-D', "$tempdir/nonexistent" ],
+ 4, 'pg_ctl status with nonexistent directory');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+command_exit_is([ 'pg_ctl', 'status', '-D', $node->data_dir ],
+ 3, 'pg_ctl status with server not running');
+
+system_or_bail 'pg_ctl', '-l', "$tempdir/logfile", '-D',
+ $node->data_dir, '-w', 'start';
+command_exit_is([ 'pg_ctl', 'status', '-D', $node->data_dir ],
+ 0, 'pg_ctl status with server running');
+
+system_or_bail 'pg_ctl', 'stop', '-D', $node->data_dir;
+
+done_testing();
diff --git a/src/bin/pg_ctl/t/003_promote.pl b/src/bin/pg_ctl/t/003_promote.pl
new file mode 100644
index 0000000..0e83933
--- /dev/null
+++ b/src/bin/pg_ctl/t/003_promote.pl
@@ -0,0 +1,66 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+command_fails_like(
+ [ 'pg_ctl', '-D', "$tempdir/nonexistent", 'promote' ],
+ qr/directory .* does not exist/,
+ 'pg_ctl promote with nonexistent directory');
+
+my $node_primary = PostgreSQL::Test::Cluster->new('primary');
+$node_primary->init(allows_streaming => 1);
+
+command_fails_like(
+ [ 'pg_ctl', '-D', $node_primary->data_dir, 'promote' ],
+ qr/PID file .* does not exist/,
+ 'pg_ctl promote of not running instance fails');
+
+$node_primary->start;
+
+command_fails_like(
+ [ 'pg_ctl', '-D', $node_primary->data_dir, 'promote' ],
+ qr/not in standby mode/,
+ 'pg_ctl promote of primary instance fails');
+
+my $node_standby = PostgreSQL::Test::Cluster->new('standby');
+$node_primary->backup('my_backup');
+$node_standby->init_from_backup($node_primary, 'my_backup',
+ has_streaming => 1);
+$node_standby->start;
+
+is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
+ 't', 'standby is in recovery');
+
+command_ok([ 'pg_ctl', '-D', $node_standby->data_dir, '-W', 'promote' ],
+ 'pg_ctl -W promote of standby runs');
+
+ok( $node_standby->poll_query_until(
+ 'postgres', 'SELECT NOT pg_is_in_recovery()'),
+ 'promoted standby is not in recovery');
+
+# same again with default wait option
+$node_standby = PostgreSQL::Test::Cluster->new('standby2');
+$node_standby->init_from_backup($node_primary, 'my_backup',
+ has_streaming => 1);
+$node_standby->start;
+
+is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
+ 't', 'standby is in recovery');
+
+command_ok([ 'pg_ctl', '-D', $node_standby->data_dir, 'promote' ],
+ 'pg_ctl promote of standby runs');
+
+# no wait here
+
+is($node_standby->safe_psql('postgres', 'SELECT pg_is_in_recovery()'),
+ 'f', 'promoted standby is not in recovery');
+
+done_testing();
diff --git a/src/bin/pg_ctl/t/004_logrotate.pl b/src/bin/pg_ctl/t/004_logrotate.pl
new file mode 100644
index 0000000..8d48e56
--- /dev/null
+++ b/src/bin/pg_ctl/t/004_logrotate.pl
@@ -0,0 +1,140 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+use Time::HiRes qw(usleep);
+
+# Extract the file name of a $format from the contents of
+# current_logfiles.
+sub fetch_file_name
+{
+ my $logfiles = shift;
+ my $format = shift;
+ my @lines = split(/\n/, $logfiles);
+ my $filename = undef;
+ foreach my $line (@lines)
+ {
+ if ($line =~ /$format (.*)$/gm)
+ {
+ $filename = $1;
+ }
+ }
+
+ return $filename;
+}
+
+# Check for a pattern in the logs associated to one format.
+sub check_log_pattern
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my $format = shift;
+ my $logfiles = shift;
+ my $pattern = shift;
+ my $node = shift;
+ my $lfname = fetch_file_name($logfiles, $format);
+
+ my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default;
+
+ my $logcontents;
+ for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+ {
+ $logcontents = slurp_file($node->data_dir . '/' . $lfname);
+ last if $logcontents =~ m/$pattern/;
+ usleep(100_000);
+ }
+
+ like($logcontents, qr/$pattern/,
+ "found expected log file content for $format");
+
+ # While we're at it, test pg_current_logfile() function
+ is( $node->safe_psql('postgres', "SELECT pg_current_logfile('$format')"),
+ $lfname,
+ "pg_current_logfile() gives correct answer with $format");
+ return;
+}
+
+# Set up node with logging collector
+my $node = PostgreSQL::Test::Cluster->new('primary');
+$node->init();
+$node->append_conf(
+ 'postgresql.conf', qq(
+logging_collector = on
+log_destination = 'stderr, csvlog, jsonlog'
+# these ensure stability of test results:
+log_rotation_age = 0
+lc_messages = 'C'
+));
+
+$node->start();
+
+# Verify that log output gets to the file
+
+$node->psql('postgres', 'SELECT 1/0');
+
+# might need to retry if logging collector process is slow...
+my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default;
+
+my $current_logfiles;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+{
+ eval {
+ $current_logfiles = slurp_file($node->data_dir . '/current_logfiles');
+ };
+ last unless $@;
+ usleep(100_000);
+}
+die $@ if $@;
+
+note "current_logfiles = $current_logfiles";
+
+like(
+ $current_logfiles,
+ qr|^stderr log/postgresql-.*log
+csvlog log/postgresql-.*csv
+jsonlog log/postgresql-.*json$|,
+ 'current_logfiles is sane');
+
+check_log_pattern('stderr', $current_logfiles, 'division by zero', $node);
+check_log_pattern('csvlog', $current_logfiles, 'division by zero', $node);
+check_log_pattern('jsonlog', $current_logfiles, 'division by zero', $node);
+
+# Sleep 2 seconds and ask for log rotation; this should result in
+# output into a different log file name.
+sleep(2);
+$node->logrotate();
+
+# pg_ctl logrotate doesn't wait for rotation request to be completed.
+# Allow a bit of time for it to happen.
+my $new_current_logfiles;
+for (my $attempts = 0; $attempts < $max_attempts; $attempts++)
+{
+ $new_current_logfiles = slurp_file($node->data_dir . '/current_logfiles');
+ last if $new_current_logfiles ne $current_logfiles;
+ usleep(100_000);
+}
+
+note "now current_logfiles = $new_current_logfiles";
+
+like(
+ $new_current_logfiles,
+ qr|^stderr log/postgresql-.*log
+csvlog log/postgresql-.*csv
+jsonlog log/postgresql-.*json$|,
+ 'new current_logfiles is sane');
+
+# Verify that log output gets to this file, too
+$node->psql('postgres', 'fee fi fo fum');
+
+check_log_pattern('stderr', $new_current_logfiles, 'syntax error', $node);
+check_log_pattern('csvlog', $new_current_logfiles, 'syntax error', $node);
+check_log_pattern('jsonlog', $new_current_logfiles, 'syntax error', $node);
+
+$node->stop();
+
+done_testing();
diff --git a/src/bin/pg_dump/.gitignore b/src/bin/pg_dump/.gitignore
new file mode 100644
index 0000000..e6d7812
--- /dev/null
+++ b/src/bin/pg_dump/.gitignore
@@ -0,0 +1,5 @@
+/pg_dump
+/pg_dumpall
+/pg_restore
+
+/tmp_check/
diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile
new file mode 100644
index 0000000..24de759
--- /dev/null
+++ b/src/bin/pg_dump/Makefile
@@ -0,0 +1,74 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_dump
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/pg_dump/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_dump/pg_restore/pg_dumpall - backup and restore PostgreSQL databases"
+PGAPPICON=win32
+
+subdir = src/bin/pg_dump
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+export GZIP_PROGRAM=$(GZIP)
+export LZ4
+export ZSTD
+export with_icu
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ compress_gzip.o \
+ compress_io.o \
+ compress_lz4.o \
+ compress_none.o \
+ compress_zstd.o \
+ dumputils.o \
+ parallel.o \
+ pg_backup_archiver.o \
+ pg_backup_custom.o \
+ pg_backup_db.o \
+ pg_backup_directory.o \
+ pg_backup_null.o \
+ pg_backup_tar.o \
+ pg_backup_utils.o
+
+all: pg_dump pg_restore pg_dumpall
+
+pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_restore: pg_restore.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_restore.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+pg_dumpall: pg_dumpall.o dumputils.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X)
+ $(INSTALL_PROGRAM) pg_restore$(X) '$(DESTDIR)$(bindir)'/pg_restore$(X)
+ $(INSTALL_PROGRAM) pg_dumpall$(X) '$(DESTDIR)$(bindir)'/pg_dumpall$(X)
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
+
+uninstall:
+ rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
+
+clean distclean maintainer-clean:
+ rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o
+ rm -rf tmp_check
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
new file mode 100644
index 0000000..5d98898
--- /dev/null
+++ b/src/bin/pg_dump/common.c
@@ -0,0 +1,1089 @@
+/*-------------------------------------------------------------------------
+ *
+ * common.c
+ * Catalog routines used by pg_dump; long ago these were shared
+ * by another dump tool, but not anymore.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/common.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "catalog/pg_class_d.h"
+#include "catalog/pg_collation_d.h"
+#include "catalog/pg_extension_d.h"
+#include "catalog/pg_namespace_d.h"
+#include "catalog/pg_operator_d.h"
+#include "catalog/pg_proc_d.h"
+#include "catalog/pg_publication_d.h"
+#include "catalog/pg_type_d.h"
+#include "common/hashfn.h"
+#include "fe_utils/string_utils.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_utils.h"
+#include "pg_dump.h"
+
+/*
+ * Variables for mapping DumpId to DumpableObject
+ */
+static DumpableObject **dumpIdMap = NULL;
+static int allocedDumpIds = 0;
+static DumpId lastDumpId = 0; /* Note: 0 is InvalidDumpId */
+
+/*
+ * Infrastructure for mapping CatalogId to DumpableObject
+ *
+ * We use a hash table generated by simplehash.h. That infrastructure
+ * requires all the hash table entries to be the same size, and it also
+ * expects that it can move them around when resizing the table. So we
+ * cannot make the DumpableObjects be elements of the hash table directly;
+ * instead, the hash table elements contain pointers to DumpableObjects.
+ *
+ * It turns out to be convenient to also use this data structure to map
+ * CatalogIds to owning extensions, if any. Since extension membership
+ * data is read before creating most DumpableObjects, either one of dobj
+ * and ext could be NULL.
+ */
+typedef struct _catalogIdMapEntry
+{
+ CatalogId catId; /* the indexed CatalogId */
+ uint32 status; /* hash status */
+ uint32 hashval; /* hash code for the CatalogId */
+ DumpableObject *dobj; /* the associated DumpableObject, if any */
+ ExtensionInfo *ext; /* owning extension, if any */
+} CatalogIdMapEntry;
+
+#define SH_PREFIX catalogid
+#define SH_ELEMENT_TYPE CatalogIdMapEntry
+#define SH_KEY_TYPE CatalogId
+#define SH_KEY catId
+#define SH_HASH_KEY(tb, key) hash_bytes((const unsigned char *) &(key), sizeof(CatalogId))
+#define SH_EQUAL(tb, a, b) ((a).oid == (b).oid && (a).tableoid == (b).tableoid)
+#define SH_STORE_HASH
+#define SH_GET_HASH(tb, a) (a)->hashval
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+#define CATALOGIDHASH_INITIAL_SIZE 10000
+
+static catalogid_hash *catalogIdHash = NULL;
+
+static void flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables,
+ InhInfo *inhinfo, int numInherits);
+static void flagInhIndexes(Archive *fout, TableInfo *tblinfo, int numTables);
+static void flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables);
+static int strInArray(const char *pattern, char **arr, int arr_size);
+static IndxInfo *findIndexByOid(Oid oid);
+
+
+/*
+ * getSchemaData
+ * Collect information about all potentially dumpable objects
+ */
+TableInfo *
+getSchemaData(Archive *fout, int *numTablesPtr)
+{
+ TableInfo *tblinfo;
+ ExtensionInfo *extinfo;
+ InhInfo *inhinfo;
+ int numTables;
+ int numTypes;
+ int numFuncs;
+ int numOperators;
+ int numCollations;
+ int numNamespaces;
+ int numExtensions;
+ int numPublications;
+ int numAggregates;
+ int numInherits;
+ int numRules;
+ int numProcLangs;
+ int numCasts;
+ int numTransforms;
+ int numAccessMethods;
+ int numOpclasses;
+ int numOpfamilies;
+ int numConversions;
+ int numTSParsers;
+ int numTSTemplates;
+ int numTSDicts;
+ int numTSConfigs;
+ int numForeignDataWrappers;
+ int numForeignServers;
+ int numDefaultACLs;
+ int numEventTriggers;
+
+ /*
+ * We must read extensions and extension membership info first, because
+ * extension membership needs to be consultable during decisions about
+ * whether other objects are to be dumped.
+ */
+ pg_log_info("reading extensions");
+ extinfo = getExtensions(fout, &numExtensions);
+
+ pg_log_info("identifying extension members");
+ getExtensionMembership(fout, extinfo, numExtensions);
+
+ pg_log_info("reading schemas");
+ (void) getNamespaces(fout, &numNamespaces);
+
+ /*
+ * getTables should be done as soon as possible, so as to minimize the
+ * window between starting our transaction and acquiring per-table locks.
+ * However, we have to do getNamespaces first because the tables get
+ * linked to their containing namespaces during getTables.
+ */
+ pg_log_info("reading user-defined tables");
+ tblinfo = getTables(fout, &numTables);
+
+ getOwnedSeqs(fout, tblinfo, numTables);
+
+ pg_log_info("reading user-defined functions");
+ (void) getFuncs(fout, &numFuncs);
+
+ /* this must be after getTables and getFuncs */
+ pg_log_info("reading user-defined types");
+ (void) getTypes(fout, &numTypes);
+
+ /* this must be after getFuncs, too */
+ pg_log_info("reading procedural languages");
+ getProcLangs(fout, &numProcLangs);
+
+ pg_log_info("reading user-defined aggregate functions");
+ getAggregates(fout, &numAggregates);
+
+ pg_log_info("reading user-defined operators");
+ (void) getOperators(fout, &numOperators);
+
+ pg_log_info("reading user-defined access methods");
+ getAccessMethods(fout, &numAccessMethods);
+
+ pg_log_info("reading user-defined operator classes");
+ getOpclasses(fout, &numOpclasses);
+
+ pg_log_info("reading user-defined operator families");
+ getOpfamilies(fout, &numOpfamilies);
+
+ pg_log_info("reading user-defined text search parsers");
+ getTSParsers(fout, &numTSParsers);
+
+ pg_log_info("reading user-defined text search templates");
+ getTSTemplates(fout, &numTSTemplates);
+
+ pg_log_info("reading user-defined text search dictionaries");
+ getTSDictionaries(fout, &numTSDicts);
+
+ pg_log_info("reading user-defined text search configurations");
+ getTSConfigurations(fout, &numTSConfigs);
+
+ pg_log_info("reading user-defined foreign-data wrappers");
+ getForeignDataWrappers(fout, &numForeignDataWrappers);
+
+ pg_log_info("reading user-defined foreign servers");
+ getForeignServers(fout, &numForeignServers);
+
+ pg_log_info("reading default privileges");
+ getDefaultACLs(fout, &numDefaultACLs);
+
+ pg_log_info("reading user-defined collations");
+ (void) getCollations(fout, &numCollations);
+
+ pg_log_info("reading user-defined conversions");
+ getConversions(fout, &numConversions);
+
+ pg_log_info("reading type casts");
+ getCasts(fout, &numCasts);
+
+ pg_log_info("reading transforms");
+ getTransforms(fout, &numTransforms);
+
+ pg_log_info("reading table inheritance information");
+ inhinfo = getInherits(fout, &numInherits);
+
+ pg_log_info("reading event triggers");
+ getEventTriggers(fout, &numEventTriggers);
+
+ /* Identify extension configuration tables that should be dumped */
+ pg_log_info("finding extension tables");
+ processExtensionTables(fout, extinfo, numExtensions);
+
+ /* Link tables to parents, mark parents of target tables interesting */
+ pg_log_info("finding inheritance relationships");
+ flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits);
+
+ pg_log_info("reading column info for interesting tables");
+ getTableAttrs(fout, tblinfo, numTables);
+
+ pg_log_info("flagging inherited columns in subtables");
+ flagInhAttrs(fout->dopt, tblinfo, numTables);
+
+ pg_log_info("reading partitioning data");
+ getPartitioningInfo(fout);
+
+ pg_log_info("reading indexes");
+ getIndexes(fout, tblinfo, numTables);
+
+ pg_log_info("flagging indexes in partitioned tables");
+ flagInhIndexes(fout, tblinfo, numTables);
+
+ pg_log_info("reading extended statistics");
+ getExtendedStatistics(fout);
+
+ pg_log_info("reading constraints");
+ getConstraints(fout, tblinfo, numTables);
+
+ pg_log_info("reading triggers");
+ getTriggers(fout, tblinfo, numTables);
+
+ pg_log_info("reading rewrite rules");
+ getRules(fout, &numRules);
+
+ pg_log_info("reading policies");
+ getPolicies(fout, tblinfo, numTables);
+
+ pg_log_info("reading publications");
+ (void) getPublications(fout, &numPublications);
+
+ pg_log_info("reading publication membership of tables");
+ getPublicationTables(fout, tblinfo, numTables);
+
+ pg_log_info("reading publication membership of schemas");
+ getPublicationNamespaces(fout);
+
+ pg_log_info("reading subscriptions");
+ getSubscriptions(fout);
+
+ free(inhinfo); /* not needed any longer */
+
+ *numTablesPtr = numTables;
+ return tblinfo;
+}
+
+/* flagInhTables -
+ * Fill in parent link fields of tables for which we need that information,
+ * mark parents of target tables as interesting, and create
+ * TableAttachInfo objects for partitioned tables with appropriate
+ * dependency links.
+ *
+ * Note that only direct ancestors of targets are marked interesting.
+ * This is sufficient; we don't much care whether they inherited their
+ * attributes or not.
+ *
+ * modifies tblinfo
+ */
+static void
+flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables,
+ InhInfo *inhinfo, int numInherits)
+{
+ TableInfo *child = NULL;
+ TableInfo *parent = NULL;
+ int i,
+ j;
+
+ /*
+ * Set up links from child tables to their parents.
+ *
+ * We used to attempt to skip this work for tables that are not to be
+ * dumped; but the optimizable cases are rare in practice, and setting up
+ * these links in bulk is cheaper than the old way. (Note in particular
+ * that it's very rare for a child to have more than one parent.)
+ */
+ for (i = 0; i < numInherits; i++)
+ {
+ /*
+ * Skip a hashtable lookup if it's same table as last time. This is
+ * unlikely for the child, but less so for the parent. (Maybe we
+ * should ask the backend for a sorted array to make it more likely?
+ * Not clear the sorting effort would be repaid, though.)
+ */
+ if (child == NULL ||
+ child->dobj.catId.oid != inhinfo[i].inhrelid)
+ {
+ child = findTableByOid(inhinfo[i].inhrelid);
+
+ /*
+ * If we find no TableInfo, assume the pg_inherits entry is for a
+ * partitioned index, which we don't need to track.
+ */
+ if (child == NULL)
+ continue;
+ }
+ if (parent == NULL ||
+ parent->dobj.catId.oid != inhinfo[i].inhparent)
+ {
+ parent = findTableByOid(inhinfo[i].inhparent);
+ if (parent == NULL)
+ pg_fatal("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found",
+ inhinfo[i].inhparent,
+ child->dobj.name,
+ child->dobj.catId.oid);
+ }
+ /* Add this parent to the child's list of parents. */
+ if (child->numParents > 0)
+ child->parents = pg_realloc_array(child->parents,
+ TableInfo *,
+ child->numParents + 1);
+ else
+ child->parents = pg_malloc_array(TableInfo *, 1);
+ child->parents[child->numParents++] = parent;
+ }
+
+ /*
+ * Now consider all child tables and mark parents interesting as needed.
+ */
+ for (i = 0; i < numTables; i++)
+ {
+ /*
+ * If needed, mark the parents as interesting for getTableAttrs and
+ * getIndexes. We only need this for direct parents of dumpable
+ * tables.
+ */
+ if (tblinfo[i].dobj.dump)
+ {
+ int numParents = tblinfo[i].numParents;
+ TableInfo **parents = tblinfo[i].parents;
+
+ for (j = 0; j < numParents; j++)
+ parents[j]->interesting = true;
+ }
+
+ /* Create TableAttachInfo object if needed */
+ if ((tblinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) &&
+ tblinfo[i].ispartition)
+ {
+ TableAttachInfo *attachinfo;
+
+ /* With partitions there can only be one parent */
+ if (tblinfo[i].numParents != 1)
+ pg_fatal("invalid number of parents %d for table \"%s\"",
+ tblinfo[i].numParents,
+ tblinfo[i].dobj.name);
+
+ attachinfo = (TableAttachInfo *) palloc(sizeof(TableAttachInfo));
+ attachinfo->dobj.objType = DO_TABLE_ATTACH;
+ attachinfo->dobj.catId.tableoid = 0;
+ attachinfo->dobj.catId.oid = 0;
+ AssignDumpId(&attachinfo->dobj);
+ attachinfo->dobj.name = pg_strdup(tblinfo[i].dobj.name);
+ attachinfo->dobj.namespace = tblinfo[i].dobj.namespace;
+ attachinfo->parentTbl = tblinfo[i].parents[0];
+ attachinfo->partitionTbl = &tblinfo[i];
+
+ /*
+ * We must state the DO_TABLE_ATTACH object's dependencies
+ * explicitly, since it will not match anything in pg_depend.
+ *
+ * Give it dependencies on both the partition table and the parent
+ * table, so that it will not be executed till both of those
+ * exist. (There's no need to care what order those are created
+ * in.)
+ */
+ addObjectDependency(&attachinfo->dobj, tblinfo[i].dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj, tblinfo[i].parents[0]->dobj.dumpId);
+ }
+ }
+}
+
+/*
+ * flagInhIndexes -
+ * Create IndexAttachInfo objects for partitioned indexes, and add
+ * appropriate dependency links.
+ */
+static void
+flagInhIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ int i,
+ j;
+
+ for (i = 0; i < numTables; i++)
+ {
+ if (!tblinfo[i].ispartition || tblinfo[i].numParents == 0)
+ continue;
+
+ Assert(tblinfo[i].numParents == 1);
+
+ for (j = 0; j < tblinfo[i].numIndexes; j++)
+ {
+ IndxInfo *index = &(tblinfo[i].indexes[j]);
+ IndxInfo *parentidx;
+ IndexAttachInfo *attachinfo;
+
+ if (index->parentidx == 0)
+ continue;
+
+ parentidx = findIndexByOid(index->parentidx);
+ if (parentidx == NULL)
+ continue;
+
+ attachinfo = pg_malloc_object(IndexAttachInfo);
+
+ attachinfo->dobj.objType = DO_INDEX_ATTACH;
+ attachinfo->dobj.catId.tableoid = 0;
+ attachinfo->dobj.catId.oid = 0;
+ AssignDumpId(&attachinfo->dobj);
+ attachinfo->dobj.name = pg_strdup(index->dobj.name);
+ attachinfo->dobj.namespace = index->indextable->dobj.namespace;
+ attachinfo->parentIdx = parentidx;
+ attachinfo->partitionIdx = index;
+
+ /*
+ * We must state the DO_INDEX_ATTACH object's dependencies
+ * explicitly, since it will not match anything in pg_depend.
+ *
+ * Give it dependencies on both the partition index and the parent
+ * index, so that it will not be executed till both of those
+ * exist. (There's no need to care what order those are created
+ * in.)
+ *
+ * In addition, give it dependencies on the indexes' underlying
+ * tables. This does nothing of great value so far as serial
+ * restore ordering goes, but it ensures that a parallel restore
+ * will not try to run the ATTACH concurrently with other
+ * operations on those tables.
+ */
+ addObjectDependency(&attachinfo->dobj, index->dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj, parentidx->dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj,
+ index->indextable->dobj.dumpId);
+ addObjectDependency(&attachinfo->dobj,
+ parentidx->indextable->dobj.dumpId);
+
+ /* keep track of the list of partitions in the parent index */
+ simple_ptr_list_append(&parentidx->partattaches, &attachinfo->dobj);
+ }
+ }
+}
+
+/* flagInhAttrs -
+ * for each dumpable table in tblinfo, flag its inherited attributes
+ *
+ * What we need to do here is:
+ *
+ * - Detect child columns that inherit NOT NULL bits from their parents, so
+ * that we needn't specify that again for the child.
+ *
+ * - Detect child columns that have DEFAULT NULL when their parents had some
+ * non-null default. In this case, we make up a dummy AttrDefInfo object so
+ * that we'll correctly emit the necessary DEFAULT NULL clause; otherwise
+ * the backend will apply an inherited default to the column.
+ *
+ * - Detect child columns that have a generation expression and all their
+ * parents also have the same generation expression, and if so suppress the
+ * child's expression. The child will inherit the generation expression
+ * automatically, so there's no need to dump it. This improves the dump's
+ * compatibility with pre-v16 servers, which didn't allow the child's
+ * expression to be given explicitly. Exceptions: If it's a partition or
+ * we are in binary upgrade mode, we dump such expressions anyway because
+ * in those cases inherited tables are recreated standalone first and then
+ * reattached to the parent. (See also the logic in dumpTableSchema().)
+ *
+ * modifies tblinfo
+ */
+static void
+flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables)
+{
+ int i,
+ j,
+ k;
+
+ /*
+ * We scan the tables in OID order, since that's how tblinfo[] is sorted.
+ * Hence we will typically visit parents before their children --- but
+ * that is *not* guaranteed. Thus this loop must be careful that it does
+ * not alter table properties in a way that could change decisions made at
+ * child tables during other iterations.
+ */
+ for (i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &(tblinfo[i]);
+ int numParents;
+ TableInfo **parents;
+
+ /* Some kinds never have parents */
+ if (tbinfo->relkind == RELKIND_SEQUENCE ||
+ tbinfo->relkind == RELKIND_VIEW ||
+ tbinfo->relkind == RELKIND_MATVIEW)
+ continue;
+
+ /* Don't bother computing anything for non-target tables, either */
+ if (!tbinfo->dobj.dump)
+ continue;
+
+ numParents = tbinfo->numParents;
+ parents = tbinfo->parents;
+
+ if (numParents == 0)
+ continue; /* nothing to see here, move along */
+
+ /* For each column, search for matching column names in parent(s) */
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ bool foundNotNull; /* Attr was NOT NULL in a parent */
+ bool foundDefault; /* Found a default in a parent */
+ bool foundSameGenerated; /* Found matching GENERATED */
+ bool foundDiffGenerated; /* Found non-matching GENERATED */
+
+ /* no point in examining dropped columns */
+ if (tbinfo->attisdropped[j])
+ continue;
+
+ foundNotNull = false;
+ foundDefault = false;
+ foundSameGenerated = false;
+ foundDiffGenerated = false;
+ for (k = 0; k < numParents; k++)
+ {
+ TableInfo *parent = parents[k];
+ int inhAttrInd;
+
+ inhAttrInd = strInArray(tbinfo->attnames[j],
+ parent->attnames,
+ parent->numatts);
+ if (inhAttrInd >= 0)
+ {
+ AttrDefInfo *parentDef = parent->attrdefs[inhAttrInd];
+
+ foundNotNull |= parent->notnull[inhAttrInd];
+ foundDefault |= (parentDef != NULL &&
+ strcmp(parentDef->adef_expr, "NULL") != 0 &&
+ !parent->attgenerated[inhAttrInd]);
+ if (parent->attgenerated[inhAttrInd])
+ {
+ /* these pointer nullness checks are just paranoia */
+ if (parentDef != NULL &&
+ tbinfo->attrdefs[j] != NULL &&
+ strcmp(parentDef->adef_expr,
+ tbinfo->attrdefs[j]->adef_expr) == 0)
+ foundSameGenerated = true;
+ else
+ foundDiffGenerated = true;
+ }
+ }
+ }
+
+ /* Remember if we found inherited NOT NULL */
+ tbinfo->inhNotNull[j] = foundNotNull;
+
+ /*
+ * Manufacture a DEFAULT NULL clause if necessary. This breaks
+ * the advice given above to avoid changing state that might get
+ * inspected in other loop iterations. We prevent trouble by
+ * having the foundDefault test above check whether adef_expr is
+ * "NULL", so that it will reach the same conclusion before or
+ * after this is done.
+ */
+ if (foundDefault && tbinfo->attrdefs[j] == NULL)
+ {
+ AttrDefInfo *attrDef;
+
+ attrDef = pg_malloc_object(AttrDefInfo);
+ attrDef->dobj.objType = DO_ATTRDEF;
+ attrDef->dobj.catId.tableoid = 0;
+ attrDef->dobj.catId.oid = 0;
+ AssignDumpId(&attrDef->dobj);
+ attrDef->dobj.name = pg_strdup(tbinfo->dobj.name);
+ attrDef->dobj.namespace = tbinfo->dobj.namespace;
+ attrDef->dobj.dump = tbinfo->dobj.dump;
+
+ attrDef->adtable = tbinfo;
+ attrDef->adnum = j + 1;
+ attrDef->adef_expr = pg_strdup("NULL");
+
+ /* Will column be dumped explicitly? */
+ if (shouldPrintColumn(dopt, tbinfo, j))
+ {
+ attrDef->separate = false;
+ /* No dependency needed: NULL cannot have dependencies */
+ }
+ else
+ {
+ /* column will be suppressed, print default separately */
+ attrDef->separate = true;
+ /* ensure it comes out after the table */
+ addObjectDependency(&attrDef->dobj,
+ tbinfo->dobj.dumpId);
+ }
+
+ tbinfo->attrdefs[j] = attrDef;
+ }
+
+ /* No need to dump generation expression if it's inheritable */
+ if (foundSameGenerated && !foundDiffGenerated &&
+ !tbinfo->ispartition && !dopt->binary_upgrade)
+ tbinfo->attrdefs[j]->dobj.dump = DUMP_COMPONENT_NONE;
+ }
+ }
+}
+
+/*
+ * AssignDumpId
+ * Given a newly-created dumpable object, assign a dump ID,
+ * and enter the object into the lookup tables.
+ *
+ * The caller is expected to have filled in objType and catId,
+ * but not any of the other standard fields of a DumpableObject.
+ */
+void
+AssignDumpId(DumpableObject *dobj)
+{
+ dobj->dumpId = ++lastDumpId;
+ dobj->name = NULL; /* must be set later */
+ dobj->namespace = NULL; /* may be set later */
+ dobj->dump = DUMP_COMPONENT_ALL; /* default assumption */
+ dobj->dump_contains = DUMP_COMPONENT_ALL; /* default assumption */
+ /* All objects have definitions; we may set more components bits later */
+ dobj->components = DUMP_COMPONENT_DEFINITION;
+ dobj->ext_member = false; /* default assumption */
+ dobj->depends_on_ext = false; /* default assumption */
+ dobj->dependencies = NULL;
+ dobj->nDeps = 0;
+ dobj->allocDeps = 0;
+
+ /* Add object to dumpIdMap[], enlarging that array if need be */
+ while (dobj->dumpId >= allocedDumpIds)
+ {
+ int newAlloc;
+
+ if (allocedDumpIds <= 0)
+ {
+ newAlloc = 256;
+ dumpIdMap = pg_malloc_array(DumpableObject *, newAlloc);
+ }
+ else
+ {
+ newAlloc = allocedDumpIds * 2;
+ dumpIdMap = pg_realloc_array(dumpIdMap, DumpableObject *, newAlloc);
+ }
+ memset(dumpIdMap + allocedDumpIds, 0,
+ (newAlloc - allocedDumpIds) * sizeof(DumpableObject *));
+ allocedDumpIds = newAlloc;
+ }
+ dumpIdMap[dobj->dumpId] = dobj;
+
+ /* If it has a valid CatalogId, enter it into the hash table */
+ if (OidIsValid(dobj->catId.tableoid))
+ {
+ CatalogIdMapEntry *entry;
+ bool found;
+
+ /* Initialize CatalogId hash table if not done yet */
+ if (catalogIdHash == NULL)
+ catalogIdHash = catalogid_create(CATALOGIDHASH_INITIAL_SIZE, NULL);
+
+ entry = catalogid_insert(catalogIdHash, dobj->catId, &found);
+ if (!found)
+ {
+ entry->dobj = NULL;
+ entry->ext = NULL;
+ }
+ Assert(entry->dobj == NULL);
+ entry->dobj = dobj;
+ }
+}
+
+/*
+ * Assign a DumpId that's not tied to a DumpableObject.
+ *
+ * This is used when creating a "fixed" ArchiveEntry that doesn't need to
+ * participate in the sorting logic.
+ */
+DumpId
+createDumpId(void)
+{
+ return ++lastDumpId;
+}
+
+/*
+ * Return the largest DumpId so far assigned
+ */
+DumpId
+getMaxDumpId(void)
+{
+ return lastDumpId;
+}
+
+/*
+ * Find a DumpableObject by dump ID
+ *
+ * Returns NULL for invalid ID
+ */
+DumpableObject *
+findObjectByDumpId(DumpId dumpId)
+{
+ if (dumpId <= 0 || dumpId >= allocedDumpIds)
+ return NULL; /* out of range? */
+ return dumpIdMap[dumpId];
+}
+
+/*
+ * Find a DumpableObject by catalog ID
+ *
+ * Returns NULL for unknown ID
+ */
+DumpableObject *
+findObjectByCatalogId(CatalogId catalogId)
+{
+ CatalogIdMapEntry *entry;
+
+ if (catalogIdHash == NULL)
+ return NULL; /* no objects exist yet */
+
+ entry = catalogid_lookup(catalogIdHash, catalogId);
+ if (entry == NULL)
+ return NULL;
+ return entry->dobj;
+}
+
+/*
+ * Build an array of pointers to all known dumpable objects
+ *
+ * This simply creates a modifiable copy of the internal map.
+ */
+void
+getDumpableObjects(DumpableObject ***objs, int *numObjs)
+{
+ int i,
+ j;
+
+ *objs = pg_malloc_array(DumpableObject *, allocedDumpIds);
+ j = 0;
+ for (i = 1; i < allocedDumpIds; i++)
+ {
+ if (dumpIdMap[i])
+ (*objs)[j++] = dumpIdMap[i];
+ }
+ *numObjs = j;
+}
+
+/*
+ * Add a dependency link to a DumpableObject
+ *
+ * Note: duplicate dependencies are currently not eliminated
+ */
+void
+addObjectDependency(DumpableObject *dobj, DumpId refId)
+{
+ if (dobj->nDeps >= dobj->allocDeps)
+ {
+ if (dobj->allocDeps <= 0)
+ {
+ dobj->allocDeps = 16;
+ dobj->dependencies = pg_malloc_array(DumpId, dobj->allocDeps);
+ }
+ else
+ {
+ dobj->allocDeps *= 2;
+ dobj->dependencies = pg_realloc_array(dobj->dependencies,
+ DumpId, dobj->allocDeps);
+ }
+ }
+ dobj->dependencies[dobj->nDeps++] = refId;
+}
+
+/*
+ * Remove a dependency link from a DumpableObject
+ *
+ * If there are multiple links, all are removed
+ */
+void
+removeObjectDependency(DumpableObject *dobj, DumpId refId)
+{
+ int i;
+ int j = 0;
+
+ for (i = 0; i < dobj->nDeps; i++)
+ {
+ if (dobj->dependencies[i] != refId)
+ dobj->dependencies[j++] = dobj->dependencies[i];
+ }
+ dobj->nDeps = j;
+}
+
+
+/*
+ * findTableByOid
+ * finds the DumpableObject for the table with the given oid
+ * returns NULL if not found
+ */
+TableInfo *
+findTableByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = RelationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_TABLE);
+ return (TableInfo *) dobj;
+}
+
+/*
+ * findIndexByOid
+ * finds the DumpableObject for the index with the given oid
+ * returns NULL if not found
+ */
+static IndxInfo *
+findIndexByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = RelationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_INDEX);
+ return (IndxInfo *) dobj;
+}
+
+/*
+ * findTypeByOid
+ * finds the DumpableObject for the type with the given oid
+ * returns NULL if not found
+ */
+TypeInfo *
+findTypeByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = TypeRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL ||
+ dobj->objType == DO_TYPE || dobj->objType == DO_DUMMY_TYPE);
+ return (TypeInfo *) dobj;
+}
+
+/*
+ * findFuncByOid
+ * finds the DumpableObject for the function with the given oid
+ * returns NULL if not found
+ */
+FuncInfo *
+findFuncByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = ProcedureRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_FUNC);
+ return (FuncInfo *) dobj;
+}
+
+/*
+ * findOprByOid
+ * finds the DumpableObject for the operator with the given oid
+ * returns NULL if not found
+ */
+OprInfo *
+findOprByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = OperatorRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_OPERATOR);
+ return (OprInfo *) dobj;
+}
+
+/*
+ * findCollationByOid
+ * finds the DumpableObject for the collation with the given oid
+ * returns NULL if not found
+ */
+CollInfo *
+findCollationByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = CollationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_COLLATION);
+ return (CollInfo *) dobj;
+}
+
+/*
+ * findNamespaceByOid
+ * finds the DumpableObject for the namespace with the given oid
+ * returns NULL if not found
+ */
+NamespaceInfo *
+findNamespaceByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = NamespaceRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_NAMESPACE);
+ return (NamespaceInfo *) dobj;
+}
+
+/*
+ * findExtensionByOid
+ * finds the DumpableObject for the extension with the given oid
+ * returns NULL if not found
+ */
+ExtensionInfo *
+findExtensionByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = ExtensionRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_EXTENSION);
+ return (ExtensionInfo *) dobj;
+}
+
+/*
+ * findPublicationByOid
+ * finds the DumpableObject for the publication with the given oid
+ * returns NULL if not found
+ */
+PublicationInfo *
+findPublicationByOid(Oid oid)
+{
+ CatalogId catId;
+ DumpableObject *dobj;
+
+ catId.tableoid = PublicationRelationId;
+ catId.oid = oid;
+ dobj = findObjectByCatalogId(catId);
+ Assert(dobj == NULL || dobj->objType == DO_PUBLICATION);
+ return (PublicationInfo *) dobj;
+}
+
+
+/*
+ * recordExtensionMembership
+ * Record that the object identified by the given catalog ID
+ * belongs to the given extension
+ */
+void
+recordExtensionMembership(CatalogId catId, ExtensionInfo *ext)
+{
+ CatalogIdMapEntry *entry;
+ bool found;
+
+ /* CatalogId hash table must exist, if we have an ExtensionInfo */
+ Assert(catalogIdHash != NULL);
+
+ /* Add reference to CatalogId hash */
+ entry = catalogid_insert(catalogIdHash, catId, &found);
+ if (!found)
+ {
+ entry->dobj = NULL;
+ entry->ext = NULL;
+ }
+ Assert(entry->ext == NULL);
+ entry->ext = ext;
+}
+
+/*
+ * findOwningExtension
+ * return owning extension for specified catalog ID, or NULL if none
+ */
+ExtensionInfo *
+findOwningExtension(CatalogId catalogId)
+{
+ CatalogIdMapEntry *entry;
+
+ if (catalogIdHash == NULL)
+ return NULL; /* no objects exist yet */
+
+ entry = catalogid_lookup(catalogIdHash, catalogId);
+ if (entry == NULL)
+ return NULL;
+ return entry->ext;
+}
+
+
+/*
+ * parseOidArray
+ * parse a string of numbers delimited by spaces into a character array
+ *
+ * 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.
+ */
+
+void
+parseOidArray(const char *str, Oid *array, int arraysize)
+{
+ int j,
+ argNum;
+ char temp[100];
+ char s;
+
+ argNum = 0;
+ j = 0;
+ for (;;)
+ {
+ s = *str++;
+ if (s == ' ' || s == '\0')
+ {
+ if (j > 0)
+ {
+ if (argNum >= arraysize)
+ pg_fatal("could not parse numeric array \"%s\": too many numbers", str);
+ temp[j] = '\0';
+ array[argNum++] = atooid(temp);
+ j = 0;
+ }
+ if (s == '\0')
+ break;
+ }
+ else
+ {
+ if (!(isdigit((unsigned char) s) || s == '-') ||
+ j >= sizeof(temp) - 1)
+ pg_fatal("could not parse numeric array \"%s\": invalid character in number", str);
+ temp[j++] = s;
+ }
+ }
+
+ while (argNum < arraysize)
+ array[argNum++] = InvalidOid;
+}
+
+
+/*
+ * strInArray:
+ * takes in a string and a string array and the number of elements in the
+ * string array.
+ * returns the index if the string is somewhere in the array, -1 otherwise
+ */
+
+static int
+strInArray(const char *pattern, char **arr, int arr_size)
+{
+ int i;
+
+ for (i = 0; i < arr_size; i++)
+ {
+ if (strcmp(pattern, arr[i]) == 0)
+ return i;
+ }
+ return -1;
+}
diff --git a/src/bin/pg_dump/compress_gzip.c b/src/bin/pg_dump/compress_gzip.c
new file mode 100644
index 0000000..63dfd96
--- /dev/null
+++ b/src/bin/pg_dump/compress_gzip.c
@@ -0,0 +1,422 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_gzip.c
+ * Routines for archivers to read or write a gzip compressed data stream.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_gzip.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+#include <unistd.h>
+
+#include "compress_gzip.h"
+#include "pg_backup_utils.h"
+
+#ifdef HAVE_LIBZ
+#include "zlib.h"
+
+/*----------------------
+ * Compressor API
+ *----------------------
+ */
+typedef struct GzipCompressorState
+{
+ z_streamp zp;
+
+ void *outbuf;
+ size_t outsize;
+} GzipCompressorState;
+
+/* Private routines that support gzip compressed data I/O */
+static void DeflateCompressorInit(CompressorState *cs);
+static void DeflateCompressorEnd(ArchiveHandle *AH, CompressorState *cs);
+static void DeflateCompressorCommon(ArchiveHandle *AH, CompressorState *cs,
+ bool flush);
+static void EndCompressorGzip(ArchiveHandle *AH, CompressorState *cs);
+static void WriteDataToArchiveGzip(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen);
+static void ReadDataFromArchiveGzip(ArchiveHandle *AH, CompressorState *cs);
+
+static void
+DeflateCompressorInit(CompressorState *cs)
+{
+ GzipCompressorState *gzipcs;
+ z_streamp zp;
+
+ gzipcs = (GzipCompressorState *) pg_malloc0(sizeof(GzipCompressorState));
+ zp = gzipcs->zp = (z_streamp) pg_malloc(sizeof(z_stream));
+ zp->zalloc = Z_NULL;
+ zp->zfree = Z_NULL;
+ zp->opaque = Z_NULL;
+
+ /*
+ * outsize is the buffer size we tell zlib it can output to. We actually
+ * allocate one extra byte because some routines want to append a trailing
+ * zero byte to the zlib output.
+ */
+ gzipcs->outsize = DEFAULT_IO_BUFFER_SIZE;
+ gzipcs->outbuf = pg_malloc(gzipcs->outsize + 1);
+
+ /* -Z 0 uses the "None" compressor -- not zlib with no compression */
+ Assert(cs->compression_spec.level != 0);
+
+ if (deflateInit(zp, cs->compression_spec.level) != Z_OK)
+ pg_fatal("could not initialize compression library: %s", zp->msg);
+
+ /* Just be paranoid - maybe End is called after Start, with no Write */
+ zp->next_out = gzipcs->outbuf;
+ zp->avail_out = gzipcs->outsize;
+
+ /* Keep track of gzipcs */
+ cs->private_data = gzipcs;
+}
+
+static void
+DeflateCompressorEnd(ArchiveHandle *AH, CompressorState *cs)
+{
+ GzipCompressorState *gzipcs = (GzipCompressorState *) cs->private_data;
+ z_streamp zp;
+
+ zp = gzipcs->zp;
+ zp->next_in = NULL;
+ zp->avail_in = 0;
+
+ /* Flush any remaining data from zlib buffer */
+ DeflateCompressorCommon(AH, cs, true);
+
+ if (deflateEnd(zp) != Z_OK)
+ pg_fatal("could not close compression stream: %s", zp->msg);
+
+ pg_free(gzipcs->outbuf);
+ pg_free(gzipcs->zp);
+ pg_free(gzipcs);
+ cs->private_data = NULL;
+}
+
+static void
+DeflateCompressorCommon(ArchiveHandle *AH, CompressorState *cs, bool flush)
+{
+ GzipCompressorState *gzipcs = (GzipCompressorState *) cs->private_data;
+ z_streamp zp = gzipcs->zp;
+ void *out = gzipcs->outbuf;
+ int res = Z_OK;
+
+ while (gzipcs->zp->avail_in != 0 || flush)
+ {
+ res = deflate(zp, flush ? Z_FINISH : Z_NO_FLUSH);
+ if (res == Z_STREAM_ERROR)
+ pg_fatal("could not compress data: %s", zp->msg);
+ if ((flush && (zp->avail_out < gzipcs->outsize))
+ || (zp->avail_out == 0)
+ || (zp->avail_in != 0)
+ )
+ {
+ /*
+ * Extra paranoia: avoid zero-length chunks, since a zero length
+ * chunk is the EOF marker in the custom format. This should never
+ * happen but ...
+ */
+ if (zp->avail_out < gzipcs->outsize)
+ {
+ /*
+ * Any write function should do its own error checking but to
+ * make sure we do a check here as well ...
+ */
+ size_t len = gzipcs->outsize - zp->avail_out;
+
+ cs->writeF(AH, (char *) out, len);
+ }
+ zp->next_out = out;
+ zp->avail_out = gzipcs->outsize;
+ }
+
+ if (res == Z_STREAM_END)
+ break;
+ }
+}
+
+static void
+EndCompressorGzip(ArchiveHandle *AH, CompressorState *cs)
+{
+ /* If deflation was initialized, finalize it */
+ if (cs->private_data)
+ DeflateCompressorEnd(AH, cs);
+}
+
+static void
+WriteDataToArchiveGzip(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen)
+{
+ GzipCompressorState *gzipcs = (GzipCompressorState *) cs->private_data;
+
+ gzipcs->zp->next_in = (void *) unconstify(void *, data);
+ gzipcs->zp->avail_in = dLen;
+ DeflateCompressorCommon(AH, cs, false);
+}
+
+static void
+ReadDataFromArchiveGzip(ArchiveHandle *AH, CompressorState *cs)
+{
+ z_streamp zp;
+ char *out;
+ int res = Z_OK;
+ size_t cnt;
+ char *buf;
+ size_t buflen;
+
+ zp = (z_streamp) pg_malloc(sizeof(z_stream));
+ zp->zalloc = Z_NULL;
+ zp->zfree = Z_NULL;
+ zp->opaque = Z_NULL;
+
+ buflen = DEFAULT_IO_BUFFER_SIZE;
+ buf = pg_malloc(buflen);
+
+ out = pg_malloc(DEFAULT_IO_BUFFER_SIZE + 1);
+
+ if (inflateInit(zp) != Z_OK)
+ pg_fatal("could not initialize compression library: %s",
+ zp->msg);
+
+ /* no minimal chunk size for zlib */
+ while ((cnt = cs->readF(AH, &buf, &buflen)))
+ {
+ zp->next_in = (void *) buf;
+ zp->avail_in = cnt;
+
+ while (zp->avail_in > 0)
+ {
+ zp->next_out = (void *) out;
+ zp->avail_out = DEFAULT_IO_BUFFER_SIZE;
+
+ res = inflate(zp, 0);
+ if (res != Z_OK && res != Z_STREAM_END)
+ pg_fatal("could not uncompress data: %s", zp->msg);
+
+ out[DEFAULT_IO_BUFFER_SIZE - zp->avail_out] = '\0';
+ ahwrite(out, 1, DEFAULT_IO_BUFFER_SIZE - zp->avail_out, AH);
+ }
+ }
+
+ zp->next_in = NULL;
+ zp->avail_in = 0;
+ while (res != Z_STREAM_END)
+ {
+ zp->next_out = (void *) out;
+ zp->avail_out = DEFAULT_IO_BUFFER_SIZE;
+ res = inflate(zp, 0);
+ if (res != Z_OK && res != Z_STREAM_END)
+ pg_fatal("could not uncompress data: %s", zp->msg);
+
+ out[DEFAULT_IO_BUFFER_SIZE - zp->avail_out] = '\0';
+ ahwrite(out, 1, DEFAULT_IO_BUFFER_SIZE - zp->avail_out, AH);
+ }
+
+ if (inflateEnd(zp) != Z_OK)
+ pg_fatal("could not close compression library: %s", zp->msg);
+
+ free(buf);
+ free(out);
+ free(zp);
+}
+
+/* Public routines that support gzip compressed data I/O */
+void
+InitCompressorGzip(CompressorState *cs,
+ const pg_compress_specification compression_spec)
+{
+ cs->readData = ReadDataFromArchiveGzip;
+ cs->writeData = WriteDataToArchiveGzip;
+ cs->end = EndCompressorGzip;
+
+ cs->compression_spec = compression_spec;
+
+ /*
+ * If the caller has defined a write function, prepare the necessary
+ * state. Note that if the data is empty, End may be called immediately
+ * after Init, without ever calling Write.
+ */
+ if (cs->writeF)
+ DeflateCompressorInit(cs);
+}
+
+
+/*----------------------
+ * Compress File API
+ *----------------------
+ */
+
+static bool
+Gzip_read(void *ptr, size_t size, size_t *rsize, CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+ int gzret;
+
+ gzret = gzread(gzfp, ptr, size);
+ if (gzret <= 0 && !gzeof(gzfp))
+ {
+ int errnum;
+ const char *errmsg = gzerror(gzfp, &errnum);
+
+ pg_fatal("could not read from input file: %s",
+ errnum == Z_ERRNO ? strerror(errno) : errmsg);
+ }
+
+ if (rsize)
+ *rsize = (size_t) gzret;
+
+ return true;
+}
+
+static bool
+Gzip_write(const void *ptr, size_t size, CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+
+ return gzwrite(gzfp, ptr, size) > 0;
+}
+
+static int
+Gzip_getc(CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+ int ret;
+
+ errno = 0;
+ ret = gzgetc(gzfp);
+ if (ret == EOF)
+ {
+ if (!gzeof(gzfp))
+ pg_fatal("could not read from input file: %s", strerror(errno));
+ else
+ pg_fatal("could not read from input file: end of file");
+ }
+
+ return ret;
+}
+
+static char *
+Gzip_gets(char *ptr, int size, CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+
+ return gzgets(gzfp, ptr, size);
+}
+
+static bool
+Gzip_close(CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+
+ CFH->private_data = NULL;
+
+ return gzclose(gzfp) == Z_OK;
+}
+
+static bool
+Gzip_eof(CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+
+ return gzeof(gzfp) == 1;
+}
+
+static const char *
+Gzip_get_error(CompressFileHandle *CFH)
+{
+ gzFile gzfp = (gzFile) CFH->private_data;
+ const char *errmsg;
+ int errnum;
+
+ errmsg = gzerror(gzfp, &errnum);
+ if (errnum == Z_ERRNO)
+ errmsg = strerror(errno);
+
+ return errmsg;
+}
+
+static bool
+Gzip_open(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
+{
+ gzFile gzfp;
+ char mode_compression[32];
+
+ if (CFH->compression_spec.level != Z_DEFAULT_COMPRESSION)
+ {
+ /*
+ * user has specified a compression level, so tell zlib to use it
+ */
+ snprintf(mode_compression, sizeof(mode_compression), "%s%d",
+ mode, CFH->compression_spec.level);
+ }
+ else
+ strcpy(mode_compression, mode);
+
+ if (fd >= 0)
+ gzfp = gzdopen(dup(fd), mode_compression);
+ else
+ gzfp = gzopen(path, mode_compression);
+
+ if (gzfp == NULL)
+ return false;
+
+ CFH->private_data = gzfp;
+
+ return true;
+}
+
+static bool
+Gzip_open_write(const char *path, const char *mode, CompressFileHandle *CFH)
+{
+ char *fname;
+ bool ret;
+ int save_errno;
+
+ fname = psprintf("%s.gz", path);
+ ret = CFH->open_func(fname, -1, mode, CFH);
+
+ save_errno = errno;
+ pg_free(fname);
+ errno = save_errno;
+
+ return ret;
+}
+
+void
+InitCompressFileHandleGzip(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec)
+{
+ CFH->open_func = Gzip_open;
+ CFH->open_write_func = Gzip_open_write;
+ CFH->read_func = Gzip_read;
+ CFH->write_func = Gzip_write;
+ CFH->gets_func = Gzip_gets;
+ CFH->getc_func = Gzip_getc;
+ CFH->close_func = Gzip_close;
+ CFH->eof_func = Gzip_eof;
+ CFH->get_error_func = Gzip_get_error;
+
+ CFH->compression_spec = compression_spec;
+
+ CFH->private_data = NULL;
+}
+#else /* HAVE_LIBZ */
+void
+InitCompressorGzip(CompressorState *cs,
+ const pg_compress_specification compression_spec)
+{
+ pg_fatal("this build does not support compression with %s", "gzip");
+}
+
+void
+InitCompressFileHandleGzip(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec)
+{
+ pg_fatal("this build does not support compression with %s", "gzip");
+}
+#endif /* HAVE_LIBZ */
diff --git a/src/bin/pg_dump/compress_gzip.h b/src/bin/pg_dump/compress_gzip.h
new file mode 100644
index 0000000..2392c69
--- /dev/null
+++ b/src/bin/pg_dump/compress_gzip.h
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_gzip.h
+ * GZIP interface to compress_io.c routines
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_gzip.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _COMPRESS_GZIP_H_
+#define _COMPRESS_GZIP_H_
+
+#include "compress_io.h"
+
+extern void InitCompressorGzip(CompressorState *cs,
+ const pg_compress_specification compression_spec);
+extern void InitCompressFileHandleGzip(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec);
+
+#endif /* _COMPRESS_GZIP_H_ */
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c
new file mode 100644
index 0000000..efedc53
--- /dev/null
+++ b/src/bin/pg_dump/compress_io.c
@@ -0,0 +1,299 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_io.c
+ * Routines for archivers to write an uncompressed or compressed data
+ * stream.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * This file includes two APIs for dealing with compressed data. The first
+ * provides more flexibility, using callbacks to read/write data from the
+ * underlying stream. The second API is a wrapper around fopen and
+ * friends, providing an interface similar to those, but abstracts away
+ * the possible compression. The second API is aimed for the resulting
+ * files to be easily manipulated with an external compression utility
+ * program.
+ *
+ * Compressor API
+ * --------------
+ *
+ * The interface for writing to an archive consists of three functions:
+ * AllocateCompressor, writeData, and EndCompressor. First you call
+ * AllocateCompressor, then write all the data by calling writeData as many
+ * times as needed, and finally EndCompressor. writeData will call the
+ * WriteFunc that was provided to AllocateCompressor for each chunk of
+ * compressed data.
+ *
+ * The interface for reading an archive consists of the same three functions:
+ * AllocateCompressor, readData, and EndCompressor. First you call
+ * AllocateCompressor, then read all the data by calling readData to read the
+ * whole compressed stream which repeatedly calls the given ReadFunc. ReadFunc
+ * returns the compressed data one chunk at a time. Then readData decompresses
+ * it and passes the decompressed data to ahwrite(), until ReadFunc returns 0
+ * to signal EOF. The interface is the same for compressed and uncompressed
+ * streams.
+ *
+ * Compressed stream API
+ * ----------------------
+ *
+ * The compressed stream API is providing a set of function pointers for
+ * opening, reading, writing, and finally closing files. The implemented
+ * function pointers are documented in the corresponding header file and are
+ * common for all streams. It allows the caller to use the same functions for
+ * both compressed and uncompressed streams.
+ *
+ * The interface consists of three functions, InitCompressFileHandle,
+ * InitDiscoverCompressFileHandle, and EndCompressFileHandle. If the
+ * compression is known, then start by calling InitCompressFileHandle,
+ * otherwise discover it by using InitDiscoverCompressFileHandle. Then call
+ * the function pointers as required for the read/write operations. Finally
+ * call EndCompressFileHandle to end the stream.
+ *
+ * InitDiscoverCompressFileHandle tries to infer the compression by the
+ * filename suffix. If the suffix is not yet known then it tries to simply
+ * open the file and if it fails, it tries to open the same file with
+ * compressed suffixes (.gz, .lz4 and .zst, in this order).
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_io.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "compress_gzip.h"
+#include "compress_io.h"
+#include "compress_lz4.h"
+#include "compress_none.h"
+#include "compress_zstd.h"
+#include "pg_backup_utils.h"
+
+/*----------------------
+ * Generic functions
+ *----------------------
+ */
+
+/*
+ * Checks whether support for a compression algorithm is implemented in
+ * pg_dump/restore.
+ *
+ * On success returns NULL, otherwise returns a malloc'ed string which can be
+ * used by the caller in an error message.
+ */
+char *
+supports_compression(const pg_compress_specification compression_spec)
+{
+ const pg_compress_algorithm algorithm = compression_spec.algorithm;
+ bool supported = false;
+
+ if (algorithm == PG_COMPRESSION_NONE)
+ supported = true;
+#ifdef HAVE_LIBZ
+ if (algorithm == PG_COMPRESSION_GZIP)
+ supported = true;
+#endif
+#ifdef USE_LZ4
+ if (algorithm == PG_COMPRESSION_LZ4)
+ supported = true;
+#endif
+#ifdef USE_ZSTD
+ if (algorithm == PG_COMPRESSION_ZSTD)
+ supported = true;
+#endif
+
+ if (!supported)
+ return psprintf(_("this build does not support compression with %s"),
+ get_compress_algorithm_name(algorithm));
+
+ return NULL;
+}
+
+/*----------------------
+ * Compressor API
+ *----------------------
+ */
+
+/*
+ * Allocate a new compressor.
+ */
+CompressorState *
+AllocateCompressor(const pg_compress_specification compression_spec,
+ ReadFunc readF, WriteFunc writeF)
+{
+ CompressorState *cs;
+
+ cs = (CompressorState *) pg_malloc0(sizeof(CompressorState));
+ cs->readF = readF;
+ cs->writeF = writeF;
+
+ if (compression_spec.algorithm == PG_COMPRESSION_NONE)
+ InitCompressorNone(cs, compression_spec);
+ else if (compression_spec.algorithm == PG_COMPRESSION_GZIP)
+ InitCompressorGzip(cs, compression_spec);
+ else if (compression_spec.algorithm == PG_COMPRESSION_LZ4)
+ InitCompressorLZ4(cs, compression_spec);
+ else if (compression_spec.algorithm == PG_COMPRESSION_ZSTD)
+ InitCompressorZstd(cs, compression_spec);
+
+ return cs;
+}
+
+/*
+ * Terminate compression library context and flush its buffers.
+ */
+void
+EndCompressor(ArchiveHandle *AH, CompressorState *cs)
+{
+ cs->end(AH, cs);
+ pg_free(cs);
+}
+
+/*----------------------
+ * Compressed stream API
+ *----------------------
+ */
+
+/*
+ * Private routines
+ */
+static int
+hasSuffix(const char *filename, const char *suffix)
+{
+ int filenamelen = strlen(filename);
+ int suffixlen = strlen(suffix);
+
+ if (filenamelen < suffixlen)
+ return 0;
+
+ return memcmp(&filename[filenamelen - suffixlen],
+ suffix,
+ suffixlen) == 0;
+}
+
+/* free() without changing errno; useful in several places below */
+static void
+free_keep_errno(void *p)
+{
+ int save_errno = errno;
+
+ free(p);
+ errno = save_errno;
+}
+
+/*
+ * Public interface
+ */
+
+/*
+ * Initialize a compress file handle for the specified compression algorithm.
+ */
+CompressFileHandle *
+InitCompressFileHandle(const pg_compress_specification compression_spec)
+{
+ CompressFileHandle *CFH;
+
+ CFH = pg_malloc0(sizeof(CompressFileHandle));
+
+ if (compression_spec.algorithm == PG_COMPRESSION_NONE)
+ InitCompressFileHandleNone(CFH, compression_spec);
+ else if (compression_spec.algorithm == PG_COMPRESSION_GZIP)
+ InitCompressFileHandleGzip(CFH, compression_spec);
+ else if (compression_spec.algorithm == PG_COMPRESSION_LZ4)
+ InitCompressFileHandleLZ4(CFH, compression_spec);
+ else if (compression_spec.algorithm == PG_COMPRESSION_ZSTD)
+ InitCompressFileHandleZstd(CFH, compression_spec);
+
+ return CFH;
+}
+
+/*
+ * Checks if a compressed file (with the specified extension) exists.
+ *
+ * The filename of the tested file is stored to fname buffer (the existing
+ * buffer is freed, new buffer is allocated and returned through the pointer).
+ */
+static bool
+check_compressed_file(const char *path, char **fname, char *ext)
+{
+ free_keep_errno(*fname);
+ *fname = psprintf("%s.%s", path, ext);
+ return (access(*fname, F_OK) == 0);
+}
+
+/*
+ * Open a file for reading. 'path' is the file to open, and 'mode' should
+ * be either "r" or "rb".
+ *
+ * If the file at 'path' contains the suffix of a supported compression method,
+ * currently this includes ".gz", ".lz4" and ".zst", then this compression will be used
+ * throughout. Otherwise the compression will be inferred by iteratively trying
+ * to open the file at 'path', first as is, then by appending known compression
+ * suffixes. So if you pass "foo" as 'path', this will open either "foo" or
+ * "foo.{gz,lz4,zst}", trying in that order.
+ *
+ * On failure, return NULL with an error code in errno.
+ */
+CompressFileHandle *
+InitDiscoverCompressFileHandle(const char *path, const char *mode)
+{
+ CompressFileHandle *CFH = NULL;
+ struct stat st;
+ char *fname;
+ pg_compress_specification compression_spec = {0};
+
+ compression_spec.algorithm = PG_COMPRESSION_NONE;
+
+ Assert(strcmp(mode, PG_BINARY_R) == 0);
+
+ fname = pg_strdup(path);
+
+ if (hasSuffix(fname, ".gz"))
+ compression_spec.algorithm = PG_COMPRESSION_GZIP;
+ else if (hasSuffix(fname, ".lz4"))
+ compression_spec.algorithm = PG_COMPRESSION_LZ4;
+ else if (hasSuffix(fname, ".zst"))
+ compression_spec.algorithm = PG_COMPRESSION_ZSTD;
+ else
+ {
+ if (stat(path, &st) == 0)
+ compression_spec.algorithm = PG_COMPRESSION_NONE;
+ else if (check_compressed_file(path, &fname, "gz"))
+ compression_spec.algorithm = PG_COMPRESSION_GZIP;
+ else if (check_compressed_file(path, &fname, "lz4"))
+ compression_spec.algorithm = PG_COMPRESSION_LZ4;
+ else if (check_compressed_file(path, &fname, "zst"))
+ compression_spec.algorithm = PG_COMPRESSION_ZSTD;
+ }
+
+ CFH = InitCompressFileHandle(compression_spec);
+ if (!CFH->open_func(fname, -1, mode, CFH))
+ {
+ free_keep_errno(CFH);
+ CFH = NULL;
+ }
+ free_keep_errno(fname);
+
+ return CFH;
+}
+
+/*
+ * Close an open file handle and release its memory.
+ *
+ * On failure, returns false and sets errno appropriately.
+ */
+bool
+EndCompressFileHandle(CompressFileHandle *CFH)
+{
+ bool ret = false;
+
+ if (CFH->private_data)
+ ret = CFH->close_func(CFH);
+
+ free_keep_errno(CFH);
+
+ return ret;
+}
diff --git a/src/bin/pg_dump/compress_io.h b/src/bin/pg_dump/compress_io.h
new file mode 100644
index 0000000..621e03a
--- /dev/null
+++ b/src/bin/pg_dump/compress_io.h
@@ -0,0 +1,207 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_io.h
+ * Interface to compress_io.c routines
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_io.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef __COMPRESS_IO__
+#define __COMPRESS_IO__
+
+#include "pg_backup_archiver.h"
+
+/*
+ * Default size used for IO buffers
+ *
+ * When changing this value, it's necessary to check the relevant test cases
+ * still exercise all the branches. This applies especially if the value is
+ * increased, in which case the overflow buffer may not be needed.
+ */
+#define DEFAULT_IO_BUFFER_SIZE 4096
+
+extern char *supports_compression(const pg_compress_specification compression_spec);
+
+/*
+ * Prototype for callback function used in writeData()
+ */
+typedef void (*WriteFunc) (ArchiveHandle *AH, const char *buf, size_t len);
+
+/*
+ * Prototype for callback function used in readData()
+ *
+ * readData will call the read function repeatedly, until it returns 0 to signal
+ * EOF. readData passes a buffer to read the data into in *buf, of length
+ * *buflen. If that's not big enough for the callback function, it can free() it
+ * and malloc() a new one, returning the new buffer and its size in *buf and
+ * *buflen.
+ *
+ * Returns the number of bytes read into *buf, or 0 on EOF.
+ */
+typedef size_t (*ReadFunc) (ArchiveHandle *AH, char **buf, size_t *buflen);
+
+typedef struct CompressorState CompressorState;
+struct CompressorState
+{
+ /*
+ * Read all compressed data from the input stream (via readF) and print it
+ * out with ahwrite().
+ */
+ void (*readData) (ArchiveHandle *AH, CompressorState *cs);
+
+ /*
+ * Compress and write data to the output stream (via writeF).
+ */
+ void (*writeData) (ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen);
+
+ /*
+ * End compression and flush internal buffers if any.
+ */
+ void (*end) (ArchiveHandle *AH, CompressorState *cs);
+
+ /*
+ * Callback function to read from an already processed input stream
+ */
+ ReadFunc readF;
+
+ /*
+ * Callback function to write an already processed chunk of data.
+ */
+ WriteFunc writeF;
+
+ /*
+ * Compression specification for this state.
+ */
+ pg_compress_specification compression_spec;
+
+ /*
+ * Private data to be used by the compressor.
+ */
+ void *private_data;
+};
+
+extern CompressorState *AllocateCompressor(const pg_compress_specification compression_spec,
+ ReadFunc readF,
+ WriteFunc writeF);
+extern void EndCompressor(ArchiveHandle *AH, CompressorState *cs);
+
+/*
+ * Compress File Handle
+ */
+typedef struct CompressFileHandle CompressFileHandle;
+
+struct CompressFileHandle
+{
+ /*
+ * Open a file in mode.
+ *
+ * Pass either 'path' or 'fd' depending on whether a file path or a file
+ * descriptor is available. 'mode' can be one of 'r', 'rb', 'w', 'wb',
+ * 'a', and 'ab'. Requires an already initialized CompressFileHandle.
+ *
+ * Returns true on success and false on error.
+ */
+ bool (*open_func) (const char *path, int fd, const char *mode,
+ CompressFileHandle *CFH);
+
+ /*
+ * Open a file for writing.
+ *
+ * 'mode' can be one of 'w', 'wb', 'a', and 'ab'. Requires an already
+ * initialized CompressFileHandle.
+ *
+ * Returns true on success and false on error.
+ */
+ bool (*open_write_func) (const char *path, const char *mode,
+ CompressFileHandle *CFH);
+
+ /*
+ * Read 'size' bytes of data from the file and store them into 'ptr'.
+ * Optionally it will store the number of bytes read in 'rsize'.
+ *
+ * Returns true on success and throws an internal error otherwise.
+ */
+ bool (*read_func) (void *ptr, size_t size, size_t *rsize,
+ CompressFileHandle *CFH);
+
+ /*
+ * Write 'size' bytes of data into the file from 'ptr'.
+ *
+ * Returns true on success and false on error.
+ */
+ bool (*write_func) (const void *ptr, size_t size,
+ struct CompressFileHandle *CFH);
+
+ /*
+ * Read at most size - 1 characters from the compress file handle into
+ * 's'.
+ *
+ * Stop if an EOF or a newline is found first. 's' is always null
+ * terminated and contains the newline if it was found.
+ *
+ * Returns 's' on success, and NULL on error or when end of file occurs
+ * while no characters have been read.
+ */
+ char *(*gets_func) (char *s, int size, CompressFileHandle *CFH);
+
+ /*
+ * Read the next character from the compress file handle as 'unsigned
+ * char' cast into 'int'.
+ *
+ * Returns the character read on success and throws an internal error
+ * otherwise. It treats EOF as error.
+ */
+ int (*getc_func) (CompressFileHandle *CFH);
+
+ /*
+ * Test if EOF is reached in the compress file handle.
+ *
+ * Returns true if it is reached.
+ */
+ bool (*eof_func) (CompressFileHandle *CFH);
+
+ /*
+ * Close an open file handle.
+ *
+ * Returns true on success and false on error.
+ */
+ bool (*close_func) (CompressFileHandle *CFH);
+
+ /*
+ * Get a pointer to a string that describes an error that occurred during
+ * a compress file handle operation.
+ */
+ const char *(*get_error_func) (CompressFileHandle *CFH);
+
+ /*
+ * Compression specification for this file handle.
+ */
+ pg_compress_specification compression_spec;
+
+ /*
+ * Private data to be used by the compressor.
+ */
+ void *private_data;
+};
+
+/*
+ * Initialize a compress file handle with the requested compression.
+ */
+extern CompressFileHandle *InitCompressFileHandle(const pg_compress_specification compression_spec);
+
+/*
+ * Initialize a compress file stream. Infer the compression algorithm
+ * from 'path', either by examining its suffix or by appending the supported
+ * suffixes in 'path'.
+ */
+extern CompressFileHandle *InitDiscoverCompressFileHandle(const char *path,
+ const char *mode);
+extern bool EndCompressFileHandle(CompressFileHandle *CFH);
+#endif
diff --git a/src/bin/pg_dump/compress_lz4.c b/src/bin/pg_dump/compress_lz4.c
new file mode 100644
index 0000000..52214b3
--- /dev/null
+++ b/src/bin/pg_dump/compress_lz4.c
@@ -0,0 +1,789 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_lz4.c
+ * Routines for archivers to write a LZ4 compressed data stream.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_lz4.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+#include "pg_backup_utils.h"
+
+#include "compress_lz4.h"
+
+#ifdef USE_LZ4
+#include <lz4frame.h>
+
+/*
+ * LZ4F_HEADER_SIZE_MAX first appeared in v1.7.5 of the library.
+ * Redefine it for installations with a lesser version.
+ */
+#ifndef LZ4F_HEADER_SIZE_MAX
+#define LZ4F_HEADER_SIZE_MAX 32
+#endif
+
+/*---------------------------------
+ * Common to both compression APIs
+ *---------------------------------
+ */
+
+/*
+ * (de)compression state used by both the Compressor and Stream APIs.
+ */
+typedef struct LZ4State
+{
+ /*
+ * Used by the Stream API to keep track of the file stream.
+ */
+ FILE *fp;
+
+ LZ4F_preferences_t prefs;
+
+ LZ4F_compressionContext_t ctx;
+ LZ4F_decompressionContext_t dtx;
+
+ /*
+ * Used by the Stream API's lazy initialization.
+ */
+ bool inited;
+
+ /*
+ * Used by the Stream API to distinguish between compression and
+ * decompression operations.
+ */
+ bool compressing;
+
+ /*
+ * Used by the Compressor API to mark if the compression headers have been
+ * written after initialization.
+ */
+ bool needs_header_flush;
+
+ size_t buflen;
+ char *buffer;
+
+ /*
+ * Used by the Stream API to store already uncompressed data that the
+ * caller has not consumed.
+ */
+ size_t overflowalloclen;
+ size_t overflowlen;
+ char *overflowbuf;
+
+ /*
+ * Used by both APIs to keep track of the compressed data length stored in
+ * the buffer.
+ */
+ size_t compressedlen;
+
+ /*
+ * Used by both APIs to keep track of error codes.
+ */
+ size_t errcode;
+} LZ4State;
+
+/*
+ * LZ4State_compression_init
+ * Initialize the required LZ4State members for compression.
+ *
+ * Write the LZ4 frame header in a buffer keeping track of its length. Users of
+ * this function can choose when and how to write the header to a file stream.
+ *
+ * Returns true on success. In case of a failure returns false, and stores the
+ * error code in state->errcode.
+ */
+static bool
+LZ4State_compression_init(LZ4State *state)
+{
+ size_t status;
+
+ state->buflen = LZ4F_compressBound(DEFAULT_IO_BUFFER_SIZE, &state->prefs);
+
+ /*
+ * LZ4F_compressBegin requires a buffer that is greater or equal to
+ * LZ4F_HEADER_SIZE_MAX. Verify that the requirement is met.
+ */
+ if (state->buflen < LZ4F_HEADER_SIZE_MAX)
+ state->buflen = LZ4F_HEADER_SIZE_MAX;
+
+ status = LZ4F_createCompressionContext(&state->ctx, LZ4F_VERSION);
+ if (LZ4F_isError(status))
+ {
+ state->errcode = status;
+ return false;
+ }
+
+ state->buffer = pg_malloc(state->buflen);
+ status = LZ4F_compressBegin(state->ctx,
+ state->buffer, state->buflen,
+ &state->prefs);
+ if (LZ4F_isError(status))
+ {
+ state->errcode = status;
+ return false;
+ }
+
+ state->compressedlen = status;
+
+ return true;
+}
+
+/*----------------------
+ * Compressor API
+ *----------------------
+ */
+
+/* Private routines that support LZ4 compressed data I/O */
+
+static void
+ReadDataFromArchiveLZ4(ArchiveHandle *AH, CompressorState *cs)
+{
+ size_t r;
+ size_t readbuflen;
+ char *outbuf;
+ char *readbuf;
+ LZ4F_decompressionContext_t ctx = NULL;
+ LZ4F_decompressOptions_t dec_opt;
+ LZ4F_errorCode_t status;
+
+ memset(&dec_opt, 0, sizeof(dec_opt));
+ status = LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
+ if (LZ4F_isError(status))
+ pg_fatal("could not create LZ4 decompression context: %s",
+ LZ4F_getErrorName(status));
+
+ outbuf = pg_malloc0(DEFAULT_IO_BUFFER_SIZE);
+ readbuf = pg_malloc0(DEFAULT_IO_BUFFER_SIZE);
+ readbuflen = DEFAULT_IO_BUFFER_SIZE;
+ while ((r = cs->readF(AH, &readbuf, &readbuflen)) > 0)
+ {
+ char *readp;
+ char *readend;
+
+ /* Process one chunk */
+ readp = readbuf;
+ readend = readbuf + r;
+ while (readp < readend)
+ {
+ size_t out_size = DEFAULT_IO_BUFFER_SIZE;
+ size_t read_size = readend - readp;
+
+ memset(outbuf, 0, DEFAULT_IO_BUFFER_SIZE);
+ status = LZ4F_decompress(ctx, outbuf, &out_size,
+ readp, &read_size, &dec_opt);
+ if (LZ4F_isError(status))
+ pg_fatal("could not decompress: %s",
+ LZ4F_getErrorName(status));
+
+ ahwrite(outbuf, 1, out_size, AH);
+ readp += read_size;
+ }
+ }
+
+ pg_free(outbuf);
+ pg_free(readbuf);
+
+ status = LZ4F_freeDecompressionContext(ctx);
+ if (LZ4F_isError(status))
+ pg_fatal("could not free LZ4 decompression context: %s",
+ LZ4F_getErrorName(status));
+}
+
+static void
+WriteDataToArchiveLZ4(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen)
+{
+ LZ4State *state = (LZ4State *) cs->private_data;
+ size_t remaining = dLen;
+ size_t status;
+ size_t chunk;
+
+ /* Write the header if not yet written. */
+ if (state->needs_header_flush)
+ {
+ cs->writeF(AH, state->buffer, state->compressedlen);
+ state->needs_header_flush = false;
+ }
+
+ while (remaining > 0)
+ {
+
+ if (remaining > DEFAULT_IO_BUFFER_SIZE)
+ chunk = DEFAULT_IO_BUFFER_SIZE;
+ else
+ chunk = remaining;
+
+ remaining -= chunk;
+ status = LZ4F_compressUpdate(state->ctx,
+ state->buffer, state->buflen,
+ data, chunk, NULL);
+
+ if (LZ4F_isError(status))
+ pg_fatal("could not compress data: %s",
+ LZ4F_getErrorName(status));
+
+ cs->writeF(AH, state->buffer, status);
+
+ data = ((char *) data) + chunk;
+ }
+}
+
+static void
+EndCompressorLZ4(ArchiveHandle *AH, CompressorState *cs)
+{
+ LZ4State *state = (LZ4State *) cs->private_data;
+ size_t status;
+
+ /* Nothing needs to be done */
+ if (!state)
+ return;
+
+ /*
+ * Write the header if not yet written. The caller is not required to call
+ * writeData if the relation does not contain any data. Thus it is
+ * possible to reach here without having flushed the header. Do it before
+ * ending the compression.
+ */
+ if (state->needs_header_flush)
+ cs->writeF(AH, state->buffer, state->compressedlen);
+
+ status = LZ4F_compressEnd(state->ctx,
+ state->buffer, state->buflen,
+ NULL);
+ if (LZ4F_isError(status))
+ pg_fatal("could not end compression: %s",
+ LZ4F_getErrorName(status));
+
+ cs->writeF(AH, state->buffer, status);
+
+ status = LZ4F_freeCompressionContext(state->ctx);
+ if (LZ4F_isError(status))
+ pg_fatal("could not end compression: %s",
+ LZ4F_getErrorName(status));
+
+ pg_free(state->buffer);
+ pg_free(state);
+
+ cs->private_data = NULL;
+}
+
+/*
+ * Public routines that support LZ4 compressed data I/O
+ */
+void
+InitCompressorLZ4(CompressorState *cs, const pg_compress_specification compression_spec)
+{
+ LZ4State *state;
+
+ cs->readData = ReadDataFromArchiveLZ4;
+ cs->writeData = WriteDataToArchiveLZ4;
+ cs->end = EndCompressorLZ4;
+
+ cs->compression_spec = compression_spec;
+
+ /*
+ * Read operations have access to the whole input. No state needs to be
+ * carried between calls.
+ */
+ if (cs->readF)
+ return;
+
+ state = pg_malloc0(sizeof(*state));
+ if (cs->compression_spec.level >= 0)
+ state->prefs.compressionLevel = cs->compression_spec.level;
+
+ if (!LZ4State_compression_init(state))
+ pg_fatal("could not initialize LZ4 compression: %s",
+ LZ4F_getErrorName(state->errcode));
+
+ /* Remember that the header has not been written. */
+ state->needs_header_flush = true;
+ cs->private_data = state;
+}
+
+/*----------------------
+ * Compress Stream API
+ *----------------------
+ */
+
+
+/*
+ * LZ4 equivalent to feof() or gzeof(). Return true iff there is no
+ * decompressed output in the overflow buffer and the end of the backing file
+ * is reached.
+ */
+static bool
+LZ4Stream_eof(CompressFileHandle *CFH)
+{
+ LZ4State *state = (LZ4State *) CFH->private_data;
+
+ return state->overflowlen == 0 && feof(state->fp);
+}
+
+static const char *
+LZ4Stream_get_error(CompressFileHandle *CFH)
+{
+ LZ4State *state = (LZ4State *) CFH->private_data;
+ const char *errmsg;
+
+ if (LZ4F_isError(state->errcode))
+ errmsg = LZ4F_getErrorName(state->errcode);
+ else
+ errmsg = strerror(errno);
+
+ return errmsg;
+}
+
+/*
+ * Initialize an already alloc'ed LZ4State struct for subsequent calls.
+ *
+ * Creates the necessary contexts for either compression or decompression. When
+ * compressing data (indicated by compressing=true), it additionally writes the
+ * LZ4 header in the output stream.
+ *
+ * Returns true on success. In case of a failure returns false, and stores the
+ * error code in state->errcode.
+ */
+static bool
+LZ4Stream_init(LZ4State *state, int size, bool compressing)
+{
+ size_t status;
+
+ if (state->inited)
+ return true;
+
+ state->compressing = compressing;
+ state->inited = true;
+
+ /* When compressing, write LZ4 header to the output stream. */
+ if (state->compressing)
+ {
+
+ if (!LZ4State_compression_init(state))
+ return false;
+
+ if (fwrite(state->buffer, 1, state->compressedlen, state->fp) != state->compressedlen)
+ {
+ errno = (errno) ? errno : ENOSPC;
+ return false;
+ }
+ }
+ else
+ {
+ status = LZ4F_createDecompressionContext(&state->dtx, LZ4F_VERSION);
+ if (LZ4F_isError(status))
+ {
+ state->errcode = status;
+ return false;
+ }
+
+ state->buflen = Max(size, DEFAULT_IO_BUFFER_SIZE);
+ state->buffer = pg_malloc(state->buflen);
+
+ state->overflowalloclen = state->buflen;
+ state->overflowbuf = pg_malloc(state->overflowalloclen);
+ state->overflowlen = 0;
+ }
+
+ return true;
+}
+
+/*
+ * Read already decompressed content from the overflow buffer into 'ptr' up to
+ * 'size' bytes, if available. If the eol_flag is set, then stop at the first
+ * occurrence of the newline char prior to 'size' bytes.
+ *
+ * Any unread content in the overflow buffer is moved to the beginning.
+ *
+ * Returns the number of bytes read from the overflow buffer (and copied into
+ * the 'ptr' buffer), or 0 if the overflow buffer is empty.
+ */
+static int
+LZ4Stream_read_overflow(LZ4State *state, void *ptr, int size, bool eol_flag)
+{
+ char *p;
+ int readlen = 0;
+
+ if (state->overflowlen == 0)
+ return 0;
+
+ if (state->overflowlen >= size)
+ readlen = size;
+ else
+ readlen = state->overflowlen;
+
+ if (eol_flag && (p = memchr(state->overflowbuf, '\n', readlen)))
+ /* Include the line terminating char */
+ readlen = p - state->overflowbuf + 1;
+
+ memcpy(ptr, state->overflowbuf, readlen);
+ state->overflowlen -= readlen;
+
+ if (state->overflowlen > 0)
+ memmove(state->overflowbuf, state->overflowbuf + readlen, state->overflowlen);
+
+ return readlen;
+}
+
+/*
+ * The workhorse for reading decompressed content out of an LZ4 compressed
+ * stream.
+ *
+ * It will read up to 'ptrsize' decompressed content, or up to the new line
+ * char if found first when the eol_flag is set. It is possible that the
+ * decompressed output generated by reading any compressed input via the
+ * LZ4F API, exceeds 'ptrsize'. Any exceeding decompressed content is stored
+ * at an overflow buffer within LZ4State. Of course, when the function is
+ * called, it will first try to consume any decompressed content already
+ * present in the overflow buffer, before decompressing new content.
+ *
+ * Returns the number of bytes of decompressed data copied into the ptr
+ * buffer, or -1 in case of error.
+ */
+static int
+LZ4Stream_read_internal(LZ4State *state, void *ptr, int ptrsize, bool eol_flag)
+{
+ int dsize = 0;
+ int rsize;
+ int size = ptrsize;
+ bool eol_found = false;
+
+ void *readbuf;
+
+ /* Lazy init */
+ if (!LZ4Stream_init(state, size, false /* decompressing */ ))
+ return -1;
+
+ /* No work needs to be done for a zero-sized output buffer */
+ if (size <= 0)
+ return 0;
+
+ /* Verify that there is enough space in the outbuf */
+ if (size > state->buflen)
+ {
+ state->buflen = size;
+ state->buffer = pg_realloc(state->buffer, size);
+ }
+
+ /* use already decompressed content if available */
+ dsize = LZ4Stream_read_overflow(state, ptr, size, eol_flag);
+ if (dsize == size || (eol_flag && memchr(ptr, '\n', dsize)))
+ return dsize;
+
+ readbuf = pg_malloc(size);
+
+ do
+ {
+ char *rp;
+ char *rend;
+
+ rsize = fread(readbuf, 1, size, state->fp);
+ if (rsize < size && !feof(state->fp))
+ return -1;
+
+ rp = (char *) readbuf;
+ rend = (char *) readbuf + rsize;
+
+ while (rp < rend)
+ {
+ size_t status;
+ size_t outlen = state->buflen;
+ size_t read_remain = rend - rp;
+
+ memset(state->buffer, 0, outlen);
+ status = LZ4F_decompress(state->dtx, state->buffer, &outlen,
+ rp, &read_remain, NULL);
+ if (LZ4F_isError(status))
+ {
+ state->errcode = status;
+ return -1;
+ }
+
+ rp += read_remain;
+
+ /*
+ * fill in what space is available in ptr if the eol flag is set,
+ * either skip if one already found or fill up to EOL if present
+ * in the outbuf
+ */
+ if (outlen > 0 && dsize < size && eol_found == false)
+ {
+ char *p;
+ size_t lib = (!eol_flag) ? size - dsize : size - 1 - dsize;
+ size_t len = outlen < lib ? outlen : lib;
+
+ if (eol_flag &&
+ (p = memchr(state->buffer, '\n', outlen)) &&
+ (size_t) (p - state->buffer + 1) <= len)
+ {
+ len = p - state->buffer + 1;
+ eol_found = true;
+ }
+
+ memcpy((char *) ptr + dsize, state->buffer, len);
+ dsize += len;
+
+ /* move what did not fit, if any, at the beginning of the buf */
+ if (len < outlen)
+ memmove(state->buffer, state->buffer + len, outlen - len);
+ outlen -= len;
+ }
+
+ /* if there is available output, save it */
+ if (outlen > 0)
+ {
+ while (state->overflowlen + outlen > state->overflowalloclen)
+ {
+ state->overflowalloclen *= 2;
+ state->overflowbuf = pg_realloc(state->overflowbuf,
+ state->overflowalloclen);
+ }
+
+ memcpy(state->overflowbuf + state->overflowlen, state->buffer, outlen);
+ state->overflowlen += outlen;
+ }
+ }
+ } while (rsize == size && dsize < size && eol_found == false);
+
+ pg_free(readbuf);
+
+ return dsize;
+}
+
+/*
+ * Compress size bytes from ptr and write them to the stream.
+ */
+static bool
+LZ4Stream_write(const void *ptr, size_t size, CompressFileHandle *CFH)
+{
+ LZ4State *state = (LZ4State *) CFH->private_data;
+ size_t status;
+ int remaining = size;
+
+ /* Lazy init */
+ if (!LZ4Stream_init(state, size, true))
+ return false;
+
+ while (remaining > 0)
+ {
+ int chunk = Min(remaining, DEFAULT_IO_BUFFER_SIZE);
+
+ remaining -= chunk;
+
+ status = LZ4F_compressUpdate(state->ctx, state->buffer, state->buflen,
+ ptr, chunk, NULL);
+ if (LZ4F_isError(status))
+ {
+ state->errcode = status;
+ return false;
+ }
+
+ if (fwrite(state->buffer, 1, status, state->fp) != status)
+ {
+ errno = (errno) ? errno : ENOSPC;
+ return false;
+ }
+
+ ptr = ((const char *) ptr) + chunk;
+ }
+
+ return true;
+}
+
+/*
+ * fread() equivalent implementation for LZ4 compressed files.
+ */
+static bool
+LZ4Stream_read(void *ptr, size_t size, size_t *rsize, CompressFileHandle *CFH)
+{
+ LZ4State *state = (LZ4State *) CFH->private_data;
+ int ret;
+
+ if ((ret = LZ4Stream_read_internal(state, ptr, size, false)) < 0)
+ pg_fatal("could not read from input file: %s", LZ4Stream_get_error(CFH));
+
+ if (rsize)
+ *rsize = (size_t) ret;
+
+ return true;
+}
+
+/*
+ * fgetc() equivalent implementation for LZ4 compressed files.
+ */
+static int
+LZ4Stream_getc(CompressFileHandle *CFH)
+{
+ LZ4State *state = (LZ4State *) CFH->private_data;
+ unsigned char c;
+
+ if (LZ4Stream_read_internal(state, &c, 1, false) <= 0)
+ {
+ if (!LZ4Stream_eof(CFH))
+ pg_fatal("could not read from input file: %s", LZ4Stream_get_error(CFH));
+ else
+ pg_fatal("could not read from input file: end of file");
+ }
+
+ return c;
+}
+
+/*
+ * fgets() equivalent implementation for LZ4 compressed files.
+ */
+static char *
+LZ4Stream_gets(char *ptr, int size, CompressFileHandle *CFH)
+{
+ LZ4State *state = (LZ4State *) CFH->private_data;
+ int ret;
+
+ ret = LZ4Stream_read_internal(state, ptr, size - 1, true);
+ if (ret < 0 || (ret == 0 && !LZ4Stream_eof(CFH)))
+ pg_fatal("could not read from input file: %s", LZ4Stream_get_error(CFH));
+
+ /* Done reading */
+ if (ret == 0)
+ return NULL;
+
+ /*
+ * Our caller expects the return string to be NULL terminated and we know
+ * that ret is greater than zero.
+ */
+ ptr[ret - 1] = '\0';
+
+ return ptr;
+}
+
+/*
+ * Finalize (de)compression of a stream. When compressing it will write any
+ * remaining content and/or generated footer from the LZ4 API.
+ */
+static bool
+LZ4Stream_close(CompressFileHandle *CFH)
+{
+ FILE *fp;
+ LZ4State *state = (LZ4State *) CFH->private_data;
+ size_t status;
+
+ fp = state->fp;
+ if (state->inited)
+ {
+ if (state->compressing)
+ {
+ status = LZ4F_compressEnd(state->ctx, state->buffer, state->buflen, NULL);
+ if (LZ4F_isError(status))
+ pg_fatal("could not end compression: %s",
+ LZ4F_getErrorName(status));
+ else if (fwrite(state->buffer, 1, status, state->fp) != status)
+ {
+ errno = (errno) ? errno : ENOSPC;
+ WRITE_ERROR_EXIT;
+ }
+
+ status = LZ4F_freeCompressionContext(state->ctx);
+ if (LZ4F_isError(status))
+ pg_fatal("could not end compression: %s",
+ LZ4F_getErrorName(status));
+ }
+ else
+ {
+ status = LZ4F_freeDecompressionContext(state->dtx);
+ if (LZ4F_isError(status))
+ pg_fatal("could not end decompression: %s",
+ LZ4F_getErrorName(status));
+ pg_free(state->overflowbuf);
+ }
+
+ pg_free(state->buffer);
+ }
+
+ pg_free(state);
+
+ return fclose(fp) == 0;
+}
+
+static bool
+LZ4Stream_open(const char *path, int fd, const char *mode,
+ CompressFileHandle *CFH)
+{
+ FILE *fp;
+ LZ4State *state = (LZ4State *) CFH->private_data;
+
+ if (fd >= 0)
+ fp = fdopen(fd, mode);
+ else
+ fp = fopen(path, mode);
+ if (fp == NULL)
+ {
+ state->errcode = errno;
+ return false;
+ }
+
+ state->fp = fp;
+
+ return true;
+}
+
+static bool
+LZ4Stream_open_write(const char *path, const char *mode, CompressFileHandle *CFH)
+{
+ char *fname;
+ int save_errno;
+ bool ret;
+
+ fname = psprintf("%s.lz4", path);
+ ret = CFH->open_func(fname, -1, mode, CFH);
+
+ save_errno = errno;
+ pg_free(fname);
+ errno = save_errno;
+
+ return ret;
+}
+
+/*
+ * Public routines
+ */
+void
+InitCompressFileHandleLZ4(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec)
+{
+ LZ4State *state;
+
+ CFH->open_func = LZ4Stream_open;
+ CFH->open_write_func = LZ4Stream_open_write;
+ CFH->read_func = LZ4Stream_read;
+ CFH->write_func = LZ4Stream_write;
+ CFH->gets_func = LZ4Stream_gets;
+ CFH->getc_func = LZ4Stream_getc;
+ CFH->eof_func = LZ4Stream_eof;
+ CFH->close_func = LZ4Stream_close;
+ CFH->get_error_func = LZ4Stream_get_error;
+
+ CFH->compression_spec = compression_spec;
+ state = pg_malloc0(sizeof(*state));
+ if (CFH->compression_spec.level >= 0)
+ state->prefs.compressionLevel = CFH->compression_spec.level;
+
+ CFH->private_data = state;
+}
+#else /* USE_LZ4 */
+void
+InitCompressorLZ4(CompressorState *cs,
+ const pg_compress_specification compression_spec)
+{
+ pg_fatal("this build does not support compression with %s", "LZ4");
+}
+
+void
+InitCompressFileHandleLZ4(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec)
+{
+ pg_fatal("this build does not support compression with %s", "LZ4");
+}
+#endif /* USE_LZ4 */
diff --git a/src/bin/pg_dump/compress_lz4.h b/src/bin/pg_dump/compress_lz4.h
new file mode 100644
index 0000000..40dbe00
--- /dev/null
+++ b/src/bin/pg_dump/compress_lz4.h
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_lz4.h
+ * LZ4 interface to compress_io.c routines
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_lz4.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _COMPRESS_LZ4_H_
+#define _COMPRESS_LZ4_H_
+
+#include "compress_io.h"
+
+extern void InitCompressorLZ4(CompressorState *cs,
+ const pg_compress_specification compression_spec);
+extern void InitCompressFileHandleLZ4(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec);
+
+#endif /* _COMPRESS_LZ4_H_ */
diff --git a/src/bin/pg_dump/compress_none.c b/src/bin/pg_dump/compress_none.c
new file mode 100644
index 0000000..736a795
--- /dev/null
+++ b/src/bin/pg_dump/compress_none.c
@@ -0,0 +1,215 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_none.c
+ * Routines for archivers to read or write an uncompressed stream.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_none.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+#include <unistd.h>
+
+#include "compress_none.h"
+#include "pg_backup_utils.h"
+
+/*----------------------
+ * Compressor API
+ *----------------------
+ */
+
+/*
+ * Private routines
+ */
+
+static void
+ReadDataFromArchiveNone(ArchiveHandle *AH, CompressorState *cs)
+{
+ size_t cnt;
+ char *buf;
+ size_t buflen;
+
+ buflen = DEFAULT_IO_BUFFER_SIZE;
+ buf = pg_malloc(buflen);
+
+ while ((cnt = cs->readF(AH, &buf, &buflen)))
+ {
+ ahwrite(buf, 1, cnt, AH);
+ }
+
+ free(buf);
+}
+
+
+static void
+WriteDataToArchiveNone(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen)
+{
+ cs->writeF(AH, data, dLen);
+}
+
+static void
+EndCompressorNone(ArchiveHandle *AH, CompressorState *cs)
+{
+ /* no op */
+}
+
+/*
+ * Public interface
+ */
+
+void
+InitCompressorNone(CompressorState *cs,
+ const pg_compress_specification compression_spec)
+{
+ cs->readData = ReadDataFromArchiveNone;
+ cs->writeData = WriteDataToArchiveNone;
+ cs->end = EndCompressorNone;
+
+ cs->compression_spec = compression_spec;
+}
+
+
+/*----------------------
+ * Compress File API
+ *----------------------
+ */
+
+/*
+ * Private routines
+ */
+
+static bool
+read_none(void *ptr, size_t size, size_t *rsize, CompressFileHandle *CFH)
+{
+ FILE *fp = (FILE *) CFH->private_data;
+ size_t ret;
+
+ if (size == 0)
+ return true;
+
+ ret = fread(ptr, 1, size, fp);
+ if (ret != size && !feof(fp))
+ pg_fatal("could not read from input file: %s",
+ strerror(errno));
+
+ if (rsize)
+ *rsize = ret;
+
+ return true;
+}
+
+static bool
+write_none(const void *ptr, size_t size, CompressFileHandle *CFH)
+{
+ size_t ret;
+
+ ret = fwrite(ptr, 1, size, (FILE *) CFH->private_data);
+ if (ret != size)
+ return false;
+
+ return true;
+}
+
+static const char *
+get_error_none(CompressFileHandle *CFH)
+{
+ return strerror(errno);
+}
+
+static char *
+gets_none(char *ptr, int size, CompressFileHandle *CFH)
+{
+ return fgets(ptr, size, (FILE *) CFH->private_data);
+}
+
+static int
+getc_none(CompressFileHandle *CFH)
+{
+ FILE *fp = (FILE *) CFH->private_data;
+ int ret;
+
+ ret = fgetc(fp);
+ if (ret == EOF)
+ {
+ if (!feof(fp))
+ pg_fatal("could not read from input file: %s", strerror(errno));
+ else
+ pg_fatal("could not read from input file: end of file");
+ }
+
+ return ret;
+}
+
+static bool
+close_none(CompressFileHandle *CFH)
+{
+ FILE *fp = (FILE *) CFH->private_data;
+ int ret = 0;
+
+ CFH->private_data = NULL;
+
+ if (fp)
+ ret = fclose(fp);
+
+ return ret == 0;
+}
+
+static bool
+eof_none(CompressFileHandle *CFH)
+{
+ return feof((FILE *) CFH->private_data) != 0;
+}
+
+static bool
+open_none(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
+{
+ Assert(CFH->private_data == NULL);
+
+ if (fd >= 0)
+ CFH->private_data = fdopen(dup(fd), mode);
+ else
+ CFH->private_data = fopen(path, mode);
+
+ if (CFH->private_data == NULL)
+ return false;
+
+ return true;
+}
+
+static bool
+open_write_none(const char *path, const char *mode, CompressFileHandle *CFH)
+{
+ Assert(CFH->private_data == NULL);
+
+ CFH->private_data = fopen(path, mode);
+ if (CFH->private_data == NULL)
+ return false;
+
+ return true;
+}
+
+/*
+ * Public interface
+ */
+
+void
+InitCompressFileHandleNone(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec)
+{
+ CFH->open_func = open_none;
+ CFH->open_write_func = open_write_none;
+ CFH->read_func = read_none;
+ CFH->write_func = write_none;
+ CFH->gets_func = gets_none;
+ CFH->getc_func = getc_none;
+ CFH->close_func = close_none;
+ CFH->eof_func = eof_none;
+ CFH->get_error_func = get_error_none;
+
+ CFH->private_data = NULL;
+}
diff --git a/src/bin/pg_dump/compress_none.h b/src/bin/pg_dump/compress_none.h
new file mode 100644
index 0000000..143e599
--- /dev/null
+++ b/src/bin/pg_dump/compress_none.h
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_none.h
+ * Uncompressed interface to compress_io.c routines
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_none.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef _COMPRESS_NONE_H_
+#define _COMPRESS_NONE_H_
+
+#include "compress_io.h"
+
+extern void InitCompressorNone(CompressorState *cs,
+ const pg_compress_specification compression_spec);
+extern void InitCompressFileHandleNone(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec);
+
+#endif /* _COMPRESS_NONE_H_ */
diff --git a/src/bin/pg_dump/compress_zstd.c b/src/bin/pg_dump/compress_zstd.c
new file mode 100644
index 0000000..82e3310
--- /dev/null
+++ b/src/bin/pg_dump/compress_zstd.c
@@ -0,0 +1,542 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_zstd.c
+ * Routines for archivers to write a Zstd compressed data stream.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_zstd.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "pg_backup_utils.h"
+#include "compress_zstd.h"
+
+#ifndef USE_ZSTD
+
+void
+InitCompressorZstd(CompressorState *cs, const pg_compress_specification compression_spec)
+{
+ pg_fatal("this build does not support compression with %s", "ZSTD");
+}
+
+void
+InitCompressFileHandleZstd(CompressFileHandle *CFH, const pg_compress_specification compression_spec)
+{
+ pg_fatal("this build does not support compression with %s", "ZSTD");
+}
+
+#else
+
+#include <zstd.h>
+
+typedef struct ZstdCompressorState
+{
+ /* This is a normal file to which we read/write compressed data */
+ FILE *fp;
+
+ ZSTD_CStream *cstream;
+ ZSTD_DStream *dstream;
+ ZSTD_outBuffer output;
+ ZSTD_inBuffer input;
+
+ /* pointer to a static string like from strerror(), for Zstd_write() */
+ const char *zstderror;
+} ZstdCompressorState;
+
+static ZSTD_CStream *_ZstdCStreamParams(pg_compress_specification compress);
+static void EndCompressorZstd(ArchiveHandle *AH, CompressorState *cs);
+static void WriteDataToArchiveZstd(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen);
+static void ReadDataFromArchiveZstd(ArchiveHandle *AH, CompressorState *cs);
+
+static void
+_Zstd_CCtx_setParam_or_die(ZSTD_CStream *cstream,
+ ZSTD_cParameter param, int value, char *paramname)
+{
+ size_t res;
+
+ res = ZSTD_CCtx_setParameter(cstream, param, value);
+ if (ZSTD_isError(res))
+ pg_fatal("could not set compression parameter \"%s\": %s",
+ paramname, ZSTD_getErrorName(res));
+}
+
+/* Return a compression stream with parameters set per argument */
+static ZSTD_CStream *
+_ZstdCStreamParams(pg_compress_specification compress)
+{
+ ZSTD_CStream *cstream;
+
+ cstream = ZSTD_createCStream();
+ if (cstream == NULL)
+ pg_fatal("could not initialize compression library");
+
+ _Zstd_CCtx_setParam_or_die(cstream, ZSTD_c_compressionLevel,
+ compress.level, "level");
+
+ if (compress.options & PG_COMPRESSION_OPTION_LONG_DISTANCE)
+ _Zstd_CCtx_setParam_or_die(cstream,
+ ZSTD_c_enableLongDistanceMatching,
+ compress.long_distance, "long");
+
+ return cstream;
+}
+
+/* Helper function for WriteDataToArchiveZstd and EndCompressorZstd */
+static void
+_ZstdWriteCommon(ArchiveHandle *AH, CompressorState *cs, bool flush)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) cs->private_data;
+ ZSTD_inBuffer *input = &zstdcs->input;
+ ZSTD_outBuffer *output = &zstdcs->output;
+
+ /* Loop while there's any input or until flushed */
+ while (input->pos != input->size || flush)
+ {
+ size_t res;
+
+ output->pos = 0;
+ res = ZSTD_compressStream2(zstdcs->cstream, output,
+ input, flush ? ZSTD_e_end : ZSTD_e_continue);
+
+ if (ZSTD_isError(res))
+ pg_fatal("could not compress data: %s", ZSTD_getErrorName(res));
+
+ /*
+ * Extra paranoia: avoid zero-length chunks, since a zero length chunk
+ * is the EOF marker in the custom format. This should never happen
+ * but...
+ */
+ if (output->pos > 0)
+ cs->writeF(AH, output->dst, output->pos);
+
+ if (res == 0)
+ break; /* End of frame or all input consumed */
+ }
+}
+
+static void
+EndCompressorZstd(ArchiveHandle *AH, CompressorState *cs)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) cs->private_data;
+
+ if (cs->readF != NULL)
+ {
+ Assert(zstdcs->cstream == NULL);
+ ZSTD_freeDStream(zstdcs->dstream);
+ pg_free(unconstify(void *, zstdcs->input.src));
+ }
+ else if (cs->writeF != NULL)
+ {
+ Assert(zstdcs->dstream == NULL);
+ _ZstdWriteCommon(AH, cs, true);
+ ZSTD_freeCStream(zstdcs->cstream);
+ pg_free(zstdcs->output.dst);
+ }
+
+ pg_free(zstdcs);
+}
+
+static void
+WriteDataToArchiveZstd(ArchiveHandle *AH, CompressorState *cs,
+ const void *data, size_t dLen)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) cs->private_data;
+
+ zstdcs->input.src = data;
+ zstdcs->input.size = dLen;
+ zstdcs->input.pos = 0;
+
+ _ZstdWriteCommon(AH, cs, false);
+}
+
+static void
+ReadDataFromArchiveZstd(ArchiveHandle *AH, CompressorState *cs)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) cs->private_data;
+ ZSTD_outBuffer *output = &zstdcs->output;
+ ZSTD_inBuffer *input = &zstdcs->input;
+ size_t input_allocated_size = ZSTD_DStreamInSize();
+ size_t res;
+
+ for (;;)
+ {
+ size_t cnt;
+
+ /*
+ * Read compressed data. Note that readF can resize the buffer; the
+ * new size is tracked and used for future loops.
+ */
+ input->size = input_allocated_size;
+ cnt = cs->readF(AH, (char **) unconstify(void **, &input->src), &input->size);
+
+ /* ensure that readF didn't *shrink* the buffer */
+ Assert(input->size >= input_allocated_size);
+ input_allocated_size = input->size;
+ input->size = cnt;
+ input->pos = 0;
+
+ if (cnt == 0)
+ break;
+
+ /* Now decompress */
+ while (input->pos < input->size)
+ {
+ output->pos = 0;
+ res = ZSTD_decompressStream(zstdcs->dstream, output, input);
+ if (ZSTD_isError(res))
+ pg_fatal("could not decompress data: %s", ZSTD_getErrorName(res));
+
+ /*
+ * then write the decompressed data to the output handle
+ */
+ ((char *) output->dst)[output->pos] = '\0';
+ ahwrite(output->dst, 1, output->pos, AH);
+
+ if (res == 0)
+ break; /* End of frame */
+ }
+ }
+}
+
+/* Public routine that supports Zstd compressed data I/O */
+void
+InitCompressorZstd(CompressorState *cs,
+ const pg_compress_specification compression_spec)
+{
+ ZstdCompressorState *zstdcs;
+
+ cs->readData = ReadDataFromArchiveZstd;
+ cs->writeData = WriteDataToArchiveZstd;
+ cs->end = EndCompressorZstd;
+
+ cs->compression_spec = compression_spec;
+
+ zstdcs = (ZstdCompressorState *) pg_malloc0(sizeof(*zstdcs));
+ cs->private_data = zstdcs;
+
+ /* We expect that exactly one of readF/writeF is specified */
+ Assert((cs->readF == NULL) != (cs->writeF == NULL));
+
+ if (cs->readF != NULL)
+ {
+ zstdcs->dstream = ZSTD_createDStream();
+ if (zstdcs->dstream == NULL)
+ pg_fatal("could not initialize compression library");
+
+ zstdcs->input.size = ZSTD_DStreamInSize();
+ zstdcs->input.src = pg_malloc(zstdcs->input.size);
+
+ /*
+ * output.size is the buffer size we tell zstd it can output to.
+ * Allocate an additional byte such that ReadDataFromArchiveZstd() can
+ * call ahwrite() with a null-terminated string, which is an optimized
+ * case in ExecuteSqlCommandBuf().
+ */
+ zstdcs->output.size = ZSTD_DStreamOutSize();
+ zstdcs->output.dst = pg_malloc(zstdcs->output.size + 1);
+ }
+ else if (cs->writeF != NULL)
+ {
+ zstdcs->cstream = _ZstdCStreamParams(cs->compression_spec);
+
+ zstdcs->output.size = ZSTD_CStreamOutSize();
+ zstdcs->output.dst = pg_malloc(zstdcs->output.size);
+ zstdcs->output.pos = 0;
+ }
+}
+
+/*
+ * Compressed stream API
+ */
+
+static bool
+Zstd_read(void *ptr, size_t size, size_t *rdsize, CompressFileHandle *CFH)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) CFH->private_data;
+ ZSTD_inBuffer *input = &zstdcs->input;
+ ZSTD_outBuffer *output = &zstdcs->output;
+ size_t input_allocated_size = ZSTD_DStreamInSize();
+ size_t res,
+ cnt;
+
+ output->size = size;
+ output->dst = ptr;
+ output->pos = 0;
+
+ for (;;)
+ {
+ Assert(input->pos <= input->size);
+ Assert(input->size <= input_allocated_size);
+
+ /*
+ * If the input is completely consumed, start back at the beginning
+ */
+ if (input->pos == input->size)
+ {
+ /* input->size is size produced by "fread" */
+ input->size = 0;
+ /* input->pos is position consumed by decompress */
+ input->pos = 0;
+ }
+
+ /* read compressed data if we must produce more input */
+ if (input->pos == input->size)
+ {
+ cnt = fread(unconstify(void *, input->src), 1, input_allocated_size, zstdcs->fp);
+ input->size = cnt;
+
+ Assert(cnt <= input_allocated_size);
+
+ /* If we have no more input to consume, we're done */
+ if (cnt == 0)
+ break;
+ }
+
+ while (input->pos < input->size)
+ {
+ /* now decompress */
+ res = ZSTD_decompressStream(zstdcs->dstream, output, input);
+
+ if (ZSTD_isError(res))
+ pg_fatal("could not decompress data: %s", ZSTD_getErrorName(res));
+
+ if (output->pos == output->size)
+ break; /* No more room for output */
+
+ if (res == 0)
+ break; /* End of frame */
+ }
+
+ if (output->pos == output->size)
+ break; /* We read all the data that fits */
+ }
+
+ if (rdsize != NULL)
+ *rdsize = output->pos;
+
+ return true;
+}
+
+static bool
+Zstd_write(const void *ptr, size_t size, CompressFileHandle *CFH)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) CFH->private_data;
+ ZSTD_inBuffer *input = &zstdcs->input;
+ ZSTD_outBuffer *output = &zstdcs->output;
+ size_t res,
+ cnt;
+
+ input->src = ptr;
+ input->size = size;
+ input->pos = 0;
+
+ /* Consume all input, to be flushed later */
+ while (input->pos != input->size)
+ {
+ output->pos = 0;
+ res = ZSTD_compressStream2(zstdcs->cstream, output, input, ZSTD_e_continue);
+ if (ZSTD_isError(res))
+ {
+ zstdcs->zstderror = ZSTD_getErrorName(res);
+ return false;
+ }
+
+ cnt = fwrite(output->dst, 1, output->pos, zstdcs->fp);
+ if (cnt != output->pos)
+ {
+ zstdcs->zstderror = strerror(errno);
+ return false;
+ }
+ }
+
+ return size;
+}
+
+static int
+Zstd_getc(CompressFileHandle *CFH)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) CFH->private_data;
+ int ret;
+
+ if (CFH->read_func(&ret, 1, NULL, CFH) != 1)
+ {
+ if (feof(zstdcs->fp))
+ pg_fatal("could not read from input file: end of file");
+ else
+ pg_fatal("could not read from input file: %m");
+ }
+ return ret;
+}
+
+static char *
+Zstd_gets(char *buf, int len, CompressFileHandle *CFH)
+{
+ int i;
+
+ Assert(len > 0);
+
+ /*
+ * Read one byte at a time until newline or EOF. This is only used to read
+ * the list of LOs, and the I/O is buffered anyway.
+ */
+ for (i = 0; i < len - 1; ++i)
+ {
+ size_t readsz;
+
+ if (!CFH->read_func(&buf[i], 1, &readsz, CFH))
+ break;
+ if (readsz != 1)
+ break;
+ if (buf[i] == '\n')
+ {
+ ++i;
+ break;
+ }
+ }
+ buf[i] = '\0';
+ return i > 0 ? buf : NULL;
+}
+
+static bool
+Zstd_close(CompressFileHandle *CFH)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) CFH->private_data;
+
+ if (zstdcs->cstream)
+ {
+ size_t res,
+ cnt;
+ ZSTD_inBuffer *input = &zstdcs->input;
+ ZSTD_outBuffer *output = &zstdcs->output;
+
+ /* Loop until the compression buffers are fully consumed */
+ for (;;)
+ {
+ output->pos = 0;
+ res = ZSTD_compressStream2(zstdcs->cstream, output, input, ZSTD_e_end);
+ if (ZSTD_isError(res))
+ {
+ zstdcs->zstderror = ZSTD_getErrorName(res);
+ return false;
+ }
+
+ cnt = fwrite(output->dst, 1, output->pos, zstdcs->fp);
+ if (cnt != output->pos)
+ {
+ zstdcs->zstderror = strerror(errno);
+ return false;
+ }
+
+ if (res == 0)
+ break; /* End of frame */
+ }
+
+ ZSTD_freeCStream(zstdcs->cstream);
+ pg_free(zstdcs->output.dst);
+ }
+
+ if (zstdcs->dstream)
+ {
+ ZSTD_freeDStream(zstdcs->dstream);
+ pg_free(unconstify(void *, zstdcs->input.src));
+ }
+
+ if (fclose(zstdcs->fp) != 0)
+ return false;
+
+ pg_free(zstdcs);
+ return true;
+}
+
+static bool
+Zstd_eof(CompressFileHandle *CFH)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) CFH->private_data;
+
+ return feof(zstdcs->fp);
+}
+
+static bool
+Zstd_open(const char *path, int fd, const char *mode,
+ CompressFileHandle *CFH)
+{
+ FILE *fp;
+ ZstdCompressorState *zstdcs;
+
+ if (fd >= 0)
+ fp = fdopen(fd, mode);
+ else
+ fp = fopen(path, mode);
+
+ if (fp == NULL)
+ return false;
+
+ zstdcs = (ZstdCompressorState *) pg_malloc0(sizeof(*zstdcs));
+ CFH->private_data = zstdcs;
+ zstdcs->fp = fp;
+
+ if (mode[0] == 'r')
+ {
+ zstdcs->input.src = pg_malloc0(ZSTD_DStreamInSize());
+ zstdcs->dstream = ZSTD_createDStream();
+ if (zstdcs->dstream == NULL)
+ pg_fatal("could not initialize compression library");
+ }
+ else if (mode[0] == 'w' || mode[0] == 'a')
+ {
+ zstdcs->output.size = ZSTD_CStreamOutSize();
+ zstdcs->output.dst = pg_malloc0(zstdcs->output.size);
+ zstdcs->cstream = _ZstdCStreamParams(CFH->compression_spec);
+ if (zstdcs->cstream == NULL)
+ pg_fatal("could not initialize compression library");
+ }
+ else
+ pg_fatal("unhandled mode \"%s\"", mode);
+
+ return true;
+}
+
+static bool
+Zstd_open_write(const char *path, const char *mode, CompressFileHandle *CFH)
+{
+ char fname[MAXPGPATH];
+
+ sprintf(fname, "%s.zst", path);
+ return CFH->open_func(fname, -1, mode, CFH);
+}
+
+static const char *
+Zstd_get_error(CompressFileHandle *CFH)
+{
+ ZstdCompressorState *zstdcs = (ZstdCompressorState *) CFH->private_data;
+
+ return zstdcs->zstderror;
+}
+
+void
+InitCompressFileHandleZstd(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec)
+{
+ CFH->open_func = Zstd_open;
+ CFH->open_write_func = Zstd_open_write;
+ CFH->read_func = Zstd_read;
+ CFH->write_func = Zstd_write;
+ CFH->gets_func = Zstd_gets;
+ CFH->getc_func = Zstd_getc;
+ CFH->close_func = Zstd_close;
+ CFH->eof_func = Zstd_eof;
+ CFH->get_error_func = Zstd_get_error;
+
+ CFH->compression_spec = compression_spec;
+
+ CFH->private_data = NULL;
+}
+
+#endif /* USE_ZSTD */
diff --git a/src/bin/pg_dump/compress_zstd.h b/src/bin/pg_dump/compress_zstd.h
new file mode 100644
index 0000000..d0ab135
--- /dev/null
+++ b/src/bin/pg_dump/compress_zstd.h
@@ -0,0 +1,25 @@
+/*-------------------------------------------------------------------------
+ *
+ * compress_zstd.h
+ * Zstd interface to compress_io.c routines
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/compress_zstd.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef COMPRESS_ZSTD_H
+#define COMPRESS_ZSTD_H
+
+#include "compress_io.h"
+
+extern void InitCompressorZstd(CompressorState *cs,
+ const pg_compress_specification compression_spec);
+extern void InitCompressFileHandleZstd(CompressFileHandle *CFH,
+ const pg_compress_specification compression_spec);
+
+#endif /* COMPRESS_ZSTD_H */
diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c
new file mode 100644
index 0000000..d2851cf
--- /dev/null
+++ b/src/bin/pg_dump/dumputils.c
@@ -0,0 +1,884 @@
+/*-------------------------------------------------------------------------
+ *
+ * Utility routines for SQL dumping
+ *
+ * Basically this is stuff that is useful in both pg_dump and pg_dumpall.
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/dumputils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+
+
+static bool parseAclItem(const char *item, const char *type,
+ const char *name, const char *subname, int remoteVersion,
+ PQExpBuffer grantee, PQExpBuffer grantor,
+ PQExpBuffer privs, PQExpBuffer privswgo);
+static char *dequoteAclUserName(PQExpBuffer output, char *input);
+static void AddAcl(PQExpBuffer aclbuf, const char *keyword,
+ const char *subname);
+
+
+/*
+ * Build GRANT/REVOKE command(s) for an object.
+ *
+ * name: the object name, in the form to use in the commands (already quoted)
+ * subname: the sub-object name, if any (already quoted); NULL if none
+ * nspname: the namespace the object is in (NULL if none); not pre-quoted
+ * type: the object type (as seen in GRANT command: must be one of
+ * TABLE, SEQUENCE, FUNCTION, PROCEDURE, LANGUAGE, SCHEMA, DATABASE, TABLESPACE,
+ * FOREIGN DATA WRAPPER, SERVER, PARAMETER or LARGE OBJECT)
+ * acls: the ACL string fetched from the database
+ * baseacls: the initial ACL string for this object
+ * owner: username of object owner (will be passed through fmtId); can be
+ * NULL or empty string to indicate "no owner known"
+ * prefix: string to prefix to each generated command; typically empty
+ * remoteVersion: version of database
+ *
+ * Returns true if okay, false if could not parse the acl string.
+ * The resulting commands (if any) are appended to the contents of 'sql'.
+ *
+ * baseacls is typically the result of acldefault() for the object's type
+ * and owner. However, if there is a pg_init_privs entry for the object,
+ * it should instead be the initprivs ACLs. When acls is itself a
+ * pg_init_privs entry, baseacls is what to dump that relative to; then
+ * it can be either an acldefault() value or an empty ACL "{}".
+ *
+ * Note: when processing a default ACL, prefix is "ALTER DEFAULT PRIVILEGES "
+ * or something similar, and name is an empty string.
+ *
+ * Note: beware of passing a fmtId() result directly as 'name' or 'subname',
+ * since this routine uses fmtId() internally.
+ */
+bool
+buildACLCommands(const char *name, const char *subname, const char *nspname,
+ const char *type, const char *acls, const char *baseacls,
+ const char *owner, const char *prefix, int remoteVersion,
+ PQExpBuffer sql)
+{
+ bool ok = true;
+ char **aclitems = NULL;
+ char **baseitems = NULL;
+ char **grantitems = NULL;
+ char **revokeitems = NULL;
+ int naclitems = 0;
+ int nbaseitems = 0;
+ int ngrantitems = 0;
+ int nrevokeitems = 0;
+ int i;
+ PQExpBuffer grantee,
+ grantor,
+ privs,
+ privswgo;
+ PQExpBuffer firstsql,
+ secondsql;
+
+ /*
+ * If the acl was NULL (initial default state), we need do nothing. Note
+ * that this is distinguishable from all-privileges-revoked, which will
+ * look like an empty array ("{}").
+ */
+ if (acls == NULL || *acls == '\0')
+ return true; /* object has default permissions */
+
+ /* treat empty-string owner same as NULL */
+ if (owner && *owner == '\0')
+ owner = NULL;
+
+ /* Parse the acls array */
+ if (!parsePGArray(acls, &aclitems, &naclitems))
+ {
+ free(aclitems);
+ return false;
+ }
+
+ /* Parse the baseacls too */
+ if (!parsePGArray(baseacls, &baseitems, &nbaseitems))
+ {
+ free(aclitems);
+ free(baseitems);
+ return false;
+ }
+
+ /*
+ * Compare the actual ACL with the base ACL, extracting the privileges
+ * that need to be granted (i.e., are in the actual ACL but not the base
+ * ACL) and the ones that need to be revoked (the reverse). We use plain
+ * string comparisons to check for matches. In principle that could be
+ * fooled by extraneous issues such as whitespace, but since all these
+ * strings are the work of aclitemout(), it should be OK in practice.
+ * Besides, a false mismatch will just cause the output to be a little
+ * more verbose than it really needed to be.
+ */
+ grantitems = (char **) pg_malloc(naclitems * sizeof(char *));
+ for (i = 0; i < naclitems; i++)
+ {
+ bool found = false;
+
+ for (int j = 0; j < nbaseitems; j++)
+ {
+ if (strcmp(aclitems[i], baseitems[j]) == 0)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ grantitems[ngrantitems++] = aclitems[i];
+ }
+ revokeitems = (char **) pg_malloc(nbaseitems * sizeof(char *));
+ for (i = 0; i < nbaseitems; i++)
+ {
+ bool found = false;
+
+ for (int j = 0; j < naclitems; j++)
+ {
+ if (strcmp(baseitems[i], aclitems[j]) == 0)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ revokeitems[nrevokeitems++] = baseitems[i];
+ }
+
+ /* Prepare working buffers */
+ grantee = createPQExpBuffer();
+ grantor = createPQExpBuffer();
+ privs = createPQExpBuffer();
+ privswgo = createPQExpBuffer();
+
+ /*
+ * At the end, these two will be pasted together to form the result.
+ */
+ firstsql = createPQExpBuffer();
+ secondsql = createPQExpBuffer();
+
+ /*
+ * Build REVOKE statements for ACLs listed in revokeitems[].
+ */
+ for (i = 0; i < nrevokeitems; i++)
+ {
+ if (!parseAclItem(revokeitems[i],
+ type, name, subname, remoteVersion,
+ grantee, grantor, privs, NULL))
+ {
+ ok = false;
+ break;
+ }
+
+ if (privs->len > 0)
+ {
+ appendPQExpBuffer(firstsql, "%sREVOKE %s ON %s ",
+ prefix, privs->data, type);
+ if (nspname && *nspname)
+ appendPQExpBuffer(firstsql, "%s.", fmtId(nspname));
+ if (name && *name)
+ appendPQExpBuffer(firstsql, "%s ", name);
+ appendPQExpBufferStr(firstsql, "FROM ");
+ if (grantee->len == 0)
+ appendPQExpBufferStr(firstsql, "PUBLIC;\n");
+ else
+ appendPQExpBuffer(firstsql, "%s;\n",
+ fmtId(grantee->data));
+ }
+ }
+
+ /*
+ * At this point we have issued REVOKE statements for all initial and
+ * default privileges that are no longer present on the object, so we are
+ * almost ready to GRANT the privileges listed in grantitems[].
+ *
+ * We still need some hacking though to cover the case where new default
+ * public privileges are added in new versions: the REVOKE ALL will revoke
+ * them, leading to behavior different from what the old version had,
+ * which is generally not what's wanted. So add back default privs if the
+ * source database is too old to have had that particular priv. (As of
+ * right now, no such cases exist in supported versions.)
+ */
+
+ /*
+ * Scan individual ACL items to be granted.
+ *
+ * The order in which privileges appear in the ACL string (the order they
+ * have been GRANT'd in, which the backend maintains) must be preserved to
+ * ensure that GRANTs WITH GRANT OPTION and subsequent GRANTs based on
+ * those are dumped in the correct order. However, some old server
+ * versions will show grants to PUBLIC before the owner's own grants; for
+ * consistency's sake, force the owner's grants to be output first.
+ */
+ for (i = 0; i < ngrantitems; i++)
+ {
+ if (parseAclItem(grantitems[i], type, name, subname, remoteVersion,
+ grantee, grantor, privs, privswgo))
+ {
+ /*
+ * If the grantor isn't the owner, we'll need to use SET SESSION
+ * AUTHORIZATION to become the grantor. Issue the SET/RESET only
+ * if there's something useful to do.
+ */
+ if (privs->len > 0 || privswgo->len > 0)
+ {
+ PQExpBuffer thissql;
+
+ /* Set owner as grantor if that's not explicit in the ACL */
+ if (grantor->len == 0 && owner)
+ printfPQExpBuffer(grantor, "%s", owner);
+
+ /* Make sure owner's own grants are output before others */
+ if (owner &&
+ strcmp(grantee->data, owner) == 0 &&
+ strcmp(grantor->data, owner) == 0)
+ thissql = firstsql;
+ else
+ thissql = secondsql;
+
+ if (grantor->len > 0
+ && (!owner || strcmp(owner, grantor->data) != 0))
+ appendPQExpBuffer(thissql, "SET SESSION AUTHORIZATION %s;\n",
+ fmtId(grantor->data));
+
+ if (privs->len > 0)
+ {
+ appendPQExpBuffer(thissql, "%sGRANT %s ON %s ",
+ prefix, privs->data, type);
+ if (nspname && *nspname)
+ appendPQExpBuffer(thissql, "%s.", fmtId(nspname));
+ if (name && *name)
+ appendPQExpBuffer(thissql, "%s ", name);
+ appendPQExpBufferStr(thissql, "TO ");
+ if (grantee->len == 0)
+ appendPQExpBufferStr(thissql, "PUBLIC;\n");
+ else
+ appendPQExpBuffer(thissql, "%s;\n", fmtId(grantee->data));
+ }
+ if (privswgo->len > 0)
+ {
+ appendPQExpBuffer(thissql, "%sGRANT %s ON %s ",
+ prefix, privswgo->data, type);
+ if (nspname && *nspname)
+ appendPQExpBuffer(thissql, "%s.", fmtId(nspname));
+ if (name && *name)
+ appendPQExpBuffer(thissql, "%s ", name);
+ appendPQExpBufferStr(thissql, "TO ");
+ if (grantee->len == 0)
+ appendPQExpBufferStr(thissql, "PUBLIC");
+ else
+ appendPQExpBufferStr(thissql, fmtId(grantee->data));
+ appendPQExpBufferStr(thissql, " WITH GRANT OPTION;\n");
+ }
+
+ if (grantor->len > 0
+ && (!owner || strcmp(owner, grantor->data) != 0))
+ appendPQExpBufferStr(thissql, "RESET SESSION AUTHORIZATION;\n");
+ }
+ }
+ else
+ {
+ /* parseAclItem failed, give up */
+ ok = false;
+ break;
+ }
+ }
+
+ destroyPQExpBuffer(grantee);
+ destroyPQExpBuffer(grantor);
+ destroyPQExpBuffer(privs);
+ destroyPQExpBuffer(privswgo);
+
+ appendPQExpBuffer(sql, "%s%s", firstsql->data, secondsql->data);
+ destroyPQExpBuffer(firstsql);
+ destroyPQExpBuffer(secondsql);
+
+ free(aclitems);
+ free(baseitems);
+ free(grantitems);
+ free(revokeitems);
+
+ return ok;
+}
+
+/*
+ * Build ALTER DEFAULT PRIVILEGES command(s) for a single pg_default_acl entry.
+ *
+ * type: the object type (TABLES, FUNCTIONS, etc)
+ * nspname: schema name, or NULL for global default privileges
+ * acls: the ACL string fetched from the database
+ * acldefault: the appropriate default ACL for the object type and owner
+ * owner: username of privileges owner (will be passed through fmtId)
+ * remoteVersion: version of database
+ *
+ * Returns true if okay, false if could not parse the acl string.
+ * The resulting commands (if any) are appended to the contents of 'sql'.
+ */
+bool
+buildDefaultACLCommands(const char *type, const char *nspname,
+ const char *acls, const char *acldefault,
+ const char *owner,
+ int remoteVersion,
+ PQExpBuffer sql)
+{
+ PQExpBuffer prefix;
+
+ prefix = createPQExpBuffer();
+
+ /*
+ * We incorporate the target role directly into the command, rather than
+ * playing around with SET ROLE or anything like that. This is so that a
+ * permissions error leads to nothing happening, rather than changing
+ * default privileges for the wrong user.
+ */
+ appendPQExpBuffer(prefix, "ALTER DEFAULT PRIVILEGES FOR ROLE %s ",
+ fmtId(owner));
+ if (nspname)
+ appendPQExpBuffer(prefix, "IN SCHEMA %s ", fmtId(nspname));
+
+ /*
+ * There's no such thing as initprivs for a default ACL, so the base ACL
+ * is always just the object-type-specific default.
+ */
+ if (!buildACLCommands("", NULL, NULL, type,
+ acls, acldefault, owner,
+ prefix->data, remoteVersion, sql))
+ {
+ destroyPQExpBuffer(prefix);
+ return false;
+ }
+
+ destroyPQExpBuffer(prefix);
+
+ return true;
+}
+
+/*
+ * This will parse an aclitem string, having the general form
+ * username=privilegecodes/grantor
+ *
+ * Returns true on success, false on parse error. On success, the components
+ * of the string are returned in the PQExpBuffer parameters.
+ *
+ * The returned grantee string will be the dequoted username, or an empty
+ * string in the case of a grant to PUBLIC. The returned grantor is the
+ * dequoted grantor name. Privilege characters are translated to GRANT/REVOKE
+ * comma-separated privileges lists. If "privswgo" is non-NULL, the result is
+ * separate lists for privileges with grant option ("privswgo") and without
+ * ("privs"). Otherwise, "privs" bears every relevant privilege, ignoring the
+ * grant option distinction.
+ *
+ * Note: for cross-version compatibility, it's important to use ALL to
+ * represent the privilege sets whenever appropriate.
+ */
+static bool
+parseAclItem(const char *item, const char *type,
+ const char *name, const char *subname, int remoteVersion,
+ PQExpBuffer grantee, PQExpBuffer grantor,
+ PQExpBuffer privs, PQExpBuffer privswgo)
+{
+ char *buf;
+ bool all_with_go = true;
+ bool all_without_go = true;
+ char *eqpos;
+ char *slpos;
+ char *pos;
+
+ buf = pg_strdup(item);
+
+ /* user or group name is string up to = */
+ eqpos = dequoteAclUserName(grantee, buf);
+ if (*eqpos != '=')
+ {
+ pg_free(buf);
+ return false;
+ }
+
+ /* grantor should appear after / */
+ slpos = strchr(eqpos + 1, '/');
+ if (slpos)
+ {
+ *slpos++ = '\0';
+ slpos = dequoteAclUserName(grantor, slpos);
+ if (*slpos != '\0')
+ {
+ pg_free(buf);
+ return false;
+ }
+ }
+ else
+ {
+ pg_free(buf);
+ return false;
+ }
+
+ /* privilege codes */
+#define CONVERT_PRIV(code, keywd) \
+do { \
+ if ((pos = strchr(eqpos + 1, code))) \
+ { \
+ if (*(pos + 1) == '*' && privswgo != NULL) \
+ { \
+ AddAcl(privswgo, keywd, subname); \
+ all_without_go = false; \
+ } \
+ else \
+ { \
+ AddAcl(privs, keywd, subname); \
+ all_with_go = false; \
+ } \
+ } \
+ else \
+ all_with_go = all_without_go = false; \
+} while (0)
+
+ resetPQExpBuffer(privs);
+ resetPQExpBuffer(privswgo);
+
+ if (strcmp(type, "TABLE") == 0 || strcmp(type, "SEQUENCE") == 0 ||
+ strcmp(type, "TABLES") == 0 || strcmp(type, "SEQUENCES") == 0)
+ {
+ CONVERT_PRIV('r', "SELECT");
+
+ if (strcmp(type, "SEQUENCE") == 0 ||
+ strcmp(type, "SEQUENCES") == 0)
+ /* sequence only */
+ CONVERT_PRIV('U', "USAGE");
+ else
+ {
+ /* table only */
+ CONVERT_PRIV('a', "INSERT");
+ CONVERT_PRIV('x', "REFERENCES");
+ /* rest are not applicable to columns */
+ if (subname == NULL)
+ {
+ CONVERT_PRIV('d', "DELETE");
+ CONVERT_PRIV('t', "TRIGGER");
+ CONVERT_PRIV('D', "TRUNCATE");
+ }
+ }
+
+ /* UPDATE */
+ CONVERT_PRIV('w', "UPDATE");
+ }
+ else if (strcmp(type, "FUNCTION") == 0 ||
+ strcmp(type, "FUNCTIONS") == 0)
+ CONVERT_PRIV('X', "EXECUTE");
+ else if (strcmp(type, "PROCEDURE") == 0 ||
+ strcmp(type, "PROCEDURES") == 0)
+ CONVERT_PRIV('X', "EXECUTE");
+ else if (strcmp(type, "LANGUAGE") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "SCHEMA") == 0 ||
+ strcmp(type, "SCHEMAS") == 0)
+ {
+ CONVERT_PRIV('C', "CREATE");
+ CONVERT_PRIV('U', "USAGE");
+ }
+ else if (strcmp(type, "DATABASE") == 0)
+ {
+ CONVERT_PRIV('C', "CREATE");
+ CONVERT_PRIV('c', "CONNECT");
+ CONVERT_PRIV('T', "TEMPORARY");
+ }
+ else if (strcmp(type, "TABLESPACE") == 0)
+ CONVERT_PRIV('C', "CREATE");
+ else if (strcmp(type, "TYPE") == 0 ||
+ strcmp(type, "TYPES") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "FOREIGN DATA WRAPPER") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "FOREIGN SERVER") == 0)
+ CONVERT_PRIV('U', "USAGE");
+ else if (strcmp(type, "FOREIGN TABLE") == 0)
+ CONVERT_PRIV('r', "SELECT");
+ else if (strcmp(type, "PARAMETER") == 0)
+ {
+ CONVERT_PRIV('s', "SET");
+ CONVERT_PRIV('A', "ALTER SYSTEM");
+ }
+ else if (strcmp(type, "LARGE OBJECT") == 0)
+ {
+ CONVERT_PRIV('r', "SELECT");
+ CONVERT_PRIV('w', "UPDATE");
+ }
+ else
+ abort();
+
+#undef CONVERT_PRIV
+
+ if (all_with_go)
+ {
+ resetPQExpBuffer(privs);
+ printfPQExpBuffer(privswgo, "ALL");
+ if (subname)
+ appendPQExpBuffer(privswgo, "(%s)", subname);
+ }
+ else if (all_without_go)
+ {
+ resetPQExpBuffer(privswgo);
+ printfPQExpBuffer(privs, "ALL");
+ if (subname)
+ appendPQExpBuffer(privs, "(%s)", subname);
+ }
+
+ pg_free(buf);
+
+ return true;
+}
+
+/*
+ * Transfer the role name at *input into the output buffer, adding
+ * quoting according to the same rules as putid() in backend's acl.c.
+ */
+void
+quoteAclUserName(PQExpBuffer output, const char *input)
+{
+ const char *src;
+ bool safe = true;
+
+ for (src = input; *src; src++)
+ {
+ /* This test had better match what putid() does */
+ if (!isalnum((unsigned char) *src) && *src != '_')
+ {
+ safe = false;
+ break;
+ }
+ }
+ if (!safe)
+ appendPQExpBufferChar(output, '"');
+ for (src = input; *src; src++)
+ {
+ /* A double quote character in a username is encoded as "" */
+ if (*src == '"')
+ appendPQExpBufferChar(output, '"');
+ appendPQExpBufferChar(output, *src);
+ }
+ if (!safe)
+ appendPQExpBufferChar(output, '"');
+}
+
+/*
+ * Transfer a user or group name starting at *input into the output buffer,
+ * dequoting if needed. Returns a pointer to just past the input name.
+ * The name is taken to end at an unquoted '=' or end of string.
+ * Note: unlike quoteAclUserName(), this first clears the output buffer.
+ */
+static char *
+dequoteAclUserName(PQExpBuffer output, char *input)
+{
+ resetPQExpBuffer(output);
+
+ while (*input && *input != '=')
+ {
+ /*
+ * If user name isn't quoted, then just add it to the output buffer
+ */
+ if (*input != '"')
+ appendPQExpBufferChar(output, *input++);
+ else
+ {
+ /* Otherwise, it's a quoted username */
+ input++;
+ /* Loop until we come across an unescaped quote */
+ while (!(*input == '"' && *(input + 1) != '"'))
+ {
+ if (*input == '\0')
+ return input; /* really a syntax error... */
+
+ /*
+ * Quoting convention is to escape " as "". Keep this code in
+ * sync with putid() in backend's acl.c.
+ */
+ if (*input == '"' && *(input + 1) == '"')
+ input++;
+ appendPQExpBufferChar(output, *input++);
+ }
+ input++;
+ }
+ }
+ return input;
+}
+
+/*
+ * Append a privilege keyword to a keyword list, inserting comma if needed.
+ */
+static void
+AddAcl(PQExpBuffer aclbuf, const char *keyword, const char *subname)
+{
+ if (aclbuf->len > 0)
+ appendPQExpBufferChar(aclbuf, ',');
+ appendPQExpBufferStr(aclbuf, keyword);
+ if (subname)
+ appendPQExpBuffer(aclbuf, "(%s)", subname);
+}
+
+
+/*
+ * buildShSecLabelQuery
+ *
+ * Build a query to retrieve security labels for a shared object.
+ * The object is identified by its OID plus the name of the catalog
+ * it can be found in (e.g., "pg_database" for database names).
+ * The query is appended to "sql". (We don't execute it here so as to
+ * keep this file free of assumptions about how to deal with SQL errors.)
+ */
+void
+buildShSecLabelQuery(const char *catalog_name, Oid objectId,
+ PQExpBuffer sql)
+{
+ appendPQExpBuffer(sql,
+ "SELECT provider, label FROM pg_catalog.pg_shseclabel "
+ "WHERE classoid = 'pg_catalog.%s'::pg_catalog.regclass "
+ "AND objoid = '%u'", catalog_name, objectId);
+}
+
+/*
+ * emitShSecLabels
+ *
+ * Construct SECURITY LABEL commands using the data retrieved by the query
+ * generated by buildShSecLabelQuery, and append them to "buffer".
+ * Here, the target object is identified by its type name (e.g. "DATABASE")
+ * and its name (not pre-quoted).
+ */
+void
+emitShSecLabels(PGconn *conn, PGresult *res, PQExpBuffer buffer,
+ const char *objtype, const char *objname)
+{
+ int i;
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *provider = PQgetvalue(res, i, 0);
+ char *label = PQgetvalue(res, i, 1);
+
+ /* must use fmtId result before calling it again */
+ appendPQExpBuffer(buffer,
+ "SECURITY LABEL FOR %s ON %s",
+ fmtId(provider), objtype);
+ appendPQExpBuffer(buffer,
+ " %s IS ",
+ fmtId(objname));
+ appendStringLiteralConn(buffer, label, conn);
+ appendPQExpBufferStr(buffer, ";\n");
+ }
+}
+
+
+/*
+ * Detect whether the given GUC variable is of GUC_LIST_QUOTE type.
+ *
+ * It'd be better if we could inquire this directly from the backend; but even
+ * if there were a function for that, it could only tell us about variables
+ * currently known to guc.c, so that it'd be unsafe for extensions to declare
+ * GUC_LIST_QUOTE variables anyway. Lacking a solution for that, it doesn't
+ * seem worth the work to do more than have this list, which must be kept in
+ * sync with the variables actually marked GUC_LIST_QUOTE in guc_tables.c.
+ */
+bool
+variable_is_guc_list_quote(const char *name)
+{
+ if (pg_strcasecmp(name, "local_preload_libraries") == 0 ||
+ pg_strcasecmp(name, "search_path") == 0 ||
+ pg_strcasecmp(name, "session_preload_libraries") == 0 ||
+ pg_strcasecmp(name, "shared_preload_libraries") == 0 ||
+ pg_strcasecmp(name, "temp_tablespaces") == 0 ||
+ pg_strcasecmp(name, "unix_socket_directories") == 0)
+ return true;
+ else
+ return false;
+}
+
+/*
+ * SplitGUCList --- parse a string containing identifiers or file names
+ *
+ * This is used to split the value of a GUC_LIST_QUOTE GUC variable, without
+ * presuming whether the elements will be taken as identifiers or file names.
+ * See comparable code in src/backend/utils/adt/varlena.c.
+ *
+ * Inputs:
+ * rawstring: the input string; must be overwritable! On return, it's
+ * been modified to contain the separated identifiers.
+ * separator: the separator punctuation expected between identifiers
+ * (typically '.' or ','). Whitespace may also appear around
+ * identifiers.
+ * Outputs:
+ * namelist: receives a malloc'd, null-terminated array of pointers to
+ * identifiers within rawstring. Caller should free this
+ * even on error return.
+ *
+ * Returns true if okay, false if there is a syntax error in the string.
+ */
+bool
+SplitGUCList(char *rawstring, char separator,
+ char ***namelist)
+{
+ char *nextp = rawstring;
+ bool done = false;
+ char **nextptr;
+
+ /*
+ * Since we disallow empty identifiers, this is a conservative
+ * overestimate of the number of pointers we could need. Allow one for
+ * list terminator.
+ */
+ *namelist = nextptr = (char **)
+ pg_malloc((strlen(rawstring) / 2 + 2) * sizeof(char *));
+ *nextptr = NULL;
+
+ while (isspace((unsigned char) *nextp))
+ nextp++; /* skip leading whitespace */
+
+ if (*nextp == '\0')
+ return true; /* allow empty string */
+
+ /* At the top of the loop, we are at start of a new identifier. */
+ do
+ {
+ char *curname;
+ char *endp;
+
+ if (*nextp == '"')
+ {
+ /* Quoted name --- collapse quote-quote pairs */
+ curname = nextp + 1;
+ for (;;)
+ {
+ endp = strchr(nextp + 1, '"');
+ if (endp == NULL)
+ return false; /* mismatched quotes */
+ if (endp[1] != '"')
+ break; /* found end of quoted name */
+ /* Collapse adjacent quotes into one quote, and look again */
+ memmove(endp, endp + 1, strlen(endp));
+ nextp = endp;
+ }
+ /* endp now points at the terminating quote */
+ nextp = endp + 1;
+ }
+ else
+ {
+ /* Unquoted name --- extends to separator or whitespace */
+ curname = nextp;
+ while (*nextp && *nextp != separator &&
+ !isspace((unsigned char) *nextp))
+ nextp++;
+ endp = nextp;
+ if (curname == nextp)
+ return false; /* empty unquoted name not allowed */
+ }
+
+ while (isspace((unsigned char) *nextp))
+ nextp++; /* skip trailing whitespace */
+
+ if (*nextp == separator)
+ {
+ nextp++;
+ while (isspace((unsigned char) *nextp))
+ nextp++; /* skip leading whitespace for next */
+ /* we expect another name, so done remains false */
+ }
+ else if (*nextp == '\0')
+ done = true;
+ else
+ return false; /* invalid syntax */
+
+ /* Now safe to overwrite separator with a null */
+ *endp = '\0';
+
+ /*
+ * Finished isolating current name --- add it to output array
+ */
+ *nextptr++ = curname;
+
+ /* Loop back if we didn't reach end of string */
+ } while (!done);
+
+ *nextptr = NULL;
+ return true;
+}
+
+/*
+ * Helper function for dumping "ALTER DATABASE/ROLE SET ..." commands.
+ *
+ * Parse the contents of configitem (a "name=value" string), wrap it in
+ * a complete ALTER command, and append it to buf.
+ *
+ * type is DATABASE or ROLE, and name is the name of the database or role.
+ * If we need an "IN" clause, type2 and name2 similarly define what to put
+ * there; otherwise they should be NULL.
+ * conn is used only to determine string-literal quoting conventions.
+ */
+void
+makeAlterConfigCommand(PGconn *conn, const char *configitem,
+ const char *type, const char *name,
+ const char *type2, const char *name2,
+ PQExpBuffer buf)
+{
+ char *mine;
+ char *pos;
+
+ /* Parse the configitem. If we can't find an "=", silently do nothing. */
+ mine = pg_strdup(configitem);
+ pos = strchr(mine, '=');
+ if (pos == NULL)
+ {
+ pg_free(mine);
+ return;
+ }
+ *pos++ = '\0';
+
+ /* Build the command, with suitable quoting for everything. */
+ appendPQExpBuffer(buf, "ALTER %s %s ", type, fmtId(name));
+ if (type2 != NULL && name2 != NULL)
+ appendPQExpBuffer(buf, "IN %s %s ", type2, fmtId(name2));
+ appendPQExpBuffer(buf, "SET %s TO ", fmtId(mine));
+
+ /*
+ * Variables that are marked GUC_LIST_QUOTE were already fully quoted by
+ * flatten_set_variable_args() before they were put into the setconfig
+ * array. However, because the quoting rules used there aren't exactly
+ * like SQL's, we have to break the list value apart and then quote the
+ * elements as string literals. (The elements may be double-quoted as-is,
+ * but we can't just feed them to the SQL parser; it would do the wrong
+ * thing with elements that are zero-length or longer than NAMEDATALEN.)
+ *
+ * Variables that are not so marked should just be emitted as simple
+ * string literals. If the variable is not known to
+ * variable_is_guc_list_quote(), we'll do that; this makes it unsafe to
+ * use GUC_LIST_QUOTE for extension variables.
+ */
+ if (variable_is_guc_list_quote(mine))
+ {
+ char **namelist;
+ char **nameptr;
+
+ /* Parse string into list of identifiers */
+ /* this shouldn't fail really */
+ if (SplitGUCList(pos, ',', &namelist))
+ {
+ for (nameptr = namelist; *nameptr; nameptr++)
+ {
+ if (nameptr != namelist)
+ appendPQExpBufferStr(buf, ", ");
+ appendStringLiteralConn(buf, *nameptr, conn);
+ }
+ }
+ pg_free(namelist);
+ }
+ else
+ appendStringLiteralConn(buf, pos, conn);
+
+ appendPQExpBufferStr(buf, ";\n");
+
+ pg_free(mine);
+}
diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h
new file mode 100644
index 0000000..2c81f51
--- /dev/null
+++ b/src/bin/pg_dump/dumputils.h
@@ -0,0 +1,66 @@
+/*-------------------------------------------------------------------------
+ *
+ * Utility routines for SQL dumping
+ *
+ * Basically this is stuff that is useful in both pg_dump and pg_dumpall.
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/dumputils.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef DUMPUTILS_H
+#define DUMPUTILS_H
+
+#include "libpq-fe.h"
+#include "pqexpbuffer.h"
+
+/*
+ * Preferred strftime(3) format specifier for printing timestamps in pg_dump
+ * and friends.
+ *
+ * We don't print the timezone on Windows, because the names are long and
+ * localized, which means they may contain characters in various random
+ * encodings; this has been seen to cause encoding errors when reading the
+ * dump script. Think not to get around that by using %z, because
+ * (1) %z is not portable to pre-C99 systems, and
+ * (2) %z doesn't actually act differently from %Z on Windows anyway.
+ */
+#ifndef WIN32
+#define PGDUMP_STRFTIME_FMT "%Y-%m-%d %H:%M:%S %Z"
+#else
+#define PGDUMP_STRFTIME_FMT "%Y-%m-%d %H:%M:%S"
+#endif
+
+
+extern bool buildACLCommands(const char *name, const char *subname, const char *nspname,
+ const char *type, const char *acls, const char *baseacls,
+ const char *owner, const char *prefix, int remoteVersion,
+ PQExpBuffer sql);
+extern bool buildDefaultACLCommands(const char *type, const char *nspname,
+ const char *acls, const char *acldefault,
+ const char *owner,
+ int remoteVersion,
+ PQExpBuffer sql);
+
+extern void quoteAclUserName(PQExpBuffer output, const char *input);
+
+extern void buildShSecLabelQuery(const char *catalog_name,
+ Oid objectId, PQExpBuffer sql);
+extern void emitShSecLabels(PGconn *conn, PGresult *res,
+ PQExpBuffer buffer, const char *objtype, const char *objname);
+
+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,
+ PQExpBuffer buf);
+
+#endif /* DUMPUTILS_H */
diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build
new file mode 100644
index 0000000..9d59a10
--- /dev/null
+++ b/src/bin/pg_dump/meson.build
@@ -0,0 +1,107 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_dump_common_sources = files(
+ 'compress_gzip.c',
+ 'compress_io.c',
+ 'compress_lz4.c',
+ 'compress_none.c',
+ 'compress_zstd.c',
+ 'dumputils.c',
+ 'parallel.c',
+ 'pg_backup_archiver.c',
+ 'pg_backup_custom.c',
+ 'pg_backup_db.c',
+ 'pg_backup_directory.c',
+ 'pg_backup_null.c',
+ 'pg_backup_tar.c',
+ 'pg_backup_utils.c',
+)
+
+pg_dump_common = static_library('libpgdump_common',
+ pg_dump_common_sources,
+ c_pch: pch_postgres_fe_h,
+ dependencies: [frontend_code, libpq, lz4, zlib, zstd],
+ kwargs: internal_lib_args,
+)
+
+
+pg_dump_sources = files(
+ 'common.c',
+ 'pg_dump.c',
+ 'pg_dump_sort.c',
+)
+
+if host_system == 'windows'
+ pg_dump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_dump',
+ '--FILEDESC', 'pg_dump - backup one PostgreSQL database',])
+endif
+
+pg_dump = executable('pg_dump',
+ pg_dump_sources,
+ link_with: [pg_dump_common],
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_dump
+
+
+pg_dumpall_sources = files(
+ 'pg_dumpall.c',
+)
+
+if host_system == 'windows'
+ pg_dumpall_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_dumpall',
+ '--FILEDESC', 'pg_dumpall - backup PostgreSQL databases'])
+endif
+
+pg_dumpall = executable('pg_dumpall',
+ pg_dumpall_sources,
+ link_with: [pg_dump_common],
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_dumpall
+
+
+pg_restore_sources = files(
+ 'pg_restore.c',
+)
+
+if host_system == 'windows'
+ pg_restore_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_restore',
+ '--FILEDESC', 'pg_restore - restore PostgreSQL databases'])
+endif
+
+pg_restore = executable('pg_restore',
+ pg_restore_sources,
+ link_with: [pg_dump_common],
+ dependencies: [frontend_code, libpq, zlib],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_restore
+
+tests += {
+ 'name': 'pg_dump',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {
+ 'GZIP_PROGRAM': gzip.path(),
+ 'LZ4': program_lz4.found() ? program_lz4.path() : '',
+ 'ZSTD': program_zstd.found() ? program_zstd.path() : '',
+ 'with_icu': icu.found() ? 'yes' : 'no',
+ },
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_pg_dump.pl',
+ 't/003_pg_dump_with_server.pl',
+ 't/004_pg_dump_parallel.pl',
+ 't/010_dump_connstr.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_dump/nls.mk b/src/bin/pg_dump/nls.mk
new file mode 100644
index 0000000..cd91737
--- /dev/null
+++ b/src/bin/pg_dump/nls.mk
@@ -0,0 +1,34 @@
+# src/bin/pg_dump/nls.mk
+CATALOG_NAME = pg_dump
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_backup_archiver.c \
+ pg_backup_db.c \
+ pg_backup_custom.c \
+ pg_backup_null.c \
+ pg_backup_tar.c \
+ pg_backup_directory.c \
+ dumputils.c \
+ compress_gzip.c \
+ compress_io.c \
+ compress_lz4.c \
+ compress_none.c \
+ compress_zstd.c \
+ pg_dump.c \
+ common.c \
+ pg_dump_sort.c \
+ pg_restore.c \
+ pg_dumpall.c \
+ parallel.c \
+ parallel.h \
+ pg_backup_utils.c \
+ pg_backup_utils.h \
+ ../../common/compression.c \
+ ../../common/exec.c \
+ ../../common/fe_memutils.c \
+ ../../common/wait_error.c \
+ ../../fe_utils/option_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ simple_prompt \
+ ExecuteSqlCommand:3 warn_or_exit_horribly:2
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ warn_or_exit_horribly:2:c-format
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
new file mode 100644
index 0000000..da0723a
--- /dev/null
+++ b/src/bin/pg_dump/parallel.c
@@ -0,0 +1,1801 @@
+/*-------------------------------------------------------------------------
+ *
+ * parallel.c
+ *
+ * Parallel support for pg_dump and pg_restore
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/parallel.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * Parallel operation works like this:
+ *
+ * The original, leader process calls ParallelBackupStart(), which forks off
+ * the desired number of worker processes, which each enter WaitForCommands().
+ *
+ * The leader process dispatches an individual work item to one of the worker
+ * processes in DispatchJobForTocEntry(). We send a command string such as
+ * "DUMP 1234" or "RESTORE 1234", where 1234 is the TocEntry ID.
+ * The worker process receives and decodes the command and passes it to the
+ * routine pointed to by AH->WorkerJobDumpPtr or AH->WorkerJobRestorePtr,
+ * which are routines of the current archive format. That routine performs
+ * the required action (dump or restore) and returns an integer status code.
+ * This is passed back to the leader where we pass it to the
+ * ParallelCompletionPtr callback function that was passed to
+ * DispatchJobForTocEntry(). The callback function does state updating
+ * for the leader control logic in pg_backup_archiver.c.
+ *
+ * In principle additional archive-format-specific information might be needed
+ * in commands or worker status responses, but so far that hasn't proved
+ * necessary, since workers have full copies of the ArchiveHandle/TocEntry
+ * data structures. Remember that we have forked off the workers only after
+ * we have read in the catalog. That's why our worker processes can also
+ * access the catalog information. (In the Windows case, the workers are
+ * threads in the same process. To avoid problems, they work with cloned
+ * copies of the Archive data structure; see RunWorker().)
+ *
+ * In the leader process, the workerStatus field for each worker has one of
+ * the following values:
+ * WRKR_NOT_STARTED: we've not yet forked this worker
+ * WRKR_IDLE: it's waiting for a command
+ * WRKR_WORKING: it's working on a command
+ * WRKR_TERMINATED: process ended
+ * The pstate->te[] entry for each worker is valid when it's in WRKR_WORKING
+ * state, and must be NULL in other states.
+ */
+
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <sys/select.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+
+#include "fe_utils/string_utils.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+#include "port/pg_bswap.h"
+
+/* Mnemonic macros for indexing the fd array returned by pipe(2) */
+#define PIPE_READ 0
+#define PIPE_WRITE 1
+
+#define NO_SLOT (-1) /* Failure result for GetIdleWorker() */
+
+/* Worker process statuses */
+typedef enum
+{
+ WRKR_NOT_STARTED = 0,
+ WRKR_IDLE,
+ WRKR_WORKING,
+ WRKR_TERMINATED
+} T_WorkerStatus;
+
+#define WORKER_IS_RUNNING(workerStatus) \
+ ((workerStatus) == WRKR_IDLE || (workerStatus) == WRKR_WORKING)
+
+/*
+ * Private per-parallel-worker state (typedef for this is in parallel.h).
+ *
+ * Much of this is valid only in the leader process (or, on Windows, should
+ * be touched only by the leader thread). But the AH field should be touched
+ * only by workers. The pipe descriptors are valid everywhere.
+ */
+struct ParallelSlot
+{
+ T_WorkerStatus workerStatus; /* see enum above */
+
+ /* These fields are valid if workerStatus == WRKR_WORKING: */
+ ParallelCompletionPtr callback; /* function to call on completion */
+ void *callback_data; /* passthrough data for it */
+
+ ArchiveHandle *AH; /* Archive data worker is using */
+
+ int pipeRead; /* leader's end of the pipes */
+ int pipeWrite;
+ int pipeRevRead; /* child's end of the pipes */
+ int pipeRevWrite;
+
+ /* Child process/thread identity info: */
+#ifdef WIN32
+ uintptr_t hThread;
+ unsigned int threadId;
+#else
+ pid_t pid;
+#endif
+};
+
+#ifdef WIN32
+
+/*
+ * Structure to hold info passed by _beginthreadex() to the function it calls
+ * via its single allowed argument.
+ */
+typedef struct
+{
+ ArchiveHandle *AH; /* leader database connection */
+ ParallelSlot *slot; /* this worker's parallel slot */
+} WorkerInfo;
+
+/* Windows implementation of pipe access */
+static int pgpipe(int handles[2]);
+#define piperead(a,b,c) recv(a,b,c,0)
+#define pipewrite(a,b,c) send(a,b,c,0)
+
+#else /* !WIN32 */
+
+/* Non-Windows implementation of pipe access */
+#define pgpipe(a) pipe(a)
+#define piperead(a,b,c) read(a,b,c)
+#define pipewrite(a,b,c) write(a,b,c)
+
+#endif /* WIN32 */
+
+/*
+ * State info for archive_close_connection() shutdown callback.
+ */
+typedef struct ShutdownInformation
+{
+ ParallelState *pstate;
+ Archive *AHX;
+} ShutdownInformation;
+
+static ShutdownInformation shutdown_info;
+
+/*
+ * State info for signal handling.
+ * We assume signal_info initializes to zeroes.
+ *
+ * On Unix, myAH is the leader DB connection in the leader process, and the
+ * worker's own connection in worker processes. On Windows, we have only one
+ * instance of signal_info, so myAH is the leader connection and the worker
+ * connections must be dug out of pstate->parallelSlot[].
+ */
+typedef struct DumpSignalInformation
+{
+ ArchiveHandle *myAH; /* database connection to issue cancel for */
+ ParallelState *pstate; /* parallel state, if any */
+ bool handler_set; /* signal handler set up in this process? */
+#ifndef WIN32
+ bool am_worker; /* am I a worker process? */
+#endif
+} DumpSignalInformation;
+
+static volatile DumpSignalInformation signal_info;
+
+#ifdef WIN32
+static CRITICAL_SECTION signal_info_lock;
+#endif
+
+/*
+ * Write a simple string to stderr --- must be safe in a signal handler.
+ * We ignore the write() result since there's not much we could do about it.
+ * Certain compilers make that harder than it ought to be.
+ */
+#define write_stderr(str) \
+ do { \
+ const char *str_ = (str); \
+ int rc_; \
+ rc_ = write(fileno(stderr), str_, strlen(str_)); \
+ (void) rc_; \
+ } while (0)
+
+
+#ifdef WIN32
+/* file-scope variables */
+static DWORD tls_index;
+
+/* globally visible variables (needed by exit_nicely) */
+bool parallel_init_done = false;
+DWORD mainThreadId;
+#endif /* WIN32 */
+
+/* Local function prototypes */
+static ParallelSlot *GetMyPSlot(ParallelState *pstate);
+static void archive_close_connection(int code, void *arg);
+static void ShutdownWorkersHard(ParallelState *pstate);
+static void WaitForTerminatingWorkers(ParallelState *pstate);
+static void setup_cancel_handler(void);
+static void set_cancel_pstate(ParallelState *pstate);
+static void set_cancel_slot_archive(ParallelSlot *slot, ArchiveHandle *AH);
+static void RunWorker(ArchiveHandle *AH, ParallelSlot *slot);
+static int GetIdleWorker(ParallelState *pstate);
+static bool HasEveryWorkerTerminated(ParallelState *pstate);
+static void lockTableForWorker(ArchiveHandle *AH, TocEntry *te);
+static void WaitForCommands(ArchiveHandle *AH, int pipefd[2]);
+static bool ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate,
+ bool do_wait);
+static char *getMessageFromLeader(int pipefd[2]);
+static void sendMessageToLeader(int pipefd[2], const char *str);
+static int select_loop(int maxFd, fd_set *workerset);
+static char *getMessageFromWorker(ParallelState *pstate,
+ bool do_wait, int *worker);
+static void sendMessageToWorker(ParallelState *pstate,
+ int worker, const char *str);
+static char *readMessageFromPipe(int fd);
+
+#define messageStartsWith(msg, prefix) \
+ (strncmp(msg, prefix, strlen(prefix)) == 0)
+
+
+/*
+ * Initialize parallel dump support --- should be called early in process
+ * startup. (Currently, this is called whether or not we intend parallel
+ * activity.)
+ */
+void
+init_parallel_dump_utils(void)
+{
+#ifdef WIN32
+ if (!parallel_init_done)
+ {
+ WSADATA wsaData;
+ int err;
+
+ /* Prepare for threaded operation */
+ tls_index = TlsAlloc();
+ mainThreadId = GetCurrentThreadId();
+
+ /* Initialize socket access */
+ err = WSAStartup(MAKEWORD(2, 2), &wsaData);
+ if (err != 0)
+ pg_fatal("%s() failed: error code %d", "WSAStartup", err);
+
+ parallel_init_done = true;
+ }
+#endif
+}
+
+/*
+ * Find the ParallelSlot for the current worker process or thread.
+ *
+ * Returns NULL if no matching slot is found (this implies we're the leader).
+ */
+static ParallelSlot *
+GetMyPSlot(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+#ifdef WIN32
+ if (pstate->parallelSlot[i].threadId == GetCurrentThreadId())
+#else
+ if (pstate->parallelSlot[i].pid == getpid())
+#endif
+ return &(pstate->parallelSlot[i]);
+ }
+
+ return NULL;
+}
+
+/*
+ * A thread-local version of getLocalPQExpBuffer().
+ *
+ * Non-reentrant but reduces memory leakage: we'll consume one buffer per
+ * thread, which is much better than one per fmtId/fmtQualifiedId call.
+ */
+#ifdef WIN32
+static PQExpBuffer
+getThreadLocalPQExpBuffer(void)
+{
+ /*
+ * The Tls code goes awry if we use a static var, so we provide for both
+ * static and auto, and omit any use of the static var when using Tls. We
+ * rely on TlsGetValue() to return 0 if the value is not yet set.
+ */
+ static PQExpBuffer s_id_return = NULL;
+ PQExpBuffer id_return;
+
+ if (parallel_init_done)
+ id_return = (PQExpBuffer) TlsGetValue(tls_index);
+ else
+ id_return = s_id_return;
+
+ if (id_return) /* first time through? */
+ {
+ /* same buffer, just wipe contents */
+ resetPQExpBuffer(id_return);
+ }
+ else
+ {
+ /* new buffer */
+ id_return = createPQExpBuffer();
+ if (parallel_init_done)
+ TlsSetValue(tls_index, id_return);
+ else
+ s_id_return = id_return;
+ }
+
+ return id_return;
+}
+#endif /* WIN32 */
+
+/*
+ * pg_dump and pg_restore call this to register the cleanup handler
+ * as soon as they've created the ArchiveHandle.
+ */
+void
+on_exit_close_archive(Archive *AHX)
+{
+ shutdown_info.AHX = AHX;
+ on_exit_nicely(archive_close_connection, &shutdown_info);
+}
+
+/*
+ * on_exit_nicely handler for shutting down database connections and
+ * worker processes cleanly.
+ */
+static void
+archive_close_connection(int code, void *arg)
+{
+ ShutdownInformation *si = (ShutdownInformation *) arg;
+
+ if (si->pstate)
+ {
+ /* In parallel mode, must figure out who we are */
+ ParallelSlot *slot = GetMyPSlot(si->pstate);
+
+ if (!slot)
+ {
+ /*
+ * We're the leader. Forcibly shut down workers, then close our
+ * own database connection, if any.
+ */
+ ShutdownWorkersHard(si->pstate);
+
+ if (si->AHX)
+ DisconnectDatabase(si->AHX);
+ }
+ else
+ {
+ /*
+ * We're a worker. Shut down our own DB connection if any. On
+ * Windows, we also have to close our communication sockets, to
+ * emulate what will happen on Unix when the worker process exits.
+ * (Without this, if this is a premature exit, the leader would
+ * fail to detect it because there would be no EOF condition on
+ * the other end of the pipe.)
+ */
+ if (slot->AH)
+ DisconnectDatabase(&(slot->AH->public));
+
+#ifdef WIN32
+ closesocket(slot->pipeRevRead);
+ closesocket(slot->pipeRevWrite);
+#endif
+ }
+ }
+ else
+ {
+ /* Non-parallel operation: just kill the leader DB connection */
+ if (si->AHX)
+ DisconnectDatabase(si->AHX);
+ }
+}
+
+/*
+ * Forcibly shut down any remaining workers, waiting for them to finish.
+ *
+ * Note that we don't expect to come here during normal exit (the workers
+ * should be long gone, and the ParallelState too). We're only here in a
+ * pg_fatal() situation, so intervening to cancel active commands is
+ * appropriate.
+ */
+static void
+ShutdownWorkersHard(ParallelState *pstate)
+{
+ int i;
+
+ /*
+ * Close our write end of the sockets so that any workers waiting for
+ * commands know they can exit. (Note: some of the pipeWrite fields might
+ * still be zero, if we failed to initialize all the workers. Hence, just
+ * ignore errors here.)
+ */
+ for (i = 0; i < pstate->numWorkers; i++)
+ closesocket(pstate->parallelSlot[i].pipeWrite);
+
+ /*
+ * Force early termination of any commands currently in progress.
+ */
+#ifndef WIN32
+ /* On non-Windows, send SIGTERM to each worker process. */
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ pid_t pid = pstate->parallelSlot[i].pid;
+
+ if (pid != 0)
+ kill(pid, SIGTERM);
+ }
+#else
+
+ /*
+ * On Windows, send query cancels directly to the workers' backends. Use
+ * a critical section to ensure worker threads don't change state.
+ */
+ EnterCriticalSection(&signal_info_lock);
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ ArchiveHandle *AH = pstate->parallelSlot[i].AH;
+ char errbuf[1];
+
+ if (AH != NULL && AH->connCancel != NULL)
+ (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
+ }
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+
+ /* Now wait for them to terminate. */
+ WaitForTerminatingWorkers(pstate);
+}
+
+/*
+ * Wait for all workers to terminate.
+ */
+static void
+WaitForTerminatingWorkers(ParallelState *pstate)
+{
+ while (!HasEveryWorkerTerminated(pstate))
+ {
+ ParallelSlot *slot = NULL;
+ int j;
+
+#ifndef WIN32
+ /* On non-Windows, use wait() to wait for next worker to end */
+ int status;
+ pid_t pid = wait(&status);
+
+ /* Find dead worker's slot, and clear the PID field */
+ for (j = 0; j < pstate->numWorkers; j++)
+ {
+ slot = &(pstate->parallelSlot[j]);
+ if (slot->pid == pid)
+ {
+ slot->pid = 0;
+ break;
+ }
+ }
+#else /* WIN32 */
+ /* On Windows, we must use WaitForMultipleObjects() */
+ HANDLE *lpHandles = pg_malloc(sizeof(HANDLE) * pstate->numWorkers);
+ int nrun = 0;
+ DWORD ret;
+ uintptr_t hThread;
+
+ for (j = 0; j < pstate->numWorkers; j++)
+ {
+ if (WORKER_IS_RUNNING(pstate->parallelSlot[j].workerStatus))
+ {
+ lpHandles[nrun] = (HANDLE) pstate->parallelSlot[j].hThread;
+ nrun++;
+ }
+ }
+ ret = WaitForMultipleObjects(nrun, lpHandles, false, INFINITE);
+ Assert(ret != WAIT_FAILED);
+ hThread = (uintptr_t) lpHandles[ret - WAIT_OBJECT_0];
+ free(lpHandles);
+
+ /* Find dead worker's slot, and clear the hThread field */
+ for (j = 0; j < pstate->numWorkers; j++)
+ {
+ slot = &(pstate->parallelSlot[j]);
+ if (slot->hThread == hThread)
+ {
+ /* For cleanliness, close handles for dead threads */
+ CloseHandle((HANDLE) slot->hThread);
+ slot->hThread = (uintptr_t) INVALID_HANDLE_VALUE;
+ break;
+ }
+ }
+#endif /* WIN32 */
+
+ /* On all platforms, update workerStatus and te[] as well */
+ Assert(j < pstate->numWorkers);
+ slot->workerStatus = WRKR_TERMINATED;
+ pstate->te[j] = NULL;
+ }
+}
+
+
+/*
+ * Code for responding to cancel interrupts (SIGINT, control-C, etc)
+ *
+ * This doesn't quite belong in this module, but it needs access to the
+ * ParallelState data, so there's not really a better place either.
+ *
+ * When we get a cancel interrupt, we could just die, but in pg_restore that
+ * could leave a SQL command (e.g., CREATE INDEX on a large table) running
+ * for a long time. Instead, we try to send a cancel request and then die.
+ * pg_dump probably doesn't really need this, but we might as well use it
+ * there too. Note that sending the cancel directly from the signal handler
+ * is safe because PQcancel() is written to make it so.
+ *
+ * In parallel operation on Unix, each process is responsible for canceling
+ * its own connection (this must be so because nobody else has access to it).
+ * Furthermore, the leader process should attempt to forward its signal to
+ * each child. In simple manual use of pg_dump/pg_restore, forwarding isn't
+ * needed because typing control-C at the console would deliver SIGINT to
+ * every member of the terminal process group --- but in other scenarios it
+ * might be that only the leader gets signaled.
+ *
+ * On Windows, the cancel handler runs in a separate thread, because that's
+ * how SetConsoleCtrlHandler works. We make it stop worker threads, send
+ * cancels on all active connections, and then return FALSE, which will allow
+ * the process to die. For safety's sake, we use a critical section to
+ * protect the PGcancel structures against being changed while the signal
+ * thread runs.
+ */
+
+#ifndef WIN32
+
+/*
+ * Signal handler (Unix only)
+ */
+static void
+sigTermHandler(SIGNAL_ARGS)
+{
+ int i;
+ char errbuf[1];
+
+ /*
+ * Some platforms allow delivery of new signals to interrupt an active
+ * signal handler. That could muck up our attempt to send PQcancel, so
+ * disable the signals that setup_cancel_handler enabled.
+ */
+ pqsignal(SIGINT, SIG_IGN);
+ pqsignal(SIGTERM, SIG_IGN);
+ pqsignal(SIGQUIT, SIG_IGN);
+
+ /*
+ * If we're in the leader, forward signal to all workers. (It seems best
+ * to do this before PQcancel; killing the leader transaction will result
+ * in invalid-snapshot errors from active workers, which maybe we can
+ * quiet by killing workers first.) Ignore any errors.
+ */
+ if (signal_info.pstate != NULL)
+ {
+ for (i = 0; i < signal_info.pstate->numWorkers; i++)
+ {
+ pid_t pid = signal_info.pstate->parallelSlot[i].pid;
+
+ if (pid != 0)
+ kill(pid, SIGTERM);
+ }
+ }
+
+ /*
+ * Send QueryCancel if we have a connection to send to. Ignore errors,
+ * there's not much we can do about them anyway.
+ */
+ if (signal_info.myAH != NULL && signal_info.myAH->connCancel != NULL)
+ (void) PQcancel(signal_info.myAH->connCancel, errbuf, sizeof(errbuf));
+
+ /*
+ * Report we're quitting, using nothing more complicated than write(2).
+ * When in parallel operation, only the leader process should do this.
+ */
+ if (!signal_info.am_worker)
+ {
+ if (progname)
+ {
+ write_stderr(progname);
+ write_stderr(": ");
+ }
+ write_stderr("terminated by user\n");
+ }
+
+ /*
+ * And die, using _exit() not exit() because the latter will invoke atexit
+ * handlers that can fail if we interrupted related code.
+ */
+ _exit(1);
+}
+
+/*
+ * Enable cancel interrupt handler, if not already done.
+ */
+static void
+setup_cancel_handler(void)
+{
+ /*
+ * When forking, signal_info.handler_set will propagate into the new
+ * process, but that's fine because the signal handler state does too.
+ */
+ if (!signal_info.handler_set)
+ {
+ signal_info.handler_set = true;
+
+ pqsignal(SIGINT, sigTermHandler);
+ pqsignal(SIGTERM, sigTermHandler);
+ pqsignal(SIGQUIT, sigTermHandler);
+ }
+}
+
+#else /* WIN32 */
+
+/*
+ * Console interrupt handler --- runs in a newly-started thread.
+ *
+ * After stopping other threads and sending cancel requests on all open
+ * connections, we return FALSE which will allow the default ExitProcess()
+ * action to be taken.
+ */
+static BOOL WINAPI
+consoleHandler(DWORD dwCtrlType)
+{
+ int i;
+ char errbuf[1];
+
+ if (dwCtrlType == CTRL_C_EVENT ||
+ dwCtrlType == CTRL_BREAK_EVENT)
+ {
+ /* Critical section prevents changing data we look at here */
+ EnterCriticalSection(&signal_info_lock);
+
+ /*
+ * If in parallel mode, stop worker threads and send QueryCancel to
+ * their connected backends. The main point of stopping the worker
+ * threads is to keep them from reporting the query cancels as errors,
+ * which would clutter the user's screen. We needn't stop the leader
+ * thread since it won't be doing much anyway. Do this before
+ * canceling the main transaction, else we might get invalid-snapshot
+ * errors reported before we can stop the workers. Ignore errors,
+ * there's not much we can do about them anyway.
+ */
+ if (signal_info.pstate != NULL)
+ {
+ for (i = 0; i < signal_info.pstate->numWorkers; i++)
+ {
+ ParallelSlot *slot = &(signal_info.pstate->parallelSlot[i]);
+ ArchiveHandle *AH = slot->AH;
+ HANDLE hThread = (HANDLE) slot->hThread;
+
+ /*
+ * Using TerminateThread here may leave some resources leaked,
+ * but it doesn't matter since we're about to end the whole
+ * process.
+ */
+ if (hThread != INVALID_HANDLE_VALUE)
+ TerminateThread(hThread, 0);
+
+ if (AH != NULL && AH->connCancel != NULL)
+ (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
+ }
+ }
+
+ /*
+ * Send QueryCancel to leader connection, if enabled. Ignore errors,
+ * there's not much we can do about them anyway.
+ */
+ if (signal_info.myAH != NULL && signal_info.myAH->connCancel != NULL)
+ (void) PQcancel(signal_info.myAH->connCancel,
+ errbuf, sizeof(errbuf));
+
+ LeaveCriticalSection(&signal_info_lock);
+
+ /*
+ * Report we're quitting, using nothing more complicated than
+ * write(2). (We might be able to get away with using pg_log_*()
+ * here, but since we terminated other threads uncleanly above, it
+ * seems better to assume as little as possible.)
+ */
+ if (progname)
+ {
+ write_stderr(progname);
+ write_stderr(": ");
+ }
+ write_stderr("terminated by user\n");
+ }
+
+ /* Always return FALSE to allow signal handling to continue */
+ return FALSE;
+}
+
+/*
+ * Enable cancel interrupt handler, if not already done.
+ */
+static void
+setup_cancel_handler(void)
+{
+ if (!signal_info.handler_set)
+ {
+ signal_info.handler_set = true;
+
+ InitializeCriticalSection(&signal_info_lock);
+
+ SetConsoleCtrlHandler(consoleHandler, TRUE);
+ }
+}
+
+#endif /* WIN32 */
+
+
+/*
+ * set_archive_cancel_info
+ *
+ * Fill AH->connCancel with cancellation info for the specified database
+ * connection; or clear it if conn is NULL.
+ */
+void
+set_archive_cancel_info(ArchiveHandle *AH, PGconn *conn)
+{
+ PGcancel *oldConnCancel;
+
+ /*
+ * Activate the interrupt handler if we didn't yet in this process. On
+ * Windows, this also initializes signal_info_lock; therefore it's
+ * important that this happen at least once before we fork off any
+ * threads.
+ */
+ setup_cancel_handler();
+
+ /*
+ * On Unix, we assume that storing a pointer value is atomic with respect
+ * to any possible signal interrupt. On Windows, use a critical section.
+ */
+
+#ifdef WIN32
+ EnterCriticalSection(&signal_info_lock);
+#endif
+
+ /* Free the old one if we have one */
+ oldConnCancel = AH->connCancel;
+ /* be sure interrupt handler doesn't use pointer while freeing */
+ AH->connCancel = NULL;
+
+ if (oldConnCancel != NULL)
+ PQfreeCancel(oldConnCancel);
+
+ /* Set the new one if specified */
+ if (conn)
+ AH->connCancel = PQgetCancel(conn);
+
+ /*
+ * On Unix, there's only ever one active ArchiveHandle per process, so we
+ * can just set signal_info.myAH unconditionally. On Windows, do that
+ * only in the main thread; worker threads have to make sure their
+ * ArchiveHandle appears in the pstate data, which is dealt with in
+ * RunWorker().
+ */
+#ifndef WIN32
+ signal_info.myAH = AH;
+#else
+ if (mainThreadId == GetCurrentThreadId())
+ signal_info.myAH = AH;
+#endif
+
+#ifdef WIN32
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+}
+
+/*
+ * set_cancel_pstate
+ *
+ * Set signal_info.pstate to point to the specified ParallelState, if any.
+ * We need this mainly to have an interlock against Windows signal thread.
+ */
+static void
+set_cancel_pstate(ParallelState *pstate)
+{
+#ifdef WIN32
+ EnterCriticalSection(&signal_info_lock);
+#endif
+
+ signal_info.pstate = pstate;
+
+#ifdef WIN32
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+}
+
+/*
+ * set_cancel_slot_archive
+ *
+ * Set ParallelSlot's AH field to point to the specified archive, if any.
+ * We need this mainly to have an interlock against Windows signal thread.
+ */
+static void
+set_cancel_slot_archive(ParallelSlot *slot, ArchiveHandle *AH)
+{
+#ifdef WIN32
+ EnterCriticalSection(&signal_info_lock);
+#endif
+
+ slot->AH = AH;
+
+#ifdef WIN32
+ LeaveCriticalSection(&signal_info_lock);
+#endif
+}
+
+
+/*
+ * This function is called by both Unix and Windows variants to set up
+ * and run a worker process. Caller should exit the process (or thread)
+ * upon return.
+ */
+static void
+RunWorker(ArchiveHandle *AH, ParallelSlot *slot)
+{
+ int pipefd[2];
+
+ /* fetch child ends of pipes */
+ pipefd[PIPE_READ] = slot->pipeRevRead;
+ pipefd[PIPE_WRITE] = slot->pipeRevWrite;
+
+ /*
+ * Clone the archive so that we have our own state to work with, and in
+ * particular our own database connection.
+ *
+ * We clone on Unix as well as Windows, even though technically we don't
+ * need to because fork() gives us a copy in our own address space
+ * already. But CloneArchive resets the state information and also clones
+ * the database connection which both seem kinda helpful.
+ */
+ AH = CloneArchive(AH);
+
+ /* Remember cloned archive where signal handler can find it */
+ set_cancel_slot_archive(slot, AH);
+
+ /*
+ * Call the setup worker function that's defined in the ArchiveHandle.
+ */
+ (AH->SetupWorkerPtr) ((Archive *) AH);
+
+ /*
+ * Execute commands until done.
+ */
+ WaitForCommands(AH, pipefd);
+
+ /*
+ * Disconnect from database and clean up.
+ */
+ set_cancel_slot_archive(slot, NULL);
+ DisconnectDatabase(&(AH->public));
+ DeCloneArchive(AH);
+}
+
+/*
+ * Thread base function for Windows
+ */
+#ifdef WIN32
+static unsigned __stdcall
+init_spawned_worker_win32(WorkerInfo *wi)
+{
+ ArchiveHandle *AH = wi->AH;
+ ParallelSlot *slot = wi->slot;
+
+ /* Don't need WorkerInfo anymore */
+ free(wi);
+
+ /* Run the worker ... */
+ RunWorker(AH, slot);
+
+ /* Exit the thread */
+ _endthreadex(0);
+ return 0;
+}
+#endif /* WIN32 */
+
+/*
+ * This function starts a parallel dump or restore by spawning off the worker
+ * processes. For Windows, it creates a number of threads; on Unix the
+ * workers are created with fork().
+ */
+ParallelState *
+ParallelBackupStart(ArchiveHandle *AH)
+{
+ ParallelState *pstate;
+ int i;
+
+ Assert(AH->public.numWorkers > 0);
+
+ pstate = (ParallelState *) pg_malloc(sizeof(ParallelState));
+
+ pstate->numWorkers = AH->public.numWorkers;
+ pstate->te = NULL;
+ pstate->parallelSlot = NULL;
+
+ if (AH->public.numWorkers == 1)
+ return pstate;
+
+ /* Create status arrays, being sure to initialize all fields to 0 */
+ pstate->te = (TocEntry **)
+ pg_malloc0(pstate->numWorkers * sizeof(TocEntry *));
+ pstate->parallelSlot = (ParallelSlot *)
+ pg_malloc0(pstate->numWorkers * sizeof(ParallelSlot));
+
+#ifdef WIN32
+ /* Make fmtId() and fmtQualifiedId() use thread-local storage */
+ getLocalPQExpBuffer = getThreadLocalPQExpBuffer;
+#endif
+
+ /*
+ * Set the pstate in shutdown_info, to tell the exit handler that it must
+ * clean up workers as well as the main database connection. But we don't
+ * set this in signal_info yet, because we don't want child processes to
+ * inherit non-NULL signal_info.pstate.
+ */
+ shutdown_info.pstate = pstate;
+
+ /*
+ * Temporarily disable query cancellation on the leader connection. This
+ * ensures that child processes won't inherit valid AH->connCancel
+ * settings and thus won't try to issue cancels against the leader's
+ * connection. No harm is done if we fail while it's disabled, because
+ * the leader connection is idle at this point anyway.
+ */
+ set_archive_cancel_info(AH, NULL);
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+ /* Create desired number of workers */
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+#ifdef WIN32
+ WorkerInfo *wi;
+ uintptr_t handle;
+#else
+ pid_t pid;
+#endif
+ ParallelSlot *slot = &(pstate->parallelSlot[i]);
+ int pipeMW[2],
+ pipeWM[2];
+
+ /* Create communication pipes for this worker */
+ if (pgpipe(pipeMW) < 0 || pgpipe(pipeWM) < 0)
+ pg_fatal("could not create communication channels: %m");
+
+ /* leader's ends of the pipes */
+ slot->pipeRead = pipeWM[PIPE_READ];
+ slot->pipeWrite = pipeMW[PIPE_WRITE];
+ /* child's ends of the pipes */
+ slot->pipeRevRead = pipeMW[PIPE_READ];
+ slot->pipeRevWrite = pipeWM[PIPE_WRITE];
+
+#ifdef WIN32
+ /* Create transient structure to pass args to worker function */
+ wi = (WorkerInfo *) pg_malloc(sizeof(WorkerInfo));
+
+ wi->AH = AH;
+ wi->slot = slot;
+
+ handle = _beginthreadex(NULL, 0, (void *) &init_spawned_worker_win32,
+ wi, 0, &(slot->threadId));
+ slot->hThread = handle;
+ slot->workerStatus = WRKR_IDLE;
+#else /* !WIN32 */
+ pid = fork();
+ if (pid == 0)
+ {
+ /* we are the worker */
+ int j;
+
+ /* this is needed for GetMyPSlot() */
+ slot->pid = getpid();
+
+ /* instruct signal handler that we're in a worker now */
+ signal_info.am_worker = true;
+
+ /* close read end of Worker -> Leader */
+ closesocket(pipeWM[PIPE_READ]);
+ /* close write end of Leader -> Worker */
+ closesocket(pipeMW[PIPE_WRITE]);
+
+ /*
+ * Close all inherited fds for communication of the leader with
+ * previously-forked workers.
+ */
+ for (j = 0; j < i; j++)
+ {
+ closesocket(pstate->parallelSlot[j].pipeRead);
+ closesocket(pstate->parallelSlot[j].pipeWrite);
+ }
+
+ /* Run the worker ... */
+ RunWorker(AH, slot);
+
+ /* We can just exit(0) when done */
+ exit(0);
+ }
+ else if (pid < 0)
+ {
+ /* fork failed */
+ pg_fatal("could not create worker process: %m");
+ }
+
+ /* In Leader after successful fork */
+ slot->pid = pid;
+ slot->workerStatus = WRKR_IDLE;
+
+ /* close read end of Leader -> Worker */
+ closesocket(pipeMW[PIPE_READ]);
+ /* close write end of Worker -> Leader */
+ closesocket(pipeWM[PIPE_WRITE]);
+#endif /* WIN32 */
+ }
+
+ /*
+ * Having forked off the workers, disable SIGPIPE so that leader isn't
+ * killed if it tries to send a command to a dead worker. We don't want
+ * the workers to inherit this setting, though.
+ */
+#ifndef WIN32
+ pqsignal(SIGPIPE, SIG_IGN);
+#endif
+
+ /*
+ * Re-establish query cancellation on the leader connection.
+ */
+ set_archive_cancel_info(AH, AH->connection);
+
+ /*
+ * Tell the cancel signal handler to forward signals to worker processes,
+ * too. (As with query cancel, we did not need this earlier because the
+ * workers have not yet been given anything to do; if we die before this
+ * point, any already-started workers will see EOF and quit promptly.)
+ */
+ set_cancel_pstate(pstate);
+
+ return pstate;
+}
+
+/*
+ * Close down a parallel dump or restore.
+ */
+void
+ParallelBackupEnd(ArchiveHandle *AH, ParallelState *pstate)
+{
+ int i;
+
+ /* No work if non-parallel */
+ if (pstate->numWorkers == 1)
+ return;
+
+ /* There should not be any unfinished jobs */
+ Assert(IsEveryWorkerIdle(pstate));
+
+ /* Close the sockets so that the workers know they can exit */
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ closesocket(pstate->parallelSlot[i].pipeRead);
+ closesocket(pstate->parallelSlot[i].pipeWrite);
+ }
+
+ /* Wait for them to exit */
+ WaitForTerminatingWorkers(pstate);
+
+ /*
+ * Unlink pstate from shutdown_info, so the exit handler will not try to
+ * use it; and likewise unlink from signal_info.
+ */
+ shutdown_info.pstate = NULL;
+ set_cancel_pstate(NULL);
+
+ /* Release state (mere neatnik-ism, since we're about to terminate) */
+ free(pstate->te);
+ free(pstate->parallelSlot);
+ free(pstate);
+}
+
+/*
+ * These next four functions handle construction and parsing of the command
+ * strings and response strings for parallel workers.
+ *
+ * Currently, these can be the same regardless of which archive format we are
+ * processing. In future, we might want to let format modules override these
+ * functions to add format-specific data to a command or response.
+ */
+
+/*
+ * buildWorkerCommand: format a command string to send to a worker.
+ *
+ * The string is built in the caller-supplied buffer of size buflen.
+ */
+static void
+buildWorkerCommand(ArchiveHandle *AH, TocEntry *te, T_Action act,
+ char *buf, int buflen)
+{
+ if (act == ACT_DUMP)
+ snprintf(buf, buflen, "DUMP %d", te->dumpId);
+ else if (act == ACT_RESTORE)
+ snprintf(buf, buflen, "RESTORE %d", te->dumpId);
+ else
+ Assert(false);
+}
+
+/*
+ * parseWorkerCommand: interpret a command string in a worker.
+ */
+static void
+parseWorkerCommand(ArchiveHandle *AH, TocEntry **te, T_Action *act,
+ const char *msg)
+{
+ DumpId dumpId;
+ int nBytes;
+
+ if (messageStartsWith(msg, "DUMP "))
+ {
+ *act = ACT_DUMP;
+ sscanf(msg, "DUMP %d%n", &dumpId, &nBytes);
+ Assert(nBytes == strlen(msg));
+ *te = getTocEntryByDumpId(AH, dumpId);
+ Assert(*te != NULL);
+ }
+ else if (messageStartsWith(msg, "RESTORE "))
+ {
+ *act = ACT_RESTORE;
+ sscanf(msg, "RESTORE %d%n", &dumpId, &nBytes);
+ Assert(nBytes == strlen(msg));
+ *te = getTocEntryByDumpId(AH, dumpId);
+ Assert(*te != NULL);
+ }
+ else
+ pg_fatal("unrecognized command received from leader: \"%s\"",
+ msg);
+}
+
+/*
+ * buildWorkerResponse: format a response string to send to the leader.
+ *
+ * The string is built in the caller-supplied buffer of size buflen.
+ */
+static void
+buildWorkerResponse(ArchiveHandle *AH, TocEntry *te, T_Action act, int status,
+ char *buf, int buflen)
+{
+ snprintf(buf, buflen, "OK %d %d %d",
+ te->dumpId,
+ status,
+ status == WORKER_IGNORED_ERRORS ? AH->public.n_errors : 0);
+}
+
+/*
+ * parseWorkerResponse: parse the status message returned by a worker.
+ *
+ * Returns the integer status code, and may update fields of AH and/or te.
+ */
+static int
+parseWorkerResponse(ArchiveHandle *AH, TocEntry *te,
+ const char *msg)
+{
+ DumpId dumpId;
+ int nBytes,
+ n_errors;
+ int status = 0;
+
+ if (messageStartsWith(msg, "OK "))
+ {
+ sscanf(msg, "OK %d %d %d%n", &dumpId, &status, &n_errors, &nBytes);
+
+ Assert(dumpId == te->dumpId);
+ Assert(nBytes == strlen(msg));
+
+ AH->public.n_errors += n_errors;
+ }
+ else
+ pg_fatal("invalid message received from worker: \"%s\"",
+ msg);
+
+ return status;
+}
+
+/*
+ * Dispatch a job to some free worker.
+ *
+ * te is the TocEntry to be processed, act is the action to be taken on it.
+ * callback is the function to call on completion of the job.
+ *
+ * If no worker is currently available, this will block, and previously
+ * registered callback functions may be called.
+ */
+void
+DispatchJobForTocEntry(ArchiveHandle *AH,
+ ParallelState *pstate,
+ TocEntry *te,
+ T_Action act,
+ ParallelCompletionPtr callback,
+ void *callback_data)
+{
+ int worker;
+ char buf[256];
+
+ /* Get a worker, waiting if none are idle */
+ while ((worker = GetIdleWorker(pstate)) == NO_SLOT)
+ WaitForWorkers(AH, pstate, WFW_ONE_IDLE);
+
+ /* Construct and send command string */
+ buildWorkerCommand(AH, te, act, buf, sizeof(buf));
+
+ sendMessageToWorker(pstate, worker, buf);
+
+ /* Remember worker is busy, and which TocEntry it's working on */
+ pstate->parallelSlot[worker].workerStatus = WRKR_WORKING;
+ pstate->parallelSlot[worker].callback = callback;
+ pstate->parallelSlot[worker].callback_data = callback_data;
+ pstate->te[worker] = te;
+}
+
+/*
+ * Find an idle worker and return its slot number.
+ * Return NO_SLOT if none are idle.
+ */
+static int
+GetIdleWorker(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (pstate->parallelSlot[i].workerStatus == WRKR_IDLE)
+ return i;
+ }
+ return NO_SLOT;
+}
+
+/*
+ * Return true iff no worker is running.
+ */
+static bool
+HasEveryWorkerTerminated(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (WORKER_IS_RUNNING(pstate->parallelSlot[i].workerStatus))
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Return true iff every worker is in the WRKR_IDLE state.
+ */
+bool
+IsEveryWorkerIdle(ParallelState *pstate)
+{
+ int i;
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (pstate->parallelSlot[i].workerStatus != WRKR_IDLE)
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Acquire lock on a table to be dumped by a worker process.
+ *
+ * The leader process is already holding an ACCESS SHARE lock. Ordinarily
+ * it's no problem for a worker to get one too, but if anything else besides
+ * pg_dump is running, there's a possible deadlock:
+ *
+ * 1) Leader dumps the schema and locks all tables in ACCESS SHARE mode.
+ * 2) Another process requests an ACCESS EXCLUSIVE lock (which is not granted
+ * because the leader holds a conflicting ACCESS SHARE lock).
+ * 3) A worker process also requests an ACCESS SHARE lock to read the table.
+ * The worker is enqueued behind the ACCESS EXCLUSIVE lock request.
+ * 4) Now we have a deadlock, since the leader is effectively waiting for
+ * the worker. The server cannot detect that, however.
+ *
+ * To prevent an infinite wait, prior to touching a table in a worker, request
+ * a lock in ACCESS SHARE mode but with NOWAIT. If we don't get the lock,
+ * then we know that somebody else has requested an ACCESS EXCLUSIVE lock and
+ * so we have a deadlock. We must fail the backup in that case.
+ */
+static void
+lockTableForWorker(ArchiveHandle *AH, TocEntry *te)
+{
+ const char *qualId;
+ PQExpBuffer query;
+ PGresult *res;
+
+ /* Nothing to do for BLOBS */
+ if (strcmp(te->desc, "BLOBS") == 0)
+ return;
+
+ query = createPQExpBuffer();
+
+ qualId = fmtQualifiedId(te->namespace, te->tag);
+
+ appendPQExpBuffer(query, "LOCK TABLE %s IN ACCESS SHARE MODE NOWAIT",
+ qualId);
+
+ res = PQexec(AH->connection, query->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_fatal("could not obtain lock on relation \"%s\"\n"
+ "This usually means that someone requested an ACCESS EXCLUSIVE lock "
+ "on the table after the pg_dump parent process had gotten the "
+ "initial ACCESS SHARE lock on the table.", qualId);
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * WaitForCommands: main routine for a worker process.
+ *
+ * Read and execute commands from the leader until we see EOF on the pipe.
+ */
+static void
+WaitForCommands(ArchiveHandle *AH, int pipefd[2])
+{
+ char *command;
+ TocEntry *te;
+ T_Action act;
+ int status = 0;
+ char buf[256];
+
+ for (;;)
+ {
+ if (!(command = getMessageFromLeader(pipefd)))
+ {
+ /* EOF, so done */
+ return;
+ }
+
+ /* Decode the command */
+ parseWorkerCommand(AH, &te, &act, command);
+
+ if (act == ACT_DUMP)
+ {
+ /* Acquire lock on this table within the worker's session */
+ lockTableForWorker(AH, te);
+
+ /* Perform the dump command */
+ status = (AH->WorkerJobDumpPtr) (AH, te);
+ }
+ else if (act == ACT_RESTORE)
+ {
+ /* Perform the restore command */
+ status = (AH->WorkerJobRestorePtr) (AH, te);
+ }
+ else
+ Assert(false);
+
+ /* Return status to leader */
+ buildWorkerResponse(AH, te, act, status, buf, sizeof(buf));
+
+ sendMessageToLeader(pipefd, buf);
+
+ /* command was pg_malloc'd and we are responsible for free()ing it. */
+ free(command);
+ }
+}
+
+/*
+ * Check for status messages from workers.
+ *
+ * If do_wait is true, wait to get a status message; otherwise, just return
+ * immediately if there is none available.
+ *
+ * When we get a status message, we pass the status code to the callback
+ * function that was specified to DispatchJobForTocEntry, then reset the
+ * worker status to IDLE.
+ *
+ * Returns true if we collected a status message, else false.
+ *
+ * XXX is it worth checking for more than one status message per call?
+ * It seems somewhat unlikely that multiple workers would finish at exactly
+ * the same time.
+ */
+static bool
+ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait)
+{
+ int worker;
+ char *msg;
+
+ /* Try to collect a status message */
+ msg = getMessageFromWorker(pstate, do_wait, &worker);
+
+ if (!msg)
+ {
+ /* If do_wait is true, we must have detected EOF on some socket */
+ if (do_wait)
+ pg_fatal("a worker process died unexpectedly");
+ return false;
+ }
+
+ /* Process it and update our idea of the worker's status */
+ if (messageStartsWith(msg, "OK "))
+ {
+ ParallelSlot *slot = &pstate->parallelSlot[worker];
+ TocEntry *te = pstate->te[worker];
+ int status;
+
+ status = parseWorkerResponse(AH, te, msg);
+ slot->callback(AH, te, status, slot->callback_data);
+ slot->workerStatus = WRKR_IDLE;
+ pstate->te[worker] = NULL;
+ }
+ else
+ pg_fatal("invalid message received from worker: \"%s\"",
+ msg);
+
+ /* Free the string returned from getMessageFromWorker */
+ free(msg);
+
+ return true;
+}
+
+/*
+ * Check for status results from workers, waiting if necessary.
+ *
+ * Available wait modes are:
+ * WFW_NO_WAIT: reap any available status, but don't block
+ * WFW_GOT_STATUS: wait for at least one more worker to finish
+ * WFW_ONE_IDLE: wait for at least one worker to be idle
+ * WFW_ALL_IDLE: wait for all workers to be idle
+ *
+ * Any received results are passed to the callback specified to
+ * DispatchJobForTocEntry.
+ *
+ * This function is executed in the leader process.
+ */
+void
+WaitForWorkers(ArchiveHandle *AH, ParallelState *pstate, WFW_WaitOption mode)
+{
+ bool do_wait = false;
+
+ /*
+ * In GOT_STATUS mode, always block waiting for a message, since we can't
+ * return till we get something. In other modes, we don't block the first
+ * time through the loop.
+ */
+ if (mode == WFW_GOT_STATUS)
+ {
+ /* Assert that caller knows what it's doing */
+ Assert(!IsEveryWorkerIdle(pstate));
+ do_wait = true;
+ }
+
+ for (;;)
+ {
+ /*
+ * Check for status messages, even if we don't need to block. We do
+ * not try very hard to reap all available messages, though, since
+ * there's unlikely to be more than one.
+ */
+ if (ListenToWorkers(AH, pstate, do_wait))
+ {
+ /*
+ * If we got a message, we are done by definition for GOT_STATUS
+ * mode, and we can also be certain that there's at least one idle
+ * worker. So we're done in all but ALL_IDLE mode.
+ */
+ if (mode != WFW_ALL_IDLE)
+ return;
+ }
+
+ /* Check whether we must wait for new status messages */
+ switch (mode)
+ {
+ case WFW_NO_WAIT:
+ return; /* never wait */
+ case WFW_GOT_STATUS:
+ Assert(false); /* can't get here, because we waited */
+ break;
+ case WFW_ONE_IDLE:
+ if (GetIdleWorker(pstate) != NO_SLOT)
+ return;
+ break;
+ case WFW_ALL_IDLE:
+ if (IsEveryWorkerIdle(pstate))
+ return;
+ break;
+ }
+
+ /* Loop back, and this time wait for something to happen */
+ do_wait = true;
+ }
+}
+
+/*
+ * Read one command message from the leader, blocking if necessary
+ * until one is available, and return it as a malloc'd string.
+ * On EOF, return NULL.
+ *
+ * This function is executed in worker processes.
+ */
+static char *
+getMessageFromLeader(int pipefd[2])
+{
+ return readMessageFromPipe(pipefd[PIPE_READ]);
+}
+
+/*
+ * Send a status message to the leader.
+ *
+ * This function is executed in worker processes.
+ */
+static void
+sendMessageToLeader(int pipefd[2], const char *str)
+{
+ int len = strlen(str) + 1;
+
+ if (pipewrite(pipefd[PIPE_WRITE], str, len) != len)
+ pg_fatal("could not write to the communication channel: %m");
+}
+
+/*
+ * Wait until some descriptor in "workerset" becomes readable.
+ * Returns -1 on error, else the number of readable descriptors.
+ */
+static int
+select_loop(int maxFd, fd_set *workerset)
+{
+ int i;
+ fd_set saveSet = *workerset;
+
+ for (;;)
+ {
+ *workerset = saveSet;
+ i = select(maxFd + 1, workerset, NULL, NULL, NULL);
+
+#ifndef WIN32
+ if (i < 0 && errno == EINTR)
+ continue;
+#else
+ if (i == SOCKET_ERROR && WSAGetLastError() == WSAEINTR)
+ continue;
+#endif
+ break;
+ }
+
+ return i;
+}
+
+
+/*
+ * Check for messages from worker processes.
+ *
+ * If a message is available, return it as a malloc'd string, and put the
+ * index of the sending worker in *worker.
+ *
+ * If nothing is available, wait if "do_wait" is true, else return NULL.
+ *
+ * If we detect EOF on any socket, we'll return NULL. It's not great that
+ * that's hard to distinguish from the no-data-available case, but for now
+ * our one caller is okay with that.
+ *
+ * This function is executed in the leader process.
+ */
+static char *
+getMessageFromWorker(ParallelState *pstate, bool do_wait, int *worker)
+{
+ int i;
+ fd_set workerset;
+ int maxFd = -1;
+ struct timeval nowait = {0, 0};
+
+ /* construct bitmap of socket descriptors for select() */
+ FD_ZERO(&workerset);
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ if (!WORKER_IS_RUNNING(pstate->parallelSlot[i].workerStatus))
+ continue;
+ FD_SET(pstate->parallelSlot[i].pipeRead, &workerset);
+ if (pstate->parallelSlot[i].pipeRead > maxFd)
+ maxFd = pstate->parallelSlot[i].pipeRead;
+ }
+
+ if (do_wait)
+ {
+ i = select_loop(maxFd, &workerset);
+ Assert(i != 0);
+ }
+ else
+ {
+ if ((i = select(maxFd + 1, &workerset, NULL, NULL, &nowait)) == 0)
+ return NULL;
+ }
+
+ if (i < 0)
+ pg_fatal("%s() failed: %m", "select");
+
+ for (i = 0; i < pstate->numWorkers; i++)
+ {
+ char *msg;
+
+ if (!WORKER_IS_RUNNING(pstate->parallelSlot[i].workerStatus))
+ continue;
+ if (!FD_ISSET(pstate->parallelSlot[i].pipeRead, &workerset))
+ continue;
+
+ /*
+ * Read the message if any. If the socket is ready because of EOF,
+ * we'll return NULL instead (and the socket will stay ready, so the
+ * condition will persist).
+ *
+ * Note: because this is a blocking read, we'll wait if only part of
+ * the message is available. Waiting a long time would be bad, but
+ * since worker status messages are short and are always sent in one
+ * operation, it shouldn't be a problem in practice.
+ */
+ msg = readMessageFromPipe(pstate->parallelSlot[i].pipeRead);
+ *worker = i;
+ return msg;
+ }
+ Assert(false);
+ return NULL;
+}
+
+/*
+ * Send a command message to the specified worker process.
+ *
+ * This function is executed in the leader process.
+ */
+static void
+sendMessageToWorker(ParallelState *pstate, int worker, const char *str)
+{
+ int len = strlen(str) + 1;
+
+ if (pipewrite(pstate->parallelSlot[worker].pipeWrite, str, len) != len)
+ {
+ pg_fatal("could not write to the communication channel: %m");
+ }
+}
+
+/*
+ * Read one message from the specified pipe (fd), blocking if necessary
+ * until one is available, and return it as a malloc'd string.
+ * On EOF, return NULL.
+ *
+ * A "message" on the channel is just a null-terminated string.
+ */
+static char *
+readMessageFromPipe(int fd)
+{
+ char *msg;
+ int msgsize,
+ bufsize;
+ int ret;
+
+ /*
+ * In theory, if we let piperead() read multiple bytes, it might give us
+ * back fragments of multiple messages. (That can't actually occur, since
+ * neither leader nor workers send more than one message without waiting
+ * for a reply, but we don't wish to assume that here.) For simplicity,
+ * read a byte at a time until we get the terminating '\0'. This method
+ * is a bit inefficient, but since this is only used for relatively short
+ * command and status strings, it shouldn't matter.
+ */
+ bufsize = 64; /* could be any number */
+ msg = (char *) pg_malloc(bufsize);
+ msgsize = 0;
+ for (;;)
+ {
+ Assert(msgsize < bufsize);
+ ret = piperead(fd, msg + msgsize, 1);
+ if (ret <= 0)
+ break; /* error or connection closure */
+
+ Assert(ret == 1);
+
+ if (msg[msgsize] == '\0')
+ return msg; /* collected whole message */
+
+ msgsize++;
+ if (msgsize == bufsize) /* enlarge buffer if needed */
+ {
+ bufsize += 16; /* could be any number */
+ msg = (char *) pg_realloc(msg, bufsize);
+ }
+ }
+
+ /* Other end has closed the connection */
+ pg_free(msg);
+ return NULL;
+}
+
+#ifdef WIN32
+
+/*
+ * This is a replacement version of pipe(2) for Windows which allows the pipe
+ * handles to be used in select().
+ *
+ * Reads and writes on the pipe must go through piperead()/pipewrite().
+ *
+ * For consistency with Unix we declare the returned handles as "int".
+ * This is okay even on WIN64 because system handles are not more than
+ * 32 bits wide, but we do have to do some casting.
+ */
+static int
+pgpipe(int handles[2])
+{
+ pgsocket s,
+ tmp_sock;
+ struct sockaddr_in serv_addr;
+ int len = sizeof(serv_addr);
+
+ /* We have to use the Unix socket invalid file descriptor value here. */
+ handles[0] = handles[1] = -1;
+
+ /*
+ * setup listen socket
+ */
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
+ {
+ pg_log_error("pgpipe: could not create socket: error code %d",
+ WSAGetLastError());
+ return -1;
+ }
+
+ memset(&serv_addr, 0, sizeof(serv_addr));
+ serv_addr.sin_family = AF_INET;
+ serv_addr.sin_port = pg_hton16(0);
+ serv_addr.sin_addr.s_addr = pg_hton32(INADDR_LOOPBACK);
+ if (bind(s, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: could not bind: error code %d",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+ if (listen(s, 1) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: could not listen: error code %d",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+ if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: %s() failed: error code %d", "getsockname",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+
+ /*
+ * setup pipe handles
+ */
+ if ((tmp_sock = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
+ {
+ pg_log_error("pgpipe: could not create second socket: error code %d",
+ WSAGetLastError());
+ closesocket(s);
+ return -1;
+ }
+ handles[1] = (int) tmp_sock;
+
+ if (connect(handles[1], (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
+ {
+ pg_log_error("pgpipe: could not connect socket: error code %d",
+ WSAGetLastError());
+ closesocket(handles[1]);
+ handles[1] = -1;
+ closesocket(s);
+ return -1;
+ }
+ if ((tmp_sock = accept(s, (SOCKADDR *) &serv_addr, &len)) == PGINVALID_SOCKET)
+ {
+ pg_log_error("pgpipe: could not accept connection: error code %d",
+ WSAGetLastError());
+ closesocket(handles[1]);
+ handles[1] = -1;
+ closesocket(s);
+ return -1;
+ }
+ handles[0] = (int) tmp_sock;
+
+ closesocket(s);
+ return 0;
+}
+
+#endif /* WIN32 */
diff --git a/src/bin/pg_dump/parallel.h b/src/bin/pg_dump/parallel.h
new file mode 100644
index 0000000..17f03c1
--- /dev/null
+++ b/src/bin/pg_dump/parallel.h
@@ -0,0 +1,85 @@
+/*-------------------------------------------------------------------------
+ *
+ * parallel.h
+ *
+ * Parallel support for pg_dump and pg_restore
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/parallel.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_DUMP_PARALLEL_H
+#define PG_DUMP_PARALLEL_H
+
+#include <limits.h>
+
+#include "pg_backup_archiver.h"
+
+/* Function to call in leader process on completion of a worker task */
+typedef void (*ParallelCompletionPtr) (ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data);
+
+/* Wait options for WaitForWorkers */
+typedef enum
+{
+ WFW_NO_WAIT,
+ WFW_GOT_STATUS,
+ WFW_ONE_IDLE,
+ WFW_ALL_IDLE
+} WFW_WaitOption;
+
+/*
+ * Maximum number of parallel jobs allowed.
+ *
+ * On Windows we can only have at most MAXIMUM_WAIT_OBJECTS (= 64 usually)
+ * parallel jobs because that's the maximum limit for the
+ * WaitForMultipleObjects() call.
+ */
+#ifdef WIN32
+#define PG_MAX_JOBS MAXIMUM_WAIT_OBJECTS
+#else
+#define PG_MAX_JOBS INT_MAX
+#endif
+
+/* ParallelSlot is an opaque struct known only within parallel.c */
+typedef struct ParallelSlot ParallelSlot;
+
+/* Overall state for parallel.c */
+typedef struct ParallelState
+{
+ int numWorkers; /* allowed number of workers */
+ /* these arrays have numWorkers entries, one per worker: */
+ TocEntry **te; /* item being worked on, or NULL */
+ ParallelSlot *parallelSlot; /* private info about each worker */
+} ParallelState;
+
+#ifdef WIN32
+extern bool parallel_init_done;
+extern DWORD mainThreadId;
+#endif
+
+extern void init_parallel_dump_utils(void);
+
+extern bool IsEveryWorkerIdle(ParallelState *pstate);
+extern void WaitForWorkers(ArchiveHandle *AH, ParallelState *pstate,
+ WFW_WaitOption mode);
+
+extern ParallelState *ParallelBackupStart(ArchiveHandle *AH);
+extern void DispatchJobForTocEntry(ArchiveHandle *AH,
+ ParallelState *pstate,
+ TocEntry *te,
+ T_Action act,
+ ParallelCompletionPtr callback,
+ void *callback_data);
+extern void ParallelBackupEnd(ArchiveHandle *AH, ParallelState *pstate);
+
+extern void set_archive_cancel_info(ArchiveHandle *AH, PGconn *conn);
+
+#endif /* PG_DUMP_PARALLEL_H */
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
new file mode 100644
index 0000000..aba780e
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup.h
@@ -0,0 +1,331 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup.h
+ *
+ * Public interface to the pg_dump archiver routines.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_BACKUP_H
+#define PG_BACKUP_H
+
+#include "common/compression.h"
+#include "fe_utils/simple_list.h"
+#include "libpq-fe.h"
+
+
+typedef enum trivalue
+{
+ TRI_DEFAULT,
+ TRI_NO,
+ TRI_YES
+} trivalue;
+
+typedef enum _archiveFormat
+{
+ archUnknown = 0,
+ archCustom = 1,
+ archTar = 3,
+ archNull = 4,
+ archDirectory = 5
+} ArchiveFormat;
+
+typedef enum _archiveMode
+{
+ archModeAppend,
+ archModeWrite,
+ archModeRead
+} ArchiveMode;
+
+typedef enum _teSection
+{
+ SECTION_NONE = 1, /* comments, ACLs, etc; can be anywhere */
+ SECTION_PRE_DATA, /* stuff to be processed before data */
+ SECTION_DATA, /* table data, large objects, LO comments */
+ SECTION_POST_DATA /* stuff to be processed after data */
+} teSection;
+
+/* We need one enum entry per prepared query in pg_dump */
+enum _dumpPreparedQueries
+{
+ PREPQUERY_DUMPAGG,
+ PREPQUERY_DUMPBASETYPE,
+ PREPQUERY_DUMPCOMPOSITETYPE,
+ PREPQUERY_DUMPDOMAIN,
+ PREPQUERY_DUMPENUMTYPE,
+ PREPQUERY_DUMPFUNC,
+ PREPQUERY_DUMPOPR,
+ PREPQUERY_DUMPRANGETYPE,
+ PREPQUERY_DUMPTABLEATTACH,
+ PREPQUERY_GETCOLUMNACLS,
+ PREPQUERY_GETDOMAINCONSTRAINTS,
+ NUM_PREP_QUERIES /* must be last */
+};
+
+/* Parameters needed by ConnectDatabase; same for dump and restore */
+typedef struct _connParams
+{
+ /* These fields record the actual command line parameters */
+ char *dbname; /* this may be a connstring! */
+ char *pgport;
+ char *pghost;
+ char *username;
+ trivalue promptPassword;
+ /* If not NULL, this overrides the dbname obtained from command line */
+ /* (but *only* the DB name, not anything else in the connstring) */
+ char *override_dbname;
+} ConnParams;
+
+typedef struct _restoreOptions
+{
+ int createDB; /* Issue commands to create the database */
+ int noOwner; /* Don't try to match original object owner */
+ int noTableAm; /* Don't issue table-AM-related commands */
+ int noTablespace; /* Don't issue tablespace-related commands */
+ int disable_triggers; /* disable triggers during data-only
+ * restore */
+ int use_setsessauth; /* Use SET SESSION AUTHORIZATION commands
+ * instead of OWNER TO */
+ char *superuser; /* Username to use as superuser */
+ char *use_role; /* Issue SET ROLE to this */
+ int dropSchema;
+ int disable_dollar_quoting;
+ int dump_inserts; /* 0 = COPY, otherwise rows per INSERT */
+ int column_inserts;
+ int if_exists;
+ int no_comments; /* Skip comments */
+ int no_publications; /* Skip publication entries */
+ int no_security_labels; /* Skip security label entries */
+ int no_subscriptions; /* Skip subscription entries */
+ int strict_names;
+
+ const char *filename;
+ int dataOnly;
+ int schemaOnly;
+ int dumpSections;
+ int verbose;
+ int aclsSkip;
+ const char *lockWaitTimeout;
+ int include_everything;
+
+ int tocSummary;
+ char *tocFile;
+ int format;
+ char *formatName;
+
+ int selTypes;
+ int selIndex;
+ int selFunction;
+ int selTrigger;
+ int selTable;
+ SimpleStringList indexNames;
+ SimpleStringList functionNames;
+ SimpleStringList schemaNames;
+ SimpleStringList schemaExcludeNames;
+ SimpleStringList triggerNames;
+ SimpleStringList tableNames;
+
+ int useDB;
+ ConnParams cparams; /* parameters to use if useDB */
+
+ int noDataForFailedTables;
+ int exit_on_error;
+ pg_compress_specification compression_spec; /* Specification for
+ * compression */
+ int suppressDumpWarnings; /* Suppress output of WARNING entries
+ * to stderr */
+ bool single_txn;
+
+ bool *idWanted; /* array showing which dump IDs to emit */
+ int enable_row_security;
+ int sequence_data; /* dump sequence data even in schema-only mode */
+ int binary_upgrade;
+} RestoreOptions;
+
+typedef struct _dumpOptions
+{
+ ConnParams cparams;
+
+ int binary_upgrade;
+
+ /* various user-settable parameters */
+ bool schemaOnly;
+ bool dataOnly;
+ int dumpSections; /* bitmask of chosen sections */
+ bool aclsSkip;
+ const char *lockWaitTimeout;
+ int dump_inserts; /* 0 = COPY, otherwise rows per INSERT */
+
+ /* flags for various command-line long options */
+ int disable_dollar_quoting;
+ int column_inserts;
+ int if_exists;
+ int no_comments;
+ int no_security_labels;
+ int no_publications;
+ int no_subscriptions;
+ int no_toast_compression;
+ int no_unlogged_table_data;
+ int serializable_deferrable;
+ int disable_triggers;
+ int outputNoTableAm;
+ int outputNoTablespaces;
+ int use_setsessauth;
+ int enable_row_security;
+ int load_via_partition_root;
+
+ /* default, if no "inclusion" switches appear, is to dump everything */
+ bool include_everything;
+
+ int outputClean;
+ int outputCreateDB;
+ bool outputLOs;
+ bool dontOutputLOs;
+ int outputNoOwner;
+ char *outputSuperuser;
+
+ int sequence_data; /* dump sequence data even in schema-only mode */
+ int do_nothing;
+} DumpOptions;
+
+/*
+ * We may want to have some more user-readable data, but in the mean
+ * time this gives us some abstraction and type checking.
+ */
+typedef struct Archive
+{
+ DumpOptions *dopt; /* options, if dumping */
+ RestoreOptions *ropt; /* options, if restoring */
+
+ int verbose;
+ char *remoteVersionStr; /* server's version string */
+ int remoteVersion; /* same in numeric form */
+ bool isStandby; /* is server a standby node */
+
+ int minRemoteVersion; /* allowable range */
+ int maxRemoteVersion;
+
+ int numWorkers; /* number of parallel processes */
+ char *sync_snapshot_id; /* sync snapshot id for parallel operation */
+
+ /* info needed for string escaping */
+ int encoding; /* libpq code for client_encoding */
+ bool std_strings; /* standard_conforming_strings */
+
+ /* other important stuff */
+ char *searchpath; /* search_path to set during restore */
+ char *use_role; /* Issue SET ROLE to this */
+
+ /* error handling */
+ bool exit_on_error; /* whether to exit on SQL errors... */
+ int n_errors; /* number of errors (if no die) */
+
+ /* prepared-query status */
+ bool *is_prepared; /* indexed by enum _dumpPreparedQueries */
+
+ /* The rest is private */
+} Archive;
+
+
+/*
+ * pg_dump uses two different mechanisms for identifying database objects:
+ *
+ * CatalogId represents an object by the tableoid and oid of its defining
+ * entry in the system catalogs. We need this to interpret pg_depend entries,
+ * for instance.
+ *
+ * DumpId is a simple sequential integer counter assigned as dumpable objects
+ * are identified during a pg_dump run. We use DumpId internally in preference
+ * to CatalogId for two reasons: it's more compact, and we can assign DumpIds
+ * to "objects" that don't have a separate CatalogId. For example, it is
+ * convenient to consider a table, its data, and its ACL as three separate
+ * dumpable "objects" with distinct DumpIds --- this lets us reason about the
+ * order in which to dump these things.
+ */
+
+typedef struct
+{
+ /* Note: this struct must not contain any unused bytes */
+ Oid tableoid;
+ Oid oid;
+} CatalogId;
+
+typedef int DumpId;
+
+#define InvalidDumpId 0
+
+/*
+ * Function pointer prototypes for assorted callback methods.
+ */
+
+typedef int (*DataDumperPtr) (Archive *AH, const void *userArg);
+
+typedef void (*SetupWorkerPtrType) (Archive *AH);
+
+/*
+ * Main archiver interface.
+ */
+
+extern void ConnectDatabase(Archive *AHX,
+ const ConnParams *cparams,
+ bool isReconnect);
+extern void DisconnectDatabase(Archive *AHX);
+extern PGconn *GetConnection(Archive *AHX);
+
+/* Called to write *data* to the archive */
+extern void WriteData(Archive *AHX, const void *data, size_t dLen);
+
+extern int StartLO(Archive *AHX, Oid oid);
+extern int EndLO(Archive *AHX, Oid oid);
+
+extern void CloseArchive(Archive *AHX);
+
+extern void SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ropt);
+
+extern void ProcessArchiveRestoreOptions(Archive *AHX);
+
+extern void RestoreArchive(Archive *AHX);
+
+/* Open an existing archive */
+extern Archive *OpenArchive(const char *FileSpec, const ArchiveFormat fmt);
+
+/* Create a new archive */
+extern Archive *CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
+ const pg_compress_specification compression_spec,
+ bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupDumpWorker);
+
+/* The --list option */
+extern void PrintTOCSummary(Archive *AHX);
+
+extern RestoreOptions *NewRestoreOptions(void);
+
+extern DumpOptions *NewDumpOptions(void);
+extern void InitDumpOptions(DumpOptions *opts);
+extern DumpOptions *dumpOptionsFromRestoreOptions(RestoreOptions *ropt);
+
+/* Rearrange and filter TOC entries */
+extern void SortTocFromFile(Archive *AHX);
+
+/* Convenience functions used only when writing DATA */
+extern void archputs(const char *s, Archive *AH);
+extern int archprintf(Archive *AH, const char *fmt,...) pg_attribute_printf(2, 3);
+
+#define appendStringLiteralAH(buf,str,AH) \
+ appendStringLiteral(buf, str, (AH)->encoding, (AH)->std_strings)
+
+#endif /* PG_BACKUP_H */
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
new file mode 100644
index 0000000..ab351e4
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -0,0 +1,4873 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_archiver.c
+ *
+ * Private implementation of the archiver routines.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_archiver.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "common/string.h"
+#include "compress_io.h"
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+#include "lib/stringinfo.h"
+#include "libpq/libpq-fs.h"
+#include "parallel.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_db.h"
+#include "pg_backup_utils.h"
+
+#define TEXT_DUMP_HEADER "--\n-- PostgreSQL database dump\n--\n\n"
+#define TEXT_DUMPALL_HEADER "--\n-- PostgreSQL database cluster dump\n--\n\n"
+
+/*
+ * State for tracking TocEntrys that are ready to process during a parallel
+ * restore. (This used to be a list, and we still call it that, though now
+ * it's really an array so that we can apply qsort to it.)
+ *
+ * tes[] is sized large enough that we can't overrun it.
+ * The valid entries are indexed first_te .. last_te inclusive.
+ * We periodically sort the array to bring larger-by-dataLength entries to
+ * the front; "sorted" is true if the valid entries are known sorted.
+ */
+typedef struct _parallelReadyList
+{
+ TocEntry **tes; /* Ready-to-dump TocEntrys */
+ int first_te; /* index of first valid entry in tes[] */
+ int last_te; /* index of last valid entry in tes[] */
+ bool sorted; /* are valid entries currently sorted? */
+} ParallelReadyList;
+
+
+static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
+ const pg_compress_specification compression_spec,
+ bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupWorkerPtr);
+static void _getObjectDescription(PQExpBuffer buf, const TocEntry *te);
+static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData);
+static char *sanitize_line(const char *str, bool want_hyphen);
+static void _doSetFixedOutputState(ArchiveHandle *AH);
+static void _doSetSessionAuth(ArchiveHandle *AH, const char *user);
+static void _reconnectToDB(ArchiveHandle *AH, const char *dbname);
+static void _becomeUser(ArchiveHandle *AH, const char *user);
+static void _becomeOwner(ArchiveHandle *AH, TocEntry *te);
+static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName);
+static void _selectTablespace(ArchiveHandle *AH, const char *tablespace);
+static void _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam);
+static void processEncodingEntry(ArchiveHandle *AH, TocEntry *te);
+static void processStdStringsEntry(ArchiveHandle *AH, TocEntry *te);
+static void processSearchPathEntry(ArchiveHandle *AH, TocEntry *te);
+static int _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH);
+static RestorePass _tocEntryRestorePass(TocEntry *te);
+static bool _tocEntryIsACL(TocEntry *te);
+static void _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te);
+static void _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te);
+static bool is_load_via_partition_root(TocEntry *te);
+static void buildTocEntryArrays(ArchiveHandle *AH);
+static void _moveBefore(TocEntry *pos, TocEntry *te);
+static int _discoverArchiveFormat(ArchiveHandle *AH);
+
+static int RestoringToDB(ArchiveHandle *AH);
+static void dump_lo_buf(ArchiveHandle *AH);
+static void dumpTimestamp(ArchiveHandle *AH, const char *msg, time_t tim);
+static void SetOutput(ArchiveHandle *AH, const char *filename,
+ const pg_compress_specification compression_spec);
+static CompressFileHandle *SaveOutput(ArchiveHandle *AH);
+static void RestoreOutput(ArchiveHandle *AH, CompressFileHandle *savedOutput);
+
+static int restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel);
+static void restore_toc_entries_prefork(ArchiveHandle *AH,
+ TocEntry *pending_list);
+static void restore_toc_entries_parallel(ArchiveHandle *AH,
+ ParallelState *pstate,
+ TocEntry *pending_list);
+static void restore_toc_entries_postfork(ArchiveHandle *AH,
+ TocEntry *pending_list);
+static void pending_list_header_init(TocEntry *l);
+static void pending_list_append(TocEntry *l, TocEntry *te);
+static void pending_list_remove(TocEntry *te);
+static void ready_list_init(ParallelReadyList *ready_list, int tocCount);
+static void ready_list_free(ParallelReadyList *ready_list);
+static void ready_list_insert(ParallelReadyList *ready_list, TocEntry *te);
+static void ready_list_remove(ParallelReadyList *ready_list, int i);
+static void ready_list_sort(ParallelReadyList *ready_list);
+static int TocEntrySizeCompare(const void *p1, const void *p2);
+static void move_to_ready_list(TocEntry *pending_list,
+ ParallelReadyList *ready_list,
+ RestorePass pass);
+static TocEntry *pop_next_work_item(ParallelReadyList *ready_list,
+ ParallelState *pstate);
+static void mark_dump_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data);
+static void mark_restore_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data);
+static void fix_dependencies(ArchiveHandle *AH);
+static bool has_lock_conflicts(TocEntry *te1, TocEntry *te2);
+static void repoint_table_dependencies(ArchiveHandle *AH);
+static void identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te);
+static void reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
+ ParallelReadyList *ready_list);
+static void mark_create_done(ArchiveHandle *AH, TocEntry *te);
+static void inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te);
+
+static void StrictNamesCheck(RestoreOptions *ropt);
+
+
+/*
+ * Allocate a new DumpOptions block containing all default values.
+ */
+DumpOptions *
+NewDumpOptions(void)
+{
+ DumpOptions *opts = (DumpOptions *) pg_malloc(sizeof(DumpOptions));
+
+ InitDumpOptions(opts);
+ return opts;
+}
+
+/*
+ * Initialize a DumpOptions struct to all default values
+ */
+void
+InitDumpOptions(DumpOptions *opts)
+{
+ memset(opts, 0, sizeof(DumpOptions));
+ /* set any fields that shouldn't default to zeroes */
+ opts->include_everything = true;
+ opts->cparams.promptPassword = TRI_DEFAULT;
+ opts->dumpSections = DUMP_UNSECTIONED;
+}
+
+/*
+ * Create a freshly allocated DumpOptions with options equivalent to those
+ * found in the given RestoreOptions.
+ */
+DumpOptions *
+dumpOptionsFromRestoreOptions(RestoreOptions *ropt)
+{
+ DumpOptions *dopt = NewDumpOptions();
+
+ /* this is the inverse of what's at the end of pg_dump.c's main() */
+ dopt->cparams.dbname = ropt->cparams.dbname ? pg_strdup(ropt->cparams.dbname) : NULL;
+ dopt->cparams.pgport = ropt->cparams.pgport ? pg_strdup(ropt->cparams.pgport) : NULL;
+ dopt->cparams.pghost = ropt->cparams.pghost ? pg_strdup(ropt->cparams.pghost) : NULL;
+ dopt->cparams.username = ropt->cparams.username ? pg_strdup(ropt->cparams.username) : NULL;
+ dopt->cparams.promptPassword = ropt->cparams.promptPassword;
+ dopt->outputClean = ropt->dropSchema;
+ dopt->dataOnly = ropt->dataOnly;
+ dopt->schemaOnly = ropt->schemaOnly;
+ dopt->if_exists = ropt->if_exists;
+ dopt->column_inserts = ropt->column_inserts;
+ dopt->dumpSections = ropt->dumpSections;
+ dopt->aclsSkip = ropt->aclsSkip;
+ dopt->outputSuperuser = ropt->superuser;
+ dopt->outputCreateDB = ropt->createDB;
+ dopt->outputNoOwner = ropt->noOwner;
+ dopt->outputNoTableAm = ropt->noTableAm;
+ dopt->outputNoTablespaces = ropt->noTablespace;
+ dopt->disable_triggers = ropt->disable_triggers;
+ dopt->use_setsessauth = ropt->use_setsessauth;
+ dopt->disable_dollar_quoting = ropt->disable_dollar_quoting;
+ dopt->dump_inserts = ropt->dump_inserts;
+ dopt->no_comments = ropt->no_comments;
+ dopt->no_publications = ropt->no_publications;
+ dopt->no_security_labels = ropt->no_security_labels;
+ dopt->no_subscriptions = ropt->no_subscriptions;
+ dopt->lockWaitTimeout = ropt->lockWaitTimeout;
+ dopt->include_everything = ropt->include_everything;
+ dopt->enable_row_security = ropt->enable_row_security;
+ dopt->sequence_data = ropt->sequence_data;
+
+ return dopt;
+}
+
+
+/*
+ * Wrapper functions.
+ *
+ * The objective is to make writing new formats and dumpers as simple
+ * as possible, if necessary at the expense of extra function calls etc.
+ *
+ */
+
+/*
+ * The dump worker setup needs lots of knowledge of the internals of pg_dump,
+ * so it's defined in pg_dump.c and passed into OpenArchive. The restore worker
+ * setup doesn't need to know anything much, so it's defined here.
+ */
+static void
+setupRestoreWorker(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ AH->ReopenPtr(AH);
+}
+
+
+/* Create a new archive */
+/* Public */
+Archive *
+CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
+ const pg_compress_specification compression_spec,
+ bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupDumpWorker)
+
+{
+ ArchiveHandle *AH = _allocAH(FileSpec, fmt, compression_spec,
+ dosync, mode, setupDumpWorker);
+
+ return (Archive *) AH;
+}
+
+/* Open an existing archive */
+/* Public */
+Archive *
+OpenArchive(const char *FileSpec, const ArchiveFormat fmt)
+{
+ ArchiveHandle *AH;
+ pg_compress_specification compression_spec = {0};
+
+ compression_spec.algorithm = PG_COMPRESSION_NONE;
+ AH = _allocAH(FileSpec, fmt, compression_spec, true,
+ archModeRead, setupRestoreWorker);
+
+ return (Archive *) AH;
+}
+
+/* Public */
+void
+CloseArchive(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ AH->ClosePtr(AH);
+
+ /* Close the output */
+ errno = 0;
+ if (!EndCompressFileHandle(AH->OF))
+ pg_fatal("could not close output file: %m");
+}
+
+/* Public */
+void
+SetArchiveOptions(Archive *AH, DumpOptions *dopt, RestoreOptions *ropt)
+{
+ /* Caller can omit dump options, in which case we synthesize them */
+ if (dopt == NULL && ropt != NULL)
+ dopt = dumpOptionsFromRestoreOptions(ropt);
+
+ /* Save options for later access */
+ AH->dopt = dopt;
+ AH->ropt = ropt;
+}
+
+/* Public */
+void
+ProcessArchiveRestoreOptions(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ TocEntry *te;
+ teSection curSection;
+
+ /* Decide which TOC entries will be dumped/restored, and mark them */
+ curSection = SECTION_PRE_DATA;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /*
+ * When writing an archive, we also take this opportunity to check
+ * that we have generated the entries in a sane order that respects
+ * the section divisions. When reading, don't complain, since buggy
+ * old versions of pg_dump might generate out-of-order archives.
+ */
+ if (AH->mode != archModeRead)
+ {
+ switch (te->section)
+ {
+ case SECTION_NONE:
+ /* ok to be anywhere */
+ break;
+ case SECTION_PRE_DATA:
+ if (curSection != SECTION_PRE_DATA)
+ pg_log_warning("archive items not in correct section order");
+ break;
+ case SECTION_DATA:
+ if (curSection == SECTION_POST_DATA)
+ pg_log_warning("archive items not in correct section order");
+ break;
+ case SECTION_POST_DATA:
+ /* ok no matter which section we were in */
+ break;
+ default:
+ pg_fatal("unexpected section code %d",
+ (int) te->section);
+ break;
+ }
+ }
+
+ if (te->section != SECTION_NONE)
+ curSection = te->section;
+
+ te->reqs = _tocEntryRequired(te, curSection, AH);
+ }
+
+ /* Enforce strict names checking */
+ if (ropt->strict_names)
+ StrictNamesCheck(ropt);
+}
+
+/* Public */
+void
+RestoreArchive(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ bool parallel_mode;
+ TocEntry *te;
+ CompressFileHandle *sav;
+
+ AH->stage = STAGE_INITIALIZING;
+
+ /*
+ * If we're going to do parallel restore, there are some restrictions.
+ */
+ parallel_mode = (AH->public.numWorkers > 1 && ropt->useDB);
+ if (parallel_mode)
+ {
+ /* We haven't got round to making this work for all archive formats */
+ if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL)
+ pg_fatal("parallel restore is not supported with this archive file format");
+
+ /* Doesn't work if the archive represents dependencies as OIDs */
+ if (AH->version < K_VERS_1_8)
+ pg_fatal("parallel restore is not supported with archives made by pre-8.0 pg_dump");
+
+ /*
+ * It's also not gonna work if we can't reopen the input file, so
+ * let's try that immediately.
+ */
+ AH->ReopenPtr(AH);
+ }
+
+ /*
+ * Make sure we won't need (de)compression we haven't got
+ */
+ if (AH->PrintTocDataPtr != NULL)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->hadDumper && (te->reqs & REQ_DATA) != 0)
+ {
+ char *errmsg = supports_compression(AH->compression_spec);
+
+ if (errmsg)
+ pg_fatal("cannot restore from compressed archive (%s)",
+ errmsg);
+ else
+ break;
+ }
+ }
+ }
+
+ /*
+ * Prepare index arrays, so we can assume we have them throughout restore.
+ * It's possible we already did this, though.
+ */
+ if (AH->tocsByDumpId == NULL)
+ buildTocEntryArrays(AH);
+
+ /*
+ * If we're using a DB connection, then connect it.
+ */
+ if (ropt->useDB)
+ {
+ pg_log_info("connecting to database for restore");
+ if (AH->version < K_VERS_1_3)
+ pg_fatal("direct database connections are not supported in pre-1.3 archives");
+
+ /*
+ * We don't want to guess at whether the dump will successfully
+ * restore; allow the attempt regardless of the version of the restore
+ * target.
+ */
+ AHX->minRemoteVersion = 0;
+ AHX->maxRemoteVersion = 9999999;
+
+ ConnectDatabase(AHX, &ropt->cparams, false);
+
+ /*
+ * If we're talking to the DB directly, don't send comments since they
+ * obscure SQL when displaying errors
+ */
+ AH->noTocComments = 1;
+ }
+
+ /*
+ * Work out if we have an implied data-only restore. This can happen if
+ * the dump was data only or if the user has used a toc list to exclude
+ * all of the schema data. All we do is look for schema entries - if none
+ * are found then we set the dataOnly flag.
+ *
+ * We could scan for wanted TABLE entries, but that is not the same as
+ * dataOnly. At this stage, it seems unnecessary (6-Mar-2001).
+ */
+ if (!ropt->dataOnly)
+ {
+ int impliedDataOnly = 1;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & REQ_SCHEMA) != 0)
+ { /* It's schema, and it's wanted */
+ impliedDataOnly = 0;
+ break;
+ }
+ }
+ if (impliedDataOnly)
+ {
+ ropt->dataOnly = impliedDataOnly;
+ pg_log_info("implied data-only restore");
+ }
+ }
+
+ /*
+ * Setup the output file if necessary.
+ */
+ sav = SaveOutput(AH);
+ if (ropt->filename || ropt->compression_spec.algorithm != PG_COMPRESSION_NONE)
+ SetOutput(AH, ropt->filename, ropt->compression_spec);
+
+ ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n");
+
+ if (AH->archiveRemoteVersion)
+ ahprintf(AH, "-- Dumped from database version %s\n",
+ AH->archiveRemoteVersion);
+ if (AH->archiveDumpVersion)
+ ahprintf(AH, "-- Dumped by pg_dump version %s\n",
+ AH->archiveDumpVersion);
+
+ ahprintf(AH, "\n");
+
+ if (AH->public.verbose)
+ dumpTimestamp(AH, "Started on", AH->createDate);
+
+ if (ropt->single_txn)
+ {
+ if (AH->connection)
+ StartTransaction(AHX);
+ else
+ ahprintf(AH, "BEGIN;\n\n");
+ }
+
+ /*
+ * Establish important parameter values right away.
+ */
+ _doSetFixedOutputState(AH);
+
+ AH->stage = STAGE_PROCESSING;
+
+ /*
+ * Drop the items at the start, in reverse order
+ */
+ if (ropt->dropSchema)
+ {
+ for (te = AH->toc->prev; te != AH->toc; te = te->prev)
+ {
+ AH->currentTE = te;
+
+ /*
+ * In createDB mode, issue a DROP *only* for the database as a
+ * whole. Issuing drops against anything else would be wrong,
+ * because at this point we're connected to the wrong database.
+ * (The DATABASE PROPERTIES entry, if any, should be treated like
+ * the DATABASE entry.)
+ */
+ if (ropt->createDB)
+ {
+ if (strcmp(te->desc, "DATABASE") != 0 &&
+ strcmp(te->desc, "DATABASE PROPERTIES") != 0)
+ continue;
+ }
+
+ /* Otherwise, drop anything that's selected and has a dropStmt */
+ if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt)
+ {
+ pg_log_info("dropping %s %s", te->desc, te->tag);
+ /* Select owner and schema as necessary */
+ _becomeOwner(AH, te);
+ _selectOutputSchema(AH, te->namespace);
+
+ /*
+ * Now emit the DROP command, if the object has one. Note we
+ * don't necessarily emit it verbatim; at this point we add an
+ * appropriate IF EXISTS clause, if the user requested it.
+ */
+ if (*te->dropStmt != '\0')
+ {
+ if (!ropt->if_exists ||
+ strncmp(te->dropStmt, "--", 2) == 0)
+ {
+ /*
+ * Without --if-exists, or if it's just a comment (as
+ * happens for the public schema), print the dropStmt
+ * as-is.
+ */
+ ahprintf(AH, "%s", te->dropStmt);
+ }
+ else
+ {
+ /*
+ * Inject an appropriate spelling of "if exists". For
+ * large objects, we have a separate routine that
+ * knows how to do it, without depending on
+ * te->dropStmt; use that. For other objects we need
+ * to parse the command.
+ */
+ if (strncmp(te->desc, "BLOB", 4) == 0)
+ {
+ DropLOIfExists(AH, te->catalogId.oid);
+ }
+ else
+ {
+ char *dropStmt = pg_strdup(te->dropStmt);
+ char *dropStmtOrig = dropStmt;
+ PQExpBuffer ftStmt = createPQExpBuffer();
+
+ /*
+ * Need to inject IF EXISTS clause after ALTER
+ * TABLE part in ALTER TABLE .. DROP statement
+ */
+ if (strncmp(dropStmt, "ALTER TABLE", 11) == 0)
+ {
+ appendPQExpBufferStr(ftStmt,
+ "ALTER TABLE IF EXISTS");
+ dropStmt = dropStmt + 11;
+ }
+
+ /*
+ * ALTER TABLE..ALTER COLUMN..DROP DEFAULT does
+ * not support the IF EXISTS clause, and therefore
+ * we simply emit the original command for DEFAULT
+ * objects (modulo the adjustment made above).
+ *
+ * Likewise, don't mess with DATABASE PROPERTIES.
+ *
+ * If we used CREATE OR REPLACE VIEW as a means of
+ * quasi-dropping an ON SELECT rule, that should
+ * be emitted unchanged as well.
+ *
+ * For other object types, we need to extract the
+ * first part of the DROP which includes the
+ * object type. Most of the time this matches
+ * te->desc, so search for that; however for the
+ * different kinds of CONSTRAINTs, we know to
+ * search for hardcoded "DROP CONSTRAINT" instead.
+ */
+ if (strcmp(te->desc, "DEFAULT") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0 ||
+ strncmp(dropStmt, "CREATE OR REPLACE VIEW", 22) == 0)
+ appendPQExpBufferStr(ftStmt, dropStmt);
+ else
+ {
+ char buffer[40];
+ char *mark;
+
+ if (strcmp(te->desc, "CONSTRAINT") == 0 ||
+ strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "FK CONSTRAINT") == 0)
+ strcpy(buffer, "DROP CONSTRAINT");
+ else
+ snprintf(buffer, sizeof(buffer), "DROP %s",
+ te->desc);
+
+ mark = strstr(dropStmt, buffer);
+
+ if (mark)
+ {
+ *mark = '\0';
+ appendPQExpBuffer(ftStmt, "%s%s IF EXISTS%s",
+ dropStmt, buffer,
+ mark + strlen(buffer));
+ }
+ else
+ {
+ /* complain and emit unmodified command */
+ pg_log_warning("could not find where to insert IF EXISTS in statement \"%s\"",
+ dropStmtOrig);
+ appendPQExpBufferStr(ftStmt, dropStmt);
+ }
+ }
+
+ ahprintf(AH, "%s", ftStmt->data);
+
+ destroyPQExpBuffer(ftStmt);
+ pg_free(dropStmtOrig);
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * _selectOutputSchema may have set currSchema to reflect the effect
+ * of a "SET search_path" command it emitted. However, by now we may
+ * have dropped that schema; or it might not have existed in the first
+ * place. In either case the effective value of search_path will not
+ * be what we think. Forcibly reset currSchema so that we will
+ * re-establish the search_path setting when needed (after creating
+ * the schema).
+ *
+ * If we treated users as pg_dump'able objects then we'd need to reset
+ * currUser here too.
+ */
+ free(AH->currSchema);
+ AH->currSchema = NULL;
+ }
+
+ if (parallel_mode)
+ {
+ /*
+ * In parallel mode, turn control over to the parallel-restore logic.
+ */
+ ParallelState *pstate;
+ TocEntry pending_list;
+
+ /* The archive format module may need some setup for this */
+ if (AH->PrepParallelRestorePtr)
+ AH->PrepParallelRestorePtr(AH);
+
+ pending_list_header_init(&pending_list);
+
+ /* This runs PRE_DATA items and then disconnects from the database */
+ restore_toc_entries_prefork(AH, &pending_list);
+ Assert(AH->connection == NULL);
+
+ /* ParallelBackupStart() will actually fork the processes */
+ pstate = ParallelBackupStart(AH);
+ restore_toc_entries_parallel(AH, pstate, &pending_list);
+ ParallelBackupEnd(AH, pstate);
+
+ /* reconnect the leader and see if we missed something */
+ restore_toc_entries_postfork(AH, &pending_list);
+ Assert(AH->connection != NULL);
+ }
+ else
+ {
+ /*
+ * In serial mode, process everything in three phases: normal items,
+ * then ACLs, then post-ACL items. We might be able to skip one or
+ * both extra phases in some cases, eg data-only restores.
+ */
+ bool haveACL = false;
+ bool havePostACL = false;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA)) == 0)
+ continue; /* ignore if not to be dumped at all */
+
+ switch (_tocEntryRestorePass(te))
+ {
+ case RESTORE_PASS_MAIN:
+ (void) restore_toc_entry(AH, te, false);
+ break;
+ case RESTORE_PASS_ACL:
+ haveACL = true;
+ break;
+ case RESTORE_PASS_POST_ACL:
+ havePostACL = true;
+ break;
+ }
+ }
+
+ if (haveACL)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0 &&
+ _tocEntryRestorePass(te) == RESTORE_PASS_ACL)
+ (void) restore_toc_entry(AH, te, false);
+ }
+ }
+
+ if (havePostACL)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0 &&
+ _tocEntryRestorePass(te) == RESTORE_PASS_POST_ACL)
+ (void) restore_toc_entry(AH, te, false);
+ }
+ }
+ }
+
+ if (ropt->single_txn)
+ {
+ if (AH->connection)
+ CommitTransaction(AHX);
+ else
+ ahprintf(AH, "COMMIT;\n\n");
+ }
+
+ if (AH->public.verbose)
+ dumpTimestamp(AH, "Completed on", time(NULL));
+
+ ahprintf(AH, "--\n-- PostgreSQL database dump complete\n--\n\n");
+
+ /*
+ * Clean up & we're done.
+ */
+ AH->stage = STAGE_FINALIZING;
+
+ if (ropt->filename || ropt->compression_spec.algorithm != PG_COMPRESSION_NONE)
+ RestoreOutput(AH, sav);
+
+ if (ropt->useDB)
+ DisconnectDatabase(&AH->public);
+}
+
+/*
+ * Restore a single TOC item. Used in both parallel and non-parallel restore;
+ * is_parallel is true if we are in a worker child process.
+ *
+ * Returns 0 normally, but WORKER_CREATE_DONE or WORKER_INHIBIT_DATA if
+ * the parallel parent has to make the corresponding status update.
+ */
+static int
+restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ int status = WORKER_OK;
+ int reqs;
+ bool defnDumped;
+
+ AH->currentTE = te;
+
+ /* Dump any relevant dump warnings to stderr */
+ if (!ropt->suppressDumpWarnings && strcmp(te->desc, "WARNING") == 0)
+ {
+ if (!ropt->dataOnly && te->defn != NULL && strlen(te->defn) != 0)
+ pg_log_warning("warning from original dump file: %s", te->defn);
+ else if (te->copyStmt != NULL && strlen(te->copyStmt) != 0)
+ pg_log_warning("warning from original dump file: %s", te->copyStmt);
+ }
+
+ /* Work out what, if anything, we want from this entry */
+ reqs = te->reqs;
+
+ defnDumped = false;
+
+ /*
+ * If it has a schema component that we want, then process that
+ */
+ if ((reqs & REQ_SCHEMA) != 0)
+ {
+ /* Show namespace in log message if available */
+ if (te->namespace)
+ pg_log_info("creating %s \"%s.%s\"",
+ te->desc, te->namespace, te->tag);
+ else
+ pg_log_info("creating %s \"%s\"",
+ te->desc, te->tag);
+
+ _printTocEntry(AH, te, false);
+ defnDumped = true;
+
+ if (strcmp(te->desc, "TABLE") == 0)
+ {
+ if (AH->lastErrorTE == te)
+ {
+ /*
+ * We failed to create the table. If
+ * --no-data-for-failed-tables was given, mark the
+ * corresponding TABLE DATA to be ignored.
+ *
+ * In the parallel case this must be done in the parent, so we
+ * just set the return value.
+ */
+ if (ropt->noDataForFailedTables)
+ {
+ if (is_parallel)
+ status = WORKER_INHIBIT_DATA;
+ else
+ inhibit_data_for_failed_table(AH, te);
+ }
+ }
+ else
+ {
+ /*
+ * We created the table successfully. Mark the corresponding
+ * TABLE DATA for possible truncation.
+ *
+ * In the parallel case this must be done in the parent, so we
+ * just set the return value.
+ */
+ if (is_parallel)
+ status = WORKER_CREATE_DONE;
+ else
+ mark_create_done(AH, te);
+ }
+ }
+
+ /*
+ * If we created a DB, connect to it. Also, if we changed DB
+ * properties, reconnect to ensure that relevant GUC settings are
+ * applied to our session.
+ */
+ if (strcmp(te->desc, "DATABASE") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0)
+ {
+ pg_log_info("connecting to new database \"%s\"", te->tag);
+ _reconnectToDB(AH, te->tag);
+ }
+ }
+
+ /*
+ * If it has a data component that we want, then process that
+ */
+ if ((reqs & REQ_DATA) != 0)
+ {
+ /*
+ * hadDumper will be set if there is genuine data component for this
+ * node. Otherwise, we need to check the defn field for statements
+ * that need to be executed in data-only restores.
+ */
+ if (te->hadDumper)
+ {
+ /*
+ * If we can output the data, then restore it.
+ */
+ if (AH->PrintTocDataPtr != NULL)
+ {
+ _printTocEntry(AH, te, true);
+
+ if (strcmp(te->desc, "BLOBS") == 0 ||
+ strcmp(te->desc, "BLOB COMMENTS") == 0)
+ {
+ pg_log_info("processing %s", te->desc);
+
+ _selectOutputSchema(AH, "pg_catalog");
+
+ /* Send BLOB COMMENTS data to ExecuteSimpleCommands() */
+ if (strcmp(te->desc, "BLOB COMMENTS") == 0)
+ AH->outputKind = OUTPUT_OTHERDATA;
+
+ AH->PrintTocDataPtr(AH, te);
+
+ AH->outputKind = OUTPUT_SQLCMDS;
+ }
+ else
+ {
+ bool use_truncate;
+
+ _disableTriggersIfNecessary(AH, te);
+
+ /* Select owner and schema as necessary */
+ _becomeOwner(AH, te);
+ _selectOutputSchema(AH, te->namespace);
+
+ pg_log_info("processing data for table \"%s.%s\"",
+ te->namespace, te->tag);
+
+ /*
+ * In parallel restore, if we created the table earlier in
+ * this run (so that we know it is empty) and we are not
+ * restoring a load-via-partition-root data item then we
+ * wrap the COPY in a transaction and precede it with a
+ * TRUNCATE. If wal_level is set to minimal this prevents
+ * WAL-logging the COPY. This obtains a speedup similar
+ * to that from using single_txn mode in non-parallel
+ * restores.
+ *
+ * We mustn't do this for load-via-partition-root cases
+ * because some data might get moved across partition
+ * boundaries, risking deadlock and/or loss of previously
+ * loaded data. (We assume that all partitions of a
+ * partitioned table will be treated the same way.)
+ */
+ use_truncate = is_parallel && te->created &&
+ !is_load_via_partition_root(te);
+
+ if (use_truncate)
+ {
+ /*
+ * Parallel restore is always talking directly to a
+ * server, so no need to see if we should issue BEGIN.
+ */
+ StartTransaction(&AH->public);
+
+ /*
+ * Issue TRUNCATE with ONLY so that child tables are
+ * not wiped.
+ */
+ ahprintf(AH, "TRUNCATE TABLE ONLY %s;\n\n",
+ fmtQualifiedId(te->namespace, te->tag));
+ }
+
+ /*
+ * If we have a copy statement, use it.
+ */
+ if (te->copyStmt && strlen(te->copyStmt) > 0)
+ {
+ ahprintf(AH, "%s", te->copyStmt);
+ AH->outputKind = OUTPUT_COPYDATA;
+ }
+ else
+ AH->outputKind = OUTPUT_OTHERDATA;
+
+ AH->PrintTocDataPtr(AH, te);
+
+ /*
+ * Terminate COPY if needed.
+ */
+ if (AH->outputKind == OUTPUT_COPYDATA &&
+ RestoringToDB(AH))
+ EndDBCopyMode(&AH->public, te->tag);
+ AH->outputKind = OUTPUT_SQLCMDS;
+
+ /* close out the transaction started above */
+ if (use_truncate)
+ CommitTransaction(&AH->public);
+
+ _enableTriggersIfNecessary(AH, te);
+ }
+ }
+ }
+ else if (!defnDumped)
+ {
+ /* If we haven't already dumped the defn part, do so now */
+ pg_log_info("executing %s %s", te->desc, te->tag);
+ _printTocEntry(AH, te, false);
+ }
+ }
+
+ if (AH->public.n_errors > 0 && status == WORKER_OK)
+ status = WORKER_IGNORED_ERRORS;
+
+ return status;
+}
+
+/*
+ * Allocate a new RestoreOptions block.
+ * This is mainly so we can initialize it, but also for future expansion,
+ */
+RestoreOptions *
+NewRestoreOptions(void)
+{
+ RestoreOptions *opts;
+
+ opts = (RestoreOptions *) pg_malloc0(sizeof(RestoreOptions));
+
+ /* set any fields that shouldn't default to zeroes */
+ opts->format = archUnknown;
+ opts->cparams.promptPassword = TRI_DEFAULT;
+ opts->dumpSections = DUMP_UNSECTIONED;
+ opts->compression_spec.algorithm = PG_COMPRESSION_NONE;
+ opts->compression_spec.level = 0;
+
+ return opts;
+}
+
+static void
+_disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* This hack is only needed in a data-only restore */
+ if (!ropt->dataOnly || !ropt->disable_triggers)
+ return;
+
+ pg_log_info("disabling triggers for %s", te->tag);
+
+ /*
+ * Become superuser if possible, since they are the only ones who can
+ * disable constraint triggers. If -S was not given, assume the initial
+ * user identity is a superuser. (XXX would it be better to become the
+ * table owner?)
+ */
+ _becomeUser(AH, ropt->superuser);
+
+ /*
+ * Disable them.
+ */
+ ahprintf(AH, "ALTER TABLE %s DISABLE TRIGGER ALL;\n\n",
+ fmtQualifiedId(te->namespace, te->tag));
+}
+
+static void
+_enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* This hack is only needed in a data-only restore */
+ if (!ropt->dataOnly || !ropt->disable_triggers)
+ return;
+
+ pg_log_info("enabling triggers for %s", te->tag);
+
+ /*
+ * Become superuser if possible, since they are the only ones who can
+ * disable constraint triggers. If -S was not given, assume the initial
+ * user identity is a superuser. (XXX would it be better to become the
+ * table owner?)
+ */
+ _becomeUser(AH, ropt->superuser);
+
+ /*
+ * Enable them.
+ */
+ ahprintf(AH, "ALTER TABLE %s ENABLE TRIGGER ALL;\n\n",
+ fmtQualifiedId(te->namespace, te->tag));
+}
+
+/*
+ * Detect whether a TABLE DATA TOC item is performing "load via partition
+ * root", that is the target table is an ancestor partition rather than the
+ * table the TOC item is nominally for.
+ *
+ * In newer archive files this can be detected by checking for a special
+ * comment placed in te->defn. In older files we have to fall back to seeing
+ * if the COPY statement targets the named table or some other one. This
+ * will not work for data dumped as INSERT commands, so we could give a false
+ * negative in that case; fortunately, that's a rarely-used option.
+ */
+static bool
+is_load_via_partition_root(TocEntry *te)
+{
+ if (te->defn &&
+ strncmp(te->defn, "-- load via partition root ", 27) == 0)
+ return true;
+ if (te->copyStmt && *te->copyStmt)
+ {
+ PQExpBuffer copyStmt = createPQExpBuffer();
+ bool result;
+
+ /*
+ * Build the initial part of the COPY as it would appear if the
+ * nominal target table is the actual target. If we see anything
+ * else, it must be a load-via-partition-root case.
+ */
+ appendPQExpBuffer(copyStmt, "COPY %s ",
+ fmtQualifiedId(te->namespace, te->tag));
+ result = strncmp(te->copyStmt, copyStmt->data, copyStmt->len) != 0;
+ destroyPQExpBuffer(copyStmt);
+ return result;
+ }
+ /* Assume it's not load-via-partition-root */
+ return false;
+}
+
+/*
+ * This is a routine that is part of the dumper interface, hence the 'Archive*' parameter.
+ */
+
+/* Public */
+void
+WriteData(Archive *AHX, const void *data, size_t dLen)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (!AH->currToc)
+ pg_fatal("internal error -- WriteData cannot be called outside the context of a DataDumper routine");
+
+ AH->WriteDataPtr(AH, data, dLen);
+}
+
+/*
+ * Create a new TOC entry. The TOC was designed as a TOC, but is now the
+ * repository for all metadata. But the name has stuck.
+ *
+ * The new entry is added to the Archive's TOC list. Most callers can ignore
+ * the result value because nothing else need be done, but a few want to
+ * manipulate the TOC entry further.
+ */
+
+/* Public */
+TocEntry *
+ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId,
+ ArchiveOpts *opts)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ TocEntry *newToc;
+
+ newToc = (TocEntry *) pg_malloc0(sizeof(TocEntry));
+
+ AH->tocCount++;
+ if (dumpId > AH->maxDumpId)
+ AH->maxDumpId = dumpId;
+
+ newToc->prev = AH->toc->prev;
+ newToc->next = AH->toc;
+ AH->toc->prev->next = newToc;
+ AH->toc->prev = newToc;
+
+ newToc->catalogId = catalogId;
+ newToc->dumpId = dumpId;
+ newToc->section = opts->section;
+
+ newToc->tag = pg_strdup(opts->tag);
+ newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL;
+ newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL;
+ newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL;
+ newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL;
+ newToc->desc = pg_strdup(opts->description);
+ newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL;
+ newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL;
+ newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL;
+
+ if (opts->nDeps > 0)
+ {
+ newToc->dependencies = (DumpId *) pg_malloc(opts->nDeps * sizeof(DumpId));
+ memcpy(newToc->dependencies, opts->deps, opts->nDeps * sizeof(DumpId));
+ newToc->nDeps = opts->nDeps;
+ }
+ else
+ {
+ newToc->dependencies = NULL;
+ newToc->nDeps = 0;
+ }
+
+ newToc->dataDumper = opts->dumpFn;
+ newToc->dataDumperArg = opts->dumpArg;
+ newToc->hadDumper = opts->dumpFn ? true : false;
+
+ newToc->formatData = NULL;
+ newToc->dataLength = 0;
+
+ if (AH->ArchiveEntryPtr != NULL)
+ AH->ArchiveEntryPtr(AH, newToc);
+
+ return newToc;
+}
+
+/* Public */
+void
+PrintTOCSummary(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ TocEntry *te;
+ pg_compress_specification out_compression_spec = {0};
+ teSection curSection;
+ CompressFileHandle *sav;
+ const char *fmtName;
+ char stamp_str[64];
+
+ /* TOC is always uncompressed */
+ out_compression_spec.algorithm = PG_COMPRESSION_NONE;
+
+ sav = SaveOutput(AH);
+ if (ropt->filename)
+ SetOutput(AH, ropt->filename, out_compression_spec);
+
+ if (strftime(stamp_str, sizeof(stamp_str), PGDUMP_STRFTIME_FMT,
+ localtime(&AH->createDate)) == 0)
+ strcpy(stamp_str, "[unknown]");
+
+ ahprintf(AH, ";\n; Archive created at %s\n", stamp_str);
+ ahprintf(AH, "; dbname: %s\n; TOC Entries: %d\n; Compression: %s\n",
+ sanitize_line(AH->archdbname, false),
+ AH->tocCount,
+ get_compress_algorithm_name(AH->compression_spec.algorithm));
+
+ switch (AH->format)
+ {
+ case archCustom:
+ fmtName = "CUSTOM";
+ break;
+ case archDirectory:
+ fmtName = "DIRECTORY";
+ break;
+ case archTar:
+ fmtName = "TAR";
+ break;
+ default:
+ fmtName = "UNKNOWN";
+ }
+
+ ahprintf(AH, "; Dump Version: %d.%d-%d\n",
+ ARCHIVE_MAJOR(AH->version), ARCHIVE_MINOR(AH->version), ARCHIVE_REV(AH->version));
+ ahprintf(AH, "; Format: %s\n", fmtName);
+ ahprintf(AH, "; Integer: %d bytes\n", (int) AH->intSize);
+ ahprintf(AH, "; Offset: %d bytes\n", (int) AH->offSize);
+ if (AH->archiveRemoteVersion)
+ ahprintf(AH, "; Dumped from database version: %s\n",
+ AH->archiveRemoteVersion);
+ if (AH->archiveDumpVersion)
+ ahprintf(AH, "; Dumped by pg_dump version: %s\n",
+ AH->archiveDumpVersion);
+
+ ahprintf(AH, ";\n;\n; Selected TOC Entries:\n;\n");
+
+ curSection = SECTION_PRE_DATA;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->section != SECTION_NONE)
+ curSection = te->section;
+ if (ropt->verbose ||
+ (_tocEntryRequired(te, curSection, AH) & (REQ_SCHEMA | REQ_DATA)) != 0)
+ {
+ char *sanitized_name;
+ char *sanitized_schema;
+ char *sanitized_owner;
+
+ /*
+ */
+ sanitized_name = sanitize_line(te->tag, false);
+ sanitized_schema = sanitize_line(te->namespace, true);
+ sanitized_owner = sanitize_line(te->owner, false);
+
+ ahprintf(AH, "%d; %u %u %s %s %s %s\n", te->dumpId,
+ te->catalogId.tableoid, te->catalogId.oid,
+ te->desc, sanitized_schema, sanitized_name,
+ sanitized_owner);
+
+ free(sanitized_name);
+ free(sanitized_schema);
+ free(sanitized_owner);
+ }
+ if (ropt->verbose && te->nDeps > 0)
+ {
+ int i;
+
+ ahprintf(AH, ";\tdepends on:");
+ for (i = 0; i < te->nDeps; i++)
+ ahprintf(AH, " %d", te->dependencies[i]);
+ ahprintf(AH, "\n");
+ }
+ }
+
+ /* Enforce strict names checking */
+ if (ropt->strict_names)
+ StrictNamesCheck(ropt);
+
+ if (ropt->filename)
+ RestoreOutput(AH, sav);
+}
+
+/***********
+ * Large Object Archival
+ ***********/
+
+/* Called by a dumper to signal start of a LO */
+int
+StartLO(Archive *AHX, Oid oid)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (!AH->StartLOPtr)
+ pg_fatal("large-object output not supported in chosen format");
+
+ AH->StartLOPtr(AH, AH->currToc, oid);
+
+ return 1;
+}
+
+/* Called by a dumper to signal end of a LO */
+int
+EndLO(Archive *AHX, Oid oid)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (AH->EndLOPtr)
+ AH->EndLOPtr(AH, AH->currToc, oid);
+
+ return 1;
+}
+
+/**********
+ * Large Object Restoration
+ **********/
+
+/*
+ * Called by a format handler before any LOs are restored
+ */
+void
+StartRestoreLOs(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ if (!ropt->single_txn)
+ {
+ if (AH->connection)
+ StartTransaction(&AH->public);
+ else
+ ahprintf(AH, "BEGIN;\n\n");
+ }
+
+ AH->loCount = 0;
+}
+
+/*
+ * Called by a format handler after all LOs are restored
+ */
+void
+EndRestoreLOs(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ if (!ropt->single_txn)
+ {
+ if (AH->connection)
+ CommitTransaction(&AH->public);
+ else
+ ahprintf(AH, "COMMIT;\n\n");
+ }
+
+ pg_log_info(ngettext("restored %d large object",
+ "restored %d large objects",
+ AH->loCount),
+ AH->loCount);
+}
+
+
+/*
+ * Called by a format handler to initiate restoration of a LO
+ */
+void
+StartRestoreLO(ArchiveHandle *AH, Oid oid, bool drop)
+{
+ bool old_lo_style = (AH->version < K_VERS_1_12);
+ Oid loOid;
+
+ AH->loCount++;
+
+ /* Initialize the LO Buffer */
+ AH->lo_buf_used = 0;
+
+ pg_log_info("restoring large object with OID %u", oid);
+
+ /* With an old archive we must do drop and create logic here */
+ if (old_lo_style && drop)
+ DropLOIfExists(AH, oid);
+
+ if (AH->connection)
+ {
+ if (old_lo_style)
+ {
+ loOid = lo_create(AH->connection, oid);
+ if (loOid == 0 || loOid != oid)
+ pg_fatal("could not create large object %u: %s",
+ oid, PQerrorMessage(AH->connection));
+ }
+ AH->loFd = lo_open(AH->connection, oid, INV_WRITE);
+ if (AH->loFd == -1)
+ pg_fatal("could not open large object %u: %s",
+ oid, PQerrorMessage(AH->connection));
+ }
+ else
+ {
+ if (old_lo_style)
+ ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
+ oid, INV_WRITE);
+ else
+ ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
+ oid, INV_WRITE);
+ }
+
+ AH->writingLO = true;
+}
+
+void
+EndRestoreLO(ArchiveHandle *AH, Oid oid)
+{
+ if (AH->lo_buf_used > 0)
+ {
+ /* Write remaining bytes from the LO buffer */
+ dump_lo_buf(AH);
+ }
+
+ AH->writingLO = false;
+
+ if (AH->connection)
+ {
+ lo_close(AH->connection, AH->loFd);
+ AH->loFd = -1;
+ }
+ else
+ {
+ ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
+ }
+}
+
+/***********
+ * Sorting and Reordering
+ ***********/
+
+void
+SortTocFromFile(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ RestoreOptions *ropt = AH->public.ropt;
+ FILE *fh;
+ StringInfoData linebuf;
+
+ /* Allocate space for the 'wanted' array, and init it */
+ ropt->idWanted = (bool *) pg_malloc0(sizeof(bool) * AH->maxDumpId);
+
+ /* Setup the file */
+ fh = fopen(ropt->tocFile, PG_BINARY_R);
+ if (!fh)
+ pg_fatal("could not open TOC file \"%s\": %m", ropt->tocFile);
+
+ initStringInfo(&linebuf);
+
+ while (pg_get_line_buf(fh, &linebuf))
+ {
+ char *cmnt;
+ char *endptr;
+ DumpId id;
+ TocEntry *te;
+
+ /* Truncate line at comment, if any */
+ cmnt = strchr(linebuf.data, ';');
+ if (cmnt != NULL)
+ {
+ cmnt[0] = '\0';
+ linebuf.len = cmnt - linebuf.data;
+ }
+
+ /* Ignore if all blank */
+ if (strspn(linebuf.data, " \t\r\n") == linebuf.len)
+ continue;
+
+ /* Get an ID, check it's valid and not already seen */
+ id = strtol(linebuf.data, &endptr, 10);
+ if (endptr == linebuf.data || id <= 0 || id > AH->maxDumpId ||
+ ropt->idWanted[id - 1])
+ {
+ pg_log_warning("line ignored: %s", linebuf.data);
+ continue;
+ }
+
+ /* Find TOC entry */
+ te = getTocEntryByDumpId(AH, id);
+ if (!te)
+ pg_fatal("could not find entry for ID %d",
+ id);
+
+ /* Mark it wanted */
+ ropt->idWanted[id - 1] = true;
+
+ /*
+ * Move each item to the end of the list as it is selected, so that
+ * they are placed in the desired order. Any unwanted items will end
+ * up at the front of the list, which may seem unintuitive but it's
+ * what we need. In an ordinary serial restore that makes no
+ * difference, but in a parallel restore we need to mark unrestored
+ * items' dependencies as satisfied before we start examining
+ * restorable items. Otherwise they could have surprising
+ * side-effects on the order in which restorable items actually get
+ * restored.
+ */
+ _moveBefore(AH->toc, te);
+ }
+
+ pg_free(linebuf.data);
+
+ if (fclose(fh) != 0)
+ pg_fatal("could not close TOC file: %m");
+}
+
+/**********************
+ * Convenience functions that look like standard IO functions
+ * for writing data when in dump mode.
+ **********************/
+
+/* Public */
+void
+archputs(const char *s, Archive *AH)
+{
+ WriteData(AH, s, strlen(s));
+}
+
+/* Public */
+int
+archprintf(Archive *AH, const char *fmt,...)
+{
+ int save_errno = errno;
+ char *p;
+ size_t len = 128; /* initial assumption about buffer size */
+ size_t cnt;
+
+ for (;;)
+ {
+ va_list args;
+
+ /* Allocate work buffer. */
+ p = (char *) pg_malloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ cnt = pvsnprintf(p, len, fmt, args);
+ va_end(args);
+
+ if (cnt < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ free(p);
+ len = cnt;
+ }
+
+ WriteData(AH, p, cnt);
+ free(p);
+ return (int) cnt;
+}
+
+
+/*******************************
+ * Stuff below here should be 'private' to the archiver routines
+ *******************************/
+
+static void
+SetOutput(ArchiveHandle *AH, const char *filename,
+ const pg_compress_specification compression_spec)
+{
+ CompressFileHandle *CFH;
+ const char *mode;
+ int fn = -1;
+
+ if (filename)
+ {
+ if (strcmp(filename, "-") == 0)
+ fn = fileno(stdout);
+ }
+ else if (AH->FH)
+ fn = fileno(AH->FH);
+ else if (AH->fSpec)
+ {
+ filename = AH->fSpec;
+ }
+ else
+ fn = fileno(stdout);
+
+ if (AH->mode == archModeAppend)
+ mode = PG_BINARY_A;
+ else
+ mode = PG_BINARY_W;
+
+ CFH = InitCompressFileHandle(compression_spec);
+
+ if (!CFH->open_func(filename, fn, mode, CFH))
+ {
+ if (filename)
+ pg_fatal("could not open output file \"%s\": %m", filename);
+ else
+ pg_fatal("could not open output file: %m");
+ }
+
+ AH->OF = CFH;
+}
+
+static CompressFileHandle *
+SaveOutput(ArchiveHandle *AH)
+{
+ return (CompressFileHandle *) AH->OF;
+}
+
+static void
+RestoreOutput(ArchiveHandle *AH, CompressFileHandle *savedOutput)
+{
+ errno = 0;
+ if (!EndCompressFileHandle(AH->OF))
+ pg_fatal("could not close output file: %m");
+
+ AH->OF = savedOutput;
+}
+
+
+
+/*
+ * Print formatted text to the output file (usually stdout).
+ */
+int
+ahprintf(ArchiveHandle *AH, const char *fmt,...)
+{
+ int save_errno = errno;
+ char *p;
+ size_t len = 128; /* initial assumption about buffer size */
+ size_t cnt;
+
+ for (;;)
+ {
+ va_list args;
+
+ /* Allocate work buffer. */
+ p = (char *) pg_malloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ cnt = pvsnprintf(p, len, fmt, args);
+ va_end(args);
+
+ if (cnt < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ free(p);
+ len = cnt;
+ }
+
+ ahwrite(p, 1, cnt, AH);
+ free(p);
+ return (int) cnt;
+}
+
+/*
+ * Single place for logic which says 'We are restoring to a direct DB connection'.
+ */
+static int
+RestoringToDB(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ return (ropt && ropt->useDB && AH->connection);
+}
+
+/*
+ * Dump the current contents of the LO data buffer while writing a LO
+ */
+static void
+dump_lo_buf(ArchiveHandle *AH)
+{
+ if (AH->connection)
+ {
+ int res;
+
+ res = lo_write(AH->connection, AH->loFd, AH->lo_buf, AH->lo_buf_used);
+ pg_log_debug(ngettext("wrote %zu byte of large object data (result = %d)",
+ "wrote %zu bytes of large object data (result = %d)",
+ AH->lo_buf_used),
+ AH->lo_buf_used, res);
+ /* We assume there are no short writes, only errors */
+ if (res != AH->lo_buf_used)
+ warn_or_exit_horribly(AH, "could not write to large object: %s",
+ PQerrorMessage(AH->connection));
+ }
+ else
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+
+ appendByteaLiteralAHX(buf,
+ (const unsigned char *) AH->lo_buf,
+ AH->lo_buf_used,
+ AH);
+
+ /* Hack: turn off writingLO so ahwrite doesn't recurse to here */
+ AH->writingLO = false;
+ ahprintf(AH, "SELECT pg_catalog.lowrite(0, %s);\n", buf->data);
+ AH->writingLO = true;
+
+ destroyPQExpBuffer(buf);
+ }
+ AH->lo_buf_used = 0;
+}
+
+
+/*
+ * Write buffer to the output file (usually stdout). This is used for
+ * outputting 'restore' scripts etc. It is even possible for an archive
+ * format to create a custom output routine to 'fake' a restore if it
+ * wants to generate a script (see TAR output).
+ */
+void
+ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
+{
+ int bytes_written = 0;
+
+ if (AH->writingLO)
+ {
+ size_t remaining = size * nmemb;
+
+ while (AH->lo_buf_used + remaining > AH->lo_buf_size)
+ {
+ size_t avail = AH->lo_buf_size - AH->lo_buf_used;
+
+ memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, avail);
+ ptr = (const void *) ((const char *) ptr + avail);
+ remaining -= avail;
+ AH->lo_buf_used += avail;
+ dump_lo_buf(AH);
+ }
+
+ memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, remaining);
+ AH->lo_buf_used += remaining;
+
+ bytes_written = size * nmemb;
+ }
+ else if (AH->CustomOutPtr)
+ bytes_written = AH->CustomOutPtr(AH, ptr, size * nmemb);
+
+ /*
+ * If we're doing a restore, and it's direct to DB, and we're connected
+ * then send it to the DB.
+ */
+ else if (RestoringToDB(AH))
+ bytes_written = ExecuteSqlCommandBuf(&AH->public, (const char *) ptr, size * nmemb);
+ else
+ {
+ CompressFileHandle *CFH = (CompressFileHandle *) AH->OF;
+
+ if (CFH->write_func(ptr, size * nmemb, CFH))
+ bytes_written = size * nmemb;
+ }
+
+ if (bytes_written != size * nmemb)
+ WRITE_ERROR_EXIT;
+}
+
+/* on some error, we may decide to go on... */
+void
+warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...)
+{
+ va_list ap;
+
+ switch (AH->stage)
+ {
+
+ case STAGE_NONE:
+ /* Do nothing special */
+ break;
+
+ case STAGE_INITIALIZING:
+ if (AH->stage != AH->lastErrorStage)
+ pg_log_info("while INITIALIZING:");
+ break;
+
+ case STAGE_PROCESSING:
+ if (AH->stage != AH->lastErrorStage)
+ pg_log_info("while PROCESSING TOC:");
+ break;
+
+ case STAGE_FINALIZING:
+ if (AH->stage != AH->lastErrorStage)
+ pg_log_info("while FINALIZING:");
+ break;
+ }
+ if (AH->currentTE != NULL && AH->currentTE != AH->lastErrorTE)
+ {
+ pg_log_info("from TOC entry %d; %u %u %s %s %s",
+ AH->currentTE->dumpId,
+ AH->currentTE->catalogId.tableoid,
+ AH->currentTE->catalogId.oid,
+ AH->currentTE->desc ? AH->currentTE->desc : "(no desc)",
+ AH->currentTE->tag ? AH->currentTE->tag : "(no tag)",
+ AH->currentTE->owner ? AH->currentTE->owner : "(no owner)");
+ }
+ AH->lastErrorStage = AH->stage;
+ AH->lastErrorTE = AH->currentTE;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, fmt, ap);
+ va_end(ap);
+
+ if (AH->public.exit_on_error)
+ exit_nicely(1);
+ else
+ AH->public.n_errors++;
+}
+
+#ifdef NOT_USED
+
+static void
+_moveAfter(ArchiveHandle *AH, TocEntry *pos, TocEntry *te)
+{
+ /* Unlink te from list */
+ te->prev->next = te->next;
+ te->next->prev = te->prev;
+
+ /* and insert it after "pos" */
+ te->prev = pos;
+ te->next = pos->next;
+ pos->next->prev = te;
+ pos->next = te;
+}
+#endif
+
+static void
+_moveBefore(TocEntry *pos, TocEntry *te)
+{
+ /* Unlink te from list */
+ te->prev->next = te->next;
+ te->next->prev = te->prev;
+
+ /* and insert it before "pos" */
+ te->prev = pos->prev;
+ te->next = pos;
+ pos->prev->next = te;
+ pos->prev = te;
+}
+
+/*
+ * Build index arrays for the TOC list
+ *
+ * This should be invoked only after we have created or read in all the TOC
+ * items.
+ *
+ * The arrays are indexed by dump ID (so entry zero is unused). Note that the
+ * array entries run only up to maxDumpId. We might see dependency dump IDs
+ * beyond that (if the dump was partial); so always check the array bound
+ * before trying to touch an array entry.
+ */
+static void
+buildTocEntryArrays(ArchiveHandle *AH)
+{
+ DumpId maxDumpId = AH->maxDumpId;
+ TocEntry *te;
+
+ AH->tocsByDumpId = (TocEntry **) pg_malloc0((maxDumpId + 1) * sizeof(TocEntry *));
+ AH->tableDataId = (DumpId *) pg_malloc0((maxDumpId + 1) * sizeof(DumpId));
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /* this check is purely paranoia, maxDumpId should be correct */
+ if (te->dumpId <= 0 || te->dumpId > maxDumpId)
+ pg_fatal("bad dumpId");
+
+ /* tocsByDumpId indexes all TOCs by their dump ID */
+ AH->tocsByDumpId[te->dumpId] = te;
+
+ /*
+ * tableDataId provides the TABLE DATA item's dump ID for each TABLE
+ * TOC entry that has a DATA item. We compute this by reversing the
+ * TABLE DATA item's dependency, knowing that a TABLE DATA item has
+ * just one dependency and it is the TABLE item.
+ */
+ if (strcmp(te->desc, "TABLE DATA") == 0 && te->nDeps > 0)
+ {
+ DumpId tableId = te->dependencies[0];
+
+ /*
+ * The TABLE item might not have been in the archive, if this was
+ * a data-only dump; but its dump ID should be less than its data
+ * item's dump ID, so there should be a place for it in the array.
+ */
+ if (tableId <= 0 || tableId > maxDumpId)
+ pg_fatal("bad table dumpId for TABLE DATA item");
+
+ AH->tableDataId[tableId] = te->dumpId;
+ }
+ }
+}
+
+TocEntry *
+getTocEntryByDumpId(ArchiveHandle *AH, DumpId id)
+{
+ /* build index arrays if we didn't already */
+ if (AH->tocsByDumpId == NULL)
+ buildTocEntryArrays(AH);
+
+ if (id > 0 && id <= AH->maxDumpId)
+ return AH->tocsByDumpId[id];
+
+ return NULL;
+}
+
+int
+TocIDRequired(ArchiveHandle *AH, DumpId id)
+{
+ TocEntry *te = getTocEntryByDumpId(AH, id);
+
+ if (!te)
+ return 0;
+
+ return te->reqs;
+}
+
+size_t
+WriteOffset(ArchiveHandle *AH, pgoff_t o, int wasSet)
+{
+ int off;
+
+ /* Save the flag */
+ AH->WriteBytePtr(AH, wasSet);
+
+ /* Write out pgoff_t smallest byte first, prevents endian mismatch */
+ for (off = 0; off < sizeof(pgoff_t); off++)
+ {
+ AH->WriteBytePtr(AH, o & 0xFF);
+ o >>= 8;
+ }
+ return sizeof(pgoff_t) + 1;
+}
+
+int
+ReadOffset(ArchiveHandle *AH, pgoff_t * o)
+{
+ int i;
+ int off;
+ int offsetFlg;
+
+ /* Initialize to zero */
+ *o = 0;
+
+ /* Check for old version */
+ if (AH->version < K_VERS_1_7)
+ {
+ /* Prior versions wrote offsets using WriteInt */
+ i = ReadInt(AH);
+ /* -1 means not set */
+ if (i < 0)
+ return K_OFFSET_POS_NOT_SET;
+ else if (i == 0)
+ return K_OFFSET_NO_DATA;
+
+ /* Cast to pgoff_t because it was written as an int. */
+ *o = (pgoff_t) i;
+ return K_OFFSET_POS_SET;
+ }
+
+ /*
+ * Read the flag indicating the state of the data pointer. Check if valid
+ * and die if not.
+ *
+ * This used to be handled by a negative or zero pointer, now we use an
+ * extra byte specifically for the state.
+ */
+ offsetFlg = AH->ReadBytePtr(AH) & 0xFF;
+
+ switch (offsetFlg)
+ {
+ case K_OFFSET_POS_NOT_SET:
+ case K_OFFSET_NO_DATA:
+ case K_OFFSET_POS_SET:
+
+ break;
+
+ default:
+ pg_fatal("unexpected data offset flag %d", offsetFlg);
+ }
+
+ /*
+ * Read the bytes
+ */
+ for (off = 0; off < AH->offSize; off++)
+ {
+ if (off < sizeof(pgoff_t))
+ *o |= ((pgoff_t) (AH->ReadBytePtr(AH))) << (off * 8);
+ else
+ {
+ if (AH->ReadBytePtr(AH) != 0)
+ pg_fatal("file offset in dump file is too large");
+ }
+ }
+
+ return offsetFlg;
+}
+
+size_t
+WriteInt(ArchiveHandle *AH, int i)
+{
+ int b;
+
+ /*
+ * This is a bit yucky, but I don't want to make the binary format very
+ * dependent on representation, and not knowing much about it, I write out
+ * a sign byte. If you change this, don't forget to change the file
+ * version #, and modify ReadInt to read the new format AS WELL AS the old
+ * formats.
+ */
+
+ /* SIGN byte */
+ if (i < 0)
+ {
+ AH->WriteBytePtr(AH, 1);
+ i = -i;
+ }
+ else
+ AH->WriteBytePtr(AH, 0);
+
+ for (b = 0; b < AH->intSize; b++)
+ {
+ AH->WriteBytePtr(AH, i & 0xFF);
+ i >>= 8;
+ }
+
+ return AH->intSize + 1;
+}
+
+int
+ReadInt(ArchiveHandle *AH)
+{
+ int res = 0;
+ int bv,
+ b;
+ int sign = 0; /* Default positive */
+ int bitShift = 0;
+
+ if (AH->version > K_VERS_1_0)
+ /* Read a sign byte */
+ sign = AH->ReadBytePtr(AH);
+
+ for (b = 0; b < AH->intSize; b++)
+ {
+ bv = AH->ReadBytePtr(AH) & 0xFF;
+ if (bv != 0)
+ res = res + (bv << bitShift);
+ bitShift += 8;
+ }
+
+ if (sign)
+ res = -res;
+
+ return res;
+}
+
+size_t
+WriteStr(ArchiveHandle *AH, const char *c)
+{
+ size_t res;
+
+ if (c)
+ {
+ int len = strlen(c);
+
+ res = WriteInt(AH, len);
+ AH->WriteBufPtr(AH, c, len);
+ res += len;
+ }
+ else
+ res = WriteInt(AH, -1);
+
+ return res;
+}
+
+char *
+ReadStr(ArchiveHandle *AH)
+{
+ char *buf;
+ int l;
+
+ l = ReadInt(AH);
+ if (l < 0)
+ buf = NULL;
+ else
+ {
+ buf = (char *) pg_malloc(l + 1);
+ AH->ReadBufPtr(AH, (void *) buf, l);
+
+ buf[l] = '\0';
+ }
+
+ return buf;
+}
+
+static bool
+_fileExistsInDirectory(const char *dir, const char *filename)
+{
+ struct stat st;
+ char buf[MAXPGPATH];
+
+ if (snprintf(buf, MAXPGPATH, "%s/%s", dir, filename) >= MAXPGPATH)
+ pg_fatal("directory name too long: \"%s\"", dir);
+
+ return (stat(buf, &st) == 0 && S_ISREG(st.st_mode));
+}
+
+static int
+_discoverArchiveFormat(ArchiveHandle *AH)
+{
+ FILE *fh;
+ char sig[6]; /* More than enough */
+ size_t cnt;
+ int wantClose = 0;
+
+ pg_log_debug("attempting to ascertain archive format");
+
+ free(AH->lookahead);
+
+ AH->readHeader = 0;
+ AH->lookaheadSize = 512;
+ AH->lookahead = pg_malloc0(512);
+ AH->lookaheadLen = 0;
+ AH->lookaheadPos = 0;
+
+ if (AH->fSpec)
+ {
+ struct stat st;
+
+ wantClose = 1;
+
+ /*
+ * Check if the specified archive is a directory. If so, check if
+ * there's a "toc.dat" (or "toc.dat.{gz,lz4,zst}") file in it.
+ */
+ if (stat(AH->fSpec, &st) == 0 && S_ISDIR(st.st_mode))
+ {
+ AH->format = archDirectory;
+ if (_fileExistsInDirectory(AH->fSpec, "toc.dat"))
+ return AH->format;
+#ifdef HAVE_LIBZ
+ if (_fileExistsInDirectory(AH->fSpec, "toc.dat.gz"))
+ return AH->format;
+#endif
+#ifdef USE_LZ4
+ if (_fileExistsInDirectory(AH->fSpec, "toc.dat.lz4"))
+ return AH->format;
+#endif
+#ifdef USE_ZSTD
+ if (_fileExistsInDirectory(AH->fSpec, "toc.dat.zst"))
+ return AH->format;
+#endif
+ pg_fatal("directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)",
+ AH->fSpec);
+ fh = NULL; /* keep compiler quiet */
+ }
+ else
+ {
+ fh = fopen(AH->fSpec, PG_BINARY_R);
+ if (!fh)
+ pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
+ }
+ }
+ else
+ {
+ fh = stdin;
+ if (!fh)
+ pg_fatal("could not open input file: %m");
+ }
+
+ if ((cnt = fread(sig, 1, 5, fh)) != 5)
+ {
+ if (ferror(fh))
+ pg_fatal("could not read input file: %m");
+ else
+ pg_fatal("input file is too short (read %lu, expected 5)",
+ (unsigned long) cnt);
+ }
+
+ /* Save it, just in case we need it later */
+ memcpy(&AH->lookahead[0], sig, 5);
+ AH->lookaheadLen = 5;
+
+ if (strncmp(sig, "PGDMP", 5) == 0)
+ {
+ /* It's custom format, stop here */
+ AH->format = archCustom;
+ AH->readHeader = 1;
+ }
+ else
+ {
+ /*
+ * *Maybe* we have a tar archive format file or a text dump ... So,
+ * read first 512 byte header...
+ */
+ cnt = fread(&AH->lookahead[AH->lookaheadLen], 1, 512 - AH->lookaheadLen, fh);
+ /* read failure is checked below */
+ AH->lookaheadLen += cnt;
+
+ if (AH->lookaheadLen >= strlen(TEXT_DUMPALL_HEADER) &&
+ (strncmp(AH->lookahead, TEXT_DUMP_HEADER, strlen(TEXT_DUMP_HEADER)) == 0 ||
+ strncmp(AH->lookahead, TEXT_DUMPALL_HEADER, strlen(TEXT_DUMPALL_HEADER)) == 0))
+ {
+ /*
+ * looks like it's probably a text format dump. so suggest they
+ * try psql
+ */
+ pg_fatal("input file appears to be a text format dump. Please use psql.");
+ }
+
+ if (AH->lookaheadLen != 512)
+ {
+ if (feof(fh))
+ pg_fatal("input file does not appear to be a valid archive (too short?)");
+ else
+ READ_ERROR_EXIT(fh);
+ }
+
+ if (!isValidTarHeader(AH->lookahead))
+ pg_fatal("input file does not appear to be a valid archive");
+
+ AH->format = archTar;
+ }
+
+ /* Close the file if we opened it */
+ if (wantClose)
+ {
+ if (fclose(fh) != 0)
+ pg_fatal("could not close input file: %m");
+ /* Forget lookahead, since we'll re-read header after re-opening */
+ AH->readHeader = 0;
+ AH->lookaheadLen = 0;
+ }
+
+ return AH->format;
+}
+
+
+/*
+ * Allocate an archive handle
+ */
+static ArchiveHandle *
+_allocAH(const char *FileSpec, const ArchiveFormat fmt,
+ const pg_compress_specification compression_spec,
+ bool dosync, ArchiveMode mode,
+ SetupWorkerPtrType setupWorkerPtr)
+{
+ ArchiveHandle *AH;
+ CompressFileHandle *CFH;
+ pg_compress_specification out_compress_spec = {0};
+
+ pg_log_debug("allocating AH for %s, format %d",
+ FileSpec ? FileSpec : "(stdio)", fmt);
+
+ AH = (ArchiveHandle *) pg_malloc0(sizeof(ArchiveHandle));
+
+ AH->version = K_VERS_SELF;
+
+ /* initialize for backwards compatible string processing */
+ AH->public.encoding = 0; /* PG_SQL_ASCII */
+ AH->public.std_strings = false;
+
+ /* sql error handling */
+ AH->public.exit_on_error = true;
+ AH->public.n_errors = 0;
+
+ AH->archiveDumpVersion = PG_VERSION;
+
+ AH->createDate = time(NULL);
+
+ AH->intSize = sizeof(int);
+ AH->offSize = sizeof(pgoff_t);
+ if (FileSpec)
+ {
+ AH->fSpec = pg_strdup(FileSpec);
+
+ /*
+ * Not used; maybe later....
+ *
+ * AH->workDir = pg_strdup(FileSpec); for(i=strlen(FileSpec) ; i > 0 ;
+ * i--) if (AH->workDir[i-1] == '/')
+ */
+ }
+ else
+ AH->fSpec = NULL;
+
+ AH->currUser = NULL; /* unknown */
+ AH->currSchema = NULL; /* ditto */
+ AH->currTablespace = NULL; /* ditto */
+ AH->currTableAm = NULL; /* ditto */
+
+ AH->toc = (TocEntry *) pg_malloc0(sizeof(TocEntry));
+
+ AH->toc->next = AH->toc;
+ AH->toc->prev = AH->toc;
+
+ AH->mode = mode;
+ AH->compression_spec = compression_spec;
+ AH->dosync = dosync;
+
+ memset(&(AH->sqlparse), 0, sizeof(AH->sqlparse));
+
+ /* Open stdout with no compression for AH output handle */
+ out_compress_spec.algorithm = PG_COMPRESSION_NONE;
+ CFH = InitCompressFileHandle(out_compress_spec);
+ if (!CFH->open_func(NULL, fileno(stdout), PG_BINARY_A, CFH))
+ pg_fatal("could not open stdout for appending: %m");
+ AH->OF = CFH;
+
+ /*
+ * On Windows, we need to use binary mode to read/write non-text files,
+ * which include all archive formats as well as compressed plain text.
+ * Force stdin/stdout into binary mode if that is what we are using.
+ */
+#ifdef WIN32
+ if ((fmt != archNull || compression_spec.algorithm != PG_COMPRESSION_NONE) &&
+ (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0))
+ {
+ if (mode == archModeWrite)
+ _setmode(fileno(stdout), O_BINARY);
+ else
+ _setmode(fileno(stdin), O_BINARY);
+ }
+#endif
+
+ AH->SetupWorkerPtr = setupWorkerPtr;
+
+ if (fmt == archUnknown)
+ AH->format = _discoverArchiveFormat(AH);
+ else
+ AH->format = fmt;
+
+ switch (AH->format)
+ {
+ case archCustom:
+ InitArchiveFmt_Custom(AH);
+ break;
+
+ case archNull:
+ InitArchiveFmt_Null(AH);
+ break;
+
+ case archDirectory:
+ InitArchiveFmt_Directory(AH);
+ break;
+
+ case archTar:
+ InitArchiveFmt_Tar(AH);
+ break;
+
+ default:
+ pg_fatal("unrecognized file format \"%d\"", fmt);
+ }
+
+ return AH;
+}
+
+/*
+ * Write out all data (tables & LOs)
+ */
+void
+WriteDataChunks(ArchiveHandle *AH, ParallelState *pstate)
+{
+ TocEntry *te;
+
+ if (pstate && pstate->numWorkers > 1)
+ {
+ /*
+ * In parallel mode, this code runs in the leader process. We
+ * construct an array of candidate TEs, then sort it into decreasing
+ * size order, then dispatch each TE to a data-transfer worker. By
+ * dumping larger tables first, we avoid getting into a situation
+ * where we're down to one job and it's big, losing parallelism.
+ */
+ TocEntry **tes;
+ int ntes;
+
+ tes = (TocEntry **) pg_malloc(AH->tocCount * sizeof(TocEntry *));
+ ntes = 0;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /* Consider only TEs with dataDumper functions ... */
+ if (!te->dataDumper)
+ continue;
+ /* ... and ignore ones not enabled for dump */
+ if ((te->reqs & REQ_DATA) == 0)
+ continue;
+
+ tes[ntes++] = te;
+ }
+
+ if (ntes > 1)
+ qsort(tes, ntes, sizeof(TocEntry *), TocEntrySizeCompare);
+
+ for (int i = 0; i < ntes; i++)
+ DispatchJobForTocEntry(AH, pstate, tes[i], ACT_DUMP,
+ mark_dump_job_done, NULL);
+
+ pg_free(tes);
+
+ /* Now wait for workers to finish. */
+ WaitForWorkers(AH, pstate, WFW_ALL_IDLE);
+ }
+ else
+ {
+ /* Non-parallel mode: just dump all candidate TEs sequentially. */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ /* Must have same filter conditions as above */
+ if (!te->dataDumper)
+ continue;
+ if ((te->reqs & REQ_DATA) == 0)
+ continue;
+
+ WriteDataChunksForTocEntry(AH, te);
+ }
+ }
+}
+
+
+/*
+ * Callback function that's invoked in the leader process after a step has
+ * been parallel dumped.
+ *
+ * We don't need to do anything except check for worker failure.
+ */
+static void
+mark_dump_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data)
+{
+ pg_log_info("finished item %d %s %s",
+ te->dumpId, te->desc, te->tag);
+
+ if (status != 0)
+ pg_fatal("worker process failed: exit code %d",
+ status);
+}
+
+
+void
+WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ StartDataPtrType startPtr;
+ EndDataPtrType endPtr;
+
+ AH->currToc = te;
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ {
+ startPtr = AH->StartLOsPtr;
+ endPtr = AH->EndLOsPtr;
+ }
+ else
+ {
+ startPtr = AH->StartDataPtr;
+ endPtr = AH->EndDataPtr;
+ }
+
+ if (startPtr != NULL)
+ (*startPtr) (AH, te);
+
+ /*
+ * The user-provided DataDumper routine needs to call AH->WriteData
+ */
+ te->dataDumper((Archive *) AH, te->dataDumperArg);
+
+ if (endPtr != NULL)
+ (*endPtr) (AH, te);
+
+ AH->currToc = NULL;
+}
+
+void
+WriteToc(ArchiveHandle *AH)
+{
+ TocEntry *te;
+ char workbuf[32];
+ int tocCount;
+ int i;
+
+ /* count entries that will actually be dumped */
+ tocCount = 0;
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA | REQ_SPECIAL)) != 0)
+ tocCount++;
+ }
+
+ /* printf("%d TOC Entries to save\n", tocCount); */
+
+ WriteInt(AH, tocCount);
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if ((te->reqs & (REQ_SCHEMA | REQ_DATA | REQ_SPECIAL)) == 0)
+ continue;
+
+ WriteInt(AH, te->dumpId);
+ WriteInt(AH, te->dataDumper ? 1 : 0);
+
+ /* OID is recorded as a string for historical reasons */
+ sprintf(workbuf, "%u", te->catalogId.tableoid);
+ WriteStr(AH, workbuf);
+ sprintf(workbuf, "%u", te->catalogId.oid);
+ WriteStr(AH, workbuf);
+
+ WriteStr(AH, te->tag);
+ WriteStr(AH, te->desc);
+ WriteInt(AH, te->section);
+ WriteStr(AH, te->defn);
+ WriteStr(AH, te->dropStmt);
+ WriteStr(AH, te->copyStmt);
+ WriteStr(AH, te->namespace);
+ WriteStr(AH, te->tablespace);
+ WriteStr(AH, te->tableam);
+ WriteStr(AH, te->owner);
+ WriteStr(AH, "false");
+
+ /* Dump list of dependencies */
+ for (i = 0; i < te->nDeps; i++)
+ {
+ sprintf(workbuf, "%d", te->dependencies[i]);
+ WriteStr(AH, workbuf);
+ }
+ WriteStr(AH, NULL); /* Terminate List */
+
+ if (AH->WriteExtraTocPtr)
+ AH->WriteExtraTocPtr(AH, te);
+ }
+}
+
+void
+ReadToc(ArchiveHandle *AH)
+{
+ int i;
+ char *tmp;
+ DumpId *deps;
+ int depIdx;
+ int depSize;
+ TocEntry *te;
+ bool is_supported;
+
+ AH->tocCount = ReadInt(AH);
+ AH->maxDumpId = 0;
+
+ for (i = 0; i < AH->tocCount; i++)
+ {
+ te = (TocEntry *) pg_malloc0(sizeof(TocEntry));
+ te->dumpId = ReadInt(AH);
+
+ if (te->dumpId > AH->maxDumpId)
+ AH->maxDumpId = te->dumpId;
+
+ /* Sanity check */
+ if (te->dumpId <= 0)
+ pg_fatal("entry ID %d out of range -- perhaps a corrupt TOC",
+ te->dumpId);
+
+ te->hadDumper = ReadInt(AH);
+
+ if (AH->version >= K_VERS_1_8)
+ {
+ tmp = ReadStr(AH);
+ sscanf(tmp, "%u", &te->catalogId.tableoid);
+ free(tmp);
+ }
+ else
+ te->catalogId.tableoid = InvalidOid;
+ tmp = ReadStr(AH);
+ sscanf(tmp, "%u", &te->catalogId.oid);
+ free(tmp);
+
+ te->tag = ReadStr(AH);
+ te->desc = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_11)
+ {
+ te->section = ReadInt(AH);
+ }
+ else
+ {
+ /*
+ * Rules for pre-8.4 archives wherein pg_dump hasn't classified
+ * the entries into sections. This list need not cover entry
+ * types added later than 8.4.
+ */
+ if (strcmp(te->desc, "COMMENT") == 0 ||
+ strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "ACL LANGUAGE") == 0)
+ te->section = SECTION_NONE;
+ else if (strcmp(te->desc, "TABLE DATA") == 0 ||
+ strcmp(te->desc, "BLOBS") == 0 ||
+ strcmp(te->desc, "BLOB COMMENTS") == 0)
+ te->section = SECTION_DATA;
+ else if (strcmp(te->desc, "CONSTRAINT") == 0 ||
+ strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "FK CONSTRAINT") == 0 ||
+ strcmp(te->desc, "INDEX") == 0 ||
+ strcmp(te->desc, "RULE") == 0 ||
+ strcmp(te->desc, "TRIGGER") == 0)
+ te->section = SECTION_POST_DATA;
+ else
+ te->section = SECTION_PRE_DATA;
+ }
+
+ te->defn = ReadStr(AH);
+ te->dropStmt = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_3)
+ te->copyStmt = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_6)
+ te->namespace = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_10)
+ te->tablespace = ReadStr(AH);
+
+ if (AH->version >= K_VERS_1_14)
+ te->tableam = ReadStr(AH);
+
+ te->owner = ReadStr(AH);
+ is_supported = true;
+ if (AH->version < K_VERS_1_9)
+ is_supported = false;
+ else
+ {
+ tmp = ReadStr(AH);
+
+ if (strcmp(tmp, "true") == 0)
+ is_supported = false;
+
+ free(tmp);
+ }
+
+ if (!is_supported)
+ pg_log_warning("restoring tables WITH OIDS is not supported anymore");
+
+ /* Read TOC entry dependencies */
+ if (AH->version >= K_VERS_1_5)
+ {
+ depSize = 100;
+ deps = (DumpId *) pg_malloc(sizeof(DumpId) * depSize);
+ depIdx = 0;
+ for (;;)
+ {
+ tmp = ReadStr(AH);
+ if (!tmp)
+ break; /* end of list */
+ if (depIdx >= depSize)
+ {
+ depSize *= 2;
+ deps = (DumpId *) pg_realloc(deps, sizeof(DumpId) * depSize);
+ }
+ sscanf(tmp, "%d", &deps[depIdx]);
+ free(tmp);
+ depIdx++;
+ }
+
+ if (depIdx > 0) /* We have a non-null entry */
+ {
+ deps = (DumpId *) pg_realloc(deps, sizeof(DumpId) * depIdx);
+ te->dependencies = deps;
+ te->nDeps = depIdx;
+ }
+ else
+ {
+ free(deps);
+ te->dependencies = NULL;
+ te->nDeps = 0;
+ }
+ }
+ else
+ {
+ te->dependencies = NULL;
+ te->nDeps = 0;
+ }
+ te->dataLength = 0;
+
+ if (AH->ReadExtraTocPtr)
+ AH->ReadExtraTocPtr(AH, te);
+
+ pg_log_debug("read TOC entry %d (ID %d) for %s %s",
+ i, te->dumpId, te->desc, te->tag);
+
+ /* link completed entry into TOC circular list */
+ te->prev = AH->toc->prev;
+ AH->toc->prev->next = te;
+ AH->toc->prev = te;
+ te->next = AH->toc;
+
+ /* special processing immediately upon read for some items */
+ if (strcmp(te->desc, "ENCODING") == 0)
+ processEncodingEntry(AH, te);
+ else if (strcmp(te->desc, "STDSTRINGS") == 0)
+ processStdStringsEntry(AH, te);
+ else if (strcmp(te->desc, "SEARCHPATH") == 0)
+ processSearchPathEntry(AH, te);
+ }
+}
+
+static void
+processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ /* te->defn should have the form SET client_encoding = 'foo'; */
+ char *defn = pg_strdup(te->defn);
+ char *ptr1;
+ char *ptr2 = NULL;
+ int encoding;
+
+ ptr1 = strchr(defn, '\'');
+ if (ptr1)
+ ptr2 = strchr(++ptr1, '\'');
+ if (ptr2)
+ {
+ *ptr2 = '\0';
+ encoding = pg_char_to_encoding(ptr1);
+ if (encoding < 0)
+ pg_fatal("unrecognized encoding \"%s\"",
+ ptr1);
+ AH->public.encoding = encoding;
+ }
+ else
+ pg_fatal("invalid ENCODING item: %s",
+ te->defn);
+
+ free(defn);
+}
+
+static void
+processStdStringsEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ /* te->defn should have the form SET standard_conforming_strings = 'x'; */
+ char *ptr1;
+
+ ptr1 = strchr(te->defn, '\'');
+ if (ptr1 && strncmp(ptr1, "'on'", 4) == 0)
+ AH->public.std_strings = true;
+ else if (ptr1 && strncmp(ptr1, "'off'", 5) == 0)
+ AH->public.std_strings = false;
+ else
+ pg_fatal("invalid STDSTRINGS item: %s",
+ te->defn);
+}
+
+static void
+processSearchPathEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ /*
+ * te->defn should contain a command to set search_path. We just copy it
+ * verbatim for use later.
+ */
+ AH->public.searchpath = pg_strdup(te->defn);
+}
+
+static void
+StrictNamesCheck(RestoreOptions *ropt)
+{
+ const char *missing_name;
+
+ Assert(ropt->strict_names);
+
+ if (ropt->schemaNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->schemaNames);
+ if (missing_name != NULL)
+ pg_fatal("schema \"%s\" not found", missing_name);
+ }
+
+ if (ropt->tableNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->tableNames);
+ if (missing_name != NULL)
+ pg_fatal("table \"%s\" not found", missing_name);
+ }
+
+ if (ropt->indexNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->indexNames);
+ if (missing_name != NULL)
+ pg_fatal("index \"%s\" not found", missing_name);
+ }
+
+ if (ropt->functionNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->functionNames);
+ if (missing_name != NULL)
+ pg_fatal("function \"%s\" not found", missing_name);
+ }
+
+ if (ropt->triggerNames.head != NULL)
+ {
+ missing_name = simple_string_list_not_touched(&ropt->triggerNames);
+ if (missing_name != NULL)
+ pg_fatal("trigger \"%s\" not found", missing_name);
+ }
+}
+
+/*
+ * Determine whether we want to restore this TOC entry.
+ *
+ * Returns 0 if entry should be skipped, or some combination of the
+ * REQ_SCHEMA and REQ_DATA bits if we want to restore schema and/or data
+ * portions of this TOC entry, or REQ_SPECIAL if it's a special entry.
+ */
+static int
+_tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
+{
+ int res = REQ_SCHEMA | REQ_DATA;
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* These items are treated specially */
+ if (strcmp(te->desc, "ENCODING") == 0 ||
+ strcmp(te->desc, "STDSTRINGS") == 0 ||
+ strcmp(te->desc, "SEARCHPATH") == 0)
+ return REQ_SPECIAL;
+
+ /*
+ * DATABASE and DATABASE PROPERTIES also have a special rule: they are
+ * restored in createDB mode, and not restored otherwise, independently of
+ * all else.
+ */
+ if (strcmp(te->desc, "DATABASE") == 0 ||
+ strcmp(te->desc, "DATABASE PROPERTIES") == 0)
+ {
+ if (ropt->createDB)
+ return REQ_SCHEMA;
+ else
+ return 0;
+ }
+
+ /*
+ * Process exclusions that affect certain classes of TOC entries.
+ */
+
+ /* If it's an ACL, maybe ignore it */
+ if (ropt->aclsSkip && _tocEntryIsACL(te))
+ return 0;
+
+ /* If it's a comment, maybe ignore it */
+ if (ropt->no_comments && strcmp(te->desc, "COMMENT") == 0)
+ return 0;
+
+ /*
+ * If it's a publication or a table part of a publication, maybe ignore
+ * it.
+ */
+ if (ropt->no_publications &&
+ (strcmp(te->desc, "PUBLICATION") == 0 ||
+ strcmp(te->desc, "PUBLICATION TABLE") == 0 ||
+ strcmp(te->desc, "PUBLICATION TABLES IN SCHEMA") == 0))
+ return 0;
+
+ /* If it's a security label, maybe ignore it */
+ if (ropt->no_security_labels && strcmp(te->desc, "SECURITY LABEL") == 0)
+ return 0;
+
+ /* If it's a subscription, maybe ignore it */
+ if (ropt->no_subscriptions && strcmp(te->desc, "SUBSCRIPTION") == 0)
+ return 0;
+
+ /* Ignore it if section is not to be dumped/restored */
+ switch (curSection)
+ {
+ case SECTION_PRE_DATA:
+ if (!(ropt->dumpSections & DUMP_PRE_DATA))
+ return 0;
+ break;
+ case SECTION_DATA:
+ if (!(ropt->dumpSections & DUMP_DATA))
+ return 0;
+ break;
+ case SECTION_POST_DATA:
+ if (!(ropt->dumpSections & DUMP_POST_DATA))
+ return 0;
+ break;
+ default:
+ /* shouldn't get here, really, but ignore it */
+ return 0;
+ }
+
+ /* Ignore it if rejected by idWanted[] (cf. SortTocFromFile) */
+ if (ropt->idWanted && !ropt->idWanted[te->dumpId - 1])
+ return 0;
+
+ /*
+ * Check options for selective dump/restore.
+ */
+ if (strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "COMMENT") == 0 ||
+ strcmp(te->desc, "SECURITY LABEL") == 0)
+ {
+ /* Database properties react to createDB, not selectivity options. */
+ if (strncmp(te->tag, "DATABASE ", 9) == 0)
+ {
+ if (!ropt->createDB)
+ return 0;
+ }
+ else if (ropt->schemaNames.head != NULL ||
+ ropt->schemaExcludeNames.head != NULL ||
+ ropt->selTypes)
+ {
+ /*
+ * In a selective dump/restore, we want to restore these dependent
+ * TOC entry types only if their parent object is being restored.
+ * Without selectivity options, we let through everything in the
+ * archive. Note there may be such entries with no parent, eg
+ * non-default ACLs for built-in objects. Also, we make
+ * per-column ACLs additionally depend on the table's ACL if any
+ * to ensure correct restore order, so those dependencies should
+ * be ignored in this check.
+ *
+ * This code depends on the parent having been marked already,
+ * which should be the case; if it isn't, perhaps due to
+ * SortTocFromFile rearrangement, skipping the dependent entry
+ * seems prudent anyway.
+ *
+ * Ideally we'd handle, eg, table CHECK constraints this way too.
+ * But it's hard to tell which of their dependencies is the one to
+ * consult.
+ */
+ bool dumpthis = false;
+
+ for (int i = 0; i < te->nDeps; i++)
+ {
+ TocEntry *pte = getTocEntryByDumpId(AH, te->dependencies[i]);
+
+ if (!pte)
+ continue; /* probably shouldn't happen */
+ if (strcmp(pte->desc, "ACL") == 0)
+ continue; /* ignore dependency on another ACL */
+ if (pte->reqs == 0)
+ continue; /* this object isn't marked, so ignore it */
+ /* Found a parent to be dumped, so we want to dump this too */
+ dumpthis = true;
+ break;
+ }
+ if (!dumpthis)
+ return 0;
+ }
+ }
+ else
+ {
+ /* Apply selective-restore rules for standalone TOC entries. */
+ if (ropt->schemaNames.head != NULL)
+ {
+ /* If no namespace is specified, it means all. */
+ if (!te->namespace)
+ return 0;
+ if (!simple_string_list_member(&ropt->schemaNames, te->namespace))
+ return 0;
+ }
+
+ if (ropt->schemaExcludeNames.head != NULL &&
+ te->namespace &&
+ simple_string_list_member(&ropt->schemaExcludeNames, te->namespace))
+ return 0;
+
+ if (ropt->selTypes)
+ {
+ if (strcmp(te->desc, "TABLE") == 0 ||
+ strcmp(te->desc, "TABLE DATA") == 0 ||
+ strcmp(te->desc, "VIEW") == 0 ||
+ strcmp(te->desc, "FOREIGN TABLE") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0 ||
+ strcmp(te->desc, "SEQUENCE") == 0 ||
+ strcmp(te->desc, "SEQUENCE SET") == 0)
+ {
+ if (!ropt->selTable)
+ return 0;
+ if (ropt->tableNames.head != NULL &&
+ !simple_string_list_member(&ropt->tableNames, te->tag))
+ return 0;
+ }
+ else if (strcmp(te->desc, "INDEX") == 0)
+ {
+ if (!ropt->selIndex)
+ return 0;
+ if (ropt->indexNames.head != NULL &&
+ !simple_string_list_member(&ropt->indexNames, te->tag))
+ return 0;
+ }
+ else if (strcmp(te->desc, "FUNCTION") == 0 ||
+ strcmp(te->desc, "AGGREGATE") == 0 ||
+ strcmp(te->desc, "PROCEDURE") == 0)
+ {
+ if (!ropt->selFunction)
+ return 0;
+ if (ropt->functionNames.head != NULL &&
+ !simple_string_list_member(&ropt->functionNames, te->tag))
+ return 0;
+ }
+ else if (strcmp(te->desc, "TRIGGER") == 0)
+ {
+ if (!ropt->selTrigger)
+ return 0;
+ if (ropt->triggerNames.head != NULL &&
+ !simple_string_list_member(&ropt->triggerNames, te->tag))
+ return 0;
+ }
+ else
+ return 0;
+ }
+ }
+
+ /*
+ * Determine whether the TOC entry contains schema and/or data components,
+ * and mask off inapplicable REQ bits. If it had a dataDumper, assume
+ * it's both schema and data. Otherwise it's probably schema-only, but
+ * there are exceptions.
+ */
+ if (!te->hadDumper)
+ {
+ /*
+ * Special Case: If 'SEQUENCE SET' or anything to do with LOs, then it
+ * is considered a data entry. We don't need to check for the BLOBS
+ * entry or old-style BLOB COMMENTS, because they will have hadDumper
+ * = true ... but we do need to check new-style BLOB ACLs, comments,
+ * etc.
+ */
+ if (strcmp(te->desc, "SEQUENCE SET") == 0 ||
+ strcmp(te->desc, "BLOB") == 0 ||
+ (strcmp(te->desc, "ACL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "COMMENT") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "SECURITY LABEL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0))
+ res = res & REQ_DATA;
+ else
+ res = res & ~REQ_DATA;
+ }
+
+ /*
+ * If there's no definition command, there's no schema component. Treat
+ * "load via partition root" comments as not schema.
+ */
+ if (!te->defn || !te->defn[0] ||
+ strncmp(te->defn, "-- load via partition root ", 27) == 0)
+ res = res & ~REQ_SCHEMA;
+
+ /*
+ * Special case: <Init> type with <Max OID> tag; this is obsolete and we
+ * always ignore it.
+ */
+ if ((strcmp(te->desc, "<Init>") == 0) && (strcmp(te->tag, "Max OID") == 0))
+ return 0;
+
+ /* Mask it if we only want schema */
+ if (ropt->schemaOnly)
+ {
+ /*
+ * The sequence_data option overrides schemaOnly for SEQUENCE SET.
+ *
+ * In binary-upgrade mode, even with schemaOnly set, we do not mask
+ * out large objects. (Only large object definitions, comments and
+ * other metadata should be generated in binary-upgrade mode, not the
+ * actual data, but that need not concern us here.)
+ */
+ if (!(ropt->sequence_data && strcmp(te->desc, "SEQUENCE SET") == 0) &&
+ !(ropt->binary_upgrade &&
+ (strcmp(te->desc, "BLOB") == 0 ||
+ (strcmp(te->desc, "ACL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "COMMENT") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0) ||
+ (strcmp(te->desc, "SECURITY LABEL") == 0 &&
+ strncmp(te->tag, "LARGE OBJECT ", 13) == 0))))
+ res = res & REQ_SCHEMA;
+ }
+
+ /* Mask it if we only want data */
+ if (ropt->dataOnly)
+ res = res & REQ_DATA;
+
+ return res;
+}
+
+/*
+ * Identify which pass we should restore this TOC entry in.
+ *
+ * See notes with the RestorePass typedef in pg_backup_archiver.h.
+ */
+static RestorePass
+_tocEntryRestorePass(TocEntry *te)
+{
+ /* "ACL LANGUAGE" was a crock emitted only in PG 7.4 */
+ if (strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "ACL LANGUAGE") == 0 ||
+ strcmp(te->desc, "DEFAULT ACL") == 0)
+ return RESTORE_PASS_ACL;
+ if (strcmp(te->desc, "EVENT TRIGGER") == 0 ||
+ strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0)
+ return RESTORE_PASS_POST_ACL;
+
+ /*
+ * Comments need to be emitted in the same pass as their parent objects.
+ * ACLs haven't got comments, and neither do matview data objects, but
+ * event triggers do. (Fortunately, event triggers haven't got ACLs, or
+ * we'd need yet another weird special case.)
+ */
+ if (strcmp(te->desc, "COMMENT") == 0 &&
+ strncmp(te->tag, "EVENT TRIGGER ", 14) == 0)
+ return RESTORE_PASS_POST_ACL;
+
+ /* All else can be handled in the main pass. */
+ return RESTORE_PASS_MAIN;
+}
+
+/*
+ * Identify TOC entries that are ACLs.
+ *
+ * Note: it seems worth duplicating some code here to avoid a hard-wired
+ * assumption that these are exactly the same entries that we restore during
+ * the RESTORE_PASS_ACL phase.
+ */
+static bool
+_tocEntryIsACL(TocEntry *te)
+{
+ /* "ACL LANGUAGE" was a crock emitted only in PG 7.4 */
+ if (strcmp(te->desc, "ACL") == 0 ||
+ strcmp(te->desc, "ACL LANGUAGE") == 0 ||
+ strcmp(te->desc, "DEFAULT ACL") == 0)
+ return true;
+ return false;
+}
+
+/*
+ * Issue SET commands for parameters that we want to have set the same way
+ * at all times during execution of a restore script.
+ */
+static void
+_doSetFixedOutputState(ArchiveHandle *AH)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /*
+ * Disable timeouts to allow for slow commands, idle parallel workers, etc
+ */
+ ahprintf(AH, "SET statement_timeout = 0;\n");
+ ahprintf(AH, "SET lock_timeout = 0;\n");
+ ahprintf(AH, "SET idle_in_transaction_session_timeout = 0;\n");
+
+ /* Select the correct character set encoding */
+ ahprintf(AH, "SET client_encoding = '%s';\n",
+ pg_encoding_to_char(AH->public.encoding));
+
+ /* Select the correct string literal syntax */
+ ahprintf(AH, "SET standard_conforming_strings = %s;\n",
+ AH->public.std_strings ? "on" : "off");
+
+ /* Select the role to be used during restore */
+ if (ropt && ropt->use_role)
+ ahprintf(AH, "SET ROLE %s;\n", fmtId(ropt->use_role));
+
+ /* Select the dump-time search_path */
+ if (AH->public.searchpath)
+ ahprintf(AH, "%s", AH->public.searchpath);
+
+ /* Make sure function checking is disabled */
+ ahprintf(AH, "SET check_function_bodies = false;\n");
+
+ /* Ensure that all valid XML data will be accepted */
+ ahprintf(AH, "SET xmloption = content;\n");
+
+ /* Avoid annoying notices etc */
+ ahprintf(AH, "SET client_min_messages = warning;\n");
+ if (!AH->public.std_strings)
+ ahprintf(AH, "SET escape_string_warning = off;\n");
+
+ /* Adjust row-security state */
+ if (ropt && ropt->enable_row_security)
+ ahprintf(AH, "SET row_security = on;\n");
+ else
+ ahprintf(AH, "SET row_security = off;\n");
+
+ ahprintf(AH, "\n");
+}
+
+/*
+ * Issue a SET SESSION AUTHORIZATION command. Caller is responsible
+ * for updating state if appropriate. If user is NULL or an empty string,
+ * the specification DEFAULT will be used.
+ */
+static void
+_doSetSessionAuth(ArchiveHandle *AH, const char *user)
+{
+ PQExpBuffer cmd = createPQExpBuffer();
+
+ appendPQExpBufferStr(cmd, "SET SESSION AUTHORIZATION ");
+
+ /*
+ * SQL requires a string literal here. Might as well be correct.
+ */
+ if (user && *user)
+ appendStringLiteralAHX(cmd, user, AH);
+ else
+ appendPQExpBufferStr(cmd, "DEFAULT");
+ appendPQExpBufferChar(cmd, ';');
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, cmd->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ /* NOT warn_or_exit_horribly... use -O instead to skip this. */
+ pg_fatal("could not set session user to \"%s\": %s",
+ user, PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s\n\n", cmd->data);
+
+ destroyPQExpBuffer(cmd);
+}
+
+
+/*
+ * Issue the commands to connect to the specified database.
+ *
+ * If we're currently restoring right into a database, this will
+ * actually establish a connection. Otherwise it puts a \connect into
+ * the script output.
+ */
+static void
+_reconnectToDB(ArchiveHandle *AH, const char *dbname)
+{
+ if (RestoringToDB(AH))
+ ReconnectToServer(AH, dbname);
+ else
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, dbname);
+ ahprintf(AH, "%s\n", connectbuf.data);
+ termPQExpBuffer(&connectbuf);
+ }
+
+ /*
+ * NOTE: currUser keeps track of what the imaginary session user in our
+ * script is. It's now effectively reset to the original userID.
+ */
+ free(AH->currUser);
+ AH->currUser = NULL;
+
+ /* don't assume we still know the output schema, tablespace, etc either */
+ free(AH->currSchema);
+ AH->currSchema = NULL;
+
+ free(AH->currTableAm);
+ AH->currTableAm = NULL;
+
+ free(AH->currTablespace);
+ AH->currTablespace = NULL;
+
+ /* re-establish fixed state */
+ _doSetFixedOutputState(AH);
+}
+
+/*
+ * Become the specified user, and update state to avoid redundant commands
+ *
+ * NULL or empty argument is taken to mean restoring the session default
+ */
+static void
+_becomeUser(ArchiveHandle *AH, const char *user)
+{
+ if (!user)
+ user = ""; /* avoid null pointers */
+
+ if (AH->currUser && strcmp(AH->currUser, user) == 0)
+ return; /* no need to do anything */
+
+ _doSetSessionAuth(AH, user);
+
+ /*
+ * NOTE: currUser keeps track of what the imaginary session user in our
+ * script is
+ */
+ free(AH->currUser);
+ AH->currUser = pg_strdup(user);
+}
+
+/*
+ * Become the owner of the given TOC entry object. If
+ * changes in ownership are not allowed, this doesn't do anything.
+ */
+static void
+_becomeOwner(ArchiveHandle *AH, TocEntry *te)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ if (ropt && (ropt->noOwner || !ropt->use_setsessauth))
+ return;
+
+ _becomeUser(AH, te->owner);
+}
+
+
+/*
+ * Issue the commands to select the specified schema as the current schema
+ * in the target database.
+ */
+static void
+_selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
+{
+ PQExpBuffer qry;
+
+ /*
+ * If there was a SEARCHPATH TOC entry, we're supposed to just stay with
+ * that search_path rather than switching to entry-specific paths.
+ * Otherwise, it's an old archive that will not restore correctly unless
+ * we set the search_path as it's expecting.
+ */
+ if (AH->public.searchpath)
+ return;
+
+ if (!schemaName || *schemaName == '\0' ||
+ (AH->currSchema && strcmp(AH->currSchema, schemaName) == 0))
+ return; /* no need to do anything */
+
+ qry = createPQExpBuffer();
+
+ appendPQExpBuffer(qry, "SET search_path = %s",
+ fmtId(schemaName));
+ if (strcmp(schemaName, "pg_catalog") != 0)
+ appendPQExpBufferStr(qry, ", pg_catalog");
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, qry->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH,
+ "could not set search_path to \"%s\": %s",
+ schemaName, PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s;\n\n", qry->data);
+
+ free(AH->currSchema);
+ AH->currSchema = pg_strdup(schemaName);
+
+ destroyPQExpBuffer(qry);
+}
+
+/*
+ * Issue the commands to select the specified tablespace as the current one
+ * in the target database.
+ */
+static void
+_selectTablespace(ArchiveHandle *AH, const char *tablespace)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ PQExpBuffer qry;
+ const char *want,
+ *have;
+
+ /* do nothing in --no-tablespaces mode */
+ if (ropt->noTablespace)
+ return;
+
+ have = AH->currTablespace;
+ want = tablespace;
+
+ /* no need to do anything for non-tablespace object */
+ if (!want)
+ return;
+
+ if (have && strcmp(want, have) == 0)
+ return; /* no need to do anything */
+
+ qry = createPQExpBuffer();
+
+ if (strcmp(want, "") == 0)
+ {
+ /* We want the tablespace to be the database's default */
+ appendPQExpBufferStr(qry, "SET default_tablespace = ''");
+ }
+ else
+ {
+ /* We want an explicit tablespace */
+ appendPQExpBuffer(qry, "SET default_tablespace = %s", fmtId(want));
+ }
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, qry->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH,
+ "could not set default_tablespace to %s: %s",
+ fmtId(want), PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s;\n\n", qry->data);
+
+ free(AH->currTablespace);
+ AH->currTablespace = pg_strdup(want);
+
+ destroyPQExpBuffer(qry);
+}
+
+/*
+ * Set the proper default_table_access_method value for the table.
+ */
+static void
+_selectTableAccessMethod(ArchiveHandle *AH, const char *tableam)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ PQExpBuffer cmd;
+ const char *want,
+ *have;
+
+ /* do nothing in --no-table-access-method mode */
+ if (ropt->noTableAm)
+ return;
+
+ have = AH->currTableAm;
+ want = tableam;
+
+ if (!want)
+ return;
+
+ if (have && strcmp(want, have) == 0)
+ return;
+
+ cmd = createPQExpBuffer();
+ appendPQExpBuffer(cmd, "SET default_table_access_method = %s;", fmtId(want));
+
+ if (RestoringToDB(AH))
+ {
+ PGresult *res;
+
+ res = PQexec(AH->connection, cmd->data);
+
+ if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH,
+ "could not set default_table_access_method: %s",
+ PQerrorMessage(AH->connection));
+
+ PQclear(res);
+ }
+ else
+ ahprintf(AH, "%s\n\n", cmd->data);
+
+ destroyPQExpBuffer(cmd);
+
+ free(AH->currTableAm);
+ AH->currTableAm = pg_strdup(want);
+}
+
+/*
+ * Extract an object description for a TOC entry, and append it to buf.
+ *
+ * This is used for ALTER ... OWNER TO.
+ *
+ * If the object type has no owner, do nothing.
+ */
+static void
+_getObjectDescription(PQExpBuffer buf, const TocEntry *te)
+{
+ const char *type = te->desc;
+
+ /* objects that don't require special decoration */
+ if (strcmp(type, "COLLATION") == 0 ||
+ strcmp(type, "CONVERSION") == 0 ||
+ strcmp(type, "DOMAIN") == 0 ||
+ strcmp(type, "FOREIGN TABLE") == 0 ||
+ strcmp(type, "MATERIALIZED VIEW") == 0 ||
+ strcmp(type, "SEQUENCE") == 0 ||
+ strcmp(type, "STATISTICS") == 0 ||
+ strcmp(type, "TABLE") == 0 ||
+ strcmp(type, "TEXT SEARCH DICTIONARY") == 0 ||
+ strcmp(type, "TEXT SEARCH CONFIGURATION") == 0 ||
+ strcmp(type, "TYPE") == 0 ||
+ strcmp(type, "VIEW") == 0 ||
+ /* non-schema-specified objects */
+ strcmp(type, "DATABASE") == 0 ||
+ strcmp(type, "PROCEDURAL LANGUAGE") == 0 ||
+ strcmp(type, "SCHEMA") == 0 ||
+ strcmp(type, "EVENT TRIGGER") == 0 ||
+ strcmp(type, "FOREIGN DATA WRAPPER") == 0 ||
+ strcmp(type, "SERVER") == 0 ||
+ strcmp(type, "PUBLICATION") == 0 ||
+ strcmp(type, "SUBSCRIPTION") == 0)
+ {
+ appendPQExpBuffer(buf, "%s ", type);
+ if (te->namespace && *te->namespace)
+ appendPQExpBuffer(buf, "%s.", fmtId(te->namespace));
+ appendPQExpBufferStr(buf, fmtId(te->tag));
+ }
+ /* LOs just have a name, but it's numeric so must not use fmtId */
+ else if (strcmp(type, "BLOB") == 0)
+ {
+ appendPQExpBuffer(buf, "LARGE OBJECT %s", te->tag);
+ }
+
+ /*
+ * These object types require additional decoration. Fortunately, the
+ * information needed is exactly what's in the DROP command.
+ */
+ else if (strcmp(type, "AGGREGATE") == 0 ||
+ strcmp(type, "FUNCTION") == 0 ||
+ strcmp(type, "OPERATOR") == 0 ||
+ strcmp(type, "OPERATOR CLASS") == 0 ||
+ strcmp(type, "OPERATOR FAMILY") == 0 ||
+ strcmp(type, "PROCEDURE") == 0)
+ {
+ /* Chop "DROP " off the front and make a modifiable copy */
+ char *first = pg_strdup(te->dropStmt + 5);
+ char *last;
+
+ /* point to last character in string */
+ last = first + strlen(first) - 1;
+
+ /* Strip off any ';' or '\n' at the end */
+ while (last >= first && (*last == '\n' || *last == ';'))
+ last--;
+ *(last + 1) = '\0';
+
+ appendPQExpBufferStr(buf, first);
+
+ free(first);
+ return;
+ }
+ /* these object types don't have separate owners */
+ else if (strcmp(type, "CAST") == 0 ||
+ strcmp(type, "CHECK CONSTRAINT") == 0 ||
+ strcmp(type, "CONSTRAINT") == 0 ||
+ strcmp(type, "DATABASE PROPERTIES") == 0 ||
+ strcmp(type, "DEFAULT") == 0 ||
+ strcmp(type, "FK CONSTRAINT") == 0 ||
+ strcmp(type, "INDEX") == 0 ||
+ strcmp(type, "RULE") == 0 ||
+ strcmp(type, "TRIGGER") == 0 ||
+ strcmp(type, "ROW SECURITY") == 0 ||
+ strcmp(type, "POLICY") == 0 ||
+ strcmp(type, "USER MAPPING") == 0)
+ {
+ /* do nothing */
+ }
+ else
+ pg_fatal("don't know how to set owner for object type \"%s\"", type);
+}
+
+/*
+ * Emit the SQL commands to create the object represented by a TOC entry
+ *
+ * This now also includes issuing an ALTER OWNER command to restore the
+ * object's ownership, if wanted. But note that the object's permissions
+ * will remain at default, until the matching ACL TOC entry is restored.
+ */
+static void
+_printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /* Select owner, schema, tablespace and default AM as necessary */
+ _becomeOwner(AH, te);
+ _selectOutputSchema(AH, te->namespace);
+ _selectTablespace(AH, te->tablespace);
+ _selectTableAccessMethod(AH, te->tableam);
+
+ /* Emit header comment for item */
+ if (!AH->noTocComments)
+ {
+ const char *pfx;
+ char *sanitized_name;
+ char *sanitized_schema;
+ char *sanitized_owner;
+
+ if (isData)
+ pfx = "Data for ";
+ else
+ pfx = "";
+
+ ahprintf(AH, "--\n");
+ if (AH->public.verbose)
+ {
+ ahprintf(AH, "-- TOC entry %d (class %u OID %u)\n",
+ te->dumpId, te->catalogId.tableoid, te->catalogId.oid);
+ if (te->nDeps > 0)
+ {
+ int i;
+
+ ahprintf(AH, "-- Dependencies:");
+ for (i = 0; i < te->nDeps; i++)
+ ahprintf(AH, " %d", te->dependencies[i]);
+ ahprintf(AH, "\n");
+ }
+ }
+
+ sanitized_name = sanitize_line(te->tag, false);
+ sanitized_schema = sanitize_line(te->namespace, true);
+ sanitized_owner = sanitize_line(ropt->noOwner ? NULL : te->owner, true);
+
+ ahprintf(AH, "-- %sName: %s; Type: %s; Schema: %s; Owner: %s",
+ pfx, sanitized_name, te->desc, sanitized_schema,
+ sanitized_owner);
+
+ free(sanitized_name);
+ free(sanitized_schema);
+ free(sanitized_owner);
+
+ if (te->tablespace && strlen(te->tablespace) > 0 && !ropt->noTablespace)
+ {
+ char *sanitized_tablespace;
+
+ sanitized_tablespace = sanitize_line(te->tablespace, false);
+ ahprintf(AH, "; Tablespace: %s", sanitized_tablespace);
+ free(sanitized_tablespace);
+ }
+ ahprintf(AH, "\n");
+
+ if (AH->PrintExtraTocPtr != NULL)
+ AH->PrintExtraTocPtr(AH, te);
+ ahprintf(AH, "--\n\n");
+ }
+
+ /*
+ * Actually print the definition.
+ *
+ * Really crude hack for suppressing AUTHORIZATION clause that old pg_dump
+ * versions put into CREATE SCHEMA. Don't mutate the variant for schema
+ * "public" that is a comment. We have to do this when --no-owner mode is
+ * selected. This is ugly, but I see no other good way ...
+ */
+ if (ropt->noOwner &&
+ strcmp(te->desc, "SCHEMA") == 0 && strncmp(te->defn, "--", 2) != 0)
+ {
+ ahprintf(AH, "CREATE SCHEMA %s;\n\n\n", fmtId(te->tag));
+ }
+ else
+ {
+ if (te->defn && strlen(te->defn) > 0)
+ ahprintf(AH, "%s\n\n", te->defn);
+ }
+
+ /*
+ * If we aren't using SET SESSION AUTH to determine ownership, we must
+ * instead issue an ALTER OWNER command. Schema "public" is special; when
+ * a dump emits a comment in lieu of creating it, we use ALTER OWNER even
+ * when using SET SESSION for all other objects. We assume that anything
+ * without a DROP command is not a separately ownable object.
+ */
+ if (!ropt->noOwner &&
+ (!ropt->use_setsessauth ||
+ (strcmp(te->desc, "SCHEMA") == 0 &&
+ strncmp(te->defn, "--", 2) == 0)) &&
+ te->owner && strlen(te->owner) > 0 &&
+ te->dropStmt && strlen(te->dropStmt) > 0)
+ {
+ PQExpBufferData temp;
+
+ initPQExpBuffer(&temp);
+ _getObjectDescription(&temp, te);
+
+ /*
+ * If _getObjectDescription() didn't fill the buffer, then there is no
+ * owner.
+ */
+ if (temp.data[0])
+ ahprintf(AH, "ALTER %s OWNER TO %s;\n\n", temp.data, fmtId(te->owner));
+ termPQExpBuffer(&temp);
+ }
+
+ /*
+ * If it's an ACL entry, it might contain SET SESSION AUTHORIZATION
+ * commands, so we can no longer assume we know the current auth setting.
+ */
+ if (_tocEntryIsACL(te))
+ {
+ free(AH->currUser);
+ AH->currUser = NULL;
+ }
+}
+
+/*
+ * Sanitize a string to be included in an SQL comment or TOC listing, by
+ * replacing any newlines with spaces. This ensures each logical output line
+ * is in fact one physical output line, to prevent corruption of the dump
+ * (which could, in the worst case, present an SQL injection vulnerability
+ * if someone were to incautiously load a dump containing objects with
+ * maliciously crafted names).
+ *
+ * The result is a freshly malloc'd string. If the input string is NULL,
+ * return a malloc'ed empty string, unless want_hyphen, in which case return a
+ * malloc'ed hyphen.
+ *
+ * Note that we currently don't bother to quote names, meaning that the name
+ * fields aren't automatically parseable. "pg_restore -L" doesn't care because
+ * it only examines the dumpId field, but someday we might want to try harder.
+ */
+static char *
+sanitize_line(const char *str, bool want_hyphen)
+{
+ char *result;
+ char *s;
+
+ if (!str)
+ return pg_strdup(want_hyphen ? "-" : "");
+
+ result = pg_strdup(str);
+
+ for (s = result; *s != '\0'; s++)
+ {
+ if (*s == '\n' || *s == '\r')
+ *s = ' ';
+ }
+
+ return result;
+}
+
+/*
+ * Write the file header for a custom-format archive
+ */
+void
+WriteHead(ArchiveHandle *AH)
+{
+ struct tm crtm;
+
+ AH->WriteBufPtr(AH, "PGDMP", 5); /* Magic code */
+ AH->WriteBytePtr(AH, ARCHIVE_MAJOR(AH->version));
+ AH->WriteBytePtr(AH, ARCHIVE_MINOR(AH->version));
+ AH->WriteBytePtr(AH, ARCHIVE_REV(AH->version));
+ AH->WriteBytePtr(AH, AH->intSize);
+ AH->WriteBytePtr(AH, AH->offSize);
+ AH->WriteBytePtr(AH, AH->format);
+ AH->WriteBytePtr(AH, AH->compression_spec.algorithm);
+ crtm = *localtime(&AH->createDate);
+ WriteInt(AH, crtm.tm_sec);
+ WriteInt(AH, crtm.tm_min);
+ WriteInt(AH, crtm.tm_hour);
+ WriteInt(AH, crtm.tm_mday);
+ WriteInt(AH, crtm.tm_mon);
+ WriteInt(AH, crtm.tm_year);
+ WriteInt(AH, crtm.tm_isdst);
+ WriteStr(AH, PQdb(AH->connection));
+ WriteStr(AH, AH->public.remoteVersionStr);
+ WriteStr(AH, PG_VERSION);
+}
+
+void
+ReadHead(ArchiveHandle *AH)
+{
+ char *errmsg;
+ char vmaj,
+ vmin,
+ vrev;
+ int fmt;
+
+ /*
+ * If we haven't already read the header, do so.
+ *
+ * NB: this code must agree with _discoverArchiveFormat(). Maybe find a
+ * way to unify the cases?
+ */
+ if (!AH->readHeader)
+ {
+ char tmpMag[7];
+
+ AH->ReadBufPtr(AH, tmpMag, 5);
+
+ if (strncmp(tmpMag, "PGDMP", 5) != 0)
+ pg_fatal("did not find magic string in file header");
+ }
+
+ vmaj = AH->ReadBytePtr(AH);
+ vmin = AH->ReadBytePtr(AH);
+
+ if (vmaj > 1 || (vmaj == 1 && vmin > 0)) /* Version > 1.0 */
+ vrev = AH->ReadBytePtr(AH);
+ else
+ vrev = 0;
+
+ AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev);
+
+ if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX)
+ pg_fatal("unsupported version (%d.%d) in file header",
+ vmaj, vmin);
+
+ AH->intSize = AH->ReadBytePtr(AH);
+ if (AH->intSize > 32)
+ pg_fatal("sanity check on integer size (%lu) failed",
+ (unsigned long) AH->intSize);
+
+ if (AH->intSize > sizeof(int))
+ pg_log_warning("archive was made on a machine with larger integers, some operations might fail");
+
+ if (AH->version >= K_VERS_1_7)
+ AH->offSize = AH->ReadBytePtr(AH);
+ else
+ AH->offSize = AH->intSize;
+
+ fmt = AH->ReadBytePtr(AH);
+
+ if (AH->format != fmt)
+ pg_fatal("expected format (%d) differs from format found in file (%d)",
+ AH->format, fmt);
+
+ if (AH->version >= K_VERS_1_15)
+ AH->compression_spec.algorithm = AH->ReadBytePtr(AH);
+ else if (AH->version >= K_VERS_1_2)
+ {
+ /* Guess the compression method based on the level */
+ if (AH->version < K_VERS_1_4)
+ AH->compression_spec.level = AH->ReadBytePtr(AH);
+ else
+ AH->compression_spec.level = ReadInt(AH);
+
+ if (AH->compression_spec.level != 0)
+ AH->compression_spec.algorithm = PG_COMPRESSION_GZIP;
+ }
+ else
+ AH->compression_spec.algorithm = PG_COMPRESSION_GZIP;
+
+ errmsg = supports_compression(AH->compression_spec);
+ if (errmsg)
+ {
+ pg_log_warning("archive is compressed, but this installation does not support compression (%s) -- no data will be available",
+ errmsg);
+ pg_free(errmsg);
+ }
+
+ if (AH->version >= K_VERS_1_4)
+ {
+ struct tm crtm;
+
+ crtm.tm_sec = ReadInt(AH);
+ crtm.tm_min = ReadInt(AH);
+ crtm.tm_hour = ReadInt(AH);
+ crtm.tm_mday = ReadInt(AH);
+ crtm.tm_mon = ReadInt(AH);
+ crtm.tm_year = ReadInt(AH);
+ crtm.tm_isdst = ReadInt(AH);
+
+ /*
+ * Newer versions of glibc have mktime() report failure if tm_isdst is
+ * inconsistent with the prevailing timezone, e.g. tm_isdst = 1 when
+ * TZ=UTC. This is problematic when restoring an archive under a
+ * different timezone setting. If we get a failure, try again with
+ * tm_isdst set to -1 ("don't know").
+ *
+ * XXX with or without this hack, we reconstruct createDate
+ * incorrectly when the prevailing timezone is different from
+ * pg_dump's. Next time we bump the archive version, we should flush
+ * this representation and store a plain seconds-since-the-Epoch
+ * timestamp instead.
+ */
+ AH->createDate = mktime(&crtm);
+ if (AH->createDate == (time_t) -1)
+ {
+ crtm.tm_isdst = -1;
+ AH->createDate = mktime(&crtm);
+ if (AH->createDate == (time_t) -1)
+ pg_log_warning("invalid creation date in header");
+ }
+ }
+
+ if (AH->version >= K_VERS_1_4)
+ {
+ AH->archdbname = ReadStr(AH);
+ }
+
+ if (AH->version >= K_VERS_1_10)
+ {
+ AH->archiveRemoteVersion = ReadStr(AH);
+ AH->archiveDumpVersion = ReadStr(AH);
+ }
+}
+
+
+/*
+ * checkSeek
+ * check to see if ftell/fseek can be performed.
+ */
+bool
+checkSeek(FILE *fp)
+{
+ pgoff_t tpos;
+
+ /* Check that ftello works on this file */
+ tpos = ftello(fp);
+ if (tpos < 0)
+ return false;
+
+ /*
+ * Check that fseeko(SEEK_SET) works, too. NB: we used to try to test
+ * this with fseeko(fp, 0, SEEK_CUR). But some platforms treat that as a
+ * successful no-op even on files that are otherwise unseekable.
+ */
+ if (fseeko(fp, tpos, SEEK_SET) != 0)
+ return false;
+
+ return true;
+}
+
+
+/*
+ * dumpTimestamp
+ */
+static void
+dumpTimestamp(ArchiveHandle *AH, const char *msg, time_t tim)
+{
+ char buf[64];
+
+ if (strftime(buf, sizeof(buf), PGDUMP_STRFTIME_FMT, localtime(&tim)) != 0)
+ ahprintf(AH, "-- %s %s\n\n", msg, buf);
+}
+
+/*
+ * Main engine for parallel restore.
+ *
+ * Parallel restore is done in three phases. In this first phase,
+ * we'll process all SECTION_PRE_DATA TOC entries that are allowed to be
+ * processed in the RESTORE_PASS_MAIN pass. (In practice, that's all
+ * PRE_DATA items other than ACLs.) Entries we can't process now are
+ * added to the pending_list for later phases to deal with.
+ */
+static void
+restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list)
+{
+ bool skipped_some;
+ TocEntry *next_work_item;
+
+ pg_log_debug("entering restore_toc_entries_prefork");
+
+ /* Adjust dependency information */
+ fix_dependencies(AH);
+
+ /*
+ * Do all the early stuff in a single connection in the parent. There's no
+ * great point in running it in parallel, in fact it will actually run
+ * faster in a single connection because we avoid all the connection and
+ * setup overhead. Also, pre-9.2 pg_dump versions were not very good
+ * about showing all the dependencies of SECTION_PRE_DATA items, so we do
+ * not risk trying to process them out-of-order.
+ *
+ * Stuff that we can't do immediately gets added to the pending_list.
+ * Note: we don't yet filter out entries that aren't going to be restored.
+ * They might participate in dependency chains connecting entries that
+ * should be restored, so we treat them as live until we actually process
+ * them.
+ *
+ * Note: as of 9.2, it should be guaranteed that all PRE_DATA items appear
+ * before DATA items, and all DATA items before POST_DATA items. That is
+ * not certain to be true in older archives, though, and in any case use
+ * of a list file would destroy that ordering (cf. SortTocFromFile). So
+ * this loop cannot assume that it holds.
+ */
+ AH->restorePass = RESTORE_PASS_MAIN;
+ skipped_some = false;
+ for (next_work_item = AH->toc->next; next_work_item != AH->toc; next_work_item = next_work_item->next)
+ {
+ bool do_now = true;
+
+ if (next_work_item->section != SECTION_PRE_DATA)
+ {
+ /* DATA and POST_DATA items are just ignored for now */
+ if (next_work_item->section == SECTION_DATA ||
+ next_work_item->section == SECTION_POST_DATA)
+ {
+ do_now = false;
+ skipped_some = true;
+ }
+ else
+ {
+ /*
+ * SECTION_NONE items, such as comments, can be processed now
+ * if we are still in the PRE_DATA part of the archive. Once
+ * we've skipped any items, we have to consider whether the
+ * comment's dependencies are satisfied, so skip it for now.
+ */
+ if (skipped_some)
+ do_now = false;
+ }
+ }
+
+ /*
+ * Also skip items that need to be forced into later passes. We need
+ * not set skipped_some in this case, since by assumption no main-pass
+ * items could depend on these.
+ */
+ if (_tocEntryRestorePass(next_work_item) != RESTORE_PASS_MAIN)
+ do_now = false;
+
+ if (do_now)
+ {
+ /* OK, restore the item and update its dependencies */
+ pg_log_info("processing item %d %s %s",
+ next_work_item->dumpId,
+ next_work_item->desc, next_work_item->tag);
+
+ (void) restore_toc_entry(AH, next_work_item, false);
+
+ /* Reduce dependencies, but don't move anything to ready_list */
+ reduce_dependencies(AH, next_work_item, NULL);
+ }
+ else
+ {
+ /* Nope, so add it to pending_list */
+ pending_list_append(pending_list, next_work_item);
+ }
+ }
+
+ /*
+ * Now close parent connection in prep for parallel steps. We do this
+ * mainly to ensure that we don't exceed the specified number of parallel
+ * connections.
+ */
+ DisconnectDatabase(&AH->public);
+
+ /* blow away any transient state from the old connection */
+ free(AH->currUser);
+ AH->currUser = NULL;
+ free(AH->currSchema);
+ AH->currSchema = NULL;
+ free(AH->currTablespace);
+ AH->currTablespace = NULL;
+ free(AH->currTableAm);
+ AH->currTableAm = NULL;
+}
+
+/*
+ * Main engine for parallel restore.
+ *
+ * Parallel restore is done in three phases. In this second phase,
+ * we process entries by dispatching them to parallel worker children
+ * (processes on Unix, threads on Windows), each of which connects
+ * separately to the database. Inter-entry dependencies are respected,
+ * and so is the RestorePass multi-pass structure. When we can no longer
+ * make any entries ready to process, we exit. Normally, there will be
+ * nothing left to do; but if there is, the third phase will mop up.
+ */
+static void
+restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
+ TocEntry *pending_list)
+{
+ ParallelReadyList ready_list;
+ TocEntry *next_work_item;
+
+ pg_log_debug("entering restore_toc_entries_parallel");
+
+ /* Set up ready_list with enough room for all known TocEntrys */
+ ready_list_init(&ready_list, AH->tocCount);
+
+ /*
+ * The pending_list contains all items that we need to restore. Move all
+ * items that are available to process immediately into the ready_list.
+ * After this setup, the pending list is everything that needs to be done
+ * but is blocked by one or more dependencies, while the ready list
+ * contains items that have no remaining dependencies and are OK to
+ * process in the current restore pass.
+ */
+ AH->restorePass = RESTORE_PASS_MAIN;
+ move_to_ready_list(pending_list, &ready_list, AH->restorePass);
+
+ /*
+ * main parent loop
+ *
+ * Keep going until there is no worker still running AND there is no work
+ * left to be done. Note invariant: at top of loop, there should always
+ * be at least one worker available to dispatch a job to.
+ */
+ pg_log_info("entering main parallel loop");
+
+ for (;;)
+ {
+ /* Look for an item ready to be dispatched to a worker */
+ next_work_item = pop_next_work_item(&ready_list, pstate);
+ if (next_work_item != NULL)
+ {
+ /* If not to be restored, don't waste time launching a worker */
+ if ((next_work_item->reqs & (REQ_SCHEMA | REQ_DATA)) == 0)
+ {
+ pg_log_info("skipping item %d %s %s",
+ next_work_item->dumpId,
+ next_work_item->desc, next_work_item->tag);
+ /* Update its dependencies as though we'd completed it */
+ reduce_dependencies(AH, next_work_item, &ready_list);
+ /* Loop around to see if anything else can be dispatched */
+ continue;
+ }
+
+ pg_log_info("launching item %d %s %s",
+ next_work_item->dumpId,
+ next_work_item->desc, next_work_item->tag);
+
+ /* Dispatch to some worker */
+ DispatchJobForTocEntry(AH, pstate, next_work_item, ACT_RESTORE,
+ mark_restore_job_done, &ready_list);
+ }
+ else if (IsEveryWorkerIdle(pstate))
+ {
+ /*
+ * Nothing is ready and no worker is running, so we're done with
+ * the current pass or maybe with the whole process.
+ */
+ if (AH->restorePass == RESTORE_PASS_LAST)
+ break; /* No more parallel processing is possible */
+
+ /* Advance to next restore pass */
+ AH->restorePass++;
+ /* That probably allows some stuff to be made ready */
+ move_to_ready_list(pending_list, &ready_list, AH->restorePass);
+ /* Loop around to see if anything's now ready */
+ continue;
+ }
+ else
+ {
+ /*
+ * We have nothing ready, but at least one child is working, so
+ * wait for some subjob to finish.
+ */
+ }
+
+ /*
+ * Before dispatching another job, check to see if anything has
+ * finished. We should check every time through the loop so as to
+ * reduce dependencies as soon as possible. If we were unable to
+ * dispatch any job this time through, wait until some worker finishes
+ * (and, hopefully, unblocks some pending item). If we did dispatch
+ * something, continue as soon as there's at least one idle worker.
+ * Note that in either case, there's guaranteed to be at least one
+ * idle worker when we return to the top of the loop. This ensures we
+ * won't block inside DispatchJobForTocEntry, which would be
+ * undesirable: we'd rather postpone dispatching until we see what's
+ * been unblocked by finished jobs.
+ */
+ WaitForWorkers(AH, pstate,
+ next_work_item ? WFW_ONE_IDLE : WFW_GOT_STATUS);
+ }
+
+ /* There should now be nothing in ready_list. */
+ Assert(ready_list.first_te > ready_list.last_te);
+
+ ready_list_free(&ready_list);
+
+ pg_log_info("finished main parallel loop");
+}
+
+/*
+ * Main engine for parallel restore.
+ *
+ * Parallel restore is done in three phases. In this third phase,
+ * we mop up any remaining TOC entries by processing them serially.
+ * This phase normally should have nothing to do, but if we've somehow
+ * gotten stuck due to circular dependencies or some such, this provides
+ * at least some chance of completing the restore successfully.
+ */
+static void
+restore_toc_entries_postfork(ArchiveHandle *AH, TocEntry *pending_list)
+{
+ RestoreOptions *ropt = AH->public.ropt;
+ TocEntry *te;
+
+ pg_log_debug("entering restore_toc_entries_postfork");
+
+ /*
+ * Now reconnect the single parent connection.
+ */
+ ConnectDatabase((Archive *) AH, &ropt->cparams, true);
+
+ /* re-establish fixed state */
+ _doSetFixedOutputState(AH);
+
+ /*
+ * Make sure there is no work left due to, say, circular dependencies, or
+ * some other pathological condition. If so, do it in the single parent
+ * connection. We don't sweat about RestorePass ordering; it's likely we
+ * already violated that.
+ */
+ for (te = pending_list->pending_next; te != pending_list; te = te->pending_next)
+ {
+ pg_log_info("processing missed item %d %s %s",
+ te->dumpId, te->desc, te->tag);
+ (void) restore_toc_entry(AH, te, false);
+ }
+}
+
+/*
+ * Check if te1 has an exclusive lock requirement for an item that te2 also
+ * requires, whether or not te2's requirement is for an exclusive lock.
+ */
+static bool
+has_lock_conflicts(TocEntry *te1, TocEntry *te2)
+{
+ int j,
+ k;
+
+ for (j = 0; j < te1->nLockDeps; j++)
+ {
+ for (k = 0; k < te2->nDeps; k++)
+ {
+ if (te1->lockDeps[j] == te2->dependencies[k])
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/*
+ * Initialize the header of the pending-items list.
+ *
+ * This is a circular list with a dummy TocEntry as header, just like the
+ * main TOC list; but we use separate list links so that an entry can be in
+ * the main TOC list as well as in the pending list.
+ */
+static void
+pending_list_header_init(TocEntry *l)
+{
+ l->pending_prev = l->pending_next = l;
+}
+
+/* Append te to the end of the pending-list headed by l */
+static void
+pending_list_append(TocEntry *l, TocEntry *te)
+{
+ te->pending_prev = l->pending_prev;
+ l->pending_prev->pending_next = te;
+ l->pending_prev = te;
+ te->pending_next = l;
+}
+
+/* Remove te from the pending-list */
+static void
+pending_list_remove(TocEntry *te)
+{
+ te->pending_prev->pending_next = te->pending_next;
+ te->pending_next->pending_prev = te->pending_prev;
+ te->pending_prev = NULL;
+ te->pending_next = NULL;
+}
+
+
+/*
+ * Initialize the ready_list with enough room for up to tocCount entries.
+ */
+static void
+ready_list_init(ParallelReadyList *ready_list, int tocCount)
+{
+ ready_list->tes = (TocEntry **)
+ pg_malloc(tocCount * sizeof(TocEntry *));
+ ready_list->first_te = 0;
+ ready_list->last_te = -1;
+ ready_list->sorted = false;
+}
+
+/*
+ * Free storage for a ready_list.
+ */
+static void
+ready_list_free(ParallelReadyList *ready_list)
+{
+ pg_free(ready_list->tes);
+}
+
+/* Add te to the ready_list */
+static void
+ready_list_insert(ParallelReadyList *ready_list, TocEntry *te)
+{
+ ready_list->tes[++ready_list->last_te] = te;
+ /* List is (probably) not sorted anymore. */
+ ready_list->sorted = false;
+}
+
+/* Remove the i'th entry in the ready_list */
+static void
+ready_list_remove(ParallelReadyList *ready_list, int i)
+{
+ int f = ready_list->first_te;
+
+ Assert(i >= f && i <= ready_list->last_te);
+
+ /*
+ * In the typical case where the item to be removed is the first ready
+ * entry, we need only increment first_te to remove it. Otherwise, move
+ * the entries before it to compact the list. (This preserves sortedness,
+ * if any.) We could alternatively move the entries after i, but there
+ * are typically many more of those.
+ */
+ if (i > f)
+ {
+ TocEntry **first_te_ptr = &ready_list->tes[f];
+
+ memmove(first_te_ptr + 1, first_te_ptr, (i - f) * sizeof(TocEntry *));
+ }
+ ready_list->first_te++;
+}
+
+/* Sort the ready_list into the desired order */
+static void
+ready_list_sort(ParallelReadyList *ready_list)
+{
+ if (!ready_list->sorted)
+ {
+ int n = ready_list->last_te - ready_list->first_te + 1;
+
+ if (n > 1)
+ qsort(ready_list->tes + ready_list->first_te, n,
+ sizeof(TocEntry *),
+ TocEntrySizeCompare);
+ ready_list->sorted = true;
+ }
+}
+
+/* qsort comparator for sorting TocEntries by dataLength */
+static int
+TocEntrySizeCompare(const void *p1, const void *p2)
+{
+ const TocEntry *te1 = *(const TocEntry *const *) p1;
+ const TocEntry *te2 = *(const TocEntry *const *) p2;
+
+ /* Sort by decreasing dataLength */
+ if (te1->dataLength > te2->dataLength)
+ return -1;
+ if (te1->dataLength < te2->dataLength)
+ return 1;
+
+ /* For equal dataLengths, sort by dumpId, just to be stable */
+ if (te1->dumpId < te2->dumpId)
+ return -1;
+ if (te1->dumpId > te2->dumpId)
+ return 1;
+
+ return 0;
+}
+
+
+/*
+ * Move all immediately-ready items from pending_list to ready_list.
+ *
+ * Items are considered ready if they have no remaining dependencies and
+ * they belong in the current restore pass. (See also reduce_dependencies,
+ * which applies the same logic one-at-a-time.)
+ */
+static void
+move_to_ready_list(TocEntry *pending_list,
+ ParallelReadyList *ready_list,
+ RestorePass pass)
+{
+ TocEntry *te;
+ TocEntry *next_te;
+
+ for (te = pending_list->pending_next; te != pending_list; te = next_te)
+ {
+ /* must save list link before possibly removing te from list */
+ next_te = te->pending_next;
+
+ if (te->depCount == 0 &&
+ _tocEntryRestorePass(te) == pass)
+ {
+ /* Remove it from pending_list ... */
+ pending_list_remove(te);
+ /* ... and add to ready_list */
+ ready_list_insert(ready_list, te);
+ }
+ }
+}
+
+/*
+ * Find the next work item (if any) that is capable of being run now,
+ * and remove it from the ready_list.
+ *
+ * Returns the item, or NULL if nothing is runnable.
+ *
+ * To qualify, the item must have no remaining dependencies
+ * and no requirements for locks that are incompatible with
+ * items currently running. Items in the ready_list are known to have
+ * no remaining dependencies, but we have to check for lock conflicts.
+ */
+static TocEntry *
+pop_next_work_item(ParallelReadyList *ready_list,
+ ParallelState *pstate)
+{
+ /*
+ * Sort the ready_list so that we'll tackle larger jobs first.
+ */
+ ready_list_sort(ready_list);
+
+ /*
+ * Search the ready_list until we find a suitable item.
+ */
+ for (int i = ready_list->first_te; i <= ready_list->last_te; i++)
+ {
+ TocEntry *te = ready_list->tes[i];
+ bool conflicts = false;
+
+ /*
+ * Check to see if the item would need exclusive lock on something
+ * that a currently running item also needs lock on, or vice versa. If
+ * so, we don't want to schedule them together.
+ */
+ for (int k = 0; k < pstate->numWorkers; k++)
+ {
+ TocEntry *running_te = pstate->te[k];
+
+ if (running_te == NULL)
+ continue;
+ if (has_lock_conflicts(te, running_te) ||
+ has_lock_conflicts(running_te, te))
+ {
+ conflicts = true;
+ break;
+ }
+ }
+
+ if (conflicts)
+ continue;
+
+ /* passed all tests, so this item can run */
+ ready_list_remove(ready_list, i);
+ return te;
+ }
+
+ pg_log_debug("no item ready");
+ return NULL;
+}
+
+
+/*
+ * Restore a single TOC item in parallel with others
+ *
+ * this is run in the worker, i.e. in a thread (Windows) or a separate process
+ * (everything else). A worker process executes several such work items during
+ * a parallel backup or restore. Once we terminate here and report back that
+ * our work is finished, the leader process will assign us a new work item.
+ */
+int
+parallel_restore(ArchiveHandle *AH, TocEntry *te)
+{
+ int status;
+
+ Assert(AH->connection != NULL);
+
+ /* Count only errors associated with this TOC entry */
+ AH->public.n_errors = 0;
+
+ /* Restore the TOC item */
+ status = restore_toc_entry(AH, te, true);
+
+ return status;
+}
+
+
+/*
+ * Callback function that's invoked in the leader process after a step has
+ * been parallel restored.
+ *
+ * Update status and reduce the dependency count of any dependent items.
+ */
+static void
+mark_restore_job_done(ArchiveHandle *AH,
+ TocEntry *te,
+ int status,
+ void *callback_data)
+{
+ ParallelReadyList *ready_list = (ParallelReadyList *) callback_data;
+
+ pg_log_info("finished item %d %s %s",
+ te->dumpId, te->desc, te->tag);
+
+ if (status == WORKER_CREATE_DONE)
+ mark_create_done(AH, te);
+ else if (status == WORKER_INHIBIT_DATA)
+ {
+ inhibit_data_for_failed_table(AH, te);
+ AH->public.n_errors++;
+ }
+ else if (status == WORKER_IGNORED_ERRORS)
+ AH->public.n_errors++;
+ else if (status != 0)
+ pg_fatal("worker process failed: exit code %d",
+ status);
+
+ reduce_dependencies(AH, te, ready_list);
+}
+
+
+/*
+ * Process the dependency information into a form useful for parallel restore.
+ *
+ * This function takes care of fixing up some missing or badly designed
+ * dependencies, and then prepares subsidiary data structures that will be
+ * used in the main parallel-restore logic, including:
+ * 1. We build the revDeps[] arrays of incoming dependency dumpIds.
+ * 2. We set up depCount fields that are the number of as-yet-unprocessed
+ * dependencies for each TOC entry.
+ *
+ * We also identify locking dependencies so that we can avoid trying to
+ * schedule conflicting items at the same time.
+ */
+static void
+fix_dependencies(ArchiveHandle *AH)
+{
+ TocEntry *te;
+ int i;
+
+ /*
+ * Initialize the depCount/revDeps/nRevDeps fields, and make sure the TOC
+ * items are marked as not being in any parallel-processing list.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ te->depCount = te->nDeps;
+ te->revDeps = NULL;
+ te->nRevDeps = 0;
+ te->pending_prev = NULL;
+ te->pending_next = NULL;
+ }
+
+ /*
+ * POST_DATA items that are shown as depending on a table need to be
+ * re-pointed to depend on that table's data, instead. This ensures they
+ * won't get scheduled until the data has been loaded.
+ */
+ repoint_table_dependencies(AH);
+
+ /*
+ * Pre-8.4 versions of pg_dump neglected to set up a dependency from BLOB
+ * COMMENTS to BLOBS. Cope. (We assume there's only one BLOBS and only
+ * one BLOB COMMENTS in such files.)
+ */
+ if (AH->version < K_VERS_1_11)
+ {
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (strcmp(te->desc, "BLOB COMMENTS") == 0 && te->nDeps == 0)
+ {
+ TocEntry *te2;
+
+ for (te2 = AH->toc->next; te2 != AH->toc; te2 = te2->next)
+ {
+ if (strcmp(te2->desc, "BLOBS") == 0)
+ {
+ te->dependencies = (DumpId *) pg_malloc(sizeof(DumpId));
+ te->dependencies[0] = te2->dumpId;
+ te->nDeps++;
+ te->depCount++;
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ /*
+ * At this point we start to build the revDeps reverse-dependency arrays,
+ * so all changes of dependencies must be complete.
+ */
+
+ /*
+ * Count the incoming dependencies for each item. Also, it is possible
+ * that the dependencies list items that are not in the archive at all
+ * (that should not happen in 9.2 and later, but is highly likely in older
+ * archives). Subtract such items from the depCounts.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ for (i = 0; i < te->nDeps; i++)
+ {
+ DumpId depid = te->dependencies[i];
+
+ if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL)
+ AH->tocsByDumpId[depid]->nRevDeps++;
+ else
+ te->depCount--;
+ }
+ }
+
+ /*
+ * Allocate space for revDeps[] arrays, and reset nRevDeps so we can use
+ * it as a counter below.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->nRevDeps > 0)
+ te->revDeps = (DumpId *) pg_malloc(te->nRevDeps * sizeof(DumpId));
+ te->nRevDeps = 0;
+ }
+
+ /*
+ * Build the revDeps[] arrays of incoming-dependency dumpIds. This had
+ * better agree with the loops above.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ for (i = 0; i < te->nDeps; i++)
+ {
+ DumpId depid = te->dependencies[i];
+
+ if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL)
+ {
+ TocEntry *otherte = AH->tocsByDumpId[depid];
+
+ otherte->revDeps[otherte->nRevDeps++] = te->dumpId;
+ }
+ }
+ }
+
+ /*
+ * Lastly, work out the locking dependencies.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ te->lockDeps = NULL;
+ te->nLockDeps = 0;
+ identify_locking_dependencies(AH, te);
+ }
+}
+
+/*
+ * Change dependencies on table items to depend on table data items instead,
+ * but only in POST_DATA items.
+ *
+ * Also, for any item having such dependency(s), set its dataLength to the
+ * largest dataLength of the table data items it depends on. This ensures
+ * that parallel restore will prioritize larger jobs (index builds, FK
+ * constraint checks, etc) over smaller ones, avoiding situations where we
+ * end a restore with only one active job working on a large table.
+ */
+static void
+repoint_table_dependencies(ArchiveHandle *AH)
+{
+ TocEntry *te;
+ int i;
+ DumpId olddep;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ if (te->section != SECTION_POST_DATA)
+ continue;
+ for (i = 0; i < te->nDeps; i++)
+ {
+ olddep = te->dependencies[i];
+ if (olddep <= AH->maxDumpId &&
+ AH->tableDataId[olddep] != 0)
+ {
+ DumpId tabledataid = AH->tableDataId[olddep];
+ TocEntry *tabledatate = AH->tocsByDumpId[tabledataid];
+
+ te->dependencies[i] = tabledataid;
+ te->dataLength = Max(te->dataLength, tabledatate->dataLength);
+ pg_log_debug("transferring dependency %d -> %d to %d",
+ te->dumpId, olddep, tabledataid);
+ }
+ }
+ }
+}
+
+/*
+ * Identify which objects we'll need exclusive lock on in order to restore
+ * the given TOC entry (*other* than the one identified by the TOC entry
+ * itself). Record their dump IDs in the entry's lockDeps[] array.
+ */
+static void
+identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
+{
+ DumpId *lockids;
+ int nlockids;
+ int i;
+
+ /*
+ * We only care about this for POST_DATA items. PRE_DATA items are not
+ * run in parallel, and DATA items are all independent by assumption.
+ */
+ if (te->section != SECTION_POST_DATA)
+ return;
+
+ /* Quick exit if no dependencies at all */
+ if (te->nDeps == 0)
+ return;
+
+ /*
+ * Most POST_DATA items are ALTER TABLEs or some moral equivalent of that,
+ * and hence require exclusive lock. However, we know that CREATE INDEX
+ * does not. (Maybe someday index-creating CONSTRAINTs will fall in that
+ * category too ... but today is not that day.)
+ */
+ if (strcmp(te->desc, "INDEX") == 0)
+ return;
+
+ /*
+ * We assume the entry requires exclusive lock on each TABLE or TABLE DATA
+ * item listed among its dependencies. Originally all of these would have
+ * been TABLE items, but repoint_table_dependencies would have repointed
+ * them to the TABLE DATA items if those are present (which they might not
+ * be, eg in a schema-only dump). Note that all of the entries we are
+ * processing here are POST_DATA; otherwise there might be a significant
+ * difference between a dependency on a table and a dependency on its
+ * data, so that closer analysis would be needed here.
+ */
+ lockids = (DumpId *) pg_malloc(te->nDeps * sizeof(DumpId));
+ nlockids = 0;
+ for (i = 0; i < te->nDeps; i++)
+ {
+ DumpId depid = te->dependencies[i];
+
+ if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL &&
+ ((strcmp(AH->tocsByDumpId[depid]->desc, "TABLE DATA") == 0) ||
+ strcmp(AH->tocsByDumpId[depid]->desc, "TABLE") == 0))
+ lockids[nlockids++] = depid;
+ }
+
+ if (nlockids == 0)
+ {
+ free(lockids);
+ return;
+ }
+
+ te->lockDeps = pg_realloc(lockids, nlockids * sizeof(DumpId));
+ te->nLockDeps = nlockids;
+}
+
+/*
+ * Remove the specified TOC entry from the depCounts of items that depend on
+ * it, thereby possibly making them ready-to-run. Any pending item that
+ * becomes ready should be moved to the ready_list, if that's provided.
+ */
+static void
+reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
+ ParallelReadyList *ready_list)
+{
+ int i;
+
+ pg_log_debug("reducing dependencies for %d", te->dumpId);
+
+ for (i = 0; i < te->nRevDeps; i++)
+ {
+ TocEntry *otherte = AH->tocsByDumpId[te->revDeps[i]];
+
+ Assert(otherte->depCount > 0);
+ otherte->depCount--;
+
+ /*
+ * It's ready if it has no remaining dependencies, and it belongs in
+ * the current restore pass, and it is currently a member of the
+ * pending list (that check is needed to prevent double restore in
+ * some cases where a list-file forces out-of-order restoring).
+ * However, if ready_list == NULL then caller doesn't want any list
+ * memberships changed.
+ */
+ if (otherte->depCount == 0 &&
+ _tocEntryRestorePass(otherte) == AH->restorePass &&
+ otherte->pending_prev != NULL &&
+ ready_list != NULL)
+ {
+ /* Remove it from pending list ... */
+ pending_list_remove(otherte);
+ /* ... and add to ready_list */
+ ready_list_insert(ready_list, otherte);
+ }
+ }
+}
+
+/*
+ * Set the created flag on the DATA member corresponding to the given
+ * TABLE member
+ */
+static void
+mark_create_done(ArchiveHandle *AH, TocEntry *te)
+{
+ if (AH->tableDataId[te->dumpId] != 0)
+ {
+ TocEntry *ted = AH->tocsByDumpId[AH->tableDataId[te->dumpId]];
+
+ ted->created = true;
+ }
+}
+
+/*
+ * Mark the DATA member corresponding to the given TABLE member
+ * as not wanted
+ */
+static void
+inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te)
+{
+ pg_log_info("table \"%s\" could not be created, will not restore its data",
+ te->tag);
+
+ if (AH->tableDataId[te->dumpId] != 0)
+ {
+ TocEntry *ted = AH->tocsByDumpId[AH->tableDataId[te->dumpId]];
+
+ ted->reqs = 0;
+ }
+}
+
+/*
+ * Clone and de-clone routines used in parallel restoration.
+ *
+ * Enough of the structure is cloned to ensure that there is no
+ * conflict between different threads each with their own clone.
+ */
+ArchiveHandle *
+CloneArchive(ArchiveHandle *AH)
+{
+ ArchiveHandle *clone;
+
+ /* Make a "flat" copy */
+ clone = (ArchiveHandle *) pg_malloc(sizeof(ArchiveHandle));
+ memcpy(clone, AH, sizeof(ArchiveHandle));
+
+ /* Handle format-independent fields */
+ memset(&(clone->sqlparse), 0, sizeof(clone->sqlparse));
+
+ /* The clone will have its own connection, so disregard connection state */
+ clone->connection = NULL;
+ clone->connCancel = NULL;
+ clone->currUser = NULL;
+ clone->currSchema = NULL;
+ clone->currTableAm = NULL;
+ clone->currTablespace = NULL;
+
+ /* savedPassword must be local in case we change it while connecting */
+ if (clone->savedPassword)
+ clone->savedPassword = pg_strdup(clone->savedPassword);
+
+ /* clone has its own error count, too */
+ clone->public.n_errors = 0;
+
+ /*
+ * Connect our new clone object to the database, using the same connection
+ * parameters used for the original connection.
+ */
+ ConnectDatabase((Archive *) clone, &clone->public.ropt->cparams, true);
+
+ /* re-establish fixed state */
+ if (AH->mode == archModeRead)
+ _doSetFixedOutputState(clone);
+ /* in write case, setupDumpWorker will fix up connection state */
+
+ /* Let the format-specific code have a chance too */
+ clone->ClonePtr(clone);
+
+ Assert(clone->connection != NULL);
+ return clone;
+}
+
+/*
+ * Release clone-local storage.
+ *
+ * Note: we assume any clone-local connection was already closed.
+ */
+void
+DeCloneArchive(ArchiveHandle *AH)
+{
+ /* Should not have an open database connection */
+ Assert(AH->connection == NULL);
+
+ /* Clear format-specific state */
+ AH->DeClonePtr(AH);
+
+ /* Clear state allocated by CloneArchive */
+ if (AH->sqlparse.curCmd)
+ destroyPQExpBuffer(AH->sqlparse.curCmd);
+
+ /* Clear any connection-local state */
+ free(AH->currUser);
+ free(AH->currSchema);
+ free(AH->currTablespace);
+ free(AH->currTableAm);
+ free(AH->savedPassword);
+
+ free(AH);
+}
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
new file mode 100644
index 0000000..18b38c1
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -0,0 +1,455 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_archiver.h
+ *
+ * Private interface to the pg_dump archiver routines.
+ * It is NOT intended that these routines be called by any
+ * dumper directly.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_archiver.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef __PG_BACKUP_ARCHIVE__
+#define __PG_BACKUP_ARCHIVE__
+
+#include <time.h>
+
+#include "libpq-fe.h"
+#include "pg_backup.h"
+#include "pqexpbuffer.h"
+
+#define LOBBUFSIZE 16384
+
+/* Data block types */
+#define BLK_DATA 1
+#define BLK_BLOBS 3
+
+/* Encode version components into a convenient integer <maj><min><rev> */
+#define MAKE_ARCHIVE_VERSION(major, minor, rev) (((major) * 256 + (minor)) * 256 + (rev))
+
+#define ARCHIVE_MAJOR(version) (((version) >> 16) & 255)
+#define ARCHIVE_MINOR(version) (((version) >> 8) & 255)
+#define ARCHIVE_REV(version) (((version) ) & 255)
+
+/* Historical version numbers (checked in code) */
+#define K_VERS_1_0 MAKE_ARCHIVE_VERSION(1, 0, 0)
+#define K_VERS_1_2 MAKE_ARCHIVE_VERSION(1, 2, 0) /* Allow No ZLIB */
+#define K_VERS_1_3 MAKE_ARCHIVE_VERSION(1, 3, 0) /* BLOBS */
+#define K_VERS_1_4 MAKE_ARCHIVE_VERSION(1, 4, 0) /* Date & name in header */
+#define K_VERS_1_5 MAKE_ARCHIVE_VERSION(1, 5, 0) /* Handle dependencies */
+#define K_VERS_1_6 MAKE_ARCHIVE_VERSION(1, 6, 0) /* Schema field in TOCs */
+#define K_VERS_1_7 MAKE_ARCHIVE_VERSION(1, 7, 0) /* File Offset size in
+ * header */
+#define K_VERS_1_8 MAKE_ARCHIVE_VERSION(1, 8, 0) /* change interpretation
+ * of ID numbers and
+ * dependencies */
+#define K_VERS_1_9 MAKE_ARCHIVE_VERSION(1, 9, 0) /* add default_with_oids
+ * tracking */
+#define K_VERS_1_10 MAKE_ARCHIVE_VERSION(1, 10, 0) /* add tablespace */
+#define K_VERS_1_11 MAKE_ARCHIVE_VERSION(1, 11, 0) /* add toc section
+ * indicator */
+#define K_VERS_1_12 MAKE_ARCHIVE_VERSION(1, 12, 0) /* add separate BLOB
+ * entries */
+#define K_VERS_1_13 MAKE_ARCHIVE_VERSION(1, 13, 0) /* change search_path
+ * behavior */
+#define K_VERS_1_14 MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */
+#define K_VERS_1_15 MAKE_ARCHIVE_VERSION(1, 15, 0) /* add
+ * compression_algorithm
+ * in header */
+
+/* Current archive version number (the format we can output) */
+#define K_VERS_MAJOR 1
+#define K_VERS_MINOR 15
+#define K_VERS_REV 0
+#define K_VERS_SELF MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, K_VERS_REV)
+
+/* Newest format we can read */
+#define K_VERS_MAX MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, 255)
+
+
+/* Flags to indicate disposition of offsets stored in files */
+#define K_OFFSET_POS_NOT_SET 1
+#define K_OFFSET_POS_SET 2
+#define K_OFFSET_NO_DATA 3
+
+/*
+ * Special exit values from worker children. We reserve 0 for normal
+ * success; 1 and other small values should be interpreted as crashes.
+ */
+#define WORKER_OK 0
+#define WORKER_CREATE_DONE 10
+#define WORKER_INHIBIT_DATA 11
+#define WORKER_IGNORED_ERRORS 12
+
+typedef struct _archiveHandle ArchiveHandle;
+typedef struct _tocEntry TocEntry;
+struct ParallelState;
+
+#define READ_ERROR_EXIT(fd) \
+ do { \
+ if (feof(fd)) \
+ pg_fatal("could not read from input file: end of file"); \
+ else \
+ pg_fatal("could not read from input file: %m"); \
+ } while (0)
+
+#define WRITE_ERROR_EXIT \
+ do { \
+ pg_fatal("could not write to output file: %m"); \
+ } while (0)
+
+typedef enum T_Action
+{
+ ACT_DUMP,
+ ACT_RESTORE
+} T_Action;
+
+typedef void (*ClosePtrType) (ArchiveHandle *AH);
+typedef void (*ReopenPtrType) (ArchiveHandle *AH);
+typedef void (*ArchiveEntryPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef void (*StartDataPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*WriteDataPtrType) (ArchiveHandle *AH, const void *data, size_t dLen);
+typedef void (*EndDataPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef void (*StartLOsPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*StartLOPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid);
+typedef void (*EndLOPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid);
+typedef void (*EndLOsPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef int (*WriteBytePtrType) (ArchiveHandle *AH, const int i);
+typedef int (*ReadBytePtrType) (ArchiveHandle *AH);
+typedef void (*WriteBufPtrType) (ArchiveHandle *AH, const void *c, size_t len);
+typedef void (*ReadBufPtrType) (ArchiveHandle *AH, void *buf, size_t len);
+typedef void (*WriteExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*ReadExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*PrintExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef void (*PrintTocDataPtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef void (*PrepParallelRestorePtrType) (ArchiveHandle *AH);
+typedef void (*ClonePtrType) (ArchiveHandle *AH);
+typedef void (*DeClonePtrType) (ArchiveHandle *AH);
+
+typedef int (*WorkerJobDumpPtrType) (ArchiveHandle *AH, TocEntry *te);
+typedef int (*WorkerJobRestorePtrType) (ArchiveHandle *AH, TocEntry *te);
+
+typedef size_t (*CustomOutPtrType) (ArchiveHandle *AH, const void *buf, size_t len);
+
+typedef enum
+{
+ SQL_SCAN = 0, /* normal */
+ SQL_IN_SINGLE_QUOTE, /* '...' literal */
+ SQL_IN_DOUBLE_QUOTE /* "..." identifier */
+} sqlparseState;
+
+typedef struct
+{
+ sqlparseState state; /* see above */
+ bool backSlash; /* next char is backslash quoted? */
+ PQExpBuffer curCmd; /* incomplete line (NULL if not created) */
+} sqlparseInfo;
+
+typedef enum
+{
+ STAGE_NONE = 0,
+ STAGE_INITIALIZING,
+ STAGE_PROCESSING,
+ STAGE_FINALIZING
+} ArchiverStage;
+
+typedef enum
+{
+ OUTPUT_SQLCMDS = 0, /* emitting general SQL commands */
+ OUTPUT_COPYDATA, /* writing COPY data */
+ OUTPUT_OTHERDATA /* writing data as INSERT commands */
+} ArchiverOutput;
+
+/*
+ * For historical reasons, ACL items are interspersed with everything else in
+ * a dump file's TOC; typically they're right after the object they're for.
+ * However, we need to restore data before ACLs, as otherwise a read-only
+ * table (ie one where the owner has revoked her own INSERT privilege) causes
+ * data restore failures. On the other hand, matview REFRESH commands should
+ * come out after ACLs, as otherwise non-superuser-owned matviews might not
+ * be able to execute. (If the permissions at the time of dumping would not
+ * allow a REFRESH, too bad; we won't fix that for you.) We also want event
+ * triggers to be restored after ACLs, so that they can't mess those up.
+ *
+ * These considerations force us to make three passes over the TOC,
+ * restoring the appropriate subset of items in each pass. We assume that
+ * the dependency sort resulted in an appropriate ordering of items within
+ * each subset.
+ *
+ * XXX This mechanism should be superseded by tracking dependencies on ACLs
+ * properly; but we'll still need it for old dump files even after that.
+ */
+typedef enum
+{
+ RESTORE_PASS_MAIN = 0, /* Main pass (most TOC item types) */
+ RESTORE_PASS_ACL, /* ACL item types */
+ RESTORE_PASS_POST_ACL /* Event trigger and matview refresh items */
+
+#define RESTORE_PASS_LAST RESTORE_PASS_POST_ACL
+} RestorePass;
+
+#define REQ_SCHEMA 0x01 /* want schema */
+#define REQ_DATA 0x02 /* want data */
+#define REQ_SPECIAL 0x04 /* for special TOC entries */
+
+struct _archiveHandle
+{
+ Archive public; /* Public part of archive */
+ int version; /* Version of file */
+
+ char *archiveRemoteVersion; /* When reading an archive, the
+ * version of the dumped DB */
+ char *archiveDumpVersion; /* When reading an archive, the version of
+ * the dumper */
+
+ size_t intSize; /* Size of an integer in the archive */
+ size_t offSize; /* Size of a file offset in the archive -
+ * Added V1.7 */
+ ArchiveFormat format; /* Archive format */
+
+ sqlparseInfo sqlparse; /* state for parsing INSERT data */
+
+ time_t createDate; /* Date archive created */
+
+ /*
+ * Fields used when discovering archive format. For tar format, we load
+ * the first block into the lookahead buffer, and verify that it looks
+ * like a tar header. The tar module must then consume bytes from the
+ * lookahead buffer before reading any more from the file. For custom
+ * format, we load only the "PGDMP" marker into the buffer, and then set
+ * readHeader after confirming it matches. The buffer is vestigial in
+ * this case, as the subsequent code just checks readHeader and doesn't
+ * examine the buffer.
+ */
+ int readHeader; /* Set if we already read "PGDMP" marker */
+ char *lookahead; /* Buffer used when reading header to discover
+ * format */
+ size_t lookaheadSize; /* Allocated size of buffer */
+ size_t lookaheadLen; /* Length of valid data in lookahead */
+ size_t lookaheadPos; /* Current read position in lookahead buffer */
+
+ ArchiveEntryPtrType ArchiveEntryPtr; /* Called for each metadata object */
+ StartDataPtrType StartDataPtr; /* Called when table data is about to be
+ * dumped */
+ WriteDataPtrType WriteDataPtr; /* Called to send some table data to the
+ * archive */
+ EndDataPtrType EndDataPtr; /* Called when table data dump is finished */
+ WriteBytePtrType WriteBytePtr; /* Write a byte to output */
+ ReadBytePtrType ReadBytePtr; /* Read a byte from an archive */
+ WriteBufPtrType WriteBufPtr; /* Write a buffer of output to the archive */
+ ReadBufPtrType ReadBufPtr; /* Read a buffer of input from the archive */
+ ClosePtrType ClosePtr; /* Close the archive */
+ ReopenPtrType ReopenPtr; /* Reopen the archive */
+ WriteExtraTocPtrType WriteExtraTocPtr; /* Write extra TOC entry data
+ * associated with the current
+ * archive format */
+ ReadExtraTocPtrType ReadExtraTocPtr; /* Read extra info associated with
+ * archive format */
+ PrintExtraTocPtrType PrintExtraTocPtr; /* Extra TOC info for format */
+ PrintTocDataPtrType PrintTocDataPtr;
+
+ StartLOsPtrType StartLOsPtr;
+ EndLOsPtrType EndLOsPtr;
+ StartLOPtrType StartLOPtr;
+ EndLOPtrType EndLOPtr;
+
+ SetupWorkerPtrType SetupWorkerPtr;
+ WorkerJobDumpPtrType WorkerJobDumpPtr;
+ WorkerJobRestorePtrType WorkerJobRestorePtr;
+
+ PrepParallelRestorePtrType PrepParallelRestorePtr;
+ ClonePtrType ClonePtr; /* Clone format-specific fields */
+ DeClonePtrType DeClonePtr; /* Clean up cloned fields */
+
+ CustomOutPtrType CustomOutPtr; /* Alternative script output routine */
+
+ /* Stuff for direct DB connection */
+ char *archdbname; /* DB name *read* from archive */
+ char *savedPassword; /* password for ropt->username, if known */
+ char *use_role;
+ PGconn *connection;
+ /* If connCancel isn't NULL, SIGINT handler will send a cancel */
+ PGcancel *volatile connCancel;
+
+ int connectToDB; /* Flag to indicate if direct DB connection is
+ * required */
+ ArchiverOutput outputKind; /* Flag for what we're currently writing */
+ bool pgCopyIn; /* Currently in libpq 'COPY IN' mode. */
+
+ int loFd;
+ bool writingLO;
+ int loCount; /* # of LOs restored */
+
+ char *fSpec; /* Archive File Spec */
+ FILE *FH; /* General purpose file handle */
+ void *OF; /* Output file */
+
+ struct _tocEntry *toc; /* Header of circular list of TOC entries */
+ int tocCount; /* Number of TOC entries */
+ DumpId maxDumpId; /* largest DumpId among all TOC entries */
+
+ /* arrays created after the TOC list is complete: */
+ struct _tocEntry **tocsByDumpId; /* TOCs indexed by dumpId */
+ DumpId *tableDataId; /* TABLE DATA ids, indexed by table dumpId */
+
+ struct _tocEntry *currToc; /* Used when dumping data */
+ pg_compress_specification compression_spec; /* Requested specification for
+ * compression */
+ bool dosync; /* data requested to be synced on sight */
+ ArchiveMode mode; /* File mode - r or w */
+ void *formatData; /* Header data specific to file format */
+
+ /* these vars track state to avoid sending redundant SET commands */
+ char *currUser; /* current username, or NULL if unknown */
+ char *currSchema; /* current schema, or NULL */
+ char *currTablespace; /* current tablespace, or NULL */
+ char *currTableAm; /* current table access method, or NULL */
+
+ void *lo_buf;
+ size_t lo_buf_used;
+ size_t lo_buf_size;
+
+ int noTocComments;
+ ArchiverStage stage;
+ ArchiverStage lastErrorStage;
+ RestorePass restorePass; /* used only during parallel restore */
+ struct _tocEntry *currentTE;
+ struct _tocEntry *lastErrorTE;
+};
+
+struct _tocEntry
+{
+ struct _tocEntry *prev;
+ struct _tocEntry *next;
+ CatalogId catalogId;
+ DumpId dumpId;
+ teSection section;
+ bool hadDumper; /* Archiver was passed a dumper routine (used
+ * in restore) */
+ char *tag; /* index tag */
+ char *namespace; /* null or empty string if not in a schema */
+ char *tablespace; /* null if not in a tablespace; empty string
+ * means use database default */
+ char *tableam; /* table access method, only for TABLE tags */
+ char *owner;
+ char *desc;
+ char *defn;
+ char *dropStmt;
+ char *copyStmt;
+ DumpId *dependencies; /* dumpIds of objects this one depends on */
+ int nDeps; /* number of dependencies */
+
+ DataDumperPtr dataDumper; /* Routine to dump data for object */
+ const void *dataDumperArg; /* Arg for above routine */
+ void *formatData; /* TOC Entry data specific to file format */
+
+ /* working state while dumping/restoring */
+ pgoff_t dataLength; /* item's data size; 0 if none or unknown */
+ int reqs; /* do we need schema and/or data of object
+ * (REQ_* bit mask) */
+ bool created; /* set for DATA member if TABLE was created */
+
+ /* working state (needed only for parallel restore) */
+ struct _tocEntry *pending_prev; /* list links for pending-items list; */
+ struct _tocEntry *pending_next; /* NULL if not in that list */
+ int depCount; /* number of dependencies not yet restored */
+ DumpId *revDeps; /* dumpIds of objects depending on this one */
+ int nRevDeps; /* number of such dependencies */
+ DumpId *lockDeps; /* dumpIds of objects this one needs lock on */
+ int nLockDeps; /* number of such dependencies */
+};
+
+extern int parallel_restore(ArchiveHandle *AH, TocEntry *te);
+extern void on_exit_close_archive(Archive *AHX);
+
+extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3);
+
+/* Options for ArchiveEntry */
+typedef struct _archiveOpts
+{
+ const char *tag;
+ const char *namespace;
+ const char *tablespace;
+ const char *tableam;
+ const char *owner;
+ const char *description;
+ teSection section;
+ const char *createStmt;
+ const char *dropStmt;
+ const char *copyStmt;
+ const DumpId *deps;
+ int nDeps;
+ DataDumperPtr dumpFn;
+ const void *dumpArg;
+} ArchiveOpts;
+#define ARCHIVE_OPTS(...) &(ArchiveOpts){__VA_ARGS__}
+/* Called to add a TOC entry */
+extern TocEntry *ArchiveEntry(Archive *AHX, CatalogId catalogId,
+ DumpId dumpId, ArchiveOpts *opts);
+
+extern void WriteHead(ArchiveHandle *AH);
+extern void ReadHead(ArchiveHandle *AH);
+extern void WriteToc(ArchiveHandle *AH);
+extern void ReadToc(ArchiveHandle *AH);
+extern void WriteDataChunks(ArchiveHandle *AH, struct ParallelState *pstate);
+extern void WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te);
+extern ArchiveHandle *CloneArchive(ArchiveHandle *AH);
+extern void DeCloneArchive(ArchiveHandle *AH);
+
+extern int TocIDRequired(ArchiveHandle *AH, DumpId id);
+TocEntry *getTocEntryByDumpId(ArchiveHandle *AH, DumpId id);
+extern bool checkSeek(FILE *fp);
+
+#define appendStringLiteralAHX(buf,str,AH) \
+ appendStringLiteral(buf, str, (AH)->public.encoding, (AH)->public.std_strings)
+
+#define appendByteaLiteralAHX(buf,str,len,AH) \
+ appendByteaLiteral(buf, str, len, (AH)->public.std_strings)
+
+/*
+ * Mandatory routines for each supported format
+ */
+
+extern size_t WriteInt(ArchiveHandle *AH, int i);
+extern int ReadInt(ArchiveHandle *AH);
+extern char *ReadStr(ArchiveHandle *AH);
+extern size_t WriteStr(ArchiveHandle *AH, const char *c);
+
+int ReadOffset(ArchiveHandle *, pgoff_t *);
+size_t WriteOffset(ArchiveHandle *, pgoff_t, int);
+
+extern void StartRestoreLOs(ArchiveHandle *AH);
+extern void StartRestoreLO(ArchiveHandle *AH, Oid oid, bool drop);
+extern void EndRestoreLO(ArchiveHandle *AH, Oid oid);
+extern void EndRestoreLOs(ArchiveHandle *AH);
+
+extern void InitArchiveFmt_Custom(ArchiveHandle *AH);
+extern void InitArchiveFmt_Null(ArchiveHandle *AH);
+extern void InitArchiveFmt_Directory(ArchiveHandle *AH);
+extern void InitArchiveFmt_Tar(ArchiveHandle *AH);
+
+extern bool isValidTarHeader(char *header);
+
+extern void ReconnectToServer(ArchiveHandle *AH, const char *dbname);
+extern void DropLOIfExists(ArchiveHandle *AH, Oid oid);
+
+void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH);
+int ahprintf(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3);
+
+#endif
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
new file mode 100644
index 0000000..b576b29
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -0,0 +1,1031 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_custom.c
+ *
+ * Implements the custom output format.
+ *
+ * The comments with the routines in this code are a good place to
+ * understand how to write a new format.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * and any liability will be limited to the time taken to fix any
+ * related bug.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_custom.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "common/file_utils.h"
+#include "compress_io.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+/*--------
+ * Routines in the format interface
+ *--------
+ */
+
+static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
+static void _StartData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static int _ReadByte(ArchiveHandle *AH);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _ReopenArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
+
+static void _PrintData(ArchiveHandle *AH);
+static void _skipData(ArchiveHandle *AH);
+static void _skipLOs(ArchiveHandle *AH);
+
+static void _StartLOs(ArchiveHandle *AH, TocEntry *te);
+static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLOs(ArchiveHandle *AH, TocEntry *te);
+static void _LoadLOs(ArchiveHandle *AH, bool drop);
+
+static void _PrepParallelRestore(ArchiveHandle *AH);
+static void _Clone(ArchiveHandle *AH);
+static void _DeClone(ArchiveHandle *AH);
+
+static int _WorkerJobRestoreCustom(ArchiveHandle *AH, TocEntry *te);
+
+typedef struct
+{
+ CompressorState *cs;
+ int hasSeek;
+ /* lastFilePos is used only when reading, and may be invalid if !hasSeek */
+ pgoff_t lastFilePos; /* position after last data block we've read */
+} lclContext;
+
+typedef struct
+{
+ int dataState;
+ pgoff_t dataPos; /* valid only if dataState=K_OFFSET_POS_SET */
+} lclTocEntry;
+
+
+/*------
+ * Static declarations
+ *------
+ */
+static void _readBlockHeader(ArchiveHandle *AH, int *type, int *id);
+static pgoff_t _getFilePos(ArchiveHandle *AH, lclContext *ctx);
+
+static void _CustomWriteFunc(ArchiveHandle *AH, const char *buf, size_t len);
+static size_t _CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen);
+
+
+/*
+ * Init routine required by ALL formats. This is a global routine
+ * and should be declared in pg_backup_archiver.h
+ *
+ * It's task is to create any extra archive context (using AH->formatData),
+ * and to initialize the supported function pointers.
+ *
+ * It should also prepare whatever its input source is for reading/writing,
+ * and in the case of a read mode connection, it should load the Header & TOC.
+ */
+void
+InitArchiveFmt_Custom(ArchiveHandle *AH)
+{
+ lclContext *ctx;
+
+ /* Assuming static functions, this can be copied for each format. */
+ AH->ArchiveEntryPtr = _ArchiveEntry;
+ AH->StartDataPtr = _StartData;
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->ReadBytePtr = _ReadByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ReadBufPtr = _ReadBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = _ReopenArchive;
+ AH->PrintTocDataPtr = _PrintTocData;
+ AH->ReadExtraTocPtr = _ReadExtraToc;
+ AH->WriteExtraTocPtr = _WriteExtraToc;
+ AH->PrintExtraTocPtr = _PrintExtraToc;
+
+ AH->StartLOsPtr = _StartLOs;
+ AH->StartLOPtr = _StartLO;
+ AH->EndLOPtr = _EndLO;
+ AH->EndLOsPtr = _EndLOs;
+
+ AH->PrepParallelRestorePtr = _PrepParallelRestore;
+ AH->ClonePtr = _Clone;
+ AH->DeClonePtr = _DeClone;
+
+ /* no parallel dump in the custom archive, only parallel restore */
+ AH->WorkerJobDumpPtr = NULL;
+ AH->WorkerJobRestorePtr = _WorkerJobRestoreCustom;
+
+ /* Set up a private area. */
+ ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
+ AH->formatData = (void *) ctx;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now open the file
+ */
+ if (AH->mode == archModeWrite)
+ {
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ AH->FH = fopen(AH->fSpec, PG_BINARY_W);
+ if (!AH->FH)
+ pg_fatal("could not open output file \"%s\": %m", AH->fSpec);
+ }
+ else
+ {
+ AH->FH = stdout;
+ if (!AH->FH)
+ pg_fatal("could not open output file: %m");
+ }
+
+ ctx->hasSeek = checkSeek(AH->FH);
+ }
+ else
+ {
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ AH->FH = fopen(AH->fSpec, PG_BINARY_R);
+ if (!AH->FH)
+ pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
+ }
+ else
+ {
+ AH->FH = stdin;
+ if (!AH->FH)
+ pg_fatal("could not open input file: %m");
+ }
+
+ ctx->hasSeek = checkSeek(AH->FH);
+
+ ReadHead(AH);
+ ReadToc(AH);
+
+ /*
+ * Remember location of first data block (i.e., the point after TOC)
+ * in case we have to search for desired data blocks.
+ */
+ ctx->lastFilePos = _getFilePos(AH, ctx);
+ }
+}
+
+/*
+ * Called by the Archiver when the dumper creates a new TOC entry.
+ *
+ * Optional.
+ *
+ * Set up extract format-related TOC data.
+*/
+static void
+_ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx;
+
+ ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ if (te->dataDumper)
+ ctx->dataState = K_OFFSET_POS_NOT_SET;
+ else
+ ctx->dataState = K_OFFSET_NO_DATA;
+
+ te->formatData = (void *) ctx;
+}
+
+/*
+ * Called by the Archiver to save any extra format-related TOC entry
+ * data.
+ *
+ * Optional.
+ *
+ * Use the Archiver routines to write data - they are non-endian, and
+ * maintain other important file information.
+ */
+static void
+_WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ WriteOffset(AH, ctx->dataPos, ctx->dataState);
+}
+
+/*
+ * Called by the Archiver to read any extra format-related TOC data.
+ *
+ * Optional.
+ *
+ * Needs to match the order defined in _WriteExtraToc, and should also
+ * use the Archiver input routines.
+ */
+static void
+_ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (ctx == NULL)
+ {
+ ctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ te->formatData = (void *) ctx;
+ }
+
+ ctx->dataState = ReadOffset(AH, &(ctx->dataPos));
+
+ /*
+ * Prior to V1.7 (pg7.3), we dumped the data size as an int now we don't
+ * dump it at all.
+ */
+ if (AH->version < K_VERS_1_7)
+ ReadInt(AH);
+}
+
+/*
+ * Called by the Archiver when restoring an archive to output a comment
+ * that includes useful information about the TOC entry.
+ *
+ * Optional.
+ */
+static void
+_PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (AH->public.verbose)
+ ahprintf(AH, "-- Data Pos: " INT64_FORMAT "\n",
+ (int64) ctx->dataPos);
+}
+
+/*
+ * Called by the archiver when saving TABLE DATA (not schema). This routine
+ * should save whatever format-specific information is needed to read
+ * the archive back.
+ *
+ * It is called just prior to the dumper's 'DataDumper' routine being called.
+ *
+ * Optional, but strongly recommended.
+ *
+ */
+static void
+_StartData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tctx->dataPos = _getFilePos(AH, ctx);
+ if (tctx->dataPos >= 0)
+ tctx->dataState = K_OFFSET_POS_SET;
+
+ _WriteByte(AH, BLK_DATA); /* Block type */
+ WriteInt(AH, te->dumpId); /* For sanity check */
+
+ ctx->cs = AllocateCompressor(AH->compression_spec,
+ NULL,
+ _CustomWriteFunc);
+}
+
+/*
+ * Called by archiver when dumper calls WriteData. This routine is
+ * called for both LO and table data; it is the responsibility of
+ * the format to manage each kind of data using StartLO/StartData.
+ *
+ * It should only be called from within a DataDumper routine.
+ *
+ * Mandatory.
+ */
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressorState *cs = ctx->cs;
+
+ if (dLen > 0)
+ /* writeData() internally throws write errors */
+ cs->writeData(AH, cs, data, dLen);
+}
+
+/*
+ * Called by the archiver when a dumper's 'DataDumper' routine has
+ * finished.
+ *
+ * Mandatory.
+ */
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ EndCompressor(AH, ctx->cs);
+ ctx->cs = NULL;
+
+ /* Send the end marker */
+ WriteInt(AH, 0);
+}
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * This routine should save whatever format-specific information is needed
+ * to read the LOs back into memory.
+ *
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * Optional, but strongly recommended.
+ */
+static void
+_StartLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tctx->dataPos = _getFilePos(AH, ctx);
+ if (tctx->dataPos >= 0)
+ tctx->dataState = K_OFFSET_POS_SET;
+
+ _WriteByte(AH, BLK_BLOBS); /* Block type */
+ WriteInt(AH, te->dumpId); /* For sanity check */
+}
+
+/*
+ * Called by the archiver when the dumper calls StartLO.
+ *
+ * Mandatory.
+ *
+ * Must save the passed OID for retrieval at restore-time.
+ */
+static void
+_StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (oid == 0)
+ pg_fatal("invalid OID for large object");
+
+ WriteInt(AH, oid);
+
+ ctx->cs = AllocateCompressor(AH->compression_spec,
+ NULL,
+ _CustomWriteFunc);
+}
+
+/*
+ * Called by the archiver when the dumper calls EndLO.
+ *
+ * Optional.
+ */
+static void
+_EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ EndCompressor(AH, ctx->cs);
+ /* Send the end marker */
+ WriteInt(AH, 0);
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * Optional.
+ */
+static void
+_EndLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ /* Write out a fake zero OID to mark end-of-LOs. */
+ WriteInt(AH, 0);
+}
+
+/*
+ * Print data for a given TOC entry
+ */
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ int blkType;
+ int id;
+
+ if (tctx->dataState == K_OFFSET_NO_DATA)
+ return;
+
+ if (!ctx->hasSeek || tctx->dataState == K_OFFSET_POS_NOT_SET)
+ {
+ /*
+ * We cannot seek directly to the desired block. Instead, skip over
+ * block headers until we find the one we want. Remember the
+ * positions of skipped-over blocks, so that if we later decide we
+ * need to read one, we'll be able to seek to it.
+ *
+ * When our input file is seekable, we can do the search starting from
+ * the point after the last data block we scanned in previous
+ * iterations of this function.
+ */
+ if (ctx->hasSeek)
+ {
+ if (fseeko(AH->FH, ctx->lastFilePos, SEEK_SET) != 0)
+ pg_fatal("error during file seek: %m");
+ }
+
+ for (;;)
+ {
+ pgoff_t thisBlkPos = _getFilePos(AH, ctx);
+
+ _readBlockHeader(AH, &blkType, &id);
+
+ if (blkType == EOF || id == te->dumpId)
+ break;
+
+ /* Remember the block position, if we got one */
+ if (thisBlkPos >= 0)
+ {
+ TocEntry *otherte = getTocEntryByDumpId(AH, id);
+
+ if (otherte && otherte->formatData)
+ {
+ lclTocEntry *othertctx = (lclTocEntry *) otherte->formatData;
+
+ /*
+ * Note: on Windows, multiple threads might access/update
+ * the same lclTocEntry concurrently, but that should be
+ * safe as long as we update dataPos before dataState.
+ * Ideally, we'd use pg_write_barrier() to enforce that,
+ * but the needed infrastructure doesn't exist in frontend
+ * code. But Windows only runs on machines with strong
+ * store ordering, so it should be okay for now.
+ */
+ if (othertctx->dataState == K_OFFSET_POS_NOT_SET)
+ {
+ othertctx->dataPos = thisBlkPos;
+ othertctx->dataState = K_OFFSET_POS_SET;
+ }
+ else if (othertctx->dataPos != thisBlkPos ||
+ othertctx->dataState != K_OFFSET_POS_SET)
+ {
+ /* sanity check */
+ pg_log_warning("data block %d has wrong seek position",
+ id);
+ }
+ }
+ }
+
+ switch (blkType)
+ {
+ case BLK_DATA:
+ _skipData(AH);
+ break;
+
+ case BLK_BLOBS:
+ _skipLOs(AH);
+ break;
+
+ default: /* Always have a default */
+ pg_fatal("unrecognized data block type (%d) while searching archive",
+ blkType);
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* We can just seek to the place we need to be. */
+ if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0)
+ pg_fatal("error during file seek: %m");
+
+ _readBlockHeader(AH, &blkType, &id);
+ }
+
+ /*
+ * If we reached EOF without finding the block we want, then either it
+ * doesn't exist, or it does but we lack the ability to seek back to it.
+ */
+ if (blkType == EOF)
+ {
+ if (!ctx->hasSeek)
+ pg_fatal("could not find block ID %d in archive -- "
+ "possibly due to out-of-order restore request, "
+ "which cannot be handled due to non-seekable input file",
+ te->dumpId);
+ else
+ pg_fatal("could not find block ID %d in archive -- "
+ "possibly corrupt archive",
+ te->dumpId);
+ }
+
+ /* Are we sane? */
+ if (id != te->dumpId)
+ pg_fatal("found unexpected block ID (%d) when reading data -- expected %d",
+ id, te->dumpId);
+
+ switch (blkType)
+ {
+ case BLK_DATA:
+ _PrintData(AH);
+ break;
+
+ case BLK_BLOBS:
+ _LoadLOs(AH, AH->public.ropt->dropSchema);
+ break;
+
+ default: /* Always have a default */
+ pg_fatal("unrecognized data block type %d while restoring archive",
+ blkType);
+ break;
+ }
+
+ /*
+ * If our input file is seekable but lacks data offsets, update our
+ * knowledge of where to start future searches from. (Note that we did
+ * not update the current TE's dataState/dataPos. We could have, but
+ * there is no point since it will not be visited again.)
+ */
+ if (ctx->hasSeek && tctx->dataState == K_OFFSET_POS_NOT_SET)
+ {
+ pgoff_t curPos = _getFilePos(AH, ctx);
+
+ if (curPos > ctx->lastFilePos)
+ ctx->lastFilePos = curPos;
+ }
+}
+
+/*
+ * Print data from current file position.
+*/
+static void
+_PrintData(ArchiveHandle *AH)
+{
+ CompressorState *cs;
+
+ cs = AllocateCompressor(AH->compression_spec,
+ _CustomReadFunc, NULL);
+ cs->readData(AH, cs);
+ EndCompressor(AH, cs);
+}
+
+static void
+_LoadLOs(ArchiveHandle *AH, bool drop)
+{
+ Oid oid;
+
+ StartRestoreLOs(AH);
+
+ oid = ReadInt(AH);
+ while (oid != 0)
+ {
+ StartRestoreLO(AH, oid, drop);
+ _PrintData(AH);
+ EndRestoreLO(AH, oid);
+ oid = ReadInt(AH);
+ }
+
+ EndRestoreLOs(AH);
+}
+
+/*
+ * Skip the LOs from the current file position.
+ * LOs are written sequentially as data blocks (see below).
+ * Each LO is preceded by its original OID.
+ * A zero OID indicates the end of the LOs.
+ */
+static void
+_skipLOs(ArchiveHandle *AH)
+{
+ Oid oid;
+
+ oid = ReadInt(AH);
+ while (oid != 0)
+ {
+ _skipData(AH);
+ oid = ReadInt(AH);
+ }
+}
+
+/*
+ * Skip data from current file position.
+ * Data blocks are formatted as an integer length, followed by data.
+ * A zero length indicates the end of the block.
+*/
+static void
+_skipData(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ size_t blkLen;
+ char *buf = NULL;
+ int buflen = 0;
+
+ blkLen = ReadInt(AH);
+ while (blkLen != 0)
+ {
+ if (ctx->hasSeek)
+ {
+ if (fseeko(AH->FH, blkLen, SEEK_CUR) != 0)
+ pg_fatal("error during file seek: %m");
+ }
+ else
+ {
+ if (blkLen > buflen)
+ {
+ free(buf);
+ buf = (char *) pg_malloc(blkLen);
+ buflen = blkLen;
+ }
+ if (fread(buf, 1, blkLen, AH->FH) != blkLen)
+ {
+ if (feof(AH->FH))
+ pg_fatal("could not read from input file: end of file");
+ else
+ pg_fatal("could not read from input file: %m");
+ }
+ }
+
+ blkLen = ReadInt(AH);
+ }
+
+ free(buf);
+}
+
+/*
+ * Write a byte of data to the archive.
+ *
+ * Mandatory.
+ *
+ * Called by the archiver to do integer & byte output to the archive.
+ */
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ if (fputc(i, AH->FH) == EOF)
+ WRITE_ERROR_EXIT;
+
+ return 1;
+}
+
+/*
+ * Read a byte of data from the archive.
+ *
+ * Mandatory
+ *
+ * Called by the archiver to read bytes & integers from the archive.
+ * EOF should be treated as a fatal error.
+ */
+static int
+_ReadByte(ArchiveHandle *AH)
+{
+ int res;
+
+ res = getc(AH->FH);
+ if (res == EOF)
+ READ_ERROR_EXIT(AH->FH);
+ return res;
+}
+
+/*
+ * Write a buffer of data to the archive.
+ *
+ * Mandatory.
+ *
+ * Called by the archiver to write a block of bytes to the archive.
+ */
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ if (fwrite(buf, 1, len, AH->FH) != len)
+ WRITE_ERROR_EXIT;
+}
+
+/*
+ * Read a block of bytes from the archive.
+ *
+ * Mandatory.
+ *
+ * Called by the archiver to read a block of bytes from the archive
+ */
+static void
+_ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
+{
+ if (fread(buf, 1, len, AH->FH) != len)
+ READ_ERROR_EXIT(AH->FH);
+}
+
+/*
+ * Close the archive.
+ *
+ * Mandatory.
+ *
+ * When writing the archive, this is the routine that actually starts
+ * the process of saving it to files. No data should be written prior
+ * to this point, since the user could sort the TOC after creating it.
+ *
+ * If an archive is to be written, this routine must call:
+ * WriteHead to save the archive header
+ * WriteToc to save the TOC entries
+ * WriteDataChunks to save all data & LOs.
+ *
+ */
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ pgoff_t tpos;
+
+ if (AH->mode == archModeWrite)
+ {
+ WriteHead(AH);
+ /* Remember TOC's seek position for use below */
+ tpos = ftello(AH->FH);
+ if (tpos < 0 && ctx->hasSeek)
+ pg_fatal("could not determine seek position in archive file: %m");
+ WriteToc(AH);
+ WriteDataChunks(AH, NULL);
+
+ /*
+ * If possible, re-write the TOC in order to update the data offset
+ * information. This is not essential, as pg_restore can cope in most
+ * cases without it; but it can make pg_restore significantly faster
+ * in some situations (especially parallel restore).
+ */
+ if (ctx->hasSeek &&
+ fseeko(AH->FH, tpos, SEEK_SET) == 0)
+ WriteToc(AH);
+ }
+
+ if (fclose(AH->FH) != 0)
+ pg_fatal("could not close archive file: %m");
+
+ /* Sync the output file if one is defined */
+ if (AH->dosync && AH->mode == archModeWrite && AH->fSpec)
+ (void) fsync_fname(AH->fSpec, false);
+
+ AH->FH = NULL;
+}
+
+/*
+ * Reopen the archive's file handle.
+ *
+ * We close the original file handle, except on Windows. (The difference
+ * is because on Windows, this is used within a multithreading context,
+ * and we don't want a thread closing the parent file handle.)
+ */
+static void
+_ReopenArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ pgoff_t tpos;
+
+ if (AH->mode == archModeWrite)
+ pg_fatal("can only reopen input archives");
+
+ /*
+ * These two cases are user-facing errors since they represent unsupported
+ * (but not invalid) use-cases. Word the error messages appropriately.
+ */
+ if (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0)
+ pg_fatal("parallel restore from standard input is not supported");
+ if (!ctx->hasSeek)
+ pg_fatal("parallel restore from non-seekable file is not supported");
+
+ tpos = ftello(AH->FH);
+ if (tpos < 0)
+ pg_fatal("could not determine seek position in archive file: %m");
+
+#ifndef WIN32
+ if (fclose(AH->FH) != 0)
+ pg_fatal("could not close archive file: %m");
+#endif
+
+ AH->FH = fopen(AH->fSpec, PG_BINARY_R);
+ if (!AH->FH)
+ pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
+
+ if (fseeko(AH->FH, tpos, SEEK_SET) != 0)
+ pg_fatal("could not set seek position in archive file: %m");
+}
+
+/*
+ * Prepare for parallel restore.
+ *
+ * The main thing that needs to happen here is to fill in TABLE DATA and BLOBS
+ * TOC entries' dataLength fields with appropriate values to guide the
+ * ordering of restore jobs. The source of said data is format-dependent,
+ * as is the exact meaning of the values.
+ *
+ * A format module might also choose to do other setup here.
+ */
+static void
+_PrepParallelRestore(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TocEntry *prev_te = NULL;
+ lclTocEntry *prev_tctx = NULL;
+ TocEntry *te;
+
+ /*
+ * Knowing that the data items were dumped out in TOC order, we can
+ * reconstruct the length of each item as the delta to the start offset of
+ * the next data item.
+ */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ /*
+ * Ignore entries without a known data offset; if we were unable to
+ * seek to rewrite the TOC when creating the archive, this'll be all
+ * of them, and we'll end up with no size estimates.
+ */
+ if (tctx->dataState != K_OFFSET_POS_SET)
+ continue;
+
+ /* Compute previous data item's length */
+ if (prev_te)
+ {
+ if (tctx->dataPos > prev_tctx->dataPos)
+ prev_te->dataLength = tctx->dataPos - prev_tctx->dataPos;
+ }
+
+ prev_te = te;
+ prev_tctx = tctx;
+ }
+
+ /* If OK to seek, we can determine the length of the last item */
+ if (prev_te && ctx->hasSeek)
+ {
+ pgoff_t endpos;
+
+ if (fseeko(AH->FH, 0, SEEK_END) != 0)
+ pg_fatal("error during file seek: %m");
+ endpos = ftello(AH->FH);
+ if (endpos > prev_tctx->dataPos)
+ prev_te->dataLength = endpos - prev_tctx->dataPos;
+ }
+}
+
+/*
+ * Clone format-specific fields during parallel restoration.
+ */
+static void
+_Clone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /*
+ * Each thread must have private lclContext working state.
+ */
+ AH->formatData = (lclContext *) pg_malloc(sizeof(lclContext));
+ memcpy(AH->formatData, ctx, sizeof(lclContext));
+ ctx = (lclContext *) AH->formatData;
+
+ /* sanity check, shouldn't happen */
+ if (ctx->cs != NULL)
+ pg_fatal("compressor active");
+
+ /*
+ * We intentionally do not clone TOC-entry-local state: it's useful to
+ * share knowledge about where the data blocks are across threads.
+ * _PrintTocData has to be careful about the order of operations on that
+ * state, though.
+ *
+ * Note: we do not make a local lo_buf because we expect at most one BLOBS
+ * entry per archive, so no parallelism is possible.
+ */
+}
+
+static void
+_DeClone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ free(ctx);
+}
+
+/*
+ * This function is executed in the child of a parallel restore from a
+ * custom-format archive and restores the actual data for one TOC entry.
+ */
+static int
+_WorkerJobRestoreCustom(ArchiveHandle *AH, TocEntry *te)
+{
+ return parallel_restore(AH, te);
+}
+
+/*--------------------------------------------------
+ * END OF FORMAT CALLBACKS
+ *--------------------------------------------------
+ */
+
+/*
+ * Get the current position in the archive file.
+ *
+ * With a non-seekable archive file, we may not be able to obtain the
+ * file position. If so, just return -1. It's not too important in
+ * that case because we won't be able to rewrite the TOC to fill in
+ * data block offsets anyway.
+ */
+static pgoff_t
+_getFilePos(ArchiveHandle *AH, lclContext *ctx)
+{
+ pgoff_t pos;
+
+ pos = ftello(AH->FH);
+ if (pos < 0)
+ {
+ /* Not expected if we found we can seek. */
+ if (ctx->hasSeek)
+ pg_fatal("could not determine seek position in archive file: %m");
+ }
+ return pos;
+}
+
+/*
+ * Read a data block header. The format changed in V1.3, so we
+ * centralize the code here for simplicity. Returns *type = EOF
+ * if at EOF.
+ */
+static void
+_readBlockHeader(ArchiveHandle *AH, int *type, int *id)
+{
+ int byt;
+
+ /*
+ * Note: if we are at EOF with a pre-1.3 input file, we'll pg_fatal()
+ * inside ReadInt rather than returning EOF. It doesn't seem worth
+ * jumping through hoops to deal with that case better, because no such
+ * files are likely to exist in the wild: only some 7.1 development
+ * versions of pg_dump ever generated such files.
+ */
+ if (AH->version < K_VERS_1_3)
+ *type = BLK_DATA;
+ else
+ {
+ byt = getc(AH->FH);
+ *type = byt;
+ if (byt == EOF)
+ {
+ *id = 0; /* don't return an uninitialized value */
+ return;
+ }
+ }
+
+ *id = ReadInt(AH);
+}
+
+/*
+ * Callback function for writeData. Writes one block of (compressed)
+ * data to the archive.
+ */
+static void
+_CustomWriteFunc(ArchiveHandle *AH, const char *buf, size_t len)
+{
+ /* never write 0-byte blocks (this should not happen) */
+ if (len > 0)
+ {
+ WriteInt(AH, len);
+ _WriteBuf(AH, buf, len);
+ }
+}
+
+/*
+ * Callback function for readData. To keep things simple, we
+ * always read one compressed block at a time.
+ */
+static size_t
+_CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen)
+{
+ size_t blkLen;
+
+ /* Read length */
+ blkLen = ReadInt(AH);
+ if (blkLen == 0)
+ return 0;
+
+ /* If the caller's buffer is not large enough, allocate a bigger one */
+ if (blkLen > *buflen)
+ {
+ free(*buf);
+ *buf = (char *) pg_malloc(blkLen);
+ *buflen = blkLen;
+ }
+
+ /* exits app on read errors */
+ _ReadBuf(AH, *buf, blkLen);
+
+ return blkLen;
+}
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
new file mode 100644
index 0000000..f766b65
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -0,0 +1,569 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_db.c
+ *
+ * Implements the basic DB functions used by the archiver.
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_db.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <unistd.h>
+#include <ctype.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "common/connect.h"
+#include "common/string.h"
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+#include "parallel.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_db.h"
+#include "pg_backup_utils.h"
+
+static void _check_database_version(ArchiveHandle *AH);
+static void notice_processor(void *arg, const char *message);
+
+static void
+_check_database_version(ArchiveHandle *AH)
+{
+ const char *remoteversion_str;
+ int remoteversion;
+ PGresult *res;
+
+ remoteversion_str = PQparameterStatus(AH->connection, "server_version");
+ remoteversion = PQserverVersion(AH->connection);
+ if (remoteversion == 0 || !remoteversion_str)
+ pg_fatal("could not get server_version from libpq");
+
+ AH->public.remoteVersionStr = pg_strdup(remoteversion_str);
+ AH->public.remoteVersion = remoteversion;
+ if (!AH->archiveRemoteVersion)
+ AH->archiveRemoteVersion = AH->public.remoteVersionStr;
+
+ if (remoteversion != PG_VERSION_NUM
+ && (remoteversion < AH->public.minRemoteVersion ||
+ remoteversion > AH->public.maxRemoteVersion))
+ {
+ pg_log_error("aborting because of server version mismatch");
+ pg_log_error_detail("server version: %s; %s version: %s",
+ remoteversion_str, progname, PG_VERSION);
+ exit(1);
+ }
+
+ /*
+ * Check if server is in recovery mode, which means we are on a hot
+ * standby.
+ */
+ res = ExecuteSqlQueryForSingleRow((Archive *) AH,
+ "SELECT pg_catalog.pg_is_in_recovery()");
+ AH->public.isStandby = (strcmp(PQgetvalue(res, 0, 0), "t") == 0);
+ PQclear(res);
+}
+
+/*
+ * Reconnect to the server. If dbname is not NULL, use that database,
+ * else the one associated with the archive handle.
+ */
+void
+ReconnectToServer(ArchiveHandle *AH, const char *dbname)
+{
+ PGconn *oldConn = AH->connection;
+ RestoreOptions *ropt = AH->public.ropt;
+
+ /*
+ * Save the dbname, if given, in override_dbname so that it will also
+ * affect any later reconnection attempt.
+ */
+ if (dbname)
+ ropt->cparams.override_dbname = pg_strdup(dbname);
+
+ /*
+ * Note: we want to establish the new connection, and in particular update
+ * ArchiveHandle's connCancel, before closing old connection. Otherwise
+ * an ill-timed SIGINT could try to access a dead connection.
+ */
+ AH->connection = NULL; /* dodge error check in ConnectDatabase */
+
+ ConnectDatabase((Archive *) AH, &ropt->cparams, true);
+
+ PQfinish(oldConn);
+}
+
+/*
+ * Make, or remake, a database connection with the given parameters.
+ *
+ * The resulting connection handle is stored in AHX->connection.
+ *
+ * An interactive password prompt is automatically issued if required.
+ * We store the results of that in AHX->savedPassword.
+ * Note: it's not really all that sensible to use a single-entry password
+ * cache if the username keeps changing. In current usage, however, the
+ * username never does change, so one savedPassword is sufficient.
+ */
+void
+ConnectDatabase(Archive *AHX,
+ const ConnParams *cparams,
+ bool isReconnect)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ trivalue prompt_password;
+ char *password;
+ bool new_pass;
+
+ if (AH->connection)
+ pg_fatal("already connected to a database");
+
+ /* Never prompt for a password during a reconnection */
+ prompt_password = isReconnect ? TRI_NO : cparams->promptPassword;
+
+ password = AH->savedPassword;
+
+ if (prompt_password == TRI_YES && password == NULL)
+ password = simple_prompt("Password: ", false);
+
+ /*
+ * Start the connection. Loop until we have a password if requested by
+ * backend.
+ */
+ do
+ {
+ const char *keywords[8];
+ const char *values[8];
+ int i = 0;
+
+ /*
+ * If dbname is a connstring, its entries can override the other
+ * values obtained from cparams; but in turn, override_dbname can
+ * override the dbname component of it.
+ */
+ keywords[i] = "host";
+ values[i++] = cparams->pghost;
+ keywords[i] = "port";
+ values[i++] = cparams->pgport;
+ keywords[i] = "user";
+ values[i++] = cparams->username;
+ keywords[i] = "password";
+ values[i++] = password;
+ keywords[i] = "dbname";
+ values[i++] = cparams->dbname;
+ if (cparams->override_dbname)
+ {
+ keywords[i] = "dbname";
+ values[i++] = cparams->override_dbname;
+ }
+ keywords[i] = "fallback_application_name";
+ values[i++] = progname;
+ keywords[i] = NULL;
+ values[i++] = NULL;
+ Assert(i <= lengthof(keywords));
+
+ new_pass = false;
+ AH->connection = PQconnectdbParams(keywords, values, true);
+
+ if (!AH->connection)
+ pg_fatal("could not connect to database");
+
+ if (PQstatus(AH->connection) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(AH->connection) &&
+ password == NULL &&
+ prompt_password != TRI_NO)
+ {
+ PQfinish(AH->connection);
+ password = simple_prompt("Password: ", false);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ /* check to see that the backend connection was successfully made */
+ if (PQstatus(AH->connection) == CONNECTION_BAD)
+ {
+ if (isReconnect)
+ pg_fatal("reconnection failed: %s",
+ PQerrorMessage(AH->connection));
+ else
+ pg_fatal("%s",
+ PQerrorMessage(AH->connection));
+ }
+
+ /* Start strict; later phases may override this. */
+ PQclear(ExecuteSqlQueryForSingleRow((Archive *) AH,
+ ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ if (password && password != AH->savedPassword)
+ free(password);
+
+ /*
+ * We want to remember connection's actual password, whether or not we got
+ * it by prompting. So we don't just store the password variable.
+ */
+ if (PQconnectionUsedPassword(AH->connection))
+ {
+ free(AH->savedPassword);
+ AH->savedPassword = pg_strdup(PQpass(AH->connection));
+ }
+
+ /* check for version mismatch */
+ _check_database_version(AH);
+
+ PQsetNoticeProcessor(AH->connection, notice_processor, NULL);
+
+ /* arrange for SIGINT to issue a query cancel on this connection */
+ set_archive_cancel_info(AH, AH->connection);
+}
+
+/*
+ * Close the connection to the database and also cancel off the query if we
+ * have one running.
+ */
+void
+DisconnectDatabase(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ char errbuf[1];
+
+ if (!AH->connection)
+ return;
+
+ if (AH->connCancel)
+ {
+ /*
+ * If we have an active query, send a cancel before closing, ignoring
+ * any errors. This is of no use for a normal exit, but might be
+ * helpful during pg_fatal().
+ */
+ if (PQtransactionStatus(AH->connection) == PQTRANS_ACTIVE)
+ (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
+
+ /*
+ * Prevent signal handler from sending a cancel after this.
+ */
+ set_archive_cancel_info(AH, NULL);
+ }
+
+ PQfinish(AH->connection);
+ AH->connection = NULL;
+}
+
+PGconn *
+GetConnection(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ return AH->connection;
+}
+
+static void
+notice_processor(void *arg, const char *message)
+{
+ pg_log_info("%s", message);
+}
+
+/* Like pg_fatal(), but with a complaint about a particular query. */
+static void
+die_on_query_failure(ArchiveHandle *AH, const char *query)
+{
+ pg_log_error("query failed: %s",
+ PQerrorMessage(AH->connection));
+ pg_log_error_detail("Query was: %s", query);
+ exit(1);
+}
+
+void
+ExecuteSqlStatement(Archive *AHX, const char *query)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ PGresult *res;
+
+ res = PQexec(AH->connection, query);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ die_on_query_failure(AH, query);
+ PQclear(res);
+}
+
+PGresult *
+ExecuteSqlQuery(Archive *AHX, const char *query, ExecStatusType status)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+ PGresult *res;
+
+ res = PQexec(AH->connection, query);
+ if (PQresultStatus(res) != status)
+ die_on_query_failure(AH, query);
+ return res;
+}
+
+/*
+ * Execute an SQL query and verify that we got exactly one row back.
+ */
+PGresult *
+ExecuteSqlQueryForSingleRow(Archive *fout, const char *query)
+{
+ PGresult *res;
+ int ntups;
+
+ res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);
+
+ /* Expecting a single result only */
+ ntups = PQntuples(res);
+ if (ntups != 1)
+ pg_fatal(ngettext("query returned %d row instead of one: %s",
+ "query returned %d rows instead of one: %s",
+ ntups),
+ ntups, query);
+
+ return res;
+}
+
+/*
+ * Convenience function to send a query.
+ * Monitors result to detect COPY statements
+ */
+static void
+ExecuteSqlCommand(ArchiveHandle *AH, const char *qry, const char *desc)
+{
+ PGconn *conn = AH->connection;
+ PGresult *res;
+
+#ifdef NOT_USED
+ fprintf(stderr, "Executing: '%s'\n\n", qry);
+#endif
+ res = PQexec(conn, qry);
+
+ switch (PQresultStatus(res))
+ {
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ case PGRES_EMPTY_QUERY:
+ /* A-OK */
+ break;
+ case PGRES_COPY_IN:
+ /* Assume this is an expected result */
+ AH->pgCopyIn = true;
+ break;
+ default:
+ /* trouble */
+ warn_or_exit_horribly(AH, "%s: %sCommand was: %s",
+ desc, PQerrorMessage(conn), qry);
+ break;
+ }
+
+ PQclear(res);
+}
+
+
+/*
+ * Process non-COPY table data (that is, INSERT commands).
+ *
+ * The commands have been run together as one long string for compressibility,
+ * and we are receiving them in bufferloads with arbitrary boundaries, so we
+ * have to locate command boundaries and save partial commands across calls.
+ * All state must be kept in AH->sqlparse, not in local variables of this
+ * routine. We assume that AH->sqlparse was filled with zeroes when created.
+ *
+ * We have to lex the data to the extent of identifying literals and quoted
+ * identifiers, so that we can recognize statement-terminating semicolons.
+ * We assume that INSERT data will not contain SQL comments, E'' literals,
+ * or dollar-quoted strings, so this is much simpler than a full SQL lexer.
+ *
+ * Note: when restoring from a pre-9.0 dump file, this code is also used to
+ * process BLOB COMMENTS data, which has the same problem of containing
+ * multiple SQL commands that might be split across bufferloads. Fortunately,
+ * that data won't contain anything complicated to lex either.
+ */
+static void
+ExecuteSimpleCommands(ArchiveHandle *AH, const char *buf, size_t bufLen)
+{
+ const char *qry = buf;
+ const char *eos = buf + bufLen;
+
+ /* initialize command buffer if first time through */
+ if (AH->sqlparse.curCmd == NULL)
+ AH->sqlparse.curCmd = createPQExpBuffer();
+
+ for (; qry < eos; qry++)
+ {
+ char ch = *qry;
+
+ /* For neatness, we skip any newlines between commands */
+ if (!(ch == '\n' && AH->sqlparse.curCmd->len == 0))
+ appendPQExpBufferChar(AH->sqlparse.curCmd, ch);
+
+ switch (AH->sqlparse.state)
+ {
+ case SQL_SCAN: /* Default state == 0, set in _allocAH */
+ if (ch == ';')
+ {
+ /*
+ * We've found the end of a statement. Send it and reset
+ * the buffer.
+ */
+ ExecuteSqlCommand(AH, AH->sqlparse.curCmd->data,
+ "could not execute query");
+ resetPQExpBuffer(AH->sqlparse.curCmd);
+ }
+ else if (ch == '\'')
+ {
+ AH->sqlparse.state = SQL_IN_SINGLE_QUOTE;
+ AH->sqlparse.backSlash = false;
+ }
+ else if (ch == '"')
+ {
+ AH->sqlparse.state = SQL_IN_DOUBLE_QUOTE;
+ }
+ break;
+
+ case SQL_IN_SINGLE_QUOTE:
+ /* We needn't handle '' specially */
+ if (ch == '\'' && !AH->sqlparse.backSlash)
+ AH->sqlparse.state = SQL_SCAN;
+ else if (ch == '\\' && !AH->public.std_strings)
+ AH->sqlparse.backSlash = !AH->sqlparse.backSlash;
+ else
+ AH->sqlparse.backSlash = false;
+ break;
+
+ case SQL_IN_DOUBLE_QUOTE:
+ /* We needn't handle "" specially */
+ if (ch == '"')
+ AH->sqlparse.state = SQL_SCAN;
+ break;
+ }
+ }
+}
+
+
+/*
+ * Implement ahwrite() for direct-to-DB restore
+ */
+int
+ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (AH->outputKind == OUTPUT_COPYDATA)
+ {
+ /*
+ * COPY data.
+ *
+ * We drop the data on the floor if libpq has failed to enter COPY
+ * mode; this allows us to behave reasonably when trying to continue
+ * after an error in a COPY command.
+ */
+ if (AH->pgCopyIn &&
+ PQputCopyData(AH->connection, buf, bufLen) <= 0)
+ pg_fatal("error returned by PQputCopyData: %s",
+ PQerrorMessage(AH->connection));
+ }
+ else if (AH->outputKind == OUTPUT_OTHERDATA)
+ {
+ /*
+ * Table data expressed as INSERT commands; or, in old dump files,
+ * BLOB COMMENTS data (which is expressed as COMMENT ON commands).
+ */
+ ExecuteSimpleCommands(AH, buf, bufLen);
+ }
+ else
+ {
+ /*
+ * General SQL commands; we assume that commands will not be split
+ * across calls.
+ *
+ * In most cases the data passed to us will be a null-terminated
+ * string, but if it's not, we have to add a trailing null.
+ */
+ if (buf[bufLen] == '\0')
+ ExecuteSqlCommand(AH, buf, "could not execute query");
+ else
+ {
+ char *str = (char *) pg_malloc(bufLen + 1);
+
+ memcpy(str, buf, bufLen);
+ str[bufLen] = '\0';
+ ExecuteSqlCommand(AH, str, "could not execute query");
+ free(str);
+ }
+ }
+
+ return bufLen;
+}
+
+/*
+ * Terminate a COPY operation during direct-to-DB restore
+ */
+void
+EndDBCopyMode(Archive *AHX, const char *tocEntryTag)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ if (AH->pgCopyIn)
+ {
+ PGresult *res;
+
+ if (PQputCopyEnd(AH->connection, NULL) <= 0)
+ pg_fatal("error returned by PQputCopyEnd: %s",
+ PQerrorMessage(AH->connection));
+
+ /* Check command status and return to normal libpq state */
+ res = PQgetResult(AH->connection);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ warn_or_exit_horribly(AH, "COPY failed for table \"%s\": %s",
+ tocEntryTag, PQerrorMessage(AH->connection));
+ PQclear(res);
+
+ /* Do this to ensure we've pumped libpq back to idle state */
+ if (PQgetResult(AH->connection) != NULL)
+ pg_log_warning("unexpected extra results during COPY of table \"%s\"",
+ tocEntryTag);
+
+ AH->pgCopyIn = false;
+ }
+}
+
+void
+StartTransaction(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ ExecuteSqlCommand(AH, "BEGIN", "could not start database transaction");
+}
+
+void
+CommitTransaction(Archive *AHX)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) AHX;
+
+ ExecuteSqlCommand(AH, "COMMIT", "could not commit database transaction");
+}
+
+void
+DropLOIfExists(ArchiveHandle *AH, Oid oid)
+{
+ /*
+ * If we are not restoring to a direct database connection, we have to
+ * guess about how to detect whether the LO exists. Assume new-style.
+ */
+ if (AH->connection == NULL ||
+ PQserverVersion(AH->connection) >= 90000)
+ {
+ ahprintf(AH,
+ "SELECT pg_catalog.lo_unlink(oid) "
+ "FROM pg_catalog.pg_largeobject_metadata "
+ "WHERE oid = '%u';\n",
+ oid);
+ }
+ else
+ {
+ /* Restoring to pre-9.0 server, so do it the old way */
+ ahprintf(AH,
+ "SELECT CASE WHEN EXISTS("
+ "SELECT 1 FROM pg_catalog.pg_largeobject WHERE loid = '%u'"
+ ") THEN pg_catalog.lo_unlink('%u') END;\n",
+ oid, oid);
+ }
+}
diff --git a/src/bin/pg_dump/pg_backup_db.h b/src/bin/pg_dump/pg_backup_db.h
new file mode 100644
index 0000000..8888dd3
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_db.h
@@ -0,0 +1,26 @@
+/*
+ * Definitions for pg_backup_db.c
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_db.h
+ */
+
+#ifndef PG_BACKUP_DB_H
+#define PG_BACKUP_DB_H
+
+#include "pg_backup.h"
+
+
+extern int ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen);
+
+extern void ExecuteSqlStatement(Archive *AHX, const char *query);
+extern PGresult *ExecuteSqlQuery(Archive *AHX, const char *query,
+ ExecStatusType status);
+extern PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, const char *query);
+
+extern void EndDBCopyMode(Archive *AHX, const char *tocEntryTag);
+
+extern void StartTransaction(Archive *AHX);
+extern void CommitTransaction(Archive *AHX);
+
+#endif
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
new file mode 100644
index 0000000..7f2ac7c
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -0,0 +1,871 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_directory.c
+ *
+ * A directory format dump is a directory, which contains a "toc.dat" file
+ * for the TOC, and a separate file for each data entry, named "<oid>.dat".
+ * Large objects are stored in separate files named "blob_<oid>.dat",
+ * and there's a plain-text TOC file for them called "blobs.toc". If
+ * compression is used, each data file is individually compressed and the
+ * ".gz" suffix is added to the filenames. The TOC files are never
+ * compressed by pg_dump, however they are accepted with the .gz suffix too,
+ * in case the user has manually compressed them with 'gzip'.
+ *
+ * NOTE: This format is identical to the files written in the tar file in
+ * the 'tar' format, except that we don't write the restore.sql file (TODO),
+ * and the tar format doesn't support compression. Please keep the formats in
+ * sync.
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ * Portions Copyright (c) 2000, Philip Warner
+ *
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_directory.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "common/file_utils.h"
+#include "compress_io.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+typedef struct
+{
+ /*
+ * Our archive location. This is basically what the user specified as his
+ * backup file but of course here it is a directory.
+ */
+ char *directory;
+
+ CompressFileHandle *dataFH; /* currently open data file */
+ CompressFileHandle *LOsTocFH; /* file handle for blobs.toc */
+ ParallelState *pstate; /* for parallel backup / restore */
+} lclContext;
+
+typedef struct
+{
+ char *filename; /* filename excluding the directory (basename) */
+} lclTocEntry;
+
+/* prototypes for private functions */
+static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
+static void _StartData(ArchiveHandle *AH, TocEntry *te);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static int _ReadByte(ArchiveHandle *AH);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _ReopenArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+
+static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
+
+static void _StartLOs(ArchiveHandle *AH, TocEntry *te);
+static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLOs(ArchiveHandle *AH, TocEntry *te);
+static void _LoadLOs(ArchiveHandle *AH);
+
+static void _PrepParallelRestore(ArchiveHandle *AH);
+static void _Clone(ArchiveHandle *AH);
+static void _DeClone(ArchiveHandle *AH);
+
+static int _WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te);
+static int _WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te);
+
+static void setFilePath(ArchiveHandle *AH, char *buf,
+ const char *relativeFilename);
+
+/*
+ * Init routine required by ALL formats. This is a global routine
+ * and should be declared in pg_backup_archiver.h
+ *
+ * Its task is to create any extra archive context (using AH->formatData),
+ * and to initialize the supported function pointers.
+ *
+ * It should also prepare whatever its input source is for reading/writing,
+ * and in the case of a read mode connection, it should load the Header & TOC.
+ */
+void
+InitArchiveFmt_Directory(ArchiveHandle *AH)
+{
+ lclContext *ctx;
+
+ /* Assuming static functions, this can be copied for each format. */
+ AH->ArchiveEntryPtr = _ArchiveEntry;
+ AH->StartDataPtr = _StartData;
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->ReadBytePtr = _ReadByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ReadBufPtr = _ReadBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = _ReopenArchive;
+ AH->PrintTocDataPtr = _PrintTocData;
+ AH->ReadExtraTocPtr = _ReadExtraToc;
+ AH->WriteExtraTocPtr = _WriteExtraToc;
+ AH->PrintExtraTocPtr = _PrintExtraToc;
+
+ AH->StartLOsPtr = _StartLOs;
+ AH->StartLOPtr = _StartLO;
+ AH->EndLOPtr = _EndLO;
+ AH->EndLOsPtr = _EndLOs;
+
+ AH->PrepParallelRestorePtr = _PrepParallelRestore;
+ AH->ClonePtr = _Clone;
+ AH->DeClonePtr = _DeClone;
+
+ AH->WorkerJobRestorePtr = _WorkerJobRestoreDirectory;
+ AH->WorkerJobDumpPtr = _WorkerJobDumpDirectory;
+
+ /* Set up our private context */
+ ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
+ AH->formatData = (void *) ctx;
+
+ ctx->dataFH = NULL;
+ ctx->LOsTocFH = NULL;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now open the TOC file
+ */
+
+ if (!AH->fSpec || strcmp(AH->fSpec, "") == 0)
+ pg_fatal("no output directory specified");
+
+ ctx->directory = AH->fSpec;
+
+ if (AH->mode == archModeWrite)
+ {
+ struct stat st;
+ bool is_empty = false;
+
+ /* we accept an empty existing directory */
+ if (stat(ctx->directory, &st) == 0 && S_ISDIR(st.st_mode))
+ {
+ DIR *dir = opendir(ctx->directory);
+
+ if (dir)
+ {
+ struct dirent *d;
+
+ is_empty = true;
+ while (errno = 0, (d = readdir(dir)))
+ {
+ if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0)
+ {
+ is_empty = false;
+ break;
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m",
+ ctx->directory);
+
+ if (closedir(dir))
+ pg_fatal("could not close directory \"%s\": %m",
+ ctx->directory);
+ }
+ }
+
+ if (!is_empty && mkdir(ctx->directory, 0700) < 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ ctx->directory);
+ }
+ else
+ { /* Read Mode */
+ char fname[MAXPGPATH];
+ CompressFileHandle *tocFH;
+
+ setFilePath(AH, fname, "toc.dat");
+
+ tocFH = InitDiscoverCompressFileHandle(fname, PG_BINARY_R);
+ if (tocFH == NULL)
+ pg_fatal("could not open input file \"%s\": %m", fname);
+
+ ctx->dataFH = tocFH;
+
+ /*
+ * The TOC of a directory format dump shares the format code of the
+ * tar format.
+ */
+ AH->format = archTar;
+ ReadHead(AH);
+ AH->format = archDirectory;
+ ReadToc(AH);
+
+ /* Nothing else in the file, so close it again... */
+ if (!EndCompressFileHandle(tocFH))
+ pg_fatal("could not close TOC file: %m");
+ ctx->dataFH = NULL;
+ }
+}
+
+/*
+ * Called by the Archiver when the dumper creates a new TOC entry.
+ *
+ * We determine the filename for this entry.
+*/
+static void
+_ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx;
+ char fn[MAXPGPATH];
+
+ tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ if (strcmp(te->desc, "BLOBS") == 0)
+ tctx->filename = pg_strdup("blobs.toc");
+ else if (te->dataDumper)
+ {
+ snprintf(fn, MAXPGPATH, "%d.dat", te->dumpId);
+ tctx->filename = pg_strdup(fn);
+ }
+ else
+ tctx->filename = NULL;
+
+ te->formatData = (void *) tctx;
+}
+
+/*
+ * Called by the Archiver to save any extra format-related TOC entry
+ * data.
+ *
+ * Use the Archiver routines to write data - they are non-endian, and
+ * maintain other important file information.
+ */
+static void
+_WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ /*
+ * A dumpable object has set tctx->filename, any other object has not.
+ * (see _ArchiveEntry).
+ */
+ if (tctx->filename)
+ WriteStr(AH, tctx->filename);
+ else
+ WriteStr(AH, "");
+}
+
+/*
+ * Called by the Archiver to read any extra format-related TOC data.
+ *
+ * Needs to match the order defined in _WriteExtraToc, and should also
+ * use the Archiver input routines.
+ */
+static void
+_ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ if (tctx == NULL)
+ {
+ tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry));
+ te->formatData = (void *) tctx;
+ }
+
+ tctx->filename = ReadStr(AH);
+ if (strlen(tctx->filename) == 0)
+ {
+ free(tctx->filename);
+ tctx->filename = NULL;
+ }
+}
+
+/*
+ * Called by the Archiver when restoring an archive to output a comment
+ * that includes useful information about the TOC entry.
+ */
+static void
+_PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ if (AH->public.verbose && tctx->filename)
+ ahprintf(AH, "-- File: %s\n", tctx->filename);
+}
+
+/*
+ * Called by the archiver when saving TABLE DATA (not schema). This routine
+ * should save whatever format-specific information is needed to read
+ * the archive back.
+ *
+ * It is called just prior to the dumper's 'DataDumper' routine being called.
+ *
+ * We create the data file for writing.
+ */
+static void
+_StartData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, tctx->filename);
+
+ ctx->dataFH = InitCompressFileHandle(AH->compression_spec);
+
+ if (!ctx->dataFH->open_write_func(fname, PG_BINARY_W, ctx->dataFH))
+ pg_fatal("could not open output file \"%s\": %m", fname);
+}
+
+/*
+ * Called by archiver when dumper calls WriteData. This routine is
+ * called for both LO and table data; it is the responsibility of
+ * the format to manage each kind of data using StartLO/StartData.
+ *
+ * It should only be called from within a DataDumper routine.
+ *
+ * We write the data to the open data file.
+ */
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH = ctx->dataFH;
+
+ errno = 0;
+ if (dLen > 0 && !CFH->write_func(data, dLen, CFH))
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to output file: %s",
+ CFH->get_error_func(CFH));
+ }
+}
+
+/*
+ * Called by the archiver when a dumper's 'DataDumper' routine has
+ * finished.
+ *
+ * We close the data file.
+ */
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /* Close the file */
+ if (!EndCompressFileHandle(ctx->dataFH))
+ pg_fatal("could not close data file: %m");
+
+ ctx->dataFH = NULL;
+}
+
+/*
+ * Print data for a given file (can be a LO as well)
+ */
+static void
+_PrintFileData(ArchiveHandle *AH, char *filename)
+{
+ size_t cnt = 0;
+ char *buf;
+ size_t buflen;
+ CompressFileHandle *CFH;
+
+ if (!filename)
+ return;
+
+ CFH = InitDiscoverCompressFileHandle(filename, PG_BINARY_R);
+ if (!CFH)
+ pg_fatal("could not open input file \"%s\": %m", filename);
+
+ buflen = DEFAULT_IO_BUFFER_SIZE;
+ buf = pg_malloc(buflen);
+
+ while (CFH->read_func(buf, buflen, &cnt, CFH) && cnt > 0)
+ {
+ ahwrite(buf, 1, cnt, AH);
+ }
+
+ free(buf);
+ if (!EndCompressFileHandle(CFH))
+ pg_fatal("could not close data file \"%s\": %m", filename);
+}
+
+/*
+ * Print data for a given TOC entry
+*/
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ if (!tctx->filename)
+ return;
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _LoadLOs(AH);
+ else
+ {
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, tctx->filename);
+ _PrintFileData(AH, fname);
+ }
+}
+
+static void
+_LoadLOs(ArchiveHandle *AH)
+{
+ Oid oid;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH;
+ char tocfname[MAXPGPATH];
+ char line[MAXPGPATH];
+
+ StartRestoreLOs(AH);
+
+ setFilePath(AH, tocfname, "blobs.toc");
+
+ CFH = ctx->LOsTocFH = InitDiscoverCompressFileHandle(tocfname, PG_BINARY_R);
+
+ if (ctx->LOsTocFH == NULL)
+ pg_fatal("could not open large object TOC file \"%s\" for input: %m",
+ tocfname);
+
+ /* Read the LOs TOC file line-by-line, and process each LO */
+ while ((CFH->gets_func(line, MAXPGPATH, CFH)) != NULL)
+ {
+ char lofname[MAXPGPATH + 1];
+ char path[MAXPGPATH];
+
+ /* Can't overflow because line and lofname are the same length */
+ if (sscanf(line, "%u %" CppAsString2(MAXPGPATH) "s\n", &oid, lofname) != 2)
+ pg_fatal("invalid line in large object TOC file \"%s\": \"%s\"",
+ tocfname, line);
+
+ StartRestoreLO(AH, oid, AH->public.ropt->dropSchema);
+ snprintf(path, MAXPGPATH, "%s/%s", ctx->directory, lofname);
+ _PrintFileData(AH, path);
+ EndRestoreLO(AH, oid);
+ }
+ if (!CFH->eof_func(CFH))
+ pg_fatal("error reading large object TOC file \"%s\"",
+ tocfname);
+
+ if (!EndCompressFileHandle(ctx->LOsTocFH))
+ pg_fatal("could not close large object TOC file \"%s\": %m",
+ tocfname);
+
+ ctx->LOsTocFH = NULL;
+
+ EndRestoreLOs(AH);
+}
+
+
+/*
+ * Write a byte of data to the archive.
+ * Called by the archiver to do integer & byte output to the archive.
+ * These routines are only used to read & write the headers & TOC.
+ */
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ unsigned char c = (unsigned char) i;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH = ctx->dataFH;
+
+ errno = 0;
+ if (!CFH->write_func(&c, 1, CFH))
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to output file: %s",
+ CFH->get_error_func(CFH));
+ }
+
+ return 1;
+}
+
+/*
+ * Read a byte of data from the archive.
+ * Called by the archiver to read bytes & integers from the archive.
+ * These routines are only used to read & write headers & TOC.
+ * EOF should be treated as a fatal error.
+ */
+static int
+_ReadByte(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH = ctx->dataFH;
+
+ return CFH->getc_func(CFH);
+}
+
+/*
+ * Write a buffer of data to the archive.
+ * Called by the archiver to write a block of bytes to the TOC or a data file.
+ */
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH = ctx->dataFH;
+
+ errno = 0;
+ if (!CFH->write_func(buf, len, CFH))
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to output file: %s",
+ CFH->get_error_func(CFH));
+ }
+}
+
+/*
+ * Read a block of bytes from the archive.
+ *
+ * Called by the archiver to read a block of bytes from the archive
+ */
+static void
+_ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH = ctx->dataFH;
+
+ /*
+ * If there was an I/O error, we already exited in readF(), so here we
+ * exit on short reads.
+ */
+ if (!CFH->read_func(buf, len, NULL, CFH))
+ pg_fatal("could not read from input file: end of file");
+}
+
+/*
+ * Close the archive.
+ *
+ * When writing the archive, this is the routine that actually starts
+ * the process of saving it to files. No data should be written prior
+ * to this point, since the user could sort the TOC after creating it.
+ *
+ * If an archive is to be written, this routine must call:
+ * WriteHead to save the archive header
+ * WriteToc to save the TOC entries
+ * WriteDataChunks to save all data & LOs.
+ */
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (AH->mode == archModeWrite)
+ {
+ CompressFileHandle *tocFH;
+ pg_compress_specification compression_spec = {0};
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, "toc.dat");
+
+ /* this will actually fork the processes for a parallel backup */
+ ctx->pstate = ParallelBackupStart(AH);
+
+ /* The TOC is always created uncompressed */
+ compression_spec.algorithm = PG_COMPRESSION_NONE;
+ tocFH = InitCompressFileHandle(compression_spec);
+ if (!tocFH->open_write_func(fname, PG_BINARY_W, tocFH))
+ pg_fatal("could not open output file \"%s\": %m", fname);
+ ctx->dataFH = tocFH;
+
+ /*
+ * Write 'tar' in the format field of the toc.dat file. The directory
+ * is compatible with 'tar', so there's no point having a different
+ * format code for it.
+ */
+ AH->format = archTar;
+ WriteHead(AH);
+ AH->format = archDirectory;
+ WriteToc(AH);
+ if (!EndCompressFileHandle(tocFH))
+ pg_fatal("could not close TOC file: %m");
+ WriteDataChunks(AH, ctx->pstate);
+
+ ParallelBackupEnd(AH, ctx->pstate);
+
+ /*
+ * In directory mode, there is no need to sync all the entries
+ * individually. Just recurse once through all the files generated.
+ */
+ if (AH->dosync)
+ fsync_dir_recurse(ctx->directory);
+ }
+ AH->FH = NULL;
+}
+
+/*
+ * Reopen the archive's file handle.
+ */
+static void
+_ReopenArchive(ArchiveHandle *AH)
+{
+ /*
+ * Our TOC is in memory, our data files are opened by each child anyway as
+ * they are separate. We support reopening the archive by just doing
+ * nothing.
+ */
+}
+
+/*
+ * LO support
+ */
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * We open the large object TOC file here, so that we can append a line to
+ * it for each LO.
+ */
+static void
+_StartLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ pg_compress_specification compression_spec = {0};
+ char fname[MAXPGPATH];
+
+ setFilePath(AH, fname, "blobs.toc");
+
+ /* The LO TOC file is never compressed */
+ compression_spec.algorithm = PG_COMPRESSION_NONE;
+ ctx->LOsTocFH = InitCompressFileHandle(compression_spec);
+ if (!ctx->LOsTocFH->open_write_func(fname, "ab", ctx->LOsTocFH))
+ pg_fatal("could not open output file \"%s\": %m", fname);
+}
+
+/*
+ * Called by the archiver when we're about to start dumping a LO.
+ *
+ * We create a file to write the LO to.
+ */
+static void
+_StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[MAXPGPATH];
+
+ snprintf(fname, MAXPGPATH, "%s/blob_%u.dat", ctx->directory, oid);
+
+ ctx->dataFH = InitCompressFileHandle(AH->compression_spec);
+ if (!ctx->dataFH->open_write_func(fname, PG_BINARY_W, ctx->dataFH))
+ pg_fatal("could not open output file \"%s\": %m", fname);
+}
+
+/*
+ * Called by the archiver when the dumper is finished writing a LO.
+ *
+ * We close the LO file and write an entry to the LO TOC file for it.
+ */
+static void
+_EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ CompressFileHandle *CFH = ctx->LOsTocFH;
+ char buf[50];
+ int len;
+
+ /* Close the BLOB data file itself */
+ if (!EndCompressFileHandle(ctx->dataFH))
+ pg_fatal("could not close LO data file: %m");
+ ctx->dataFH = NULL;
+
+ /* register the LO in blobs.toc */
+ len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid);
+ if (!CFH->write_func(buf, len, CFH))
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write to LOs TOC file: %s",
+ CFH->get_error_func(CFH));
+ }
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * We close the LOs TOC file.
+ */
+static void
+_EndLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (!EndCompressFileHandle(ctx->LOsTocFH))
+ pg_fatal("could not close LOs TOC file: %m");
+ ctx->LOsTocFH = NULL;
+}
+
+/*
+ * Gets a relative file name and prepends the output directory, writing the
+ * result to buf. The caller needs to make sure that buf is MAXPGPATH bytes
+ * big. Can't use a static char[MAXPGPATH] inside the function because we run
+ * multithreaded on Windows.
+ */
+static void
+setFilePath(ArchiveHandle *AH, char *buf, const char *relativeFilename)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char *dname;
+
+ dname = ctx->directory;
+
+ if (strlen(dname) + 1 + strlen(relativeFilename) + 1 > MAXPGPATH)
+ pg_fatal("file name too long: \"%s\"", dname);
+
+ strcpy(buf, dname);
+ strcat(buf, "/");
+ strcat(buf, relativeFilename);
+}
+
+/*
+ * Prepare for parallel restore.
+ *
+ * The main thing that needs to happen here is to fill in TABLE DATA and BLOBS
+ * TOC entries' dataLength fields with appropriate values to guide the
+ * ordering of restore jobs. The source of said data is format-dependent,
+ * as is the exact meaning of the values.
+ *
+ * A format module might also choose to do other setup here.
+ */
+static void
+_PrepParallelRestore(ArchiveHandle *AH)
+{
+ TocEntry *te;
+
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ char fname[MAXPGPATH];
+ struct stat st;
+
+ /*
+ * A dumpable object has set tctx->filename, any other object has not.
+ * (see _ArchiveEntry).
+ */
+ if (tctx->filename == NULL)
+ continue;
+
+ /* We may ignore items not due to be restored */
+ if ((te->reqs & REQ_DATA) == 0)
+ continue;
+
+ /*
+ * Stat the file and, if successful, put its size in dataLength. When
+ * using compression, the physical file size might not be a very good
+ * guide to the amount of work involved in restoring the file, but we
+ * only need an approximate indicator of that.
+ */
+ setFilePath(AH, fname, tctx->filename);
+
+ if (stat(fname, &st) == 0)
+ te->dataLength = st.st_size;
+ else if (AH->compression_spec.algorithm != PG_COMPRESSION_NONE)
+ {
+ if (AH->compression_spec.algorithm == PG_COMPRESSION_GZIP)
+ strlcat(fname, ".gz", sizeof(fname));
+ else if (AH->compression_spec.algorithm == PG_COMPRESSION_LZ4)
+ strlcat(fname, ".lz4", sizeof(fname));
+ else if (AH->compression_spec.algorithm == PG_COMPRESSION_ZSTD)
+ strlcat(fname, ".zst", sizeof(fname));
+
+ if (stat(fname, &st) == 0)
+ te->dataLength = st.st_size;
+ }
+
+ /*
+ * If this is the BLOBS entry, what we stat'd was blobs.toc, which
+ * most likely is a lot smaller than the actual blob data. We don't
+ * have a cheap way to estimate how much smaller, but fortunately it
+ * doesn't matter too much as long as we get the LOs processed
+ * reasonably early. Arbitrarily scale up by a factor of 1K.
+ */
+ if (strcmp(te->desc, "BLOBS") == 0)
+ te->dataLength *= 1024;
+ }
+}
+
+/*
+ * Clone format-specific fields during parallel restoration.
+ */
+static void
+_Clone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ AH->formatData = (lclContext *) pg_malloc(sizeof(lclContext));
+ memcpy(AH->formatData, ctx, sizeof(lclContext));
+ ctx = (lclContext *) AH->formatData;
+
+ /*
+ * Note: we do not make a local lo_buf because we expect at most one BLOBS
+ * entry per archive, so no parallelism is possible. Likewise,
+ * TOC-entry-local state isn't an issue because any one TOC entry is
+ * touched by just one worker child.
+ */
+
+ /*
+ * We also don't copy the ParallelState pointer (pstate), only the leader
+ * process ever writes to it.
+ */
+}
+
+static void
+_DeClone(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ free(ctx);
+}
+
+/*
+ * This function is executed in the child of a parallel backup for a
+ * directory-format archive and dumps the actual data for one TOC entry.
+ */
+static int
+_WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te)
+{
+ /*
+ * This function returns void. We either fail and die horribly or
+ * succeed... A failure will be detected by the parent when the child dies
+ * unexpectedly.
+ */
+ WriteDataChunksForTocEntry(AH, te);
+
+ return 0;
+}
+
+/*
+ * This function is executed in the child of a parallel restore from a
+ * directory-format archive and restores the actual data for one TOC entry.
+ */
+static int
+_WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te)
+{
+ return parallel_restore(AH, te);
+}
diff --git a/src/bin/pg_dump/pg_backup_null.c b/src/bin/pg_dump/pg_backup_null.c
new file mode 100644
index 0000000..08f0962
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_null.c
@@ -0,0 +1,228 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_null.c
+ *
+ * Implementation of an archive that is never saved; it is used by
+ * pg_dump to output a plain text SQL script instead of saving
+ * a real archive.
+ *
+ * See the headers to pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_null.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "fe_utils/string_utils.h"
+#include "libpq/libpq-fs.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_utils.h"
+
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _WriteLOData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+static void _StartLOs(ArchiveHandle *AH, TocEntry *te);
+static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLOs(ArchiveHandle *AH, TocEntry *te);
+
+
+/*
+ * Initializer
+ */
+void
+InitArchiveFmt_Null(ArchiveHandle *AH)
+{
+ /* Assuming static functions, this can be copied for each format. */
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = NULL;
+ AH->PrintTocDataPtr = _PrintTocData;
+
+ AH->StartLOsPtr = _StartLOs;
+ AH->StartLOPtr = _StartLO;
+ AH->EndLOPtr = _EndLO;
+ AH->EndLOsPtr = _EndLOs;
+ AH->ClonePtr = NULL;
+ AH->DeClonePtr = NULL;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now prevent reading...
+ */
+ if (AH->mode == archModeRead)
+ pg_fatal("this format cannot be read");
+}
+
+/*
+ * - Start a new TOC entry
+ */
+
+/*
+ * Called by dumper via archiver from within a data dump routine
+ */
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ /* Just send it to output, ahwrite() already errors on failure */
+ ahwrite(data, 1, dLen, AH);
+}
+
+/*
+ * Called by dumper via archiver from within a data dump routine
+ * We substitute this for _WriteData while emitting a LO
+ */
+static void
+_WriteLOData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ if (dLen > 0)
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+
+ appendByteaLiteralAHX(buf,
+ (const unsigned char *) data,
+ dLen,
+ AH);
+
+ ahprintf(AH, "SELECT pg_catalog.lowrite(0, %s);\n", buf->data);
+
+ destroyPQExpBuffer(buf);
+ }
+}
+
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ ahprintf(AH, "\n\n");
+}
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * This routine should save whatever format-specific information is needed
+ * to read the LOs back into memory.
+ *
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * Optional, but strongly recommended.
+ */
+static void
+_StartLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ ahprintf(AH, "BEGIN;\n\n");
+}
+
+/*
+ * Called by the archiver when the dumper calls StartLO.
+ *
+ * Mandatory.
+ *
+ * Must save the passed OID for retrieval at restore-time.
+ */
+static void
+_StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ bool old_lo_style = (AH->version < K_VERS_1_12);
+
+ if (oid == 0)
+ pg_fatal("invalid OID for large object");
+
+ /* With an old archive we must do drop and create logic here */
+ if (old_lo_style && AH->public.ropt->dropSchema)
+ DropLOIfExists(AH, oid);
+
+ if (old_lo_style)
+ ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
+ oid, INV_WRITE);
+ else
+ ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
+ oid, INV_WRITE);
+
+ AH->WriteDataPtr = _WriteLOData;
+}
+
+/*
+ * Called by the archiver when the dumper calls EndLO.
+ *
+ * Optional.
+ */
+static void
+_EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ AH->WriteDataPtr = _WriteData;
+
+ ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * Optional.
+ */
+static void
+_EndLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ ahprintf(AH, "COMMIT;\n\n");
+}
+
+/*------
+ * Called as part of a RestoreArchive call; for the NULL archive, this
+ * just sends the data for a given TOC entry to the output.
+ *------
+ */
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ if (te->dataDumper)
+ {
+ AH->currToc = te;
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _StartLOs(AH, te);
+
+ te->dataDumper((Archive *) AH, te->dataDumperArg);
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _EndLOs(AH, te);
+
+ AH->currToc = NULL;
+ }
+}
+
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ /* Don't do anything */
+ return 0;
+}
+
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ /* Don't do anything */
+}
+
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ /* Nothing to do */
+}
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
new file mode 100644
index 0000000..db5fb43
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -0,0 +1,1207 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_tar.c
+ *
+ * This file is copied from the 'files' format file, but dumps data into
+ * one temp file then sends it to the output TAR archive.
+ *
+ * The tar format also includes a 'restore.sql' script which is there for
+ * the benefit of humans. This script is never used by pg_restore.
+ *
+ * NOTE: If you untar the created 'tar' file, the resulting files are
+ * compatible with the 'directory' format. Please keep the two formats in
+ * sync.
+ *
+ * See the headers to pg_backup_directory & pg_restore for more details.
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_backup_tar.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <ctype.h>
+#include <limits.h>
+#include <unistd.h>
+
+#include "common/file_utils.h"
+#include "fe_utils/string_utils.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_tar.h"
+#include "pg_backup_utils.h"
+#include "pgtar.h"
+
+static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
+static void _StartData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen);
+static void _EndData(ArchiveHandle *AH, TocEntry *te);
+static int _WriteByte(ArchiveHandle *AH, const int i);
+static int _ReadByte(ArchiveHandle *AH);
+static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len);
+static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len);
+static void _CloseArchive(ArchiveHandle *AH);
+static void _PrintTocData(ArchiveHandle *AH, TocEntry *te);
+static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te);
+static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te);
+
+static void _StartLOs(ArchiveHandle *AH, TocEntry *te);
+static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid);
+static void _EndLOs(ArchiveHandle *AH, TocEntry *te);
+
+#define K_STD_BUF_SIZE 1024
+
+
+typedef struct
+{
+ FILE *nFH;
+ FILE *tarFH;
+ FILE *tmpFH;
+ char *targetFile;
+ char mode;
+ pgoff_t pos;
+ pgoff_t fileLen;
+ ArchiveHandle *AH;
+} TAR_MEMBER;
+
+typedef struct
+{
+ int hasSeek;
+ pgoff_t filePos;
+ TAR_MEMBER *loToc;
+ FILE *tarFH;
+ pgoff_t tarFHpos;
+ pgoff_t tarNextMember;
+ TAR_MEMBER *FH;
+ int isSpecialScript;
+ TAR_MEMBER *scriptTH;
+} lclContext;
+
+typedef struct
+{
+ TAR_MEMBER *TH;
+ char *filename;
+} lclTocEntry;
+
+static void _LoadLOs(ArchiveHandle *AH);
+
+static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode);
+static void tarClose(ArchiveHandle *AH, TAR_MEMBER *th);
+
+#ifdef __NOT_USED__
+static char *tarGets(char *buf, size_t len, TAR_MEMBER *th);
+#endif
+static int tarPrintf(TAR_MEMBER *th, const char *fmt,...) pg_attribute_printf(2, 3);
+
+static void _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th);
+static TAR_MEMBER *_tarPositionTo(ArchiveHandle *AH, const char *filename);
+static size_t tarRead(void *buf, size_t len, TAR_MEMBER *th);
+static size_t tarWrite(const void *buf, size_t len, TAR_MEMBER *th);
+static void _tarWriteHeader(TAR_MEMBER *th);
+static int _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th);
+static size_t _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh);
+
+static size_t _scriptOut(ArchiveHandle *AH, const void *buf, size_t len);
+
+/*
+ * Initializer
+ */
+void
+InitArchiveFmt_Tar(ArchiveHandle *AH)
+{
+ lclContext *ctx;
+
+ /* Assuming static functions, this can be copied for each format. */
+ AH->ArchiveEntryPtr = _ArchiveEntry;
+ AH->StartDataPtr = _StartData;
+ AH->WriteDataPtr = _WriteData;
+ AH->EndDataPtr = _EndData;
+ AH->WriteBytePtr = _WriteByte;
+ AH->ReadBytePtr = _ReadByte;
+ AH->WriteBufPtr = _WriteBuf;
+ AH->ReadBufPtr = _ReadBuf;
+ AH->ClosePtr = _CloseArchive;
+ AH->ReopenPtr = NULL;
+ AH->PrintTocDataPtr = _PrintTocData;
+ AH->ReadExtraTocPtr = _ReadExtraToc;
+ AH->WriteExtraTocPtr = _WriteExtraToc;
+ AH->PrintExtraTocPtr = _PrintExtraToc;
+
+ AH->StartLOsPtr = _StartLOs;
+ AH->StartLOPtr = _StartLO;
+ AH->EndLOPtr = _EndLO;
+ AH->EndLOsPtr = _EndLOs;
+ AH->ClonePtr = NULL;
+ AH->DeClonePtr = NULL;
+
+ AH->WorkerJobDumpPtr = NULL;
+ AH->WorkerJobRestorePtr = NULL;
+
+ /*
+ * Set up some special context used in compressing data.
+ */
+ ctx = pg_malloc0_object(lclContext);
+ AH->formatData = (void *) ctx;
+ ctx->filePos = 0;
+ ctx->isSpecialScript = 0;
+
+ /* Initialize LO buffering */
+ AH->lo_buf_size = LOBBUFSIZE;
+ AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
+
+ /*
+ * Now open the tar file, and load the TOC if we're in read mode.
+ */
+ if (AH->mode == archModeWrite)
+ {
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ ctx->tarFH = fopen(AH->fSpec, PG_BINARY_W);
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file \"%s\" for output: %m",
+ AH->fSpec);
+ }
+ else
+ {
+ ctx->tarFH = stdout;
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file for output: %m");
+ }
+
+ ctx->tarFHpos = 0;
+
+ /*
+ * Make unbuffered since we will dup() it, and the buffers screw each
+ * other
+ */
+ /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
+
+ ctx->hasSeek = checkSeek(ctx->tarFH);
+
+ /*
+ * We don't support compression because reading the files back is not
+ * possible since gzdopen uses buffered IO which totally screws file
+ * positioning.
+ */
+ if (AH->compression_spec.algorithm != PG_COMPRESSION_NONE)
+ pg_fatal("compression is not supported by tar archive format");
+ }
+ else
+ { /* Read Mode */
+ if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
+ {
+ ctx->tarFH = fopen(AH->fSpec, PG_BINARY_R);
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file \"%s\" for input: %m",
+ AH->fSpec);
+ }
+ else
+ {
+ ctx->tarFH = stdin;
+ if (ctx->tarFH == NULL)
+ pg_fatal("could not open TOC file for input: %m");
+ }
+
+ /*
+ * Make unbuffered since we will dup() it, and the buffers screw each
+ * other
+ */
+ /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
+
+ ctx->tarFHpos = 0;
+
+ ctx->hasSeek = checkSeek(ctx->tarFH);
+
+ ctx->FH = (void *) tarOpen(AH, "toc.dat", 'r');
+ ReadHead(AH);
+ ReadToc(AH);
+ tarClose(AH, ctx->FH); /* Nothing else in the file... */
+ }
+}
+
+/*
+ * - Start a new TOC entry
+ * Setup the output file name.
+ */
+static void
+_ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx;
+ char fn[K_STD_BUF_SIZE];
+
+ ctx = pg_malloc0_object(lclTocEntry);
+ if (te->dataDumper != NULL)
+ {
+ snprintf(fn, sizeof(fn), "%d.dat", te->dumpId);
+ ctx->filename = pg_strdup(fn);
+ }
+ else
+ {
+ ctx->filename = NULL;
+ ctx->TH = NULL;
+ }
+ te->formatData = (void *) ctx;
+}
+
+static void
+_WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (ctx->filename)
+ WriteStr(AH, ctx->filename);
+ else
+ WriteStr(AH, "");
+}
+
+static void
+_ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (ctx == NULL)
+ {
+ ctx = pg_malloc0_object(lclTocEntry);
+ te->formatData = (void *) ctx;
+ }
+
+ ctx->filename = ReadStr(AH);
+ if (strlen(ctx->filename) == 0)
+ {
+ free(ctx->filename);
+ ctx->filename = NULL;
+ }
+ ctx->TH = NULL;
+}
+
+static void
+_PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *ctx = (lclTocEntry *) te->formatData;
+
+ if (AH->public.verbose && ctx->filename != NULL)
+ ahprintf(AH, "-- File: %s\n", ctx->filename);
+}
+
+static void
+_StartData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tctx->TH = tarOpen(AH, tctx->filename, 'w');
+}
+
+static TAR_MEMBER *
+tarOpen(ArchiveHandle *AH, const char *filename, char mode)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *tm;
+
+ if (mode == 'r')
+ {
+ tm = _tarPositionTo(AH, filename);
+ if (!tm) /* Not found */
+ {
+ if (filename)
+ {
+ /*
+ * Couldn't find the requested file. Future: do SEEK(0) and
+ * retry.
+ */
+ pg_fatal("could not find file \"%s\" in archive", filename);
+ }
+ else
+ {
+ /* Any file OK, none left, so return NULL */
+ return NULL;
+ }
+ }
+
+ if (AH->compression_spec.algorithm == PG_COMPRESSION_NONE)
+ tm->nFH = ctx->tarFH;
+ else
+ pg_fatal("compression is not supported by tar archive format");
+ }
+ else
+ {
+ int old_umask;
+
+ tm = pg_malloc0_object(TAR_MEMBER);
+
+ /*
+ * POSIX does not require, but permits, tmpfile() to restrict file
+ * permissions. Given an OS crash after we write data, the filesystem
+ * might retain the data but forget tmpfile()'s unlink(). If so, the
+ * file mode protects confidentiality of the data written.
+ */
+ old_umask = umask(S_IRWXG | S_IRWXO);
+
+#ifndef WIN32
+ tm->tmpFH = tmpfile();
+#else
+
+ /*
+ * On WIN32, tmpfile() generates a filename in the root directory,
+ * which requires administrative permissions on certain systems. Loop
+ * until we find a unique file name we can create.
+ */
+ while (1)
+ {
+ char *name;
+ int fd;
+
+ name = _tempnam(NULL, "pg_temp_");
+ if (name == NULL)
+ break;
+ fd = open(name, O_RDWR | O_CREAT | O_EXCL | O_BINARY |
+ O_TEMPORARY, S_IRUSR | S_IWUSR);
+ free(name);
+
+ if (fd != -1) /* created a file */
+ {
+ tm->tmpFH = fdopen(fd, "w+b");
+ break;
+ }
+ else if (errno != EEXIST) /* failure other than file exists */
+ break;
+ }
+#endif
+
+ if (tm->tmpFH == NULL)
+ pg_fatal("could not generate temporary file name: %m");
+
+ umask(old_umask);
+
+ if (AH->compression_spec.algorithm == PG_COMPRESSION_NONE)
+ tm->nFH = tm->tmpFH;
+ else
+ pg_fatal("compression is not supported by tar archive format");
+
+ tm->AH = AH;
+ tm->targetFile = pg_strdup(filename);
+ }
+
+ tm->mode = mode;
+ tm->tarFH = ctx->tarFH;
+
+ return tm;
+}
+
+static void
+tarClose(ArchiveHandle *AH, TAR_MEMBER *th)
+{
+ if (AH->compression_spec.algorithm != PG_COMPRESSION_NONE)
+ pg_fatal("compression is not supported by tar archive format");
+
+ if (th->mode == 'w')
+ _tarAddFile(AH, th); /* This will close the temp file */
+
+ /*
+ * else Nothing to do for normal read since we don't dup() normal file
+ * handle, and we don't use temp files.
+ */
+
+ free(th->targetFile);
+
+ th->nFH = NULL;
+}
+
+#ifdef __NOT_USED__
+static char *
+tarGets(char *buf, size_t len, TAR_MEMBER *th)
+{
+ char *s;
+ size_t cnt = 0;
+ char c = ' ';
+ int eof = 0;
+
+ /* Can't read past logical EOF */
+ if (len > (th->fileLen - th->pos))
+ len = th->fileLen - th->pos;
+
+ while (cnt < len && c != '\n')
+ {
+ if (_tarReadRaw(th->AH, &c, 1, th, NULL) <= 0)
+ {
+ eof = 1;
+ break;
+ }
+ buf[cnt++] = c;
+ }
+
+ if (eof && cnt == 0)
+ s = NULL;
+ else
+ {
+ buf[cnt++] = '\0';
+ s = buf;
+ }
+
+ if (s)
+ {
+ len = strlen(s);
+ th->pos += len;
+ }
+
+ return s;
+}
+#endif
+
+/*
+ * Just read bytes from the archive. This is the low level read routine
+ * that is used for ALL reads on a tar file.
+ */
+static size_t
+_tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ size_t avail;
+ size_t used = 0;
+ size_t res = 0;
+
+ Assert(th || fh);
+
+ avail = AH->lookaheadLen - AH->lookaheadPos;
+ if (avail > 0)
+ {
+ /* We have some lookahead bytes to use */
+ if (avail >= len) /* Just use the lookahead buffer */
+ used = len;
+ else
+ used = avail;
+
+ /* Copy, and adjust buffer pos */
+ memcpy(buf, AH->lookahead + AH->lookaheadPos, used);
+ AH->lookaheadPos += used;
+
+ /* Adjust required length */
+ len -= used;
+ }
+
+ /* Read the file if len > 0 */
+ if (len > 0)
+ {
+ if (fh)
+ {
+ res = fread(&((char *) buf)[used], 1, len, fh);
+ if (res != len && !feof(fh))
+ READ_ERROR_EXIT(fh);
+ }
+ else if (th)
+ {
+ res = fread(&((char *) buf)[used], 1, len, th->nFH);
+ if (res != len && !feof(th->nFH))
+ READ_ERROR_EXIT(th->nFH);
+ }
+ }
+
+ ctx->tarFHpos += res + used;
+
+ return (res + used);
+}
+
+static size_t
+tarRead(void *buf, size_t len, TAR_MEMBER *th)
+{
+ size_t res;
+
+ if (th->pos + len > th->fileLen)
+ len = th->fileLen - th->pos;
+
+ if (len <= 0)
+ return 0;
+
+ res = _tarReadRaw(th->AH, buf, len, th, NULL);
+
+ th->pos += res;
+
+ return res;
+}
+
+static size_t
+tarWrite(const void *buf, size_t len, TAR_MEMBER *th)
+{
+ size_t res;
+
+ res = fwrite(buf, 1, len, th->nFH);
+
+ th->pos += res;
+ return res;
+}
+
+static void
+_WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
+{
+ lclTocEntry *tctx = (lclTocEntry *) AH->currToc->formatData;
+
+ if (tarWrite(data, dLen, tctx->TH) != dLen)
+ WRITE_ERROR_EXIT;
+}
+
+static void
+_EndData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ /* Close the file */
+ tarClose(AH, tctx->TH);
+ tctx->TH = NULL;
+}
+
+/*
+ * Print data for a given file
+ */
+static void
+_PrintFileData(ArchiveHandle *AH, char *filename)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char buf[4096];
+ size_t cnt;
+ TAR_MEMBER *th;
+
+ if (!filename)
+ return;
+
+ th = tarOpen(AH, filename, 'r');
+ ctx->FH = th;
+
+ while ((cnt = tarRead(buf, 4095, th)) > 0)
+ {
+ buf[cnt] = '\0';
+ ahwrite(buf, 1, cnt, AH);
+ }
+
+ tarClose(AH, th);
+}
+
+
+/*
+ * Print data for a given TOC entry
+*/
+static void
+_PrintTocData(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ int pos1;
+
+ if (!tctx->filename)
+ return;
+
+ /*
+ * If we're writing the special restore.sql script, emit a suitable
+ * command to include each table's data from the corresponding file.
+ *
+ * In the COPY case this is a bit klugy because the regular COPY command
+ * was already printed before we get control.
+ */
+ if (ctx->isSpecialScript)
+ {
+ if (te->copyStmt)
+ {
+ /* Abort the COPY FROM stdin */
+ ahprintf(AH, "\\.\n");
+
+ /*
+ * The COPY statement should look like "COPY ... FROM stdin;\n",
+ * see dumpTableData().
+ */
+ pos1 = (int) strlen(te->copyStmt) - 13;
+ if (pos1 < 6 || strncmp(te->copyStmt, "COPY ", 5) != 0 ||
+ strcmp(te->copyStmt + pos1, " FROM stdin;\n") != 0)
+ pg_fatal("unexpected COPY statement syntax: \"%s\"",
+ te->copyStmt);
+
+ /* Emit all but the FROM part ... */
+ ahwrite(te->copyStmt, 1, pos1, AH);
+ /* ... and insert modified FROM */
+ ahprintf(AH, " FROM '$$PATH$$/%s';\n\n", tctx->filename);
+ }
+ else
+ {
+ /* --inserts mode, no worries, just include the data file */
+ ahprintf(AH, "\\i $$PATH$$/%s\n\n", tctx->filename);
+ }
+
+ return;
+ }
+
+ if (strcmp(te->desc, "BLOBS") == 0)
+ _LoadLOs(AH);
+ else
+ _PrintFileData(AH, tctx->filename);
+}
+
+static void
+_LoadLOs(ArchiveHandle *AH)
+{
+ Oid oid;
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *th;
+ size_t cnt;
+ bool foundLO = false;
+ char buf[4096];
+
+ StartRestoreLOs(AH);
+
+ th = tarOpen(AH, NULL, 'r'); /* Open next file */
+ while (th != NULL)
+ {
+ ctx->FH = th;
+
+ if (strncmp(th->targetFile, "blob_", 5) == 0)
+ {
+ oid = atooid(&th->targetFile[5]);
+ if (oid != 0)
+ {
+ pg_log_info("restoring large object with OID %u", oid);
+
+ StartRestoreLO(AH, oid, AH->public.ropt->dropSchema);
+
+ while ((cnt = tarRead(buf, 4095, th)) > 0)
+ {
+ buf[cnt] = '\0';
+ ahwrite(buf, 1, cnt, AH);
+ }
+ EndRestoreLO(AH, oid);
+ foundLO = true;
+ }
+ tarClose(AH, th);
+ }
+ else
+ {
+ tarClose(AH, th);
+
+ /*
+ * Once we have found the first LO, stop at the first non-LO entry
+ * (which will be 'blobs.toc'). This coding would eat all the
+ * rest of the archive if there are no LOs ... but this function
+ * shouldn't be called at all in that case.
+ */
+ if (foundLO)
+ break;
+ }
+
+ th = tarOpen(AH, NULL, 'r');
+ }
+ EndRestoreLOs(AH);
+}
+
+
+static int
+_WriteByte(ArchiveHandle *AH, const int i)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char b = i; /* Avoid endian problems */
+
+ if (tarWrite(&b, 1, ctx->FH) != 1)
+ WRITE_ERROR_EXIT;
+
+ ctx->filePos += 1;
+ return 1;
+}
+
+static int
+_ReadByte(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ size_t res;
+ unsigned char c;
+
+ res = tarRead(&c, 1, ctx->FH);
+ if (res != 1)
+ /* We already would have exited for errors on reads, must be EOF */
+ pg_fatal("could not read from input file: end of file");
+ ctx->filePos += 1;
+ return c;
+}
+
+static void
+_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (tarWrite(buf, len, ctx->FH) != len)
+ WRITE_ERROR_EXIT;
+
+ ctx->filePos += len;
+}
+
+static void
+_ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ if (tarRead(buf, len, ctx->FH) != len)
+ /* We already would have exited for errors on reads, must be EOF */
+ pg_fatal("could not read from input file: end of file");
+
+ ctx->filePos += len;
+}
+
+static void
+_CloseArchive(ArchiveHandle *AH)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *th;
+ RestoreOptions *ropt;
+ RestoreOptions *savRopt;
+ DumpOptions *savDopt;
+ int savVerbose,
+ i;
+
+ if (AH->mode == archModeWrite)
+ {
+ /*
+ * Write the Header & TOC to the archive FIRST
+ */
+ th = tarOpen(AH, "toc.dat", 'w');
+ ctx->FH = th;
+ WriteHead(AH);
+ WriteToc(AH);
+ tarClose(AH, th); /* Not needed any more */
+
+ /*
+ * Now send the data (tables & LOs)
+ */
+ WriteDataChunks(AH, NULL);
+
+ /*
+ * Now this format wants to append a script which does a full restore
+ * if the files have been extracted.
+ */
+ th = tarOpen(AH, "restore.sql", 'w');
+
+ tarPrintf(th, "--\n"
+ "-- NOTE:\n"
+ "--\n"
+ "-- File paths need to be edited. Search for $$PATH$$ and\n"
+ "-- replace it with the path to the directory containing\n"
+ "-- the extracted data files.\n"
+ "--\n");
+
+ AH->CustomOutPtr = _scriptOut;
+
+ ctx->isSpecialScript = 1;
+ ctx->scriptTH = th;
+
+ ropt = NewRestoreOptions();
+ memcpy(ropt, AH->public.ropt, sizeof(RestoreOptions));
+ ropt->filename = NULL;
+ ropt->dropSchema = 1;
+ ropt->superuser = NULL;
+ ropt->suppressDumpWarnings = true;
+
+ savDopt = AH->public.dopt;
+ savRopt = AH->public.ropt;
+
+ SetArchiveOptions((Archive *) AH, NULL, ropt);
+
+ savVerbose = AH->public.verbose;
+ AH->public.verbose = 0;
+
+ RestoreArchive((Archive *) AH);
+
+ SetArchiveOptions((Archive *) AH, savDopt, savRopt);
+
+ AH->public.verbose = savVerbose;
+
+ tarClose(AH, th);
+
+ ctx->isSpecialScript = 0;
+
+ /*
+ * EOF marker for tar files is two blocks of NULLs.
+ */
+ for (i = 0; i < TAR_BLOCK_SIZE * 2; i++)
+ {
+ if (fputc(0, ctx->tarFH) == EOF)
+ WRITE_ERROR_EXIT;
+ }
+
+ /* Sync the output file if one is defined */
+ if (AH->dosync && AH->fSpec)
+ (void) fsync_fname(AH->fSpec, false);
+ }
+
+ AH->FH = NULL;
+}
+
+static size_t
+_scriptOut(ArchiveHandle *AH, const void *buf, size_t len)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ return tarWrite(buf, len, ctx->scriptTH);
+}
+
+/*
+ * Large Object support
+ */
+
+/*
+ * Called by the archiver when starting to save all BLOB DATA (not schema).
+ * This routine should save whatever format-specific information is needed
+ * to read the LOs back into memory.
+ *
+ * It is called just prior to the dumper's DataDumper routine.
+ *
+ * Optional, but strongly recommended.
+ *
+ */
+static void
+_StartLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char fname[K_STD_BUF_SIZE];
+
+ sprintf(fname, "blobs.toc");
+ ctx->loToc = tarOpen(AH, fname, 'w');
+}
+
+/*
+ * Called by the archiver when the dumper calls StartLO.
+ *
+ * Mandatory.
+ *
+ * Must save the passed OID for retrieval at restore-time.
+ */
+static void
+_StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+ char fname[255];
+
+ if (oid == 0)
+ pg_fatal("invalid OID for large object (%u)", oid);
+
+ if (AH->compression_spec.algorithm != PG_COMPRESSION_NONE)
+ pg_fatal("compression is not supported by tar archive format");
+
+ sprintf(fname, "blob_%u.dat", oid);
+
+ tarPrintf(ctx->loToc, "%u %s\n", oid, fname);
+
+ tctx->TH = tarOpen(AH, fname, 'w');
+}
+
+/*
+ * Called by the archiver when the dumper calls EndLO.
+ *
+ * Optional.
+ *
+ */
+static void
+_EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
+{
+ lclTocEntry *tctx = (lclTocEntry *) te->formatData;
+
+ tarClose(AH, tctx->TH);
+}
+
+/*
+ * Called by the archiver when finishing saving all BLOB DATA.
+ *
+ * Optional.
+ *
+ */
+static void
+_EndLOs(ArchiveHandle *AH, TocEntry *te)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+
+ /* Write out a fake zero OID to mark end-of-LOs. */
+ /* WriteInt(AH, 0); */
+
+ tarClose(AH, ctx->loToc);
+}
+
+
+
+/*------------
+ * TAR Support
+ *------------
+ */
+
+static int
+tarPrintf(TAR_MEMBER *th, const char *fmt,...)
+{
+ int save_errno = errno;
+ char *p;
+ size_t len = 128; /* initial assumption about buffer size */
+ size_t cnt;
+
+ for (;;)
+ {
+ va_list args;
+
+ /* Allocate work buffer. */
+ p = (char *) pg_malloc(len);
+
+ /* Try to format the data. */
+ errno = save_errno;
+ va_start(args, fmt);
+ cnt = pvsnprintf(p, len, fmt, args);
+ va_end(args);
+
+ if (cnt < len)
+ break; /* success */
+
+ /* Release buffer and loop around to try again with larger len. */
+ free(p);
+ len = cnt;
+ }
+
+ cnt = tarWrite(p, cnt, th);
+ free(p);
+ return (int) cnt;
+}
+
+bool
+isValidTarHeader(char *header)
+{
+ int sum;
+ int chk = tarChecksum(header);
+
+ sum = read_tar_number(&header[148], 8);
+
+ if (sum != chk)
+ return false;
+
+ /* POSIX tar format */
+ if (memcmp(&header[257], "ustar\0", 6) == 0 &&
+ memcmp(&header[263], "00", 2) == 0)
+ return true;
+ /* GNU tar format */
+ if (memcmp(&header[257], "ustar \0", 8) == 0)
+ return true;
+ /* not-quite-POSIX format written by pre-9.3 pg_dump */
+ if (memcmp(&header[257], "ustar00\0", 8) == 0)
+ return true;
+
+ return false;
+}
+
+/* Given the member, write the TAR header & copy the file */
+static void
+_tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ FILE *tmp = th->tmpFH; /* Grab it for convenience */
+ char buf[32768];
+ size_t cnt;
+ pgoff_t len = 0;
+ size_t res;
+ size_t i,
+ pad;
+
+ /*
+ * Find file len & go back to start.
+ */
+ if (fseeko(tmp, 0, SEEK_END) != 0)
+ pg_fatal("error during file seek: %m");
+ th->fileLen = ftello(tmp);
+ if (th->fileLen < 0)
+ pg_fatal("could not determine seek position in archive file: %m");
+ if (fseeko(tmp, 0, SEEK_SET) != 0)
+ pg_fatal("error during file seek: %m");
+
+ _tarWriteHeader(th);
+
+ while ((cnt = fread(buf, 1, sizeof(buf), tmp)) > 0)
+ {
+ if ((res = fwrite(buf, 1, cnt, th->tarFH)) != cnt)
+ WRITE_ERROR_EXIT;
+ len += res;
+ }
+ if (!feof(tmp))
+ READ_ERROR_EXIT(tmp);
+
+ if (fclose(tmp) != 0) /* This *should* delete it... */
+ pg_fatal("could not close temporary file: %m");
+
+ if (len != th->fileLen)
+ pg_fatal("actual file length (%lld) does not match expected (%lld)",
+ (long long) len, (long long) th->fileLen);
+
+ pad = tarPaddingBytesRequired(len);
+ for (i = 0; i < pad; i++)
+ {
+ if (fputc('\0', th->tarFH) == EOF)
+ WRITE_ERROR_EXIT;
+ }
+
+ ctx->tarFHpos += len + pad;
+}
+
+/* Locate the file in the archive, read header and position to data */
+static TAR_MEMBER *
+_tarPositionTo(ArchiveHandle *AH, const char *filename)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ TAR_MEMBER *th = pg_malloc0_object(TAR_MEMBER);
+ char c;
+ char header[TAR_BLOCK_SIZE];
+ size_t i,
+ len,
+ blks;
+ int id;
+
+ th->AH = AH;
+
+ /* Go to end of current file, if any */
+ if (ctx->tarFHpos != 0)
+ {
+ pg_log_debug("moving from position %lld to next member at file position %lld",
+ (long long) ctx->tarFHpos, (long long) ctx->tarNextMember);
+
+ while (ctx->tarFHpos < ctx->tarNextMember)
+ _tarReadRaw(AH, &c, 1, NULL, ctx->tarFH);
+ }
+
+ pg_log_debug("now at file position %lld", (long long) ctx->tarFHpos);
+
+ /* We are at the start of the file, or at the next member */
+
+ /* Get the header */
+ if (!_tarGetHeader(AH, th))
+ {
+ if (filename)
+ pg_fatal("could not find header for file \"%s\" in tar archive", filename);
+ else
+ {
+ /*
+ * We're just scanning the archive for the next file, so return
+ * null
+ */
+ free(th);
+ return NULL;
+ }
+ }
+
+ while (filename != NULL && strcmp(th->targetFile, filename) != 0)
+ {
+ pg_log_debug("skipping tar member %s", th->targetFile);
+
+ id = atoi(th->targetFile);
+ if ((TocIDRequired(AH, id) & REQ_DATA) != 0)
+ pg_fatal("restoring data out of order is not supported in this archive format: "
+ "\"%s\" is required, but comes before \"%s\" in the archive file.",
+ th->targetFile, filename);
+
+ /* Header doesn't match, so read to next header */
+ len = th->fileLen;
+ len += tarPaddingBytesRequired(th->fileLen);
+ blks = len / TAR_BLOCK_SIZE; /* # of tar blocks */
+
+ for (i = 0; i < blks; i++)
+ _tarReadRaw(AH, &header[0], TAR_BLOCK_SIZE, NULL, ctx->tarFH);
+
+ if (!_tarGetHeader(AH, th))
+ pg_fatal("could not find header for file \"%s\" in tar archive", filename);
+ }
+
+ ctx->tarNextMember = ctx->tarFHpos + th->fileLen
+ + tarPaddingBytesRequired(th->fileLen);
+ th->pos = 0;
+
+ return th;
+}
+
+/* Read & verify a header */
+static int
+_tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th)
+{
+ lclContext *ctx = (lclContext *) AH->formatData;
+ char h[TAR_BLOCK_SIZE];
+ char tag[100 + 1];
+ int sum,
+ chk;
+ pgoff_t len;
+ pgoff_t hPos;
+ bool gotBlock = false;
+
+ while (!gotBlock)
+ {
+ /* Save the pos for reporting purposes */
+ hPos = ctx->tarFHpos;
+
+ /* Read the next tar block, return EOF, exit if short */
+ len = _tarReadRaw(AH, h, TAR_BLOCK_SIZE, NULL, ctx->tarFH);
+ if (len == 0) /* EOF */
+ return 0;
+
+ if (len != TAR_BLOCK_SIZE)
+ pg_fatal(ngettext("incomplete tar header found (%lu byte)",
+ "incomplete tar header found (%lu bytes)",
+ len),
+ (unsigned long) len);
+
+ /* Calc checksum */
+ chk = tarChecksum(h);
+ sum = read_tar_number(&h[148], 8);
+
+ /*
+ * If the checksum failed, see if it is a null block. If so, silently
+ * continue to the next block.
+ */
+ if (chk == sum)
+ gotBlock = true;
+ else
+ {
+ int i;
+
+ for (i = 0; i < TAR_BLOCK_SIZE; i++)
+ {
+ if (h[i] != 0)
+ {
+ gotBlock = true;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Name field is 100 bytes, might not be null-terminated */
+ strlcpy(tag, &h[0], 100 + 1);
+
+ len = read_tar_number(&h[124], 12);
+
+ pg_log_debug("TOC Entry %s at %llu (length %llu, checksum %d)",
+ tag, (unsigned long long) hPos, (unsigned long long) len, sum);
+
+ if (chk != sum)
+ pg_fatal("corrupt tar header found in %s (expected %d, computed %d) file position %llu",
+ tag, sum, chk, (unsigned long long) ftello(ctx->tarFH));
+
+ th->targetFile = pg_strdup(tag);
+ th->fileLen = len;
+
+ return 1;
+}
+
+
+static void
+_tarWriteHeader(TAR_MEMBER *th)
+{
+ char h[TAR_BLOCK_SIZE];
+
+ tarCreateHeader(h, th->targetFile, NULL, th->fileLen,
+ 0600, 04000, 02000, time(NULL));
+
+ /* Now write the completed header. */
+ if (fwrite(h, 1, TAR_BLOCK_SIZE, th->tarFH) != TAR_BLOCK_SIZE)
+ WRITE_ERROR_EXIT;
+}
diff --git a/src/bin/pg_dump/pg_backup_tar.h b/src/bin/pg_dump/pg_backup_tar.h
new file mode 100644
index 0000000..0277f08
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_tar.h
@@ -0,0 +1,37 @@
+/*
+ * src/bin/pg_dump/pg_backup_tar.h
+ *
+ * TAR Header (see "ustar interchange format" in POSIX 1003.1)
+ *
+ * Offset Length Contents
+ * 0 100 bytes File name ('\0' terminated, 99 maximum length)
+ * 100 8 bytes File mode (in octal ascii)
+ * 108 8 bytes User ID (in octal ascii)
+ * 116 8 bytes Group ID (in octal ascii)
+ * 124 12 bytes File size (in octal ascii)
+ * 136 12 bytes Modify time (Unix timestamp in octal ascii)
+ * 148 8 bytes Header checksum (in octal ascii)
+ * 156 1 bytes Type flag (see below)
+ * 157 100 bytes Linkname, if symlink ('\0' terminated, 99 maximum length)
+ * 257 6 bytes Magic ("ustar\0")
+ * 263 2 bytes Version ("00")
+ * 265 32 bytes User name ('\0' terminated, 31 maximum length)
+ * 297 32 bytes Group name ('\0' terminated, 31 maximum length)
+ * 329 8 bytes Major device ID (in octal ascii)
+ * 337 8 bytes Minor device ID (in octal ascii)
+ * 345 155 bytes File name prefix (not used in our implementation)
+ * 500 12 bytes Padding
+ *
+ * 512 (s+p)bytes File contents, padded out to 512-byte boundary
+ */
+
+/* The type flag defines the type of file */
+#define LF_OLDNORMAL '\0' /* Normal disk file, Unix compatible */
+#define LF_NORMAL '0' /* Normal disk file */
+#define LF_LINK '1' /* Link to previously dumped file */
+#define LF_SYMLINK '2' /* Symbolic link */
+#define LF_CHR '3' /* Character special file */
+#define LF_BLK '4' /* Block special file */
+#define LF_DIR '5' /* Directory */
+#define LF_FIFO '6' /* FIFO special file */
+#define LF_CONTIG '7' /* Contiguous file */
diff --git a/src/bin/pg_dump/pg_backup_utils.c b/src/bin/pg_dump/pg_backup_utils.c
new file mode 100644
index 0000000..4249584
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_utils.c
@@ -0,0 +1,104 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_utils.c
+ * Utility routines shared by pg_dump and pg_restore
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/pg_backup_utils.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+/* Globals exported by this file */
+const char *progname = NULL;
+
+#define MAX_ON_EXIT_NICELY 20
+
+static struct
+{
+ on_exit_nicely_callback function;
+ void *arg;
+} on_exit_nicely_list[MAX_ON_EXIT_NICELY];
+
+static int on_exit_nicely_index;
+
+/*
+ * Parse a --section=foo command line argument.
+ *
+ * Set or update the bitmask in *dumpSections according to arg.
+ * dumpSections is initialised as DUMP_UNSECTIONED by pg_dump and
+ * pg_restore so they can know if this has even been called.
+ */
+void
+set_dump_section(const char *arg, int *dumpSections)
+{
+ /* if this is the first call, clear all the bits */
+ if (*dumpSections == DUMP_UNSECTIONED)
+ *dumpSections = 0;
+
+ if (strcmp(arg, "pre-data") == 0)
+ *dumpSections |= DUMP_PRE_DATA;
+ else if (strcmp(arg, "data") == 0)
+ *dumpSections |= DUMP_DATA;
+ else if (strcmp(arg, "post-data") == 0)
+ *dumpSections |= DUMP_POST_DATA;
+ else
+ {
+ pg_log_error("unrecognized section name: \"%s\"", arg);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+}
+
+
+/* Register a callback to be run when exit_nicely is invoked. */
+void
+on_exit_nicely(on_exit_nicely_callback function, void *arg)
+{
+ if (on_exit_nicely_index >= MAX_ON_EXIT_NICELY)
+ pg_fatal("out of on_exit_nicely slots");
+ on_exit_nicely_list[on_exit_nicely_index].function = function;
+ on_exit_nicely_list[on_exit_nicely_index].arg = arg;
+ on_exit_nicely_index++;
+}
+
+/*
+ * Run accumulated on_exit_nicely callbacks in reverse order and then exit
+ * without printing any message.
+ *
+ * If running in a parallel worker thread on Windows, we only exit the thread,
+ * not the whole process.
+ *
+ * Note that in parallel operation on Windows, the callback(s) will be run
+ * by each thread since the list state is necessarily shared by all threads;
+ * each callback must contain logic to ensure it does only what's appropriate
+ * for its thread. On Unix, callbacks are also run by each process, but only
+ * for callbacks established before we fork off the child processes. (It'd
+ * be cleaner to reset the list after fork(), and let each child establish
+ * its own callbacks; but then the behavior would be completely inconsistent
+ * between Windows and Unix. For now, just be sure to establish callbacks
+ * before forking to avoid inconsistency.)
+ */
+void
+exit_nicely(int code)
+{
+ int i;
+
+ for (i = on_exit_nicely_index - 1; i >= 0; i--)
+ on_exit_nicely_list[i].function(code,
+ on_exit_nicely_list[i].arg);
+
+#ifdef WIN32
+ if (parallel_init_done && GetCurrentThreadId() != mainThreadId)
+ _endthreadex(code);
+#endif
+
+ exit(code);
+}
diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h
new file mode 100644
index 0000000..b4dfff4
--- /dev/null
+++ b/src/bin/pg_dump/pg_backup_utils.h
@@ -0,0 +1,41 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_backup_utils.h
+ * Utility routines shared by pg_dump and pg_restore.
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/pg_backup_utils.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_BACKUP_UTILS_H
+#define PG_BACKUP_UTILS_H
+
+#include "common/logging.h"
+
+/* bits returned by set_dump_section */
+#define DUMP_PRE_DATA 0x01
+#define DUMP_DATA 0x02
+#define DUMP_POST_DATA 0x04
+#define DUMP_UNSECTIONED 0xff
+
+typedef void (*on_exit_nicely_callback) (int code, void *arg);
+
+extern const char *progname;
+
+extern void set_dump_section(const char *arg, int *dumpSections);
+extern void on_exit_nicely(on_exit_nicely_callback function, void *arg);
+extern void exit_nicely(int code) pg_attribute_noreturn();
+
+/* In pg_dump, we modify pg_fatal to call exit_nicely instead of exit */
+#undef pg_fatal
+#define pg_fatal(...) do { \
+ pg_log_generic(PG_LOG_ERROR, PG_LOG_PRIMARY, __VA_ARGS__); \
+ exit_nicely(1); \
+ } while(0)
+
+#endif /* PG_BACKUP_UTILS_H */
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
new file mode 100644
index 0000000..6e1b070
--- /dev/null
+++ b/src/bin/pg_dump/pg_dump.c
@@ -0,0 +1,18556 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dump.c
+ * pg_dump is a utility for dumping out a postgres database
+ * into a script file.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * pg_dump will read the system catalogs in a database and dump out a
+ * script that reproduces the schema in terms of SQL that is understood
+ * by PostgreSQL
+ *
+ * Note that pg_dump runs in a transaction-snapshot mode transaction,
+ * so it sees a consistent snapshot of the database including system
+ * catalogs. However, it relies in part on various specialized backend
+ * functions like pg_get_indexdef(), and those things tend to look at
+ * the currently committed state. So it is possible to get 'cache
+ * lookup failed' error if someone performs DDL changes while a dump is
+ * happening. The window for this sort of thing is from the acquisition
+ * of the transaction snapshot to getSchemaData() (when pg_dump acquires
+ * AccessShareLock on every table it intends to dump). It isn't very large,
+ * but it can happen.
+ *
+ * http://archives.postgresql.org/pgsql-bugs/2010-02/msg00187.php
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_dump.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <unistd.h>
+#include <ctype.h>
+#include <limits.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "access/attnum.h"
+#include "access/sysattr.h"
+#include "access/transam.h"
+#include "catalog/pg_aggregate_d.h"
+#include "catalog/pg_am_d.h"
+#include "catalog/pg_attribute_d.h"
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_cast_d.h"
+#include "catalog/pg_class_d.h"
+#include "catalog/pg_default_acl_d.h"
+#include "catalog/pg_largeobject_d.h"
+#include "catalog/pg_largeobject_metadata_d.h"
+#include "catalog/pg_proc_d.h"
+#include "catalog/pg_subscription.h"
+#include "catalog/pg_trigger_d.h"
+#include "catalog/pg_type_d.h"
+#include "common/connect.h"
+#include "common/relpath.h"
+#include "compress_io.h"
+#include "dumputils.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "libpq/libpq-fs.h"
+#include "parallel.h"
+#include "pg_backup_db.h"
+#include "pg_backup_utils.h"
+#include "pg_dump.h"
+#include "storage/block.h"
+
+typedef struct
+{
+ Oid roleoid; /* role's OID */
+ const char *rolename; /* role's name */
+} RoleNameItem;
+
+typedef struct
+{
+ const char *descr; /* comment for an object */
+ Oid classoid; /* object class (catalog OID) */
+ Oid objoid; /* object OID */
+ int objsubid; /* subobject (table column #) */
+} CommentItem;
+
+typedef struct
+{
+ const char *provider; /* label provider of this security label */
+ const char *label; /* security label for an object */
+ Oid classoid; /* object class (catalog OID) */
+ Oid objoid; /* object OID */
+ int objsubid; /* subobject (table column #) */
+} SecLabelItem;
+
+typedef enum OidOptions
+{
+ zeroIsError = 1,
+ zeroAsStar = 2,
+ zeroAsNone = 4
+} OidOptions;
+
+/* global decls */
+static bool dosync = true; /* Issue fsync() to make dump durable on disk. */
+
+static Oid g_last_builtin_oid; /* value of the last builtin oid */
+
+/* The specified names/patterns should to match at least one entity */
+static int strict_names = 0;
+
+static pg_compress_algorithm compression_algorithm = PG_COMPRESSION_NONE;
+
+/*
+ * Object inclusion/exclusion lists
+ *
+ * The string lists record the patterns given by command-line switches,
+ * which we then convert to lists of OIDs of matching objects.
+ */
+static SimpleStringList schema_include_patterns = {NULL, NULL};
+static SimpleOidList schema_include_oids = {NULL, NULL};
+static SimpleStringList schema_exclude_patterns = {NULL, NULL};
+static SimpleOidList schema_exclude_oids = {NULL, NULL};
+
+static SimpleStringList table_include_patterns = {NULL, NULL};
+static SimpleStringList table_include_patterns_and_children = {NULL, NULL};
+static SimpleOidList table_include_oids = {NULL, NULL};
+static SimpleStringList table_exclude_patterns = {NULL, NULL};
+static SimpleStringList table_exclude_patterns_and_children = {NULL, NULL};
+static SimpleOidList table_exclude_oids = {NULL, NULL};
+static SimpleStringList tabledata_exclude_patterns = {NULL, NULL};
+static SimpleStringList tabledata_exclude_patterns_and_children = {NULL, NULL};
+static SimpleOidList tabledata_exclude_oids = {NULL, NULL};
+
+static SimpleStringList foreign_servers_include_patterns = {NULL, NULL};
+static SimpleOidList foreign_servers_include_oids = {NULL, NULL};
+
+static SimpleStringList extension_include_patterns = {NULL, NULL};
+static SimpleOidList extension_include_oids = {NULL, NULL};
+
+static const CatalogId nilCatalogId = {0, 0};
+
+/* override for standard extra_float_digits setting */
+static bool have_extra_float_digits = false;
+static int extra_float_digits;
+
+/* sorted table of role names */
+static RoleNameItem *rolenames = NULL;
+static int nrolenames = 0;
+
+/* sorted table of comments */
+static CommentItem *comments = NULL;
+static int ncomments = 0;
+
+/* sorted table of security labels */
+static SecLabelItem *seclabels = NULL;
+static int nseclabels = 0;
+
+/*
+ * The default number of rows per INSERT when
+ * --inserts is specified without --rows-per-insert
+ */
+#define DUMP_DEFAULT_ROWS_PER_INSERT 1
+
+/*
+ * Macro for producing quoted, schema-qualified name of a dumpable object.
+ */
+#define fmtQualifiedDumpable(obj) \
+ fmtQualifiedId((obj)->dobj.namespace->dobj.name, \
+ (obj)->dobj.name)
+
+static void help(const char *progname);
+static void setup_connection(Archive *AH,
+ const char *dumpencoding, const char *dumpsnapshot,
+ char *use_role);
+static ArchiveFormat parseArchiveFormat(const char *format, ArchiveMode *mode);
+static void expand_schema_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names);
+static void expand_extension_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names);
+static void expand_foreign_server_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids);
+static void expand_table_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names,
+ bool with_child_tables);
+static void prohibit_crossdb_refs(PGconn *conn, const char *dbname,
+ const char *pattern);
+
+static NamespaceInfo *findNamespace(Oid nsoid);
+static void dumpTableData(Archive *fout, const TableDataInfo *tdinfo);
+static void refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo);
+static const char *getRoleName(const char *roleoid_str);
+static void collectRoleNames(Archive *fout);
+static void getAdditionalACLs(Archive *fout);
+static void dumpCommentExtended(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId,
+ const char *initdb_comment);
+static inline void dumpComment(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId);
+static int findComments(Oid classoid, Oid objoid, CommentItem **items);
+static void collectComments(Archive *fout);
+static void dumpSecLabel(Archive *fout, const char *type, const char *name,
+ const char *namespace, const char *owner,
+ CatalogId catalogId, int subid, DumpId dumpId);
+static int findSecLabels(Oid classoid, Oid objoid, SecLabelItem **items);
+static void collectSecLabels(Archive *fout);
+static void dumpDumpableObject(Archive *fout, DumpableObject *dobj);
+static void dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo);
+static void dumpExtension(Archive *fout, const ExtensionInfo *extinfo);
+static void dumpType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpBaseType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpEnumType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpRangeType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpDomain(Archive *fout, const TypeInfo *tyinfo);
+static void dumpCompositeType(Archive *fout, const TypeInfo *tyinfo);
+static void dumpCompositeTypeColComments(Archive *fout, const TypeInfo *tyinfo,
+ PGresult *res);
+static void dumpShellType(Archive *fout, const ShellTypeInfo *stinfo);
+static void dumpProcLang(Archive *fout, const ProcLangInfo *plang);
+static void dumpFunc(Archive *fout, const FuncInfo *finfo);
+static void dumpCast(Archive *fout, const CastInfo *cast);
+static void dumpTransform(Archive *fout, const TransformInfo *transform);
+static void dumpOpr(Archive *fout, const OprInfo *oprinfo);
+static void dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo);
+static void dumpOpclass(Archive *fout, const OpclassInfo *opcinfo);
+static void dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo);
+static void dumpCollation(Archive *fout, const CollInfo *collinfo);
+static void dumpConversion(Archive *fout, const ConvInfo *convinfo);
+static void dumpRule(Archive *fout, const RuleInfo *rinfo);
+static void dumpAgg(Archive *fout, const AggInfo *agginfo);
+static void dumpTrigger(Archive *fout, const TriggerInfo *tginfo);
+static void dumpEventTrigger(Archive *fout, const EventTriggerInfo *evtinfo);
+static void dumpTable(Archive *fout, const TableInfo *tbinfo);
+static void dumpTableSchema(Archive *fout, const TableInfo *tbinfo);
+static void dumpTableAttach(Archive *fout, const TableAttachInfo *attachinfo);
+static void dumpAttrDef(Archive *fout, const AttrDefInfo *adinfo);
+static void dumpSequence(Archive *fout, const TableInfo *tbinfo);
+static void dumpSequenceData(Archive *fout, const TableDataInfo *tdinfo);
+static void dumpIndex(Archive *fout, const IndxInfo *indxinfo);
+static void dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo);
+static void dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo);
+static void dumpConstraint(Archive *fout, const ConstraintInfo *coninfo);
+static void dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo);
+static void dumpTSParser(Archive *fout, const TSParserInfo *prsinfo);
+static void dumpTSDictionary(Archive *fout, const TSDictInfo *dictinfo);
+static void dumpTSTemplate(Archive *fout, const TSTemplateInfo *tmplinfo);
+static void dumpTSConfig(Archive *fout, const TSConfigInfo *cfginfo);
+static void dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo);
+static void dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo);
+static void dumpUserMappings(Archive *fout,
+ const char *servername, const char *namespace,
+ const char *owner, CatalogId catalogId, DumpId dumpId);
+static void dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo);
+
+static DumpId dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId,
+ const char *type, const char *name, const char *subname,
+ const char *nspname, const char *owner,
+ const DumpableAcl *dacl);
+
+static void getDependencies(Archive *fout);
+static void BuildArchiveDependencies(Archive *fout);
+static void findDumpableDependencies(ArchiveHandle *AH, const DumpableObject *dobj,
+ DumpId **dependencies, int *nDeps, int *allocDeps);
+
+static DumpableObject *createBoundaryObjects(void);
+static void addBoundaryDependencies(DumpableObject **dobjs, int numObjs,
+ DumpableObject *boundaryObjs);
+
+static void addConstrChildIdxDeps(DumpableObject *dobj, const IndxInfo *refidx);
+static void getDomainConstraints(Archive *fout, TypeInfo *tyinfo);
+static void getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, char relkind);
+static void makeTableDataInfo(DumpOptions *dopt, TableInfo *tbinfo);
+static void buildMatViewRefreshDependencies(Archive *fout);
+static void getTableDataFKConstraints(void);
+static char *format_function_arguments(const FuncInfo *finfo, const char *funcargs,
+ bool is_agg);
+static char *format_function_signature(Archive *fout,
+ const FuncInfo *finfo, bool honor_quotes);
+static char *convertRegProcReference(const char *proc);
+static char *getFormattedOperatorName(const char *oproid);
+static char *convertTSFunction(Archive *fout, Oid funcOid);
+static const char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts);
+static void getLOs(Archive *fout);
+static void dumpLO(Archive *fout, const LoInfo *loinfo);
+static int dumpLOs(Archive *fout, const void *arg);
+static void dumpPolicy(Archive *fout, const PolicyInfo *polinfo);
+static void dumpPublication(Archive *fout, const PublicationInfo *pubinfo);
+static void dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo);
+static void dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo);
+static void dumpDatabase(Archive *fout);
+static void dumpDatabaseConfig(Archive *AH, PQExpBuffer outbuf,
+ const char *dbname, Oid dboid);
+static void dumpEncoding(Archive *AH);
+static void dumpStdStrings(Archive *AH);
+static void dumpSearchPath(Archive *AH);
+static void binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ Oid pg_type_oid,
+ bool force_array_type,
+ bool include_multirange_type);
+static void binary_upgrade_set_type_oids_by_rel(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ const TableInfo *tbinfo);
+static void binary_upgrade_set_pg_class_oids(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ Oid pg_class_oid, bool is_index);
+static void binary_upgrade_extension_member(PQExpBuffer upgrade_buffer,
+ const DumpableObject *dobj,
+ const char *objtype,
+ const char *objname,
+ const char *objnamespace);
+static const char *getAttrName(int attrnum, const TableInfo *tblInfo);
+static const char *fmtCopyColumnList(const TableInfo *ti, PQExpBuffer buffer);
+static bool nonemptyReloptions(const char *reloptions);
+static void appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions,
+ const char *prefix, Archive *fout);
+static char *get_synchronized_snapshot(Archive *fout);
+static void setupDumpWorker(Archive *AH);
+static TableInfo *getRootTableInfo(const TableInfo *tbinfo);
+static bool forcePartitionRootLoad(const TableInfo *tbinfo);
+
+
+int
+main(int argc, char **argv)
+{
+ int c;
+ const char *filename = NULL;
+ const char *format = "p";
+ TableInfo *tblinfo;
+ int numTables;
+ DumpableObject **dobjs;
+ int numObjs;
+ DumpableObject *boundaryObjs;
+ int i;
+ int optindex;
+ RestoreOptions *ropt;
+ Archive *fout; /* the script file */
+ bool g_verbose = false;
+ const char *dumpencoding = NULL;
+ const char *dumpsnapshot = NULL;
+ char *use_role = NULL;
+ int numWorkers = 1;
+ int plainText = 0;
+ ArchiveFormat archiveFormat = archUnknown;
+ ArchiveMode archiveMode;
+ pg_compress_specification compression_spec = {0};
+ char *compression_detail = NULL;
+ char *compression_algorithm_str = "none";
+ char *error_detail = NULL;
+ bool user_compression_defined = false;
+
+ static DumpOptions dopt;
+
+ static struct option long_options[] = {
+ {"data-only", no_argument, NULL, 'a'},
+ {"blobs", no_argument, NULL, 'b'},
+ {"large-objects", no_argument, NULL, 'b'},
+ {"no-blobs", no_argument, NULL, 'B'},
+ {"no-large-objects", no_argument, NULL, 'B'},
+ {"clean", no_argument, NULL, 'c'},
+ {"create", no_argument, NULL, 'C'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"extension", required_argument, NULL, 'e'},
+ {"file", required_argument, NULL, 'f'},
+ {"format", required_argument, NULL, 'F'},
+ {"host", required_argument, NULL, 'h'},
+ {"jobs", 1, NULL, 'j'},
+ {"no-reconnect", no_argument, NULL, 'R'},
+ {"no-owner", no_argument, NULL, 'O'},
+ {"port", required_argument, NULL, 'p'},
+ {"schema", required_argument, NULL, 'n'},
+ {"exclude-schema", required_argument, NULL, 'N'},
+ {"schema-only", no_argument, NULL, 's'},
+ {"superuser", required_argument, NULL, 'S'},
+ {"table", required_argument, NULL, 't'},
+ {"exclude-table", required_argument, NULL, 'T'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"username", required_argument, NULL, 'U'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"no-privileges", no_argument, NULL, 'x'},
+ {"no-acl", no_argument, NULL, 'x'},
+ {"compress", required_argument, NULL, 'Z'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"help", no_argument, NULL, '?'},
+ {"version", no_argument, NULL, 'V'},
+
+ /*
+ * the following options don't have an equivalent short option letter
+ */
+ {"attribute-inserts", no_argument, &dopt.column_inserts, 1},
+ {"binary-upgrade", no_argument, &dopt.binary_upgrade, 1},
+ {"column-inserts", no_argument, &dopt.column_inserts, 1},
+ {"disable-dollar-quoting", no_argument, &dopt.disable_dollar_quoting, 1},
+ {"disable-triggers", no_argument, &dopt.disable_triggers, 1},
+ {"enable-row-security", no_argument, &dopt.enable_row_security, 1},
+ {"exclude-table-data", required_argument, NULL, 4},
+ {"extra-float-digits", required_argument, NULL, 8},
+ {"if-exists", no_argument, &dopt.if_exists, 1},
+ {"inserts", no_argument, NULL, 9},
+ {"lock-wait-timeout", required_argument, NULL, 2},
+ {"no-table-access-method", no_argument, &dopt.outputNoTableAm, 1},
+ {"no-tablespaces", no_argument, &dopt.outputNoTablespaces, 1},
+ {"quote-all-identifiers", no_argument, &quote_all_identifiers, 1},
+ {"load-via-partition-root", no_argument, &dopt.load_via_partition_root, 1},
+ {"role", required_argument, NULL, 3},
+ {"section", required_argument, NULL, 5},
+ {"serializable-deferrable", no_argument, &dopt.serializable_deferrable, 1},
+ {"snapshot", required_argument, NULL, 6},
+ {"strict-names", no_argument, &strict_names, 1},
+ {"use-set-session-authorization", no_argument, &dopt.use_setsessauth, 1},
+ {"no-comments", no_argument, &dopt.no_comments, 1},
+ {"no-publications", no_argument, &dopt.no_publications, 1},
+ {"no-security-labels", no_argument, &dopt.no_security_labels, 1},
+ {"no-subscriptions", no_argument, &dopt.no_subscriptions, 1},
+ {"no-toast-compression", no_argument, &dopt.no_toast_compression, 1},
+ {"no-unlogged-table-data", no_argument, &dopt.no_unlogged_table_data, 1},
+ {"no-sync", no_argument, NULL, 7},
+ {"on-conflict-do-nothing", no_argument, &dopt.do_nothing, 1},
+ {"rows-per-insert", required_argument, NULL, 10},
+ {"include-foreign-data", required_argument, NULL, 11},
+ {"table-and-children", required_argument, NULL, 12},
+ {"exclude-table-and-children", required_argument, NULL, 13},
+ {"exclude-table-data-and-children", required_argument, NULL, 14},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
+
+ /*
+ * Initialize what we need for parallel execution, especially for thread
+ * support on Windows.
+ */
+ init_parallel_dump_utils();
+
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ help(progname);
+ exit_nicely(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_dump (PostgreSQL) " PG_VERSION);
+ exit_nicely(0);
+ }
+ }
+
+ InitDumpOptions(&dopt);
+
+ while ((c = getopt_long(argc, argv, "abBcCd:e:E:f:F:h:j:n:N:Op:RsS:t:T:U:vwWxZ:",
+ long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a': /* Dump data only */
+ dopt.dataOnly = true;
+ break;
+
+ case 'b': /* Dump LOs */
+ dopt.outputLOs = true;
+ break;
+
+ case 'B': /* Don't dump LOs */
+ dopt.dontOutputLOs = true;
+ break;
+
+ case 'c': /* clean (i.e., drop) schema prior to create */
+ dopt.outputClean = 1;
+ break;
+
+ case 'C': /* Create DB */
+ dopt.outputCreateDB = 1;
+ break;
+
+ case 'd': /* database name */
+ dopt.cparams.dbname = pg_strdup(optarg);
+ break;
+
+ case 'e': /* include extension(s) */
+ simple_string_list_append(&extension_include_patterns, optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 'E': /* Dump encoding */
+ dumpencoding = pg_strdup(optarg);
+ break;
+
+ case 'f':
+ filename = pg_strdup(optarg);
+ break;
+
+ case 'F':
+ format = pg_strdup(optarg);
+ break;
+
+ case 'h': /* server host */
+ dopt.cparams.pghost = pg_strdup(optarg);
+ break;
+
+ case 'j': /* number of dump jobs */
+ if (!option_parse_int(optarg, "-j/--jobs", 1,
+ PG_MAX_JOBS,
+ &numWorkers))
+ exit_nicely(1);
+ break;
+
+ case 'n': /* include schema(s) */
+ simple_string_list_append(&schema_include_patterns, optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 'N': /* exclude schema(s) */
+ simple_string_list_append(&schema_exclude_patterns, optarg);
+ break;
+
+ case 'O': /* Don't reconnect to match owner */
+ dopt.outputNoOwner = 1;
+ break;
+
+ case 'p': /* server port */
+ dopt.cparams.pgport = pg_strdup(optarg);
+ break;
+
+ case 'R':
+ /* no-op, still accepted for backwards compatibility */
+ break;
+
+ case 's': /* dump schema only */
+ dopt.schemaOnly = true;
+ break;
+
+ case 'S': /* Username for superuser in plain text output */
+ dopt.outputSuperuser = pg_strdup(optarg);
+ break;
+
+ case 't': /* include table(s) */
+ simple_string_list_append(&table_include_patterns, optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 'T': /* exclude table(s) */
+ simple_string_list_append(&table_exclude_patterns, optarg);
+ break;
+
+ case 'U':
+ dopt.cparams.username = pg_strdup(optarg);
+ break;
+
+ case 'v': /* verbose */
+ g_verbose = true;
+ pg_logging_increase_verbosity();
+ break;
+
+ case 'w':
+ dopt.cparams.promptPassword = TRI_NO;
+ break;
+
+ case 'W':
+ dopt.cparams.promptPassword = TRI_YES;
+ break;
+
+ case 'x': /* skip ACL dump */
+ dopt.aclsSkip = true;
+ break;
+
+ case 'Z': /* Compression */
+ parse_compress_options(optarg, &compression_algorithm_str,
+ &compression_detail);
+ user_compression_defined = true;
+ break;
+
+ case 0:
+ /* This covers the long options. */
+ break;
+
+ case 2: /* lock-wait-timeout */
+ dopt.lockWaitTimeout = pg_strdup(optarg);
+ break;
+
+ case 3: /* SET ROLE */
+ use_role = pg_strdup(optarg);
+ break;
+
+ case 4: /* exclude table(s) data */
+ simple_string_list_append(&tabledata_exclude_patterns, optarg);
+ break;
+
+ case 5: /* section */
+ set_dump_section(optarg, &dopt.dumpSections);
+ break;
+
+ case 6: /* snapshot */
+ dumpsnapshot = pg_strdup(optarg);
+ break;
+
+ case 7: /* no-sync */
+ dosync = false;
+ break;
+
+ case 8:
+ have_extra_float_digits = true;
+ if (!option_parse_int(optarg, "--extra-float-digits", -15, 3,
+ &extra_float_digits))
+ exit_nicely(1);
+ break;
+
+ case 9: /* inserts */
+
+ /*
+ * dump_inserts also stores --rows-per-insert, careful not to
+ * overwrite that.
+ */
+ if (dopt.dump_inserts == 0)
+ dopt.dump_inserts = DUMP_DEFAULT_ROWS_PER_INSERT;
+ break;
+
+ case 10: /* rows per insert */
+ if (!option_parse_int(optarg, "--rows-per-insert", 1, INT_MAX,
+ &dopt.dump_inserts))
+ exit_nicely(1);
+ break;
+
+ case 11: /* include foreign data */
+ simple_string_list_append(&foreign_servers_include_patterns,
+ optarg);
+ break;
+
+ case 12: /* include table(s) and their children */
+ simple_string_list_append(&table_include_patterns_and_children,
+ optarg);
+ dopt.include_everything = false;
+ break;
+
+ case 13: /* exclude table(s) and their children */
+ simple_string_list_append(&table_exclude_patterns_and_children,
+ optarg);
+ break;
+
+ case 14: /* exclude data of table(s) and children */
+ simple_string_list_append(&tabledata_exclude_patterns_and_children,
+ optarg);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dopt.cparams.dbname == NULL)
+ dopt.cparams.dbname = argv[optind++];
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /* --column-inserts implies --inserts */
+ if (dopt.column_inserts && dopt.dump_inserts == 0)
+ dopt.dump_inserts = DUMP_DEFAULT_ROWS_PER_INSERT;
+
+ /*
+ * Binary upgrade mode implies dumping sequence data even in schema-only
+ * mode. This is not exposed as a separate option, but kept separate
+ * internally for clarity.
+ */
+ if (dopt.binary_upgrade)
+ dopt.sequence_data = 1;
+
+ if (dopt.dataOnly && dopt.schemaOnly)
+ pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together");
+
+ if (dopt.schemaOnly && foreign_servers_include_patterns.head != NULL)
+ pg_fatal("options -s/--schema-only and --include-foreign-data cannot be used together");
+
+ if (numWorkers > 1 && foreign_servers_include_patterns.head != NULL)
+ pg_fatal("option --include-foreign-data is not supported with parallel backup");
+
+ if (dopt.dataOnly && dopt.outputClean)
+ pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
+
+ if (dopt.if_exists && !dopt.outputClean)
+ pg_fatal("option --if-exists requires option -c/--clean");
+
+ /*
+ * --inserts are already implied above if --column-inserts or
+ * --rows-per-insert were specified.
+ */
+ if (dopt.do_nothing && dopt.dump_inserts == 0)
+ pg_fatal("option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts");
+
+ /* Identify archive format to emit */
+ archiveFormat = parseArchiveFormat(format, &archiveMode);
+
+ /* archiveFormat specific setup */
+ if (archiveFormat == archNull)
+ plainText = 1;
+
+ /*
+ * Custom and directory formats are compressed by default with gzip when
+ * available, not the others. If gzip is not available, no compression is
+ * done by default.
+ */
+ if ((archiveFormat == archCustom || archiveFormat == archDirectory) &&
+ !user_compression_defined)
+ {
+#ifdef HAVE_LIBZ
+ compression_algorithm_str = "gzip";
+#else
+ compression_algorithm_str = "none";
+#endif
+ }
+
+ /*
+ * Compression options
+ */
+ if (!parse_compress_algorithm(compression_algorithm_str,
+ &compression_algorithm))
+ pg_fatal("unrecognized compression algorithm: \"%s\"",
+ compression_algorithm_str);
+
+ parse_compress_specification(compression_algorithm, compression_detail,
+ &compression_spec);
+ error_detail = validate_compress_specification(&compression_spec);
+ if (error_detail != NULL)
+ pg_fatal("invalid compression specification: %s",
+ error_detail);
+
+ error_detail = supports_compression(compression_spec);
+ if (error_detail != NULL)
+ pg_fatal("%s", error_detail);
+
+ /*
+ * Disable support for zstd workers for now - these are based on
+ * threading, and it's unclear how it interacts with parallel dumps on
+ * platforms where that relies on threads too (e.g. Windows).
+ */
+ if (compression_spec.options & PG_COMPRESSION_OPTION_WORKERS)
+ pg_log_warning("compression option \"%s\" is not currently supported by pg_dump",
+ "workers");
+
+ /*
+ * If emitting an archive format, we always want to emit a DATABASE item,
+ * in case --create is specified at pg_restore time.
+ */
+ if (!plainText)
+ dopt.outputCreateDB = 1;
+
+ /* Parallel backup only in the directory archive format so far */
+ if (archiveFormat != archDirectory && numWorkers > 1)
+ pg_fatal("parallel backup only supported by the directory format");
+
+ /* Open the output file */
+ fout = CreateArchive(filename, archiveFormat, compression_spec,
+ dosync, archiveMode, setupDumpWorker);
+
+ /* Make dump options accessible right away */
+ SetArchiveOptions(fout, &dopt, NULL);
+
+ /* Register the cleanup hook */
+ on_exit_close_archive(fout);
+
+ /* Let the archiver know how noisy to be */
+ fout->verbose = g_verbose;
+
+
+ /*
+ * We allow the server to be back to 9.2, and up to any minor release of
+ * our own major version. (See also version check in pg_dumpall.c.)
+ */
+ fout->minRemoteVersion = 90200;
+ fout->maxRemoteVersion = (PG_VERSION_NUM / 100) * 100 + 99;
+
+ fout->numWorkers = numWorkers;
+
+ /*
+ * Open the database using the Archiver, so it knows about it. Errors mean
+ * death.
+ */
+ ConnectDatabase(fout, &dopt.cparams, false);
+ setup_connection(fout, dumpencoding, dumpsnapshot, use_role);
+
+ /*
+ * On hot standbys, never try to dump unlogged table data, since it will
+ * just throw an error.
+ */
+ if (fout->isStandby)
+ dopt.no_unlogged_table_data = true;
+
+ /*
+ * Find the last built-in OID, if needed (prior to 8.1)
+ *
+ * With 8.1 and above, we can just use FirstNormalObjectId - 1.
+ */
+ g_last_builtin_oid = FirstNormalObjectId - 1;
+
+ pg_log_info("last built-in OID is %u", g_last_builtin_oid);
+
+ /* Expand schema selection patterns into OID lists */
+ if (schema_include_patterns.head != NULL)
+ {
+ expand_schema_name_patterns(fout, &schema_include_patterns,
+ &schema_include_oids,
+ strict_names);
+ if (schema_include_oids.head == NULL)
+ pg_fatal("no matching schemas were found");
+ }
+ expand_schema_name_patterns(fout, &schema_exclude_patterns,
+ &schema_exclude_oids,
+ false);
+ /* non-matching exclusion patterns aren't an error */
+
+ /* Expand table selection patterns into OID lists */
+ expand_table_name_patterns(fout, &table_include_patterns,
+ &table_include_oids,
+ strict_names, false);
+ expand_table_name_patterns(fout, &table_include_patterns_and_children,
+ &table_include_oids,
+ strict_names, true);
+ if ((table_include_patterns.head != NULL ||
+ table_include_patterns_and_children.head != NULL) &&
+ table_include_oids.head == NULL)
+ pg_fatal("no matching tables were found");
+
+ expand_table_name_patterns(fout, &table_exclude_patterns,
+ &table_exclude_oids,
+ false, false);
+ expand_table_name_patterns(fout, &table_exclude_patterns_and_children,
+ &table_exclude_oids,
+ false, true);
+
+ expand_table_name_patterns(fout, &tabledata_exclude_patterns,
+ &tabledata_exclude_oids,
+ false, false);
+ expand_table_name_patterns(fout, &tabledata_exclude_patterns_and_children,
+ &tabledata_exclude_oids,
+ false, true);
+
+ expand_foreign_server_name_patterns(fout, &foreign_servers_include_patterns,
+ &foreign_servers_include_oids);
+
+ /* non-matching exclusion patterns aren't an error */
+
+ /* Expand extension selection patterns into OID lists */
+ if (extension_include_patterns.head != NULL)
+ {
+ expand_extension_name_patterns(fout, &extension_include_patterns,
+ &extension_include_oids,
+ strict_names);
+ if (extension_include_oids.head == NULL)
+ pg_fatal("no matching extensions were found");
+ }
+
+ /*
+ * Dumping LOs is the default for dumps where an inclusion switch is not
+ * used (an "include everything" dump). -B can be used to exclude LOs
+ * from those dumps. -b can be used to include LOs even when an inclusion
+ * switch is used.
+ *
+ * -s means "schema only" and LOs are data, not schema, so we never
+ * include LOs when -s is used.
+ */
+ if (dopt.include_everything && !dopt.schemaOnly && !dopt.dontOutputLOs)
+ dopt.outputLOs = true;
+
+ /*
+ * Collect role names so we can map object owner OIDs to names.
+ */
+ collectRoleNames(fout);
+
+ /*
+ * Now scan the database and create DumpableObject structs for all the
+ * objects we intend to dump.
+ */
+ tblinfo = getSchemaData(fout, &numTables);
+
+ if (!dopt.schemaOnly)
+ {
+ getTableData(&dopt, tblinfo, numTables, 0);
+ buildMatViewRefreshDependencies(fout);
+ if (dopt.dataOnly)
+ getTableDataFKConstraints();
+ }
+
+ if (dopt.schemaOnly && dopt.sequence_data)
+ getTableData(&dopt, tblinfo, numTables, RELKIND_SEQUENCE);
+
+ /*
+ * In binary-upgrade mode, we do not have to worry about the actual LO
+ * data or the associated metadata that resides in the pg_largeobject and
+ * pg_largeobject_metadata tables, respectively.
+ *
+ * However, we do need to collect LO information as there may be comments
+ * or other information on LOs that we do need to dump out.
+ */
+ if (dopt.outputLOs || dopt.binary_upgrade)
+ getLOs(fout);
+
+ /*
+ * Collect dependency data to assist in ordering the objects.
+ */
+ getDependencies(fout);
+
+ /*
+ * Collect ACLs, comments, and security labels, if wanted.
+ */
+ if (!dopt.aclsSkip)
+ getAdditionalACLs(fout);
+ if (!dopt.no_comments)
+ collectComments(fout);
+ if (!dopt.no_security_labels)
+ collectSecLabels(fout);
+
+ /* Lastly, create dummy objects to represent the section boundaries */
+ boundaryObjs = createBoundaryObjects();
+
+ /* Get pointers to all the known DumpableObjects */
+ getDumpableObjects(&dobjs, &numObjs);
+
+ /*
+ * Add dummy dependencies to enforce the dump section ordering.
+ */
+ addBoundaryDependencies(dobjs, numObjs, boundaryObjs);
+
+ /*
+ * Sort the objects into a safe dump order (no forward references).
+ *
+ * We rely on dependency information to help us determine a safe order, so
+ * the initial sort is mostly for cosmetic purposes: we sort by name to
+ * ensure that logically identical schemas will dump identically.
+ */
+ sortDumpableObjectsByTypeName(dobjs, numObjs);
+
+ sortDumpableObjects(dobjs, numObjs,
+ boundaryObjs[0].dumpId, boundaryObjs[1].dumpId);
+
+ /*
+ * Create archive TOC entries for all the objects to be dumped, in a safe
+ * order.
+ */
+
+ /*
+ * First the special entries for ENCODING, STDSTRINGS, and SEARCHPATH.
+ */
+ dumpEncoding(fout);
+ dumpStdStrings(fout);
+ dumpSearchPath(fout);
+
+ /* The database items are always next, unless we don't want them at all */
+ if (dopt.outputCreateDB)
+ dumpDatabase(fout);
+
+ /* Now the rearrangeable objects. */
+ for (i = 0; i < numObjs; i++)
+ dumpDumpableObject(fout, dobjs[i]);
+
+ /*
+ * Set up options info to ensure we dump what we want.
+ */
+ ropt = NewRestoreOptions();
+ ropt->filename = filename;
+
+ /* if you change this list, see dumpOptionsFromRestoreOptions */
+ ropt->cparams.dbname = dopt.cparams.dbname ? pg_strdup(dopt.cparams.dbname) : NULL;
+ ropt->cparams.pgport = dopt.cparams.pgport ? pg_strdup(dopt.cparams.pgport) : NULL;
+ ropt->cparams.pghost = dopt.cparams.pghost ? pg_strdup(dopt.cparams.pghost) : NULL;
+ ropt->cparams.username = dopt.cparams.username ? pg_strdup(dopt.cparams.username) : NULL;
+ ropt->cparams.promptPassword = dopt.cparams.promptPassword;
+ ropt->dropSchema = dopt.outputClean;
+ ropt->dataOnly = dopt.dataOnly;
+ ropt->schemaOnly = dopt.schemaOnly;
+ ropt->if_exists = dopt.if_exists;
+ ropt->column_inserts = dopt.column_inserts;
+ ropt->dumpSections = dopt.dumpSections;
+ ropt->aclsSkip = dopt.aclsSkip;
+ ropt->superuser = dopt.outputSuperuser;
+ ropt->createDB = dopt.outputCreateDB;
+ ropt->noOwner = dopt.outputNoOwner;
+ ropt->noTableAm = dopt.outputNoTableAm;
+ ropt->noTablespace = dopt.outputNoTablespaces;
+ ropt->disable_triggers = dopt.disable_triggers;
+ ropt->use_setsessauth = dopt.use_setsessauth;
+ ropt->disable_dollar_quoting = dopt.disable_dollar_quoting;
+ ropt->dump_inserts = dopt.dump_inserts;
+ ropt->no_comments = dopt.no_comments;
+ ropt->no_publications = dopt.no_publications;
+ ropt->no_security_labels = dopt.no_security_labels;
+ ropt->no_subscriptions = dopt.no_subscriptions;
+ ropt->lockWaitTimeout = dopt.lockWaitTimeout;
+ ropt->include_everything = dopt.include_everything;
+ ropt->enable_row_security = dopt.enable_row_security;
+ ropt->sequence_data = dopt.sequence_data;
+ ropt->binary_upgrade = dopt.binary_upgrade;
+
+ ropt->compression_spec = compression_spec;
+
+ ropt->suppressDumpWarnings = true; /* We've already shown them */
+
+ SetArchiveOptions(fout, &dopt, ropt);
+
+ /* Mark which entries should be output */
+ ProcessArchiveRestoreOptions(fout);
+
+ /*
+ * The archive's TOC entries are now marked as to which ones will actually
+ * be output, so we can set up their dependency lists properly. This isn't
+ * necessary for plain-text output, though.
+ */
+ if (!plainText)
+ BuildArchiveDependencies(fout);
+
+ /*
+ * And finally we can do the actual output.
+ *
+ * Note: for non-plain-text output formats, the output file is written
+ * inside CloseArchive(). This is, um, bizarre; but not worth changing
+ * right now.
+ */
+ if (plainText)
+ RestoreArchive(fout);
+
+ CloseArchive(fout);
+
+ exit_nicely(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s dumps a database as a text file or to other formats.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -f, --file=FILENAME output file or directory name\n"));
+ printf(_(" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+ " plain text (default))\n"));
+ printf(_(" -j, --jobs=NUM use this many parallel jobs to dump\n"));
+ printf(_(" -v, --verbose verbose mode\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -Z, --compress=METHOD[:DETAIL]\n"
+ " compress as specified\n"));
+ printf(_(" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
+ printf(_(" --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nOptions controlling the output content:\n"));
+ printf(_(" -a, --data-only dump only the data, not the schema\n"));
+ printf(_(" -b, --large-objects include large objects in dump\n"));
+ printf(_(" --blobs (same as --large-objects, deprecated)\n"));
+ printf(_(" -B, --no-large-objects exclude large objects in dump\n"));
+ printf(_(" --no-blobs (same as --no-large-objects, deprecated)\n"));
+ printf(_(" -c, --clean clean (drop) database objects before recreating\n"));
+ printf(_(" -C, --create include commands to create database in dump\n"));
+ printf(_(" -e, --extension=PATTERN dump the specified extension(s) only\n"));
+ printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n"));
+ printf(_(" -n, --schema=PATTERN dump the specified schema(s) only\n"));
+ printf(_(" -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"));
+ printf(_(" -O, --no-owner skip restoration of object ownership in\n"
+ " plain-text format\n"));
+ printf(_(" -s, --schema-only dump only the schema, no data\n"));
+ printf(_(" -S, --superuser=NAME superuser user name to use in plain-text format\n"));
+ printf(_(" -t, --table=PATTERN dump only the specified table(s)\n"));
+ printf(_(" -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"));
+ printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n"));
+ printf(_(" --binary-upgrade for use by upgrade utilities only\n"));
+ printf(_(" --column-inserts dump data as INSERT commands with column names\n"));
+ printf(_(" --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"));
+ printf(_(" --disable-triggers disable triggers during data-only restore\n"));
+ printf(_(" --enable-row-security enable row security (dump only content user has\n"
+ " access to)\n"));
+ printf(_(" --exclude-table-and-children=PATTERN\n"
+ " do NOT dump the specified table(s), including\n"
+ " child and partition tables\n"));
+ printf(_(" --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"));
+ printf(_(" --exclude-table-data-and-children=PATTERN\n"
+ " do NOT dump data for the specified table(s),\n"
+ " including child and partition tables\n"));
+ printf(_(" --extra-float-digits=NUM override default setting for extra_float_digits\n"));
+ printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
+ printf(_(" --include-foreign-data=PATTERN\n"
+ " include data of foreign tables on foreign\n"
+ " servers matching PATTERN\n"));
+ printf(_(" --inserts dump data as INSERT commands, rather than COPY\n"));
+ printf(_(" --load-via-partition-root load partitions via the root table\n"));
+ printf(_(" --no-comments do not dump comments\n"));
+ printf(_(" --no-publications do not dump publications\n"));
+ printf(_(" --no-security-labels do not dump security label assignments\n"));
+ printf(_(" --no-subscriptions do not dump subscriptions\n"));
+ printf(_(" --no-table-access-method do not dump table access methods\n"));
+ printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
+ printf(_(" --no-toast-compression do not dump TOAST compression methods\n"));
+ printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
+ printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"));
+ printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n"));
+ printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"));
+ printf(_(" --section=SECTION dump named section (pre-data, data, or post-data)\n"));
+ printf(_(" --serializable-deferrable wait until the dump can run without anomalies\n"));
+ printf(_(" --snapshot=SNAPSHOT use given snapshot for the dump\n"));
+ printf(_(" --strict-names require table and/or schema include patterns to\n"
+ " match at least one entity each\n"));
+ printf(_(" --table-and-children=PATTERN dump only the specified table(s), including\n"
+ " child and partition tables\n"));
+ printf(_(" --use-set-session-authorization\n"
+ " use SET SESSION AUTHORIZATION commands instead of\n"
+ " ALTER OWNER commands to set ownership\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=DBNAME database to dump\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_(" --role=ROLENAME do SET ROLE before dump\n"));
+
+ printf(_("\nIf no database name is supplied, then the PGDATABASE environment\n"
+ "variable value is used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+static void
+setup_connection(Archive *AH, const char *dumpencoding,
+ const char *dumpsnapshot, char *use_role)
+{
+ DumpOptions *dopt = AH->dopt;
+ PGconn *conn = GetConnection(AH);
+ const char *std_strings;
+
+ PQclear(ExecuteSqlQueryForSingleRow(AH, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ /*
+ * Set the client encoding if requested.
+ */
+ if (dumpencoding)
+ {
+ if (PQsetClientEncoding(conn, dumpencoding) < 0)
+ pg_fatal("invalid client encoding \"%s\" specified",
+ dumpencoding);
+ }
+
+ /*
+ * Get the active encoding and the standard_conforming_strings setting, so
+ * we know how to escape strings.
+ */
+ AH->encoding = PQclientEncoding(conn);
+
+ std_strings = PQparameterStatus(conn, "standard_conforming_strings");
+ AH->std_strings = (std_strings && strcmp(std_strings, "on") == 0);
+
+ /*
+ * Set the role if requested. In a parallel dump worker, we'll be passed
+ * use_role == NULL, but AH->use_role is already set (if user specified it
+ * originally) and we should use that.
+ */
+ if (!use_role && AH->use_role)
+ use_role = AH->use_role;
+
+ /* Set the role if requested */
+ if (use_role)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SET ROLE %s", fmtId(use_role));
+ ExecuteSqlStatement(AH, query->data);
+ destroyPQExpBuffer(query);
+
+ /* save it for possible later use by parallel workers */
+ if (!AH->use_role)
+ AH->use_role = pg_strdup(use_role);
+ }
+
+ /* Set the datestyle to ISO to ensure the dump's portability */
+ ExecuteSqlStatement(AH, "SET DATESTYLE = ISO");
+
+ /* Likewise, avoid using sql_standard intervalstyle */
+ ExecuteSqlStatement(AH, "SET INTERVALSTYLE = POSTGRES");
+
+ /*
+ * Use an explicitly specified extra_float_digits if it has been provided.
+ * Otherwise, set extra_float_digits so that we can dump float data
+ * exactly (given correctly implemented float I/O code, anyway).
+ */
+ if (have_extra_float_digits)
+ {
+ PQExpBuffer q = createPQExpBuffer();
+
+ appendPQExpBuffer(q, "SET extra_float_digits TO %d",
+ extra_float_digits);
+ ExecuteSqlStatement(AH, q->data);
+ destroyPQExpBuffer(q);
+ }
+ else
+ ExecuteSqlStatement(AH, "SET extra_float_digits TO 3");
+
+ /*
+ * Disable synchronized scanning, to prevent unpredictable changes in row
+ * ordering across a dump and reload.
+ */
+ ExecuteSqlStatement(AH, "SET synchronize_seqscans TO off");
+
+ /*
+ * Disable timeouts if supported.
+ */
+ ExecuteSqlStatement(AH, "SET statement_timeout = 0");
+ if (AH->remoteVersion >= 90300)
+ ExecuteSqlStatement(AH, "SET lock_timeout = 0");
+ if (AH->remoteVersion >= 90600)
+ ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0");
+
+ /*
+ * Quote all identifiers, if requested.
+ */
+ if (quote_all_identifiers)
+ ExecuteSqlStatement(AH, "SET quote_all_identifiers = true");
+
+ /*
+ * Adjust row-security mode, if supported.
+ */
+ if (AH->remoteVersion >= 90500)
+ {
+ if (dopt->enable_row_security)
+ ExecuteSqlStatement(AH, "SET row_security = on");
+ else
+ ExecuteSqlStatement(AH, "SET row_security = off");
+ }
+
+ /*
+ * Initialize prepared-query state to "nothing prepared". We do this here
+ * so that a parallel dump worker will have its own state.
+ */
+ AH->is_prepared = (bool *) pg_malloc0(NUM_PREP_QUERIES * sizeof(bool));
+
+ /*
+ * Start transaction-snapshot mode transaction to dump consistent data.
+ */
+ ExecuteSqlStatement(AH, "BEGIN");
+
+ /*
+ * To support the combination of serializable_deferrable with the jobs
+ * option we use REPEATABLE READ for the worker connections that are
+ * passed a snapshot. As long as the snapshot is acquired in a
+ * SERIALIZABLE, READ ONLY, DEFERRABLE transaction, its use within a
+ * REPEATABLE READ transaction provides the appropriate integrity
+ * guarantees. This is a kluge, but safe for back-patching.
+ */
+ if (dopt->serializable_deferrable && AH->sync_snapshot_id == NULL)
+ ExecuteSqlStatement(AH,
+ "SET TRANSACTION ISOLATION LEVEL "
+ "SERIALIZABLE, READ ONLY, DEFERRABLE");
+ else
+ ExecuteSqlStatement(AH,
+ "SET TRANSACTION ISOLATION LEVEL "
+ "REPEATABLE READ, READ ONLY");
+
+ /*
+ * If user specified a snapshot to use, select that. In a parallel dump
+ * worker, we'll be passed dumpsnapshot == NULL, but AH->sync_snapshot_id
+ * is already set (if the server can handle it) and we should use that.
+ */
+ if (dumpsnapshot)
+ AH->sync_snapshot_id = pg_strdup(dumpsnapshot);
+
+ if (AH->sync_snapshot_id)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SET TRANSACTION SNAPSHOT ");
+ appendStringLiteralConn(query, AH->sync_snapshot_id, conn);
+ ExecuteSqlStatement(AH, query->data);
+ destroyPQExpBuffer(query);
+ }
+ else if (AH->numWorkers > 1)
+ {
+ if (AH->isStandby && AH->remoteVersion < 100000)
+ pg_fatal("parallel dumps from standby servers are not supported by this server version");
+ AH->sync_snapshot_id = get_synchronized_snapshot(AH);
+ }
+}
+
+/* Set up connection for a parallel worker process */
+static void
+setupDumpWorker(Archive *AH)
+{
+ /*
+ * We want to re-select all the same values the leader connection is
+ * using. We'll have inherited directly-usable values in
+ * AH->sync_snapshot_id and AH->use_role, but we need to translate the
+ * inherited encoding value back to a string to pass to setup_connection.
+ */
+ setup_connection(AH,
+ pg_encoding_to_char(AH->encoding),
+ NULL,
+ NULL);
+}
+
+static char *
+get_synchronized_snapshot(Archive *fout)
+{
+ char *query = "SELECT pg_catalog.pg_export_snapshot()";
+ char *result;
+ PGresult *res;
+
+ res = ExecuteSqlQueryForSingleRow(fout, query);
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+ PQclear(res);
+
+ return result;
+}
+
+static ArchiveFormat
+parseArchiveFormat(const char *format, ArchiveMode *mode)
+{
+ ArchiveFormat archiveFormat;
+
+ *mode = archModeWrite;
+
+ if (pg_strcasecmp(format, "a") == 0 || pg_strcasecmp(format, "append") == 0)
+ {
+ /* This is used by pg_dumpall, and is not documented */
+ archiveFormat = archNull;
+ *mode = archModeAppend;
+ }
+ else if (pg_strcasecmp(format, "c") == 0)
+ archiveFormat = archCustom;
+ else if (pg_strcasecmp(format, "custom") == 0)
+ archiveFormat = archCustom;
+ else if (pg_strcasecmp(format, "d") == 0)
+ archiveFormat = archDirectory;
+ else if (pg_strcasecmp(format, "directory") == 0)
+ archiveFormat = archDirectory;
+ else if (pg_strcasecmp(format, "p") == 0)
+ archiveFormat = archNull;
+ else if (pg_strcasecmp(format, "plain") == 0)
+ archiveFormat = archNull;
+ else if (pg_strcasecmp(format, "t") == 0)
+ archiveFormat = archTar;
+ else if (pg_strcasecmp(format, "tar") == 0)
+ archiveFormat = archTar;
+ else
+ pg_fatal("invalid output format \"%s\" specified", format);
+ return archiveFormat;
+}
+
+/*
+ * Find the OIDs of all schemas matching the given list of patterns,
+ * and append them to the given OID list.
+ */
+static void
+expand_schema_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs might sometimes result in
+ * duplicate entries in the OID list, but we don't care.
+ */
+
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ PQExpBufferData dbbuf;
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT oid FROM pg_catalog.pg_namespace n\n");
+ initPQExpBuffer(&dbbuf);
+ processSQLNamePattern(GetConnection(fout), query, cell->val, false,
+ false, NULL, "n.nspname", NULL, NULL, &dbbuf,
+ &dotcnt);
+ if (dotcnt > 1)
+ pg_fatal("improper qualified name (too many dotted names): %s",
+ cell->val);
+ else if (dotcnt == 1)
+ prohibit_crossdb_refs(GetConnection(fout), dbbuf.data, cell->val);
+ termPQExpBuffer(&dbbuf);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ if (strict_names && PQntuples(res) == 0)
+ pg_fatal("no matching schemas were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Find the OIDs of all extensions matching the given list of patterns,
+ * and append them to the given OID list.
+ */
+static void
+expand_extension_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids,
+ bool strict_names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs might sometimes result in
+ * duplicate entries in the OID list, but we don't care.
+ */
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT oid FROM pg_catalog.pg_extension e\n");
+ processSQLNamePattern(GetConnection(fout), query, cell->val, false,
+ false, NULL, "e.extname", NULL, NULL, NULL,
+ &dotcnt);
+ if (dotcnt > 0)
+ pg_fatal("improper qualified name (too many dotted names): %s",
+ cell->val);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ if (strict_names && PQntuples(res) == 0)
+ pg_fatal("no matching extensions were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Find the OIDs of all foreign servers matching the given list of patterns,
+ * and append them to the given OID list.
+ */
+static void
+expand_foreign_server_name_patterns(Archive *fout,
+ SimpleStringList *patterns,
+ SimpleOidList *oids)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs might sometimes result in
+ * duplicate entries in the OID list, but we don't care.
+ */
+
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT oid FROM pg_catalog.pg_foreign_server s\n");
+ processSQLNamePattern(GetConnection(fout), query, cell->val, false,
+ false, NULL, "s.srvname", NULL, NULL, NULL,
+ &dotcnt);
+ if (dotcnt > 0)
+ pg_fatal("improper qualified name (too many dotted names): %s",
+ cell->val);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ if (PQntuples(res) == 0)
+ pg_fatal("no matching foreign servers were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Find the OIDs of all tables matching the given list of patterns,
+ * and append them to the given OID list. See also expand_dbname_patterns()
+ * in pg_dumpall.c
+ */
+static void
+expand_table_name_patterns(Archive *fout,
+ SimpleStringList *patterns, SimpleOidList *oids,
+ bool strict_names, bool with_child_tables)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ SimpleStringListCell *cell;
+ int i;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * this might sometimes result in duplicate entries in the OID list, but
+ * we don't care.
+ */
+
+ for (cell = patterns->head; cell; cell = cell->next)
+ {
+ PQExpBufferData dbbuf;
+ int dotcnt;
+
+ /*
+ * Query must remain ABSOLUTELY devoid of unqualified names. This
+ * would be unnecessary given a pg_table_is_visible() variant taking a
+ * search_path argument.
+ *
+ * For with_child_tables, we start with the basic query's results and
+ * recursively search the inheritance tree to add child tables.
+ */
+ if (with_child_tables)
+ {
+ appendPQExpBuffer(query, "WITH RECURSIVE partition_tree (relid) AS (\n");
+ }
+
+ appendPQExpBuffer(query,
+ "SELECT c.oid"
+ "\nFROM pg_catalog.pg_class c"
+ "\n LEFT JOIN pg_catalog.pg_namespace n"
+ "\n ON n.oid OPERATOR(pg_catalog.=) c.relnamespace"
+ "\nWHERE c.relkind OPERATOR(pg_catalog.=) ANY"
+ "\n (array['%c', '%c', '%c', '%c', '%c', '%c'])\n",
+ RELKIND_RELATION, RELKIND_SEQUENCE, RELKIND_VIEW,
+ RELKIND_MATVIEW, RELKIND_FOREIGN_TABLE,
+ RELKIND_PARTITIONED_TABLE);
+ initPQExpBuffer(&dbbuf);
+ processSQLNamePattern(GetConnection(fout), query, cell->val, true,
+ false, "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)", &dbbuf,
+ &dotcnt);
+ if (dotcnt > 2)
+ pg_fatal("improper relation name (too many dotted names): %s",
+ cell->val);
+ else if (dotcnt == 2)
+ prohibit_crossdb_refs(GetConnection(fout), dbbuf.data, cell->val);
+ termPQExpBuffer(&dbbuf);
+
+ if (with_child_tables)
+ {
+ appendPQExpBuffer(query, "UNION"
+ "\nSELECT i.inhrelid"
+ "\nFROM partition_tree p"
+ "\n JOIN pg_catalog.pg_inherits i"
+ "\n ON p.relid OPERATOR(pg_catalog.=) i.inhparent"
+ "\n)"
+ "\nSELECT relid FROM partition_tree");
+ }
+
+ ExecuteSqlStatement(fout, "RESET search_path");
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ PQclear(ExecuteSqlQueryForSingleRow(fout,
+ ALWAYS_SECURE_SEARCH_PATH_SQL));
+ if (strict_names && PQntuples(res) == 0)
+ pg_fatal("no matching tables were found for pattern \"%s\"", cell->val);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ simple_oid_list_append(oids, atooid(PQgetvalue(res, i, 0)));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Verifies that the connected database name matches the given database name,
+ * and if not, dies with an error about the given pattern.
+ *
+ * The 'dbname' argument should be a literal name parsed from 'pattern'.
+ */
+static void
+prohibit_crossdb_refs(PGconn *conn, const char *dbname, const char *pattern)
+{
+ const char *db;
+
+ db = PQdb(conn);
+ if (db == NULL)
+ pg_fatal("You are currently not connected to a database.");
+
+ if (strcmp(db, dbname) != 0)
+ pg_fatal("cross-database references are not implemented: %s",
+ pattern);
+}
+
+/*
+ * checkExtensionMembership
+ * Determine whether object is an extension member, and if so,
+ * record an appropriate dependency and set the object's dump flag.
+ *
+ * It's important to call this for each object that could be an extension
+ * member. Generally, we integrate this with determining the object's
+ * to-be-dumped-ness, since extension membership overrides other rules for that.
+ *
+ * Returns true if object is an extension member, else false.
+ */
+static bool
+checkExtensionMembership(DumpableObject *dobj, Archive *fout)
+{
+ ExtensionInfo *ext = findOwningExtension(dobj->catId);
+
+ if (ext == NULL)
+ return false;
+
+ dobj->ext_member = true;
+
+ /* Record dependency so that getDependencies needn't deal with that */
+ addObjectDependency(dobj, ext->dobj.dumpId);
+
+ /*
+ * In 9.6 and above, mark the member object to have any non-initial ACLs
+ * dumped. (Any initial ACLs will be removed later, using data from
+ * pg_init_privs, so that we'll dump only the delta from the extension's
+ * initial setup.)
+ *
+ * Prior to 9.6, we do not include any extension member components.
+ *
+ * In binary upgrades, we still dump all components of the members
+ * individually, since the idea is to exactly reproduce the database
+ * contents rather than replace the extension contents with something
+ * different.
+ *
+ * Note: it might be interesting someday to implement storage and delta
+ * dumping of extension members' RLS policies and/or security labels.
+ * However there is a pitfall for RLS policies: trying to dump them
+ * requires getting a lock on their tables, and the calling user might not
+ * have privileges for that. We need no lock to examine a table's ACLs,
+ * so the current feature doesn't have a problem of that sort.
+ */
+ if (fout->dopt->binary_upgrade)
+ dobj->dump = ext->dobj.dump;
+ else
+ {
+ if (fout->remoteVersion < 90600)
+ dobj->dump = DUMP_COMPONENT_NONE;
+ else
+ dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL);
+ }
+
+ return true;
+}
+
+/*
+ * selectDumpableNamespace: policy-setting subroutine
+ * Mark a namespace as to be dumped or not
+ */
+static void
+selectDumpableNamespace(NamespaceInfo *nsinfo, Archive *fout)
+{
+ /*
+ * DUMP_COMPONENT_DEFINITION typically implies a CREATE SCHEMA statement
+ * and (for --clean) a DROP SCHEMA statement. (In the absence of
+ * DUMP_COMPONENT_DEFINITION, this value is irrelevant.)
+ */
+ nsinfo->create = true;
+
+ /*
+ * If specific tables are being dumped, do not dump any complete
+ * namespaces. If specific namespaces are being dumped, dump just those
+ * namespaces. Otherwise, dump all non-system namespaces.
+ */
+ if (table_include_oids.head != NULL)
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ else if (schema_include_oids.head != NULL)
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump =
+ simple_oid_list_member(&schema_include_oids,
+ nsinfo->dobj.catId.oid) ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ else if (fout->remoteVersion >= 90600 &&
+ strcmp(nsinfo->dobj.name, "pg_catalog") == 0)
+ {
+ /*
+ * In 9.6 and above, we dump out any ACLs defined in pg_catalog, if
+ * they are interesting (and not the original ACLs which were set at
+ * initdb time, see pg_init_privs).
+ */
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ACL;
+ }
+ else if (strncmp(nsinfo->dobj.name, "pg_", 3) == 0 ||
+ strcmp(nsinfo->dobj.name, "information_schema") == 0)
+ {
+ /* Other system schemas don't get dumped */
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ }
+ else if (strcmp(nsinfo->dobj.name, "public") == 0)
+ {
+ /*
+ * The public schema is a strange beast that sits in a sort of
+ * no-mans-land between being a system object and a user object.
+ * CREATE SCHEMA would fail, so its DUMP_COMPONENT_DEFINITION is just
+ * a comment and an indication of ownership. If the owner is the
+ * default, omit that superfluous DUMP_COMPONENT_DEFINITION. Before
+ * v15, the default owner was BOOTSTRAP_SUPERUSERID.
+ */
+ nsinfo->create = false;
+ nsinfo->dobj.dump = DUMP_COMPONENT_ALL;
+ if (nsinfo->nspowner == ROLE_PG_DATABASE_OWNER)
+ nsinfo->dobj.dump &= ~DUMP_COMPONENT_DEFINITION;
+ nsinfo->dobj.dump_contains = DUMP_COMPONENT_ALL;
+
+ /*
+ * Also, make like it has a comment even if it doesn't; this is so
+ * that we'll emit a command to drop the comment, if appropriate.
+ * (Without this, we'd not call dumpCommentExtended for it.)
+ */
+ nsinfo->dobj.components |= DUMP_COMPONENT_COMMENT;
+ }
+ else
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ALL;
+
+ /*
+ * In any case, a namespace can be excluded by an exclusion switch
+ */
+ if (nsinfo->dobj.dump_contains &&
+ simple_oid_list_member(&schema_exclude_oids,
+ nsinfo->dobj.catId.oid))
+ nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_NONE;
+
+ /*
+ * If the schema belongs to an extension, allow extension membership to
+ * override the dump decision for the schema itself. However, this does
+ * not change dump_contains, so this won't change what we do with objects
+ * within the schema. (If they belong to the extension, they'll get
+ * suppressed by it, otherwise not.)
+ */
+ (void) checkExtensionMembership(&nsinfo->dobj, fout);
+}
+
+/*
+ * selectDumpableTable: policy-setting subroutine
+ * Mark a table as to be dumped or not
+ */
+static void
+selectDumpableTable(TableInfo *tbinfo, Archive *fout)
+{
+ if (checkExtensionMembership(&tbinfo->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * If specific tables are being dumped, dump just those tables; else, dump
+ * according to the parent namespace's dump flag.
+ */
+ if (table_include_oids.head != NULL)
+ tbinfo->dobj.dump = simple_oid_list_member(&table_include_oids,
+ tbinfo->dobj.catId.oid) ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ else
+ tbinfo->dobj.dump = tbinfo->dobj.namespace->dobj.dump_contains;
+
+ /*
+ * In any case, a table can be excluded by an exclusion switch
+ */
+ if (tbinfo->dobj.dump &&
+ simple_oid_list_member(&table_exclude_oids,
+ tbinfo->dobj.catId.oid))
+ tbinfo->dobj.dump = DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableType: policy-setting subroutine
+ * Mark a type as to be dumped or not
+ *
+ * If it's a table's rowtype or an autogenerated array type, we also apply a
+ * special type code to facilitate sorting into the desired order. (We don't
+ * want to consider those to be ordinary types because that would bring tables
+ * up into the datatype part of the dump order.) We still set the object's
+ * dump flag; that's not going to cause the dummy type to be dumped, but we
+ * need it so that casts involving such types will be dumped correctly -- see
+ * dumpCast. This means the flag should be set the same as for the underlying
+ * object (the table or base type).
+ */
+static void
+selectDumpableType(TypeInfo *tyinfo, Archive *fout)
+{
+ /* skip complex types, except for standalone composite types */
+ if (OidIsValid(tyinfo->typrelid) &&
+ tyinfo->typrelkind != RELKIND_COMPOSITE_TYPE)
+ {
+ TableInfo *tytable = findTableByOid(tyinfo->typrelid);
+
+ tyinfo->dobj.objType = DO_DUMMY_TYPE;
+ if (tytable != NULL)
+ tyinfo->dobj.dump = tytable->dobj.dump;
+ else
+ tyinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ return;
+ }
+
+ /* skip auto-generated array types */
+ if (tyinfo->isArray || tyinfo->isMultirange)
+ {
+ tyinfo->dobj.objType = DO_DUMMY_TYPE;
+
+ /*
+ * Fall through to set the dump flag; we assume that the subsequent
+ * rules will do the same thing as they would for the array's base
+ * type. (We cannot reliably look up the base type here, since
+ * getTypes may not have processed it yet.)
+ */
+ }
+
+ if (checkExtensionMembership(&tyinfo->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /* Dump based on if the contents of the namespace are being dumped */
+ tyinfo->dobj.dump = tyinfo->dobj.namespace->dobj.dump_contains;
+}
+
+/*
+ * selectDumpableDefaultACL: policy-setting subroutine
+ * Mark a default ACL as to be dumped or not
+ *
+ * For per-schema default ACLs, dump if the schema is to be dumped.
+ * Otherwise dump if we are dumping "everything". Note that dataOnly
+ * and aclsSkip are checked separately.
+ */
+static void
+selectDumpableDefaultACL(DefaultACLInfo *dinfo, DumpOptions *dopt)
+{
+ /* Default ACLs can't be extension members */
+
+ if (dinfo->dobj.namespace)
+ /* default ACLs are considered part of the namespace */
+ dinfo->dobj.dump = dinfo->dobj.namespace->dobj.dump_contains;
+ else
+ dinfo->dobj.dump = dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableCast: policy-setting subroutine
+ * Mark a cast as to be dumped or not
+ *
+ * Casts do not belong to any particular namespace (since they haven't got
+ * names), nor do they have identifiable owners. To distinguish user-defined
+ * casts from built-in ones, we must resort to checking whether the cast's
+ * OID is in the range reserved for initdb.
+ */
+static void
+selectDumpableCast(CastInfo *cast, Archive *fout)
+{
+ if (checkExtensionMembership(&cast->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * This would be DUMP_COMPONENT_ACL for from-initdb casts, but they do not
+ * support ACLs currently.
+ */
+ if (cast->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ cast->dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ cast->dobj.dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableProcLang: policy-setting subroutine
+ * Mark a procedural language as to be dumped or not
+ *
+ * Procedural languages do not belong to any particular namespace. To
+ * identify built-in languages, we must resort to checking whether the
+ * language's OID is in the range reserved for initdb.
+ */
+static void
+selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
+{
+ if (checkExtensionMembership(&plang->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * Only include procedural languages when we are dumping everything.
+ *
+ * For from-initdb procedural languages, only include ACLs, as we do for
+ * the pg_catalog namespace. We need this because procedural languages do
+ * not live in any namespace.
+ */
+ if (!fout->dopt->include_everything)
+ plang->dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ {
+ if (plang->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ plang->dobj.dump = fout->remoteVersion < 90600 ?
+ DUMP_COMPONENT_NONE : DUMP_COMPONENT_ACL;
+ else
+ plang->dobj.dump = DUMP_COMPONENT_ALL;
+ }
+}
+
+/*
+ * selectDumpableAccessMethod: policy-setting subroutine
+ * Mark an access method as to be dumped or not
+ *
+ * Access methods do not belong to any particular namespace. To identify
+ * built-in access methods, we must resort to checking whether the
+ * method's OID is in the range reserved for initdb.
+ */
+static void
+selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
+{
+ if (checkExtensionMembership(&method->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * This would be DUMP_COMPONENT_ACL for from-initdb access methods, but
+ * they do not support ACLs currently.
+ */
+ if (method->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ method->dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ method->dobj.dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableExtension: policy-setting subroutine
+ * Mark an extension as to be dumped or not
+ *
+ * Built-in extensions should be skipped except for checking ACLs, since we
+ * assume those will already be installed in the target database. We identify
+ * such extensions by their having OIDs in the range reserved for initdb.
+ * We dump all user-added extensions by default. No extensions are dumped
+ * if include_everything is false (i.e., a --schema or --table switch was
+ * given), except if --extension specifies a list of extensions to dump.
+ */
+static void
+selectDumpableExtension(ExtensionInfo *extinfo, DumpOptions *dopt)
+{
+ /*
+ * Use DUMP_COMPONENT_ACL for built-in extensions, to allow users to
+ * change permissions on their member objects, if they wish to, and have
+ * those changes preserved.
+ */
+ if (extinfo->dobj.catId.oid <= (Oid) g_last_builtin_oid)
+ extinfo->dobj.dump = extinfo->dobj.dump_contains = DUMP_COMPONENT_ACL;
+ else
+ {
+ /* check if there is a list of extensions to dump */
+ if (extension_include_oids.head != NULL)
+ extinfo->dobj.dump = extinfo->dobj.dump_contains =
+ simple_oid_list_member(&extension_include_oids,
+ extinfo->dobj.catId.oid) ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ else
+ extinfo->dobj.dump = extinfo->dobj.dump_contains =
+ dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+ }
+}
+
+/*
+ * selectDumpablePublicationObject: policy-setting subroutine
+ * Mark a publication object as to be dumped or not
+ *
+ * A publication can have schemas and tables which have schemas, but those are
+ * ignored in decision making, because publications are only dumped when we are
+ * dumping everything.
+ */
+static void
+selectDumpablePublicationObject(DumpableObject *dobj, Archive *fout)
+{
+ if (checkExtensionMembership(dobj, fout))
+ return; /* extension membership overrides all else */
+
+ dobj->dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableStatisticsObject: policy-setting subroutine
+ * Mark an extended statistics object as to be dumped or not
+ *
+ * We dump an extended statistics object if the schema it's in and the table
+ * it's for are being dumped. (This'll need more thought if statistics
+ * objects ever support cross-table stats.)
+ */
+static void
+selectDumpableStatisticsObject(StatsExtInfo *sobj, Archive *fout)
+{
+ if (checkExtensionMembership(&sobj->dobj, fout))
+ return; /* extension membership overrides all else */
+
+ sobj->dobj.dump = sobj->dobj.namespace->dobj.dump_contains;
+ if (sobj->stattable == NULL ||
+ !(sobj->stattable->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ sobj->dobj.dump = DUMP_COMPONENT_NONE;
+}
+
+/*
+ * selectDumpableObject: policy-setting subroutine
+ * Mark a generic dumpable object as to be dumped or not
+ *
+ * Use this only for object types without a special-case routine above.
+ */
+static void
+selectDumpableObject(DumpableObject *dobj, Archive *fout)
+{
+ if (checkExtensionMembership(dobj, fout))
+ return; /* extension membership overrides all else */
+
+ /*
+ * Default policy is to dump if parent namespace is dumpable, or for
+ * non-namespace-associated items, dump if we're dumping "everything".
+ */
+ if (dobj->namespace)
+ dobj->dump = dobj->namespace->dobj.dump_contains;
+ else
+ dobj->dump = fout->dopt->include_everything ?
+ DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE;
+}
+
+/*
+ * Dump a table's contents for loading using the COPY command
+ * - this routine is called by the Archiver when it wants the table
+ * to be dumped.
+ */
+static int
+dumpTableData_copy(Archive *fout, const void *dcontext)
+{
+ TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
+ TableInfo *tbinfo = tdinfo->tdtable;
+ const char *classname = tbinfo->dobj.name;
+ PQExpBuffer q = createPQExpBuffer();
+
+ /*
+ * Note: can't use getThreadLocalPQExpBuffer() here, we're calling fmtId
+ * which uses it already.
+ */
+ PQExpBuffer clistBuf = createPQExpBuffer();
+ PGconn *conn = GetConnection(fout);
+ PGresult *res;
+ int ret;
+ char *copybuf;
+ const char *column_list;
+
+ pg_log_info("dumping contents of table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name, classname);
+
+ /*
+ * Specify the column list explicitly so that we have no possibility of
+ * retrieving data in the wrong column order. (The default column
+ * ordering of COPY will not be what we want in certain corner cases
+ * involving ADD COLUMN and inheritance.)
+ */
+ column_list = fmtCopyColumnList(tbinfo, clistBuf);
+
+ /*
+ * Use COPY (SELECT ...) TO when dumping a foreign table's data, and when
+ * a filter condition was specified. For other cases a simple COPY
+ * suffices.
+ */
+ if (tdinfo->filtercond || tbinfo->relkind == RELKIND_FOREIGN_TABLE)
+ {
+ appendPQExpBufferStr(q, "COPY (SELECT ");
+ /* klugery to get rid of parens in column list */
+ if (strlen(column_list) > 2)
+ {
+ appendPQExpBufferStr(q, column_list + 1);
+ q->data[q->len - 1] = ' ';
+ }
+ else
+ appendPQExpBufferStr(q, "* ");
+
+ appendPQExpBuffer(q, "FROM %s %s) TO stdout;",
+ fmtQualifiedDumpable(tbinfo),
+ tdinfo->filtercond ? tdinfo->filtercond : "");
+ }
+ else
+ {
+ appendPQExpBuffer(q, "COPY %s %s TO stdout;",
+ fmtQualifiedDumpable(tbinfo),
+ column_list);
+ }
+ res = ExecuteSqlQuery(fout, q->data, PGRES_COPY_OUT);
+ PQclear(res);
+ destroyPQExpBuffer(clistBuf);
+
+ for (;;)
+ {
+ ret = PQgetCopyData(conn, &copybuf, 0);
+
+ if (ret < 0)
+ break; /* done or error */
+
+ if (copybuf)
+ {
+ WriteData(fout, copybuf, ret);
+ PQfreemem(copybuf);
+ }
+
+ /* ----------
+ * THROTTLE:
+ *
+ * There was considerable discussion in late July, 2000 regarding
+ * slowing down pg_dump when backing up large tables. Users with both
+ * slow & fast (multi-processor) machines experienced performance
+ * degradation when doing a backup.
+ *
+ * Initial attempts based on sleeping for a number of ms for each ms
+ * of work were deemed too complex, then a simple 'sleep in each loop'
+ * implementation was suggested. The latter failed because the loop
+ * was too tight. Finally, the following was implemented:
+ *
+ * If throttle is non-zero, then
+ * See how long since the last sleep.
+ * Work out how long to sleep (based on ratio).
+ * If sleep is more than 100ms, then
+ * sleep
+ * reset timer
+ * EndIf
+ * EndIf
+ *
+ * where the throttle value was the number of ms to sleep per ms of
+ * work. The calculation was done in each loop.
+ *
+ * Most of the hard work is done in the backend, and this solution
+ * still did not work particularly well: on slow machines, the ratio
+ * was 50:1, and on medium paced machines, 1:1, and on fast
+ * multi-processor machines, it had little or no effect, for reasons
+ * that were unclear.
+ *
+ * Further discussion ensued, and the proposal was dropped.
+ *
+ * For those people who want this feature, it can be implemented using
+ * gettimeofday in each loop, calculating the time since last sleep,
+ * multiplying that by the sleep ratio, then if the result is more
+ * than a preset 'minimum sleep time' (say 100ms), call the 'select'
+ * function to sleep for a subsecond period ie.
+ *
+ * select(0, NULL, NULL, NULL, &tvi);
+ *
+ * This will return after the interval specified in the structure tvi.
+ * Finally, call gettimeofday again to save the 'last sleep time'.
+ * ----------
+ */
+ }
+ archprintf(fout, "\\.\n\n\n");
+
+ if (ret == -2)
+ {
+ /* copy data transfer failed */
+ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.", classname);
+ pg_log_error_detail("Error message from server: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Command was: %s", q->data);
+ exit_nicely(1);
+ }
+
+ /* Check command status and return to normal libpq state */
+ res = PQgetResult(conn);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetResult() failed.", classname);
+ pg_log_error_detail("Error message from server: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Command was: %s", q->data);
+ exit_nicely(1);
+ }
+ PQclear(res);
+
+ /* Do this to ensure we've pumped libpq back to idle state */
+ if (PQgetResult(conn) != NULL)
+ pg_log_warning("unexpected extra results during COPY of table \"%s\"",
+ classname);
+
+ destroyPQExpBuffer(q);
+ return 1;
+}
+
+/*
+ * Dump table data using INSERT commands.
+ *
+ * Caution: when we restore from an archive file direct to database, the
+ * INSERT commands emitted by this function have to be parsed by
+ * pg_backup_db.c's ExecuteSimpleCommands(), which will not handle comments,
+ * E'' strings, or dollar-quoted strings. So don't emit anything like that.
+ */
+static int
+dumpTableData_insert(Archive *fout, const void *dcontext)
+{
+ TableDataInfo *tdinfo = (TableDataInfo *) dcontext;
+ TableInfo *tbinfo = tdinfo->tdtable;
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer insertStmt = NULL;
+ char *attgenerated;
+ PGresult *res;
+ int nfields,
+ i;
+ int rows_per_statement = dopt->dump_inserts;
+ int rows_this_statement = 0;
+
+ /*
+ * If we're going to emit INSERTs with column names, the most efficient
+ * way to deal with generated columns is to exclude them entirely. For
+ * INSERTs without column names, we have to emit DEFAULT rather than the
+ * actual column value --- but we can save a few cycles by fetching nulls
+ * rather than the uninteresting-to-us value.
+ */
+ attgenerated = (char *) pg_malloc(tbinfo->numatts * sizeof(char));
+ appendPQExpBufferStr(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT ");
+ nfields = 0;
+ for (i = 0; i < tbinfo->numatts; i++)
+ {
+ if (tbinfo->attisdropped[i])
+ continue;
+ if (tbinfo->attgenerated[i] && dopt->column_inserts)
+ continue;
+ if (nfields > 0)
+ appendPQExpBufferStr(q, ", ");
+ if (tbinfo->attgenerated[i])
+ appendPQExpBufferStr(q, "NULL");
+ else
+ appendPQExpBufferStr(q, fmtId(tbinfo->attnames[i]));
+ attgenerated[nfields] = tbinfo->attgenerated[i];
+ nfields++;
+ }
+ /* Servers before 9.4 will complain about zero-column SELECT */
+ if (nfields == 0)
+ appendPQExpBufferStr(q, "NULL");
+ appendPQExpBuffer(q, " FROM ONLY %s",
+ fmtQualifiedDumpable(tbinfo));
+ if (tdinfo->filtercond)
+ appendPQExpBuffer(q, " %s", tdinfo->filtercond);
+
+ ExecuteSqlStatement(fout, q->data);
+
+ while (1)
+ {
+ res = ExecuteSqlQuery(fout, "FETCH 100 FROM _pg_dump_cursor",
+ PGRES_TUPLES_OK);
+
+ /* cross-check field count, allowing for dummy NULL if any */
+ if (nfields != PQnfields(res) &&
+ !(nfields == 0 && PQnfields(res) == 1))
+ pg_fatal("wrong number of fields retrieved from table \"%s\"",
+ tbinfo->dobj.name);
+
+ /*
+ * First time through, we build as much of the INSERT statement as
+ * possible in "insertStmt", which we can then just print for each
+ * statement. If the table happens to have zero dumpable columns then
+ * this will be a complete statement, otherwise it will end in
+ * "VALUES" and be ready to have the row's column values printed.
+ */
+ if (insertStmt == NULL)
+ {
+ TableInfo *targettab;
+
+ insertStmt = createPQExpBuffer();
+
+ /*
+ * When load-via-partition-root is set or forced, get the root
+ * table name for the partition table, so that we can reload data
+ * through the root table.
+ */
+ if (tbinfo->ispartition &&
+ (dopt->load_via_partition_root ||
+ forcePartitionRootLoad(tbinfo)))
+ targettab = getRootTableInfo(tbinfo);
+ else
+ targettab = tbinfo;
+
+ appendPQExpBuffer(insertStmt, "INSERT INTO %s ",
+ fmtQualifiedDumpable(targettab));
+
+ /* corner case for zero-column table */
+ if (nfields == 0)
+ {
+ appendPQExpBufferStr(insertStmt, "DEFAULT VALUES;\n");
+ }
+ else
+ {
+ /* append the list of column names if required */
+ if (dopt->column_inserts)
+ {
+ appendPQExpBufferChar(insertStmt, '(');
+ for (int field = 0; field < nfields; field++)
+ {
+ if (field > 0)
+ appendPQExpBufferStr(insertStmt, ", ");
+ appendPQExpBufferStr(insertStmt,
+ fmtId(PQfname(res, field)));
+ }
+ appendPQExpBufferStr(insertStmt, ") ");
+ }
+
+ if (tbinfo->needs_override)
+ appendPQExpBufferStr(insertStmt, "OVERRIDING SYSTEM VALUE ");
+
+ appendPQExpBufferStr(insertStmt, "VALUES");
+ }
+ }
+
+ for (int tuple = 0; tuple < PQntuples(res); tuple++)
+ {
+ /* Write the INSERT if not in the middle of a multi-row INSERT. */
+ if (rows_this_statement == 0)
+ archputs(insertStmt->data, fout);
+
+ /*
+ * If it is zero-column table then we've already written the
+ * complete statement, which will mean we've disobeyed
+ * --rows-per-insert when it's set greater than 1. We do support
+ * a way to make this multi-row with: SELECT UNION ALL SELECT
+ * UNION ALL ... but that's non-standard so we should avoid it
+ * given that using INSERTs is mostly only ever needed for
+ * cross-database exports.
+ */
+ if (nfields == 0)
+ continue;
+
+ /* Emit a row heading */
+ if (rows_per_statement == 1)
+ archputs(" (", fout);
+ else if (rows_this_statement > 0)
+ archputs(",\n\t(", fout);
+ else
+ archputs("\n\t(", fout);
+
+ for (int field = 0; field < nfields; field++)
+ {
+ if (field > 0)
+ archputs(", ", fout);
+ if (attgenerated[field])
+ {
+ archputs("DEFAULT", fout);
+ continue;
+ }
+ if (PQgetisnull(res, tuple, field))
+ {
+ archputs("NULL", fout);
+ continue;
+ }
+
+ /* XXX This code is partially duplicated in ruleutils.c */
+ switch (PQftype(res, field))
+ {
+ case INT2OID:
+ case INT4OID:
+ case INT8OID:
+ case OIDOID:
+ case FLOAT4OID:
+ case FLOAT8OID:
+ case NUMERICOID:
+ {
+ /*
+ * These types are printed without quotes unless
+ * they contain values that aren't accepted by the
+ * scanner unquoted (e.g., 'NaN'). Note that
+ * strtod() and friends might accept NaN, so we
+ * can't use that to test.
+ *
+ * In reality we only need to defend against
+ * infinity and NaN, so we need not get too crazy
+ * about pattern matching here.
+ */
+ const char *s = PQgetvalue(res, tuple, field);
+
+ if (strspn(s, "0123456789 +-eE.") == strlen(s))
+ archputs(s, fout);
+ else
+ archprintf(fout, "'%s'", s);
+ }
+ break;
+
+ case BITOID:
+ case VARBITOID:
+ archprintf(fout, "B'%s'",
+ PQgetvalue(res, tuple, field));
+ break;
+
+ case BOOLOID:
+ if (strcmp(PQgetvalue(res, tuple, field), "t") == 0)
+ archputs("true", fout);
+ else
+ archputs("false", fout);
+ break;
+
+ default:
+ /* All other types are printed as string literals. */
+ resetPQExpBuffer(q);
+ appendStringLiteralAH(q,
+ PQgetvalue(res, tuple, field),
+ fout);
+ archputs(q->data, fout);
+ break;
+ }
+ }
+
+ /* Terminate the row ... */
+ archputs(")", fout);
+
+ /* ... and the statement, if the target no. of rows is reached */
+ if (++rows_this_statement >= rows_per_statement)
+ {
+ if (dopt->do_nothing)
+ archputs(" ON CONFLICT DO NOTHING;\n", fout);
+ else
+ archputs(";\n", fout);
+ /* Reset the row counter */
+ rows_this_statement = 0;
+ }
+ }
+
+ if (PQntuples(res) <= 0)
+ {
+ PQclear(res);
+ break;
+ }
+ PQclear(res);
+ }
+
+ /* Terminate any statements that didn't make the row count. */
+ if (rows_this_statement > 0)
+ {
+ if (dopt->do_nothing)
+ archputs(" ON CONFLICT DO NOTHING;\n", fout);
+ else
+ archputs(";\n", fout);
+ }
+
+ archputs("\n\n", fout);
+
+ ExecuteSqlStatement(fout, "CLOSE _pg_dump_cursor");
+
+ destroyPQExpBuffer(q);
+ if (insertStmt != NULL)
+ destroyPQExpBuffer(insertStmt);
+ free(attgenerated);
+
+ return 1;
+}
+
+/*
+ * getRootTableInfo:
+ * get the root TableInfo for the given partition table.
+ */
+static TableInfo *
+getRootTableInfo(const TableInfo *tbinfo)
+{
+ TableInfo *parentTbinfo;
+
+ Assert(tbinfo->ispartition);
+ Assert(tbinfo->numParents == 1);
+
+ parentTbinfo = tbinfo->parents[0];
+ while (parentTbinfo->ispartition)
+ {
+ Assert(parentTbinfo->numParents == 1);
+ parentTbinfo = parentTbinfo->parents[0];
+ }
+
+ return parentTbinfo;
+}
+
+/*
+ * forcePartitionRootLoad
+ * Check if we must force load_via_partition_root for this partition.
+ *
+ * This is required if any level of ancestral partitioned table has an
+ * unsafe partitioning scheme.
+ */
+static bool
+forcePartitionRootLoad(const TableInfo *tbinfo)
+{
+ TableInfo *parentTbinfo;
+
+ Assert(tbinfo->ispartition);
+ Assert(tbinfo->numParents == 1);
+
+ parentTbinfo = tbinfo->parents[0];
+ if (parentTbinfo->unsafe_partitions)
+ return true;
+ while (parentTbinfo->ispartition)
+ {
+ Assert(parentTbinfo->numParents == 1);
+ parentTbinfo = parentTbinfo->parents[0];
+ if (parentTbinfo->unsafe_partitions)
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * dumpTableData -
+ * dump the contents of a single table
+ *
+ * Actually, this just makes an ArchiveEntry for the table contents.
+ */
+static void
+dumpTableData(Archive *fout, const TableDataInfo *tdinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = tdinfo->tdtable;
+ PQExpBuffer copyBuf = createPQExpBuffer();
+ PQExpBuffer clistBuf = createPQExpBuffer();
+ DataDumperPtr dumpFn;
+ char *tdDefn = NULL;
+ char *copyStmt;
+ const char *copyFrom;
+
+ /* We had better have loaded per-column details about this table */
+ Assert(tbinfo->interesting);
+
+ /*
+ * When load-via-partition-root is set or forced, get the root table name
+ * for the partition table, so that we can reload data through the root
+ * table. Then construct a comment to be inserted into the TOC entry's
+ * defn field, so that such cases can be identified reliably.
+ */
+ if (tbinfo->ispartition &&
+ (dopt->load_via_partition_root ||
+ forcePartitionRootLoad(tbinfo)))
+ {
+ TableInfo *parentTbinfo;
+
+ parentTbinfo = getRootTableInfo(tbinfo);
+ copyFrom = fmtQualifiedDumpable(parentTbinfo);
+ printfPQExpBuffer(copyBuf, "-- load via partition root %s",
+ copyFrom);
+ tdDefn = pg_strdup(copyBuf->data);
+ }
+ else
+ copyFrom = fmtQualifiedDumpable(tbinfo);
+
+ if (dopt->dump_inserts == 0)
+ {
+ /* Dump/restore using COPY */
+ dumpFn = dumpTableData_copy;
+ /* must use 2 steps here 'cause fmtId is nonreentrant */
+ printfPQExpBuffer(copyBuf, "COPY %s ",
+ copyFrom);
+ appendPQExpBuffer(copyBuf, "%s FROM stdin;\n",
+ fmtCopyColumnList(tbinfo, clistBuf));
+ copyStmt = copyBuf->data;
+ }
+ else
+ {
+ /* Restore using INSERT */
+ dumpFn = dumpTableData_insert;
+ copyStmt = NULL;
+ }
+
+ /*
+ * Note: although the TableDataInfo is a full DumpableObject, we treat its
+ * dependency on its table as "special" and pass it to ArchiveEntry now.
+ * See comments for BuildArchiveDependencies.
+ */
+ if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
+ {
+ TocEntry *te;
+
+ te = ArchiveEntry(fout, tdinfo->dobj.catId, tdinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "TABLE DATA",
+ .section = SECTION_DATA,
+ .createStmt = tdDefn,
+ .copyStmt = copyStmt,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1,
+ .dumpFn = dumpFn,
+ .dumpArg = tdinfo));
+
+ /*
+ * Set the TocEntry's dataLength in case we are doing a parallel dump
+ * and want to order dump jobs by table size. We choose to measure
+ * dataLength in table pages (including TOAST pages) during dump, so
+ * no scaling is needed.
+ *
+ * However, relpages is declared as "integer" in pg_class, and hence
+ * also in TableInfo, but it's really BlockNumber a/k/a unsigned int.
+ * Cast so that we get the right interpretation of table sizes
+ * exceeding INT_MAX pages.
+ */
+ te->dataLength = (BlockNumber) tbinfo->relpages;
+ te->dataLength += (BlockNumber) tbinfo->toastpages;
+
+ /*
+ * If pgoff_t is only 32 bits wide, the above refinement is useless,
+ * and instead we'd better worry about integer overflow. Clamp to
+ * INT_MAX if the correct result exceeds that.
+ */
+ if (sizeof(te->dataLength) == 4 &&
+ (tbinfo->relpages < 0 || tbinfo->toastpages < 0 ||
+ te->dataLength < 0))
+ te->dataLength = INT_MAX;
+ }
+
+ destroyPQExpBuffer(copyBuf);
+ destroyPQExpBuffer(clistBuf);
+}
+
+/*
+ * refreshMatViewData -
+ * load or refresh the contents of a single materialized view
+ *
+ * Actually, this just makes an ArchiveEntry for the REFRESH MATERIALIZED VIEW
+ * statement.
+ */
+static void
+refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo)
+{
+ TableInfo *tbinfo = tdinfo->tdtable;
+ PQExpBuffer q;
+
+ /* If the materialized view is not flagged as populated, skip this. */
+ if (!tbinfo->relispopulated)
+ return;
+
+ q = createPQExpBuffer();
+
+ appendPQExpBuffer(q, "REFRESH MATERIALIZED VIEW %s;\n",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
+ ArchiveEntry(fout,
+ tdinfo->dobj.catId, /* catalog ID */
+ tdinfo->dobj.dumpId, /* dump ID */
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "MATERIALIZED VIEW DATA",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .deps = tdinfo->dobj.dependencies,
+ .nDeps = tdinfo->dobj.nDeps));
+
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * getTableData -
+ * set up dumpable objects representing the contents of tables
+ */
+static void
+getTableData(DumpOptions *dopt, TableInfo *tblinfo, int numTables, char relkind)
+{
+ int i;
+
+ for (i = 0; i < numTables; i++)
+ {
+ if (tblinfo[i].dobj.dump & DUMP_COMPONENT_DATA &&
+ (!relkind || tblinfo[i].relkind == relkind))
+ makeTableDataInfo(dopt, &(tblinfo[i]));
+ }
+}
+
+/*
+ * Make a dumpable object for the data of this specific table
+ *
+ * Note: we make a TableDataInfo if and only if we are going to dump the
+ * table data; the "dump" field in such objects isn't very interesting.
+ */
+static void
+makeTableDataInfo(DumpOptions *dopt, TableInfo *tbinfo)
+{
+ TableDataInfo *tdinfo;
+
+ /*
+ * Nothing to do if we already decided to dump the table. This will
+ * happen for "config" tables.
+ */
+ if (tbinfo->dataObj != NULL)
+ return;
+
+ /* Skip VIEWs (no data to dump) */
+ if (tbinfo->relkind == RELKIND_VIEW)
+ return;
+ /* Skip FOREIGN TABLEs (no data to dump) unless requested explicitly */
+ if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
+ (foreign_servers_include_oids.head == NULL ||
+ !simple_oid_list_member(&foreign_servers_include_oids,
+ tbinfo->foreign_server)))
+ return;
+ /* Skip partitioned tables (data in partitions) */
+ if (tbinfo->relkind == RELKIND_PARTITIONED_TABLE)
+ return;
+
+ /* Don't dump data in unlogged tables, if so requested */
+ if (tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED &&
+ dopt->no_unlogged_table_data)
+ return;
+
+ /* Check that the data is not explicitly excluded */
+ if (simple_oid_list_member(&tabledata_exclude_oids,
+ tbinfo->dobj.catId.oid))
+ return;
+
+ /* OK, let's dump it */
+ tdinfo = (TableDataInfo *) pg_malloc(sizeof(TableDataInfo));
+
+ if (tbinfo->relkind == RELKIND_MATVIEW)
+ tdinfo->dobj.objType = DO_REFRESH_MATVIEW;
+ else if (tbinfo->relkind == RELKIND_SEQUENCE)
+ tdinfo->dobj.objType = DO_SEQUENCE_SET;
+ else
+ tdinfo->dobj.objType = DO_TABLE_DATA;
+
+ /*
+ * Note: use tableoid 0 so that this object won't be mistaken for
+ * something that pg_depend entries apply to.
+ */
+ tdinfo->dobj.catId.tableoid = 0;
+ tdinfo->dobj.catId.oid = tbinfo->dobj.catId.oid;
+ AssignDumpId(&tdinfo->dobj);
+ tdinfo->dobj.name = tbinfo->dobj.name;
+ tdinfo->dobj.namespace = tbinfo->dobj.namespace;
+ tdinfo->tdtable = tbinfo;
+ tdinfo->filtercond = NULL; /* might get set later */
+ addObjectDependency(&tdinfo->dobj, tbinfo->dobj.dumpId);
+
+ /* A TableDataInfo contains data, of course */
+ tdinfo->dobj.components |= DUMP_COMPONENT_DATA;
+
+ tbinfo->dataObj = tdinfo;
+
+ /* Make sure that we'll collect per-column info for this table. */
+ tbinfo->interesting = true;
+}
+
+/*
+ * The refresh for a materialized view must be dependent on the refresh for
+ * any materialized view that this one is dependent on.
+ *
+ * This must be called after all the objects are created, but before they are
+ * sorted.
+ */
+static void
+buildMatViewRefreshDependencies(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_classid,
+ i_objid,
+ i_refobjid;
+
+ /* No Mat Views before 9.3. */
+ if (fout->remoteVersion < 90300)
+ return;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "WITH RECURSIVE w AS "
+ "( "
+ "SELECT d1.objid, d2.refobjid, c2.relkind AS refrelkind "
+ "FROM pg_depend d1 "
+ "JOIN pg_class c1 ON c1.oid = d1.objid "
+ "AND c1.relkind = " CppAsString2(RELKIND_MATVIEW)
+ " JOIN pg_rewrite r1 ON r1.ev_class = d1.objid "
+ "JOIN pg_depend d2 ON d2.classid = 'pg_rewrite'::regclass "
+ "AND d2.objid = r1.oid "
+ "AND d2.refobjid <> d1.objid "
+ "JOIN pg_class c2 ON c2.oid = d2.refobjid "
+ "AND c2.relkind IN (" CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_VIEW) ") "
+ "WHERE d1.classid = 'pg_class'::regclass "
+ "UNION "
+ "SELECT w.objid, d3.refobjid, c3.relkind "
+ "FROM w "
+ "JOIN pg_rewrite r3 ON r3.ev_class = w.refobjid "
+ "JOIN pg_depend d3 ON d3.classid = 'pg_rewrite'::regclass "
+ "AND d3.objid = r3.oid "
+ "AND d3.refobjid <> w.refobjid "
+ "JOIN pg_class c3 ON c3.oid = d3.refobjid "
+ "AND c3.relkind IN (" CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_VIEW) ") "
+ ") "
+ "SELECT 'pg_class'::regclass::oid AS classid, objid, refobjid "
+ "FROM w "
+ "WHERE refrelkind = " CppAsString2(RELKIND_MATVIEW));
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_classid = PQfnumber(res, "classid");
+ i_objid = PQfnumber(res, "objid");
+ i_refobjid = PQfnumber(res, "refobjid");
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ CatalogId refobjId;
+ DumpableObject *dobj;
+ DumpableObject *refdobj;
+ TableInfo *tbinfo;
+ TableInfo *reftbinfo;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objid));
+ refobjId.tableoid = objId.tableoid;
+ refobjId.oid = atooid(PQgetvalue(res, i, i_refobjid));
+
+ dobj = findObjectByCatalogId(objId);
+ if (dobj == NULL)
+ continue;
+
+ Assert(dobj->objType == DO_TABLE);
+ tbinfo = (TableInfo *) dobj;
+ Assert(tbinfo->relkind == RELKIND_MATVIEW);
+ dobj = (DumpableObject *) tbinfo->dataObj;
+ if (dobj == NULL)
+ continue;
+ Assert(dobj->objType == DO_REFRESH_MATVIEW);
+
+ refdobj = findObjectByCatalogId(refobjId);
+ if (refdobj == NULL)
+ continue;
+
+ Assert(refdobj->objType == DO_TABLE);
+ reftbinfo = (TableInfo *) refdobj;
+ Assert(reftbinfo->relkind == RELKIND_MATVIEW);
+ refdobj = (DumpableObject *) reftbinfo->dataObj;
+ if (refdobj == NULL)
+ continue;
+ Assert(refdobj->objType == DO_REFRESH_MATVIEW);
+
+ addObjectDependency(dobj, refdobj->dumpId);
+
+ if (!reftbinfo->relispopulated)
+ tbinfo->relispopulated = false;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getTableDataFKConstraints -
+ * add dump-order dependencies reflecting foreign key constraints
+ *
+ * This code is executed only in a data-only dump --- in schema+data dumps
+ * we handle foreign key issues by not creating the FK constraints until
+ * after the data is loaded. In a data-only dump, however, we want to
+ * order the table data objects in such a way that a table's referenced
+ * tables are restored first. (In the presence of circular references or
+ * self-references this may be impossible; we'll detect and complain about
+ * that during the dependency sorting step.)
+ */
+static void
+getTableDataFKConstraints(void)
+{
+ DumpableObject **dobjs;
+ int numObjs;
+ int i;
+
+ /* Search through all the dumpable objects for FK constraints */
+ getDumpableObjects(&dobjs, &numObjs);
+ for (i = 0; i < numObjs; i++)
+ {
+ if (dobjs[i]->objType == DO_FK_CONSTRAINT)
+ {
+ ConstraintInfo *cinfo = (ConstraintInfo *) dobjs[i];
+ TableInfo *ftable;
+
+ /* Not interesting unless both tables are to be dumped */
+ if (cinfo->contable == NULL ||
+ cinfo->contable->dataObj == NULL)
+ continue;
+ ftable = findTableByOid(cinfo->confrelid);
+ if (ftable == NULL ||
+ ftable->dataObj == NULL)
+ continue;
+
+ /*
+ * Okay, make referencing table's TABLE_DATA object depend on the
+ * referenced table's TABLE_DATA object.
+ */
+ addObjectDependency(&cinfo->contable->dataObj->dobj,
+ ftable->dataObj->dobj.dumpId);
+ }
+ }
+ free(dobjs);
+}
+
+
+/*
+ * dumpDatabase:
+ * dump the database definition
+ */
+static void
+dumpDatabase(Archive *fout)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer dbQry = createPQExpBuffer();
+ PQExpBuffer delQry = createPQExpBuffer();
+ PQExpBuffer creaQry = createPQExpBuffer();
+ PQExpBuffer labelq = createPQExpBuffer();
+ PGconn *conn = GetConnection(fout);
+ PGresult *res;
+ int i_tableoid,
+ i_oid,
+ i_datname,
+ i_datdba,
+ i_encoding,
+ i_datlocprovider,
+ i_collate,
+ i_ctype,
+ i_daticulocale,
+ i_daticurules,
+ i_frozenxid,
+ i_minmxid,
+ i_datacl,
+ i_acldefault,
+ i_datistemplate,
+ i_datconnlimit,
+ i_datcollversion,
+ i_tablespace;
+ CatalogId dbCatId;
+ DumpId dbDumpId;
+ DumpableAcl dbdacl;
+ const char *datname,
+ *dba,
+ *encoding,
+ *datlocprovider,
+ *collate,
+ *ctype,
+ *iculocale,
+ *icurules,
+ *datistemplate,
+ *datconnlimit,
+ *tablespace;
+ uint32 frozenxid,
+ minmxid;
+ char *qdatname;
+
+ pg_log_info("saving database definition");
+
+ /*
+ * Fetch the database-level properties for this database.
+ */
+ appendPQExpBufferStr(dbQry, "SELECT tableoid, oid, datname, "
+ "datdba, "
+ "pg_encoding_to_char(encoding) AS encoding, "
+ "datcollate, datctype, datfrozenxid, "
+ "datacl, acldefault('d', datdba) AS acldefault, "
+ "datistemplate, datconnlimit, ");
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(dbQry, "datminmxid, ");
+ else
+ appendPQExpBufferStr(dbQry, "0 AS datminmxid, ");
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale, datcollversion, ");
+ else
+ appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, ");
+ if (fout->remoteVersion >= 160000)
+ appendPQExpBufferStr(dbQry, "daticurules, ");
+ else
+ appendPQExpBufferStr(dbQry, "NULL AS daticurules, ");
+ appendPQExpBufferStr(dbQry,
+ "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
+ "shobj_description(oid, 'pg_database') AS description "
+ "FROM pg_database "
+ "WHERE datname = current_database()");
+
+ res = ExecuteSqlQueryForSingleRow(fout, dbQry->data);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_datname = PQfnumber(res, "datname");
+ i_datdba = PQfnumber(res, "datdba");
+ i_encoding = PQfnumber(res, "encoding");
+ i_datlocprovider = PQfnumber(res, "datlocprovider");
+ i_collate = PQfnumber(res, "datcollate");
+ i_ctype = PQfnumber(res, "datctype");
+ i_daticulocale = PQfnumber(res, "daticulocale");
+ i_daticurules = PQfnumber(res, "daticurules");
+ i_frozenxid = PQfnumber(res, "datfrozenxid");
+ i_minmxid = PQfnumber(res, "datminmxid");
+ i_datacl = PQfnumber(res, "datacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_datistemplate = PQfnumber(res, "datistemplate");
+ i_datconnlimit = PQfnumber(res, "datconnlimit");
+ i_datcollversion = PQfnumber(res, "datcollversion");
+ i_tablespace = PQfnumber(res, "tablespace");
+
+ dbCatId.tableoid = atooid(PQgetvalue(res, 0, i_tableoid));
+ dbCatId.oid = atooid(PQgetvalue(res, 0, i_oid));
+ datname = PQgetvalue(res, 0, i_datname);
+ dba = getRoleName(PQgetvalue(res, 0, i_datdba));
+ encoding = PQgetvalue(res, 0, i_encoding);
+ datlocprovider = PQgetvalue(res, 0, i_datlocprovider);
+ collate = PQgetvalue(res, 0, i_collate);
+ ctype = PQgetvalue(res, 0, i_ctype);
+ if (!PQgetisnull(res, 0, i_daticulocale))
+ iculocale = PQgetvalue(res, 0, i_daticulocale);
+ else
+ iculocale = NULL;
+ if (!PQgetisnull(res, 0, i_daticurules))
+ icurules = PQgetvalue(res, 0, i_daticurules);
+ else
+ icurules = NULL;
+ frozenxid = atooid(PQgetvalue(res, 0, i_frozenxid));
+ minmxid = atooid(PQgetvalue(res, 0, i_minmxid));
+ dbdacl.acl = PQgetvalue(res, 0, i_datacl);
+ dbdacl.acldefault = PQgetvalue(res, 0, i_acldefault);
+ datistemplate = PQgetvalue(res, 0, i_datistemplate);
+ datconnlimit = PQgetvalue(res, 0, i_datconnlimit);
+ tablespace = PQgetvalue(res, 0, i_tablespace);
+
+ qdatname = pg_strdup(fmtId(datname));
+
+ /*
+ * Prepare the CREATE DATABASE command. We must specify OID (if we want
+ * to preserve that), as well as the encoding, locale, and tablespace
+ * since those can't be altered later. Other DB properties are left to
+ * the DATABASE PROPERTIES entry, so that they can be applied after
+ * reconnecting to the target DB.
+ */
+ if (dopt->binary_upgrade)
+ {
+ appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0 OID = %u",
+ qdatname, dbCatId.oid);
+ }
+ else
+ {
+ appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0",
+ qdatname);
+ }
+ if (strlen(encoding) > 0)
+ {
+ appendPQExpBufferStr(creaQry, " ENCODING = ");
+ appendStringLiteralAH(creaQry, encoding, fout);
+ }
+
+ appendPQExpBufferStr(creaQry, " LOCALE_PROVIDER = ");
+ if (datlocprovider[0] == 'c')
+ appendPQExpBufferStr(creaQry, "libc");
+ else if (datlocprovider[0] == 'i')
+ appendPQExpBufferStr(creaQry, "icu");
+ else
+ pg_fatal("unrecognized locale provider: %s",
+ datlocprovider);
+
+ if (strlen(collate) > 0 && strcmp(collate, ctype) == 0)
+ {
+ appendPQExpBufferStr(creaQry, " LOCALE = ");
+ appendStringLiteralAH(creaQry, collate, fout);
+ }
+ else
+ {
+ if (strlen(collate) > 0)
+ {
+ appendPQExpBufferStr(creaQry, " LC_COLLATE = ");
+ appendStringLiteralAH(creaQry, collate, fout);
+ }
+ if (strlen(ctype) > 0)
+ {
+ appendPQExpBufferStr(creaQry, " LC_CTYPE = ");
+ appendStringLiteralAH(creaQry, ctype, fout);
+ }
+ }
+ if (iculocale)
+ {
+ appendPQExpBufferStr(creaQry, " ICU_LOCALE = ");
+ appendStringLiteralAH(creaQry, iculocale, fout);
+ }
+ if (icurules)
+ {
+ appendPQExpBufferStr(creaQry, " ICU_RULES = ");
+ appendStringLiteralAH(creaQry, icurules, fout);
+ }
+
+ /*
+ * For binary upgrade, carry over the collation version. For normal
+ * dump/restore, omit the version, so that it is computed upon restore.
+ */
+ if (dopt->binary_upgrade)
+ {
+ if (!PQgetisnull(res, 0, i_datcollversion))
+ {
+ appendPQExpBufferStr(creaQry, " COLLATION_VERSION = ");
+ appendStringLiteralAH(creaQry,
+ PQgetvalue(res, 0, i_datcollversion),
+ fout);
+ }
+ }
+
+ /*
+ * Note: looking at dopt->outputNoTablespaces here is completely the wrong
+ * thing; the decision whether to specify a tablespace should be left till
+ * pg_restore, so that pg_restore --no-tablespaces applies. Ideally we'd
+ * label the DATABASE entry with the tablespace and let the normal
+ * tablespace selection logic work ... but CREATE DATABASE doesn't pay
+ * attention to default_tablespace, so that won't work.
+ */
+ if (strlen(tablespace) > 0 && strcmp(tablespace, "pg_default") != 0 &&
+ !dopt->outputNoTablespaces)
+ appendPQExpBuffer(creaQry, " TABLESPACE = %s",
+ fmtId(tablespace));
+ appendPQExpBufferStr(creaQry, ";\n");
+
+ appendPQExpBuffer(delQry, "DROP DATABASE %s;\n",
+ qdatname);
+
+ dbDumpId = createDumpId();
+
+ ArchiveEntry(fout,
+ dbCatId, /* catalog ID */
+ dbDumpId, /* dump ID */
+ ARCHIVE_OPTS(.tag = datname,
+ .owner = dba,
+ .description = "DATABASE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = creaQry->data,
+ .dropStmt = delQry->data));
+
+ /* Compute correct tag for archive entry */
+ appendPQExpBuffer(labelq, "DATABASE %s", qdatname);
+
+ /* Dump DB comment if any */
+ {
+ /*
+ * 8.2 and up keep comments on shared objects in a shared table, so we
+ * cannot use the dumpComment() code used for other database objects.
+ * Be careful that the ArchiveEntry parameters match that function.
+ */
+ char *comment = PQgetvalue(res, 0, PQfnumber(res, "description"));
+
+ if (comment && *comment && !dopt->no_comments)
+ {
+ resetPQExpBuffer(dbQry);
+
+ /*
+ * Generates warning when loaded into a differently-named
+ * database.
+ */
+ appendPQExpBuffer(dbQry, "COMMENT ON DATABASE %s IS ", qdatname);
+ appendStringLiteralAH(dbQry, comment, fout);
+ appendPQExpBufferStr(dbQry, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .owner = dba,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = dbQry->data,
+ .deps = &dbDumpId,
+ .nDeps = 1));
+ }
+ }
+
+ /* Dump DB security label, if enabled */
+ if (!dopt->no_security_labels)
+ {
+ PGresult *shres;
+ PQExpBuffer seclabelQry;
+
+ seclabelQry = createPQExpBuffer();
+
+ buildShSecLabelQuery("pg_database", dbCatId.oid, seclabelQry);
+ shres = ExecuteSqlQuery(fout, seclabelQry->data, PGRES_TUPLES_OK);
+ resetPQExpBuffer(seclabelQry);
+ emitShSecLabels(conn, shres, seclabelQry, "DATABASE", datname);
+ if (seclabelQry->len > 0)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .owner = dba,
+ .description = "SECURITY LABEL",
+ .section = SECTION_NONE,
+ .createStmt = seclabelQry->data,
+ .deps = &dbDumpId,
+ .nDeps = 1));
+ destroyPQExpBuffer(seclabelQry);
+ PQclear(shres);
+ }
+
+ /*
+ * Dump ACL if any. Note that we do not support initial privileges
+ * (pg_init_privs) on databases.
+ */
+ dbdacl.privtype = 0;
+ dbdacl.initprivs = NULL;
+
+ dumpACL(fout, dbDumpId, InvalidDumpId, "DATABASE",
+ qdatname, NULL, NULL,
+ dba, &dbdacl);
+
+ /*
+ * Now construct a DATABASE PROPERTIES archive entry to restore any
+ * non-default database-level properties. (The reason this must be
+ * separate is that we cannot put any additional commands into the TOC
+ * entry that has CREATE DATABASE. pg_restore would execute such a group
+ * in an implicit transaction block, and the backend won't allow CREATE
+ * DATABASE in that context.)
+ */
+ resetPQExpBuffer(creaQry);
+ resetPQExpBuffer(delQry);
+
+ if (strlen(datconnlimit) > 0 && strcmp(datconnlimit, "-1") != 0)
+ appendPQExpBuffer(creaQry, "ALTER DATABASE %s CONNECTION LIMIT = %s;\n",
+ qdatname, datconnlimit);
+
+ if (strcmp(datistemplate, "t") == 0)
+ {
+ appendPQExpBuffer(creaQry, "ALTER DATABASE %s IS_TEMPLATE = true;\n",
+ qdatname);
+
+ /*
+ * The backend won't accept DROP DATABASE on a template database. We
+ * can deal with that by removing the template marking before the DROP
+ * gets issued. We'd prefer to use ALTER DATABASE IF EXISTS here, but
+ * since no such command is currently supported, fake it with a direct
+ * UPDATE on pg_database.
+ */
+ appendPQExpBufferStr(delQry, "UPDATE pg_catalog.pg_database "
+ "SET datistemplate = false WHERE datname = ");
+ appendStringLiteralAH(delQry, datname, fout);
+ appendPQExpBufferStr(delQry, ";\n");
+ }
+
+ /* Add database-specific SET options */
+ dumpDatabaseConfig(fout, creaQry, datname, dbCatId.oid);
+
+ /*
+ * We stick this binary-upgrade query into the DATABASE PROPERTIES archive
+ * entry, too, for lack of a better place.
+ */
+ if (dopt->binary_upgrade)
+ {
+ appendPQExpBufferStr(creaQry, "\n-- For binary upgrade, set datfrozenxid and datminmxid.\n");
+ appendPQExpBuffer(creaQry, "UPDATE pg_catalog.pg_database\n"
+ "SET datfrozenxid = '%u', datminmxid = '%u'\n"
+ "WHERE datname = ",
+ frozenxid, minmxid);
+ appendStringLiteralAH(creaQry, datname, fout);
+ appendPQExpBufferStr(creaQry, ";\n");
+ }
+
+ if (creaQry->len > 0)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = datname,
+ .owner = dba,
+ .description = "DATABASE PROPERTIES",
+ .section = SECTION_PRE_DATA,
+ .createStmt = creaQry->data,
+ .dropStmt = delQry->data,
+ .deps = &dbDumpId));
+
+ /*
+ * pg_largeobject comes from the old system intact, so set its
+ * relfrozenxids, relminmxids and relfilenode.
+ */
+ if (dopt->binary_upgrade)
+ {
+ PGresult *lo_res;
+ PQExpBuffer loFrozenQry = createPQExpBuffer();
+ PQExpBuffer loOutQry = createPQExpBuffer();
+ PQExpBuffer loHorizonQry = createPQExpBuffer();
+ int ii_relfrozenxid,
+ ii_relfilenode,
+ ii_oid,
+ ii_relminmxid;
+
+ /*
+ * pg_largeobject
+ */
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n"
+ "FROM pg_catalog.pg_class\n"
+ "WHERE oid IN (%u, %u);\n",
+ LargeObjectRelationId, LargeObjectLOidPNIndexId);
+ else
+ appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, 0 AS relminmxid, relfilenode, oid\n"
+ "FROM pg_catalog.pg_class\n"
+ "WHERE oid IN (%u, %u);\n",
+ LargeObjectRelationId, LargeObjectLOidPNIndexId);
+
+ lo_res = ExecuteSqlQuery(fout, loFrozenQry->data, PGRES_TUPLES_OK);
+
+ ii_relfrozenxid = PQfnumber(lo_res, "relfrozenxid");
+ ii_relminmxid = PQfnumber(lo_res, "relminmxid");
+ ii_relfilenode = PQfnumber(lo_res, "relfilenode");
+ ii_oid = PQfnumber(lo_res, "oid");
+
+ appendPQExpBufferStr(loHorizonQry, "\n-- For binary upgrade, set pg_largeobject relfrozenxid and relminmxid\n");
+ appendPQExpBufferStr(loOutQry, "\n-- For binary upgrade, preserve pg_largeobject and index relfilenodes\n");
+ for (int i = 0; i < PQntuples(lo_res); ++i)
+ {
+ Oid oid;
+ RelFileNumber relfilenumber;
+
+ appendPQExpBuffer(loHorizonQry, "UPDATE pg_catalog.pg_class\n"
+ "SET relfrozenxid = '%u', relminmxid = '%u'\n"
+ "WHERE oid = %u;\n",
+ atooid(PQgetvalue(lo_res, i, ii_relfrozenxid)),
+ atooid(PQgetvalue(lo_res, i, ii_relminmxid)),
+ atooid(PQgetvalue(lo_res, i, ii_oid)));
+
+ oid = atooid(PQgetvalue(lo_res, i, ii_oid));
+ relfilenumber = atooid(PQgetvalue(lo_res, i, ii_relfilenode));
+
+ if (oid == LargeObjectRelationId)
+ appendPQExpBuffer(loOutQry,
+ "SELECT pg_catalog.binary_upgrade_set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenumber);
+ else if (oid == LargeObjectLOidPNIndexId)
+ appendPQExpBuffer(loOutQry,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenumber);
+ }
+
+ appendPQExpBufferStr(loOutQry,
+ "TRUNCATE pg_catalog.pg_largeobject;\n");
+ appendPQExpBufferStr(loOutQry, loHorizonQry->data);
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "pg_largeobject",
+ .description = "pg_largeobject",
+ .section = SECTION_PRE_DATA,
+ .createStmt = loOutQry->data));
+
+ PQclear(lo_res);
+
+ destroyPQExpBuffer(loFrozenQry);
+ destroyPQExpBuffer(loHorizonQry);
+ destroyPQExpBuffer(loOutQry);
+ }
+
+ PQclear(res);
+
+ free(qdatname);
+ destroyPQExpBuffer(dbQry);
+ destroyPQExpBuffer(delQry);
+ destroyPQExpBuffer(creaQry);
+ destroyPQExpBuffer(labelq);
+}
+
+/*
+ * Collect any database-specific or role-and-database-specific SET options
+ * for this database, and append them to outbuf.
+ */
+static void
+dumpDatabaseConfig(Archive *AH, PQExpBuffer outbuf,
+ const char *dbname, Oid dboid)
+{
+ PGconn *conn = GetConnection(AH);
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+
+ /* First collect database-specific options */
+ printfPQExpBuffer(buf, "SELECT unnest(setconfig) FROM pg_db_role_setting "
+ "WHERE setrole = 0 AND setdatabase = '%u'::oid",
+ dboid);
+
+ res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK);
+
+ for (int i = 0; i < PQntuples(res); i++)
+ makeAlterConfigCommand(conn, PQgetvalue(res, i, 0),
+ "DATABASE", dbname, NULL, NULL,
+ outbuf);
+
+ PQclear(res);
+
+ /* Now look for role-and-database-specific options */
+ printfPQExpBuffer(buf, "SELECT rolname, unnest(setconfig) "
+ "FROM pg_db_role_setting s, pg_roles r "
+ "WHERE setrole = r.oid AND setdatabase = '%u'::oid",
+ dboid);
+
+ res = ExecuteSqlQuery(AH, buf->data, PGRES_TUPLES_OK);
+
+ for (int i = 0; i < PQntuples(res); i++)
+ makeAlterConfigCommand(conn, PQgetvalue(res, i, 1),
+ "ROLE", PQgetvalue(res, i, 0),
+ "DATABASE", dbname,
+ outbuf);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(buf);
+}
+
+/*
+ * dumpEncoding: put the correct encoding into the archive
+ */
+static void
+dumpEncoding(Archive *AH)
+{
+ const char *encname = pg_encoding_to_char(AH->encoding);
+ PQExpBuffer qry = createPQExpBuffer();
+
+ pg_log_info("saving encoding = %s", encname);
+
+ appendPQExpBufferStr(qry, "SET client_encoding = ");
+ appendStringLiteralAH(qry, encname, AH);
+ appendPQExpBufferStr(qry, ";\n");
+
+ ArchiveEntry(AH, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "ENCODING",
+ .description = "ENCODING",
+ .section = SECTION_PRE_DATA,
+ .createStmt = qry->data));
+
+ destroyPQExpBuffer(qry);
+}
+
+
+/*
+ * dumpStdStrings: put the correct escape string behavior into the archive
+ */
+static void
+dumpStdStrings(Archive *AH)
+{
+ const char *stdstrings = AH->std_strings ? "on" : "off";
+ PQExpBuffer qry = createPQExpBuffer();
+
+ pg_log_info("saving standard_conforming_strings = %s",
+ stdstrings);
+
+ appendPQExpBuffer(qry, "SET standard_conforming_strings = '%s';\n",
+ stdstrings);
+
+ ArchiveEntry(AH, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "STDSTRINGS",
+ .description = "STDSTRINGS",
+ .section = SECTION_PRE_DATA,
+ .createStmt = qry->data));
+
+ destroyPQExpBuffer(qry);
+}
+
+/*
+ * dumpSearchPath: record the active search_path in the archive
+ */
+static void
+dumpSearchPath(Archive *AH)
+{
+ PQExpBuffer qry = createPQExpBuffer();
+ PQExpBuffer path = createPQExpBuffer();
+ PGresult *res;
+ char **schemanames = NULL;
+ int nschemanames = 0;
+ int i;
+
+ /*
+ * We use the result of current_schemas(), not the search_path GUC,
+ * because that might contain wildcards such as "$user", which won't
+ * necessarily have the same value during restore. Also, this way avoids
+ * listing schemas that may appear in search_path but not actually exist,
+ * which seems like a prudent exclusion.
+ */
+ res = ExecuteSqlQueryForSingleRow(AH,
+ "SELECT pg_catalog.current_schemas(false)");
+
+ if (!parsePGArray(PQgetvalue(res, 0, 0), &schemanames, &nschemanames))
+ pg_fatal("could not parse result of current_schemas()");
+
+ /*
+ * We use set_config(), not a simple "SET search_path" command, because
+ * the latter has less-clean behavior if the search path is empty. While
+ * that's likely to get fixed at some point, it seems like a good idea to
+ * be as backwards-compatible as possible in what we put into archives.
+ */
+ for (i = 0; i < nschemanames; i++)
+ {
+ if (i > 0)
+ appendPQExpBufferStr(path, ", ");
+ appendPQExpBufferStr(path, fmtId(schemanames[i]));
+ }
+
+ appendPQExpBufferStr(qry, "SELECT pg_catalog.set_config('search_path', ");
+ appendStringLiteralAH(qry, path->data, AH);
+ appendPQExpBufferStr(qry, ", false);\n");
+
+ pg_log_info("saving search_path = %s", path->data);
+
+ ArchiveEntry(AH, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = "SEARCHPATH",
+ .description = "SEARCHPATH",
+ .section = SECTION_PRE_DATA,
+ .createStmt = qry->data));
+
+ /* Also save it in AH->searchpath, in case we're doing plain text dump */
+ AH->searchpath = pg_strdup(qry->data);
+
+ free(schemanames);
+ PQclear(res);
+ destroyPQExpBuffer(qry);
+ destroyPQExpBuffer(path);
+}
+
+
+/*
+ * getLOs:
+ * Collect schema-level data about large objects
+ */
+static void
+getLOs(Archive *fout)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer loQry = createPQExpBuffer();
+ LoInfo *loinfo;
+ DumpableObject *lodata;
+ PGresult *res;
+ int ntups;
+ int i;
+ int i_oid;
+ int i_lomowner;
+ int i_lomacl;
+ int i_acldefault;
+
+ pg_log_info("reading large objects");
+
+ /* Fetch LO OIDs, and owner/ACL data */
+ appendPQExpBufferStr(loQry,
+ "SELECT oid, lomowner, lomacl, "
+ "acldefault('L', lomowner) AS acldefault "
+ "FROM pg_largeobject_metadata");
+
+ res = ExecuteSqlQuery(fout, loQry->data, PGRES_TUPLES_OK);
+
+ i_oid = PQfnumber(res, "oid");
+ i_lomowner = PQfnumber(res, "lomowner");
+ i_lomacl = PQfnumber(res, "lomacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ ntups = PQntuples(res);
+
+ /*
+ * Each large object has its own "BLOB" archive entry.
+ */
+ loinfo = (LoInfo *) pg_malloc(ntups * sizeof(LoInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ loinfo[i].dobj.objType = DO_LARGE_OBJECT;
+ loinfo[i].dobj.catId.tableoid = LargeObjectRelationId;
+ loinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&loinfo[i].dobj);
+
+ loinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oid));
+ loinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_lomacl));
+ loinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ loinfo[i].dacl.privtype = 0;
+ loinfo[i].dacl.initprivs = NULL;
+ loinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_lomowner));
+
+ /* LOs have data */
+ loinfo[i].dobj.components |= DUMP_COMPONENT_DATA;
+
+ /* Mark whether LO has an ACL */
+ if (!PQgetisnull(res, i, i_lomacl))
+ loinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /*
+ * In binary-upgrade mode for LOs, we do *not* dump out the LO data,
+ * as it will be copied by pg_upgrade, which simply copies the
+ * pg_largeobject table. We *do* however dump out anything but the
+ * data, as pg_upgrade copies just pg_largeobject, but not
+ * pg_largeobject_metadata, after the dump is restored.
+ */
+ if (dopt->binary_upgrade)
+ loinfo[i].dobj.dump &= ~DUMP_COMPONENT_DATA;
+ }
+
+ /*
+ * If we have any large objects, a "BLOBS" archive entry is needed. This
+ * is just a placeholder for sorting; it carries no data now.
+ */
+ if (ntups > 0)
+ {
+ lodata = (DumpableObject *) pg_malloc(sizeof(DumpableObject));
+ lodata->objType = DO_LARGE_OBJECT_DATA;
+ lodata->catId = nilCatalogId;
+ AssignDumpId(lodata);
+ lodata->name = pg_strdup("BLOBS");
+ lodata->components |= DUMP_COMPONENT_DATA;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(loQry);
+}
+
+/*
+ * dumpLO
+ *
+ * dump the definition (metadata) of the given large object
+ */
+static void
+dumpLO(Archive *fout, const LoInfo *loinfo)
+{
+ PQExpBuffer cquery = createPQExpBuffer();
+ PQExpBuffer dquery = createPQExpBuffer();
+
+ appendPQExpBuffer(cquery,
+ "SELECT pg_catalog.lo_create('%s');\n",
+ loinfo->dobj.name);
+
+ appendPQExpBuffer(dquery,
+ "SELECT pg_catalog.lo_unlink('%s');\n",
+ loinfo->dobj.name);
+
+ if (loinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, loinfo->dobj.catId, loinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = loinfo->dobj.name,
+ .owner = loinfo->rolname,
+ .description = "BLOB",
+ .section = SECTION_PRE_DATA,
+ .createStmt = cquery->data,
+ .dropStmt = dquery->data));
+
+ /* Dump comment if any */
+ if (loinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "LARGE OBJECT", loinfo->dobj.name,
+ NULL, loinfo->rolname,
+ loinfo->dobj.catId, 0, loinfo->dobj.dumpId);
+
+ /* Dump security label if any */
+ if (loinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "LARGE OBJECT", loinfo->dobj.name,
+ NULL, loinfo->rolname,
+ loinfo->dobj.catId, 0, loinfo->dobj.dumpId);
+
+ /* Dump ACL if any */
+ if (loinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, loinfo->dobj.dumpId, InvalidDumpId, "LARGE OBJECT",
+ loinfo->dobj.name, NULL,
+ NULL, loinfo->rolname, &loinfo->dacl);
+
+ destroyPQExpBuffer(cquery);
+ destroyPQExpBuffer(dquery);
+}
+
+/*
+ * dumpLOs:
+ * dump the data contents of all large objects
+ */
+static int
+dumpLOs(Archive *fout, const void *arg)
+{
+ const char *loQry;
+ const char *loFetchQry;
+ PGconn *conn = GetConnection(fout);
+ PGresult *res;
+ char buf[LOBBUFSIZE];
+ int ntups;
+ int i;
+ int cnt;
+
+ pg_log_info("saving large objects");
+
+ /*
+ * Currently, we re-fetch all LO OIDs using a cursor. Consider scanning
+ * the already-in-memory dumpable objects instead...
+ */
+ loQry =
+ "DECLARE looid CURSOR FOR "
+ "SELECT oid FROM pg_largeobject_metadata ORDER BY 1";
+
+ ExecuteSqlStatement(fout, loQry);
+
+ /* Command to fetch from cursor */
+ loFetchQry = "FETCH 1000 IN looid";
+
+ do
+ {
+ /* Do a fetch */
+ res = ExecuteSqlQuery(fout, loFetchQry, PGRES_TUPLES_OK);
+
+ /* Process the tuples, if any */
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ Oid loOid;
+ int loFd;
+
+ loOid = atooid(PQgetvalue(res, i, 0));
+ /* Open the LO */
+ loFd = lo_open(conn, loOid, INV_READ);
+ if (loFd == -1)
+ pg_fatal("could not open large object %u: %s",
+ loOid, PQerrorMessage(conn));
+
+ StartLO(fout, loOid);
+
+ /* Now read it in chunks, sending data to archive */
+ do
+ {
+ cnt = lo_read(conn, loFd, buf, LOBBUFSIZE);
+ if (cnt < 0)
+ pg_fatal("error reading large object %u: %s",
+ loOid, PQerrorMessage(conn));
+
+ WriteData(fout, buf, cnt);
+ } while (cnt > 0);
+
+ lo_close(conn, loFd);
+
+ EndLO(fout, loOid);
+ }
+
+ PQclear(res);
+ } while (ntups > 0);
+
+ return 1;
+}
+
+/*
+ * getPolicies
+ * get information about all RLS policies on dumpable tables.
+ */
+void
+getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query;
+ PQExpBuffer tbloids;
+ PGresult *res;
+ PolicyInfo *polinfo;
+ int i_oid;
+ int i_tableoid;
+ int i_polrelid;
+ int i_polname;
+ int i_polcmd;
+ int i_polpermissive;
+ int i_polroles;
+ int i_polqual;
+ int i_polwithcheck;
+ int i,
+ j,
+ ntups;
+
+ /* No policies before 9.5 */
+ if (fout->remoteVersion < 90500)
+ return;
+
+ query = createPQExpBuffer();
+ tbloids = createPQExpBuffer();
+
+ /*
+ * Identify tables of interest, and check which ones have RLS enabled.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ /* Ignore row security on tables not to be dumped */
+ if (!(tbinfo->dobj.dump & DUMP_COMPONENT_POLICY))
+ continue;
+
+ /* It can't have RLS or policies if it's not a table */
+ if (tbinfo->relkind != RELKIND_RELATION &&
+ tbinfo->relkind != RELKIND_PARTITIONED_TABLE)
+ continue;
+
+ /* Add it to the list of table OIDs to be probed below */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+
+ /* Is RLS enabled? (That's separate from whether it has policies) */
+ if (tbinfo->rowsec)
+ {
+ tbinfo->dobj.components |= DUMP_COMPONENT_POLICY;
+
+ /*
+ * We represent RLS being enabled on a table by creating a
+ * PolicyInfo object with null polname.
+ *
+ * Note: use tableoid 0 so that this object won't be mistaken for
+ * something that pg_depend entries apply to.
+ */
+ polinfo = pg_malloc(sizeof(PolicyInfo));
+ polinfo->dobj.objType = DO_POLICY;
+ polinfo->dobj.catId.tableoid = 0;
+ polinfo->dobj.catId.oid = tbinfo->dobj.catId.oid;
+ AssignDumpId(&polinfo->dobj);
+ polinfo->dobj.namespace = tbinfo->dobj.namespace;
+ polinfo->dobj.name = pg_strdup(tbinfo->dobj.name);
+ polinfo->poltable = tbinfo;
+ polinfo->polname = NULL;
+ polinfo->polcmd = '\0';
+ polinfo->polpermissive = 0;
+ polinfo->polroles = NULL;
+ polinfo->polqual = NULL;
+ polinfo->polwithcheck = NULL;
+ }
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ /*
+ * Now, read all RLS policies belonging to the tables of interest, and
+ * create PolicyInfo objects for them. (Note that we must filter the
+ * results server-side not locally, because we dare not apply pg_get_expr
+ * to tables we don't have lock on.)
+ */
+ pg_log_info("reading row-level security policies");
+
+ printfPQExpBuffer(query,
+ "SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, ");
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(query, "pol.polpermissive, ");
+ else
+ appendPQExpBufferStr(query, "'t' as polpermissive, ");
+ appendPQExpBuffer(query,
+ "CASE WHEN pol.polroles = '{0}' THEN NULL ELSE "
+ " pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(rolname) from pg_catalog.pg_roles WHERE oid = ANY(pol.polroles)), ', ') END AS polroles, "
+ "pg_catalog.pg_get_expr(pol.polqual, pol.polrelid) AS polqual, "
+ "pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid) AS polwithcheck "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_policy pol ON (src.tbloid = pol.polrelid)",
+ tbloids->data);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ if (ntups > 0)
+ {
+ i_oid = PQfnumber(res, "oid");
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_polrelid = PQfnumber(res, "polrelid");
+ i_polname = PQfnumber(res, "polname");
+ i_polcmd = PQfnumber(res, "polcmd");
+ i_polpermissive = PQfnumber(res, "polpermissive");
+ i_polroles = PQfnumber(res, "polroles");
+ i_polqual = PQfnumber(res, "polqual");
+ i_polwithcheck = PQfnumber(res, "polwithcheck");
+
+ polinfo = pg_malloc(ntups * sizeof(PolicyInfo));
+
+ for (j = 0; j < ntups; j++)
+ {
+ Oid polrelid = atooid(PQgetvalue(res, j, i_polrelid));
+ TableInfo *tbinfo = findTableByOid(polrelid);
+
+ tbinfo->dobj.components |= DUMP_COMPONENT_POLICY;
+
+ polinfo[j].dobj.objType = DO_POLICY;
+ polinfo[j].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, j, i_tableoid));
+ polinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&polinfo[j].dobj);
+ polinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ polinfo[j].poltable = tbinfo;
+ polinfo[j].polname = pg_strdup(PQgetvalue(res, j, i_polname));
+ polinfo[j].dobj.name = pg_strdup(polinfo[j].polname);
+
+ polinfo[j].polcmd = *(PQgetvalue(res, j, i_polcmd));
+ polinfo[j].polpermissive = *(PQgetvalue(res, j, i_polpermissive)) == 't';
+
+ if (PQgetisnull(res, j, i_polroles))
+ polinfo[j].polroles = NULL;
+ else
+ polinfo[j].polroles = pg_strdup(PQgetvalue(res, j, i_polroles));
+
+ if (PQgetisnull(res, j, i_polqual))
+ polinfo[j].polqual = NULL;
+ else
+ polinfo[j].polqual = pg_strdup(PQgetvalue(res, j, i_polqual));
+
+ if (PQgetisnull(res, j, i_polwithcheck))
+ polinfo[j].polwithcheck = NULL;
+ else
+ polinfo[j].polwithcheck
+ = pg_strdup(PQgetvalue(res, j, i_polwithcheck));
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * dumpPolicy
+ * dump the definition of the given policy
+ */
+static void
+dumpPolicy(Archive *fout, const PolicyInfo *polinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = polinfo->poltable;
+ PQExpBuffer query;
+ PQExpBuffer delqry;
+ PQExpBuffer polprefix;
+ char *qtabname;
+ const char *cmd;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * If polname is NULL, then this record is just indicating that ROW LEVEL
+ * SECURITY is enabled for the table. Dump as ALTER TABLE <table> ENABLE
+ * ROW LEVEL SECURITY.
+ */
+ if (polinfo->polname == NULL)
+ {
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "ALTER TABLE %s ENABLE ROW LEVEL SECURITY;",
+ fmtQualifiedDumpable(tbinfo));
+
+ /*
+ * We must emit the ROW SECURITY object's dependency on its table
+ * explicitly, because it will not match anything in pg_depend (unlike
+ * the case for other PolicyInfo objects).
+ */
+ if (polinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, polinfo->dobj.catId, polinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = polinfo->dobj.name,
+ .namespace = polinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "ROW SECURITY",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+
+ destroyPQExpBuffer(query);
+ return;
+ }
+
+ if (polinfo->polcmd == '*')
+ cmd = "";
+ else if (polinfo->polcmd == 'r')
+ cmd = " FOR SELECT";
+ else if (polinfo->polcmd == 'a')
+ cmd = " FOR INSERT";
+ else if (polinfo->polcmd == 'w')
+ cmd = " FOR UPDATE";
+ else if (polinfo->polcmd == 'd')
+ cmd = " FOR DELETE";
+ else
+ pg_fatal("unexpected policy command type: %c",
+ polinfo->polcmd);
+
+ query = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ polprefix = createPQExpBuffer();
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ appendPQExpBuffer(query, "CREATE POLICY %s", fmtId(polinfo->polname));
+
+ appendPQExpBuffer(query, " ON %s%s%s", fmtQualifiedDumpable(tbinfo),
+ !polinfo->polpermissive ? " AS RESTRICTIVE" : "", cmd);
+
+ if (polinfo->polroles != NULL)
+ appendPQExpBuffer(query, " TO %s", polinfo->polroles);
+
+ if (polinfo->polqual != NULL)
+ appendPQExpBuffer(query, " USING (%s)", polinfo->polqual);
+
+ if (polinfo->polwithcheck != NULL)
+ appendPQExpBuffer(query, " WITH CHECK (%s)", polinfo->polwithcheck);
+
+ appendPQExpBufferStr(query, ";\n");
+
+ appendPQExpBuffer(delqry, "DROP POLICY %s", fmtId(polinfo->polname));
+ appendPQExpBuffer(delqry, " ON %s;\n", fmtQualifiedDumpable(tbinfo));
+
+ appendPQExpBuffer(polprefix, "POLICY %s ON",
+ fmtId(polinfo->polname));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, polinfo->dobj.name);
+
+ if (polinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, polinfo->dobj.catId, polinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = polinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "POLICY",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ if (polinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, polprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ polinfo->dobj.catId, 0, polinfo->dobj.dumpId);
+
+ free(tag);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(polprefix);
+ free(qtabname);
+}
+
+/*
+ * getPublications
+ * get information about publications
+ */
+PublicationInfo *
+getPublications(Archive *fout, int *numPublications)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PGresult *res;
+ PublicationInfo *pubinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_pubname;
+ int i_pubowner;
+ int i_puballtables;
+ int i_pubinsert;
+ int i_pubupdate;
+ int i_pubdelete;
+ int i_pubtruncate;
+ int i_pubviaroot;
+ int i,
+ ntups;
+
+ if (dopt->no_publications || fout->remoteVersion < 100000)
+ {
+ *numPublications = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ resetPQExpBuffer(query);
+
+ /* Get the publications. */
+ if (fout->remoteVersion >= 130000)
+ appendPQExpBufferStr(query,
+ "SELECT p.tableoid, p.oid, p.pubname, "
+ "p.pubowner, "
+ "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubviaroot "
+ "FROM pg_publication p");
+ else if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "SELECT p.tableoid, p.oid, p.pubname, "
+ "p.pubowner, "
+ "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubviaroot "
+ "FROM pg_publication p");
+ else
+ appendPQExpBufferStr(query,
+ "SELECT p.tableoid, p.oid, p.pubname, "
+ "p.pubowner, "
+ "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubviaroot "
+ "FROM pg_publication p");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_pubname = PQfnumber(res, "pubname");
+ i_pubowner = PQfnumber(res, "pubowner");
+ i_puballtables = PQfnumber(res, "puballtables");
+ i_pubinsert = PQfnumber(res, "pubinsert");
+ i_pubupdate = PQfnumber(res, "pubupdate");
+ i_pubdelete = PQfnumber(res, "pubdelete");
+ i_pubtruncate = PQfnumber(res, "pubtruncate");
+ i_pubviaroot = PQfnumber(res, "pubviaroot");
+
+ pubinfo = pg_malloc(ntups * sizeof(PublicationInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ pubinfo[i].dobj.objType = DO_PUBLICATION;
+ pubinfo[i].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ pubinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&pubinfo[i].dobj);
+ pubinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_pubname));
+ pubinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_pubowner));
+ pubinfo[i].puballtables =
+ (strcmp(PQgetvalue(res, i, i_puballtables), "t") == 0);
+ pubinfo[i].pubinsert =
+ (strcmp(PQgetvalue(res, i, i_pubinsert), "t") == 0);
+ pubinfo[i].pubupdate =
+ (strcmp(PQgetvalue(res, i, i_pubupdate), "t") == 0);
+ pubinfo[i].pubdelete =
+ (strcmp(PQgetvalue(res, i, i_pubdelete), "t") == 0);
+ pubinfo[i].pubtruncate =
+ (strcmp(PQgetvalue(res, i, i_pubtruncate), "t") == 0);
+ pubinfo[i].pubviaroot =
+ (strcmp(PQgetvalue(res, i, i_pubviaroot), "t") == 0);
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(pubinfo[i].dobj), fout);
+ }
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ *numPublications = ntups;
+ return pubinfo;
+}
+
+/*
+ * dumpPublication
+ * dump the definition of the given publication
+ */
+static void
+dumpPublication(Archive *fout, const PublicationInfo *pubinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qpubname;
+ bool first = true;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qpubname = pg_strdup(fmtId(pubinfo->dobj.name));
+
+ appendPQExpBuffer(delq, "DROP PUBLICATION %s;\n",
+ qpubname);
+
+ appendPQExpBuffer(query, "CREATE PUBLICATION %s",
+ qpubname);
+
+ if (pubinfo->puballtables)
+ appendPQExpBufferStr(query, " FOR ALL TABLES");
+
+ appendPQExpBufferStr(query, " WITH (publish = '");
+ if (pubinfo->pubinsert)
+ {
+ appendPQExpBufferStr(query, "insert");
+ first = false;
+ }
+
+ if (pubinfo->pubupdate)
+ {
+ if (!first)
+ appendPQExpBufferStr(query, ", ");
+
+ appendPQExpBufferStr(query, "update");
+ first = false;
+ }
+
+ if (pubinfo->pubdelete)
+ {
+ if (!first)
+ appendPQExpBufferStr(query, ", ");
+
+ appendPQExpBufferStr(query, "delete");
+ first = false;
+ }
+
+ if (pubinfo->pubtruncate)
+ {
+ if (!first)
+ appendPQExpBufferStr(query, ", ");
+
+ appendPQExpBufferStr(query, "truncate");
+ first = false;
+ }
+
+ appendPQExpBufferChar(query, '\'');
+
+ if (pubinfo->pubviaroot)
+ appendPQExpBufferStr(query, ", publish_via_partition_root = true");
+
+ appendPQExpBufferStr(query, ");\n");
+
+ if (pubinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, pubinfo->dobj.catId, pubinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = pubinfo->dobj.name,
+ .owner = pubinfo->rolname,
+ .description = "PUBLICATION",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delq->data));
+
+ if (pubinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "PUBLICATION", qpubname,
+ NULL, pubinfo->rolname,
+ pubinfo->dobj.catId, 0, pubinfo->dobj.dumpId);
+
+ if (pubinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "PUBLICATION", qpubname,
+ NULL, pubinfo->rolname,
+ pubinfo->dobj.catId, 0, pubinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qpubname);
+}
+
+/*
+ * getPublicationNamespaces
+ * get information about publication membership for dumpable schemas.
+ */
+void
+getPublicationNamespaces(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ PublicationSchemaInfo *pubsinfo;
+ DumpOptions *dopt = fout->dopt;
+ int i_tableoid;
+ int i_oid;
+ int i_pnpubid;
+ int i_pnnspid;
+ int i,
+ j,
+ ntups;
+
+ if (dopt->no_publications || fout->remoteVersion < 150000)
+ return;
+
+ query = createPQExpBuffer();
+
+ /* Collect all publication membership info. */
+ appendPQExpBufferStr(query,
+ "SELECT tableoid, oid, pnpubid, pnnspid "
+ "FROM pg_catalog.pg_publication_namespace");
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_pnpubid = PQfnumber(res, "pnpubid");
+ i_pnnspid = PQfnumber(res, "pnnspid");
+
+ /* this allocation may be more than we need */
+ pubsinfo = pg_malloc(ntups * sizeof(PublicationSchemaInfo));
+ j = 0;
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid pnpubid = atooid(PQgetvalue(res, i, i_pnpubid));
+ Oid pnnspid = atooid(PQgetvalue(res, i, i_pnnspid));
+ PublicationInfo *pubinfo;
+ NamespaceInfo *nspinfo;
+
+ /*
+ * Ignore any entries for which we aren't interested in either the
+ * publication or the rel.
+ */
+ pubinfo = findPublicationByOid(pnpubid);
+ if (pubinfo == NULL)
+ continue;
+ nspinfo = findNamespaceByOid(pnnspid);
+ if (nspinfo == NULL)
+ continue;
+
+ /*
+ * We always dump publication namespaces unless the corresponding
+ * namespace is excluded from the dump.
+ */
+ if (nspinfo->dobj.dump == DUMP_COMPONENT_NONE)
+ continue;
+
+ /* OK, make a DumpableObject for this relationship */
+ pubsinfo[j].dobj.objType = DO_PUBLICATION_TABLE_IN_SCHEMA;
+ pubsinfo[j].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ pubsinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&pubsinfo[j].dobj);
+ pubsinfo[j].dobj.namespace = nspinfo->dobj.namespace;
+ pubsinfo[j].dobj.name = nspinfo->dobj.name;
+ pubsinfo[j].publication = pubinfo;
+ pubsinfo[j].pubschema = nspinfo;
+
+ /* Decide whether we want to dump it */
+ selectDumpablePublicationObject(&(pubsinfo[j].dobj), fout);
+
+ j++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getPublicationTables
+ * get information about publication membership for dumpable tables.
+ */
+void
+getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ PublicationRelInfo *pubrinfo;
+ DumpOptions *dopt = fout->dopt;
+ int i_tableoid;
+ int i_oid;
+ int i_prpubid;
+ int i_prrelid;
+ int i_prrelqual;
+ int i_prattrs;
+ int i,
+ j,
+ ntups;
+
+ if (dopt->no_publications || fout->remoteVersion < 100000)
+ return;
+
+ query = createPQExpBuffer();
+
+ /* Collect all publication membership info. */
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ "SELECT tableoid, oid, prpubid, prrelid, "
+ "pg_catalog.pg_get_expr(prqual, prrelid) AS prrelqual, "
+ "(CASE\n"
+ " WHEN pr.prattrs IS NOT NULL THEN\n"
+ " (SELECT array_agg(attname)\n"
+ " FROM\n"
+ " pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
+ " pg_catalog.pg_attribute\n"
+ " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n"
+ " ELSE NULL END) prattrs "
+ "FROM pg_catalog.pg_publication_rel pr");
+ else
+ appendPQExpBufferStr(query,
+ "SELECT tableoid, oid, prpubid, prrelid, "
+ "NULL AS prrelqual, NULL AS prattrs "
+ "FROM pg_catalog.pg_publication_rel");
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_prpubid = PQfnumber(res, "prpubid");
+ i_prrelid = PQfnumber(res, "prrelid");
+ i_prrelqual = PQfnumber(res, "prrelqual");
+ i_prattrs = PQfnumber(res, "prattrs");
+
+ /* this allocation may be more than we need */
+ pubrinfo = pg_malloc(ntups * sizeof(PublicationRelInfo));
+ j = 0;
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid prpubid = atooid(PQgetvalue(res, i, i_prpubid));
+ Oid prrelid = atooid(PQgetvalue(res, i, i_prrelid));
+ PublicationInfo *pubinfo;
+ TableInfo *tbinfo;
+
+ /*
+ * Ignore any entries for which we aren't interested in either the
+ * publication or the rel.
+ */
+ pubinfo = findPublicationByOid(prpubid);
+ if (pubinfo == NULL)
+ continue;
+ tbinfo = findTableByOid(prrelid);
+ if (tbinfo == NULL)
+ continue;
+
+ /*
+ * Ignore publication membership of tables whose definitions are not
+ * to be dumped.
+ */
+ if (!(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ continue;
+
+ /* OK, make a DumpableObject for this relationship */
+ pubrinfo[j].dobj.objType = DO_PUBLICATION_REL;
+ pubrinfo[j].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ pubrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&pubrinfo[j].dobj);
+ pubrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ pubrinfo[j].dobj.name = tbinfo->dobj.name;
+ pubrinfo[j].publication = pubinfo;
+ pubrinfo[j].pubtable = tbinfo;
+ if (PQgetisnull(res, i, i_prrelqual))
+ pubrinfo[j].pubrelqual = NULL;
+ else
+ pubrinfo[j].pubrelqual = pg_strdup(PQgetvalue(res, i, i_prrelqual));
+
+ if (!PQgetisnull(res, i, i_prattrs))
+ {
+ char **attnames;
+ int nattnames;
+ PQExpBuffer attribs;
+
+ if (!parsePGArray(PQgetvalue(res, i, i_prattrs),
+ &attnames, &nattnames))
+ pg_fatal("could not parse %s array", "prattrs");
+ attribs = createPQExpBuffer();
+ for (int k = 0; k < nattnames; k++)
+ {
+ if (k > 0)
+ appendPQExpBufferStr(attribs, ", ");
+
+ appendPQExpBufferStr(attribs, fmtId(attnames[k]));
+ }
+ pubrinfo[j].pubrattrs = attribs->data;
+ }
+ else
+ pubrinfo[j].pubrattrs = NULL;
+
+ /* Decide whether we want to dump it */
+ selectDumpablePublicationObject(&(pubrinfo[j].dobj), fout);
+
+ j++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpPublicationNamespace
+ * dump the definition of the given publication schema mapping.
+ */
+static void
+dumpPublicationNamespace(Archive *fout, const PublicationSchemaInfo *pubsinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ NamespaceInfo *schemainfo = pubsinfo->pubschema;
+ PublicationInfo *pubinfo = pubsinfo->publication;
+ PQExpBuffer query;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ tag = psprintf("%s %s", pubinfo->dobj.name, schemainfo->dobj.name);
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "ALTER PUBLICATION %s ", fmtId(pubinfo->dobj.name));
+ appendPQExpBuffer(query, "ADD TABLES IN SCHEMA %s;\n", fmtId(schemainfo->dobj.name));
+
+ /*
+ * There is no point in creating drop query as the drop is done by schema
+ * drop.
+ */
+ if (pubsinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, pubsinfo->dobj.catId, pubsinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = schemainfo->dobj.name,
+ .owner = pubinfo->rolname,
+ .description = "PUBLICATION TABLES IN SCHEMA",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data));
+
+ /* These objects can't currently have comments or seclabels */
+
+ free(tag);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpPublicationTable
+ * dump the definition of the given publication table mapping
+ */
+static void
+dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PublicationInfo *pubinfo = pubrinfo->publication;
+ TableInfo *tbinfo = pubrinfo->pubtable;
+ PQExpBuffer query;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ tag = psprintf("%s %s", pubinfo->dobj.name, tbinfo->dobj.name);
+
+ query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY",
+ fmtId(pubinfo->dobj.name));
+ appendPQExpBuffer(query, " %s",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (pubrinfo->pubrattrs)
+ appendPQExpBuffer(query, " (%s)", pubrinfo->pubrattrs);
+
+ if (pubrinfo->pubrelqual)
+ {
+ /*
+ * It's necessary to add parentheses around the expression because
+ * pg_get_expr won't supply the parentheses for things like WHERE
+ * TRUE.
+ */
+ appendPQExpBuffer(query, " WHERE (%s)", pubrinfo->pubrelqual);
+ }
+ appendPQExpBufferStr(query, ";\n");
+
+ /*
+ * There is no point in creating a drop query as the drop is done by table
+ * drop. (If you think to change this, see also _printTocEntry().)
+ * Although this object doesn't really have ownership as such, set the
+ * owner field anyway to ensure that the command is run by the correct
+ * role at restore time.
+ */
+ if (pubrinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, pubrinfo->dobj.catId, pubrinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = pubinfo->rolname,
+ .description = "PUBLICATION TABLE",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data));
+
+ /* These objects can't currently have comments or seclabels */
+
+ free(tag);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Is the currently connected user a superuser?
+ */
+static bool
+is_superuser(Archive *fout)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) fout;
+ const char *val;
+
+ val = PQparameterStatus(AH->connection, "is_superuser");
+
+ if (val && strcmp(val, "on") == 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * getSubscriptions
+ * get information about subscriptions
+ */
+void
+getSubscriptions(Archive *fout)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PGresult *res;
+ SubscriptionInfo *subinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_subname;
+ int i_subowner;
+ int i_subbinary;
+ int i_substream;
+ int i_subtwophasestate;
+ int i_subdisableonerr;
+ int i_subpasswordrequired;
+ int i_subrunasowner;
+ int i_subconninfo;
+ int i_subslotname;
+ int i_subsynccommit;
+ int i_subpublications;
+ int i_suborigin;
+ int i,
+ ntups;
+
+ if (dopt->no_subscriptions || fout->remoteVersion < 100000)
+ return;
+
+ if (!is_superuser(fout))
+ {
+ int n;
+
+ res = ExecuteSqlQuery(fout,
+ "SELECT count(*) FROM pg_subscription "
+ "WHERE subdbid = (SELECT oid FROM pg_database"
+ " WHERE datname = current_database())",
+ PGRES_TUPLES_OK);
+ n = atoi(PQgetvalue(res, 0, 0));
+ if (n > 0)
+ pg_log_warning("subscriptions not dumped because current user is not a superuser");
+ PQclear(res);
+ return;
+ }
+
+ query = createPQExpBuffer();
+
+ /* Get the subscriptions in current database. */
+ appendPQExpBufferStr(query,
+ "SELECT s.tableoid, s.oid, s.subname,\n"
+ " s.subowner,\n"
+ " s.subconninfo, s.subslotname, s.subsynccommit,\n"
+ " s.subpublications,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query, " s.subbinary,\n");
+ else
+ appendPQExpBufferStr(query, " false AS subbinary,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query, " s.substream,\n");
+ else
+ appendPQExpBufferStr(query, " 'f' AS substream,\n");
+
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ " s.subtwophasestate,\n"
+ " s.subdisableonerr,\n");
+ else
+ appendPQExpBuffer(query,
+ " '%c' AS subtwophasestate,\n"
+ " false AS subdisableonerr,\n",
+ LOGICALREP_TWOPHASE_STATE_DISABLED);
+
+ if (fout->remoteVersion >= 160000)
+ appendPQExpBufferStr(query,
+ " s.subpasswordrequired,\n"
+ " s.subrunasowner,\n"
+ " s.suborigin\n");
+ else
+ appendPQExpBuffer(query,
+ " 't' AS subpasswordrequired,\n"
+ " 't' AS subrunasowner,\n"
+ " '%s' AS suborigin\n",
+ LOGICALREP_ORIGIN_ANY);
+
+ appendPQExpBufferStr(query,
+ "FROM pg_subscription s\n"
+ "WHERE s.subdbid = (SELECT oid FROM pg_database\n"
+ " WHERE datname = current_database())");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ /*
+ * Get subscription fields. We don't include subskiplsn in the dump as
+ * after restoring the dump this value may no longer be relevant.
+ */
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_subname = PQfnumber(res, "subname");
+ i_subowner = PQfnumber(res, "subowner");
+ i_subbinary = PQfnumber(res, "subbinary");
+ i_substream = PQfnumber(res, "substream");
+ i_subtwophasestate = PQfnumber(res, "subtwophasestate");
+ i_subdisableonerr = PQfnumber(res, "subdisableonerr");
+ i_subpasswordrequired = PQfnumber(res, "subpasswordrequired");
+ i_subrunasowner = PQfnumber(res, "subrunasowner");
+ i_subconninfo = PQfnumber(res, "subconninfo");
+ i_subslotname = PQfnumber(res, "subslotname");
+ i_subsynccommit = PQfnumber(res, "subsynccommit");
+ i_subpublications = PQfnumber(res, "subpublications");
+ i_suborigin = PQfnumber(res, "suborigin");
+
+ subinfo = pg_malloc(ntups * sizeof(SubscriptionInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ subinfo[i].dobj.objType = DO_SUBSCRIPTION;
+ subinfo[i].dobj.catId.tableoid =
+ atooid(PQgetvalue(res, i, i_tableoid));
+ subinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&subinfo[i].dobj);
+ subinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_subname));
+ subinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_subowner));
+
+ subinfo[i].subbinary =
+ pg_strdup(PQgetvalue(res, i, i_subbinary));
+ subinfo[i].substream =
+ pg_strdup(PQgetvalue(res, i, i_substream));
+ subinfo[i].subtwophasestate =
+ pg_strdup(PQgetvalue(res, i, i_subtwophasestate));
+ subinfo[i].subdisableonerr =
+ pg_strdup(PQgetvalue(res, i, i_subdisableonerr));
+ subinfo[i].subpasswordrequired =
+ pg_strdup(PQgetvalue(res, i, i_subpasswordrequired));
+ subinfo[i].subrunasowner =
+ pg_strdup(PQgetvalue(res, i, i_subrunasowner));
+ subinfo[i].subconninfo =
+ pg_strdup(PQgetvalue(res, i, i_subconninfo));
+ if (PQgetisnull(res, i, i_subslotname))
+ subinfo[i].subslotname = NULL;
+ else
+ subinfo[i].subslotname =
+ pg_strdup(PQgetvalue(res, i, i_subslotname));
+ subinfo[i].subsynccommit =
+ pg_strdup(PQgetvalue(res, i, i_subsynccommit));
+ subinfo[i].subpublications =
+ pg_strdup(PQgetvalue(res, i, i_subpublications));
+ subinfo[i].suborigin = pg_strdup(PQgetvalue(res, i, i_suborigin));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(subinfo[i].dobj), fout);
+ }
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpSubscription
+ * dump the definition of the given subscription
+ */
+static void
+dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ PQExpBuffer publications;
+ char *qsubname;
+ char **pubnames = NULL;
+ int npubnames = 0;
+ int i;
+ char two_phase_disabled[] = {LOGICALREP_TWOPHASE_STATE_DISABLED, '\0'};
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qsubname = pg_strdup(fmtId(subinfo->dobj.name));
+
+ appendPQExpBuffer(delq, "DROP SUBSCRIPTION %s;\n",
+ qsubname);
+
+ appendPQExpBuffer(query, "CREATE SUBSCRIPTION %s CONNECTION ",
+ qsubname);
+ appendStringLiteralAH(query, subinfo->subconninfo, fout);
+
+ /* Build list of quoted publications and append them to query. */
+ if (!parsePGArray(subinfo->subpublications, &pubnames, &npubnames))
+ pg_fatal("could not parse %s array", "subpublications");
+
+ publications = createPQExpBuffer();
+ for (i = 0; i < npubnames; i++)
+ {
+ if (i > 0)
+ appendPQExpBufferStr(publications, ", ");
+
+ appendPQExpBufferStr(publications, fmtId(pubnames[i]));
+ }
+
+ appendPQExpBuffer(query, " PUBLICATION %s WITH (connect = false, slot_name = ", publications->data);
+ if (subinfo->subslotname)
+ appendStringLiteralAH(query, subinfo->subslotname, fout);
+ else
+ appendPQExpBufferStr(query, "NONE");
+
+ if (strcmp(subinfo->subbinary, "t") == 0)
+ appendPQExpBufferStr(query, ", binary = true");
+
+ if (strcmp(subinfo->substream, "t") == 0)
+ appendPQExpBufferStr(query, ", streaming = on");
+ else if (strcmp(subinfo->substream, "p") == 0)
+ appendPQExpBufferStr(query, ", streaming = parallel");
+
+ if (strcmp(subinfo->subtwophasestate, two_phase_disabled) != 0)
+ appendPQExpBufferStr(query, ", two_phase = on");
+
+ if (strcmp(subinfo->subdisableonerr, "t") == 0)
+ appendPQExpBufferStr(query, ", disable_on_error = true");
+
+ if (strcmp(subinfo->subpasswordrequired, "t") != 0)
+ appendPQExpBuffer(query, ", password_required = false");
+
+ if (strcmp(subinfo->subrunasowner, "t") == 0)
+ appendPQExpBufferStr(query, ", run_as_owner = true");
+
+ if (strcmp(subinfo->subsynccommit, "off") != 0)
+ appendPQExpBuffer(query, ", synchronous_commit = %s", fmtId(subinfo->subsynccommit));
+
+ if (pg_strcasecmp(subinfo->suborigin, LOGICALREP_ORIGIN_ANY) != 0)
+ appendPQExpBuffer(query, ", origin = %s", subinfo->suborigin);
+
+ appendPQExpBufferStr(query, ");\n");
+
+ if (subinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, subinfo->dobj.catId, subinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = subinfo->dobj.name,
+ .owner = subinfo->rolname,
+ .description = "SUBSCRIPTION",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delq->data));
+
+ if (subinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "SUBSCRIPTION", qsubname,
+ NULL, subinfo->rolname,
+ subinfo->dobj.catId, 0, subinfo->dobj.dumpId);
+
+ if (subinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "SUBSCRIPTION", qsubname,
+ NULL, subinfo->rolname,
+ subinfo->dobj.catId, 0, subinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(publications);
+ free(pubnames);
+
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qsubname);
+}
+
+/*
+ * Given a "create query", append as many ALTER ... DEPENDS ON EXTENSION as
+ * the object needs.
+ */
+static void
+append_depends_on_extension(Archive *fout,
+ PQExpBuffer create,
+ const DumpableObject *dobj,
+ const char *catalog,
+ const char *keyword,
+ const char *objname)
+{
+ if (dobj->depends_on_ext)
+ {
+ char *nm;
+ PGresult *res;
+ PQExpBuffer query;
+ int ntups;
+ int i_extname;
+ int i;
+
+ /* dodge fmtId() non-reentrancy */
+ nm = pg_strdup(objname);
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query,
+ "SELECT e.extname "
+ "FROM pg_catalog.pg_depend d, pg_catalog.pg_extension e "
+ "WHERE d.refobjid = e.oid AND classid = '%s'::pg_catalog.regclass "
+ "AND objid = '%u'::pg_catalog.oid AND deptype = 'x' "
+ "AND refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass",
+ catalog,
+ dobj->catId.oid);
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ ntups = PQntuples(res);
+ i_extname = PQfnumber(res, "extname");
+ for (i = 0; i < ntups; i++)
+ {
+ appendPQExpBuffer(create, "ALTER %s %s DEPENDS ON EXTENSION %s;\n",
+ keyword, nm,
+ fmtId(PQgetvalue(res, i, i_extname)));
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ pg_free(nm);
+ }
+}
+
+static Oid
+get_next_possible_free_pg_type_oid(Archive *fout, PQExpBuffer upgrade_query)
+{
+ /*
+ * If the old version didn't assign an array type, but the new version
+ * does, we must select an unused type OID to assign. This currently only
+ * happens for domains, when upgrading pre-v11 to v11 and up.
+ *
+ * Note: local state here is kind of ugly, but we must have some, since we
+ * mustn't choose the same unused OID more than once.
+ */
+ static Oid next_possible_free_oid = FirstNormalObjectId;
+ PGresult *res;
+ bool is_dup;
+
+ do
+ {
+ ++next_possible_free_oid;
+ printfPQExpBuffer(upgrade_query,
+ "SELECT EXISTS(SELECT 1 "
+ "FROM pg_catalog.pg_type "
+ "WHERE oid = '%u'::pg_catalog.oid);",
+ next_possible_free_oid);
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+ is_dup = (PQgetvalue(res, 0, 0)[0] == 't');
+ PQclear(res);
+ } while (is_dup);
+
+ return next_possible_free_oid;
+}
+
+static void
+binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ Oid pg_type_oid,
+ bool force_array_type,
+ bool include_multirange_type)
+{
+ PQExpBuffer upgrade_query = createPQExpBuffer();
+ PGresult *res;
+ Oid pg_type_array_oid;
+ Oid pg_type_multirange_oid;
+ Oid pg_type_multirange_array_oid;
+
+ appendPQExpBufferStr(upgrade_buffer, "\n-- For binary upgrade, must preserve pg_type oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_oid);
+
+ appendPQExpBuffer(upgrade_query,
+ "SELECT typarray "
+ "FROM pg_catalog.pg_type "
+ "WHERE oid = '%u'::pg_catalog.oid;",
+ pg_type_oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+
+ pg_type_array_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typarray")));
+
+ PQclear(res);
+
+ if (!OidIsValid(pg_type_array_oid) && force_array_type)
+ pg_type_array_oid = get_next_possible_free_pg_type_oid(fout, upgrade_query);
+
+ if (OidIsValid(pg_type_array_oid))
+ {
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve pg_type array oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_array_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_array_oid);
+ }
+
+ /*
+ * Pre-set the multirange type oid and its own array type oid.
+ */
+ if (include_multirange_type)
+ {
+ if (fout->remoteVersion >= 140000)
+ {
+ printfPQExpBuffer(upgrade_query,
+ "SELECT t.oid, t.typarray "
+ "FROM pg_catalog.pg_type t "
+ "JOIN pg_catalog.pg_range r "
+ "ON t.oid = r.rngmultitypid "
+ "WHERE r.rngtypid = '%u'::pg_catalog.oid;",
+ pg_type_oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+
+ pg_type_multirange_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "oid")));
+ pg_type_multirange_array_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typarray")));
+
+ PQclear(res);
+ }
+ else
+ {
+ pg_type_multirange_oid = get_next_possible_free_pg_type_oid(fout, upgrade_query);
+ pg_type_multirange_array_oid = get_next_possible_free_pg_type_oid(fout, upgrade_query);
+ }
+
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve multirange pg_type oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_multirange_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_multirange_oid);
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve multirange pg_type array oid\n");
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_multirange_array_pg_type_oid('%u'::pg_catalog.oid);\n\n",
+ pg_type_multirange_array_oid);
+ }
+
+ destroyPQExpBuffer(upgrade_query);
+}
+
+static void
+binary_upgrade_set_type_oids_by_rel(Archive *fout,
+ PQExpBuffer upgrade_buffer,
+ const TableInfo *tbinfo)
+{
+ Oid pg_type_oid = tbinfo->reltype;
+
+ if (OidIsValid(pg_type_oid))
+ binary_upgrade_set_type_oids_by_type_oid(fout, upgrade_buffer,
+ pg_type_oid, false, false);
+}
+
+static void
+binary_upgrade_set_pg_class_oids(Archive *fout,
+ PQExpBuffer upgrade_buffer, Oid pg_class_oid,
+ bool is_index)
+{
+ PQExpBuffer upgrade_query = createPQExpBuffer();
+ PGresult *upgrade_res;
+ RelFileNumber relfilenumber;
+ Oid toast_oid;
+ RelFileNumber toast_relfilenumber;
+ char relkind;
+ Oid toast_index_oid;
+ RelFileNumber toast_index_relfilenumber;
+
+ /*
+ * Preserve the OID and relfilenumber of the table, table's index, table's
+ * toast table and toast table's index if any.
+ *
+ * One complexity is that the current table definition might not require
+ * the creation of a TOAST table, but the old database might have a TOAST
+ * table that was created earlier, before some wide columns were dropped.
+ * By setting the TOAST oid we force creation of the TOAST heap and index
+ * by the new backend, so we can copy the files during binary upgrade
+ * without worrying about this case.
+ */
+ appendPQExpBuffer(upgrade_query,
+ "SELECT c.relkind, c.relfilenode, c.reltoastrelid, ct.relfilenode AS toast_relfilenode, i.indexrelid, cti.relfilenode AS toast_index_relfilenode "
+ "FROM pg_catalog.pg_class c LEFT JOIN "
+ "pg_catalog.pg_index i ON (c.reltoastrelid = i.indrelid AND i.indisvalid) "
+ "LEFT JOIN pg_catalog.pg_class ct ON (c.reltoastrelid = ct.oid) "
+ "LEFT JOIN pg_catalog.pg_class AS cti ON (i.indexrelid = cti.oid) "
+ "WHERE c.oid = '%u'::pg_catalog.oid;",
+ pg_class_oid);
+
+ upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
+
+ relkind = *PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "relkind"));
+
+ relfilenumber = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "relfilenode")));
+ toast_oid = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "reltoastrelid")));
+ toast_relfilenumber = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "toast_relfilenode")));
+ toast_index_oid = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "indexrelid")));
+ toast_index_relfilenumber = atooid(PQgetvalue(upgrade_res, 0,
+ PQfnumber(upgrade_res, "toast_index_relfilenode")));
+
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, must preserve pg_class oids and relfilenodes\n");
+
+ if (!is_index)
+ {
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_heap_pg_class_oid('%u'::pg_catalog.oid);\n",
+ pg_class_oid);
+
+ /*
+ * Not every relation has storage. Also, in a pre-v12 database,
+ * partitioned tables have a relfilenumber, which should not be
+ * preserved when upgrading.
+ */
+ if (RelFileNumberIsValid(relfilenumber) && relkind != RELKIND_PARTITIONED_TABLE)
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenumber);
+
+ /*
+ * In a pre-v12 database, partitioned tables might be marked as having
+ * toast tables, but we should ignore them if so.
+ */
+ if (OidIsValid(toast_oid) &&
+ relkind != RELKIND_PARTITIONED_TABLE)
+ {
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_toast_pg_class_oid('%u'::pg_catalog.oid);\n",
+ toast_oid);
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_toast_relfilenode('%u'::pg_catalog.oid);\n",
+ toast_relfilenumber);
+
+ /* every toast table has an index */
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_pg_class_oid('%u'::pg_catalog.oid);\n",
+ toast_index_oid);
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+ toast_index_relfilenumber);
+ }
+
+ PQclear(upgrade_res);
+ }
+ else
+ {
+ /* Preserve the OID and relfilenumber of the index */
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_pg_class_oid('%u'::pg_catalog.oid);\n",
+ pg_class_oid);
+ appendPQExpBuffer(upgrade_buffer,
+ "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
+ relfilenumber);
+ }
+
+ appendPQExpBufferChar(upgrade_buffer, '\n');
+
+ destroyPQExpBuffer(upgrade_query);
+}
+
+/*
+ * If the DumpableObject is a member of an extension, add a suitable
+ * ALTER EXTENSION ADD command to the creation commands in upgrade_buffer.
+ *
+ * For somewhat historical reasons, objname should already be quoted,
+ * but not objnamespace (if any).
+ */
+static void
+binary_upgrade_extension_member(PQExpBuffer upgrade_buffer,
+ const DumpableObject *dobj,
+ const char *objtype,
+ const char *objname,
+ const char *objnamespace)
+{
+ DumpableObject *extobj = NULL;
+ int i;
+
+ if (!dobj->ext_member)
+ return;
+
+ /*
+ * Find the parent extension. We could avoid this search if we wanted to
+ * add a link field to DumpableObject, but the space costs of that would
+ * be considerable. We assume that member objects could only have a
+ * direct dependency on their own extension, not any others.
+ */
+ for (i = 0; i < dobj->nDeps; i++)
+ {
+ extobj = findObjectByDumpId(dobj->dependencies[i]);
+ if (extobj && extobj->objType == DO_EXTENSION)
+ break;
+ extobj = NULL;
+ }
+ if (extobj == NULL)
+ pg_fatal("could not find parent extension for %s %s",
+ objtype, objname);
+
+ appendPQExpBufferStr(upgrade_buffer,
+ "\n-- For binary upgrade, handle extension membership the hard way\n");
+ appendPQExpBuffer(upgrade_buffer, "ALTER EXTENSION %s ADD %s ",
+ fmtId(extobj->name),
+ objtype);
+ if (objnamespace && *objnamespace)
+ appendPQExpBuffer(upgrade_buffer, "%s.", fmtId(objnamespace));
+ appendPQExpBuffer(upgrade_buffer, "%s;\n", objname);
+}
+
+/*
+ * getNamespaces:
+ * read all namespaces in the system catalogs and return them in the
+ * NamespaceInfo* structure
+ *
+ * numNamespaces is set to the number of namespaces read in
+ */
+NamespaceInfo *
+getNamespaces(Archive *fout, int *numNamespaces)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ NamespaceInfo *nsinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_nspname;
+ int i_nspowner;
+ int i_nspacl;
+ int i_acldefault;
+
+ query = createPQExpBuffer();
+
+ /*
+ * we fetch all namespaces including system ones, so that every object we
+ * read in can be linked to a containing namespace.
+ */
+ appendPQExpBufferStr(query, "SELECT n.tableoid, n.oid, n.nspname, "
+ "n.nspowner, "
+ "n.nspacl, "
+ "acldefault('n', n.nspowner) AS acldefault "
+ "FROM pg_namespace n");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ nsinfo = (NamespaceInfo *) pg_malloc(ntups * sizeof(NamespaceInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_nspname = PQfnumber(res, "nspname");
+ i_nspowner = PQfnumber(res, "nspowner");
+ i_nspacl = PQfnumber(res, "nspacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ const char *nspowner;
+
+ nsinfo[i].dobj.objType = DO_NAMESPACE;
+ nsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ nsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&nsinfo[i].dobj);
+ nsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_nspname));
+ nsinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_nspacl));
+ nsinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ nsinfo[i].dacl.privtype = 0;
+ nsinfo[i].dacl.initprivs = NULL;
+ nspowner = PQgetvalue(res, i, i_nspowner);
+ nsinfo[i].nspowner = atooid(nspowner);
+ nsinfo[i].rolname = getRoleName(nspowner);
+
+ /* Decide whether to dump this namespace */
+ selectDumpableNamespace(&nsinfo[i], fout);
+
+ /* Mark whether namespace has an ACL */
+ if (!PQgetisnull(res, i, i_nspacl))
+ nsinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /*
+ * We ignore any pg_init_privs.initprivs entry for the public schema
+ * and assume a predetermined default, for several reasons. First,
+ * dropping and recreating the schema removes its pg_init_privs entry,
+ * but an empty destination database starts with this ACL nonetheless.
+ * Second, we support dump/reload of public schema ownership changes.
+ * ALTER SCHEMA OWNER filters nspacl through aclnewowner(), but
+ * initprivs continues to reflect the initial owner. Hence,
+ * synthesize the value that nspacl will have after the restore's
+ * ALTER SCHEMA OWNER. Third, this makes the destination database
+ * match the source's ACL, even if the latter was an initdb-default
+ * ACL, which changed in v15. An upgrade pulls in changes to most
+ * system object ACLs that the DBA had not customized. We've made the
+ * public schema depart from that, because changing its ACL so easily
+ * breaks applications.
+ */
+ if (strcmp(nsinfo[i].dobj.name, "public") == 0)
+ {
+ PQExpBuffer aclarray = createPQExpBuffer();
+ PQExpBuffer aclitem = createPQExpBuffer();
+
+ /* Standard ACL as of v15 is {owner=UC/owner,=U/owner} */
+ appendPQExpBufferChar(aclarray, '{');
+ quoteAclUserName(aclitem, nsinfo[i].rolname);
+ appendPQExpBufferStr(aclitem, "=UC/");
+ quoteAclUserName(aclitem, nsinfo[i].rolname);
+ appendPGArray(aclarray, aclitem->data);
+ resetPQExpBuffer(aclitem);
+ appendPQExpBufferStr(aclitem, "=U/");
+ quoteAclUserName(aclitem, nsinfo[i].rolname);
+ appendPGArray(aclarray, aclitem->data);
+ appendPQExpBufferChar(aclarray, '}');
+
+ nsinfo[i].dacl.privtype = 'i';
+ nsinfo[i].dacl.initprivs = pstrdup(aclarray->data);
+ nsinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ destroyPQExpBuffer(aclarray);
+ destroyPQExpBuffer(aclitem);
+ }
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ *numNamespaces = ntups;
+
+ return nsinfo;
+}
+
+/*
+ * findNamespace:
+ * given a namespace OID, look up the info read by getNamespaces
+ */
+static NamespaceInfo *
+findNamespace(Oid nsoid)
+{
+ NamespaceInfo *nsinfo;
+
+ nsinfo = findNamespaceByOid(nsoid);
+ if (nsinfo == NULL)
+ pg_fatal("schema with OID %u does not exist", nsoid);
+ return nsinfo;
+}
+
+/*
+ * getExtensions:
+ * read all extensions in the system catalogs and return them in the
+ * ExtensionInfo* structure
+ *
+ * numExtensions is set to the number of extensions read in
+ */
+ExtensionInfo *
+getExtensions(Archive *fout, int *numExtensions)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ ExtensionInfo *extinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_extname;
+ int i_nspname;
+ int i_extrelocatable;
+ int i_extversion;
+ int i_extconfig;
+ int i_extcondition;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT x.tableoid, x.oid, "
+ "x.extname, n.nspname, x.extrelocatable, x.extversion, x.extconfig, x.extcondition "
+ "FROM pg_extension x "
+ "JOIN pg_namespace n ON n.oid = x.extnamespace");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ extinfo = (ExtensionInfo *) pg_malloc(ntups * sizeof(ExtensionInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_extname = PQfnumber(res, "extname");
+ i_nspname = PQfnumber(res, "nspname");
+ i_extrelocatable = PQfnumber(res, "extrelocatable");
+ i_extversion = PQfnumber(res, "extversion");
+ i_extconfig = PQfnumber(res, "extconfig");
+ i_extcondition = PQfnumber(res, "extcondition");
+
+ for (i = 0; i < ntups; i++)
+ {
+ extinfo[i].dobj.objType = DO_EXTENSION;
+ extinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ extinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&extinfo[i].dobj);
+ extinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_extname));
+ extinfo[i].namespace = pg_strdup(PQgetvalue(res, i, i_nspname));
+ extinfo[i].relocatable = *(PQgetvalue(res, i, i_extrelocatable)) == 't';
+ extinfo[i].extversion = pg_strdup(PQgetvalue(res, i, i_extversion));
+ extinfo[i].extconfig = pg_strdup(PQgetvalue(res, i, i_extconfig));
+ extinfo[i].extcondition = pg_strdup(PQgetvalue(res, i, i_extcondition));
+
+ /* Decide whether we want to dump it */
+ selectDumpableExtension(&(extinfo[i]), dopt);
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ *numExtensions = ntups;
+
+ return extinfo;
+}
+
+/*
+ * getTypes:
+ * read all types in the system catalogs and return them in the
+ * TypeInfo* structure
+ *
+ * numTypes is set to the number of types read in
+ *
+ * NB: this must run after getFuncs() because we assume we can do
+ * findFuncByOid().
+ */
+TypeInfo *
+getTypes(Archive *fout, int *numTypes)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ TypeInfo *tyinfo;
+ ShellTypeInfo *stinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_typname;
+ int i_typnamespace;
+ int i_typacl;
+ int i_acldefault;
+ int i_typowner;
+ int i_typelem;
+ int i_typrelid;
+ int i_typrelkind;
+ int i_typtype;
+ int i_typisdefined;
+ int i_isarray;
+
+ /*
+ * we include even the built-in types because those may be used as array
+ * elements by user-defined types
+ *
+ * we filter out the built-in types when we dump out the types
+ *
+ * same approach for undefined (shell) types and array types
+ *
+ * Note: as of 8.3 we can reliably detect whether a type is an
+ * auto-generated array type by checking the element type's typarray.
+ * (Before that the test is capable of generating false positives.) We
+ * still check for name beginning with '_', though, so as to avoid the
+ * cost of the subselect probe for all standard types. This would have to
+ * be revisited if the backend ever allows renaming of array types.
+ */
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, typname, "
+ "typnamespace, typacl, "
+ "acldefault('T', typowner) AS acldefault, "
+ "typowner, "
+ "typelem, typrelid, "
+ "CASE WHEN typrelid = 0 THEN ' '::\"char\" "
+ "ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, "
+ "typtype, typisdefined, "
+ "typname[0] = '_' AND typelem != 0 AND "
+ "(SELECT typarray FROM pg_type te WHERE oid = pg_type.typelem) = oid AS isarray "
+ "FROM pg_type");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ tyinfo = (TypeInfo *) pg_malloc(ntups * sizeof(TypeInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_typname = PQfnumber(res, "typname");
+ i_typnamespace = PQfnumber(res, "typnamespace");
+ i_typacl = PQfnumber(res, "typacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_typowner = PQfnumber(res, "typowner");
+ i_typelem = PQfnumber(res, "typelem");
+ i_typrelid = PQfnumber(res, "typrelid");
+ i_typrelkind = PQfnumber(res, "typrelkind");
+ i_typtype = PQfnumber(res, "typtype");
+ i_typisdefined = PQfnumber(res, "typisdefined");
+ i_isarray = PQfnumber(res, "isarray");
+
+ for (i = 0; i < ntups; i++)
+ {
+ tyinfo[i].dobj.objType = DO_TYPE;
+ tyinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ tyinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&tyinfo[i].dobj);
+ tyinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_typname));
+ tyinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_typnamespace)));
+ tyinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_typacl));
+ tyinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ tyinfo[i].dacl.privtype = 0;
+ tyinfo[i].dacl.initprivs = NULL;
+ tyinfo[i].ftypname = NULL; /* may get filled later */
+ tyinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_typowner));
+ tyinfo[i].typelem = atooid(PQgetvalue(res, i, i_typelem));
+ tyinfo[i].typrelid = atooid(PQgetvalue(res, i, i_typrelid));
+ tyinfo[i].typrelkind = *PQgetvalue(res, i, i_typrelkind);
+ tyinfo[i].typtype = *PQgetvalue(res, i, i_typtype);
+ tyinfo[i].shellType = NULL;
+
+ if (strcmp(PQgetvalue(res, i, i_typisdefined), "t") == 0)
+ tyinfo[i].isDefined = true;
+ else
+ tyinfo[i].isDefined = false;
+
+ if (strcmp(PQgetvalue(res, i, i_isarray), "t") == 0)
+ tyinfo[i].isArray = true;
+ else
+ tyinfo[i].isArray = false;
+
+ if (tyinfo[i].typtype == 'm')
+ tyinfo[i].isMultirange = true;
+ else
+ tyinfo[i].isMultirange = false;
+
+ /* Decide whether we want to dump it */
+ selectDumpableType(&tyinfo[i], fout);
+
+ /* Mark whether type has an ACL */
+ if (!PQgetisnull(res, i, i_typacl))
+ tyinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /*
+ * If it's a domain, fetch info about its constraints, if any
+ */
+ tyinfo[i].nDomChecks = 0;
+ tyinfo[i].domChecks = NULL;
+ if ((tyinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) &&
+ tyinfo[i].typtype == TYPTYPE_DOMAIN)
+ getDomainConstraints(fout, &(tyinfo[i]));
+
+ /*
+ * If it's a base type, make a DumpableObject representing a shell
+ * definition of the type. We will need to dump that ahead of the I/O
+ * functions for the type. Similarly, range types need a shell
+ * definition in case they have a canonicalize function.
+ *
+ * Note: the shell type doesn't have a catId. You might think it
+ * should copy the base type's catId, but then it might capture the
+ * pg_depend entries for the type, which we don't want.
+ */
+ if ((tyinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) &&
+ (tyinfo[i].typtype == TYPTYPE_BASE ||
+ tyinfo[i].typtype == TYPTYPE_RANGE))
+ {
+ stinfo = (ShellTypeInfo *) pg_malloc(sizeof(ShellTypeInfo));
+ stinfo->dobj.objType = DO_SHELL_TYPE;
+ stinfo->dobj.catId = nilCatalogId;
+ AssignDumpId(&stinfo->dobj);
+ stinfo->dobj.name = pg_strdup(tyinfo[i].dobj.name);
+ stinfo->dobj.namespace = tyinfo[i].dobj.namespace;
+ stinfo->baseType = &(tyinfo[i]);
+ tyinfo[i].shellType = stinfo;
+
+ /*
+ * Initially mark the shell type as not to be dumped. We'll only
+ * dump it if the I/O or canonicalize functions need to be dumped;
+ * this is taken care of while sorting dependencies.
+ */
+ stinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ }
+ }
+
+ *numTypes = ntups;
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return tyinfo;
+}
+
+/*
+ * getOperators:
+ * read all operators in the system catalogs and return them in the
+ * OprInfo* structure
+ *
+ * numOprs is set to the number of operators read in
+ */
+OprInfo *
+getOperators(Archive *fout, int *numOprs)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ OprInfo *oprinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_oprname;
+ int i_oprnamespace;
+ int i_oprowner;
+ int i_oprkind;
+ int i_oprcode;
+
+ /*
+ * find all operators, including builtin operators; we filter out
+ * system-defined operators at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, oprname, "
+ "oprnamespace, "
+ "oprowner, "
+ "oprkind, "
+ "oprcode::oid AS oprcode "
+ "FROM pg_operator");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numOprs = ntups;
+
+ oprinfo = (OprInfo *) pg_malloc(ntups * sizeof(OprInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_oprname = PQfnumber(res, "oprname");
+ i_oprnamespace = PQfnumber(res, "oprnamespace");
+ i_oprowner = PQfnumber(res, "oprowner");
+ i_oprkind = PQfnumber(res, "oprkind");
+ i_oprcode = PQfnumber(res, "oprcode");
+
+ for (i = 0; i < ntups; i++)
+ {
+ oprinfo[i].dobj.objType = DO_OPERATOR;
+ oprinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ oprinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&oprinfo[i].dobj);
+ oprinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oprname));
+ oprinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)));
+ oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner));
+ oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0];
+ oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(oprinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return oprinfo;
+}
+
+/*
+ * getCollations:
+ * read all collations in the system catalogs and return them in the
+ * CollInfo* structure
+ *
+ * numCollations is set to the number of collations read in
+ */
+CollInfo *
+getCollations(Archive *fout, int *numCollations)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ CollInfo *collinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_collname;
+ int i_collnamespace;
+ int i_collowner;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all collations, including builtin collations; we filter out
+ * system-defined collations at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, "
+ "collnamespace, "
+ "collowner "
+ "FROM pg_collation");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numCollations = ntups;
+
+ collinfo = (CollInfo *) pg_malloc(ntups * sizeof(CollInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_collname = PQfnumber(res, "collname");
+ i_collnamespace = PQfnumber(res, "collnamespace");
+ i_collowner = PQfnumber(res, "collowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ collinfo[i].dobj.objType = DO_COLLATION;
+ collinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ collinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&collinfo[i].dobj);
+ collinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_collname));
+ collinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)));
+ collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(collinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return collinfo;
+}
+
+/*
+ * getConversions:
+ * read all conversions in the system catalogs and return them in the
+ * ConvInfo* structure
+ *
+ * numConversions is set to the number of conversions read in
+ */
+ConvInfo *
+getConversions(Archive *fout, int *numConversions)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ ConvInfo *convinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_conname;
+ int i_connamespace;
+ int i_conowner;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all conversions, including builtin conversions; we filter out
+ * system-defined conversions at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, conname, "
+ "connamespace, "
+ "conowner "
+ "FROM pg_conversion");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numConversions = ntups;
+
+ convinfo = (ConvInfo *) pg_malloc(ntups * sizeof(ConvInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_conname = PQfnumber(res, "conname");
+ i_connamespace = PQfnumber(res, "connamespace");
+ i_conowner = PQfnumber(res, "conowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ convinfo[i].dobj.objType = DO_CONVERSION;
+ convinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ convinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&convinfo[i].dobj);
+ convinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
+ convinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_connamespace)));
+ convinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_conowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(convinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return convinfo;
+}
+
+/*
+ * getAccessMethods:
+ * read all user-defined access methods in the system catalogs and return
+ * them in the AccessMethodInfo* structure
+ *
+ * numAccessMethods is set to the number of access methods read in
+ */
+AccessMethodInfo *
+getAccessMethods(Archive *fout, int *numAccessMethods)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ AccessMethodInfo *aminfo;
+ int i_tableoid;
+ int i_oid;
+ int i_amname;
+ int i_amhandler;
+ int i_amtype;
+
+ /* Before 9.6, there are no user-defined access methods */
+ if (fout->remoteVersion < 90600)
+ {
+ *numAccessMethods = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ /* Select all access methods from pg_am table */
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, "
+ "amhandler::pg_catalog.regproc AS amhandler "
+ "FROM pg_am");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numAccessMethods = ntups;
+
+ aminfo = (AccessMethodInfo *) pg_malloc(ntups * sizeof(AccessMethodInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_amname = PQfnumber(res, "amname");
+ i_amhandler = PQfnumber(res, "amhandler");
+ i_amtype = PQfnumber(res, "amtype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ aminfo[i].dobj.objType = DO_ACCESS_METHOD;
+ aminfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ aminfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&aminfo[i].dobj);
+ aminfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_amname));
+ aminfo[i].dobj.namespace = NULL;
+ aminfo[i].amhandler = pg_strdup(PQgetvalue(res, i, i_amhandler));
+ aminfo[i].amtype = *(PQgetvalue(res, i, i_amtype));
+
+ /* Decide whether we want to dump it */
+ selectDumpableAccessMethod(&(aminfo[i]), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return aminfo;
+}
+
+
+/*
+ * getOpclasses:
+ * read all opclasses in the system catalogs and return them in the
+ * OpclassInfo* structure
+ *
+ * numOpclasses is set to the number of opclasses read in
+ */
+OpclassInfo *
+getOpclasses(Archive *fout, int *numOpclasses)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ OpclassInfo *opcinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_opcname;
+ int i_opcnamespace;
+ int i_opcowner;
+
+ /*
+ * find all opclasses, including builtin opclasses; we filter out
+ * system-defined opclasses at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, "
+ "opcnamespace, "
+ "opcowner "
+ "FROM pg_opclass");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numOpclasses = ntups;
+
+ opcinfo = (OpclassInfo *) pg_malloc(ntups * sizeof(OpclassInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_opcname = PQfnumber(res, "opcname");
+ i_opcnamespace = PQfnumber(res, "opcnamespace");
+ i_opcowner = PQfnumber(res, "opcowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ opcinfo[i].dobj.objType = DO_OPCLASS;
+ opcinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ opcinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&opcinfo[i].dobj);
+ opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
+ opcinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)));
+ opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(opcinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return opcinfo;
+}
+
+/*
+ * getOpfamilies:
+ * read all opfamilies in the system catalogs and return them in the
+ * OpfamilyInfo* structure
+ *
+ * numOpfamilies is set to the number of opfamilies read in
+ */
+OpfamilyInfo *
+getOpfamilies(Archive *fout, int *numOpfamilies)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ OpfamilyInfo *opfinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_opfname;
+ int i_opfnamespace;
+ int i_opfowner;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all opfamilies, including builtin opfamilies; we filter out
+ * system-defined opfamilies at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, "
+ "opfnamespace, "
+ "opfowner "
+ "FROM pg_opfamily");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numOpfamilies = ntups;
+
+ opfinfo = (OpfamilyInfo *) pg_malloc(ntups * sizeof(OpfamilyInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_opfname = PQfnumber(res, "opfname");
+ i_opfnamespace = PQfnumber(res, "opfnamespace");
+ i_opfowner = PQfnumber(res, "opfowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ opfinfo[i].dobj.objType = DO_OPFAMILY;
+ opfinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ opfinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&opfinfo[i].dobj);
+ opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
+ opfinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)));
+ opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(opfinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return opfinfo;
+}
+
+/*
+ * getAggregates:
+ * read all the user-defined aggregates in the system catalogs and
+ * return them in the AggInfo* structure
+ *
+ * numAggs is set to the number of aggregates read in
+ */
+AggInfo *
+getAggregates(Archive *fout, int *numAggs)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ AggInfo *agginfo;
+ int i_tableoid;
+ int i_oid;
+ int i_aggname;
+ int i_aggnamespace;
+ int i_pronargs;
+ int i_proargtypes;
+ int i_proowner;
+ int i_aggacl;
+ int i_acldefault;
+
+ /*
+ * Find all interesting aggregates. See comment in getFuncs() for the
+ * rationale behind the filtering logic.
+ */
+ if (fout->remoteVersion >= 90600)
+ {
+ const char *agg_check;
+
+ agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'"
+ : "p.proisagg");
+
+ appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, "
+ "p.proname AS aggname, "
+ "p.pronamespace AS aggnamespace, "
+ "p.pronargs, p.proargtypes, "
+ "p.proowner, "
+ "p.proacl AS aggacl, "
+ "acldefault('f', p.proowner) AS acldefault "
+ "FROM pg_proc p "
+ "LEFT JOIN pg_init_privs pip ON "
+ "(p.oid = pip.objoid "
+ "AND pip.classoid = 'pg_proc'::regclass "
+ "AND pip.objsubid = 0) "
+ "WHERE %s AND ("
+ "p.pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog') OR "
+ "p.proacl IS DISTINCT FROM pip.initprivs",
+ agg_check);
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferChar(query, ')');
+ }
+ else
+ {
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, proname AS aggname, "
+ "pronamespace AS aggnamespace, "
+ "pronargs, proargtypes, "
+ "proowner, "
+ "proacl AS aggacl, "
+ "acldefault('f', proowner) AS acldefault "
+ "FROM pg_proc p "
+ "WHERE proisagg AND ("
+ "pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog')");
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferChar(query, ')');
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numAggs = ntups;
+
+ agginfo = (AggInfo *) pg_malloc(ntups * sizeof(AggInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_aggname = PQfnumber(res, "aggname");
+ i_aggnamespace = PQfnumber(res, "aggnamespace");
+ i_pronargs = PQfnumber(res, "pronargs");
+ i_proargtypes = PQfnumber(res, "proargtypes");
+ i_proowner = PQfnumber(res, "proowner");
+ i_aggacl = PQfnumber(res, "aggacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ agginfo[i].aggfn.dobj.objType = DO_AGG;
+ agginfo[i].aggfn.dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ agginfo[i].aggfn.dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&agginfo[i].aggfn.dobj);
+ agginfo[i].aggfn.dobj.name = pg_strdup(PQgetvalue(res, i, i_aggname));
+ agginfo[i].aggfn.dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_aggnamespace)));
+ agginfo[i].aggfn.dacl.acl = pg_strdup(PQgetvalue(res, i, i_aggacl));
+ agginfo[i].aggfn.dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ agginfo[i].aggfn.dacl.privtype = 0;
+ agginfo[i].aggfn.dacl.initprivs = NULL;
+ agginfo[i].aggfn.rolname = getRoleName(PQgetvalue(res, i, i_proowner));
+ agginfo[i].aggfn.lang = InvalidOid; /* not currently interesting */
+ agginfo[i].aggfn.prorettype = InvalidOid; /* not saved */
+ agginfo[i].aggfn.nargs = atoi(PQgetvalue(res, i, i_pronargs));
+ 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.postponed_def = false; /* might get set during sort */
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(agginfo[i].aggfn.dobj), fout);
+
+ /* Mark whether aggregate has an ACL */
+ if (!PQgetisnull(res, i, i_aggacl))
+ agginfo[i].aggfn.dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return agginfo;
+}
+
+/*
+ * getFuncs:
+ * read all the user-defined functions in the system catalogs and
+ * return them in the FuncInfo* structure
+ *
+ * numFuncs is set to the number of functions read in
+ */
+FuncInfo *
+getFuncs(Archive *fout, int *numFuncs)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ FuncInfo *finfo;
+ int i_tableoid;
+ int i_oid;
+ int i_proname;
+ int i_pronamespace;
+ int i_proowner;
+ int i_prolang;
+ int i_pronargs;
+ int i_proargtypes;
+ int i_prorettype;
+ int i_proacl;
+ int i_acldefault;
+
+ /*
+ * Find all interesting functions. This is a bit complicated:
+ *
+ * 1. Always exclude aggregates; those are handled elsewhere.
+ *
+ * 2. Always exclude functions that are internally dependent on something
+ * else, since presumably those will be created as a result of creating
+ * the something else. This currently acts only to suppress constructor
+ * functions for range types. Note this is OK only because the
+ * constructors don't have any dependencies the range type doesn't have;
+ * otherwise we might not get creation ordering correct.
+ *
+ * 3. Otherwise, we normally exclude functions in pg_catalog. However, if
+ * they're members of extensions and we are in binary-upgrade mode then
+ * include them, since we want to dump extension members individually in
+ * that mode. Also, if they are used by casts or transforms then we need
+ * to gather the information about them, though they won't be dumped if
+ * they are built-in. Also, in 9.6 and up, include functions in
+ * pg_catalog if they have an ACL different from what's shown in
+ * pg_init_privs (so we have to join to pg_init_privs; annoying).
+ */
+ if (fout->remoteVersion >= 90600)
+ {
+ const char *not_agg_check;
+
+ not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'"
+ : "NOT p.proisagg");
+
+ appendPQExpBuffer(query,
+ "SELECT p.tableoid, p.oid, p.proname, p.prolang, "
+ "p.pronargs, p.proargtypes, p.prorettype, "
+ "p.proacl, "
+ "acldefault('f', p.proowner) AS acldefault, "
+ "p.pronamespace, "
+ "p.proowner "
+ "FROM pg_proc p "
+ "LEFT JOIN pg_init_privs pip ON "
+ "(p.oid = pip.objoid "
+ "AND pip.classoid = 'pg_proc'::regclass "
+ "AND pip.objsubid = 0) "
+ "WHERE %s"
+ "\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
+ "WHERE classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND deptype = 'i')"
+ "\n AND ("
+ "\n pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog')"
+ "\n OR EXISTS (SELECT 1 FROM pg_cast"
+ "\n WHERE pg_cast.oid > %u "
+ "\n AND p.oid = pg_cast.castfunc)"
+ "\n OR EXISTS (SELECT 1 FROM pg_transform"
+ "\n WHERE pg_transform.oid > %u AND "
+ "\n (p.oid = pg_transform.trffromsql"
+ "\n OR p.oid = pg_transform.trftosql))",
+ not_agg_check,
+ g_last_builtin_oid,
+ g_last_builtin_oid);
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferStr(query,
+ "\n OR p.proacl IS DISTINCT FROM pip.initprivs");
+ appendPQExpBufferChar(query, ')');
+ }
+ else
+ {
+ appendPQExpBuffer(query,
+ "SELECT tableoid, oid, proname, prolang, "
+ "pronargs, proargtypes, prorettype, proacl, "
+ "acldefault('f', proowner) AS acldefault, "
+ "pronamespace, "
+ "proowner "
+ "FROM pg_proc p "
+ "WHERE NOT proisagg"
+ "\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
+ "WHERE classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND deptype = 'i')"
+ "\n AND ("
+ "\n pronamespace != "
+ "(SELECT oid FROM pg_namespace "
+ "WHERE nspname = 'pg_catalog')"
+ "\n OR EXISTS (SELECT 1 FROM pg_cast"
+ "\n WHERE pg_cast.oid > '%u'::oid"
+ "\n AND p.oid = pg_cast.castfunc)",
+ g_last_builtin_oid);
+
+ if (fout->remoteVersion >= 90500)
+ appendPQExpBuffer(query,
+ "\n OR EXISTS (SELECT 1 FROM pg_transform"
+ "\n WHERE pg_transform.oid > '%u'::oid"
+ "\n AND (p.oid = pg_transform.trffromsql"
+ "\n OR p.oid = pg_transform.trftosql))",
+ g_last_builtin_oid);
+
+ if (dopt->binary_upgrade)
+ appendPQExpBufferStr(query,
+ "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
+ "classid = 'pg_proc'::regclass AND "
+ "objid = p.oid AND "
+ "refclassid = 'pg_extension'::regclass AND "
+ "deptype = 'e')");
+ appendPQExpBufferChar(query, ')');
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numFuncs = ntups;
+
+ finfo = (FuncInfo *) pg_malloc0(ntups * sizeof(FuncInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_proname = PQfnumber(res, "proname");
+ i_pronamespace = PQfnumber(res, "pronamespace");
+ i_proowner = PQfnumber(res, "proowner");
+ i_prolang = PQfnumber(res, "prolang");
+ i_pronargs = PQfnumber(res, "pronargs");
+ i_proargtypes = PQfnumber(res, "proargtypes");
+ i_prorettype = PQfnumber(res, "prorettype");
+ i_proacl = PQfnumber(res, "proacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ finfo[i].dobj.objType = DO_FUNC;
+ finfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ finfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&finfo[i].dobj);
+ finfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_proname));
+ finfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_pronamespace)));
+ finfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_proacl));
+ finfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ finfo[i].dacl.privtype = 0;
+ finfo[i].dacl.initprivs = NULL;
+ finfo[i].rolname = getRoleName(PQgetvalue(res, i, i_proowner));
+ finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang));
+ finfo[i].prorettype = atooid(PQgetvalue(res, i, i_prorettype));
+ finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
+ 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].postponed_def = false; /* might get set during sort */
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(finfo[i].dobj), fout);
+
+ /* Mark whether function has an ACL */
+ if (!PQgetisnull(res, i, i_proacl))
+ finfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return finfo;
+}
+
+/*
+ * getTables
+ * read all the tables (no indexes) in the system catalogs,
+ * and return them as an array of TableInfo structures
+ *
+ * *numTables is set to the number of tables read in
+ */
+TableInfo *
+getTables(Archive *fout, int *numTables)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ TableInfo *tblinfo;
+ int i_reltableoid;
+ int i_reloid;
+ int i_relname;
+ int i_relnamespace;
+ int i_relkind;
+ int i_reltype;
+ int i_relowner;
+ int i_relchecks;
+ int i_relhasindex;
+ int i_relhasrules;
+ int i_relpages;
+ int i_toastpages;
+ int i_owning_tab;
+ int i_owning_col;
+ int i_reltablespace;
+ int i_relhasoids;
+ int i_relhastriggers;
+ int i_relpersistence;
+ int i_relispopulated;
+ int i_relreplident;
+ int i_relrowsec;
+ int i_relforcerowsec;
+ int i_relfrozenxid;
+ int i_toastfrozenxid;
+ int i_toastoid;
+ int i_relminmxid;
+ int i_toastminmxid;
+ int i_reloptions;
+ int i_checkoption;
+ int i_toastreloptions;
+ int i_reloftype;
+ int i_foreignserver;
+ int i_amname;
+ int i_is_identity_sequence;
+ int i_relacl;
+ int i_acldefault;
+ int i_ispartition;
+
+ /*
+ * Find all the tables and table-like objects.
+ *
+ * We must fetch all tables in this phase because otherwise we cannot
+ * correctly identify inherited columns, owned sequences, etc.
+ *
+ * We include system catalogs, so that we can work if a user table is
+ * defined to inherit from a system catalog (pretty weird, but...)
+ *
+ * Note: in this phase we should collect only a minimal amount of
+ * information about each table, basically just enough to decide if it is
+ * interesting. In particular, since we do not yet have lock on any user
+ * table, we MUST NOT invoke any server-side data collection functions
+ * (for instance, pg_get_partkeydef()). Those are likely to fail or give
+ * wrong answers if any concurrent DDL is happening.
+ */
+
+ appendPQExpBufferStr(query,
+ "SELECT c.tableoid, c.oid, c.relname, "
+ "c.relnamespace, c.relkind, c.reltype, "
+ "c.relowner, "
+ "c.relchecks, "
+ "c.relhasindex, c.relhasrules, c.relpages, "
+ "c.relhastriggers, "
+ "c.relpersistence, "
+ "c.reloftype, "
+ "c.relacl, "
+ "acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE)
+ " THEN 's'::\"char\" ELSE 'r'::\"char\" END, c.relowner) AS acldefault, "
+ "CASE WHEN c.relkind = " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN "
+ "(SELECT ftserver FROM pg_catalog.pg_foreign_table WHERE ftrelid = c.oid) "
+ "ELSE 0 END AS foreignserver, "
+ "c.relfrozenxid, tc.relfrozenxid AS tfrozenxid, "
+ "tc.oid AS toid, "
+ "tc.relpages AS toastpages, "
+ "tc.reloptions AS toast_reloptions, "
+ "d.refobjid AS owning_tab, "
+ "d.refobjsubid AS owning_col, "
+ "tsp.spcname AS reltablespace, ");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(query,
+ "false AS relhasoids, ");
+ else
+ appendPQExpBufferStr(query,
+ "c.relhasoids, ");
+
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(query,
+ "c.relispopulated, ");
+ else
+ appendPQExpBufferStr(query,
+ "'t' as relispopulated, ");
+
+ if (fout->remoteVersion >= 90400)
+ appendPQExpBufferStr(query,
+ "c.relreplident, ");
+ else
+ appendPQExpBufferStr(query,
+ "'d' AS relreplident, ");
+
+ if (fout->remoteVersion >= 90500)
+ appendPQExpBufferStr(query,
+ "c.relrowsecurity, c.relforcerowsecurity, ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS relrowsecurity, "
+ "false AS relforcerowsecurity, ");
+
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(query,
+ "c.relminmxid, tc.relminmxid AS tminmxid, ");
+ else
+ appendPQExpBufferStr(query,
+ "0 AS relminmxid, 0 AS tminmxid, ");
+
+ if (fout->remoteVersion >= 90300)
+ appendPQExpBufferStr(query,
+ "array_remove(array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
+ "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
+ "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, ");
+ else
+ appendPQExpBufferStr(query,
+ "c.reloptions, NULL AS checkoption, ");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "am.amname, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS amname, ");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS is_identity_sequence, ");
+
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(query,
+ "c.relispartition AS ispartition ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS ispartition ");
+
+ /*
+ * Left join to pg_depend to pick up dependency info linking sequences to
+ * their owning column, if any (note this dependency is AUTO except for
+ * identity sequences, where it's INTERNAL). Also join to pg_tablespace to
+ * collect the spcname.
+ */
+ appendPQExpBufferStr(query,
+ "\nFROM pg_class c\n"
+ "LEFT JOIN pg_depend d ON "
+ "(c.relkind = " CppAsString2(RELKIND_SEQUENCE) " AND "
+ "d.classid = 'pg_class'::regclass AND d.objid = c.oid AND "
+ "d.objsubid = 0 AND "
+ "d.refclassid = 'pg_class'::regclass AND d.deptype IN ('a', 'i'))\n"
+ "LEFT JOIN pg_tablespace tsp ON (tsp.oid = c.reltablespace)\n");
+
+ /*
+ * In 9.6 and up, left join to pg_am to pick up the amname.
+ */
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "LEFT JOIN pg_am am ON (c.relam = am.oid)\n");
+
+ /*
+ * We purposefully ignore toast OIDs for partitioned tables; the reason is
+ * that versions 10 and 11 have them, but later versions do not, so
+ * emitting them causes the upgrade to fail.
+ */
+ appendPQExpBufferStr(query,
+ "LEFT JOIN pg_class tc ON (c.reltoastrelid = tc.oid"
+ " AND tc.relkind = " CppAsString2(RELKIND_TOASTVALUE)
+ " AND c.relkind <> " CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n");
+
+ /*
+ * Restrict to interesting relkinds (in particular, not indexes). Not all
+ * relkinds are possible in older servers, but it's not worth the trouble
+ * to emit a version-dependent list.
+ *
+ * Composite-type table entries won't be dumped as such, but we have to
+ * make a DumpableObject for them so that we can track dependencies of the
+ * composite type (pg_depend entries for columns of the composite type
+ * link to the pg_class entry not the pg_type entry).
+ */
+ appendPQExpBufferStr(query,
+ "WHERE c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_SEQUENCE) ", "
+ CppAsString2(RELKIND_VIEW) ", "
+ CppAsString2(RELKIND_COMPOSITE_TYPE) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n"
+ "ORDER BY c.oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numTables = ntups;
+
+ /*
+ * Extract data from result and lock dumpable tables. We do the locking
+ * before anything else, to minimize the window wherein a table could
+ * disappear under us.
+ *
+ * Note that we have to save info about all tables here, even when dumping
+ * only one, because we don't yet know which tables might be inheritance
+ * ancestors of the target table.
+ */
+ tblinfo = (TableInfo *) pg_malloc0(ntups * sizeof(TableInfo));
+
+ i_reltableoid = PQfnumber(res, "tableoid");
+ i_reloid = PQfnumber(res, "oid");
+ i_relname = PQfnumber(res, "relname");
+ i_relnamespace = PQfnumber(res, "relnamespace");
+ i_relkind = PQfnumber(res, "relkind");
+ i_reltype = PQfnumber(res, "reltype");
+ i_relowner = PQfnumber(res, "relowner");
+ i_relchecks = PQfnumber(res, "relchecks");
+ i_relhasindex = PQfnumber(res, "relhasindex");
+ i_relhasrules = PQfnumber(res, "relhasrules");
+ i_relpages = PQfnumber(res, "relpages");
+ i_toastpages = PQfnumber(res, "toastpages");
+ i_owning_tab = PQfnumber(res, "owning_tab");
+ i_owning_col = PQfnumber(res, "owning_col");
+ i_reltablespace = PQfnumber(res, "reltablespace");
+ i_relhasoids = PQfnumber(res, "relhasoids");
+ i_relhastriggers = PQfnumber(res, "relhastriggers");
+ i_relpersistence = PQfnumber(res, "relpersistence");
+ i_relispopulated = PQfnumber(res, "relispopulated");
+ i_relreplident = PQfnumber(res, "relreplident");
+ i_relrowsec = PQfnumber(res, "relrowsecurity");
+ i_relforcerowsec = PQfnumber(res, "relforcerowsecurity");
+ i_relfrozenxid = PQfnumber(res, "relfrozenxid");
+ i_toastfrozenxid = PQfnumber(res, "tfrozenxid");
+ i_toastoid = PQfnumber(res, "toid");
+ i_relminmxid = PQfnumber(res, "relminmxid");
+ i_toastminmxid = PQfnumber(res, "tminmxid");
+ i_reloptions = PQfnumber(res, "reloptions");
+ i_checkoption = PQfnumber(res, "checkoption");
+ i_toastreloptions = PQfnumber(res, "toast_reloptions");
+ i_reloftype = PQfnumber(res, "reloftype");
+ i_foreignserver = PQfnumber(res, "foreignserver");
+ i_amname = PQfnumber(res, "amname");
+ i_is_identity_sequence = PQfnumber(res, "is_identity_sequence");
+ i_relacl = PQfnumber(res, "relacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_ispartition = PQfnumber(res, "ispartition");
+
+ if (dopt->lockWaitTimeout)
+ {
+ /*
+ * Arrange to fail instead of waiting forever for a table lock.
+ *
+ * NB: this coding assumes that the only queries issued within the
+ * following loop are LOCK TABLEs; else the timeout may be undesirably
+ * applied to other things too.
+ */
+ resetPQExpBuffer(query);
+ appendPQExpBufferStr(query, "SET statement_timeout = ");
+ appendStringLiteralConn(query, dopt->lockWaitTimeout, GetConnection(fout));
+ ExecuteSqlStatement(fout, query->data);
+ }
+
+ resetPQExpBuffer(query);
+
+ for (i = 0; i < ntups; i++)
+ {
+ tblinfo[i].dobj.objType = DO_TABLE;
+ tblinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_reltableoid));
+ tblinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_reloid));
+ AssignDumpId(&tblinfo[i].dobj);
+ tblinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_relname));
+ tblinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_relnamespace)));
+ tblinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_relacl));
+ tblinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ tblinfo[i].dacl.privtype = 0;
+ tblinfo[i].dacl.initprivs = NULL;
+ tblinfo[i].relkind = *(PQgetvalue(res, i, i_relkind));
+ tblinfo[i].reltype = atooid(PQgetvalue(res, i, i_reltype));
+ tblinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_relowner));
+ tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
+ tblinfo[i].hasindex = (strcmp(PQgetvalue(res, i, i_relhasindex), "t") == 0);
+ tblinfo[i].hasrules = (strcmp(PQgetvalue(res, i, i_relhasrules), "t") == 0);
+ tblinfo[i].relpages = atoi(PQgetvalue(res, i, i_relpages));
+ if (PQgetisnull(res, i, i_toastpages))
+ tblinfo[i].toastpages = 0;
+ else
+ tblinfo[i].toastpages = atoi(PQgetvalue(res, i, i_toastpages));
+ if (PQgetisnull(res, i, i_owning_tab))
+ {
+ tblinfo[i].owning_tab = InvalidOid;
+ tblinfo[i].owning_col = 0;
+ }
+ else
+ {
+ tblinfo[i].owning_tab = atooid(PQgetvalue(res, i, i_owning_tab));
+ tblinfo[i].owning_col = atoi(PQgetvalue(res, i, i_owning_col));
+ }
+ tblinfo[i].reltablespace = pg_strdup(PQgetvalue(res, i, i_reltablespace));
+ tblinfo[i].hasoids = (strcmp(PQgetvalue(res, i, i_relhasoids), "t") == 0);
+ tblinfo[i].hastriggers = (strcmp(PQgetvalue(res, i, i_relhastriggers), "t") == 0);
+ tblinfo[i].relpersistence = *(PQgetvalue(res, i, i_relpersistence));
+ tblinfo[i].relispopulated = (strcmp(PQgetvalue(res, i, i_relispopulated), "t") == 0);
+ tblinfo[i].relreplident = *(PQgetvalue(res, i, i_relreplident));
+ tblinfo[i].rowsec = (strcmp(PQgetvalue(res, i, i_relrowsec), "t") == 0);
+ tblinfo[i].forcerowsec = (strcmp(PQgetvalue(res, i, i_relforcerowsec), "t") == 0);
+ tblinfo[i].frozenxid = atooid(PQgetvalue(res, i, i_relfrozenxid));
+ tblinfo[i].toast_frozenxid = atooid(PQgetvalue(res, i, i_toastfrozenxid));
+ tblinfo[i].toast_oid = atooid(PQgetvalue(res, i, i_toastoid));
+ tblinfo[i].minmxid = atooid(PQgetvalue(res, i, i_relminmxid));
+ tblinfo[i].toast_minmxid = atooid(PQgetvalue(res, i, i_toastminmxid));
+ tblinfo[i].reloptions = pg_strdup(PQgetvalue(res, i, i_reloptions));
+ if (PQgetisnull(res, i, i_checkoption))
+ tblinfo[i].checkoption = NULL;
+ else
+ tblinfo[i].checkoption = pg_strdup(PQgetvalue(res, i, i_checkoption));
+ tblinfo[i].toast_reloptions = pg_strdup(PQgetvalue(res, i, i_toastreloptions));
+ tblinfo[i].reloftype = atooid(PQgetvalue(res, i, i_reloftype));
+ tblinfo[i].foreign_server = atooid(PQgetvalue(res, i, i_foreignserver));
+ if (PQgetisnull(res, i, i_amname))
+ tblinfo[i].amname = NULL;
+ else
+ tblinfo[i].amname = pg_strdup(PQgetvalue(res, i, i_amname));
+ tblinfo[i].is_identity_sequence = (strcmp(PQgetvalue(res, i, i_is_identity_sequence), "t") == 0);
+ tblinfo[i].ispartition = (strcmp(PQgetvalue(res, i, i_ispartition), "t") == 0);
+
+ /* other fields were zeroed above */
+
+ /*
+ * Decide whether we want to dump this table.
+ */
+ if (tblinfo[i].relkind == RELKIND_COMPOSITE_TYPE)
+ tblinfo[i].dobj.dump = DUMP_COMPONENT_NONE;
+ else
+ selectDumpableTable(&tblinfo[i], fout);
+
+ /*
+ * Now, consider the table "interesting" if we need to dump its
+ * definition or its data. Later on, we'll skip a lot of data
+ * collection for uninteresting tables.
+ *
+ * Note: the "interesting" flag will also be set by flagInhTables for
+ * parents of interesting tables, so that we collect necessary
+ * inheritance info even when the parents are not themselves being
+ * dumped. This is the main reason why we need an "interesting" flag
+ * that's separate from the components-to-dump bitmask.
+ */
+ tblinfo[i].interesting = (tblinfo[i].dobj.dump &
+ (DUMP_COMPONENT_DEFINITION |
+ DUMP_COMPONENT_DATA)) != 0;
+
+ tblinfo[i].dummy_view = false; /* might get set during sort */
+ tblinfo[i].postponed_def = false; /* might get set during sort */
+
+ /* Tables have data */
+ tblinfo[i].dobj.components |= DUMP_COMPONENT_DATA;
+
+ /* Mark whether table has an ACL */
+ if (!PQgetisnull(res, i, i_relacl))
+ tblinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ tblinfo[i].hascolumnACLs = false; /* may get set later */
+
+ /*
+ * Read-lock target tables to make sure they aren't DROPPED or altered
+ * in schema before we get around to dumping them.
+ *
+ * Note that we don't explicitly lock parents of the target tables; we
+ * assume our lock on the child is enough to prevent schema
+ * alterations to parent tables.
+ *
+ * NOTE: it'd be kinda nice to lock other relations too, not only
+ * plain or partitioned tables, but the backend doesn't presently
+ * allow that.
+ *
+ * We only need to lock the table for certain components; see
+ * pg_dump.h
+ */
+ if ((tblinfo[i].dobj.dump & DUMP_COMPONENTS_REQUIRING_LOCK) &&
+ (tblinfo[i].relkind == RELKIND_RELATION ||
+ tblinfo[i].relkind == RELKIND_PARTITIONED_TABLE))
+ {
+ /*
+ * Tables are locked in batches. When dumping from a remote
+ * server this can save a significant amount of time by reducing
+ * the number of round trips.
+ */
+ if (query->len == 0)
+ appendPQExpBuffer(query, "LOCK TABLE %s",
+ fmtQualifiedDumpable(&tblinfo[i]));
+ else
+ {
+ appendPQExpBuffer(query, ", %s",
+ fmtQualifiedDumpable(&tblinfo[i]));
+
+ /* Arbitrarily end a batch when query length reaches 100K. */
+ if (query->len >= 100000)
+ {
+ /* Lock another batch of tables. */
+ appendPQExpBufferStr(query, " IN ACCESS SHARE MODE");
+ ExecuteSqlStatement(fout, query->data);
+ resetPQExpBuffer(query);
+ }
+ }
+ }
+ }
+
+ if (query->len != 0)
+ {
+ /* Lock the tables in the last batch. */
+ appendPQExpBufferStr(query, " IN ACCESS SHARE MODE");
+ ExecuteSqlStatement(fout, query->data);
+ }
+
+ if (dopt->lockWaitTimeout)
+ {
+ ExecuteSqlStatement(fout, "SET statement_timeout = 0");
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return tblinfo;
+}
+
+/*
+ * getOwnedSeqs
+ * identify owned sequences and mark them as dumpable if owning table is
+ *
+ * We used to do this in getTables(), but it's better to do it after the
+ * index used by findTableByOid() has been set up.
+ */
+void
+getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ int i;
+
+ /*
+ * Force sequences that are "owned" by table columns to be dumped whenever
+ * their owning table is being dumped.
+ */
+ for (i = 0; i < numTables; i++)
+ {
+ TableInfo *seqinfo = &tblinfo[i];
+ TableInfo *owning_tab;
+
+ if (!OidIsValid(seqinfo->owning_tab))
+ continue; /* not an owned sequence */
+
+ owning_tab = findTableByOid(seqinfo->owning_tab);
+ if (owning_tab == NULL)
+ pg_fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found",
+ seqinfo->owning_tab, seqinfo->dobj.catId.oid);
+
+ /*
+ * Only dump identity sequences if we're going to dump the table that
+ * it belongs to.
+ */
+ if (owning_tab->dobj.dump == DUMP_COMPONENT_NONE &&
+ seqinfo->is_identity_sequence)
+ {
+ seqinfo->dobj.dump = DUMP_COMPONENT_NONE;
+ continue;
+ }
+
+ /*
+ * Otherwise we need to dump the components that are being dumped for
+ * the table and any components which the sequence is explicitly
+ * marked with.
+ *
+ * We can't simply use the set of components which are being dumped
+ * for the table as the table might be in an extension (and only the
+ * non-extension components, eg: ACLs if changed, security labels, and
+ * policies, are being dumped) while the sequence is not (and
+ * therefore the definition and other components should also be
+ * dumped).
+ *
+ * If the sequence is part of the extension then it should be properly
+ * marked by checkExtensionMembership() and this will be a no-op as
+ * the table will be equivalently marked.
+ */
+ seqinfo->dobj.dump = seqinfo->dobj.dump | owning_tab->dobj.dump;
+
+ if (seqinfo->dobj.dump != DUMP_COMPONENT_NONE)
+ seqinfo->interesting = true;
+ }
+}
+
+/*
+ * getInherits
+ * read all the inheritance information
+ * from the system catalogs return them in the InhInfo* structure
+ *
+ * numInherits is set to the number of pairs read in
+ */
+InhInfo *
+getInherits(Archive *fout, int *numInherits)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ InhInfo *inhinfo;
+
+ int i_inhrelid;
+ int i_inhparent;
+
+ /* find all the inheritance information */
+ appendPQExpBufferStr(query, "SELECT inhrelid, inhparent FROM pg_inherits");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numInherits = ntups;
+
+ inhinfo = (InhInfo *) pg_malloc(ntups * sizeof(InhInfo));
+
+ i_inhrelid = PQfnumber(res, "inhrelid");
+ i_inhparent = PQfnumber(res, "inhparent");
+
+ for (i = 0; i < ntups; i++)
+ {
+ inhinfo[i].inhrelid = atooid(PQgetvalue(res, i, i_inhrelid));
+ inhinfo[i].inhparent = atooid(PQgetvalue(res, i, i_inhparent));
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return inhinfo;
+}
+
+/*
+ * getPartitioningInfo
+ * get information about partitioning
+ *
+ * For the most part, we only collect partitioning info about tables we
+ * intend to dump. However, this function has to consider all partitioned
+ * tables in the database, because we need to know about parents of partitions
+ * we are going to dump even if the parents themselves won't be dumped.
+ *
+ * Specifically, what we need to know is whether each partitioned table
+ * has an "unsafe" partitioning scheme that requires us to force
+ * load-via-partition-root mode for its children. Currently the only case
+ * for which we force that is hash partitioning on enum columns, since the
+ * hash codes depend on enum value OIDs which won't be replicated across
+ * dump-and-reload. There are other cases in which load-via-partition-root
+ * might be necessary, but we expect users to cope with them.
+ */
+void
+getPartitioningInfo(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups;
+
+ /* hash partitioning didn't exist before v11 */
+ if (fout->remoteVersion < 110000)
+ return;
+ /* needn't bother if schema-only dump */
+ if (fout->dopt->schemaOnly)
+ return;
+
+ query = createPQExpBuffer();
+
+ /*
+ * Unsafe partitioning schemes are exactly those for which hash enum_ops
+ * appears among the partition opclasses. We needn't check partstrat.
+ *
+ * Note that this query may well retrieve info about tables we aren't
+ * going to dump and hence have no lock on. That's okay since we need not
+ * invoke any unsafe server-side functions.
+ */
+ appendPQExpBufferStr(query,
+ "SELECT partrelid FROM pg_partitioned_table WHERE\n"
+ "(SELECT c.oid FROM pg_opclass c JOIN pg_am a "
+ "ON c.opcmethod = a.oid\n"
+ "WHERE opcname = 'enum_ops' "
+ "AND opcnamespace = 'pg_catalog'::regnamespace "
+ "AND amname = 'hash') = ANY(partclass)");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ for (int i = 0; i < ntups; i++)
+ {
+ Oid tabrelid = atooid(PQgetvalue(res, i, 0));
+ TableInfo *tbinfo;
+
+ tbinfo = findTableByOid(tabrelid);
+ if (tbinfo == NULL)
+ pg_fatal("failed sanity check, table OID %u appearing in pg_partitioned_table not found",
+ tabrelid);
+ tbinfo->unsafe_partitions = true;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getIndexes
+ * get information about every index on a dumpable table
+ *
+ * Note: index data is not returned directly to the caller, but it
+ * does get entered into the DumpableObject tables.
+ */
+void
+getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ IndxInfo *indxinfo;
+ int i_tableoid,
+ i_oid,
+ i_indrelid,
+ i_indexname,
+ i_parentidx,
+ i_indexdef,
+ i_indnkeyatts,
+ i_indnatts,
+ i_indkey,
+ i_indisclustered,
+ i_indisreplident,
+ i_indnullsnotdistinct,
+ i_contype,
+ i_conname,
+ i_condeferrable,
+ i_condeferred,
+ i_contableoid,
+ i_conoid,
+ i_condef,
+ i_tablespace,
+ i_indreloptions,
+ i_indstatcols,
+ i_indstatvals;
+
+ /*
+ * We want to perform just one query against pg_index. However, we
+ * mustn't try to select every row of the catalog and then sort it out on
+ * the client side, because some of the server-side functions we need
+ * would be unsafe to apply to tables we don't have lock on. Hence, we
+ * build an array of the OIDs of tables we care about (and now have lock
+ * on!), and use a WHERE clause to constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ if (!tbinfo->hasindex)
+ continue;
+
+ /*
+ * We can ignore indexes of uninteresting tables.
+ */
+ if (!tbinfo->interesting)
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ appendPQExpBufferStr(query,
+ "SELECT t.tableoid, t.oid, i.indrelid, "
+ "t.relname AS indexname, "
+ "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, "
+ "i.indkey, i.indisclustered, "
+ "c.contype, c.conname, "
+ "c.condeferrable, c.condeferred, "
+ "c.tableoid AS contableoid, "
+ "c.oid AS conoid, "
+ "pg_catalog.pg_get_constraintdef(c.oid, false) AS condef, "
+ "(SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, "
+ "t.reloptions AS indreloptions, ");
+
+
+ if (fout->remoteVersion >= 90400)
+ appendPQExpBufferStr(query,
+ "i.indisreplident, ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS indisreplident, ");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "inh.inhparent AS parentidx, "
+ "i.indnkeyatts AS indnkeyatts, "
+ "i.indnatts AS indnatts, "
+ "(SELECT pg_catalog.array_agg(attnum ORDER BY attnum) "
+ " FROM pg_catalog.pg_attribute "
+ " WHERE attrelid = i.indexrelid AND "
+ " attstattarget >= 0) AS indstatcols, "
+ "(SELECT pg_catalog.array_agg(attstattarget ORDER BY attnum) "
+ " FROM pg_catalog.pg_attribute "
+ " WHERE attrelid = i.indexrelid AND "
+ " attstattarget >= 0) AS indstatvals, ");
+ else
+ appendPQExpBufferStr(query,
+ "0 AS parentidx, "
+ "i.indnatts AS indnkeyatts, "
+ "i.indnatts AS indnatts, "
+ "'' AS indstatcols, "
+ "'' AS indstatvals, ");
+
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ "i.indnullsnotdistinct ");
+ else
+ appendPQExpBufferStr(query,
+ "false AS indnullsnotdistinct ");
+
+ /*
+ * The point of the messy-looking outer join is to find a constraint that
+ * is related by an internal dependency link to the index. If we find one,
+ * create a CONSTRAINT entry linked to the INDEX entry. We assume an
+ * index won't have more than one internal dependency.
+ *
+ * Note: the check on conrelid is redundant, but useful because that
+ * column is indexed while conindid is not.
+ */
+ if (fout->remoteVersion >= 110000)
+ {
+ appendPQExpBuffer(query,
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) "
+ "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) "
+ "JOIN pg_catalog.pg_class t2 ON (t2.oid = i.indrelid) "
+ "LEFT JOIN pg_catalog.pg_constraint c "
+ "ON (i.indrelid = c.conrelid AND "
+ "i.indexrelid = c.conindid AND "
+ "c.contype IN ('p','u','x')) "
+ "LEFT JOIN pg_catalog.pg_inherits inh "
+ "ON (inh.inhrelid = indexrelid) "
+ "WHERE (i.indisvalid OR t2.relkind = 'p') "
+ "AND i.indisready "
+ "ORDER BY i.indrelid, indexname",
+ tbloids->data);
+ }
+ else
+ {
+ /*
+ * the test on indisready is necessary in 9.2, and harmless in
+ * earlier/later versions
+ */
+ appendPQExpBuffer(query,
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) "
+ "JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) "
+ "LEFT JOIN pg_catalog.pg_constraint c "
+ "ON (i.indrelid = c.conrelid AND "
+ "i.indexrelid = c.conindid AND "
+ "c.contype IN ('p','u','x')) "
+ "WHERE i.indisvalid AND i.indisready "
+ "ORDER BY i.indrelid, indexname",
+ tbloids->data);
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_indrelid = PQfnumber(res, "indrelid");
+ i_indexname = PQfnumber(res, "indexname");
+ i_parentidx = PQfnumber(res, "parentidx");
+ i_indexdef = PQfnumber(res, "indexdef");
+ i_indnkeyatts = PQfnumber(res, "indnkeyatts");
+ i_indnatts = PQfnumber(res, "indnatts");
+ i_indkey = PQfnumber(res, "indkey");
+ i_indisclustered = PQfnumber(res, "indisclustered");
+ i_indisreplident = PQfnumber(res, "indisreplident");
+ i_indnullsnotdistinct = PQfnumber(res, "indnullsnotdistinct");
+ i_contype = PQfnumber(res, "contype");
+ i_conname = PQfnumber(res, "conname");
+ i_condeferrable = PQfnumber(res, "condeferrable");
+ i_condeferred = PQfnumber(res, "condeferred");
+ i_contableoid = PQfnumber(res, "contableoid");
+ i_conoid = PQfnumber(res, "conoid");
+ i_condef = PQfnumber(res, "condef");
+ i_tablespace = PQfnumber(res, "tablespace");
+ i_indreloptions = PQfnumber(res, "indreloptions");
+ i_indstatcols = PQfnumber(res, "indstatcols");
+ i_indstatvals = PQfnumber(res, "indstatvals");
+
+ indxinfo = (IndxInfo *) pg_malloc(ntups * sizeof(IndxInfo));
+
+ /*
+ * Outer loop iterates once per table, not once per row. Incrementing of
+ * j is handled by the inner loop.
+ */
+ curtblindx = -1;
+ for (int j = 0; j < ntups;)
+ {
+ Oid indrelid = atooid(PQgetvalue(res, j, i_indrelid));
+ TableInfo *tbinfo = NULL;
+ int numinds;
+
+ /* Count rows for this table */
+ for (numinds = 1; numinds < ntups - j; numinds++)
+ if (atooid(PQgetvalue(res, j + numinds, i_indrelid)) != indrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == indrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", indrelid);
+ /* cross-check that we only got requested tables */
+ if (!tbinfo->hasindex ||
+ !tbinfo->interesting)
+ pg_fatal("unexpected index data for table \"%s\"",
+ tbinfo->dobj.name);
+
+ /* Save data for this table */
+ tbinfo->indexes = indxinfo + j;
+ tbinfo->numIndexes = numinds;
+
+ for (int c = 0; c < numinds; c++, j++)
+ {
+ char contype;
+
+ indxinfo[j].dobj.objType = DO_INDEX;
+ indxinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
+ indxinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&indxinfo[j].dobj);
+ indxinfo[j].dobj.dump = tbinfo->dobj.dump;
+ indxinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_indexname));
+ indxinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ indxinfo[j].indextable = tbinfo;
+ indxinfo[j].indexdef = pg_strdup(PQgetvalue(res, j, i_indexdef));
+ indxinfo[j].indnkeyattrs = atoi(PQgetvalue(res, j, i_indnkeyatts));
+ indxinfo[j].indnattrs = atoi(PQgetvalue(res, j, i_indnatts));
+ indxinfo[j].tablespace = pg_strdup(PQgetvalue(res, j, i_tablespace));
+ 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].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');
+ indxinfo[j].parentidx = atooid(PQgetvalue(res, j, i_parentidx));
+ indxinfo[j].partattaches = (SimplePtrList)
+ {
+ NULL, NULL
+ };
+ contype = *(PQgetvalue(res, j, i_contype));
+
+ if (contype == 'p' || contype == 'u' || contype == 'x')
+ {
+ /*
+ * If we found a constraint matching the index, create an
+ * entry for it.
+ */
+ ConstraintInfo *constrinfo;
+
+ constrinfo = (ConstraintInfo *) pg_malloc(sizeof(ConstraintInfo));
+ constrinfo->dobj.objType = DO_CONSTRAINT;
+ constrinfo->dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_contableoid));
+ constrinfo->dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
+ AssignDumpId(&constrinfo->dobj);
+ constrinfo->dobj.dump = tbinfo->dobj.dump;
+ constrinfo->dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrinfo->dobj.namespace = tbinfo->dobj.namespace;
+ constrinfo->contable = tbinfo;
+ constrinfo->condomain = NULL;
+ constrinfo->contype = contype;
+ if (contype == 'x')
+ constrinfo->condef = pg_strdup(PQgetvalue(res, j, i_condef));
+ else
+ constrinfo->condef = NULL;
+ constrinfo->confrelid = InvalidOid;
+ constrinfo->conindex = indxinfo[j].dobj.dumpId;
+ constrinfo->condeferrable = *(PQgetvalue(res, j, i_condeferrable)) == 't';
+ constrinfo->condeferred = *(PQgetvalue(res, j, i_condeferred)) == 't';
+ constrinfo->conislocal = true;
+ constrinfo->separate = true;
+
+ indxinfo[j].indexconstraint = constrinfo->dobj.dumpId;
+ }
+ else
+ {
+ /* Plain secondary index */
+ indxinfo[j].indexconstraint = 0;
+ }
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * getExtendedStatistics
+ * get information about extended-statistics objects.
+ *
+ * Note: extended statistics data is not returned directly to the caller, but
+ * it does get entered into the DumpableObject tables.
+ */
+void
+getExtendedStatistics(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ StatsExtInfo *statsextinfo;
+ int ntups;
+ int i_tableoid;
+ int i_oid;
+ int i_stxname;
+ int i_stxnamespace;
+ int i_stxowner;
+ int i_stxrelid;
+ int i_stattarget;
+ int i;
+
+ /* Extended statistics were new in v10 */
+ if (fout->remoteVersion < 100000)
+ return;
+
+ query = createPQExpBuffer();
+
+ if (fout->remoteVersion < 130000)
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, stxname, "
+ "stxnamespace, stxowner, stxrelid, (-1) AS stxstattarget "
+ "FROM pg_catalog.pg_statistic_ext");
+ else
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, stxname, "
+ "stxnamespace, stxowner, stxrelid, stxstattarget "
+ "FROM pg_catalog.pg_statistic_ext");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_stxname = PQfnumber(res, "stxname");
+ i_stxnamespace = PQfnumber(res, "stxnamespace");
+ i_stxowner = PQfnumber(res, "stxowner");
+ i_stxrelid = PQfnumber(res, "stxrelid");
+ i_stattarget = PQfnumber(res, "stxstattarget");
+
+ statsextinfo = (StatsExtInfo *) pg_malloc(ntups * sizeof(StatsExtInfo));
+
+ for (i = 0; i < ntups; i++)
+ {
+ statsextinfo[i].dobj.objType = DO_STATSEXT;
+ statsextinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ statsextinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&statsextinfo[i].dobj);
+ statsextinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_stxname));
+ statsextinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_stxnamespace)));
+ statsextinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_stxowner));
+ statsextinfo[i].stattable =
+ findTableByOid(atooid(PQgetvalue(res, i, i_stxrelid)));
+ statsextinfo[i].stattarget = atoi(PQgetvalue(res, i, i_stattarget));
+
+ /* Decide whether we want to dump it */
+ selectDumpableStatisticsObject(&(statsextinfo[i]), fout);
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getConstraints
+ *
+ * Get info about constraints on dumpable tables.
+ *
+ * Currently handles foreign keys only.
+ * Unique and primary key constraints are handled with indexes,
+ * while check constraints are processed in getTableAttrs().
+ */
+void
+getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ TableInfo *tbinfo = NULL;
+ ConstraintInfo *constrinfo;
+ int i_contableoid,
+ i_conoid,
+ i_conrelid,
+ i_conname,
+ i_confrelid,
+ i_conindid,
+ i_condef;
+
+ /*
+ * We want to perform just one query against pg_constraint. However, we
+ * mustn't try to select every row of the catalog and then sort it out on
+ * the client side, because some of the server-side functions we need
+ * would be unsafe to apply to tables we don't have lock on. Hence, we
+ * build an array of the OIDs of tables we care about (and now have lock
+ * on!), and use a WHERE clause to constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tinfo = &tblinfo[i];
+
+ /*
+ * For partitioned tables, foreign keys have no triggers so they must
+ * be included anyway in case some foreign keys are defined.
+ */
+ if ((!tinfo->hastriggers &&
+ tinfo->relkind != RELKIND_PARTITIONED_TABLE) ||
+ !(tinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tinfo->dobj.catId.oid);
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ appendPQExpBufferStr(query,
+ "SELECT c.tableoid, c.oid, "
+ "conrelid, conname, confrelid, ");
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query, "conindid, ");
+ else
+ appendPQExpBufferStr(query, "0 AS conindid, ");
+ appendPQExpBuffer(query,
+ "pg_catalog.pg_get_constraintdef(c.oid) AS condef\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_constraint c ON (src.tbloid = c.conrelid)\n"
+ "WHERE contype = 'f' ",
+ tbloids->data);
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "AND conparentid = 0 ");
+ appendPQExpBufferStr(query,
+ "ORDER BY conrelid, conname");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_contableoid = PQfnumber(res, "tableoid");
+ i_conoid = PQfnumber(res, "oid");
+ i_conrelid = PQfnumber(res, "conrelid");
+ i_conname = PQfnumber(res, "conname");
+ i_confrelid = PQfnumber(res, "confrelid");
+ i_conindid = PQfnumber(res, "conindid");
+ i_condef = PQfnumber(res, "condef");
+
+ constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
+
+ curtblindx = -1;
+ for (int j = 0; j < ntups; j++)
+ {
+ Oid conrelid = atooid(PQgetvalue(res, j, i_conrelid));
+ TableInfo *reftable;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ if (tbinfo == NULL || tbinfo->dobj.catId.oid != conrelid)
+ {
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == conrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", conrelid);
+ }
+
+ constrinfo[j].dobj.objType = DO_FK_CONSTRAINT;
+ constrinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_contableoid));
+ constrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
+ AssignDumpId(&constrinfo[j].dobj);
+ constrinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ constrinfo[j].contable = tbinfo;
+ constrinfo[j].condomain = NULL;
+ constrinfo[j].contype = 'f';
+ constrinfo[j].condef = pg_strdup(PQgetvalue(res, j, i_condef));
+ constrinfo[j].confrelid = atooid(PQgetvalue(res, j, i_confrelid));
+ constrinfo[j].conindex = 0;
+ constrinfo[j].condeferrable = false;
+ constrinfo[j].condeferred = false;
+ constrinfo[j].conislocal = true;
+ constrinfo[j].separate = true;
+
+ /*
+ * Restoring an FK that points to a partitioned table requires that
+ * all partition indexes have been attached beforehand. Ensure that
+ * happens by making the constraint depend on each index partition
+ * attach object.
+ */
+ reftable = findTableByOid(constrinfo[j].confrelid);
+ if (reftable && reftable->relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ Oid indexOid = atooid(PQgetvalue(res, j, i_conindid));
+
+ if (indexOid != InvalidOid)
+ {
+ for (int k = 0; k < reftable->numIndexes; k++)
+ {
+ IndxInfo *refidx;
+
+ /* not our index? */
+ if (reftable->indexes[k].dobj.catId.oid != indexOid)
+ continue;
+
+ refidx = &reftable->indexes[k];
+ addConstrChildIdxDeps(&constrinfo[j].dobj, refidx);
+ break;
+ }
+ }
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * addConstrChildIdxDeps
+ *
+ * Recursive subroutine for getConstraints
+ *
+ * Given an object representing a foreign key constraint and an index on the
+ * partitioned table it references, mark the constraint object as dependent
+ * on the DO_INDEX_ATTACH object of each index partition, recursively
+ * drilling down to their partitions if any. This ensures that the FK is not
+ * restored until the index is fully marked valid.
+ */
+static void
+addConstrChildIdxDeps(DumpableObject *dobj, const IndxInfo *refidx)
+{
+ SimplePtrListCell *cell;
+
+ Assert(dobj->objType == DO_FK_CONSTRAINT);
+
+ for (cell = refidx->partattaches.head; cell; cell = cell->next)
+ {
+ IndexAttachInfo *attach = (IndexAttachInfo *) cell->ptr;
+
+ addObjectDependency(dobj, attach->dobj.dumpId);
+
+ if (attach->partitionIdx->partattaches.head != NULL)
+ addConstrChildIdxDeps(dobj, attach->partitionIdx);
+ }
+}
+
+/*
+ * getDomainConstraints
+ *
+ * Get info about constraints on a domain.
+ */
+static void
+getDomainConstraints(Archive *fout, TypeInfo *tyinfo)
+{
+ int i;
+ ConstraintInfo *constrinfo;
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i_tableoid,
+ i_oid,
+ i_conname,
+ i_consrc;
+ int ntups;
+
+ if (!fout->is_prepared[PREPQUERY_GETDOMAINCONSTRAINTS])
+ {
+ /* Set up query for constraint-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE getDomainConstraints(pg_catalog.oid) AS\n"
+ "SELECT tableoid, oid, conname, "
+ "pg_catalog.pg_get_constraintdef(oid) AS consrc, "
+ "convalidated "
+ "FROM pg_catalog.pg_constraint "
+ "WHERE contypid = $1 "
+ "ORDER BY conname");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_GETDOMAINCONSTRAINTS] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE getDomainConstraints('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_conname = PQfnumber(res, "conname");
+ i_consrc = PQfnumber(res, "consrc");
+
+ constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
+
+ tyinfo->nDomChecks = ntups;
+ tyinfo->domChecks = constrinfo;
+
+ for (i = 0; i < ntups; i++)
+ {
+ bool validated = PQgetvalue(res, i, 4)[0] == 't';
+
+ constrinfo[i].dobj.objType = DO_CONSTRAINT;
+ constrinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ constrinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&constrinfo[i].dobj);
+ constrinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
+ constrinfo[i].dobj.namespace = tyinfo->dobj.namespace;
+ constrinfo[i].contable = NULL;
+ constrinfo[i].condomain = tyinfo;
+ constrinfo[i].contype = 'c';
+ constrinfo[i].condef = pg_strdup(PQgetvalue(res, i, i_consrc));
+ constrinfo[i].confrelid = InvalidOid;
+ constrinfo[i].conindex = 0;
+ constrinfo[i].condeferrable = false;
+ constrinfo[i].condeferred = false;
+ constrinfo[i].conislocal = true;
+
+ constrinfo[i].separate = !validated;
+
+ /*
+ * Make the domain depend on the constraint, ensuring it won't be
+ * output till any constraint dependencies are OK. If the constraint
+ * has not been validated, it's going to be dumped after the domain
+ * anyway, so this doesn't matter.
+ */
+ if (validated)
+ addObjectDependency(&tyinfo->dobj,
+ constrinfo[i].dobj.dumpId);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getRules
+ * get basic information about every rule in the system
+ *
+ * numRules is set to the number of rules read in
+ */
+RuleInfo *
+getRules(Archive *fout, int *numRules)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ RuleInfo *ruleinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_rulename;
+ int i_ruletable;
+ int i_ev_type;
+ int i_is_instead;
+ int i_ev_enabled;
+
+ appendPQExpBufferStr(query, "SELECT "
+ "tableoid, oid, rulename, "
+ "ev_class AS ruletable, ev_type, is_instead, "
+ "ev_enabled "
+ "FROM pg_rewrite "
+ "ORDER BY oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numRules = ntups;
+
+ ruleinfo = (RuleInfo *) pg_malloc(ntups * sizeof(RuleInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_rulename = PQfnumber(res, "rulename");
+ i_ruletable = PQfnumber(res, "ruletable");
+ i_ev_type = PQfnumber(res, "ev_type");
+ i_is_instead = PQfnumber(res, "is_instead");
+ i_ev_enabled = PQfnumber(res, "ev_enabled");
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid ruletableoid;
+
+ ruleinfo[i].dobj.objType = DO_RULE;
+ ruleinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ ruleinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&ruleinfo[i].dobj);
+ ruleinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_rulename));
+ ruletableoid = atooid(PQgetvalue(res, i, i_ruletable));
+ ruleinfo[i].ruletable = findTableByOid(ruletableoid);
+ if (ruleinfo[i].ruletable == NULL)
+ pg_fatal("failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found",
+ ruletableoid, ruleinfo[i].dobj.catId.oid);
+ ruleinfo[i].dobj.namespace = ruleinfo[i].ruletable->dobj.namespace;
+ ruleinfo[i].dobj.dump = ruleinfo[i].ruletable->dobj.dump;
+ ruleinfo[i].ev_type = *(PQgetvalue(res, i, i_ev_type));
+ ruleinfo[i].is_instead = *(PQgetvalue(res, i, i_is_instead)) == 't';
+ ruleinfo[i].ev_enabled = *(PQgetvalue(res, i, i_ev_enabled));
+ if (ruleinfo[i].ruletable)
+ {
+ /*
+ * If the table is a view or materialized view, force its ON
+ * SELECT rule to be sorted before the view itself --- this
+ * ensures that any dependencies for the rule affect the table's
+ * positioning. Other rules are forced to appear after their
+ * table.
+ */
+ if ((ruleinfo[i].ruletable->relkind == RELKIND_VIEW ||
+ ruleinfo[i].ruletable->relkind == RELKIND_MATVIEW) &&
+ ruleinfo[i].ev_type == '1' && ruleinfo[i].is_instead)
+ {
+ addObjectDependency(&ruleinfo[i].ruletable->dobj,
+ ruleinfo[i].dobj.dumpId);
+ /* We'll merge the rule into CREATE VIEW, if possible */
+ ruleinfo[i].separate = false;
+ }
+ else
+ {
+ addObjectDependency(&ruleinfo[i].dobj,
+ ruleinfo[i].ruletable->dobj.dumpId);
+ ruleinfo[i].separate = true;
+ }
+ }
+ else
+ ruleinfo[i].separate = true;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return ruleinfo;
+}
+
+/*
+ * getTriggers
+ * get information about every trigger on a dumpable table
+ *
+ * Note: trigger data is not returned directly to the caller, but it
+ * does get entered into the DumpableObject tables.
+ */
+void
+getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ TriggerInfo *tginfo;
+ int i_tableoid,
+ i_oid,
+ i_tgrelid,
+ i_tgname,
+ i_tgfname,
+ i_tgtype,
+ i_tgnargs,
+ i_tgargs,
+ i_tgisconstraint,
+ i_tgconstrname,
+ i_tgconstrrelid,
+ i_tgconstrrelname,
+ i_tgenabled,
+ i_tgispartition,
+ i_tgdeferrable,
+ i_tginitdeferred,
+ i_tgdef;
+
+ /*
+ * We want to perform just one query against pg_trigger. However, we
+ * mustn't try to select every row of the catalog and then sort it out on
+ * the client side, because some of the server-side functions we need
+ * would be unsafe to apply to tables we don't have lock on. Hence, we
+ * build an array of the OIDs of tables we care about (and now have lock
+ * on!), and use a WHERE clause to constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ if (!tbinfo->hastriggers ||
+ !(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+ }
+ appendPQExpBufferChar(tbloids, '}');
+
+ if (fout->remoteVersion >= 150000)
+ {
+ /*
+ * NB: think not to use pretty=true in pg_get_triggerdef. It could
+ * result in non-forward-compatible dumps of WHEN clauses due to
+ * under-parenthesization.
+ *
+ * NB: We need to see partition triggers in case the tgenabled flag
+ * has been changed from the parent.
+ */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, t.tableoid, t.oid, "
+ "t.tgparentid <> 0 AS tgispartition\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "LEFT JOIN pg_catalog.pg_trigger u ON (u.oid = t.tgparentid) "
+ "WHERE ((NOT t.tgisinternal AND t.tgparentid = 0) "
+ "OR t.tgenabled != u.tgenabled) "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+ else if (fout->remoteVersion >= 130000)
+ {
+ /*
+ * NB: think not to use pretty=true in pg_get_triggerdef. It could
+ * result in non-forward-compatible dumps of WHEN clauses due to
+ * under-parenthesization.
+ *
+ * NB: We need to see tgisinternal triggers in partitions, in case the
+ * tgenabled flag has been changed from the parent.
+ */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, t.tableoid, t.oid, t.tgisinternal as tgispartition\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "LEFT JOIN pg_catalog.pg_trigger u ON (u.oid = t.tgparentid) "
+ "WHERE (NOT t.tgisinternal OR t.tgenabled != u.tgenabled) "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+ else if (fout->remoteVersion >= 110000)
+ {
+ /*
+ * NB: We need to see tgisinternal triggers in partitions, in case the
+ * tgenabled flag has been changed from the parent. No tgparentid in
+ * version 11-12, so we have to match them via pg_depend.
+ *
+ * See above about pretty=true in pg_get_triggerdef.
+ */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, t.tableoid, t.oid, t.tgisinternal as tgispartition "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "LEFT JOIN pg_catalog.pg_depend AS d ON "
+ " d.classid = 'pg_catalog.pg_trigger'::pg_catalog.regclass AND "
+ " d.refclassid = 'pg_catalog.pg_trigger'::pg_catalog.regclass AND "
+ " d.objid = t.oid "
+ "LEFT JOIN pg_catalog.pg_trigger AS pt ON pt.oid = refobjid "
+ "WHERE (NOT t.tgisinternal OR t.tgenabled != pt.tgenabled) "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+ else
+ {
+ /* See above about pretty=true in pg_get_triggerdef */
+ appendPQExpBuffer(query,
+ "SELECT t.tgrelid, t.tgname, "
+ "t.tgfoid::pg_catalog.regproc AS tgfname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, "
+ "t.tgenabled, false as tgispartition, "
+ "t.tableoid, t.oid "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_trigger t ON (src.tbloid = t.tgrelid) "
+ "WHERE NOT tgisinternal "
+ "ORDER BY t.tgrelid, t.tgname",
+ tbloids->data);
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_tgrelid = PQfnumber(res, "tgrelid");
+ i_tgname = PQfnumber(res, "tgname");
+ i_tgfname = PQfnumber(res, "tgfname");
+ i_tgtype = PQfnumber(res, "tgtype");
+ i_tgnargs = PQfnumber(res, "tgnargs");
+ i_tgargs = PQfnumber(res, "tgargs");
+ i_tgisconstraint = PQfnumber(res, "tgisconstraint");
+ i_tgconstrname = PQfnumber(res, "tgconstrname");
+ i_tgconstrrelid = PQfnumber(res, "tgconstrrelid");
+ i_tgconstrrelname = PQfnumber(res, "tgconstrrelname");
+ i_tgenabled = PQfnumber(res, "tgenabled");
+ i_tgispartition = PQfnumber(res, "tgispartition");
+ i_tgdeferrable = PQfnumber(res, "tgdeferrable");
+ i_tginitdeferred = PQfnumber(res, "tginitdeferred");
+ i_tgdef = PQfnumber(res, "tgdef");
+
+ tginfo = (TriggerInfo *) pg_malloc(ntups * sizeof(TriggerInfo));
+
+ /*
+ * Outer loop iterates once per table, not once per row. Incrementing of
+ * j is handled by the inner loop.
+ */
+ curtblindx = -1;
+ for (int j = 0; j < ntups;)
+ {
+ Oid tgrelid = atooid(PQgetvalue(res, j, i_tgrelid));
+ TableInfo *tbinfo = NULL;
+ int numtrigs;
+
+ /* Count rows for this table */
+ for (numtrigs = 1; numtrigs < ntups - j; numtrigs++)
+ if (atooid(PQgetvalue(res, j + numtrigs, i_tgrelid)) != tgrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == tgrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", tgrelid);
+
+ /* Save data for this table */
+ tbinfo->triggers = tginfo + j;
+ tbinfo->numTriggers = numtrigs;
+
+ for (int c = 0; c < numtrigs; c++, j++)
+ {
+ tginfo[j].dobj.objType = DO_TRIGGER;
+ tginfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
+ tginfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&tginfo[j].dobj);
+ tginfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_tgname));
+ tginfo[j].dobj.namespace = tbinfo->dobj.namespace;
+ tginfo[j].tgtable = tbinfo;
+ tginfo[j].tgenabled = *(PQgetvalue(res, j, i_tgenabled));
+ tginfo[j].tgispartition = *(PQgetvalue(res, j, i_tgispartition)) == 't';
+ if (i_tgdef >= 0)
+ {
+ tginfo[j].tgdef = pg_strdup(PQgetvalue(res, j, i_tgdef));
+
+ /* remaining fields are not valid if we have tgdef */
+ tginfo[j].tgfname = NULL;
+ tginfo[j].tgtype = 0;
+ tginfo[j].tgnargs = 0;
+ tginfo[j].tgargs = NULL;
+ tginfo[j].tgisconstraint = false;
+ tginfo[j].tgdeferrable = false;
+ tginfo[j].tginitdeferred = false;
+ tginfo[j].tgconstrname = NULL;
+ tginfo[j].tgconstrrelid = InvalidOid;
+ tginfo[j].tgconstrrelname = NULL;
+ }
+ else
+ {
+ tginfo[j].tgdef = NULL;
+
+ tginfo[j].tgfname = pg_strdup(PQgetvalue(res, j, i_tgfname));
+ tginfo[j].tgtype = atoi(PQgetvalue(res, j, i_tgtype));
+ tginfo[j].tgnargs = atoi(PQgetvalue(res, j, i_tgnargs));
+ tginfo[j].tgargs = pg_strdup(PQgetvalue(res, j, i_tgargs));
+ tginfo[j].tgisconstraint = *(PQgetvalue(res, j, i_tgisconstraint)) == 't';
+ tginfo[j].tgdeferrable = *(PQgetvalue(res, j, i_tgdeferrable)) == 't';
+ tginfo[j].tginitdeferred = *(PQgetvalue(res, j, i_tginitdeferred)) == 't';
+
+ if (tginfo[j].tgisconstraint)
+ {
+ tginfo[j].tgconstrname = pg_strdup(PQgetvalue(res, j, i_tgconstrname));
+ tginfo[j].tgconstrrelid = atooid(PQgetvalue(res, j, i_tgconstrrelid));
+ if (OidIsValid(tginfo[j].tgconstrrelid))
+ {
+ if (PQgetisnull(res, j, i_tgconstrrelname))
+ pg_fatal("query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)",
+ tginfo[j].dobj.name,
+ tbinfo->dobj.name,
+ tginfo[j].tgconstrrelid);
+ tginfo[j].tgconstrrelname = pg_strdup(PQgetvalue(res, j, i_tgconstrrelname));
+ }
+ else
+ tginfo[j].tgconstrrelname = NULL;
+ }
+ else
+ {
+ tginfo[j].tgconstrname = NULL;
+ tginfo[j].tgconstrrelid = InvalidOid;
+ tginfo[j].tgconstrrelname = NULL;
+ }
+ }
+ }
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tbloids);
+}
+
+/*
+ * getEventTriggers
+ * get information about event triggers
+ */
+EventTriggerInfo *
+getEventTriggers(Archive *fout, int *numEventTriggers)
+{
+ int i;
+ PQExpBuffer query;
+ PGresult *res;
+ EventTriggerInfo *evtinfo;
+ int i_tableoid,
+ i_oid,
+ i_evtname,
+ i_evtevent,
+ i_evtowner,
+ i_evttags,
+ i_evtfname,
+ i_evtenabled;
+ int ntups;
+
+ /* Before 9.3, there are no event triggers */
+ if (fout->remoteVersion < 90300)
+ {
+ *numEventTriggers = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query,
+ "SELECT e.tableoid, e.oid, evtname, evtenabled, "
+ "evtevent, evtowner, "
+ "array_to_string(array("
+ "select quote_literal(x) "
+ " from unnest(evttags) as t(x)), ', ') as evttags, "
+ "e.evtfoid::regproc as evtfname "
+ "FROM pg_event_trigger e "
+ "ORDER BY e.oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numEventTriggers = ntups;
+
+ evtinfo = (EventTriggerInfo *) pg_malloc(ntups * sizeof(EventTriggerInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_evtname = PQfnumber(res, "evtname");
+ i_evtevent = PQfnumber(res, "evtevent");
+ i_evtowner = PQfnumber(res, "evtowner");
+ i_evttags = PQfnumber(res, "evttags");
+ i_evtfname = PQfnumber(res, "evtfname");
+ i_evtenabled = PQfnumber(res, "evtenabled");
+
+ for (i = 0; i < ntups; i++)
+ {
+ evtinfo[i].dobj.objType = DO_EVENT_TRIGGER;
+ evtinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ evtinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&evtinfo[i].dobj);
+ evtinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_evtname));
+ evtinfo[i].evtname = pg_strdup(PQgetvalue(res, i, i_evtname));
+ evtinfo[i].evtevent = pg_strdup(PQgetvalue(res, i, i_evtevent));
+ evtinfo[i].evtowner = getRoleName(PQgetvalue(res, i, i_evtowner));
+ evtinfo[i].evttags = pg_strdup(PQgetvalue(res, i, i_evttags));
+ evtinfo[i].evtfname = pg_strdup(PQgetvalue(res, i, i_evtfname));
+ evtinfo[i].evtenabled = *(PQgetvalue(res, i, i_evtenabled));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(evtinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return evtinfo;
+}
+
+/*
+ * getProcLangs
+ * get basic information about every procedural language in the system
+ *
+ * numProcLangs is set to the number of langs read in
+ *
+ * NB: this must run after getFuncs() because we assume we can do
+ * findFuncByOid().
+ */
+ProcLangInfo *
+getProcLangs(Archive *fout, int *numProcLangs)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ ProcLangInfo *planginfo;
+ int i_tableoid;
+ int i_oid;
+ int i_lanname;
+ int i_lanpltrusted;
+ int i_lanplcallfoid;
+ int i_laninline;
+ int i_lanvalidator;
+ int i_lanacl;
+ int i_acldefault;
+ int i_lanowner;
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "lanname, lanpltrusted, lanplcallfoid, "
+ "laninline, lanvalidator, "
+ "lanacl, "
+ "acldefault('l', lanowner) AS acldefault, "
+ "lanowner "
+ "FROM pg_language "
+ "WHERE lanispl "
+ "ORDER BY oid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numProcLangs = ntups;
+
+ planginfo = (ProcLangInfo *) pg_malloc(ntups * sizeof(ProcLangInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_lanname = PQfnumber(res, "lanname");
+ i_lanpltrusted = PQfnumber(res, "lanpltrusted");
+ i_lanplcallfoid = PQfnumber(res, "lanplcallfoid");
+ i_laninline = PQfnumber(res, "laninline");
+ i_lanvalidator = PQfnumber(res, "lanvalidator");
+ i_lanacl = PQfnumber(res, "lanacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_lanowner = PQfnumber(res, "lanowner");
+
+ for (i = 0; i < ntups; i++)
+ {
+ planginfo[i].dobj.objType = DO_PROCLANG;
+ planginfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ planginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&planginfo[i].dobj);
+
+ planginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_lanname));
+ planginfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_lanacl));
+ planginfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ planginfo[i].dacl.privtype = 0;
+ planginfo[i].dacl.initprivs = NULL;
+ planginfo[i].lanpltrusted = *(PQgetvalue(res, i, i_lanpltrusted)) == 't';
+ planginfo[i].lanplcallfoid = atooid(PQgetvalue(res, i, i_lanplcallfoid));
+ planginfo[i].laninline = atooid(PQgetvalue(res, i, i_laninline));
+ planginfo[i].lanvalidator = atooid(PQgetvalue(res, i, i_lanvalidator));
+ planginfo[i].lanowner = getRoleName(PQgetvalue(res, i, i_lanowner));
+
+ /* Decide whether we want to dump it */
+ selectDumpableProcLang(&(planginfo[i]), fout);
+
+ /* Mark whether language has an ACL */
+ if (!PQgetisnull(res, i, i_lanacl))
+ planginfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return planginfo;
+}
+
+/*
+ * getCasts
+ * get basic information about most casts in the system
+ *
+ * numCasts is set to the number of casts read in
+ *
+ * Skip casts from a range to its multirange, since we'll create those
+ * automatically.
+ */
+CastInfo *
+getCasts(Archive *fout, int *numCasts)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query = createPQExpBuffer();
+ CastInfo *castinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_castsource;
+ int i_casttarget;
+ int i_castfunc;
+ int i_castcontext;
+ int i_castmethod;
+
+ if (fout->remoteVersion >= 140000)
+ {
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "castsource, casttarget, castfunc, castcontext, "
+ "castmethod "
+ "FROM pg_cast c "
+ "WHERE NOT EXISTS ( "
+ "SELECT 1 FROM pg_range r "
+ "WHERE c.castsource = r.rngtypid "
+ "AND c.casttarget = r.rngmultitypid "
+ ") "
+ "ORDER BY 3,4");
+ }
+ else
+ {
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "castsource, casttarget, castfunc, castcontext, "
+ "castmethod "
+ "FROM pg_cast ORDER BY 3,4");
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numCasts = ntups;
+
+ castinfo = (CastInfo *) pg_malloc(ntups * sizeof(CastInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_castsource = PQfnumber(res, "castsource");
+ i_casttarget = PQfnumber(res, "casttarget");
+ i_castfunc = PQfnumber(res, "castfunc");
+ i_castcontext = PQfnumber(res, "castcontext");
+ i_castmethod = PQfnumber(res, "castmethod");
+
+ for (i = 0; i < ntups; i++)
+ {
+ PQExpBufferData namebuf;
+ TypeInfo *sTypeInfo;
+ TypeInfo *tTypeInfo;
+
+ castinfo[i].dobj.objType = DO_CAST;
+ castinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ castinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&castinfo[i].dobj);
+ castinfo[i].castsource = atooid(PQgetvalue(res, i, i_castsource));
+ castinfo[i].casttarget = atooid(PQgetvalue(res, i, i_casttarget));
+ castinfo[i].castfunc = atooid(PQgetvalue(res, i, i_castfunc));
+ castinfo[i].castcontext = *(PQgetvalue(res, i, i_castcontext));
+ castinfo[i].castmethod = *(PQgetvalue(res, i, i_castmethod));
+
+ /*
+ * Try to name cast as concatenation of typnames. This is only used
+ * for purposes of sorting. If we fail to find either type, the name
+ * will be an empty string.
+ */
+ initPQExpBuffer(&namebuf);
+ sTypeInfo = findTypeByOid(castinfo[i].castsource);
+ tTypeInfo = findTypeByOid(castinfo[i].casttarget);
+ if (sTypeInfo && tTypeInfo)
+ appendPQExpBuffer(&namebuf, "%s %s",
+ sTypeInfo->dobj.name, tTypeInfo->dobj.name);
+ castinfo[i].dobj.name = namebuf.data;
+
+ /* Decide whether we want to dump it */
+ selectDumpableCast(&(castinfo[i]), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return castinfo;
+}
+
+static char *
+get_language_name(Archive *fout, Oid langid)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ char *lanname;
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "SELECT lanname FROM pg_language WHERE oid = %u", langid);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ lanname = pg_strdup(fmtId(PQgetvalue(res, 0, 0)));
+ destroyPQExpBuffer(query);
+ PQclear(res);
+
+ return lanname;
+}
+
+/*
+ * getTransforms
+ * get basic information about every transform in the system
+ *
+ * numTransforms is set to the number of transforms read in
+ */
+TransformInfo *
+getTransforms(Archive *fout, int *numTransforms)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TransformInfo *transforminfo;
+ int i_tableoid;
+ int i_oid;
+ int i_trftype;
+ int i_trflang;
+ int i_trffromsql;
+ int i_trftosql;
+
+ /* Transforms didn't exist pre-9.5 */
+ if (fout->remoteVersion < 90500)
+ {
+ *numTransforms = 0;
+ return NULL;
+ }
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, "
+ "trftype, trflang, trffromsql::oid, trftosql::oid "
+ "FROM pg_transform "
+ "ORDER BY 3,4");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ *numTransforms = ntups;
+
+ transforminfo = (TransformInfo *) pg_malloc(ntups * sizeof(TransformInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_trftype = PQfnumber(res, "trftype");
+ i_trflang = PQfnumber(res, "trflang");
+ i_trffromsql = PQfnumber(res, "trffromsql");
+ i_trftosql = PQfnumber(res, "trftosql");
+
+ for (i = 0; i < ntups; i++)
+ {
+ PQExpBufferData namebuf;
+ TypeInfo *typeInfo;
+ char *lanname;
+
+ transforminfo[i].dobj.objType = DO_TRANSFORM;
+ transforminfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ transforminfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&transforminfo[i].dobj);
+ transforminfo[i].trftype = atooid(PQgetvalue(res, i, i_trftype));
+ transforminfo[i].trflang = atooid(PQgetvalue(res, i, i_trflang));
+ transforminfo[i].trffromsql = atooid(PQgetvalue(res, i, i_trffromsql));
+ transforminfo[i].trftosql = atooid(PQgetvalue(res, i, i_trftosql));
+
+ /*
+ * Try to name transform as concatenation of type and language name.
+ * This is only used for purposes of sorting. If we fail to find
+ * either, the name will be an empty string.
+ */
+ initPQExpBuffer(&namebuf);
+ typeInfo = findTypeByOid(transforminfo[i].trftype);
+ lanname = get_language_name(fout, transforminfo[i].trflang);
+ if (typeInfo && lanname)
+ appendPQExpBuffer(&namebuf, "%s %s",
+ typeInfo->dobj.name, lanname);
+ transforminfo[i].dobj.name = namebuf.data;
+ free(lanname);
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(transforminfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return transforminfo;
+}
+
+/*
+ * getTableAttrs -
+ * for each interesting table, read info about its attributes
+ * (names, types, default values, CHECK constraints, etc)
+ *
+ * modifies tblinfo
+ */
+void
+getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer tbloids = createPQExpBuffer();
+ PQExpBuffer checkoids = createPQExpBuffer();
+ PGresult *res;
+ int ntups;
+ int curtblindx;
+ int i_attrelid;
+ int i_attnum;
+ int i_attname;
+ int i_atttypname;
+ int i_attstattarget;
+ int i_attstorage;
+ int i_typstorage;
+ int i_attidentity;
+ int i_attgenerated;
+ int i_attisdropped;
+ int i_attlen;
+ int i_attalign;
+ int i_attislocal;
+ int i_attnotnull;
+ int i_attoptions;
+ int i_attcollation;
+ int i_attcompression;
+ int i_attfdwoptions;
+ int i_attmissingval;
+ int i_atthasdef;
+
+ /*
+ * We want to perform just one query against pg_attribute, and then just
+ * one against pg_attrdef (for DEFAULTs) and one against pg_constraint
+ * (for CHECK constraints). However, we mustn't try to select every row
+ * of those catalogs and then sort it out on the client side, because some
+ * of the server-side functions we need would be unsafe to apply to tables
+ * we don't have lock on. Hence, we build an array of the OIDs of tables
+ * we care about (and now have lock on!), and use a WHERE clause to
+ * constrain which rows are selected.
+ */
+ appendPQExpBufferChar(tbloids, '{');
+ appendPQExpBufferChar(checkoids, '{');
+ for (int i = 0; i < numTables; i++)
+ {
+ TableInfo *tbinfo = &tblinfo[i];
+
+ /* Don't bother to collect info for sequences */
+ if (tbinfo->relkind == RELKIND_SEQUENCE)
+ continue;
+
+ /* Don't bother with uninteresting tables, either */
+ if (!tbinfo->interesting)
+ continue;
+
+ /* OK, we need info for this table */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+
+ if (tbinfo->ncheck > 0)
+ {
+ /* Also make a list of the ones with check constraints */
+ if (checkoids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(checkoids, ',');
+ appendPQExpBuffer(checkoids, "%u", tbinfo->dobj.catId.oid);
+ }
+ }
+ appendPQExpBufferChar(tbloids, '}');
+ appendPQExpBufferChar(checkoids, '}');
+
+ /*
+ * Find all the user attributes and their types.
+ *
+ * Since we only want to dump COLLATE clauses for attributes whose
+ * collation is different from their type's default, we use a CASE here to
+ * suppress uninteresting attcollations cheaply.
+ */
+ appendPQExpBufferStr(q,
+ "SELECT\n"
+ "a.attrelid,\n"
+ "a.attnum,\n"
+ "a.attname,\n"
+ "a.attstattarget,\n"
+ "a.attstorage,\n"
+ "t.typstorage,\n"
+ "a.attnotnull,\n"
+ "a.atthasdef,\n"
+ "a.attisdropped,\n"
+ "a.attlen,\n"
+ "a.attalign,\n"
+ "a.attislocal,\n"
+ "pg_catalog.format_type(t.oid, a.atttypmod) AS atttypname,\n"
+ "array_to_string(a.attoptions, ', ') AS attoptions,\n"
+ "CASE WHEN a.attcollation <> t.typcollation "
+ "THEN a.attcollation ELSE 0 END AS attcollation,\n"
+ "pg_catalog.array_to_string(ARRAY("
+ "SELECT pg_catalog.quote_ident(option_name) || "
+ "' ' || pg_catalog.quote_literal(option_value) "
+ "FROM pg_catalog.pg_options_to_table(attfdwoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS attfdwoptions,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(q,
+ "a.attcompression AS attcompression,\n");
+ else
+ appendPQExpBufferStr(q,
+ "'' AS attcompression,\n");
+
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(q,
+ "a.attidentity,\n");
+ else
+ appendPQExpBufferStr(q,
+ "'' AS attidentity,\n");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(q,
+ "CASE WHEN a.atthasmissing AND NOT a.attisdropped "
+ "THEN a.attmissingval ELSE null END AS attmissingval,\n");
+ else
+ appendPQExpBufferStr(q,
+ "NULL AS attmissingval,\n");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(q,
+ "a.attgenerated\n");
+ else
+ appendPQExpBufferStr(q,
+ "'' AS attgenerated\n");
+
+ /* need left join to pg_type to not fail on dropped columns ... */
+ appendPQExpBuffer(q,
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_attribute a ON (src.tbloid = a.attrelid) "
+ "LEFT JOIN pg_catalog.pg_type t "
+ "ON (a.atttypid = t.oid)\n"
+ "WHERE a.attnum > 0::pg_catalog.int2\n"
+ "ORDER BY a.attrelid, a.attnum",
+ tbloids->data);
+
+ res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_attrelid = PQfnumber(res, "attrelid");
+ i_attnum = PQfnumber(res, "attnum");
+ i_attname = PQfnumber(res, "attname");
+ i_atttypname = PQfnumber(res, "atttypname");
+ i_attstattarget = PQfnumber(res, "attstattarget");
+ i_attstorage = PQfnumber(res, "attstorage");
+ i_typstorage = PQfnumber(res, "typstorage");
+ i_attidentity = PQfnumber(res, "attidentity");
+ i_attgenerated = PQfnumber(res, "attgenerated");
+ i_attisdropped = PQfnumber(res, "attisdropped");
+ i_attlen = PQfnumber(res, "attlen");
+ i_attalign = PQfnumber(res, "attalign");
+ i_attislocal = PQfnumber(res, "attislocal");
+ i_attnotnull = PQfnumber(res, "attnotnull");
+ i_attoptions = PQfnumber(res, "attoptions");
+ i_attcollation = PQfnumber(res, "attcollation");
+ i_attcompression = PQfnumber(res, "attcompression");
+ i_attfdwoptions = PQfnumber(res, "attfdwoptions");
+ i_attmissingval = PQfnumber(res, "attmissingval");
+ i_atthasdef = PQfnumber(res, "atthasdef");
+
+ /* Within the next loop, we'll accumulate OIDs of tables with defaults */
+ resetPQExpBuffer(tbloids);
+ appendPQExpBufferChar(tbloids, '{');
+
+ /*
+ * Outer loop iterates once per table, not once per row. Incrementing of
+ * r is handled by the inner loop.
+ */
+ curtblindx = -1;
+ for (int r = 0; r < ntups;)
+ {
+ Oid attrelid = atooid(PQgetvalue(res, r, i_attrelid));
+ TableInfo *tbinfo = NULL;
+ int numatts;
+ bool hasdefaults;
+
+ /* Count rows for this table */
+ for (numatts = 1; numatts < ntups - r; numatts++)
+ if (atooid(PQgetvalue(res, r + numatts, i_attrelid)) != attrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in OID
+ * order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == attrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", attrelid);
+ /* cross-check that we only got requested tables */
+ if (tbinfo->relkind == RELKIND_SEQUENCE ||
+ !tbinfo->interesting)
+ pg_fatal("unexpected column data for table \"%s\"",
+ tbinfo->dobj.name);
+
+ /* Save data for this table */
+ tbinfo->numatts = numatts;
+ tbinfo->attnames = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->atttypnames = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->attstattarget = (int *) pg_malloc(numatts * sizeof(int));
+ tbinfo->attstorage = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->typstorage = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attidentity = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attgenerated = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attisdropped = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->attlen = (int *) pg_malloc(numatts * sizeof(int));
+ tbinfo->attalign = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attislocal = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->attoptions = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->attcollation = (Oid *) pg_malloc(numatts * sizeof(Oid));
+ tbinfo->attcompression = (char *) pg_malloc(numatts * sizeof(char));
+ tbinfo->attfdwoptions = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->attmissingval = (char **) pg_malloc(numatts * sizeof(char *));
+ tbinfo->notnull = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->inhNotNull = (bool *) pg_malloc(numatts * sizeof(bool));
+ tbinfo->attrdefs = (AttrDefInfo **) pg_malloc(numatts * sizeof(AttrDefInfo *));
+ hasdefaults = false;
+
+ for (int j = 0; j < numatts; j++, r++)
+ {
+ if (j + 1 != atoi(PQgetvalue(res, r, i_attnum)))
+ pg_fatal("invalid column numbering in table \"%s\"",
+ tbinfo->dobj.name);
+ tbinfo->attnames[j] = pg_strdup(PQgetvalue(res, r, i_attname));
+ tbinfo->atttypnames[j] = pg_strdup(PQgetvalue(res, r, i_atttypname));
+ tbinfo->attstattarget[j] = atoi(PQgetvalue(res, r, i_attstattarget));
+ tbinfo->attstorage[j] = *(PQgetvalue(res, r, i_attstorage));
+ tbinfo->typstorage[j] = *(PQgetvalue(res, r, i_typstorage));
+ tbinfo->attidentity[j] = *(PQgetvalue(res, r, i_attidentity));
+ tbinfo->attgenerated[j] = *(PQgetvalue(res, r, i_attgenerated));
+ tbinfo->needs_override = tbinfo->needs_override || (tbinfo->attidentity[j] == ATTRIBUTE_IDENTITY_ALWAYS);
+ tbinfo->attisdropped[j] = (PQgetvalue(res, r, i_attisdropped)[0] == 't');
+ tbinfo->attlen[j] = atoi(PQgetvalue(res, r, i_attlen));
+ tbinfo->attalign[j] = *(PQgetvalue(res, r, i_attalign));
+ tbinfo->attislocal[j] = (PQgetvalue(res, r, i_attislocal)[0] == 't');
+ tbinfo->notnull[j] = (PQgetvalue(res, r, i_attnotnull)[0] == 't');
+ tbinfo->attoptions[j] = pg_strdup(PQgetvalue(res, r, i_attoptions));
+ tbinfo->attcollation[j] = atooid(PQgetvalue(res, r, i_attcollation));
+ tbinfo->attcompression[j] = *(PQgetvalue(res, r, i_attcompression));
+ tbinfo->attfdwoptions[j] = pg_strdup(PQgetvalue(res, r, i_attfdwoptions));
+ tbinfo->attmissingval[j] = pg_strdup(PQgetvalue(res, r, i_attmissingval));
+ tbinfo->attrdefs[j] = NULL; /* fix below */
+ if (PQgetvalue(res, r, i_atthasdef)[0] == 't')
+ hasdefaults = true;
+ /* these flags will be set in flagInhAttrs() */
+ tbinfo->inhNotNull[j] = false;
+ }
+
+ if (hasdefaults)
+ {
+ /* Collect OIDs of interesting tables that have defaults */
+ if (tbloids->len > 1) /* do we have more than the '{'? */
+ appendPQExpBufferChar(tbloids, ',');
+ appendPQExpBuffer(tbloids, "%u", tbinfo->dobj.catId.oid);
+ }
+ }
+
+ PQclear(res);
+
+ /*
+ * Now get info about column defaults. This is skipped for a data-only
+ * dump, as it is only needed for table schemas.
+ */
+ if (!dopt->dataOnly && tbloids->len > 1)
+ {
+ AttrDefInfo *attrdefs;
+ int numDefaults;
+ TableInfo *tbinfo = NULL;
+
+ pg_log_info("finding table default expressions");
+
+ appendPQExpBufferChar(tbloids, '}');
+
+ printfPQExpBuffer(q, "SELECT a.tableoid, a.oid, adrelid, adnum, "
+ "pg_catalog.pg_get_expr(adbin, adrelid) AS adsrc\n"
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_attrdef a ON (src.tbloid = a.adrelid)\n"
+ "ORDER BY a.adrelid, a.adnum",
+ tbloids->data);
+
+ res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
+
+ numDefaults = PQntuples(res);
+ attrdefs = (AttrDefInfo *) pg_malloc(numDefaults * sizeof(AttrDefInfo));
+
+ curtblindx = -1;
+ for (int j = 0; j < numDefaults; j++)
+ {
+ Oid adtableoid = atooid(PQgetvalue(res, j, 0));
+ Oid adoid = atooid(PQgetvalue(res, j, 1));
+ Oid adrelid = atooid(PQgetvalue(res, j, 2));
+ int adnum = atoi(PQgetvalue(res, j, 3));
+ char *adsrc = PQgetvalue(res, j, 4);
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in
+ * OID order.
+ */
+ if (tbinfo == NULL || tbinfo->dobj.catId.oid != adrelid)
+ {
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == adrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", adrelid);
+ }
+
+ if (adnum <= 0 || adnum > tbinfo->numatts)
+ pg_fatal("invalid adnum value %d for table \"%s\"",
+ adnum, tbinfo->dobj.name);
+
+ /*
+ * dropped columns shouldn't have defaults, but just in case,
+ * ignore 'em
+ */
+ if (tbinfo->attisdropped[adnum - 1])
+ continue;
+
+ attrdefs[j].dobj.objType = DO_ATTRDEF;
+ attrdefs[j].dobj.catId.tableoid = adtableoid;
+ attrdefs[j].dobj.catId.oid = adoid;
+ AssignDumpId(&attrdefs[j].dobj);
+ attrdefs[j].adtable = tbinfo;
+ attrdefs[j].adnum = adnum;
+ attrdefs[j].adef_expr = pg_strdup(adsrc);
+
+ attrdefs[j].dobj.name = pg_strdup(tbinfo->dobj.name);
+ attrdefs[j].dobj.namespace = tbinfo->dobj.namespace;
+
+ attrdefs[j].dobj.dump = tbinfo->dobj.dump;
+
+ /*
+ * Figure out whether the default/generation expression should be
+ * dumped as part of the main CREATE TABLE (or similar) command or
+ * as a separate ALTER TABLE (or similar) command. The preference
+ * is to put it into the CREATE command, but in some cases that's
+ * not possible.
+ */
+ if (tbinfo->attgenerated[adnum - 1])
+ {
+ /*
+ * Column generation expressions cannot be dumped separately,
+ * because there is no syntax for it. By setting separate to
+ * false here we prevent the "default" from being processed as
+ * its own dumpable object. Later, flagInhAttrs() will mark
+ * it as not to be dumped at all, if possible (that is, if it
+ * can be inherited from a parent).
+ */
+ attrdefs[j].separate = false;
+ }
+ else if (tbinfo->relkind == RELKIND_VIEW)
+ {
+ /*
+ * Defaults on a VIEW must always be dumped as separate ALTER
+ * TABLE commands.
+ */
+ attrdefs[j].separate = true;
+ }
+ else if (!shouldPrintColumn(dopt, tbinfo, adnum - 1))
+ {
+ /* column will be suppressed, print default separately */
+ attrdefs[j].separate = true;
+ }
+ else
+ {
+ attrdefs[j].separate = false;
+ }
+
+ if (!attrdefs[j].separate)
+ {
+ /*
+ * Mark the default as needing to appear before the table, so
+ * that any dependencies it has must be emitted before the
+ * CREATE TABLE. If this is not possible, we'll change to
+ * "separate" mode while sorting dependencies.
+ */
+ addObjectDependency(&tbinfo->dobj,
+ attrdefs[j].dobj.dumpId);
+ }
+
+ tbinfo->attrdefs[adnum - 1] = &attrdefs[j];
+ }
+
+ PQclear(res);
+ }
+
+ /*
+ * Get info about table CHECK constraints. This is skipped for a
+ * data-only dump, as it is only needed for table schemas.
+ */
+ if (!dopt->dataOnly && checkoids->len > 2)
+ {
+ ConstraintInfo *constrs;
+ int numConstrs;
+ int i_tableoid;
+ int i_oid;
+ int i_conrelid;
+ int i_conname;
+ int i_consrc;
+ int i_conislocal;
+ int i_convalidated;
+
+ pg_log_info("finding table check constraints");
+
+ resetPQExpBuffer(q);
+ appendPQExpBuffer(q,
+ "SELECT c.tableoid, c.oid, conrelid, conname, "
+ "pg_catalog.pg_get_constraintdef(c.oid) AS consrc, "
+ "conislocal, convalidated "
+ "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n"
+ "JOIN pg_catalog.pg_constraint c ON (src.tbloid = c.conrelid)\n"
+ "WHERE contype = 'c' "
+ "ORDER BY c.conrelid, c.conname",
+ checkoids->data);
+
+ res = ExecuteSqlQuery(fout, q->data, PGRES_TUPLES_OK);
+
+ numConstrs = PQntuples(res);
+ constrs = (ConstraintInfo *) pg_malloc(numConstrs * sizeof(ConstraintInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_conrelid = PQfnumber(res, "conrelid");
+ i_conname = PQfnumber(res, "conname");
+ i_consrc = PQfnumber(res, "consrc");
+ i_conislocal = PQfnumber(res, "conislocal");
+ i_convalidated = PQfnumber(res, "convalidated");
+
+ /* As above, this loop iterates once per table, not once per row */
+ curtblindx = -1;
+ for (int j = 0; j < numConstrs;)
+ {
+ Oid conrelid = atooid(PQgetvalue(res, j, i_conrelid));
+ TableInfo *tbinfo = NULL;
+ int numcons;
+
+ /* Count rows for this table */
+ for (numcons = 1; numcons < numConstrs - j; numcons++)
+ if (atooid(PQgetvalue(res, j + numcons, i_conrelid)) != conrelid)
+ break;
+
+ /*
+ * Locate the associated TableInfo; we rely on tblinfo[] being in
+ * OID order.
+ */
+ while (++curtblindx < numTables)
+ {
+ tbinfo = &tblinfo[curtblindx];
+ if (tbinfo->dobj.catId.oid == conrelid)
+ break;
+ }
+ if (curtblindx >= numTables)
+ pg_fatal("unrecognized table OID %u", conrelid);
+
+ if (numcons != tbinfo->ncheck)
+ {
+ pg_log_error(ngettext("expected %d check constraint on table \"%s\" but found %d",
+ "expected %d check constraints on table \"%s\" but found %d",
+ tbinfo->ncheck),
+ tbinfo->ncheck, tbinfo->dobj.name, numcons);
+ pg_log_error_hint("The system catalogs might be corrupted.");
+ exit_nicely(1);
+ }
+
+ tbinfo->checkexprs = constrs + j;
+
+ for (int c = 0; c < numcons; c++, j++)
+ {
+ bool validated = PQgetvalue(res, j, i_convalidated)[0] == 't';
+
+ constrs[j].dobj.objType = DO_CONSTRAINT;
+ constrs[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
+ constrs[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
+ AssignDumpId(&constrs[j].dobj);
+ constrs[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
+ constrs[j].dobj.namespace = tbinfo->dobj.namespace;
+ constrs[j].contable = tbinfo;
+ constrs[j].condomain = NULL;
+ constrs[j].contype = 'c';
+ constrs[j].condef = pg_strdup(PQgetvalue(res, j, i_consrc));
+ constrs[j].confrelid = InvalidOid;
+ constrs[j].conindex = 0;
+ constrs[j].condeferrable = false;
+ constrs[j].condeferred = false;
+ constrs[j].conislocal = (PQgetvalue(res, j, i_conislocal)[0] == 't');
+
+ /*
+ * An unvalidated constraint needs to be dumped separately, so
+ * that potentially-violating existing data is loaded before
+ * the constraint.
+ */
+ constrs[j].separate = !validated;
+
+ constrs[j].dobj.dump = tbinfo->dobj.dump;
+
+ /*
+ * Mark the constraint as needing to appear before the table
+ * --- this is so that any other dependencies of the
+ * constraint will be emitted before we try to create the
+ * table. If the constraint is to be dumped separately, it
+ * will be dumped after data is loaded anyway, so don't do it.
+ * (There's an automatic dependency in the opposite direction
+ * anyway, so don't need to add one manually here.)
+ */
+ if (!constrs[j].separate)
+ addObjectDependency(&tbinfo->dobj,
+ constrs[j].dobj.dumpId);
+
+ /*
+ * We will detect later whether the constraint must be split
+ * out from the table definition.
+ */
+ }
+ }
+
+ PQclear(res);
+ }
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(tbloids);
+ destroyPQExpBuffer(checkoids);
+}
+
+/*
+ * Test whether a column should be printed as part of table's CREATE TABLE.
+ * Column number is zero-based.
+ *
+ * Normally this is always true, but it's false for dropped columns, as well
+ * as those that were inherited without any local definition. (If we print
+ * such a column it will mistakenly get pg_attribute.attislocal set to true.)
+ * For partitions, it's always true, because we want the partitions to be
+ * created independently and ATTACH PARTITION used afterwards.
+ *
+ * In binary_upgrade mode, we must print all columns and fix the attislocal/
+ * attisdropped state later, so as to keep control of the physical column
+ * order.
+ *
+ * This function exists because there are scattered nonobvious places that
+ * must be kept in sync with this decision.
+ */
+bool
+shouldPrintColumn(const DumpOptions *dopt, const TableInfo *tbinfo, int colno)
+{
+ if (dopt->binary_upgrade)
+ return true;
+ if (tbinfo->attisdropped[colno])
+ return false;
+ return (tbinfo->attislocal[colno] || tbinfo->ispartition);
+}
+
+
+/*
+ * getTSParsers:
+ * read all text search parsers in the system catalogs and return them
+ * in the TSParserInfo* structure
+ *
+ * numTSParsers is set to the number of parsers read in
+ */
+TSParserInfo *
+getTSParsers(Archive *fout, int *numTSParsers)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSParserInfo *prsinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_prsname;
+ int i_prsnamespace;
+ int i_prsstart;
+ int i_prstoken;
+ int i_prsend;
+ int i_prsheadline;
+ int i_prslextype;
+
+ query = createPQExpBuffer();
+
+ /*
+ * find all text search objects, including builtin ones; we filter out
+ * system-defined objects at dump-out time.
+ */
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, prsname, prsnamespace, "
+ "prsstart::oid, prstoken::oid, "
+ "prsend::oid, prsheadline::oid, prslextype::oid "
+ "FROM pg_ts_parser");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSParsers = ntups;
+
+ prsinfo = (TSParserInfo *) pg_malloc(ntups * sizeof(TSParserInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_prsname = PQfnumber(res, "prsname");
+ i_prsnamespace = PQfnumber(res, "prsnamespace");
+ i_prsstart = PQfnumber(res, "prsstart");
+ i_prstoken = PQfnumber(res, "prstoken");
+ i_prsend = PQfnumber(res, "prsend");
+ i_prsheadline = PQfnumber(res, "prsheadline");
+ i_prslextype = PQfnumber(res, "prslextype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ prsinfo[i].dobj.objType = DO_TSPARSER;
+ prsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ prsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&prsinfo[i].dobj);
+ prsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_prsname));
+ prsinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_prsnamespace)));
+ prsinfo[i].prsstart = atooid(PQgetvalue(res, i, i_prsstart));
+ prsinfo[i].prstoken = atooid(PQgetvalue(res, i, i_prstoken));
+ prsinfo[i].prsend = atooid(PQgetvalue(res, i, i_prsend));
+ prsinfo[i].prsheadline = atooid(PQgetvalue(res, i, i_prsheadline));
+ prsinfo[i].prslextype = atooid(PQgetvalue(res, i, i_prslextype));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(prsinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return prsinfo;
+}
+
+/*
+ * getTSDictionaries:
+ * read all text search dictionaries in the system catalogs and return them
+ * in the TSDictInfo* structure
+ *
+ * numTSDicts is set to the number of dictionaries read in
+ */
+TSDictInfo *
+getTSDictionaries(Archive *fout, int *numTSDicts)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSDictInfo *dictinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_dictname;
+ int i_dictnamespace;
+ int i_dictowner;
+ int i_dicttemplate;
+ int i_dictinitoption;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, dictname, "
+ "dictnamespace, dictowner, "
+ "dicttemplate, dictinitoption "
+ "FROM pg_ts_dict");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSDicts = ntups;
+
+ dictinfo = (TSDictInfo *) pg_malloc(ntups * sizeof(TSDictInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_dictname = PQfnumber(res, "dictname");
+ i_dictnamespace = PQfnumber(res, "dictnamespace");
+ i_dictowner = PQfnumber(res, "dictowner");
+ i_dictinitoption = PQfnumber(res, "dictinitoption");
+ i_dicttemplate = PQfnumber(res, "dicttemplate");
+
+ for (i = 0; i < ntups; i++)
+ {
+ dictinfo[i].dobj.objType = DO_TSDICT;
+ dictinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ dictinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&dictinfo[i].dobj);
+ dictinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_dictname));
+ dictinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_dictnamespace)));
+ dictinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_dictowner));
+ dictinfo[i].dicttemplate = atooid(PQgetvalue(res, i, i_dicttemplate));
+ if (PQgetisnull(res, i, i_dictinitoption))
+ dictinfo[i].dictinitoption = NULL;
+ else
+ dictinfo[i].dictinitoption = pg_strdup(PQgetvalue(res, i, i_dictinitoption));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(dictinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return dictinfo;
+}
+
+/*
+ * getTSTemplates:
+ * read all text search templates in the system catalogs and return them
+ * in the TSTemplateInfo* structure
+ *
+ * numTSTemplates is set to the number of templates read in
+ */
+TSTemplateInfo *
+getTSTemplates(Archive *fout, int *numTSTemplates)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSTemplateInfo *tmplinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_tmplname;
+ int i_tmplnamespace;
+ int i_tmplinit;
+ int i_tmpllexize;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, tmplname, "
+ "tmplnamespace, tmplinit::oid, tmpllexize::oid "
+ "FROM pg_ts_template");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSTemplates = ntups;
+
+ tmplinfo = (TSTemplateInfo *) pg_malloc(ntups * sizeof(TSTemplateInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_tmplname = PQfnumber(res, "tmplname");
+ i_tmplnamespace = PQfnumber(res, "tmplnamespace");
+ i_tmplinit = PQfnumber(res, "tmplinit");
+ i_tmpllexize = PQfnumber(res, "tmpllexize");
+
+ for (i = 0; i < ntups; i++)
+ {
+ tmplinfo[i].dobj.objType = DO_TSTEMPLATE;
+ tmplinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ tmplinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&tmplinfo[i].dobj);
+ tmplinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_tmplname));
+ tmplinfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_tmplnamespace)));
+ tmplinfo[i].tmplinit = atooid(PQgetvalue(res, i, i_tmplinit));
+ tmplinfo[i].tmpllexize = atooid(PQgetvalue(res, i, i_tmpllexize));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(tmplinfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return tmplinfo;
+}
+
+/*
+ * getTSConfigurations:
+ * read all text search configurations in the system catalogs and return
+ * them in the TSConfigInfo* structure
+ *
+ * numTSConfigs is set to the number of configurations read in
+ */
+TSConfigInfo *
+getTSConfigurations(Archive *fout, int *numTSConfigs)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ TSConfigInfo *cfginfo;
+ int i_tableoid;
+ int i_oid;
+ int i_cfgname;
+ int i_cfgnamespace;
+ int i_cfgowner;
+ int i_cfgparser;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, cfgname, "
+ "cfgnamespace, cfgowner, cfgparser "
+ "FROM pg_ts_config");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numTSConfigs = ntups;
+
+ cfginfo = (TSConfigInfo *) pg_malloc(ntups * sizeof(TSConfigInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_cfgname = PQfnumber(res, "cfgname");
+ i_cfgnamespace = PQfnumber(res, "cfgnamespace");
+ i_cfgowner = PQfnumber(res, "cfgowner");
+ i_cfgparser = PQfnumber(res, "cfgparser");
+
+ for (i = 0; i < ntups; i++)
+ {
+ cfginfo[i].dobj.objType = DO_TSCONFIG;
+ cfginfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ cfginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&cfginfo[i].dobj);
+ cfginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_cfgname));
+ cfginfo[i].dobj.namespace =
+ findNamespace(atooid(PQgetvalue(res, i, i_cfgnamespace)));
+ cfginfo[i].rolname = getRoleName(PQgetvalue(res, i, i_cfgowner));
+ cfginfo[i].cfgparser = atooid(PQgetvalue(res, i, i_cfgparser));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(cfginfo[i].dobj), fout);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return cfginfo;
+}
+
+/*
+ * getForeignDataWrappers:
+ * read all foreign-data wrappers in the system catalogs and return
+ * them in the FdwInfo* structure
+ *
+ * numForeignDataWrappers is set to the number of fdws read in
+ */
+FdwInfo *
+getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ FdwInfo *fdwinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_fdwname;
+ int i_fdwowner;
+ int i_fdwhandler;
+ int i_fdwvalidator;
+ int i_fdwacl;
+ int i_acldefault;
+ int i_fdwoptions;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, fdwname, "
+ "fdwowner, "
+ "fdwhandler::pg_catalog.regproc, "
+ "fdwvalidator::pg_catalog.regproc, "
+ "fdwacl, "
+ "acldefault('F', fdwowner) AS acldefault, "
+ "array_to_string(ARRAY("
+ "SELECT quote_ident(option_name) || ' ' || "
+ "quote_literal(option_value) "
+ "FROM pg_options_to_table(fdwoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS fdwoptions "
+ "FROM pg_foreign_data_wrapper");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numForeignDataWrappers = ntups;
+
+ fdwinfo = (FdwInfo *) pg_malloc(ntups * sizeof(FdwInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_fdwname = PQfnumber(res, "fdwname");
+ i_fdwowner = PQfnumber(res, "fdwowner");
+ i_fdwhandler = PQfnumber(res, "fdwhandler");
+ i_fdwvalidator = PQfnumber(res, "fdwvalidator");
+ i_fdwacl = PQfnumber(res, "fdwacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_fdwoptions = PQfnumber(res, "fdwoptions");
+
+ for (i = 0; i < ntups; i++)
+ {
+ fdwinfo[i].dobj.objType = DO_FDW;
+ fdwinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ fdwinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&fdwinfo[i].dobj);
+ fdwinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_fdwname));
+ fdwinfo[i].dobj.namespace = NULL;
+ fdwinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_fdwacl));
+ fdwinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ fdwinfo[i].dacl.privtype = 0;
+ fdwinfo[i].dacl.initprivs = NULL;
+ fdwinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_fdwowner));
+ fdwinfo[i].fdwhandler = pg_strdup(PQgetvalue(res, i, i_fdwhandler));
+ fdwinfo[i].fdwvalidator = pg_strdup(PQgetvalue(res, i, i_fdwvalidator));
+ fdwinfo[i].fdwoptions = pg_strdup(PQgetvalue(res, i, i_fdwoptions));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(fdwinfo[i].dobj), fout);
+
+ /* Mark whether FDW has an ACL */
+ if (!PQgetisnull(res, i, i_fdwacl))
+ fdwinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return fdwinfo;
+}
+
+/*
+ * getForeignServers:
+ * read all foreign servers in the system catalogs and return
+ * them in the ForeignServerInfo * structure
+ *
+ * numForeignServers is set to the number of servers read in
+ */
+ForeignServerInfo *
+getForeignServers(Archive *fout, int *numForeignServers)
+{
+ PGresult *res;
+ int ntups;
+ int i;
+ PQExpBuffer query;
+ ForeignServerInfo *srvinfo;
+ int i_tableoid;
+ int i_oid;
+ int i_srvname;
+ int i_srvowner;
+ int i_srvfdw;
+ int i_srvtype;
+ int i_srvversion;
+ int i_srvacl;
+ int i_acldefault;
+ int i_srvoptions;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, srvname, "
+ "srvowner, "
+ "srvfdw, srvtype, srvversion, srvacl, "
+ "acldefault('S', srvowner) AS acldefault, "
+ "array_to_string(ARRAY("
+ "SELECT quote_ident(option_name) || ' ' || "
+ "quote_literal(option_value) "
+ "FROM pg_options_to_table(srvoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS srvoptions "
+ "FROM pg_foreign_server");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numForeignServers = ntups;
+
+ srvinfo = (ForeignServerInfo *) pg_malloc(ntups * sizeof(ForeignServerInfo));
+
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_oid = PQfnumber(res, "oid");
+ i_srvname = PQfnumber(res, "srvname");
+ i_srvowner = PQfnumber(res, "srvowner");
+ i_srvfdw = PQfnumber(res, "srvfdw");
+ i_srvtype = PQfnumber(res, "srvtype");
+ i_srvversion = PQfnumber(res, "srvversion");
+ i_srvacl = PQfnumber(res, "srvacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+ i_srvoptions = PQfnumber(res, "srvoptions");
+
+ for (i = 0; i < ntups; i++)
+ {
+ srvinfo[i].dobj.objType = DO_FOREIGN_SERVER;
+ srvinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ srvinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&srvinfo[i].dobj);
+ srvinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_srvname));
+ srvinfo[i].dobj.namespace = NULL;
+ srvinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_srvacl));
+ srvinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ srvinfo[i].dacl.privtype = 0;
+ srvinfo[i].dacl.initprivs = NULL;
+ srvinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_srvowner));
+ srvinfo[i].srvfdw = atooid(PQgetvalue(res, i, i_srvfdw));
+ srvinfo[i].srvtype = pg_strdup(PQgetvalue(res, i, i_srvtype));
+ srvinfo[i].srvversion = pg_strdup(PQgetvalue(res, i, i_srvversion));
+ srvinfo[i].srvoptions = pg_strdup(PQgetvalue(res, i, i_srvoptions));
+
+ /* Decide whether we want to dump it */
+ selectDumpableObject(&(srvinfo[i].dobj), fout);
+
+ /* Servers have user mappings */
+ srvinfo[i].dobj.components |= DUMP_COMPONENT_USERMAP;
+
+ /* Mark whether server has an ACL */
+ if (!PQgetisnull(res, i, i_srvacl))
+ srvinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return srvinfo;
+}
+
+/*
+ * getDefaultACLs:
+ * read all default ACL information in the system catalogs and return
+ * them in the DefaultACLInfo structure
+ *
+ * numDefaultACLs is set to the number of ACLs read in
+ */
+DefaultACLInfo *
+getDefaultACLs(Archive *fout, int *numDefaultACLs)
+{
+ DumpOptions *dopt = fout->dopt;
+ DefaultACLInfo *daclinfo;
+ PQExpBuffer query;
+ PGresult *res;
+ int i_oid;
+ int i_tableoid;
+ int i_defaclrole;
+ int i_defaclnamespace;
+ int i_defaclobjtype;
+ int i_defaclacl;
+ int i_acldefault;
+ int i,
+ ntups;
+
+ query = createPQExpBuffer();
+
+ /*
+ * Global entries (with defaclnamespace=0) replace the hard-wired default
+ * ACL for their object type. We should dump them as deltas from the
+ * default ACL, since that will be used as a starting point for
+ * interpreting the ALTER DEFAULT PRIVILEGES commands. On the other hand,
+ * non-global entries can only add privileges not revoke them. We must
+ * dump those as-is (i.e., as deltas from an empty ACL).
+ *
+ * We can use defaclobjtype as the object type for acldefault(), except
+ * for the case of 'S' (DEFACLOBJ_SEQUENCE) which must be converted to
+ * 's'.
+ */
+ appendPQExpBufferStr(query,
+ "SELECT oid, tableoid, "
+ "defaclrole, "
+ "defaclnamespace, "
+ "defaclobjtype, "
+ "defaclacl, "
+ "CASE WHEN defaclnamespace = 0 THEN "
+ "acldefault(CASE WHEN defaclobjtype = 'S' "
+ "THEN 's'::\"char\" ELSE defaclobjtype END, "
+ "defaclrole) ELSE '{}' END AS acldefault "
+ "FROM pg_default_acl");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ *numDefaultACLs = ntups;
+
+ daclinfo = (DefaultACLInfo *) pg_malloc(ntups * sizeof(DefaultACLInfo));
+
+ i_oid = PQfnumber(res, "oid");
+ i_tableoid = PQfnumber(res, "tableoid");
+ i_defaclrole = PQfnumber(res, "defaclrole");
+ i_defaclnamespace = PQfnumber(res, "defaclnamespace");
+ i_defaclobjtype = PQfnumber(res, "defaclobjtype");
+ i_defaclacl = PQfnumber(res, "defaclacl");
+ i_acldefault = PQfnumber(res, "acldefault");
+
+ for (i = 0; i < ntups; i++)
+ {
+ Oid nspid = atooid(PQgetvalue(res, i, i_defaclnamespace));
+
+ daclinfo[i].dobj.objType = DO_DEFAULT_ACL;
+ daclinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+ daclinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
+ AssignDumpId(&daclinfo[i].dobj);
+ /* cheesy ... is it worth coming up with a better object name? */
+ daclinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_defaclobjtype));
+
+ if (nspid != InvalidOid)
+ daclinfo[i].dobj.namespace = findNamespace(nspid);
+ else
+ daclinfo[i].dobj.namespace = NULL;
+
+ daclinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_defaclacl));
+ daclinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault));
+ daclinfo[i].dacl.privtype = 0;
+ daclinfo[i].dacl.initprivs = NULL;
+ daclinfo[i].defaclrole = getRoleName(PQgetvalue(res, i, i_defaclrole));
+ daclinfo[i].defaclobjtype = *(PQgetvalue(res, i, i_defaclobjtype));
+
+ /* Default ACLs are ACLs, of course */
+ daclinfo[i].dobj.components |= DUMP_COMPONENT_ACL;
+
+ /* Decide whether we want to dump it */
+ selectDumpableDefaultACL(&(daclinfo[i]), dopt);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+
+ return daclinfo;
+}
+
+/*
+ * getRoleName -- look up the name of a role, given its OID
+ *
+ * In current usage, we don't expect failures, so error out for a bad OID.
+ */
+static const char *
+getRoleName(const char *roleoid_str)
+{
+ Oid roleoid = atooid(roleoid_str);
+
+ /*
+ * Do binary search to find the appropriate item.
+ */
+ if (nrolenames > 0)
+ {
+ RoleNameItem *low = &rolenames[0];
+ RoleNameItem *high = &rolenames[nrolenames - 1];
+
+ while (low <= high)
+ {
+ RoleNameItem *middle = low + (high - low) / 2;
+
+ if (roleoid < middle->roleoid)
+ high = middle - 1;
+ else if (roleoid > middle->roleoid)
+ low = middle + 1;
+ else
+ return middle->rolename; /* found a match */
+ }
+ }
+
+ pg_fatal("role with OID %u does not exist", roleoid);
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * collectRoleNames --
+ *
+ * Construct a table of all known roles.
+ * The table is sorted by OID for speed in lookup.
+ */
+static void
+collectRoleNames(Archive *fout)
+{
+ PGresult *res;
+ const char *query;
+ int i;
+
+ query = "SELECT oid, rolname FROM pg_catalog.pg_roles ORDER BY 1";
+
+ res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);
+
+ nrolenames = PQntuples(res);
+
+ rolenames = (RoleNameItem *) pg_malloc(nrolenames * sizeof(RoleNameItem));
+
+ for (i = 0; i < nrolenames; i++)
+ {
+ rolenames[i].roleoid = atooid(PQgetvalue(res, i, 0));
+ rolenames[i].rolename = pg_strdup(PQgetvalue(res, i, 1));
+ }
+
+ PQclear(res);
+}
+
+/*
+ * getAdditionalACLs
+ *
+ * We have now created all the DumpableObjects, and collected the ACL data
+ * that appears in the directly-associated catalog entries. However, there's
+ * more ACL-related info to collect. If any of a table's columns have ACLs,
+ * we must set the TableInfo's DUMP_COMPONENT_ACL components flag, as well as
+ * its hascolumnACLs flag (we won't store the ACLs themselves here, though).
+ * Also, in versions having the pg_init_privs catalog, read that and load the
+ * information into the relevant DumpableObjects.
+ */
+static void
+getAdditionalACLs(Archive *fout)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int ntups,
+ i;
+
+ /* Check for per-column ACLs */
+ appendPQExpBufferStr(query,
+ "SELECT DISTINCT attrelid FROM pg_attribute "
+ "WHERE attacl IS NOT NULL");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ Oid relid = atooid(PQgetvalue(res, i, 0));
+ TableInfo *tblinfo;
+
+ tblinfo = findTableByOid(relid);
+ /* OK to ignore tables we haven't got a DumpableObject for */
+ if (tblinfo)
+ {
+ tblinfo->dobj.components |= DUMP_COMPONENT_ACL;
+ tblinfo->hascolumnACLs = true;
+ }
+ }
+ PQclear(res);
+
+ /* Fetch initial-privileges data */
+ if (fout->remoteVersion >= 90600)
+ {
+ printfPQExpBuffer(query,
+ "SELECT objoid, classoid, objsubid, privtype, initprivs "
+ "FROM pg_init_privs");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ for (i = 0; i < ntups; i++)
+ {
+ Oid objoid = atooid(PQgetvalue(res, i, 0));
+ Oid classoid = atooid(PQgetvalue(res, i, 1));
+ int objsubid = atoi(PQgetvalue(res, i, 2));
+ char privtype = *(PQgetvalue(res, i, 3));
+ char *initprivs = PQgetvalue(res, i, 4);
+ CatalogId objId;
+ DumpableObject *dobj;
+
+ objId.tableoid = classoid;
+ objId.oid = objoid;
+ dobj = findObjectByCatalogId(objId);
+ /* OK to ignore entries we haven't got a DumpableObject for */
+ if (dobj)
+ {
+ /* Cope with sub-object initprivs */
+ if (objsubid != 0)
+ {
+ if (dobj->objType == DO_TABLE)
+ {
+ /* For a column initprivs, set the table's ACL flags */
+ dobj->components |= DUMP_COMPONENT_ACL;
+ ((TableInfo *) dobj)->hascolumnACLs = true;
+ }
+ else
+ pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
+ classoid, objoid, objsubid);
+ continue;
+ }
+
+ /*
+ * We ignore any pg_init_privs.initprivs entry for the public
+ * schema, as explained in getNamespaces().
+ */
+ if (dobj->objType == DO_NAMESPACE &&
+ strcmp(dobj->name, "public") == 0)
+ continue;
+
+ /* Else it had better be of a type we think has ACLs */
+ if (dobj->objType == DO_NAMESPACE ||
+ dobj->objType == DO_TYPE ||
+ dobj->objType == DO_FUNC ||
+ dobj->objType == DO_AGG ||
+ dobj->objType == DO_TABLE ||
+ dobj->objType == DO_PROCLANG ||
+ dobj->objType == DO_FDW ||
+ dobj->objType == DO_FOREIGN_SERVER)
+ {
+ DumpableObjectWithAcl *daobj = (DumpableObjectWithAcl *) dobj;
+
+ daobj->dacl.privtype = privtype;
+ daobj->dacl.initprivs = pstrdup(initprivs);
+ }
+ else
+ pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
+ classoid, objoid, objsubid);
+ }
+ }
+ PQclear(res);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpCommentExtended --
+ *
+ * This routine is used to dump any comments associated with the
+ * object handed to this routine. The routine takes the object type
+ * and object name (ready to print, except for schema decoration), plus
+ * the namespace and owner of the object (for labeling the ArchiveEntry),
+ * plus catalog ID and subid which are the lookup key for pg_description,
+ * plus the dump ID for the object (for setting a dependency).
+ * If a matching pg_description entry is found, it is dumped.
+ *
+ * Note: in some cases, such as comments for triggers and rules, the "type"
+ * string really looks like, e.g., "TRIGGER name ON". This is a bit of a hack
+ * but it doesn't seem worth complicating the API for all callers to make
+ * it cleaner.
+ *
+ * Note: although this routine takes a dumpId for dependency purposes,
+ * that purpose is just to mark the dependency in the emitted dump file
+ * for possible future use by pg_restore. We do NOT use it for determining
+ * ordering of the comment in the dump file, because this routine is called
+ * after dependency sorting occurs. This routine should be called just after
+ * calling ArchiveEntry() for the specified object.
+ */
+static void
+dumpCommentExtended(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId,
+ const char *initdb_comment)
+{
+ DumpOptions *dopt = fout->dopt;
+ CommentItem *comments;
+ int ncomments;
+
+ /* do nothing, if --no-comments is supplied */
+ if (dopt->no_comments)
+ return;
+
+ /* Comments are schema not data ... except LO comments are data */
+ if (strcmp(type, "LARGE OBJECT") != 0)
+ {
+ if (dopt->dataOnly)
+ return;
+ }
+ else
+ {
+ /* We do dump LO comments in binary-upgrade mode */
+ if (dopt->schemaOnly && !dopt->binary_upgrade)
+ return;
+ }
+
+ /* Search for comments associated with catalogId, using table */
+ ncomments = findComments(catalogId.tableoid, catalogId.oid,
+ &comments);
+
+ /* Is there one matching the subid? */
+ while (ncomments > 0)
+ {
+ if (comments->objsubid == subid)
+ break;
+ comments++;
+ ncomments--;
+ }
+
+ if (initdb_comment != NULL)
+ {
+ static CommentItem empty_comment = {.descr = ""};
+
+ /*
+ * initdb creates this object with a comment. Skip dumping the
+ * initdb-provided comment, which would complicate matters for
+ * non-superuser use of pg_dump. When the DBA has removed initdb's
+ * comment, replicate that.
+ */
+ if (ncomments == 0)
+ {
+ comments = &empty_comment;
+ ncomments = 1;
+ }
+ else if (strcmp(comments->descr, initdb_comment) == 0)
+ ncomments = 0;
+ }
+
+ /* If a comment exists, build COMMENT ON statement */
+ if (ncomments > 0)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer tag = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "COMMENT ON %s ", type);
+ if (namespace && *namespace)
+ appendPQExpBuffer(query, "%s.", fmtId(namespace));
+ appendPQExpBuffer(query, "%s IS ", name);
+ appendStringLiteralAH(query, comments->descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ appendPQExpBuffer(tag, "%s %s", type, name);
+
+ /*
+ * We mark comments as SECTION_NONE because they really belong in the
+ * same section as their parent, whether that is pre-data or
+ * post-data.
+ */
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = namespace,
+ .owner = owner,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &dumpId,
+ .nDeps = 1));
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tag);
+ }
+}
+
+/*
+ * dumpComment --
+ *
+ * Typical simplification of the above function.
+ */
+static inline void
+dumpComment(Archive *fout, const char *type,
+ const char *name, const char *namespace,
+ const char *owner, CatalogId catalogId,
+ int subid, DumpId dumpId)
+{
+ dumpCommentExtended(fout, type, name, namespace, owner,
+ catalogId, subid, dumpId, NULL);
+}
+
+/*
+ * dumpTableComment --
+ *
+ * As above, but dump comments for both the specified table (or view)
+ * and its columns.
+ */
+static void
+dumpTableComment(Archive *fout, const TableInfo *tbinfo,
+ const char *reltypename)
+{
+ DumpOptions *dopt = fout->dopt;
+ CommentItem *comments;
+ int ncomments;
+ PQExpBuffer query;
+ PQExpBuffer tag;
+
+ /* do nothing, if --no-comments is supplied */
+ if (dopt->no_comments)
+ return;
+
+ /* Comments are SCHEMA not data */
+ if (dopt->dataOnly)
+ return;
+
+ /* Search for comments associated with relation, using table */
+ ncomments = findComments(tbinfo->dobj.catId.tableoid,
+ tbinfo->dobj.catId.oid,
+ &comments);
+
+ /* If comments exist, build COMMENT ON statements */
+ if (ncomments <= 0)
+ return;
+
+ query = createPQExpBuffer();
+ tag = createPQExpBuffer();
+
+ while (ncomments > 0)
+ {
+ const char *descr = comments->descr;
+ int objsubid = comments->objsubid;
+
+ if (objsubid == 0)
+ {
+ resetPQExpBuffer(tag);
+ appendPQExpBuffer(tag, "%s %s", reltypename,
+ fmtId(tbinfo->dobj.name));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON %s %s IS ", reltypename,
+ fmtQualifiedDumpable(tbinfo));
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+ else if (objsubid > 0 && objsubid <= tbinfo->numatts)
+ {
+ resetPQExpBuffer(tag);
+ appendPQExpBuffer(tag, "COLUMN %s.",
+ fmtId(tbinfo->dobj.name));
+ appendPQExpBufferStr(tag, fmtId(tbinfo->attnames[objsubid - 1]));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON COLUMN %s.",
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(query, "%s IS ",
+ fmtId(tbinfo->attnames[objsubid - 1]));
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+
+ comments++;
+ ncomments--;
+ }
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(tag);
+}
+
+/*
+ * findComments --
+ *
+ * Find the comment(s), if any, associated with the given object. All the
+ * objsubid values associated with the given classoid/objoid are found with
+ * one search.
+ */
+static int
+findComments(Oid classoid, Oid objoid, CommentItem **items)
+{
+ CommentItem *middle = NULL;
+ CommentItem *low;
+ CommentItem *high;
+ int nmatch;
+
+ /*
+ * Do binary search to find some item matching the object.
+ */
+ low = &comments[0];
+ high = &comments[ncomments - 1];
+ while (low <= high)
+ {
+ middle = low + (high - low) / 2;
+
+ if (classoid < middle->classoid)
+ high = middle - 1;
+ else if (classoid > middle->classoid)
+ low = middle + 1;
+ else if (objoid < middle->objoid)
+ high = middle - 1;
+ else if (objoid > middle->objoid)
+ low = middle + 1;
+ else
+ break; /* found a match */
+ }
+
+ if (low > high) /* no matches */
+ {
+ *items = NULL;
+ return 0;
+ }
+
+ /*
+ * Now determine how many items match the object. The search loop
+ * invariant still holds: only items between low and high inclusive could
+ * match.
+ */
+ nmatch = 1;
+ while (middle > low)
+ {
+ if (classoid != middle[-1].classoid ||
+ objoid != middle[-1].objoid)
+ break;
+ middle--;
+ nmatch++;
+ }
+
+ *items = middle;
+
+ middle += nmatch;
+ while (middle <= high)
+ {
+ if (classoid != middle->classoid ||
+ objoid != middle->objoid)
+ break;
+ middle++;
+ nmatch++;
+ }
+
+ return nmatch;
+}
+
+/*
+ * collectComments --
+ *
+ * Construct a table of all comments available for database objects;
+ * also set the has-comment component flag for each relevant object.
+ *
+ * We used to do per-object queries for the comments, but it's much faster
+ * to pull them all over at once, and on most databases the memory cost
+ * isn't high.
+ *
+ * The table is sorted by classoid/objid/objsubid for speed in lookup.
+ */
+static void
+collectComments(Archive *fout)
+{
+ PGresult *res;
+ PQExpBuffer query;
+ int i_description;
+ int i_classoid;
+ int i_objoid;
+ int i_objsubid;
+ int ntups;
+ int i;
+ DumpableObject *dobj;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query, "SELECT description, classoid, objoid, objsubid "
+ "FROM pg_catalog.pg_description "
+ "ORDER BY classoid, objoid, objsubid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ /* Construct lookup table containing OIDs in numeric form */
+
+ i_description = PQfnumber(res, "description");
+ i_classoid = PQfnumber(res, "classoid");
+ i_objoid = PQfnumber(res, "objoid");
+ i_objsubid = PQfnumber(res, "objsubid");
+
+ ntups = PQntuples(res);
+
+ comments = (CommentItem *) pg_malloc(ntups * sizeof(CommentItem));
+ ncomments = 0;
+ dobj = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ int subid;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classoid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objoid));
+ subid = atoi(PQgetvalue(res, i, i_objsubid));
+
+ /* We needn't remember comments that don't match any dumpable object */
+ if (dobj == NULL ||
+ dobj->catId.tableoid != objId.tableoid ||
+ dobj->catId.oid != objId.oid)
+ dobj = findObjectByCatalogId(objId);
+ if (dobj == NULL)
+ continue;
+
+ /*
+ * Comments on columns of composite types are linked to the type's
+ * pg_class entry, but we need to set the DUMP_COMPONENT_COMMENT flag
+ * in the type's own DumpableObject.
+ */
+ if (subid != 0 && dobj->objType == DO_TABLE &&
+ ((TableInfo *) dobj)->relkind == RELKIND_COMPOSITE_TYPE)
+ {
+ TypeInfo *cTypeInfo;
+
+ cTypeInfo = findTypeByOid(((TableInfo *) dobj)->reltype);
+ if (cTypeInfo)
+ cTypeInfo->dobj.components |= DUMP_COMPONENT_COMMENT;
+ }
+ else
+ dobj->components |= DUMP_COMPONENT_COMMENT;
+
+ comments[ncomments].descr = pg_strdup(PQgetvalue(res, i, i_description));
+ comments[ncomments].classoid = objId.tableoid;
+ comments[ncomments].objoid = objId.oid;
+ comments[ncomments].objsubid = subid;
+ ncomments++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpDumpableObject
+ *
+ * This routine and its subsidiaries are responsible for creating
+ * ArchiveEntries (TOC objects) for each object to be dumped.
+ */
+static void
+dumpDumpableObject(Archive *fout, DumpableObject *dobj)
+{
+ /*
+ * Clear any dump-request bits for components that don't exist for this
+ * object. (This makes it safe to initially use DUMP_COMPONENT_ALL as the
+ * request for every kind of object.)
+ */
+ dobj->dump &= dobj->components;
+
+ /* Now, short-circuit if there's nothing to be done here. */
+ if (dobj->dump == 0)
+ return;
+
+ switch (dobj->objType)
+ {
+ case DO_NAMESPACE:
+ dumpNamespace(fout, (const NamespaceInfo *) dobj);
+ break;
+ case DO_EXTENSION:
+ dumpExtension(fout, (const ExtensionInfo *) dobj);
+ break;
+ case DO_TYPE:
+ dumpType(fout, (const TypeInfo *) dobj);
+ break;
+ case DO_SHELL_TYPE:
+ dumpShellType(fout, (const ShellTypeInfo *) dobj);
+ break;
+ case DO_FUNC:
+ dumpFunc(fout, (const FuncInfo *) dobj);
+ break;
+ case DO_AGG:
+ dumpAgg(fout, (const AggInfo *) dobj);
+ break;
+ case DO_OPERATOR:
+ dumpOpr(fout, (const OprInfo *) dobj);
+ break;
+ case DO_ACCESS_METHOD:
+ dumpAccessMethod(fout, (const AccessMethodInfo *) dobj);
+ break;
+ case DO_OPCLASS:
+ dumpOpclass(fout, (const OpclassInfo *) dobj);
+ break;
+ case DO_OPFAMILY:
+ dumpOpfamily(fout, (const OpfamilyInfo *) dobj);
+ break;
+ case DO_COLLATION:
+ dumpCollation(fout, (const CollInfo *) dobj);
+ break;
+ case DO_CONVERSION:
+ dumpConversion(fout, (const ConvInfo *) dobj);
+ break;
+ case DO_TABLE:
+ dumpTable(fout, (const TableInfo *) dobj);
+ break;
+ case DO_TABLE_ATTACH:
+ dumpTableAttach(fout, (const TableAttachInfo *) dobj);
+ break;
+ case DO_ATTRDEF:
+ dumpAttrDef(fout, (const AttrDefInfo *) dobj);
+ break;
+ case DO_INDEX:
+ dumpIndex(fout, (const IndxInfo *) dobj);
+ break;
+ case DO_INDEX_ATTACH:
+ dumpIndexAttach(fout, (const IndexAttachInfo *) dobj);
+ break;
+ case DO_STATSEXT:
+ dumpStatisticsExt(fout, (const StatsExtInfo *) dobj);
+ break;
+ case DO_REFRESH_MATVIEW:
+ refreshMatViewData(fout, (const TableDataInfo *) dobj);
+ break;
+ case DO_RULE:
+ dumpRule(fout, (const RuleInfo *) dobj);
+ break;
+ case DO_TRIGGER:
+ dumpTrigger(fout, (const TriggerInfo *) dobj);
+ break;
+ case DO_EVENT_TRIGGER:
+ dumpEventTrigger(fout, (const EventTriggerInfo *) dobj);
+ break;
+ case DO_CONSTRAINT:
+ dumpConstraint(fout, (const ConstraintInfo *) dobj);
+ break;
+ case DO_FK_CONSTRAINT:
+ dumpConstraint(fout, (const ConstraintInfo *) dobj);
+ break;
+ case DO_PROCLANG:
+ dumpProcLang(fout, (const ProcLangInfo *) dobj);
+ break;
+ case DO_CAST:
+ dumpCast(fout, (const CastInfo *) dobj);
+ break;
+ case DO_TRANSFORM:
+ dumpTransform(fout, (const TransformInfo *) dobj);
+ break;
+ case DO_SEQUENCE_SET:
+ dumpSequenceData(fout, (const TableDataInfo *) dobj);
+ break;
+ case DO_TABLE_DATA:
+ dumpTableData(fout, (const TableDataInfo *) dobj);
+ break;
+ case DO_DUMMY_TYPE:
+ /* table rowtypes and array types are never dumped separately */
+ break;
+ case DO_TSPARSER:
+ dumpTSParser(fout, (const TSParserInfo *) dobj);
+ break;
+ case DO_TSDICT:
+ dumpTSDictionary(fout, (const TSDictInfo *) dobj);
+ break;
+ case DO_TSTEMPLATE:
+ dumpTSTemplate(fout, (const TSTemplateInfo *) dobj);
+ break;
+ case DO_TSCONFIG:
+ dumpTSConfig(fout, (const TSConfigInfo *) dobj);
+ break;
+ case DO_FDW:
+ dumpForeignDataWrapper(fout, (const FdwInfo *) dobj);
+ break;
+ case DO_FOREIGN_SERVER:
+ dumpForeignServer(fout, (const ForeignServerInfo *) dobj);
+ break;
+ case DO_DEFAULT_ACL:
+ dumpDefaultACL(fout, (const DefaultACLInfo *) dobj);
+ break;
+ case DO_LARGE_OBJECT:
+ dumpLO(fout, (const LoInfo *) dobj);
+ break;
+ case DO_LARGE_OBJECT_DATA:
+ if (dobj->dump & DUMP_COMPONENT_DATA)
+ {
+ TocEntry *te;
+
+ te = ArchiveEntry(fout, dobj->catId, dobj->dumpId,
+ ARCHIVE_OPTS(.tag = dobj->name,
+ .description = "BLOBS",
+ .section = SECTION_DATA,
+ .dumpFn = dumpLOs));
+
+ /*
+ * Set the TocEntry's dataLength in case we are doing a
+ * parallel dump and want to order dump jobs by table size.
+ * (We need some size estimate for every TocEntry with a
+ * DataDumper function.) We don't currently have any cheap
+ * way to estimate the size of LOs, but it doesn't matter;
+ * let's just set the size to a large value so parallel dumps
+ * will launch this job first. If there's lots of LOs, we
+ * win, and if there aren't, we don't lose much. (If you want
+ * to improve on this, really what you should be thinking
+ * about is allowing LO dumping to be parallelized, not just
+ * getting a smarter estimate for the single TOC entry.)
+ */
+ te->dataLength = INT_MAX;
+ }
+ break;
+ case DO_POLICY:
+ dumpPolicy(fout, (const PolicyInfo *) dobj);
+ break;
+ case DO_PUBLICATION:
+ dumpPublication(fout, (const PublicationInfo *) dobj);
+ break;
+ case DO_PUBLICATION_REL:
+ dumpPublicationTable(fout, (const PublicationRelInfo *) dobj);
+ break;
+ case DO_PUBLICATION_TABLE_IN_SCHEMA:
+ dumpPublicationNamespace(fout,
+ (const PublicationSchemaInfo *) dobj);
+ break;
+ case DO_SUBSCRIPTION:
+ dumpSubscription(fout, (const SubscriptionInfo *) dobj);
+ break;
+ case DO_PRE_DATA_BOUNDARY:
+ case DO_POST_DATA_BOUNDARY:
+ /* never dumped, nothing to do */
+ break;
+ }
+}
+
+/*
+ * dumpNamespace
+ * writes out to fout the queries to recreate a user-defined namespace
+ */
+static void
+dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qnspname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qnspname = pg_strdup(fmtId(nspinfo->dobj.name));
+
+ if (nspinfo->create)
+ {
+ appendPQExpBuffer(delq, "DROP SCHEMA %s;\n", qnspname);
+ appendPQExpBuffer(q, "CREATE SCHEMA %s;\n", qnspname);
+ }
+ else
+ {
+ /* see selectDumpableNamespace() */
+ appendPQExpBufferStr(delq,
+ "-- *not* dropping schema, since initdb creates it\n");
+ appendPQExpBufferStr(q,
+ "-- *not* creating schema, since initdb creates it\n");
+ }
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &nspinfo->dobj,
+ "SCHEMA", qnspname, NULL);
+
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = nspinfo->dobj.name,
+ .owner = nspinfo->rolname,
+ .description = "SCHEMA",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Schema Comments and Security Labels */
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ {
+ const char *initdb_comment = NULL;
+
+ if (!nspinfo->create && strcmp(qnspname, "public") == 0)
+ initdb_comment = "standard public schema";
+ dumpCommentExtended(fout, "SCHEMA", qnspname,
+ NULL, nspinfo->rolname,
+ nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId,
+ initdb_comment);
+ }
+
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "SCHEMA", qnspname,
+ NULL, nspinfo->rolname,
+ nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
+
+ if (nspinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, nspinfo->dobj.dumpId, InvalidDumpId, "SCHEMA",
+ qnspname, NULL, NULL,
+ nspinfo->rolname, &nspinfo->dacl);
+
+ free(qnspname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpExtension
+ * writes out to fout the queries to recreate an extension
+ */
+static void
+dumpExtension(Archive *fout, const ExtensionInfo *extinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qextname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qextname = pg_strdup(fmtId(extinfo->dobj.name));
+
+ appendPQExpBuffer(delq, "DROP EXTENSION %s;\n", qextname);
+
+ if (!dopt->binary_upgrade)
+ {
+ /*
+ * In a regular dump, we simply create the extension, intentionally
+ * not specifying a version, so that the destination installation's
+ * default version is used.
+ *
+ * Use of IF NOT EXISTS here is unlike our behavior for other object
+ * types; but there are various scenarios in which it's convenient to
+ * manually create the desired extension before restoring, so we
+ * prefer to allow it to exist already.
+ */
+ appendPQExpBuffer(q, "CREATE EXTENSION IF NOT EXISTS %s WITH SCHEMA %s;\n",
+ qextname, fmtId(extinfo->namespace));
+ }
+ else
+ {
+ /*
+ * In binary-upgrade mode, it's critical to reproduce the state of the
+ * database exactly, so our procedure is to create an empty extension,
+ * restore all the contained objects normally, and add them to the
+ * extension one by one. This function performs just the first of
+ * those steps. binary_upgrade_extension_member() takes care of
+ * adding member objects as they're created.
+ */
+ int i;
+ int n;
+
+ appendPQExpBufferStr(q, "-- For binary upgrade, create an empty extension and insert objects into it\n");
+
+ /*
+ * We unconditionally create the extension, so we must drop it if it
+ * exists. This could happen if the user deleted 'plpgsql' and then
+ * readded it, causing its oid to be greater than g_last_builtin_oid.
+ */
+ appendPQExpBuffer(q, "DROP EXTENSION IF EXISTS %s;\n", qextname);
+
+ appendPQExpBufferStr(q,
+ "SELECT pg_catalog.binary_upgrade_create_empty_extension(");
+ appendStringLiteralAH(q, extinfo->dobj.name, fout);
+ appendPQExpBufferStr(q, ", ");
+ appendStringLiteralAH(q, extinfo->namespace, fout);
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBuffer(q, "%s, ", extinfo->relocatable ? "true" : "false");
+ appendStringLiteralAH(q, extinfo->extversion, fout);
+ appendPQExpBufferStr(q, ", ");
+
+ /*
+ * Note that we're pushing extconfig (an OID array) back into
+ * pg_extension exactly as-is. This is OK because pg_class OIDs are
+ * preserved in binary upgrade.
+ */
+ if (strlen(extinfo->extconfig) > 2)
+ appendStringLiteralAH(q, extinfo->extconfig, fout);
+ else
+ appendPQExpBufferStr(q, "NULL");
+ appendPQExpBufferStr(q, ", ");
+ if (strlen(extinfo->extcondition) > 2)
+ appendStringLiteralAH(q, extinfo->extcondition, fout);
+ else
+ appendPQExpBufferStr(q, "NULL");
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBufferStr(q, "ARRAY[");
+ n = 0;
+ for (i = 0; i < extinfo->dobj.nDeps; i++)
+ {
+ DumpableObject *extobj;
+
+ extobj = findObjectByDumpId(extinfo->dobj.dependencies[i]);
+ if (extobj && extobj->objType == DO_EXTENSION)
+ {
+ if (n++ > 0)
+ appendPQExpBufferChar(q, ',');
+ appendStringLiteralAH(q, extobj->name, fout);
+ }
+ }
+ appendPQExpBufferStr(q, "]::pg_catalog.text[]");
+ appendPQExpBufferStr(q, ");\n");
+ }
+
+ if (extinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, extinfo->dobj.catId, extinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = extinfo->dobj.name,
+ .description = "EXTENSION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Extension Comments and Security Labels */
+ if (extinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "EXTENSION", qextname,
+ NULL, "",
+ extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
+
+ if (extinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "EXTENSION", qextname,
+ NULL, "",
+ extinfo->dobj.catId, 0, extinfo->dobj.dumpId);
+
+ free(qextname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpType
+ * writes out to fout the queries to recreate a user-defined type
+ */
+static void
+dumpType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Dump out in proper style */
+ if (tyinfo->typtype == TYPTYPE_BASE)
+ dumpBaseType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_DOMAIN)
+ dumpDomain(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_COMPOSITE)
+ dumpCompositeType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_ENUM)
+ dumpEnumType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_RANGE)
+ dumpRangeType(fout, tyinfo);
+ else if (tyinfo->typtype == TYPTYPE_PSEUDO && !tyinfo->isDefined)
+ dumpUndefinedType(fout, tyinfo);
+ else
+ pg_log_warning("typtype of data type \"%s\" appears to be invalid",
+ tyinfo->dobj.name);
+}
+
+/*
+ * dumpEnumType
+ * writes out to fout the queries to recreate a user-defined enum type
+ */
+static void
+dumpEnumType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int num,
+ i;
+ Oid enum_oid;
+ char *qtypname;
+ char *qualtypname;
+ char *label;
+ int i_enumlabel;
+ int i_oid;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPENUMTYPE])
+ {
+ /* Set up query for enum-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpEnumType(pg_catalog.oid) AS\n"
+ "SELECT oid, enumlabel "
+ "FROM pg_catalog.pg_enum "
+ "WHERE enumtypid = $1 "
+ "ORDER BY enumsortorder");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPENUMTYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpEnumType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ num = PQntuples(res);
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ /*
+ * CASCADE shouldn't be required here as for normal types since the I/O
+ * functions are generic and do not get dropped.
+ */
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s AS ENUM (",
+ qualtypname);
+
+ if (!dopt->binary_upgrade)
+ {
+ i_enumlabel = PQfnumber(res, "enumlabel");
+
+ /* Labels with server-assigned oids */
+ for (i = 0; i < num; i++)
+ {
+ label = PQgetvalue(res, i, i_enumlabel);
+ if (i > 0)
+ appendPQExpBufferChar(q, ',');
+ appendPQExpBufferStr(q, "\n ");
+ appendStringLiteralAH(q, label, fout);
+ }
+ }
+
+ appendPQExpBufferStr(q, "\n);\n");
+
+ if (dopt->binary_upgrade)
+ {
+ i_oid = PQfnumber(res, "oid");
+ i_enumlabel = PQfnumber(res, "enumlabel");
+
+ /* Labels with dump-assigned (preserved) oids */
+ for (i = 0; i < num; i++)
+ {
+ enum_oid = atooid(PQgetvalue(res, i, i_oid));
+ label = PQgetvalue(res, i, i_enumlabel);
+
+ if (i == 0)
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, must preserve pg_enum oids\n");
+ appendPQExpBuffer(q,
+ "SELECT pg_catalog.binary_upgrade_set_next_pg_enum_oid('%u'::pg_catalog.oid);\n",
+ enum_oid);
+ appendPQExpBuffer(q, "ALTER TYPE %s ADD VALUE ", qualtypname);
+ appendStringLiteralAH(q, label, fout);
+ appendPQExpBufferStr(q, ";\n\n");
+ }
+ }
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpRangeType
+ * writes out to fout the queries to recreate a user-defined range type
+ */
+static void
+dumpRangeType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ Oid collationOid;
+ char *qtypname;
+ char *qualtypname;
+ char *procname;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPRANGETYPE])
+ {
+ /* Set up query for range-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpRangeType(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query,
+ "SELECT ");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query,
+ "pg_catalog.format_type(rngmultitypid, NULL) AS rngmultitype, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS rngmultitype, ");
+
+ appendPQExpBufferStr(query,
+ "pg_catalog.format_type(rngsubtype, NULL) AS rngsubtype, "
+ "opc.opcname AS opcname, "
+ "(SELECT nspname FROM pg_catalog.pg_namespace nsp "
+ " WHERE nsp.oid = opc.opcnamespace) AS opcnsp, "
+ "opc.opcdefault, "
+ "CASE WHEN rngcollation = st.typcollation THEN 0 "
+ " ELSE rngcollation END AS collation, "
+ "rngcanonical, rngsubdiff "
+ "FROM pg_catalog.pg_range r, pg_catalog.pg_type st, "
+ " pg_catalog.pg_opclass opc "
+ "WHERE st.oid = rngsubtype AND opc.oid = rngsubopc AND "
+ "rngtypid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPRANGETYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpRangeType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ /*
+ * CASCADE shouldn't be required here as for normal types since the I/O
+ * functions are generic and do not get dropped.
+ */
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, true);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s AS RANGE (",
+ qualtypname);
+
+ appendPQExpBuffer(q, "\n subtype = %s",
+ PQgetvalue(res, 0, PQfnumber(res, "rngsubtype")));
+
+ if (!PQgetisnull(res, 0, PQfnumber(res, "rngmultitype")))
+ appendPQExpBuffer(q, ",\n multirange_type_name = %s",
+ PQgetvalue(res, 0, PQfnumber(res, "rngmultitype")));
+
+ /* print subtype_opclass only if not default for subtype */
+ if (PQgetvalue(res, 0, PQfnumber(res, "opcdefault"))[0] != 't')
+ {
+ char *opcname = PQgetvalue(res, 0, PQfnumber(res, "opcname"));
+ char *nspname = PQgetvalue(res, 0, PQfnumber(res, "opcnsp"));
+
+ appendPQExpBuffer(q, ",\n subtype_opclass = %s.",
+ fmtId(nspname));
+ appendPQExpBufferStr(q, fmtId(opcname));
+ }
+
+ collationOid = atooid(PQgetvalue(res, 0, PQfnumber(res, "collation")));
+ if (OidIsValid(collationOid))
+ {
+ CollInfo *coll = findCollationByOid(collationOid);
+
+ if (coll)
+ appendPQExpBuffer(q, ",\n collation = %s",
+ fmtQualifiedDumpable(coll));
+ }
+
+ procname = PQgetvalue(res, 0, PQfnumber(res, "rngcanonical"));
+ if (strcmp(procname, "-") != 0)
+ appendPQExpBuffer(q, ",\n canonical = %s", procname);
+
+ procname = PQgetvalue(res, 0, PQfnumber(res, "rngsubdiff"));
+ if (strcmp(procname, "-") != 0)
+ appendPQExpBuffer(q, ",\n subtype_diff = %s", procname);
+
+ appendPQExpBufferStr(q, "\n);\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpUndefinedType
+ * writes out to fout the queries to recreate a !typisdefined type
+ *
+ * This is a shell type, but we use different terminology to distinguish
+ * this case from where we have to emit a shell type definition to break
+ * circular dependencies. An undefined type shouldn't ever have anything
+ * depending on it.
+ */
+static void
+dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ char *qtypname;
+ char *qualtypname;
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s;\n",
+ qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpBaseType
+ * writes out to fout the queries to recreate a user-defined base type
+ */
+static void
+dumpBaseType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ char *qtypname;
+ char *qualtypname;
+ char *typlen;
+ char *typinput;
+ char *typoutput;
+ char *typreceive;
+ char *typsend;
+ char *typmodin;
+ char *typmodout;
+ char *typanalyze;
+ char *typsubscript;
+ Oid typreceiveoid;
+ Oid typsendoid;
+ Oid typmodinoid;
+ Oid typmodoutoid;
+ Oid typanalyzeoid;
+ Oid typsubscriptoid;
+ char *typcategory;
+ char *typispreferred;
+ char *typdelim;
+ char *typbyval;
+ char *typalign;
+ char *typstorage;
+ char *typcollatable;
+ char *typdefault;
+ bool typdefault_is_literal = false;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPBASETYPE])
+ {
+ /* Set up query for type-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpBaseType(pg_catalog.oid) AS\n"
+ "SELECT typlen, "
+ "typinput, typoutput, typreceive, typsend, "
+ "typreceive::pg_catalog.oid AS typreceiveoid, "
+ "typsend::pg_catalog.oid AS typsendoid, "
+ "typanalyze, "
+ "typanalyze::pg_catalog.oid AS typanalyzeoid, "
+ "typdelim, typbyval, typalign, typstorage, "
+ "typmodin, typmodout, "
+ "typmodin::pg_catalog.oid AS typmodinoid, "
+ "typmodout::pg_catalog.oid AS typmodoutoid, "
+ "typcategory, typispreferred, "
+ "(typcollation <> 0) AS typcollatable, "
+ "pg_catalog.pg_get_expr(typdefaultbin, 0) AS typdefaultbin, typdefault, ");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query,
+ "typsubscript, "
+ "typsubscript::pg_catalog.oid AS typsubscriptoid ");
+ else
+ appendPQExpBufferStr(query,
+ "'-' AS typsubscript, 0 AS typsubscriptoid ");
+
+ appendPQExpBufferStr(query, "FROM pg_catalog.pg_type "
+ "WHERE oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPBASETYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpBaseType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ typlen = PQgetvalue(res, 0, PQfnumber(res, "typlen"));
+ typinput = PQgetvalue(res, 0, PQfnumber(res, "typinput"));
+ typoutput = PQgetvalue(res, 0, PQfnumber(res, "typoutput"));
+ typreceive = PQgetvalue(res, 0, PQfnumber(res, "typreceive"));
+ typsend = PQgetvalue(res, 0, PQfnumber(res, "typsend"));
+ typmodin = PQgetvalue(res, 0, PQfnumber(res, "typmodin"));
+ typmodout = PQgetvalue(res, 0, PQfnumber(res, "typmodout"));
+ typanalyze = PQgetvalue(res, 0, PQfnumber(res, "typanalyze"));
+ typsubscript = PQgetvalue(res, 0, PQfnumber(res, "typsubscript"));
+ typreceiveoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typreceiveoid")));
+ typsendoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typsendoid")));
+ typmodinoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typmodinoid")));
+ typmodoutoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typmodoutoid")));
+ typanalyzeoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typanalyzeoid")));
+ typsubscriptoid = atooid(PQgetvalue(res, 0, PQfnumber(res, "typsubscriptoid")));
+ typcategory = PQgetvalue(res, 0, PQfnumber(res, "typcategory"));
+ typispreferred = PQgetvalue(res, 0, PQfnumber(res, "typispreferred"));
+ typdelim = PQgetvalue(res, 0, PQfnumber(res, "typdelim"));
+ typbyval = PQgetvalue(res, 0, PQfnumber(res, "typbyval"));
+ typalign = PQgetvalue(res, 0, PQfnumber(res, "typalign"));
+ typstorage = PQgetvalue(res, 0, PQfnumber(res, "typstorage"));
+ typcollatable = PQgetvalue(res, 0, PQfnumber(res, "typcollatable"));
+ if (!PQgetisnull(res, 0, PQfnumber(res, "typdefaultbin")))
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefaultbin"));
+ else if (!PQgetisnull(res, 0, PQfnumber(res, "typdefault")))
+ {
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefault"));
+ typdefault_is_literal = true; /* it needs quotes */
+ }
+ else
+ typdefault = NULL;
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ /*
+ * The reason we include CASCADE is that the circular dependency between
+ * the type and its I/O functions makes it impossible to drop the type any
+ * other way.
+ */
+ appendPQExpBuffer(delq, "DROP TYPE %s CASCADE;\n", qualtypname);
+
+ /*
+ * We might already have a shell type, but setting pg_type_oid is
+ * harmless, and in any case we'd better set the array type OID.
+ */
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q,
+ "CREATE TYPE %s (\n"
+ " INTERNALLENGTH = %s",
+ qualtypname,
+ (strcmp(typlen, "-1") == 0) ? "variable" : typlen);
+
+ /* regproc result is sufficiently quoted already */
+ appendPQExpBuffer(q, ",\n INPUT = %s", typinput);
+ appendPQExpBuffer(q, ",\n OUTPUT = %s", typoutput);
+ if (OidIsValid(typreceiveoid))
+ appendPQExpBuffer(q, ",\n RECEIVE = %s", typreceive);
+ if (OidIsValid(typsendoid))
+ appendPQExpBuffer(q, ",\n SEND = %s", typsend);
+ if (OidIsValid(typmodinoid))
+ appendPQExpBuffer(q, ",\n TYPMOD_IN = %s", typmodin);
+ if (OidIsValid(typmodoutoid))
+ appendPQExpBuffer(q, ",\n TYPMOD_OUT = %s", typmodout);
+ if (OidIsValid(typanalyzeoid))
+ appendPQExpBuffer(q, ",\n ANALYZE = %s", typanalyze);
+
+ if (strcmp(typcollatable, "t") == 0)
+ appendPQExpBufferStr(q, ",\n COLLATABLE = true");
+
+ if (typdefault != NULL)
+ {
+ appendPQExpBufferStr(q, ",\n DEFAULT = ");
+ if (typdefault_is_literal)
+ appendStringLiteralAH(q, typdefault, fout);
+ else
+ appendPQExpBufferStr(q, typdefault);
+ }
+
+ if (OidIsValid(typsubscriptoid))
+ appendPQExpBuffer(q, ",\n SUBSCRIPT = %s", typsubscript);
+
+ if (OidIsValid(tyinfo->typelem))
+ appendPQExpBuffer(q, ",\n ELEMENT = %s",
+ getFormattedTypeName(fout, tyinfo->typelem,
+ zeroIsError));
+
+ if (strcmp(typcategory, "U") != 0)
+ {
+ appendPQExpBufferStr(q, ",\n CATEGORY = ");
+ appendStringLiteralAH(q, typcategory, fout);
+ }
+
+ if (strcmp(typispreferred, "t") == 0)
+ appendPQExpBufferStr(q, ",\n PREFERRED = true");
+
+ if (typdelim && strcmp(typdelim, ",") != 0)
+ {
+ appendPQExpBufferStr(q, ",\n DELIMITER = ");
+ appendStringLiteralAH(q, typdelim, fout);
+ }
+
+ if (*typalign == TYPALIGN_CHAR)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = char");
+ else if (*typalign == TYPALIGN_SHORT)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = int2");
+ else if (*typalign == TYPALIGN_INT)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = int4");
+ else if (*typalign == TYPALIGN_DOUBLE)
+ appendPQExpBufferStr(q, ",\n ALIGNMENT = double");
+
+ if (*typstorage == TYPSTORAGE_PLAIN)
+ appendPQExpBufferStr(q, ",\n STORAGE = plain");
+ else if (*typstorage == TYPSTORAGE_EXTERNAL)
+ appendPQExpBufferStr(q, ",\n STORAGE = external");
+ else if (*typstorage == TYPSTORAGE_EXTENDED)
+ appendPQExpBufferStr(q, ",\n STORAGE = extended");
+ else if (*typstorage == TYPSTORAGE_MAIN)
+ appendPQExpBufferStr(q, ",\n STORAGE = main");
+
+ if (strcmp(typbyval, "t") == 0)
+ appendPQExpBufferStr(q, ",\n PASSEDBYVALUE");
+
+ appendPQExpBufferStr(q, "\n);\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpDomain
+ * writes out to fout the queries to recreate a user-defined domain
+ */
+static void
+dumpDomain(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i;
+ char *qtypname;
+ char *qualtypname;
+ char *typnotnull;
+ char *typdefn;
+ char *typdefault;
+ Oid typcollation;
+ bool typdefault_is_literal = false;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPDOMAIN])
+ {
+ /* Set up query for domain-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpDomain(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query, "SELECT t.typnotnull, "
+ "pg_catalog.format_type(t.typbasetype, t.typtypmod) AS typdefn, "
+ "pg_catalog.pg_get_expr(t.typdefaultbin, 'pg_catalog.pg_type'::pg_catalog.regclass) AS typdefaultbin, "
+ "t.typdefault, "
+ "CASE WHEN t.typcollation <> u.typcollation "
+ "THEN t.typcollation ELSE 0 END AS typcollation "
+ "FROM pg_catalog.pg_type t "
+ "LEFT JOIN pg_catalog.pg_type u ON (t.typbasetype = u.oid) "
+ "WHERE t.oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPDOMAIN] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpDomain('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ typnotnull = PQgetvalue(res, 0, PQfnumber(res, "typnotnull"));
+ typdefn = PQgetvalue(res, 0, PQfnumber(res, "typdefn"));
+ if (!PQgetisnull(res, 0, PQfnumber(res, "typdefaultbin")))
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefaultbin"));
+ else if (!PQgetisnull(res, 0, PQfnumber(res, "typdefault")))
+ {
+ typdefault = PQgetvalue(res, 0, PQfnumber(res, "typdefault"));
+ typdefault_is_literal = true; /* it needs quotes */
+ }
+ else
+ typdefault = NULL;
+ typcollation = atooid(PQgetvalue(res, 0, PQfnumber(res, "typcollation")));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ true, /* force array type */
+ false); /* force multirange type */
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ appendPQExpBuffer(q,
+ "CREATE DOMAIN %s AS %s",
+ qualtypname,
+ typdefn);
+
+ /* Print collation only if different from base type's collation */
+ if (OidIsValid(typcollation))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(typcollation);
+ if (coll)
+ appendPQExpBuffer(q, " COLLATE %s", fmtQualifiedDumpable(coll));
+ }
+
+ if (typnotnull[0] == 't')
+ appendPQExpBufferStr(q, " NOT NULL");
+
+ if (typdefault != NULL)
+ {
+ appendPQExpBufferStr(q, " DEFAULT ");
+ if (typdefault_is_literal)
+ appendStringLiteralAH(q, typdefault, fout);
+ else
+ appendPQExpBufferStr(q, typdefault);
+ }
+
+ PQclear(res);
+
+ /*
+ * Add any CHECK constraints for the domain
+ */
+ for (i = 0; i < tyinfo->nDomChecks; i++)
+ {
+ ConstraintInfo *domcheck = &(tyinfo->domChecks[i]);
+
+ if (!domcheck->separate)
+ appendPQExpBuffer(q, "\n\tCONSTRAINT %s %s",
+ fmtId(domcheck->dobj.name), domcheck->condef);
+ }
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBuffer(delq, "DROP DOMAIN %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "DOMAIN", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "DOMAIN",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Domain Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "DOMAIN", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "DOMAIN", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ /* Dump any per-constraint comments */
+ for (i = 0; i < tyinfo->nDomChecks; i++)
+ {
+ ConstraintInfo *domcheck = &(tyinfo->domChecks[i]);
+ PQExpBuffer conprefix = createPQExpBuffer();
+
+ appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN",
+ fmtId(domcheck->dobj.name));
+
+ if (domcheck->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, conprefix->data, qtypname,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname,
+ domcheck->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(conprefix);
+ }
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpCompositeType
+ * writes out to fout the queries to recreate a user-defined stand-alone
+ * composite type
+ */
+static void
+dumpCompositeType(Archive *fout, const TypeInfo *tyinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer dropped = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ char *qtypname;
+ char *qualtypname;
+ int ntups;
+ int i_attname;
+ int i_atttypdefn;
+ int i_attlen;
+ int i_attalign;
+ int i_attisdropped;
+ int i_attcollation;
+ int i;
+ int actual_atts;
+
+ if (!fout->is_prepared[PREPQUERY_DUMPCOMPOSITETYPE])
+ {
+ /*
+ * Set up query for type-specific details.
+ *
+ * Since we only want to dump COLLATE clauses for attributes whose
+ * collation is different from their type's default, we use a CASE
+ * here to suppress uninteresting attcollations cheaply. atttypid
+ * will be 0 for dropped columns; collation does not matter for those.
+ */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpCompositeType(pg_catalog.oid) AS\n"
+ "SELECT a.attname, a.attnum, "
+ "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
+ "a.attlen, a.attalign, a.attisdropped, "
+ "CASE WHEN a.attcollation <> at.typcollation "
+ "THEN a.attcollation ELSE 0 END AS attcollation "
+ "FROM pg_catalog.pg_type ct "
+ "JOIN pg_catalog.pg_attribute a ON a.attrelid = ct.typrelid "
+ "LEFT JOIN pg_catalog.pg_type at ON at.oid = a.atttypid "
+ "WHERE ct.oid = $1 "
+ "ORDER BY a.attnum");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPCOMPOSITETYPE] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpCompositeType('%u')",
+ tyinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_attname = PQfnumber(res, "attname");
+ i_atttypdefn = PQfnumber(res, "atttypdefn");
+ i_attlen = PQfnumber(res, "attlen");
+ i_attalign = PQfnumber(res, "attalign");
+ i_attisdropped = PQfnumber(res, "attisdropped");
+ i_attcollation = PQfnumber(res, "attcollation");
+
+ if (dopt->binary_upgrade)
+ {
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ tyinfo->dobj.catId.oid,
+ false, false);
+ binary_upgrade_set_pg_class_oids(fout, q, tyinfo->typrelid, false);
+ }
+
+ qtypname = pg_strdup(fmtId(tyinfo->dobj.name));
+ qualtypname = pg_strdup(fmtQualifiedDumpable(tyinfo));
+
+ appendPQExpBuffer(q, "CREATE TYPE %s AS (",
+ qualtypname);
+
+ actual_atts = 0;
+ for (i = 0; i < ntups; i++)
+ {
+ char *attname;
+ char *atttypdefn;
+ char *attlen;
+ char *attalign;
+ bool attisdropped;
+ Oid attcollation;
+
+ attname = PQgetvalue(res, i, i_attname);
+ atttypdefn = PQgetvalue(res, i, i_atttypdefn);
+ attlen = PQgetvalue(res, i, i_attlen);
+ attalign = PQgetvalue(res, i, i_attalign);
+ attisdropped = (PQgetvalue(res, i, i_attisdropped)[0] == 't');
+ attcollation = atooid(PQgetvalue(res, i, i_attcollation));
+
+ if (attisdropped && !dopt->binary_upgrade)
+ continue;
+
+ /* Format properly if not first attr */
+ if (actual_atts++ > 0)
+ appendPQExpBufferChar(q, ',');
+ appendPQExpBufferStr(q, "\n\t");
+
+ if (!attisdropped)
+ {
+ appendPQExpBuffer(q, "%s %s", fmtId(attname), atttypdefn);
+
+ /* Add collation if not default for the column type */
+ if (OidIsValid(attcollation))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(attcollation);
+ if (coll)
+ appendPQExpBuffer(q, " COLLATE %s",
+ fmtQualifiedDumpable(coll));
+ }
+ }
+ else
+ {
+ /*
+ * This is a dropped attribute and we're in binary_upgrade mode.
+ * Insert a placeholder for it in the CREATE TYPE command, and set
+ * length and alignment with direct UPDATE to the catalogs
+ * afterwards. See similar code in dumpTableSchema().
+ */
+ appendPQExpBuffer(q, "%s INTEGER /* dummy */", fmtId(attname));
+
+ /* stash separately for insertion after the CREATE TYPE */
+ appendPQExpBufferStr(dropped,
+ "\n-- For binary upgrade, recreate dropped column.\n");
+ appendPQExpBuffer(dropped, "UPDATE pg_catalog.pg_attribute\n"
+ "SET attlen = %s, "
+ "attalign = '%s', attbyval = false\n"
+ "WHERE attname = ", attlen, attalign);
+ appendStringLiteralAH(dropped, attname, fout);
+ appendPQExpBufferStr(dropped, "\n AND attrelid = ");
+ appendStringLiteralAH(dropped, qualtypname, fout);
+ appendPQExpBufferStr(dropped, "::pg_catalog.regclass;\n");
+
+ appendPQExpBuffer(dropped, "ALTER TYPE %s ",
+ qualtypname);
+ appendPQExpBuffer(dropped, "DROP ATTRIBUTE %s;\n",
+ fmtId(attname));
+ }
+ }
+ appendPQExpBufferStr(q, "\n);\n");
+ appendPQExpBufferStr(q, dropped->data);
+
+ appendPQExpBuffer(delq, "DROP TYPE %s;\n", qualtypname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tyinfo->dobj,
+ "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tyinfo->dobj.name,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+
+ /* Dump Type Comments and Security Labels */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "TYPE", qtypname,
+ tyinfo->dobj.namespace->dobj.name, tyinfo->rolname,
+ tyinfo->dobj.catId, 0, tyinfo->dobj.dumpId);
+
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE",
+ qtypname, NULL,
+ tyinfo->dobj.namespace->dobj.name,
+ tyinfo->rolname, &tyinfo->dacl);
+
+ /* Dump any per-column comments */
+ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpCompositeTypeColComments(fout, tyinfo, res);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(dropped);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qtypname);
+ free(qualtypname);
+}
+
+/*
+ * dumpCompositeTypeColComments
+ * writes out to fout the queries to recreate comments on the columns of
+ * a user-defined stand-alone composite type.
+ *
+ * The caller has already made a query to collect the names and attnums
+ * of the type's columns, so we just pass that result into here rather
+ * than reading them again.
+ */
+static void
+dumpCompositeTypeColComments(Archive *fout, const TypeInfo *tyinfo,
+ PGresult *res)
+{
+ CommentItem *comments;
+ int ncomments;
+ PQExpBuffer query;
+ PQExpBuffer target;
+ int i;
+ int ntups;
+ int i_attname;
+ int i_attnum;
+ int i_attisdropped;
+
+ /* do nothing, if --no-comments is supplied */
+ if (fout->dopt->no_comments)
+ return;
+
+ /* Search for comments associated with type's pg_class OID */
+ ncomments = findComments(RelationRelationId, tyinfo->typrelid,
+ &comments);
+
+ /* If no comments exist, we're done */
+ if (ncomments <= 0)
+ return;
+
+ /* Build COMMENT ON statements */
+ query = createPQExpBuffer();
+ target = createPQExpBuffer();
+
+ ntups = PQntuples(res);
+ i_attnum = PQfnumber(res, "attnum");
+ i_attname = PQfnumber(res, "attname");
+ i_attisdropped = PQfnumber(res, "attisdropped");
+ while (ncomments > 0)
+ {
+ const char *attname;
+
+ attname = NULL;
+ for (i = 0; i < ntups; i++)
+ {
+ if (atoi(PQgetvalue(res, i, i_attnum)) == comments->objsubid &&
+ PQgetvalue(res, i, i_attisdropped)[0] != 't')
+ {
+ attname = PQgetvalue(res, i, i_attname);
+ break;
+ }
+ }
+ if (attname) /* just in case we don't find it */
+ {
+ const char *descr = comments->descr;
+
+ resetPQExpBuffer(target);
+ appendPQExpBuffer(target, "COLUMN %s.",
+ fmtId(tyinfo->dobj.name));
+ appendPQExpBufferStr(target, fmtId(attname));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON COLUMN %s.",
+ fmtQualifiedDumpable(tyinfo));
+ appendPQExpBuffer(query, "%s IS ", fmtId(attname));
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBufferStr(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = target->data,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "COMMENT",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tyinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+
+ comments++;
+ ncomments--;
+ }
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(target);
+}
+
+/*
+ * dumpShellType
+ * writes out to fout the queries to create a shell type
+ *
+ * We dump a shell definition in advance of the I/O functions for the type.
+ */
+static void
+dumpShellType(Archive *fout, const ShellTypeInfo *stinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+
+ /*
+ * Note the lack of a DROP command for the shell type; any required DROP
+ * is driven off the base type entry, instead. This interacts with
+ * _printTocEntry()'s use of the presence of a DROP command to decide
+ * whether an entry needs an ALTER OWNER command. We don't want to alter
+ * the shell type's owner immediately on creation; that should happen only
+ * after it's filled in, otherwise the backend complains.
+ */
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_type_oid(fout, q,
+ stinfo->baseType->dobj.catId.oid,
+ false, false);
+
+ appendPQExpBuffer(q, "CREATE TYPE %s;\n",
+ fmtQualifiedDumpable(stinfo));
+
+ if (stinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, stinfo->dobj.catId, stinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = stinfo->dobj.name,
+ .namespace = stinfo->dobj.namespace->dobj.name,
+ .owner = stinfo->baseType->rolname,
+ .description = "SHELL TYPE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data));
+
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * dumpProcLang
+ * writes out to fout the queries to recreate a user-defined
+ * procedural language
+ */
+static void
+dumpProcLang(Archive *fout, const ProcLangInfo *plang)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer defqry;
+ PQExpBuffer delqry;
+ bool useParams;
+ char *qlanname;
+ FuncInfo *funcInfo;
+ FuncInfo *inlineInfo = NULL;
+ FuncInfo *validatorInfo = NULL;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * Try to find the support function(s). It is not an error if we don't
+ * find them --- if the functions are in the pg_catalog schema, as is
+ * standard in 8.1 and up, then we won't have loaded them. (In this case
+ * we will emit a parameterless CREATE LANGUAGE command, which will
+ * require PL template knowledge in the backend to reload.)
+ */
+
+ funcInfo = findFuncByOid(plang->lanplcallfoid);
+ if (funcInfo != NULL && !funcInfo->dobj.dump)
+ funcInfo = NULL; /* treat not-dumped same as not-found */
+
+ if (OidIsValid(plang->laninline))
+ {
+ inlineInfo = findFuncByOid(plang->laninline);
+ if (inlineInfo != NULL && !inlineInfo->dobj.dump)
+ inlineInfo = NULL;
+ }
+
+ if (OidIsValid(plang->lanvalidator))
+ {
+ validatorInfo = findFuncByOid(plang->lanvalidator);
+ if (validatorInfo != NULL && !validatorInfo->dobj.dump)
+ validatorInfo = NULL;
+ }
+
+ /*
+ * If the functions are dumpable then emit a complete CREATE LANGUAGE with
+ * parameters. Otherwise, we'll write a parameterless command, which will
+ * be interpreted as CREATE EXTENSION.
+ */
+ useParams = (funcInfo != NULL &&
+ (inlineInfo != NULL || !OidIsValid(plang->laninline)) &&
+ (validatorInfo != NULL || !OidIsValid(plang->lanvalidator)));
+
+ defqry = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+
+ qlanname = pg_strdup(fmtId(plang->dobj.name));
+
+ appendPQExpBuffer(delqry, "DROP PROCEDURAL LANGUAGE %s;\n",
+ qlanname);
+
+ if (useParams)
+ {
+ appendPQExpBuffer(defqry, "CREATE %sPROCEDURAL LANGUAGE %s",
+ plang->lanpltrusted ? "TRUSTED " : "",
+ qlanname);
+ appendPQExpBuffer(defqry, " HANDLER %s",
+ fmtQualifiedDumpable(funcInfo));
+ if (OidIsValid(plang->laninline))
+ appendPQExpBuffer(defqry, " INLINE %s",
+ fmtQualifiedDumpable(inlineInfo));
+ if (OidIsValid(plang->lanvalidator))
+ appendPQExpBuffer(defqry, " VALIDATOR %s",
+ fmtQualifiedDumpable(validatorInfo));
+ }
+ else
+ {
+ /*
+ * If not dumping parameters, then use CREATE OR REPLACE so that the
+ * command will not fail if the language is preinstalled in the target
+ * database.
+ *
+ * Modern servers will interpret this as CREATE EXTENSION IF NOT
+ * EXISTS; perhaps we should emit that instead? But it might just add
+ * confusion.
+ */
+ appendPQExpBuffer(defqry, "CREATE OR REPLACE PROCEDURAL LANGUAGE %s",
+ qlanname);
+ }
+ appendPQExpBufferStr(defqry, ";\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(defqry, &plang->dobj,
+ "LANGUAGE", qlanname, NULL);
+
+ if (plang->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, plang->dobj.catId, plang->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = plang->dobj.name,
+ .owner = plang->lanowner,
+ .description = "PROCEDURAL LANGUAGE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = defqry->data,
+ .dropStmt = delqry->data,
+ ));
+
+ /* Dump Proc Lang Comments and Security Labels */
+ if (plang->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "LANGUAGE", qlanname,
+ NULL, plang->lanowner,
+ plang->dobj.catId, 0, plang->dobj.dumpId);
+
+ if (plang->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "LANGUAGE", qlanname,
+ NULL, plang->lanowner,
+ plang->dobj.catId, 0, plang->dobj.dumpId);
+
+ if (plang->lanpltrusted && plang->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, plang->dobj.dumpId, InvalidDumpId, "LANGUAGE",
+ qlanname, NULL, NULL,
+ plang->lanowner, &plang->dacl);
+
+ free(qlanname);
+
+ destroyPQExpBuffer(defqry);
+ destroyPQExpBuffer(delqry);
+}
+
+/*
+ * format_function_arguments: generate function name and argument list
+ *
+ * This is used when we can rely on pg_get_function_arguments to format
+ * the argument list. Note, however, that pg_get_function_arguments
+ * does not special-case zero-argument aggregates.
+ */
+static char *
+format_function_arguments(const FuncInfo *finfo, const char *funcargs, bool is_agg)
+{
+ PQExpBufferData fn;
+
+ initPQExpBuffer(&fn);
+ appendPQExpBufferStr(&fn, fmtId(finfo->dobj.name));
+ if (is_agg && finfo->nargs == 0)
+ appendPQExpBufferStr(&fn, "(*)");
+ else
+ appendPQExpBuffer(&fn, "(%s)", funcargs);
+ return fn.data;
+}
+
+/*
+ * format_function_signature: generate function name and argument list
+ *
+ * Only a minimal list of input argument types is generated; this is
+ * sufficient to reference the function, but not to define it.
+ *
+ * If honor_quotes is false then the function name is never quoted.
+ * This is appropriate for use in TOC tags, but not in SQL commands.
+ */
+static char *
+format_function_signature(Archive *fout, const FuncInfo *finfo, bool honor_quotes)
+{
+ PQExpBufferData fn;
+ int j;
+
+ initPQExpBuffer(&fn);
+ if (honor_quotes)
+ appendPQExpBuffer(&fn, "%s(", fmtId(finfo->dobj.name));
+ else
+ appendPQExpBuffer(&fn, "%s(", finfo->dobj.name);
+ for (j = 0; j < finfo->nargs; j++)
+ {
+ if (j > 0)
+ appendPQExpBufferStr(&fn, ", ");
+
+ appendPQExpBufferStr(&fn,
+ getFormattedTypeName(fout, finfo->argtypes[j],
+ zeroIsError));
+ }
+ appendPQExpBufferChar(&fn, ')');
+ return fn.data;
+}
+
+
+/*
+ * dumpFunc:
+ * dump out one function
+ */
+static void
+dumpFunc(Archive *fout, const FuncInfo *finfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delqry;
+ PQExpBuffer asPart;
+ PGresult *res;
+ char *funcsig; /* identity signature */
+ char *funcfullsig = NULL; /* full signature */
+ char *funcsig_tag;
+ char *qual_funcsig;
+ char *proretset;
+ char *prosrc;
+ char *probin;
+ char *prosqlbody;
+ char *funcargs;
+ char *funciargs;
+ char *funcresult;
+ char *protrftypes;
+ char *prokind;
+ char *provolatile;
+ char *proisstrict;
+ char *prosecdef;
+ char *proleakproof;
+ char *proconfig;
+ char *procost;
+ char *prorows;
+ char *prosupport;
+ char *proparallel;
+ char *lanname;
+ char **configitems = NULL;
+ int nconfigitems = 0;
+ const char *keyword;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ asPart = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPFUNC])
+ {
+ /* Set up query for function-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpFunc(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query,
+ "SELECT\n"
+ "proretset,\n"
+ "prosrc,\n"
+ "probin,\n"
+ "provolatile,\n"
+ "proisstrict,\n"
+ "prosecdef,\n"
+ "lanname,\n"
+ "proconfig,\n"
+ "procost,\n"
+ "prorows,\n"
+ "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
+ "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n"
+ "pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n"
+ "proleakproof,\n");
+
+ if (fout->remoteVersion >= 90500)
+ appendPQExpBufferStr(query,
+ "array_to_string(protrftypes, ' ') AS protrftypes,\n");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS protrftypes,\n");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "proparallel,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'u' AS proparallel,\n");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "prokind,\n");
+ else
+ appendPQExpBufferStr(query,
+ "CASE WHEN proiswindow THEN 'w' ELSE 'f' END AS prokind,\n");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(query,
+ "prosupport,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'-' AS prosupport,\n");
+
+ if (fout->remoteVersion >= 140000)
+ appendPQExpBufferStr(query,
+ "pg_get_function_sqlbody(p.oid) AS prosqlbody\n");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS prosqlbody\n");
+
+ appendPQExpBufferStr(query,
+ "FROM pg_catalog.pg_proc p, pg_catalog.pg_language l\n"
+ "WHERE p.oid = $1 "
+ "AND l.oid = p.prolang");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPFUNC] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpFunc('%u')",
+ finfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ proretset = PQgetvalue(res, 0, PQfnumber(res, "proretset"));
+ if (PQgetisnull(res, 0, PQfnumber(res, "prosqlbody")))
+ {
+ prosrc = PQgetvalue(res, 0, PQfnumber(res, "prosrc"));
+ probin = PQgetvalue(res, 0, PQfnumber(res, "probin"));
+ prosqlbody = NULL;
+ }
+ else
+ {
+ prosrc = NULL;
+ probin = NULL;
+ prosqlbody = PQgetvalue(res, 0, PQfnumber(res, "prosqlbody"));
+ }
+ funcargs = PQgetvalue(res, 0, PQfnumber(res, "funcargs"));
+ funciargs = PQgetvalue(res, 0, PQfnumber(res, "funciargs"));
+ funcresult = PQgetvalue(res, 0, PQfnumber(res, "funcresult"));
+ protrftypes = PQgetvalue(res, 0, PQfnumber(res, "protrftypes"));
+ prokind = PQgetvalue(res, 0, PQfnumber(res, "prokind"));
+ provolatile = PQgetvalue(res, 0, PQfnumber(res, "provolatile"));
+ proisstrict = PQgetvalue(res, 0, PQfnumber(res, "proisstrict"));
+ prosecdef = PQgetvalue(res, 0, PQfnumber(res, "prosecdef"));
+ proleakproof = PQgetvalue(res, 0, PQfnumber(res, "proleakproof"));
+ proconfig = PQgetvalue(res, 0, PQfnumber(res, "proconfig"));
+ procost = PQgetvalue(res, 0, PQfnumber(res, "procost"));
+ prorows = PQgetvalue(res, 0, PQfnumber(res, "prorows"));
+ prosupport = PQgetvalue(res, 0, PQfnumber(res, "prosupport"));
+ proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
+ lanname = PQgetvalue(res, 0, PQfnumber(res, "lanname"));
+
+ /*
+ * See backend/commands/functioncmds.c for details of how the 'AS' clause
+ * is used.
+ */
+ if (prosqlbody)
+ {
+ appendPQExpBufferStr(asPart, prosqlbody);
+ }
+ else if (probin[0] != '\0')
+ {
+ appendPQExpBufferStr(asPart, "AS ");
+ appendStringLiteralAH(asPart, probin, fout);
+ if (prosrc[0] != '\0')
+ {
+ appendPQExpBufferStr(asPart, ", ");
+
+ /*
+ * where we have bin, use dollar quoting if allowed and src
+ * contains quote or backslash; else use regular quoting.
+ */
+ if (dopt->disable_dollar_quoting ||
+ (strchr(prosrc, '\'') == NULL && strchr(prosrc, '\\') == NULL))
+ appendStringLiteralAH(asPart, prosrc, fout);
+ else
+ appendStringLiteralDQ(asPart, prosrc, NULL);
+ }
+ }
+ else
+ {
+ appendPQExpBufferStr(asPart, "AS ");
+ /* with no bin, dollar quote src unconditionally if allowed */
+ if (dopt->disable_dollar_quoting)
+ appendStringLiteralAH(asPart, prosrc, fout);
+ else
+ appendStringLiteralDQ(asPart, prosrc, NULL);
+ }
+
+ if (*proconfig)
+ {
+ if (!parsePGArray(proconfig, &configitems, &nconfigitems))
+ pg_fatal("could not parse %s array", "proconfig");
+ }
+ else
+ {
+ configitems = NULL;
+ nconfigitems = 0;
+ }
+
+ funcfullsig = format_function_arguments(finfo, funcargs, false);
+ funcsig = format_function_arguments(finfo, funciargs, false);
+
+ funcsig_tag = format_function_signature(fout, finfo, false);
+
+ qual_funcsig = psprintf("%s.%s",
+ fmtId(finfo->dobj.namespace->dobj.name),
+ funcsig);
+
+ if (prokind[0] == PROKIND_PROCEDURE)
+ keyword = "PROCEDURE";
+ else
+ keyword = "FUNCTION"; /* works for window functions too */
+
+ appendPQExpBuffer(delqry, "DROP %s %s;\n",
+ keyword, qual_funcsig);
+
+ appendPQExpBuffer(q, "CREATE %s %s.%s",
+ keyword,
+ fmtId(finfo->dobj.namespace->dobj.name),
+ funcfullsig ? funcfullsig :
+ funcsig);
+
+ if (prokind[0] == PROKIND_PROCEDURE)
+ /* no result type to output */ ;
+ else if (funcresult)
+ appendPQExpBuffer(q, " RETURNS %s", funcresult);
+ else
+ appendPQExpBuffer(q, " RETURNS %s%s",
+ (proretset[0] == 't') ? "SETOF " : "",
+ getFormattedTypeName(fout, finfo->prorettype,
+ zeroIsError));
+
+ appendPQExpBuffer(q, "\n LANGUAGE %s", fmtId(lanname));
+
+ if (*protrftypes)
+ {
+ Oid *typeids = palloc(FUNC_MAX_ARGS * sizeof(Oid));
+ int i;
+
+ appendPQExpBufferStr(q, " TRANSFORM ");
+ parseOidArray(protrftypes, typeids, FUNC_MAX_ARGS);
+ for (i = 0; typeids[i]; i++)
+ {
+ if (i != 0)
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBuffer(q, "FOR TYPE %s",
+ getFormattedTypeName(fout, typeids[i], zeroAsNone));
+ }
+ }
+
+ if (prokind[0] == PROKIND_WINDOW)
+ appendPQExpBufferStr(q, " WINDOW");
+
+ if (provolatile[0] != PROVOLATILE_VOLATILE)
+ {
+ if (provolatile[0] == PROVOLATILE_IMMUTABLE)
+ appendPQExpBufferStr(q, " IMMUTABLE");
+ else if (provolatile[0] == PROVOLATILE_STABLE)
+ appendPQExpBufferStr(q, " STABLE");
+ else if (provolatile[0] != PROVOLATILE_VOLATILE)
+ pg_fatal("unrecognized provolatile value for function \"%s\"",
+ finfo->dobj.name);
+ }
+
+ if (proisstrict[0] == 't')
+ appendPQExpBufferStr(q, " STRICT");
+
+ if (prosecdef[0] == 't')
+ appendPQExpBufferStr(q, " SECURITY DEFINER");
+
+ if (proleakproof[0] == 't')
+ appendPQExpBufferStr(q, " LEAKPROOF");
+
+ /*
+ * COST and ROWS are emitted only if present and not default, so as not to
+ * break backwards-compatibility of the dump without need. Keep this code
+ * in sync with the defaults in functioncmds.c.
+ */
+ if (strcmp(procost, "0") != 0)
+ {
+ if (strcmp(lanname, "internal") == 0 || strcmp(lanname, "c") == 0)
+ {
+ /* default cost is 1 */
+ if (strcmp(procost, "1") != 0)
+ appendPQExpBuffer(q, " COST %s", procost);
+ }
+ else
+ {
+ /* default cost is 100 */
+ if (strcmp(procost, "100") != 0)
+ appendPQExpBuffer(q, " COST %s", procost);
+ }
+ }
+ if (proretset[0] == 't' &&
+ strcmp(prorows, "0") != 0 && strcmp(prorows, "1000") != 0)
+ appendPQExpBuffer(q, " ROWS %s", prorows);
+
+ if (strcmp(prosupport, "-") != 0)
+ {
+ /* We rely on regprocout to provide quoting and qualification */
+ appendPQExpBuffer(q, " SUPPORT %s", prosupport);
+ }
+
+ if (proparallel[0] != PROPARALLEL_UNSAFE)
+ {
+ if (proparallel[0] == PROPARALLEL_SAFE)
+ appendPQExpBufferStr(q, " PARALLEL SAFE");
+ else if (proparallel[0] == PROPARALLEL_RESTRICTED)
+ appendPQExpBufferStr(q, " PARALLEL RESTRICTED");
+ else if (proparallel[0] != PROPARALLEL_UNSAFE)
+ pg_fatal("unrecognized proparallel value for function \"%s\"",
+ finfo->dobj.name);
+ }
+
+ for (int i = 0; i < nconfigitems; i++)
+ {
+ /* we feel free to scribble on configitems[] here */
+ char *configitem = configitems[i];
+ char *pos;
+
+ pos = strchr(configitem, '=');
+ if (pos == NULL)
+ continue;
+ *pos++ = '\0';
+ appendPQExpBuffer(q, "\n SET %s TO ", fmtId(configitem));
+
+ /*
+ * Variables that are marked GUC_LIST_QUOTE were already fully quoted
+ * by flatten_set_variable_args() before they were put into the
+ * proconfig array. However, because the quoting rules used there
+ * aren't exactly like SQL's, we have to break the list value apart
+ * and then quote the elements as string literals. (The elements may
+ * be double-quoted as-is, but we can't just feed them to the SQL
+ * parser; it would do the wrong thing with elements that are
+ * zero-length or longer than NAMEDATALEN.)
+ *
+ * Variables that are not so marked should just be emitted as simple
+ * string literals. If the variable is not known to
+ * variable_is_guc_list_quote(), we'll do that; this makes it unsafe
+ * to use GUC_LIST_QUOTE for extension variables.
+ */
+ if (variable_is_guc_list_quote(configitem))
+ {
+ char **namelist;
+ char **nameptr;
+
+ /* Parse string into list of identifiers */
+ /* this shouldn't fail really */
+ if (SplitGUCList(pos, ',', &namelist))
+ {
+ for (nameptr = namelist; *nameptr; nameptr++)
+ {
+ if (nameptr != namelist)
+ appendPQExpBufferStr(q, ", ");
+ appendStringLiteralAH(q, *nameptr, fout);
+ }
+ }
+ pg_free(namelist);
+ }
+ else
+ appendStringLiteralAH(q, pos, fout);
+ }
+
+ appendPQExpBuffer(q, "\n %s;\n", asPart->data);
+
+ append_depends_on_extension(fout, q, &finfo->dobj,
+ "pg_catalog.pg_proc", keyword,
+ qual_funcsig);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &finfo->dobj,
+ keyword, funcsig,
+ finfo->dobj.namespace->dobj.name);
+
+ if (finfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, finfo->dobj.catId, finfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = funcsig_tag,
+ .namespace = finfo->dobj.namespace->dobj.name,
+ .owner = finfo->rolname,
+ .description = keyword,
+ .section = finfo->postponed_def ?
+ SECTION_POST_DATA : SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delqry->data));
+
+ /* Dump Function Comments and Security Labels */
+ if (finfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, keyword, funcsig,
+ finfo->dobj.namespace->dobj.name, finfo->rolname,
+ finfo->dobj.catId, 0, finfo->dobj.dumpId);
+
+ if (finfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, keyword, funcsig,
+ finfo->dobj.namespace->dobj.name, finfo->rolname,
+ finfo->dobj.catId, 0, finfo->dobj.dumpId);
+
+ if (finfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, finfo->dobj.dumpId, InvalidDumpId, keyword,
+ funcsig, NULL,
+ finfo->dobj.namespace->dobj.name,
+ finfo->rolname, &finfo->dacl);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(asPart);
+ free(funcsig);
+ free(funcfullsig);
+ free(funcsig_tag);
+ free(qual_funcsig);
+ free(configitems);
+}
+
+
+/*
+ * Dump a user-defined cast
+ */
+static void
+dumpCast(Archive *fout, const CastInfo *cast)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer defqry;
+ PQExpBuffer delqry;
+ PQExpBuffer labelq;
+ PQExpBuffer castargs;
+ FuncInfo *funcInfo = NULL;
+ const char *sourceType;
+ const char *targetType;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Cannot dump if we don't have the cast function's info */
+ if (OidIsValid(cast->castfunc))
+ {
+ funcInfo = findFuncByOid(cast->castfunc);
+ if (funcInfo == NULL)
+ pg_fatal("could not find function definition for function with OID %u",
+ cast->castfunc);
+ }
+
+ defqry = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ labelq = createPQExpBuffer();
+ castargs = createPQExpBuffer();
+
+ sourceType = getFormattedTypeName(fout, cast->castsource, zeroAsNone);
+ targetType = getFormattedTypeName(fout, cast->casttarget, zeroAsNone);
+ appendPQExpBuffer(delqry, "DROP CAST (%s AS %s);\n",
+ sourceType, targetType);
+
+ appendPQExpBuffer(defqry, "CREATE CAST (%s AS %s) ",
+ sourceType, targetType);
+
+ switch (cast->castmethod)
+ {
+ case COERCION_METHOD_BINARY:
+ appendPQExpBufferStr(defqry, "WITHOUT FUNCTION");
+ break;
+ case COERCION_METHOD_INOUT:
+ appendPQExpBufferStr(defqry, "WITH INOUT");
+ break;
+ case COERCION_METHOD_FUNCTION:
+ if (funcInfo)
+ {
+ char *fsig = format_function_signature(fout, funcInfo, true);
+
+ /*
+ * Always qualify the function name (format_function_signature
+ * won't qualify it).
+ */
+ appendPQExpBuffer(defqry, "WITH FUNCTION %s.%s",
+ fmtId(funcInfo->dobj.namespace->dobj.name), fsig);
+ free(fsig);
+ }
+ else
+ pg_log_warning("bogus value in pg_cast.castfunc or pg_cast.castmethod field");
+ break;
+ default:
+ pg_log_warning("bogus value in pg_cast.castmethod field");
+ }
+
+ if (cast->castcontext == 'a')
+ appendPQExpBufferStr(defqry, " AS ASSIGNMENT");
+ else if (cast->castcontext == 'i')
+ appendPQExpBufferStr(defqry, " AS IMPLICIT");
+ appendPQExpBufferStr(defqry, ";\n");
+
+ appendPQExpBuffer(labelq, "CAST (%s AS %s)",
+ sourceType, targetType);
+
+ appendPQExpBuffer(castargs, "(%s AS %s)",
+ sourceType, targetType);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(defqry, &cast->dobj,
+ "CAST", castargs->data, NULL);
+
+ if (cast->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .description = "CAST",
+ .section = SECTION_PRE_DATA,
+ .createStmt = defqry->data,
+ .dropStmt = delqry->data));
+
+ /* Dump Cast Comments */
+ if (cast->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "CAST", castargs->data,
+ NULL, "",
+ cast->dobj.catId, 0, cast->dobj.dumpId);
+
+ destroyPQExpBuffer(defqry);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(labelq);
+ destroyPQExpBuffer(castargs);
+}
+
+/*
+ * Dump a transform
+ */
+static void
+dumpTransform(Archive *fout, const TransformInfo *transform)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer defqry;
+ PQExpBuffer delqry;
+ PQExpBuffer labelq;
+ PQExpBuffer transformargs;
+ FuncInfo *fromsqlFuncInfo = NULL;
+ FuncInfo *tosqlFuncInfo = NULL;
+ char *lanname;
+ const char *transformType;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Cannot dump if we don't have the transform functions' info */
+ if (OidIsValid(transform->trffromsql))
+ {
+ fromsqlFuncInfo = findFuncByOid(transform->trffromsql);
+ if (fromsqlFuncInfo == NULL)
+ pg_fatal("could not find function definition for function with OID %u",
+ transform->trffromsql);
+ }
+ if (OidIsValid(transform->trftosql))
+ {
+ tosqlFuncInfo = findFuncByOid(transform->trftosql);
+ if (tosqlFuncInfo == NULL)
+ pg_fatal("could not find function definition for function with OID %u",
+ transform->trftosql);
+ }
+
+ defqry = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ labelq = createPQExpBuffer();
+ transformargs = createPQExpBuffer();
+
+ lanname = get_language_name(fout, transform->trflang);
+ transformType = getFormattedTypeName(fout, transform->trftype, zeroAsNone);
+
+ appendPQExpBuffer(delqry, "DROP TRANSFORM FOR %s LANGUAGE %s;\n",
+ transformType, lanname);
+
+ appendPQExpBuffer(defqry, "CREATE TRANSFORM FOR %s LANGUAGE %s (",
+ transformType, lanname);
+
+ if (!transform->trffromsql && !transform->trftosql)
+ pg_log_warning("bogus transform definition, at least one of trffromsql and trftosql should be nonzero");
+
+ if (transform->trffromsql)
+ {
+ if (fromsqlFuncInfo)
+ {
+ char *fsig = format_function_signature(fout, fromsqlFuncInfo, true);
+
+ /*
+ * Always qualify the function name (format_function_signature
+ * won't qualify it).
+ */
+ appendPQExpBuffer(defqry, "FROM SQL WITH FUNCTION %s.%s",
+ fmtId(fromsqlFuncInfo->dobj.namespace->dobj.name), fsig);
+ free(fsig);
+ }
+ else
+ pg_log_warning("bogus value in pg_transform.trffromsql field");
+ }
+
+ if (transform->trftosql)
+ {
+ if (transform->trffromsql)
+ appendPQExpBufferStr(defqry, ", ");
+
+ if (tosqlFuncInfo)
+ {
+ char *fsig = format_function_signature(fout, tosqlFuncInfo, true);
+
+ /*
+ * Always qualify the function name (format_function_signature
+ * won't qualify it).
+ */
+ appendPQExpBuffer(defqry, "TO SQL WITH FUNCTION %s.%s",
+ fmtId(tosqlFuncInfo->dobj.namespace->dobj.name), fsig);
+ free(fsig);
+ }
+ else
+ pg_log_warning("bogus value in pg_transform.trftosql field");
+ }
+
+ appendPQExpBufferStr(defqry, ");\n");
+
+ appendPQExpBuffer(labelq, "TRANSFORM FOR %s LANGUAGE %s",
+ transformType, lanname);
+
+ appendPQExpBuffer(transformargs, "FOR %s LANGUAGE %s",
+ transformType, lanname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(defqry, &transform->dobj,
+ "TRANSFORM", transformargs->data, NULL);
+
+ if (transform->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, transform->dobj.catId, transform->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = labelq->data,
+ .description = "TRANSFORM",
+ .section = SECTION_PRE_DATA,
+ .createStmt = defqry->data,
+ .dropStmt = delqry->data,
+ .deps = transform->dobj.dependencies,
+ .nDeps = transform->dobj.nDeps));
+
+ /* Dump Transform Comments */
+ if (transform->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TRANSFORM", transformargs->data,
+ NULL, "",
+ transform->dobj.catId, 0, transform->dobj.dumpId);
+
+ free(lanname);
+ destroyPQExpBuffer(defqry);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(labelq);
+ destroyPQExpBuffer(transformargs);
+}
+
+
+/*
+ * dumpOpr
+ * write out a single operator definition
+ */
+static void
+dumpOpr(Archive *fout, const OprInfo *oprinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer oprid;
+ PQExpBuffer details;
+ PGresult *res;
+ int i_oprkind;
+ int i_oprcode;
+ int i_oprleft;
+ int i_oprright;
+ int i_oprcom;
+ int i_oprnegate;
+ int i_oprrest;
+ int i_oprjoin;
+ int i_oprcanmerge;
+ int i_oprcanhash;
+ char *oprkind;
+ char *oprcode;
+ char *oprleft;
+ char *oprright;
+ char *oprcom;
+ char *oprnegate;
+ char *oprrest;
+ char *oprjoin;
+ char *oprcanmerge;
+ char *oprcanhash;
+ char *oprregproc;
+ char *oprref;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * some operators are invalid because they were the result of user
+ * defining operators before commutators exist
+ */
+ if (!OidIsValid(oprinfo->oprcode))
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ oprid = createPQExpBuffer();
+ details = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPOPR])
+ {
+ /* Set up query for operator-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpOpr(pg_catalog.oid) AS\n"
+ "SELECT oprkind, "
+ "oprcode::pg_catalog.regprocedure, "
+ "oprleft::pg_catalog.regtype, "
+ "oprright::pg_catalog.regtype, "
+ "oprcom, "
+ "oprnegate, "
+ "oprrest::pg_catalog.regprocedure, "
+ "oprjoin::pg_catalog.regprocedure, "
+ "oprcanmerge, oprcanhash "
+ "FROM pg_catalog.pg_operator "
+ "WHERE oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPOPR] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpOpr('%u')",
+ oprinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_oprkind = PQfnumber(res, "oprkind");
+ i_oprcode = PQfnumber(res, "oprcode");
+ i_oprleft = PQfnumber(res, "oprleft");
+ i_oprright = PQfnumber(res, "oprright");
+ i_oprcom = PQfnumber(res, "oprcom");
+ i_oprnegate = PQfnumber(res, "oprnegate");
+ i_oprrest = PQfnumber(res, "oprrest");
+ i_oprjoin = PQfnumber(res, "oprjoin");
+ i_oprcanmerge = PQfnumber(res, "oprcanmerge");
+ i_oprcanhash = PQfnumber(res, "oprcanhash");
+
+ oprkind = PQgetvalue(res, 0, i_oprkind);
+ oprcode = PQgetvalue(res, 0, i_oprcode);
+ oprleft = PQgetvalue(res, 0, i_oprleft);
+ oprright = PQgetvalue(res, 0, i_oprright);
+ oprcom = PQgetvalue(res, 0, i_oprcom);
+ oprnegate = PQgetvalue(res, 0, i_oprnegate);
+ oprrest = PQgetvalue(res, 0, i_oprrest);
+ oprjoin = PQgetvalue(res, 0, i_oprjoin);
+ oprcanmerge = PQgetvalue(res, 0, i_oprcanmerge);
+ oprcanhash = PQgetvalue(res, 0, i_oprcanhash);
+
+ /* In PG14 upwards postfix operator support does not exist anymore. */
+ if (strcmp(oprkind, "r") == 0)
+ pg_log_warning("postfix operators are not supported anymore (operator \"%s\")",
+ oprcode);
+
+ oprregproc = convertRegProcReference(oprcode);
+ if (oprregproc)
+ {
+ appendPQExpBuffer(details, " FUNCTION = %s", oprregproc);
+ free(oprregproc);
+ }
+
+ appendPQExpBuffer(oprid, "%s (",
+ oprinfo->dobj.name);
+
+ /*
+ * right unary means there's a left arg and left unary means there's a
+ * right arg. (Although the "r" case is dead code for PG14 and later,
+ * continue to support it in case we're dumping from an old server.)
+ */
+ if (strcmp(oprkind, "r") == 0 ||
+ strcmp(oprkind, "b") == 0)
+ {
+ appendPQExpBuffer(details, ",\n LEFTARG = %s", oprleft);
+ appendPQExpBufferStr(oprid, oprleft);
+ }
+ else
+ appendPQExpBufferStr(oprid, "NONE");
+
+ if (strcmp(oprkind, "l") == 0 ||
+ strcmp(oprkind, "b") == 0)
+ {
+ appendPQExpBuffer(details, ",\n RIGHTARG = %s", oprright);
+ appendPQExpBuffer(oprid, ", %s)", oprright);
+ }
+ else
+ appendPQExpBufferStr(oprid, ", NONE)");
+
+ oprref = getFormattedOperatorName(oprcom);
+ if (oprref)
+ {
+ appendPQExpBuffer(details, ",\n COMMUTATOR = %s", oprref);
+ free(oprref);
+ }
+
+ oprref = getFormattedOperatorName(oprnegate);
+ if (oprref)
+ {
+ appendPQExpBuffer(details, ",\n NEGATOR = %s", oprref);
+ free(oprref);
+ }
+
+ if (strcmp(oprcanmerge, "t") == 0)
+ appendPQExpBufferStr(details, ",\n MERGES");
+
+ if (strcmp(oprcanhash, "t") == 0)
+ appendPQExpBufferStr(details, ",\n HASHES");
+
+ oprregproc = convertRegProcReference(oprrest);
+ if (oprregproc)
+ {
+ appendPQExpBuffer(details, ",\n RESTRICT = %s", oprregproc);
+ free(oprregproc);
+ }
+
+ oprregproc = convertRegProcReference(oprjoin);
+ if (oprregproc)
+ {
+ appendPQExpBuffer(details, ",\n JOIN = %s", oprregproc);
+ free(oprregproc);
+ }
+
+ appendPQExpBuffer(delq, "DROP OPERATOR %s.%s;\n",
+ fmtId(oprinfo->dobj.namespace->dobj.name),
+ oprid->data);
+
+ appendPQExpBuffer(q, "CREATE OPERATOR %s.%s (\n%s\n);\n",
+ fmtId(oprinfo->dobj.namespace->dobj.name),
+ oprinfo->dobj.name, details->data);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &oprinfo->dobj,
+ "OPERATOR", oprid->data,
+ oprinfo->dobj.namespace->dobj.name);
+
+ if (oprinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, oprinfo->dobj.catId, oprinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = oprinfo->dobj.name,
+ .namespace = oprinfo->dobj.namespace->dobj.name,
+ .owner = oprinfo->rolname,
+ .description = "OPERATOR",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Operator Comments */
+ if (oprinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "OPERATOR", oprid->data,
+ oprinfo->dobj.namespace->dobj.name, oprinfo->rolname,
+ oprinfo->dobj.catId, 0, oprinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(oprid);
+ destroyPQExpBuffer(details);
+}
+
+/*
+ * Convert a function reference obtained from pg_operator
+ *
+ * Returns allocated string of what to print, or NULL if function references
+ * is InvalidOid. Returned string is expected to be free'd by the caller.
+ *
+ * The input is a REGPROCEDURE display; we have to strip the argument-types
+ * part.
+ */
+static char *
+convertRegProcReference(const char *proc)
+{
+ char *name;
+ char *paren;
+ bool inquote;
+
+ /* In all cases "-" means a null reference */
+ if (strcmp(proc, "-") == 0)
+ return NULL;
+
+ name = pg_strdup(proc);
+ /* find non-double-quoted left paren */
+ inquote = false;
+ for (paren = name; *paren; paren++)
+ {
+ if (*paren == '(' && !inquote)
+ {
+ *paren = '\0';
+ break;
+ }
+ if (*paren == '"')
+ inquote = !inquote;
+ }
+ return name;
+}
+
+/*
+ * getFormattedOperatorName - retrieve the operator name for the
+ * given operator OID (presented in string form).
+ *
+ * Returns an allocated string, or NULL if the given OID is invalid.
+ * Caller is responsible for free'ing result string.
+ *
+ * What we produce has the format "OPERATOR(schema.oprname)". This is only
+ * useful in commands where the operator's argument types can be inferred from
+ * context. We always schema-qualify the name, though. The predecessor to
+ * this code tried to skip the schema qualification if possible, but that led
+ * to wrong results in corner cases, such as if an operator and its negator
+ * are in different schemas.
+ */
+static char *
+getFormattedOperatorName(const char *oproid)
+{
+ OprInfo *oprInfo;
+
+ /* In all cases "0" means a null reference */
+ if (strcmp(oproid, "0") == 0)
+ return NULL;
+
+ oprInfo = findOprByOid(atooid(oproid));
+ if (oprInfo == NULL)
+ {
+ pg_log_warning("could not find operator with OID %s",
+ oproid);
+ return NULL;
+ }
+
+ return psprintf("OPERATOR(%s.%s)",
+ fmtId(oprInfo->dobj.namespace->dobj.name),
+ oprInfo->dobj.name);
+}
+
+/*
+ * Convert a function OID obtained from pg_ts_parser or pg_ts_template
+ *
+ * It is sufficient to use REGPROC rather than REGPROCEDURE, since the
+ * argument lists of these functions are predetermined. Note that the
+ * caller should ensure we are in the proper schema, because the results
+ * are search path dependent!
+ */
+static char *
+convertTSFunction(Archive *fout, Oid funcOid)
+{
+ char *result;
+ char query[128];
+ PGresult *res;
+
+ snprintf(query, sizeof(query),
+ "SELECT '%u'::pg_catalog.regproc", funcOid);
+ res = ExecuteSqlQueryForSingleRow(fout, query);
+
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+
+ return result;
+}
+
+/*
+ * dumpAccessMethod
+ * write out a single access method definition
+ */
+static void
+dumpAccessMethod(Archive *fout, const AccessMethodInfo *aminfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qamname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qamname = pg_strdup(fmtId(aminfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE ACCESS METHOD %s ", qamname);
+
+ switch (aminfo->amtype)
+ {
+ case AMTYPE_INDEX:
+ appendPQExpBufferStr(q, "TYPE INDEX ");
+ break;
+ case AMTYPE_TABLE:
+ appendPQExpBufferStr(q, "TYPE TABLE ");
+ break;
+ default:
+ pg_log_warning("invalid type \"%c\" of access method \"%s\"",
+ aminfo->amtype, qamname);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qamname);
+ return;
+ }
+
+ appendPQExpBuffer(q, "HANDLER %s;\n", aminfo->amhandler);
+
+ appendPQExpBuffer(delq, "DROP ACCESS METHOD %s;\n",
+ qamname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &aminfo->dobj,
+ "ACCESS METHOD", qamname, NULL);
+
+ if (aminfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, aminfo->dobj.catId, aminfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = aminfo->dobj.name,
+ .description = "ACCESS METHOD",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Access Method Comments */
+ if (aminfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "ACCESS METHOD", qamname,
+ NULL, "",
+ aminfo->dobj.catId, 0, aminfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qamname);
+}
+
+/*
+ * dumpOpclass
+ * write out a single operator class definition
+ */
+static void
+dumpOpclass(Archive *fout, const OpclassInfo *opcinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer nameusing;
+ PGresult *res;
+ int ntups;
+ int i_opcintype;
+ int i_opckeytype;
+ int i_opcdefault;
+ int i_opcfamily;
+ int i_opcfamilyname;
+ int i_opcfamilynsp;
+ int i_amname;
+ int i_amopstrategy;
+ int i_amopopr;
+ int i_sortfamily;
+ int i_sortfamilynsp;
+ int i_amprocnum;
+ int i_amproc;
+ int i_amproclefttype;
+ int i_amprocrighttype;
+ char *opcintype;
+ char *opckeytype;
+ char *opcdefault;
+ char *opcfamily;
+ char *opcfamilyname;
+ char *opcfamilynsp;
+ char *amname;
+ char *amopstrategy;
+ char *amopopr;
+ char *sortfamily;
+ char *sortfamilynsp;
+ char *amprocnum;
+ char *amproc;
+ char *amproclefttype;
+ char *amprocrighttype;
+ bool needComma;
+ int i;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ nameusing = createPQExpBuffer();
+
+ /* Get additional fields from the pg_opclass row */
+ appendPQExpBuffer(query, "SELECT opcintype::pg_catalog.regtype, "
+ "opckeytype::pg_catalog.regtype, "
+ "opcdefault, opcfamily, "
+ "opfname AS opcfamilyname, "
+ "nspname AS opcfamilynsp, "
+ "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opcmethod) AS amname "
+ "FROM pg_catalog.pg_opclass c "
+ "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = opcfamily "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace "
+ "WHERE c.oid = '%u'::pg_catalog.oid",
+ opcinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_opcintype = PQfnumber(res, "opcintype");
+ i_opckeytype = PQfnumber(res, "opckeytype");
+ i_opcdefault = PQfnumber(res, "opcdefault");
+ i_opcfamily = PQfnumber(res, "opcfamily");
+ i_opcfamilyname = PQfnumber(res, "opcfamilyname");
+ i_opcfamilynsp = PQfnumber(res, "opcfamilynsp");
+ i_amname = PQfnumber(res, "amname");
+
+ /* opcintype may still be needed after we PQclear res */
+ opcintype = pg_strdup(PQgetvalue(res, 0, i_opcintype));
+ opckeytype = PQgetvalue(res, 0, i_opckeytype);
+ opcdefault = PQgetvalue(res, 0, i_opcdefault);
+ /* opcfamily will still be needed after we PQclear res */
+ opcfamily = pg_strdup(PQgetvalue(res, 0, i_opcfamily));
+ opcfamilyname = PQgetvalue(res, 0, i_opcfamilyname);
+ opcfamilynsp = PQgetvalue(res, 0, i_opcfamilynsp);
+ /* amname will still be needed after we PQclear res */
+ amname = pg_strdup(PQgetvalue(res, 0, i_amname));
+
+ appendPQExpBuffer(delq, "DROP OPERATOR CLASS %s",
+ fmtQualifiedDumpable(opcinfo));
+ appendPQExpBuffer(delq, " USING %s;\n",
+ fmtId(amname));
+
+ /* Build the fixed portion of the CREATE command */
+ appendPQExpBuffer(q, "CREATE OPERATOR CLASS %s\n ",
+ fmtQualifiedDumpable(opcinfo));
+ if (strcmp(opcdefault, "t") == 0)
+ appendPQExpBufferStr(q, "DEFAULT ");
+ appendPQExpBuffer(q, "FOR TYPE %s USING %s",
+ opcintype,
+ fmtId(amname));
+ if (strlen(opcfamilyname) > 0)
+ {
+ appendPQExpBufferStr(q, " FAMILY ");
+ appendPQExpBuffer(q, "%s.", fmtId(opcfamilynsp));
+ appendPQExpBufferStr(q, fmtId(opcfamilyname));
+ }
+ appendPQExpBufferStr(q, " AS\n ");
+
+ needComma = false;
+
+ if (strcmp(opckeytype, "-") != 0)
+ {
+ appendPQExpBuffer(q, "STORAGE %s",
+ opckeytype);
+ needComma = true;
+ }
+
+ PQclear(res);
+
+ /*
+ * Now fetch and print the OPERATOR entries (pg_amop rows).
+ *
+ * Print only those opfamily members that are tied to the opclass by
+ * pg_depend entries.
+ */
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "SELECT amopstrategy, "
+ "amopopr::pg_catalog.regoperator, "
+ "opfname AS sortfamily, "
+ "nspname AS sortfamilynsp "
+ "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON "
+ "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) "
+ "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace "
+ "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND amopfamily = '%s'::pg_catalog.oid "
+ "ORDER BY amopstrategy",
+ opcinfo->dobj.catId.oid,
+ opcfamily);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_amopstrategy = PQfnumber(res, "amopstrategy");
+ i_amopopr = PQfnumber(res, "amopopr");
+ i_sortfamily = PQfnumber(res, "sortfamily");
+ i_sortfamilynsp = PQfnumber(res, "sortfamilynsp");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amopstrategy = PQgetvalue(res, i, i_amopstrategy);
+ amopopr = PQgetvalue(res, i, i_amopopr);
+ sortfamily = PQgetvalue(res, i, i_sortfamily);
+ sortfamilynsp = PQgetvalue(res, i, i_sortfamilynsp);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "OPERATOR %s %s",
+ amopstrategy, amopopr);
+
+ if (strlen(sortfamily) > 0)
+ {
+ appendPQExpBufferStr(q, " FOR ORDER BY ");
+ appendPQExpBuffer(q, "%s.", fmtId(sortfamilynsp));
+ appendPQExpBufferStr(q, fmtId(sortfamily));
+ }
+
+ needComma = true;
+ }
+
+ PQclear(res);
+
+ /*
+ * Now fetch and print the FUNCTION entries (pg_amproc rows).
+ *
+ * Print only those opfamily members that are tied to the opclass by
+ * pg_depend entries.
+ *
+ * We print the amproclefttype/amprocrighttype even though in most cases
+ * the backend could deduce the right values, because of the corner case
+ * of a btree sort support function for a cross-type comparison.
+ */
+ resetPQExpBuffer(query);
+
+ appendPQExpBuffer(query, "SELECT amprocnum, "
+ "amproc::pg_catalog.regprocedure, "
+ "amproclefttype::pg_catalog.regtype, "
+ "amprocrighttype::pg_catalog.regtype "
+ "FROM pg_catalog.pg_amproc ap, pg_catalog.pg_depend "
+ "WHERE refclassid = 'pg_catalog.pg_opclass'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND classid = 'pg_catalog.pg_amproc'::pg_catalog.regclass "
+ "AND objid = ap.oid "
+ "ORDER BY amprocnum",
+ opcinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_amprocnum = PQfnumber(res, "amprocnum");
+ i_amproc = PQfnumber(res, "amproc");
+ i_amproclefttype = PQfnumber(res, "amproclefttype");
+ i_amprocrighttype = PQfnumber(res, "amprocrighttype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amprocnum = PQgetvalue(res, i, i_amprocnum);
+ amproc = PQgetvalue(res, i, i_amproc);
+ amproclefttype = PQgetvalue(res, i, i_amproclefttype);
+ amprocrighttype = PQgetvalue(res, i, i_amprocrighttype);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "FUNCTION %s", amprocnum);
+
+ if (*amproclefttype && *amprocrighttype)
+ appendPQExpBuffer(q, " (%s, %s)", amproclefttype, amprocrighttype);
+
+ appendPQExpBuffer(q, " %s", amproc);
+
+ needComma = true;
+ }
+
+ PQclear(res);
+
+ /*
+ * If needComma is still false it means we haven't added anything after
+ * the AS keyword. To avoid printing broken SQL, append a dummy STORAGE
+ * clause with the same datatype. This isn't sanctioned by the
+ * documentation, but actually DefineOpClass will treat it as a no-op.
+ */
+ if (!needComma)
+ appendPQExpBuffer(q, "STORAGE %s", opcintype);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBufferStr(nameusing, fmtId(opcinfo->dobj.name));
+ appendPQExpBuffer(nameusing, " USING %s",
+ fmtId(amname));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &opcinfo->dobj,
+ "OPERATOR CLASS", nameusing->data,
+ opcinfo->dobj.namespace->dobj.name);
+
+ if (opcinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, opcinfo->dobj.catId, opcinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = opcinfo->dobj.name,
+ .namespace = opcinfo->dobj.namespace->dobj.name,
+ .owner = opcinfo->rolname,
+ .description = "OPERATOR CLASS",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Operator Class Comments */
+ if (opcinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "OPERATOR CLASS", nameusing->data,
+ opcinfo->dobj.namespace->dobj.name, opcinfo->rolname,
+ opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
+
+ free(opcintype);
+ free(opcfamily);
+ free(amname);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(nameusing);
+}
+
+/*
+ * dumpOpfamily
+ * write out a single operator family definition
+ *
+ * Note: this also dumps any "loose" operator members that aren't bound to a
+ * specific opclass within the opfamily.
+ */
+static void
+dumpOpfamily(Archive *fout, const OpfamilyInfo *opfinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer nameusing;
+ PGresult *res;
+ PGresult *res_ops;
+ PGresult *res_procs;
+ int ntups;
+ int i_amname;
+ int i_amopstrategy;
+ int i_amopopr;
+ int i_sortfamily;
+ int i_sortfamilynsp;
+ int i_amprocnum;
+ int i_amproc;
+ int i_amproclefttype;
+ int i_amprocrighttype;
+ char *amname;
+ char *amopstrategy;
+ char *amopopr;
+ char *sortfamily;
+ char *sortfamilynsp;
+ char *amprocnum;
+ char *amproc;
+ char *amproclefttype;
+ char *amprocrighttype;
+ bool needComma;
+ int i;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ nameusing = createPQExpBuffer();
+
+ /*
+ * Fetch only those opfamily members that are tied directly to the
+ * opfamily by pg_depend entries.
+ */
+ appendPQExpBuffer(query, "SELECT amopstrategy, "
+ "amopopr::pg_catalog.regoperator, "
+ "opfname AS sortfamily, "
+ "nspname AS sortfamilynsp "
+ "FROM pg_catalog.pg_amop ao JOIN pg_catalog.pg_depend ON "
+ "(classid = 'pg_catalog.pg_amop'::pg_catalog.regclass AND objid = ao.oid) "
+ "LEFT JOIN pg_catalog.pg_opfamily f ON f.oid = amopsortfamily "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = opfnamespace "
+ "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND amopfamily = '%u'::pg_catalog.oid "
+ "ORDER BY amopstrategy",
+ opfinfo->dobj.catId.oid,
+ opfinfo->dobj.catId.oid);
+
+ res_ops = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ resetPQExpBuffer(query);
+
+ appendPQExpBuffer(query, "SELECT amprocnum, "
+ "amproc::pg_catalog.regprocedure, "
+ "amproclefttype::pg_catalog.regtype, "
+ "amprocrighttype::pg_catalog.regtype "
+ "FROM pg_catalog.pg_amproc ap, pg_catalog.pg_depend "
+ "WHERE refclassid = 'pg_catalog.pg_opfamily'::pg_catalog.regclass "
+ "AND refobjid = '%u'::pg_catalog.oid "
+ "AND classid = 'pg_catalog.pg_amproc'::pg_catalog.regclass "
+ "AND objid = ap.oid "
+ "ORDER BY amprocnum",
+ opfinfo->dobj.catId.oid);
+
+ res_procs = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ /* Get additional fields from the pg_opfamily row */
+ resetPQExpBuffer(query);
+
+ appendPQExpBuffer(query, "SELECT "
+ "(SELECT amname FROM pg_catalog.pg_am WHERE oid = opfmethod) AS amname "
+ "FROM pg_catalog.pg_opfamily "
+ "WHERE oid = '%u'::pg_catalog.oid",
+ opfinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_amname = PQfnumber(res, "amname");
+
+ /* amname will still be needed after we PQclear res */
+ amname = pg_strdup(PQgetvalue(res, 0, i_amname));
+
+ appendPQExpBuffer(delq, "DROP OPERATOR FAMILY %s",
+ fmtQualifiedDumpable(opfinfo));
+ appendPQExpBuffer(delq, " USING %s;\n",
+ fmtId(amname));
+
+ /* Build the fixed portion of the CREATE command */
+ appendPQExpBuffer(q, "CREATE OPERATOR FAMILY %s",
+ fmtQualifiedDumpable(opfinfo));
+ appendPQExpBuffer(q, " USING %s;\n",
+ fmtId(amname));
+
+ PQclear(res);
+
+ /* Do we need an ALTER to add loose members? */
+ if (PQntuples(res_ops) > 0 || PQntuples(res_procs) > 0)
+ {
+ appendPQExpBuffer(q, "ALTER OPERATOR FAMILY %s",
+ fmtQualifiedDumpable(opfinfo));
+ appendPQExpBuffer(q, " USING %s ADD\n ",
+ fmtId(amname));
+
+ needComma = false;
+
+ /*
+ * Now fetch and print the OPERATOR entries (pg_amop rows).
+ */
+ ntups = PQntuples(res_ops);
+
+ i_amopstrategy = PQfnumber(res_ops, "amopstrategy");
+ i_amopopr = PQfnumber(res_ops, "amopopr");
+ i_sortfamily = PQfnumber(res_ops, "sortfamily");
+ i_sortfamilynsp = PQfnumber(res_ops, "sortfamilynsp");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amopstrategy = PQgetvalue(res_ops, i, i_amopstrategy);
+ amopopr = PQgetvalue(res_ops, i, i_amopopr);
+ sortfamily = PQgetvalue(res_ops, i, i_sortfamily);
+ sortfamilynsp = PQgetvalue(res_ops, i, i_sortfamilynsp);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "OPERATOR %s %s",
+ amopstrategy, amopopr);
+
+ if (strlen(sortfamily) > 0)
+ {
+ appendPQExpBufferStr(q, " FOR ORDER BY ");
+ appendPQExpBuffer(q, "%s.", fmtId(sortfamilynsp));
+ appendPQExpBufferStr(q, fmtId(sortfamily));
+ }
+
+ needComma = true;
+ }
+
+ /*
+ * Now fetch and print the FUNCTION entries (pg_amproc rows).
+ */
+ ntups = PQntuples(res_procs);
+
+ i_amprocnum = PQfnumber(res_procs, "amprocnum");
+ i_amproc = PQfnumber(res_procs, "amproc");
+ i_amproclefttype = PQfnumber(res_procs, "amproclefttype");
+ i_amprocrighttype = PQfnumber(res_procs, "amprocrighttype");
+
+ for (i = 0; i < ntups; i++)
+ {
+ amprocnum = PQgetvalue(res_procs, i, i_amprocnum);
+ amproc = PQgetvalue(res_procs, i, i_amproc);
+ amproclefttype = PQgetvalue(res_procs, i, i_amproclefttype);
+ amprocrighttype = PQgetvalue(res_procs, i, i_amprocrighttype);
+
+ if (needComma)
+ appendPQExpBufferStr(q, " ,\n ");
+
+ appendPQExpBuffer(q, "FUNCTION %s (%s, %s) %s",
+ amprocnum, amproclefttype, amprocrighttype,
+ amproc);
+
+ needComma = true;
+ }
+
+ appendPQExpBufferStr(q, ";\n");
+ }
+
+ appendPQExpBufferStr(nameusing, fmtId(opfinfo->dobj.name));
+ appendPQExpBuffer(nameusing, " USING %s",
+ fmtId(amname));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &opfinfo->dobj,
+ "OPERATOR FAMILY", nameusing->data,
+ opfinfo->dobj.namespace->dobj.name);
+
+ if (opfinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, opfinfo->dobj.catId, opfinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = opfinfo->dobj.name,
+ .namespace = opfinfo->dobj.namespace->dobj.name,
+ .owner = opfinfo->rolname,
+ .description = "OPERATOR FAMILY",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Operator Family Comments */
+ if (opfinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "OPERATOR FAMILY", nameusing->data,
+ opfinfo->dobj.namespace->dobj.name, opfinfo->rolname,
+ opfinfo->dobj.catId, 0, opfinfo->dobj.dumpId);
+
+ free(amname);
+ PQclear(res_ops);
+ PQclear(res_procs);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(nameusing);
+}
+
+/*
+ * dumpCollation
+ * write out a single collation definition
+ */
+static void
+dumpCollation(Archive *fout, const CollInfo *collinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qcollname;
+ PGresult *res;
+ int i_collprovider;
+ int i_collisdeterministic;
+ int i_collcollate;
+ int i_collctype;
+ int i_colliculocale;
+ int i_collicurules;
+ const char *collprovider;
+ const char *collcollate;
+ const char *collctype;
+ const char *colliculocale;
+ const char *collicurules;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qcollname = pg_strdup(fmtId(collinfo->dobj.name));
+
+ /* Get collation-specific details */
+ appendPQExpBufferStr(query, "SELECT ");
+
+ if (fout->remoteVersion >= 100000)
+ appendPQExpBufferStr(query,
+ "collprovider, "
+ "collversion, ");
+ else
+ appendPQExpBufferStr(query,
+ "'c' AS collprovider, "
+ "NULL AS collversion, ");
+
+ if (fout->remoteVersion >= 120000)
+ appendPQExpBufferStr(query,
+ "collisdeterministic, ");
+ else
+ appendPQExpBufferStr(query,
+ "true AS collisdeterministic, ");
+
+ if (fout->remoteVersion >= 150000)
+ appendPQExpBufferStr(query,
+ "colliculocale, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS colliculocale, ");
+
+ if (fout->remoteVersion >= 160000)
+ appendPQExpBufferStr(query,
+ "collicurules, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS collicurules, ");
+
+ appendPQExpBuffer(query,
+ "collcollate, "
+ "collctype "
+ "FROM pg_catalog.pg_collation c "
+ "WHERE c.oid = '%u'::pg_catalog.oid",
+ collinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_collprovider = PQfnumber(res, "collprovider");
+ i_collisdeterministic = PQfnumber(res, "collisdeterministic");
+ i_collcollate = PQfnumber(res, "collcollate");
+ i_collctype = PQfnumber(res, "collctype");
+ i_colliculocale = PQfnumber(res, "colliculocale");
+ i_collicurules = PQfnumber(res, "collicurules");
+
+ collprovider = PQgetvalue(res, 0, i_collprovider);
+
+ if (!PQgetisnull(res, 0, i_collcollate))
+ collcollate = PQgetvalue(res, 0, i_collcollate);
+ else
+ collcollate = NULL;
+
+ if (!PQgetisnull(res, 0, i_collctype))
+ collctype = PQgetvalue(res, 0, i_collctype);
+ else
+ collctype = NULL;
+
+ /*
+ * Before version 15, collcollate and collctype were of type NAME and
+ * non-nullable. Treat empty strings as NULL for consistency.
+ */
+ if (fout->remoteVersion < 150000)
+ {
+ if (collcollate[0] == '\0')
+ collcollate = NULL;
+ if (collctype[0] == '\0')
+ collctype = NULL;
+ }
+
+ if (!PQgetisnull(res, 0, i_colliculocale))
+ colliculocale = PQgetvalue(res, 0, i_colliculocale);
+ else
+ colliculocale = NULL;
+
+ if (!PQgetisnull(res, 0, i_collicurules))
+ collicurules = PQgetvalue(res, 0, i_collicurules);
+ else
+ collicurules = NULL;
+
+ appendPQExpBuffer(delq, "DROP COLLATION %s;\n",
+ fmtQualifiedDumpable(collinfo));
+
+ appendPQExpBuffer(q, "CREATE COLLATION %s (",
+ fmtQualifiedDumpable(collinfo));
+
+ appendPQExpBufferStr(q, "provider = ");
+ if (collprovider[0] == 'c')
+ appendPQExpBufferStr(q, "libc");
+ else if (collprovider[0] == 'i')
+ appendPQExpBufferStr(q, "icu");
+ else if (collprovider[0] == 'd')
+ /* to allow dumping pg_catalog; not accepted on input */
+ appendPQExpBufferStr(q, "default");
+ else
+ pg_fatal("unrecognized collation provider: %s",
+ collprovider);
+
+ if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0)
+ appendPQExpBufferStr(q, ", deterministic = false");
+
+ if (collprovider[0] == 'd')
+ {
+ if (collcollate || collctype || colliculocale || collicurules)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ /* no locale -- the default collation cannot be reloaded anyway */
+ }
+ else if (collprovider[0] == 'i')
+ {
+ if (fout->remoteVersion >= 150000)
+ {
+ if (collcollate || collctype || !colliculocale)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ appendPQExpBufferStr(q, ", locale = ");
+ appendStringLiteralAH(q, colliculocale ? colliculocale : "",
+ fout);
+ }
+ else
+ {
+ if (!collcollate || !collctype || colliculocale ||
+ strcmp(collcollate, collctype) != 0)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ appendPQExpBufferStr(q, ", locale = ");
+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
+ }
+
+ if (collicurules)
+ {
+ appendPQExpBufferStr(q, ", rules = ");
+ appendStringLiteralAH(q, collicurules ? collicurules : "", fout);
+ }
+ }
+ else if (collprovider[0] == 'c')
+ {
+ if (colliculocale || collicurules || !collcollate || !collctype)
+ pg_log_warning("invalid collation \"%s\"", qcollname);
+
+ if (collcollate && collctype && strcmp(collcollate, collctype) == 0)
+ {
+ appendPQExpBufferStr(q, ", locale = ");
+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
+ }
+ else
+ {
+ appendPQExpBufferStr(q, ", lc_collate = ");
+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
+ appendPQExpBufferStr(q, ", lc_ctype = ");
+ appendStringLiteralAH(q, collctype ? collctype : "", fout);
+ }
+ }
+ else
+ pg_fatal("unrecognized collation provider: %s", collprovider);
+
+ /*
+ * For binary upgrade, carry over the collation version. For normal
+ * dump/restore, omit the version, so that it is computed upon restore.
+ */
+ if (dopt->binary_upgrade)
+ {
+ int i_collversion;
+
+ i_collversion = PQfnumber(res, "collversion");
+ if (!PQgetisnull(res, 0, i_collversion))
+ {
+ appendPQExpBufferStr(q, ", version = ");
+ appendStringLiteralAH(q,
+ PQgetvalue(res, 0, i_collversion),
+ fout);
+ }
+ }
+
+ appendPQExpBufferStr(q, ");\n");
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &collinfo->dobj,
+ "COLLATION", qcollname,
+ collinfo->dobj.namespace->dobj.name);
+
+ if (collinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, collinfo->dobj.catId, collinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = collinfo->dobj.name,
+ .namespace = collinfo->dobj.namespace->dobj.name,
+ .owner = collinfo->rolname,
+ .description = "COLLATION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Collation Comments */
+ if (collinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "COLLATION", qcollname,
+ collinfo->dobj.namespace->dobj.name, collinfo->rolname,
+ collinfo->dobj.catId, 0, collinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qcollname);
+}
+
+/*
+ * dumpConversion
+ * write out a single conversion definition
+ */
+static void
+dumpConversion(Archive *fout, const ConvInfo *convinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qconvname;
+ PGresult *res;
+ int i_conforencoding;
+ int i_contoencoding;
+ int i_conproc;
+ int i_condefault;
+ const char *conforencoding;
+ const char *contoencoding;
+ const char *conproc;
+ bool condefault;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qconvname = pg_strdup(fmtId(convinfo->dobj.name));
+
+ /* Get conversion-specific details */
+ appendPQExpBuffer(query, "SELECT "
+ "pg_catalog.pg_encoding_to_char(conforencoding) AS conforencoding, "
+ "pg_catalog.pg_encoding_to_char(contoencoding) AS contoencoding, "
+ "conproc, condefault "
+ "FROM pg_catalog.pg_conversion c "
+ "WHERE c.oid = '%u'::pg_catalog.oid",
+ convinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_conforencoding = PQfnumber(res, "conforencoding");
+ i_contoencoding = PQfnumber(res, "contoencoding");
+ i_conproc = PQfnumber(res, "conproc");
+ i_condefault = PQfnumber(res, "condefault");
+
+ conforencoding = PQgetvalue(res, 0, i_conforencoding);
+ contoencoding = PQgetvalue(res, 0, i_contoencoding);
+ conproc = PQgetvalue(res, 0, i_conproc);
+ condefault = (PQgetvalue(res, 0, i_condefault)[0] == 't');
+
+ appendPQExpBuffer(delq, "DROP CONVERSION %s;\n",
+ fmtQualifiedDumpable(convinfo));
+
+ appendPQExpBuffer(q, "CREATE %sCONVERSION %s FOR ",
+ (condefault) ? "DEFAULT " : "",
+ fmtQualifiedDumpable(convinfo));
+ appendStringLiteralAH(q, conforencoding, fout);
+ appendPQExpBufferStr(q, " TO ");
+ appendStringLiteralAH(q, contoencoding, fout);
+ /* regproc output is already sufficiently quoted */
+ appendPQExpBuffer(q, " FROM %s;\n", conproc);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &convinfo->dobj,
+ "CONVERSION", qconvname,
+ convinfo->dobj.namespace->dobj.name);
+
+ if (convinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, convinfo->dobj.catId, convinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = convinfo->dobj.name,
+ .namespace = convinfo->dobj.namespace->dobj.name,
+ .owner = convinfo->rolname,
+ .description = "CONVERSION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Conversion Comments */
+ if (convinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "CONVERSION", qconvname,
+ convinfo->dobj.namespace->dobj.name, convinfo->rolname,
+ convinfo->dobj.catId, 0, convinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qconvname);
+}
+
+/*
+ * format_aggregate_signature: generate aggregate name and argument list
+ *
+ * The argument type names are qualified if needed. The aggregate name
+ * is never qualified.
+ */
+static char *
+format_aggregate_signature(const AggInfo *agginfo, Archive *fout, bool honor_quotes)
+{
+ PQExpBufferData buf;
+ int j;
+
+ initPQExpBuffer(&buf);
+ if (honor_quotes)
+ appendPQExpBufferStr(&buf, fmtId(agginfo->aggfn.dobj.name));
+ else
+ appendPQExpBufferStr(&buf, agginfo->aggfn.dobj.name);
+
+ if (agginfo->aggfn.nargs == 0)
+ appendPQExpBufferStr(&buf, "(*)");
+ else
+ {
+ appendPQExpBufferChar(&buf, '(');
+ for (j = 0; j < agginfo->aggfn.nargs; j++)
+ appendPQExpBuffer(&buf, "%s%s",
+ (j > 0) ? ", " : "",
+ getFormattedTypeName(fout,
+ agginfo->aggfn.argtypes[j],
+ zeroIsError));
+ appendPQExpBufferChar(&buf, ')');
+ }
+ return buf.data;
+}
+
+/*
+ * dumpAgg
+ * write out a single aggregate definition
+ */
+static void
+dumpAgg(Archive *fout, const AggInfo *agginfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer details;
+ char *aggsig; /* identity signature */
+ char *aggfullsig = NULL; /* full signature */
+ char *aggsig_tag;
+ PGresult *res;
+ int i_agginitval;
+ int i_aggminitval;
+ const char *aggtransfn;
+ const char *aggfinalfn;
+ const char *aggcombinefn;
+ const char *aggserialfn;
+ const char *aggdeserialfn;
+ const char *aggmtransfn;
+ const char *aggminvtransfn;
+ const char *aggmfinalfn;
+ bool aggfinalextra;
+ bool aggmfinalextra;
+ char aggfinalmodify;
+ char aggmfinalmodify;
+ const char *aggsortop;
+ char *aggsortconvop;
+ char aggkind;
+ const char *aggtranstype;
+ const char *aggtransspace;
+ const char *aggmtranstype;
+ const char *aggmtransspace;
+ const char *agginitval;
+ const char *aggminitval;
+ const char *proparallel;
+ char defaultfinalmodify;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ details = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPAGG])
+ {
+ /* Set up query for aggregate-specific details */
+ appendPQExpBufferStr(query,
+ "PREPARE dumpAgg(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(query,
+ "SELECT "
+ "aggtransfn,\n"
+ "aggfinalfn,\n"
+ "aggtranstype::pg_catalog.regtype,\n"
+ "agginitval,\n"
+ "aggsortop,\n"
+ "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
+ "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
+
+ if (fout->remoteVersion >= 90400)
+ appendPQExpBufferStr(query,
+ "aggkind,\n"
+ "aggmtransfn,\n"
+ "aggminvtransfn,\n"
+ "aggmfinalfn,\n"
+ "aggmtranstype::pg_catalog.regtype,\n"
+ "aggfinalextra,\n"
+ "aggmfinalextra,\n"
+ "aggtransspace,\n"
+ "aggmtransspace,\n"
+ "aggminitval,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'n' AS aggkind,\n"
+ "'-' AS aggmtransfn,\n"
+ "'-' AS aggminvtransfn,\n"
+ "'-' AS aggmfinalfn,\n"
+ "0 AS aggmtranstype,\n"
+ "false AS aggfinalextra,\n"
+ "false AS aggmfinalextra,\n"
+ "0 AS aggtransspace,\n"
+ "0 AS aggmtransspace,\n"
+ "NULL AS aggminitval,\n");
+
+ if (fout->remoteVersion >= 90600)
+ appendPQExpBufferStr(query,
+ "aggcombinefn,\n"
+ "aggserialfn,\n"
+ "aggdeserialfn,\n"
+ "proparallel,\n");
+ else
+ appendPQExpBufferStr(query,
+ "'-' AS aggcombinefn,\n"
+ "'-' AS aggserialfn,\n"
+ "'-' AS aggdeserialfn,\n"
+ "'u' AS proparallel,\n");
+
+ if (fout->remoteVersion >= 110000)
+ appendPQExpBufferStr(query,
+ "aggfinalmodify,\n"
+ "aggmfinalmodify\n");
+ else
+ appendPQExpBufferStr(query,
+ "'0' AS aggfinalmodify,\n"
+ "'0' AS aggmfinalmodify\n");
+
+ appendPQExpBufferStr(query,
+ "FROM pg_catalog.pg_aggregate a, pg_catalog.pg_proc p "
+ "WHERE a.aggfnoid = p.oid "
+ "AND p.oid = $1");
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_DUMPAGG] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE dumpAgg('%u')",
+ agginfo->aggfn.dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ i_agginitval = PQfnumber(res, "agginitval");
+ i_aggminitval = PQfnumber(res, "aggminitval");
+
+ aggtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggtransfn"));
+ aggfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggfinalfn"));
+ aggcombinefn = PQgetvalue(res, 0, PQfnumber(res, "aggcombinefn"));
+ aggserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggserialfn"));
+ aggdeserialfn = PQgetvalue(res, 0, PQfnumber(res, "aggdeserialfn"));
+ aggmtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggmtransfn"));
+ aggminvtransfn = PQgetvalue(res, 0, PQfnumber(res, "aggminvtransfn"));
+ aggmfinalfn = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalfn"));
+ aggfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggfinalextra"))[0] == 't');
+ aggmfinalextra = (PQgetvalue(res, 0, PQfnumber(res, "aggmfinalextra"))[0] == 't');
+ aggfinalmodify = PQgetvalue(res, 0, PQfnumber(res, "aggfinalmodify"))[0];
+ aggmfinalmodify = PQgetvalue(res, 0, PQfnumber(res, "aggmfinalmodify"))[0];
+ aggsortop = PQgetvalue(res, 0, PQfnumber(res, "aggsortop"));
+ aggkind = PQgetvalue(res, 0, PQfnumber(res, "aggkind"))[0];
+ aggtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggtranstype"));
+ aggtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggtransspace"));
+ aggmtranstype = PQgetvalue(res, 0, PQfnumber(res, "aggmtranstype"));
+ aggmtransspace = PQgetvalue(res, 0, PQfnumber(res, "aggmtransspace"));
+ agginitval = PQgetvalue(res, 0, i_agginitval);
+ aggminitval = PQgetvalue(res, 0, i_aggminitval);
+ proparallel = PQgetvalue(res, 0, PQfnumber(res, "proparallel"));
+
+ {
+ char *funcargs;
+ char *funciargs;
+
+ funcargs = PQgetvalue(res, 0, PQfnumber(res, "funcargs"));
+ funciargs = PQgetvalue(res, 0, PQfnumber(res, "funciargs"));
+ aggfullsig = format_function_arguments(&agginfo->aggfn, funcargs, true);
+ aggsig = format_function_arguments(&agginfo->aggfn, funciargs, true);
+ }
+
+ aggsig_tag = format_aggregate_signature(agginfo, fout, false);
+
+ /* identify default modify flag for aggkind (must match DefineAggregate) */
+ defaultfinalmodify = (aggkind == AGGKIND_NORMAL) ? AGGMODIFY_READ_ONLY : AGGMODIFY_READ_WRITE;
+ /* replace omitted flags for old versions */
+ if (aggfinalmodify == '0')
+ aggfinalmodify = defaultfinalmodify;
+ if (aggmfinalmodify == '0')
+ aggmfinalmodify = defaultfinalmodify;
+
+ /* regproc and regtype output is already sufficiently quoted */
+ appendPQExpBuffer(details, " SFUNC = %s,\n STYPE = %s",
+ aggtransfn, aggtranstype);
+
+ if (strcmp(aggtransspace, "0") != 0)
+ {
+ appendPQExpBuffer(details, ",\n SSPACE = %s",
+ aggtransspace);
+ }
+
+ if (!PQgetisnull(res, 0, i_agginitval))
+ {
+ appendPQExpBufferStr(details, ",\n INITCOND = ");
+ appendStringLiteralAH(details, agginitval, fout);
+ }
+
+ if (strcmp(aggfinalfn, "-") != 0)
+ {
+ appendPQExpBuffer(details, ",\n FINALFUNC = %s",
+ aggfinalfn);
+ if (aggfinalextra)
+ appendPQExpBufferStr(details, ",\n FINALFUNC_EXTRA");
+ if (aggfinalmodify != defaultfinalmodify)
+ {
+ switch (aggfinalmodify)
+ {
+ case AGGMODIFY_READ_ONLY:
+ appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = READ_ONLY");
+ break;
+ case AGGMODIFY_SHAREABLE:
+ appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = SHAREABLE");
+ break;
+ case AGGMODIFY_READ_WRITE:
+ appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = READ_WRITE");
+ break;
+ default:
+ pg_fatal("unrecognized aggfinalmodify value for aggregate \"%s\"",
+ agginfo->aggfn.dobj.name);
+ break;
+ }
+ }
+ }
+
+ if (strcmp(aggcombinefn, "-") != 0)
+ appendPQExpBuffer(details, ",\n COMBINEFUNC = %s", aggcombinefn);
+
+ if (strcmp(aggserialfn, "-") != 0)
+ appendPQExpBuffer(details, ",\n SERIALFUNC = %s", aggserialfn);
+
+ if (strcmp(aggdeserialfn, "-") != 0)
+ appendPQExpBuffer(details, ",\n DESERIALFUNC = %s", aggdeserialfn);
+
+ if (strcmp(aggmtransfn, "-") != 0)
+ {
+ appendPQExpBuffer(details, ",\n MSFUNC = %s,\n MINVFUNC = %s,\n MSTYPE = %s",
+ aggmtransfn,
+ aggminvtransfn,
+ aggmtranstype);
+ }
+
+ if (strcmp(aggmtransspace, "0") != 0)
+ {
+ appendPQExpBuffer(details, ",\n MSSPACE = %s",
+ aggmtransspace);
+ }
+
+ if (!PQgetisnull(res, 0, i_aggminitval))
+ {
+ appendPQExpBufferStr(details, ",\n MINITCOND = ");
+ appendStringLiteralAH(details, aggminitval, fout);
+ }
+
+ if (strcmp(aggmfinalfn, "-") != 0)
+ {
+ appendPQExpBuffer(details, ",\n MFINALFUNC = %s",
+ aggmfinalfn);
+ if (aggmfinalextra)
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_EXTRA");
+ if (aggmfinalmodify != defaultfinalmodify)
+ {
+ switch (aggmfinalmodify)
+ {
+ case AGGMODIFY_READ_ONLY:
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = READ_ONLY");
+ break;
+ case AGGMODIFY_SHAREABLE:
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = SHAREABLE");
+ break;
+ case AGGMODIFY_READ_WRITE:
+ appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = READ_WRITE");
+ break;
+ default:
+ pg_fatal("unrecognized aggmfinalmodify value for aggregate \"%s\"",
+ agginfo->aggfn.dobj.name);
+ break;
+ }
+ }
+ }
+
+ aggsortconvop = getFormattedOperatorName(aggsortop);
+ if (aggsortconvop)
+ {
+ appendPQExpBuffer(details, ",\n SORTOP = %s",
+ aggsortconvop);
+ free(aggsortconvop);
+ }
+
+ if (aggkind == AGGKIND_HYPOTHETICAL)
+ appendPQExpBufferStr(details, ",\n HYPOTHETICAL");
+
+ if (proparallel[0] != PROPARALLEL_UNSAFE)
+ {
+ if (proparallel[0] == PROPARALLEL_SAFE)
+ appendPQExpBufferStr(details, ",\n PARALLEL = safe");
+ else if (proparallel[0] == PROPARALLEL_RESTRICTED)
+ appendPQExpBufferStr(details, ",\n PARALLEL = restricted");
+ else if (proparallel[0] != PROPARALLEL_UNSAFE)
+ pg_fatal("unrecognized proparallel value for function \"%s\"",
+ agginfo->aggfn.dobj.name);
+ }
+
+ appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n",
+ fmtId(agginfo->aggfn.dobj.namespace->dobj.name),
+ aggsig);
+
+ appendPQExpBuffer(q, "CREATE AGGREGATE %s.%s (\n%s\n);\n",
+ fmtId(agginfo->aggfn.dobj.namespace->dobj.name),
+ aggfullsig ? aggfullsig : aggsig, details->data);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &agginfo->aggfn.dobj,
+ "AGGREGATE", aggsig,
+ agginfo->aggfn.dobj.namespace->dobj.name);
+
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, agginfo->aggfn.dobj.catId,
+ agginfo->aggfn.dobj.dumpId,
+ ARCHIVE_OPTS(.tag = aggsig_tag,
+ .namespace = agginfo->aggfn.dobj.namespace->dobj.name,
+ .owner = agginfo->aggfn.rolname,
+ .description = "AGGREGATE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Aggregate Comments */
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "AGGREGATE", aggsig,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ agginfo->aggfn.rolname,
+ agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
+
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "AGGREGATE", aggsig,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ agginfo->aggfn.rolname,
+ agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
+
+ /*
+ * Since there is no GRANT ON AGGREGATE syntax, we have to make the ACL
+ * command look like a function's GRANT; in particular this affects the
+ * syntax for zero-argument aggregates and ordered-set aggregates.
+ */
+ free(aggsig);
+
+ aggsig = format_function_signature(fout, &agginfo->aggfn, true);
+
+ if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, agginfo->aggfn.dobj.dumpId, InvalidDumpId,
+ "FUNCTION", aggsig, NULL,
+ agginfo->aggfn.dobj.namespace->dobj.name,
+ agginfo->aggfn.rolname, &agginfo->aggfn.dacl);
+
+ free(aggsig);
+ free(aggfullsig);
+ free(aggsig_tag);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(details);
+}
+
+/*
+ * dumpTSParser
+ * write out a single text search parser
+ */
+static void
+dumpTSParser(Archive *fout, const TSParserInfo *prsinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qprsname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qprsname = pg_strdup(fmtId(prsinfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH PARSER %s (\n",
+ fmtQualifiedDumpable(prsinfo));
+
+ appendPQExpBuffer(q, " START = %s,\n",
+ convertTSFunction(fout, prsinfo->prsstart));
+ appendPQExpBuffer(q, " GETTOKEN = %s,\n",
+ convertTSFunction(fout, prsinfo->prstoken));
+ appendPQExpBuffer(q, " END = %s,\n",
+ convertTSFunction(fout, prsinfo->prsend));
+ if (prsinfo->prsheadline != InvalidOid)
+ appendPQExpBuffer(q, " HEADLINE = %s,\n",
+ convertTSFunction(fout, prsinfo->prsheadline));
+ appendPQExpBuffer(q, " LEXTYPES = %s );\n",
+ convertTSFunction(fout, prsinfo->prslextype));
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH PARSER %s;\n",
+ fmtQualifiedDumpable(prsinfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &prsinfo->dobj,
+ "TEXT SEARCH PARSER", qprsname,
+ prsinfo->dobj.namespace->dobj.name);
+
+ if (prsinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, prsinfo->dobj.catId, prsinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = prsinfo->dobj.name,
+ .namespace = prsinfo->dobj.namespace->dobj.name,
+ .description = "TEXT SEARCH PARSER",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Parser Comments */
+ if (prsinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH PARSER", qprsname,
+ prsinfo->dobj.namespace->dobj.name, "",
+ prsinfo->dobj.catId, 0, prsinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qprsname);
+}
+
+/*
+ * dumpTSDictionary
+ * write out a single text search dictionary
+ */
+static void
+dumpTSDictionary(Archive *fout, const TSDictInfo *dictinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qdictname;
+ PGresult *res;
+ char *nspname;
+ char *tmplname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qdictname = pg_strdup(fmtId(dictinfo->dobj.name));
+
+ /* Fetch name and namespace of the dictionary's template */
+ appendPQExpBuffer(query, "SELECT nspname, tmplname "
+ "FROM pg_ts_template p, pg_namespace n "
+ "WHERE p.oid = '%u' AND n.oid = tmplnamespace",
+ dictinfo->dicttemplate);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ nspname = PQgetvalue(res, 0, 0);
+ tmplname = PQgetvalue(res, 0, 1);
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH DICTIONARY %s (\n",
+ fmtQualifiedDumpable(dictinfo));
+
+ appendPQExpBufferStr(q, " TEMPLATE = ");
+ appendPQExpBuffer(q, "%s.", fmtId(nspname));
+ appendPQExpBufferStr(q, fmtId(tmplname));
+
+ PQclear(res);
+
+ /* the dictinitoption can be dumped straight into the command */
+ if (dictinfo->dictinitoption)
+ appendPQExpBuffer(q, ",\n %s", dictinfo->dictinitoption);
+
+ appendPQExpBufferStr(q, " );\n");
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH DICTIONARY %s;\n",
+ fmtQualifiedDumpable(dictinfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &dictinfo->dobj,
+ "TEXT SEARCH DICTIONARY", qdictname,
+ dictinfo->dobj.namespace->dobj.name);
+
+ if (dictinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, dictinfo->dobj.catId, dictinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = dictinfo->dobj.name,
+ .namespace = dictinfo->dobj.namespace->dobj.name,
+ .owner = dictinfo->rolname,
+ .description = "TEXT SEARCH DICTIONARY",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Dictionary Comments */
+ if (dictinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH DICTIONARY", qdictname,
+ dictinfo->dobj.namespace->dobj.name, dictinfo->rolname,
+ dictinfo->dobj.catId, 0, dictinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qdictname);
+}
+
+/*
+ * dumpTSTemplate
+ * write out a single text search template
+ */
+static void
+dumpTSTemplate(Archive *fout, const TSTemplateInfo *tmplinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qtmplname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qtmplname = pg_strdup(fmtId(tmplinfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH TEMPLATE %s (\n",
+ fmtQualifiedDumpable(tmplinfo));
+
+ if (tmplinfo->tmplinit != InvalidOid)
+ appendPQExpBuffer(q, " INIT = %s,\n",
+ convertTSFunction(fout, tmplinfo->tmplinit));
+ appendPQExpBuffer(q, " LEXIZE = %s );\n",
+ convertTSFunction(fout, tmplinfo->tmpllexize));
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH TEMPLATE %s;\n",
+ fmtQualifiedDumpable(tmplinfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tmplinfo->dobj,
+ "TEXT SEARCH TEMPLATE", qtmplname,
+ tmplinfo->dobj.namespace->dobj.name);
+
+ if (tmplinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tmplinfo->dobj.catId, tmplinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tmplinfo->dobj.name,
+ .namespace = tmplinfo->dobj.namespace->dobj.name,
+ .description = "TEXT SEARCH TEMPLATE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Template Comments */
+ if (tmplinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH TEMPLATE", qtmplname,
+ tmplinfo->dobj.namespace->dobj.name, "",
+ tmplinfo->dobj.catId, 0, tmplinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qtmplname);
+}
+
+/*
+ * dumpTSConfig
+ * write out a single text search configuration
+ */
+static void
+dumpTSConfig(Archive *fout, const TSConfigInfo *cfginfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qcfgname;
+ PGresult *res;
+ char *nspname;
+ char *prsname;
+ int ntups,
+ i;
+ int i_tokenname;
+ int i_dictname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qcfgname = pg_strdup(fmtId(cfginfo->dobj.name));
+
+ /* Fetch name and namespace of the config's parser */
+ appendPQExpBuffer(query, "SELECT nspname, prsname "
+ "FROM pg_ts_parser p, pg_namespace n "
+ "WHERE p.oid = '%u' AND n.oid = prsnamespace",
+ cfginfo->cfgparser);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ nspname = PQgetvalue(res, 0, 0);
+ prsname = PQgetvalue(res, 0, 1);
+
+ appendPQExpBuffer(q, "CREATE TEXT SEARCH CONFIGURATION %s (\n",
+ fmtQualifiedDumpable(cfginfo));
+
+ appendPQExpBuffer(q, " PARSER = %s.", fmtId(nspname));
+ appendPQExpBuffer(q, "%s );\n", fmtId(prsname));
+
+ PQclear(res);
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query,
+ "SELECT\n"
+ " ( SELECT alias FROM pg_catalog.ts_token_type('%u'::pg_catalog.oid) AS t\n"
+ " WHERE t.tokid = m.maptokentype ) AS tokenname,\n"
+ " m.mapdict::pg_catalog.regdictionary AS dictname\n"
+ "FROM pg_catalog.pg_ts_config_map AS m\n"
+ "WHERE m.mapcfg = '%u'\n"
+ "ORDER BY m.mapcfg, m.maptokentype, m.mapseqno",
+ cfginfo->cfgparser, cfginfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ ntups = PQntuples(res);
+
+ i_tokenname = PQfnumber(res, "tokenname");
+ i_dictname = PQfnumber(res, "dictname");
+
+ for (i = 0; i < ntups; i++)
+ {
+ char *tokenname = PQgetvalue(res, i, i_tokenname);
+ char *dictname = PQgetvalue(res, i, i_dictname);
+
+ if (i == 0 ||
+ strcmp(tokenname, PQgetvalue(res, i - 1, i_tokenname)) != 0)
+ {
+ /* starting a new token type, so start a new command */
+ if (i > 0)
+ appendPQExpBufferStr(q, ";\n");
+ appendPQExpBuffer(q, "\nALTER TEXT SEARCH CONFIGURATION %s\n",
+ fmtQualifiedDumpable(cfginfo));
+ /* tokenname needs quoting, dictname does NOT */
+ appendPQExpBuffer(q, " ADD MAPPING FOR %s WITH %s",
+ fmtId(tokenname), dictname);
+ }
+ else
+ appendPQExpBuffer(q, ", %s", dictname);
+ }
+
+ if (ntups > 0)
+ appendPQExpBufferStr(q, ";\n");
+
+ PQclear(res);
+
+ appendPQExpBuffer(delq, "DROP TEXT SEARCH CONFIGURATION %s;\n",
+ fmtQualifiedDumpable(cfginfo));
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &cfginfo->dobj,
+ "TEXT SEARCH CONFIGURATION", qcfgname,
+ cfginfo->dobj.namespace->dobj.name);
+
+ if (cfginfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, cfginfo->dobj.catId, cfginfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = cfginfo->dobj.name,
+ .namespace = cfginfo->dobj.namespace->dobj.name,
+ .owner = cfginfo->rolname,
+ .description = "TEXT SEARCH CONFIGURATION",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Configuration Comments */
+ if (cfginfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "TEXT SEARCH CONFIGURATION", qcfgname,
+ cfginfo->dobj.namespace->dobj.name, cfginfo->rolname,
+ cfginfo->dobj.catId, 0, cfginfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qcfgname);
+}
+
+/*
+ * dumpForeignDataWrapper
+ * write out a single foreign-data wrapper definition
+ */
+static void
+dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qfdwname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qfdwname = pg_strdup(fmtId(fdwinfo->dobj.name));
+
+ appendPQExpBuffer(q, "CREATE FOREIGN DATA WRAPPER %s",
+ qfdwname);
+
+ if (strcmp(fdwinfo->fdwhandler, "-") != 0)
+ appendPQExpBuffer(q, " HANDLER %s", fdwinfo->fdwhandler);
+
+ if (strcmp(fdwinfo->fdwvalidator, "-") != 0)
+ appendPQExpBuffer(q, " VALIDATOR %s", fdwinfo->fdwvalidator);
+
+ if (strlen(fdwinfo->fdwoptions) > 0)
+ appendPQExpBuffer(q, " OPTIONS (\n %s\n)", fdwinfo->fdwoptions);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBuffer(delq, "DROP FOREIGN DATA WRAPPER %s;\n",
+ qfdwname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &fdwinfo->dobj,
+ "FOREIGN DATA WRAPPER", qfdwname,
+ NULL);
+
+ if (fdwinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = fdwinfo->dobj.name,
+ .owner = fdwinfo->rolname,
+ .description = "FOREIGN DATA WRAPPER",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Foreign Data Wrapper Comments */
+ if (fdwinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "FOREIGN DATA WRAPPER", qfdwname,
+ NULL, fdwinfo->rolname,
+ fdwinfo->dobj.catId, 0, fdwinfo->dobj.dumpId);
+
+ /* Handle the ACL */
+ if (fdwinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, fdwinfo->dobj.dumpId, InvalidDumpId,
+ "FOREIGN DATA WRAPPER", qfdwname, NULL,
+ NULL, fdwinfo->rolname, &fdwinfo->dacl);
+
+ free(qfdwname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpForeignServer
+ * write out a foreign server definition
+ */
+static void
+dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ PGresult *res;
+ char *qsrvname;
+ char *fdwname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qsrvname = pg_strdup(fmtId(srvinfo->dobj.name));
+
+ /* look up the foreign-data wrapper */
+ appendPQExpBuffer(query, "SELECT fdwname "
+ "FROM pg_foreign_data_wrapper w "
+ "WHERE w.oid = '%u'",
+ srvinfo->srvfdw);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ fdwname = PQgetvalue(res, 0, 0);
+
+ appendPQExpBuffer(q, "CREATE SERVER %s", qsrvname);
+ if (srvinfo->srvtype && strlen(srvinfo->srvtype) > 0)
+ {
+ appendPQExpBufferStr(q, " TYPE ");
+ appendStringLiteralAH(q, srvinfo->srvtype, fout);
+ }
+ if (srvinfo->srvversion && strlen(srvinfo->srvversion) > 0)
+ {
+ appendPQExpBufferStr(q, " VERSION ");
+ appendStringLiteralAH(q, srvinfo->srvversion, fout);
+ }
+
+ appendPQExpBufferStr(q, " FOREIGN DATA WRAPPER ");
+ appendPQExpBufferStr(q, fmtId(fdwname));
+
+ if (srvinfo->srvoptions && strlen(srvinfo->srvoptions) > 0)
+ appendPQExpBuffer(q, " OPTIONS (\n %s\n)", srvinfo->srvoptions);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ appendPQExpBuffer(delq, "DROP SERVER %s;\n",
+ qsrvname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &srvinfo->dobj,
+ "SERVER", qsrvname, NULL);
+
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = srvinfo->dobj.name,
+ .owner = srvinfo->rolname,
+ .description = "SERVER",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Foreign Server Comments */
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "SERVER", qsrvname,
+ NULL, srvinfo->rolname,
+ srvinfo->dobj.catId, 0, srvinfo->dobj.dumpId);
+
+ /* Handle the ACL */
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ dumpACL(fout, srvinfo->dobj.dumpId, InvalidDumpId,
+ "FOREIGN SERVER", qsrvname, NULL,
+ NULL, srvinfo->rolname, &srvinfo->dacl);
+
+ /* Dump user mappings */
+ if (srvinfo->dobj.dump & DUMP_COMPONENT_USERMAP)
+ dumpUserMappings(fout,
+ srvinfo->dobj.name, NULL,
+ srvinfo->rolname,
+ srvinfo->dobj.catId, srvinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ free(qsrvname);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpUserMappings
+ *
+ * This routine is used to dump any user mappings associated with the
+ * server handed to this routine. Should be called after ArchiveEntry()
+ * for the server.
+ */
+static void
+dumpUserMappings(Archive *fout,
+ const char *servername, const char *namespace,
+ const char *owner,
+ CatalogId catalogId, DumpId dumpId)
+{
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ PQExpBuffer tag;
+ PGresult *res;
+ int ntups;
+ int i_usename;
+ int i_umoptions;
+ int i;
+
+ q = createPQExpBuffer();
+ tag = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ /*
+ * We read from the publicly accessible view pg_user_mappings, so as not
+ * to fail if run by a non-superuser. Note that the view will show
+ * umoptions as null if the user hasn't got privileges for the associated
+ * server; this means that pg_dump will dump such a mapping, but with no
+ * OPTIONS clause. A possible alternative is to skip such mappings
+ * altogether, but it's not clear that that's an improvement.
+ */
+ appendPQExpBuffer(query,
+ "SELECT usename, "
+ "array_to_string(ARRAY("
+ "SELECT quote_ident(option_name) || ' ' || "
+ "quote_literal(option_value) "
+ "FROM pg_options_to_table(umoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS umoptions "
+ "FROM pg_user_mappings "
+ "WHERE srvid = '%u' "
+ "ORDER BY usename",
+ catalogId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+ i_usename = PQfnumber(res, "usename");
+ i_umoptions = PQfnumber(res, "umoptions");
+
+ for (i = 0; i < ntups; i++)
+ {
+ char *usename;
+ char *umoptions;
+
+ usename = PQgetvalue(res, i, i_usename);
+ umoptions = PQgetvalue(res, i, i_umoptions);
+
+ resetPQExpBuffer(q);
+ appendPQExpBuffer(q, "CREATE USER MAPPING FOR %s", fmtId(usename));
+ appendPQExpBuffer(q, " SERVER %s", fmtId(servername));
+
+ if (umoptions && strlen(umoptions) > 0)
+ appendPQExpBuffer(q, " OPTIONS (\n %s\n)", umoptions);
+
+ appendPQExpBufferStr(q, ";\n");
+
+ resetPQExpBuffer(delq);
+ appendPQExpBuffer(delq, "DROP USER MAPPING FOR %s", fmtId(usename));
+ appendPQExpBuffer(delq, " SERVER %s;\n", fmtId(servername));
+
+ resetPQExpBuffer(tag);
+ appendPQExpBuffer(tag, "USER MAPPING %s SERVER %s",
+ usename, servername);
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = namespace,
+ .owner = owner,
+ .description = "USER MAPPING",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(tag);
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * Write out default privileges information
+ */
+static void
+dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer tag;
+ const char *type;
+
+ /* Do nothing in data-only dump, or if we're skipping ACLs */
+ if (dopt->dataOnly || dopt->aclsSkip)
+ return;
+
+ q = createPQExpBuffer();
+ tag = createPQExpBuffer();
+
+ switch (daclinfo->defaclobjtype)
+ {
+ case DEFACLOBJ_RELATION:
+ type = "TABLES";
+ break;
+ case DEFACLOBJ_SEQUENCE:
+ type = "SEQUENCES";
+ break;
+ case DEFACLOBJ_FUNCTION:
+ type = "FUNCTIONS";
+ break;
+ case DEFACLOBJ_TYPE:
+ type = "TYPES";
+ break;
+ case DEFACLOBJ_NAMESPACE:
+ type = "SCHEMAS";
+ break;
+ default:
+ /* shouldn't get here */
+ pg_fatal("unrecognized object type in default privileges: %d",
+ (int) daclinfo->defaclobjtype);
+ type = ""; /* keep compiler quiet */
+ }
+
+ appendPQExpBuffer(tag, "DEFAULT PRIVILEGES FOR %s", type);
+
+ /* build the actual command(s) for this tuple */
+ if (!buildDefaultACLCommands(type,
+ daclinfo->dobj.namespace != NULL ?
+ daclinfo->dobj.namespace->dobj.name : NULL,
+ daclinfo->dacl.acl,
+ daclinfo->dacl.acldefault,
+ daclinfo->defaclrole,
+ fout->remoteVersion,
+ q))
+ pg_fatal("could not parse default ACL list (%s)",
+ daclinfo->dacl.acl);
+
+ if (daclinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ ArchiveEntry(fout, daclinfo->dobj.catId, daclinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = daclinfo->dobj.namespace ?
+ daclinfo->dobj.namespace->dobj.name : NULL,
+ .owner = daclinfo->defaclrole,
+ .description = "DEFAULT ACL",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data));
+
+ destroyPQExpBuffer(tag);
+ destroyPQExpBuffer(q);
+}
+
+/*----------
+ * Write out grant/revoke information
+ *
+ * 'objDumpId' is the dump ID of the underlying object.
+ * 'altDumpId' can be a second dumpId that the ACL entry must also depend on,
+ * or InvalidDumpId if there is no need for a second dependency.
+ * 'type' must be one of
+ * TABLE, SEQUENCE, FUNCTION, LANGUAGE, SCHEMA, DATABASE, TABLESPACE,
+ * FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT.
+ * 'name' is the formatted name of the object. Must be quoted etc. already.
+ * 'subname' is the formatted name of the sub-object, if any. Must be quoted.
+ * (Currently we assume that subname is only provided for table columns.)
+ * 'nspname' is the namespace the object is in (NULL if none).
+ * 'owner' is the owner, NULL if there is no owner (for languages).
+ * 'dacl' is the DumpableAcl struct fpr the object.
+ *
+ * Returns the dump ID assigned to the ACL TocEntry, or InvalidDumpId if
+ * no ACL entry was created.
+ *----------
+ */
+static DumpId
+dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId,
+ const char *type, const char *name, const char *subname,
+ const char *nspname, const char *owner,
+ const DumpableAcl *dacl)
+{
+ DumpId aclDumpId = InvalidDumpId;
+ DumpOptions *dopt = fout->dopt;
+ const char *acls = dacl->acl;
+ const char *acldefault = dacl->acldefault;
+ char privtype = dacl->privtype;
+ const char *initprivs = dacl->initprivs;
+ const char *baseacls;
+ PQExpBuffer sql;
+
+ /* Do nothing if ACL dump is not enabled */
+ if (dopt->aclsSkip)
+ return InvalidDumpId;
+
+ /* --data-only skips ACLs *except* large object ACLs */
+ if (dopt->dataOnly && strcmp(type, "LARGE OBJECT") != 0)
+ return InvalidDumpId;
+
+ sql = createPQExpBuffer();
+
+ /*
+ * In binary upgrade mode, we don't run an extension's script but instead
+ * dump out the objects independently and then recreate them. To preserve
+ * any initial privileges which were set on extension objects, we need to
+ * compute the set of GRANT and REVOKE commands necessary to get from the
+ * default privileges of an object to its initial privileges as recorded
+ * in pg_init_privs.
+ *
+ * At restore time, we apply these commands after having called
+ * binary_upgrade_set_record_init_privs(true). That tells the backend to
+ * copy the results into pg_init_privs. This is how we preserve the
+ * contents of that catalog across binary upgrades.
+ */
+ if (dopt->binary_upgrade && privtype == 'e' &&
+ initprivs && *initprivs != '\0')
+ {
+ appendPQExpBufferStr(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(true);\n");
+ if (!buildACLCommands(name, subname, nspname, type,
+ initprivs, acldefault, owner,
+ "", fout->remoteVersion, sql))
+ pg_fatal("could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)",
+ initprivs, acldefault, name, type);
+ appendPQExpBufferStr(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\n");
+ }
+
+ /*
+ * Now figure the GRANT and REVOKE commands needed to get to the object's
+ * actual current ACL, starting from the initprivs if given, else from the
+ * object-type-specific default. Also, while buildACLCommands will assume
+ * that a NULL/empty acls string means it needn't do anything, what that
+ * actually represents is the object-type-specific default; so we need to
+ * substitute the acldefault string to get the right results in that case.
+ */
+ if (initprivs && *initprivs != '\0')
+ {
+ baseacls = initprivs;
+ if (acls == NULL || *acls == '\0')
+ acls = acldefault;
+ }
+ else
+ baseacls = acldefault;
+
+ if (!buildACLCommands(name, subname, nspname, type,
+ acls, baseacls, owner,
+ "", fout->remoteVersion, sql))
+ pg_fatal("could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)",
+ acls, baseacls, name, type);
+
+ if (sql->len > 0)
+ {
+ PQExpBuffer tag = createPQExpBuffer();
+ DumpId aclDeps[2];
+ int nDeps = 0;
+
+ if (subname)
+ appendPQExpBuffer(tag, "COLUMN %s.%s", name, subname);
+ else
+ appendPQExpBuffer(tag, "%s %s", type, name);
+
+ aclDeps[nDeps++] = objDumpId;
+ if (altDumpId != InvalidDumpId)
+ aclDeps[nDeps++] = altDumpId;
+
+ aclDumpId = createDumpId();
+
+ ArchiveEntry(fout, nilCatalogId, aclDumpId,
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = nspname,
+ .owner = owner,
+ .description = "ACL",
+ .section = SECTION_NONE,
+ .createStmt = sql->data,
+ .deps = aclDeps,
+ .nDeps = nDeps));
+
+ destroyPQExpBuffer(tag);
+ }
+
+ destroyPQExpBuffer(sql);
+
+ return aclDumpId;
+}
+
+/*
+ * dumpSecLabel
+ *
+ * This routine is used to dump any security labels associated with the
+ * object handed to this routine. The routine takes the object type
+ * and object name (ready to print, except for schema decoration), plus
+ * the namespace and owner of the object (for labeling the ArchiveEntry),
+ * plus catalog ID and subid which are the lookup key for pg_seclabel,
+ * plus the dump ID for the object (for setting a dependency).
+ * If a matching pg_seclabel entry is found, it is dumped.
+ *
+ * Note: although this routine takes a dumpId for dependency purposes,
+ * that purpose is just to mark the dependency in the emitted dump file
+ * for possible future use by pg_restore. We do NOT use it for determining
+ * ordering of the label in the dump file, because this routine is called
+ * after dependency sorting occurs. This routine should be called just after
+ * calling ArchiveEntry() for the specified object.
+ */
+static void
+dumpSecLabel(Archive *fout, const char *type, const char *name,
+ const char *namespace, const char *owner,
+ CatalogId catalogId, int subid, DumpId dumpId)
+{
+ DumpOptions *dopt = fout->dopt;
+ SecLabelItem *labels;
+ int nlabels;
+ int i;
+ PQExpBuffer query;
+
+ /* do nothing, if --no-security-labels is supplied */
+ if (dopt->no_security_labels)
+ return;
+
+ /*
+ * Security labels are schema not data ... except large object labels are
+ * data
+ */
+ if (strcmp(type, "LARGE OBJECT") != 0)
+ {
+ if (dopt->dataOnly)
+ return;
+ }
+ else
+ {
+ /* We do dump large object security labels in binary-upgrade mode */
+ if (dopt->schemaOnly && !dopt->binary_upgrade)
+ return;
+ }
+
+ /* Search for security labels associated with catalogId, using table */
+ nlabels = findSecLabels(catalogId.tableoid, catalogId.oid, &labels);
+
+ query = createPQExpBuffer();
+
+ for (i = 0; i < nlabels; i++)
+ {
+ /*
+ * Ignore label entries for which the subid doesn't match.
+ */
+ if (labels[i].objsubid != subid)
+ continue;
+
+ appendPQExpBuffer(query,
+ "SECURITY LABEL FOR %s ON %s ",
+ fmtId(labels[i].provider), type);
+ if (namespace && *namespace)
+ appendPQExpBuffer(query, "%s.", fmtId(namespace));
+ appendPQExpBuffer(query, "%s IS ", name);
+ appendStringLiteralAH(query, labels[i].label, fout);
+ appendPQExpBufferStr(query, ";\n");
+ }
+
+ if (query->len > 0)
+ {
+ PQExpBuffer tag = createPQExpBuffer();
+
+ appendPQExpBuffer(tag, "%s %s", type, name);
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tag->data,
+ .namespace = namespace,
+ .owner = owner,
+ .description = "SECURITY LABEL",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &dumpId,
+ .nDeps = 1));
+ destroyPQExpBuffer(tag);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpTableSecLabel
+ *
+ * As above, but dump security label for both the specified table (or view)
+ * and its columns.
+ */
+static void
+dumpTableSecLabel(Archive *fout, const TableInfo *tbinfo, const char *reltypename)
+{
+ DumpOptions *dopt = fout->dopt;
+ SecLabelItem *labels;
+ int nlabels;
+ int i;
+ PQExpBuffer query;
+ PQExpBuffer target;
+
+ /* do nothing, if --no-security-labels is supplied */
+ if (dopt->no_security_labels)
+ return;
+
+ /* SecLabel are SCHEMA not data */
+ if (dopt->dataOnly)
+ return;
+
+ /* Search for comments associated with relation, using table */
+ nlabels = findSecLabels(tbinfo->dobj.catId.tableoid,
+ tbinfo->dobj.catId.oid,
+ &labels);
+
+ /* If security labels exist, build SECURITY LABEL statements */
+ if (nlabels <= 0)
+ return;
+
+ query = createPQExpBuffer();
+ target = createPQExpBuffer();
+
+ for (i = 0; i < nlabels; i++)
+ {
+ const char *colname;
+ const char *provider = labels[i].provider;
+ const char *label = labels[i].label;
+ int objsubid = labels[i].objsubid;
+
+ resetPQExpBuffer(target);
+ if (objsubid == 0)
+ {
+ appendPQExpBuffer(target, "%s %s", reltypename,
+ fmtQualifiedDumpable(tbinfo));
+ }
+ else
+ {
+ colname = getAttrName(objsubid, tbinfo);
+ /* first fmtXXX result must be consumed before calling again */
+ appendPQExpBuffer(target, "COLUMN %s",
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(target, ".%s", fmtId(colname));
+ }
+ appendPQExpBuffer(query, "SECURITY LABEL FOR %s ON %s IS ",
+ fmtId(provider), target->data);
+ appendStringLiteralAH(query, label, fout);
+ appendPQExpBufferStr(query, ";\n");
+ }
+ if (query->len > 0)
+ {
+ resetPQExpBuffer(target);
+ appendPQExpBuffer(target, "%s %s", reltypename,
+ fmtId(tbinfo->dobj.name));
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = target->data,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SECURITY LABEL",
+ .section = SECTION_NONE,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(target);
+}
+
+/*
+ * findSecLabels
+ *
+ * Find the security label(s), if any, associated with the given object.
+ * All the objsubid values associated with the given classoid/objoid are
+ * found with one search.
+ */
+static int
+findSecLabels(Oid classoid, Oid objoid, SecLabelItem **items)
+{
+ SecLabelItem *middle = NULL;
+ SecLabelItem *low;
+ SecLabelItem *high;
+ int nmatch;
+
+ if (nseclabels <= 0) /* no labels, so no match is possible */
+ {
+ *items = NULL;
+ return 0;
+ }
+
+ /*
+ * Do binary search to find some item matching the object.
+ */
+ low = &seclabels[0];
+ high = &seclabels[nseclabels - 1];
+ while (low <= high)
+ {
+ middle = low + (high - low) / 2;
+
+ if (classoid < middle->classoid)
+ high = middle - 1;
+ else if (classoid > middle->classoid)
+ low = middle + 1;
+ else if (objoid < middle->objoid)
+ high = middle - 1;
+ else if (objoid > middle->objoid)
+ low = middle + 1;
+ else
+ break; /* found a match */
+ }
+
+ if (low > high) /* no matches */
+ {
+ *items = NULL;
+ return 0;
+ }
+
+ /*
+ * Now determine how many items match the object. The search loop
+ * invariant still holds: only items between low and high inclusive could
+ * match.
+ */
+ nmatch = 1;
+ while (middle > low)
+ {
+ if (classoid != middle[-1].classoid ||
+ objoid != middle[-1].objoid)
+ break;
+ middle--;
+ nmatch++;
+ }
+
+ *items = middle;
+
+ middle += nmatch;
+ while (middle <= high)
+ {
+ if (classoid != middle->classoid ||
+ objoid != middle->objoid)
+ break;
+ middle++;
+ nmatch++;
+ }
+
+ return nmatch;
+}
+
+/*
+ * collectSecLabels
+ *
+ * Construct a table of all security labels available for database objects;
+ * also set the has-seclabel component flag for each relevant object.
+ *
+ * The table is sorted by classoid/objid/objsubid for speed in lookup.
+ */
+static void
+collectSecLabels(Archive *fout)
+{
+ PGresult *res;
+ PQExpBuffer query;
+ int i_label;
+ int i_provider;
+ int i_classoid;
+ int i_objoid;
+ int i_objsubid;
+ int ntups;
+ int i;
+ DumpableObject *dobj;
+
+ query = createPQExpBuffer();
+
+ appendPQExpBufferStr(query,
+ "SELECT label, provider, classoid, objoid, objsubid "
+ "FROM pg_catalog.pg_seclabel "
+ "ORDER BY classoid, objoid, objsubid");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ /* Construct lookup table containing OIDs in numeric form */
+ i_label = PQfnumber(res, "label");
+ i_provider = PQfnumber(res, "provider");
+ i_classoid = PQfnumber(res, "classoid");
+ i_objoid = PQfnumber(res, "objoid");
+ i_objsubid = PQfnumber(res, "objsubid");
+
+ ntups = PQntuples(res);
+
+ seclabels = (SecLabelItem *) pg_malloc(ntups * sizeof(SecLabelItem));
+ nseclabels = 0;
+ dobj = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ int subid;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classoid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objoid));
+ subid = atoi(PQgetvalue(res, i, i_objsubid));
+
+ /* We needn't remember labels that don't match any dumpable object */
+ if (dobj == NULL ||
+ dobj->catId.tableoid != objId.tableoid ||
+ dobj->catId.oid != objId.oid)
+ dobj = findObjectByCatalogId(objId);
+ if (dobj == NULL)
+ continue;
+
+ /*
+ * Labels on columns of composite types are linked to the type's
+ * pg_class entry, but we need to set the DUMP_COMPONENT_SECLABEL flag
+ * in the type's own DumpableObject.
+ */
+ if (subid != 0 && dobj->objType == DO_TABLE &&
+ ((TableInfo *) dobj)->relkind == RELKIND_COMPOSITE_TYPE)
+ {
+ TypeInfo *cTypeInfo;
+
+ cTypeInfo = findTypeByOid(((TableInfo *) dobj)->reltype);
+ if (cTypeInfo)
+ cTypeInfo->dobj.components |= DUMP_COMPONENT_SECLABEL;
+ }
+ else
+ dobj->components |= DUMP_COMPONENT_SECLABEL;
+
+ seclabels[nseclabels].label = pg_strdup(PQgetvalue(res, i, i_label));
+ seclabels[nseclabels].provider = pg_strdup(PQgetvalue(res, i, i_provider));
+ seclabels[nseclabels].classoid = objId.tableoid;
+ seclabels[nseclabels].objoid = objId.oid;
+ seclabels[nseclabels].objsubid = subid;
+ nseclabels++;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpTable
+ * write out to fout the declarations (not data) of a user-defined table
+ */
+static void
+dumpTable(Archive *fout, const TableInfo *tbinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ DumpId tableAclDumpId = InvalidDumpId;
+ char *namecopy;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ if (tbinfo->relkind == RELKIND_SEQUENCE)
+ dumpSequence(fout, tbinfo);
+ else
+ dumpTableSchema(fout, tbinfo);
+ }
+
+ /* Handle the ACL here */
+ namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_ACL)
+ {
+ const char *objtype =
+ (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" : "TABLE";
+
+ tableAclDumpId =
+ dumpACL(fout, tbinfo->dobj.dumpId, InvalidDumpId,
+ objtype, namecopy, NULL,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ &tbinfo->dacl);
+ }
+
+ /*
+ * Handle column ACLs, if any. Note: we pull these with a separate query
+ * rather than trying to fetch them during getTableAttrs, so that we won't
+ * miss ACLs on system columns. Doing it this way also allows us to dump
+ * ACLs for catalogs that we didn't mark "interesting" back in getTables.
+ */
+ if ((tbinfo->dobj.dump & DUMP_COMPONENT_ACL) && tbinfo->hascolumnACLs)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i;
+
+ if (!fout->is_prepared[PREPQUERY_GETCOLUMNACLS])
+ {
+ /* Set up query for column ACLs */
+ appendPQExpBufferStr(query,
+ "PREPARE getColumnACLs(pg_catalog.oid) AS\n");
+
+ if (fout->remoteVersion >= 90600)
+ {
+ /*
+ * In principle we should call acldefault('c', relowner) to
+ * get the default ACL for a column. However, we don't
+ * currently store the numeric OID of the relowner in
+ * TableInfo. We could convert the owner name using regrole,
+ * but that creates a risk of failure due to concurrent role
+ * renames. Given that the default ACL for columns is empty
+ * and is likely to stay that way, it's not worth extra cycles
+ * and risk to avoid hard-wiring that knowledge here.
+ */
+ appendPQExpBufferStr(query,
+ "SELECT at.attname, "
+ "at.attacl, "
+ "'{}' AS acldefault, "
+ "pip.privtype, pip.initprivs "
+ "FROM pg_catalog.pg_attribute at "
+ "LEFT JOIN pg_catalog.pg_init_privs pip ON "
+ "(at.attrelid = pip.objoid "
+ "AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass "
+ "AND at.attnum = pip.objsubid) "
+ "WHERE at.attrelid = $1 AND "
+ "NOT at.attisdropped "
+ "AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) "
+ "ORDER BY at.attnum");
+ }
+ else
+ {
+ appendPQExpBufferStr(query,
+ "SELECT attname, attacl, '{}' AS acldefault, "
+ "NULL AS privtype, NULL AS initprivs "
+ "FROM pg_catalog.pg_attribute "
+ "WHERE attrelid = $1 AND NOT attisdropped "
+ "AND attacl IS NOT NULL "
+ "ORDER BY attnum");
+ }
+
+ ExecuteSqlStatement(fout, query->data);
+
+ fout->is_prepared[PREPQUERY_GETCOLUMNACLS] = true;
+ }
+
+ printfPQExpBuffer(query,
+ "EXECUTE getColumnACLs('%u')",
+ tbinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *attname = PQgetvalue(res, i, 0);
+ char *attacl = PQgetvalue(res, i, 1);
+ char *acldefault = PQgetvalue(res, i, 2);
+ char privtype = *(PQgetvalue(res, i, 3));
+ char *initprivs = PQgetvalue(res, i, 4);
+ DumpableAcl coldacl;
+ char *attnamecopy;
+
+ coldacl.acl = attacl;
+ coldacl.acldefault = acldefault;
+ coldacl.privtype = privtype;
+ coldacl.initprivs = initprivs;
+ attnamecopy = pg_strdup(fmtId(attname));
+
+ /*
+ * Column's GRANT type is always TABLE. Each column ACL depends
+ * on the table-level ACL, since we can restore column ACLs in
+ * parallel but the table-level ACL has to be done first.
+ */
+ dumpACL(fout, tbinfo->dobj.dumpId, tableAclDumpId,
+ "TABLE", namecopy, attnamecopy,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ &coldacl);
+ free(attnamecopy);
+ }
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ }
+
+ free(namecopy);
+}
+
+/*
+ * Create the AS clause for a view or materialized view. The semicolon is
+ * stripped because a materialized view must add a WITH NO DATA clause.
+ *
+ * This returns a new buffer which must be freed by the caller.
+ */
+static PQExpBuffer
+createViewAsClause(Archive *fout, const TableInfo *tbinfo)
+{
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer result = createPQExpBuffer();
+ PGresult *res;
+ int len;
+
+ /* Fetch the view definition */
+ appendPQExpBuffer(query,
+ "SELECT pg_catalog.pg_get_viewdef('%u'::pg_catalog.oid) AS viewdef",
+ tbinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ {
+ if (PQntuples(res) < 1)
+ pg_fatal("query to obtain definition of view \"%s\" returned no data",
+ tbinfo->dobj.name);
+ else
+ pg_fatal("query to obtain definition of view \"%s\" returned more than one definition",
+ tbinfo->dobj.name);
+ }
+
+ len = PQgetlength(res, 0, 0);
+
+ if (len == 0)
+ pg_fatal("definition of view \"%s\" appears to be empty (length zero)",
+ tbinfo->dobj.name);
+
+ /* Strip off the trailing semicolon so that other things may follow. */
+ Assert(PQgetvalue(res, 0, 0)[len - 1] == ';');
+ appendBinaryPQExpBuffer(result, PQgetvalue(res, 0, 0), len - 1);
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ return result;
+}
+
+/*
+ * Create a dummy AS clause for a view. This is used when the real view
+ * definition has to be postponed because of circular dependencies.
+ * We must duplicate the view's external properties -- column names and types
+ * (including collation) -- so that it works for subsequent references.
+ *
+ * This returns a new buffer which must be freed by the caller.
+ */
+static PQExpBuffer
+createDummyViewAsClause(Archive *fout, const TableInfo *tbinfo)
+{
+ PQExpBuffer result = createPQExpBuffer();
+ int j;
+
+ appendPQExpBufferStr(result, "SELECT");
+
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ if (j > 0)
+ appendPQExpBufferChar(result, ',');
+ appendPQExpBufferStr(result, "\n ");
+
+ appendPQExpBuffer(result, "NULL::%s", tbinfo->atttypnames[j]);
+
+ /*
+ * Must add collation if not default for the type, because CREATE OR
+ * REPLACE VIEW won't change it
+ */
+ if (OidIsValid(tbinfo->attcollation[j]))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(tbinfo->attcollation[j]);
+ if (coll)
+ appendPQExpBuffer(result, " COLLATE %s",
+ fmtQualifiedDumpable(coll));
+ }
+
+ appendPQExpBuffer(result, " AS %s", fmtId(tbinfo->attnames[j]));
+ }
+
+ return result;
+}
+
+/*
+ * dumpTableSchema
+ * write the declaration (not data) of one user-defined table or view
+ */
+static void
+dumpTableSchema(Archive *fout, const TableInfo *tbinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q = createPQExpBuffer();
+ PQExpBuffer delq = createPQExpBuffer();
+ char *qrelname;
+ char *qualrelname;
+ int numParents;
+ TableInfo **parents;
+ int actual_atts; /* number of attrs in this CREATE statement */
+ const char *reltypename;
+ char *storage;
+ int j,
+ k;
+
+ /* We had better have loaded per-column details about this table */
+ Assert(tbinfo->interesting);
+
+ qrelname = pg_strdup(fmtId(tbinfo->dobj.name));
+ qualrelname = pg_strdup(fmtQualifiedDumpable(tbinfo));
+
+ if (tbinfo->hasoids)
+ pg_log_warning("WITH OIDS is not supported anymore (table \"%s\")",
+ qrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_type_oids_by_rel(fout, q, tbinfo);
+
+ /* Is it a table or a view? */
+ if (tbinfo->relkind == RELKIND_VIEW)
+ {
+ PQExpBuffer result;
+
+ /*
+ * Note: keep this code in sync with the is_view case in dumpRule()
+ */
+
+ reltypename = "VIEW";
+
+ appendPQExpBuffer(delq, "DROP VIEW %s;\n", qualrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ tbinfo->dobj.catId.oid, false);
+
+ appendPQExpBuffer(q, "CREATE VIEW %s", qualrelname);
+
+ if (tbinfo->dummy_view)
+ result = createDummyViewAsClause(fout, tbinfo);
+ else
+ {
+ if (nonemptyReloptions(tbinfo->reloptions))
+ {
+ appendPQExpBufferStr(q, " WITH (");
+ appendReloptionsArrayAH(q, tbinfo->reloptions, "", fout);
+ appendPQExpBufferChar(q, ')');
+ }
+ result = createViewAsClause(fout, tbinfo);
+ }
+ appendPQExpBuffer(q, " AS\n%s", result->data);
+ destroyPQExpBuffer(result);
+
+ if (tbinfo->checkoption != NULL && !tbinfo->dummy_view)
+ appendPQExpBuffer(q, "\n WITH %s CHECK OPTION", tbinfo->checkoption);
+ appendPQExpBufferStr(q, ";\n");
+ }
+ else
+ {
+ char *partkeydef = NULL;
+ char *ftoptions = NULL;
+ char *srvname = NULL;
+ char *foreign = "";
+
+ /*
+ * Set reltypename, and collect any relkind-specific data that we
+ * didn't fetch during getTables().
+ */
+ switch (tbinfo->relkind)
+ {
+ case RELKIND_PARTITIONED_TABLE:
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+
+ reltypename = "TABLE";
+
+ /* retrieve partition key definition */
+ appendPQExpBuffer(query,
+ "SELECT pg_get_partkeydef('%u')",
+ tbinfo->dobj.catId.oid);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ partkeydef = pg_strdup(PQgetvalue(res, 0, 0));
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ break;
+ }
+ case RELKIND_FOREIGN_TABLE:
+ {
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+ int i_srvname;
+ int i_ftoptions;
+
+ reltypename = "FOREIGN TABLE";
+
+ /* retrieve name of foreign server and generic options */
+ appendPQExpBuffer(query,
+ "SELECT fs.srvname, "
+ "pg_catalog.array_to_string(ARRAY("
+ "SELECT pg_catalog.quote_ident(option_name) || "
+ "' ' || pg_catalog.quote_literal(option_value) "
+ "FROM pg_catalog.pg_options_to_table(ftoptions) "
+ "ORDER BY option_name"
+ "), E',\n ') AS ftoptions "
+ "FROM pg_catalog.pg_foreign_table ft "
+ "JOIN pg_catalog.pg_foreign_server fs "
+ "ON (fs.oid = ft.ftserver) "
+ "WHERE ft.ftrelid = '%u'",
+ tbinfo->dobj.catId.oid);
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+ i_srvname = PQfnumber(res, "srvname");
+ i_ftoptions = PQfnumber(res, "ftoptions");
+ srvname = pg_strdup(PQgetvalue(res, 0, i_srvname));
+ ftoptions = pg_strdup(PQgetvalue(res, 0, i_ftoptions));
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ foreign = "FOREIGN ";
+ break;
+ }
+ case RELKIND_MATVIEW:
+ reltypename = "MATERIALIZED VIEW";
+ break;
+ default:
+ reltypename = "TABLE";
+ break;
+ }
+
+ numParents = tbinfo->numParents;
+ parents = tbinfo->parents;
+
+ appendPQExpBuffer(delq, "DROP %s %s;\n", reltypename, qualrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ tbinfo->dobj.catId.oid, false);
+
+ appendPQExpBuffer(q, "CREATE %s%s %s",
+ tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
+ "UNLOGGED " : "",
+ reltypename,
+ qualrelname);
+
+ /*
+ * Attach to type, if reloftype; except in case of a binary upgrade,
+ * we dump the table normally and attach it to the type afterward.
+ */
+ if (OidIsValid(tbinfo->reloftype) && !dopt->binary_upgrade)
+ appendPQExpBuffer(q, " OF %s",
+ getFormattedTypeName(fout, tbinfo->reloftype,
+ zeroIsError));
+
+ if (tbinfo->relkind != RELKIND_MATVIEW)
+ {
+ /* Dump the attributes */
+ actual_atts = 0;
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ /*
+ * Normally, dump if it's locally defined in this table, and
+ * not dropped. But for binary upgrade, we'll dump all the
+ * columns, and then fix up the dropped and nonlocal cases
+ * below.
+ */
+ if (shouldPrintColumn(dopt, tbinfo, j))
+ {
+ bool print_default;
+ bool print_notnull;
+
+ /*
+ * Default value --- suppress if to be printed separately
+ * or not at all.
+ */
+ print_default = (tbinfo->attrdefs[j] != NULL &&
+ tbinfo->attrdefs[j]->dobj.dump &&
+ !tbinfo->attrdefs[j]->separate);
+
+ /*
+ * Not Null constraint --- suppress if inherited, except
+ * if partition, or in binary-upgrade case where that
+ * won't work.
+ */
+ print_notnull = (tbinfo->notnull[j] &&
+ (!tbinfo->inhNotNull[j] ||
+ tbinfo->ispartition || dopt->binary_upgrade));
+
+ /*
+ * Skip column if fully defined by reloftype, except in
+ * binary upgrade
+ */
+ if (OidIsValid(tbinfo->reloftype) &&
+ !print_default && !print_notnull &&
+ !dopt->binary_upgrade)
+ continue;
+
+ /* Format properly if not first attr */
+ if (actual_atts == 0)
+ appendPQExpBufferStr(q, " (");
+ else
+ appendPQExpBufferChar(q, ',');
+ appendPQExpBufferStr(q, "\n ");
+ actual_atts++;
+
+ /* Attribute name */
+ appendPQExpBufferStr(q, fmtId(tbinfo->attnames[j]));
+
+ if (tbinfo->attisdropped[j])
+ {
+ /*
+ * ALTER TABLE DROP COLUMN clears
+ * pg_attribute.atttypid, so we will not have gotten a
+ * valid type name; insert INTEGER as a stopgap. We'll
+ * clean things up later.
+ */
+ appendPQExpBufferStr(q, " INTEGER /* dummy */");
+ /* and skip to the next column */
+ continue;
+ }
+
+ /*
+ * Attribute type; print it except when creating a typed
+ * table ('OF type_name'), but in binary-upgrade mode,
+ * print it in that case too.
+ */
+ if (dopt->binary_upgrade || !OidIsValid(tbinfo->reloftype))
+ {
+ appendPQExpBuffer(q, " %s",
+ tbinfo->atttypnames[j]);
+ }
+
+ if (print_default)
+ {
+ if (tbinfo->attgenerated[j] == ATTRIBUTE_GENERATED_STORED)
+ appendPQExpBuffer(q, " GENERATED ALWAYS AS (%s) STORED",
+ tbinfo->attrdefs[j]->adef_expr);
+ else
+ appendPQExpBuffer(q, " DEFAULT %s",
+ tbinfo->attrdefs[j]->adef_expr);
+ }
+
+
+ if (print_notnull)
+ appendPQExpBufferStr(q, " NOT NULL");
+
+ /* Add collation if not default for the type */
+ if (OidIsValid(tbinfo->attcollation[j]))
+ {
+ CollInfo *coll;
+
+ coll = findCollationByOid(tbinfo->attcollation[j]);
+ if (coll)
+ appendPQExpBuffer(q, " COLLATE %s",
+ fmtQualifiedDumpable(coll));
+ }
+ }
+ }
+
+ /*
+ * Add non-inherited CHECK constraints, if any.
+ *
+ * For partitions, we need to include check constraints even if
+ * they're not defined locally, because the ALTER TABLE ATTACH
+ * PARTITION that we'll emit later expects the constraint to be
+ * there. (No need to fix conislocal: ATTACH PARTITION does that)
+ */
+ for (j = 0; j < tbinfo->ncheck; j++)
+ {
+ ConstraintInfo *constr = &(tbinfo->checkexprs[j]);
+
+ if (constr->separate ||
+ (!constr->conislocal && !tbinfo->ispartition))
+ continue;
+
+ if (actual_atts == 0)
+ appendPQExpBufferStr(q, " (\n ");
+ else
+ appendPQExpBufferStr(q, ",\n ");
+
+ appendPQExpBuffer(q, "CONSTRAINT %s ",
+ fmtId(constr->dobj.name));
+ appendPQExpBufferStr(q, constr->condef);
+
+ actual_atts++;
+ }
+
+ if (actual_atts)
+ appendPQExpBufferStr(q, "\n)");
+ else if (!(OidIsValid(tbinfo->reloftype) && !dopt->binary_upgrade))
+ {
+ /*
+ * No attributes? we must have a parenthesized attribute list,
+ * even though empty, when not using the OF TYPE syntax.
+ */
+ appendPQExpBufferStr(q, " (\n)");
+ }
+
+ /*
+ * Emit the INHERITS clause (not for partitions), except in
+ * binary-upgrade mode.
+ */
+ if (numParents > 0 && !tbinfo->ispartition &&
+ !dopt->binary_upgrade)
+ {
+ appendPQExpBufferStr(q, "\nINHERITS (");
+ for (k = 0; k < numParents; k++)
+ {
+ TableInfo *parentRel = parents[k];
+
+ if (k > 0)
+ appendPQExpBufferStr(q, ", ");
+ appendPQExpBufferStr(q, fmtQualifiedDumpable(parentRel));
+ }
+ appendPQExpBufferChar(q, ')');
+ }
+
+ if (tbinfo->relkind == RELKIND_PARTITIONED_TABLE)
+ appendPQExpBuffer(q, "\nPARTITION BY %s", partkeydef);
+
+ if (tbinfo->relkind == RELKIND_FOREIGN_TABLE)
+ appendPQExpBuffer(q, "\nSERVER %s", fmtId(srvname));
+ }
+
+ if (nonemptyReloptions(tbinfo->reloptions) ||
+ nonemptyReloptions(tbinfo->toast_reloptions))
+ {
+ bool addcomma = false;
+
+ appendPQExpBufferStr(q, "\nWITH (");
+ if (nonemptyReloptions(tbinfo->reloptions))
+ {
+ addcomma = true;
+ appendReloptionsArrayAH(q, tbinfo->reloptions, "", fout);
+ }
+ if (nonemptyReloptions(tbinfo->toast_reloptions))
+ {
+ if (addcomma)
+ appendPQExpBufferStr(q, ", ");
+ appendReloptionsArrayAH(q, tbinfo->toast_reloptions, "toast.",
+ fout);
+ }
+ appendPQExpBufferChar(q, ')');
+ }
+
+ /* Dump generic options if any */
+ if (ftoptions && ftoptions[0])
+ appendPQExpBuffer(q, "\nOPTIONS (\n %s\n)", ftoptions);
+
+ /*
+ * For materialized views, create the AS clause just like a view. At
+ * this point, we always mark the view as not populated.
+ */
+ if (tbinfo->relkind == RELKIND_MATVIEW)
+ {
+ PQExpBuffer result;
+
+ result = createViewAsClause(fout, tbinfo);
+ appendPQExpBuffer(q, " AS\n%s\n WITH NO DATA;\n",
+ result->data);
+ destroyPQExpBuffer(result);
+ }
+ else
+ appendPQExpBufferStr(q, ";\n");
+
+ /* Materialized views can depend on extensions */
+ if (tbinfo->relkind == RELKIND_MATVIEW)
+ append_depends_on_extension(fout, q, &tbinfo->dobj,
+ "pg_catalog.pg_class",
+ "MATERIALIZED VIEW",
+ qualrelname);
+
+ /*
+ * in binary upgrade mode, update the catalog with any missing values
+ * that might be present.
+ */
+ if (dopt->binary_upgrade)
+ {
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ if (tbinfo->attmissingval[j][0] != '\0')
+ {
+ appendPQExpBufferStr(q, "\n-- set missing value.\n");
+ appendPQExpBufferStr(q,
+ "SELECT pg_catalog.binary_upgrade_set_missing_value(");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass,");
+ appendStringLiteralAH(q, tbinfo->attnames[j], fout);
+ appendPQExpBufferChar(q, ',');
+ appendStringLiteralAH(q, tbinfo->attmissingval[j], fout);
+ appendPQExpBufferStr(q, ");\n\n");
+ }
+ }
+ }
+
+ /*
+ * To create binary-compatible heap files, we have to ensure the same
+ * physical column order, including dropped columns, as in the
+ * original. Therefore, we create dropped columns above and drop them
+ * here, also updating their attlen/attalign values so that the
+ * dropped column can be skipped properly. (We do not bother with
+ * restoring the original attbyval setting.) Also, inheritance
+ * relationships are set up by doing ALTER TABLE INHERIT rather than
+ * using an INHERITS clause --- the latter would possibly mess up the
+ * column order. That also means we have to take care about setting
+ * attislocal correctly, plus fix up any inherited CHECK constraints.
+ * Analogously, we set up typed tables using ALTER TABLE / OF here.
+ *
+ * We process foreign and partitioned tables here, even though they
+ * lack heap storage, because they can participate in inheritance
+ * relationships and we want this stuff to be consistent across the
+ * inheritance tree. We can exclude indexes, toast tables, sequences
+ * and matviews, even though they have storage, because we don't
+ * support altering or dropping columns in them, nor can they be part
+ * of inheritance trees.
+ */
+ if (dopt->binary_upgrade &&
+ (tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ||
+ tbinfo->relkind == RELKIND_PARTITIONED_TABLE))
+ {
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ if (tbinfo->attisdropped[j])
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate dropped column.\n");
+ appendPQExpBuffer(q, "UPDATE pg_catalog.pg_attribute\n"
+ "SET attlen = %d, "
+ "attalign = '%c', attbyval = false\n"
+ "WHERE attname = ",
+ tbinfo->attlen[j],
+ tbinfo->attalign[j]);
+ appendStringLiteralAH(q, tbinfo->attnames[j], fout);
+ appendPQExpBufferStr(q, "\n AND attrelid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+
+ if (tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_PARTITIONED_TABLE)
+ appendPQExpBuffer(q, "ALTER TABLE ONLY %s ",
+ qualrelname);
+ else
+ appendPQExpBuffer(q, "ALTER FOREIGN TABLE ONLY %s ",
+ qualrelname);
+ appendPQExpBuffer(q, "DROP COLUMN %s;\n",
+ fmtId(tbinfo->attnames[j]));
+ }
+ else if (!tbinfo->attislocal[j])
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate inherited column.\n");
+ appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_attribute\n"
+ "SET attislocal = false\n"
+ "WHERE attname = ");
+ appendStringLiteralAH(q, tbinfo->attnames[j], fout);
+ appendPQExpBufferStr(q, "\n AND attrelid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+ }
+ }
+
+ /*
+ * Add inherited CHECK constraints, if any.
+ *
+ * For partitions, they were already dumped, and conislocal
+ * doesn't need fixing.
+ */
+ for (k = 0; k < tbinfo->ncheck; k++)
+ {
+ ConstraintInfo *constr = &(tbinfo->checkexprs[k]);
+
+ if (constr->separate || constr->conislocal || tbinfo->ispartition)
+ continue;
+
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inherited constraint.\n");
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ADD CONSTRAINT %s %s;\n",
+ foreign, qualrelname,
+ fmtId(constr->dobj.name),
+ constr->condef);
+ appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_constraint\n"
+ "SET conislocal = false\n"
+ "WHERE contype = 'c' AND conname = ");
+ appendStringLiteralAH(q, constr->dobj.name, fout);
+ appendPQExpBufferStr(q, "\n AND conrelid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+ }
+
+ if (numParents > 0 && !tbinfo->ispartition)
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inheritance this way.\n");
+ for (k = 0; k < numParents; k++)
+ {
+ TableInfo *parentRel = parents[k];
+
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s INHERIT %s;\n", foreign,
+ qualrelname,
+ fmtQualifiedDumpable(parentRel));
+ }
+ }
+
+ if (OidIsValid(tbinfo->reloftype))
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set up typed tables this way.\n");
+ appendPQExpBuffer(q, "ALTER TABLE ONLY %s OF %s;\n",
+ qualrelname,
+ getFormattedTypeName(fout, tbinfo->reloftype,
+ zeroIsError));
+ }
+ }
+
+ /*
+ * In binary_upgrade mode, arrange to restore the old relfrozenxid and
+ * relminmxid of all vacuumable relations. (While vacuum.c processes
+ * TOAST tables semi-independently, here we see them only as children
+ * of other relations; so this "if" lacks RELKIND_TOASTVALUE, and the
+ * child toast table is handled below.)
+ */
+ if (dopt->binary_upgrade &&
+ (tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_MATVIEW))
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set heap's relfrozenxid and relminmxid\n");
+ appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+ "SET relfrozenxid = '%u', relminmxid = '%u'\n"
+ "WHERE oid = ",
+ tbinfo->frozenxid, tbinfo->minmxid);
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+
+ if (tbinfo->toast_oid)
+ {
+ /*
+ * The toast table will have the same OID at restore, so we
+ * can safely target it by OID.
+ */
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, set toast's relfrozenxid and relminmxid\n");
+ appendPQExpBuffer(q, "UPDATE pg_catalog.pg_class\n"
+ "SET relfrozenxid = '%u', relminmxid = '%u'\n"
+ "WHERE oid = '%u';\n",
+ tbinfo->toast_frozenxid,
+ tbinfo->toast_minmxid, tbinfo->toast_oid);
+ }
+ }
+
+ /*
+ * In binary_upgrade mode, restore matviews' populated status by
+ * poking pg_class directly. This is pretty ugly, but we can't use
+ * REFRESH MATERIALIZED VIEW since it's possible that some underlying
+ * matview is not populated even though this matview is; in any case,
+ * we want to transfer the matview's heap storage, not run REFRESH.
+ */
+ if (dopt->binary_upgrade && tbinfo->relkind == RELKIND_MATVIEW &&
+ tbinfo->relispopulated)
+ {
+ appendPQExpBufferStr(q, "\n-- For binary upgrade, mark materialized view as populated\n");
+ appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_class\n"
+ "SET relispopulated = 't'\n"
+ "WHERE oid = ");
+ appendStringLiteralAH(q, qualrelname, fout);
+ appendPQExpBufferStr(q, "::pg_catalog.regclass;\n");
+ }
+
+ /*
+ * Dump additional per-column properties that we can't handle in the
+ * main CREATE TABLE command.
+ */
+ for (j = 0; j < tbinfo->numatts; j++)
+ {
+ /* None of this applies to dropped columns */
+ if (tbinfo->attisdropped[j])
+ continue;
+
+ /*
+ * If we didn't dump the column definition explicitly above, and
+ * it is NOT NULL and did not inherit that property from a parent,
+ * we have to mark it separately.
+ */
+ if (!shouldPrintColumn(dopt, tbinfo, j) &&
+ tbinfo->notnull[j] && !tbinfo->inhNotNull[j])
+ appendPQExpBuffer(q,
+ "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET NOT NULL;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]));
+
+ /*
+ * Dump per-column statistics information. We only issue an ALTER
+ * TABLE statement if the attstattarget entry for this column is
+ * non-negative (i.e. it's not the default value)
+ */
+ if (tbinfo->attstattarget[j] >= 0)
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STATISTICS %d;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ tbinfo->attstattarget[j]);
+
+ /*
+ * Dump per-column storage information. The statement is only
+ * dumped if the storage has been changed from the type's default.
+ */
+ if (tbinfo->attstorage[j] != tbinfo->typstorage[j])
+ {
+ switch (tbinfo->attstorage[j])
+ {
+ case TYPSTORAGE_PLAIN:
+ storage = "PLAIN";
+ break;
+ case TYPSTORAGE_EXTERNAL:
+ storage = "EXTERNAL";
+ break;
+ case TYPSTORAGE_EXTENDED:
+ storage = "EXTENDED";
+ break;
+ case TYPSTORAGE_MAIN:
+ storage = "MAIN";
+ break;
+ default:
+ storage = NULL;
+ }
+
+ /*
+ * Only dump the statement if it's a storage type we recognize
+ */
+ if (storage != NULL)
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STORAGE %s;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ storage);
+ }
+
+ /*
+ * Dump per-column compression, if it's been set.
+ */
+ if (!dopt->no_toast_compression)
+ {
+ const char *cmname;
+
+ switch (tbinfo->attcompression[j])
+ {
+ case 'p':
+ cmname = "pglz";
+ break;
+ case 'l':
+ cmname = "lz4";
+ break;
+ default:
+ cmname = NULL;
+ break;
+ }
+
+ if (cmname != NULL)
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET COMPRESSION %s;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ cmname);
+ }
+
+ /*
+ * Dump per-column attributes.
+ */
+ if (tbinfo->attoptions[j][0] != '\0')
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET (%s);\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ tbinfo->attoptions[j]);
+
+ /*
+ * Dump per-column fdw options.
+ */
+ if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
+ tbinfo->attfdwoptions[j][0] != '\0')
+ appendPQExpBuffer(q,
+ "ALTER FOREIGN TABLE %s ALTER COLUMN %s OPTIONS (\n"
+ " %s\n"
+ ");\n",
+ qualrelname,
+ fmtId(tbinfo->attnames[j]),
+ tbinfo->attfdwoptions[j]);
+ } /* end loop over columns */
+
+ free(partkeydef);
+ free(ftoptions);
+ free(srvname);
+ }
+
+ /*
+ * dump properties we only have ALTER TABLE syntax for
+ */
+ if ((tbinfo->relkind == RELKIND_RELATION ||
+ tbinfo->relkind == RELKIND_PARTITIONED_TABLE ||
+ tbinfo->relkind == RELKIND_MATVIEW) &&
+ tbinfo->relreplident != REPLICA_IDENTITY_DEFAULT)
+ {
+ if (tbinfo->relreplident == REPLICA_IDENTITY_INDEX)
+ {
+ /* nothing to do, will be set when the index is dumped */
+ }
+ else if (tbinfo->relreplident == REPLICA_IDENTITY_NOTHING)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY NOTHING;\n",
+ qualrelname);
+ }
+ else if (tbinfo->relreplident == REPLICA_IDENTITY_FULL)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY FULL;\n",
+ qualrelname);
+ }
+ }
+
+ if (tbinfo->forcerowsec)
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s FORCE ROW LEVEL SECURITY;\n",
+ qualrelname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(q, &tbinfo->dobj,
+ reltypename, qrelname,
+ tbinfo->dobj.namespace->dobj.name);
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ char *tablespace = NULL;
+ char *tableam = NULL;
+
+ /*
+ * _selectTablespace() relies on tablespace-enabled objects in the
+ * default tablespace to have a tablespace of "" (empty string) versus
+ * non-tablespace-enabled objects to have a tablespace of NULL.
+ * getTables() sets tbinfo->reltablespace to "" for the default
+ * tablespace (not NULL).
+ */
+ if (RELKIND_HAS_TABLESPACE(tbinfo->relkind))
+ tablespace = tbinfo->reltablespace;
+
+ if (RELKIND_HAS_TABLE_AM(tbinfo->relkind))
+ tableam = tbinfo->amname;
+
+ ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .tablespace = tablespace,
+ .tableam = tableam,
+ .owner = tbinfo->rolname,
+ .description = reltypename,
+ .section = tbinfo->postponed_def ?
+ SECTION_POST_DATA : SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+
+ /* Dump Table Comments */
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpTableComment(fout, tbinfo, reltypename);
+
+ /* Dump Table Security Labels */
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpTableSecLabel(fout, tbinfo, reltypename);
+
+ /* Dump comments on inlined table constraints */
+ for (j = 0; j < tbinfo->ncheck; j++)
+ {
+ ConstraintInfo *constr = &(tbinfo->checkexprs[j]);
+
+ if (constr->separate || !constr->conislocal)
+ continue;
+
+ if (constr->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpTableConstraintComment(fout, constr);
+ }
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qrelname);
+ free(qualrelname);
+}
+
+/*
+ * dumpTableAttach
+ * write to fout the commands to attach a child partition
+ *
+ * Child partitions are always made by creating them separately
+ * and then using ATTACH PARTITION, rather than using
+ * CREATE TABLE ... PARTITION OF. This is important for preserving
+ * any possible discrepancy in column layout, to allow assigning the
+ * correct tablespace if different, and so that it's possible to restore
+ * a partition without restoring its parent. (You'll get an error from
+ * the ATTACH PARTITION command, but that can be ignored, or skipped
+ * using "pg_restore -L" if you prefer.) The last point motivates
+ * treating ATTACH PARTITION as a completely separate ArchiveEntry
+ * rather than emitting it within the child partition's ArchiveEntry.
+ */
+static void
+dumpTableAttach(Archive *fout, const TableAttachInfo *attachinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PGresult *res;
+ char *partbound;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+
+ if (!fout->is_prepared[PREPQUERY_DUMPTABLEATTACH])
+ {
+ /* Set up query for partbound details */
+ appendPQExpBufferStr(q,
+ "PREPARE dumpTableAttach(pg_catalog.oid) AS\n");
+
+ appendPQExpBufferStr(q,
+ "SELECT pg_get_expr(c.relpartbound, c.oid) "
+ "FROM pg_class c "
+ "WHERE c.oid = $1");
+
+ ExecuteSqlStatement(fout, q->data);
+
+ fout->is_prepared[PREPQUERY_DUMPTABLEATTACH] = true;
+ }
+
+ printfPQExpBuffer(q,
+ "EXECUTE dumpTableAttach('%u')",
+ attachinfo->partitionTbl->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, q->data);
+ partbound = PQgetvalue(res, 0, 0);
+
+ /* Perform ALTER TABLE on the parent */
+ printfPQExpBuffer(q,
+ "ALTER TABLE ONLY %s ",
+ fmtQualifiedDumpable(attachinfo->parentTbl));
+ appendPQExpBuffer(q,
+ "ATTACH PARTITION %s %s;\n",
+ fmtQualifiedDumpable(attachinfo->partitionTbl),
+ partbound);
+
+ /*
+ * There is no point in creating a drop query as the drop is done by table
+ * drop. (If you think to change this, see also _printTocEntry().)
+ * Although this object doesn't really have ownership as such, set the
+ * owner field anyway to ensure that the command is run by the correct
+ * role at restore time.
+ */
+ ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = attachinfo->dobj.name,
+ .namespace = attachinfo->dobj.namespace->dobj.name,
+ .owner = attachinfo->partitionTbl->rolname,
+ .description = "TABLE ATTACH",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data));
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+}
+
+/*
+ * dumpAttrDef --- dump an attribute's default-value declaration
+ */
+static void
+dumpAttrDef(Archive *fout, const AttrDefInfo *adinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = adinfo->adtable;
+ int adnum = adinfo->adnum;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qualrelname;
+ char *tag;
+ char *foreign;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /* Skip if not "separate"; it was dumped in the table's definition */
+ if (!adinfo->separate)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qualrelname = pg_strdup(fmtQualifiedDumpable(tbinfo));
+
+ foreign = tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "";
+
+ appendPQExpBuffer(q,
+ "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET DEFAULT %s;\n",
+ foreign, qualrelname, fmtId(tbinfo->attnames[adnum - 1]),
+ adinfo->adef_expr);
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE %s ALTER COLUMN %s DROP DEFAULT;\n",
+ foreign, qualrelname,
+ fmtId(tbinfo->attnames[adnum - 1]));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, tbinfo->attnames[adnum - 1]);
+
+ if (adinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, adinfo->dobj.catId, adinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "DEFAULT",
+ .section = SECTION_PRE_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ free(tag);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qualrelname);
+}
+
+/*
+ * getAttrName: extract the correct name for an attribute
+ *
+ * The array tblInfo->attnames[] only provides names of user attributes;
+ * if a system attribute number is supplied, we have to fake it.
+ * We also do a little bit of bounds checking for safety's sake.
+ */
+static const char *
+getAttrName(int attrnum, const TableInfo *tblInfo)
+{
+ if (attrnum > 0 && attrnum <= tblInfo->numatts)
+ return tblInfo->attnames[attrnum - 1];
+ switch (attrnum)
+ {
+ case SelfItemPointerAttributeNumber:
+ return "ctid";
+ case MinTransactionIdAttributeNumber:
+ return "xmin";
+ case MinCommandIdAttributeNumber:
+ return "cmin";
+ case MaxTransactionIdAttributeNumber:
+ return "xmax";
+ case MaxCommandIdAttributeNumber:
+ return "cmax";
+ case TableOidAttributeNumber:
+ return "tableoid";
+ }
+ pg_fatal("invalid column number %d for table \"%s\"",
+ attrnum, tblInfo->dobj.name);
+ return NULL; /* keep compiler quiet */
+}
+
+/*
+ * dumpIndex
+ * write out to fout a user-defined index
+ */
+static void
+dumpIndex(Archive *fout, const IndxInfo *indxinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = indxinfo->indextable;
+ bool is_constraint = (indxinfo->indexconstraint != 0);
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *qindxname;
+ char *qqindxname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ qindxname = pg_strdup(fmtId(indxinfo->dobj.name));
+ qqindxname = pg_strdup(fmtQualifiedDumpable(indxinfo));
+
+ /*
+ * If there's an associated constraint, don't dump the index per se, but
+ * do dump any comment for it. (This is safe because dependency ordering
+ * will have ensured the constraint is emitted first.) Note that the
+ * emitted comment has to be shown as depending on the constraint, not the
+ * index, in such cases.
+ */
+ if (!is_constraint)
+ {
+ char *indstatcols = indxinfo->indstatcols;
+ char *indstatvals = indxinfo->indstatvals;
+ char **indstatcolsarray = NULL;
+ char **indstatvalsarray = NULL;
+ int nstatcols = 0;
+ int nstatvals = 0;
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ indxinfo->dobj.catId.oid, true);
+
+ /* Plain secondary index */
+ appendPQExpBuffer(q, "%s;\n", indxinfo->indexdef);
+
+ /*
+ * Append ALTER TABLE commands as needed to set properties that we
+ * only have ALTER TABLE syntax for. Keep this in sync with the
+ * similar code in dumpConstraint!
+ */
+
+ /* If the index is clustered, we need to record that. */
+ if (indxinfo->indisclustered)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE %s CLUSTER",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " ON %s;\n",
+ qindxname);
+ }
+
+ /*
+ * If the index has any statistics on some of its columns, generate
+ * the associated ALTER INDEX queries.
+ */
+ if (strlen(indstatcols) != 0 || strlen(indstatvals) != 0)
+ {
+ int j;
+
+ if (!parsePGArray(indstatcols, &indstatcolsarray, &nstatcols))
+ pg_fatal("could not parse index statistic columns");
+ if (!parsePGArray(indstatvals, &indstatvalsarray, &nstatvals))
+ pg_fatal("could not parse index statistic values");
+ if (nstatcols != nstatvals)
+ pg_fatal("mismatched number of columns and values for index statistics");
+
+ for (j = 0; j < nstatcols; j++)
+ {
+ appendPQExpBuffer(q, "ALTER INDEX %s ", qqindxname);
+
+ /*
+ * Note that this is a column number, so no quotes should be
+ * used.
+ */
+ appendPQExpBuffer(q, "ALTER COLUMN %s ",
+ indstatcolsarray[j]);
+ appendPQExpBuffer(q, "SET STATISTICS %s;\n",
+ indstatvalsarray[j]);
+ }
+ }
+
+ /* Indexes can depend on extensions */
+ append_depends_on_extension(fout, q, &indxinfo->dobj,
+ "pg_catalog.pg_class",
+ "INDEX", qqindxname);
+
+ /* If the index defines identity, we need to record that. */
+ if (indxinfo->indisreplident)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY USING",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " INDEX %s;\n",
+ qindxname);
+ }
+
+ appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname);
+
+ if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = indxinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .tablespace = indxinfo->tablespace,
+ .owner = tbinfo->rolname,
+ .description = "INDEX",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ free(indstatcolsarray);
+ free(indstatvalsarray);
+ }
+
+ /* Dump Index Comments */
+ if (indxinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "INDEX", qindxname,
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->rolname,
+ indxinfo->dobj.catId, 0,
+ is_constraint ? indxinfo->indexconstraint :
+ indxinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ free(qindxname);
+ free(qqindxname);
+}
+
+/*
+ * dumpIndexAttach
+ * write out to fout a partitioned-index attachment clause
+ */
+static void
+dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo)
+{
+ /* Do nothing in data-only dump */
+ if (fout->dopt->dataOnly)
+ return;
+
+ if (attachinfo->partitionIdx->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ PQExpBuffer q = createPQExpBuffer();
+
+ appendPQExpBuffer(q, "ALTER INDEX %s ",
+ fmtQualifiedDumpable(attachinfo->parentIdx));
+ appendPQExpBuffer(q, "ATTACH PARTITION %s;\n",
+ fmtQualifiedDumpable(attachinfo->partitionIdx));
+
+ /*
+ * There is no point in creating a drop query as the drop is done by
+ * index drop. (If you think to change this, see also
+ * _printTocEntry().) Although this object doesn't really have
+ * ownership as such, set the owner field anyway to ensure that the
+ * command is run by the correct role at restore time.
+ */
+ ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = attachinfo->dobj.name,
+ .namespace = attachinfo->dobj.namespace->dobj.name,
+ .owner = attachinfo->parentIdx->indextable->rolname,
+ .description = "INDEX ATTACH",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data));
+
+ destroyPQExpBuffer(q);
+ }
+}
+
+/*
+ * dumpStatisticsExt
+ * write out to fout an extended statistics object
+ */
+static void
+dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ PQExpBuffer query;
+ char *qstatsextname;
+ PGresult *res;
+ char *stxdef;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+ query = createPQExpBuffer();
+
+ qstatsextname = pg_strdup(fmtId(statsextinfo->dobj.name));
+
+ appendPQExpBuffer(query, "SELECT "
+ "pg_catalog.pg_get_statisticsobjdef('%u'::pg_catalog.oid)",
+ statsextinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ stxdef = PQgetvalue(res, 0, 0);
+
+ /* Result of pg_get_statisticsobjdef is complete except for semicolon */
+ appendPQExpBuffer(q, "%s;\n", stxdef);
+
+ /*
+ * We only issue an ALTER STATISTICS statement if the stxstattarget entry
+ * for this statistics object is non-negative (i.e. it's not the default
+ * value).
+ */
+ if (statsextinfo->stattarget >= 0)
+ {
+ appendPQExpBuffer(q, "ALTER STATISTICS %s ",
+ fmtQualifiedDumpable(statsextinfo));
+ appendPQExpBuffer(q, "SET STATISTICS %d;\n",
+ statsextinfo->stattarget);
+ }
+
+ appendPQExpBuffer(delq, "DROP STATISTICS %s;\n",
+ fmtQualifiedDumpable(statsextinfo));
+
+ if (statsextinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, statsextinfo->dobj.catId,
+ statsextinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = statsextinfo->dobj.name,
+ .namespace = statsextinfo->dobj.namespace->dobj.name,
+ .owner = statsextinfo->rolname,
+ .description = "STATISTICS",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+
+ /* Dump Statistics Comments */
+ if (statsextinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "STATISTICS", qstatsextname,
+ statsextinfo->dobj.namespace->dobj.name,
+ statsextinfo->rolname,
+ statsextinfo->dobj.catId, 0,
+ statsextinfo->dobj.dumpId);
+
+ PQclear(res);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+ destroyPQExpBuffer(query);
+ free(qstatsextname);
+}
+
+/*
+ * dumpConstraint
+ * write out to fout a user-defined constraint
+ */
+static void
+dumpConstraint(Archive *fout, const ConstraintInfo *coninfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = coninfo->contable;
+ PQExpBuffer q;
+ PQExpBuffer delq;
+ char *tag = NULL;
+ char *foreign;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ q = createPQExpBuffer();
+ delq = createPQExpBuffer();
+
+ foreign = tbinfo &&
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "";
+
+ if (coninfo->contype == 'p' ||
+ coninfo->contype == 'u' ||
+ coninfo->contype == 'x')
+ {
+ /* Index-related constraint */
+ IndxInfo *indxinfo;
+ int k;
+
+ indxinfo = (IndxInfo *) findObjectByDumpId(coninfo->conindex);
+
+ if (indxinfo == NULL)
+ pg_fatal("missing index for constraint \"%s\"",
+ coninfo->dobj.name);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_set_pg_class_oids(fout, q,
+ indxinfo->dobj.catId.oid, true);
+
+ appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s\n", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s ",
+ fmtId(coninfo->dobj.name));
+
+ if (coninfo->condef)
+ {
+ /* pg_get_constraintdef should have provided everything */
+ appendPQExpBuffer(q, "%s;\n", coninfo->condef);
+ }
+ else
+ {
+ appendPQExpBufferStr(q,
+ coninfo->contype == 'p' ? "PRIMARY KEY" : "UNIQUE");
+
+ /*
+ * PRIMARY KEY constraints should not be using NULLS NOT DISTINCT
+ * indexes. Being able to create this was fixed, but we need to
+ * make the index distinct in order to be able to restore the
+ * dump.
+ */
+ if (indxinfo->indnullsnotdistinct && coninfo->contype != 'p')
+ appendPQExpBufferStr(q, " NULLS NOT DISTINCT");
+ appendPQExpBufferStr(q, " (");
+ for (k = 0; k < indxinfo->indnkeyattrs; k++)
+ {
+ int indkey = (int) indxinfo->indkeys[k];
+ const char *attname;
+
+ if (indkey == InvalidAttrNumber)
+ break;
+ attname = getAttrName(indkey, tbinfo);
+
+ appendPQExpBuffer(q, "%s%s",
+ (k == 0) ? "" : ", ",
+ fmtId(attname));
+ }
+
+ if (indxinfo->indnkeyattrs < indxinfo->indnattrs)
+ appendPQExpBufferStr(q, ") INCLUDE (");
+
+ for (k = indxinfo->indnkeyattrs; k < indxinfo->indnattrs; k++)
+ {
+ int indkey = (int) indxinfo->indkeys[k];
+ const char *attname;
+
+ if (indkey == InvalidAttrNumber)
+ break;
+ attname = getAttrName(indkey, tbinfo);
+
+ appendPQExpBuffer(q, "%s%s",
+ (k == indxinfo->indnkeyattrs) ? "" : ", ",
+ fmtId(attname));
+ }
+
+ appendPQExpBufferChar(q, ')');
+
+ if (nonemptyReloptions(indxinfo->indreloptions))
+ {
+ appendPQExpBufferStr(q, " WITH (");
+ appendReloptionsArrayAH(q, indxinfo->indreloptions, "", fout);
+ appendPQExpBufferChar(q, ')');
+ }
+
+ if (coninfo->condeferrable)
+ {
+ appendPQExpBufferStr(q, " DEFERRABLE");
+ if (coninfo->condeferred)
+ appendPQExpBufferStr(q, " INITIALLY DEFERRED");
+ }
+
+ appendPQExpBufferStr(q, ";\n");
+ }
+
+ /*
+ * Append ALTER TABLE commands as needed to set properties that we
+ * only have ALTER TABLE syntax for. Keep this in sync with the
+ * similar code in dumpIndex!
+ */
+
+ /* If the index is clustered, we need to record that. */
+ if (indxinfo->indisclustered)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE %s CLUSTER",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " ON %s;\n",
+ fmtId(indxinfo->dobj.name));
+ }
+
+ /* If the index defines identity, we need to record that. */
+ if (indxinfo->indisreplident)
+ {
+ appendPQExpBuffer(q, "\nALTER TABLE ONLY %s REPLICA IDENTITY USING",
+ fmtQualifiedDumpable(tbinfo));
+ /* index name is not qualified in this syntax */
+ appendPQExpBuffer(q, " INDEX %s;\n",
+ fmtId(indxinfo->dobj.name));
+ }
+
+ /* Indexes can depend on extensions */
+ append_depends_on_extension(fout, q, &indxinfo->dobj,
+ "pg_catalog.pg_class", "INDEX",
+ fmtQualifiedDumpable(indxinfo));
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE ONLY %s ", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .tablespace = indxinfo->tablespace,
+ .owner = tbinfo->rolname,
+ .description = "CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ else if (coninfo->contype == 'f')
+ {
+ char *only;
+
+ /*
+ * Foreign keys on partitioned tables are always declared as
+ * inheriting to partitions; for all other cases, emit them as
+ * applying ONLY directly to the named table, because that's how they
+ * work for regular inherited tables.
+ */
+ only = tbinfo->relkind == RELKIND_PARTITIONED_TABLE ? "" : "ONLY ";
+
+ /*
+ * XXX Potentially wrap in a 'SET CONSTRAINTS OFF' block so that the
+ * current table data is not processed
+ */
+ appendPQExpBuffer(q, "ALTER %sTABLE %s%s\n", foreign,
+ only, fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
+ fmtId(coninfo->dobj.name),
+ coninfo->condef);
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE %s%s ", foreign,
+ only, fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "FK CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ else if (coninfo->contype == 'c' && tbinfo)
+ {
+ /* CHECK constraint on a table */
+
+ /* Ignore if not to be dumped separately, or if it was inherited */
+ if (coninfo->separate && coninfo->conislocal)
+ {
+ /* not ONLY since we want it to propagate to children */
+ appendPQExpBuffer(q, "ALTER %sTABLE %s\n", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
+ fmtId(coninfo->dobj.name),
+ coninfo->condef);
+
+ appendPQExpBuffer(delq, "ALTER %sTABLE %s ", foreign,
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "CHECK CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ }
+ else if (coninfo->contype == 'c' && tbinfo == NULL)
+ {
+ /* CHECK constraint on a domain */
+ TypeInfo *tyinfo = coninfo->condomain;
+
+ /* Ignore if not to be dumped separately */
+ if (coninfo->separate)
+ {
+ appendPQExpBuffer(q, "ALTER DOMAIN %s\n",
+ fmtQualifiedDumpable(tyinfo));
+ appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n",
+ fmtId(coninfo->dobj.name),
+ coninfo->condef);
+
+ appendPQExpBuffer(delq, "ALTER DOMAIN %s ",
+ fmtQualifiedDumpable(tyinfo));
+ appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n",
+ fmtId(coninfo->dobj.name));
+
+ tag = psprintf("%s %s", tyinfo->dobj.name, coninfo->dobj.name);
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, coninfo->dobj.catId, coninfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tyinfo->dobj.namespace->dobj.name,
+ .owner = tyinfo->rolname,
+ .description = "CHECK CONSTRAINT",
+ .section = SECTION_POST_DATA,
+ .createStmt = q->data,
+ .dropStmt = delq->data));
+ }
+ }
+ else
+ {
+ pg_fatal("unrecognized constraint type: %c",
+ coninfo->contype);
+ }
+
+ /* Dump Constraint Comments --- only works for table constraints */
+ if (tbinfo && coninfo->separate &&
+ coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpTableConstraintComment(fout, coninfo);
+
+ free(tag);
+ destroyPQExpBuffer(q);
+ destroyPQExpBuffer(delq);
+}
+
+/*
+ * dumpTableConstraintComment --- dump a constraint's comment if any
+ *
+ * This is split out because we need the function in two different places
+ * depending on whether the constraint is dumped as part of CREATE TABLE
+ * or as a separate ALTER command.
+ */
+static void
+dumpTableConstraintComment(Archive *fout, const ConstraintInfo *coninfo)
+{
+ TableInfo *tbinfo = coninfo->contable;
+ PQExpBuffer conprefix = createPQExpBuffer();
+ char *qtabname;
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ appendPQExpBuffer(conprefix, "CONSTRAINT %s ON",
+ fmtId(coninfo->dobj.name));
+
+ if (coninfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, conprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->rolname,
+ coninfo->dobj.catId, 0,
+ coninfo->separate ? coninfo->dobj.dumpId : tbinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(conprefix);
+ free(qtabname);
+}
+
+/*
+ * dumpSequence
+ * write the declaration (not data) of one user-defined sequence
+ */
+static void
+dumpSequence(Archive *fout, const TableInfo *tbinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PGresult *res;
+ char *startv,
+ *incby,
+ *maxv,
+ *minv,
+ *cache,
+ *seqtype;
+ bool cycled;
+ bool is_ascending;
+ int64 default_minv,
+ default_maxv;
+ char bufm[32],
+ bufx[32];
+ PQExpBuffer query = createPQExpBuffer();
+ PQExpBuffer delqry = createPQExpBuffer();
+ char *qseqname;
+ TableInfo *owning_tab = NULL;
+
+ qseqname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ if (fout->remoteVersion >= 100000)
+ {
+ appendPQExpBuffer(query,
+ "SELECT format_type(seqtypid, NULL), "
+ "seqstart, seqincrement, "
+ "seqmax, seqmin, "
+ "seqcache, seqcycle "
+ "FROM pg_catalog.pg_sequence "
+ "WHERE seqrelid = '%u'::oid",
+ tbinfo->dobj.catId.oid);
+ }
+ else
+ {
+ /*
+ * Before PostgreSQL 10, sequence metadata is in the sequence itself.
+ *
+ * Note: it might seem that 'bigint' potentially needs to be
+ * schema-qualified, but actually that's a keyword.
+ */
+ appendPQExpBuffer(query,
+ "SELECT 'bigint' AS sequence_type, "
+ "start_value, increment_by, max_value, min_value, "
+ "cache_value, is_cycled FROM %s",
+ fmtQualifiedDumpable(tbinfo));
+ }
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
+ "query to get data of sequence \"%s\" returned %d rows (expected 1)",
+ PQntuples(res)),
+ tbinfo->dobj.name, PQntuples(res));
+
+ seqtype = PQgetvalue(res, 0, 0);
+ startv = PQgetvalue(res, 0, 1);
+ incby = PQgetvalue(res, 0, 2);
+ maxv = PQgetvalue(res, 0, 3);
+ minv = PQgetvalue(res, 0, 4);
+ cache = PQgetvalue(res, 0, 5);
+ cycled = (strcmp(PQgetvalue(res, 0, 6), "t") == 0);
+
+ /* Calculate default limits for a sequence of this type */
+ is_ascending = (incby[0] != '-');
+ if (strcmp(seqtype, "smallint") == 0)
+ {
+ default_minv = is_ascending ? 1 : PG_INT16_MIN;
+ default_maxv = is_ascending ? PG_INT16_MAX : -1;
+ }
+ else if (strcmp(seqtype, "integer") == 0)
+ {
+ default_minv = is_ascending ? 1 : PG_INT32_MIN;
+ default_maxv = is_ascending ? PG_INT32_MAX : -1;
+ }
+ else if (strcmp(seqtype, "bigint") == 0)
+ {
+ default_minv = is_ascending ? 1 : PG_INT64_MIN;
+ default_maxv = is_ascending ? PG_INT64_MAX : -1;
+ }
+ else
+ {
+ pg_fatal("unrecognized sequence type: %s", seqtype);
+ default_minv = default_maxv = 0; /* keep compiler quiet */
+ }
+
+ /*
+ * 64-bit strtol() isn't very portable, so convert the limits to strings
+ * and compare that way.
+ */
+ snprintf(bufm, sizeof(bufm), INT64_FORMAT, default_minv);
+ snprintf(bufx, sizeof(bufx), INT64_FORMAT, default_maxv);
+
+ /* Don't print minv/maxv if they match the respective default limit */
+ if (strcmp(minv, bufm) == 0)
+ minv = NULL;
+ if (strcmp(maxv, bufx) == 0)
+ maxv = NULL;
+
+ /*
+ * Identity sequences are not to be dropped separately.
+ */
+ if (!tbinfo->is_identity_sequence)
+ {
+ appendPQExpBuffer(delqry, "DROP SEQUENCE %s;\n",
+ fmtQualifiedDumpable(tbinfo));
+ }
+
+ resetPQExpBuffer(query);
+
+ if (dopt->binary_upgrade)
+ {
+ binary_upgrade_set_pg_class_oids(fout, query,
+ tbinfo->dobj.catId.oid, false);
+
+ /*
+ * In older PG versions a sequence will have a pg_type entry, but v14
+ * and up don't use that, so don't attempt to preserve the type OID.
+ */
+ }
+
+ if (tbinfo->is_identity_sequence)
+ {
+ owning_tab = findTableByOid(tbinfo->owning_tab);
+
+ appendPQExpBuffer(query,
+ "ALTER TABLE %s ",
+ fmtQualifiedDumpable(owning_tab));
+ appendPQExpBuffer(query,
+ "ALTER COLUMN %s ADD GENERATED ",
+ fmtId(owning_tab->attnames[tbinfo->owning_col - 1]));
+ if (owning_tab->attidentity[tbinfo->owning_col - 1] == ATTRIBUTE_IDENTITY_ALWAYS)
+ appendPQExpBufferStr(query, "ALWAYS");
+ else if (owning_tab->attidentity[tbinfo->owning_col - 1] == ATTRIBUTE_IDENTITY_BY_DEFAULT)
+ appendPQExpBufferStr(query, "BY DEFAULT");
+ appendPQExpBuffer(query, " AS IDENTITY (\n SEQUENCE NAME %s\n",
+ fmtQualifiedDumpable(tbinfo));
+ }
+ else
+ {
+ appendPQExpBuffer(query,
+ "CREATE %sSEQUENCE %s\n",
+ tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
+ "UNLOGGED " : "",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (strcmp(seqtype, "bigint") != 0)
+ appendPQExpBuffer(query, " AS %s\n", seqtype);
+ }
+
+ appendPQExpBuffer(query, " START WITH %s\n", startv);
+
+ appendPQExpBuffer(query, " INCREMENT BY %s\n", incby);
+
+ if (minv)
+ appendPQExpBuffer(query, " MINVALUE %s\n", minv);
+ else
+ appendPQExpBufferStr(query, " NO MINVALUE\n");
+
+ if (maxv)
+ appendPQExpBuffer(query, " MAXVALUE %s\n", maxv);
+ else
+ appendPQExpBufferStr(query, " NO MAXVALUE\n");
+
+ appendPQExpBuffer(query,
+ " CACHE %s%s",
+ cache, (cycled ? "\n CYCLE" : ""));
+
+ if (tbinfo->is_identity_sequence)
+ {
+ appendPQExpBufferStr(query, "\n);\n");
+ if (tbinfo->relpersistence != owning_tab->relpersistence)
+ appendPQExpBuffer(query,
+ "ALTER SEQUENCE %s SET %s;\n",
+ fmtQualifiedDumpable(tbinfo),
+ tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
+ "UNLOGGED" : "LOGGED");
+ }
+ else
+ appendPQExpBufferStr(query, ";\n");
+
+ /* binary_upgrade: no need to clear TOAST table oid */
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(query, &tbinfo->dobj,
+ "SEQUENCE", qseqname,
+ tbinfo->dobj.namespace->dobj.name);
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SEQUENCE",
+ .section = SECTION_PRE_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ /*
+ * If the sequence is owned by a table column, emit the ALTER for it as a
+ * separate TOC entry immediately following the sequence's own entry. It's
+ * OK to do this rather than using full sorting logic, because the
+ * dependency that tells us it's owned will have forced the table to be
+ * created first. We can't just include the ALTER in the TOC entry
+ * because it will fail if we haven't reassigned the sequence owner to
+ * match the table's owner.
+ *
+ * We need not schema-qualify the table reference because both sequence
+ * and table must be in the same schema.
+ */
+ if (OidIsValid(tbinfo->owning_tab) && !tbinfo->is_identity_sequence)
+ {
+ owning_tab = findTableByOid(tbinfo->owning_tab);
+
+ if (owning_tab == NULL)
+ pg_fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found",
+ tbinfo->owning_tab, tbinfo->dobj.catId.oid);
+
+ if (owning_tab->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ {
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "ALTER SEQUENCE %s",
+ fmtQualifiedDumpable(tbinfo));
+ appendPQExpBuffer(query, " OWNED BY %s",
+ fmtQualifiedDumpable(owning_tab));
+ appendPQExpBuffer(query, ".%s;\n",
+ fmtId(owning_tab->attnames[tbinfo->owning_col - 1]));
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SEQUENCE OWNED BY",
+ .section = SECTION_PRE_DATA,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+ }
+ }
+
+ /* Dump Sequence Comments and Security Labels */
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "SEQUENCE", qseqname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
+
+ if (tbinfo->dobj.dump & DUMP_COMPONENT_SECLABEL)
+ dumpSecLabel(fout, "SEQUENCE", qseqname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ tbinfo->dobj.catId, 0, tbinfo->dobj.dumpId);
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ free(qseqname);
+}
+
+/*
+ * dumpSequenceData
+ * write the data of one user-defined sequence
+ */
+static void
+dumpSequenceData(Archive *fout, const TableDataInfo *tdinfo)
+{
+ TableInfo *tbinfo = tdinfo->tdtable;
+ PGresult *res;
+ char *last;
+ bool called;
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBuffer(query,
+ "SELECT last_value, is_called FROM %s",
+ fmtQualifiedDumpable(tbinfo));
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ pg_fatal(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
+ "query to get data of sequence \"%s\" returned %d rows (expected 1)",
+ PQntuples(res)),
+ tbinfo->dobj.name, PQntuples(res));
+
+ last = PQgetvalue(res, 0, 0);
+ called = (strcmp(PQgetvalue(res, 0, 1), "t") == 0);
+
+ resetPQExpBuffer(query);
+ appendPQExpBufferStr(query, "SELECT pg_catalog.setval(");
+ appendStringLiteralAH(query, fmtQualifiedDumpable(tbinfo), fout);
+ appendPQExpBuffer(query, ", %s, %s);\n",
+ last, (called ? "true" : "false"));
+
+ if (tdinfo->dobj.dump & DUMP_COMPONENT_DATA)
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ ARCHIVE_OPTS(.tag = tbinfo->dobj.name,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "SEQUENCE SET",
+ .section = SECTION_DATA,
+ .createStmt = query->data,
+ .deps = &(tbinfo->dobj.dumpId),
+ .nDeps = 1));
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * dumpTrigger
+ * write the declaration of one user-defined table trigger
+ */
+static void
+dumpTrigger(Archive *fout, const TriggerInfo *tginfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = tginfo->tgtable;
+ PQExpBuffer query;
+ PQExpBuffer delqry;
+ PQExpBuffer trigprefix;
+ PQExpBuffer trigidentity;
+ char *qtabname;
+ char *tgargs;
+ size_t lentgargs;
+ const char *p;
+ int findx;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+ trigprefix = createPQExpBuffer();
+ trigidentity = createPQExpBuffer();
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ appendPQExpBuffer(trigidentity, "%s ", fmtId(tginfo->dobj.name));
+ appendPQExpBuffer(trigidentity, "ON %s", fmtQualifiedDumpable(tbinfo));
+
+ appendPQExpBuffer(delqry, "DROP TRIGGER %s;\n", trigidentity->data);
+
+ if (tginfo->tgdef)
+ {
+ appendPQExpBuffer(query, "%s;\n", tginfo->tgdef);
+ }
+ else
+ {
+ if (tginfo->tgisconstraint)
+ {
+ appendPQExpBufferStr(query, "CREATE CONSTRAINT TRIGGER ");
+ appendPQExpBufferStr(query, fmtId(tginfo->tgconstrname));
+ }
+ else
+ {
+ appendPQExpBufferStr(query, "CREATE TRIGGER ");
+ appendPQExpBufferStr(query, fmtId(tginfo->dobj.name));
+ }
+ appendPQExpBufferStr(query, "\n ");
+
+ /* Trigger type */
+ if (TRIGGER_FOR_BEFORE(tginfo->tgtype))
+ appendPQExpBufferStr(query, "BEFORE");
+ else if (TRIGGER_FOR_AFTER(tginfo->tgtype))
+ appendPQExpBufferStr(query, "AFTER");
+ else if (TRIGGER_FOR_INSTEAD(tginfo->tgtype))
+ appendPQExpBufferStr(query, "INSTEAD OF");
+ else
+ pg_fatal("unexpected tgtype value: %d", tginfo->tgtype);
+
+ findx = 0;
+ if (TRIGGER_FOR_INSERT(tginfo->tgtype))
+ {
+ appendPQExpBufferStr(query, " INSERT");
+ findx++;
+ }
+ if (TRIGGER_FOR_DELETE(tginfo->tgtype))
+ {
+ if (findx > 0)
+ appendPQExpBufferStr(query, " OR DELETE");
+ else
+ appendPQExpBufferStr(query, " DELETE");
+ findx++;
+ }
+ if (TRIGGER_FOR_UPDATE(tginfo->tgtype))
+ {
+ if (findx > 0)
+ appendPQExpBufferStr(query, " OR UPDATE");
+ else
+ appendPQExpBufferStr(query, " UPDATE");
+ findx++;
+ }
+ if (TRIGGER_FOR_TRUNCATE(tginfo->tgtype))
+ {
+ if (findx > 0)
+ appendPQExpBufferStr(query, " OR TRUNCATE");
+ else
+ appendPQExpBufferStr(query, " TRUNCATE");
+ findx++;
+ }
+ appendPQExpBuffer(query, " ON %s\n",
+ fmtQualifiedDumpable(tbinfo));
+
+ if (tginfo->tgisconstraint)
+ {
+ if (OidIsValid(tginfo->tgconstrrelid))
+ {
+ /* regclass output is already quoted */
+ appendPQExpBuffer(query, " FROM %s\n ",
+ tginfo->tgconstrrelname);
+ }
+ if (!tginfo->tgdeferrable)
+ appendPQExpBufferStr(query, "NOT ");
+ appendPQExpBufferStr(query, "DEFERRABLE INITIALLY ");
+ if (tginfo->tginitdeferred)
+ appendPQExpBufferStr(query, "DEFERRED\n");
+ else
+ appendPQExpBufferStr(query, "IMMEDIATE\n");
+ }
+
+ if (TRIGGER_FOR_ROW(tginfo->tgtype))
+ appendPQExpBufferStr(query, " FOR EACH ROW\n ");
+ else
+ appendPQExpBufferStr(query, " FOR EACH STATEMENT\n ");
+
+ /* regproc output is already sufficiently quoted */
+ appendPQExpBuffer(query, "EXECUTE FUNCTION %s(",
+ tginfo->tgfname);
+
+ tgargs = (char *) PQunescapeBytea((unsigned char *) tginfo->tgargs,
+ &lentgargs);
+ p = tgargs;
+ for (findx = 0; findx < tginfo->tgnargs; findx++)
+ {
+ /* find the embedded null that terminates this trigger argument */
+ size_t tlen = strlen(p);
+
+ if (p + tlen >= tgargs + lentgargs)
+ {
+ /* hm, not found before end of bytea value... */
+ pg_fatal("invalid argument string (%s) for trigger \"%s\" on table \"%s\"",
+ tginfo->tgargs,
+ tginfo->dobj.name,
+ tbinfo->dobj.name);
+ }
+
+ if (findx > 0)
+ appendPQExpBufferStr(query, ", ");
+ appendStringLiteralAH(query, p, fout);
+ p += tlen + 1;
+ }
+ free(tgargs);
+ appendPQExpBufferStr(query, ");\n");
+ }
+
+ /* Triggers can depend on extensions */
+ append_depends_on_extension(fout, query, &tginfo->dobj,
+ "pg_catalog.pg_trigger", "TRIGGER",
+ trigidentity->data);
+
+ if (tginfo->tgispartition)
+ {
+ Assert(tbinfo->ispartition);
+
+ /*
+ * Partition triggers only appear here because their 'tgenabled' flag
+ * differs from its parent's. The trigger is created already, so
+ * remove the CREATE and replace it with an ALTER. (Clear out the
+ * DROP query too, so that pg_dump --create does not cause errors.)
+ */
+ resetPQExpBuffer(query);
+ resetPQExpBuffer(delqry);
+ appendPQExpBuffer(query, "\nALTER %sTABLE %s ",
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "",
+ fmtQualifiedDumpable(tbinfo));
+ switch (tginfo->tgenabled)
+ {
+ case 'f':
+ case 'D':
+ appendPQExpBufferStr(query, "DISABLE");
+ break;
+ case 't':
+ case 'O':
+ appendPQExpBufferStr(query, "ENABLE");
+ break;
+ case 'R':
+ appendPQExpBufferStr(query, "ENABLE REPLICA");
+ break;
+ case 'A':
+ appendPQExpBufferStr(query, "ENABLE ALWAYS");
+ break;
+ }
+ appendPQExpBuffer(query, " TRIGGER %s;\n",
+ fmtId(tginfo->dobj.name));
+ }
+ else if (tginfo->tgenabled != 't' && tginfo->tgenabled != 'O')
+ {
+ appendPQExpBuffer(query, "\nALTER %sTABLE %s ",
+ tbinfo->relkind == RELKIND_FOREIGN_TABLE ? "FOREIGN " : "",
+ fmtQualifiedDumpable(tbinfo));
+ switch (tginfo->tgenabled)
+ {
+ case 'D':
+ case 'f':
+ appendPQExpBufferStr(query, "DISABLE");
+ break;
+ case 'A':
+ appendPQExpBufferStr(query, "ENABLE ALWAYS");
+ break;
+ case 'R':
+ appendPQExpBufferStr(query, "ENABLE REPLICA");
+ break;
+ default:
+ appendPQExpBufferStr(query, "ENABLE");
+ break;
+ }
+ appendPQExpBuffer(query, " TRIGGER %s;\n",
+ fmtId(tginfo->dobj.name));
+ }
+
+ appendPQExpBuffer(trigprefix, "TRIGGER %s ON",
+ fmtId(tginfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, tginfo->dobj.name);
+
+ if (tginfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, tginfo->dobj.catId, tginfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "TRIGGER",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ if (tginfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, trigprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+ tginfo->dobj.catId, 0, tginfo->dobj.dumpId);
+
+ free(tag);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ destroyPQExpBuffer(trigprefix);
+ destroyPQExpBuffer(trigidentity);
+ free(qtabname);
+}
+
+/*
+ * dumpEventTrigger
+ * write the declaration of one user-defined event trigger
+ */
+static void
+dumpEventTrigger(Archive *fout, const EventTriggerInfo *evtinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PQExpBuffer delqry;
+ char *qevtname;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ query = createPQExpBuffer();
+ delqry = createPQExpBuffer();
+
+ qevtname = pg_strdup(fmtId(evtinfo->dobj.name));
+
+ appendPQExpBufferStr(query, "CREATE EVENT TRIGGER ");
+ appendPQExpBufferStr(query, qevtname);
+ appendPQExpBufferStr(query, " ON ");
+ appendPQExpBufferStr(query, fmtId(evtinfo->evtevent));
+
+ if (strcmp("", evtinfo->evttags) != 0)
+ {
+ appendPQExpBufferStr(query, "\n WHEN TAG IN (");
+ appendPQExpBufferStr(query, evtinfo->evttags);
+ appendPQExpBufferChar(query, ')');
+ }
+
+ appendPQExpBufferStr(query, "\n EXECUTE FUNCTION ");
+ appendPQExpBufferStr(query, evtinfo->evtfname);
+ appendPQExpBufferStr(query, "();\n");
+
+ if (evtinfo->evtenabled != 'O')
+ {
+ appendPQExpBuffer(query, "\nALTER EVENT TRIGGER %s ",
+ qevtname);
+ switch (evtinfo->evtenabled)
+ {
+ case 'D':
+ appendPQExpBufferStr(query, "DISABLE");
+ break;
+ case 'A':
+ appendPQExpBufferStr(query, "ENABLE ALWAYS");
+ break;
+ case 'R':
+ appendPQExpBufferStr(query, "ENABLE REPLICA");
+ break;
+ default:
+ appendPQExpBufferStr(query, "ENABLE");
+ break;
+ }
+ appendPQExpBufferStr(query, ";\n");
+ }
+
+ appendPQExpBuffer(delqry, "DROP EVENT TRIGGER %s;\n",
+ qevtname);
+
+ if (dopt->binary_upgrade)
+ binary_upgrade_extension_member(query, &evtinfo->dobj,
+ "EVENT TRIGGER", qevtname, NULL);
+
+ if (evtinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, evtinfo->dobj.catId, evtinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = evtinfo->dobj.name,
+ .owner = evtinfo->evtowner,
+ .description = "EVENT TRIGGER",
+ .section = SECTION_POST_DATA,
+ .createStmt = query->data,
+ .dropStmt = delqry->data));
+
+ if (evtinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, "EVENT TRIGGER", qevtname,
+ NULL, evtinfo->evtowner,
+ evtinfo->dobj.catId, 0, evtinfo->dobj.dumpId);
+
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(delqry);
+ free(qevtname);
+}
+
+/*
+ * dumpRule
+ * Dump a rule
+ */
+static void
+dumpRule(Archive *fout, const RuleInfo *rinfo)
+{
+ DumpOptions *dopt = fout->dopt;
+ TableInfo *tbinfo = rinfo->ruletable;
+ bool is_view;
+ PQExpBuffer query;
+ PQExpBuffer cmd;
+ PQExpBuffer delcmd;
+ PQExpBuffer ruleprefix;
+ char *qtabname;
+ PGresult *res;
+ char *tag;
+
+ /* Do nothing in data-only dump */
+ if (dopt->dataOnly)
+ return;
+
+ /*
+ * If it is an ON SELECT rule that is created implicitly by CREATE VIEW,
+ * we do not want to dump it as a separate object.
+ */
+ if (!rinfo->separate)
+ return;
+
+ /*
+ * If it's an ON SELECT rule, we want to print it as a view definition,
+ * instead of a rule.
+ */
+ is_view = (rinfo->ev_type == '1' && rinfo->is_instead);
+
+ query = createPQExpBuffer();
+ cmd = createPQExpBuffer();
+ delcmd = createPQExpBuffer();
+ ruleprefix = createPQExpBuffer();
+
+ qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
+
+ if (is_view)
+ {
+ PQExpBuffer result;
+
+ /*
+ * We need OR REPLACE here because we'll be replacing a dummy view.
+ * Otherwise this should look largely like the regular view dump code.
+ */
+ appendPQExpBuffer(cmd, "CREATE OR REPLACE VIEW %s",
+ fmtQualifiedDumpable(tbinfo));
+ if (nonemptyReloptions(tbinfo->reloptions))
+ {
+ appendPQExpBufferStr(cmd, " WITH (");
+ appendReloptionsArrayAH(cmd, tbinfo->reloptions, "", fout);
+ appendPQExpBufferChar(cmd, ')');
+ }
+ result = createViewAsClause(fout, tbinfo);
+ appendPQExpBuffer(cmd, " AS\n%s", result->data);
+ destroyPQExpBuffer(result);
+ if (tbinfo->checkoption != NULL)
+ appendPQExpBuffer(cmd, "\n WITH %s CHECK OPTION",
+ tbinfo->checkoption);
+ appendPQExpBufferStr(cmd, ";\n");
+ }
+ else
+ {
+ /* In the rule case, just print pg_get_ruledef's result verbatim */
+ appendPQExpBuffer(query,
+ "SELECT pg_catalog.pg_get_ruledef('%u'::pg_catalog.oid)",
+ rinfo->dobj.catId.oid);
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ if (PQntuples(res) != 1)
+ pg_fatal("query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned",
+ rinfo->dobj.name, tbinfo->dobj.name);
+
+ printfPQExpBuffer(cmd, "%s\n", PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+ }
+
+ /*
+ * Add the command to alter the rules replication firing semantics if it
+ * differs from the default.
+ */
+ if (rinfo->ev_enabled != 'O')
+ {
+ appendPQExpBuffer(cmd, "ALTER TABLE %s ", fmtQualifiedDumpable(tbinfo));
+ switch (rinfo->ev_enabled)
+ {
+ case 'A':
+ appendPQExpBuffer(cmd, "ENABLE ALWAYS RULE %s;\n",
+ fmtId(rinfo->dobj.name));
+ break;
+ case 'R':
+ appendPQExpBuffer(cmd, "ENABLE REPLICA RULE %s;\n",
+ fmtId(rinfo->dobj.name));
+ break;
+ case 'D':
+ appendPQExpBuffer(cmd, "DISABLE RULE %s;\n",
+ fmtId(rinfo->dobj.name));
+ break;
+ }
+ }
+
+ if (is_view)
+ {
+ /*
+ * We can't DROP a view's ON SELECT rule. Instead, use CREATE OR
+ * REPLACE VIEW to replace the rule with something with minimal
+ * dependencies.
+ */
+ PQExpBuffer result;
+
+ appendPQExpBuffer(delcmd, "CREATE OR REPLACE VIEW %s",
+ fmtQualifiedDumpable(tbinfo));
+ result = createDummyViewAsClause(fout, tbinfo);
+ appendPQExpBuffer(delcmd, " AS\n%s;\n", result->data);
+ destroyPQExpBuffer(result);
+ }
+ else
+ {
+ appendPQExpBuffer(delcmd, "DROP RULE %s ",
+ fmtId(rinfo->dobj.name));
+ appendPQExpBuffer(delcmd, "ON %s;\n",
+ fmtQualifiedDumpable(tbinfo));
+ }
+
+ appendPQExpBuffer(ruleprefix, "RULE %s ON",
+ fmtId(rinfo->dobj.name));
+
+ tag = psprintf("%s %s", tbinfo->dobj.name, rinfo->dobj.name);
+
+ if (rinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
+ ArchiveEntry(fout, rinfo->dobj.catId, rinfo->dobj.dumpId,
+ ARCHIVE_OPTS(.tag = tag,
+ .namespace = tbinfo->dobj.namespace->dobj.name,
+ .owner = tbinfo->rolname,
+ .description = "RULE",
+ .section = SECTION_POST_DATA,
+ .createStmt = cmd->data,
+ .dropStmt = delcmd->data));
+
+ /* Dump rule comments */
+ if (rinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+ dumpComment(fout, ruleprefix->data, qtabname,
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->rolname,
+ rinfo->dobj.catId, 0, rinfo->dobj.dumpId);
+
+ free(tag);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(cmd);
+ destroyPQExpBuffer(delcmd);
+ destroyPQExpBuffer(ruleprefix);
+ free(qtabname);
+}
+
+/*
+ * getExtensionMembership --- obtain extension membership data
+ *
+ * We need to identify objects that are extension members as soon as they're
+ * loaded, so that we can correctly determine whether they need to be dumped.
+ * Generally speaking, extension member objects will get marked as *not* to
+ * be dumped, as they will be recreated by the single CREATE EXTENSION
+ * command. However, in binary upgrade mode we still need to dump the members
+ * individually.
+ */
+void
+getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_classid,
+ i_objid,
+ i_refobjid;
+ ExtensionInfo *ext;
+
+ /* Nothing to do if no extensions */
+ if (numExtensions == 0)
+ return;
+
+ query = createPQExpBuffer();
+
+ /* refclassid constraint is redundant but may speed the search */
+ appendPQExpBufferStr(query, "SELECT "
+ "classid, objid, refobjid "
+ "FROM pg_depend "
+ "WHERE refclassid = 'pg_extension'::regclass "
+ "AND deptype = 'e' "
+ "ORDER BY 3");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_classid = PQfnumber(res, "classid");
+ i_objid = PQfnumber(res, "objid");
+ i_refobjid = PQfnumber(res, "refobjid");
+
+ /*
+ * Since we ordered the SELECT by referenced ID, we can expect that
+ * multiple entries for the same extension will appear together; this
+ * saves on searches.
+ */
+ ext = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ Oid extId;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objid));
+ extId = atooid(PQgetvalue(res, i, i_refobjid));
+
+ if (ext == NULL ||
+ ext->dobj.catId.oid != extId)
+ ext = findExtensionByOid(extId);
+
+ if (ext == NULL)
+ {
+ /* shouldn't happen */
+ pg_log_warning("could not find referenced extension %u", extId);
+ continue;
+ }
+
+ recordExtensionMembership(objId, ext);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * processExtensionTables --- deal with extension configuration tables
+ *
+ * There are two parts to this process:
+ *
+ * 1. Identify and create dump records for extension configuration tables.
+ *
+ * Extensions can mark tables as "configuration", which means that the user
+ * is able and expected to modify those tables after the extension has been
+ * loaded. For these tables, we dump out only the data- the structure is
+ * expected to be handled at CREATE EXTENSION time, including any indexes or
+ * foreign keys, which brings us to-
+ *
+ * 2. Record FK dependencies between configuration tables.
+ *
+ * Due to the FKs being created at CREATE EXTENSION time and therefore before
+ * the data is loaded, we have to work out what the best order for reloading
+ * the data is, to avoid FK violations when the tables are restored. This is
+ * not perfect- we can't handle circular dependencies and if any exist they
+ * will cause an invalid dump to be produced (though at least all of the data
+ * is included for a user to manually restore). This is currently documented
+ * but perhaps we can provide a better solution in the future.
+ */
+void
+processExtensionTables(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions)
+{
+ DumpOptions *dopt = fout->dopt;
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_conrelid,
+ i_confrelid;
+
+ /* Nothing to do if no extensions */
+ if (numExtensions == 0)
+ return;
+
+ /*
+ * Identify extension configuration tables and create TableDataInfo
+ * objects for them, ensuring their data will be dumped even though the
+ * tables themselves won't be.
+ *
+ * Note that we create TableDataInfo objects even in schemaOnly mode, ie,
+ * user data in a configuration table is treated like schema data. This
+ * seems appropriate since system data in a config table would get
+ * reloaded by CREATE EXTENSION. If the extension is not listed in the
+ * list of extensions to be included, none of its data is dumped.
+ */
+ for (i = 0; i < numExtensions; i++)
+ {
+ ExtensionInfo *curext = &(extinfo[i]);
+ char *extconfig = curext->extconfig;
+ char *extcondition = curext->extcondition;
+ char **extconfigarray = NULL;
+ char **extconditionarray = NULL;
+ int nconfigitems = 0;
+ int nconditionitems = 0;
+
+ /*
+ * Check if this extension is listed as to include in the dump. If
+ * not, any table data associated with it is discarded.
+ */
+ if (extension_include_oids.head != NULL &&
+ !simple_oid_list_member(&extension_include_oids,
+ curext->dobj.catId.oid))
+ continue;
+
+ if (strlen(extconfig) != 0 || strlen(extcondition) != 0)
+ {
+ int j;
+
+ if (!parsePGArray(extconfig, &extconfigarray, &nconfigitems))
+ pg_fatal("could not parse %s array", "extconfig");
+ if (!parsePGArray(extcondition, &extconditionarray, &nconditionitems))
+ pg_fatal("could not parse %s array", "extcondition");
+ if (nconfigitems != nconditionitems)
+ pg_fatal("mismatched number of configurations and conditions for extension");
+
+ for (j = 0; j < nconfigitems; j++)
+ {
+ TableInfo *configtbl;
+ Oid configtbloid = atooid(extconfigarray[j]);
+ bool dumpobj =
+ curext->dobj.dump & DUMP_COMPONENT_DEFINITION;
+
+ configtbl = findTableByOid(configtbloid);
+ if (configtbl == NULL)
+ continue;
+
+ /*
+ * Tables of not-to-be-dumped extensions shouldn't be dumped
+ * unless the table or its schema is explicitly included
+ */
+ if (!(curext->dobj.dump & DUMP_COMPONENT_DEFINITION))
+ {
+ /* check table explicitly requested */
+ if (table_include_oids.head != NULL &&
+ simple_oid_list_member(&table_include_oids,
+ configtbloid))
+ dumpobj = true;
+
+ /* check table's schema explicitly requested */
+ if (configtbl->dobj.namespace->dobj.dump &
+ DUMP_COMPONENT_DATA)
+ dumpobj = true;
+ }
+
+ /* check table excluded by an exclusion switch */
+ if (table_exclude_oids.head != NULL &&
+ simple_oid_list_member(&table_exclude_oids,
+ configtbloid))
+ dumpobj = false;
+
+ /* check schema excluded by an exclusion switch */
+ if (simple_oid_list_member(&schema_exclude_oids,
+ configtbl->dobj.namespace->dobj.catId.oid))
+ dumpobj = false;
+
+ if (dumpobj)
+ {
+ makeTableDataInfo(dopt, configtbl);
+ if (configtbl->dataObj != NULL)
+ {
+ if (strlen(extconditionarray[j]) > 0)
+ configtbl->dataObj->filtercond = pg_strdup(extconditionarray[j]);
+ }
+ }
+ }
+ }
+ if (extconfigarray)
+ free(extconfigarray);
+ if (extconditionarray)
+ free(extconditionarray);
+ }
+
+ /*
+ * Now that all the TableDataInfo objects have been created for all the
+ * extensions, check their FK dependencies and register them to try and
+ * dump the data out in an order that they can be restored in.
+ *
+ * Note that this is not a problem for user tables as their FKs are
+ * recreated after the data has been loaded.
+ */
+
+ query = createPQExpBuffer();
+
+ printfPQExpBuffer(query,
+ "SELECT conrelid, confrelid "
+ "FROM pg_constraint "
+ "JOIN pg_depend ON (objid = confrelid) "
+ "WHERE contype = 'f' "
+ "AND refclassid = 'pg_extension'::regclass "
+ "AND classid = 'pg_class'::regclass;");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+ ntups = PQntuples(res);
+
+ i_conrelid = PQfnumber(res, "conrelid");
+ i_confrelid = PQfnumber(res, "confrelid");
+
+ /* Now get the dependencies and register them */
+ for (i = 0; i < ntups; i++)
+ {
+ Oid conrelid,
+ confrelid;
+ TableInfo *reftable,
+ *contable;
+
+ conrelid = atooid(PQgetvalue(res, i, i_conrelid));
+ confrelid = atooid(PQgetvalue(res, i, i_confrelid));
+ contable = findTableByOid(conrelid);
+ reftable = findTableByOid(confrelid);
+
+ if (reftable == NULL ||
+ reftable->dataObj == NULL ||
+ contable == NULL ||
+ contable->dataObj == NULL)
+ continue;
+
+ /*
+ * Make referencing TABLE_DATA object depend on the referenced table's
+ * TABLE_DATA object.
+ */
+ addObjectDependency(&contable->dataObj->dobj,
+ reftable->dataObj->dobj.dumpId);
+ }
+ PQclear(res);
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * getDependencies --- obtain available dependency data
+ */
+static void
+getDependencies(Archive *fout)
+{
+ PQExpBuffer query;
+ PGresult *res;
+ int ntups,
+ i;
+ int i_classid,
+ i_objid,
+ i_refclassid,
+ i_refobjid,
+ i_deptype;
+ DumpableObject *dobj,
+ *refdobj;
+
+ pg_log_info("reading dependency data");
+
+ query = createPQExpBuffer();
+
+ /*
+ * Messy query to collect the dependency data we need. Note that we
+ * ignore the sub-object column, so that dependencies of or on a column
+ * look the same as dependencies of or on a whole table.
+ *
+ * PIN dependencies aren't interesting, and EXTENSION dependencies were
+ * already processed by getExtensionMembership.
+ */
+ appendPQExpBufferStr(query, "SELECT "
+ "classid, objid, refclassid, refobjid, deptype "
+ "FROM pg_depend "
+ "WHERE deptype != 'p' AND deptype != 'e'\n");
+
+ /*
+ * Since we don't treat pg_amop entries as separate DumpableObjects, we
+ * have to translate their dependencies into dependencies of their parent
+ * opfamily. Ignore internal dependencies though, as those will point to
+ * their parent opclass, which we needn't consider here (and if we did,
+ * it'd just result in circular dependencies). Also, "loose" opfamily
+ * entries will have dependencies on their parent opfamily, which we
+ * should drop since they'd likewise become useless self-dependencies.
+ * (But be sure to keep deps on *other* opfamilies; see amopsortfamily.)
+ */
+ appendPQExpBufferStr(query, "UNION ALL\n"
+ "SELECT 'pg_opfamily'::regclass AS classid, amopfamily AS objid, refclassid, refobjid, deptype "
+ "FROM pg_depend d, pg_amop o "
+ "WHERE deptype NOT IN ('p', 'e', 'i') AND "
+ "classid = 'pg_amop'::regclass AND objid = o.oid "
+ "AND NOT (refclassid = 'pg_opfamily'::regclass AND amopfamily = refobjid)\n");
+
+ /* Likewise for pg_amproc entries */
+ appendPQExpBufferStr(query, "UNION ALL\n"
+ "SELECT 'pg_opfamily'::regclass AS classid, amprocfamily AS objid, refclassid, refobjid, deptype "
+ "FROM pg_depend d, pg_amproc p "
+ "WHERE deptype NOT IN ('p', 'e', 'i') AND "
+ "classid = 'pg_amproc'::regclass AND objid = p.oid "
+ "AND NOT (refclassid = 'pg_opfamily'::regclass AND amprocfamily = refobjid)\n");
+
+ /* Sort the output for efficiency below */
+ appendPQExpBufferStr(query, "ORDER BY 1,2");
+
+ res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
+
+ ntups = PQntuples(res);
+
+ i_classid = PQfnumber(res, "classid");
+ i_objid = PQfnumber(res, "objid");
+ i_refclassid = PQfnumber(res, "refclassid");
+ i_refobjid = PQfnumber(res, "refobjid");
+ i_deptype = PQfnumber(res, "deptype");
+
+ /*
+ * Since we ordered the SELECT by referencing ID, we can expect that
+ * multiple entries for the same object will appear together; this saves
+ * on searches.
+ */
+ dobj = NULL;
+
+ for (i = 0; i < ntups; i++)
+ {
+ CatalogId objId;
+ CatalogId refobjId;
+ char deptype;
+
+ objId.tableoid = atooid(PQgetvalue(res, i, i_classid));
+ objId.oid = atooid(PQgetvalue(res, i, i_objid));
+ refobjId.tableoid = atooid(PQgetvalue(res, i, i_refclassid));
+ refobjId.oid = atooid(PQgetvalue(res, i, i_refobjid));
+ deptype = *(PQgetvalue(res, i, i_deptype));
+
+ if (dobj == NULL ||
+ dobj->catId.tableoid != objId.tableoid ||
+ dobj->catId.oid != objId.oid)
+ dobj = findObjectByCatalogId(objId);
+
+ /*
+ * Failure to find objects mentioned in pg_depend is not unexpected,
+ * since for example we don't collect info about TOAST tables.
+ */
+ if (dobj == NULL)
+ {
+#ifdef NOT_USED
+ pg_log_warning("no referencing object %u %u",
+ objId.tableoid, objId.oid);
+#endif
+ continue;
+ }
+
+ refdobj = findObjectByCatalogId(refobjId);
+
+ if (refdobj == NULL)
+ {
+#ifdef NOT_USED
+ pg_log_warning("no referenced object %u %u",
+ refobjId.tableoid, refobjId.oid);
+#endif
+ continue;
+ }
+
+ /*
+ * For 'x' dependencies, mark the object for later; we still add the
+ * normal dependency, for possible ordering purposes. Currently
+ * pg_dump_sort.c knows to put extensions ahead of all object types
+ * that could possibly depend on them, but this is safer.
+ */
+ if (deptype == 'x')
+ dobj->depends_on_ext = true;
+
+ /*
+ * Ordinarily, table rowtypes have implicit dependencies on their
+ * tables. However, for a composite type the implicit dependency goes
+ * the other way in pg_depend; which is the right thing for DROP but
+ * it doesn't produce the dependency ordering we need. So in that one
+ * case, we reverse the direction of the dependency.
+ */
+ if (deptype == 'i' &&
+ dobj->objType == DO_TABLE &&
+ refdobj->objType == DO_TYPE)
+ addObjectDependency(refdobj, dobj->dumpId);
+ else
+ /* normal case */
+ addObjectDependency(dobj, refdobj->dumpId);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(query);
+}
+
+
+/*
+ * createBoundaryObjects - create dummy DumpableObjects to represent
+ * dump section boundaries.
+ */
+static DumpableObject *
+createBoundaryObjects(void)
+{
+ DumpableObject *dobjs;
+
+ dobjs = (DumpableObject *) pg_malloc(2 * sizeof(DumpableObject));
+
+ dobjs[0].objType = DO_PRE_DATA_BOUNDARY;
+ dobjs[0].catId = nilCatalogId;
+ AssignDumpId(dobjs + 0);
+ dobjs[0].name = pg_strdup("PRE-DATA BOUNDARY");
+
+ dobjs[1].objType = DO_POST_DATA_BOUNDARY;
+ dobjs[1].catId = nilCatalogId;
+ AssignDumpId(dobjs + 1);
+ dobjs[1].name = pg_strdup("POST-DATA BOUNDARY");
+
+ return dobjs;
+}
+
+/*
+ * addBoundaryDependencies - add dependencies as needed to enforce the dump
+ * section boundaries.
+ */
+static void
+addBoundaryDependencies(DumpableObject **dobjs, int numObjs,
+ DumpableObject *boundaryObjs)
+{
+ DumpableObject *preDataBound = boundaryObjs + 0;
+ DumpableObject *postDataBound = boundaryObjs + 1;
+ int i;
+
+ for (i = 0; i < numObjs; i++)
+ {
+ DumpableObject *dobj = dobjs[i];
+
+ /*
+ * The classification of object types here must match the SECTION_xxx
+ * values assigned during subsequent ArchiveEntry calls!
+ */
+ switch (dobj->objType)
+ {
+ case DO_NAMESPACE:
+ case DO_EXTENSION:
+ case DO_TYPE:
+ case DO_SHELL_TYPE:
+ case DO_FUNC:
+ case DO_AGG:
+ case DO_OPERATOR:
+ case DO_ACCESS_METHOD:
+ case DO_OPCLASS:
+ case DO_OPFAMILY:
+ case DO_COLLATION:
+ case DO_CONVERSION:
+ case DO_TABLE:
+ case DO_TABLE_ATTACH:
+ case DO_ATTRDEF:
+ case DO_PROCLANG:
+ case DO_CAST:
+ case DO_DUMMY_TYPE:
+ case DO_TSPARSER:
+ case DO_TSDICT:
+ case DO_TSTEMPLATE:
+ case DO_TSCONFIG:
+ case DO_FDW:
+ case DO_FOREIGN_SERVER:
+ case DO_TRANSFORM:
+ case DO_LARGE_OBJECT:
+ /* Pre-data objects: must come before the pre-data boundary */
+ addObjectDependency(preDataBound, dobj->dumpId);
+ break;
+ case DO_TABLE_DATA:
+ case DO_SEQUENCE_SET:
+ case DO_LARGE_OBJECT_DATA:
+ /* Data objects: must come between the boundaries */
+ addObjectDependency(dobj, preDataBound->dumpId);
+ addObjectDependency(postDataBound, dobj->dumpId);
+ break;
+ case DO_INDEX:
+ case DO_INDEX_ATTACH:
+ case DO_STATSEXT:
+ case DO_REFRESH_MATVIEW:
+ case DO_TRIGGER:
+ case DO_EVENT_TRIGGER:
+ case DO_DEFAULT_ACL:
+ case DO_POLICY:
+ case DO_PUBLICATION:
+ case DO_PUBLICATION_REL:
+ case DO_PUBLICATION_TABLE_IN_SCHEMA:
+ case DO_SUBSCRIPTION:
+ /* Post-data objects: must come after the post-data boundary */
+ addObjectDependency(dobj, postDataBound->dumpId);
+ break;
+ case DO_RULE:
+ /* Rules are post-data, but only if dumped separately */
+ if (((RuleInfo *) dobj)->separate)
+ addObjectDependency(dobj, postDataBound->dumpId);
+ break;
+ case DO_CONSTRAINT:
+ case DO_FK_CONSTRAINT:
+ /* Constraints are post-data, but only if dumped separately */
+ if (((ConstraintInfo *) dobj)->separate)
+ addObjectDependency(dobj, postDataBound->dumpId);
+ break;
+ case DO_PRE_DATA_BOUNDARY:
+ /* nothing to do */
+ break;
+ case DO_POST_DATA_BOUNDARY:
+ /* must come after the pre-data boundary */
+ addObjectDependency(dobj, preDataBound->dumpId);
+ break;
+ }
+ }
+}
+
+
+/*
+ * BuildArchiveDependencies - create dependency data for archive TOC entries
+ *
+ * The raw dependency data obtained by getDependencies() is not terribly
+ * useful in an archive dump, because in many cases there are dependency
+ * chains linking through objects that don't appear explicitly in the dump.
+ * For example, a view will depend on its _RETURN rule while the _RETURN rule
+ * will depend on other objects --- but the rule will not appear as a separate
+ * object in the dump. We need to adjust the view's dependencies to include
+ * whatever the rule depends on that is included in the dump.
+ *
+ * Just to make things more complicated, there are also "special" dependencies
+ * such as the dependency of a TABLE DATA item on its TABLE, which we must
+ * not rearrange because pg_restore knows that TABLE DATA only depends on
+ * its table. In these cases we must leave the dependencies strictly as-is
+ * even if they refer to not-to-be-dumped objects.
+ *
+ * To handle this, the convention is that "special" dependencies are created
+ * during ArchiveEntry calls, and an archive TOC item that has any such
+ * entries will not be touched here. Otherwise, we recursively search the
+ * DumpableObject data structures to build the correct dependencies for each
+ * archive TOC item.
+ */
+static void
+BuildArchiveDependencies(Archive *fout)
+{
+ ArchiveHandle *AH = (ArchiveHandle *) fout;
+ TocEntry *te;
+
+ /* Scan all TOC entries in the archive */
+ for (te = AH->toc->next; te != AH->toc; te = te->next)
+ {
+ DumpableObject *dobj;
+ DumpId *dependencies;
+ int nDeps;
+ int allocDeps;
+
+ /* No need to process entries that will not be dumped */
+ if (te->reqs == 0)
+ continue;
+ /* Ignore entries that already have "special" dependencies */
+ if (te->nDeps > 0)
+ continue;
+ /* Otherwise, look up the item's original DumpableObject, if any */
+ dobj = findObjectByDumpId(te->dumpId);
+ if (dobj == NULL)
+ continue;
+ /* No work if it has no dependencies */
+ if (dobj->nDeps <= 0)
+ continue;
+ /* Set up work array */
+ allocDeps = 64;
+ dependencies = (DumpId *) pg_malloc(allocDeps * sizeof(DumpId));
+ nDeps = 0;
+ /* Recursively find all dumpable dependencies */
+ findDumpableDependencies(AH, dobj,
+ &dependencies, &nDeps, &allocDeps);
+ /* And save 'em ... */
+ if (nDeps > 0)
+ {
+ dependencies = (DumpId *) pg_realloc(dependencies,
+ nDeps * sizeof(DumpId));
+ te->dependencies = dependencies;
+ te->nDeps = nDeps;
+ }
+ else
+ free(dependencies);
+ }
+}
+
+/* Recursive search subroutine for BuildArchiveDependencies */
+static void
+findDumpableDependencies(ArchiveHandle *AH, const DumpableObject *dobj,
+ DumpId **dependencies, int *nDeps, int *allocDeps)
+{
+ int i;
+
+ /*
+ * Ignore section boundary objects: if we search through them, we'll
+ * report lots of bogus dependencies.
+ */
+ if (dobj->objType == DO_PRE_DATA_BOUNDARY ||
+ dobj->objType == DO_POST_DATA_BOUNDARY)
+ return;
+
+ for (i = 0; i < dobj->nDeps; i++)
+ {
+ DumpId depid = dobj->dependencies[i];
+
+ if (TocIDRequired(AH, depid) != 0)
+ {
+ /* Object will be dumped, so just reference it as a dependency */
+ if (*nDeps >= *allocDeps)
+ {
+ *allocDeps *= 2;
+ *dependencies = (DumpId *) pg_realloc(*dependencies,
+ *allocDeps * sizeof(DumpId));
+ }
+ (*dependencies)[*nDeps] = depid;
+ (*nDeps)++;
+ }
+ else
+ {
+ /*
+ * Object will not be dumped, so recursively consider its deps. We
+ * rely on the assumption that sortDumpableObjects already broke
+ * any dependency loops, else we might recurse infinitely.
+ */
+ DumpableObject *otherdobj = findObjectByDumpId(depid);
+
+ if (otherdobj)
+ findDumpableDependencies(AH, otherdobj,
+ dependencies, nDeps, allocDeps);
+ }
+ }
+}
+
+
+/*
+ * getFormattedTypeName - retrieve a nicely-formatted type name for the
+ * given type OID.
+ *
+ * This does not guarantee to schema-qualify the output, so it should not
+ * be used to create the target object name for CREATE or ALTER commands.
+ *
+ * Note that the result is cached and must not be freed by the caller.
+ */
+static const char *
+getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
+{
+ TypeInfo *typeInfo;
+ char *result;
+ PQExpBuffer query;
+ PGresult *res;
+
+ if (oid == 0)
+ {
+ if ((opts & zeroAsStar) != 0)
+ return "*";
+ else if ((opts & zeroAsNone) != 0)
+ return "NONE";
+ }
+
+ /* see if we have the result cached in the type's TypeInfo record */
+ typeInfo = findTypeByOid(oid);
+ if (typeInfo && typeInfo->ftypname)
+ return typeInfo->ftypname;
+
+ query = createPQExpBuffer();
+ appendPQExpBuffer(query, "SELECT pg_catalog.format_type('%u'::pg_catalog.oid, NULL)",
+ oid);
+
+ res = ExecuteSqlQueryForSingleRow(fout, query->data);
+
+ /* result of format_type is already quoted */
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ /*
+ * Cache the result for re-use in later requests, if possible. If we
+ * don't have a TypeInfo for the type, the string will be leaked once the
+ * caller is done with it ... but that case really should not happen, so
+ * leaking if it does seems acceptable.
+ */
+ if (typeInfo)
+ typeInfo->ftypname = result;
+
+ return result;
+}
+
+/*
+ * Return a column list clause for the given relation.
+ *
+ * Special case: if there are no undropped columns in the relation, return
+ * "", not an invalid "()" column list.
+ */
+static const char *
+fmtCopyColumnList(const TableInfo *ti, PQExpBuffer buffer)
+{
+ int numatts = ti->numatts;
+ char **attnames = ti->attnames;
+ bool *attisdropped = ti->attisdropped;
+ char *attgenerated = ti->attgenerated;
+ bool needComma;
+ int i;
+
+ appendPQExpBufferChar(buffer, '(');
+ needComma = false;
+ for (i = 0; i < numatts; i++)
+ {
+ if (attisdropped[i])
+ continue;
+ if (attgenerated[i])
+ continue;
+ if (needComma)
+ appendPQExpBufferStr(buffer, ", ");
+ appendPQExpBufferStr(buffer, fmtId(attnames[i]));
+ needComma = true;
+ }
+
+ if (!needComma)
+ return ""; /* no undropped columns */
+
+ appendPQExpBufferChar(buffer, ')');
+ return buffer->data;
+}
+
+/*
+ * Check if a reloptions array is nonempty.
+ */
+static bool
+nonemptyReloptions(const char *reloptions)
+{
+ /* Don't want to print it if it's just "{}" */
+ return (reloptions != NULL && strlen(reloptions) > 2);
+}
+
+/*
+ * Format a reloptions array and append it to the given buffer.
+ *
+ * "prefix" is prepended to the option names; typically it's "" or "toast.".
+ */
+static void
+appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions,
+ const char *prefix, Archive *fout)
+{
+ bool res;
+
+ res = appendReloptionsArray(buffer, reloptions, prefix, fout->encoding,
+ fout->std_strings);
+ if (!res)
+ pg_log_warning("could not parse %s array", "reloptions");
+}
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
new file mode 100644
index 0000000..f9878eb
--- /dev/null
+++ b/src/bin/pg_dump/pg_dump.h
@@ -0,0 +1,756 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dump.h
+ * Common header file for the pg_dump utility
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/pg_dump.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PG_DUMP_H
+#define PG_DUMP_H
+
+#include "pg_backup.h"
+
+
+#define oidcmp(x,y) ( ((x) < (y) ? -1 : ((x) > (y)) ? 1 : 0) )
+
+/*
+ * The data structures used to store system catalog information. Every
+ * dumpable object is a subclass of DumpableObject.
+ *
+ * NOTE: the structures described here live for the entire pg_dump run;
+ * and in most cases we make a struct for every object we can find in the
+ * catalogs, not only those we are actually going to dump. Hence, it's
+ * best to store a minimal amount of per-object info in these structs,
+ * and retrieve additional per-object info when and if we dump a specific
+ * object. In particular, try to avoid retrieving expensive-to-compute
+ * information until it's known to be needed. We do, however, have to
+ * store enough info to determine whether an object should be dumped and
+ * what order to dump in.
+ */
+
+typedef enum
+{
+ /* When modifying this enum, update priority tables in pg_dump_sort.c! */
+ DO_NAMESPACE,
+ DO_EXTENSION,
+ DO_TYPE,
+ DO_SHELL_TYPE,
+ DO_FUNC,
+ DO_AGG,
+ DO_OPERATOR,
+ DO_ACCESS_METHOD,
+ DO_OPCLASS,
+ DO_OPFAMILY,
+ DO_COLLATION,
+ DO_CONVERSION,
+ DO_TABLE,
+ DO_TABLE_ATTACH,
+ DO_ATTRDEF,
+ DO_INDEX,
+ DO_INDEX_ATTACH,
+ DO_STATSEXT,
+ DO_RULE,
+ DO_TRIGGER,
+ DO_CONSTRAINT,
+ DO_FK_CONSTRAINT, /* see note for ConstraintInfo */
+ DO_PROCLANG,
+ DO_CAST,
+ DO_TABLE_DATA,
+ DO_SEQUENCE_SET,
+ DO_DUMMY_TYPE,
+ DO_TSPARSER,
+ DO_TSDICT,
+ DO_TSTEMPLATE,
+ DO_TSCONFIG,
+ DO_FDW,
+ DO_FOREIGN_SERVER,
+ DO_DEFAULT_ACL,
+ DO_TRANSFORM,
+ DO_LARGE_OBJECT,
+ DO_LARGE_OBJECT_DATA,
+ DO_PRE_DATA_BOUNDARY,
+ DO_POST_DATA_BOUNDARY,
+ DO_EVENT_TRIGGER,
+ DO_REFRESH_MATVIEW,
+ DO_POLICY,
+ DO_PUBLICATION,
+ DO_PUBLICATION_REL,
+ DO_PUBLICATION_TABLE_IN_SCHEMA,
+ DO_SUBSCRIPTION
+} DumpableObjectType;
+
+/*
+ * DumpComponents is a bitmask of the potentially dumpable components of
+ * a database object: its core definition, plus optional attributes such
+ * as ACL, comments, etc. The NONE and ALL symbols are convenient
+ * shorthands.
+ */
+typedef uint32 DumpComponents;
+#define DUMP_COMPONENT_NONE (0)
+#define DUMP_COMPONENT_DEFINITION (1 << 0)
+#define DUMP_COMPONENT_DATA (1 << 1)
+#define DUMP_COMPONENT_COMMENT (1 << 2)
+#define DUMP_COMPONENT_SECLABEL (1 << 3)
+#define DUMP_COMPONENT_ACL (1 << 4)
+#define DUMP_COMPONENT_POLICY (1 << 5)
+#define DUMP_COMPONENT_USERMAP (1 << 6)
+#define DUMP_COMPONENT_ALL (0xFFFF)
+
+/*
+ * component types which require us to obtain a lock on the table
+ *
+ * Note that some components only require looking at the information
+ * in the pg_catalog tables and, for those components, we do not need
+ * to lock the table. Be careful here though- some components use
+ * server-side functions which pull the latest information from
+ * SysCache and in those cases we *do* need to lock the table.
+ *
+ * We do not need locks for the COMMENT and SECLABEL components as
+ * those simply query their associated tables without using any
+ * server-side functions. We do not need locks for the ACL component
+ * as we pull that information from pg_class without using any
+ * server-side functions that use SysCache. The USERMAP component
+ * is only relevant for FOREIGN SERVERs and not tables, so no sense
+ * locking a table for that either (that can happen if we are going
+ * to dump "ALL" components for a table).
+ *
+ * We DO need locks for DEFINITION, due to various server-side
+ * functions that are used and POLICY due to pg_get_expr(). We set
+ * this up to grab the lock except in the cases we know to be safe.
+ */
+#define DUMP_COMPONENTS_REQUIRING_LOCK (\
+ DUMP_COMPONENT_DEFINITION |\
+ DUMP_COMPONENT_DATA |\
+ DUMP_COMPONENT_POLICY)
+
+typedef struct _dumpableObject
+{
+ DumpableObjectType objType;
+ CatalogId catId; /* zero if not a cataloged object */
+ DumpId dumpId; /* assigned by AssignDumpId() */
+ char *name; /* object name (should never be NULL) */
+ struct _namespaceInfo *namespace; /* containing namespace, or NULL */
+ DumpComponents dump; /* bitmask of components requested to dump */
+ DumpComponents dump_contains; /* as above, but for contained objects */
+ DumpComponents components; /* bitmask of components available to dump */
+ bool ext_member; /* true if object is member of extension */
+ bool depends_on_ext; /* true if object depends on an extension */
+ DumpId *dependencies; /* dumpIds of objects this one depends on */
+ int nDeps; /* number of valid dependencies */
+ int allocDeps; /* allocated size of dependencies[] */
+} DumpableObject;
+
+/*
+ * Object types that have ACLs must store them in a DumpableAcl sub-struct,
+ * which must immediately follow the DumpableObject base struct.
+ */
+typedef struct _dumpableAcl
+{
+ char *acl; /* the object's actual ACL string */
+ char *acldefault; /* default ACL for the object's type & owner */
+ /* these fields come from the object's pg_init_privs entry, if any: */
+ char privtype; /* entry type, 'i' or 'e'; 0 if no entry */
+ char *initprivs; /* the object's initial ACL string, or NULL */
+} DumpableAcl;
+
+/* Generic struct that can be used to access any object type having an ACL */
+typedef struct _dumpableObjectWithAcl
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+} DumpableObjectWithAcl;
+
+typedef struct _namespaceInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ bool create; /* CREATE SCHEMA, or just set owner? */
+ Oid nspowner; /* OID of owner */
+ const char *rolname; /* name of owner */
+} NamespaceInfo;
+
+typedef struct _extensionInfo
+{
+ DumpableObject dobj;
+ char *namespace; /* schema containing extension's objects */
+ bool relocatable;
+ char *extversion;
+ char *extconfig; /* info about configuration tables */
+ char *extcondition;
+} ExtensionInfo;
+
+typedef struct _typeInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+
+ /*
+ * Note: dobj.name is the raw pg_type.typname entry. ftypname is the
+ * result of format_type(), which will be quoted if needed, and might be
+ * schema-qualified too.
+ */
+ char *ftypname;
+ const char *rolname;
+ Oid typelem;
+ Oid typrelid;
+ char typrelkind; /* 'r', 'v', 'c', etc */
+ char typtype; /* 'b', 'c', etc */
+ bool isArray; /* true if auto-generated array type */
+ bool isMultirange; /* true if auto-generated multirange type */
+ bool isDefined; /* true if typisdefined */
+ /* If needed, we'll create a "shell type" entry for it; link that here: */
+ struct _shellTypeInfo *shellType; /* shell-type entry, or NULL */
+ /* If it's a domain, we store links to its constraints here: */
+ int nDomChecks;
+ struct _constraintInfo *domChecks;
+} TypeInfo;
+
+typedef struct _shellTypeInfo
+{
+ DumpableObject dobj;
+
+ TypeInfo *baseType; /* back link to associated base type */
+} ShellTypeInfo;
+
+typedef struct _funcInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ Oid lang;
+ int nargs;
+ Oid *argtypes;
+ Oid prorettype;
+ bool postponed_def; /* function must be postponed into post-data */
+} FuncInfo;
+
+/* AggInfo is a superset of FuncInfo */
+typedef struct _aggInfo
+{
+ FuncInfo aggfn;
+ /* we don't require any other fields at the moment */
+} AggInfo;
+
+typedef struct _oprInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ char oprkind;
+ Oid oprcode;
+} OprInfo;
+
+typedef struct _accessMethodInfo
+{
+ DumpableObject dobj;
+ char amtype;
+ char *amhandler;
+} AccessMethodInfo;
+
+typedef struct _opclassInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} OpclassInfo;
+
+typedef struct _opfamilyInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} OpfamilyInfo;
+
+typedef struct _collInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} CollInfo;
+
+typedef struct _convInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+} ConvInfo;
+
+typedef struct _tableInfo
+{
+ /*
+ * These fields are collected for every table in the database.
+ */
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ char relkind;
+ char relpersistence; /* relation persistence */
+ bool relispopulated; /* relation is populated */
+ char relreplident; /* replica identifier */
+ char *reltablespace; /* relation tablespace */
+ char *reloptions; /* options specified by WITH (...) */
+ char *checkoption; /* WITH CHECK OPTION, if any */
+ char *toast_reloptions; /* WITH options for the TOAST table */
+ bool hasindex; /* does it have any indexes? */
+ bool hasrules; /* does it have any rules? */
+ bool hastriggers; /* does it have any triggers? */
+ bool hascolumnACLs; /* do any columns have non-default ACLs? */
+ bool rowsec; /* is row security enabled? */
+ bool forcerowsec; /* is row security forced? */
+ bool hasoids; /* does it have OIDs? */
+ uint32 frozenxid; /* table's relfrozenxid */
+ uint32 minmxid; /* table's relminmxid */
+ Oid toast_oid; /* toast table's OID, or 0 if none */
+ uint32 toast_frozenxid; /* toast table's relfrozenxid, if any */
+ uint32 toast_minmxid; /* toast table's relminmxid */
+ int ncheck; /* # of CHECK expressions */
+ Oid reltype; /* OID of table's composite type, if any */
+ Oid reloftype; /* underlying type for typed table */
+ Oid foreign_server; /* foreign server oid, if applicable */
+ /* these two are set only if table is a sequence owned by a column: */
+ Oid owning_tab; /* OID of table owning sequence */
+ int owning_col; /* attr # of column owning sequence */
+ bool is_identity_sequence;
+ int relpages; /* table's size in pages (from pg_class) */
+ int toastpages; /* toast table's size in pages, if any */
+
+ bool interesting; /* true if need to collect more data */
+ bool dummy_view; /* view's real definition must be postponed */
+ bool postponed_def; /* matview must be postponed into post-data */
+ bool ispartition; /* is table a partition? */
+ bool unsafe_partitions; /* is it an unsafe partitioned table? */
+
+ int numParents; /* number of (immediate) parent tables */
+ struct _tableInfo **parents; /* TableInfos of immediate parents */
+
+ /*
+ * These fields are computed only if we decide the table is interesting
+ * (it's either a table to dump, or a direct parent of a dumpable table).
+ */
+ int numatts; /* number of attributes */
+ char **attnames; /* the attribute names */
+ char **atttypnames; /* attribute type names */
+ int *attstattarget; /* attribute statistics targets */
+ char *attstorage; /* attribute storage scheme */
+ char *typstorage; /* type storage scheme */
+ bool *attisdropped; /* true if attr is dropped; don't dump it */
+ char *attidentity;
+ char *attgenerated;
+ int *attlen; /* attribute length, used by binary_upgrade */
+ char *attalign; /* attribute align, used by binary_upgrade */
+ bool *attislocal; /* true if attr has local definition */
+ char **attoptions; /* per-attribute options */
+ Oid *attcollation; /* per-attribute collation selection */
+ char *attcompression; /* per-attribute compression method */
+ char **attfdwoptions; /* per-attribute fdw options */
+ char **attmissingval; /* per attribute missing value */
+ bool *notnull; /* NOT NULL constraints on attributes */
+ bool *inhNotNull; /* true if NOT NULL is inherited */
+ struct _attrDefInfo **attrdefs; /* DEFAULT expressions */
+ struct _constraintInfo *checkexprs; /* CHECK constraints */
+ bool needs_override; /* has GENERATED ALWAYS AS IDENTITY */
+ char *amname; /* relation access method */
+
+ /*
+ * Stuff computed only for dumpable tables.
+ */
+ int numIndexes; /* number of indexes */
+ struct _indxInfo *indexes; /* indexes */
+ struct _tableDataInfo *dataObj; /* TableDataInfo, if dumping its data */
+ int numTriggers; /* number of triggers for table */
+ struct _triggerInfo *triggers; /* array of TriggerInfo structs */
+} TableInfo;
+
+typedef struct _tableAttachInfo
+{
+ DumpableObject dobj;
+ TableInfo *parentTbl; /* link to partitioned table */
+ TableInfo *partitionTbl; /* link to partition */
+} TableAttachInfo;
+
+typedef struct _attrDefInfo
+{
+ DumpableObject dobj; /* note: dobj.name is name of table */
+ TableInfo *adtable; /* link to table of attribute */
+ int adnum;
+ char *adef_expr; /* decompiled DEFAULT expression */
+ bool separate; /* true if must dump as separate item */
+} AttrDefInfo;
+
+typedef struct _tableDataInfo
+{
+ DumpableObject dobj;
+ TableInfo *tdtable; /* link to table to dump */
+ char *filtercond; /* WHERE condition to limit rows dumped */
+} TableDataInfo;
+
+typedef struct _indxInfo
+{
+ DumpableObject dobj;
+ TableInfo *indextable; /* link to table the index is for */
+ char *indexdef;
+ char *tablespace; /* tablespace in which index is stored */
+ char *indreloptions; /* options specified by WITH (...) */
+ char *indstatcols; /* column numbers with statistics */
+ 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
+ * contains both key and nonkey attributes */
+ bool indisclustered;
+ bool indisreplident;
+ bool indnullsnotdistinct;
+ Oid parentidx; /* if a partition, parent index OID */
+ SimplePtrList partattaches; /* if partitioned, partition attach objects */
+
+ /* if there is an associated constraint object, its dumpId: */
+ DumpId indexconstraint;
+} IndxInfo;
+
+typedef struct _indexAttachInfo
+{
+ DumpableObject dobj;
+ IndxInfo *parentIdx; /* link to index on partitioned table */
+ IndxInfo *partitionIdx; /* link to index on partition */
+} IndexAttachInfo;
+
+typedef struct _statsExtInfo
+{
+ DumpableObject dobj;
+ const char *rolname; /* owner */
+ TableInfo *stattable; /* link to table the stats are for */
+ int stattarget; /* statistics target */
+} StatsExtInfo;
+
+typedef struct _ruleInfo
+{
+ DumpableObject dobj;
+ TableInfo *ruletable; /* link to table the rule is for */
+ char ev_type;
+ bool is_instead;
+ char ev_enabled;
+ bool separate; /* true if must dump as separate item */
+ /* separate is always true for non-ON SELECT rules */
+} RuleInfo;
+
+typedef struct _triggerInfo
+{
+ DumpableObject dobj;
+ TableInfo *tgtable; /* link to table the trigger is for */
+ char *tgfname;
+ int tgtype;
+ int tgnargs;
+ char *tgargs;
+ bool tgisconstraint;
+ char *tgconstrname;
+ Oid tgconstrrelid;
+ char *tgconstrrelname;
+ char tgenabled;
+ bool tgispartition;
+ bool tgdeferrable;
+ bool tginitdeferred;
+ char *tgdef;
+} TriggerInfo;
+
+typedef struct _evttriggerInfo
+{
+ DumpableObject dobj;
+ char *evtname;
+ char *evtevent;
+ const char *evtowner;
+ char *evttags;
+ char *evtfname;
+ char evtenabled;
+} EventTriggerInfo;
+
+/*
+ * struct ConstraintInfo is used for all constraint types. However we
+ * use a different objType for foreign key constraints, to make it easier
+ * to sort them the way we want.
+ *
+ * Note: condeferrable and condeferred are currently only valid for
+ * unique/primary-key constraints. Otherwise that info is in condef.
+ */
+typedef struct _constraintInfo
+{
+ DumpableObject dobj;
+ TableInfo *contable; /* NULL if domain constraint */
+ TypeInfo *condomain; /* NULL if table constraint */
+ char contype;
+ char *condef; /* definition, if CHECK or FOREIGN KEY */
+ Oid confrelid; /* referenced table, if FOREIGN KEY */
+ DumpId conindex; /* identifies associated index if any */
+ bool condeferrable; /* true if constraint is DEFERRABLE */
+ bool condeferred; /* true if constraint is INITIALLY DEFERRED */
+ bool conislocal; /* true if constraint has local definition */
+ bool separate; /* true if must dump as separate item */
+} ConstraintInfo;
+
+typedef struct _procLangInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ bool lanpltrusted;
+ Oid lanplcallfoid;
+ Oid laninline;
+ Oid lanvalidator;
+ const char *lanowner;
+} ProcLangInfo;
+
+typedef struct _castInfo
+{
+ DumpableObject dobj;
+ Oid castsource;
+ Oid casttarget;
+ Oid castfunc;
+ char castcontext;
+ char castmethod;
+} CastInfo;
+
+typedef struct _transformInfo
+{
+ DumpableObject dobj;
+ Oid trftype;
+ Oid trflang;
+ Oid trffromsql;
+ Oid trftosql;
+} TransformInfo;
+
+/* InhInfo isn't a DumpableObject, just temporary state */
+typedef struct _inhInfo
+{
+ Oid inhrelid; /* OID of a child table */
+ Oid inhparent; /* OID of its parent */
+} InhInfo;
+
+typedef struct _prsInfo
+{
+ DumpableObject dobj;
+ Oid prsstart;
+ Oid prstoken;
+ Oid prsend;
+ Oid prsheadline;
+ Oid prslextype;
+} TSParserInfo;
+
+typedef struct _dictInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ Oid dicttemplate;
+ char *dictinitoption;
+} TSDictInfo;
+
+typedef struct _tmplInfo
+{
+ DumpableObject dobj;
+ Oid tmplinit;
+ Oid tmpllexize;
+} TSTemplateInfo;
+
+typedef struct _cfgInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ Oid cfgparser;
+} TSConfigInfo;
+
+typedef struct _fdwInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ char *fdwhandler;
+ char *fdwvalidator;
+ char *fdwoptions;
+} FdwInfo;
+
+typedef struct _foreignServerInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+ Oid srvfdw;
+ char *srvtype;
+ char *srvversion;
+ char *srvoptions;
+} ForeignServerInfo;
+
+typedef struct _defaultACLInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *defaclrole;
+ char defaclobjtype;
+} DefaultACLInfo;
+
+typedef struct _loInfo
+{
+ DumpableObject dobj;
+ DumpableAcl dacl;
+ const char *rolname;
+} LoInfo;
+
+/*
+ * The PolicyInfo struct is used to represent policies on a table and
+ * to indicate if a table has RLS enabled (ENABLE ROW SECURITY). If
+ * polname is NULL, then the record indicates ENABLE ROW SECURITY, while if
+ * it's non-NULL then this is a regular policy definition.
+ */
+typedef struct _policyInfo
+{
+ DumpableObject dobj;
+ TableInfo *poltable;
+ char *polname; /* null indicates RLS is enabled on rel */
+ char polcmd;
+ bool polpermissive;
+ char *polroles;
+ char *polqual;
+ char *polwithcheck;
+} PolicyInfo;
+
+/*
+ * The PublicationInfo struct is used to represent publications.
+ */
+typedef struct _PublicationInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ bool puballtables;
+ bool pubinsert;
+ bool pubupdate;
+ bool pubdelete;
+ bool pubtruncate;
+ bool pubviaroot;
+} PublicationInfo;
+
+/*
+ * The PublicationRelInfo struct is used to represent publication table
+ * mapping.
+ */
+typedef struct _PublicationRelInfo
+{
+ DumpableObject dobj;
+ PublicationInfo *publication;
+ TableInfo *pubtable;
+ char *pubrelqual;
+ char *pubrattrs;
+} PublicationRelInfo;
+
+/*
+ * The PublicationSchemaInfo struct is used to represent publication schema
+ * mapping.
+ */
+typedef struct _PublicationSchemaInfo
+{
+ DumpableObject dobj;
+ PublicationInfo *publication;
+ NamespaceInfo *pubschema;
+} PublicationSchemaInfo;
+
+/*
+ * The SubscriptionInfo struct is used to represent subscription.
+ */
+typedef struct _SubscriptionInfo
+{
+ DumpableObject dobj;
+ const char *rolname;
+ char *subbinary;
+ char *substream;
+ char *subtwophasestate;
+ char *subdisableonerr;
+ char *subpasswordrequired;
+ char *subrunasowner;
+ char *subconninfo;
+ char *subslotname;
+ char *subsynccommit;
+ char *subpublications;
+ char *suborigin;
+} SubscriptionInfo;
+
+/*
+ * common utility functions
+ */
+
+extern TableInfo *getSchemaData(Archive *fout, int *numTablesPtr);
+
+extern void AssignDumpId(DumpableObject *dobj);
+extern DumpId createDumpId(void);
+extern DumpId getMaxDumpId(void);
+extern DumpableObject *findObjectByDumpId(DumpId dumpId);
+extern DumpableObject *findObjectByCatalogId(CatalogId catalogId);
+extern void getDumpableObjects(DumpableObject ***objs, int *numObjs);
+
+extern void addObjectDependency(DumpableObject *dobj, DumpId refId);
+extern void removeObjectDependency(DumpableObject *dobj, DumpId refId);
+
+extern TableInfo *findTableByOid(Oid oid);
+extern TypeInfo *findTypeByOid(Oid oid);
+extern FuncInfo *findFuncByOid(Oid oid);
+extern OprInfo *findOprByOid(Oid oid);
+extern CollInfo *findCollationByOid(Oid oid);
+extern NamespaceInfo *findNamespaceByOid(Oid oid);
+extern ExtensionInfo *findExtensionByOid(Oid oid);
+extern PublicationInfo *findPublicationByOid(Oid oid);
+
+extern void recordExtensionMembership(CatalogId catId, ExtensionInfo *ext);
+extern ExtensionInfo *findOwningExtension(CatalogId catalogId);
+
+extern void parseOidArray(const char *str, Oid *array, int arraysize);
+
+extern void sortDumpableObjects(DumpableObject **objs, int numObjs,
+ DumpId preBoundaryId, DumpId postBoundaryId);
+extern void sortDumpableObjectsByTypeName(DumpableObject **objs, int numObjs);
+
+/*
+ * version specific routines
+ */
+extern NamespaceInfo *getNamespaces(Archive *fout, int *numNamespaces);
+extern ExtensionInfo *getExtensions(Archive *fout, int *numExtensions);
+extern TypeInfo *getTypes(Archive *fout, int *numTypes);
+extern FuncInfo *getFuncs(Archive *fout, int *numFuncs);
+extern AggInfo *getAggregates(Archive *fout, int *numAggs);
+extern OprInfo *getOperators(Archive *fout, int *numOprs);
+extern AccessMethodInfo *getAccessMethods(Archive *fout, int *numAccessMethods);
+extern OpclassInfo *getOpclasses(Archive *fout, int *numOpclasses);
+extern OpfamilyInfo *getOpfamilies(Archive *fout, int *numOpfamilies);
+extern CollInfo *getCollations(Archive *fout, int *numCollations);
+extern ConvInfo *getConversions(Archive *fout, int *numConversions);
+extern TableInfo *getTables(Archive *fout, int *numTables);
+extern void getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables);
+extern InhInfo *getInherits(Archive *fout, int *numInherits);
+extern void getPartitioningInfo(Archive *fout);
+extern void getIndexes(Archive *fout, TableInfo tblinfo[], int numTables);
+extern void getExtendedStatistics(Archive *fout);
+extern void getConstraints(Archive *fout, TableInfo tblinfo[], int numTables);
+extern RuleInfo *getRules(Archive *fout, int *numRules);
+extern void getTriggers(Archive *fout, TableInfo tblinfo[], int numTables);
+extern ProcLangInfo *getProcLangs(Archive *fout, int *numProcLangs);
+extern CastInfo *getCasts(Archive *fout, int *numCasts);
+extern TransformInfo *getTransforms(Archive *fout, int *numTransforms);
+extern void getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables);
+extern bool shouldPrintColumn(const DumpOptions *dopt, const TableInfo *tbinfo, int colno);
+extern TSParserInfo *getTSParsers(Archive *fout, int *numTSParsers);
+extern TSDictInfo *getTSDictionaries(Archive *fout, int *numTSDicts);
+extern TSTemplateInfo *getTSTemplates(Archive *fout, int *numTSTemplates);
+extern TSConfigInfo *getTSConfigurations(Archive *fout, int *numTSConfigs);
+extern FdwInfo *getForeignDataWrappers(Archive *fout,
+ int *numForeignDataWrappers);
+extern ForeignServerInfo *getForeignServers(Archive *fout,
+ int *numForeignServers);
+extern DefaultACLInfo *getDefaultACLs(Archive *fout, int *numDefaultACLs);
+extern void getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions);
+extern void processExtensionTables(Archive *fout, ExtensionInfo extinfo[],
+ int numExtensions);
+extern EventTriggerInfo *getEventTriggers(Archive *fout, int *numEventTriggers);
+extern void getPolicies(Archive *fout, TableInfo tblinfo[], int numTables);
+extern PublicationInfo *getPublications(Archive *fout,
+ int *numPublications);
+extern void getPublicationNamespaces(Archive *fout);
+extern void getPublicationTables(Archive *fout, TableInfo tblinfo[],
+ int numTables);
+extern void getSubscriptions(Archive *fout);
+
+#endif /* PG_DUMP_H */
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
new file mode 100644
index 0000000..523a19c
--- /dev/null
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -0,0 +1,1561 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dump_sort.c
+ * Sort the items of a dump into a safe order for dumping
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_dump_sort.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "catalog/pg_class_d.h"
+#include "pg_backup_archiver.h"
+#include "pg_backup_utils.h"
+#include "pg_dump.h"
+
+/*
+ * Sort priority for database object types.
+ * Objects are sorted by type, and within a type by name.
+ *
+ * Triggers, event triggers, and materialized views are intentionally sorted
+ * late. Triggers must be restored after all data modifications, so that
+ * they don't interfere with loading data. Event triggers are restored
+ * next-to-last so that they don't interfere with object creations of any
+ * kind. Matview refreshes are last because they should execute in the
+ * database's normal state (e.g., they must come after all ACLs are restored;
+ * also, if they choose to look at system catalogs, they should see the final
+ * restore state). If you think to change this, see also the RestorePass
+ * mechanism in pg_backup_archiver.c.
+ *
+ * On the other hand, casts are intentionally sorted earlier than you might
+ * expect; logically they should come after functions, since they usually
+ * depend on those. This works around the backend's habit of recording
+ * views that use casts as dependent on the cast's underlying function.
+ * We initially sort casts first, and then any functions used by casts
+ * will be hoisted above the casts, and in turn views that those functions
+ * depend on will be hoisted above the functions. But views not used that
+ * way won't be hoisted.
+ *
+ * NOTE: object-type priorities must match the section assignments made in
+ * pg_dump.c; that is, PRE_DATA objects must sort before DO_PRE_DATA_BOUNDARY,
+ * POST_DATA objects must sort after DO_POST_DATA_BOUNDARY, and DATA objects
+ * must sort between them.
+ */
+
+/* This enum lists the priority levels in order */
+enum dbObjectTypePriorities
+{
+ PRIO_NAMESPACE = 1,
+ PRIO_PROCLANG,
+ PRIO_COLLATION,
+ PRIO_TRANSFORM,
+ PRIO_EXTENSION,
+ PRIO_TYPE, /* used for DO_TYPE and DO_SHELL_TYPE */
+ PRIO_CAST,
+ PRIO_FUNC,
+ PRIO_AGG,
+ PRIO_ACCESS_METHOD,
+ PRIO_OPERATOR,
+ PRIO_OPFAMILY, /* used for DO_OPFAMILY and DO_OPCLASS */
+ PRIO_CONVERSION,
+ PRIO_TSPARSER,
+ PRIO_TSTEMPLATE,
+ PRIO_TSDICT,
+ PRIO_TSCONFIG,
+ PRIO_FDW,
+ PRIO_FOREIGN_SERVER,
+ PRIO_TABLE,
+ PRIO_TABLE_ATTACH,
+ PRIO_DUMMY_TYPE,
+ PRIO_ATTRDEF,
+ PRIO_LARGE_OBJECT,
+ PRIO_PRE_DATA_BOUNDARY, /* boundary! */
+ PRIO_TABLE_DATA,
+ PRIO_SEQUENCE_SET,
+ PRIO_LARGE_OBJECT_DATA,
+ PRIO_POST_DATA_BOUNDARY, /* boundary! */
+ PRIO_CONSTRAINT,
+ PRIO_INDEX,
+ PRIO_INDEX_ATTACH,
+ PRIO_STATSEXT,
+ PRIO_RULE,
+ PRIO_TRIGGER,
+ PRIO_FK_CONSTRAINT,
+ PRIO_POLICY,
+ PRIO_PUBLICATION,
+ PRIO_PUBLICATION_REL,
+ PRIO_PUBLICATION_TABLE_IN_SCHEMA,
+ PRIO_SUBSCRIPTION,
+ PRIO_DEFAULT_ACL, /* done in ACL pass */
+ PRIO_EVENT_TRIGGER, /* must be next to last! */
+ PRIO_REFRESH_MATVIEW /* must be last! */
+};
+
+/* This table is indexed by enum DumpableObjectType */
+static const int dbObjectTypePriority[] =
+{
+ PRIO_NAMESPACE, /* DO_NAMESPACE */
+ PRIO_EXTENSION, /* DO_EXTENSION */
+ PRIO_TYPE, /* DO_TYPE */
+ PRIO_TYPE, /* DO_SHELL_TYPE */
+ PRIO_FUNC, /* DO_FUNC */
+ PRIO_AGG, /* DO_AGG */
+ PRIO_OPERATOR, /* DO_OPERATOR */
+ PRIO_ACCESS_METHOD, /* DO_ACCESS_METHOD */
+ PRIO_OPFAMILY, /* DO_OPCLASS */
+ PRIO_OPFAMILY, /* DO_OPFAMILY */
+ PRIO_COLLATION, /* DO_COLLATION */
+ PRIO_CONVERSION, /* DO_CONVERSION */
+ PRIO_TABLE, /* DO_TABLE */
+ PRIO_TABLE_ATTACH, /* DO_TABLE_ATTACH */
+ PRIO_ATTRDEF, /* DO_ATTRDEF */
+ PRIO_INDEX, /* DO_INDEX */
+ PRIO_INDEX_ATTACH, /* DO_INDEX_ATTACH */
+ PRIO_STATSEXT, /* DO_STATSEXT */
+ PRIO_RULE, /* DO_RULE */
+ PRIO_TRIGGER, /* DO_TRIGGER */
+ PRIO_CONSTRAINT, /* DO_CONSTRAINT */
+ PRIO_FK_CONSTRAINT, /* DO_FK_CONSTRAINT */
+ PRIO_PROCLANG, /* DO_PROCLANG */
+ PRIO_CAST, /* DO_CAST */
+ PRIO_TABLE_DATA, /* DO_TABLE_DATA */
+ PRIO_SEQUENCE_SET, /* DO_SEQUENCE_SET */
+ PRIO_DUMMY_TYPE, /* DO_DUMMY_TYPE */
+ PRIO_TSPARSER, /* DO_TSPARSER */
+ PRIO_TSDICT, /* DO_TSDICT */
+ PRIO_TSTEMPLATE, /* DO_TSTEMPLATE */
+ PRIO_TSCONFIG, /* DO_TSCONFIG */
+ PRIO_FDW, /* DO_FDW */
+ PRIO_FOREIGN_SERVER, /* DO_FOREIGN_SERVER */
+ PRIO_DEFAULT_ACL, /* DO_DEFAULT_ACL */
+ PRIO_TRANSFORM, /* DO_TRANSFORM */
+ PRIO_LARGE_OBJECT, /* DO_LARGE_OBJECT */
+ PRIO_LARGE_OBJECT_DATA, /* DO_LARGE_OBJECT_DATA */
+ PRIO_PRE_DATA_BOUNDARY, /* DO_PRE_DATA_BOUNDARY */
+ PRIO_POST_DATA_BOUNDARY, /* DO_POST_DATA_BOUNDARY */
+ PRIO_EVENT_TRIGGER, /* DO_EVENT_TRIGGER */
+ PRIO_REFRESH_MATVIEW, /* DO_REFRESH_MATVIEW */
+ PRIO_POLICY, /* DO_POLICY */
+ PRIO_PUBLICATION, /* DO_PUBLICATION */
+ PRIO_PUBLICATION_REL, /* DO_PUBLICATION_REL */
+ PRIO_PUBLICATION_TABLE_IN_SCHEMA, /* DO_PUBLICATION_TABLE_IN_SCHEMA */
+ PRIO_SUBSCRIPTION /* DO_SUBSCRIPTION */
+};
+
+StaticAssertDecl(lengthof(dbObjectTypePriority) == (DO_SUBSCRIPTION + 1),
+ "array length mismatch");
+
+static DumpId preDataBoundId;
+static DumpId postDataBoundId;
+
+
+static int DOTypeNameCompare(const void *p1, const void *p2);
+static bool TopoSort(DumpableObject **objs,
+ int numObjs,
+ DumpableObject **ordering,
+ int *nOrdering);
+static void addHeapElement(int val, int *heap, int heapLength);
+static int removeHeapElement(int *heap, int heapLength);
+static void findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs);
+static int findLoop(DumpableObject *obj,
+ DumpId startPoint,
+ bool *processed,
+ DumpId *searchFailed,
+ DumpableObject **workspace,
+ int depth);
+static void repairDependencyLoop(DumpableObject **loop,
+ int nLoop);
+static void describeDumpableObject(DumpableObject *obj,
+ char *buf, int bufsize);
+
+
+/*
+ * Sort the given objects into a type/name-based ordering
+ *
+ * Normally this is just the starting point for the dependency-based
+ * ordering.
+ */
+void
+sortDumpableObjectsByTypeName(DumpableObject **objs, int numObjs)
+{
+ if (numObjs > 1)
+ qsort(objs, numObjs, sizeof(DumpableObject *),
+ DOTypeNameCompare);
+}
+
+static int
+DOTypeNameCompare(const void *p1, const void *p2)
+{
+ DumpableObject *obj1 = *(DumpableObject *const *) p1;
+ DumpableObject *obj2 = *(DumpableObject *const *) p2;
+ int cmpval;
+
+ /* Sort by type's priority */
+ cmpval = dbObjectTypePriority[obj1->objType] -
+ dbObjectTypePriority[obj2->objType];
+
+ if (cmpval != 0)
+ return cmpval;
+
+ /*
+ * Sort by namespace. Typically, all objects of the same priority would
+ * either have or not have a namespace link, but there are exceptions.
+ * Sort NULL namespace after non-NULL in such cases.
+ */
+ if (obj1->namespace)
+ {
+ if (obj2->namespace)
+ {
+ cmpval = strcmp(obj1->namespace->dobj.name,
+ obj2->namespace->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else
+ return -1;
+ }
+ else if (obj2->namespace)
+ return 1;
+
+ /* Sort by name */
+ cmpval = strcmp(obj1->name, obj2->name);
+ if (cmpval != 0)
+ return cmpval;
+
+ /* To have a stable sort order, break ties for some object types */
+ if (obj1->objType == DO_FUNC || obj1->objType == DO_AGG)
+ {
+ FuncInfo *fobj1 = *(FuncInfo *const *) p1;
+ FuncInfo *fobj2 = *(FuncInfo *const *) p2;
+ int i;
+
+ /* Sort by number of arguments, then argument type names */
+ cmpval = fobj1->nargs - fobj2->nargs;
+ if (cmpval != 0)
+ return cmpval;
+ for (i = 0; i < fobj1->nargs; i++)
+ {
+ TypeInfo *argtype1 = findTypeByOid(fobj1->argtypes[i]);
+ TypeInfo *argtype2 = findTypeByOid(fobj2->argtypes[i]);
+
+ if (argtype1 && argtype2)
+ {
+ if (argtype1->dobj.namespace && argtype2->dobj.namespace)
+ {
+ cmpval = strcmp(argtype1->dobj.namespace->dobj.name,
+ argtype2->dobj.namespace->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ cmpval = strcmp(argtype1->dobj.name, argtype2->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ }
+ }
+ else if (obj1->objType == DO_OPERATOR)
+ {
+ OprInfo *oobj1 = *(OprInfo *const *) p1;
+ OprInfo *oobj2 = *(OprInfo *const *) p2;
+
+ /* oprkind is 'l', 'r', or 'b'; this sorts prefix, postfix, infix */
+ cmpval = (oobj2->oprkind - oobj1->oprkind);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else if (obj1->objType == DO_ATTRDEF)
+ {
+ AttrDefInfo *adobj1 = *(AttrDefInfo *const *) p1;
+ AttrDefInfo *adobj2 = *(AttrDefInfo *const *) p2;
+
+ /* Sort by attribute number */
+ cmpval = (adobj1->adnum - adobj2->adnum);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else if (obj1->objType == DO_POLICY)
+ {
+ PolicyInfo *pobj1 = *(PolicyInfo *const *) p1;
+ PolicyInfo *pobj2 = *(PolicyInfo *const *) p2;
+
+ /* Sort by table name (table namespace was considered already) */
+ cmpval = strcmp(pobj1->poltable->dobj.name,
+ pobj2->poltable->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+ else if (obj1->objType == DO_TRIGGER)
+ {
+ TriggerInfo *tobj1 = *(TriggerInfo *const *) p1;
+ TriggerInfo *tobj2 = *(TriggerInfo *const *) p2;
+
+ /* Sort by table name (table namespace was considered already) */
+ cmpval = strcmp(tobj1->tgtable->dobj.name,
+ tobj2->tgtable->dobj.name);
+ if (cmpval != 0)
+ return cmpval;
+ }
+
+ /* Usually shouldn't get here, but if we do, sort by OID */
+ return oidcmp(obj1->catId.oid, obj2->catId.oid);
+}
+
+
+/*
+ * Sort the given objects into a safe dump order using dependency
+ * information (to the extent we have it available).
+ *
+ * The DumpIds of the PRE_DATA_BOUNDARY and POST_DATA_BOUNDARY objects are
+ * passed in separately, in case we need them during dependency loop repair.
+ */
+void
+sortDumpableObjects(DumpableObject **objs, int numObjs,
+ DumpId preBoundaryId, DumpId postBoundaryId)
+{
+ DumpableObject **ordering;
+ int nOrdering;
+
+ if (numObjs <= 0) /* can't happen anymore ... */
+ return;
+
+ /*
+ * Saving the boundary IDs in static variables is a bit grotty, but seems
+ * better than adding them to parameter lists of subsidiary functions.
+ */
+ preDataBoundId = preBoundaryId;
+ postDataBoundId = postBoundaryId;
+
+ ordering = (DumpableObject **) pg_malloc(numObjs * sizeof(DumpableObject *));
+ while (!TopoSort(objs, numObjs, ordering, &nOrdering))
+ findDependencyLoops(ordering, nOrdering, numObjs);
+
+ memcpy(objs, ordering, numObjs * sizeof(DumpableObject *));
+
+ free(ordering);
+}
+
+/*
+ * TopoSort -- topological sort of a dump list
+ *
+ * Generate a re-ordering of the dump list that satisfies all the dependency
+ * constraints shown in the dump list. (Each such constraint is a fact of a
+ * partial ordering.) Minimize rearrangement of the list not needed to
+ * achieve the partial ordering.
+ *
+ * The input is the list of numObjs objects in objs[]. This list is not
+ * modified.
+ *
+ * Returns true if able to build an ordering that satisfies all the
+ * constraints, false if not (there are contradictory constraints).
+ *
+ * On success (true result), ordering[] is filled with a sorted array of
+ * DumpableObject pointers, of length equal to the input list length.
+ *
+ * On failure (false result), ordering[] is filled with an unsorted array of
+ * DumpableObject pointers of length *nOrdering, listing the objects that
+ * prevented the sort from being completed. In general, these objects either
+ * participate directly in a dependency cycle, or are depended on by objects
+ * that are in a cycle. (The latter objects are not actually problematic,
+ * but it takes further analysis to identify which are which.)
+ *
+ * The caller is responsible for allocating sufficient space at *ordering.
+ */
+static bool
+TopoSort(DumpableObject **objs,
+ int numObjs,
+ DumpableObject **ordering, /* output argument */
+ int *nOrdering) /* output argument */
+{
+ DumpId maxDumpId = getMaxDumpId();
+ int *pendingHeap;
+ int *beforeConstraints;
+ int *idMap;
+ DumpableObject *obj;
+ int heapLength;
+ int i,
+ j,
+ k;
+
+ /*
+ * This is basically the same algorithm shown for topological sorting in
+ * Knuth's Volume 1. However, we would like to minimize unnecessary
+ * rearrangement of the input ordering; that is, when we have a choice of
+ * which item to output next, we always want to take the one highest in
+ * the original list. Therefore, instead of maintaining an unordered
+ * linked list of items-ready-to-output as Knuth does, we maintain a heap
+ * of their item numbers, which we can use as a priority queue. This
+ * turns the algorithm from O(N) to O(N log N) because each insertion or
+ * removal of a heap item takes O(log N) time. However, that's still
+ * plenty fast enough for this application.
+ */
+
+ *nOrdering = numObjs; /* for success return */
+
+ /* Eliminate the null case */
+ if (numObjs <= 0)
+ return true;
+
+ /* Create workspace for the above-described heap */
+ pendingHeap = (int *) pg_malloc(numObjs * sizeof(int));
+
+ /*
+ * Scan the constraints, and for each item in the input, generate a count
+ * of the number of constraints that say it must be before something else.
+ * The count for the item with dumpId j is stored in beforeConstraints[j].
+ * We also make a map showing the input-order index of the item with
+ * dumpId j.
+ */
+ beforeConstraints = (int *) pg_malloc0((maxDumpId + 1) * sizeof(int));
+ idMap = (int *) pg_malloc((maxDumpId + 1) * sizeof(int));
+ for (i = 0; i < numObjs; i++)
+ {
+ obj = objs[i];
+ j = obj->dumpId;
+ if (j <= 0 || j > maxDumpId)
+ pg_fatal("invalid dumpId %d", j);
+ idMap[j] = i;
+ for (j = 0; j < obj->nDeps; j++)
+ {
+ k = obj->dependencies[j];
+ if (k <= 0 || k > maxDumpId)
+ pg_fatal("invalid dependency %d", k);
+ beforeConstraints[k]++;
+ }
+ }
+
+ /*
+ * Now initialize the heap of items-ready-to-output by filling it with the
+ * indexes of items that already have beforeConstraints[id] == 0.
+ *
+ * The essential property of a heap is heap[(j-1)/2] >= heap[j] for each j
+ * in the range 1..heapLength-1 (note we are using 0-based subscripts
+ * here, while the discussion in Knuth assumes 1-based subscripts). So, if
+ * we simply enter the indexes into pendingHeap[] in decreasing order, we
+ * a-fortiori have the heap invariant satisfied at completion of this
+ * loop, and don't need to do any sift-up comparisons.
+ */
+ heapLength = 0;
+ for (i = numObjs; --i >= 0;)
+ {
+ if (beforeConstraints[objs[i]->dumpId] == 0)
+ pendingHeap[heapLength++] = i;
+ }
+
+ /*--------------------
+ * Now emit objects, working backwards in the output list. At each step,
+ * we use the priority heap to select the last item that has no remaining
+ * before-constraints. We remove that item from the heap, output it to
+ * ordering[], and decrease the beforeConstraints count of each of the
+ * items it was constrained against. Whenever an item's beforeConstraints
+ * count is thereby decreased to zero, we insert it into the priority heap
+ * to show that it is a candidate to output. We are done when the heap
+ * becomes empty; if we have output every element then we succeeded,
+ * otherwise we failed.
+ * i = number of ordering[] entries left to output
+ * j = objs[] index of item we are outputting
+ * k = temp for scanning constraint list for item j
+ *--------------------
+ */
+ i = numObjs;
+ while (heapLength > 0)
+ {
+ /* Select object to output by removing largest heap member */
+ j = removeHeapElement(pendingHeap, heapLength--);
+ obj = objs[j];
+ /* Output candidate to ordering[] */
+ ordering[--i] = obj;
+ /* Update beforeConstraints counts of its predecessors */
+ for (k = 0; k < obj->nDeps; k++)
+ {
+ int id = obj->dependencies[k];
+
+ if ((--beforeConstraints[id]) == 0)
+ addHeapElement(idMap[id], pendingHeap, heapLength++);
+ }
+ }
+
+ /*
+ * If we failed, report the objects that couldn't be output; these are the
+ * ones with beforeConstraints[] still nonzero.
+ */
+ if (i != 0)
+ {
+ k = 0;
+ for (j = 1; j <= maxDumpId; j++)
+ {
+ if (beforeConstraints[j] != 0)
+ ordering[k++] = objs[idMap[j]];
+ }
+ *nOrdering = k;
+ }
+
+ /* Done */
+ free(pendingHeap);
+ free(beforeConstraints);
+ free(idMap);
+
+ return (i == 0);
+}
+
+/*
+ * Add an item to a heap (priority queue)
+ *
+ * heapLength is the current heap size; caller is responsible for increasing
+ * its value after the call. There must be sufficient storage at *heap.
+ */
+static void
+addHeapElement(int val, int *heap, int heapLength)
+{
+ int j;
+
+ /*
+ * Sift-up the new entry, per Knuth 5.2.3 exercise 16. Note that Knuth is
+ * using 1-based array indexes, not 0-based.
+ */
+ j = heapLength;
+ while (j > 0)
+ {
+ int i = (j - 1) >> 1;
+
+ if (val <= heap[i])
+ break;
+ heap[j] = heap[i];
+ j = i;
+ }
+ heap[j] = val;
+}
+
+/*
+ * Remove the largest item present in a heap (priority queue)
+ *
+ * heapLength is the current heap size; caller is responsible for decreasing
+ * its value after the call.
+ *
+ * We remove and return heap[0], which is always the largest element of
+ * the heap, and then "sift up" to maintain the heap invariant.
+ */
+static int
+removeHeapElement(int *heap, int heapLength)
+{
+ int result = heap[0];
+ int val;
+ int i;
+
+ if (--heapLength <= 0)
+ return result;
+ val = heap[heapLength]; /* value that must be reinserted */
+ i = 0; /* i is where the "hole" is */
+ for (;;)
+ {
+ int j = 2 * i + 1;
+
+ if (j >= heapLength)
+ break;
+ if (j + 1 < heapLength &&
+ heap[j] < heap[j + 1])
+ j++;
+ if (val >= heap[j])
+ break;
+ heap[i] = heap[j];
+ i = j;
+ }
+ heap[i] = val;
+ return result;
+}
+
+/*
+ * findDependencyLoops - identify loops in TopoSort's failure output,
+ * and pass each such loop to repairDependencyLoop() for action
+ *
+ * In general there may be many loops in the set of objects returned by
+ * TopoSort; for speed we should try to repair as many loops as we can
+ * before trying TopoSort again. We can safely repair loops that are
+ * disjoint (have no members in common); if we find overlapping loops
+ * then we repair only the first one found, because the action taken to
+ * repair the first might have repaired the other as well. (If not,
+ * we'll fix it on the next go-round.)
+ *
+ * objs[] lists the objects TopoSort couldn't sort
+ * nObjs is the number of such objects
+ * totObjs is the total number of objects in the universe
+ */
+static void
+findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
+{
+ /*
+ * We use three data structures here:
+ *
+ * processed[] is a bool array indexed by dump ID, marking the objects
+ * already processed during this invocation of findDependencyLoops().
+ *
+ * searchFailed[] is another array indexed by dump ID. searchFailed[j] is
+ * set to dump ID k if we have proven that there is no dependency path
+ * leading from object j back to start point k. This allows us to skip
+ * useless searching when there are multiple dependency paths from k to j,
+ * which is a common situation. We could use a simple bool array for
+ * this, but then we'd need to re-zero it for each start point, resulting
+ * in O(N^2) zeroing work. Using the start point's dump ID as the "true"
+ * value lets us skip clearing the array before we consider the next start
+ * point.
+ *
+ * workspace[] is an array of DumpableObject pointers, in which we try to
+ * build lists of objects constituting loops. We make workspace[] large
+ * enough to hold all the objects in TopoSort's output, which is huge
+ * overkill in most cases but could theoretically be necessary if there is
+ * a single dependency chain linking all the objects.
+ */
+ bool *processed;
+ DumpId *searchFailed;
+ DumpableObject **workspace;
+ bool fixedloop;
+ int i;
+
+ processed = (bool *) pg_malloc0((getMaxDumpId() + 1) * sizeof(bool));
+ searchFailed = (DumpId *) pg_malloc0((getMaxDumpId() + 1) * sizeof(DumpId));
+ workspace = (DumpableObject **) pg_malloc(totObjs * sizeof(DumpableObject *));
+ fixedloop = false;
+
+ for (i = 0; i < nObjs; i++)
+ {
+ DumpableObject *obj = objs[i];
+ int looplen;
+ int j;
+
+ looplen = findLoop(obj,
+ obj->dumpId,
+ processed,
+ searchFailed,
+ workspace,
+ 0);
+
+ if (looplen > 0)
+ {
+ /* Found a loop, repair it */
+ repairDependencyLoop(workspace, looplen);
+ fixedloop = true;
+ /* Mark loop members as processed */
+ for (j = 0; j < looplen; j++)
+ processed[workspace[j]->dumpId] = true;
+ }
+ else
+ {
+ /*
+ * There's no loop starting at this object, but mark it processed
+ * anyway. This is not necessary for correctness, but saves later
+ * invocations of findLoop() from uselessly chasing references to
+ * such an object.
+ */
+ processed[obj->dumpId] = true;
+ }
+ }
+
+ /* We'd better have fixed at least one loop */
+ if (!fixedloop)
+ pg_fatal("could not identify dependency loop");
+
+ free(workspace);
+ free(searchFailed);
+ free(processed);
+}
+
+/*
+ * Recursively search for a circular dependency loop that doesn't include
+ * any already-processed objects.
+ *
+ * obj: object we are examining now
+ * startPoint: dumpId of starting object for the hoped-for circular loop
+ * processed[]: flag array marking already-processed objects
+ * searchFailed[]: flag array marking already-unsuccessfully-visited objects
+ * workspace[]: work array in which we are building list of loop members
+ * depth: number of valid entries in workspace[] at call
+ *
+ * On success, the length of the loop is returned, and workspace[] is filled
+ * with pointers to the members of the loop. On failure, we return 0.
+ *
+ * Note: it is possible that the given starting object is a member of more
+ * than one cycle; if so, we will find an arbitrary one of the cycles.
+ */
+static int
+findLoop(DumpableObject *obj,
+ DumpId startPoint,
+ bool *processed,
+ DumpId *searchFailed,
+ DumpableObject **workspace,
+ int depth)
+{
+ int i;
+
+ /*
+ * Reject if obj is already processed. This test prevents us from finding
+ * loops that overlap previously-processed loops.
+ */
+ if (processed[obj->dumpId])
+ return 0;
+
+ /*
+ * If we've already proven there is no path from this object back to the
+ * startPoint, forget it.
+ */
+ if (searchFailed[obj->dumpId] == startPoint)
+ return 0;
+
+ /*
+ * Reject if obj is already present in workspace. This test prevents us
+ * from going into infinite recursion if we are given a startPoint object
+ * that links to a cycle it's not a member of, and it guarantees that we
+ * can't overflow the allocated size of workspace[].
+ */
+ for (i = 0; i < depth; i++)
+ {
+ if (workspace[i] == obj)
+ return 0;
+ }
+
+ /*
+ * Okay, tentatively add obj to workspace
+ */
+ workspace[depth++] = obj;
+
+ /*
+ * See if we've found a loop back to the desired startPoint; if so, done
+ */
+ for (i = 0; i < obj->nDeps; i++)
+ {
+ if (obj->dependencies[i] == startPoint)
+ return depth;
+ }
+
+ /*
+ * Recurse down each outgoing branch
+ */
+ for (i = 0; i < obj->nDeps; i++)
+ {
+ DumpableObject *nextobj = findObjectByDumpId(obj->dependencies[i]);
+ int newDepth;
+
+ if (!nextobj)
+ continue; /* ignore dependencies on undumped objects */
+ newDepth = findLoop(nextobj,
+ startPoint,
+ processed,
+ searchFailed,
+ workspace,
+ depth);
+ if (newDepth > 0)
+ return newDepth;
+ }
+
+ /*
+ * Remember there is no path from here back to startPoint
+ */
+ searchFailed[obj->dumpId] = startPoint;
+
+ return 0;
+}
+
+/*
+ * A user-defined datatype will have a dependency loop with each of its
+ * I/O functions (since those have the datatype as input or output).
+ * Similarly, a range type will have a loop with its canonicalize function,
+ * if any. Break the loop by making the function depend on the associated
+ * shell type, instead.
+ */
+static void
+repairTypeFuncLoop(DumpableObject *typeobj, DumpableObject *funcobj)
+{
+ TypeInfo *typeInfo = (TypeInfo *) typeobj;
+
+ /* remove function's dependency on type */
+ removeObjectDependency(funcobj, typeobj->dumpId);
+
+ /* add function's dependency on shell type, instead */
+ if (typeInfo->shellType)
+ {
+ addObjectDependency(funcobj, typeInfo->shellType->dobj.dumpId);
+
+ /*
+ * Mark shell type (always including the definition, as we need the
+ * shell type defined to identify the function fully) as to be dumped
+ * if any such function is
+ */
+ if (funcobj->dump)
+ typeInfo->shellType->dobj.dump = funcobj->dump |
+ DUMP_COMPONENT_DEFINITION;
+ }
+}
+
+/*
+ * Because we force a view to depend on its ON SELECT rule, while there
+ * will be an implicit dependency in the other direction, we need to break
+ * the loop. If there are no other objects in the loop then we can remove
+ * the implicit dependency and leave the ON SELECT rule non-separate.
+ * This applies to matviews, as well.
+ */
+static void
+repairViewRuleLoop(DumpableObject *viewobj,
+ DumpableObject *ruleobj)
+{
+ /* remove rule's dependency on view */
+ removeObjectDependency(ruleobj, viewobj->dumpId);
+ /* flags on the two objects are already set correctly for this case */
+}
+
+/*
+ * However, if there are other objects in the loop, we must break the loop
+ * by making the ON SELECT rule a separately-dumped object.
+ *
+ * Because findLoop() finds shorter cycles before longer ones, it's likely
+ * that we will have previously fired repairViewRuleLoop() and removed the
+ * rule's dependency on the view. Put it back to ensure the rule won't be
+ * emitted before the view.
+ *
+ * Note: this approach does *not* work for matviews, at the moment.
+ */
+static void
+repairViewRuleMultiLoop(DumpableObject *viewobj,
+ DumpableObject *ruleobj)
+{
+ TableInfo *viewinfo = (TableInfo *) viewobj;
+ RuleInfo *ruleinfo = (RuleInfo *) ruleobj;
+
+ /* remove view's dependency on rule */
+ removeObjectDependency(viewobj, ruleobj->dumpId);
+ /* mark view to be printed with a dummy definition */
+ viewinfo->dummy_view = true;
+ /* mark rule as needing its own dump */
+ ruleinfo->separate = true;
+ /* put back rule's dependency on view */
+ addObjectDependency(ruleobj, viewobj->dumpId);
+ /* now that rule is separate, it must be post-data */
+ addObjectDependency(ruleobj, postDataBoundId);
+}
+
+/*
+ * If a matview is involved in a multi-object loop, we can't currently fix
+ * that by splitting off the rule. As a stopgap, we try to fix it by
+ * dropping the constraint that the matview be dumped in the pre-data section.
+ * This is sufficient to handle cases where a matview depends on some unique
+ * index, as can happen if it has a GROUP BY for example.
+ *
+ * Note that the "next object" is not necessarily the matview itself;
+ * it could be the matview's rowtype, for example. We may come through here
+ * several times while removing all the pre-data linkages. In particular,
+ * if there are other matviews that depend on the one with the circularity
+ * problem, we'll come through here for each such matview and mark them all
+ * as postponed. (This works because all MVs have pre-data dependencies
+ * to begin with, so each of them will get visited.)
+ */
+static void
+repairMatViewBoundaryMultiLoop(DumpableObject *boundaryobj,
+ DumpableObject *nextobj)
+{
+ /* remove boundary's dependency on object after it in loop */
+ removeObjectDependency(boundaryobj, nextobj->dumpId);
+ /* if that object is a matview, mark it as postponed into post-data */
+ if (nextobj->objType == DO_TABLE)
+ {
+ TableInfo *nextinfo = (TableInfo *) nextobj;
+
+ if (nextinfo->relkind == RELKIND_MATVIEW)
+ nextinfo->postponed_def = true;
+ }
+}
+
+/*
+ * If a function is involved in a multi-object loop, we can't currently fix
+ * that by splitting it into two DumpableObjects. As a stopgap, we try to fix
+ * it by dropping the constraint that the function be dumped in the pre-data
+ * section. This is sufficient to handle cases where a function depends on
+ * some unique index, as can happen if it has a GROUP BY for example.
+ */
+static void
+repairFunctionBoundaryMultiLoop(DumpableObject *boundaryobj,
+ DumpableObject *nextobj)
+{
+ /* remove boundary's dependency on object after it in loop */
+ removeObjectDependency(boundaryobj, nextobj->dumpId);
+ /* if that object is a function, mark it as postponed into post-data */
+ if (nextobj->objType == DO_FUNC)
+ {
+ FuncInfo *nextinfo = (FuncInfo *) nextobj;
+
+ nextinfo->postponed_def = true;
+ }
+}
+
+/*
+ * Because we make tables depend on their CHECK constraints, while there
+ * will be an automatic dependency in the other direction, we need to break
+ * the loop. If there are no other objects in the loop then we can remove
+ * the automatic dependency and leave the CHECK constraint non-separate.
+ */
+static void
+repairTableConstraintLoop(DumpableObject *tableobj,
+ DumpableObject *constraintobj)
+{
+ /* remove constraint's dependency on table */
+ removeObjectDependency(constraintobj, tableobj->dumpId);
+}
+
+/*
+ * However, if there are other objects in the loop, we must break the loop
+ * by making the CHECK constraint a separately-dumped object.
+ *
+ * Because findLoop() finds shorter cycles before longer ones, it's likely
+ * that we will have previously fired repairTableConstraintLoop() and
+ * removed the constraint's dependency on the table. Put it back to ensure
+ * the constraint won't be emitted before the table...
+ */
+static void
+repairTableConstraintMultiLoop(DumpableObject *tableobj,
+ DumpableObject *constraintobj)
+{
+ /* remove table's dependency on constraint */
+ removeObjectDependency(tableobj, constraintobj->dumpId);
+ /* mark constraint as needing its own dump */
+ ((ConstraintInfo *) constraintobj)->separate = true;
+ /* put back constraint's dependency on table */
+ addObjectDependency(constraintobj, tableobj->dumpId);
+ /* now that constraint is separate, it must be post-data */
+ addObjectDependency(constraintobj, postDataBoundId);
+}
+
+/*
+ * Attribute defaults behave exactly the same as CHECK constraints...
+ */
+static void
+repairTableAttrDefLoop(DumpableObject *tableobj,
+ DumpableObject *attrdefobj)
+{
+ /* remove attrdef's dependency on table */
+ removeObjectDependency(attrdefobj, tableobj->dumpId);
+}
+
+static void
+repairTableAttrDefMultiLoop(DumpableObject *tableobj,
+ DumpableObject *attrdefobj)
+{
+ /* remove table's dependency on attrdef */
+ removeObjectDependency(tableobj, attrdefobj->dumpId);
+ /* mark attrdef as needing its own dump */
+ ((AttrDefInfo *) attrdefobj)->separate = true;
+ /* put back attrdef's dependency on table */
+ addObjectDependency(attrdefobj, tableobj->dumpId);
+}
+
+/*
+ * CHECK constraints on domains work just like those on tables ...
+ */
+static void
+repairDomainConstraintLoop(DumpableObject *domainobj,
+ DumpableObject *constraintobj)
+{
+ /* remove constraint's dependency on domain */
+ removeObjectDependency(constraintobj, domainobj->dumpId);
+}
+
+static void
+repairDomainConstraintMultiLoop(DumpableObject *domainobj,
+ DumpableObject *constraintobj)
+{
+ /* remove domain's dependency on constraint */
+ removeObjectDependency(domainobj, constraintobj->dumpId);
+ /* mark constraint as needing its own dump */
+ ((ConstraintInfo *) constraintobj)->separate = true;
+ /* put back constraint's dependency on domain */
+ addObjectDependency(constraintobj, domainobj->dumpId);
+ /* now that constraint is separate, it must be post-data */
+ addObjectDependency(constraintobj, postDataBoundId);
+}
+
+static void
+repairIndexLoop(DumpableObject *partedindex,
+ DumpableObject *partindex)
+{
+ removeObjectDependency(partedindex, partindex->dumpId);
+}
+
+/*
+ * Fix a dependency loop, or die trying ...
+ *
+ * This routine is mainly concerned with reducing the multiple ways that
+ * a loop might appear to common cases, which it passes off to the
+ * "fixer" routines above.
+ */
+static void
+repairDependencyLoop(DumpableObject **loop,
+ int nLoop)
+{
+ int i,
+ j;
+
+ /* Datatype and one of its I/O or canonicalize functions */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TYPE &&
+ loop[1]->objType == DO_FUNC)
+ {
+ repairTypeFuncLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TYPE &&
+ loop[0]->objType == DO_FUNC)
+ {
+ repairTypeFuncLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* View (including matview) and its ON SELECT rule */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TABLE &&
+ loop[1]->objType == DO_RULE &&
+ (((TableInfo *) loop[0])->relkind == RELKIND_VIEW ||
+ ((TableInfo *) loop[0])->relkind == RELKIND_MATVIEW) &&
+ ((RuleInfo *) loop[1])->ev_type == '1' &&
+ ((RuleInfo *) loop[1])->is_instead &&
+ ((RuleInfo *) loop[1])->ruletable == (TableInfo *) loop[0])
+ {
+ repairViewRuleLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TABLE &&
+ loop[0]->objType == DO_RULE &&
+ (((TableInfo *) loop[1])->relkind == RELKIND_VIEW ||
+ ((TableInfo *) loop[1])->relkind == RELKIND_MATVIEW) &&
+ ((RuleInfo *) loop[0])->ev_type == '1' &&
+ ((RuleInfo *) loop[0])->is_instead &&
+ ((RuleInfo *) loop[0])->ruletable == (TableInfo *) loop[1])
+ {
+ repairViewRuleLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* Indirect loop involving view (but not matview) and ON SELECT rule */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE &&
+ ((TableInfo *) loop[i])->relkind == RELKIND_VIEW)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_RULE &&
+ ((RuleInfo *) loop[j])->ev_type == '1' &&
+ ((RuleInfo *) loop[j])->is_instead &&
+ ((RuleInfo *) loop[j])->ruletable == (TableInfo *) loop[i])
+ {
+ repairViewRuleMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Indirect loop involving matview and data boundary */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE &&
+ ((TableInfo *) loop[i])->relkind == RELKIND_MATVIEW)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_PRE_DATA_BOUNDARY)
+ {
+ DumpableObject *nextobj;
+
+ nextobj = (j < nLoop - 1) ? loop[j + 1] : loop[0];
+ repairMatViewBoundaryMultiLoop(loop[j], nextobj);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Indirect loop involving function and data boundary */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_FUNC)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_PRE_DATA_BOUNDARY)
+ {
+ DumpableObject *nextobj;
+
+ nextobj = (j < nLoop - 1) ? loop[j + 1] : loop[0];
+ repairFunctionBoundaryMultiLoop(loop[j], nextobj);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Table and CHECK constraint */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TABLE &&
+ loop[1]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[1])->contype == 'c' &&
+ ((ConstraintInfo *) loop[1])->contable == (TableInfo *) loop[0])
+ {
+ repairTableConstraintLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TABLE &&
+ loop[0]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[0])->contype == 'c' &&
+ ((ConstraintInfo *) loop[0])->contable == (TableInfo *) loop[1])
+ {
+ repairTableConstraintLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* Indirect loop involving table and CHECK constraint */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[j])->contype == 'c' &&
+ ((ConstraintInfo *) loop[j])->contable == (TableInfo *) loop[i])
+ {
+ repairTableConstraintMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Table and attribute default */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TABLE &&
+ loop[1]->objType == DO_ATTRDEF &&
+ ((AttrDefInfo *) loop[1])->adtable == (TableInfo *) loop[0])
+ {
+ repairTableAttrDefLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TABLE &&
+ loop[0]->objType == DO_ATTRDEF &&
+ ((AttrDefInfo *) loop[0])->adtable == (TableInfo *) loop[1])
+ {
+ repairTableAttrDefLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* index on partitioned table and corresponding index on partition */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_INDEX &&
+ loop[1]->objType == DO_INDEX)
+ {
+ if (((IndxInfo *) loop[0])->parentidx == loop[1]->catId.oid)
+ {
+ repairIndexLoop(loop[0], loop[1]);
+ return;
+ }
+ else if (((IndxInfo *) loop[1])->parentidx == loop[0]->catId.oid)
+ {
+ repairIndexLoop(loop[1], loop[0]);
+ return;
+ }
+ }
+
+ /* Indirect loop involving table and attribute default */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TABLE)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_ATTRDEF &&
+ ((AttrDefInfo *) loop[j])->adtable == (TableInfo *) loop[i])
+ {
+ repairTableAttrDefMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /* Domain and CHECK constraint */
+ if (nLoop == 2 &&
+ loop[0]->objType == DO_TYPE &&
+ loop[1]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[1])->contype == 'c' &&
+ ((ConstraintInfo *) loop[1])->condomain == (TypeInfo *) loop[0])
+ {
+ repairDomainConstraintLoop(loop[0], loop[1]);
+ return;
+ }
+ if (nLoop == 2 &&
+ loop[1]->objType == DO_TYPE &&
+ loop[0]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[0])->contype == 'c' &&
+ ((ConstraintInfo *) loop[0])->condomain == (TypeInfo *) loop[1])
+ {
+ repairDomainConstraintLoop(loop[1], loop[0]);
+ return;
+ }
+
+ /* Indirect loop involving domain and CHECK constraint */
+ if (nLoop > 2)
+ {
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType == DO_TYPE)
+ {
+ for (j = 0; j < nLoop; j++)
+ {
+ if (loop[j]->objType == DO_CONSTRAINT &&
+ ((ConstraintInfo *) loop[j])->contype == 'c' &&
+ ((ConstraintInfo *) loop[j])->condomain == (TypeInfo *) loop[i])
+ {
+ repairDomainConstraintMultiLoop(loop[i], loop[j]);
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Loop of table with itself --- just ignore it.
+ *
+ * (Actually, what this arises from is a dependency of a table column on
+ * another column, which happened with generated columns before v15; or a
+ * dependency of a table column on the whole table, which happens with
+ * partitioning. But we didn't pay attention to sub-object IDs while
+ * collecting the dependency data, so we can't see that here.)
+ */
+ if (nLoop == 1)
+ {
+ if (loop[0]->objType == DO_TABLE)
+ {
+ removeObjectDependency(loop[0], loop[0]->dumpId);
+ return;
+ }
+ }
+
+ /*
+ * If all the objects are TABLE_DATA items, what we must have is a
+ * circular set of foreign key constraints (or a single self-referential
+ * table). Print an appropriate complaint and break the loop arbitrarily.
+ */
+ for (i = 0; i < nLoop; i++)
+ {
+ if (loop[i]->objType != DO_TABLE_DATA)
+ break;
+ }
+ if (i >= nLoop)
+ {
+ pg_log_warning(ngettext("there are circular foreign-key constraints on this table:",
+ "there are circular foreign-key constraints among these tables:",
+ nLoop));
+ for (i = 0; i < nLoop; i++)
+ pg_log_warning_detail("%s", loop[i]->name);
+ pg_log_warning_hint("You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.");
+ pg_log_warning_hint("Consider using a full dump instead of a --data-only dump to avoid this problem.");
+ if (nLoop > 1)
+ removeObjectDependency(loop[0], loop[1]->dumpId);
+ else /* must be a self-dependency */
+ removeObjectDependency(loop[0], loop[0]->dumpId);
+ return;
+ }
+
+ /*
+ * If we can't find a principled way to break the loop, complain and break
+ * it in an arbitrary fashion.
+ */
+ pg_log_warning("could not resolve dependency loop among these items:");
+ for (i = 0; i < nLoop; i++)
+ {
+ char buf[1024];
+
+ describeDumpableObject(loop[i], buf, sizeof(buf));
+ pg_log_warning_detail("%s", buf);
+ }
+
+ if (nLoop > 1)
+ removeObjectDependency(loop[0], loop[1]->dumpId);
+ else /* must be a self-dependency */
+ removeObjectDependency(loop[0], loop[0]->dumpId);
+}
+
+/*
+ * Describe a dumpable object usefully for errors
+ *
+ * This should probably go somewhere else...
+ */
+static void
+describeDumpableObject(DumpableObject *obj, char *buf, int bufsize)
+{
+ switch (obj->objType)
+ {
+ case DO_NAMESPACE:
+ snprintf(buf, bufsize,
+ "SCHEMA %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_EXTENSION:
+ snprintf(buf, bufsize,
+ "EXTENSION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TYPE:
+ snprintf(buf, bufsize,
+ "TYPE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_SHELL_TYPE:
+ snprintf(buf, bufsize,
+ "SHELL TYPE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FUNC:
+ snprintf(buf, bufsize,
+ "FUNCTION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_AGG:
+ snprintf(buf, bufsize,
+ "AGGREGATE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_OPERATOR:
+ snprintf(buf, bufsize,
+ "OPERATOR %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_ACCESS_METHOD:
+ snprintf(buf, bufsize,
+ "ACCESS METHOD %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_OPCLASS:
+ snprintf(buf, bufsize,
+ "OPERATOR CLASS %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_OPFAMILY:
+ snprintf(buf, bufsize,
+ "OPERATOR FAMILY %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_COLLATION:
+ snprintf(buf, bufsize,
+ "COLLATION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_CONVERSION:
+ snprintf(buf, bufsize,
+ "CONVERSION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TABLE:
+ snprintf(buf, bufsize,
+ "TABLE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TABLE_ATTACH:
+ snprintf(buf, bufsize,
+ "TABLE ATTACH %s (ID %d)",
+ obj->name, obj->dumpId);
+ return;
+ case DO_ATTRDEF:
+ snprintf(buf, bufsize,
+ "ATTRDEF %s.%s (ID %d OID %u)",
+ ((AttrDefInfo *) obj)->adtable->dobj.name,
+ ((AttrDefInfo *) obj)->adtable->attnames[((AttrDefInfo *) obj)->adnum - 1],
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_INDEX:
+ snprintf(buf, bufsize,
+ "INDEX %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_INDEX_ATTACH:
+ snprintf(buf, bufsize,
+ "INDEX ATTACH %s (ID %d)",
+ obj->name, obj->dumpId);
+ return;
+ case DO_STATSEXT:
+ snprintf(buf, bufsize,
+ "STATISTICS %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_REFRESH_MATVIEW:
+ snprintf(buf, bufsize,
+ "REFRESH MATERIALIZED VIEW %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_RULE:
+ snprintf(buf, bufsize,
+ "RULE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TRIGGER:
+ snprintf(buf, bufsize,
+ "TRIGGER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_EVENT_TRIGGER:
+ snprintf(buf, bufsize,
+ "EVENT TRIGGER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_CONSTRAINT:
+ snprintf(buf, bufsize,
+ "CONSTRAINT %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FK_CONSTRAINT:
+ snprintf(buf, bufsize,
+ "FK CONSTRAINT %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PROCLANG:
+ snprintf(buf, bufsize,
+ "PROCEDURAL LANGUAGE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_CAST:
+ snprintf(buf, bufsize,
+ "CAST %u to %u (ID %d OID %u)",
+ ((CastInfo *) obj)->castsource,
+ ((CastInfo *) obj)->casttarget,
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TRANSFORM:
+ snprintf(buf, bufsize,
+ "TRANSFORM %u lang %u (ID %d OID %u)",
+ ((TransformInfo *) obj)->trftype,
+ ((TransformInfo *) obj)->trflang,
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TABLE_DATA:
+ snprintf(buf, bufsize,
+ "TABLE DATA %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_SEQUENCE_SET:
+ snprintf(buf, bufsize,
+ "SEQUENCE SET %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_DUMMY_TYPE:
+ snprintf(buf, bufsize,
+ "DUMMY TYPE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSPARSER:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH PARSER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSDICT:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH DICTIONARY %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSTEMPLATE:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH TEMPLATE %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_TSCONFIG:
+ snprintf(buf, bufsize,
+ "TEXT SEARCH CONFIGURATION %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FDW:
+ snprintf(buf, bufsize,
+ "FOREIGN DATA WRAPPER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_FOREIGN_SERVER:
+ snprintf(buf, bufsize,
+ "FOREIGN SERVER %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_DEFAULT_ACL:
+ snprintf(buf, bufsize,
+ "DEFAULT ACL %s (ID %d OID %u)",
+ obj->name, obj->dumpId, obj->catId.oid);
+ return;
+ case DO_LARGE_OBJECT:
+ snprintf(buf, bufsize,
+ "LARGE OBJECT (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_LARGE_OBJECT_DATA:
+ snprintf(buf, bufsize,
+ "LARGE OBJECT DATA (ID %d)",
+ obj->dumpId);
+ return;
+ case DO_POLICY:
+ snprintf(buf, bufsize,
+ "POLICY (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PUBLICATION:
+ snprintf(buf, bufsize,
+ "PUBLICATION (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PUBLICATION_REL:
+ snprintf(buf, bufsize,
+ "PUBLICATION TABLE (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PUBLICATION_TABLE_IN_SCHEMA:
+ snprintf(buf, bufsize,
+ "PUBLICATION TABLES IN SCHEMA (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_SUBSCRIPTION:
+ snprintf(buf, bufsize,
+ "SUBSCRIPTION (ID %d OID %u)",
+ obj->dumpId, obj->catId.oid);
+ return;
+ case DO_PRE_DATA_BOUNDARY:
+ snprintf(buf, bufsize,
+ "PRE-DATA BOUNDARY (ID %d)",
+ obj->dumpId);
+ return;
+ case DO_POST_DATA_BOUNDARY:
+ snprintf(buf, bufsize,
+ "POST-DATA BOUNDARY (ID %d)",
+ obj->dumpId);
+ return;
+ }
+ /* shouldn't get here */
+ snprintf(buf, bufsize,
+ "object type %d (ID %d OID %u)",
+ (int) obj->objType,
+ obj->dumpId, obj->catId.oid);
+}
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
new file mode 100644
index 0000000..2cad796
--- /dev/null
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -0,0 +1,1927 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_dumpall.c
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * pg_dumpall forces all pg_dump output to be text, since it also outputs
+ * text into the same output stream.
+ *
+ * src/bin/pg_dump/pg_dumpall.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <time.h>
+#include <unistd.h>
+
+#include "catalog/pg_authid_d.h"
+#include "common/connect.h"
+#include "common/file_utils.h"
+#include "common/hashfn.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "dumputils.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "pg_backup.h"
+
+/* version string we expect back from pg_dump */
+#define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n"
+
+static uint32 hash_string_pointer(char *s);
+
+typedef struct
+{
+ uint32 status;
+ uint32 hashval;
+ char *rolename;
+} RoleNameEntry;
+
+#define SH_PREFIX rolename
+#define SH_ELEMENT_TYPE RoleNameEntry
+#define SH_KEY_TYPE char *
+#define SH_KEY rolename
+#define SH_HASH_KEY(tb, key) hash_string_pointer(key)
+#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0)
+#define SH_STORE_HASH
+#define SH_GET_HASH(tb, a) (a)->hashval
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+static void help(void);
+
+static void dropRoles(PGconn *conn);
+static void dumpRoles(PGconn *conn);
+static void dumpRoleMembership(PGconn *conn);
+static void dumpRoleGUCPrivs(PGconn *conn);
+static void dropTablespaces(PGconn *conn);
+static void dumpTablespaces(PGconn *conn);
+static void dropDBs(PGconn *conn);
+static void dumpUserConfig(PGconn *conn, const char *username);
+static void dumpDatabases(PGconn *conn);
+static void dumpTimestamp(const char *msg);
+static int runPgDump(const char *dbname, const char *create_opts);
+static void buildShSecLabels(PGconn *conn,
+ const char *catalog_name, Oid objectId,
+ const char *objtype, const char *objname,
+ PQExpBuffer buffer);
+static PGconn *connectDatabase(const char *dbname,
+ const char *connection_string, const char *pghost,
+ const char *pgport, const char *pguser,
+ trivalue prompt_password, bool fail_on_error);
+static char *constructConnStr(const char **keywords, const char **values);
+static PGresult *executeQuery(PGconn *conn, const char *query);
+static void executeCommand(PGconn *conn, const char *query);
+static void expand_dbname_patterns(PGconn *conn, SimpleStringList *patterns,
+ SimpleStringList *names);
+
+static char pg_dump_bin[MAXPGPATH];
+static const char *progname;
+static PQExpBuffer pgdumpopts;
+static char *connstr = "";
+static bool output_clean = false;
+static bool skip_acls = false;
+static bool verbose = false;
+static bool dosync = true;
+
+static int binary_upgrade = 0;
+static int column_inserts = 0;
+static int disable_dollar_quoting = 0;
+static int disable_triggers = 0;
+static int if_exists = 0;
+static int inserts = 0;
+static int no_table_access_method = 0;
+static int no_tablespaces = 0;
+static int use_setsessauth = 0;
+static int no_comments = 0;
+static int no_publications = 0;
+static int no_security_labels = 0;
+static int no_subscriptions = 0;
+static int no_toast_compression = 0;
+static int no_unlogged_table_data = 0;
+static int no_role_passwords = 0;
+static int server_version;
+static int load_via_partition_root = 0;
+static int on_conflict_do_nothing = 0;
+
+static char role_catalog[10];
+#define PG_AUTHID "pg_authid"
+#define PG_ROLES "pg_roles "
+
+static FILE *OPF;
+static char *filename = NULL;
+
+static SimpleStringList database_exclude_patterns = {NULL, NULL};
+static SimpleStringList database_exclude_names = {NULL, NULL};
+
+#define exit_nicely(code) exit(code)
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"data-only", no_argument, NULL, 'a'},
+ {"clean", no_argument, NULL, 'c'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"file", required_argument, NULL, 'f'},
+ {"globals-only", no_argument, NULL, 'g'},
+ {"host", required_argument, NULL, 'h'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"database", required_argument, NULL, 'l'},
+ {"no-owner", no_argument, NULL, 'O'},
+ {"port", required_argument, NULL, 'p'},
+ {"roles-only", no_argument, NULL, 'r'},
+ {"schema-only", no_argument, NULL, 's'},
+ {"superuser", required_argument, NULL, 'S'},
+ {"tablespaces-only", no_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"no-privileges", no_argument, NULL, 'x'},
+ {"no-acl", no_argument, NULL, 'x'},
+
+ /*
+ * the following options don't have an equivalent short option letter
+ */
+ {"attribute-inserts", no_argument, &column_inserts, 1},
+ {"binary-upgrade", no_argument, &binary_upgrade, 1},
+ {"column-inserts", no_argument, &column_inserts, 1},
+ {"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
+ {"disable-triggers", no_argument, &disable_triggers, 1},
+ {"exclude-database", required_argument, NULL, 6},
+ {"extra-float-digits", required_argument, NULL, 5},
+ {"if-exists", no_argument, &if_exists, 1},
+ {"inserts", no_argument, &inserts, 1},
+ {"lock-wait-timeout", required_argument, NULL, 2},
+ {"no-table-access-method", no_argument, &no_table_access_method, 1},
+ {"no-tablespaces", no_argument, &no_tablespaces, 1},
+ {"quote-all-identifiers", no_argument, &quote_all_identifiers, 1},
+ {"load-via-partition-root", no_argument, &load_via_partition_root, 1},
+ {"role", required_argument, NULL, 3},
+ {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
+ {"no-comments", no_argument, &no_comments, 1},
+ {"no-publications", no_argument, &no_publications, 1},
+ {"no-role-passwords", no_argument, &no_role_passwords, 1},
+ {"no-security-labels", no_argument, &no_security_labels, 1},
+ {"no-subscriptions", no_argument, &no_subscriptions, 1},
+ {"no-sync", no_argument, NULL, 4},
+ {"no-toast-compression", no_argument, &no_toast_compression, 1},
+ {"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1},
+ {"on-conflict-do-nothing", no_argument, &on_conflict_do_nothing, 1},
+ {"rows-per-insert", required_argument, NULL, 7},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ char *pghost = NULL;
+ char *pgport = NULL;
+ char *pguser = NULL;
+ char *pgdb = NULL;
+ char *use_role = NULL;
+ const char *dumpencoding = NULL;
+ trivalue prompt_password = TRI_DEFAULT;
+ bool data_only = false;
+ bool globals_only = false;
+ bool roles_only = false;
+ bool tablespaces_only = false;
+ PGconn *conn;
+ int encoding;
+ const char *std_strings;
+ int c,
+ ret;
+ int optindex;
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ help();
+ exit_nicely(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_dumpall (PostgreSQL) " PG_VERSION);
+ exit_nicely(0);
+ }
+ }
+
+ if ((ret = find_other_exec(argv[0], "pg_dump", PGDUMP_VERSIONSTR,
+ pg_dump_bin)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv[0], full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "pg_dump", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "pg_dump", full_path, progname);
+ }
+
+ pgdumpopts = createPQExpBuffer();
+
+ while ((c = getopt_long(argc, argv, "acd:E:f:gh:l:Op:rsS:tU:vwWx", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ data_only = true;
+ appendPQExpBufferStr(pgdumpopts, " -a");
+ break;
+
+ case 'c':
+ output_clean = true;
+ break;
+
+ case 'd':
+ connstr = pg_strdup(optarg);
+ break;
+
+ case 'E':
+ dumpencoding = pg_strdup(optarg);
+ appendPQExpBufferStr(pgdumpopts, " -E ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 'f':
+ filename = pg_strdup(optarg);
+ appendPQExpBufferStr(pgdumpopts, " -f ");
+ appendShellString(pgdumpopts, filename);
+ break;
+
+ case 'g':
+ globals_only = true;
+ break;
+
+ case 'h':
+ pghost = pg_strdup(optarg);
+ break;
+
+ case 'l':
+ pgdb = pg_strdup(optarg);
+ break;
+
+ case 'O':
+ appendPQExpBufferStr(pgdumpopts, " -O");
+ break;
+
+ case 'p':
+ pgport = pg_strdup(optarg);
+ break;
+
+ case 'r':
+ roles_only = true;
+ break;
+
+ case 's':
+ appendPQExpBufferStr(pgdumpopts, " -s");
+ break;
+
+ case 'S':
+ appendPQExpBufferStr(pgdumpopts, " -S ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 't':
+ tablespaces_only = true;
+ break;
+
+ case 'U':
+ pguser = pg_strdup(optarg);
+ break;
+
+ case 'v':
+ verbose = true;
+ pg_logging_increase_verbosity();
+ appendPQExpBufferStr(pgdumpopts, " -v");
+ break;
+
+ case 'w':
+ prompt_password = TRI_NO;
+ appendPQExpBufferStr(pgdumpopts, " -w");
+ break;
+
+ case 'W':
+ prompt_password = TRI_YES;
+ appendPQExpBufferStr(pgdumpopts, " -W");
+ break;
+
+ case 'x':
+ skip_acls = true;
+ appendPQExpBufferStr(pgdumpopts, " -x");
+ break;
+
+ case 0:
+ break;
+
+ case 2:
+ appendPQExpBufferStr(pgdumpopts, " --lock-wait-timeout ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 3:
+ use_role = pg_strdup(optarg);
+ appendPQExpBufferStr(pgdumpopts, " --role ");
+ appendShellString(pgdumpopts, use_role);
+ break;
+
+ case 4:
+ dosync = false;
+ appendPQExpBufferStr(pgdumpopts, " --no-sync");
+ break;
+
+ case 5:
+ appendPQExpBufferStr(pgdumpopts, " --extra-float-digits ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ case 6:
+ simple_string_list_append(&database_exclude_patterns, optarg);
+ break;
+
+ case 7:
+ appendPQExpBufferStr(pgdumpopts, " --rows-per-insert ");
+ appendShellString(pgdumpopts, optarg);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ if (database_exclude_patterns.head != NULL &&
+ (globals_only || roles_only || tablespaces_only))
+ {
+ pg_log_error("option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /* Make sure the user hasn't specified a mix of globals-only options */
+ if (globals_only && roles_only)
+ {
+ pg_log_error("options -g/--globals-only and -r/--roles-only cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ if (globals_only && tablespaces_only)
+ {
+ pg_log_error("options -g/--globals-only and -t/--tablespaces-only cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ if (if_exists && !output_clean)
+ pg_fatal("option --if-exists requires option -c/--clean");
+
+ if (roles_only && tablespaces_only)
+ {
+ pg_log_error("options -r/--roles-only and -t/--tablespaces-only cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /*
+ * If password values are not required in the dump, switch to using
+ * pg_roles which is equally useful, just more likely to have unrestricted
+ * access than pg_authid.
+ */
+ if (no_role_passwords)
+ sprintf(role_catalog, "%s", PG_ROLES);
+ else
+ sprintf(role_catalog, "%s", PG_AUTHID);
+
+ /* Add long options to the pg_dump argument list */
+ if (binary_upgrade)
+ appendPQExpBufferStr(pgdumpopts, " --binary-upgrade");
+ if (column_inserts)
+ appendPQExpBufferStr(pgdumpopts, " --column-inserts");
+ if (disable_dollar_quoting)
+ appendPQExpBufferStr(pgdumpopts, " --disable-dollar-quoting");
+ if (disable_triggers)
+ appendPQExpBufferStr(pgdumpopts, " --disable-triggers");
+ if (inserts)
+ appendPQExpBufferStr(pgdumpopts, " --inserts");
+ if (no_table_access_method)
+ appendPQExpBufferStr(pgdumpopts, " --no-table-access-method");
+ if (no_tablespaces)
+ appendPQExpBufferStr(pgdumpopts, " --no-tablespaces");
+ if (quote_all_identifiers)
+ appendPQExpBufferStr(pgdumpopts, " --quote-all-identifiers");
+ if (load_via_partition_root)
+ appendPQExpBufferStr(pgdumpopts, " --load-via-partition-root");
+ if (use_setsessauth)
+ appendPQExpBufferStr(pgdumpopts, " --use-set-session-authorization");
+ if (no_comments)
+ appendPQExpBufferStr(pgdumpopts, " --no-comments");
+ if (no_publications)
+ appendPQExpBufferStr(pgdumpopts, " --no-publications");
+ if (no_security_labels)
+ appendPQExpBufferStr(pgdumpopts, " --no-security-labels");
+ if (no_subscriptions)
+ appendPQExpBufferStr(pgdumpopts, " --no-subscriptions");
+ if (no_toast_compression)
+ appendPQExpBufferStr(pgdumpopts, " --no-toast-compression");
+ if (no_unlogged_table_data)
+ appendPQExpBufferStr(pgdumpopts, " --no-unlogged-table-data");
+ if (on_conflict_do_nothing)
+ appendPQExpBufferStr(pgdumpopts, " --on-conflict-do-nothing");
+
+ /*
+ * If there was a database specified on the command line, use that,
+ * otherwise try to connect to database "postgres", and failing that
+ * "template1".
+ */
+ if (pgdb)
+ {
+ conn = connectDatabase(pgdb, connstr, pghost, pgport, pguser,
+ prompt_password, false);
+
+ if (!conn)
+ pg_fatal("could not connect to database \"%s\"", pgdb);
+ }
+ else
+ {
+ conn = connectDatabase("postgres", connstr, pghost, pgport, pguser,
+ prompt_password, false);
+ if (!conn)
+ conn = connectDatabase("template1", connstr, pghost, pgport, pguser,
+ prompt_password, true);
+
+ if (!conn)
+ {
+ pg_log_error("could not connect to databases \"postgres\" or \"template1\"\n"
+ "Please specify an alternative database.");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /*
+ * Get a list of database names that match the exclude patterns
+ */
+ expand_dbname_patterns(conn, &database_exclude_patterns,
+ &database_exclude_names);
+
+ /*
+ * Open the output file if required, otherwise use stdout
+ */
+ if (filename)
+ {
+ OPF = fopen(filename, PG_BINARY_W);
+ if (!OPF)
+ pg_fatal("could not open output file \"%s\": %m",
+ filename);
+ }
+ else
+ OPF = stdout;
+
+ /*
+ * Set the client encoding if requested.
+ */
+ if (dumpencoding)
+ {
+ if (PQsetClientEncoding(conn, dumpencoding) < 0)
+ pg_fatal("invalid client encoding \"%s\" specified",
+ dumpencoding);
+ }
+
+ /*
+ * Get the active encoding and the standard_conforming_strings setting, so
+ * we know how to escape strings.
+ */
+ encoding = PQclientEncoding(conn);
+ std_strings = PQparameterStatus(conn, "standard_conforming_strings");
+ if (!std_strings)
+ std_strings = "off";
+
+ /* Set the role if requested */
+ if (use_role)
+ {
+ PQExpBuffer query = createPQExpBuffer();
+
+ appendPQExpBuffer(query, "SET ROLE %s", fmtId(use_role));
+ executeCommand(conn, query->data);
+ destroyPQExpBuffer(query);
+ }
+
+ /* Force quoting of all identifiers if requested. */
+ if (quote_all_identifiers)
+ executeCommand(conn, "SET quote_all_identifiers = true");
+
+ fprintf(OPF, "--\n-- PostgreSQL database cluster dump\n--\n\n");
+ if (verbose)
+ dumpTimestamp("Started on");
+
+ /*
+ * We used to emit \connect postgres here, but that served no purpose
+ * other than to break things for installations without a postgres
+ * database. Everything we're restoring here is a global, so whichever
+ * database we're connected to at the moment is fine.
+ */
+
+ /* Restore will need to write to the target cluster */
+ fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
+
+ /* Replicate encoding and std_strings in output */
+ fprintf(OPF, "SET client_encoding = '%s';\n",
+ pg_encoding_to_char(encoding));
+ fprintf(OPF, "SET standard_conforming_strings = %s;\n", std_strings);
+ if (strcmp(std_strings, "off") == 0)
+ fprintf(OPF, "SET escape_string_warning = off;\n");
+ fprintf(OPF, "\n");
+
+ if (!data_only)
+ {
+ /*
+ * If asked to --clean, do that first. We can avoid detailed
+ * dependency analysis because databases never depend on each other,
+ * and tablespaces never depend on each other. Roles could have
+ * grants to each other, but DROP ROLE will clean those up silently.
+ */
+ if (output_clean)
+ {
+ if (!globals_only && !roles_only && !tablespaces_only)
+ dropDBs(conn);
+
+ if (!roles_only && !no_tablespaces)
+ dropTablespaces(conn);
+
+ if (!tablespaces_only)
+ dropRoles(conn);
+ }
+
+ /*
+ * Now create objects as requested. Be careful that option logic here
+ * is the same as for drops above.
+ */
+ if (!tablespaces_only)
+ {
+ /* Dump roles (users) */
+ dumpRoles(conn);
+
+ /* Dump role memberships */
+ dumpRoleMembership(conn);
+
+ /* Dump role GUC privileges */
+ if (server_version >= 150000 && !skip_acls)
+ dumpRoleGUCPrivs(conn);
+ }
+
+ /* Dump tablespaces */
+ if (!roles_only && !no_tablespaces)
+ dumpTablespaces(conn);
+ }
+
+ if (!globals_only && !roles_only && !tablespaces_only)
+ dumpDatabases(conn);
+
+ PQfinish(conn);
+
+ if (verbose)
+ dumpTimestamp("Completed on");
+ fprintf(OPF, "--\n-- PostgreSQL database cluster dump complete\n--\n\n");
+
+ if (filename)
+ {
+ fclose(OPF);
+
+ /* sync the resulting file, errors are not fatal */
+ if (dosync)
+ (void) fsync_fname(filename, false);
+ }
+
+ exit_nicely(0);
+}
+
+
+static void
+help(void)
+{
+ printf(_("%s extracts a PostgreSQL database cluster into an SQL script file.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -f, --file=FILENAME output file name\n"));
+ printf(_(" -v, --verbose verbose mode\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nOptions controlling the output content:\n"));
+ printf(_(" -a, --data-only dump only the data, not the schema\n"));
+ printf(_(" -c, --clean clean (drop) databases before recreating\n"));
+ printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n"));
+ printf(_(" -g, --globals-only dump only global objects, no databases\n"));
+ printf(_(" -O, --no-owner skip restoration of object ownership\n"));
+ printf(_(" -r, --roles-only dump only roles, no databases or tablespaces\n"));
+ printf(_(" -s, --schema-only dump only the schema, no data\n"));
+ printf(_(" -S, --superuser=NAME superuser user name to use in the dump\n"));
+ printf(_(" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"));
+ printf(_(" -x, --no-privileges do not dump privileges (grant/revoke)\n"));
+ printf(_(" --binary-upgrade for use by upgrade utilities only\n"));
+ printf(_(" --column-inserts dump data as INSERT commands with column names\n"));
+ printf(_(" --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"));
+ printf(_(" --disable-triggers disable triggers during data-only restore\n"));
+ printf(_(" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"));
+ printf(_(" --extra-float-digits=NUM override default setting for extra_float_digits\n"));
+ printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
+ printf(_(" --inserts dump data as INSERT commands, rather than COPY\n"));
+ printf(_(" --load-via-partition-root load partitions via the root table\n"));
+ printf(_(" --no-comments do not dump comments\n"));
+ printf(_(" --no-publications do not dump publications\n"));
+ printf(_(" --no-role-passwords do not dump passwords for roles\n"));
+ printf(_(" --no-security-labels do not dump security label assignments\n"));
+ printf(_(" --no-subscriptions do not dump subscriptions\n"));
+ printf(_(" --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" --no-table-access-method do not dump table access methods\n"));
+ printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
+ printf(_(" --no-toast-compression do not dump TOAST compression methods\n"));
+ printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
+ printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"));
+ printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n"));
+ printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"));
+ printf(_(" --use-set-session-authorization\n"
+ " use SET SESSION AUTHORIZATION commands instead of\n"
+ " ALTER OWNER commands to set ownership\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -d, --dbname=CONNSTR connect using connection string\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -l, --database=DBNAME alternative default database\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_(" --role=ROLENAME do SET ROLE before dump\n"));
+
+ printf(_("\nIf -f/--file is not used, then the SQL script will be written to the standard\n"
+ "output.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * Drop roles
+ */
+static void
+dropRoles(PGconn *conn)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+ int i_rolname;
+ int i;
+
+ if (server_version >= 90600)
+ printfPQExpBuffer(buf,
+ "SELECT rolname "
+ "FROM %s "
+ "WHERE rolname !~ '^pg_' "
+ "ORDER BY 1", role_catalog);
+ else
+ printfPQExpBuffer(buf,
+ "SELECT rolname "
+ "FROM %s "
+ "ORDER BY 1", role_catalog);
+
+ res = executeQuery(conn, buf->data);
+
+ i_rolname = PQfnumber(res, "rolname");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Drop roles\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *rolename;
+
+ rolename = PQgetvalue(res, i, i_rolname);
+
+ fprintf(OPF, "DROP ROLE %s%s;\n",
+ if_exists ? "IF EXISTS " : "",
+ fmtId(rolename));
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(buf);
+
+ fprintf(OPF, "\n\n");
+}
+
+/*
+ * Dump roles
+ */
+static void
+dumpRoles(PGconn *conn)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+ int i_oid,
+ i_rolname,
+ i_rolsuper,
+ i_rolinherit,
+ i_rolcreaterole,
+ i_rolcreatedb,
+ i_rolcanlogin,
+ i_rolconnlimit,
+ i_rolpassword,
+ i_rolvaliduntil,
+ i_rolreplication,
+ i_rolbypassrls,
+ i_rolcomment,
+ i_is_current_user;
+ int i;
+
+ /* note: rolconfig is dumped later */
+ if (server_version >= 90600)
+ printfPQExpBuffer(buf,
+ "SELECT oid, rolname, rolsuper, rolinherit, "
+ "rolcreaterole, rolcreatedb, "
+ "rolcanlogin, rolconnlimit, rolpassword, "
+ "rolvaliduntil, rolreplication, rolbypassrls, "
+ "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+ "rolname = current_user AS is_current_user "
+ "FROM %s "
+ "WHERE rolname !~ '^pg_' "
+ "ORDER BY 2", role_catalog, role_catalog);
+ else if (server_version >= 90500)
+ printfPQExpBuffer(buf,
+ "SELECT oid, rolname, rolsuper, rolinherit, "
+ "rolcreaterole, rolcreatedb, "
+ "rolcanlogin, rolconnlimit, rolpassword, "
+ "rolvaliduntil, rolreplication, rolbypassrls, "
+ "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+ "rolname = current_user AS is_current_user "
+ "FROM %s "
+ "ORDER BY 2", role_catalog, role_catalog);
+ else
+ printfPQExpBuffer(buf,
+ "SELECT oid, rolname, rolsuper, rolinherit, "
+ "rolcreaterole, rolcreatedb, "
+ "rolcanlogin, rolconnlimit, rolpassword, "
+ "rolvaliduntil, rolreplication, "
+ "false as rolbypassrls, "
+ "pg_catalog.shobj_description(oid, '%s') as rolcomment, "
+ "rolname = current_user AS is_current_user "
+ "FROM %s "
+ "ORDER BY 2", role_catalog, role_catalog);
+
+ res = executeQuery(conn, buf->data);
+
+ i_oid = PQfnumber(res, "oid");
+ i_rolname = PQfnumber(res, "rolname");
+ i_rolsuper = PQfnumber(res, "rolsuper");
+ i_rolinherit = PQfnumber(res, "rolinherit");
+ i_rolcreaterole = PQfnumber(res, "rolcreaterole");
+ i_rolcreatedb = PQfnumber(res, "rolcreatedb");
+ i_rolcanlogin = PQfnumber(res, "rolcanlogin");
+ i_rolconnlimit = PQfnumber(res, "rolconnlimit");
+ i_rolpassword = PQfnumber(res, "rolpassword");
+ i_rolvaliduntil = PQfnumber(res, "rolvaliduntil");
+ i_rolreplication = PQfnumber(res, "rolreplication");
+ i_rolbypassrls = PQfnumber(res, "rolbypassrls");
+ i_rolcomment = PQfnumber(res, "rolcomment");
+ i_is_current_user = PQfnumber(res, "is_current_user");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Roles\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *rolename;
+ Oid auth_oid;
+
+ auth_oid = atooid(PQgetvalue(res, i, i_oid));
+ rolename = PQgetvalue(res, i, i_rolname);
+
+ if (strncmp(rolename, "pg_", 3) == 0)
+ {
+ pg_log_warning("role name starting with \"pg_\" skipped (%s)",
+ rolename);
+ continue;
+ }
+
+ resetPQExpBuffer(buf);
+
+ if (binary_upgrade)
+ {
+ appendPQExpBufferStr(buf, "\n-- For binary upgrade, must preserve pg_authid.oid\n");
+ appendPQExpBuffer(buf,
+ "SELECT pg_catalog.binary_upgrade_set_next_pg_authid_oid('%u'::pg_catalog.oid);\n\n",
+ auth_oid);
+ }
+
+ /*
+ * We dump CREATE ROLE followed by ALTER ROLE to ensure that the role
+ * will acquire the right properties even if it already exists (ie, it
+ * won't hurt for the CREATE to fail). This is particularly important
+ * for the role we are connected as, since even with --clean we will
+ * have failed to drop it. binary_upgrade cannot generate any errors,
+ * so we assume the current role is already created.
+ */
+ if (!binary_upgrade ||
+ strcmp(PQgetvalue(res, i, i_is_current_user), "f") == 0)
+ appendPQExpBuffer(buf, "CREATE ROLE %s;\n", fmtId(rolename));
+ appendPQExpBuffer(buf, "ALTER ROLE %s WITH", fmtId(rolename));
+
+ if (strcmp(PQgetvalue(res, i, i_rolsuper), "t") == 0)
+ appendPQExpBufferStr(buf, " SUPERUSER");
+ else
+ appendPQExpBufferStr(buf, " NOSUPERUSER");
+
+ if (strcmp(PQgetvalue(res, i, i_rolinherit), "t") == 0)
+ appendPQExpBufferStr(buf, " INHERIT");
+ else
+ appendPQExpBufferStr(buf, " NOINHERIT");
+
+ if (strcmp(PQgetvalue(res, i, i_rolcreaterole), "t") == 0)
+ appendPQExpBufferStr(buf, " CREATEROLE");
+ else
+ appendPQExpBufferStr(buf, " NOCREATEROLE");
+
+ if (strcmp(PQgetvalue(res, i, i_rolcreatedb), "t") == 0)
+ appendPQExpBufferStr(buf, " CREATEDB");
+ else
+ appendPQExpBufferStr(buf, " NOCREATEDB");
+
+ if (strcmp(PQgetvalue(res, i, i_rolcanlogin), "t") == 0)
+ appendPQExpBufferStr(buf, " LOGIN");
+ else
+ appendPQExpBufferStr(buf, " NOLOGIN");
+
+ if (strcmp(PQgetvalue(res, i, i_rolreplication), "t") == 0)
+ appendPQExpBufferStr(buf, " REPLICATION");
+ else
+ appendPQExpBufferStr(buf, " NOREPLICATION");
+
+ if (strcmp(PQgetvalue(res, i, i_rolbypassrls), "t") == 0)
+ appendPQExpBufferStr(buf, " BYPASSRLS");
+ else
+ appendPQExpBufferStr(buf, " NOBYPASSRLS");
+
+ if (strcmp(PQgetvalue(res, i, i_rolconnlimit), "-1") != 0)
+ appendPQExpBuffer(buf, " CONNECTION LIMIT %s",
+ PQgetvalue(res, i, i_rolconnlimit));
+
+
+ if (!PQgetisnull(res, i, i_rolpassword) && !no_role_passwords)
+ {
+ appendPQExpBufferStr(buf, " PASSWORD ");
+ appendStringLiteralConn(buf, PQgetvalue(res, i, i_rolpassword), conn);
+ }
+
+ if (!PQgetisnull(res, i, i_rolvaliduntil))
+ appendPQExpBuffer(buf, " VALID UNTIL '%s'",
+ PQgetvalue(res, i, i_rolvaliduntil));
+
+ appendPQExpBufferStr(buf, ";\n");
+
+ if (!no_comments && !PQgetisnull(res, i, i_rolcomment))
+ {
+ appendPQExpBuffer(buf, "COMMENT ON ROLE %s IS ", fmtId(rolename));
+ appendStringLiteralConn(buf, PQgetvalue(res, i, i_rolcomment), conn);
+ appendPQExpBufferStr(buf, ";\n");
+ }
+
+ if (!no_security_labels)
+ buildShSecLabels(conn, "pg_authid", auth_oid,
+ "ROLE", rolename,
+ buf);
+
+ fprintf(OPF, "%s", buf->data);
+ }
+
+ /*
+ * Dump configuration settings for roles after all roles have been dumped.
+ * We do it this way because config settings for roles could mention the
+ * names of other roles.
+ */
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "\n--\n-- User Configurations\n--\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ dumpUserConfig(conn, PQgetvalue(res, i, i_rolname));
+
+ PQclear(res);
+
+ fprintf(OPF, "\n\n");
+
+ destroyPQExpBuffer(buf);
+}
+
+
+/*
+ * Dump role memberships.
+ *
+ * Note: we expect dumpRoles already created all the roles, but there is
+ * no membership yet.
+ */
+static void
+dumpRoleMembership(PGconn *conn)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PQExpBuffer optbuf = createPQExpBuffer();
+ PGresult *res;
+ int start = 0,
+ end,
+ total;
+ bool dump_grantors;
+ bool dump_grant_options;
+ int i_inherit_option;
+ int i_set_option;
+
+ /*
+ * Previous versions of PostgreSQL didn't used to track the grantor very
+ * carefully in the backend, and the grantor could be any user even if
+ * they didn't have ADMIN OPTION on the role, or a user that no longer
+ * existed. To avoid dump and restore failures, don't dump the grantor
+ * when talking to an old server version.
+ */
+ dump_grantors = (PQserverVersion(conn) >= 160000);
+
+ /*
+ * Previous versions of PostgreSQL also did not have grant-level options.
+ */
+ dump_grant_options = (server_version >= 160000);
+
+ /* Generate and execute query. */
+ printfPQExpBuffer(buf, "SELECT ur.rolname AS role, "
+ "um.rolname AS member, "
+ "ug.oid AS grantorid, "
+ "ug.rolname AS grantor, "
+ "a.admin_option");
+ if (dump_grant_options)
+ appendPQExpBufferStr(buf, ", a.inherit_option, a.set_option");
+ appendPQExpBuffer(buf, " FROM pg_auth_members a "
+ "LEFT JOIN %s ur on ur.oid = a.roleid "
+ "LEFT JOIN %s um on um.oid = a.member "
+ "LEFT JOIN %s ug on ug.oid = a.grantor "
+ "WHERE NOT (ur.rolname ~ '^pg_' AND um.rolname ~ '^pg_')"
+ "ORDER BY 1,2,4", role_catalog, role_catalog, role_catalog);
+ res = executeQuery(conn, buf->data);
+ i_inherit_option = PQfnumber(res, "inherit_option");
+ i_set_option = PQfnumber(res, "set_option");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Role memberships\n--\n\n");
+
+ /*
+ * We can't dump these GRANT commands in arbitrary order, because a role
+ * that is named as a grantor must already have ADMIN OPTION on the role
+ * for which it is granting permissions, except for the bootstrap
+ * superuser, who can always be named as the grantor.
+ *
+ * We handle this by considering these grants role by role. For each role,
+ * we initially consider the only allowable grantor to be the bootstrap
+ * superuser. Every time we grant ADMIN OPTION on the role to some user,
+ * that user also becomes an allowable grantor. We make repeated passes
+ * over the grants for the role, each time dumping those whose grantors
+ * are allowable and which we haven't done yet. Eventually this should let
+ * us dump all the grants.
+ */
+ total = PQntuples(res);
+ while (start < total)
+ {
+ char *role = PQgetvalue(res, start, 0);
+ int i;
+ bool *done;
+ int remaining;
+ int prev_remaining = 0;
+ rolename_hash *ht;
+
+ /* All memberships for a single role should be adjacent. */
+ for (end = start; end < total; ++end)
+ {
+ char *otherrole;
+
+ otherrole = PQgetvalue(res, end, 0);
+ if (strcmp(role, otherrole) != 0)
+ break;
+ }
+
+ role = PQgetvalue(res, start, 0);
+ remaining = end - start;
+ done = pg_malloc0(remaining * sizeof(bool));
+ ht = rolename_create(remaining, NULL);
+
+ /*
+ * Make repeated passes over the grants for this role until all have
+ * been dumped.
+ */
+ while (remaining > 0)
+ {
+ /*
+ * We should make progress on every iteration, because a notional
+ * graph whose vertices are grants and whose edges point from
+ * grantors to members should be connected and acyclic. If we fail
+ * to make progress, either we or the server have messed up.
+ */
+ if (remaining == prev_remaining)
+ {
+ pg_log_error("could not find a legal dump ordering for memberships in role \"%s\"",
+ role);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+ prev_remaining = remaining;
+
+ /* Make one pass over the grants for this role. */
+ for (i = start; i < end; ++i)
+ {
+ char *member;
+ char *admin_option;
+ char *grantorid;
+ char *grantor;
+ char *set_option = "true";
+ bool found;
+
+ /* If we already did this grant, don't do it again. */
+ if (done[i - start])
+ continue;
+
+ member = PQgetvalue(res, i, 1);
+ grantorid = PQgetvalue(res, i, 2);
+ grantor = PQgetvalue(res, i, 3);
+ admin_option = PQgetvalue(res, i, 4);
+ if (dump_grant_options)
+ set_option = PQgetvalue(res, i, i_set_option);
+
+ /*
+ * If we're not dumping grantors or if the grantor is the
+ * bootstrap superuser, it's fine to dump this now. Otherwise,
+ * it's got to be someone who has already been granted ADMIN
+ * OPTION.
+ */
+ if (dump_grantors &&
+ atooid(grantorid) != BOOTSTRAP_SUPERUSERID &&
+ rolename_lookup(ht, grantor) == NULL)
+ continue;
+
+ /* Remember that we did this so that we don't do it again. */
+ done[i - start] = true;
+ --remaining;
+
+ /*
+ * If ADMIN OPTION is being granted, remember that grants
+ * listing this member as the grantor can now be dumped.
+ */
+ if (*admin_option == 't')
+ rolename_insert(ht, member, &found);
+
+ /* Generate the actual GRANT statement. */
+ resetPQExpBuffer(optbuf);
+ fprintf(OPF, "GRANT %s", fmtId(role));
+ fprintf(OPF, " TO %s", fmtId(member));
+ if (*admin_option == 't')
+ appendPQExpBufferStr(optbuf, "ADMIN OPTION");
+ if (dump_grant_options)
+ {
+ char *inherit_option;
+
+ if (optbuf->data[0] != '\0')
+ appendPQExpBufferStr(optbuf, ", ");
+ inherit_option = PQgetvalue(res, i, i_inherit_option);
+ appendPQExpBuffer(optbuf, "INHERIT %s",
+ *inherit_option == 't' ?
+ "TRUE" : "FALSE");
+ }
+ if (*set_option != 't')
+ {
+ if (optbuf->data[0] != '\0')
+ appendPQExpBufferStr(optbuf, ", ");
+ appendPQExpBuffer(optbuf, "SET FALSE");
+ }
+ if (optbuf->data[0] != '\0')
+ fprintf(OPF, " WITH %s", optbuf->data);
+ if (dump_grantors)
+ fprintf(OPF, " GRANTED BY %s", fmtId(grantor));
+ fprintf(OPF, ";\n");
+ }
+ }
+
+ rolename_destroy(ht);
+ pg_free(done);
+ start = end;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(buf);
+
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Dump role configuration parameter privileges. This code is used for 15.0
+ * and later servers.
+ *
+ * Note: we expect dumpRoles already created all the roles, but there are
+ * no per-role configuration parameter privileges yet.
+ */
+static void
+dumpRoleGUCPrivs(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Get all parameters that have non-default acls defined.
+ */
+ res = executeQuery(conn, "SELECT parname, "
+ "pg_catalog.pg_get_userbyid(" CppAsString2(BOOTSTRAP_SUPERUSERID) ") AS parowner, "
+ "paracl, "
+ "pg_catalog.acldefault('p', " CppAsString2(BOOTSTRAP_SUPERUSERID) ") AS acldefault "
+ "FROM pg_catalog.pg_parameter_acl "
+ "ORDER BY 1");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Role privileges on configuration parameters\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+ char *parname = PQgetvalue(res, i, 0);
+ char *parowner = PQgetvalue(res, i, 1);
+ char *paracl = PQgetvalue(res, i, 2);
+ char *acldefault = PQgetvalue(res, i, 3);
+ char *fparname;
+
+ /* needed for buildACLCommands() */
+ fparname = pg_strdup(fmtId(parname));
+
+ if (!buildACLCommands(fparname, NULL, NULL, "PARAMETER",
+ paracl, acldefault,
+ parowner, "", server_version, buf))
+ {
+ pg_log_error("could not parse ACL list (%s) for parameter \"%s\"",
+ paracl, parname);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ fprintf(OPF, "%s", buf->data);
+
+ free(fparname);
+ destroyPQExpBuffer(buf);
+ }
+
+ PQclear(res);
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Drop tablespaces.
+ */
+static void
+dropTablespaces(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Get all tablespaces except built-in ones (which we assume are named
+ * pg_xxx)
+ */
+ res = executeQuery(conn, "SELECT spcname "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname !~ '^pg_' "
+ "ORDER BY 1");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Drop tablespaces\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *spcname = PQgetvalue(res, i, 0);
+
+ fprintf(OPF, "DROP TABLESPACE %s%s;\n",
+ if_exists ? "IF EXISTS " : "",
+ fmtId(spcname));
+ }
+
+ PQclear(res);
+
+ fprintf(OPF, "\n\n");
+}
+
+/*
+ * Dump tablespaces.
+ */
+static void
+dumpTablespaces(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Get all tablespaces except built-in ones (which we assume are named
+ * pg_xxx)
+ */
+ res = executeQuery(conn, "SELECT oid, spcname, "
+ "pg_catalog.pg_get_userbyid(spcowner) AS spcowner, "
+ "pg_catalog.pg_tablespace_location(oid), "
+ "spcacl, acldefault('t', spcowner) AS acldefault, "
+ "array_to_string(spcoptions, ', '),"
+ "pg_catalog.shobj_description(oid, 'pg_tablespace') "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname !~ '^pg_' "
+ "ORDER BY 1");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Tablespaces\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ PQExpBuffer buf = createPQExpBuffer();
+ Oid spcoid = atooid(PQgetvalue(res, i, 0));
+ char *spcname = PQgetvalue(res, i, 1);
+ char *spcowner = PQgetvalue(res, i, 2);
+ char *spclocation = PQgetvalue(res, i, 3);
+ char *spcacl = PQgetvalue(res, i, 4);
+ char *acldefault = PQgetvalue(res, i, 5);
+ char *spcoptions = PQgetvalue(res, i, 6);
+ char *spccomment = PQgetvalue(res, i, 7);
+ char *fspcname;
+
+ /* needed for buildACLCommands() */
+ fspcname = pg_strdup(fmtId(spcname));
+
+ if (binary_upgrade)
+ {
+ appendPQExpBufferStr(buf, "\n-- For binary upgrade, must preserve pg_tablespace oid\n");
+ appendPQExpBuffer(buf, "SELECT pg_catalog.binary_upgrade_set_next_pg_tablespace_oid('%u'::pg_catalog.oid);\n", spcoid);
+ }
+
+ appendPQExpBuffer(buf, "CREATE TABLESPACE %s", fspcname);
+ appendPQExpBuffer(buf, " OWNER %s", fmtId(spcowner));
+
+ appendPQExpBufferStr(buf, " LOCATION ");
+ appendStringLiteralConn(buf, spclocation, conn);
+ appendPQExpBufferStr(buf, ";\n");
+
+ if (spcoptions && spcoptions[0] != '\0')
+ appendPQExpBuffer(buf, "ALTER TABLESPACE %s SET (%s);\n",
+ fspcname, spcoptions);
+
+ /* tablespaces can't have initprivs */
+
+ if (!skip_acls &&
+ !buildACLCommands(fspcname, NULL, NULL, "TABLESPACE",
+ spcacl, acldefault,
+ spcowner, "", server_version, buf))
+ {
+ pg_log_error("could not parse ACL list (%s) for tablespace \"%s\"",
+ spcacl, spcname);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ if (!no_comments && spccomment && spccomment[0] != '\0')
+ {
+ appendPQExpBuffer(buf, "COMMENT ON TABLESPACE %s IS ", fspcname);
+ appendStringLiteralConn(buf, spccomment, conn);
+ appendPQExpBufferStr(buf, ";\n");
+ }
+
+ if (!no_security_labels)
+ buildShSecLabels(conn, "pg_tablespace", spcoid,
+ "TABLESPACE", spcname,
+ buf);
+
+ fprintf(OPF, "%s", buf->data);
+
+ free(fspcname);
+ destroyPQExpBuffer(buf);
+ }
+
+ PQclear(res);
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Dump commands to drop each database.
+ */
+static void
+dropDBs(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Skip databases marked not datallowconn, since we'd be unable to connect
+ * to them anyway. This must agree with dumpDatabases().
+ */
+ res = executeQuery(conn,
+ "SELECT datname "
+ "FROM pg_database d "
+ "WHERE datallowconn AND datconnlimit != -2 "
+ "ORDER BY datname");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Drop databases (except postgres and template1)\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *dbname = PQgetvalue(res, i, 0);
+
+ /*
+ * Skip "postgres" and "template1"; dumpDatabases() will deal with
+ * them specially. Also, be sure to skip "template0", even if for
+ * some reason it's not marked !datallowconn.
+ */
+ if (strcmp(dbname, "template1") != 0 &&
+ strcmp(dbname, "template0") != 0 &&
+ strcmp(dbname, "postgres") != 0)
+ {
+ fprintf(OPF, "DROP DATABASE %s%s;\n",
+ if_exists ? "IF EXISTS " : "",
+ fmtId(dbname));
+ }
+ }
+
+ PQclear(res);
+
+ fprintf(OPF, "\n\n");
+}
+
+
+/*
+ * Dump user-specific configuration
+ */
+static void
+dumpUserConfig(PGconn *conn, const char *username)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ PGresult *res;
+
+ printfPQExpBuffer(buf, "SELECT unnest(setconfig) FROM pg_db_role_setting "
+ "WHERE setdatabase = 0 AND setrole = "
+ "(SELECT oid FROM %s WHERE rolname = ",
+ role_catalog);
+ appendStringLiteralConn(buf, username, conn);
+ appendPQExpBufferChar(buf, ')');
+
+ res = executeQuery(conn, buf->data);
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", username);
+
+ for (int i = 0; i < PQntuples(res); i++)
+ {
+ resetPQExpBuffer(buf);
+ makeAlterConfigCommand(conn, PQgetvalue(res, i, 0),
+ "ROLE", username, NULL, NULL,
+ buf);
+ fprintf(OPF, "%s", buf->data);
+ }
+
+ PQclear(res);
+
+ destroyPQExpBuffer(buf);
+}
+
+/*
+ * Find a list of database names that match the given patterns.
+ * See also expand_table_name_patterns() in pg_dump.c
+ */
+static void
+expand_dbname_patterns(PGconn *conn,
+ SimpleStringList *patterns,
+ SimpleStringList *names)
+{
+ PQExpBuffer query;
+ PGresult *res;
+
+ if (patterns->head == NULL)
+ return; /* nothing to do */
+
+ query = createPQExpBuffer();
+
+ /*
+ * The loop below runs multiple SELECTs, which might sometimes result in
+ * duplicate entries in the name list, but we don't care, since all we're
+ * going to do is test membership of the list.
+ */
+
+ for (SimpleStringListCell *cell = patterns->head; cell; cell = cell->next)
+ {
+ int dotcnt;
+
+ appendPQExpBufferStr(query,
+ "SELECT datname FROM pg_catalog.pg_database n\n");
+ processSQLNamePattern(conn, query, cell->val, false,
+ false, NULL, "datname", NULL, NULL, NULL,
+ &dotcnt);
+
+ if (dotcnt > 0)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s",
+ cell->val);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ res = executeQuery(conn, query->data);
+ for (int i = 0; i < PQntuples(res); i++)
+ {
+ simple_string_list_append(names, PQgetvalue(res, i, 0));
+ }
+
+ PQclear(res);
+ resetPQExpBuffer(query);
+ }
+
+ destroyPQExpBuffer(query);
+}
+
+/*
+ * Dump contents of databases.
+ */
+static void
+dumpDatabases(PGconn *conn)
+{
+ PGresult *res;
+ int i;
+
+ /*
+ * Skip databases marked not datallowconn, since we'd be unable to connect
+ * to them anyway. This must agree with dropDBs().
+ *
+ * We arrange for template1 to be processed first, then we process other
+ * DBs in alphabetical order. If we just did them all alphabetically, we
+ * might find ourselves trying to drop the "postgres" database while still
+ * connected to it. This makes trying to run the restore script while
+ * connected to "template1" a bad idea, but there's no fixed order that
+ * doesn't have some failure mode with --clean.
+ */
+ res = executeQuery(conn,
+ "SELECT datname "
+ "FROM pg_database d "
+ "WHERE datallowconn AND datconnlimit != -2 "
+ "ORDER BY (datname <> 'template1'), datname");
+
+ if (PQntuples(res) > 0)
+ fprintf(OPF, "--\n-- Databases\n--\n\n");
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *dbname = PQgetvalue(res, i, 0);
+ const char *create_opts;
+ int ret;
+
+ /* Skip template0, even if it's not marked !datallowconn. */
+ if (strcmp(dbname, "template0") == 0)
+ continue;
+
+ /* Skip any explicitly excluded database */
+ if (simple_string_list_member(&database_exclude_names, dbname))
+ {
+ pg_log_info("excluding database \"%s\"", dbname);
+ continue;
+ }
+
+ pg_log_info("dumping database \"%s\"", dbname);
+
+ fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", dbname);
+
+ /*
+ * We assume that "template1" and "postgres" already exist in the
+ * target installation. dropDBs() won't have removed them, for fear
+ * of removing the DB the restore script is initially connected to. If
+ * --clean was specified, tell pg_dump to drop and recreate them;
+ * otherwise we'll merely restore their contents. Other databases
+ * should simply be created.
+ */
+ if (strcmp(dbname, "template1") == 0 || strcmp(dbname, "postgres") == 0)
+ {
+ if (output_clean)
+ create_opts = "--clean --create";
+ else
+ {
+ create_opts = "";
+ /* Since pg_dump won't emit a \connect command, we must */
+ fprintf(OPF, "\\connect %s\n\n", dbname);
+ }
+ }
+ else
+ create_opts = "--create";
+
+ if (filename)
+ fclose(OPF);
+
+ ret = runPgDump(dbname, create_opts);
+ if (ret != 0)
+ pg_fatal("pg_dump failed on database \"%s\", exiting", dbname);
+
+ if (filename)
+ {
+ OPF = fopen(filename, PG_BINARY_A);
+ if (!OPF)
+ pg_fatal("could not re-open the output file \"%s\": %m",
+ filename);
+ }
+ }
+
+ PQclear(res);
+}
+
+
+
+/*
+ * Run pg_dump on dbname, with specified options.
+ */
+static int
+runPgDump(const char *dbname, const char *create_opts)
+{
+ PQExpBuffer connstrbuf = createPQExpBuffer();
+ PQExpBuffer cmd = createPQExpBuffer();
+ int ret;
+
+ appendPQExpBuffer(cmd, "\"%s\" %s %s", pg_dump_bin,
+ pgdumpopts->data, create_opts);
+
+ /*
+ * If we have a filename, use the undocumented plain-append pg_dump
+ * format.
+ */
+ if (filename)
+ appendPQExpBufferStr(cmd, " -Fa ");
+ else
+ appendPQExpBufferStr(cmd, " -Fp ");
+
+ /*
+ * Append the database name to the already-constructed stem of connection
+ * string.
+ */
+ appendPQExpBuffer(connstrbuf, "%s dbname=", connstr);
+ appendConnStrVal(connstrbuf, dbname);
+
+ appendShellString(cmd, connstrbuf->data);
+
+ pg_log_info("running \"%s\"", cmd->data);
+
+ fflush(NULL);
+
+ ret = system(cmd->data);
+
+ destroyPQExpBuffer(cmd);
+ destroyPQExpBuffer(connstrbuf);
+
+ return ret;
+}
+
+/*
+ * buildShSecLabels
+ *
+ * Build SECURITY LABEL command(s) for a shared object
+ *
+ * The caller has to provide object type and identity in two separate formats:
+ * catalog_name (e.g., "pg_database") and object OID, as well as
+ * type name (e.g., "DATABASE") and object name (not pre-quoted).
+ *
+ * The command(s) are appended to "buffer".
+ */
+static void
+buildShSecLabels(PGconn *conn, const char *catalog_name, Oid objectId,
+ const char *objtype, const char *objname,
+ PQExpBuffer buffer)
+{
+ PQExpBuffer sql = createPQExpBuffer();
+ PGresult *res;
+
+ buildShSecLabelQuery(catalog_name, objectId, sql);
+ res = executeQuery(conn, sql->data);
+ emitShSecLabels(conn, res, buffer, objtype, objname);
+
+ PQclear(res);
+ destroyPQExpBuffer(sql);
+}
+
+/*
+ * Make a database connection with the given parameters. An
+ * interactive password prompt is automatically issued if required.
+ *
+ * If fail_on_error is false, we return NULL without printing any message
+ * on failure, but preserve any prompted password for the next try.
+ *
+ * On success, the global variable 'connstr' is set to a connection string
+ * containing the options used.
+ */
+static PGconn *
+connectDatabase(const char *dbname, const char *connection_string,
+ const char *pghost, const char *pgport, const char *pguser,
+ trivalue prompt_password, bool fail_on_error)
+{
+ PGconn *conn;
+ bool new_pass;
+ const char *remoteversion_str;
+ int my_version;
+ const char **keywords = NULL;
+ const char **values = NULL;
+ PQconninfoOption *conn_opts = NULL;
+ static char *password = NULL;
+
+ if (prompt_password == TRI_YES && !password)
+ password = simple_prompt("Password: ", false);
+
+ /*
+ * Start the connection. Loop until we have a password if requested by
+ * backend.
+ */
+ do
+ {
+ int argcount = 6;
+ PQconninfoOption *conn_opt;
+ char *err_msg = NULL;
+ int i = 0;
+
+ free(keywords);
+ free(values);
+ PQconninfoFree(conn_opts);
+
+ /*
+ * Merge the connection info inputs given in form of connection string
+ * and other options. Explicitly discard any dbname value in the
+ * connection string; otherwise, PQconnectdbParams() would interpret
+ * that value as being itself a connection string.
+ */
+ if (connection_string)
+ {
+ conn_opts = PQconninfoParse(connection_string, &err_msg);
+ if (conn_opts == NULL)
+ pg_fatal("%s", err_msg);
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ argcount++;
+ }
+
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+
+ for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++)
+ {
+ if (conn_opt->val != NULL && conn_opt->val[0] != '\0' &&
+ strcmp(conn_opt->keyword, "dbname") != 0)
+ {
+ keywords[i] = conn_opt->keyword;
+ values[i] = conn_opt->val;
+ i++;
+ }
+ }
+ }
+ else
+ {
+ keywords = pg_malloc0((argcount + 1) * sizeof(*keywords));
+ values = pg_malloc0((argcount + 1) * sizeof(*values));
+ }
+
+ if (pghost)
+ {
+ keywords[i] = "host";
+ values[i] = pghost;
+ i++;
+ }
+ if (pgport)
+ {
+ keywords[i] = "port";
+ values[i] = pgport;
+ i++;
+ }
+ if (pguser)
+ {
+ keywords[i] = "user";
+ values[i] = pguser;
+ i++;
+ }
+ if (password)
+ {
+ keywords[i] = "password";
+ values[i] = password;
+ i++;
+ }
+ if (dbname)
+ {
+ keywords[i] = "dbname";
+ values[i] = dbname;
+ i++;
+ }
+ keywords[i] = "fallback_application_name";
+ values[i] = progname;
+ i++;
+
+ new_pass = false;
+ conn = PQconnectdbParams(keywords, values, true);
+
+ if (!conn)
+ pg_fatal("could not connect to database \"%s\"", dbname);
+
+ if (PQstatus(conn) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(conn) &&
+ !password &&
+ prompt_password != TRI_NO)
+ {
+ PQfinish(conn);
+ password = simple_prompt("Password: ", false);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ /* check to see that the backend connection was successfully made */
+ if (PQstatus(conn) == CONNECTION_BAD)
+ {
+ if (fail_on_error)
+ pg_fatal("%s", PQerrorMessage(conn));
+ else
+ {
+ PQfinish(conn);
+
+ free(keywords);
+ free(values);
+ PQconninfoFree(conn_opts);
+
+ return NULL;
+ }
+ }
+
+ /*
+ * Ok, connected successfully. Remember the options used, in the form of a
+ * connection string.
+ */
+ connstr = constructConnStr(keywords, values);
+
+ free(keywords);
+ free(values);
+ PQconninfoFree(conn_opts);
+
+ /* Check version */
+ remoteversion_str = PQparameterStatus(conn, "server_version");
+ if (!remoteversion_str)
+ pg_fatal("could not get server version");
+ server_version = PQserverVersion(conn);
+ if (server_version == 0)
+ pg_fatal("could not parse server version \"%s\"",
+ remoteversion_str);
+
+ my_version = PG_VERSION_NUM;
+
+ /*
+ * We allow the server to be back to 9.2, and up to any minor release of
+ * our own major version. (See also version check in pg_dump.c.)
+ */
+ if (my_version != server_version
+ && (server_version < 90200 ||
+ (server_version / 100) > (my_version / 100)))
+ {
+ pg_log_error("aborting because of server version mismatch");
+ pg_log_error_detail("server version: %s; %s version: %s",
+ remoteversion_str, progname, PG_VERSION);
+ exit_nicely(1);
+ }
+
+ PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ return conn;
+}
+
+/* ----------
+ * Construct a connection string from the given keyword/value pairs. It is
+ * used to pass the connection options to the pg_dump subprocess.
+ *
+ * The following parameters are excluded:
+ * dbname - varies in each pg_dump invocation
+ * password - it's not secure to pass a password on the command line
+ * fallback_application_name - we'll let pg_dump set it
+ * ----------
+ */
+static char *
+constructConnStr(const char **keywords, const char **values)
+{
+ PQExpBuffer buf = createPQExpBuffer();
+ char *connstr;
+ int i;
+ bool firstkeyword = true;
+
+ /* Construct a new connection string in key='value' format. */
+ for (i = 0; keywords[i] != NULL; i++)
+ {
+ if (strcmp(keywords[i], "dbname") == 0 ||
+ strcmp(keywords[i], "password") == 0 ||
+ strcmp(keywords[i], "fallback_application_name") == 0)
+ continue;
+
+ if (!firstkeyword)
+ appendPQExpBufferChar(buf, ' ');
+ firstkeyword = false;
+ appendPQExpBuffer(buf, "%s=", keywords[i]);
+ appendConnStrVal(buf, values[i]);
+ }
+
+ connstr = pg_strdup(buf->data);
+ destroyPQExpBuffer(buf);
+ return connstr;
+}
+
+/*
+ * Run a query, return the results, exit program on failure.
+ */
+static PGresult *
+executeQuery(PGconn *conn, const char *query)
+{
+ PGresult *res;
+
+ pg_log_info("executing %s", query);
+
+ res = PQexec(conn, query);
+ if (!res ||
+ PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", query);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ return res;
+}
+
+/*
+ * As above for a SQL command (which returns nothing).
+ */
+static void
+executeCommand(PGconn *conn, const char *query)
+{
+ PGresult *res;
+
+ pg_log_info("executing %s", query);
+
+ res = PQexec(conn, query);
+ if (!res ||
+ PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(conn));
+ pg_log_error_detail("Query was: %s", query);
+ PQfinish(conn);
+ exit_nicely(1);
+ }
+
+ PQclear(res);
+}
+
+
+/*
+ * dumpTimestamp
+ */
+static void
+dumpTimestamp(const char *msg)
+{
+ char buf[64];
+ time_t now = time(NULL);
+
+ if (strftime(buf, sizeof(buf), PGDUMP_STRFTIME_FMT, localtime(&now)) != 0)
+ fprintf(OPF, "-- %s %s\n\n", msg, buf);
+}
+
+/*
+ * Helper function for rolename_hash hash table.
+ */
+static uint32
+hash_string_pointer(char *s)
+{
+ unsigned char *ss = (unsigned char *) s;
+
+ return hash_bytes(ss, strlen(s));
+}
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
new file mode 100644
index 0000000..049a100
--- /dev/null
+++ b/src/bin/pg_dump/pg_restore.c
@@ -0,0 +1,496 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_restore.c
+ * pg_restore is an utility extracting postgres database definitions
+ * from a backup archive created by pg_dump using the archiver
+ * interface.
+ *
+ * pg_restore will read the backup archive and
+ * dump out a script that reproduces
+ * the schema of the database in terms of
+ * user-defined types
+ * user-defined functions
+ * tables
+ * indexes
+ * aggregates
+ * operators
+ * ACL - grant/revoke
+ *
+ * the output script is SQL that is understood by PostgreSQL
+ *
+ * Basic process in a restore operation is:
+ *
+ * Open the Archive and read the TOC.
+ * Set flags in TOC entries, and *maybe* reorder them.
+ * Generate script to stdout
+ * Exit
+ *
+ * Copyright (c) 2000, Philip Warner
+ * Rights are granted to use this software in any way so long
+ * as this notice is not removed.
+ *
+ * The author is not responsible for loss or damages that may
+ * result from its use.
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pg_dump/pg_restore.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "dumputils.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "parallel.h"
+#include "pg_backup_utils.h"
+
+static void usage(const char *progname);
+
+int
+main(int argc, char **argv)
+{
+ RestoreOptions *opts;
+ int c;
+ int exit_code;
+ int numWorkers = 1;
+ Archive *AH;
+ char *inputFileSpec;
+ static int disable_triggers = 0;
+ static int enable_row_security = 0;
+ static int if_exists = 0;
+ static int no_data_for_failed_tables = 0;
+ static int outputNoTableAm = 0;
+ static int outputNoTablespaces = 0;
+ static int use_setsessauth = 0;
+ static int no_comments = 0;
+ static int no_publications = 0;
+ static int no_security_labels = 0;
+ static int no_subscriptions = 0;
+ static int strict_names = 0;
+
+ struct option cmdopts[] = {
+ {"clean", 0, NULL, 'c'},
+ {"create", 0, NULL, 'C'},
+ {"data-only", 0, NULL, 'a'},
+ {"dbname", 1, NULL, 'd'},
+ {"exit-on-error", 0, NULL, 'e'},
+ {"exclude-schema", 1, NULL, 'N'},
+ {"file", 1, NULL, 'f'},
+ {"format", 1, NULL, 'F'},
+ {"function", 1, NULL, 'P'},
+ {"host", 1, NULL, 'h'},
+ {"index", 1, NULL, 'I'},
+ {"jobs", 1, NULL, 'j'},
+ {"list", 0, NULL, 'l'},
+ {"no-privileges", 0, NULL, 'x'},
+ {"no-acl", 0, NULL, 'x'},
+ {"no-owner", 0, NULL, 'O'},
+ {"no-reconnect", 0, NULL, 'R'},
+ {"port", 1, NULL, 'p'},
+ {"no-password", 0, NULL, 'w'},
+ {"password", 0, NULL, 'W'},
+ {"schema", 1, NULL, 'n'},
+ {"schema-only", 0, NULL, 's'},
+ {"superuser", 1, NULL, 'S'},
+ {"table", 1, NULL, 't'},
+ {"trigger", 1, NULL, 'T'},
+ {"use-list", 1, NULL, 'L'},
+ {"username", 1, NULL, 'U'},
+ {"verbose", 0, NULL, 'v'},
+ {"single-transaction", 0, NULL, '1'},
+
+ /*
+ * the following options don't have an equivalent short option letter
+ */
+ {"disable-triggers", no_argument, &disable_triggers, 1},
+ {"enable-row-security", no_argument, &enable_row_security, 1},
+ {"if-exists", no_argument, &if_exists, 1},
+ {"no-data-for-failed-tables", no_argument, &no_data_for_failed_tables, 1},
+ {"no-table-access-method", no_argument, &outputNoTableAm, 1},
+ {"no-tablespaces", no_argument, &outputNoTablespaces, 1},
+ {"role", required_argument, NULL, 2},
+ {"section", required_argument, NULL, 3},
+ {"strict-names", no_argument, &strict_names, 1},
+ {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
+ {"no-comments", no_argument, &no_comments, 1},
+ {"no-publications", no_argument, &no_publications, 1},
+ {"no-security-labels", no_argument, &no_security_labels, 1},
+ {"no-subscriptions", no_argument, &no_subscriptions, 1},
+
+ {NULL, 0, NULL, 0}
+ };
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
+
+ init_parallel_dump_utils();
+
+ opts = NewRestoreOptions();
+
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit_nicely(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_restore (PostgreSQL) " PG_VERSION);
+ exit_nicely(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "acCd:ef:F:h:I:j:lL:n:N:Op:P:RsS:t:T:U:vwWx1",
+ cmdopts, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'a': /* Dump data only */
+ opts->dataOnly = 1;
+ break;
+ case 'c': /* clean (i.e., drop) schema prior to create */
+ opts->dropSchema = 1;
+ break;
+ case 'C':
+ opts->createDB = 1;
+ break;
+ case 'd':
+ opts->cparams.dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ opts->exit_on_error = true;
+ break;
+ case 'f': /* output file name */
+ opts->filename = pg_strdup(optarg);
+ break;
+ case 'F':
+ if (strlen(optarg) != 0)
+ opts->formatName = pg_strdup(optarg);
+ break;
+ case 'h':
+ if (strlen(optarg) != 0)
+ opts->cparams.pghost = pg_strdup(optarg);
+ break;
+
+ case 'j': /* number of restore jobs */
+ if (!option_parse_int(optarg, "-j/--jobs", 1,
+ PG_MAX_JOBS,
+ &numWorkers))
+ exit(1);
+ break;
+
+ case 'l': /* Dump the TOC summary */
+ opts->tocSummary = 1;
+ break;
+
+ case 'L': /* input TOC summary file name */
+ opts->tocFile = pg_strdup(optarg);
+ break;
+
+ case 'n': /* Dump data for this schema only */
+ simple_string_list_append(&opts->schemaNames, optarg);
+ break;
+
+ case 'N': /* Do not dump data for this schema */
+ simple_string_list_append(&opts->schemaExcludeNames, optarg);
+ break;
+
+ case 'O':
+ opts->noOwner = 1;
+ break;
+
+ case 'p':
+ if (strlen(optarg) != 0)
+ opts->cparams.pgport = pg_strdup(optarg);
+ break;
+ case 'R':
+ /* no-op, still accepted for backwards compatibility */
+ break;
+ case 'P': /* Function */
+ opts->selTypes = 1;
+ opts->selFunction = 1;
+ simple_string_list_append(&opts->functionNames, optarg);
+ break;
+ case 'I': /* Index */
+ opts->selTypes = 1;
+ opts->selIndex = 1;
+ simple_string_list_append(&opts->indexNames, optarg);
+ break;
+ case 'T': /* Trigger */
+ opts->selTypes = 1;
+ opts->selTrigger = 1;
+ simple_string_list_append(&opts->triggerNames, optarg);
+ break;
+ case 's': /* dump schema only */
+ opts->schemaOnly = 1;
+ break;
+ case 'S': /* Superuser username */
+ if (strlen(optarg) != 0)
+ opts->superuser = pg_strdup(optarg);
+ break;
+ case 't': /* Dump specified table(s) only */
+ opts->selTypes = 1;
+ opts->selTable = 1;
+ simple_string_list_append(&opts->tableNames, optarg);
+ break;
+
+ case 'U':
+ opts->cparams.username = pg_strdup(optarg);
+ break;
+
+ case 'v': /* verbose */
+ opts->verbose = 1;
+ pg_logging_increase_verbosity();
+ break;
+
+ case 'w':
+ opts->cparams.promptPassword = TRI_NO;
+ break;
+
+ case 'W':
+ opts->cparams.promptPassword = TRI_YES;
+ break;
+
+ case 'x': /* skip ACL dump */
+ opts->aclsSkip = 1;
+ break;
+
+ case '1': /* Restore data in a single transaction */
+ opts->single_txn = true;
+ opts->exit_on_error = true;
+ break;
+
+ case 0:
+
+ /*
+ * This covers the long options without a short equivalent.
+ */
+ break;
+
+ case 2: /* SET ROLE */
+ opts->use_role = pg_strdup(optarg);
+ break;
+
+ case 3: /* section */
+ set_dump_section(optarg, &(opts->dumpSections));
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ }
+
+ /* Get file name from command line */
+ if (optind < argc)
+ inputFileSpec = argv[optind++];
+ else
+ inputFileSpec = NULL;
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+
+ /* Complain if neither -f nor -d was specified (except if dumping TOC) */
+ if (!opts->cparams.dbname && !opts->filename && !opts->tocSummary)
+ pg_fatal("one of -d/--dbname and -f/--file must be specified");
+
+ /* Should get at most one of -d and -f, else user is confused */
+ if (opts->cparams.dbname)
+ {
+ if (opts->filename)
+ {
+ pg_log_error("options -d/--dbname and -f/--file cannot be used together");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit_nicely(1);
+ }
+ opts->useDB = 1;
+ }
+
+ if (opts->dataOnly && opts->schemaOnly)
+ pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together");
+
+ if (opts->dataOnly && opts->dropSchema)
+ pg_fatal("options -c/--clean and -a/--data-only cannot be used together");
+
+ /*
+ * -C is not compatible with -1, because we can't create a database inside
+ * a transaction block.
+ */
+ if (opts->createDB && opts->single_txn)
+ pg_fatal("options -C/--create and -1/--single-transaction cannot be used together");
+
+ /* Can't do single-txn mode with multiple connections */
+ if (opts->single_txn && numWorkers > 1)
+ pg_fatal("cannot specify both --single-transaction and multiple jobs");
+
+ opts->disable_triggers = disable_triggers;
+ opts->enable_row_security = enable_row_security;
+ opts->noDataForFailedTables = no_data_for_failed_tables;
+ opts->noTableAm = outputNoTableAm;
+ opts->noTablespace = outputNoTablespaces;
+ opts->use_setsessauth = use_setsessauth;
+ opts->no_comments = no_comments;
+ opts->no_publications = no_publications;
+ opts->no_security_labels = no_security_labels;
+ opts->no_subscriptions = no_subscriptions;
+
+ if (if_exists && !opts->dropSchema)
+ pg_fatal("option --if-exists requires option -c/--clean");
+ opts->if_exists = if_exists;
+ opts->strict_names = strict_names;
+
+ if (opts->formatName)
+ {
+ switch (opts->formatName[0])
+ {
+ case 'c':
+ case 'C':
+ opts->format = archCustom;
+ break;
+
+ case 'd':
+ case 'D':
+ opts->format = archDirectory;
+ break;
+
+ case 't':
+ case 'T':
+ opts->format = archTar;
+ break;
+
+ default:
+ pg_fatal("unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"",
+ opts->formatName);
+ }
+ }
+
+ AH = OpenArchive(inputFileSpec, opts->format);
+
+ SetArchiveOptions(AH, NULL, opts);
+
+ /*
+ * We don't have a connection yet but that doesn't matter. The connection
+ * is initialized to NULL and if we terminate through exit_nicely() while
+ * it's still NULL, the cleanup function will just be a no-op.
+ */
+ on_exit_close_archive(AH);
+
+ /* Let the archiver know how noisy to be */
+ AH->verbose = opts->verbose;
+
+ /*
+ * Whether to keep submitting sql commands as "pg_restore ... | psql ... "
+ */
+ AH->exit_on_error = opts->exit_on_error;
+
+ if (opts->tocFile)
+ SortTocFromFile(AH);
+
+ AH->numWorkers = numWorkers;
+
+ if (opts->tocSummary)
+ PrintTOCSummary(AH);
+ else
+ {
+ ProcessArchiveRestoreOptions(AH);
+ RestoreArchive(AH);
+ }
+
+ /* done, print a summary of ignored errors */
+ if (AH->n_errors)
+ pg_log_warning("errors ignored on restore: %d", AH->n_errors);
+
+ /* AH may be freed in CloseArchive? */
+ exit_code = AH->n_errors ? 1 : 0;
+
+ CloseArchive(AH);
+
+ return exit_code;
+}
+
+static void
+usage(const char *progname)
+{
+ printf(_("%s restores a PostgreSQL database from an archive created by pg_dump.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [FILE]\n"), progname);
+
+ printf(_("\nGeneral options:\n"));
+ printf(_(" -d, --dbname=NAME connect to database name\n"));
+ printf(_(" -f, --file=FILENAME output file name (- for stdout)\n"));
+ printf(_(" -F, --format=c|d|t backup file format (should be automatic)\n"));
+ printf(_(" -l, --list print summarized TOC of the archive\n"));
+ printf(_(" -v, --verbose verbose mode\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nOptions controlling the restore:\n"));
+ printf(_(" -a, --data-only restore only the data, no schema\n"));
+ printf(_(" -c, --clean clean (drop) database objects before recreating\n"));
+ printf(_(" -C, --create create the target database\n"));
+ printf(_(" -e, --exit-on-error exit on error, default is to continue\n"));
+ printf(_(" -I, --index=NAME restore named index\n"));
+ printf(_(" -j, --jobs=NUM use this many parallel jobs to restore\n"));
+ printf(_(" -L, --use-list=FILENAME use table of contents from this file for\n"
+ " selecting/ordering output\n"));
+ printf(_(" -n, --schema=NAME restore only objects in this schema\n"));
+ printf(_(" -N, --exclude-schema=NAME do not restore objects in this schema\n"));
+ printf(_(" -O, --no-owner skip restoration of object ownership\n"));
+ printf(_(" -P, --function=NAME(args) restore named function\n"));
+ printf(_(" -s, --schema-only restore only the schema, no data\n"));
+ printf(_(" -S, --superuser=NAME superuser user name to use for disabling triggers\n"));
+ printf(_(" -t, --table=NAME restore named relation (table, view, etc.)\n"));
+ printf(_(" -T, --trigger=NAME restore named trigger\n"));
+ printf(_(" -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"));
+ printf(_(" -1, --single-transaction restore as a single transaction\n"));
+ printf(_(" --disable-triggers disable triggers during data-only restore\n"));
+ printf(_(" --enable-row-security enable row security\n"));
+ printf(_(" --if-exists use IF EXISTS when dropping objects\n"));
+ printf(_(" --no-comments do not restore comments\n"));
+ printf(_(" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+ " created\n"));
+ printf(_(" --no-publications do not restore publications\n"));
+ printf(_(" --no-security-labels do not restore security labels\n"));
+ printf(_(" --no-subscriptions do not restore subscriptions\n"));
+ printf(_(" --no-table-access-method do not restore table access methods\n"));
+ printf(_(" --no-tablespaces do not restore tablespace assignments\n"));
+ printf(_(" --section=SECTION restore named section (pre-data, data, or post-data)\n"));
+ printf(_(" --strict-names require table and/or schema include patterns to\n"
+ " match at least one entity each\n"));
+ printf(_(" --use-set-session-authorization\n"
+ " use SET SESSION AUTHORIZATION commands instead of\n"
+ " ALTER OWNER commands to set ownership\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port number\n"));
+ printf(_(" -U, --username=NAME connect as specified database user\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt (should happen automatically)\n"));
+ printf(_(" --role=ROLENAME do SET ROLE before restore\n"));
+
+ printf(_("\n"
+ "The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+ "multiple times to select multiple objects.\n"));
+ printf(_("\nIf no input file name is supplied, then standard input is used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/pg_dump/po/LINGUAS b/src/bin/pg_dump/po/LINGUAS
new file mode 100644
index 0000000..00f815d
--- /dev/null
+++ b/src/bin/pg_dump/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_dump/po/cs.po b/src/bin/pg_dump/po/cs.po
new file mode 100644
index 0000000..dd75359
--- /dev/null
+++ b/src/bin/pg_dump/po/cs.po
@@ -0,0 +1,2965 @@
+# Czech message translation file for pg_dump
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2023-09-05 07:29+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "chyba "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "varování: "
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze Äíst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít soubor \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze pÅ™eÄíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skonÄil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukonÄen vyjímkou 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukonÄen signálem %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skonÄil s nerozponaným stavem %d"
+
+#: common.c:121
+#, c-format
+msgid "reading extensions"
+msgstr "Ätu rozšíření"
+
+#: common.c:125
+#, c-format
+msgid "identifying extension members"
+msgstr "hledám položky rozšíření (extenze)"
+
+#: common.c:128
+#, c-format
+msgid "reading schemas"
+msgstr "Ätu schémata"
+
+#: common.c:138
+#, c-format
+msgid "reading user-defined tables"
+msgstr "Ätu uživatelem definované tabulky"
+
+#: common.c:145
+#, c-format
+msgid "reading user-defined functions"
+msgstr "Ätu uživatelem definované funkce"
+
+#: common.c:150
+#, c-format
+msgid "reading user-defined types"
+msgstr "Ätu uživatelem definované typy"
+
+#: common.c:155
+#, c-format
+msgid "reading procedural languages"
+msgstr "Ätu procedurální jazyky"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "Ätu uživatelem definované agregátní funkce"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined operators"
+msgstr "Ätu uživatelem definované operátory"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "Ätu uživatelem definované přístupové metody"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "Ätu uživatelem definované třídy operátorů"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "Ätu uživatelem definované rodiny operátorů"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "Ätu uživatelem definované fulltextové parsery"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "Ätu uživatelem definované fulltextové Å¡ablony"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "Ätu uživatelem definované fulltextové slovníky"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "Ätu uživatelské fulltextového konfigurace"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "Ätu uživatelem definované foreign-data wrappery"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "Ätu uživatelem definované foreign servery"
+
+#: common.c:192
+#, c-format
+msgid "reading default privileges"
+msgstr "Ätu implicitní přístupová práva"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined collations"
+msgstr "Ätu uživatelem definované collations"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "Ätu uživatelem definované konverze"
+
+#: common.c:202
+#, c-format
+msgid "reading type casts"
+msgstr "Ätu pÅ™etypování"
+
+#: common.c:205
+#, c-format
+msgid "reading transforms"
+msgstr "Ätu transformace"
+
+#: common.c:208
+#, c-format
+msgid "reading table inheritance information"
+msgstr "Ätu informace dÄ›diÄnosti tabulky"
+
+#: common.c:211
+#, c-format
+msgid "reading event triggers"
+msgstr "Ätu event triggery"
+
+#: common.c:215
+#, c-format
+msgid "finding extension tables"
+msgstr "hledám tabulky pro rozšíření"
+
+#: common.c:219
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "hledám informace o dÄ›diÄnosti"
+
+#: common.c:222
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "Ätu informace o sloupcích pro tabulky"
+
+#: common.c:225
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "oznaÄuji zdÄ›dÄ›né sloupce v pod-tabulkách"
+
+#: common.c:228
+#, c-format
+msgid "reading indexes"
+msgstr "Ätu indexy"
+
+#: common.c:231
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "oznaÄuji indexy na partitionovaných tabulkách"
+
+#: common.c:234
+#, c-format
+msgid "reading extended statistics"
+msgstr "Ätu rozšířené statistiky"
+
+#: common.c:237
+#, c-format
+msgid "reading constraints"
+msgstr "Ätu omezení"
+
+#: common.c:240
+#, c-format
+msgid "reading triggers"
+msgstr "Ätu triggery"
+
+#: common.c:243
+#, c-format
+msgid "reading rewrite rules"
+msgstr "Ätu pÅ™episovací pravidla"
+
+#: common.c:246
+#, c-format
+msgid "reading policies"
+msgstr "Ätu přístupové politiky"
+
+#: common.c:249
+#, c-format
+msgid "reading publications"
+msgstr "Ätu publikace"
+
+#: common.c:252
+#, c-format
+msgid "reading publication membership"
+msgstr "Ätu Älenství v publikacích"
+
+#: common.c:255
+#, c-format
+msgid "reading subscriptions"
+msgstr "Ätu subskripce"
+
+#: common.c:1025
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "selhala kontrola, rodiÄovské OID %u tabulky \"%s\" (OID %u) nenalez"
+
+#: common.c:1067
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "nemohu zpracovat numerické pole \"%s\": příliÅ¡ mnoho Äísel"
+
+#: common.c:1082
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "nemohu zpracovat numerické pole \"%s\": neplatný znak v Äísle"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "neplatný kompresní kód: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "nezkompilováno s podporou zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "nelze inicializovat kompresní knihovnu: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "nelze uzavřít kompresní stream: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "nelze komprimovat data: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "nelze dekomprimovat data: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "nelze uzavřít kompresní knihovnu: %s"
+
+#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "nelze Äíst vstupní soubor: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:646 pg_backup_directory.c:552
+#: pg_backup_tar.c:793 pg_backup_tar.c:816
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "nelze Äíst vstupní soubor: end of file"
+
+#: parallel.c:254
+#, c-format
+msgid "WSAStartup failed: %d"
+msgstr "WSAStartup selhal: %d"
+
+#: parallel.c:964
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "nelze vytvoÅ™it komunikaÄní kanály: %m"
+
+#: parallel.c:1021
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "nelze vytvořit pracovní proces: %m"
+
+#: parallel.c:1151
+#, c-format
+msgid "unrecognized command received from master: \"%s\""
+msgstr "nerozpoznaný příkaz obdržen od mastera: %s"
+
+#: parallel.c:1194 parallel.c:1432
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "z pracovního procesu dorazila neplatná zpráva: \"%s\""
+
+#: parallel.c:1326
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"nelze získat zámek na relaci \"%s\"\n"
+"Toto obvykle znamená že nÄ›kdo si vyžádal ACCESS EXCLUSIVE zámek na tabulce poté co rodiÄovský pg_dump proces získal výchozí ACCESS SHARE zámek na dané tabulce."
+
+#: parallel.c:1415
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "pracovní proces neoÄekávanÄ› selhal"
+
+#: parallel.c:1537 parallel.c:1655
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "nelze zapsat do komunikaÄního kanálu: %m"
+
+#: parallel.c:1614
+#, c-format
+msgid "select() failed: %m"
+msgstr "select() selhalo: %m"
+
+#: parallel.c:1739
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: nelze vytvořit soket: chybový kód %d"
+
+#: parallel.c:1750
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: nelze provést bind: chybový kód %d"
+
+#: parallel.c:1757
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: nelze poslouchat: chybový kód %d"
+
+#: parallel.c:1764
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d"
+msgstr "pgpipe: getsockname() selhal: chybový kód %d"
+
+#: parallel.c:1775
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: nelze vytvořit druhý soket: chybový kód %d"
+
+#: parallel.c:1784
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: nelze se připojit k soketu: chybový kód %d"
+
+#: parallel.c:1793
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: nelze přijmout spojení: chybový kód %d"
+
+#: pg_backup_archiver.c:277 pg_backup_archiver.c:1587
+#, c-format
+msgid "could not close output file: %m"
+msgstr "nelze zavřít výstupní soubor: %m"
+
+#: pg_backup_archiver.c:321 pg_backup_archiver.c:325
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "archivované položky v nesprávném pořadí sekcí"
+
+#: pg_backup_archiver.c:331
+#, c-format
+msgid "unexpected section code %d"
+msgstr "neoÄekávaný kód sekce %d"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "paralelní obnova není pro tento formát archivu podporována"
+
+#: pg_backup_archiver.c:372
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "paralelní obnova není podporována s archivy z pre-8.0 verzí pg_dump"
+
+#: pg_backup_archiver.c:390
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "nelze obnovit z komprimovaného archivu (není nastavena podpora komprese)"
+
+#: pg_backup_archiver.c:407
+#, c-format
+msgid "connecting to database for restore"
+msgstr "navazováno spojení s databází pro obnovu"
+
+#: pg_backup_archiver.c:409
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "přímé spojení s databází nejsou podporovány v archivech před verzí 1.3"
+
+#: pg_backup_archiver.c:452
+#, c-format
+msgid "implied data-only restore"
+msgstr "předpokládána pouze obnova dat"
+
+#: pg_backup_archiver.c:518
+#, c-format
+msgid "dropping %s %s"
+msgstr "odstraňuji %s %s"
+
+#: pg_backup_archiver.c:613
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "nelze zjistit kam přidat IF EXISTS v příkazu \"%s\""
+
+#: pg_backup_archiver.c:769 pg_backup_archiver.c:771
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "varování z originálního dump souboru: %s"
+
+#: pg_backup_archiver.c:786
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "vytvářím %s \"%s.%s\""
+
+#: pg_backup_archiver.c:789
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "vytvářím %s \"%s\""
+
+#: pg_backup_archiver.c:839
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "připojuji se k nové databázi \"%s\""
+
+#: pg_backup_archiver.c:866
+#, c-format
+msgid "processing %s"
+msgstr "zpracovávám %s"
+
+#: pg_backup_archiver.c:886
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "zpracovávám data pro tabulku \"%s.%s\""
+
+#: pg_backup_archiver.c:948
+#, c-format
+msgid "executing %s %s"
+msgstr "vykonávám %s %s"
+
+#: pg_backup_archiver.c:987
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "vypínám triggery pro %s"
+
+#: pg_backup_archiver.c:1013
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "zapínám triggery pro %s"
+
+#: pg_backup_archiver.c:1041
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "interní chyba -- WriteData není možno volat mimo kontext rutiny DataDumper"
+
+#: pg_backup_archiver.c:1224
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "\"large object\" výstup není podporován ve vybraném formátu"
+
+#: pg_backup_archiver.c:1282
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "obnoven %d large objekt"
+msgstr[1] "obnoveny %d large objekty"
+msgstr[2] "obnoveny %d large objektů"
+
+#: pg_backup_archiver.c:1303 pg_backup_tar.c:736
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "obnovován \"large object\" s OID %u"
+
+#: pg_backup_archiver.c:1315
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "nelze vytvořit \"large object\" %u: %s"
+
+#: pg_backup_archiver.c:1320 pg_dump.c:3555
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "nelze otevřít \"large object\" %u:%s"
+
+#: pg_backup_archiver.c:1377
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "nelze otevřít TOC soubor \"%s\": %m"
+
+#: pg_backup_archiver.c:1417
+#, c-format
+msgid "line ignored: %s"
+msgstr "řádka ignorována: %s"
+
+#: pg_backup_archiver.c:1424
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "nelze najít záznam ID %d"
+
+#: pg_backup_archiver.c:1445 pg_backup_directory.c:222
+#: pg_backup_directory.c:598
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "nelze zavřít TOC soubor: %m"
+
+#: pg_backup_archiver.c:1559 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:585 pg_backup_directory.c:648
+#: pg_backup_directory.c:667 pg_dumpall.c:484
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "nelze otevřít výstupní soubor \"%s\": %m"
+
+#: pg_backup_archiver.c:1561 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "nelze otevřít výstupní soubor: %m"
+
+#: pg_backup_archiver.c:1654
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)"
+msgstr[0] "zapsán %lu byte dat large objektů (result = %lu)"
+msgstr[1] "zapsán %lu byty dat large objektů (result = %lu)"
+msgstr[2] "zapsán %lu bytů dat large objektů (result = %lu)"
+
+#: pg_backup_archiver.c:1659
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)"
+msgstr "nelze zapsat \"large object\" (výsledek = %lu, oÄekáváno: %lu)"
+
+#: pg_backup_archiver.c:1749
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "během INICIALIZACE:"
+
+#: pg_backup_archiver.c:1754
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "bÄ›hem ZPRACOVÃNà TOC:"
+
+#: pg_backup_archiver.c:1759
+#, c-format
+msgid "while FINALIZING:"
+msgstr "během FINALIZACE:"
+
+#: pg_backup_archiver.c:1764
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "z TOC záznamu %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1840
+#, c-format
+msgid "bad dumpId"
+msgstr "neplatné dumpId"
+
+#: pg_backup_archiver.c:1861
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "špatné dumpId tabulky pro TABLE DATA položku"
+
+#: pg_backup_archiver.c:1953
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "neoÄekávaný příznak datového offsetu %d"
+
+#: pg_backup_archiver.c:1966
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "offset souboru v dumpu je příliš velký"
+
+#: pg_backup_archiver.c:2103 pg_backup_archiver.c:2113
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "jméno adresáře je příliš dlouhé: \"%s\""
+
+#: pg_backup_archiver.c:2121
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "adresář \"%s\" zřejmě není platným archivem (\"toc.dat\" neexistuje)"
+
+#: pg_backup_archiver.c:2129 pg_backup_custom.c:173 pg_backup_custom.c:812
+#: pg_backup_directory.c:207 pg_backup_directory.c:394
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "nelze otevřít vstupní soubor \"%s\": %m"
+
+#: pg_backup_archiver.c:2136 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "nelze otevřít vstupní soubor: %m"
+
+#: pg_backup_archiver.c:2142
+#, c-format
+msgid "could not read input file: %m"
+msgstr "nelze Äíst vstupní soubor: %m"
+
+#: pg_backup_archiver.c:2144
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "vstupní soubor je příliÅ¡ krátký (Äteno %lu, oÄekáváno 5)"
+
+#: pg_backup_archiver.c:2229
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "vstupní soubor se zdá být dump v textovém formátu. Použijte prosím psql."
+
+#: pg_backup_archiver.c:2235
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "vstupní soubor se nezdá být korektním archivem (příliš krátký?)"
+
+#: pg_backup_archiver.c:2241
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "vstupní soubor se nezdá být korektním archivem"
+
+#: pg_backup_archiver.c:2261
+#, c-format
+msgid "could not close input file: %m"
+msgstr "nelze zavřít výstupní soubor: %m"
+
+#: pg_backup_archiver.c:2373
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "neznámý formát souboru \"%d\""
+
+#: pg_backup_archiver.c:2455 pg_backup_archiver.c:4458
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "dokonÄena položka %d %s %s"
+
+#: pg_backup_archiver.c:2459 pg_backup_archiver.c:4471
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "worker proces selhal: exit kód %d"
+
+#: pg_backup_archiver.c:2579
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID záznamu %d je mimo rozsah -- možná je poškozena TOC"
+
+#: pg_backup_archiver.c:2646
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "obnova tabulek s volbou WITH OIDS již není podporována"
+
+#: pg_backup_archiver.c:2728
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "neplatné kódování \"%s\""
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "chybná položka ENCODING: %s"
+
+#: pg_backup_archiver.c:2751
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "chybná položka STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2776
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schéma \"%s\" nenalezeno"
+
+#: pg_backup_archiver.c:2783
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabulka \"%s\" nenalezena"
+
+#: pg_backup_archiver.c:2790
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "index \"%s\" nenalezen"
+
+#: pg_backup_archiver.c:2797
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "funkce \"%s\" nenalezena"
+
+#: pg_backup_archiver.c:2804
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger \"%s\" nenalezen"
+
+#: pg_backup_archiver.c:3196
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "nelze nastavit uživatele session na \"%s\": %s"
+
+#: pg_backup_archiver.c:3328
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "nelze nastavit search_path na \"%s\": %s"
+
+#: pg_backup_archiver.c:3390
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "nelze nastavit default_tablespace na %s: %s"
+
+#: pg_backup_archiver.c:3435
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "nelze nastavit default_table_access_method na: %s"
+
+#: pg_backup_archiver.c:3527 pg_backup_archiver.c:3685
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "nevím jak nastavit vlastníka pro typ objektu \"%s\""
+
+#: pg_backup_archiver.c:3789
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "nelze najít identifikaÄní Å™etÄ›zec v hlaviÄce souboru"
+
+#: pg_backup_archiver.c:3802
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "nepodporovaná verze (%d.%d) v hlaviÄce souboru"
+
+#: pg_backup_archiver.c:3807
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "kontrola velikosti integeru (%lu) selhala"
+
+#: pg_backup_archiver.c:3811
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "archiv byl vytvoÅ™en na stroji s vÄ›tšími celými Äísly (integer), nÄ›které operace mohou selhat"
+
+#: pg_backup_archiver.c:3821
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "oÄekávaný formát (%d) se liší se od formátu nalezeného v souboru (%d)"
+
+#: pg_backup_archiver.c:3837
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "archiv je komprimován, ale tato instalace nepodporuje kompresi -- data nebudou dostupná"
+
+#: pg_backup_archiver.c:3855
+#, c-format
+msgid "invalid creation date in header"
+msgstr "v hlaviÄce je neplatné datum vytvoÅ™ení"
+
+#: pg_backup_archiver.c:3983
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "zpracovávám položku %d %s %s"
+
+#: pg_backup_archiver.c:4062
+#, c-format
+msgid "entering main parallel loop"
+msgstr "vstupuji do hlavní paralelní smyÄky"
+
+#: pg_backup_archiver.c:4073
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "přeskakuji položku %d %s %s"
+
+#: pg_backup_archiver.c:4082
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "spouštím položku %d %s %s"
+
+#: pg_backup_archiver.c:4136
+#, c-format
+msgid "finished main parallel loop"
+msgstr "ukonÄuji hlavní paralelní smyÄku"
+
+#: pg_backup_archiver.c:4172
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "zpracování vynechalo položku %d %s %s"
+
+#: pg_backup_archiver.c:4777
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "tabulku \"%s\" nelze vytvořit, její data nebudou obnovena"
+
+#: pg_backup_custom.c:378 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "neplatné OID pro \"large object\""
+
+#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:632
+#: pg_backup_custom.c:870 pg_backup_tar.c:1086 pg_backup_tar.c:1091
+#, c-format
+msgid "error during file seek: %m"
+msgstr "chyba během posunu v souboru: %m"
+
+#: pg_backup_custom.c:480
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "datový blok %d má chybnou seek pozici"
+
+#: pg_backup_custom.c:497
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "nepřípustný typ datového bloku (%d) během prohledávání archivu"
+
+#: pg_backup_custom.c:519
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "v archivu nelze najít blok ID %d -- možná kvůli out-of-order restore požadavku, který nemohl být vyřízen kvůli non-seekable vstupnímu souboru"
+
+#: pg_backup_custom.c:524
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "v archivu nelze najít blok ID %d -- archiv může být poškozen"
+
+#: pg_backup_custom.c:531
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "nalezeno neoÄekávané ID bloku (%d) pÅ™i Ätení dat - oÄekáváno %d"
+
+#: pg_backup_custom.c:545
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "nepřípustný typ datového bloku %d během obnovení archivu"
+
+#: pg_backup_custom.c:648
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "nelze Äíst vstupní soubor: %m"
+
+#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:948
+#: pg_backup_tar.c:1089
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "nelze urÄit seek pozici v archivním souboru: %m"
+
+#: pg_backup_custom.c:767 pg_backup_custom.c:807
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "nelze uzavřít archivní soubor: %m"
+
+#: pg_backup_custom.c:790
+#, c-format
+msgid "can only reopen input archives"
+msgstr "vstupní archivy lze pouze znovu otevřít"
+
+#: pg_backup_custom.c:797
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "paralelní obnova ze standardního vstupnu není podporována"
+
+#: pg_backup_custom.c:799
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "paralelní obnova z neseekovatelného souboru není podporována"
+
+#: pg_backup_custom.c:815
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "nelze nastavit seek pozici v archivním souboru: %m"
+
+#: pg_backup_custom.c:894
+#, c-format
+msgid "compressor active"
+msgstr "compressor aktivní"
+
+#: pg_backup_db.c:41
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "nelze získat server_version z libpq"
+
+#: pg_backup_db.c:52 pg_dumpall.c:1826
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "verze serveru: %s; %s verze: %s"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1828
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "konÄím kvůli rozdílnosti verzí serverů"
+
+#: pg_backup_db.c:124
+#, c-format
+msgid "already connected to a database"
+msgstr "spojení s databází již existuje"
+
+#: pg_backup_db.c:133 pg_backup_db.c:185 pg_dumpall.c:1651 pg_dumpall.c:1764
+msgid "Password: "
+msgstr "Heslo: "
+
+#: pg_backup_db.c:177
+#, c-format
+msgid "could not connect to database"
+msgstr "nelze znovu navázat spojení s databází"
+
+#: pg_backup_db.c:195
+#, c-format
+msgid "reconnection to database \"%s\" failed: %s"
+msgstr "připojení k databázi \"%s\" selhalo: %s"
+
+#: pg_backup_db.c:199
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "spojení s databází \"%s\" selhalo: %s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1684
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:279 pg_dumpall.c:1889 pg_dumpall.c:1912
+#, c-format
+msgid "query failed: %s"
+msgstr "dotaz selhal: %s"
+
+#: pg_backup_db.c:281 pg_dumpall.c:1890 pg_dumpall.c:1913
+#, c-format
+msgid "query was: %s"
+msgstr "dotaz byl: %s"
+
+#: pg_backup_db.c:322
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "dotaz vrátil %d řádku namísto jedné: %s"
+msgstr[1] "dotaz vrátil %d řádky namísto jedné: %s"
+msgstr[2] "dotaz vrátil %d řádek namísto jedné: %s"
+
+#: pg_backup_db.c:358
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sPříkaz byl: %s"
+
+#: pg_backup_db.c:414 pg_backup_db.c:488 pg_backup_db.c:495
+msgid "could not execute query"
+msgstr "nelze provést dotaz"
+
+#: pg_backup_db.c:467
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "chyba vrácená voláním PQputCopyData: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "chyba vrícená voláním PQputCopyEnd: %s"
+
+#: pg_backup_db.c:522
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY selhal pro tabulku \"%s\": %s"
+
+#: pg_backup_db.c:528 pg_dump.c:1991
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "neoÄekávané další výsledky bÄ›hem COPY tabulky \"%s\""
+
+#: pg_backup_db.c:586
+#, c-format
+msgid "LOCK TABLE failed for \"%s\": %s"
+msgstr "LOCK TABLE selhal pro \"%s\": %s"
+
+#: pg_backup_db.c:604
+msgid "could not start database transaction"
+msgstr "nelze spustit databázovou transakci"
+
+#: pg_backup_db.c:612
+msgid "could not commit database transaction"
+msgstr "nelze provést commit transakce"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "nezadán žádný výstupní adresář"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze naÄíst adresář \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "nelze zavřít adresář \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "nelze vytvořit adresář \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:496
+#: pg_backup_directory.c:532
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "nelze zapsat do výstupního souboru: %s"
+
+#: pg_backup_directory.c:406
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "nelze uzavřít datový soubor \"%s\": %m"
+
+#: pg_backup_directory.c:446
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "nelze otevřít TOC soubor pro large objekty \"%s\" pro vstup: %m"
+
+#: pg_backup_directory.c:457
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "neplatný řádek v TOC souboru pro large objekty \"%s\" : \"%s\""
+
+#: pg_backup_directory.c:466
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "chyba pÅ™i Ätení TOC souboru pro large objekty \"%s\""
+
+#: pg_backup_directory.c:470
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "nelze uzavřít TOC soubor pro large objekty \"%s\": %m"
+
+#: pg_backup_directory.c:689
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "nelze zapsat do TOC souboru pro bloby"
+
+#: pg_backup_directory.c:721
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "jméno souboru je příliš dlouhé: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "tento formát nelze Äíst"
+
+#: pg_backup_tar.c:177
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "nelze otevřít TOC soubor \"%s\" pro výstup: %m"
+
+#: pg_backup_tar.c:184
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "nelze otevřít TOC soubor pro výstup: %m"
+
+#: pg_backup_tar.c:203 pg_backup_tar.c:358
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "komprese není podporována v archivním formátu tar"
+
+#: pg_backup_tar.c:211
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "nelze otevřít TOC soubor \"%s\" pro vstup: %m"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "nelze otevřít TOC soubor pro vstup: %m"
+
+#: pg_backup_tar.c:344
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "v archivu nelze najít soubor \"%s\""
+
+#: pg_backup_tar.c:410
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "nelze vygenerovat jméno doÄasného souboru: %m"
+
+#: pg_backup_tar.c:421
+#, c-format
+msgid "could not open temporary file"
+msgstr "nelze otevřít doÄasný soubor"
+
+#: pg_backup_tar.c:448
+#, c-format
+msgid "could not close tar member"
+msgstr "nelze zavřít tar položku"
+
+#: pg_backup_tar.c:691
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "neoÄekávaná syntaxe příkazu COPY: \"%s\""
+
+#: pg_backup_tar.c:958
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "neplatné OID pro \"large object\" (%u)"
+
+#: pg_backup_tar.c:1105
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "nelze otevřít doÄasný soubor: %m"
+
+#: pg_backup_tar.c:1114
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)"
+msgstr "skuteÄná délka souboru (%s) neodpovídá oÄekávané (%s)"
+
+#: pg_backup_tar.c:1171 pg_backup_tar.c:1201
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "nelze najít hlaviÄku pro soubor %s v tar archivu"
+
+#: pg_backup_tar.c:1189
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "obnova dat mimo pořadí není podporována v tomto formátu archivu: \"%s\" je vyžadován, ale v archivu předchází \"%s\"."
+
+#: pg_backup_tar.c:1234
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "nalezena nekompletní tar hlaviÄka (%lu byte)"
+msgstr[1] "nalezena nekompletní tar hlaviÄka (%lu byty)"
+msgstr[2] "nalezena nekompletní tar hlaviÄka (%lu bytů)"
+
+#: pg_backup_tar.c:1285
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s"
+msgstr "nalezena poÅ¡kozená tar hlaviÄka v %s (oÄekáváno %d, vypoÄteno %d) pozice souboru %s"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "neznámý název sekce \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:607 pg_dump.c:624 pg_dumpall.c:338
+#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374
+#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300
+#: pg_restore.c:318
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_backup_utils.c:68
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "vyÄerpány dostupné on_exit_nicely sloty"
+
+#: pg_dump.c:533
+#, c-format
+msgid "compression level must be in range 0..9"
+msgstr "úroveň komprese musí být v rozsahu 0..9"
+
+#: pg_dump.c:571
+#, c-format
+msgid "extra_float_digits must be in range -15..3"
+msgstr "extra_float_digits musí být v intervalu -15..3"
+
+#: pg_dump.c:594
+#, c-format
+msgid "rows-per-insert must be in range %d..%d"
+msgstr "poÄet řádek na insert musí být v rozsahu %d..%d"
+
+#: pg_dump.c:622 pg_dumpall.c:346 pg_restore.c:298
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_dump.c:643 pg_restore.c:327
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "volby -s/--schema-only a -a/--data-only nelze používat spoleÄnÄ›"
+
+#: pg_dump.c:648
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "volby -s/--schema-only a --include-foreign-data nelze používat spoleÄnÄ›"
+
+#: pg_dump.c:651
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "volba --include-foreign-data není podporována pro paralelní backupy"
+
+#: pg_dump.c:655 pg_restore.c:333
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "volby -c/--clean a -a/--data-only nelze používat spoleÄnÄ›"
+
+#: pg_dump.c:660 pg_dumpall.c:381 pg_restore.c:382
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "volba --if-exists vyžaduje volbu -c/--clean"
+
+#: pg_dump.c:667
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "volba --on-conflict-do-nothing vyžaduje volbu --inserts, --rows-per-insert, nebo --column-inserts"
+
+#: pg_dump.c:689
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "požadovaná komprese není v této instalaci dostupná -- archiv bude nekomprimovaný"
+
+#: pg_dump.c:710 pg_restore.c:349
+#, c-format
+msgid "invalid number of parallel jobs"
+msgstr "neplatný poÄet paralelních jobů"
+
+#: pg_dump.c:714
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "paralelní záloha je podporována pouze directory formátem"
+
+#: pg_dump.c:769
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Synchronizované snapshoty nejsou na této verzi serveru podporovány.\n"
+"Pokud nepotÅ™ebujete synchronizované snapshoty, použijte pÅ™epínaÄ\n"
+"--no-synchronized-snapshots."
+
+#: pg_dump.c:775
+#, c-format
+msgid "Exported snapshots are not supported by this server version."
+msgstr "Exportované snapshoty nejsou touto verzí serveru podporovány."
+
+#: pg_dump.c:787
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "poslední vestavěné OID je %u"
+
+#: pg_dump.c:796
+#, c-format
+msgid "no matching schemas were found"
+msgstr "nebyla nalezena žádná odovídající schémata"
+
+#: pg_dump.c:810
+#, c-format
+msgid "no matching tables were found"
+msgstr "nebyla nalezena žádná odpovídající tabulka"
+
+#: pg_dump.c:990
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s vytvoří dump databáze jako textový soubor nebo v jiném formátu.\n"
+"\n"
+
+#: pg_dump.c:991 pg_dumpall.c:617 pg_restore.c:462
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [DATABÃZE]\n"
+
+#: pg_dump.c:994 pg_dumpall.c:620 pg_restore.c:465
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Obecné volby:\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=SOUBOR výstupní soubor nebo adresář\n"
+
+#: pg_dump.c:996
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p formát výstupního soubor (custom, directory, tar,\n"
+" plain text (výchozí))\n"
+
+#: pg_dump.c:998
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM použij tento poÄet paralelních jobů pro zálohu\n"
+
+#: pg_dump.c:999 pg_dumpall.c:622
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: pg_dump.c:1000 pg_dumpall.c:623
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version zobraz informaci o verzi, poté skonÄi\n"
+
+#: pg_dump.c:1001
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 úroveň komprese při použití komprimovaného formátu\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:624
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT selže po uplynutí TIMEOUT Äekáním na zámek tabulky\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:651
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync neÄekat než budou zmÄ›ny bezpeÄnÄ› zapsány na disk\n"
+
+#: pg_dump.c:1004 pg_dumpall.c:625
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobraz tuto nápovÄ›du, poté skonÄi\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:626
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe ovlivňující výstup:\n"
+
+#: pg_dump.c:1007 pg_dumpall.c:627
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only dump pouze dat bez definic databázových objektů\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs zahrnout \"large objects\" do dumpu\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs nezahrnovat \"large objects\" do dumpu\n"
+
+#: pg_dump.c:1010 pg_restore.c:476
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create zahrnout příkazy pro vytvoření databáze do dumpu\n"
+
+#: pg_dump.c:1012 pg_dumpall.c:629
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KÓDOVÃNà kódování znaků databáze\n"
+
+#: pg_dump.c:1013
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr ""
+" -n, --schema=PATTERN vytvořit dump pouze specifikovaného schématu\n"
+"\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN nedumpuj uvedená schéma(ta)\n\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner nevypisovat příkazy pro nastavení vlastníka objektu\n"
+" v ÄistÄ› textovém formátu\n"
+
+#: pg_dump.c:1017 pg_dumpall.c:633
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr ""
+" -s, --schema-only dump pouze definic databázových objektů\n"
+" (tabulek apod.) bez dat\n"
+
+#: pg_dump.c:1018
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=JMÉNO uživatelské jméno superuživatele použité při dumpu\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr ""
+" -t, --table=PATTERN provést dump pouze uvedené tabulky\n"
+"\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr ""
+" -T, --exclude-table=PATTERN neprováděj dump uvedených tabulek\n"
+"\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:636
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges neprovádět dump přístupových práv (grant/revoke)\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:637
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade pouze pro použití upgradovacími nástroji\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:638
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts použije pro dump dat příkaz INSERT se jmény sloupců\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:639
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting nepoužívat znak dolaru místo uvozovek, používat\n"
+" standardní SQL uvozování\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:640 pg_restore.c:493
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers zakázat volání triggerů během obnovy dat\n"
+
+#: pg_dump.c:1026
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security povolit row security (vypíše pouze data ke kterým má\n"
+" uživatel přístup)\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=VZOR nedumpuj data pro zadané tabulky\n\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:642
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM přenastav výchozí nastavení pro extra_float_digits\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:643 pg_restore.c:495
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists použít IF EXISTS při mazání objektů\n"
+
+#: pg_dump.c:1031
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" zahrne data z foreign tabulek náležících k foreign\n"
+" serverům odpovídajícím PATTERN\n"
+
+#: pg_dump.c:1034 pg_dumpall.c:644
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts použít pro dump dat příkazy INSERT místo COPY\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:645
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root data do partition tabulek naÄítat pÅ™es root tabulku\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:646
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments neprovádět dump komentářů\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:647
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications neprovádět dump publikací\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:649
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels neprovádÄ›t dump bezpeÄnostních Å¡títků\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:650
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions neprovádět dump subsckripcí\n"
+
+#: pg_dump.c:1040
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots nepoužívat synchronizované snapshoty v paralelních jobech\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:652
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces neprovádět dump přiřazení tablespaces\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:653
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data nedumpuj data unlogged tabulek\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:654
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing přidej ON CONFLICT DO NOTHING do INSERT příkazů\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:655
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers vÅ¡echny identifikátory uveÄ v uvozovkách, i když se nejedná o klíÄová slova\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:656
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS poÄet řádek per INSERT; implikuje --inserts\n"
+
+#: pg_dump.c:1046
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION dump pojmenované sekce (pre-data, data, nebo post-data)\n"
+
+#: pg_dump.c:1047
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable poÄkej než bude možné provést dump bez anomálií\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT pro dump použít zadaný snapshot\n"
+
+#: pg_dump.c:1049 pg_restore.c:504
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names vyžadovat aby každý vzor pro zahrnutí tabulek a/nebo schémat\n"
+" odpovídal alespoň jednomu objektu\n"
+
+#: pg_dump.c:1051 pg_dumpall.c:657 pg_restore.c:506
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" používat příkaz SET SESSION AUTHORIZATION namísto\n"
+" příkazu ALTER OWNER pro nastavení vlastníka\n"
+
+#: pg_dump.c:1055 pg_dumpall.c:661 pg_restore.c:510
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Volby spojení:\n"
+
+#: pg_dump.c:1056
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=JMÉNO jméno zdrojové databáze\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:663 pg_restore.c:511
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host databázového serveru nebo adresář se sockety\n"
+
+#: pg_dump.c:1058 pg_dumpall.c:665 pg_restore.c:512
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:666 pg_restore.c:513
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=JMÉNO připoj se jako uvedený uživatel\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:667 pg_restore.c:514
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nikdy se neptej na heslo\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:668 pg_restore.c:515
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password zeptej se na heslo (mělo by se dít automaticky)\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:669
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME pÅ™ed dumpem proveÄ SET ROLE\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li specifikováno jméno databáze, použije se proměnná prostředí\n"
+"PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:673 pg_restore.c:522
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: pg_dump.c:1067 pg_dumpall.c:674 pg_restore.c:523
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_dump.c:1086 pg_dumpall.c:499
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "specifikováno neplatné klientské kódování \"%s\""
+
+#: pg_dump.c:1235
+#, c-format
+msgid ""
+"Synchronized snapshots on standby servers are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Synchronizované snapshoty nejsou na této verzi serveru podporovány.\n"
+"Pokud nepotÅ™ebujete synchronizované snapshoty, použijte pÅ™epínaÄ\n"
+"--no-synchronized-snapshots."
+
+#: pg_dump.c:1304
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "specifikován neplatný formát \"%s\" výstupu"
+
+#: pg_dump.c:1342
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "nebyla nalezena žádná schémata odpovídající vzoru \"%s\""
+
+#: pg_dump.c:1389
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "nebyly nalezeny žádné foreign servery odpovídající vzoru \"%s\""
+
+#: pg_dump.c:1452
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "nebyla nalezena žádná tabulka odpovídající vzoru \"%s\""
+
+#: pg_dump.c:1865
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "dumpuji obsah tabulky \"%s.%s\""
+
+#: pg_dump.c:1972
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Dumpování obsahu tabulky \"%s\" selhalo: volání PQgetCopyData() selhalo."
+
+#: pg_dump.c:1973 pg_dump.c:1983
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Chybová zpráva ze serveru: %s"
+
+#: pg_dump.c:1974 pg_dump.c:1984
+#, c-format
+msgid "The command was: %s"
+msgstr "Příkaz byl: %s"
+
+#: pg_dump.c:1982
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Dumpování obsahu tabulky \"%s\" selhalo: volání PQgetResult() selhalo."
+
+#: pg_dump.c:2742
+#, c-format
+msgid "saving database definition"
+msgstr "ukládám definice databáze"
+
+#: pg_dump.c:3214
+#, c-format
+msgid "saving encoding = %s"
+msgstr "ukládám kódování znaků = %s"
+
+#: pg_dump.c:3239
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "ukládám standard_conforming_strings = %s"
+
+#: pg_dump.c:3278
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "nelze zpracovat výsledek current_schemas()"
+
+#: pg_dump.c:3297
+#, c-format
+msgid "saving search_path = %s"
+msgstr "ukládám search_path = %s"
+
+#: pg_dump.c:3337
+#, c-format
+msgid "reading large objects"
+msgstr "Ätu \"large objects\""
+
+#: pg_dump.c:3519
+#, c-format
+msgid "saving large objects"
+msgstr "ukládám \"large objects\""
+
+#: pg_dump.c:3565
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "chyba pÅ™i Ätení large objektu %u: %s"
+
+#: pg_dump.c:3617
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\""
+msgstr "Ätu row security enabled pro tabulku \"%s.%s\""
+
+#: pg_dump.c:3648
+#, c-format
+msgid "reading policies for table \"%s.%s\""
+msgstr "Ätu policies pro tablku \"%s.%s\""
+
+#: pg_dump.c:3800
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "neoÄekáváný typ policy příkazu: %c"
+
+#: pg_dump.c:3951
+#, c-format
+msgid "owner of publication \"%s\" appears to be invalid"
+msgstr "vlastník publikace \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:4096
+#, c-format
+msgid "reading publication membership for table \"%s.%s\""
+msgstr "Ätu Älenství v publikacích pro tabulku \"%s.%s\""
+
+#: pg_dump.c:4239
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "subscriptions nejsou zahrnuty do dumpu protože aktuální uživatel není superuživatl"
+
+#: pg_dump.c:4293
+#, c-format
+msgid "owner of subscription \"%s\" appears to be invalid"
+msgstr "vlastník subskripce \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:4337
+#, c-format
+msgid "could not parse subpublications array"
+msgstr "nelze naparsovat pole \"subpublications\""
+
+#: pg_dump.c:4659
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "nelze najít nadřízené rozšíření pro %s %s"
+
+#: pg_dump.c:4791
+#, c-format
+msgid "owner of schema \"%s\" appears to be invalid"
+msgstr "vlastník schématu \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:4814
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "schéma s OID %u neexistuje"
+
+#: pg_dump.c:5139
+#, c-format
+msgid "owner of data type \"%s\" appears to be invalid"
+msgstr "vlastník datového typu \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5224
+#, c-format
+msgid "owner of operator \"%s\" appears to be invalid"
+msgstr "vlastník operátoru \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5526
+#, c-format
+msgid "owner of operator class \"%s\" appears to be invalid"
+msgstr "vlastník třídy operátorů \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5610
+#, c-format
+msgid "owner of operator family \"%s\" appears to be invalid"
+msgstr "vlastník rodiny operátorů \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:5779
+#, c-format
+msgid "owner of aggregate function \"%s\" appears to be invalid"
+msgstr "vlastník agregaÄní funkce \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:6039
+#, c-format
+msgid "owner of function \"%s\" appears to be invalid"
+msgstr "vlastník funkce \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:6867
+#, c-format
+msgid "owner of table \"%s\" appears to be invalid"
+msgstr "vlastník tabulky \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:6909 pg_dump.c:17389
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "selhala kontrola, OID %u rodiÄovské tabulky u sekvence s OID %u nelze najít"
+
+#: pg_dump.c:7051
+#, c-format
+msgid "reading indexes for table \"%s.%s\""
+msgstr "Ätu indexy pro tabulku \"%s.%s\""
+
+#: pg_dump.c:7466
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\""
+msgstr "Ätu cizí klíÄe pro tabulku \"%s.%s\""
+
+#: pg_dump.c:7747
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "selhala kontrola, OID %u rodiÄovské tabulky u pg_rewrite položky OID %u nelze najít"
+
+#: pg_dump.c:7830
+#, c-format
+msgid "reading triggers for table \"%s.%s\""
+msgstr "Ätu triggery pro tabulku \"%s.%s\""
+
+#: pg_dump.c:7963
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "dotaz vrátil prázdné jméno referencované tabulky pro trigger \"%s\" cizího klíÄe pro tabulku \"%s\" (OID tabulky: %u)"
+
+#: pg_dump.c:8518
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\""
+msgstr "hledám sloupce a typy pro tabulku \"%s.%s\""
+
+#: pg_dump.c:8654
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "neplatné Äíslování sloupců v tabulce \"%s\""
+
+#: pg_dump.c:8691
+#, c-format
+msgid "finding default expressions of table \"%s.%s\""
+msgstr "hledám DEFAULT výrazy pro tabulku \"%s.%s\""
+
+#: pg_dump.c:8713
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "neplatná \"adnum\" hodnota %d pro tabulku \"%s\""
+
+#: pg_dump.c:8778
+#, c-format
+msgid "finding check constraints for table \"%s.%s\""
+msgstr "hledám CHECK omezení pro tabulku \"%s.%s\""
+
+#: pg_dump.c:8827
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "oÄekáván %d check constraint na tabulce \"%s\" nalezeno %d"
+msgstr[1] "oÄekávány %d check constrainty na tabulce \"%s\" nalezeno %d"
+msgstr[2] "oÄekáváno %d check constraintů na tabulce \"%s\" nalezeno %d"
+
+#: pg_dump.c:8831
+#, c-format
+msgid "(The system catalogs might be corrupted.)"
+msgstr "(Systémové katalogy mohou být poškozeny.)"
+
+#: pg_dump.c:10417
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype datového typu \"%s\" se zdá být neplatný"
+
+#: pg_dump.c:11771
+#, c-format
+msgid "bogus value in proargmodes array"
+msgstr "nesmyslná hodnota v \"proargmodes\" poli"
+
+#: pg_dump.c:12143
+#, c-format
+msgid "could not parse proallargtypes array"
+msgstr "nelze naparsovat pole \"proallargtypes\""
+
+#: pg_dump.c:12159
+#, c-format
+msgid "could not parse proargmodes array"
+msgstr "nelze naparsovat pole \"proargmodes\""
+
+#: pg_dump.c:12173
+#, c-format
+msgid "could not parse proargnames array"
+msgstr "nelze naparsovat pole \"proargnames\""
+
+#: pg_dump.c:12184
+#, c-format
+msgid "could not parse proconfig array"
+msgstr "nelze naparsovat pole \"proconfig\""
+
+#: pg_dump.c:12264
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "nerozpoznaná \"provolatile\" hodnota pro funkci \"%s\""
+
+#: pg_dump.c:12314 pg_dump.c:14372
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "nerozpoznaná proparallel\" hodnota pro funkci \"%s\""
+
+#: pg_dump.c:12453 pg_dump.c:12562 pg_dump.c:12569
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "nelze najít definici pro funkci ID %u"
+
+#: pg_dump.c:12492
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "chybná hodnota v položce pg_cast.castfunc nebo pg_cast.castmethod"
+
+#: pg_dump.c:12495
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "nesmyslná hodnota v položce \"pg_cast.castmethod\""
+
+#: pg_dump.c:12588
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "chybná definice transformace, alespoň jedno z trffromsql a trftosql by mělo být nenulové"
+
+#: pg_dump.c:12605
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "nesmyslná hodnota v položce pg_transform.trffromsql"
+
+#: pg_dump.c:12626
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "nesmyslná hodnota v položce pg_transform.trftosql"
+
+#: pg_dump.c:12942
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "nelze najít operátor s OID %s"
+
+#: pg_dump.c:13010
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "neplatný typ \"%c\" access metody \"%s\""
+
+#: pg_dump.c:13764
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "neoÄekávaný poskytovatel collation: %s"
+
+#: pg_dump.c:14236
+#, c-format
+msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+msgstr "agregaÄní funkci %s nelze dumpovat korektnÄ› pro tuto verzi databáze; ignorováno"
+
+#: pg_dump.c:14291
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "neznámá aggfinalmodify hodnota for agregaÄní funkci \"%s\""
+
+#: pg_dump.c:14347
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "neznámá aggmfinalmodify hodnota for agregaÄní funkci \"%s\""
+
+#: pg_dump.c:15069
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "neznámý typ objektu (%d) ve výchozích privilegiích"
+
+#: pg_dump.c:15087
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "nelze zpracovat seznam oprávnění ACL (%s)"
+
+#: pg_dump.c:15172
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "nelze zpracovat výchozí GRANT ACL seznam (%s) nebo výchozí REVOKE ACL seznam (%s) pro objekt \"%s\" (%s)"
+
+#: pg_dump.c:15180
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "nelze zpracovat GRANT ACL seznam (%s) nebo REVOKE ACL seznam (%s) pro objekt \"%s\" (%s)"
+
+#: pg_dump.c:15695
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "dotaz na získání definice view \"%s\" nevrátil žádná data"
+
+#: pg_dump.c:15698
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "dotaz na získání definice view \"%s\" vrátil více jak jednu definici"
+
+#: pg_dump.c:15705
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "definice view \"%s\" se zdá být prázdná (nulová délka)"
+
+#: pg_dump.c:15789
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS již není podporováno (tabulka \"%s\")"
+
+#: pg_dump.c:16269
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "neplatný poÄet rodiÄů %d pro tabulku \"%s\""
+
+#: pg_dump.c:16592
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "neplatné Äíslo sloupce %d pro tabulku \"%s\""
+
+#: pg_dump.c:16877
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "chybí index pro omezení \"%s\""
+
+#: pg_dump.c:17102
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "neoÄekávaný typ omezení: %c"
+
+#: pg_dump.c:17234 pg_dump.c:17454
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "dotaz pro naÄtení dat sekvence \"%s\" vrátil %d řádek (expected 1)"
+msgstr[1] "dotaz pro naÄtení dat sekvence \"%s\" vrátil %d řádky (expected 1)"
+msgstr[2] "dotaz pro naÄtení dat sekvence \"%s\" vrátil %d řádek (expected 1)"
+
+#: pg_dump.c:17268
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "neoÄekávaný typ sekvence: %s"
+
+#: pg_dump.c:17552
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "neoÄekávaná hodnota tgtype: %d"
+
+#: pg_dump.c:17626
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "neplatný řetězec argumentů (%s) pro trigger \"%s\" tabulky \"%s\""
+
+#: pg_dump.c:17862
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "dotaz k získání pravidla (RULE) \"%s\" pro tabulku \"%s\" selhal: vrácen chybný poÄet řádků"
+
+#: pg_dump.c:18024
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "nelze najít odkazované rozšíření %u"
+
+#: pg_dump.c:18236
+#, c-format
+msgid "reading dependency data"
+msgstr "Ätu data o závislostech"
+
+#: pg_dump.c:18329
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "žádný odkazující objekt %u: %u"
+
+#: pg_dump.c:18340
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "žádný odkazovaný objekt %u: %u"
+
+#: pg_dump.c:18713
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "nelze naparsovat pole \"reloptions\""
+
+#: pg_dump_sort.c:360
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "neplatné dumpId %d"
+
+#: pg_dump_sort.c:366
+#, c-format
+msgid "invalid dependency %d"
+msgstr "neplatná závislost %d"
+
+#: pg_dump_sort.c:599
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "nelze identifikovat smyÄku závislostí"
+
+#: pg_dump_sort.c:1170
+#, 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] "na této tabulce existuje cyklus cizích klíÄů:"
+msgstr[1] "mezi tÄ›mito tabulkami existuje cyklus cizích klíÄů:"
+msgstr[2] "mezi tÄ›mito tabulkami existuje cyklus cizích klíÄů:"
+
+#: pg_dump_sort.c:1174 pg_dump_sort.c:1194
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1175
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Bez zadání volby --disable-triggers nebo doÄasného vypnutí constraintů zÅ™ejmÄ› nebudete schopni tento dump obnovit."
+
+#: pg_dump_sort.c:1176
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Zvažte použití kompletního (full) dumpu namísto --data-only dumpu pro odstranění tohoto problému."
+
+#: pg_dump_sort.c:1188
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "nelze vyÅ™eÅ¡it smyÄku závislostí mezi tÄ›mito položkami:"
+
+#: pg_dumpall.c:199
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+"adresáři jako \"%s\".\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_dumpall.c:204
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" byl nalezen pomocí \"%s\",\n"
+"ale nebyl ve stejné verzi jako %s.\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_dumpall.c:356
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "volba --exclude-database nemůže být použita spoleÄnÄ› s -g/--globals-only, -r/--roles-only, nebo -t/--tablespaces-only"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "volby -g/--globals-only a -r/--roles-only nelze používat spoleÄnÄ›"
+
+#: pg_dumpall.c:373
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "volby -g/--globals-only a -t/--tablespaces-only nelze používat spoleÄnÄ›"
+
+#: pg_dumpall.c:387
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "volby -r/--roles-only a -t/--tablespaces-only nelze používat spoleÄnÄ›"
+
+#: pg_dumpall.c:448 pg_dumpall.c:1754
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "nelze navázat spojení s databází \"%s\""
+
+#: pg_dumpall.c:462
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"nelze navázat spojení s databází \"postgres\" nebo \"template1\"\n"
+"Zadejte prosím alternativní databázi."
+
+#: pg_dumpall.c:616
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extrahuje PostgreSQL databázi do souboru s SQL skriptem.\n"
+"\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [VOLBA]...\n"
+
+#: pg_dumpall.c:621
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=SOUBOR výstupní soubor\n"
+
+#: pg_dumpall.c:628
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n"
+
+#: pg_dumpall.c:630
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only dump pouze globálních objektů, ne databáze\n"
+
+#: pg_dumpall.c:631 pg_restore.c:485
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner nevypisuje příkazy k nastavení vlastníka objektů\n"
+
+#: pg_dumpall.c:632
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only dump pouze rolí, ne databází nebo tablespaců\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=JMÉNO uživatelské jméno superuživatele použité při dumpu\n"
+
+#: pg_dumpall.c:635
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only dump pouze tablespaců, ne databází nebo rolí\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=VZOR nedumpuj databáze jejichž jména odpovídají VZORu\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords hesla pro role nezahrnovat do dumpu\n"
+
+#: pg_dumpall.c:662
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR specifikace připojení do databáze\n"
+
+#: pg_dumpall.c:664
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME alternativní výchozí databáze\n"
+
+#: pg_dumpall.c:671
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Pokud není použito -f/--file, potom SQL skript bude vypsán přímo na standardní\n"
+"výstup.\n"
+"\n"
+
+#: pg_dumpall.c:877
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "název role zaÄínající s \"pg_\" pÅ™eskoÄen (%s)"
+
+#: pg_dumpall.c:1278
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "nelze zpracovat ACL seznam (%s) pro prostor tabulek \"%s\""
+
+#: pg_dumpall.c:1495
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "nedumpuji databázi \"%s\""
+
+#: pg_dumpall.c:1499
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "dumpuji databázi \"%s\""
+
+#: pg_dumpall.c:1531
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump selhal pÅ™i zpracovávání databáze \"%s\", ukonÄuji se"
+
+#: pg_dumpall.c:1540
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "nelze otevřít logovací soubor \"%s\": %m"
+
+#: pg_dumpall.c:1584
+#, c-format
+msgid "running \"%s\""
+msgstr "běží \"%s\""
+
+#: pg_dumpall.c:1775
+#, c-format
+msgid "could not connect to database \"%s\": %s"
+msgstr "nelze navázat spojení s databází \"%s\": %s"
+
+#: pg_dumpall.c:1805
+#, c-format
+msgid "could not get server version"
+msgstr "nelze získat verzi serveru"
+
+#: pg_dumpall.c:1811
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "nelze zpracovat verzi serveru \"%s\""
+
+#: pg_dumpall.c:1883 pg_dumpall.c:1906
+#, c-format
+msgid "executing %s"
+msgstr "spouštím: %s"
+
+#: pg_restore.c:308
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "musí být specifikována jedna z voleb -d/--dbname a -f/--file"
+
+#: pg_restore.c:317
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "volby -d/--dbname a -f/--file nelze používat spoleÄnÄ›"
+
+#: pg_restore.c:343
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "volby -C/--create a -1/--single-transaction nelze používat spoleÄnÄ›"
+
+#: pg_restore.c:357
+#, c-format
+msgid "maximum number of parallel jobs is %d"
+msgstr "maximální poÄet paralelních jobů je %d"
+
+#: pg_restore.c:366
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "nelze zadat --single-transaction a několik úloh"
+
+#: pg_restore.c:408
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "neznámý formát archivu \"%s\"; zadejte prosím \"c\", \"d\" nebo \"t\""
+
+#: pg_restore.c:448
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "chyby ignorovány při obnovení: %d"
+
+#: pg_restore.c:461
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s obnovuje PostgreSQL databázi z archivu vytvořeného pomocí pg_dump.\n"
+"\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [SOUBOR]\n"
+
+#: pg_restore.c:466
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=JMÉNO jméno cílové databáze\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=SOUBOR výstupní soubor (- pro stdout)\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formát záložního souboru (měl by být automatický)\n"
+
+#: pg_restore.c:469
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list zobrazit sumarizovaný obsah (TOC) archivu\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version zobraz informaci o verzi, poté skonÄi\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobraz tuto nápovÄ›du, poté skonÄi\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe ovlivňující obnovu:\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only obnovit pouze data, ne definice databázových objektů\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create vypíše příkazy pro vytvoření databáze\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error ukonÄit pÅ™i chybÄ›, implicitnÄ› pokraÄuje\n"
+
+#: pg_restore.c:479
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=JMÉNO obnovit jmenovaný index\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM použij pro obnovu daný poÄet paralelních jobů\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=SOUBOR použít specifikovaný obsah (TOC) pro řazení\n"
+" výstupu z tohoto souboru\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME obnovit pouze objekty v tomto schématu\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME neobnovovat objekty v tomto schématu\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr ""
+" -P, --function=JMÉNO(args)\n"
+" obnovit funkci daného jména\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only obnovit pouze definice objektů, bez dat\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S, --superuser=JMÉNO jméno superuživatele použité pro\n"
+" zakázaní triggerů\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=JMÉNO obnovit pouze jmenovanou relaci (tabulka, pohled, etc.)\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=JMÉNO obnovit pouze jmenovaný trigger\n"
+
+#: pg_restore.c:491
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges pÅ™eskoÄit obnovu přístupových práv (grant/revoke)\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr ""
+" -1, --single-transaction\n"
+" zpracuj soubor v rámci jedné transakce\n"
+
+#: pg_restore.c:494
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security povolit row security\n"
+
+#: pg_restore.c:496
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments neobnovovat komentáře\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables\n"
+" neobnovuj data tabulek které nemohly být vytvořeny\n"
+
+#: pg_restore.c:499
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications do not restore publications\n"
+
+#: pg_restore.c:500
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels neobnovuj bezpeÄnostní Å¡títky\n"
+
+#: pg_restore.c:501
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions neobnovovat subskripce\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces neobnovuj přiřazení tablespaces\n"
+
+#: pg_restore.c:503
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION obnov pojmenovanou sekci (pre-data, data, nebo post-data)\n"
+
+#: pg_restore.c:516
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME pÅ™ed obnovou proveÄ SET ROLE\n"
+
+#: pg_restore.c:518
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Volby -I, -n, -N, -P, -t, -T, a --section mohou být kombinovány a zadány několikrát\n"
+"pro výběr více objektů.\n"
+
+#: pg_restore.c:521
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Není-li definován vstupní soubor, je použit standardní vstup.\n"
+"\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze Äíst symbolický link \"%s\""
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukonÄen signálem %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "parallel archiver"
+#~ msgstr "paralelní archivář"
+
+#~ msgid "archiver"
+#~ msgstr "archivář"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C a -1 jsou nekompatibilní pÅ™epínaÄe\n"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "pokouším se zjistit formát archivu\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "alokován AH pro %s, formát %d\n"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "pÅ™eÄetl jsem TOC záznam %d (ID %d) pro %s %s\n"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "nelze nastavit default_with_oids: %s"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "vstupuji do restore_toc_entries_prefork\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "vstupuji do restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "vstupuji do restore_toc_entries_postfork\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "žádná položka není připravena\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "přenáším závislost %d -> %d to %d\n"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "redukuji závislosti pro %d\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "vlastní archivář"
+
+#~ msgid "archiver (db)"
+#~ msgstr "archivář (db)"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "selhalo znovunavázání spojení s databází\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "selhalo spojení s databází\n"
+
+#~ msgid "directory archiver"
+#~ msgstr "directory archiver"
+
+#~ msgid "tar archiver"
+#~ msgstr "tar archivář"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "přecházím z pozice %s na následujícího položky na pozici souboru %s\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "nyní na pozici souboru %s\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "pÅ™eskakován tar Älen %s\n"
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "TOC položka %s na %s (délka %s, kontrolní souÄet %d)\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "volby --inserts/--column-inserts a -o/--oids nelze používat spoleÄnÄ›\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(Příkaz INSERT nemůže nastavovat OID.)\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids zahrnout OID do dumpu\n"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "VAROVÃNÃ: nelze naparsovat pole reloptions\n"
+
+#~ msgid "sorter"
+#~ msgstr "sorter"
+
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: volba --if-exists vyžaduje volbu -c/--clean\n"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít výstupní soubor \"%s\": %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: specifikováno neplatné klientské kódování \"%s\"\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: vykonávám %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: dotaz selhal: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: dotaz byl: %s\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: volby -s/--schema-only a -a/--data-only nelze použít najednou\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: volby -c/--clean a -a/--data-only nelze používat spoleÄnÄ›\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: neplatný poÄet paralelních jobů\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "worker konÄí\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "chyba při paralelním zpracovávání položky\n"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "ukonÄeno uživatelem\n"
+
+#~ msgid "setting owner and privileges for %s %s\n"
+#~ msgstr "nastavuji vlastníka a přístupová práva pro %s %s\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "nelze zapsat do vlastní výstupní rutiny\n"
+
+#~ msgid "unexpected end of file\n"
+#~ msgstr "neoÄekávaný konec souboru\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "nelze najít slot ukonÄeného workera\n"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "nelze zapsat byte: %s\n"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "nelze zapsat byte\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "nelze zapsat null blok na konec tar archivu\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "položka archivu je příliš velká pro formát tar\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "nelze zapsat vycpávku (padding) na konec položky taru\n"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "aktuální a předpokládaná pozice souboru se neshodují (%s vs. %s)\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "nelze otevřít výstupní soubor \"%s\" pro zápis\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr "verze serveru musí být alespoň 7.3 pro použití pÅ™epínaÄů prů výbÄ›r schématu\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr "dotaz na získání dat sekvence \"%s\" vrátil jméno \"%s\"\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr "%s: nelze zpracovat ACL seznam (%s) pro databázi \"%s\"\n"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "worker proces selhal: status %d\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore by nemÄ›l skonÄit\n"
+
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "nelze vytvořit worker thread: %s\n"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "neplatný formát řetězce s verzí \"%s\"\n"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: nelze zpracovat verzi serveru \"%s\"\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C a -c jsou nekompatibilní pÅ™epínaÄe\n"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "neplatný COPY příkaz -- nelze najít \"copy\" v řetězci \"%s\"\n"
+
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr "neplatný COPY příkaz -- nelze najít \"from stdin\" v Å™etÄ›zci \"%s\" zaÄínající na pozici %lu\n"
+
+#~ msgid "cannot create directory %s, it exists already\n"
+#~ msgstr "nelze vytvořit adresář %s, již existuje\n"
+
+#~ msgid "cannot create directory %s, a file with this name exists already\n"
+#~ msgstr "nelze vytvořit adresář %s, soubor s tímto jménem již existuje\n"
+
+#~ msgid "path name too long: %s"
+#~ msgstr "cesta příliš dlouhá: %s"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "obnovuji \"large object\" s OID %u\n"
+
+#~ msgid "options -s/--schema-only and -a/--data-only cannot be used with --section\n"
+#~ msgstr "volby -s/--schema-only a -a/--data-only nelze použít s --section\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help ukáže tento text a skonÄí\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version ukáže informace o verzi a skonÄí\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used with --section\n"
+#~ msgstr "%s: volby -s/--schema-only a -a/--data-only nelze použít s --section\n"
+
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr " -c, --clean odstranit (drop) databázi před jejím vytvořením\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner pÅ™eskoÄ nastavení vlastníka objektů\n"
+
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr " --disable-triggers zakázat volání triggerů během obnovy dat\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " používat příkaz SET SESSION AUTHORIZATION namísto\n"
+#~ " příkazu ALTER OWNER pro nastavení vlastníka\n"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Program \"pg_dump\" byl nalezen \"%s\",\n"
+#~ "který ale není stejné verze jako %s.\n"
+#~ "Zkontrolujte vaši instalaci."
+
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Program \"pg_dump\" je potřebný pro %s, ale nebyl nalezen ve stejném\n"
+#~ "adresáři jako \"%s\".\n"
+#~ "Zkontrolujte vaši instalaci."
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Oznámení o chybách zasílejte na <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()"
+#~ msgstr "interní chyba -- ani th ani fh nespecifikován v tarReadRaw()"
+
+#~ msgid "connection needs password"
+#~ msgstr "spojení vyžaduje heslo"
+
+#~ msgid "could not reconnect to database: %s"
+#~ msgstr "nelze znovu navázat spojení s databází: %s"
+
+#~ msgid "could not reconnect to database"
+#~ msgstr "nelze znovu navázat spojení s databází"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\""
+#~ msgstr "připojuji se k databázi \"%s\" jako uživatel \"%s\""
+
+#~ msgid "ftell mismatch with expected position -- ftell used"
+#~ msgstr "ftell neodpovídá oÄekávané pozici -- použit ftell"
+
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive"
+#~ msgstr "v archivu nelze najít blok ID %d -- možná kvůli out-of-order restore požadavku, který nemohl být vyřízen kvůli chybějícím datovým offsetům v archivu"
diff --git a/src/bin/pg_dump/po/de.po b/src/bin/pg_dump/po/de.po
new file mode 100644
index 0000000..7a8db49
--- /dev/null
+++ b/src/bin/pg_dump/po/de.po
@@ -0,0 +1,2793 @@
+# German message translation file for pg_dump and friends
+# Peter Eisentraut <peter@eisentraut.org>, 2001 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 20:51+0000\n"
+"PO-Revision-Date: 2023-09-06 08:25+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "diese Installation unterstützt keine Komprimierung mit %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "leere Zeichenkette gefunden wo eine Komprimierungsoption erwartet wurde"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "unbekannte Komprimierungsoption: »%s«"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "Komprimierungsoption »%s« benötigt einen Wert"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "Wert für Komprimierungsoption »%s« muss eine ganze Zahl sein"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "Wert für Komprimierungsoption »%s« muss ein Boole’scher Wert sein"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "Komprimierungsalgorithmus »%s« akzeptiert kein Komprimierungsniveau"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "Komprimierungsalgorithmus »%s« erwartet ein Komprimierungsniveau zwischen %d und %d (Standard bei %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "Komprimierungsalgorithmus »%s« akzeptiert keine Worker-Anzahl"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "Komprimierungsalgorithmus »%s« unterstützt keinen Long-Distance-Modus"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ungültige Programmdatei »%s«: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "konnte Programmdatei »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "lese Erweiterungen"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "identifiziere Erweiterungselemente"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "lese Schemas"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "lese benutzerdefinierte Tabellen"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "lese benutzerdefinierte Funktionen"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "lese benutzerdefinierte Typen"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "lese prozedurale Sprachen"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "lese benutzerdefinierte Aggregatfunktionen"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "lese benutzerdefinierte Operatoren"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "lese benutzerdefinierte Zugriffsmethoden"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "lese benutzerdefinierte Operatorklassen"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "lese benutzerdefinierte Operatorfamilien"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "lese benutzerdefinierte Textsuche-Parser"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "lese benutzerdefinierte Textsuche-Templates"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "lese benutzerdefinierte Textsuchewörterbücher"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "lese benutzerdefinierte Textsuchekonfigurationen"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "lese benutzerdefinierte Fremddaten-Wrapper"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "lese benutzerdefinierte Fremdserver"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "lese Vorgabeprivilegien"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "lese benutzerdefinierte Sortierfolgen"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "lese benutzerdefinierte Konversionen"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "lese Typumwandlungen"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "lese Transformationen"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "lese Tabellenvererbungsinformationen"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "lese Ereignistrigger"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "finde Erweiterungstabellen"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "finde Vererbungsbeziehungen"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "lese Spalteninfo für interessante Tabellen"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "markiere vererbte Spalten in abgeleiteten Tabellen"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "lese Partitionierungsdaten"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "lese Indexe"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "markiere Indexe in partitionierten Tabellen"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "lese erweiterte Statistiken"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "lese Constraints"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "lese Trigger"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "lese Umschreiberegeln"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "lese Policies"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "lese Publikationen"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "lese Publikationsmitgliedschaft von Tabellen"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "lese Publikationsmitgliedschaft von Schemas"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "lese Subskriptionen"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "Sanity-Check fehlgeschlagen, Eltern-OID %u von Tabelle »%s« (OID %u) nicht gefunden"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "ungültige Anzahl Eltern %d für Tabelle »%s«"
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "konnte numerisches Array »%s« nicht parsen: zu viele Zahlen"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "konnte numerisches Array »%s« nicht parsen: ungültiges Zeichen in Zahl"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "konnte Komprimierungsstrom nicht schließen: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "konnte Daten nicht komprimieren: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "konnte Daten nicht dekomprimieren: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "konnte Komprimierungsbibliothek nicht schließen: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "konnte nicht aus Eingabedatei lesen: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "konnte nicht aus Eingabedatei lesen: Dateiende"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "konnte LZ4-Dekomprimierungskontext nicht erzeugen: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "konnte nicht dekomprimieren: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "konnte LZ4-Dekomprimierungskontext nicht freigeben: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "konnte Komprimierung nicht beenden: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "konnte LZ4-Komprimierung nicht initialisieren: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "konnte Dekomprimierung nicht beenden: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "konnte Komprimierungsparameter »%s« nicht setzen: %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "konnte Komprimierungsbibliothek nicht initialisieren"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "konnte Daten nicht dekomprimieren: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "konnte nicht aus Eingabedatei lesen: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "unbehandelter Modus »%s«"
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() fehlgeschlagen: Fehlercode %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "konnte Kommunikationskanäle nicht erzeugen: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "konnte Arbeitsprozess nicht erzeugen: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "unbekannter Befehl vom Leader-Prozess empfangen: »%s«"
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ungültige Nachricht vom Arbeitsprozess empfangen: »%s«"
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"konnte Sperre für Relation »%s« nicht setzen\n"
+"Das bedeutet meistens, dass jemand eine ACCESS-EXCLUSIVE-Sperre auf die Tabelle gesetzt hat, nachdem der pg-dump-Elternprozess die anfängliche ACCESS-SHARE-Sperre gesetzt hatte."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "ein Arbeitsprozess endete unerwartet"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "konnte nicht in den Kommunikationskanal schreiben: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: konnte Socket nicht erzeugen: Fehlercode %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: konnte nicht binden: Fehlercode %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: konnte nicht auf Socket hören: Fehlercode %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() fehlgeschlagen: Fehlercode %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: konnte zweites Socket nicht erzeugen: Fehlercode %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: konnte Socket nicht verbinden: Fehlercode %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: konnte Verbindung nicht annehmen: Fehlercode %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "konnte Ausgabedatei nicht schließen: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "Archivelemente nicht in richtiger Abschnittsreihenfolge"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "unerwarteter Abschnittscode %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "parallele Wiederherstellung wird von diesem Archivdateiformat nicht unterstützt"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "parallele Wiederherstellung wird mit Archiven, die mit pg_dump vor 8.0 erstellt worden sind, nicht unterstützt"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "kann komprimiertes Archiv nicht wiederherstellen (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "verbinde mit der Datenbank zur Wiederherstellung"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "direkte Datenbankverbindungen sind in Archiven vor Version 1.3 nicht unterstützt"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "implizit werden nur Daten wiederhergestellt"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "entferne %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "konnte nicht bestimmen, wo IF EXISTS in die Anweisung »%s« eingefügt werden soll"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "Warnung aus der ursprünglichen Ausgabedatei: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "erstelle %s »%s.%s«"
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "erstelle %s »%s«"
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "verbinde mit neuer Datenbank »%s«"
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "verarbeite %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "verarbeite Daten für Tabelle »%s.%s«"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "führe %s %s aus"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "schalte Trigger für %s aus"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "schalte Trigger für %s ein"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "interner Fehler -- WriteData kann nicht außerhalb des Kontexts einer DataDumper-Routine aufgerufen werden"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "Large-Object-Ausgabe im gewählten Format nicht unterstützt"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d Large Object wiederhergestellt"
+msgstr[1] "%d Large Objects wiederhergestellt"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "Wiederherstellung von Large Object mit OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "konnte Large Object %u nicht erstellen: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "konnte Large Object %u nicht öffnen: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht öffnen: %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "Zeile ignoriert: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "konnte Eintrag für ID %d nicht finden"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "konnte Inhaltsverzeichnisdatei nicht schließen: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "konnte Ausgabedatei »%s« nicht öffnen: %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "konnte Ausgabedatei nicht öffnen: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "%zu Byte Large-Object-Daten geschrieben (Ergebnis = %d)"
+msgstr[1] "%zu Bytes Large-Object-Daten geschrieben (Ergebnis = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "konnte Large Object nicht schreiben: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "in Phase INITIALIZING:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "in Phase PROCESSING TOC:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "in Phase FINALIZING:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "in Inhaltsverzeichniseintrag %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "ungültige DumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "ungültige Tabellen-DumpId für »TABLE DATA«-Eintrag"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "unerwartete Datenoffsetmarkierung %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "Dateioffset in Dumpdatei ist zu groß"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "Verzeichnisname zu lang: »%s«"
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "Verzeichnis »%s« scheint kein gültiges Archiv zu sein (»toc.dat« existiert nicht)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "konnte Eingabedatei »%s« nicht öffnen: %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "konnte Eingabedatei nicht öffnen: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "konnte Eingabedatei nicht lesen: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "Eingabedatei ist zu kurz (gelesen: %lu, erwartet: 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "Eingabedatei ist anscheinend ein Dump im Textformat. Bitte verwenden Sie psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "Eingabedatei scheint kein gültiges Archiv zu sein (zu kurz?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "Eingabedatei scheint kein gültiges Archiv zu sein"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "konnte Eingabedatei nicht schließen: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "konnte Standardausgabe nicht zum Anhängen öffnen: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "nicht erkanntes Dateiformat »%d«"
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "Element %d %s %s abgeschlossen"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "Arbeitsprozess fehlgeschlagen: Code %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID %d des Eintrags außerhalb des gültigen Bereichs -- vielleicht ein verfälschtes Inhaltsverzeichnis"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "Wiederherstellung von Tabellen mit WITH OIDS wird nicht mehr unterstützt"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "nicht erkannte Kodierung »%s«"
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "ungültiger ENCODING-Eintrag: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "ungültiger STDSTRINGS-Eintrag: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "Schema »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "Tabelle »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "Index »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "Funktion »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "Trigger »%s« nicht gefunden"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "konnte Sitzungsbenutzer nicht auf »%s« setzen: %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "konnte search_path nicht auf »%s« setzen: %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "konnte default_tablespace nicht auf »%s« setzen: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "konnte default_table_access_method nicht setzen: %s"
+
+#: pg_backup_archiver.c:3530
+#, 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:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "magische Zeichenkette im Dateikopf nicht gefunden"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "nicht unterstützte Version (%d.%d) im Dateikopf"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "Prüfung der Integer-Größe (%lu) fehlgeschlagen"
+
+#: pg_backup_archiver.c:3775
+#, 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:3785
+#, 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:3807
+#, 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:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "ungültiges Erstellungsdatum im Kopf"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "verarbeite Element %d %s %s"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "Eintritt in Hauptparallelschleife"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "Element %d %s %s wird übersprungen"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "starte Element %d %s %s"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "Hauptparallelschleife beendet"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "verarbeite verpasstes Element %d %s %s"
+
+#: pg_backup_archiver.c:4767
+#, 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"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ungültige OID für Large Object"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "Fehler beim Suchen in Datei: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "Datenblock %d hat falsche Seek-Position"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "unerkannter Datenblocktyp (%d) beim Suchen im Archiv gefunden"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "konnte Block-ID %d nicht im Archiv finden -- möglicherweise wegen Wiederherstellung außer der Reihe, was nicht möglich ist, weil die Eingabedatei kein Suchen unterstützt"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "konnte Block-ID %d nicht im Archiv finden -- möglicherweise beschädigtes Archiv"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "unerwartete Block-ID (%d) beim Lesen der Daten gefunden -- erwartet wurde %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "unerkannter Datenblocktyp %d beim Wiederherstellen des Archivs gefunden"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "konnte Positionszeiger in Archivdatei nicht ermitteln: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "konnte Archivdatei nicht schließen: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "nur Eingabearchive können neu geöffnet werden"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "parallele Wiederherstellung aus der Standardeingabe wird nicht unterstützt"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "parallele Wiederherstellung aus einer Datei, die kein Suchen ermöglicht, wird nicht unterstützt"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "konnte Positionszeiger in Archivdatei nicht setzen: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "Kompressor ist aktiv"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "konnte server_version nicht von libpq ermitteln"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "Abbruch wegen unpassender Serverversion"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "Version des Servers: %s; Version von %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "bereits mit einer Datenbank verbunden"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Passwort: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "konnte nicht mit der Datenbank verbinden"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "Wiederverbindung fehlgeschlagen: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "Anfrage fehlgeschlagen: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "Anfrage war: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "Anfrage ergab %d Zeile anstatt einer: %s"
+msgstr[1] "Anfrage ergab %d Zeilen anstatt einer: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sDie Anweisung war: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "konnte Anfrage nicht ausführen"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "Fehler in PQputCopyData: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "Fehler in PQputCopyEnd: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY fehlgeschlagen für Tabelle »%s«: %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "unerwartete zusätzliche Ergebnisse während COPY von Tabelle »%s«"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "konnte Datenbanktransaktion nicht starten"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "konnte Datenbanktransaktion nicht beenden"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "kein Ausgabeverzeichnis angegeben"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "konnte nicht in Ausgabedatei schreiben: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "konnte Datendatei nicht schließen: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "konnte Datendatei »%s« nicht schließen: %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ungültige Zeile in Large-Object-Inhaltsverzeichnisdatei »%s«: %s"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "Fehler beim Lesen von Large-Object-Inhaltsverzeichnisdatei »%s«"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht schließen: %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "konnte LO-Datendatei nicht schließen: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "konnte nicht in LOs-Inhaltsverzeichnisdatei schreiben: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "konnte LOs-Inhaltsverzeichnisdatei nicht schließen: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "Dateiname zu lang: »%s«"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "dieses Format kann nicht gelesen werden"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Ausgabe öffnen: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "konnte Inhaltsverzeichnisdatei nicht zur Ausgabe öffnen: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "Komprimierung ist im Tar-Format nicht unterstützt"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "konnte Inhaltsverzeichnisdatei nicht zur Eingabe öffnen: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "konnte Datei »%s« nicht im Archiv finden"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "konnte keine temporären Dateinamen erzeugen: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "unerwartete Syntax der COPY-Anweisung: »%s«"
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "Large Object hat ungültige OID (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "konnte temporäre Datei nicht schließen: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "tatsächliche Dateilänge (%lld) stimmt nicht mit erwarteter Länge (%lld) überein"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "konnte Kopf für Datei »%s« im Tar-Archiv nicht finden"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "Ausgabe der Daten in anderer Reihenfolge wird in diesem Archivformat nicht unterstützt: »%s« wird benötigt, aber es kommt vor »%s« in der Archivdatei."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "unvollständiger Tar-Dateikopf gefunden (%lu Byte)"
+msgstr[1] "unvollständiger Tar-Dateikopf gefunden (%lu Bytes)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "beschädigter Tar-Kopf in %s gefunden (%d erwartet, %d berechnet), Dateiposition %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "unbekannter Abschnittsname: »%s«"
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely-Slots aufgebraucht"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "Optionen -s/--schema-only und -a/--data-only können nicht zusammen verwendet werden"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "Optionen -s/--schema-only und --include-foreign-data können nicht zusammen verwendet werden"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "Option --include-foreign-data wird nicht mit paralleler Sicherung unterstützt"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "Optionen -c/--clean und -a/--data-only können nicht zusammen verwendet werden"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "Option --if-exists benötigt Option -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "Option --on-conflict-do-nothing benötigt Option --inserts, --rows-per-insert oder --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "unbekannter Komprimierungsalgorithmus: »%s«"
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ungültige Komprimierungsangabe: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "Komprimierungsoption »%s« wird aktuell von pg_dump nicht unterstützt"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "parallele Sicherung wird nur vom Ausgabeformat »Verzeichnis« unterstützt"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "letzte eingebaute OID ist %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "keine passenden Schemas gefunden"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "keine passenden Tabellen gefunden"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "keine passenden Erweiterungen gefunden"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s gibt eine Datenbank als Textdatei oder in anderen Formaten aus.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allgemeine Optionen:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=DATEINAME Name der Ausgabedatei oder des -verzeichnisses\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p Ausgabeformat (custom, d=Verzeichnis, tar,\n"
+" plain text)\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM so viele parallele Jobs zur Sicherung verwenden\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHODE[:DETAIL]\n"
+" wie angegeben komprimieren\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=ZEIT Abbruch nach ZEIT Warten auf Tabellensperre\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync nicht warten, bis Änderungen sicher auf\n"
+" Festplatte geschrieben sind\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Optionen die den Inhalt der Ausgabe kontrollieren:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only nur Daten ausgeben, nicht das Schema\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects Large Objects mit ausgeben\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (gleich --large-objects, veraltet)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects Large Objects nicht mit ausgeben\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (gleich --no-large-objects, veraltet)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean Datenbankobjekte vor der Wiedererstellung löschen\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create Anweisungen zum Erstellen der Datenbank in\n"
+" Ausgabe einfügen\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=MUSTER nur die angegebene(n) Erweiterung(en) ausgeben\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KODIERUNG Daten in Kodierung KODIERUNG ausgeben\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=MUSTER nur das/die angegebene(n) Schema(s) ausgeben\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MUSTER das/die angegebene(n) Schema(s) NICHT ausgeben\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner Wiederherstellung der Objekteigentümerschaft im\n"
+" »plain text«-Format auslassen\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only nur das Schema, nicht die Daten, ausgeben\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME Superusername für »plain text«-Format\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=MUSTER nur die angegebene(n) Tabelle(n) ausgeben\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=MUSTER die angegebene(n) Tabelle(n) NICHT ausgeben\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges Zugriffsprivilegien (grant/revoke) nicht ausgeben\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade wird nur von Upgrade-Programmen verwendet\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts Daten als INSERT-Anweisungen mit Spaltennamen\n"
+" ausgeben\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting Dollar-Quoting abschalten, normales SQL-Quoting\n"
+" verwenden\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers Trigger während der Datenwiederherstellung\n"
+" abschalten\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security Sicherheit auf Zeilenebene einschalten (nur Daten\n"
+" ausgeben, auf die der Benutzer Zugriff hat)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=MUSTER\n"
+" die angegebene(n) Tabelle(n) NICHT ausgeben,\n"
+" einschließlich abgeleiteter und Partitionstabellen\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=MUSTER Daten der angegebenen Tabelle(n) NICHT ausgeben\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=MUSTER\n"
+" Daten der angegebenen Tabelle(n) NICHT ausgeben,\n"
+" einschließlich abgeleiteter und Partitionstabellen\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=ZAHL Einstellung für extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists IF EXISTS verwenden, wenn Objekte gelöscht werden\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MUSTER\n"
+" Daten von Fremdtabellen auf Fremdservern, die\n"
+" mit MUSTER übereinstimmen, mit sichern\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts Daten als INSERT-Anweisungen statt COPY ausgeben\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root Partitionen über die Wurzeltabelle laden\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments Kommentare nicht ausgeben\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications Publikationen nicht ausgeben\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels Security-Label-Zuweisungen nicht ausgeben\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions Subskriptionen nicht ausgeben\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method Tabellenzugriffsmethoden nicht ausgeben\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces Tablespace-Zuordnungen nicht ausgeben\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST-Komprimierungsmethoden nicht ausgeben\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data Daten in ungeloggten Tabellen nicht ausgeben\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERT-Befehle mit ON CONFLICT DO NOTHING ausgeben\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers alle Bezeichner in Anführungszeichen, selbst wenn\n"
+" kein Schlüsselwort\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=ANZAHL Anzahl Zeilen pro INSERT; impliziert --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=ABSCHNITT angegebenen Abschnitt ausgeben (pre-data, data\n"
+" oder post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable warten bis der Dump ohne Anomalien laufen kann\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT angegebenen Snapshot für den Dump verwenden\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names Tabellen- oder Schemamuster müssen auf mindestens\n"
+" je ein Objekt passen\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=MUSTER nur die angegebene(n) Tabelle(n) ausgeben,\n"
+" einschließlich abgeleiteter und Partitionstabellen\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" SET SESSION AUTHORIZATION Befehle statt ALTER\n"
+" OWNER Befehle verwenden, um Eigentümerschaft zu\n"
+" setzen\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME auszugebende Datenbank\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT Portnummer des Datenbankservers\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLLENNAME vor der Ausgabe SET ROLE ausführen\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenbankname angegeben wird, dann wird die Umgebungsvariable\n"
+"PGDATABASE verwendet.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "ungültige Clientkodierung »%s« angegeben"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "parallele Dumps von Standby-Servern werden von dieser Serverversion nicht unterstützt"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "ungültiges Ausgabeformat »%s« angegeben"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "falscher qualifizierter Name (zu viele Namensteile): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "keine passenden Schemas für Muster »%s« gefunden"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "keine passenden Erweiterungen für Muster »%s« gefunden"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "keine passenden Fremdserver für Muster »%s« gefunden"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "falscher Relationsname (zu viele Namensteile): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "keine passenden Tabellen für Muster »%s« gefunden"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "gebe Inhalt der Tabelle »%s.%s« aus"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetCopyData() fehlgeschlagen."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Fehlermeldung vom Server: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "Die Anweisung war: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetResult() fehlgeschlagen."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "falsche Anzahl Felder von Tabelle »%s« erhalten"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "sichere Datenbankdefinition"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "unbekannter Locale-Provider: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "sichere Kodierung = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "sichere standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "konnte Ergebnis von current_schemas() nicht interpretieren"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "sichere search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "lese Large Objects"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "sichere Large Objects"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "Fehler beim Lesen von Large Object %u: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "lese Policys für Sicherheit auf Zeilenebene"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "unerwarteter Policy-Befehlstyp: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "konnte %s-Array nicht interpretieren"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "Subskriptionen werden nicht ausgegeben, weil der aktuelle Benutzer kein Superuser ist"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "konnte Erweiterung, zu der %s %s gehört, nicht finden"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "Schema mit OID %u existiert nicht"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von Sequenz mit OID %u nicht gefunden"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "Sanity-Check fehlgeschlagen, Tabellen-OID %u, die in pg_partitioned_table erscheint, nicht gefunden"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "unbekannte Tabellen-OID %u"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "unerwartete Indexdaten für Tabelle »%s«"
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von pg_rewrite-Eintrag mit OID %u nicht gefunden"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "Anfrage ergab NULL als Name der Tabelle auf die sich Fremdschlüssel-Trigger »%s« von Tabelle »%s« bezieht (OID der Tabelle: %u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "unerwartete Spaltendaten für Tabelle »%s«"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "ungültige Spaltennummerierung in Tabelle »%s«"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "finde Tabellenvorgabeausdrücke"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "ungültiger adnum-Wert %d für Tabelle »%s«"
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "finde Tabellen-Check-Constraints"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "%d Check-Constraint für Tabelle %s erwartet, aber %d gefunden"
+msgstr[1] "%d Check-Constraints für Tabelle %s erwartet, aber %d gefunden"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Die Systemkataloge sind wahrscheinlich verfälscht."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "Rolle mit OID %u existiert nicht"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "nicht unterstützter pg_init_privs-Eintrag: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype des Datentypen »%s« scheint ungültig zu sein"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "ungültiger provolatile-Wert für Funktion »%s«"
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "ungültiger proparallel-Wert für Funktion »%s«"
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "konnte Funktionsdefinition für Funktion mit OID %u nicht finden"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "unsinniger Wert in Feld pg_cast.castfunc oder pg_cast.castmethod"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "unsinniger Wert in Feld pg_cast.castmethod"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "unsinnige Transformationsdefinition, mindestens eins von trffromsql und trftosql sollte nicht null sein"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "unsinniger Wert in Feld pg_transform.trffromsql"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "unsinniger Wert in Feld pg_transform.trftosql"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "Postfix-Operatoren werden nicht mehr unterstützt (Operator »%s«)"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "konnte Operator mit OID %s nicht finden"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "ungültiger Typ »%c« für Zugriffsmethode »%s«"
+
+#: pg_dump.c:13455 pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "unbekannter Sortierfolgen-Provider: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ungültige Sortierfolge »%s«"
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "unbekannter aggfinalmodify-Wert für Aggregat »%s«"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "unbekannter aggmfinalmodify-Wert für Aggregat »%s«"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "unbekannter Objekttyp in den Vorgabeprivilegien: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "konnte Vorgabe-ACL-Liste (%s) nicht interpretieren"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "konnte initiale ACL-Liste (%s) oder Default (%s) für Objekt »%s« (%s) nicht interpretieren"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "konnte ACL-Liste (%s) oder Default (%s) für Objekt »%s« (%s) nicht interpretieren"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte keine Daten"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte mehr als eine Definition"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "Definition der Sicht »%s« scheint leer zu sein (Länge null)"
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS wird nicht mehr unterstützt (Tabelle »%s«)"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "ungültige Spaltennummer %d in Tabelle »%s«"
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "konnte Indexstatistikspalten nicht interpretieren"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "konnte Indexstatistikwerte nicht interpretieren"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "Anzahl Spalten und Werte für Indexstatistiken stimmt nicht überein"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "fehlender Index für Constraint »%s«"
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "unbekannter Constraint-Typ: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "Anfrage nach Daten der Sequenz %s ergab %d Zeile (erwartete 1)"
+msgstr[1] "Anfrage nach Daten der Sequenz %s ergab %d Zeilen (erwartete 1)"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "unbekannter Sequenztyp: %s"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "unerwarteter tgtype-Wert: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "fehlerhafte Argumentzeichenkette (%s) für Trigger »%s« von Tabelle »%s«"
+
+#: pg_dump.c:17655
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "Anfrage nach Regel »%s« der Tabelle »%s« fehlgeschlagen: falsche Anzahl Zeilen zurückgegeben"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "konnte referenzierte Erweiterung %u nicht finden"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "Anzahl Konfigurationen und Bedingungen für Erweiterung stimmt nicht überein"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "lese Abhängigkeitsdaten"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "kein referenzierendes Objekt %u %u"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "kein referenziertes Objekt %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "ungültige dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "ungültige Abhängigkeit %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "konnte Abhängigkeitsschleife nicht bestimmen"
+
+#: pg_dump_sort.c:1276
+#, 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] "Es gibt zirkuläre Fremdschlüssel-Constraints für diese Tabelle:"
+msgstr[1] "Es gibt zirkuläre Fremdschlüssel-Constraints zwischen diesen Tabellen:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Möglicherweise kann der Dump nur wiederhergestellt werden, wenn --disable-triggers verwendet wird oder die Constraints vorübergehend entfernt werden."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Führen Sie einen vollen Dump statt eines Dumps mit --data-only durch, um dieses Problem zu vermeiden."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "konnte Abhängigkeitsschleife zwischen diesen Elementen nicht auflösen:"
+
+#: pg_dumpall.c:230
+#, 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_dumpall.c:233
+#, 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_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "Option --exclude-database kann nicht zusammen mit -g/--globals-only, -r/--roles-only oder -t/--tablesspaces-only verwendet werden"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "Optionen -g/--globals-only und -r/--roles-only können nicht zusammen verwendet werden"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "Optionen -g/--globals-only und -t/--tablespaces-only können nicht zusammen verwendet werden"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "Optionen -r/--roles-only und -t/--tablespaces-only können nicht zusammen verwendet werden"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "konnte nicht mit der Datenbank »%s« verbinden"
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"konnte nicht mit Datenbank »postgres« oder »template1« verbinden\n"
+"Bitte geben Sie eine alternative Datenbank an."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s gibt einen PostgreSQL-Datenbankcluster in eine SQL-Skriptdatei aus.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=DATEINAME Name der Ausgabedatei\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean Datenbanken vor der Wiedererstellung löschen\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only nur globale Objekte ausgeben, keine Datenbanken\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr ""
+" -O, --no-owner Wiederherstellung der Objekteigentümerschaft\n"
+" auslassen\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only nur Rollen ausgeben, keine Datenbanken oder\n"
+" Tablespaces\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME Superusername für den Dump\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only nur Tablespaces ausgeben, keine Datenbanken oder\n"
+" Rollen\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=MUSTER Datenbanken deren Name mit MUSTER übereinstimmt\n"
+" überspringen\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords Rollenpasswörter nicht mit ausgeben\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=VERBDG mit angegebenen Verbindungsparametern verbinden\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME alternative Standarddatenbank\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn -f/--file nicht verwendet wird, dann wird das SQL-Skript auf die\n"
+"Standardausgabe geschrieben.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "mit »pg_« anfangender Rollenname übersprungen (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "konnte keine legale Dump-Reihenfolge für Mitgliedschaften in Rolle »%s« finden"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "konnte ACL-Zeichenkette (%s) für Parameter »%s« nicht interpretieren"
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "konnte ACL-Zeichenkette (%s) für Tablespace »%s« nicht interpretieren"
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "Datenbank »%s« übersprungen"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "Ausgabe der Datenbank »%s«"
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump für Datenbank »%s« fehlgeschlagen; beende"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "konnte die Ausgabedatei »%s« nicht neu öffnen: %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "führe »%s« aus"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "konnte Version des Servers nicht ermitteln"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "konnte Versionszeichenkette »%s« nicht entziffern"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "führe %s aus"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "entweder -d/--dbname oder -f/--file muss angegeben werden"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "Optionen -d/--dbname und -f/--file können nicht zusammen verwendet werden"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "Optionen -C/--create und -1/--single-transaction können nicht zusammen verwendet werden"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction und mehrere Jobs können nicht zusammen verwendet werden"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "unbekanntes Archivformat »%s«; bitte »c«, »d« oder »t« angeben"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "bei Wiederherstellung ignorierte Fehler: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s stellt eine PostgreSQL-Datenbank wieder her, die mit pg_dump\n"
+"gesichert wurde.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [DATEI]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME mit angegebener Datenbank verbinden\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=DATEINAME Name der Ausgabedatei (- für stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t Format der Backup-Datei (sollte automatisch gehen)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list Inhaltsverzeichnis für dieses Archiv anzeigen\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Optionen die die Wiederherstellung kontrollieren:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only nur Daten, nicht das Schema, wiederherstellen\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create Zieldatenbank erzeugen\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error bei Fehler beenden, Voreinstellung ist fortsetzen\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME benannten Index wiederherstellen\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+" -j, --jobs=NUM so viele parallele Jobs zur Wiederherstellung\n"
+" verwenden\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=DATEINAME Inhaltsverzeichnis aus dieser Datei zur Auswahl oder\n"
+" Sortierung der Ausgabe verwenden\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME nur Objekte in diesem Schema wiederherstellen\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, ---exclude-schema=NAME Objekte in diesem Schema nicht wiederherstellen\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) benannte Funktion wiederherstellen\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only nur das Schema, nicht die Daten, wiederherstellen\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME Name des Superusers, um Trigger auszuschalten\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr ""
+" -t, --table=NAME benannte Relation (Tabelle, Sicht, usw.)\n"
+" wiederherstellen\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME benannten Trigger wiederherstellen\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges Wiederherstellung der Zugriffsprivilegien auslassen\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction Wiederherstellung als eine einzige Transaktion\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security Sicherheit auf Zeilenebene einschalten\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments Kommentare nicht wiederherstellen\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables Daten für Tabellen, die nicht erzeugt werden\n"
+" konnten, nicht wiederherstellen\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications Publikationen nicht wiederherstellen\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels Security-Labels nicht wiederherstellen\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions Subskriptionen nicht wiederherstellen\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method Tabellenzugriffsmethoden nicht wiederherstellen\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces Tablespace-Zuordnungen nicht wiederherstellen\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=ABSCHNITT angegebenen Abschnitt wiederherstellen (pre-data,\n"
+" data oder post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLLENNAME vor der Wiederherstellung SET ROLE ausführen\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Die Optionen -I, -n, -N, -P, -t, -T und --section können kombiniert und mehrfach\n"
+"angegeben werden, um mehrere Objekte auszuwählen.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn keine Eingabedatei angegeben ist, wird die Standardeingabe verwendet.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/el.po b/src/bin/pg_dump/po/el.po
new file mode 100644
index 0000000..391412a
--- /dev/null
+++ b/src/bin/pg_dump/po/el.po
@@ -0,0 +1,2948 @@
+# Greek message translation file for pg_dump
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:20+0000\n"
+"PO-Revision-Date: 2023-08-15 14:32+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "η παÏοÏσα κατασκευή δεν υποστηÏίζει συμπίεση με %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "βÏέθηκε κενή συμβολοσειÏά όπου αναμενόταν μια επιλογή συμπίεσης"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "μη αναγνωÏίσιμη παÏάμετÏος συμπίεσης: «%s»"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "η επιλογή συμπίεσης «%s» απαιτεί τιμή"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "η τιμή της επιλογής συμπίεσης «%s» Ï€Ïέπει να είναι ακέÏαια"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "η τιμή της επιλογής συμπίεσης «%s» Ï€Ïέπει να είναι Δυαδική τιμή"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν δέχεται επίπεδο συμπίεσης"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» αναμένει ένα επίπεδο συμπίεσης Î¼ÎµÏ„Î±Î¾Ï %d και %d (Ï€Ïοεπιλογμένο %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν δέχεται μέγεθος εÏγατών"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν υποστηÏίζει λειτουÏγία μεγάλων αποστάσεων"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βÏέθηκε"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "ανάγνωση επεκτάσεων"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "Ï€ÏοσδιοÏισμός μελών επέκτασεων"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "ανάγνωση σχημάτων"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "ανάγνωση πινάκων οÏισμένων από το χÏήστη"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "ανάγνωση συναÏτήσεων οÏισμένων από το χÏήστη"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "ανάγνωση Ï„Ïπων οÏισμένων από το χÏήστη"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "ανάγνωση δομημένων γλωσσών"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "ανάγνωση συναÏτήσεων συγκεντÏωτικών αποτελεσμάτων οÏισμένων από το χÏήστη"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "ανάγνωση χειÏιστών οÏισμένων από το χÏήστη"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "ανάγνωση μεθόδων Ï€Ïόσβασης οÏισμένων από το χÏήστη"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "ανάγνωση κλάσεων χειÏιστών οÏισμένων από το χÏήστη"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "ανάγνωση οικογενειών χειÏιστών οÏισμένων από το χÏήστη"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "ανάγνωση αναλυτών αναζήτησης κειμένου οÏισμένων από το χÏήστη"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "ανάγνωση Ï€ÏοτÏπων αναζήτησης κειμένου οÏισμένων από το χÏήστη"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "ανάγνωση λεξικών αναζήτησης κειμένου οÏισμένων από το χÏήστη"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "ανάγνωση Ïυθμίσεων παÏαμέτÏων αναζήτησης κειμένου οÏισμένων από το χÏήστη"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "ανάγνωση πεÏιτυλίξεων ξενικών δεδομένων οÏισμένων από το χÏήστη"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "ανάγνωση ξενικών διακομιστών οÏισμένων από το χÏήστη"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "ανάγνωση Ï€Ïοεπιλεγμένων δικαιωμάτων"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "ανάγνωση συÏÏαφών οÏισμένων από το χÏήστη"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "ανάγνωση μετατÏοπών οÏισμένων από το χÏήστη"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "ανάγνωση Ï„Ïπων καστ"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "ανάγωση μετατÏοπών"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "ανάγωση πληÏοφοÏιών κληÏονομιάς πινάκων"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "ανάγνωση ενεÏγοποιήσεων συμβάντων"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "εÏÏεση πινάκων επέκτασης"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "εÏÏεση σχέσεων κληÏονιμιά"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "ανάγνωση πληÏοφοÏιών στήλης για ενδιαφέÏοντες πίνακες"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "επισήμανση κληÏονομοÏμενων στηλών σε υποπίνακες"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "ανάγνωση δεδομένων κατάτμησης"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "ανάγνωση ευÏετηÏίων"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "επισήμανση ευÏετηÏίων σε κατατμημένους πινάκες"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "ανάγνωση εκτεταμένων στατιστικών στοιχείων"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "ανάγνωση πεÏιοÏισμών"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "ανάγνωση ενεÏγοποιήσεων συμβάντων"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "ανάγνωση κανόνων επανεγγÏαφής"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "ανάγνωση πολιτικών"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "ανάγνωση δημοσιεÏσεων"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "ανάγνωση ιδιοτήτων μελών δημοσιεÏσεων πινάκων"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "ανάγνωση ιδιοτήτων μελών δημοσιεÏσεων των σχημάτων"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "ανάγνωση συνδÏομών"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "απέτυχε ο έλεγχος ακεÏαιότητας, το γονικό OID %u του πίνακα «%s» (OID %u) δεν βÏέθηκε"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "μη έγκυÏος αÏιθμός γονέων %d για τον πίνακα «%s»"
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "δεν ήταν δυνατή η ανάλυση της αÏιθμητικής συστοιχίας «%s»: πάÏα πολλοί αÏιθμοί"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "δεν ήταν δυνατή η ανάλυση της αÏιθμητικής συστοιχίας «%s»: μη έγκυÏος χαÏακτήÏας σε αÏιθμό"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση της βιβλιοθήκης συμπίεσης: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο της Ïοής συμπίεσης: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "δεν ήταν δυνατό το κλείσιμο της βιβλιοθήκης συμπίεσης: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "δεν ήταν δυνατή η ανάγνωση από το αÏχείο εισόδου: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "δεν ήταν δυνατή η ανάγνωση από το αÏχείο εισόδου: τέλος αÏχείου"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "δεν ήταν δυνατή η δημιουÏγία LZ4 πεÏιεχομένου αποσυμπίεσης: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "δεν ήταν δυνατή η αποσυμπίεση: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "δεν ήταν δυνατή η απελευθέÏωση LZ4 πεÏιεχομένου αποσυμπίεσης: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "δεν ήταν δυνατός ο τεÏματισμός συμπίεσης: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση LZ4 συμπίεσης: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "δεν ήταν δυνατός ο τεÏματισμός αποσυμπίεσης: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση παÏαμέτÏου συμπίεσης «%s»: %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση της βιβλιοθήκης συμπίεσης"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "μη χειÏισμένη κατάσταση «%s»"
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() απέτυχε: κωδικός σφάλματος %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία καναλιών επικοινωνίας: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία διεÏγασίας εÏγάτη: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "μη αναγνωÏίσιμη εντολή που ελήφθη από τον αÏχηγό: «%s»"
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "άκυÏο μήνυμα που ελήφθη από εÏγάτη: «%s»"
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"δεν ήταν δυνατή η απόκτηση ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î³Î¹Î± τη σχέση \"%s\"\n"
+"Αυτό συνήθως σημαίνει ότι κάποιος ζήτησε ένα κλειδί ACCESS EXCLUSIVE στον πίνακα Î±Ï†Î¿Ï Î· γονική διεÏγασία pg_dump είχε ήδη αποκτήσει το αÏχικό κλειδί ACCESS SHARE στον πίνακα."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "μία διεÏγασία εÏγάτη τεÏματίστηκε απÏόσμενα"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή στο κανάλι επικοινωνίας: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η δημιουÏγία υποδοχέα: κωδικός σφάλματος %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η δέσμευση: κωδικός σφάλματος %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η ακÏόαση: κωδικός σφάλματος %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "%s() απέτυχε: κωδικός σφάλματος %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η δημιουÏγία δεÏτεÏης υποδοχής: κωδικός σφάλματος %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η σÏνδεση της υποδοχής: κωδικός σφάλματος %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: δεν ήταν δυνατή η αποδοχή σÏνδεσης: κωδικός σφάλματος %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου εξόδου: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "αÏχειοθέτηση στοιχείων που δεν βÏίσκονται σε σωστή σειÏά ενότητας"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "μη αναμενόμενος κώδικας ενότητας %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "η παÏάλληλη επαναφοÏά δεν υποστηÏίζεται από αυτήν τη μοÏφή αÏχείου αÏχειοθέτησης"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "η παÏάλληλη επαναφοÏά δεν υποστηÏίζεται με αÏχεία που έγιναν από pg_dump Ï€Ïο έκδοσης 8.0"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "δεν είναι δυνατή η επαναφοÏά από συμπιεσμένη αÏχειοθήκη (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "σÏνδεση με βάση δεδομένων για επαναφοÏά"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "οι απευθείας συνδέσεις βάσεων δεδομένων δεν υποστηÏίζονται σε Ï€Ïο-1.3 αÏχεία"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "υποδηλοÏμενη επαναφοÏά μόνο δεδομένων"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "εγκαταλείπει %s: %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "δεν ήταν δυνατή η εÏÏεση του σημείου εισαγωγής IF EXISTS στη δήλωση «%s»"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "Ï€Ïοειδοποίηση από το αÏχικό αÏχείο απόθεσης: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "δημιουÏγία %s «%s.%s»"
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "δημιουÏγία %s «%s»"
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "σÏνδεση με νέα βάση δεδομένων «%s»"
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "επεξεÏγασία %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "επεξεÏγασία δεδομένων για τον πίνακα «%s.%s»"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "εκτέλεση %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "απενεÏγοποίηση ενεÏγοποιήσεων για %s"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "ενεÏγοποίηση ενεÏγοποιήσεων για %s"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "εσωτεÏικό σφάλμα -- Δεν είναι δυνατή η κλήση του WriteData εκτός του πεÏιβάλλοντος μιας Ïουτίνας DataDumper"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "η έξοδος μεγάλου αντικειμένου δεν υποστηÏίζεται στην επιλεγμένη μοÏφή"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "επανέφεÏε %d μεγάλο αντικείμενο"
+msgstr[1] "επανέφεÏε %d μεγάλα αντικείμενα"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "επαναφοÏά μεγάλου αντικειμένου με OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "δεν ήταν δυνατή η δημιουÏγία μεγάλου αντικειμένου %u: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "δεν ήταν δυνατό το άνοιγμα μεγάλου αντικειμένου %u: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC «%s»: %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "παÏαβλέπεται γÏαμμή: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "δεν ήταν δυνατή η εÏÏεση καταχώÏησης για ID %d"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου TOC %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου εξόδου «%s»: %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου εξόδου %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "έγÏαψε %zu byte δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)"
+msgstr[1] "έγÏαψε %zu bytes δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή σε μεγάλο αντικείμενο: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "ενόσω INITIALIZING:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "ενόσω PROCESSING TOC:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "ενόσω FINALIZING:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "από καταχώÏηση TOC %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "εσφαλμένο dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "εσφαλμένος πίνακας dumpId για στοιχείο TABLE DATA"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "μη αναμενόμενη σημαία όφσετ δεδομένων %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "το όφσετ αÏχείου στο αÏχείο απόθεσης είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ ÏŒÎ½Î¿Î¼Î± καταλόγου: «%s»"
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "ο κατάλογος «%s» δεν φαίνεται να είναι έγκυÏη αÏχειοθήκη (το «toc.dat» δεν υπάÏχει)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου εισόδου «%s»: %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου εισόδου %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση αÏχείου εισόδου: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "το αÏχείο εισόδου είναι Ï€Î¿Î»Ï ÏƒÏντομο (διάβασε %lu, ανάμενε 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "το αÏχείο εισαγωγής φαίνεται να είναι απόθεση μοÏφής κειμένου. ΠαÏακαλώ χÏησιμοποιήστε το psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "το αÏχείο εισόδου δεν φαίνεται να είναι έγκυÏη αÏχειοθήκη (Ï€Î¿Î»Ï ÏƒÏντομο;)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "το αÏχείο εισόδου δεν φαίνεται να είναι έγκυÏη αÏχειοθήκη"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου εισόδου: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα τυπικής εξόδου για Ï€ÏοσάÏτηση: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "μη αναγνωÏίσιμη μοÏφή αÏχείου «%d»"
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "τεÏματισμός στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "διεÏγασία εÏγάτη απέτυχε: κωδικός εξόδου %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "καταχώÏηση με ID %d εκτός εÏÏους τιμών -- ίσως αλλοιωμένο TOC"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "η επαναφοÏά πινάκων WITH OIDS δεν υποστηÏίζεται πλέον"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "μη αναγνωÏίσιμη κωδικοποίηση «%s»"
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "μη έγκυÏο στοιχείο ENCODING: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "μη έγκυÏο στοιχείο STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "το σχήμα «%s» δεν βÏέθηκε"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "ο πίνακας «%s» δεν βÏέθηκε"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "το ευÏετήÏιο «%s» δεν βÏέθηκε"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "η συνάÏτηση «%s» δεν βÏέθηκε"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "η ενεÏγοποίηση «%s» δεν βÏέθηκε"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "δεν ήταν δυνατός ο οÏισμός του χÏήστη συνεδÏίας σε «%s»: %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "δεν ήταν δυνατός ο οÏισμός του search_path σε «%s»: %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "δεν ήταν δυνατός ο οÏισμός του default_tablespace σε «%s»: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "δεν ήταν δυνατός ο οÏισμός του default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "δεν γνωÏίζω πώς να οÏιστεί κάτοχος για Ï„Ïπο αντικειμένου «%s»"
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "δεν βÏέθηκε μαγική συμβολοσειÏά στην κεφαλίδα αÏχείου"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "μη υποστηÏιζόμενη έκδοση (%d.%d) στην κεφαλίδα αÏχείου"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "απέτυχε έλεγχος ακεÏαιότητας για μέγεθος ακεÏαίου (%lu)"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "το αÏχείο δημιουÏγήθηκε σε έναν υπολογιστή με μεγαλÏτεÏους ακέÏαιους, οÏισμένες λειτουÏγίες ενδέχεται να αποτÏχουν"
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "η αναμενόμενη μοÏφή (%d) διαφέÏει από τη μοÏφή που βÏίσκεται στο αÏχείο (%d)"
+
+#: pg_backup_archiver.c:3807
+#, 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:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "μη έγκυÏη ημεÏομηνία δημιουÏγίας στην κεφαλίδα"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "επεξεÏγασία στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "εισέÏχεται στο κÏÏιο παÏάλληλο βÏόχο"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "παÏάβλεψη στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "εκκίνηση στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "εξέÏχεται από το κÏÏιο παÏάλληλο βÏόχο"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "επεξεÏγασία παÏαβλεπόμενου στοιχείου %d %s %s"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του πίνακα «%s», δεν θα επαναφεÏθοÏν τα δεδομένα του"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "μη έγκυÏο OID για μεγάλο αντικειμένο"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "σφάλμα κατά τη διάÏκεια αναζήτησης σε αÏχείο: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "%d μπλοκ δεδομένων έχει εσφαλμένη θέση αναζήτησης"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "Ï„Ïπος μπλοκ δεδομένων (%d) που δεν αναγνωÏίζεται κατά την αναζήτηση αÏχειοθέτησης"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ ID %d στο αÏχείο -- πιθανώς λόγω αίτησης επαναφοÏάς εκτός σειÏάς, η οποία δεν είναι δυνατό να αντιμετωπιστεί λόγω μη αναζητήσιμου αÏχείου εισόδου"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ ID %d στην αÏχειοθήκη -- πιθανώς αλλοιωμένη αÏχειοθήκη"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "βÏέθηκε μη αναμενόμενο μπλοκ ID (%d) κατά την ανάγνωση δεδομένων -- αναμενόμενο %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "μη αναγνωÏίσιμος Ï„Ïπος μπλοκ δεδομένων %d κατά την επαναφοÏά της αÏχειοθήκης"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός της θέσης αναζήτησης στην αÏχειοθήκη: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο της αÏχειοθήκης: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "μποÏεί να επα-ανοίξει μόνο αÏχειοθήκες εισόδου"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "η επαναφοÏά από τυπική είσοδο δεν υποστηÏίζεται"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "η παÏάλληλη επαναφοÏά από μη αναζητήσιμο αÏχείο δεν υποστηÏίζεται"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση θέσης στο αÏχείο αÏχειοθέτησης: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "συμπιεστής ενεÏγός"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "δεν ήταν δυνατή η απόκτηση server_version από libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "ματαίωση λόγω ασυμφωνίας έκδοσης διακομιστή"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "έκδοση διακομιστή: %s; %s έκδοση: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ήδη συνδεδεμένος σε βάση δεδομένων"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Κωδικός Ï€Ïόσβασης: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "δεν ήταν δυνατή η σÏνδεση σε βάση δεδομένων"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "επανασÏνδεση απέτυχε: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "το εÏώτημα απέτυχε: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "Το εÏώτημα ήταν: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "το εÏώτημα επέστÏεψε %d σειÏά αντί μίας: %s"
+msgstr[1] "το εÏώτημα επέστÏεψε %d σειÏές αντί μίας: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s η εντολή ήταν: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "δεν ήταν δυνατή η εκτέλεση εÏωτήματος"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "επιστÏάφηκε σφάλμα από PQputCopyData: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "επιστÏάφηκε σφάλμα από PQputCopyEnd: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY απέτυχε για πίνακα «%s»: %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "μη αναμενόμενα αποτελέσματα κατά τη διάÏκεια COPY του πίνακα «%s»"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "δεν ήταν δυνατή η εκκίνηση συναλλαγής βάσης δεδομένων"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "δεν ήταν δυνατή η ολοκλήÏωση της συναλλαγής βάσης δεδομένων"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "δεν οÏίστηκε κατάλογος δεδομένων εξόδου"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή εξόδου στο αÏχείο: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου δεδομένων: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου δεδομένων «%s»: %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC μεγάλου αντικειμένου «%s» για είσοδο: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "μη έγκυÏη γÏαμμή σε αÏχείο TOC μεγάλου αντικειμένου «%s»: «%s»"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "σφάλμα κατά την ανάγνωση αÏχείου TOC μεγάλου αντικειμένου «%s»"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου TOC μεγάλου αντικειμένου «%s»: %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου δεδομένων LO: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "δεν ήταν δυνατή η εγγÏαφή σε αÏχείο LOs TOC: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου LOs TOC %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ ÏŒÎ½Î¿Î¼Î± αÏχείου: «%s»"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "δεν είναι δυνατή η ανάγνωση αυτής της μοÏφής"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC «%s» για έξοδο: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC για έξοδο: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "δεν υποστηÏίζεται συμπίεση από τη μοÏφή αÏχειοθέτησης tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC «%s» για είσοδο: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC για είσοδο: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "δεν ήταν δυνατή η εÏÏεση του αÏχείου «%s» στην αÏχειοθήκη"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία ονόματος Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "μη αναμενόμενη σÏνταξη Ï€Ïότασης COPY: «%s»"
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "μη έγκυÏο OID για μεγάλο αντικείμενο (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "το Ï€Ïαγματικό μήκος του αÏχείου (%lld) δεν αντιστοιχεί στο αναμενόμενο (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "δεν ήταν δυνατή η εÏÏεση κεφαλίδας για το αÏχείο «%s» στο αÏχείο tar"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "η επαναφοÏά δεδομένων εκτός σειÏάς δεν υποστηÏίζεται σε αυτήν τη μοÏφή αÏχειοθέτησης: απαιτείται «%s», αλλά Ï€Ïοηγείται της «%s» στο αÏχείο αÏχειοθέτησης."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "βÏέθηκε ατελής κεφαλίδα tar (%lu byte)"
+msgstr[1] "βÏέθηκε ατελής κεφαλίδα tar (%lu bytes)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "αλλοιωμένη κεφαλίδα tar βÏέθηκε σε %s (αναμενόμενη %d, υπολογισμένη %d) θέση αÏχείου %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "μη αναγνωÏισμένο όνομα τμήματος: «%s»"
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "έλλειψη υποδοχών on_exit_nicely"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "οι επιλογές -s/--schema-only και -a/--data-only δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "οι επιλογές -s/--schema-only και --include-foreign-data δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "η επιλογή --include-foreign-data δεν υποστηÏίζεται με παÏάλληλη δημιουÏγία αντιγÏάφων ασφαλείας"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "οι επιλογές -c/--clean και -a/--data-only δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "η επιλογή --if-exists απαιτεί την επιλογή -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "η επιλογή --on-conflict-do-nothing απαιτεί την επιλογή --inserts, --rows-per-insert, ή --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "μη αναγνωÏίσιμος αλγόÏιθμος συμπίεσης: «%s»"
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή συμπίεσης: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "η επιλογή συμπίεσης «%s» δεν υποστηÏίζεται ακόμα από το pg_dump"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "παÏάλληλο αντίγÏαφο ασφαλείας υποστηÏίζεται μόνο από μοÏφή καταλόγου"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "το τελευταίο ενσωματωμένο OID είναι %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "δεν βÏέθηκαν σχήματα που να ταιÏιάζουν"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "δεν βÏέθηκαν πίνακες που να ταιÏιάζουν"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "δεν βÏέθηκαν επεκτάσεις που να ταιÏιάζουν"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s αποθέτει μια βάση δεδομένων ως αÏχείο κειμένου ή σε άλλες μοÏφές.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Γενικές επιλογές:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME αÏχείο εξόδου ή όνομα καταλόγου\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p μοÏφή αÏχείου εξόδου (Ï€ÏοσαÏμοσμένη, κατάλογος, tar,\n"
+" απλό κείμενο (Ï€Ïοεπιλογή))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM χÏησιμοποιήστε τόσες πολλές παÏάλληλες εÏγασίες για απόθεση\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose πεÏιφÏαστική λειτουÏγία\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης και, στη συνέχεια, έξοδος\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" συμπίεσε όπως οÏίζεται\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT αποτυγχάνει μετά την αναμονή TIMEOUT για το κλείδωμα πίνακα\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Επιλογές που ελέγχουν το πεÏιεχόμενο εξόδου:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only αποθέτει μόνο τα δεδομένα, όχι το σχήμα\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects πεÏιέλαβε μεγάλα αντικείμενα στην απόθεση\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " -b, --blobs (όπως --large-objects, παÏωχημένο)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-blobs εξαίÏεσε μεγάλα αντικείμενα στην απόθεση\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (όπως --no-large-objects, παÏωχημένο)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean καθάÏισε (εγκατάληψε) αντικείμενα βάσης δεδομένων Ï€Ïιν από την αναδημιουÏγία\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create συμπεÏιέλαβε εντολές για τη δημιουÏγία βάσης δεδομένων στην απόθεση\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN απόÏιψε μόνο τις καθοÏισμένες επεκτάσεις\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING απόθεσε τα δεδομένα στην κωδικοποίηση ENCODING\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN απόθεση μόνο για τα καθοÏισμένα σχήματα\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN να ΜΗΠαποθέσει τα καθοÏισμένα σχήματα\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner παÏάλειπε την αποκατάσταση της κυÏιότητας των αντικειμένων στη\n"
+" μοÏφή Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only απόθεση μόνο το σχήμα, χωÏίς δεδομένα\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME όνομα χÏήστη υπεÏ-χÏήστη που θα χÏησιμοποιηθεί σε μοÏφή Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=PATTERN απόθεση μόνο των καθοÏισμένων πινάκων\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN να ΜΗΠαποθέτει τους καθοÏισμένους πίνακες\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges να ΜΗΠαποθέτει δικαιώματα (εκχώÏηση/ανάκληση)\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade μόνο για χÏήση μόνο από βοηθητικά Ï€ÏογÏάμματα αναβάθμισης\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts απόθεσε δεδομένα ως εντολές INSERT με ονόματα στηλών\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting απενεÏγοποίησε την παÏάθεση δολαÏίου, χÏήση τυποποιημένης παÏάθεσης SQL\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers απενεÏγοποίησε τα εναÏσματα κατά την επαναφοÏά δεδομένων-μόνο\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security ενεÏγοποιήστε την ασφάλεια σειÏών (απόθεση μόνο του πεÏιεχομένου που ο χÏήστης έχει\n"
+" Ï€Ïόσβαση)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=PATTERN\n"
+" να ΜΗΠαποθέσει τους οÏισμένους πίνακες, πεÏιλαμβάνοντας\n"
+" απογονικοÏÏ‚ και κατατμημένους πίνακες\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN να ΜΗΠαποθέσει δεδομένα για τους καθοÏισμένους πίνακες\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=PATTERN\n"
+" να ΜΗΠαποθέσει δεδομένα για τους οÏισμένους πίνακες,\n"
+" πεÏιλαμβάνοντας απογονικοÏÏ‚ και κατατμημένους πίνακες\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM παÏάκαμψε την Ï€Ïοεπιλεγμένη ÏÏθμιση για extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists χÏησιμοποίησε το IF EXISTS κατά την εγκαταλήψη αντικειμένων\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" πεÏιέλαβε δεδομένα ξένων πινάκων για\n"
+" διακομιστές που ταιÏιάζουν με PATTERN\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts απόθεσε δεδομένα ως εντολές INSERT, αντί για COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root φόÏτωσε διαχωÏίσματα μέσω του Î²Î±ÏƒÎ¹ÎºÎ¿Ï Ï€Î¯Î½Î±ÎºÎ±\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments να μην αποθέσει σχόλια\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications να μην αποθέσει δημοσιεÏσεις\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels να μην αποθέσει αντιστοιχίσεις ετικετών ασφαλείας\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-publications να μην αποθέσει συνδÏομές\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method να μην αποθέσει μεθόδους Ï€Ïόσβασης πινάκων\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces να μην αποθέσει αναθέσεις πινακοχώÏος\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression να μην αποθέσει τις μεθόδους συμπίεσης TOAST\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data να μην αποθέσει μη δεδομένα μη-καταγÏαμένου πίνακα\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing Ï€Ïόσθεσε ON CONFLICT DO NOTHING στις εντολές INSERT\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers παÏάθεσε όλα τα αναγνωÏιστικά, ακόμα και αν δεν είναι λέξεις κλειδιά\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS αÏιθμός γÏαμμών ανά INSERT; υπονοεί --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION απόθεσε ονομασμένες ενότητες (Ï€Ïο-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable ανάμενε έως ότου η απόθεση να μποÏεί να Ï„Ïέξει χωÏίς ανωμαλίες\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT χÏησιμοποίησε το δοσμένο στιγμιότυπο για την απόθεση\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names απαίτησε τα μοτίβα πεÏίληψης πίνακα ή/και σχήματος να\n"
+" αντιστοιχήσουν τουλάχιστον μία οντότητα το καθένα\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=PATTERN απόθεσε μόνο τους οÏισμένους πίνακες, πεÏιλαμβάνοντας\n"
+" απογονικοÏÏ‚ και κατατμημένους πίνακες\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" χÏησιμοποιήσε τις εντολές SET SESSION AUTHORIZATION αντί των\n"
+" ALTER OWNER για τον οÏισμό ιδιοκτησίας\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σÏνδεσης:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για απόθεση\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME σÏνδεση ως ο οÏισμένος χÏήστης βάσης δεδομένων\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης (Ï€Ïέπει να συμβεί αυτόματα)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME κάνε SET ROLE Ï€Ïιν την απόθεση\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν παÏέχεται όνομα βάσης δεδομένων, τότε χÏησιμοποιείται η μεταβλητή\n"
+"πεÏιβάλλοντος PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "καθοÏίστηκε μη έγκυÏη κωδικοποίηση Ï€ÏογÏάμματος-πελάτη «%s»"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "οι παÏάλληλες αποθέσεις δεν υποστηÏίζονται από αυτήν την έκδοση διακομιστή"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "οÏίστηκε μη έγκυÏη μοÏφή εξόδου «%s»"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ακατάλληλο αναγνωÏισμένο όνομα (πάÏα πολλά διάστικτα ονόματα): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "δεν βÏέθηκαν σχήματα που να ταιÏιάζουν με το μοτίβο «%s»"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "δεν βÏέθηκαν επεκτάσεις που ταιÏιάζουν με το μοτίβο «%s»"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "δεν βÏέθηκαν ξένοι διακομιστές που να ταιÏιάζουν με το μοτίβο «%s»"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ακατάλληλο όνομα σχέσης (πολλά διάστικτα ονόματα): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "δεν βÏέθηκαν πίνακες που να ταιÏιάζουν για το μοτίβο «%s»"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "οι παÏαπομπές Î¼ÎµÏ„Î±Î¾Ï Î²Î¬ÏƒÎµÏ‰Î½ δεδομένων δεν είναι υλοποιημένες: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "αποθέτει τα δεδομένα του πίνακα «%s.%s»"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Η απόθεση των πεÏιεχομένων του πίνακα «%s» απέτυχε: PQgetCopyData() απέτυχε."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Μήνυμα σφάλματος από διακομιστή: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "Η εντολή ήταν: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Η απόθεση των πεÏιεχομένων του πίνακα «%s» απέτυχε: PQgetResult() απέτυχε."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "λανθασμένος αÏιθμός πεδίων που ανακτήθηκαν από τον πίνακα «%s»"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "αποθήκευση οÏÎ¹ÏƒÎ¼Î¿Ï Î²Î¬ÏƒÎ·Ï‚ δεδομένων"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "μη αναγνωÏίσιμος πάÏοχος εντοπιότητας: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "αποθηκεÏει encoding = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "αποθηκεÏει standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "δεν ήταν δυνατή η ανάλυση του αποτελέσματος της current_schemas()"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "αποθηκεÏει search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "ανάγνωση μεγάλων αντικειμένων"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "αποθηκεÏει μεγάλων αντικειμένων"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "σφάλμα κατά την ανάγνωση %u μεγάλου αντικειμένου: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "διαβάζει πολιτικές ασφαλείας επιπέδου σειÏάς"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "μη αναμενόμενος Ï„Ïπος εντολής πολιτικής: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17857
+#: pg_dump.c:17859 pg_dump.c:18480
+#, c-format
+msgid "could not parse %s array"
+msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας %s"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "οι συνδÏομές δεν αποÏÏίπτονται, επειδή ο Ï„Ïέχων χÏήστης δεν είναι υπεÏχÏήστης"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "δεν ήταν δυνατή η εÏÏεση γονικής επέκτασης για %s %s"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "το σχήμα με %u OID δεν υπάÏχει"
+
+#: pg_dump.c:6776 pg_dump.c:17121
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "απέτυχε ο έλεγχος ακεÏαιότητας, ο γονικός πίνακας με OID %u της ακολουθίας με OID %u δεν βÏέθηκε"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "απέτυχε ο έλεγχος ακεÏαιότηταςς, το OID %u πίνακα που εμφανίζεται στο pg_partitioned_table δεν βÏέθηκε"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "μη αναγνωÏίσιμο OID %u πίνακα"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "μη έγκυÏα δεδομένα ευÏετηÏίου για τον πίνακα «%s»"
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "απέτυχε ο έλεγχος ακεÏαιότητας, ο γονικός πίνακας με OID %u της καταχώÏησης pg_rewrite με OID %u δεν βÏέθηκε"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "το εÏώτημα παÏήγαγε null πίνακα αναφοÏάς για το έναυσμα ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s» στον πίνακα «%s» (OID του πίνακα: %u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "μη έγκυÏα δεδομένα στηλών στον πίνακα «%s»"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "μη έγκυÏη αÏίθμηση στηλών στον πίνακα «%s»"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "εÏÏεση Ï€Ïοεπιλεγμένων εκφÏάσεων πίνακα"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "μη έγκυÏη τιμή adnum %d για τον πίνακα «%s»"
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "εÏÏεση πεÏιοÏισμών ελέγχου για τον πίνακα"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "αναμενόμενος %d πεÏιοÏισμός ελέγχου στον πίνακα «%s», αλλά βÏήκε %d"
+msgstr[1] "αναμενόμενοι %d πεÏιοÏισμοί ελέγχου στον πίνακα «%s», αλλά βÏήκε %d"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Οι κατάλογοι συστήματος ενδέχεται να είναι αλλοιωμένοι."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "το σχήμα με OID %u δεν υπάÏχει"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "μη υποστηÏιζόμενα pg_init_privs entry: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype του Ï„Ïπου δεδομένων «%s» φαίνεται να μην είναι έγκυÏο"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "μη αναγνωÏίσιμη τιμή provolatile για τη συνάÏτηση «%s»"
+
+#: pg_dump.c:12103 pg_dump.c:13948
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "μη αναγνωÏίσιμη τιμή proparallel για τη συνάÏτηση «%s»"
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "δεν ήταν δυνατή η εÏÏεση οÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ…Î½Î¬Î½Ï„Î·ÏƒÎ·Ï‚ για την συνάÏτηση με OID %u"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "πλαστή τιμή στο πεδίο pg_cast.castfunc ή pg_cast.castmethod"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "πλαστή τιμή στο πεδίο pg_cast.castmethod"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "πλαστός οÏισμός μετασχηματισμοÏ, τουλάχιστον μία από trffromsql και trftosql θα Ï€Ïέπει να είναι μη μηδενική"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "πλαστή τιμή στο πεδίο pg_transform.trffromsql"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "πλαστή τιμή στο πεδίοpg_transform.trftosql"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "χειÏιστές postfix δεν υποστηÏίζεται πλέον (χειÏιστής «%s»)"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "δεν ήταν δυνατή η εÏÏεση χειÏιστή με OID %s"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "μη έγκυÏος Ï„Ïπος «%c» για την μεθόδο Ï€Ïόσβασης «%s»"
+
+#: pg_dump.c:13443
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "μη αναγνωÏίσιμος πάÏοχος συÏÏαφής: %s"
+
+#: pg_dump.c:13867
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "μη αναγνωÏίσιμη τιμή aggfinalmodify για το συγκεντÏωτικό «%s»"
+
+#: pg_dump.c:13923
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "μη αναγνωÏίσιμη τιμή aggmfinalmodify για το συγκεντÏωτικό «%s»"
+
+#: pg_dump.c:14640
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "μη αναγνωÏίσιμος Ï„Ïπος αντικειμένου σε Ï€Ïοεπιλεγμένα δικαιώματα: %d"
+
+#: pg_dump.c:14656
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "δεν ήταν δυνατή η ανάλυση της Ï€Ïοεπιλεγμένης λίστας ACL (%s)"
+
+#: pg_dump.c:14738
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "δεν μπόÏεσε να αναλÏσει την αÏχική λίστα ACL (%s) ή την Ï€Ïοεπιλεγμένη (%s) για το αντικείμενο «%s» (%s)"
+
+#: pg_dump.c:14763
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "δεν μπόÏεσε να αναλÏσει τη λίστα ACL (%s) ή την Ï€Ïοεπιλογή (%s) για το αντικείμενο «%s» (%s)"
+
+#: pg_dump.c:15304
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "το εÏώτημα για τη λήψη οÏÎ¹ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ όψης «%s» δεν επέστÏεψε δεδομένα"
+
+#: pg_dump.c:15307
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "το εÏώτημα για τη λήψη οÏÎ¹ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ όψης «%s» επέστÏεψε πεÏισσότεÏους από έναν οÏισμοÏÏ‚"
+
+#: pg_dump.c:15314
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "ο οÏισμός της όψης «%s» φαίνεται να είναι κενός (μηδενικό μήκος)"
+
+#: pg_dump.c:15398
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS δεν υποστηÏίζεται πλέον (πίνακας «%s»)"
+
+#: pg_dump.c:16322
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "μη έγκυÏος αÏιθμός στήλης %d για τον πίνακα «%s»"
+
+#: pg_dump.c:16400
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "δεν ήταν δυνατή η ανάλυση στηλών στατιστικής ευÏετηÏίου"
+
+#: pg_dump.c:16402
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "δεν ήταν δυνατή η ανάλυση ευÏετηÏίου στατιστικών τιμών"
+
+#: pg_dump.c:16404
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "ασυμφωνία αÏÎ¹Î¸Î¼Î¿Ï ÏƒÏ„Î·Î»ÏŽÎ½ και τιμών για στατιστικά στοιχεία ευÏετηÏίου"
+
+#: pg_dump.c:16620
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "λείπει ευÏετήÏιο για τον πεÏιοÏισμό «%s»"
+
+#: pg_dump.c:16855
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "μη αναγνωÏίσιμος Ï„Ïπος πεÏιοÏισμοÏ: %c"
+
+#: pg_dump.c:16956 pg_dump.c:17185
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "εÏώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστÏεψε %d γÏαμμή (αναμένεται 1)"
+msgstr[1] "εÏώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστÏεψε %d γÏαμμές (αναμένεται 1)"
+
+#: pg_dump.c:16988
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "μη αναγνωÏίσιμος Ï„Ïπος ακολουθίας: %s"
+
+#: pg_dump.c:17277
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "μη αναγνωÏίσιμος Ï„Ïπος tgtype: %d"
+
+#: pg_dump.c:17349
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "μη έγκυÏη συμβολοσειÏά παÏαμέτÏου (%s) για το έναυσμα «%s» στον πίνακα «%s»"
+
+#: pg_dump.c:17618
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "εÏώτημα για τη λήψη κανόνα «%s» για τον πίνακα «%s» απέτυχε: επιστÏάφηκε εσφαλμένος αÏιθμός γÏαμμών"
+
+#: pg_dump.c:17771
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "δεν ήταν δυνατή η εÏÏεση της αναφεÏόμενης επέκτασης %u"
+
+#: pg_dump.c:17861
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "ασυμφωνία αÏÎ¹Î¸Î¼Î¿Ï Î´Î¹Î±Î¼Î¿Ïφώσεων και συνθηκών για επέκταση"
+
+#: pg_dump.c:17993
+#, c-format
+msgid "reading dependency data"
+msgstr "ανάγνωση δεδομένων εξάÏτησης"
+
+#: pg_dump.c:18079
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "δεν αναφέÏεται αντικείμενο %u %u"
+
+#: pg_dump.c:18090
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "μη αναφεÏόμενο αντικείμενο %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "μη έγκυÏο dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "μη έγκυÏη εξάÏτηση %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός βÏόχου εξάÏτησης"
+
+#: pg_dump_sort.c:1276
+#, 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] "υπάÏχουν κυκλικοί πεÏιοÏισμοί ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎµ αυτόν τον πίνακα:"
+msgstr[1] "υπάÏχουν κυκλικοί πεÏιοÏισμοί ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎµ αυτοÏÏ‚ τους πίνακες:"
+
+#: pg_dump_sort.c:1281
+#, 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:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "δεν ήταν δυνατή η επίλυση του βÏόχου εξάÏτησης Î¼ÎµÏ„Î±Î¾Ï Î±Ï…Ï„ÏŽÎ½ των στοιχείων:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "επιλογή --exclude-database δεν μποÏεί να χÏησιμοποιηθεί μαζί με -g/--globals-only, -r/--roles-only, ή -t/--tablespaces-only"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "οι επιλογές -g/--globals-only και -r/--roles-only δεν μποÏοÏν να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "οι επιλογές -g/--globals-only μόνο και -t/--tablespaces-only δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "οι επιλογές -r/--roles-only και -t/--tablespaces-only δεν μποÏοÏν να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "δεν ήταν δυνατή η σÏνδεση στη βάση δεδομένων «%s»"
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"δεν ήταν δυνατή η σÏνδεση με τις βάσεις δεδομένων \"postgres\" ή \"Template1\"\n"
+"ΠαÏακαλώ καθοÏίστε μία εναλλακτική βάση δεδομένων."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s εξάγει μία συστάδα βάσεων δεδομένων PostgreSQL σε ένα αÏχείο σεναÏίου SQL.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME όνομα αÏχείου εξόδου\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean καθάÏισε (εγκατάληψε) βάσεις δεδομένων Ï€Ïιν από την αναδημιουÏγία\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only απόθεσε μόνο καθολικά αντικείμενα, όχι βάσεις δεδομένων\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner παÏάλειψε την αποκατάσταση της κυÏιότητας αντικειμένων\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only απόθεσε μόνο Ïόλους, όχι βάσεις δεδομένων ή πινακοχώÏους\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME όνομα υπεÏχÏήστη για να χÏησιμοποιηθεί στην απόθεση\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only απόθεσε μόνο πινακοχώÏους, όχι βάσεις δεδομένων ή Ïόλους\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN εξαίÏεσε βάσεις δεδομένων των οποίων το όνομα ταιÏιάζει με PATTERN\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords να μην αποθέσει κωδικοÏÏ‚ Ï€Ïόσβασης για Ïόλους\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR σÏνδεση με χÏήση συμβολοσειÏάς σÏνδεσης\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr ""
+" -l, --database=DBNAME εναλλακτική Ï€Ïοεπιλεγμένη βάση δεδομένων\n"
+"\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν χÏησιμοποιηθεί -f/--file , τότε η δέσμη ενεÏγειών SQL θα εγγÏαφεί στη τυπική\n"
+"έξοδο.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "όνομα Ïόλου που αÏχίζει «pg_» παÏαλείπεται (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "δεν μπόÏεσε να βÏεθεί νόμιμη σειÏά ταξινόμησης για συνδÏομές Ïόλου «%s»"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για την παÏάμετÏο «%s»"
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για τον πινακοχώÏο «%s»"
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "εξαιÏεί τη βάση δεδομένων «%s»"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "αποθέτει τη βάση δεδομένων «%s»"
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump απέτυχε στη βάση δεδομένων «%s», εξέÏχεται"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το εκ νέου άνοιγμα του αÏχείου εξόδου «%s»: %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "εκτελείται «%s»"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "δεν ήταν δυνατή η απόκτηση έκδοσης διακομιστή"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "δεν ήταν δυνατή η ανάλυση έκδοσης διακομιστή «%s»"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "εκτελείται %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "ένα από τα -d/--dbname και -f/--file Ï€Ïέπει να καθοÏιστεί"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "οι επιλογές -d/--dbname και -f/--file δεν μποÏοÏν να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "οι επιλογές -C/--create και -1/--single-transaction δεν μποÏοÏν να χÏησιμοποιηθοÏν μαζί"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "δεν είναι δυνατό να οÏιστοÏν μαζί --single-transaction και multiple jobs"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "μη αναγνωÏισμένη μοÏφή αÏχειοθέτησης «%s»· παÏακαλώ καθοÏίστε «c», «d» ή «t»"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "σφάλματα που παÏαβλέφθηκαν κατά την επαναφοÏά: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s επαναφέÏει μια βάση δεδομένων PostgreSQL από μια αÏχειοθήκη που δημιουÏγήθηκε από τη pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME σÏνδεση με τη βάσης δεδομένων με όνομα\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME όνομα αÏχείου εξόδου (- για stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t μοÏφή αÏχείου αντιγÏάφου ασφαλείας (θα Ï€Ïέπει να είναι αυτόματη)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list εκτÏπωσε συνοπτικό TOC της αÏχειοθήκης\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose πεÏιφÏαστική λειτουÏγία\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Επιλογές που ελέγχουν την επαναφοÏά:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only επαναφέÏε μόνο τα δεδομένα, όχι το σχήμα\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create δημιοÏÏγησε τη βάσης δεδομένων Ï€ÏοοÏισμοÏ\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error να εξέλθει σε σφάλμα, η Ï€Ïοεπιλογή είναι να συνεχίσει\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME επανάφεÏε το ευÏετήÏιο με όνομα\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM χÏησιμοποίησε τόσες πολλές παÏάλληλες εÏγασίες για την επαναφοÏά\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME χÏησιμοποίησε τον πίνακα πεÏιεχομένων από αυτό το αÏχείο για\n"
+" επιλογή/ταξινόμηση εξόδου\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME επανάφεÏε μόνο αντικείμενα σε αυτό το σχήμα\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME να μην επαναφέÏει αντικείμενα από αυτό το σχήμα\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) επανάφεÏε την καθοÏισμένη συνάÏτηση\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only επανάφεÏε μόνο το σχήμα, χωÏίς δεδομένα\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME όνομα υπεÏχÏήστη για χÏήση κατά την απενεÏγοποίηση εναυσμάτων\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME επανάφεÏε την καθοÏισμένη σχέση (πίνακας, Ï€Ïοβολή κ.λπ.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr ""
+" -T, --trigger=NAME επανάφεÏε το καθοÏισμένο έναυσμα\n"
+"\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges παÏάλειπε την επαναφοÏά των δικαιωμάτων Ï€Ïόσβασης (εκχώÏηση/ανάκληση)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction επανάφεÏε ως μεμονωμένη συναλλαγή\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security ενεÏγοποίησε ασφαλεία σειÏάς\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments να μην επαναφέÏεις σχόλια\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables να μην επαναφέÏεις δεδομένα πινάκων που δεν ήταν\n"
+" δυνατό να δημιουÏγήθουν\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications να μην επαναφέÏεις δημοσιεÏσεις\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels να μην επαναφέÏεις ετικέτες ασφαλείας\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-publications να μην επαναφέÏεις συνδÏομές\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method να μην επαναφέÏει μεθόδους Ï€Ïόσβασης πινάκων\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces να μην επαναφέÏεις αναθέσεις πινακοχώÏων\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION επανάφεÏε ονομασμένες ενότητες (Ï€Ïο-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME κάνε SET ROLE Ï€Ïιν την επαναφοÏά\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Οι επιλογές -I, -n, -N, -P, -t, -T και --section μποÏοÏν να συνδυαστοÏν και να καθοÏιστοÏν\n"
+"πολλές φοÏές για την επιλογή πολλών αντικειμένων.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν παÏέχεται όνομα αÏχείου εισόδου, τότε χÏησιμοποιείται η τυπική είσοδος.\n"
+"\n"
+
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+#~ msgstr " --no-synchronized-snapshots να μην χÏησιμοποιήσει συγχÏονισμένα στιγμιότυπα σε παÏάλληλες εÏγασίες\n"
+
+#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+#~ msgstr " -Z, --compress=0-9 επίπεδο συμπίεσης για συμπιεσμένες μοÏφές\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Τα συγχÏονισμένα στιγμιότυπα δεν υποστηÏίζονται από αυτήν την έκδοση διακομιστή.\n"
+#~ "Εκτελέστε με --no-synchronized-snapshots, εάν δεν χÏειάζεστε\n"
+#~ "συγχÏονισμένα στιγμιότυπα."
+
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Τα συγχÏονισμένα στιγμιότυπα σε διακομιστές αναμονής δεν υποστηÏίζονται από αυτήν την έκδοση διακομιστή.\n"
+#~ "Εκτελέστε με --no-synchronized-snapshots, εάν δεν χÏειάζεστε\n"
+#~ "συγχÏονισμένα στιγμιότυπα."
+
+#~ msgid "The command was: %s"
+#~ msgstr "Η εντολή ήταν: %s"
+
+#~ msgid "WSAStartup failed: %d"
+#~ msgstr "WSAStartup απέτυχε: %d"
+
+#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+#~ msgstr "δεν ήταν δυνατή η σωστή απόθεση της συνάÏτησης συγκεντÏωτικών αποτελεσμάτων %s για αυτήν την έκδοση της βάσης δεδομένων· παÏαβλέπεται"
+
+#~ msgid "bogus value in proargmodes array"
+#~ msgstr "πλαστή τιμή στη συστοιχία proargmodes"
+
+#~ msgid "cannot restore from compressed archive (compression not supported in this installation)"
+#~ msgstr "δεν είναι δυνατή η επαναφοÏά από συμπιεσμένη αÏχειοθήκη (η συμπίεση δεν υποστηÏίζεται σε αυτήν την εγκατάσταση)"
+
+#~ msgid "compression level must be in range 0..9"
+#~ msgstr "το επίπεδο συμπίεσης Ï€Ïέπει να βÏίσκεται στο εÏÏος 0..9"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "σÏνδεση στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#~ msgid "could not close blob data file: %m"
+#~ msgstr "δεν μπόÏεσε να κλείσει το αÏχείο δεδομένων μεγάλων αντικειμένων: %m"
+
+#~ msgid "could not close blobs TOC file: %m"
+#~ msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου TOC μεγάλων αντικειμένων: %m"
+
+#~ msgid "could not close tar member"
+#~ msgstr "δεν ήταν δυνατό το κλείσιμο μέλους tar"
+
+#~ msgid "could not connect to database \"%s\": %s"
+#~ msgstr "δεν ήταν δυνατή η σÏνδεση στη βάση δεδομένων «%s»: %s"
+
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m"
+
+#~ msgid "could not open temporary file"
+#~ msgstr "δεν ήταν δυνατό το άνοιγμα του Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου"
+
+#~ msgid "could not parse extension condition array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας Ï€Ïοϋποθέσεων επέκτασης"
+
+#~ msgid "could not parse extension configuration array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας ÏÏθμισεων επέκτασης"
+
+#~ msgid "could not parse proallargtypes array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proallargtypes"
+
+#~ msgid "could not parse proargmodes array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proargmodes"
+
+#~ msgid "could not parse proargnames array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proargnames"
+
+#~ msgid "could not parse proconfig array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας proconfig"
+
+#~ msgid "could not parse subpublications array"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της συστοιχίας υποδημοσιεÏσεων"
+
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»"
+
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)"
+#~ msgstr "δεν ήταν δυνατή η εγγÏαφή σε μεγάλο αντικείμενο (αποτέλεσμα: %lu, αναμένεται: %lu)"
+
+#~ msgid "extra_float_digits must be in range -15..3"
+#~ msgstr "extra_float_digits Ï€Ïέπει να βÏίσκονται στο εÏÏος -15..3"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "finding check constraints for table \"%s.%s\""
+#~ msgstr "εÏÏεση πεÏιοÏισμών ελέγχου για τον πίνακα «%s.%s»"
+
+#~ msgid "finding the columns and types of table \"%s.%s\""
+#~ msgstr "εÏÏεση των στηλών και των Ï„Ïπων του πίνακα «%s.%s»"
+
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»"
+
+#~ msgid "invalid compression code: %d"
+#~ msgstr "μη έγκυÏος κωδικός συμπίεσης: %d"
+
+#~ msgid "invalid number of parallel jobs"
+#~ msgstr "μη έγκυÏος αÏιθμός παÏάλληλων εÏγασιών"
+
+#~ msgid "maximum number of parallel jobs is %d"
+#~ msgstr "ο μέγιστος αÏιθμός παÏάλληλων εÏγασιών είναι %d"
+
+#~ msgid "not built with zlib support"
+#~ msgstr "δεν έχει κατασκευαστεί με υποστήÏιξη zlib"
+
+#~ msgid "owner of aggregate function \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της συνάÏτησης συγκεντÏωτικών αποτελεσμάτων «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of data type \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του Ï„Ïπου δεδομένων «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of function \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της συνάÏτησης «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of operator \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του χειÏιστή «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of operator class \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της κλάσης χειÏιστή «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of operator family \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της οικογένειας χειÏιστών «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of publication \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της δημοσίευσης «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of schema \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του σχήματος «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of subscription \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος της συνδÏομής «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "owner of table \"%s\" appears to be invalid"
+#~ msgstr "ο κάτοχος του πίνακα «%s» φαίνεται να μην είναι έγκυÏος"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
+
+#~ msgid "reading foreign key constraints for table \"%s.%s\""
+#~ msgstr "ανάγνωση πεÏιοÏισμών ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î³Î¹Î± τον πίνακα «%s.%s»"
+
+#~ msgid "reading indexes for table \"%s.%s\""
+#~ msgstr "ανάγνωση ευÏετηÏίων για τον πίνακα «%s.%s»"
+
+#~ msgid "reading policies for table \"%s.%s\""
+#~ msgstr "ανάγνωση πολιτικών για τον πίνακα «%s.%s»"
+
+#~ msgid "reading row security enabled for table \"%s.%s\""
+#~ msgstr "ανάγνωση ενεÏγοποιημένης ασφάλειας γÏαμμής για τον πίνακα «%s.%s»"
+
+#~ msgid "reading triggers for table \"%s.%s\""
+#~ msgstr "ανάγνωση εναυσμάτων για τον πίνακα «%s.%s»"
+
+#~ msgid "requested compression not available in this installation -- archive will be uncompressed"
+#~ msgstr "η συμπίεση που ζητήθηκε δεν είναι διαθέσιμη σε αυτήν την εγκατάσταση -- η αÏχειοθήκη θα είναι ασυμπίεστη"
+
+#~ msgid "rows-per-insert must be in range %d..%d"
+#~ msgstr "rows-per-insert Ï€Ïέπει να βÏίσκονται στο εÏÏος %d..%d"
+
+#~ msgid "select() failed: %m"
+#~ msgstr "απέτυχε το select(): %m"
diff --git a/src/bin/pg_dump/po/es.po b/src/bin/pg_dump/po/es.po
new file mode 100644
index 0000000..fe45d12
--- /dev/null
+++ b/src/bin/pg_dump/po/es.po
@@ -0,0 +1,2801 @@
+# Spanish message translation file for pg_dump
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Manuel Sugawara <masm@fciencias.unam.mx>, 2003.
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2007, 2009-2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2014, 2017, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:20+0000\n"
+"PO-Revision-Date: 2023-10-03 16:15+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "esta instalación no soporta compresión con %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "se encontró una cadena vacía donde se esperaba una opción de compresión"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "opción de compresión no reconocida: «%s»"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "la opción de compresión «%s» requiere un valor"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "el valor para la opción de compresión «%s» debe ser un entero"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "el valor para la opción de compresión «%s» debe ser un booleano"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "el algoritmo de compresión «%s» no acepta un nivel de compresión"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "el algoritmo de compresión «%s» espera un nivel de compresión entre %d y %d (por omisión %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ayudantes"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "el algoritmo de compresión «%s» no acepta modo de larga distancia"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binario «%s» no válido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "no se pudo leer el binario «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "leyendo las extensiones"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "identificando miembros de extensión"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "leyendo esquemas"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "leyendo las tablas definidas por el usuario"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "leyendo las funciones definidas por el usuario"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "leyendo los tipos definidos por el usuario"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "leyendo los lenguajes procedurales"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "leyendo las funciones de agregación definidas por el usuario"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "leyendo los operadores definidos por el usuario"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "leyendo los métodos de acceso definidos por el usuario"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "leyendo las clases de operadores definidos por el usuario"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "leyendo las familias de operadores definidas por el usuario"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "leyendo los procesadores (parsers) de búsqueda en texto definidos por el usuario"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "leyendo las plantillas de búsqueda en texto definidas por el usuario"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "leyendo los diccionarios de búsqueda en texto definidos por el usuario"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "leyendo las configuraciones de búsqueda en texto definidas por el usuario"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "leyendo los conectores de datos externos definidos por el usuario"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "leyendo los servidores foráneos definidas por el usuario"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "leyendo los privilegios por omisión"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "leyendo los ordenamientos definidos por el usuario"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "leyendo las conversiones definidas por el usuario"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "leyendo conversiones de tipo"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "leyendo las transformaciones"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "leyendo la información de herencia de las tablas"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "leyendo los disparadores por eventos"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "buscando tablas de extensión"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "buscando relaciones de herencia"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "leyendo la información de columnas para las tablas interesantes"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "marcando las columnas heredadas en las subtablas"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "leyendo datos de particionamiento"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "leyendo los índices"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "marcando índices en las tablas particionadas"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "leyendo estadísticas extendidas"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "leyendo las restricciones"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "leyendo los disparadores (triggers)"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "leyendo las reglas de reescritura"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "leyendo políticas"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "leyendo publicaciones"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "leyendo membresía de tablas en publicaciones"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "leyendo membresía de esquemas en publicaciones"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "leyendo las suscripciones"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "falló la revisión de integridad, el OID %u del padre de la tabla «%s» (OID %u) no se encontró"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "número de padres %d para la tabla «%s» no es válido"
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "no se pudo interpretar el arreglo numérico «%s»: demasiados números"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "no se pudo interpretar el arreglo numérico «%s»: carácter no válido en número"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "no se pudo inicializar la biblioteca de compresión: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "no se pudo cerrar el flujo comprimido: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "no se pudo comprimir datos: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "no se pudo descomprimir datos: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "no se pudo cerrar la biblioteca de compresión: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "no se pudo leer el archivo de entrada: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "no se pudo leer desde el archivo de entrada: fin de archivo"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "no se pudo crear un contexto de descompresión LZ4: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "no se pudo descomprimir: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "no se pudo liberar el contexto de descompresión LZ4: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "no se pudo terminar la compresión: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "no se pudo inicializar la compresión LZ4: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "no se pudo terminar la descompresión: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "no se pudo definir el parámetro de compresión «%s»: %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "no se pudo inicializar la biblioteca de compresión"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "no se pudo descomprimir datos: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "no se pudo leer el archivo de entrada: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "modo «%s» sin manejar"
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() falló: código de error %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "no se pudo crear los canales de comunicación: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "no se pudo crear el proceso hijo: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "orden no reconocida recibida del servidor principal: «%s»"
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "mensaje no válido recibido del proceso hijo: «%s»"
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"no se pudo obtener un lock en la relación «%s»\n"
+"Esto normalmente significa que alguien solicitó un lock ACCESS EXCLUSIVE en la tabla después de que el proceso pg_dump padre había obtenido el lock ACCESS SHARE en la tabla."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "un proceso hijo murió inesperadamente"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "no se pudo escribir al canal de comunicación: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: no se pudo crear el socket: código de error %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: no se pudo enlazar: código de error %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: no se pudo escuchar: código de error %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() falló: código de error %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: no se pudo crear el segundo socket: código de error %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: no se pudo conectar el socket: código de error %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: no se pudo aceptar la conexión: código de error %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "no se pudo cerrar el archivo de salida: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "elementos del archivo no están en el orden correcto de secciones"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "código de sección %d inesperado"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "la restauración en paralelo no está soportada con este formato de archivo"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "la restauración en paralelo no está soportada con archivos construidos con pg_dump anterior a 8.0"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "no se pudo restaurar desde archivo comprimido (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "conectando a la base de datos para reestablecimiento"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "las conexiones directas a la base de datos no están soportadas en archivadores pre-1.3"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "asumiendo reestablecimiento de sólo datos"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "eliminando %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "no se pudo encontrar dónde insertar IF EXISTS en la sentencia «%s»"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "precaución desde el archivo original: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "creando %s «%s.%s»"
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "creando %s «%s»"
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "conectando a nueva base de datos «%s»"
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "procesando %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "procesando datos de la tabla «%s.%s»"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "ejecutando %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "deshabilitando disparadores (triggers) para %s"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "habilitando disparadores (triggers) para %s"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "error interno -- WriteData no puede ser llamada fuera del contexto de una rutina DataDumper"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "la extracción de objetos grandes no está soportada en el formato seleccionado"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "se reestableció %d objeto grande"
+msgstr[1] "se reestablecieron %d objetos grandes"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "reestableciendo objeto grande con OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "no se pudo crear el objeto grande %u: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "no se pudo abrir el objeto grande %u: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "no se pudo abrir el archivo TOC «%s»: %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "línea ignorada: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "no se pudo encontrar una entrada para el ID %d"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "no se pudo cerrar el archivo TOC: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de salida «%s»: %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "no se pudo abrir el archivo de salida: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "se escribió %zu byte de los datos del objeto grande (resultado = %d)"
+msgstr[1] "se escribieron %zu bytes de los datos del objeto grande (resultado = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "no se pudo escribir en objeto grande: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "durante INICIALIZACIÓN:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "durante PROCESAMIENTO DE TABLA DE CONTENIDOS:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "durante FINALIZACIÓN:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "en entrada de la tabla de contenidos %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "dumpId incorrecto"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "dumpId de tabla incorrecto para elemento TABLE DATA"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "bandera de posición inesperada %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "el posición en el archivo es demasiado grande"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "nombre de directorio demasiado largo: «%s»"
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "el directorio «%s» no parece ser un archivador válido (no existe «toc.dat»)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de entrada «%s»: %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "no se pudo abrir el archivo de entrada: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "no se pudo leer el archivo de entrada: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "el archivo de entrada es demasiado corto (leidos %lu, esperados 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "el archivo de entrada parece ser un volcado de texto. Por favor use psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "el archivo de entrada no parece ser un archivador válido (¿demasiado corto?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "el archivo de entrada no parece ser un archivador válido"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "no se pudo cerrar el archivo de entrada: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "no se pudo abrir stdout para agregar datos: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "formato de archivo no reconocido «%d»"
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4466
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "terminó el elemento %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4479
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "el proceso hijo falló: código de salida %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "la entrada con ID %d está fuera de rango -- tal vez la tabla de contenido está corrupta"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "restaurar tablas WITH OIDS ya no está soportado"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "no se reconoce la codificación: «%s»"
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "elemento ENCODING no válido: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "elemento STDSTRINGS no válido: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "esquema «%s» no encontrado"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabla «%s» no encontrada"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "índice «%s» no encontrado"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "función «%s» no encontrada"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "disparador «%s» no encontrado"
+
+#: pg_backup_archiver.c:3201
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "no se pudo establecer el usuario de sesión a «%s»: %s"
+
+#: pg_backup_archiver.c:3333
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "no se pudo definir search_path a «%s»: %s"
+
+#: pg_backup_archiver.c:3394
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "no se pudo definir default_tablespace a %s: %s"
+
+#: pg_backup_archiver.c:3443
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "no se pudo definir default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3548
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "no se sabe cómo establecer el dueño para el objeto de tipo «%s»"
+
+#: pg_backup_archiver.c:3770
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "no se encontró la cadena mágica en el encabezado del archivo"
+
+#: pg_backup_archiver.c:3784
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "versión no soportada (%d.%d) en el encabezado del archivo"
+
+#: pg_backup_archiver.c:3789
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "revisión de integridad en el tamaño del entero (%lu) falló"
+
+#: pg_backup_archiver.c:3793
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "el archivador fue hecho en una máquina con enteros más grandes, algunas operaciones podrían fallar"
+
+#: pg_backup_archiver.c:3803
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "el formato esperado (%d) difiere del formato encontrado en el archivo (%d)"
+
+#: pg_backup_archiver.c:3825
+#, c-format
+msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available"
+msgstr "el archivo está comprimido, pero esta instalación no soporta compresión (%s) -- los datos no estarán disponibles"
+
+#: pg_backup_archiver.c:3861
+#, c-format
+msgid "invalid creation date in header"
+msgstr "la fecha de creación en el encabezado no es válida"
+
+#: pg_backup_archiver.c:3995
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "procesando el elemento %d %s %s"
+
+#: pg_backup_archiver.c:4070
+#, c-format
+msgid "entering main parallel loop"
+msgstr "ingresando al bucle paralelo principal"
+
+#: pg_backup_archiver.c:4081
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "saltando el elemento %d %s %s"
+
+#: pg_backup_archiver.c:4090
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "lanzando el elemento %d %s %s"
+
+#: pg_backup_archiver.c:4144
+#, c-format
+msgid "finished main parallel loop"
+msgstr "terminó el bucle paralelo principal"
+
+#: pg_backup_archiver.c:4180
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "procesando el elemento saltado %d %s %s"
+
+#: pg_backup_archiver.c:4785
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "la tabla «%s» no pudo ser creada, no se recuperarán sus datos"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "OID no válido para objeto grande"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "error durante el posicionamiento (seek) en el archivo: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "el bloque de datos %d tiene una posición de búsqueda incorrecta"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "tipo de bloque de datos (%d) no conocido al buscar en el archivador"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "no se pudo encontrar el bloque con ID %d en archivo -- posiblemente debido a una petición de restauración fuera de orden, la que no puede ser completada debido a que en el archivo de entrada no es reposicionable (seekable)"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "no se pudo encontrar el bloque con ID %d en archivo -- posiblemente el archivo está corrupto"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "se encontró un bloque no esperado ID (%d) mientras se leían los datos -- se esperaba %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "se encontró un bloque tipo %d no reconocido al restablecer el archivador"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "no se pudo determinar la posición (seek) en el archivo del archivador: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "no se pudo cerrar el archivo del archivador: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "sólo se pueden reabrir archivos de entrada"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "la restauración en paralelo desde entrada estándar (stdin) no está soportada"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "la restauración en paralelo desde un archivo no posicionable no está soportada"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "no se pudo posicionar (seek) en el archivo del archivador: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "compresor activo"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "no se pudo obtener server_version desde libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "abortando debido a que no coincide la versión del servidor"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "versión del servidor: %s; versión de %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ya está conectado a una base de datos"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "no se pudo hacer la conexión a la base de datos"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "falló la reconexión: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "la consulta falló: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "La consulta era: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la consulta regresó %d fila en lugar de una: %s"
+msgstr[1] "la consulta regresó %d filas en lugar de una: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sLa orden era: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "no se pudo ejecutar la consulta"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData regresó un error: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd regresó un error: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY falló para la tabla «%s»: %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "resultados extra inesperados durante el COPY de la tabla «%s»"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "no se pudo iniciar la transacción en la base de datos"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "no se pudo terminar la transacción a la base de datos"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "no se especificó un directorio de salida"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "no se pudo escribir al archivo de salida: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "no se pudo cerrar el archivo de datos: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo de datos «%s»: %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "no se pudo abrir el archivo de la tabla de contenidos de objetos grandes «%s» para su lectura: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "línea no válida en el archivo de la tabla de contenido de objetos grandes «%s»: «%s»"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "error al leer el archivo de la tabla de contenidos de objetos grandes «%s»"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo de la tabla de contenido de los objetos grandes «%s»: %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "no se pudo cerrar el archivo de datos LO: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "no se pudo escribir archivo TOC de LOs: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "no se pudo cerrar el archivo TOC de LOs: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "nombre de archivo demasiado largo: «%s»"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "no se puede leer este formato"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "no se pudo abrir el archivo de tabla de contenido «%s» para escribir: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "no se pudo abrir la tabla de contenido para escribir: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "la compresión no está soportada por el formato de salida tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "no se pudo abrir el archivo de tabla de contenido «%s» para leer: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "no se pudo abrir la tabla de contenido para leer: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "no se pudo encontrar el archivo «%s» en el archivador"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "no se pudo generar el nombre de archivo temporal: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "sintaxis de sentencia COPY inesperada: «%s»"
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "el OID del objeto grande no es válido (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "no se pudo abrir archivo temporal: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "el tamaño real del archivo (%lld) no coincide con el esperado (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "no se pudo encontrar el encabezado para el archivo «%s» en el archivo tar"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "la extracción de datos fuera de orden no está soportada en este formato: se requiere «%s», pero viene antes de «%s» en el archivador."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "se encontró un encabezado incompleto (%lu byte)"
+msgstr[1] "se encontró un encabezado incompleto (%lu bytes)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "se encontró un encabezado corrupto en %s (esperado %d, calculado %d) en la posición %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "nombre de sección «%s» no reconocido"
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "elementos on_exit_nicely agotados"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "las opciones -s/--schema-only y -a/--data-only no pueden usarse juntas"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "las opciones -s/--schema-only y --include-foreign-data no pueden usarse juntas"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "la opción --include-foreign-data no está soportado con respaldo en paralelo"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "las opciones -c/--clean y -a/--data-only no pueden usarse juntas"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "la opción --if-exists requiere la opción -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "la opción --on-conflict-do-nothing requiere la opción --inserts, --rows-per-insert o --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algoritmo de compresión no reconocido: «%s»"
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "especificación de compresión no válida: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "la opción de compresión «%s» no está soportada por pg_dump actualmente"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "el volcado en paralelo sólo está soportado por el formato «directory»"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "el último OID interno es %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "no se encontraron esquemas coincidentes"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "no se encontraron tablas coincidentes"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "no se encontraron extensiones coincidentes"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s extrae una base de datos en formato de texto o en otros formatos.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCIÓN]... [NOMBREDB]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opciones generales:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ARCHIVO nombre del archivo o directorio de salida\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p Formato del archivo de salida (c=personalizado, \n"
+" d=directorio, t=tar, p=texto (por omisión))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para volcar\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose modo verboso\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de version y salir\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=MÉTODO[:DETALLE]\n"
+" comprimir como se indica\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=SEGS espera a lo más SEGS segundos obtener un lock\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Opciones que controlan el contenido de la salida:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only extrae sólo los datos, no el esquema\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects incluir “large objects†en la extracción\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (igual que --large-objects, deprecado)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects excluir “large objects†en la extracción\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (igual que --no-large-objects, deprecado)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create incluye órdenes para crear la base de datos\n"
+" en la extracción\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATRÓN extrae sólo la o las extensiones nombradas\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=CODIF extrae los datos con la codificación CODIF\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATRÓN extrae sólo el o los esquemas nombrados\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATRÓN NO extrae el o los esquemas nombrados\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner en formato de sólo texto, no reestablece\n"
+" los dueños de los objetos\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only extrae sólo el esquema, no los datos\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME superusuario a utilizar en el volcado de texto\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=PATRÓN extrae sólo la o las tablas nombradas\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATRÓN NO extrae la o las tablas nombradas\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges no extrae los privilegios (grant/revoke)\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade sólo para uso de utilidades de upgrade\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts extrae los datos usando INSERT con nombres\n"
+" de columnas\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting deshabilita el uso de «delimitadores de dólar»,\n"
+" usa delimitadores de cadena estándares\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers deshabilita los disparadores (triggers) durante el\n"
+" restablecimiento de la extracción de sólo-datos\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security activa seguridad de filas (volcar sólo el\n"
+" contenido al que el usuario tiene acceso)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=PATRÓN\n"
+" NO extrae la o las tablas especificadas,\n"
+" incluyendo tablas hijas y particiones\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATRÓN NO extrae los datos de la(s) tablas nombradas\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=PATRÓN\n"
+" NO extrae datos para la o las tablas\n"
+" especificadas, incluyendo hijas y particiones\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM usa este valor para extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists usa IF EXISTS al eliminar objetos\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATRÓN\n"
+" incluye datos de tablas foráneas en servidores\n"
+" que coinciden con PATRÓN\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts extrae los datos usando INSERT, en vez de COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root cargar particiones a través de tabla raíz\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments no volcar los comentarios\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications no volcar las publicaciones\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels no volcar asignaciones de etiquetas de seguridad\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions no volcar las suscripciones\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-tablespaces no volcar métodos de acceso de tablas\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces no volcar asignaciones de tablespace\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression no volcar métodos de compresión TOAST\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data no volcar datos de tablas unlogged\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing agregar ON CONFLICT DO NOTHING a órdenes INSERT\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers entrecomilla todos los identificadores, incluso\n"
+" si no son palabras clave\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NUMFILAS número de filas por INSERT; implica --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECCIÓN volcar la sección nombrada (pre-data, data,\n"
+" post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable espera hasta que el respaldo pueda completarse\n"
+" sin anomalías\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT use el snapshot dado para la extracción\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names requerir al menos una coincidencia para cada patrón\n"
+" de nombre de tablas y esquemas\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=PATRÓN volcar sólo la o las tablas especificadas,\n"
+" incluyendo tablas hijas y particiones\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" usa órdenes SESSION AUTHORIZATION en lugar de\n"
+" ALTER OWNER para cambiar los dueño de los objetos\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=NOMBRE nombre de la base de datos que volcar\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ANFITRIÓN anfitrión de la base de datos o\n"
+" directorio del enchufe (socket)\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PUERTO número del puerto de la base de datos\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=USUARIO nombre de usuario con el cual conectarse\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir una contraseña\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password fuerza un prompt para la contraseña\n"
+" (debería ser automático)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROL ejecuta SET ROLE antes del volcado\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un nombre de base de datos, se utiliza el valor\n"
+"de la variable de ambiente PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte errores a <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "la codificación de cliente especificada «%s» no es válida"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "Los volcados en paralelo desde servidores standby no están soportados por esta versión de servidor."
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "el formato de salida especificado «%s» no es válido"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "el nombre no es válido (demasiados puntos): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "no se encontraron esquemas coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "no se encontraron extensiones coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "no se encontraron servidores foráneos coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "el nombre de relación no es válido (demasiados puntos): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "no se encontraron tablas coincidentes para el patrón «%s»"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "No está conectado a una base de datos."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "no están implementadas las referencias entre bases de datos: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "extrayendo el contenido de la tabla «%s.%s»"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetCopyData() falló."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Mensaje de error del servidor: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "La orden era: % s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetResult() falló."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "se obtuvo un número incorrecto de campos de la tabla «%s»"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "salvando las definiciones de la base de datos"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "proveedor de configuración regional no reconocido: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "salvando codificaciones = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "salvando standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "no se pudo interpretar la salida de current_schemas()"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "salvando search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "leyendo objetos grandes"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "salvando objetos grandes"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "error al leer el objeto grande %u: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "leyendo políticas de seguridad a nivel de registros"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "tipo de orden inesperada en política: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "no se pudo interpretar el arreglo %s"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "no se volcaron las suscripciones porque el usuario actual no es un superusuario"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "no se pudo encontrar la extensión padre para %s %s"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "no existe el esquema con OID %u"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u de la secuencia con OID %u"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "falló la revisión de integridad, el OID %u que aparece en pg_partitioned_table no se encontró"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "OID de tabla %u no reconocido"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "datos de índice inesperados para la tabla «%s»"
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u del elemento con OID %u de pg_rewrite"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "la consulta produjo un nombre de tabla nulo para la llave foránea del disparador \"%s\" en la tabla «%s» (OID de la tabla: %u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "información de columnas para la tabla «%s» inesperada"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "numeración de columnas no válida en la tabla «%s»"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "encontrando expresiones default de tablas"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "el valor de adnum %d para la tabla «%s» no es válido"
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "encontrando restricciones CHECK de tablas"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d"
+msgstr[1] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Los catálogos del sistema podrían estar corruptos."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "no existe el rol con OID %u"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "entrada en pg_init_privs no soportada: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "el typtype del tipo «%s» parece no ser válido"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "el valor del atributo «provolatile» para la función «%s» es desconocido"
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "el valor del atributo «proparallel» para la función «%s» es desconocido"
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "no se encontró la definición de la función con OID %u"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "valor no válido en los campos pg_cast.castfunc o pg_cast.castmethod"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "valor no válido en el campo pg_cast.castmethod"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "definición errónea de transformación; al menos uno de trffromsql y trftosql debe ser distinto de cero"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "valor erróneo en el campo pg_transform.trffromsql"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "valor erróneo en el campo pg_transform.trftosql"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "los operadores postfix ya no están soportados (operador «%s»)"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "no se pudo encontrar el operador con OID %s"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "el tipo «%c» para el método de acceso «%s» no es válido"
+
+#: pg_dump.c:13455 pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "proveedor de ordenamiento no reconocido: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ordenamiento \"%s\" no válido"
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "valor de aggfinalmodify no reconocido para la agregación «%s»"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "valor de aggmfinalmodify no reconocido para la agregación «%s»"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "tipo de objeto desconocido en privilegios por omisión: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "no se pudo interpretar la lista de ACL (%s)"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "no se pudo interpretar la lista ACL inicial (%s) o por defecto (%s) para el objeto «%s» (%s)"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "no se pudo interpretar la lista de ACL (%s) o por defecto (%s) para el objeto «%s» (%s)"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "la consulta para obtener la definición de la vista «%s» no regresó datos"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "la consulta para obtener la definición de la vista «%s» regresó más de una definición"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "la definición de la vista «%s» parece estar vacía (tamaño cero)"
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS ya no está soportado (tabla «%s»)"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "el número de columna %d no es válido para la tabla «%s»"
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "no se pudieron interpretar columnas de estadísticas de índices"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "no se pudieron interpretar valores de estadísticas de índices"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "no coincide el número de columnas con el de valores para estadísticas de índices"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "falta un índice para restricción «%s»"
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "tipo de restricción inesperado: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "la consulta para obtener los datos de la secuencia «%s» regresó %d entrada, pero se esperaba 1"
+msgstr[1] "la consulta para obtener los datos de la secuencia «%s» regresó %d entradas, pero se esperaba 1"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "tipo no reconocido de secuencia: %s"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "tgtype no esperado: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "argumento de cadena (%s) no válido para el disparador (trigger) «%s» en la tabla «%s»"
+
+#: pg_dump.c:17655
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "la consulta para obtener la regla «%s» asociada con la tabla «%s» falló: retornó un número incorrecto de renglones"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "no se pudo encontrar la extensión referenciada %u"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "no coincide el número de configuraciones con el de condiciones para extensión"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "obteniendo datos de dependencias"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "no existe el objeto referenciante %u %u"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "no existe el objeto referenciado %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "dumpId %d no válido"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "dependencia %d no válida"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "no se pudo identificar bucle de dependencia"
+
+#: pg_dump_sort.c:1276
+#, 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] "hay restricciones de llave foránea circulares en la siguiente tabla:"
+msgstr[1] "hay restricciones de llave foránea circulares entre las siguientes tablas:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Puede no ser capaz de restaurar el respaldo sin usar --disable-triggers o temporalmente eliminar las restricciones."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Considere usar un volcado completo en lugar de --data-only para evitar este problema."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "no se pudo resolver el bucle de dependencias entre los siguientes elementos:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s, pero no fue encontrado en el mismo directorio que «%s»"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "el programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "la opción --exclude-database no puede ser usada junto con -g/--globals-only, -r/--roles-only o -t/--tablespaces-only"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "las opciones -g/--globals-only y -r/--roles-only no pueden usarse juntas"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "las opciones -g/--globals-only y -t/--tablespaces-only no pueden usarse juntas"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "las opciones -r/--roles-only y -t/--tablespaces-only no pueden usarse juntas"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "no se pudo establecer la conexión a la base de datos «%s»"
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"no se pudo establecer la conexión a las bases de datos «postgres» o\n"
+"«template1». Por favor especifique una base de datos para conectarse."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extrae un cluster de bases de datos de PostgreSQL en un archivo\n"
+"guión (script) SQL.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCIÓN]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ARCHIVO nombre del archivo de salida\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only extrae sólo los objetos globales, no bases de datos\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner no reestablece los dueños de los objetos\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only extrae sólo los roles, no bases de datos\n"
+" ni tablespaces\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=NAME especifica el nombre del superusuario a usar en\n"
+" el volcado\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only extrae sólo los tablespaces, no bases de datos\n"
+" ni roles\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATRÓN excluir bases de datos cuyos nombres coinciden con el patrón\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords no extraer contraseñas para roles\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR conectar usando la cadena de conexión\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=NOMBRE especifica la base de datos a la cual conectarse\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se usa -f/--file, el volcado de SQL será escrito a la salida estándar.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "omitido nombre de rol que empieza con «pg_» (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "no se pudo encontrar un orden legal para membresías del rol «%s»"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "no se pudo interpretar la lista de control de acceso (%s) del parámetro «%s»"
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "no se pudo interpretar la lista de control de acceso (%s) del tablespace «%s»"
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "excluyendo base de datos «%s»"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "extrayendo base de datos «%s»"
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump falló en la base de datos «%s», saliendo"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "no se pudo reabrir el archivo de salida «%s»: %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "ejecutando «%s»"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "no se pudo obtener la versión del servidor"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "no se pudo interpretar la versión del servidor «%s»"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "ejecutando %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "una de las opciones -d/--dbname y -f/--file debe especificarse"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "las opciones -d/--dbname y -f/--file no pueden usarse juntas"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "las opciones -c/--clean y -1/--single-transaction no pueden usarse juntas"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "no se puede especificar --single-transaction junto con múltiples tareas"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "formato de archivo «%s» no reconocido; por favor especifique «c», «d» o «t»"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "errores ignorados durante la recuperación: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s reestablece una base de datos de PostgreSQL usando un archivo\n"
+"creado por pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPCIÓN]... [ARCHIVO]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NOMBRE nombre de la base de datos a la que conectarse\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=ARCHIVO nombre del archivo de salida (- para stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formato del volcado (debería ser automático)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr ""
+" -l, --list imprime una tabla resumida de contenidos\n"
+" del archivador\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose modo verboso\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Opciones que controlan la recuperación:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only reestablece sólo los datos, no el esquema\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create crea la base de datos de destino\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e, --exit-on-error abandonar al encontrar un error\n"
+" por omisión, se continúa la restauración\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOMBRE reestablece el índice nombrado\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=ARCHIVO usa la tabla de contenido especificada para ordenar\n"
+" la salida de este archivo\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME reestablece sólo los objetos en este esquema\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME no reestablecer los objetos en este esquema\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOMBRE(args) reestablece la función nombrada\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only reestablece el esquema únicamente, no los datos\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S, --superuser=NOMBRE especifica el nombre del superusuario que se usa\n"
+" para deshabilitar los disparadores (triggers)\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOMBRE reestablece la relación (tabla, vista, etc.) nombrada\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOMBRE reestablece el disparador (trigger) nombrado\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges no reestablece los privilegios (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction reestablece en una única transacción\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security activa seguridad de filas\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments no restaurar comentarios\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables no reestablece datos de tablas que no pudieron\n"
+" ser creadas\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications no restaurar publicaciones\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels no restaura etiquetas de seguridad\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions no restaurar suscripciones\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method no restaura métodos de acceso de tablas\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces no restaura asignaciones de tablespace\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECCIÓN reestablece la sección nombrada (pre-data, data\n"
+" post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME hace SET ROLE antes de restaurar\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Las opciones -I, -n, -N, -P, -t, -T, y --section pueden ser combinadas y especificadas\n"
+"varias veces para seleccionar varios objetos.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un archivo de entrada, se usa la entrada estándar.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/fr.po b/src/bin/pg_dump/po/fr.po
new file mode 100644
index 0000000..8084992
--- /dev/null
+++ b/src/bin/pg_dump/po/fr.po
@@ -0,0 +1,3597 @@
+# LANGUAGE message translation file for pg_dump
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 17:21+0000\n"
+"PO-Revision-Date: 2023-09-05 22:02+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "cette construction ne supporte pas la compression avec %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "option de compression inconnue : « %s »"
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "l'option de compression « %s » requiert une valeur"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "la valeur pour l'option de compression « %s » doit être un entier"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "la valeur pour l'option de compression « %s » doit être un booléen"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "l'algorithme de compression « %s » n'accepte pas un mode distance longue"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binaire « %s » invalide : %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "n'a pas pu lire le binaire « %s » : %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "lecture des extensions"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "identification des membres d'extension"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "lecture des schémas"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "lecture des tables utilisateur"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "lecture des fonctions utilisateur"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "lecture des types utilisateur"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "lecture des langages procéduraux"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "lecture des fonctions d'agrégats utilisateur"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "lecture des opérateurs utilisateur"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "lecture des méthodes d'accès définis par les utilisateurs"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "lecture des classes d'opérateurs utilisateur"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "lecture des familles d'opérateurs utilisateur"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "lecture des analyseurs utilisateur pour la recherche plein texte"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "lecture des modèles utilisateur pour la recherche plein texte"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "lecture des dictionnaires utilisateur pour la recherche plein texte"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "lecture des configurations utilisateur pour la recherche plein texte"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "lecture des wrappers de données distantes utilisateur"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "lecture des serveurs distants utilisateur"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "lecture des droits par défaut"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "lecture des collationnements utilisateurs"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "lecture des conversions utilisateur"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "lecture des conversions de type"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "lecture des transformations"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "lecture des informations d'héritage des tables"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "lecture des triggers sur évènement"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "recherche des tables d'extension"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "recherche des relations d'héritage"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "lecture des informations de colonnes des tables intéressantes"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "marquage des colonnes héritées dans les sous-tables"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "lecture des données de partitionnement"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "lecture des index"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "décrit les index des tables partitionnées"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "lecture des statistiques étendues"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "lecture des contraintes"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "lecture des triggers"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "lecture des règles de réécriture"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "lecture des politiques"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "lecture des publications"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "lecture des appartenances aux publications des tables"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "lecture des appartenances aux publications des schémas"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "lecture des souscriptions"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "vérification échouée, OID %u parent de la table « %s » (OID %u) introuvable"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "nombre de parents invalide (%d) pour la table « %s »"
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "n'a pas pu analyser le tableau numérique « %s » : trop de nombres"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "n'a pas pu analyser le tableau numérique « %s » : caractère invalide dans le nombre"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "n'a pas pu initialiser la bibliothèque de compression : %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "n'a pas pu fermer le flux de compression : %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "n'a pas pu compresser les données : %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "n'a pas pu décompresser les données : %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "n'a pas pu fermer la bibliothèque de compression : %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "n'a pas pu lire à partir du fichier en entrée : %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "n'a pas pu lire à partir du fichier en entrée : fin du fichier"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "n'a pas pu décompresser : %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "n'a pas pu terminer la compression : %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "n'a pas pu initialiser la bibliothèque de compression LZ4 : %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "n'a pas pu terminer la décompression : %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "n'a pas pu configurer le paramètre de compression « %s » : %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "n'a pas pu initialiser la bibliothèque de compression"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "n'a pas pu décompresser les données : %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "n'a pas pu lire à partir du fichier en entrée : %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "mode « %s » non géré"
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "échec de %s() : code d'erreur %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "n'a pas pu créer le canal de communication : %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "n'a pas pu créer le processus worker : %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "commande non reconnue reçue du leader : « %s »"
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "message invalide reçu du worker: « %s »"
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"impossible d'obtenir un verrou sur la relation « %s »\n"
+"Cela signifie en général que quelqu'un a demandé un verrou ACCESS EXCLUSIVE sur la table après que pg_dump ait obtenu son verrou ACCESS SHARE initial sur la table."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "un processus worker a subi un arrêt brutal inattendu"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "n'a pas pu écrire dans le canal de communication: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: n'a pas pu créer le socket: code d'erreur %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: n'a pas pu se lier: code d'erreur %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe : n'a pas pu se mettre en écoute: code d'erreur %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: échec de %s() : code d'erreur %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: n'a pas pu créer un deuxième socket: code d'erreur %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: n'a pas pu se connecter au socket: code d'erreur %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: n'a pas pu accepter de connexion: code d'erreur %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "n'a pas pu fermer le fichier en sortie : %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "les éléments de l'archive ne sont pas dans l'ordre correct de la section"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "code de section inattendu %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "la restauration parallélisée n'est pas supportée avec ce format de fichier d'archive"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "la restauration parallélisée n'est pas supportée avec les archives réalisées par un pg_dump antérieur à la 8.0"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "ne peut pas restaurer l'archive compressée (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "connexion à la base de données pour la restauration"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "les connexions directes à la base de données ne sont pas supportées dans les archives pre-1.3"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "a impliqué une restauration des données uniquement"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "suppression de %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "n'a pas pu trouver où insérer IF EXISTS dans l'instruction « %s »"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "message d'avertissement du fichier de sauvegarde original : %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "création de %s « %s.%s »"
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "création de %s « %s »"
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "connexion à la nouvelle base de données « %s »"
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "traitement de %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "traitement des données de la table « %s.%s »"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "exécution de %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "désactivation des triggers pour %s"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "activation des triggers pour %s"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "erreur interne -- WriteData ne peut pas être appelé en dehors du contexte de la routine DataDumper"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "la sauvegarde des « Large Objects » n'est pas supportée dans le format choisi"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "restauration de %d « Large Object »"
+msgstr[1] "restauration de %d « Large Objects »"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "restauration du « Large Object » d'OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "n'a pas pu créer le « Large Object » %u : %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "n'a pas pu ouvrir le « Large Object » %u : %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » : %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "ligne ignorée : %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "n'a pas pu trouver l'entrée pour l'ID %d"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "n'a pas pu fermer le fichier TOC : %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » : %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "a écrit %zu octet de données d'un « Large Object » (résultat = %d)"
+msgstr[1] "a écrit %zu octets de données d'un « Large Object » (résultat = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "n'a pas pu écrire dans le « Large Object » : %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "pendant l'initialisation (« INITIALIZING ») :"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "pendant le traitement de la TOC (« PROCESSING TOC ») :"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "pendant la finalisation (« FINALIZING ») :"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "de l'entrée TOC %d ; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "mauvais dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "mauvais dumpId de table pour l'élément TABLE DATA"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "drapeau de décalage de données inattendu %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "le décalage dans le fichier de sauvegarde est trop important"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "nom du répertoire trop long : « %s »"
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "le répertoire « %s » ne semble pas être une archive valide (« toc.dat » n'existe pas)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier en entrée « %s » : %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "n'a pas pu ouvrir le fichier en entrée : %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "n'a pas pu lire le fichier en entrée : %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "le fichier en entrée est trop petit (%lu lus, 5 attendus)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "Le fichier en entrée semble être une sauvegarde au format texte. Merci d'utiliser psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "le fichier en entrée ne semble pas être une archive valide (trop petit ?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "le fichier en entrée ne semble pas être une archive valide"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "n'a pas pu fermer le fichier en entrée : %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "n'a pas pu ouvrir stdout pour l'ajout : %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "format de fichier « %d » non reconnu"
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "élément terminé %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "échec du processus worker : code de sortie %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID %d de l'entrée en dehors de la plage -- peut-être un TOC corrompu"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "la restauration des tables avec WITH OIDS n'est plus supportée"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "encodage « %s » non reconnu"
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "élément ENCODING invalide : %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "élément STDSTRINGS invalide : %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schéma « %s » non trouvé"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "table « %s » non trouvée"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "index « %s » non trouvé"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "fonction « %s » non trouvée"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger « %s » non trouvé"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "n'a pas pu initialiser la session utilisateur à « %s »: %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "n'a pas pu configurer search_path à « %s » : %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "n'a pas pu configurer default_tablespace à %s : %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "n'a pas pu configurer la méthode default_table_access_method à %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "ne sait pas comment initialiser le propriétaire du type d'objet « %s »"
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "n'a pas trouver la chaîne magique dans le fichier d'en-tête"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "version non supportée (%d.%d) dans le fichier d'en-tête"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "échec de la vérification sur la taille de l'entier (%lu)"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "l'archive a été créée sur une machine disposant d'entiers plus larges, certaines opérations peuvent échouer"
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "le format attendu (%d) diffère du format du fichier (%d)"
+
+#: pg_backup_archiver.c:3807
+#, c-format
+msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available"
+msgstr "l'archive est compressée mais cette installation ne supporte pas la compression (%s) -- aucune donnée ne sera disponible"
+
+#: pg_backup_archiver.c:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "date de création invalide dans l'en-tête"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "traitement de l'élément %d %s %s"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "entrée dans la boucle parallèle principale"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "omission de l'élément %d %s %s"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "lancement de l'élément %d %s %s"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "fin de la boucle parallèle principale"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "traitement de l'élément manquant %d %s %s"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "la table « %s » n'a pas pu être créée, ses données ne seront pas restaurées"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "OID invalide pour le « Large Object »"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "erreur lors de la recherche dans le fichier : %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "le bloc de données %d a une mauvaise position de recherche"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "type de bloc de données non reconnu (%d) lors de la recherche dans l'archive"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr ""
+"n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n"
+"il est possible que cela soit dû à une demande de restauration dans un ordre\n"
+"différent, ce qui ne peut pas être géré à cause d'un fichier non gérable en\n"
+"recherche"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "n'a pas pu trouver l'identifiant de bloc %d dans l'archive -- possible corruption de l'archive"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "ID de bloc inattendu (%d) lors de la lecture des données -- %d attendu"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "type de bloc de données %d non reconnu lors de la restauration de l'archive"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive : %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "n'a pas pu fermer le fichier d'archive : %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "peut seulement rouvrir l'archive en entrée"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "la restauration parallélisée n'est pas supportée à partir de stdin"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "la restauration parallélisée n'est pas supportée à partir de fichiers sans table de matière"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "n'a pas pu initialiser la recherche de position dans le fichier d'archive : %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "compression activée"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "n'a pas pu obtenir server_version de libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "annulation à cause de la différence des versions"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "version du serveur : %s ; %s version : %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "déjà connecté à une base de données"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "n'a pas pu se connecter à la base de données"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "échec de la reconnexion : %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "échec de la requête : %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "La requête était : %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s"
+msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sLa commande était : %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "n'a pas pu exécuter la requête"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "erreur renvoyée par PQputCopyData : %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "erreur renvoyée par PQputCopyEnd : %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY échoué pour la table « %s » : %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "résultats supplémentaires non attendus durant l'exécution de COPY sur la table « %s »"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "n'a pas pu démarrer la transaction de la base de données"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "n'a pas pu valider la transaction de la base de données"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "aucun répertoire cible indiqué"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "n'a pas pu écrire dans le fichier en sortie : %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "n'a pas pu fermer le fichier de données : %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier de données « %s » : %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » du Large Object en entrée : %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ligne invalide dans le fichier TOC du Large Object « %s » : « %s »"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "erreur lors de la lecture du TOC du fichier Large Object « %s »"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "n'a pas pu fermer le TOC du Large Object « %s » : %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "n'a pas pu fermer le fichier de données LO : %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "n'a pas pu écrire dans le fichier TOC des Large Objects : %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "n'a pas pu fermer le fichier TOC des Large Objects : %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "nom du fichier trop long : « %s »"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "ce format ne peut pas être lu"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » en sortie : %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC en sortie : %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "compression non supportée par le format des archives tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC « %s » en entrée : %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "n'a pas pu ouvrir le fichier TOC en entrée : %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "n'a pas pu trouver le fichier « %s » dans l'archive"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "impossible de créer le nom du fichier temporaire : %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "syntaxe inattendue de l'instruction COPY : « %s »"
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "OID invalide pour le « Large Object » (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "n'a pas pu fermer le fichier temporaire : m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "la longueur réelle du fichier (%lld) ne correspond pas à ce qui était attendu (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "n'a pas pu trouver l'en-tête du fichier « %s » dans l'archive tar"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "la restauration désordonnée de données n'est pas supportée avec ce format d'archive : « %s » est requis mais vient avant « %s » dans le fichier d'archive."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "en-tête incomplet du fichier tar (%lu octet)"
+msgstr[1] "en-tête incomplet du fichier tar (%lu octets)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "en-tête tar corrompu trouvé dans %s (%d attendu, %d calculé ) à la position %llu du fichier"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "nom de section non reconnu : « %s »"
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "plus d'emplacements on_exit_nicely"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "les options « -s/--schema-only » et « --include-foreign-data » ne peuvent pas être utilisées ensemble"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "l'option --include-foreign-data n'est pas supportée avec une sauvegarde parallélisée"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "les options « -c/--clean » et « -a/--data-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "l'option --if-exists nécessite l'option -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "l'option --on-conflict-do-nothing requiert l'option --inserts, --rows-per-insert, ou --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "algorithme de compression inconnu : « %s »"
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "spécification de compression invalide : %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "l'option de compression « %s » n'est pas actuellement supportée par pg_dump"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "la sauvegarde parallélisée n'est supportée qu'avec le format directory"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "le dernier OID interne est %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "aucun schéma correspondant n'a été trouvé"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "aucune table correspondante n'a été trouvée"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "aucune extension correspondante n'a été trouvée"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s exporte une base de données dans un fichier texte ou dans d'autres\n"
+"formats.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [BASE]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Options générales :\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FICHIER nom du fichier ou du répertoire en sortie\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p format du fichier de sortie (personnalisé,\n"
+" répertoire, tar, texte (par défaut))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n"
+" sauvegarde\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHODE[:DETAIL]\n"
+" compresse comme indiqué\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=DÉLAI échec après l'attente du DÉLAI pour un verrou de\n"
+" table\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Options contrôlant le contenu en sortie :\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only sauvegarde uniquement les données, pas le schéma\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects inclut les « Large Objects » dans la sauvegarde\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (comme --large-objects, obsolète)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects exclut les « Large Objects » de la sauvegarde\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (comme --no-large-objects, obsolète)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr ""
+" -c, --clean nettoie/supprime les objets de la base de données\n"
+" avant de les créer\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create inclut les commandes de création de la base\n"
+" dans la sauvegarde\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=MOTIF sauvegarde uniquement les extensions indiquées\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODAGE sauvegarde les données dans l'encodage ENCODAGE\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=MOTIF sauvegarde uniquement les schémas indiqués\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MOTIF ne sauvegarde pas les schémas indiqués\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner ne sauvegarde pas les propriétaires des objets\n"
+" lors de l'utilisation du format texte\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr ""
+" -s, --schema-only sauvegarde uniquement la structure, pas les\n"
+" données\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr ""
+" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n"
+" avec le format texte\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=MOTIF sauvegarde uniquement les tables indiquées\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=MOTIF ne sauvegarde pas les tables indiquées\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges ne sauvegarde pas les droits sur les objets\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr ""
+" --binary-upgrade à n'utiliser que par les outils de mise à jour\n"
+" seulement\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts sauvegarde les données avec des commandes INSERT\n"
+" en précisant les noms des colonnes\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting désactive l'utilisation des guillemets dollars\n"
+" dans le but de respecter le standard SQL en\n"
+" matière de guillemets\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers désactive les triggers en mode de restauration\n"
+" des données seules\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security active la sécurité niveau ligne (et donc\n"
+" sauvegarde uniquement le contenu visible par cet\n"
+" utilisateur)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=MOTIF\n"
+" ne sauvegarde PAS les tables indiquées, ceci incluant les tables filles et les partitions\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les tables indiquées\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=MOTIF\n"
+" ne sauvegarde PAS les données des tables indiquées, ceci incluant les tables filles et les partitions\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr ""
+" --extra-float-digits=NUM surcharge la configuration par défaut de\n"
+" extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr ""
+" --if-exists utilise IF EXISTS lors de la suppression des\n"
+" objets\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MOTIF inclut les données des tables externes pour les\n"
+" serveurs distants correspondant au motif MOTIF\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr ""
+" --inserts sauvegarde les données avec des instructions\n"
+" INSERT plutôt que COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root charger les partitions via la table racine\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments ne sauvegarde pas les commentaires\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications ne sauvegarde pas les publications\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr ""
+" --no-security-labels ne sauvegarde pas les affectations de labels de\n"
+" sécurité\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions ne sauvegarde pas les souscriptions\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method ne sauvegarde pas les méthodes d'accès aux tables\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces ne sauvegarde pas les affectations de tablespaces\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr ""
+" --no-toast-compression ne sauvegarde pas les méthodes de compression de\n"
+" TOAST\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr ""
+" --no-unlogged-table-data ne sauvegarde pas les données des tables non\n"
+" journalisées\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr ""
+" --on-conflict-do-nothing ajoute ON CONFLICT DO NOTHING aux commandes\n"
+" INSERT\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers met entre guillemets tous les identifiants même\n"
+" s'il ne s'agit pas de mots clés\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS nombre de lignes par INSERT ; implique --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION sauvegarde la section indiquée (pre-data, data\n"
+" ou post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable attend jusqu'à ce que la sauvegarde puisse\n"
+" s'exécuter sans anomalies\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT utilise l'image donnée pour la sauvegarde\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names requiert que les motifs des tables et/ou schémas\n"
+" correspondent à au moins une entité de chaque\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr " --table-and-children=MODÈLE sauvegarde uniquement les tables indiquées, en incluant les tables filles et les partitions\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" utilise les commandes SET SESSION AUTHORIZATION\n"
+" au lieu des commandes ALTER OWNER pour modifier\n"
+" les propriétaires\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=BASE base de données à sauvegarder\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOM se connecter avec cet utilisateur\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais un mot de passe\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password force la demande du mot de passe (devrait\n"
+" survenir automatiquement)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=NOMROLE exécute SET ROLE avant la sauvegarde\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucune base de données n'est indiquée, la valeur de la variable\n"
+"d'environnement PGDATABASE est alors utilisée.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "encodage client indiqué (« %s ») invalide"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "les sauvegardes parallélisées sur un serveur standby ne sont pas supportées par cette version du serveur"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "format de sortie « %s » invalide"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "aucun schéma correspondant n'a été trouvé avec le motif « %s »"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "aucune extension correspondante n'a été trouvée avec le motif « %s »"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "aucun serveur distant correspondant n'a été trouvé avec le motif « %s »"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nom de relation incorrecte (trop de points entre les noms) : %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "aucune table correspondante n'a été trouvée avec le motif « %s »"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Vous n'êtes pas connecté à une base de données."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "les références entre bases de données ne sont pas implémentées : %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "sauvegarde du contenu de la table « %s.%s »"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetCopyData()."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Message d'erreur du serveur : %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "La commande était : %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetResult()."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "mauvais nombre de champs récupérés à partir de la table « %s »"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "sauvegarde de la définition de la base de données"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "fournisseur de locale non reconnu : %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "encodage de la sauvegarde = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "sauvegarde de standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "n'a pas pu analyser le résultat de current_schema()"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "sauvegarde de search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "lecture des « Large Objects »"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "sauvegarde des « Large Objects »"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "erreur lors de la lecture du « Large Object » %u : %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "lecture des politiques de sécurité au niveau ligne"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "type de commande inattendu pour la politique : %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "n'a pas pu analyser le tableau %s"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "les souscriptions ne sont pas sauvegardées parce que l'utilisateur courant n'est pas un superutilisateur"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "n'a pas pu trouver l'extension parent pour %s %s"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "le schéma d'OID %u n'existe pas"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "vérification échouée, OID %u de la table parent de l'OID %u de la séquence introuvable"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "vérification échouée, OID de table %u apparaissant dans partitioned introuvable"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "OID de table %u non reconnu"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "données d'index inattendu pour la table « %s »"
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "vérification échouée, OID %u de la table parent de l'OID %u de l'entrée de pg_rewrite introuvable"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "la requête a produit une réference de nom de table null pour le trigger de la clé étrangère « %s » sur la table « %s » (OID de la table : %u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "données de colonne inattendues pour la table « %s »"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "numérotation des colonnes invalide pour la table « %s »"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "recherche des expressions par défaut de la table"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "valeur adnum %d invalide pour la table « %s »"
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "recherche des contraintes CHECK de la table"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "%d contrainte de vérification attendue pour la table « %s » mais %d trouvée"
+msgstr[1] "%d contraintes de vérification attendues pour la table « %s » mais %d trouvée"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Les catalogues système pourraient être corrompus."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "le rôle d'OID %u n'existe pas"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "entrée pg_init_privs non supportée : %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "la colonne typtype du type de données « %s » semble être invalide"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "valeur provolatile non reconnue pour la fonction « %s »"
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "valeur proparallel non reconnue pour la fonction « %s »"
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "n'a pas pu trouver la définition de la fonction d'OID %u"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "valeur erronée dans le champ pg_cast.castfunc ou pg_cast.castmethod"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "valeur erronée dans pg_cast.castmethod"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "définition de transformation invalide, au moins un de trffromsql et trftosql ne doit pas valoir 0"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "valeur erronée dans pg_transform.trffromsql"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "valeur erronée dans pg_transform.trftosql"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "les opérateurs postfixes ne sont plus supportés (opérateur « %s »)"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "n'a pas pu trouver l'opérateur d'OID %s"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "type « %c » invalide de la méthode d'accès « %s »"
+
+#: pg_dump.c:13455 pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "fournisseur de collationnement non reconnu : %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "collation « %s » invalide"
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "valeur non reconnue de aggfinalmodify pour l'agrégat « %s »"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "valeur non reconnue de aggmfinalmodify pour l'agrégat « %s »"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "type d'objet inconnu dans les droits par défaut : %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "n'a pas pu analyser la liste ACL par défaut (%s)"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "n'a pas pu analyser la liste ACL initiale (%s) ou par défaut (%s) pour l'objet « %s » (%s)"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "n'a pas pu analyser la liste ACL (%s) ou par défaut (%s) pour l'objet « %s » (%s)"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "la requête permettant d'obtenir la définition de la vue « %s » n'a renvoyé aucune donnée"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "la requête permettant d'obtenir la définition de la vue « %s » a renvoyé plusieurs définitions"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "la définition de la vue « %s » semble être vide (longueur nulle)"
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS n'est plus supporté (table « %s »)"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "numéro de colonne %d invalide pour la table « %s »"
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "n'a pas pu analyser les colonnes statistiques de l'index"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "n'a pas pu analyser les valeurs statistiques de l'index"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "nombre de colonnes et de valeurs différentes pour les statistiques des index"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "index manquant pour la contrainte « %s »"
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "type de contrainte inconnu : %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)"
+msgstr[1] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "type de séquence non reconnu : « %s »"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "valeur tgtype inattendue : %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "chaîne argument invalide (%s) pour le trigger « %s » sur la table « %s »"
+
+#: pg_dump.c:17655
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "la requête permettant d'obtenir la règle « %s » associée à la table « %s » a échoué : mauvais nombre de lignes renvoyées"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "n'a pas pu trouver l'extension référencée %u"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "nombre différent de configurations et de conditions pour l'extension"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "lecture des données de dépendance"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "pas d'objet référant %u %u"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "pas d'objet référencé %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "dumpId %d invalide"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "dépendance invalide %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "n'a pas pu identifier la boucle de dépendance"
+
+#: pg_dump_sort.c:1276
+#, 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] "NOTE : il existe des constraintes de clés étrangères circulaires sur cette table :"
+msgstr[1] "NOTE : il existe des constraintes de clés étrangères circulaires sur ces tables :"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Il est possible de restaurer la sauvegarde sans utiliser --disable-triggers ou sans supprimer temporairement les constraintes."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Considérez l'utilisation d'une sauvegarde complète au lieu d'une sauvegarde des données seulement pour éviter ce problème."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "n'a pas pu résoudre la boucle de dépendances parmi ces éléments :"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "l'option --exclude-database ne peut pas être utilisée avec -g/--globals-only, -r/--roles-only ou -t/--tablespaces-only"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "les options « -g/--globals-only » et « -r/--roles-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "les options « -g/--globals-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "les options « -r/--roles-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "n'a pas pu se connecter à la base de données « %s »"
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"n'a pas pu se connecter aux bases « postgres » et « template1 ».\n"
+"Merci de préciser une autre base de données."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extrait un cluster de bases de données PostgreSQL dans un fichier de\n"
+"commandes SQL.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FICHIER nom du fichier de sortie\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+" -c, --clean nettoie (supprime) les bases de données avant de\n"
+" les créer\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only sauvegarde uniquement les objets système, pas\n"
+" le contenu des bases de données\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner omet la restauration des propriétaires des objets\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only sauvegarde uniquement les rôles, pas les bases\n"
+" de données ni les tablespaces\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n"
+" avec le format texte\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only sauvegarde uniquement les tablespaces, pas les\n"
+" bases de données ni les rôles\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=MOTIF exclut les bases de données dont le nom\n"
+" correspond au motif\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords ne sauvegarde pas les mots de passe des rôles\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CHAINE_CONNEX connexion à l'aide de la chaîne de connexion\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=BASE indique une autre base par défaut\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Si -f/--file n'est pas utilisé, le script SQL sera envoyé sur la sortie\n"
+"standard.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "nom de rôle commençant par « pg_ » ignoré (« %s »)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "n'a pas pu trouver un ordre de sauvegarde correct pour les appartenances au rôle « %s »"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le paramètre « %s »"
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le tablespace « %s »"
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "exclusion de la base de données « %s »"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "sauvegarde de la base de données « %s »"
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "échec de pg_dump sur la base de données « %s », quitte"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "n'a pas pu ré-ouvrir le fichier de sortie « %s » : %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "exécute « %s »"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "n'a pas pu obtenir la version du serveur"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "n'a pas pu analyser la version du serveur « %s »"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "exécution %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "une seule des options -d/--dbname and -f/--file peut être indiquée"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "les options « -d/--dbname » et « -f/--file » ne peuvent pas être utilisées ensemble"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "les options « -C/--create » et « -1/--single-transaction » ne peuvent pas être utilisées ensemble"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "ne peut pas spécifier à la fois l'option --single-transaction et demander plusieurs jobs"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "format d'archive « %s » non reconnu ; merci d'indiquer « c », « d » ou « t »"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "erreurs ignorées lors de la restauration : %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s restaure une base de données PostgreSQL à partir d'une archive créée\n"
+"par pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FICHIER]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr ""
+" -d, --dbname=NOM nom de la base de données utilisée pour la\n"
+" connexion\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FICHIER nom du fichier de sortie (- pour stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F, --format=c|d|t format du fichier de sauvegarde (devrait être\n"
+" automatique)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list affiche la table des matières de l'archive (TOC)\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Options contrôlant la restauration :\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only restaure uniquement les données, pas la structure\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create crée la base de données cible\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error quitte en cas d'erreur, continue par défaut\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOM restaure l'index indiqué\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n"
+" restauration\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FICHIER utilise la table des matières à partir de ce\n"
+" fichier pour sélectionner/trier la sortie\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NOM restaure uniquement les objets de ce schéma\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NOM ne restaure pas les objets de ce schéma\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOM(args) restaure la fonction indiquée\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only restaure uniquement la structure, pas les données\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n"
+" pour désactiver les triggers\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOM restaure la relation indiquée (table, vue, etc)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOM restaure le trigger indiqué\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr ""
+" -x, --no-privileges omet la restauration des droits sur les objets\n"
+" (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction restaure dans une seule transaction\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security active la sécurité niveau ligne\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments ne restaure pas les commentaires\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables ne restaure pas les données des tables qui n'ont\n"
+" pas pu être créées\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications ne restaure pas les publications\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels ne restaure pas les labels de sécurité\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions ne restaure pas les souscriptions\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method ne restaure pas les méthodes d'accès aux tables\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces ne restaure pas les affectations de tablespaces\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION restaure la section indiquée (pre-data, data ou\n"
+" post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=RÔLE exécute SET ROLE avant la restauration\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Les options -I, -n, -N, -P, -t, -T et --section peuvent être combinées et\n"
+"indiquées plusieurs fois pour sélectionner plusieurs objets.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun nom de fichier n'est fourni en entrée, alors l'entrée standard est\n"
+"utilisée.\n"
+"\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr ""
+#~ " --disable-triggers désactiver les déclencheurs lors de la\n"
+#~ " restauration des données seules\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide puis quitte\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#, c-format
+#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+#~ msgstr ""
+#~ " --no-synchronized-snapshots n'utilise pas de snapshots synchronisés pour les\n"
+#~ " jobs en parallèle\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " utilise les commandes SET SESSION AUTHORIZATION\n"
+#~ " au lieu des commandes ALTER OWNER pour les\n"
+#~ " modifier les propriétaires\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version puis quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr ""
+#~ " -O, --no-owner omettre la restauration des possessions des\n"
+#~ " objets\n"
+
+#, c-format
+#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+#~ msgstr ""
+#~ " -Z, --compress=0-9 niveau de compression pour les formats\n"
+#~ " compressés\n"
+
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr ""
+#~ " -c, --clean nettoie/supprime les bases de données avant de\n"
+#~ " les créer\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids inclut les OID dans la sauvegarde\n"
+
+#~ msgid "%s: could not connect to database \"%s\": %s"
+#~ msgstr "%s : n'a pas pu se connecter à la base de données « %s » : %s"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier de sauvegarde « %s » : %s\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser la liste d'ACL (%s) pour la base de données « %s »\n"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s : n'a pas pu analyser la version « %s »\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s : exécute %s\n"
+
+#~ msgid "%s: invalid -X option -- %s\n"
+#~ msgstr "%s : option -X invalide -- %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s : encodage client indiqué (« %s ») invalide\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s : nombre de jobs en parallèle invalide\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s : l'option --if-exists nécessite l'option -c/--clean\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr ""
+#~ "%s : les options « -c/--clean » et « -a/--data-only » ne peuvent pas être\n"
+#~ "utilisées conjointement\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr ""
+#~ "%s : les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être\n"
+#~ "utilisées conjointement\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s : échec de la requête : %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s : la requête était : %s\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(La commande INSERT ne peut pas positionner les OID.)\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** interrompu du fait d'erreurs\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C et -1 sont des options incompatibles\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C et -c sont des options incompatibles\n"
+
+#~ msgid "LOCK TABLE failed for \"%s\": %s"
+#~ msgstr "LOCK TABLE échoué pour la table « %s » : %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "la commande SQL a échoué\n"
+
+#, c-format
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Les snapshots synchronisés ne sont pas supportés par cette version serveur.\n"
+#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n"
+#~ "de snapshots synchronisés."
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported on standby servers.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Les snapshots synchronisés ne sont pas supportés sur les serveurs de stadby.\n"
+#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n"
+#~ "de snapshots synchronisés.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Les snapshots synchronisés sur les serveurs standbys ne sont pas supportés par cette version serveur.\n"
+#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n"
+#~ "de snapshots synchronisés."
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "entrée TOC %s à %s (longueur %s, somme de contrôle %d)\n"
+
+#, c-format
+#~ msgid "The command was: %s"
+#~ msgstr "La commande était : %s"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « pg_dump » est nécessaire à %s mais n'a pas été trouvé dans le\n"
+#~ "même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « pg_dump » a été trouvé par « %s »\n"
+#~ "mais n'a pas la même version que %s.\n"
+#~ "Vérifiez votre installation."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "ATTENTION :\n"
+#~ " Ce format est présent dans un but de démonstration ; il n'est pas prévu\n"
+#~ " pour une utilisation normale. Les fichiers seront écrits dans le\n"
+#~ " répertoire actuel.\n"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "ATTENTION : n'a pas pu analyser le tableau reloptions\n"
+
+#~ msgid "WSAStartup failed: %d"
+#~ msgstr "WSAStartup a échoué : %d"
+
+#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+#~ msgstr "la fonction d'aggrégat %s n'a pas pu être sauvegardée correctement avec cette version de la base de données ; ignorée"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "allocation d'AH pour %s, format %d\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "membre de l'archive trop volumineux pour le format tar\n"
+
+#~ msgid "archiver"
+#~ msgstr "archiveur"
+
+#~ msgid "archiver (db)"
+#~ msgstr "programme d'archivage (db)"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "tentative d'identification du format de l'archive\n"
+
+#, c-format
+#~ msgid "bogus value in proargmodes array"
+#~ msgstr "valeur erronée dans le tableau proargmodes"
+
+#~ msgid "cannot duplicate null pointer\n"
+#~ msgstr "ne peut pas dupliquer un pointeur nul\n"
+
+#~ msgid "cannot reopen non-seekable file\n"
+#~ msgstr "ne peut pas rouvrir le fichier non cherchable\n"
+
+#~ msgid "cannot reopen stdin\n"
+#~ msgstr "ne peut pas rouvrir stdin\n"
+
+#, c-format
+#~ msgid "cannot restore from compressed archive (compression not supported in this installation)"
+#~ msgstr "ne peut pas restaurer à partir de l'archive compressée (compression indisponible dans cette installation)"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "le processus fils a été terminé par le signal %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compression_io"
+
+#, c-format
+#~ msgid "compression level must be in range 0..9"
+#~ msgstr "le niveau de compression doit être compris entre 0 et 9"
+
+#~ msgid "compression support is disabled in this format\n"
+#~ msgstr "le support de la compression est désactivé avec ce format\n"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\""
+#~ msgstr "connexion à la base de données « %s » en tant qu'utilisateur « %s »"
+
+#~ msgid "connection needs password"
+#~ msgstr "la connexion nécessite un mot de passe"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "la connexion à la base de données « %s » a échoué : %s"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s"
+
+#, c-format
+#~ msgid "could not close blob data file: %m"
+#~ msgstr "n'a pas pu fermer le fichier de données blob : %m"
+
+#, c-format
+#~ msgid "could not close blobs TOC file: %m"
+#~ msgstr "n'a pas pu fermer le fichier TOC des blobs : %m"
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "n'a pas pu fermer le fichier de données après lecture\n"
+
+#~ msgid "could not close directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "n'a pas pu fermer le fichier du « Large Object »\n"
+
+#, c-format
+#~ msgid "could not close tar member: %m"
+#~ msgstr "n'a pas pu fermer le membre de tar : %m"
+
+#~ msgid "could not connect to database \"%s\": %s"
+#~ msgstr "n'a pas pu se connecter à la base de données « %s » : %s"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "n'a pas pu créer le fil de travail: %s\n"
+
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive"
+#~ msgstr ""
+#~ "n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n"
+#~ "il est possible que cela soit dû à une demande de restauration dans un ordre\n"
+#~ "différent, qui n'a pas pu être géré à cause d'un manque d'information de\n"
+#~ "position dans l'archive"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "n'a pas pu trouver l'entrée de pg_indexes dans pg_class\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "n'a pas pu trouver l'emplacement du worker qui vient de terminer\n"
+
+#~ msgid "could not get relation name for OID %u: %s\n"
+#~ msgstr "n'a pas pu obtenir le nom de la relation pour l'OID %u: %s\n"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %s"
+
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en entrée : %s\n"
+
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en sortie : %s\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » en écriture\n"
+
+#, c-format
+#~ msgid "could not open temporary file"
+#~ msgstr "n'a pas pu ouvrir le fichier temporaire"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "n'a pas pu remplir la fin du membre de tar\n"
+
+#~ msgid "could not parse ACL (%s) for large object %u"
+#~ msgstr "n'a pas pu analyser la liste ACL (%s) du « Large Object » %u"
+
+#, c-format
+#~ msgid "could not parse extension condition array"
+#~ msgstr "n'a pas pu analyser le tableau de condition de l'extension"
+
+#, c-format
+#~ msgid "could not parse extension configuration array"
+#~ msgstr "n'a pas pu analyser le tableau de configuration des extensions"
+
+#~ msgid "could not parse index collation name array"
+#~ msgstr "n'a pas pu analyser le tableau des noms de collation de l'index"
+
+#~ msgid "could not parse index collation version array"
+#~ msgstr "n'a pas pu analyser le tableau des versions de collation de l'index"
+
+#, c-format
+#~ msgid "could not parse proallargtypes array"
+#~ msgstr "n'a pas pu analyser le tableau proallargtypes"
+
+#, c-format
+#~ msgid "could not parse proargmodes array"
+#~ msgstr "n'a pas pu analyser le tableau proargmodes"
+
+#, c-format
+#~ msgid "could not parse proargnames array"
+#~ msgstr "n'a pas pu analyser le tableau proargnames"
+
+#, c-format
+#~ msgid "could not parse proconfig array"
+#~ msgstr "n'a pas pu analyser le tableau proconfig"
+
+#, c-format
+#~ msgid "could not parse subpublications array"
+#~ msgstr "n'a pas pu analyser le tableau de sous-publications"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "n'a pas pu analyser la chaîne de version « %s »\n"
+
+#, c-format
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "n'a pas pu lire le binaire « %s »"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#~ msgid "could not reconnect to database"
+#~ msgstr "n'a pas pu se reconnecter à la base de données"
+
+#~ msgid "could not reconnect to database: %s"
+#~ msgstr "n'a pas pu se reconnecter à la base de données : %s"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "n'a pas pu configurer default_with_oids : %s"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "n'a pas pu écrire l'octet\n"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "n'a pas pu écrire un octet : %s\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "n'a pas pu écrire le bloc nul à la fin de l'archive tar\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "n'a pas pu écrire vers la routine de sauvegarde personnalisée\n"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)"
+#~ msgstr "n'a pas pu écrire le « Large Object » (résultat : %lu, attendu : %lu)"
+
+#~ msgid "custom archiver"
+#~ msgstr "programme d'archivage personnalisé"
+
+#~ msgid "directory archiver"
+#~ msgstr "archiveur répertoire"
+
+#~ msgid "dumpBlobs(): could not open large object %u: %s"
+#~ msgstr "dumpBlobs() : n'a pas pu ouvrir le « Large Object » %u : %s"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject.relfrozenxid\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject_metadata.relfrozenxid\n"
+
+#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n"
+#~ msgstr ""
+#~ "la sauvegarde d'un bloc de données spécifique du TOC dans le désordre n'est\n"
+#~ "pas supporté sans identifiant sur ce flux d'entrée (fseek requis)\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "entrée dans restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "entrée dans restore_toc_entries_prefork\n"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "entrée dans restore_toc_entries_prefork\n"
+
+#~ msgid "error during backup\n"
+#~ msgstr "erreur lors de la sauvegarde\n"
+
+#~ msgid "error in ListenToWorkers(): %s\n"
+#~ msgstr "erreur dans ListenToWorkers(): %s\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "erreur durant le traitement en parallèle d'un item\n"
+
+#, c-format
+#~ msgid "extra_float_digits must be in range -15..3"
+#~ msgstr "extra_float_digits doit être dans l'intervalle -15 à 3"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "n'a pas pu se connecter à la base de données\n"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "la reconnexion à la base de données a échoué\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "file archiver"
+#~ msgstr "programme d'archivage de fichiers"
+
+#, c-format
+#~ msgid "finding check constraints for table \"%s.%s\""
+#~ msgstr "recherche des contraintes de vérification pour la table « %s.%s »"
+
+#, c-format
+#~ msgid "finding default expressions of table \"%s.%s\""
+#~ msgstr "recherche des expressions par défaut de la table « %s.%s »"
+
+#, c-format
+#~ msgid "finding the columns and types of table \"%s.%s\""
+#~ msgstr "recherche des colonnes et types de la table « %s.%s »"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "a trouvé plusieurs entrées pour pg_indexes dans la table pg_class\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "a trouvé plusieurs entrées dans pg_database pour cette base de données\n"
+
+#~ msgid "ftell mismatch with expected position -- ftell used"
+#~ msgstr "ftell ne correspond pas à la position attendue -- ftell utilisé"
+
+#~ msgid "internal error -- neither th nor fh specified in _tarReadRaw()"
+#~ msgstr "erreur interne -- ni th ni fh ne sont précisés dans _tarReadRaw()"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "instruction COPY invalide -- n'a pas pu trouver « copy » dans la chaîne « %s »\n"
+
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr ""
+#~ "instruction COPY invalide -- n'a pas pu trouver « from stdin » dans la\n"
+#~ "chaîne « %s » à partir de la position %lu\n"
+
+#~ msgid "invalid TOASTCOMPRESSION item: %s"
+#~ msgstr "élément TOASTCOMPRESSION invalide : %s"
+
+#, c-format
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "binaire « %s » invalide"
+
+#, c-format
+#~ msgid "invalid compression code: %d"
+#~ msgstr "code de compression invalide : %d"
+
+#, c-format
+#~ msgid "invalid number of parallel jobs"
+#~ msgstr "nombre de jobs parallèles invalide"
+
+#, c-format
+#~ msgid "maximum number of parallel jobs is %d"
+#~ msgstr "le nombre maximum de jobs en parallèle est %d"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr ""
+#~ "pas de correspondance entre la position réelle et celle prévue du fichier\n"
+#~ "(%s vs. %s)\n"
+
+#~ msgid "mismatched number of collation names and versions for index"
+#~ msgstr "nombre différent de noms et versions de collation pour l'index"
+
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "entrée manquante dans pg_database pour la base de données « %s »\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "entrée pg_database manquante pour cette base de données\n"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "déplacement de la position %s vers le prochain membre à la position %s du fichier\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "aucun élément prêt\n"
+
+#~ msgid "no label definitions found for enum ID %u\n"
+#~ msgstr "aucune définition de label trouvée pour l'ID enum %u\n"
+
+#, c-format
+#~ msgid "not built with zlib support"
+#~ msgstr "pas construit avec le support de zlib"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "maintenant en position %s du fichier\n"
+
+#~ msgid "option --index-collation-versions-unknown only works in binary upgrade mode"
+#~ msgstr "l'option --index-collation-versions-unknown fonctionne seulement dans le mode de mise à jour binaire"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr ""
+#~ "les options « --inserts/--column-inserts » et « -o/--oids » ne\n"
+#~ "peuvent pas être utilisées conjointement\n"
+
+#, c-format
+#~ msgid "owner of aggregate function \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la fonction d'agrégat « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of data type \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire du type de données « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of function \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la fonction « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of operator \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de l'opérateur « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of operator class \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la classe d'opérateur « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of operator family \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la famille d'opérateur « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of publication \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la publication « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of schema \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire du schéma « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of subscription \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la souscription « %s » semble être invalide"
+
+#, c-format
+#~ msgid "owner of table \"%s\" appears to be invalid"
+#~ msgstr "le propriétaire de la table « %s » semble être invalide"
+
+#~ msgid "parallel archiver"
+#~ msgstr "archiveur en parallèle"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore ne devrait pas retourner\n"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "échec de pclose : %s"
+
+#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n"
+#~ msgid_plural "query returned %d foreign server entries for foreign table \"%s\"\n"
+#~ msgstr[0] "la requête a renvoyé %d entrée de serveur distant pour la table distante « %s »\n"
+#~ msgstr[1] "la requête a renvoyé %d entrées de serveurs distants pour la table distante « %s »\n"
+
+#~ msgid "query returned %d row instead of one: %s\n"
+#~ msgid_plural "query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s\n"
+#~ msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s\n"
+
+#~ msgid "query returned %d rows instead of one: %s\n"
+#~ msgstr "la requête a renvoyé %d lignes au lieu d'une seule : %s\n"
+
+#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr ""
+#~ "la requête a renvoyé plusieurs (%d) entrées pg_database pour la base de\n"
+#~ "données « %s »\n"
+
+#~ msgid "query returned no rows: %s\n"
+#~ msgstr "la requête n'a renvoyé aucune ligne : %s\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr ""
+#~ "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé\n"
+#~ "le nom « %s »\n"
+
+#~ msgid "query was: %s\n"
+#~ msgstr "la requête était : %s\n"
+
+#~ msgid "read %lu byte into lookahead buffer\n"
+#~ msgid_plural "read %lu bytes into lookahead buffer\n"
+#~ msgstr[0] "lecture de %lu octet dans le tampon prévisionnel\n"
+#~ msgstr[1] "lecture de %lu octets dans le tampon prévisionnel\n"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "lecture de l'entrée %d de la TOC (ID %d) pour %s %s\n"
+
+#~ msgid "reading extended statistics for table \"%s.%s\"\n"
+#~ msgstr "lecture des statistiques étendues pour la table « %s.%s »\n"
+
+#, c-format
+#~ msgid "reading foreign key constraints for table \"%s.%s\""
+#~ msgstr "lecture des contraintes de clés étrangères pour la table « %s.%s »"
+
+#, c-format
+#~ msgid "reading indexes for table \"%s.%s\""
+#~ msgstr "lecture des index de la table « %s.%s »"
+
+#~ msgid "reading policies for table \"%s.%s\""
+#~ msgstr "lecture des politiques pour la table « %s.%s »"
+
+#~ msgid "reading row security enabled for table \"%s.%s\""
+#~ msgstr "lecture de l'activation de la sécurité niveau ligne pour la table « %s.%s »"
+
+#, c-format
+#~ msgid "reading triggers for table \"%s.%s\""
+#~ msgstr "lecture des triggers pour la table « %s.%s »"
+
+#~ msgid "reconnection to database \"%s\" failed: %s"
+#~ msgstr "reconnexion à la base de données « %s » échouée : %s"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "réduction des dépendances pour %d\n"
+
+#~ msgid "requested %d byte, got %d from lookahead and %d from file\n"
+#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n"
+#~ msgstr[0] "%d octet requis, %d obtenu de « lookahead » et %d du fichier\n"
+#~ msgstr[1] "%d octets requis, %d obtenus de « lookahead » et %d du fichier\n"
+
+#, c-format
+#~ msgid "requested compression not available in this installation -- archive will be uncompressed"
+#~ msgstr "la compression requise n'est pas disponible avec cette installation -- l'archive ne sera pas compressée"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "restauration du « Large Object » d'OID %u\n"
+
+#, c-format
+#~ msgid "rows-per-insert must be in range %d..%d"
+#~ msgstr "le nombre de lignes par insertion doit être compris entre %d et %d"
+
+#~ msgid "saving default_toast_compression = %s"
+#~ msgstr "sauvegarde de default_toast_compression = %s"
+
+#~ msgid "saving large object properties\n"
+#~ msgstr "sauvegarde des propriétés des « Large Objects »\n"
+
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "le schéma d'OID %u n'existe pas\n"
+
+#~ msgid "select() failed: %m"
+#~ msgstr "échec de select() : %m"
+
+#~ msgid "select() failed: %s\n"
+#~ msgstr "échec de select() : %s\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr ""
+#~ "le serveur doit être de version 7.3 ou supérieure pour utiliser les options\n"
+#~ "de sélection du schéma\n"
+
+#~ msgid "setting owner and privileges for %s \"%s\"\n"
+#~ msgstr "réglage du propriétaire et des droits pour %s « %s »\n"
+
+#~ msgid "setting owner and privileges for %s \"%s.%s\"\n"
+#~ msgstr "réglage du propriétaire et des droits pour %s « %s.%s»\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "omission du membre %s du tar\n"
+
+#~ msgid "sorter"
+#~ msgstr "tri"
+
+#~ msgid "tar archiver"
+#~ msgstr "archiveur tar"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "terminé par l'utilisateur\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "transfert de la dépendance %d -> %d vers %d\n"
+
+#~ msgid "unexpected end of file\n"
+#~ msgstr "fin de fichier inattendu\n"
+
+#~ msgid "unrecognized collation provider: %s\n"
+#~ msgstr "fournisseur de collationnement non reconnu : %s\n"
+
+#~ msgid "unrecognized command on communication channel: %s\n"
+#~ msgstr "commande inconnue sur le canal de communucation: %s\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "le worker est en cours d'arrêt\n"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "crash du processus worker : statut %d\n"
diff --git a/src/bin/pg_dump/po/he.po b/src/bin/pg_dump/po/he.po
new file mode 100644
index 0000000..e8862ac
--- /dev/null
+++ b/src/bin/pg_dump/po/he.po
@@ -0,0 +1,2883 @@
+# Hebrew message translation file for pg_dump
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldberg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-17 03:16+0000\n"
+"PO-Revision-Date: 2017-08-15 10:37-0400\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Last-Translator: Michael Goldberg <mic.goldberg@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.0.2\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "×œ× ×™×•×›×œ לזהות ×ת הספריה הנוכחית: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "בינ×רי ×œ× ×—×•×§×™ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×‘×™× ×רי \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× \"%s\" לביצוע"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "×œ× ×œ×©× ×•×ª לשנות ספריות ל \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת הקישור הסימבולי \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "נכשלpclose : %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "×ין זיכרון פנוי\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "×œ× × ×™×ª×Ÿ לשכפל מצביע ריק (שגי××” פנימית)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "×œ× × ×™×ª×Ÿ לבצע ×ת הפקודה"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "הפקודה ×œ× × ×ž×¦××”"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי חריגה 0 0x %X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× ×ž×¦×‘ ×œ× ×ž×–×•×”×” %d"
+
+#: common.c:121
+#, c-format
+msgid "reading extensions\n"
+msgstr "קרי××” הרחבות\n"
+
+#: common.c:126
+#, c-format
+msgid "identifying extension members\n"
+msgstr "זיהוי חברי הרחבה\n"
+
+#: common.c:130
+#, c-format
+msgid "reading schemas\n"
+msgstr "קרי××” סכימות\n"
+
+#: common.c:141
+#, c-format
+msgid "reading user-defined tables\n"
+msgstr "קרי×ת טבל×ות המשתמש\n"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined functions\n"
+msgstr "קרי××” פונקציות המוגדרות על-ידי המשתמש\n"
+
+#: common.c:155
+#, c-format
+msgid "reading user-defined types\n"
+msgstr "קרי××” ×˜×™×¤×•×¡×™× ×”×ž×•×’×“×¨×™× ×¢×œ-ידי המשתמש\n"
+
+#: common.c:161
+#, c-format
+msgid "reading procedural languages\n"
+msgstr "קרי××” שפות פרוצדור×ליות\n"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions\n"
+msgstr "קרי××” פונקציות צבירה המוגדרות על-ידי המשתמש\n"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined operators\n"
+msgstr "קרי××” ××•×¤×¨×˜×•×¨×™× ×”×ž×•×’×“×¨×™× ×¢×œ-ידי המשתמש\n"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined access methods\n"
+msgstr "קרי××” שיטות גישה המוגדרות על-ידי המשתמש\n"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined operator classes\n"
+msgstr "קרי×ת מחלקות ×ופרטור המוגדרות על ידי המשתמש\n"
+
+#: common.c:182
+#, c-format
+msgid "reading user-defined operator families\n"
+msgstr "קרי×ת משפחות ×ופרטור המוגדרות על ידי המשתמש\n"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search parsers\n"
+msgstr "קרי×ת מנתחי מבנה החיפוש טקסט ×”×ž×•×’×“×¨×™× ×¢×œ-ידי המשתמש\n"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined text search templates\n"
+msgstr "קרי×ת תבניות החיפוש טקסט המוגדרות על-ידי המשתמש\n"
+
+#: common.c:194
+#, c-format
+msgid "reading user-defined text search dictionaries\n"
+msgstr "קרי×ת מילוני חיפוש טקסט ×”×ž×’×“×¨×™× ×¢×œ-ידי המשתמש חיפוש\n"
+
+#: common.c:198
+#, c-format
+msgid "reading user-defined text search configurations\n"
+msgstr "קרי×ת תצורות חיפוש טקסט המוגדרות על-ידי המשתמש\n"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined foreign-data wrappers\n"
+msgstr "קרי××” עטיפות × ×ª×•× ×™× ×–×¨×™× ×”×ž×•×’×“×¨×•×ª על-ידי המשתמש\n"
+
+#: common.c:206
+#, c-format
+msgid "reading user-defined foreign servers\n"
+msgstr "הקרי××” ×©×¨×ª×™× ×–×¨×™× ×”×ž×•×’×“×¨×™× ×¢×œ-ידי המשתמש\n"
+
+#: common.c:210
+#, c-format
+msgid "reading default privileges\n"
+msgstr "קרי×ת הרש×ות ברירת מחדל\n"
+
+#: common.c:214
+#, c-format
+msgid "reading user-defined collations\n"
+msgstr "הקרי××” ×–×¨×™× ×”×ž×•×’×“×¨×™× ×¢×œ-ידי המשתמש\n"
+
+#: common.c:219
+#, c-format
+msgid "reading user-defined conversions\n"
+msgstr "הקרי××” המרות המוגדרות על-ידי המשתמש\n"
+
+#: common.c:223
+#, c-format
+msgid "reading type casts\n"
+msgstr "קרי×ות סוגי הטלות\n"
+
+#: common.c:227
+#, c-format
+msgid "reading transforms\n"
+msgstr "קרי××” שינויי צורה\n"
+
+#: common.c:231
+#, c-format
+msgid "reading table inheritance information\n"
+msgstr "קרי×ת המידע על ירושת הטבלה\n"
+
+#: common.c:235
+#, c-format
+msgid "reading event triggers\n"
+msgstr "קרי××” ×˜×¨×™×’×¨×™× ×©×œ ×ירוע\n"
+
+#: common.c:240
+#, c-format
+msgid "finding extension tables\n"
+msgstr "מצי×ת טבל×ות ההרחבה\n"
+
+#: common.c:245
+#, c-format
+msgid "finding inheritance relationships\n"
+msgstr "מצי×ת יחסי ירושה\n"
+
+#: common.c:249
+#, c-format
+msgid "reading column info for interesting tables\n"
+msgstr "קרי××” מידע על עמודה של טבל×ות מעניינות\n"
+
+#: common.c:253
+#, c-format
+msgid "flagging inherited columns in subtables\n"
+msgstr "סימון עמודות מורשות בתת טבל×ות\n"
+
+#: common.c:257
+#, c-format
+msgid "reading indexes\n"
+msgstr "קרי××” ×ינדקסי×\n"
+
+#: common.c:261
+#, c-format
+msgid "reading extended statistics\n"
+msgstr "קרי××” סטטיסטיקה מורחבת\n"
+
+#: common.c:265
+#, c-format
+msgid "reading constraints\n"
+msgstr "קרי××” ×ילוצי×\n"
+
+#: common.c:269
+#, c-format
+msgid "reading triggers\n"
+msgstr "קרי××” טריגירי×\n"
+
+#: common.c:273
+#, c-format
+msgid "reading rewrite rules\n"
+msgstr "קרי××” ×—×•×§×™× ×œ×©×›×ª×‘\n"
+
+#: common.c:277
+#, c-format
+msgid "reading policies\n"
+msgstr "קרי××” מדיניות\n"
+
+#: common.c:281
+#, c-format
+msgid "reading publications\n"
+msgstr "קרי××” פרסומי×\n"
+
+#: common.c:285
+#, c-format
+msgid "reading publication membership\n"
+msgstr "קרי××” לחברות פרסו×\n"
+
+#: common.c:289
+#, c-format
+msgid "reading subscriptions\n"
+msgstr "קרי××” מנויי×\n"
+
+#: common.c:924
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n"
+msgstr "בדיקת שפיות נכשלה, ×ובייקט ×”×בOID %u של טבלה '%s' (OID %u) ×œ× × ×ž×¦×\n"
+
+#: common.c:966
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לנתח ×ת מערך מספרי \"%s\": ×ž×¡×¤×¨×™× ×¨×‘×™× ×ž×“×™\n"
+
+#: common.c:981
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לנתח ×ת מערך מספרי \"%s\": תו ×œ× ×—×•×§×™ במספר\n"
+
+#. translator: this is a module name
+#: compress_io.c:78
+msgid "compress_io"
+msgstr "compress_io"
+
+#: compress_io.c:114
+#, c-format
+msgid "invalid compression code: %d\n"
+msgstr "קוד דחיסה ×œ× ×—×•×§×™: %d\n"
+
+#: compress_io.c:138 compress_io.c:174 compress_io.c:192 compress_io.c:519
+#: compress_io.c:562
+#, c-format
+msgid "not built with zlib support\n"
+msgstr "×œ× ×‘× ×•×™ ×¢× ×ª×ž×™×›×” zlib\n"
+
+#: compress_io.c:242 compress_io.c:344
+#, c-format
+msgid "could not initialize compression library: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ל×תחל ×ת ספריית דחיסה: %s\n"
+
+#: compress_io.c:263
+#, c-format
+msgid "could not close compression stream: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור ×–×¨× ×“×—×™×¡×”: %s\n"
+
+#: compress_io.c:281
+#, c-format
+msgid "could not compress data: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לדחוס נתוני×: %s\n"
+
+#: compress_io.c:361 compress_io.c:377
+#, c-format
+msgid "could not uncompress data: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לבטל ×ת דחיסת הנתוני×: %s\n"
+
+#: compress_io.c:385
+#, c-format
+msgid "could not close compression library: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור ×ת הספרייה דחיסה: %s\n"
+
+#: compress_io.c:596 compress_io.c:632 pg_backup_custom.c:587
+#: pg_backup_tar.c:559
+#, c-format
+msgid "could not read from input file: %s\n"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ž×ª×•×š קובץ הקלט: %s\n"
+
+#: compress_io.c:635 pg_backup_custom.c:584 pg_backup_directory.c:543
+#: pg_backup_tar.c:795 pg_backup_tar.c:819
+#, c-format
+msgid "could not read from input file: end of file\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×§×¨×•× ×ž×ª×•×š קובץ הקלט: סוף הקובץ\n"
+
+#: parallel.c:198
+msgid "parallel archiver"
+msgstr "×רכיבר מקבילי"
+
+#: parallel.c:265
+#, c-format
+msgid "%s: WSAStartup failed: %d\n"
+msgstr "תכנית %s: נכשל WSAStartup : %d\n"
+
+#: parallel.c:971
+#, c-format
+msgid "could not create communication channels: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ליצור ערוצי תקשורת: %s\n"
+
+#: parallel.c:1036
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ליצור תהליך עובד: %s\n"
+
+#: parallel.c:1167
+#, c-format
+msgid "unrecognized command received from master: \"%s\"\n"
+msgstr "פקודה ×œ× ×ž×–×•×”×” נתקבלה מהמ×סטר: \"%s\"\n"
+
+#: parallel.c:1211 parallel.c:1451
+#, c-format
+msgid "invalid message received from worker: \"%s\"\n"
+msgstr "הודעה ×œ× ×—×•×§×™×ª נתקבלה מתהליך העובד: \"%s\"\n"
+
+#: parallel.c:1344
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table.\n"
+msgstr ""
+"×œ× ×”×™×ª×” ×פשרות להשיג נעילה על היחס \"%s\"\n"
+"×–×” בדרך כלל ×ומר ×›×™ מישהו ביקש נעילת גישה בלעדית על הטבלה ל×חר שתהליך ×”×ב pg_dump קיבל נעילת גישה המשותפת הר×שונית על הטבלה.\n"
+
+#: parallel.c:1433
+#, c-format
+msgid "a worker process died unexpectedly\n"
+msgstr "תהליך עובד נעצר ב×ופן בלתי צפוי\n"
+
+#: parallel.c:1557 parallel.c:1675
+#, c-format
+msgid "could not write to the communication channel: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לכתוב לערוץ תקשורת: %s\n"
+
+#: parallel.c:1635
+#, c-format
+msgid "select() failed: %s\n"
+msgstr "נכשל select(): %s\n"
+
+#: parallel.c:1760
+#, c-format
+msgid "pgpipe: could not create socket: error code %d\n"
+msgstr "תכנית pgpipe: ×œ× ×”×™×ª×” ×פשרות ליצור שקע: קוד שגי××” %d\n"
+
+#: parallel.c:1771
+#, c-format
+msgid "pgpipe: could not bind: error code %d\n"
+msgstr "תכנית pgpipe: ×œ× ×”×™×ª×” ×פשרות לקשור: קוד שגי××” %d\n"
+
+#: parallel.c:1778
+#, c-format
+msgid "pgpipe: could not listen: error code %d\n"
+msgstr "תכנית pgpipe: ×œ× ×”×™×ª×” ×פשרות לה×זין: קוד שגי××” %d\n"
+
+#: parallel.c:1785
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d\n"
+msgstr "תכנית pgpipe: נכשל getsockname() : קוד שגי××” %d\n"
+
+#: parallel.c:1796
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d\n"
+msgstr "תכנית pgpipe: ×œ× ×”×™×ª×” ×פשרות ליצור שקע שני: קוד שגי××” %d\n"
+
+#: parallel.c:1805
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d\n"
+msgstr "תכנית pgpipe: ×œ× ×”×™×ª×” ×פשרות לחבר שקע: קוד שגי××” %d\n"
+
+#: parallel.c:1814
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d\n"
+msgstr "תכנית pgpipe: ×œ× ×”×™×ª×” ×פשרות לקבל חיבור: קוד שגי××” %d\n"
+
+#. translator: this is a module name
+#: pg_backup_archiver.c:53
+msgid "archiver"
+msgstr "×רכיבר"
+
+#: pg_backup_archiver.c:243 pg_backup_archiver.c:1573
+#, c-format
+msgid "could not close output file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור קובץ הפלט: %s\n"
+
+#: pg_backup_archiver.c:289 pg_backup_archiver.c:294
+#, c-format
+msgid "WARNING: archive items not in correct section order\n"
+msgstr "×זהרה: פריטי ×רכיון ×œ× ×‘×¡×“×¨ נכון במחלקה\n"
+
+#: pg_backup_archiver.c:300
+#, c-format
+msgid "unexpected section code %d\n"
+msgstr "קוד סעיף ×œ× ×¦×¤×•×™ %d\n"
+
+#: pg_backup_archiver.c:336
+#, c-format
+msgid "-C and -1 are incompatible options\n"
+msgstr "×”×ופציות ×œ× ×ª×•×מות -C ו-1\n"
+
+#: pg_backup_archiver.c:346
+#, c-format
+msgid "parallel restore is not supported with this archive file format\n"
+msgstr "שחזור מקבילי ×ינו נתמך ×¢× ×¤×•×¨×ž×˜ קובץ ×רכיון ×–×”\n"
+
+#: pg_backup_archiver.c:350
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump\n"
+msgstr "שחזור מקבילי ××™× ×” נתמך ×¢× ×רכיון שנעשו על ידי pg_dump טרו×-8.0\n"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)\n"
+msgstr "×ין ×פשרות לשחזר מ×רכיון דחוס (דחיסה נתמכות בהתקנה זו)\n"
+
+#: pg_backup_archiver.c:385
+#, c-format
+msgid "connecting to database for restore\n"
+msgstr "התחברות למסד × ×ª×•× ×™× ×¢×‘×•×¨ שחזור\n"
+
+#: pg_backup_archiver.c:387
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives\n"
+msgstr "×—×™×‘×•×¨×™× ×™×©×™×¨×™× ×œ×ž×¡×“ × ×ª×•× ×™× ××™× × × ×ª×ž×›×™× ×‘××¨×›×™×•× ×™× ×˜×¨×•×-1.3\n"
+
+#: pg_backup_archiver.c:432
+#, c-format
+msgid "implied data-only restore\n"
+msgstr "שחזור × ×ª×•× ×™× ×‘×œ×‘×“ משתמע\n"
+
+#: pg_backup_archiver.c:502
+#, c-format
+msgid "dropping %s %s\n"
+msgstr "משחרר %s %s\n"
+
+#: pg_backup_archiver.c:595
+#, c-format
+msgid "WARNING: could not find where to insert IF EXISTS in statement \"%s\"\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×”×™×›×Ÿ להוסיף ×× IF EXISTS במשפט \"%s\"\n"
+
+#: pg_backup_archiver.c:671
+#, c-format
+msgid "setting owner and privileges for %s \"%s.%s\"\n"
+msgstr "הגדרת ×”×‘×¢×œ×™× ×•×”×¨×©×ות עבור %s \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:674
+#, c-format
+msgid "setting owner and privileges for %s \"%s\"\n"
+msgstr "הגדרת ×”×‘×¢×œ×™× ×•×”×¨×©×ות עבור %s \"%s\"\n"
+
+#: pg_backup_archiver.c:740 pg_backup_archiver.c:742
+#, c-format
+msgid "warning from original dump file: %s\n"
+msgstr "×זהרה מקובץ dump המקורי: %s\n"
+
+#: pg_backup_archiver.c:751
+#, c-format
+msgid "creating %s \"%s.%s\"\n"
+msgstr "יצירת %s \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:754
+#, c-format
+msgid "creating %s \"%s\"\n"
+msgstr "יצירת %s \"%s\"\n"
+
+#: pg_backup_archiver.c:806
+#, c-format
+msgid "connecting to new database \"%s\"\n"
+msgstr "התחברות למסד × ×ª×•× ×™× ×—×“×© \"%s\"\n"
+
+#: pg_backup_archiver.c:834
+#, c-format
+msgid "processing %s\n"
+msgstr "עיבוד %s\n"
+
+#: pg_backup_archiver.c:854
+#, c-format
+msgid "processing data for table \"%s.%s\"\n"
+msgstr "עיבוד × ×ª×•× ×™× ×¢×‘×•×¨ טבלה \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:916
+#, c-format
+msgid "executing %s %s\n"
+msgstr "ביצוע %s %s\n"
+
+#: pg_backup_archiver.c:955
+#, c-format
+msgid "disabling triggers for %s\n"
+msgstr "נטרול ×˜×¨×™×’×¨×™× ×¢×‘×•×¨ %s\n"
+
+#: pg_backup_archiver.c:983
+#, c-format
+msgid "enabling triggers for %s\n"
+msgstr "הפעלת ×˜×¨×™×’×¨×™× ×¢×‘×•×¨ %s\n"
+
+#: pg_backup_archiver.c:1013
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine\n"
+msgstr "שגי××” פנימית - ×ין ×פשרות ×œ×§×¨×•× ×œWriteData מחוץ להקשר של שיגרה DataDumper\n"
+
+#: pg_backup_archiver.c:1211
+#, c-format
+msgid "large-object output not supported in chosen format\n"
+msgstr "×ין תמיכה בתבנית שבחרת בפלט large-object\n"
+
+#: pg_backup_archiver.c:1269
+#, c-format
+msgid "restored %d large object\n"
+msgid_plural "restored %d large objects\n"
+msgstr[0] "משוחזר %d ×ובייקט גדול\n"
+msgstr[1] "×ž×©×•×—×–×¨×™× %d ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×\n"
+
+#: pg_backup_archiver.c:1290 pg_backup_tar.c:737
+#, c-format
+msgid "restoring large object with OID %u\n"
+msgstr "שחזור ×ובייקט גדול ×¢× OID %u\n"
+
+#: pg_backup_archiver.c:1302
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "×œ× ×”×™×ª×” ×פשרות ליצור ×ובייקט גדול % u: %s"
+
+#: pg_backup_archiver.c:1307 pg_dump.c:3085
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת ×ובייקט גדול % u: %s"
+
+#: pg_backup_archiver.c:1365
+#, c-format
+msgid "could not open TOC file \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לפתוח קובץ TOC \"%s\": %s\n"
+
+#: pg_backup_archiver.c:1406
+#, c-format
+msgid "WARNING: line ignored: %s\n"
+msgstr "×זהרה: התעלמות מהשורה: %s\n"
+
+#: pg_backup_archiver.c:1413
+#, c-format
+msgid "could not find entry for ID %d\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×¨×©×•×ž×” עבור מזהה %d\n"
+
+#: pg_backup_archiver.c:1434 pg_backup_directory.c:225
+#: pg_backup_directory.c:592
+#, c-format
+msgid "could not close TOC file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור קובץ TOC: %s\n"
+
+#: pg_backup_archiver.c:1543 pg_backup_custom.c:158 pg_backup_directory.c:336
+#: pg_backup_directory.c:578 pg_backup_directory.c:643
+#: pg_backup_directory.c:663
+#, c-format
+msgid "could not open output file \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח קובץ פלט \"%s\": %s\n"
+
+#: pg_backup_archiver.c:1546 pg_backup_custom.c:165
+#, c-format
+msgid "could not open output file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ הפלט: %s\n"
+
+#: pg_backup_archiver.c:1652
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)\n"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)\n"
+msgstr[0] "נכתב % lu בית של נתוני ×”×ובייקט הגדול (תוצ××” = % lu)\n"
+msgstr[1] "נכתבו % lu ×‘×ª×™× ×©×œ נתוני ×”×ובייקט הגדול (תוצ××” = % lu)\n"
+
+#: pg_backup_archiver.c:1658
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)\n"
+msgstr "×œ× ×ž×¦×œ×™×— לכתוב על ×ובייקט גדול (תוצ××”: % lu, צפוי: % lu)\n"
+
+#: pg_backup_archiver.c:1751
+#, c-format
+msgid "Error while INITIALIZING:\n"
+msgstr "×ירעה שגי××” בעת מ×תחל:\n"
+
+#: pg_backup_archiver.c:1756
+#, c-format
+msgid "Error while PROCESSING TOC:\n"
+msgstr "×ירעה שגי××” בעת עיבוד TOC:\n"
+
+#: pg_backup_archiver.c:1761
+#, c-format
+msgid "Error while FINALIZING:\n"
+msgstr "×ירעה שגי××” בעת סיו×:\n"
+
+#: pg_backup_archiver.c:1766
+#, c-format
+msgid "Error from TOC entry %d; %u %u %s %s %s\n"
+msgstr "שגי×ת מערך TOC %d; %u %u %s %s %s\n"
+
+#: pg_backup_archiver.c:1839
+#, c-format
+msgid "bad dumpId\n"
+msgstr "מזהה dump ×œ× ×—×•×§×™\n"
+
+#: pg_backup_archiver.c:1860
+#, c-format
+msgid "bad table dumpId for TABLE DATA item\n"
+msgstr "מזהה dump ×œ× ×—×•×§×™ עבור פריט × ×ª×•× ×™× ×‘×˜×‘×œ×”\n"
+
+#: pg_backup_archiver.c:1952
+#, c-format
+msgid "unexpected data offset flag %d\n"
+msgstr "דגל היסט בלתי צפוי %d\n"
+
+#: pg_backup_archiver.c:1965
+#, c-format
+msgid "file offset in dump file is too large\n"
+msgstr "היסט הקובץ בקובץ ב dump גדול מדי\n"
+
+#: pg_backup_archiver.c:2078
+#, c-format
+msgid "attempting to ascertain archive format\n"
+msgstr "ניסיון לברר תבנית ×רכיון\n"
+
+#: pg_backup_archiver.c:2104 pg_backup_archiver.c:2114
+#, c-format
+msgid "directory name too long: \"%s\"\n"
+msgstr "×©× ×”×¡×¤×¨×™×” ×רוך מדי: \"%s\"\n"
+
+#: pg_backup_archiver.c:2122
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)\n"
+msgstr "תיקייה '%s' ××™× ×” מופיעה ×›×™ ×רכיון תקין (\"toc.dat\" ×ינו קיי×)\n"
+
+#: pg_backup_archiver.c:2130 pg_backup_custom.c:177 pg_backup_custom.c:770
+#: pg_backup_directory.c:209 pg_backup_directory.c:394
+#, c-format
+msgid "could not open input file \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח קובץ קלט \"%s\": %s\n"
+
+#: pg_backup_archiver.c:2138 pg_backup_custom.c:184
+#, c-format
+msgid "could not open input file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ קלט: %s\n"
+
+#: pg_backup_archiver.c:2145
+#, c-format
+msgid "could not read input file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×§×¨×•× ×ž×ª×•×š קובץ הקלט: %s\n"
+
+#: pg_backup_archiver.c:2147
+#, c-format
+msgid "input file is too short (read %lu, expected 5)\n"
+msgstr "קובץ הקלט קצר מדי (×œ×§×¨×•× % lu, מצופה 5)\n"
+
+#: pg_backup_archiver.c:2232
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql.\n"
+msgstr "קובץ הקלט נר××” כקובץ בתבנית טקסט. ×× × ×”×©×ª×ž×© psql.\n"
+
+#: pg_backup_archiver.c:2238
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)\n"
+msgstr "קובץ הקלט ×ינו נר××” כקובץ ×רכיון חוקי (קצר מדי?)\n"
+
+#: pg_backup_archiver.c:2244
+#, c-format
+msgid "input file does not appear to be a valid archive\n"
+msgstr "קובץ הקלט ×ינו נר××” כקובץ ×רכיון חוקי\n"
+
+#: pg_backup_archiver.c:2264
+#, c-format
+msgid "could not close input file: %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לסגור קובץ הקלט: %s\n"
+
+#: pg_backup_archiver.c:2282
+#, c-format
+msgid "allocating AH for %s, format %d\n"
+msgstr "הקצ×ת AH עבור %s, תבנית %d\n"
+
+#: pg_backup_archiver.c:2383
+#, c-format
+msgid "unrecognized file format \"%d\"\n"
+msgstr "תבנית קובץ ×œ× ×ž×–×•×”×” \"%d\"\n"
+
+#: pg_backup_archiver.c:2438 pg_backup_archiver.c:4204
+#, c-format
+msgid "finished item %d %s %s\n"
+msgstr "פריט מוגמר %d %s %s\n"
+
+#: pg_backup_archiver.c:2442 pg_backup_archiver.c:4217
+#, c-format
+msgid "worker process failed: exit code %d\n"
+msgstr "תהליך עובד נכשל: יצי××” קוד %d\n"
+
+#: pg_backup_archiver.c:2562
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC\n"
+msgstr "מזהה כניסה% d מחוץ לטווח - ×ולי TOC מושחת\n"
+
+#: pg_backup_archiver.c:2678
+#, c-format
+msgid "read TOC entry %d (ID %d) for %s %s\n"
+msgstr "×§×¨×•× ×¢×¨×š מתוך TOC %d (מזהה %d) עבור %s %s\n"
+
+#: pg_backup_archiver.c:2712
+#, c-format
+msgid "unrecognized encoding \"%s\"\n"
+msgstr "קידוד ×œ× ×ž×–×•×”×” \"%s\"\n"
+
+#: pg_backup_archiver.c:2717
+#, c-format
+msgid "invalid ENCODING item: %s\n"
+msgstr "פריט ENCODING ×œ× ×—×•×§×™×ª: %s\n"
+
+#: pg_backup_archiver.c:2735
+#, c-format
+msgid "invalid STDSTRINGS item: %s\n"
+msgstr "פריט STDSTRINGS ×œ× ×—×•×§×™×ª: %s\n"
+
+#: pg_backup_archiver.c:2750
+#, c-format
+msgid "schema \"%s\" not found\n"
+msgstr "סכימת \"%s\" ×œ× × ×ž×¦××”\n"
+
+#: pg_backup_archiver.c:2757
+#, c-format
+msgid "table \"%s\" not found\n"
+msgstr "טבלה '%s' ×œ× × ×ž×¦××”\n"
+
+#: pg_backup_archiver.c:2764
+#, c-format
+msgid "index \"%s\" not found\n"
+msgstr "×ינדקס \"%s\" ×œ× × ×ž×¦×\n"
+
+#: pg_backup_archiver.c:2771
+#, c-format
+msgid "function \"%s\" not found\n"
+msgstr "פונקציית \"%s\" ×œ× × ×ž×¦××”\n"
+
+#: pg_backup_archiver.c:2778
+#, c-format
+msgid "trigger \"%s\" not found\n"
+msgstr "טריגר \"%s\" ×œ× × ×ž×¦×\n"
+
+#: pg_backup_archiver.c:3034
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "×œ× ×”×™×ª×” ×פשרות להגדיר ×ת הפעלת המשתמש \"%s\": %s"
+
+#: pg_backup_archiver.c:3066
+#, c-format
+msgid "could not set default_with_oids: %s"
+msgstr "×œ× ×”×™×ª×” ×פשרות להגדיר ×ת default_with_oids: %s"
+
+#: pg_backup_archiver.c:3211
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "×œ× ×”×™×ª×” ×פשרות להגדיר ×ת search_path ל \"%s\": %s"
+
+#: pg_backup_archiver.c:3273
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "×œ× ×”×™×ª×” ×פשרות להגדיר default_tablespace ל %s: %s"
+
+#: pg_backup_archiver.c:3362 pg_backup_archiver.c:3559
+#, c-format
+msgid "WARNING: don't know how to set owner for object type %s\n"
+msgstr "×זהרה: ×œ× ×™×•×“×¢ ×יך להגדיר ×‘×¢×œ×™× ×¢×‘×•×¨ סוג ×”×ובייקט %s\n"
+
+#: pg_backup_archiver.c:3646
+#, c-format
+msgid "did not find magic string in file header\n"
+msgstr "×œ× ×ž×¦× ×ž×—×¨×•×–×ª ×”×§×¡× ×‘×›×•×ª×¨×ª הקובץ\n"
+
+#: pg_backup_archiver.c:3659
+#, c-format
+msgid "unsupported version (%d.%d) in file header\n"
+msgstr "גירסה ×œ× × ×ª×ž×›×ª (% d.%d) בכותרת הקובץ\n"
+
+#: pg_backup_archiver.c:3664
+#, c-format
+msgid "sanity check on integer size (%lu) failed\n"
+msgstr "בדיקת שפיות על גודל מספר ×©×œ× (% lu) נכשלה\n"
+
+#: pg_backup_archiver.c:3668
+#, c-format
+msgid "WARNING: archive was made on a machine with larger integers, some operations might fail\n"
+msgstr "×זהרה: ×”×רכיון בוצע על מכונה ×¢× ×ž×¡×¤×¨×™× ×©×œ×ž×™× ×’×“×•×œ×™× ×™×•×ª×¨, פעולות מסוימות עשוי להיכשל\n"
+
+#: pg_backup_archiver.c:3678
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)\n"
+msgstr "תבנית הצפוי (%d) שונה מתבנית הנמצ××” בקובץ (%d)\n"
+
+#: pg_backup_archiver.c:3694
+#, c-format
+msgid "WARNING: archive is compressed, but this installation does not support compression -- no data will be available\n"
+msgstr "×זהרה: ×רכיון דחוס, ×בל התקנה זו ××™× ×” תומכת דחיסה - ×œ× ×™×”×™×• × ×ª×•× ×™× ×–×ž×™× ×™×\n"
+
+#: pg_backup_archiver.c:3712
+#, c-format
+msgid "WARNING: invalid creation date in header\n"
+msgstr "×זהרה: ת×ריך יצירה ×œ× ×—×•×§×™ בכותרת\n"
+
+#: pg_backup_archiver.c:3787
+#, c-format
+msgid "entering restore_toc_entries_prefork\n"
+msgstr "כניסה ל restore_toc_entries_prefork\n"
+
+#: pg_backup_archiver.c:3831
+#, c-format
+msgid "processing item %d %s %s\n"
+msgstr "עיבוד פריט %d %s %s\n"
+
+#: pg_backup_archiver.c:3881
+#, c-format
+msgid "entering restore_toc_entries_parallel\n"
+msgstr "כניסה ל restore_toc_entries_parallel\n"
+
+#: pg_backup_archiver.c:3929
+#, c-format
+msgid "entering main parallel loop\n"
+msgstr "הכניסה ללול××” מקבילה ר×שית \n"
+
+#: pg_backup_archiver.c:3940
+#, c-format
+msgid "skipping item %d %s %s\n"
+msgstr "דילוג על פריט %d %s %s\n"
+
+#: pg_backup_archiver.c:3950
+#, c-format
+msgid "launching item %d %s %s\n"
+msgstr "השקת פריט %d %s %s\n"
+
+#: pg_backup_archiver.c:3981
+#, c-format
+msgid "finished main parallel loop\n"
+msgstr "×¡×™×•× ×œ×•×œ××” מקבילה ר×שית\n"
+
+#: pg_backup_archiver.c:3990
+#, c-format
+msgid "entering restore_toc_entries_postfork\n"
+msgstr "כניסה ל restore_toc_entries_postfork\n"
+
+#: pg_backup_archiver.c:4009
+#, c-format
+msgid "processing missed item %d %s %s\n"
+msgstr "עיבוד פריט שפוספס %d %s %s\n"
+
+#: pg_backup_archiver.c:4160
+#, c-format
+msgid "no item ready\n"
+msgstr "×ין פריט מוכן\n"
+
+#: pg_backup_archiver.c:4379
+#, c-format
+msgid "transferring dependency %d -> %d to %d\n"
+msgstr "העברת תלות %d-> %d עד %d\n"
+
+#: pg_backup_archiver.c:4452
+#, c-format
+msgid "reducing dependencies for %d\n"
+msgstr "×¦×ž×¦×•× ×™×—×¡×™ התלות עבור %d\n"
+
+#: pg_backup_archiver.c:4491
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ליצור טבלה '%s', ×”× ×ª×•× ×™× ×©×œ×” ×œ× ×™×©×•×—×–×¨×•\n"
+
+#. translator: this is a module name
+#: pg_backup_custom.c:93
+msgid "custom archiver"
+msgstr "×רכיבר מות×× ×ישית"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:150
+#, c-format
+msgid "invalid OID for large object\n"
+msgstr "מזהה ×”×ובייקט OID ×œ× ×—×•×§×™ עבור ×ובייקט גדול\n"
+
+#: pg_backup_custom.c:451
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive\n"
+msgstr "סוג בלוק × ×ª×•× ×™× ×œ× ×ž×–×•×”×” (% d) בעת חיפוש ב×רכיון\n"
+
+#: pg_backup_custom.c:462
+#, c-format
+msgid "error during file seek: %s\n"
+msgstr "שגי××” בעת חיפוש קובץ: %s\n"
+
+#: pg_backup_custom.c:472
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n"
+msgstr "×œ× ×™×›×•×œ ×œ×ž×¦×•× ×ת מזהה הבלוק % d ב×רכיון - ×ולי בשל בקשת שחזור ש××™× ×” מסודרת, ×©×œ× × ×™×ª×Ÿ לטפל בה עקב חוסר קיזוז × ×ª×•× ×™× ×‘×רכיון\n"
+
+#: pg_backup_custom.c:477
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file\n"
+msgstr "×œ× ×™×›×•×œ ×œ×ž×¦×•× ×ת מזהה הבלוק% d ב×רכיון - ×ולי בשל בקשת שחזור ש××™× ×” מסודרת, ×©×œ× × ×™×ª×Ÿ לטפל בה עקב קובץ קלט ש×ינו ניתן לחיפוש בו\n"
+
+#: pg_backup_custom.c:482
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive\n"
+msgstr "×œ× ×™×›×•×œ ×œ×ž×¦×•× ×ת מזהה הבלוק% d ב×רכיון - ×ולי בשל בקשת שחזור ש××™× ×” מסודרת, ×©×œ× × ×™×ª×Ÿ לטפל בה עקב קובץ ×רכיון מושחת\n"
+
+#: pg_backup_custom.c:489
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d\n"
+msgstr "× ×ž×¦× ×ž×–×”×” בלוק ×œ× ×¦×¤×•×™ (%d) בעת קרי×ת ×”× ×ª×•× ×™× - %d הצפוי\n"
+
+#: pg_backup_custom.c:503
+#, c-format
+msgid "unrecognized data block type %d while restoring archive\n"
+msgstr "סוג בלוק × ×ª×•× ×™× ×œ× ×ž×–×•×”×” %d תוך שחזור ×”×רכיון\n"
+
+#: pg_backup_custom.c:705 pg_backup_custom.c:759 pg_backup_custom.c:844
+#: pg_backup_tar.c:1090
+#, c-format
+msgid "could not determine seek position in archive file: %s\n"
+msgstr "×œ× ×™×›×•×œ לקבוע ×ת ×”×ž×™×§×•× ×œ×—×¤×© בקובץ ×”×רכיון: %s\n"
+
+#: pg_backup_custom.c:723 pg_backup_custom.c:764
+#, c-format
+msgid "could not close archive file: %s\n"
+msgstr "×œ× ×™×›×•×œ לסגור ×ת קובץ ×”×רכיון: %s\n"
+
+#: pg_backup_custom.c:746
+#, c-format
+msgid "can only reopen input archives\n"
+msgstr "יכול רק לפתוח מחדש ×ת ×רכיוני הקלט\n"
+
+#: pg_backup_custom.c:753
+#, c-format
+msgid "parallel restore from standard input is not supported\n"
+msgstr "שחזור מקבילי מקלט סטנדרטי ×ינו נתמך\n"
+
+#: pg_backup_custom.c:755
+#, c-format
+msgid "parallel restore from non-seekable file is not supported\n"
+msgstr "שחזור מקבילי מקובץ ש×ינו ניתן לחיפוש ×ינו נתמך\n"
+
+#: pg_backup_custom.c:774
+#, c-format
+msgid "could not set seek position in archive file: %s\n"
+msgstr "×œ× ×™×›×•×œ לקבוע ×ת ×”×ž×™×§×•× ×œ×—×¤×© בקובץ ×”×רכיון: %s\n"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "compressor active\n"
+msgstr "מדחס פעיל\n"
+
+#: pg_backup_custom.c:848
+#, c-format
+msgid "WARNING: ftell mismatch with expected position -- ftell used\n"
+msgstr "×זהרה: ××™ הת×מה ב ftell ×¢× ×”×ž×™×§×•× ×”×¦×¤×•×™ -- ftell בשימוש\n"
+
+#. translator: this is a module name
+#: pg_backup_db.c:29
+msgid "archiver (db)"
+msgstr "×רכיבר (db)"
+
+#: pg_backup_db.c:45
+#, c-format
+msgid "could not get server_version from libpq\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לקבל server_version מ- libpq\n"
+
+#: pg_backup_db.c:56 pg_dumpall.c:2057
+#, c-format
+msgid "server version: %s; %s version: %s\n"
+msgstr "גירסת שרת: %s; %s גירסה: %s\n"
+
+#: pg_backup_db.c:58 pg_dumpall.c:2059
+#, c-format
+msgid "aborting because of server version mismatch\n"
+msgstr "ביטול עקב ××™-הת×מה של גירסת השרת\n"
+
+#: pg_backup_db.c:148
+#, c-format
+msgid "connecting to database \"%s\" as user \"%s\"\n"
+msgstr "התחברות למסד ×”× ×ª×•× ×™× \"%s\" כמשתמש \"%s\"\n"
+
+#: pg_backup_db.c:155 pg_backup_db.c:204 pg_backup_db.c:265 pg_backup_db.c:306
+#: pg_dumpall.c:1880 pg_dumpall.c:1994
+msgid "Password: "
+msgstr "סיסמה: "
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "failed to reconnect to database\n"
+msgstr "×œ× ×”×¦×œ×™×— להתחבר למסד נתוני×\n"
+
+#: pg_backup_db.c:192
+#, c-format
+msgid "could not reconnect to database: %s"
+msgstr "יכולתי להתחבר למסד נתוני×: %s"
+
+#: pg_backup_db.c:208
+#, c-format
+msgid "connection needs password\n"
+msgstr "החיבור צריך סיסמה\n"
+
+#: pg_backup_db.c:259
+#, c-format
+msgid "already connected to a database\n"
+msgstr "כבר מחובר למסד נתוני×\n"
+
+#: pg_backup_db.c:298
+#, c-format
+msgid "failed to connect to database\n"
+msgstr "×œ× ×”×¦×œ×™×— להתחבר ×ל מסד נתוני×\n"
+
+#: pg_backup_db.c:314
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "חיבור מסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: pg_backup_db.c:382
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:389
+#, c-format
+msgid "query failed: %s"
+msgstr "ש×ילתה נכשלה: %s"
+
+#: pg_backup_db.c:391
+#, c-format
+msgid "query was: %s\n"
+msgstr ""
+"ש×ילתה הייתה: %s\n"
+"\n"
+
+#: pg_backup_db.c:433
+#, c-format
+msgid "query returned %d row instead of one: %s\n"
+msgid_plural "query returned %d rows instead of one: %s\n"
+msgstr[0] "הש×ילתה החזירה שורה %d ×‘×ž×§×•× ×חד: %s\n"
+msgstr[1] "הש×ילתה החזירה %d שורות ×‘×ž×§×•× ×חד: %s\n"
+
+#: pg_backup_db.c:469
+#, c-format
+msgid "%s: %s Command was: %s\n"
+msgstr "תכנית %s: %s הפקודה היתה: %s\n"
+
+#: pg_backup_db.c:525 pg_backup_db.c:599 pg_backup_db.c:606
+msgid "could not execute query"
+msgstr "×œ× ×”×™×ª×” ×פשרות לבצע ש×ילתה"
+
+#: pg_backup_db.c:578
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "השגי××” שהחזיר PQputCopyData: %s"
+
+#: pg_backup_db.c:627
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "השגי××” שהחזיר PQputCopyEnd: %s"
+
+#: pg_backup_db.c:633
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "נכשל COPY עבור טבלה '%s': %s"
+
+#: pg_backup_db.c:639 pg_dump.c:1842
+#, c-format
+msgid "WARNING: unexpected extra results during COPY of table \"%s\"\n"
+msgstr "×זהרה: תוצ×ות בלתי צפויות נוספות במהלך COPY של הטבלה \"%s\"\n"
+
+#: pg_backup_db.c:651
+msgid "could not start database transaction"
+msgstr "×œ× ×”×™×ª×” ×פשרות ל×תחל טרנז×קציה"
+
+#: pg_backup_db.c:659
+msgid "could not commit database transaction"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×¡×™×™× ×˜×¨× ×–×קציה"
+
+#. translator: this is a module name
+#: pg_backup_directory.c:65
+msgid "directory archiver"
+msgstr "×רכיבר של ספרייה"
+
+#: pg_backup_directory.c:157
+#, c-format
+msgid "no output directory specified\n"
+msgstr "×œ× ×¦×•×™×™× ×” ספריית פלט\n"
+
+#: pg_backup_directory.c:186
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ž×ª×™×§×™×™×” \"%s\": %s\n"
+
+#: pg_backup_directory.c:190
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לסגור ×ת מדריך \"%s\": %s\n"
+
+#: pg_backup_directory.c:196
+#, c-format
+msgid "could not create directory \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ליצור תיקייה \"%s\": %s\n"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור קובץ הנתוני×: %s\n"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח קובץ TOC של ×ובייקט גדול \"%s\" עבור קלט: %s\n"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\"\n"
+msgstr "שורה ×œ× ×—×•×§×™×ª בקובץ TOC של ×ובייקט גדול \"%s\": \"%s\"\n"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\"\n"
+msgstr "שגי××” בקרי×ת הקובץ TOC של ×ובייקט גדול \"%s\"\n"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור קובץ TOC של ×ובייקט גדול \"%s\": %s\n"
+
+#: pg_backup_directory.c:686
+#, c-format
+msgid "could not write to blobs TOC file\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לכתוב לblobs של קובץ TOC\n"
+
+#: pg_backup_directory.c:718
+#, c-format
+msgid "file name too long: \"%s\"\n"
+msgstr "×©× ×§×•×‘×¥ ×רוך מדי: \"%s\"\n"
+
+#: pg_backup_null.c:75
+#, c-format
+msgid "this format cannot be read\n"
+msgstr "תבנית זו ×œ× × ×™×ª×Ÿ לקרו×\n"
+
+#. translator: this is a module name
+#: pg_backup_tar.c:103
+msgid "tar archiver"
+msgstr "×רכיבר tar"
+
+#: pg_backup_tar.c:181
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ TOC \"%s\" עבור פלט: %s\n"
+
+#: pg_backup_tar.c:189
+#, c-format
+msgid "could not open TOC file for output: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ TOC עבור פלט: %s\n"
+
+#: pg_backup_tar.c:210 pg_backup_tar.c:366
+#, c-format
+msgid "compression is not supported by tar archive format\n"
+msgstr "דחיסה ××™× ×” נתמכת על-ידי ×רכיון מפורמט tar\n"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח קובץ TOC \"%s\" עבור קלט: %s\n"
+
+#: pg_backup_tar.c:225
+#, c-format
+msgid "could not open TOC file for input: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ TOC עבור קלט: %s\n"
+
+#: pg_backup_tar.c:352
+#, c-format
+msgid "could not find file \"%s\" in archive\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×§×•×‘×¥ \"%s\" ב×רכיון\n"
+
+#: pg_backup_tar.c:418
+#, c-format
+msgid "could not generate temporary file name: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות להפיק ×©× ×”×§×•×‘×¥ הזמני: %s\n"
+
+#: pg_backup_tar.c:429
+#, c-format
+msgid "could not open temporary file\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לפתוח ×ת הקובץ הזמני\n"
+
+#: pg_backup_tar.c:456
+#, c-format
+msgid "could not close tar member\n"
+msgstr "×œ× ×™×›×•×œ לסגור חבר בקובץ tar\n"
+
+#: pg_backup_tar.c:569
+#, c-format
+msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+msgstr "שגי××” פנימית - ×œ× ×¦×•×™×™× ×• ×œ× th ×•×œ× fh ב- tarReadRaw()\n"
+
+#: pg_backup_tar.c:692
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\"\n"
+msgstr "תחביר משפט COPY בלתי צפוי: \"%s\"\n"
+
+#: pg_backup_tar.c:962
+#, c-format
+msgid "invalid OID for large object (%u)\n"
+msgstr "מזהה ×”×ובייקט OID ×œ× ×—×•×§×™ עבור ×ובייקט גדול (%u)\n"
+
+#: pg_backup_tar.c:1106
+#, c-format
+msgid "could not close temporary file: %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לסגור קובץ זמני: %s\n"
+
+#: pg_backup_tar.c:1116
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)\n"
+msgstr "×ורך הקובץ בפועל (%s) ×ינו תו×× ×œ×ורך הצפוי (%s)\n"
+
+#: pg_backup_tar.c:1153
+#, c-format
+msgid "moving from position %s to next member at file position %s\n"
+msgstr "הזזת ×ž×ž×§×•× %s לחבר ×”×‘× ×‘×ž×™×§×•× ×‘×§×•×‘×¥ %s\n"
+
+#: pg_backup_tar.c:1164
+#, c-format
+msgid "now at file position %s\n"
+msgstr "עכשיו ×‘×ž×™×§×•× ×‘×§×•×‘×¥ %s\n"
+
+#: pg_backup_tar.c:1173 pg_backup_tar.c:1203
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×›×•×ª×¨×ª עבור הקובץ \"%s\" ב×רכיון tar\n"
+
+#: pg_backup_tar.c:1187
+#, c-format
+msgid "skipping tar member %s\n"
+msgstr "דילוג על חבר בקובץ tar %s\n"
+
+#: pg_backup_tar.c:1191
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file.\n"
+msgstr "שחזור × ×ª×•× ×™× ×שר ×œ× ×‘×¡×“×¨ ×ינו נתמך בתבנית ×רכיון זו: \"%s\" נדרש, ×ך מגיע לפני \"%s\" בקובץ ×”×רכיון.\n"
+
+#: pg_backup_tar.c:1237
+#, c-format
+msgid "incomplete tar header found (%lu byte)\n"
+msgid_plural "incomplete tar header found (%lu bytes)\n"
+msgstr[0] "כותרת tar ×œ× ×©×œ×ž×” נמצ××” (% lu בית)\n"
+msgstr[1] "כותרת tar ×œ× ×©×œ×ž×” נמצ××” (% lu בתי×)\n"
+
+#: pg_backup_tar.c:1278
+#, c-format
+msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+msgstr "ערך TOC %s ב- %s (×ורך %s, checksum של %d)\n"
+
+#: pg_backup_tar.c:1289
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s\n"
+msgstr "כותרת tar מושחתת נמצ××” ב %s (צפוי%d, מחושב%d) ×ž×™×§×•× ×”×§×•×‘×¥ %s\n"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "%s: unrecognized section name: \"%s\"\n"
+msgstr "תכנית %s: סעיף ×œ× ×ž×–×•×”×” ש×: \"%s\"\n"
+
+#: pg_backup_utils.c:56 pg_dump.c:546 pg_dump.c:563 pg_dumpall.c:313
+#: pg_dumpall.c:323 pg_dumpall.c:333 pg_dumpall.c:342 pg_dumpall.c:358
+#: pg_dumpall.c:430 pg_restore.c:283 pg_restore.c:299 pg_restore.c:311
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: pg_backup_utils.c:118
+#, c-format
+msgid "out of on_exit_nicely slots\n"
+msgstr "מחוץ לחריצי on_exit_nicely\n"
+
+#: pg_dump.c:512
+#, c-format
+msgid "compression level must be in range 0..9\n"
+msgstr "רמת הדחיסה חייבת להיות בטווח 0..9\n"
+
+#: pg_dump.c:561 pg_dumpall.c:321 pg_restore.c:297
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "תכנית %s: יותר מדי ××¨×’×•×ž× ×˜×™× ×©×œ שורת הפקודה (הר×שון ×”×•× \"%s\")\n"
+
+#: pg_dump.c:582
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together\n"
+msgstr "×פשרויות -s/--schema-only ו -a/--data-only ×œ× ×™×›×•×œ×™× ×œ×©×ž×© ביחד\n"
+
+#: pg_dump.c:588
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together\n"
+msgstr "×פשרויות -c/--clean ו -a/--data-only ×œ× ×™×›×•×œ לשמש ביחד\n"
+
+#: pg_dump.c:594
+#, c-format
+msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+msgstr "×פשרויות --inserts/--column-inserts ו -o/--oids ×œ× ×™×›×•×œ לשמש יחד\n"
+
+#: pg_dump.c:595
+#, c-format
+msgid "(The INSERT command cannot set OIDs.)\n"
+msgstr "(לפקודת ההוספה ×ין ×פשרות להגדיר OID).\n"
+
+#: pg_dump.c:600
+#, c-format
+msgid "option --if-exists requires option -c/--clean\n"
+msgstr "×פשרות --if-exists מחייבת ×פשרות -c/--clean\n"
+
+#: pg_dump.c:622
+#, c-format
+msgid "WARNING: requested compression not available in this installation -- archive will be uncompressed\n"
+msgstr "×זהרה: דחיסה הנדרשת ××™× ×” זמינה בהתקנה זו - ×רכיון ×œ× ×™×™×“×—×¡\n"
+
+#: pg_dump.c:637
+#, c-format
+msgid "invalid number of parallel jobs\n"
+msgstr "מספר ×œ× ×—×•×§×™ של משימות במקבילות\n"
+
+#: pg_dump.c:641
+#, c-format
+msgid "parallel backup only supported by the directory format\n"
+msgstr "גיבוי במקביל נתמך רק תבנית התיקייה\n"
+
+#: pg_dump.c:696
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots.\n"
+msgstr ""
+"תמונות מצב מסונכרנות ×ינן נתמכות בגירסת שרת זו.\n"
+"תריץ ×¢× --no-synchronized-snapshots במקו×,\n"
+"×× ×תה ×œ× ×¦×¨×™×š לסנכרן תמונות.\n"
+
+#: pg_dump.c:703
+#, c-format
+msgid "Exported snapshots are not supported by this server version.\n"
+msgstr "תמונות מצב המיוצ×ות ×ינן נתמכות בגירסת שרת זו.\n"
+
+#: pg_dump.c:717
+#, c-format
+msgid "last built-in OID is %u\n"
+msgstr "מזהה OID מובנה ×”×חרון ×”×•× %u\n"
+
+#: pg_dump.c:726
+#, c-format
+msgid "no matching schemas were found\n"
+msgstr "×œ× × ×ž×¦×ו סכימות תו×מות\n"
+
+#: pg_dump.c:740
+#, c-format
+msgid "no matching tables were found\n"
+msgstr "×œ× × ×ž×¦×ו טבל×ות תו×מות\n"
+
+#: pg_dump.c:914
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"תכנית %s מרוקן מ×גר כקובץ טקסט ×ו ×œ×¤×•×¨×ž×˜×™× ×חרי×.\n"
+"\n"
+
+#: pg_dump.c:915 pg_dumpall.c:575 pg_restore.c:449
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: pg_dump.c:916
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:918 pg_dumpall.c:578 pg_restore.c:452
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"×פשרויות כלליות:\n"
+
+#: pg_dump.c:919
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr ""
+" -f\n"
+" --file=FILENAME\n"
+"×©× ×§×•×‘×¥ פלט ×ו ספרייה\n"
+
+#: pg_dump.c:920
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F\n"
+" --format=c|d|t|p\n"
+"תבנית של קובץ הפלט (מות×מת ×ישית, ספריה, tar, טקסט רגיל (ברירת מחדל))\n"
+
+#: pg_dump.c:922
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr ""
+" -j\n"
+" --jobs=NUM\n"
+"תשתמש במשימות מקבילות רבות על מנת לבצע dump\n"
+
+#: pg_dump.c:923 pg_dumpall.c:580
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr ""
+" -v\n"
+" --verbose\n"
+"מבצ מילולי מפורט\n"
+
+#: pg_dump.c:924 pg_dumpall.c:581
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: pg_dump.c:925
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr ""
+" -Z\n"
+" --compress=0-9\n"
+"רמת דחיסה עבור ×¤×•×¨×ž×˜×™× ×“×—×•×¡×™×\n"
+
+#: pg_dump.c:926 pg_dumpall.c:582
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=TIMEOUT\n"
+"להיכשל ל×חר המתנה ל TIMEOUT לנעילה של הטבלה\n"
+
+#: pg_dump.c:927 pg_dumpall.c:604
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync\n"
+"×œ× ×œ×—×›×•×ª עד ×שר ×”×©×™× ×•×™×™× ×™×™×›×ª×‘×• בבטחה לדיסק\n"
+
+#: pg_dump.c:928 pg_dumpall.c:583
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: pg_dump.c:930 pg_dumpall.c:584
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"×פשרויות שליטה בפלט:\n"
+
+#: pg_dump.c:931 pg_dumpall.c:585
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr ""
+" -a\n"
+" --data-only\n"
+"לבצע dump עבור ×”× ×ª×•× ×™× ×‘×œ×‘×“, ×œ× ×”×¡×›×™×ž×”\n"
+
+#: pg_dump.c:932
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr ""
+" -b\n"
+" --blobs\n"
+"לכלול ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™× ×‘dump\n"
+
+#: pg_dump.c:933
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr ""
+" -B\n"
+" --no-blobs\n"
+"×œ× ×œ×›×œ×•×œ ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™× ×‘dump\n"
+
+#: pg_dump.c:934 pg_restore.c:463
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr ""
+" -c\n"
+" --clean\n"
+"לנקות (למחוק) ××•×‘×™×™×§×˜×™× ×©×œ מסד × ×ª×•× ×™× ×œ×¤× ×™ יצירה מחדש\n"
+
+#: pg_dump.c:935
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C\n"
+" --create \n"
+"לכלול פקודות ליצירת מסד × ×ª×•× ×™× ×‘- dump\n"
+
+#: pg_dump.c:936
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr ""
+" -E\n"
+" --encoding=ENCODING\n"
+"לבצע dump עבור ×”× ×ª×•× ×™× ×‘×§×™×“×•×“ ENCODING\n"
+
+#: pg_dump.c:937
+#, c-format
+msgid " -n, --schema=SCHEMA dump the named schema(s) only\n"
+msgstr ""
+" -n\n"
+" --schema=SCHEMA\n"
+"לבצע dump עבור סכימה (ות) שצוינו בלבד\n"
+
+#: pg_dump.c:938
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do NOT dump the named schema(s)\n"
+msgstr ""
+" -N\n"
+" --exclude-schema=SCHEMA\n"
+"×œ× ×œ×›×œ×•×œ ב dump סכימה (ות) שצוינו בלבד\n"
+
+#: pg_dump.c:939 pg_dumpall.c:588
+#, c-format
+msgid " -o, --oids include OIDs in dump\n"
+msgstr ""
+" -o\n"
+" --oids\n"
+"לכלול Oid ב dump\n"
+
+#: pg_dump.c:940
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O\n"
+" --no-owner\n"
+"לדלג על השחזור בעלות ×ובייקט בפורמט טקסט רגיל\n"
+
+#: pg_dump.c:942 pg_dumpall.c:591
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr ""
+" -s\n"
+" --schema-only\n"
+"לבצע dump עבור סכימה בלבד, ×œ× × ×ª×•× ×™×\n"
+
+#: pg_dump.c:943
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr ""
+" -S\n"
+" --superuser=NAME\n"
+"×©× ×ž×©×ª×ž×© על להשתמש בתבנית טקסט רגיל\n"
+
+#: pg_dump.c:944
+#, c-format
+msgid " -t, --table=TABLE dump the named table(s) only\n"
+msgstr ""
+" -t\n"
+" --table=TABLE\n"
+"לבצע dump עבור טבלה(ות) לפי ×”×©× ×‘×œ×‘×“\n"
+
+#: pg_dump.c:945
+#, c-format
+msgid " -T, --exclude-table=TABLE do NOT dump the named table(s)\n"
+msgstr ""
+" -T\n"
+" --exclude-table=TABLE\n"
+"×œ× ×œ×‘×¦×¢ dump עבור טבלה(ות) לפי ×”×©× ×‘×œ×‘×“\n"
+
+#: pg_dump.c:946 pg_dumpall.c:594
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr ""
+" -x\n"
+" --no-privileges\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת הרש×ות (מענק/ביטול)\n"
+
+#: pg_dump.c:947 pg_dumpall.c:595
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr ""
+" --binary-upgrade\n"
+"לשימוש על-ידי כלי עזר של שדרוג בלבד\n"
+
+#: pg_dump.c:948 pg_dumpall.c:596
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts \n"
+"לבצע dump עבור ×”× ×ª×•× ×™× ×›×¤×§×•×“×•×ª INSERT ×¢× ×©×ž×•×ª עמודות\n"
+
+#: pg_dump.c:949 pg_dumpall.c:597
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting\n"
+"ביטול של ציטוט ע\"י דולר, שימוש במצטט סטנדרטי של SQL \n"
+
+#: pg_dump.c:950 pg_dumpall.c:598 pg_restore.c:480
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers\n"
+"לנטרל ×˜×¨×™×’×¨×™× ×‘×ž×”×œ×š שחזור של × ×ª×•× ×™× ×‘×œ×‘×“\n"
+
+#: pg_dump.c:951
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security\n"
+"ל×פשר ×בטחה שורה (לבצע dump עבור רק התוכן שלמשתמש יש גישה)\n"
+
+#: pg_dump.c:953
+#, c-format
+msgid " --exclude-table-data=TABLE do NOT dump data for the named table(s)\n"
+msgstr ""
+" --exclude-table-data=TABLE\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת טבלה (ות) שצוינה (ות)\n"
+
+#: pg_dump.c:954 pg_dumpall.c:599 pg_restore.c:482
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr ""
+" --if-exists\n"
+"שימוש ב IF EXISTS בעת הטלת ×”×ובייקטי×\n"
+
+#: pg_dump.c:955 pg_dumpall.c:600
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr ""
+" --inserts\n"
+"לבצע dump עבור ×”× ×ª×•× ×™× ×œ×¤×™ פקודות INSERT ×•×œ× COPY\n"
+
+#: pg_dump.c:956 pg_dumpall.c:601
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr ""
+" --no-publications\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת הפרסומי×\n"
+
+#: pg_dump.c:957 pg_dumpall.c:602
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr ""
+" --no-security-labels\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת הקצ×ות תווית ×בטחה\n"
+
+#: pg_dump.c:958 pg_dumpall.c:603
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr ""
+" --no-subscriptions\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת מנויי×\n"
+
+#: pg_dump.c:959
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr ""
+" --no-synchronized-snapshots\n"
+"×ל תשתמש בתמונות מצב מסונכרנות במשימות מקבילות\n"
+
+#: pg_dump.c:960 pg_dumpall.c:605
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr ""
+" --no-tablespaces\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת הקצ×ות מרחב טבל×ות\n"
+
+#: pg_dump.c:961 pg_dumpall.c:606
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr ""
+" --no-unlogged-table-data\n"
+"×œ× ×œ×›×œ×•×œ בdump ×ת נתוני הטבלה ×שר ×œ× × ×¨×©×ž×• ביומן\n"
+
+#: pg_dump.c:962 pg_dumpall.c:608
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers\n"
+"לצטט כל מזהי×, ×פילו ×× ×œ× ×ž×™×œ×•×ª מפתח\n"
+
+#: pg_dump.c:963
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION\n"
+"לבצע dump עבור מקטע שצוינה ×‘×©× (pre-data, data ×ו post-data)\n"
+
+#: pg_dump.c:964
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable\n"
+"לחכות עד dump יכול לרוץ בלי חריגות\n"
+
+#: pg_dump.c:965
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr ""
+" --snapshot=SNAPSHOT\n"
+"להשתמש בתמונת מצב נתונה עבור ה-dump\n"
+
+#: pg_dump.c:966 pg_restore.c:490
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names\n"
+"לדרוש טבלה ו/×ו סכימה לכלול ×“×¤×•×¡×™× ×¢×œ מנת להת××™× ×œ×¢×¨×š ×חד לפחות כל ×חד\n"
+
+#: pg_dump.c:968 pg_dumpall.c:609 pg_restore.c:492
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+"להשתמש בפקודות SET SESSION AUTHORIZATION במקו×\n"
+"הפקודות ALTER OWNER להגדרת הבעלות\n"
+
+#: pg_dump.c:972 pg_dumpall.c:613 pg_restore.c:496
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"×פשרויות חיבור:\n"
+
+#: pg_dump.c:973
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr ""
+" -d\n"
+" --dbname=DBNAME\n"
+"מסד × ×ª×•× ×™× ×œ×‘×¦×¢ עליו dump\n"
+
+#: pg_dump.c:974 pg_dumpall.c:615 pg_restore.c:497
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME שרת מ×רח של מסד ×”× ×ª×•× ×™× ×ו ספריית שקע\n"
+
+#: pg_dump.c:975 pg_dumpall.c:617 pg_restore.c:498
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr ""
+" -p\n"
+" --port=PORT\n"
+"פורט שרת מסד נתוני×\n"
+
+#: pg_dump.c:976 pg_dumpall.c:618 pg_restore.c:499
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr ""
+" -U\n"
+" --username=NAME\n"
+"להתחבר כמשתמש מסד ×”× ×ª×•× ×™× ×”×ž×¦×•×™×Ÿ\n"
+
+#: pg_dump.c:977 pg_dumpall.c:619 pg_restore.c:500
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ×œ×¢×•×œ× ×œ× ×œ×‘×§×© סיסמה\n"
+
+#: pg_dump.c:978 pg_dumpall.c:620 pg_restore.c:501
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password נדרשת בקשת סיסמה (צריך לקרות ב×ופן ×וטומטי)\n"
+
+#: pg_dump.c:979 pg_dumpall.c:621
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr ""
+" --role=ROLENAME\n"
+"לעשות SET ROLE לפני ה-dump\n"
+
+#: pg_dump.c:981
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"×× ×œ× ×¡×•×¤×§ ×©× ×©×œ מסד הנתוני×, ××– הערך משתנה הסביבה PGDATABASE.\n"
+"יהיה בשימוש\n"
+"\n"
+"\n"
+
+#: pg_dump.c:983 pg_dumpall.c:625 pg_restore.c:508
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: pg_dump.c:1000
+#, c-format
+msgid "invalid client encoding \"%s\" specified\n"
+msgstr "צוין קידוד לקוח ×œ× ×—×•×§×™ \"% s\"\n"
+
+#: pg_dump.c:1137
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported on standby servers.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots.\n"
+msgstr ""
+"תמונות מצב מסונכרנות ××™× × × ×ª×ž×›×•×ª ×‘×©×¨×ª×™× ×‘×”×ž×ª× ×”.\n"
+"תריץ ×¢× --no-synchronized-snapshots במקו×,\n"
+"×× ×תה ×œ× ×¦×¨×™×š לסנכרן תמונות מצב.\n"
+
+#: pg_dump.c:1206
+#, c-format
+msgid "invalid output format \"%s\" specified\n"
+msgstr "תבנית הפלט ×œ× ×—×•×§×™ \"%s\" צויינה\n"
+
+#: pg_dump.c:1244
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\"\n"
+msgstr "×œ× × ×ž×¦×ו סכימות תו×מות עבור תבנית '%s'\n"
+
+#: pg_dump.c:1298
+#, c-format
+msgid "no matching tables were found for pattern \"%s\"\n"
+msgstr "×œ× × ×ž×¦×ו טבל×ות תו×מות עבור תבנית '%s'\n"
+
+#: pg_dump.c:1702
+#, c-format
+msgid "dumping contents of table \"%s.%s\"\n"
+msgstr "העברת התוכן של הטבלה \"%s.%s\"\n"
+
+#: pg_dump.c:1823
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.\n"
+msgstr "העברת התוכן של הטבלה \"%s\" נכשלה: PQgetCopyData() נכשל.\n"
+
+#: pg_dump.c:1824 pg_dump.c:1834
+#, c-format
+msgid "Error message from server: %s"
+msgstr "הודעת שגי××” משרת: %s"
+
+#: pg_dump.c:1825 pg_dump.c:1835
+#, c-format
+msgid "The command was: %s\n"
+msgstr "הפקודה היתה: %s\n"
+
+#: pg_dump.c:1833
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed.\n"
+msgstr "העברת התוכן של הטבלה \"%s\" נכשלה: PQgetResult() נכשל.\n"
+
+#: pg_dump.c:2482
+#, c-format
+msgid "saving database definition\n"
+msgstr "שמירת הגדרת מסד הנתוני×\n"
+
+#: pg_dump.c:2788
+#, c-format
+msgid "saving encoding = %s\n"
+msgstr "שמירת קידוד = %s\n"
+
+#: pg_dump.c:2815
+#, c-format
+msgid "saving standard_conforming_strings = %s\n"
+msgstr "שמירת standard_conforming_strings = %s\n"
+
+#: pg_dump.c:2855
+#, c-format
+msgid "reading large objects\n"
+msgstr "קרי××” ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×\n"
+
+#: pg_dump.c:3050
+#, c-format
+msgid "saving large objects\n"
+msgstr "שמירת ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×\n"
+
+#: pg_dump.c:3095
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "שגי××” בעת קרי×ת ×ובייקט גדול % u: %s"
+
+#: pg_dump.c:3148
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\"\n"
+msgstr "×בטחת שורה בקרי××” זמינה עבור טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:3180
+#, c-format
+msgid "reading policies for table \"%s.%s\"\n"
+msgstr "קרי××” מדיניות עבור טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:3330
+#, c-format
+msgid "unexpected policy command type: %c\n"
+msgstr "סוג מדיניות הפקודה בלתי צפוי: %c\n"
+
+#: pg_dump.c:3446
+#, c-format
+msgid "WARNING: owner of publication \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ ×¤×¨×¡×•× \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:3576
+#, c-format
+msgid "reading publication membership for table \"%s.%s\"\n"
+msgstr "קרי××” חברות ×”×¤×¨×¡×•× ×¢×‘×•×¨ טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:3723
+#, c-format
+msgid "WARNING: subscriptions not dumped because current user is not a superuser\n"
+msgstr "×זהרה: ×ž× ×•×™×™× ×œ× × ×–×¨×§×• ×›×™ משתמש נוכחי ×ינו משתמש על\n"
+
+#: pg_dump.c:3774
+#, c-format
+msgid "WARNING: owner of subscription \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ ×¤×¨×¡×•× \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:3818
+#, c-format
+msgid "WARNING: could not parse subpublications array\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות לנתח מערך subpublications\n"
+
+#: pg_dump.c:4048
+#, c-format
+msgid "could not find parent extension for %s\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×¡×™×•×ž×ª ×”×ב עבור %s\n"
+
+#: pg_dump.c:4197
+#, c-format
+msgid "WARNING: owner of schema \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ הסכימה \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:4220
+#, c-format
+msgid "schema with OID %u does not exist\n"
+msgstr "הסכימה ×¢× OID %u ×œ× ×§×™×™×ž×ª\n"
+
+#: pg_dump.c:4551
+#, c-format
+msgid "WARNING: owner of data type \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ סוג ×”× ×ª×•× ×™× '%s' נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:4639
+#, c-format
+msgid "WARNING: owner of operator \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ ×ופרטור \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:4953
+#, c-format
+msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ מחלקת ×”×ופרטור \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:5040
+#, c-format
+msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ המשפחה ×ופרטור \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:5207
+#, c-format
+msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ פונקציית צבירה \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:5466
+#, c-format
+msgid "WARNING: owner of function \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ הפונקציה \"%s\" נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:6248
+#, c-format
+msgid "WARNING: owner of table \"%s\" appears to be invalid\n"
+msgstr "×זהרה: ×”×‘×¢×œ×™× ×©×œ טבלה '%s' נר××” ×›×œ× ×—×•×§×™\n"
+
+#: pg_dump.c:6290 pg_dump.c:16504
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found\n"
+msgstr "בדיקת שפיות נכשלה, טבלת ×”×ב בעלת OID %u של רצף ×¢× OID %u ×œ× × ×ž×¦××”\n"
+
+#: pg_dump.c:6421
+#, c-format
+msgid "reading indexes for table \"%s.%s\"\n"
+msgstr "קרי××” ××™× ×“×§×¡×™× ×¢×‘×•×¨ טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:6702
+#, c-format
+msgid "reading extended statistics for table \"%s.%s\"\n"
+msgstr "קרי××” סטטיסטיקה מורחבת עבור טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:6785
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\"\n"
+msgstr "קרי××” ×ילוצי מפתח זר עבור טבלה '%s.%s\"\n"
+
+#: pg_dump.c:7009
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found\n"
+msgstr "בדיקת שפיות נכשלה, טבלת ×”×ב בעלת OID %u ×¢× ×¢×¨×š pg_rewrite בעל OID %u ×œ× × ×ž×¦××”\n"
+
+#: pg_dump.c:7093
+#, c-format
+msgid "reading triggers for table \"%s.%s\"\n"
+msgstr "קרי××” ×˜×¨×™×’×¨×™× ×¢×‘×•×¨ טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:7231
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)\n"
+msgstr "הש×ילתה יצרה ×©× ×”×˜×‘×œ×” ×שר מוצבע ×¢× ×ž×¦×‘×™×¢ ריק עבור טריגר מפתח זר \"%s\" על הטבלה \"%s\" (OID של הטבלה: %u)\n"
+
+#: pg_dump.c:7803
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\"\n"
+msgstr "מצי×ת העמודות ×•×”×¡×•×’×™× ×©×œ הטבלה \"%s.%s\"\n"
+
+#: pg_dump.c:7968
+#, c-format
+msgid "invalid column numbering in table \"%s\"\n"
+msgstr "מספור העמודות ×œ× ×—×•×§×™ בטבלה '%s'\n"
+
+#: pg_dump.c:8004
+#, c-format
+msgid "finding default expressions of table \"%s.%s\"\n"
+msgstr "מצי×ת ביטוי ברירת המחדל של הטבלה \"%s.%s\"\n"
+
+#: pg_dump.c:8027
+#, c-format
+msgid "invalid adnum value %d for table \"%s\"\n"
+msgstr "ערך adnum ×œ× ×—×•×§×™ %d עבור טבלה '%s'\n"
+
+#: pg_dump.c:8093
+#, c-format
+msgid "finding check constraints for table \"%s.%s\"\n"
+msgstr "מצי×ת ××™×œ×•×¦×™× ×¢×‘×•×¨ טבלה \"%s.%s\"\n"
+
+#: pg_dump.c:8142
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d\n"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d\n"
+msgstr[0] "צפי ל%d בדיקת ××™×œ×•×¦×™× ×¢×‘×•×¨ הטבלה \"%s\" ×ך נמצ×ו %d\n"
+msgstr[1] "צפי ל%d בדיקות ××™×œ×•×¦×™× ×¢×‘×•×¨ הטבלה \"%s\" ×ך נמצ×ו %d\n"
+
+#: pg_dump.c:8146
+#, c-format
+msgid "(The system catalogs might be corrupted.)\n"
+msgstr "(×”×§×˜×œ×•×’×™× ×©×œ המערכת עלול להיות פגו×.)\n"
+
+#: pg_dump.c:9704
+#, c-format
+msgid "WARNING: typtype of data type \"%s\" appears to be invalid\n"
+msgstr "×זהרה: typtype של סוג ×”× ×ª×•× ×™× '%s' מופיע ×›×™ ×ינו חוקי\n"
+
+#: pg_dump.c:11133
+#, c-format
+msgid "WARNING: bogus value in proargmodes array\n"
+msgstr "×זהרה: ערך מזויף במערך proargmodes\n"
+
+#: pg_dump.c:11459
+#, c-format
+msgid "WARNING: could not parse proallargtypes array\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות לנתח מערך proallargtypes\n"
+
+#: pg_dump.c:11475
+#, c-format
+msgid "WARNING: could not parse proargmodes array\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות לנתח מערך proargmodes\n"
+
+#: pg_dump.c:11489
+#, c-format
+msgid "WARNING: could not parse proargnames array\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות לנתח מערך proargnames\n"
+
+#: pg_dump.c:11500
+#, c-format
+msgid "WARNING: could not parse proconfig array\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות לנתח מערך proconfig\n"
+
+#: pg_dump.c:11571
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\"\n"
+msgstr "ערך provolatile ×œ× ×ž×–×•×”×” עבור פונקציה \"%s\"\n"
+
+#: pg_dump.c:11615 pg_dump.c:13598
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\"\n"
+msgstr "ערך proparallel ×œ× ×ž×–×•×”×” עבור פונקציה \"%s\"\n"
+
+#: pg_dump.c:11723 pg_dump.c:11833 pg_dump.c:11840
+#, c-format
+msgid "could not find function definition for function with OID %u\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×ž×¦×•× ×ת הגדרת הפונקציה עבור הפונקציה ×¢× OID %u\n"
+
+#: pg_dump.c:11768
+#, c-format
+msgid "WARNING: bogus value in pg_cast.castfunc or pg_cast.castmethod field\n"
+msgstr "×זהרה: הערך מזויף בשדה pg_cast.castfunc ×ו pg_cast.castmethod\n"
+
+#: pg_dump.c:11771
+#, c-format
+msgid "WARNING: bogus value in pg_cast.castmethod field\n"
+msgstr "×זהרה: הערך מזויף בשדה pg_cast.castmethod\n"
+
+#: pg_dump.c:11861
+#, c-format
+msgid "WARNING: bogus transform definition, at least one of trffromsql and trftosql should be nonzero\n"
+msgstr "×זהרה: הגדרת צורה מזויפת, לפחות ×חת מ trffromsql ו- trftosql צריך להיות שונה מ×פס\n"
+
+#: pg_dump.c:11878
+#, c-format
+msgid "WARNING: bogus value in pg_transform.trffromsql field\n"
+msgstr "×זהרה: הערך מזויף בשדה pg_transform.trffromsql\n"
+
+#: pg_dump.c:11899
+#, c-format
+msgid "WARNING: bogus value in pg_transform.trftosql field\n"
+msgstr "×זהרה: הערך מזויף בשדה pg_transform.trftosql\n"
+
+#: pg_dump.c:12295
+#, c-format
+msgid "WARNING: invalid type \"%c\" of access method \"%s\"\n"
+msgstr "×זהרה: סוג ×œ× ×—×•×§×™ '%c' של שיטת גישה \"%s\"\n"
+
+#: pg_dump.c:13061
+#, c-format
+msgid "unrecognized collation provider: %s\n"
+msgstr "ספק ×יסוף מוכר: %s\n"
+
+#: pg_dump.c:13508
+#, c-format
+msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n"
+msgstr "×זהרה: פונקציית צבירה %s ×œ× × ×™×ª×Ÿ ×”×™×” לעשות dump כר×וי עבור גירסה זו של מסד הנתוני×; התעלמות\n"
+
+#: pg_dump.c:14364
+#, c-format
+msgid "unrecognized object type in default privileges: %d\n"
+msgstr "סוג ×ובייקט ×œ× ×ž×–×•×”×” בהרש×ות ברירת מחדל: %d\n"
+
+#: pg_dump.c:14382
+#, c-format
+msgid "could not parse default ACL list (%s)\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לנתח ×ת רשימת ×”-ACL ברירת המחדל (%s)\n"
+
+#: pg_dump.c:14453
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לנתח ×ת רשימת ×”-ACL ר×שונית (%s) ×ו רשימת REVOKE ACL (%s) ר×שונית עבור ×ובייקט \"%s\" (%s)\n"
+
+#: pg_dump.c:14461
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לנתח ×ת רשימת ×”-ACL ברירת המחדל (%s) ×ו רשימת REVOKE ACL (%s) עבור ×ובייקט \"%s\" (%s)\n"
+
+#: pg_dump.c:14936
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data\n"
+msgstr "ש×ילתה כדי לקבל הגדרה של תצוגת \"%s\" ×œ× ×”×—×–×™×¨×” נתוני×\n"
+
+#: pg_dump.c:14939
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition\n"
+msgstr "ש×ילתה כדי לקבל הגדרה של תצוגה \"%s\" החזירה יותר מ×שר הגדרת ×חת\n"
+
+#: pg_dump.c:14946
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)\n"
+msgstr "ההגדרה של תצוגה \"%s\" נר××” ריק (×ורך ×פס)\n"
+
+#: pg_dump.c:15175
+#, c-format
+msgid "invalid number of parents %d for table \"%s\"\n"
+msgstr "מספר ×œ× × ×›×•×Ÿ של ×”×•×¨×™× %d עבור טבלה '%s'\n"
+
+#: pg_dump.c:15822
+#, c-format
+msgid "invalid column number %d for table \"%s\"\n"
+msgstr "מספר העמודה ×œ× ×—×•×§×™ %d עבור טבלה '%s'\n"
+
+#: pg_dump.c:16006
+#, c-format
+msgid "missing index for constraint \"%s\"\n"
+msgstr "×ינדקס חסר עבור ×”×ילוץ \"%s\"\n"
+
+#: pg_dump.c:16209
+#, c-format
+msgid "unrecognized constraint type: %c\n"
+msgstr "סוג ×ילוץ ×œ× ×ž×–×•×”×”: %c\n"
+
+#: pg_dump.c:16346 pg_dump.c:16572
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)\n"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)\n"
+msgstr[0] "ש××™×œ×ª× ×›×“×™ לקבל × ×ª×•× ×™× ×©×œ רצף \"%s\"החזירה שורה %d (הצפוי 1)\n"
+msgstr[1] "ש××™×œ×ª× ×›×“×™ לקבל × ×ª×•× ×™× ×©×œ רצף \"%s\"החזירה שורות %d (הצפוי 1)\n"
+
+#: pg_dump.c:16670
+#, c-format
+msgid "unexpected tgtype value: %d\n"
+msgstr "ערך tgtype בלתי צפוי: %d\n"
+
+#: pg_dump.c:16744
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"\n"
+msgstr "×רגומנט מסוג מחרוזת ×œ× ×—×•×§×™ (%s) עבור טריגר \"%s\" בטבלה \"%s\"\n"
+
+#: pg_dump.c:16965
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned\n"
+msgstr "ש×ילתה כדי לקבל כלל \"%s\" עבור טבלה '%s' נכשלה: חזר מספר שגוי של השורות\n"
+
+#: pg_dump.c:17360
+#, c-format
+msgid "reading dependency data\n"
+msgstr "קרי×ת נתוני תלות\n"
+
+#: pg_dump.c:17825
+#, c-format
+msgid "WARNING: could not parse reloptions array\n"
+msgstr "×זהרה: ×œ× ×”×™×ª×” ×פשרות לנתח מערך reloptions\n"
+
+#. translator: this is a module name
+#: pg_dump_sort.c:25
+msgid "sorter"
+msgstr "ממין"
+
+#: pg_dump_sort.c:413
+#, c-format
+msgid "invalid dumpId %d\n"
+msgstr "ערך dumpId ×œ× ×—×•×§×™ %d\n"
+
+#: pg_dump_sort.c:419
+#, c-format
+msgid "invalid dependency %d\n"
+msgstr "תלות ×œ× ×—×•×§×™ %d\n"
+
+#: pg_dump_sort.c:652
+#, c-format
+msgid "could not identify dependency loop\n"
+msgstr "×œ× ×™×•×›×œ לזהות ×ת לול×ת התלות \n"
+
+#: pg_dump_sort.c:1175
+#, c-format
+msgid "NOTICE: there are circular foreign-key constraints on this table:\n"
+msgid_plural "NOTICE: there are circular foreign-key constraints among these tables:\n"
+msgstr[0] "×©×™× ×œ×‘: יש ×ילוצי מפתח זר ×ž×¢×’×œ×™×™× ×¢×œ הטבלה ×–×”:\n"
+msgstr[1] "×©×™× ×œ×‘: יש ×ילוצי מפתח זר ×ž×¢×’×œ×™×™× ×¢×œ הטבל×ות ×לו:\n"
+
+#: pg_dump_sort.c:1179 pg_dump_sort.c:1199
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: pg_dump_sort.c:1180
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.\n"
+msgstr "×תה ×œ× ×™×•×›×œ לשחזר ×ת dump ×œ×œ× ×©×™×ž×•×© ב --disable-triggers ×ו שחרור ××™×œ×•×¦×™× ×–×ž× ×™.\n"
+
+#: pg_dump_sort.c:1181
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem.\n"
+msgstr "שקול שימוש ב dump ×ž×œ× ×‘×ž×§×•× --data-only בכדי להימנע מבעיה זו.\n"
+
+#: pg_dump_sort.c:1193
+#, c-format
+msgid "WARNING: could not resolve dependency loop among these items:\n"
+msgstr "×זהרה: ×œ× ×™×›×•×œ×” לפתור ×ת תלות בלול××” בין ×¤×¨×™×˜×™× ×לה:\n"
+
+#: pg_dumpall.c:189
+#, c-format
+msgid ""
+"The program \"pg_dump\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"התוכנית \"pg_dump\" נדרשת על-ידי %s ×בל ×œ× × ×ž×¦××”\n"
+"ב×ותה ספריה כמו \"%s\".\n"
+"בדוק ×ת ההתקנה.\n"
+
+#: pg_dumpall.c:196
+#, c-format
+msgid ""
+"The program \"pg_dump\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"התוכנית \"pg_dump\" נמצ××” על ידי \"%s\"\n"
+"×בל היתה ×œ× ×ž×’×™×¨×¡×” ×–×”×” כמו %s.\n"
+"×•×“× ×”×”×ª×§× ×” שלך.\n"
+
+#: pg_dumpall.c:331
+#, c-format
+msgid "%s: options -g/--globals-only and -r/--roles-only cannot be used together\n"
+msgstr "תכנית %s: ×פשרויות -g/--globals-only ו -r/--roles-only ×œ× × ×™×ª×Ÿ לשמש ביחד\n"
+
+#: pg_dumpall.c:340
+#, c-format
+msgid "%s: options -g/--globals-only and -t/--tablespaces-only cannot be used together\n"
+msgstr "תכנית %s: ×פשרויות -g/--globals-only ו -t/--tablespaces-only ×œ× × ×™×ª×Ÿ לשמש ביחד\n"
+
+#: pg_dumpall.c:349 pg_restore.c:367
+#, c-format
+msgid "%s: option --if-exists requires option -c/--clean\n"
+msgstr "תכנתי %s: ×פשרות --if-exists מחייבת ×פשרות -c/--clean\n"
+
+#: pg_dumpall.c:356
+#, c-format
+msgid "%s: options -r/--roles-only and -t/--tablespaces-only cannot be used together\n"
+msgstr "תכנית %s: ×פשרויות -r/--roles-only ו -t/--tablespaces-only ×œ× × ×™×ª×Ÿ לשמש ביחד\n"
+
+#: pg_dumpall.c:412 pg_dumpall.c:1983
+#, c-format
+msgid "%s: could not connect to database \"%s\"\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להתחבר ×ל מסד נתוני×: \"%s\"\n"
+
+#: pg_dumpall.c:427
+#, c-format
+msgid ""
+"%s: could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database.\n"
+msgstr ""
+"תכנתי %s: ×œ× ×”×™×ª×” ×פשרות להתחבר למסדי × ×ª×•× ×™× \"postgres\" ×ו \"template1\"\n"
+"× × ×¦×™×™×Ÿ מסד × ×ª×•× ×™× ×—×œ×•×¤×™.\n"
+
+#: pg_dumpall.c:444
+#, c-format
+msgid "%s: could not open the output file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ הפלט \"%s\": %s\n"
+
+#: pg_dumpall.c:574
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"תכנתי %s מחלץ ×שכול מסד × ×ª×•× ×™× PostgreSQL לקובץ סקריפט של SQL\n"
+"\n"
+
+#: pg_dumpall.c:576
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:579
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr ""
+"-f\n"
+" --file=FILENAM\n"
+"×©× ×§×•×‘×¥ פלט\n"
+
+#: pg_dumpall.c:586
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+"-c\n"
+" --clean\n"
+"לנקות (למחוק) מסדי ×”× ×ª×•× ×™× ×œ×¤× ×™ יצירה מחדש\n"
+
+#: pg_dumpall.c:587
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g\n"
+" --globals-only\n"
+"לבצע dump עבור ××•×‘×™×™×§×˜×™× ×’×œ×•×‘×œ×™×™×, ×œ× ×¢×‘×•×¨ מסדי נתוני×\n"
+
+#: pg_dumpall.c:589 pg_restore.c:472
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr ""
+"-O\n"
+" --no-owner\n"
+"לדלג על השחזור בעלות על ×”×ובייקט\n"
+
+#: pg_dumpall.c:590
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r\n"
+" --roles-only\n"
+"לבצע dump עבור ×ª×¤×§×™×“×™× ×‘×œ×‘×“, ×œ× ×¢×‘×•×¨ מסדי ×”× ×ª×•× ×™× ×ו מרחבי טבל×ות\n"
+
+#: pg_dumpall.c:592
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S\n"
+" --superuser=NAME\n"
+"×©× ×ž×©×ª×ž×© על להשתמש ב dump\n"
+
+#: pg_dumpall.c:593
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t\n"
+" --tablespaces-only\n"
+"לבצי dump עבור מרחבי טבל×ות, ×œ× ×¢×•×‘×¨ מסדי × ×ª×•× ×™× ×ו תפקידי×\n"
+
+#: pg_dumpall.c:607
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr ""
+" --no-role-passwords\n"
+"×œ× ×œ×‘×¦×¢ dump עבור הסיסמ×ות של תפקידי×\n"
+
+#: pg_dumpall.c:614
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr ""
+" -d\n"
+" --dbname=CONNSTR\n"
+"להתחבר ב×מצעות מחרוזת החיבור\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr ""
+" -l\n"
+" --database=DBNAME\n"
+"מסד × ×ª×•× ×™× ×‘×¨×™×¨×ª המחדל החלופי\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"×× ×œ× × ×¢×©×” שימוש ב -f/--file, ××– סקריפט של SQL ייכתב\n"
+"לפלט סטנדרטי.\n"
+"\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "%s: role name starting with \"pg_\" skipped (%s)\n"
+msgstr "תכנית %s: דילוג על ×©× ×ª×¤×§×™×“ ×שר מתחיל ×¢× \"pg_\" (%s)\n"
+
+#: pg_dumpall.c:1208
+#, c-format
+msgid "%s: could not parse ACL list (%s) for tablespace \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח ×ת רשימת ACL (%s) עבור מרחב הטבל×ות \"%s\"\n"
+
+#: pg_dumpall.c:1525
+#, c-format
+msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח ×ת רשימת ACL (%s) עבור מסד ×”× ×ª×•× ×™× \"%s\"\n"
+
+#: pg_dumpall.c:1739
+#, c-format
+msgid "%s: dumping database \"%s\"...\n"
+msgstr "תכנית %s: ביצוע dump של מסד ×”× ×ª×•× ×™× '%s'...\n"
+
+#: pg_dumpall.c:1763
+#, c-format
+msgid "%s: pg_dump failed on database \"%s\", exiting\n"
+msgstr "תכנית %s: נכשל pg_dump על מסד ×”× ×ª×•× ×™× '%s', יוצ×\n"
+
+#: pg_dumpall.c:1772
+#, c-format
+msgid "%s: could not re-open the output file \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לפתוח ×ת קובץ הפלט \"%s\": %s\n"
+
+#: pg_dumpall.c:1817
+#, c-format
+msgid "%s: running \"%s\"\n"
+msgstr "תכנית %s: הפעלת \"%s\"\n"
+
+#: pg_dumpall.c:2006
+#, c-format
+msgid "%s: could not connect to database \"%s\": %s\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ להתחבר ×ל מסד נתוני×\"%s\": %s\n"
+
+#: pg_dumpall.c:2036
+#, c-format
+msgid "%s: could not get server version\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לקבל גירסת שרת\n"
+
+#: pg_dumpall.c:2042
+#, c-format
+msgid "%s: could not parse server version \"%s\"\n"
+msgstr "תכנית %s: ×œ× ×”×™×ª×” ×פשרות לנתח גירסת שרת \"%s\"\n"
+
+#: pg_dumpall.c:2118 pg_dumpall.c:2144
+#, c-format
+msgid "%s: executing %s\n"
+msgstr "תכנית %s: ביצוע %s\n"
+
+#: pg_dumpall.c:2124 pg_dumpall.c:2150
+#, c-format
+msgid "%s: query failed: %s"
+msgstr "תכנית %s: ש×ילתה נכשלה: %s"
+
+#: pg_dumpall.c:2126 pg_dumpall.c:2152
+#, c-format
+msgid "%s: query was: %s\n"
+msgstr "תכנית %s: ש×ילתה היתה: %s\n"
+
+#: pg_restore.c:309
+#, c-format
+msgid "%s: options -d/--dbname and -f/--file cannot be used together\n"
+msgstr "תכנית %s: ×פשרויות -d/--dbname ו -f/--file ×œ× × ×™×ª×Ÿ לשמש ביחד\n"
+
+#: pg_restore.c:320
+#, c-format
+msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+msgstr "תכנית %s: ×פשרויות -s/--schema-only ו -a/--data-only ×œ× × ×™×ª×Ÿ לשמש ביחד\n"
+
+#: pg_restore.c:327
+#, c-format
+msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+msgstr "תכנית %s: ×פשרויות -c/--clean ו -a/--data-only ×œ× × ×™×ª×Ÿ לשמש ביחד\n"
+
+#: pg_restore.c:334
+#, c-format
+msgid "%s: invalid number of parallel jobs\n"
+msgstr "תכנית %s: מספר ×œ× ×—×•×§×™ של משימות מקבילות\n"
+
+#: pg_restore.c:342
+#, c-format
+msgid "%s: maximum number of parallel jobs is %d\n"
+msgstr "תכנית %s: מספר מרבי של משרות מקבילות ×”×•× %d\n"
+
+#: pg_restore.c:351
+#, c-format
+msgid "%s: cannot specify both --single-transaction and multiple jobs\n"
+msgstr "תכנית %s: ×œ× × ×™×ª×Ÿ לציין ×’× --single-transaction ×•×’× ×ž×©×™×ž×•×ª מרובות\n"
+
+#: pg_restore.c:394
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"\n"
+msgstr "תבנית ×רכיון ×œ× ×ž×–×•×”×” \"%s\"; × × ×¦×™×™×Ÿ \"c\", \"d\" ×ו \"t\"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid "WARNING: errors ignored on restore: %d\n"
+msgstr "×זהרה: התעלמות משגי×ות בשחזור: %d\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"תכנית %s משחזרת ×ת מסד ×”× ×ª×•× ×™× PostgreSQL מה×רכיון שנוצרו על-ידי pg_dump.\n"
+"\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FILE]\n"
+
+#: pg_restore.c:453
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr ""
+" -d\n"
+" --dbname=NAME\n"
+"×©× ×œ×”×ª×—×‘×¨ ×©× ×ž×¡×“ הנתוני×\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr ""
+" -f\n"
+" --file=FILENAM\n"
+"×©× ×§×•×‘×¥ פלט\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F\n"
+" --format=c|d|t\n"
+"תבנית קובץ גיבוי (צריך להיות ×וטומטי)\n"
+
+#: pg_restore.c:456
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr ""
+" -l\n"
+" --list\n"
+"הדפס ×¡×™×›×•× TOC של ×”×רכיון\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr ""
+" -v\n"
+" --verbose\n"
+"מבצ מילולי מפורט\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"×פשרויות שליטה בשחזור:\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr ""
+" -a\n"
+" --data-only\n"
+"שחזור × ×ª×•× ×™× ×‘×œ×‘×“, ×œ× ×”×¡×›×™×ž×”\n"
+
+#: pg_restore.c:464
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr ""
+" -C\n"
+" --create \n"
+"ליצור ×ת מסד ×”× ×ª×•× ×™× ×”×™×¢×“\n"
+"\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e\n"
+" --exit-on-error\n"
+"יצי××” cשגי××”, ברירת המחדל ×”×™× ×œ×”×ž×©×™×š\n"
+
+#: pg_restore.c:466
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr ""
+" -I\n"
+" --index=NAME\n"
+"שחזור ×ינדקס ×שר צוין ב NAME\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+"-j\n"
+" --jobs=NUM\n"
+"תשתמש במשימות מקבילות רבות לשיחזור\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L\n"
+" --use-list=FILENAME\n"
+"להשתמש בתוכן ×¢× ×™×™× ×™× ×ž×§×•×‘×¦×™× ×–×” על מנת לבחור/לבדר ×ת הפלט\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr ""
+" -n\n"
+" --schema=NAME\n"
+"לשחזר רק ××•×‘×™×™×§×˜×™× ×ž×¡×›×™×ž×” זו\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr ""
+" -N\n"
+" --exclude-schema=NAME\n"
+"×œ× ×œ×©×—×–×¨ ×ת ×”××•×‘×™×™×§×˜×™× ×ž×¡×›×™×ž×” זו\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr ""
+" -P\n"
+" --function=NAME(args)\n"
+"שחזורפונקציה שצוינה\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr ""
+" -s\n"
+" --schema-only\n"
+"שחזור של הסכימה בלבד, ×œ× × ×ª×•× ×™×\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr ""
+" -S\n"
+" --superuser=NAME\n"
+"×©× ×ž×©×ª×ž×© על עבור נטרול טריגרי×\n"
+
+#: pg_restore.c:476
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr ""
+" -t\n"
+" --table=NAME\n"
+"שחזור ×©× ×”×§×©×¨ (טבלה, תצוגה, וכו '.)\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr ""
+" -T\n"
+" --trigger=NAME\n"
+"שחזור טריגר שצוין\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr ""
+" -x\n"
+" --no-privileges\n"
+"דלג על שחזור הרש×ות גישה (מענק / שלילה)\n"
+
+#: pg_restore.c:479
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr ""
+" -1, --single-transaction\n"
+"שחזור כטרנזקציה יחידה\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr ""
+" --enable-row-security\n"
+"ל×פשר ×בטחה שורה\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables\n"
+"×œ× ×œ×©×—×–×¨ × ×ª×•× ×™× ×©×œ טבל×ות ×©×œ× ×”×™×ª×” ×שפרות ×œ×™×¦×•× ×ותן\n"
+
+#: pg_restore.c:485
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr ""
+"--no-publications\n"
+"×œ× ×œ×©×—×–×¨ ×ת הפרסומי×\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr ""
+" --no-security-labels\n"
+"×œ× ×œ×©×—×–×¨ ×ת תווית ×בטחה\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr ""
+"--no-subscriptions\n"
+"×œ× ×œ×©×—×–×¨ ×ת מנויי×\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr ""
+"--no-tablespaces\n"
+"×œ× ×œ×©×—×–×¨ ×ת הקצ×ות מרחב טבל×ות\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+"--section=SECTION\n"
+"לבצע שחזור עבור מקטע שצוין ×‘×©× (pre-data, data ×ו post-data)\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr ""
+" --role=ROLENAME \n"
+"להגדיר תפקיד לפני השחזור\n"
+
+#: pg_restore.c:504
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"×פשר לציין ולשלב בין ×”×פשרויות -I, -n, -P, -t, -T ו --section \n"
+"כמה ×¤×¢×ž×™× ×¢×œ מנת לבחור ××•×‘×™×™×§×˜×™× ×ž×¨×•×‘×™×.\n"
+
+#: pg_restore.c:507
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"×× ×œ× ×¦×•×™×™×Ÿ קובץ הקלט, ×™×”×™×” שימוש בקלט סטנדרטי.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/it.po b/src/bin/pg_dump/po/it.po
new file mode 100644
index 0000000..dd30baa
--- /dev/null
+++ b/src/bin/pg_dump/po/it.po
@@ -0,0 +1,2939 @@
+#
+# pg_dump.po
+# Italian message translation file for pg_dump
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org>, 2010.
+# Mirko Tebaldi <mirko.tebaldi@libero.it>, 2004.
+# Fabrizio Mazzoni <veramente@libero.it>, 2003.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (Postgresql) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2023-09-05 08:21+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "impossibile identificare la directory corrente: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422 parallel.c:1611
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo figlio terminato da segnale %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" per opzione \"%s\" non valido"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: common.c:134
+#, c-format
+msgid "reading extensions"
+msgstr "lettura delle estensioni"
+
+#: common.c:137
+#, c-format
+msgid "identifying extension members"
+msgstr "identificazione dei membri delle estensioni"
+
+#: common.c:140
+#, c-format
+msgid "reading schemas"
+msgstr "lettura schemi"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined tables"
+msgstr "lettura delle tabelle definite dall'utente"
+
+#: common.c:154
+#, c-format
+msgid "reading user-defined functions"
+msgstr "lettura funzioni definite dall'utente"
+
+#: common.c:158
+#, c-format
+msgid "reading user-defined types"
+msgstr "lettura tipi definiti dall'utente"
+
+#: common.c:162
+#, c-format
+msgid "reading procedural languages"
+msgstr "lettura linguaggi procedurali"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "lettura funzioni di aggregazione definite dall'utente"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined operators"
+msgstr "lettura operatori definiti dall'utente"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "lettura dei metodi di accesso definiti dall'utente"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "lettura classi operatore definite dall'utente"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "lettura delle famiglie di operatori definiti dall'utente"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "lettura dei parser di ricerca testo definiti dall'utente"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "lettura dei modelli di ricerca testo definiti dall'utente"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "lettura dei dizionari di ricerca testo definiti dall'utente"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "lettura delle configurazioni di ricerca testo definite dall'utente"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "lettura dei wrapper di dati esterni definiti dall'utente"
+
+#: common.c:195
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "lettura dei server esterni definiti dall'utente"
+
+#: common.c:198
+#, c-format
+msgid "reading default privileges"
+msgstr "lettura dei privilegi predefiniti"
+
+#: common.c:201
+#, c-format
+msgid "reading user-defined collations"
+msgstr "lettura delle collations definite dall'utente"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "lettura delle conversioni definite dall'utente"
+
+#: common.c:207
+#, c-format
+msgid "reading type casts"
+msgstr "lettura delle conversioni dei tipi"
+
+#: common.c:210
+#, c-format
+msgid "reading transforms"
+msgstr "lettura delle trasformazioni"
+
+#: common.c:213
+#, c-format
+msgid "reading table inheritance information"
+msgstr "lettura informazioni di ereditarietà delle tabelle"
+
+#: common.c:216
+#, c-format
+msgid "reading event triggers"
+msgstr "lettura dei trigger di evento"
+
+#: common.c:220
+#, c-format
+msgid "finding extension tables"
+msgstr "ricerca delle tabelle delle estensioni"
+
+#: common.c:224
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "ricerca delle relazioni di ereditarietà"
+
+#: common.c:227
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "lettura informazioni di colonna per le tabelle interessate"
+
+#: common.c:230
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "marcatura colonne ereditate nelle sottotabelle"
+
+#: common.c:233
+#, c-format
+msgid "reading indexes"
+msgstr "lettura degli indici"
+
+#: common.c:236
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "marcatura indici nelle tabelle partizionate"
+
+#: common.c:239
+#, c-format
+msgid "reading extended statistics"
+msgstr "lettura delle statistiche estese"
+
+#: common.c:242
+#, c-format
+msgid "reading constraints"
+msgstr "lettura dei vincoli"
+
+#: common.c:245
+#, c-format
+msgid "reading triggers"
+msgstr "lettura dei trigger"
+
+#: common.c:248
+#, c-format
+msgid "reading rewrite rules"
+msgstr "lettura regole di riscrittura"
+
+#: common.c:251
+#, c-format
+msgid "reading policies"
+msgstr "lettura delle regole di sicurezza"
+
+#: common.c:254
+#, c-format
+msgid "reading publications"
+msgstr "lettura delle pubblicazioni"
+
+#: common.c:257
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "lettura pubblicazione appartenenza a tabelle"
+
+#: common.c:260
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "lettura dei membri della pubblicazione"
+
+#: common.c:263
+#, c-format
+msgid "reading subscriptions"
+msgstr "lettura delle sottoscrizioni"
+
+#: common.c:343
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "numero di genitori %d non valido per la tabella \"%s\""
+
+#: common.c:1004
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "controllo di integrità fallito, OID padre %u della tabella \"%s\" (OID %u) non trovato"
+
+#: common.c:1043
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "non è stato possibile interpretare l'array numerico \"%s\": troppi numeri"
+
+#: common.c:1055
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "non è stato possibile interpretare l'array numerico \"%s\": caratteri non validi nel numero"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "codice di compressione non valido: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "compilato senza il supporto a zlib"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "inizializzazione della libreria di compressione fallita: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "chiusura dello stream di compressione fallita: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "compressione dei dati fallita: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "decompressione dei dati fallita: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "chiusura della libreria di compressione fallita: %s"
+
+#: compress_io.c:584 compress_io.c:621
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "lettura dal file di input fallita: %s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553
+#: pg_backup_tar.c:726 pg_backup_tar.c:749
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "lettura dal file di input fallita: fine del file"
+
+#: parallel.c:253
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() non riuscito: codice di errore %d"
+
+#: parallel.c:961
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "creazione dei canali di comunicazione fallita: %m"
+
+#: parallel.c:1018
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "creazione del processo worker fallita: %m"
+
+#: parallel.c:1148
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "comando sconosciuto ricevuto dal master: \"%s\""
+
+#: parallel.c:1191 parallel.c:1429
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "messaggio non valido ricevuto dal worker: \"%s\""
+
+#: parallel.c:1323
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"errore nell'ottenere un lock sulla relazione \"%s\"\n"
+"Questo di solito vuol dire che qualcuno ha richiesto un lock ACCESS EXCLUSIVE sulla tabella dopo che il processo padre di pg_dump aveva ottenuto il lock ACCESS SHARE iniziale sulla tabella."
+
+#: parallel.c:1412
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "un processo worker è morto inaspettatamente"
+
+#: parallel.c:1534 parallel.c:1652
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "impossibile scrivere sul canale di comunicazione: %m"
+
+#: parallel.c:1736
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: errore nella creazione del socket: codice di errore %d"
+
+#: parallel.c:1747
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: bind fallito: codice di errore %d"
+
+#: parallel.c:1754
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: listen fallito: codice di errore %d"
+
+#: parallel.c:1761
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() non riuscito: codice di errore %d"
+
+#: parallel.c:1772
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: creazione del secondo socket fallita: codice di errore %d"
+
+#: parallel.c:1781
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: connessione del socket fallita: codice di errore %d"
+
+#: parallel.c:1790
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: accept della connessione fallito: codice di errore %d"
+
+#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576
+#, c-format
+msgid "could not close output file: %m"
+msgstr "chiusura del file di output fallita: %m"
+
+#: pg_backup_archiver.c:323 pg_backup_archiver.c:327
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "archiviare gli elementi non nell'ordine delle sezioni corretto"
+
+#: pg_backup_archiver.c:333
+#, c-format
+msgid "unexpected section code %d"
+msgstr "codice di sezione non prevista %d"
+
+#: pg_backup_archiver.c:370
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "il ripristino parallelo non è supportato con questo formato di archivio"
+
+#: pg_backup_archiver.c:374
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "il ripristino parallelo non è supportato con archivi eseguiti da pg_dump precedenti la versione 8.0"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "non è possibile ripristinare da archivio compresso (compressione non supportata in questa installazione)"
+
+#: pg_backup_archiver.c:409
+#, c-format
+msgid "connecting to database for restore"
+msgstr "connessione al database per il ripristino"
+
+#: pg_backup_archiver.c:411
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "le connessioni dirette al database non sono supportate negli archivi pre-1.3"
+
+#: pg_backup_archiver.c:454
+#, c-format
+msgid "implied data-only restore"
+msgstr "ripristino implicito dei soli dati"
+
+#: pg_backup_archiver.c:520
+#, c-format
+msgid "dropping %s %s"
+msgstr "cancellazione di %s %s"
+
+#: pg_backup_archiver.c:615
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "impossibile trovare dove inserire IF EXISTS nell'istruzione \"%s\""
+
+#: pg_backup_archiver.c:771 pg_backup_archiver.c:773
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "avvertimento dal file originale scaricato: %s"
+
+#: pg_backup_archiver.c:788
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "creazione %s \"%s.%s\""
+
+#: pg_backup_archiver.c:791
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "creazione di %s \"%s\""
+
+#: pg_backup_archiver.c:841
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "connessione al nuovo database \"%s\""
+
+#: pg_backup_archiver.c:868
+#, c-format
+msgid "processing %s"
+msgstr "elaborazione di %s"
+
+#: pg_backup_archiver.c:888
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "elaborazione dati per la tabella \"%s.%s\"."
+
+#: pg_backup_archiver.c:947
+#, c-format
+msgid "executing %s %s"
+msgstr "esecuzione di %s %s"
+
+#: pg_backup_archiver.c:986
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "disabilitazione trigger per %s"
+
+#: pg_backup_archiver.c:1012
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "abilitazione trigger per %s"
+
+#: pg_backup_archiver.c:1040
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "errore interno -- WriteData non può essere chiamata al di fuori del contesto di una routine DataDumper"
+
+#: pg_backup_archiver.c:1223
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "emissione dei large object non supportata nel formato scelto"
+
+#: pg_backup_archiver.c:1281
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "ripristinato %d large object"
+msgstr[1] "ripristinati %d large object"
+
+#: pg_backup_archiver.c:1302 pg_backup_tar.c:669
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "ripristino del large object con OID %u"
+
+#: pg_backup_archiver.c:1314
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "creazione il large object %u fallita: %s"
+
+#: pg_backup_archiver.c:1319 pg_dump.c:3568
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "apertura del large object %u fallita: %s"
+
+#: pg_backup_archiver.c:1375
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "apertura del file TOC \"%s\" fallita: %m"
+
+#: pg_backup_archiver.c:1403
+#, c-format
+msgid "line ignored: %s"
+msgstr "riga ignorata: %s"
+
+#: pg_backup_archiver.c:1410
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "non sono state trovate voci per l'ID %d"
+
+#: pg_backup_archiver.c:1433 pg_backup_directory.c:222
+#: pg_backup_directory.c:599
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "chiusura del file TOC fallita: %m"
+
+#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:586 pg_backup_directory.c:649
+#: pg_backup_directory.c:668 pg_dumpall.c:476
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "apertura del file di output \"%s\" fallita: %m"
+
+#: pg_backup_archiver.c:1549 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "apertura del file di output fallita: %m"
+
+#: pg_backup_archiver.c:1643
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "scritto %zu byte di dati large object (risultato = %d)"
+msgstr[1] "scritto %zu bytes di dati large object (risultato = %d)"
+
+#: pg_backup_archiver.c:1649
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "impossibile scrivere su un oggetto di grandi dimensioni: %s"
+
+#: pg_backup_archiver.c:1739
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "Errore durante INIZIALIZZAZIONE:"
+
+#: pg_backup_archiver.c:1744
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "Errore durante ELABORAZIONE TOC:"
+
+#: pg_backup_archiver.c:1749
+#, c-format
+msgid "while FINALIZING:"
+msgstr "Errore durante FINALIZZAZIONE:"
+
+#: pg_backup_archiver.c:1754
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "Errore nella voce TOC %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1830
+#, c-format
+msgid "bad dumpId"
+msgstr "dumpId errato"
+
+#: pg_backup_archiver.c:1851
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "dumpId di tabella errato per elemento TABLE DATA"
+
+#: pg_backup_archiver.c:1943
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "flag di offset dati non previsto %d"
+
+#: pg_backup_archiver.c:1956
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "l'offset del file scaricato è troppo grande"
+
+#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "nome della directory troppo lungo: \"%s\""
+
+#: pg_backup_archiver.c:2112
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "la directory \"%s\" non sembra un archivio valido (\"toc.dat\" non esiste)"
+
+#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "impossibile aprire il file di input \"%s\": %m"
+
+#: pg_backup_archiver.c:2127 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "apertura del file di input fallita: %m"
+
+#: pg_backup_archiver.c:2133
+#, c-format
+msgid "could not read input file: %m"
+msgstr "lettura del file di input fallita: %m"
+
+#: pg_backup_archiver.c:2135
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "il file di input è troppo corto (letti %lu, previsti 5)"
+
+#: pg_backup_archiver.c:2167
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "il file di input sembra un dump in formato testo. Prego usare psql."
+
+#: pg_backup_archiver.c:2173
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "il file di input non sembra essere un archivio valido (è troppo corto?)"
+
+#: pg_backup_archiver.c:2179
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "il file di input non sembra essere un archivio valido"
+
+#: pg_backup_archiver.c:2188
+#, c-format
+msgid "could not close input file: %m"
+msgstr "chiusura del file di input fallita: %m"
+
+#: pg_backup_archiver.c:2305
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "formato di file \"%d\" sconosciuto"
+
+#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "elemento %d %s %s terminato"
+
+#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "processo worker fallito: codice di uscita %d"
+
+#: pg_backup_archiver.c:2512
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "la voce ID %d è fuori dall'intervallo consentito -- possibile corruzione della TOC"
+
+#: pg_backup_archiver.c:2592
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "il ripristino delle tabelle CON OIDS non è più supportato"
+
+#: pg_backup_archiver.c:2674
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "codifica sconosciuta \"%s\""
+
+#: pg_backup_archiver.c:2679
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "elemento ENCODING non valido: %s"
+
+#: pg_backup_archiver.c:2697
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "elemento STDSTRINGS non valido: %s"
+
+#: pg_backup_archiver.c:2722
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schema \"%s\" non trovato"
+
+#: pg_backup_archiver.c:2729
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabella \"%s\" non trovata"
+
+#: pg_backup_archiver.c:2736
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "indice \"%s\" non trovato"
+
+#: pg_backup_archiver.c:2743
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "funzione \"%s\" non trovata"
+
+#: pg_backup_archiver.c:2750
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger \"%s\" non trovato"
+
+#: pg_backup_archiver.c:3143
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "impostazione della sessione utente a \"%s\" fallita: %s"
+
+#: pg_backup_archiver.c:3280
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "impostazione di search_path a \"%s\" fallita: %s"
+
+#: pg_backup_archiver.c:3342
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "impostazione di default_tablespace a %s fallita: %s"
+
+#: pg_backup_archiver.c:3392
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "impossibile impostare default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "non so come impostare il proprietario per il tipo di oggetto \"%s\""
+
+#: pg_backup_archiver.c:3754
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "magic string non trovata nell'intestazione del file"
+
+#: pg_backup_archiver.c:3768
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "versione (%d.%d) non supportata nell'intestazione del file"
+
+#: pg_backup_archiver.c:3773
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "verifica sulla dimensione degli interi (%lu) fallita"
+
+#: pg_backup_archiver.c:3777
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "l'archivio è stato creato su una macchina con numeri interi più grandi, alcune operazioni potrebbero non riuscire"
+
+#: pg_backup_archiver.c:3787
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "il formato previsto (%d) differisce dal formato trovato nel file (%d)"
+
+#: pg_backup_archiver.c:3802
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "l'archivio è compresso, ma questa installazione non supporta la compressione: non saranno disponibili dati"
+
+#: pg_backup_archiver.c:3836
+#, c-format
+msgid "invalid creation date in header"
+msgstr "data di creazione non valida nell'intestazione"
+
+#: pg_backup_archiver.c:3970
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "elaborazione elemento %d %s %s"
+
+#: pg_backup_archiver.c:4049
+#, c-format
+msgid "entering main parallel loop"
+msgstr "inizio del loop principale parallelo"
+
+#: pg_backup_archiver.c:4060
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "saltato l'elemento %d %s %s"
+
+#: pg_backup_archiver.c:4069
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "avvio dell'elemento %d %s %s-"
+
+#: pg_backup_archiver.c:4123
+#, c-format
+msgid "finished main parallel loop"
+msgstr "loop principale parallelo terminato"
+
+#: pg_backup_archiver.c:4159
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "elaborazione dell'elemento perduto %d %s %s"
+
+#: pg_backup_archiver.c:4764
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "creazione della tabella \"%s\" fallita, i suoi dati non verranno ripristinati"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "OID non valido per large object"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021
+#, c-format
+msgid "error during file seek: %m"
+msgstr "errore durante lo spostamento nel file: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "il blocco dati %d ha una posizione di ricerca errata"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "tipo di blocco dati sconosciuto (%d) durante la ricerca in archivio"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "blocco ID %d non trovato nell'archivio -- forse per una richiesta di ripristino fuori ordine, che non può essere eseguita perché il file di input non supporta il seek"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "blocco ID %d non trovato nell'archivio -- forse l'archivio è corrotto"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "trovato il blocco ID (%d) inatteso leggendo i dati -- previsto %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "tipo di blocco dati sconosciuto %d durante il ripristino dell'archivio"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "lettura dal file di input fallita: %m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1019
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "non è stato possibile determinare la posizione per il seek nel file d'archivio: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "chiusura del file di archivio fallita: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "solo gli archivi in input possono essere riaperti"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "il ripristino in parallelo da standard input non è supportato"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "il ripristino in parallelo da un file che non supporta il seek non è supportato"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "impossibile impostare la posizione di ricerca nel file di archivio: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "compressione attiva"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "non è stato possibile ottenere server_version da libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1646
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "abortito perché la versione del server non corrisponde"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1647
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "versione del server: %s; %s versione: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "già connesso ad un database"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595
+msgid "Password: "
+msgstr "Password: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "riconnessione al database fallita"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "riconnessione non riuscita: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732
+#, c-format
+msgid "query failed: %s"
+msgstr "query fallita: %s"
+
+#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733
+#, c-format
+msgid "Query was: %s"
+msgstr "La richiesta era: %s"
+
+#: pg_backup_db.c:316
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la query ha restituito %d riga invece di una: %s"
+msgstr[1] "la query ha restituito %d righe invece di una: %s"
+
+#: pg_backup_db.c:352
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s Il comando era: %s"
+
+#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489
+msgid "could not execute query"
+msgstr "esecuzione della query fallita"
+
+#: pg_backup_db.c:461
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "errore restituito da PQputCopyData: %s"
+
+#: pg_backup_db.c:510
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "errore restituito da PQputCopyEnd: %s"
+
+#: pg_backup_db.c:516
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY fallito per la tabella \"%s\": %s"
+
+#: pg_backup_db.c:522 pg_dump.c:2105
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "risultati extra imprevisti durante la COPIA della tabella \"%s\""
+
+#: pg_backup_db.c:534
+msgid "could not start database transaction"
+msgstr "avvio della transazione database fallito"
+
+#: pg_backup_db.c:542
+msgid "could not commit database transaction"
+msgstr "commit della transazione database fallito"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "directory di output non specificata"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:497
+#: pg_backup_directory.c:533
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "scrittura nel file di output fallita: %s"
+
+#: pg_backup_directory.c:373
+#, c-format
+msgid "could not close data file: %m"
+msgstr "chiusura del file di dati fallita: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:447
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "apertura del file TOC dei large object \"%s\" per l'input fallita: %m"
+
+#: pg_backup_directory.c:458
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "riga non valida nel file TOC dei large object \"%s\": \"%s\""
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "errore in lettura del file TOC dei large object \"%s\""
+
+#: pg_backup_directory.c:471
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "chiusura del file TOC dei large object \"%s\" fallita: %m"
+
+#: pg_backup_directory.c:685
+#, c-format
+msgid "could not close blob data file: %m"
+msgstr "chiusura del file di dati fallita: %m"
+
+#: pg_backup_directory.c:691
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "scrittura nel file TOC dei blob fallita"
+
+#: pg_backup_directory.c:705
+#, c-format
+msgid "could not close blobs TOC file: %m"
+msgstr "impossibile chiudere il file TOC BLOB: %m"
+
+#: pg_backup_directory.c:724
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "nome del file troppo lungo: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "questo formato non può essere letto"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "apertura del file TOC \"%s\" per l'output fallita: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "apertura del file TOC per l'output fallita: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:893
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "compressione non supportata dal formato di archivio tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "apertura del file TOC \"%s\" per l'input fallita: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "apertura del file TOC per l'input fallita: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "file \"%s\" non trovato nell'archivio"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "generazione del nome del file temporaneo fallita: %m"
+
+#: pg_backup_tar.c:624
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "sintassi dell'istruzione COPY imprevista: \"%s\""
+
+#: pg_backup_tar.c:890
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "OID non valida per il large object (%u)"
+
+#: pg_backup_tar.c:1035
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "chiusura del file temporaneo fallita: %m"
+
+#: pg_backup_tar.c:1038
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "la lunghezza effettiva del file (%lld) non corrisponde al previsto (%lld)"
+
+#: pg_backup_tar.c:1084 pg_backup_tar.c:1115
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "intestazione per il file \"%s\" nell'archivio tar non trovata"
+
+#: pg_backup_tar.c:1102
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "il ripristino dei dati fuori ordine non è supportato in questo formato di archivio: è richiesto \"%s\", ma nel file d'archivio viene prima di \"%s\"."
+
+#: pg_backup_tar.c:1149
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "intestazione del file tar incompleta (%lu byte)"
+msgstr[1] "intestazione del file tar incompleta (%lu byte)"
+
+#: pg_backup_tar.c:1188
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "intestazione tar corrotta in %s (previsti %d, calcolati %d) alla posizione file %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "nome della sezione non riconosciuta: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340
+#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373
+#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "slot on_exit_nicely terminati"
+
+#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_dump.c:661 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "le opzioni -s/--solo schema e -a/--solo dati non possono essere utilizzate insieme"
+
+#: pg_dump.c:664
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "le opzioni -s/--schema-only e -a/--data-only non possono essere usate insieme"
+
+#: pg_dump.c:667
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "l'opzione --include-foreign-data non è supportata con il backup parallelo"
+
+#: pg_dump.c:670 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "le opzioni -c/--clean e -a/--data-only non possono essere usate insieme"
+
+#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "l'opzione --if-exists richiede l'opzione -c/--clean"
+
+#: pg_dump.c:680
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "opzione --on-conflict-do-nothing richiede l'opzione --inserts, --rows-per-insert o --column-inserts"
+
+#: pg_dump.c:702
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "compressione richiesta non disponibile in questa installazione -- l'archivio verrà decompresso"
+
+#: pg_dump.c:715
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "il backup parallelo è supportato solo con il formato directory"
+
+#: pg_dump.c:761
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "l'ultimo OID predefinito è %u"
+
+#: pg_dump.c:770
+#, c-format
+msgid "no matching schemas were found"
+msgstr "non è stato trovato nessuno schema corrispondente"
+
+#: pg_dump.c:784
+#, c-format
+msgid "no matching tables were found"
+msgstr "non è stata trovata nessuna tabella corrispondente"
+
+#: pg_dump.c:806
+#, c-format
+msgid "no matching extensions were found"
+msgstr "non è stata trovata nessuna tabella corrispondente"
+
+#: pg_dump.c:989
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s scarica un database in formato testo o in altri formati.\n"
+"\n"
+
+#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_dump.c:991
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPZIONE]... [NOMEDB]\n"
+
+#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opzioni generali:\n"
+
+#: pg_dump.c:994
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=NOMEFILE nome del file o directory di output\n"
+
+#: pg_dump.c:995
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p formato del file di output (custom, directory,\n"
+" tar, testo in chiaro (predefinito))\n"
+
+#: pg_dump.c:997
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM usa NUM job paralleli per il dump\n"
+
+#: pg_dump.c:998 pg_dumpall.c:610
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose stampa più informazioni\n"
+
+#: pg_dump.c:999 pg_dumpall.c:611
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_dump.c:1000
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 livello di compressione per formati compressi\n"
+
+#: pg_dump.c:1001 pg_dumpall.c:612
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=TIMEOUT termina con errore dopo un'attesa di TIMEOUT\n"
+" per un lock di tabella\n"
+
+#: pg_dump.c:1002 pg_dumpall.c:639
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync non aspettare che i cambiamenti vengano scritti in sicurezza sul disco\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:613
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_dump.c:1005 pg_dumpall.c:614
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Opzioni per il controllo del contenuto dell'output:\n"
+
+#: pg_dump.c:1006 pg_dumpall.c:615
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only scarica solamente i dati, non lo schema\n"
+
+#: pg_dump.c:1007
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs includi nell'archivio i large object\n"
+
+#: pg_dump.c:1008
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs non scaricare i large object\n"
+
+#: pg_dump.c:1009 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr ""
+" -c, --clean svuota (drop) gli oggetti del database prima di\n"
+" ricrearli\n"
+
+#: pg_dump.c:1010
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create include nell'archivio i comandi per creare\n"
+" i database\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN esegue il dump solo delle estensioni specificate\n"
+
+#: pg_dump.c:1012 pg_dumpall.c:617
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=CODIFICA scarica i dati nella CODIFICA indicata\n"
+
+#: pg_dump.c:1013
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN esegue il dump solo degli schemi specificati\n"
+
+#: pg_dump.c:1014
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN non esegue il dump degli schemi specificati\n"
+
+#: pg_dump.c:1015
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner salta il ripristino del proprietario degli\n"
+" oggetti nel formato testo in chiaro\n"
+
+#: pg_dump.c:1017 pg_dumpall.c:621
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only scarica solo lo schema, non i dati\n"
+
+#: pg_dump.c:1018
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr ""
+" -S, --superuser=NOME nome del superutente da usare nel formato testo\n"
+" in chiaro\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr "-t, --table=PATTERN esegue il dump solo delle tabelle specificate\n"
+
+#: pg_dump.c:1020
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN non esegue il dump delle tabelle specificate\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:624
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges non scaricare i privilegi (grant/revoke)\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:625
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade da utilizzare solo dall'utilità di aggiornamento\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:626
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr ""
+" --column-inserts scarica dati come comandi INSERT con nomi\n"
+" di colonna\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:627
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting disabilita la quotazione con dollari, usa la\n"
+" quotazione standard SQL\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers disabilita i trigger durante il ripristino\n"
+" dei soli dati\n"
+
+#: pg_dump.c:1026
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security abilita la sicurezza per riga (salva solo i dati\n"
+" a cui l'utente ha accesso)\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN non esegue il dump dei dati per le tabelle specificate\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:630
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM sovrascrive l'impostazione predefinita per extra_float_digits\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists usa IF EXISTS nell'eliminare gli oggetti\n"
+
+#: pg_dump.c:1031
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MODELLO\n"
+" includere i dati delle tabelle estere su estero\n"
+" server corrispondenti a PATTERN\n"
+
+#: pg_dump.c:1034 pg_dumpall.c:632
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts scarica i dati come comandi INSERT anziché COPY\n"
+
+#: pg_dump.c:1035 pg_dumpall.c:633
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root carica le partizioni attraverso la tabella radice\n"
+
+#: pg_dump.c:1036 pg_dumpall.c:634
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments non scaricare i commenti\n"
+
+#: pg_dump.c:1037 pg_dumpall.c:635
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications non scaricare le pubblicazioni\n"
+
+#: pg_dump.c:1038 pg_dumpall.c:637
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels non scaricare le assegnazioni di sicurezza\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:638
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions non scaricare le sottoscrizioni\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:640
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method non esegue il dump dei metodi di accesso alle tabelle\n"
+
+#: pg_dump.c:1041 pg_dumpall.c:641
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces non scarica le assegnazioni di tablespace\n"
+
+#: pg_dump.c:1042 pg_dumpall.c:642
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression non esegue il dump dei metodi di compressione TOAST\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:643
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data non scaricare i dati delle tabelle non loggate\n"
+
+#: pg_dump.c:1044 pg_dumpall.c:644
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing add ON CONFLICT DO NOTHING ai comandi INSERT\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:645
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers metti tutti gli identificatori tra virgolette,\n"
+" anche se non sono parole chiave\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:646
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS numero di righe per INSERT; implica --inserts\n"
+
+#: pg_dump.c:1047
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION scarica la sezione con questo nome (pre-data,\n"
+" data o post-data)\n"
+
+#: pg_dump.c:1048
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable attendi prima che lo scaricamento possa essere\n"
+" eseguito senza anomalie\n"
+
+#: pg_dump.c:1049
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT usa questo snapshot per il salvataggio\n"
+
+#: pg_dump.c:1050 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names richiede che le tabelle/schemi includano pattern\n"
+" che combacino con almeno un'entità\n"
+
+#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" usa i comandi SET SESSION AUTHORIZATION invece\n"
+" di ALTER OWNER per impostare il proprietario\n"
+
+#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: pg_dump.c:1057
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=NOMEDB database da scaricare\n"
+
+#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NOMEHOST host server del database o directory socket\n"
+
+#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORTA numero porta del server di database\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOME connessione con l'utente di database specificato\n"
+
+#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non chiedere mai le password\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forza la richiesta di una password (dovrebbe essere\n"
+" automatico)\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:659
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=NOMERUOLO esegui SET ROLE prima di scaricare\n"
+
+#: pg_dump.c:1065
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non è stato fornito il nome del database, viene utilizzato il valore\n"
+"della variabile di ambiente PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:488
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "codifica client specificata \"%s\" non valida"
+
+#: pg_dump.c:1225
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "i dump paralleli dai server di standby non sono supportati da questa versione del server"
+
+#: pg_dump.c:1290
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "formato di output \"%s\" non valido specificato"
+
+#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificato improprio (troppi nomi puntati): %s"
+
+#: pg_dump.c:1339
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "nessuno schema trovato per il pattern \"%s\""
+
+#: pg_dump.c:1392
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "non sono state trovate estensioni corrispondenti per il pattern \"%s\""
+
+#: pg_dump.c:1445
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "non sono stati trovati server esterni corrispondenti per il modello \"%s\""
+
+#: pg_dump.c:1508
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "nome di relazione improprio (troppi nomi puntati): %s"
+
+#: pg_dump.c:1519
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "non sono state trovate tabelle corrispondenti per il modello \"%s\""
+
+#: pg_dump.c:1546
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Al momento non sei connesso a un database."
+
+#: pg_dump.c:1549
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "i riferimenti tra database diversi non sono implementati: %s"
+
+#: pg_dump.c:1980
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "salvataggio del contenuto della tabella \"%s.%s\""
+
+#: pg_dump.c:2086
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Lo scarico dei contenuti della tabella \"%s\" è fallito: PQgetCopyData() fallito."
+
+#: pg_dump.c:2087 pg_dump.c:2097
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Messaggio di errore dal server: %s"
+
+#: pg_dump.c:2088 pg_dump.c:2098
+#, c-format
+msgid "Command was: %s"
+msgstr "Il comando era: %s"
+
+#: pg_dump.c:2096
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Scarico dei contenuti della tabella \"%s\" fallito: PQgetResult() fallito."
+
+#: pg_dump.c:2178
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "numero errato di campi recuperati dalla tabella \"%s\""
+
+#: pg_dump.c:2836
+#, c-format
+msgid "saving database definition"
+msgstr "salvataggio definizione del database"
+
+#: pg_dump.c:2932
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "fornitore di ordinamenti non riconosciuto: %s"
+
+#: pg_dump.c:3278
+#, c-format
+msgid "saving encoding = %s"
+msgstr "salvataggio codifica = %s"
+
+#: pg_dump.c:3303
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "salvataggio standard_conforming_strings = %s"
+
+#: pg_dump.c:3342
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "errore nel parsing di current_schemas()"
+
+#: pg_dump.c:3361
+#, c-format
+msgid "saving search_path = %s"
+msgstr "salvataggio del search_path = %s"
+
+#: pg_dump.c:3399
+#, c-format
+msgid "reading large objects"
+msgstr "lettura dei large object"
+
+#: pg_dump.c:3537
+#, c-format
+msgid "saving large objects"
+msgstr "salvataggio dei large object"
+
+#: pg_dump.c:3578
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "errore di lettura del large object %u: %s"
+
+#: pg_dump.c:3684
+#, c-format
+msgid "reading row-level security policies"
+msgstr "rimuovi una regola di sicurezza per riga da una tabella"
+
+#: pg_dump.c:3825
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "tipo di comando di regola di sicurezza imprevisto: %c"
+
+#: pg_dump.c:4275 pg_dump.c:4593 pg_dump.c:11724 pg_dump.c:17575
+#: pg_dump.c:17577 pg_dump.c:18198
+#, c-format
+msgid "could not parse %s array"
+msgstr "impossibile analizzare l'array %s"
+
+#: pg_dump.c:4461
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "abbonamenti non scaricati perché l'utente corrente non è un superutente"
+
+#: pg_dump.c:4975
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "estensione genitore di %s %s non trovata"
+
+#: pg_dump.c:5120
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "lo schema con OID %u non esiste"
+
+#: pg_dump.c:6574 pg_dump.c:16839
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "controllo di integrità fallito, tabella padre con OID %u della sequenza con OID %u non trovata"
+
+#: pg_dump.c:6878 pg_dump.c:7145 pg_dump.c:7616 pg_dump.c:8283 pg_dump.c:8404
+#: pg_dump.c:8558
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "tabella non riconosciuta OID %u"
+
+#: pg_dump.c:6882
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "dati di indice imprevisti per la tabella \"%s\""
+
+#: pg_dump.c:7377
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "controllo di integrità fallito, tabella padre con OID %u della voce pg_rewrite con OID %u non trovata"
+
+#: pg_dump.c:7668
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "query prodotta nome tabella con riferimento nullo per il trigger di chiave esterna \"%s\" sulla tabella \"%s\" (OID della tabella: %u)"
+
+#: pg_dump.c:8287
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "dati di colonna imprevisti per la tabella \"%s\""
+
+#: pg_dump.c:8317
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "numerazione delle colonne non valida nella tabella \"%s\""
+
+#: pg_dump.c:8366
+#, c-format
+msgid "finding table default expressions"
+msgstr "trovare le espressioni di default della tabella"
+
+#: pg_dump.c:8408
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "valore adnum %d non valido per la tabella \"%s\""
+
+#: pg_dump.c:8508
+#, c-format
+msgid "finding table check constraints"
+msgstr "trovare i vincoli di controllo della tabella"
+
+#: pg_dump.c:8562
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "previsto %d vincolo di controllo sulla tabella \"%s\" ma trovato %d"
+msgstr[1] "previsti %d vincoli di controllo sulla tabella \"%s\" ma trovati %d"
+
+#: pg_dump.c:8566
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "I cataloghi di sistema potrebbero essere danneggiati."
+
+#: pg_dump.c:9256
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "il ruolo con OID %u non esiste"
+
+#: pg_dump.c:9368 pg_dump.c:9397
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "voce pg_init_privs non supportata: %u %u %d"
+
+#: pg_dump.c:10218
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "il tipo di tipo di dati \"%s\" sembra non essere valido"
+
+#: pg_dump.c:11793
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "valore provolatile sconosciuto per la funzione \"%s\""
+
+#: pg_dump.c:11843 pg_dump.c:13668
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "valore proparallel non riconosciuto per la funzione \"%s\""
+
+#: pg_dump.c:11974 pg_dump.c:12080 pg_dump.c:12087
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "definizione della funzione con OID %u non trovata"
+
+#: pg_dump.c:12013
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "valore falso nel campo pg_cast.castfunc o pg_cast.castmethod"
+
+#: pg_dump.c:12016
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "valore fasullo nel campo pg_cast.castmethod"
+
+#: pg_dump.c:12106
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "definizione di trasformazione fasulla, almeno uno di trffromsql e trftosql dovrebbe essere diverso da zero"
+
+#: pg_dump.c:12123
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "valore fasullo nel campo pg_transform.trffromsql"
+
+#: pg_dump.c:12144
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "valore fasullo nel campo pg_transform.trftosql"
+
+#: pg_dump.c:12289
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "Gli operatori postfix non sono più supportati (operatore \"%s\")"
+
+#: pg_dump.c:12459
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "impossibile trovare l'operatore con OID %s"
+
+#: pg_dump.c:12527
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "tipo \"%c\" non valido del metodo di accesso \"%s\""
+
+#: pg_dump.c:13169
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "fornitore di ordinamenti non riconosciuto: %s"
+
+#: pg_dump.c:13587
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "valore aggfinalmodify non riconosciuto per l'aggregato \"%s\""
+
+#: pg_dump.c:13643
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "valore aggmfinalmodify non riconosciuto per l'aggregato \"%s\""
+
+#: pg_dump.c:14361
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "tipo di oggetto sconosciuto nei privilegi predefiniti: %d"
+
+#: pg_dump.c:14377
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "impossibile analizzare l'elenco ACL predefinito (%s)"
+
+#: pg_dump.c:14459
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "impossibile analizzare l'elenco ACL iniziale (%s) o predefinito (%s) per l'oggetto \"%s\" (%s)"
+
+#: pg_dump.c:14484
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "impossibile analizzare l'elenco ACL (%s) o il valore predefinito (%s) per l'oggetto \"%s\" (%s)"
+
+#: pg_dump.c:15022
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "la query per ottenere la definizione della vista \"%s\" non ha restituito dati"
+
+#: pg_dump.c:15025
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "la query per ottenere la definizione della vista \"%s\" ha restituito più di una definizione"
+
+#: pg_dump.c:15032
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "la definizione della vista \"%s\" sembra essere vuota (lunghezza zero)"
+
+#: pg_dump.c:15116
+#, c-format
+#| msgid "LOCATION is not supported anymore"
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS non è più supportato (tabella \"%s\")"
+
+#: pg_dump.c:16045
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "numero di colonna %d non valido per la tabella \"%s\""
+
+#: pg_dump.c:16123
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "impossibile analizzare le colonne delle statistiche dell'indice"
+
+#: pg_dump.c:16125
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "impossibile analizzare i valori delle statistiche dell'indice"
+
+#: pg_dump.c:16127
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "numero di colonne e valori non corrispondenti per le statistiche dell'indice"
+
+#: pg_dump.c:16345
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "omesso indice per vincolo \"%s\""
+
+#: pg_dump.c:16573
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "tipo di vincolo non riconosciuto: %c"
+
+#: pg_dump.c:16674 pg_dump.c:16903
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgstr[1] "query to get data of sequence \"%s\" returned %d row (expected 1)"
+
+#: pg_dump.c:16706
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "tipo di sequenza non riconosciuto: %s"
+
+#: pg_dump.c:16995
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "valore tgtype imprevisto: %d"
+
+#: pg_dump.c:17067
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "stringa argomento non valida (%s) per il trigger \"%s\" nella tabella \"%s\""
+
+#: pg_dump.c:17336
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "query per ottenere la regola \"%s\" per la tabella \"%s\" non riuscita: numero di righe restituito errato"
+
+#: pg_dump.c:17489
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "impossibile trovare l'estensione di riferimento %u"
+
+#: pg_dump.c:17579
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "numero di configurazioni e condizioni per l'estensione non corrispondenti"
+
+#: pg_dump.c:17711
+#, c-format
+msgid "reading dependency data"
+msgstr "lettura dei dati di dipendenza"
+
+#: pg_dump.c:17797
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "nessun oggetto di riferimento %u %u"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "nessun oggetto di riferimento %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "dumpid %d non valido"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "dipendenza non valida %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "identificazione del ciclo di dipendenze fallito"
+
+#: pg_dump_sort.c:1232
+#, 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] "ci sono vincoli di chiave esterna circolari su questa tabella:"
+msgstr[1] "ci sono vincoli di chiave esterna circolari su queste tabelle:"
+
+#: pg_dump_sort.c:1236 pg_dump_sort.c:1256
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1237
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Potrebbe non essere possibile ripristinare il dump senza utilizzare --disable-triggers o eliminare temporaneamente i vincoli."
+
+#: pg_dump_sort.c:1238
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Prendi in considerazione l'utilizzo di un dump completo invece di un --data-only dump per evitare questo problema."
+
+#: pg_dump_sort.c:1250
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "non è stato possibile risolvere il ciclo di dipendenza tra questi elementi:"
+
+#: pg_dumpall.c:205
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: pg_dumpall.c:208
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: pg_dumpall.c:357
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "opzione --exclude-database non può essere utilizzata insieme a -g/--solo-globals, -r/--solo-ruoli o -t/--solo spazi tabelle"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "le opzioni -g/--globals-only e -r/--roles-only non possono essere utilizzate insieme"
+
+#: pg_dumpall.c:372
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "le opzioni -g/--globals-only e -t/--tablespaces-only non possono essere utilizzate insieme"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "le opzioni -r/--solo ruoli e -t/--solo tablespace non possono essere utilizzate insieme"
+
+#: pg_dumpall.c:444 pg_dumpall.c:1587
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "impossibile connettersi al database \"%s\""
+
+#: pg_dumpall.c:456
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"impossibile connettersi ai database \"postgres\" o \"template1\"\n"
+"Specificare un database alternativo."
+
+#: pg_dumpall.c:604
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s estrae un cluster di database PostgreSQL in un file script SQL.\n"
+"\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPZIONE]...\n"
+
+#: pg_dumpall.c:609
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=NOMEFILE nome file di output\n"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean pulisci (drop) i database prima di ricrearli\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only scarica solo gli oggetti globali e non i database\n"
+
+#: pg_dumpall.c:619 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner salta il ripristino del proprietario degli oggetti\n"
+
+#: pg_dumpall.c:620
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only scarica solo i ruoli e non i database o i tablespace\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NOME nome del superutente da usare nel dump\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only scarica solo i tablespace e non i database o i ruoli\n"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN esclude i database il cui nome corrisponde a PATTERN\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords non scaricare le password dei ruoli\n"
+
+#: pg_dumpall.c:652
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=STRCONN connettiti usando la stringa di connessione\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=NOMEDB database predefinito alternativo\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Se -f/--file non viene usato, lo script SQL verrà scritto nello standard\n"
+"output.\n"
+"\n"
+
+#: pg_dumpall.c:803
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "nome del ruolo che inizia con \"pg_\" ignorato (%s)"
+
+#: pg_dumpall.c:1018
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "impossibile analizzare l'elenco ACL (%s) per il parametro \"%s\""
+
+#: pg_dumpall.c:1136
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "impossibile analizzare l'elenco ACL (%s) per il tablespace \"%s\""
+
+#: pg_dumpall.c:1343
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "escluso il database \"%s\""
+
+#: pg_dumpall.c:1347
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "database di dumping \"%s\""
+
+#: pg_dumpall.c:1378
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump non riuscito sul database \"%s\", in uscita"
+
+#: pg_dumpall.c:1384
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "impossibile riaprire il file di output \"%s\": %m"
+
+#: pg_dumpall.c:1425
+#, c-format
+msgid "running \"%s\""
+msgstr "in esecuzione \"%s\""
+
+#: pg_dumpall.c:1630
+#, c-format
+msgid "could not get server version"
+msgstr "impossibile ottenere la versione del server"
+
+#: pg_dumpall.c:1633
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "impossibile analizzare la versione del server \"%s\""
+
+#: pg_dumpall.c:1703 pg_dumpall.c:1726
+#, c-format
+msgid "executing %s"
+msgstr "esecuzione di %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "uno tra -d/--dbname e -f/--file deve essere specificato"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "le opzioni -d/--dbname e -f/--file non possono essere utilizzate insieme"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "le opzioni -C/--create e -1/--single-transaction non possono essere utilizzate insieme"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "non è possibile specificare sia --single-transaction che più lavori"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "formato archivio non riconosciuto \"%s\"; si prega di specificare \"c\", \"d\" o \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "errori ignorati durante il ripristino: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s ripristino di un database PostgreSQL da un archivio creato con pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPZIONE]... [FILE]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NOME nome del database a cui connettersi\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME nome del file di output (- per stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formato del file di backup (dovrebbe essere automatico)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list stampa un riassunto della TOC dell'archivio\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose stampa più informazioni\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Opzioni per il controllo del ripristino:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only ripristina solo i dati, non gli schemi\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create crea il database in oggetto\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error esci in caso di errore, il comportamento predefinito è continuare\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOME ripristina l'indice indicato\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM per il ripristino usa questo numero di job paralleli\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=NOMEFILE utilizza la tabella dei contenuti di questo file per\n"
+" selezionare/ordinare l'output\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NOME ripristina solo gli oggetti in questo schema\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME non ripristinare gli oggetti in questo schema\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOME(arg) ripristina la funzione indicata\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only ripristina solo lo schema e non i dati\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NOME nome del superutente da usare per disabilitare i trigger\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOME ripristina la relazione indicata (tabella, vista, ecc.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOME ripristina il trigger indicato\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges salta il ripristino dei privilegi di accesso (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction ripristina in un'unica transazione\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security abilita la sicurezza per riga\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments non ripristinare i commenti\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables non ripristinare i dati delle tabelle che non\n"
+" è stato possibile creare\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications non ripristinare le pubblicazioni\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels non ripristinare le etichette di sicurezza\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions non ripristinare le sottoscrizioni\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method non ripristina i metodi di accesso alle tabelle\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces non ripristina le assegnazioni dei tablespace\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEZIONE ripristina la sezione indicata (pre-data, data o post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=NOMERUOLO esegui SET ROLE prima del ripristino\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Le opzioni -I, -n, -N, -P, -t, -T e --section possono essere combinate e specificate\n"
+"più volte per selezionare più oggetti.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non è stato fornito un nome in input, viene utilizzato lo standard input.\n"
+"\n"
+
+#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+#~ msgstr " --no-synchronized-snapshots non usare snapshot sincronizzati nei job paralleli\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids includi gli OID nel dump\n"
+
+#~ msgid "%s: WSAStartup failed: %d\n"
+#~ msgstr "%s: WSAStartup fallita: %d\n"
+
+#~ msgid "%s: could not connect to database \"%s\": %s"
+#~ msgstr "%s: connessione al database \"%s\" fallita: %s"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di output \"%s\" fallita: %s\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: esecuzione di %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: codifica client specificata \"%s\" non valida\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: numero di job paralleli non valido\n"
+
+#~ msgid "%s: maximum number of parallel jobs is %d\n"
+#~ msgstr "%s: il numero massimo di job paralleli è %d\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: l'opzione --if-exists richiede l'opzione -c/--clean\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: le opzioni -c/--clean e -a/--data-only non possono essere usate insieme\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: le opzioni -s/--schema-only e -a/--data-only non possono essere usate insieme\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: query fallita: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: la query era: %s\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(Il comando INSERT non può impostare OID.)\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C e -1 sono opzioni incompatibili\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Gli snapshot sincronizzati non sono supportati da questa versione\n"
+#~ "del server. Puoi usare --no-synchronized-snapshots invece se non hai\n"
+#~ "bisogno di snapshot sincronizzati.\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Gli snapshot sincronizzati sui server di standby non sono supportati da questa versione.\n"
+#~ "Usa --no-synchronized-snapshots se non ti servono snapshot\n"
+#~ "sincronizzati.\n"
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "Voce TOC %s a %s (lunghezza %s, checksum %d)\n"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"pg_dump\" è richiesto da %s ma non è stato trovato nella\n"
+#~ "stessa directory di \"%s\".\n"
+#~ "Verifica che l'installazione sia corretta.\n"
+
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"pg_dump\" è stato trovato da \"%s\"\n"
+#~ "ma non è la stessa versione di %s.\n"
+#~ "Controllate la vostra installazione.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n"
+#~ msgstr "ATTENZIONE: la funzione di aggregazione %s non può essere scaricata correttamente per questa versione database; ignorata\n"
+
+#~ msgid "WARNING: bogus value in proargmodes array\n"
+#~ msgstr "ATTENZIONE: valore errato nell'array proargmode\n"
+
+#~ msgid "WARNING: could not parse proallargtypes array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array proallargtype\n"
+
+#~ msgid "WARNING: could not parse proargmodes array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array proargmode\n"
+
+#~ msgid "WARNING: could not parse proargnames array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array proargname\n"
+
+#~ msgid "WARNING: could not parse proconfig array\n"
+#~ msgstr "ATTENZIONE: non è stato possibile analizzare l'array preconfig\n"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "ATTENZIONE: errore di lettura dell'array reloptions\n"
+
+#~ msgid "WARNING: could not parse subpublications array\n"
+#~ msgstr "ATTENZIONE: errore nella lettura delle sotto-pubblicazioni\n"
+
+#~ msgid "WARNING: ftell mismatch with expected position -- ftell used\n"
+#~ msgstr "ATTENZIONE: ftell non corrisponde alla posizione prevista -- verrà usato il valore restituito da ftell\n"
+
+#~ msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della funzione di aggregazione \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of data type \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario del tipo dato \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of function \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della funzione \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of operator \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario dell'operatore \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della classe operatore \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della famiglia di operatori \"%s\" non sembra essere valido\n"
+
+#~ msgid "WARNING: owner of publication \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della pubblicazione \"%s\" non sembra valido\n"
+
+#~ msgid "WARNING: owner of schema \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario dello schema \"%s\" sembra non essere valido\n"
+
+#~ msgid "WARNING: owner of subscription \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della sottoscrizione \"%s\" non sembra valido\n"
+
+#~ msgid "WARNING: owner of table \"%s\" appears to be invalid\n"
+#~ msgstr "ATTENZIONE: il proprietario della tabella \"%s\" non sembra essere valido\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "allocazione AH per %s, formato %d\n"
+
+#~ msgid "archiver"
+#~ msgstr "archiviatore"
+
+#~ msgid "archiver (db)"
+#~ msgstr "archiviatore (db)"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "tentativo di accertamento del formato dell'archivio\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "compression level must be in range 0..9\n"
+#~ msgstr "il livello di compressione dev'essere tra 0 e 9\n"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\"\n"
+#~ msgstr "connessione al database \"%s\" come utente \"%s\"\n"
+
+#~ msgid "connection needs password\n"
+#~ msgstr "la connessione richiede la password\n"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "connessione al database \"%s\" fallita: %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not close tar member\n"
+#~ msgstr "chiusura del membro tar fallita\n"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n"
+#~ msgstr "blocco ID %d non trovato nell'archivio -- forse per una richiesta di ripristino fuori ordine, che non può essere eseguita per la mancanza di offset dati nell'archivio\n"
+
+#~ msgid "could not open temporary file\n"
+#~ msgstr "apertura del file temporaneo fallita\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "impostazione di default_with_oids fallita: %s"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)\n"
+#~ msgstr "scrittura del large object fallita (risultato: %lu, previsto: %lu)\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "archiviatore personalizzato"
+
+#~ msgid "directory archiver"
+#~ msgstr "archiviatore di directory"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "immissione restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "inizio di restore_toc_entries_postfork\n"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "inizio di restore_toc_entries_prefork\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "connessione al database fallita\n"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "riconnessione al database fallita\n"
+
+#~ msgid "finding check constraints for table \"%s.%s\"\n"
+#~ msgstr "ricerca dei vincoli di controllo della tabella \"%s.%s\"\n"
+
+#~ msgid "finding default expressions of table \"%s.%s\"\n"
+#~ msgstr "lettura delle espressioni di default della tabella \"%s.%s\"\n"
+
+#~ msgid "finding the columns and types of table \"%s.%s\"\n"
+#~ msgstr "lettura delle colonne e dei tipi della tabella \"%s.%s\"\n"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+#~ msgstr "errore interno -- né th né fh specificato in tarReadRaw()\n"
+
+#~ msgid "invalid number of parallel jobs\n"
+#~ msgstr "numero di job paralleli non valido\n"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "spostamento dalla posizione %s al membro successivo alla posizione nel file %s\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "nessun elemento pronto\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "attuale posizione nel file %s\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "le opzioni --inserts/--column-inserts e -o/--oids non possono essere usate insieme\n"
+
+#~ msgid "parallel archiver"
+#~ msgstr "archiviatore parallelo"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "letta voce TOC %d (ID %d) per %s %s\n"
+
+#~ msgid "reading foreign key constraints for table \"%s.%s\"\n"
+#~ msgstr "lettura dei vincoli di chiave esterna della tabella \"%s.%s\"\n"
+
+#~ msgid "reading indexes for table \"%s.%s\"\n"
+#~ msgstr "lettura degli indici della tabella \"%s.%s\"\n"
+
+#~ msgid "reading policies for table \"%s.%s\"\n"
+#~ msgstr "lettura delle regole di sicurezza per la tabella \"%s.%s\"\n"
+
+#~ msgid "reading row security enabled for table \"%s.%s\"\n"
+#~ msgstr "letture delle regole di sicurezza per riga abilitata per la tabella \"%s.%s\"\n"
+
+#~ msgid "reading triggers for table \"%s.%s\"\n"
+#~ msgstr "lettura dei trigger della tabella \"%s.%s\"\n"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "riduzione dipendenze per %d\n"
+
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "lo schema con OID %u non esiste\n"
+
+#~ msgid "select() failed: %s\n"
+#~ msgstr "select() fallita: %s\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "salto del membro tar %s\n"
+
+#~ msgid "sorter"
+#~ msgstr "operatore_di_ordinamento"
+
+#~ msgid "tar archiver"
+#~ msgstr "archiviatore tar"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "trasferimento di dipendenza %d -> %d a %d\n"
+
+#~ msgid "unrecognized collation provider: %s\n"
+#~ msgstr "fornitore di ordinamenti non riconosciuto: %s\n"
diff --git a/src/bin/pg_dump/po/ja.po b/src/bin/pg_dump/po/ja.po
new file mode 100644
index 0000000..d5aa056
--- /dev/null
+++ b/src/bin/pg_dump/po/ja.po
@@ -0,0 +1,2790 @@
+# pg_dump.po
+# Japanese message translation file for pg_dump
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-23 09:37+0900\n"
+"PO-Revision-Date: 2023-08-23 10:26+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "ã“ã®ãƒ“ルドã§ã¯%sã«ã‚ˆã‚‹åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "圧縮オプションãŒã‚ã‚‹ã¯ãšã®å ´æ‰€ã«ç©ºæ–‡å­—列ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "èªè­˜ã§ããªã„圧縮オプション: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "圧縮オプション\"%s\"ã«ã¯å€¤ãŒå¿…è¦ã§ã™"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "圧縮オプション\"%s\"ã®å€¤ã¯æ•´æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "圧縮オプション\"%s\"ã®å€¤ã¯çœŸå½å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "圧縮アルゴリズム\"%s\"ã¯åœ§ç¸®ãƒ¬ãƒ™ãƒ«ã‚’å—ã‘付ã‘ã¾ã›ã‚“"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "圧縮アルゴリズム\"%s\"ã§ã¯%dã‹ã‚‰%dã¾ã§ã®åœ§ç¸®ãƒ¬ãƒ™ãƒ«ãŒæŒ‡å®šå¯èƒ½ã§ã™(デフォルトã¯%d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "圧縮アルゴリズム\"%s\"ã¯ãƒ¯ãƒ¼ã‚«ãƒ¼æ•°ã‚’å—ã‘付ã‘ã¾ã›ã‚“"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "圧縮アルゴリズム\"%s\"ã¯é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ä¸æ­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行ã™ã‚‹\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "コマンドã¯å®Ÿè¡Œå¯èƒ½å½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­ãƒ—ロセスãŒçµ‚了コード%dã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­ãƒ—ロセスãŒä¾‹å¤–0x%Xã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­ãƒ—ロセスã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­ãƒ—ロセスãŒæœªçŸ¥ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹%dã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "機能拡張を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "機能拡張ã®æ§‹æˆè¦ç´ ã‚’特定ã—ã¦ã„ã¾ã™"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "スキーマを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "ユーザー定義テーブルを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "ユーザー定義関数を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "ユーザー定義型を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "手続ã言語を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "ユーザー定義集約関数を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "ユーザー定義演算å­ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "ユーザー定義アクセスメソッドを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "ユーザー定義演算å­ã‚¯ãƒ©ã‚¹ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "ユーザー定義演算å­æ—を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢ãƒ‘ーサを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢ãƒ†ãƒ³ãƒ—レートを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¾žæ›¸ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "ユーザー定義ã®å¤–部データラッパーを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "ユーザー定義ã®å¤–部サーãƒãƒ¼ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "デフォルト権é™è¨­å®šã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "ユーザー定義ã®ç…§åˆé †åºã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "ユーザー定義ã®å¤‰æ›ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "型キャストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "変æ›ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "テーブル継承情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "イベントトリガを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "機能拡張構æˆãƒ†ãƒ¼ãƒ–ルを探ã—ã¦ã„ã¾ã™"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "継承関係を検索ã—ã¦ã„ã¾ã™"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "対象テーブルã®åˆ—情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®ç¶™æ‰¿åˆ—ã«ãƒ•ãƒ©ã‚°ã‚’設定ã—ã¦ã„ã¾ã™"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "パーティション情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "インデックスを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "パーティション親テーブルã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã«ãƒ•ãƒ©ã‚°ã‚’設定ã—ã¦ã„ã¾ã™"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "拡張統計情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "制約を読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "トリガを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "書ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "ãƒãƒªã‚·ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "パブリケーションを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "テーブルã®ãƒ‘ブリケーションã¸ã®æ‰€å±žã‚’読ã¿å–ã£ã¦ã„ã¾ã™"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "スキーマã®ãƒ‘ブリケーションã¸ã®æ‰€å±žã‚’読ã¿å–ã£ã¦ã„ã¾ã™"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "サブスクリプションを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€ãƒ†ãƒ¼ãƒ–ル\"%2$s\"(OID %3$u)ã®è¦ªã®OID %1$uãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "テーブル\"%2$s\"用ã®è¦ªãƒ†ãƒ¼ãƒ–ルã®æ•°%1$dãŒä¸æ­£ã§ã™"
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "数値é…列\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ: è¦ç´ ãŒå¤šã™ãŽã¾ã™"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "数値é…列\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ: 数値ã«ä¸æ­£ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "圧縮ライブラリをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "圧縮ストリームをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "データを圧縮ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "データを伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "圧縮ライブラリをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: ファイルã®çµ‚端"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "LZ4伸張コンテキストを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "LZ4伸張コンテクストを解放ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "圧縮を終了ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "LZ4圧縮をåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "展開を終了ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "圧縮パラメータ\"%s\"を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "圧縮ライブラリをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "データを伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "処ç†ã•ã‚Œãªã„モード \"%s\""
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s()ãŒå¤±æ•—ã—ã¾ã—ãŸ: エラーコード %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "通信ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "ワーカープロセスを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "リーダーã‹ã‚‰èªè­˜ä¸èƒ½ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ä¿¡ã—ã¾ã—ãŸ: \"%s\""
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ワーカーã‹ã‚‰ä¸æ­£ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ã¾ã—ãŸ: \"%s\""
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"リレーション\"%s\"ã®ãƒ­ãƒƒã‚¯ã‚’ç²å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+"通常ã“ã‚Œã¯ã€pg_dumpã®è¦ªãƒ—ロセスãŒåˆæœŸã®ACCESS SHAREロックをç²å¾—ã—ãŸå¾Œã«ã ã‚Œã‹ãŒãƒ†ãƒ¼ãƒ–ルã«å¯¾ã—ã¦ACCESS EXCLUSIVEロックをè¦æ±‚ã—ãŸã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚"
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "ワーカープロセスãŒçªç„¶çµ‚了ã—ã¾ã—ãŸ"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "通信ãƒãƒ£ãƒ³ãƒãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: ソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: ãƒã‚¤ãƒ³ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: リッスンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s()ãŒå¤±æ•—ã—ã¾ã—ãŸ: エラーコード %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: 第二ソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: ソケットを接続ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: 接続をå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "出力ファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "アーカイブ項目ãŒæ­£ã—ã„セクション順ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "想定外ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚³ãƒ¼ãƒ‰ %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "ã“ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ファイル形å¼ã§ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "8.0 よりå¤ã„ pg_dump ã§ä½œã‚‰ã‚ŒãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "圧縮アーカイブã‹ã‚‰å¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ(%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "リストアã®ãŸã‚データベースã«æŽ¥ç¶šã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "1.3よりå¤ã„アーカイブã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®ç›´æŽ¥æŽ¥ç¶šã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "暗黙的ã«ãƒ‡ãƒ¼ã‚¿ã®ã¿ã®ãƒªã‚¹ãƒˆã‚¢ã‚’è¡Œã„ã¾ã™"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "%s %sを削除ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "æ–‡\"%s\"中㫠IF EXISTS を挿入ã™ã¹ã場所ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã§ã—ãŸ"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "オリジナルã®ãƒ€ãƒ³ãƒ—ファイルã‹ã‚‰ã®è­¦å‘Š: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "%s \"%s.%s\"を作æˆã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "%s \"%s\"を作æˆã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "æ–°ã—ã„データベース\"%s\"ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "%sを処ç†ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "テーブル\"%s.%s\"ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "%s %sを実行ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%sã®ãƒˆãƒªã‚¬ã‚’無効ã«ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%sã®ãƒˆãƒªã‚¬ã‚’有効ã«ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "内部エラー -- WriteDataã¯DataDumperルーãƒãƒ³ã®ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆå¤–ã§ã¯å‘¼ã³å‡ºã›ã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "é¸æŠžã—ãŸå½¢å¼ã§ã¯ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクト出力をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d個ã®ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをリストアã—ã¾ã—ãŸ"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "OID %uã®ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをリストアã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "ラージオブジェクト %u を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "ラージオブジェクト %u をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "TOCファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸï¼š %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "行を無視ã—ã¾ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "ID %dã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "TOCファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "出力ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "出力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "ラージオブジェクトデータを%zuãƒã‚¤ãƒˆæ›¸ã出ã—ã¾ã—ãŸ(çµæžœã¯%d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "ラージオブジェクトã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "åˆæœŸåŒ–中:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "TOC処ç†ä¸­:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "終了処ç†ä¸­:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "TOCエントリ%d; %u %u %s %s %s ã‹ã‚‰"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "ä¸æ­£ãªdumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATAé …ç›®ã«å¯¾ã™ã‚‹ä¸æ­£ãªãƒ†ãƒ¼ãƒ–ルdumpId"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "想定外ã®ãƒ‡ãƒ¼ã‚¿ã‚ªãƒ•ã‚»ãƒƒãƒˆãƒ•ãƒ©ã‚° %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "ダンプファイルã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚ªãƒ•ã‚»ãƒƒãƒˆãŒå¤§ãã™ãŽã¾ã™"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "ディレクトリåãŒé•·ã™ãŽã¾ã™: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "ディレクトリ\"%s\"ã¯æœ‰åŠ¹ãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªã„よã†ã§ã™ï¼ˆ\"toc.dat\"ãŒã‚ã‚Šã¾ã›ã‚“)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "入力ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "入力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "入力ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "入力ファイルãŒå°ã•ã™ãŽã¾ã™(読ã¿å–ã‚Š%luã€æƒ³å®šã¯ 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "入力ファイルãŒãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ã®ãƒ€ãƒ³ãƒ—ã®ã‚ˆã†ã§ã™ã€‚psqlを使用ã—ã¦ãã ã•ã„。"
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "入力ファイルãŒæœ‰åŠ¹ãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªã„よã†ã§ã™(å°ã•ã™ãŽã‚‹?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "入力ファイルãŒæœ‰åŠ¹ãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªã„よã†ã§ã™"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "入力ファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "標準出力を追記用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "èªè­˜ä¸èƒ½ã®ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼\"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "é …ç›® %d %s %s ã®å‡¦ç†ãŒå®Œäº†"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "ワーカープロセスã®å‡¦ç†å¤±æ•—: 終了コード %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "エントリID%dã¯ç¯„囲外ã§ã™ -- ãŠãらãTOCã®ç ´æã§ã™"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "WITH OIDSã¨å®šç¾©ã•ã‚ŒãŸãƒ†ãƒ¼ãƒ–ルã®ãƒªã‚¹ãƒˆã‚¢ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "èªè­˜ä¸èƒ½ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°\"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "ä¸æ­£ãªENCODING項目: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "ä¸æ­£ãªSTDSTRINGS項目: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "スキーマ \"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "テーブル\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "インデックス\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "関数\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "トリガ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "セッションユーザーを\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "search_pathã‚’\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "default_tablespaceã‚’\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "default_table_access_methodを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "オブジェクトタイプ%sã«å¯¾ã™ã‚‹æ‰€æœ‰è€…ã®è¨­å®šæ–¹æ³•ãŒã‚ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "ファイルヘッダã«ãƒžã‚¸ãƒƒã‚¯æ–‡å­—列ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "ファイルヘッダ内ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(%d.%d)ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "æ•´æ•°ã®ã‚µã‚¤ã‚º(%lu)ã«é–¢ã™ã‚‹å¥å…¨æ€§æ¤œæŸ»ãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "アーカイブã¯ã‚ˆã‚Šå¤§ããªã‚µã‚¤ã‚ºã®æ•´æ•°ã‚’æŒã¤ãƒžã‚·ãƒ³ã§ä½œæˆã•ã‚Œã¾ã—ãŸã€ä¸€éƒ¨ã®æ“作ãŒå¤±æ•—ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™"
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "想定ã—ãŸå½¢å¼(%d)ã¯ãƒ•ã‚¡ã‚¤ãƒ«å†…ã«ã‚ã‚‹å½¢å¼(%d)ã¨ç•°ãªã‚Šã¾ã™"
+
+#: pg_backup_archiver.c:3807
+#, 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:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "ヘッダ内ã®ä½œæˆæ—¥ä»˜ãŒä¸æ­£ã§ã™"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "é …ç›® %d %s %s を処ç†ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "メインã®ä¸¦åˆ—ループã«å…¥ã‚Šã¾ã™"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "é …ç›® %d %s %s をスキップã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "é …ç›® %d %s %s ã«ç€æ‰‹ã—ã¾ã™"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "メインã®ä¸¦åˆ—ループãŒçµ‚了ã—ã¾ã—ãŸ"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "やり残ã—é …ç›® %d %s %s を処ç†ã—ã¦ã„ã¾ã™"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "テーブル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€ã“ã®ãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã¯å¾©å…ƒã•ã‚Œã¾ã›ã‚“"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ラージオブジェクトã®OIDãŒä¸æ­£ã§ã™"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "ファイルシーク中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸ: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "データブロック%dã®ã‚·ãƒ¼ã‚¯ä½ç½®ãŒé–“é•ã£ã¦ã„ã¾ã™"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "アーカイブã®æŽ¢ç´¢ä¸­ã«èªè­˜ä¸èƒ½ã®ãƒ‡ãƒ¼ã‚¿ãƒ–ロックタイプ(%d)ãŒã‚ã‚Šã¾ã—ãŸ"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "アーカイブ中ã«ãƒ–ロックID %d ãŒã‚ã‚Šã¾ã›ã‚“ -- ãŠãらãリストアè¦æ±‚ãŒé †ä¸åŒã ã£ãŸãŸã‚ã§ã™ãŒã€å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚·ãƒ¼ã‚¯ä¸å¯ãªãŸã‚処ç†ã§ãã¾ã›ã‚“"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "アーカイブ内ã«ãƒ–ロック ID %d ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—㟠-- ãŠãらãアーカイブãŒå£Šã‚Œã¦ã„ã¾ã™"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "データ読ã¿è¾¼ã¿æ™‚ã«æƒ³å®šå¤–ã®ãƒ–ロックID(%d)ãŒã‚ã‚Šã¾ã—㟠--想定ã¯%d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "アーカイブã®ã‚Šã‚¹ãƒˆã‚¢ä¸­ã«èªè­˜ä¸å¯ã®ãƒ‡ãƒ¼ã‚¿ãƒ–ロックタイプ%dãŒã‚ã‚Šã¾ã—ãŸ"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "アーカイブファイルã®ã‚·ãƒ¼ã‚¯ä½ç½®ã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "アーカイブファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "入力アーカイブã ã‘ãŒå†ã‚ªãƒ¼ãƒ—ンå¯èƒ½ã§ã™"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "標準入力ã‹ã‚‰ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "シークä¸å¯ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "アーカイブファイルã®ã‚·ãƒ¼ã‚¯ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "圧縮処ç†ãŒæœ‰åŠ¹ã§ã™"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpqã‹ã‚‰server_versionã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ã®ãŸã‚処ç†ã‚’中断ã—ã¾ã™"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %sã€%s ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "データベースã¯ã™ã§ã«æŽ¥ç¶šæ¸ˆã¿ã§ã™"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "パスワード: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "データベースã¸ã®æŽ¥ç¶šãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "å†æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "å•ã„åˆã‚ã›: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "å•ã„åˆã‚ã›ãŒ1è¡Œã§ã¯ãªã%d行返ã—ã¾ã—ãŸ: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sコマンド: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "å•ã„åˆã‚ã›ã‚’実行ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData ã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã—ãŸ: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd ã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã—ãŸ: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "テーブル\"%s\"ã¸ã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "ファイル\"%s\"ã‚’COPY中ã«æƒ³å®šã—ã¦ã„ãªã„余分ãªçµæžœãŒã‚ã‚Šã¾ã—ãŸ"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "データベーストランザクションを開始ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "データベーストランザクションをコミットã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "出力ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "出力ファイルã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "データファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "データファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "ラージオブジェクトTOCファイル\"%s\"を入力用ã¨ã—ã¦ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ラージオブジェクトTOCファイル\"%s\"ã®ä¸­ã«ä¸æ­£ãªè¡ŒãŒã‚ã‚Šã¾ã—ãŸ: \"%s\""
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "ラージオブジェクトTOCファイル\"%s\"ã®èª­ã¿å–り中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸ"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "ラージオブジェクトTOCファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "ラージオブジェクトã®ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’クローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "ラージオブジェクトã®TOCファイルã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "ラージオブジェクトã®TOCファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "ファイルåãŒé•·ã™ãŽã¾ã™: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "ã“ã®å½¢å¼ã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "TOCファイル\"%s\"を出力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "TOCファイルを出力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "tar アーカイブ形å¼ã§ã¯åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "TOCファイル\"%s\"を入力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "TOCファイルを入力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "アーカイブ内ã«ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "一時ファイルåを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "想定外ã®COPYæ–‡ã®æ§‹æ–‡: \"%s\""
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "ラージオブジェクトã®ä¸æ­£ãªOID(%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "一時ファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸï¼š %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "実際ã®ãƒ•ã‚¡ã‚¤ãƒ«é•·(%lld)ãŒæƒ³å®š(%lld)ã¨ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "tar アーカイブ内ã§ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ãƒ˜ãƒƒãƒ€ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "ã“ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å½¢å¼ã§ã¯ã€é †ä¸åŒã§ã®ãƒ‡ãƒ¼ã‚¿ã®ãƒªã‚¹ãƒˆã‚¢ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“: \"%s\"ã¯å¿…è¦ã§ã™ãŒã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ファイル内ã§\"%s\"よりå‰ã«æ¥ã¾ã—ãŸã€‚"
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "ä¸å®Œå…¨ãªtarヘッダãŒã‚ã‚Šã¾ã—ãŸ(%luãƒã‚¤ãƒˆ)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "ç ´æã—ãŸtarヘッダãŒ%sã«ã‚ã‚Šã¾ã—ãŸ(想定 %dã€ç®—出çµæžœ %d) ファイルä½ç½® %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "èªè­˜ä¸å¯ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³å: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicelyスロットãŒè¶³ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "-s/--schema-only 㨠-a/--data-only オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "-s/--schema-only 㨠--include-foreign-data オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "オプション --include-foreign-data ã¯ãƒ‘ラレルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "-c/--clean 㨠-a/--data-only オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists㯠-c/--clean ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "--on-conflict-do-nothingオプションã¯--insertsã€--rows-per-insert ã¾ãŸã¯ --column-insertsã‚’å¿…è¦ã¨ã—ã¾ã™"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "èªè­˜ã§ããªã„圧縮アルゴリズム: \"%s\""
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ä¸æ­£ãªåœ§ç¸®æŒ‡å®š: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "圧縮オプション\"%s\"ã¯ç¾æ™‚点ã§ã¯pg_dumpã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "並列ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå½¢å¼ã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã™"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "最後ã®çµ„ã¿è¾¼ã¿OIDã¯%u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "マッãƒã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "マッãƒã™ã‚‹ãƒ†ãƒ¼ãƒ–ルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "åˆè‡´ã™ã‚‹æ©Ÿèƒ½æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%sã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’テキストファイルã¾ãŸã¯ãã®ä»–ã®å½¢å¼ã§ãƒ€ãƒ³ãƒ—ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般的ãªã‚ªãƒ—ション;\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ファイルå 出力ファイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p 出力ファイルã®å½¢å¼(custom, directory, tar, \n"
+" plain text(デフォルト))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM ダンプ時ã«æŒ‡å®šã—ãŸæ•°ã®ä¸¦åˆ—ジョブを使用\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 冗長モード\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=æ–¹å¼[:詳細]\n"
+" 指定ã®ã¨ãŠã‚Šåœ§ç¸®\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT テーブルロックをTIMEOUTå¾…ã£ã¦ã‹ã‚‰å¤±æ•—\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync 変更ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®å®‰å…¨ãªæ›¸ã出ã—ã‚’å¾…æ©Ÿã—ãªã„\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"出力内容を制御ã™ã‚‹ãŸã‚ã®ã‚ªãƒ—ション:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only データã®ã¿ã‚’ダンプã—ã€ã‚¹ã‚­ãƒ¼ãƒžã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr ""
+" -b, --large-objects ダンプã«ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをå«ã‚ã‚‹\n"
+"\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (--large-objectsã«åŒã˜ã€éžæŽ¨å¥¨)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects ダンプã«ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをå«ã‚ãªã„\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr ""
+" --no-blobs (--no-large-objectsã«åŒã˜ã€éžæŽ¨å¥¨)\n"
+"\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean å†ä½œæˆå‰ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクトを整ç†(削除)\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create ダンプã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç”Ÿæˆç”¨ã‚³ãƒžãƒ³ãƒ‰ã‚’å«ã‚ã‚‹\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN 指定ã—ãŸæ©Ÿèƒ½æ‹¡å¼µã®ã¿ã‚’ダンプ\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING 指定ã—ãŸç¬¦å·åŒ–æ–¹å¼ã§ãƒ‡ãƒ¼ã‚¿ã‚’ダンプ\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã®ã¿ã‚’ダンプ\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner プレインテキスト形å¼ã§ã€ã‚ªãƒ–ジェクト所有権ã®\n"
+" 復元を行ã‚ãªã„\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only スキーマã®ã¿ã‚’ダンプã—ã€ãƒ‡ãƒ¼ã‚¿ã¯ãƒ€ãƒ³ãƒ—ã—ãªã„\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr ""
+" -S, --superuser=NAME プレインテキスト形å¼ã§ä½¿ç”¨ã™ã‚‹ã‚¹ãƒ¼ãƒ‘ーユーザーã®\n"
+" åå‰\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã¿ã‚’ダンプ\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ルをダンプã—ãªã„\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges 権é™(grant/revoke)をダンプã—ãªã„\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade アップグレードユーティリティ専用\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts 列å指定ã®INSERTコマンドã§ãƒ‡ãƒ¼ã‚¿ã‚’ダンプ\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr ""
+" --disable-dollar-quoting ドル記å·ã«ã‚ˆã‚‹å¼•ç”¨ç¬¦ä»˜ã‘ã‚’ç¦æ­¢ã€SQL標準ã®å¼•ç”¨ç¬¦\n"
+" 付ã‘を使用\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers データã®ã¿ã®ãƒªã‚¹ãƒˆã‚¢ã®éš›ã«ãƒˆãƒªã‚¬ã‚’無効化\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security 行セキュリティを有効化(ユーザーãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãª\n"
+" 内容ã®ã¿ã‚’ダンプ)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=PATTERN\n"
+" 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã‚’å­ãƒ†ãƒ¼ãƒ–ルをå«ã‚ã¦\n"
+" ダンプã—ãªã„\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=PATTERN\n"
+" 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ãƒ‡ãƒ¼ã‚¿ã‚’å­ãƒ†ãƒ¼ãƒ–ルをå«ã‚ã¦\n"
+" ダンプã—ãªã„\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM extra_float_digitsã®è¨­å®šã‚’上書ãã™ã‚‹\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists オブジェクト削除ã®éš›ã« IF EXISTS を使用\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" PATTERNã«åˆè‡´ã™ã‚‹å¤–部サーãƒãƒ¼ä¸Šã®å¤–部テーブルã®\n"
+" データをå«ã‚ã‚‹\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts COPYã§ã¯ãªãINSERTコマンドã§ãƒ‡ãƒ¼ã‚¿ã‚’ダンプ\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root å­ãƒ†ãƒ¼ãƒ–ルをルートテーブル経由ã§ãƒ­ãƒ¼ãƒ‰ã™ã‚‹\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments コメントをダンプã—ãªã„\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications パブリケーションをダンプã—ãªã„\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels セキュリティラベルã®å‰²ã‚Šå½“ã¦ã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions サブスクリプションをダンプã—ãªã„\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method テーブルアクセスメソッドをダンプã—ãªã„\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces テーブルスペースã®å‰²ã‚Šå½“ã¦ã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST圧縮方å¼ã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data éžãƒ­ã‚°ãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã‚’ダンプã—ãªã„\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERTコマンドã«ON CONFLICT DO NOTHINGを付加ã™ã‚‹\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers ã™ã¹ã¦ã®è­˜åˆ¥å­ã‚’キーワードã§ãªã‹ã£ãŸã¨ã—ã¦ã‚‚\n"
+" 引用符ã§å›²ã‚€\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS INSERT毎ã®è¡Œæ•°; --insertsを暗黙的ã«æŒ‡å®šã™ã‚‹\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION 指定ã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³(pre-dataã€data ã¾ãŸã¯\n"
+" post-data)をダンプã™ã‚‹\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable ダンプを異常ãªã実行ã§ãるよã†ã«ãªã‚‹ã¾ã§å¾…æ©Ÿ\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT ダンプã«æŒ‡å®šã®ã‚¹ãƒŠãƒƒãƒ—ショットを使用ã™ã‚‹\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names テーブル/スキーマã®å¯¾è±¡ãƒ‘ターンãŒæœ€ä½Žã§ã‚‚\n"
+" 一ã¤ã®å®Ÿä½“ã«ãƒžãƒƒãƒã™ã‚‹ã“ã¨ã‚’å¿…é ˆã¨ã™ã‚‹\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã¿ã‚’å­ãƒ†ãƒ¼ãƒ–ル\n"
+" ã‚’å«ã‚ã¦ãƒ€ãƒ³ãƒ—\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" 所有者をセットã™ã‚‹éš›ã€ALTER OWNERコマンドã®ä»£ã‚ã‚Š\n"
+" ã«SET SESSION AUTHORIZATIONコマンドを使用ã™ã‚‹\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME ダンプã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n"
+" ディレクトリ\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 指定ã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§æŽ¥ç¶š\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力をè¦æ±‚ã—ãªã„\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password パスワードプロンプトを強制表示\n"
+" (自動的ã«è¡¨ç¤ºã•ã‚Œã‚‹ã¯ãš)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME ダンプã®å‰ã« SET ROLE ã‚’è¡Œã†\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データベースåãŒæŒ‡å®šã•ã‚Œãªã‹ã£ãŸå ´åˆã€ç’°å¢ƒå¤‰æ•°PGDATABASEãŒä½¿ç”¨ã•ã‚Œã¾ã™\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "ä¸æ­£ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°\"%s\"ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®ä¸¦åˆ—ダンプã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "ä¸æ­£ãªå‡ºåŠ›å½¢å¼\"%s\"ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "パターン\"%s\"ã«ãƒžãƒƒãƒã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "パターン\"%s\"ã«åˆè‡´ã™ã‚‹æ©Ÿèƒ½æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "パターン\"%s\"ã«ãƒžãƒƒãƒã™ã‚‹å¤–部サーãƒãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "リレーションåãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "パターン \"%s\"ã«ãƒžãƒƒãƒã™ã‚‹ãƒ†ãƒ¼ãƒ–ルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“。"
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "データベース間ã®å‚ç…§ã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "テーブル \"%s.%s\"ã®å†…容をダンプã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "テーブル\"%s\"ã®å†…容ã®ãƒ€ãƒ³ãƒ—ã«å¤±æ•—: PQgetCopyData()ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚"
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "サーãƒãƒ¼ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "コマンド: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "テーブル\"%s\"ã®å†…容ã®ãƒ€ãƒ³ãƒ—ã«å¤±æ•—: PQgetResult()ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚"
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "テーブル\"%s\"ã‹ã‚‰å–å¾—ã—ãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æ•°ãŒé–“é•ã£ã¦ã„ã¾ã™"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "データベース定義をä¿å­˜ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "èªè­˜ã§ããªã„ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "encoding = %s ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "standard_conforming_strings = %s ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas()ã®çµæžœã‚’パースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "search_path = %s ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "ラージオブジェクトを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "ラージオブジェクトをä¿å­˜ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "ラージオブジェクト %u を読ã¿å–り中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸ: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "行レベルセキュリティãƒãƒªã‚·ãƒ¼ã‚’読ã¿å–ã‚Šã¾ã™"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "想定外ã®ãƒãƒªã‚·ã‚³ãƒžãƒ³ãƒ‰ã‚¿ã‚¤ãƒ—: \"%c\""
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "%sé…列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚¹ãƒ¼ãƒ‘ーユーザーã§ã¯ãªã„ãŸã‚ã€ã‚µãƒ–スクリプションã¯ãƒ€ãƒ³ãƒ—ã•ã‚Œã¾ã›ã‚“"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s %sã®è¦ªã¨ãªã‚‹æ©Ÿèƒ½æ‹¡å¼µãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID %uã®ã‚¹ã‚­ãƒ¼ãƒžã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€OID %2$u ã§ã‚るシーケンス㮠OID %1$u ã§ã‚る親テーブルãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€pg_partitioned_tableã«ã‚るテーブルOID %u ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "èªè­˜ã§ããªã„テーブルOID %u"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "テーブル\"%s\"ã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãƒ‡ãƒ¼ã‚¿"
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€OID %2$u ã§ã‚ã‚‹pg_rewriteエントリã®OID %1$u ã§ã‚る親テーブルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "å•ã„åˆã‚ã›ãŒãƒ†ãƒ¼ãƒ–ル\"%2$s\"上ã®å¤–部キートリガ\"%1$s\"ã®å‚照テーブルåã¨ã—ã¦NULLã‚’è¿”ã—ã¾ã—ãŸ(テーブルã®OID: %3$u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "テーブル\"%s\"ã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®åˆ—データ"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "テーブル\"%s\"ã®åˆ—番å·ãŒä¸æ­£ã§ã™"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "テーブルã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå¼ã‚’探ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "テーブル\"%2$s\"用ã®adnumã®å€¤%1$dãŒä¸æ­£ã§ã™"
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "テーブルã®ãƒã‚§ãƒƒã‚¯åˆ¶ç´„を探ã—ã¦ã„ã¾ã™"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "テーブル\"%2$s\"ã§æƒ³å®šã™ã‚‹æ¤œæŸ»åˆ¶ç´„ã¯%1$d個ã§ã—ãŸãŒã€%3$dã‚ã‚Šã¾ã—ãŸ"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "システムカタログãŒç ´æã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "OID ㌠%u ã§ã‚るロールã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "éžã‚µãƒãƒ¼ãƒˆã®pg_init_privsエントリ: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "データ型\"%s\"ã®typtypeãŒä¸æ­£ãªã‚ˆã†ã§ã™"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "関数\"%s\"ã®provolatileã®å€¤ãŒèªè­˜ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "関数\"%s\"ã®proparallel値ãŒèªè­˜ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "OID %uã®é–¢æ•°ã®é–¢æ•°å®šç¾©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfuncã¾ãŸã¯pg_cast.castmethodフィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod フィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "ãŠã‹ã—ãªå¤‰æ›å®šç¾©ã€trffromsql ã‹ trftosql ã®å°‘ãªãã¨ã‚‚一方ã¯éžã‚¼ãƒ­ã§ã‚ã‚‹ã¯ãšã§ã™"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_cast.castmethod フィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_cast.castmethod フィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "後置演算å­ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“(演算å­\"%s\")"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "OID %sã®æ¼”ç®—å­ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "アクセスメソッド\"%2$s\"ã®ä¸æ­£ãªã‚¿ã‚¤ãƒ—\"%1$c\""
+
+#: pg_dump.c:13455
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "èªè­˜ã§ããªã„ã®ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ä¸æ­£ãªç…§åˆé †åº\"%s\""
+
+#: pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "èªè­˜ã§ããªã„ã®ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€ '%c'"
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "集約\"%s\"ã®aggfinalmodifyã®å€¤ãŒè­˜åˆ¥ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "集約\"%s\"ã®aggmfinalmodifyã®å€¤ãŒè­˜åˆ¥ã§ãã¾ã›ã‚“"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "デフォルト権é™è¨­å®šä¸­ã®èªè­˜ã§ããªã„オブジェクト型: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "デフォルト㮠ACL リスト(%s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "オブジェクト\"%3$s\"(%4$s)ã®åˆæœŸACLリスト(%1$s)ã¾ãŸã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤(%2$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "オブジェクト\"%3$s\"(%4$s)ã®ACLリスト(%1$s)ã¾ãŸã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤(%2$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "ビュー\"%s\"ã®å®šç¾©ã‚’å–り出ã™ãŸã‚ã®å•ã„åˆã‚ã›ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "ビュー\"%s\"ã®å®šç¾©ã‚’å–り出ã™ãŸã‚ã®å•ã„åˆã‚ã›ãŒ2ã¤ä»¥ä¸Šã®å®šç¾©ã‚’è¿”å´ã—ã¾ã—ãŸ"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "ビュー\"%s\"ã®å®šç¾©ãŒç©ºã®ã‚ˆã†ã§ã™(é•·ã•ãŒ0)"
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDSã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“(テーブル\"%s\")"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "テーブル\"%2$s\"ã®åˆ—番å·%1$dã¯ä¸æ­£ã§ã™"
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "インデックス統計列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "インデックス統計値をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "インデックス統計ã«å¯¾ã—ã¦åˆ—ã¨å€¤ã®æ•°ãŒåˆè‡´ã—ã¾ã›ã‚“"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "制約\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "制約ã®ã‚¿ã‚¤ãƒ—ãŒè­˜åˆ¥ã§ãã¾ã›ã‚“: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "シーケンス\"%s\"ã®ãƒ‡ãƒ¼ã‚¿ã‚’å¾—ã‚‹ãŸã‚ã®å•ã„åˆã‚ã›ãŒ%d行返å´ã—ã¾ã—ãŸ(想定ã¯1)"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "èªè­˜ã•ã‚Œãªã„シーケンスã®åž‹\"%s\""
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "想定外ã®tgtype値: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "テーブル\"%3$s\"上ã®ãƒˆãƒªã‚¬\"%2$s\"ã®å¼•æ•°æ–‡å­—列(%1$s)ãŒä¸æ­£ã§ã™"
+
+#: pg_dump.c:17655
+#, 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:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "親ã®æ©Ÿèƒ½æ‹¡å¼µ%uãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "機能拡張ã«å¯¾ã—ã¦è¨­å®šã¨æ¡ä»¶ã®æ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "データã®ä¾å­˜ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "å‚照元オブジェクト%u %uãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "å‚照先オブジェクト%u %uãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "ä¸æ­£ãªdumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "ä¸æ­£ãªä¾å­˜é–¢ä¿‚ %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "ä¾å­˜é–¢ä¿‚ã®ãƒ«ãƒ¼ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dump_sort.c:1276
+#, 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:1281
+#, 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:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "以下ã®é …ç›®ã®é–“ã®ä¾å­˜é–¢ä¿‚ã®ãƒ«ãƒ¼ãƒ—を解決ã§ãã¾ã›ã‚“ã§ã—ãŸ:"
+
+#: pg_dumpall.c:230
+#, 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\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“ã‚Œã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "--exclude-database オプション㯠-g/--globals-onlyã€-r/--roles-only ã‚‚ã—ã㯠-t/--tablespaces-only ã¨ä¸€ç·’ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "-g/--globals-onlyã¨-r/--roles-onlyオプションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "-g/--globals-onlyã¨-t/--tablespaces-onlyオプションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "-r/--roles-onlyã¨-t/--tablespaces-onlyオプションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "データベース\"%s\"ã¸æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"\"postgres\"ã¾ãŸã¯\"template1\"データベースã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ\n"
+"代ã‚ã‚Šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定ã—ã¦ãã ã•ã„。"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベースクラスタをSQLスクリプトファイルã«å±•é–‹ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ファイルå 出力ファイルå\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean å†ä½œæˆå‰ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’æ•´ç†ï¼ˆå‰Šé™¤ï¼‰\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only グローãƒãƒ«ã‚ªãƒ–ジェクトã®ã¿ã‚’ダンプã—ã€\n"
+" データベースをダンプã—ãªã„\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner オブジェクトã®æ‰€æœ‰æ¨©ã®å¾©å…ƒã‚’çœç•¥\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only ロールã®ã¿ã‚’ダンプ。\n"
+" データベースã¨ãƒ†ãƒ¼ãƒ–ル空間をダンプã—ãªã„\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=NAME ダンプã§ä½¿ç”¨ã™ã‚‹ã‚¹ãƒ¼ãƒ‘ーユーザーã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’\n"
+" 指定\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only テーブル空間ã®ã¿ã‚’ダンプ。データベースã¨ãƒ­ãƒ¼ãƒ«ã‚’\n"
+" ダンプã—ãªã„\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN PATTERNã«åˆè‡´ã™ã‚‹åå‰ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’除外\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords ロールã®ãƒ‘スワードをダンプã—ãªã„\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONSTR 接続文字列を用ã„ãŸæŽ¥ç¶š\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME 代替ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"-f/--file ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€SQLスクリプトã¯æ¨™æº–出力ã«æ›¸ã出ã•ã‚Œã¾ã™ã€‚\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "\"pg_\"ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«åã¯ã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã—ãŸ(%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "ロール\"%s\"ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—ã«å¯¾ã—ã¦æ­£å½“ãªãƒ€ãƒ³ãƒ—é †åºãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "パラメータ\"%2$s\"ã®ACLリスト(%1$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "テーブル空間\"%2$s\"ã®ACLリスト(%1$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "データベース\"%s\"を除外ã—ã¾ã™"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "データベース\"%s\"をダンプã—ã¦ã„ã¾ã™"
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "データベース\"%s\"ã®ãƒ€ãƒ³ãƒ—ãŒå¤±æ•—ã—ã¾ã—ãŸã€çµ‚了ã—ã¾ã™"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "出力ファイル\"%s\"ã‚’å†ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "\"%s\"を実行ã—ã¦ã„ã¾ã™"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "%s を実行ã—ã¦ã„ã¾ã™"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbnameã¨-f/--fileã®ã©ã¡ã‚‰ã‹ä¸€æ–¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "オプション-d/--dbnameã¨-f/--fileã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "オプション-C/--createã¨-1/--single-transactionã¨ã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction ã¨è¤‡æ•°ã‚¸ãƒ§ãƒ–ã¯åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "アーカイブ形å¼\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“; \"c\"ã€\"d\"ã¾ãŸã¯\"t\"を指定ã—ã¦ãã ã•ã„"
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "リストア中ã«ç„¡è¦–ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼æ•°: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%sã¯pg_dumpã§ä½œæˆã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‹ã‚‰PostgreSQLデータベースをリストアã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FILE]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME 接続ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME 出力ファイルå(- ã§æ¨™æº–出力)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F, --format=c|d|t ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルã®å½¢å¼\n"
+" (自動的ã«è¨­å®šã•ã‚Œã‚‹ã¯ãšã§ã™ï¼‰\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list アーカイブã®TOCã®è¦ç´„を表示\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 冗長モード\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã€çµ‚了ã—ã¾ã™\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã€çµ‚了ã—ã¾ã™\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"リストア制御用ã®ã‚ªãƒ—ション:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only データã®ã¿ã‚’リストア。スキーマをリストアã—ã¾ã›ã‚“\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create 対象ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’作æˆ\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error エラー時ã«çµ‚了。デフォルトã¯ç¶™ç¶š\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME 指åã—ãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’リストア\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM リストア時ã«æŒ‡å®šã—ãŸæ•°ã®ä¸¦åˆ—ジョブを使用\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容ã«å¾“ã£ã¦ SELECT ã‚„\n"
+" 出力ã®ã‚½ãƒ¼ãƒˆã‚’è¡Œã„ã¾ã™\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã®ã‚ªãƒ–ジェクトã®ã¿ã‚’リストア\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã®ã‚ªãƒ–ジェクトã¯ãƒªã‚¹ãƒˆã‚¢ã—ãªã„\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) 指åã•ã‚ŒãŸé–¢æ•°ã‚’リストア\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only スキーマã®ã¿ã‚’リストア。データをリストアã—ã¾ã›ã‚“\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME トリガを無効ã«ã™ã‚‹ãŸã‚ã®ã‚¹ãƒ¼ãƒ‘ーユーザーã®åå‰\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME 指åã—ãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(テーブルã€ãƒ“ューãªã©)をリストア\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME 指åã—ãŸãƒˆãƒªã‚¬ã‚’リストア\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges アクセス権é™(grant/revoke)ã®å¾©å…ƒã‚’çœç•¥\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction å˜ä¸€ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¨ã—ã¦ãƒªã‚¹ãƒˆã‚¢\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security 行セキュリティを有効ã«ã—ã¾ã™\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments コメントをリストアã—ãªã„\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables 作æˆã§ããªã‹ã£ãŸãƒ†ãƒ¼ãƒƒãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã¯ãƒªã‚¹ãƒˆã‚¢\n"
+" ã—ã¾ã›ã‚“\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications パブリケーションをリストアã—ãªã„\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels セキュリティラベルをリストアã—ã¾ã›ã‚“\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions サブスクリプションをリストアã—ãªã„\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method テーブルアクセスメソッドをリストアã—ãªã„\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces テーブル空間ã®å‰²ã‚Šå½“ã¦ã‚’リストアã—ã¾ã›ã‚“\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION 指定ã•ã‚ŒãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ï¼ˆãƒ‡ãƒ¼ã‚¿å‰éƒ¨ã€ãƒ‡ãƒ¼ã‚¿ã€ãƒ‡ãƒ¼ã‚¿å¾Œéƒ¨ï¼‰ã‚’リストア\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME リストアã«å…ˆç«‹ã£ã¦ SET ROLE ã—ã¾ã™\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+" -I, -n, -N, -P, -t, -T ãŠã‚ˆã³ --section オプションã¯çµ„ã¿åˆã‚ã›ã¦è¤‡æ•°å›ž\n"
+"指定ã™ã‚‹ã“ã¨ã§è¤‡æ•°ã®ã‚ªãƒ–ジェクトを指定ã§ãã¾ã™ã€‚\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"入力ファイルåãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€æ¨™æº–入力ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+"\n"
diff --git a/src/bin/pg_dump/po/ka.po b/src/bin/pg_dump/po/ka.po
new file mode 100644
index 0000000..6764bd3
--- /dev/null
+++ b/src/bin/pg_dump/po/ka.po
@@ -0,0 +1,2833 @@
+# Georgian message translation file for pg_dump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-24 08:51+0000\n"
+"PO-Revision-Date: 2023-08-24 11:23+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒ’იერ მáƒáƒ¬áƒáƒ“ებული სტრიქáƒáƒœáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ს მნიშვნელáƒáƒ‘რსჭირდებáƒ"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "შემუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ის ნიშვნელáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რ\"%s\" ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” áƒáƒ  მიეთითებáƒ"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” %d-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡ (ნáƒáƒ’ულისხებირ%d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  მიეთითებáƒ"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" long-distance რეჟიმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ბრძáƒáƒœáƒ”ბრგáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•áƒ”"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების წáƒáƒ™áƒ˜áƒ—ხვáƒ"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის ნáƒáƒ›áƒ áƒ”ბის იდენტიფიკáƒáƒªáƒ˜áƒ"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "სქემების კითხვáƒ"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ცხრილების კითხვáƒ"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ფუნქციების კითხვáƒ"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტიპების კითხვáƒ"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "პრáƒáƒªáƒ”დურული ენების კითხვáƒ"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციების კითხვáƒ"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის კითხვáƒ"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების კითხვáƒ"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ”ბის კითხვáƒ"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის კითხვáƒ"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლების კითხვáƒ"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის კითხვáƒ"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის ლექსიკáƒáƒœáƒ”ბის კითხვáƒ"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბის კითხვáƒ"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ”ბის კითხვáƒ"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული გáƒáƒ áƒ” სერვერების კითხვáƒ"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "ნáƒáƒ’ულისხმევი წვდáƒáƒ›áƒ”ბის კითხვáƒ"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒšáƒáƒªáƒ˜áƒ”ბის კითხვáƒ"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის კითხვáƒ"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "ტიპის კáƒáƒ¡áƒ¢áƒ”ბის კითხვáƒ"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ”ბის კითხვáƒ"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "ცხრილების მეკვიდრეáƒáƒ‘ითáƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ კითხვáƒ"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "მáƒáƒ•áƒšáƒ”ნების ტრიგერების კითხვáƒ"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის ცხრილების მáƒáƒ«áƒ”ბნáƒ"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "მემკვიდრეáƒáƒ‘ითი ურთიერთáƒáƒ‘ების მáƒáƒ«áƒ”ბნáƒ"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "სáƒáƒ˜áƒœáƒ¢áƒ”რესრცხრილების სვეტების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ კითხვáƒ"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "ქვეცხრილებში მემკვიდრეáƒáƒ‘ით სვეტებზე áƒáƒšáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ›áƒ"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის მáƒáƒœáƒáƒªáƒ”მების კითხვáƒ"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "ინდექსების კითხვáƒ"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილებში ინდექსებზე áƒáƒšáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ›áƒ"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ კითხვáƒ"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "შეზღუდვების კითხვáƒ"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "ტრიგერების კითხვáƒ"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "გáƒáƒ“áƒáƒ¬áƒ”რის წესების კითხვáƒ"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "წესების კითხვáƒ"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მების კითხვáƒ"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "ცხრილების გáƒáƒ›áƒáƒªáƒ”მის წევრáƒáƒ‘ის კითხვáƒ"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "სქემების გáƒáƒ›áƒáƒªáƒ”მის წევრáƒáƒ‘ის კითხვáƒ"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების კითხვáƒ"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. ცხრილის (\"%2$s\", OID %3$u) მშáƒáƒ‘ელი OID (%1$u) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "მშáƒáƒ‘ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რ%d ცხრილისთვის \"%s\""
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "რიცხვითი მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ \"%s\" დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: მეტისმეტáƒáƒ“ ბევრი რიცხვი"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "რიცხვითი მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ \"%s\" დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: რიცხვში áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ¡ სიმბáƒáƒšáƒáƒ”ბიáƒ"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–ებრვერ მáƒáƒ®áƒ”რხდáƒ: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების შეკუმშვრშეუძლებელიáƒ: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒœáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "შეკუმშვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "lz4-ით შეკუმშვის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "დეკáƒáƒ›áƒžáƒ áƒ”სიის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის (%s) დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "დáƒáƒ£áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი რეჟიმი \"%s\""
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() -ის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "სáƒáƒ™áƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ áƒáƒ áƒ®áƒ”ბის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შექმნრშეუძლებელიáƒ: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "თáƒáƒ•áƒ¡áƒáƒ áƒ—იდáƒáƒœ მიღებული ბრძáƒáƒœáƒ”ბრუცნáƒáƒ‘იáƒ: %s"
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სისგáƒáƒœ მიღებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეტყáƒáƒ‘ინებáƒ: %s"
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"ურთიერთáƒáƒ‘ის (\"%s\") დáƒáƒ‘ლáƒáƒ™áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ\n"
+"ეს ჩვეულებრივ ნიშნáƒáƒ•áƒ¡, რáƒáƒ› ვინმემ მáƒáƒ˜áƒ—ხáƒáƒ•áƒ ACCESS EXCLUSIVE ბლáƒáƒ™áƒ˜ ცხრილზე მáƒáƒ¡ შემდეგ, რáƒáƒª pg_dump-ის მშáƒáƒ‘ელმრპრáƒáƒªáƒ”სმრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ACCESS SHARE ბლáƒáƒ™áƒ˜ ცხრილზე უკვე მიიღáƒ."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ პრáƒáƒªáƒ”სი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ მáƒáƒ™áƒ•áƒ“áƒ"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "სáƒáƒ™áƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ áƒáƒ áƒ®áƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: სáƒáƒ™áƒ”ტის შექმნის შეცდáƒáƒ›áƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: მიბმის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: მáƒáƒ¡áƒ›áƒ”ნის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() -ის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: მეáƒáƒ áƒ” სáƒáƒ™áƒ”ტის შექნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: სáƒáƒ™áƒ”ტთáƒáƒœ მიერთების შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: შეერთების დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების მიმდევრáƒáƒ‘რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "სექციის მáƒáƒ£áƒšáƒáƒ“ნელი კáƒáƒ“ი %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ› ფáƒáƒ áƒ›áƒáƒ¢áƒ–ე პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ–ე, რáƒáƒ›áƒ”ლიც 8.0 pg_dump-ით áƒáƒœ უფრრძველით შეიქმნáƒ, პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "შეკუმშული áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ (%s) áƒáƒ¦áƒ“გენრშეუძლებელიáƒ"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრáƒáƒ¦áƒ“გენისთვის"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ პირდáƒáƒžáƒ˜áƒ áƒ˜ შეერთებრ1.3 áƒáƒœ უფრრძველ áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "მხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრáƒáƒ¦áƒ“გენáƒ"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "მáƒáƒªáƒ˜áƒšáƒ”ბრ%s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "ვერ ვიპáƒáƒ•áƒ”, áƒáƒžáƒ”რáƒáƒªáƒ˜áƒáƒ¨áƒ˜ \"%s\" IF EXISTS სáƒáƒ“ უნდრჩáƒáƒ•áƒ¡áƒ•áƒ"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "იქმნებრ%s \"%s.%s\""
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "იქმნებრ%s \"%s\""
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "áƒáƒ®áƒáƒš ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრ\"%s\""
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბრ%s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბრცხრილისთვის \"%s.%s\""
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "შესრულებრ%s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%s-სთვის ტრიგერების გáƒáƒ›áƒáƒ áƒ—ვáƒ"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%s-სთვის ტრიგერების ჩáƒáƒ áƒ—ვáƒ"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "შიდრშეცდáƒáƒ›áƒ -- WriteData-ს DataDumper-ის ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ქსტის გáƒáƒ áƒ”თ ვერ გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ”ბთ"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "áƒáƒ áƒ©áƒ”ულ ფáƒáƒ áƒ›áƒáƒ¢áƒ¡ დიდი áƒáƒ‘იექტების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "áƒáƒ¦áƒ“გენილირ%d დიდი áƒáƒ‘იექტი"
+msgstr[1] "áƒáƒ¦áƒ“გენილირ%d დიდი áƒáƒ‘იექტი"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს დიდი áƒáƒ‘იექტის áƒáƒ¦áƒ“გენრOID-ით: %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "დიდი áƒáƒ‘იექტის (%u) შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "დიდი áƒáƒ‘იექტის (%u) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "\"TOC\" ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "ხáƒáƒ–ი იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "\"TOC\" ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "ჩáƒáƒ¬áƒ”რილირდიდი áƒáƒ‘იექტის მáƒáƒœáƒáƒªáƒ”მების %zu ბáƒáƒ˜áƒ¢áƒ˜ (შედეგი = %d)"
+msgstr[1] "ჩáƒáƒ¬áƒ”რილირდიდი áƒáƒ‘იექტის მáƒáƒœáƒáƒªáƒ”მების %zu ბáƒáƒ˜áƒ¢áƒ˜ (შედეგი = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "დიდი áƒáƒ‘იექტის ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "\"INITIALIZING\"-ის დრáƒáƒ¡:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "\"PROCESSING TOC\"-ის დრáƒáƒ¡:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "\"FINALIZING\"-ის დრáƒáƒ¡:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რიდáƒáƒœ %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "ცხრილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ dumpId-ი TABLE DATA ელემენტისთვის"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბის მáƒáƒ£áƒšáƒáƒ“ნელი áƒáƒšáƒáƒ›áƒ˜: %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒš ფáƒáƒ˜áƒšáƒ¨áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელირ: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" სწáƒáƒ  áƒáƒ áƒ¥áƒ˜áƒ•áƒ¡ áƒáƒ  ჰგáƒáƒ•áƒ¡ (\"toc.dat\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”რ(წáƒáƒ•áƒ˜áƒ™áƒ˜áƒ—ხე %lu, მáƒáƒ¡áƒáƒšáƒáƒ“ნელირ5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜, რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, áƒáƒ áƒ˜áƒ¡ ტექსტის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ˜áƒ. გთხáƒáƒ•áƒ— გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ სწáƒáƒ  áƒáƒ áƒ¥áƒ˜áƒ•áƒ¡ áƒáƒ  ჰგáƒáƒ•áƒ¡ (ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”áƒ)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ სწáƒáƒ  áƒáƒ áƒ¥áƒ˜áƒ•áƒ¡ áƒáƒ  ჰგáƒáƒ•áƒ¡"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "stdout-ის ბáƒáƒšáƒáƒ¨áƒ˜ მისáƒáƒ¬áƒ”რáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული ელემენტი %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შეცდáƒáƒ›áƒ: გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ კáƒáƒ“ი %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ელემენტის ID %d დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ -- შეიძლებრსáƒáƒ áƒ©áƒ”ვი დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "ცხრილების, áƒáƒ¦áƒ¬áƒ”რილი WITH OIDS -ით, áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "უცნáƒáƒ‘ი კáƒáƒ“ირებრ\"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი \"ENCODING\": %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი \"STDSTRINGS\": %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "სქემრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "ცხრილი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "ინდექსი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "ფუნქცირ%s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "ტრიგერი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "session_path-ის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "default_tablespace-ის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "default_table_access_method-ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "áƒáƒ  ვიცი, რáƒáƒ’áƒáƒ  დáƒáƒ•áƒáƒ§áƒ”ნრáƒáƒ‘იექტის მáƒáƒªáƒ”მული ტიპის (%s) მფლáƒáƒ‘ელი"
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•áƒ¡áƒáƒ áƒ—ში მáƒáƒ’იური სტრიქáƒáƒœáƒ˜ ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•áƒ¡áƒáƒ áƒ—ში áƒáƒ áƒ¡áƒ”ბული ვერსირ(%d.%d) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "მთელი რიცხვის ზáƒáƒ›áƒ˜áƒ¡ (%lu) სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜ შეიქმნრმáƒáƒœáƒ¥áƒáƒœáƒáƒ–ე, სáƒáƒ“áƒáƒª მთელი რიცხვი უფრრდიდიáƒ. ზáƒáƒ’იერთი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ შეიძლებრშეცდáƒáƒ›áƒ˜áƒ— დáƒáƒ¡áƒ áƒ£áƒšáƒ“ეს"
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (%d) გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ“ებრფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ’áƒáƒœ (%d)"
+
+#: pg_backup_archiver.c:3807
+#, 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:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "თáƒáƒ•áƒ¡áƒáƒ áƒ—ში áƒáƒ áƒ¡áƒ”ბული შექმნის დრრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "მუშáƒáƒ•áƒ“ებრელემენტი %d %s %s"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "მთáƒáƒ•áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "ელემენტის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრ%d %s %s"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "ელემენტის გáƒáƒ¨áƒ•áƒ”ბრ%d %s %s"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "მთáƒáƒ•áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "გáƒáƒ›áƒáƒ áƒ©áƒ”ნილი ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბრ%d %s %s"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "ცხრილის (%s) შექმნრშეუძლებელიáƒ. მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენრáƒáƒ  მáƒáƒ®áƒ“ებáƒ"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "დიდი áƒáƒ‘იექტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ OID"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის პრáƒáƒ‘ლემáƒ: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების ბლáƒáƒ™áƒ¡ (%d) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის მდებáƒáƒ áƒ”áƒáƒ‘რგáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ძებნისáƒáƒ¡ მáƒáƒœáƒáƒªáƒ”მების ბლáƒáƒ™áƒ˜áƒ¡ ტიპი (%d) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ¨áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡ ID-ის (%d) პáƒáƒ•áƒœáƒ შეუძლებელირ-- შეიძლებრდáƒáƒ£áƒšáƒáƒ’ებელი áƒáƒ¦áƒ“გენის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ›áƒ, რáƒáƒ›áƒ”ლიც áƒáƒ  შეიძლებრდáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ“ეს გáƒáƒ“áƒáƒ£áƒ®áƒ•áƒ”ვáƒáƒ“ი შეტáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒ"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ¨áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡ ID -ის (%d) პáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ -- შეიძლებრáƒáƒ áƒ¥áƒ˜áƒ•áƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების კითხვისáƒáƒ¡ ვიპáƒáƒ•áƒ” მáƒáƒ£áƒšáƒáƒ“ნელი ბლáƒáƒ™áƒ˜áƒ¡ ID (%d) -- მáƒáƒ•áƒ”ლáƒáƒ“ი: %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "უცნáƒáƒ‘ი მáƒáƒœáƒáƒªáƒ”მის ბლáƒáƒ™áƒ˜áƒ¡ ტიპი %d áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ áƒáƒ¦áƒ“გენისáƒáƒ¡"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ“გენის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბის თáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ შეტáƒáƒœáƒ˜áƒ“áƒáƒœ პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "გáƒáƒ“áƒáƒ£áƒ®áƒ•áƒ”ვáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის შეცდáƒáƒ›áƒ:%m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "შემკუმშველი áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpq-დáƒáƒœ server_version-ის მიღების შეცდáƒáƒ›áƒ"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ გáƒáƒ£áƒ¥áƒ›áƒ“რსერვერის ვერსიის შეუთáƒáƒ•áƒ¡áƒ”ბლáƒáƒ‘ის გáƒáƒ›áƒ"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "სერვერის ვერსიáƒ: %s; %s ვერსიáƒ: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრუკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "პáƒáƒ áƒáƒšáƒ˜: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთების შეცდáƒáƒ›áƒ"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "თáƒáƒ•áƒ˜áƒ“áƒáƒœ მიერთების შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შინáƒáƒáƒ áƒ¡áƒ˜: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ› %d მწკრივი დáƒáƒáƒ‘რუნáƒ, ერთის მáƒáƒ’იერ: %s"
+msgstr[1] "მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ› %d მწკრივი დáƒáƒáƒ‘რუნáƒ, ერთის მáƒáƒ’იერ: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sბრძáƒáƒœáƒ”ბრიყáƒ: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შესრულების შეცდáƒáƒ›áƒ"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "\"PQputCopyData\"-ის მიერ დáƒáƒ‘რუნებული შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "\"PQputCopyEnd\"-ის მიერ დáƒáƒ‘რუნებული შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY-ის შეცდáƒáƒ›áƒ ცხრილისთვის \"%s\": %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ›áƒáƒ¢áƒ”ბითი შედეგები COPY-ის დრáƒáƒ¡ ცხრილისთვის \"%s\""
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "ბáƒáƒ–ის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "ბáƒáƒ–ის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მის შეცდáƒáƒ›áƒ"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "დიდი áƒáƒ‘იექტის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ %s წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხáƒáƒ–ი დიდი áƒáƒ‘იექტის ცხრილის ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %s"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "დიდი áƒáƒ‘იექტის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "დიდი áƒáƒ‘იექტის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "'LO' მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "'LO'-ების სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "'LO'-ის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ¡ შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შესáƒáƒ§áƒ•áƒáƒœáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ¨áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•áƒœáƒ შეუძლებელიáƒ: %s"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "\"COPY áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი სინტáƒáƒ¥áƒ¡áƒ˜: %s"
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "დიდი áƒáƒ‘იექტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ OID: %u"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ რეáƒáƒšáƒ£áƒ áƒ˜ სიგრძე (%lld) áƒáƒ  ემთხვევრმáƒáƒ¡áƒáƒšáƒáƒ“ნელს (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ¨áƒ˜ თáƒáƒ•áƒ¡áƒáƒ áƒ—ი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "დáƒáƒ£áƒšáƒáƒ’ებელი მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რელირáƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ áƒáƒ› ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜: \"%s\" áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ, მáƒáƒ’რáƒáƒ› ის áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"-მდეáƒ."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•áƒ¡áƒáƒ áƒ—ი áƒáƒ áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ (%lu ბáƒáƒ˜áƒ¢áƒ˜)"
+msgstr[1] "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•áƒ¡áƒáƒ áƒ—ი áƒáƒ áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ (%lu ბáƒáƒ˜áƒ¢áƒ˜)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "%s-ში ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ დáƒáƒ–იáƒáƒœáƒ”ბული თáƒáƒ•áƒ¡áƒáƒ áƒ—ი (მáƒáƒ•áƒ”ლáƒáƒ“ი %d, გáƒáƒ›áƒáƒ—ვლილირ%d) ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ–იციáƒáƒ–ე %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "სექციის უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი: %s"
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely ტიპის სლáƒáƒ¢áƒ”ბი áƒáƒ¦áƒáƒ  დáƒáƒ áƒ©áƒ"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -s/--schema-only დრ-a/--data-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -s/--schema-only დრ--include-foreign-data ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი --include-foreign-data მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირპáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -c/--clean დრ-a/--data-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists -ს -c/--clean პáƒáƒ áƒáƒ›áƒ”ტრი ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "--on-conflict-do-nothing -ს --inserts, --rows-per-insert áƒáƒœ --column-inserts ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "შეკუმშვის უცხრáƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\""
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"-ი pg_dump-ის მიერ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მხáƒáƒšáƒáƒ“ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის რეჟიმშირმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "ბáƒáƒšáƒ ჩáƒáƒ¨áƒ”ნებული OID %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡, რáƒáƒ’áƒáƒ áƒª ტექსტურ ფáƒáƒ˜áƒšáƒ¡ áƒáƒœ სხვრფáƒáƒ áƒ›áƒáƒ¢áƒ”ბს.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (custom, directory, tar\n"
+" უბრáƒáƒšáƒ ტექსტი (ნáƒáƒ’ულისხმევი))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=მეთáƒáƒ“ი[:წვრილმáƒáƒœáƒ˜]\n"
+" შეკუმშვის მითითებáƒ\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT ცხრილის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ˜áƒ¡áƒáƒ¡ TIMEOUT ის შემდეგ შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ’დებáƒ\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync áƒáƒ  დáƒáƒ•áƒ”ლáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბენ გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ¡:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნებრმხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მები, სქემის გáƒáƒ áƒ”შე\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნებრდიდი áƒáƒ‘იექტებიც\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (იგივე, რáƒáƒª--large-objects, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•áƒ”ლებულიáƒ)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects დიდი áƒáƒ‘იექტები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (იგივე, რáƒáƒª --no-large-objects, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•áƒ”ლებულიáƒ)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean ბáƒáƒ–ის áƒáƒ‘იექტების წáƒáƒ¨áƒšáƒ თáƒáƒ•áƒ˜áƒ“áƒáƒœ შექმნáƒáƒ›áƒ“ე\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ¨áƒ˜ ბáƒáƒ–ის შექმნის ბრძáƒáƒœáƒ”ბების მიყáƒáƒšáƒ”ბáƒ\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN მხáƒáƒšáƒáƒ“ მითითებული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING მხáƒáƒšáƒáƒ“ მითითებული კáƒáƒ“ირების მქáƒáƒœáƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN მხáƒáƒšáƒáƒ“ მითითებული სქემების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN მითითებული სქემები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner უბრáƒáƒšáƒ ტექსტურ ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜ áƒáƒ‘იექტების მფლáƒáƒ‘ელáƒáƒ‘ის \n"
+" áƒáƒ¦áƒ“გენის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only áƒáƒ¦áƒ“გებრმხáƒáƒšáƒáƒ“ სქემები, მáƒáƒœáƒáƒªáƒ”მები კი áƒáƒ áƒ\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME უბრáƒáƒšáƒ ტექსტურ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=შáƒáƒ‘ლáƒáƒœáƒ˜ მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ›áƒžáƒ˜\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN მითითებული ცხრილები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges პრივილეგიები (dump/revoke) გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ გáƒáƒœáƒáƒ®áƒšáƒ”ბის პრáƒáƒ’რáƒáƒ›áƒ”ბის მიერ\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒžáƒ˜ ისე, რáƒáƒ’áƒáƒ áƒª ბრძáƒáƒœáƒ”ბრINSERT, სვეტების სáƒáƒ®áƒ”ლებით\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting დáƒáƒšáƒáƒ áƒ˜áƒ— ციტირების გáƒáƒ›áƒáƒ áƒ—ვáƒ. სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ SQL ციტირების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers მხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენისáƒáƒ¡ ტრიგერების გáƒáƒ›áƒáƒ áƒ—ვáƒ\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჩáƒáƒ áƒ—ვრ(მხáƒáƒšáƒáƒ“ იმ მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒžáƒ˜, \n"
+" რáƒáƒ–ეც მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს წვდáƒáƒ›áƒ გáƒáƒáƒ©áƒœáƒ˜áƒ)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=შáƒáƒ‘ლáƒáƒœáƒ˜ \n"
+" მითითებული ცხრილები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  იქნებáƒ,\n"
+" შვილი დრდáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების ჩáƒáƒ—ვლით\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " -T, --exclude-table=შáƒáƒ‘ლáƒáƒœáƒ˜ შáƒáƒ‘ლáƒáƒœáƒ˜áƒ— მითითებული ცხრილები\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=შáƒáƒ‘ლáƒáƒœáƒ˜ \n"
+" მითითებული ცხრილების მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  იქნებáƒ,\n"
+" შვილი დრდáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების ჩáƒáƒ—ვლით\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM extra_float_digits-ის ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists áƒáƒ‘იექტების გáƒáƒ“áƒáƒ§áƒ áƒ˜áƒ¡áƒáƒ¡ IF EXISTS -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=შáƒáƒ‘ლáƒáƒœáƒ˜\n"
+" მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒ¡áƒ›áƒ უცხრსერვერებზე მდებáƒáƒ áƒ” , უცხრცხრილებიდáƒáƒœ, რáƒáƒ›áƒšáƒ”ბიც\n"
+" შáƒáƒ‘ლáƒáƒœáƒ¡ ემთხვევáƒ\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒžáƒ˜ INSERT ბრძáƒáƒœáƒ”ბების მსგáƒáƒ•áƒ¡áƒáƒ“, COPY-ის მáƒáƒ’იერ\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის root ცხრილს გáƒáƒ•áƒšáƒ˜áƒ— ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბის გáƒáƒ áƒ”შე\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications გáƒáƒ›áƒáƒªáƒ”მების გáƒáƒ áƒ”შე\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდეების მინიჭებების გáƒáƒ áƒ”შე\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions გáƒáƒ›áƒáƒ¬áƒ”რების გáƒáƒ áƒ”შე\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ები\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces ცხრილის სივრცის მინიჭებები\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST-ის შეკუმშვის მეთáƒáƒ“ები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒ˜áƒ¬áƒ”რებáƒ\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data ის ცხრილები, რáƒáƒ›áƒšáƒ”ბსáƒáƒª ჟურნáƒáƒšáƒ˜ áƒáƒ  áƒáƒ¥áƒ•áƒ—, დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒ˜áƒ¬áƒ”რებáƒ\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERT ბრძáƒáƒœáƒ”ბებისთვის ON CONFLICT DO NOTHING -ის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers ყველრიდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ციტირებáƒ. მáƒáƒ¨áƒ˜áƒœáƒáƒª კი, თუ ისინი სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვები áƒáƒ áƒáƒ\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS მწკრივების რიცხვი თითáƒáƒ”ული INSERT-ისთვის ; áƒáƒ¡áƒ”ვე მიუთითებს --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=სექცირმითითებული სექცირ(pre-data, data, áƒáƒœ post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable მáƒáƒªáƒ“áƒ, სáƒáƒœáƒáƒ› დáƒáƒ›áƒžáƒ˜áƒ¡ გáƒáƒ¨áƒ•áƒ”ბრáƒáƒœáƒáƒ›áƒáƒšáƒ˜áƒ”ბის გáƒáƒ áƒ”შე იქნებრშესáƒáƒ«áƒšáƒ”ბელი\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT დáƒáƒ›áƒžáƒ˜áƒ¡áƒ—ვის მითითებული სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names მáƒáƒ—ხáƒáƒ•áƒœáƒ, რáƒáƒ› ცხრილი áƒáƒœ/დრსქემრშეიცáƒáƒ•áƒ“ეს შáƒáƒ‘ლáƒáƒœáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც\n"
+" ერთ ელემენტს მáƒáƒ˜áƒœáƒª ემთხვევáƒ\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=შáƒáƒ‘ლáƒáƒœáƒ˜ მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ›áƒžáƒ˜,\n"
+" შვილი დრდáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების ჩáƒáƒ—ვლით\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" მფლáƒáƒ‘ელáƒáƒ‘ის დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ ALTER OWNER ბრძáƒáƒœáƒ”ბების მáƒáƒ’იერ\n"
+" SET SESSION AUTHORIZATION -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•áƒ”ლთვის კითხვრ(áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ უნდრხდებáƒáƒ“ეს)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME áƒáƒ¦áƒ“გენáƒáƒ›áƒ“ე SET ROLE -ის გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მითითებული áƒáƒ áƒáƒ, მáƒáƒ¨áƒ˜áƒœ PGDATABASE გáƒáƒ áƒ”მáƒáƒ¡\n"
+"ცვლáƒáƒ“ი გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "კლიენტის მითითებული კáƒáƒ“ირებრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "სერვერის áƒáƒ› ვერსიáƒáƒ¨áƒ˜ უქმე სერვერებიდáƒáƒœ პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒžáƒ˜ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მითითებული ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემრშáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრშáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ უცხრსერვერი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ბáƒáƒ–ებს შáƒáƒ áƒ˜áƒ¡ ბმულები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "ცხრილის შემცველáƒáƒ‘ის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ: \"%s.%s\""
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "ცხრილის (\"%s\") დáƒáƒ›áƒžáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: PQgetCopyData() failed."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "შეცდáƒáƒ›áƒ სერვერიდáƒáƒœ: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "ბრძáƒáƒœáƒ”ბრიყáƒ: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "ცხრილის (\"%s\") დáƒáƒ›áƒžáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: PQgetResult() failed."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "ცხრილიდáƒáƒœ \"%s\" მიღებულირველების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "ბáƒáƒ–ის áƒáƒ¦áƒ¬áƒ”რის შენáƒáƒ®áƒ•áƒ"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "ენის უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "კáƒáƒ“ირების შენáƒáƒ®áƒ•áƒ = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "შენáƒáƒ®áƒ•áƒ: standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas() -ის შედეგის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "შენáƒáƒ®áƒ•áƒ: search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "დიდი áƒáƒ‘იექტების კითხვáƒ"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "დიდი áƒáƒ‘იექტების შენáƒáƒ®áƒ•áƒ"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "დიდი áƒáƒ‘იექტის (%u) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "მწკრივის დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესების წáƒáƒ™áƒ˜áƒ—ხვáƒ"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "წესების ბრძáƒáƒœáƒ”ბის მáƒáƒ£áƒšáƒáƒ“ნელი ტიპი: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒ¬áƒ”რილáƒ. მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ áƒáƒ"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s-სთვის მშáƒáƒ‘ელი გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრვერ ვიპáƒáƒ•áƒ” %s"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "სქემრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. მშáƒáƒ‘ელი ცხრილი OID-ით %u მიმდევრáƒáƒ‘იდáƒáƒœ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. pg_parttioned_table-ში მáƒáƒ®áƒ¡áƒ”ნიებული ცხრილი OID-ით %u ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "ცხრილის უცნáƒáƒ‘ი OID: %u"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ინდექსის მáƒáƒœáƒáƒªáƒ”მები ცხრილისთვის \"%s\""
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. მშáƒáƒ‘ელი ცხრილი OID-ით %u pg_rewrite-ის ელემენტიდáƒáƒœ OID-ით %u ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგირნულáƒáƒ•áƒáƒœáƒ˜ ბმის ცხრილის სáƒáƒ®áƒ”ლის უცხრგáƒáƒ¡áƒáƒ¦áƒ”ბის ტრიგერი \"%s\" ცხრილზე \"%s\" (ცხრილის OID: %u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "სვეტის მáƒáƒ£áƒšáƒáƒ“ნელი მáƒáƒœáƒáƒªáƒ”მები ცხრილისთვის %s"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "ცხრილში \"%s\" სვეტები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“áƒáƒ დáƒáƒœáƒáƒ›áƒ áƒ˜áƒšáƒ˜"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "ვეძებ ცხრილის ნáƒáƒ’ულისხმევ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "adnum -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ%d ცხრილისთვის \"%s\""
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "ვეძებ ცხრილის შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვებს"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "მáƒáƒ•áƒ”ლáƒáƒ“ი %d შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¡ ცხრილზე \"%s\", მáƒáƒ’რáƒáƒ› %d"
+msgstr[1] "მáƒáƒ•áƒ”ლáƒáƒ“ი %d შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¡ ცხრილზე \"%s\", მáƒáƒ’რáƒáƒ› %d"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "სისტემის კáƒáƒ¢áƒáƒšáƒáƒ’ი შეიძლებრდáƒáƒ–იáƒáƒœáƒ”ბულიáƒ."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "რáƒáƒšáƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "pg_init_privs -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპი %s-ის typetype თურმე áƒáƒ áƒáƒ¡áƒáƒ áƒ˜áƒ"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "უცნáƒáƒ‘ი provolatile მნიშვნელáƒáƒ‘რფუნქციისთვის \"%s\""
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "უცნáƒáƒ‘ი proparallel მნიშვნელáƒáƒ‘რფუნქციისთვის \"%s\""
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "ფუნქციის áƒáƒ¦áƒ¬áƒ”რრფუნქციისთვის OID-ით %u ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc áƒáƒœ pg_cast.castmethod ველების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ. ერთ-ერთი, trffromsql áƒáƒœ trftosql ნულს áƒáƒ  უნდრუდრიდეს"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ (áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ \"%s\")"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ OID-ით %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის (%2$s) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %1$c"
+
+#: pg_dump.c:13455
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\""
+
+#: pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "უცნáƒáƒ‘ი კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი '%c'"
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ (%s) aggfinalmodify -ის უცნáƒáƒ‘ი ტიპი"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ (%s) aggmfinalmodify -ის უცნáƒáƒ‘ი ტიპი"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "ნáƒáƒ’ულისხმევ პრივილეგიებში áƒáƒ áƒ¡áƒ”ბული áƒáƒ‘იექტის უცნáƒáƒ‘ი ტიპი: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "ნáƒáƒ’ულიხმები ACL სიის áƒáƒœáƒáƒšáƒ˜áƒ–ი შეუძლებელიáƒ: %s"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ACL სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ áƒáƒœ ნáƒáƒ’ულისხმევი (%s) áƒáƒ‘იექტისთვის \"%s\" (%s)"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "შეცდáƒáƒ›áƒ ACL სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბისáƒáƒ¡ áƒáƒœ ნáƒáƒ’ულისხმევი (%s) áƒáƒ‘იექტისთვის \"%s\" (%s)"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "ხედის (%s) áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒáƒ› მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "ხედის (%s) áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒáƒ› ერთზე მეტი áƒáƒ¦áƒ¬áƒ”რრდáƒáƒáƒ‘რუნáƒ"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "ხედის (%s) áƒáƒ¦áƒ¬áƒ”რáƒ, რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, ცáƒáƒ áƒ˜áƒ”ლირ(ნულáƒáƒ•áƒáƒœáƒ˜ სიგრძე)"
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS-ები უკვე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირ(ცხრილი \"%s\")"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "სვეტების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რიცხვი %d ცხრილისთვის %s"
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "ინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სვეტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "ინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "ინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡áƒ—ვის სვეტებისრდრმნიშვნელáƒáƒ‘ების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  ემთხვევáƒ"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "შეზღუდვáƒáƒ¡ ინდექსი áƒáƒ™áƒšáƒ˜áƒ: \"%s\""
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "შეზღუდვის უცნáƒáƒ‘ი ტიპი: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ›, რáƒáƒ›áƒ”ლსáƒáƒª მáƒáƒœáƒáƒªáƒ”მები მიმდევრáƒáƒ‘იდáƒáƒœ (%s) უნდრმიეღáƒ, %d მწკრივი დáƒáƒáƒ‘რუნáƒ. (მáƒáƒ•áƒ”ლáƒáƒ“ი: 1)"
+msgstr[1] "მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ›, რáƒáƒ›áƒ”ლსáƒáƒª მáƒáƒœáƒáƒªáƒ”მები მიმდევრáƒáƒ‘იდáƒáƒœ (%s) უნდრმიეღáƒ, %d მწკრივი დáƒáƒáƒ‘რუნáƒ. (მáƒáƒ•áƒ”ლáƒáƒ“ი: 1)"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "მიმდევრáƒáƒ‘ის უცნáƒáƒ‘ი ტიპი: %s"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "tgtype -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტის სტრიქáƒáƒœáƒ˜ (%s) ტრიგერისთვის \"%s\" ცხრილზე \"%s\""
+
+#: pg_dump.c:17655
+#, 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:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "მიბმული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ(%u) ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბისრდრპირáƒáƒ‘ების რáƒáƒáƒ“ენáƒáƒ‘რგáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბისთვის áƒáƒ  ემთხვევáƒ"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულების მáƒáƒœáƒáƒªáƒ”მების კითხვáƒ"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "მიბმáƒáƒ“ი áƒáƒ‘იექტის გáƒáƒ áƒ”შე %u %u"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "მიბმული áƒáƒ‘იექტის გáƒáƒ áƒ”შე %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებრ%d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების მáƒáƒ áƒ§áƒ£áƒŸáƒ”ბი ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_dump_sort.c:1276
+#, 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] "ცხრილები, რáƒáƒ›áƒšáƒ”ბშიც áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირწრიული გáƒáƒ áƒ”-გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები:"
+msgstr[1] "ცხრილები, რáƒáƒ›áƒšáƒ”ბშიც áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირწრიული გáƒáƒ áƒ”-გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "შეიძლებრდáƒáƒ›áƒžáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრ--disable-trigger-ების გáƒáƒ›áƒáƒ áƒ—ვის áƒáƒœ დრáƒáƒ”ბით შეზღუდვების გáƒáƒ“áƒáƒ§áƒ áƒ˜áƒ¡ გáƒáƒ áƒ”შე ვერ შეძლáƒáƒ—."
+
+#: pg_dump_sort.c:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "áƒáƒ› ელემენტებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ „%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი --exclude-database áƒáƒ  შეიძლებრ-g/--globals-only, -r/--roles-only, დრ-t/--tablespaces-only -სთáƒáƒœ ერთáƒáƒ“ იყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -g/--globals-only დრ-r/--roles-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -g/--globals-only დრ-t/--tablespaces-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -r/--roles-only დრ-t/--tablespaces-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრვერ მáƒáƒ®áƒ”რხდრ\"%s\""
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"ვერ დáƒáƒ£áƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ“რმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ებს \"postgres\" áƒáƒœ \"template1\"\n"
+"გთხáƒáƒ•áƒ— მიუთითáƒáƒ— áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒ."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s-ი PostgreSQL-ის ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რს SQL სკრიპტის ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean ბáƒáƒ–ის წáƒáƒ¨áƒšáƒ თáƒáƒ•áƒ˜áƒ“áƒáƒœ შექმნáƒáƒ›áƒ“ე\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only წáƒáƒ˜áƒ¨áƒšáƒ”ბრმხáƒáƒšáƒáƒ“ გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ‘იექტები დრáƒáƒ áƒ ბáƒáƒ–ები\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner áƒáƒ‘იექტების მფლáƒáƒ‘ელáƒáƒ‘ის áƒáƒ¦áƒ“გენის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡ მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს დრáƒáƒ áƒª ბáƒáƒ–ებს დრáƒáƒ áƒª ცხრილების სივრცეებს\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡ მხლáƒáƒ“ ცხრილების სივრცეებს დრáƒáƒ áƒª ბáƒáƒ–ებს დრáƒáƒ áƒª რáƒáƒšáƒ”ბს\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒáƒ•áƒ¡ ბáƒáƒ–ებს, რáƒáƒ›áƒšáƒ”ბიც PATTERN-ს ემთხვევáƒ\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords რáƒáƒšáƒ”ბის პáƒáƒ áƒáƒšáƒ”ბი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒš áƒáƒ  იქნებáƒ\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ სტრიქáƒáƒœáƒ˜\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ ბáƒáƒ–ის სáƒáƒ®áƒ”ლი)\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ -f/--file áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, SQL სკრიპტი \n"
+"სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ–ე იქნებრგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლიც \"pg_\"-ით იწყებáƒ, გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბულირ(%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "სწáƒáƒ áƒ˜ დáƒáƒ›áƒžáƒ˜áƒ¡ მიმდევრáƒáƒ‘რწევრáƒáƒ‘ისთვის რáƒáƒšáƒ¨áƒ˜ \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "ვერ გáƒáƒáƒœáƒáƒšáƒ˜áƒ–დრACL სირ(%s) პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\""
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "შეცდáƒáƒ›áƒ ACL-ის სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბისთვის ცხრილის სივრცისთვის \"%s\""
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "გáƒáƒ›áƒáƒ˜áƒ áƒ˜áƒªáƒ®áƒ ბáƒáƒ–რ\"%s\""
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "დáƒáƒ›áƒžáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ ბáƒáƒ–ისთვის \"%s\""
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump -ის შეცდáƒáƒ›áƒ ბáƒáƒ–áƒáƒ–ე \"%s\". დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "%s -ის გáƒáƒ¨áƒ•áƒ”ბáƒ"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "სერვერის ვერსიის მღების შეცდáƒáƒ›áƒ"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "შერვერის ვერსიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "%s -ის შესრულებáƒ"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbname დáƒ-f/--file -დáƒáƒœ მხáƒáƒšáƒáƒ“ ერთ-ერთის მითითებრშეგიძლიáƒáƒ—"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "-d/--dbname დáƒ-f/--file ერთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "-C/--create დრ-1/--single-transaction ერთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction -ის მითითებრბევრ დáƒáƒ•áƒáƒšáƒ”ბáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ შეუძლებელიáƒ"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ უცნáƒáƒ‘ი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%s\"; გთხáƒáƒ•áƒ— მიუთითáƒáƒ— \"გ\", \"დ\", áƒáƒœ \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ იგნáƒáƒ áƒ˜áƒ áƒ”ბული შეცდáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s áƒáƒ¦áƒáƒ“გენს PostgreSQL მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡ pg_dump მიერ შექმნილი áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ფáƒáƒ˜áƒšáƒ˜]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი(stdout-ზე გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"-\")\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ უნდრიყáƒáƒ¡)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ¡ სáƒáƒ áƒ©áƒ”ვის მიმáƒáƒ®áƒ˜áƒšáƒ•áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბენ გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ¡:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only áƒáƒ¦áƒ“გებრმხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მები, სქემის გáƒáƒ áƒ”შე\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–ის შექმნáƒ\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error დáƒáƒ£áƒ§áƒáƒ•áƒœáƒ”ბლივი გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ინდექსის áƒáƒ¦áƒ“გენáƒ\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM áƒáƒ¦áƒ“გენისáƒáƒ¡ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¡áƒáƒ áƒ©áƒ”ვáƒáƒ“/დáƒáƒ¡áƒáƒšáƒáƒ’ებლáƒáƒ“ მითითებული\n"
+" ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემცველáƒáƒ‘ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME მხáƒáƒšáƒáƒ“ მითითებული სქემის áƒáƒ‘იექტების áƒáƒ¦áƒ“გენáƒ\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=სáƒáƒ®áƒ”ლი მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” სქემáƒáƒ¨áƒ˜ áƒáƒ‘იექტები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=სáƒáƒ®áƒ”ლი(áƒáƒ áƒ’ები) მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ფუნქციის áƒáƒ¦áƒ“გენáƒ\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only áƒáƒ¦áƒ“გებრმხáƒáƒšáƒáƒ“ სქემები, მáƒáƒœáƒáƒªáƒ”მები კი áƒáƒ áƒ\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME ტრიგერების გáƒáƒ›áƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME მითითებული ურთიერთáƒáƒ‘ის áƒáƒ¦áƒ“გენრ(ცხრილი, ხედი, დრáƒ.შ.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME მითითებული ტრიგერის áƒáƒ¦áƒ“გენრ\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges წვდáƒáƒ›áƒ˜áƒ¡ პრივილეგიების áƒáƒ¦áƒ“გენის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრ(grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction áƒáƒ¦áƒ“გენის ერთ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ“ გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჩáƒáƒ áƒ—ვáƒ\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბი áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables ცხრილების, რáƒáƒ›áƒšáƒ˜áƒ¡ შექმნრშეუძლებელიáƒ,\n"
+" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications გáƒáƒ›áƒáƒªáƒ”მები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდეები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions გáƒáƒ›áƒáƒ¬áƒ”რები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces ცხრილის სივრცის მინიჭებები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=სექცირმითითებული სექციის áƒáƒ¦áƒ“გენრ(pre-data, data, áƒáƒœ post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME áƒáƒ¦áƒ“გენáƒáƒ›áƒ“ე SET ROLE -ის გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"შესáƒáƒ«áƒšáƒ”ბელირპáƒáƒ áƒáƒ›áƒ”ტრების -I, -n, -N, -P, -t, -T, დრ--section ერთáƒáƒ“ დრმრáƒáƒ•áƒáƒšáƒ¯áƒ”რ მითითებáƒ, მრáƒáƒ•áƒáƒšáƒ˜\n"
+"áƒáƒ‘იექტის áƒáƒ›áƒáƒ¡áƒáƒ¦áƒ”ბáƒáƒ“.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრსტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ შეტáƒáƒœáƒ.\n"
+"\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#, c-format
+#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+#~ msgstr " -Z, --compress=0-9 შეკუმშვის დáƒáƒœáƒ”\n"
+
+#, c-format
+#~ msgid ""
+#~ " -Z, --compress=METHOD[:LEVEL]\n"
+#~ " compress as specified\n"
+#~ msgstr ""
+#~ " -Z, --compress=მეთáƒáƒ“ი[:დáƒáƒœáƒ”]\n"
+#~ " შეკუმშვის მითითებáƒ\n"
+
+#, c-format
+#~ msgid "cannot restore from compressed archive (compression not supported in this installation)"
+#~ msgstr "შეკუმშული áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ¦áƒ“გენრშეუძლებელირ(áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ შეკუმშვრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ)"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "could not close blob data file: %m"
+#~ msgstr "ბლáƒáƒ‘ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "could not close blobs TOC file: %m"
+#~ msgstr "ბლáƒáƒ‘ების შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "failed to LZ4 compress data: %s"
+#~ msgstr "'LZ4'-ით მáƒáƒœáƒáƒªáƒ”მების შეკუმშვრშეუძლებელიáƒ: %s"
+
+#, c-format
+#~ msgid "failed to end compression: %s"
+#~ msgstr "შეკუმშვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#, c-format
+#~ msgid "failed to end decompression: %s"
+#~ msgstr "გáƒáƒ¨áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#, c-format
+#~ msgid "invalid compression code: %d"
+#~ msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ი: %d"
+
+#, c-format
+#~ msgid "not built with zlib support"
+#~ msgstr "áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ’ებული zlib მხáƒáƒ áƒ“áƒáƒ­áƒ”რით"
+
+#, c-format
+#~ msgid "requested compression not available in this installation -- archive will be uncompressed"
+#~ msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ შეკუმშვრáƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ. -- áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜ შეუკუმშáƒáƒ•áƒ˜ იქნებáƒ"
diff --git a/src/bin/pg_dump/po/ko.po b/src/bin/pg_dump/po/ko.po
new file mode 100644
index 0000000..f38254e
--- /dev/null
+++ b/src/bin/pg_dump/po/ko.po
@@ -0,0 +1,2924 @@
+# Korean message translation file for PostgreSQL pg_dump
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:51+0000\n"
+"PO-Revision-Date: 2023-09-08 16:10+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "ì´ í”„ë¡œê·¸ëž¨ì€ %s 압축 ë¯¸ì§€ì› ìƒíƒœë¡œ 빌드 ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "압축 ì˜µì…˜ì„ ì§€ì •í•´ì•¼í•  ê³³ì— ë¹ˆ 문ìžì—´ì„ 지정했습니다"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "알 수 없는 압축 옵션: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "\"%s\" 압축 ì˜µì…˜ì€ ê°’ì„ í•„ìš”ë¡œ 합니다"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "\"%s\" 압축 ì˜µì…˜ì˜ ê°’ì€ ì •ìˆ˜í˜•ì´ì–´ì•¼ 합니다."
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "\"%s\" 압축 ì˜µì…˜ì˜ ê°’ì€ ë¶€ìš¸ë¦°í˜•ì´ì–´ì•¼ 합니다."
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• ìˆ˜ì¤€ì„ ì§€ì •í•  수 없습니다"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• 수준으로 %d부터 %d까지만 허용합니다(기본값: %d)."
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì„ ì‚¬ìš©í•  때는 ìž‘ì—…ìž ìˆ˜ë¥¼ 지정할 수 없습니다"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "\"%s\" 압축 ì•Œê³ ë¦¬ì¦˜ì€ ì›ê±°ë¦¬ 모드를 지ì›í•˜ì§€ 않습니다"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행 í•  \"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (내부 오류)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "해당 명령어 ì—†ìŒ"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 종료 코드 %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X 예외처리로 하위 프로세스가 종료ë˜ì—ˆìŒ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, ì‹œê·¸ë„ %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 알수 없는 ìƒíƒœ %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" ê°’ì€ %s 옵션 값으로 유효하지 ì•ŠìŒ"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다."
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "확장 기능 ì½ëŠ” 중"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "확장 멤버를 ì‹ë³„ 중"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "ìŠ¤í‚¤ë§ˆë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í•¨ìˆ˜ë“¤ ì½ëŠ” 중"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ìžë£Œí˜•ì„ ì½ëŠ” 중"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "프로시쥬얼 언어를 ì½ëŠ” 중"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì§‘ê³„ 함수를 ì½ëŠ” 중"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìžë¥¼ ì½ëŠ” 중"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì ‘ê·¼ ë°©ë²•ì„ ì½ëŠ” 중"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ ì½ëŠ” 중"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìž ë¶€ë¥˜ë“¤ ì½ëŠ” 중"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 파서를 ì½ëŠ” 중"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 í…œí”Œë¦¿ì„ ì½ëŠ” 중"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 ì‚¬ì „ì„ ì½ëŠ” 중"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 êµ¬ì„±ì„ ì½ëŠ” 중"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì™¸ë¶€ ë°ì´í„° 래í¼ë¥¼ ì½ëŠ” 중"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì™¸ë¶€ 서버를 ì½ëŠ” 중"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "기본 ì ‘ê·¼ 권한 ì½ëŠ” 중"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ê¸€ìž ì •ë ¬(collation) ì½ëŠ” 중"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì¸ì½”딩 ë³€í™˜ê·œì¹™ì„ ì½ëŠ” 중"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "형변환ìž(type cast)ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "변환ìž(transform) ì½ëŠ” 중"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "í…Œì´ë¸” ìƒì† 정보를 ì½ëŠ” 중"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "ì´ë²¤íŠ¸ íŠ¸ë¦¬ê±°ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "확장 í…Œì´ë¸”ì„ ì°¾ëŠ” 중"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "ìƒì† 관계를 조사중"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "재미난 í…Œì´ë¸”들(interesting tables)ì„ ìœ„í•´ ì—´ 정보를 ì½ëŠ” 중"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "하위 í…Œì´ë¸”ì—ì„œ ìƒì†ëœ ì—´ 구분중"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "파티션 ìžë£Œ ì½ëŠ” 중"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "ì¸ë±ìŠ¤ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "하위 파티션 í…Œì´ë¸”ì—ì„œ ì¸ë±ìŠ¤ë¥¼ 플래그 처리하는 중"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "확장 í†µê³„ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "제약 ì¡°ê±´ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "íŠ¸ë¦¬ê±°ë“¤ì„ ì½ëŠ” 중"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "룰(rule) ì½ëŠ” 중"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "ì •ì±… ì½ëŠ” 중"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "발행 정보를 ì½ëŠ” 중"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "í…Œì´ë¸”ì˜ ë°œí–‰ ë§µë²„ì‰½ì„ ì½ëŠ” 중"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "ìŠ¤í‚¤ë§ˆì˜ ë°œí–‰ ë§µë²„ì‰½ì„ ì½ì„ 중"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "구ë…정보를 ì½ëŠ” 중"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "안전 검사 실패, OID %uì¸ ë¶€ëª¨ 개체가 ì—†ìŒ. 해당 í…Œì´ë¸” \"%s\" (OID %u)"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "ìž˜ëª»ëœ ë¶€ëª¨ 수: %d, 해당 í…Œì´ë¸” \"%s\""
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "\"%s\" ìˆ«ìž ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ: 너무 ë§Žì€ ìˆ«ìžë“¤ì´ 있ìŒ"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "\"%s\" ìˆ«ìž ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ: 숫ìžì•ˆì— ì´ìƒí•œ 글ìžê°€ 있ìŒ"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "압축 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화 í•  수 ì—†ìŒ: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "압축 ìŠ¤íŠ¸ë¦¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "ìžë£Œë¥¼ 압축할 수 ì—†ìŒ: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "ìžë£Œ ì••ì¶•ì„ í’€ 수 없습니다: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "압축 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ ë‹«ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: íŒŒì¼ ë"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "LZ4 압축 í•´ì œ 컨í…스트를 만들 수 ì—†ìŒ: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "압축 풀기 실패: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "LZ4 압축 í•´ì œ 컨í…스트 반환 실패: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "압축 ë내기 실패: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "LZ4 압축 초기화 í•  수 ì—†ìŒ: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "압축 풀기 ìž‘ì—… ë내기 실패: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "\"%s\" 압축 매개 변수를 지정할 수 ì—†ìŒ: %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "압축 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화 í•  수 ì—†ìŒ"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "ìžë£Œë¥¼ 압축 í•´ì œ í•  수 ì—†ìŒ: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "\"%s\" 모드는 처리할 수 ì—†ìŒ"
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() 실패: 오류 코드 %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "통신 ì²´ë„ì„ ë§Œë“¤ 수 ì—†ìŒ: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ë¥¼ 만들 수 ì—†ìŒ: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "리ë”로부터 ì•Œ 수 없는 ëª…ë ¹ì„ ìˆ˜ì‹ í•¨: \"%s\""
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ìž‘ì—… 프로세스로부터 ìž˜ëª»ëœ ë©”ì‹œì§€ë¥¼ ë°›ìŒ: \"%s\""
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the "
+"table after the pg_dump parent process had gotten the initial ACCESS SHARE "
+"lock on the table."
+msgstr ""
+"\"%s\" 릴레ì´ì…˜ì„ ì„ ì í•  수 ì—†ìŒ\n"
+"ì´ ìƒí™©ì€ ì¼ë°˜ì ìœ¼ë¡œ 다른 세션ì—ì„œ 해당 í…Œì´ë¸”ì„ ì´ë¯¸ ë¤í”„하고 있거나 기타 다"
+"른 ì´ìœ ë¡œ 다른 ì„¸ì…˜ì— ì˜í•´ì„œ ì„ ì  ëœ ê²½ìš°ìž…ë‹ˆë‹¤."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "ìž‘ì—… 프로세스가 예ìƒì¹˜ 않게 종료ë¨"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "통신 ì²´ë„ì—ì— ì“¸ 수 ì—†ìŒ: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: ë°”ì¸ë”© í•  수 ì—†ìŒ: 오류 코드 %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: 리슨 í•  수 ì—†ìŒ: 오류 코드 %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() 실패: 오류 코드 %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: ë‘번째 ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: 소켓 ì ‘ì† ì‹¤íŒ¨: 오류 코드 %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: ì ‘ì†ì„ 승ì¸í•  수 ì—†ìŒ: 오류 코드 %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "출력 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "ì•„ì¹´ì´ë¸Œ ì•„ì´í…œì˜ 순서가 섹션ì—ì„œ 비정ìƒì ìž„"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "예ìƒì¹˜ 못한 섹션 코드 %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "ì´ ì•„ì¹´ì´ë¸Œ íŒŒì¼ í˜•ì‹ì—서는 병렬 ë³µì›ì´ 지ì›ë˜ì§€ ì•ŠìŒ"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "8.0 ì´ì „ pg_dumpë¡œ 만든 ì•„ì¹´ì´ë¸Œì—서는 병렬 ë³µì›ì´ 지ì›ë˜ì§€ ì•ŠìŒ"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "ì••ì¶•ëœ ì•„ì¹´ì´ë¸Œ (%s) ì—ì„œ ë³µì›í•  수 ì—†ìŒ"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "ë³µì› ìž‘ì—…ì„ ìœ„í•´ ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† ì¤‘"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "pre-1.3 archiveì—ì„œ ì§í†µ ë°ì´í„°ë² ì´ìŠ¤ ì ‘ì†ì€ 지ì›ë˜ì§€ ì•ŠìŒ"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "암묵ì ìœ¼ë¡œ ìžë£Œë§Œ ë³µì›"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "%s %s 삭제 중"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "\"%s\" 구문ì—ì„œ insert IF EXISTS ë¶€ë¶„ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "ì›ë³¸ ë¤í”„ 파ì¼ì—ì„œ ë°œìƒí•œ 경고: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "%s \"%s.%s\" 만드는 중"
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "%s \"%s\" 만드는 중"
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "\"%s\" 새 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†ì¤‘"
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "%s 처리 중"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "\"%s.%s\" í…Œì´ë¸”ì˜ ìžë£Œë¥¼ 처리 중"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "실행중: %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%s 트리거 ìž‘ë™ì„ 비활성화 하는 중"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%s 트리거 ìž‘ë™ì„ 활성화 하는 중"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid ""
+"internal error -- WriteData cannot be called outside the context of a "
+"DataDumper routine"
+msgstr "내부 오류 -- WriteData는 DataDumper 루틴 ì˜ì—­ ë°–ì—ì„œ 호출 ë  ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "ì„ íƒí•œ íŒŒì¼ ì–‘ì‹ìœ¼ë¡œëŠ” large-object를 ë¤í”„í•  수 ì—†ìŒ"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%dê°œì˜ í° ê°œì²´ê°€ ë³µì›ë¨"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "%u OID large object를 ë³µì›ì¤‘"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "%u large object를 만들 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "%u large object를 ì—´ 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "TOC íŒŒì¼ \"%s\"ì„(를) ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "줄 무시ë¨: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "%d IDì— ëŒ€í•œ í•­ëª©ì„ ì°¾ì§€ 못했ìŒ"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "TOC 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "\"%s\" 출력 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "출력 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "%zu ë°”ì´íŠ¸ì˜ í° ê°ì²´ ë°ì´í„°ë¥¼ 씀(ê²°ê³¼ = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "í° ê°ì²´ë¥¼ 쓸 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "초기화 작업 중:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "TOC 처리하는 중:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "뒷 마무리 작업 중:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "%d TOC 항목ì—ì„œ; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "ìž˜ëª»ëœ dumpID"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA ì•„ì´í…œì— 대한 ìž˜ëª»ëœ í…Œì´ë¸” dumpId"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "예ìƒì¹˜ 못한 ìžë£Œ 옵셋 플래그 %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "ë¤í”„ 파ì¼ì—ì„œ íŒŒì¼ ì˜µì…‹ ê°’ì´ ë„ˆë¬´ í½ë‹ˆë‹¤"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "디렉터리 ì´ë¦„ì´ ë„ˆë¬´ 긺: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid ""
+"directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not "
+"exist)"
+msgstr "\"%s\" 디렉터리가 ì•Œë§žì€ ì•„ì¹´ì´ë¸Œìš©ì´ 아님 (\"toc.dat\" 파ì¼ì´ ì—†ìŒ)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "\"%s\" ìž…ë ¥ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "ìž…ë ¥ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "ìž…ë ¥ 파ì¼ì´ 너무 짧습니다 (%lu ì½ì—ˆìŒ, 예ìƒì¹˜ 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "ìž…ë ¥ 파ì¼ì€ ì¼ë°˜ í…스트 ë¤í”„ 파ì¼ìž…니다. psql ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "ìž…ë ¥ 파ì¼ì—ì„œ 타당한 ì•„ì¹´ì´ë¸Œë¥¼ ì°¾ì„ ìˆ˜ 없습니다(너무 짧ì€ì§€?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "ìž…ë ¥ 파ì¼ì—ì„œ 타당한 ì•„ì¹´ì´ë¸Œë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "ìž…ë ¥ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "추가용 표준출력 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "ì•Œ 수 없는 íŒŒì¼ í¬ë©§: \"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "%d %s %s 항목 마침"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ 실패: 종료 코드 %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "%d ID í•­ëª©ì€ ë²”ìœ„ë¥¼ ë²—ì–´ë‚¬ìŒ -- TOC ì •ë³´ê°€ ì†ìƒëœ 듯 합니다"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "WITH OIDS ì˜µì…˜ì´ ìžˆëŠ” í…Œì´ë¸”ì˜ ë³µì›ì€ ì´ì œ 지ì›í•˜ì§€ 않습니다"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "ì•Œ 수 없는 ì¸ì½”딩: \"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "ìž˜ëª»ëœ ENCODING 항목: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "ìž˜ëª»ëœ STDSTRINGS 항목: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "\"%s\" 스키마를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "\"%s\" í…Œì´ë¸”ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "\"%s\" ì¸ë±ìŠ¤ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "\"%s\" 함수를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "\"%s\" 트리거를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "\"%s\" 사용ìžë¡œ 세션 사용ìžë¥¼ 지정할 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "search_path를 \"%s\"(으)ë¡œ 지정할 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "default_tablespaceë¡œ %s(으)ë¡œ 지정할 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "default_table_access_method를 지정할 수 ì—†ìŒ: %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "\"%s\" ê°œì²´ì˜ ì†Œìœ ì£¼ë¥¼ 지정할 수 없습니다"
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "íŒŒì¼ í—¤ë”ì—ì„œ ë§¤ì§ ë¬¸ìžì—´ì„ 찾지 못했습니다"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "íŒŒì¼ í—¤ë”ì— ìžˆëŠ” %d.%d ë²„ì „ì€ ì§€ì›ë˜ì§€ 않습니다"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "정수 í¬ê¸° (%lu) 안전성 검사 실패"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid ""
+"archive was made on a machine with larger integers, some operations might "
+"fail"
+msgstr ""
+"ì´ ì•„ì¹´ì´ë¸ŒëŠ” í° ì •ìˆ˜ë¥¼ 지ì›í•˜ëŠ” 시스템ì—ì„œ 만들어졌습니다. 그래서 몇 ë™ìž‘ì´ "
+"실패할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤."
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "예ìƒë˜ëŠ” í¬ë©§ (%d)와 ë°œê²¬ëœ íŒŒì¼ í¬ë©§ (%d)ì´ ì„œë¡œ 다름"
+
+#: pg_backup_archiver.c:3807
+#, 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:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "í—¤ë”ì— ìž˜ëª»ëœ ìƒì„± 날짜가 있ìŒ"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "%d %s %s í•­ëª©ì„ ì²˜ë¦¬í•˜ëŠ” 중"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "기본 병렬 루프로 시작 중"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "%d %s %s í•­ëª©ì„ ê±´ë„ˆë›°ëŠ” 중"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "%d %s %s í•­ëª©ì„ ì‹œìž‘í•˜ëŠ” 중"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "기본 병렬 루프 마침"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "누ë½ëœ %d %s %s 항목 처리 중"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "\"%s\" í…Œì´ë¸”ì„ ë§Œë“¤ 수 없어, 해당 ìžë£ŒëŠ” ë³µì›ë˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤."
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ìž˜ëª»ëœ large objectìš© OID"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "íŒŒì¼ seek 작업하는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "%d ìžë£Œ 블ë¡ì— ìž˜ëª»ëœ ì ‘ê·¼ 위치가 있ìŒ"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "ì•„ì¹´ì´ë¸Œ 검색하는 ë™ì•ˆ ì•Œ 수 없는 ìžë£Œ 블럭 형태(%d)를 발견함"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid ""
+"could not find block ID %d in archive -- possibly due to out-of-order "
+"restore request, which cannot be handled due to non-seekable input file"
+msgstr ""
+"ì•„ì¹´ì´ë¸Œì—ì„œ ë¸”ë¡ ID %dì„(를) 찾지 못했습니다. ë³µì› ìš”ì²­ì´ ìž˜ëª»ëœ ê²ƒ 같습니"
+"다. ìž…ë ¥ 파ì¼ì„ 검색할 수 없으므로 ìš”ì²­ì„ ì²˜ë¦¬í•  수 없습니다."
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr ""
+"ì•„ì¹´ì´ë¸Œì—ì„œ ë¸”ë¡ ID %dì„(를) ì°¾ì„ ìˆ˜ 없습니다. ì•„ì¹´ì´ë¸Œê°€ ì†ìƒëœ 것 같습니"
+"다."
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "ìžë£Œë¥¼ ì½ëŠ” ë™ì•ˆ 예ìƒì¹˜ 못한 ID (%d) ë°œê²¬ë¨ -- 예ìƒê°’ %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "ì•„ì¹´ì´ë¸Œ ë³µì›í•˜ëŠ” 중ì—, ì•Œ 수 없는 ìžë£Œ 블럭 형태 %d 를 발견함"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "ì•„ì¹´ì´ë¸Œ 파ì¼ì—ì„œ 검색 위치를 확ì¸í•  수 ì—†ìŒ: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "ìž…ë ¥ ì•„ì¹´ì´ë¸Œë§Œ 다시 ì—´ 수 있ìŒ"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "표준 ìž…ë ¥ì„ ì´ìš©í•œ 병렬 ë³µì› ìž‘ì—…ì€ ì§€ì›í•˜ì§€ 않습니다"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr ""
+"시작 위치를 ìž„ì˜ë¡œ 지정할 수 없는 파ì¼ë¡œëŠ” 병렬 ë³µì› ìž‘ì—…ì„ í•  수 없습니다."
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "ì•„ì¹´ì´ë¸Œ 파ì¼ì—ì„œ 검색 위치를 설정할 수 ì—†ìŒ: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "압축기 사용"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpqì—ì„œ server_verion ê°’ì„ êµ¬í•  수 ì—†ìŒ"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "서버 ë²„ì „ì´ ì¼ì¹˜í•˜ì§€ ì•Šì•„ 중단하는 중"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "서버 버전: %s; %s 버전: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ì— ì´ë¯¸ ì ‘ì†í•´ 있ìŒ"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "암호: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì ‘ì†ì„ í•  수 ì—†ìŒ"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "재연결 실패: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "쿼리 실패: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "사용한 쿼리: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "쿼리ì—ì„œ í•œ 개가 ì•„ë‹Œ %dê°œì˜ í–‰ì„ ë°˜í™˜: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sì‚¬ìš©ëœ ëª…ë ¹: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "쿼리를 실행 í•  수 ì—†ìŒ"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyDataì— ì˜í•´ì„œ 오류가 반환ë˜ì—ˆìŒ: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEndì— ì˜í•´ì„œ 오류가 반환ë˜ì—ˆìŒ: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "\"%s\" í…Œì´ë¸”ì„ ìœ„í•œ COPY 실패: %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "\"%s\" í…Œì´ë¸” COPY ìž‘ì—… 중 ìž˜ëª»ëœ ë¶€ê°€ 결과가 있ìŒ"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ íŠ¸ëžœìž­ì…˜ì„ ì‹œìž‘í•  수 ì—†ìŒ"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ íŠ¸ëžœìž­ì…˜ì„ commit í•  수 ì—†ìŒ"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "ìžë£Œê°€ ì €ìž¥ë  ë””ë ‰í„°ë¦¬ë¥¼ 지정하지 않았ìŒ"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "출력 파ì¼ì„ 쓸 수 ì—†ìŒ: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "\"%s\" ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "입력용 large object TOC 파ì¼(\"%s\")ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "large object TOC 파ì¼(\"%s\")ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: \"%s\""
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "large object TOC 파ì¼(\"%s\")ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "large object TOC 파ì¼(\"%s\")ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "LO ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "LO TOC 파ì¼ì— 쓸 수 ì—†ìŒ: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "LO TOC 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "íŒŒì¼ ì´ë¦„ì´ ë„ˆë¬´ 긺: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "ì´ íŒŒì¼ í˜•íƒœëŠ” ì½ì„ 수 ì—†ìŒ"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "출력용 TOC íŒŒì¼ \"%s\"ì„(를) ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "출력용 TOC 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "tar 출력 í¬ë©§ì—ì„œ 압축 ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ ì•ŠìŒ"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "입력용 TOC 파ì¼(\"%s\")ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "입력용 TOC 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "ì•„ì¹´ì´ë¸Œì—ì„œ \"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "ìž„ì‹œ íŒŒì¼ ì´ë¦„ì„ ì§“ì§€ 못했습니다: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "COPY 구문 오류: \"%s\""
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "ìž˜ëª»ëœ large object OID: %u"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "ìž„ì‹œ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "실재 íŒŒì¼ ê¸¸ì´(%lld)와 예ìƒë˜ëŠ” ê°’(%lld)ì´ ë‹¤ë¦…ë‹ˆë‹¤"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "tar ì•„ì¹´ì´ë¸Œì—ì„œ \"%s\" 파ì¼ì„ 위한 í—¤ë”를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid ""
+"restoring data out of order is not supported in this archive format: \"%s\" "
+"is required, but comes before \"%s\" in the archive file."
+msgstr ""
+"순서를 넘어서는 ìžë£Œ ë¤í”„ ìž‘ì—…ì€ ì´ ì•„ì¹´ì´ë¸Œ í¬ë©§ì—서는 지ì›í•˜ì§€ 않습니다: "
+"\"%s\" 요구ë˜ì—ˆì§€ë§Œ, ì´ ì•„ì¹´ì´ë¸Œ 파ì¼ì—서는 \"%s\" ì „ì— ì˜µë‹ˆë‹¤."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "불완전한 tar í—¤ë”ê°€ 있ìŒ(%lu ë°”ì´íŠ¸)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid ""
+"corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "%s ì•ˆì— ì†ìƒëœ tar í—¤ë” ë°œê²¬ (예ìƒì¹˜ %d, ê³„ì‚°ëœ ê°’ %d), íŒŒì¼ ìœ„ì¹˜ %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "ì•Œ 수 없는 섹션 ì´ë¦„: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely 슬롯 범위 벗어남"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ ì§€ì •í–ˆìŒ (시작: \"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "-s/--schema-only 옵션과 -a/--data-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_dump.c:699
+#, c-format
+msgid ""
+"options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr ""
+"-s/--schema-only 옵션과 --include-foreign-data ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "--include-foreign-data ì˜µì…˜ì€ ë³‘ë ¬ 백업 ìž‘ì—…ì—ì„œ 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "-c/--clean 옵션과 -a/--data-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists ì˜µì…˜ì€ -c/--clean 옵션과 함께 사용해야 함"
+
+#: pg_dump.c:715
+#, c-format
+msgid ""
+"option --on-conflict-do-nothing requires option --inserts, --rows-per-"
+"insert, or --column-inserts"
+msgstr ""
+"--on-conflict-do-nothing ì˜µì…˜ì€ --inserts, --rows-per-insert ë˜ëŠ” --column-"
+"inserts 옵션과 함께 사용해야 함"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "알 수 없는 압축 알고리즘: \"%s\""
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ìž˜ëª»ëœ ì••ì¶• 명세: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "\"%s\" 압축 ì˜µì…˜ì€ pg_dumpì—ì„œ 현재 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "병렬 ë°±ì—…ì€ ë””ë ‰í„°ë¦¬ 기반 ì¶œë ¥ì¼ ë•Œë§Œ 사용할 수 있습니다."
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "마지막 내장 OID는 %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "ì¡°ê±´ì— ë§žëŠ” 스키마가 없습니다"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "ì¡°ê±´ì— ë§žëŠ” í…Œì´ë¸”ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "ì¡°ê±´ì— ë§žëŠ” 확장 ëª¨ë“ˆì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ í…스트 íŒŒì¼ ë˜ëŠ” 기타\n"
+"다른 í˜•íƒœì˜ íŒŒì¼ë¡œ ë¤í”„합니다.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [옵션]... [DBì´ë¦„]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"ì¼ë°˜ 옵션들:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=파ì¼ì´ë¦„ 출력 íŒŒì¼ ë˜ëŠ” 디렉터리 ì´ë¦„\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p 출력 íŒŒì¼ í˜•ì‹(ì‚¬ìš©ìž ì§€ì •, 디렉터리, tar,\n"
+" ì¼ë°˜ í…스트(초기값))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=개수 ë¤í”„ ìž‘ì—…ì„ ë³‘ë ¬ 처리 함\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose ìž‘ì—… ë‚´ì—­ì„ ìžì„¸ížˆ ë´„\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" 압축 지정\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid ""
+" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=ì´ˆ í…Œì´ë¸” 잠금 ì‹œ 지정한 ì´ˆë§Œí¼ ê¸°ë‹¤ë¦° 후 실패\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr " --no-sync fsync ìž‘ì—… ìƒëžµ\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"출력 ë‚´ìš©ì„ ë‹¤ë£¨ëŠ” 옵션들:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only 스키마 빼고 ìžë£Œë§Œ ë¤í”„\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects í° ê°ì²´ë¥¼ ë¤í”„ì— í¬í•¨\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (--large-objects 와 ê°™ìŒ, 옛날 옵션)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects í° ê°ì²´ 빼고 ë¤í”„\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid ""
+" --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr ""
+" --no-blobs (--no-large-objects와 ê°™ìŒ, 옛날 옵션)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid ""
+" -c, --clean clean (drop) database objects before "
+"recreating\n"
+msgstr ""
+" -c, --clean 다시 만들기 ì „ì— ë°ì´í„°ë² ì´ìŠ¤ 개체 지우기(ì‚­"
+"제)\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid ""
+" -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create ë°ì´í„°ë² ì´ìŠ¤ 만드는 ëª…ë ¹êµ¬ë¬¸ë„ í¬í•¨ì‹œí‚´\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN 지정한 확장 모듈들만 ë¤í”„ 함\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ì¸ì½”딩 지정한 ì¸ì½”딩으로 ìžë£Œë¥¼ ë¤í”„ 함\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN 지정한 SCHEMA들 ìžë£Œë§Œ ë¤í”„\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN 지정한 SCHEMA들만 빼고 ëª¨ë‘ ë¤í”„\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner ì¼ë°˜ í…스트 형ì‹ì—ì„œ\n"
+" 개체 소유권 ë³µì› ê±´ë„ˆë›°ê¸°\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only ìžë£Œêµ¬ì¡°(스키마)만 ë¤í”„\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use in plain-text "
+"format\n"
+msgstr ""
+" -S, --superuser=NAME ì¼ë°˜ í…스트 형ì‹ì—ì„œ 사용할 슈í¼ìœ ì € ì‚¬ìš©ìž ì´"
+"름\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=PATTERN 지정한 ì´ë¦„ì˜ í…Œì´ë¸”들만 ë¤í”„\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN 지정한 í…Œì´ë¸”들만 빼고 ë¤í”„\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr ""
+" -x, --no-privileges ì ‘ê·¼ 권한 (grant/revoke) 정보는 ë¤í”„ 안 함\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade 업그레ì´ë“œ 유틸리티 ì „ìš©\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid ""
+" --column-inserts dump data as INSERT commands with column "
+"names\n"
+msgstr ""
+" --column-inserts 칼럼 ì´ë¦„ê³¼ 함께 INSERT 명령으로 ìžë£Œ ë¤í”„\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid ""
+" --disable-dollar-quoting disable dollar quoting, use SQL standard "
+"quoting\n"
+msgstr ""
+" --disable-dollar-quoting $ ì¸ìš© 구문 사용안함, SQL 표준 따옴표 사용\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid ""
+" --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers ìžë£Œë§Œ ë³µì›í•  ë•Œ 트리거 ì‚¬ìš©ì„ ì•ˆí•¨\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user "
+"has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security 로우 보안 활성화 (현재 ìž‘ì—…ìžê°€ 접근할 수\n"
+" 있는 ìžë£Œë§Œ ë¤í”„ 함)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), "
+"including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=PATTERN\n"
+" ìƒì† 하위, 파티션 하위 í…Œì´ë¸”ì„ í¬í•¨í•˜ëŠ”\n"
+" íŒ¨í„´ì˜ í…Œì´ë¸”ë“¤ì€ ë¹¼ê³  ë¤í”„\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid ""
+" --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN 해당 í…Œì´ë¸” ìžë£ŒëŠ” ë¤í”„ 안함\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=PATTERN\n"
+" ìƒì† 하위, 파티션 하위 í…Œì´ë¸”ì„ í¬í•¨í•˜ëŠ”\n"
+" íŒ¨í„´ì˜ í…Œì´ë¸”ë“¤ì˜ ìžë£ŒëŠ” 빼고 ë¤í”„\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid ""
+" --extra-float-digits=NUM override default setting for "
+"extra_float_digits\n"
+msgstr " --extra-float-digits=NUM 기본 extra_float_digits 값 바꿈\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists ê°ì²´ ì‚­ì œ ì‹œ IF EXISTS 구문 사용\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=패턴\n"
+" 지정한 패턴과 ì¼ì¹˜í•˜ëŠ” 외부 ì„œë²„ì˜ ì™¸ë¶€\n"
+" í…Œì´ë¸” ìžë£Œë¥¼ í¬í•¨\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid ""
+" --inserts dump data as INSERT commands, rather than "
+"COPY\n"
+msgstr " --inserts COPY 대신 INSERT 명령으로 ìžë£Œ ë¤í”„\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr ""
+" --load-via-partition-root ìƒìœ„ í…Œì´ë¸”ì„ í†µí•´ 하위 í…Œì´ë¸”ì„ ë¡œë“œí•¨\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments 코멘트는 ë¤í”„ 안함\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications 발행 정보는 ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels 보안 ë¼ë²¨ í• ë‹¹ì„ ë¤í”„ 하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions êµ¬ë… ì •ë³´ëŠ” ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì€ ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces í…Œì´ë¸”스페ì´ìŠ¤ í• ë‹¹ì„ ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression TOAST 압축 ë°©ë²•ì€ ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data 언로그드 í…Œì´ë¸” ìžë£ŒëŠ” ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid ""
+" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT "
+"commands\n"
+msgstr ""
+" --on-conflict-do-nothing INSERT êµ¬ë¬¸ì— ON CONFLICT DO NOTHING 옵션 추"
+"ê°€\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid ""
+" --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers 예약어가 ì•„ë‹ˆì—¬ë„ ëª¨ë“  ì‹ë³„ìžëŠ” 따옴표를 씀\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid ""
+" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr ""
+" --rows-per-insert=NROWS 한 INSERT 명령으로 입력할 로우 수; --inserts\n"
+" ì˜µì…˜ì„ ì‚¬ìš©í•œ 것으로 가정 함\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid ""
+" --section=SECTION dump named section (pre-data, data, or post-"
+"data)\n"
+msgstr ""
+" --section=SECTION 해당 섹션(pre-data, data, post-data)만 ë¤í”„\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid ""
+" --serializable-deferrable wait until the dump can run without "
+"anomalies\n"
+msgstr ""
+" --serializable-deferrable ìžë£Œ ì •í•©ì„±ì„ ë³´ìž¥í•˜ê¸° 위해 ë¤í”„ ìž‘ì—…ì„\n"
+" ì§ë ¬í™” 가능한 트랜잭션으로 처리 함\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT 지정한 ìŠ¤ëƒ…ìƒ·ì„ ë¤í”„ 함\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns "
+"to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names í…Œì´ë¸”ì´ë‚˜ 스키마를 ì§€ì •í–ˆì„ ë•Œ ê·¸ íŒ¨í„´ì— ë§ž"
+"는\n"
+" ê°ì²´ê°€ ì ì–´ë„ 하나 ì´ìƒ 있어야 함\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=PATTERN 해당 íŒ¨í„´ì˜ ìƒì† 하위, 파티션 하위 í…Œì´ë¸”만\n"
+" ë¤í”„\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands "
+"instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" SET SESSION AUTHORIZATION ëª…ë ¹ì„ ALTER OWNER "
+"명령\n"
+" 대신 사용하여 소유권 설정\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME ë¤í”„í•  ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME ì ‘ì†í•  ë°ì´í„°ë² ì´ìŠ¤ 서버 ë˜ëŠ” 소켓 디렉터리\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìŠ¤ ì„œë²„ì˜ í¬íŠ¸ 번호\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME ì—°ê²°í•  ë°ì´í„°ë² ì´ìŠ¤ 사용ìž\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr " -W, --password 암호 ìž…ë ¥ 프롬프트 ë³´ìž„(ìžë™ìœ¼ë¡œ 처리함)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME ë¤í”„ ì „ì— SET ROLE 수행\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì„ ì§€ì •í•˜ì§€ 않았다면, PGDATABASE 환경변수값ì„\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ë¬¸ì œì  ë³´ê³  주소 <%s>\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "í´ë¼ì´ì–¸íŠ¸ ì¸ì½”딩 ê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤: \"%s\""
+
+#: pg_dump.c:1303
+#, c-format
+msgid ""
+"parallel dumps from standby servers are not supported by this server version"
+msgstr "대기 서버ì—ì„œ 병렬 ë¤í”„는 ì´ ì„œë²„ 버전ì—ì„œ 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ ì¶œë ¥ íŒŒì¼ í˜•íƒœìž…ë‹ˆë‹¤."
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ì ë‹¹í•˜ì§€ ì•Šì€ qualified ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” 스키마가 없습니다"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” 확장 ëª¨ë“ˆì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” 외부 서버가 없습니다"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr ""
+"ì ë‹¹í•˜ì§€ ì•Šì€ ë¦´ë ˆì´ì…˜(relation) ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” í…Œì´ë¸”ì´ ì—†ìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°ë˜ì–´ìžˆì§€ 않습니다."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ê°„ì˜ ì°¸ì¡°ëŠ” 구현ë˜ì–´ìžˆì§€ 않습니다: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "\"%s.%s\" í…Œì´ë¸”ì˜ ë‚´ìš© ë¤í”„ 중"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "\"%s\" í…Œì´ë¸” ë‚´ìš©ì„ ë¤í”„하면서 오류 ë°œìƒ: PQgetCopyData() 실패."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "서버ì—ì„œ 보낸 오류 메시지: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "ì‚¬ìš©ëœ ëª…ë ¹: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "\"%s\" í…Œì´ë¸” ë‚´ìš©ì„ ë¤í”„하면서 오류 ë°œìƒ: PQgetResult() 실패."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "\"%s\" í…Œì´ë¸”ì—ì„œ ìž˜ëª»ëœ í•„ë“œ 수"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 구성정보를 저장 중"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "ì•Œ 수 없는 ë¡œì¼€ì¼ ì œê³µìž ì´ë¦„: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "ì¸ì½”딩 = %s 저장 중"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "standard_conforming_strings = %s 저장 중"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas() 결과를 분ì„í•  수 ì—†ìŒ"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "search_path = %s 저장 중"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "large object ì½ëŠ” 중"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "large objectë“¤ì„ ì €ìž¥ 중"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "%u large object ì½ëŠ” 중 오류: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "로우 단위 보안 ì •ì±… ì½ëŠ” 중"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "예ìƒì¹˜ 못한 ì •ì±… 명령 형태: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "%s ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr ""
+"현재 사용ìžê°€ 슈í¼ìœ ì €ê°€ 아니기 ë•Œë¬¸ì— ì„œë¸ŒìŠ¤í¬ë¦½ì…˜ë“¤ì€ ë¤í”„하지 못했ìŒ"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s %s ê°ì²´ì™€ ê´€ë ¨ëœ ìƒìœ„ 확장 ê¸°ëŠ¥ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID %u 스키마 ì—†ìŒ"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of sequence with OID %u not "
+"found"
+msgstr "ì˜ì¡´ì„± 검사 실패, 부모 í…Œì´ë¸” OID %u ì—†ìŒ. 해당 시퀀스 개체 OID %u"
+
+#: pg_dump.c:6919
+#, c-format
+msgid ""
+"failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "완전성 검사 실패, OID %uì¸ ê°ì²´ê°€ pg_partitioned_tableì— ì—†ìŒ"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "ì•Œ 수 없는 í…Œì´ë¸” OID %u"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "\"%s\" í…Œì´ë¸”ì˜ ì¸ë±ìŠ¤ ìžë£Œë¥¼ ì•Œ 수 ì—†ìŒ"
+
+#: pg_dump.c:7649
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of pg_rewrite entry with OID "
+"%u not found"
+msgstr "ì˜ì¡´ì„± 검사 실패, 부모 í…Œì´ë¸” OID %u ì—†ìŒ. 해당 pg_rewrite 개체 OID %u"
+
+#: pg_dump.c:7940
+#, c-format
+msgid ""
+"query produced null referenced table name for foreign key trigger \"%s\" on "
+"table \"%s\" (OID of table: %u)"
+msgstr ""
+"쿼리가 참조테ì´ë¸” ì •ë³´ê°€ 없는 \"%s\" 참조키 트리거를 \"%s\" (해당 OID: %u) í…Œ"
+"ì´ë¸”ì—ì„œ 만들었습니다."
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "\"%s\" í…Œì´ë¸”ì˜ ì•Œ 수 없는 칼럼 ìžë£Œ"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "\"%s\" í…Œì´ë¸”ì— ë§¤ê²¨ì ¸ 있는 ì—´ 번호가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "default í‘œí˜„ì‹ ì°¾ëŠ” 중"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "ì ë‹¹í•˜ì§€ 않는 adnum ê°’: %d, 해당 í…Œì´ë¸” \"%s\""
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "í…Œì´ë¸” ì²´í¬ ì œì•½ì¡°ê±´ 찾는 중"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] ""
+"%dê°œì˜ ì œì•½ ì¡°ê±´ì´ \"%s\" í…Œì´ë¸”ì— ìžˆì„ ê²ƒìœ¼ë¡œ 예ìƒí–ˆìœ¼ë‚˜ %d개를 ì°¾ìŒ"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "시스템 카탈로그가 ì†ìƒë˜ì—ˆëŠ” 것 같습니다."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "%u OID ë¡¤ì´ ì—†ìŒ"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "지ì›í•˜ì§€ 않는 pg_init_privs 항목: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "\"%s\" ìžë£Œí˜•ì˜ typtypeê°€ 잘못 ë˜ì–´ 있ìŒ"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "\"%s\" í•¨ìˆ˜ì˜ provolatile ê°’ì´ ìž˜ëª» ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "\"%s\" í•¨ìˆ˜ì˜ proparallel ê°’ì´ ìž˜ëª» ë˜ì—ˆìŠµë‹ˆë‹¤"
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "%u OID í•¨ìˆ˜ì— ëŒ€í•œ 함수 ì •ì˜ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc ë˜ëŠ” pg_cast.castmethod í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ"
+
+#: pg_dump.c:12365
+#, c-format
+msgid ""
+"bogus transform definition, at least one of trffromsql and trftosql should "
+"be nonzero"
+msgstr "ìž˜ëª»ëœ ì „ì†¡ ì •ì˜, trffromsql ë˜ëŠ” trftosql 중 하나는 비어 있으면 안ë¨"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "postfix ì—°ì‚°ìžëŠ” ë”ì´ìƒ 지ì›í•˜ì§€ 않습니다.(\"%s\" ì—°ì‚°ìž)"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "%s OIDì˜ ì—°ì‚°ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "\"%c\" ìž˜ëª»ëœ ìžë£Œí˜•, 해당 ì ‘ê·¼ 방법: \"%s\""
+
+#: pg_dump.c:13455 pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "ì•Œ 수 없는 정렬규칙 ì œê³µìž ì´ë¦„: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ìž˜ëª»ëœ ë¬¸ìžì •ë ¬ê·œì¹™ \"%s\""
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" 집계 함수용 aggfinalmodify ê°’ì´ ì´ìƒí•¨"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" 집계 함수용 aggmfinalmodify ê°’ì´ ì´ìƒí•¨"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "기본 ì ‘ê·¼ 권한ì—ì„œ ì•Œ 수 없는 ê°ì²´í˜•ì´ 있ìŒ: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "기본 ACL ëª©ë¡ (%s)ì„ ë¶„ì„í•  수 ì—†ìŒ"
+
+#: pg_dump.c:14775
+#, c-format
+msgid ""
+"could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr ""
+"초기 ACL ëª©ë¡ (%s) ë˜ëŠ” default (%s) 분ì„í•  수 ì—†ìŒ, 해당 ê°ì²´: \"%s\" (%s)"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "ACL ëª©ë¡ (%s) ë˜ëŠ” default (%s) 분ì„í•  수 ì—†ìŒ, 해당 ê°ì²´: \"%s\" (%s)"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "\"%s\" ë·° ì •ì˜ ì •ë³´ê°€ 없습니다."
+
+#: pg_dump.c:15344
+#, c-format
+msgid ""
+"query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "\"%s\" ë·° ì •ì˜ ì •ë³´ê°€ 하나 ì´ìƒ 있습니다."
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "\"%s\" ë·°ì˜ ì •ì˜ ë‚´ìš©ì´ ë¹„ì–´ìžˆìŠµë‹ˆë‹¤."
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS ì˜µì…˜ì€ ë”ì´ìƒ 지ì›í•˜ì§€ ì•ŠìŒ (\"%s\" í…Œì´ë¸”)"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "ìž˜ëª»ëœ ì—´ 번호 %d, 해당 í…Œì´ë¸” \"%s\""
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "ì¸ë±ìŠ¤ 통계정보 칼럼 ë¶„ì„ ì‹¤íŒ¨"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "ì¸ë±ìŠ¤ 통계정보 ê°’ ë¶„ì„ ì‹¤íŒ¨"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "ì¸ë±ìŠ¤ 통계정보용 칼럼수와 값수가 ì¼ì¹˜í•˜ì§€ ì•ŠìŒ"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "\"%s\" 제약 ì¡°ê±´ì„ ìœ„í•œ ì¸ë±ìŠ¤ê°€ 빠졌습니다"
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "알 수 없는 제약 조건 종류: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural ""
+"query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] ""
+"\"%s\" ì‹œí€€ìŠ¤ì˜ ë°ì´í„°ë¥¼ 가져오기 위한 쿼리ì—ì„œ %dê°œì˜ í–‰ 반환(1ê°œ í•„ìš”)"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "알 수 없는 시퀀스 형태: %s"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "기대ë˜ì§€ ì•Šì€ tgtype ê°’: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "ìž˜ëª»ëœ ì¸ìˆ˜ 문ìžì—´ (%s), 해당 트리거 \"%s\", 사용ë˜ëŠ” í…Œì´ë¸” \"%s\""
+
+#: pg_dump.c:17655
+#, c-format
+msgid ""
+"query to get rule \"%s\" for table \"%s\" failed: wrong number of rows "
+"returned"
+msgstr ""
+"\"%s\" 규칙(\"%s\" í…Œì´ë¸”)ì„ ê°€ì ¸ì˜¤ê¸° 위한 쿼리 실패: ìž˜ëª»ëœ í–‰ 수 반환"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "%u 확장기능과 ê´€ë ¨ëœ ìƒìœ„ 확장 ê¸°ëŠ¥ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "확장 모듈용 환경설정 매개변수 수와 ì¡°ê±´ 수가 ì¼ì¹˜ 하지 ì•ŠìŒ"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "ì˜ì¡´ 관계 ìžë£Œ ì½ëŠ” 중"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "%u %u ê°œì²´ì˜ í•˜ìœ„ 관련 개체가 ì—†ìŒ"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "%u %u ê°œì²´ì˜ ìƒìœ„ 관련 개체가 ì—†ìŒ"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "ìž˜ëª»ëœ dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "ìž˜ëª»ëœ ì˜ì¡´ì„± %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "ì˜ì¡´ 관계를 ì‹ë³„ í•  수 ì—†ìŒ"
+
+#: pg_dump_sort.c:1276
+#, 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:1281
+#, 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:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "ë‹¤ìŒ í•­ëª© ê°„ ì˜ì¡´ 관계를 분ì„í•  수 ì—†ìŒ:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s ìž‘ì—…ì—ì„œ 필요로 하지만, \"%s\" 디렉터리 ì•ˆì— í•¨ê»˜ 있지 "
+"않습니다"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—… ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ, %s 버전과 같지 않습니다."
+
+#: pg_dumpall.c:382
+#, c-format
+msgid ""
+"option --exclude-database cannot be used together with -g/--globals-only, -"
+"r/--roles-only, or -t/--tablespaces-only"
+msgstr ""
+"--exclude-database ì˜µì…˜ì€ -g/--globals-only, -r/--roles-only, ë˜ëŠ” -t/--"
+"tablespaces-only 옵션과 함께 쓸 수 ì—†ìŒ"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "-g/--globals-only 옵션과 -r/--roles-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid ""
+"options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr ""
+"-g/--globals-only 옵션과 -t/--tablespaces-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid ""
+"options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr ""
+"-r/--roles-only 옵션과 -t/--tablespaces-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í•  수 ì—†ìŒ"
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"\"postgres\" ë˜ëŠ” \"template1\" ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  수 없습니다.\n"
+"다른 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 지정하십시오."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ë¥¼ SQL 스í¬ë¦½íŠ¸ 파ì¼ë¡œ\n"
+"추출하는 프로그램입니다.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [옵션]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=파ì¼ì´ë¦„ 출력 íŒŒì¼ ì´ë¦„\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid ""
+" -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+" -c, --clean 다시 만들기 ì „ì— ë°ì´í„°ë² ì´ìŠ¤ 지우기(ì‚­ì œ)\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only ë°ì´í„°ë² ì´ìŠ¤ëŠ” 제외하고 글로벌 개체만 ë¤í”„\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner 개체 소유권 ë³µì› ê±´ë„ˆë›°ê¸°\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid ""
+" -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only ë°ì´í„°ë² ì´ìŠ¤ë‚˜ í…Œì´ë¸”스페ì´ìŠ¤ëŠ” 제외하고 ì—­í• "
+"만 ë¤í”„\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME ë¤í”„ì— ì‚¬ìš©í•  슈í¼ìœ ì € ì‚¬ìš©ìž ì´ë¦„\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid ""
+" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only ë°ì´í„°ë² ì´ìŠ¤ë‚˜ ì—­í• ì€ ì œì™¸í•˜ê³  í…Œì´ë¸”스페ì´ìŠ¤"
+"만 ë¤í”„\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid ""
+" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=PATTERN 해당 PATTERNì— ì¼ì¹˜í•˜ëŠ” ë°ì´í„°ë² ì´ìŠ¤ 제외\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords 롤용 비밀번호를 ë¤í”„하지 ì•ŠìŒ\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=ì ‘ì†ë¬¸ìžì—´ 서버 ì ‘ì† ë¬¸ìžì—´\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME 대체용 기본 ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the "
+"standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"-f/--fileì„ ì‚¬ìš©í•˜ì§€ 않으면 SQL 스í¬ë¦½íŠ¸ê°€ 표준\n"
+"ì¶œë ¥ì— ì“°ì—¬ì§‘ë‹ˆë‹¤.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "롤 ì´ë¦„ì´ \"pg_\"ë¡œ 시작함, 무시함: (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "\"%s\" ë¡¤ì€ ë¤í”„í•  수 있는 ë¡¤ì„ í¬í•¨í•˜ê³  있지 않습니다"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "ACL ëª©ë¡ (%s)ì„ ë¶„ì„í•  수 ì—†ìŒ, 해당 매개변수 \"%s\""
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ ìš© ACL ëª©ë¡ (%s)ì„ ë¶„ì„í•  수 ì—†ìŒ, 해당개체 \"%s\""
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 제외하는 중"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ ë¤í”„ 중"
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì—ì„œ pg_dump ìž‘ì—… ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒ, ë냅니다."
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "\"%s\" 출력 파ì¼ì„ 다시 ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "\"%s\" ê°€ë™ì¤‘"
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "서버 ë²„ì „ì„ ì•Œ 수 ì—†ìŒ"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "\"%s\" 서버 ë²„ì „ì„ ë¶„ì„í•  수 ì—†ìŒ"
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "실행중: %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbname 옵션 ë˜ëŠ” -f/--file 옵션 중 하나를 지정해야 함"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "-d/--dbname 옵션과 -f/--file ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "-C/--clean 옵션과 -1/--single-transaction ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "--single-transaction ë° ë³‘ë ¬ ìž‘ì—…ì„ í•¨ê»˜ 지정할 수는 ì—†ìŒ"
+
+#: pg_restore.c:380
+#, c-format
+msgid ""
+"unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr ""
+"ì•Œ 수 없는 ì•„ì¹´ì´ë¸Œ 형ì‹: \"%s\"; 사용할 수 있는 ê°’: \"c\", \"d\", \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "ë³µì›ìž‘ì—…ì—ì„œì˜ ì˜¤ë¥˜ë“¤ì´ ë¬´ì‹œë˜ì—ˆìŒ: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ pg_dumpë¡œ 만들어진 ìžë£ŒíŒŒì¼ë¡œ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ì—\n"
+"ê·¸ ìžë£Œë¥¼ ì¼ê´„ 입력합니다.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [옵션]... [파ì¼]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME ì ‘ì†í•  ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME 출력 íŒŒì¼ ì´ë¦„ (표준 출력: -)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t 백업 íŒŒì¼ í˜•ì‹ (지정하지 않으면 ìžë™ë¶„ì„)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list ìžë£Œì˜ ìš”ì•½ëœ ëª©ì°¨ë¥¼ 보여줌\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose ìžì„¸í•œ ì •ë³´ 보여줌\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"리스토어 처리를 위한 옵션들:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only 스키마는 빼고 ìžë£Œë§Œ 입력함\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create ìž‘ì—… ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만듦\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e, --exit-on-error 오류가 ìƒê¸°ë©´ ë냄, ê¸°ë³¸ì€ ê³„ì† ì§„í–‰í•¨\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME 지정한 ì¸ë±ìŠ¤ 만듦\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM 여러 병렬 ìž‘ì—…ì„ ì‚¬ìš©í•˜ì—¬ ë³µì›\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME ì¶œë ¥ì„ ì„ íƒí•˜ê³  해당 순서를 지정하기 위해\n"
+" ì´ íŒŒì¼ì˜ 목차 사용\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME 해당 ìŠ¤í‚¤ë§ˆì˜ ê°œì²´ë“¤ë§Œ ë³µì›í•¨\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME 해당 ìŠ¤í‚¤ë§ˆì˜ ê°œì²´ë“¤ì€ ë³µì› ì•ˆí•¨\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) 지정한 함수 만듦\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only ìžë£Œêµ¬ì¡°(스키마)만 만듦\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use for disabling "
+"triggers\n"
+msgstr ""
+" -S, --superuser=NAME 트리거를 사용하지 않기 위해 사용할 슈í¼ìœ ì €\n"
+" ì‚¬ìš©ìž ì´ë¦„\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid ""
+" -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME ë³µì›í•  ê°ì²´ ì´ë¦„ (í…Œì´ë¸”, ë·°, 기타)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME 지정한 트리거 만듦\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid ""
+" -x, --no-privileges skip restoration of access privileges (grant/"
+"revoke)\n"
+msgstr " -x, --no-privileges 접근 권한(grant/revoke) 지정 안함\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ 작업으로 ë³µì›í•¨\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security 로우 보안 활성화\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments 코멘트는 ë³µì›í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not "
+"be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables 만들 수 없는 í…Œì´ë¸”ì— ëŒ€í•´ì„œëŠ” ìžë£Œë¥¼ ë¤í”„하"
+"지 ì•ŠìŒ\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications 발행 정보는 ë³µì› ì•ˆí•¨\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels 보안 ë¼ë²¨ì„ ë³µì›í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions êµ¬ë… ì •ë³´ëŠ” ë³µì› ì•ˆí•¨\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method í…Œì´ë¸” ì ‘ê·¼ 방법 ë³µì› ì•ˆí•¨\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces í…Œì´ë¸”스페ì´ìŠ¤ í• ë‹¹ì„ ë³µì›í•˜ì§€ ì•ŠìŒ\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid ""
+" --section=SECTION restore named section (pre-data, data, or "
+"post-data)\n"
+msgstr ""
+" --section=SECTION 지정한 섹션만 ë³µì›í•¨\n"
+" 섹션 종류: pre-data, data, post-data\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME ë³µì› ì „ì— SET ROLE 수행\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and "
+"specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"-I, -n, -N, -P, -t, -T, --section ì˜µì…˜ì€ ê·¸ 대ìƒì´ ë˜ëŠ” ê°ì²´ë¥¼ 복수로 지정하"
+"기\n"
+"위해서 여러번 사용할 수 있습니다.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"사용할 ìž…ë ¥ 파ì¼ì„ 지정하지 않았다면, 표준 ìž…ë ¥(stdin)ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.\n"
+"\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build
new file mode 100644
index 0000000..cc9d368
--- /dev/null
+++ b/src/bin/pg_dump/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_dump-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_dump/po/pl.po b/src/bin/pg_dump/po/pl.po
new file mode 100644
index 0000000..b7aebb0
--- /dev/null
+++ b/src/bin/pg_dump/po/pl.po
@@ -0,0 +1,2739 @@
+# Polish message translation file for pg_dump
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL 9.5)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-04-09 21:16+0000\n"
+"PO-Revision-Date: 2017-04-09 23:39+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "nie można zidentyfikować aktualnego katalogu: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "niepoprawny binarny \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nie można odczytać binarnego \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nie znaleziono \"%s\" do wykonania"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "nie można zmienić katalogu na \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "nie można odczytać odwołania symbolicznego \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose nie powiodło się: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "polecenie nie wykonywalne"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "polecenie nie znalezione"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "proces potomny zakończył działanie z kodem %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "proces potomny został zatrzymany przez wyjątek 0x%X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "proces potomny został zatrzymany przez sygnał %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "proces potomny został zatrzymany przez sygnał %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "proces potomny zakończył działanie z nieznanym stanem %d"
+
+#: common.c:127
+#, c-format
+msgid "reading extensions\n"
+msgstr "odczyt rozszerzeń\n"
+
+#: common.c:132
+#, c-format
+msgid "identifying extension members\n"
+msgstr "identyfikowanie składników rozszerzeń\n"
+
+#: common.c:136
+#, c-format
+msgid "reading schemas\n"
+msgstr "odczyt schematów\n"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables\n"
+msgstr "odczyt tabel użytkownika\n"
+
+#: common.c:155
+#, c-format
+msgid "reading user-defined functions\n"
+msgstr "odczyt funkcji użytkownika\n"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined types\n"
+msgstr "odczyt typów użytkownika\n"
+
+#: common.c:167
+#, c-format
+msgid "reading procedural languages\n"
+msgstr "odczyt języków proceduralnych\n"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined aggregate functions\n"
+msgstr "odczyt funkcji agregujących użytkownika\n"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operators\n"
+msgstr "odczyt operatorów użytkownika\n"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined access methods\n"
+msgstr "odczyt metod dostępu użytkownika\n"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined operator classes\n"
+msgstr "odczyt klas operatorów użytkownika\n"
+
+#: common.c:188
+#, c-format
+msgid "reading user-defined operator families\n"
+msgstr "odczyt rodzin operatorów użytkownika\n"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined text search parsers\n"
+msgstr "odczyt analizatorów wyszukiwania tekstowego użytkownika\n"
+
+#: common.c:196
+#, c-format
+msgid "reading user-defined text search templates\n"
+msgstr "odczyt szablonów wyszukiwania tekstowego użytkownika\n"
+
+#: common.c:200
+#, c-format
+msgid "reading user-defined text search dictionaries\n"
+msgstr "odczyt słowników wyszukiwania tekstowego użytkownika\n"
+
+#: common.c:204
+#, c-format
+msgid "reading user-defined text search configurations\n"
+msgstr "odczyt konfiguracji wyszukiwania tekstowego użytkownika\n"
+
+#: common.c:208
+#, c-format
+msgid "reading user-defined foreign-data wrappers\n"
+msgstr "odczyt opakowań obcych danych użytkownika\n"
+
+#: common.c:212
+#, c-format
+msgid "reading user-defined foreign servers\n"
+msgstr "odczyt serwerów obcych użytkownika\n"
+
+#: common.c:216
+#, c-format
+msgid "reading default privileges\n"
+msgstr "odczyt uprawnień domyślnych\n"
+
+#: common.c:220
+#, c-format
+msgid "reading user-defined collations\n"
+msgstr "odczyt porównań użytkownika\n"
+
+#: common.c:225
+#, c-format
+msgid "reading user-defined conversions\n"
+msgstr "odczyt konwersji użytkownika\n"
+
+#: common.c:229
+#, c-format
+msgid "reading type casts\n"
+msgstr "odczyt rzutowań typów\n"
+
+#: common.c:233
+#, c-format
+msgid "reading transforms\n"
+msgstr "odczyt transformacji\n"
+
+#: common.c:237
+#, c-format
+msgid "reading table inheritance information\n"
+msgstr "odczyt informacji o dziedziczeniu tabel\n"
+
+#: common.c:241
+#, c-format
+msgid "reading partition information\n"
+msgstr "odczyt informacji o partycjach\n"
+
+#: common.c:245
+#, c-format
+msgid "reading event triggers\n"
+msgstr "odczyt wyzwalaczy zdarzeń\n"
+
+#: common.c:250
+#, c-format
+msgid "finding extension tables\n"
+msgstr "odnajdywanie tabel rozszerzeń\n"
+
+#: common.c:255
+#, c-format
+msgid "finding inheritance relationships\n"
+msgstr "odnajdywanie relacji dziedziczenia\n"
+
+#: common.c:260
+#, c-format
+msgid "finding partition relationships\n"
+msgstr "odnajdywanie relacji partycji\n"
+
+#: common.c:264
+#, c-format
+msgid "reading column info for interesting tables\n"
+msgstr "odczyt notatek kolumn dla ciekawych tabel\n"
+
+#: common.c:268
+#, c-format
+msgid "flagging inherited columns in subtables\n"
+msgstr "oznaczanie dziedziczonych kolumn w podtabelach\n"
+
+#: common.c:272
+#, c-format
+msgid "reading indexes\n"
+msgstr "odczyt indeksów\n"
+
+#: common.c:276
+#, c-format
+#| msgid "reading extensions\n"
+msgid "reading extended statistics\n"
+msgstr "odczyt rozszerzonych statystyk\n"
+
+#: common.c:280
+#, c-format
+msgid "reading constraints\n"
+msgstr "odczyt ograniczeń\n"
+
+#: common.c:284
+#, c-format
+msgid "reading triggers\n"
+msgstr "odczyt wyzwalaczy\n"
+
+#: common.c:288
+#, c-format
+msgid "reading rewrite rules\n"
+msgstr "odczyt reguł przepisywania\n"
+
+#: common.c:292
+#, c-format
+msgid "reading policies\n"
+msgstr "odczyt polityk\n"
+
+#: common.c:296
+#, c-format
+msgid "reading partition key information for interesting tables\n"
+msgstr "odczyt informacji kluczowych partycji dla interesujÄ…cych tabel\n"
+
+#: common.c:300
+#, c-format
+msgid "reading publications\n"
+msgstr "odczyt publikacji\n"
+
+#: common.c:304
+#, c-format
+msgid "reading publication membership\n"
+msgstr "odczyt członkostwa publikacji\n"
+
+#: common.c:308
+#, c-format
+msgid "reading subscriptions\n"
+msgstr "odczyt subskrypcji\n"
+
+#: common.c:980 common.c:1014
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n"
+msgstr "sprawdzenia nie powiodły się, nie odnaleziono nadrzędnego OID %u dla tabeli \"%s\" (OID %u)\n"
+
+#: common.c:1056
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers\n"
+msgstr "nie można przetworzyć tablicy numerycznej \"%s\": zbyt wiele liczb\n"
+
+#: common.c:1071
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number\n"
+msgstr "nie można przetworzyć tablicy numerycznej \"%s\": niepoprawny znak w liczbie\n"
+
+#. translator: this is a module name
+#: compress_io.c:78
+msgid "compress_io"
+msgstr "kompresuj_io"
+
+#: compress_io.c:114
+#, c-format
+msgid "invalid compression code: %d\n"
+msgstr "niepoprawny kod kompresji: %d\n"
+
+#: compress_io.c:138 compress_io.c:174 compress_io.c:192 compress_io.c:519
+#: compress_io.c:562
+#, c-format
+msgid "not built with zlib support\n"
+msgstr "nie wbudowano obsługi zlib\n"
+
+#: compress_io.c:242 compress_io.c:344
+#, c-format
+msgid "could not initialize compression library: %s\n"
+msgstr "nie udało się zainicjować biblioteki kompresji: %s\n"
+
+#: compress_io.c:263
+#, c-format
+msgid "could not close compression stream: %s\n"
+msgstr "nie udało się zamknąć strumienia kompresji: %s\n"
+
+#: compress_io.c:281
+#, c-format
+msgid "could not compress data: %s\n"
+msgstr "nie udało się spakować danych: %s\n"
+
+#: compress_io.c:361 compress_io.c:377
+#, c-format
+msgid "could not uncompress data: %s\n"
+msgstr "nie udało się rozpakować danych: %s\n"
+
+#: compress_io.c:385
+#, c-format
+msgid "could not close compression library: %s\n"
+msgstr "nie udało się zamknąć biblioteki kompresji: %s\n"
+
+#: compress_io.c:596 compress_io.c:632 pg_backup_custom.c:587
+#: pg_backup_tar.c:559
+#, c-format
+msgid "could not read from input file: %s\n"
+msgstr "nie można czytać z pliku wejścia: %s\n"
+
+#: compress_io.c:635 pg_backup_custom.c:584 pg_backup_directory.c:543
+#: pg_backup_tar.c:795 pg_backup_tar.c:819
+#, c-format
+msgid "could not read from input file: end of file\n"
+msgstr "nie można czytać pliku wejścia: koniec pliku\n"
+
+#: parallel.c:198
+msgid "parallel archiver"
+msgstr "archiwizator równoległy"
+
+#: parallel.c:265
+#, c-format
+msgid "%s: WSAStartup failed: %d\n"
+msgstr "%s: nie powiodło się WSAStartup: %d\n"
+
+#: parallel.c:971
+#, c-format
+msgid "could not create communication channels: %s\n"
+msgstr "nie można utworzyć kanałów komunikacyjnych: %s\n"
+
+#: parallel.c:1036
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "nie można utworzyć procesu roboczego: %s\n"
+
+#: parallel.c:1167
+#, c-format
+msgid "unrecognized command received from master: \"%s\"\n"
+msgstr "nierozpoznane polecenie otrzymane od podstawowego: \"%s\"\n"
+
+#: parallel.c:1211 parallel.c:1451
+#, c-format
+msgid "invalid message received from worker: \"%s\"\n"
+msgstr "niepoprawny komunikat otrzymany od pracownika: \"%s\"\n"
+
+#: parallel.c:1344
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table.\n"
+msgstr ""
+"nie udało się uzyskać blokady na relacji \"%s\"\n"
+"Oznacza to zazwyczaj że ktoś zażądał blokady ACCESS EXCLUSIVE na tabeli gdy wcześniej proces nadrzędny pg_dump uzyskał początkową blokadę ACCESS SHARE na tabeli.\n"
+
+#: parallel.c:1433
+#, c-format
+msgid "a worker process died unexpectedly\n"
+msgstr "proces roboczy nie zakończył się nieoczekiwanie\n"
+
+#: parallel.c:1557 parallel.c:1675
+#, c-format
+msgid "could not write to the communication channel: %s\n"
+msgstr "nie można zapisać do kanału komunikacyjnego: %s\n"
+
+#: parallel.c:1635
+#, c-format
+msgid "select() failed: %s\n"
+msgstr "select() nie udało się: %s\n"
+
+#: parallel.c:1760
+#, c-format
+msgid "pgpipe: could not create socket: error code %d\n"
+msgstr "pgpipe: nie można utworzyć gniazda: kod błędu %d\n"
+
+#: parallel.c:1771
+#, c-format
+msgid "pgpipe: could not bind: error code %d\n"
+msgstr "pgpipe: nie udało się dowiązać: kod błędu %d\n"
+
+#: parallel.c:1778
+#, c-format
+msgid "pgpipe: could not listen: error code %d\n"
+msgstr "pgpipe: nie dało się nasłuchiwać: kod błędu %d\n"
+
+#: parallel.c:1785
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d\n"
+msgstr "pgpipe: getsockname() nie powiodła: kod błędu %d\n"
+
+#: parallel.c:1796
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d\n"
+msgstr "pgpipe: nie można utworzyć drugiego gniazda: kod błędu %d\n"
+
+#: parallel.c:1805
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d\n"
+msgstr "pgpipe: nie można połączyć się do gniazda: kod błędu %d\n"
+
+#: parallel.c:1814
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d\n"
+msgstr "pgpipe: nie można przyjąć połączenia: kod błądu %d\n"
+
+#. translator: this is a module name
+#: pg_backup_archiver.c:53
+msgid "archiver"
+msgstr "archiwizator"
+
+#: pg_backup_archiver.c:242 pg_backup_archiver.c:1572
+#, c-format
+msgid "could not close output file: %s\n"
+msgstr "nie można zamknąć pliku wyjścia: %s\n"
+
+#: pg_backup_archiver.c:288 pg_backup_archiver.c:293
+#, c-format
+msgid "WARNING: archive items not in correct section order\n"
+msgstr "OSTRZEŻENIE: elementy archiwów w niepoprawnym porządku sekcji\n"
+
+#: pg_backup_archiver.c:299
+#, c-format
+msgid "unexpected section code %d\n"
+msgstr "nieoczekiwany kod sekcji %d\n"
+
+#: pg_backup_archiver.c:335
+#, c-format
+msgid "-C and -1 are incompatible options\n"
+msgstr "-C i -1 sÄ… opcjami niekompatybilnymi\n"
+
+#: pg_backup_archiver.c:345
+#, c-format
+msgid "parallel restore is not supported with this archive file format\n"
+msgstr "odtwarzanie współbieżne nie jest obsługiwane w tym formacie archiwum\n"
+
+#: pg_backup_archiver.c:349
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump\n"
+msgstr "odtwarzanie współbieżne nie jest obsługiwane w archiwach utworzonych przez pg_dump sprzed 8.0\n"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)\n"
+msgstr "nie można odtworzyć ze spakowanego archiwum (kompresja nie jest obsługiwana w tej instalacji)\n"
+
+#: pg_backup_archiver.c:384
+#, c-format
+msgid "connecting to database for restore\n"
+msgstr "Å‚Ä…czenie z bazÄ… danych w celu odtworzenia\n"
+
+#: pg_backup_archiver.c:386
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives\n"
+msgstr "bezpośrednie połączenia bazy danych nie są obsługiwane w archiwach sprzed 1.3\n"
+
+#: pg_backup_archiver.c:431
+#, c-format
+msgid "implied data-only restore\n"
+msgstr "domniemane przywrócenie wyłącznie danych\n"
+
+#: pg_backup_archiver.c:501
+#, c-format
+msgid "dropping %s %s\n"
+msgstr "kasowanie %s %s\n"
+
+#: pg_backup_archiver.c:594
+#, c-format
+msgid "WARNING: could not find where to insert IF EXISTS in statement \"%s\"\n"
+msgstr "OSTRZEŻENIE: nie udało się odnaleźć miejsca wstawienia IF EXISTS w wyrażeniu \"%s\"\n"
+
+#: pg_backup_archiver.c:670
+#, c-format
+msgid "setting owner and privileges for %s \"%s.%s\"\n"
+msgstr "ustawienie właściciela i uprawnień dla %s \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:673
+#, c-format
+msgid "setting owner and privileges for %s \"%s\"\n"
+msgstr "ustawienie właściciela i uprawnień dla %s \"%s\"\n"
+
+#: pg_backup_archiver.c:739 pg_backup_archiver.c:741
+#, c-format
+msgid "warning from original dump file: %s\n"
+msgstr "ostrzeżenie z oryginalnego pliku zrzutu: %s\n"
+
+#: pg_backup_archiver.c:750
+#, c-format
+msgid "creating %s \"%s.%s\"\n"
+msgstr "tworzenie %s \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:753
+#, c-format
+msgid "creating %s \"%s\"\n"
+msgstr "tworzenie %s \"%s\"\n"
+
+#: pg_backup_archiver.c:805
+#, c-format
+msgid "connecting to new database \"%s\"\n"
+msgstr "Å‚Ä…czenie do nowej bazy danych \"%s\"\n"
+
+#: pg_backup_archiver.c:833
+#, c-format
+msgid "processing %s\n"
+msgstr "przetwarzanie %s\n"
+
+#: pg_backup_archiver.c:853
+#, c-format
+msgid "processing data for table \"%s.%s\"\n"
+msgstr "przetwarzanie danych tabeli \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:915
+#, c-format
+msgid "executing %s %s\n"
+msgstr "wykonywanie %s %s\n"
+
+#: pg_backup_archiver.c:954
+#, c-format
+msgid "disabling triggers for %s\n"
+msgstr "wyłączanie wyzwalaczy dla %s\n"
+
+#: pg_backup_archiver.c:982
+#, c-format
+msgid "enabling triggers for %s\n"
+msgstr "włączanie wyzwalaczy dla: %s\n"
+
+#: pg_backup_archiver.c:1012
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine\n"
+msgstr "błąd wewnętrzny -- WriteData nie może być wywołana poza kontekstem procedury DataDumper\n"
+
+#: pg_backup_archiver.c:1210
+#, c-format
+msgid "large-object output not supported in chosen format\n"
+msgstr "wyjście dużych obiektów nie jest obsługiwane w wybranym formacie\n"
+
+#: pg_backup_archiver.c:1268
+#, c-format
+msgid "restored %d large object\n"
+msgid_plural "restored %d large objects\n"
+msgstr[0] "odtworzono %d duży obiekt\n"
+msgstr[1] "odtworzono %d duże obiekty\n"
+msgstr[2] "odtworzono %d dużych obiektów\n"
+
+#: pg_backup_archiver.c:1289 pg_backup_tar.c:737
+#, c-format
+msgid "restoring large object with OID %u\n"
+msgstr "odtwarzanie dużego obiektu z OID %u\n"
+
+#: pg_backup_archiver.c:1301
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "nie można utworzyć dużego obiektu %u: %s"
+
+#: pg_backup_archiver.c:1306 pg_dump.c:3084
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "nie można otworzyć dużego obiektu %u: %s"
+
+#: pg_backup_archiver.c:1364
+#, c-format
+msgid "could not open TOC file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku TOC \"%s\": %s\n"
+
+#: pg_backup_archiver.c:1405
+#, c-format
+msgid "WARNING: line ignored: %s\n"
+msgstr "OSTRZEŻENIE: zignorowano linię: %s\n"
+
+#: pg_backup_archiver.c:1412
+#, c-format
+msgid "could not find entry for ID %d\n"
+msgstr "nie znaleziono wpisu dla ID %d\n"
+
+#: pg_backup_archiver.c:1433 pg_backup_directory.c:225
+#: pg_backup_directory.c:592
+#, c-format
+msgid "could not close TOC file: %s\n"
+msgstr "nie można zamknąć pliku TOC: %s\n"
+
+#: pg_backup_archiver.c:1542 pg_backup_custom.c:158 pg_backup_directory.c:336
+#: pg_backup_directory.c:578 pg_backup_directory.c:643
+#: pg_backup_directory.c:663
+#, c-format
+msgid "could not open output file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku wyjścia \"%s\": %s\n"
+
+#: pg_backup_archiver.c:1545 pg_backup_custom.c:165
+#, c-format
+msgid "could not open output file: %s\n"
+msgstr "nie można otworzyć pliku wyjścia %s\n"
+
+#: pg_backup_archiver.c:1651
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)\n"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)\n"
+msgstr[0] "zapisano %lu bajt danych dużego obiektu (wynik = %lu)\n"
+msgstr[1] "zapisano %lu bajty danych dużego obiektu (wynik = %lu)\n"
+msgstr[2] "zapisano %lu bajtów danych dużego obiektu (wynik = %lu)\n"
+
+#: pg_backup_archiver.c:1657
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)\n"
+msgstr "nie udało się zapisać dużego obiektu (wynik: %lu, oczekiwano: %lu)\n"
+
+#: pg_backup_archiver.c:1750
+#, c-format
+msgid "Error while INITIALIZING:\n"
+msgstr "BÅ‚Ä…d podczas INICJACJI:\n"
+
+#: pg_backup_archiver.c:1755
+#, c-format
+msgid "Error while PROCESSING TOC:\n"
+msgstr "BÅ‚Ä…d podczas PRZETWARZANIA TOC:\n"
+
+#: pg_backup_archiver.c:1760
+#, c-format
+msgid "Error while FINALIZING:\n"
+msgstr "Błąd podczas ZAKAŃCZANIA:\n"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "Error from TOC entry %d; %u %u %s %s %s\n"
+msgstr "BÅ‚Ä…d z wpisu %d TOC; %u %u %s %s %s\n"
+
+#: pg_backup_archiver.c:1838
+#, c-format
+msgid "bad dumpId\n"
+msgstr "niepoprawny dumpId\n"
+
+#: pg_backup_archiver.c:1859
+#, c-format
+msgid "bad table dumpId for TABLE DATA item\n"
+msgstr "niepoprawna tabela dumpId dla elementu TABLE DATA\n"
+
+#: pg_backup_archiver.c:1951
+#, c-format
+msgid "unexpected data offset flag %d\n"
+msgstr "nieoczekiwana dana flagi przesunięcia %d\n"
+
+#: pg_backup_archiver.c:1964
+#, c-format
+msgid "file offset in dump file is too large\n"
+msgstr "przesunięcie pliku w pliku zrzutu jest zbyt duże\n"
+
+#: pg_backup_archiver.c:2077
+#, c-format
+msgid "attempting to ascertain archive format\n"
+msgstr "próba ustalenia formatu archiwum\n"
+
+#: pg_backup_archiver.c:2103 pg_backup_archiver.c:2113
+#, c-format
+msgid "directory name too long: \"%s\"\n"
+msgstr "zbyt długa nazwa pliku: \"%s\"\n"
+
+#: pg_backup_archiver.c:2121
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)\n"
+msgstr "folder \"%s\" nie wydaje się być poprawnym archiwum (\"toc.dat\" nie istnieje)\n"
+
+#: pg_backup_archiver.c:2129 pg_backup_custom.c:177 pg_backup_custom.c:770
+#: pg_backup_directory.c:209 pg_backup_directory.c:394
+#, c-format
+msgid "could not open input file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku wejścia \"%s\": %s\n"
+
+#: pg_backup_archiver.c:2137 pg_backup_custom.c:184
+#, c-format
+msgid "could not open input file: %s\n"
+msgstr "nie można otworzyć pliku wyjścia %s\n"
+
+#: pg_backup_archiver.c:2144
+#, c-format
+msgid "could not read input file: %s\n"
+msgstr "nie można odczytać pliku wejścia %s\n"
+
+#: pg_backup_archiver.c:2146
+#, c-format
+msgid "input file is too short (read %lu, expected 5)\n"
+msgstr "plik wejścia jest zbyt krótki (odczytano %lu, oczekiwano 5)\n"
+
+#: pg_backup_archiver.c:2231
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql.\n"
+msgstr "plik wejścia wydaje się zrzutem w formacie tekstowym. Należy użyć psql.\n"
+
+#: pg_backup_archiver.c:2237
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)\n"
+msgstr "plik wejścia nie wydaje się być poprawnym archiwum (zbyt krótki?)\n"
+
+#: pg_backup_archiver.c:2243
+#, c-format
+msgid "input file does not appear to be a valid archive\n"
+msgstr "plik wejścia nie wydaje się być poprawnym archiwum\n"
+
+#: pg_backup_archiver.c:2263
+#, c-format
+msgid "could not close input file: %s\n"
+msgstr "nie można zamknąć pliku wejścia: %s\n"
+
+#: pg_backup_archiver.c:2281
+#, c-format
+msgid "allocating AH for %s, format %d\n"
+msgstr "przydzielenie AH da %s, format %d\n"
+
+#: pg_backup_archiver.c:2382
+#, c-format
+msgid "unrecognized file format \"%d\"\n"
+msgstr "nierozpoznany format pliku \"%d\"\n"
+
+#: pg_backup_archiver.c:2437 pg_backup_archiver.c:4195
+#, c-format
+msgid "finished item %d %s %s\n"
+msgstr "ukończono element %d %s %s\n"
+
+#: pg_backup_archiver.c:2441 pg_backup_archiver.c:4208
+#, c-format
+msgid "worker process failed: exit code %d\n"
+msgstr "proces roboczy nie powiódł się: kod wyjścia %d\n"
+
+#: pg_backup_archiver.c:2561
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC\n"
+msgstr "wpis ID %d poza zasięgiem -- być może uszkodzony TOC\n"
+
+#: pg_backup_archiver.c:2677
+#, c-format
+msgid "read TOC entry %d (ID %d) for %s %s\n"
+msgstr "odczyt wpisu TOC %d (ID %d) dla %s %s\n"
+
+#: pg_backup_archiver.c:2711
+#, c-format
+msgid "unrecognized encoding \"%s\"\n"
+msgstr "niezrozumiały kodowanie \"%s\"\n"
+
+#: pg_backup_archiver.c:2716
+#, c-format
+msgid "invalid ENCODING item: %s\n"
+msgstr "niepoprawny element ENCODING: %s\n"
+
+#: pg_backup_archiver.c:2734
+#, c-format
+msgid "invalid STDSTRINGS item: %s\n"
+msgstr "niepoprawny element STDSTRINGS: %s\n"
+
+#: pg_backup_archiver.c:2749
+#, c-format
+msgid "schema \"%s\" not found\n"
+msgstr "nie znaleziono schematu \"%s\"\n"
+
+#: pg_backup_archiver.c:2756
+#, c-format
+msgid "table \"%s\" not found\n"
+msgstr "nie znaleziono tabeli \"%s\"\n"
+
+#: pg_backup_archiver.c:2763
+#, c-format
+msgid "index \"%s\" not found\n"
+msgstr "nie znaleziono indeksu \"%s\"\n"
+
+#: pg_backup_archiver.c:2770
+#, c-format
+msgid "function \"%s\" not found\n"
+msgstr "nie znaleziono funkcji \"%s\"\n"
+
+#: pg_backup_archiver.c:2777
+#, c-format
+msgid "trigger \"%s\" not found\n"
+msgstr "nie znaleziono wyzwalacza \"%s\"\n"
+
+#: pg_backup_archiver.c:3025
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "nie można ustalić użytkownika sesji na \"%s\": %s"
+
+#: pg_backup_archiver.c:3057
+#, c-format
+msgid "could not set default_with_oids: %s"
+msgstr "nie można ustawić default_with_oids: %s"
+
+#: pg_backup_archiver.c:3202
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "nie można ustawić search_path na \"%s\": %s"
+
+#: pg_backup_archiver.c:3264
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "nie można ustawić default_tablespace na %s: %s"
+
+#: pg_backup_archiver.c:3353 pg_backup_archiver.c:3550
+#, c-format
+msgid "WARNING: don't know how to set owner for object type %s\n"
+msgstr "OSTRZEŻENIE: nie wiadomo jak ustalić właściciela dla typu obiektu %s\n"
+
+#: pg_backup_archiver.c:3637
+#, c-format
+msgid "did not find magic string in file header\n"
+msgstr "nie znaleziono magicznego zdania w nagłówku pliku\n"
+
+#: pg_backup_archiver.c:3650
+#, c-format
+msgid "unsupported version (%d.%d) in file header\n"
+msgstr "nieobsługiwana wersja (%d.%d) w nagłówku pliku\n"
+
+#: pg_backup_archiver.c:3655
+#, c-format
+msgid "sanity check on integer size (%lu) failed\n"
+msgstr "nie powiodło się sprawdzenie na rozmiarze liczby całkowitej (%lu)\n"
+
+#: pg_backup_archiver.c:3659
+#, c-format
+msgid "WARNING: archive was made on a machine with larger integers, some operations might fail\n"
+msgstr "OSTRZEŻENIE: archiwum zostało utworzone na komputerze o dłuższych liczbach całkowitych, niektóre operacje mogą się nie udać\n"
+
+#: pg_backup_archiver.c:3669
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)\n"
+msgstr "oczekiwany format (%d) różni się od formatu znalezionego w pliku (%d)\n"
+
+#: pg_backup_archiver.c:3685
+#, c-format
+msgid "WARNING: archive is compressed, but this installation does not support compression -- no data will be available\n"
+msgstr "OSTRZEŻENIE: archiwum jest spakowane, ale ta instalacja nie obsługuje kompresji -- dane nie będą dostępne\n"
+
+#: pg_backup_archiver.c:3703
+#, c-format
+msgid "WARNING: invalid creation date in header\n"
+msgstr "OSTRZEŻENIE: niepoprawna data utworzenia w nagłówku\n"
+
+#: pg_backup_archiver.c:3778
+#, c-format
+msgid "entering restore_toc_entries_prefork\n"
+msgstr "wejście do restore_toc_entries_prefork\n"
+
+#: pg_backup_archiver.c:3822
+#, c-format
+msgid "processing item %d %s %s\n"
+msgstr "przetwarzanie elementu %d %s %s\n"
+
+#: pg_backup_archiver.c:3872
+#, c-format
+msgid "entering restore_toc_entries_parallel\n"
+msgstr "wprowadzanie restore_toc_entries_parallel\n"
+
+#: pg_backup_archiver.c:3920
+#, c-format
+msgid "entering main parallel loop\n"
+msgstr "wejście w główną pętlę współbieżności\n"
+
+#: pg_backup_archiver.c:3931
+#, c-format
+msgid "skipping item %d %s %s\n"
+msgstr "pominięcie elementu %d %s %s\n"
+
+#: pg_backup_archiver.c:3941
+#, c-format
+msgid "launching item %d %s %s\n"
+msgstr "uruchomienie elementu %d %s %s\n"
+
+#: pg_backup_archiver.c:3972
+#, c-format
+msgid "finished main parallel loop\n"
+msgstr "kończenie głównej pętli współbieżności\n"
+
+#: pg_backup_archiver.c:3981
+#, c-format
+msgid "entering restore_toc_entries_postfork\n"
+msgstr "wejście do restore_toc_entries_postfork\n"
+
+#: pg_backup_archiver.c:4000
+#, c-format
+msgid "processing missed item %d %s %s\n"
+msgstr "przetwarzanie brakujÄ…cego elementu %d %s %s\n"
+
+#: pg_backup_archiver.c:4151
+#, c-format
+msgid "no item ready\n"
+msgstr "brak gotowego elementu\n"
+
+#: pg_backup_archiver.c:4370
+#, c-format
+msgid "transferring dependency %d -> %d to %d\n"
+msgstr "przenoszenie zależności %d -> %d do %d\n"
+
+#: pg_backup_archiver.c:4443
+#, c-format
+msgid "reducing dependencies for %d\n"
+msgstr "redukcja zależności dla %d\n"
+
+#: pg_backup_archiver.c:4482
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data\n"
+msgstr "tabela \"%s\" nie mogła zostać utworzona, jej dane nie zostaną odtworzone\n"
+
+#. translator: this is a module name
+#: pg_backup_custom.c:93
+msgid "custom archiver"
+msgstr "archiwizer użytkownika"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:150
+#, c-format
+msgid "invalid OID for large object\n"
+msgstr "niepoprawny OID dla dużego obiektu\n"
+
+#: pg_backup_custom.c:451
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive\n"
+msgstr "nierozpoznany typ bloku danych (%d) podczas przeszukiwania archiwum\n"
+
+#: pg_backup_custom.c:462
+#, c-format
+msgid "error during file seek: %s\n"
+msgstr "błąd podczas przeglądania pliku: %s\n"
+
+#: pg_backup_custom.c:472
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n"
+msgstr "nie można znaleźć bloku o ID %d w archiwum -- być może ze względu na żądanie nieuporządkowanego odtwarzania, które nie może być obsłużone przez brak offsetów danych w archiwum\n"
+
+#: pg_backup_custom.c:477
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file\n"
+msgstr "nie można znaleźć bloku o ID %d w archiwum -- być może ze względu na uszkodzone żądanie odtwarzania, które nie może być obsłużone przez niepozycjonowany plik wejścia\n"
+
+#: pg_backup_custom.c:482
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive\n"
+msgstr "nie można znaleźć bloku o ID %d w archiwum -- archiwum jest być może uszkodzone\n"
+
+#: pg_backup_custom.c:489
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d\n"
+msgstr "podczas odczytu danych znaleziono nieoczekiwany blok o ID (%d) -- oczekiwano %d\n"
+
+#: pg_backup_custom.c:503
+#, c-format
+msgid "unrecognized data block type %d while restoring archive\n"
+msgstr "nierozpoznany typ bloku danych %d podczas odtwarzania archiwum\n"
+
+#: pg_backup_custom.c:705 pg_backup_custom.c:759 pg_backup_custom.c:844
+#: pg_backup_tar.c:1090
+#, c-format
+msgid "could not determine seek position in archive file: %s\n"
+msgstr "nie można określić pozycji przesunięcia w pliku archiwum: %s\n"
+
+#: pg_backup_custom.c:723 pg_backup_custom.c:764
+#, c-format
+msgid "could not close archive file: %s\n"
+msgstr "nie można zamknąć pliku archiwum: %s\n"
+
+#: pg_backup_custom.c:746
+#, c-format
+msgid "can only reopen input archives\n"
+msgstr "można tylko odtworzyć ponownie archiwa wejściowe\n"
+
+#: pg_backup_custom.c:753
+#, c-format
+msgid "parallel restore from standard input is not supported\n"
+msgstr "współbieżne odtwarzanie ze standardowego wejścia nie jest obsługiwane\n"
+
+#: pg_backup_custom.c:755
+#, c-format
+msgid "parallel restore from non-seekable file is not supported\n"
+msgstr "współbieżne odtwarzanie z nieprzeszukiwalnego pliku nie jest obsługiwane\n"
+
+#: pg_backup_custom.c:774
+#, c-format
+msgid "could not set seek position in archive file: %s\n"
+msgstr "nie można ustawić pozycji przeszukiwania w pliku archiwum: %s\n"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "compressor active\n"
+msgstr "aktywny kompresor\n"
+
+#: pg_backup_custom.c:848
+#, c-format
+msgid "WARNING: ftell mismatch with expected position -- ftell used\n"
+msgstr "OSTRZEŻENIE: niezgodność ftell z oczekiwaną pozycją -- użyto ftel\n"
+
+#. translator: this is a module name
+#: pg_backup_db.c:29
+msgid "archiver (db)"
+msgstr "archiwizator (db)"
+
+#: pg_backup_db.c:45
+#, c-format
+msgid "could not get server_version from libpq\n"
+msgstr "nie można pobrać server_version z libpq\n"
+
+#: pg_backup_db.c:56 pg_dumpall.c:2056
+#, c-format
+msgid "server version: %s; %s version: %s\n"
+msgstr "wersja serwera: %s; %s w wersji: %s\n"
+
+#: pg_backup_db.c:58 pg_dumpall.c:2058
+#, c-format
+msgid "aborting because of server version mismatch\n"
+msgstr "przerwano z powodu niezgodności wersji serwera\n"
+
+#: pg_backup_db.c:148
+#, c-format
+msgid "connecting to database \"%s\" as user \"%s\"\n"
+msgstr "łączenie z bazą danych \"%s\" jako użytkownik \"%s\"\n"
+
+#: pg_backup_db.c:155 pg_backup_db.c:204 pg_backup_db.c:265 pg_backup_db.c:306
+#: pg_dumpall.c:1879 pg_dumpall.c:1993
+msgid "Password: "
+msgstr "Hasło: "
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "failed to reconnect to database\n"
+msgstr "nie udało się połączyć ponownie z bazą danych\n"
+
+#: pg_backup_db.c:192
+#, c-format
+msgid "could not reconnect to database: %s"
+msgstr "nie można połączyć się ponownie z bazą danych: %s"
+
+#: pg_backup_db.c:208
+#, c-format
+msgid "connection needs password\n"
+msgstr "połączenie wymaga hasła\n"
+
+#: pg_backup_db.c:259
+#, c-format
+msgid "already connected to a database\n"
+msgstr "już połączono z bazą danych\n"
+
+#: pg_backup_db.c:298
+#, c-format
+msgid "failed to connect to database\n"
+msgstr "nie udało się połączyć z bazą danych\n"
+
+#: pg_backup_db.c:314
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "połączenie z bazą danych \"%s\" nie powiodło się: %s"
+
+#: pg_backup_db.c:382
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:389
+#, c-format
+msgid "query failed: %s"
+msgstr "zapytanie nie powiodło się: %s"
+
+#: pg_backup_db.c:391
+#, c-format
+msgid "query was: %s\n"
+msgstr "zapytanie brzmiało: %s\n"
+
+#: pg_backup_db.c:433
+#, c-format
+msgid "query returned %d row instead of one: %s\n"
+msgid_plural "query returned %d rows instead of one: %s\n"
+msgstr[0] "zapytanie zwróciło %d wiersz zamiast: %s\n"
+msgstr[1] "zapytanie zwróciło %d wiersze zamiast: %s\n"
+msgstr[2] "zapytanie zwróciło %d wierszy zamiast: %s\n"
+
+#: pg_backup_db.c:469
+#, c-format
+msgid "%s: %s Command was: %s\n"
+msgstr "%s: %s Polecenie brzmiało: %s\n"
+
+#: pg_backup_db.c:525 pg_backup_db.c:599 pg_backup_db.c:606
+msgid "could not execute query"
+msgstr "nie można wykonać zapytania"
+
+#: pg_backup_db.c:578
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "błąd zwrócony przez PQputCopyData: %s"
+
+#: pg_backup_db.c:627
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "błąd zwrócony przez PQputCopyEnd: %s"
+
+#: pg_backup_db.c:633
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "nie udało się COPY dla tabeli \"%s\": %s"
+
+#: pg_backup_db.c:639 pg_dump.c:1841
+#, c-format
+msgid "WARNING: unexpected extra results during COPY of table \"%s\"\n"
+msgstr "OSTRZEŻENIE: nieoczekiwane dodatkowe wyniki podczas COPY tabeli \"%s\"\n"
+
+#: pg_backup_db.c:651
+msgid "could not start database transaction"
+msgstr "nie można uruchomić transakcji na bazie danych"
+
+#: pg_backup_db.c:659
+msgid "could not commit database transaction"
+msgstr "nie można zatwierdzić transakcji na bazie danych"
+
+#. translator: this is a module name
+#: pg_backup_directory.c:65
+msgid "directory archiver"
+msgstr "archiwizator folderów"
+
+#: pg_backup_directory.c:157
+#, c-format
+msgid "no output directory specified\n"
+msgstr "nie wskazano folderu wyjściowego\n"
+
+#: pg_backup_directory.c:186
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "nie można czytać katalogu \"%s\": %s\n"
+
+#: pg_backup_directory.c:190
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "nie można zamknąć katalogu \"%s\": %s\n"
+
+#: pg_backup_directory.c:196
+#, c-format
+msgid "could not create directory \"%s\": %s\n"
+msgstr "nie można utworzyć folderu \"%s\": %s\n"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file: %s\n"
+msgstr "nie można zamknąć pliku danych: %s\n"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %s\n"
+msgstr "nie można otworzyć pliku TOC dużych obiektów \"%s\" do odczytu: %s\n"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\"\n"
+msgstr "niepoprawna linia w pliku TOC dużych obiektów \"%s\": \"%s\"\n"
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\"\n"
+msgstr "błąd odczytu pliku TOC dużych obiektów \"%s\"\n"
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %s\n"
+msgstr "nie można zamknąć pliku TOC dużych obiektów \"%s\": %s\n"
+
+#: pg_backup_directory.c:686
+#, c-format
+msgid "could not write to blobs TOC file\n"
+msgstr "nie można zapisać do pliku TOC blobów\n"
+
+#: pg_backup_directory.c:718
+#, c-format
+msgid "file name too long: \"%s\"\n"
+msgstr "zbyt długa nazwa pliku: \"%s\"\n"
+
+#: pg_backup_null.c:75
+#, c-format
+msgid "this format cannot be read\n"
+msgstr "ten format nie mógł zostać odczytany\n"
+
+#. translator: this is a module name
+#: pg_backup_tar.c:103
+msgid "tar archiver"
+msgstr "archiwizator tar"
+
+#: pg_backup_tar.c:181
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %s\n"
+msgstr "nie można otworzyć pliku TOC \"%s\" do zapisu: %s\n"
+
+#: pg_backup_tar.c:189
+#, c-format
+msgid "could not open TOC file for output: %s\n"
+msgstr "nie można otworzyć pliku TOC do zapisu: %s\n"
+
+#: pg_backup_tar.c:210 pg_backup_tar.c:366
+#, c-format
+msgid "compression is not supported by tar archive format\n"
+msgstr "kompresja nie jest obsługiwana przez format archiwum tar\n"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %s\n"
+msgstr "nie można otworzyć pliku TOC \"%s\" do odczytu: %s\n"
+
+#: pg_backup_tar.c:225
+#, c-format
+msgid "could not open TOC file for input: %s\n"
+msgstr "nie można otworzyć pliku TOC do odczytu: %s\n"
+
+#: pg_backup_tar.c:352
+#, c-format
+msgid "could not find file \"%s\" in archive\n"
+msgstr "nie można znaleźć pliku \"%s\" w archiwum\n"
+
+#: pg_backup_tar.c:418
+#, c-format
+msgid "could not generate temporary file name: %s\n"
+msgstr "nie można utworzyć nazwy pliku tymczasowego: %s\n"
+
+#: pg_backup_tar.c:429
+#, c-format
+msgid "could not open temporary file\n"
+msgstr "nie można otworzyć pliku tymczasowego\n"
+
+#: pg_backup_tar.c:456
+#, c-format
+msgid "could not close tar member\n"
+msgstr "nie można zamknąć składnika tar\n"
+
+#: pg_backup_tar.c:569
+#, c-format
+msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+msgstr "błąd wewnętrzny -- nie wskazano ani th ani fh w tarReadRaw()\n"
+
+#: pg_backup_tar.c:692
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\"\n"
+msgstr "nieoczekiwana składnia deklaracji COPY: \"%s\"\n"
+
+#: pg_backup_tar.c:962
+#, c-format
+msgid "invalid OID for large object (%u)\n"
+msgstr "niepoprawny OID dla dużego obiektu (%u)\n"
+
+#: pg_backup_tar.c:1106
+#, c-format
+msgid "could not close temporary file: %s\n"
+msgstr "nie można zamknąć pliku tymczasowego: %s\n"
+
+#: pg_backup_tar.c:1116
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)\n"
+msgstr "faktyczna długość pliku (%s) nie zgadza z oczekiwaną (%s)\n"
+
+#: pg_backup_tar.c:1153
+#, c-format
+msgid "moving from position %s to next member at file position %s\n"
+msgstr "przeniesienie z pozycji %s do następnego składnika na pozycji pliku %s\n"
+
+#: pg_backup_tar.c:1164
+#, c-format
+msgid "now at file position %s\n"
+msgstr "obecnie na pozycji pliku %s\n"
+
+#: pg_backup_tar.c:1173 pg_backup_tar.c:1203
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive\n"
+msgstr "nie można znaleźć nagłówka dla pliku \"%s\" w archiwum tar\n"
+
+#: pg_backup_tar.c:1187
+#, c-format
+msgid "skipping tar member %s\n"
+msgstr "pominięcie składnika tar %s\n"
+
+#: pg_backup_tar.c:1191
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file.\n"
+msgstr "przywrócenie danych w niepoprawnej kolejności nie jest obsługiwane w tym formacie archiwum: wymagane jest \"%s\", ale występuje przed \"%s\" w pliku archiwum.\n"
+
+#: pg_backup_tar.c:1237
+#, c-format
+msgid "incomplete tar header found (%lu byte)\n"
+msgid_plural "incomplete tar header found (%lu bytes)\n"
+msgstr[0] "znaleziono niepełny nagłówek tar (%lu bajt)\n"
+msgstr[1] "znaleziono niepełny nagłówek tar (%lu bajty)\n"
+msgstr[2] "znaleziono niepełny nagłówek tar (%lu bajtów)\n"
+
+#: pg_backup_tar.c:1278
+#, c-format
+msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+msgstr "Wpis TOC %s na %s (długość %s, suma kontrolna %d)\n"
+
+#: pg_backup_tar.c:1289
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s\n"
+msgstr "znaleziono uszkodzony nagłówek tar w %s (oczekiwano %d, wyliczono %d) pozycja pliku %s\n"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "%s: unrecognized section name: \"%s\"\n"
+msgstr "%s: nierozpoznana nazwa sekcji: \"%s\"\n"
+
+#: pg_backup_utils.c:56 pg_dump.c:546 pg_dump.c:563 pg_dumpall.c:309
+#: pg_dumpall.c:319 pg_dumpall.c:329 pg_dumpall.c:338 pg_dumpall.c:354
+#: pg_dumpall.c:363 pg_dumpall.c:431 pg_restore.c:281 pg_restore.c:297
+#: pg_restore.c:309
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_backup_utils.c:118
+#, c-format
+msgid "out of on_exit_nicely slots\n"
+msgstr "zabrakło gniazd on_exit_nicely\n"
+
+#: pg_dump.c:512
+#, c-format
+msgid "compression level must be in range 0..9\n"
+msgstr "poziom kompresji musi być z zakresu 0..9\n"
+
+#: pg_dump.c:561 pg_dumpall.c:317 pg_restore.c:295
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_dump.c:582
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together\n"
+msgstr "opcje -s/--schema-only i -a/--data-only nie mogą być używane razem\n"
+
+#: pg_dump.c:588
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together\n"
+msgstr "opcje -c/--clean i -a/--data-only nie mogą być używane razem\n"
+
+#: pg_dump.c:594
+#, c-format
+msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+msgstr "opcje --inserts/--column-inserts i -o/--oids nie mogą być używane razem\n"
+
+#: pg_dump.c:595
+#, c-format
+msgid "(The INSERT command cannot set OIDs.)\n"
+msgstr "(Polecenie INSERT nie może ustawiać OIDów.)\n"
+
+#: pg_dump.c:600
+#, c-format
+msgid "option --if-exists requires option -c/--clean\n"
+msgstr "opcja --if-exists wymaga opcji -c/--clean\n"
+
+#: pg_dump.c:622
+#, c-format
+msgid "WARNING: requested compression not available in this installation -- archive will be uncompressed\n"
+msgstr "OSTRZEŻENIE: żądana kompresja jest niedostępna w tej instalacji -- archiwum nie będzie spakowane\n"
+
+#: pg_dump.c:637
+#, c-format
+msgid "invalid number of parallel jobs\n"
+msgstr "nieprawidłowa liczba zadań współbieżnych\n"
+
+#: pg_dump.c:641
+#, c-format
+msgid "parallel backup only supported by the directory format\n"
+msgstr "współbieżne tworzenie kopii zapasowej nie jest obsługiwane w tym formacie archiwum\n"
+
+#: pg_dump.c:696
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots.\n"
+msgstr ""
+"Synchronizowane migawki nie są obsługiwane przez tą wersję serwera.\n"
+"Można uruchomić z --no-synchronized-snapshots jeśli nie są potrzebne\n"
+"migawki synchronizowane.\n"
+
+#: pg_dump.c:703
+#, c-format
+msgid "Exported snapshots are not supported by this server version.\n"
+msgstr "Eksportowane migawki nie są obsługiwane przez tą wersję serwera.\n"
+
+#: pg_dump.c:717
+#, c-format
+msgid "last built-in OID is %u\n"
+msgstr "ostatni wbudowany OID to %u\n"
+
+#: pg_dump.c:726
+#, c-format
+msgid "no matching schemas were found\n"
+msgstr "nie znaleziono pasujących schematów\n"
+
+#: pg_dump.c:740
+#, c-format
+msgid "no matching tables were found\n"
+msgstr "nie znaleziono pasujÄ…cych tabel\n"
+
+#: pg_dump.c:913
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s zrzuca bazę danych jako plik tekstowy lub do innych formatów.\n"
+"\n"
+
+#: pg_dump.c:914 pg_dumpall.c:576 pg_restore.c:446
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: pg_dump.c:915
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCJA]... [NAZWADB]\n"
+
+#: pg_dump.c:917 pg_dumpall.c:579 pg_restore.c:449
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opcje ogólne:\n"
+
+#: pg_dump.c:918
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=NAZWAPLIKU nazwa pliku lub folderu wyjścia\n"
+
+#: pg_dump.c:919
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p format pliku wyjścia (c-użytkownika, d-folder, \n"
+" t-tar, p-tekstowy (domyślny))\n"
+
+#: pg_dump.c:921
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM użycie tylu równoległych zadań przy zrzucie\n"
+
+#: pg_dump.c:922 pg_dumpall.c:581
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose tryb informacji szczegółowych\n"
+
+#: pg_dump.c:923 pg_dumpall.c:582
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: pg_dump.c:924
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 poziom kompresji dla formatów kompresujących\n"
+
+#: pg_dump.c:925 pg_dumpall.c:583
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=LIMITCZASU\n"
+" niepowodzenie blokowania tabeli po LIMITCZASU\n"
+
+#: pg_dump.c:926 pg_dumpall.c:603
+#, c-format
+#| msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync nie czekać aż zmiany zostaną bezpiecznie "
+"zapisane na dysk\n"
+
+#: pg_dump.c:927 pg_dumpall.c:584
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_dump.c:929 pg_dumpall.c:585
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Opcje kontrolujące zawartość wyjścia:\n"
+
+#: pg_dump.c:930 pg_dumpall.c:586
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only zrzuca tylko dane, bez schematu\n"
+
+#: pg_dump.c:931
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs dodaje duże obiekty do zrzutu\n"
+
+#: pg_dump.c:932
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs wyklucza duże obiekty ze zrzutu\n"
+
+#: pg_dump.c:933 pg_restore.c:460
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean czyszczenie (kasowanie) obiektów baz danych przed odtworzeniem\n"
+
+#: pg_dump.c:934
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create dodaje polecenia tworzenia bazy danych w zrzucie\n"
+
+#: pg_dump.c:935
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KODOWANIE zrzuca dane w kodowaniu KODOWANIE\n"
+
+#: pg_dump.c:936
+#, c-format
+msgid " -n, --schema=SCHEMA dump the named schema(s) only\n"
+msgstr " -n, --schema=SCHEMAT zrzuca tylko nazwany schemat(y)\n"
+
+#: pg_dump.c:937
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do NOT dump the named schema(s)\n"
+msgstr ""
+" -N, --exclude-schema=SCHEMAT\n"
+" NIE zrzuca nazwanych schematów\n"
+
+#: pg_dump.c:938 pg_dumpall.c:589
+#, c-format
+msgid " -o, --oids include OIDs in dump\n"
+msgstr " -o, --oids dodaje OIDy do zrzutu\n"
+
+#: pg_dump.c:939
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner pomija odtworzenie wskazania właściciela obiektu\n"
+" w formacie tekstowym\n"
+
+#: pg_dump.c:941 pg_dumpall.c:592
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only zrzuca tylko schemat, bez danych\n"
+
+#: pg_dump.c:942
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAZWA nazwa superużytkownika używana w formacie tekstowym\n"
+
+#: pg_dump.c:943
+#, c-format
+msgid " -t, --table=TABLE dump the named table(s) only\n"
+msgstr " -t, --table=TABELA zrzuca tylko tabelÄ™ wedle nazwy\n"
+
+#: pg_dump.c:944
+#, c-format
+msgid " -T, --exclude-table=TABLE do NOT dump the named table(s)\n"
+msgstr " -T, --exclude-table=TABELA NIE zrzuca tabeli o tej nazwie\n"
+
+#: pg_dump.c:945 pg_dumpall.c:595
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges nie zrzuca przywilejów (grant/revoke)\n"
+
+#: pg_dump.c:946 pg_dumpall.c:596
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade używane tylko przez narzędzia aktualizacji\n"
+
+#: pg_dump.c:947 pg_dumpall.c:597
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts zrzuca dane jako polecenia INSERT z nazwami kolumn\n"
+
+#: pg_dump.c:948 pg_dumpall.c:598
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting blokuje cytowanie dolarem, używa standardowego cytowania SQL\n"
+
+#: pg_dump.c:949 pg_dumpall.c:599 pg_restore.c:477
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers wyłącza wyzwalacze podczas odtwarzania wyłącznie danych\n"
+
+#: pg_dump.c:950
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security włącz bezpieczeństwo wierszy (zrzucaj tylko to\n"
+" do czego użytkownik ma dostęp)\n"
+
+#: pg_dump.c:952
+#, c-format
+msgid " --exclude-table-data=TABLE do NOT dump data for the named table(s)\n"
+msgstr " --exclude-table-data=TABELA NIE zrzuca danych tabeli o tej nazwie\n"
+
+#: pg_dump.c:953 pg_dumpall.c:600 pg_restore.c:479
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists używa IF EXISTS podczas kasowania obiektów\n"
+
+#: pg_dump.c:954
+#, c-format
+msgid " --include-subscriptions dump logical replication subscriptions\n"
+msgstr " --include-subscriptions zrzuca subskrypcje replikacji logicznych\n"
+
+#: pg_dump.c:955 pg_dumpall.c:601
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts zrzuca dane jako polecenia INSERT zamiast COPY\n"
+
+#: pg_dump.c:956 pg_dumpall.c:602
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels nie zrzuca przypisań etykiet bezpieczeństwa\n"
+
+#: pg_dump.c:957
+#, c-format
+msgid " --no-subscription-connect dump subscriptions so they don't connect on restore\n"
+msgstr " --no-subscription-connect wyrzuć subsckrypcje by nie mogły się połączyć "
+"przy odtworzeniu\n"
+
+#: pg_dump.c:958
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots nie używaj migawek synchronizowanych w zadaniach współbieżnych\n"
+
+#: pg_dump.c:959 pg_dumpall.c:604
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces nie zrzuca przypisań do przestrzeni tabel\n"
+
+#: pg_dump.c:960 pg_dumpall.c:605
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data nie zrzuca niezalogowanych danych tabeli\n"
+
+#: pg_dump.c:961 pg_dumpall.c:607
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers cytuje wszystkie identyfikatory, jeśli tylko\n"
+" nie są to słowa kluczowe\n"
+
+#: pg_dump.c:962
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION zrzuca nazwanÄ… sekcjÄ™ (pre-dane, dane, lub post-dane)\n"
+
+#: pg_dump.c:963
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr ""
+" --serializable-deferrable czeka póki zrzut wykonuje się \n"
+" bez nieprawidłowości\n"
+
+#: pg_dump.c:964
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=MIGAWKA używa wskazanej migawki do zrzutu\n"
+
+#: pg_dump.c:965 pg_restore.c:485
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names wymaga by wzorce zawierania tabeli i/lub schematu\n"
+" pasowały każda do co najmniej jednej encji\n"
+
+#: pg_dump.c:967 pg_dumpall.c:608 pg_restore.c:487
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" używa poleceń SET SESSION AUTHORIZATION zamiast\n"
+" poleceń ALTER OWNER by ustawić właściciela\n"
+
+#: pg_dump.c:971 pg_dumpall.c:612 pg_restore.c:491
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opcje połączenia:\n"
+
+#: pg_dump.c:972
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=NAZWADB baza danych do utworzenia kopii\n"
+
+#: pg_dump.c:973 pg_dumpall.c:614 pg_restore.c:492
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NAZWAHOSTA host serwera bazy danych lub katalog gniazda\n"
+
+#: pg_dump.c:974 pg_dumpall.c:616 pg_restore.c:493
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT numer portu na serwera bazy dnaych\n"
+
+#: pg_dump.c:975 pg_dumpall.c:617 pg_restore.c:494
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAZWA połączenie jako wskazany użytkownik bazy\n"
+
+#: pg_dump.c:976 pg_dumpall.c:618 pg_restore.c:495
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nie pytaj nigdy o hasło\n"
+
+#: pg_dump.c:977 pg_dumpall.c:619 pg_restore.c:496
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password wymuś pytanie o hasło (powinno nastąpić automatycznie)\n"
+
+#: pg_dump.c:978 pg_dumpall.c:620
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=NAZWAROLI wykonuje SET ROLE przed odtworzeniem\n"
+
+#: pg_dump.c:980
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Jeśli nie dostarczono nazwy bazy danych, używana jest zmienna\n"
+"środowiskowa PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:982 pg_dumpall.c:624 pg_restore.c:503
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_dump.c:999
+#, c-format
+msgid "invalid client encoding \"%s\" specified\n"
+msgstr "wskazano niepoprawne kodowanie klienta \"%s\"\n"
+
+#: pg_dump.c:1136
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported on standby servers.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots.\n"
+msgstr ""
+"Synchronizowane migawki nie są obsługiwane na serwerach w trybie gotowości.\n"
+"Można uruchomić z --no-synchronized-snapshots jeśli nie są potrzebne\n"
+"migawki synchronizowane.\n"
+
+#: pg_dump.c:1205
+#, c-format
+msgid "invalid output format \"%s\" specified\n"
+msgstr "wskazano niepoprawny format wyjścia \"%s\"\n"
+
+#: pg_dump.c:1243
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\"\n"
+msgstr "nie znaleziono schematów pasujących do wzorca \"%s\"\n"
+
+#: pg_dump.c:1297
+#, c-format
+msgid "no matching tables were found for pattern \"%s\"\n"
+msgstr "nie znaleziono tabel pasujÄ…cych do wzorca \"%s\"\n"
+
+#: pg_dump.c:1701
+#, c-format
+msgid "dumping contents of table \"%s.%s\"\n"
+msgstr "zrzut zawartości tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:1822
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.\n"
+msgstr "Nie powiódł się zrzut zawartości tabeli \"%s\": niepowodzenie PQgetCopyData().\n"
+
+#: pg_dump.c:1823 pg_dump.c:1833
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Komunikat błędu z serwera: %s"
+
+#: pg_dump.c:1824 pg_dump.c:1834
+#, c-format
+msgid "The command was: %s\n"
+msgstr "Treść polecenia: %s\n"
+
+#: pg_dump.c:1832
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed.\n"
+msgstr "Nie powiódł się zrzut zawartości tabeli \"%s\": niepowodzenie PQgetResult().\n"
+
+#: pg_dump.c:2481
+#, c-format
+msgid "saving database definition\n"
+msgstr "zapis definicji bazy danych\n"
+
+#: pg_dump.c:2787
+#, c-format
+msgid "saving encoding = %s\n"
+msgstr "zapis kodowania = %s\n"
+
+#: pg_dump.c:2814
+#, c-format
+msgid "saving standard_conforming_strings = %s\n"
+msgstr "zapis standard_conforming_strings = %s\n"
+
+#: pg_dump.c:2854
+#, c-format
+msgid "reading large objects\n"
+msgstr "odczyt dużych obiektów\n"
+
+#: pg_dump.c:3049
+#, c-format
+msgid "saving large objects\n"
+msgstr "zapis dużych obiektów\n"
+
+#: pg_dump.c:3094
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "błąd odczytu dużego obiektu %u: %s"
+
+#: pg_dump.c:3147
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\"\n"
+msgstr "odczyt włączonych zabezpieczeń wiersza dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:3179
+#, c-format
+msgid "reading policies for table \"%s.%s\"\n"
+msgstr "odczyt polityk dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:3329
+#, c-format
+msgid "unexpected policy command type: %c\n"
+msgstr "nieoczekiwany typ polecenia polityki %c\n"
+
+#: pg_dump.c:3444
+#, c-format
+msgid "WARNING: owner of publication \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel publikacji \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:3550
+#, c-format
+msgid "reading publication membership for table \"%s.%s\"\n"
+msgstr "odczyt członkostwa publikacji dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:3715
+#, c-format
+msgid "WARNING: owner of subscription \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel subskrypcji \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:3755
+#, c-format
+msgid "WARNING: could not parse subpublications array\n"
+msgstr "OSTRZEŻENIE: nie można przeanalizować tablicy podpublikacji\n"
+
+#: pg_dump.c:3980
+#, c-format
+msgid "could not find parent extension for %s\n"
+msgstr "nie można odnaleźć rozszerzenia nadrzędnego dla %s\n"
+
+#: pg_dump.c:4129
+#, c-format
+msgid "WARNING: owner of schema \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel schematu \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:4152
+#, c-format
+msgid "schema with OID %u does not exist\n"
+msgstr "schemat z OID %u nie istnieje\n"
+
+#: pg_dump.c:4483
+#, c-format
+msgid "WARNING: owner of data type \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel typu danych \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:4571
+#, c-format
+msgid "WARNING: owner of operator \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel operatora \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:4885
+#, c-format
+msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel klasy operatora \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:4972
+#, c-format
+msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel rodziny operatora \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:5139
+#, c-format
+msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel funkcji agregującej \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:5398
+#, c-format
+msgid "WARNING: owner of function \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel funkcji \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:6123
+#, c-format
+msgid "WARNING: owner of table \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: właściciel tabeli \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:6165 pg_dump.c:16458
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found\n"
+msgstr "sprawdzenia nie powiodły się, nie odnaleziono tabeli nadrzędnej o OID %u dla sekwencji o OID %u\n"
+
+#: pg_dump.c:6366
+#, c-format
+msgid "reading indexes for table \"%s.%s\"\n"
+msgstr "odczyt indeksów dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:6642
+#, c-format
+#| msgid "reading indexes for table \"%s.%s\"\n"
+msgid "reading extended statistics for table \"%s.%s\"\n"
+msgstr "odczyt rozszerzonych statystyk dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:6725
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\"\n"
+msgstr "odczyt ograniczeń kluczy obcych dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:6949
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found\n"
+msgstr "sprawdzenia nie powiodły się, nie odnaleziono tabeli nadrzędnej o OID %u dla wpisu pg_rewrite o OID %u\n"
+
+#: pg_dump.c:7033
+#, c-format
+msgid "reading triggers for table \"%s.%s\"\n"
+msgstr "odczyt wyzwalaczy dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:7171
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)\n"
+msgstr "zapytanie dało w wyniku puste wskazanie nazwy tabeli dla wyzwalacza klucza obcego \"%s\" dla tabeli \"%s\" (UID tabeli: %u)\n"
+
+#: pg_dump.c:7786
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\"\n"
+msgstr "wyszukiwanie kolumn i typów dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:7951
+#, c-format
+msgid "invalid column numbering in table \"%s\"\n"
+msgstr "niepoprawna numeracja kolumn dla tabeli \"%s\"\n"
+
+#: pg_dump.c:7987
+#, c-format
+msgid "finding default expressions of table \"%s.%s\"\n"
+msgstr "wyszukiwanie wyrażeń domyślnych dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:8010
+#, c-format
+msgid "invalid adnum value %d for table \"%s\"\n"
+msgstr "niepoprawna wartość adnum %d dla tabeli \"%s\"\n"
+
+#: pg_dump.c:8076
+#, c-format
+msgid "finding check constraints for table \"%s.%s\"\n"
+msgstr "odczyt ograniczeń sprawdzających dla tabeli \"%s.%s\"\n"
+
+#: pg_dump.c:8125
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d\n"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d\n"
+msgstr[0] "oczekiwano %d-go ograniczenia sprawdzajÄ…ce na tabeli \"%s\" ale znaleziono %d\n"
+msgstr[1] "oczekiwano %d-ch ograniczeń sprawdzających na tabeli \"%s\" ale znaleziono %d\n"
+msgstr[2] "oczekiwano %d ograniczeń sprawdzających na tabeli \"%s\" ale znaleziono %d\n"
+
+#: pg_dump.c:8129
+#, c-format
+msgid "(The system catalogs might be corrupted.)\n"
+msgstr "(Foldery systemowe mogą być uszkodzone.)\n"
+
+#: pg_dump.c:9687
+#, c-format
+msgid "WARNING: typtype of data type \"%s\" appears to be invalid\n"
+msgstr "OSTRZEŻENIE: typtype typu danych \"%s\" wydaje się być niepoprawny\n"
+
+#: pg_dump.c:11116
+#, c-format
+msgid "WARNING: bogus value in proargmodes array\n"
+msgstr "OSTRZEŻENIE: błędna wartość w tablicy proargmodes\n"
+
+#: pg_dump.c:11442
+#, c-format
+msgid "WARNING: could not parse proallargtypes array\n"
+msgstr "OSTRZEŻENIE: nie można przeanalizować tablicy proallargtypes\n"
+
+#: pg_dump.c:11458
+#, c-format
+msgid "WARNING: could not parse proargmodes array\n"
+msgstr "OSTRZEŻENIE: nie można przeanalizować tablicy proargmodes\n"
+
+#: pg_dump.c:11472
+#, c-format
+msgid "WARNING: could not parse proargnames array\n"
+msgstr "OSTRZEŻENIE: nie można przeanalizować tablicy proargnames\n"
+
+#: pg_dump.c:11483
+#, c-format
+msgid "WARNING: could not parse proconfig array\n"
+msgstr "OSTRZEŻENIE: nie można przeanalizować tablicy proconfig\n"
+
+#: pg_dump.c:11554
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\"\n"
+msgstr "nierozpoznana wartość provolatile dla funkcji \"%s\"\n"
+
+#: pg_dump.c:11598 pg_dump.c:13581
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\"\n"
+msgstr "nierozpoznana wartość proparallel dla funkcji \"%s\"\n"
+
+#: pg_dump.c:11706 pg_dump.c:11816 pg_dump.c:11823
+#, c-format
+msgid "could not find function definition for function with OID %u\n"
+msgstr "nie udało się znaleźć definicji dla funkcji o OID %u\n"
+
+#: pg_dump.c:11751
+#, c-format
+msgid "WARNING: bogus value in pg_cast.castfunc or pg_cast.castmethod field\n"
+msgstr "OSTRZEŻENIE: błędna wartość w pg_cast.castfunc lub nie udało się wykonać pg_cast.castmethod\n"
+
+#: pg_dump.c:11754
+#, c-format
+msgid "WARNING: bogus value in pg_cast.castmethod field\n"
+msgstr "OSTRZEŻENIE: błędna wartość pola pg_cast.castmethod\n"
+
+#: pg_dump.c:11844
+#, c-format
+msgid "WARNING: bogus transform definition, at least one of trffromsql and trftosql should be nonzero\n"
+msgstr "OSTRZEŻENIE: błędna definicja transformacji, co najmniej jedna z trffromsql i trftosql powinna być niezerowa\n"
+
+#: pg_dump.c:11861
+#, c-format
+msgid "WARNING: bogus value in pg_transform.trffromsql field\n"
+msgstr "OSTRZEŻENIE: błędna wartość pola pg_transform.trffromsql\n"
+
+#: pg_dump.c:11882
+#, c-format
+msgid "WARNING: bogus value in pg_transform.trftosql field\n"
+msgstr "OSTRZEŻENIE: błędna wartość pola pg_transform.trftosql\n"
+
+#: pg_dump.c:12278
+#, c-format
+msgid "WARNING: invalid type \"%c\" of access method \"%s\"\n"
+msgstr "OSTRZEŻENIE: niepoprawny typ \"%c\" metody dostępu \"%s\"\n"
+
+#: pg_dump.c:13044
+#, c-format
+#| msgid "%s: unrecognized operation mode \"%s\"\n"
+msgid "unrecognized collation provider: %s\n"
+msgstr "nierozpoznany dostawca porównania: %s\n"
+
+#: pg_dump.c:13491
+#, c-format
+msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n"
+msgstr "OSTRZEŻENIE: funkcja agregująca %s nie może być poprawnie zrzucona dla tej wersji bazy danych; zignorowano\n"
+
+#: pg_dump.c:14347
+#, c-format
+msgid "unrecognized object type in default privileges: %d\n"
+msgstr "nieznany typ obiektu w uprawnieniach domyślnych: %d\n"
+
+#: pg_dump.c:14365
+#, c-format
+msgid "could not parse default ACL list (%s)\n"
+msgstr "nie można przetworzyć domyślnej listy ACL (%s)\n"
+
+#: pg_dump.c:14436
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)\n"
+msgstr "nie udało się przetworzyć początkowej listy GRANT ACL (%s) albo początkowej listy REVOKE ACL (%s) dla obiektu \"%s\" (%s)\n"
+
+#: pg_dump.c:14444
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)\n"
+msgstr "nie udało się przetworzyć listy GRANT ACL (%s) albo listy REVOKE ACL (%s) dla obiektu \"%s\" (%s)\n"
+
+#: pg_dump.c:14919
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data\n"
+msgstr "zapytanie o definicję widoku \"%s\" nie zwróciło danych\n"
+
+#: pg_dump.c:14922
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition\n"
+msgstr "zapytanie o definicję widoku \"%s\" nie zwróciło więcej niż jedna definicję\n"
+
+#: pg_dump.c:14929
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)\n"
+msgstr "definicja widoku \"%s\" wydaje się pusta (długość zero)\n"
+
+#: pg_dump.c:15776
+#, c-format
+msgid "invalid column number %d for table \"%s\"\n"
+msgstr "niepoprawny numer kolumny %d dla tabeli \"%s\"\n"
+
+#: pg_dump.c:15960
+#, c-format
+msgid "missing index for constraint \"%s\"\n"
+msgstr "brak indeksu dla ograniczenia \"%s\"\n"
+
+#: pg_dump.c:16163
+#, c-format
+msgid "unrecognized constraint type: %c\n"
+msgstr "nierozpoznany typ ograniczenia: %c\n"
+
+#: pg_dump.c:16300 pg_dump.c:16526
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)\n"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)\n"
+msgstr[0] "zapytanie o dane sekwencji \"%s\" zwróciło %d wiersz (oczekiwano 1)\n"
+msgstr[1] "zapytanie o dane sekwencji \"%s\" zwróciło %d wiersze (oczekiwano 1)\n"
+msgstr[2] "zapytanie o dane sekwencji \"%s\" zwróciło %d wierszy (oczekiwano 1)\n"
+
+#: pg_dump.c:16624
+#, c-format
+msgid "unexpected tgtype value: %d\n"
+msgstr "nieoczekiwana wartość tgtype: %d\n"
+
+#: pg_dump.c:16698
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"\n"
+msgstr "niepoprawny ciÄ…g argumentu (%s) dla wyzwalacza \"%s\" tabeli \"%s\"\n"
+
+#: pg_dump.c:16919
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned\n"
+msgstr "zapytanie o regułę \"%s\" dla tabeli \"%s\" nie powiodło się: zwróciło złą liczbę wierszy\n"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "reading dependency data\n"
+msgstr "odczyt informacji o zależnościach\n"
+
+#: pg_dump.c:17779
+#, c-format
+msgid "WARNING: could not parse reloptions array\n"
+msgstr "OSTRZEŻENIE: nie można przeanalizować tablicy reloptions\n"
+
+#. translator: this is a module name
+#: pg_dump_sort.c:25
+msgid "sorter"
+msgstr "sortujÄ…cy"
+
+#: pg_dump_sort.c:413
+#, c-format
+msgid "invalid dumpId %d\n"
+msgstr "niepoprawny dumpId %d\n"
+
+#: pg_dump_sort.c:419
+#, c-format
+msgid "invalid dependency %d\n"
+msgstr "niepoprawne powiÄ…zanie %d\n"
+
+#: pg_dump_sort.c:652
+#, c-format
+msgid "could not identify dependency loop\n"
+msgstr "nie można zidentyfikować pętli powiązań\n"
+
+#: pg_dump_sort.c:1175
+#, c-format
+msgid "NOTICE: there are circular foreign-key constraints on this table:\n"
+msgid_plural "NOTICE: there are circular foreign-key constraints among these tables:\n"
+msgstr[0] "UWAGA: występuje pętla kluczy obcych w tabeli:\n"
+msgstr[1] "UWAGA: występuje pętla kluczy obcych pomiędzy tabelami:\n"
+msgstr[2] "UWAGA: występuje pętla kluczy obcych pomiędzy tabelami:\n"
+
+#: pg_dump_sort.c:1179 pg_dump_sort.c:1199
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: pg_dump_sort.c:1180
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.\n"
+msgstr "Możesz nie być w stanie odtworzyć zrzutu bez użycia --disable-triggers lub tymczasowego usunięcia ograniczeń.\n"
+
+#: pg_dump_sort.c:1181
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem.\n"
+msgstr "Rozważ wykonanie pełnego zrzutu zamiast kopii --data-only by uniknąć tegoproblemu.\n"
+
+#: pg_dump_sort.c:1193
+#, c-format
+msgid "WARNING: could not resolve dependency loop among these items:\n"
+msgstr "OSTRZEŻENIE: nie można rozwiązać pętli powiązań pomiędzy elementami:\n"
+
+#: pg_dumpall.c:185
+#, c-format
+msgid ""
+"The program \"pg_dump\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"pg_dump\" jest wymagany przez %s ale nie został znaleziony\n"
+"w tym samym folderze co \"%s\".\n"
+"Sprawdź instalację.\n"
+
+#: pg_dumpall.c:192
+#, c-format
+msgid ""
+"The program \"pg_dump\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"pg_dump\" został znaleziony przez \"%s\"\n"
+"ale nie jest w tej samej wersji co %s.\n"
+"Sprawdź instalację.\n"
+
+#: pg_dumpall.c:327
+#, c-format
+msgid "%s: options -g/--globals-only and -r/--roles-only cannot be used together\n"
+msgstr "%s: opcje -g/--globals-only i -r/--roles-only nie mogą być używane razem\n"
+
+#: pg_dumpall.c:336
+#, c-format
+msgid "%s: options -g/--globals-only and -t/--tablespaces-only cannot be used together\n"
+msgstr "%s: opcje -g/--globals-only i -t/--tablespaces-only nie mogą być używane razem\n"
+
+#: pg_dumpall.c:345 pg_restore.c:364
+#, c-format
+msgid "%s: option --if-exists requires option -c/--clean\n"
+msgstr "%s: opcja --if-exists wymaga opcji -c/--clean\n"
+
+#: pg_dumpall.c:352
+#, c-format
+msgid "%s: options -r/--roles-only and -t/--tablespaces-only cannot be used together\n"
+msgstr "%s: opcje -r/--roles-only i -t/--tablespaces-only nie mogą być używane razem\n"
+
+#: pg_dumpall.c:361
+#, c-format
+msgid "%s: options --no-role-passwords and --binary-upgrade cannot be used together\n"
+msgstr "%s: opcje --no-role-passwords i --binary-upgrade nie mogą być używane razem\n"
+
+#: pg_dumpall.c:413 pg_dumpall.c:1982
+#, c-format
+msgid "%s: could not connect to database \"%s\"\n"
+msgstr "%s: nie można połączyć się do bazy danych \"%s\"\n"
+
+#: pg_dumpall.c:428
+#, c-format
+msgid ""
+"%s: could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database.\n"
+msgstr ""
+"%s: n ie udało się połączyć do bazy danych \"postgres\" ani \"template1\"\n"
+"Proszę wskazać alternatywną bazę danych.\n"
+
+#: pg_dumpall.c:445
+#, c-format
+msgid "%s: could not open the output file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku wyjścia \"%s\": %s\n"
+
+#: pg_dumpall.c:575
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s wyciÄ…ga klaster bazy danych PostgreSQL do pliku skryptowego SQL.\n"
+"\n"
+
+#: pg_dumpall.c:577
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCJA]...\n"
+
+#: pg_dumpall.c:580
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=NAZWAPLIKU nazwa pliku wyjścia\n"
+
+#: pg_dumpall.c:587
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean czyszczenie (kasowanie) baz danych przed odtworzeniem\n"
+
+#: pg_dumpall.c:588
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only zrzuca tylko obiekty globalne, bez baz danych\n"
+
+#: pg_dumpall.c:590 pg_restore.c:469
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner bez odtwarzania posiadania obiektu\n"
+
+#: pg_dumpall.c:591
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only zrzuca tylko role bez baz danych i przestrzeni tabel\n"
+
+#: pg_dumpall.c:593
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAZWA nazwa superużytkownika używana w zrzucie\n"
+
+#: pg_dumpall.c:594
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only zrzuca tylko przestrzenie tabel, bez baz danych i ról\n"
+
+#: pg_dumpall.c:606
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords nie zrzucaj haseł dla ról\n"
+
+#: pg_dumpall.c:613
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=POLACZENIE połączenie do bazy danych wedle ciągu połączenia\n"
+
+#: pg_dumpall.c:615
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=NAZWADB alternatywna domyślna baza danych\n"
+
+#: pg_dumpall.c:622
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Jeśli nie użyto -f/--file, skrypt SQL zostanie zapisany do standardowego\n"
+"wyjścia.\n"
+"\n"
+
+#: pg_dumpall.c:827
+#, c-format
+msgid "%s: role name starting with \"pg_\" skipped (%s)\n"
+msgstr "%s: pominięto nazwę roli zaczynającą się od \"pg_\" (%s)\n"
+
+#: pg_dumpall.c:1207
+#, c-format
+msgid "%s: could not parse ACL list (%s) for tablespace \"%s\"\n"
+msgstr "%s: nie udało się przeanalizować listy AC (%s) dla przestrzeni tabel \"%s\"\n"
+
+#: pg_dumpall.c:1524
+#, c-format
+msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+msgstr "%s: nie udało się przeanalizować listy AC (%s) dla bazy danych \"%s\"\n"
+
+#: pg_dumpall.c:1738
+#, c-format
+msgid "%s: dumping database \"%s\"...\n"
+msgstr "%s: tworzenie kopii zapasowej bazy danych \"%s\"...\n"
+
+#: pg_dumpall.c:1762
+#, c-format
+msgid "%s: pg_dump failed on database \"%s\", exiting\n"
+msgstr "%s: pg_dump nie powiódł się na bazie danych \"%s\", wyjście\n"
+
+#: pg_dumpall.c:1771
+#, c-format
+msgid "%s: could not re-open the output file \"%s\": %s\n"
+msgstr "%s: nie można ponownie otworzyć pliku \"%s\": %s\n"
+
+#: pg_dumpall.c:1816
+#, c-format
+msgid "%s: running \"%s\"\n"
+msgstr "%s: uruchomiony \"%s\"\n"
+
+#: pg_dumpall.c:2005
+#, c-format
+msgid "%s: could not connect to database \"%s\": %s\n"
+msgstr "%s: nie można połączyć się do bazy danych \"%s\": %s\n"
+
+#: pg_dumpall.c:2035
+#, c-format
+msgid "%s: could not get server version\n"
+msgstr "%s: nie można pobrać wersji serwera\n"
+
+#: pg_dumpall.c:2041
+#, c-format
+msgid "%s: could not parse server version \"%s\"\n"
+msgstr "%s: nie można odczytać wersji serwera \"%s\"\n"
+
+#: pg_dumpall.c:2117 pg_dumpall.c:2143
+#, c-format
+msgid "%s: executing %s\n"
+msgstr "%s: wykonanie %s\n"
+
+#: pg_dumpall.c:2123 pg_dumpall.c:2149
+#, c-format
+msgid "%s: query failed: %s"
+msgstr "%s: zapytanie nie powiodło się: %s"
+
+#: pg_dumpall.c:2125 pg_dumpall.c:2151
+#, c-format
+msgid "%s: query was: %s\n"
+msgstr "%s: zapytanie brzmiało: %s\n"
+
+#: pg_restore.c:307
+#, c-format
+msgid "%s: options -d/--dbname and -f/--file cannot be used together\n"
+msgstr "%s: opcje -d/--dbname i -f/--file nie mogą być użyte razem\n"
+
+#: pg_restore.c:318
+#, c-format
+msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+msgstr "%s: opcje -s/--schema-only i -a/--data-only nie mogą być używane razem\n"
+
+#: pg_restore.c:325
+#, c-format
+msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+msgstr "%s: opcje -c/--clean i -a/--data-only nie mogą być używane razem\n"
+
+#: pg_restore.c:332
+#, c-format
+msgid "%s: invalid number of parallel jobs\n"
+msgstr "%s: nieprawidłowa liczba zadań współbieżnych\n"
+
+#: pg_restore.c:340
+#, c-format
+msgid "%s: maximum number of parallel jobs is %d\n"
+msgstr "%s: maksymalna liczba zadań współbieżnych to %d\n"
+
+#: pg_restore.c:349
+#, c-format
+msgid "%s: cannot specify both --single-transaction and multiple jobs\n"
+msgstr "%s: nie można wskazać jednocześnie --single-transaction i wielu zadań\n"
+
+#: pg_restore.c:391
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"\n"
+msgstr "nierozpoznany format archiwum \"%s\"; proszę wskazać \"c\", \"d\", lub \"t\"\n"
+
+#: pg_restore.c:431
+#, c-format
+msgid "WARNING: errors ignored on restore: %d\n"
+msgstr "OSTRZEŻENIE: błędy ignorowane przy odtworzeniu: %d\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s odtwarza bazÄ™ danych PostgreSQL z archiwum utworzonego przez pg_dump.\n"
+"\n"
+
+#: pg_restore.c:447
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPCJA]... [PLIK]\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAZWA połączenie do bazy danych o tej nazwie\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=NAZWAPLIKU nazwa pliku wyjścia\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t format pliku kopii zapasowej (powinien być automatyczny)\n"
+
+#: pg_restore.c:453
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list drukuje skrótowy spis treści archiwum\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose tryb informacji szczegółowych\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: pg_restore.c:456
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Opcje kontroli odtworzenia:\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only odtwarza tylko dane, bez schematu\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create utworzenie docelowej bazy danych\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error wyjście w przypadku błędu, domyślna jest kontynuacja\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAZWA odtwarza indeks wedle nazwy\n"
+
+#: pg_restore.c:464
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM użycie tylu równoległych zadań przy odtwarzaniu\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=NAZWAPLIKU użycie spisu treści z tego pliku by\n"
+" wskazać/uporządkować wyjście\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAZWA odtwarza tylko obiekty z tego schematu\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAZWA nie odtwarza obiektów z tego schematu\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAZWA(args) odtwarza funkcjÄ™ wedle nazwy\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only odtwarza tylko schemat, bez danych\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAZWA nazwa superużytkownika by użyć lub wyłączyć wyzwalacze\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAZWA odtwarza relacje wedle nazwy (tabela, widok, itp.)\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAZWA odtwarza wyzwalacz wedle nazwy\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges nie wykonuje odtwarzania przywilejów dostępu (grant/revoke)\n"
+
+#: pg_restore.c:476
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction odtworzenie jako pojedyncza transakcja\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security włącza zabezpieczenie na poziomie wierszy\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables\n"
+" nie odtwarza danych z tabel, które nie mogły być odtworzone\n"
+
+#: pg_restore.c:482
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels nie odtwarza etykiet bezpieczeństwa\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces nie odtwarza przypisań do przestrzeni tabel\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION odtwarza nazwanÄ… sekcjÄ™ (pre-dane, dane, lub post-dane)\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=NAZWAROLI wykonuje SET ROLE przed odtworzeniem\n"
+
+#: pg_restore.c:499
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Opcje -I, -n, -P, -t, -T i --section mogą być mieszane i używane wielokrotnie\n"
+"by wskazać wiele obiektów.\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Jeśli nie wskazano nazwy pliku, użyty zostanie wejście standardowe.\n"
+"\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "błąd przetwarzania równoległego elementu roboczego\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "nie można znaleźć gniazda zakończonego procesu roboczego\n"
+
+#~ msgid "error during backup\n"
+#~ msgstr "błąd podczas tworzenia kopii zapasowej\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr "serwer musi być w wersji co najmniej 7.3 by użyć przełączników wyboru schematu\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr "pytanie o dane sekwencji \"%s\" zwróciło nazwę \"%s\"\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "nie można otworzyć pliku wyjścia \"%s\" do zapisu\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "składnik archiwum za duży dla formatu tar\n"
+
+#~ msgid "error in ListenToWorkers(): %s\n"
+#~ msgstr "błąd w ListenToWorkers(): %s\n"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "zakończono przez użytkownika\n"
+
+#~ msgid "unrecognized command on communication channel: %s\n"
+#~ msgstr "nierozpoznane polecenie w kanale komunikacyjnym: %s\n"
+
+#~ msgid "could not get relation name for OID %u: %s\n"
+#~ msgstr "nie można pobrać nazwy relacji dla OID %u: %s\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "pracownik kończy pracę\n"
+
+#~ msgid ""
+#~ " --no-create-subscription-slots\n"
+#~ " do not create replication slots for subscriptions\n"
+#~ msgstr ""
+#~ " --no-create-subscription-slots\n"
+#~ " nie tworzy gniazd replikacji dla subskrypcji\n"
diff --git a/src/bin/pg_dump/po/pt_BR.po b/src/bin/pg_dump/po/pt_BR.po
new file mode 100644
index 0000000..30fdaff
--- /dev/null
+++ b/src/bin/pg_dump/po/pt_BR.po
@@ -0,0 +1,2579 @@
+# Brazilian Portuguese message translation file for pg_dump
+# Copyright (C) 2009 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Roberto Mello <rmello@fslc.usu.edu>, 2002.
+# Euler Taveira de Oliveira <euler@timbira.com>, 2003-2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 9.6\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2016-08-29 16:48-0300\n"
+"PO-Revision-Date: 2005-10-04 23:16-0300\n"
+"Last-Translator: Euler Taveira de Oliveira <euler@timbira.com>\n"
+"Language-Team: Brazilian Portuguese <pgbr-dev@listas.postgresql.org.br>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "não pôde identificar diretório atual: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binário \"%s\" é inválido"
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "não pôde ler o binário \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não pôde encontrar o \"%s\" para executá-lo"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "não pôde mudar diretório para \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "não pôde ler link simbólico \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose falhou: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 pg_backup_db.c:158 pg_backup_db.c:213
+#: pg_backup_db.c:272 pg_backup_db.c:314
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/wait_error.c:47
+#, c-format
+msgid "command not executable"
+msgstr "comando não é executável"
+
+#: ../../common/wait_error.c:51
+#, c-format
+msgid "command not found"
+msgstr "comando não encontrado"
+
+#: ../../common/wait_error.c:56
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo filho terminou com código de saída %d"
+
+#: ../../common/wait_error.c:63
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo filho foi terminado pela exceção 0x%X"
+
+#: ../../common/wait_error.c:73
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "processo filho foi terminado pelo sinal %s"
+
+#: ../../common/wait_error.c:77
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "processo filho foi terminado pelo sinal %d"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo filho terminou com status desconhecido %d"
+
+#: common.c:121
+#, c-format
+msgid "reading extensions\n"
+msgstr "lendo extensões\n"
+
+#: common.c:126
+#, c-format
+msgid "identifying extension members\n"
+msgstr "identificando membros de extensões\n"
+
+#: common.c:130
+#, c-format
+msgid "reading schemas\n"
+msgstr "lendo esquemas\n"
+
+#: common.c:141
+#, c-format
+msgid "reading user-defined tables\n"
+msgstr "lendo tabelas definidas pelo usuário\n"
+
+#: common.c:149
+#, c-format
+msgid "reading user-defined functions\n"
+msgstr "lendo funções definidas pelo usuário\n"
+
+#: common.c:155
+#, c-format
+msgid "reading user-defined types\n"
+msgstr "lendo tipos definidos pelo usuário\n"
+
+#: common.c:161
+#, c-format
+msgid "reading procedural languages\n"
+msgstr "lendo linguagens procedurais\n"
+
+#: common.c:165
+#, c-format
+msgid "reading user-defined aggregate functions\n"
+msgstr "lendo funções de agregação definidas pelo usuário\n"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined operators\n"
+msgstr "lendo operadores definidos pelo usuário\n"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined access methods\n"
+msgstr "lendo métodos de acesso definidos pelo usuário\n"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined operator classes\n"
+msgstr "lendo classes de operadores definidas pelo usuário\n"
+
+#: common.c:182
+#, c-format
+msgid "reading user-defined operator families\n"
+msgstr "lendo famílias de operadores definidas pelo usuário\n"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search parsers\n"
+msgstr "lendo analisadores de busca textual definidos pelo usuário\n"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined text search templates\n"
+msgstr "lendo modelos de busca textual definidos pelo usuário\n"
+
+#: common.c:194
+#, c-format
+msgid "reading user-defined text search dictionaries\n"
+msgstr "lendo dicionários de busca textual definidos pelo usuário\n"
+
+#: common.c:198
+#, c-format
+msgid "reading user-defined text search configurations\n"
+msgstr "lendo configurações de busca textual definidas pelo usuário\n"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined foreign-data wrappers\n"
+msgstr "lendo adaptadores de dados externos definidos pelo usuário\n"
+
+#: common.c:206
+#, c-format
+msgid "reading user-defined foreign servers\n"
+msgstr "lendo servidores externos definidos pelo usuário\n"
+
+#: common.c:210
+#, c-format
+msgid "reading default privileges\n"
+msgstr "lendo privilégios padrão\n"
+
+#: common.c:214
+#, c-format
+msgid "reading user-defined collations\n"
+msgstr "lendo ordenações definidas pelo usuário\n"
+
+#: common.c:219
+#, c-format
+msgid "reading user-defined conversions\n"
+msgstr "lendo conversões definidas pelo usuário\n"
+
+#: common.c:223
+#, c-format
+msgid "reading type casts\n"
+msgstr "lendo conversões de tipo\n"
+
+#: common.c:227
+#, c-format
+msgid "reading transforms\n"
+msgstr "lendo transformações\n"
+
+#: common.c:231
+#, c-format
+msgid "reading table inheritance information\n"
+msgstr "lendo informação de herança das tabelas\n"
+
+#: common.c:235
+#, c-format
+msgid "reading event triggers\n"
+msgstr "lendo gatilhos de eventos\n"
+
+#: common.c:240
+#, c-format
+msgid "finding extension tables\n"
+msgstr "encontrando tabelas de extensões\n"
+
+#: common.c:245
+#, c-format
+msgid "finding inheritance relationships\n"
+msgstr "encontrando relacionamentos herdados\n"
+
+#: common.c:249
+#, c-format
+msgid "reading column info for interesting tables\n"
+msgstr "lendo informações das colunas em tabelas interessantes\n"
+
+#: common.c:253
+#, c-format
+msgid "flagging inherited columns in subtables\n"
+msgstr "marcando colunas herdadas nas subtabelas\n"
+
+#: common.c:257
+#, c-format
+msgid "reading indexes\n"
+msgstr "lendo índices\n"
+
+#: common.c:261
+#, c-format
+msgid "reading constraints\n"
+msgstr "lendo restrições\n"
+
+#: common.c:265
+#, c-format
+msgid "reading triggers\n"
+msgstr "lendo gatilhos\n"
+
+#: common.c:269
+#, c-format
+msgid "reading rewrite rules\n"
+msgstr "lendo regras de reescrita\n"
+
+#: common.c:273
+#, c-format
+msgid "reading policies\n"
+msgstr "lendo políticas de segurança\n"
+
+#: common.c:908
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n"
+msgstr "verificação de sanidade falhou, OID pai %u da tabela \"%s\" (OID %u) não foi encontrado\n"
+
+#: common.c:950
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers\n"
+msgstr "não pôde validar matriz numérica \"%s\": muitos números\n"
+
+#: common.c:965
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number\n"
+msgstr "não pôde validar matriz numérica \"%s\": caracter inválido no número\n"
+
+#. translator: this is a module name
+#: compress_io.c:78
+msgid "compress_io"
+msgstr "compress_io"
+
+#: compress_io.c:114
+#, c-format
+msgid "invalid compression code: %d\n"
+msgstr "código de compressão é inválido: %d\n"
+
+#: compress_io.c:138 compress_io.c:174 compress_io.c:192 compress_io.c:519
+#: compress_io.c:562
+#, c-format
+msgid "not built with zlib support\n"
+msgstr "não foi construído com suporte a zlib\n"
+
+#: compress_io.c:242 compress_io.c:344
+#, c-format
+msgid "could not initialize compression library: %s\n"
+msgstr "não pôde inicializar biblioteca de compressão: %s\n"
+
+#: compress_io.c:263
+#, c-format
+msgid "could not close compression stream: %s\n"
+msgstr "não pôde fechar arquivo comprimido: %s\n"
+
+#: compress_io.c:281
+#, c-format
+msgid "could not compress data: %s\n"
+msgstr "não pôde comprimir dados: %s\n"
+
+#: compress_io.c:361 compress_io.c:377
+#, c-format
+msgid "could not uncompress data: %s\n"
+msgstr "não pôde descomprimir dados: %s\n"
+
+#: compress_io.c:385
+#, c-format
+msgid "could not close compression library: %s\n"
+msgstr "não pôde fechar biblioteca de compressão: %s\n"
+
+#: compress_io.c:596 compress_io.c:632 pg_backup_custom.c:591
+#: pg_backup_tar.c:561
+#, c-format
+msgid "could not read from input file: %s\n"
+msgstr "não pôde ler arquivo de entrada: %s\n"
+
+#: compress_io.c:635 pg_backup_custom.c:588 pg_backup_directory.c:548
+#: pg_backup_tar.c:797 pg_backup_tar.c:821
+#, c-format
+msgid "could not read from input file: end of file\n"
+msgstr "não pôde ler arquivo de entrada: fim do arquivo\n"
+
+#: parallel.c:163
+msgid "parallel archiver"
+msgstr "arquivador paralelo"
+
+#: parallel.c:227
+#, c-format
+msgid "%s: WSAStartup failed: %d\n"
+msgstr "%s: WSAStartup falhou: %d\n"
+
+#: parallel.c:930
+#, c-format
+msgid "could not create communication channels: %s\n"
+msgstr "não pôde criar canais de comunicação: %s\n"
+
+#: parallel.c:993
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "não pôde criar processo filho: %s\n"
+
+#: parallel.c:1188
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table.\n"
+msgstr ""
+"não pôde obter bloqueio na relação \"%s\"\n"
+"Isso geralmente significa que alguém solicitou um bloqueio ACCESS EXCLUSIVE na tabela após o processo pai do pg_dump ter obtido o bloqueio ACCESS SHARE inicial na tabela.\n"
+
+#: parallel.c:1258
+#, c-format
+msgid "unrecognized command received from master: \"%s\"\n"
+msgstr "comando desconhecido recebido do processo principal: \"%s\"\n"
+
+#: parallel.c:1296
+#, c-format
+msgid "a worker process died unexpectedly\n"
+msgstr "um processo filho morreu inesperadamente\n"
+
+#: parallel.c:1322 parallel.c:1328
+#, c-format
+msgid "invalid message received from worker: \"%s\"\n"
+msgstr "mensagem inválida recebida do processo filho: \"%s\"\n"
+
+#: parallel.c:1385 parallel.c:1436
+#, c-format
+msgid "error processing a parallel work item\n"
+msgstr "erro ao processar um item de trabalho paralelo\n"
+
+#: parallel.c:1465 parallel.c:1583
+#, c-format
+msgid "could not write to the communication channel: %s\n"
+msgstr "não pôde escrever no canal de comunicação: %s\n"
+
+#: parallel.c:1543
+#, c-format
+msgid "select() failed: %s\n"
+msgstr "select() falhou: %s\n"
+
+#: parallel.c:1668
+#, c-format
+msgid "pgpipe: could not create socket: error code %d\n"
+msgstr "pgpipe: não pôde criar soquete: código de erro %d\n"
+
+#: parallel.c:1679
+#, c-format
+msgid "pgpipe: could not bind: error code %d\n"
+msgstr "pgpipe: não pôde se ligar: código de erro %d\n"
+
+#: parallel.c:1686
+#, c-format
+msgid "pgpipe: could not listen: error code %d\n"
+msgstr "pgpipe: não pôde escutar: código de erro %d\n"
+
+#: parallel.c:1693
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d\n"
+msgstr "pgpipe: getsockname() falhou: código de erro %d\n"
+
+#: parallel.c:1704
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d\n"
+msgstr "pgpipe: não pôde criar segundo soquete: código de erro %d\n"
+
+#: parallel.c:1713
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d\n"
+msgstr "pgpipe: não pôde se conectar ao soquete: código de erro %d\n"
+
+#: parallel.c:1722
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d\n"
+msgstr "pgpipe: não pôde aceitar conexão: código de erro %d\n"
+
+#. translator: this is a module name
+#: pg_backup_archiver.c:55
+msgid "archiver"
+msgstr "arquivador"
+
+#: pg_backup_archiver.c:234 pg_backup_archiver.c:1519
+#, c-format
+msgid "could not close output file: %s\n"
+msgstr "não pôde fechar arquivo de saída: %s\n"
+
+#: pg_backup_archiver.c:280 pg_backup_archiver.c:285
+#, c-format
+msgid "WARNING: archive items not in correct section order\n"
+msgstr "AVISO: itens do archive não estão na ordem correta de seções\n"
+
+#: pg_backup_archiver.c:291
+#, c-format
+msgid "unexpected section code %d\n"
+msgstr "código de seção %d inesperado\n"
+
+#: pg_backup_archiver.c:327
+#, c-format
+msgid "-C and -1 are incompatible options\n"
+msgstr "-C e -1 são opções incompatíveis\n"
+
+#: pg_backup_archiver.c:337
+#, c-format
+msgid "parallel restore is not supported with this archive file format\n"
+msgstr "restauração paralela não é suportada por este formato de arquivo\n"
+
+#: pg_backup_archiver.c:341
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump\n"
+msgstr "restauração paralela não é suportada por arquivos produzidos por pg_dum anterior a 8.0\n"
+
+#: pg_backup_archiver.c:359
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)\n"
+msgstr "não pode recuperar arquivo comprimido (compressão não é suportada nesta instalação)\n"
+
+#: pg_backup_archiver.c:376
+#, c-format
+msgid "connecting to database for restore\n"
+msgstr "conectando ao banco de dados para restauração\n"
+
+#: pg_backup_archiver.c:378
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives\n"
+msgstr "conexões diretas ao banco de dados não são suportadas em arquivos anteriores a versão 1.3\n"
+
+#: pg_backup_archiver.c:423
+#, c-format
+msgid "implied data-only restore\n"
+msgstr "restauração do tipo somente dados implícita\n"
+
+#: pg_backup_archiver.c:493
+#, c-format
+msgid "dropping %s %s\n"
+msgstr "removendo %s %s\n"
+
+#: pg_backup_archiver.c:646
+#, c-format
+msgid "setting owner and privileges for %s \"%s.%s\"\n"
+msgstr "definindo dono e privilégios para %s \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:649
+#, c-format
+msgid "setting owner and privileges for %s \"%s\"\n"
+msgstr "definindo dono e privilégios para %s \"%s\"\n"
+
+#: pg_backup_archiver.c:715 pg_backup_archiver.c:717
+#, c-format
+msgid "warning from original dump file: %s\n"
+msgstr "aviso do arquivo de cópia de segurança: %s\n"
+
+#: pg_backup_archiver.c:726
+#, c-format
+msgid "creating %s \"%s.%s\"\n"
+msgstr "criando %s \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:729
+#, c-format
+msgid "creating %s \"%s\"\n"
+msgstr "criando %s \"%s\"\n"
+
+#: pg_backup_archiver.c:781
+#, c-format
+msgid "connecting to new database \"%s\"\n"
+msgstr "conectando ao novo banco de dados \"%s\"\n"
+
+#: pg_backup_archiver.c:809
+#, c-format
+msgid "processing %s\n"
+msgstr "processando %s\n"
+
+#: pg_backup_archiver.c:829
+#, c-format
+msgid "processing data for table \"%s.%s\"\n"
+msgstr "processando dados da tabela \"%s.%s\"\n"
+
+#: pg_backup_archiver.c:891
+#, c-format
+msgid "executing %s %s\n"
+msgstr "executando %s %s\n"
+
+#: pg_backup_archiver.c:930
+#, c-format
+msgid "disabling triggers for %s\n"
+msgstr "desabilitando gatilhos para %s\n"
+
+#: pg_backup_archiver.c:958
+#, c-format
+msgid "enabling triggers for %s\n"
+msgstr "habilitando gatilhos para %s\n"
+
+#: pg_backup_archiver.c:988
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine\n"
+msgstr "erro interno -- WriteData não pode ser chamada fora do contexto de uma rotina DataDumper\n"
+
+#: pg_backup_archiver.c:1157
+#, c-format
+msgid "large-object output not supported in chosen format\n"
+msgstr "cópia de segurança de objetos grandes não é suportada no formato escolhido\n"
+
+#: pg_backup_archiver.c:1215
+#, c-format
+msgid "restored %d large object\n"
+msgid_plural "restored %d large objects\n"
+msgstr[0] "restaurado %d objeto grande\n"
+msgstr[1] "restaurado %d objetos grandes\n"
+
+#: pg_backup_archiver.c:1236 pg_backup_tar.c:739
+#, c-format
+msgid "restoring large object with OID %u\n"
+msgstr "restaurando objeto grande com OID %u\n"
+
+#: pg_backup_archiver.c:1248
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "não pôde criar objeto grande %u: %s"
+
+#: pg_backup_archiver.c:1253 pg_dump.c:3050
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "não pôde abrir objeto grande %u: %s"
+
+#: pg_backup_archiver.c:1311
+#, c-format
+msgid "could not open TOC file \"%s\": %s\n"
+msgstr "não pôde abrir arquivo TOC \"%s\": %s\n"
+
+#: pg_backup_archiver.c:1352
+#, c-format
+msgid "WARNING: line ignored: %s\n"
+msgstr "AVISO: linha ignorada: %s\n"
+
+#: pg_backup_archiver.c:1359
+#, c-format
+msgid "could not find entry for ID %d\n"
+msgstr "não pôde encontrar registro para ID %d\n"
+
+#: pg_backup_archiver.c:1380 pg_backup_directory.c:230
+#: pg_backup_directory.c:597
+#, c-format
+msgid "could not close TOC file: %s\n"
+msgstr "não pôde fechar arquivo TOC: %s\n"
+
+#: pg_backup_archiver.c:1489 pg_backup_custom.c:162 pg_backup_directory.c:341
+#: pg_backup_directory.c:583 pg_backup_directory.c:641
+#: pg_backup_directory.c:661
+#, c-format
+msgid "could not open output file \"%s\": %s\n"
+msgstr "não pôde abrir arquivo de saída \"%s\": %s\n"
+
+#: pg_backup_archiver.c:1492 pg_backup_custom.c:169
+#, c-format
+msgid "could not open output file: %s\n"
+msgstr "não pôde abrir arquivo de saída: %s\n"
+
+#: pg_backup_archiver.c:1598
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)\n"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)\n"
+msgstr[0] "escreveu %lu byte de dados de objeto grande (resultado = %lu)\n"
+msgstr[1] "escreveu %lu bytes de dados de objeto grande (resultado = %lu)\n"
+
+#: pg_backup_archiver.c:1604
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)\n"
+msgstr "não pôde escrever objeto grande (resultado: %lu, esperado %lu)\n"
+
+#: pg_backup_archiver.c:1697
+#, c-format
+msgid "Error while INITIALIZING:\n"
+msgstr "Erro ao INICIALIZAR:\n"
+
+#: pg_backup_archiver.c:1702
+#, c-format
+msgid "Error while PROCESSING TOC:\n"
+msgstr "Erro ao PROCESSAR TOC:\n"
+
+#: pg_backup_archiver.c:1707
+#, c-format
+msgid "Error while FINALIZING:\n"
+msgstr "Erro ao FINALIZAR:\n"
+
+#: pg_backup_archiver.c:1712
+#, c-format
+msgid "Error from TOC entry %d; %u %u %s %s %s\n"
+msgstr "Erro no registro do TOC %d; %u %u %s %s %s\n"
+
+#: pg_backup_archiver.c:1785
+#, c-format
+msgid "bad dumpId\n"
+msgstr "dumpId inválido\n"
+
+#: pg_backup_archiver.c:1806
+#, c-format
+msgid "bad table dumpId for TABLE DATA item\n"
+msgstr "dumpId de tabela inválido para item TABLE DATA\n"
+
+#: pg_backup_archiver.c:1898
+#, c-format
+msgid "unexpected data offset flag %d\n"
+msgstr "Marcador de deslocamento de dado %d é inesperado\n"
+
+#: pg_backup_archiver.c:1911
+#, c-format
+msgid "file offset in dump file is too large\n"
+msgstr "deslocamento no arquivo de cópia de segurança é muito grande\n"
+
+#: pg_backup_archiver.c:2024
+#, c-format
+msgid "attempting to ascertain archive format\n"
+msgstr "tentando verificar formato de arquivo\n"
+
+#: pg_backup_archiver.c:2050 pg_backup_archiver.c:2060
+#, c-format
+msgid "directory name too long: \"%s\"\n"
+msgstr "nome de diretório é muito longo: \"%s\"\n"
+
+#: pg_backup_archiver.c:2068
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)\n"
+msgstr "diretório \"%s\" não parece ser um archive válido (\"toc.dat\" não existe)\n"
+
+#: pg_backup_archiver.c:2076 pg_backup_custom.c:181 pg_backup_custom.c:770
+#: pg_backup_directory.c:214 pg_backup_directory.c:399
+#, c-format
+msgid "could not open input file \"%s\": %s\n"
+msgstr "não pôde abrir arquivo de entrada \"%s\": %s\n"
+
+#: pg_backup_archiver.c:2084 pg_backup_custom.c:188
+#, c-format
+msgid "could not open input file: %s\n"
+msgstr "não pôde abrir arquivo de entrada: %s\n"
+
+#: pg_backup_archiver.c:2091
+#, c-format
+msgid "could not read input file: %s\n"
+msgstr "não pôde ler arquivo de entrada: %s\n"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "input file is too short (read %lu, expected 5)\n"
+msgstr "arquivo de entrada é muito pequeno (lido %lu, esperado 5)\n"
+
+#: pg_backup_archiver.c:2176
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql.\n"
+msgstr "arquivo de entrada parece estar no formato texto. Por favor utilize o psql.\n"
+
+#: pg_backup_archiver.c:2182
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)\n"
+msgstr "arquivo de entrada não parece ser um arquivo válido (muito pequeno?)\n"
+
+#: pg_backup_archiver.c:2188
+#, c-format
+msgid "input file does not appear to be a valid archive\n"
+msgstr "arquivo de entrada não parece ser um arquivo válido\n"
+
+#: pg_backup_archiver.c:2208
+#, c-format
+msgid "could not close input file: %s\n"
+msgstr "não pôde fechar arquivo de entrada: %s\n"
+
+#: pg_backup_archiver.c:2225
+#, c-format
+msgid "allocating AH for %s, format %d\n"
+msgstr "alocando AH para %s, formato %d\n"
+
+#: pg_backup_archiver.c:2330
+#, c-format
+msgid "unrecognized file format \"%d\"\n"
+msgstr "formato de arquivo \"%d\" é desconhecido\n"
+
+#: pg_backup_archiver.c:2486
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC\n"
+msgstr "ID do registro %d fora do intervalo -- talvez o TOC esteja corrompido\n"
+
+#: pg_backup_archiver.c:2602
+#, c-format
+msgid "read TOC entry %d (ID %d) for %s %s\n"
+msgstr "lendo registro do TOC %d (ID %d) de %s %s\n"
+
+#: pg_backup_archiver.c:2636
+#, c-format
+msgid "unrecognized encoding \"%s\"\n"
+msgstr "codificação \"%s\" é desconhecida\n"
+
+#: pg_backup_archiver.c:2641
+#, c-format
+msgid "invalid ENCODING item: %s\n"
+msgstr "item ENCODING inválido: %s\n"
+
+#: pg_backup_archiver.c:2659
+#, c-format
+msgid "invalid STDSTRINGS item: %s\n"
+msgstr "item STDSTRINGS inválido: %s\n"
+
+#: pg_backup_archiver.c:2674
+#, c-format
+msgid "schema \"%s\" not found\n"
+msgstr "esquema \"%s\" não foi encontrado\n"
+
+#: pg_backup_archiver.c:2681
+#, c-format
+msgid "table \"%s\" not found\n"
+msgstr "tabela \"%s\" não foi encontrada\n"
+
+#: pg_backup_archiver.c:2688
+#, c-format
+msgid "index \"%s\" not found\n"
+msgstr "índice \"%s\" não foi encontrado\n"
+
+#: pg_backup_archiver.c:2695
+#, c-format
+msgid "function \"%s\" not found\n"
+msgstr "função \"%s\" não foi encontrada\n"
+
+#: pg_backup_archiver.c:2702
+#, c-format
+msgid "trigger \"%s\" not found\n"
+msgstr "gatilho \"%s\" não foi encontrado\n"
+
+#: pg_backup_archiver.c:2934
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "não pôde definir \"%s\" como usuário da sessão: %s"
+
+#: pg_backup_archiver.c:2966
+#, c-format
+msgid "could not set default_with_oids: %s"
+msgstr "não pôde definir default_with_oids: %s"
+
+#: pg_backup_archiver.c:3111
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "não pôde definir search_path para \"%s\": %s"
+
+#: pg_backup_archiver.c:3173
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "não pôde definir default_tablespace para %s: %s"
+
+#: pg_backup_archiver.c:3260 pg_backup_archiver.c:3454
+#, c-format
+msgid "WARNING: don't know how to set owner for object type %s\n"
+msgstr "AVISO: não se sabe como definir o dono para tipo de objeto %s\n"
+
+#: pg_backup_archiver.c:3536
+#, c-format
+msgid "did not find magic string in file header\n"
+msgstr "não encontrou cadeia de caracteres mágica no cabeçalho do arquivo\n"
+
+#: pg_backup_archiver.c:3549
+#, c-format
+msgid "unsupported version (%d.%d) in file header\n"
+msgstr "versão não é suportada (%d.%d) no cabeçalho do arquivo\n"
+
+#: pg_backup_archiver.c:3554
+#, c-format
+msgid "sanity check on integer size (%lu) failed\n"
+msgstr "verificação de sanidade no tamanho do inteiro (%lu) falhou\n"
+
+#: pg_backup_archiver.c:3558
+#, c-format
+msgid "WARNING: archive was made on a machine with larger integers, some operations might fail\n"
+msgstr "AVISO: arquivo foi feito em uma máquina com inteiros longos, algumas operações podem falhar\n"
+
+#: pg_backup_archiver.c:3568
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)\n"
+msgstr "formato esperado (%d) difere do formato encontrado no arquivo (%d)\n"
+
+#: pg_backup_archiver.c:3584
+#, c-format
+msgid "WARNING: archive is compressed, but this installation does not support compression -- no data will be available\n"
+msgstr "AVISO: arquivo está comprimido, mas esta instalação não suporta compressão -- nenhum dado está disponível\n"
+
+#: pg_backup_archiver.c:3602
+#, c-format
+msgid "WARNING: invalid creation date in header\n"
+msgstr "AVISO: data de criação inválida no cabeçalho\n"
+
+#: pg_backup_archiver.c:3677
+#, c-format
+msgid "entering restore_toc_entries_prefork\n"
+msgstr "executando restore_toc_entries_prefork\n"
+
+#: pg_backup_archiver.c:3721
+#, c-format
+msgid "processing item %d %s %s\n"
+msgstr "processando item %d %s %s\n"
+
+#: pg_backup_archiver.c:3773
+#, c-format
+msgid "entering restore_toc_entries_parallel\n"
+msgstr "executando restore_toc_entries_parallel\n"
+
+#: pg_backup_archiver.c:3821
+#, c-format
+msgid "entering main parallel loop\n"
+msgstr "executando laço paralelo principal\n"
+
+#: pg_backup_archiver.c:3832
+#, c-format
+msgid "skipping item %d %s %s\n"
+msgstr "ignorando item %d %s %s\n"
+
+#: pg_backup_archiver.c:3842
+#, c-format
+msgid "launching item %d %s %s\n"
+msgstr "iniciando item %d %s %s\n"
+
+#: pg_backup_archiver.c:3898
+#, c-format
+msgid "finished main parallel loop\n"
+msgstr "laço paralelo principal terminado\n"
+
+#: pg_backup_archiver.c:3907
+#, c-format
+msgid "entering restore_toc_entries_postfork\n"
+msgstr "executando restore_toc_entries_postfork\n"
+
+#: pg_backup_archiver.c:3926
+#, c-format
+msgid "processing missed item %d %s %s\n"
+msgstr "iniciando item adiado %d %s %s\n"
+
+#: pg_backup_archiver.c:4075
+#, c-format
+msgid "no item ready\n"
+msgstr "nenhum item está pronto\n"
+
+#: pg_backup_archiver.c:4123
+#, c-format
+msgid "could not find slot of finished worker\n"
+msgstr "não pôde encontrar entrada do processo filho terminado\n"
+
+#: pg_backup_archiver.c:4125
+#, c-format
+msgid "finished item %d %s %s\n"
+msgstr "item terminado %d %s %s\n"
+
+#: pg_backup_archiver.c:4138
+#, c-format
+msgid "worker process failed: exit code %d\n"
+msgstr "processo filho falhou: código de saída %d\n"
+
+#: pg_backup_archiver.c:4300
+#, c-format
+msgid "transferring dependency %d -> %d to %d\n"
+msgstr "tranferindo dependência %d -> %d para %d\n"
+
+#: pg_backup_archiver.c:4373
+#, c-format
+msgid "reducing dependencies for %d\n"
+msgstr "reduzindo dependências para %d\n"
+
+#: pg_backup_archiver.c:4412
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data\n"
+msgstr "tabela \"%s\" não pôde ser criada, não restaurará os seus dados\n"
+
+#. translator: this is a module name
+#: pg_backup_custom.c:94
+msgid "custom archiver"
+msgstr "arquivador personalizado"
+
+#: pg_backup_custom.c:384 pg_backup_null.c:150
+#, c-format
+msgid "invalid OID for large object\n"
+msgstr "OID inválido para objeto grande\n"
+
+#: pg_backup_custom.c:455
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive\n"
+msgstr "tipo de bloco de dados desconhecido (%d) durante busca no arquivo\n"
+
+#: pg_backup_custom.c:466
+#, c-format
+msgid "error during file seek: %s\n"
+msgstr "erro durante busca no arquivo: %s\n"
+
+#: pg_backup_custom.c:476
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n"
+msgstr "não pôde encontrar bloco com ID %d no arquivo -- possivelmente por causa de pedido de restauração fora de ordem, que não pode ser manipulado pela falta de deslocamentos no arquivo\n"
+
+#: pg_backup_custom.c:481
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file\n"
+msgstr "não pôde encontrar bloco com ID %d no arquivo -- possivelmente por causa de pedido de restauração fora de ordem, que não pode ser manipulado por arquivo de entrada não posicionável\n"
+
+#: pg_backup_custom.c:486
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive\n"
+msgstr "não pôde encontrar bloco com ID %d em arquivo -- possivelmente arquivo corrompido\n"
+
+#: pg_backup_custom.c:493
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d\n"
+msgstr "encontrado bloco inesperado com ID (%d) durante leitura de dados -- esperado %d\n"
+
+#: pg_backup_custom.c:507
+#, c-format
+msgid "unrecognized data block type %d while restoring archive\n"
+msgstr "tipo de bloco de dados desconhecido %d durante restauração do arquivo\n"
+
+#: pg_backup_custom.c:709 pg_backup_custom.c:759 pg_backup_custom.c:908
+#: pg_backup_tar.c:1088
+#, c-format
+msgid "could not determine seek position in archive file: %s\n"
+msgstr "não pôde determinar posição de busca no arquivo: %s\n"
+
+#: pg_backup_custom.c:727 pg_backup_custom.c:764
+#, c-format
+msgid "could not close archive file: %s\n"
+msgstr "não pôde fechar arquivo: %s\n"
+
+#: pg_backup_custom.c:746
+#, c-format
+msgid "can only reopen input archives\n"
+msgstr "não pôde reabrir arquivos de entrada\n"
+
+#: pg_backup_custom.c:753
+#, c-format
+msgid "parallel restore from standard input is not supported\n"
+msgstr "restauração paralela da entrada padrão não é suportada\n"
+
+#: pg_backup_custom.c:755
+#, c-format
+msgid "parallel restore from non-seekable file is not supported\n"
+msgstr "restauração paralela de arquivo não posicionável não é suportada\n"
+
+#: pg_backup_custom.c:774
+#, c-format
+msgid "could not set seek position in archive file: %s\n"
+msgstr "não pôde definir posição de busca no arquivo: %s\n"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "compressor active\n"
+msgstr "compressor ativo\n"
+
+#: pg_backup_custom.c:912
+#, c-format
+msgid "WARNING: ftell mismatch with expected position -- ftell used\n"
+msgstr "AVISO: ftell não corresponde com posição esperada -- ftell utilizado\n"
+
+#. translator: this is a module name
+#: pg_backup_db.c:31
+msgid "archiver (db)"
+msgstr "arquivador (bd)"
+
+#: pg_backup_db.c:47
+#, c-format
+msgid "could not get server_version from libpq\n"
+msgstr "não pôde obter versão do servidor a partir da libpq\n"
+
+#: pg_backup_db.c:58 pg_dumpall.c:2067
+#, c-format
+msgid "server version: %s; %s version: %s\n"
+msgstr "versão do servidor: %s; versão do %s: %s\n"
+
+#: pg_backup_db.c:60 pg_dumpall.c:2069
+#, c-format
+msgid "aborting because of server version mismatch\n"
+msgstr "interrompendo porque a versão do servidor não corresponde\n"
+
+#: pg_backup_db.c:149
+#, c-format
+msgid "connecting to database \"%s\" as user \"%s\"\n"
+msgstr "conectando ao banco de dados \"%s\" como usuário \"%s\"\n"
+
+#: pg_backup_db.c:156 pg_backup_db.c:208 pg_backup_db.c:270 pg_backup_db.c:312
+#: pg_dumpall.c:1893 pg_dumpall.c:2005
+msgid "Password: "
+msgstr "Senha: "
+
+#: pg_backup_db.c:189
+#, c-format
+msgid "failed to reconnect to database\n"
+msgstr "falhou ao reconectar ao banco de dados\n"
+
+#: pg_backup_db.c:194
+#, c-format
+msgid "could not reconnect to database: %s"
+msgstr "não pôde reconectar ao banco de dados: %s"
+
+#: pg_backup_db.c:210
+#, c-format
+msgid "connection needs password\n"
+msgstr "conexão precisa de senha\n"
+
+#: pg_backup_db.c:264
+#, c-format
+msgid "already connected to a database\n"
+msgstr "já está conectado ao banco de dados\n"
+
+#: pg_backup_db.c:304
+#, c-format
+msgid "failed to connect to database\n"
+msgstr "falhou ao conectar ao banco de dados\n"
+
+#: pg_backup_db.c:321
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "conexão com banco de dados \"%s\" falhou: %s"
+
+#: pg_backup_db.c:391
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:398
+#, c-format
+msgid "query failed: %s"
+msgstr "consulta falhou: %s"
+
+#: pg_backup_db.c:400
+#, c-format
+msgid "query was: %s\n"
+msgstr "consulta foi: %s\n"
+
+#: pg_backup_db.c:442
+#, c-format
+msgid "query returned %d row instead of one: %s\n"
+msgid_plural "query returned %d rows instead of one: %s\n"
+msgstr[0] "consulta retornou %d linha ao invés de uma: %s\n"
+msgstr[1] "consulta retornou %d linhas ao invés de uma: %s\n"
+
+#: pg_backup_db.c:487
+#, c-format
+msgid "%s: %s Command was: %s\n"
+msgstr "%s: %s Comando foi: %s\n"
+
+#: pg_backup_db.c:543 pg_backup_db.c:617 pg_backup_db.c:624
+msgid "could not execute query"
+msgstr "não pôde executar consulta"
+
+#: pg_backup_db.c:596
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "erro retornado pelo PQputCopyData: %s"
+
+#: pg_backup_db.c:645
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "erro retornado pelo PQputCopyEnd: %s"
+
+#: pg_backup_db.c:651
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY falhou para tabela \"%s\": %s"
+
+#: pg_backup_db.c:657 pg_dump.c:1787
+#, c-format
+msgid "WARNING: unexpected extra results during COPY of table \"%s\"\n"
+msgstr "AVISO: resultados extra inesperados durante COPY da tabela \"%s\"\n"
+
+#: pg_backup_db.c:669
+msgid "could not start database transaction"
+msgstr "não pôde iniciar transação do banco de dados"
+
+#: pg_backup_db.c:677
+msgid "could not commit database transaction"
+msgstr "não pôde efetivar transação do banco de dados"
+
+#. translator: this is a module name
+#: pg_backup_directory.c:64
+msgid "directory archiver"
+msgstr "arquivador diretório"
+
+#: pg_backup_directory.c:162
+#, c-format
+msgid "no output directory specified\n"
+msgstr "nenhum diretório de destino foi especificado\n"
+
+#: pg_backup_directory.c:191
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "não pôde ler diretório \"%s\": %s\n"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "não pôde fechar diretório \"%s\": %s\n"
+
+#: pg_backup_directory.c:201
+#, c-format
+msgid "could not create directory \"%s\": %s\n"
+msgstr "não pôde criar diretório \"%s\": %s\n"
+
+#: pg_backup_directory.c:412
+#, c-format
+msgid "could not close data file: %s\n"
+msgstr "não pôde fechar arquivo de dados: %s\n"
+
+#: pg_backup_directory.c:453
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %s\n"
+msgstr "não pôde abrir arquivo TOC de objetos grandes \"%s\" para entrada: %s\n"
+
+#: pg_backup_directory.c:464
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\"\n"
+msgstr "linha inválida em arquivo TOC de objetos grandes \"%s\": \"%s\"\n"
+
+#: pg_backup_directory.c:473
+#, c-format
+msgid "error reading large object TOC file \"%s\"\n"
+msgstr "erro ao ler arquivo TOC de objetos grandes \"%s\"\n"
+
+#: pg_backup_directory.c:477
+#, c-format
+msgid "could not close large object TOC file \"%s\": %s\n"
+msgstr "não pôde fechar arquivo TOC de objetos grandes \"%s\": %s\n"
+
+#: pg_backup_directory.c:684
+#, c-format
+msgid "could not write to blobs TOC file\n"
+msgstr "não pôde escrever em arquivo TOC de objetos grandes\n"
+
+#: pg_backup_directory.c:716
+#, c-format
+msgid "file name too long: \"%s\"\n"
+msgstr "nome de arquivo muito longo: \"%s\"\n"
+
+#: pg_backup_directory.c:802
+#, c-format
+msgid "error during backup\n"
+msgstr "erro durante cópia de segurança\n"
+
+#: pg_backup_null.c:75
+#, c-format
+msgid "this format cannot be read\n"
+msgstr "este formato não pode ser lido\n"
+
+#. translator: this is a module name
+#: pg_backup_tar.c:102
+msgid "tar archiver"
+msgstr "arquivador tar"
+
+#: pg_backup_tar.c:183
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %s\n"
+msgstr "não pôde abrir arquivo TOC \"%s\" para saída: %s\n"
+
+#: pg_backup_tar.c:191
+#, c-format
+msgid "could not open TOC file for output: %s\n"
+msgstr "não pôde abrir arquivo TOC para saída: %s\n"
+
+#: pg_backup_tar.c:212 pg_backup_tar.c:368
+#, c-format
+msgid "compression is not supported by tar archive format\n"
+msgstr "compressão não é suportada pelo formato tar\n"
+
+#: pg_backup_tar.c:220
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %s\n"
+msgstr "não pôde abrir arquivo TOC \"%s\" para entrada: %s\n"
+
+#: pg_backup_tar.c:227
+#, c-format
+msgid "could not open TOC file for input: %s\n"
+msgstr "não pôde abrir arquivo TOC para entrada: %s\n"
+
+#: pg_backup_tar.c:354
+#, c-format
+msgid "could not find file \"%s\" in archive\n"
+msgstr "não pôde encontrar arquivo \"%s\" no arquivo de dados\n"
+
+#: pg_backup_tar.c:420
+#, c-format
+msgid "could not generate temporary file name: %s\n"
+msgstr "não pôde gerar arquivo temporário: %s\n"
+
+#: pg_backup_tar.c:431
+#, c-format
+msgid "could not open temporary file\n"
+msgstr "não pôde abrir arquivo temporário\n"
+
+#: pg_backup_tar.c:458
+#, c-format
+msgid "could not close tar member\n"
+msgstr "não pôde fechar membro tar\n"
+
+#: pg_backup_tar.c:571
+#, c-format
+msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+msgstr "erro interno -- th e fh não foram especificados em tarReadRaw()\n"
+
+#: pg_backup_tar.c:694
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\"\n"
+msgstr "sintaxe do comando COPY inesperada: \"%s\"\n"
+
+#: pg_backup_tar.c:960
+#, c-format
+msgid "invalid OID for large object (%u)\n"
+msgstr "OID inválido para objeto grande (%u)\n"
+
+#: pg_backup_tar.c:1104
+#, c-format
+msgid "could not close temporary file: %s\n"
+msgstr "não pôde fechar arquivo temporário: %s\n"
+
+#: pg_backup_tar.c:1114
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)\n"
+msgstr "tamanho do arquivo atual (%s) não corresponde ao esperado (%s)\n"
+
+#: pg_backup_tar.c:1151
+#, c-format
+msgid "moving from position %s to next member at file position %s\n"
+msgstr "movendo da posição %s para próximo membro na posição %s do arquivo\n"
+
+#: pg_backup_tar.c:1162
+#, c-format
+msgid "now at file position %s\n"
+msgstr "agora na posição %s do arquivo\n"
+
+#: pg_backup_tar.c:1171 pg_backup_tar.c:1201
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive\n"
+msgstr "não pôde encontrar cabeçalho do arquivo \"%s\" no arquivo tar\n"
+
+#: pg_backup_tar.c:1185
+#, c-format
+msgid "skipping tar member %s\n"
+msgstr "ignorando membro tar %s\n"
+
+#: pg_backup_tar.c:1189
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file.\n"
+msgstr "restaurar dados fora da ordem não é suportado neste formato de arquivo: \"%s\" é requerido, mas vem antes de \"%s\" no arquivo.\n"
+
+#: pg_backup_tar.c:1235
+#, c-format
+msgid "incomplete tar header found (%lu byte)\n"
+msgid_plural "incomplete tar header found (%lu bytes)\n"
+msgstr[0] "cabeçalho tar incompleto encontrado (%lu byte)\n"
+msgstr[1] "cabeçalho tar incompleto encontrado (%lu bytes)\n"
+
+#: pg_backup_tar.c:1276
+#, c-format
+msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+msgstr "Registro TOC %s em %s (tamanho %s, soma de verificação %d)\n"
+
+#: pg_backup_tar.c:1287
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s\n"
+msgstr "cabeçalho tar corrompido foi encontrado em %s (esperado %d, computado %d) na posição %s do arquivo\n"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "%s: unrecognized section name: \"%s\"\n"
+msgstr "%s: nome de seção desconhecido: \"%s\"\n"
+
+#: pg_backup_utils.c:56 pg_dump.c:533 pg_dump.c:550 pg_dumpall.c:299
+#: pg_dumpall.c:309 pg_dumpall.c:319 pg_dumpall.c:328 pg_dumpall.c:344
+#: pg_dumpall.c:402 pg_restore.c:279 pg_restore.c:295 pg_restore.c:307
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_backup_utils.c:118
+#, c-format
+msgid "out of on_exit_nicely slots\n"
+msgstr "acabaram os elementos para on_exit_nicely\n"
+
+#: pg_dump.c:503
+#, c-format
+msgid "compression level must be in range 0..9\n"
+msgstr "nível de compressão deve estar no intervalo de 0..9\n"
+
+#: pg_dump.c:548 pg_dumpall.c:307 pg_restore.c:293
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_dump.c:561
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together\n"
+msgstr "opções -s/--schema-only e -a/--data-only não podem ser utilizadas juntas\n"
+
+#: pg_dump.c:567
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together\n"
+msgstr "opções -c/--clean e -a/--data-only não podem ser utilizadas juntas\n"
+
+#: pg_dump.c:573
+#, c-format
+msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+msgstr "opções --inserts/--column-inserts e -o/--oids não podem ser utilizadas juntas\n"
+
+#: pg_dump.c:574
+#, c-format
+msgid "(The INSERT command cannot set OIDs.)\n"
+msgstr "(O comando INSERT não pode definir OIDs.)\n"
+
+#: pg_dump.c:579
+#, c-format
+msgid "option --if-exists requires option -c/--clean\n"
+msgstr "opção --if-exists requer opção -c/--clean\n"
+
+#: pg_dump.c:601
+#, c-format
+msgid "WARNING: requested compression not available in this installation -- archive will be uncompressed\n"
+msgstr "AVISO: compressão requerida não está disponível nesta instalação -- arquivo será descomprimido\n"
+
+#: pg_dump.c:616
+#, c-format
+msgid "%s: invalid number of parallel jobs\n"
+msgstr "%s: número de tarefas paralelas inválido\n"
+
+#: pg_dump.c:620
+#, c-format
+msgid "parallel backup only supported by the directory format\n"
+msgstr "cópia de segurança paralela somente é suportada pelo formato diretório\n"
+
+#: pg_dump.c:677
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots.\n"
+msgstr ""
+"Instantâneos sincronizados não são suportados por esta versão do servidor.\n"
+"Execute com --no-synchronized-snapshots se você não precisa de\n"
+"instantâneos sincronizados.\n"
+
+#: pg_dump.c:684
+#, c-format
+msgid "Exported snapshots are not supported by this server version.\n"
+msgstr "Instantâneos exportados não são suportados por esta versão do servidor.\n"
+
+#: pg_dump.c:695
+#, c-format
+msgid "last built-in OID is %u\n"
+msgstr "último OID interno é %u\n"
+
+#: pg_dump.c:705
+#, c-format
+msgid "no matching schemas were found\n"
+msgstr "nenhum esquema correspondente foi encontrado\n"
+
+#: pg_dump.c:719
+#, c-format
+msgid "no matching tables were found\n"
+msgstr "nenhuma tabela correspondente foi encontrada\n"
+
+#: pg_dump.c:878
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s salva um banco de dados em um arquivo texto ou em outros formatos.\n"
+"\n"
+
+#: pg_dump.c:879 pg_dumpall.c:547 pg_restore.c:437
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_dump.c:880
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPÇÃO]... [NOMEBD]\n"
+
+#: pg_dump.c:882 pg_dumpall.c:550 pg_restore.c:440
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Opções gerais:\n"
+
+#: pg_dump.c:883
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ARQUIVO nome do arquivo ou diretório de saída\n"
+
+#: pg_dump.c:884
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p formato do arquivo de saída (personalizado, diretório,\n"
+" tar, texto (padrão))\n"
+
+#: pg_dump.c:886
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM use esse número de tarefas paralelas para copiar\n"
+
+#: pg_dump.c:887
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose modo informações detalhadas\n"
+
+#: pg_dump.c:888 pg_dumpall.c:552
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_dump.c:889
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 nível de compressão para formatos comprimidos\n"
+
+#: pg_dump.c:890 pg_dumpall.c:553
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TEMPO falha após esperar TEMPO por um travamento de tabela\n"
+
+#: pg_dump.c:891 pg_dumpall.c:554
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_dump.c:893 pg_dumpall.c:555
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Opções que controlam a saída do conteúdo:\n"
+
+#: pg_dump.c:894 pg_dumpall.c:556
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only copia somente os dados, não o esquema\n"
+
+#: pg_dump.c:895
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs inclui objetos grandes na cópia de segurança\n"
+
+#: pg_dump.c:896 pg_restore.c:451
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean exclui (remove) bancos de dados antes de criá-lo novamente\n"
+
+#: pg_dump.c:897
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create inclui comandos para criação dos bancos de dados na cópia de segurança\n"
+
+#: pg_dump.c:898
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=CODIFICAÇÃO copia dados na codificação CODIFICAÇÃO\n"
+
+#: pg_dump.c:899
+#, c-format
+msgid " -n, --schema=SCHEMA dump the named schema(s) only\n"
+msgstr " -n, --schema=ESQUEMA copia somente o(s) esquema(s) especificado(s)\n"
+
+#: pg_dump.c:900
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do NOT dump the named schema(s)\n"
+msgstr " -N, --exclude-schema=ESQUEMA NÃO copia o(s) esquema(s) especificado(s)\n"
+
+#: pg_dump.c:901 pg_dumpall.c:559
+#, c-format
+msgid " -o, --oids include OIDs in dump\n"
+msgstr " -o, --oids inclui OIDs na cópia de segurança\n"
+
+#: pg_dump.c:902
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner ignora restauração do dono dos objetos\n"
+" no formato texto\n"
+
+#: pg_dump.c:904 pg_dumpall.c:562
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only copia somente o esquema, e não os dados\n"
+
+#: pg_dump.c:905
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NOME nome de super-usuário a ser usado no formato texto\n"
+
+#: pg_dump.c:906
+#, c-format
+msgid " -t, --table=TABLE dump the named table(s) only\n"
+msgstr " -t, --table=TABELA copia somente a(s) tabela(s) especificada(s)\n"
+
+#: pg_dump.c:907
+#, c-format
+msgid " -T, --exclude-table=TABLE do NOT dump the named table(s)\n"
+msgstr " -T, --exclude-table=TABELA NÃO copia a(s) tabela(s) especificada(s)\n"
+
+#: pg_dump.c:908 pg_dumpall.c:565
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges não copia os privilégios (grant/revoke)\n"
+
+#: pg_dump.c:909 pg_dumpall.c:566
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade usado somente por utilitários de atualização\n"
+
+#: pg_dump.c:910 pg_dumpall.c:567
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts copia dados utilizando comandos INSERT com nomes das colunas\n"
+
+#: pg_dump.c:911 pg_dumpall.c:568
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting desabilita delimitação por cifrão, usa delimitadores do padrão SQL\n"
+
+#: pg_dump.c:912 pg_dumpall.c:569 pg_restore.c:467
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers desabilita gatilhos durante a restauração do tipo somente dados\n"
+
+#: pg_dump.c:913
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security habilita segurança de registros (copia somente conteúdo\n"
+" que usuário tenha acesso)\n"
+
+#: pg_dump.c:915
+#, c-format
+msgid " --exclude-table-data=TABLE do NOT dump data for the named table(s)\n"
+msgstr " --exclude-table-data=TABELA NÃO copia os dados da(s) tabela(s) especificada(s)\n"
+
+#: pg_dump.c:916 pg_dumpall.c:570 pg_restore.c:469
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists use IF EXISTS ao remover objetos\n"
+
+#: pg_dump.c:917 pg_dumpall.c:571
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts copia dados utilizando comandos INSERT, ao invés de comandos COPY\n"
+
+#: pg_dump.c:918 pg_dumpall.c:572
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels não copia atribuições de rótulos de segurança\n"
+
+#: pg_dump.c:919
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots não utiliza instantâneos sincronizados em tarefas paralelas\n"
+
+#: pg_dump.c:920 pg_dumpall.c:573
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces não copia atribuições de tablespaces\n"
+
+#: pg_dump.c:921 pg_dumpall.c:574
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data não copia dados de tabelas unlogged\n"
+
+#: pg_dump.c:922 pg_dumpall.c:575
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers todos os identificadores entre aspas, mesmo que não sejam palavras chave\n"
+
+#: pg_dump.c:923
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEÇÃO copia seção especificada (pre-data, data ou post-data)\n"
+
+#: pg_dump.c:924
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable espera até que a cópia seja executada sem anomalias\n"
+
+#: pg_dump.c:925
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=INSTANTÂNEO utiliza instantâneo informado para a cópia\n"
+
+#: pg_dump.c:926 pg_restore.c:475
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names requer tabela e/ou esquema incluir padrões que\n"
+" correspondem pelo menos a uma entidade de cada\n"
+
+#: pg_dump.c:928 pg_dumpall.c:576 pg_restore.c:477
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" usa comandos SET SESSION AUTHORIZATION ao invés de\n"
+" comandos ALTER OWNER para definir o dono\n"
+
+#: pg_dump.c:932 pg_dumpall.c:580 pg_restore.c:481
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opções de conexão:\n"
+
+#: pg_dump.c:933
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser copiado\n"
+
+#: pg_dump.c:934 pg_dumpall.c:582 pg_restore.c:482
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: pg_dump.c:935 pg_dumpall.c:584 pg_restore.c:483
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORTA número da porta do servidor de banco de dados\n"
+
+#: pg_dump.c:936 pg_dumpall.c:585 pg_restore.c:484
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NOME conecta como usuário do banco de dados especificado\n"
+
+#: pg_dump.c:937 pg_dumpall.c:586 pg_restore.c:485
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pergunta senha\n"
+
+#: pg_dump.c:938 pg_dumpall.c:587 pg_restore.c:486
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password pergunta senha (pode ocorrer automaticamente)\n"
+
+#: pg_dump.c:939 pg_dumpall.c:588
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=NOMEROLE executa SET ROLE antes da cópia de segurança\n"
+
+#: pg_dump.c:941
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se o nome da base de dados não for fornecido, a variável de ambiente\n"
+"PGDATABASE é utilizada.\n"
+"\n"
+
+#: pg_dump.c:943 pg_dumpall.c:592 pg_restore.c:493
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Relate erros a <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_dump.c:960
+#, c-format
+msgid "invalid client encoding \"%s\" specified\n"
+msgstr "codificação de cliente \"%s\" especificada é inválida\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported on standby servers.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots.\n"
+msgstr ""
+"Instantâneos sincronizados não são suportados em servidores em espera.\n"
+"Execute com --no-synchronized-snapshots se você não precisa de\n"
+"instantâneos sincronizados.\n"
+
+#: pg_dump.c:1171
+#, c-format
+msgid "invalid output format \"%s\" specified\n"
+msgstr "formato de saída especificado \"%s\" é inválido\n"
+
+#: pg_dump.c:1194
+#, c-format
+msgid "server version must be at least 7.3 to use schema selection switches\n"
+msgstr "versão do servidor deve ser pelo menos versão 7.3 para utilizar opções com esquemas\n"
+
+#: pg_dump.c:1212 pg_dump.c:1265
+#, c-format
+msgid "no matching tables were found for pattern \"%s\"\n"
+msgstr "nenhuma tabela correspondente foi encontrada para padrão \"%s\"\n"
+
+#: pg_dump.c:1644
+#, c-format
+msgid "dumping contents of table \"%s.%s\"\n"
+msgstr "copiando conteúdo da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:1768
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.\n"
+msgstr "Cópia do conteúdo da tabela \"%s\" falhou: PQgetCopyData() falhou.\n"
+
+#: pg_dump.c:1769 pg_dump.c:1779
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Mensagem de erro do servidor: %s"
+
+#: pg_dump.c:1770 pg_dump.c:1780
+#, c-format
+msgid "The command was: %s\n"
+msgstr "O comando foi: %s\n"
+
+#: pg_dump.c:1778
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed.\n"
+msgstr "Cópia do conteúdo da tabela \"%s\" falhou: PQgetResult() falhou.\n"
+
+#: pg_dump.c:2427
+#, c-format
+msgid "saving database definition\n"
+msgstr "salvando definição do banco de dados\n"
+
+#: pg_dump.c:2760
+#, c-format
+msgid "saving encoding = %s\n"
+msgstr "salvando codificação = %s\n"
+
+#: pg_dump.c:2787
+#, c-format
+msgid "saving standard_conforming_strings = %s\n"
+msgstr "salvando padrão de escape de cadeia de caracteres = %s\n"
+
+#: pg_dump.c:2827
+#, c-format
+msgid "reading large objects\n"
+msgstr "lendo objetos grandes\n"
+
+#: pg_dump.c:3013
+#, c-format
+msgid "saving large objects\n"
+msgstr "salvando objetos grandes\n"
+
+#: pg_dump.c:3060
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "erro ao ler objeto grande %u: %s"
+
+#: pg_dump.c:3112
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\"\n"
+msgstr "lendo informação de segurança de registros da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:3143
+#, c-format
+msgid "reading policies for table \"%s.%s\"\n"
+msgstr "lendo políticas de segurança da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:3276
+#, c-format
+msgid "unexpected policy command type: \"%s\"\n"
+msgstr "tipo de comando da política de segurança inesperado: \"%s\"\n"
+
+#: pg_dump.c:3495
+#, c-format
+msgid "could not find parent extension for %s\n"
+msgstr "não pôde encontrar extensão pai para %s\n"
+
+#: pg_dump.c:3663
+#, c-format
+msgid "WARNING: owner of schema \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono do esquema \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:3706
+#, c-format
+msgid "schema with OID %u does not exist\n"
+msgstr "esquema com OID %u não existe\n"
+
+#: pg_dump.c:4121
+#, c-format
+msgid "WARNING: owner of data type \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono do tipo de dado \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:4235
+#, c-format
+msgid "WARNING: owner of operator \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono do operador \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:4580
+#, c-format
+msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono da classe de operadores \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:4671
+#, c-format
+msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono da família de operadores \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:4872
+#, c-format
+msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono da função de agregação \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:5137
+#, c-format
+msgid "WARNING: owner of function \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono da função \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:5999
+#, c-format
+msgid "WARNING: owner of table \"%s\" appears to be invalid\n"
+msgstr "AVISO: dono da tabela \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:6165
+#, c-format
+msgid "reading indexes for table \"%s.%s\"\n"
+msgstr "lendo índices da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:6533
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\"\n"
+msgstr "lendo restrições de chave estrangeira da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:6779
+#, c-format
+msgid "failed sanity check, parent table OID %u of pg_rewrite entry OID %u not found\n"
+msgstr "verificação de sanidade falhou, OID %u da tabela pai de pg_rewrite com OID %u não foi encontrado\n"
+
+#: pg_dump.c:6873
+#, c-format
+msgid "reading triggers for table \"%s.%s\"\n"
+msgstr "lendo gatilhos da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:7038
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)\n"
+msgstr "consulta produziu nome nulo da tabela referenciada pelo gatilho de chave estrangeira \"%s\" na tabela \"%s\" (OID da tabela: %u)\n"
+
+#: pg_dump.c:7693
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\"\n"
+msgstr "encontrando as colunas e tipos da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:7872
+#, c-format
+msgid "invalid column numbering in table \"%s\"\n"
+msgstr "numeração de coluna inválida para tabela \"%s\"\n"
+
+#: pg_dump.c:7906
+#, c-format
+msgid "finding default expressions of table \"%s.%s\"\n"
+msgstr "encontrando expressões padrão da tabela \"%s.%s\"\n"
+
+#: pg_dump.c:7959
+#, c-format
+msgid "invalid adnum value %d for table \"%s\"\n"
+msgstr "valor %d do número da coluna é inválido para tabela \"%s\"\n"
+
+#: pg_dump.c:8031
+#, c-format
+msgid "finding check constraints for table \"%s.%s\"\n"
+msgstr "encontrando restrições de verificação para tabela \"%s.%s\"\n"
+
+#: pg_dump.c:8127
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d\n"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d\n"
+msgstr[0] "esperado %d restrição de verificação na tabela \"%s\" mas encontrou %d\n"
+msgstr[1] "esperado %d restrições de verificação na tabela \"%s\" mas encontrou %d\n"
+
+#: pg_dump.c:8131
+#, c-format
+msgid "(The system catalogs might be corrupted.)\n"
+msgstr "(O catálogo do sistema pode estar corrompido).\n"
+
+#: pg_dump.c:9663
+#, c-format
+msgid "WARNING: typtype of data type \"%s\" appears to be invalid\n"
+msgstr "AVISO: typtype do tipo de dado \"%s\" parece ser inválido\n"
+
+#: pg_dump.c:11205
+#, c-format
+msgid "WARNING: bogus value in proargmodes array\n"
+msgstr "AVISO: valor inválido na matriz proargmodes\n"
+
+#: pg_dump.c:11583
+#, c-format
+msgid "WARNING: could not parse proallargtypes array\n"
+msgstr "AVISO: não pôde validar matriz proallargtypes\n"
+
+#: pg_dump.c:11599
+#, c-format
+msgid "WARNING: could not parse proargmodes array\n"
+msgstr "AVISO: não pôde validar matriz proargmodes\n"
+
+#: pg_dump.c:11613
+#, c-format
+msgid "WARNING: could not parse proargnames array\n"
+msgstr "AVISO: não pôde validar matriz proargnames\n"
+
+#: pg_dump.c:11624
+#, c-format
+msgid "WARNING: could not parse proconfig array\n"
+msgstr "AVISO: não pôde validar matriz proconfig\n"
+
+#: pg_dump.c:11695
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\"\n"
+msgstr "valor de provolatile desconhecido para função \"%s\"\n"
+
+#: pg_dump.c:11739 pg_dump.c:13782
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\"\n"
+msgstr "valor de proparallel desconhecido para função \"%s\"\n"
+
+#: pg_dump.c:11891
+#, c-format
+msgid "WARNING: bogus value in pg_cast.castfunc or pg_cast.castmethod field\n"
+msgstr "AVISO: valor inválido no campo pg_cast.castfunc ou pg_cast.castmethod\n"
+
+#: pg_dump.c:11894
+#, c-format
+msgid "WARNING: bogus value in pg_cast.castmethod field\n"
+msgstr "AVISO: valor inválido no campo pg_cast.castmethod\n"
+
+#: pg_dump.c:11982
+#, c-format
+msgid "WARNING: bogus transform definition, at least one of trffromsql and trftosql should be nonzero\n"
+msgstr "AVISO: definição de transformação inválida, pelo menos um dos trffromsql e trftosql não devem ser zero\n"
+
+#: pg_dump.c:11999
+#, c-format
+msgid "WARNING: bogus value in pg_transform.trffromsql field\n"
+msgstr "AVISO: valor inválido no campo pg_transform.trffromsql\n"
+
+#: pg_dump.c:12020
+#, c-format
+msgid "WARNING: bogus value in pg_transform.trftosql field\n"
+msgstr "AVISO: valor inválido no campo pg_cast.trftosql\n"
+
+#: pg_dump.c:12411
+#, c-format
+msgid "WARNING: could not find operator with OID %s\n"
+msgstr "AVISO: não pôde encontrar operador com OID %s\n"
+
+#: pg_dump.c:12475
+#, c-format
+msgid "WARNING: invalid type \"%c\" of access method \"%s\"\n"
+msgstr "AVISO: tipo inválido \"%c\" do método de acesso \"%s\"\n"
+
+#: pg_dump.c:13673
+#, c-format
+msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n"
+msgstr "AVISO: função de agregação %s não pôde ser copiada corretamente para esta versão do banco de dados; ignorado\n"
+
+#: pg_dump.c:14545
+#, c-format
+msgid "unrecognized object type in default privileges: %d\n"
+msgstr "tipo de objeto desconhecido em privilégios padrão: %d\n"
+
+#: pg_dump.c:14560
+#, c-format
+msgid "could not parse default ACL list (%s)\n"
+msgstr "não pôde validar a lista ACL (%s)\n"
+
+#: pg_dump.c:14631
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)\n"
+msgstr "não pôde validar a lista inicial ACL do GRANT (%s) ou lista inicial ACL do REVOKE (%s) para objeto \"%s\" (%s)\n"
+
+#: pg_dump.c:14639
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)\n"
+msgstr "não pôde validar a lista ACL do GRANT (%s) ou lista ACL do REVOKE (%s) para objeto \"%s\" (%s)\n"
+
+#: pg_dump.c:15123
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data\n"
+msgstr "consulta para obter definição da visão \"%s\" não retornou dados\n"
+
+#: pg_dump.c:15126
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition\n"
+msgstr "consulta para obter definição da visão \"%s\" retornou mais de uma definição\n"
+
+#: pg_dump.c:15133
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)\n"
+msgstr "definição da visão \"%s\" parece estar vazia (tamanho zero)\n"
+
+#: pg_dump.c:15892
+#, c-format
+msgid "invalid column number %d for table \"%s\"\n"
+msgstr "número de colunas %d é inválido para tabela \"%s\"\n"
+
+#: pg_dump.c:16021
+#, c-format
+msgid "missing index for constraint \"%s\"\n"
+msgstr "faltando índice para restrição \"%s\"\n"
+
+#: pg_dump.c:16224
+#, c-format
+msgid "unrecognized constraint type: %c\n"
+msgstr "tipo de restrição é desconhecido: %c\n"
+
+#: pg_dump.c:16378 pg_dump.c:16547
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)\n"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)\n"
+msgstr[0] "consulta para obter dados da sequência \"%s\" retornou %d linha (esperado 1)\n"
+msgstr[1] "consulta para obter dados da sequência \"%s\" retornou %d linhas (esperado 1)\n"
+
+#: pg_dump.c:16389
+#, c-format
+msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+msgstr "consulta para obter dados sobre sequência \"%s\" retornou nome \"%s\"\n"
+
+#: pg_dump.c:16645
+#, c-format
+msgid "unexpected tgtype value: %d\n"
+msgstr "valor tgtype inesperado: %d\n"
+
+#: pg_dump.c:16727
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"\n"
+msgstr "argumento inválido (%s) para gatilho \"%s\" na tabela \"%s\"\n"
+
+#: pg_dump.c:16924
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned\n"
+msgstr "consulta para obter regra \"%s\" para tabela \"%s\" falhou: número incorreto de registros foi retornado\n"
+
+#: pg_dump.c:17313
+#, c-format
+msgid "reading dependency data\n"
+msgstr "lendo dados sobre dependência\n"
+
+#: pg_dump.c:17870
+#, c-format
+msgid "WARNING: could not parse reloptions array\n"
+msgstr "AVISO: não pôde validar matriz reloptions\n"
+
+#. translator: this is a module name
+#: pg_dump_sort.c:23
+msgid "sorter"
+msgstr "classificador"
+
+#: pg_dump_sort.c:491
+#, c-format
+msgid "invalid dumpId %d\n"
+msgstr "dumpId %d é inválido\n"
+
+#: pg_dump_sort.c:497
+#, c-format
+msgid "invalid dependency %d\n"
+msgstr "dependência %d é inválida\n"
+
+#: pg_dump_sort.c:730
+#, c-format
+msgid "could not identify dependency loop\n"
+msgstr "não pôde identificar dependência circular\n"
+
+#: pg_dump_sort.c:1262
+#, c-format
+msgid "NOTICE: there are circular foreign-key constraints on this table:\n"
+msgid_plural "NOTICE: there are circular foreign-key constraints among these tables:\n"
+msgstr[0] "NOTA: há restrições de chave estrangeiras circulares nessa tabela:\n"
+msgstr[1] "NOTA: há restrições de chave estrangeiras circulares entre essas tabelas:\n"
+
+#: pg_dump_sort.c:1266 pg_dump_sort.c:1286
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: pg_dump_sort.c:1267
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.\n"
+msgstr "Você pode não ser capaz de restaurar a cópia de segurança sem utilizar --disable-triggers ou removendo temporariamente as restrições.\n"
+
+#: pg_dump_sort.c:1268
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem.\n"
+msgstr "Considere utilizar uma cópia de segurança completa ao invés de cópia com --data-only para evitar este problema.\n"
+
+#: pg_dump_sort.c:1280
+#, c-format
+msgid "WARNING: could not resolve dependency loop among these items:\n"
+msgstr "AVISO: não pôde resolver dependência circular entre esses itens:\n"
+
+#: pg_dumpall.c:180
+#, c-format
+msgid ""
+"The program \"pg_dump\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"O programa \"pg_dump\" é requerido pelo %s mas não foi encontrado no\n"
+"mesmo diretório que \"%s\".\n"
+"Verifique sua instalação.\n"
+
+#: pg_dumpall.c:187
+#, c-format
+msgid ""
+"The program \"pg_dump\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"O programa \"pg_dump\" é requerido pelo \"%s\"\n"
+"mas não tem a mesma versão que %s.\n"
+"Verifique sua instalação.\n"
+
+#: pg_dumpall.c:317
+#, c-format
+msgid "%s: options -g/--globals-only and -r/--roles-only cannot be used together\n"
+msgstr "%s: opções -g/--globals-only e -r/--roles-only não podem ser utilizadas juntas\n"
+
+#: pg_dumpall.c:326
+#, c-format
+msgid "%s: options -g/--globals-only and -t/--tablespaces-only cannot be used together\n"
+msgstr "%s: opções -g/--globals-only e -t/--tablespaces-only não podem ser utilizadas juntas\n"
+
+#: pg_dumpall.c:335 pg_restore.c:345
+#, c-format
+msgid "%s: option --if-exists requires option -c/--clean\n"
+msgstr "%s: opção --if-exists requer opção -c/--clean\n"
+
+#: pg_dumpall.c:342
+#, c-format
+msgid "%s: options -r/--roles-only and -t/--tablespaces-only cannot be used together\n"
+msgstr "%s: opções -r/--roles-only e -t/--tablespaces-only não podem ser utilizadas juntas\n"
+
+#: pg_dumpall.c:384 pg_dumpall.c:1994
+#, c-format
+msgid "%s: could not connect to database \"%s\"\n"
+msgstr "%s: não pôde conectar ao banco de dados \"%s\"\n"
+
+#: pg_dumpall.c:399
+#, c-format
+msgid ""
+"%s: could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database.\n"
+msgstr ""
+"%s: não pôde se conectar aos bancos de dados \"postgres\" ou \"template1\"\n"
+"Por favor especifique um banco de dados alternativo.\n"
+
+#: pg_dumpall.c:416
+#, c-format
+msgid "%s: could not open the output file \"%s\": %s\n"
+msgstr "%s: não pôde abrir o arquivo de saída \"%s\": %s\n"
+
+#: pg_dumpall.c:546
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s salva os bancos de dados de um agrupamento do PostgreSQL em um arquivo de script.\n"
+"\n"
+
+#: pg_dumpall.c:548
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPÇÃO]...\n"
+
+#: pg_dumpall.c:551
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ARQUIVO nome do arquivo de saída\n"
+
+#: pg_dumpall.c:557
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean exclui (remove) bancos de dados antes de criá-los novamente\n"
+
+#: pg_dumpall.c:558
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only copia somente objetos globais, e não bancos de dados\n"
+
+#: pg_dumpall.c:560 pg_restore.c:459
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner ignora restauração dos donos dos objetos\n"
+
+#: pg_dumpall.c:561
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only copia somente roles, e não bancos de dados ou tablespaces\n"
+
+#: pg_dumpall.c:563
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NOME especifica o nome do super-usuário a ser usado na cópia de segurança\n"
+
+#: pg_dumpall.c:564
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only copia somente tablespaces, e não bancos de dados ou roles\n"
+
+#: pg_dumpall.c:581
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=TEXTO cadeia de caracteres de conexão\n"
+
+#: pg_dumpall.c:583
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=NOMEBD especifica um banco de dados padrão alternativo\n"
+
+#: pg_dumpall.c:590
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Se -f/--file não é utilizado, o script SQL será escrito na saída\n"
+" padrão.\n"
+"\n"
+
+#: pg_dumpall.c:791
+#, c-format
+msgid "%s: role name starting with \"pg_\" skipped (%s)\n"
+msgstr "%s: nome de role iniciando com \"pg_\" foi ignorada (%s)\n"
+
+#: pg_dumpall.c:1168
+#, c-format
+msgid "%s: could not parse ACL list (%s) for tablespace \"%s\"\n"
+msgstr "%s: não pôde validar lista ACL (%s) da tablespace \"%s\"\n"
+
+#: pg_dumpall.c:1536
+#, c-format
+msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+msgstr "%s: não pôde validar lista ACL (%s) do banco de dados \"%s\"\n"
+
+#: pg_dumpall.c:1754
+#, c-format
+msgid "%s: dumping database \"%s\"...\n"
+msgstr "%s: copiando banco de dados \"%s\"...\n"
+
+#: pg_dumpall.c:1778
+#, c-format
+msgid "%s: pg_dump failed on database \"%s\", exiting\n"
+msgstr "%s: pg_dump falhou no banco de dados \"%s\", terminando\n"
+
+#: pg_dumpall.c:1787
+#, c-format
+msgid "%s: could not re-open the output file \"%s\": %s\n"
+msgstr "%s: não pôde abrir o arquivo de saída \"%s\" novamente: %s\n"
+
+#: pg_dumpall.c:1832
+#, c-format
+msgid "%s: running \"%s\"\n"
+msgstr "%s: executando \"%s\"\n"
+
+#: pg_dumpall.c:2016
+#, c-format
+msgid "%s: could not connect to database \"%s\": %s\n"
+msgstr "%s: não pôde conectar ao banco de dados \"%s\": %s\n"
+
+#: pg_dumpall.c:2046
+#, c-format
+msgid "%s: could not get server version\n"
+msgstr "%s: não pôde obter a versão do servidor\n"
+
+#: pg_dumpall.c:2052
+#, c-format
+msgid "%s: could not parse server version \"%s\"\n"
+msgstr "%s: não pôde validar a versão do servidor \"%s\"\n"
+
+#: pg_dumpall.c:2130 pg_dumpall.c:2156
+#, c-format
+msgid "%s: executing %s\n"
+msgstr "%s: executando %s\n"
+
+#: pg_dumpall.c:2136 pg_dumpall.c:2162
+#, c-format
+msgid "%s: query failed: %s"
+msgstr "%s: consulta falhou: %s"
+
+#: pg_dumpall.c:2138 pg_dumpall.c:2164
+#, c-format
+msgid "%s: query was: %s\n"
+msgstr "%s: consulta foi: %s\n"
+
+#: pg_restore.c:305
+#, c-format
+msgid "%s: options -d/--dbname and -f/--file cannot be used together\n"
+msgstr "%s: opções -d/--dbname e -f/--file não podem ser utilizadas juntas\n"
+
+#: pg_restore.c:316
+#, c-format
+msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+msgstr "%s: opções -s/--schema-only e -a/--data-only não podem ser utilizadas juntas\n"
+
+#: pg_restore.c:323
+#, c-format
+msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+msgstr "%s: opções -c/--clean e -a/--data-only não podem ser utilizadas juntas\n"
+
+#: pg_restore.c:331
+#, c-format
+msgid "%s: cannot specify both --single-transaction and multiple jobs\n"
+msgstr "%s: não pode especificar ambas opções --single-transaction e múltiplas tarefas\n"
+
+#: pg_restore.c:372
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"\n"
+msgstr "formato de archive desconhecido \"%s\"; por favor especifique \"c\", \"d\" ou \"t\"\n"
+
+#: pg_restore.c:404
+#, c-format
+msgid "%s: maximum number of parallel jobs is %d\n"
+msgstr "%s: número máximo de tarefas paralelas é %d\n"
+
+#: pg_restore.c:422
+#, c-format
+msgid "WARNING: errors ignored on restore: %d\n"
+msgstr "AVISO: erros ignorados durante restauração: %d\n"
+
+#: pg_restore.c:436
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s restaura um banco de dados PostgreSQL a partir de um arquivo criado pelo pg_dump.\n"
+"\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPÇÃO]... [ARQUIVO]\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NOME conecta ao banco de dados informado\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ARQUIVO nome do arquivo de saída\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t formato de arquivo de cópia de segurança (deve ser automático)\n"
+
+#: pg_restore.c:444
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list mostra TOC resumido do arquivo\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose modo de detalhe\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_restore.c:447
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Opções que controlam a restauração:\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only restaura somente os dados, não o esquema\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create cria o banco de dados informado\n"
+
+#: pg_restore.c:453
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error termina se houver erro, padrão é continuar\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NOME restaura o índice especificado\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM use esse número de tarefas paralelas para restaurar\n"
+
+#: pg_restore.c:456
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=ARQUIVO usa tabela de conteúdo deste arquivo para\n"
+" selecionar/ordenar saída\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NOME restaura somente objetos neste esquema\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NOME(args) restaura função especificada\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only restaura somente o esquema, e não os dados\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NOME nome do super-usuário usado para desabilitar os gatilhos\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NOME restaura tabela especificada (tabela, visão, etc)\n"
+
+#: pg_restore.c:464
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NOME restaura gatilho especificado\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges ignora restauração dos privilégios de acesso (grant/revoke)\n"
+
+#: pg_restore.c:466
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction restaura como uma transação única\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security habilita segurança de registros\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables não restaura dados de tabelas que não puderam ser\n"
+" criadas\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels não restaura as atribuições de rótulos de segurança\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces não restaura as atribuições de tablespaces\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEÇÃO restaura seção especificada (pre-data, data ou post-data)\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=NOMEROLE executa SET ROLE antes da restauração\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"As opções -I, -n, -P, -t, -T e --section podem ser combinadas e especificadas\n"
+"múltiplas vezes para selecionar múltiplos objetos.\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se nenhum arquivo de entrada é fornecido, a entrada padrão é utilizada.\n"
+"\n"
diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po
new file mode 100644
index 0000000..6b3dd37
--- /dev/null
+++ b/src/bin/pg_dump/po/ru.po
@@ -0,0 +1,3637 @@
+# Russian message translation file for pg_dump
+# Copyright (C) 2001-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2001-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2012.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-02-02 18:10+0300\n"
+"PO-Revision-Date: 2023-08-30 14:18+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "Ñта Ñборка программы не поддерживает Ñжатие %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "вмеÑто ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° пуÑÑ‚Ð°Ñ Ñтрока"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "нераÑпознанный параметр ÑжатиÑ: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть целочиÑленным"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть булевÑким"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ уровень ÑжатиÑ"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid ""
+"compression algorithm \"%s\" expects a compression level between %d and %d "
+"(default at %d)"
+msgstr ""
+"Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" ожидаетÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¾Ñ‚ %d до %d (по "
+"умолчанию %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ чиÑло потоков"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "алгоритм ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" не поддерживает режим большой диÑтанции"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "неверный иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\""
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "чтение раÑширений"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "выÑвление членов раÑширений"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "чтение Ñхем"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "чтение пользовательÑких таблиц"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "чтение пользовательÑких функций"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "чтение пользовательÑких типов"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "чтение процедурных Ñзыков"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "чтение пользовательÑких агрегатных функций"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "чтение пользовательÑких операторов"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "чтение пользовательÑких методов доÑтупа"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "чтение пользовательÑких клаÑÑов операторов"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "чтение пользовательÑких ÑемейÑтв операторов"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "чтение пользовательÑких анализаторов текÑтового поиÑка"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "чтение пользовательÑких шаблонов текÑтового поиÑка"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "чтение пользовательÑких Ñловарей текÑтового поиÑка"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "чтение пользовательÑких конфигураций текÑтового поиÑка"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "чтение пользовательÑких оболочек Ñторонних данных"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "чтение пользовательÑких Ñторонних Ñерверов"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "чтение прав по умолчанию"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "чтение пользовательÑких правил Ñортировки"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "чтение пользовательÑких преобразований"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "чтение приведений типов"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "чтение преобразований"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "чтение информации о наÑледовании таблиц"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "чтение Ñобытийных триггеров"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "поиÑк таблиц раÑширений"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "поиÑк ÑвÑзей наÑледованиÑ"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "чтение информации о Ñтолбцах интереÑующих таблиц"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "пометка наÑледованных Ñтолбцов в подтаблицах"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "чтение информации о Ñекционировании"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "чтение индекÑов"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "пометка индекÑов в Ñекционированных таблицах"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "чтение раÑширенной ÑтатиÑтики"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "чтение ограничений"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "чтение триггеров"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "чтение правил перезапиÑи"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "чтение политик"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "чтение публикаций"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "чтение информации о таблицах, включённых в публикации"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "чтение информации о Ñхемах, включённых в публикации"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "чтение подпиÑок"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr ""
+"нарушение целоÑтноÑти: родительÑÐºÐ°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ OID %u Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" (OID "
+"%u) не найдена"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "неверное чиÑло родителей (%d) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\""
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "не удалоÑÑŒ разобрать чиÑловой маÑÑив \"%s\": Ñлишком много чиÑел"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "не удалоÑÑŒ разобрать чиÑловой маÑÑив \"%s\": неверный Ñимвол в чиÑле"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не удалоÑÑŒ Ñжать данные: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "не удалоÑÑŒ раÑпаковать данные: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "не удалоÑÑŒ закрыть библиотеку ÑжатиÑ: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "не удалоÑÑŒ прочитать входной файл: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "не удалоÑÑŒ прочитать входной файл: конец файла"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ раÑпаковки LZ4: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "не удалоÑÑŒ раÑпаковать данные: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "не удалоÑÑŒ оÑвободить контекÑÑ‚ раÑпаковки LZ4: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "не удалоÑÑŒ завершить Ñжатие: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "не удалоÑÑŒ инициализировать LZ4: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "не удалоÑÑŒ завершить раÑпаковку: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "не удалоÑÑŒ задать параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\": %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "не удалоÑÑŒ раÑпаковать данные: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не удалоÑÑŒ прочитать входной файл: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "необрабатываемый режим \"%s\""
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "ошибка в %s() (код ошибки: %d)"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "не удалоÑÑŒ Ñоздать каналы межпроцеÑÑного взаимодейÑтвиÑ: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "не удалоÑÑŒ Ñоздать рабочий процеÑÑ: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "от ведущего процеÑÑа получена нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: \"%s\""
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "от рабочего процеÑÑа получено ошибочное Ñообщение: \"%s\""
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the "
+"table after the pg_dump parent process had gotten the initial ACCESS SHARE "
+"lock on the table."
+msgstr ""
+"не удалоÑÑŒ получить блокировку Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\".\n"
+"Обычно Ñто означает, что кто-то запроÑил блокировку ACCESS EXCLUSIVE Ð´Ð»Ñ "
+"Ñтой таблицы поÑле того, как родительÑкий процеÑÑ pg_dump получил Ð´Ð»Ñ Ð½ÐµÑ‘ "
+"начальную блокировку ACCESS SHARE."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "рабочий процеÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾ прервалÑÑ"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "не удалоÑÑŒ запиÑать в канал взаимодейÑтвиÑ: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: не удалоÑÑŒ Ñоздать Ñокет (код ошибки: %d)"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: не удалоÑÑŒ привÑзатьÑÑ Ðº Ñокету (код ошибки: %d)"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: не удалоÑÑŒ начать приём (код ошибки: %d)"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: ошибка в %s() (код ошибки: %d)"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: не удалоÑÑŒ Ñоздать второй Ñокет (код ошибки: %d)"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: не удалоÑÑŒ подключить Ñокет (код ошибки: %d)"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: не удалоÑÑŒ принÑÑ‚ÑŒ Ñоединение (код ошибки: %d)"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "не удалоÑÑŒ закрыть выходной файл: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "в поÑледовательноÑти Ñлементов архива нарушен порÑдок разделов"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "неожиданный код раздела %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr ""
+"параллельное воÑÑтановление не поддерживаетÑÑ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ форматом архивного "
+"файла"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr ""
+"параллельное воÑÑтановление возможно только Ð´Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¾Ð², Ñозданных pg_dump "
+"верÑии 8.0 и новее"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "воÑÑтановить данные из Ñжатого архива Ð½ÐµÐ»ÑŒÐ·Ñ (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "подключение к базе данных Ð´Ð»Ñ Ð²Ð¾ÑÑтановлениÑ"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr ""
+"прÑмые Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных не поддерживаютÑÑ Ð² архивах до верÑии 1.3"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "подразумеваетÑÑ Ð²Ð¾ÑÑтановление только данных"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "удалÑетÑÑ %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "не удалоÑÑŒ определить, куда добавить IF EXISTS в оператор \"%s\""
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "предупреждение из иÑходного файла: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "ÑоздаётÑÑ %s \"%s.%s\""
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "ÑоздаётÑÑ %s \"%s\""
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "подключение к новой базе данных \"%s\""
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "обрабатываетÑÑ %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "обрабатываютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ таблицы \"%s.%s\""
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "выполнÑетÑÑ %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "отключаютÑÑ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ñ‹ таблицы %s"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "включаютÑÑ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ñ‹ таблицы %s"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid ""
+"internal error -- WriteData cannot be called outside the context of a "
+"DataDumper routine"
+msgstr ""
+"внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° -- WriteData Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ вне контекÑта процедуры "
+"DataDumper"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "выбранный формат не поддерживает выгрузку больших объектов"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "воÑÑтановлен %d большой объект"
+msgstr[1] "воÑÑтановлено %d больших объекта"
+msgstr[2] "воÑÑтановлено %d больших объектов"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "воÑÑтановление большого объекта Ñ OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "не удалоÑÑŒ Ñоздать большой объект %u: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3740
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "не удалоÑÑŒ открыть большой объект %u: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\": %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "Ñтрока проигнорирована: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "не найдена запиÑÑŒ Ð´Ð»Ñ ID %d"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "не удалоÑÑŒ закрыть файл оглавлениÑ: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть выходной файл \"%s\": %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не удалоÑÑŒ открыть выходной файл: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "запиÑан %zu байт данных большого объекта (результат = %d)"
+msgstr[1] "запиÑано %zu байта данных большого объекта (результат = %d)"
+msgstr[2] "запиÑано %zu байт данных большого объекта (результат = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "не удалоÑÑŒ запиÑать данные в большой объект: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "при инициализации:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "при обработке оглавлениÑ:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "при завершении:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "из запиÑи Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "неверный dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "неверный dumpId таблицы в Ñлементе TABLE DATA"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "неожиданный флаг ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "Ñлишком большое Ñмещение в файле выгрузки"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "Ñлишком длинное Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid ""
+"directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not "
+"exist)"
+msgstr "каталог \"%s\" не похож на архивный (в нём отÑутÑтвует \"toc.dat\")"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть входной файл \"%s\": %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "не удалоÑÑŒ открыть входной файл: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "не удалоÑÑŒ прочитать входной файл: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "входной файл Ñлишком короткий (прочитано байт: %lu, ожидалоÑÑŒ: 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr ""
+"входной файл, видимо, имеет текÑтовый формат. Загрузите его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "входной файл не похож на архив (возможно, Ñлишком мал?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "входной файл не похож на архив"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "не удалоÑÑŒ закрыть входной файл: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "не удалоÑÑŒ открыть stdout Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð°: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "неопознанный формат файла: \"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4466
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "закончен объект %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4479
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "рабочий процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID запиÑи %d вне диапазона - возможно повреждено оглавление"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "воÑÑтановление таблиц Ñо ÑвойÑтвом WITH OIDS больше не поддерживаетÑÑ"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "неверный Ñлемент ENCODING: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "неверный Ñлемент STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "Ñхема \"%s\" не найдена"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "таблица \"%s\" не найдена"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не найден"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" не найдена"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "триггер \"%s\" не найден"
+
+#: pg_backup_archiver.c:3201
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "не удалоÑÑŒ переключить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑеанÑа на \"%s\": %s"
+
+#: pg_backup_archiver.c:3333
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "не удалоÑÑŒ приÑвоить search_path значение \"%s\": %s"
+
+#: pg_backup_archiver.c:3394
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "не удалоÑÑŒ задать Ð´Ð»Ñ default_tablespace значение %s: %s"
+
+#: pg_backup_archiver.c:3443
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "не удалоÑÑŒ задать default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3548
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "неизвеÑтно, как назначить владельца Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° типа \"%s\""
+
+#: pg_backup_archiver.c:3770
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "в заголовке файла не найдена Ð½ÑƒÐ¶Ð½Ð°Ñ Ñигнатура"
+
+#: pg_backup_archiver.c:3784
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ (%d.%d) в заголовке файла"
+
+#: pg_backup_archiver.c:3789
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "неÑоответÑтвие размера integer (%lu)"
+
+#: pg_backup_archiver.c:3793
+#, c-format
+msgid ""
+"archive was made on a machine with larger integers, some operations might "
+"fail"
+msgstr ""
+"архив был Ñделан на компьютере большей разрÑдноÑти -- возможен Ñбой "
+"некоторых операций"
+
+#: pg_backup_archiver.c:3803
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "ожидаемый формат (%d) отличаетÑÑ Ð¾Ñ‚ формата, указанного в файле (%d)"
+
+#: pg_backup_archiver.c:3825
+#, 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:3861
+#, c-format
+msgid "invalid creation date in header"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð² заголовке"
+
+#: pg_backup_archiver.c:3995
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "обработка объекта %d %s %s"
+
+#: pg_backup_archiver.c:4070
+#, c-format
+msgid "entering main parallel loop"
+msgstr "вход в оÑновной параллельный цикл"
+
+#: pg_backup_archiver.c:4081
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "объект %d %s %s пропуÑкаетÑÑ"
+
+#: pg_backup_archiver.c:4090
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "объект %d %s %s запуÑкаетÑÑ"
+
+#: pg_backup_archiver.c:4144
+#, c-format
+msgid "finished main parallel loop"
+msgstr "оÑновной параллельный цикл закончен"
+
+#: pg_backup_archiver.c:4180
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "обработка пропущенного объекта %d %s %s"
+
+#: pg_backup_archiver.c:4785
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "Ñоздать таблицу \"%s\" не удалоÑÑŒ, её данные не будут воÑÑтановлены"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "неверный OID большого объекта"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "ошибка при перемещении в файле: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "в блоке данных %d задана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "нераÑпознанный тип блока данных (%d) при поиÑке архива"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid ""
+"could not find block ID %d in archive -- possibly due to out-of-order "
+"restore request, which cannot be handled due to non-seekable input file"
+msgstr ""
+"не удалоÑÑŒ найти в архиве блок Ñ ID %d -- возможно, по причине не "
+"поÑледовательного запроÑа воÑÑтановлениÑ, который Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ Ñ "
+"файлом, не допуÑкающим произвольный доÑтуп"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "не удалоÑÑŒ найти в архиве блок Ñ ID %d -- возможно, архив иÑпорчен"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "при чтении данных получен неожиданный ID блока (%d) -- ожидалÑÑ: %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "нераÑпознанный тип блока данных %d при воÑÑтановлении архива"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "не удалоÑÑŒ определить позицию в файле архива: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "не удалоÑÑŒ закрыть файл архива: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "повторно открыть можно только входные файлы"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "параллельное воÑÑтановление из Ñтандартного ввода не поддерживаетÑÑ"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr ""
+"параллельное воÑÑтановление возможно только Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ произвольного доÑтупа"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "не удалоÑÑŒ задать текущую позицию в файле архива: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "Ñжатие активно"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "не удалоÑÑŒ получить верÑию Ñервера из libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "продолжение работы Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ верÑией Ñервера невозможно"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "верÑÐ¸Ñ Ñервера: %s; верÑÐ¸Ñ %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "подключение к базе данных уже уÑтановлено"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Пароль: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "не удалоÑÑŒ переподключитьÑÑ Ðº базе"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "переподключитьÑÑ Ð½Ðµ удалоÑÑŒ: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "ошибка при выполнении запроÑа: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "ВыполнÑлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтроку вмеÑто одной: %s"
+msgstr[1] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтроки вмеÑто одной: %s"
+msgstr[2] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтрок вмеÑто одной: %s"
+
+# skip-rule: language-mix
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sВыполнÑлаÑÑŒ команда: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "не удалоÑÑŒ выполнить запроÑ"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "ошибка в PQputCopyData: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "ошибка в PQputCopyEnd: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "Ñбой команды COPY Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\": %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2224
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "неожиданные лишние результаты получены при COPY Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\""
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "не удаётÑÑ Ð½Ð°Ñ‡Ð°Ñ‚ÑŒ транзакцию"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "не удалоÑÑŒ зафикÑировать транзакцию"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "выходной каталог не указан"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "не удалоÑÑŒ запиÑать в выходной файл: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "не удалоÑÑŒ закрыть файл данных: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл данных \"%s\": %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr ""
+"не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\": %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока в файле Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\": \"%s\""
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\""
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\": %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "не удалоÑÑŒ закрыть файл данных LO: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "не удалоÑÑŒ запиÑать в файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LO: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LO: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "Ñлишком длинное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "Ñтот формат Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\": %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи файл оглавлениÑ: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "формат архива tar не поддерживает Ñжатие"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\": %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» оглавлениÑ: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "не удалоÑÑŒ найти файл \"%s\" в архиве"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "не удалоÑÑŒ получить Ð¸Ð¼Ñ Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ файла: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "недопуÑтимый ÑинтакÑÐ¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° COPY: \"%s\""
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "неверный OID Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ объекта (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "не удалоÑÑŒ закрыть временный файл: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "дейÑÑ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° файла (%lld) не равна ожидаемой (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "в архиве tar не найден заголовок Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\""
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid ""
+"restoring data out of order is not supported in this archive format: \"%s\" "
+"is required, but comes before \"%s\" in the archive file."
+msgstr ""
+"непоÑледовательное воÑÑтановление данных Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ формата архива не "
+"поддерживаетÑÑ: требуетÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚ \"%s\", но в файле архива прежде идёт "
+"\"%s\"."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "найден неполный заголовок tar (размер %lu байт)"
+msgstr[1] "найден неполный заголовок tar (размер %lu байта)"
+msgstr[2] "найден неполный заголовок tar (размер %lu байт)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid ""
+"corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr ""
+"заголовок tar в %s повреждён (ожидалоÑÑŒ: %d, получено: %d), Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² файле: "
+"%llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "нераÑпознанное Ð¸Ð¼Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð°: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "превышен предел обработчиков штатного выхода"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "параметры -s/--schema-only и -a/--data-only иÑключают друг друга"
+
+#: pg_dump.c:699
+#, c-format
+msgid ""
+"options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr ""
+"параметры -s/--schema-only и --include-foreign-data иÑключают друг друга"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr ""
+"параметр --include-foreign-data не поддерживаетÑÑ Ð¿Ñ€Ð¸ копировании в "
+"параллельном режиме"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "параметры -c/--clean и -a/--data-only иÑключают друг друга"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "параметр --if-exists требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid ""
+"option --on-conflict-do-nothing requires option --inserts, --rows-per-"
+"insert, or --column-inserts"
+msgstr ""
+"параметр --on-conflict-do-nothing требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ --inserts, --rows-per-"
+"insert или --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "нераÑпознанный алгоритм ÑжатиÑ: \"%s\""
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "неправильное указание ÑжатиÑ: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "pg_dump в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ поддерживает параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\""
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr ""
+"параллельное резервное копирование поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ "
+"\"каталог\""
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "поÑледний ÑиÑтемный OID: %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "ÑоответÑтвующие Ñхемы не найдены"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "ÑоответÑтвующие таблицы не найдены"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "ÑоответÑтвующие раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ найдены"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s ÑохранÑет резервную копию БД в текÑтовом файле или другом виде.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Общие параметры:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=ИМЯ Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла или каталога\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p формат выводимых данных\n"
+" (пользовательÑкий | каталог | tar |\n"
+" текÑтовый (по умолчанию))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО раÑпараллелить копирование на указанное "
+"чиÑло\n"
+" заданий\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose режим подробных Ñообщений\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+# well-spelled: ИÐФО
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=МЕТОД[:ДОП_ИÐФО]\n"
+" выполнÑÑ‚ÑŒ Ñжатие как указано\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid ""
+" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr ""
+" --lock-wait-timeout=ТÐЙМ-ÐУТ прервать операцию при тайм-ауте блокировки "
+"таблицы\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid ""
+" --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" --no-sync не ждать надёжного ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ на "
+"диÑке\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Параметры, управлÑющие выводом:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only выгрузить только данные, без Ñхемы\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects выгрузить большие объекты\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr ""
+" --blobs (уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð° --large-objects)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects иÑключить из выгрузки большие объекты\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid ""
+" --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr ""
+" --no-blobs (уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð° --no-large-objects)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid ""
+" -c, --clean clean (drop) database objects before "
+"recreating\n"
+msgstr ""
+" -c, --clean очиÑтить (удалить) объекты БД при "
+"воÑÑтановлении\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid ""
+" -C, --create include commands to create database in dump\n"
+msgstr ""
+" -C, --create добавить в копию команды ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ "
+"данных\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr ""
+" -e, --extension=ШÐБЛОРвыгрузить только указанное раÑширение(Ñ)\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=КОДИРОВКРвыгружать данные в заданной кодировке\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=ШÐБЛОРвыгрузить только указанную Ñхему(Ñ‹)\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=ШÐБЛОРÐЕ выгружать указанную Ñхему(Ñ‹)\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner не воÑÑтанавливать владение объектами\n"
+" при иÑпользовании текÑтового формата\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only выгрузить только Ñхему, без данных\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use in plain-text "
+"format\n"
+msgstr ""
+" -S, --superuser=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, который будет задейÑтвован\n"
+" при воÑÑтановлении из текÑтового формата\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=ШÐБЛОРвыгрузить только указанную таблицу(Ñ‹)\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=ШÐБЛОРÐЕ выгружать указанную таблицу(Ñ‹)\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges не выгружать права (назначение/отзыв)\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade только Ð´Ð»Ñ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð‘Ð”\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid ""
+" --column-inserts dump data as INSERT commands with column "
+"names\n"
+msgstr ""
+" --column-inserts выгружать данные в виде INSERT Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ "
+"Ñтолбцов\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid ""
+" --disable-dollar-quoting disable dollar quoting, use SQL standard "
+"quoting\n"
+msgstr ""
+" --disable-dollar-quoting отключить ÑпецÑтроки Ñ $, выводить Ñтроки\n"
+" по Ñтандарту SQL\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid ""
+" --disable-triggers disable triggers during data-only restore\n"
+msgstr ""
+" --disable-triggers отключить триггеры при воÑÑтановлении\n"
+" только данных, без Ñхемы\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user "
+"has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security включить защиту на уровне Ñтрок (выгружать "
+"только\n"
+" те данные, которые доÑтупны пользователю)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), "
+"including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=ШÐБЛОÐ\n"
+" ÐЕ выгружать указанную таблицу(Ñ‹), а также\n"
+" её Ñекции и дочерние таблицы\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid ""
+" --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr ""
+" --exclude-table-data=ШÐБЛОРÐЕ выгружать данные указанной таблицы "
+"(таблиц)\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=ШÐБЛОÐ\n"
+" ÐЕ выгружать данные указанной таблицы "
+"(таблиц),\n"
+" а также её Ñекций и дочерних таблиц\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid ""
+" --extra-float-digits=NUM override default setting for "
+"extra_float_digits\n"
+msgstr ""
+" --extra-float-digits=ЧИСЛО переопределить значение extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr ""
+" --if-exists применÑÑ‚ÑŒ IF EXISTS при удалении объектов\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=ШÐБЛОÐ\n"
+" включать в копию данные Ñторонних таблиц Ñ\n"
+" Ñерверов Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, подпадающими под ШÐБЛОÐ\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid ""
+" --inserts dump data as INSERT commands, rather than "
+"COPY\n"
+msgstr ""
+" --inserts выгрузить данные в виде команд INSERT, не "
+"COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr ""
+" --load-via-partition-root загружать Ñекции через главную таблицу\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments не выгружать комментарии\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications не выгружать публикации\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr ""
+" --no-security-labels не выгружать Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ðº безопаÑноÑти\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions не выгружать подпиÑки\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method не выгружать табличные методы доÑтупа\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr ""
+" --no-tablespaces не выгружать Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… "
+"проÑтранÑтв\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression не выгружать методы ÑÐ¶Ð°Ñ‚Ð¸Ñ TOAST\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr ""
+" --no-unlogged-table-data не выгружать данные нежурналируемых таблиц\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid ""
+" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT "
+"commands\n"
+msgstr ""
+" --on-conflict-do-nothing добавлÑÑ‚ÑŒ ON CONFLICT DO NOTHING в команды "
+"INSERT\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid ""
+" --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr ""
+" --quote-all-identifiers заключать в кавычки вÑе идентификаторы,\n"
+" а не только ключевые Ñлова\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid ""
+" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr ""
+" --rows-per-insert=ЧИСЛО чиÑло Ñтрок в одном INSERT; подразумевает --"
+"inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid ""
+" --section=SECTION dump named section (pre-data, data, or post-"
+"data)\n"
+msgstr ""
+" --section=РÐЗДЕЛ выгрузить заданный раздел\n"
+" (pre-data, data или post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid ""
+" --serializable-deferrable wait until the dump can run without "
+"anomalies\n"
+msgstr ""
+" --serializable-deferrable дождатьÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных без "
+"аномалий\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr ""
+" --snapshot=СÐИМОК иÑпользовать при выгрузке заданный Ñнимок\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns "
+"to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names требовать, чтобы при указании шаблона "
+"включениÑ\n"
+" таблицы и/или Ñхемы ему ÑоответÑтвовал "
+"минимум\n"
+" один объект\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=ШÐБЛОРвыгрузить только указанную таблицу(Ñ‹), а "
+"также\n"
+" её Ñекции и дочерние таблицы\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands "
+"instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" уÑтанавливать владельца, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹\n"
+" SET SESSION AUTHORIZATION вмеÑто ALTER OWNER\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключениÑ:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=ПОРТ номер порта Ñервера БД\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð°Ð· данных\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password запрашивать пароль вÑегда (обычно не требуетÑÑ)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед выгрузкой\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"ЕÑли Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных не указано, иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ "
+"PGDATABASE.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚ÑÐºÐ°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\""
+
+#: pg_dump.c:1303
+#, c-format
+msgid ""
+"parallel dumps from standby servers are not supported by this server version"
+msgstr ""
+"выгрузка дампа в параллельном режиме Ñ Ð²ÐµÐ´Ð¾Ð¼Ñ‹Ñ… Ñерверов не поддерживаетÑÑ "
+"данной верÑией Ñервера"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "указан неверный формат вывода: \"%s\""
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "Ñхемы, ÑоответÑтвующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "раÑширениÑ, ÑоответÑтвующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "Ñторонние Ñерверы, ÑоответÑтвующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неверное Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ (Ñлишком много компонентов): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "таблицы, ÑоответÑтвующие шаблону \"%s\", не найдены"
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "В данный момент вы не подключены к базе данных."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ÑÑылки между базами не реализованы: %s"
+
+#: pg_dump.c:2099
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "выгрузка Ñодержимого таблицы \"%s.%s\""
+
+#: pg_dump.c:2205
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Ошибка выгрузки таблицы \"%s\": Ñбой в PQgetCopyData()."
+
+#: pg_dump.c:2206 pg_dump.c:2216
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Сообщение об ошибке Ñ Ñервера: %s"
+
+# skip-rule: language-mix
+#: pg_dump.c:2207 pg_dump.c:2217
+#, c-format
+msgid "Command was: %s"
+msgstr "ВыполнÑлаÑÑŒ команда: %s"
+
+#: pg_dump.c:2215
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Ошибка выгрузки таблицы \"%s\": Ñбой в PQgetResult()."
+
+#: pg_dump.c:2297
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "из таблицы \"%s\" получено неверное количеÑтво полей"
+
+#: pg_dump.c:2995
+#, c-format
+msgid "saving database definition"
+msgstr "Ñохранение Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных"
+
+#: pg_dump.c:3100
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нераÑпознанный провайдер локали: %s"
+
+#: pg_dump.c:3451
+#, c-format
+msgid "saving encoding = %s"
+msgstr "Ñохранение кодировки (%s)"
+
+#: pg_dump.c:3476
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "Ñохранение standard_conforming_strings (%s)"
+
+#: pg_dump.c:3515
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "не удалоÑÑŒ разобрать результат current_schemas()"
+
+#: pg_dump.c:3534
+#, c-format
+msgid "saving search_path = %s"
+msgstr "Ñохранение search_path = %s"
+
+#: pg_dump.c:3571
+#, c-format
+msgid "reading large objects"
+msgstr "чтение больших объектов"
+
+#: pg_dump.c:3709
+#, c-format
+msgid "saving large objects"
+msgstr "Ñохранение больших объектов"
+
+#: pg_dump.c:3750
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ объекта %u: %s"
+
+#: pg_dump.c:3856
+#, c-format
+msgid "reading row-level security policies"
+msgstr "чтение политик защиты на уровне Ñтрок"
+
+#: pg_dump.c:3997
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "нераÑпознанный тип команды в политике: %c"
+
+#: pg_dump.c:4447 pg_dump.c:4791 pg_dump.c:12022 pg_dump.c:17932
+#: pg_dump.c:17934 pg_dump.c:18555
+#, c-format
+msgid "could not parse %s array"
+msgstr "не удалоÑÑŒ разобрать маÑÑив %s"
+
+#: pg_dump.c:4636
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr ""
+"подпиÑки не выгружены, так как текущий пользователь не Ñуперпользователь"
+
+#: pg_dump.c:5183
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "не удалоÑÑŒ найти родительÑкое раÑширение Ð´Ð»Ñ %s %s"
+
+#: pg_dump.c:5328
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "Ñхема Ñ OID %u не ÑущеÑтвует"
+
+#: pg_dump.c:6810 pg_dump.c:17196
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of sequence with OID %u not "
+"found"
+msgstr ""
+"нарушение целоÑтноÑти: по OID %u не удалоÑÑŒ найти родительÑкую таблицу "
+"поÑледовательноÑти Ñ OID %u"
+
+#: pg_dump.c:6953
+#, c-format
+msgid ""
+"failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr ""
+"нарушение целоÑтноÑти: таблица Ñ OID %u, фигурирующим в "
+"pg_partitioned_table, не найдена"
+
+#: pg_dump.c:7184 pg_dump.c:7455 pg_dump.c:7926 pg_dump.c:8590 pg_dump.c:8709
+#: pg_dump.c:8857
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "нераÑпознанный OID таблицы %u"
+
+#: pg_dump.c:7188
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "неожиданно получены данные индекÑа Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\""
+
+#: pg_dump.c:7687
+#, c-format
+msgid ""
+"failed sanity check, parent table with OID %u of pg_rewrite entry with OID "
+"%u not found"
+msgstr ""
+"нарушение целоÑтноÑти: по OID %u не удалоÑÑŒ найти родительÑкую таблицу Ð´Ð»Ñ "
+"запиÑи pg_rewrite Ñ OID %u"
+
+#: pg_dump.c:7978
+#, c-format
+msgid ""
+"query produced null referenced table name for foreign key trigger \"%s\" on "
+"table \"%s\" (OID of table: %u)"
+msgstr ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð´Ð°Ð» NULL вмеÑто имени целевой таблицы Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° внешнего ключа "
+"\"%s\" в таблице \"%s\" (OID целевой таблицы: %u)"
+
+#: pg_dump.c:8594
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "неожиданно получены данные Ñтолбцов Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\""
+
+#: pg_dump.c:8623
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтолбцов в таблице \"%s\""
+
+#: pg_dump.c:8671
+#, c-format
+msgid "finding table default expressions"
+msgstr "поиÑк выражений по умолчанию Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†"
+
+#: pg_dump.c:8713
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "неверное значение adnum (%d) в таблице \"%s\""
+
+#: pg_dump.c:8807
+#, c-format
+msgid "finding table check constraints"
+msgstr "поиÑк ограничений-проверок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†"
+
+#: pg_dump.c:8861
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] ""
+"ожидалоÑÑŒ %d ограничение-проверка Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\", но найдено: %d"
+msgstr[1] ""
+"ожидалоÑÑŒ %d ограничениÑ-проверки Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\", но найдено: %d"
+msgstr[2] ""
+"ожидалоÑÑŒ %d ограничений-проверок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\", но найдено: %d"
+
+#: pg_dump.c:8865
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Возможно, повреждены ÑиÑтемные каталоги."
+
+#: pg_dump.c:9555
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "роль Ñ OID %u не ÑущеÑтвует"
+
+#: pg_dump.c:9667 pg_dump.c:9696
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в pg_init_privs: %u %u %d"
+
+#: pg_dump.c:10517
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "у типа данных \"%s\" по-видимому неправильный тип типа"
+
+# TO REVEIW
+#: pg_dump.c:12091
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "недопуÑтимое значение provolatile Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"%s\""
+
+# TO REVEIW
+#: pg_dump.c:12141 pg_dump.c:14023
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "недопуÑтимое значение proparallel Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"%s\""
+
+#: pg_dump.c:12271 pg_dump.c:12377 pg_dump.c:12384
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "не удалоÑÑŒ найти определение функции Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ñ OID %u"
+
+#: pg_dump.c:12310
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod"
+
+#: pg_dump.c:12313
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "неприемлемое значение в поле pg_cast.castmethod"
+
+#: pg_dump.c:12403
+#, c-format
+msgid ""
+"bogus transform definition, at least one of trffromsql and trftosql should "
+"be nonzero"
+msgstr ""
+"неприемлемое определение Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ (trffromsql или trftosql должно быть "
+"ненулевым)"
+
+#: pg_dump.c:12420
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "неприемлемое значение в поле pg_transform.trffromsql"
+
+#: pg_dump.c:12441
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "неприемлемое значение в поле pg_transform.trftosql"
+
+#: pg_dump.c:12586
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "поÑтфикÑные операторы больше не поддерживаютÑÑ (оператор \"%s\")"
+
+#: pg_dump.c:12756
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "оператор Ñ OID %s не найден"
+
+#: pg_dump.c:12824
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "неверный тип \"%c\" метода доÑтупа \"%s\""
+
+#: pg_dump.c:13493 pg_dump.c:13552
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "нераÑпознанный провайдер правил Ñортировки: %s"
+
+#: pg_dump.c:13502 pg_dump.c:13511 pg_dump.c:13521 pg_dump.c:13536
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "неверное правило Ñортировки \"%s\""
+
+#: pg_dump.c:13942
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "нераÑпознанное значение aggfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° \"%s\""
+
+#: pg_dump.c:13998
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "нераÑпознанное значение aggmfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° \"%s\""
+
+#: pg_dump.c:14715
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "нераÑпознанный тип объекта в определении прав по умолчанию: %d"
+
+#: pg_dump.c:14731
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "не удалоÑÑŒ разобрать ÑпиÑок прав по умолчанию (%s)"
+
+#: pg_dump.c:14813
+#, c-format
+msgid ""
+"could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr ""
+"не удалоÑÑŒ разобрать изначальный ÑпиÑок ACL (%s) или ACL по умолчанию (%s) "
+"Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° \"%s\" (%s)"
+
+#: pg_dump.c:14838
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr ""
+"не удалоÑÑŒ разобрать ÑпиÑок ACL (%s) или ACL по умолчанию (%s) Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° "
+"\"%s\" (%s)"
+
+#: pg_dump.c:15379
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" не возвратил данные"
+
+#: pg_dump.c:15382
+#, c-format
+msgid ""
+"query to obtain definition of view \"%s\" returned more than one definition"
+msgstr ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" возвратил неÑколько "
+"определений"
+
+#: pg_dump.c:15389
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "определение предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" пуÑтое (длина равна нулю)"
+
+#: pg_dump.c:15473
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "ÑвойÑтво WITH OIDS больше не поддерживаетÑÑ (таблица \"%s\")"
+
+#: pg_dump.c:16397
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "неверный номер Ñтолбца %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\""
+
+#: pg_dump.c:16475
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "не удалоÑÑŒ разобрать Ñтолбцы ÑтатиÑтики в индекÑе"
+
+#: pg_dump.c:16477
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "не удалоÑÑŒ разобрать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑтатиÑтики в индекÑе"
+
+#: pg_dump.c:16479
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr ""
+"Ñтолбцы, задающие ÑтатиÑтику индекÑа, не ÑоответÑтвуют значениÑм по "
+"количеÑтву"
+
+#: pg_dump.c:16695
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "отÑутÑтвует Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ \"%s\""
+
+#: pg_dump.c:16930
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "нераÑпознанный тип ограничениÑ: %c"
+
+#: pg_dump.c:17031 pg_dump.c:17260
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural ""
+"query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение данных поÑледовательноÑти \"%s\" вернул %d Ñтроку "
+"(ожидалаÑÑŒ 1)"
+msgstr[1] ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение данных поÑледовательноÑти \"%s\" вернул %d Ñтроки "
+"(ожидалаÑÑŒ 1)"
+msgstr[2] ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение данных поÑледовательноÑти \"%s\" вернул %d Ñтрок "
+"(ожидалаÑÑŒ 1)"
+
+#: pg_dump.c:17063
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "нераÑпознанный тип поÑледовательноÑти: %s"
+
+#: pg_dump.c:17352
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "неожиданное значение tgtype: %d"
+
+#: pg_dump.c:17424
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока аргументов (%s) Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° \"%s\" таблицы \"%s\""
+
+#: pg_dump.c:17693
+#, c-format
+msgid ""
+"query to get rule \"%s\" for table \"%s\" failed: wrong number of rows "
+"returned"
+msgstr ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение правила \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" возвратил неверное "
+"чиÑло Ñтрок"
+
+#: pg_dump.c:17846
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "не удалоÑÑŒ найти упомÑнутое раÑширение %u"
+
+#: pg_dump.c:17936
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "конфигурации раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ ÑоответÑтвуют уÑловиÑм по количеÑтву"
+
+#: pg_dump.c:18068
+#, c-format
+msgid "reading dependency data"
+msgstr "чтение информации о завиÑимоÑÑ‚ÑÑ…"
+
+#: pg_dump.c:18154
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "нет подчинённого объекта %u %u"
+
+#: pg_dump.c:18165
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "нет вышеÑтоÑщего объекта %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "неверный dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑ‚ÑŒ %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "не удалоÑÑŒ определить цикл завиÑимоÑтей"
+
+#: pg_dump_sort.c:1276
+#, 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] "в Ñледующей таблице зациклены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ключей:"
+msgstr[1] "в Ñледующих таблицах зациклены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ключей:"
+msgstr[2] "в Ñледующих таблицах зациклены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ключей:"
+
+#: pg_dump_sort.c:1281
+#, 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:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "не удалоÑÑŒ разрешить цикл завиÑимоÑтей Ð´Ð»Ñ Ñледующих объектов:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\""
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ "
+"верÑии %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid ""
+"option --exclude-database cannot be used together with -g/--globals-only, -"
+"r/--roles-only, or -t/--tablespaces-only"
+msgstr ""
+"параметр --exclude-database неÑовмеÑтим Ñ -g/--globals-only, -r/--roles-only "
+"и -t/--tablespaces-only"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "параметры -g/--globals-only и -r/--roles-only иÑключают друг друга"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid ""
+"options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr ""
+"параметры -g/--globals-only и -t/--tablespaces-only иÑключают друг друга"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid ""
+"options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "параметры -r/--roles-only и -t/--tablespaces-only иÑключают друг друга"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе данных: \"%s\""
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"не удалоÑÑŒ подключитьÑÑ Ðº базе данных \"postgres\" или \"template1\"\n"
+"Укажите другую базу данных."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s ÑкÑпортирует вÑÑ‘ Ñодержимое клаÑтера баз данных PostgreSQL в SQL-Ñкрипт.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ПÐРÐМЕТР]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=ИМЯ_ФÐÐ™Ð›Ð Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid ""
+" -c, --clean clean (drop) databases before recreating\n"
+msgstr ""
+" -c, --clean очиÑтить (удалить) базы данных перед\n"
+" воÑÑтановлением\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr ""
+" -g, --globals-only выгрузить только глобальные объекты, без баз\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner не воÑÑтанавливать владение объектами\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid ""
+" -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr ""
+" -r, --roles-only выгрузить только роли, без баз данных\n"
+" и табличных проÑтранÑтв\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr ""
+" -S, --superuser=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid ""
+" -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr ""
+" -t, --tablespaces-only выгружать только табличные проÑтранÑтва,\n"
+" без баз данных и ролей\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid ""
+" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr ""
+" --exclude-database=ШÐБЛОРиÑключить базы Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, подпадающими под "
+"шаблон\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords не выгружать пароли ролей\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=СТРОКРподключитьÑÑ Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñтрокой подключениÑ\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=ИМЯ_БД выбор другой базы данных по умолчанию\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the "
+"standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"ЕÑли не указан параметр -f/--file, SQL-Ñкрипт запиÑываетÑÑ Ð² Ñтандартный "
+"вывод.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸, начинающееÑÑ Ñ \"pg_\", пропущено (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "не удалоÑÑŒ найти подходÑщий порÑдок выгрузки Ð´Ð»Ñ Ñ‡Ð»ÐµÐ½Ð¾Ð² роли \"%s\""
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "не удалоÑÑŒ разобрать ÑпиÑок ACL (%s) Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\""
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr ""
+"не удалоÑÑŒ разобрать ÑпиÑок ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупом (%s) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð». проÑтранÑтва "
+"\"%s\""
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "база данных \"%s\" иÑключаетÑÑ"
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "выгрузка базы данных \"%s\""
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "ошибка при обработке базы \"%s\", pg_dump завершаетÑÑ"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "не удалоÑÑŒ повторно открыть выходной файл \"%s\": %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "выполнÑетÑÑ \"%s\""
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "не удалоÑÑŒ узнать верÑию Ñервера"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "не удалоÑÑŒ разобрать Ñтроку верÑии Ñервера \"%s\""
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "выполнÑетÑÑ %s"
+
+# TO REVEIW
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "необходимо указать -d/--dbname или -f/--file"
+
+# TO REVEIW
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "параметры -d/--dbname и -f/--file иÑключают друг друга"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "параметры -C/--create и -1/--single-transaction иÑключают друг друга"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "параметр --single-transaction допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ð¾Ð´Ð½Ð¸Ð¼ заданием"
+
+#: pg_restore.c:380
+#, c-format
+msgid ""
+"unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "нераÑпознанный формат архива \"%s\"; укажите \"c\", \"d\" или \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "при воÑÑтановлении проигнорировано ошибок: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s воÑÑтанавливает базу данных PostgreSQL из архива, Ñозданного командой "
+"pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ФÐЙЛ]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=БД подключитьÑÑ Ðº указанной базе данных\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr ""
+" -f, --file=ИМЯ_ФÐÐ™Ð›Ð Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла (или - Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° в stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr ""
+" -F, --format=c|d|t формат файла (должен определÑÑ‚ÑŒÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list вывеÑти краткое оглавление архива\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose выводить подробные ÑообщениÑ\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Параметры, управлÑющие воÑÑтановлением:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only воÑÑтановить только данные, без Ñхемы\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create Ñоздать целевую базу данных\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr ""
+" -e, --exit-on-error выйти при ошибке (по умолчанию - продолжать)\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=ИМЯ воÑÑтановить указанный индекÑ\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО раÑпараллелить воÑÑтановление на указанное "
+"чиÑло заданий\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=ИМЯ_ФÐЙЛРиÑпользовать оглавление из Ñтого файла длÑ\n"
+" чтениÑ/упорÑÐ´Ð¾Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr ""
+" -n, --schema=ИМЯ воÑÑтановить объекты только в Ñтой Ñхеме\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr ""
+" -N, --exclude-schema=ИМЯ не воÑÑтанавливать объекты в Ñтой Ñхеме\n"
+
+# skip-rule: no-space-before-parentheses
+# well-spelled: арг
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=ИМЯ(арг-Ñ‚Ñ‹) воÑÑтановить заданную функцию\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only воÑÑтановить только Ñхему, без данных\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid ""
+" -S, --superuser=NAME superuser user name to use for disabling "
+"triggers\n"
+msgstr ""
+" -S, --superuser=ИМЯ Ð¸Ð¼Ñ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ "
+"триггеров\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid ""
+" -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr ""
+" -t, --table=ИМЯ воÑÑтановить заданное отношение (таблицу, "
+"предÑтавление и Ñ‚. п.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=ИМЯ воÑÑтановить заданный триггер\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid ""
+" -x, --no-privileges skip restoration of access privileges (grant/"
+"revoke)\n"
+msgstr ""
+" -x, --no-privileges не воÑÑтанавливать права доÑтупа\n"
+" (назначение/отзыв)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr ""
+" -1, --single-transaction выполнить воÑÑтановление в одной транзакции\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security включить защиту на уровне Ñтрок\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments не воÑÑтанавливать комментарии\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not "
+"be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables не воÑÑтанавливать данные таблиц, которые\n"
+" не удалоÑÑŒ Ñоздать\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications не воÑÑтанавливать публикации\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels не воÑÑтанавливать метки безопаÑноÑти\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions не воÑÑтанавливать подпиÑки\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr ""
+" --no-table-access-method не воÑÑтанавливать табличные методы доÑтупа\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr ""
+" --no-tablespaces не воÑÑтанавливать Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð». "
+"проÑтранÑтв\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid ""
+" --section=SECTION restore named section (pre-data, data, or "
+"post-data)\n"
+msgstr ""
+" --section=РÐЗДЕЛ воÑÑтановить заданный раздел\n"
+" (pre-data, data или post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед воÑÑтановлением\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and "
+"specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Параметры -I, -n, -N, -P, -t, -T и --section можно комбинировать и "
+"указывать\n"
+"неÑколько раз Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° неÑкольких объектов.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"ЕÑли Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла не указано, иÑпользуетÑÑ Ñтандартное уÑтройÑтво "
+"ввода.\n"
+"\n"
+
+#, c-format
+#~ msgid "unrecognized collation provider '%c'"
+#~ msgstr "нераÑпознанный провайдер правил Ñортировки '%c'"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#, c-format
+#~ msgid "not built with zlib support"
+#~ msgstr "программа Ñобрана без поддержки zlib"
+
+#, c-format
+#~ msgid "could not close blob data file: %m"
+#~ msgstr "не удалоÑÑŒ закрыть файл данных BLOB: %m"
+
+#, c-format
+#~ msgid "could not close blobs TOC file: %m"
+#~ msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ BLOB: %m"
+
+#, c-format
+#~ msgid ""
+#~ "requested compression not available in this installation -- archive will "
+#~ "be uncompressed"
+#~ msgstr ""
+#~ "уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ не поддерживает Ñжатие -- архив не будет "
+#~ "ÑжиматьÑÑ"
+
+#, c-format
+#~ msgid ""
+#~ " -Z, --compress=0-9 compression level for compressed formats\n"
+#~ msgstr " -Z, --compress=0-9 уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ архивации\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "could not open temporary file"
+#~ msgstr "не удалоÑÑŒ открыть временный файл"
+
+#~ msgid "could not close tar member: %m"
+#~ msgstr "не удалоÑÑŒ закрыть компонент tar-архива: %m"
+
+#~ msgid "compression level must be in range 0..9"
+#~ msgstr "уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть в диапазоне 0..9"
+
+#~ msgid "extra_float_digits must be in range -15..3"
+#~ msgstr "значение extra_float_digits должно быть в диапазоне -15..3"
+
+#~ msgid "invalid number of parallel jobs"
+#~ msgstr "неверное чиÑло параллельных заданий"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported by this server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Ð’ Ñтой верÑии Ñервера Ñинхронизированные Ñнимки не поддерживаютÑÑ.\n"
+#~ "ЕÑли они вам не нужны, укажите при запуÑке ключ\n"
+#~ "--no-synchronized-snapshots."
+
+#~ msgid ""
+#~ " --no-synchronized-snapshots do not use synchronized snapshots in "
+#~ "parallel jobs\n"
+#~ msgstr ""
+#~ " --no-synchronized-snapshots не иÑпользовать Ñинхронизированные Ñнимки\n"
+#~ " в параллельных заданиÑÑ…\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots on standby servers are not supported by this "
+#~ "server version.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots."
+#~ msgstr ""
+#~ "Ð’ Ñтой верÑии Ñервера Ñинхронизированные Ñнимки на ведомых Ñерверах не "
+#~ "поддерживаютÑÑ.\n"
+#~ "ЕÑли они вам не нужны, укажите при запуÑке ключ\n"
+#~ "--no-synchronized-snapshots."
+
+#~ msgid "The command was: %s"
+#~ msgstr "ВыполнÑлаÑÑŒ команда: %s"
+
+#~ msgid "owner of publication \"%s\" appears to be invalid"
+#~ msgstr "у публикации \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of subscription \"%s\" appears to be invalid"
+#~ msgstr "у подпиÑки \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "could not parse subpublications array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив subpublications"
+
+# TO REVIEW
+#~ msgid "owner of schema \"%s\" appears to be invalid"
+#~ msgstr "у Ñхемы \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of data type \"%s\" appears to be invalid"
+#~ msgstr "у типа данных \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of operator \"%s\" appears to be invalid"
+#~ msgstr "у оператора \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of operator class \"%s\" appears to be invalid"
+#~ msgstr "у клаÑÑа операторов \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of operator family \"%s\" appears to be invalid"
+#~ msgstr "у ÑемейÑтва операторов \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of aggregate function \"%s\" appears to be invalid"
+#~ msgstr "у агрегатной функции \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of function \"%s\" appears to be invalid"
+#~ msgstr "у функции \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "owner of table \"%s\" appears to be invalid"
+#~ msgstr "у таблицы \"%s\" по-видимому неправильный владелец"
+
+#~ msgid "reading indexes for table \"%s.%s\""
+#~ msgstr "чтение индекÑов таблицы \"%s.%s\""
+
+#~ msgid "reading foreign key constraints for table \"%s.%s\""
+#~ msgstr "чтение ограничений внешних ключей таблицы \"%s.%s\""
+
+#~ msgid "reading triggers for table \"%s.%s\""
+#~ msgstr "чтение триггеров таблицы \"%s.%s\""
+
+#~ msgid "finding the columns and types of table \"%s.%s\""
+#~ msgstr "поиÑк Ñтолбцов и типов таблицы \"%s.%s\""
+
+#~ msgid "bogus value in proargmodes array"
+#~ msgstr "неприемлемое значение в маÑÑиве proargmodes"
+
+#~ msgid "could not parse proallargtypes array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив proallargtypes"
+
+#~ msgid "could not parse proargmodes array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив proargmodes"
+
+#~ msgid "could not parse proargnames array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив proargnames"
+
+#~ msgid "could not parse proconfig array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив proconfig"
+
+#~ msgid "could not parse extension configuration array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив конфигураций раÑширениÑ"
+
+#~ msgid "could not parse extension condition array"
+#~ msgstr "не удалоÑÑŒ разобрать маÑÑив уÑловий раÑширениÑ"
+
+#~ msgid "maximum number of parallel jobs is %d"
+#~ msgstr "макÑимальное чиÑло параллельных заданий равно %d"
+
+#~ msgid "reading row security enabled for table \"%s.%s\""
+#~ msgstr "чтение информации о защите Ñтрок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s.%s\""
+
+#~ msgid "reading policies for table \"%s.%s\""
+#~ msgstr "чтение политик таблицы \"%s.%s\""
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "ошибка pclose: %m"
+
+#~ msgid "WSAStartup failed: %d"
+#~ msgstr "ошибка WSAStartup: %d"
+
+#~ msgid "could not write to large object (result: %lu, expected: %lu)"
+#~ msgstr "не удалоÑÑŒ запиÑать большой объект (результат: %lu, ожидалоÑÑŒ: %lu)"
+
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе \"%s\": %s"
+
+#~ msgid ""
+#~ "aggregate function %s could not be dumped correctly for this database "
+#~ "version; ignored"
+#~ msgstr ""
+#~ "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s не может быть правильно выгружена Ð´Ð»Ñ Ñтой верÑии "
+#~ "базы данных; Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°"
+
+#~ msgid "could not connect to database \"%s\": %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе \"%s\": %s"
+
+#~ msgid "connecting to database \"%s\" as user \"%s\""
+#~ msgstr "подключение к базе \"%s\" Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\""
+
+#~ msgid "could not reconnect to database"
+#~ msgstr "не удалоÑÑŒ переподключитьÑÑ Ðº базе"
+
+#~ msgid "connection needs password"
+#~ msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼ пароль"
+
+#~ msgid ""
+#~ "could not find block ID %d in archive -- possibly due to out-of-order "
+#~ "restore request, which cannot be handled due to lack of data offsets in "
+#~ "archive"
+#~ msgstr ""
+#~ "не удалоÑÑŒ найти в архиве блок Ñ ID %d -- возможно, по причине не "
+#~ "поÑледовательного запроÑа воÑÑтановлениÑ, который Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ из-за "
+#~ "отÑутÑÑ‚Ð²Ð¸Ñ Ñмещений данных в архиве"
+
+#~ msgid "ftell mismatch with expected position -- ftell used"
+#~ msgstr "Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ ftell не ÑоответÑтвует ожидаемой -- иÑпользуетÑÑ ftell"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()"
+#~ msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° -- в tarReadRaw() не указан ни th, ни fh"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %s"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "parallel archiver"
+#~ msgstr "параллельный архиватор"
+
+#~ msgid "archiver"
+#~ msgstr "архиватор"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "Параметры -C и -1 неÑовмеÑтимы\n"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "попытка выÑÑнить формат архива\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "выделение Ñтруктуры AH Ð´Ð»Ñ %s, формат %d\n"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "прочитана запиÑÑŒ Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %d (ID %d): %s %s\n"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "не удалоÑÑŒ уÑтановить параметр default_with_oids: %s"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "вход в restore_toc_entries_prefork\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "вход в restore_toc_entries_parallel\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "вход в restore_toc_entries_postfork\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "Ñлемент не готов\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "переключение завиÑимоÑти %d -> %d на %d\n"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "уменьшение завиÑимоÑтей Ð´Ð»Ñ %d\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "внешний архиватор"
+
+#~ msgid "archiver (db)"
+#~ msgstr "архиватор (БД)"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "ошибка Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных\n"
+
+#~ msgid "directory archiver"
+#~ msgstr "каталоговый архиватор"
+
+#~ msgid "tar archiver"
+#~ msgstr "архиватор tar"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "переход от позиции %s к Ñледующему компоненту в позиции %s\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² файле %s\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "пропуÑкаетÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚ tar %s\n"
+
+# skip-rule: capital-letter-first
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "ЗапиÑÑŒ Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %s в %s (длина: %s, контр. Ñумма: %d)\n"
+
+#~ msgid ""
+#~ "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr ""
+#~ "параметры --inserts/--column-inserts и -o/--oids иÑключают друг друга\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(Ð’ INSERT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑ‚ÑŒ OID.)\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids выгружать данные Ñ OID\n"
+
+#~ msgid "sorter"
+#~ msgstr "sorter"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: параметр --if-exists требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ -c/--clean\n"
+
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: не удалоÑÑŒ открыть выходной файл \"%s\": %s\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚ÑÐºÐ°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"\n"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: выполнÑетÑÑ %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: ошибка при выполнении запроÑа: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: запроÑ: %s\n"
+
+#~ msgid ""
+#~ "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr ""
+#~ "%s: параметры -s/--schema-only и -a/--data-only иÑключают друг друга\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: параметры -c/--clean and -a/--data-only иÑключают друг друга\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: неверное чиÑло параллельных заданий\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr ""
+#~ "%s: не удалоÑÑŒ разобрать ÑпиÑок ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупом (%s) Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных "
+#~ "\"%s\"\n"
+
+#~ msgid "reading extended statistics for table \"%s.%s\"\n"
+#~ msgstr "чтение раÑширенной ÑтатиÑтики Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s.%s\"\n"
+
+#~ msgid "setting owner and privileges for %s \"%s.%s\"\n"
+#~ msgstr "уÑтановка владельца и прав: %s \"%s.%s\"\n"
+
+#~ msgid "setting owner and privileges for %s \"%s\"\n"
+#~ msgstr "уÑтановка владельца и прав: %s \"%s\"\n"
+
+#~ msgid ""
+#~ "Synchronized snapshots are not supported on standby servers.\n"
+#~ "Run with --no-synchronized-snapshots instead if you do not need\n"
+#~ "synchronized snapshots.\n"
+#~ msgstr ""
+#~ "Ðа резервных Ñерверах Ñинхронизированные Ñнимки не поддерживаютÑÑ.\n"
+#~ "ЕÑли они вам не нужны, укажите при запуÑке ключ\n"
+#~ "--no-synchronized-snapshots.\n"
+
+#~ msgid "finding partition relationships\n"
+#~ msgstr "обнаружение взаимоÑвÑзей Ñекций\n"
+
+#~ msgid "reading partition key information for interesting tables\n"
+#~ msgstr "чтение информации о ключах Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€ÐµÑующих таблиц\n"
+
+#~ msgid ""
+#~ " --no-subscription-connect dump subscriptions so they don't connect "
+#~ "on restore\n"
+#~ msgstr ""
+#~ " --no-subscription-connect выгружать подпиÑки так, чтобы они не "
+#~ "подключалиÑÑŒ\n"
+#~ " при воÑÑтановлении\n"
+
+#~ msgid ""
+#~ "%s: options --no-role-passwords and --binary-upgrade cannot be used "
+#~ "together\n"
+#~ msgstr ""
+#~ "%s: параметры --no-role-passwords и --binary-upgrade иÑключают друг "
+#~ "друга\n"
+
+#~ msgid "error processing a parallel work item\n"
+#~ msgstr "ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñти параллельной работы\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "не удалоÑÑŒ найти Ñлот законченного рабочего объекта\n"
+
+#~ msgid "error during backup\n"
+#~ msgstr "ошибка в процеÑÑе резервного копированиÑ\n"
+
+#~ msgid ""
+#~ "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr ""
+#~ "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² выбора Ñхемы нужен Ñервер верÑии 7.3 или "
+#~ "новее\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr ""
+#~ "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение данных поÑледовательноÑти \"%s\" вернул Ð¸Ð¼Ñ \"%s\"\n"
+
+#~ msgid "could not get relation name for OID %u: %s\n"
+#~ msgstr "не удалоÑÑŒ получить Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u: %s\n"
+
+#~ msgid "terminated by user\n"
+#~ msgstr "прервано пользователем\n"
+
+#~ msgid "error in ListenToWorkers(): %s\n"
+#~ msgstr "ошибка в ListenToWorkers(): %s\n"
+
+#~ msgid "worker is terminating\n"
+#~ msgstr "рабочий процеÑÑ Ð¿Ñ€ÐµÑ€Ñ‹Ð²Ð°ÐµÑ‚ÑÑ\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "не удалоÑÑŒ открыть выходной файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи\n"
+
+#~ msgid " -t, --table=NAME restore named table\n"
+#~ msgstr " -t, --table=ИМЯ воÑÑтановить заданную таблицу\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "компонент архива Ñлишком велик Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° tar\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "не удалоÑÑŒ вывеÑти данную в пользовательÑкую процедуру\n"
+
+#~ msgid "unexpected end of file\n"
+#~ msgstr "неожиданный конец файла\n"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "не удалоÑÑŒ запиÑать байт: %s\n"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "не удалоÑÑŒ запиÑать байт\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "не удалоÑÑŒ запиÑать нулевой блок в конец tar-архива\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "не удалоÑÑŒ запиÑать выравнивание Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° tar\n"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "Ñ€ÐµÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² файле отличаетÑÑ Ð¾Ñ‚ предÑказанной (%s и %s)\n"
+
+#~ msgid "could not determine seek position in file: %s\n"
+#~ msgstr "не удалоÑÑŒ определить позицию в файле: %s\n"
+
+#~ msgid "Error processing a parallel work item.\n"
+#~ msgstr "Ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñти параллельной работы.\n"
+
+#~ msgid "pgpipe could not getsockname: %ui"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ pgpipe не Ñмогла получить Ð¸Ð¼Ñ Ñокета: %ui"
+
+#~ msgid "pgpipe could not create socket 2: %ui"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ pgpipe не Ñмогла Ñоздать Ñокет 2: %ui"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "крах рабочего процеÑÑа: ÑоÑтоÑние %d\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "неожиданный выход из parallel_restore\n"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "не удалоÑÑŒ разобрать Ñтроку верÑии \"%s\"\n"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: не удалоÑÑŒ разобрать Ñтроку верÑии \"%s\"\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "Параметры -C и -c неÑовмеÑтимы\n"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr ""
+#~ "неверный оператор COPY -- Ñлово \"copy\" не найдено в Ñтроке \"%s\"\n"
+
+#~ msgid ""
+#~ "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" "
+#~ "starting at position %lu\n"
+#~ msgstr ""
+#~ "неверный оператор COPY -- указание \"from stdin\" не найдено в Ñтроке "
+#~ "\"%s\", Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %lu\n"
+
+#~ msgid "cannot create directory %s, it exists already\n"
+#~ msgstr "Ñоздать каталог %s не удалоÑÑŒ, он уже ÑущеÑтвует\n"
+
+#~ msgid "cannot create directory %s, a file with this name exists already\n"
+#~ msgstr "Ñоздать каталог %s не удалоÑÑŒ, так как еÑÑ‚ÑŒ файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем\n"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "воÑÑтановление большого объекта Ñ OID %u\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help показать Ñту Ñправку и выйти\n"
+
+#~ msgid ""
+#~ " --version output version information, then exit\n"
+#~ msgstr " --version показать верÑию и выйти\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** аварийное завершение из-за ошибки\n"
+
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\" отÑутÑтвует запиÑÑŒ в pg_database\n"
+
+#~ msgid ""
+#~ "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr ""
+#~ "в pg_database нашлоÑÑŒ неÑколько запиÑей (%d) Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\"\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): не удалоÑÑŒ найти pg_largeobject.relfrozenxid\n"
+
+#~ msgid ""
+#~ "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr ""
+#~ "dumpDatabase(): не удалоÑÑŒ найти pg_largeobject_metadata.relfrozenxid\n"
+
+#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n"
+#~ msgid_plural ""
+#~ "query returned %d foreign server entries for foreign table \"%s\"\n"
+#~ msgstr[0] ""
+#~ "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d запиÑÑŒ о Ñтороннем Ñервере Ð´Ð»Ñ Ñторонней таблицы \"%s\"\n"
+#~ msgstr[1] ""
+#~ "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d запиÑи о Ñтороннем Ñервере Ð´Ð»Ñ Ñторонней таблицы \"%s\"\n"
+#~ msgstr[2] ""
+#~ "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d запиÑей о Ñтороннем Ñервере Ð´Ð»Ñ Ñторонней таблицы "
+#~ "\"%s\"\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "Ð´Ð»Ñ Ñтой базы данных отÑутÑтвует запиÑÑŒ в pg_database\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "Ð´Ð»Ñ Ñтой базы данных найдено неÑколько запиÑей в pg_database\n"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "Ð´Ð»Ñ pg_indexes не найдена запиÑÑŒ в pg_class\n"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "Ð´Ð»Ñ pg_indexes найдено неÑколько запиÑей в pg_class\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "ошибка SQL-команды\n"
+
+#~ msgid "file archiver"
+#~ msgstr "файловый архиватор"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "ПРЕДУПРЖДЕÐИЕ:\n"
+#~ " Этот формат предназначен только Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ демонÑтрации, но не длÑ\n"
+#~ " повÑедневного иÑпользованиÑ. Файлы ÑохранÑÑŽÑ‚ÑÑ Ð² текущий рабочий "
+#~ "каталог.\n"
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "не удалоÑÑŒ закрыть файл данных поÑле чтениÑ\n"
+
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr ""
+#~ "не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов: %s\n"
+
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr ""
+#~ "не удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов: %s\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "не удалоÑÑŒ закрыть файл большого объекта\n"
+
+#~ msgid ""
+#~ " -c, --clean clean (drop) database objects before "
+#~ "recreating\n"
+#~ msgstr ""
+#~ " -c, --clean очиÑтить (удалить) объекты БД при "
+#~ "воÑÑтановлении\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner не воÑÑтанавливать владение объектами\n"
+
+#~ msgid ""
+#~ " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr ""
+#~ " --disable-triggers отключить триггеры при воÑÑтановлении только "
+#~ "данных\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead "
+#~ "of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " уÑтанавливать владельца, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹\n"
+#~ " SET SESSION AUTHORIZATION вмеÑто ALTER OWNER\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памÑти\n"
diff --git a/src/bin/pg_dump/po/sv.po b/src/bin/pg_dump/po/sv.po
new file mode 100644
index 0000000..2d86236
--- /dev/null
+++ b/src/bin/pg_dump/po/sv.po
@@ -0,0 +1,2819 @@
+# Swedish message translation file for pg_dump
+# Peter Eisentraut <peter_e@gmx.net>, 2001, 2009, 2010.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-23 12:51+0000\n"
+"PO-Revision-Date: 2023-08-23 15:31+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "detta bygge stöder inte komprimering med %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "hittade en tom sträng där en komprimeringsinställning förväntades"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "okänd komprimeringsflagga: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "komprimeringsmetoden \"%s\" kräver ett värde"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "värdet på komprimeringsflaggan \"%s\" måste vara ett heltal"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "värdet på komprimeringsflaggan \"%s\" måste vara en boolean"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "komprimeringsalgoritmen \"%s\" har ingen komprimeringsnivå som kan sättas"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivå mellan %d och %d (standard är %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "komprimeringsalgoritm \"%s\" stöder inte ett arbetarantal"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "komprimeringsalgoritmen \"%s\" stöder inte långdistansläge"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ogiltig binär \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "kunde inte läsa binär \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "läser utökningar"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "identifierar utökningsmedlemmar"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "läser scheman"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "läser användardefinierade tabeller"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "läser användardefinierade funktioner"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "läser användardefinierade typer"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "läser procedurspråk"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "läser användardefinierade aggregatfunktioner"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "läser användardefinierade operatorer"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "läser användardefinierade accessmetoder"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "läser användardefinierade operatorklasser"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "läser användardefinierade operator-familjer"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "läser användardefinierade textsöktolkare"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "läser användardefinierade textsökmallar"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "läser användardefinierade textsökordlistor"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "läser användardefinierade textsökkonfigurationer"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "läser användardefinierade främmande data-omvandlare"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "läser användardefinierade främmande servrar"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "läser standardrättigheter"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "läser användardefinierade jämförelser"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "läser användardefinierade konverteringar"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "läser typomvandlingar"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "läser transformer"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "läser information om arv av tabeller"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "läser händelsetriggrar"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "hittar utökningstabeller"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "hittar arvrelationer"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "läser kolumninfo flr intressanta tabeller"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "markerar ärvda kolumner i undertabeller"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "läser partitioneringsdata"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "läser index"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "flaggar index i partitionerade tabeller"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "läser utökad statistik"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "läser integritetsvillkor"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "läser triggrar"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "läser omskrivningsregler"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "läser policys"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "läser publiceringar"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "läser publiceringsmedlemskap för tabeller"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "läser publiceringsmedlemskap för scheman"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "läser prenumerationer"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "misslyckades med riktighetskontroll, hittade inte förälder-OID %u för tabell \"%s\" (OID %u)"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "ogiltigt antal (%d) föräldrar för tabell \"%s\""
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "kunde inte tolka numerisk array \"%s\": för många nummer"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "kunde inte tolka numerisk array \"%s\": ogiltigt tecken i nummer"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "kunde inte initiera komprimeringsbibliotek: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "kunde inte stänga komprimeringsströmmen: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "kunde inte komprimera data: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "kunde inte packa upp data: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "kunde inte stänga komprimeringsbiblioteket: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "kunde inte läsa från infilen: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "kunde inte läsa från infilen: slut på filen"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "kunde inte skapa kontext för LZ4-dekomprimering: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "kunde inte dekomprimera: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "kunde inte frigöra kontext för LZ4-dekomprimering: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "kunde inte avsluta komprimering: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "kunde inte initiera LZ4-komprimering: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "kunde inte avsluta dekomprimering: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "kunde inte sätta komprimeringsparameter \"%s\": %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "kunde inte initierar komprimeringsbibliotek"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "kunde inte dekomprimera data: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "kunde inte läsa från infilen: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "kan inte hantera läget \"%s\""
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() misslyckades: felkod %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "kunde inte skapa kommunikationskanaler: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "kunde inte skapa arbetsprocess: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "okänt kommando mottaget från ledare: \"%s\""
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "ogiltigt meddelande mottaget från arbetare: \"%s\""
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"kunde inte låsa relationen \"%s\"\n"
+"Dette beror oftast på att någon tagit ett ACCESS EXCLUSIVE-lås på tabellen\n"
+"efter att pg_dumps föräldraprocess tagit ett ACCESS SHARE-lås på tabellen."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "en arbetsprocess dog oväntat"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "kunde inte skriva till kommunikationskanal: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: kunde inte skapa uttag (socket): felkod %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: kunde inte göra \"bind\": felkod %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: kunde inte göra \"listen\": felkod %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() misslyckades: felkod %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: kunde inte skapa ett andra uttag (socket): felkod %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: kunde itne ansluta till uttag (socket): felkod %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: kunde inte acceptera anslutning: felkod %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "kunde inte stänga utdatafilen: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "arkivobjekten är inte i korrekt sektionsordning"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "oväntad sektionskod %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "parallell återställning stöds inte med detta arkivformat"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "parallell återställning stöds inte med arkiv som skapats av en pre-8.0 pg_dump"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "kan inte återställa från komprimerat arkiv (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "kopplar upp mot databas för återställning"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "direkta databasuppkopplingar stöds inte i arkiv från före version 1.3"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "implicerad återställning av enbart data"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "tar bort %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "kunde inte hitta var IF EXISTS skulle stoppas in i sats \"%s\""
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "varning från orginaldumpfilen: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "skapar %s \"%s.%s\""
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "skapar %s \"%s\""
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "kopplar upp mot ny databas \"%s\""
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "processar %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "processar data för tabell \"%s.%s\""
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "kör %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "stänger av trigger för %s"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "slår på trigger för %s"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "internt fel -- WriteData kan inte anropas utanför kontexten av en DataDumper-rutin"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "utmatning av stora objekt stöds inte i det valda formatet"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "återställde %d stor objekt"
+msgstr[1] "återställde %d stora objekt"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "återställer stort objekt med OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "kunde inte skapa stort objekt %u: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "kunde inte öppna stort objekt %u: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "kunde inte öppna TOC-filen \"%s\": %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "rad ignorerad: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "kunde inte hitta en post för ID %d"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "kunde inte stänga TOC-filen: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "kunde inte öppna utdatafilen \"%s\": %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "kunde inte öppna utdatafilen: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "skrev %zu byte data av stort objekt (resultat = %d)"
+msgstr[1] "skrev %zu bytes data av stort objekt (resultat = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "kunde inte skriva till stort objekt: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "vid INITIERING:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "vid HANTERING AV TOC:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "vid SLUTFÖRANDE:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "från TOC-post %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "felaktigt dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "felaktig tabell-dumpId för TABLE DATA-objekt"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "oväntad data-offset-flagga %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "fil-offset i dumpfilen är för stort"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "katalognamn för långt: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "katalogen \"%s\" verkar inte vara ett giltigt arkiv (\"toc.dat\" finns inte)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "kunde inte öppna indatafilen \"%s\": %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "kan inte öppna infil: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "kan inte läsa infilen: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "indatafilen är för kort (läste %lu, förväntade 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "indatafilen verkar vara en dump i textformat. Använd psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "indatafilen verkar inte vara ett korrekt arkiv (för kort?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "indatafilen verkar inte vara ett korrekt arkiv"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "kunde inte stänga indatafilen: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "kunde inte öppna stdout för append: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "känner inte igen filformat \"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "klar med objekt %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "arbetsprocess misslyckades: felkod %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "post-ID %d utanför sitt intervall -- kanske en trasig TOC"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "återeställa tabeller med WITH OIDS stöds inte längre"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "okänd teckenkodning \"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "ogiltigt ENCODING-val: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "ogiltigt STDSTRINGS-val: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "schema \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "tabell \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "index \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "funktion \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "trigger \"%s\" hittades inte"
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "kunde inte sätta sessionsanvändare till \"%s\": %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "kunde inte sätta search_path till \"%s\": %s"
+
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "kunde inte sätta default_tablespace till %s: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "kunde inte sätta default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "vet inte hur man sätter ägare för objekttyp \"%s\""
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "kunde inte hitta den magiska strängen i filhuvudet"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "ej supportad version (%d.%d) i filhuvudet"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "riktighetskontroll på heltalsstorlek (%lu) misslyckades"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "arkivet skapades på en maskin med större heltal, en del operationer kan misslyckas"
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "förväntat format (%d) skiljer sig från formatet som fanns i filen (%d)"
+
+#: pg_backup_archiver.c:3807
+#, c-format
+msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available"
+msgstr "arkivet är komprimerat, men denna installation stödjer inte komprimering (%s) -- ingen data kommer kunna läsas"
+
+#: pg_backup_archiver.c:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "ogiltig skapandedatum i huvud"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "processar objekt %d %s %s"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "går in i parallella huvudloopen"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "hoppar över objekt %d %s %s"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "startar objekt %d %s %s"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "klar med parallella huvudloopen"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "processar saknat objekt %d %s %s"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "tabell \"%s\" kunde inte skapas, dess data kommer ej återställas"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "ogiltig OID för stort objekt"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "fel vid sökning: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "datablock %d har fel sökposition"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "känner inte igen datablocktyp (%d) vid genomsökning av arkiv"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "kunde inte hitta block ID %d i arkiv -- kanske på grund av en återställningbegäran i oordning vilket inte kan hanteras då inputfilen inte är sökbar"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "kunde inte hitta block ID %d i arkiv -- möjligen ett trasigt arkiv"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "hittade oväntat block-ID (%d) vid läsning av data -- förväntade %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "ej igenkänd datablockstyp %d vid återställande av arkiv"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "kunde inte bestämma sökposition i arkivfil: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "kan inte stänga arkivfilen: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "kan inte återöppna indataarkiven"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "parallell återställning från standard in stöds inte"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "parallell återställning för en icke sökbar fil stöds inte"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "kunde inte söka till rätt position i arkivfilen: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "komprimerare aktiv"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "kunde inte hämta serverversionen från libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "avbryter då serverversionerna i matchar"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "server version: %s; %s version: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "är redan uppkopplad mot en databas"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "kunde inte ansluta till databasen"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "Ã¥teranslutning misslyckades: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "fråga misslyckades: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "Frågan var: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "fråga gav %d rad istället för en: %s"
+msgstr[1] "fråga gav %d rader istället för en: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %sKommandot var: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "kunde inte utföra fråga"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "fel returnerat av PQputCopyData: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "fel returnerat av PQputCopyEnd: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY misslyckades för tabell \"%s\": %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "oväntade extraresultat under kopiering (COPY) av tabell \"%s\""
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "kunde inte starta databastransaktionen"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "kunde inte genomföra databastransaktionen"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "ingen utdatakatalog angiven"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "kunde inte skriva till utdatafil: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "kan inte stänga datafil: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "kan inte stänga datafil \"%s\": %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "kunde inte öppna stora objekts TOC-fil \"%s\" för läsning: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "ogiltig rad i stora objekts TOC-fil \"%s\": \"%s\""
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "fel vid lösning av stora objekts TOC-fil \"%s\""
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "kunde inte stänga stora objekts TOC-fil \"%s\": %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "kan inte stänga LO-datafil: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "kunde inte skriva till TOC-fil för LO: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "kunde inte stänga TOC-fil för LO: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "filnamnet är för långt: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "detta format kan inte läsas"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "kunde inte öppna TOC-filen \"%s\" för utmatning: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "kunde inte öppna TOC-filen för utmatning: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "komprimering är stödjs inte av arkivformatet tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "kunde inte öppna TOC-fil \"%s\" för läsning: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "kunde inte öppna TOC-fil för läsning: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "kunde inte hitta fil \"%s\" i arkiv"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "kunde inte generera temporärt filnamn: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "oväntad COPY-satssyntax: \"%s\""
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "ogiltig OID för stort objekt (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "kunde inte stänga temporär fil: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "verklig fillängd (%lld) matchar inte det förväntade (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "kunde inte hitta filhuvud för fil \"%s\" i tar-arkiv"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "dumpa data i oordning stöds inte av detta arkivformat: \"%s\" krävs, men kommer före \"%s\" i denna arkivfil."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "inkomplett tar-huvud hittat (%lu byte)"
+msgstr[1] "inkomplett tar-huvud hittat (%lu bytes)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filposition %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "okänt sektionsnamn: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "slut på on_exit_nicely-slottar"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "flaggorna \"bara schema\" (-s) och \"bara data\" (-a) kan inte användas tillsammans"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "flaggorna -s/--schema-only och --include-foreign-data kan inte användas tillsammans"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "flaggan --include-foreign-data stöds inte med parallell backup"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "flaggorna \"nollställ\" (-c) och \"bara data\" (-a) kan inte användas tillsammans"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "flaggan --if-exists kräver flaggan -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "flagga --on-conflict-do-nothing kräver --inserts, --rows-per-insert eller --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "okänd komprimeringsalgoritm: \"%s\""
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "ogiltig inställning för komprimering: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "komprimeringsflaggan \"%s\" stöds inte än av pg_dump"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "parallell backup stöds bara med katalogformat"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "sista inbyggda OID är %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "hittade inga matchande scheman"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "hittade inga matchande tabeller"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "hittade inga matchande utökningar"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s dumpar en databas som en textfil eller i andra format.\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [FLAGGA]... [DBNAMN]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Allmänna flaggor:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME fil eller katalognamn för utdata\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p utdatans filformat (egen (c), katalog (d), tar (t),\n"
+" ren text (p) (standard))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM använd så här många parellella job för att dumpa\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose visa mer information\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METOD[:DETALJ]\n"
+" komprimera som angivet\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT misslyckas efter att ha väntat i TIMEOUT på tabellås\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Flaggor som styr utmatning:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only dumpa bara data, inte schema\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects inkludera stora objekt i dumpen\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (samma som --large-objects, obsolet)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects exkludera stora objekt i dumpen\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (samma som --no-large-objects, obsolet)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean nollställ (drop) databasobjekt innan återskapande\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create inkludera kommandon för att skapa databasen i dumpen\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=MALL dumpa bara de angivna utökningarna\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=KODNING dumpa data i teckenkodning KODNING\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=MALL dumpa bara de angivna scheman\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MALL dumpa INTE de angivna scheman\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner hoppa över återställande av objektägare i\n"
+" textformatdumpar\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only dumpa bara scheman, inte data\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME namn på superuser för textformatdumpar\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=MALL dumpa bara de angivna tabellerna\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=MALL dumpa INTE de angivna tabellerna\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges dumpa inte rättigheter (grant/revoke)\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade används bara av uppgraderingsverktyg\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts dumpa data som INSERT med kolumnnamn\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting slå av dollar-citering, använd standard SQL-citering\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers slå av triggrar vid återställning av enbart data\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security slå på radsäkerhet (dumpa bara data användaren\n"
+" har rätt till)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=MALL\n"
+" dumpa INTE angivna tabeller, inklusive\n"
+" barn och partitionstabeller\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=MALL dumpa INTE data för de angivna tabellerna\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=MALL\n"
+" dumpa INTE data för angivna tabeller,\n"
+" inklusive barn och partitionstabeller\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM övertrumfa standardinställningen för extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists använd IF EXISTS när objekt droppas\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=MALL\n"
+" inkludera data i främmande tabeller från\n"
+" främmande servrar som matchar MALL\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts dumpa data som INSERT, istället för COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root ladda partitioner via root-tabellen\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments dumpa inte kommentarer\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications dumpa inte publiceringar\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels dumpa inte tilldelning av säkerhetsetiketter\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions dumpa inte prenumereringar\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method dumpa inte tabellaccessmetoder\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces dumpa inte användning av tabellutymmen\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression dumpa inte komprimeringsmetoder för TOAST\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data dumpa inte ologgad tabelldata\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing addera ON CONFLICT DO NOTHING till INSERT-kommandon\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers citera alla identifierar, även om de inte är nyckelord\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NRADER antal rader per INSERT; implicerar --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEKTION dumpa namngiven sektion (pre-data, data eller post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable wait until the dump can run without anomalies\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT använda namngivet snapshot för att dumpa\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names kräv att mallar för tabeller och/eller scheman matchar\n"
+" minst en sak var\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=MALL dumpa bara angivna tabell(er), inklusive\n"
+" barn och partitionstabeller\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" använd kommandot SET SESSION AUTHORIZATION istället för\n"
+" kommandot ALTER OWNER för att sätta ägare\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAMN databasens som skall dumpas\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT databasens värdport\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAMN anslut med datta användarnamn mot databasen\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga aldrig efter lösenord\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLLNAMN gör SET ROLE innan dumpen\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om inget databasnamn anges, då kommer värdet i omgivningsvariabel\n"
+"PGDATABASE att användas.\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "ogiltig klientteckenkodning \"%s\" angiven"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "parallella dumpar från standby-server stöds inte av denna serverversion"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "ogiltigt utdataformat \"%s\" angivet"
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "hittade inga matchande scheman för mallen \"%s\""
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "hittade inga matchande utökningar för mallen \"%s\""
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "hittade inga matchande främmande servrar för mallen \"%s\""
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ej korrekt relationsnamn (för många namn med punkt): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "hittade inga matchande tabeller för mallen \"%s\""
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Du är för närvarande inte uppkopplad mot en databas."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "referenser till andra databaser är inte implementerat: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "dumpar innehållet i tabell \"%s.%s\""
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQendcopy() misslyckades."
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Felmeddelandet från servern: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "Kommandot var: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Dumpning av innehållet i tabellen \"%s\" misslyckades: PQgetResult() misslyckades."
+
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "fel antal fält hämtades för tabell \"%s\""
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "sparar databasdefinition"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "okänd lokalleverantör: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "sparar kodning = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "sparar standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "kunde inte parsa resultat från current_schemas()"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "sparar search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "läser stora objekt"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "sparar stora objekt"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "fel vid läsning av stort objekt %u: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "läser säkerhetspolicy på radnivå"
+
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "oväntad kommandotyp för policy: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "kunde inte parsa arrayen %s"
+
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "prenumerationer har inte dumpats få aktuell användare inte är en superuser"
+
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "kunde inte hitta föräldrautökning för %s %s"
+
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "schema med OID %u existerar inte"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för sekvens med OID %u hittas inte"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "misslyckades med riktighetskontroll, hittade inte tabell med OID %u i pg_partitioned_table"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "okänt tabell-OID %u"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "oväntat indexdata för tabell \"%s\""
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för pg_rewrite-rad med OID %u hittades inte"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "fråga producerade null som refererad tabell för främmande nyckel-trigger \"%s\" i tabell \"%s\" (OID för tabell : %u)"
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "oväntad kolumndata för tabell \"%s\""
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "ogiltigt kolumnnumrering i tabell \"%s\""
+
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "hittar tabellers default-uttryck"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "felaktigt adnum-värde %d för tabell \"%s\""
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "hittar tabellers check-villkor"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "förväntade %d check-villkor för tabell \"%s\" men hittade %d"
+msgstr[1] "förväntade %d check-villkor för tabell \"%s\" men hittade %d"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "Systemkatalogerna kan vara trasiga."
+
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "roll med OID %u existerar inte"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "ogiltig pg_init_privs-post: %u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype för datatyp \"%s\" verkar vara ogiltig"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "okänt provolatile-värde för funktion \"%s\""
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "okänt proparallel-värde för funktion \"%s\""
+
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "kunde inte hitta funktionsdefinitionen för funktion med OID %u"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "felaktigt värde i fältet pg_cast.castfunc eller pg_cast.castmethod"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "felaktigt värde i fältet pg_cast.castmethod"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "felaktig transform-definition, minst en av trffromsql och trftosql måste vara ickenoll"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "felaktigt värde i fältet pg_transform.trffromsql"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "felaktigt värde i fältet pg_transform.trftosql"
+
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "postfix-operatorer stöds inte längre (operator \"%s\")"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "kunde inte hitta en operator med OID %s."
+
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "ogiltig typ \"%c\" för accessmetod \"%s\""
+
+#: pg_dump.c:13455
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "okänd jämförelseleverantör: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ogiltig jämförelse \"%s\""
+
+#: pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider '%c'"
+msgstr "okänd jämförelseleverantör: '%c'"
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "okänt aggfinalmodify-värde för aggregat \"%s\""
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "okänt aggmfinalmodify-värde för aggregat \"%s\""
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "okänd objekttyp i standardrättigheter: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "kunde inte parsa standard-ACL-lista (%s)"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "kunde inte parsa initial ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "kunde inte parsa ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "fråga för att hämta definition av vy \"%s\" returnerade ingen data"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "fråga för att hämta definition av vy \"%s\" returnerade mer än en definition"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "definition av vy \"%s\" verkar vara tom (längd noll)"
+
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS stöds inte längre (tabell \"%s\")"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "ogiltigt kolumnnummer %d för tabell \"%s\""
+
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "kunde inte parsa kolumn i indexstatistik"
+
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "kunde inte parsa värden i indexstatistik"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "antal kolumner och värden stämmer inte i indexstatistik"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "saknar index för integritetsvillkor \"%s\""
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "oväntad integritetsvillkorstyp: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "fråga för att hämta data för sekvens \"%s\" returnerade %d rad (förväntade 1)"
+msgstr[1] "fråga för att hämta data för sekvens \"%s\" returnerade %d rader (förväntade 1)"
+
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "okänd sekvenstyp: %s"
+
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "oväntat tgtype-värde: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "felaktig argumentsträng (%s) för trigger \"%s\" i tabell \"%s\""
+
+#: pg_dump.c:17655
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "fråga för att hämta regel \"%s\" för tabell \"%s\" misslyckades: fel antal rader returnerades"
+
+#: pg_dump.c:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "kunde inte hitta refererad utökning %u"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "antal konfigurationer och villkor stämmer inte för utökning"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "läser beroendedata"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "inget refererande objekt %u %u"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "inget refererat objekt %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "ogiltigt dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "ogiltigt beroende %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "kunde inte fastställa beroendeloop"
+
+#: pg_dump_sort.c:1276
+#, 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] "det finns cirkulära främmande nyckelberoenden för denna tabell:"
+msgstr[1] "det finns cirkulära främmande nyckelberoenden för dessa tabeller:"
+
+#: pg_dump_sort.c:1281
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "Du kan eventiellt inte återställa dumpen utan att använda --disable-triggers eller temporärt droppa vilkoren."
+
+#: pg_dump_sort.c:1282
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Överväg att göra en full dump istället för --data-only för att undvika detta problem."
+
+#: pg_dump_sort.c:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "kunde inte räta ut beroendeloopen för dessa saker:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "flaggan --exclude-database kan inte användas tillsammans med -g/--globals-only, -r/--roles-only eller -t/--tablespaces-only"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "flaggorna \"bara gobala\" (-g) och \"bara roller\" (-r) kan inte användas tillsammans"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "flaggorna \"bara globala\" (-g) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "flaggorna \"bara roller\" (-r) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "kunde inte ansluta till databasen \"%s\""
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"kunde inte ansluta till databasen \"postgres\" eller \"template1\"\n"
+"Ange en annan databas."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s extraherar ett PostgreSQL databaskluster till en SQL-scriptfil.\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [FLAGGA]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME utdatafilnamn\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean nollställ (drop) databaser innan återskapning\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only dumpa bara globala objekt, inte databaser\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner återställ inte objektägare\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only dumpa endast roller, inte databaser eller tabellutrymmen\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAMN namn på superuser för användning i dumpen\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only dumpa endasdt tabellutrymmen, inte databaser eller roller\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=MALL uteslut databaser vars namn matchar MALL\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords dumpa inte lösenord för roller\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=ANSLSTR anslut med anslutningssträng\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAMN alternativ standarddatabas\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Om -f/--file inte används så kommer SQL-skriptet skriva till standard ut.\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "rollnamn som startar med \"pg_\" hoppas över (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "kunde inte hitta en korrekt dumpordning för medlemskap i rollen \"%s\""
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "kunde inte parsa ACL-listan (%s) för parameter \"%s\""
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "kunde inte tolka ACL-listan (%s) för tabellutrymme \"%s\""
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "utesluter databas \"%s\""
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "dumpar databas \"%s\""
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump misslyckades med databas \"%s\", avslutar"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "kunde inte öppna om utdatafilen \"%s\": %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "kör \"%s\""
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "kunde inte hämta serverversionen"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "kunde inte tolka versionsträngen \"%s\""
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "kör: %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "en av flaggorna -d/--dbname och -f/--file måste anges"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "flaggorna -d/--dbname och -f/--file kan inte användas ihop"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "flaggorna -C/--create och -1/--single-transaction kan inte användas tillsammans"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "kan inte ange både --single-transaction och multipla job"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "okänt arkivformat \"%s\"; vänligen ange \"c\", \"d\" eller \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "fel ignorerade vid återställande: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s återställer en PostgreSQL-databas från ett arkiv skapat av pg_dump.\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [FLAGGA]... [FIL]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAMN koppla upp med databasnamn\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILNAMN utdatafilnamn (- för stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t backupens filformat (bör ske automatiskt)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list skriv ut summerad TOC för arkivet\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose visa mer information\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Flaggor som styr återställning:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only återställ bara data, inte scheman\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create skapa måldatabasen\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error avsluta vid fel, standard är att fortsätta\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAMN återställ namngivet index\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM använda så här många parallella job för återställning\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILNAMN använd innehållsförteckning från denna fil för\n"
+" att välja/sortera utdata\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAMN återställ enbart objekt i detta schema\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAMN återställ inte objekt i detta schema\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAMN(arg) återställ namngiven funktion\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only återställ bara scheman, inte data\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAMN namn på superuser för att slå av triggrar\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAMN återställ namngiven relation (tabell, vy, osv.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAMN återställ namngiven trigger\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges återställ inte åtkomsträttigheter (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction återställ i en enda transaktion\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security aktivera radsäkerhet\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments återställ inte kommentarer\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables återställ inte data för tabeller som\n"
+" inte kunde skapas\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications återställ inte publiceringar\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels återställ inte säkerhetsetiketter\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions återställ inte prenumerationer\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method återställ inte tabellaccessmetoder\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces återställ inte användning av tabellutymmen\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SEKTION återställ namngiven sektion (pre-data, data eller post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME gör SET ROLE innan återställning\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"Flaggorna -I, -n, -N, -P, -t, -T och --section kan kombineras och anges\n"
+"många gånger för att välja flera objekt.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om inget indatafilnamn är angivet, så kommer standard in att användas.\n"
+"\n"
+
+#, c-format
+#~ msgid " %s"
+#~ msgstr " %s"
+
+#, c-format
+#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+#~ msgstr " -Z, --compress=0-9 komprimeringsnivå för komprimerade format\n"
+
+#, c-format
+#~ msgid "cannot restore from compressed archive (compression not supported in this installation)"
+#~ msgstr "kan inte återställa från komprimerat arkiv (inte konfigurerad med stöd för komprimering)"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#, c-format
+#~ msgid "could not close blob data file: %m"
+#~ msgstr "kan inte stänga blobbars datafil: %m"
+
+#, c-format
+#~ msgid "could not close blobs TOC file: %m"
+#~ msgstr "kunde inte stänga blobbars TOC-fil: %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#, c-format
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "kunde inte läsa binär \"%s\""
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#, c-format
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "ogiltig binär \"%s\""
+
+#, c-format
+#~ msgid "invalid compression code: %d"
+#~ msgstr "ogiltig komprimeringskod: %d"
+
+#, c-format
+#~ msgid "not built with zlib support"
+#~ msgstr "ej byggt med zlib-stöd"
+
+#, c-format
+#~ msgid "requested compression not available in this installation -- archive will be uncompressed"
+#~ msgstr "efterfrågad komprimering finns inte i denna installation -- arkivet kommer sparas okomprimerat"
diff --git a/src/bin/pg_dump/po/tr.po b/src/bin/pg_dump/po/tr.po
new file mode 100644
index 0000000..7ec7f5d
--- /dev/null
+++ b/src/bin/pg_dump/po/tr.po
@@ -0,0 +1,3070 @@
+# translation of pg_dump-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2006, 2007.
+# Nicolai TUFAR <ntufar@gmail.com> 2004, 2005, 2006, 2007.
+# Abdullah Gülner <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:47+0000\n"
+"PO-Revision-Date: 2019-05-31 15:16+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"X-Poedit-Basepath: /home/ntufar/pg/pgsql/src/bin/pg_dump\n"
+"X-Poedit-SearchPath-0: C:/pgsql/src/bin/pg_dump\n"
+"X-Poedit-SearchPath-1: /home/ntufar/pg/pgsql/src/backend\n"
+"X-Poedit-SearchPath-2: c:/pgsql/src/backend\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "geçerli dizin tespit edilemedi: %m"
+
+#: ../../common/exec.c:157
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:207
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "\"%s\" çalıştırmak için bulunamadı"
+
+#: ../../common/exec.c:271 ../../common/exec.c:310
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %m"
+
+#: ../../common/exec.c:288
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" okuma hatası: %m"
+
+#: ../../common/exec.c:541
+#, c-format
+msgid "pclose failed: %m"
+msgstr "pclose başarısız oldu: %m"
+
+#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "yetersiz bellek\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer çoğaltılamıyor (duplicate) (iç hata)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "komut çalıştırılabilir değil"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "komut bulunamadı"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır :%s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır"
+
+#: common.c:124
+#, c-format
+msgid "reading extensions"
+msgstr "uzantılar okunuyor"
+
+#: common.c:128
+#, c-format
+msgid "identifying extension members"
+msgstr "uzantı üyeleri belirleniyor"
+
+#: common.c:131
+#, c-format
+msgid "reading schemas"
+msgstr "ÅŸemalar okunuyor"
+
+#: common.c:141
+#, c-format
+msgid "reading user-defined tables"
+msgstr "kullanıcı tanımlı tablolar okunuyor"
+
+#: common.c:148
+#, c-format
+msgid "reading user-defined functions"
+msgstr "kullanıcı tanımlı fonksiyonlar okunuyor"
+
+#: common.c:153
+#, c-format
+msgid "reading user-defined types"
+msgstr "kullanıcı tanımlı tipler okunuyor"
+
+#: common.c:158
+#, c-format
+msgid "reading procedural languages"
+msgstr "yordamsal diller okunuyor"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "kullanıcı-tanımlı aggregate fonksiyonlar okunuyor"
+
+#: common.c:164
+#, c-format
+msgid "reading user-defined operators"
+msgstr "kullanıcı tanımlı operatörler okunuyor"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "kullanıcı tanımlı erişim yöntemleri okunuyor"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "kullanıcı-tanımlı operatör sınıfları okunuyor"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "kullanıcı tanımlı operatör aileleri okunuyor"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "kullanıcı tanımlı metin arama ayrıştırıcıları okunuyor"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "kullanıcı tanımlı metin arama şablonları okunuyor"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "kullanıcı-tanımlı metin arama sözlükleri okunuyor"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "kullanıcı-tanımlı metin arama yapılandırmaları okunuyor"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "kullanıcı tanımlı foreign-data wrapperlar okunuyor"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "kullanıcı tanımlı foreign sunucular okunuyor"
+
+#: common.c:195
+#, c-format
+msgid "reading default privileges"
+msgstr "öntanımlı yetkiler okunuyor"
+
+#: common.c:198
+#, c-format
+msgid "reading user-defined collations"
+msgstr "kullanıcı tanımlı collation'lar okunuyor"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "kullanıcı tanımlı dönüşümler (conversion) okunuyor"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "type cast'lar okunuyor"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "dönüşümler (transform) okunuyor"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "tablo kalıtım (inheritance) bilgisi okunuyor"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "olay tetikleyicileri okunuyor"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "uzantı tabloları bulunuyor"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "kalıtım (inheritance) ilişkileri bulunuyor"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "ilgili tabloların sütun bilgisi okunuyor"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "alt tablolarda inherited sütunlar işaretleniyor"
+
+#: common.c:231
+#, c-format
+msgid "reading indexes"
+msgstr "indeksler okunuyor"
+
+#: common.c:234
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "bölümlenmiş tablolardaki indeksler işaretleniyor"
+
+#: common.c:237
+#, c-format
+msgid "reading extended statistics"
+msgstr "geniÅŸletilmiÅŸ istatistikler okunuyor"
+
+#: common.c:240
+#, c-format
+msgid "reading constraints"
+msgstr "bütünlük kısıtlamaları okunuyor"
+
+#: common.c:243
+#, c-format
+msgid "reading triggers"
+msgstr "tetikleyiciler okunuyor"
+
+#: common.c:246
+#, c-format
+msgid "reading rewrite rules"
+msgstr "rewrite kuralları okunuyor"
+
+#: common.c:249
+#, c-format
+msgid "reading policies"
+msgstr "ilkeler (policy) okunuyor"
+
+#: common.c:252
+#, c-format
+msgid "reading publications"
+msgstr "yayınlar (publication) okunuyor"
+
+#: common.c:255
+#, c-format
+msgid "reading publication membership"
+msgstr "yayın üyeliği okunuyor"
+
+#: common.c:258
+#, c-format
+msgid "reading subscriptions"
+msgstr "abonelikler okunuyor"
+
+#: common.c:1024
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "tutarlılık kontrolü başarısız, \"%2$s\" tablosunun (OID %3$u) üst OIDsi %1$u bulunamadı"
+
+#: common.c:1066
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "\"%s\" numerik dizisi ayrıştırılamadı: çok fazla sayı"
+
+#: common.c:1081
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "\"%s\" numerik dizisi ayrıştırılamadı: sayıda geçersiz karakter"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "geçersiz sıkıştırma kodu: %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:508
+#: compress_io.c:551
+#, c-format
+msgid "not built with zlib support"
+msgstr "zlib desteğiyle oluşturulmamış"
+
+#: compress_io.c:237 compress_io.c:336
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "sıkıştırma kütüphanesi ilklendirilemedi: %s"
+
+#: compress_io.c:257
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "sıkıştırma akımı kapatılamadı: %s"
+
+#: compress_io.c:274
+#, c-format
+msgid "could not compress data: %s"
+msgstr "veri sıkıştırılamadı: %s"
+
+#: compress_io.c:352 compress_io.c:367
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "sıkıştırılmış veri açılamadı: %s"
+
+#: compress_io.c:374
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "sıkıştırma kütüphanesi kapatılamadı: %s"
+
+#: compress_io.c:588 compress_io.c:625 pg_backup_tar.c:555 pg_backup_tar.c:558
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "girdi dosyası okuma hatası: %s"
+
+#: compress_io.c:627 pg_backup_custom.c:578 pg_backup_directory.c:539
+#: pg_backup_tar.c:795 pg_backup_tar.c:818
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "girdi dosyası okuma hatası: dosya sonu"
+
+#: parallel.c:263
+#, c-format
+msgid "WSAStartup failed: %d"
+msgstr "WSAStartup başarısız: %d"
+
+#: parallel.c:968
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "iletişim kanalları oluşturulamadı: %m"
+
+#: parallel.c:1031
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "işçi süreci yaratılamadı: %m"
+
+#: parallel.c:1160
+#, c-format
+msgid "unrecognized command received from master: \"%s\""
+msgstr "ana sunucudan (master) bilinmeyen komut alındı: \"%s\""
+
+#: parallel.c:1203 parallel.c:1441
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "alt süreçten (worker) geçersiz mesaj alındı: \"%s\""
+
+#: parallel.c:1335
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"\"%s\" nesnesi üzerinde kilit alınamadı\n"
+"Bu genellikle pg_dump ana süreci tablo üzerinde başta ACCESS SHARE kilidi aldıktan sonra başka birinin tablo üzerinde ACCESS EXCLUSIVE kilidi talep ettiği anlamına gelir."
+
+#: parallel.c:1424
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "alt süreç beklenmeyen biçimde sonlandı"
+
+#: parallel.c:1546 parallel.c:1662
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "iletişim kanalına yazma başarısız: %m"
+
+#: parallel.c:1623
+#, c-format
+msgid "select() failed: %m"
+msgstr "select() başarısız oldu: %m"
+
+#: parallel.c:1746
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: soket oluşturulamadı: hata kodu %d"
+
+#: parallel.c:1757
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: bağlanamadı (bind): hata kodu %d"
+
+#: parallel.c:1764
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: dinleyemedi: hata kodu %d"
+
+#: parallel.c:1771
+#, c-format
+msgid "pgpipe: getsockname() failed: error code %d"
+msgstr "pgpipe: getsockname() başarısız oldu: hata kodu %d"
+
+#: parallel.c:1782
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: ikinci soket oluşturulamadı: hata kodu %d"
+
+#: parallel.c:1791
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: soket bağlanamadı: hata kodu %d"
+
+#: parallel.c:1800
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: bağlantı kabul edemedi: hata kodu %d"
+
+#: pg_backup_archiver.c:273 pg_backup_archiver.c:1596
+#, c-format
+msgid "could not close output file: %m"
+msgstr "çıktı dosyası kapatılamadı: %m"
+
+#: pg_backup_archiver.c:317 pg_backup_archiver.c:321
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "arşiv kalemleri doğru bölüm sırasında değil"
+
+#: pg_backup_archiver.c:327
+#, c-format
+msgid "unexpected section code %d"
+msgstr "beklenmeyen bölüm kodu %d"
+
+#: pg_backup_archiver.c:364
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "paralel geri yükleme bu arşiv dosya biçimiyle desteklenmiyor"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "paralel geri yükleme özelliği 8.0 öncesi pg_dump ile yapılan arşivlerle desteklenmemektedir"
+
+#: pg_backup_archiver.c:386
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "sıkıştırılmış arşivden yükleme başarısız (bu kurulumda sıkıştırma desteklenmiyor)"
+
+#: pg_backup_archiver.c:403
+#, c-format
+msgid "connecting to database for restore"
+msgstr "geri yükleme için veritabanına bağlanılıyor"
+
+#: pg_backup_archiver.c:405
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "1.3 sürüm öncesi arşivlerinde doğrudan veritabanı bağlantıları desteklenmemektedir"
+
+#: pg_backup_archiver.c:450
+#, c-format
+msgid "implied data-only restore"
+msgstr "örtük salt veri geri yükleme"
+
+#: pg_backup_archiver.c:516
+#, c-format
+msgid "dropping %s %s"
+msgstr "%s %s kaldırılıyor"
+
+#: pg_backup_archiver.c:611
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "\"%s\" ifadesinde nereye IF EXISTS ekleneceği bulunamadı"
+
+#: pg_backup_archiver.c:767 pg_backup_archiver.c:769
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "asıl dump dosyasından uyarı: %s"
+
+#: pg_backup_archiver.c:784
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "%s oluÅŸturuluyor \"%s.%s\""
+
+#: pg_backup_archiver.c:787
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "%s oluÅŸturuluyor \"%s\""
+
+#: pg_backup_archiver.c:844
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "yeni \"%s\" veritabanına bağlanılıyor"
+
+#: pg_backup_archiver.c:872
+#, c-format
+msgid "processing %s"
+msgstr "%s iÅŸleniyor"
+
+#: pg_backup_archiver.c:892
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için veri işleniyor"
+
+#: pg_backup_archiver.c:954
+#, c-format
+msgid "executing %s %s"
+msgstr "%s %s yürütülüyor"
+
+#: pg_backup_archiver.c:993
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "%s için tetikleyiciler etkisiz hale getiriliyor"
+
+#: pg_backup_archiver.c:1019
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "%s için tetikleyiciler etkinleştiriliyor"
+
+#: pg_backup_archiver.c:1047
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "iç hata -- WriteData, DataDumper yordamının bağlamı dışında çağrılamaz"
+
+#: pg_backup_archiver.c:1232
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "seçilen biçimde large-object çıktısı desteklenmemektedir"
+
+#: pg_backup_archiver.c:1290
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "%d large object geri yüklendi"
+msgstr[1] "%d large object geri yüklendi"
+
+#: pg_backup_archiver.c:1311 pg_backup_tar.c:738
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "%u OID'li large-object geri yükleniyor"
+
+#: pg_backup_archiver.c:1323
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "%u large object oluşturulamadı: %s"
+
+#: pg_backup_archiver.c:1328 pg_dump.c:3463
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "%u large object açılamadı: %s"
+
+#: pg_backup_archiver.c:1385
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "\"%s\" TOC dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:1425
+#, c-format
+msgid "line ignored: %s"
+msgstr "satır yoksayıldı: %s"
+
+#: pg_backup_archiver.c:1432
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "ID %d için bir girdi bulunamıyor"
+
+#: pg_backup_archiver.c:1453 pg_backup_directory.c:222
+#: pg_backup_directory.c:587
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "TOC dosyası kapatılamıyor: %m"
+
+#: pg_backup_archiver.c:1568 pg_backup_custom.c:159 pg_backup_directory.c:332
+#: pg_backup_directory.c:574 pg_backup_directory.c:637
+#: pg_backup_directory.c:656
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "\"%s\" çıktı dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:1570 pg_backup_custom.c:165
+#, c-format
+msgid "could not open output file: %m"
+msgstr "çıktı dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:1663
+#, c-format
+msgid "wrote %lu byte of large object data (result = %lu)"
+msgid_plural "wrote %lu bytes of large object data (result = %lu)"
+msgstr[0] "large object verisinin %lu baytı yazıldı (sonuç = %lu)"
+msgstr[1] "large object verisinin %lu baytı yazıldı (sonuç = %lu)"
+
+#: pg_backup_archiver.c:1668
+#, c-format
+msgid "could not write to large object (result: %lu, expected: %lu)"
+msgstr "large-object yazılamıyor (sonuç: %lu, beklenen: %lu)"
+
+#: pg_backup_archiver.c:1760
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "INITIALIZING sırasında:"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "PROCESSING TOC sırasında:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while FINALIZING:"
+msgstr "FINALIZING sırasında:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "TOC giriÅŸte hata %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1851
+#, c-format
+msgid "bad dumpId"
+msgstr "kötü dumpId"
+
+#: pg_backup_archiver.c:1872
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA öğesi için kötü tablo dumpId değeri"
+
+#: pg_backup_archiver.c:1964
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "beklenmeyen veri konum bayrağı %d"
+
+#: pg_backup_archiver.c:1977
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "dump dosyasında dosya göstergesi çok büyük"
+
+#: pg_backup_archiver.c:2114 pg_backup_archiver.c:2124
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "dizin adı çok uzun: \"%s\""
+
+#: pg_backup_archiver.c:2132
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "\"%s\" dizini geçerli bir arşiv olarak görünmüyor (\"toc.dat\" bulunamadı)"
+
+#: pg_backup_archiver.c:2140 pg_backup_custom.c:176 pg_backup_custom.c:760
+#: pg_backup_directory.c:207 pg_backup_directory.c:391
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "\"%s\" girdi dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:2147 pg_backup_custom.c:182
+#, c-format
+msgid "could not open input file: %m"
+msgstr "girdi dosyası açılamadı: %m"
+
+#: pg_backup_archiver.c:2153
+#, c-format
+msgid "could not read input file: %m"
+msgstr "girdi dosyası okuma hatası: %m"
+
+#: pg_backup_archiver.c:2155
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "girdi dosyası fazla kısa (okunan: %lu, beklenen: 5)"
+
+#: pg_backup_archiver.c:2240
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "girdi dosyası metin biçiminde bir döküm (dump) gibi görünüyor. Lütfen psql kullanın."
+
+#: pg_backup_archiver.c:2246
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "girdi dosyası geçerli bir arşiv gibi görünmüyor (çok kısa?)"
+
+#: pg_backup_archiver.c:2252
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "girdi dosyası geçerli bir arşiv gibi görünmüyor"
+
+#: pg_backup_archiver.c:2272
+#, c-format
+msgid "could not close input file: %m"
+msgstr "çıktı dosyası kapatılamadı: %m"
+
+#: pg_backup_archiver.c:2386
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "tanınmayan dosya biçimi: \"%d\""
+
+#: pg_backup_archiver.c:2468 pg_backup_archiver.c:4474
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "%d %s %s öğesi bitirildi"
+
+#: pg_backup_archiver.c:2472 pg_backup_archiver.c:4487
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "alt süreç başarısız oldu: çıkış kodu %d"
+
+#: pg_backup_archiver.c:2592
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "ID %d olan giriş kapsam dışıdır -- bozuk bir TOC olabilir"
+
+#: pg_backup_archiver.c:2659
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "WITH OIDS ile tanımlanmış tabloların geri yüklenmesi (restore) artık desteklenmemektedir"
+
+#: pg_backup_archiver.c:2741
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "tanınmayan dil kodlaması \"%s\""
+
+#: pg_backup_archiver.c:2746
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "geçersiz ENCODING öğesi: %s"
+
+#: pg_backup_archiver.c:2764
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "geçersiz STDSTRINGS öğesi: %s"
+
+#: pg_backup_archiver.c:2789
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "\"%s\" şeması bulunamadı"
+
+#: pg_backup_archiver.c:2796
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "\"%s\" tablosu bulunamadı"
+
+#: pg_backup_archiver.c:2803
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "\"%s\" indeksi bulunamadı"
+
+#: pg_backup_archiver.c:2810
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "\"%s\" fonksiyonu bulunamadı"
+
+#: pg_backup_archiver.c:2817
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "\"%s\" tetikleyicisi bulunamadı"
+
+#: pg_backup_archiver.c:3196
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "oturum kullanıcısı \"%s\" olarak değiştirilemedi: %s"
+
+#: pg_backup_archiver.c:3533 pg_backup_archiver.c:3690
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "\"%s\" nesne tipi için sahip bilgisinin nasıl ayarlanacağı bilinmiyor"
+
+#: pg_backup_archiver.c:3794
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "dosya başlığında magic string bulunamadı"
+
+#: pg_backup_archiver.c:3807
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "dosya başlığında desteklenmeyen sürüm (%d.%d)"
+
+#: pg_backup_archiver.c:3812
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "tamsayı (integer) boyutunda (%lu) tutarlılık kontrolü başarısız"
+
+#: pg_backup_archiver.c:3816
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "arşiv daha büyük tam sayılara (integer) sahip platformda oluşturulmuş, bazı işlemler başarısız olabilir"
+
+#: pg_backup_archiver.c:3826
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "dosyada bulunan biçim (%2$d) beklenen biçimden (%1$d) farklıdır"
+
+#: pg_backup_archiver.c:3842
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "arşiv sıkıştırılmış, ancak bu kurulum sıkıştırmayı desteklemiyor -- uygun veri olmayacak"
+
+#: pg_backup_archiver.c:3860
+#, c-format
+msgid "invalid creation date in header"
+msgstr "veri başlığında geçersiz tarih"
+
+#: pg_backup_archiver.c:3997
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "%d %s %s öğesi işleniyor"
+
+#: pg_backup_archiver.c:4076
+#, c-format
+msgid "entering main parallel loop"
+msgstr "ana paralel döngüye giriliyor"
+
+#: pg_backup_archiver.c:4087
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "%d %s %s öğesi atlanıyor"
+
+#: pg_backup_archiver.c:4096
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "%d %s %s öğesi başlatılıyor"
+
+#: pg_backup_archiver.c:4150
+#, c-format
+msgid "finished main parallel loop"
+msgstr "ana paralel döngü bitti"
+
+#: pg_backup_archiver.c:4188
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "atlanan %d %s %s öğesi işleniyor"
+
+#: pg_backup_archiver.c:4793
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "\"%s\" tablosu oluşturulamadı, onun verileri yüklenmeyecektir"
+
+#: pg_backup_custom.c:377 pg_backup_null.c:150
+#, c-format
+msgid "invalid OID for large object"
+msgstr "large object için geçersiz OID"
+
+#: pg_backup_custom.c:447
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "arşivde ararken tanınmayan veri blok tipine (%d) rastlandı"
+
+#: pg_backup_custom.c:458 pg_backup_custom.c:818
+#, c-format
+msgid "error during file seek: %m"
+msgstr "dosya içerisinde gösterge ilerleme hatası: %m"
+
+#: pg_backup_custom.c:467
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive"
+msgstr "arşivde %d block ID'si bulunamadı -- arşivdeki eksik veri konumu nedeniyle işlenemeyen geçersiz yükleme isteği nedeniyle olabilir"
+
+#: pg_backup_custom.c:472
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "arşivde %d block ID'si bulunamadı -- aranamayan girdi dosyası nedeniyle işlenemeyen geçersiz yükleme isteği nedeniyle olabilir"
+
+#: pg_backup_custom.c:477
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "%d blok ID'si arşivde bulunamadı -- arşiv bozulmuş olabilir"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "veriyi okurken beklenmeyen blok ID (%d) bulundu -- beklenen: %d"
+
+#: pg_backup_custom.c:498
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "arşivi yüklerken bilinmeyen veri blok tipi %d bulundu"
+
+#: pg_backup_custom.c:580
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "girdi dosyası okuma hatası: %m"
+
+#: pg_backup_custom.c:698 pg_backup_custom.c:751 pg_backup_custom.c:891
+#: pg_backup_tar.c:1091
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "arşiv dosyasında arama pozisyonu belirlenemedi: %m"
+
+#: pg_backup_custom.c:715 pg_backup_custom.c:755
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "arşiv dosyası kapatma hatası: %m"
+
+#: pg_backup_custom.c:738
+#, c-format
+msgid "can only reopen input archives"
+msgstr "sadece girdi arşivleri tekrar açılabilir"
+
+#: pg_backup_custom.c:745
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "standart girdiden paralel geri yükleme desteklenmiyor"
+
+#: pg_backup_custom.c:747
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "taranamayan dosyadan paralel geri yükleme desteklenmiyor"
+
+#: pg_backup_custom.c:763
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "arşiv dosyasında arama pozisyonu ayarlanamadı: %m"
+
+#: pg_backup_custom.c:839
+#, c-format
+msgid "compressor active"
+msgstr "sıkıştırma etkin"
+
+#: pg_backup_custom.c:894
+#, c-format
+msgid "ftell mismatch with expected position -- ftell used"
+msgstr "ftell fonksiyonun bidirdiği pozisyonu ile beklenen pozisyon uyumsuz -- ftell kullanıldı"
+
+#: pg_backup_db.c:44
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "libpq kütüphanesinden server_version alınamadı"
+
+#: pg_backup_db.c:55 pg_dumpall.c:1806
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "sunucu sürümü: %s; %s sürümü: %s"
+
+#: pg_backup_db.c:57 pg_dumpall.c:1808
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "sunucu sürümü uyuşmazlığı nedeniyle iptal ediliyor (abort)"
+
+#: pg_backup_db.c:140
+#, c-format
+msgid "connecting to database \"%s\" as user \"%s\""
+msgstr "\"%2$s\" kullanıcısı olarak \"%1$s\" veritabanına bağlanılıyor"
+
+#: pg_backup_db.c:147 pg_backup_db.c:196 pg_backup_db.c:257 pg_backup_db.c:298
+#: pg_dumpall.c:1631 pg_dumpall.c:1744
+msgid "Password: "
+msgstr "Parola: "
+
+#: pg_backup_db.c:179
+#, c-format
+msgid "failed to reconnect to database"
+msgstr "veritabanına yeniden bağlanma hatası"
+
+#: pg_backup_db.c:184
+#, c-format
+msgid "could not reconnect to database: %s"
+msgstr "%s veritabanına yeniden bağlanılamadı"
+
+#: pg_backup_db.c:200
+#, c-format
+msgid "connection needs password"
+msgstr "bağlantı parola gerektiriyor"
+
+#: pg_backup_db.c:251
+#, c-format
+msgid "already connected to a database"
+msgstr "bir veritabanına zaten bağlı"
+
+#: pg_backup_db.c:290
+#, c-format
+msgid "failed to connect to database"
+msgstr "veritabanına bağlantı başarısız oldu"
+
+#: pg_backup_db.c:306
+#, c-format
+msgid "connection to database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanına bağlantı başarısız oldu: %s"
+
+#: pg_backup_db.c:378 pg_dumpall.c:1664
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:385 pg_dumpall.c:1869 pg_dumpall.c:1892
+#, c-format
+msgid "query failed: %s"
+msgstr "sorgu başarısız oldu: %s"
+
+#: pg_backup_db.c:387 pg_dumpall.c:1870 pg_dumpall.c:1893
+#, c-format
+msgid "query was: %s"
+msgstr "sorgu ÅŸu idi: %s"
+
+#: pg_backup_db.c:428
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "sorgu 1 yerine %d satır döndürdü: %s"
+msgstr[1] "sorgu 1 yerine %d satır döndürdü: %s"
+
+#: pg_backup_db.c:520 pg_backup_db.c:594 pg_backup_db.c:601
+msgid "could not execute query"
+msgstr "sorgu çalıştırılamadı"
+
+#: pg_backup_db.c:573
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData'nın döndürdüğü hata: %s"
+
+#: pg_backup_db.c:622
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd'in döndürdüğü hata: %s"
+
+#: pg_backup_db.c:634 pg_dump.c:1924
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "\"%s\" tablosunun COPY işlemi sırasında beklenmeyen ilave sonuçlar"
+
+#: pg_backup_db.c:646
+msgid "could not start database transaction"
+msgstr "veritabanı transaction'u başlatılamadı"
+
+#: pg_backup_db.c:654
+msgid "could not commit database transaction"
+msgstr "veritabanı işlemi (transaction) commit edilemedi"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "herhangi bir çıktı dizini belirtilmedi"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" dizini okunamıyor: %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" dizini kapatılamadı: %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" dizini oluşturulamadı: %m"
+
+#: pg_backup_directory.c:350 pg_backup_directory.c:488
+#: pg_backup_directory.c:518
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "çıktı dosyasına yazma başarısız: %s"
+
+#: pg_backup_directory.c:403
+#, c-format
+msgid "could not close data file: %m"
+msgstr "veri dosyası kapatılamadı: %m"
+
+#: pg_backup_directory.c:443
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "girdi için \"%s\" large object TOC dosyası açılamadı: %m"
+
+#: pg_backup_directory.c:454
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "\"%s\" large object TOC dosyasında geçersiz satır: \"%s\""
+
+#: pg_backup_directory.c:463
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "\"%s\" large object TOC dosyası okuma hatası"
+
+#: pg_backup_directory.c:467
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "\"%s\" large object TOC dosyası kapatılamadı: %m"
+
+#: pg_backup_directory.c:678
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "blobs TOC dosyası yazma hatası"
+
+#: pg_backup_directory.c:710
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "dosya adı çok uzun: \"%s\""
+
+#: pg_backup_null.c:75
+#, c-format
+msgid "this format cannot be read"
+msgstr "bu biçim okunamıyor"
+
+#: pg_backup_tar.c:177
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "çıktı için \"%s\" TOC dosyası açılamadı: %m"
+
+#: pg_backup_tar.c:184
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "çıktı için TOC dosyası açılamadı: %m"
+
+#: pg_backup_tar.c:203 pg_backup_tar.c:358
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "sıkıştırma, tar çıktı formatı tarafından desteklenmiyor"
+
+#: pg_backup_tar.c:211
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "\"%s\" TOC dosyası girdi için açılamadı: %m"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "girdi için TOC dosyası açılamadı: %m"
+
+#: pg_backup_tar.c:344
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "\"%s\" dosyası arşivde bulunamadı"
+
+#: pg_backup_tar.c:410
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "geçici dosya adı oluşturulamadı: %m"
+
+#: pg_backup_tar.c:421
+#, c-format
+msgid "could not open temporary file"
+msgstr "geçici dosya açılamadı"
+
+#: pg_backup_tar.c:448
+#, c-format
+msgid "could not close tar member"
+msgstr "tar öğesi kapatılamadı"
+
+#: pg_backup_tar.c:571
+#, c-format
+msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+msgstr "iç hata - th ya da fh, tarReadRaw() içinde belirtilmedi\n"
+
+#: pg_backup_tar.c:693
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "beklenmeyen COPY ifadesi söz dizimi: \"%s\""
+
+#: pg_backup_tar.c:961
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "(%u) large object'i için geçersiz OID"
+
+#: pg_backup_tar.c:1106
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "geçici dosya kapatma hatası: %m"
+
+#: pg_backup_tar.c:1115
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)"
+msgstr "gerçek dosya uzunluğu (%s) beklenen uzunluğu (%s) ile uyuşmamaktadır"
+
+#: pg_backup_tar.c:1172 pg_backup_tar.c:1202
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "tar arşivinde \"%s\" dosyası için başlık bulunamadı"
+
+#: pg_backup_tar.c:1190
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "bu arşiv biçiminde veriyi sıra dışı geri yükleme desteklenmemektedir: \"%s\" bekleniyor ancak arşiv dosyasında %s ondan önce gelmektedir."
+
+#: pg_backup_tar.c:1235
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "eksik tar başlığı bulundu (%lu bayt)"
+msgstr[1] "eksik tar başlığı bulundu (%lu bayt)"
+
+#: pg_backup_tar.c:1286
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s"
+msgstr "%s dosyasında bozuk tar başlığı (beklenen: %d, hesaplanan: %d) dosya pozisyonu %s"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "bilinmeyen bölüm adı: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:612 pg_dump.c:629 pg_dumpall.c:338
+#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374
+#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:290 pg_restore.c:306
+#: pg_restore.c:324
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazabilirsiniz.\n"
+
+#: pg_backup_utils.c:68
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely slotları yetersiz"
+
+#: pg_dump.c:543
+#, c-format
+msgid "compression level must be in range 0..9"
+msgstr "sıkıştırma seviyesi 0..9 aralığında olmalı"
+
+#: pg_dump.c:581
+#, c-format
+msgid "extra_float_digits must be in range -15..3"
+msgstr "extra_float_digits -15..3 aralığında olmalı"
+
+#: pg_dump.c:604
+#, c-format
+msgid "rows-per-insert must be in range %d..%d"
+msgstr "rows-per-insert %d..%d aralığında olmalı"
+
+#: pg_dump.c:627 pg_dumpall.c:346 pg_restore.c:304
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı argümanı (ilki \"%s\")"
+
+#: pg_dump.c:648 pg_restore.c:333
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "-s/--schema-only ve -a/--data-only seçenekleri aynı anda kullanılamazlar"
+
+#: pg_dump.c:654 pg_restore.c:339
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "-c/--clean ve -a/--data-only seçenekleri aynı anda kullanılamazlar"
+
+#: pg_dump.c:659 pg_dumpall.c:381 pg_restore.c:388
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "--if-exists seçeneği -c/--clean seçeneğini gerektirir"
+
+#: pg_dump.c:666
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts"
+msgstr "--on-conflict-do-nothing seçeneği --inserts, --rows-per-insert veya --column-inserts seçeneğini gerektirir"
+
+#: pg_dump.c:688
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "istenen sıkıştırma bu kurulumda desteklenmemektedir -- arşiv sıkıştırılmayacak"
+
+#: pg_dump.c:709 pg_restore.c:355
+#, c-format
+msgid "invalid number of parallel jobs"
+msgstr "geçersiz sayıda parallel iş"
+
+#: pg_dump.c:713
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "paralel yedek sadece dizin biçimi tarafından destekleniyor"
+
+#: pg_dump.c:768
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Senkronize anlık görüntüler (snapshot) bu sunucu sürümü tarafından desteklenmiyor.\n"
+"Senkronize anlık görüntülere ihtiyaç yoksa bunun yerine --no-synchronized-snapshots \n"
+"ile çalıştırın."
+
+#: pg_dump.c:774
+#, c-format
+msgid "Exported snapshots are not supported by this server version."
+msgstr "Bu sunucu sürümünde dışa aktarılmış anlık görüntü (exported snapshot) desteklenmemektedir."
+
+#: pg_dump.c:786
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "son gömülü OID : %u"
+
+#: pg_dump.c:795
+#, c-format
+msgid "no matching schemas were found"
+msgstr "uygun şema bulunamadı"
+
+#: pg_dump.c:809
+#, c-format
+msgid "no matching tables were found"
+msgstr "uygun tablo bulunamadı"
+
+#: pg_dump.c:981
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s veritabanını metin dosyası ya da diğer biçimlerde dump eder.\n"
+"\n"
+
+#: pg_dump.c:982 pg_dumpall.c:617 pg_restore.c:468
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_dump.c:983
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [SEÇENEK]... [VERİTABANI_ADI]\n"
+
+#: pg_dump.c:985 pg_dumpall.c:620 pg_restore.c:471
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"Genel seçenekler:\n"
+
+#: pg_dump.c:986
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=DOSYAADI çıktı dosya adı ya da dizin adı\n"
+
+#: pg_dump.c:987
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p çıktı dosya biçimi (c:özel, d:dizin, t:tar,\n"
+" p: düz metin (varsayılan))\n"
+"\n"
+
+#: pg_dump.c:989
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=SAYI döküm (dump) için belirtilen sayı kadar paralel süreç kullan\n"
+
+#: pg_dump.c:990 pg_dumpall.c:622
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose detaylı açıklamalı mod\n"
+
+#: pg_dump.c:991 pg_dumpall.c:623
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_dump.c:992
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 sıkıştırılmış biçimler için sıkıştırma seviyesi\n"
+
+#: pg_dump.c:993 pg_dumpall.c:624
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=ZAMANAŞIMI tablo kilitlemesi için ZAMANAŞIMI kadar bekledikten sonra hata ver\n"
+
+#: pg_dump.c:994 pg_dumpall.c:652
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" --no-sync değişikliklerin diske yazılması için bekleme\n"
+"\n"
+
+#: pg_dump.c:995 pg_dumpall.c:625
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_dump.c:997 pg_dumpall.c:626
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"Çıktı içeriğini kontrol eden seçenekler:\n"
+
+#: pg_dump.c:998 pg_dumpall.c:627
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only sadece veriyi yedekle (dump); şemayı yedekleme\n"
+
+#: pg_dump.c:999
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs yedeğin (dump) içine büyük nesneleri dahil et\n"
+
+#: pg_dump.c:1000
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs büyük nesneleri yedeğin içine dahil etme\n"
+
+#: pg_dump.c:1001 pg_restore.c:482
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean veritabanı nesnelerini yeniden oluşturmadan önce temizle (kaldır)\n"
+
+#: pg_dump.c:1002
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create yedeğin (dump) içine veritabanını oluşturacak komutları da ekle\n"
+
+#: pg_dump.c:1003 pg_dumpall.c:629
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=DİLKODLAMASI veriyi DİLKODLAMASI dil kodlamasıyla yedekle\n"
+
+#: pg_dump.c:1004
+#, c-format
+msgid " -n, --schema=SCHEMA dump the named schema(s) only\n"
+msgstr " -n, --schema=ŞEMA sadece belirtilen şema veya şemaları yedekle\n"
+
+#: pg_dump.c:1005
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do NOT dump the named schema(s)\n"
+msgstr " -N, --exclude-schema=ŞEMA bu şema veya şemaları yedekleme\n"
+
+#: pg_dump.c:1006
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr ""
+" -O, --no-owner düz metin biçiminde nesne \n"
+" sahipliğinin yüklenmesini atla\n"
+
+#: pg_dump.c:1008 pg_dumpall.c:634
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only sadece şemayı yedekle (dump), veriyi değil\n"
+
+#: pg_dump.c:1009
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=İSİM düz metin formatında kullanılacak superuser kullanıcı adı\n"
+
+#: pg_dump.c:1010
+#, c-format
+msgid " -t, --table=TABLE dump the named table(s) only\n"
+msgstr " -t, --table=TABLO sadece ismi geçen tablo veya tabloları yedekle\n"
+
+#: pg_dump.c:1011
+#, c-format
+msgid " -T, --exclude-table=TABLE do NOT dump the named table(s)\n"
+msgstr " -T, --exclude-table=TABLO ismi geçen tablo veya tabloları yedekleme\n"
+
+#: pg_dump.c:1012 pg_dumpall.c:637
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges yetkileri yedekleme (grant/revoke)\n"
+
+#: pg_dump.c:1013 pg_dumpall.c:638
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade sadece yükseltme araçlarının kullanımı için\n"
+
+#: pg_dump.c:1014 pg_dumpall.c:639
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts veriyi kolon adları ile INSERT komutları olarak yedekle\n"
+
+#: pg_dump.c:1015 pg_dumpall.c:640
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting dollar quoting kullanmayı engelle, standart SQL quoting kullan\n"
+
+#: pg_dump.c:1016 pg_dumpall.c:641 pg_restore.c:499
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers salt-veri geri yüklemesi sırasında tetikleyicileri devre dışı bırak\n"
+
+#: pg_dump.c:1017
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr ""
+" --enable-row-security satır güvenliğini etkinleştir (sadece kullanıcının erişimi\n"
+" olan içeriği yedekle)\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " --exclude-table-data=TABLE do NOT dump data for the named table(s)\n"
+msgstr " --exclude-table-data=TABLO bu tablo veya tabloları yedekleme\n"
+
+#: pg_dump.c:1020 pg_dumpall.c:643
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM extra_float_digits için varayılan ayarı geçersiz kıl\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:644 pg_restore.c:501
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists nesneleri silerken IF EXISTS kullan\n"
+
+#: pg_dump.c:1022 pg_dumpall.c:645
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr ""
+" --inserts veriyi COPY'den ziyade INSERT komutları olarak yedekle\n"
+"\n"
+
+#: pg_dump.c:1023 pg_dumpall.c:646
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root bölümleri (partition) kök tablo üzerinden yükle\n"
+
+#: pg_dump.c:1024 pg_dumpall.c:647
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr ""
+" --no-comments açıklamaları (comments) yedekleme\n"
+"\n"
+
+#: pg_dump.c:1025 pg_dumpall.c:648
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications yayınları yedekleme\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:650
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels güvenlik etiketi atamalarını yedekleme\n"
+
+#: pg_dump.c:1027 pg_dumpall.c:651
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions abonelikleri yedekleme\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots paralel işlerde senkronize anlık görüntüleri yedekleme\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:653
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces tablespace atamalarını yedekleme\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:654
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data loglanmayan tablo verisini yedekleme\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:655
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing INSERT komutlarına ON CONFLICT DO NOTHING ekle\n"
+
+#: pg_dump.c:1032 pg_dumpall.c:656
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers anahtar sözcükler olmasa bile tüm belirteçleri çift tırnak içine al\n"
+
+#: pg_dump.c:1033
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS INSERT başına satır sayısı; --inserts seçeneğiyle kullanılır\n"
+
+#: pg_dump.c:1034
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=BÖLÜM belirtilen bölümü yedekle (pre-data, data, veya post-data)\n"
+
+#: pg_dump.c:1035
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable yedeÄŸin bir anormallik olmadan biteceÄŸi ana kadar bekle\n"
+
+#: pg_dump.c:1036
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT yedek için verilen anlık görüntüyü (snapshot) kullan\n"
+
+#: pg_dump.c:1037 pg_restore.c:510
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names tablo ve/veya şema her biri en az bir varlıkla (entity)\n"
+" eşleşecek desenler (pattern) bulundurmalıdır\n"
+
+#: pg_dump.c:1039 pg_dumpall.c:657 pg_restore.c:512
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" Sahipliği ayarlamak için ALTER OWNER komutları yerine\n"
+" SET SESSION AUTHORIZATION komutlarını kullan\n"
+
+#: pg_dump.c:1043 pg_dumpall.c:661 pg_restore.c:516
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Bağlantı Seçenekleri:\n"
+
+#: pg_dump.c:1044
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=VERİTABANI_ADI yedeklenecek veritabanı adı\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:663 pg_restore.c:517
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: pg_dump.c:1046 pg_dumpall.c:665 pg_restore.c:518
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p PORT veritabanı sunucusunun port numarası\n"
+
+#: pg_dump.c:1047 pg_dumpall.c:666 pg_restore.c:519
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: pg_dump.c:1048 pg_dumpall.c:667 pg_restore.c:520
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password bağlanmak için kesinlikle parola sorma\n"
+
+#: pg_dump.c:1049 pg_dumpall.c:668 pg_restore.c:521
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W şifre sor (otomatik olarak her zaman açık)\n"
+
+#: pg_dump.c:1050 pg_dumpall.c:669
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROL ADI yedek işleminden önce SET ROLE çalıştır\n"
+
+#: pg_dump.c:1052
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Veritabanı adı verilmemişse PGDATABASE çevre değişkeni\n"
+"kullanılacaktır.\n"
+"\n"
+
+#: pg_dump.c:1054 pg_dumpall.c:673 pg_restore.c:528
+#, c-format
+msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr "Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirin.\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:499
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "belirtilen \"%s\" istemci dil kodlaması geçersiz"
+
+#: pg_dump.c:1218
+#, c-format
+msgid ""
+"Synchronized snapshots on standby servers are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"Yedek (standby) sunucularda anlık görüntüler (snapshot) bu sunucu sürümünde desteklenmiyor.\n"
+"Senkronize anlık görüntülere ihtiyaç yoksa bunun yerine --no-synchronized-snapshots\n"
+"ile çalıştırın."
+
+#: pg_dump.c:1287
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "geçersiz çıktı biçimi \"%s\" belirtildi"
+
+#: pg_dump.c:1325
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "\"%s\" şablonu (pattern) için eşleşen şema bulunamadı"
+
+#: pg_dump.c:1390
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "\"%s\" şablonu (pattern) için eşleşen tablo bulunamadı"
+
+#: pg_dump.c:1804
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun içeriği yedekleniyor"
+
+#: pg_dump.c:1905
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "\"%s\" tablosunu içeriğinin yedeklenmesi başarısız: PQgetCopyData() başarısız."
+
+#: pg_dump.c:1906 pg_dump.c:1916
+#, c-format
+msgid "Error message from server: %s"
+msgstr "Sunucudan hata mesajı alındı: %s"
+
+#: pg_dump.c:1907 pg_dump.c:1917
+#, c-format
+msgid "The command was: %s"
+msgstr "O sırada yürütülen komut: %s"
+
+#: pg_dump.c:1915
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "\"%s\" tablosunun içeriğinin yedeklenmesi başarısız: PQgetResult() başarısız."
+
+#: pg_dump.c:2669
+#, c-format
+msgid "saving database definition"
+msgstr "veritabanın tanımı kaydediliyor"
+
+#: pg_dump.c:3116
+#, c-format
+msgid "saving encoding = %s"
+msgstr "dil kodlaması kaydediliyor = %s"
+
+#: pg_dump.c:3143
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "standard_conforming_strings kaydediliyor = %s "
+
+#: pg_dump.c:3184
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "current_schemas() sonucu ayrıştırılamadı"
+
+#: pg_dump.c:3203
+#, c-format
+msgid "saving search_path = %s"
+msgstr "search_path = %s olarak kaydediliyor"
+
+#: pg_dump.c:3245
+#, c-format
+msgid "reading large objects"
+msgstr "large object'ler okunuyor"
+
+#: pg_dump.c:3427
+#, c-format
+msgid "saving large objects"
+msgstr "large object'ler kaydediliyor"
+
+#: pg_dump.c:3473
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "%u large object okurken hata oldu: %s"
+
+#: pg_dump.c:3525
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için etkinleştirilen satır güvenliği (row security) okunuyor"
+
+#: pg_dump.c:3556
+#, c-format
+msgid "reading policies for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için ilkeler (policy) okunuyor"
+
+#: pg_dump.c:3707
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "beklenmeyen ilke (policy) komut türü: %c"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "owner of publication \"%s\" appears to be invalid"
+msgstr "\"%s\" fonksiyonunun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:3971
+#, c-format
+msgid "reading publication membership for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun yayın (publication) üyeliği okunuyor"
+
+#: pg_dump.c:4116
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "abonelikler yedeklenmedi çünkü geçerli kullanıcı superuser değil"
+
+#: pg_dump.c:4170
+#, c-format
+msgid "owner of subscription \"%s\" appears to be invalid"
+msgstr "\"%s\" aboneliğinin sahibi geçersiz görünüyor"
+
+#: pg_dump.c:4214
+#, c-format
+msgid "could not parse subpublications array"
+msgstr "alt-yayınlar dizisi ayrıştırılamadı"
+
+#: pg_dump.c:4486
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "%s için üst uzantı bulunamadı %s"
+
+#: pg_dump.c:4618
+#, c-format
+msgid "owner of schema \"%s\" appears to be invalid"
+msgstr "\"%s\" şemasının sahibi geçersiz görünüyor"
+
+#: pg_dump.c:4641
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "%u OID'li ÅŸema mevcut deÄŸil"
+
+#: pg_dump.c:4966
+#, c-format
+msgid "owner of data type \"%s\" appears to be invalid"
+msgstr "\"%s\" veri tipinin sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5051
+#, c-format
+msgid "owner of operator \"%s\" appears to be invalid"
+msgstr "\"%s\" operatörünün sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5353
+#, c-format
+msgid "owner of operator class \"%s\" appears to be invalid"
+msgstr "\"%s\" operatör sınıfının sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5437
+#, c-format
+msgid "owner of operator family \"%s\" appears to be invalid"
+msgstr "\"%s\" operatör ailesinin sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5606
+#, c-format
+msgid "owner of aggregate function \"%s\" appears to be invalid"
+msgstr "\"%s\" aggregate fonksiyonun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:5866
+#, c-format
+msgid "owner of function \"%s\" appears to be invalid"
+msgstr "\"%s\" fonksiyonunun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:6662
+#, c-format
+msgid "owner of table \"%s\" appears to be invalid"
+msgstr "\"%s\" tablosunun sahibi geçersiz görünüyor"
+
+#: pg_dump.c:6704 pg_dump.c:17053
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "tutarlılık kontrolü başarısız, %2$u OID'li dizinin (sequence) %1$u OID'li üst tablosu bulunamadı"
+
+#: pg_dump.c:6848
+#, c-format
+msgid "reading indexes for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun indeksleri okunuyor"
+
+#: pg_dump.c:7249
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun foreign key bütünlük kısıtlamaları okunuyor"
+
+#: pg_dump.c:7468
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "tutarlılık kontrolü başarısız, %2$u OID'li pg_rewrite girdisinin %1$u OID'li üst tablosu bulunamadı"
+
+#: pg_dump.c:7551
+#, c-format
+msgid "reading triggers for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun tetikleyicileri okunuyor"
+
+#: pg_dump.c:7684
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "sorgu, \"%2$s\" tablosu (tablo OID: %3$u) üzerindeki \"%1$s\" foreign key tetikleyici için null referans edilen tablo adı getirdi"
+
+#: pg_dump.c:8239
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\""
+msgstr "\"%s.%s\" tablosunun sütunları ve tipleri bulunuyor"
+
+#: pg_dump.c:8375
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "\"%s\" tablosunda geçersiz sütun numaralandırması"
+
+#: pg_dump.c:8412
+#, c-format
+msgid "finding default expressions of table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için varsayılan ifadeler bulunuyor"
+
+#: pg_dump.c:8434
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "\"%2$s\" tablosu için geçersiz adnum değeri %1$d"
+
+#: pg_dump.c:8499
+#, c-format
+msgid "finding check constraints for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için kontrol kısıtlamaları bulunuyor"
+
+#: pg_dump.c:8548
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "%d check kısıtlamasının \"%s\" tablosunda bulunması beklendi; ancak %d bulundu"
+msgstr[1] "%d check kısıtlamasının \"%s\" tablosunda bulunması beklendi; ancak %d bulundu"
+
+#: pg_dump.c:8552
+#, c-format
+msgid "(The system catalogs might be corrupted.)"
+msgstr "(Sistem kataloÄŸu bozulmuÅŸ olabilir.)"
+
+#: pg_dump.c:10140
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "\"%s\" veri tipinin typtype'i geçersiz görünüyor"
+
+#: pg_dump.c:11496
+#, c-format
+msgid "bogus value in proargmodes array"
+msgstr "proargnames dizisi içinde belirsiz değer"
+
+#: pg_dump.c:11868
+#, c-format
+msgid "could not parse proallargtypes array"
+msgstr "proallargtypes dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11884
+#, c-format
+msgid "could not parse proargmodes array"
+msgstr "proargmodes dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11898
+#, c-format
+msgid "could not parse proargnames array"
+msgstr "proargnames dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11909
+#, c-format
+msgid "could not parse proconfig array"
+msgstr "proconfig dizisi ayrıştırılamadı"
+
+#: pg_dump.c:11989
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "\"%s\" fonksiyonu için bilinmeyen provolatile değeri"
+
+#: pg_dump.c:12039 pg_dump.c:14094
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "unrecognized proparallel value for function \"%s\""
+
+#: pg_dump.c:12172 pg_dump.c:12282 pg_dump.c:12289
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "%u OID'li fonksiyon için fonksiyon tanımı bulunamadı"
+
+#: pg_dump.c:12211
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc veya pg_cast.castmethod field alanı içinde belirsiz değer"
+
+#: pg_dump.c:12214
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod field alanı içinde belirsiz değer"
+
+#: pg_dump.c:12308
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "belirsiz dönüşüm tanımı, trffromsql ve trftosql'in en azından biri sıfırdan farklı olmalı"
+
+#: pg_dump.c:12325
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql alanı içinde belirsiz değer"
+
+#: pg_dump.c:12346
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql alanı içinde belirsiz değer"
+
+#: pg_dump.c:12663
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "%s OID'li olan operatör bulunamadı"
+
+#: pg_dump.c:12731
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "\"%2$s\" erişim yöntemi için geçersiz tip \"%1$c\""
+
+#: pg_dump.c:13486
+#, c-format
+msgid "unrecognized collation provider: %s\n"
+msgstr "bilinmeyen karşılaştırma (collation) sağlayıcısı: %s\n"
+
+#: pg_dump.c:13958
+#, c-format
+msgid "aggregate function %s could not be dumped correctly for this database version; ignored"
+msgstr "%s aggregate fonksiyonu veritabanının bu sürümünde düzgün dump edilemiyor; atlanıyor"
+
+#: pg_dump.c:14013
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" toplamı (aggregate) için tanınmayan aggfinalmodify değeri"
+
+#: pg_dump.c:14069
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "\"%s\" toplamı (aggregate) için tanınmayan aggmfinalmodify değeri"
+
+#: pg_dump.c:14793
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "öntanımlı yetkilerde bilinmeyen nesne tipi: %d"
+
+#: pg_dump.c:14811
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "öntanımlı ACL listesi ayrıştırılamıyor (%s)"
+
+#: pg_dump.c:14892
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "\"%3$s\" nesnesinin ilk GRANT ACL listesi (%1$s) veya ilk REVOKE ACL listesi (%2$s) ayrıştırılamıyor (%4$s)"
+
+#: pg_dump.c:14900
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "\"%3$s\" nesnesinin GRANT ACL listesi (%1$s) veya REVOKE ACL listesi (%2$s) ayrıştırılamıyor (%4$s)"
+
+#: pg_dump.c:15402
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "\"%s\" view tanımını getirecek sorgu hiçbir veri getirmedi"
+
+#: pg_dump.c:15405
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "\"%s\" view tanımını getirecek sorgu birden çok tanım getirdi"
+
+#: pg_dump.c:15412
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "\"%s\" view tanımı boş görünüyor (uzunluğu sıfır)"
+
+#: pg_dump.c:15494
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS artık desteklenmiyor (\"%s\" tablosu)"
+
+#: pg_dump.c:15945
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "\"%2$s\" tablosu için geçersiz üst nesne sayısı %1$d"
+
+#: pg_dump.c:16282
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "\"%2$s\" tablosu için geçersiz sütun sayısı %1$d"
+
+#: pg_dump.c:16546
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "\"%s\" bütünlük kısıtlamasının indeksi eksik"
+
+#: pg_dump.c:16766
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "bilinmeyen bütünlük kısıtlama türü: %c"
+
+#: pg_dump.c:16898 pg_dump.c:17119
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "\"%s\" sequence verisini getirecek sorgu %d satır döndürdü (bir satır bekleniyordu)"
+msgstr[1] "\"%s\" sequence verisini getirecek sorgu %d satır döndürdü (bir satır bekleniyordu)"
+
+#: pg_dump.c:16932
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "tanınmayan sequence tipi \"%s\""
+
+#: pg_dump.c:17216
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "beklenmeyen tgtype deÄŸeri: %d"
+
+#: pg_dump.c:17290
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "\"%3$s\" tablosunun \"%2$s\" tetikleyicisi için geçersiz argüman dizesi (%1$s)"
+
+#: pg_dump.c:17519
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "\"%s\" tablosundan \"%s\" rule'unu getiren sorgu başarısız: dönen satır sayısı yanlış"
+
+#: pg_dump.c:17681
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "referans verilen uzantı bulunamadı %u"
+
+#: pg_dump.c:17893
+#, c-format
+msgid "reading dependency data"
+msgstr "bağımlılık verileri okunuyor"
+
+#: pg_dump.c:17948
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "referans veren nesne yok %u %u"
+
+#: pg_dump.c:17959
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "referans verilen nesne yok %u %u"
+
+#: pg_dump.c:18327
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions dizisi (array) ayrıştırılamadı"
+
+#: pg_dump_sort.c:328
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "geçersiz dumpId %d"
+
+#: pg_dump_sort.c:334
+#, c-format
+msgid "invalid dependency %d"
+msgstr "geçersiz bağımlılık %d"
+
+#: pg_dump_sort.c:567
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "bağımlılık döngüsü tespit edilemedi"
+
+#: pg_dump_sort.c:1130
+#, 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] "DİKKAT: Bu tablo üzerinde dairesel (circular) foreign-key kısıtlamaları bulunmaktadır:"
+msgstr[1] "DİKKAT: Bu tablolar arasında dairesel (circular) foreign-key kısıtlamaları bulunmaktadır:"
+
+#: pg_dump_sort.c:1134 pg_dump_sort.c:1154
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1135
+#, c-format
+msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints."
+msgstr "--disable-triggers kullanmadan veya kısıtlamaları (constraint) geçici olarak kaldırmadan yedeği (dump) geri yükleyemebilirsiniz."
+
+#: pg_dump_sort.c:1136
+#, c-format
+msgid "Consider using a full dump instead of a --data-only dump to avoid this problem."
+msgstr "Bu sorunla karşılaşmamak için --data-only yedek yerine tam yedek (full dump) almayı düşünün."
+
+#: pg_dump_sort.c:1148
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "bu öğeler arasındaki bağımlılık döngüsü çözülemedi"
+
+#: pg_dumpall.c:200
+#, c-format
+msgid ""
+"The program \"pg_dump\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"\"pg_dump\" uygulaması %s için gerekmektedir ancak\n"
+"\"%s\" ile aynı dizinde bulunamadı.\n"
+"Kurulumunuzu kontrol edin."
+
+#: pg_dumpall.c:205
+#, c-format
+msgid ""
+"The program \"pg_dump\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"\"pg_dump\" uygulaması \"%s\" tarafından bulundu\n"
+"ancak %s ile aynı sürüm değildir.\n"
+"Kurulumunuzu kontrol edin."
+
+#: pg_dumpall.c:356
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only or -t/--tablespaces-only"
+msgstr "--exclude-database seçeneği -g/--globals-only, -r/--roles-only veya -t/--tablespaces-only ile birlikte kullanılamaz"
+
+#: pg_dumpall.c:365
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "-g/--globals-only ve -r/--roles-only seçenekleri beraber kullanılamaz"
+
+#: pg_dumpall.c:373
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "-g/--globals-only ve -t/--tablespaces-only seçenekleri beraber kullanılamaz"
+
+#: pg_dumpall.c:387
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "-r/--roles-only ve -t/--tablespaces-only seçenekleri birlikte kullanılamaz"
+
+#: pg_dumpall.c:448 pg_dumpall.c:1734
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "\"%s\" veritabanına bağlanılamadı"
+
+#: pg_dumpall.c:462
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"\"postgres\" veya \"template1\" veritabanına bağlanılamadı\n"
+"Lütfen alternatif bir veritabanı belirtin"
+
+#: pg_dumpall.c:484
+#, c-format
+msgid "could not open the output file \"%s\": %m"
+msgstr "\"%s\" çıktı dosyası açılamadı: %m"
+
+#: pg_dumpall.c:616
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s, PostgreSQL veritabanı clusteri SQL betik dosyasına aktarıyor.\n"
+"\n"
+
+#: pg_dumpall.c:618
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [SEÇENEK]...\n"
+
+#: pg_dumpall.c:621
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=DOSYA_ADI çıktı dosya adı\n"
+
+#: pg_dumpall.c:628
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean yeniden oluşturmadan önce veritabanlarını temizle (drop)\n"
+
+#: pg_dumpall.c:630
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only Sadece global nesneleri yedekle, veritabanlarını yedekleme\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " -o, --oids include OIDs in dump\n"
+msgstr " -o, --oids yedeğin içine OID'leri de ekle\n"
+
+#: pg_dumpall.c:632 pg_restore.c:491
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner veri sahipliği ile ilgili bilgileri geri yükleme\n"
+
+#: pg_dumpall.c:633
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only sadece rolleri yedekle, veritabanlarını ya da tablespace'leri değil\n"
+
+#: pg_dumpall.c:635
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=AD yedeklerde kullanılacak superuser kullanıcı adı\n"
+
+#: pg_dumpall.c:636
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only sadece tablespaceleri yedekle, veritabanlarını ya da rolleri değil\n"
+
+#: pg_dumpall.c:642
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=DESEN isimleri DESEN ile eşleşen veritabanlarını hariç tut\n"
+
+#: pg_dumpall.c:649
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " -W, --password rollerin parolalarını yedekleme\n"
+
+#: pg_dumpall.c:662
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR bağlantı cümleciğini kullanarak bağlan\n"
+
+#: pg_dumpall.c:664
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=VERİTABANI ADI varsayılan alternatif veritabanı\n"
+
+#: pg_dumpall.c:671
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer -f/--file kullanılmazsa, SQL betiği standart çıktıya\n"
+"yazılacaktır.\n"
+"\n"
+
+#: pg_dumpall.c:876
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "\"pg_\" ile başlayan rol adı atlandı (%s)"
+
+#: pg_dumpall.c:1258
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "\"%2$s\" tablespace için ACL (%1$s) listesi ayrıştırılamadı"
+
+#: pg_dumpall.c:1475
+#, c-format
+msgid "excluding database \"%s\"..."
+msgstr "\"%s\" veritabanı hariç tutuluyor..."
+
+#: pg_dumpall.c:1479
+#, c-format
+msgid "dumping database \"%s\"..."
+msgstr "\"%s\" veritabanı dökümü alınıyor(dump)..."
+
+#: pg_dumpall.c:1511
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump \"%s\" veritabanında başarısız oldu, çıkılıyor"
+
+#: pg_dumpall.c:1520
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "\"%s\" çıktı dosyası yeniden açılamadı: %m"
+
+#: pg_dumpall.c:1564
+#, c-format
+msgid "running \"%s\""
+msgstr "\"%s\" yürütülüyor"
+
+#: pg_dumpall.c:1755
+#, c-format
+msgid "could not connect to database \"%s\": %s"
+msgstr "\"%s\" veritabanına bağlanılamadı: %s"
+
+#: pg_dumpall.c:1785
+#, c-format
+msgid "could not get server version"
+msgstr "sunucu sürüm bilgisi alınamadı"
+
+#: pg_dumpall.c:1791
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "\"%s\" sürüm bilgisi ayrıştırılamadı"
+
+#: pg_dumpall.c:1863 pg_dumpall.c:1886
+#, c-format
+msgid "executing %s"
+msgstr "çalıştırılıyor: %s"
+
+#: pg_restore.c:314
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "-d/--dbname ve -f/--file seçeneklerinden biri belirtilmeli"
+
+#: pg_restore.c:323
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "-d/--dbname ve -f/--file seçenekleri birlikte kullanılamaz"
+
+#: pg_restore.c:349
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "-C/--create ve -1/--single-transaction seçenekleri birlikte kullanılamaz"
+
+#: pg_restore.c:363
+#, c-format
+msgid "maximum number of parallel jobs is %d"
+msgstr "azami paralel iş sayısı %d"
+
+#: pg_restore.c:372
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "hem --single-transaction hem de çoklu iş (multiple jobs) aynı anda belirtilemez"
+
+#: pg_restore.c:414
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "tanımlanamayan arşiv formatı \"%s\"; lütfen \"c\", \"d\", ya da \"t\" seçeneğini belirtin"
+
+#: pg_restore.c:454
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "geri yükleme sırasında es geçilen hatalar: %d"
+
+#: pg_restore.c:467
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s, pg_dump tarafından oluşturulan PostgreSQL arşivinden veritabanı geri yükleniyor.\n"
+"\n"
+
+#: pg_restore.c:469
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [SEÇENEK]... [DOSYA]\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME bağlanacak veritabanının adı\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=DOSYA_ADI çıktı dosya adı (stdout için -)\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t yedek dosya biçimi (otomatik olmalı)\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list arşivin kısa içeriğini yaz\n"
+
+#: pg_restore.c:476
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose verbose modu\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"Geri güklemeyi kontrol eden seçenekler:\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only sadece veriyi geri yükle, şemaları değil\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create hedef veritabanını oluştur\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error hata durumunda çık, varsayılan seçenek ise devam et\n"
+
+#: pg_restore.c:485
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=AD adı geçen indeksi geri yükle\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=SAYI geri yükleme için belirtilen sayı kadar paralel süreç kullan\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=DOSYAADI çıktıyı seçmek/sıralamak için\n"
+" bu dosyadaki içindekiler tablosunu kullan\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=AD sadece bu şemaya ait nesneleri geri yükle\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=AD bu şemadaki nesneleri geri yükleme\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) adı geçen fonksiyonu geri yükle\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only sadece şemayı geri yükle, veriyi değil\n"
+
+#: pg_restore.c:494
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=AD tetikleyicileri (trigger) devre dışı bırakmak için kullanılacak superuser kullanıcı adı\n"
+
+#: pg_restore.c:495
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=AD adı geçen nesneyi (tablo, görünüm, vb.) geri yükle\n"
+
+#: pg_restore.c:496
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=AD adı geçen tetikleyiciyi geri yükle\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges erişim haklarının geri yüklemesini atla (grant/revoke)\n"
+
+#: pg_restore.c:498
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction tek bir transaction olarak geri yükle\n"
+
+#: pg_restore.c:500
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security satır güvenliğini etkinleştir\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments açıklamaları (comments) yedekleme\n"
+
+#: pg_restore.c:503
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables oluşturulamayan tabloların verilerini geri\n"
+" yükleme\n"
+
+#: pg_restore.c:505
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications yayınları geri yükleme\n"
+
+#: pg_restore.c:506
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels güvenlik etiketlerini geri yükleme\n"
+
+#: pg_restore.c:507
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions abonelikleri geri yükleme\n"
+
+#: pg_restore.c:508
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces tablespace atamalarını geri yükleme\n"
+
+#: pg_restore.c:509
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=BÖLÜM belirtilen bölümü yedekle (pre-data, data, veya post-data)\n"
+
+#: pg_restore.c:522
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROL ADI geri yüklemeden önce SET ROLE işlemini gerçekleştir\n"
+
+#: pg_restore.c:524
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"-I, -n, -N, -P, -t, -T, ve --section seçenekleri, çoklu nesnelerin seçilmesi için\n"
+"birden fazla kez kullanılabilir ve belirtilebilir\n"
+"\n"
+
+#: pg_restore.c:527
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Eğer giriş dosya adı verilmemişse, standart giriş akımı (stdin) kulanılacaktır.\n"
+"\n"
+
+#~ msgid "reading extended statistics for table \"%s.%s\"\n"
+#~ msgstr "\"%s.%s\" tablosunun geniÅŸletilmiÅŸ istatistikleri okunuyor\n"
+
+#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n"
+#~ msgstr "%1$s: \"%3$s\" veritabanı için ACL (%2$s) listesi ayrıştırılamadı\n"
+
+#~ msgid "Got %d rows instead of one from: %s"
+#~ msgstr "%2$s sorgusundan bir yerine %1$d satır alındı"
+
+#~ msgid "No rows found for enum"
+#~ msgstr "Enum için veri bulunamadı"
+
+#~ msgid "INSERT (-d, -D) and OID (-o) options cannot be used together\n"
+#~ msgstr "INSERT (-d, -D) ve OID (-o)seçenekleri beraber kullanılamaz\n"
+
+#~ msgid ""
+#~ " --disable-dollar-quoting\n"
+#~ " disable dollar quoting, use SQL standard quoting\n"
+#~ msgstr ""
+#~ " --disable-dollar-quoting\n"
+#~ " dollar quoting kullanmayı engelle, standart SQL quoting kullan\n"
+
+#~ msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+#~ msgstr " -x, --no-privileges yetkileri aktarmayı engelle (grant/revoke)\n"
+
+#~ msgid " -s, --schema-only dump only the schema, no data\n"
+#~ msgstr " -s, --schema-only sadece şemayı dump et, veriyi etme\n"
+
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids dump içinde OIDleri de içer\n"
+
+#~ msgid " -D, --column-inserts dump data as INSERT commands with column names\n"
+#~ msgstr " -D, --column-inserts veriyi kolon adları ile insert komutu olarak dump et.\n"
+
+#~ msgid " -d, --inserts dump data as INSERT, rather than COPY, commands\n"
+#~ msgstr " -d, --inserts verileri COPYkomutları yerine INSERT olarak dump et\n"
+
+#~ msgid " -a, --data-only dump only the data, not the schema\n"
+#~ msgstr " -a, --data-only sadece veriyi dump eder, şemayı etmez\n"
+
+#~ msgid ""
+#~ " -i, --ignore-version proceed even when server version mismatches\n"
+#~ " pg_dumpall version\n"
+#~ msgstr ""
+#~ " -i, --ignore-version sunucunun sürümü uyuşmadığı durumda\n"
+#~ " bile devam et\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SESSION AUTHORIZATION commands instead of\n"
+#~ " OWNER TO commands\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " OWNER TO komutun yerine\n"
+#~ " SESSION AUTHORIZATION komutunu kullan\n"
+
+#~ msgid " -c, --clean clean (drop) schema prior to create\n"
+#~ msgstr " -c, --clean şemayı yaratmadan önce onu temizle (kaldır)\n"
+
+#~ msgid " -i, --ignore-version proceed even when server version mismatches\n"
+#~ msgstr " -i, --ignore-version sunucunun sürümü uyuşmadığında bile devam et\n"
+
+#~ msgid "%s: no result from server\n"
+#~ msgstr "%s: sunucudan sonuç gelmedi\n"
+
+#~ msgid "aborting because of version mismatch (Use the -i option to proceed anyway.)\n"
+#~ msgstr "sürüm uyuşmazlığı yüzünden işlem duruduruldu (Buna rağmen devam etmek için -i seçeneği kullanın).\n"
+
+#~ msgid "archive format is %d\n"
+#~ msgstr "%d arşiv biçimi\n"
+
+#~ msgid "expected %d triggers on table \"%s\" but found %d\n"
+#~ msgstr "\"%2$s\" tablosu zerinde %1$d tetikleyici beklenirken %3$d bulundu\n"
+
+#~ msgid ""
+#~ " -S, --superuser=NAME specify the superuser user name to use in\n"
+#~ " plain text format\n"
+#~ msgstr ""
+#~ " -S, --superuser=NAME düz metin biçiminde kullanılacak superuser\n"
+#~ " kullanıcısının adı\n"
+
+#~ msgid " -c, --clean clean (drop) schema prior to create\n"
+#~ msgstr " -c, --clean şemayı oluşturmadan önce onu temizle (kaldır)\n"
+
+#~ msgid ""
+#~ " -i, --ignore-version proceed even when server version mismatches\n"
+#~ " pg_dump version\n"
+#~ msgstr ""
+#~ " -i, --ignore-version sunucunun sürümü ile pg_dump'ın sürümü eşleşmezse\n"
+#~ " bile devam et\n"
+
+#~ msgid "User name: "
+#~ msgstr "Kullanıcı adı: "
+
+#~ msgid "requested %d byte, got %d from lookahead and %d from file\n"
+#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n"
+#~ msgstr[0] "%d bayt istenildi, lookahead'denn %d, dosyadan ise %d alındı\n"
+#~ msgstr[1] "%d bayt istenildi, lookahead'denn %d, dosyadan ise %d alındı\n"
+
+#~ msgid "read %lu byte into lookahead buffer\n"
+#~ msgid_plural "read %lu bytes into lookahead buffer\n"
+#~ msgstr[0] "lookahead artalanına %lu bayt okundu\n"
+#~ msgstr[1] "lookahead artalanına %lu bayt okundu\n"
+
+#~ msgid "query returned %d rows instead of one: %s\n"
+#~ msgstr "sorgu bir yerine %d satır döndirdi: %s\n"
+
+#~ msgid "compression support is disabled in this format\n"
+#~ msgstr "bu formatta sıkıştırma desteği devre dışı bırakılmıştır\n"
+
+#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n"
+#~ msgstr "sıra dışı TOC veri blokun aktarılması, giriş akımında ID olmadan desteklenmemektedir (fseek() gerekir)\n"
+
+#~ msgid "no label definitions found for enum ID %u\n"
+#~ msgstr "%u enum ID'si için etiket tanımları bulunamadı \n"
+
+#~ msgid "saving large object comments\n"
+#~ msgstr "large object açıklamaları kaydediliyor\n"
+
+#~ msgid "dumpBlobs(): could not open large object: %s"
+#~ msgstr "dumpBlobs(): large object açılamadı: %s"
+
+#~ msgid "cannot reopen non-seekable file\n"
+#~ msgstr "aranamayan dosya yeniden açılamadı\n"
+
+#~ msgid "cannot reopen stdin\n"
+#~ msgstr "stdin açılamıyor\n"
+
+#~ msgid "query returned no rows: %s\n"
+#~ msgstr "sorgu hiçbir satır döndürmedi: %s\n"
+
+#~ msgid "%s: invalid -X option -- %s\n"
+#~ msgstr "%s: geçersiz -X seçeneği -- %s\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: \"%s\" sürüm bilgisi ayrıştırılamadı\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: yetersiz bellek\n"
+
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " Sahipliği ayarlamak için ALTER OWNER komutunun yerine\n"
+#~ " SET SESSION AUTHORIZATION komutunu kullan\n"
+
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr " --disable-triggers sadece veri geri yüklemede tetikleyicileri devre dışı bırak\n"
+
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner nesne sahipliğini ayarlayan komutlarının oluşturmasını engelle\n"
+
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr " -c, --clean veritabanı nesnelerini yeniden yaratmadan önce onları kaldır (sil)\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini gösterir ve çıkar\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı gösterir ve çıkar\n"
+
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "gerçek ile beklenilen dosya pozisyonunda uyumsuzluk (%s ile %s)\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "tar öğesinin arkasına doldurma alanı eklenemedi\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "tar biçimi için arşiv öğesi çok büyük\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "arşivin sonunda null blok yazılamadı\n"
+
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "large-object %u geri yükleniyor\n"
+
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr "geçersiz COPY komutu -- \"%s\" satırında %lu pozisyonunda \"from stdin\" bulunamadı\n"
+
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "geçersiz COPY komutu -- \"%s\" satırında \"copy\" bulunamadı\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "large object dosyası kapatılamadı\n"
+
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr "çıktı için large object TOC açılamadı: %s\n"
+
+#~ msgid "could not write byte\n"
+#~ msgstr "byte yazılamadı\n"
+
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr "girdi için large object TOC açılamadı: %s\n"
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "veri dosyası okunduktan sonra kapatılamadı\n"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "UYARI:\n"
+#~ " Bu biçim sadece demo amaçlıdır. Normal kullanım için\n"
+#~ " denenmemelidir. Dosyalar mecvut çalışma dizinine yazılacaktır.\n"
+
+#~ msgid "file archiver"
+#~ msgstr "dosya arÅŸivleyicisi"
+
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "bayt yazılamadı: %s\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "bitmiş sürecin yuvasu bulunamadı\n"
+
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "işçi threadi yaratılamadı: %s\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore dönmemeli\n"
+
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "worker sürecii çöktü: Durum %d\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "kullanıcı tanımlı çıktı yordamına yazma hatası\n"
+
+#~ msgid "setting owner and privileges for %s %s\n"
+#~ msgstr "%s %s için sahiplik ve izinler ayarlanıyor\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C ve -c seçenekler bir arada kullanılamaz\n"
+
+#~ msgid "cannot duplicate null pointer\n"
+#~ msgstr "null pointer dump edilemez\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "SQL komutu başarısız\n"
+
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr "\"%s\" sequence verisini getirecek sorgu \"%s\" adını getirdi\n"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "pg_class içinde pg_indexes için birden çok kayıt bulundu\n"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "pg_class içinde pg_indexes için kayıt bulunamadı\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "bu veritabanı için birden fazla pg_database kaydı bulundu\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "bu veritabanı için pg_database kaydı bulunamadı\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): pg_largeobject_metadata.relfrozenxid bulunamadı\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): pg_largeobject.relfrozenxid bulunamadı\n"
+
+#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr "Sorgu, birden fazla (%d) sonucu \"%s\" veritabanının pg_database kaydı için döndürdü\n"
+
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "\"%s\" veritabanı için pg_database kaydı bulunamadı\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr "şema seçim anahtarlarını kullanmak için sunucu sürümü 7.3 ya da daha yüksek olmalıdır\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** hata nedeniyle durduruldu\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini ver ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve sonra çık\n"
+
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "\"%s\" sürüm bilgisi ayrıştırılamadı\n"
+
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "\"%s\" çıktı dosyası yazmak için açılamadı\n"
+
+#~ msgid "%s: invalid number of parallel jobs\n"
+#~ msgstr "%s: parallel iş sayısı geçersiz\n"
+
+#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: -c/--clean ve -a/--data-only seçenekleri aynı anda kullanılamaz\n"
+
+#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n"
+#~ msgstr "%s: -s/--schema-only ve -a/--data-only seçenekleri aynı anda kullanılamaz\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: sorgu ÅŸu idi: %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: sorgu başarısız oldu: %s"
+
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: %s yürütülüyor\n"
+
+#~ msgid "%s: invalid client encoding \"%s\" specified\n"
+#~ msgstr "%s: belirtilen \"%s\" istemci dil kodlaması geçersiz\n"
+
+#~ msgid "%s: option --if-exists requires option -c/--clean\n"
+#~ msgstr "%s: --if-exists seçeneği -c/--clean seçeneğini gerektirir\n"
+
+#~ msgid "sorter"
+#~ msgstr "sorter"
+
+#~ msgid "WARNING: could not parse reloptions array\n"
+#~ msgstr "UYARI: reloptions dizisi ayrıştırılamadı\n"
+
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "OID %u olan ÅŸema mevcut deÄŸil\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(INSERT komutu OIDleri ayarlayamaz.)\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "--inserts/--column-inserts ve -o/--oids beraber kullanılamazlar\n"
+
+#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n"
+#~ msgstr "%2$s adresinde %1$s TOC GiriÅŸi (uzunluk %3$s, checksum %4$d)\n"
+
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "%s tar öğesi atlandı\n"
+
+#~ msgid "now at file position %s\n"
+#~ msgstr "şu an dosyanın %s yerinde\n"
+
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "dosya içerisinde %s yerinden bir sonraki %s yerine geçiş yapılamıyor\n"
+
+#~ msgid "tar archiver"
+#~ msgstr "tar archiver"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini oluşturulamadı: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini okunamıyor: %s\n"
+
+#~ msgid "directory archiver"
+#~ msgstr "directory archiver"
+
+#~ msgid "COPY failed for table \"%s\": %s"
+#~ msgstr "COPY \"%s\" tablosu için başarısız oldu: %s"
+
+#~ msgid "%s: %s Command was: %s\n"
+#~ msgstr ""
+#~ "%s: %s Komut ÅŸuydu: %s\n"
+#~ "\n"
+
+#~ msgid "archiver (db)"
+#~ msgstr "archiver (db)"
+
+#~ msgid "custom archiver"
+#~ msgstr "custom archiver"
+
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "%d için bağımlılıklar azaltılıyor\n"
+
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "%d -> %d bağımlılığı %d olarak aktarılıyor\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "hiç bir öğe hazır değil\n"
+
+#~ msgid "entering restore_toc_entries_postfork\n"
+#~ msgstr "restore_toc_entries_postfork'a giriliyor\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "restore_toc_entries_parallel'e giriliyor\n"
+
+#~ msgid "entering restore_toc_entries_prefork\n"
+#~ msgstr "restore_toc_entries_prefork'a giriliyor\n"
+
+#~ msgid "could not set default_tablespace to %s: %s"
+#~ msgstr "default_tablespace %s olarak deÄŸiÅŸtirilemedi: %s"
+
+#~ msgid "could not set search_path to \"%s\": %s"
+#~ msgstr "search_path \"%s\" olarak deÄŸiÅŸtirilemedi: %s"
+
+#~ msgid "could not set default_with_oids: %s"
+#~ msgstr "default_with_oids ayarlanamıyor: %s"
+
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "%3$s %4$s için TOC öğe %1$d (ID %2$d) okunuyor\n"
+
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "%s için AH ayırılıyor, biçim %d\n"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "arşiv formatı doğrulanmaya çalışılıyor\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C ve -1 uyumsuz seçeneklerdir\n"
+
+#~ msgid "archiver"
+#~ msgstr "archiver"
+
+#~ msgid "parallel archiver"
+#~ msgstr "paralel arÅŸivleyici"
+
+#~ msgid "compress_io"
+#~ msgstr "compress_io"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "symbolic link \"%s\" okuma hatası"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
diff --git a/src/bin/pg_dump/po/uk.po b/src/bin/pg_dump/po/uk.po
new file mode 100644
index 0000000..7a6315d
--- /dev/null
+++ b/src/bin/pg_dump/po/uk.po
@@ -0,0 +1,2713 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:20+0000\n"
+"PO-Revision-Date: 2023-12-19 15:37\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_dump.pot\n"
+"X-Crowdin-File-ID: 945\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "знайдено порожній Ñ€Ñдок, де очікувавÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ÑтиÑканнÑ"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\""
+
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" потребує значеннÑ"
+
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути цілим чиÑлом"
+
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути логічним значеннÑм"
+
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" не приймає рівень ÑтиÑканнÑ"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d (за замовчуваннÑм %d)"
+
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не приймає кількіÑÑ‚ÑŒ працівників"
+
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не підтримує режим довгої відÑтані"
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "невірний бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m"
+
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½ÑŒ"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‡Ð»ÐµÐ½Ñ–Ð² розширеннÑ"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñхемів"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких таблиць"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких функцій"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких типів"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð½Ð¸Ñ… мов"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких агрегатних функцій"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких операторів"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких методів доÑтупу"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких клаÑів операторів"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких ÑімейÑтв операторів"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких парÑерів текÑтового пошуку"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких шаблонів текÑтового пошуку"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких Ñловників текÑтового пошуку"
+
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких конфігурацій текÑтового пошуку"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких джерел Ñторонніх даних"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких Ñторонніх Ñерверів"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð² за замовчуваннÑм"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких Ñортувань"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких перетворень"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ приведеннÑ"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½ÑŒ"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² подій"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "пошук таблиць розширень"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "пошук відноÑин уÑпадкуваннÑ"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Ñтовпці цікавлÑчої таблиці"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "помітка уÑпадкованих Ñтовпців в підтаблицÑÑ…"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñекції"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑів"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "помітка індекÑів в Ñекційних таблицÑÑ…"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— ÑтатиÑтики"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½ÑŒ"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð²"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» перезапиÑуваннÑ"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸Ðº"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ð¹"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñтва публікації Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñтва публікації Ð´Ð»Ñ Ñхем"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "помилка перевірки, батьківÑький елемент ідентифікатора OID %u Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" (ідентифікатор OID %u) не знайдено"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "неприпуÑтиме чиÑло батьківÑьких елементів %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\""
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ чиÑловий маÑив \"%s\": забагато чиÑел"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ чиÑловий маÑив \"%s\": неприпуÑтимий характер чиÑла"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑненнÑ: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ потік ÑтиÑненнÑ: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "не вдалоÑÑ ÑтиÑнути дані: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ бібліотеку ÑтиÑненнÑ: %s"
+
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %s"
+
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: кінець файлу"
+
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "не вдалоÑÑ Ð·Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ‚Ð¸ контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚Ð¸ ÑтиÑканнÑ: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑтиÑÐºÐ°Ð½Ð½Ñ LZ4: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚Ð¸ розпакуваннÑ: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\": %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑканнÑ"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s"
+
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "непідтримуваний режим \"%s\""
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() помилка: код помилки %d"
+
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "не вдалоÑÑ Ñтворити канали зв'Ñзку: %m"
+
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "не вдалоÑÑ Ñтворити робочий процеÑ: %m"
+
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "нерозпізнана команда отримана від лідера: \"%s\""
+
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "отримане невірне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ робочого процеÑу: \"%s\""
+
+#: parallel.c:1321
+#, c-format
+msgid "could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"\n"
+"Це, зазвичай, означає, що хтоÑÑŒ зробив запит на монопольне Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк батьківÑький Ð¿Ñ€Ð¾Ñ†ÐµÑ pg_dump отримав початкове Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñпільного доÑтупу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–."
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð½ÐµÑподівано"
+
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до каналу зв'Ñзку: %m"
+
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: не вдалоÑÑ Ñтворити Ñокет: код помилки %d"
+
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: не вдалоÑÑ Ð¿Ñ€Ð¸Ð²'Ñзати: код помилки %d"
+
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: не вдалоÑÑ Ð¿Ñ€Ð¾Ñлухати: код помилки %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() помилка: код помилки %d"
+
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: не вдалоÑÑ Ñтворити другий Ñокет: код помилки %d"
+
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· Ñокетом: код помилки %d"
+
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: не вдалоÑÑ Ð¿Ñ€Ð¸Ð¹Ð½Ñти зв'Ñзок: код помилки %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "елементи архіву в неправильному порÑдку"
+
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "неочікуваний код розділу %d"
+
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð· цим файлом архівного формату"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð· архівами, зробленими pre-8.0 pg_dump"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "не можна відновити зі ÑтиÑнутого архіву (%s)"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "прÑмі з'Ð´Ð½Ð°Ð½Ð½Ñ Ð· базою даних не підтримуютьÑÑ Ð² архівах у верÑÑ–ÑÑ… до 1.3"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "маєтьÑÑ Ð½Ð° увазі Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ даних"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸, куди вÑтавити IF EXISTS в інÑтрукції \"%s\""
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð· оригінального файлу дамп: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s \"%s.%s\""
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s \" \"%s\""
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ нової бази даних \"%s\""
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "обробка %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "обробка даних Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\""
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² Ð´Ð»Ñ %s"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² Ð´Ð»Ñ %s"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° - WriteData не може бути викликана поза контекÑтом підпрограми DataDumper "
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "вивід великих об'єктів не підтримуєтьÑÑ Ñƒ вибраному форматі"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "відновлено %d великий об'єкт"
+msgstr[1] "відновлено %d великих об'єкти"
+msgstr[2] "відновлено %d великих об'єктів"
+msgstr[3] "відновлено %d великих об'єктів"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту з OID %u"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "не вдалоÑÑ Ñтворити великий об'єкт %u: %s"
+
+#: pg_backup_archiver.c:1383 pg_dump.c:3720
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ великий об'єкт %u: %s"
+
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC \"%s\": %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "Ñ€Ñдок проігноровано: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ ID %d"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл \"%s\": %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "запиÑано %zu байт даних великого об'єкта (результат = %d)"
+msgstr[1] "запиÑано %zu байти даних великого об'єкта (результат = %d)"
+msgstr[2] "запиÑано %zu байтів даних великого об'єкта (результат = %d)"
+msgstr[3] "запиÑано %zu байтів даних великого об'єкта (результат = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до великого об'єкту: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "при ІÐІЦІÐЛІЗÐЦІЇ:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "при ОБРОБЦІ TOC:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "при ЗÐВЕРШЕÐÐІ:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "зі Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ TOC %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "невірний dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "невірна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ dumpId Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ даних таблиці"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "неочікувана позначка зÑуву даних %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "зÑув файлу у файлі дампу завеликий"
+
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "ім'Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ задовге: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "каталог \"%s\" не Ñхожий на архівний (\"toc.dat\" не Ñ–Ñнує)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл \"%s\": %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ вхідний файл: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "вхідний файл закороткий (прочитано %lu, очікувалоÑÑŒ 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "вхідний файл Ñхожий на дамп текÑтового формату. Будь лаÑка, викориÑтайте psql."
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "вхідний файл не Ñхожий на архівний (закороткий?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "вхідний файл не Ñхожий на архівний"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл: %m"
+
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ stdout Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "нерозпізнаний формат файлу \"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4466
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "завершений об'єкт %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4479
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "помилка при робочому процеÑÑ–: код виходу %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° %d поза діапазоном -- можливо, зміÑÑ‚ пошкоджений"
+
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ WITH OIDS більше не підтримуєтьÑÑ"
+
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "нерозпізнане ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "невірний об'єкт КОДУВÐÐÐЯ: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "невірний об'єкт STDSTRINGS: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "Ñхему \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "таблицю \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "функцію \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "тригер \"%s\" не знайдено"
+
+#: pg_backup_archiver.c:3201
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити кориÑтувача ÑеанÑу Ð´Ð»Ñ \"%s\": %s"
+
+#: pg_backup_archiver.c:3333
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити search_path Ð´Ð»Ñ \"%s\": %s"
+
+#: pg_backup_archiver.c:3394
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити default_tablespace Ð´Ð»Ñ %s: %s"
+
+#: pg_backup_archiver.c:3443
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "не вдалоÑÑ Ð²Ñтановити default_table_access_method Ð´Ð»Ñ : %s"
+
+#: pg_backup_archiver.c:3548
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "невідомо, Ñк вÑтановити влаÑника об'єкту типу \"%s\""
+
+#: pg_backup_archiver.c:3770
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "в заголовку файлу не знайдено магічного Ñ€Ñдка"
+
+#: pg_backup_archiver.c:3784
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "в заголовку непідтримувана верÑÑ–Ñ (%d.%d)"
+
+#: pg_backup_archiver.c:3789
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "перевірка на розмір цілого чиÑла (%lu) не вдалаÑÑ"
+
+#: pg_backup_archiver.c:3793
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "архів зроблено на архітектурі з більшими цілими чиÑлами, деÑкі операції можуть не виконуватиÑÑ"
+
+#: pg_backup_archiver.c:3803
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "очікуваний формат (%d) відрізнÑєтьÑÑ Ð²Ñ–Ð´ знайденого формату у файлі (%d)"
+
+#: pg_backup_archiver.c:3825
+#, 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:3861
+#, c-format
+msgid "invalid creation date in header"
+msgstr "неприпуÑтима дата ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ заголовку"
+
+#: pg_backup_archiver.c:3995
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "обробка елементу %d %s %s"
+
+#: pg_backup_archiver.c:4070
+#, c-format
+msgid "entering main parallel loop"
+msgstr "Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ паралельного циклу"
+
+#: pg_backup_archiver.c:4081
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "пропуÑкаєтьÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ %d %s %s "
+
+#: pg_backup_archiver.c:4090
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "запуÑк елементу %d %s %s "
+
+#: pg_backup_archiver.c:4144
+#, c-format
+msgid "finished main parallel loop"
+msgstr "головний паралельний цикл завершивÑÑ"
+
+#: pg_backup_archiver.c:4180
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "обробка втраченого елементу %d %s %s"
+
+#: pg_backup_archiver.c:4785
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "не вдалоÑÑ Ñтворити таблицю \"%s\", дані не будуть відновлені"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "неприпуÑтимий ідентифікатор OID Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об’єкту"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ файлу oobe. xml: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "блок даних %d має неправильну позицію пошуку"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "нерозпізнаний тип блоку даних (%d) під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ архіву"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¹Ñ‚Ð¸ в архіві блок з ідентифікатором %d -- можливо, через непоÑлідовніÑÑ‚ÑŒ запиту відновленнÑ, Ñкий не можна обробити через файл, що не допуÑкає довільний вхід"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в архіві блок з ідентифікатором %d -- можливо, архів пошкоджений"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "знайдено неочікуваний блок з ідентифікатором (%d) під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… -- очікувалоÑÑ %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "нерозпізнаний тип блоку даних %d при відновленні архіву"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ позицію пошуку у файлі архіву: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ архівний файл: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "можливо повторно відкрити лише вхідні архіви"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ñ– Ñтандартного вводу не підтримуєтьÑÑ"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð· файлу без вільного доÑтупу не підтримуєтьÑÑ"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "не вдалоÑÑ Ð½Ð°Ð±Ñ€Ð°Ñ‚Ð¸ позицію пошуку у файлі архіву: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "ущільнювач активний"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñерверу з libpq"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· невідповідніÑÑ‚ÑŒ верÑÑ–Ñ— Ñерверу"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "верÑÑ–Ñ Ñерверу: %s; верÑÑ–Ñ %s: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "вже під'єднано до бази даних"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "Пароль: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· базою даних"
+
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "помилка повторного підключеннÑ: %s"
+
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "запит не вдавÑÑ: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "Запит був: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "запит повернув %d Ñ€Ñдок заміÑÑ‚ÑŒ одного: %s"
+msgstr[1] "запит повернув %d Ñ€Ñдки заміÑÑ‚ÑŒ одного: %s"
+msgstr[2] "запит повернув %d Ñ€Ñдків заміÑÑ‚ÑŒ одного: %s"
+msgstr[3] "запит повернув %d Ñ€Ñдків заміÑÑ‚ÑŒ одного: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s:%sКоманда була: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ запит"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "помилка повернулаÑÑ Ð²Ñ–Ð´ PQputCopyData: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "помилка повернулаÑÑ Ð²Ñ–Ð´ PQputCopyEnd: %s"
+
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "КОПІЮВÐÐÐЯ Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не вдалоÑÑ: %s"
+
+#: pg_backup_db.c:521 pg_dump.c:2204
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "неочікувані зайві результати під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\""
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ транзакцію бази даних"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "не вдалоÑÑ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¸Ñ‚Ð¸ транзакцію бази даних"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "вихідний каталог не вказано"
+
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "не можливо запиÑати у вихідний файл: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл даних: %m"
+
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл даних \"%s\": %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ великий об'єкт файлу TOC \"%s\" Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "невірна Ð»Ñ–Ð½Ñ–Ñ Ñƒ великому об'єкті файлу TOC \"%s\": \"%s\""
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту файлу TOC \"%s\""
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ великий об'єкт файлу TOC \"%s\" %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл даних LO: %m"
+
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати в файл LO TOC: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл LO TOC: %m"
+
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ задовге: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "цей формат не може бути прочитаним"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC \"%s\" Ð´Ð»Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC Ð´Ð»Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ архіватора tar"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC \"%s\" Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл \"%s\" в архіві"
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ тимчаÑове ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "неочікуваний ÑинтакÑÐ¸Ñ Ñ–Ð½Ñтрукції копіюваннÑ: \"%s\""
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "неприпуÑтимий ідентифікатор OID Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів (%u)"
+
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл oobe. xml: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "фактична довжина файлу (%lld) не відповідає очікуваній (%lld)"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ верхній колонтитул Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ oobe. xml \"%s\" в архіві tar"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поза замовленнÑм не підтримуєтьÑÑ Ñƒ цьому форматі архіву: вимагаєтÑÑŒÑ \"%s\", але перед цим іде \"%s\" у файлі архіву."
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "знайдено незавершений tar-заголовок (%lu байт)"
+msgstr[1] "знайдено незавершений tar-заголовок (%lu байт)"
+msgstr[2] "знайдено незавершений tar-заголовок (%lu байт)"
+msgstr[3] "знайдено незавершений tar-заголовок (%lu байт)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "знайдено пошкоджений заголовок tar у %s (очікувалоÑÑ %d, обчиÑлено %d) позиції файлу %llu"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "нерозпізнане Ñ–Ð¼â€™Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "перевищено межу on_exit_nicely Ñлотів"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "параметри -s/--schema-only Ñ– -a/--data-only не можуть викориÑтовуватиÑÑŒ разом"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "параметри -s/--schema-only Ñ– --include-foreign-data не можуть викориÑтовуватиÑÑŒ разом"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "параметр --include-foreign-data не підтримуєтьÑÑ Ð· паралельним резервним копіюваннÑм"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "параметри -c/--clean Ñ– -a/--data-only не можна викориÑтовувати разом"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "параметр --if-exists потребує параметр -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "параметр --on-conflict-do-nothing вимагає опції --inserts, --rows-per-insert або --column-inserts"
+
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\""
+
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑтиÑканнÑ: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "параметр ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" в даний Ñ‡Ð°Ñ Ð½Ðµ підтримуєтьÑÑ pg_dump"
+
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "паралельне резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÑ”Ñ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ з форматом \"каталог\""
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "оÑтанній вбудований OID %u"
+
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "відповідних Ñхем не знайдено"
+
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "відповідних таблиць не знайдено"
+
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "не знайдено відповідних розширень"
+
+#: pg_dump.c:1056
+#, c-format
+msgid "%s dumps a database as a text file or to other formats.\n\n"
+msgstr "%s зберігає резервну копію бази даних в текÑтовому файлі або в інших форматах.\n\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid "\n"
+"General options:\n"
+msgstr "\n"
+"ОÑновні налаштуваннÑ:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ виводу або каталогу\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid " -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr " -F, --format=c|d|t|p формат файлу виводу (Ñпеціальний, каталог, tar,\n"
+" звичайний текÑÑ‚ (за замовчуваннÑм))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM викориÑтовувати ці паралельні Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose детальний режим\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid " -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr " -Z, --compress=METHOD[:DETAIL]\n"
+" ÑтиÑкати Ñк вказано\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT помилка піÑÐ»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ TIMEOUT Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync не чекати безпечного Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid "\n"
+"Options controlling the output content:\n"
+msgstr "\n"
+"Параметри, що керують вихідним вміÑтом:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only вивантажити лише дані, без Ñхеми\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects включити у Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ– об'єкти\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (те Ñаме, що --large-objects, заÑтарілий)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -b, --no-large-objects виключити з Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ– об'єкти\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (те Ñаме, що --no-large-objects, заÑтарілий)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean видалити об'єкти бази даних перед перед повторним ÑтвореннÑм\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create включити у Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN вивантажити лише вказане(Ñ–) розширеннÑ\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING вивантажити дані в кодуванні ENCODING\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN вивантажити лише вказану Ñхему(и)\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN ÐЕ вивантажувати вказану Ñхему(и)\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr " -O, --no-owner пропуÑкати Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¾Ð»Ð¾Ð´Ñ–Ð½Ð½Ñ Ð¾Ð±'єктами\n"
+" при викориÑтанні текÑтового формату\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only вивантажити лише Ñхему, без даних\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, Ñке буде викориÑтовуватиÑÑŒ у звичайних текÑтових форматах\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=PATTERN вивантажити лише вказані таблиці\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN ÐЕ вивантажувати вказані таблиці\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges не вивантажувати права (наданнÑ/відкликаннÑ)\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð»Ð¸ÑˆÐµ утилітами оновленнÑ\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts вивантажити дані у виглÑді команд INSERT з іменами Ñтовпців\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting вимкнути цінову пропозицію $, викориÑтовувати SQL Ñтандартну цінову пропозицію\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers вимкнути тригери лише під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid " --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr " --enable-row-security активувати захиÑÑ‚ на рівні Ñ€Ñдків (вивантажити лише той вміÑÑ‚, до Ñкого\n"
+" кориÑтувач має доÑтуп)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid " --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr " --exclude-table-and-children=PATTERN\n"
+" не вивантажувати зазначені таблиці, включно\n"
+" з дочірніми та Ñекціонованими таблицÑми\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN ÐЕ вивантажувати дані вказаних таблиць\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid " --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr " --exclude-table-data-and-children=PATTERN\n"
+" не вивантажувати дані зазначених таблиць,\n"
+" включно з дочірніми та Ñекціонованими таблицÑми\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM змінити параметр за замовчуваннÑм Ð´Ð»Ñ extra_float_digits\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists викориÑтовувати IF EXISTS під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±'єктів\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid " --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr " --include-foreign-data=ШÐБЛОÐ\n"
+" включають дані підлеглих таблиць на підлеглих\n"
+" Ñервери, що відповідають ШÐБЛОÐУ\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts вивантажити дані у виглÑді команд INSERT, не COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root завантажувати Ñекції через головну таблицю\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments не вивантажувати коментарі\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications не вивантажувати публікації\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels не вивантажувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº безпеки\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions не вивантажувати підпиÑки\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method не вивантажувати табличні методи доÑтупу\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces не вивантажувати Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… проÑторів\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression не вивантажувати методи ÑтиÑÐ½ÐµÐ½Ð½Ñ TOAST\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data не вивантажувати дані таблиць, Ñкі не журналюютьÑÑ\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing додавати ON CONFLICT DO NOTHING до команди INSERT\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers укладати в лапки вÑÑ– ідентифікатори, а не тільки ключові Ñлова\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS кількіÑÑ‚ÑŒ Ñ€Ñдків Ð´Ð»Ñ INSERT; вимагає параметру --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION вивантажити вказану Ñекцію (pre-data, data або post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable чекати коли Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° буде виконати без аномалій\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT викориÑтовувати під Ñ‡Ð°Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ знімок\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid " --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr " --strict-names потребувати, щоб при вказівці шаблону включеннÑ\n"
+" таблиці Ñ–/або Ñхеми йому відповідав мінімум один об'єкт\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid " --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr " --table-and-children=PATTERN вивантажувати лише зазначені таблиці,\n"
+" включно з дочірніми та Ñекціонованими таблицÑми\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid " --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr " --use-set-session-authorization\n"
+" щоб вÑтановити влаÑника, викориÑтати команди SET SESSION AUTHORIZATION,\n"
+" заміÑÑ‚ÑŒ команд ALTER OWNER\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME ім'Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñерверу баз даних або каталог Ñокетів\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT номер порту Ñервера бази даних\n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME підключатиÑÑŒ Ñк вказаний кориÑтувач бази даних\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password запитувати пароль завжди (повинно траплÑтиÑÑŒ автоматично)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME виконати SET ROLE до вивантаженнÑ\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid "\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n\n"
+msgstr "\n"
+"Якщо ім'Ñ Ð±Ð°Ð·Ð¸ даних не вказано, тоді викориÑтовуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— Ñередовища PGDATABASE.\n\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "вказано неприпуÑтиме клієнтÑьке ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\""
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "паралельні Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… Ñерверів не підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ верÑÑ–ÑŽ Ñервера"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "вказано неприпуÑтимий формат виводу \"%s\""
+
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неправильне повне ім'Ñ (забагато компонентів): %s"
+
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "не знайдено відповідних Ñхем Ð´Ð»Ñ Ð²Ñ–Ð·ÐµÑ€ÑƒÐ½ÐºÑƒ \"%s\""
+
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "не знайдено відповідних розширень Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñƒ \"%s\""
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "не знайдено відповідних підлеглих Ñерверів Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñƒ \"%s\""
+
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "неправильне ім'Ñ Ð·Ð²'Ñзку (забагато компонентів): %s"
+
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "не знайдено відповідних таблиць Ð´Ð»Ñ Ð²Ñ–Ð·ÐµÑ€ÑƒÐ½ÐºÑƒ\"%s\""
+
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Ðа даний момент ви від'єднанні від бази даних."
+
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "міжбазові поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ реалізовані: %s"
+
+#: pg_dump.c:2079
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ñту таблиці \"%s.%s\""
+
+#: pg_dump.c:2185
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "Помилка Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ñту таблиці \"%s\": помилка в PQgetCopyData()."
+
+#: pg_dump.c:2186 pg_dump.c:2196
+#, c-format
+msgid "Error message from server: %s"
+msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку від Ñервера: %s"
+
+#: pg_dump.c:2187 pg_dump.c:2197
+#, c-format
+msgid "Command was: %s"
+msgstr "Команда була: %s"
+
+#: pg_dump.c:2195
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "Помилка Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ñту таблиці \"%s\": помилка в PQgetResult(). "
+
+#: pg_dump.c:2277
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "неправильна кількіÑÑ‚ÑŒ полів отриманих з таблиці \"%s\""
+
+#: pg_dump.c:2975
+#, c-format
+msgid "saving database definition"
+msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних"
+
+#: pg_dump.c:3080
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "нерозпізнаний поÑтачальник локалів: %s"
+
+#: pg_dump.c:3431
+#, c-format
+msgid "saving encoding = %s"
+msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ = %s"
+
+#: pg_dump.c:3456
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ standard_conforming_strings = %s"
+
+#: pg_dump.c:3495
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ результат current_schemas()"
+
+#: pg_dump.c:3514
+#, c-format
+msgid "saving search_path = %s"
+msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ search_path = %s"
+
+#: pg_dump.c:3551
+#, c-format
+msgid "reading large objects"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів"
+
+#: pg_dump.c:3689
+#, c-format
+msgid "saving large objects"
+msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів"
+
+#: pg_dump.c:3730
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів %u: %s"
+
+#: pg_dump.c:3836
+#, c-format
+msgid "reading row-level security policies"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸Ðº безпеки на рівні Ñ€Ñдків"
+
+#: pg_dump.c:3977
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "неочікуваний тип команди в політиці: %c"
+
+#: pg_dump.c:4427 pg_dump.c:4771 pg_dump.c:11998 pg_dump.c:17908
+#: pg_dump.c:17910 pg_dump.c:18531
+#, c-format
+msgid "could not parse %s array"
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ маÑив %s"
+
+#: pg_dump.c:4616
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "підпиÑки не вивантажені через те, що чинний кориÑтувач не Ñ” ÑуперкориÑтувачем"
+
+#: pg_dump.c:5163
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑький елемент Ð´Ð»Ñ %s %s"
+
+#: pg_dump.c:5308
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "Ñхема з OID %u не Ñ–Ñнує"
+
+#: pg_dump.c:6790 pg_dump.c:17172
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "помилка ціліÑноÑÑ‚Ñ–, за OID %u не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑьку таблицю поÑлідовноÑÑ‚Ñ– з OID %u"
+
+#: pg_dump.c:6933
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "помилка ціліÑноÑÑ‚Ñ–, OID %u не знайдено в таблиці pg_partitioned_table"
+
+#: pg_dump.c:7164 pg_dump.c:7431 pg_dump.c:7902 pg_dump.c:8566 pg_dump.c:8685
+#: pg_dump.c:8833
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "нерозпізнаний OID таблиці %u"
+
+#: pg_dump.c:7168
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "неочікувані дані індекÑу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\""
+
+#: pg_dump.c:7663
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "помилка ціліÑноÑÑ‚Ñ–, за OID %u не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑьку таблицю Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу pg_rewrite з OID %u"
+
+#: pg_dump.c:7954
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "запит не повернув ім'Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ñ— таблиці Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð° зовнішнього ключа \"%s\" в таблиці \"%s\" (OID цільової таблиці: %u)"
+
+#: pg_dump.c:8570
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "неочікувані дані ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\""
+
+#: pg_dump.c:8599
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "неприпуÑтима Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ñ–Ñ Ñтовпців у таблиці \"%s\""
+
+#: pg_dump.c:8647
+#, c-format
+msgid "finding table default expressions"
+msgstr "пошук виразів за замовчуваннÑм Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–"
+
+#: pg_dump.c:8689
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ adnum %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\""
+
+#: pg_dump.c:8783
+#, c-format
+msgid "finding table check constraints"
+msgstr "пошук перевірочних обмежень таблиці"
+
+#: pg_dump.c:8837
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "очікувалоÑÑŒ %d обмеженнÑ-перевірка Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\", але знайдено %d"
+msgstr[1] "очікувалоÑÑŒ %d обмеженнÑ-перевірки Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\", але знайдено %d"
+msgstr[2] "очікувалоÑÑŒ %d обмежень-перевірок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\", але знайдено %d"
+msgstr[3] "очікувалоÑÑŒ %d обмежень-перевірок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\", але знайдено %d"
+
+#: pg_dump.c:8841
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "СиÑтемні каталоги можуть бути пошкоджені."
+
+#: pg_dump.c:9531
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "роль з OID %u не Ñ–Ñнує"
+
+#: pg_dump.c:9643 pg_dump.c:9672
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "непідтримуваний Ð·Ð°Ð¿Ð¸Ñ Ð² pg_init_privs: %u %u %d"
+
+#: pg_dump.c:10493
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "typtype типу даних \"%s\" має неприпуÑтимий виглÑд"
+
+#: pg_dump.c:12067
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ provolatile Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"%s\""
+
+#: pg_dump.c:12117 pg_dump.c:13999
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ proparallel Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"%s\""
+
+#: pg_dump.c:12247 pg_dump.c:12353 pg_dump.c:12360
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— з OID %u"
+
+#: pg_dump.c:12286
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_cast.castfunc або pg_cast.castmethod"
+
+#: pg_dump.c:12289
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_cast.castmethod"
+
+#: pg_dump.c:12379
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "неприпуÑтиме Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ, Ñк мінімум одне з trffromsql Ñ– trftosql повинно бути ненульовим"
+
+#: pg_dump.c:12396
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_transform.trffromsql"
+
+#: pg_dump.c:12417
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_transform.trftosql"
+
+#: pg_dump.c:12562
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "поÑтфікÑні оператори більше не підтримуютьÑÑ (оператор \"%s\")"
+
+#: pg_dump.c:12732
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ оператора з OID %s"
+
+#: pg_dump.c:12800
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "неприпуÑтимий тип \"%c\" методу доÑтупу \"%s\""
+
+#: pg_dump.c:13469 pg_dump.c:13528
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "нерозпізнаний поÑтачальник правил ÑортуваннÑ: %s"
+
+#: pg_dump.c:13478 pg_dump.c:13487 pg_dump.c:13497 pg_dump.c:13512
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "неприпуÑтиме правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\""
+
+#: pg_dump.c:13918
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ aggfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ \"%s\""
+
+#: pg_dump.c:13974
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ aggmfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ \"%s\""
+
+#: pg_dump.c:14691
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "нерозпізнаний тип об’єкта у Ñтандартному праві: %d"
+
+#: pg_dump.c:14707
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñтандартний ACL ÑпиÑок (%s)"
+
+#: pg_dump.c:14789
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початковий ÑпиÑок ACL (%s) або за замовченнÑм (%s) Ð´Ð»Ñ Ð¾Ð±'єкта \"%s\" (%s)"
+
+#: pg_dump.c:14814
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ACL (%s) або за замовчуваннÑм (%s) Ð´Ð»Ñ Ð¾Ð±'єкту \"%s\" (%s)"
+
+#: pg_dump.c:15355
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду \"%s\" не повернув дані"
+
+#: pg_dump.c:15358
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду \"%s\" повернув більше, ніж одне визначеннÑ"
+
+#: pg_dump.c:15365
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду \"%s\" пуÑте (довжина нуль)"
+
+#: pg_dump.c:15449
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "WITH OIDS більше не підтримуєтьÑÑ (таблицÑ\"%s\")"
+
+#: pg_dump.c:16373
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "неприпуÑтиме чиÑло Ñтовпців %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\""
+
+#: pg_dump.c:16451
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñтовпці ÑтатиÑтики індекÑів"
+
+#: pg_dump.c:16453
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑтатиÑтики індекÑів"
+
+#: pg_dump.c:16455
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "невідповідна кількіÑÑ‚ÑŒ Ñтовпців Ñ– значень Ð´Ð»Ñ ÑтатиÑтики індекÑів"
+
+#: pg_dump.c:16671
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "пропущено Ñ–Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\""
+
+#: pg_dump.c:16906
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "нерозпізнаний тип обмеженнÑ: %c"
+
+#: pg_dump.c:17007 pg_dump.c:17236
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑлідовноÑÑ‚Ñ– \"%s\" повернув %d Ñ€Ñдки (очікувалоÑÑ 1)"
+msgstr[1] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑлідовноÑÑ‚Ñ– \"%s\" повернув %d Ñ€Ñдки (очікувалоÑÑ 1)"
+msgstr[2] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑлідовноÑÑ‚Ñ– \"%s\" повернув %d Ñ€Ñдків (очікувалоÑÑ 1)"
+msgstr[3] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑлідовноÑÑ‚Ñ– \"%s\" повернув %d Ñ€Ñдків (очікувалоÑÑ 1)"
+
+#: pg_dump.c:17039
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "нерозпізнаний тип поÑлідовноÑÑ‚Ñ–: %s"
+
+#: pg_dump.c:17328
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ tgtype: %d"
+
+#: pg_dump.c:17400
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "неприпуÑтимий Ñ€Ñдок аргументу (%s) Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð° \"%s\" у таблиці \"%s\""
+
+#: pg_dump.c:17669
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "помилка запиту на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\": повернено неправильне чиÑло Ñ€Ñдків "
+
+#: pg_dump.c:17822
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ згадане Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %u"
+
+#: pg_dump.c:17912
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "невідповідна кількіÑÑ‚ÑŒ конфігурацій Ñ– умов Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ"
+
+#: pg_dump.c:18044
+#, c-format
+msgid "reading dependency data"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… залежноÑÑ‚Ñ–"
+
+#: pg_dump.c:18130
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "немає об’єкту поÑÐ¸Ð»Ð°Ð½Ð½Ñ %u %u"
+
+#: pg_dump.c:18141
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "немає поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт %u %u"
+
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "неприпуÑтимий dumpId %d"
+
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "неприпуÑтима залежніÑÑ‚ÑŒ %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "не вдалоÑÑ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ цикл залежноÑÑ‚Ñ–"
+
+#: pg_dump_sort.c:1276
+#, 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] "у наÑтупній таблиці зациклені зовнішні ключі:"
+msgstr[1] "у наÑтупних таблицÑÑ… зациклені зовнішні ключі:"
+msgstr[2] "у наÑтупних таблицÑÑ… зациклені зовнішні ключі:"
+msgstr[3] "у наÑтупних таблицÑÑ… зациклені зовнішні ключі:"
+
+#: pg_dump_sort.c:1281
+#, 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:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "не вдалоÑÑ Ð²Ð¸Ñ€Ñ–ÑˆÐ¸Ñ‚Ð¸ цикл залежноÑÑ‚Ñ– Ñеред цих елементів:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "параметр --exclude-database не можна викориÑтовувати разом з -g/--globals-only, -r/--roles-only або -t/--tablespaces-only"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "параметри -g/--globals-only Ñ– -r/--roles-only не можна викориÑтовувати разом"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "параметри -g/--globals-only Ñ– -t/--tablespaces-only не можна викориÑтовувати разом"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "параметри -r/--roles-only Ñ– -t/--tablespaces-only не можна викориÑтовувати разом"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· базою даних \"%s\""
+
+#: pg_dumpall.c:481
+#, c-format
+msgid "could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr "не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· базами даних \"postgres\" або \"template1\"\n"
+"Будь лаÑка, вкажіть альтернативну базу даних."
+
+#: pg_dumpall.c:629
+#, c-format
+msgid "%s extracts a PostgreSQL database cluster into an SQL script file.\n\n"
+msgstr "%s екÑпортує клаÑтер баз даних PostgreSQL до SQL-Ñкрипту.\n\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s: [OPTION]...\n"
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME ім'Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ файлу\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean очиÑтити (видалити) бази даних перед відтвореннÑм\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only вивантажувати лише глобальні об’єкти, не бази даних\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner пропуÑкаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ влаÑноÑÑ‚Ñ– об’єктом\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only вивантажувати лише ролі, не бази даних або табличні проÑтори\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME ім'Ñ ÑуперкориÑтувача Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ вивантажуванні\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only вивантажувати лише табличні проÑтори, не бази даних або ролі\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN виключити бази даних, ім'Ñ Ñких відповідає PATTERN\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords не вивантажувати паролі Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð· викориÑтаннÑм Ñ€Ñдку Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME альтернативна база даних за замовчуваннÑм\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid "\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n\n"
+msgstr "\n"
+"Якщо -f/--file не викориÑтовуєтьÑÑ, тоді SQL- Ñценарій буде запиÑаний до Ñтандартного виводу.\n\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "пропущено Ñ–Ð¼â€™Ñ Ñ€Ð¾Ð»Ñ–, що починаєтьÑÑ Ð· \"pg_\" (%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ правильний порÑдок Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñтва в ролі \"%s\""
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ACL (%s) Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\""
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ACL (%s) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору \"%s\""
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "виключаємо базу даних \"%s\""
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "вивантажуємо базу даних \"%s\""
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "помилка pg_dump Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\", Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
+
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ відкрити файл виводу \"%s\": %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "виконуєтьÑÑ \"%s\""
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñерверу"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñерверу \"%s\""
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "виконуєтьÑÑ %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "необхідно вказати один з -d/--dbname або -f/--file"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "параметри -d/--dbname Ñ– -f/--file не можуть викориÑтовуватиÑÑŒ разом"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "параметри -C/--create Ñ– -1/--single-transaction не можуть викориÑтовуватиÑÑŒ разом"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "параметр --single-transaction допуÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ з одним завданнÑм"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "нерозпізнаний формат архіву \"%s\"; будь лаÑка, вкажіть \"c\", \"d\" або \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "при відновленні проігноровано помилок: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid "%s restores a PostgreSQL database from an archive created by pg_dump.\n\n"
+msgstr "%s відновлює базу даних PostgreSQL з архіву, Ñтвореного командою pg_dump.\n\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [OPTION]... [FILE]\n"
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME підключитиÑÑŒ до вказаної бази даних\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ виводу (- Ð´Ð»Ñ stdout)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t формат файлу резервної копії (розпізнаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list вивеÑти короткий зміÑÑ‚ архіву\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose детальний режим\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid "\n"
+"Options controlling the restore:\n"
+msgstr "\n"
+"Параметри, що керують відновленнÑм:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only відновити лише дані, без Ñхеми\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create Ñтворити цільову базу даних\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error вийти при помилці, продовжувати за замовчуваннÑм\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME відновити вказаний індекÑ\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM щоб виконати відновленнÑ, викориÑтайте ці паралельні завданнÑ\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid " -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr " -L, --use-list=FILENAME викориÑтовувати зміÑÑ‚ з цього файлу Ð´Ð»Ñ \n"
+" вибору/упорÑÐ´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME відновити об'єкти лише в цій Ñхемі\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME не відновлювати об'єкти в цій Ñхемі\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) відновити вказану функцію\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only відновити лише Ñхему, без даних\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME ім'Ñ ÑуперкориÑтувача Ð´Ð»Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð²\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME відновити вказане Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ (таблицю, Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ñ– Ñ‚. д.)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME відновити вказаний тригер\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges пропуÑтити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð² доÑтупу (grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction відновити в одній транзакції\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security активувати захиÑÑ‚ на рівні Ñ€Ñдків\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments не відновлювати коментарі\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr " --no-data-for-failed-tables не відновлювати дані таблиць, Ñкі не вдалоÑÑ Ñтворити\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications не відновлювати публікації \n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels не відновлювати мітки безпеки \n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions не відновлювати підпиÑки\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method не відновлювати табличний метод доÑтупу\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces не відновлювати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION відновлювати названий розділ (pre-data, data або post-data)\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME виконати SET ROLE перед відновленнÑм\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid "\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr "\n"
+"Параметри -I, -n, -N, -P, -t, -T, і --section можна групувати і вказувати\n"
+"декілька разів Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ декількох об'єктів.\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid "\n"
+"If no input file name is supplied, then standard input is used.\n\n"
+msgstr "\n"
+"Якщо ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð½Ðµ вказано, тоді викориÑтовуєтьÑÑ Ñтандартне введеннÑ.\n\n"
+
diff --git a/src/bin/pg_dump/po/zh_CN.po b/src/bin/pg_dump/po/zh_CN.po
new file mode 100644
index 0000000..a580c50
--- /dev/null
+++ b/src/bin/pg_dump/po/zh_CN.po
@@ -0,0 +1,2643 @@
+# simplified Chinese translation file for pg_dump and friends
+# Weiping He <laser@zhengmai.com.cn>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-15 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当å‰ç›®å½•: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m"
+
+#: ../../common/exec.c:409 parallel.c:1614
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+msgid "out of memory"
+msgstr "内存ä¸è¶³"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "命令无法执行"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, 退出ç ä¸º %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¿›ç¨‹è¢«ä¾‹å¤–(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¿›ç¨‹è¢«ä¿¡å· %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, æœªçŸ¥çŠ¶æ€ %d"
+
+#: common.c:124
+#, c-format
+msgid "reading extensions"
+msgstr "读扩展"
+
+#: common.c:128
+#, c-format
+msgid "identifying extension members"
+msgstr "识别扩展æˆå‘˜"
+
+#: common.c:131
+#, c-format
+msgid "reading schemas"
+msgstr "读å–模å¼"
+
+#: common.c:141
+#, c-format
+msgid "reading user-defined tables"
+msgstr "读å–用户定义表"
+
+#: common.c:148
+#, c-format
+msgid "reading user-defined functions"
+msgstr "读å–用户定义函数"
+
+#: common.c:153
+#, c-format
+msgid "reading user-defined types"
+msgstr "读å–用户定义类型"
+
+#: common.c:158
+#, c-format
+msgid "reading procedural languages"
+msgstr "读å–过程语言"
+
+#: common.c:161
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "读å–用户定义èšé›†å‡½æ•°"
+
+#: common.c:164
+#, c-format
+msgid "reading user-defined operators"
+msgstr "读å–用户定义æ“作符"
+
+#: common.c:168
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "读å–用户定义的访问方法"
+
+#: common.c:171
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "读å–用户定义æ“作符集"
+
+#: common.c:174
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "读å–用户定义æ“作符"
+
+#: common.c:177
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "读å–用户定义的文本æœç´¢è§£æžå™¨"
+
+#: common.c:180
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "读å–用户定义的文本æœç´¢æ¨¡æ¿"
+
+#: common.c:183
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "读å–用户定义的文本æœç´¢å­—å…¸"
+
+#: common.c:186
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "读å–用户定义的文本æœç´¢é…ç½®"
+
+#: common.c:189
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "读å–用户定义外部数æ®å°è£…器"
+
+#: common.c:192
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "读å–用户定义的外部æœåŠ¡å™¨"
+
+#: common.c:195
+#, c-format
+msgid "reading default privileges"
+msgstr "正在读å–缺çœæƒé™"
+
+#: common.c:198
+#, c-format
+msgid "reading user-defined collations"
+msgstr "读å–用户定义的校对函数"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "读å–用户定义的字符集转æ¢"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "读å–类型转æ¢"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "读å–转æ¢"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "读å–表继承信æ¯"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "读å–事件触å‘器"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "查找扩展表"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "正在查找关系继承"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "正在读å–感兴趣表的列信æ¯"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "在å­è¡¨é‡Œæ ‡è®°ç»§æ‰¿å­—段"
+
+#: common.c:231
+#, c-format
+msgid "reading indexes"
+msgstr "读å–索引"
+
+#: common.c:234
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "在分区表中标记索引"
+
+#: common.c:237
+#, c-format
+msgid "reading extended statistics"
+msgstr "读å–扩展统计信æ¯"
+
+#: common.c:240
+#, c-format
+msgid "reading constraints"
+msgstr "读å–约æŸ"
+
+#: common.c:243
+#, c-format
+msgid "reading triggers"
+msgstr "读å–触å‘器"
+
+#: common.c:246
+#, c-format
+msgid "reading rewrite rules"
+msgstr "读å–é‡å†™è§„则"
+
+#: common.c:249
+#, c-format
+msgid "reading policies"
+msgstr "读å–ç­–ç•¥"
+
+#: common.c:252
+#, c-format
+msgid "reading publications"
+msgstr "读å–å‘布"
+
+#: common.c:257
+#, c-format
+msgid "reading publication membership"
+msgstr "读å–å‘布æˆå‘˜èµ„æ ¼"
+
+#: common.c:260
+#, c-format
+msgid "reading subscriptions"
+msgstr "读å–订阅"
+
+#: common.c:338
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr "表 \"%2$s\" 的无效parents值 %1$d"
+
+#: common.c:1100
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "å¥å…¨æ£€æŸ¥å¤±è´¥, 未找到表 \"%2$s\" (OID %3$u) çš„ OID 为 %1$u 的父辈"
+
+#: common.c:1142
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "无法分æžæ•°å€¼æ•°ç»„\"%s\": 数字太多"
+
+#: common.c:1157
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "无法分æžæ•°å€¼æ•°ç»„\"%s\": 出现无效字符"
+
+#: compress_io.c:111
+#, c-format
+msgid "invalid compression code: %d"
+msgstr "无效的压缩ç : %d"
+
+#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504
+#: compress_io.c:547
+#, c-format
+msgid "not built with zlib support"
+msgstr "没有编译æˆå¸¦æœ‰zlib库支æŒçš„版本"
+
+#: compress_io.c:236 compress_io.c:333
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "无法åˆå§‹åŒ–压缩库: %s"
+
+#: compress_io.c:256
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "无法关闭压缩æµ: %s"
+
+#: compress_io.c:273
+#, c-format
+msgid "could not compress data: %s"
+msgstr "无法压缩数æ®: %s"
+
+#: compress_io.c:349 compress_io.c:364
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "无法解压缩数æ®: %s"
+
+#: compress_io.c:371
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "无法关闭压缩库: %s"
+
+#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:551 pg_backup_tar.c:554
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "无法从输入档案读å–:%s"
+
+#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:552
+#: pg_backup_tar.c:787 pg_backup_tar.c:810
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "无法从输入文件中读å–:文件的结尾"
+
+#: parallel.c:254
+msgid "%s() failed: error code %d"
+msgstr "%s()失败: 错误ç ä¸º %d"
+
+#: parallel.c:964
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "无法创建通信通é“: %m"
+
+#: parallel.c:1021
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "无法创建工作进程: %m"
+
+#: parallel.c:1151
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "从主机接收到无法识别的命令: \"%s\""
+
+#: parallel.c:1194 parallel.c:1432
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "接收到æ¥è‡ªå·¥ä½œè€…进程的无效消æ¯: \"%s\""
+
+#: parallel.c:1326
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"无法获å–关系 \"%s\"上的é”\n"
+"这通常æ„味ç€åœ¨çˆ¶è¿›ç¨‹pg_dumpå·²ç»å¾—到表的共享访问é”之åŽï¼Œä»æœ‰äººè¯·æ±‚该表的排它访问é”."
+
+#: parallel.c:1415
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "一工作者进程æ„外退出"
+
+#: parallel.c:1537 parallel.c:1655
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "无法写入通信通é“: %m"
+
+#: parallel.c:1739
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: 无法创建套接字: 错误ç ä¸º %d"
+
+#: parallel.c:1750
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: 无法绑定: 错误ç ä¸º%d"
+
+#: parallel.c:1757
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: 无法监å¬: 错误ç ä¸º %d"
+
+#: parallel.c:1764
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s()失败: 错误ç ä¸º %d"
+
+#: parallel.c:1775
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: 无法创建继承套接字: 错误ç ä¸º %d"
+
+#: parallel.c:1784
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: 无法连接套接字: 错误ç ä¸º %d"
+
+#: parallel.c:1793
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: 无法接å—连接: 错误ç ä¸º %d"
+
+#: pg_backup_archiver.c:277 pg_backup_archiver.c:1576
+#, c-format
+msgid "could not close output file: %m"
+msgstr "无法关闭输出文件: %m"
+
+#: pg_backup_archiver.c:321 pg_backup_archiver.c:325
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "归档项的åºå·ä¸æ­£ç¡®"
+
+#: pg_backup_archiver.c:331
+#, c-format
+msgid "unexpected section code %d"
+msgstr "æ„å¤–çš„èŠ‚ç  %d"
+
+#: pg_backup_archiver.c:368
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "ä¸æ”¯æŒä»¥è¿™ç§å½’档文件格å¼è¿›è¡Œå¹¶è¡Œæ¢å¤"
+
+#: pg_backup_archiver.c:372
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "ä¸æ”¯æŒä½¿ç”¨8.0版本以å‰çš„pg_dump命令产生的存档文件进行并行æ¢å¤"
+
+#: pg_backup_archiver.c:390
+#, c-format
+msgid "cannot restore from compressed archive (compression not supported in this installation)"
+msgstr "无法从压缩的归档中æ¢å¤ (未é…置压缩支æŒ)"
+
+#: pg_backup_archiver.c:407
+#, c-format
+msgid "connecting to database for restore"
+msgstr "为æ¢å¤æ•°æ®åº“与数æ®åº“è”接"
+
+#: pg_backup_archiver.c:409
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "1.3 以å‰çš„归档里ä¸æ”¯æŒç›´æŽ¥æ•°æ®åº“è”接"
+
+#: pg_backup_archiver.c:452
+#, c-format
+msgid "implied data-only restore"
+msgstr "éšå«çš„åªæ¢å¤æ•°æ®"
+
+#: pg_backup_archiver.c:518
+#, c-format
+msgid "dropping %s %s"
+msgstr "删除 %s %s"
+
+#: pg_backup_archiver.c:613
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "找ä¸åˆ°è¦æ’入的ä½ç½®ï¼Œç”±äºŽIF EXISTS在 \"%s\"状æ€"
+
+#: pg_backup_archiver.c:769 pg_backup_archiver.c:771
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "æ¥è‡ªåŽŸå§‹è½¬å‚¨æ–‡ä»¶çš„警告: %s"
+
+#: pg_backup_archiver.c:786
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "创建%s \"%s.%s\""
+
+#: pg_backup_archiver.c:789
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "创建%s \"%s\""
+
+#: pg_backup_archiver.c:839
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "è”接到新数æ®åº“ \"%s\""
+
+#: pg_backup_archiver.c:866
+#, c-format
+msgid "processing %s"
+msgstr "æ­£åœ¨å¤„ç† %s"
+
+#: pg_backup_archiver.c:886
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "为表\"%s.%s\"处ç†æ•°æ®"
+
+#: pg_backup_archiver.c:948
+#, c-format
+msgid "executing %s %s"
+msgstr "执行 %s %s"
+
+#: pg_backup_archiver.c:987
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "为%sç¦ç”¨è§¦å‘器"
+
+#: pg_backup_archiver.c:1013
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "为%så¯ç”¨è§¦å‘器"
+
+#: pg_backup_archiver.c:1041
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "内部错误 -- WriteData ä¸èƒ½åœ¨ DataDumper 过程的环境之外调用"
+
+#: pg_backup_archiver.c:1224
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "选定的格å¼ä¸æ”¯æŒå¤§å¯¹è±¡è¾“出"
+
+#: pg_backup_archiver.c:1282
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "æ¢å¤%d个大对象"
+msgstr[1] "æ¢å¤%d个大对象"
+
+#: pg_backup_archiver.c:1303 pg_backup_tar.c:730
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "æ¢å¤å¸¦æœ‰OID %u 的大对象"
+
+#: pg_backup_archiver.c:1315
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "无法创建大对象%u: %s"
+
+#: pg_backup_archiver.c:1320 pg_dump.c:3638
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "无法打开大对象%u: %s"
+
+#: pg_backup_archiver.c:1376
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "无法打开TOC文件 \"%s\": %m"
+
+#: pg_backup_archiver.c:1404
+#, c-format
+msgid "line ignored: %s"
+msgstr "忽略的行: %s"
+
+#: pg_backup_archiver.c:1411
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "无法为 ID %d 找到记录"
+
+#: pg_backup_archiver.c:1434 pg_backup_directory.c:222
+#: pg_backup_directory.c:598
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "无法关闭 TOC 文件: %m"
+
+#: pg_backup_archiver.c:1548 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:585 pg_backup_directory.c:648
+#: pg_backup_directory.c:667 pg_dumpall.c:489
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "无法打开输出文件\"%s\": %m"
+
+#: pg_backup_archiver.c:1550 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "无法打开输出文件: %m"
+
+#: pg_backup_archiver.c:1643
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "å·²ç»å†™å…¥äº†å¤§å¯¹è±¡çš„%zu字节(结果 = %d)"
+msgstr[1] "å·²ç»å†™å…¥äº†å¤§å¯¹è±¡çš„%zu字节(结果 = %d)"
+
+#: pg_backup_archiver.c:1649
+msgid "could not write to large object: %s"
+msgstr "无法写入大型对象: %s"
+
+#: pg_backup_archiver.c:1739
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "INITIALIZING æ—¶:"
+
+#: pg_backup_archiver.c:1744
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "PROCESSING TOC æ—¶:"
+
+#: pg_backup_archiver.c:1749
+#, c-format
+msgid "while FINALIZING:"
+msgstr "FINALIZING æ—¶:"
+
+#: pg_backup_archiver.c:1754
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "æ¥è‡ª TOC 记录 %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1830
+#, c-format
+msgid "bad dumpId"
+msgstr "错误的dumpIdå·"
+
+#: pg_backup_archiver.c:1851
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA 项的表dumpId错误"
+
+#: pg_backup_archiver.c:1943
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "æ„外的数æ®å移标志 %d"
+
+#: pg_backup_archiver.c:1956
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "在转储文件中的文件å移é‡å¤ªå¤§"
+
+#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "å­—å…¸å字太长: \"%s\""
+
+#: pg_backup_archiver.c:2112
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "目录 \"%s\" 看上去ä¸åƒä¸€ä¸ªæœ‰æ•ˆçš„å½’æ¡£ (\"toc.dat\" ä¸å­˜åœ¨)"
+
+#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807
+#: pg_backup_directory.c:207 pg_backup_directory.c:394
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "无法打开输入文件 \"%s\": %m"
+
+#: pg_backup_archiver.c:2127 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "无法打开输入文件: %m"
+
+#: pg_backup_archiver.c:2133
+#, c-format
+msgid "could not read input file: %m"
+msgstr "无法读å–输入文件: %m"
+
+#: pg_backup_archiver.c:2135
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "输入文件太短 (读了 %lu, 预期 5)"
+
+#: pg_backup_archiver.c:2167
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "输入文件看起æ¥åƒæ˜¯æ–‡æœ¬æ ¼å¼çš„dump. 请使用psql."
+
+#: pg_backup_archiver.c:2173
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "输入文件看上去ä¸è±¡æœ‰æ•ˆçš„å½’æ¡£ (太短?)"
+
+#: pg_backup_archiver.c:2179
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "输入文件看上去ä¸è±¡æœ‰æ•ˆçš„å½’æ¡£"
+
+#: pg_backup_archiver.c:2188
+#, c-format
+msgid "could not close input file: %m"
+msgstr "无法关闭输入文件: %m"
+
+#: pg_backup_archiver.c:2305
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "ä¸å¯è¯†åˆ«çš„æ–‡ä»¶æ ¼å¼ \"%d\""
+
+#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4411
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "已完æˆçš„æˆå‘˜%d %s %s"
+
+#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4424
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, 退出ç ä¸º %d"
+
+#: pg_backup_archiver.c:2511
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "记录 ID %d 超出范围 - å¯èƒ½æ˜¯æŸå了的 TOC"
+
+#: pg_backup_archiver.c:2578
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "ä¸å†æ”¯æŒä½¿ç”¨OID还原表"
+
+#: pg_backup_archiver.c:2660
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "未知编ç : \"%s\""
+
+#: pg_backup_archiver.c:2665
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "无效的ENCODINGæˆå‘˜:%s"
+
+#: pg_backup_archiver.c:2683
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "无效的STDSTRINGSæˆå‘˜:%s"
+
+#: pg_backup_archiver.c:2708
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "模å¼\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "表\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2722
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "索引\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2729
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "函数\"%s\"没有找到"
+
+#: pg_backup_archiver.c:2736
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "触å‘器\"%s\"没有找到"
+
+#: pg_backup_archiver.c:3128
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "无法设置会è¯ç”¨æˆ·ä¸º \"%s\": %s"
+
+#: pg_backup_archiver.c:3260
+msgid "could not set search_path to \"%s\": %s"
+msgstr "无法将search_path设置为\"%s\": %s"
+
+#: pg_backup_archiver.c:3322
+msgid "could not set default_tablespace to %s: %s"
+msgstr "无法将default_tablespace设置为%s: %s"
+
+#: pg_backup_archiver.c:3367
+msgid "could not set default_table_access_method: %s"
+msgstr "无法统设置default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3459 pg_backup_archiver.c:3617
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "ä¸çŸ¥é“如何为对象类型\"%s\"设置属主"
+
+#: pg_backup_archiver.c:3720
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "在文件头中没有找到魔术字串"
+
+#: pg_backup_archiver.c:3734
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "在文件头中有ä¸æ”¯æŒçš„版本 (%d.%d)"
+
+#: pg_backup_archiver.c:3739
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "整数尺寸 (%lu) çš„å¥å…¨æ£€æŸ¥å¤±è´¥"
+
+#: pg_backup_archiver.c:3743
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "å½’æ¡£ä¸æ˜¯åœ¨æ”¯æŒæ›´å¤§èŒƒå›´æ•´æ•°çš„主机上产生的, 有些æ“作å¯èƒ½å¤±è´¥"
+
+#: pg_backup_archiver.c:3753
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "é¢„æœŸçš„æ ¼å¼ (%d) å’Œåœ¨æ–‡ä»¶é‡Œæ‰¾åˆ°çš„æ ¼å¼ (%d) ä¸åŒ"
+
+#: pg_backup_archiver.c:3768
+#, c-format
+msgid "archive is compressed, but this installation does not support compression -- no data will be available"
+msgstr "归档是压缩过的, 但是当å‰å®‰è£…ä¸æ”¯æŒåŽ‹ç¼© -- æ•°æ®å°†ä¸å¯ä½¿ç”¨"
+
+#: pg_backup_archiver.c:3802
+#, c-format
+msgid "invalid creation date in header"
+msgstr "在头中的创建日期无效"
+
+#: pg_backup_archiver.c:3936
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "正在处ç†æˆå‘˜%d %s %s"
+
+#: pg_backup_archiver.c:4015
+#, c-format
+msgid "entering main parallel loop"
+msgstr "正在进入主并行循环"
+
+#: pg_backup_archiver.c:4026
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "忽略æˆå‘˜%d %s %s"
+
+#: pg_backup_archiver.c:4035
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "正在å¯åŠ¨æˆå‘˜%d %s %s"
+
+#: pg_backup_archiver.c:4089
+#, c-format
+msgid "finished main parallel loop"
+msgstr "已完æˆä¸»å¹¶è¡Œå¾ªçŽ¯"
+
+#: pg_backup_archiver.c:4125
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "正在处ç†ä¸¢å¤±çš„æˆå‘˜%d %s %s"
+
+#: pg_backup_archiver.c:4730
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "无法创建表\"%s\" , 这样无法æ¢å¤å®ƒçš„æ•°æ®"
+
+#: pg_backup_custom.c:376 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "大对象的无效 OID"
+
+#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629
+#: pg_backup_custom.c:865 pg_backup_tar.c:1080 pg_backup_tar.c:1085
+#, c-format
+msgid "error during file seek: %m"
+msgstr "在文件内定ä½æ—¶å‡ºé”™: %m"
+
+#: pg_backup_custom.c:478
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "æ•°æ®å—%d的寻é“ä½ç½®é”™è¯¯"
+
+#: pg_backup_custom.c:495
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "æœç´¢å½’档是碰到ä¸è¯†åˆ«çš„æ•°æ®å—类型 (%d)"
+
+#: pg_backup_custom.c:517
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "在归档中无法找到数æ®å—ID %d -- è¿™å¯èƒ½æ˜¯ç”±äºŽä¸æ­£å¸¸çš„æ¢å¤å¼•èµ·çš„,这ç§ä¸æ­£å¸¸çš„æ¢å¤é€šå¸¸å› ä¸ºç¼ºå°‘的输入文件而无法处ç†"
+
+#: pg_backup_custom.c:522
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "无法在归档中找到ID为%dçš„æ•°æ®å—--è¿™å¯èƒ½æ˜¯å› ä¸ºå½’档文件æŸå"
+
+#: pg_backup_custom.c:529
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "读å–æ•°æ®æ—¶å‘现æ„å¤–å— ID (%d) - 预期是 %d"
+
+#: pg_backup_custom.c:543
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "æ¢å¤å½’档时碰到ä¸è¯†åˆ«çš„æ•°æ®å—类型 %d"
+
+#: pg_backup_custom.c:645
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "无法从输入档案读å–:%m"
+
+#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943
+#: pg_backup_tar.c:1083
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "无法在归档文件中确定查找ä½ç½®: %m"
+
+#: pg_backup_custom.c:762 pg_backup_custom.c:802
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "无法关闭归档文件: %m"
+
+#: pg_backup_custom.c:785
+#, c-format
+msgid "can only reopen input archives"
+msgstr "åªèƒ½é‡æ–°æ‰“开输入归档"
+
+#: pg_backup_custom.c:792
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "ä¸æ”¯æŒä»Žæ ‡å‡†è¾“入进行并行æ¢å¤"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "ä¸æ”¯æŒä»Žä¸å¯éšæœºå¯»å€çš„文件里并行æ¢å¤"
+
+#: pg_backup_custom.c:810
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "无法在归档文件中设置查找ä½ç½®: %m"
+
+#: pg_backup_custom.c:889
+#, c-format
+msgid "compressor active"
+msgstr "压缩程åºå·²æ¿€æ´»"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "无法从 libpq 获å–æœåŠ¡å™¨ç‰ˆæœ¬"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1826
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "æœåŠ¡å™¨ç‰ˆæœ¬: %s; %s 版本: %s"
+
+#: pg_backup_db.c:55 pg_dumpall.c:1828
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "因为æœåŠ¡å™¨ç‰ˆæœ¬ä¸åŒ¹é…而终止"
+
+#: pg_backup_db.c:124
+#, c-format
+msgid "already connected to a database"
+msgstr "å·²ç»ä¸Žä¸€ä¸ªæ•°æ®åº“è”接"
+
+#: pg_backup_db.c:132 pg_backup_db.c:182 pg_dumpall.c:1655 pg_dumpall.c:1766
+msgid "Password: "
+msgstr "å£ä»¤: "
+
+#: pg_backup_db.c:174
+msgid "could not connect to database"
+msgstr "无法与数æ®åº“è”接"
+
+#: pg_backup_db.c:191
+msgid "reconnection failed: %s"
+msgstr "é‡æ–°è¿žæŽ¥å¤±è´¥: %s"
+
+#: pg_backup_db.c:194 pg_backup_db.c:269 pg_dumpall.c:1686 pg_dumpall.c:1776
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_backup_db.c:276 pg_dumpall.c:1889 pg_dumpall.c:1912
+#, c-format
+msgid "query failed: %s"
+msgstr "查询失败: %s"
+
+#: pg_backup_db.c:278 pg_dumpall.c:1890 pg_dumpall.c:1913
+#, c-format
+msgid "query was: %s"
+msgstr "查询是: %s"
+
+#: pg_backup_db.c:319
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "查询返回了%dæ¡è®°å½•ï¼Œè€Œä¸æ˜¯ä¸€æ¡è®°å½•: %s"
+msgstr[1] "查询返回了%dæ¡è®°å½•ï¼Œè€Œä¸æ˜¯ä¸€æ¡è®°å½•: %s"
+
+#: pg_backup_db.c:355
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s命令是: %s"
+
+#: pg_backup_db.c:411 pg_backup_db.c:485 pg_backup_db.c:492
+msgid "could not execute query"
+msgstr "无法执行查询"
+
+#: pg_backup_db.c:464
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData返回错误: %s"
+
+#: pg_backup_db.c:513
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd返回错误: %s"
+
+#: pg_backup_db.c:519
+msgid "COPY failed for table \"%s\": %s"
+msgstr "å¤åˆ¶è¡¨\"%s\"失败: %s"
+
+#: pg_backup_db.c:525 pg_dump.c:2074
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "å¤åˆ¶è¡¨\"%s\"时出现æ„外的é¢å¤–结果"
+
+#: pg_backup_db.c:537
+msgid "could not start database transaction"
+msgstr "无法开始数æ®åº“事务"
+
+#: pg_backup_db.c:545
+msgid "could not commit database transaction"
+msgstr "无法æ交数æ®åº“事务"
+
+#: pg_backup_directory.c:156
+#, c-format
+msgid "no output directory specified"
+msgstr "没有指定输出目录"
+
+#: pg_backup_directory.c:185
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读å–目录 \"%s\": %m"
+
+#: pg_backup_directory.c:189
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_backup_directory.c:195
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: pg_backup_directory.c:355 pg_backup_directory.c:496
+#: pg_backup_directory.c:532
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "无法写到输出文件: %s"
+
+#: pg_backup_directory.c:406
+msgid "could not close data file \"%s\": %m"
+msgstr "无法关闭数æ®æ–‡ä»¶\"%s\": %m"
+
+#: pg_backup_directory.c:446
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "无法为输入: %2$m打开大对象文件\"%1$s\""
+
+#: pg_backup_directory.c:457
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "无效行存在于大对象文件\"%s\": \"%s\""
+
+#: pg_backup_directory.c:466
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "在读å–大对象文件\"%s\"æ—¶å‘生错误"
+
+#: pg_backup_directory.c:470
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "无法关闭大对象 TOC 文件\"%s\": %m"
+
+#: pg_backup_directory.c:689
+#, c-format
+msgid "could not write to blobs TOC file"
+msgstr "无法写入BLOB到大对象TOC文件"
+
+#: pg_backup_directory.c:721
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "文件å超长: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "无法读å–这个格å¼"
+
+#: pg_backup_tar.c:177
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "无法为输出打开TOC文件\"%s\": %m"
+
+#: pg_backup_tar.c:184
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "无法为输出打开 TOC 文件: %m"
+
+#: pg_backup_tar.c:203 pg_backup_tar.c:352
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "ä¸æ”¯æŒtar归档格å¼çš„压缩"
+
+#: pg_backup_tar.c:211
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "无法为输入打开TOC文件\"%s\": %m"
+
+#: pg_backup_tar.c:218
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "无法为输入打开 TOC 文件: %m"
+
+#: pg_backup_tar.c:338
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "无法在归档中找到文件\"%s\""
+
+#: pg_backup_tar.c:404
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "无法生æˆä¸´æ—¶æ–‡ä»¶å: %m"
+
+#: pg_backup_tar.c:415
+#, c-format
+msgid "could not open temporary file"
+msgstr "无法打开临时文件"
+
+#: pg_backup_tar.c:442
+#, c-format
+msgid "could not close tar member"
+msgstr "无法关闭 tar æˆå‘˜"
+
+#: pg_backup_tar.c:685
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "æ„外的COPY语å¥è¯­æ³•: \"%s\""
+
+#: pg_backup_tar.c:952
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "用于大对象的éžæ³• OID (%u)"
+
+#: pg_backup_tar.c:1099
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "无法关闭临时文件: %m"
+
+#: pg_backup_tar.c:1108
+#, c-format
+msgid "actual file length (%s) does not match expected (%s)"
+msgstr "实际文件长度 (%s) ä¸åŒ¹é…预期的长度 (%s)"
+
+#: pg_backup_tar.c:1165 pg_backup_tar.c:1196
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "无法在tar归档中为文件\"%s\"找到标题头"
+
+#: pg_backup_tar.c:1183
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "这个归档格å¼é‡Œä¸æ”¯æŒä¸æŒ‰ç…§é¡ºåºè½¬å‚¨æ•°æ®: è¦æ±‚\"%s\" ,但它在归档文件里ä½äºŽ\"%s\"å‰é¢."
+
+#: pg_backup_tar.c:1230
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "找到未完æˆçš„tar文件头(%lu个字节)"
+msgstr[1] "找到未完æˆçš„tar文件头(%lu个字节)"
+
+#: pg_backup_tar.c:1281
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %s"
+msgstr "在文件 %1$s çš„ä½ç½® %4$s å‘现崩溃的 tar 头(预计在 %2$d, 计算出æ¥åœ¨ %3$d)"
+
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "无法识别的节å称: \"%s\""
+
+#: pg_backup_utils.c:55 pg_dump.c:622 pg_dump.c:639 pg_dumpall.c:341
+#: pg_dumpall.c:351 pg_dumpall.c:360 pg_dumpall.c:369 pg_dumpall.c:377
+#: pg_dumpall.c:391 pg_dumpall.c:469 pg_restore.c:284 pg_restore.c:300
+#: pg_restore.c:318
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_backup_utils.c:68
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "超出on_exit_nicely槽"
+
+#: pg_dump.c:548
+#, c-format
+msgid "compression level must be in range 0..9"
+msgstr "压缩级别必须ä½äºŽ0..9的范围内"
+
+#: pg_dump.c:586
+#, c-format
+msgid "extra_float_digits must be in range -15..3"
+msgstr "extra_float_digits必须在-15到3之间"
+
+#: pg_dump.c:609
+#, c-format
+msgid "rows-per-insert must be in range %d..%d"
+msgstr "rows-per-insertå¿…é¡»ä½äºŽ%d..%d的范围内"
+
+#: pg_dump.c:637 pg_dumpall.c:349 pg_restore.c:298
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_dump.c:658 pg_restore.c:327
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "选项 -s/--schema-onlyå’Œ-a/--data-only ä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_dump.c:663
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "选项 -s/--schema-onlyå’Œ--include-foreign-dataä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_dump.c:666
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "并行备份ä¸æ”¯æŒé€‰é¡¹--include-foreign-data"
+
+#: pg_dump.c:670 pg_restore.c:333
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "选项 -c/--cleanå’Œ -a/--data-onlyä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_dump.c:675 pg_dumpall.c:384 pg_restore.c:382
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "选项 --if-exists 需è¦é€‰é¡¹ -c/ --clean"
+
+#: pg_dump.c:682
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "选项---on-conflict-do-nothing需è¦é€‰é¡¹--inserts, --rows-per-insert 或者 --column-inserts"
+
+#: pg_dump.c:704
+#, c-format
+msgid "requested compression not available in this installation -- archive will be uncompressed"
+msgstr "所è¦æ±‚çš„åŽ‹ç¼©æ— æ³•åœ¨æœ¬æ¬¡å®‰è£…ä¸­èŽ·å– -- 归档将ä¸è¢«åŽ‹ç¼©"
+
+#: pg_dump.c:725 pg_restore.c:349
+#, c-format
+msgid "invalid number of parallel jobs"
+msgstr "无效的并行工作数"
+
+#: pg_dump.c:729
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "并行备份åªè¢«ç›®å½•æ ¼å¼æ”¯æŒ"
+
+#: pg_dump.c:784
+#, c-format
+msgid ""
+"Synchronized snapshots are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"当å‰æœåŠ¡å™¨ç‰ˆæœ¬ä¸æ”¯æŒåŒæ­¥å¿«ç…§.\n"
+"如果ä¸éœ€è¦åŒæ­¥å¿«ç…§åŠŸèƒ½ï¼Œ\n"
+"å¯ä»¥å¸¦å‚æ•° --no-synchronized-snapshotsè¿è¡Œ"
+
+#: pg_dump.c:790
+#, c-format
+msgid "Exported snapshots are not supported by this server version."
+msgstr "在这个版本的æœåŠ¡å™¨ä¸­ä¸æ”¯æŒå¯¼å‡ºçš„å¿«ç…§."
+
+#: pg_dump.c:802
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "最åŽçš„内置 OID 是 %u"
+
+#: pg_dump.c:811
+#, c-format
+msgid "no matching schemas were found"
+msgstr "没有找到符åˆçš„模å¼"
+
+#: pg_dump.c:825
+#, c-format
+msgid "no matching tables were found"
+msgstr "没有找到符åˆçš„表"
+
+#: pg_dump.c:847
+msgid "no matching extensions were found"
+msgstr "没有找到符åˆçš„扩展å"
+
+#: pg_dump.c:1017
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s 把一个数æ®åº“转储为纯文本文件或者是其它格å¼.\n"
+"\n"
+
+#: pg_dump.c:1018 pg_dumpall.c:622 pg_restore.c:462
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_dump.c:1019
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [选项]... [æ•°æ®åº“åå­—]\n"
+
+#: pg_dump.c:1021 pg_dumpall.c:625 pg_restore.c:465
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般选项:\n"
+
+#: pg_dump.c:1022
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME 输出文件或目录å\n"
+
+#: pg_dump.c:1023
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr ""
+" -F, --format=c|d|t|p è¾“å‡ºæ–‡ä»¶æ ¼å¼ (定制, 目录, tar\n"
+" 明文 (默认值))\n"
+
+#: pg_dump.c:1025
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM 执行多个并行任务进行备份转储工作\n"
+
+#: pg_dump.c:1026 pg_dumpall.c:627
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 详细模å¼\n"
+
+#: pg_dump.c:1027 pg_dumpall.c:628
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_dump.c:1028
+#, c-format
+msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+msgstr " -Z, --compress=0-9 被压缩格å¼çš„压缩级别\n"
+
+#: pg_dump.c:1029 pg_dumpall.c:629
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT 在等待表é”超时åŽæ“作失败\n"
+
+#: pg_dump.c:1030 pg_dumpall.c:656
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync ä¸ç”¨ç­‰å¾…å˜åŒ–安全写入ç£ç›˜\n"
+
+#: pg_dump.c:1031 pg_dumpall.c:630
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_dump.c:1033 pg_dumpall.c:631
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"控制输出内容选项:\n"
+
+#: pg_dump.c:1034 pg_dumpall.c:632
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only åªè½¬å‚¨æ•°æ®,ä¸åŒ…括模å¼\n"
+
+#: pg_dump.c:1035
+#, c-format
+msgid " -b, --blobs include large objects in dump\n"
+msgstr " -b, --blobs 在转储中包括大对象\n"
+
+#: pg_dump.c:1036
+#, c-format
+msgid " -B, --no-blobs exclude large objects in dump\n"
+msgstr " -B, --no-blobs 排除转储中的大型对象\n"
+
+#: pg_dump.c:1037 pg_restore.c:476
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean 在é‡æ–°åˆ›å»ºä¹‹å‰ï¼Œå…ˆæ¸…除(删除)数æ®åº“对象\n"
+
+#: pg_dump.c:1038
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create 在转储中包括命令,以便创建数æ®åº“\n"
+
+#: pg_dump.c:1039
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN 仅转储指定的扩展å\n"
+
+#: pg_dump.c:1040 pg_dumpall.c:634
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING 转储以ENCODINGå½¢å¼ç¼–ç çš„æ•°æ®\n"
+
+#: pg_dump.c:1041
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN åªè½¬å‚¨æŒ‡å®šçš„模å¼\n"
+
+#: pg_dump.c:1042
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN ä¸è½¬å‚¨æŒ‡å®šçš„模å¼\n"
+
+#: pg_dump.c:1043
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr " -O, --no-owner 在明文格å¼ä¸­, 忽略æ¢å¤å¯¹è±¡æ‰€å±žè€…\n"
+
+#: pg_dump.c:1045 pg_dumpall.c:638
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only åªè½¬å‚¨æ¨¡å¼, ä¸åŒ…括数æ®\n"
+
+#: pg_dump.c:1046
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME 在明文格å¼ä¸­ä½¿ç”¨æŒ‡å®šçš„超级用户å\n"
+
+#: pg_dump.c:1047
+msgid " -t, --table=PATTERN dump the specified table(s) only\n"
+msgstr " -t, --table=PATTERN åªè½¬å‚¨æŒ‡å®šçš„表\n"
+
+#: pg_dump.c:1048
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN ä¸è½¬å‚¨æŒ‡å®šçš„表\n"
+
+#: pg_dump.c:1049 pg_dumpall.c:641
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges ä¸è¦è½¬å‚¨æƒé™ (grant/revoke)\n"
+
+#: pg_dump.c:1050 pg_dumpall.c:642
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade åªèƒ½ç”±å‡çº§å·¥å…·ä½¿ç”¨\n"
+
+#: pg_dump.c:1051 pg_dumpall.c:643
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts 以带有列åçš„INSERT命令形å¼è½¬å‚¨æ•°æ®\n"
+
+#: pg_dump.c:1052 pg_dumpall.c:644
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting å–消美元 (符å·) 引å·, 使用 SQL 标准引å·\n"
+
+#: pg_dump.c:1053 pg_dumpall.c:645 pg_restore.c:493
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers 在åªæ¢å¤æ•°æ®çš„过程中ç¦ç”¨è§¦å‘器\n"
+
+#: pg_dump.c:1054
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr " --enable-row-security å¯ç”¨è¡Œå®‰å…¨æ€§ï¼ˆåªè½¬å‚¨ç”¨æˆ·èƒ½å¤Ÿè®¿é—®çš„内容)\n"
+
+#: pg_dump.c:1056
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN ä¸è½¬å‚¨æŒ‡å®šçš„表中的数æ®\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:647
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM 覆盖extra_float_digits的默认设置\n"
+
+#: pg_dump.c:1058 pg_dumpall.c:648 pg_restore.c:495
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists 当删除对象时使用IF EXISTS\n"
+
+#: pg_dump.c:1059
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" 包å«å¤–部æœåŠ¡å™¨ä¸Šä¸Žæ¨¡å¼åŒ¹é…çš„\n"
+" 外部表的数æ®\n"
+
+#: pg_dump.c:1062 pg_dumpall.c:649
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts 以INSERT命令,而ä¸æ˜¯COPY命令的形å¼è½¬å‚¨æ•°æ®\n"
+
+#: pg_dump.c:1063 pg_dumpall.c:650
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root 通过根表加载分区\n"
+
+#: pg_dump.c:1064 pg_dumpall.c:651
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments ä¸è½¬å‚¨æ³¨é‡Š\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:652
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications ä¸è½¬å‚¨å‘布\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:654
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels ä¸è½¬å‚¨å®‰å…¨æ ‡ç­¾çš„分é…\n"
+
+#: pg_dump.c:1067 pg_dumpall.c:655
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions ä¸è½¬å‚¨è®¢é˜…\n"
+
+#: pg_dump.c:1068
+#, c-format
+msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n"
+msgstr " --no-synchronized-snapshots 在并行工作集中ä¸ä½¿ç”¨åŒæ­¥å¿«ç…§\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:657
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces ä¸è½¬å‚¨è¡¨ç©ºé—´åˆ†é…ä¿¡æ¯\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:658
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression ä¸è½¬å‚¨TOAST压缩方法\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:659
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data ä¸è½¬å‚¨æ²¡æœ‰æ—¥å¿—的表数æ®\n"
+
+#: pg_dump.c:1072 pg_dumpall.c:660
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing 将ON CONFLICT DO NOTHING添加到INSERT命令\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:661
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers 所有标识符加引å·ï¼Œå³ä½¿ä¸æ˜¯å…³é”®å­—\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:662
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS æ¯ä¸ªæ’入的行数;æ„味ç€--inserts\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION 备份命å的节 (æ•°æ®å‰, æ•°æ®, åŠ æ•°æ®åŽ)\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable 等到备份å¯ä»¥æ— å¼‚常è¿è¡Œ\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT 为转储使用给定的快照\n"
+
+#: pg_dump.c:1078 pg_restore.c:504
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr " --strict-names è¦æ±‚æ¯ä¸ªè¡¨å’Œ(或)schema包括模å¼ä»¥åŒ¹é…至少一个实体\n"
+
+#: pg_dump.c:1080 pg_dumpall.c:663 pg_restore.c:506
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" 使用 SESSION AUTHORIZATION 命令代替\n"
+" ALTER OWNER 命令æ¥è®¾ç½®æ‰€æœ‰æƒ\n"
+
+#: pg_dump.c:1084 pg_dumpall.c:667 pg_restore.c:510
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"è”接选项:\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME 对数æ®åº“ DBNAME备份\n"
+
+#: pg_dump.c:1086 pg_dumpall.c:669 pg_restore.c:511
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=主机å æ•°æ®åº“æœåŠ¡å™¨çš„主机å或套接字目录\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:671 pg_restore.c:512
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=端å£å· æ•°æ®åº“æœåŠ¡å™¨çš„端å£å·\n"
+
+#: pg_dump.c:1088 pg_dumpall.c:672 pg_restore.c:513
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=åå­— 以指定的数æ®åº“用户è”接\n"
+
+#: pg_dump.c:1089 pg_dumpall.c:673 pg_restore.c:514
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远ä¸æ示输入å£ä»¤\n"
+
+#: pg_dump.c:1090 pg_dumpall.c:674 pg_restore.c:515
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password 强制å£ä»¤æ示 (自动)\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:675
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME 在转储å‰è¿è¡ŒSET ROLE\n"
+
+#: pg_dump.c:1093
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有æ供数æ®åº“åå­—, 那么使用 PGDATABASE 环境å˜é‡\n"
+"的数值.\n"
+"\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:679 pg_restore.c:522
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: pg_dump.c:1096 pg_dumpall.c:680 pg_restore.c:523
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:504
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "å£°æ˜Žäº†æ— æ•ˆçš„è¾“å‡ºæ ¼å¼ \"%s\""
+
+#: pg_dump.c:1261
+#, c-format
+msgid ""
+"Synchronized snapshots on standby servers are not supported by this server version.\n"
+"Run with --no-synchronized-snapshots instead if you do not need\n"
+"synchronized snapshots."
+msgstr ""
+"当å‰æœåŠ¡å™¨ç‰ˆæœ¬ä¸æ”¯æŒå¤‡ç”¨æœåŠ¡å™¨ä¸Šçš„åŒæ­¥å¿«ç…§.\n"
+"如果ä¸éœ€è¦åŒæ­¥å¿«ç…§åŠŸèƒ½ï¼Œ\n"
+"å¯ä»¥å¸¦å‚æ•° --no-synchronized-snapshotsè¿è¡Œ."
+
+#: pg_dump.c:1330
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "声明了éžæ³•çš„è¾“å‡ºæ ¼å¼ \"%s\""
+
+#: pg_dump.c:1368
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "没有为\"%s\"模å¼æ‰¾åˆ°åŒ¹é…çš„schemas"
+
+#: pg_dump.c:1415
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "没有为\"%s\"模å¼æ‰¾åˆ°åŒ¹é…的扩展"
+
+#: pg_dump.c:1462
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "没有为\"%s\"模å¼æ‰¾åˆ°åŒ¹é…的外部æœåŠ¡å™¨"
+
+#: pg_dump.c:1525
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "没有为\"%s\"模å¼æ‰¾åˆ°åŒ¹é…的表"
+
+#: pg_dump.c:1948
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "正在转储表\"%s.%s\"的内容"
+
+#: pg_dump.c:2055
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "转储表 \"%s\" 的内容的 SQL 命令失败: PQendcopy() 失败."
+
+#: pg_dump.c:2056 pg_dump.c:2066
+#, c-format
+msgid "Error message from server: %s"
+msgstr "æ¥è‡ªæœåŠ¡å™¨çš„错误信æ¯: %s"
+
+#: pg_dump.c:2057 pg_dump.c:2067
+#, c-format
+msgid "The command was: %s"
+msgstr "命令是: %s"
+
+#: pg_dump.c:2065
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "转储表 \"%s\" 的内容失败: PQgetResult() 失败."
+
+#: pg_dump.c:2825
+#, c-format
+msgid "saving database definition"
+msgstr "ä¿å­˜æ•°æ®åº“定义"
+
+#: pg_dump.c:3297
+#, c-format
+msgid "saving encoding = %s"
+msgstr "正在ä¿å­˜encoding = %s"
+
+#: pg_dump.c:3322
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "正在ä¿å­˜standard_conforming_strings = %s"
+
+#: pg_dump.c:3361
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "无法解æžcurrent_schemas()的结果"
+
+#: pg_dump.c:3380
+#, c-format
+msgid "saving search_path = %s"
+msgstr "正在ä¿å­˜search_path = %s"
+
+#: pg_dump.c:3420
+#, c-format
+msgid "reading large objects"
+msgstr "正在读å–大对象"
+
+#: pg_dump.c:3602
+#, c-format
+msgid "saving large objects"
+msgstr "ä¿å­˜å¤§å¯¹è±¡"
+
+#: pg_dump.c:3648
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "在读å–大对象时å‘生错误%u: %s"
+
+#: pg_dump.c:3700
+#, c-format
+msgid "reading row security enabled for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读å–行安全性å¯ç”¨çŠ¶æ€"
+
+#: pg_dump.c:3731
+#, c-format
+msgid "reading policies for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读å–ç­–ç•¥"
+
+#: pg_dump.c:3883
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "æ„外的策略命令类型:%c"
+
+#: pg_dump.c:4037
+#, c-format
+msgid "owner of publication \"%s\" appears to be invalid"
+msgstr "å‘è¡Œ \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:4329
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "订阅未转储,因为当å‰ç”¨æˆ·ä¸æ˜¯è¶…级用户"
+
+#: pg_dump.c:4400
+#, c-format
+msgid "owner of subscription \"%s\" appears to be invalid"
+msgstr "函数订阅\"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:4443
+#, c-format
+msgid "could not parse subpublications array"
+msgstr "无法解æžå­å‘行数组"
+
+#: pg_dump.c:4801
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "无法找到父扩展%s %s"
+
+#: pg_dump.c:4933
+#, c-format
+msgid "owner of schema \"%s\" appears to be invalid"
+msgstr "æ¨¡å¼ \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:4956
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID 为 %u 的模å¼ä¸å­˜åœ¨"
+
+#: pg_dump.c:5285
+#, c-format
+msgid "owner of data type \"%s\" appears to be invalid"
+msgstr "æ•°æ®ç±»åž‹ \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:5369
+#, c-format
+msgid "owner of operator \"%s\" appears to be invalid"
+msgstr "æ“作符 \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:5668
+#, c-format
+msgid "owner of operator class \"%s\" appears to be invalid"
+msgstr "æ“作符表 \"%s\" 无效"
+
+#: pg_dump.c:5751
+#, c-format
+msgid "owner of operator family \"%s\" appears to be invalid"
+msgstr "æ“作符 \"%s\" 的所有者无效"
+
+#: pg_dump.c:5919
+#, c-format
+msgid "owner of aggregate function \"%s\" appears to be invalid"
+msgstr "èšé›†å‡½æ•° \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:6178
+#, c-format
+msgid "owner of function \"%s\" appears to be invalid"
+msgstr "函数 \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:7005
+#, c-format
+msgid "owner of table \"%s\" appears to be invalid"
+msgstr "æ•°æ®è¡¨ \"%s\" 的所有者éžæ³•"
+
+#: pg_dump.c:7047 pg_dump.c:17485
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "å¥å…¨æ£€æŸ¥å¤±è´¥,åºåˆ—OID %2$u çš„æºè¡¨ OID%1$u 未找到"
+
+#: pg_dump.c:7186
+#, c-format
+msgid "reading indexes for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读å–索引"
+
+#: pg_dump.c:7600
+#, c-format
+msgid "reading foreign key constraints for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读å–外键约æŸ"
+
+#: pg_dump.c:7879
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "å¥å…¨æ£€æŸ¥å¤±è´¥,pg_rewrite项OID %2$u çš„æºè¡¨ OID%1$u 未找到"
+
+#: pg_dump.c:7963
+#, c-format
+msgid "reading triggers for table \"%s.%s\""
+msgstr "为表\"%s.%s\"读å–触å‘器"
+
+#: pg_dump.c:8144
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "对在表 \"%2$s\" 上的外键触å‘器 \"%1$s\" 上的查询生æˆäº† NULL 个引用表(表的 OID 是: %3$u)"
+
+#: pg_dump.c:8694
+#, c-format
+msgid "finding the columns and types of table \"%s.%s\""
+msgstr "正在查找表\"%s.%s\"的列和类型"
+
+#: pg_dump.c:8818
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "在表 \"%s\" 中的字段个数是无效的"
+
+#: pg_dump.c:8857
+#, c-format
+msgid "finding default expressions of table \"%s.%s\""
+msgstr "正在查找表\"%s.%s\"的默认表达å¼"
+
+#: pg_dump.c:8879
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "表 \"%2$s\" 的无效 adnum 值 %1$d"
+
+#: pg_dump.c:8972
+#, c-format
+msgid "finding check constraints for table \"%s.%s\""
+msgstr "正在查找表\"%s.%s\"的检查约æŸ"
+
+#: pg_dump.c:9021
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "在表\"%2$s\"上期望有%1$d个检查约æŸ,但是找到了%3$d个"
+msgstr[1] "在表\"%2$s\"上期望有%1$d个检查约æŸ,但是找到了%3$d个"
+
+#: pg_dump.c:9025
+#, c-format
+msgid "(The system catalogs might be corrupted.)"
+msgstr "(系统表å¯èƒ½æŸå了.)"
+
+#: pg_dump.c:10610
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "æ•°æ®ç±»åž‹ \"%s\" 的所有者看起æ¥æ— æ•ˆ"
+
+#: pg_dump.c:11962
+#, c-format
+msgid "bogus value in proargmodes array"
+msgstr "æ— æ³•åˆ†æž proargmodes 数组"
+
+#: pg_dump.c:12269
+#, c-format
+msgid "could not parse proallargtypes array"
+msgstr "æ— æ³•åˆ†æž proallargtypes 数组"
+
+#: pg_dump.c:12285
+#, c-format
+msgid "could not parse proargmodes array"
+msgstr "æ— æ³•åˆ†æž proargmodes 数组"
+
+#: pg_dump.c:12299
+#, c-format
+msgid "could not parse proargnames array"
+msgstr "æ— æ³•åˆ†æž proargnames 数组"
+
+#: pg_dump.c:12309
+#, c-format
+msgid "could not parse proconfig array"
+msgstr "æ— æ³•è§£æž proconfig 数组"
+
+#: pg_dump.c:12389
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "函数 \"%s\" çš„æ„外正å‘易失值"
+
+#: pg_dump.c:12439 pg_dump.c:14390
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "函数\"%s\"的proparallel值无法识别"
+
+#: pg_dump.c:12578 pg_dump.c:12687 pg_dump.c:12694
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "找ä¸åˆ°å¸¦æœ‰OID %u的函数的函数定义"
+
+#: pg_dump.c:12617
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "在pg_cast.castfunc或者pg_cast.castmethod字段中的是å‡å€¼"
+
+#: pg_dump.c:12620
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "在pg_cast.castmethod字段中的是å‡å€¼"
+
+#: pg_dump.c:12713
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "臆造的转æ¢å®šä¹‰ï¼Œè‡³å°‘trffromsqlå’Œtrftosql之一应该为éžé›¶"
+
+#: pg_dump.c:12730
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "在pg_transform.trffromsql域中的是臆造值"
+
+#: pg_dump.c:12751
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "在pg_transform.trftosql域中的是臆造值"
+
+#: pg_dump.c:12903
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "è¿ä¸å†æ”¯æŒåŽç¼€è¿ç®—符(è¿ç®—符\"%s\")"
+
+#: pg_dump.c:13073
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "未找到 OID 为 %s çš„æ“作符"
+
+#: pg_dump.c:13141
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "访问方法\"%2$s\"的类型\"%1$c\"无效"
+
+#: pg_dump.c:13895
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "无法识别的排åºè§„则æ供程åº: %s"
+
+#: pg_dump.c:14309
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "无法识别的aggfinalmodifyèšåˆå€¼ \"%s\""
+
+#: pg_dump.c:14365
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "无法识别的aggmfinalmodifyèšåˆå€¼ \"%s\""
+
+#: pg_dump.c:15087
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "缺çœæƒé™ä¸­å­˜åœ¨æœªçŸ¥å¯¹è±¡ç±»åž‹: %d"
+
+#: pg_dump.c:15105
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "无法解æžç¼ºçœACL列表(%s)"
+
+#: pg_dump.c:15190
+#, c-format
+msgid "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "无法为对象\"%3$s\" (%4$s)解æžåˆå§‹GRANT ACL列表 (%1$s) 或者åˆå§‹REVOKE ACL列表 (%2$s) "
+
+#: pg_dump.c:15198
+#, c-format
+msgid "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)"
+msgstr "无法为对象\"%3$s\" (%4$s)解æžGRANT ACL列表 (%1$s) 或者REVOKE ACL列表 (%2$s)"
+
+#: pg_dump.c:15713
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "获å–视图 \"%s\" 定义的查询没有返回数æ®"
+
+#: pg_dump.c:15716
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "获å–视图 \"%s\" 定义的查询返回超过一个定义"
+
+#: pg_dump.c:15723
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "视图 \"%s\" 的定义是空的(零长)"
+
+#: pg_dump.c:15807
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "ä¸å†æ”¯æŒ WITH OIDS (表\"%s\")"
+
+#: pg_dump.c:16672
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "对于表 \"%2$s\" 字段个数 %1$d 是无效的"
+
+#: pg_dump.c:16749
+msgid "could not parse index statistic columns"
+msgstr "无法解æžç´¢å¼•ç»Ÿè®¡åˆ—"
+
+#: pg_dump.c:16751
+msgid "could not parse index statistic values"
+msgstr "无法解æžç´¢å¼•ç»Ÿè®¡å€¼"
+
+#: pg_dump.c:16753
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr ""
+
+#: pg_dump.c:16970
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "å¯¹äºŽçº¦æŸ \"%s\" 缺少索引"
+
+#: pg_dump.c:17195
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "未知的约æŸç±»åž‹: %c"
+
+#: pg_dump.c:17327 pg_dump.c:17550
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "查询得到了åºåˆ—\"%s\"çš„æ•°æ®ï¼Œè¿”回了%dæ¡è®°å½•(期望一æ¡)"
+msgstr[1] "查询得到了åºåˆ—\"%s\"çš„æ•°æ®ï¼Œè¿”回了%dæ¡è®°å½•(期望一æ¡)"
+
+#: pg_dump.c:17361
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "无法识别的åºåˆ—类型: %s"
+
+#: pg_dump.c:17648
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "æ„外的tgtype值: %d"
+
+#: pg_dump.c:17722
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "给表 \"%3$s\" 上的触å‘器 \"%2$s\" 的错误å‚æ•° (%1$s)"
+
+#: pg_dump.c:17991
+#, 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:18153
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "找ä¸åˆ°å¼•ç”¨çš„扩展å%u"
+
+#: pg_dump.c:18244
+msgid "could not parse extension configuration array"
+msgstr "无法解æžæ‰©å±•é…置数组"
+
+#: pg_dump.c:18246
+msgid "could not parse extension condition array"
+msgstr "无法解æžæ‰©å±•æ¡ä»¶æ•°ç»„"
+
+#: pg_dump.c:18248
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "扩展的é…置和æ¡ä»¶æ•°é‡ä¸åŒ¹é…"
+
+#: pg_dump.c:18380
+#, c-format
+msgid "reading dependency data"
+msgstr "读å–从属数æ®"
+
+#: pg_dump.c:18473
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "没有引用对象%u %u"
+
+#: pg_dump.c:18484
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "没有引用的对象 %u %u"
+
+#: pg_dump.c:18858
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "æ— æ³•è§£æž reloptions 数组"
+
+#: pg_dump_sort.c:411
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "无效的dumpId %d"
+
+#: pg_dump_sort.c:417
+#, c-format
+msgid "invalid dependency %d"
+msgstr "无效的ä¾èµ– %d"
+
+#: pg_dump_sort.c:650
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "无法标识循环ä¾èµ–"
+
+#: pg_dump_sort.c:1221
+#, 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] "表上存在循环外键约æŸï¼š"
+msgstr[1] "表上存在循环外键约æŸï¼š"
+
+#: pg_dump_sort.c:1225 pg_dump_sort.c:1245
+#, c-format
+msgid " %s"
+msgstr " %s"
+
+#: pg_dump_sort.c:1226
+#, 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:1227
+#, 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:1239
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "无法解æžè¿™äº›é¡¹çš„循环ä¾èµ–:"
+
+#: pg_dumpall.c:202
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需è¦ç¨‹åº\"%1$s\"\n"
+"但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n"
+"检查您的安装."
+
+#: pg_dumpall.c:207
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程åº\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本ä¸åŒ.\n"
+"检查您的安装."
+
+#: pg_dumpall.c:359
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "选项--exclude-databaseä¸èƒ½ä¸Ž-g/--globals-onlyã€-r/--roles-only或-t/--tablespaces-only一起使用"
+
+#: pg_dumpall.c:368
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "选项-g/--globals-onlyå’Œ-r/--roles-onlyä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_dumpall.c:376
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "选项 -g/--globals-onlyå’Œ-t/--tablespaces-onlyä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "选项 -r/--roles-onlyå’Œ -t/--tablespaces-onlyä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_dumpall.c:453 pg_dumpall.c:1756
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "无法与数æ®åº“ \"%s\" è”接"
+
+#: pg_dumpall.c:467
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"无法连接到数æ®åº“ \"postgres\"或\"template1\"\n"
+"请指定å¦å¤–一个数æ®åº“."
+
+#: pg_dumpall.c:621
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s 抽å–一个 PostgreSQL æ•°æ®åº“簇进一个 SQL 脚本文件.\n"
+"\n"
+
+#: pg_dumpall.c:623
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [选项]...\n"
+
+#: pg_dumpall.c:626
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME 输出文件å\n"
+
+#: pg_dumpall.c:633
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean 在é‡æ–°åˆ›å»ºæ•°æ®åº“å‰å…ˆæ¸…除(删除)æ•°æ®åº“\n"
+
+#: pg_dumpall.c:635
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only åªè½¬å‚¨å…¨å±€å¯¹è±¡, ä¸åŒ…括数æ®åº“\n"
+
+#: pg_dumpall.c:636 pg_restore.c:485
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner ä¸æ¢å¤å¯¹è±¡æ‰€å±žè€…\n"
+
+#: pg_dumpall.c:637
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only åªè½¬å‚¨è§’色,ä¸åŒ…括数æ®åº“或表空间\n"
+
+#: pg_dumpall.c:639
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME 在转储中, 指定的超级用户å\n"
+
+#: pg_dumpall.c:640
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only åªè½¬å‚¨è¡¨ç©ºé—´ï¼Œè€Œä¸è½¬å‚¨æ•°æ®åº“或角色\n"
+
+#: pg_dumpall.c:646
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN 排除å称与PATTERN匹é…çš„æ•°æ®åº“\n"
+
+#: pg_dumpall.c:653
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords ä¸è½¬å‚¨è§’色的密ç \n"
+
+#: pg_dumpall.c:668
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR 连接数æ®åº“使用的连接串\n"
+
+#: pg_dumpall.c:670
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME å¦ä¸€ä¸ªç¼ºçœæ•°æ®åº“\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有使用 -f/--file,那么将把SQL脚本写到标准输出.\n"
+"\n"
+
+#: pg_dumpall.c:883
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "以\"pg_\"开始的角色å称已被跳过 (%s)"
+
+#: pg_dumpall.c:1284
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "无法为表空间 \"%2$s\" åˆ†æž ACL 列表 (%1$s)"
+
+#: pg_dumpall.c:1501
+msgid "excluding database \"%s\""
+msgstr "正在排除数æ®åº“ \"%s\""
+
+#: pg_dumpall.c:1505
+msgid "dumping database \"%s\""
+msgstr "正在转储数æ®åº“ \"%s\""
+
+#: pg_dumpall.c:1537
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump 失败在数æ®åº“ \"%s\", 正在退出"
+
+#: pg_dumpall.c:1546
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "无法é‡æ–°æ‰“开输出文件 \"%s\":%m"
+
+#: pg_dumpall.c:1590
+#, c-format
+msgid "running \"%s\""
+msgstr "正在è¿è¡Œ \"%s\""
+
+#: pg_dumpall.c:1805
+#, c-format
+msgid "could not get server version"
+msgstr "无法从æœåŠ¡å™¨èŽ·å–版本"
+
+#: pg_dumpall.c:1811
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "无法分æžç‰ˆæœ¬å­—串 \"%s\""
+
+#: pg_dumpall.c:1883 pg_dumpall.c:1906
+#, c-format
+msgid "executing %s"
+msgstr "正在执行: %s"
+
+#: pg_restore.c:308
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "必须指定-d/--dbname和-f/--file之一"
+
+#: pg_restore.c:317
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "选项 -d/--dbnameå’Œ-f/--fileä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_restore.c:343
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "选项 -C/--createå’Œ -1/--single-transactionä¸èƒ½åŒæ—¶ä½¿ç”¨"
+
+#: pg_restore.c:357
+#, c-format
+msgid "maximum number of parallel jobs is %d"
+msgstr "å·²ç»è¾¾åˆ°å¹¶è¡Œå·¥ä½œé›†çš„最大数 %d"
+
+#: pg_restore.c:366
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "ä¸èƒ½åŒæ—¶æŒ‡å®šé€‰é¡¹--single-transaction和多个任务"
+
+#: pg_restore.c:408
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "ä¸å¯è¯†åˆ«çš„归档格å¼\"%s\"; 请指定 \"c\", \"d\", 或 \"t\""
+
+#: pg_restore.c:448
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "æ¢å¤ä¸­å¿½ç•¥é”™è¯¯: %d"
+
+#: pg_restore.c:461
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s 从一个归档中æ¢å¤ä¸€ä¸ªç”± pg_dump 创建的 PostgreSQL æ•°æ®åº“.\n"
+"\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr " %s [选项]... [文件å]\n"
+
+#: pg_restore.c:466
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=åå­— 连接数æ®åº“åå­—\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=文件å 输出文件å(- 对于stdout)\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t 备份文件格å¼(应该自动进行)\n"
+
+#: pg_restore.c:469
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list 打å°å½’档文件的 TOC 概述\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 详细模å¼\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"æ¢å¤æŽ§åˆ¶é€‰é¡¹:\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only åªæ¢å¤æ•°æ®, ä¸åŒ…括模å¼\n"
+
+#: pg_restore.c:477
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create 创建目标数æ®åº“\n"
+
+#: pg_restore.c:478
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error å‘生错误退出, 默认为继续\n"
+
+#: pg_restore.c:479
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME æ¢å¤æŒ‡å®šå称的索引\n"
+
+#: pg_restore.c:480
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM 执行多个并行任务进行æ¢å¤å·¥ä½œ\n"
+
+#: pg_restore.c:481
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr ""
+" -L, --use-list=FILENAME 从这个文件中使用指定的内容表排åº\n"
+" 输出\n"
+
+#: pg_restore.c:483
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME 在这个模å¼ä¸­åªæ¢å¤å¯¹è±¡\n"
+
+#: pg_restore.c:484
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME ä¸æ¢å¤æ­¤æ¨¡å¼ä¸­çš„对象\n"
+
+#: pg_restore.c:486
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) æ¢å¤æŒ‡å®šå字的函数\n"
+
+#: pg_restore.c:487
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only åªæ¢å¤æ¨¡å¼, ä¸åŒ…括数æ®\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME 使用指定的超级用户æ¥ç¦ç”¨è§¦å‘器\n"
+
+#: pg_restore.c:489
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME æ¢å¤å‘½å关系(表ã€è§†å›¾ç­‰ï¼‰\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME æ¢å¤æŒ‡å®šå字的触å‘器\n"
+
+#: pg_restore.c:491
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges 跳过处ç†æƒé™çš„æ¢å¤ (grant/revoke)\n"
+
+#: pg_restore.c:492
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction 作为å•ä¸ªäº‹åŠ¡æ¢å¤\n"
+
+#: pg_restore.c:494
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security å¯ç”¨è¡Œå®‰å…¨æ€§\n"
+
+#: pg_restore.c:496
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments ä¸æ¢å¤æ³¨é‡Š\n"
+
+#: pg_restore.c:497
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr ""
+" --no-data-for-failed-tables 对那些无法创建的表ä¸è¿›è¡Œ\n"
+" æ•°æ®æ¢å¤\n"
+
+#: pg_restore.c:499
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications ä¸æ¢å¤å‘è¡Œ\n"
+
+#: pg_restore.c:500
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels ä¸æ¢å¤å®‰å…¨æ ‡ç­¾ä¿¡æ¯\n"
+
+#: pg_restore.c:501
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions ä¸æ¢å¤è®¢é˜…\n"
+
+#: pg_restore.c:502
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces ä¸æ¢å¤è¡¨ç©ºé—´çš„分é…ä¿¡æ¯\n"
+
+#: pg_restore.c:503
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION æ¢å¤å‘½å节 (æ•°æ®å‰ã€æ•°æ®åŠæ•°æ®åŽ)\n"
+
+#: pg_restore.c:516
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME 在æ¢å¤å‰æ‰§è¡ŒSET ROLEæ“作\n"
+
+#: pg_restore.c:518
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"选项 -I, -n, -N, -P, -t, -T, ä»¥åŠ --section å¯ä»¥ç»„åˆä½¿ç”¨å’ŒæŒ‡å®š\n"
+"多次用于选择多个对象.\n"
+
+#: pg_restore.c:521
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"如果没有æ供输入文件å, 则使用标准输入.\n"
+"\n"
+
diff --git a/src/bin/pg_dump/po/zh_TW.po b/src/bin/pg_dump/po/zh_TW.po
new file mode 100644
index 0000000..03726f1
--- /dev/null
+++ b/src/bin/pg_dump/po/zh_TW.po
@@ -0,0 +1,3300 @@
+# Traditional Chinese message translation file for pg_dump
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_dump (PostgreSQL) package.
+# 2004-12-13 Zhenbang Wei <znbang@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_dump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:51+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+#: ../../common/compression.c:132 ../../common/compression.c:141
+#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420
+#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25
+#: compress_zstd.c:31
+#, c-format
+msgid "this build does not support compression with %s"
+msgstr "此版本ä¸æ”¯æ´ä½¿ç”¨ %s 進行壓縮"
+
+#: ../../common/compression.c:205
+msgid "found empty string where a compression option was expected"
+msgstr "在é æœŸå£“縮é¸é …的地方發ç¾ç©ºå­—串"
+
+#: ../../common/compression.c:244
+#, c-format
+msgid "unrecognized compression option: \"%s\""
+msgstr "無法辨識的壓縮é¸é …: %s"
+
+# bootstrap/bootstrap.c:304 postmaster/postmaster.c:500 tcop/postgres.c:2507
+#: ../../common/compression.c:283
+#, c-format
+msgid "compression option \"%s\" requires a value"
+msgstr "壓縮é¸é … \"%s\" 需è¦æ供數值"
+
+# commands/define.c:233
+#: ../../common/compression.c:292
+#, c-format
+msgid "value for compression option \"%s\" must be an integer"
+msgstr "壓縮é¸é … \"%s\" 的數值必須是整數"
+
+# commands/define.c:233
+#: ../../common/compression.c:331
+#, c-format
+msgid "value for compression option \"%s\" must be a Boolean value"
+msgstr "壓縮é¸é … \"%s\" 的數值必須是布林值"
+
+# commands/indexcmds.c:623
+#: ../../common/compression.c:379
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a compression level"
+msgstr "壓縮演算法 \"%s\" ä¸æŽ¥å—壓縮等級"
+
+#: ../../common/compression.c:386
+#, c-format
+msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)"
+msgstr "壓縮演算法 \"%s\" é æœŸçš„壓縮等級應在 %d 到 %d 之間(é è¨­å€¼ %d)"
+
+# commands/indexcmds.c:623
+#: ../../common/compression.c:397
+#, c-format
+msgid "compression algorithm \"%s\" does not accept a worker count"
+msgstr "壓縮演算法 \"%s\" ä¸æ”¯æ´å·¥ä½œåŸ·è¡Œç·’數目設定"
+
+# commands/indexcmds.c:224
+#: ../../common/compression.c:408
+#, c-format
+msgid "compression algorithm \"%s\" does not support long-distance mode"
+msgstr "壓縮演算法 \"%s\" ä¸æ”¯æ´é•·è·é›¢æ¨¡å¼"
+
+# command.c:122
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "無效的執行檔 \"%s\": %m"
+
+# command.c:1103
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "無法讀å–執行檔 \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\""
+
+# utils/error/elog.c:1128
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "無法將路徑 \"%s\" 解æžç‚ºçµ•å°è·¯å¾‘: %m"
+
+# fe-misc.c:991
+#: ../../common/exec.c:412 parallel.c:1609
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 失敗: %m"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體ä¸è¶³\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "無法執行的命令"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "找ä¸åˆ°å‘½ä»¤"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¡Œç¨‹å› ç•°å¸¸ 0x%X 而åœæ­¢"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¡Œç¨‹å› ä¿¡è™Ÿ %d 而åœæ­¢: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¡Œç¨‹å› ä¸æ˜Žç‹€æ…‹ %d 而åœæ­¢"
+
+# utils/adt/formatting.c:2044
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "é¸é … %2$s 的值 \"%1$s\" 無效"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§"
+
+#: common.c:132
+#, c-format
+msgid "reading extensions"
+msgstr "讀å–擴充模組"
+
+#: common.c:135
+#, c-format
+msgid "identifying extension members"
+msgstr "識別擴充模組æˆå“¡"
+
+#: common.c:138
+#, c-format
+msgid "reading schemas"
+msgstr "è®€å– schema"
+
+#: common.c:147
+#, c-format
+msgid "reading user-defined tables"
+msgstr "讀å–使用者自定資料表"
+
+#: common.c:152
+#, c-format
+msgid "reading user-defined functions"
+msgstr "讀å–使用者自定函數"
+
+#: common.c:156
+#, c-format
+msgid "reading user-defined types"
+msgstr "讀å–使用者自定資料型別"
+
+#: common.c:160
+#, c-format
+msgid "reading procedural languages"
+msgstr "讀å–程åºèªžè¨€"
+
+#: common.c:163
+#, c-format
+msgid "reading user-defined aggregate functions"
+msgstr "讀å–使用者自定èšåˆå‡½æ•¸"
+
+#: common.c:166
+#, c-format
+msgid "reading user-defined operators"
+msgstr "讀å–使用者自定æ“作符"
+
+#: common.c:169
+#, c-format
+msgid "reading user-defined access methods"
+msgstr "讀å–使用者自定存å–æ–¹å¼"
+
+#: common.c:172
+#, c-format
+msgid "reading user-defined operator classes"
+msgstr "讀å–使用者自定æ“作符類別"
+
+#: common.c:175
+#, c-format
+msgid "reading user-defined operator families"
+msgstr "讀å–使用者自定æ“作符æ—群"
+
+#: common.c:178
+#, c-format
+msgid "reading user-defined text search parsers"
+msgstr "讀å–使用者自定文字æœå°‹è§£æžå™¨"
+
+#: common.c:181
+#, c-format
+msgid "reading user-defined text search templates"
+msgstr "讀å–使用者自定文字æœå°‹ç¯„本"
+
+#: common.c:184
+#, c-format
+msgid "reading user-defined text search dictionaries"
+msgstr "讀å–使用者自定文字æœå°‹å­—å…¸"
+
+# sql_help.h:129
+#: common.c:187
+#, c-format
+msgid "reading user-defined text search configurations"
+msgstr "讀å–使用者自定文字æœå°‹çµ„æ…‹"
+
+#: common.c:190
+#, c-format
+msgid "reading user-defined foreign-data wrappers"
+msgstr "讀å–使用者自定外部資料å°è£ç¨‹å¼"
+
+#: common.c:193
+#, c-format
+msgid "reading user-defined foreign servers"
+msgstr "讀å–使用者自定外部伺æœå™¨"
+
+#: common.c:196
+#, c-format
+msgid "reading default privileges"
+msgstr "讀å–é è¨­æ¬Šé™"
+
+#: common.c:199
+#, c-format
+msgid "reading user-defined collations"
+msgstr "讀å–使用者自定定åº"
+
+#: common.c:202
+#, c-format
+msgid "reading user-defined conversions"
+msgstr "讀å–使用者自定轉æ›è¦å‰‡"
+
+#: common.c:205
+#, c-format
+msgid "reading type casts"
+msgstr "讀å–轉型"
+
+#: common.c:208
+#, c-format
+msgid "reading transforms"
+msgstr "è®€å– transform"
+
+#: common.c:211
+#, c-format
+msgid "reading table inheritance information"
+msgstr "讀å–資料表繼承資訊"
+
+#: common.c:214
+#, c-format
+msgid "reading event triggers"
+msgstr "讀å–事件觸發器"
+
+#: common.c:218
+#, c-format
+msgid "finding extension tables"
+msgstr "尋找擴充模組資料表"
+
+#: common.c:222
+#, c-format
+msgid "finding inheritance relationships"
+msgstr "尋找繼承關係"
+
+#: common.c:225
+#, c-format
+msgid "reading column info for interesting tables"
+msgstr "讀å–所關注的資料表欄ä½è³‡è¨Š"
+
+#: common.c:228
+#, c-format
+msgid "flagging inherited columns in subtables"
+msgstr "在å­è³‡æ–™è¡¨ä¸­æ¨™ç¤ºç¹¼æ‰¿çš„欄ä½"
+
+#: common.c:231
+#, c-format
+msgid "reading partitioning data"
+msgstr "讀å–分å€è³‡æ–™"
+
+#: common.c:234
+#, c-format
+msgid "reading indexes"
+msgstr "讀å–索引"
+
+#: common.c:237
+#, c-format
+msgid "flagging indexes in partitioned tables"
+msgstr "標示分å€è³‡æ–™è¡¨ä¸­çš„索引"
+
+#: common.c:240
+#, c-format
+msgid "reading extended statistics"
+msgstr "讀å–擴展統計資料"
+
+#: common.c:243
+#, c-format
+msgid "reading constraints"
+msgstr "讀å–ç´„æŸæ¢ä»¶"
+
+#: common.c:246
+#, c-format
+msgid "reading triggers"
+msgstr "讀å–觸發器"
+
+#: common.c:249
+#, c-format
+msgid "reading rewrite rules"
+msgstr "讀å–é‡å¯«è¦å‰‡"
+
+#: common.c:252
+#, c-format
+msgid "reading policies"
+msgstr "讀å–政策"
+
+#: common.c:255
+#, c-format
+msgid "reading publications"
+msgstr "讀å–發布"
+
+#: common.c:258
+#, c-format
+msgid "reading publication membership of tables"
+msgstr "讀å–資料表的發布æˆå“¡"
+
+#: common.c:261
+#, c-format
+msgid "reading publication membership of schemas"
+msgstr "è®€å– schema 的發布æˆå“¡"
+
+#: common.c:264
+#, c-format
+msgid "reading subscriptions"
+msgstr "讀å–訂閱"
+
+#: common.c:327
+#, c-format
+msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found"
+msgstr "未通éŽå®Œæ•´æ€§æª¢æŸ¥ï¼Œæ‰¾ä¸åˆ°è³‡æ–™è¡¨ \"%2$s\"(OID %3$u)的父 OID %1$u"
+
+#: common.c:369
+#, c-format
+msgid "invalid number of parents %d for table \"%s\""
+msgstr ""
+
+#: common.c:1049
+#, c-format
+msgid "could not parse numeric array \"%s\": too many numbers"
+msgstr "無法解æžæ•¸å­—陣列 \"%s\": 數字éŽå¤š"
+
+#: common.c:1061
+#, c-format
+msgid "could not parse numeric array \"%s\": invalid character in number"
+msgstr "無法解æžæ•¸å­—陣列\"%s\": 數字中有無效字元"
+
+#: compress_gzip.c:69 compress_gzip.c:183
+#, c-format
+msgid "could not initialize compression library: %s"
+msgstr "無法åˆå§‹åŒ–壓縮程å¼åº«: %s"
+
+#: compress_gzip.c:93
+#, c-format
+msgid "could not close compression stream: %s"
+msgstr "無法關閉壓縮串æµ: %s"
+
+#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109
+#, c-format
+msgid "could not compress data: %s"
+msgstr "無法壓縮資料: %s"
+
+#: compress_gzip.c:199 compress_gzip.c:214
+#, c-format
+msgid "could not uncompress data: %s"
+msgstr "無法解壓縮資料: %s"
+
+#: compress_gzip.c:221
+#, c-format
+msgid "could not close compression library: %s"
+msgstr "無法關閉壓縮程å¼åº«: %s"
+
+# input.c:210
+#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608
+#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140
+#, c-format
+msgid "could not read from input file: %s"
+msgstr "無法從輸入檔讀å–: %s"
+
+# input.c:210
+#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142
+#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558
+#: pg_backup_tar.c:725 pg_backup_tar.c:748
+#, c-format
+msgid "could not read from input file: end of file"
+msgstr "無法從輸入檔讀å–: 檔案çµæŸ"
+
+# libpq/be-secure.c:649
+#: compress_lz4.c:157
+#, c-format
+msgid "could not create LZ4 decompression context: %s"
+msgstr "無法建立 LZ4 解壓縮內容: %s"
+
+#: compress_lz4.c:180
+#, c-format
+msgid "could not decompress: %s"
+msgstr "無法解壓縮: %s"
+
+#: compress_lz4.c:193
+#, c-format
+msgid "could not free LZ4 decompression context: %s"
+msgstr "無法釋放 LZ4 解壓縮 context: %s"
+
+#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690
+#, c-format
+msgid "could not end compression: %s"
+msgstr "無法çµæŸå£“縮: %s"
+
+#: compress_lz4.c:301
+#, c-format
+msgid "could not initialize LZ4 compression: %s"
+msgstr "無法åˆå§‹åŒ– LZ4 壓縮: %s"
+
+#: compress_lz4.c:697
+#, c-format
+msgid "could not end decompression: %s"
+msgstr "無法çµæŸè§£å£“縮: %s"
+
+#: compress_zstd.c:66
+#, c-format
+msgid "could not set compression parameter \"%s\": %s"
+msgstr "無法設定壓縮åƒæ•¸ \"%s\": %s"
+
+#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490
+#: compress_zstd.c:498
+#, c-format
+msgid "could not initialize compression library"
+msgstr "無法åˆå§‹åŒ–壓縮程å¼åº«"
+
+#: compress_zstd.c:194 compress_zstd.c:308
+#, c-format
+msgid "could not decompress data: %s"
+msgstr "無法解壓縮資料: %s"
+
+# input.c:210
+#: compress_zstd.c:373 pg_backup_custom.c:655
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "無法從輸入檔讀å–: %m"
+
+#: compress_zstd.c:501
+#, c-format
+msgid "unhandled mode \"%s\""
+msgstr "未處ç†çš„æ¨¡å¼ \"%s\""
+
+#: parallel.c:251
+#, c-format
+msgid "%s() failed: error code %d"
+msgstr "%s() 失敗: 錯誤碼 %d"
+
+# access/transam/xlog.c:3132
+#: parallel.c:959
+#, c-format
+msgid "could not create communication channels: %m"
+msgstr "無法建立通訊通é“: %m"
+
+# fe-connect.c:1197
+#: parallel.c:1016
+#, c-format
+msgid "could not create worker process: %m"
+msgstr "無法建立工作行程: %m"
+
+# access/transam/xlog.c:3720
+#: parallel.c:1146
+#, c-format
+msgid "unrecognized command received from leader: \"%s\""
+msgstr "從領導者接收到無法識別的命令: \"%s\""
+
+# libpq/hba.c:1437
+#: parallel.c:1189 parallel.c:1427
+#, c-format
+msgid "invalid message received from worker: \"%s\""
+msgstr "從工作行程接收到無效的訊æ¯:\"%s\""
+
+#: parallel.c:1321
+#, c-format
+msgid ""
+"could not obtain lock on relation \"%s\"\n"
+"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table."
+msgstr ""
+"無法在關è¯\"%s\" 上ç²å¾—鎖定\n"
+"這通常表示在 pg_dump 的父行程ç²å¾—資料表的åˆå§‹ ACCESS SHARE 鎖定之後,有人è¦æ±‚å°è©²è³‡æ–™è¡¨é€²è¡Œ ACCESS EXCLUSIVE 鎖定。"
+
+#: parallel.c:1410
+#, c-format
+msgid "a worker process died unexpectedly"
+msgstr "工作行程æ„外終止"
+
+# access/transam/xlog.c:3143 access/transam/xlog.c:3330
+#: parallel.c:1532 parallel.c:1650
+#, c-format
+msgid "could not write to the communication channel: %m"
+msgstr "無法寫入到通訊通é“: %m"
+
+# port/pg_sema.c:117 port/sysv_sema.c:117
+#: parallel.c:1734
+#, c-format
+msgid "pgpipe: could not create socket: error code %d"
+msgstr "pgpipe: 無法建立 socket: 錯誤碼 %d"
+
+# libpq/be-secure.c:789
+#: parallel.c:1745
+#, c-format
+msgid "pgpipe: could not bind: error code %d"
+msgstr "pgpipe: ç¶å®šå¤±æ•—: 錯誤碼 %d"
+
+# port/win32/security.c:39
+#: parallel.c:1752
+#, c-format
+msgid "pgpipe: could not listen: error code %d"
+msgstr "pgpipe: 無法監è½: 錯誤碼 %d"
+
+#: parallel.c:1759
+#, c-format
+msgid "pgpipe: %s() failed: error code %d"
+msgstr "pgpipe: %s() 失敗: 錯誤碼 %d"
+
+# port/win32/signal.c:239
+#: parallel.c:1770
+#, c-format
+msgid "pgpipe: could not create second socket: error code %d"
+msgstr "pgpipe: 無法建立第二個 socket: 錯誤碼 %d"
+
+# port/win32/signal.c:239
+#: parallel.c:1779
+#, c-format
+msgid "pgpipe: could not connect socket: error code %d"
+msgstr "pgpipe: 無法連線 socket: 錯誤碼 %d"
+
+# libpq/be-secure.c:807
+#: parallel.c:1788
+#, c-format
+msgid "pgpipe: could not accept connection: error code %d"
+msgstr "pgpipe: 無法接å—連線: 錯誤碼 %d"
+
+#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603
+#, c-format
+msgid "could not close output file: %m"
+msgstr "無法關閉輸出檔案: %m"
+
+#: pg_backup_archiver.c:320 pg_backup_archiver.c:324
+#, c-format
+msgid "archive items not in correct section order"
+msgstr "å°å­˜é …目未按正確的å€æ®µé †åºæŽ’列"
+
+# utils/adt/rowtypes.c:178 utils/adt/rowtypes.c:186
+#: pg_backup_archiver.c:330
+#, c-format
+msgid "unexpected section code %d"
+msgstr "éžé æœŸçš„å€æ®µç¢¼ %d"
+
+# input.c:213
+#: pg_backup_archiver.c:367
+#, c-format
+msgid "parallel restore is not supported with this archive file format"
+msgstr "å°å­˜æª”案格å¼ä¸æ”¯æ´ä¸¦è¡Œé‚„原"
+
+#: pg_backup_archiver.c:371
+#, c-format
+msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump"
+msgstr "pg_dump 8.0版以å‰æ‰€å»ºç«‹çš„å°å­˜æª”ä¸æ”¯æ´ä¸¦è¡Œé‚„原"
+
+#: pg_backup_archiver.c:392
+#, c-format
+msgid "cannot restore from compressed archive (%s)"
+msgstr "無法從壓縮å°å­˜æª”案(%s)還原"
+
+#: pg_backup_archiver.c:412
+#, c-format
+msgid "connecting to database for restore"
+msgstr "連線至資料庫以進行還原"
+
+#: pg_backup_archiver.c:414
+#, c-format
+msgid "direct database connections are not supported in pre-1.3 archives"
+msgstr "直接資料庫連線在1.3以å‰ç‰ˆæœ¬çš„å°å­˜æª”ä¸æ”¯æ´"
+
+#: pg_backup_archiver.c:457
+#, c-format
+msgid "implied data-only restore"
+msgstr "æ„味著還原 data-only 備份"
+
+#: pg_backup_archiver.c:523
+#, c-format
+msgid "dropping %s %s"
+msgstr "刪除 %s %s"
+
+#: pg_backup_archiver.c:623
+#, c-format
+msgid "could not find where to insert IF EXISTS in statement \"%s\""
+msgstr "ç„¡æ³•æ‰¾åˆ°åœ¨é™³è¿°å¼ \"%s\" 中æ’å…¥ IF EXISTS çš„ä½ç½®"
+
+#: pg_backup_archiver.c:778 pg_backup_archiver.c:780
+#, c-format
+msgid "warning from original dump file: %s"
+msgstr "來自原始備份檔的警告: %s"
+
+#: pg_backup_archiver.c:795
+#, c-format
+msgid "creating %s \"%s.%s\""
+msgstr "建立 %s \"%s.%s\""
+
+#: pg_backup_archiver.c:798
+#, c-format
+msgid "creating %s \"%s\""
+msgstr "建立 %s \"%s\""
+
+#: pg_backup_archiver.c:848
+#, c-format
+msgid "connecting to new database \"%s\""
+msgstr "連線至新資料庫 \"%s\""
+
+#: pg_backup_archiver.c:875
+#, c-format
+msgid "processing %s"
+msgstr "è™•ç† %s"
+
+#: pg_backup_archiver.c:897
+#, c-format
+msgid "processing data for table \"%s.%s\""
+msgstr "處ç†è³‡æ–™è¡¨ \"%s.%s\" 的資料"
+
+#: pg_backup_archiver.c:967
+#, c-format
+msgid "executing %s %s"
+msgstr "執行 %s %s"
+
+#: pg_backup_archiver.c:1008
+#, c-format
+msgid "disabling triggers for %s"
+msgstr "åœç”¨ %s 的觸發器"
+
+#: pg_backup_archiver.c:1034
+#, c-format
+msgid "enabling triggers for %s"
+msgstr "啟動 %s 的觸發器"
+
+#: pg_backup_archiver.c:1099
+#, c-format
+msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine"
+msgstr "內部錯誤 - WriteData ä¸å¯åœ¨ DataDumper 程åºçš„ context 之外呼å«"
+
+#: pg_backup_archiver.c:1287
+#, c-format
+msgid "large-object output not supported in chosen format"
+msgstr "所é¸æ ¼å¼ä¸æ”¯æ´å¤§ç‰©ä»¶çš„輸出"
+
+#: pg_backup_archiver.c:1345
+#, c-format
+msgid "restored %d large object"
+msgid_plural "restored %d large objects"
+msgstr[0] "已還原 %d 個大物件"
+
+#: pg_backup_archiver.c:1366 pg_backup_tar.c:668
+#, c-format
+msgid "restoring large object with OID %u"
+msgstr "還原 OID 為 %u 的大物件"
+
+#: pg_backup_archiver.c:1378
+#, c-format
+msgid "could not create large object %u: %s"
+msgstr "無法建立大物件 %u: %s"
+
+# fe-lobj.c:410
+# fe-lobj.c:495
+#: pg_backup_archiver.c:1383 pg_dump.c:3718
+#, c-format
+msgid "could not open large object %u: %s"
+msgstr "無法開啟大型物件 %u: %s"
+
+# fe-lobj.c:410
+# fe-lobj.c:495
+#: pg_backup_archiver.c:1439
+#, c-format
+msgid "could not open TOC file \"%s\": %m"
+msgstr "無法開啟 TOC 檔 \"%s\": %m"
+
+#: pg_backup_archiver.c:1467
+#, c-format
+msgid "line ignored: %s"
+msgstr "忽略行: %s"
+
+#: pg_backup_archiver.c:1474
+#, c-format
+msgid "could not find entry for ID %d"
+msgstr "找ä¸åˆ° ID 為 %d çš„é …ç›®"
+
+#: pg_backup_archiver.c:1497 pg_backup_directory.c:221
+#: pg_backup_directory.c:606
+#, c-format
+msgid "could not close TOC file: %m"
+msgstr "無法關閉 TOC 檔: %m"
+
+#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332
+#: pg_backup_directory.c:593 pg_backup_directory.c:658
+#: pg_backup_directory.c:676 pg_dumpall.c:501
+#, c-format
+msgid "could not open output file \"%s\": %m"
+msgstr "無法開啟輸出檔 \"%s\": %m"
+
+#: pg_backup_archiver.c:1586 pg_backup_custom.c:162
+#, c-format
+msgid "could not open output file: %m"
+msgstr "無法開啟輸出檔: %m"
+
+#: pg_backup_archiver.c:1669
+#, c-format
+msgid "wrote %zu byte of large object data (result = %d)"
+msgid_plural "wrote %zu bytes of large object data (result = %d)"
+msgstr[0] "已寫入 %zu ä½å…ƒçµ„的大物件資料(çµæžœ = %d)"
+
+#: pg_backup_archiver.c:1675
+#, c-format
+msgid "could not write to large object: %s"
+msgstr "無法寫入大物件: %s"
+
+#: pg_backup_archiver.c:1765
+#, c-format
+msgid "while INITIALIZING:"
+msgstr "當 INITIALIZING:"
+
+#: pg_backup_archiver.c:1770
+#, c-format
+msgid "while PROCESSING TOC:"
+msgstr "當 PROCESSING TOC:"
+
+#: pg_backup_archiver.c:1775
+#, c-format
+msgid "while FINALIZING:"
+msgstr "當 FINALIZING:"
+
+#: pg_backup_archiver.c:1780
+#, c-format
+msgid "from TOC entry %d; %u %u %s %s %s"
+msgstr "從 TOC 項目 %d; %u %u %s %s %s"
+
+#: pg_backup_archiver.c:1856
+#, c-format
+msgid "bad dumpId"
+msgstr "ä¸æ­£ç¢ºçš„ dumpId"
+
+#: pg_backup_archiver.c:1877
+#, c-format
+msgid "bad table dumpId for TABLE DATA item"
+msgstr "TABLE DATA 項目的資料表 dumpId ä¸æ­£ç¢º"
+
+#: pg_backup_archiver.c:1969
+#, c-format
+msgid "unexpected data offset flag %d"
+msgstr "éžé æœŸçš„資料ä½ç§»æ¨™è¨˜ %d"
+
+#: pg_backup_archiver.c:1982
+#, c-format
+msgid "file offset in dump file is too large"
+msgstr "備份檔中的檔案ä½ç§»éŽå¤§"
+
+# utils/mb/encnames.c:445
+#: pg_backup_archiver.c:2093
+#, c-format
+msgid "directory name too long: \"%s\""
+msgstr "目錄å稱éŽé•·: \"%s\""
+
+#: pg_backup_archiver.c:2143
+#, c-format
+msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)"
+msgstr "目錄 \"%s\" 似乎ä¸æ˜¯æœ‰æ•ˆçš„å°å­˜æª”(\"toc.dat\" ä¸å­˜åœ¨)"
+
+#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816
+#: pg_backup_directory.c:206 pg_backup_directory.c:395
+#, c-format
+msgid "could not open input file \"%s\": %m"
+msgstr "無法開啟輸入檔 \"%s\": %m"
+
+#: pg_backup_archiver.c:2158 pg_backup_custom.c:179
+#, c-format
+msgid "could not open input file: %m"
+msgstr "無法開啟輸入檔: %m"
+
+#: pg_backup_archiver.c:2164
+#, c-format
+msgid "could not read input file: %m"
+msgstr "無法讀å–輸入檔: %m"
+
+#: pg_backup_archiver.c:2166
+#, c-format
+msgid "input file is too short (read %lu, expected 5)"
+msgstr "輸入檔éŽçŸ­(è®€å– %lu,é æœŸ 5)"
+
+#: pg_backup_archiver.c:2198
+#, c-format
+msgid "input file appears to be a text format dump. Please use psql."
+msgstr "輸入檔似乎是文字格å¼å‚™ä»½ï¼Œè«‹ç”¨ psql。"
+
+#: pg_backup_archiver.c:2204
+#, c-format
+msgid "input file does not appear to be a valid archive (too short?)"
+msgstr "輸入檔似乎ä¸æ˜¯æœ‰æ•ˆçš„å°å­˜æª”(太短?)"
+
+#: pg_backup_archiver.c:2210
+#, c-format
+msgid "input file does not appear to be a valid archive"
+msgstr "輸入檔似乎ä¸æ˜¯æœ‰æ•ˆçš„å°å­˜æª”"
+
+#: pg_backup_archiver.c:2219
+#, c-format
+msgid "could not close input file: %m"
+msgstr "無法關閉輸入檔: %m"
+
+# commands/copy.c:1031
+#: pg_backup_archiver.c:2297
+#, c-format
+msgid "could not open stdout for appending: %m"
+msgstr "無法開啟 stdout 以追加內容: %m"
+
+#: pg_backup_archiver.c:2342
+#, c-format
+msgid "unrecognized file format \"%d\""
+msgstr "ç„¡æ³•è¾¨è­˜çš„æª”æ¡ˆæ ¼å¼ \"%d\""
+
+#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448
+#, c-format
+msgid "finished item %d %s %s"
+msgstr "已完æˆé …ç›® %d %s %s"
+
+#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461
+#, c-format
+msgid "worker process failed: exit code %d"
+msgstr "工作行程失敗: çµæŸç¢¼ %d"
+
+#: pg_backup_archiver.c:2548
+#, c-format
+msgid "entry ID %d out of range -- perhaps a corrupt TOC"
+msgstr "é …ç›® ID %d è¶…å‡ºç¯„åœ - å¯èƒ½æ˜¯ TOC æ壞"
+
+# commands/dbcommands.c:138
+#: pg_backup_archiver.c:2628
+#, c-format
+msgid "restoring tables WITH OIDS is not supported anymore"
+msgstr "ä¸å†æ”¯æ´é‚„原 WITH OIDS 的資料表"
+
+# utils/adt/encode.c:55 utils/adt/encode.c:91
+#: pg_backup_archiver.c:2710
+#, c-format
+msgid "unrecognized encoding \"%s\""
+msgstr "無法識別的編碼 \"%s\""
+
+#: pg_backup_archiver.c:2715
+#, c-format
+msgid "invalid ENCODING item: %s"
+msgstr "無效的 ENCODING 項目: %s"
+
+#: pg_backup_archiver.c:2733
+#, c-format
+msgid "invalid STDSTRINGS item: %s"
+msgstr "無效的 STDSTRINGS 項目: %s"
+
+#: pg_backup_archiver.c:2758
+#, c-format
+msgid "schema \"%s\" not found"
+msgstr "找ä¸åˆ° schema \"%s\""
+
+# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942
+#: pg_backup_archiver.c:2765
+#, c-format
+msgid "table \"%s\" not found"
+msgstr "找ä¸åˆ°è³‡æ–™è¡¨ \"%s\""
+
+# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942
+#: pg_backup_archiver.c:2772
+#, c-format
+msgid "index \"%s\" not found"
+msgstr "找ä¸åˆ°ç´¢å¼• \"%s\""
+
+# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942
+#: pg_backup_archiver.c:2779
+#, c-format
+msgid "function \"%s\" not found"
+msgstr "找ä¸åˆ°å‡½æ•¸ \"%s\""
+
+# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942
+#: pg_backup_archiver.c:2786
+#, c-format
+msgid "trigger \"%s\" not found"
+msgstr "找ä¸åˆ°è§¸ç™¼å™¨ \"%s\""
+
+#: pg_backup_archiver.c:3183
+#, c-format
+msgid "could not set session user to \"%s\": %s"
+msgstr "無法將工作階段使用者設為 \"%s\": %s"
+
+#: pg_backup_archiver.c:3315
+#, c-format
+msgid "could not set search_path to \"%s\": %s"
+msgstr "無法將 search_path 設為 \"%s\": %s"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_backup_archiver.c:3376
+#, c-format
+msgid "could not set default_tablespace to %s: %s"
+msgstr "無法將 default_tablespace 設為 %s: %s"
+
+#: pg_backup_archiver.c:3425
+#, c-format
+msgid "could not set default_table_access_method: %s"
+msgstr "無法設定 default_table_access_method: %s"
+
+#: pg_backup_archiver.c:3530
+#, c-format
+msgid "don't know how to set owner for object type \"%s\""
+msgstr "ä¸çŸ¥é“如何設定物件型別 \"%s\" çš„æ“有者"
+
+#: pg_backup_archiver.c:3752
+#, c-format
+msgid "did not find magic string in file header"
+msgstr "檔案標頭中找ä¸åˆ°é­”術字串"
+
+#: pg_backup_archiver.c:3766
+#, c-format
+msgid "unsupported version (%d.%d) in file header"
+msgstr "檔案標頭中的版本ä¸å—支æ´(%d.%d)"
+
+#: pg_backup_archiver.c:3771
+#, c-format
+msgid "sanity check on integer size (%lu) failed"
+msgstr "整數大å°(%lu)的完整性檢查失敗"
+
+#: pg_backup_archiver.c:3775
+#, c-format
+msgid "archive was made on a machine with larger integers, some operations might fail"
+msgstr "å°å­˜æª”是在支æ´è¼ƒå¤§æ•´æ•¸çš„電腦上建立的,æŸäº›æ“作å¯èƒ½æœƒå¤±æ•—"
+
+#: pg_backup_archiver.c:3785
+#, c-format
+msgid "expected format (%d) differs from format found in file (%d)"
+msgstr "é æœŸçš„æ ¼å¼(%d)與檔案中找到的格å¼(%d)ä¸åŒ"
+
+#: pg_backup_archiver.c:3807
+#, 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:3843
+#, c-format
+msgid "invalid creation date in header"
+msgstr "標頭中的建立日期無效"
+
+#: pg_backup_archiver.c:3977
+#, c-format
+msgid "processing item %d %s %s"
+msgstr "處ç†é …ç›® %d %s %s"
+
+#: pg_backup_archiver.c:4052
+#, c-format
+msgid "entering main parallel loop"
+msgstr "進入主è¦ä¸¦è¡Œè¿´åœˆ"
+
+#: pg_backup_archiver.c:4063
+#, c-format
+msgid "skipping item %d %s %s"
+msgstr "è·³éŽé …ç›® %d %s %s"
+
+#: pg_backup_archiver.c:4072
+#, c-format
+msgid "launching item %d %s %s"
+msgstr "å•Ÿå‹•é …ç›® %d %s %s"
+
+#: pg_backup_archiver.c:4126
+#, c-format
+msgid "finished main parallel loop"
+msgstr "完æˆä¸»è¦ä¸¦è¡Œè¿´åœˆ"
+
+#: pg_backup_archiver.c:4162
+#, c-format
+msgid "processing missed item %d %s %s"
+msgstr "處ç†éºæ¼çš„é …ç›® %d %s %s"
+
+#: pg_backup_archiver.c:4767
+#, c-format
+msgid "table \"%s\" could not be created, will not restore its data"
+msgstr "無法建立資料表 \"%s\",將ä¸æœƒé‚„原資料"
+
+#: pg_backup_custom.c:380 pg_backup_null.c:147
+#, c-format
+msgid "invalid OID for large object"
+msgstr "大物件的 OID 無效"
+
+#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640
+#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019
+#, c-format
+msgid "error during file seek: %m"
+msgstr "檔案 seek 時發生錯誤: %m"
+
+#: pg_backup_custom.c:484
+#, c-format
+msgid "data block %d has wrong seek position"
+msgstr "資料å€å¡Š %d çš„ seek ä½ç½®éŒ¯èª¤"
+
+#: pg_backup_custom.c:501
+#, c-format
+msgid "unrecognized data block type (%d) while searching archive"
+msgstr "æœå°‹å°å­˜æª”時發ç¾ç„¡æ³•è­˜åˆ¥çš„資料å€å¡Šé¡žåž‹(%d)"
+
+#: pg_backup_custom.c:523
+#, c-format
+msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file"
+msgstr "無法在å°å­˜æª”中找到å€å¡Š ID %d -- å¯èƒ½æ˜¯å› ç‚ºéžå¾ªåºé‚„原請求,因ä¸èƒ½ seek 輸入檔導致無法處ç†"
+
+#: pg_backup_custom.c:528
+#, c-format
+msgid "could not find block ID %d in archive -- possibly corrupt archive"
+msgstr "無法在å°å­˜æª”中找到å€å¡Šç·¨è™Ÿ %d -- å¯èƒ½æ˜¯å› ç‚ºå°å­˜æª”æ壞"
+
+#: pg_backup_custom.c:535
+#, c-format
+msgid "found unexpected block ID (%d) when reading data -- expected %d"
+msgstr "讀å–資料時發ç¾éžé æœŸçš„å€å¡Š ID (%d) -- é æœŸæ˜¯ %d"
+
+#: pg_backup_custom.c:549
+#, c-format
+msgid "unrecognized data block type %d while restoring archive"
+msgstr "還原å°å­˜æª”時發ç¾ç„¡æ³•è­˜åˆ¥çš„資料å€å¡Šé¡žåž‹ %d"
+
+#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952
+#: pg_backup_tar.c:1017
+#, c-format
+msgid "could not determine seek position in archive file: %m"
+msgstr "無法確定å°å­˜æª”中的 seek ä½ç½®: %m"
+
+#: pg_backup_custom.c:771 pg_backup_custom.c:811
+#, c-format
+msgid "could not close archive file: %m"
+msgstr "無法關閉å°å­˜æª”: %m"
+
+#: pg_backup_custom.c:794
+#, c-format
+msgid "can only reopen input archives"
+msgstr "åªèƒ½é‡æ–°é–‹å•Ÿè¼¸å…¥å°å­˜æª”"
+
+#: pg_backup_custom.c:801
+#, c-format
+msgid "parallel restore from standard input is not supported"
+msgstr "ä¸æ”¯æ´ä¾†è‡ªæ¨™æº–輸入的並行還原"
+
+#: pg_backup_custom.c:803
+#, c-format
+msgid "parallel restore from non-seekable file is not supported"
+msgstr "ä¸æ”¯æ´å¾žä¸å¯ seek 的檔案進行並行還原"
+
+#: pg_backup_custom.c:819
+#, c-format
+msgid "could not set seek position in archive file: %m"
+msgstr "無法設定å°å­˜æª”çš„ seek ä½ç½®: %m"
+
+#: pg_backup_custom.c:898
+#, c-format
+msgid "compressor active"
+msgstr "壓縮器啟用"
+
+#: pg_backup_db.c:42
+#, c-format
+msgid "could not get server_version from libpq"
+msgstr "無法從 libpq å–å¾— server_version"
+
+#: pg_backup_db.c:53 pg_dumpall.c:1809
+#, c-format
+msgid "aborting because of server version mismatch"
+msgstr "因伺æœå™¨ç‰ˆæœ¬ä¸ä¸€è‡´è€Œä¸­æ­¢"
+
+#: pg_backup_db.c:54 pg_dumpall.c:1810
+#, c-format
+msgid "server version: %s; %s version: %s"
+msgstr "伺æœå™¨ç‰ˆæœ¬: %s; %s 版本: %s"
+
+#: pg_backup_db.c:120
+#, c-format
+msgid "already connected to a database"
+msgstr "已連線至資料庫"
+
+#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758
+msgid "Password: "
+msgstr "密碼: "
+
+#: pg_backup_db.c:170
+#, c-format
+msgid "could not connect to database"
+msgstr "無法連線至資料庫"
+
+# postmaster/postmaster.c:2603
+#: pg_backup_db.c:187
+#, c-format
+msgid "reconnection failed: %s"
+msgstr "é‡æ–°é€£ç·šå¤±æ•—: %s"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280
+#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895
+#, c-format
+msgid "query failed: %s"
+msgstr "查詢失敗: %s"
+
+#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896
+#, c-format
+msgid "Query was: %s"
+msgstr "查詢是: %s"
+
+#: pg_backup_db.c:315
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "查詢回傳 %d 筆資料,而éžä¸€ç­†è³‡æ–™: %s"
+
+#: pg_backup_db.c:351
+#, c-format
+msgid "%s: %sCommand was: %s"
+msgstr "%s: %s命令是: %s"
+
+#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488
+msgid "could not execute query"
+msgstr "無法執行查詢"
+
+#: pg_backup_db.c:460
+#, c-format
+msgid "error returned by PQputCopyData: %s"
+msgstr "PQputCopyData 回傳的錯誤: %s"
+
+#: pg_backup_db.c:509
+#, c-format
+msgid "error returned by PQputCopyEnd: %s"
+msgstr "PQputCopyEnd 回傳的錯誤: %s"
+
+# describe.c:933
+#: pg_backup_db.c:515
+#, c-format
+msgid "COPY failed for table \"%s\": %s"
+msgstr "COPY 資料表 \"%s\" 失敗: %s"
+
+# commands/copy.c:453
+#: pg_backup_db.c:521 pg_dump.c:2202
+#, c-format
+msgid "unexpected extra results during COPY of table \"%s\""
+msgstr "在 COPY 資料表 \"%s\" 時出ç¾éžé æœŸçš„é¡å¤–çµæžœ"
+
+#: pg_backup_db.c:533
+msgid "could not start database transaction"
+msgstr "無法開始資料庫交易"
+
+#: pg_backup_db.c:541
+msgid "could not commit database transaction"
+msgstr "無法æ交資料庫交易"
+
+#: pg_backup_directory.c:155
+#, c-format
+msgid "no output directory specified"
+msgstr "未指定輸出目錄"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#: pg_backup_directory.c:184
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "無法讀å–目錄 \"%s\": %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_backup_directory.c:188
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "無法關閉目錄 \"%s\": %m"
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: pg_backup_directory.c:194
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄 \"%s\": %m"
+
+#: pg_backup_directory.c:356 pg_backup_directory.c:499
+#: pg_backup_directory.c:537
+#, c-format
+msgid "could not write to output file: %s"
+msgstr "無法寫入輸出檔: %s"
+
+#: pg_backup_directory.c:374
+#, c-format
+msgid "could not close data file: %m"
+msgstr "無法關閉資料檔: %m"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: pg_backup_directory.c:407
+#, c-format
+msgid "could not close data file \"%s\": %m"
+msgstr "無法關閉資料檔 \"%s\": %m"
+
+#: pg_backup_directory.c:448
+#, c-format
+msgid "could not open large object TOC file \"%s\" for input: %m"
+msgstr "無法開啟大物件 TOC 檔 \"%s\" 進行輸入: %m"
+
+#: pg_backup_directory.c:459
+#, c-format
+msgid "invalid line in large object TOC file \"%s\": \"%s\""
+msgstr "大物件 TOC 檔 \"%s\" 中有無效的行: \"%s\""
+
+#: pg_backup_directory.c:468
+#, c-format
+msgid "error reading large object TOC file \"%s\""
+msgstr "無法讀å–大物件檔 \"%s\""
+
+#: pg_backup_directory.c:472
+#, c-format
+msgid "could not close large object TOC file \"%s\": %m"
+msgstr "無法關閉大物件 TOC 檔 \"%s\": %m"
+
+#: pg_backup_directory.c:694
+#, c-format
+msgid "could not close LO data file: %m"
+msgstr "無法關閉 LO 資料檔: %m"
+
+# postmaster/syslogger.c:703
+#: pg_backup_directory.c:704
+#, c-format
+msgid "could not write to LOs TOC file: %s"
+msgstr "無法寫入 LO TOC 檔: %s"
+
+#: pg_backup_directory.c:720
+#, c-format
+msgid "could not close LOs TOC file: %m"
+msgstr "無法關閉 LO TOC 檔: %m"
+
+# utils/mb/encnames.c:445
+#: pg_backup_directory.c:739
+#, c-format
+msgid "file name too long: \"%s\""
+msgstr "檔案å稱éŽé•·: \"%s\""
+
+#: pg_backup_null.c:74
+#, c-format
+msgid "this format cannot be read"
+msgstr "無法讀å–此格å¼"
+
+#: pg_backup_tar.c:172
+#, c-format
+msgid "could not open TOC file \"%s\" for output: %m"
+msgstr "無法開啟 TOC 檔 \"%s\" 進行輸出: %m"
+
+#: pg_backup_tar.c:179
+#, c-format
+msgid "could not open TOC file for output: %m"
+msgstr "無法開啟 TOC 檔進行輸出: %m"
+
+#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389
+#: pg_backup_tar.c:405 pg_backup_tar.c:891
+#, c-format
+msgid "compression is not supported by tar archive format"
+msgstr "壓縮並ä¸æ”¯æ´ tar å°å­˜æª”æ ¼å¼"
+
+#: pg_backup_tar.c:206
+#, c-format
+msgid "could not open TOC file \"%s\" for input: %m"
+msgstr "無法開啟 TOC 檔 \"%s\" 進行輸入: %m"
+
+#: pg_backup_tar.c:213
+#, c-format
+msgid "could not open TOC file for input: %m"
+msgstr "無法開啟 TOC 檔進行輸入: %m"
+
+#: pg_backup_tar.c:322
+#, c-format
+msgid "could not find file \"%s\" in archive"
+msgstr "無法在å°å­˜æª”中找到檔案 \"%s\""
+
+#: pg_backup_tar.c:382
+#, c-format
+msgid "could not generate temporary file name: %m"
+msgstr "無法產生暫存檔å: %m"
+
+#: pg_backup_tar.c:623
+#, c-format
+msgid "unexpected COPY statement syntax: \"%s\""
+msgstr "éžé æœŸçš„ COPY 敘述語法: \"%s\""
+
+#: pg_backup_tar.c:888
+#, c-format
+msgid "invalid OID for large object (%u)"
+msgstr "大物件(%u)的 OID 無效"
+
+# command.c:1148
+#: pg_backup_tar.c:1033
+#, c-format
+msgid "could not close temporary file: %m"
+msgstr "無法關閉暫存檔: %m"
+
+#: pg_backup_tar.c:1036
+#, c-format
+msgid "actual file length (%lld) does not match expected (%lld)"
+msgstr "實際檔案長度(%lld)與é æœŸé•·åº¦(%lld)ä¸ä¸€è‡´"
+
+#: pg_backup_tar.c:1082 pg_backup_tar.c:1113
+#, c-format
+msgid "could not find header for file \"%s\" in tar archive"
+msgstr "在 tar å°å­˜æª”中找ä¸åˆ°æª”案 \"%s\" 的標頭"
+
+#: pg_backup_tar.c:1100
+#, c-format
+msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file."
+msgstr "這種å°å­˜æª”æ ¼å¼ä¸æ”¯æ´éžå¾ªåºé‚„原: 需è¦çš„是 \"%s\",但在å°å­˜æª”案中å»å‡ºç¾åœ¨ \"%s\" 之å‰ã€‚"
+
+#: pg_backup_tar.c:1147
+#, c-format
+msgid "incomplete tar header found (%lu byte)"
+msgid_plural "incomplete tar header found (%lu bytes)"
+msgstr[0] "找到ä¸å®Œæ•´çš„ tar 標頭(%lu ä½å…ƒçµ„)"
+
+#: pg_backup_tar.c:1186
+#, c-format
+msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu"
+msgstr "在 %s 中發ç¾æ壞的 tar 標頭(é æœŸæ˜¯ %d,計算得到 %d)檔案ä½ç½® %llu"
+
+# commands/variable.c:403
+#: pg_backup_utils.c:54
+#, c-format
+msgid "unrecognized section name: \"%s\""
+msgstr "無法識別的å€æ®µå稱: \" %s \""
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365
+#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398
+#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307
+#: pg_restore.c:321
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_backup_utils.c:66
+#, c-format
+msgid "out of on_exit_nicely slots"
+msgstr "on_exit_nicely 槽已用盡"
+
+#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列引數éŽå¤š(第一個是 \"%s\")"
+
+#: pg_dump.c:696 pg_restore.c:328
+#, c-format
+msgid "options -s/--schema-only and -a/--data-only cannot be used together"
+msgstr "無法åŒæ™‚使用é¸é … -s/--schema-only å’Œ -a/--data-only"
+
+#: pg_dump.c:699
+#, c-format
+msgid "options -s/--schema-only and --include-foreign-data cannot be used together"
+msgstr "無法åŒæ™‚使用é¸é … -s/--schema-only å’Œ --include-foreign-data"
+
+#: pg_dump.c:702
+#, c-format
+msgid "option --include-foreign-data is not supported with parallel backup"
+msgstr "é¸é … --include-foreign-data ä¸æ”¯æ´ä¸¦è¡Œå‚™ä»½"
+
+#: pg_dump.c:705 pg_restore.c:331
+#, c-format
+msgid "options -c/--clean and -a/--data-only cannot be used together"
+msgstr "無法åŒæ™‚使用é¸é … -c/--clean å’Œ -a/--data-only"
+
+#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356
+#, c-format
+msgid "option --if-exists requires option -c/--clean"
+msgstr "é¸é … --if-exists 需è¦é¸é … -c/--clean"
+
+#: pg_dump.c:715
+#, c-format
+msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts"
+msgstr "é¸é … --on-conflict-do-nothing 需è¦é¸é … --inserts 或 --rows-per-insert 或 --column-inserts"
+
+# access/transam/xlog.c:3720
+#: pg_dump.c:744
+#, c-format
+msgid "unrecognized compression algorithm: \"%s\""
+msgstr "無法識別的壓縮演算法: \" %s \""
+
+# fe-connect.c:2675
+#: pg_dump.c:751
+#, c-format
+msgid "invalid compression specification: %s"
+msgstr "無效的壓縮è¦æ ¼: %s"
+
+#: pg_dump.c:764
+#, c-format
+msgid "compression option \"%s\" is not currently supported by pg_dump"
+msgstr "pg_dump ç›®å‰ä¸æ”¯æ´å£“縮é¸é … \"%s\""
+
+# input.c:213
+#: pg_dump.c:776
+#, c-format
+msgid "parallel backup only supported by the directory format"
+msgstr "並行備份åªæ”¯æ´ç›®éŒ„æ ¼å¼"
+
+#: pg_dump.c:822
+#, c-format
+msgid "last built-in OID is %u"
+msgstr "最後的內建 OID 為 %u"
+
+# describe.c:1542
+#: pg_dump.c:831
+#, c-format
+msgid "no matching schemas were found"
+msgstr "找ä¸åˆ°ç¬¦åˆçš„ schema"
+
+# describe.c:1542
+#: pg_dump.c:848
+#, c-format
+msgid "no matching tables were found"
+msgstr "找ä¸åˆ°ç¬¦åˆçš„資料表"
+
+# describe.c:1542
+#: pg_dump.c:876
+#, c-format
+msgid "no matching extensions were found"
+msgstr "找ä¸åˆ°ç¬¦åˆçš„擴充模組"
+
+#: pg_dump.c:1056
+#, c-format
+msgid ""
+"%s dumps a database as a text file or to other formats.\n"
+"\n"
+msgstr ""
+"%s 會將資料庫備份為文字檔或其他格å¼ã€‚\n"
+"\n"
+
+#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_dump.c:1058
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr ""
+
+#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436
+#, c-format
+msgid ""
+"\n"
+"General options:\n"
+msgstr ""
+"\n"
+"一般é¸é …:\n"
+
+#: pg_dump.c:1061
+#, c-format
+msgid " -f, --file=FILENAME output file or directory name\n"
+msgstr " -f, --file=FILENAME 輸出檔案或目錄的å稱\n"
+
+#: pg_dump.c:1062
+#, c-format
+msgid ""
+" -F, --format=c|d|t|p output file format (custom, directory, tar,\n"
+" plain text (default))\n"
+msgstr " -F, --format=c|d|t|p 輸出檔案格å¼(自訂ã€ç›®éŒ„ã€tarã€ç´”文字(é è¨­))\n"
+
+#: pg_dump.c:1064
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to dump\n"
+msgstr " -j, --jobs=NUM 使用這麼多並行作業來備份\n"
+
+#: pg_dump.c:1065 pg_dumpall.c:635
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 詳細模å¼\n"
+
+#: pg_dump.c:1066 pg_dumpall.c:636
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_dump.c:1067
+#, c-format
+msgid ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" compress as specified\n"
+msgstr ""
+" -Z, --compress=METHOD[:DETAIL]\n"
+" 根據指定的方å¼å£“縮\n"
+
+#: pg_dump.c:1069 pg_dumpall.c:637
+#, c-format
+msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n"
+msgstr " --lock-wait-timeout=TIMEOUT ç­‰å¾…è³‡æ–™è¡¨éŽ–å®šè¶…éŽ TIMEOUT 後失敗\n"
+
+#: pg_dump.c:1070 pg_dumpall.c:664
+#, c-format
+msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n"
+
+#: pg_dump.c:1071 pg_dumpall.c:638
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_dump.c:1073 pg_dumpall.c:639
+#, c-format
+msgid ""
+"\n"
+"Options controlling the output content:\n"
+msgstr ""
+"\n"
+"控制輸出內容的é¸é …:\n"
+
+#: pg_dump.c:1074 pg_dumpall.c:640
+#, c-format
+msgid " -a, --data-only dump only the data, not the schema\n"
+msgstr " -a, --data-only åªå‚™ä»½è³‡æ–™ï¼Œä¸å« schema\n"
+
+#: pg_dump.c:1075
+#, c-format
+msgid " -b, --large-objects include large objects in dump\n"
+msgstr " -b, --large-objects 在備份中包å«å¤§ç‰©ä»¶\n"
+
+#: pg_dump.c:1076
+#, c-format
+msgid " --blobs (same as --large-objects, deprecated)\n"
+msgstr " --blobs (åŒ --large-objects,已作廢)\n"
+
+#: pg_dump.c:1077
+#, c-format
+msgid " -B, --no-large-objects exclude large objects in dump\n"
+msgstr " -B, --no-large-objects 在備份中排除大物件\n"
+
+#: pg_dump.c:1078
+#, c-format
+msgid " --no-blobs (same as --no-large-objects, deprecated)\n"
+msgstr " --no-blobs (åŒ --no-large-objects,已作廢)\n"
+
+#: pg_dump.c:1079 pg_restore.c:447
+#, c-format
+msgid " -c, --clean clean (drop) database objects before recreating\n"
+msgstr " -c, --clean é‡å»ºå‰æ¸…ç†(刪除)資料庫物件\n"
+
+#: pg_dump.c:1080
+#, c-format
+msgid " -C, --create include commands to create database in dump\n"
+msgstr " -C, --create 在備份中包å«å»ºç«‹è³‡æ–™åº«çš„命令\n"
+
+#: pg_dump.c:1081
+#, c-format
+msgid " -e, --extension=PATTERN dump the specified extension(s) only\n"
+msgstr " -e, --extension=PATTERN åªå‚™ä»½æŒ‡å®šçš„擴充功能\n"
+
+#: pg_dump.c:1082 pg_dumpall.c:642
+#, c-format
+msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n"
+msgstr " -E, --encoding=ENCODING 以編碼 ENCODING 備份資料\n"
+
+#: pg_dump.c:1083
+#, c-format
+msgid " -n, --schema=PATTERN dump the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN åªå‚™ä»½æŒ‡å®šçš„ schema\n"
+
+#: pg_dump.c:1084
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN ä¸è¦å‚™ä»½æŒ‡å®šçš„ schema\n"
+
+#: pg_dump.c:1085
+#, c-format
+msgid ""
+" -O, --no-owner skip restoration of object ownership in\n"
+" plain-text format\n"
+msgstr " -O, --no-owner 在純文字格å¼è·³éŽé‚„原物件æ“有權\n"
+
+#: pg_dump.c:1087 pg_dumpall.c:646
+#, c-format
+msgid " -s, --schema-only dump only the schema, no data\n"
+msgstr " -s, --schema-only åªå‚™ä»½ schema,ä¸å«è³‡æ–™\n"
+
+#: pg_dump.c:1088
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n"
+msgstr " -S, --superuser=NAME 在純文字格å¼ä½¿ç”¨çš„超級使用者å稱\n"
+
+#: pg_dump.c:1089
+#, c-format
+msgid " -t, --table=PATTERN dump only the specified table(s)\n"
+msgstr " -t, --table=PATTERN åªå‚™ä»½æŒ‡å®šçš„資料表\n"
+
+#: pg_dump.c:1090
+#, c-format
+msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n"
+msgstr " -T, --exclude-table=PATTERN ä¸è¦å‚™ä»½æŒ‡å®šçš„資料表\n"
+
+#: pg_dump.c:1091 pg_dumpall.c:649
+#, c-format
+msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges ä¸è¦å‚™ä»½æ¬Šé™(grant/revoke)\n"
+
+#: pg_dump.c:1092 pg_dumpall.c:650
+#, c-format
+msgid " --binary-upgrade for use by upgrade utilities only\n"
+msgstr " --binary-upgrade åªä¾›å‡ç´šå·¥å…·ä½¿ç”¨\n"
+
+#: pg_dump.c:1093 pg_dumpall.c:651
+#, c-format
+msgid " --column-inserts dump data as INSERT commands with column names\n"
+msgstr " --column-inserts 將資料備份為包å«æ¬„ä½å稱的 INSERT 命令\n"
+
+#: pg_dump.c:1094 pg_dumpall.c:652
+#, c-format
+msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n"
+msgstr " --disable-dollar-quoting åœç”¨éŒ¢è™Ÿå¼•è™Ÿï¼Œä½¿ç”¨ SQL 標準引號\n"
+
+#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464
+#, c-format
+msgid " --disable-triggers disable triggers during data-only restore\n"
+msgstr " --disable-triggers 還原 data-only 備份時åœç”¨è§¸ç™¼å™¨\n"
+
+#: pg_dump.c:1096
+#, c-format
+msgid ""
+" --enable-row-security enable row security (dump only content user has\n"
+" access to)\n"
+msgstr " --enable-row-security 啟用列安全性(åªå‚™ä»½ä½¿ç”¨è€…有存å–權的內容)\n"
+
+#: pg_dump.c:1098
+#, c-format
+msgid ""
+" --exclude-table-and-children=PATTERN\n"
+" do NOT dump the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --exclude-table-and-children=PATTERN\n"
+" ä¸è¦å‚™ä»½æŒ‡å®šçš„資料表,包括\n"
+" å­è³‡æ–™è¡¨å’Œåˆ†å‰²è³‡æ–™è¡¨\n"
+
+#: pg_dump.c:1101
+#, c-format
+msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
+msgstr " --exclude-table-data=PATTERN ä¸è¦å‚™ä»½æŒ‡å®šè³‡æ–™è¡¨çš„資料\n"
+
+#: pg_dump.c:1102
+#, c-format
+msgid ""
+" --exclude-table-data-and-children=PATTERN\n"
+" do NOT dump data for the specified table(s),\n"
+" including child and partition tables\n"
+msgstr ""
+" --exclude-table-data-and-children=PATTERN\n"
+" ä¸è¦å‚™ä»½æŒ‡å®šè³‡æ–™è¡¨çš„資料,包括\n"
+" å­è³‡æ–™è¡¨å’Œåˆ†å‰²è³‡æ–™è¡¨\n"
+"\n"
+
+#: pg_dump.c:1105 pg_dumpall.c:655
+#, c-format
+msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n"
+msgstr " --extra-float-digits=NUM 覆蓋 extra_float_digits çš„é è¨­è¨­å®š\n"
+
+#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466
+#, c-format
+msgid " --if-exists use IF EXISTS when dropping objects\n"
+msgstr " --if-exists 刪除物件時使用 IF EXISTS\n"
+
+#: pg_dump.c:1107
+#, c-format
+msgid ""
+" --include-foreign-data=PATTERN\n"
+" include data of foreign tables on foreign\n"
+" servers matching PATTERN\n"
+msgstr ""
+" --include-foreign-data=PATTERN\n"
+" å«åŒ…ç¬¦åˆ PATTERN 的外部伺æœå™¨ä¸Šçš„\n"
+" 外部資料表中的資料\n"
+
+#: pg_dump.c:1110 pg_dumpall.c:657
+#, c-format
+msgid " --inserts dump data as INSERT commands, rather than COPY\n"
+msgstr " --inserts 備份資料為 INSERT 命令,而ä¸æ˜¯ COPY\n"
+
+#: pg_dump.c:1111 pg_dumpall.c:658
+#, c-format
+msgid " --load-via-partition-root load partitions via the root table\n"
+msgstr " --load-via-partition-root é€éŽä¸»è³‡æ–™è¡¨è¼‰å…¥åˆ†å‰²è³‡æ–™è¡¨\n"
+
+#: pg_dump.c:1112 pg_dumpall.c:659
+#, c-format
+msgid " --no-comments do not dump comments\n"
+msgstr " --no-comments ä¸å‚™ä»½è¨»è§£\n"
+
+#: pg_dump.c:1113 pg_dumpall.c:660
+#, c-format
+msgid " --no-publications do not dump publications\n"
+msgstr " --no-publications ä¸å‚™ä»½ç™¼å¸ƒ\n"
+
+#: pg_dump.c:1114 pg_dumpall.c:662
+#, c-format
+msgid " --no-security-labels do not dump security label assignments\n"
+msgstr " --no-security-labels ä¸å‚™ä»½å®‰å…¨æ€§æ¨™ç±¤\n"
+
+#: pg_dump.c:1115 pg_dumpall.c:663
+#, c-format
+msgid " --no-subscriptions do not dump subscriptions\n"
+msgstr " --no-subscriptions ä¸å‚™ä»½è¨‚é–±\n"
+
+#: pg_dump.c:1116 pg_dumpall.c:665
+#, c-format
+msgid " --no-table-access-method do not dump table access methods\n"
+msgstr " --no-table-access-method ä¸å‚™ä»½è³‡æ–™è¡¨å­˜å–æ–¹å¼\n"
+
+#: pg_dump.c:1117 pg_dumpall.c:666
+#, c-format
+msgid " --no-tablespaces do not dump tablespace assignments\n"
+msgstr " --no-tablespaces ä¸å‚™ä»½è¡¨ç©ºé–“\n"
+
+#: pg_dump.c:1118 pg_dumpall.c:667
+#, c-format
+msgid " --no-toast-compression do not dump TOAST compression methods\n"
+msgstr " --no-toast-compression ä¸å‚™ä»½ TOAST 壓縮方法\n"
+
+#: pg_dump.c:1119 pg_dumpall.c:668
+#, c-format
+msgid " --no-unlogged-table-data do not dump unlogged table data\n"
+msgstr " --no-unlogged-table-data ä¸å‚™ä»½ç„¡æ—¥èªŒè³‡æ–™è¡¨çš„資料\n"
+
+#: pg_dump.c:1120 pg_dumpall.c:669
+#, c-format
+msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n"
+msgstr " --on-conflict-do-nothing 在 INSERT 命令加上 ON CONFLICT DO NOTHING\n"
+
+#: pg_dump.c:1121 pg_dumpall.c:670
+#, c-format
+msgid " --quote-all-identifiers quote all identifiers, even if not key words\n"
+msgstr " --quote-all-identifiers 所有識別å稱加引號,å³ä½¿ä¸æ˜¯é—œéµå­—\n"
+
+#: pg_dump.c:1122 pg_dumpall.c:671
+#, c-format
+msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n"
+msgstr " --rows-per-insert=NROWS æ¯å€‹ INSERT 的資料筆數;æ„味著使用 --inserts\n"
+
+#: pg_dump.c:1123
+#, c-format
+msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n"
+msgstr " --section=SECTION 備份指定的å€æ®µ(pre-dataã€data 或 post-data)\n"
+
+#: pg_dump.c:1124
+#, c-format
+msgid " --serializable-deferrable wait until the dump can run without anomalies\n"
+msgstr " --serializable-deferrable 等待備份å¯åœ¨ç„¡ç•°å¸¸ç‹€æ³ä¸‹åŸ·è¡Œ\n"
+
+#: pg_dump.c:1125
+#, c-format
+msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n"
+msgstr " --snapshot=SNAPSHOT 使用指定的快照進行備份\n"
+
+#: pg_dump.c:1126 pg_restore.c:476
+#, c-format
+msgid ""
+" --strict-names require table and/or schema include patterns to\n"
+" match at least one entity each\n"
+msgstr ""
+" --strict-names 比å°è³‡æ–™è¡¨å’Œschemaçš„PATTERN必需\n"
+" 找到符åˆæ¢ä»¶çš„å°è±¡\n"
+
+#: pg_dump.c:1128
+#, c-format
+msgid ""
+" --table-and-children=PATTERN dump only the specified table(s), including\n"
+" child and partition tables\n"
+msgstr ""
+" --table-and-children=PATTERN åªå‚™ä»½æŒ‡å®šçš„資料表,包括\n"
+" å­è³‡æ–™è¡¨å’Œåˆ†å‰²è³‡æ–™è¡¨\n"
+
+#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478
+#, c-format
+msgid ""
+" --use-set-session-authorization\n"
+" use SET SESSION AUTHORIZATION commands instead of\n"
+" ALTER OWNER commands to set ownership\n"
+msgstr ""
+" --use-set-session-authorization\n"
+" 使用 SET SESSION AUTHORIZATION 命令而éž\n"
+" ALTER OWNER 命令來設定æ“有權\n"
+
+#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"連線é¸é …:\n"
+
+#: pg_dump.c:1135
+#, c-format
+msgid " -d, --dbname=DBNAME database to dump\n"
+msgstr " -d, --dbname=DBNAME è¦å‚™ä»½çš„資料庫\n"
+
+#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ–socket目錄\n"
+
+#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484
+#, c-format
+msgid " -p, --port=PORT database server port number\n"
+msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ \n"
+
+#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485
+#, c-format
+msgid " -U, --username=NAME connect as specified database user\n"
+msgstr " -U, --username=NAME 以指定的資料庫使用者連線\n"
+
+#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ä¸è©¢å•å¯†ç¢¼\n"
+
+#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password è¦æ±‚輸入密碼(應該是自動的)\n"
+
+#: pg_dump.c:1141 pg_dumpall.c:684
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before dump\n"
+msgstr " --role=ROLENAME å‚™ä»½ä¹‹å‰ SET ROLE\n"
+
+#: pg_dump.c:1143
+#, c-format
+msgid ""
+"\n"
+"If no database name is supplied, then the PGDATABASE environment\n"
+"variable value is used.\n"
+"\n"
+msgstr ""
+"\n"
+"若未æ供資料庫å稱,則使用環境變數 PGDATABASE 的內容。\n"
+"\n"
+
+#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "回報錯誤至 <%s>。\n"
+
+#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網é : <%s>\n"
+
+#: pg_dump.c:1165 pg_dumpall.c:513
+#, c-format
+msgid "invalid client encoding \"%s\" specified"
+msgstr "指定的客戶端編碼 \"%s\" 無效"
+
+#: pg_dump.c:1303
+#, c-format
+msgid "parallel dumps from standby servers are not supported by this server version"
+msgstr "伺æœå™¨ç‰ˆæœ¬ä¸æ”¯æ´ä¾†è‡ªå¾…命伺æœå™¨çš„並行備份"
+
+#: pg_dump.c:1368
+#, c-format
+msgid "invalid output format \"%s\" specified"
+msgstr "æŒ‡å®šçš„è¼¸å‡ºæ ¼å¼ \"%s\" 無效"
+
+# catalog/namespace.c:1201 gram.y:2516 gram.y:7422 parser/parse_expr.c:1183
+# parser/parse_target.c:734
+#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ä¸åˆé©çš„完整å稱(太多點號å稱): %s"
+
+# describe.c:1542
+#: pg_dump.c:1417
+#, c-format
+msgid "no matching schemas were found for pattern \"%s\""
+msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" çš„ schema"
+
+# describe.c:1542
+#: pg_dump.c:1470
+#, c-format
+msgid "no matching extensions were found for pattern \"%s\""
+msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" 的擴充功能"
+
+#: pg_dump.c:1523
+#, c-format
+msgid "no matching foreign servers were found for pattern \"%s\""
+msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" 的外部伺æœå™¨"
+
+# catalog/namespace.c:1313
+#: pg_dump.c:1594
+#, c-format
+msgid "improper relation name (too many dotted names): %s"
+msgstr "ä¸åˆé©çš„é—œè¯å稱(太多點號å稱): %s"
+
+# describe.c:1542
+#: pg_dump.c:1616
+#, c-format
+msgid "no matching tables were found for pattern \"%s\""
+msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" 的資料表"
+
+# common.c:636
+# common.c:871
+#: pg_dump.c:1643
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ç›®å‰å°šæœªé€£ç·šè‡³è³‡æ–™åº«ã€‚"
+
+# catalog/namespace.c:1195 parser/parse_expr.c:1157 parser/parse_target.c:725
+#: pg_dump.c:1646
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "尚未實作跨資料庫åƒè€ƒ: %s"
+
+#: pg_dump.c:2077
+#, c-format
+msgid "dumping contents of table \"%s.%s\""
+msgstr "備份資料表 \"%s.%s\" 的內容"
+
+#: pg_dump.c:2183
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed."
+msgstr "備份資料表 \"%s\" 的內容失敗: PQgetCopyData() 失敗。"
+
+#: pg_dump.c:2184 pg_dump.c:2194
+#, c-format
+msgid "Error message from server: %s"
+msgstr "伺æœå™¨éŒ¯èª¤è¨Šæ¯: %s"
+
+#: pg_dump.c:2185 pg_dump.c:2195
+#, c-format
+msgid "Command was: %s"
+msgstr "命令是: %s"
+
+#: pg_dump.c:2193
+#, c-format
+msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed."
+msgstr "備份資料表 \"%s\" 的內容失敗: PQgetResult() 失敗。"
+
+# utils/init/miscinit.c:792 utils/misc/guc.c:5074
+#: pg_dump.c:2275
+#, c-format
+msgid "wrong number of fields retrieved from table \"%s\""
+msgstr "從資料表 \"%s\" å–得的欄ä½æ•¸ä¸æ­£ç¢º"
+
+#: pg_dump.c:2973
+#, c-format
+msgid "saving database definition"
+msgstr "儲存資料庫定義"
+
+#: pg_dump.c:3078
+#, c-format
+msgid "unrecognized locale provider: %s"
+msgstr "無法識別的å€åŸŸæ供者: %s"
+
+#: pg_dump.c:3429
+#, c-format
+msgid "saving encoding = %s"
+msgstr "儲存 encoding = %s"
+
+#: pg_dump.c:3454
+#, c-format
+msgid "saving standard_conforming_strings = %s"
+msgstr "儲存 standard_conforming_strings = %s"
+
+#: pg_dump.c:3493
+#, c-format
+msgid "could not parse result of current_schemas()"
+msgstr "ç„¡æ³•è§£æž current_schemas() çš„çµæžœ"
+
+#: pg_dump.c:3512
+#, c-format
+msgid "saving search_path = %s"
+msgstr "儲存 search_path = %s"
+
+#: pg_dump.c:3549
+#, c-format
+msgid "reading large objects"
+msgstr "讀å–大物件"
+
+#: pg_dump.c:3687
+#, c-format
+msgid "saving large objects"
+msgstr "儲存大物件"
+
+#: pg_dump.c:3728
+#, c-format
+msgid "error reading large object %u: %s"
+msgstr "讀å–大物件 %u 時發生錯誤: %s"
+
+#: pg_dump.c:3834
+#, c-format
+msgid "reading row-level security policies"
+msgstr "讀å–列層級安全政策"
+
+# utils/adt/regproc.c:1209
+#: pg_dump.c:3975
+#, c-format
+msgid "unexpected policy command type: %c"
+msgstr "éžé æœŸçš„政策命令類型: %c"
+
+#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894
+#: pg_dump.c:17896 pg_dump.c:18517
+#, c-format
+msgid "could not parse %s array"
+msgstr "ç„¡æ³•è§£æž %s 陣列"
+
+# utils/misc/guc.c:434
+#: pg_dump.c:4613
+#, c-format
+msgid "subscriptions not dumped because current user is not a superuser"
+msgstr "未備份訂閱,因為目å‰ä½¿ç”¨è€…ä¸æ˜¯è¶…級使用者"
+
+# catalog/dependency.c:152
+#: pg_dump.c:5149
+#, c-format
+msgid "could not find parent extension for %s %s"
+msgstr "找ä¸åˆ° %s %s 的父擴充功能"
+
+# catalog/aclchk.c:1689 catalog/aclchk.c:2001
+#: pg_dump.c:5294
+#, c-format
+msgid "schema with OID %u does not exist"
+msgstr "OID 為 %u çš„ schema ä¸å­˜åœ¨"
+
+#: pg_dump.c:6776 pg_dump.c:17158
+#, c-format
+msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found"
+msgstr "完整性檢查失敗,找ä¸åˆ° OID 為 %u çš„åºåˆ—(父資料表 OID 為 %u)"
+
+#: pg_dump.c:6919
+#, c-format
+msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found"
+msgstr "完整性檢查失敗,在 pg_partitioned_table 中找ä¸åˆ° OID 為 %u 的資料表"
+
+#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671
+#: pg_dump.c:8819
+#, c-format
+msgid "unrecognized table OID %u"
+msgstr "無法辨識的資料表 OID %u"
+
+#: pg_dump.c:7154
+#, c-format
+msgid "unexpected index data for table \"%s\""
+msgstr "éžé æœŸçš„資料表 \"%s\" 索引資料"
+
+#: pg_dump.c:7649
+#, c-format
+msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found"
+msgstr "完整性檢查失敗,找ä¸åˆ° OID 為 %u 的父資料表(pg_rewrite é …ç›® OID 為 %u)"
+
+#: pg_dump.c:7940
+#, c-format
+msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)"
+msgstr "查詢產生空的åƒè€ƒè³‡æ–™è¡¨å稱給資料表 \"%2$s\"(資料表 OID:%3$u)上的外éµè§¸ç™¼å™¨ \"%1$s\" "
+
+#: pg_dump.c:8556
+#, c-format
+msgid "unexpected column data for table \"%s\""
+msgstr "éžé æœŸçš„資料表 \"%s\" 欄ä½è³‡æ–™"
+
+#: pg_dump.c:8585
+#, c-format
+msgid "invalid column numbering in table \"%s\""
+msgstr "資料表 \"%s\" 中的欄ä½ç·¨è™Ÿç„¡æ•ˆ"
+
+# commands/typecmds.c:637
+#: pg_dump.c:8633
+#, c-format
+msgid "finding table default expressions"
+msgstr "尋找資料表的é è¨­è¡¨é”å¼"
+
+#: pg_dump.c:8675
+#, c-format
+msgid "invalid adnum value %d for table \"%s\""
+msgstr "資料表 \"%2$s\" 的 adnum 值 %1$d 的無效"
+
+#: pg_dump.c:8769
+#, c-format
+msgid "finding table check constraints"
+msgstr "尋找表格的檢查約æŸ"
+
+#: pg_dump.c:8823
+#, c-format
+msgid "expected %d check constraint on table \"%s\" but found %d"
+msgid_plural "expected %d check constraints on table \"%s\" but found %d"
+msgstr[0] "é æœŸåœ¨è³‡æ–™è¡¨ \"%2$s\" 上有 %1$d 個檢查約æŸï¼Œä½†æ‰¾åˆ° %3$d 個"
+
+#: pg_dump.c:8827
+#, c-format
+msgid "The system catalogs might be corrupted."
+msgstr "系統目錄å¯èƒ½å·²æ毀"
+
+# catalog/aclchk.c:1917
+#: pg_dump.c:9517
+#, c-format
+msgid "role with OID %u does not exist"
+msgstr "OID 為 %u 的角色ä¸å­˜åœ¨"
+
+#: pg_dump.c:9629 pg_dump.c:9658
+#, c-format
+msgid "unsupported pg_init_privs entry: %u %u %d"
+msgstr "ä¸æ”¯æ´çš„ pg_init_privs 項目:%u %u %d"
+
+#: pg_dump.c:10479
+#, c-format
+msgid "typtype of data type \"%s\" appears to be invalid"
+msgstr "資料型別 \"%s\" 的 typtype 似乎無效"
+
+#: pg_dump.c:12053
+#, c-format
+msgid "unrecognized provolatile value for function \"%s\""
+msgstr "函數 \"%s\" 的 provolatile 值無法識別"
+
+#: pg_dump.c:12103 pg_dump.c:13985
+#, c-format
+msgid "unrecognized proparallel value for function \"%s\""
+msgstr "函數 \"%s\" 的 proparallel 值無法識別"
+
+# access/heap/heapam.c:495
+#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346
+#, c-format
+msgid "could not find function definition for function with OID %u"
+msgstr "找ä¸åˆ° OID 為 %u 的函數定義"
+
+#: pg_dump.c:12272
+#, c-format
+msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field"
+msgstr "pg_cast.castfunc 或 pg_cast.castmethod 欄ä½çš„內容是å½é€ çš„"
+
+#: pg_dump.c:12275
+#, c-format
+msgid "bogus value in pg_cast.castmethod field"
+msgstr "pg_cast.castmethod 欄ä½çš„內容是å½é€ çš„"
+
+#: pg_dump.c:12365
+#, c-format
+msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero"
+msgstr "轉æ›å®šç¾©æ˜¯å½é€ çš„,trffromsql å’Œ trftosql 至少其中一個應為éžé›¶å€¼"
+
+#: pg_dump.c:12382
+#, c-format
+msgid "bogus value in pg_transform.trffromsql field"
+msgstr "pg_transform.trffromsql 欄ä½çš„內容是å½é€ çš„"
+
+#: pg_dump.c:12403
+#, c-format
+msgid "bogus value in pg_transform.trftosql field"
+msgstr "pg_transform.trftosql 欄ä½çš„內容是å½é€ çš„"
+
+# catalog/pg_proc.c:487
+#: pg_dump.c:12548
+#, c-format
+msgid "postfix operators are not supported anymore (operator \"%s\")"
+msgstr "ä¸å†æ”¯æ´å¾Œç½®é‹ç®—符(é‹ç®—符 \"%s\")"
+
+#: pg_dump.c:12718
+#, c-format
+msgid "could not find operator with OID %s"
+msgstr "找ä¸åˆ° OID 為 %s çš„é‹ç®—符"
+
+# parser/parse_type.c:372 parser/parse_type.c:467
+#: pg_dump.c:12786
+#, c-format
+msgid "invalid type \"%c\" of access method \"%s\""
+msgstr "å­˜å–方法 \"%2$s\" çš„é¡žåž‹ \"%1$c\" 無效"
+
+# utils/misc/guc.c:3281 utils/misc/guc.c:3970 utils/misc/guc.c:4006
+# utils/misc/guc.c:4062 utils/misc/guc.c:4399 utils/misc/guc.c:4548
+#: pg_dump.c:13455 pg_dump.c:13514
+#, c-format
+msgid "unrecognized collation provider: %s"
+msgstr "無法識別的定åºæ供者: %s"
+
+#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498
+#, c-format
+msgid "invalid collation \"%s\""
+msgstr "ç„¡æ•ˆçš„å®šåº \"%s\""
+
+#: pg_dump.c:13904
+#, c-format
+msgid "unrecognized aggfinalmodify value for aggregate \"%s\""
+msgstr "èšåˆå‡½æ•¸ \"%s\" çš„ aggfinalmodify 值無法識別"
+
+#: pg_dump.c:13960
+#, c-format
+msgid "unrecognized aggmfinalmodify value for aggregate \"%s\""
+msgstr "èšåˆå‡½æ•¸ \"%s\" çš„ aggmfinalmodify 值無法識別"
+
+#: pg_dump.c:14677
+#, c-format
+msgid "unrecognized object type in default privileges: %d"
+msgstr "無法識別物件類型給é è¨­æ¬Šé™: %d"
+
+#: pg_dump.c:14693
+#, c-format
+msgid "could not parse default ACL list (%s)"
+msgstr "無法解æžé è¨­ ACL 清單(%s)"
+
+#: pg_dump.c:14775
+#, c-format
+msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "無法解æžé è¨­åˆå§‹ ACL 清單(%s)或é è¨­(%s)給物件 \"%s\"(%s)"
+
+#: pg_dump.c:14800
+#, c-format
+msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)"
+msgstr "無法解æžé è¨­ ACL 清單(%s)或é è¨­(%s)給物件 \"%s\"(%s)"
+
+#: pg_dump.c:15341
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned no data"
+msgstr "å–得檢視表 \"%s\" 定義的查詢未回傳資料"
+
+#: pg_dump.c:15344
+#, c-format
+msgid "query to obtain definition of view \"%s\" returned more than one definition"
+msgstr "å–得檢視表 \"%s\" 定義的查詢回傳一筆以上定義"
+
+#: pg_dump.c:15351
+#, c-format
+msgid "definition of view \"%s\" appears to be empty (length zero)"
+msgstr "檢視表 \"%s\" 的定義似乎是空的(長度為 0)"
+
+# commands/dbcommands.c:138
+#: pg_dump.c:15435
+#, c-format
+msgid "WITH OIDS is not supported anymore (table \"%s\")"
+msgstr "ä¸å†æ”¯æ´ WITH OIDS(資料表 \"%s\")"
+
+#: pg_dump.c:16359
+#, c-format
+msgid "invalid column number %d for table \"%s\""
+msgstr "表格 \"%2$s\" 的欄ä½ç·¨è™Ÿ %1$d 無效"
+
+# postmaster/pgstat.c:1908
+#: pg_dump.c:16437
+#, c-format
+msgid "could not parse index statistic columns"
+msgstr "無法解æžç´¢å¼•çµ±è¨ˆæ¬„ä½"
+
+# postmaster/pgstat.c:2234
+#: pg_dump.c:16439
+#, c-format
+msgid "could not parse index statistic values"
+msgstr "無法解æžç´¢å¼•çµ±è¨ˆå…§å®¹"
+
+#: pg_dump.c:16441
+#, c-format
+msgid "mismatched number of columns and values for index statistics"
+msgstr "索引統計欄ä½å’Œå…§å®¹çš„數é‡ä¸ä¸€è‡´"
+
+#: pg_dump.c:16657
+#, c-format
+msgid "missing index for constraint \"%s\""
+msgstr "ç¼ºå°‘ç´„æŸ \"%s\" 的索引"
+
+#: pg_dump.c:16892
+#, c-format
+msgid "unrecognized constraint type: %c"
+msgstr "無法識別的約æŸé¡žåž‹: %c"
+
+#: pg_dump.c:16993 pg_dump.c:17222
+#, c-format
+msgid "query to get data of sequence \"%s\" returned %d row (expected 1)"
+msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)"
+msgstr[0] "å–å¾—åºåˆ— \"%s\" 資料的查詢回傳 %d 筆資料(é æœŸ 1 ç­†)"
+
+# utils/adt/acl.c:1261 utils/adt/acl.c:1486 utils/adt/acl.c:1698
+# utils/adt/acl.c:1902 utils/adt/acl.c:2106 utils/adt/acl.c:2315
+# utils/adt/acl.c:2516
+#: pg_dump.c:17025
+#, c-format
+msgid "unrecognized sequence type: %s"
+msgstr "無法辨識的åºåˆ—é¡žåž‹: %s"
+
+# fe-exec.c:1204
+#: pg_dump.c:17314
+#, c-format
+msgid "unexpected tgtype value: %d"
+msgstr "éžé æœŸçš„ tgtype 值: %d"
+
+#: pg_dump.c:17386
+#, c-format
+msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\""
+msgstr "觸發器 \"%2$s\" 在表格 \"%3$s\" 上的åƒæ•¸å­—串無效(%1$s)"
+
+#: pg_dump.c:17655
+#, c-format
+msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned"
+msgstr "å–得資料表 \"%s\" çš„è¦å‰‡ \"%s\" 的查詢失敗: 回傳的資料筆數錯誤"
+
+# catalog/dependency.c:152
+#: pg_dump.c:17808
+#, c-format
+msgid "could not find referenced extension %u"
+msgstr "找ä¸åˆ°åƒè€ƒçš„擴充功能 %u"
+
+#: pg_dump.c:17898
+#, c-format
+msgid "mismatched number of configurations and conditions for extension"
+msgstr "擴充功能的é…置和æ¢ä»¶çš„數é‡ä¸ä¸€è‡´"
+
+#: pg_dump.c:18030
+#, c-format
+msgid "reading dependency data"
+msgstr "讀å–相ä¾æ€§è³‡æ–™"
+
+#: pg_dump.c:18116
+#, c-format
+msgid "no referencing object %u %u"
+msgstr "沒有åƒè€ƒç‰©ä»¶ %u %u"
+
+#: pg_dump.c:18127
+#, c-format
+msgid "no referenced object %u %u"
+msgstr "沒有被åƒè€ƒç‰©ä»¶ %u %u"
+
+# commands/user.c:240 commands/user.c:371
+#: pg_dump_sort.c:422
+#, c-format
+msgid "invalid dumpId %d"
+msgstr "無效的 dumpId %d"
+
+# commands/dbcommands.c:263
+#: pg_dump_sort.c:428
+#, c-format
+msgid "invalid dependency %d"
+msgstr "無效的相ä¾æ€§ %d"
+
+#: pg_dump_sort.c:661
+#, c-format
+msgid "could not identify dependency loop"
+msgstr "無法識別相ä¾æ€§è¿´åœˆ"
+
+#: pg_dump_sort.c:1276
+#, 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:1281
+#, 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:1282
+#, 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:1294
+#, c-format
+msgid "could not resolve dependency loop among these items:"
+msgstr "無法解決這些項目之間的相ä¾è¿´åœˆ:"
+
+#: pg_dumpall.c:230
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "ç¨‹å¼ \"%s\" 被 %s 需è¦ï¼Œä½†åœ¨ç›¸åŒç›®éŒ„下找ä¸åˆ° \"%s\"。"
+
+#: pg_dumpall.c:233
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本與 %s ä¸åŒ"
+
+#: pg_dumpall.c:382
+#, c-format
+msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only"
+msgstr "é¸é … --exclude-database ä¸èƒ½èˆ‡ -g/--globals-only 或 -r/--roles-only 或 -t/--tablespaces-only 一起使用"
+
+#: pg_dumpall.c:390
+#, c-format
+msgid "options -g/--globals-only and -r/--roles-only cannot be used together"
+msgstr "é¸é … -g/--globals-only å’Œ -r/--roles-only ä¸èƒ½ä¸€èµ·ä½¿ç”¨"
+
+#: pg_dumpall.c:397
+#, c-format
+msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together"
+msgstr "é¸é … -g/--globals-only å’Œ -t/--tablespaces-only ä¸èƒ½ä¸€èµ·ä½¿ç”¨"
+
+#: pg_dumpall.c:407
+#, c-format
+msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together"
+msgstr "é¸é … -r/--roles-only å’Œ -t/--tablespaces-only ä¸èƒ½ä¸€èµ·ä½¿ç”¨"
+
+#: pg_dumpall.c:469 pg_dumpall.c:1750
+#, c-format
+msgid "could not connect to database \"%s\""
+msgstr "無法連線至資料庫\"%s\""
+
+#: pg_dumpall.c:481
+#, c-format
+msgid ""
+"could not connect to databases \"postgres\" or \"template1\"\n"
+"Please specify an alternative database."
+msgstr ""
+"無法連線至資料庫 \"postgres\" 或 \"template1\"\n"
+"請指定å¦ä¸€å€‹è³‡æ–™åº«ã€‚"
+
+#: pg_dumpall.c:629
+#, c-format
+msgid ""
+"%s extracts a PostgreSQL database cluster into an SQL script file.\n"
+"\n"
+msgstr ""
+"%s å°‡ PostgreSQL 資料庫å¢é›†æå–æˆ SQL 腳本檔\n"
+"\n"
+
+#: pg_dumpall.c:631
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr ""
+
+#: pg_dumpall.c:634
+#, c-format
+msgid " -f, --file=FILENAME output file name\n"
+msgstr " -f, --file=FILENAME 輸出檔å稱\n"
+
+#: pg_dumpall.c:641
+#, c-format
+msgid " -c, --clean clean (drop) databases before recreating\n"
+msgstr " -c, --clean é‡å»ºä¹‹å‰æ¸…除(刪除)資料庫\n"
+
+#: pg_dumpall.c:643
+#, c-format
+msgid " -g, --globals-only dump only global objects, no databases\n"
+msgstr " -g, --globals-only åªå‚™ä»½å…¨åŸŸç‰©ä»¶ï¼Œä¸åŒ…括資料庫\n"
+
+#: pg_dumpall.c:644 pg_restore.c:456
+#, c-format
+msgid " -O, --no-owner skip restoration of object ownership\n"
+msgstr " -O, --no-owner è·³éŽç‰©ä»¶æ‰€æœ‰æ¬Šçš„還原\n"
+
+#: pg_dumpall.c:645
+#, c-format
+msgid " -r, --roles-only dump only roles, no databases or tablespaces\n"
+msgstr " -r, --roles-only åªå‚™ä»½è§’色,ä¸åŒ…括資料庫或表空間\n"
+
+#: pg_dumpall.c:647
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use in the dump\n"
+msgstr " -S, --superuser=NAME 備份時使用的超級使用者å稱\n"
+
+#: pg_dumpall.c:648
+#, c-format
+msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n"
+msgstr " -t, --tablespaces-only åªå‚™ä»½è¡¨ç©ºé–“,ä¸åŒ…括資料庫或角色\n"
+
+#: pg_dumpall.c:654
+#, c-format
+msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n"
+msgstr " --exclude-database=PATTERN 排除å稱符åˆPATTERN的資料庫\n"
+
+#: pg_dumpall.c:661
+#, c-format
+msgid " --no-role-passwords do not dump passwords for roles\n"
+msgstr " --no-role-passwords ä¸è¦å‚™ä»½è§’色的密碼\n"
+
+#: pg_dumpall.c:677
+#, c-format
+msgid " -d, --dbname=CONNSTR connect using connection string\n"
+msgstr " -d, --dbname=CONNSTR 用連線字串進行連線\n"
+
+#: pg_dumpall.c:679
+#, c-format
+msgid " -l, --database=DBNAME alternative default database\n"
+msgstr " -l, --database=DBNAME 替代的é è¨­è³‡æ–™åº«\n"
+
+#: pg_dumpall.c:686
+#, c-format
+msgid ""
+"\n"
+"If -f/--file is not used, then the SQL script will be written to the standard\n"
+"output.\n"
+"\n"
+msgstr ""
+"\n"
+"若未使用 -f/--file é¸é …,SQL 腳本將被寫入標準輸出。\n"
+"\n"
+
+#: pg_dumpall.c:828
+#, c-format
+msgid "role name starting with \"pg_\" skipped (%s)"
+msgstr "è·³éŽä»¥ \"pg_\" 開頭的角色å稱(%s)"
+
+#: pg_dumpall.c:1050
+#, c-format
+msgid "could not find a legal dump ordering for memberships in role \"%s\""
+msgstr "無法為角色 \"%s\" çš„æˆå“¡æ‰¾åˆ°åˆæ³•çš„備份順åº"
+
+#: pg_dumpall.c:1185
+#, c-format
+msgid "could not parse ACL list (%s) for parameter \"%s\""
+msgstr "無法解æžåƒæ•¸ \"%2$s\" çš„ ACL 清單 (%1$s)"
+
+#: pg_dumpall.c:1303
+#, c-format
+msgid "could not parse ACL list (%s) for tablespace \"%s\""
+msgstr "無法解æžè¡¨ç©ºé–“ \"%2$s\" çš„ ACL 清單 (%1$s)"
+
+#: pg_dumpall.c:1510
+#, c-format
+msgid "excluding database \"%s\""
+msgstr "排除資料庫 \"%s\""
+
+#: pg_dumpall.c:1514
+#, c-format
+msgid "dumping database \"%s\""
+msgstr "備份資料庫\"%s\""
+
+#: pg_dumpall.c:1545
+#, c-format
+msgid "pg_dump failed on database \"%s\", exiting"
+msgstr "pg_dump 資料庫 \"%s\" 失敗,çµæŸ"
+
+# command.c:1148
+#: pg_dumpall.c:1551
+#, c-format
+msgid "could not re-open the output file \"%s\": %m"
+msgstr "無法é‡æ–°é–‹å•Ÿè¼¸å‡ºæª” \"%s\": %m"
+
+#: pg_dumpall.c:1592
+#, c-format
+msgid "running \"%s\""
+msgstr "執行 \"%s\""
+
+#: pg_dumpall.c:1793
+#, c-format
+msgid "could not get server version"
+msgstr "無法å–得伺æœå™¨ç‰ˆæœ¬"
+
+#: pg_dumpall.c:1796
+#, c-format
+msgid "could not parse server version \"%s\""
+msgstr "無法解æžä¼ºæœå™¨ç‰ˆæœ¬\"%s\""
+
+#: pg_dumpall.c:1866 pg_dumpall.c:1889
+#, c-format
+msgid "executing %s"
+msgstr "執行 %s"
+
+#: pg_restore.c:313
+#, c-format
+msgid "one of -d/--dbname and -f/--file must be specified"
+msgstr "必須指定 -d/--dbname 和 -f/--file 其中之一"
+
+#: pg_restore.c:320
+#, c-format
+msgid "options -d/--dbname and -f/--file cannot be used together"
+msgstr "ä¸èƒ½åŒæ™‚使用 -d/--dbname å’Œ -f/--file é¸é …"
+
+#: pg_restore.c:338
+#, c-format
+msgid "options -C/--create and -1/--single-transaction cannot be used together"
+msgstr "ä¸èƒ½åŒæ™‚使用 -C/--create å’Œ -1/--single-transaction é¸é …"
+
+#: pg_restore.c:342
+#, c-format
+msgid "cannot specify both --single-transaction and multiple jobs"
+msgstr "ä¸èƒ½åŒæ™‚指定 --single-transaction 和多個工作"
+
+#: pg_restore.c:380
+#, c-format
+msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\""
+msgstr "無法識別的å°å­˜æª”æ ¼å¼ \"%s\",請指定 \"c\" 或 \"d\" 或 \"t\""
+
+#: pg_restore.c:419
+#, c-format
+msgid "errors ignored on restore: %d"
+msgstr "還原時忽略的錯誤: %d"
+
+#: pg_restore.c:432
+#, c-format
+msgid ""
+"%s restores a PostgreSQL database from an archive created by pg_dump.\n"
+"\n"
+msgstr ""
+"%s 從 pg_dump 所產生的å°å­˜æª”還原 PostgreSQL 資料庫。\n"
+"\n"
+
+#: pg_restore.c:434
+#, c-format
+msgid " %s [OPTION]... [FILE]\n"
+msgstr ""
+
+#: pg_restore.c:437
+#, c-format
+msgid " -d, --dbname=NAME connect to database name\n"
+msgstr " -d, --dbname=NAME 連線至資料庫å稱\n"
+
+#: pg_restore.c:438
+#, c-format
+msgid " -f, --file=FILENAME output file name (- for stdout)\n"
+msgstr " -f, --file=FILENAME 輸出檔å(- 代表標準輸出)\n"
+
+#: pg_restore.c:439
+#, c-format
+msgid " -F, --format=c|d|t backup file format (should be automatic)\n"
+msgstr " -F, --format=c|d|t 備份檔格å¼(應會自動é¸æ“‡)\n"
+
+#: pg_restore.c:440
+#, c-format
+msgid " -l, --list print summarized TOC of the archive\n"
+msgstr " -l, --list 顯示å°å­˜æª”çš„ TOC 摘è¦\n"
+
+#: pg_restore.c:441
+#, c-format
+msgid " -v, --verbose verbose mode\n"
+msgstr " -v, --verbose 詳細模å¼\n"
+
+#: pg_restore.c:442
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_restore.c:443
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_restore.c:445
+#, c-format
+msgid ""
+"\n"
+"Options controlling the restore:\n"
+msgstr ""
+"\n"
+"還原控制é¸é …:\n"
+
+#: pg_restore.c:446
+#, c-format
+msgid " -a, --data-only restore only the data, no schema\n"
+msgstr " -a, --data-only åªé‚„原資料,ä¸åŒ…括 schema\n"
+
+#: pg_restore.c:448
+#, c-format
+msgid " -C, --create create the target database\n"
+msgstr " -C, --create 建立目標資料庫\n"
+
+#: pg_restore.c:449
+#, c-format
+msgid " -e, --exit-on-error exit on error, default is to continue\n"
+msgstr " -e, --exit-on-error 發生錯誤就çµæŸï¼Œé è¨­æ˜¯ç¹¼çºŒåŸ·è¡Œ\n"
+
+#: pg_restore.c:450
+#, c-format
+msgid " -I, --index=NAME restore named index\n"
+msgstr " -I, --index=NAME 還原指定的索引\n"
+
+#: pg_restore.c:451
+#, c-format
+msgid " -j, --jobs=NUM use this many parallel jobs to restore\n"
+msgstr " -j, --jobs=NUM 用這麼多並行工作進行還原\n"
+
+#: pg_restore.c:452
+#, c-format
+msgid ""
+" -L, --use-list=FILENAME use table of contents from this file for\n"
+" selecting/ordering output\n"
+msgstr " -L, --use-list=FILENAME 用檔案中的目錄表來é¸æ“‡/排åºè¼¸å‡º\n"
+
+#: pg_restore.c:454
+#, c-format
+msgid " -n, --schema=NAME restore only objects in this schema\n"
+msgstr " -n, --schema=NAME åªé‚„原指定 schema 中的物件\n"
+
+#: pg_restore.c:455
+#, c-format
+msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n"
+msgstr " -N, --exclude-schema=NAME ä¸è¦é‚„原指定 schema 中的物件\n"
+
+#: pg_restore.c:457
+#, c-format
+msgid " -P, --function=NAME(args) restore named function\n"
+msgstr " -P, --function=NAME(args) 還原指定的函數\n"
+
+#: pg_restore.c:458
+#, c-format
+msgid " -s, --schema-only restore only the schema, no data\n"
+msgstr " -s, --schema-only åªé‚„原 schema,ä¸åŒ…å«è³‡æ–™\n"
+
+#: pg_restore.c:459
+#, c-format
+msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n"
+msgstr " -S, --superuser=NAME 用於åœç”¨è§¸ç™¼å™¨çš„超級使用者å稱\n"
+
+#: pg_restore.c:460
+#, c-format
+msgid " -t, --table=NAME restore named relation (table, view, etc.)\n"
+msgstr " -t, --table=NAME 還原指定的關è¯(資料表ã€æª¢è¦–表等)\n"
+
+#: pg_restore.c:461
+#, c-format
+msgid " -T, --trigger=NAME restore named trigger\n"
+msgstr " -T, --trigger=NAME 還原指定的觸發器\n"
+
+#: pg_restore.c:462
+#, c-format
+msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n"
+msgstr " -x, --no-privileges ä¸é‚„原存å–權é™(grant/revoke)\n"
+
+#: pg_restore.c:463
+#, c-format
+msgid " -1, --single-transaction restore as a single transaction\n"
+msgstr " -1, --single-transaction 用一個交易還原\n"
+
+#: pg_restore.c:465
+#, c-format
+msgid " --enable-row-security enable row security\n"
+msgstr " --enable-row-security 啟動列層級安全性\n"
+
+#: pg_restore.c:467
+#, c-format
+msgid " --no-comments do not restore comments\n"
+msgstr " --no-comments ä¸è¦é‚„原註釋\n"
+
+#: pg_restore.c:468
+#, c-format
+msgid ""
+" --no-data-for-failed-tables do not restore data of tables that could not be\n"
+" created\n"
+msgstr " --no-data-for-failed-tables ä¸è¦ç‚ºç„¡æ³•å»ºç«‹çš„資料表還原資料\n"
+
+#: pg_restore.c:470
+#, c-format
+msgid " --no-publications do not restore publications\n"
+msgstr " --no-publications ä¸è¦é‚„原發布\n"
+
+#: pg_restore.c:471
+#, c-format
+msgid " --no-security-labels do not restore security labels\n"
+msgstr " --no-security-labels ä¸è¦é‚„原安全性標籤\n"
+
+#: pg_restore.c:472
+#, c-format
+msgid " --no-subscriptions do not restore subscriptions\n"
+msgstr " --no-subscriptions ä¸è¦é‚„原訂閱\n"
+
+#: pg_restore.c:473
+#, c-format
+msgid " --no-table-access-method do not restore table access methods\n"
+msgstr " --no-table-access-method ä¸è¦é‚„原資料表存å–æ–¹å¼\n"
+
+#: pg_restore.c:474
+#, c-format
+msgid " --no-tablespaces do not restore tablespace assignments\n"
+msgstr " --no-tablespaces ä¸è¦é‚„原表空間分é…\n"
+
+#: pg_restore.c:475
+#, c-format
+msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n"
+msgstr ""
+" --section=SECTION 還原指定的å€æ®µ(pre-dataã€data 或 post-data)\n"
+"\n"
+
+#: pg_restore.c:488
+#, c-format
+msgid " --role=ROLENAME do SET ROLE before restore\n"
+msgstr " --role=ROLENAME é‚„åŽŸä¹‹å‰ SET ROLE\n"
+
+#: pg_restore.c:490
+#, c-format
+msgid ""
+"\n"
+"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n"
+"multiple times to select multiple objects.\n"
+msgstr ""
+"\n"
+"é¸é … -Iã€-nã€-Nã€-Pã€-tã€-T å’Œ --section å¯ä»¥åŒæ™‚使用並多次指定,以é¸æ“‡å¤šå€‹ç‰©ä»¶\n"
+
+#: pg_restore.c:493
+#, c-format
+msgid ""
+"\n"
+"If no input file name is supplied, then standard input is used.\n"
+"\n"
+msgstr ""
+"\n"
+"若未æ供輸入檔å則會使用標準輸入。\n"
+"\n"
+
+#, c-format
+#~ msgid " --disable-triggers disable triggers during data-only restore\n"
+#~ msgstr " --disable-triggers 在 data-only 還原期間åœç”¨è§¸ç™¼ç¨‹åº\n"
+
+#, c-format
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help 顯示此說明,然後çµæŸ\n"
+
+#, c-format
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help 顯示這份說明然後çµæŸ\n"
+
+#, c-format
+#~ msgid ""
+#~ " --use-set-session-authorization\n"
+#~ " use SET SESSION AUTHORIZATION commands instead of\n"
+#~ " ALTER OWNER commands to set ownership\n"
+#~ msgstr ""
+#~ " --use-set-session-authorization\n"
+#~ " 使用 SET SESSION AUTHORIZATION 指令而éž\n"
+#~ " ALTER OWNER 指令來設定æ“有關係\n"
+
+#, c-format
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version 輸出版本資訊,然後çµæŸ\n"
+
+#, c-format
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version 顯示版本資訊然後çµæŸ\n"
+
+#, c-format
+#~ msgid " -O, --no-owner skip restoration of object ownership\n"
+#~ msgstr " -O, --no-owner 忽略設定物件æ“有關係的命令\n"
+
+#, c-format
+#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n"
+#~ msgstr " -Z, --compress=0-9 壓縮格å¼çš„壓縮層級\n"
+
+#, c-format
+#~ msgid " -c, --clean clean (drop) database objects before recreating\n"
+#~ msgstr " -c, --clean é‡å»ºä¹‹å‰æ¸…除 (æ¨æ£„) 資料庫物件\n"
+
+#, c-format
+#~ msgid " -o, --oids include OIDs in dump\n"
+#~ msgstr " -o, --oids å°‡ OID 包å«åœ¨å‚™ä»½ä¸­\n"
+
+#, c-format
+#~ msgid "%s: could not connect to database \"%s\": %s\n"
+#~ msgstr "%s: 無法連線至資料庫\"%s\": %s\n"
+
+# command.c:1148
+#, c-format
+#~ msgid "%s: could not open the output file \"%s\": %s\n"
+#~ msgstr "%s: 無法開啟輸出檔 \"%s\":%s\n"
+
+#, c-format
+#~ msgid "%s: could not parse version \"%s\"\n"
+#~ msgstr "%s: 無法解譯版本 \"%s\"\n"
+
+#, c-format
+#~ msgid "%s: executing %s\n"
+#~ msgstr "%s: 執行 %s\n"
+
+#~ msgid "%s: invalid -X option -- %s\n"
+#~ msgstr "%s: 無效的 -X é¸é … -- %s\n"
+
+#, c-format
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: 記憶體用盡\n"
+
+#~ msgid "(The INSERT command cannot set OIDs.)\n"
+#~ msgstr "(INSERT命令ä¸èƒ½è¨­å®šOID。)\n"
+
+#~ msgid "*** aborted because of error\n"
+#~ msgstr "*** 因為發生錯誤而中止\n"
+
+#~ msgid "-C and -1 are incompatible options\n"
+#~ msgstr "-C å’Œ -1 是ä¸ç›¸å®¹é¸é …\n"
+
+#~ msgid "-C and -c are incompatible options\n"
+#~ msgstr "-C å’Œ -c é¸é …ä¸å¯ä»¥åŒæ™‚使?\n"
+
+#~ msgid "SQL command failed\n"
+#~ msgstr "SQL命令失敗\n"
+
+#, c-format
+#~ msgid "TOC Entry %s at %s (length %lu, checksum %d)\n"
+#~ msgstr "TOC Entry %s 於 %s (長度 %lu,checksum %d)\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"pg_dump\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "%s 需è¦\"pg_dump\"程å¼ï¼Œä½†æ˜¯åœ¨èˆ‡\"%s\"相åŒçš„目錄中找ä¸åˆ°ã€‚\n"
+#~ "請檢查你的安è£ã€‚\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"pg_dump\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "%s 已找到\"pg_dump\"程å¼ï¼Œä½†æ˜¯èˆ‡\"%s\"版本ä¸ç¬¦ã€‚\n"
+#~ "請檢查你的安è£ã€‚\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "執行 \"%s --help\" 以顯示更多資訊。\n"
+
+#~ msgid ""
+#~ "WARNING:\n"
+#~ " This format is for demonstration purposes; it is not intended for\n"
+#~ " normal use. Files will be written in the current working directory.\n"
+#~ msgstr ""
+#~ "警告: \n"
+#~ " 這種格å¼åƒ…用於示範,ä¸æ˜¯ç”¨ä¾†åšä¸€èˆ¬å‚™ä»½ï¼Œæª”案會被\n"
+#~ " 寫至目å‰çš„工作目錄\n"
+
+#, c-format
+#~ msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n"
+#~ msgstr "警告: 此資料庫版本無法正確備份aggregate function %s,予以忽略\n"
+
+#~ msgid "WARNING: bogus value in proargmodes array\n"
+#~ msgstr "警告: proargmodes 陣列中有å½å€¼\n"
+
+#~ msgid "WARNING: could not parse proallargtypes array\n"
+#~ msgstr "警告: 無法解譯 proallargtypes 陣列\n"
+
+#~ msgid "WARNING: could not parse proargnames array\n"
+#~ msgstr "警告: 無法解讀proargnames陣列\n"
+
+#~ msgid "WARNING: could not parse proconfig array\n"
+#~ msgstr "警告: 無法解譯 proconfig 陣列\n"
+
+#~ msgid "WARNING: ftell mismatch with expected position -- ftell used\n"
+#~ msgstr "警告: ftell與é æœŸä½ç½®ä¸ç¬¦ -- 已使用ftell\n"
+
+#, c-format
+#~ msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n"
+#~ msgstr "警告: aggregate function \"%s\"çš„æ“有者無效\n"
+
+#, c-format
+#~ msgid "WARNING: owner of function \"%s\" appears to be invalid\n"
+#~ msgstr "警告: 函å¼\"%s\"çš„æ“有者無效\n"
+
+#, c-format
+#~ msgid "WARNING: owner of operator \"%s\" appears to be invalid\n"
+#~ msgstr "警告: operator \"%s\"çš„æ“有者無效\n"
+
+#, c-format
+#~ msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n"
+#~ msgstr "警告: operator class \"%s\"çš„æ“有者無效\n"
+
+#, c-format
+#~ msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n"
+#~ msgstr "警告: é‹ç®—å­å®¶æ— \"%s\" çš„æ“有者無效\n"
+
+#, c-format
+#~ msgid "WARNING: owner of schema \"%s\" appears to be invalid\n"
+#~ msgstr "警告: schema \"%s\"çš„æ“有者無效\n"
+
+#, c-format
+#~ msgid "WARNING: owner of table \"%s\" appears to be invalid\n"
+#~ msgstr "警告: 資料表\"%s\"çš„æ“有者無效\n"
+
+#~ msgid "WARNING: requested compression not available in this installation -- archive will be uncompressed\n"
+#~ msgstr "警告: 程å¼ä¸æ”¯æ´è¦æ±‚使用的壓縮法 -- 備份檔將ä¸æœƒè¢«å£“縮\n"
+
+#, c-format
+#~ msgid "allocating AH for %s, format %d\n"
+#~ msgstr "為 %s é…ç½®AHï¼Œæ ¼å¼ %d\n"
+
+#~ msgid "archive member too large for tar format\n"
+#~ msgstr "taræ ¼å¼ä¸­çš„備份檔æˆå“¡å¤ªå¤§\n"
+
+#~ msgid "archiver"
+#~ msgstr "壓縮器"
+
+#~ msgid "archiver (db)"
+#~ msgstr "壓縮器(db)"
+
+#~ msgid "attempting to ascertain archive format\n"
+#~ msgstr "嘗試確èªå‚™ä»½æª”æ ¼å¼\n"
+
+# fe-exec.c:653
+# fe-exec.c:705
+# fe-exec.c:745
+#~ msgid "cannot duplicate null pointer\n"
+#~ msgstr "無法複製 Null 指標\n"
+
+#~ msgid "cannot reopen non-seekable file\n"
+#~ msgstr "無法é‡æ–°é–‹å•Ÿä¸å¯æœå°‹çš„檔案\n"
+
+#~ msgid "cannot reopen stdin\n"
+#~ msgstr "無法é‡æ–°é–‹å•Ÿ stdin\n"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %s 終止"
+
+#~ msgid "compression support is disabled in this format\n"
+#~ msgstr "此種備份格å¼çš„壓縮支æ´è¢«é—œé–‰\n"
+
+#, c-format
+#~ msgid "connecting to database \"%s\" as user \"%s\"\n"
+#~ msgstr "連線至資料庫\"%s\"以使用者\"%s\"\n"
+
+# fe-misc.c:544
+# fe-misc.c:748
+#~ msgid "connection needs password\n"
+#~ msgstr "連線需è¦å¯†ç¢¼\n"
+
+#, c-format
+#~ msgid "connection to database \"%s\" failed: %s"
+#~ msgstr "連線至資料庫\"%s\"失敗: %s"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "無法切æ›ç›®éŒ„至\"%s\""
+
+#~ msgid "could not close data file after reading\n"
+#~ msgstr "讀å–後無法開啟資料檔\n"
+
+#~ msgid "could not close large object file\n"
+#~ msgstr "無法關閉large object檔\n"
+
+#~ msgid "could not close tar member\n"
+#~ msgstr "無法關閉taræˆå“¡\n"
+
+# fe-connect.c:1197
+#, c-format
+#~ msgid "could not create worker thread: %s\n"
+#~ msgstr "無法建立工作者執行緒:%s\n"
+
+#, c-format
+#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n"
+#~ msgstr "在å°å­˜æª”中找ä¸åˆ°å€å¡Š ID %d,å¯èƒ½æ˜¯å¤±åºçš„還原è¦æ±‚所致,因為å°å­˜æª”中缺ä¹è³‡æ–™ä½ç§»ï¼Œæ‰€ä»¥ç„¡æ³•åŠ ä»¥è™•ç†\n"
+
+#~ msgid "could not find entry for pg_indexes in pg_class\n"
+#~ msgstr "pg_class中找ä¸åˆ°pg_indexes\n"
+
+#~ msgid "could not find slot of finished worker\n"
+#~ msgstr "找ä¸åˆ°å®Œæˆçš„工作者ä½ç½®\n"
+
+#~ msgid "could not open large object\n"
+#~ msgstr "無法開啟large object\n"
+
+#, c-format
+#~ msgid "could not open large object TOC for input: %s\n"
+#~ msgstr "無法開啟large object TOCåšè¼¸å…¥: %s\n"
+
+#, c-format
+#~ msgid "could not open large object TOC for output: %s\n"
+#~ msgstr "無法開啟large object TOCåšè¼¸å‡º: %s\n"
+
+#, c-format
+#~ msgid "could not open output file \"%s\" for writing\n"
+#~ msgstr "無法開啟並寫入備份檔\"%s\"\n"
+
+#~ msgid "could not open temporary file\n"
+#~ msgstr "無法開啟暫存檔\n"
+
+#~ msgid "could not output padding at end of tar member\n"
+#~ msgstr "無法輸出填充內容至taræˆå“¡ä¹‹å¾Œ\n"
+
+#, c-format
+#~ msgid "could not parse version string \"%s\"\n"
+#~ msgstr "無法解讀版本字串\"%s\"\n"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "無法讀å–符號連çµ\"%s\""
+
+#~ msgid "could not write byte\n"
+#~ msgstr "無法寫入ä½å…ƒçµ„\n"
+
+#, c-format
+#~ msgid "could not write byte: %s\n"
+#~ msgstr "無法寫入ä½å…ƒçµ„: %s\n"
+
+#~ msgid "could not write null block at end of tar archive\n"
+#~ msgstr "無法在tar備份檔寫入空å€å¡Š\n"
+
+#~ msgid "could not write to custom output routine\n"
+#~ msgstr "無法寫入自定備份函å¼\n"
+
+#, c-format
+#~ msgid "could not write to large object (result: %lu, expected: %lu)\n"
+#~ msgstr "無法寫至large object(çµæžœ: %lu,é æœŸ: %lu)\n"
+
+#~ msgid "custom archiver"
+#~ msgstr "自定壓縮器"
+
+#~ msgid "dumpBlobs(): could not open large object: %s"
+#~ msgstr "dumpBlobs(): 無法開啟large object: %s"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): 找ä¸åˆ° pg_largeobject.relfrozenxid\n"
+
+#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n"
+#~ msgstr "dumpDatabase(): 找ä¸åˆ° pg_largeobject_metadata.relfrozenxid\n"
+
+#~ msgid "entering restore_toc_entries_parallel\n"
+#~ msgstr "正在輸入 restore_toc_entries_parallel\n"
+
+#~ msgid "failed to connect to database\n"
+#~ msgstr "連線至資料庫失敗\n"
+
+#~ msgid "failed to reconnect to database\n"
+#~ msgstr "é‡æ–°é€£ç·šè‡³è³‡æ–™åº«å¤±æ•—\n"
+
+#~ msgid "file archiver"
+#~ msgstr "檔案壓縮器"
+
+#, c-format
+#~ msgid "finding default expressions of table \"%s\"\n"
+#~ msgstr "尋找資料表\"%s\"çš„é è¨­expressions\n"
+
+#, c-format
+#~ msgid "finding the columns and types of table \"%s\"\n"
+#~ msgstr "尋找資料表\"%s\"的欄ä½å’Œåž‹åˆ¥\n"
+
+#~ msgid "found more than one entry for pg_indexes in pg_class\n"
+#~ msgstr "pg_class中發ç¾ä¸€å€‹ä»¥ä¸Šçš„pg_indexes\n"
+
+#~ msgid "found more than one pg_database entry for this database\n"
+#~ msgstr "資料庫中發ç¾ä¸€å€‹ä»¥ä¸Šçš„pg_database\n"
+
+#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()\n"
+#~ msgstr "內部錯誤 -- tarReadRaw()中未指定th或fh\n"
+
+#, c-format
+#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n"
+#~ msgstr "éžæ³•çš„COPY敘述 -- 在字串\"%s\"中找ä¸åˆ°\"copy\"\n"
+
+#, c-format
+#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n"
+#~ msgstr "無效的COPY敘述 -- 找ä¸åˆ°\"from stdin\"於字串\"%s\"çš„ä½ç½® %lu\n"
+
+#, c-format
+#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n"
+#~ msgstr "實際檔案ä½ç½®(%s)與é æœŸä½ç½®(%s)ä¸ç¬¦\n"
+
+#, c-format
+#~ msgid "missing pg_database entry for database \"%s\"\n"
+#~ msgstr "資料庫\"%s\"中沒有pg_database\n"
+
+#~ msgid "missing pg_database entry for this database\n"
+#~ msgstr "資料庫中沒有pg_database\n"
+
+#, c-format
+#~ msgid "moving from position %s to next member at file position %s\n"
+#~ msgstr "從ä½ç½® %s 移至ä½æ–¼æª”案ä½ç½® %s 的下一個æˆå“¡\n"
+
+#~ msgid "no item ready\n"
+#~ msgstr "項目皆未就緒\n"
+
+#~ msgid "no label definitions found for enum ID %u\n"
+#~ msgstr "找ä¸åˆ° enum ID %u 的標籤定義\n"
+
+#, c-format
+#~ msgid "now at file position %s\n"
+#~ msgstr "ç›®å‰åœ¨æª”案ä½ç½® %s\n"
+
+#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n"
+#~ msgstr "é¸é … --inserts/--column-inserts å’Œ -o/--oids ä¸èƒ½ä¸€èµ·ä½¿ç”¨\n"
+
+#~ msgid "parallel_restore should not return\n"
+#~ msgstr "parallel_restore ä¸æ‡‰å‚³å›ž\n"
+
+#, c-format
+#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n"
+#~ msgstr "查詢傳回一個以上(%d)的pg_database於資料庫\"%s\"\n"
+
+#~ msgid "query returned no rows: %s\n"
+#~ msgstr "查詢未傳回資料列:%s\n"
+
+#, c-format
+#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n"
+#~ msgstr "å–å¾—sequence \"%s\"資料的查詢傳回å稱\"%s\"\n"
+
+#, c-format
+#~ msgid "read TOC entry %d (ID %d) for %s %s\n"
+#~ msgstr "讀å–TOC entry %d (ID %d)給%s %s\n"
+
+#, c-format
+#~ msgid "reading triggers for table \"%s\"\n"
+#~ msgstr "為資料表\"%s\"讀å–triggers\n"
+
+#, c-format
+#~ msgid "reducing dependencies for %d\n"
+#~ msgstr "正在減少 %d 的相ä¾æ€§\n"
+
+#, c-format
+#~ msgid "restoring large object OID %u\n"
+#~ msgstr "還原large object OID %u\n"
+
+#~ msgid "saving large object comments\n"
+#~ msgstr "正在儲存大型物件註解\n"
+
+#, c-format
+#~ msgid "schema with OID %u does not exist\n"
+#~ msgstr "OID為%uçš„schemaä¸å­˜åœ¨\n"
+
+#~ msgid "server version must be at least 7.3 to use schema selection switches\n"
+#~ msgstr "伺æœå™¨ç‰ˆæœ¬å¿…須至少是 7.3,æ‰èƒ½ä½¿ç”¨ç¶²è¦é¸å–åƒæ•¸\n"
+
+#, c-format
+#~ msgid "setting owner and privileges for %s %s\n"
+#~ msgstr "為 %s %s 設定æ“有者和權é™\n"
+
+#, c-format
+#~ msgid "skipping tar member %s\n"
+#~ msgstr "è·³éŽtaræˆå“¡ %s\n"
+
+#~ msgid "tar archiver"
+#~ msgstr "tar壓縮器"
+
+#, c-format
+#~ msgid "transferring dependency %d -> %d to %d\n"
+#~ msgstr "正在轉é€ç›¸ä¾æ€§ %d -&gt; %d 到 %d\n"
+
+# utils/adt/rowtypes.c:178 utils/adt/rowtypes.c:186
+#~ msgid "unexpected end of file\n"
+#~ msgstr "éžé æœŸçš„檔案çµå°¾\n"
+
+#, c-format
+#~ msgid "worker process crashed: status %d\n"
+#~ msgstr "背景工作處ç†åºå·²æ毀: 狀態 %d\n"
diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl
new file mode 100644
index 0000000..8c63d31
--- /dev/null
+++ b/src/bin/pg_dump/t/001_basic.pl
@@ -0,0 +1,229 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+#########################################
+# Basic checks
+
+program_help_ok('pg_dump');
+program_version_ok('pg_dump');
+program_options_handling_ok('pg_dump');
+
+program_help_ok('pg_restore');
+program_version_ok('pg_restore');
+program_options_handling_ok('pg_restore');
+
+program_help_ok('pg_dumpall');
+program_version_ok('pg_dumpall');
+program_options_handling_ok('pg_dumpall');
+
+#########################################
+# Test various invalid options and disallowed combinations
+# Doesn't require a PG instance to be set up, so do this first.
+
+command_fails_like(
+ [ 'pg_dump', 'qqq', 'abc' ],
+ qr/\Qpg_dump: error: too many command-line arguments (first is "abc")\E/,
+ 'pg_dump: too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_restore', 'qqq', 'abc' ],
+ qr/\Qpg_restore: error: too many command-line arguments (first is "abc")\E/,
+ 'pg_restore: too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_dumpall', 'qqq', 'abc' ],
+ qr/\Qpg_dumpall: error: too many command-line arguments (first is "qqq")\E/,
+ 'pg_dumpall: too many command-line arguments');
+
+command_fails_like(
+ [ 'pg_dump', '-s', '-a' ],
+ qr/\Qpg_dump: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
+ 'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dump', '-s', '--include-foreign-data=xxx' ],
+ qr/\Qpg_dump: error: options -s\/--schema-only and --include-foreign-data cannot be used together\E/,
+ 'pg_dump: options -s/--schema-only and --include-foreign-data cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dump', '-j2', '--include-foreign-data=xxx' ],
+ qr/\Qpg_dump: error: option --include-foreign-data is not supported with parallel backup\E/,
+ 'pg_dump: option --include-foreign-data is not supported with parallel backup'
+);
+
+command_fails_like(
+ ['pg_restore'],
+ qr{\Qpg_restore: error: one of -d/--dbname and -f/--file must be specified\E},
+ 'pg_restore: error: one of -d/--dbname and -f/--file must be specified');
+
+command_fails_like(
+ [ 'pg_restore', '-s', '-a', '-f -' ],
+ qr/\Qpg_restore: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
+ 'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_restore', '-d', 'xxx', '-f', 'xxx' ],
+ qr/\Qpg_restore: error: options -d\/--dbname and -f\/--file cannot be used together\E/,
+ 'pg_restore: options -d/--dbname and -f/--file cannot be used together');
+
+command_fails_like(
+ [ 'pg_dump', '-c', '-a' ],
+ qr/\Qpg_dump: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
+ 'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
+
+command_fails_like(
+ [ 'pg_restore', '-c', '-a', '-f -' ],
+ qr/\Qpg_restore: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
+ 'pg_restore: options -c/--clean and -a/--data-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dump', '--if-exists' ],
+ qr/\Qpg_dump: error: option --if-exists requires option -c\/--clean\E/,
+ 'pg_dump: option --if-exists requires option -c/--clean');
+
+command_fails_like(
+ [ 'pg_dump', '-j3' ],
+ qr/\Qpg_dump: error: parallel backup only supported by the directory format\E/,
+ 'pg_dump: parallel backup only supported by the directory format');
+
+# Note the trailing whitespace for the value of --jobs, that is valid.
+command_fails_like(
+ [ 'pg_dump', '-j', '-1 ' ],
+ qr/\Qpg_dump: error: -j\/--jobs must be in range\E/,
+ 'pg_dump: -j/--jobs must be in range');
+
+command_fails_like(
+ [ 'pg_dump', '-F', 'garbage' ],
+ qr/\Qpg_dump: error: invalid output format\E/,
+ 'pg_dump: invalid output format');
+
+command_fails_like(
+ [ 'pg_restore', '-j', '-1', '-f -' ],
+ qr/\Qpg_restore: error: -j\/--jobs must be in range\E/,
+ 'pg_restore: -j/--jobs must be in range');
+
+command_fails_like(
+ [ 'pg_restore', '--single-transaction', '-j3', '-f -' ],
+ qr/\Qpg_restore: error: cannot specify both --single-transaction and multiple jobs\E/,
+ 'pg_restore: cannot specify both --single-transaction and multiple jobs');
+
+command_fails_like(
+ [ 'pg_dump', '--compress', 'garbage' ],
+ qr/\Qpg_dump: error: unrecognized compression algorithm/,
+ 'pg_dump: invalid --compress');
+
+command_fails_like(
+ [ 'pg_dump', '--compress', 'none:1' ],
+ qr/\Qpg_dump: error: invalid compression specification: compression algorithm "none" does not accept a compression level\E/,
+ 'pg_dump: invalid compression specification: compression algorithm "none" does not accept a compression level'
+);
+
+
+if (check_pg_config("#define HAVE_LIBZ 1"))
+{
+ command_fails_like(
+ [ 'pg_dump', '-Z', '15' ],
+ qr/\Qpg_dump: error: invalid compression specification: compression algorithm "gzip" expects a compression level between 1 and 9 (default at -1)\E/,
+ 'pg_dump: invalid compression specification: must be in range');
+
+ command_fails_like(
+ [ 'pg_dump', '--compress', '1', '--format', 'tar' ],
+ qr/\Qpg_dump: error: compression is not supported by tar archive format\E/,
+ 'pg_dump: compression is not supported by tar archive format');
+
+ command_fails_like(
+ [ 'pg_dump', '-Z', 'gzip:nonInt' ],
+ qr/\Qpg_dump: error: invalid compression specification: unrecognized compression option: "nonInt"\E/,
+ 'pg_dump: invalid compression specification: must be an integer');
+}
+else
+{
+ # --jobs > 1 forces an error with tar format.
+ command_fails_like(
+ [ 'pg_dump', '--format', 'tar', '-j3' ],
+ qr/\Qpg_dump: error: parallel backup only supported by the directory format\E/,
+ 'pg_dump: warning: parallel backup not supported by tar format');
+
+ command_fails_like(
+ [ 'pg_dump', '-Z', 'gzip:nonInt', '--format', 'tar', '-j2' ],
+ qr/\Qpg_dump: error: invalid compression specification: unrecognized compression option\E/,
+ 'pg_dump: invalid compression specification: must be an integer');
+}
+
+command_fails_like(
+ [ 'pg_dump', '--extra-float-digits', '-16' ],
+ qr/\Qpg_dump: error: --extra-float-digits must be in range\E/,
+ 'pg_dump: --extra-float-digits must be in range');
+
+command_fails_like(
+ [ 'pg_dump', '--rows-per-insert', '0' ],
+ qr/\Qpg_dump: error: --rows-per-insert must be in range\E/,
+ 'pg_dump: --rows-per-insert must be in range');
+
+command_fails_like(
+ [ 'pg_restore', '--if-exists', '-f -' ],
+ qr/\Qpg_restore: error: option --if-exists requires option -c\/--clean\E/,
+ 'pg_restore: option --if-exists requires option -c/--clean');
+
+command_fails_like(
+ [ 'pg_restore', '-f -', '-F', 'garbage' ],
+ qr/\Qpg_restore: error: unrecognized archive format "garbage";\E/,
+ 'pg_dump: unrecognized archive format');
+
+command_fails_like(
+ [ 'pg_dump', '--on-conflict-do-nothing' ],
+ qr/pg_dump: error: option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts/,
+ 'pg_dump: --on-conflict-do-nothing requires --inserts, --rows-per-insert, --column-inserts'
+);
+
+# pg_dumpall command-line argument checks
+command_fails_like(
+ [ 'pg_dumpall', '-g', '-r' ],
+ qr/\Qpg_dumpall: error: options -g\/--globals-only and -r\/--roles-only cannot be used together\E/,
+ 'pg_dumpall: options -g/--globals-only and -r/--roles-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dumpall', '-g', '-t' ],
+ qr/\Qpg_dumpall: error: options -g\/--globals-only and -t\/--tablespaces-only cannot be used together\E/,
+ 'pg_dumpall: options -g/--globals-only and -t/--tablespaces-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dumpall', '-r', '-t' ],
+ qr/\Qpg_dumpall: error: options -r\/--roles-only and -t\/--tablespaces-only cannot be used together\E/,
+ 'pg_dumpall: options -r/--roles-only and -t/--tablespaces-only cannot be used together'
+);
+
+command_fails_like(
+ [ 'pg_dumpall', '--if-exists' ],
+ qr/\Qpg_dumpall: error: option --if-exists requires option -c\/--clean\E/,
+ 'pg_dumpall: option --if-exists requires option -c/--clean');
+
+command_fails_like(
+ [ 'pg_restore', '-C', '-1', '-f -' ],
+ qr/\Qpg_restore: error: options -C\/--create and -1\/--single-transaction cannot be used together\E/,
+ 'pg_restore: options -C\/--create and -1\/--single-transaction cannot be used together'
+);
+
+# also fails for -r and -t, but it seems pointless to add more tests for those.
+command_fails_like(
+ [ 'pg_dumpall', '--exclude-database=foo', '--globals-only' ],
+ qr/\Qpg_dumpall: error: option --exclude-database cannot be used together with -g\/--globals-only\E/,
+ 'pg_dumpall: option --exclude-database cannot be used together with -g/--globals-only'
+);
+
+done_testing();
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
new file mode 100644
index 0000000..b633b95
--- /dev/null
+++ b/src/bin/pg_dump/t/002_pg_dump.pl
@@ -0,0 +1,4968 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+###############################################################
+# Definition of the pg_dump runs to make.
+#
+# Each of these runs are named and those names are used below
+# to define how each test should (or shouldn't) treat a result
+# from a given run.
+#
+# test_key indicates that a given run should simply use the same
+# set of like/unlike tests as another run, and which run that is.
+#
+# compile_option indicates if the commands run depend on a compilation
+# option, if any. This can be used to control if tests should be
+# skipped when a build dependency is not satisfied.
+#
+# dump_cmd is the pg_dump command to run, which is an array of
+# the full command and arguments to run. Note that this is run
+# using $node->command_ok(), so the port does not need to be
+# specified and is pulled from $PGPORT, which is set by the
+# PostgreSQL::Test::Cluster system.
+#
+# compress_cmd is the utility command for (de)compression, if any.
+# Note that this should generally be used on pg_dump's output
+# either to generate a text file to run the through the tests, or
+# to test pg_restore's ability to parse manually compressed files
+# that otherwise pg_dump does not compress on its own (e.g. *.toc).
+#
+# glob_patterns is an optional array consisting of strings compilable
+# with glob() to check the files generated after a dump.
+#
+# command_like is an optional utility that can be used to compare
+# the output generated by a command on the contents of an existing
+# dump, like the TOC description of a pg_restore command.
+#
+# restore_cmd is the pg_restore command to run, if any. Note
+# that this should generally be used when the pg_dump goes to
+# a non-text file and that the restore can then be used to
+# generate a text file to run through the tests from the
+# non-text file generated by pg_dump.
+#
+# TODO: Have pg_restore actually restore to an independent
+# database and then pg_dump *that* database (or something along
+# those lines) to validate that part of the process.
+
+my $supports_icu = ($ENV{with_icu} eq 'yes');
+my $supports_gzip = check_pg_config("#define HAVE_LIBZ 1");
+my $supports_lz4 = check_pg_config("#define USE_LZ4 1");
+my $supports_zstd = check_pg_config("#define USE_ZSTD 1");
+
+my %pgdump_runs = (
+ binary_upgrade => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ '--format=custom',
+ "--file=$tempdir/binary_upgrade.dump",
+ '-w',
+ '--schema-only',
+ '--binary-upgrade',
+ '-d', 'postgres', # alternative way to specify database
+ ],
+ restore_cmd => [
+ 'pg_restore', '-Fc', '--verbose',
+ "--file=$tempdir/binary_upgrade.sql",
+ "$tempdir/binary_upgrade.dump",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ compression_gzip_custom => {
+ test_key => 'compression',
+ compile_option => 'gzip',
+ dump_cmd => [
+ 'pg_dump', '--format=custom',
+ '--compress=1', "--file=$tempdir/compression_gzip_custom.dump",
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ "--file=$tempdir/compression_gzip_custom.sql",
+ "$tempdir/compression_gzip_custom.dump",
+ ],
+ command_like => {
+ command => [
+ 'pg_restore', '-l', "$tempdir/compression_gzip_custom.dump",
+ ],
+ expected => qr/Compression: gzip/,
+ name => 'data content is gzip-compressed'
+ },
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ compression_gzip_dir => {
+ test_key => 'compression',
+ compile_option => 'gzip',
+ dump_cmd => [
+ 'pg_dump', '--jobs=2',
+ '--format=directory', '--compress=gzip:1',
+ "--file=$tempdir/compression_gzip_dir", 'postgres',
+ ],
+ # Give coverage for manually compressed blob.toc files during
+ # restore.
+ compress_cmd => {
+ program => $ENV{'GZIP_PROGRAM'},
+ args => [ '-f', "$tempdir/compression_gzip_dir/blobs.toc", ],
+ },
+ # Verify that only data files were compressed
+ glob_patterns => [
+ "$tempdir/compression_gzip_dir/toc.dat",
+ "$tempdir/compression_gzip_dir/*.dat.gz",
+ ],
+ restore_cmd => [
+ 'pg_restore', '--jobs=2',
+ "--file=$tempdir/compression_gzip_dir.sql",
+ "$tempdir/compression_gzip_dir",
+ ],
+ },
+
+ compression_gzip_plain => {
+ test_key => 'compression',
+ compile_option => 'gzip',
+ dump_cmd => [
+ 'pg_dump', '--format=plain', '-Z1',
+ "--file=$tempdir/compression_gzip_plain.sql.gz", 'postgres',
+ ],
+ # Decompress the generated file to run through the tests.
+ compress_cmd => {
+ program => $ENV{'GZIP_PROGRAM'},
+ args => [ '-d', "$tempdir/compression_gzip_plain.sql.gz", ],
+ },
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ compression_lz4_custom => {
+ test_key => 'compression',
+ compile_option => 'lz4',
+ dump_cmd => [
+ 'pg_dump', '--format=custom',
+ '--compress=lz4', "--file=$tempdir/compression_lz4_custom.dump",
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ "--file=$tempdir/compression_lz4_custom.sql",
+ "$tempdir/compression_lz4_custom.dump",
+ ],
+ command_like => {
+ command =>
+ [ 'pg_restore', '-l', "$tempdir/compression_lz4_custom.dump", ],
+ expected => qr/Compression: lz4/,
+ name => 'data content is lz4 compressed'
+ },
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ compression_lz4_dir => {
+ test_key => 'compression',
+ compile_option => 'lz4',
+ dump_cmd => [
+ 'pg_dump', '--jobs=2',
+ '--format=directory', '--compress=lz4:1',
+ "--file=$tempdir/compression_lz4_dir", 'postgres',
+ ],
+ # Give coverage for manually compressed blob.toc files during
+ # restore.
+ compress_cmd => {
+ program => $ENV{'LZ4'},
+ args => [
+ '-z', '-f', '--rm',
+ "$tempdir/compression_lz4_dir/blobs.toc",
+ "$tempdir/compression_lz4_dir/blobs.toc.lz4",
+ ],
+ },
+ # Verify that data files were compressed
+ glob_patterns => [
+ "$tempdir/compression_lz4_dir/toc.dat",
+ "$tempdir/compression_lz4_dir/*.dat.lz4",
+ ],
+ restore_cmd => [
+ 'pg_restore', '--jobs=2',
+ "--file=$tempdir/compression_lz4_dir.sql",
+ "$tempdir/compression_lz4_dir",
+ ],
+ },
+
+ compression_lz4_plain => {
+ test_key => 'compression',
+ compile_option => 'lz4',
+ dump_cmd => [
+ 'pg_dump', '--format=plain', '--compress=lz4',
+ "--file=$tempdir/compression_lz4_plain.sql.lz4", 'postgres',
+ ],
+ # Decompress the generated file to run through the tests.
+ compress_cmd => {
+ program => $ENV{'LZ4'},
+ args => [
+ '-d', '-f',
+ "$tempdir/compression_lz4_plain.sql.lz4",
+ "$tempdir/compression_lz4_plain.sql",
+ ],
+ },
+ },
+
+ compression_zstd_custom => {
+ test_key => 'compression',
+ compile_option => 'zstd',
+ dump_cmd => [
+ 'pg_dump', '--format=custom',
+ '--compress=zstd', "--file=$tempdir/compression_zstd_custom.dump",
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ "--file=$tempdir/compression_zstd_custom.sql",
+ "$tempdir/compression_zstd_custom.dump",
+ ],
+ command_like => {
+ command => [
+ 'pg_restore', '-l', "$tempdir/compression_zstd_custom.dump",
+ ],
+ expected => qr/Compression: zstd/,
+ name => 'data content is zstd compressed'
+ },
+ },
+
+ compression_zstd_dir => {
+ test_key => 'compression',
+ compile_option => 'zstd',
+ dump_cmd => [
+ 'pg_dump', '--jobs=2',
+ '--format=directory', '--compress=zstd:1',
+ "--file=$tempdir/compression_zstd_dir", 'postgres',
+ ],
+ # Give coverage for manually compressed blob.toc files during
+ # restore.
+ compress_cmd => {
+ program => $ENV{'ZSTD'},
+ args => [
+ '-z', '-f',
+ '--rm', "$tempdir/compression_zstd_dir/blobs.toc",
+ "-o", "$tempdir/compression_zstd_dir/blobs.toc.zst",
+ ],
+ },
+ # Verify that data files were compressed
+ glob_patterns => [
+ "$tempdir/compression_zstd_dir/toc.dat",
+ "$tempdir/compression_zstd_dir/*.dat.zst",
+ ],
+ restore_cmd => [
+ 'pg_restore', '--jobs=2',
+ "--file=$tempdir/compression_zstd_dir.sql",
+ "$tempdir/compression_zstd_dir",
+ ],
+ },
+
+ # Exercise long mode for test coverage
+ compression_zstd_plain => {
+ test_key => 'compression',
+ compile_option => 'zstd',
+ dump_cmd => [
+ 'pg_dump', '--format=plain', '--compress=zstd:long',
+ "--file=$tempdir/compression_zstd_plain.sql.zst", 'postgres',
+ ],
+ # Decompress the generated file to run through the tests.
+ compress_cmd => {
+ program => $ENV{'ZSTD'},
+ args => [
+ '-d', '-f',
+ "$tempdir/compression_zstd_plain.sql.zst", "-o",
+ "$tempdir/compression_zstd_plain.sql",
+ ],
+ },
+ },
+
+ clean => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/clean.sql",
+ '-c',
+ '-d', 'postgres', # alternative way to specify database
+ ],
+ },
+ clean_if_exists => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/clean_if_exists.sql",
+ '-c',
+ '--if-exists',
+ '--encoding=UTF8', # no-op, just tests that option is accepted
+ 'postgres',
+ ],
+ },
+ column_inserts => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/column_inserts.sql", '-a',
+ '--column-inserts', 'postgres',
+ ],
+ },
+ createdb => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/createdb.sql",
+ '-C',
+ '-R', # no-op, just for testing
+ '-v',
+ 'postgres',
+ ],
+ },
+ data_only => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/data_only.sql",
+ '-a',
+ '--superuser=test_superuser',
+ '--disable-triggers',
+ '-v', # no-op, just make sure it works
+ 'postgres',
+ ],
+ },
+ defaults => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ '-f', "$tempdir/defaults.sql",
+ 'postgres',
+ ],
+ },
+ defaults_no_public => {
+ database => 'regress_pg_dump_test',
+ dump_cmd => [
+ 'pg_dump', '--no-sync', '-f', "$tempdir/defaults_no_public.sql",
+ 'regress_pg_dump_test',
+ ],
+ },
+ defaults_no_public_clean => {
+ database => 'regress_pg_dump_test',
+ dump_cmd => [
+ 'pg_dump', '--no-sync', '-c', '-f',
+ "$tempdir/defaults_no_public_clean.sql",
+ 'regress_pg_dump_test',
+ ],
+ },
+ defaults_public_owner => {
+ database => 'regress_public_owner',
+ dump_cmd => [
+ 'pg_dump', '--no-sync', '-f',
+ "$tempdir/defaults_public_owner.sql",
+ 'regress_public_owner',
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ # By default, the custom format compresses its data file
+ # when the code is compiled with gzip support, and lets them
+ # uncompressed when not compiled with it.
+ defaults_custom_format => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Fc',
+ "--file=$tempdir/defaults_custom_format.dump", 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore', '-Fc',
+ "--file=$tempdir/defaults_custom_format.sql",
+ "$tempdir/defaults_custom_format.dump",
+ ],
+ command_like => {
+ command =>
+ [ 'pg_restore', '-l', "$tempdir/defaults_custom_format.dump", ],
+ expected => $supports_gzip
+ ? qr/Compression: gzip/
+ : qr/Compression: none/,
+ name => 'data content is gzip-compressed by default if available',
+ },
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ # By default, the directory format compresses its data files
+ # when the code is compiled with gzip support, and lets them
+ # uncompressed when not compiled with it.
+ defaults_dir_format => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Fd',
+ "--file=$tempdir/defaults_dir_format", 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore', '-Fd',
+ "--file=$tempdir/defaults_dir_format.sql",
+ "$tempdir/defaults_dir_format",
+ ],
+ command_like => {
+ command =>
+ [ 'pg_restore', '-l', "$tempdir/defaults_dir_format", ],
+ expected => $supports_gzip ? qr/Compression: gzip/
+ : qr/Compression: none/,
+ name => 'data content is gzip-compressed by default',
+ },
+ glob_patterns => [
+ "$tempdir/defaults_dir_format/toc.dat",
+ "$tempdir/defaults_dir_format/blobs.toc",
+ $supports_gzip ? "$tempdir/defaults_dir_format/*.dat.gz"
+ : "$tempdir/defaults_dir_format/*.dat",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ defaults_parallel => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Fd', '-j2', "--file=$tempdir/defaults_parallel",
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ "--file=$tempdir/defaults_parallel.sql",
+ "$tempdir/defaults_parallel",
+ ],
+ },
+
+ # Do not use --no-sync to give test coverage for data sync.
+ defaults_tar_format => {
+ test_key => 'defaults',
+ dump_cmd => [
+ 'pg_dump', '-Ft',
+ "--file=$tempdir/defaults_tar_format.tar", 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore',
+ '--format=tar',
+ "--file=$tempdir/defaults_tar_format.sql",
+ "$tempdir/defaults_tar_format.tar",
+ ],
+ },
+ exclude_dump_test_schema => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/exclude_dump_test_schema.sql",
+ '--exclude-schema=dump_test', 'postgres',
+ ],
+ },
+ exclude_test_table => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/exclude_test_table.sql",
+ '--exclude-table=dump_test.test_table', 'postgres',
+ ],
+ },
+ exclude_measurement => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/exclude_measurement.sql",
+ '--exclude-table-and-children=dump_test.measurement',
+ 'postgres',
+ ],
+ },
+ exclude_measurement_data => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/exclude_measurement_data.sql",
+ '--exclude-table-data-and-children=dump_test.measurement',
+ '--no-unlogged-table-data',
+ 'postgres',
+ ],
+ },
+ exclude_test_table_data => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/exclude_test_table_data.sql",
+ '--exclude-table-data=dump_test.test_table',
+ '--no-unlogged-table-data',
+ 'postgres',
+ ],
+ },
+ inserts => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/inserts.sql", '-a',
+ '--inserts', 'postgres',
+ ],
+ },
+ pg_dumpall_globals => {
+ dump_cmd => [
+ 'pg_dumpall', '-v', "--file=$tempdir/pg_dumpall_globals.sql",
+ '-g', '--no-sync',
+ ],
+ },
+ pg_dumpall_globals_clean => {
+ dump_cmd => [
+ 'pg_dumpall', "--file=$tempdir/pg_dumpall_globals_clean.sql",
+ '-g', '-c', '--no-sync',
+ ],
+ },
+ pg_dumpall_dbprivs => {
+ dump_cmd => [
+ 'pg_dumpall', '--no-sync',
+ "--file=$tempdir/pg_dumpall_dbprivs.sql",
+ ],
+ },
+ pg_dumpall_exclude => {
+ dump_cmd => [
+ 'pg_dumpall', '-v', "--file=$tempdir/pg_dumpall_exclude.sql",
+ '--exclude-database', '*dump_test*', '--no-sync',
+ ],
+ },
+ no_toast_compression => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_toast_compression.sql",
+ '--no-toast-compression', 'postgres',
+ ],
+ },
+ no_large_objects => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync', "--file=$tempdir/no_large_objects.sql",
+ '-B', 'postgres',
+ ],
+ },
+ no_privs => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_privs.sql", '-x',
+ 'postgres',
+ ],
+ },
+ no_owner => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_owner.sql", '-O',
+ 'postgres',
+ ],
+ },
+ no_table_access_method => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/no_table_access_method.sql",
+ '--no-table-access-method', 'postgres',
+ ],
+ },
+ only_dump_test_schema => {
+ dump_cmd => [
+ 'pg_dump', '--no-sync',
+ "--file=$tempdir/only_dump_test_schema.sql",
+ '--schema=dump_test', 'postgres',
+ ],
+ },
+ only_dump_test_table => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/only_dump_test_table.sql",
+ '--table=dump_test.test_table',
+ '--lock-wait-timeout='
+ . (1000 * $PostgreSQL::Test::Utils::timeout_default),
+ 'postgres',
+ ],
+ },
+ only_dump_measurement => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/only_dump_measurement.sql",
+ '--table-and-children=dump_test.measurement',
+ '--lock-wait-timeout='
+ . (1000 * $PostgreSQL::Test::Utils::timeout_default),
+ 'postgres',
+ ],
+ },
+ role => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/role.sql",
+ '--role=regress_dump_test_role',
+ '--schema=dump_test_second_schema',
+ 'postgres',
+ ],
+ },
+ role_parallel => {
+ test_key => 'role',
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ '--format=directory',
+ '--jobs=2',
+ "--file=$tempdir/role_parallel",
+ '--role=regress_dump_test_role',
+ '--schema=dump_test_second_schema',
+ 'postgres',
+ ],
+ restore_cmd => [
+ 'pg_restore', "--file=$tempdir/role_parallel.sql",
+ "$tempdir/role_parallel",
+ ],
+ },
+ rows_per_insert => {
+ dump_cmd => [
+ 'pg_dump',
+ '--no-sync',
+ "--file=$tempdir/rows_per_insert.sql",
+ '-a',
+ '--rows-per-insert=4',
+ '--table=dump_test.test_table',
+ '--table=dump_test.test_fourth_table',
+ 'postgres',
+ ],
+ },
+ schema_only => {
+ dump_cmd => [
+ 'pg_dump', '--format=plain',
+ "--file=$tempdir/schema_only.sql", '--no-sync',
+ '-s', 'postgres',
+ ],
+ },
+ section_pre_data => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/section_pre_data.sql",
+ '--section=pre-data', '--no-sync',
+ 'postgres',
+ ],
+ },
+ section_data => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/section_data.sql",
+ '--section=data', '--no-sync',
+ 'postgres',
+ ],
+ },
+ section_post_data => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/section_post_data.sql",
+ '--section=post-data', '--no-sync', 'postgres',
+ ],
+ },
+ test_schema_plus_large_objects => {
+ dump_cmd => [
+ 'pg_dump', "--file=$tempdir/test_schema_plus_large_objects.sql",
+
+ '--schema=dump_test', '-b', '-B', '--no-sync', 'postgres',
+ ],
+ },);
+
+###############################################################
+# Definition of the tests to run.
+#
+# Each test is defined using the log message that will be used.
+#
+# A regexp should be defined for each test which provides the
+# basis for the test. That regexp will be run against the output
+# file of each of the runs which the test is to be run against
+# and the success of the result will depend on if the regexp
+# result matches the expected 'like' or 'unlike' case.
+#
+# The runs listed as 'like' will be checked if they match the
+# regexp and, if so, the test passes. All runs which are not
+# listed as 'like' will be checked to ensure they don't match
+# the regexp; if they do, the test will fail.
+#
+# The below hashes provide convenience sets of runs. Individual
+# runs can be excluded from a general hash by placing that run
+# into the 'unlike' section.
+#
+# For example, there is an 'exclude_test_table' run which runs a
+# full pg_dump but with an exclude flag to not include the test
+# table. The CREATE TABLE test which creates the test table is
+# defined with %full_runs but then has 'exclude_test_table' in
+# its 'unlike' list, excluding that test.
+#
+# There can then be a 'create_sql' and 'create_order' for a
+# given test. The 'create_sql' commands are collected up in
+# 'create_order' and then run against the database prior to any
+# of the pg_dump runs happening. This is what "seeds" the
+# system with objects to be dumped out.
+#
+# There can be a flag called 'lz4', which can be set if the test
+# case depends on LZ4. Tests marked with this flag are skipped if
+# the build used does not support LZ4.
+#
+# Building of this hash takes a bit of time as all of the regexps
+# included in it are compiled. This greatly improves performance
+# as the regexps are used for each run the test applies to.
+
+# Tests which target the 'dump_test' schema, specifically.
+my %dump_test_schema_runs = (
+ only_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ test_schema_plus_large_objects => 1,);
+
+# Tests which are considered 'full' dumps by pg_dump, but there
+# are flags used to exclude specific items (ACLs, LOs, etc).
+my %full_runs = (
+ binary_upgrade => 1,
+ clean => 1,
+ clean_if_exists => 1,
+ compression => 1,
+ createdb => 1,
+ defaults => 1,
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ exclude_measurement => 1,
+ exclude_measurement_data => 1,
+ no_toast_compression => 1,
+ no_large_objects => 1,
+ no_owner => 1,
+ no_privs => 1,
+ no_table_access_method => 1,
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ schema_only => 1,);
+
+# This is where the actual tests are defined.
+my %tests = (
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role GRANT' => {
+ create_order => 14,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role IN SCHEMA dump_test
+ GRANT SELECT ON TABLES TO regress_dump_test_role;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role IN SCHEMA dump_test \E
+ \QGRANT SELECT ON TABLES TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role GRANT EXECUTE ON FUNCTIONS'
+ => {
+ create_order => 15,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role IN SCHEMA dump_test
+ GRANT EXECUTE ON FUNCTIONS TO regress_dump_test_role;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role IN SCHEMA dump_test \E
+ \QGRANT ALL ON FUNCTIONS TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role REVOKE' => {
+ create_order => 55,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role
+ REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role \E
+ \QREVOKE ALL ON FUNCTIONS FROM PUBLIC;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role REVOKE SELECT'
+ => {
+ create_order => 56,
+ create_sql => 'ALTER DEFAULT PRIVILEGES
+ FOR ROLE regress_dump_test_role
+ REVOKE SELECT ON TABLES FROM regress_dump_test_role;',
+ regexp => qr/^
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role \E
+ \QREVOKE ALL ON TABLES FROM regress_dump_test_role;\E\n
+ \QALTER DEFAULT PRIVILEGES \E
+ \QFOR ROLE regress_dump_test_role \E
+ \QGRANT INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLES TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'ALTER ROLE regress_dump_test_role' => {
+ regexp => qr/^
+ \QALTER ROLE regress_dump_test_role WITH \E
+ \QNOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN \E
+ \QNOREPLICATION NOBYPASSRLS;\E
+ /xm,
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ pg_dumpall_exclude => 1,
+ },
+ },
+
+ 'ALTER COLLATION test0 OWNER TO' => {
+ regexp => qr/^\QALTER COLLATION public.test0 OWNER TO \E.+;/m,
+ collation => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { %dump_test_schema_runs, no_owner => 1, },
+ },
+
+ 'ALTER FOREIGN DATA WRAPPER dummy OWNER TO' => {
+ regexp => qr/^ALTER FOREIGN DATA WRAPPER dummy OWNER TO .+;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SERVER s1 OWNER TO' => {
+ regexp => qr/^ALTER SERVER s1 OWNER TO .+;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER FUNCTION dump_test.pltestlang_call_handler() OWNER TO' => {
+ regexp => qr/^
+ \QALTER FUNCTION dump_test.pltestlang_call_handler() \E
+ \QOWNER TO \E
+ .+;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER OPERATOR FAMILY dump_test.op_family OWNER TO' => {
+ regexp => qr/^
+ \QALTER OPERATOR FAMILY dump_test.op_family USING btree \E
+ \QOWNER TO \E
+ .+;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER OPERATOR FAMILY dump_test.op_family USING btree' => {
+ create_order => 75,
+ create_sql =>
+ 'ALTER OPERATOR FAMILY dump_test.op_family USING btree ADD
+ OPERATOR 1 <(bigint,int4),
+ OPERATOR 2 <=(bigint,int4),
+ OPERATOR 3 =(bigint,int4),
+ OPERATOR 4 >=(bigint,int4),
+ OPERATOR 5 >(bigint,int4),
+ FUNCTION 1 (int4, int4) btint4cmp(int4,int4),
+ FUNCTION 2 (int4, int4) btint4sortsupport(internal),
+ FUNCTION 4 (int4, int4) btequalimage(oid);',
+ # note: it's correct that btint8sortsupport and bigint btequalimage
+ # are included here:
+ regexp => qr/^
+ \QALTER OPERATOR FAMILY dump_test.op_family USING btree ADD\E\n\s+
+ \QOPERATOR 1 <(bigint,integer) ,\E\n\s+
+ \QOPERATOR 2 <=(bigint,integer) ,\E\n\s+
+ \QOPERATOR 3 =(bigint,integer) ,\E\n\s+
+ \QOPERATOR 4 >=(bigint,integer) ,\E\n\s+
+ \QOPERATOR 5 >(bigint,integer) ,\E\n\s+
+ \QFUNCTION 1 (integer, integer) btint4cmp(integer,integer) ,\E\n\s+
+ \QFUNCTION 2 (bigint, bigint) btint8sortsupport(internal) ,\E\n\s+
+ \QFUNCTION 2 (integer, integer) btint4sortsupport(internal) ,\E\n\s+
+ \QFUNCTION 4 (bigint, bigint) btequalimage(oid) ,\E\n\s+
+ \QFUNCTION 4 (integer, integer) btequalimage(oid);\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER OPERATOR CLASS dump_test.op_class OWNER TO' => {
+ regexp => qr/^
+ \QALTER OPERATOR CLASS dump_test.op_class USING btree \E
+ \QOWNER TO \E
+ .+;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub1 OWNER TO' => {
+ regexp => qr/^ALTER PUBLICATION pub1 OWNER TO .+;/m,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER LARGE OBJECT ... OWNER TO' => {
+ regexp => qr/^ALTER LARGE OBJECT \d+ OWNER TO .+;/m,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_large_objects => 1,
+ },
+ unlike => {
+ no_large_objects => 1,
+ no_owner => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'ALTER PROCEDURAL LANGUAGE pltestlang OWNER TO' => {
+ regexp => qr/^ALTER PROCEDURAL LANGUAGE pltestlang OWNER TO .+;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SCHEMA dump_test OWNER TO' => {
+ regexp => qr/^ALTER SCHEMA dump_test OWNER TO .+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER SCHEMA dump_test_second_schema OWNER TO' => {
+ regexp => qr/^ALTER SCHEMA dump_test_second_schema OWNER TO .+;/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SCHEMA public OWNER TO' => {
+ create_order => 15,
+ create_sql =>
+ 'ALTER SCHEMA public OWNER TO "regress_quoted \"" role";',
+ regexp => qr/^ALTER SCHEMA public OWNER TO .+;/m,
+ like => {
+ %full_runs, section_pre_data => 1,
+ },
+ unlike => { no_owner => 1, },
+ },
+
+ 'ALTER SCHEMA public OWNER TO (w/o ACL changes)' => {
+ database => 'regress_public_owner',
+ create_order => 100,
+ create_sql =>
+ 'ALTER SCHEMA public OWNER TO "regress_quoted \"" role";',
+ regexp => qr/^(GRANT|REVOKE)/m,
+ unlike => { defaults_public_owner => 1 },
+ },
+
+ 'ALTER SEQUENCE test_table_col1_seq' => {
+ regexp => qr/^
+ \QALTER SEQUENCE dump_test.test_table_col1_seq OWNED BY dump_test.test_table.col1;\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ADD CONSTRAINT ... PRIMARY KEY' => {
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table\E \n^\s+
+ \QADD CONSTRAINT test_table_pkey PRIMARY KEY (col1);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE (partitioned) ADD CONSTRAINT ... FOREIGN KEY' => {
+ create_order => 4,
+ create_sql => 'CREATE TABLE dump_test.test_table_fk (
+ col1 int references dump_test.test_table)
+ PARTITION BY RANGE (col1);
+ CREATE TABLE dump_test.test_table_fk_1
+ PARTITION OF dump_test.test_table_fk
+ FOR VALUES FROM (0) TO (10);',
+ regexp => qr/
+ \QADD CONSTRAINT test_table_fk_col1_fkey FOREIGN KEY (col1) REFERENCES dump_test.test_table\E
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col1 SET STATISTICS 90' => {
+ create_order => 93,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col1 SET STATISTICS 90;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col1 SET STATISTICS 90;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col2 SET STORAGE' => {
+ create_order => 94,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col2 SET STORAGE EXTERNAL;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col2 SET STORAGE EXTERNAL;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col3 SET STORAGE' => {
+ create_order => 95,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col3 SET STORAGE MAIN;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col3 SET STORAGE MAIN;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY test_table ALTER COLUMN col4 SET n_distinct' => {
+ create_order => 95,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table ALTER COLUMN col4 SET (n_distinct = 10);',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_table ALTER COLUMN col4 SET (n_distinct=10);\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE ONLY dump_test.measurement ATTACH PARTITION measurement_y2006m2'
+ => {
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.measurement ATTACH PARTITION dump_test_second_schema.measurement_y2006m2 \E
+ \QFOR VALUES FROM ('2006-02-01') TO ('2006-03-01');\E\n
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ binary_upgrade => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table CLUSTER ON test_table_pkey' => {
+ create_order => 96,
+ create_sql =>
+ 'ALTER TABLE dump_test.test_table CLUSTER ON test_table_pkey',
+ regexp => qr/^
+ \QALTER TABLE dump_test.test_table CLUSTER ON test_table_pkey;\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table DISABLE TRIGGER ALL' => {
+ regexp => qr/^
+ \QSET SESSION AUTHORIZATION 'test_superuser';\E\n\n
+ \QALTER TABLE dump_test.test_table DISABLE TRIGGER ALL;\E\n\n
+ \QCOPY dump_test.test_table (col1, col2, col3, col4) FROM stdin;\E
+ \n(?:\d\t\\N\t\\N\t\\N\n){9}\\\.\n\n\n
+ \QALTER TABLE dump_test.test_table ENABLE TRIGGER ALL;\E/xm,
+ like => { data_only => 1, },
+ },
+
+ 'ALTER FOREIGN TABLE foreign_table ALTER COLUMN c1 OPTIONS' => {
+ regexp => qr/^
+ \QALTER FOREIGN TABLE dump_test.foreign_table ALTER COLUMN c1 OPTIONS (\E\n
+ \s+\Qcolumn_name 'col1'\E\n
+ \Q);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table OWNER TO' => {
+ regexp => qr/^\QALTER TABLE dump_test.test_table OWNER TO \E.+;/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ no_owner => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table ENABLE ROW LEVEL SECURITY' => {
+ create_order => 23,
+ create_sql => 'ALTER TABLE dump_test.test_table
+ ENABLE ROW LEVEL SECURITY;',
+ regexp =>
+ qr/^\QALTER TABLE dump_test.test_table ENABLE ROW LEVEL SECURITY;\E/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE test_second_table OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TABLE dump_test.test_second_table OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE measurement OWNER TO' => {
+ regexp => qr/^\QALTER TABLE dump_test.measurement OWNER TO \E.+;/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ section_pre_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE measurement_y2006m2 OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TABLE dump_test_second_schema.measurement_y2006m2 OWNER TO \E.+;/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ no_owner => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'ALTER FOREIGN TABLE foreign_table OWNER TO' => {
+ regexp =>
+ qr/^\QALTER FOREIGN TABLE dump_test.foreign_table OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_owner => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 OWNER TO' => {
+ regexp =>
+ qr/^\QALTER TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 OWNER TO \E.+;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_test_table => 1,
+ no_owner => 1,
+ role => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'LO create (using lo_from_bytea)' => {
+ create_order => 50,
+ create_sql =>
+ 'SELECT pg_catalog.lo_from_bytea(0, \'\\x310a320a330a340a350a360a370a380a390a\');',
+ regexp => qr/^SELECT pg_catalog\.lo_create\('\d+'\);/m,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_large_objects => 1,
+ },
+ unlike => {
+ schema_only => 1,
+ no_large_objects => 1,
+ },
+ },
+
+ 'LO load (using lo_from_bytea)' => {
+ regexp => qr/^
+ \QSELECT pg_catalog.lo_open\E \('\d+',\ \d+\);\n
+ \QSELECT pg_catalog.lowrite(0, \E
+ \Q'\x310a320a330a340a350a360a370a380a390a');\E\n
+ \QSELECT pg_catalog.lo_close(0);\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_data => 1,
+ test_schema_plus_large_objects => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ no_large_objects => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'LO create (with no data)' => {
+ create_sql => 'SELECT pg_catalog.lo_create(0);',
+ regexp => qr/^
+ \QSELECT pg_catalog.lo_open\E \('\d+',\ \d+\);\n
+ \QSELECT pg_catalog.lo_close(0);\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_data => 1,
+ test_schema_plus_large_objects => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ no_large_objects => 1,
+ schema_only => 1,
+ section_pre_data => 1,
+ },
+ },
+
+ 'COMMENT ON DATABASE postgres' => {
+ regexp => qr/^COMMENT ON DATABASE postgres IS .+;/m,
+
+ # Should appear in the same tests as "CREATE DATABASE postgres"
+ like => { createdb => 1, },
+ },
+
+ 'COMMENT ON EXTENSION plpgsql' => {
+ regexp => qr/^COMMENT ON EXTENSION plpgsql IS .+;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'COMMENT ON SCHEMA public' => {
+ regexp => qr/^COMMENT ON SCHEMA public IS .+;/m,
+ # regress_public_owner emits this, due to create_sql of next test
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ },
+ },
+
+ 'COMMENT ON SCHEMA public IS NULL' => {
+ database => 'regress_public_owner',
+ create_order => 100,
+ create_sql => 'COMMENT ON SCHEMA public IS NULL;',
+ regexp => qr/^COMMENT ON SCHEMA public IS '';/m,
+ like => { defaults_public_owner => 1 },
+ },
+
+ 'COMMENT ON TABLE dump_test.test_table' => {
+ create_order => 36,
+ create_sql => 'COMMENT ON TABLE dump_test.test_table
+ IS \'comment on table\';',
+ regexp =>
+ qr/^\QCOMMENT ON TABLE dump_test.test_table IS 'comment on table';\E/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON COLUMN dump_test.test_table.col1' => {
+ create_order => 36,
+ create_sql => 'COMMENT ON COLUMN dump_test.test_table.col1
+ IS \'comment on column\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.test_table.col1 IS 'comment on column';\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON COLUMN dump_test.composite.f1' => {
+ create_order => 44,
+ create_sql => 'COMMENT ON COLUMN dump_test.composite.f1
+ IS \'comment on column of type\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.composite.f1 IS 'comment on column of type';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON COLUMN dump_test.test_second_table.col1' => {
+ create_order => 63,
+ create_sql => 'COMMENT ON COLUMN dump_test.test_second_table.col1
+ IS \'comment on column col1\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.test_second_table.col1 IS 'comment on column col1';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON COLUMN dump_test.test_second_table.col2' => {
+ create_order => 64,
+ create_sql => 'COMMENT ON COLUMN dump_test.test_second_table.col2
+ IS \'comment on column col2\';',
+ regexp => qr/^
+ \QCOMMENT ON COLUMN dump_test.test_second_table.col2 IS 'comment on column col2';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON CONVERSION dump_test.test_conversion' => {
+ create_order => 79,
+ create_sql => 'COMMENT ON CONVERSION dump_test.test_conversion
+ IS \'comment on test conversion\';',
+ regexp =>
+ qr/^\QCOMMENT ON CONVERSION dump_test.test_conversion IS 'comment on test conversion';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON COLLATION test0' => {
+ create_order => 77,
+ create_sql => 'COMMENT ON COLLATION test0
+ IS \'comment on test0 collation\';',
+ regexp =>
+ qr/^\QCOMMENT ON COLLATION public.test0 IS 'comment on test0 collation';\E/m,
+ collation => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'COMMENT ON LARGE OBJECT ...' => {
+ create_order => 65,
+ create_sql => 'DO $$
+ DECLARE myoid oid;
+ BEGIN
+ SELECT loid FROM pg_largeobject INTO myoid;
+ EXECUTE \'COMMENT ON LARGE OBJECT \' || myoid || \' IS \'\'comment on large object\'\';\';
+ END;
+ $$;',
+ regexp => qr/^
+ \QCOMMENT ON LARGE OBJECT \E[0-9]+\Q IS 'comment on large object';\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_large_objects => 1,
+ },
+ unlike => {
+ no_large_objects => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'COMMENT ON PUBLICATION pub1' => {
+ create_order => 55,
+ create_sql => 'COMMENT ON PUBLICATION pub1
+ IS \'comment on publication\';',
+ regexp =>
+ qr/^COMMENT ON PUBLICATION pub1 IS 'comment on publication';/m,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'COMMENT ON SUBSCRIPTION sub1' => {
+ create_order => 55,
+ create_sql => 'COMMENT ON SUBSCRIPTION sub1
+ IS \'comment on subscription\';',
+ regexp =>
+ qr/^COMMENT ON SUBSCRIPTION sub1 IS 'comment on subscription';/m,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'COMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1' => {
+ create_order => 84,
+ create_sql =>
+ 'COMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1
+ IS \'comment on text search configuration\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 IS 'comment on text search configuration';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1' => {
+ create_order => 84,
+ create_sql =>
+ 'COMMENT ON TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1
+ IS \'comment on text search dictionary\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 IS 'comment on text search dictionary';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TEXT SEARCH PARSER dump_test.alt_ts_prs1' => {
+ create_order => 84,
+ create_sql => 'COMMENT ON TEXT SEARCH PARSER dump_test.alt_ts_prs1
+ IS \'comment on text search parser\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH PARSER dump_test.alt_ts_prs1 IS 'comment on text search parser';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1' => {
+ create_order => 84,
+ create_sql => 'COMMENT ON TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1
+ IS \'comment on text search template\';',
+ regexp =>
+ qr/^\QCOMMENT ON TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1 IS 'comment on text search template';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TYPE dump_test.planets - ENUM' => {
+ create_order => 68,
+ create_sql => 'COMMENT ON TYPE dump_test.planets
+ IS \'comment on enum type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.planets IS 'comment on enum type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TYPE dump_test.textrange - RANGE' => {
+ create_order => 69,
+ create_sql => 'COMMENT ON TYPE dump_test.textrange
+ IS \'comment on range type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.textrange IS 'comment on range type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TYPE dump_test.int42 - Regular' => {
+ create_order => 70,
+ create_sql => 'COMMENT ON TYPE dump_test.int42
+ IS \'comment on regular type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.int42 IS 'comment on regular type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COMMENT ON TYPE dump_test.undefined - Undefined' => {
+ create_order => 71,
+ create_sql => 'COMMENT ON TYPE dump_test.undefined
+ IS \'comment on undefined type\';',
+ regexp =>
+ qr/^\QCOMMENT ON TYPE dump_test.undefined IS 'comment on undefined type';\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COPY test_table' => {
+ create_order => 4,
+ create_sql => 'INSERT INTO dump_test.test_table (col1) '
+ . 'SELECT generate_series FROM generate_series(1,9);',
+ regexp => qr/^
+ \QCOPY dump_test.test_table (col1, col2, col3, col4) FROM stdin;\E
+ \n(?:\d\t\\N\t\\N\t\\N\n){9}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ only_dump_test_table => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COPY fk_reference_test_table' => {
+ create_order => 22,
+ create_sql => 'INSERT INTO dump_test.fk_reference_test_table (col1) '
+ . 'SELECT generate_series FROM generate_series(1,5);',
+ regexp => qr/^
+ \QCOPY dump_test.fk_reference_test_table (col1) FROM stdin;\E
+ \n(?:\d\n){5}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ # In a data-only dump, we try to actually order according to FKs,
+ # so this check is just making sure that the referring table comes after
+ # the referred-to table.
+ 'COPY fk_reference_test_table second' => {
+ regexp => qr/^
+ \QCOPY dump_test.test_table (col1, col2, col3, col4) FROM stdin;\E
+ \n(?:\d\t\\N\t\\N\t\\N\n){9}\\\.\n.*
+ \QCOPY dump_test.fk_reference_test_table (col1) FROM stdin;\E
+ \n(?:\d\n){5}\\\.\n
+ /xms,
+ like => { data_only => 1, },
+ },
+
+ 'COPY test_second_table' => {
+ create_order => 7,
+ create_sql => 'INSERT INTO dump_test.test_second_table (col1, col2) '
+ . 'SELECT generate_series, generate_series::text '
+ . 'FROM generate_series(1,9);',
+ regexp => qr/^
+ \QCOPY dump_test.test_second_table (col1, col2) FROM stdin;\E
+ \n(?:\d\t\d\n){9}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COPY test_third_table' => {
+ create_order => 7,
+ create_sql =>
+ 'INSERT INTO dump_test.test_third_table VALUES (123, DEFAULT, 456);',
+ regexp => qr/^
+ \QCOPY dump_test.test_third_table (f1, "F3") FROM stdin;\E
+ \n123\t456\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COPY test_fourth_table' => {
+ create_order => 7,
+ create_sql =>
+ 'INSERT INTO dump_test.test_fourth_table DEFAULT VALUES;'
+ . 'INSERT INTO dump_test.test_fourth_table DEFAULT VALUES;',
+ regexp => qr/^
+ \QCOPY dump_test.test_fourth_table FROM stdin;\E
+ \n\n\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COPY test_fifth_table' => {
+ create_order => 54,
+ create_sql =>
+ 'INSERT INTO dump_test.test_fifth_table VALUES (NULL, true, false, \'11001\'::bit(5), \'NaN\');',
+ regexp => qr/^
+ \QCOPY dump_test.test_fifth_table (col1, col2, col3, col4, col5) FROM stdin;\E
+ \n\\N\tt\tf\t11001\tNaN\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'COPY test_table_identity' => {
+ create_order => 54,
+ create_sql =>
+ 'INSERT INTO dump_test.test_table_identity (col2) VALUES (\'test\');',
+ regexp => qr/^
+ \QCOPY dump_test.test_table_identity (col1, col2) FROM stdin;\E
+ \n1\ttest\n\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ section_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'INSERT INTO test_table' => {
+ regexp => qr/^
+ (?:INSERT\ INTO\ dump_test\.test_table\ \(col1,\ col2,\ col3,\ col4\)\ VALUES\ \(\d,\ NULL,\ NULL,\ NULL\);\n){9}
+ /xm,
+ like => { column_inserts => 1, },
+ },
+
+ 'test_table with 4-row INSERTs' => {
+ regexp => qr/^
+ (?:
+ INSERT\ INTO\ dump_test\.test_table\ VALUES\n
+ (?:\t\(\d,\ NULL,\ NULL,\ NULL\),\n){3}
+ \t\(\d,\ NULL,\ NULL,\ NULL\);\n
+ ){2}
+ INSERT\ INTO\ dump_test\.test_table\ VALUES\n
+ \t\(\d,\ NULL,\ NULL,\ NULL\);
+ /xm,
+ like => { rows_per_insert => 1, },
+ },
+
+ 'INSERT INTO test_second_table' => {
+ regexp => qr/^
+ (?:INSERT\ INTO\ dump_test\.test_second_table\ \(col1,\ col2\)
+ \ VALUES\ \(\d,\ '\d'\);\n){9}/xm,
+ like => { column_inserts => 1, },
+ },
+
+ 'INSERT INTO test_third_table (colnames)' => {
+ regexp =>
+ qr/^INSERT INTO dump_test\.test_third_table \(f1, "F3"\) VALUES \(123, 456\);\n/m,
+ like => { column_inserts => 1, },
+ },
+
+ 'INSERT INTO test_third_table' => {
+ regexp =>
+ qr/^INSERT INTO dump_test\.test_third_table VALUES \(123, DEFAULT, 456, DEFAULT\);\n/m,
+ like => { inserts => 1, },
+ },
+
+ 'INSERT INTO test_fourth_table' => {
+ regexp =>
+ qr/^(?:INSERT INTO dump_test\.test_fourth_table DEFAULT VALUES;\n){2}/m,
+ like => { column_inserts => 1, inserts => 1, rows_per_insert => 1, },
+ },
+
+ 'INSERT INTO test_fifth_table' => {
+ regexp =>
+ qr/^\QINSERT INTO dump_test.test_fifth_table (col1, col2, col3, col4, col5) VALUES (NULL, true, false, B'11001', 'NaN');\E/m,
+ like => { column_inserts => 1, },
+ },
+
+ 'INSERT INTO test_table_identity' => {
+ regexp =>
+ qr/^\QINSERT INTO dump_test.test_table_identity (col1, col2) OVERRIDING SYSTEM VALUE VALUES (1, 'test');\E/m,
+ like => { column_inserts => 1, },
+ },
+
+ 'CREATE ROLE regress_dump_test_role' => {
+ create_order => 1,
+ create_sql => 'CREATE ROLE regress_dump_test_role;',
+ regexp => qr/^CREATE ROLE regress_dump_test_role;/m,
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ },
+ },
+
+ 'CREATE ROLE regress_quoted...' => {
+ create_order => 1,
+ create_sql => 'CREATE ROLE "regress_quoted \"" role";',
+ regexp => qr/^CREATE ROLE "regress_quoted \\"" role";/m,
+ like => {
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ },
+ },
+
+ 'CREATE DATABASE regression_invalid...' => {
+ create_order => 1,
+ create_sql => q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'),
+ regexp => qr/^CREATE DATABASE regression_invalid/m,
+
+ # invalid databases should never be dumped
+ like => {},
+ },
+
+ 'CREATE ACCESS METHOD gist2' => {
+ create_order => 52,
+ create_sql =>
+ 'CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler;',
+ regexp =>
+ qr/CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE COLLATION test0 FROM "C"' => {
+ create_order => 76,
+ create_sql => 'CREATE COLLATION test0 FROM "C";',
+ regexp =>
+ qr/CREATE COLLATION public.test0 \(provider = libc, locale = 'C'(, version = '[^']*')?\);/m,
+ collation => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE COLLATION icu_collation' => {
+ create_order => 76,
+ create_sql =>
+ "CREATE COLLATION icu_collation (PROVIDER = icu, LOCALE = 'en-US-u-va-posix');",
+ regexp =>
+ qr/CREATE COLLATION public.icu_collation \(provider = icu, locale = 'en-US-u-va-posix'(, version = '[^']*')?\);/m,
+ icu => 1,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE CAST FOR timestamptz' => {
+ create_order => 51,
+ create_sql =>
+ 'CREATE CAST (timestamptz AS interval) WITH FUNCTION age(timestamptz) AS ASSIGNMENT;',
+ regexp =>
+ qr/CREATE CAST \(timestamp with time zone AS interval\) WITH FUNCTION pg_catalog\.age\(timestamp with time zone\) AS ASSIGNMENT;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE DATABASE postgres' => {
+ regexp => qr/^
+ \QCREATE DATABASE postgres WITH TEMPLATE = template0 \E
+ .+;/xm,
+ like => { createdb => 1, },
+ },
+
+ 'CREATE DATABASE dump_test' => {
+ create_order => 47,
+ create_sql => 'CREATE DATABASE dump_test;',
+ regexp => qr/^
+ \QCREATE DATABASE dump_test WITH TEMPLATE = template0 \E
+ .+;/xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ "CREATE DATABASE dump_test2 LOCALE = 'C'" => {
+ create_order => 47,
+ create_sql =>
+ "CREATE DATABASE dump_test2 LOCALE = 'C' TEMPLATE = template0;",
+ regexp => qr/^
+ \QCREATE DATABASE dump_test2 \E.*\QLOCALE = 'C';\E
+ /xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ 'CREATE EXTENSION ... plpgsql' => {
+ regexp => qr/^
+ \QCREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;\E
+ /xm,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'CREATE AGGREGATE dump_test.newavg' => {
+ create_order => 25,
+ create_sql => 'CREATE AGGREGATE dump_test.newavg (
+ sfunc = int4_avg_accum,
+ basetype = int4,
+ stype = _int8,
+ finalfunc = int8_avg,
+ finalfunc_modify = shareable,
+ initcond1 = \'{0,0}\'
+ );',
+ regexp => qr/^
+ \QCREATE AGGREGATE dump_test.newavg(integer) (\E
+ \n\s+\QSFUNC = int4_avg_accum,\E
+ \n\s+\QSTYPE = bigint[],\E
+ \n\s+\QINITCOND = '{0,0}',\E
+ \n\s+\QFINALFUNC = int8_avg,\E
+ \n\s+\QFINALFUNC_MODIFY = SHAREABLE\E
+ \n\);/xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ exclude_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE CONVERSION dump_test.test_conversion' => {
+ create_order => 78,
+ create_sql =>
+ 'CREATE DEFAULT CONVERSION dump_test.test_conversion FOR \'LATIN1\' TO \'UTF8\' FROM iso8859_1_to_utf8;',
+ regexp =>
+ qr/^\QCREATE DEFAULT CONVERSION dump_test.test_conversion FOR 'LATIN1' TO 'UTF8' FROM iso8859_1_to_utf8;\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE DOMAIN dump_test.us_postal_code' => {
+ create_order => 29,
+ create_sql => 'CREATE DOMAIN dump_test.us_postal_code AS TEXT
+ COLLATE "C"
+ DEFAULT \'10014\'
+ CHECK(VALUE ~ \'^\d{5}$\' OR
+ VALUE ~ \'^\d{5}-\d{4}$\');
+ COMMENT ON CONSTRAINT us_postal_code_check
+ ON DOMAIN dump_test.us_postal_code IS \'check it\';',
+ regexp => qr/^
+ \QCREATE DOMAIN dump_test.us_postal_code AS text COLLATE pg_catalog."C" DEFAULT '10014'::text\E\n\s+
+ \QCONSTRAINT us_postal_code_check CHECK \E
+ \Q(((VALUE ~ '^\d{5}\E
+ \$\Q'::text) OR (VALUE ~ '^\d{5}-\d{4}\E\$
+ \Q'::text)));\E(.|\n)*
+ \QCOMMENT ON CONSTRAINT us_postal_code_check ON DOMAIN dump_test.us_postal_code IS 'check it';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FUNCTION dump_test.pltestlang_call_handler' => {
+ create_order => 17,
+ create_sql => 'CREATE FUNCTION dump_test.pltestlang_call_handler()
+ RETURNS LANGUAGE_HANDLER AS \'$libdir/plpgsql\',
+ \'plpgsql_call_handler\' LANGUAGE C;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.pltestlang_call_handler() \E
+ \QRETURNS language_handler\E
+ \n\s+\QLANGUAGE c\E
+ \n\s+AS\ \'\$
+ \Qlibdir\/plpgsql', 'plpgsql_call_handler';\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FUNCTION dump_test.trigger_func' => {
+ create_order => 30,
+ create_sql => 'CREATE FUNCTION dump_test.trigger_func()
+ RETURNS trigger LANGUAGE plpgsql
+ AS $$ BEGIN RETURN NULL; END;$$;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.trigger_func() RETURNS trigger\E
+ \n\s+\QLANGUAGE plpgsql\E
+ \n\s+AS\ \$\$
+ \Q BEGIN RETURN NULL; END;\E
+ \$\$;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FUNCTION dump_test.event_trigger_func' => {
+ create_order => 32,
+ create_sql => 'CREATE FUNCTION dump_test.event_trigger_func()
+ RETURNS event_trigger LANGUAGE plpgsql
+ AS $$ BEGIN RETURN; END;$$;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.event_trigger_func() RETURNS event_trigger\E
+ \n\s+\QLANGUAGE plpgsql\E
+ \n\s+AS\ \$\$
+ \Q BEGIN RETURN; END;\E
+ \$\$;/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE OPERATOR FAMILY dump_test.op_family' => {
+ create_order => 73,
+ create_sql =>
+ 'CREATE OPERATOR FAMILY dump_test.op_family USING btree;',
+ regexp => qr/^
+ \QCREATE OPERATOR FAMILY dump_test.op_family USING btree;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE OPERATOR CLASS dump_test.op_class' => {
+ create_order => 74,
+ create_sql => 'CREATE OPERATOR CLASS dump_test.op_class
+ FOR TYPE bigint USING btree FAMILY dump_test.op_family
+ AS STORAGE bigint,
+ OPERATOR 1 <(bigint,bigint),
+ OPERATOR 2 <=(bigint,bigint),
+ OPERATOR 3 =(bigint,bigint),
+ OPERATOR 4 >=(bigint,bigint),
+ OPERATOR 5 >(bigint,bigint),
+ FUNCTION 1 btint8cmp(bigint,bigint),
+ FUNCTION 2 btint8sortsupport(internal),
+ FUNCTION 4 btequalimage(oid);',
+ # note: it's correct that btint8sortsupport and btequalimage
+ # are NOT included here (they're optional support functions):
+ regexp => qr/^
+ \QCREATE OPERATOR CLASS dump_test.op_class\E\n\s+
+ \QFOR TYPE bigint USING btree FAMILY dump_test.op_family AS\E\n\s+
+ \QOPERATOR 1 <(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 2 <=(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 3 =(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 4 >=(bigint,bigint) ,\E\n\s+
+ \QOPERATOR 5 >(bigint,bigint) ,\E\n\s+
+ \QFUNCTION 1 (bigint, bigint) btint8cmp(bigint,bigint);\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ # verify that a custom operator/opclass/range type is dumped in right order
+ 'CREATE OPERATOR CLASS dump_test.op_class_custom' => {
+ create_order => 74,
+ create_sql => 'CREATE OPERATOR dump_test.~~ (
+ PROCEDURE = int4eq,
+ LEFTARG = int,
+ RIGHTARG = int);
+ CREATE OPERATOR CLASS dump_test.op_class_custom
+ FOR TYPE int USING btree AS
+ OPERATOR 3 dump_test.~~;
+ CREATE TYPE dump_test.range_type_custom AS RANGE (
+ subtype = int,
+ subtype_opclass = dump_test.op_class_custom);',
+ regexp => qr/^
+ \QCREATE OPERATOR dump_test.~~ (\E\n.+
+ \QCREATE OPERATOR FAMILY dump_test.op_class_custom USING btree;\E\n.+
+ \QCREATE OPERATOR CLASS dump_test.op_class_custom\E\n\s+
+ \QFOR TYPE integer USING btree FAMILY dump_test.op_class_custom AS\E\n\s+
+ \QOPERATOR 3 dump_test.~~(integer,integer);\E\n.+
+ \QCREATE TYPE dump_test.range_type_custom AS RANGE (\E\n\s+
+ \Qsubtype = integer,\E\n\s+
+ \Qmultirange_type_name = dump_test.multirange_type_custom,\E\n\s+
+ \Qsubtype_opclass = dump_test.op_class_custom\E\n
+ \Q);\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE OPERATOR CLASS dump_test.op_class_empty' => {
+ create_order => 89,
+ create_sql => 'CREATE OPERATOR CLASS dump_test.op_class_empty
+ FOR TYPE bigint USING btree FAMILY dump_test.op_family
+ AS STORAGE bigint;',
+ regexp => qr/^
+ \QCREATE OPERATOR CLASS dump_test.op_class_empty\E\n\s+
+ \QFOR TYPE bigint USING btree FAMILY dump_test.op_family AS\E\n\s+
+ \QSTORAGE bigint;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE EVENT TRIGGER test_event_trigger' => {
+ create_order => 33,
+ create_sql => 'CREATE EVENT TRIGGER test_event_trigger
+ ON ddl_command_start
+ EXECUTE FUNCTION dump_test.event_trigger_func();',
+ regexp => qr/^
+ \QCREATE EVENT TRIGGER test_event_trigger \E
+ \QON ddl_command_start\E
+ \n\s+\QEXECUTE FUNCTION dump_test.event_trigger_func();\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE TRIGGER test_trigger' => {
+ create_order => 31,
+ create_sql => 'CREATE TRIGGER test_trigger
+ BEFORE INSERT ON dump_test.test_table
+ FOR EACH ROW WHEN (NEW.col1 > 10)
+ EXECUTE FUNCTION dump_test.trigger_func();',
+ regexp => qr/^
+ \QCREATE TRIGGER test_trigger BEFORE INSERT ON dump_test.test_table \E
+ \QFOR EACH ROW WHEN ((new.col1 > 10)) \E
+ \QEXECUTE FUNCTION dump_test.trigger_func();\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_test_table => 1,
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.planets AS ENUM' => {
+ create_order => 37,
+ create_sql => 'CREATE TYPE dump_test.planets
+ AS ENUM ( \'venus\', \'earth\', \'mars\' );',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.planets AS ENUM (\E
+ \n\s+'venus',
+ \n\s+'earth',
+ \n\s+'mars'
+ \n\);/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.planets AS ENUM pg_upgrade' => {
+ regexp => qr/^
+ \QCREATE TYPE dump_test.planets AS ENUM (\E
+ \n\);.*^
+ \QALTER TYPE dump_test.planets ADD VALUE 'venus';\E
+ \n.*^
+ \QALTER TYPE dump_test.planets ADD VALUE 'earth';\E
+ \n.*^
+ \QALTER TYPE dump_test.planets ADD VALUE 'mars';\E
+ \n/xms,
+ like => { binary_upgrade => 1, },
+ },
+
+ 'CREATE TYPE dump_test.textrange AS RANGE' => {
+ create_order => 38,
+ create_sql => 'CREATE TYPE dump_test.textrange
+ AS RANGE (subtype=text, collation="C");',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.textrange AS RANGE (\E
+ \n\s+\Qsubtype = text,\E
+ \n\s+\Qmultirange_type_name = dump_test.textmultirange,\E
+ \n\s+\Qcollation = pg_catalog."C"\E
+ \n\);/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.int42' => {
+ create_order => 39,
+ create_sql => 'CREATE TYPE dump_test.int42;',
+ regexp => qr/^\QCREATE TYPE dump_test.int42;\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1' => {
+ create_order => 80,
+ create_sql =>
+ 'CREATE TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 (copy=english);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 (\E\n
+ \s+\QPARSER = pg_catalog."default" );\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1 ...' => {
+ regexp => qr/^
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR asciiword WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR word WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR numword WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR email WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR url WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR host WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR sfloat WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR version WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword_numpart WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword_part WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword_asciipart WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR numhword WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR asciihword WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR hword WITH english_stem;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR url_path WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR file WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR "float" WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR "int" WITH simple;\E\n
+ \n
+ \QALTER TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1\E\n
+ \s+\QADD MAPPING FOR uint WITH simple;\E\n
+ \n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1' => {
+ create_order => 81,
+ create_sql =>
+ 'CREATE TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1 (lexize=dsimple_lexize);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH TEMPLATE dump_test.alt_ts_temp1 (\E\n
+ \s+\QLEXIZE = dsimple_lexize );\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TEXT SEARCH PARSER dump_test.alt_ts_prs1' => {
+ create_order => 82,
+ create_sql => 'CREATE TEXT SEARCH PARSER dump_test.alt_ts_prs1
+ (start = prsd_start, gettoken = prsd_nexttoken, end = prsd_end, lextypes = prsd_lextype);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH PARSER dump_test.alt_ts_prs1 (\E\n
+ \s+\QSTART = prsd_start,\E\n
+ \s+\QGETTOKEN = prsd_nexttoken,\E\n
+ \s+\QEND = prsd_end,\E\n
+ \s+\QLEXTYPES = prsd_lextype );\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1' => {
+ create_order => 83,
+ create_sql =>
+ 'CREATE TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 (template=simple);',
+ regexp => qr/^
+ \QCREATE TEXT SEARCH DICTIONARY dump_test.alt_ts_dict1 (\E\n
+ \s+\QTEMPLATE = pg_catalog.simple );\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FUNCTION dump_test.int42_in' => {
+ create_order => 40,
+ create_sql => 'CREATE FUNCTION dump_test.int42_in(cstring)
+ RETURNS dump_test.int42 AS \'int4in\'
+ LANGUAGE internal STRICT IMMUTABLE;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.int42_in(cstring) RETURNS dump_test.int42\E
+ \n\s+\QLANGUAGE internal IMMUTABLE STRICT\E
+ \n\s+AS\ \$\$int4in\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FUNCTION dump_test.int42_out' => {
+ create_order => 41,
+ create_sql => 'CREATE FUNCTION dump_test.int42_out(dump_test.int42)
+ RETURNS cstring AS \'int4out\'
+ LANGUAGE internal STRICT IMMUTABLE;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.int42_out(dump_test.int42) RETURNS cstring\E
+ \n\s+\QLANGUAGE internal IMMUTABLE STRICT\E
+ \n\s+AS\ \$\$int4out\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FUNCTION ... SUPPORT' => {
+ create_order => 41,
+ create_sql =>
+ 'CREATE FUNCTION dump_test.func_with_support() RETURNS int LANGUAGE sql AS $$ SELECT 1 $$ SUPPORT varchar_support;',
+ regexp => qr/^
+ \QCREATE FUNCTION dump_test.func_with_support() RETURNS integer\E
+ \n\s+\QLANGUAGE sql SUPPORT varchar_support\E
+ \n\s+AS\ \$\$\Q SELECT 1 \E\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'Check ordering of a function that depends on a primary key' => {
+ create_order => 41,
+ create_sql => '
+ CREATE TABLE dump_test.ordering_table (id int primary key, data int);
+ CREATE FUNCTION dump_test.ordering_func ()
+ RETURNS SETOF dump_test.ordering_table
+ LANGUAGE sql BEGIN ATOMIC
+ SELECT * FROM dump_test.ordering_table GROUP BY id; END;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.ordering_table\E
+ \n\s+\QADD CONSTRAINT ordering_table_pkey PRIMARY KEY (id);\E
+ .*^
+ \QCREATE FUNCTION dump_test.ordering_func\E/xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE PROCEDURE dump_test.ptest1' => {
+ create_order => 41,
+ create_sql => 'CREATE PROCEDURE dump_test.ptest1(a int)
+ LANGUAGE SQL AS $$ INSERT INTO dump_test.test_table (col1) VALUES (a) $$;',
+ regexp => qr/^
+ \QCREATE PROCEDURE dump_test.ptest1(IN a integer)\E
+ \n\s+\QLANGUAGE sql\E
+ \n\s+AS\ \$\$\Q INSERT INTO dump_test.test_table (col1) VALUES (a) \E\$\$;
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.int42 populated' => {
+ create_order => 42,
+ create_sql => 'CREATE TYPE dump_test.int42 (
+ internallength = 4,
+ input = dump_test.int42_in,
+ output = dump_test.int42_out,
+ alignment = int4,
+ default = 42,
+ passedbyvalue);',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.int42 (\E
+ \n\s+\QINTERNALLENGTH = 4,\E
+ \n\s+\QINPUT = dump_test.int42_in,\E
+ \n\s+\QOUTPUT = dump_test.int42_out,\E
+ \n\s+\QDEFAULT = '42',\E
+ \n\s+\QALIGNMENT = int4,\E
+ \n\s+\QSTORAGE = plain,\E
+ \n\s+PASSEDBYVALUE\n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.composite' => {
+ create_order => 43,
+ create_sql => 'CREATE TYPE dump_test.composite AS (
+ f1 int,
+ f2 dump_test.int42
+ );',
+ regexp => qr/^
+ \QCREATE TYPE dump_test.composite AS (\E
+ \n\s+\Qf1 integer,\E
+ \n\s+\Qf2 dump_test.int42\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TYPE dump_test.undefined' => {
+ create_order => 39,
+ create_sql => 'CREATE TYPE dump_test.undefined;',
+ regexp => qr/^\QCREATE TYPE dump_test.undefined;\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE FOREIGN DATA WRAPPER dummy' => {
+ create_order => 35,
+ create_sql => 'CREATE FOREIGN DATA WRAPPER dummy;',
+ regexp => qr/CREATE FOREIGN DATA WRAPPER dummy;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE SERVER s1 FOREIGN DATA WRAPPER dummy' => {
+ create_order => 36,
+ create_sql => 'CREATE SERVER s1 FOREIGN DATA WRAPPER dummy;',
+ regexp => qr/CREATE SERVER s1 FOREIGN DATA WRAPPER dummy;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE FOREIGN TABLE dump_test.foreign_table SERVER s1' => {
+ create_order => 88,
+ create_sql =>
+ 'CREATE FOREIGN TABLE dump_test.foreign_table (c1 int options (column_name \'col1\'))
+ SERVER s1 OPTIONS (schema_name \'x1\');',
+ regexp => qr/
+ \QCREATE FOREIGN TABLE dump_test.foreign_table (\E\n
+ \s+\Qc1 integer\E\n
+ \Q)\E\n
+ \QSERVER s1\E\n
+ \QOPTIONS (\E\n
+ \s+\Qschema_name 'x1'\E\n
+ \Q);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE USER MAPPING FOR regress_dump_test_role SERVER s1' => {
+ create_order => 86,
+ create_sql =>
+ 'CREATE USER MAPPING FOR regress_dump_test_role SERVER s1;',
+ regexp =>
+ qr/CREATE USER MAPPING FOR regress_dump_test_role SERVER s1;/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE TRANSFORM FOR int' => {
+ create_order => 34,
+ create_sql =>
+ 'CREATE TRANSFORM FOR int LANGUAGE SQL (FROM SQL WITH FUNCTION prsd_lextype(internal), TO SQL WITH FUNCTION int4recv(internal));',
+ regexp =>
+ qr/CREATE TRANSFORM FOR integer LANGUAGE sql \(FROM SQL WITH FUNCTION pg_catalog\.prsd_lextype\(internal\), TO SQL WITH FUNCTION pg_catalog\.int4recv\(internal\)\);/m,
+ like => { %full_runs, section_pre_data => 1, },
+ },
+
+ 'CREATE LANGUAGE pltestlang' => {
+ create_order => 18,
+ create_sql => 'CREATE LANGUAGE pltestlang
+ HANDLER dump_test.pltestlang_call_handler;',
+ regexp => qr/^
+ \QCREATE PROCEDURAL LANGUAGE pltestlang \E
+ \QHANDLER dump_test.pltestlang_call_handler;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview' => {
+ create_order => 20,
+ create_sql => 'CREATE MATERIALIZED VIEW dump_test.matview (col1) AS
+ SELECT col1 FROM dump_test.test_table;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview AS\E
+ \n\s+\QSELECT col1\E
+ \n\s+\QFROM dump_test.test_table\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_second' => {
+ create_order => 21,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_second (col1) AS
+ SELECT * FROM dump_test.matview;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_second AS\E
+ \n\s+\QSELECT col1\E
+ \n\s+\QFROM dump_test.matview\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_third' => {
+ create_order => 58,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_third (col1) AS
+ SELECT * FROM dump_test.matview_second WITH NO DATA;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_third AS\E
+ \n\s+\QSELECT col1\E
+ \n\s+\QFROM dump_test.matview_second\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_fourth' => {
+ create_order => 59,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_fourth (col1) AS
+ SELECT * FROM dump_test.matview_third WITH NO DATA;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_fourth AS\E
+ \n\s+\QSELECT col1\E
+ \n\s+\QFROM dump_test.matview_third\E
+ \n\s+\QWITH NO DATA;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE MATERIALIZED VIEW matview_compression' => {
+ create_order => 20,
+ create_sql => 'CREATE MATERIALIZED VIEW
+ dump_test.matview_compression (col2) AS
+ SELECT col2 FROM dump_test.test_table;
+ ALTER MATERIALIZED VIEW dump_test.matview_compression
+ ALTER COLUMN col2 SET COMPRESSION lz4;',
+ regexp => qr/^
+ \QCREATE MATERIALIZED VIEW dump_test.matview_compression AS\E
+ \n\s+\QSELECT col2\E
+ \n\s+\QFROM dump_test.test_table\E
+ \n\s+\QWITH NO DATA;\E
+ .*
+ \QALTER TABLE ONLY dump_test.matview_compression ALTER COLUMN col2 SET COMPRESSION lz4;\E\n
+ /xms,
+ lz4 => 1,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_toast_compression => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'Check ordering of a matview that depends on a primary key' => {
+ create_order => 42,
+ create_sql => '
+ CREATE MATERIALIZED VIEW dump_test.ordering_view AS
+ SELECT * FROM dump_test.ordering_table GROUP BY id;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.ordering_table\E
+ \n\s+\QADD CONSTRAINT ordering_table_pkey PRIMARY KEY (id);\E
+ .*^
+ \QCREATE MATERIALIZED VIEW dump_test.ordering_view AS\E
+ \n\s+\QSELECT id,\E/xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p1 ON test_table' => {
+ create_order => 22,
+ create_sql => 'CREATE POLICY p1 ON dump_test.test_table
+ USING (true)
+ WITH CHECK (true);',
+ regexp => qr/^
+ \QCREATE POLICY p1 ON dump_test.test_table \E
+ \QUSING (true) WITH CHECK (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p2 ON test_table FOR SELECT' => {
+ create_order => 24,
+ create_sql => 'CREATE POLICY p2 ON dump_test.test_table
+ FOR SELECT TO regress_dump_test_role USING (true);',
+ regexp => qr/^
+ \QCREATE POLICY p2 ON dump_test.test_table FOR SELECT TO regress_dump_test_role \E
+ \QUSING (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p3 ON test_table FOR INSERT' => {
+ create_order => 25,
+ create_sql => 'CREATE POLICY p3 ON dump_test.test_table
+ FOR INSERT TO regress_dump_test_role WITH CHECK (true);',
+ regexp => qr/^
+ \QCREATE POLICY p3 ON dump_test.test_table FOR INSERT \E
+ \QTO regress_dump_test_role WITH CHECK (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p4 ON test_table FOR UPDATE' => {
+ create_order => 26,
+ create_sql => 'CREATE POLICY p4 ON dump_test.test_table FOR UPDATE
+ TO regress_dump_test_role USING (true) WITH CHECK (true);',
+ regexp => qr/^
+ \QCREATE POLICY p4 ON dump_test.test_table FOR UPDATE TO regress_dump_test_role \E
+ \QUSING (true) WITH CHECK (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p5 ON test_table FOR DELETE' => {
+ create_order => 27,
+ create_sql => 'CREATE POLICY p5 ON dump_test.test_table
+ FOR DELETE TO regress_dump_test_role USING (true);',
+ regexp => qr/^
+ \QCREATE POLICY p5 ON dump_test.test_table FOR DELETE \E
+ \QTO regress_dump_test_role USING (true);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE POLICY p6 ON test_table AS RESTRICTIVE' => {
+ create_order => 27,
+ create_sql => 'CREATE POLICY p6 ON dump_test.test_table AS RESTRICTIVE
+ USING (false);',
+ regexp => qr/^
+ \QCREATE POLICY p6 ON dump_test.test_table AS RESTRICTIVE \E
+ \QUSING (false);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_post_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE PUBLICATION pub1' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub1;',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub1 WITH (publish = 'insert, update, delete, truncate');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE PUBLICATION pub2' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub2
+ FOR ALL TABLES
+ WITH (publish = \'\');',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub2 FOR ALL TABLES WITH (publish = '');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE PUBLICATION pub3' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub3;',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub3 WITH (publish = 'insert, update, delete, truncate');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE PUBLICATION pub4' => {
+ create_order => 50,
+ create_sql => 'CREATE PUBLICATION pub4;',
+ regexp => qr/^
+ \QCREATE PUBLICATION pub4 WITH (publish = 'insert, update, delete, truncate');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE SUBSCRIPTION sub1' => {
+ create_order => 50,
+ create_sql => 'CREATE SUBSCRIPTION sub1
+ CONNECTION \'dbname=doesnotexist\' PUBLICATION pub1
+ WITH (connect = false);',
+ regexp => qr/^
+ \QCREATE SUBSCRIPTION sub1 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (connect = false, slot_name = 'sub1');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE SUBSCRIPTION sub2' => {
+ create_order => 50,
+ create_sql => 'CREATE SUBSCRIPTION sub2
+ CONNECTION \'dbname=doesnotexist\' PUBLICATION pub1
+ WITH (connect = false, origin = none);',
+ regexp => qr/^
+ \QCREATE SUBSCRIPTION sub2 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (connect = false, slot_name = 'sub2', origin = none);\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'CREATE SUBSCRIPTION sub3' => {
+ create_order => 50,
+ create_sql => 'CREATE SUBSCRIPTION sub3
+ CONNECTION \'dbname=doesnotexist\' PUBLICATION pub1
+ WITH (connect = false, origin = any);',
+ regexp => qr/^
+ \QCREATE SUBSCRIPTION sub3 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (connect = false, slot_name = 'sub3');\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_table' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_table;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_table;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_second_table' => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_second_table;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_second_table;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_sixth_table (col3, col2)' => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_sixth_table (col3, col2);',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_sixth_table (col2, col3);\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub1 ADD TABLE test_seventh_table (col3, col2) WHERE (col1 = 1)'
+ => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub1 ADD TABLE dump_test.test_seventh_table (col3, col2) WHERE (col1 = 1);',
+ regexp => qr/^
+ \QALTER PUBLICATION pub1 ADD TABLE ONLY dump_test.test_seventh_table (col2, col3) WHERE ((col1 = 1));\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA dump_test' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA dump_test;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub3 ADD TABLES IN SCHEMA dump_test;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA public' => {
+ create_order => 52,
+ create_sql => 'ALTER PUBLICATION pub3 ADD TABLES IN SCHEMA public;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub3 ADD TABLES IN SCHEMA public;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ },
+
+ 'ALTER PUBLICATION pub3 ADD TABLE test_table' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub3 ADD TABLE dump_test.test_table;',
+ regexp => qr/^
+ \QALTER PUBLICATION pub3 ADD TABLE ONLY dump_test.test_table;\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub4 ADD TABLE test_table WHERE (col1 > 0);' => {
+ create_order => 51,
+ create_sql =>
+ 'ALTER PUBLICATION pub4 ADD TABLE dump_test.test_table WHERE (col1 > 0);',
+ regexp => qr/^
+ \QALTER PUBLICATION pub4 ADD TABLE ONLY dump_test.test_table WHERE ((col1 > 0));\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ },
+ },
+
+ 'ALTER PUBLICATION pub4 ADD TABLE test_second_table WHERE (col2 = \'test\');'
+ => {
+ create_order => 52,
+ create_sql =>
+ 'ALTER PUBLICATION pub4 ADD TABLE dump_test.test_second_table WHERE (col2 = \'test\');',
+ regexp => qr/^
+ \QALTER PUBLICATION pub4 ADD TABLE ONLY dump_test.test_second_table WHERE ((col2 = 'test'::text));\E
+ /xm,
+ like => { %full_runs, section_post_data => 1, },
+ unlike => { exclude_dump_test_schema => 1, },
+ },
+
+ 'CREATE SCHEMA public' => {
+ regexp => qr/^CREATE SCHEMA public;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'CREATE SCHEMA dump_test' => {
+ create_order => 2,
+ create_sql => 'CREATE SCHEMA dump_test;',
+ regexp => qr/^CREATE SCHEMA dump_test;/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE SCHEMA dump_test_second_schema' => {
+ create_order => 9,
+ create_sql => 'CREATE SCHEMA dump_test_second_schema;',
+ regexp => qr/^CREATE SCHEMA dump_test_second_schema;/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ },
+
+ 'CREATE TABLE test_table' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_table (
+ col1 serial primary key,
+ col2 text COMPRESSION pglz,
+ col3 text,
+ col4 text,
+ CHECK (col1 <= 1000)
+ ) WITH (autovacuum_enabled = false, fillfactor=80);
+ COMMENT ON CONSTRAINT test_table_col1_check
+ ON dump_test.test_table IS \'bounds check\';',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 text,\E\n
+ \s+\Qcol3 text,\E\n
+ \s+\Qcol4 text,\E\n
+ \s+\QCONSTRAINT test_table_col1_check CHECK ((col1 <= 1000))\E\n
+ \Q)\E\n
+ \QWITH (autovacuum_enabled='false', fillfactor='80');\E\n(.|\n)*
+ \QCOMMENT ON CONSTRAINT test_table_col1_check ON dump_test.test_table IS 'bounds check';\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_compression_method' => {
+ create_order => 110,
+ create_sql => 'CREATE TABLE dump_test.test_compression_method (
+ col1 text
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_compression_method (\E\n
+ \s+\Qcol1 text\E\n
+ \Q);\E
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ # Insert enough data to surpass DEFAULT_IO_BUFFER_SIZE during
+ # (de)compression operations
+ 'COPY test_compression_method' => {
+ create_order => 111,
+ create_sql => 'INSERT INTO dump_test.test_compression_method (col1) '
+ . 'SELECT string_agg(a::text, \'\') FROM generate_series(1,4096) a;',
+ regexp => qr/^
+ \QCOPY dump_test.test_compression_method (col1) FROM stdin;\E
+ \n(?:\d{15277}\n){1}\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ data_only => 1,
+ section_data => 1,
+ only_dump_test_schema => 1,
+ test_schema_plus_large_objects => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE fk_reference_test_table' => {
+ create_order => 21,
+ create_sql => 'CREATE TABLE dump_test.fk_reference_test_table (
+ col1 int primary key references dump_test.test_table
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.fk_reference_test_table (\E
+ \n\s+\Qcol1 integer NOT NULL\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_second_table' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_second_table (
+ col1 int,
+ col2 text
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_second_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 text\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_compression' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_compression (
+ col1 int,
+ col2 text COMPRESSION lz4
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_compression (\E\n
+ \s+\Qcol1 integer,\E\n
+ \s+\Qcol2 text\E\n
+ \);\n
+ .*
+ \QALTER TABLE ONLY dump_test.test_compression ALTER COLUMN col2 SET COMPRESSION lz4;\E\n
+ /xms,
+ lz4 => 1,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_toast_compression => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE measurement PARTITIONED BY' => {
+ create_order => 90,
+ create_sql => 'CREATE TABLE dump_test.measurement (
+ city_id serial not null,
+ logdate date not null,
+ peaktemp int CHECK (peaktemp >= -460),
+ unitsales int
+ ) PARTITION BY RANGE (logdate);',
+ regexp => qr/^
+ \Q-- Name: measurement;\E.*\n
+ \Q--\E\n\n
+ \QCREATE TABLE dump_test.measurement (\E\n
+ \s+\Qcity_id integer NOT NULL,\E\n
+ \s+\Qlogdate date NOT NULL,\E\n
+ \s+\Qpeaktemp integer,\E\n
+ \s+\Qunitsales integer,\E\n
+ \s+\QCONSTRAINT measurement_peaktemp_check CHECK ((peaktemp >= '-460'::integer))\E\n
+ \)\n
+ \QPARTITION BY RANGE (logdate);\E\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ section_pre_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'Partition measurement_y2006m2 creation' => {
+ create_order => 91,
+ create_sql =>
+ 'CREATE TABLE dump_test_second_schema.measurement_y2006m2
+ PARTITION OF dump_test.measurement (
+ unitsales DEFAULT 0 CHECK (unitsales >= 0)
+ )
+ FOR VALUES FROM (\'2006-02-01\') TO (\'2006-03-01\');',
+ regexp => qr/^
+ \QCREATE TABLE dump_test_second_schema.measurement_y2006m2 (\E\n
+ \s+\Qcity_id integer DEFAULT nextval('dump_test.measurement_city_id_seq'::regclass) NOT NULL,\E\n
+ \s+\Qlogdate date NOT NULL,\E\n
+ \s+\Qpeaktemp integer,\E\n
+ \s+\Qunitsales integer DEFAULT 0,\E\n
+ \s+\QCONSTRAINT measurement_peaktemp_check CHECK ((peaktemp >= '-460'::integer)),\E\n
+ \s+\QCONSTRAINT measurement_y2006m2_unitsales_check CHECK ((unitsales >= 0))\E\n
+ \);\n
+ /xm,
+ like => {
+ %full_runs,
+ section_pre_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ 'Creation of row-level trigger in partitioned table' => {
+ create_order => 92,
+ create_sql => 'CREATE TRIGGER test_trigger
+ AFTER INSERT ON dump_test.measurement
+ FOR EACH ROW EXECUTE PROCEDURE dump_test.trigger_func()',
+ regexp => qr/^
+ \QCREATE TRIGGER test_trigger AFTER INSERT ON dump_test.measurement \E
+ \QFOR EACH ROW \E
+ \QEXECUTE FUNCTION dump_test.trigger_func();\E
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs,
+ section_post_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'COPY measurement' => {
+ create_order => 93,
+ create_sql =>
+ 'INSERT INTO dump_test.measurement (city_id, logdate, peaktemp, unitsales) '
+ . "VALUES (1, '2006-02-12', 35, 1);",
+ regexp => qr/^
+ \QCOPY dump_test_second_schema.measurement_y2006m2 (city_id, logdate, peaktemp, unitsales) FROM stdin;\E
+ \n(?:1\t2006-02-12\t35\t1\n)\\\.\n
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ data_only => 1,
+ only_dump_measurement => 1,
+ section_data => 1,
+ only_dump_test_schema => 1,
+ role_parallel => 1,
+ role => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ schema_only => 1,
+ exclude_measurement => 1,
+ only_dump_test_schema => 1,
+ test_schema_plus_large_objects => 1,
+ exclude_measurement => 1,
+ exclude_measurement_data => 1,
+ },
+ },
+
+ 'Disabled trigger on partition is altered' => {
+ create_order => 93,
+ create_sql =>
+ 'CREATE TABLE dump_test_second_schema.measurement_y2006m3
+ PARTITION OF dump_test.measurement
+ FOR VALUES FROM (\'2006-03-01\') TO (\'2006-04-01\');
+ ALTER TABLE dump_test_second_schema.measurement_y2006m3 DISABLE TRIGGER test_trigger;
+ CREATE TABLE dump_test_second_schema.measurement_y2006m4
+ PARTITION OF dump_test.measurement
+ FOR VALUES FROM (\'2006-04-01\') TO (\'2006-05-01\');
+ ALTER TABLE dump_test_second_schema.measurement_y2006m4 ENABLE REPLICA TRIGGER test_trigger;
+ CREATE TABLE dump_test_second_schema.measurement_y2006m5
+ PARTITION OF dump_test.measurement
+ FOR VALUES FROM (\'2006-05-01\') TO (\'2006-06-01\');
+ ALTER TABLE dump_test_second_schema.measurement_y2006m5 ENABLE ALWAYS TRIGGER test_trigger;
+ ',
+ regexp => qr/^
+ \QALTER TABLE dump_test_second_schema.measurement_y2006m3 DISABLE TRIGGER test_trigger;\E
+ /xm,
+ like => {
+ %full_runs,
+ section_post_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ 'Replica trigger on partition is altered' => {
+ regexp => qr/^
+ \QALTER TABLE dump_test_second_schema.measurement_y2006m4 ENABLE REPLICA TRIGGER test_trigger;\E
+ /xm,
+ like => {
+ %full_runs,
+ section_post_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ 'Always trigger on partition is altered' => {
+ regexp => qr/^
+ \QALTER TABLE dump_test_second_schema.measurement_y2006m5 ENABLE ALWAYS TRIGGER test_trigger;\E
+ /xm,
+ like => {
+ %full_runs,
+ section_post_data => 1,
+ role => 1,
+ binary_upgrade => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ # We should never see the creation of a trigger on a partition
+ 'Disabled trigger on partition is not created' => {
+ regexp => qr/CREATE TRIGGER test_trigger.*ON dump_test_second_schema/,
+ like => {},
+ unlike => { %full_runs, %dump_test_schema_runs },
+ },
+
+ # Triggers on partitions should not be dropped individually
+ 'Triggers on partitions are not dropped' => {
+ regexp => qr/DROP TRIGGER test_trigger.*ON dump_test_second_schema/,
+ like => {}
+ },
+
+ 'CREATE TABLE test_third_table_generated_cols' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_third_table (
+ f1 int, junk int,
+ g1 int generated always as (f1 * 2) stored,
+ "F3" int,
+ g2 int generated always as ("F3" * 3) stored
+ );
+ ALTER TABLE dump_test.test_third_table DROP COLUMN junk;',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_third_table (\E\n
+ \s+\Qf1 integer,\E\n
+ \s+\Qg1 integer GENERATED ALWAYS AS ((f1 * 2)) STORED,\E\n
+ \s+\Q"F3" integer,\E\n
+ \s+\Qg2 integer GENERATED ALWAYS AS (("F3" * 3)) STORED\E\n
+ \);\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_fourth_table_zero_col' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_fourth_table (
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_fourth_table (\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_fifth_table' => {
+ create_order => 53,
+ create_sql => 'CREATE TABLE dump_test.test_fifth_table (
+ col1 integer,
+ col2 boolean,
+ col3 boolean,
+ col4 bit(5),
+ col5 float8
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_fifth_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 boolean,\E
+ \n\s+\Qcol3 boolean,\E
+ \n\s+\Qcol4 bit(5),\E
+ \n\s+\Qcol5 double precision\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_sixth_table' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_sixth_table (
+ col1 int,
+ col2 text,
+ col3 bytea
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_sixth_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 text,\E
+ \n\s+\Qcol3 bytea\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_seventh_table' => {
+ create_order => 6,
+ create_sql => 'CREATE TABLE dump_test.test_seventh_table (
+ col1 int,
+ col2 text,
+ col3 bytea
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_seventh_table (\E
+ \n\s+\Qcol1 integer,\E
+ \n\s+\Qcol2 text,\E
+ \n\s+\Qcol3 bytea\E
+ \n\);
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_table_identity' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_table_identity (
+ col1 int generated always as identity primary key,
+ col2 text
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_identity (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 text\E\n
+ \);
+ .*
+ \QALTER TABLE dump_test.test_table_identity ALTER COLUMN col1 ADD GENERATED ALWAYS AS IDENTITY (\E\n
+ \s+\QSEQUENCE NAME dump_test.test_table_identity_col1_seq\E\n
+ \s+\QSTART WITH 1\E\n
+ \s+\QINCREMENT BY 1\E\n
+ \s+\QNO MINVALUE\E\n
+ \s+\QNO MAXVALUE\E\n
+ \s+\QCACHE 1\E\n
+ \);
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_table_generated' => {
+ create_order => 3,
+ create_sql => 'CREATE TABLE dump_test.test_table_generated (
+ col1 int primary key,
+ col2 int generated always as (col1 * 2) stored
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_generated (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 integer GENERATED ALWAYS AS ((col1 * 2)) STORED\E\n
+ \);
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_table_generated_child1 (without local columns)' => {
+ create_order => 4,
+ create_sql => 'CREATE TABLE dump_test.test_table_generated_child1 ()
+ INHERITS (dump_test.test_table_generated);',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_generated_child1 (\E\n
+ \)\n
+ \QINHERITS (dump_test.test_table_generated);\E\n
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE test_table_generated_child1' => {
+ regexp =>
+ qr/^\QALTER TABLE ONLY dump_test.test_table_generated_child1 ALTER COLUMN col2 \E/m,
+
+ # should not get emitted
+ like => {},
+ },
+
+ 'CREATE TABLE test_table_generated_child2 (with local columns)' => {
+ create_order => 4,
+ create_sql => 'CREATE TABLE dump_test.test_table_generated_child2 (
+ col1 int,
+ col2 int
+ ) INHERITS (dump_test.test_table_generated);',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_table_generated_child2 (\E\n
+ \s+\Qcol1 integer,\E\n
+ \s+\Qcol2 integer\E\n
+ \)\n
+ \QINHERITS (dump_test.test_table_generated);\E\n
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE table_with_stats' => {
+ create_order => 98,
+ create_sql => 'CREATE TABLE dump_test.table_index_stats (
+ col1 int,
+ col2 int,
+ col3 int);
+ CREATE INDEX index_with_stats
+ ON dump_test.table_index_stats
+ ((col1 + 1), col1, (col2 + 1), (col3 + 1));
+ ALTER INDEX dump_test.index_with_stats
+ ALTER COLUMN 1 SET STATISTICS 400;
+ ALTER INDEX dump_test.index_with_stats
+ ALTER COLUMN 3 SET STATISTICS 500;',
+ regexp => qr/^
+ \QALTER INDEX dump_test.index_with_stats ALTER COLUMN 1 SET STATISTICS 400;\E\n
+ \QALTER INDEX dump_test.index_with_stats ALTER COLUMN 3 SET STATISTICS 500;\E\n
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_inheritance_parent' => {
+ create_order => 90,
+ create_sql => 'CREATE TABLE dump_test.test_inheritance_parent (
+ col1 int NOT NULL,
+ col2 int CHECK (col2 >= 42)
+ );',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_inheritance_parent (\E\n
+ \s+\Qcol1 integer NOT NULL,\E\n
+ \s+\Qcol2 integer,\E\n
+ \s+\QCONSTRAINT test_inheritance_parent_col2_check CHECK ((col2 >= 42))\E\n
+ \Q);\E\n
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE TABLE test_inheritance_child' => {
+ create_order => 91,
+ create_sql => 'CREATE TABLE dump_test.test_inheritance_child (
+ col1 int NOT NULL,
+ CONSTRAINT test_inheritance_child CHECK (col2 >= 142857)
+ ) INHERITS (dump_test.test_inheritance_parent);',
+ regexp => qr/^
+ \QCREATE TABLE dump_test.test_inheritance_child (\E\n
+ \s+\Qcol1 integer,\E\n
+ \s+\QCONSTRAINT test_inheritance_child CHECK ((col2 >= 142857))\E\n
+ \)\n
+ \QINHERITS (dump_test.test_inheritance_parent);\E\n
+ /xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE STATISTICS extended_stats_no_options' => {
+ create_order => 97,
+ create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_no_options
+ ON col1, col2 FROM dump_test.test_table',
+ regexp => qr/^
+ \QCREATE STATISTICS dump_test.test_ext_stats_no_options ON col1, col2 FROM dump_test.test_table;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE STATISTICS extended_stats_options' => {
+ create_order => 97,
+ create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_opts
+ (ndistinct) ON col1, col2 FROM dump_test.test_fifth_table',
+ regexp => qr/^
+ \QCREATE STATISTICS dump_test.test_ext_stats_opts (ndistinct) ON col1, col2 FROM dump_test.test_fifth_table;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER STATISTICS extended_stats_options' => {
+ create_order => 98,
+ create_sql =>
+ 'ALTER STATISTICS dump_test.test_ext_stats_opts SET STATISTICS 1000',
+ regexp => qr/^
+ \QALTER STATISTICS dump_test.test_ext_stats_opts SET STATISTICS 1000;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE STATISTICS extended_stats_expression' => {
+ create_order => 99,
+ create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_expr
+ ON (2 * col1) FROM dump_test.test_fifth_table',
+ regexp => qr/^
+ \QCREATE STATISTICS dump_test.test_ext_stats_expr ON (2 * col1) FROM dump_test.test_fifth_table;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE SEQUENCE test_table_col1_seq' => {
+ regexp => qr/^
+ \QCREATE SEQUENCE dump_test.test_table_col1_seq\E
+ \n\s+\QAS integer\E
+ \n\s+\QSTART WITH 1\E
+ \n\s+\QINCREMENT BY 1\E
+ \n\s+\QNO MINVALUE\E
+ \n\s+\QNO MAXVALUE\E
+ \n\s+\QCACHE 1;\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE INDEX ON ONLY measurement' => {
+ create_order => 92,
+ create_sql =>
+ 'CREATE INDEX ON dump_test.measurement (city_id, logdate);',
+ regexp => qr/^
+ \QCREATE INDEX measurement_city_id_logdate_idx ON ONLY dump_test.measurement USING\E
+ /xm,
+ like => {
+ binary_upgrade => 1,
+ clean => 1,
+ clean_if_exists => 1,
+ compression => 1,
+ createdb => 1,
+ defaults => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ no_toast_compression => 1,
+ no_large_objects => 1,
+ no_privs => 1,
+ no_owner => 1,
+ no_table_access_method => 1,
+ only_dump_test_schema => 1,
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ schema_only => 1,
+ section_post_data => 1,
+ test_schema_plus_large_objects => 1,
+ only_dump_measurement => 1,
+ exclude_measurement_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_test_table => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ role => 1,
+ section_pre_data => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'ALTER TABLE measurement PRIMARY KEY' => {
+ all_runs => 1,
+ catch_all => 'CREATE ... commands',
+ create_order => 93,
+ create_sql =>
+ 'ALTER TABLE dump_test.measurement ADD PRIMARY KEY (city_id, logdate);',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.measurement\E \n^\s+
+ \QADD CONSTRAINT measurement_pkey PRIMARY KEY (city_id, logdate);\E
+ /xm,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ section_post_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'CREATE INDEX ... ON measurement_y2006_m2' => {
+ regexp => qr/^
+ \QCREATE INDEX measurement_y2006m2_city_id_logdate_idx ON dump_test_second_schema.measurement_y2006m2 \E
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_post_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ 'ALTER INDEX ... ATTACH PARTITION' => {
+ regexp => qr/^
+ \QALTER INDEX dump_test.measurement_city_id_logdate_idx ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_city_id_logdate_idx\E
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_post_data => 1,
+ only_dump_measurement => 1,
+ exclude_measurement_data => 1,
+ },
+ unlike => {
+ exclude_measurement => 1,
+ },
+ },
+
+ 'ALTER INDEX ... ATTACH PARTITION (primary key)' => {
+ all_runs => 1,
+ catch_all => 'CREATE ... commands',
+ regexp => qr/^
+ \QALTER INDEX dump_test.measurement_pkey ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_pkey\E
+ /xm,
+ like => {
+ binary_upgrade => 1,
+ clean => 1,
+ clean_if_exists => 1,
+ compression => 1,
+ createdb => 1,
+ defaults => 1,
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ exclude_test_table_data => 1,
+ no_toast_compression => 1,
+ no_large_objects => 1,
+ no_privs => 1,
+ no_owner => 1,
+ no_table_access_method => 1,
+ pg_dumpall_dbprivs => 1,
+ pg_dumpall_exclude => 1,
+ role => 1,
+ schema_only => 1,
+ section_post_data => 1,
+ only_dump_measurement => 1,
+ exclude_measurement_data => 1,
+ },
+ unlike => {
+ only_dump_test_schema => 1,
+ only_dump_test_table => 1,
+ pg_dumpall_globals => 1,
+ pg_dumpall_globals_clean => 1,
+ section_pre_data => 1,
+ test_schema_plus_large_objects => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'CREATE VIEW test_view' => {
+ create_order => 61,
+ create_sql => 'CREATE VIEW dump_test.test_view
+ WITH (check_option = \'local\', security_barrier = true) AS
+ SELECT col1 FROM dump_test.test_table;',
+ regexp => qr/^
+ \QCREATE VIEW dump_test.test_view WITH (security_barrier='true') AS\E
+ \n\s+\QSELECT col1\E
+ \n\s+\QFROM dump_test.test_table\E
+ \n\s+\QWITH LOCAL CHECK OPTION;\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'ALTER VIEW test_view SET DEFAULT' => {
+ create_order => 62,
+ create_sql =>
+ 'ALTER VIEW dump_test.test_view ALTER COLUMN col1 SET DEFAULT 1;',
+ regexp => qr/^
+ \QALTER TABLE ONLY dump_test.test_view ALTER COLUMN col1 SET DEFAULT 1;\E/xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ # FIXME
+ 'DROP SCHEMA public (for testing without public schema)' => {
+ database => 'regress_pg_dump_test',
+ create_order => 100,
+ create_sql => 'DROP SCHEMA public;',
+ regexp => qr/^DROP SCHEMA public;/m,
+ like => {},
+ },
+
+ 'DROP SCHEMA public' => {
+ regexp => qr/^DROP SCHEMA public;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP SCHEMA IF EXISTS public' => {
+ regexp => qr/^DROP SCHEMA IF EXISTS public;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP EXTENSION plpgsql' => {
+ regexp => qr/^DROP EXTENSION plpgsql;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP FUNCTION dump_test.pltestlang_call_handler()' => {
+ regexp => qr/^DROP FUNCTION dump_test\.pltestlang_call_handler\(\);/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP LANGUAGE pltestlang' => {
+ regexp => qr/^DROP PROCEDURAL LANGUAGE pltestlang;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP SCHEMA dump_test' => {
+ regexp => qr/^DROP SCHEMA dump_test;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP SCHEMA dump_test_second_schema' => {
+ regexp => qr/^DROP SCHEMA dump_test_second_schema;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP TABLE test_table' => {
+ regexp => qr/^DROP TABLE dump_test\.test_table;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP TABLE fk_reference_test_table' => {
+ regexp => qr/^DROP TABLE dump_test\.fk_reference_test_table;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP TABLE test_second_table' => {
+ regexp => qr/^DROP TABLE dump_test\.test_second_table;/m,
+ like => { clean => 1, },
+ },
+
+ 'DROP EXTENSION IF EXISTS plpgsql' => {
+ regexp => qr/^DROP EXTENSION IF EXISTS plpgsql;/m,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'DROP FUNCTION IF EXISTS dump_test.pltestlang_call_handler()' => {
+ regexp => qr/^
+ \QDROP FUNCTION IF EXISTS dump_test.pltestlang_call_handler();\E
+ /xm,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP LANGUAGE IF EXISTS pltestlang' => {
+ regexp => qr/^DROP PROCEDURAL LANGUAGE IF EXISTS pltestlang;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP SCHEMA IF EXISTS dump_test' => {
+ regexp => qr/^DROP SCHEMA IF EXISTS dump_test;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP SCHEMA IF EXISTS dump_test_second_schema' => {
+ regexp => qr/^DROP SCHEMA IF EXISTS dump_test_second_schema;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP TABLE IF EXISTS test_table' => {
+ regexp => qr/^DROP TABLE IF EXISTS dump_test\.test_table;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP TABLE IF EXISTS test_second_table' => {
+ regexp => qr/^DROP TABLE IF EXISTS dump_test\.test_second_table;/m,
+ like => { clean_if_exists => 1, },
+ },
+
+ 'DROP ROLE regress_dump_test_role' => {
+ regexp => qr/^
+ \QDROP ROLE regress_dump_test_role;\E
+ /xm,
+ like => { pg_dumpall_globals_clean => 1, },
+ },
+
+ 'DROP ROLE pg_' => {
+ regexp => qr/^
+ \QDROP ROLE pg_\E.+;
+ /xm,
+
+ # this shouldn't ever get emitted anywhere
+ like => {},
+ },
+
+ 'GRANT USAGE ON SCHEMA dump_test_second_schema' => {
+ create_order => 10,
+ create_sql => 'GRANT USAGE ON SCHEMA dump_test_second_schema
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT USAGE ON SCHEMA dump_test_second_schema TO regress_dump_test_role;\E
+ /xm,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON FOREIGN DATA WRAPPER dummy' => {
+ create_order => 85,
+ create_sql => 'GRANT USAGE ON FOREIGN DATA WRAPPER dummy
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON FOREIGN DATA WRAPPER dummy TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON FOREIGN SERVER s1' => {
+ create_order => 85,
+ create_sql => 'GRANT USAGE ON FOREIGN SERVER s1
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON FOREIGN SERVER s1 TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON DOMAIN dump_test.us_postal_code' => {
+ create_order => 72,
+ create_sql =>
+ 'GRANT USAGE ON DOMAIN dump_test.us_postal_code TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.us_postal_code TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'GRANT USAGE ON TYPE dump_test.int42' => {
+ create_order => 87,
+ create_sql =>
+ 'GRANT USAGE ON TYPE dump_test.int42 TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.int42 TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'GRANT USAGE ON TYPE dump_test.planets - ENUM' => {
+ create_order => 66,
+ create_sql =>
+ 'GRANT USAGE ON TYPE dump_test.planets TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.planets TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'GRANT USAGE ON TYPE dump_test.textrange - RANGE' => {
+ create_order => 67,
+ create_sql =>
+ 'GRANT USAGE ON TYPE dump_test.textrange TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON TYPE dump_test.textrange TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'GRANT CREATE ON DATABASE dump_test' => {
+ create_order => 48,
+ create_sql =>
+ 'GRANT CREATE ON DATABASE dump_test TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT CREATE ON DATABASE dump_test TO regress_dump_test_role;\E
+ /xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ 'GRANT SELECT ON TABLE test_table' => {
+ create_order => 5,
+ create_sql => 'GRANT SELECT ON TABLE dump_test.test_table
+ TO regress_dump_test_role;',
+ regexp =>
+ qr/^\QGRANT SELECT ON TABLE dump_test.test_table TO regress_dump_test_role;\E/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ exclude_test_table => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'GRANT SELECT ON TABLE measurement' => {
+ create_order => 91,
+ create_sql => 'GRANT SELECT ON TABLE dump_test.measurement
+ TO regress_dump_test_role;
+ GRANT SELECT(city_id) ON TABLE dump_test.measurement
+ TO "regress_quoted \"" role";',
+ regexp =>
+ qr/^\QGRANT SELECT ON TABLE dump_test.measurement TO regress_dump_test_role;\E\n.*
+ ^\QGRANT SELECT(city_id) ON TABLE dump_test.measurement TO "regress_quoted \"" role";\E/xms,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ section_pre_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'GRANT SELECT ON TABLE measurement_y2006m2' => {
+ create_order => 94,
+ create_sql => 'GRANT SELECT ON TABLE
+ dump_test_second_schema.measurement_y2006m2,
+ dump_test_second_schema.measurement_y2006m3,
+ dump_test_second_schema.measurement_y2006m4,
+ dump_test_second_schema.measurement_y2006m5
+ TO regress_dump_test_role;',
+ regexp =>
+ qr/^\QGRANT SELECT ON TABLE dump_test_second_schema.measurement_y2006m2 TO regress_dump_test_role;\E/m,
+ like => {
+ %full_runs,
+ role => 1,
+ section_pre_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => {
+ no_privs => 1,
+ exclude_measurement => 1,
+ },
+ },
+
+ 'GRANT ALL ON LARGE OBJECT ...' => {
+ create_order => 60,
+ create_sql => 'DO $$
+ DECLARE myoid oid;
+ BEGIN
+ SELECT loid FROM pg_largeobject INTO myoid;
+ EXECUTE \'GRANT ALL ON LARGE OBJECT \' || myoid || \' TO regress_dump_test_role;\';
+ END;
+ $$;',
+ regexp => qr/^
+ \QGRANT ALL ON LARGE OBJECT \E[0-9]+\Q TO regress_dump_test_role;\E
+ /xm,
+ like => {
+ %full_runs,
+ column_inserts => 1,
+ data_only => 1,
+ inserts => 1,
+ section_pre_data => 1,
+ test_schema_plus_large_objects => 1,
+ binary_upgrade => 1,
+ },
+ unlike => {
+ no_large_objects => 1,
+ no_privs => 1,
+ schema_only => 1,
+ },
+ },
+
+ 'GRANT INSERT(col1) ON TABLE test_second_table' => {
+ create_order => 8,
+ create_sql =>
+ 'GRANT INSERT (col1) ON TABLE dump_test.test_second_table
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT INSERT(col1) ON TABLE dump_test.test_second_table TO regress_dump_test_role;\E
+ /xm,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_privs => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'GRANT EXECUTE ON FUNCTION pg_sleep() TO regress_dump_test_role' => {
+ create_order => 16,
+ create_sql => 'GRANT EXECUTE ON FUNCTION pg_sleep(float8)
+ TO regress_dump_test_role;',
+ regexp => qr/^
+ \QGRANT ALL ON FUNCTION pg_catalog.pg_sleep(double precision) TO regress_dump_test_role;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT SELECT (proname ...) ON TABLE pg_proc TO public' => {
+ create_order => 46,
+ create_sql => 'GRANT SELECT (
+ tableoid,
+ oid,
+ proname,
+ pronamespace,
+ proowner,
+ prolang,
+ procost,
+ prorows,
+ provariadic,
+ prosupport,
+ prokind,
+ prosecdef,
+ proleakproof,
+ proisstrict,
+ proretset,
+ provolatile,
+ proparallel,
+ pronargs,
+ pronargdefaults,
+ prorettype,
+ proargtypes,
+ proallargtypes,
+ proargmodes,
+ proargnames,
+ proargdefaults,
+ protrftypes,
+ prosrc,
+ probin,
+ proconfig,
+ proacl
+ ) ON TABLE pg_proc TO public;',
+ regexp => qr/
+ \QGRANT SELECT(tableoid) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(oid) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proname) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(pronamespace) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proowner) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prolang) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(procost) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prorows) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(provariadic) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prosupport) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prokind) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prosecdef) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proleakproof) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proisstrict) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proretset) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(provolatile) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proparallel) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(pronargs) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(pronargdefaults) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prorettype) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargtypes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proallargtypes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargmodes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargnames) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proargdefaults) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(protrftypes) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(prosrc) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(probin) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proconfig) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E\n.*
+ \QGRANT SELECT(proacl) ON TABLE pg_catalog.pg_proc TO PUBLIC;\E/xms,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'GRANT USAGE ON SCHEMA public TO public' => {
+ regexp => qr/^
+ \Q--\E\n\n
+ \QGRANT USAGE ON SCHEMA public TO PUBLIC;\E
+ /xm,
+
+ # this shouldn't ever get emitted anymore
+ like => {},
+ },
+
+ 'REFRESH MATERIALIZED VIEW matview' => {
+ regexp => qr/^\QREFRESH MATERIALIZED VIEW dump_test.matview;\E/m,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'REFRESH MATERIALIZED VIEW matview_second' => {
+ regexp => qr/^
+ \QREFRESH MATERIALIZED VIEW dump_test.matview;\E
+ \n.*
+ \QREFRESH MATERIALIZED VIEW dump_test.matview_second;\E
+ /xms,
+ like =>
+ { %full_runs, %dump_test_schema_runs, section_post_data => 1, },
+ unlike => {
+ binary_upgrade => 1,
+ exclude_dump_test_schema => 1,
+ schema_only => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ # FIXME
+ 'REFRESH MATERIALIZED VIEW matview_third' => {
+ regexp => qr/^
+ \QREFRESH MATERIALIZED VIEW dump_test.matview_third;\E
+ /xms,
+ like => {},
+ },
+
+ # FIXME
+ 'REFRESH MATERIALIZED VIEW matview_fourth' => {
+ regexp => qr/^
+ \QREFRESH MATERIALIZED VIEW dump_test.matview_fourth;\E
+ /xms,
+ like => {},
+ },
+
+ 'REVOKE CONNECT ON DATABASE dump_test FROM public' => {
+ create_order => 49,
+ create_sql => 'REVOKE CONNECT ON DATABASE dump_test FROM public;',
+ regexp => qr/^
+ \QREVOKE CONNECT,TEMPORARY ON DATABASE dump_test FROM PUBLIC;\E\n
+ \QGRANT TEMPORARY ON DATABASE dump_test TO PUBLIC;\E\n
+ \QGRANT CREATE ON DATABASE dump_test TO regress_dump_test_role;\E
+ /xm,
+ like => { pg_dumpall_dbprivs => 1, },
+ },
+
+ 'REVOKE EXECUTE ON FUNCTION pg_sleep() FROM public' => {
+ create_order => 15,
+ create_sql => 'REVOKE EXECUTE ON FUNCTION pg_sleep(float8)
+ FROM public;',
+ regexp => qr/^
+ \QREVOKE ALL ON FUNCTION pg_catalog.pg_sleep(double precision) FROM PUBLIC;\E
+ /xm,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ # With the exception of the public schema, we don't dump ownership changes
+ # for objects originating at initdb. Hence, any GRANT or REVOKE affecting
+ # owner privileges for those objects should reference the bootstrap
+ # superuser, not the dump-time owner.
+ 'REVOKE EXECUTE ON FUNCTION pg_stat_reset FROM regress_dump_test_role' =>
+ {
+ create_order => 15,
+ create_sql => '
+ ALTER FUNCTION pg_stat_reset OWNER TO regress_dump_test_role;
+ REVOKE EXECUTE ON FUNCTION pg_stat_reset
+ FROM regress_dump_test_role;',
+ regexp => qr/^[^-].*pg_stat_reset.* regress_dump_test_role/m,
+
+ # this shouldn't ever get emitted
+ like => {},
+ },
+
+ 'REVOKE SELECT ON TABLE pg_proc FROM public' => {
+ create_order => 45,
+ create_sql => 'REVOKE SELECT ON TABLE pg_proc FROM public;',
+ regexp =>
+ qr/^\QREVOKE SELECT ON TABLE pg_catalog.pg_proc FROM PUBLIC;\E/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'REVOKE ALL ON SCHEMA public' => {
+ create_order => 16,
+ create_sql =>
+ 'REVOKE ALL ON SCHEMA public FROM "regress_quoted \"" role";',
+ regexp =>
+ qr/^REVOKE ALL ON SCHEMA public FROM "regress_quoted \\"" role";/m,
+ like => { %full_runs, section_pre_data => 1, },
+ unlike => { no_privs => 1, },
+ },
+
+ 'REVOKE USAGE ON LANGUAGE plpgsql FROM public' => {
+ create_order => 16,
+ create_sql => 'REVOKE USAGE ON LANGUAGE plpgsql FROM public;',
+ regexp => qr/^REVOKE ALL ON LANGUAGE plpgsql FROM PUBLIC;/m,
+ like => {
+ %full_runs,
+ %dump_test_schema_runs,
+ only_dump_test_table => 1,
+ role => 1,
+ section_pre_data => 1,
+ only_dump_measurement => 1,
+ },
+ unlike => { no_privs => 1, },
+ },
+
+
+ 'CREATE ACCESS METHOD regress_test_table_am' => {
+ create_order => 11,
+ create_sql =>
+ 'CREATE ACCESS METHOD regress_table_am TYPE TABLE HANDLER heap_tableam_handler;',
+ regexp => qr/^
+ \QCREATE ACCESS METHOD regress_table_am TYPE TABLE HANDLER heap_tableam_handler;\E
+ \n/xm,
+ like => {
+ %full_runs, section_pre_data => 1,
+ },
+ },
+
+ # It's a bit tricky to ensure that the proper SET of default table
+ # AM occurs. To achieve that we create a table with the standard
+ # AM, test AM, standard AM. That guarantees that there needs to be
+ # a SET interspersed. Then use a regex that prevents interspersed
+ # SET ...; statements, followed by the expected CREATE TABLE. Not
+ # pretty, but seems hard to do better in this framework.
+ 'CREATE TABLE regress_pg_dump_table_am' => {
+ create_order => 12,
+ create_sql => '
+ CREATE TABLE dump_test.regress_pg_dump_table_am_0() USING heap;
+ CREATE TABLE dump_test.regress_pg_dump_table_am_1 (col1 int) USING regress_table_am;
+ CREATE TABLE dump_test.regress_pg_dump_table_am_2() USING heap;',
+ regexp => qr/^
+ \QSET default_table_access_method = regress_table_am;\E
+ (\n(?!SET[^;]+;)[^\n]*)*
+ \n\QCREATE TABLE dump_test.regress_pg_dump_table_am_1 (\E
+ \n\s+\Qcol1 integer\E
+ \n\);/xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_table_access_method => 1,
+ only_dump_measurement => 1,
+ },
+ },
+
+ 'CREATE MATERIALIZED VIEW regress_pg_dump_matview_am' => {
+ create_order => 13,
+ create_sql => '
+ CREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_0 USING heap AS SELECT 1;
+ CREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_1
+ USING regress_table_am AS SELECT count(*) FROM pg_class;
+ CREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_2 USING heap AS SELECT 1;',
+ regexp => qr/^
+ \QSET default_table_access_method = regress_table_am;\E
+ (\n(?!SET[^;]+;)[^\n]*)*
+ \QCREATE MATERIALIZED VIEW dump_test.regress_pg_dump_matview_am_1 AS\E
+ \n\s+\QSELECT count(*) AS count\E
+ \n\s+\QFROM pg_class\E
+ \n\s+\QWITH NO DATA;\E\n/xm,
+ like => {
+ %full_runs, %dump_test_schema_runs, section_pre_data => 1,
+ },
+ unlike => {
+ exclude_dump_test_schema => 1,
+ no_table_access_method => 1,
+ only_dump_measurement => 1,
+ },
+ });
+
+#########################################
+# Create a PG instance to test actually dumping from
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+my $port = $node->port;
+
+# We need to see if this system supports CREATE COLLATION or not
+# If it doesn't then we will skip all the COLLATION-related tests.
+my $collation_support = 0;
+my $collation_check_stderr;
+$node->psql(
+ 'postgres',
+ "CREATE COLLATION testing FROM \"C\"; DROP COLLATION testing;",
+ on_error_stop => 0,
+ stderr => \$collation_check_stderr);
+
+if ($collation_check_stderr !~ /ERROR: /)
+{
+ $collation_support = 1;
+}
+
+# ICU doesn't work with some encodings
+my $encoding = $node->safe_psql('postgres', 'show server_encoding');
+$supports_icu = 0 if $encoding eq 'SQL_ASCII';
+
+# Create additional databases for mutations of schema public
+$node->psql('postgres', 'create database regress_pg_dump_test;');
+$node->psql('postgres', 'create database regress_public_owner;');
+
+#########################################
+# Set up schemas, tables, etc, to be dumped.
+
+# Build up the create statements
+my %create_sql = ();
+
+foreach my $test (
+ sort {
+ if ($tests{$a}->{create_order} and $tests{$b}->{create_order})
+ {
+ $tests{$a}->{create_order} <=> $tests{$b}->{create_order};
+ }
+ elsif ($tests{$a}->{create_order})
+ {
+ -1;
+ }
+ elsif ($tests{$b}->{create_order})
+ {
+ 1;
+ }
+ else
+ {
+ 0;
+ }
+ } keys %tests)
+{
+ my $test_db = 'postgres';
+
+ if (defined($tests{$test}->{database}))
+ {
+ $test_db = $tests{$test}->{database};
+ }
+
+ if (defined($tests{$test}->{icu}))
+ {
+ $tests{$test}->{collation} = 1;
+ }
+
+ if ($tests{$test}->{create_sql})
+ {
+
+ # Skip any collation-related commands if there is no collation support
+ if (!$collation_support && defined($tests{$test}->{collation}))
+ {
+ next;
+ }
+
+ # Skip any icu-related collation commands if build was without icu
+ if (!$supports_icu && defined($tests{$test}->{icu}))
+ {
+ next;
+ }
+
+ # Skip tests specific to LZ4 if this build does not support
+ # this option.
+ if (!$supports_lz4 && defined($tests{$test}->{lz4}))
+ {
+ next;
+ }
+
+ # Normalize command ending: strip all line endings, add
+ # semicolon if missing, add two newlines.
+ my $create_sql = $tests{$test}->{create_sql};
+ chomp $create_sql;
+ $create_sql .= ';' unless substr($create_sql, -1) eq ';';
+ $create_sql{$test_db} .= $create_sql . "\n\n";
+ }
+}
+
+# Send the combined set of commands to psql
+foreach my $db (sort keys %create_sql)
+{
+ $node->safe_psql($db, $create_sql{$db});
+}
+
+#########################################
+# Test connecting to a non-existent database
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", 'qqq' ],
+ qr/pg_dump: error: connection to server .* failed: FATAL: database "qqq" does not exist/,
+ 'connecting to a non-existent database');
+
+#########################################
+# Test connecting to an invalid database
+
+$node->command_fails_like(
+ [ 'pg_dump', '-d', 'regression_invalid' ],
+ qr/pg_dump: error: connection to server .* failed: FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'connecting to an invalid database');
+
+#########################################
+# Test connecting with an unprivileged user
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '--role=regress_dump_test_role' ],
+ qr/\Qpg_dump: error: query failed: ERROR: permission denied for\E/,
+ 'connecting with an unprivileged user');
+
+#########################################
+# Test dumping a non-existent schema, table, and patterns with --strict-names
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '-n', 'nonexistent' ],
+ qr/\Qpg_dump: error: no matching schemas were found\E/,
+ 'dumping a non-existent schema');
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '-t', 'nonexistent' ],
+ qr/\Qpg_dump: error: no matching tables were found\E/,
+ 'dumping a non-existent table');
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '--strict-names', '-n', 'nonexistent*' ],
+ qr/\Qpg_dump: error: no matching schemas were found for pattern\E/,
+ 'no matching schemas');
+
+command_fails_like(
+ [ 'pg_dump', '-p', "$port", '--strict-names', '-t', 'nonexistent*' ],
+ qr/\Qpg_dump: error: no matching tables were found for pattern\E/,
+ 'no matching tables');
+
+#########################################
+# Test invalid multipart database names
+
+$node->command_fails_like(
+ [ 'pg_dumpall', '--exclude-database', '.' ],
+ qr/pg_dumpall: error: improper qualified name \(too many dotted names\): \./,
+ 'pg_dumpall: option --exclude-database rejects multipart pattern "."');
+
+$node->command_fails_like(
+ [ 'pg_dumpall', '--exclude-database', 'myhost.mydb' ],
+ qr/pg_dumpall: error: improper qualified name \(too many dotted names\): myhost\.mydb/,
+ 'pg_dumpall: option --exclude-database rejects multipart database names');
+
+##############################################################
+# Test dumping pg_catalog (for research -- cannot be reloaded)
+
+$node->command_ok(
+ [ 'pg_dump', '-p', "$port", '-n', 'pg_catalog' ],
+ 'pg_dump: option -n pg_catalog'
+);
+
+#########################################
+# Test valid database exclusion patterns
+
+$node->command_ok(
+ [ 'pg_dumpall', '-p', "$port", '--exclude-database', '"myhost.mydb"' ],
+ 'pg_dumpall: option --exclude-database handles database names with embedded dots'
+);
+
+#########################################
+# Test invalid multipart schema names
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', 'myhost.mydb.myschema' ],
+ qr/pg_dump: error: improper qualified name \(too many dotted names\): myhost\.mydb\.myschema/,
+ 'pg_dump: option --schema rejects three-part schema names');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', 'otherdb.myschema' ],
+ qr/pg_dump: error: cross-database references are not implemented: otherdb\.myschema/,
+ 'pg_dump: option --schema rejects cross-database multipart schema names');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', '.' ],
+ qr/pg_dump: error: cross-database references are not implemented: \./,
+ 'pg_dump: option --schema rejects degenerate two-part schema name: "."');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', '"some.other.db".myschema' ],
+ qr/pg_dump: error: cross-database references are not implemented: "some\.other\.db"\.myschema/,
+ 'pg_dump: option --schema rejects cross-database multipart schema names with embedded dots'
+);
+
+$node->command_fails_like(
+ [ 'pg_dump', '--schema', '..' ],
+ qr/pg_dump: error: improper qualified name \(too many dotted names\): \.\./,
+ 'pg_dump: option --schema rejects degenerate three-part schema name: ".."'
+);
+
+#########################################
+# Test invalid multipart relation names
+
+$node->command_fails_like(
+ [ 'pg_dump', '--table', 'myhost.mydb.myschema.mytable' ],
+ qr/pg_dump: error: improper relation name \(too many dotted names\): myhost\.mydb\.myschema\.mytable/,
+ 'pg_dump: option --table rejects four-part table names');
+
+$node->command_fails_like(
+ [ 'pg_dump', '--table', 'otherdb.pg_catalog.pg_class' ],
+ qr/pg_dump: error: cross-database references are not implemented: otherdb\.pg_catalog\.pg_class/,
+ 'pg_dump: option --table rejects cross-database three part table names');
+
+command_fails_like(
+ [
+ 'pg_dump', '-p', "$port", '--table',
+ '"some.other.db".pg_catalog.pg_class'
+ ],
+ qr/pg_dump: error: cross-database references are not implemented: "some\.other\.db"\.pg_catalog\.pg_class/,
+ 'pg_dump: option --table rejects cross-database three part table names with embedded dots'
+);
+
+#########################################
+# Run all runs
+
+foreach my $run (sort keys %pgdump_runs)
+{
+ my $test_key = $run;
+ my $run_db = 'postgres';
+
+ # Skip command-level tests for gzip/lz4/zstd if the tool is not supported
+ if ($pgdump_runs{$run}->{compile_option}
+ && (($pgdump_runs{$run}->{compile_option} eq 'gzip'
+ && !$supports_gzip)
+ || ($pgdump_runs{$run}->{compile_option} eq 'lz4'
+ && !$supports_lz4)
+ || ($pgdump_runs{$run}->{compile_option} eq 'zstd'
+ && !$supports_zstd)))
+ {
+ note
+ "$run: skipped due to no $pgdump_runs{$run}->{compile_option} support";
+ next;
+ }
+
+ $node->command_ok(\@{ $pgdump_runs{$run}->{dump_cmd} },
+ "$run: pg_dump runs");
+
+ if ($pgdump_runs{$run}->{compress_cmd})
+ {
+ my ($compress_cmd) = $pgdump_runs{$run}->{compress_cmd};
+ my $compress_program = $compress_cmd->{program};
+
+ # Skip the rest of the test if the compression program is
+ # not defined.
+ next if (!defined($compress_program) || $compress_program eq '');
+
+ my @full_compress_cmd =
+ ($compress_cmd->{program}, @{ $compress_cmd->{args} });
+ command_ok(\@full_compress_cmd, "$run: compression commands");
+ }
+
+ if ($pgdump_runs{$run}->{glob_patterns})
+ {
+ my $glob_patterns = $pgdump_runs{$run}->{glob_patterns};
+ foreach my $glob_pattern (@{$glob_patterns})
+ {
+ my @glob_output = glob($glob_pattern);
+ is(scalar(@glob_output) > 0,
+ 1, "$run: glob check for $glob_pattern");
+ }
+ }
+
+ if ($pgdump_runs{$run}->{command_like})
+ {
+ my $cmd_like = $pgdump_runs{$run}->{command_like};
+ $node->command_like(
+ \@{ $cmd_like->{command} },
+ $cmd_like->{expected},
+ "$run: " . $cmd_like->{name});
+ }
+
+ if ($pgdump_runs{$run}->{restore_cmd})
+ {
+ $node->command_ok(\@{ $pgdump_runs{$run}->{restore_cmd} },
+ "$run: pg_restore runs");
+ }
+
+ if ($pgdump_runs{$run}->{test_key})
+ {
+ $test_key = $pgdump_runs{$run}->{test_key};
+ }
+
+ my $output_file = slurp_file("$tempdir/${run}.sql");
+
+ #########################################
+ # Run all tests where this run is included
+ # as either a 'like' or 'unlike' test.
+
+ foreach my $test (sort keys %tests)
+ {
+ my $test_db = 'postgres';
+
+ if (defined($pgdump_runs{$run}->{database}))
+ {
+ $run_db = $pgdump_runs{$run}->{database};
+ }
+
+ if (defined($tests{$test}->{database}))
+ {
+ $test_db = $tests{$test}->{database};
+ }
+
+ # Skip any collation-related commands if there is no collation support
+ if (!$collation_support && defined($tests{$test}->{collation}))
+ {
+ next;
+ }
+
+ # Skip any icu-related collation commands if build was without icu
+ if (!$supports_icu && defined($tests{$test}->{icu}))
+ {
+ next;
+ }
+
+ # Skip tests specific to LZ4 if this build does not support
+ # this option.
+ if (!$supports_lz4 && defined($tests{$test}->{lz4}))
+ {
+ next;
+ }
+
+ if ($run_db ne $test_db)
+ {
+ next;
+ }
+
+ # Run the test listed as a like, unless it is specifically noted
+ # as an unlike (generally due to an explicit exclusion or similar).
+ if ($tests{$test}->{like}->{$test_key}
+ && !defined($tests{$test}->{unlike}->{$test_key}))
+ {
+ if (!ok($output_file =~ $tests{$test}->{regexp},
+ "$run: should dump $test"))
+ {
+ diag("Review $run results in $tempdir");
+ }
+ }
+ else
+ {
+ if (!ok($output_file !~ $tests{$test}->{regexp},
+ "$run: should not dump $test"))
+ {
+ diag("Review $run results in $tempdir");
+ }
+ }
+ }
+}
+
+#########################################
+# Stop the database instance, which will be removed at the end of the tests.
+
+$node->stop('fast');
+
+done_testing();
diff --git a/src/bin/pg_dump/t/003_pg_dump_with_server.pl b/src/bin/pg_dump/t/003_pg_dump_with_server.pl
new file mode 100644
index 0000000..ab025c4
--- /dev/null
+++ b/src/bin/pg_dump/t/003_pg_dump_with_server.pl
@@ -0,0 +1,40 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+my $port = $node->port;
+
+$node->init;
+$node->start;
+
+#########################################
+# Verify that dumping foreign data includes only foreign tables of
+# matching servers
+
+$node->safe_psql('postgres', "CREATE FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE SERVER s0 FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE SERVER s1 FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE SERVER s2 FOREIGN DATA WRAPPER dummy");
+$node->safe_psql('postgres', "CREATE FOREIGN TABLE t0 (a int) SERVER s0");
+$node->safe_psql('postgres', "CREATE FOREIGN TABLE t1 (a int) SERVER s1");
+my ($cmd, $stdout, $stderr, $result);
+
+command_fails_like(
+ [ "pg_dump", '-p', $port, '--include-foreign-data=s0', 'postgres' ],
+ qr/foreign-data wrapper \"dummy\" has no handler\r?\npg_dump: detail: Query was: .*t0/,
+ "correctly fails to dump a foreign table from a dummy FDW");
+
+command_ok(
+ [ "pg_dump", '-p', $port, '-a', '--include-foreign-data=s2', 'postgres' ],
+ "dump foreign server with no tables");
+
+done_testing();
diff --git a/src/bin/pg_dump/t/004_pg_dump_parallel.pl b/src/bin/pg_dump/t/004_pg_dump_parallel.pl
new file mode 100644
index 0000000..c4b461e
--- /dev/null
+++ b/src/bin/pg_dump/t/004_pg_dump_parallel.pl
@@ -0,0 +1,81 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $dbname1 = 'regression_src';
+my $dbname2 = 'regression_dest1';
+my $dbname3 = 'regression_dest2';
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+my $backupdir = $node->backup_dir;
+
+$node->run_log([ 'createdb', $dbname1 ]);
+$node->run_log([ 'createdb', $dbname2 ]);
+$node->run_log([ 'createdb', $dbname3 ]);
+
+$node->safe_psql(
+ $dbname1,
+ qq{
+create type digit as enum ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
+
+-- plain table with index
+create table tplain (en digit, data int unique);
+insert into tplain select (x%10)::text::digit, x from generate_series(1,1000) x;
+
+-- non-troublesome hashed partitioning
+create table ths (mod int, data int, unique(mod, data)) partition by hash(mod);
+create table ths_p1 partition of ths for values with (modulus 3, remainder 0);
+create table ths_p2 partition of ths for values with (modulus 3, remainder 1);
+create table ths_p3 partition of ths for values with (modulus 3, remainder 2);
+insert into ths select (x%10), x from generate_series(1,1000) x;
+
+-- dangerous hashed partitioning
+create table tht (en digit, data int, unique(en, data)) partition by hash(en);
+create table tht_p1 partition of tht for values with (modulus 3, remainder 0);
+create table tht_p2 partition of tht for values with (modulus 3, remainder 1);
+create table tht_p3 partition of tht for values with (modulus 3, remainder 2);
+insert into tht select (x%10)::text::digit, x from generate_series(1,1000) x;
+ });
+
+$node->command_ok(
+ [
+ 'pg_dump', '-Fd', '--no-sync', '-j2', '-f', "$backupdir/dump1",
+ $node->connstr($dbname1)
+ ],
+ 'parallel dump');
+
+$node->command_ok(
+ [
+ 'pg_restore', '-v',
+ '-d', $node->connstr($dbname2),
+ '-j3', "$backupdir/dump1"
+ ],
+ 'parallel restore');
+
+$node->command_ok(
+ [
+ 'pg_dump', '-Fd',
+ '--no-sync', '-j2',
+ '-f', "$backupdir/dump2",
+ '--inserts', $node->connstr($dbname1)
+ ],
+ 'parallel dump as inserts');
+
+$node->command_ok(
+ [
+ 'pg_restore', '-v',
+ '-d', $node->connstr($dbname3),
+ '-j3', "$backupdir/dump2"
+ ],
+ 'parallel restore as inserts');
+
+done_testing();
diff --git a/src/bin/pg_dump/t/010_dump_connstr.pl b/src/bin/pg_dump/t/010_dump_connstr.pl
new file mode 100644
index 0000000..ed86c33
--- /dev/null
+++ b/src/bin/pg_dump/t/010_dump_connstr.pl
@@ -0,0 +1,233 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+if ($PostgreSQL::Test::Utils::is_msys2)
+{
+ plan skip_all => 'High bit name tests fail on Msys2';
+}
+
+# We're going to use byte sequences that aren't valid UTF-8 strings. Use
+# LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
+$ENV{LC_ALL} = 'C';
+$ENV{PGCLIENTENCODING} = 'LATIN1';
+
+# Create database and user names covering the range of LATIN1
+# characters, for use in a connection string by pg_dumpall. Skip ','
+# because of pg_regress --create-role, skip [\n\r] because pg_dumpall
+# does not allow them. We also skip many ASCII letters, to keep the
+# total number of tested characters to what will fit in four names.
+# The odds of finding something interesting by testing all ASCII letters
+# seem too small to justify the cycles of testing a fifth name.
+my $dbname1 =
+ 'regression'
+ . generate_ascii_string(1, 9)
+ . generate_ascii_string(11, 12)
+ . generate_ascii_string(14, 33)
+ . (
+ $PostgreSQL::Test::Utils::windows_os
+ ? ''
+ : '"x"') # IPC::Run mishandles '"' on Windows
+ . generate_ascii_string(35, 43) # skip ','
+ . generate_ascii_string(45, 54);
+my $dbname2 = 'regression' . generate_ascii_string(55, 65) # skip 'B'-'W'
+ . generate_ascii_string(88, 99) # skip 'd'-'w'
+ . generate_ascii_string(120, 149);
+my $dbname3 = 'regression' . generate_ascii_string(150, 202);
+my $dbname4 = 'regression' . generate_ascii_string(203, 255);
+
+(my $username1 = $dbname1) =~ s/^regression/regress_/;
+(my $username2 = $dbname2) =~ s/^regression/regress_/;
+(my $username3 = $dbname3) =~ s/^regression/regress_/;
+(my $username4 = $dbname4) =~ s/^regression/regress_/;
+
+my $src_bootstrap_super = 'regress_postgres';
+my $dst_bootstrap_super = 'boot';
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init(extra =>
+ [ '-U', $src_bootstrap_super, '--locale=C', '--encoding=LATIN1' ]);
+
+# prep pg_hba.conf and pg_ident.conf
+$node->run_log(
+ [
+ $ENV{PG_REGRESS}, '--config-auth',
+ $node->data_dir, '--user',
+ $src_bootstrap_super, '--create-role',
+ "$username1,$username2,$username3,$username4"
+ ]);
+$node->start;
+
+my $backupdir = $node->backup_dir;
+my $discard = "$backupdir/discard.sql";
+my $plain = "$backupdir/plain.sql";
+my $dirfmt = "$backupdir/dirfmt";
+
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname1 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username1 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname2 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username2 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname3 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username3 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname4 ]);
+$node->run_log(
+ [ 'createuser', '-U', $src_bootstrap_super, '-s', $username4 ]);
+
+
+# For these tests, pg_dumpall -r is used because it produces a short
+# dump.
+$node->command_ok(
+ [
+ 'pg_dumpall', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname1),
+ '-U', $username4
+ ],
+ 'pg_dumpall with long ASCII name 1');
+$node->command_ok(
+ [
+ 'pg_dumpall', '--no-sync', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname2),
+ '-U', $username3
+ ],
+ 'pg_dumpall with long ASCII name 2');
+$node->command_ok(
+ [
+ 'pg_dumpall', '--no-sync', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname3),
+ '-U', $username2
+ ],
+ 'pg_dumpall with long ASCII name 3');
+$node->command_ok(
+ [
+ 'pg_dumpall', '--no-sync', '-r', '-f', $discard, '--dbname',
+ $node->connstr($dbname4),
+ '-U', $username1
+ ],
+ 'pg_dumpall with long ASCII name 4');
+$node->command_ok(
+ [
+ 'pg_dumpall', '-U',
+ $src_bootstrap_super, '--no-sync',
+ '-r', '-l',
+ 'dbname=template1'
+ ],
+ 'pg_dumpall -l accepts connection string');
+
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, "foo\n\rbar" ]);
+
+# not sufficient to use -r here
+$node->command_fails(
+ [ 'pg_dumpall', '-U', $src_bootstrap_super, '--no-sync', '-f', $discard ],
+ 'pg_dumpall with \n\r in database name');
+$node->run_log([ 'dropdb', '-U', $src_bootstrap_super, "foo\n\rbar" ]);
+
+
+# make a table, so the parallel worker has something to dump
+$node->safe_psql(
+ $dbname1,
+ 'CREATE TABLE t0()',
+ extra_params => [ '-U', $src_bootstrap_super ]);
+
+# XXX no printed message when this fails, just SIGPIPE termination
+$node->command_ok(
+ [
+ 'pg_dump', '-Fd', '--no-sync', '-j2', '-f', $dirfmt, '-U', $username1,
+ $node->connstr($dbname1)
+ ],
+ 'parallel dump');
+
+# recreate $dbname1 for restore test
+$node->run_log([ 'dropdb', '-U', $src_bootstrap_super, $dbname1 ]);
+$node->run_log([ 'createdb', '-U', $src_bootstrap_super, $dbname1 ]);
+
+$node->command_ok(
+ [
+ 'pg_restore', '-v', '-d', 'template1',
+ '-j2', '-U', $username1, $dirfmt
+ ],
+ 'parallel restore');
+
+$node->run_log([ 'dropdb', '-U', $src_bootstrap_super, $dbname1 ]);
+
+$node->command_ok(
+ [
+ 'pg_restore', '-C', '-v', '-d',
+ 'template1', '-j2', '-U', $username1,
+ $dirfmt
+ ],
+ 'parallel restore with create');
+
+
+$node->command_ok(
+ [ 'pg_dumpall', '--no-sync', '-f', $plain, '-U', $username1 ],
+ 'take full dump');
+system_log('cat', $plain);
+my ($stderr, $result);
+my $restore_super = qq{regress_a'b\\c=d\\ne"f};
+$restore_super =~ s/"//g
+ if
+ $PostgreSQL::Test::Utils::windows_os; # IPC::Run mishandles '"' on Windows
+
+
+# Restore full dump through psql using environment variables for
+# dbname/user connection parameters
+
+my $envar_node = PostgreSQL::Test::Cluster->new('destination_envar');
+$envar_node->init(
+ extra =>
+ [ '-U', $dst_bootstrap_super, '--locale=C', '--encoding=LATIN1' ],
+ auth_extra =>
+ [ '--user', $dst_bootstrap_super, '--create-role', $restore_super ]);
+$envar_node->start;
+
+# make superuser for restore
+$envar_node->run_log(
+ [ 'createuser', '-U', $dst_bootstrap_super, '-s', $restore_super ]);
+
+{
+ local $ENV{PGPORT} = $envar_node->port;
+ local $ENV{PGUSER} = $restore_super;
+ $result = run_log([ 'psql', '-X', '-f', $plain ], '2>', \$stderr);
+}
+ok($result,
+ 'restore full dump using environment variables for connection parameters'
+);
+is($stderr, '', 'no dump errors');
+
+
+# Restore full dump through psql using command-line options for
+# dbname/user connection parameters. "\connect dbname=" forgets
+# user/port from command line.
+
+my $cmdline_node = PostgreSQL::Test::Cluster->new('destination_cmdline');
+$cmdline_node->init(
+ extra =>
+ [ '-U', $dst_bootstrap_super, '--locale=C', '--encoding=LATIN1' ],
+ auth_extra =>
+ [ '--user', $dst_bootstrap_super, '--create-role', $restore_super ]);
+$cmdline_node->start;
+$cmdline_node->run_log(
+ [ 'createuser', '-U', $dst_bootstrap_super, '-s', $restore_super ]);
+{
+ $result = run_log(
+ [
+ 'psql', '-p', $cmdline_node->port, '-U',
+ $restore_super, '-X', '-f', $plain
+ ],
+ '2>',
+ \$stderr);
+}
+ok($result,
+ 'restore full dump with command-line options for connection parameters');
+is($stderr, '', 'no dump errors');
+
+done_testing();
diff --git a/src/bin/pg_resetwal/.gitignore b/src/bin/pg_resetwal/.gitignore
new file mode 100644
index 0000000..56bade5
--- /dev/null
+++ b/src/bin/pg_resetwal/.gitignore
@@ -0,0 +1,2 @@
+/pg_resetwal
+/tmp_check/
diff --git a/src/bin/pg_resetwal/Makefile b/src/bin/pg_resetwal/Makefile
new file mode 100644
index 0000000..a363b94
--- /dev/null
+++ b/src/bin/pg_resetwal/Makefile
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_resetwal
+#
+# Copyright (c) 1998-2023, PostgreSQL Global Development Group
+#
+# src/bin/pg_resetwal/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_resetwal - reset PostgreSQL WAL log"
+PGAPPICON=win32
+
+subdir = src/bin/pg_resetwal
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_resetwal.o
+
+all: pg_resetwal
+
+pg_resetwal: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_resetwal$(X) '$(DESTDIR)$(bindir)/pg_resetwal$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_resetwal$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_resetwal$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build
new file mode 100644
index 0000000..3f08a81
--- /dev/null
+++ b/src/bin/pg_resetwal/meson.build
@@ -0,0 +1,32 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_resetwal_sources = files(
+ 'pg_resetwal.c',
+)
+
+if host_system == 'windows'
+ pg_resetwal_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_resetwal',
+ '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log'])
+endif
+
+pg_resetwal = executable('pg_resetwal',
+ pg_resetwal_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_resetwal
+
+tests += {
+ 'name': 'pg_resetwal',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_corrupted.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_resetwal/nls.mk b/src/bin/pg_resetwal/nls.mk
new file mode 100644
index 0000000..7fc84f0
--- /dev/null
+++ b/src/bin/pg_resetwal/nls.mk
@@ -0,0 +1,7 @@
+# src/bin/pg_resetwal/nls.mk
+CATALOG_NAME = pg_resetwal
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_resetwal.c \
+ ../../common/restricted_token.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
new file mode 100644
index 0000000..ca57713
--- /dev/null
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -0,0 +1,1148 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_resetwal.c
+ * A utility to "zero out" the xlog when it's corrupt beyond recovery.
+ * Can also rebuild pg_control if needed.
+ *
+ * The theory of operation is fairly simple:
+ * 1. Read the existing pg_control (which will include the last
+ * checkpoint record). If it is an old format then update to
+ * current format.
+ * 2. If pg_control is corrupt, attempt to intuit reasonable values,
+ * by scanning the old xlog if necessary.
+ * 3. Modify pg_control to reflect a "shutdown" state with a checkpoint
+ * record at the start of xlog.
+ * 4. Flush the existing xlog files and write a new segment with
+ * just a checkpoint record in it. The new segment is positioned
+ * just past the end of the old xlog, so that existing LSNs in
+ * data pages will appear to be "in the past".
+ * This is all pretty straightforward except for the intuition part of
+ * step 2 ...
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_resetwal/pg_resetwal.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*
+ * We have to use postgres.h not postgres_fe.h here, because there's so much
+ * backend-only stuff in the XLOG include files we need. But we need a
+ * frontend-ish environment otherwise. Hence this ugly hack.
+ */
+#define FRONTEND 1
+
+#include "postgres.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "access/heaptoast.h"
+#include "access/multixact.h"
+#include "access/transam.h"
+#include "access/xlog.h"
+#include "access/xlog_internal.h"
+#include "common/controldata_utils.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/restricted_token.h"
+#include "common/string.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+#include "storage/large_object.h"
+
+static ControlFileData ControlFile; /* pg_control values */
+static XLogSegNo newXlogSegNo; /* new XLOG segment # */
+static bool guessed = false; /* T if we had to guess at any values */
+static const char *progname;
+static uint32 set_xid_epoch = (uint32) -1;
+static TransactionId set_oldest_xid = 0;
+static TransactionId set_xid = 0;
+static TransactionId set_oldest_commit_ts_xid = 0;
+static TransactionId set_newest_commit_ts_xid = 0;
+static Oid set_oid = 0;
+static MultiXactId set_mxid = 0;
+static MultiXactOffset set_mxoff = (MultiXactOffset) -1;
+static TimeLineID minXlogTli = 0;
+static XLogSegNo minXlogSegNo = 0;
+static int WalSegSz;
+static int set_wal_segsize;
+
+static void CheckDataVersion(void);
+static bool read_controlfile(void);
+static void GuessControlValues(void);
+static void PrintControlValues(bool guessed);
+static void PrintNewControlValues(void);
+static void RewriteControlFile(void);
+static void FindEndOfXLOG(void);
+static void KillExistingXLOG(void);
+static void KillExistingArchiveStatus(void);
+static void WriteEmptyXLOG(void);
+static void usage(void);
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"commit-timestamp-ids", required_argument, NULL, 'c'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"epoch", required_argument, NULL, 'e'},
+ {"force", no_argument, NULL, 'f'},
+ {"next-wal-file", required_argument, NULL, 'l'},
+ {"multixact-ids", required_argument, NULL, 'm'},
+ {"dry-run", no_argument, NULL, 'n'},
+ {"next-oid", required_argument, NULL, 'o'},
+ {"multixact-offset", required_argument, NULL, 'O'},
+ {"oldest-transaction-id", required_argument, NULL, 'u'},
+ {"next-transaction-id", required_argument, NULL, 'x'},
+ {"wal-segsize", required_argument, NULL, 1},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ bool force = false;
+ bool noupdate = false;
+ MultiXactId set_oldestmxid = 0;
+ char *endptr;
+ char *endptr2;
+ char *DataDir = NULL;
+ char *log_fname = NULL;
+ int fd;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetwal"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_resetwal (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+
+ while ((c = getopt_long(argc, argv, "c:D:e:fl:m:no:O:u:x:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ DataDir = optarg;
+ break;
+
+ case 'f':
+ force = true;
+ break;
+
+ case 'n':
+ noupdate = true;
+ break;
+
+ case 'e':
+ errno = 0;
+ set_xid_epoch = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ /*------
+ translator: the second %s is a command line argument (-e, etc) */
+ pg_log_error("invalid argument for option %s", "-e");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_xid_epoch == -1)
+ pg_fatal("transaction ID epoch (-e) must not be -1");
+ break;
+
+ case 'u':
+ errno = 0;
+ set_oldest_xid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-u");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (!TransactionIdIsNormal(set_oldest_xid))
+ pg_fatal("oldest transaction ID (-u) must be greater than or equal to %u", FirstNormalTransactionId);
+ break;
+
+ case 'x':
+ errno = 0;
+ set_xid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-x");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (!TransactionIdIsNormal(set_xid))
+ pg_fatal("transaction ID (-x) must be greater than or equal to %u", FirstNormalTransactionId);
+ break;
+
+ case 'c':
+ errno = 0;
+ set_oldest_commit_ts_xid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != ',' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-c");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ set_newest_commit_ts_xid = strtoul(endptr + 1, &endptr2, 0);
+ if (endptr2 == endptr + 1 || *endptr2 != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-c");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (set_oldest_commit_ts_xid < 2 &&
+ set_oldest_commit_ts_xid != 0)
+ pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2");
+
+ if (set_newest_commit_ts_xid < 2 &&
+ set_newest_commit_ts_xid != 0)
+ pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2");
+ break;
+
+ case 'o':
+ errno = 0;
+ set_oid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-o");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_oid == 0)
+ pg_fatal("OID (-o) must not be 0");
+ break;
+
+ case 'm':
+ errno = 0;
+ set_mxid = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != ',' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-m");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ set_oldestmxid = strtoul(endptr + 1, &endptr2, 0);
+ if (endptr2 == endptr + 1 || *endptr2 != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-m");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_mxid == 0)
+ pg_fatal("multitransaction ID (-m) must not be 0");
+
+ /*
+ * XXX It'd be nice to have more sanity checks here, e.g. so
+ * that oldest is not wrapped around w.r.t. nextMulti.
+ */
+ if (set_oldestmxid == 0)
+ pg_fatal("oldest multitransaction ID (-m) must not be 0");
+ break;
+
+ case 'O':
+ errno = 0;
+ set_mxoff = strtoul(optarg, &endptr, 0);
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ {
+ pg_log_error("invalid argument for option %s", "-O");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ if (set_mxoff == -1)
+ pg_fatal("multitransaction offset (-O) must not be -1");
+ break;
+
+ case 'l':
+ if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN)
+ {
+ pg_log_error("invalid argument for option %s", "-l");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * XLogFromFileName requires wal segment size which is not yet
+ * set. Hence wal details are set later on.
+ */
+ log_fname = pg_strdup(optarg);
+ break;
+
+ case 1:
+ errno = 0;
+ set_wal_segsize = strtol(optarg, &endptr, 10) * 1024 * 1024;
+ if (endptr == optarg || *endptr != '\0' || errno != 0)
+ pg_fatal("argument of --wal-segsize must be a number");
+ if (!IsValidWalSegSize(set_wal_segsize))
+ pg_fatal("argument of --wal-segsize must be a power of two between 1 and 1024");
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL && optind < argc)
+ DataDir = argv[optind++];
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Don't allow pg_resetwal to be run as root, to avoid overwriting the
+ * ownership of files in the data directory. We need only check for root
+ * -- any other user won't have sufficient permissions to modify files in
+ * the data directory.
+ */
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ pg_log_error("cannot be executed by \"root\"");
+ pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
+ progname);
+ exit(1);
+ }
+#endif
+
+ get_restricted_token();
+
+ /* Set mask based on PGDATA permissions */
+ if (!GetDataDirectoryCreatePerm(DataDir))
+ pg_fatal("could not read permissions of directory \"%s\": %m",
+ DataDir);
+
+ umask(pg_mode_mask);
+
+ if (chdir(DataDir) < 0)
+ pg_fatal("could not change directory to \"%s\": %m",
+ DataDir);
+
+ /* Check that data directory matches our server version */
+ CheckDataVersion();
+
+ /*
+ * Check for a postmaster lock file --- if there is one, refuse to
+ * proceed, on grounds we might be interfering with a live installation.
+ */
+ if ((fd = open("postmaster.pid", O_RDONLY, 0)) < 0)
+ {
+ if (errno != ENOENT)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ "postmaster.pid");
+ }
+ else
+ {
+ pg_log_error("lock file \"%s\" exists", "postmaster.pid");
+ pg_log_error_hint("Is a server running? If not, delete the lock file and try again.");
+ exit(1);
+ }
+
+ /*
+ * Attempt to read the existing pg_control file
+ */
+ if (!read_controlfile())
+ GuessControlValues();
+
+ /*
+ * If no new WAL segment size was specified, use the control file value.
+ */
+ if (set_wal_segsize != 0)
+ WalSegSz = set_wal_segsize;
+ else
+ WalSegSz = ControlFile.xlog_seg_size;
+
+ if (log_fname != NULL)
+ XLogFromFileName(log_fname, &minXlogTli, &minXlogSegNo, WalSegSz);
+
+ /*
+ * Also look at existing segment files to set up newXlogSegNo
+ */
+ FindEndOfXLOG();
+
+ /*
+ * If we're not going to proceed with the reset, print the current control
+ * file parameters.
+ */
+ if ((guessed && !force) || noupdate)
+ PrintControlValues(guessed);
+
+ /*
+ * Adjust fields if required by switches. (Do this now so that printout,
+ * if any, includes these values.)
+ */
+ if (set_xid_epoch != -1)
+ ControlFile.checkPointCopy.nextXid =
+ FullTransactionIdFromEpochAndXid(set_xid_epoch,
+ XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+
+ if (set_oldest_xid != 0)
+ {
+ ControlFile.checkPointCopy.oldestXid = set_oldest_xid;
+ ControlFile.checkPointCopy.oldestXidDB = InvalidOid;
+ }
+
+ if (set_xid != 0)
+ ControlFile.checkPointCopy.nextXid =
+ FullTransactionIdFromEpochAndXid(EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid),
+ set_xid);
+
+ if (set_oldest_commit_ts_xid != 0)
+ ControlFile.checkPointCopy.oldestCommitTsXid = set_oldest_commit_ts_xid;
+ if (set_newest_commit_ts_xid != 0)
+ ControlFile.checkPointCopy.newestCommitTsXid = set_newest_commit_ts_xid;
+
+ if (set_oid != 0)
+ ControlFile.checkPointCopy.nextOid = set_oid;
+
+ if (set_mxid != 0)
+ {
+ ControlFile.checkPointCopy.nextMulti = set_mxid;
+
+ ControlFile.checkPointCopy.oldestMulti = set_oldestmxid;
+ if (ControlFile.checkPointCopy.oldestMulti < FirstMultiXactId)
+ ControlFile.checkPointCopy.oldestMulti += FirstMultiXactId;
+ ControlFile.checkPointCopy.oldestMultiDB = InvalidOid;
+ }
+
+ if (set_mxoff != -1)
+ ControlFile.checkPointCopy.nextMultiOffset = set_mxoff;
+
+ if (minXlogTli > ControlFile.checkPointCopy.ThisTimeLineID)
+ {
+ ControlFile.checkPointCopy.ThisTimeLineID = minXlogTli;
+ ControlFile.checkPointCopy.PrevTimeLineID = minXlogTli;
+ }
+
+ if (set_wal_segsize != 0)
+ ControlFile.xlog_seg_size = WalSegSz;
+
+ if (minXlogSegNo > newXlogSegNo)
+ newXlogSegNo = minXlogSegNo;
+
+ /*
+ * If we had to guess anything, and -f was not given, just print the
+ * guessed values and exit. Also print if -n is given.
+ */
+ if ((guessed && !force) || noupdate)
+ {
+ PrintNewControlValues();
+ if (!noupdate)
+ {
+ printf(_("\nIf these values seem acceptable, use -f to force reset.\n"));
+ exit(1);
+ }
+ else
+ exit(0);
+ }
+
+ /*
+ * Don't reset from a dirty pg_control without -f, either.
+ */
+ if (ControlFile.state != DB_SHUTDOWNED && !force)
+ {
+ printf(_("The database server was not shut down cleanly.\n"
+ "Resetting the write-ahead log might cause data to be lost.\n"
+ "If you want to proceed anyway, use -f to force reset.\n"));
+ exit(1);
+ }
+
+ /*
+ * Else, do the dirty deed.
+ */
+ RewriteControlFile();
+ KillExistingXLOG();
+ KillExistingArchiveStatus();
+ WriteEmptyXLOG();
+
+ printf(_("Write-ahead log reset\n"));
+ return 0;
+}
+
+
+/*
+ * Look at the version string stored in PG_VERSION and decide if this utility
+ * can be run safely or not.
+ *
+ * We don't want to inject pg_control and WAL files that are for a different
+ * major version; that can't do anything good. Note that we don't treat
+ * mismatching version info in pg_control as a reason to bail out, because
+ * recovering from a corrupted pg_control is one of the main reasons for this
+ * program to exist at all. However, PG_VERSION is unlikely to get corrupted,
+ * and if it were it would be easy to fix by hand. So let's make this check
+ * to prevent simple user errors.
+ */
+static void
+CheckDataVersion(void)
+{
+ const char *ver_file = "PG_VERSION";
+ FILE *ver_fd;
+ char rawline[64];
+
+ if ((ver_fd = fopen(ver_file, "r")) == NULL)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ ver_file);
+
+ /* version number has to be the first line read */
+ if (!fgets(rawline, sizeof(rawline), ver_fd))
+ {
+ if (!ferror(ver_fd))
+ pg_fatal("unexpected empty file \"%s\"", ver_file);
+ else
+ pg_fatal("could not read file \"%s\": %m", ver_file);
+ }
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(rawline);
+
+ if (strcmp(rawline, PG_MAJORVERSION) != 0)
+ {
+ pg_log_error("data directory is of wrong version");
+ pg_log_error_detail("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".",
+ ver_file, rawline, PG_MAJORVERSION);
+ exit(1);
+ }
+
+ fclose(ver_fd);
+}
+
+
+/*
+ * Try to read the existing pg_control file.
+ *
+ * This routine is also responsible for updating old pg_control versions
+ * to the current format. (Currently we don't do anything of the sort.)
+ */
+static bool
+read_controlfile(void)
+{
+ int fd;
+ int len;
+ char *buffer;
+ pg_crc32c crc;
+
+ if ((fd = open(XLOG_CONTROL_FILE, O_RDONLY | PG_BINARY, 0)) < 0)
+ {
+ /*
+ * If pg_control is not there at all, or we can't read it, the odds
+ * are we've been handed a bad DataDir path, so give up. User can do
+ * "touch pg_control" to force us to proceed.
+ */
+ pg_log_error("could not open file \"%s\" for reading: %m",
+ XLOG_CONTROL_FILE);
+ if (errno == ENOENT)
+ pg_log_error_hint("If you are sure the data directory path is correct, execute\n"
+ " touch %s\n"
+ "and try again.",
+ XLOG_CONTROL_FILE);
+ exit(1);
+ }
+
+ /* Use malloc to ensure we have a maxaligned buffer */
+ buffer = (char *) pg_malloc(PG_CONTROL_FILE_SIZE);
+
+ len = read(fd, buffer, PG_CONTROL_FILE_SIZE);
+ if (len < 0)
+ pg_fatal("could not read file \"%s\": %m", XLOG_CONTROL_FILE);
+ close(fd);
+
+ if (len >= sizeof(ControlFileData) &&
+ ((ControlFileData *) buffer)->pg_control_version == PG_CONTROL_VERSION)
+ {
+ /* Check the CRC. */
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc,
+ buffer,
+ offsetof(ControlFileData, crc));
+ FIN_CRC32C(crc);
+
+ if (!EQ_CRC32C(crc, ((ControlFileData *) buffer)->crc))
+ {
+ /* We will use the data but treat it as guessed. */
+ pg_log_warning("pg_control exists but has invalid CRC; proceed with caution");
+ guessed = true;
+ }
+
+ memcpy(&ControlFile, buffer, sizeof(ControlFile));
+
+ /* return false if WAL segment size is not valid */
+ if (!IsValidWalSegSize(ControlFile.xlog_seg_size))
+ {
+ pg_log_warning(ngettext("pg_control specifies invalid WAL segment size (%d byte); proceed with caution",
+ "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution",
+ ControlFile.xlog_seg_size),
+ ControlFile.xlog_seg_size);
+ return false;
+ }
+
+ return true;
+ }
+
+ /* Looks like it's a mess. */
+ pg_log_warning("pg_control exists but is broken or wrong version; ignoring it");
+ return false;
+}
+
+
+/*
+ * Guess at pg_control values when we can't read the old ones.
+ */
+static void
+GuessControlValues(void)
+{
+ uint64 sysidentifier;
+ struct timeval tv;
+
+ /*
+ * Set up a completely default set of pg_control values.
+ */
+ guessed = true;
+ memset(&ControlFile, 0, sizeof(ControlFile));
+
+ ControlFile.pg_control_version = PG_CONTROL_VERSION;
+ ControlFile.catalog_version_no = CATALOG_VERSION_NO;
+
+ /*
+ * Create a new unique installation identifier, since we can no longer use
+ * any old XLOG records. See notes in xlog.c about the algorithm.
+ */
+ gettimeofday(&tv, NULL);
+ sysidentifier = ((uint64) tv.tv_sec) << 32;
+ sysidentifier |= ((uint64) tv.tv_usec) << 12;
+ sysidentifier |= getpid() & 0xFFF;
+
+ ControlFile.system_identifier = sysidentifier;
+
+ ControlFile.checkPointCopy.redo = SizeOfXLogLongPHD;
+ ControlFile.checkPointCopy.ThisTimeLineID = 1;
+ ControlFile.checkPointCopy.PrevTimeLineID = 1;
+ ControlFile.checkPointCopy.fullPageWrites = false;
+ ControlFile.checkPointCopy.nextXid =
+ FullTransactionIdFromEpochAndXid(0, FirstNormalTransactionId);
+ ControlFile.checkPointCopy.nextOid = FirstGenbkiObjectId;
+ ControlFile.checkPointCopy.nextMulti = FirstMultiXactId;
+ ControlFile.checkPointCopy.nextMultiOffset = 0;
+ ControlFile.checkPointCopy.oldestXid = FirstNormalTransactionId;
+ ControlFile.checkPointCopy.oldestXidDB = InvalidOid;
+ ControlFile.checkPointCopy.oldestMulti = FirstMultiXactId;
+ ControlFile.checkPointCopy.oldestMultiDB = InvalidOid;
+ ControlFile.checkPointCopy.time = (pg_time_t) time(NULL);
+ ControlFile.checkPointCopy.oldestActiveXid = InvalidTransactionId;
+
+ ControlFile.state = DB_SHUTDOWNED;
+ ControlFile.time = (pg_time_t) time(NULL);
+ ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
+ ControlFile.unloggedLSN = FirstNormalUnloggedLSN;
+
+ /* minRecoveryPoint, backupStartPoint and backupEndPoint can be left zero */
+
+ ControlFile.wal_level = WAL_LEVEL_MINIMAL;
+ ControlFile.wal_log_hints = false;
+ ControlFile.track_commit_timestamp = false;
+ ControlFile.MaxConnections = 100;
+ ControlFile.max_wal_senders = 10;
+ ControlFile.max_worker_processes = 8;
+ ControlFile.max_prepared_xacts = 0;
+ ControlFile.max_locks_per_xact = 64;
+
+ ControlFile.maxAlign = MAXIMUM_ALIGNOF;
+ ControlFile.floatFormat = FLOATFORMAT_VALUE;
+ ControlFile.blcksz = BLCKSZ;
+ ControlFile.relseg_size = RELSEG_SIZE;
+ ControlFile.xlog_blcksz = XLOG_BLCKSZ;
+ ControlFile.xlog_seg_size = DEFAULT_XLOG_SEG_SIZE;
+ ControlFile.nameDataLen = NAMEDATALEN;
+ ControlFile.indexMaxKeys = INDEX_MAX_KEYS;
+ ControlFile.toast_max_chunk_size = TOAST_MAX_CHUNK_SIZE;
+ ControlFile.loblksize = LOBLKSIZE;
+ ControlFile.float8ByVal = FLOAT8PASSBYVAL;
+
+ /*
+ * XXX eventually, should try to grovel through old XLOG to develop more
+ * accurate values for TimeLineID, nextXID, etc.
+ */
+}
+
+
+/*
+ * Print the guessed pg_control values when we had to guess.
+ *
+ * NB: this display should be just those fields that will not be
+ * reset by RewriteControlFile().
+ */
+static void
+PrintControlValues(bool guessed)
+{
+ if (guessed)
+ printf(_("Guessed pg_control values:\n\n"));
+ else
+ printf(_("Current pg_control values:\n\n"));
+
+ printf(_("pg_control version number: %u\n"),
+ ControlFile.pg_control_version);
+ printf(_("Catalog version number: %u\n"),
+ ControlFile.catalog_version_no);
+ printf(_("Database system identifier: %llu\n"),
+ (unsigned long long) ControlFile.system_identifier);
+ printf(_("Latest checkpoint's TimeLineID: %u\n"),
+ ControlFile.checkPointCopy.ThisTimeLineID);
+ printf(_("Latest checkpoint's full_page_writes: %s\n"),
+ ControlFile.checkPointCopy.fullPageWrites ? _("on") : _("off"));
+ printf(_("Latest checkpoint's NextXID: %u:%u\n"),
+ EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid),
+ XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ printf(_("Latest checkpoint's NextOID: %u\n"),
+ ControlFile.checkPointCopy.nextOid);
+ printf(_("Latest checkpoint's NextMultiXactId: %u\n"),
+ ControlFile.checkPointCopy.nextMulti);
+ printf(_("Latest checkpoint's NextMultiOffset: %u\n"),
+ ControlFile.checkPointCopy.nextMultiOffset);
+ printf(_("Latest checkpoint's oldestXID: %u\n"),
+ ControlFile.checkPointCopy.oldestXid);
+ printf(_("Latest checkpoint's oldestXID's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestXidDB);
+ printf(_("Latest checkpoint's oldestActiveXID: %u\n"),
+ ControlFile.checkPointCopy.oldestActiveXid);
+ printf(_("Latest checkpoint's oldestMultiXid: %u\n"),
+ ControlFile.checkPointCopy.oldestMulti);
+ printf(_("Latest checkpoint's oldestMulti's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestMultiDB);
+ printf(_("Latest checkpoint's oldestCommitTsXid:%u\n"),
+ ControlFile.checkPointCopy.oldestCommitTsXid);
+ printf(_("Latest checkpoint's newestCommitTsXid:%u\n"),
+ ControlFile.checkPointCopy.newestCommitTsXid);
+ printf(_("Maximum data alignment: %u\n"),
+ ControlFile.maxAlign);
+ /* we don't print floatFormat since can't say much useful about it */
+ printf(_("Database block size: %u\n"),
+ ControlFile.blcksz);
+ printf(_("Blocks per segment of large relation: %u\n"),
+ ControlFile.relseg_size);
+ printf(_("WAL block size: %u\n"),
+ ControlFile.xlog_blcksz);
+ printf(_("Bytes per WAL segment: %u\n"),
+ ControlFile.xlog_seg_size);
+ printf(_("Maximum length of identifiers: %u\n"),
+ ControlFile.nameDataLen);
+ printf(_("Maximum columns in an index: %u\n"),
+ ControlFile.indexMaxKeys);
+ printf(_("Maximum size of a TOAST chunk: %u\n"),
+ ControlFile.toast_max_chunk_size);
+ printf(_("Size of a large-object chunk: %u\n"),
+ ControlFile.loblksize);
+ /* This is no longer configurable, but users may still expect to see it: */
+ printf(_("Date/time type storage: %s\n"),
+ _("64-bit integers"));
+ printf(_("Float8 argument passing: %s\n"),
+ (ControlFile.float8ByVal ? _("by value") : _("by reference")));
+ printf(_("Data page checksum version: %u\n"),
+ ControlFile.data_checksum_version);
+}
+
+
+/*
+ * Print the values to be changed.
+ */
+static void
+PrintNewControlValues(void)
+{
+ char fname[MAXFNAMELEN];
+
+ /* This will be always printed in order to keep format same. */
+ printf(_("\n\nValues to be changed:\n\n"));
+
+ XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID,
+ newXlogSegNo, WalSegSz);
+ printf(_("First log segment after reset: %s\n"), fname);
+
+ if (set_mxid != 0)
+ {
+ printf(_("NextMultiXactId: %u\n"),
+ ControlFile.checkPointCopy.nextMulti);
+ printf(_("OldestMultiXid: %u\n"),
+ ControlFile.checkPointCopy.oldestMulti);
+ printf(_("OldestMulti's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestMultiDB);
+ }
+
+ if (set_mxoff != -1)
+ {
+ printf(_("NextMultiOffset: %u\n"),
+ ControlFile.checkPointCopy.nextMultiOffset);
+ }
+
+ if (set_oid != 0)
+ {
+ printf(_("NextOID: %u\n"),
+ ControlFile.checkPointCopy.nextOid);
+ }
+
+ if (set_xid != 0)
+ {
+ printf(_("NextXID: %u\n"),
+ XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ printf(_("OldestXID: %u\n"),
+ ControlFile.checkPointCopy.oldestXid);
+ printf(_("OldestXID's DB: %u\n"),
+ ControlFile.checkPointCopy.oldestXidDB);
+ }
+
+ if (set_xid_epoch != -1)
+ {
+ printf(_("NextXID epoch: %u\n"),
+ EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ }
+
+ if (set_oldest_commit_ts_xid != 0)
+ {
+ printf(_("oldestCommitTsXid: %u\n"),
+ ControlFile.checkPointCopy.oldestCommitTsXid);
+ }
+ if (set_newest_commit_ts_xid != 0)
+ {
+ printf(_("newestCommitTsXid: %u\n"),
+ ControlFile.checkPointCopy.newestCommitTsXid);
+ }
+
+ if (set_wal_segsize != 0)
+ {
+ printf(_("Bytes per WAL segment: %u\n"),
+ ControlFile.xlog_seg_size);
+ }
+}
+
+
+/*
+ * Write out the new pg_control file.
+ */
+static void
+RewriteControlFile(void)
+{
+ /*
+ * Adjust fields as needed to force an empty XLOG starting at
+ * newXlogSegNo.
+ */
+ XLogSegNoOffsetToRecPtr(newXlogSegNo, SizeOfXLogLongPHD, WalSegSz,
+ ControlFile.checkPointCopy.redo);
+ ControlFile.checkPointCopy.time = (pg_time_t) time(NULL);
+
+ ControlFile.state = DB_SHUTDOWNED;
+ ControlFile.checkPoint = ControlFile.checkPointCopy.redo;
+ ControlFile.minRecoveryPoint = 0;
+ ControlFile.minRecoveryPointTLI = 0;
+ ControlFile.backupStartPoint = 0;
+ ControlFile.backupEndPoint = 0;
+ ControlFile.backupEndRequired = false;
+
+ /*
+ * Force the defaults for max_* settings. The values don't really matter
+ * as long as wal_level='minimal'; the postmaster will reset these fields
+ * anyway at startup.
+ */
+ ControlFile.wal_level = WAL_LEVEL_MINIMAL;
+ ControlFile.wal_log_hints = false;
+ ControlFile.track_commit_timestamp = false;
+ ControlFile.MaxConnections = 100;
+ ControlFile.max_wal_senders = 10;
+ ControlFile.max_worker_processes = 8;
+ ControlFile.max_prepared_xacts = 0;
+ ControlFile.max_locks_per_xact = 64;
+
+ /* The control file gets flushed here. */
+ update_controlfile(".", &ControlFile, true);
+}
+
+
+/*
+ * Scan existing XLOG files and determine the highest existing WAL address
+ *
+ * On entry, ControlFile.checkPointCopy.redo and ControlFile.xlog_seg_size
+ * are assumed valid (note that we allow the old xlog seg size to differ
+ * from what we're using). On exit, newXlogSegNo is set to suitable
+ * value for the beginning of replacement WAL (in our seg size).
+ */
+static void
+FindEndOfXLOG(void)
+{
+ DIR *xldir;
+ struct dirent *xlde;
+ uint64 xlogbytepos;
+
+ /*
+ * Initialize the max() computation using the last checkpoint address from
+ * old pg_control. Note that for the moment we are working with segment
+ * numbering according to the old xlog seg size.
+ */
+ XLByteToSeg(ControlFile.checkPointCopy.redo, newXlogSegNo,
+ ControlFile.xlog_seg_size);
+
+ /*
+ * Scan the pg_wal directory to find existing WAL segment files. We assume
+ * any present have been used; in most scenarios this should be
+ * conservative, because of xlog.c's attempts to pre-create files.
+ */
+ xldir = opendir(XLOGDIR);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", XLOGDIR);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ if (IsXLogFileName(xlde->d_name) ||
+ IsPartialXLogFileName(xlde->d_name))
+ {
+ TimeLineID tli;
+ XLogSegNo segno;
+
+ /* Use the segment size from the control file */
+ XLogFromFileName(xlde->d_name, &tli, &segno,
+ ControlFile.xlog_seg_size);
+
+ /*
+ * Note: we take the max of all files found, regardless of their
+ * timelines. Another possibility would be to ignore files of
+ * timelines other than the target TLI, but this seems safer.
+ * Better too large a result than too small...
+ */
+ if (segno > newXlogSegNo)
+ newXlogSegNo = segno;
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", XLOGDIR);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m", XLOGDIR);
+
+ /*
+ * Finally, convert to new xlog seg size, and advance by one to ensure we
+ * are in virgin territory.
+ */
+ xlogbytepos = newXlogSegNo * ControlFile.xlog_seg_size;
+ newXlogSegNo = (xlogbytepos + ControlFile.xlog_seg_size - 1) / WalSegSz;
+ newXlogSegNo++;
+}
+
+
+/*
+ * Remove existing XLOG files
+ */
+static void
+KillExistingXLOG(void)
+{
+ DIR *xldir;
+ struct dirent *xlde;
+ char path[MAXPGPATH + sizeof(XLOGDIR)];
+
+ xldir = opendir(XLOGDIR);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", XLOGDIR);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ if (IsXLogFileName(xlde->d_name) ||
+ IsPartialXLogFileName(xlde->d_name))
+ {
+ snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);
+ if (unlink(path) < 0)
+ pg_fatal("could not delete file \"%s\": %m", path);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", XLOGDIR);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m", XLOGDIR);
+}
+
+
+/*
+ * Remove existing archive status files
+ */
+static void
+KillExistingArchiveStatus(void)
+{
+#define ARCHSTATDIR XLOGDIR "/archive_status"
+
+ DIR *xldir;
+ struct dirent *xlde;
+ char path[MAXPGPATH + sizeof(ARCHSTATDIR)];
+
+ xldir = opendir(ARCHSTATDIR);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m", ARCHSTATDIR);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN &&
+ (strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 ||
+ strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0 ||
+ strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.ready") == 0 ||
+ strcmp(xlde->d_name + XLOG_FNAME_LEN, ".partial.done") == 0))
+ {
+ snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);
+ if (unlink(path) < 0)
+ pg_fatal("could not delete file \"%s\": %m", path);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m", ARCHSTATDIR);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m", ARCHSTATDIR);
+}
+
+
+/*
+ * Write an empty XLOG file, containing only the checkpoint record
+ * already set up in ControlFile.
+ */
+static void
+WriteEmptyXLOG(void)
+{
+ PGAlignedXLogBlock buffer;
+ XLogPageHeader page;
+ XLogLongPageHeader longpage;
+ XLogRecord *record;
+ pg_crc32c crc;
+ char path[MAXPGPATH];
+ int fd;
+ int nbytes;
+ char *recptr;
+
+ memset(buffer.data, 0, XLOG_BLCKSZ);
+
+ /* Set up the XLOG page header */
+ page = (XLogPageHeader) buffer.data;
+ page->xlp_magic = XLOG_PAGE_MAGIC;
+ page->xlp_info = XLP_LONG_HEADER;
+ page->xlp_tli = ControlFile.checkPointCopy.ThisTimeLineID;
+ page->xlp_pageaddr = ControlFile.checkPointCopy.redo - SizeOfXLogLongPHD;
+ longpage = (XLogLongPageHeader) page;
+ longpage->xlp_sysid = ControlFile.system_identifier;
+ longpage->xlp_seg_size = WalSegSz;
+ longpage->xlp_xlog_blcksz = XLOG_BLCKSZ;
+
+ /* Insert the initial checkpoint record */
+ recptr = (char *) page + SizeOfXLogLongPHD;
+ record = (XLogRecord *) recptr;
+ record->xl_prev = 0;
+ record->xl_xid = InvalidTransactionId;
+ record->xl_tot_len = SizeOfXLogRecord + SizeOfXLogRecordDataHeaderShort + sizeof(CheckPoint);
+ record->xl_info = XLOG_CHECKPOINT_SHUTDOWN;
+ record->xl_rmid = RM_XLOG_ID;
+
+ recptr += SizeOfXLogRecord;
+ *(recptr++) = (char) XLR_BLOCK_ID_DATA_SHORT;
+ *(recptr++) = sizeof(CheckPoint);
+ memcpy(recptr, &ControlFile.checkPointCopy,
+ sizeof(CheckPoint));
+
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc, ((char *) record) + SizeOfXLogRecord, record->xl_tot_len - SizeOfXLogRecord);
+ COMP_CRC32C(crc, (char *) record, offsetof(XLogRecord, xl_crc));
+ FIN_CRC32C(crc);
+ record->xl_crc = crc;
+
+ /* Write the first page */
+ XLogFilePath(path, ControlFile.checkPointCopy.ThisTimeLineID,
+ newXlogSegNo, WalSegSz);
+
+ unlink(path);
+
+ fd = open(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\": %m", path);
+
+ errno = 0;
+ if (write(fd, buffer.data, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write file \"%s\": %m", path);
+ }
+
+ /* Fill the rest of the file with zeroes */
+ memset(buffer.data, 0, XLOG_BLCKSZ);
+ for (nbytes = XLOG_BLCKSZ; nbytes < WalSegSz; nbytes += XLOG_BLCKSZ)
+ {
+ errno = 0;
+ if (write(fd, buffer.data, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ {
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write file \"%s\": %m", path);
+ }
+ }
+
+ if (fsync(fd) != 0)
+ pg_fatal("fsync error: %m");
+
+ close(fd);
+}
+
+
+static void
+usage(void)
+{
+ printf(_("%s resets the PostgreSQL write-ahead log.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]... DATADIR\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" -c, --commit-timestamp-ids=XID,XID\n"
+ " set oldest and newest transactions bearing\n"
+ " commit timestamp (zero means no change)\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -e, --epoch=XIDEPOCH set next transaction ID epoch\n"));
+ printf(_(" -f, --force force update to be done\n"));
+ printf(_(" -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"));
+ printf(_(" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"));
+ printf(_(" -n, --dry-run no update, just show what would be done\n"));
+ printf(_(" -o, --next-oid=OID set next OID\n"));
+ printf(_(" -O, --multixact-offset=OFFSET set next multitransaction offset\n"));
+ printf(_(" -u, --oldest-transaction-id=XID set oldest transaction ID\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -x, --next-transaction-id=XID set next transaction ID\n"));
+ printf(_(" --wal-segsize=SIZE size of WAL segments, in megabytes\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/pg_resetwal/po/LINGUAS b/src/bin/pg_resetwal/po/LINGUAS
new file mode 100644
index 0000000..6fccaad
--- /dev/null
+++ b/src/bin/pg_resetwal/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_resetwal/po/cs.po b/src/bin/pg_resetwal/po/cs.po
new file mode 100644
index 0000000..0b622d8
--- /dev/null
+++ b/src/bin/pg_resetwal/po/cs.po
@@ -0,0 +1,719 @@
+# Czech message translation file for pg_resetxlog
+# Copyright (C) 2012 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Tomas Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetxlog-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2020-10-31 21:25+0100\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "nelze naÄíst knihovnu \"%s\": kód chyby %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "na této platformě nelze vytvářet vyhrazené tokeny: kód chyby %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "nelze otevřít process token: chybový kód %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "nelze alokovat SIDs: chybový kód %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "nelze vytvořit vyhrazený token: chybový kód %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "nelze spustit proces pro příkaz \"%s\": chybový kód %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "nelze znovu spustit s vyhrazeným tokenem: chybový kód %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "nelze získat návratový kód ze subprocesu: chybový kód %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197
+#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269
+#: pg_resetwal.c:283
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "neplatný argument pro volbu %s"
+
+#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198
+#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270
+#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_resetwal.c:166
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "epocha ID transakce (-e) nesmí být -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "transaction ID (-x) must not be 0"
+msgstr "ID transakce (-x) nesmí být 0"
+
+#: pg_resetwal.c:205 pg_resetwal.c:212
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID transakce (-c) musí být buÄ 0 nebo vÄ›tší než nebo rovno 2"
+
+#: pg_resetwal.c:227
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) nesmí být 0"
+
+#: pg_resetwal.c:250
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID multitransakce (-m) nesmí být 0"
+
+#: pg_resetwal.c:260
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ID nejstarší multitransakce (-m) nesmí být 0"
+
+#: pg_resetwal.c:275
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "offset multitransakce (-O) nesmí být -1"
+
+#: pg_resetwal.c:299
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argument pro --wal-segsize musí být Äíslo"
+
+#: pg_resetwal.c:304
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argument pro --wal-segsize musí být mocnina 2 mezi 1 a 1024"
+
+#: pg_resetwal.c:321
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho parametrů na příkazové řádce (první je \"%s\")"
+
+#: pg_resetwal.c:330
+#, c-format
+msgid "no data directory specified"
+msgstr "není specifikován datový adresář"
+
+#: pg_resetwal.c:344
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "nelze spouštět jako \"root\""
+
+#: pg_resetwal.c:345
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Musíte spustit %s jako PostgreSQL superuživatel."
+
+#: pg_resetwal.c:356
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %m"
+
+#: pg_resetwal.c:365
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "nelze otevřít soubor \"%s\" pro Ätení: %m"
+
+#: pg_resetwal.c:388
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "soubor se zámkem \"%s\" existuje"
+
+#: pg_resetwal.c:389
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Neběží již server? Jestliže ne, smažte soubor se zámkem a zkuste to znova."
+
+#: pg_resetwal.c:492
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Jestliže tyto hodnoty vypadají akceptovatelně, použijte -f pro vynucený reset.\n"
+
+#: pg_resetwal.c:504
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Databázový server nebyl ukonÄen ÄistÄ›.\n"
+"Resetování transakÄního logu může způsobit ztrátu dat.\n"
+"Jestliže i pÅ™esto chcete pokraÄovat, použijte -f pro vynucený reset.\n"
+
+#: pg_resetwal.c:518
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "TransakÄní log resetován\n"
+
+#: pg_resetwal.c:553
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "neoÄekávaný prázdný soubor \"%s\""
+
+#: pg_resetwal.c:555 pg_resetwal.c:611
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "nelze Äíst soubor \"%s\": %m"
+
+#: pg_resetwal.c:564
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "datový adresář pochází z nesprávné verze"
+
+#: pg_resetwal.c:565
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Soubor \"%s\" obsahuje \"%s\", což je nekompatibilní s verzí \"%s\" tohoto programu."
+
+#: pg_resetwal.c:598
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Máte-li jistotu, že je cesta k datovému adresáři správná, proveÄte\n"
+" touch %s\n"
+"a zkuste to znovu."
+
+#: pg_resetwal.c:629
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existuje, ale s neplatným kontrolním souÄtem CRC; postupujte opatrnÄ›"
+
+#: pg_resetwal.c:638
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control obsahuje neplatnou velikost WAL segmentu (%d byte); pokraÄujte obezÅ™etnÄ›"
+msgstr[1] "pg_control obsahuje neplatnou velikost WAL segmentu (%d bytů); pokraÄujte obezÅ™etnÄ›"
+msgstr[2] "pg_control obsahuje neplatnou velikost WAL segmentu (%d bytů); pokraÄujte obezÅ™etnÄ›"
+
+#: pg_resetwal.c:649
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existuje, ale je poškozen nebo neznámé verze; ignoruji to"
+
+#: pg_resetwal.c:744
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Odhadnuté hodnoty pg_controlu:\n"
+"\n"
+
+#: pg_resetwal.c:746
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"SouÄasné pg_control hodnoty:\n"
+"\n"
+
+#: pg_resetwal.c:748
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Číslo verze pg_controlu: %u\n"
+
+#: pg_resetwal.c:750
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Číslo verze katalogu: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identifikátor databázového systému: %llu\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Poslední full_page_writes checkpointu: %s\n"
+
+#: pg_resetwal.c:757
+msgid "off"
+msgstr "vypnuto"
+
+#: pg_resetwal.c:757
+msgid "on"
+msgstr "zapnuto"
+
+#: pg_resetwal.c:758
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID posledního checkpointu: %u:%u\n"
+
+#: pg_resetwal.c:761
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Poslední umístění NextOID checkpointu: %u\n"
+
+#: pg_resetwal.c:763
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:765
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:767
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB k oldestXID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:775
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB k oldestMulti posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:777
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:779
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid posledního checkpointu: %u\n"
+
+#: pg_resetwal.c:781
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximální zarovnání dat: %u\n"
+
+#: pg_resetwal.c:784
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Velikost databázového bloku: %u\n"
+
+#: pg_resetwal.c:786
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloků v segmentu velké relace: %u\n"
+
+#: pg_resetwal.c:788
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Velikost WAL bloku: %u\n"
+
+#: pg_resetwal.c:790 pg_resetwal.c:876
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytů ve WAL segmentu: %u\n"
+
+#: pg_resetwal.c:792
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximální délka identifikátorů: %u\n"
+
+#: pg_resetwal.c:794
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximální poÄet sloupců v indexu: %u\n"
+
+#: pg_resetwal.c:796
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximální velikost úseku TOAST: %u\n"
+
+#: pg_resetwal.c:798
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Velikost large-object chunku: %u\n"
+
+#: pg_resetwal.c:801
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Způsob uložení typu date/time: %s\n"
+
+#: pg_resetwal.c:802
+msgid "64-bit integers"
+msgstr "64-bitová Äísla"
+
+#: pg_resetwal.c:803
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Způsob předávání float8 hodnot: %s\n"
+
+#: pg_resetwal.c:804
+msgid "by reference"
+msgstr "odkazem"
+
+#: pg_resetwal.c:804
+msgid "by value"
+msgstr "hodnotou"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Verze kontrolních souÄtů datových stránek: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Hodnoty které se změní:\n"
+"\n"
+
+#: pg_resetwal.c:823
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "První log segment po resetu: %s\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:829
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:831
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB k OldestMulti: %u\n"
+
+#: pg_resetwal.c:837
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:843
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:849
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:851
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:853
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB k OldestXID: %u\n"
+
+#: pg_resetwal.c:859
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:865
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:870
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze Äíst z adresáře \"%s\": %m"
+
+#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "nelze zavřít adresář \"%s\": %m"
+
+#: pg_resetwal.c:1036 pg_resetwal.c:1086
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "nelze smazat soubor \"%s\": %m"
+
+#: pg_resetwal.c:1167
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: pg_resetwal.c:1177 pg_resetwal.c:1190
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "nelze zapsat soubor \"%s\": %m"
+
+#: pg_resetwal.c:1197
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync error: %m"
+
+#: pg_resetwal.c:1208
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s resetuje PostgreSQL transakÄní log.\n"
+"\n"
+
+#: pg_resetwal.c:1209
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Použití:\n"
+" %s [VOLBA]... ADRESÃŘ\n"
+"\n"
+
+#: pg_resetwal.c:1210
+#, c-format
+msgid "Options:\n"
+msgstr "PÅ™epínaÄe:\n"
+
+#: pg_resetwal.c:1211
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" nastaví nejstarší a nejnovější s nastaveným\n"
+" commit timestamp (nula znamená beze změny)\n"
+
+#: pg_resetwal.c:1214
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]ADRESÃŘ datový adresář\n"
+
+#: pg_resetwal.c:1215
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH nastaví epochu následujícího ID transakce\n"
+
+#: pg_resetwal.c:1216
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force vynutí provedení update\n"
+
+#: pg_resetwal.c:1217
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE vynutí minimální poÄáteÄní WAL pozici pro nový transakÄní log\n"
+
+#: pg_resetwal.c:1218
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID nastav další a nejstarší ID multitransakce\n"
+
+#: pg_resetwal.c:1219
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run bez update, pouze ukáže co by bylo provedeno\n"
+
+#: pg_resetwal.c:1220
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID nastaví následující OID\n"
+
+#: pg_resetwal.c:1221
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET nastaví offset následující multitransakce\n"
+
+#: pg_resetwal.c:1222
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informace o verzi a skonÄí\n"
+
+#: pg_resetwal.c:1223
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID nastaví ID následující transakce\n"
+
+#: pg_resetwal.c:1224
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=VELIKOST velikost WAL segmentů, v megabytech\n"
+
+#: pg_resetwal.c:1225
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovÄ›du a skonÄí\n"
+
+#: pg_resetwal.c:1226
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_resetwal.c:1227
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#~ msgid "%s: cannot be executed by \"root\"\n"
+#~ msgstr "%s: nemůže být spuštěn uživatelem \"root\"\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: nelze naÄíst přístupová práva pro adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s: nelze změnit adresář na \"%s\": %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\" pro Ätení: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: nelze Äíst soubor \"%s\": %s\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: nelze vytvořit pg_control soubor: %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: nelze zapsat pg_control soubor: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: nelze Äíst z adresáře \"%s\": %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: nelze zavřít adresář \"%s\": %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít soubor \"%s\": %s\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: nelze zapsat do souboru \"%s\": %s\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: neplatný argument pro volbu -x\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: neplatný argument pro volbu -o\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: neplatný argument pro volbu -m\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: neplatný argument pro volbu -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: neplatný argument pro volbu -l\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "Äísla s plovoucí řádovou Äárkou"
+
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr "%s: interní chyba -- sizeof(ControlFileData) je příliš velký ... opravte PG_CONTROL_SIZE\n"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "První ID log souboru po resetu: %u\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Způsob předávání float4 hodnot: %s\n"
diff --git a/src/bin/pg_resetwal/po/de.po b/src/bin/pg_resetwal/po/de.po
new file mode 100644
index 0000000..8235147
--- /dev/null
+++ b/src/bin/pg_resetwal/po/de.po
@@ -0,0 +1,657 @@
+# German message translation file for pg_resetwal
+# Peter Eisentraut <peter@eisentraut.org>, 2002 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-29 23:20+0000\n"
+"PO-Revision-Date: 2023-08-30 07:59+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ungültiges Argument für Option %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "Transaktions-ID-Epoche (-e) darf nicht -1 sein"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "älteste Transaktions-ID (-u) muss größer oder gleich %u sein"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "Transaktions-ID (-x) muss größer oder gleich %u sein"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "Transaktions-ID (-c) muss entweder 0 oder größer oder gleich 2 sein"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) darf nicht 0 sein"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "Multitransaktions-ID (-m) darf nicht 0 sein"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "älteste Multitransaktions-ID (-m) darf nicht 0 sein"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "Multitransaktions-Offset (-O) darf nicht -1 sein"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "Argument von --wal-segsize muss eine Zahl sein"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kann nicht von »root« ausgeführt werden"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "Sperrdatei »%s« existiert"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Läuft der Server? Wenn nicht, dann Sperrdatei löschen und nochmal versuchen."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Wenn diese Werte akzeptabel scheinen, dann benutzen Sie -f um das\n"
+"Zurücksetzen zu erzwingen.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Der Datenbankserver wurde nicht sauber heruntergefahren.\n"
+"Beim Zurücksetzen des Write-Ahead-Logs können Daten verloren gehen.\n"
+"Wenn Sie trotzdem weiter machen wollen, benutzen Sie -f, um das\n"
+"Zurücksetzen zu erzwingen.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Write-Ahead-Log wurde zurückgesetzt\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "unerwartete leere Datei »%s«"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "Datenverzeichnis hat falsche Version"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Datei »%s« enthält »%s«, was nicht mit der Version dieses Programms »%s« kompatibel ist."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Wenn Sie sicher sind, dass das Datenverzeichnis korrekt ist, führen Sie\n"
+" touch %s\n"
+"aus und versuchen Sie es erneut."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existiert, aber mit ungültiger CRC; mit Vorsicht fortfahren"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control gibt ungültige WAL-Segmentgröße an (%d Byte); mit Vorsicht fortfahren"
+msgstr[1] "pg_control gibt ungültige WAL-Segmentgröße an (%d Bytes); mit Vorsicht fortfahren"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existiert, aber ist kaputt oder hat falsche Version; wird ignoriert"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Geschätzte pg_control-Werte:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Aktuelle pg_control-Werte:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control-Versionsnummer: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversionsnummer: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Datenbanksystemidentifikation: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes des letzten Checkpoints: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "aus"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "an"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID des letzten Checkpoints: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB der oldestXID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB des oldestMulti des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid des letzten Checkpoints: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximale Datenausrichtung (Alignment): %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Datenbankblockgröße: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blöcke pro Segment: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL-Blockgröße: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes pro WAL-Segment: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximale Bezeichnerlänge: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximale Spalten in einem Index: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximale Größe eines Stücks TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Größe eines Large-Object-Chunks: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Speicherung von Datum/Zeit-Typen: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-Bit-Ganzzahlen"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Ãœbergabe von Float8-Argumenten: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "Referenz"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "Wert"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Datenseitenprüfsummenversion: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Zu ändernde Werte:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Erstes Logdateisegment nach Zurücksetzen: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID-Epoche: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync-Fehler: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s setzt den PostgreSQL-Write-Ahead-Log zurück.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Aufruf:\n"
+" %s [OPTION]... DATENVERZEICHNIS\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" älteste und neuste Transaktion mit Commit-\n"
+" Timestamp setzen (Null bedeutet keine Änderung)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCHE nächste Transaktions-ID-Epoche setzen\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force Änderung erzwingen\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALDATEI minimale Startposition für neuen WAL setzen\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID nächste und älteste Multitransaktions-ID setzen\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run keine Änderungen; nur zeigen, was gemacht\n"
+" werden würde\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID nächste OID setzen\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET nächsten Multitransaktions-Offset setzen\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID älteste Transaktions-ID setzen\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID nächste Transaktions-ID setzen\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabytes\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/el.po b/src/bin/pg_resetwal/po/el.po
new file mode 100644
index 0000000..8850a7e
--- /dev/null
+++ b/src/bin/pg_resetwal/po/el.po
@@ -0,0 +1,679 @@
+# Greek message translation file for pg_resetwal
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:18+0000\n"
+"PO-Revision-Date: 2023-04-14 13:51+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "δεν ήταν δυνατό το άνοιγμα διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "δεν ήταν δυνατή η εκχώÏηση SID: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η εκκίνηση διεÏγασίας για την εντολή «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακÏιτικό πεÏιοÏισμοÏ: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "δεν ήταν δυνατή η απόκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¾ÏŒÎ´Î¿Ï… από την υποδιεÏγασία: κωδικός σφάλματος %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "μη έγκυÏη παÏάμετÏος για την επιλογή %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "η εποχή αναγνωÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î±Î»Î»Î±Î³Î®Ï‚ (-e) δεν Ï€Ïέπει να είναι -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "το παλαιότεÏο αναγνωÏιστικό συναλλαγής (-u) Ï€Ïέπει να είναι μεγαλÏτεÏο ή ίσο με %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "το αναγνωÏιστικό συναλλαγής (-x) Ï€Ïέπει να είναι μεγαλÏτεÏο ή ίσο με %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "το αναγνωÏιστικό συναλλαγής (-c) Ï€Ïέπει να είναι είτε 0 είτε μεγαλÏτεÏο ή ίσο με 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) δεν Ï€Ïέπει να είναι 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "το αναγνωÏιστικό πολλαπλής συναλλαγής (-m) δεν Ï€Ïέπει να είναι 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "το παλαιότεÏο αναγνωÏιστικό πολλαπλής συναλλαγής (-m) δεν Ï€Ïέπει να είναι 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "η μετατόπιση πολλαπλής συναλλαγής (-O) δεν Ï€Ïέπει να είναι -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "η παÏάμετÏος --wal-segsize Ï€Ïέπει να είναι αÏιθμός"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "η παÏάμετÏος --wal-segsize Ï€Ïέπει να έχει τιμή δÏναμης 2 Î¼ÎµÏ„Î±Î¾Ï 1 και 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν οÏίστηκε κατάλογος δεδομένων"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "δεν είναι δυνατή η εκτέλεση από \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "ΠÏέπει να εκτελέσετε %s ως υπεÏχÏήστης PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για ανάγνωση: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "το αÏχείο κλειδώματος \"%s\" υπάÏχει"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Εκτελείται ο διακομιστής; Εάν όχι, διαγÏάψτε το αÏχείο κλειδώματος και Ï€Ïοσπαθήστε ξανά."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Εάν αυτές οι τιμές φαίνονται αποδεκτές, χÏησιμοποιήστε το -f για να αναγκάσετε την επαναφοÏά.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Ο διακομιστής βάσης δεδομένων δεν τεÏματίστηκε με καθαÏά.\n"
+"Η επαναφοÏά του write-ahead log ενδέχεται να Ï€Ïοκαλέσει απώλεια δεδομένων.\n"
+"Εάν θέλετε να Ï€ÏοχωÏήσετε οÏτως ή άλλως, χÏησιμοποιήστε -f για να αναγκάσετε την επαναφοÏά.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "ΕπαναφοÏά write-ahead log\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "μη αναμενόμενο κενό αÏχείο «%s»"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "ο κατάλογος δεδομένων είναι εσφαλμένης έκδοσης"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Το αÏχείο «%s» πεÏιέχει «%s», το οποίο δεν είναι συμβατό με την έκδοση «%s» Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Ï€ÏογÏάμματος."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Εάν είστε βέβαιοι ότι η διαδÏομή καταλόγου δεδομένων είναι σωστή, εκτελέστε\n"
+" touch %s\n"
+"και Ï€Ïοσπάθησε ξανά."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control υπάÏχει αλλά δεν έχει έγκυÏο CRC· Ï€ÏοχωÏήστε με Ï€Ïοσοχή"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control καθοÏίζει το μη έγκυÏο μέγεθος τμήματος WAL (%d byte)· Ï€ÏοχωÏήστε με Ï€Ïοσοχή"
+msgstr[1] "pg_control καθοÏίζει το μη έγκυÏο μέγεθος τμήματος WAL (%d bytes)· Ï€ÏοχωÏήστε με Ï€Ïοσοχή"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control υπάÏχει, αλλά είναι κατεστÏαμμένη ή λάθος έκδοση· παÏαβλέπεται"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Μάντεψε τιμές pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"ΤÏέχουσες τιμές pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr ""
+"pg_control αÏιθμός έκδοσης: %u\n"
+"\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "ΑÏιθμός έκδοσης καταλόγου: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ΑναγνωÏιστικό συστήματος βάσης δεδομένων: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο TimeLineID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Πιο Ï€Ïόσφατο full_page_writes του σημείου ελέγχου: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "κλειστό"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "ανοικτό"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Πιο Ï€Ïόσφατο NextXID του σημείου ελέγχου: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο NextOID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Πιο Ï€Ïόσφατο NextMultiXactId του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Πιο Ï€Ïόσφατο NextMultiOffset του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestXID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestXID’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestActiveXID του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestMultiXid του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestMulti’s DB του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Πιο Ï€Ïόσφατο oldestCommitTsXid του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Πιο Ï€Ïόσφατο newestCommitTsXid του σημείου ελέγχου: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Μέγιστη στοίχιση δεδομένων: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Μέγεθος μπλοκ βάσης δεδομένων: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Μπλοκ ανά τμήμα μεγάλης σχέσης: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Μέγεθος μπλοκ WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes ανά τμήμα WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Μέγιστο μήκος αναγνωÏιστικών: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Μέγιστες στήλες σε ένα ευÏετήÏιο: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Μέγιστο μέγεθος ενός τμήματος TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Μέγεθος τμήματος μεγάλου αντικειμένου: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "ΤÏπος αποθήκευσης ημεÏομηνίας/ÏŽÏας: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "ΑκέÏαιοι 64-bit"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Μεταβλητή Float8 τέθηκε: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "με αναφοÏά"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "με τιμή"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Έκδοση αθÏοίσματος ελέγχου σελίδας δεδομένων: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"Τιμές Ï€Ïος αλλαγή:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "ΠÏώτο τμήμα καταγÏαφής μετά την επαναφοÏά: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti’s DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID’s DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση του αÏχείου \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "σφάλμα fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s επαναφέÏει το write-ahead log της PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"ΧÏήση:\n"
+" %s [ΕΠΙΛΟΓΗ]… DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" οÏισμός παλαιότεÏων και νεότεÏων συναλλαγών που φέÏουν\n"
+" χÏονική σήμανση ολοκλήÏωσης (μηδέν σημαίνει καμία αλλαγή)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH ÏŒÏισε την εποχή του επόμενου αναγνωÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î±Î»Î»Î±Î³Î®Ï‚\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force επέβαλλε την ενημέÏωση\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE ÏŒÏισε την ελάχιστη θέση εκκίνησης του νέου WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID ÏŒÏισε το επόμενο και παλαιότεÏο αναγνωÏιστικό πολλαπλής συναλλαγής\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run καμία ενημέÏωση, απλά εμφάνισε τι θα συνέβαινε\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID ÏŒÏισε το επόμενο OID\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET ÏŒÏισε την επόμενη μετατόπιση πολλαπλής συναλλαγής\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID ÏŒÏισε το παλαιότεÏο ID συναλλαγής\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID ÏŒÏισε το επόμενο αναγνωÏιστικό συναλλαγής\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "το αναγνωÏιστικό συναλλαγής (-x) δεν Ï€Ïέπει να είναι 0"
diff --git a/src/bin/pg_resetwal/po/es.po b/src/bin/pg_resetwal/po/es.po
new file mode 100644
index 0000000..cc3e566
--- /dev/null
+++ b/src/bin/pg_resetwal/po/es.po
@@ -0,0 +1,671 @@
+# Spanish message translation file for pg_resetwal
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Ivan Hernandez <ivanx@ciencias.unam.mx>, 2003.
+# Alvaro Herrera <alvherre@alvh.no-ip.org>, 2004-2014
+# Jaime Casanova <systemguards@gmail.com>, 2005
+# Martín Marqués <martin@2ndquadrant.com>, 2013-2014
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:19+0000\n"
+"PO-Revision-Date: 2023-10-03 16:16+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "no se pudo abrir el token de proceso: código de error %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "no se pudo emplazar los SIDs: código de error %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "no se pudo crear el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento no válido para la opción %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "el «epoch» de ID de transacción (-e) no debe ser -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "el ID de transacción más antiguo (-u) debe ser mayor o igual a %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "el ID de transacción (-x) debe ser mayor o igual a %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "el ID de transacción (-c) debe ser 0 o bien mayor o igual a 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) no debe ser cero"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "el ID de multitransacción (-m) no debe ser 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "el ID de multitransacción más antiguo (-m) no debe ser 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "la posición de multitransacción (-O) no debe ser -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "el argumento de --wal-segsize debe ser un número"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "el argumento de --wal-segsize debe ser una potencia de dos entre 1 y 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "directorio de datos no especificado"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "no puede ser ejecutado con el usuario «root»"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Debe ejecutar %s con el superusuario de PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "no se pudo cambiar al directorio «%s»: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "el archivo candado «%s» existe"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "¿Hay un servidor corriendo? Si no, borre el archivo candado e inténtelo de nuevo."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Si estos valores parecen aceptables, use -f para forzar reinicio.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"El servidor de bases de datos no se apagó limpiamente.\n"
+"Restablecer el WAL puede causar pérdida de datos.\n"
+"Si quiere continuar de todas formas, use -f para forzar el restablecimiento.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "«Write-ahead log» restablecido\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "archivo vacío inesperado «%s»"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "el directorio de datos tiene la versión equivocada"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "El archivo «%s» contiene «%s», que no es compatible con la versión «%s» de este programa."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Si está seguro que la ruta al directorio de datos es correcta, ejecute\n"
+" touch %s\n"
+"y pruebe de nuevo."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "existe pg_control pero tiene un CRC no válido, proceda con precaución"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control especifica un tamaño de segmento de WAL no válido (%d byte), proceda con precaución"
+msgstr[1] "pg_control especifica un tamaño de segmento de WAL no válido (%d bytes), proceda con precaución"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "existe pg_control pero está roto o tiene la versión equivocada; ignorándolo"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valores de pg_control asumidos:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valores actuales de pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Número de versión de pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número de versión de catálogo: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador de sistema: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes del checkpoint más reciente: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "desactivado"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "activado"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID del checkpoint más reciente: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "BD del oldestXID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid del checkpoint más reciente: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "BD del oldestMultiXid del checkpt. más reciente: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid del último checkpoint: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Máximo alineamiento de datos: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamaño del bloque de la base de datos: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloques por segmento de relación grande: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamaño del bloque de WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Longitud máxima de identificadores: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo número de columnas en un índice: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longitud máxima de un trozo TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Longitud máxima de un trozo de objeto grande: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de almacenamiento hora/fecha: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "enteros de 64 bits"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Paso de parámetros float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "por referencia"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "por valor"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versión de suma de verificación de datos: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valores a cambiar:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Primer segmento de log después de reiniciar: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "Base de datos del OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "Base de datos del OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoch del NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "no se pudo borrar el archivo «%s»: %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "error de fsync: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s restablece el WAL («write-ahead log») de PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPCIÓN]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" definir la más antigua y la más nueva transacciones\n"
+" que llevan timestamp de commit (cero significa no\n"
+" cambiar)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH asigna el siguiente «epoch» de ID de transacción\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force fuerza que la actualización sea hecha\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr ""
+" -l, --next-wal-file=ARCHIVOWAL\n"
+" fuerza una ubicación inicial mínima para nuevo WAL\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID\n"
+" asigna el siguiente ID de multitransacción y\n"
+" el más antiguo\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run no actualiza, sólo muestra lo que se haría\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID asigna el siguiente OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=OFFSET\n"
+" asigna la siguiente posición de multitransacción\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr ""
+" -u, --oldest-transaction-id=XID\n"
+" asigna el ID de transacción más antiguo\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr ""
+" -x, --next-transaction-id=XID\n"
+" asigna el siguiente ID de transacción\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMAÑO tamaño de segmentos de WAL, en megabytes\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/fr.po b/src/bin/pg_resetwal/po/fr.po
new file mode 100644
index 0000000..9c02948
--- /dev/null
+++ b/src/bin/pg_resetwal/po/fr.po
@@ -0,0 +1,837 @@
+# LANGUAGE message translation file for pg_resetwal
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-05 17:20+0000\n"
+"PO-Revision-Date: 2023-09-05 22:02+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "n'a pas pu allouer les SID : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argument invalide pour l'option %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "la valeur epoch de l'identifiant de transaction (-e) ne doit pas être -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "l'identifiant de transaction le plus ancien (-u) doit être supérieur ou égal à %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "l'identifiant de transaction (-x) doit être supérieur ou égal à %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "l'identifiant de transaction (-c) doit être 0 ou supérieur ou égal à 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "l'OID (-o) ne doit pas être 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "l'identifiant de multi-transaction (-m) ne doit pas être 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "l'identifiant de multi-transaction le plus ancien (-m) ne doit pas être 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "le décalage de multi-transaction (-O) ne doit pas être -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argument de --wal-segsize doit être un nombre"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "ne peut pas être exécuté par « root »"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "le fichier verrou « %s » existe"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Le serveur est-il démarré ? Sinon, supprimer le fichier verrou et réessayer."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Si ces valeurs semblent acceptables, utiliser -f pour forcer la\n"
+"réinitialisation.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Le serveur de bases de données n'a pas été arrêté proprement.\n"
+"Ré-initialiser le journal des transactions peut occasionner des pertes de\n"
+"données.\n"
+"Pour continuer malgré tout, utiliser -f pour forcer la\n"
+"réinitialisation.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Réinitialisation des journaux de transactions\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "fichier vide inattendu « %s »"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "le répertoire des données a une mauvaise version"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Le fichier « %s » contient « %s », qui n'est pas compatible avec la version « %s » de ce programme."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Si vous êtes certain que le chemin du répertoire de données est correct, exécuter\n"
+" touch %s\n"
+"et réessayer."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existe mais son CRC est invalide ; agir avec précaution"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control spécifie une taille invalide de segment WAL (%d octet) ; agir avec précaution"
+msgstr[1] "pg_control spécifie une taille invalide de segment WAL (%d octets) ; agir avec précaution"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existe mais est corrompu ou de mauvaise version ; ignoré"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valeurs de pg_control devinées :\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valeurs actuelles de pg_control :\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Numéro de version de pg_control : %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numéro de version du catalogue : %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identifiant du système de base de données : %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Dernier TimeLineID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Dernier full_page_writes du point de contrôle : %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "désactivé"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "activé"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Dernier NextXID du point de contrôle : %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Dernier NextOID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Dernier NextMultiXactId du point de contrôle : %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Dernier NextMultiOffset du point de contrôle : %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Dernier oldestXID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Dernier oldestXID du point de contrôle de la base : %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Dernier oldestActiveXID du point de contrôle : %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Dernier oldestMultiXid du point de contrôle : %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Alignement maximal des données : %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Taille du bloc de la base de données : %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocs par segment des relations volumineuses : %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Taille de bloc du journal de transaction : %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Octets par segment du journal de transaction : %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Longueur maximale des identifiants : %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Nombre maximum de colonnes d'un index: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Longueur maximale d'un morceau TOAST : %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Taille d'un morceau de Large Object : %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Stockage du type date/heure : %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "entiers 64-bits"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passage d'argument float8 : %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "par référence"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "par valeur"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Version des sommes de contrôle des pages de données : %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valeurs à changer :\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Premier segment du journal après réinitialisation : %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID Epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "erreur fsync : %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s réinitialise le journal des transactions PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Usage :\n"
+" %s [OPTION]... RÉP_DONNÉES\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" configure les transactions la plus ancienne\n"
+" et la plus récente contenant les dates/heures\n"
+" de validation (zéro signifie aucun changement)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]RÉP_DONNEES répertoire de la base de données\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr ""
+" -e, --epoch=XIDEPOCH configure la valeur epoch du prochain\n"
+" identifiant de transaction\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force force la mise à jour\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr ""
+" -l, --next-wal-file=FICHIERWAL configure l'emplacement minimal de début\n"
+" des WAL du nouveau journal de transactions\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID configure le prochain et le plus ancien\n"
+" identifiants multi-transactions\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run pas de mise à jour, affiche\n"
+" simplement ce qui sera fait\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID configure le prochain OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=DÉCALAGE configure le prochain décalage\n"
+" multitransaction\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr ""
+" -u, --oldest-transaction-id=XID configure l'identifiant de transaction le\n"
+" plus ancien\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr ""
+" -x, --next-transaction-id=XID configure le prochain identifiant de\n"
+" transaction\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " (zero in either value means no change)\n"
+#~ msgstr " (zéro dans l'une des deux valeurs signifie aucun changement)\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version afficherla version et quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide et quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version, puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version et quitte\n"
+
+#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n"
+#~ msgstr " -c XID,XID configure la plus ancienne et la plus récente transaction\n"
+
+#~ msgid " -x XID set next transaction ID\n"
+#~ msgstr " -x XID fixe le prochain identifiant de transaction\n"
+
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n"
+
+#~ msgid "%s: argument of --wal-segsize must be a number\n"
+#~ msgstr "%s : l'argument de --wal-segsize doit être un nombre\n"
+
+#~ msgid "%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n"
+#~ msgstr "%s : l'argument de --wal-segsize doit être une puissance de 2 entre 1 et 1024\n"
+
+#~ msgid "%s: cannot be executed by \"root\"\n"
+#~ msgstr "%s : ne peut pas être exécuté par « root »\n"
+
+#~ msgid "%s: could not allocate SIDs: error code %lu\n"
+#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s : n'a pas pu créer le fichier pg_control : %s\n"
+
+#~ msgid "%s: could not create restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not delete file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu supprimer le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not get exit code from subprocess: error code %lu\n"
+#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not re-execute with restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not read from directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not start process for command \"%s\": error code %lu\n"
+#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s : n'a pas pu écrire le fichier pg_control : %s\n"
+
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr ""
+#~ "%s : erreur interne -- sizeof(ControlFileData) est trop important...\n"
+#~ "corrigez PG_CONTROL_SIZE\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s : argument invalide pour l'option -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s : argument invalide pour l'option -l\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s : argument invalide pour l'option -m\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s : argument invalide pour l'option -o\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s : argument invalide pour l'option -x\n"
+
+#~ msgid "%s: no data directory specified\n"
+#~ msgstr "%s : aucun répertoire de données indiqué\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "Premier identifiant du journal après réinitialisation : %u\n"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Passage d'argument float4 : %s\n"
+
+#~ msgid "Transaction log reset\n"
+#~ msgstr "Réinitialisation du journal des transactions\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "floating-point numbers"
+#~ msgstr "nombres à virgule flottante"
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "l'identifiant de la transaction (-x) ne doit pas être 0"
diff --git a/src/bin/pg_resetwal/po/it.po b/src/bin/pg_resetwal/po/it.po
new file mode 100644
index 0000000..3e6852f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/it.po
@@ -0,0 +1,666 @@
+# Italian message translation file for pg_resetwal
+# Domenico Sgarbossa <sgarbossa.domenico@gmail.com>, 2022 - 2022.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2023-09-05 08:20+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "impossibile caricare la libreria \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "impossibile aprire il token di processo: codice di errore %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "impossibile allocare i SID: codice di errore %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "impossibile creare token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "impossibile rieseguire con token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argomento non valido per l'opzione %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per ulteriori informazioni."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "l'ID transazione epoch (-e) non deve essere -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "l'ID transazione più vecchio (-u) deve essere maggiore o uguale a %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "l'ID transazione (-x) deve essere maggiore o uguale a %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "l'ID transazione (-c) deve essere 0 o maggiore o uguale a 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) non deve essere 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "l'ID multitransazione (-m) non deve essere 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "l'ID multitransazione più vecchio (-m) non deve essere 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "l'offset multitransazione (-O) non deve essere -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "l'argomento di --wal-segsize deve essere un numero"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "argomento di --wal-segsize deve essere una potenza di 2 tra 1 e 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "non può essere eseguito da \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Devi eseguire %s come superutente di PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "impossibile leggere i permessi della directory \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "impossibile cambiare la directory in \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "impossibile aprire il file \"%s\" per la lettura: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "il file di blocco \"%s\" esiste già"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Un server è in esecuzione? In caso contrario, eliminare il file di blocco e riprovare."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Se questi valori sembrano accettabili, utilizzare -f per forzare il ripristino.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Il server del database non è stato arrestato correttamente.\n"
+"La reimpostazione del registro write-ahead potrebbe causare la perdita di dati.\n"
+"Se vuoi procedere comunque, usa -f per forzare il reset.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Ripristino del registro write-ahead\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "file vuoto imprevisto \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "impossibile leggere il file \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "la directory dei dati è di versione errata"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Il file \"%s\" contiene \"%s\", che non è compatibile con la versione \"%s\" di questo programma."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Se sei sicuro che il percorso della directory dei dati sia corretto, esegui\n"
+" tocca %s\n"
+"e riprova."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control esiste ma ha un CRC non valido; procedi con cautela"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control specifica la dimensione del segmento WAL non valida (%d byte); procedi con cautela"
+msgstr[1] "pg_control specifica la dimensione dei segmenti WAL non valida (%d byte); procedi con cautela"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control esiste ma è una versione non funzionante o errata; ignorandolo"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valori pg_control ipotizzati:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valori correnti di pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control numero di versione: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Numero di versione del catalogo: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificatore di sistema del database: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Full_page_writes dell'ultimo checkpoint: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "spento"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "acceso"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID dell'ultimo checkpoint: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "XID più vecchio dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB dell'XID più vecchio dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "L'ActiveXID più vecchio dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Il più vecchio MultiXid dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Il più vecchio DB dell'ultimo checkpoint: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Il più vecchio CommitTsXid dell'ultimo checkpoint:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Il più recenteCommitTsXid dell'ultimo checkpoint:%u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Allineamento massimo dei dati: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Dimensione blocco database: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocchi per segmento di relazione grande: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Dimensione blocco WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Byte per segmento WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Lunghezza massima degli identificatori: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Numero massimo di colonne in un indice: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Dimensione massima di un blocco TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Dimensione di un blocco di oggetti di grandi dimensioni: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo di archiviazione data/ora: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "Interi a 64 bit"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passaggio argomento float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "come riferimento"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "per valore"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr ""
+"Versione checksum pagina dati: %u\n"
+" \n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valori da modificare:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Primo segmento di registro dopo il ripristino: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB di OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "XID più vecchio: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB di OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoca NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "impossibile aprire la directory \"%s\": %m"
+
+#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "impossibile leggere la directory \"%s\": %m"
+
+#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_resetwal.c:990 pg_resetwal.c:1028
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "impossibile eliminare il file \"%s\": %m"
+
+#: pg_resetwal.c:1100
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "impossibile aprire il file \"%s\": %m"
+
+#: pg_resetwal.c:1108 pg_resetwal.c:1120
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossibile scrivere il file \"%s\": %m"
+
+#: pg_resetwal.c:1125
+#, c-format
+msgid "fsync error: %m"
+msgstr "errore fsync: %m"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s reimposta il registro write-ahead di PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Utilizzo:\n"
+" %s [OPZIONE]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" impostare il rilevamento delle transazioni più vecchie e più recenti\n"
+" timestamp di commit (zero significa nessuna modifica)\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH imposta l'epoca dell'ID transazione successiva\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force forza l'aggiornamento da eseguire\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE imposta la posizione iniziale minima per il nuovo WAL\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID imposta l'ID multitransazione successivo e meno recente\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run nessun aggiornamento, mostra solo cosa sarebbe stato fatto\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID imposta l'OID successivo\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET imposta l'offset multitransazione successivo\n"
+
+#: pg_resetwal.c:1148
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID imposta l'ID transazione più vecchio\n"
+
+#: pg_resetwal.c:1149
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n"
+
+#: pg_resetwal.c:1150
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID imposta l'ID transazione successiva\n"
+
+#: pg_resetwal.c:1151
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE dimensione dei segmenti WAL, in megabyte \n"
+
+#: pg_resetwal.c:1152
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto, quindi esci\n"
+
+#: pg_resetwal.c:1153
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_resetwal.c:1154
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/ja.po b/src/bin/pg_resetwal/po/ja.po
new file mode 100644
index 0000000..96bc881
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ja.po
@@ -0,0 +1,657 @@
+# pg_resetwal.po
+# Japanese message translation file for pg_resetwal
+#
+# Copyright (C) 2005-2022 PostgreSQL Global Development Group
+#
+# Shigehiro Honda <fwif0083@mb.infoweb.ne.jp>, 2005.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-30 09:20+0900\n"
+"PO-Revision-Date: 2023-08-30 09:53+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "プロセストークンをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "制é™ä»˜ãトークンを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\"コマンドã®ãƒ—ロセスを起動ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "制é™ä»˜ãトークンã§å†å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ: %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "サブプロセスã®çµ‚了コードを入手ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: エラーコード %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "オプション%sã®å¼•æ•°ãŒä¸æ­£ã§ã™"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "トランザクションIDã®åŸºç‚¹(-e)ã¯-1ã«ã¯ã§ãã¾ã›ã‚“"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "最å¤ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID(-u)ã¯%uã‚‚ã—ãã¯ãれ以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "トランザクションID(-x)ã¯%uã‚‚ã—ãã¯ãれ以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "トランザクションID(-c)ã¯0ã‚‚ã—ãã¯2以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID(-o)ã¯0ã«ã¯ã§ãã¾ã›ã‚“"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID(-m)ã¯0ã«ã¯ã§ãã¾ã›ã‚“"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "最å¤ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID(-m)ã¯0ã«ã¯ã§ãã¾ã›ã‚“"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•ã‚»ãƒƒãƒˆ(-O)ã¯-1ã«ã¯ã§ãã¾ã›ã‚“"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsizã®å¼•æ•°ã¯æ•°å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsizeã®å¼•æ•°ã¯1ã‹ã‚‰1024ã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\"ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQLã®ã‚¹ãƒ¼ãƒ‘ーユーザーã§%sを実行ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã«ç§»å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "ロックファイル\"%s\"ãŒå­˜åœ¨ã—ã¾ã™"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "サーãƒãƒ¼ãŒç¨¼å‹•ã—ã¦ã„ã¾ã›ã‚“ã‹? ãã†ã§ãªã‘ã‚Œã°ãƒ­ãƒƒã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—å†å®Ÿè¡Œã—ã¦ãã ã•ã„。"
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"ã“ã®å€¤ãŒé©åˆ‡ã ã¨æ€ã‚れるã®ã§ã‚ã‚Œã°ã€-fを使用ã—ã¦å¼·åˆ¶ãƒªã‚»ãƒƒãƒˆã—ã¦ãã ã•ã„。\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"データベースサーãƒãƒ¼ãŒæ­£ã—ãシャットダウンã•ã‚Œã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+"先行書ãè¾¼ã¿ãƒ­ã‚°ã®ãƒªã‚»ãƒƒãƒˆã«ã¯ãƒ‡ãƒ¼ã‚¿æ失ã®æã‚ŒãŒã‚ã‚Šã¾ã™ã€‚\n"
+"ã¨ã«ã‹ã処ç†ã—ãŸã„ã®ã§ã‚ã‚Œã°ã€-fã§ãƒªã‚»ãƒƒãƒˆã‚’強制ã—ã¦ãã ã•ã„。\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ãŒãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã—ãŸ\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "想定外ã®ç©ºã®ãƒ•ã‚¡ã‚¤ãƒ«\"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "データディレクトリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒé•ã„ã¾ã™"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "ファイル\"%s\"ã§ã¯\"%s\"ã¨ãªã£ã¦ã„ã¾ã™ã€ã“ã‚Œã¯ã“ã®ãƒ—ログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"ã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"確実ã«ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘スãŒæ­£ã—ã‘ã‚Œã°ã€\n"
+" touch %s\n"
+"ã®å¾Œã«å†å®Ÿè¡Œã—ã¦ãã ã•ã„。"
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_controlãŒã‚ã‚Šã¾ã—ãŸãŒã€CRCãŒä¸æ­£ã§ã—ãŸ; 注æ„ã—ã¦é€²ã‚ã¦ãã ã•ã„"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_controlã«ã‚ã‚‹WALセグメントサイズ(%dãƒã‚¤ãƒˆ)ã¯ä¸æ­£ã§ã™; 注æ„ã—ã¦é€²ã‚ã¦ãã ã•ã„"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_controlãŒã‚ã‚Šã¾ã—ãŸãŒã€ç ´æã‚ã‚‹ã„ã¯é–“é•ã£ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™; 無視ã—ã¾ã™"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"pg_controlã®æŽ¨æ¸¬å€¤:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"ç¾åœ¨ã®pg_controlã®å€¤:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_controlãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "カタログãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "データベースシステム識別å­: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®æ™‚系列ID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "オフ"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "オン"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXIDã®DB: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestActiveXID: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiã®DB: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大データアラインメント: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "データベースã®ãƒ–ロックサイズ: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大ããªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆæ¯Žã®ãƒ–ロック数:%u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WALã®ãƒ–ロックサイズ: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WALセグメント当ãŸã‚Šã®ãƒã‚¤ãƒˆæ•°: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "識別å­ã®æœ€å¤§é•·: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "インデックス内ã®æœ€å¤§åˆ—æ•°: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOASTãƒãƒ£ãƒ³ã‚¯ã®æœ€å¤§ã‚µã‚¤ã‚º: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "ラージオブジェクトãƒãƒ£ãƒ³ã‚¯ã®ã‚µã‚¤ã‚º: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日付/時刻型ã®æ ¼ç´æ–¹å¼: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64ビット整数"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8引数ã®æ¸¡ã—æ–¹: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "å‚照渡ã—"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "値渡ã—"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "データベージãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"変更ã•ã‚Œã‚‹å€¤:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "リセット後最åˆã®WALセグメント: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMultiã®DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXIDã®DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID基点: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsyncエラー: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚’リセットã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"使用方法:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" コミットタイムスタンプをæŒã¤æœ€å¤ã¨æœ€æ–°ã®\n"
+" トランザクション(0ã¯å¤‰æ›´ã—ãªã„ã“ã¨ã‚’æ„味ã™ã‚‹)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH 次ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã®åŸºç‚¹ã‚’設定\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 強制的ã«æ›´æ–°ã‚’実施\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE æ–°ã—ã„WALã®æœ€å°é–‹å§‹ãƒã‚¤ãƒ³ãƒˆã‚’設定\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID 次ãŠã‚ˆã³æœ€å¤ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを設定\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run æ›´æ–°ã‚’ã›ãšã€å˜ã«ä½•ãŒè¡Œãªã‚れるã‹ã‚’表示\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID 次ã®OIDを設定\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET 次ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•ã‚»ãƒƒãƒˆã‚’設定\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID 最å¤ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを設定\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID 次ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを設定\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WALセグメントã®ã‚µã‚¤ã‚ºã€å˜ä½ã¯ãƒ¡ã‚¬ãƒã‚¤ãƒˆ\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/ka.po b/src/bin/pg_resetwal/po/ka.po
new file mode 100644
index 0000000..ec322cc
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ka.po
@@ -0,0 +1,662 @@
+# Georgian message translation file for pg_resetwal
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-31 20:20+0000\n"
+"PO-Revision-Date: 2023-09-02 07:09+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "„%s“ ბრძáƒáƒœáƒ”ბის პრáƒáƒªáƒ”სის დáƒáƒ¬áƒ§áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შესრულებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის: %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის ეპáƒáƒ¥áƒ (-e) -1 áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ძველი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-u) %u-ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-x) %u_ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-c) áƒáƒœ 0 უნდრიყáƒáƒ¡, áƒáƒœ 2-ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) 0 áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-m) 0 áƒáƒ  უნდრიყáƒ"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "უძველესი მულტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-m) 0 áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "მულიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ(-O) -1 áƒáƒ  უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segisze -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize -ის áƒáƒ áƒ’უმენტი 2-ის ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1-1024 დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "root-ით ვერ გáƒáƒ”შვებáƒ"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "%s PostgreSQL-ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით უნდრგáƒáƒ£áƒ¨áƒ•áƒáƒ—."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "სერვერი გáƒáƒ¨áƒ•áƒ”ბულიáƒ? თუ áƒáƒ áƒ, წáƒáƒ¨áƒáƒšáƒ”თ ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ სცáƒáƒ“ეთ."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"თუ ეს მნიშვნელáƒáƒ‘ები მისáƒáƒ¦áƒ”ბიáƒ, ძáƒáƒšáƒ˜áƒ— დáƒáƒ¡áƒáƒ‘რუნებლáƒáƒ“ -f გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერი სუფთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ.\n"
+"წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნებáƒáƒ› შეიძლებრმáƒáƒœáƒáƒªáƒ”მების დáƒáƒ™áƒáƒ áƒ’ვრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•áƒ˜áƒáƒ¡.\n"
+"თუ გáƒáƒ’რძელებრმáƒáƒ˜áƒœáƒª გნებáƒáƒ•áƒ—, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ -f.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნებáƒ\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ: \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ვერსიáƒáƒ¡ ეკუთვნის"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეიცáƒáƒ•áƒ¡ \"%s\"-ს, რáƒáƒ›áƒ”ლიც áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ვერსიáƒáƒ¡áƒ—áƒáƒœ (%s) შეუთáƒáƒ•áƒ¡áƒ”ბელიáƒ."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"თუ დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ბრძáƒáƒœáƒ“ებით, რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი სწáƒáƒ áƒ˜áƒ, გáƒáƒ£áƒ¨áƒ•áƒ˜áƒ—\n"
+" touch %s\n"
+"დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ სცáƒáƒ“ეთ."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› გáƒáƒáƒ©áƒœáƒ˜áƒ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ CRC; ფრთხილáƒáƒ“"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control WAL-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ზáƒáƒ›áƒáƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) მიუთითებს; ფრთხილáƒáƒ“"
+msgstr[1] "pg_control WAL-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ზáƒáƒ›áƒáƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) მიუთითებს; ფრთხილáƒáƒ“"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› áƒáƒœ გáƒáƒ¤áƒ£áƒ­áƒ”ბულიáƒ, áƒáƒœ ძველი ვერსიáƒ; იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Pg_control გáƒáƒ›áƒáƒªáƒœáƒáƒ‘ილი მნიშვნელáƒáƒ‘ები:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Pg_control მიმდინáƒáƒ áƒ” მნიშვნელáƒáƒ‘ები:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control ვერსიის ნáƒáƒ›áƒ”რი: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "კáƒáƒ¢áƒáƒšáƒáƒ’ის ვერსიის ნáƒáƒ›áƒ”რი: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ბáƒáƒ–ის სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილისTimeLineID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ული"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "ჩáƒáƒ áƒ—"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID's DB: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestActiveXID: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის newestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სწáƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "ბáƒáƒ–ის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "დიდი ურთიერთáƒáƒ‘ის სეგმენტები თითáƒáƒ”ულ ბლáƒáƒ™áƒ¨áƒ˜: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "ბáƒáƒ˜áƒ¢áƒ”ბი თითáƒáƒ”ულ WAL სეგმენტში: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "იდენტიფიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "ინდექსში სვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST ნáƒáƒ’ლეჯის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ტიპის სáƒáƒªáƒáƒ•áƒ˜: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-ბიტიáƒáƒœáƒ˜ მთელ რიცხვები"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მáƒ: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "ბმით"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "მნიშვნელáƒáƒ‘ით"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"შესáƒáƒªáƒ•áƒšáƒ”ლი მნიშვნელáƒáƒ‘ები:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნების შემდეგ ჟურნáƒáƒšáƒ˜áƒ¡ პირველი სეგმენტი: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync error: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ ჟურნáƒáƒšáƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე áƒáƒ‘რუნებს.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: \n"
+" %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" უáƒáƒ®áƒšáƒ”სი დრუძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მითითებáƒ,\n"
+" დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ მáƒáƒ¢áƒáƒ áƒ”ბლით(0 ნიშნáƒáƒ•áƒ¡, რáƒáƒ› áƒáƒ  შეიცვლებáƒ)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის ეპáƒáƒ¥áƒ¡áƒ˜ დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force ნáƒáƒ«áƒáƒšáƒáƒ“ევი გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE áƒáƒ®áƒáƒšáƒ˜ WAL-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID შემდეგი დრუძველესი მულტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ების დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ áƒ”შე. უბრáƒáƒšáƒáƒ“ ნáƒáƒ©áƒ•áƒ”ნები იქნებáƒ, რრმáƒáƒ®áƒ“ებáƒáƒ“áƒ\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID შემდეგი OID-ის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრშემდეგი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID უძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=ზáƒáƒ›áƒ WAL სეგმენტების ზáƒáƒ›áƒ, მეგáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu"
diff --git a/src/bin/pg_resetwal/po/ko.po b/src/bin/pg_resetwal/po/ko.po
new file mode 100644
index 0000000..64d8a8f
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ko.po
@@ -0,0 +1,670 @@
+# Korean message translation file for PostgreSQL pg_resetxlog
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:50+0000\n"
+"PO-Revision-Date: 2023-09-08 16:10+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean Team <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "ìƒì†ëœ 토í°ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" 명령용 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "ìƒì†ëœ 토í°ìœ¼ë¡œ 재실행할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "트랜잭션 ID epoch (-e) ê°’ì€ -1ì´ ì•„ë‹ˆì—¬ì•¼í•¨"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ì œì¼ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ ID (-u)는 %u 보다 í¬ê±°ë‚˜ 같아야 함"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "트랜잭션 ID (-x)는 %u 보다 í¬ê±°ë‚˜ 같아야 함"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "-c 옵션으로 지정한 트랜잭션 ID는 0ì´ê±°ë‚˜ 2ì´ìƒì´ì–´ì•¼ 함"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "멀티트랜잭션 ID (-m) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ì œì¼ ì˜¤ëž˜ëœ ë©€í‹°íŠ¸ëžœìž­ì…˜ ID (-m) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "멀티트랜잭션 옵셋 (-O) ê°’ì€ -1ì´ ì•„ë‹ˆì—¬ì•¼í•¨"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize ê°’ì€ ìˆ«ìžì—¬ì•¼ 합니다"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize ê°’ì€ 1부터 1024ì‚¬ì´ 2^n ê°’ì´ì–´ì•¼ 합니다"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "ë°ì´í„° 디렉터리를 지정하지 않았ìŒ"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" 계정으로는 실행 í•  수 ì—†ìŒ"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQL superuserë¡œ %s í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì‹­ì‹œì˜¤."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "\"%s\" 잠금 파ì¼ì´ 있ìŒ"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr ""
+"서버가 ê°€ë™ì¤‘ì¸ê°€ìš”? 그렇지 않다면, ì´ íŒŒì¼ì„ 지우고 다시 ì‹œë„하십시오."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"ì´ ì„¤ì •ê°’ë“¤ì´ íƒ€ë‹¹í•˜ë‹¤ê³  íŒë‹¨ë˜ë©´, 강제로 갱신하려면, -f ì˜µì…˜ì„ ì“°ì„¸ìš”.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"ì´ ë°ì´í„°ë² ì´ìŠ¤ 서버는 ì •ìƒì ìœ¼ë¡œ 중지ë˜ì§€ 못했습니다.\n"
+"트랜잭션 로그를 다시 설정하는 ê²ƒì€ ìžë£Œ ì†ì‹¤ì„ 야기할 수 있습니다.\n"
+"그럼ì—ë„ ë¶ˆêµ¬í•˜ê³  진행하려면, -f ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ ê°•ì œ ì„¤ì •ì„ í•˜ì‹­ì‹œì˜¤.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "트랜잭션 로그 재설정\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "\"%s\" 파ì¼ì€ 예ìƒì¹˜ 않게 비었ìŒ"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "ìž˜ëª»ëœ ë²„ì „ì˜ ë°ì´í„° 디렉터리입니다."
+
+#: pg_resetwal.c:536
+#, c-format
+msgid ""
+"File \"%s\" contains \"%s\", which is not compatible with this program's "
+"version \"%s\"."
+msgstr "\"%s\" íŒŒì¼ ë²„ì „ì€ \"%s\", ì´ í”„ë¡œê·¸ëž¨ ë²„ì „ì€ \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"지정한 ë°ì´í„° 디렉터리가 맞다면, ë‹¤ìŒ ëª…ë ¹ì„ ì‹¤í–‰í•˜ê³ , 다시 ì‹œë„í•´\n"
+"보십시오.\n"
+" touch %s"
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control 파ì¼ì´ 있지만, CRCê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤; 경고와 함께 진행함"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid ""
+"pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural ""
+"pg_control specifies invalid WAL segment size (%d bytes); proceed with "
+"caution"
+msgstr[0] ""
+"pg_control 파ì¼ì— ìž˜ëª»ëœ WAL ì¡°ê° íŒŒì¼ í¬ê¸°(%d ë°”ì´íŠ¸)ê°€ 지정ë¨; 경고와 함께 "
+"진행함"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control 파ì¼ì´ 있지만, ì†ìƒë˜ì—ˆê±°ë‚˜ ë²„ì „ì„ ì•Œ 수 ì—†ìŒ; 무시함"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"ì¶”ì¸¡ëœ pg_control 설정값들:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"현재 pg_control 설정값들:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 버전 번호: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "카탈로그 버전 번호: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 시스템 ì‹ë³„ìž: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ TimeLineID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "off"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "on"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ XID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ XIDì˜ DB:%u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ ActiveXID:%u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ MultiXid:%u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ MultiXidì˜ DB:%u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ CommitTsXid:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "마지막 ì²´í¬í¬ì¸íŠ¸ 최신 CommitTsXid: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "최대 ìžë£Œ ì •ë ¬: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ë¸”ë¡ í¬ê¸°: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "대형 릴레ì´ì…˜ì˜ 세그먼트당 블럭 갯수: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL ë¸”ë¡ í¬ê¸°: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WAL ì„¸ê·¸ë¨¼íŠ¸ì˜ í¬ê¸°(byte): %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "ì‹ë³„ìž ìµœëŒ€ 길ì´: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "ì¸ë±ìŠ¤ì—ì„œ 사용하는 최대 ì—´ 수: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST ì²­í¬ì˜ 최대 í¬ê¸°: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "대형ê°ì²´ ì²­í¬ì˜ 최대 í¬ê¸°: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "날짜/시간형 ìžë£Œì˜ 저장방ì‹: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-비트 정수"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 ì¸ìˆ˜ 전달: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "참조별"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "값별"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "ë°ì´í„° 페ì´ì§€ ì²´í¬ì„¬ 버전: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"ë³€ê²½ë  ê°’:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "리셋 뒤 첫 로그 세그먼트: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMultiXidì˜ DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXIDì˜ DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "ì œì¼ ì˜¤ëž˜ëœ CommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "최근 CommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync 오류: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL 트랜잭션 로그를 다시 설정합니다.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"사용법:\n"
+" %s [옵션]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions "
+"bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" 커밋 타임스탬프를 사용할 최소,최대 트랜잭"
+"ì…˜\n"
+" ID ê°’ (0ì´ë©´ 바꾸지 ì•ŠìŒ)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR ë°ì´í„° 디렉터리\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH ë‹¤ìŒ íŠ¸ëž™ìž­ì…˜ ID epoch 지정\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 강제로 갱신함\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid ""
+" -l, --next-wal-file=WALFILE set minimum starting location for new "
+"WAL\n"
+msgstr ""
+" -l, --next-wal-file=WALFILE 새 트랜잭션 로그를 위한 WAL 최소 시작 위치"
+"를 강제로 지정\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID ë‹¤ìŒ ì œì¼ ì˜¤ëž˜ëœ ë©€í‹°íŠ¸ëžœìž­ì…˜ ID 지정\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid ""
+" -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run 갱신하지 ì•ŠìŒ, 컨트롤 ê°’ë“¤ì„ ë³´ì—¬ì£¼ê¸°ë§Œ "
+"함\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID ë‹¤ìŒ OID 지정\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET ë‹¤ìŒ ë©€í‹°íŠ¸ëžœìž­ì…˜ 옵셋 지정\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID ì œì¼ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ ID 지정\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID ë‹¤ìŒ íŠ¸ëžœìž­ì…˜ ID 지정\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL ì¡°ê° íŒŒì¼ í¬ê¸°, MB 단위\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 표시하고 종료\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build
new file mode 100644
index 0000000..fa75d28
--- /dev/null
+++ b/src/bin/pg_resetwal/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_resetwal-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_resetwal/po/pl.po b/src/bin/pg_resetwal/po/pl.po
new file mode 100644
index 0000000..d87214b
--- /dev/null
+++ b/src/bin/pg_resetwal/po/pl.po
@@ -0,0 +1,626 @@
+# pg_resetxlog message translation file for pg_resetxlog
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetxlog (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2016-07-03 03:14+0000\n"
+"PO-Revision-Date: 2016-07-03 17:54+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/restricted_token.c:68
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: OSTRZEŻENIE nie można tworzyć ograniczonych tokenów na tej platformie\n"
+
+#: ../../common/restricted_token.c:77
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: nie można otworzyć tokenu procesu: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:90
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: nie udało się przydzielić SIDów: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: nie udało się utworzyć ograniczonego tokena: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:132
+#, c-format
+msgid "%s: could not start process for command \"%s\": error code %lu\n"
+msgstr "%s: nie udało się uruchomić procesu dla polecenia \"%s\": kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:170
+#, c-format
+msgid "%s: could not re-execute with restricted token: error code %lu\n"
+msgstr "%s: nie udało się ponownie wykonać ograniczonego tokena: %lu\n"
+
+#: ../../common/restricted_token.c:186
+#, c-format
+msgid "%s: could not get exit code from subprocess: error code %lu\n"
+msgstr "%s: nie udało uzyskać kodu wyjścia z usługi podrzędnej: kod błędu %lu\n"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetxlog.c:140 pg_resetxlog.c:155 pg_resetxlog.c:170 pg_resetxlog.c:177
+#: pg_resetxlog.c:201 pg_resetxlog.c:216 pg_resetxlog.c:224 pg_resetxlog.c:250
+#: pg_resetxlog.c:264
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: niepoprawny argument dla opcji %s\n"
+
+#: pg_resetxlog.c:141 pg_resetxlog.c:156 pg_resetxlog.c:171 pg_resetxlog.c:178
+#: pg_resetxlog.c:202 pg_resetxlog.c:217 pg_resetxlog.c:225 pg_resetxlog.c:251
+#: pg_resetxlog.c:265 pg_resetxlog.c:272 pg_resetxlog.c:285 pg_resetxlog.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_resetxlog.c:146
+#, c-format
+msgid "%s: transaction ID epoch (-e) must not be -1\n"
+msgstr "%s: epoka ID transakcji (-e) nie może być -1\n"
+
+#: pg_resetxlog.c:161
+#, c-format
+msgid "%s: transaction ID (-x) must not be 0\n"
+msgstr "%s: ID transakcji (-x) nie może być 0\n"
+
+#: pg_resetxlog.c:185 pg_resetxlog.c:192
+#, c-format
+msgid "%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"
+msgstr "%s: ID transakcji (-c) musi być albo 0 albo większa lub równa 2\n"
+
+#: pg_resetxlog.c:207
+#, c-format
+msgid "%s: OID (-o) must not be 0\n"
+msgstr "%s: OID (-o) nie może być 0\n"
+
+#: pg_resetxlog.c:230
+#, c-format
+msgid "%s: multitransaction ID (-m) must not be 0\n"
+msgstr "%s: ID multitransakcji (-m) nie może być 0\n"
+
+#: pg_resetxlog.c:240
+#, c-format
+msgid "%s: oldest multitransaction ID (-m) must not be 0\n"
+msgstr "%s: najstarszy ID multitransakcji (-m) nie może być 0\n"
+
+#: pg_resetxlog.c:256
+#, c-format
+msgid "%s: multitransaction offset (-O) must not be -1\n"
+msgstr "%s: offset multitransakcji (-O) nie może być -1\n"
+
+#: pg_resetxlog.c:283
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_resetxlog.c:292
+#, c-format
+msgid "%s: no data directory specified\n"
+msgstr "%s: katalog danych nie został ustawiony\n"
+
+#: pg_resetxlog.c:306
+#, c-format
+msgid "%s: cannot be executed by \"root\"\n"
+msgstr "%s: nie może być wykonywane pod \"rootem\"\n"
+
+#: pg_resetxlog.c:308
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "Musisz uruchomić %s jako superużytkownik PostgreSQL.\n"
+
+#: pg_resetxlog.c:318
+#, c-format
+msgid "%s: could not change directory to \"%s\": %s\n"
+msgstr "%s: nie można zmienić katalogu na \"%s\": %s\n"
+
+#: pg_resetxlog.c:331 pg_resetxlog.c:477
+#, c-format
+msgid "%s: could not open file \"%s\" for reading: %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\" do odczytu: %s\n"
+
+#: pg_resetxlog.c:338
+#, c-format
+msgid ""
+"%s: lock file \"%s\" exists\n"
+"Is a server running? If not, delete the lock file and try again.\n"
+msgstr ""
+"%s: plik blokady \"%s\" istnieje\n"
+"Czy serwer działa? Jeśli nie, usuń plik blokady i spróbuj ponownie.\n"
+
+#: pg_resetxlog.c:425
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Jeśli te wartości wydają się do przyjęcia, użyj -f by wymusić reset.\n"
+
+#: pg_resetxlog.c:437
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the transaction log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Serwer bazy danych nie został poprawnie zamknięty.\n"
+"Zresetowanie dziennika transakcji może spowodować utratę danych.\n"
+"Jeśli chcesz kontynuować, użyj -f, aby wymusić reset.\n"
+
+#: pg_resetxlog.c:451
+#, c-format
+msgid "Transaction log reset\n"
+msgstr "Reset dziennika transakcji\n"
+
+#: pg_resetxlog.c:480
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again.\n"
+msgstr ""
+"Jeśli jesteś pewien, że ścieżka folder u jest poprawna, wykonaj\n"
+" touch %s\n"
+"i spróbuj ponownie.\n"
+
+#: pg_resetxlog.c:493
+#, c-format
+msgid "%s: could not read file \"%s\": %s\n"
+msgstr "%s: nie można odczytać z pliku \"%s\": %s\n"
+
+#: pg_resetxlog.c:516
+#, c-format
+msgid "%s: pg_control exists but has invalid CRC; proceed with caution\n"
+msgstr "%s: pg_control istnieje ale ma niepoprawne CRC; postępuj ostrożnie\n"
+
+#: pg_resetxlog.c:525
+#, c-format
+msgid "%s: pg_control exists but is broken or unknown version; ignoring it\n"
+msgstr "%s: pg_control istnieje ale jest uszkodzony lub ma nieznanÄ… wersjÄ™, zignorowano\n"
+
+#: pg_resetxlog.c:628
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Odgadnięte wartości pg_control:\n"
+"\n"
+
+#: pg_resetxlog.c:630
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Bieżące wartości pg_control:\n"
+"\n"
+
+#: pg_resetxlog.c:639
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control w wersji numer: %u\n"
+
+#: pg_resetxlog.c:641
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalog w wersji numer: %u\n"
+
+#: pg_resetxlog.c:643
+#, c-format
+msgid "Database system identifier: %s\n"
+msgstr "Identyfikator systemu bazy danych: %s\n"
+
+#: pg_resetxlog.c:645
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:647
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes najnowszego punktu kontrolnego: %s\n"
+
+#: pg_resetxlog.c:648
+msgid "off"
+msgstr "wyłączone"
+
+#: pg_resetxlog.c:648
+msgid "on"
+msgstr "włączone"
+
+#: pg_resetxlog.c:649
+#, c-format
+#| msgid "Latest checkpoint's NextXID: %u/%u\n"
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID najnowszego punktu kontrolnego: %u:%u\n"
+
+#: pg_resetxlog.c:652
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:654
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:656
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:658
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:660
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB oldestXID'u najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:662
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "NextXID najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:664
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:666
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB oldestMulti'u najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:668
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:670
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid najnowszego punktu kontrolnego: %u\n"
+
+#: pg_resetxlog.c:672
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maksymalne wyrównanie danych: %u\n"
+
+#: pg_resetxlog.c:675
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Wielkość bloku bazy danych: %u\n"
+
+#: pg_resetxlog.c:677
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Bloki na segment sÄ… w relacji: %u\n"
+
+#: pg_resetxlog.c:679
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Wielkość bloku WAL: %u\n"
+
+#: pg_resetxlog.c:681
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bajtów na segment WAL: %u\n"
+
+#: pg_resetxlog.c:683
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maksymalna długość identyfikatorów: %u\n"
+
+#: pg_resetxlog.c:685
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maksymalna liczba kolumn w indeksie: %u\n"
+
+#: pg_resetxlog.c:687
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maksymalny rozmiar fragmentu TOAST: %u\n"
+
+#: pg_resetxlog.c:689
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Rozmiar fragmentu dużego obiektu: %u\n"
+
+#: pg_resetxlog.c:691
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Typ przechowywania daty/czasu: %s\n"
+
+#: pg_resetxlog.c:692
+msgid "64-bit integers"
+msgstr "64-bit'owe zmienne integer"
+
+#: pg_resetxlog.c:692
+msgid "floating-point numbers"
+msgstr "liczby zmiennoprzecinkowe"
+
+#: pg_resetxlog.c:693
+#, c-format
+msgid "Float4 argument passing: %s\n"
+msgstr "Przekazywanie parametru float4: %s\n"
+
+#: pg_resetxlog.c:694 pg_resetxlog.c:696
+msgid "by reference"
+msgstr "przez referencjÄ™"
+
+#: pg_resetxlog.c:694 pg_resetxlog.c:696
+msgid "by value"
+msgstr "przez wartość"
+
+#: pg_resetxlog.c:695
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Przekazywanie parametru float8: %s\n"
+
+#: pg_resetxlog.c:697
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Suma kontrolna strony danych w wersji numer: %u\n"
+
+#: pg_resetxlog.c:711
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Wartości do zmiany:\n"
+"\n"
+
+#: pg_resetxlog.c:714
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Pierwszy segment dziennika po resecie: %s\n"
+
+#: pg_resetxlog.c:718
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetxlog.c:720
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetxlog.c:722
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB OldestMulti'u: %u\n"
+
+#: pg_resetxlog.c:728
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetxlog.c:734
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetxlog.c:740
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetxlog.c:742
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetxlog.c:744
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB OldestXIDu: %u\n"
+
+#: pg_resetxlog.c:750
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoka NextXID: %u\n"
+
+#: pg_resetxlog.c:756
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetxlog.c:761
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetxlog.c:827
+#, c-format
+msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+msgstr "%s: błąd wewnętrzny -- sizeof(ControlFileData) jest zbyt duża ... popraw PG_CONTROL_SIZE\n"
+
+#: pg_resetxlog.c:842
+#, c-format
+msgid "%s: could not create pg_control file: %s\n"
+msgstr "%s: nie można utworzyć pliku pg_control: %s\n"
+
+#: pg_resetxlog.c:853
+#, c-format
+msgid "%s: could not write pg_control file: %s\n"
+msgstr "%s: nie można pisać do pliku pg_control: %s\n"
+
+#: pg_resetxlog.c:860 pg_resetxlog.c:1156
+#, c-format
+msgid "%s: fsync error: %s\n"
+msgstr "%s: błąd fsync: %s\n"
+
+#: pg_resetxlog.c:900 pg_resetxlog.c:971 pg_resetxlog.c:1022
+#, c-format
+msgid "%s: could not open directory \"%s\": %s\n"
+msgstr "%s: nie można otworzyć katalogu \"%s\": %s\n"
+
+#: pg_resetxlog.c:936 pg_resetxlog.c:993 pg_resetxlog.c:1047
+#, c-format
+msgid "%s: could not read directory \"%s\": %s\n"
+msgstr "%s: nie można odczytać katalogu \"%s\": %s\n"
+
+#: pg_resetxlog.c:943 pg_resetxlog.c:1000 pg_resetxlog.c:1054
+#, c-format
+msgid "%s: could not close directory \"%s\": %s\n"
+msgstr "%s: nie można zamknąć katalogu \"%s\": %s\n"
+
+#: pg_resetxlog.c:984 pg_resetxlog.c:1038
+#, c-format
+msgid "%s: could not delete file \"%s\": %s\n"
+msgstr "%s: nie można usunąć pliku \"%s\": %s\n"
+
+#: pg_resetxlog.c:1123
+#, c-format
+msgid "%s: could not open file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku \"%s\": %s\n"
+
+#: pg_resetxlog.c:1134 pg_resetxlog.c:1148
+#, c-format
+msgid "%s: could not write file \"%s\": %s\n"
+msgstr "%s: nie można zapisać pliku \"%s\": %s\n"
+
+#: pg_resetxlog.c:1167
+#, c-format
+msgid ""
+"%s resets the PostgreSQL transaction log.\n"
+"\n"
+msgstr ""
+"%s resetuje log transakcji PostgreSQL.\n"
+"\n"
+
+#: pg_resetxlog.c:1168
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Sposób użycia:\n"
+" %s [OPCJA]... FOLDERDANYCH\n"
+"\n"
+
+#: pg_resetxlog.c:1169
+#, c-format
+msgid "Options:\n"
+msgstr "Opcje:\n"
+
+#: pg_resetxlog.c:1170
+#, c-format
+msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n"
+msgstr " -c XID,XID ustawia najstarszy i najświeższy znacznik czasu wykonywanego zatwierdzenia\n"
+
+#: pg_resetxlog.c:1171
+#, c-format
+msgid " (zero in either value means no change)\n"
+msgstr " (zero w obu wartościach oznacza brak zmian)\n"
+
+#: pg_resetxlog.c:1172
+#, c-format
+msgid " [-D] DATADIR data directory\n"
+msgstr " [-D] DATADIR folder bazy danych\n"
+
+#: pg_resetxlog.c:1173
+#, c-format
+msgid " -e XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e XIDEPOCH ustawia epokę ID następnej transakcji\n"
+
+#: pg_resetxlog.c:1174
+#, c-format
+msgid " -f force update to be done\n"
+msgstr " -f wymusza wykonanie modyfikacji\n"
+
+#: pg_resetxlog.c:1175
+#, c-format
+msgid " -l XLOGFILE force minimum WAL starting location for new transaction log\n"
+msgstr " -l XLOGFILE wymusza minimalne położenie początkowe WAL dla nowego komunikatu transakcji\n"
+
+#: pg_resetxlog.c:1176
+#, c-format
+msgid " -m MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m XID,MXID ustawia ID następnej i najstarszej multitransakcji\n"
+
+#: pg_resetxlog.c:1177
+#, c-format
+msgid " -n no update, just show what would be done (for testing)\n"
+msgstr " -n bez modyfikacji, po prostu wyświetl co będzie zrobione (do testowania)\n"
+
+#: pg_resetxlog.c:1178
+#, c-format
+msgid " -o OID set next OID\n"
+msgstr " -o OID ustawia następny OID\n"
+
+#: pg_resetxlog.c:1179
+#, c-format
+msgid " -O OFFSET set next multitransaction offset\n"
+msgstr " -O OFFSET ustawia następny offset multitransakcji\n"
+
+#: pg_resetxlog.c:1180
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version wypisuje informacje o wersji i kończy\n"
+
+#: pg_resetxlog.c:1181
+#, c-format
+msgid " -x XID set next transaction ID\n"
+msgstr " -x XID ustawia ID następnej transakcji\n"
+
+#: pg_resetxlog.c:1182
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokazuje ten ekran pomocy i kończy\n"
+
+#: pg_resetxlog.c:1183
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: niepoprawny argument dla opcji -x\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: niepoprawny argument dla opcji -o\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: niepoprawny argument dla opcji -m\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: niepoprawny argument dla opcji -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: niepoprawny argument dla opcji -l\n"
+
+#~ msgid "%s: could not read from directory \"%s\": %s\n"
+#~ msgstr "%s: nie można odczytać katalogu \"%s\": %s\n"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "Pierwszy plik dziennika po resecie: %u\n"
diff --git a/src/bin/pg_resetwal/po/pt_BR.po b/src/bin/pg_resetwal/po/pt_BR.po
new file mode 100644
index 0000000..a9f84a5
--- /dev/null
+++ b/src/bin/pg_resetwal/po/pt_BR.po
@@ -0,0 +1,657 @@
+# Brazilian Portuguese message translation file for pg_resetwal
+#
+# Copyright (C) 2002-2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Cesar Suga <sartre@linuxbr.com>, 2002.
+# Roberto Mello <rmello@fslc.usu.edu>, 2002.
+# Euler Taveira <euler@eulerto.com>, 2003-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 13:01-0300\n"
+"PO-Revision-Date: 2022-09-27 20:17-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "não pôde abrir informação sobre processo: código de erro %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "não pôde alocar SIDs: código de erro %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "não pôde criar informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "não pôde iniciar processo para comando \"%s\": código de erro %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "não pôde executar novamente com informação restrita: código de erro %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "não pôde obter código de saída de subprocesso: código de erro %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento inválido para opção %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "época do ID da transação (-e) não deve ser -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ID de transação mais antigo (-u) deve ser maior ou igual a %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ID de transação (-x) deve ser maior ou igual a %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID de transação (-c) deve ser 0 ou maior ou igual a 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) não deve ser 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID de transação múltipla (-m) não deve ser 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ID de transação múltipla mais antigo (-m) não deve ser 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "posição da transação múltipla (-O) não deve ser -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumento de --wal-segsize deve ser um número"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "argumento de --wal-segsize deve ser uma potência de dois entre 1 e 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "não pode ser executado como \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Você deve executar %s como um super-usuário do PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "não pôde ler permissões do diretório \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "não pôde mudar diretório para \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "arquivo de bloqueio \"%s\" existe"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "O servidor está executando? Se não, remova o arquivo de bloqueio e tente novamente."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Se estes valores lhe parecem aceitáveis, use -f para forçar o reinício.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"O servidor de banco de dados não foi desligado corretamente.\n"
+"Reiniciar o log de transação pode causar perda de dados.\n"
+"Se você quer continuar mesmo assim, use -f para forçar o reinício.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Reinício do log de transação\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "arquivo vazio \"%s\" inesperado"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "não pôde ler arquivo \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "diretório de dados é de versão incorreta"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Arquivo \"%s\" contém \"%s\", que não é compatível com esta versão do programa \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Se você tem certeza que o caminho do diretório de dados está correto, execute\n"
+" touch %s\n"
+"e tente novamente."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existe mas tem CRC inválido; prossiga com cuidado"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control especifica tamanho de segmento do WAL inválido (%d byte); prossiga com cuidado"
+msgstr[1] "pg_control especifica tamanho de segmento do WAL inválido (%d bytes); prossiga com cuidado"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existe mas não funciona ou sua versão é desconhecida; ignorando-o"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Valores supostos do pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Valores atuais do pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "número da versão do pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Número da versão do catálogo: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Identificador do sistema de banco de dados: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "full_page_writes do último ponto de controle: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "desabilitado"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "habilitado"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID do último ponto de controle: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "BD do oldestXID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "BD do oldestMulti do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid do último ponto de controle: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Máximo alinhamento de dado: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Tamanho do bloco do banco de dados: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Blocos por segmento da relação grande: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Tamanho do bloco do WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Bytes por segmento do WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Tamanho máximo de identificadores: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Máximo de colunas em um índice: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Tamanho máximo do bloco TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Tamanho máximo do bloco de objeto grande: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tipo de data/hora do repositório: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "inteiros de 64 bits"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Passagem de argumento float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "por referência"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "por valor"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Versão da verificação de páginas de dados: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Valores a serem alterados:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Primeiro segmento do arquivo de log após reinício: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "BD do OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "BD do OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "época do NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "não pôde ler diretório \"%s\": %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "não pôde fechar diretório \"%s\": %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "não pôde excluir arquivo \"%s\": %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "não pôde escrever no arquivo \"%s\": %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "erro ao executar fsync: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s reinicia o log de transação do PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPÇÃO]... DIRDADOS\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" define as transações mais antiga e mais nova\n"
+" timestamp de efetivação (zero significa nenhuma mudança)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=ÉPOCA_XID define próxima época do ID de transação\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force força atualização ser feita\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=ARQUIVOWAL define local inicial mínimo do WAL para novo log de transação\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID define próximo e mais velho ID de multitransação\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run sem atualização, mostra o que seria feito\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID define próximo OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=POSIÇÃO define próxima posição de multitransação\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID define ID de transação mais antigo\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID define próximo ID de transação\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
diff --git a/src/bin/pg_resetwal/po/ru.po b/src/bin/pg_resetwal/po/ru.po
new file mode 100644
index 0000000..5f012f9
--- /dev/null
+++ b/src/bin/pg_resetwal/po/ru.po
@@ -0,0 +1,786 @@
+# Russian message translation file for pg_resetxlog
+# Copyright (C) 2002-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2002-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2009.
+# Dmitriy Olshevskiy <olshevskiy87@bk.ru>, 2014.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetxlog (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 15:31+0300\n"
+"PO-Revision-Date: 2023-09-11 16:14+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "недопуÑтимый аргумент параметра %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "Ñпоха ID транзакции (-e) не должна быть равна -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "ID Ñтарейшей транзакции (-u) должен быть больше или равен %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ID транзакции (-x) должен быть больше или равен %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID транзакции (-c) должен быть равен 0, либо больше или равен 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) не должен быть равен 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID мультитранзакции (-m) не должен быть равен 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "ID Ñтарейшей мультитранзакции (-m) не должен быть равен 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "Ñмещение мультитранзакции (-O) не должно быть равно -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргументом --wal-segsize должно быть чиÑло"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "аргументом --wal-segsize должна быть Ñтепень двух от 1 до 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "программу не должен запуÑкать root"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "ЗапуÑкать %s нужно от имени ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "файл блокировки \"%s\" ÑущеÑтвует"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr ""
+"Возможно, Ñервер запущен? ЕÑли нет, удалите Ñтот файл и попробуйте Ñнова."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"ЕÑли Ñти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹, выполните ÑÐ±Ñ€Ð¾Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾, добавив ключ -"
+"f.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Сервер баз данных был оÑтановлен некорректно.\n"
+"Ð¡Ð±Ñ€Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° предзапиÑи может привеÑти к потере данных.\n"
+"ЕÑли вы хотите ÑброÑить его, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто, добавьте ключ -f.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Журнал предзапиÑи Ñброшен\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "файл \"%s\" оказалÑÑ Ð¿ÑƒÑтым"
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "каталог данных имеет неверную верÑию"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid ""
+"File \"%s\" contains \"%s\", which is not compatible with this program's "
+"version \"%s\"."
+msgstr ""
+"Файл \"%s\" Ñодержит Ñтроку \"%s\", а ожидаетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"ЕÑли вы уверены, что путь к каталогу данных правильный, выполните\n"
+" touch %s\n"
+"и повторите попытку."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr ""
+"pg_control ÑущеÑтвует, но его ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма неверна; продолжайте Ñ "
+"оÑторожноÑтью"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid ""
+"pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural ""
+"pg_control specifies invalid WAL segment size (%d bytes); proceed with "
+"caution"
+msgstr[0] ""
+"в pg_control указан некорректный размер Ñегмента WAL (%d Б); продолжайте Ñ "
+"оÑторожноÑтью"
+msgstr[1] ""
+"в pg_control указан некорректный размер Ñегмента WAL (%d Б); продолжайте Ñ "
+"оÑторожноÑтью"
+msgstr[2] ""
+"в pg_control указан некорректный размер Ñегмента WAL (%d Б); продолжайте Ñ "
+"оÑторожноÑтью"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr ""
+"pg_control иÑпорчен или имеет неизвеÑтную либо недопуÑтимую верÑию; "
+"игнорируетÑÑ..."
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Предполагаемые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Текущие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Ðомер верÑии pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Ðомер верÑии каталога: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Идентификатор ÑиÑтемы баз данных: %llu\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ поÑледней конт. точки: %u\n"
+
+# skip-rule: no-space-after-period
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Режим full_page_writes поÑледней к.Ñ‚: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "выкл."
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "вкл."
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID поÑледней конт. точки: %u:%u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId поÑлед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset поÑлед. конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "БД Ñ oldestXID поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: capital-letter-first
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid поÑледней конт. точки: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "БД Ñ oldestMulti поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid поÑледней к. Ñ‚.: %u\n"
+
+# skip-rule: capital-letter-first, double-space
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid поÑледней к. Ñ‚.: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "МакÑ. предел Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Размер блока БД: %u\n"
+
+# skip-rule: double-space
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоков в макÑ. Ñегменте отношений: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Размер блока WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байт в Ñегменте WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификаторов: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "МакÑ. чиÑло Ñтолбцов в индекÑе: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "МакÑимальный размер порции TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Размер порции большого объекта: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-битные целые"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргумента float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "по ÑÑылке"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "по значению"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм Ñтраниц: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"ЗначениÑ, которые будут изменены:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Первый Ñегмент журнала поÑле ÑброÑа: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "БД Ñ oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "БД Ñ oldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Эпоха NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "ошибка Ñинхронизации Ñ Ð¤Ð¡: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s ÑбраÑывает журнал предзапиÑи PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"ИÑпользование:\n"
+" %s [ПÐРÐМЕТР]... КÐТ_ДÐÐÐЫХ\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions "
+"bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" задать Ñтарейшую и новейшую транзакции,\n"
+" неÑущие метки времени (0 — не менÑÑ‚ÑŒ)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КÐТ_ДÐÐÐЫХ каталог данных\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr ""
+" -e, --epoch=XIDEPOCH задать Ñпоху Ð´Ð»Ñ ID Ñледующей транзакции\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr ""
+" -f, --force принудительное выполнение операции\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid ""
+" -l, --next-wal-file=WALFILE set minimum starting location for new "
+"WAL\n"
+msgstr ""
+" -l, --next-wal-file=ФÐЙЛ_WAL задать минимальное начальное положение\n"
+" Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ WAL\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid ""
+" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr ""
+" -m, --multixact-ids=MXID,MXID задать ID Ñледующей и Ñтарейшей\n"
+" мультитранзакции\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid ""
+" -n, --dry-run no update, just show what would be done\n"
+msgstr ""
+" -n, --dry-run показать, какие дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ "
+"выполнены,\n"
+" но не выполнÑÑ‚ÑŒ их\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID задать Ñледующий OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr ""
+" -O, --multixact-offset=СМЕЩЕÐИЕ задать Ñмещение Ñледующей "
+"мультитранзакции\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID задать ID Ñтарейшей ID\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID задать ID Ñледующей транзакции\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr ""
+" --wal-segsize=РÐЗМЕР размер Ñегментов WAL (в мегабайтах)\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "transaction ID (-x) must not be 0"
+#~ msgstr "ID транзакции (-x) не должен быть равен 0"
+
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Передача аргумента Float4: %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ Ñоздать файл pg_control: %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ запиÑать файл pg_control: %s\n"
+
+#~ msgid ""
+#~ " -c XID,XID set oldest and newest transactions bearing commit "
+#~ "timestamp\n"
+#~ msgstr ""
+#~ " -c XID,XID задать Ñтарейшую и новейшую транзакции, неÑущие метку "
+#~ "времени фикÑации\n"
+
+#~ msgid " (zero in either value means no change)\n"
+#~ msgstr " (0 в любом из аргументов игнорируетÑÑ)\n"
+
+#~ msgid ""
+#~ "%s: internal error -- sizeof(ControlFileData) is too large ... fix "
+#~ "PG_CONTROL_SIZE\n"
+#~ msgstr ""
+#~ "%s: внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° -- размер ControlFileData Ñлишком велик -- "
+#~ "иÑправьте PG_CONTROL_SIZE\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "чиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: недопуÑтимый аргумент параметра -x\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: недопуÑтимый аргумент параметра -o\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: недопуÑтимый аргумент параметра -m\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: недопуÑтимый аргумент параметра -O\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: недопуÑтимый аргумент параметра -l\n"
+
+#~ msgid " -m XID,OLDEST set next multitransaction ID and oldest value\n"
+#~ msgstr ""
+#~ " -m XID,СТÐРЕЙШÐЯ задать ID Ñледующей мультитранзакции и ID Ñтарейшей\n"
+
+#~ msgid "disabled"
+#~ msgstr "отключен"
+
+#~ msgid "enabled"
+#~ msgstr "включен"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "ID первого журнала поÑле ÑброÑа: %u\n"
diff --git a/src/bin/pg_resetwal/po/sv.po b/src/bin/pg_resetwal/po/sv.po
new file mode 100644
index 0000000..7bf463e
--- /dev/null
+++ b/src/bin/pg_resetwal/po/sv.po
@@ -0,0 +1,668 @@
+# Swedish message translation file for resetxlog.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022.
+# Peter Eisentraut <peter_e@gmx.net>, 2010.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-31 19:50+0000\n"
+"PO-Revision-Date: 2023-08-31 22:00+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "kunde inte öppna process-token: felkod %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "kunde inte allokera SID: felkod %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kunde inte skapa token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "kunde inte starta process för kommando \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "kunde inte hämta statuskod för underprocess: felkod %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ogiltigt argument för flaggan %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "Epoch (-e) för transaktions-ID får inte vara -1."
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "äldsta transaktions-ID (-u) måste vara större än eller lika med %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "transaktions-ID (-x) måste vara större än eller lika med %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "transaktions-ID (-c) måste antingen vara 0 eller större än eller lika med 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) får inte vara 0."
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "Multitransaktions-ID (-m) får inte vara 0."
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "Äldsta multitransaktions-ID (-m) får inte vara 0."
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "Multitransaktionsoffset (-O) får inte vara -1."
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "argumentet till --wal-segsize måste vara ett tal"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "argumentet till --wal-segsize måste vara en tvåpotens mellan 1 och 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kan inte köras av \"root\""
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Du måste köra %s som PostgreSQL:s superuser."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "låsfil med namn \"%s\" finns redan"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Kör servern redan? Om inte, radera låsfilen och försök igen."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Om dessa värden verkar godtagbara, använd då -f för att\n"
+"framtvinga återställning.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Databasservern stängdes inte av ordentligt. Att återställa\n"
+"write-ahead-loggen kan medföra att data förloras. Om du ändå\n"
+"vill fortsätta, använd -f för att framtvinga återställning.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Återställning av write-ahead-log\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "oväntad tom fil \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "datakatalogen har fel version"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Filen \"%s\" innehåller \"%s\", vilket inte är kompatibelt med detta programmets version \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"Om du är säker på att sökvägen till datakatalogen är riktig,\n"
+"utför då \"touch %s\" och försök sedan igen."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control existerar men har ogiltig CRC. Fortsätt med varsamhet."
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet."
+msgstr[1] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet."
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control existerar men är trasig eller har fel version. Den ignoreras."
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Gissade värden för pg_control:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Nuvarande värden för pg_control:\n"
+"\n"
+
+# November 26th, 2014: Insert six additional space characters
+# for best alignment with Swedish translation.
+# Translations should be checked against those of pg_controldata.
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "Versionsnummer för pg_control: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalogversion: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "Databasens systemidentifierare: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "TimeLineID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Senaste kontrollpunktens full_page_writes: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "av"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "på"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "NextXID vid senaste kontrollpunkt: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "NextOID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "NextMultiXactId vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "NextMultiOffset vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "oldestXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "DB för oldestXID vid senaste kontrollpunkt: %u\n"
+
+# FIXME: too wide
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "oldestActiveXID vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "oldestMultiXid vid senaste kontrollpunkt: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "DB för oldestMulti vid senaste kontrollpkt: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "oldestCommitTsXid vid senaste kontrollpunkt:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "newestCommitTsXid vid senaste kontrollpunkt:%u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Maximal jämkning av data (alignment): %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Databasens blockstorlek: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Block per segment i en stor relation: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Blockstorlek i transaktionsloggen: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Segmentstorlek i transaktionsloggen: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Maximal längd för identifierare: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Maximalt antal kolonner i ett index: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "Maximal storlek för en TOAST-enhet: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Storlek för large-object-enheter: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Representation av dag och tid: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-bitars heltal"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Ã…tkomst till float8-argument: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "referens"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "värdeåtkomst"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Checksummaversion för datasidor: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Värden att förändra:\n"
+"\n"
+
+# November 26th, 2014: Insert additional spacing to fit
+# with the first translated text, which uses most characters.
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Första loggsegment efter återställning: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "DB för OldestMulti: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "DB för OldestXID: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Epoch för NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "kunde inte radera fil \"%s\": %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "misslyckad fsync: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s återställer write-ahead-log för PostgreSQL.\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Användning:\n"
+" %s [FLAGGA]... DATAKATALOG\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" sätt äldsta och nyaste transaktionerna som\n"
+" kan ha commit-tidstämpel (noll betyder\n"
+" ingen ändring)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR datakatalog\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH sätter epoch för nästa transaktions-ID\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force framtvinga uppdatering\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFIL sätt minsta startposition för ny WAL\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID sätt nästa och äldsta multitransaktions-ID\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run ingen updatering; visa bara planerade åtgärder\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID sätt nästa OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET sätt nästa multitransaktionsoffset\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID sätt äldsta transaktions-ID\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID sätt nästa transaktions-ID\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=STORLEK storlek på WAL-segment i megabyte\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "kan inte skapa token för begränsad åtkomst på denna plattorm: felkod %lu"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu"
diff --git a/src/bin/pg_resetwal/po/tr.po b/src/bin/pg_resetwal/po/tr.po
new file mode 100644
index 0000000..48b1497
--- /dev/null
+++ b/src/bin/pg_resetwal/po/tr.po
@@ -0,0 +1,751 @@
+# translation of pg_resetxlog-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006, 2007.
+# Nicolai TUFAR <ntufar@gmail.com>, 2004, 2005, 2006, 2007.
+# Abdullah GÃœLNER <agulner@gmail.com>, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetxlog-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:47+0000\n"
+"PO-Revision-Date: 2019-06-12 16:23+0300\n"
+"Last-Translator: Abdullah GÃœLNER\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"X-Poedit-Basepath: /home/ntufar/pg/pgsql/src/bin/pg_resetxlog\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/restricted_token.c:69
+#, c-format
+msgid "cannot create restricted tokens on this platform"
+msgstr "bu platformda restricted token oluşturulamıyor"
+
+#: ../../common/restricted_token.c:78
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "process token açma başarısız: hata kodu %lu"
+
+#: ../../common/restricted_token.c:91
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDler ayrılamıyor (allocate): Hata kodu %lu"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "restricted token oluşturulamıyor: hata kodu %lu"
+
+#: ../../common/restricted_token.c:131
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" komutu için işlem (process) başlatılamadı: hata kodu %lu"
+
+#: ../../common/restricted_token.c:169
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "restricted token ile tekrar çalıştırılamadı (re-execute): hata kodu %lu"
+
+#: ../../common/restricted_token.c:185
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "alt-işlemden çıkış kodu alınamadı: hata kodu %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197
+#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269
+#: pg_resetwal.c:283
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s seçeneği için geçersiz argüman"
+
+#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198
+#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270
+#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazabilirsiniz.\n"
+
+#: pg_resetwal.c:166
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "transaction ID epoch (-e) -1 olamaz"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "transaction ID (-x) must not be 0"
+msgstr "transaction ID (-x) 0 olamaz"
+
+#: pg_resetwal.c:205 pg_resetwal.c:212
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "işlem (transaction) ID (-c) ya 0 ya da 2 den büyük veya eşit olmalı"
+
+#: pg_resetwal.c:227
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) 0 olamaz"
+
+#: pg_resetwal.c:250
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "multitransaction ID (-m) 0 olamaz"
+
+#: pg_resetwal.c:260
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "en eski multitransaction ID (-m) 0 olamaz"
+
+#: pg_resetwal.c:275
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "multitransaction offset (-O) deÄŸeri -1 olamaz"
+
+#: pg_resetwal.c:299
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize argümanı bir sayı olmalıdır"
+
+#: pg_resetwal.c:304
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsize argümanı 2'nin 1 ve 1024 arasındaki bir üssü olmalıdır"
+
+#: pg_resetwal.c:321
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı argümanı var (ilki \"%s\")"
+
+#: pg_resetwal.c:330
+#, c-format
+msgid "no data directory specified"
+msgstr "veri dizini belirtilmedi"
+
+#: pg_resetwal.c:344
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" tarafından çalıştırılamaz"
+
+#: pg_resetwal.c:345
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "%s komutunu PostgreSQL superuser olarak çalıştırmalısınız."
+
+#: pg_resetwal.c:356
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "\"%s\" dizininin erişim haklarını okunamıyor: %m"
+
+#: pg_resetwal.c:365
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %m"
+
+#: pg_resetwal.c:381 pg_resetwal.c:545 pg_resetwal.c:602
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" dosyası, okunmak için açılamadı: %m"
+
+#: pg_resetwal.c:388
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "\"%s\" lock dosyası mevcuttur"
+
+#: pg_resetwal.c:389
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Bir sunucu çalışıyor mu? Eğer çalışmıyorsa, lock dosyasını silin ve yeniden deneyin."
+
+#: pg_resetwal.c:492
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"Bu değerler uygun görünüyorsa, reset zorlamak için -f kullanın.\n"
+
+#: pg_resetwal.c:504
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"Veritabanı sunucusu düzgün kapatılmadı.\n"
+"İşlem kayıt (write-ahead log) dosyasını sıfırlamak veri kaybına neden olabilir.\n"
+"Yine de devam etmek istiyorsanız, sıfırlama işlemini zorlamak için -f parametresini kullanınız.\n"
+
+#: pg_resetwal.c:518
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Write-ahead log sıfırlama\n"
+
+#: pg_resetwal.c:554
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "beklenmeyen boÅŸ dosya \"%s\""
+
+#: pg_resetwal.c:556 pg_resetwal.c:618
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" dosyası okuma hatası: %m"
+
+#: pg_resetwal.c:571
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "veri dizininin sürümü yanlış"
+
+#: pg_resetwal.c:572
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "\"%s\" dosyası \"%s\" içermekte ki bu programın \"%s\" sürümüyle uyumlu değil."
+
+#: pg_resetwal.c:605
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"EÄŸer veri dizininin doÄŸru olduÄŸuna eminseniz\n"
+" touch %s\n"
+"komutunu çalıştırın ve tekrar deneyin."
+
+#: pg_resetwal.c:636
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control mevcut ancak geçersiz CRC'ye sahip, dikkatle ilerleyin"
+
+#: pg_resetwal.c:645
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control geçersiz WAL segment boyutu belirtmekte (%d bayt); dikkatle ilerleyin"
+msgstr[1] "pg_control geçersiz WAL segment boyutu belirtmekte (%d bayt); dikkatle ilerleyin"
+
+#: pg_resetwal.c:656
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control mevcut ama ya bozuk ya da yanlış sürümde; gözardı ediliyor"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"Tahmin edilen pg_control deÄŸerleri:\n"
+"\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"Geçerli pg_control değerleri:\n"
+"\n"
+
+#: pg_resetwal.c:765
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control sürüm numarası: %u\n"
+
+#: pg_resetwal.c:767
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Katalog sürüm numarası: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Database system identifier: %s\n"
+msgstr "Veritabanı sistem tanımlayıcısı: %s\n"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "Son checkpoint''in TimeLineID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "Son checkpoint'in full_page_writes deÄŸeri: %s\n"
+
+#: pg_resetwal.c:774
+msgid "off"
+msgstr "kapalı"
+
+#: pg_resetwal.c:774
+msgid "on"
+msgstr "açık"
+
+#: pg_resetwal.c:775
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "Son checkpoint'in NextXID deÄŸeri: %u:%u\n"
+
+#: pg_resetwal.c:778
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "Son checkpoint''in NextOID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:780
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "Son checkpoint''in NextMultiXactId deÄŸeri: %u\n"
+
+#: pg_resetwal.c:782
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "Son checkpoint''in NextMultiOffset deÄŸeri: %u\n"
+
+#: pg_resetwal.c:784
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "Son checkpoint'in oldestXID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:786
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "Son checkpoint'in oldestXID deÄŸeri'nin DB'si: %u\n"
+
+#: pg_resetwal.c:788
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "Son checkpoint'in oldestActiveXID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:790
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "Son checkpoint'in oldestMultiXid deÄŸeri: %u\n"
+
+#: pg_resetwal.c:792
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "Son checkpoint'in oldestMulti'sinin VT'si: %u\n"
+
+#: pg_resetwal.c:794
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "Son checkpoint'in oldestCommitTsXid deÄŸeri: %u\n"
+
+#: pg_resetwal.c:796
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "Son checkpoint''in newestCommitTsXid deÄŸeri: %u\n"
+
+#: pg_resetwal.c:798
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "Azami veri hizalama: %u\n"
+
+#: pg_resetwal.c:801
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Veritabanı blok büyüklüğü: %u\n"
+
+#: pg_resetwal.c:803
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "büyük nesnenin bölümü başına blok sayısı: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL blok büyüklüğü: %u\n"
+
+#: pg_resetwal.c:807 pg_resetwal.c:895
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "WAL segment başına WAL bayt sayısı: %u\n"
+
+#: pg_resetwal.c:809
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "Tanımlayıcıların en yüksek sayısı: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "Bir indexteki en fazla kolon sayısı: %u\n"
+
+#: pg_resetwal.c:813
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST parçasının en büyük uzunluğu: %u\n"
+
+#: pg_resetwal.c:815
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Büyük-nesne parçasının boyutu: %u\n"
+
+#: pg_resetwal.c:818
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Tarih/zaman tipi saklanması: %s\n"
+
+#: pg_resetwal.c:819
+msgid "64-bit integers"
+msgstr "64-bit tamsayılar"
+
+#: pg_resetwal.c:820
+#, c-format
+msgid "Float4 argument passing: %s\n"
+msgstr "Float4 argument passing: %s\n"
+
+#: pg_resetwal.c:821 pg_resetwal.c:823
+msgid "by reference"
+msgstr "referans ile"
+
+#: pg_resetwal.c:821 pg_resetwal.c:823
+msgid "by value"
+msgstr "deÄŸer ils"
+
+#: pg_resetwal.c:822
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 argument passing: %s\n"
+
+#: pg_resetwal.c:824
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "Veri sayfası sağlama (checksum) sürümü: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"DeÄŸiÅŸtirilecek deÄŸerler:\n"
+"\n"
+
+#: pg_resetwal.c:842
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Sıfırlamadan sonraki ilk kayıt segmenti: %s\n"
+
+#: pg_resetwal.c:846
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId deÄŸeri: %u\n"
+
+#: pg_resetwal.c:848
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid deÄŸeri: %u\n"
+
+#: pg_resetwal.c:850
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti'nin VT'si: %u\n"
+
+#: pg_resetwal.c:856
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset deÄŸeri: %u\n"
+
+#: pg_resetwal.c:862
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:868
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:870
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID deÄŸeri: %u\n"
+
+#: pg_resetwal.c:872
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID'nin VT'si: %u\n"
+
+#: pg_resetwal.c:878
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID devri: %u\n"
+
+#: pg_resetwal.c:884
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid deÄŸeri: %u\n"
+
+#: pg_resetwal.c:889
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid deÄŸeri: %u\n"
+
+#: pg_resetwal.c:975 pg_resetwal.c:1043 pg_resetwal.c:1090
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" dizini açılamıyor: %m"
+
+#: pg_resetwal.c:1010 pg_resetwal.c:1063 pg_resetwal.c:1113
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" dizini okunamıyor: %m"
+
+#: pg_resetwal.c:1016 pg_resetwal.c:1069 pg_resetwal.c:1119
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" dizini kapatılamadı: %m"
+
+#: pg_resetwal.c:1055 pg_resetwal.c:1105
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "\"%s\" dosyası silinemedi: %m"
+
+#: pg_resetwal.c:1186
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" dosyası açılamıyor: %m"
+
+#: pg_resetwal.c:1196 pg_resetwal.c:1209
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" dosyasına yazma hatası: %m"
+
+#: pg_resetwal.c:1216
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync hatası: %m"
+
+#: pg_resetwal.c:1227
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL işlem kayıt (write-ahead log) dosyasını sıfırlar.\n"
+"\n"
+
+#: pg_resetwal.c:1228
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"Kullanımı:\n"
+" %s [SEÇENEK]... VERİ_DİZİNİ\n"
+"\n"
+
+#: pg_resetwal.c:1229
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: pg_resetwal.c:1230
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" commit timestamp taşıyan en eski ve en yeni\n"
+" işlemleri (transaction) ayarla (sıfır, değişiklik yok demek)\n"
+
+#: pg_resetwal.c:1233
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR veri dizini\n"
+
+#: pg_resetwal.c:1234
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH sonraki transaction ID epoch ayarla\n"
+
+#: pg_resetwal.c:1235
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force güncellemenin yapılmasını zorla\n"
+
+#: pg_resetwal.c:1236
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE yeni WAL için en düşük başlama yerini ayarla\n"
+
+#: pg_resetwal.c:1237
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID sonraki ve en eski multitransaction ID'sini ayarla\n"
+
+#: pg_resetwal.c:1238
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run güncelleme yok, sadece ne yapılacağını göster\n"
+
+#: pg_resetwal.c:1239
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID sonraki OID'i ayarla\n"
+
+#: pg_resetwal.c:1240
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET sonraki multitransaction offseti ayarla\n"
+
+#: pg_resetwal.c:1241
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_resetwal.c:1242
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID sonraki iÅŸlem (transaction) ID ayarla\n"
+
+#: pg_resetwal.c:1243
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL segmentlerinin boyutu, megabayt olarak\n"
+
+#: pg_resetwal.c:1244
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_resetwal.c:1245
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildiriniz.\n"
+
+#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n"
+#~ msgstr " -c XID,XID commit timestamp taşıyan en eski ve enyeni işlemleri (transaction) ayarla\n"
+
+#~ msgid " (zero in either value means no change)\n"
+#~ msgstr ""
+#~ " (her iki değerde sıfır değişiklik olmadığı anlamına gelir)\n"
+#~ "\n"
+
+#~ msgid " [-D] DATADIR data directory\n"
+#~ msgstr " [-D] DATADIR veri dizini\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V,--version sürüm numarasını yaz ve çık\n"
+
+#~ msgid " -x XID set next transaction ID\n"
+#~ msgstr " -x XID sıradaki transaction ID'sini ayarla\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help bu yardımı göster ve çık\n"
+
+#~ msgid "Maximum length of locale name: %u\n"
+#~ msgstr "Yerel adının en büyük uzunluğu: %u\n"
+
+#~ msgid "%s: invalid LC_CTYPE setting\n"
+#~ msgstr "%s: geçersiz LC_CTYPE ayarı\n"
+
+#~ msgid "%s: invalid LC_COLLATE setting\n"
+#~ msgstr "%s: Geçersiz LC_COLLATE ayarı\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "%s: could not read from directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini okunamadı: %s\n"
+
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr "%s: iç hata -- sizeof(ControlFileData) çok büyük ... PG_CONTROL_SIZE değerini düzeltiniz\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "kayan nokta sayılar"
+
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "Sıfırlamadan sonraki ilk kayıt dosyası ID'si: %u\n"
+
+#~ msgid "Transaction log reset\n"
+#~ msgstr "Transaction kayıt dosyası sıfırlandı\n"
+
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: -l seçeneği için geçersiz argüman\n"
+
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: -O seçeneği için geçersiz argüman\n"
+
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: -m seçeneği için geçersiz argüman\n"
+
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: -o seçeneği için geçersiz argüman\n"
+
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: -x seçeneği için geçersiz argüman\n"
+
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyasına yazılamadı: %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası açılamadı: %s\n"
+
+#~ msgid "%s: could not delete file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası silinemedi: %s\n"
+
+#~ msgid "%s: could not close directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini kapatılamadı: %s\n"
+
+#~ msgid "%s: could not read directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini okunamadı: %s\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizini açılamadı: %s\n"
+
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: pg_control dosyasına yazılamadı: %s\n"
+
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: pg_control dosyası yaratılamadı: %s\n"
+
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dosyası okunamadı: %s\n"
+
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: \"%s\" dosyası okunmak için açılamadı: %s\n"
+
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizine geçilemedi: %s\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizininin erişim hakları okunamadı : %s\n"
+
+#~ msgid "%s: cannot be executed by \"root\"\n"
+#~ msgstr "%s: \"root\" tarafından çalıştırılamaz\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s: process token açma başarısız: hata kodu %lu\n"
diff --git a/src/bin/pg_resetwal/po/uk.po b/src/bin/pg_resetwal/po/uk.po
new file mode 100644
index 0000000..e761d7a
--- /dev/null
+++ b/src/bin/pg_resetwal/po/uk.po
@@ -0,0 +1,624 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:19+0000\n"
+"PO-Revision-Date: 2023-12-20 11:53\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_resetwal.pot\n"
+"X-Crowdin-File-ID: 939\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s"
+
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "епоха ID транзакції (-e) не повинна бути -1"
+
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "найÑтаріший ID транзакції (-u) має бути більший або рівним %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "ID транзакції (-x) має бути більшим чи рівним %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "ID транзакції (-c) повинен дорівнювати 0, бути більшим за або дорівнювати 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) не може бути 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "ID мультитранзакції (-m) не повинен бути 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "найÑтарший ID мультитранзакції (-m) не повинен бути 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "зÑув мультитранзакції (-O) не повинен бути -1"
+
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "аргумент --wal-segsize повинен бути чиÑлом"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "аргумент --wal-segsize повинен бути Ñтупенем 2 між 1 Ñ– 1024"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" не може це виконувати"
+
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "ЗапуÑкати %s треба від ÑуперкориÑтувача PostgreSQL."
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дозволи на каталог \"%s\": %m"
+
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m"
+
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m"
+
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "Чи запущений Ñервер? Якщо ні, видаліть файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñпробуйте знову."
+
+#: pg_resetwal.c:467
+#, c-format
+msgid "\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr "\n"
+"Якщо ці Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð³Ð»Ñдають допуÑтимими, викориÑтайте -f, щоб провеÑти перевÑтановленнÑ.\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid "The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr "Сервер баз даних був зупинений некоректно.\n"
+"ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ передзапиÑу може привеÑти до втрати даних.\n"
+"Якщо ви вÑе одно хочете продовжити, викориÑтайте параметр -f.\n"
+
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Журнал передзапиÑу Ñкинуто\n"
+
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "неочікуваний порожній файл \"%s\""
+
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m"
+
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "каталог даних неправильної верÑÑ–Ñ—"
+
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "Файл \"%s\" міÑтить \"%s\", Ñкий не ÑуміÑний з верÑією цієї програми \"%s\"."
+
+#: pg_resetwal.c:569
+#, c-format
+msgid "If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr "Якщо Ви впевнені, що шлÑÑ… каталогу даних Ñ” правильним, виконайте \n"
+" touch %s\n"
+"Ñ– Ñпробуйте знову."
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control Ñ–Ñнує, але має недопуÑтимий CRC; продовжуйте з обережніÑÑ‚ÑŽ"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control вказує неприпуÑтимий розмір Ñегмента WAL (%d байт); продовжуйте з обережніÑÑ‚ÑŽ"
+msgstr[1] "pg_control вказує неприпуÑтимий розмір Ñегмента WAL (%d байти); продовжуйте з обережніÑÑ‚ÑŽ"
+msgstr[2] "pg_control вказує неприпуÑтимий розмір Ñегмента WAL (%d байтів); продовжуйте з обережніÑÑ‚ÑŽ"
+msgstr[3] "pg_control вказує неприпуÑтимий розмір Ñегмента WAL (%d байтів); продовжуйте з обережніÑÑ‚ÑŽ"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control Ñ–Ñнує, але зламаний або неправильної верÑÑ–Ñ—; ігноруєтьÑÑ"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid "Guessed pg_control values:\n\n"
+msgstr "ПрипуÑтимі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_control:\n\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid "Current pg_control values:\n\n"
+msgstr "Поточні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_control:\n\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control номер верÑÑ–Ñ—: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Ðомер верÑÑ–Ñ— каталогу: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "СиÑтемний ідентифікатор бази даних: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "ОÑтанній TimeLineID контрольної точки: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "ОÑтанній full_page_writes контрольної точки: %s\n"
+
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "вимк"
+
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "увімк"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "ОÑтанній NextXID контрольної точки: %u%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "ОÑтанній NextOID контрольної точки: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "ОÑтанній NextMultiXactId контрольної точки: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "ОÑтанній NextMultiOffset контрольної точки: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "ОÑтанній oldestXID контрольної точки: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтаннього oldestXID контрольної точки: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "ОÑтанній oldestActiveXID контрольної точки: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "ОÑтанній oldestMultiXid контрольної точки: %u \n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтанньої oldestMulti контрольної точки: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "ОÑтанній oldestCommitTsXid контрольної точки:%u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "ОÑтанній newestCommitTsXid контрольної точки: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "МакÑимальне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "Розмір блоку бази даних: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "Блоків на Ñегмент великого відношеннÑ: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "Pозмір блоку WAL: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "Байтів на Ñегмент WAL: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "МакÑимальна довжина ідентифікаторів: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "МакÑимальна кількіÑÑ‚ÑŒ Ñтовпців в індекÑÑ–: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "МакÑимальний розмір Ñегменту TOAST: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "Розмір Ñегменту великих обїєктів: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "Дата/Ñ‡Ð°Ñ Ñ‚Ð¸Ð¿Ñƒ Ñховища: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64-бітні цілі"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Передача аргументу Float8: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "за поÑиланнÑм"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "за значеннÑм"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "ВерÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум Ñторінок даних: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid "\n\n"
+"Values to be changed:\n\n"
+msgstr "\n\n"
+"ЗначеннÑ, що потребують зміни:\n\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "Перший Ñегмент журналу піÑÐ»Ñ ÑкиданнÑ: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:799
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:811
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:817
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:819
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:821
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:827
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "Епоха NextXID: %u\n"
+
+#: pg_resetwal.c:833
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл \"%s\": %m"
+
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "помилка fsync: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid "%s resets the PostgreSQL write-ahead log.\n\n"
+msgstr "%s Ñкидає журнал передзапиÑу PostgreSQL.\n\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid "Usage:\n"
+" %s [OPTION]... DATADIR\n\n"
+msgstr "ВикориÑтаннÑ:\n"
+" %s [OPTION]... КÐТÐЛОГ_ДÐÐИХ\n\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid " -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr " -c, --commit-timestamp-ids=XID,XID\n"
+" вÑтановити найÑтарішу та найновішу транзакції\n"
+" затвердити позначку чаÑу (нуль означає залишити без змін)\n"
+
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог даних\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH вÑтановити наÑтупну епоху ID транзакцій\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force примуÑово виконати оновленнÑ\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE задати мінімальне початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ WAL\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID задати ID наÑтупної Ñ– найÑтарішої мультитранзакції\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run без оновлень, проÑто показати, що буде зроблено\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID задати наÑтупний OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET задати зÑув наÑтупної мультитранзакції\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID задати ID найÑтарішої транзакції\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID задати ID наÑтупної транзакції\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE розмір Ñегментів WAL, у мегабайтах\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку і вийти\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
diff --git a/src/bin/pg_resetwal/po/zh_CN.po b/src/bin/pg_resetwal/po/zh_CN.po
new file mode 100644
index 0000000..5a401d1
--- /dev/null
+++ b/src/bin/pg_resetwal/po/zh_CN.po
@@ -0,0 +1,638 @@
+# LANGUAGE message translation file for pg_resetwal
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-08-15 17:30+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "无法加载库 \"%s\": é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "无法为该平å°åˆ›å»ºå—é™åˆ¶çš„令牌:é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "无法打开进程令牌 (token): é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "无法分é…SID: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "无法创建å—é™ä»¤ç‰Œ: 错误ç ä¸º %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "无法为命令 \"%s\"创建进程: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "无法使用å—é™ä»¤ç‰Œå†æ¬¡æ‰§è¡Œ: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "无法从å­è¿›ç¨‹å¾—到退出ç : é”™è¯¯ç  %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:162 pg_resetwal.c:177 pg_resetwal.c:192 pg_resetwal.c:207
+#: pg_resetwal.c:214 pg_resetwal.c:238 pg_resetwal.c:253 pg_resetwal.c:261
+#: pg_resetwal.c:286 pg_resetwal.c:300
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "选项%sçš„å‚数无效"
+
+#: pg_resetwal.c:163 pg_resetwal.c:178 pg_resetwal.c:193 pg_resetwal.c:208
+#: pg_resetwal.c:215 pg_resetwal.c:239 pg_resetwal.c:254 pg_resetwal.c:262
+#: pg_resetwal.c:287 pg_resetwal.c:301 pg_resetwal.c:327 pg_resetwal.c:340
+#: pg_resetwal.c:348
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "事务ID epoch(-e)ä¸èƒ½ä¸º-1"
+
+#: pg_resetwal.c:183
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "最旧的事务ID(-c)必须大于或等于%u"
+
+#: pg_resetwal.c:198
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "事务ID(-x)必须大于或等于%u"
+
+#: pg_resetwal.c:222 pg_resetwal.c:229
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "事务ID(-c)必须为0或大于或等于2"
+
+#: pg_resetwal.c:244
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o)ä¸èƒ½ä¸º0"
+
+#: pg_resetwal.c:267
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "多事务ID(-m)ä¸èƒ½ä¸º0"
+
+#: pg_resetwal.c:277
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "最早的多事务ID(-m)ä¸èƒ½ä¸º0"
+
+#: pg_resetwal.c:292
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "多事务å移é‡ï¼ˆ-O)ä¸èƒ½ä¸º-1"
+
+#: pg_resetwal.c:316
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsizeçš„å‚数必须是一个数字"
+
+#: pg_resetwal.c:321
+#, c-format
+msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024"
+msgstr "--wal-segsizeçš„å‚数必须是2的幂次方(在1å’Œ1024之间)"
+
+#: pg_resetwal.c:338
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_resetwal.c:347
+#, c-format
+msgid "no data directory specified"
+msgstr "没有指定数æ®ç›®å½•"
+
+#: pg_resetwal.c:361
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "ä¸èƒ½ç”±\"root\"执行"
+
+#: pg_resetwal.c:362
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "您现在作为PostgreSQL超级用户è¿è¡Œ%s."
+
+#: pg_resetwal.c:373
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "没有读å–目录 \"%s\" çš„æƒé™: %m"
+
+#: pg_resetwal.c:382
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: pg_resetwal.c:398 pg_resetwal.c:553 pg_resetwal.c:604
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读å–, 无法打开文件 \"%s\": %m"
+
+#: pg_resetwal.c:405
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "é”文件 \"%s\" 存在"
+
+#: pg_resetwal.c:406
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "æœåŠ¡å™¨æ˜¯å¦æ­£åœ¨è¿è¡Œï¼Ÿå¦‚果没有,请删除é”文件并é‡è¯•."
+
+#: pg_resetwal.c:501
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"如果这些值似乎å¯ä»¥æŽ¥å—,则使用-f强制é‡ç½®.\n"
+
+#: pg_resetwal.c:513
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"æ•°æ®åº“æœåŠ¡å™¨æœªå®Œå…¨å…³é—­ .\n"
+"é‡ç½®é¢„写日志å¯èƒ½ä¼šå¯¼è‡´æ•°æ®ä¸¢å¤±.\n"
+"如果ä»è¦ç»§ç»­ï¼Œè¯·ä½¿ç”¨-f强制é‡ç½®.\n"
+
+#: pg_resetwal.c:527
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "é‡ç½®é¢„写日志\n"
+
+#: pg_resetwal.c:562
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "æ„外的空文件\"%s\""
+
+#: pg_resetwal.c:564 pg_resetwal.c:620
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读å–文件 \"%s\": %m"
+
+#: pg_resetwal.c:573
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "æ•°æ®ç›®å½•ç‰ˆæœ¬é”™è¯¯"
+
+#: pg_resetwal.c:574
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "文件\"%s\"包å«\"%s\",与此程åºçš„版本\"%s\"ä¸å…¼å®¹."
+
+#: pg_resetwal.c:607
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"如果确定数æ®ç›®å½•è·¯å¾„正确,请执行\n"
+" touch %s\n"
+"请å†è¯•ä¸€æ¬¡"
+
+#: pg_resetwal.c:638
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control存在,但具有无效的CRC;请å°å¿ƒç»§ç»­"
+
+#: pg_resetwal.c:647
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control指定的WAL段大å°(%d 字节)无效; 请å°å¿ƒç»§ç»­"
+msgstr[1] "pg_control指定的WAL段大å°(%d 字节)无效; 请å°å¿ƒç»§ç»­"
+
+#: pg_resetwal.c:658
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control存在,但已æŸå或版本错误;忽略它"
+
+#: pg_resetwal.c:753
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"猜测的pg_control的值:\n"
+"\n"
+
+#: pg_resetwal.c:755
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"当å‰çš„pg_control的值:\n"
+"\n"
+
+#: pg_resetwal.c:757
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 版本: %u\n"
+
+#: pg_resetwal.c:759
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Catalog 版本: %u\n"
+
+#: pg_resetwal.c:761
+msgid "Database system identifier: %llu\n"
+msgstr "æ•°æ®åº“系统标识符: %llu\n"
+
+#: pg_resetwal.c:763
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最新检查点的 TimeLineID: %u\n"
+
+#: pg_resetwal.c:765
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最新检查点的full_page_writes: %s\n"
+
+#: pg_resetwal.c:766
+msgid "off"
+msgstr "关闭"
+
+#: pg_resetwal.c:766
+msgid "on"
+msgstr "å¼€å¯"
+
+#: pg_resetwal.c:767
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最新检查点的NextXID: %u:%u\n"
+
+#: pg_resetwal.c:770
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最新检查点的 NextOID: %u\n"
+
+#: pg_resetwal.c:772
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最新检查点的NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:774
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最新检查点的NextMultiOffsetD: %u\n"
+
+#: pg_resetwal.c:776
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最新检查点的oldestXID: %u\n"
+
+#: pg_resetwal.c:778
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最新检查点的oldestXID所在的数æ®åº“:%u\n"
+
+#: pg_resetwal.c:780
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最新检查点的oldestActiveXID: %u\n"
+
+#: pg_resetwal.c:782
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最新检查点的oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:784
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最新检查点的oldestMulti所在的数æ®åº“:%u\n"
+
+#: pg_resetwal.c:786
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最新检查点的oldestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:788
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最新检查点的newestCommitTsXid:%u\n"
+
+#: pg_resetwal.c:790
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "最大数æ®æ ¡å‡†: %u\n"
+
+#: pg_resetwal.c:793
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "æ•°æ®åº“å—大å°: %u\n"
+
+#: pg_resetwal.c:795
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大关系的æ¯æ®µå—æ•°: %u\n"
+
+#: pg_resetwal.c:797
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WALçš„å—大å°: %u\n"
+
+#: pg_resetwal.c:799 pg_resetwal.c:885
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "æ¯ä¸€ä¸ª WAL 段字节数: %u\n"
+
+#: pg_resetwal.c:801
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "标识符的最大长度: %u\n"
+
+#: pg_resetwal.c:803
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "在索引中å¯å…许使用最大的列数: %u\n"
+
+#: pg_resetwal.c:805
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST区å—的最大长度: %u\n"
+
+#: pg_resetwal.c:807
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "大对象区å—的大å°: %u\n"
+
+#: pg_resetwal.c:810
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日期/时间 类型存储: %s\n"
+
+#: pg_resetwal.c:811
+msgid "64-bit integers"
+msgstr "64ä½æ•´æ•°"
+
+#: pg_resetwal.c:812
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "正在传递Flloat8类型的å‚æ•°: %s\n"
+
+#: pg_resetwal.c:813
+msgid "by reference"
+msgstr "由引用"
+
+#: pg_resetwal.c:813
+msgid "by value"
+msgstr "由值"
+
+#: pg_resetwal.c:814
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "æ•°æ®é¡µæ ¡éªŒå’Œç‰ˆæœ¬: %u\n"
+
+#: pg_resetwal.c:828
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"è¦æ›´æ”¹çš„值:\n"
+
+#: pg_resetwal.c:832
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "First log segment after reset: %s\n"
+
+#: pg_resetwal.c:836
+#, c-format
+msgid "NextMultiXactId: %u\n"
+msgstr "NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:838
+#, c-format
+msgid "OldestMultiXid: %u\n"
+msgstr "OldestMultiXid: %u\n"
+
+#: pg_resetwal.c:840
+#, c-format
+msgid "OldestMulti's DB: %u\n"
+msgstr "OldestMulti's DB: %u\n"
+
+#: pg_resetwal.c:846
+#, c-format
+msgid "NextMultiOffset: %u\n"
+msgstr "NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:852
+#, c-format
+msgid "NextOID: %u\n"
+msgstr "NextOID: %u\n"
+
+#: pg_resetwal.c:858
+#, c-format
+msgid "NextXID: %u\n"
+msgstr "NextXID: %u\n"
+
+#: pg_resetwal.c:860
+#, c-format
+msgid "OldestXID: %u\n"
+msgstr "OldestXID: %u\n"
+
+#: pg_resetwal.c:862
+#, c-format
+msgid "OldestXID's DB: %u\n"
+msgstr "OldestXID's DB: %u\n"
+
+#: pg_resetwal.c:868
+#, c-format
+msgid "NextXID epoch: %u\n"
+msgstr "NextXID epoch: %u\n"
+
+#: pg_resetwal.c:874
+#, c-format
+msgid "oldestCommitTsXid: %u\n"
+msgstr "oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:879
+#, c-format
+msgid "newestCommitTsXid: %u\n"
+msgstr "newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:965 pg_resetwal.c:1033 pg_resetwal.c:1080
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: pg_resetwal.c:1000 pg_resetwal.c:1053 pg_resetwal.c:1103
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读å–目录 \"%s\": %m"
+
+#: pg_resetwal.c:1006 pg_resetwal.c:1059 pg_resetwal.c:1109
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_resetwal.c:1045 pg_resetwal.c:1095
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "无法删除文件 \"%s\": %m"
+
+#: pg_resetwal.c:1176
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: pg_resetwal.c:1186 pg_resetwal.c:1199
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: pg_resetwal.c:1206
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync 错误: %m"
+
+#: pg_resetwal.c:1217
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr "%s é‡ç½®ä¸€ä¸ªPostgreSQLæ•°æ®åº“集簇的预写å¼æ—¥å¿—.\n"
+
+#: pg_resetwal.c:1218
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [选项]... æ•°æ®ç›®å½•\n"
+
+#: pg_resetwal.c:1219
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_resetwal.c:1220
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" 设置æ交时间å¯ä»¥æ£€ç´¢åˆ°çš„最è€çš„和最新的事务ID\n"
+" (0æ„味ç€æ²¡æœ‰å˜åŒ–)\n"
+
+#: pg_resetwal.c:1223
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR æ•°æ®ç›®å½•\n"
+
+#: pg_resetwal.c:1224
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH 设置下一个事务ID的epoch\n"
+
+#: pg_resetwal.c:1225
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 强制更新完æˆ\n"
+
+#: pg_resetwal.c:1226
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE 设置新的WAL最å°èµ·å§‹ä½ç½®\n"
+
+#: pg_resetwal.c:1227
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID 设置下一个和最旧的多事务ID\n"
+
+#: pg_resetwal.c:1228
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run ä¸æ›´æ–°ï¼Œåªæ˜¾ç¤ºå°†è¦æ‰§è¡Œçš„æ“作\n"
+
+#: pg_resetwal.c:1229
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID 设置下一个OID\n"
+
+#: pg_resetwal.c:1230
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET 设置下一个多事务å移é‡\n"
+
+#: pg_resetwal.c:1231
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID 设置最旧的事务ID\n"
+
+#: pg_resetwal.c:1232
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_resetwal.c:1233
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID 设置下一个事务ID\n"
+
+#: pg_resetwal.c:1234
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL段的大å°ï¼ˆå…†å­—节)\n"
+
+#: pg_resetwal.c:1235
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_resetwal.c:1236
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_resetwal.c:1237
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
diff --git a/src/bin/pg_resetwal/po/zh_TW.po b/src/bin/pg_resetwal/po/zh_TW.po
new file mode 100644
index 0000000..8eb49c6
--- /dev/null
+++ b/src/bin/pg_resetwal/po/zh_TW.po
@@ -0,0 +1,807 @@
+# Traditional Chinese message translation file for pg_resetwal
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_resetwal (PostgreSQL) package.
+# 2004-07-30 Zhenbang Wei <forth@zbwei.net>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_resetwal (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-08 21:50+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# port/win32/security.c:39
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "無法開啟行程 token: 錯誤碼 %lu"
+
+# port/pg_sema.c:117 port/sysv_sema.c:117
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "無法é…ç½® SID: 錯誤碼 %lu"
+
+# port/win32/signal.c:239
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "無法建立å—é™åˆ¶çš„ token: 錯誤碼 %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "無法啟動命令的行程 \"%s\": 錯誤碼 %lu"
+
+# port/win32/signal.c:239
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "無法用å—é™åˆ¶çš„ token é‡æ–°åŸ·è¡Œ: 錯誤碼 %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "無法å–å¾—å­è¡Œç¨‹çš„çµæŸç¢¼: 錯誤碼 %lu"
+
+#. translator: the second %s is a command line argument (-e, etc)
+#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202
+#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249
+#: pg_resetwal.c:269 pg_resetwal.c:280
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203
+#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250
+#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316
+#: pg_resetwal.c:323
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_resetwal.c:168
+#, c-format
+msgid "transaction ID epoch (-e) must not be -1"
+msgstr "交易 ID epoch (-e) ä¸å¯ç‚º -1"
+
+# utils/adt/varlena.c:2016
+#: pg_resetwal.c:181
+#, c-format
+msgid "oldest transaction ID (-u) must be greater than or equal to %u"
+msgstr "最舊的交易 ID(-u) 必須大於或等於 %u"
+
+#: pg_resetwal.c:194
+#, c-format
+msgid "transaction ID (-x) must be greater than or equal to %u"
+msgstr "交易 ID(-x) 必須大於或等於 %u"
+
+#: pg_resetwal.c:216 pg_resetwal.c:220
+#, c-format
+msgid "transaction ID (-c) must be either 0 or greater than or equal to 2"
+msgstr "交易 ID(-c) 必須為 0 或大於等於 2"
+
+#: pg_resetwal.c:233
+#, c-format
+msgid "OID (-o) must not be 0"
+msgstr "OID (-o) ä¸å¯ç‚º 0"
+
+#: pg_resetwal.c:254
+#, c-format
+msgid "multitransaction ID (-m) must not be 0"
+msgstr "multitransaction ID(-m) ä¸å¯ç‚º 0"
+
+#: pg_resetwal.c:261
+#, c-format
+msgid "oldest multitransaction ID (-m) must not be 0"
+msgstr "最舊的 multitransaction ID(-m) ä¸å¯ç‚º 0"
+
+#: pg_resetwal.c:274
+#, c-format
+msgid "multitransaction offset (-O) must not be -1"
+msgstr "multitransaction offset(-O) ä¸å¯ç‚º -1"
+
+# commands/define.c:197
+#: pg_resetwal.c:296
+#, c-format
+msgid "argument of --wal-segsize must be a number"
+msgstr "--wal-segsize çš„åƒæ•¸å¿…須是數字"
+
+#: pg_resetwal.c:298
+#, c-format
+msgid "argument of --wal-segsize must be a power of two between 1 and 1024"
+msgstr "--wal-segsize çš„åƒæ•¸å¿…須是介於1到1024之間的二的次方數"
+
+#: pg_resetwal.c:314
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_resetwal.c:322
+#, c-format
+msgid "no data directory specified"
+msgstr "未指定資料目錄"
+
+# translator: %s represents an SQL statement name
+# access/transam/xact.c:2195
+#: pg_resetwal.c:336
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "無法用 \"root\" 執行"
+
+# postmaster/postmaster.c:1015
+#: pg_resetwal.c:337
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "您必須以 PostgreSQL 超級使用者身分執行 %s。"
+
+# postmaster/postmaster.c:897
+#: pg_resetwal.c:347
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "無法讀å–目錄\"%s\"的權é™: %m"
+
+# utils/init/postinit.c:292
+#: pg_resetwal.c:353
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "無法變更目錄到 \"%s\": %m"
+
+# commands/copy.c:1031
+#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "無法開啟檔案\"%s\"進行讀å–: %m"
+
+# utils/init/miscinit.c:589
+#: pg_resetwal.c:371
+#, c-format
+msgid "lock file \"%s\" exists"
+msgstr "鎖定檔 \"%s\" 已存在"
+
+#: pg_resetwal.c:372
+#, c-format
+msgid "Is a server running? If not, delete the lock file and try again."
+msgstr "伺æœå™¨æ˜¯å¦æ­£åœ¨åŸ·è¡Œï¼Ÿå¦‚果沒有,請刪除鎖定檔然後é‡è©¦ã€‚"
+
+#: pg_resetwal.c:467
+#, c-format
+msgid ""
+"\n"
+"If these values seem acceptable, use -f to force reset.\n"
+msgstr ""
+"\n"
+"如果這些值看起來å¯ä»¥æŽ¥å—,請用 -f 強制é‡è¨­ã€‚\n"
+
+#: pg_resetwal.c:479
+#, c-format
+msgid ""
+"The database server was not shut down cleanly.\n"
+"Resetting the write-ahead log might cause data to be lost.\n"
+"If you want to proceed anyway, use -f to force reset.\n"
+msgstr ""
+"資料庫伺æœå™¨æœªæ­£å¸¸é—œé–‰ã€‚\n"
+"é‡è¨­äº¤æ˜“日誌å¯èƒ½æœƒå°Žè‡´è³‡æ–™éºå¤±ã€‚\n"
+"如果你ä»è¦ç¹¼çºŒï¼Œè«‹ç”¨ -f 強制é‡è¨­ã€‚\n"
+
+# utils/misc/guc.c:255
+#: pg_resetwal.c:493
+#, c-format
+msgid "Write-ahead log reset\n"
+msgstr "Write-ahead 日誌é‡è¨­\n"
+
+# utils/adt/rowtypes.c:178 utils/adt/rowtypes.c:186
+#: pg_resetwal.c:525
+#, c-format
+msgid "unexpected empty file \"%s\""
+msgstr "éžé æœŸçš„空檔 \"%s\""
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: pg_resetwal.c:527 pg_resetwal.c:581
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "無法讀å–檔案 \"%s\": %m"
+
+# postmaster/postmaster.c:912
+#: pg_resetwal.c:535
+#, c-format
+msgid "data directory is of wrong version"
+msgstr "資料目錄版本錯誤"
+
+# utils/init/miscinit.c:908
+#: pg_resetwal.c:536
+#, c-format
+msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"."
+msgstr "檔案 %s åŒ…å« %s,與本程å¼çš„版本 %s ä¸ç›¸å®¹"
+
+#: pg_resetwal.c:569
+#, c-format
+msgid ""
+"If you are sure the data directory path is correct, execute\n"
+" touch %s\n"
+"and try again."
+msgstr ""
+"如果你確定資料目錄的路徑正確,請執行\n"
+" touch %s\n"
+"然後é‡è©¦ã€‚"
+
+#: pg_resetwal.c:597
+#, c-format
+msgid "pg_control exists but has invalid CRC; proceed with caution"
+msgstr "pg_control 存在但 CRC 無效,請謹慎æ“作。"
+
+#: pg_resetwal.c:606
+#, c-format
+msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution"
+msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution"
+msgstr[0] "pg_control 指定無效的 WAL 片段大å°(%d ä½å…ƒçµ„),請謹慎æ“作"
+
+#: pg_resetwal.c:617
+#, c-format
+msgid "pg_control exists but is broken or wrong version; ignoring it"
+msgstr "pg_control 存在但已æ壞或版本ä¸æ­£ç¢ºï¼Œå¿½ç•¥å®ƒ"
+
+#: pg_resetwal.c:712
+#, c-format
+msgid ""
+"Guessed pg_control values:\n"
+"\n"
+msgstr ""
+"猜測的 pg_control 值:\n"
+"\n"
+
+#: pg_resetwal.c:714
+#, c-format
+msgid ""
+"Current pg_control values:\n"
+"\n"
+msgstr ""
+"ç›®å‰çš„ pg_control 值:\n"
+"\n"
+
+#: pg_resetwal.c:716
+#, c-format
+msgid "pg_control version number: %u\n"
+msgstr "pg_control 版本號碼: %u\n"
+
+#: pg_resetwal.c:718
+#, c-format
+msgid "Catalog version number: %u\n"
+msgstr "Catalog 版本號碼: %u\n"
+
+#: pg_resetwal.c:720
+#, c-format
+msgid "Database system identifier: %llu\n"
+msgstr "資料庫系統識別碼: %llu\n"
+
+#: pg_resetwal.c:722
+#, c-format
+msgid "Latest checkpoint's TimeLineID: %u\n"
+msgstr "最新檢查點 TimeLineID: %u\n"
+
+#: pg_resetwal.c:724
+#, c-format
+msgid "Latest checkpoint's full_page_writes: %s\n"
+msgstr "最新檢查點 full_page_writes: %s\n"
+
+# help.c:48
+#: pg_resetwal.c:725
+msgid "off"
+msgstr "off"
+
+# help.c:48
+#: pg_resetwal.c:725
+msgid "on"
+msgstr "on"
+
+#: pg_resetwal.c:726
+#, c-format
+msgid "Latest checkpoint's NextXID: %u:%u\n"
+msgstr "最新檢查點 NextXID: %u:%u\n"
+
+#: pg_resetwal.c:729
+#, c-format
+msgid "Latest checkpoint's NextOID: %u\n"
+msgstr "最新檢查點 NextOID: %u\n"
+
+#: pg_resetwal.c:731
+#, c-format
+msgid "Latest checkpoint's NextMultiXactId: %u\n"
+msgstr "最新檢查點 NextMultiXactId: %u\n"
+
+#: pg_resetwal.c:733
+#, c-format
+msgid "Latest checkpoint's NextMultiOffset: %u\n"
+msgstr "最新檢查點 NextMultiOffset: %u\n"
+
+#: pg_resetwal.c:735
+#, c-format
+msgid "Latest checkpoint's oldestXID: %u\n"
+msgstr "最新檢查點 oldestXID: %u\n"
+
+#: pg_resetwal.c:737
+#, c-format
+msgid "Latest checkpoint's oldestXID's DB: %u\n"
+msgstr "最新檢查點 oldestXID 的資料庫: %u\n"
+
+#: pg_resetwal.c:739
+#, c-format
+msgid "Latest checkpoint's oldestActiveXID: %u\n"
+msgstr "最新檢查點 oldestActiveXID: %u\n"
+
+#: pg_resetwal.c:741
+#, c-format
+msgid "Latest checkpoint's oldestMultiXid: %u\n"
+msgstr "最新檢查點 oldestMultiXid: %u\n"
+
+#: pg_resetwal.c:743
+#, c-format
+msgid "Latest checkpoint's oldestMulti's DB: %u\n"
+msgstr "最新檢查點 oldestMulti 的資料庫: %u\n"
+
+#: pg_resetwal.c:745
+#, c-format
+msgid "Latest checkpoint's oldestCommitTsXid:%u\n"
+msgstr "最新檢查點 oldestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:747
+#, c-format
+msgid "Latest checkpoint's newestCommitTsXid:%u\n"
+msgstr "最新檢查點 newestCommitTsXid: %u\n"
+
+#: pg_resetwal.c:749
+#, c-format
+msgid "Maximum data alignment: %u\n"
+msgstr "資料å°é½Šä¸Šé™: %u\n"
+
+#: pg_resetwal.c:752
+#, c-format
+msgid "Database block size: %u\n"
+msgstr "資料庫å€å¡Šå¤§å°: %u\n"
+
+#: pg_resetwal.c:754
+#, c-format
+msgid "Blocks per segment of large relation: %u\n"
+msgstr "大型關è¯æ¯å€‹ç‰‡æ®µçš„å€å¡Šæ•¸: %u\n"
+
+#: pg_resetwal.c:756
+#, c-format
+msgid "WAL block size: %u\n"
+msgstr "WAL å€å¡Šå¤§å°: %u\n"
+
+#: pg_resetwal.c:758 pg_resetwal.c:844
+#, c-format
+msgid "Bytes per WAL segment: %u\n"
+msgstr "æ¯å€‹ WAL 片段的ä½å…ƒçµ„數: %u\n"
+
+#: pg_resetwal.c:760
+#, c-format
+msgid "Maximum length of identifiers: %u\n"
+msgstr "最大識別å稱長度: %u\n"
+
+#: pg_resetwal.c:762
+#, c-format
+msgid "Maximum columns in an index: %u\n"
+msgstr "最大索引欄ä½æ•¸: %u\n"
+
+#: pg_resetwal.c:764
+#, c-format
+msgid "Maximum size of a TOAST chunk: %u\n"
+msgstr "TOAST 塊大å°ä¸Šé™: %u\n"
+
+#: pg_resetwal.c:766
+#, c-format
+msgid "Size of a large-object chunk: %u\n"
+msgstr "大物件塊的大å°: %u\n"
+
+#: pg_resetwal.c:769
+#, c-format
+msgid "Date/time type storage: %s\n"
+msgstr "日期/時間的儲存方å¼: %s\n"
+
+#: pg_resetwal.c:770
+msgid "64-bit integers"
+msgstr "64ä½å…ƒæ•´æ•¸"
+
+#: pg_resetwal.c:771
+#, c-format
+msgid "Float8 argument passing: %s\n"
+msgstr "Float8 åƒæ•¸å‚³éžæ–¹å¼: %s\n"
+
+#: pg_resetwal.c:772
+msgid "by reference"
+msgstr "傳å€"
+
+#: pg_resetwal.c:772
+msgid "by value"
+msgstr "傳值"
+
+#: pg_resetwal.c:773
+#, c-format
+msgid "Data page checksum version: %u\n"
+msgstr "資料é æª¢æŸ¥ç¢¼ç‰ˆæœ¬: %u\n"
+
+#: pg_resetwal.c:787
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Values to be changed:\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"å°‡è¦è®Šæ›´çš„值:\n"
+"\n"
+
+#: pg_resetwal.c:791
+#, c-format
+msgid "First log segment after reset: %s\n"
+msgstr "é‡è¨­å¾Œçš„第一個日誌片段: %s\n"
+
+#: pg_resetwal.c:795
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "NextMultiXactId: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:797
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "OldestMultiXid: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:799
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "OldestMulti's DB: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:805
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "NextMultiOffset: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:811
+#, c-format
+#| msgid "LC_CTYPE: %s\n"
+msgid "NextOID: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:817
+#, c-format
+#| msgid "LC_CTYPE: %s\n"
+msgid "NextXID: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:819
+#, c-format
+#| msgid "LC_COLLATE: %s\n"
+msgid "OldestXID: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:821
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "OldestXID's DB: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:827
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "NextXID epoch: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:833
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "oldestCommitTsXid: %u\n"
+msgstr ""
+
+#: pg_resetwal.c:838
+#, c-format
+#| msgid "WAL block size: %u\n"
+msgid "newestCommitTsXid: %u\n"
+msgstr ""
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄 \"%s\": %m"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "無法讀å–目錄 \"%s\": %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "無法關閉目錄 \"%s\": %m"
+
+# access/transam/slru.c:645 access/transam/xlog.c:1526
+# access/transam/xlog.c:1646 access/transam/xlog.c:2911
+# access/transam/xlog.c:5308 access/transam/xlog.c:5426
+# postmaster/postmaster.c:3366
+#: pg_resetwal.c:983 pg_resetwal.c:1021
+#, c-format
+msgid "could not delete file \"%s\": %m"
+msgstr "無法刪除檔案 \"%s\": %m"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: pg_resetwal.c:1093
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案 \"%s\": %m"
+
+# access/transam/xlog.c:5319 access/transam/xlog.c:5439
+#: pg_resetwal.c:1101 pg_resetwal.c:1113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+#: pg_resetwal.c:1118
+#, c-format
+msgid "fsync error: %m"
+msgstr "fsync 錯誤: %m"
+
+#: pg_resetwal.c:1127
+#, c-format
+msgid ""
+"%s resets the PostgreSQL write-ahead log.\n"
+"\n"
+msgstr ""
+"%s é‡è¨­ PostgreSQL çš„ write-ahead 日誌。\n"
+"\n"
+
+#: pg_resetwal.c:1128
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [OPTION]... DATADIR\n"
+"\n"
+
+#: pg_resetwal.c:1129
+#, c-format
+msgid "Options:\n"
+msgstr "é¸é …:\n"
+
+#: pg_resetwal.c:1130
+#, c-format
+msgid ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" set oldest and newest transactions bearing\n"
+" commit timestamp (zero means no change)\n"
+msgstr ""
+" -c, --commit-timestamp-ids=XID,XID\n"
+" 設定具有æ交時間戳記的最舊和最新交易\n"
+" (0 表示ä¸ä¿®æ”¹)\n"
+
+# postmaster/postmaster.c:1024 tcop/postgres.c:2122
+#: pg_resetwal.c:1133
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 資料目錄\n"
+
+#: pg_resetwal.c:1134
+#, c-format
+msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n"
+msgstr " -e, --epoch=XIDEPOCH 設定下一個交易 ID 的 epoch\n"
+
+#: pg_resetwal.c:1135
+#, c-format
+msgid " -f, --force force update to be done\n"
+msgstr " -f, --force 強制執行更新\n"
+
+#: pg_resetwal.c:1136
+#, c-format
+msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n"
+msgstr " -l, --next-wal-file=WALFILE 設定新 WAL 的最å°èµ·å§‹ä½ç½®\n"
+
+#: pg_resetwal.c:1137
+#, c-format
+msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n"
+msgstr " -m, --multixact-ids=MXID,MXID 設定下一個和最舊的 multitransaction ID\n"
+
+#: pg_resetwal.c:1138
+#, c-format
+msgid " -n, --dry-run no update, just show what would be done\n"
+msgstr " -n, --dry-run ä¸åŸ·è¡Œæ›´æ–°ï¼Œåªé¡¯ç¤ºé è¨ˆåŸ·è¡Œçš„æ“作\n"
+
+#: pg_resetwal.c:1139
+#, c-format
+msgid " -o, --next-oid=OID set next OID\n"
+msgstr " -o, --next-oid=OID 設定下一個 OID\n"
+
+#: pg_resetwal.c:1140
+#, c-format
+msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n"
+msgstr " -O, --multixact-offset=OFFSET 設定下一個 multitransaction offset\n"
+
+#: pg_resetwal.c:1141
+#, c-format
+msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n"
+msgstr " -u, --oldest-transaction-id=XID 設定最舊的交易 ID\n"
+
+#: pg_resetwal.c:1142
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_resetwal.c:1143
+#, c-format
+msgid " -x, --next-transaction-id=XID set next transaction ID\n"
+msgstr " -x, --next-transaction-id=XID 設定下一個交易 ID\n"
+
+#: pg_resetwal.c:1144
+#, c-format
+msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n"
+msgstr " --wal-segsize=SIZE WAL 片段的大å°ï¼Œå–®ä½æ˜¯ MB\n"
+
+#: pg_resetwal.c:1145
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_resetwal.c:1146
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_resetwal.c:1147
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網é : <%s>\n"
+
+#, c-format
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help 顯示說明然後çµæŸ\n"
+
+#, c-format
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version 顯示版本資訊然後çµæŸ\n"
+
+# command.c:256
+#, c-format
+#~ msgid "%s: could not change directory to \"%s\": %s\n"
+#~ msgstr "%s: 無法變更 \"%s\" 的目錄:%s\n"
+
+#, c-format
+#~ msgid "%s: could not create pg_control file: %s\n"
+#~ msgstr "%s: 無法建立pg_control檔: %s\n"
+
+#, c-format
+#~ msgid "%s: could not delete file \"%s\": %s\n"
+#~ msgstr "%s: 無法刪除檔案 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s: 無法開啟目錄 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not open file \"%s\" for reading: %s\n"
+#~ msgstr "%s: ç„¡æ³•é–‹å•Ÿæª”æ¡ˆè®€å– \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s: 無法開啟檔案 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not read file \"%s\": %s\n"
+#~ msgstr "%s: 無法讀å–檔案 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not read from directory \"%s\": %s\n"
+#~ msgstr "%s: 無法讀å–目錄 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not write file \"%s\": %s\n"
+#~ msgstr "%s: 無法寫入檔案 \"%s\": %s\n"
+
+#, c-format
+#~ msgid "%s: could not write pg_control file: %s\n"
+#~ msgstr "%s: 無法寫入pg_control檔: %s\n"
+
+#, c-format
+#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n"
+#~ msgstr "%s: 內部錯誤 -- sizeof(ControlFileData) 太大... 請修正 PG_CONTROL_SIZE\n"
+
+#~ msgid "%s: invalid LC_COLLATE setting\n"
+#~ msgstr "%s: 無效的LC_COLLATE設定\n"
+
+#~ msgid "%s: invalid LC_CTYPE setting\n"
+#~ msgstr "%s: 無效的LC_CTYPE設定\n"
+
+#, c-format
+#~ msgid "%s: invalid argument for option -O\n"
+#~ msgstr "%s: é¸é … -O çš„åƒæ•¸ç„¡æ•ˆ\n"
+
+#, c-format
+#~ msgid "%s: invalid argument for option -l\n"
+#~ msgstr "%s: é¸é … -l çš„åƒæ•¸ç„¡æ•ˆ\n"
+
+#, c-format
+#~ msgid "%s: invalid argument for option -m\n"
+#~ msgstr "%s: é¸é … -m çš„åƒæ•¸ç„¡æ•ˆ\n"
+
+#, c-format
+#~ msgid "%s: invalid argument for option -o\n"
+#~ msgstr "%s: é¸é … -o çš„åƒæ•¸ç„¡æ•ˆ\n"
+
+#, c-format
+#~ msgid "%s: invalid argument for option -x\n"
+#~ msgstr "%s: é¸é … -x çš„åƒæ•¸ç„¡æ•ˆ\n"
+
+#, c-format
+#~ msgid "First log file ID after reset: %u\n"
+#~ msgstr "é‡è¨­å¾Œçš„第一個日誌檔 ID: %u\n"
+
+#, c-format
+#~ msgid "Float4 argument passing: %s\n"
+#~ msgstr "Float4 åƒæ•¸å‚³éžæ–¹å¼: %s\n"
+
+#~ msgid "Maximum number of function arguments: %u\n"
+#~ msgstr "函å¼åƒæ•¸çš„最大數é‡: %u\n"
+
+#, c-format
+#~ msgid "Transaction log reset\n"
+#~ msgstr "é‡è¨­äº¤æ˜“日誌\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "執行 \"%s --help\" 顯示更多資訊。\n"
+
+#~ msgid "floating-point numbers"
+#~ msgstr "浮點數"
diff --git a/src/bin/pg_resetwal/t/001_basic.pl b/src/bin/pg_resetwal/t/001_basic.pl
new file mode 100644
index 0000000..7e5efbf
--- /dev/null
+++ b/src/bin/pg_resetwal/t/001_basic.pl
@@ -0,0 +1,32 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_resetwal');
+program_version_ok('pg_resetwal');
+program_options_handling_ok('pg_resetwal');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+command_like([ 'pg_resetwal', '-n', $node->data_dir ],
+ qr/checkpoint/, 'pg_resetwal -n produces output');
+
+
+# Permissions on PGDATA should be default
+SKIP:
+{
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($node->data_dir, 0700, 0600),
+ 'check PGDATA permissions');
+}
+
+done_testing();
diff --git a/src/bin/pg_resetwal/t/002_corrupted.pl b/src/bin/pg_resetwal/t/002_corrupted.pl
new file mode 100644
index 0000000..6d19a1e
--- /dev/null
+++ b/src/bin/pg_resetwal/t/002_corrupted.pl
@@ -0,0 +1,58 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Tests for handling a corrupted pg_control
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+
+my $pg_control = $node->data_dir . '/global/pg_control';
+my $size = (stat($pg_control))[7];
+
+# Read out the head of the file to get PG_CONTROL_VERSION in
+# particular.
+my $data;
+open my $fh, '<', $pg_control or BAIL_OUT($!);
+binmode $fh;
+read $fh, $data, 16;
+close $fh;
+
+# Fill pg_control with zeros
+open $fh, '>', $pg_control or BAIL_OUT($!);
+binmode $fh;
+print $fh pack("x[$size]");
+close $fh;
+
+command_checks_all(
+ [ 'pg_resetwal', '-n', $node->data_dir ],
+ 0,
+ [qr/pg_control version number/],
+ [
+ qr/pg_resetwal: warning: pg_control exists but is broken or wrong version; ignoring it/
+ ],
+ 'processes corrupted pg_control all zeroes');
+
+# Put in the previously saved header data. This uses a different code
+# path internally, allowing us to process a zero WAL segment size.
+open $fh, '>', $pg_control or BAIL_OUT($!);
+binmode $fh;
+print $fh $data, pack("x[" . ($size - 16) . "]");
+close $fh;
+
+command_checks_all(
+ [ 'pg_resetwal', '-n', $node->data_dir ],
+ 0,
+ [qr/pg_control version number/],
+ [
+ qr/\Qpg_resetwal: warning: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/
+ ],
+ 'processes zero WAL segment size');
+
+done_testing();
diff --git a/src/bin/pg_rewind/.gitignore b/src/bin/pg_rewind/.gitignore
new file mode 100644
index 0000000..79ddca3
--- /dev/null
+++ b/src/bin/pg_rewind/.gitignore
@@ -0,0 +1,6 @@
+# Files generated during build
+/xlogreader.c
+/pg_rewind
+
+# Generated by test suite
+/tmp_check/
diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile
new file mode 100644
index 0000000..bed05f1
--- /dev/null
+++ b/src/bin/pg_rewind/Makefile
@@ -0,0 +1,60 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_rewind
+#
+# Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group
+#
+# src/bin/pg_rewind/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_rewind - synchronize a data directory with another one forked from"
+PGAPPICON = win32
+
+subdir = src/bin/pg_rewind
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+override CPPFLAGS := -I$(libpq_srcdir) -DFRONTEND $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ datapagemap.o \
+ file_ops.o \
+ filemap.o \
+ libpq_source.o \
+ local_source.o \
+ parsexlog.o \
+ pg_rewind.o \
+ timeline.o \
+ xlogreader.o
+
+EXTRA_CLEAN = xlogreader.c
+
+all: pg_rewind
+
+pg_rewind: $(OBJS) | submake-libpq submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%
+ rm -f $@ && $(LN_S) $< .
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_rewind$(X) '$(DESTDIR)$(bindir)/pg_rewind$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_rewind$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_rewind$(X) $(OBJS) xlogreader.c
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_rewind/datapagemap.c b/src/bin/pg_rewind/datapagemap.c
new file mode 100644
index 0000000..59ccb31
--- /dev/null
+++ b/src/bin/pg_rewind/datapagemap.c
@@ -0,0 +1,127 @@
+/*-------------------------------------------------------------------------
+ *
+ * datapagemap.c
+ * A data structure for keeping track of data pages that have changed.
+ *
+ * This is a fairly simple bitmap.
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "common/logging.h"
+#include "datapagemap.h"
+
+struct datapagemap_iterator
+{
+ datapagemap_t *map;
+ BlockNumber nextblkno;
+};
+
+/*****
+ * Public functions
+ */
+
+/*
+ * Add a block to the bitmap.
+ */
+void
+datapagemap_add(datapagemap_t *map, BlockNumber blkno)
+{
+ int offset;
+ int bitno;
+
+ offset = blkno / 8;
+ bitno = blkno % 8;
+
+ /* enlarge or create bitmap if needed */
+ if (map->bitmapsize <= offset)
+ {
+ int oldsize = map->bitmapsize;
+ int newsize;
+
+ /*
+ * The minimum to hold the new bit is offset + 1. But add some
+ * headroom, so that we don't need to repeatedly enlarge the bitmap in
+ * the common case that blocks are modified in order, from beginning
+ * of a relation to the end.
+ */
+ newsize = offset + 1;
+ newsize += 10;
+
+ map->bitmap = pg_realloc(map->bitmap, newsize);
+
+ /* zero out the newly allocated region */
+ memset(&map->bitmap[oldsize], 0, newsize - oldsize);
+
+ map->bitmapsize = newsize;
+ }
+
+ /* Set the bit */
+ map->bitmap[offset] |= (1 << bitno);
+}
+
+/*
+ * Start iterating through all entries in the page map.
+ *
+ * After datapagemap_iterate, call datapagemap_next to return the entries,
+ * until it returns false. After you're done, use pg_free() to destroy the
+ * iterator.
+ */
+datapagemap_iterator_t *
+datapagemap_iterate(datapagemap_t *map)
+{
+ datapagemap_iterator_t *iter;
+
+ iter = pg_malloc(sizeof(datapagemap_iterator_t));
+ iter->map = map;
+ iter->nextblkno = 0;
+
+ return iter;
+}
+
+bool
+datapagemap_next(datapagemap_iterator_t *iter, BlockNumber *blkno)
+{
+ datapagemap_t *map = iter->map;
+
+ for (;;)
+ {
+ BlockNumber blk = iter->nextblkno;
+ int nextoff = blk / 8;
+ int bitno = blk % 8;
+
+ if (nextoff >= map->bitmapsize)
+ break;
+
+ iter->nextblkno++;
+
+ if (map->bitmap[nextoff] & (1 << bitno))
+ {
+ *blkno = blk;
+ return true;
+ }
+ }
+
+ /* no more set bits in this bitmap. */
+ return false;
+}
+
+/*
+ * A debugging aid. Prints out the contents of the page map.
+ */
+void
+datapagemap_print(datapagemap_t *map)
+{
+ datapagemap_iterator_t *iter;
+ BlockNumber blocknum;
+
+ iter = datapagemap_iterate(map);
+ while (datapagemap_next(iter, &blocknum))
+ pg_log_debug("block %u", blocknum);
+
+ pg_free(iter);
+}
diff --git a/src/bin/pg_rewind/datapagemap.h b/src/bin/pg_rewind/datapagemap.h
new file mode 100644
index 0000000..a911d3e
--- /dev/null
+++ b/src/bin/pg_rewind/datapagemap.h
@@ -0,0 +1,29 @@
+/*-------------------------------------------------------------------------
+ *
+ * datapagemap.h
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef DATAPAGEMAP_H
+#define DATAPAGEMAP_H
+
+#include "storage/block.h"
+#include "storage/relfilelocator.h"
+
+struct datapagemap
+{
+ char *bitmap;
+ int bitmapsize;
+};
+
+typedef struct datapagemap datapagemap_t;
+typedef struct datapagemap_iterator datapagemap_iterator_t;
+
+extern void datapagemap_add(datapagemap_t *map, BlockNumber blkno);
+extern datapagemap_iterator_t *datapagemap_iterate(datapagemap_t *map);
+extern bool datapagemap_next(datapagemap_iterator_t *iter, BlockNumber *blkno);
+extern void datapagemap_print(datapagemap_t *map);
+
+#endif /* DATAPAGEMAP_H */
diff --git a/src/bin/pg_rewind/file_ops.c b/src/bin/pg_rewind/file_ops.c
new file mode 100644
index 0000000..25996b4
--- /dev/null
+++ b/src/bin/pg_rewind/file_ops.c
@@ -0,0 +1,468 @@
+/*-------------------------------------------------------------------------
+ *
+ * file_ops.c
+ * Helper functions for operating on files.
+ *
+ * Most of the functions in this file are helper functions for writing to
+ * the target data directory. The functions check the --dry-run flag, and
+ * do nothing if it's enabled. You should avoid accessing the target files
+ * directly but if you do, make sure you honor the --dry-run mode!
+ *
+ * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+
+/*
+ * Currently open target file.
+ */
+static int dstfd = -1;
+static char dstpath[MAXPGPATH] = "";
+
+static void create_target_dir(const char *path);
+static void remove_target_dir(const char *path);
+static void create_target_symlink(const char *path, const char *link);
+static void remove_target_symlink(const char *path);
+
+static void recurse_dir(const char *datadir, const char *parentpath,
+ process_file_callback_t callback);
+
+/*
+ * Open a target file for writing. If 'trunc' is true and the file already
+ * exists, it will be truncated.
+ */
+void
+open_target_file(const char *path, bool trunc)
+{
+ int mode;
+
+ if (dry_run)
+ return;
+
+ if (dstfd != -1 && !trunc &&
+ strcmp(path, &dstpath[strlen(datadir_target) + 1]) == 0)
+ return; /* already open */
+
+ close_target_file();
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+
+ mode = O_WRONLY | O_CREAT | PG_BINARY;
+ if (trunc)
+ mode |= O_TRUNC;
+ dstfd = open(dstpath, mode, pg_file_create_mode);
+ if (dstfd < 0)
+ pg_fatal("could not open target file \"%s\": %m",
+ dstpath);
+}
+
+/*
+ * Close target file, if it's open.
+ */
+void
+close_target_file(void)
+{
+ if (dstfd == -1)
+ return;
+
+ if (close(dstfd) != 0)
+ pg_fatal("could not close target file \"%s\": %m",
+ dstpath);
+
+ dstfd = -1;
+}
+
+void
+write_target_range(char *buf, off_t begin, size_t size)
+{
+ size_t writeleft;
+ char *p;
+
+ /* update progress report */
+ fetch_done += size;
+ progress_report(false);
+
+ if (dry_run)
+ return;
+
+ if (lseek(dstfd, begin, SEEK_SET) == -1)
+ pg_fatal("could not seek in target file \"%s\": %m",
+ dstpath);
+
+ writeleft = size;
+ p = buf;
+ while (writeleft > 0)
+ {
+ ssize_t writelen;
+
+ errno = 0;
+ writelen = write(dstfd, p, writeleft);
+ if (writelen < 0)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("could not write file \"%s\": %m",
+ dstpath);
+ }
+
+ p += writelen;
+ writeleft -= writelen;
+ }
+
+ /* keep the file open, in case we need to copy more blocks in it */
+}
+
+
+void
+remove_target(file_entry_t *entry)
+{
+ Assert(entry->action == FILE_ACTION_REMOVE);
+ Assert(entry->target_exists);
+
+ switch (entry->target_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ remove_target_dir(entry->path);
+ break;
+
+ case FILE_TYPE_REGULAR:
+ remove_target_file(entry->path, false);
+ break;
+
+ case FILE_TYPE_SYMLINK:
+ remove_target_symlink(entry->path);
+ break;
+
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("undefined file type for \"%s\"", entry->path);
+ break;
+ }
+}
+
+void
+create_target(file_entry_t *entry)
+{
+ Assert(entry->action == FILE_ACTION_CREATE);
+ Assert(!entry->target_exists);
+
+ switch (entry->source_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ create_target_dir(entry->path);
+ break;
+
+ case FILE_TYPE_SYMLINK:
+ create_target_symlink(entry->path, entry->source_link_target);
+ break;
+
+ case FILE_TYPE_REGULAR:
+ /* can't happen. Regular files are created with open_target_file. */
+ pg_fatal("invalid action (CREATE) for regular file");
+ break;
+
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("undefined file type for \"%s\"", entry->path);
+ break;
+ }
+}
+
+/*
+ * Remove a file from target data directory. If missing_ok is true, it
+ * is fine for the target file to not exist.
+ */
+void
+remove_target_file(const char *path, bool missing_ok)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (unlink(dstpath) != 0)
+ {
+ if (errno == ENOENT && missing_ok)
+ return;
+
+ pg_fatal("could not remove file \"%s\": %m",
+ dstpath);
+ }
+}
+
+void
+truncate_target_file(const char *path, off_t newsize)
+{
+ char dstpath[MAXPGPATH];
+ int fd;
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+
+ fd = open(dstpath, O_WRONLY, pg_file_create_mode);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\" for truncation: %m",
+ dstpath);
+
+ if (ftruncate(fd, newsize) != 0)
+ pg_fatal("could not truncate file \"%s\" to %u: %m",
+ dstpath, (unsigned int) newsize);
+
+ close(fd);
+}
+
+static void
+create_target_dir(const char *path)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (mkdir(dstpath, pg_dir_create_mode) != 0)
+ pg_fatal("could not create directory \"%s\": %m",
+ dstpath);
+}
+
+static void
+remove_target_dir(const char *path)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (rmdir(dstpath) != 0)
+ pg_fatal("could not remove directory \"%s\": %m",
+ dstpath);
+}
+
+static void
+create_target_symlink(const char *path, const char *link)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (symlink(link, dstpath) != 0)
+ pg_fatal("could not create symbolic link at \"%s\": %m",
+ dstpath);
+}
+
+static void
+remove_target_symlink(const char *path)
+{
+ char dstpath[MAXPGPATH];
+
+ if (dry_run)
+ return;
+
+ snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
+ if (unlink(dstpath) != 0)
+ pg_fatal("could not remove symbolic link \"%s\": %m",
+ dstpath);
+}
+
+/*
+ * Sync target data directory to ensure that modifications are safely on disk.
+ *
+ * We do this once, for the whole data directory, for performance reasons. At
+ * the end of pg_rewind's run, the kernel is likely to already have flushed
+ * most dirty buffers to disk. Additionally fsync_pgdata uses a two-pass
+ * approach (only initiating writeback in the first pass), which often reduces
+ * the overall amount of IO noticeably.
+ */
+void
+sync_target_dir(void)
+{
+ if (!do_sync || dry_run)
+ return;
+
+ fsync_pgdata(datadir_target, PG_VERSION_NUM);
+}
+
+
+/*
+ * Read a file into memory. The file to be read is <datadir>/<path>.
+ * The file contents are returned in a malloc'd buffer, and *filesize
+ * is set to the length of the file.
+ *
+ * The returned buffer is always zero-terminated; the size of the returned
+ * buffer is actually *filesize + 1. That's handy when reading a text file.
+ * This function can be used to read binary files as well, you can just
+ * ignore the zero-terminator in that case.
+ */
+char *
+slurpFile(const char *datadir, const char *path, size_t *filesize)
+{
+ int fd;
+ char *buffer;
+ struct stat statbuf;
+ char fullpath[MAXPGPATH];
+ int len;
+ int r;
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", datadir, path);
+
+ if ((fd = open(fullpath, O_RDONLY | PG_BINARY, 0)) == -1)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ fullpath);
+
+ if (fstat(fd, &statbuf) < 0)
+ pg_fatal("could not open file \"%s\" for reading: %m",
+ fullpath);
+
+ len = statbuf.st_size;
+
+ buffer = pg_malloc(len + 1);
+
+ r = read(fd, buffer, len);
+ if (r != len)
+ {
+ if (r < 0)
+ pg_fatal("could not read file \"%s\": %m",
+ fullpath);
+ else
+ pg_fatal("could not read file \"%s\": read %d of %zu",
+ fullpath, r, (Size) len);
+ }
+ close(fd);
+
+ /* Zero-terminate the buffer. */
+ buffer[len] = '\0';
+
+ if (filesize)
+ *filesize = len;
+ return buffer;
+}
+
+/*
+ * Traverse through all files in a data directory, calling 'callback'
+ * for each file.
+ */
+void
+traverse_datadir(const char *datadir, process_file_callback_t callback)
+{
+ recurse_dir(datadir, NULL, callback);
+}
+
+/*
+ * recursive part of traverse_datadir
+ *
+ * parentpath is the current subdirectory's path relative to datadir,
+ * or NULL at the top level.
+ */
+static void
+recurse_dir(const char *datadir, const char *parentpath,
+ process_file_callback_t callback)
+{
+ DIR *xldir;
+ struct dirent *xlde;
+ char fullparentpath[MAXPGPATH];
+
+ if (parentpath)
+ snprintf(fullparentpath, MAXPGPATH, "%s/%s", datadir, parentpath);
+ else
+ snprintf(fullparentpath, MAXPGPATH, "%s", datadir);
+
+ xldir = opendir(fullparentpath);
+ if (xldir == NULL)
+ pg_fatal("could not open directory \"%s\": %m",
+ fullparentpath);
+
+ while (errno = 0, (xlde = readdir(xldir)) != NULL)
+ {
+ struct stat fst;
+ char fullpath[MAXPGPATH * 2];
+ char path[MAXPGPATH * 2];
+
+ if (strcmp(xlde->d_name, ".") == 0 ||
+ strcmp(xlde->d_name, "..") == 0)
+ continue;
+
+ snprintf(fullpath, sizeof(fullpath), "%s/%s", fullparentpath, xlde->d_name);
+
+ if (lstat(fullpath, &fst) < 0)
+ {
+ if (errno == ENOENT)
+ {
+ /*
+ * File doesn't exist anymore. This is ok, if the new primary
+ * is running and the file was just removed. If it was a data
+ * file, there should be a WAL record of the removal. If it
+ * was something else, it couldn't have been anyway.
+ *
+ * TODO: But complain if we're processing the target dir!
+ */
+ }
+ else
+ pg_fatal("could not stat file \"%s\": %m",
+ fullpath);
+ }
+
+ if (parentpath)
+ snprintf(path, sizeof(path), "%s/%s", parentpath, xlde->d_name);
+ else
+ snprintf(path, sizeof(path), "%s", xlde->d_name);
+
+ if (S_ISREG(fst.st_mode))
+ callback(path, FILE_TYPE_REGULAR, fst.st_size, NULL);
+ else if (S_ISDIR(fst.st_mode))
+ {
+ callback(path, FILE_TYPE_DIRECTORY, 0, NULL);
+ /* recurse to handle subdirectories */
+ recurse_dir(datadir, path, callback);
+ }
+ else if (S_ISLNK(fst.st_mode))
+ {
+ char link_target[MAXPGPATH];
+ int len;
+
+ len = readlink(fullpath, link_target, sizeof(link_target));
+ if (len < 0)
+ pg_fatal("could not read symbolic link \"%s\": %m",
+ fullpath);
+ if (len >= sizeof(link_target))
+ pg_fatal("symbolic link \"%s\" target is too long",
+ fullpath);
+ link_target[len] = '\0';
+
+ callback(path, FILE_TYPE_SYMLINK, 0, link_target);
+
+ /*
+ * If it's a symlink within pg_tblspc, we need to recurse into it,
+ * to process all the tablespaces. We also follow a symlink if
+ * it's for pg_wal. Symlinks elsewhere are ignored.
+ */
+ if ((parentpath && strcmp(parentpath, "pg_tblspc") == 0) ||
+ strcmp(path, "pg_wal") == 0)
+ recurse_dir(datadir, path, callback);
+ }
+ }
+
+ if (errno)
+ pg_fatal("could not read directory \"%s\": %m",
+ fullparentpath);
+
+ if (closedir(xldir))
+ pg_fatal("could not close directory \"%s\": %m",
+ fullparentpath);
+}
diff --git a/src/bin/pg_rewind/file_ops.h b/src/bin/pg_rewind/file_ops.h
new file mode 100644
index 0000000..427cf8e
--- /dev/null
+++ b/src/bin/pg_rewind/file_ops.h
@@ -0,0 +1,29 @@
+/*-------------------------------------------------------------------------
+ *
+ * file_ops.h
+ * Helper functions for operating on files
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FILE_OPS_H
+#define FILE_OPS_H
+
+#include "filemap.h"
+
+extern void open_target_file(const char *path, bool trunc);
+extern void write_target_range(char *buf, off_t begin, size_t size);
+extern void close_target_file(void);
+extern void remove_target_file(const char *path, bool missing_ok);
+extern void truncate_target_file(const char *path, off_t newsize);
+extern void create_target(file_entry_t *entry);
+extern void remove_target(file_entry_t *entry);
+extern void sync_target_dir(void);
+
+extern char *slurpFile(const char *datadir, const char *path, size_t *filesize);
+
+typedef void (*process_file_callback_t) (const char *path, file_type_t type, size_t size, const char *link_target);
+extern void traverse_datadir(const char *datadir, process_file_callback_t callback);
+
+#endif /* FILE_OPS_H */
diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c
new file mode 100644
index 0000000..bd5c598
--- /dev/null
+++ b/src/bin/pg_rewind/filemap.c
@@ -0,0 +1,831 @@
+/*-------------------------------------------------------------------------
+ *
+ * filemap.c
+ * A data structure for keeping track of files that have changed.
+ *
+ * This source file contains the logic to decide what to do with different
+ * kinds of files, and the data structure to support it. Before modifying
+ * anything, pg_rewind collects information about all the files and their
+ * attributes in the target and source data directories. It also scans the
+ * WAL log in the target, and collects information about data blocks that
+ * were changed. All this information is stored in a hash table, using the
+ * file path relative to the root of the data directory as the key.
+ *
+ * After collecting all the information required, the decide_file_actions()
+ * function scans the hash table and decides what action needs to be taken
+ * for each file. Finally, it sorts the array to the final order that the
+ * actions should be executed in.
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "catalog/pg_tablespace_d.h"
+#include "common/hashfn.h"
+#include "common/string.h"
+#include "datapagemap.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+#include "storage/fd.h"
+
+/*
+ * Define a hash table which we can use to store information about the files
+ * appearing in source and target systems.
+ */
+static uint32 hash_string_pointer(const char *s);
+#define SH_PREFIX filehash
+#define SH_ELEMENT_TYPE file_entry_t
+#define SH_KEY_TYPE const char *
+#define SH_KEY path
+#define SH_HASH_KEY(tb, key) hash_string_pointer(key)
+#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0)
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+#define FILEHASH_INITIAL_SIZE 1000
+
+static filehash_hash *filehash;
+
+static bool isRelDataFile(const char *path);
+static char *datasegpath(RelFileLocator rlocator, ForkNumber forknum,
+ BlockNumber segno);
+
+static file_entry_t *insert_filehash_entry(const char *path);
+static file_entry_t *lookup_filehash_entry(const char *path);
+static int final_filemap_cmp(const void *a, const void *b);
+static bool check_file_excluded(const char *path, bool is_source);
+
+/*
+ * Definition of one element part of an exclusion list, used to exclude
+ * contents when rewinding. "name" is the name of the file or path to
+ * check for exclusion. If "match_prefix" is true, any items matching
+ * the name as prefix are excluded.
+ */
+struct exclude_list_item
+{
+ const char *name;
+ bool match_prefix;
+};
+
+/*
+ * The contents of these directories are removed or recreated during server
+ * start so they are not included in data processed by pg_rewind.
+ *
+ * Note: those lists should be kept in sync with what basebackup.c provides.
+ * Some of the values, contrary to what basebackup.c uses, are hardcoded as
+ * they are defined in backend-only headers. So this list is maintained
+ * with a best effort in mind.
+ */
+static const char *excludeDirContents[] =
+{
+ /*
+ * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped
+ * because extensions like pg_stat_statements store data there.
+ */
+ "pg_stat_tmp", /* defined as PG_STAT_TMP_DIR */
+
+ /*
+ * It is generally not useful to backup the contents of this directory
+ * even if the intention is to restore to another primary. See backup.sgml
+ * for a more detailed description.
+ */
+ "pg_replslot",
+
+ /* Contents removed on startup, see dsm_cleanup_for_mmap(). */
+ "pg_dynshmem", /* defined as PG_DYNSHMEM_DIR */
+
+ /* Contents removed on startup, see AsyncShmemInit(). */
+ "pg_notify",
+
+ /*
+ * Old contents are loaded for possible debugging but are not required for
+ * normal operation, see SerialInit().
+ */
+ "pg_serial",
+
+ /* Contents removed on startup, see DeleteAllExportedSnapshotFiles(). */
+ "pg_snapshots",
+
+ /* Contents zeroed on startup, see StartupSUBTRANS(). */
+ "pg_subtrans",
+
+ /* end of list */
+ NULL
+};
+
+/*
+ * List of files excluded from filemap processing. Files are excluded
+ * if their prefix match.
+ */
+static const struct exclude_list_item excludeFiles[] =
+{
+ /* Skip auto conf temporary file. */
+ {"postgresql.auto.conf.tmp", false}, /* defined as PG_AUTOCONF_FILENAME */
+
+ /* Skip current log file temporary file */
+ {"current_logfiles.tmp", false}, /* defined as
+ * LOG_METAINFO_DATAFILE_TMP */
+
+ /* Skip relation cache because it is rebuilt on startup */
+ {"pg_internal.init", true}, /* defined as RELCACHE_INIT_FILENAME */
+
+ /*
+ * If there is a backup_label or tablespace_map file, it indicates that a
+ * recovery failed and this cluster probably can't be rewound, but exclude
+ * them anyway if they are found.
+ */
+ {"backup_label", false}, /* defined as BACKUP_LABEL_FILE */
+ {"tablespace_map", false}, /* defined as TABLESPACE_MAP */
+
+ /*
+ * If there's a backup_manifest, it belongs to a backup that was used to
+ * start this server. It is *not* correct for this backup. Our
+ * backup_manifest is injected into the backup separately if users want
+ * it.
+ */
+ {"backup_manifest", false},
+
+ {"postmaster.pid", false},
+ {"postmaster.opts", false},
+
+ /* end of list */
+ {NULL, false}
+};
+
+/*
+ * Initialize the hash table for the file map.
+ */
+void
+filehash_init(void)
+{
+ filehash = filehash_create(FILEHASH_INITIAL_SIZE, NULL);
+}
+
+/* Look up entry for 'path', creating a new one if it doesn't exist */
+static file_entry_t *
+insert_filehash_entry(const char *path)
+{
+ file_entry_t *entry;
+ bool found;
+
+ entry = filehash_insert(filehash, path, &found);
+ if (!found)
+ {
+ entry->path = pg_strdup(path);
+ entry->isrelfile = isRelDataFile(path);
+
+ entry->target_exists = false;
+ entry->target_type = FILE_TYPE_UNDEFINED;
+ entry->target_size = 0;
+ entry->target_link_target = NULL;
+ entry->target_pages_to_overwrite.bitmap = NULL;
+ entry->target_pages_to_overwrite.bitmapsize = 0;
+
+ entry->source_exists = false;
+ entry->source_type = FILE_TYPE_UNDEFINED;
+ entry->source_size = 0;
+ entry->source_link_target = NULL;
+
+ entry->action = FILE_ACTION_UNDECIDED;
+ }
+
+ return entry;
+}
+
+static file_entry_t *
+lookup_filehash_entry(const char *path)
+{
+ return filehash_lookup(filehash, path);
+}
+
+/*
+ * Callback for processing source file list.
+ *
+ * This is called once for every file in the source server. We record the
+ * type and size of the file, so that decide_file_action() can later decide what
+ * to do with it.
+ */
+void
+process_source_file(const char *path, file_type_t type, size_t size,
+ const char *link_target)
+{
+ file_entry_t *entry;
+
+ /*
+ * Pretend that pg_wal is a directory, even if it's really a symlink. We
+ * don't want to mess with the symlink itself, nor complain if it's a
+ * symlink in source but not in target or vice versa.
+ */
+ if (strcmp(path, "pg_wal") == 0 && type == FILE_TYPE_SYMLINK)
+ type = FILE_TYPE_DIRECTORY;
+
+ /*
+ * sanity check: a filename that looks like a data file better be a
+ * regular file
+ */
+ if (type != FILE_TYPE_REGULAR && isRelDataFile(path))
+ pg_fatal("data file \"%s\" in source is not a regular file", path);
+
+ /* Remember this source file */
+ entry = insert_filehash_entry(path);
+ if (entry->source_exists)
+ pg_fatal("duplicate source file \"%s\"", path);
+ entry->source_exists = true;
+ entry->source_type = type;
+ entry->source_size = size;
+ entry->source_link_target = link_target ? pg_strdup(link_target) : NULL;
+}
+
+/*
+ * Callback for processing target file list.
+ *
+ * Record the type and size of the file, like process_source_file() does.
+ */
+void
+process_target_file(const char *path, file_type_t type, size_t size,
+ const char *link_target)
+{
+ file_entry_t *entry;
+
+ /*
+ * Do not apply any exclusion filters here. This has advantage to remove
+ * from the target data folder all paths which have been filtered out from
+ * the source data folder when processing the source files.
+ */
+
+ /*
+ * Like in process_source_file, pretend that pg_wal is always a directory.
+ */
+ if (strcmp(path, "pg_wal") == 0 && type == FILE_TYPE_SYMLINK)
+ type = FILE_TYPE_DIRECTORY;
+
+ /* Remember this target file */
+ entry = insert_filehash_entry(path);
+ if (entry->target_exists)
+ pg_fatal("duplicate source file \"%s\"", path);
+ entry->target_exists = true;
+ entry->target_type = type;
+ entry->target_size = size;
+ entry->target_link_target = link_target ? pg_strdup(link_target) : NULL;
+}
+
+/*
+ * This callback gets called while we read the WAL in the target, for every
+ * block that has changed in the target system. It decides if the given
+ * 'blkno' in the target relfile needs to be overwritten from the source, and
+ * if so, records it in 'target_pages_to_overwrite' bitmap.
+ *
+ * NOTE: All the files on both systems must have already been added to the
+ * hash table!
+ */
+void
+process_target_wal_block_change(ForkNumber forknum, RelFileLocator rlocator,
+ BlockNumber blkno)
+{
+ char *path;
+ file_entry_t *entry;
+ BlockNumber blkno_inseg;
+ int segno;
+
+ segno = blkno / RELSEG_SIZE;
+ blkno_inseg = blkno % RELSEG_SIZE;
+
+ path = datasegpath(rlocator, forknum, segno);
+ entry = lookup_filehash_entry(path);
+ pfree(path);
+
+ /*
+ * If the block still exists in both systems, remember it. Otherwise we
+ * can safely ignore it.
+ *
+ * If the block is beyond the EOF in the source system, or the file
+ * doesn't exist in the source at all, we're going to truncate/remove it
+ * away from the target anyway. Likewise, if it doesn't exist in the
+ * target anymore, we will copy it over with the "tail" from the source
+ * system, anyway.
+ *
+ * It is possible to find WAL for a file that doesn't exist on either
+ * system anymore. It means that the relation was dropped later in the
+ * target system, and independently on the source system too, or that it
+ * was created and dropped in the target system and it never existed in
+ * the source. Either way, we can safely ignore it.
+ */
+ if (entry)
+ {
+ Assert(entry->isrelfile);
+
+ if (entry->target_exists)
+ {
+ if (entry->target_type != FILE_TYPE_REGULAR)
+ pg_fatal("unexpected page modification for non-regular file \"%s\"",
+ entry->path);
+
+ if (entry->source_exists)
+ {
+ off_t end_offset;
+
+ end_offset = (blkno_inseg + 1) * BLCKSZ;
+ if (end_offset <= entry->source_size && end_offset <= entry->target_size)
+ datapagemap_add(&entry->target_pages_to_overwrite, blkno_inseg);
+ }
+ }
+ }
+}
+
+/*
+ * Is this the path of file that pg_rewind can skip copying?
+ */
+static bool
+check_file_excluded(const char *path, bool is_source)
+{
+ char localpath[MAXPGPATH];
+ int excludeIdx;
+ const char *filename;
+
+ /*
+ * Skip all temporary files, .../pgsql_tmp/... and .../pgsql_tmp.*
+ */
+ if (strstr(path, "/" PG_TEMP_FILE_PREFIX) != NULL ||
+ strstr(path, "/" PG_TEMP_FILES_DIR "/") != NULL)
+ {
+ return true;
+ }
+
+ /* check individual files... */
+ for (excludeIdx = 0; excludeFiles[excludeIdx].name != NULL; excludeIdx++)
+ {
+ int cmplen = strlen(excludeFiles[excludeIdx].name);
+
+ filename = last_dir_separator(path);
+ if (filename == NULL)
+ filename = path;
+ else
+ filename++;
+
+ if (!excludeFiles[excludeIdx].match_prefix)
+ cmplen++;
+ if (strncmp(filename, excludeFiles[excludeIdx].name, cmplen) == 0)
+ {
+ if (is_source)
+ pg_log_debug("entry \"%s\" excluded from source file list",
+ path);
+ else
+ pg_log_debug("entry \"%s\" excluded from target file list",
+ path);
+ return true;
+ }
+ }
+
+ /*
+ * ... And check some directories. Note that this includes any contents
+ * within the directories themselves.
+ */
+ for (excludeIdx = 0; excludeDirContents[excludeIdx] != NULL; excludeIdx++)
+ {
+ snprintf(localpath, sizeof(localpath), "%s/",
+ excludeDirContents[excludeIdx]);
+ if (strstr(path, localpath) == path)
+ {
+ if (is_source)
+ pg_log_debug("entry \"%s\" excluded from source file list",
+ path);
+ else
+ pg_log_debug("entry \"%s\" excluded from target file list",
+ path);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static const char *
+action_to_str(file_action_t action)
+{
+ switch (action)
+ {
+ case FILE_ACTION_NONE:
+ return "NONE";
+ case FILE_ACTION_COPY:
+ return "COPY";
+ case FILE_ACTION_TRUNCATE:
+ return "TRUNCATE";
+ case FILE_ACTION_COPY_TAIL:
+ return "COPY_TAIL";
+ case FILE_ACTION_CREATE:
+ return "CREATE";
+ case FILE_ACTION_REMOVE:
+ return "REMOVE";
+
+ default:
+ return "unknown";
+ }
+}
+
+/*
+ * Calculate the totals needed for progress reports.
+ */
+void
+calculate_totals(filemap_t *filemap)
+{
+ file_entry_t *entry;
+ int i;
+
+ filemap->total_size = 0;
+ filemap->fetch_size = 0;
+
+ for (i = 0; i < filemap->nentries; i++)
+ {
+ entry = filemap->entries[i];
+
+ if (entry->source_type != FILE_TYPE_REGULAR)
+ continue;
+
+ filemap->total_size += entry->source_size;
+
+ if (entry->action == FILE_ACTION_COPY)
+ {
+ filemap->fetch_size += entry->source_size;
+ continue;
+ }
+
+ if (entry->action == FILE_ACTION_COPY_TAIL)
+ filemap->fetch_size += (entry->source_size - entry->target_size);
+
+ if (entry->target_pages_to_overwrite.bitmapsize > 0)
+ {
+ datapagemap_iterator_t *iter;
+ BlockNumber blk;
+
+ iter = datapagemap_iterate(&entry->target_pages_to_overwrite);
+ while (datapagemap_next(iter, &blk))
+ filemap->fetch_size += BLCKSZ;
+
+ pg_free(iter);
+ }
+ }
+}
+
+void
+print_filemap(filemap_t *filemap)
+{
+ file_entry_t *entry;
+ int i;
+
+ for (i = 0; i < filemap->nentries; i++)
+ {
+ entry = filemap->entries[i];
+ if (entry->action != FILE_ACTION_NONE ||
+ entry->target_pages_to_overwrite.bitmapsize > 0)
+ {
+ pg_log_debug("%s (%s)", entry->path,
+ action_to_str(entry->action));
+
+ if (entry->target_pages_to_overwrite.bitmapsize > 0)
+ datapagemap_print(&entry->target_pages_to_overwrite);
+ }
+ }
+ fflush(stdout);
+}
+
+/*
+ * Does it look like a relation data file?
+ *
+ * For our purposes, only files belonging to the main fork are considered
+ * relation files. Other forks are always copied in toto, because we cannot
+ * reliably track changes to them, because WAL only contains block references
+ * for the main fork.
+ */
+static bool
+isRelDataFile(const char *path)
+{
+ RelFileLocator rlocator;
+ unsigned int segNo;
+ int nmatch;
+ bool matched;
+
+ /*----
+ * Relation data files can be in one of the following directories:
+ *
+ * global/
+ * shared relations
+ *
+ * base/<db oid>/
+ * regular relations, default tablespace
+ *
+ * pg_tblspc/<tblspc oid>/<tblspc version>/
+ * within a non-default tablespace (the name of the directory
+ * depends on version)
+ *
+ * And the relation data files themselves have a filename like:
+ *
+ * <oid>.<segment number>
+ *
+ *----
+ */
+ rlocator.spcOid = InvalidOid;
+ rlocator.dbOid = InvalidOid;
+ rlocator.relNumber = InvalidRelFileNumber;
+ segNo = 0;
+ matched = false;
+
+ nmatch = sscanf(path, "global/%u.%u", &rlocator.relNumber, &segNo);
+ if (nmatch == 1 || nmatch == 2)
+ {
+ rlocator.spcOid = GLOBALTABLESPACE_OID;
+ rlocator.dbOid = 0;
+ matched = true;
+ }
+ else
+ {
+ nmatch = sscanf(path, "base/%u/%u.%u",
+ &rlocator.dbOid, &rlocator.relNumber, &segNo);
+ if (nmatch == 2 || nmatch == 3)
+ {
+ rlocator.spcOid = DEFAULTTABLESPACE_OID;
+ matched = true;
+ }
+ else
+ {
+ nmatch = sscanf(path, "pg_tblspc/%u/" TABLESPACE_VERSION_DIRECTORY "/%u/%u.%u",
+ &rlocator.spcOid, &rlocator.dbOid, &rlocator.relNumber,
+ &segNo);
+ if (nmatch == 3 || nmatch == 4)
+ matched = true;
+ }
+ }
+
+ /*
+ * The sscanf tests above can match files that have extra characters at
+ * the end. To eliminate such cases, cross-check that GetRelationPath
+ * creates the exact same filename, when passed the RelFileLocator
+ * information we extracted from the filename.
+ */
+ if (matched)
+ {
+ char *check_path = datasegpath(rlocator, MAIN_FORKNUM, segNo);
+
+ if (strcmp(check_path, path) != 0)
+ matched = false;
+
+ pfree(check_path);
+ }
+
+ return matched;
+}
+
+/*
+ * A helper function to create the path of a relation file and segment.
+ *
+ * The returned path is palloc'd
+ */
+static char *
+datasegpath(RelFileLocator rlocator, ForkNumber forknum, BlockNumber segno)
+{
+ char *path;
+ char *segpath;
+
+ path = relpathperm(rlocator, forknum);
+ if (segno > 0)
+ {
+ segpath = psprintf("%s.%u", path, segno);
+ pfree(path);
+ return segpath;
+ }
+ else
+ return path;
+}
+
+/*
+ * In the final stage, the filemap is sorted so that removals come last.
+ * From disk space usage point of view, it would be better to do removals
+ * first, but for now, safety first. If a whole directory is deleted, all
+ * files and subdirectories inside it need to removed first. On creation,
+ * parent directory needs to be created before files and directories inside
+ * it. To achieve that, the file_action_t enum is ordered so that we can
+ * just sort on that first. Furthermore, sort REMOVE entries in reverse
+ * path order, so that "foo/bar" subdirectory is removed before "foo".
+ */
+static int
+final_filemap_cmp(const void *a, const void *b)
+{
+ file_entry_t *fa = *((file_entry_t **) a);
+ file_entry_t *fb = *((file_entry_t **) b);
+
+ if (fa->action > fb->action)
+ return 1;
+ if (fa->action < fb->action)
+ return -1;
+
+ if (fa->action == FILE_ACTION_REMOVE)
+ return strcmp(fb->path, fa->path);
+ else
+ return strcmp(fa->path, fb->path);
+}
+
+/*
+ * Decide what action to perform to a file.
+ */
+static file_action_t
+decide_file_action(file_entry_t *entry)
+{
+ const char *path = entry->path;
+
+ /*
+ * Don't touch the control file. It is handled specially, after copying
+ * all the other files.
+ */
+ if (strcmp(path, "global/pg_control") == 0)
+ return FILE_ACTION_NONE;
+
+ /*
+ * Remove all files matching the exclusion filters in the target.
+ */
+ if (check_file_excluded(path, true))
+ {
+ if (entry->target_exists)
+ return FILE_ACTION_REMOVE;
+ else
+ return FILE_ACTION_NONE;
+ }
+
+ /*
+ * Handle cases where the file is missing from one of the systems.
+ */
+ if (!entry->target_exists && entry->source_exists)
+ {
+ /*
+ * File exists in source, but not in target. Copy it in toto. (If it's
+ * a relation data file, WAL replay after rewinding should re-create
+ * it anyway. But there's no harm in copying it now.)
+ */
+ switch (entry->source_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ case FILE_TYPE_SYMLINK:
+ return FILE_ACTION_CREATE;
+ case FILE_TYPE_REGULAR:
+ return FILE_ACTION_COPY;
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("unknown file type for \"%s\"", entry->path);
+ break;
+ }
+ }
+ else if (entry->target_exists && !entry->source_exists)
+ {
+ /* File exists in target, but not source. Remove it. */
+ return FILE_ACTION_REMOVE;
+ }
+ else if (!entry->target_exists && !entry->source_exists)
+ {
+ /*
+ * Doesn't exist in either server. Why does it have an entry in the
+ * first place??
+ */
+ Assert(false);
+ return FILE_ACTION_NONE;
+ }
+
+ /*
+ * Otherwise, the file exists on both systems
+ */
+ Assert(entry->target_exists && entry->source_exists);
+
+ if (entry->source_type != entry->target_type)
+ {
+ /* But it's a different kind of object. Strange.. */
+ pg_fatal("file \"%s\" is of different type in source and target", entry->path);
+ }
+
+ /*
+ * PG_VERSION files should be identical on both systems, but avoid
+ * overwriting them for paranoia.
+ */
+ if (pg_str_endswith(entry->path, "PG_VERSION"))
+ return FILE_ACTION_NONE;
+
+ switch (entry->source_type)
+ {
+ case FILE_TYPE_DIRECTORY:
+ return FILE_ACTION_NONE;
+
+ case FILE_TYPE_SYMLINK:
+
+ /*
+ * XXX: Should we check if it points to the same target?
+ */
+ return FILE_ACTION_NONE;
+
+ case FILE_TYPE_REGULAR:
+ if (!entry->isrelfile)
+ {
+ /*
+ * It's a non-data file that we have no special processing
+ * for. Copy it in toto.
+ */
+ return FILE_ACTION_COPY;
+ }
+ else
+ {
+ /*
+ * It's a data file that exists in both systems.
+ *
+ * If it's larger in target, we can truncate it. There will
+ * also be a WAL record of the truncation in the source
+ * system, so WAL replay would eventually truncate the target
+ * too, but we might as well do it now.
+ *
+ * If it's smaller in the target, it means that it has been
+ * truncated in the target, or enlarged in the source, or
+ * both. If it was truncated in the target, we need to copy
+ * the missing tail from the source system. If it was enlarged
+ * in the source system, there will be WAL records in the
+ * source system for the new blocks, so we wouldn't need to
+ * copy them here. But we don't know which scenario we're
+ * dealing with, and there's no harm in copying the missing
+ * blocks now, so do it now.
+ *
+ * If it's the same size, do nothing here. Any blocks modified
+ * in the target will be copied based on parsing the target
+ * system's WAL, and any blocks modified in the source will be
+ * updated after rewinding, when the source system's WAL is
+ * replayed.
+ */
+ if (entry->target_size < entry->source_size)
+ return FILE_ACTION_COPY_TAIL;
+ else if (entry->target_size > entry->source_size)
+ return FILE_ACTION_TRUNCATE;
+ else
+ return FILE_ACTION_NONE;
+ }
+ break;
+
+ case FILE_TYPE_UNDEFINED:
+ pg_fatal("unknown file type for \"%s\"", path);
+ break;
+ }
+
+ /* unreachable */
+ pg_fatal("could not decide what to do with file \"%s\"", path);
+}
+
+/*
+ * Decide what to do with each file.
+ *
+ * Returns a 'filemap' with the entries in the order that their actions
+ * should be executed.
+ */
+filemap_t *
+decide_file_actions(void)
+{
+ int i;
+ filehash_iterator it;
+ file_entry_t *entry;
+ filemap_t *filemap;
+
+ filehash_start_iterate(filehash, &it);
+ while ((entry = filehash_iterate(filehash, &it)) != NULL)
+ {
+ entry->action = decide_file_action(entry);
+ }
+
+ /*
+ * Turn the hash table into an array, and sort in the order that the
+ * actions should be performed.
+ */
+ filemap = pg_malloc(offsetof(filemap_t, entries) +
+ filehash->members * sizeof(file_entry_t *));
+ filemap->nentries = filehash->members;
+ filehash_start_iterate(filehash, &it);
+ i = 0;
+ while ((entry = filehash_iterate(filehash, &it)) != NULL)
+ {
+ filemap->entries[i++] = entry;
+ }
+
+ qsort(&filemap->entries, filemap->nentries, sizeof(file_entry_t *),
+ final_filemap_cmp);
+
+ return filemap;
+}
+
+
+/*
+ * Helper function for filemap hash table.
+ */
+static uint32
+hash_string_pointer(const char *s)
+{
+ unsigned char *ss = (unsigned char *) s;
+
+ return hash_bytes(ss, strlen(s));
+}
diff --git a/src/bin/pg_rewind/filemap.h b/src/bin/pg_rewind/filemap.h
new file mode 100644
index 0000000..48f240d
--- /dev/null
+++ b/src/bin/pg_rewind/filemap.h
@@ -0,0 +1,113 @@
+/*-------------------------------------------------------------------------
+ *
+ * filemap.h
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *-------------------------------------------------------------------------
+ */
+#ifndef FILEMAP_H
+#define FILEMAP_H
+
+#include "datapagemap.h"
+#include "storage/block.h"
+#include "storage/relfilelocator.h"
+
+/* these enum values are sorted in the order we want actions to be processed */
+typedef enum
+{
+ FILE_ACTION_UNDECIDED = 0, /* not decided yet */
+
+ FILE_ACTION_CREATE, /* create local directory or symbolic link */
+ FILE_ACTION_COPY, /* copy whole file, overwriting if exists */
+ FILE_ACTION_COPY_TAIL, /* copy tail from 'source_size' to
+ * 'target_size' */
+ FILE_ACTION_NONE, /* no action (we might still copy modified
+ * blocks based on the parsed WAL) */
+ FILE_ACTION_TRUNCATE, /* truncate local file to 'newsize' bytes */
+ FILE_ACTION_REMOVE /* remove local file / directory / symlink */
+} file_action_t;
+
+typedef enum
+{
+ FILE_TYPE_UNDEFINED = 0,
+
+ FILE_TYPE_REGULAR,
+ FILE_TYPE_DIRECTORY,
+ FILE_TYPE_SYMLINK
+} file_type_t;
+
+/*
+ * For every file found in the local or remote system, we have a file entry
+ * that contains information about the file on both systems. For relation
+ * files, there is also a page map that marks pages in the file that were
+ * changed in the target after the last common checkpoint.
+ *
+ * When gathering information, these are kept in a hash table, private to
+ * filemap.c. decide_file_actions() fills in the 'action' field, sorts all
+ * the entries, and returns them in an array, ready for executing the actions.
+ */
+typedef struct file_entry_t
+{
+ uint32 status; /* hash status */
+
+ const char *path;
+ bool isrelfile; /* is it a relation data file? */
+
+ /*
+ * Status of the file in the target.
+ */
+ bool target_exists;
+ file_type_t target_type;
+ size_t target_size; /* for a regular file */
+ char *target_link_target; /* for a symlink */
+
+ /*
+ * Pages that were modified in the target and need to be replaced from the
+ * source.
+ */
+ datapagemap_t target_pages_to_overwrite;
+
+ /*
+ * Status of the file in the source.
+ */
+ bool source_exists;
+ file_type_t source_type;
+ size_t source_size;
+ char *source_link_target; /* for a symlink */
+
+ /*
+ * What will we do to the file?
+ */
+ file_action_t action;
+} file_entry_t;
+
+/*
+ * This contains the final decisions on what to do with each file.
+ * 'entries' array contains an entry for each file, sorted in the order
+ * that their actions should executed.
+ */
+typedef struct filemap_t
+{
+ /* Summary information, filled by calculate_totals() */
+ uint64 total_size; /* total size of the source cluster */
+ uint64 fetch_size; /* number of bytes that needs to be copied */
+
+ int nentries; /* size of 'entries' array */
+ file_entry_t *entries[FLEXIBLE_ARRAY_MEMBER];
+} filemap_t;
+
+/* Functions for populating the filemap */
+extern void filehash_init(void);
+extern void process_source_file(const char *path, file_type_t type,
+ size_t size, const char *link_target);
+extern void process_target_file(const char *path, file_type_t type,
+ size_t size, const char *link_target);
+extern void process_target_wal_block_change(ForkNumber forknum,
+ RelFileLocator rlocator,
+ BlockNumber blkno);
+
+extern filemap_t *decide_file_actions(void);
+extern void calculate_totals(filemap_t *filemap);
+extern void print_filemap(filemap_t *filemap);
+
+#endif /* FILEMAP_H */
diff --git a/src/bin/pg_rewind/libpq_source.c b/src/bin/pg_rewind/libpq_source.c
new file mode 100644
index 0000000..0d8e9ee
--- /dev/null
+++ b/src/bin/pg_rewind/libpq_source.c
@@ -0,0 +1,675 @@
+/*-------------------------------------------------------------------------
+ *
+ * libpq_source.c
+ * Functions for fetching files from a remote server via libpq.
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "catalog/pg_type_d.h"
+#include "common/connect.h"
+#include "datapagemap.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "lib/stringinfo.h"
+#include "pg_rewind.h"
+#include "port/pg_bswap.h"
+#include "rewind_source.h"
+
+/*
+ * Files are fetched MAX_CHUNK_SIZE bytes at a time, and with a
+ * maximum of MAX_CHUNKS_PER_QUERY chunks in a single query.
+ */
+#define MAX_CHUNK_SIZE (1024 * 1024)
+#define MAX_CHUNKS_PER_QUERY 1000
+
+/* represents a request to fetch a piece of a file from the source */
+typedef struct
+{
+ const char *path; /* path relative to data directory root */
+ off_t offset;
+ size_t length;
+} fetch_range_request;
+
+typedef struct
+{
+ rewind_source common; /* common interface functions */
+
+ PGconn *conn;
+
+ /*
+ * Queue of chunks that have been requested with the queue_fetch_range()
+ * function, but have not been fetched from the remote server yet.
+ */
+ int num_requests;
+ fetch_range_request request_queue[MAX_CHUNKS_PER_QUERY];
+
+ /* temporary space for process_queued_fetch_requests() */
+ StringInfoData paths;
+ StringInfoData offsets;
+ StringInfoData lengths;
+} libpq_source;
+
+static void init_libpq_conn(PGconn *conn);
+static char *run_simple_query(PGconn *conn, const char *sql);
+static void run_simple_command(PGconn *conn, const char *sql);
+static void appendArrayEscapedString(StringInfo buf, const char *str);
+
+static void process_queued_fetch_requests(libpq_source *src);
+
+/* public interface functions */
+static void libpq_traverse_files(rewind_source *source,
+ process_file_callback_t callback);
+static void libpq_queue_fetch_file(rewind_source *source, const char *path, size_t len);
+static void libpq_queue_fetch_range(rewind_source *source, const char *path,
+ off_t off, size_t len);
+static void libpq_finish_fetch(rewind_source *source);
+static char *libpq_fetch_file(rewind_source *source, const char *path,
+ size_t *filesize);
+static XLogRecPtr libpq_get_current_wal_insert_lsn(rewind_source *source);
+static void libpq_destroy(rewind_source *source);
+
+/*
+ * Create a new libpq source.
+ *
+ * The caller has already established the connection, but should not try
+ * to use it while the source is active.
+ */
+rewind_source *
+init_libpq_source(PGconn *conn)
+{
+ libpq_source *src;
+
+ init_libpq_conn(conn);
+
+ src = pg_malloc0(sizeof(libpq_source));
+
+ src->common.traverse_files = libpq_traverse_files;
+ src->common.fetch_file = libpq_fetch_file;
+ src->common.queue_fetch_file = libpq_queue_fetch_file;
+ src->common.queue_fetch_range = libpq_queue_fetch_range;
+ src->common.finish_fetch = libpq_finish_fetch;
+ src->common.get_current_wal_insert_lsn = libpq_get_current_wal_insert_lsn;
+ src->common.destroy = libpq_destroy;
+
+ src->conn = conn;
+
+ initStringInfo(&src->paths);
+ initStringInfo(&src->offsets);
+ initStringInfo(&src->lengths);
+
+ return &src->common;
+}
+
+/*
+ * Initialize a libpq connection for use.
+ */
+static void
+init_libpq_conn(PGconn *conn)
+{
+ PGresult *res;
+ char *str;
+
+ /* disable all types of timeouts */
+ run_simple_command(conn, "SET statement_timeout = 0");
+ run_simple_command(conn, "SET lock_timeout = 0");
+ run_simple_command(conn, "SET idle_in_transaction_session_timeout = 0");
+
+ /*
+ * we don't intend to do any updates, put the connection in read-only mode
+ * to keep us honest
+ */
+ run_simple_command(conn, "SET default_transaction_read_only = on");
+
+ /* secure search_path */
+ res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL);
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not clear search_path: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+
+ /*
+ * Also check that full_page_writes is enabled. We can get torn pages if
+ * a page is modified while we read it with pg_read_binary_file(), and we
+ * rely on full page images to fix them.
+ */
+ str = run_simple_query(conn, "SHOW full_page_writes");
+ if (strcmp(str, "on") != 0)
+ pg_fatal("full_page_writes must be enabled in the source server");
+ pg_free(str);
+
+ /* Prepare a statement we'll use to fetch files */
+ res = PQprepare(conn, "fetch_chunks_stmt",
+ "SELECT path, begin,\n"
+ " pg_read_binary_file(path, begin, len, true) AS chunk\n"
+ "FROM unnest ($1::text[], $2::int8[], $3::int4[]) as x(path, begin, len)",
+ 3, NULL);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_fatal("could not prepare statement to fetch file contents: %s",
+ PQresultErrorMessage(res));
+ PQclear(res);
+}
+
+/*
+ * Run a query that returns a single value.
+ *
+ * The result should be pg_free'd after use.
+ */
+static char *
+run_simple_query(PGconn *conn, const char *sql)
+{
+ PGresult *res;
+ char *result;
+
+ res = PQexec(conn, sql);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("error running query (%s) on source server: %s",
+ sql, PQresultErrorMessage(res));
+
+ /* sanity check the result set */
+ if (PQnfields(res) != 1 || PQntuples(res) != 1 || PQgetisnull(res, 0, 0))
+ pg_fatal("unexpected result set from query");
+
+ result = pg_strdup(PQgetvalue(res, 0, 0));
+
+ PQclear(res);
+
+ return result;
+}
+
+/*
+ * Run a command.
+ *
+ * In the event of a failure, exit immediately.
+ */
+static void
+run_simple_command(PGconn *conn, const char *sql)
+{
+ PGresult *res;
+
+ res = PQexec(conn, sql);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_fatal("error running query (%s) in source server: %s",
+ sql, PQresultErrorMessage(res));
+
+ PQclear(res);
+}
+
+/*
+ * Call the pg_current_wal_insert_lsn() function in the remote system.
+ */
+static XLogRecPtr
+libpq_get_current_wal_insert_lsn(rewind_source *source)
+{
+ PGconn *conn = ((libpq_source *) source)->conn;
+ XLogRecPtr result;
+ uint32 hi;
+ uint32 lo;
+ char *val;
+
+ val = run_simple_query(conn, "SELECT pg_current_wal_insert_lsn()");
+
+ if (sscanf(val, "%X/%X", &hi, &lo) != 2)
+ pg_fatal("unrecognized result \"%s\" for current WAL insert location", val);
+
+ result = ((uint64) hi) << 32 | lo;
+
+ pg_free(val);
+
+ return result;
+}
+
+/*
+ * Get a list of all files in the data directory.
+ */
+static void
+libpq_traverse_files(rewind_source *source, process_file_callback_t callback)
+{
+ PGconn *conn = ((libpq_source *) source)->conn;
+ PGresult *res;
+ const char *sql;
+ int i;
+
+ /*
+ * Create a recursive directory listing of the whole data directory.
+ *
+ * The WITH RECURSIVE part does most of the work. The second part gets the
+ * targets of the symlinks in pg_tblspc directory.
+ *
+ * XXX: There is no backend function to get a symbolic link's target in
+ * general, so if the admin has put any custom symbolic links in the data
+ * directory, they won't be copied correctly.
+ */
+ sql =
+ "WITH RECURSIVE files (path, filename, size, isdir) AS (\n"
+ " SELECT '' AS path, filename, size, isdir FROM\n"
+ " (SELECT pg_ls_dir('.', true, false) AS filename) AS fn,\n"
+ " pg_stat_file(fn.filename, true) AS this\n"
+ " UNION ALL\n"
+ " SELECT parent.path || parent.filename || '/' AS path,\n"
+ " fn, this.size, this.isdir\n"
+ " FROM files AS parent,\n"
+ " pg_ls_dir(parent.path || parent.filename, true, false) AS fn,\n"
+ " pg_stat_file(parent.path || parent.filename || '/' || fn, true) AS this\n"
+ " WHERE parent.isdir = 't'\n"
+ ")\n"
+ "SELECT path || filename, size, isdir,\n"
+ " pg_tablespace_location(pg_tablespace.oid) AS link_target\n"
+ "FROM files\n"
+ "LEFT OUTER JOIN pg_tablespace ON files.path = 'pg_tblspc/'\n"
+ " AND oid::text = files.filename\n";
+ res = PQexec(conn, sql);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not fetch file list: %s",
+ PQresultErrorMessage(res));
+
+ /* sanity check the result set */
+ if (PQnfields(res) != 4)
+ pg_fatal("unexpected result set while fetching file list");
+
+ /* Read result to local variables */
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ char *path;
+ int64 filesize;
+ bool isdir;
+ char *link_target;
+ file_type_t type;
+
+ if (PQgetisnull(res, i, 1))
+ {
+ /*
+ * The file was removed from the server while the query was
+ * running. Ignore it.
+ */
+ continue;
+ }
+
+ path = PQgetvalue(res, i, 0);
+ filesize = atol(PQgetvalue(res, i, 1));
+ isdir = (strcmp(PQgetvalue(res, i, 2), "t") == 0);
+ link_target = PQgetvalue(res, i, 3);
+
+ if (link_target[0])
+ type = FILE_TYPE_SYMLINK;
+ else if (isdir)
+ type = FILE_TYPE_DIRECTORY;
+ else
+ type = FILE_TYPE_REGULAR;
+
+ callback(path, type, filesize, link_target);
+ }
+ PQclear(res);
+}
+
+/*
+ * Queue up a request to fetch a file from remote system.
+ */
+static void
+libpq_queue_fetch_file(rewind_source *source, const char *path, size_t len)
+{
+ /*
+ * Truncate the target file immediately, and queue a request to fetch it
+ * from the source. If the file is small, smaller than MAX_CHUNK_SIZE,
+ * request fetching a full-sized chunk anyway, so that if the file has
+ * become larger in the source system, after we scanned the source
+ * directory, we still fetch the whole file. This only works for files up
+ * to MAX_CHUNK_SIZE, but that's good enough for small configuration files
+ * and such that are changed every now and then, but not WAL-logged. For
+ * larger files, we fetch up to the original size.
+ *
+ * Even with that mechanism, there is an inherent race condition if the
+ * file is modified at the same instant that we're copying it, so that we
+ * might copy a torn version of the file with one half from the old
+ * version and another half from the new. But pg_basebackup has the same
+ * problem, and it hasn't been a problem in practice.
+ *
+ * It might seem more natural to truncate the file later, when we receive
+ * it from the source server, but then we'd need to track which
+ * fetch-requests are for a whole file.
+ */
+ open_target_file(path, true);
+ libpq_queue_fetch_range(source, path, 0, Max(len, MAX_CHUNK_SIZE));
+}
+
+/*
+ * Queue up a request to fetch a piece of a file from remote system.
+ */
+static void
+libpq_queue_fetch_range(rewind_source *source, const char *path, off_t off,
+ size_t len)
+{
+ libpq_source *src = (libpq_source *) source;
+
+ /*
+ * Does this request happen to be a continuation of the previous chunk? If
+ * so, merge it with the previous one.
+ *
+ * XXX: We use pointer equality to compare the path. That's good enough
+ * for our purposes; the caller always passes the same pointer for the
+ * same filename. If it didn't, we would fail to merge requests, but it
+ * wouldn't affect correctness.
+ */
+ if (src->num_requests > 0)
+ {
+ fetch_range_request *prev = &src->request_queue[src->num_requests - 1];
+
+ if (prev->offset + prev->length == off &&
+ prev->length < MAX_CHUNK_SIZE &&
+ prev->path == path)
+ {
+ /*
+ * Extend the previous request to cover as much of this new
+ * request as possible, without exceeding MAX_CHUNK_SIZE.
+ */
+ size_t thislen;
+
+ thislen = Min(len, MAX_CHUNK_SIZE - prev->length);
+ prev->length += thislen;
+
+ off += thislen;
+ len -= thislen;
+
+ /*
+ * Fall through to create new requests for any remaining 'len'
+ * that didn't fit in the previous chunk.
+ */
+ }
+ }
+
+ /* Divide the request into pieces of MAX_CHUNK_SIZE bytes each */
+ while (len > 0)
+ {
+ int32 thislen;
+
+ /* if the queue is full, perform all the work queued up so far */
+ if (src->num_requests == MAX_CHUNKS_PER_QUERY)
+ process_queued_fetch_requests(src);
+
+ thislen = Min(len, MAX_CHUNK_SIZE);
+ src->request_queue[src->num_requests].path = path;
+ src->request_queue[src->num_requests].offset = off;
+ src->request_queue[src->num_requests].length = thislen;
+ src->num_requests++;
+
+ off += thislen;
+ len -= thislen;
+ }
+}
+
+/*
+ * Fetch all the queued chunks and write them to the target data directory.
+ */
+static void
+libpq_finish_fetch(rewind_source *source)
+{
+ process_queued_fetch_requests((libpq_source *) source);
+}
+
+static void
+process_queued_fetch_requests(libpq_source *src)
+{
+ const char *params[3];
+ PGresult *res;
+ int chunkno;
+
+ if (src->num_requests == 0)
+ return;
+
+ pg_log_debug("getting %d file chunks", src->num_requests);
+
+ /*
+ * The prepared statement, 'fetch_chunks_stmt', takes three arrays with
+ * the same length as parameters: paths, offsets and lengths. Construct
+ * the string representations of them.
+ */
+ resetStringInfo(&src->paths);
+ resetStringInfo(&src->offsets);
+ resetStringInfo(&src->lengths);
+
+ appendStringInfoChar(&src->paths, '{');
+ appendStringInfoChar(&src->offsets, '{');
+ appendStringInfoChar(&src->lengths, '{');
+ for (int i = 0; i < src->num_requests; i++)
+ {
+ fetch_range_request *rq = &src->request_queue[i];
+
+ if (i > 0)
+ {
+ appendStringInfoChar(&src->paths, ',');
+ appendStringInfoChar(&src->offsets, ',');
+ appendStringInfoChar(&src->lengths, ',');
+ }
+
+ appendArrayEscapedString(&src->paths, rq->path);
+ appendStringInfo(&src->offsets, INT64_FORMAT, (int64) rq->offset);
+ appendStringInfo(&src->lengths, INT64_FORMAT, (int64) rq->length);
+ }
+ appendStringInfoChar(&src->paths, '}');
+ appendStringInfoChar(&src->offsets, '}');
+ appendStringInfoChar(&src->lengths, '}');
+
+ /*
+ * Execute the prepared statement.
+ */
+ params[0] = src->paths.data;
+ params[1] = src->offsets.data;
+ params[2] = src->lengths.data;
+
+ if (PQsendQueryPrepared(src->conn, "fetch_chunks_stmt", 3, params, NULL, NULL, 1) != 1)
+ pg_fatal("could not send query: %s", PQerrorMessage(src->conn));
+
+ if (PQsetSingleRowMode(src->conn) != 1)
+ pg_fatal("could not set libpq connection to single row mode");
+
+ /*----
+ * The result set is of format:
+ *
+ * path text -- path in the data directory, e.g "base/1/123"
+ * begin int8 -- offset within the file
+ * chunk bytea -- file content
+ *----
+ */
+ chunkno = 0;
+ while ((res = PQgetResult(src->conn)) != NULL)
+ {
+ fetch_range_request *rq = &src->request_queue[chunkno];
+ char *filename;
+ int filenamelen;
+ int64 chunkoff;
+ int chunksize;
+ char *chunk;
+
+ switch (PQresultStatus(res))
+ {
+ case PGRES_SINGLE_TUPLE:
+ break;
+
+ case PGRES_TUPLES_OK:
+ PQclear(res);
+ continue; /* final zero-row result */
+
+ default:
+ pg_fatal("unexpected result while fetching remote files: %s",
+ PQresultErrorMessage(res));
+ }
+
+ if (chunkno > src->num_requests)
+ pg_fatal("received more data chunks than requested");
+
+ /* sanity check the result set */
+ if (PQnfields(res) != 3 || PQntuples(res) != 1)
+ pg_fatal("unexpected result set size while fetching remote files");
+
+ if (PQftype(res, 0) != TEXTOID ||
+ PQftype(res, 1) != INT8OID ||
+ PQftype(res, 2) != BYTEAOID)
+ {
+ pg_fatal("unexpected data types in result set while fetching remote files: %u %u %u",
+ PQftype(res, 0), PQftype(res, 1), PQftype(res, 2));
+ }
+
+ if (PQfformat(res, 0) != 1 &&
+ PQfformat(res, 1) != 1 &&
+ PQfformat(res, 2) != 1)
+ {
+ pg_fatal("unexpected result format while fetching remote files");
+ }
+
+ if (PQgetisnull(res, 0, 0) ||
+ PQgetisnull(res, 0, 1))
+ {
+ pg_fatal("unexpected null values in result while fetching remote files");
+ }
+
+ if (PQgetlength(res, 0, 1) != sizeof(int64))
+ pg_fatal("unexpected result length while fetching remote files");
+
+ /* Read result set to local variables */
+ memcpy(&chunkoff, PQgetvalue(res, 0, 1), sizeof(int64));
+ chunkoff = pg_ntoh64(chunkoff);
+ chunksize = PQgetlength(res, 0, 2);
+
+ filenamelen = PQgetlength(res, 0, 0);
+ filename = pg_malloc(filenamelen + 1);
+ memcpy(filename, PQgetvalue(res, 0, 0), filenamelen);
+ filename[filenamelen] = '\0';
+
+ chunk = PQgetvalue(res, 0, 2);
+
+ /*
+ * If a file has been deleted on the source, remove it on the target
+ * as well. Note that multiple unlink() calls may happen on the same
+ * file if multiple data chunks are associated with it, hence ignore
+ * unconditionally anything missing.
+ */
+ if (PQgetisnull(res, 0, 2))
+ {
+ pg_log_debug("received null value for chunk for file \"%s\", file has been deleted",
+ filename);
+ remove_target_file(filename, true);
+ }
+ else
+ {
+ pg_log_debug("received chunk for file \"%s\", offset %lld, size %d",
+ filename, (long long int) chunkoff, chunksize);
+
+ if (strcmp(filename, rq->path) != 0)
+ {
+ pg_fatal("received data for file \"%s\", when requested for \"%s\"",
+ filename, rq->path);
+ }
+ if (chunkoff != rq->offset)
+ pg_fatal("received data at offset %lld of file \"%s\", when requested for offset %lld",
+ (long long int) chunkoff, rq->path, (long long int) rq->offset);
+
+ /*
+ * We should not receive more data than we requested, or
+ * pg_read_binary_file() messed up. We could receive less,
+ * though, if the file was truncated in the source after we
+ * checked its size. That's OK, there should be a WAL record of
+ * the truncation, which will get replayed when you start the
+ * target system for the first time after pg_rewind has completed.
+ */
+ if (chunksize > rq->length)
+ pg_fatal("received more than requested for file \"%s\"", rq->path);
+
+ open_target_file(filename, false);
+
+ write_target_range(chunk, chunkoff, chunksize);
+ }
+
+ pg_free(filename);
+
+ PQclear(res);
+ chunkno++;
+ }
+ if (chunkno != src->num_requests)
+ pg_fatal("unexpected number of data chunks received");
+
+ src->num_requests = 0;
+}
+
+/*
+ * Escape a string to be used as element in a text array constant
+ */
+static void
+appendArrayEscapedString(StringInfo buf, const char *str)
+{
+ appendStringInfoCharMacro(buf, '\"');
+ while (*str)
+ {
+ char ch = *str;
+
+ if (ch == '"' || ch == '\\')
+ appendStringInfoCharMacro(buf, '\\');
+
+ appendStringInfoCharMacro(buf, ch);
+
+ str++;
+ }
+ appendStringInfoCharMacro(buf, '\"');
+}
+
+/*
+ * Fetch a single file as a malloc'd buffer.
+ */
+static char *
+libpq_fetch_file(rewind_source *source, const char *path, size_t *filesize)
+{
+ PGconn *conn = ((libpq_source *) source)->conn;
+ PGresult *res;
+ char *result;
+ int len;
+ const char *paramValues[1];
+
+ paramValues[0] = path;
+ res = PQexecParams(conn, "SELECT pg_read_binary_file($1)",
+ 1, NULL, paramValues, NULL, NULL, 1);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ pg_fatal("could not fetch remote file \"%s\": %s",
+ path, PQresultErrorMessage(res));
+
+ /* sanity check the result set */
+ if (PQntuples(res) != 1 || PQgetisnull(res, 0, 0))
+ pg_fatal("unexpected result set while fetching remote file \"%s\"",
+ path);
+
+ /* Read result to local variables */
+ len = PQgetlength(res, 0, 0);
+ result = pg_malloc(len + 1);
+ memcpy(result, PQgetvalue(res, 0, 0), len);
+ result[len] = '\0';
+
+ PQclear(res);
+
+ pg_log_debug("fetched file \"%s\", length %d", path, len);
+
+ if (filesize)
+ *filesize = len;
+ return result;
+}
+
+/*
+ * Close a libpq source.
+ */
+static void
+libpq_destroy(rewind_source *source)
+{
+ libpq_source *src = (libpq_source *) source;
+
+ pfree(src->paths.data);
+ pfree(src->offsets.data);
+ pfree(src->lengths.data);
+ pfree(src);
+
+ /* NOTE: we don't close the connection here, as it was not opened by us. */
+}
diff --git a/src/bin/pg_rewind/local_source.c b/src/bin/pg_rewind/local_source.c
new file mode 100644
index 0000000..9bd43cb
--- /dev/null
+++ b/src/bin/pg_rewind/local_source.c
@@ -0,0 +1,187 @@
+/*-------------------------------------------------------------------------
+ *
+ * local_source.c
+ * Functions for using a local data directory as the source.
+ *
+ * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "datapagemap.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+#include "rewind_source.h"
+
+typedef struct
+{
+ rewind_source common; /* common interface functions */
+
+ const char *datadir; /* path to the source data directory */
+} local_source;
+
+static void local_traverse_files(rewind_source *source,
+ process_file_callback_t callback);
+static char *local_fetch_file(rewind_source *source, const char *path,
+ size_t *filesize);
+static void local_queue_fetch_file(rewind_source *source, const char *path,
+ size_t len);
+static void local_queue_fetch_range(rewind_source *source, const char *path,
+ off_t off, size_t len);
+static void local_finish_fetch(rewind_source *source);
+static void local_destroy(rewind_source *source);
+
+rewind_source *
+init_local_source(const char *datadir)
+{
+ local_source *src;
+
+ src = pg_malloc0(sizeof(local_source));
+
+ src->common.traverse_files = local_traverse_files;
+ src->common.fetch_file = local_fetch_file;
+ src->common.queue_fetch_file = local_queue_fetch_file;
+ src->common.queue_fetch_range = local_queue_fetch_range;
+ src->common.finish_fetch = local_finish_fetch;
+ src->common.get_current_wal_insert_lsn = NULL;
+ src->common.destroy = local_destroy;
+
+ src->datadir = datadir;
+
+ return &src->common;
+}
+
+static void
+local_traverse_files(rewind_source *source, process_file_callback_t callback)
+{
+ traverse_datadir(((local_source *) source)->datadir, callback);
+}
+
+static char *
+local_fetch_file(rewind_source *source, const char *path, size_t *filesize)
+{
+ return slurpFile(((local_source *) source)->datadir, path, filesize);
+}
+
+/*
+ * Copy a file from source to target.
+ *
+ * 'len' is the expected length of the file.
+ */
+static void
+local_queue_fetch_file(rewind_source *source, const char *path, size_t len)
+{
+ const char *datadir = ((local_source *) source)->datadir;
+ PGIOAlignedBlock buf;
+ char srcpath[MAXPGPATH];
+ int srcfd;
+ size_t written_len;
+
+ snprintf(srcpath, sizeof(srcpath), "%s/%s", datadir, path);
+
+ /* Open source file for reading */
+ srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0);
+ if (srcfd < 0)
+ pg_fatal("could not open source file \"%s\": %m",
+ srcpath);
+
+ /* Truncate and open the target file for writing */
+ open_target_file(path, true);
+
+ written_len = 0;
+ for (;;)
+ {
+ ssize_t read_len;
+
+ read_len = read(srcfd, buf.data, sizeof(buf));
+
+ if (read_len < 0)
+ pg_fatal("could not read file \"%s\": %m", srcpath);
+ else if (read_len == 0)
+ break; /* EOF reached */
+
+ write_target_range(buf.data, written_len, read_len);
+ written_len += read_len;
+ }
+
+ /*
+ * A local source is not expected to change while we're rewinding, so
+ * check that the size of the file matches our earlier expectation.
+ */
+ if (written_len != len)
+ pg_fatal("size of source file \"%s\" changed concurrently: %d bytes expected, %d copied",
+ srcpath, (int) len, (int) written_len);
+
+ if (close(srcfd) != 0)
+ pg_fatal("could not close file \"%s\": %m", srcpath);
+}
+
+/*
+ * Copy a file from source to target, starting at 'off', for 'len' bytes.
+ */
+static void
+local_queue_fetch_range(rewind_source *source, const char *path, off_t off,
+ size_t len)
+{
+ const char *datadir = ((local_source *) source)->datadir;
+ PGIOAlignedBlock buf;
+ char srcpath[MAXPGPATH];
+ int srcfd;
+ off_t begin = off;
+ off_t end = off + len;
+
+ snprintf(srcpath, sizeof(srcpath), "%s/%s", datadir, path);
+
+ srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0);
+ if (srcfd < 0)
+ pg_fatal("could not open source file \"%s\": %m",
+ srcpath);
+
+ if (lseek(srcfd, begin, SEEK_SET) == -1)
+ pg_fatal("could not seek in source file: %m");
+
+ open_target_file(path, false);
+
+ while (end - begin > 0)
+ {
+ ssize_t readlen;
+ size_t thislen;
+
+ if (end - begin > sizeof(buf))
+ thislen = sizeof(buf);
+ else
+ thislen = end - begin;
+
+ readlen = read(srcfd, buf.data, thislen);
+
+ if (readlen < 0)
+ pg_fatal("could not read file \"%s\": %m", srcpath);
+ else if (readlen == 0)
+ pg_fatal("unexpected EOF while reading file \"%s\"", srcpath);
+
+ write_target_range(buf.data, begin, readlen);
+ begin += readlen;
+ }
+
+ if (close(srcfd) != 0)
+ pg_fatal("could not close file \"%s\": %m", srcpath);
+}
+
+static void
+local_finish_fetch(rewind_source *source)
+{
+ /*
+ * Nothing to do, local_queue_fetch_range() copies the ranges immediately.
+ */
+}
+
+static void
+local_destroy(rewind_source *source)
+{
+ pfree(source);
+}
diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build
new file mode 100644
index 0000000..fd22818
--- /dev/null
+++ b/src/bin/pg_rewind/meson.build
@@ -0,0 +1,50 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_rewind_sources = files(
+ 'datapagemap.c',
+ 'file_ops.c',
+ 'filemap.c',
+ 'libpq_source.c',
+ 'local_source.c',
+ 'parsexlog.c',
+ 'pg_rewind.c',
+ 'timeline.c',
+)
+
+pg_rewind_sources += xlogreader_sources
+
+if host_system == 'windows'
+ pg_rewind_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_rewind',
+ '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from'])
+endif
+
+pg_rewind = executable('pg_rewind',
+ pg_rewind_sources,
+ dependencies: [frontend_code, libpq, lz4, zstd],
+ c_args: ['-DFRONTEND'], # needed for xlogreader et al
+ kwargs: default_bin_args,
+)
+bin_targets += pg_rewind
+
+
+tests += {
+ 'name': 'pg_rewind',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_databases.pl',
+ 't/003_extrafiles.pl',
+ 't/004_pg_xlog_symlink.pl',
+ 't/005_same_timeline.pl',
+ 't/006_options.pl',
+ 't/007_standby_source.pl',
+ 't/008_min_recovery_point.pl',
+ 't/009_growing_files.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_rewind/nls.mk b/src/bin/pg_rewind/nls.mk
new file mode 100644
index 0000000..d2de859
--- /dev/null
+++ b/src/bin/pg_rewind/nls.mk
@@ -0,0 +1,20 @@
+# src/bin/pg_rewind/nls.mk
+CATALOG_NAME = pg_rewind
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ datapagemap.c \
+ file_ops.c \
+ filemap.c \
+ libpq_source.c \
+ local_source.c \
+ parsexlog.c \
+ pg_rewind.c \
+ timeline.c \
+ xlogreader.c \
+ ../../common/fe_memutils.c \
+ ../../common/percentrepl.c \
+ ../../common/restricted_token.c \
+ ../../fe_utils/archive.c \
+ ../../fe_utils/recovery_gen.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ report_invalid_record:2:c-format
diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c
new file mode 100644
index 0000000..2778223
--- /dev/null
+++ b/src/bin/pg_rewind/parsexlog.c
@@ -0,0 +1,462 @@
+/*-------------------------------------------------------------------------
+ *
+ * parsexlog.c
+ * Functions for reading Write-Ahead-Log
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <unistd.h>
+
+#include "access/rmgr.h"
+#include "access/xact.h"
+#include "access/xlog_internal.h"
+#include "access/xlogreader.h"
+#include "catalog/pg_control.h"
+#include "catalog/storage_xlog.h"
+#include "commands/dbcommands_xlog.h"
+#include "fe_utils/archive.h"
+#include "filemap.h"
+#include "pg_rewind.h"
+
+/*
+ * RmgrNames is an array of the built-in resource manager names, to make error
+ * messages a bit nicer.
+ */
+#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \
+ name,
+
+static const char *RmgrNames[RM_MAX_ID + 1] = {
+#include "access/rmgrlist.h"
+};
+
+#define RmgrName(rmid) (((rmid) <= RM_MAX_BUILTIN_ID) ? \
+ RmgrNames[rmid] : "custom")
+
+static void extractPageInfo(XLogReaderState *record);
+
+static int xlogreadfd = -1;
+static XLogSegNo xlogreadsegno = 0;
+static char xlogfpath[MAXPGPATH];
+
+typedef struct XLogPageReadPrivate
+{
+ const char *restoreCommand;
+ int tliIndex;
+} XLogPageReadPrivate;
+
+static int SimpleXLogPageRead(XLogReaderState *xlogreader,
+ XLogRecPtr targetPagePtr,
+ int reqLen, XLogRecPtr targetRecPtr, char *readBuf);
+
+/*
+ * Read WAL from the datadir/pg_wal, starting from 'startpoint' on timeline
+ * index 'tliIndex' in target timeline history, until 'endpoint'. Make note of
+ * the data blocks touched by the WAL records, and return them in a page map.
+ *
+ * 'endpoint' is the end of the last record to read. The record starting at
+ * 'endpoint' is the first one that is not read.
+ */
+void
+extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
+ XLogRecPtr endpoint, const char *restoreCommand)
+{
+ XLogRecord *record;
+ XLogReaderState *xlogreader;
+ char *errormsg;
+ XLogPageReadPrivate private;
+
+ private.tliIndex = tliIndex;
+ private.restoreCommand = restoreCommand;
+ xlogreader = XLogReaderAllocate(WalSegSz, datadir,
+ XL_ROUTINE(.page_read = &SimpleXLogPageRead),
+ &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ XLogBeginRead(xlogreader, startpoint);
+ do
+ {
+ record = XLogReadRecord(xlogreader, &errormsg);
+
+ if (record == NULL)
+ {
+ XLogRecPtr errptr = xlogreader->EndRecPtr;
+
+ if (errormsg)
+ pg_fatal("could not read WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(errptr),
+ errormsg);
+ else
+ pg_fatal("could not read WAL record at %X/%X",
+ LSN_FORMAT_ARGS(errptr));
+ }
+
+ extractPageInfo(xlogreader);
+ } while (xlogreader->EndRecPtr < endpoint);
+
+ /*
+ * If 'endpoint' didn't point exactly at a record boundary, the caller
+ * messed up.
+ */
+ if (xlogreader->EndRecPtr != endpoint)
+ pg_fatal("end pointer %X/%X is not a valid end point; expected %X/%X",
+ LSN_FORMAT_ARGS(endpoint), LSN_FORMAT_ARGS(xlogreader->EndRecPtr));
+
+ XLogReaderFree(xlogreader);
+ if (xlogreadfd != -1)
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+}
+
+/*
+ * Reads one WAL record. Returns the end position of the record, without
+ * doing anything with the record itself.
+ */
+XLogRecPtr
+readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex,
+ const char *restoreCommand)
+{
+ XLogRecord *record;
+ XLogReaderState *xlogreader;
+ char *errormsg;
+ XLogPageReadPrivate private;
+ XLogRecPtr endptr;
+
+ private.tliIndex = tliIndex;
+ private.restoreCommand = restoreCommand;
+ xlogreader = XLogReaderAllocate(WalSegSz, datadir,
+ XL_ROUTINE(.page_read = &SimpleXLogPageRead),
+ &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ XLogBeginRead(xlogreader, ptr);
+ record = XLogReadRecord(xlogreader, &errormsg);
+ if (record == NULL)
+ {
+ if (errormsg)
+ pg_fatal("could not read WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(ptr), errormsg);
+ else
+ pg_fatal("could not read WAL record at %X/%X",
+ LSN_FORMAT_ARGS(ptr));
+ }
+ endptr = xlogreader->EndRecPtr;
+
+ XLogReaderFree(xlogreader);
+ if (xlogreadfd != -1)
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+
+ return endptr;
+}
+
+/*
+ * Find the previous checkpoint preceding given WAL location.
+ */
+void
+findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
+ XLogRecPtr *lastchkptrec, TimeLineID *lastchkpttli,
+ XLogRecPtr *lastchkptredo, const char *restoreCommand)
+{
+ /* Walk backwards, starting from the given record */
+ XLogRecord *record;
+ XLogRecPtr searchptr;
+ XLogReaderState *xlogreader;
+ char *errormsg;
+ XLogPageReadPrivate private;
+
+ /*
+ * The given fork pointer points to the end of the last common record,
+ * which is not necessarily the beginning of the next record, if the
+ * previous record happens to end at a page boundary. Skip over the page
+ * header in that case to find the next record.
+ */
+ if (forkptr % XLOG_BLCKSZ == 0)
+ {
+ if (XLogSegmentOffset(forkptr, WalSegSz) == 0)
+ forkptr += SizeOfXLogLongPHD;
+ else
+ forkptr += SizeOfXLogShortPHD;
+ }
+
+ private.tliIndex = tliIndex;
+ private.restoreCommand = restoreCommand;
+ xlogreader = XLogReaderAllocate(WalSegSz, datadir,
+ XL_ROUTINE(.page_read = &SimpleXLogPageRead),
+ &private);
+ if (xlogreader == NULL)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ searchptr = forkptr;
+ for (;;)
+ {
+ uint8 info;
+
+ XLogBeginRead(xlogreader, searchptr);
+ record = XLogReadRecord(xlogreader, &errormsg);
+
+ if (record == NULL)
+ {
+ if (errormsg)
+ pg_fatal("could not find previous WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(searchptr),
+ errormsg);
+ else
+ pg_fatal("could not find previous WAL record at %X/%X",
+ LSN_FORMAT_ARGS(searchptr));
+ }
+
+ /*
+ * Check if it is a checkpoint record. This checkpoint record needs to
+ * be the latest checkpoint before WAL forked and not the checkpoint
+ * where the primary has been stopped to be rewound.
+ */
+ info = XLogRecGetInfo(xlogreader) & ~XLR_INFO_MASK;
+ if (searchptr < forkptr &&
+ XLogRecGetRmid(xlogreader) == RM_XLOG_ID &&
+ (info == XLOG_CHECKPOINT_SHUTDOWN ||
+ info == XLOG_CHECKPOINT_ONLINE))
+ {
+ CheckPoint checkPoint;
+
+ memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint));
+ *lastchkptrec = searchptr;
+ *lastchkpttli = checkPoint.ThisTimeLineID;
+ *lastchkptredo = checkPoint.redo;
+ break;
+ }
+
+ /* Walk backwards to previous record. */
+ searchptr = record->xl_prev;
+ }
+
+ XLogReaderFree(xlogreader);
+ if (xlogreadfd != -1)
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+}
+
+/* XLogReader callback function, to read a WAL page */
+static int
+SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
+ int reqLen, XLogRecPtr targetRecPtr, char *readBuf)
+{
+ XLogPageReadPrivate *private = (XLogPageReadPrivate *) xlogreader->private_data;
+ uint32 targetPageOff;
+ XLogRecPtr targetSegEnd;
+ XLogSegNo targetSegNo;
+ int r;
+
+ XLByteToSeg(targetPagePtr, targetSegNo, WalSegSz);
+ XLogSegNoOffsetToRecPtr(targetSegNo + 1, 0, WalSegSz, targetSegEnd);
+ targetPageOff = XLogSegmentOffset(targetPagePtr, WalSegSz);
+
+ /*
+ * See if we need to switch to a new segment because the requested record
+ * is not in the currently open one.
+ */
+ if (xlogreadfd >= 0 &&
+ !XLByteInSeg(targetPagePtr, xlogreadsegno, WalSegSz))
+ {
+ close(xlogreadfd);
+ xlogreadfd = -1;
+ }
+
+ XLByteToSeg(targetPagePtr, xlogreadsegno, WalSegSz);
+
+ if (xlogreadfd < 0)
+ {
+ char xlogfname[MAXFNAMELEN];
+
+ /*
+ * Since incomplete segments are copied into next timelines, switch to
+ * the timeline holding the required segment. Assuming this scan can
+ * be done both forward and backward, consider also switching timeline
+ * accordingly.
+ */
+ while (private->tliIndex < targetNentries - 1 &&
+ targetHistory[private->tliIndex].end < targetSegEnd)
+ private->tliIndex++;
+ while (private->tliIndex > 0 &&
+ targetHistory[private->tliIndex].begin >= targetSegEnd)
+ private->tliIndex--;
+
+ XLogFileName(xlogfname, targetHistory[private->tliIndex].tli,
+ xlogreadsegno, WalSegSz);
+
+ snprintf(xlogfpath, MAXPGPATH, "%s/" XLOGDIR "/%s",
+ xlogreader->segcxt.ws_dir, xlogfname);
+
+ xlogreadfd = open(xlogfpath, O_RDONLY | PG_BINARY, 0);
+
+ if (xlogreadfd < 0)
+ {
+ /*
+ * If we have no restore_command to execute, then exit.
+ */
+ if (private->restoreCommand == NULL)
+ {
+ pg_log_error("could not open file \"%s\": %m", xlogfpath);
+ return -1;
+ }
+
+ /*
+ * Since we have restore_command, then try to retrieve missing WAL
+ * file from the archive.
+ */
+ xlogreadfd = RestoreArchivedFile(xlogreader->segcxt.ws_dir,
+ xlogfname,
+ WalSegSz,
+ private->restoreCommand);
+
+ if (xlogreadfd < 0)
+ return -1;
+ else
+ pg_log_debug("using file \"%s\" restored from archive",
+ xlogfpath);
+ }
+ }
+
+ /*
+ * At this point, we have the right segment open.
+ */
+ Assert(xlogreadfd != -1);
+
+ /* Read the requested page */
+ if (lseek(xlogreadfd, (off_t) targetPageOff, SEEK_SET) < 0)
+ {
+ pg_log_error("could not seek in file \"%s\": %m", xlogfpath);
+ return -1;
+ }
+
+
+ r = read(xlogreadfd, readBuf, XLOG_BLCKSZ);
+ if (r != XLOG_BLCKSZ)
+ {
+ if (r < 0)
+ pg_log_error("could not read file \"%s\": %m", xlogfpath);
+ else
+ pg_log_error("could not read file \"%s\": read %d of %zu",
+ xlogfpath, r, (Size) XLOG_BLCKSZ);
+
+ return -1;
+ }
+
+ Assert(targetSegNo == xlogreadsegno);
+
+ xlogreader->seg.ws_tli = targetHistory[private->tliIndex].tli;
+ return XLOG_BLCKSZ;
+}
+
+/*
+ * Extract information on which blocks the current record modifies.
+ */
+static void
+extractPageInfo(XLogReaderState *record)
+{
+ int block_id;
+ RmgrId rmid = XLogRecGetRmid(record);
+ uint8 info = XLogRecGetInfo(record);
+ uint8 rminfo = info & ~XLR_INFO_MASK;
+
+ /* Is this a special record type that I recognize? */
+
+ if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE_FILE_COPY)
+ {
+ /*
+ * New databases can be safely ignored. It won't be present in the
+ * source system, so it will be deleted. There's one corner-case,
+ * though: if a new, different, database is also created in the source
+ * system, we'll see that the files already exist and not copy them.
+ * That's OK, though; WAL replay of creating the new database, from
+ * the source systems's WAL, will re-copy the new database,
+ * overwriting the database created in the target system.
+ */
+ }
+ else if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_CREATE_WAL_LOG)
+ {
+ /*
+ * New databases can be safely ignored. It won't be present in the
+ * source system, so it will be deleted.
+ */
+ }
+ else if (rmid == RM_DBASE_ID && rminfo == XLOG_DBASE_DROP)
+ {
+ /*
+ * An existing database was dropped. We'll see that the files don't
+ * exist in the target data dir, and copy them in toto from the source
+ * system. No need to do anything special here.
+ */
+ }
+ else if (rmid == RM_SMGR_ID && rminfo == XLOG_SMGR_CREATE)
+ {
+ /*
+ * We can safely ignore these. The file will be removed from the
+ * target, if it doesn't exist in source system. If a file with same
+ * name is created in source system, too, there will be WAL records
+ * for all the blocks in it.
+ */
+ }
+ else if (rmid == RM_SMGR_ID && rminfo == XLOG_SMGR_TRUNCATE)
+ {
+ /*
+ * We can safely ignore these. When we compare the sizes later on,
+ * we'll notice that they differ, and copy the missing tail from
+ * source system.
+ */
+ }
+ else if (rmid == RM_XACT_ID &&
+ ((rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_COMMIT ||
+ (rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_COMMIT_PREPARED ||
+ (rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_ABORT ||
+ (rminfo & XLOG_XACT_OPMASK) == XLOG_XACT_ABORT_PREPARED))
+ {
+ /*
+ * These records can include "dropped rels". We can safely ignore
+ * them, we will see that they are missing and copy them from the
+ * source.
+ */
+ }
+ else if (info & XLR_SPECIAL_REL_UPDATE)
+ {
+ /*
+ * This record type modifies a relation file in some special way, but
+ * we don't recognize the type. That's bad - we don't know how to
+ * track that change.
+ */
+ pg_fatal("WAL record modifies a relation, but record type is not recognized: "
+ "lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X",
+ LSN_FORMAT_ARGS(record->ReadRecPtr),
+ rmid, RmgrName(rmid), info);
+ }
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ RelFileLocator rlocator;
+ ForkNumber forknum;
+ BlockNumber blkno;
+
+ if (!XLogRecGetBlockTagExtended(record, block_id,
+ &rlocator, &forknum, &blkno, NULL))
+ continue;
+
+ /* We only care about the main fork; others are copied in toto */
+ if (forknum != MAIN_FORKNUM)
+ continue;
+
+ process_target_wal_block_change(forknum, rlocator, blkno);
+ }
+}
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
new file mode 100644
index 0000000..f7f3b82
--- /dev/null
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -0,0 +1,1193 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_rewind.c
+ * Synchronizes a PostgreSQL data directory to a new timeline
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "access/timeline.h"
+#include "access/xlog_internal.h"
+#include "catalog/catversion.h"
+#include "catalog/pg_control.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/restricted_token.h"
+#include "common/string.h"
+#include "fe_utils/recovery_gen.h"
+#include "fe_utils/string_utils.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "getopt_long.h"
+#include "pg_rewind.h"
+#include "rewind_source.h"
+#include "storage/bufpage.h"
+
+static void usage(const char *progname);
+
+static void perform_rewind(filemap_t *filemap, rewind_source *source,
+ XLogRecPtr chkptrec,
+ TimeLineID chkpttli,
+ XLogRecPtr chkptredo);
+
+static void createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli,
+ XLogRecPtr checkpointloc);
+
+static void digestControlFile(ControlFileData *ControlFile,
+ const char *content, size_t size);
+static void getRestoreCommand(const char *argv0);
+static void sanityChecks(void);
+static TimeLineHistoryEntry *getTimelineHistory(TimeLineID tli, bool is_source,
+ int *nentries);
+static void findCommonAncestorTimeline(TimeLineHistoryEntry *a_history,
+ int a_nentries,
+ TimeLineHistoryEntry *b_history,
+ int b_nentries,
+ XLogRecPtr *recptr, int *tliIndex);
+static void ensureCleanShutdown(const char *argv0);
+static void disconnect_atexit(void);
+
+static ControlFileData ControlFile_target;
+static ControlFileData ControlFile_source;
+static ControlFileData ControlFile_source_after;
+
+const char *progname;
+int WalSegSz;
+
+/* Configuration options */
+char *datadir_target = NULL;
+char *datadir_source = NULL;
+char *connstr_source = NULL;
+char *restore_command = NULL;
+char *config_file = NULL;
+
+static bool debug = false;
+bool showprogress = false;
+bool dry_run = false;
+bool do_sync = true;
+bool restore_wal = false;
+
+/* Target history */
+TimeLineHistoryEntry *targetHistory;
+int targetNentries;
+
+/* Progress counters */
+uint64 fetch_size;
+uint64 fetch_done;
+
+static PGconn *conn;
+static rewind_source *source;
+
+static void
+usage(const char *progname)
+{
+ printf(_("%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]...\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" -c, --restore-target-wal use restore_command in target configuration to\n"
+ " retrieve WAL files from archives\n"));
+ printf(_(" -D, --target-pgdata=DIRECTORY existing data directory to modify\n"));
+ printf(_(" --source-pgdata=DIRECTORY source data directory to synchronize with\n"));
+ printf(_(" --source-server=CONNSTR source server to synchronize with\n"));
+ printf(_(" -n, --dry-run stop before modifying anything\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written\n"
+ " safely to disk\n"));
+ printf(_(" -P, --progress write progress messages\n"));
+ printf(_(" -R, --write-recovery-conf write configuration for replication\n"
+ " (requires --source-server)\n"));
+ printf(_(" --config-file=FILENAME use specified main server configuration\n"
+ " file when running target cluster\n"));
+ printf(_(" --debug write a lot of debug messages\n"));
+ printf(_(" --no-ensure-shutdown do not automatically fix unclean shutdown\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"help", no_argument, NULL, '?'},
+ {"target-pgdata", required_argument, NULL, 'D'},
+ {"write-recovery-conf", no_argument, NULL, 'R'},
+ {"source-pgdata", required_argument, NULL, 1},
+ {"source-server", required_argument, NULL, 2},
+ {"no-ensure-shutdown", no_argument, NULL, 4},
+ {"config-file", required_argument, NULL, 5},
+ {"version", no_argument, NULL, 'V'},
+ {"restore-target-wal", no_argument, NULL, 'c'},
+ {"dry-run", no_argument, NULL, 'n'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"progress", no_argument, NULL, 'P'},
+ {"debug", no_argument, NULL, 3},
+ {NULL, 0, NULL, 0}
+ };
+ int option_index;
+ int c;
+ XLogRecPtr divergerec;
+ int lastcommontliIndex;
+ XLogRecPtr chkptrec;
+ TimeLineID chkpttli;
+ XLogRecPtr chkptredo;
+ TimeLineID source_tli;
+ TimeLineID target_tli;
+ XLogRecPtr target_wal_endrec;
+ size_t size;
+ char *buffer;
+ bool no_ensure_shutdown = false;
+ bool rewind_needed;
+ bool writerecoveryconf = false;
+ filemap_t *filemap;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind"));
+ progname = get_progname(argv[0]);
+
+ /* Process command-line arguments */
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage(progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_rewind (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "cD:nNPR", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ restore_wal = true;
+ break;
+
+ case 'P':
+ showprogress = true;
+ break;
+
+ case 'n':
+ dry_run = true;
+ break;
+
+ case 'N':
+ do_sync = false;
+ break;
+
+ case 'R':
+ writerecoveryconf = true;
+ break;
+
+ case 3:
+ debug = true;
+ pg_logging_increase_verbosity();
+ break;
+
+ case 'D': /* -D or --target-pgdata */
+ datadir_target = pg_strdup(optarg);
+ break;
+
+ case 1: /* --source-pgdata */
+ datadir_source = pg_strdup(optarg);
+ break;
+
+ case 2: /* --source-server */
+ connstr_source = pg_strdup(optarg);
+ break;
+
+ case 4:
+ no_ensure_shutdown = true;
+ break;
+
+ case 5:
+ config_file = pg_strdup(optarg);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (datadir_source == NULL && connstr_source == NULL)
+ {
+ pg_log_error("no source specified (--source-pgdata or --source-server)");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (datadir_source != NULL && connstr_source != NULL)
+ {
+ pg_log_error("only one of --source-pgdata or --source-server can be specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (datadir_target == NULL)
+ {
+ pg_log_error("no target data directory specified (--target-pgdata)");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (writerecoveryconf && connstr_source == NULL)
+ {
+ pg_log_error("no source server information (--source-server) specified for --write-recovery-conf");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Don't allow pg_rewind to be run as root, to avoid overwriting the
+ * ownership of files in the data directory. We need only check for root
+ * -- any other user won't have sufficient permissions to modify files in
+ * the data directory.
+ */
+#ifndef WIN32
+ if (geteuid() == 0)
+ {
+ pg_log_error("cannot be executed by \"root\"");
+ pg_log_error_hint("You must run %s as the PostgreSQL superuser.",
+ progname);
+ exit(1);
+ }
+#endif
+
+ get_restricted_token();
+
+ /* Set mask based on PGDATA permissions */
+ if (!GetDataDirectoryCreatePerm(datadir_target))
+ pg_fatal("could not read permissions of directory \"%s\": %m",
+ datadir_target);
+
+ umask(pg_mode_mask);
+
+ getRestoreCommand(argv[0]);
+
+ atexit(disconnect_atexit);
+
+ /*
+ * Ok, we have all the options and we're ready to start. First, connect to
+ * remote server.
+ */
+ if (connstr_source)
+ {
+ conn = PQconnectdb(connstr_source);
+
+ if (PQstatus(conn) == CONNECTION_BAD)
+ pg_fatal("%s", PQerrorMessage(conn));
+
+ if (showprogress)
+ pg_log_info("connected to server");
+
+ source = init_libpq_source(conn);
+ }
+ else
+ source = init_local_source(datadir_source);
+
+ /*
+ * Check the status of the target instance.
+ *
+ * If the target instance was not cleanly shut down, start and stop the
+ * target cluster once in single-user mode to enforce recovery to finish,
+ * ensuring that the cluster can be used by pg_rewind. Note that if
+ * no_ensure_shutdown is specified, pg_rewind ignores this step, and users
+ * need to make sure by themselves that the target cluster is in a clean
+ * state.
+ */
+ buffer = slurpFile(datadir_target, "global/pg_control", &size);
+ digestControlFile(&ControlFile_target, buffer, size);
+ pg_free(buffer);
+
+ if (!no_ensure_shutdown &&
+ ControlFile_target.state != DB_SHUTDOWNED &&
+ ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY)
+ {
+ ensureCleanShutdown(argv[0]);
+
+ buffer = slurpFile(datadir_target, "global/pg_control", &size);
+ digestControlFile(&ControlFile_target, buffer, size);
+ pg_free(buffer);
+ }
+
+ buffer = source->fetch_file(source, "global/pg_control", &size);
+ digestControlFile(&ControlFile_source, buffer, size);
+ pg_free(buffer);
+
+ sanityChecks();
+
+ /*
+ * Usually, the TLI can be found in the latest checkpoint record. But if
+ * the source server is just being promoted (or it's a standby that's
+ * following a primary that's just being promoted), and the checkpoint
+ * requested by the promotion hasn't completed yet, the latest timeline is
+ * in minRecoveryPoint. So we check which is later, the TLI of the
+ * minRecoveryPoint or the latest checkpoint.
+ */
+ source_tli = Max(ControlFile_source.minRecoveryPointTLI,
+ ControlFile_source.checkPointCopy.ThisTimeLineID);
+
+ /* Similarly for the target. */
+ target_tli = Max(ControlFile_target.minRecoveryPointTLI,
+ ControlFile_target.checkPointCopy.ThisTimeLineID);
+
+ /*
+ * Find the common ancestor timeline between the clusters.
+ *
+ * If both clusters are already on the same timeline, there's nothing to
+ * do.
+ */
+ if (target_tli == source_tli)
+ {
+ pg_log_info("source and target cluster are on the same timeline");
+ rewind_needed = false;
+ target_wal_endrec = 0;
+ }
+ else
+ {
+ XLogRecPtr chkptendrec;
+ TimeLineHistoryEntry *sourceHistory;
+ int sourceNentries;
+
+ /*
+ * Retrieve timelines for both source and target, and find the point
+ * where they diverged.
+ */
+ sourceHistory = getTimelineHistory(source_tli, true, &sourceNentries);
+ targetHistory = getTimelineHistory(target_tli, false, &targetNentries);
+
+ findCommonAncestorTimeline(sourceHistory, sourceNentries,
+ targetHistory, targetNentries,
+ &divergerec, &lastcommontliIndex);
+
+ pg_log_info("servers diverged at WAL location %X/%X on timeline %u",
+ LSN_FORMAT_ARGS(divergerec),
+ targetHistory[lastcommontliIndex].tli);
+
+ /*
+ * Don't need the source history anymore. The target history is still
+ * needed by the routines in parsexlog.c, when we read the target WAL.
+ */
+ pfree(sourceHistory);
+
+
+ /*
+ * Determine the end-of-WAL on the target.
+ *
+ * The WAL ends at the last shutdown checkpoint, or at
+ * minRecoveryPoint if it was a standby. (If we supported rewinding a
+ * server that was not shut down cleanly, we would need to replay
+ * until we reach the first invalid record, like crash recovery does.)
+ */
+
+ /* read the checkpoint record on the target to see where it ends. */
+ chkptendrec = readOneRecord(datadir_target,
+ ControlFile_target.checkPoint,
+ targetNentries - 1,
+ restore_command);
+
+ if (ControlFile_target.minRecoveryPoint > chkptendrec)
+ {
+ target_wal_endrec = ControlFile_target.minRecoveryPoint;
+ }
+ else
+ {
+ target_wal_endrec = chkptendrec;
+ }
+
+ /*
+ * Check for the possibility that the target is in fact a direct
+ * ancestor of the source. In that case, there is no divergent history
+ * in the target that needs rewinding.
+ */
+ if (target_wal_endrec > divergerec)
+ {
+ rewind_needed = true;
+ }
+ else
+ {
+ /* the last common checkpoint record must be part of target WAL */
+ Assert(target_wal_endrec == divergerec);
+
+ rewind_needed = false;
+ }
+ }
+
+ if (!rewind_needed)
+ {
+ pg_log_info("no rewind required");
+ if (writerecoveryconf && !dry_run)
+ WriteRecoveryConfig(conn, datadir_target,
+ GenerateRecoveryConfig(conn, NULL));
+ exit(0);
+ }
+
+ findLastCheckpoint(datadir_target, divergerec, lastcommontliIndex,
+ &chkptrec, &chkpttli, &chkptredo, restore_command);
+ pg_log_info("rewinding from last common checkpoint at %X/%X on timeline %u",
+ LSN_FORMAT_ARGS(chkptrec), chkpttli);
+
+ /* Initialize the hash table to track the status of each file */
+ filehash_init();
+
+ /*
+ * Collect information about all files in the both data directories.
+ */
+ if (showprogress)
+ pg_log_info("reading source file list");
+ source->traverse_files(source, &process_source_file);
+
+ if (showprogress)
+ pg_log_info("reading target file list");
+ traverse_datadir(datadir_target, &process_target_file);
+
+ /*
+ * Read the target WAL from last checkpoint before the point of fork, to
+ * extract all the pages that were modified on the target cluster after
+ * the fork.
+ */
+ if (showprogress)
+ pg_log_info("reading WAL in target");
+ extractPageMap(datadir_target, chkptrec, lastcommontliIndex,
+ target_wal_endrec, restore_command);
+
+ /*
+ * We have collected all information we need from both systems. Decide
+ * what to do with each file.
+ */
+ filemap = decide_file_actions();
+ if (showprogress)
+ calculate_totals(filemap);
+
+ /* this is too verbose even for verbose mode */
+ if (debug)
+ print_filemap(filemap);
+
+ /*
+ * Ok, we're ready to start copying things over.
+ */
+ if (showprogress)
+ {
+ pg_log_info("need to copy %lu MB (total source directory size is %lu MB)",
+ (unsigned long) (filemap->fetch_size / (1024 * 1024)),
+ (unsigned long) (filemap->total_size / (1024 * 1024)));
+
+ fetch_size = filemap->fetch_size;
+ fetch_done = 0;
+ }
+
+ /*
+ * We have now collected all the information we need from both systems,
+ * and we are ready to start modifying the target directory.
+ *
+ * This is the point of no return. Once we start copying things, there is
+ * no turning back!
+ */
+ perform_rewind(filemap, source, chkptrec, chkpttli, chkptredo);
+
+ if (showprogress)
+ pg_log_info("syncing target data directory");
+ sync_target_dir();
+
+ /* Also update the standby configuration, if requested. */
+ if (writerecoveryconf && !dry_run)
+ WriteRecoveryConfig(conn, datadir_target,
+ GenerateRecoveryConfig(conn, NULL));
+
+ /* don't need the source connection anymore */
+ source->destroy(source);
+ if (conn)
+ {
+ PQfinish(conn);
+ conn = NULL;
+ }
+
+ pg_log_info("Done!");
+
+ return 0;
+}
+
+/*
+ * Perform the rewind.
+ *
+ * We have already collected all the information we need from the
+ * target and the source.
+ */
+static void
+perform_rewind(filemap_t *filemap, rewind_source *source,
+ XLogRecPtr chkptrec,
+ TimeLineID chkpttli,
+ XLogRecPtr chkptredo)
+{
+ XLogRecPtr endrec;
+ TimeLineID endtli;
+ ControlFileData ControlFile_new;
+ size_t size;
+ char *buffer;
+
+ /*
+ * Execute the actions in the file map, fetching data from the source
+ * system as needed.
+ */
+ for (int i = 0; i < filemap->nentries; i++)
+ {
+ file_entry_t *entry = filemap->entries[i];
+
+ /*
+ * If this is a relation file, copy the modified blocks.
+ *
+ * This is in addition to any other changes.
+ */
+ if (entry->target_pages_to_overwrite.bitmapsize > 0)
+ {
+ datapagemap_iterator_t *iter;
+ BlockNumber blkno;
+ off_t offset;
+
+ iter = datapagemap_iterate(&entry->target_pages_to_overwrite);
+ while (datapagemap_next(iter, &blkno))
+ {
+ offset = blkno * BLCKSZ;
+ source->queue_fetch_range(source, entry->path, offset, BLCKSZ);
+ }
+ pg_free(iter);
+ }
+
+ switch (entry->action)
+ {
+ case FILE_ACTION_NONE:
+ /* nothing else to do */
+ break;
+
+ case FILE_ACTION_COPY:
+ source->queue_fetch_file(source, entry->path, entry->source_size);
+ break;
+
+ case FILE_ACTION_TRUNCATE:
+ truncate_target_file(entry->path, entry->source_size);
+ break;
+
+ case FILE_ACTION_COPY_TAIL:
+ source->queue_fetch_range(source, entry->path,
+ entry->target_size,
+ entry->source_size - entry->target_size);
+ break;
+
+ case FILE_ACTION_REMOVE:
+ remove_target(entry);
+ break;
+
+ case FILE_ACTION_CREATE:
+ create_target(entry);
+ break;
+
+ case FILE_ACTION_UNDECIDED:
+ pg_fatal("no action decided for file \"%s\"", entry->path);
+ break;
+ }
+ }
+
+ /* Complete any remaining range-fetches that we queued up above. */
+ source->finish_fetch(source);
+
+ close_target_file();
+
+ progress_report(true);
+
+ /*
+ * Fetch the control file from the source last. This ensures that the
+ * minRecoveryPoint is up-to-date.
+ */
+ buffer = source->fetch_file(source, "global/pg_control", &size);
+ digestControlFile(&ControlFile_source_after, buffer, size);
+ pg_free(buffer);
+
+ /*
+ * Sanity check: If the source is a local system, the control file should
+ * not have changed since we started.
+ *
+ * XXX: We assume it hasn't been modified, but actually, what could go
+ * wrong? The logic handles a libpq source that's modified concurrently,
+ * why not a local datadir?
+ */
+ if (datadir_source &&
+ memcmp(&ControlFile_source, &ControlFile_source_after,
+ sizeof(ControlFileData)) != 0)
+ {
+ pg_fatal("source system was modified while pg_rewind was running");
+ }
+
+ if (showprogress)
+ pg_log_info("creating backup label and updating control file");
+
+ /*
+ * Create a backup label file, to tell the target where to begin the WAL
+ * replay. Normally, from the last common checkpoint between the source
+ * and the target. But if the source is a standby server, it's possible
+ * that the last common checkpoint is *after* the standby's restartpoint.
+ * That implies that the source server has applied the checkpoint record,
+ * but hasn't performed a corresponding restartpoint yet. Make sure we
+ * start at the restartpoint's redo point in that case.
+ *
+ * Use the old version of the source's control file for this. The server
+ * might have finished the restartpoint after we started copying files,
+ * but we must begin from the redo point at the time that started copying.
+ */
+ if (ControlFile_source.checkPointCopy.redo < chkptredo)
+ {
+ chkptredo = ControlFile_source.checkPointCopy.redo;
+ chkpttli = ControlFile_source.checkPointCopy.ThisTimeLineID;
+ chkptrec = ControlFile_source.checkPoint;
+ }
+ createBackupLabel(chkptredo, chkpttli, chkptrec);
+
+ /*
+ * Update control file of target, to tell the target how far it must
+ * replay the WAL (minRecoveryPoint).
+ */
+ if (connstr_source)
+ {
+ /*
+ * The source is a live server. Like in an online backup, it's
+ * important that we recover all the WAL that was generated while we
+ * were copying files.
+ */
+ if (ControlFile_source_after.state == DB_IN_ARCHIVE_RECOVERY)
+ {
+ /*
+ * Source is a standby server. We must replay to its
+ * minRecoveryPoint.
+ */
+ endrec = ControlFile_source_after.minRecoveryPoint;
+ endtli = ControlFile_source_after.minRecoveryPointTLI;
+ }
+ else
+ {
+ /*
+ * Source is a production, non-standby, server. We must replay to
+ * the last WAL insert location.
+ */
+ if (ControlFile_source_after.state != DB_IN_PRODUCTION)
+ pg_fatal("source system was in unexpected state at end of rewind");
+
+ endrec = source->get_current_wal_insert_lsn(source);
+ endtli = Max(ControlFile_source_after.checkPointCopy.ThisTimeLineID,
+ ControlFile_source_after.minRecoveryPointTLI);
+ }
+ }
+ else
+ {
+ /*
+ * Source is a local data directory. It should've shut down cleanly,
+ * and we must replay to the latest shutdown checkpoint.
+ */
+ endrec = ControlFile_source_after.checkPoint;
+ endtli = ControlFile_source_after.checkPointCopy.ThisTimeLineID;
+ }
+
+ memcpy(&ControlFile_new, &ControlFile_source_after, sizeof(ControlFileData));
+ ControlFile_new.minRecoveryPoint = endrec;
+ ControlFile_new.minRecoveryPointTLI = endtli;
+ ControlFile_new.state = DB_IN_ARCHIVE_RECOVERY;
+ if (!dry_run)
+ update_controlfile(datadir_target, &ControlFile_new, do_sync);
+}
+
+static void
+sanityChecks(void)
+{
+ /* TODO Check that there's no backup_label in either cluster */
+
+ /* Check system_identifier match */
+ if (ControlFile_target.system_identifier != ControlFile_source.system_identifier)
+ pg_fatal("source and target clusters are from different systems");
+
+ /* check version */
+ if (ControlFile_target.pg_control_version != PG_CONTROL_VERSION ||
+ ControlFile_source.pg_control_version != PG_CONTROL_VERSION ||
+ ControlFile_target.catalog_version_no != CATALOG_VERSION_NO ||
+ ControlFile_source.catalog_version_no != CATALOG_VERSION_NO)
+ {
+ pg_fatal("clusters are not compatible with this version of pg_rewind");
+ }
+
+ /*
+ * Target cluster need to use checksums or hint bit wal-logging, this to
+ * prevent from data corruption that could occur because of hint bits.
+ */
+ if (ControlFile_target.data_checksum_version != PG_DATA_CHECKSUM_VERSION &&
+ !ControlFile_target.wal_log_hints)
+ {
+ pg_fatal("target server needs to use either data checksums or \"wal_log_hints = on\"");
+ }
+
+ /*
+ * Target cluster better not be running. This doesn't guard against
+ * someone starting the cluster concurrently. Also, this is probably more
+ * strict than necessary; it's OK if the target node was not shut down
+ * cleanly, as long as it isn't running at the moment.
+ */
+ if (ControlFile_target.state != DB_SHUTDOWNED &&
+ ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("target server must be shut down cleanly");
+
+ /*
+ * When the source is a data directory, also require that the source
+ * server is shut down. There isn't any very strong reason for this
+ * limitation, but better safe than sorry.
+ */
+ if (datadir_source &&
+ ControlFile_source.state != DB_SHUTDOWNED &&
+ ControlFile_source.state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("source data directory must be shut down cleanly");
+}
+
+/*
+ * Print a progress report based on the fetch_size and fetch_done variables.
+ *
+ * Progress report is written at maximum once per second, except that the
+ * last progress report is always printed.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+void
+progress_report(bool finished)
+{
+ static pg_time_t last_progress_report = 0;
+ int percent;
+ char fetch_done_str[32];
+ char fetch_size_str[32];
+ pg_time_t now;
+
+ if (!showprogress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ percent = fetch_size ? (int) ((fetch_done) * 100 / fetch_size) : 0;
+
+ /*
+ * Avoid overflowing past 100% or the full size. This may make the total
+ * size number change as we approach the end of the backup (the estimate
+ * will always be wrong if WAL is included), but that's better than having
+ * the done column be bigger than the total.
+ */
+ if (percent > 100)
+ percent = 100;
+ if (fetch_done > fetch_size)
+ fetch_size = fetch_done;
+
+ snprintf(fetch_done_str, sizeof(fetch_done_str), UINT64_FORMAT,
+ fetch_done / 1024);
+ snprintf(fetch_size_str, sizeof(fetch_size_str), UINT64_FORMAT,
+ fetch_size / 1024);
+
+ fprintf(stderr, _("%*s/%s kB (%d%%) copied"),
+ (int) strlen(fetch_size_str), fetch_done_str, fetch_size_str,
+ percent);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+/*
+ * Find minimum from two WAL locations assuming InvalidXLogRecPtr means
+ * infinity as src/include/access/timeline.h states. This routine should
+ * be used only when comparing WAL locations related to history files.
+ */
+static XLogRecPtr
+MinXLogRecPtr(XLogRecPtr a, XLogRecPtr b)
+{
+ if (XLogRecPtrIsInvalid(a))
+ return b;
+ else if (XLogRecPtrIsInvalid(b))
+ return a;
+ else
+ return Min(a, b);
+}
+
+/*
+ * Retrieve timeline history for the source or target system.
+ */
+static TimeLineHistoryEntry *
+getTimelineHistory(TimeLineID tli, bool is_source, int *nentries)
+{
+ TimeLineHistoryEntry *history;
+
+ /*
+ * Timeline 1 does not have a history file, so there is no need to check
+ * and fake an entry with infinite start and end positions.
+ */
+ if (tli == 1)
+ {
+ history = (TimeLineHistoryEntry *) pg_malloc(sizeof(TimeLineHistoryEntry));
+ history->tli = tli;
+ history->begin = history->end = InvalidXLogRecPtr;
+ *nentries = 1;
+ }
+ else
+ {
+ char path[MAXPGPATH];
+ char *histfile;
+
+ TLHistoryFilePath(path, tli);
+
+ /* Get history file from appropriate source */
+ if (is_source)
+ histfile = source->fetch_file(source, path, NULL);
+ else
+ histfile = slurpFile(datadir_target, path, NULL);
+
+ history = rewind_parseTimeLineHistory(histfile, tli, nentries);
+ pg_free(histfile);
+ }
+
+ if (debug)
+ {
+ int i;
+
+ if (is_source)
+ pg_log_debug("Source timeline history:");
+ else
+ pg_log_debug("Target timeline history:");
+
+ /*
+ * Print the target timeline history.
+ */
+ for (i = 0; i < targetNentries; i++)
+ {
+ TimeLineHistoryEntry *entry;
+
+ entry = &history[i];
+ pg_log_debug("%u: %X/%X - %X/%X", entry->tli,
+ LSN_FORMAT_ARGS(entry->begin),
+ LSN_FORMAT_ARGS(entry->end));
+ }
+ }
+
+ return history;
+}
+
+/*
+ * Determine the TLI of the last common timeline in the timeline history of
+ * two clusters. *tliIndex is set to the index of last common timeline in
+ * the arrays, and *recptr is set to the position where the timeline history
+ * diverged (ie. the first WAL record that's not the same in both clusters).
+ */
+static void
+findCommonAncestorTimeline(TimeLineHistoryEntry *a_history, int a_nentries,
+ TimeLineHistoryEntry *b_history, int b_nentries,
+ XLogRecPtr *recptr, int *tliIndex)
+{
+ int i,
+ n;
+
+ /*
+ * Trace the history forward, until we hit the timeline diverge. It may
+ * still be possible that the source and target nodes used the same
+ * timeline number in their history but with different start position
+ * depending on the history files that each node has fetched in previous
+ * recovery processes. Hence check the start position of the new timeline
+ * as well and move down by one extra timeline entry if they do not match.
+ */
+ n = Min(a_nentries, b_nentries);
+ for (i = 0; i < n; i++)
+ {
+ if (a_history[i].tli != b_history[i].tli ||
+ a_history[i].begin != b_history[i].begin)
+ break;
+ }
+
+ if (i > 0)
+ {
+ i--;
+ *recptr = MinXLogRecPtr(a_history[i].end, b_history[i].end);
+ *tliIndex = i;
+ return;
+ }
+ else
+ {
+ pg_fatal("could not find common ancestor of the source and target cluster's timelines");
+ }
+}
+
+
+/*
+ * Create a backup_label file that forces recovery to begin at the last common
+ * checkpoint.
+ */
+static void
+createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli, XLogRecPtr checkpointloc)
+{
+ XLogSegNo startsegno;
+ time_t stamp_time;
+ char strfbuf[128];
+ char xlogfilename[MAXFNAMELEN];
+ struct tm *tmp;
+ char buf[1000];
+ int len;
+
+ XLByteToSeg(startpoint, startsegno, WalSegSz);
+ XLogFileName(xlogfilename, starttli, startsegno, WalSegSz);
+
+ /*
+ * Construct backup label file
+ */
+ stamp_time = time(NULL);
+ tmp = localtime(&stamp_time);
+ strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", tmp);
+
+ len = snprintf(buf, sizeof(buf),
+ "START WAL LOCATION: %X/%X (file %s)\n"
+ "CHECKPOINT LOCATION: %X/%X\n"
+ "BACKUP METHOD: pg_rewind\n"
+ "BACKUP FROM: standby\n"
+ "START TIME: %s\n",
+ /* omit LABEL: line */
+ LSN_FORMAT_ARGS(startpoint), xlogfilename,
+ LSN_FORMAT_ARGS(checkpointloc),
+ strfbuf);
+ if (len >= sizeof(buf))
+ pg_fatal("backup label buffer too small"); /* shouldn't happen */
+
+ /* TODO: move old file out of the way, if any. */
+ open_target_file("backup_label", true); /* BACKUP_LABEL_FILE */
+ write_target_range(buf, 0, len);
+ close_target_file();
+}
+
+/*
+ * Check CRC of control file
+ */
+static void
+checkControlFile(ControlFileData *ControlFile)
+{
+ pg_crc32c crc;
+
+ /* Calculate CRC */
+ INIT_CRC32C(crc);
+ COMP_CRC32C(crc, (char *) ControlFile, offsetof(ControlFileData, crc));
+ FIN_CRC32C(crc);
+
+ /* And simply compare it */
+ if (!EQ_CRC32C(crc, ControlFile->crc))
+ pg_fatal("unexpected control file CRC");
+}
+
+/*
+ * Verify control file contents in the buffer 'content', and copy it to
+ * *ControlFile.
+ */
+static void
+digestControlFile(ControlFileData *ControlFile, const char *content,
+ size_t size)
+{
+ if (size != PG_CONTROL_FILE_SIZE)
+ pg_fatal("unexpected control file size %d, expected %d",
+ (int) size, PG_CONTROL_FILE_SIZE);
+
+ memcpy(ControlFile, content, sizeof(ControlFileData));
+
+ /* set and validate WalSegSz */
+ WalSegSz = ControlFile->xlog_seg_size;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte",
+ "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes",
+ WalSegSz),
+ WalSegSz);
+
+ /* Additional checks on control file */
+ checkControlFile(ControlFile);
+}
+
+/*
+ * Get value of GUC parameter restore_command from the target cluster.
+ *
+ * This uses a logic based on "postgres -C" to get the value from the
+ * cluster.
+ */
+static void
+getRestoreCommand(const char *argv0)
+{
+ int rc;
+ char postgres_exec_path[MAXPGPATH],
+ cmd_output[MAXPGPATH];
+ PQExpBuffer postgres_cmd;
+
+ if (!restore_wal)
+ return;
+
+ /* find postgres executable */
+ rc = find_other_exec(argv0, "postgres",
+ PG_BACKEND_VERSIONSTR,
+ postgres_exec_path);
+
+ if (rc < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (rc == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "postgres", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "postgres", full_path, progname);
+ }
+
+ /*
+ * Build a command able to retrieve the value of GUC parameter
+ * restore_command, if set.
+ */
+ postgres_cmd = createPQExpBuffer();
+
+ /* path to postgres, properly quoted */
+ appendShellString(postgres_cmd, postgres_exec_path);
+
+ /* add -D switch, with properly quoted data directory */
+ appendPQExpBufferStr(postgres_cmd, " -D ");
+ appendShellString(postgres_cmd, datadir_target);
+
+ /* add custom configuration file only if requested */
+ if (config_file != NULL)
+ {
+ appendPQExpBufferStr(postgres_cmd, " -c config_file=");
+ appendShellString(postgres_cmd, config_file);
+ }
+
+ /* add -C switch, for restore_command */
+ appendPQExpBufferStr(postgres_cmd, " -C restore_command");
+
+ if (!pipe_read_line(postgres_cmd->data, cmd_output, sizeof(cmd_output)))
+ exit(1);
+
+ (void) pg_strip_crlf(cmd_output);
+
+ if (strcmp(cmd_output, "") == 0)
+ pg_fatal("restore_command is not set in the target cluster");
+
+ restore_command = pg_strdup(cmd_output);
+
+ pg_log_debug("using for rewind restore_command = \'%s\'",
+ restore_command);
+
+ destroyPQExpBuffer(postgres_cmd);
+}
+
+
+/*
+ * Ensure clean shutdown of target instance by launching single-user mode
+ * postgres to do crash recovery.
+ */
+static void
+ensureCleanShutdown(const char *argv0)
+{
+ int ret;
+#define MAXCMDLEN (2 * MAXPGPATH)
+ char exec_path[MAXPGPATH];
+ PQExpBuffer postgres_cmd;
+
+ /* locate postgres binary */
+ if ((ret = find_other_exec(argv0, "postgres",
+ PG_BACKEND_VERSIONSTR,
+ exec_path)) < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "postgres", progname, full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "postgres", full_path, progname);
+ }
+
+ pg_log_info("executing \"%s\" for target server to complete crash recovery",
+ exec_path);
+
+ /*
+ * Skip processing if requested, but only after ensuring presence of
+ * postgres.
+ */
+ if (dry_run)
+ return;
+
+ /*
+ * Finally run postgres in single-user mode. There is no need to use
+ * fsync here. This makes the recovery faster, and the target data folder
+ * is synced at the end anyway.
+ */
+ postgres_cmd = createPQExpBuffer();
+
+ /* path to postgres, properly quoted */
+ appendShellString(postgres_cmd, exec_path);
+
+ /* add set of options with properly quoted data directory */
+ appendPQExpBufferStr(postgres_cmd, " --single -F -D ");
+ appendShellString(postgres_cmd, datadir_target);
+
+ /* add custom configuration file only if requested */
+ if (config_file != NULL)
+ {
+ appendPQExpBufferStr(postgres_cmd, " -c config_file=");
+ appendShellString(postgres_cmd, config_file);
+ }
+
+ /* finish with the database name, and a properly quoted redirection */
+ appendPQExpBufferStr(postgres_cmd, " template1 < ");
+ appendShellString(postgres_cmd, DEVNULL);
+
+ fflush(NULL);
+ if (system(postgres_cmd->data) != 0)
+ {
+ pg_log_error("postgres single-user mode in target cluster failed");
+ pg_log_error_detail("Command was: %s", postgres_cmd->data);
+ exit(1);
+ }
+
+ destroyPQExpBuffer(postgres_cmd);
+}
+
+static void
+disconnect_atexit(void)
+{
+ if (conn != NULL)
+ PQfinish(conn);
+}
diff --git a/src/bin/pg_rewind/pg_rewind.h b/src/bin/pg_rewind/pg_rewind.h
new file mode 100644
index 0000000..ef8bdc1
--- /dev/null
+++ b/src/bin/pg_rewind/pg_rewind.h
@@ -0,0 +1,56 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_rewind.h
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PG_REWIND_H
+#define PG_REWIND_H
+
+#include "access/timeline.h"
+#include "common/logging.h"
+#include "datapagemap.h"
+#include "libpq-fe.h"
+#include "storage/block.h"
+#include "storage/relfilelocator.h"
+
+/* Configuration options */
+extern char *datadir_target;
+extern bool showprogress;
+extern bool dry_run;
+extern bool do_sync;
+extern int WalSegSz;
+
+/* Target history */
+extern TimeLineHistoryEntry *targetHistory;
+extern int targetNentries;
+
+/* Progress counters */
+extern uint64 fetch_size;
+extern uint64 fetch_done;
+
+/* in parsexlog.c */
+extern void extractPageMap(const char *datadir, XLogRecPtr startpoint,
+ int tliIndex, XLogRecPtr endpoint,
+ const char *restoreCommand);
+extern void findLastCheckpoint(const char *datadir, XLogRecPtr forkptr,
+ int tliIndex,
+ XLogRecPtr *lastchkptrec, TimeLineID *lastchkpttli,
+ XLogRecPtr *lastchkptredo,
+ const char *restoreCommand);
+extern XLogRecPtr readOneRecord(const char *datadir, XLogRecPtr ptr,
+ int tliIndex, const char *restoreCommand);
+
+/* in pg_rewind.c */
+extern void progress_report(bool finished);
+
+/* in timeline.c */
+extern TimeLineHistoryEntry *rewind_parseTimeLineHistory(char *buffer,
+ TimeLineID targetTLI,
+ int *nentries);
+
+#endif /* PG_REWIND_H */
diff --git a/src/bin/pg_rewind/po/LINGUAS b/src/bin/pg_rewind/po/LINGUAS
new file mode 100644
index 0000000..6fccaad
--- /dev/null
+++ b/src/bin/pg_rewind/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_rewind/po/cs.po b/src/bin/pg_rewind/po/cs.po
new file mode 100644
index 0000000..1f4a8eb
--- /dev/null
+++ b/src/bin/pg_rewind/po/cs.po
@@ -0,0 +1,1019 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2020-10-31 21:24+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,-1,-1,17\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "nelze naÄíst knihovnu \"%s\": kód chyby %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "na této platformě nelze vytvářet vyhrazené tokeny: kód chyby %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "nelze otevřít token procesu: chybový kód %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "nelze alokovat SIDs: chybový kód %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "nelze vytvořit vyhrazený token: chybový kód %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "nelze nastartovat proces pro příkaz \"%s\": chybový kód %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "nelze znovu spustit s vyhrazeným tokenem: chybový kód %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "nelze získat návratový kód z podprovesu: chybový kód %lu"
+
+#: ../../fe_utils/archive.c:53
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "nelze použít restore_command se zástupnou hodnotou %%r"
+
+#: ../../fe_utils/archive.c:74
+#, c-format
+msgid "unexpected file size for \"%s\": %lu instead of %lu"
+msgstr "neoÄekávaná velikost souboru \"%s\": %lu namísto %lu"
+
+#: ../../fe_utils/archive.c:85
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "nelze otevřít soubor \"%s\" obnovený z archivu: %m"
+
+#: ../../fe_utils/archive.c:97 copy_fetch.c:88 filemap.c:208
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "nelze přistoupit k souboru \"%s\": %m"
+
+#: ../../fe_utils/archive.c:112
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command selhal: %s"
+
+#: ../../fe_utils/archive.c:121
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "nelze obnovit soubor\"%s\" z archivu"
+
+#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49
+#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100
+#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:73 parsexlog.c:125
+#: parsexlog.c:185
+#, c-format
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:298
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:140
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "nelze zapsat do souboru \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:152
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "nelze vytvořit soubor \"%s\": %m"
+
+#: copy_fetch.c:59
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: copy_fetch.c:117
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze pÅ™eÄíst symbolický odkaz \"%s\": %m"
+
+#: copy_fetch.c:120
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "cíl symbolického odkazu \"%s\" je příliš dlouhý"
+
+#: copy_fetch.c:135
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\" je symbolický odkaz, ale symbolické odkazy nejsou na této platformě podporovány"
+
+#: copy_fetch.c:142
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "nelze Äíst z adresáře \"%s\": %m"
+
+#: copy_fetch.c:146
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "nelze uzavřít adresář \"%s\": %m"
+
+#: copy_fetch.c:166
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "nelze otevřít zdrojový soubor \"%s\": %m"
+
+#: copy_fetch.c:170
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "nelze změnit pozici (seek) ve zdrojovém souboru: %m"
+
+#: copy_fetch.c:187 file_ops.c:311 parsexlog.c:336
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "nelze Äíst soubor \"%s\": %m"
+
+#: copy_fetch.c:190
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "neoÄekávaný znak EOF pÅ™i Ätení souboru \"%s\""
+
+#: copy_fetch.c:197
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "nelze uzavřít soubor \"%s\": %m"
+
+#: file_ops.c:62
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "nelze otevřít cílový soubor \"%s\": %m"
+
+#: file_ops.c:76
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "nelze uzavřít cílový soubor \"%s\": %m"
+
+#: file_ops.c:96
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "nelze změnit pozici (seek) v cílovém souboru \"%s\": %m"
+
+#: file_ops.c:112
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "nelze zapsat soubor \"%s\": %m"
+
+#: file_ops.c:162
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "neplatná akce (CREATE) pro obyÄejný soubor"
+
+#: file_ops.c:185
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "nelze odstranit soubor \"%s\": %m"
+
+#: file_ops.c:203
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "nelze otevřít soubor \"%s\" pro zkrácení (truncate): %m"
+
+#: file_ops.c:207
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "nelze zkrátit (truncate) soubor \"%s\" na %u: %m"
+
+#: file_ops.c:223
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "nelze vytvořit adresář \"%s\": %m"
+
+#: file_ops.c:237
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "nelze odstranit adresář \"%s\": %m"
+
+#: file_ops.c:251
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "nelze vytvořit symbolický odkaz na \"%s\": %m"
+
+#: file_ops.c:265
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "nelze odstranit symbolický odkaz \"%s\": %m"
+
+#: file_ops.c:296 file_ops.c:300
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "nelze otevřít soubor \"%s\" pro Ätení: %m"
+
+#: file_ops.c:314 parsexlog.c:338
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "nelze Äíst soubor \"%s\": naÄteno %d z %zu"
+
+#: filemap.c:200
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "datový soubor \"%s\" ve zdroji není obyÄejný soubor"
+
+#: filemap.c:222
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" není adresář"
+
+#: filemap.c:245
+#, c-format
+msgid "\"%s\" is not a symbolic link"
+msgstr "\"%s\" není symbolický odkaz"
+
+#: filemap.c:257
+#, c-format
+msgid "\"%s\" is not a regular file"
+msgstr "\"%s\" není obyÄejný soubor"
+
+#: filemap.c:369
+#, c-format
+msgid "source file list is empty"
+msgstr "seznam zdrojových souborů je prázdný"
+
+#: filemap.c:484
+#, c-format
+msgid "unexpected page modification for directory or symbolic link \"%s\""
+msgstr "neoÄekávaná modifikace stránky pro adresář nebo symbolický odkaz \"%s\""
+
+#: libpq_fetch.c:50
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "nelze se připojit k serveru: %s"
+
+#: libpq_fetch.c:54
+#, c-format
+msgid "connected to server"
+msgstr "připojen k serveru"
+
+#: libpq_fetch.c:63
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "nelze vyÄistit search_path: %s"
+
+#: libpq_fetch.c:75
+#, c-format
+msgid "source server must not be in recovery mode"
+msgstr "zdrojový server musí být v recovery módu"
+
+#: libpq_fetch.c:85
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes musí být zapnuty na zdrojovém serveru"
+
+#: libpq_fetch.c:111
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "chyba při spuštění dotazu (%s) na zdrojovém serveru: %s"
+
+#: libpq_fetch.c:116
+#, c-format
+msgid "unexpected result set from query"
+msgstr "neoÄekávaný výsledek dotazu"
+
+#: libpq_fetch.c:137
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "chyba při spuštění dotazu (%s) na zdrojovém serveru: %s"
+
+#: libpq_fetch.c:157
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "nerozpoznaný výsledek \"%s\" pro aktuální WAL insert pozici"
+
+#: libpq_fetch.c:207
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "nelze naÄíst seznam souborů: %s"
+
+#: libpq_fetch.c:212
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "neoÄekávaný výsledek pÅ™i naÄítání seznamu souborů"
+
+#: libpq_fetch.c:265
+#, c-format
+msgid "could not send query: %s"
+msgstr "nelze zaslat dotaz: %s"
+
+#: libpq_fetch.c:270
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "nelze nastavit libpq spojení na single row mód"
+
+#: libpq_fetch.c:290
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "neoÄekávaný výsledek pÅ™i naÄítání vzdálených souborů: %s"
+
+#: libpq_fetch.c:296
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "neoÄekávaná velikost výsledku pÅ™i naÄítání vzdálených souborů"
+
+#: libpq_fetch.c:302
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "neoÄekávané datové typy ve vysledku pÅ™i naÄítání vzdálených souborů: %u %u %u"
+
+#: libpq_fetch.c:310
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "neoÄekávaný formát výsledku pÅ™i naÄítání vzdálených souborů"
+
+#: libpq_fetch.c:316
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "neoÄekávané null hodnoty ve výsledku pÅ™i naÄítání vzdálených souborů"
+
+#: libpq_fetch.c:320
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "neoÄekávaná délka výsledku pÅ™i naÄítání vzdálených souborů"
+
+#: libpq_fetch.c:381
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "nelze naÄíst vzdálený soubor \"%s\": %s"
+
+#: libpq_fetch.c:386
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "neoÄekávaný výsledek pÅ™i naÄítání vzdáleného souboru \"%s\""
+
+#: libpq_fetch.c:430
+#, c-format
+msgid "could not send COPY data: %s"
+msgstr "nelze poslat COPY data: %s"
+
+#: libpq_fetch.c:459
+#, c-format
+msgid "could not send file list: %s"
+msgstr "nelze poslat seznam souborů: %s"
+
+#: libpq_fetch.c:501
+#, c-format
+msgid "could not send end-of-COPY: %s"
+msgstr "nelze poslat end-of-COPY: %s"
+
+#: libpq_fetch.c:507
+#, c-format
+msgid "unexpected result while sending file list: %s"
+msgstr "neoÄekávaný výsledek pÅ™i posílání seznamu souborů: %s"
+
+#: parsexlog.c:85 parsexlog.c:132
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "nelze naÄíst WAL záznam na %X/%X: %s"
+
+#: parsexlog.c:89 parsexlog.c:135
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "nelze naÄíst WAL záznam na %X/%X"
+
+#: parsexlog.c:198
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "nelze nalézt předchozí WAL záznam na %X/%X: %s"
+
+#: parsexlog.c:202
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "nelze naÄíst pÅ™edchozí WAL záznam na %X/%X"
+
+#: parsexlog.c:327
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "nelze nastavit pozici (seek) v souboru \"%s\": %m"
+
+#: parsexlog.c:407
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X"
+msgstr "WAL záznam modifikuje relaci, ale typ záznamu není rozpoznán: lsn: %X/%X, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:78
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynchronizuje PostgreSQL cluster s jinou kopií daného clusteru.\n"
+"\n"
+
+#: pg_rewind.c:79
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Použití:\n"
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_rewind.c:80
+#, c-format
+msgid "Options:\n"
+msgstr "PÅ™epínaÄe:\n"
+
+#: pg_rewind.c:81
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal použij restore_command v cílové konfiguraci pro\n"
+" získání WAL souborů z archivu\n"
+
+#: pg_rewind.c:83
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=ADRESÃŘ existující datový adresář pro modifikaci\n"
+
+#: pg_rewind.c:84
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=ADRESÃŘ zdrojový datový adresář proti kterému se synchronizovat\n"
+
+#: pg_rewind.c:85
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR zdrojový server se kterým se synchronizovat\n"
+
+#: pg_rewind.c:86
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run zastavit pÅ™ed modifikací Äehokoliv\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync neÄekat na bezpeÄné zapsání zmÄ›n na disk\n"
+"\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress průběžně vypisovat zprávy o postupu\n"
+
+#: pg_rewind.c:90
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf zapíše konfiguraci pro replikaci\n"
+" (vyžaduje zadání --source-server)\n"
+"\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug vypisovat mnoho zpráv s debug informacemi\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown neopravuj automaticky neÄisté vypnutí databáze\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypíše informaci o verzi, poté skonÄí\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help vypíše tuto nápovÄ›du, poté skonÄí\n"
+
+#: pg_rewind.c:96
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby oznamujte na <%s>.\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_rewind.c:159 pg_rewind.c:208 pg_rewind.c:215 pg_rewind.c:222
+#: pg_rewind.c:229 pg_rewind.c:237
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_rewind.c:207
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "nespecifikován žádný zdroj (--source-pgdata nebo --source-server)"
+
+#: pg_rewind.c:214
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "pouze jedna z voleb --source-pgdata nebo --source-server může být zadána"
+
+#: pg_rewind.c:221
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "cílový datový adresář nespecifikován (--target-pgdata)"
+
+#: pg_rewind.c:228
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr ""
+
+#: pg_rewind.c:235
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "nelze spouštět jako \"root\""
+
+#: pg_rewind.c:251
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "Musíte spustit %s jako PostgreSQL superuživatel.\n"
+
+#: pg_rewind.c:262
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %m"
+
+#: pg_rewind.c:316
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "zdrojový a cílový cluster jsou na stejné timeline"
+
+#: pg_rewind.c:322
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "servery se rozešly na WAL pozici %X/%X na timeline %u"
+
+#: pg_rewind.c:360
+#, c-format
+msgid "no rewind required"
+msgstr "rewind není potřeba"
+
+#: pg_rewind.c:369
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "provádím rewind z posledního spoleÄného checkpointu na %X/%X na timeline %u"
+
+#: pg_rewind.c:378
+#, c-format
+msgid "reading source file list"
+msgstr "naÄítám seznam zdrojových souborů"
+
+#: pg_rewind.c:381
+#, c-format
+msgid "reading target file list"
+msgstr "naÄítám seznam cílových souborů"
+
+#: pg_rewind.c:392
+#, c-format
+msgid "reading WAL in target"
+msgstr "Ätu WAL na cílovém clusteru"
+
+#: pg_rewind.c:409
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "je třeba zkopírovat %lu MB (celková velikost zdrojového adresáře je %lu MB)"
+
+#: pg_rewind.c:427
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "vytvářím backup label a aktualizuji control file"
+
+#: pg_rewind.c:457
+#, c-format
+msgid "syncing target data directory"
+msgstr "provádím sync cílového datového adresáře"
+
+#: pg_rewind.c:464
+#, c-format
+msgid "Done!"
+msgstr "Hotovo!"
+
+#: pg_rewind.c:476
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "zdrojový a cílový cluster jsou z různých systémů"
+
+#: pg_rewind.c:484
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "clustery nejsou kompatibilní s touto verzí pg_rewind"
+
+#: pg_rewind.c:494
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "cílový server musí používat buÄ data checksums nebo \"wal_log_hints = on\""
+
+#: pg_rewind.c:505
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "cílový server musí být zastaven ÄistÄ›"
+
+#: pg_rewind.c:515
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "zdrojový datový adresář musí být zastaven ÄistÄ›"
+
+#: pg_rewind.c:567
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) zkopírováno"
+
+#: pg_rewind.c:630
+#, c-format
+msgid "invalid control file"
+msgstr "neplatný control file"
+
+#: pg_rewind.c:714
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "nelze najít spoleÄného pÅ™edka pro timeline ze zdrojového a cílového clusteru"
+
+#: pg_rewind.c:755
+#, c-format
+msgid "backup label buffer too small"
+msgstr "backup label buffer je příliš malý"
+
+#: pg_rewind.c:778
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "neoÄekávaná CRC hodnota control file"
+
+#: pg_rewind.c:788
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "neoÄekávaná velikost control file %d, oÄekáváno %d"
+
+#: pg_rewind.c:797
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "Velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale control file udává %d byte"
+msgstr[1] "Velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale control file udává %d bytů"
+msgstr[2] "Velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale control file udává %d bytů"
+
+#: pg_rewind.c:854 pg_rewind.c:912
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" je vyžadován aplikací %s, ale nebyl nalezen ve stejném\n"
+"adresáři jako \"%s\".\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_rewind.c:859 pg_rewind.c:917
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"Program \"%s\" byl nalezen pomocí \"%s\",\n"
+"ale nebyl ve stejné verzi jako %s.\n"
+"Zkontrolujte vaši instalaci."
+
+#: pg_rewind.c:880
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command není nastaven pro cílový cluster"
+
+#: pg_rewind.c:923
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "spouÅ¡tím \"%s\" na cílovém serveru pro dokonÄení crash recovery"
+
+#: pg_rewind.c:943
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "postgres single-user mód v cílovém clusteru selhal"
+
+#: pg_rewind.c:944
+#, c-format
+msgid "Command was: %s"
+msgstr "Příkaz byl: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "syntaktická chyba v souboru s historií: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "OÄekávána Äíselná hodnota timeline ID."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "OÄekávána pozice pro switchpoint write-ahead logu."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "chybná data v souboru s historií: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Timeline IDs musí být rostoucí posloupnost."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "chybná data v souboru s historií"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Timeline IDs musí být nižší než timeline ID potomka."
+
+#: xlogreader.c:349
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "neplatný offset záznamu na %X/%X"
+
+#: xlogreader.c:357
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord je vyžadován %X/%X"
+
+#: xlogreader.c:398 xlogreader.c:695
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "neplatná délka záznamu na %X/%X: potřeba %u, získáno %u"
+
+#: xlogreader.c:422
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "délka záznamu %u na %X/%X je příliš vysoká"
+
+#: xlogreader.c:454
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "na %X/%X není nastaven contrecord flag"
+
+#: xlogreader.c:467
+#, c-format
+msgid "invalid contrecord length %u at %X/%X"
+msgstr "chybná contrecord délka %u na %X/%X"
+
+#: xlogreader.c:703
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "chybný ID resource managera %u na %X/%X"
+
+#: xlogreader.c:717 xlogreader.c:734
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "záznam s neplatnou hodnotou prev-link %X/%X na %X/%X"
+
+#: xlogreader.c:771
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "neplatný data checksum resource managera v záznamu na %X/%X"
+
+#: xlogreader.c:808
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "neplatné magické Äíslo %04X v log segmentu %s, offset %u"
+
+#: xlogreader.c:822 xlogreader.c:863
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "neplatné info bity %04X v log segmentu %s, offset %u"
+
+#: xlogreader.c:837
+#, 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 soubor je z jiného databázového systému: systémový identifikátor z WAL souboru je %llu, systémový identifikátor z pg_control je %llu"
+
+#: xlogreader.c:845
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL soubor je z jiného databázového systému: neplatná velikost segmentu v hlaviÄce stránky"
+
+#: xlogreader.c:851
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL soubor je z jiného databázového systému: neplatná hodnota XLOG_BLCKSZ v hlaviÄce stránky"
+
+#: xlogreader.c:882
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "neoÄekávaná pageaddr hodnota %X/%X v log segmentu %s, offset %u"
+
+#: xlogreader.c:907
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "timeline ID %u mimo pořadí (po %u) v log segmentu %s, offset %u"
+
+#: xlogreader.c:1247
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u mimo pořadí na %X/%X"
+
+#: xlogreader.c:1270
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA flag nastaven, ale žádná data nejsou přiložena na %X/%X"
+
+#: xlogreader.c:1277
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA flag nenastaven, ale délka dat je %u na %X/%X"
+
+#: xlogreader.c:1313
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE flag nastaven, ale hole offset %u length %u block image length %u na %X/%X"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE flag nenastaven, ale hole offset %u length %u na %X/%X"
+
+#: xlogreader.c:1344
+#, c-format
+msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED flag nastaven, ale block image length %u na %X/%X"
+
+#: xlogreader.c:1359
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE ani BKPIMAGE_IS_COMPRESSED flag nenastaven, ale block image length je %u na %X/%X"
+
+#: xlogreader.c:1375
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL flag nastaven, ale žádná předchozí rel hodnota na %X/%X"
+
+#: xlogreader.c:1387
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "neplatné block_id %u na %X/%X"
+
+#: xlogreader.c:1476
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "záznam s neplatnou délkou na %X/%X"
+
+#: xlogreader.c:1565
+#, c-format
+msgid "invalid compressed image at %X/%X, block %d"
+msgstr "neplatný komprimovaný image na %X/%X, block %d"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "nelze otevřít adresář \"%s\": %s\n"
+
+#~ msgid "could not read file \"%s\": %s\n"
+#~ msgstr "nelze Äíst soubor \"%s\": %s\n"
+
+#~ msgid " block %u\n"
+#~ msgstr " blok %u\n"
+
+#~ msgid "entry \"%s\" excluded from %s file list\n"
+#~ msgstr "položka \"%s\" vylouÄena ze %s seznamu souborů\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "nelze nastavit kontext spojení: %s"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "naÄítám Äásti souborů\n"
+
+#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr "přijata null hodnota pro chunk souboru \"%s\", soubor byl smazán\n"
+
+#~ msgid "received chunk for file \"%s\", offset %s, size %d\n"
+#~ msgstr "přijat chunk souboru \"%s\", offset %s, délka %d\n"
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "naÄten soubor \"%s\", délka %d\n"
+
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "nelze vytvořit temporary tabulku: %s"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Chyba, konÄím\n"
+
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "nelze otevřít soubor \"%s\": %s\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "nelze Äíst ze souboru \"%s\": %s\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: nelze naÄíst práva adresáře \"%s\": %s\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "Zdrojová timeline history:\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "Cílová timeline history:\n"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d: %X/%X - %X/%X\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Program \"initdb\" je vyžadován %s ale nebyl\n"
+#~ "nalezen ve stejném adresáři jako \"%s\".\n"
+#~ "Zkontrolujte svou instalaci.\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Program \"initdb\" byl nalezen \"%s\"\n"
+#~ "ale nemá stejnou verzi jako \"%s\".\n"
+#~ "Zkontrolujte svou instalaci.\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "sync na cílovém adresáři selhal\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/pg_rewind/po/de.po b/src/bin/pg_rewind/po/de.po
new file mode 100644
index 0000000..aea5e30
--- /dev/null
+++ b/src/bin/pg_rewind/po/de.po
@@ -0,0 +1,1000 @@
+# German message translation file for pg_rewind
+# Copyright (C) 2015-2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-19 17:22+0000\n"
+"PO-Revision-Date: 2023-05-19 20:50+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "ungültiger Wert für Parameter »%s«: »%s«"
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "Zeichenkette endet unerwartet nach Escape-Zeichen »%%«."
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "Zeichenkette enthält unerwarteten Platzhalter »%%%c«."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "unerwartete Dateigröße für »%s«: %lld statt %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "konnte aus dem Archiv wiederhergestellte Datei »%s« nicht öffnen: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command fehlgeschlagen: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "konnte nicht in Datei »%s« schreiben: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht erstellen: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "konnte Zieldatei »%s« nicht öffnen: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "konnte Zieldatei »%s« nicht schließen: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "konnte Positionszeiger in Zieldatei »%s« nicht setzen: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "undefinierter Dateityp für »%s«"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "ungültige Aktion (CREATE) für normale Datei"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht löschen: %m"
+
+#: file_ops.c:218
+#, 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
+#, 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
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht löschen: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht lesen: %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: filemap.c:236
+#, 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:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "doppelte Quelldatei »%s«"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "unerwartete Seitenänderung für nicht normale Datei »%s«"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "unbekannter Dateityp für »%s«"
+
+#: filemap.c:706
+#, 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:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "konnte nicht entscheiden, was mit Datei »%s« zu tun ist"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "konnte search_path nicht auf leer setzen: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes muss im Quell-Server eingeschaltet sein"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "konnte Anfrage zum Holen des Dateiinhalts nicht vorbereiten: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "Fehler beim Ausführen einer Anfrage (%s) auf dem Quellserver: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "Anfrage ergab unerwartete Ergebnismenge"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "Fehler beim Ausführen einer Anfrage (%s) im Quellserver: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "unbekanntes Ergebnis »%s« für aktuelle WAL-Einfügeposition"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "konnte Dateiliste nicht holen: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "unerwartete Ergebnismenge beim Holen der Dateiliste"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "konnte Anfrage nicht senden: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "konnte libpq-Verbindung nicht in den Einzelzeilenmodus setzen"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "unerwartetes Ergebnis beim Holen von fernen Dateien: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "mehr Daten-Chunks erhalten als verlangt"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "unerwartete Ergebnismengengröße beim Holen von fernen Dateien"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "unerwartete Datentypen in Ergebnismenge beim Holen von fernen Dateien: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "unerwartetes Ergebnisformat beim Holen von fernen Dateien"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "unerwartete NULL-Werte im Ergebnis beim Holen von fernen Dateien"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "unerwartete Ergebnislänge beim Holen von fernen Dateien"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "Daten für Datei »%s« erhalten, aber »%s« wurde verlangt"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "Daten für Offset %lld von Datei »%s« erhalten, aber Offset %lld wurde verlangt"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "mehr als verlangt erhalten für Datei »%s«"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "unerwartete Anzahl Daten-Chunks erhalten"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "konnte ferne Datei »%s« nicht holen: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "unerwartete Ergebnismenge beim Holen der fernen Datei »%s«"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "konnte Quelldatei »%s« nicht öffnen: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "Größe der Quelldatei »%s« nebenläufig verändert: %d Bytes erwartet, %d kopiert"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "konnte Positionszeiger in Quelldatei nicht setzen: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "unerwartetes EOF beim Lesen der Datei »%s«"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "konnte WAL-Eintrag bei %X/%X nicht lesen: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "konnte WAL-Eintrag bei %X/%X nicht lesen"
+
+#: parsexlog.c:108
+#, c-format
+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
+#, 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
+#, 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
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m"
+
+#: parsexlog.c:440
+#, 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"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynchronisiert einen PostgreSQL-Cluster mit einer Kopie des Clusters.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Aufruf:\n"
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal restore_command in der Zielkonfiguration zum\n"
+" Laden von WAL-Dateien aus Archiv verwenden\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=VERZ bestehendes zu modifizierendes Datenverzeichnis\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr ""
+" --source-pgdata=VERZ Quelldatenverzeichnis, mit dem synchronisiert\n"
+" werden soll\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=VERB Quellserver, mit dem synchronisiert werden soll\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run anhalten, bevor etwas geändert wird\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf\n"
+" Festplatte geschrieben sind\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress Fortschrittsmeldungen ausgeben\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf Konfiguration für Replikation schreiben\n"
+" (benötigt --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=DATEINAME angegebene Serverkonfigurationsdatei zum\n"
+" Starten des Ziel-Clusters verwenden\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug viele Debug-Meldungen ausgeben\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown unsauberen Shutdown nicht automatisch reparieren\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "keine Quelle angegeben (--source-pgdata oder --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdata und --source-server können nicht zusammen angegeben werden"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "kein Zielverzeichnis angegeben (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "kein Quellserver (--source-server) angegeben für --write-recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kann nicht von »root« ausgeführt werden"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "mit Server verbunden"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "Quell- und Ziel-Cluster sind auf der gleichen Zeitleiste"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "Server divergierten bei WAL-Position %X/%X auf Zeitleiste %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "kein Rückspulen nötig"
+
+#: pg_rewind.c:451
+#, 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:461
+#, c-format
+msgid "reading source file list"
+msgstr "lese Quelldateiliste"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "lese Zieldateiliste"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "lese WAL im Ziel-Cluster"
+
+#: pg_rewind.c:495
+#, 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:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "synchronisiere Zieldatenverzeichnis"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "Fertig!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "keine Aktion bestimmt für Datei »%s«"
+
+#: pg_rewind.c:641
+#, 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:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "erzeuge Backup-Label und aktualisiere Kontrolldatei"
+
+#: pg_rewind.c:695
+#, 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:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "Quell- und Ziel-Cluster sind von verschiedenen Systemen"
+
+#: pg_rewind.c:735
+#, 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:745
+#, 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:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "Zielserver muss sauber heruntergefahren worden sein"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "Quelldatenverzeichnis muss sauber heruntergefahren worden sein"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) kopiert"
+
+#: pg_rewind.c:941
+#, 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:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "Puffer für Backup-Label ist zu klein"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "unerwartete CRC in Kontrolldatei"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "unerwartete Kontrolldateigröße %d, erwartet wurde %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an"
+msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, 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:1068 pg_rewind.c:1138
+#, 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:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command ist im Ziel-Cluster nicht gesetzt"
+
+#: pg_rewind.c:1142
+#, 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:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "postgres im Einzelbenutzermodus im Ziel-Cluster fehlgeschlagen"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "Die Anweisung war: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "Syntaxfehler in History-Datei: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Eine numerische Zeitleisten-ID wurde erwartet."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Eine Write-Ahead-Log-Switchpoint-Position wurde erwartet."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "ungültige Daten in History-Datei: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Zeitleisten-IDs müssen in aufsteigender Folge sein."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "ungültige Daten in History-Datei"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhalten"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "Contrecord angefordert von %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, 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:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "Datensatzlänge %u bei %X/%X ist zu lang"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "keine Contrecord-Flag bei %X/%X"
+
+#: xlogreader.c:789
+#, 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:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "Contrecord fehlt bei %X/%X"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ungültige Resource-Manager-ID %u bei %X/%X"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, 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:1196
+#, 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:1230
+#, 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:1245 xlogreader.c:1287
+#, 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:1261
+#, 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:1269
+#, 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:1275
+#, 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:1307
+#, 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:1333
+#, 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:1739
+#, 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:1763
+#, 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:1770
+#, 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:1806
+#, 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:1822
+#, 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:1836
+#, 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:1851
+#, 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:1867
+#, 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:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ungültige block_id %u bei %X/%X"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "Datensatz mit ungültiger Länge bei %X/%X"
+
+#: xlogreader.c:1972
+#, 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:2056
+#, 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:2063
+#, 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:2090 xlogreader.c:2107
+#, 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:2116
+#, 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:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d"
diff --git a/src/bin/pg_rewind/po/el.po b/src/bin/pg_rewind/po/el.po
new file mode 100644
index 0000000..bea1eda
--- /dev/null
+++ b/src/bin/pg_rewind/po/el.po
@@ -0,0 +1,1022 @@
+# Greek message translation file for pg_rewind
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:21+0000\n"
+"PO-Revision-Date: 2023-08-15 15:11+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "άκυÏη τιμή για την παÏάμετÏο «%s»: «%s»"
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "Η συμβολοσειÏά τεÏματίζει απÏοσδόκητα μετά τον χαÏακτήÏα διαφυγής «%%»."
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "Η συμβολοσειÏά πεÏιέχει μη αναμενόμενο σÏμβολο αναμονής «%%%c»."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "δεν ήταν δυνατό το άνοιγμα διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "δεν ήταν δυνατή η εκχώÏηση SID: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "δεν ήταν δυνατή η εκκίνηση διεÏγασίας για την εντολή «%s»: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακÏιτικό πεÏιοÏισμοÏ: κωδικός σφάλματος %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "δεν ήταν δυνατή η απόκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¾ÏŒÎ´Î¿Ï… από την υποδιεÏγασία: κωδικός σφάλματος %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "μη αναμενόμενο μέγεθος αÏχείου για «%s»: %lld αντί για %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s» που έχει επαναφεÏθεί από την αÏχειοθήκη: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command απέτυχε: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "δεν ήταν δυνατή η επαναφοÏά του αÏχείου «%s» από την αÏχειοθήκη"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή στο αÏχείο «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία αÏχείου «%s»: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Â«%s»: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Â«%s»: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο αÏχείο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Â«%s»: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "απÏοσδιόÏιστος Ï„Ïπος αÏχείου για το «%s»"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "μη έγκυÏη ενέÏγεια (CREATE) για κανονικό αÏχείο"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση του αÏχείου «%s»: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s» για πεÏικοπή: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "δεν ήταν δυνατή η πεÏικοπή του αÏχείου «%s» σε %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση του καταλόγου «%s»: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αφαίÏεση της συμβολικής σÏνδεσης «%s»: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για ανάγνωση: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "ο συμβολικός σÏνδεσμος «%s» είναι Ï€Î¿Î»Ï Î¼Î±ÎºÏÏÏ‚"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "το αÏχείο «%s» δεν είναι ένα κανονικό αÏχείο"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "διπλότυπο αÏχείο Ï€Ïοέλευσης «%s»"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "μη αναμενόμενη Ï„Ïοποποίηση σελίδας για μη κανονικό αÏχείο «%s»"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "άγνωστος Ï„Ïπος αÏχείου για το «%s»"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "το αÏχείο «%s» είναι διαφοÏÎµÏ„Î¹ÎºÎ¿Ï Ï„Ïπου στην Ï€Ïοέλευση και τον Ï€ÏοοÏισμό"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "δεν ήταν δυνατή η λήψη του αÏχείου «%s»"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "δεν ήταν δυνατή η εκκαθάÏιση του search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes Ï€Ïέπει να είναι ενεÏγοποιημένο στο διακομιστή Ï€Ïοέλευσης"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "δεν ήταν δυνατή η Ï€Ïοετοιμασία της δήλωσης για τη λήψη πεÏιεχομένων αÏχείου: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "σφάλμα κατά την εκτέλεση εÏωτήματος (%s) στο διακομιστή Ï€Ïοέλευσης: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "μη αναμενόμενο σÏνολο αποτελεσμάτων από εÏώτημα"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "σφάλμα κατά την εκτέλεση εÏωτήματος (%s) στο διακομιστή Ï€Ïοέλευσης: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "μη αναγνωÏίσιμο αποτέλεσμα «%s» για την Ï„Ïέχουσα θέση εισαγωγής WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "δεν ήταν δυνατή η λήψη λίστας αÏχείων: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "μη αναμενόμενο σÏνολο αποτελεσμάτων κατά τη λήψη λίστας αÏχείων"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "δεν ήταν δυνατή η αποστολή εÏωτήματος: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση της σÏνδεσης libpq σε λειτουÏγία μονής σειÏάς"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "μη αναμενόμενο αποτέλεσμα κατά τη λήψη απομακÏυσμένων αÏχείων: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "έλαβε πεÏισσότεÏα τμήματα δεδομένων από όσα ζητήθηκαν"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "μη αναμενόμενο μέγεθος συνόλου αποτελεσμάτων κατά τη λήψη απομακÏυσμένων αÏχείων"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "μη αναμενόμενοι Ï„Ïποι δεδομένων στο σÏνολο αποτελεσμάτων κατά τη λήψη απομακÏυσμένων αÏχείων: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "μη αναμενόμενη μοÏφή αποτελέσματος κατά τη λήψη απομακÏυσμένων αÏχείων"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "μη αναμενόμενες τιμές null κατά τη λήψη απομακÏυσμένων αÏχείων"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "μη αναμενόμενο μήκος αποτελέσματος κατά τη λήψη απομακÏυσμένων αÏχείων"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "έλαβε δεδομένα για το αÏχείο «%s», όταν ζητήθηκε το «%s»"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "έλαβε δεδομένα σε μετατόπιση %lld του αÏχείου «%s», όταν ζητήθηκε μετατόπιση %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "έλαβε πεÏισσότεÏα από όσα ζήτησε για το αÏχείο «%s»"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "έλαβε μη αναμενόμενο αÏιθμό τμημάτων δεδομένων"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "δεν ήταν δυνατή η λήψη απομακÏυσμένου αÏχείου «%s»: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "μη αναμενόμενο σÏνολο αποτελεσμάτων κατά τη λήψη απομακÏυσμένου αÏχείου «%s»"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου Ï€Ïοέλευσης «%s»: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "το μέγεθος αÏχείου πηγής «%s» άλλαξε σÏγχÏονα: αναμένονταν %d bytes, αντιγÏάφηκαν %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο αÏχείο Ï€Ïοέλευσης: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "μη αναμενόμενο EOF κατά την ανάγνωση αÏχείου «%s»"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση επεξεÏγαστή ανάγνωσης WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "δεν ήταν δυνατή η ανάγνωση WAL εγγÏαφής στο %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "δεν ήταν δυνατή η ανάγνωση WAL εγγÏαφής στο %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "ο δείκτης τέλους %X/%X δεν είναι έγκυÏο σημείο τέλους- αναμενόταν %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "δεν ήταν δυνατή η εÏÏεση Ï€ÏοηγοÏμενης WAL εγγÏαφής σε %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "δεν ήταν δυνατή η εÏÏεση Ï€ÏοηγοÏμενης WAL εγγÏαφής σε %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αναζήτηση στο αÏχείο «%s»: %m"
+
+#: parsexlog.c:440
+#, 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 Ï„Ïοποποιεί μια σχέση, αλλά ο Ï„Ïπος εγγÏαφής δεν αναγνωÏίζεται: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s επανασυγχÏονίζει μία συστάδα PostgreSQL με ένα άλλο αντίγÏαφο της συστάδας.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"ΧÏήση:\n"
+" %s [ΕΠΙΛΟΓΗ]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal χÏησιμοποίησε restore_command στη ÏÏθμιση Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¹Î± την\n"
+" ανάκτηση αÏχείων WAL από αÏχειοθήκες\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY υπάÏχον κατάλογος δεδομένων Ï€Ïος Ï„Ïοποποιήση\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY κατάλογος δεδομένων Ï€Ïοέλευσης για συγχÏονισμό\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR διακομιστής Ï€Ïοέλευσης για συγχÏονισμό\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run τεÏματισμός Ï€Ïιν να Ï„Ïοποποιηθεί οτιδήποτε\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf εγγÏαφή των Ïυθμίσεων αναπαÏαγωγής\n"
+" (απαιτεί --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME χÏησιμοποίησε το οÏισμένο αÏχείο Ïυθμίσεων του Î²Î±ÏƒÎ¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®\n"
+" κατά την εκτέλεση συστάδας Ï€ÏοοÏισμοÏ\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug εγγÏαφή πολλών μηνÏματων ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown να μην διοÏθώνει αυτόματα ακάθαÏτο τεÏματισμό\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "δεν καθοÏίστηκε Ï€Ïοέλευση (--source-pgdata ή --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "μόνο ένα από τα --source-pgdata ή --source-server μποÏεί να καθοÏιστεί"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "δεν καθοÏίστηκε κατάλογος δεδομένων Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "δεν καθοÏίστηκαν πληÏοφοÏίες διακομιστή Ï€Ïοέλευσης (--source-server) για --write-recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "δεν είναι δυνατή η εκτέλεση από «root»"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "ΠÏέπει να εκτελέσετε %s ως υπεÏχÏήστης PostgreSQL."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "συνδεδεμένος στον διακομιστή"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "συστάδες Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ±Î¹ Ï€Ïοέλευσης βÏίσκονται στην ίδια χÏονογÏαμμή"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "οι διακομιστές αποκλίνουν στην τοποθεσία WAL %X/%X στη χÏονογÏαμμή %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "δεν απαιτείται επαναφοÏά"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "επαναφοÏά από το τελευταίο κοινό σημείο ελέγχου στο %X/%X στη χÏονογÏαμμή %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "ανάγνωση λίστας αÏχείων Ï€Ïοέλευσης"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "ανάγνωση λίστας αÏχείων Ï€ÏοοÏισμοÏ"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "ανάγνωση WAL στον Ï€ÏοοÏισμό"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "Ï€Ïέπει να αντιγÏαφοÏν %lu MB (το συνολικό μέγεθος καταλόγου Ï€Ïοέλευσης είναι %lu MB)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "συγχÏονισμός καταλόγου δεδομένων Ï€ÏοοÏισμοÏ"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "ΟλοκληÏώθηκε!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "καμία ενέÏγεια δεν αποφασίστηκε για το αÏχείο «%s»"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "το σÏστημα Ï€Ïοέλευσης Ï„Ïοποποιήθηκε κατά την εκτέλεση του pg_rewind"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "δημιουÏγία ετικέτας αντιγÏάφων ασφαλείας και ενημέÏωση αÏχείου ελέγχου"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "το σÏστημα Ï€Ïοέλευσης βÏισκόταν σε μη αναμενόμενη κατάσταση στο τέλος της επαναφοÏάς"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "οι συστάδες Ï€Ïοέλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏοέÏχονται από διαφοÏετικά συστήματα"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_rewind"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "ο διακομιστής Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Ïέπει να χÏησιμοποιεί είτε άθÏοισμα ελέγχου δεδομένων είτε «wal_log_hints = on»"
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "ο διακομιστής Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Ïέπει να τεÏματιστεί καθαÏά"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "ο κατάλογος δεδομένων Ï€Ïοέλευσης Ï€Ïέπει να τεÏματιστεί καθαÏά"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) αντιγÏάφηκαν"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "δεν ήταν δυνατή η εÏÏεση ÎºÎ¿Î¹Î½Î¿Ï Ï€Ïογόνου των χÏονογÏαμμών των συστάδων Ï€Ïοέλευσης και Ï€ÏοοÏισμοÏ"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "ενδιάμεση μνήμη ετικέτας αντιγÏάφων ασφαλείας Ï€Î¿Î»Ï Î¼Î¹ÎºÏή"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "μη αναμενόμενο αÏχείο ελέγχου CRC"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "μη αναμενόμενο μέγεθος αÏχείου ελέγχου %d, αναμένεται %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά το αÏχείο ελέγχου καθοÏίζει %d byte"
+msgstr[1] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά το αÏχείο ελέγχου καθοÏίζει %d bytes"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»"
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "η εντολή restore_command δεν έχει οÏιστεί στη συστάδα Ï€ÏοοÏισμοÏ"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "εκτέλεση «%s» για την ολοκλήÏωση της αποκατάστασης σφαλμάτων του διακομιστή Ï€ÏοοÏισμοÏ"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "λειτουÏγία μοναδικοÏ-χÏήστη postgres στο σÏμπλεγμα Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "Η εντολή ήταν: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "συντακτικό σφάλμα στο αÏχείο ιστοÏικοÏ: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Αναμένεται αÏιθμητικό ID χÏονογÏαμμής."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Αναμένεται μια θέση write-ahead log switchpoint."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "μη έγκυÏα δεδομένα στο αÏχείο ιστοÏικοÏ: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Τα IDs χÏονογÏαμμής Ï€Ïέπει να βÏίσκονται σε αυξάνουσα σειÏά."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "μη έγκυÏα δεδομένα στο αÏχείο ιστοÏικοÏ"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Τα ID χÏονογÏαμμής Ï€Ïέπει να είναι λιγότεÏα από τα ID της χÏονογÏαμμής απογόνου."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "μη έγκυÏη μετατόπιση εγγÏαφής σε %X/%X: πεÏίμενε τουλάχιστον %u, έλαβε %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord ζητείται από %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: πεÏίμενε τουλάχιστον %u, έλαβε %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "έλλειψη μνήμης κατά την Ï€Ïοσπάθεια αποκωδικοποίησης εγγÏαφής με μήκος %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "μήκος εγγÏαφής %u σε %X/%X Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "δεν υπάÏχει σημαία contrecord στο %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "μη έγκυÏο μήκος contrecord %u (αναμένεται %lld) σε %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "μη έγκυÏο ID %u διαχειÏιστή πόÏων στο %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "εγγÏαφή με εσφαλμένο prev-link %X/%X σε %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "εσφαλμένο άθÏοισμα ελέγχου δεδομένων διαχειÏιστή πόÏων σε εγγÏαφή στο %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "μη έγκυÏος μαγικός αÏιθμός %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "μη έγκυÏα info bits %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "εκτός ακολουθίας ID χÏονογÏαμμής %u (μετά %u) στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "εκτός ακολουθίας block_id %u στο %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA έχει οÏιστεί, αλλά δεν πεÏιλαμβάνονται δεδομένα σε %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA δεν έχει οÏιστεί, αλλά το μήκος των δεδομένων είναι %u σε %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE έχει οÏιστεί, αλλά οπή με μετατόπιση %u μήκος %u μήκος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE δεν έχει οÏιστεί, αλλά οπή με μετατόπιση %u μήκος %u σε %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED έχει οÏιστεί, αλλά μέγεθος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1847
+#, 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_IS_COMPRESSED είναι οÏισμένα, αλλά το μήκος της εικόνας μπλοκ είναι %u στο %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL είναι οÏισμένο, αλλά καμία Ï€ÏοηγοÏμενη rel στο %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "μη έγκυÏο block_id %u στο %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "εγγÏαφή με μη έγκυÏο μήκος στο %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ αντιγÏάφου με ID %d στην εγγÏαφή WAL"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με οÏισμένο άκυÏο μπλοκ %d"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με άκυÏη κατάσταση, μπλοκ %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με %s που δεν υποστηÏίζεται από την υλοποίηση, μπλοκ %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με άγνωστη μέθοδο, μπλοκ %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας στο %X/%X, μπλοκ %d"
+
+#~ msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+#~ msgstr "«%s» είναι ένας συμβολικός σÏνδεσμος, αλλά οι συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται σε αυτήν την πλατφόÏμα"
+
+#~ msgid "You must run %s as the PostgreSQL superuser.\n"
+#~ msgstr "ΠÏέπει να εκτελέσετε %s ως υπεÏχÏήστης PostgreSQL.\n"
+
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu"
+
+#~ msgid "cannot use restore_command with %%r placeholder"
+#~ msgstr "δεν είναι δυνατή η χÏήση restore_command μαζί με %%r placeholder"
+
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid control file"
+#~ msgstr "μη έγκυÏο αÏχείο ελέγχου"
+
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "μη έγκυÏη μετατόπιση εγγÏαφών σε %X/%X"
+
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "λείπει contrecord στο %X/%X"
diff --git a/src/bin/pg_rewind/po/es.po b/src/bin/pg_rewind/po/es.po
new file mode 100644
index 0000000..af9a810
--- /dev/null
+++ b/src/bin/pg_rewind/po/es.po
@@ -0,0 +1,1003 @@
+# Spanish message translation file for pg_rewind
+#
+# Copyright (c) 2015-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Ãlvaro Herrera <alvherre@alvh.no-ip.org>, 2015.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:22+0000\n"
+"PO-Revision-Date: 2023-10-04 11:47+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.3\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "valor no válido para el parámetro «%s»: «%s»"
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "La cadena termina inesperadamente luego del carácter de escape: «%%»"
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "La cadena contiene la secuencia de reemplazo inesperada «%c»."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "no se pudo abrir el token de proceso: código de error %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "no se pudo emplazar los SIDs: código de error %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "no se pudo crear el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "el archivo «%s» tiene tamaño inesperado: %lld en lugar de %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "no se pudo abrir el archivo «%s» restaurado del archivo: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command falló: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "no se pudo recuperar el archivo «%s» del archivo"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "no se pudo escribir a archivo «%s»: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "no se pudo crear archivo «%s»: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de destino «%s»: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo de destino «%s»: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "no se pudo posicionar en archivo de destino «%s»: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "tipo de archivo no definido para «%s»"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "acción no válida (CREATE) para archivo regular"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "no se pudo eliminar el archivo «%s»: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "no se pudo abrir el archivo «%s» para truncarlo: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "no se pudo truncar el archivo «%s» a %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "no se pudo eliminar el directorio «%s»: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "no se pudo crear el link simbólico en «%s»: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "no se pudo eliminar el enlace simbólico «%s»: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "no se pudo abrir archivo «%s» para lectura: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "no se pudo leer el enlace simbólico «%s»: %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "la ruta «%s» del enlace simbólico es demasiado larga"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "no se pudo leer el directorio «%s»: %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "el archivo de datos «%s» en el origen no es un archivo regular"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "archivo origen duplicado «%s»"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "modificación de página inesperada para el archivo no regular «%s»"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "tipo de archivo desconocido para «%s»"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "el archivo «%s» tiene un tipo diferente en el origen y en el destino"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "no se pudo decidir qué hacer con el archivo «%s»"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "no se pudo limpiar search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes debe estar activado en el servidor de origen"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "no se pudo preparar sentencia para obtener el contenido del archivo: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "error ejecutando consulta (%s) en el servidor de origen: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "conjunto de resultados inesperados de la consulta"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "error ejecutando consulta (%s) en el servidor de origen: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "resultado «%s» no reconocido para la ubicación de inserción WAL actual"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "no se pudo obtener el listado de archivos: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "conjunto de resultados inesperado mientras se obtenía el listado de archivos"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "no se pudo enviar la consulta: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "no se pudo establecer la coneción libpq a modo «single row»"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "resultados inesperados mientras se obtenían archivos remotos: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "se recibieron más trozos de datos que los solicitados"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "tamaño del conjunto de resultados inesperado mientras se obtenían archivos remotos"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "tipos de dato inesperados en el conjunto de resultados mientras se obtenían archivos remotos: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "formato de resultados inesperado mientras se obtenían archivos remotos"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "valores nulos inesperados en el resultado mientras se obtenían archivos remotos"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "largo del resultado inesperado mientras se obtenían los archivos remotos"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "se recibieron datos para el archivo «%s», cuando se solicitó para «%s»"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "se recibieron datos en la posición %lld del archivo «%s», cuando se solicitó para la posición %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "se recibió más de lo solicitado para el archivo «%s»"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "se recibió un número inesperado de trozos de datos"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "no se pudo obtener el archivo remoto «%s»: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "conjunto de resultados inesperado mientras se obtenía el archivo remoto «%s»"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de origen «%s»: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "el tamaño del archivo de origen «%s» cambió concurrentemente: se esperaban %d bytes, se copiaron %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "no se pudo posicionar en archivo de origen: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "EOF inesperado mientras se leía el archivo «%s»"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "memoria agotada mientras se emplazaba un procesador de lectura de WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "no se pudo leer el registro WAL en %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "no se pudo leer el registro WAL en %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "el puntero de término %X/%X no es un punto válido; se esperaba %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "no se pudo encontrar el registro WAL anterior en %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "no se pudo encontrar el registro WAL anterior en %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "no se pudo posicionar (seek) el archivo «%s»: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "el registro WAL modifica una relación, pero el tipo de registro no es reconocido: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resincroniza un cluster PostgreSQL con otra copia del cluster.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Empleo:\n"
+" %s [OPCION]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal utilizar restore_command de la configuración\n"
+" de destino para obtener archivos WAL\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORIO directorio de datos existente a modificar\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORIO directorio de datos de origen a sincronizar\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONN servidor de origen a sincronizar\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run detener antes de modificar nada\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress escribir mensajes de progreso\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf escribe configuración para replicación\n"
+" (requiere --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=ARCHIVO utilizar el archivo de configuración del servidor\n"
+" principal especificado al ejecutar el clúster de destino\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug escribir muchos mensajes de depuración\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown no corregir automáticamente un apagado\n"
+" no-limpio\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "no se especificó origen (--source-pgdata o --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "sólo uno de --source-pgdata o --source-server puede ser especificado"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "no se especificó directorio de datos de destino (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "no se especificó información de servidor de origen (--source-server) para --write-recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "no puede ser ejecutado por «root»"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Debe ejecutar %s con el superusuario de PostgreSQL."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "conectado al servidor"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "el cluster de origen y destino están en el mismo timeline"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "servidores divergieron en la posición de WAL %X/%X en el timeline %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "no se requiere rebobinar"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "rebobinando desde el último checkpoint común en %X/%X en el timeline %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "leyendo la lista de archivos de origen"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "leyendo la lista de archivos de destino"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "leyendo WAL en destino"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "se necesitan copiar %lu MB (tamaño total de directorio de origen es %lu MB)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "sincronizando directorio de datos de destino"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "¡Listo!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "no se decidió una acción para el archivo «%s»"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "el sistema origen fue modificado mientras pg_rewind estaba en ejecución"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "creando etiqueta de respaldo y actualizando archivo de control"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "el sistema origen estaba en un estado inesperado al final del rebobinado"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "clusters de origen y destino son de sistemas diferentes"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "los clusters no son compatibles con esta versión de pg_rewind"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "el servidor de destino necesita tener sumas de verificación de datos o «wal_log_hints» activados"
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "el directorio de destino debe estar apagado limpiamente"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "el directorio de origen debe estar apagado limpiamente"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) copiados"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "no se pudo encontrar un ancestro común en el timeline de los clusters de origen y destino"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "el búfer del backup label es demasiado pequeño"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "CRC de archivo de control inesperado"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "tamaño del archivo de control %d inesperado, se esperaba %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d byte"
+msgstr[1] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d bytes"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s, pero no se encontró en el mismo directorio que «%s»"
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "el programa «%s» fue encontrado por «%s» pero no es de la misma versión que %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command no está definido en el clúster de destino"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "ejecutando «%s» en el servidor de destino para completar la recuperación de caídas"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "el modo «single-user» en el servidor de destino falló"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "La orden era: % s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "error de sintaxis en archivo de historia: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Se esperaba un ID numérico de timeline."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Se esperaba una ubicación de punto de cambio del «write-ahead log»."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "datos no válidos en archivo de historia: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "IDs de timeline deben ser una secuencia creciente."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "datos no válidos en archivo de historia"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "IDs de timeline deben ser menores que el ID de timeline del hijo."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "desplazamiento de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord solicitado por %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "largo de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "largo de registro %u en %X/%X demasiado largo"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "no hay bandera de contrecord en %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X"
+
+#: xlogreader.c:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "falta un contrecord en %X/%X"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID de gestor de recursos %u no válido en %X/%X"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "registro con prev-link %X/%X incorrecto en %X/%X"
+
+#: xlogreader.c:1196
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X"
+
+#: xlogreader.c:1230
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "número mágico %04X no válido en segmento WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1245 xlogreader.c:1287
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "info bits %04X no válidos en segment WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1261
+#, 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 "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu"
+
+#: xlogreader.c:1269
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1275
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1307
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "pageaddr %X/%X inesperado en segmento WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1333
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ID de timeline %u fuera de secuencia (después de %u) en segmento WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1739
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u fuera de orden en %X/%X"
+
+#: xlogreader.c:1763
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X"
+
+#: xlogreader.c:1770
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X"
+
+#: xlogreader.c:1806
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X"
+
+#: xlogreader.c:1822
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X"
+
+#: xlogreader.c:1836
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1851
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1867
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X "
+
+#: xlogreader.c:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u no válido en %X/%X"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "registro con largo no válido en %X/%X"
+
+#: xlogreader.c:1972
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL"
+
+#: xlogreader.c:2056
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "no se pudo restaurar la imagen en %X/%X con bloque especificado %d no válido"
+
+#: xlogreader.c:2063
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "no se pudo restaurar la imagen en %X/%X con estado no válido, bloque %d"
+
+#: xlogreader.c:2090 xlogreader.c:2107
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "no se pudo restaurar la imagen en %X/%X comprimida con %s que no está soportado por esta instalación, bloque %d"
+
+#: xlogreader.c:2116
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "no se pudo restaurar la imagen en %X/%X comprimida con un método desconocido, bloque %d"
+
+#: xlogreader.c:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "no se pudo descomprimir la imagen en %X/%X, bloque %d"
diff --git a/src/bin/pg_rewind/po/fr.po b/src/bin/pg_rewind/po/fr.po
new file mode 100644
index 0000000..d83beaa
--- /dev/null
+++ b/src/bin/pg_rewind/po/fr.po
@@ -0,0 +1,1312 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2016-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2016-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:21+0000\n"
+"PO-Revision-Date: 2023-09-05 07:49+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "valeur invalide pour le paramètre « %s » : « %s »"
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "La chaîne se termine de façon inattendue après le caractère d'échappement : « %% »"
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "La chaîne contient un joker inattendu « %%%c »."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "n'a pas pu allouer les SID : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "taille de fichier inattendu pour « %s » : %lld au lieu de %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » à partir de l'archive : %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "échec de la restore_command : %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "n'a pas pu écrire dans le fichier « %s » : %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "n'a pas pu créer le fichier « %s » : %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier cible « %s » : %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier cible « %s » : %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "n'a pas pu chercher dans le fichier cible « %s » : %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "type de fichier non défini pour « %s »"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "action (CREATE) invalide pour le fichier régulier"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "n'a pas pu supprimer le fichier « %s » : %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour le troncage : %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "n'a pas pu tronquer le fichier « %s » en %u : %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "n'a pas pu supprimer le répertoire « %s » : %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "n'a pas pu créer le lien symbolique à « %s » : %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "la cible du lien symbolique « %s » est trop longue"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "n'a pas pu lire le répertoire « %s » : %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "le fichier de données « %s » en source n'est pas un fichier standard"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "fichier source « %s » dupliqué"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "modification inattendue de page pour le fichier non standard « %s »"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "type de fichier inconnu pour « %s »"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "le fichier « %s » a un type différent pour la source et la cible"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "n'a pas pu décider que faire avec le fichier « %s » : %m"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "n'a pas pu effacer search_path : %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes doit être activé sur le serveur source"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "n'a pas pu préparer l'instruction pour récupérer le contenu du fichier : %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "erreur lors de l'exécution de la requête (%s) sur le serveur source : %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "ensemble de résultats inattendu provenant de la requête"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "erreur lors de l'exécution de la requête (%s) dans le serveur source : %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "résultat non reconnu « %s » pour l'emplacement d'insertion actuel dans les WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "n'a pas pu récupérer la liste des fichiers : %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "ensemble de résultats inattendu lors de la récupération de la liste des fichiers"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "n'a pas pu envoyer la requête : %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "n'a pas pu configurer la connexion libpq en mode ligne seule"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "résultat inattendu lors de la récupération des fichiers cibles : %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "a reçu plus de morceaux de données que demandé"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "taille inattendue de l'ensemble de résultats lors de la récupération des fichiers distants"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "types de données inattendus dans l'ensemble de résultats lors de la récupération des fichiers distants : %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "format de résultat inattendu lors de la récupération des fichiers distants"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "valeurs NULL inattendues dans le résultat lors de la récupération des fichiers distants"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "longueur de résultats inattendu lors de la récupération des fichiers distants"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "a reçu des données du fichier « %s » alors que « %s » était demandé"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "a reçu des données au décalage %lld du fichier « %s » alors que le décalage %lld était demandé"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "a reçu plus que demandé pour le fichier « %s »"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "nombre de morceaux de données reçus inattendu"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "n'a pas pu récupérer le fichier distant « %s » : %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "ensemble de résultats inattendu lors de la récupération du fichier distant « %s »"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier source « %s » : %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "la taille du fichier source « %s » a changé : %d octets attendus, %d copiés"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "n'a pas pu chercher dans le fichier source : %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "EOF inattendu lors de la lecture du fichier « %s »"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "manque mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "n'a pas pu lire l'enregistrement WAL précédent à %X/%X : %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "n'a pas pu lire l'enregistrement WAL précédent à %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "le pointeur de fin %X/%X n'est pas un pointeur de fin valide ; %X/%X attendu"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "n'a pas pu trouver l'enregistrement WAL précédent à %X/%X : %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "n'a pas pu trouver l'enregistrement WAL précédent à %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "n'a pas pu parcourir le fichier « %s » : %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "l'enregistrement WAL modifie une relation mais le type d'enregistrement n'est pas reconnu : lsn : %X/%X, rmid : %d, rmgr : %s, info : %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynchronise une instance PostgreSQL avec une autre copie de\n"
+"l'instance.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Usage :\n"
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal utilise restore_command pour la configuration\n"
+" cible de récupération des fichiers WAL des\n"
+" archives\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=RÉPERTOIRE répertoire de données existant à modifier\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=RÉPERTOIRE répertoire des données source\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CHAÃŽNE serveur source pour la synchronisation\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run arrête avant de modifier quoi que ce soit\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress écrit les messages de progression\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf écrit la configuration pour la réplication\n"
+" (requiert --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=NOMFICHIER utilise le fichier de configuration indiqué\n"
+" du serveur principal lors de l'exécution de\n"
+" l'instance cible\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug écrit beaucoup de messages de débogage\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown ne corrige pas automatiquement l'arrêt non\n"
+" propre\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "aucune source indiquée (--source-pgdata ou --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "une seule des options --source-pgdata et --source-server peut être indiquée"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "aucun répertoire de données cible indiqué (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "aucune information sur le serveur source (--source-server) indiquée pour --write-recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "ne peut pas être exécuté par « root »"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "connecté au serveur"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "les instances source et cible sont sur la même ligne de temps"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "les serveurs ont divergé à la position %X/%X des WAL sur la timeline %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "pas de retour en arrière requis"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "retour en arrière depuis le dernier checkpoint commun à %X/%X sur la ligne de temps %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "lecture de la liste des fichiers sources"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "lecture de la liste des fichiers cibles"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "lecture du WAL dans la cible"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "a besoin de copier %lu Mo (la taille totale du répertoire source est %lu Mo)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "synchronisation du répertoire des données cible"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "Terminé !"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "aucune action décidée pour le fichier « %s »"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "le système source a été modifié alors que pg_rewind était en cours d'exécution"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "création du fichier backup_label et mise à jour du fichier contrôle"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "le système source était dans un état inattendu en fin de rewind"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "les instances source et cible proviennent de systèmes différents"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "les instances ne sont pas compatibles avec cette version de pg_rewind"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "le serveur cible doit soit utiliser les sommes de contrôle sur les données soit avoir wal_log_hints configuré à on"
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "le serveur cible doit être arrêté proprement"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "le répertoire de données source doit être arrêté proprement"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s Ko (%d%%) copiés"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "n'a pas pu trouver l'ancêtre commun des lignes de temps des instances source et cible"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "tampon du label de sauvegarde trop petit"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "CRC inattendu pour le fichier de contrôle"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "taille %d inattendue du fichier de contrôle, %d attendu"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet"
+msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command n'est pas configuré sur l'instance cible"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "exécution de « %s » pour terminer la restauration après crash du serveur cible"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "le mot simple-utilisateur de postgres a échoué pour l'instance cible"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "La commande était : %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "erreur de syntaxe dans le fichier historique : %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Attendait un identifiant timeline numérique."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Attendait un emplacement de bascule de journal de transactions."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "données invalides dans le fichier historique : %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Les identifiants timeline doivent être en ordre croissant."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "données invalides dans le fichier historique"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr ""
+"Les identifiants timeline doivent être plus petits que les enfants des\n"
+"identifiants timeline."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "décalage invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "« contrecord » est requis par %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "longueur invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "longueur trop importante de l'enregistrement %u à %X/%X"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "il n'existe pas de drapeau contrecord à %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"somme de contrôle des données du gestionnaire de ressources incorrecte à\n"
+"l'enregistrement %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "numéro magique invalide %04X dans le segment WAL %s, LSN %X/%X, décalage %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "bits d'information %04X invalides dans le segment WAL %s, LSN %X/%X, décalage %u"
+
+#: xlogreader.c:1257
+#, 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 "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu"
+
+#: xlogreader.c:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, LSN %X/%X, segment %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment WAL %s, LSN %X/%X, décalage %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u désordonné à %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u invalide à %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "enregistrement de longueur invalide à %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " block %u\n"
+#~ msgstr " bloc %u\n"
+
+#, c-format
+#~ msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+#~ msgstr "« %s » est un lien symbolique mais les liens symboliques ne sont pas supportés sur cette plateforme"
+
+#~ msgid "\"%s\" is not a directory"
+#~ msgstr "« %s » n'est pas un répertoire"
+
+#~ msgid "\"%s\" is not a regular file"
+#~ msgstr "« %s » n'est pas un fichier standard"
+
+#~ msgid "\"%s\" is not a symbolic link"
+#~ msgstr "« %s » n'est pas un lien symbolique"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d : %X/%X - %X/%X\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n"
+
+#~ msgid "%s: could not allocate SIDs: error code %lu\n"
+#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n"
+
+#~ msgid "%s: could not create restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not get exit code from subprocess: error code %lu\n"
+#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n"
+
+#~ msgid "%s: could not re-execute with restricted token: error code %lu\n"
+#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not start process for command \"%s\": error code %lu\n"
+#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "Expected a numeric timeline ID.\n"
+#~ msgstr "Attendait un identifiant numérique de ligne de temps.\n"
+
+#~ msgid "Expected a write-ahead log switchpoint location.\n"
+#~ msgstr "Attendait un emplacement de bascule de journal de transactions.\n"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Échec, sortie\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "Historique de la ligne de temps source :\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "Historique de la ligne de temps cible :\n"
+
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n"
+#~ "dans le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\" but was\n"
+#~ "not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « %s » a été trouvé par « %s » mais n'était pas de la même version\n"
+#~ "que %s.\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"initdb\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « initdb » est nécessaire pour %s, mais n'a pas été trouvé\n"
+#~ "dans le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation.\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Le programme « initdb » a été trouvé par « %s », mais n'est pas de la même version\n"
+#~ "que %s.\n"
+#~ "Vérifiez votre installation.\n"
+
+#~ msgid ""
+#~ "The program \"postgres\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n"
+#~ "le même répertoire que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid ""
+#~ "The program \"postgres\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n"
+#~ "version que « %s ».\n"
+#~ "Vérifiez votre installation."
+
+#~ msgid "Timeline IDs must be in increasing sequence.\n"
+#~ msgstr "Les identifiants de ligne de temps doivent être dans une séquence croissante.\n"
+
+#~ msgid "Timeline IDs must be less than child timeline's ID.\n"
+#~ msgstr "Les identifiants de ligne de temps doivent être inférieurs à l'identifiant de la ligne de temps enfant.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header"
+#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page"
+
+#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n"
+#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n"
+#~ msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet\n"
+#~ msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets\n"
+
+#, c-format
+#~ msgid "You must run %s as the PostgreSQL superuser.\n"
+#~ msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL.\n"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu"
+
+#, c-format
+#~ msgid "cannot use restore_command with %%r placeholder"
+#~ msgstr "ne peut pas utiliser restore_command avec le joker %%r"
+
+#~ msgid "could not close directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n"
+
+#~ msgid "could not close file \"%s\": %s\n"
+#~ msgstr "n'a pas pu fermer le fichier « %s » : %s\n"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "n'a pas pu se connecter au serveur : %s"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n"
+
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "n'a pas pu créer la table temporaire : %s"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "could not open file \"%s\" for reading: %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n"
+
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n"
+
+#~ msgid "could not read file \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n"
+
+#~ msgid "could not read symbolic link \"%s\": %s\n"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %s\n"
+
+#~ msgid "could not remove directory \"%s\": %s\n"
+#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %s\n"
+
+#~ msgid "could not remove file \"%s\": %s\n"
+#~ msgstr "n'a pas pu supprimer le fichier « %s » : %s\n"
+
+#~ msgid "could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "n'a pas pu supprimer le lien symbolique « %s » : %s\n"
+
+#~ msgid "could not seek in file \"%s\": %s\n"
+#~ msgstr "n'a pas pu chercher dans le fichier « %s » : %s\n"
+
+#~ msgid "could not send COPY data: %s"
+#~ msgstr "n'a pas pu envoyer les données COPY : %s"
+
+#~ msgid "could not send end-of-COPY: %s"
+#~ msgstr "n'a pas pu envoyer end-of-COPY : %s"
+
+#~ msgid "could not send file list: %s"
+#~ msgstr "n'a pas pu envoyer la liste de fichiers : %s"
+
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "n'a pas pu initialiser le contexte de connexion : « %s »"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n"
+
+#~ msgid "could not truncate file \"%s\" to %u: %s\n"
+#~ msgstr "n'a pas pu tronquer le fichier « %s » à %u : %s\n"
+
+#~ msgid "could not write file \"%s\": %s\n"
+#~ msgstr "n'a pas pu écrire le fichier « %s » : %s\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "enregistrement « %s » exclus de la liste des fichiers sources\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "enregistrement « %s » exclus de la liste des fichiers cibles\n"
+
+#, c-format
+#~ msgid "failed to locate backup block with ID %d in WAL record"
+#~ msgstr "échec de localisation du bloc de sauvegarde d'ID %d dans l'enregistrement WAL"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "fichier récupéré « %s », longueur %d\n"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "récupération des parties de fichier\n"
+
+#, c-format
+#~ msgid "image at %X/%X compressed with %s not supported by build, block %d"
+#~ msgstr "image à %X/%X compressé avec %s, non supporté, bloc %d"
+
+#, c-format
+#~ msgid "image at %X/%X compressed with unknown method, block %d"
+#~ msgstr "image à %X/%X compressé avec une méthode inconnue, bloc %d"
+
+#, c-format
+#~ msgid "invalid compressed image at %X/%X, block %d"
+#~ msgstr "image compressée invalide à %X/%X, bloc %d"
+
+#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u"
+#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u"
+
+#, c-format
+#~ msgid "invalid control file"
+#~ msgstr "fichier de contrôle invalide"
+
+#~ msgid "invalid data in history file: %s\n"
+#~ msgstr "données invalides dans le fichier historique : %s\n"
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "décalage invalide de l'enregistrement %X/%X"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "contrecord manquant à %X/%X"
+
+#~ msgid "received data at offset "
+#~ msgstr "a reçu des données au décalage "
+
+#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr "a reçu une valeur NULL pour une partie du fichier « %s », le fichier a été supprimé\n"
+
+#~ msgid "source file list is empty"
+#~ msgstr "la liste de fichiers sources est vide"
+
+#~ msgid "source server must not be in recovery mode"
+#~ msgstr "le serveur source ne doit pas être en mode restauration"
+
+#~ msgid "symbolic link \"%s\" target is too long\n"
+#~ msgstr "la cible du lien symbolique « %s » est trop long\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "échec de la synchronisation du répertoire cible\n"
+
+#~ msgid "syntax error in history file: %s\n"
+#~ msgstr "erreur de syntaxe dans le fichier historique : %s\n"
+
+#~ msgid "there is no contrecord flag at %X/%X reading %X/%X"
+#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X"
+
+#~ msgid "unexpected result while sending file list: %s"
+#~ msgstr "résultat inattendu lors de l'envoi de la liste de fichiers : %s"
diff --git a/src/bin/pg_rewind/po/it.po b/src/bin/pg_rewind/po/it.po
new file mode 100644
index 0000000..0a1c3d4
--- /dev/null
+++ b/src/bin/pg_rewind/po/it.po
@@ -0,0 +1,1190 @@
+#
+# pg_rewind.po
+# Italian message translation file for pg_rewind
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:20+0000\n"
+"PO-Revision-Date: 2023-09-05 08:23+0200\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "impossibile caricare la libreria \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "impossibile creare token con restrizioni su questa piattaforma: codice di errore %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "impossibile aprire il token di processo: codice di errore %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "impossibile allocare i SID: codice di errore %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "impossibile creare token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "impossibile avviare il processo per il comando \"%s\": codice di errore %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "impossibile rieseguire con token limitato: codice di errore %lu"
+
+#: ../../common/restricted_token.c:193
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "impossibile ottenere il codice di uscita dal processo secondario: codice di errore %lu"
+
+#: ../../fe_utils/archive.c:52
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "impossibile utilizzare restore_command con %%r segnaposto"
+
+#: ../../fe_utils/archive.c:70
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "dimensione file imprevista per \"%s\": %lld invece di %lld"
+
+#: ../../fe_utils/archive.c:78
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "impossibile aprire il file \"%s\" ripristinato dall'archivio: %m"
+
+#: ../../fe_utils/archive.c:87 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: ../../fe_utils/archive.c:99
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command non riuscito: %s"
+
+#: ../../fe_utils/archive.c:106
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "impossibile ripristinare il file \"%s\" dall'archivio"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "creazione del file \"%s\" fallita: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "impossibile aprire il file di destinazione \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "impossibile chiudere il file di destinazione \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "impossibile cercare nel file di destinazione \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "scrittura nel file \"%s\" fallita: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "tipo di file non definito per \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "azione non valida (CREA) per il file normale"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "rimozione del file \"%s\" fallita: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "impossibile aprire il file \"%s\" per il troncamento: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "troncamento del file \"%s\" a %u fallito: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "creazione della directory \"%s\" fallita: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "rimozione della directory \"%s\" fallita: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "impossibile creare un collegamento simbolico in \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "rimozione del link simbolico \"%s\" fallita: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "apertura del file \"%s\" in lettura fallita: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "lettura del file \"%s\" fallita: letti %d di %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "la destinazione del link simbolico \"%s\" è troppo lunga"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\" è un collegamento simbolico, ma i collegamenti simbolici non sono supportati su questa piattaforma"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "lettura della directory \"%s\" fallita: %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "il file di dati \"%s\" nel codice sorgente non è un file normale"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "file di origine duplicato \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "modifica imprevista della pagina per il file non regolare \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "tipo di file sconosciuto per \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "il file \"%s\" è di tipo diverso in origine e destinazione"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "non riuscivo a decidere cosa fare con il file \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "pulizia del search_path fallita: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes dev'essere abilitato nel server di origine"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "non è possibile analizzare il contenuto del file \"%s\""
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "errore nell'esecuzione della query (%s) nel server di origine: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "risultato imprevisto dalla query"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "errore nell'esecuzione della query (%s) nel server di origine: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "risultato non riconosciuto \"%s\" per la posizione di inserimento WAL corrente"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "ricezione della lista dei file fallita: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "risultato imprevisto ricevendo la lista dei file"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "invio della query non riuscito: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "impossibile impostare la connessione libpq in modalità riga singola"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "risultato imprevisto ricevendo i file remoti: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "richiesta di arresto immediate ricevuta"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "dimensione del risultato imprevisto ricevendo i file remoti"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "tipo di dati imprevisto nel risultato ricevendo i file remoti: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "formato del risultato imprevisto ricevendo i file remoti"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "valori null non previsti nel risultato ricevendo i file remoti"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "lunghezza del risultato non prevista ricevendo i file remoti"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "dati ricevuti per il file \"%s\", quando richiesto per \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "dati ricevuti all'offset %lld del file \"%s\", quando richiesto per l'offset %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "ricevuto più di quanto richiesto per il file \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "numero imprevisto di blocchi di dati ricevuti"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "ricezione del file remoto \"%s\" fallita: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "set di risultati imprevisti durante il recupero del file remoto \"%s\""
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "impossibile aprire il file sorgente \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "dimensione del file di origine \"%s\" modificata contemporaneamente: %d byte previsti, %d copiati"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "impossibile cercare nel file di origine: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "EOF imprevisto durante la lettura del file \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "Errore nell'allocazione di un processore di lettura del WAL."
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "lettura del record WAL a %X/%X fallita: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "lettura del record WAL a %X/%X fallita"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "il puntatore finale %X/%X non è un punto finale valido; previsto %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "impossibile trovare il record WAL precedente a %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "impossibile trovare il record WAL precedente a %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "spostamento nel file \"%s\" fallito: %m"
+
+#: parsexlog.c:440
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+msgstr "Il record WAL modifica una relazione, ma il tipo di record non viene riconosciuto: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:86
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s risincronizza un cluster PostgreSQL con un'altra copia del cluster.\n"
+"\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Utilizzo:\n"
+" %s [OPZIONE]...\n"
+"\n"
+
+#: pg_rewind.c:88
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal usa restore_command nella configurazione di destinazione in\n"
+" recuperare i file WAL dagli archivi\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY directory dati esistente da modificare\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY directory dati di partenza con cui sincronizzare\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR server di origine con cui sincronizzare\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run fermati prima di modificare qualunque cosa\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync non aspettare che i dati siano scritti con sicurezza\n"
+" sul disco\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress stampa messaggi di avanzamento\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf configurazione di scrittura per la replica\n"
+" (richiede --source-server)\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME utilizza la configurazione del server principale specificata\n"
+" file durante l'esecuzione del cluster di destinazione\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug stampa una gran quantità di messaggi di debug\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown non corregge automaticamente l'arresto non pulito\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version stampa informazioni sulla versione ed esci\n"
+
+#: pg_rewind.c:105
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_rewind.c:107
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237
+#: pg_rewind.c:244 pg_rewind.c:252
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_rewind.c:222
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "nessuna fonte specificata (--source-pgdata o --source-server)"
+
+#: pg_rewind.c:229
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "può essere specificato solo uno tra --source-pgdata o --source-server"
+
+#: pg_rewind.c:236
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "nessuna directory dei dati di destinazione specificata (--target-pgdata)"
+
+#: pg_rewind.c:243
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "nessuna informazione sul server di origine (--source-server) specificata per --write-recovery-conf"
+
+#: pg_rewind.c:250
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_rewind.c:265
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "non può essere eseguito da \"root\""
+
+#: pg_rewind.c:266
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "È obbligatorio eseguire %s come superutente di PostgreSQL."
+
+#: pg_rewind.c:276
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "lettura dei permessi della directory \"%s\" fallita: %m"
+
+#: pg_rewind.c:294
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:297
+#, c-format
+msgid "connected to server"
+msgstr "connesso al server"
+
+#: pg_rewind.c:344
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "i cluster di origine e di destinazione sono sulla stessa linea temporale"
+
+#: pg_rewind.c:353
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "i server sono andati a divergere alla posizione WAL %X/%X sulla timeline %u"
+
+#: pg_rewind.c:401
+#, c-format
+msgid "no rewind required"
+msgstr "rewind non richiesto"
+
+#: pg_rewind.c:410
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "riavvolgimento dall'ultimo checkpoint comune a %X/%X sulla timeline %u"
+
+#: pg_rewind.c:420
+#, c-format
+msgid "reading source file list"
+msgstr "lettura della lista dei file di origine"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "reading target file list"
+msgstr "lettura della lista dei file di destinazione"
+
+#: pg_rewind.c:433
+#, c-format
+msgid "reading WAL in target"
+msgstr "lettura del WAL nella destinazione"
+
+#: pg_rewind.c:454
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "è necessario copiare %lu MB (la dimensione totale della directory di origine è di %lu MB)"
+
+#: pg_rewind.c:472
+#, c-format
+msgid "syncing target data directory"
+msgstr "sincronizzazione della directory dati di destinazione"
+
+#: pg_rewind.c:488
+#, c-format
+msgid "Done!"
+msgstr "Fatto!"
+
+#: pg_rewind.c:568
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "nessuna azione decisa per il file \"%s\""
+
+#: pg_rewind.c:600
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "il sistema sorgente è stato modificato mentre pg_rewind era in esecuzione"
+
+#: pg_rewind.c:604
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "creazione dell'etichetta di backup e aggiornamento del file di controllo"
+
+#: pg_rewind.c:654
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "il sistema di origine era in uno stato imprevisto al termine del riavvolgimento"
+
+#: pg_rewind.c:685
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "i cluster di origine e di destinazione sono di sistemi diversi"
+
+#: pg_rewind.c:693
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "i cluster non sono compatibili con questa versione di pg_rewind"
+
+#: pg_rewind.c:703
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "il server di destinazione deve utilizzare i checksum dei dati o \"wal_log_hints = on\""
+
+#: pg_rewind.c:714
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "il server di destinazione deve essere spento in modo pulito"
+
+#: pg_rewind.c:724
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "la directory dei dati di origine deve essere chiusa in modo pulito"
+
+#: pg_rewind.c:771
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) copiati"
+
+#: pg_rewind.c:834
+#, c-format
+msgid "invalid control file"
+msgstr "file di controllo non valido"
+
+#: pg_rewind.c:918
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "non è stato possibile trovare l'antenato comune delle linee temporali del cluster di origine e di destinazione"
+
+#: pg_rewind.c:959
+#, c-format
+msgid "backup label buffer too small"
+msgstr "buffer dell'etichetta di backup troppo piccolo"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "file di controllo imprevisto CRC"
+
+#: pg_rewind.c:994
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "dimensione del file di controllo imprevista %d, prevista %d"
+
+#: pg_rewind.c:1003
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "la dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte"
+msgstr[1] "la dimensione del segmento WAL dev'essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte"
+
+#: pg_rewind.c:1042 pg_rewind.c:1112
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: pg_rewind.c:1045 pg_rewind.c:1115
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: pg_rewind.c:1078
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command non è impostato nel cluster di destinazione"
+
+#: pg_rewind.c:1119
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "eseguendo \"%s\" per il server di destinazione per completare il ripristino del crash"
+
+#: pg_rewind.c:1156
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "modalità utente singolo postgres nel cluster di destinazione non riuscita"
+
+#: pg_rewind.c:1157
+#, c-format
+msgid "Command was: %s"
+msgstr "Il comando era: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "errore di sintassi nel file dello storico: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "L'ID della timeline deve essere numerico."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Attesa una locazione di switchpoint del log write-ahead."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "dati non validi nel file dello storico: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Gli ID della timeline devono essere in ordine crescente."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "dati non validi nel file della cronologia"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Gli ID della timeline devono avere valori inferiori degli ID della timeline figlia."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "offset del record non valido a %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord richiesto da %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "lunghezza del record a %X/%X non valida: attesa %u, ricevuta %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria insufficiente durante il tentativo di decodificare un record di lunghezza %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "lunghezza del record %u a %X/%X eccessiva"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "non c'è un flag di contrecord a %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "lunghezza contrada non valida %u (prevista %lld) a %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "record mancante a %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID di gestione risorse %u non valido a %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "record con link-precedente %X/%X non corretto a %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "checksum dei dati del manager di risorse non corretto nel record a %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "numero magico %04X non valido nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bit di info %04X non validi nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1260
+#, 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 "Il file WAL proviene da un sistema di database diverso: l'identificatore del sistema del database del file WAL è %llu, l'identificatore del sistema del database pg_control è %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "il file WAL è di un database diverso: dimensione del segmento errata nell'header della pagina"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "il file WAL è di un database diverso: XLOG_BLCKSZ non corretto nell'header di pagina"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr inaspettato %X/%X nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ID della timeline %u (dopo %u) fuori sequenza nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id fuori sequenza %u a %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA impostato, ma dati non inclusi a %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non impostato, ma la lunghezza dei dati è %u a %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE impostato, ma offset buco %u lunghezza %u lunghezza dell'immagine del blocco %u a %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE non impostato, ma offset buco %u lunghezza %u a %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED impostato, ma blocca la lunghezza dell'immagine %u a %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "né BKPIMAGE_HAS_HOLE né BKPIMAGE_COMPRESSED impostati, ma la lunghezza dell'immagine del blocco è %u a %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL impostato ma non c'è un rel precedente a %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u non valido a %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "record con lunghezza non valida a %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "impossibile individuare il blocco di backup con ID %d nel record WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "impossibile ripristinare l'immagine in %X/%X con il blocco %d non valido specificato"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X con stato non valido, blocco %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con %s non supportata da build, blocco %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con metodo sconosciuto, blocco %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "impossibile decomprimere l'immagine in %X/%X, blocco %d"
+
+#~ msgid " block %u\n"
+#~ msgstr " blocco %u\n"
+
+#~ msgid "\"%s\" is not a directory\n"
+#~ msgstr "\"%s\" non è una directory\n"
+
+#~ msgid "\"%s\" is not a regular file\n"
+#~ msgstr "\"%s\" non è un file regolare\n"
+
+#~ msgid "\"%s\" is not a symbolic link\n"
+#~ msgstr "\"%s\" non è un link simbolico\n"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d: %X/%X - %X/%X\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: lettura dei permessi della directory \"%s\" fallita: %s\n"
+
+#~ msgid "Expected a numeric timeline ID.\n"
+#~ msgstr "Atteso un ID numerico di timeline.\n"
+
+#~ msgid "Expected a write-ahead log switchpoint location.\n"
+#~ msgstr "Attesa una locazione di switchpoint del log write-ahead.\n"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Errore, uscita\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "Storia della timeline di origine:\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "Storia della timeline di destinazione:\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"initdb\" è richiesto da %s ma non è\n"
+#~ "stato tro vato nella stessa directory di \"%s\".\n"
+#~ "Controlla la tua installazione.\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "Il programma \"initdb\" è stato trovato da \"%s\"\n"
+#~ "ma non è la stessa versione di %s.\n"
+#~ "Controlla la tua installazione.\n"
+
+#~ msgid "Timeline IDs must be in increasing sequence.\n"
+#~ msgstr "Gli ID di timeline devono essere in sequenza crescente.\n"
+
+#~ msgid "Timeline IDs must be less than child timeline's ID.\n"
+#~ msgstr "Gli ID della timeline devono essere meno dell'ID della timeline del figlio.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n"
+#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n"
+#~ msgstr[0] "la dimensione del semgento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte\n"
+#~ msgstr[1] "la dimensione del semgento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma il file di controllo specifica %d byte\n"
+
+#~ msgid "could not close file \"%s\": %s\n"
+#~ msgstr "chiusura del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "connessione al server fallita: %s"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "creazione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "creazione della tabella temporanea fallita: %s"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "apertura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not open file \"%s\" for reading: %s\n"
+#~ msgstr "apertura del file \"%s\" in lettura fallita: %s\n"
+
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "apertura del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "lettura della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not read file \"%s\": %s\n"
+#~ msgstr "lettura del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "lettura dal file \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\": %s\n"
+#~ msgstr "lettura del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "could not remove directory \"%s\": %s\n"
+#~ msgstr "rimozione della directory \"%s\" fallita: %s\n"
+
+#~ msgid "could not remove file \"%s\": %s\n"
+#~ msgstr "rimozione del file \"%s\" fallita: %s\n"
+
+#~ msgid "could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "rimozione del link simbolico \"%s\" fallita: %s\n"
+
+#~ msgid "could not seek in file \"%s\": %s\n"
+#~ msgstr "spostamento nel file \"%s\" fallito: %s\n"
+
+#~ msgid "could not send COPY data: %s"
+#~ msgstr "invio dei dati di COPY fallito: %s"
+
+#~ msgid "could not send end-of-COPY: %s"
+#~ msgstr "invio del fine-COPY fallito: %s"
+
+#~ msgid "could not send file list: %s"
+#~ msgstr "invio della lista dei file fallito: %s"
+
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "preparazione del contesto di connessione fallita: %s"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "richiesta informazioni sul file \"%s\" fallita: %s\n"
+
+#~ msgid "could not truncate file \"%s\" to %u: %s\n"
+#~ msgstr "troncamento del file \"%s\" a %u fallito: %s\n"
+
+#~ msgid "could not write file \"%s\": %s\n"
+#~ msgstr "scrittura nel file \"%s\" fallita: %s\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "voce \"%s\" esclusa dalla lista di file sorgenti\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "voce \"%s\" esclusa dalla lista di file di destinazione\n"
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "ricevuto il file \"%s\", lunghezza %d\n"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "ricezione blocchi del file\n"
+
+#~ msgid "invalid data in history file: %s\n"
+#~ msgstr "dati non validi nel file di storia: %s\n"
+
+#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr "ricevuto valore null per il blocco del file \"%s\", il file è stato cancellato\n"
+
+#~ msgid "source file list is empty\n"
+#~ msgstr "la lista dei file di origine è vuota\n"
+
+#~ msgid "source server must not be in recovery mode\n"
+#~ msgstr "il server di origine non dev'essere in modalità di recupero\n"
+
+#~ msgid "symbolic link \"%s\" target is too long\n"
+#~ msgstr "destinazione del link simbolico \"%s\" troppo lunga\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "sincronizzazione della directory di destinazione fallita\n"
+
+#~ msgid "syntax error in history file: %s\n"
+#~ msgstr "errore di sintassi nel file di storia: %s\n"
+
+#~ msgid "unexpected result while sending file list: %s"
+#~ msgstr "risultato imprevisto inviando la lista dei file: %s"
diff --git a/src/bin/pg_rewind/po/ja.po b/src/bin/pg_rewind/po/ja.po
new file mode 100644
index 0000000..810b3c5
--- /dev/null
+++ b/src/bin/pg_rewind/po/ja.po
@@ -0,0 +1,1001 @@
+# pg_rewind.po
+# Japanese message translation file for pg_rewind
+#
+# Copyright (C) 2016-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-18 10:09+0900\n"
+"PO-Revision-Date: 2023-05-18 10:38+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "パラメータ\"%s\"ã®å€¤ãŒä¸æ­£ã§ã™: \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "文字列ãŒäºˆæœŸã›ãšã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字\"%%\"ã®å¾Œã«çµ‚了ã—ã¦ã„ã¾ã™ 。"
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "文字列ãŒæƒ³å®šå¤–ã®ç½®æ›æ–‡å­—列\"%%%c\"ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "プロセストークンをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "制é™ä»˜ãトークンを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\"コマンドã®ãƒ—ロセスを起動ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "制é™ä»˜ãトークンã§å†å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ: %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "サブプロセスã®çµ‚了コードをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: エラーコード %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "想定外ã®\"%1$s\"ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º: %3$lld ã§ã¯ãªã %2$lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "アーカイブã‹ã‚‰ãƒªã‚¹ãƒˆã‚¢ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_commandãŒå¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "ファイル\"%s\"をアーカイブã‹ã‚‰ãƒªã‚¹ãƒˆã‚¢ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "メモリä¸è¶³ã§ã™"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "ターゲットファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "ターゲットファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "ターゲットファイル\"%s\"をシークã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "\"%s\"ã«å¯¾ã™ã‚‹æœªå®šç¾©ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚¿ã‚¤ãƒ—"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "通常ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ä¸æ­£ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³(CREATE)ã§ã™"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "ファイル\"%s\"を切り詰ã‚ã®ãŸã‚ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "ファイル\"%s\"ã‚’%uãƒã‚¤ãƒˆã«åˆ‡ã‚Šè©°ã‚られã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "\"%s\"ã«ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "シンボリックリンク\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "シンボリックリンク\"%s\"ã®å‚照先ãŒé•·ã™ãŽã¾ã™"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "ソースã®ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã¯é€šå¸¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "ソースファイル\"%s\"ãŒé‡è¤‡ã—ã¦ã„ã¾ã™"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "éžé€šå¸¸ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®ãƒšãƒ¼ã‚¸ã®æ›¸ãæ›ãˆã§ã™"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\"ã«å¯¾ã™ã‚‹æœªçŸ¥ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚¿ã‚¤ãƒ—"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "ファイル\"%s\"ã¯ã‚½ãƒ¼ã‚¹ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¨ã§ç•°ãªã‚‹ã‚¿ã‚¤ãƒ—ã§ã™"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "ファイル\"%s\"ã®å‡¦ç†ã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_pathを消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "ソースサーãƒãƒ¼ã§ã¯full_pate_writesã¯æœ‰åŠ¹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "ファイル内容をå–å¾—ã™ã‚‹ãŸã‚ã®æ–‡ã‚’準備ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "ソースサーãƒãƒ¼ã§å®Ÿè¡Œä¸­ã®ã‚¯ã‚¨ãƒª(%s)ã§ã‚¨ãƒ©ãƒ¼: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "クエリã‹ã‚‰æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "ソースサーãƒãƒ¼ã®å®Ÿè¡Œä¸­ã®ã‚¯ã‚¨ãƒª(%s)ã§ã‚¨ãƒ©ãƒ¼: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "ç¾åœ¨ã®WAL挿入ä½ç½®ã¨ã—ã¦èªè­˜ä¸å¯ã®çµæžœ\"%s\""
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "ファイルリストをフェッãƒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "ファイルリストã®ãƒ•ã‚§ãƒƒãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "クエリをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "libpq接続をå˜ä¸€è¡Œãƒ¢ãƒ¼ãƒ‰ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "リモートファイルをフェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœ: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "è¦æ±‚よりも多ãã®ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒåˆ°ç€ã—ã¾ã—ãŸ"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "リモートファイルã®ãƒ•ã‚§ãƒƒãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆã‚µã‚¤ã‚º"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "リモートファイルã®ãƒ•ã‚§ãƒƒãƒä¸­ã®çµæžœã‚»ãƒƒãƒˆã«æƒ³å®šå¤–ã®ãƒ‡ãƒ¼ã‚¿åž‹: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "リモートファイルã®ãƒ•ã‚§ãƒƒãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœå½¢å¼"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "リモートファイルã®ãƒ•ã‚§ãƒƒãƒä¸­ã®çµæžœã«æƒ³å®šå¤–ã®NULL値"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "リモートファイルã®ãƒ•ã‚§ãƒƒãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã®é•·ã•"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "ファイル\"%s\"ã¸ã®è¦æ±‚ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "ファイル\"%2$s\"ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ%3$lldã¸ã®è¦æ±‚ã«å¯¾ã—ã¦ã‚ªãƒ•ã‚»ãƒƒãƒˆ%1$lldã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "ファイルâ€%s\"ã«å¯¾ã—ã¦è¦æ±‚よりも多é‡ã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "想定外ã®æ•°ã®ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "リモートファイル\"%s\"をフェッãƒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "リモートファイル\"%s\"ã®ãƒ•ã‚§ãƒƒãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "ソースファイル\"%s\"をオープンã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "ファイル\"%s\"ã®ã‚µã‚¤ã‚ºãŒåŒæ™‚ã«å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚%dãƒã‚¤ãƒˆã‚’期待ã—ã¦ã„ã¾ã—ãŸãŒã€%dãƒã‚¤ãƒˆã‚³ãƒ”ーã•ã‚Œã¾ã—ãŸ"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "ソースファイルをシークã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ä¸­ã«æƒ³å®šå¤–ã®EOF"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL読ã¿å–り機構ã®ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ä¸­ã«ãƒ¡ãƒ¢ãƒªä¸è¶³"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "%X/%Xã®WALレコードを読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "%X/%Xã®WALレコードを読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "終了点%X/%Xã¯å¦¥å½“ãªçµ‚了点ã§ã¯ã‚ã‚Šã¾ã›ã‚“; %X/%Xを期待ã—ã¦ã„ã¾ã—ãŸ"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "%X/%Xã®å‰ã®WALレコードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "%X/%Xã®å‰ã®WALレコードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "ファイル\"%s\"をシークã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: parsexlog.c:440
+#, 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レコードã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã™ãŒã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã®åž‹ã‚’èªè­˜ã§ãã¾ã›ã‚“: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s ã¯PostgreSQLクラスタをãã®ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚³ãƒ”ーã§å†åŒæœŸã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"使用方法:\n"
+" %s [オプション]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal ターゲットã®è¨­å®šã®ä¸­ã®restore_commandを使用ã—ã¦\n"
+" アーカイブã‹ã‚‰WALファイルをå–å¾—ã™ã‚‹\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY 修正を行ã†æ—¢å­˜ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY åŒæœŸå…ƒã¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR åŒæœŸå…ƒã¨ã™ã‚‹ã‚µãƒ¼ãƒãƒ¼\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 修正を始ã‚ã‚‹å‰ã«åœæ­¢ã™ã‚‹\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync 変更ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®å®‰å…¨ãªæ›¸ã出ã—ã‚’å¾…æ©Ÿã—ãªã„\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 進æ—メッセージを出力\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf レプリケーションã®ãŸã‚ã®è¨­å®šã‚’書ã込む\n"
+" (--source-server ãŒå¿…è¦ã¨ãªã‚Šã¾ã™)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME ターゲットã®ã‚¯ãƒ©ã‚¹ã‚¿ã®å®Ÿè¡Œæ™‚ã«æŒ‡å®šã—ãŸ\n"
+" 主サーãƒãƒ¼è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’使用ã™ã‚‹\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 多é‡ã®ãƒ‡ãƒãƒƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown éžã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³å¾Œã®ä¿®æ­£ã‚’自動ã§\n"
+" è¡Œã‚ãªã„\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "ソースãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“(--source-pgdata ã¾ãŸã¯ --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdataã‹--source-server ã¯ã„ãšã‚Œã‹ä¸€æ–¹ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "ターゲットデータディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“(--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "--write-recovery-confã«ã‚½ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼æƒ…å ±(--source-server)ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr " コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\"ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQLã®ã‚¹ãƒ¼ãƒ‘ーユーザーã§%sを実行ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "サーãƒãƒ¼ã¸æŽ¥ç¶šã—ã¾ã—ãŸ"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "ソースã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ã‚¯ãƒ©ã‚¹ã‚¿ãŒåŒä¸€ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ä¸Šã«ã‚ã‚Šã¾ã™"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "タイムライン%3$uã®WALä½ç½®%1$X/%2$Xã§ä¸¡ã‚µãƒ¼ãƒãƒ¼ãŒåˆ†å²ã—ã¦ã„ã¾ã™"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "å·»ã戻ã—ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "タイムライン%3$uã®%1$X/%2$Xã«ã‚る最新ã®å…±é€šãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‹ã‚‰å·»ã戻ã—ã¦ã„ã¾ã™"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "ソースファイルリストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "ターゲットファイルリストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "ターゲットã§WALを読ã¿è¾¼ã‚“ã§ã„ã¾ã™"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "%lu MBコピーã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™(ソースディレクトリã®åˆè¨ˆã‚µã‚¤ã‚ºã¯%lu MBã§ã™)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "ターゲットデータディレクトリをåŒæœŸã—ã¦ã„ã¾ã™"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "完了!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "ファイル\"%s\"ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "pg_rewindã®å®Ÿè¡Œä¸­ã«ã‚½ãƒ¼ã‚¹ã‚·ã‚¹7テムãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸ"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "backup labelを作æˆã—ã¦åˆ¶å¾¡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’æ›´æ–°ã—ã¦ã„ã¾ã™"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "å·»ã戻ã—完了時点ã®ã‚½ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ãŒæƒ³å®šå¤–ã®çŠ¶æ…‹ã§ã—ãŸ"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "ソースクラスタã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¯ãƒ©ã‚¹ã‚¿ã¯ç•°ãªã‚‹ã‚·ã‚¹ãƒ†ãƒ ã®ã‚‚ã®ã§ã™"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "クラスタã¯ã€ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®pg_rewindã¨ã®äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "ターゲットサーãƒãƒ¼ã¯ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’利用ã—ã¦ã„ã‚‹ã€ã¾ãŸã¯\"wal_log_hints = on\"ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "ターゲットサーãƒãƒ¼ã¯ãã‚Œã„ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "ソースデータディレクトリã¯ãã‚Œã„ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) コピーã—ã¾ã—ãŸ"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "ソースクラスタã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®å…±é€šã®ç¥–先を見ã¤ã‘られã¾ã›ã‚“"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ラベルã®ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "想定外ã®åˆ¶å¾¡ãƒ•ã‚¡ã‚¤ãƒ«CRCã§ã™"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "想定外ã®åˆ¶å¾¡ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚µã‚¤ã‚º%dã€æƒ³å®šã¯%d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºæŒ‡å®šã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—コントロールファイルã§ã¯%dãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, 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\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“ã‚Œã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "ターゲットクラスタã§restore_commandãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "ターゲットサーãƒãƒ¼ã«å¯¾ã—ã¦\"%s\"を実行ã—ã¦ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒªã‚«ãƒãƒªã‚’完了ã•ã›ã¾ã™"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "ターゲットクラスタã§ã®postgresコマンドã®ã‚·ãƒ³ã‚°ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ¢ãƒ¼ãƒ‰å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "コマンド: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "履歴ファイル内ã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "æ•°å­—ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDを想定ã—ã¾ã—ãŸã€‚"
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®åˆ‡ã‚Šæ›¿ãˆç‚¹ã®å ´æ‰€ãŒã‚ã‚‹ã¯ãšã§ã—ãŸã€‚"
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "履歴ファイル内ã®ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "タイムラインIDã¯æ˜‡é †ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "履歴ファイル内ã®ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "タイムラインIDã¯å­ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDよりå°ã•ããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚ªãƒ•ã‚»ãƒƒãƒˆãŒç„¡åŠ¹ã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xã§ã¯contrecordãŒå¿…è¦ã§ã™"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·ãŒç„¡åŠ¹ã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "é•·ã•%uã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã®ãƒ¡ãƒ¢ãƒªä¸è¶³"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·%1$uãŒå¤§ãã™ãŽã¾ã™"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%X㧠contrecord フラグãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "%3$X/%4$Xã®ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ã®é•·ã•%1$u(æ­£ã—ãã¯%2$lld)ã¯ä¸æ­£ã§ã™"
+
+#: xlogreader.c:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "%X/%Xã«ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$Xã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ID %1$uãŒç„¡åŠ¹ã§ã™"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ç›´å‰ã®ãƒªãƒ³ã‚¯%1$X/%2$XãŒä¸æ­£ãªãƒ¬ã‚³ãƒ¼ãƒ‰ãŒ%3$X/%4$Xã«ã‚ã‚Šã¾ã™"
+
+#: xlogreader.c:1196
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸æ­£ã§ã™"
+
+#: xlogreader.c:1230
+#, 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:1245 xlogreader.c:1287
+#, 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:1261
+#, 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:1269
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1275
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®XLOG_BLCKSZãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1307
+#, 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:1333
+#, 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:1739
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %uãŒ%X/%Xã§ç„¡åŠ¹ã§ã™"
+
+#: xlogreader.c:1763
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ãŒã€%X/%Xã«ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1770
+#, 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:1806
+#, 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:1822
+#, 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:1836
+#, 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:1851
+#, 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:1867
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_RELãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ãŒã€%X/%Xã«ãŠã„ã¦ä»¥å‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%2$X/%3$Xã«ãŠã‘ã‚‹block_id %1$uãŒç„¡åŠ¹ã§ã™"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã‚µã‚¤ã‚ºãŒç„¡åŠ¹ã§ã™"
+
+#: xlogreader.c:1972
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WALレコード中ã®ID %dã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2056
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%Xã§ä¸æ­£ãªãƒ–ロック%dãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãŸã‚イメージãŒå¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2063
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ­£ãªçŠ¶æ…‹ã§ã‚ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2090 xlogreader.c:2107
+#, 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:2116
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ˜Žãªæ–¹å¼ã§åœ§ç¸®ã•ã‚Œã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "%X/%Xã®ãƒ–ロック%dãŒä¼¸å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ"
diff --git a/src/bin/pg_rewind/po/ka.po b/src/bin/pg_rewind/po/ka.po
new file mode 100644
index 0000000..2d7868d
--- /dev/null
+++ b/src/bin/pg_rewind/po/ka.po
@@ -0,0 +1,1024 @@
+# Georgian message translation file for pg_rewind
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-05 06:21+0000\n"
+"PO-Revision-Date: 2023-07-05 12:42+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რპáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ სრულდებრსპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ \"%%\" შემდეგ."
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელ áƒáƒ“გილმჭერს \"%%%c\" შეიცáƒáƒ•áƒ¡."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "„%s“ ბრძáƒáƒœáƒ”ბის პრáƒáƒªáƒ”სის დáƒáƒ¬áƒ§áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შესრულებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\"-ის მáƒáƒ£áƒšáƒáƒ“ნელი ზáƒáƒ›áƒ: %lld %lld-ის მáƒáƒ’იერ"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ¦áƒ“გენილი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "áƒáƒ¦áƒ“გენის_ბრძáƒáƒœáƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "\"%s\"-ის áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ქმედებრ(CREATE) ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "წáƒáƒ¡áƒáƒ™áƒ•áƒ”თი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) %u-მდე მáƒáƒ™áƒ•áƒ”თის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ %s: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "სიმბმულის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ %s: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "%s: სიმბმული ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "წყáƒáƒ áƒáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბული მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒšáƒ˜ \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "დუბლირებული სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜ : \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "áƒáƒ áƒáƒ©áƒ•áƒ”ულებრივი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გვერდების მáƒáƒ£áƒšáƒáƒ“ნელი ცვლილებáƒ"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი ტიპი \"%s\"."
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ %s წყáƒáƒ áƒáƒ¨áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნეში სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒ ტიპისáƒáƒ"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "ვერ გáƒáƒ“áƒáƒ•áƒ¬áƒ§áƒ•áƒ˜áƒ¢áƒ”, ფáƒáƒ˜áƒšáƒ¡ რრვუყáƒ: %s"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბის პრáƒáƒ‘ლემáƒ: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ სერვერზე full_page_writes-ის ჩáƒáƒ áƒ—ვრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემცველáƒáƒ‘ის გáƒáƒ›áƒáƒ¡áƒáƒ—ხáƒáƒ•áƒ”ლი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბის მáƒáƒ›áƒ–áƒáƒ“ებისáƒáƒ¡: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "შეცდáƒáƒ›áƒ სერვერზე (%2$s) მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ (%1$s) შესრულებისáƒáƒ¡"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი სედეგი"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "შეცდáƒáƒ›áƒ სერვერში (%2$s) მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ (%1$s) შესრულებისáƒáƒ¡"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "უცნáƒáƒ‘ი პáƒáƒ¡áƒ£áƒ®áƒ˜ მიმდინáƒáƒ áƒ” WAL ჩáƒáƒ¡áƒ›áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ისთვის: %s"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "ფáƒáƒ˜áƒšáƒ”ბის სიის მიღების პრáƒáƒ‘ლემáƒ: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ ფáƒáƒ˜áƒšáƒ”ბის სიის მიღებისáƒáƒ¡"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "ერთმწკრივიáƒáƒœ რეჟიმში libpq შეერთების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის მიღების მáƒáƒ£áƒšáƒáƒ“ნელი შედეგი: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "მიღებულირმეტი ნáƒáƒ’ლეჯი, ვიდრე მáƒáƒ•áƒ˜áƒ—ხáƒáƒ•áƒ”"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ˜áƒ¡áƒáƒ¡ მიღებული შედეგების სეტის მáƒáƒ£áƒšáƒáƒ“ნელი ზáƒáƒ›áƒ"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების მáƒáƒ£áƒšáƒáƒ“ნელი ტიპები დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ˜áƒ¡áƒáƒ¡ შედეგების სეტში: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის მიღებისáƒáƒ¡ მიღებული ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელიáƒ"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის მიღების შედეგი მáƒáƒ£áƒšáƒáƒ“ნელ ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•áƒ¡"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ მიღებისáƒáƒ¡ მიღებული შედეგის სიგრძე áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "მიღებულირმáƒáƒœáƒáƒªáƒ”მები ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\", მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ•áƒ˜áƒ—ხáƒáƒ•áƒ” \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "მáƒáƒœáƒáƒªáƒ”მები მიღებულირწáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბისთვის %lld ფáƒáƒ˜áƒšáƒ¨áƒ˜ %s მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜ იყრწáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბისთვის %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "მიღებულირმეტი, ვიდრე მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის: %s"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების მიღებული ნáƒáƒ¬áƒ˜áƒšáƒ”ბის რიცხვი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) მიღებისáƒáƒ¡"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "წყáƒáƒ áƒáƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) ზáƒáƒ›áƒ პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“ შეიცვáƒáƒšáƒ: მáƒáƒ•áƒ”ლáƒáƒ“ი %d ბáƒáƒ˜áƒ¢áƒ¡. დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ“რ%d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის პრáƒáƒ‘ლემáƒ: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი EOF ფáƒáƒ˜áƒšáƒ˜áƒ¡ კითხვისáƒáƒ¡: %s"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრWAL-ის წáƒáƒ›áƒ™áƒ˜áƒ—ხáƒáƒ•áƒ˜ პრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ¡áƒ—ვის"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რის კითხვისáƒáƒ¡: %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რის კითხვისáƒáƒ¡: %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "ბáƒáƒšáƒáƒ¡ მáƒáƒ©áƒ•áƒ”ნებელი %X/%X áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბáƒáƒšáƒáƒ¡ მáƒáƒ©áƒ•áƒ”ნებელიáƒ. მáƒáƒ•áƒ”ლáƒáƒ“ი %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "წინრWAL ჩáƒáƒœáƒáƒ¬áƒ”რის პáƒáƒ•áƒœáƒ შეუძლებელირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "წინრWAL ჩáƒáƒœáƒáƒ¬áƒ”რის პáƒáƒ•áƒœáƒ შეუძლებელირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის პრáƒáƒ‘ლემáƒ: %m"
+
+#: parsexlog.c:440
+#, 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 ჩáƒáƒœáƒáƒ¬áƒ”რი ცვლის ურთიერთáƒáƒ‘áƒáƒ¡, მáƒáƒ’რáƒáƒ› ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი უცნáƒáƒ‘იáƒ: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL კლáƒáƒ¡áƒ¢áƒ”რის მის áƒáƒ¡áƒšáƒ—áƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒ“ენს.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+" %s [პáƒáƒ áƒáƒ›áƒ”ტრი]..\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal áƒáƒ áƒ¥áƒ˜áƒ•áƒ˜áƒ“áƒáƒœ WAL ფáƒáƒ˜áƒšáƒ”ბის მისáƒáƒ¦áƒ”ბáƒáƒ“ სáƒáƒ›áƒ˜áƒ–ნე კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜ \n"
+" restore_command -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ჩáƒáƒ¡áƒáƒ¡áƒ¬áƒáƒ áƒ”ბლáƒáƒ“\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ედáƒáƒ¡áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ”ბელი სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR დáƒáƒ¡áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ”ბელი სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სერვერი\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run გáƒáƒ©áƒ”რებáƒ, სáƒáƒœáƒáƒ› რáƒáƒ›áƒ” შეიცვლებáƒ\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync áƒáƒ  დáƒáƒ•áƒ”ლáƒáƒ“რცვლილებების\n"
+" დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ\n"
+" (მáƒáƒ˜áƒ—ხáƒáƒ•áƒ¡ --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILENAME სáƒáƒ›áƒ˜áƒ–ნეკ ლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ¨áƒ•áƒ”ბისáƒáƒ¡ მთáƒáƒ•áƒáƒ áƒ˜ \n"
+" სერვერის მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¡áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+"\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი შეტყáƒáƒ‘ინებების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown áƒáƒ  სცáƒáƒ“რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ áƒ—ვის შედეგების გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "წყáƒáƒ áƒ მითითებული áƒáƒ áƒáƒ (--source-pgdata áƒáƒœ --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "შეიძლებრმხáƒáƒšáƒáƒ“ ერთის, --source-pgdata áƒáƒœ --source-server -ის მითითებáƒ"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სერვერის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ (--source-server) პáƒáƒ áƒáƒ›áƒ”ტრსთვის --write-recovery-conf მითითებული áƒáƒ áƒáƒ"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "root-ით ვერ გáƒáƒ”შვებáƒ"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "%s PostgreSQL-ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით უნდრგáƒáƒ£áƒ¨áƒ•áƒáƒ—."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "სერვერთáƒáƒœ მიერთებრწáƒáƒ áƒ›áƒáƒ¢áƒ”ბულიáƒ"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რები იგივე დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზეáƒ"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "სერვერი დáƒáƒ¨áƒáƒ áƒ“რWAL-ს მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ–ე %X/%X დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "გáƒáƒ“áƒáƒ®áƒ•áƒ”ვრსáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "გáƒáƒ“áƒáƒ®áƒ•áƒ”ვრბáƒáƒšáƒ სáƒáƒ”რთრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილიდáƒáƒœ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "ფáƒáƒ˜áƒšáƒ”ბის წყáƒáƒ áƒáƒ¡ სიის კითხვáƒ"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნის ფáƒáƒ˜áƒšáƒ”ბის სიის კითხვáƒ"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნეში მყáƒáƒ¤áƒ˜ WAL-ის კითხვáƒ"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ %lu მბ-ის კáƒáƒžáƒ˜áƒ áƒ”ბრ(სáƒáƒ¬áƒ§áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სრული ზáƒáƒ›áƒáƒ %lu მბ)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ›áƒ˜áƒ–ე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "შესრულებულიáƒ!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის %s ქმედებრáƒáƒ áƒ©áƒ”ული áƒáƒ áƒáƒ"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜ შეიცვáƒáƒšáƒ, სáƒáƒœáƒáƒ› pg_rewind იყრგáƒáƒ¨áƒ•áƒ”ბული"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდის შექმნრდრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სისტემრგáƒáƒ“áƒáƒ®áƒ•áƒ”ვისáƒáƒ¡ გáƒáƒ£áƒ áƒ™áƒ•áƒ”ველ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¨áƒ˜ áƒáƒ¦áƒ›áƒáƒ©áƒœáƒ“áƒ"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რები სხვáƒáƒ“áƒáƒ¡áƒáƒ®áƒ•áƒ სისტემებიდáƒáƒœáƒáƒ"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რები pg_rewind-ის áƒáƒ› ვერსიáƒáƒ¡áƒ—áƒáƒœ შეუთáƒáƒ•áƒ¡áƒ”ბელიáƒ"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "სáƒáƒ›áƒ–ნე სერვერზე სáƒáƒ­áƒ˜áƒ áƒáƒ áƒáƒœ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ, áƒáƒœ \"wal_log_hints = on\""
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–რწესების დáƒáƒªáƒ•áƒ˜áƒ— უნდრიყáƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—ული"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბáƒáƒ–რწესების დáƒáƒªáƒ•áƒ˜áƒ— უნდრიყáƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—ული"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s კბ (%d%%) დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ“áƒ"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რების დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის სáƒáƒ”რთრწინáƒáƒžáƒ áƒ˜áƒ¡ პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდის ბáƒáƒ¤áƒ”რი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი CRC"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე: %d. უნდრიყáƒáƒ¡: %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜"
+msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ „%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ”რში restore_command დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ“áƒáƒœ სრულáƒáƒ“ áƒáƒ¦áƒ“გენისთვის სáƒáƒ›áƒ˜áƒ–ნე სერვერზე %s-ის შესრულდებáƒ"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რში postgres-ის ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ რეჟიმის შეცდáƒáƒ›áƒ"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "ბრძáƒáƒœáƒ”ბრიყáƒ: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის რიცხვáƒáƒ‘რივ ID-ს."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვის წერტილის მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ¡."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\""
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ები ზრდáƒáƒ“áƒáƒ‘ით უნდრიყáƒáƒ¡ დáƒáƒšáƒáƒ’ებული."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ები შვილეული დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ზე ნáƒáƒ™áƒšáƒ”ბი უნდრიყáƒáƒ¡."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მინდáƒáƒ“რ%u, მივიღე %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ %X/%X-ის მიერ"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•áƒ”ლáƒáƒ“ი მინიმუმ %u, მივიღე %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "contrecord áƒáƒšáƒáƒ›áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "contrecord -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე %u (მáƒáƒ•áƒ”ლáƒáƒ“ი %lld) მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "რესურსის მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წინრბმულით %X/%X მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "რესურსის მმáƒáƒ áƒ—ველის მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ რიცხვი ჩáƒáƒœáƒáƒ¬áƒ”რში მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ ბიტები %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრბáƒáƒ–ის სიტემიდáƒáƒœáƒáƒ: სეგმáƒáƒœáƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ გვერდის თáƒáƒ•áƒ¡áƒáƒ áƒ—ში"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: გვერდის თáƒáƒ•áƒ¡áƒáƒ áƒ—ში მითითებული XLOG_BLKSZ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი pageaddr %X/%X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "მიმდევრáƒáƒ‘ის-გáƒáƒ áƒ” დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (%u-ის შემდეგ) ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ურიგრblock_id %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მები სიგრძით %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•áƒ áƒ”ტის წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u სიგრძე %u ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•áƒ áƒ”ტის წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u სიგრძე %u მისáƒáƒœáƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძერ%u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1847
+#, 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 დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u-áƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› წინრმნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ block_id %u %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძით მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡, ID-ით %d, მáƒáƒ«áƒ”ბნისáƒáƒ¡"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, რáƒáƒªáƒ მითითებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბლáƒáƒ™áƒ˜ %d"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ით, ბლáƒáƒ™áƒ˜ %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "%3$s მეთáƒáƒ“ით შეკუმშული áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %1$X/%2$X, ბლáƒáƒ™áƒ˜ %4$d შეუძლებელიáƒ. მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირáƒáƒ› áƒáƒ’ების მიერ"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, შეკუმშულირუცნáƒáƒ‘ი მეთáƒáƒ“ით, ბლáƒáƒ™áƒ˜ %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, ბლáƒáƒ™áƒ˜ %d"
+
+#, c-format
+#~ msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+#~ msgstr "%s სიმბმულიáƒ, მáƒáƒ’რáƒáƒ› სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმულები áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu"
+
+#, c-format
+#~ msgid "cannot use restore_command with %%r placeholder"
+#~ msgstr "restore_command-ის გáƒáƒ›áƒáƒ§áƒ”ნებრ%%r áƒáƒ“გილმჭერის გáƒáƒ áƒ”შე გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu"
+
+#, c-format
+#~ msgid "invalid control file"
+#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜"
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "contrecord მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
diff --git a/src/bin/pg_rewind/po/ko.po b/src/bin/pg_rewind/po/ko.po
new file mode 100644
index 0000000..4ca7e71
--- /dev/null
+++ b/src/bin/pg_rewind/po/ko.po
@@ -0,0 +1,1062 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2015 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:52+0000\n"
+"PO-Revision-Date: 2023-05-26 13:21+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(내부 오류)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "\"%s\" 매개 변수용 ê°’ì´ ìž˜ëª»ë¨: \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "\"%%\" ì´ìŠ¤ì¼€ì´í”„ ë¬¸ìž ë’¤ì— ì •ìƒ ë¬¸ìžì—´ì´ ì—†ìŒ"
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "\"%%%c\" ì–‘ì‹ì„ 쓸 문ìžì—´ì´ 아님"
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "restricted tokenì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" ëª…ë ¹ì„ ìœ„í•œ 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "restricted tokenì„ ìž¬ì‹¤í–‰ í•  수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\" íŒŒì¼ í¬ê¸°ê°€ ì´ìƒí•¨: %lld ë¡œ 비정ìƒ, ì •ìƒê°’ %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "ì•„ì¹´ì´ë¸Œì—ì„œ \"%s\" íŒŒì¼ ë³µì› ì‹¤íŒ¨: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command 실패: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "ì•„ì¹´ì´ë¸Œì—ì„œ \"%s\" íŒŒì¼ ë³µì› ì‹¤íŒ¨"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "\"%s\" ëŒ€ìƒ íŒŒì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "\"%s\" ëŒ€ìƒ íŒŒì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "\"%s\" ëŒ€ìƒ íŒŒì¼ì—ì„œ seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "ì•Œ 수 없는 íŒŒì¼ í¬ë©§: \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "ì¼ë°˜ 파ì¼ì— 대한 잘못 ëœ ìž‘ì—… (CREATE)"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "íŠ¸ëž™ìž­ì…˜ì„ ìœ„í•œ \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "\"%s\" 파ì¼ì„ %u í¬ê¸°ë¡œ 정리할 수 ì—†ìŒ: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 삭제할 수 ì—†ìŒ: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "\"%s\"ì— ëŒ€í•œ 심볼릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 삭제할 수 ì—†ìŒ: %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "\"%s\" 심볼릭 ë§í¬ì˜ 대ìƒì´ 너무 긺"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "\"%s\" ìžë£Œ 파ì¼ì€ ì¼ë°˜ 파ì¼ì´ 아님"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "\"%s\" 소스 파ì¼ì„ ë‘ ë²ˆ 지정했습니다"
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "\"%s\" 비ì¼ë°˜ 파ì¼ì˜ 페ì´ì§€ 변경 ì •ë³´ê°€ 잘못ë¨"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\" íŒŒì¼ í˜•ì‹ì„ ì•Œ 수 ì—†ìŒ"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "\"%s\" íŒŒì¼ í˜•ì‹ì´ 소스와 íƒ€ì¼“ì´ ì„œë¡œ 다름"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "\"%s\" 파ì¼ë¡œ ë­˜ 해야할지 ê²°ì •í•  수 ì—†ìŒ"
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path를 지울 수 ì—†ìŒ: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "ì›ë³¸ 서버는 full_page_writes 옵션으로 ìš´ì˜ë˜ì–´ì•¼ 함"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "íŒŒì¼ ë‚´ìš©ì„ ë½‘ê¸° 위한 êµ¬ë¬¸ì„ ì¤€ë¹„í•  수 ì—†ìŒ: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "ì›ë³¸ 서버ì—ì„œ 쿼리 (%s) 실행 오류: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "쿼리 결과가 바르지 ì•ŠìŒ"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "ì›ë³¸ì—ì„œì—ì„œ 쿼리(%s) 실행 오류: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "현재 WAL 삽입 위치를 위한 결과가 ìž˜ëª»ë¨ : \"%s\""
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "íŒŒì¼ ëª©ë¡ì„ 가져올 수 ì—†ìŒ: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "íŒŒì¼ ëª©ë¡ì„ 가져온 결과가 잘못 ë¨"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "쿼리를 보낼 수 ì—†ìŒ: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "libpq ì—°ê²°ì„ ë‹¨ì¼ ë¡œìš° 모드로 지정할 수 ì—†ìŒ"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 결과가 잘못ë¨: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "용천 ëœ ê²ƒë³´ë‹¤ ë§Žì€ ë°ì´í„° ì²­í¬ë¥¼ 받았ìŒ"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ ì§‘í•©ì˜ í¬ê¸°ê°€ 잘못 ë¨"
+
+#: libpq_source.c:515
+#, c-format
+msgid ""
+"unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ ì§‘í•©ì˜ ìžë£Œí˜•ì´ 잘못 ë¨: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "ì›ê²© 파ì¼ì„ 가져오는 중 예ìƒì¹˜ 못한 ê²°ê³¼ í˜•ì‹ ë°œê²¬"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ì•ˆì— null ê°’ì´ ìž˜ëª»ë¨"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ 길ì´ê°€ 잘못ë¨"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "\"%s\" 파ì¼ìš© ë°ì´í„°ë¥¼ 받았ìŒ, \"%s\" 요청 처리용"
+
+#: libpq_source.c:570
+#, c-format
+msgid ""
+"received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr ""
+"%lld 오프셋(해당파ì¼: \"%s\")ì— ë°ì´í„°ë¥¼ 받았ìŒ, %lld 오프셋 요청 처리용"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "\"%s\" 파ì¼ì„ 위한 보다 ë§Žì€ ìš”ì²­ì„ ë°›ì•˜ìŒ"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "ë°ì´í„° ì²­í¬ ìˆ˜ì‹  숫ìžê°€ ì´ìƒí•¨"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "\"%s\" ì›ê²© 파ì¼ì„ 가져올 수 ì—†ìŒ: %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "\"%s\" ì›ê²©íŒŒì¼ì„ 가져오는 ë„중 ê²°ê³¼ ì§‘í•©ì´ ìž˜ëª» ë¨"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "\"%s\" ì›ë³¸ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: local_source.c:117
+#, c-format
+msgid ""
+"size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "\"%s\" 소스 íŒŒì¼ í¬ê¸°ê°€ 현재 변경 ë˜ì—ˆìŒ: 기대값: %d, 실재값 %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "ì›ë³¸ 파ì¼ì—ì„œ seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "\"%s\" 파ì¼ì„ ì½ëŠ” 중 예ìƒì¹˜ 못한 EOF"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL ì½ê¸° 프로세서를 할당하는 중 메모리 부족"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "%X/%X 위치ì—ì„œ WAL 레코드를 ì½ì„ 수 ì—†ìŒ: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "%X/%X 위치ì—ì„œ WAL 레코드를 ì½ì„ 수 ì—†ìŒ"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "%X/%X ë í¬ì¸í„°ëŠ” ë°”ë¥¸ê°’ì´ ì•„ë‹˜; 기대값: %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "%X/%X 위치ì—ì„œ ì´ì „ WAL 레코드를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "%X/%X 위치ì—ì„œ ì´ì „ WAL 레코드를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì—ì„œ seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m"
+
+#: parsexlog.c:440
+#, 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 레코드가 릴레ì´ì…˜ì„ 변경하려고 하지만, 레코드 형태가 바르지 ì•ŠìŒ: lsn: "
+"%X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL í•œ í´ëŸ¬ìŠ¤í„°ì—ì„œ 다른 í´ëŸ¬ìŠ¤í„°ë¡œ 재ë™ê¸°í™” 하는 ë„구입"
+"니다.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"사용법:\n"
+" %s [옵션]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration "
+"to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal ì•„ì¹´ì´ë¸Œì—ì„œ WAL 파ì¼ì„ 가져오기 위해\n"
+" ëŒ€ìƒ í™˜ê²½ 설정 restore_command 사용\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=디렉터리 변경하려는 ë°ì´í„° 디렉터리\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=디렉터리 ë™ê¸°í™” ì›ë³¸ì´ ë˜ëŠ” ë°ì´í„° 디렉터리\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=연결문ìžì—´ ì›ë³¸ 서버 ì ‘ì† ì •ë³´\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 변경 ìž‘ì—… ì „ì— ë©ˆì¶¤(검사, 확ì¸ìš©)\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync ìž‘ì—… 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ ì•Š"
+"ìŒ\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 진행 과정 메시지를 보여줌\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf 복제를 위한 환경 설정 함\n"
+" (--source-server 설정 필요함)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=파ì¼ì´ë¦„ ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ë¥¼ 실행할 ë•Œ 사용할\n"
+" 서버 환경 설정 íŒŒì¼ ì§€ì •\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 디버그 메시지를 보여줌\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid ""
+" --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown ë¹„ì •ìƒ ì¢…ë£Œ ì‹œ ìžë™ 뒷정리 ìž‘ì—… 안함\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr ""
+"ì›ë³¸ì„ 지정하지 ì•Šì•˜ìŒ (--source-pgdata ë˜ëŠ” --source-server ì˜µì…˜ì„ ì§€ì • í•´"
+"야 함)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdata ë˜ëŠ” --source-server 옵션 중 하나만 지정해야 함"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "ëŒ€ìƒ ë°ì´í„° 디렉토리가 지정ë˜ì§€ ì•Šì•˜ìŒ (--target-pgdata 옵션 사용)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid ""
+"no source server information (--source-server) specified for --write-"
+"recovery-conf"
+msgstr "--write-recovery-conf ìš© ì›ë³´ 서버 ì •ë³´(--source-server) ì—†ìŒ"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" 계정으로는 실행 í•  수 ì—†ìŒ"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "PostgreSQL superuserë¡œ %s í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì‹­ì‹œì˜¤."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "서버 ì ‘ì† ì™„ë£Œ"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì˜ 타임ë¼ì¸ì´ ê°™ìŒ"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "서버 분기 WAL 위치: %X/%X, 타임ë¼ì¸ %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "ë˜ê°ì„ í•„ìš” ì—†ìŒ"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "재ë™ê¸°í™” 시작함, 마지막 ì²´í¬í¬ì¸íŠ¸ 위치 %X/%X, 타임ë¼ì¸ %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "ì›ë³¸ íŒŒì¼ ëª©ë¡ ì½ëŠ” 중"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "ëŒ€ìƒ íŒŒì¼ ëª©ë¡ ì½ëŠ” 중"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "ëŒ€ìƒ ì„œë²„ì—ì„œ WAL ì½ëŠ” 중"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "복사를 위해서 %lu MB 필요함 (ì›ë³¸ 디렉토리 ì „ì²´ í¬ê¸°ëŠ” %lu MB)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "ëŒ€ìƒ ë°ì´í„° 디렉터리 ë™ê¸°í™” 중"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "완료!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "%s 외부 í…Œì´ë¸” ì ‘ê·¼ 권한 ì—†ìŒ"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "pg_rewind 실행 ë˜ê³  있는 ì¤‘ì— ì›ë³¸ ì‹œìŠ¤í…œì´ ë³€ê²½ ë˜ì—ˆìŒ"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "백업 ë¼ë²¨ì„ 만들고, 컨트롤 파ì¼ì„ 갱신 중"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "rewind ëì— ì›ë³¸ ì‹œìŠ¤í…œì˜ ìƒíƒœê°€ 예ìƒê°’ê³¼ 다름"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ê°€ 서로 다른 시스템임"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "해당 í´ëŸ¬ìŠ¤í„°ëŠ” ì´ pg_rewind 버전으로 ìž‘ì—…í•  수 ì—†ìŒ"
+
+#: pg_rewind.c:745
+#, c-format
+msgid ""
+"target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr ""
+"ëŒ€ìƒ ì„œë²„ì˜ ë°ì´í„° í´ëŸ¬ìŠ¤í„°ê°€ ë°ì´í„° ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì¼°ê±°ë‚˜, \"wal_log_hints "
+"= on\" ì„¤ì •ì´ ë˜ì–´ì•¼ 함"
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "ëŒ€ìƒ ì„œë²„ëŠ” ì •ìƒ ì¢…ë£Œë˜ì–´ì•¼ 함"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "ì›ë³¸ ë°ì´í„° 디렉토리는 ì •ìƒì ìœ¼ë¡œ 종료ë˜ì–´ì•¼ 함"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) 복사ë¨"
+
+#: pg_rewind.c:941
+#, c-format
+msgid ""
+"could not find common ancestor of the source and target cluster's timelines"
+msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ ì„œë²„ì˜ ê³µí†µëœ ìƒìœ„ 타임ë¼ì¸ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "백업 ë¼ë²¨ 버í¼ê°€ 너무 ìž‘ìŒ"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "컨트롤 íŒŒì¼ CRC 오류"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "컨트롤 파ì¼ì˜ í¬ê¸°ê°€ %d ë¡œ 비정ìƒ, ì •ìƒê°’ %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d bytes"
+msgstr[0] ""
+"WAL ì¡°ê° íŒŒì¼ì€ 1MB부터 1GB ì‚¬ì´ 2^n í¬ê¸°ì—¬ì•¼ 하지만, 컨트롤 파ì¼ì—는 %d ë°”ì´"
+"트로 지정ë˜ì—ˆìŒ"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s ìž‘ì—…ì—ì„œ 필요합니다. 그런ë°, ì´ íŒŒì¼ì´ \"%s\" 파ì¼ì´ 있"
+"는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤."
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—… ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€ %s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ "
+"다릅니다."
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì— restore_command ì„¤ì •ì´ ì—†ìŒ"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "ëŒ€ìƒ ì„œë²„ì—ì„œ ë¹„ì •ìƒ ì¢…ë£Œ 후 복구 ìž‘ì—…ì„ ìœ„í•´ \"%s\" 실행 중"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ë¥¼ ë‹¨ì¼ ì‚¬ìš©ìž ëª¨ë“œë¡œ postgres 실행 실패"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "ì‚¬ìš©ëœ ëª…ë ¹: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "히스토리 파ì¼ì—ì„œ 문법오류: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "ìˆ«ìž íƒ€ìž„ë¼ì¸ IDê°€ 필요합니다."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "트랜잭션 로그 전환 위치 ê°’ì´ ìžˆì–´ì•¼ 함"
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "ìž‘ì—…ë‚´ì—­ 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 있ìŒ: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "타임ë¼ì¸ ID ê°’ì€ ê·¸ ê°’ì´ ì¦ê°€í•˜ëŠ” 순번값ì´ì–´ì•¼í•©ë‹ˆë‹¤."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "ë‚´ì—­ 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 있ìŒ"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "타임ë¼ì¸ ID는 하위 타임ë¼ì¸ ID보다 작아야 합니다."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 오프셋:위치 %X/%X, 기대값 %u, 실재값 %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xì—ì„œ contrecord를 필요로 함"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´:위치 %X/%X, 기대값 %u, 실재값 %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u 길ì´ì˜ 레코드를 디코딩 하는 중 메모리 부족"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "너무 긴 길ì´(%u)ì˜ ë ˆì½”ë“œê°€ %X/%Xì— ìžˆìŒ"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%X ìœ„ì¹˜ì— contrecord 플래그가 ì—†ìŒ"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u (기대값: %lld), 위치 %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ìž˜ëª»ëœ ìžì› 관리 ID %u, 위치: %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ë ˆì½”ë“œì˜ ìž˜ëª»ëœ í”„ë¦¬ë§í¬ %X/%X, 해당 레코드 %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "ìž˜ëª»ëœ ìžì›ê´€ë¦¬ìž ë°ì´í„° ì²´í¬ì„¬, 위치: %X/%X 레코드"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 %u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì— ì§€ì •ëœ ê°’ì´ ìž˜"
+"ëª»ëœ ì¡°ê° í¬ê¸°ìž„"
+
+#: xlogreader.c:1271
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì˜ XLOG_BLCKSZ ê°’"
+"ì´ ë°”ë¥´ì§€ ì•ŠìŒ"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid ""
+"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, "
+"offset %u"
+msgstr ""
+"타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 "
+"%u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X ì— ìžë£Œê°€ ì—†ìŒ"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길ì´ì˜ ìžë£Œê°€ 있ìŒ, 위치 %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: "
+"%u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ì•ˆë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1847
+#, 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 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´"
+"는 %u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL ì„¤ì •ì´ ë˜ì–´ 있지만, %X/%X ì— ì´ì „ 릴레ì´ì…˜ ì—†ìŒ"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ìž˜ëª»ëœ block_id %u, 위치 %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´, 위치 %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WAL ë ˆì½”ë“œì— %d ID 백업 블ë¡ì´ ì—†ìŒ"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%X ìœ„ì¹˜ì— ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨(%d 블ë¡ì´ 바르지 ì•ŠìŒ)"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "%X/%X ì— ìž˜ëª»ëœ ìƒíƒœê°’으로 ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, ë¸”ë¡ %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"%X/%X ìœ„ì¹˜ì— %s ì••ì¶•ëœ ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, 해당 ì—”ì§„ì´ ì§€ì›í•˜ì§€ ì•ŠìŒ, 해당블"
+"ë¡: %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "%X/%X ìœ„ì¹˜ì— ì•Œìˆ˜ 없는 압축 ë°©ì‹ì˜ ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, 해당블ë¡: %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "%X/%X ì—ì„œ ì´ë¯¸ 압축 풀기 실패, ë¸”ë¡ %d"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "%X/%X ìœ„ì¹˜ì— contrecord ì—†ìŒ"
diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build
new file mode 100644
index 0000000..bffe7de
--- /dev/null
+++ b/src/bin/pg_rewind/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_rewind-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_rewind/po/pl.po b/src/bin/pg_rewind/po/pl.po
new file mode 100644
index 0000000..06b83d7
--- /dev/null
+++ b/src/bin/pg_rewind/po/pl.po
@@ -0,0 +1,891 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2015 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
+# grzegorz <begina.felicysym@wp.eu>, 2015, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 9.5\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-03-14 17:46+0000\n"
+"PO-Revision-Date: 2017-03-14 19:38+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 parsexlog.c:74 parsexlog.c:127
+#: parsexlog.c:179
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/restricted_token.c:68
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: OSTRZEŻENIE nie można tworzyć ograniczonych tokenów na tej platformie\n"
+
+#: ../../common/restricted_token.c:77
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: nie można otworzyć tokenu procesu: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:90
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: nie udało się przydzielić SIDów: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: nie udało się utworzyć ograniczonego tokena: kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:132
+#, c-format
+msgid "%s: could not start process for command \"%s\": error code %lu\n"
+msgstr "%s: nie udało się uruchomić procesu dla polecenia \"%s\": kod błędu %lu\n"
+
+#: ../../common/restricted_token.c:170
+#, c-format
+msgid "%s: could not re-execute with restricted token: error code %lu\n"
+msgstr "%s: nie udało się ponownie wykonać ograniczonego tokena: %lu\n"
+
+#: ../../common/restricted_token.c:186
+#, c-format
+msgid "%s: could not get exit code from subprocess: error code %lu\n"
+msgstr "%s: nie udało uzyskać kodu wyjścia z usługi podrzędnej: kod błędu %lu\n"
+
+#: copy_fetch.c:62
+#, c-format
+msgid "could not open directory \"%s\": %s\n"
+msgstr "nie można otworzyć katalogu \"%s\": %s\n"
+
+#: copy_fetch.c:91 filemap.c:111 filemap.c:266
+#, c-format
+msgid "could not stat file \"%s\": %s\n"
+msgstr "nie można wykonać stat na pliku \"%s\": %s\n"
+
+#: copy_fetch.c:120
+#, c-format
+msgid "could not read symbolic link \"%s\": %s\n"
+msgstr "nie można odczytać linku symbolicznego \"%s\": %s\n"
+
+#: copy_fetch.c:123
+#, c-format
+msgid "symbolic link \"%s\" target is too long\n"
+msgstr "cel linku symbolicznego \"%s\" jest za długi\n"
+
+#: copy_fetch.c:138
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform\n"
+msgstr "\"%s\" jest dowiązaniem symbolicznym, ale linki symboliczne nie są obsługiwane "
+"na tej platformie\n"
+
+#: copy_fetch.c:145
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "nie można czytać katalogu \"%s\": %s\n"
+
+#: copy_fetch.c:149
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "nie można zamknąć katalogu \"%s\": %s\n"
+
+#: copy_fetch.c:169
+#, c-format
+msgid "could not open source file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku źródłowego \"%s\": %s\n"
+
+#: copy_fetch.c:173
+#, c-format
+msgid "could not seek in source file: %s\n"
+msgstr "nie można pozycjonować w pliku wyjścia %s\n"
+
+#: copy_fetch.c:190 file_ops.c:299
+#, c-format
+msgid "could not read file \"%s\": %s\n"
+msgstr "nie można czytać pliku \"%s\": %s\n"
+
+#: copy_fetch.c:193
+#, c-format
+msgid "unexpected EOF while reading file \"%s\"\n"
+msgstr "nieoczekiwany EOF podczas czytania pliku \"%s\"\n"
+
+#: copy_fetch.c:200
+#, c-format
+msgid "could not close file \"%s\": %s\n"
+msgstr "nie można zamknąć pliku \"%s\": %s\n"
+
+#: datapagemap.c:124
+#, c-format
+msgid " block %u\n"
+msgstr " blok %u\n"
+
+#: file_ops.c:63
+#, c-format
+msgid "could not open target file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku docelowego \"%s\": %s\n"
+
+#: file_ops.c:77
+#, c-format
+msgid "could not close target file \"%s\": %s\n"
+msgstr "nie można zamknąć pliku docelowego \"%s\": %s\n"
+
+#: file_ops.c:97
+#, c-format
+msgid "could not seek in target file \"%s\": %s\n"
+msgstr "nie można przeszukiwać pliku docelowego \"%s\": %s\n"
+
+#: file_ops.c:113
+#, c-format
+msgid "could not write file \"%s\": %s\n"
+msgstr "nie można pisać do pliku \"%s\": %s\n"
+
+#: file_ops.c:163
+#, c-format
+msgid "invalid action (CREATE) for regular file\n"
+msgstr "nieprawidłowe działanie (CREATE) dla zwykłego pliku\n"
+
+#: file_ops.c:178
+#, c-format
+msgid "could not remove file \"%s\": %s\n"
+msgstr "nie można usunąć pliku \"%s\": %s\n"
+
+#: file_ops.c:195
+#, c-format
+msgid "could not open file \"%s\" for truncation: %s\n"
+msgstr "nie można otworzyć pliku \"%s\" do obcięcia: %s\n"
+
+#: file_ops.c:199
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %s\n"
+msgstr "nie można obciąć pliku \"%s\" do %u: %s\n"
+
+#: file_ops.c:215
+#, c-format
+msgid "could not create directory \"%s\": %s\n"
+msgstr "nie można utworzyć folderu \"%s\": %s\n"
+
+#: file_ops.c:229
+#, c-format
+msgid "could not remove directory \"%s\": %s\n"
+msgstr "nie można usunąć folderu \"%s\": %s\n"
+
+#: file_ops.c:243
+#, c-format
+msgid "could not create symbolic link at \"%s\": %s\n"
+msgstr "nie można utworzyć linku symbolicznego na \"%s\": %s\n"
+
+#: file_ops.c:257
+#, c-format
+msgid "could not remove symbolic link \"%s\": %s\n"
+msgstr "nie można usunąć linku symbolicznego \"%s\": %s\n"
+
+#: file_ops.c:287 file_ops.c:291
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "nie można otworzyć pliku \"%s\" do odczytu: %s\n"
+
+#: filemap.c:103
+#, c-format
+msgid "data file \"%s\" in source is not a regular file\n"
+msgstr "plik danych źródła \"%s\" nie jest zwykłym plikiem\n"
+
+#: filemap.c:125
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" nie jest katalogiem\n"
+
+#: filemap.c:148
+#, c-format
+msgid "\"%s\" is not a symbolic link\n"
+msgstr "\"%s\" nie jest dowiÄ…zaniem symbolicznym\n"
+
+#: filemap.c:160
+#, c-format
+msgid "\"%s\" is not a regular file\n"
+msgstr "\"%s\" nie jest zwykłym plikiem\n"
+
+#: filemap.c:278
+#, c-format
+msgid "source file list is empty\n"
+msgstr "źródłowa lista plików jest pusta\n"
+
+#: filemap.c:400
+#, c-format
+msgid "unexpected page modification for directory or symbolic link \"%s\"\n"
+msgstr "nieoczekiwana modyfikacja strony dla folderu lub linku symbolicznego \"%s\"\n"
+
+#. translator: first %s is a file path, second is a keyword such as COPY
+#: filemap.c:536
+#, c-format
+msgid "%s (%s)\n"
+msgstr "%s (%s)\n"
+
+#: libpq_fetch.c:55
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "nie można połączyć z serwerem: %s"
+
+#: libpq_fetch.c:58
+#, c-format
+msgid "connected to server\n"
+msgstr "połączono z serwerem\n"
+
+#: libpq_fetch.c:68
+#, c-format
+msgid "source server must not be in recovery mode\n"
+msgstr "serwer źródłowy nie może być w trybie odzyskiwania\n"
+
+#: libpq_fetch.c:78
+#, c-format
+msgid "full_page_writes must be enabled in the source server\n"
+msgstr "full_page_writes musi być włączony na serwerze źródłowym\n"
+
+#: libpq_fetch.c:90
+#, c-format
+msgid "could not set up connection context: %s"
+msgstr "nie można ustawić kontekstu połączenia: %s"
+
+#: libpq_fetch.c:108
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "błąd wykonania zapytania (%s) na serwerze źródłowym: %s"
+
+#: libpq_fetch.c:113
+#, c-format
+msgid "unexpected result set from query\n"
+msgstr "nieoczekiwany zbiór wynikowy z zapytania\n"
+
+#: libpq_fetch.c:136
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location\n"
+msgstr "nierozpoznany wynik \"%s\" dla bieżącego położenia wstawiania WAL\n"
+
+#: libpq_fetch.c:186
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "nie można pobrać listy plików: %s"
+
+#: libpq_fetch.c:191
+#, c-format
+msgid "unexpected result set while fetching file list\n"
+msgstr "nieoczekiwana zbiór wynikowy przy pobieraniu listy plików\n"
+
+#: libpq_fetch.c:239
+#, c-format
+msgid "could not send query: %s"
+msgstr "nie udało się wysłać zapytania: %s"
+
+#: libpq_fetch.c:241
+#, c-format
+msgid "getting file chunks\n"
+msgstr "pobieranie kawałków pliku\n"
+
+#: libpq_fetch.c:244
+#, c-format
+msgid "could not set libpq connection to single row mode\n"
+msgstr "nie można ustalić połączenia libpq na tryb pojedynczego wiersza\n"
+
+#: libpq_fetch.c:264
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "nieoczekiwany wynik przy pobieraniu plików zdalnych: %s"
+
+#: libpq_fetch.c:270
+#, c-format
+msgid "unexpected result set size while fetching remote files\n"
+msgstr "nieoczekiwana długość zbioru wynikowego przy pobieraniu plików zdalnych\n"
+
+#: libpq_fetch.c:276
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u\n"
+msgstr "nieoczekiwane typy danych w zbiorze wartości przy pobieraniu plików "
+"zdalnych: %u %u %u\n"
+
+#: libpq_fetch.c:284
+#, c-format
+msgid "unexpected result format while fetching remote files\n"
+msgstr "nieoczekiwany format wyniku przy pobieraniu plików zdalnych\n"
+
+#: libpq_fetch.c:290
+#, c-format
+msgid "unexpected null values in result while fetching remote files\n"
+msgstr "nieoczekiwane wartości puste przy pobieraniu plików zdalnych\n"
+
+#: libpq_fetch.c:294
+#, c-format
+msgid "unexpected result length while fetching remote files\n"
+msgstr "nieoczekiwana długość wyniku przy pobieraniu plików zdalnych\n"
+
+#: libpq_fetch.c:316
+#, c-format
+msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+msgstr "otrzymano wartość null dla pliku \"%s\", plik został usunięty\n"
+
+#: libpq_fetch.c:323
+#, c-format
+msgid "received chunk for file \"%s\", offset %d, size %d\n"
+msgstr "otrzymany kawałek pliku \"%s\", pozycja %d, rozmiar %d\n"
+
+#: libpq_fetch.c:352
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "nie można pobrać pliku zdalnego \"%s\": %s"
+
+#: libpq_fetch.c:357
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\"\n"
+msgstr "nieoczekiwany zbiór wynikowy przy pobieraniu pliku zdalnego: \"%s\"\n"
+
+#: libpq_fetch.c:368
+#, c-format
+msgid "fetched file \"%s\", length %d\n"
+msgstr "pobrano plik \"%s\", długość %d\n"
+
+#: libpq_fetch.c:400
+#, c-format
+msgid "could not send COPY data: %s"
+msgstr "nie można wysłać danych COPY: %s"
+
+#: libpq_fetch.c:426
+#, c-format
+msgid "could not create temporary table: %s"
+msgstr "nie można utworzyć tabeli tymczasowej: %s"
+
+#: libpq_fetch.c:434
+#, c-format
+msgid "could not send file list: %s"
+msgstr "nie można przesłać listy plików: %s"
+
+#: libpq_fetch.c:476
+#, c-format
+msgid "could not send end-of-COPY: %s"
+msgstr "nie można wysłać end-of-COPY: %s"
+
+#: libpq_fetch.c:482
+#, c-format
+msgid "unexpected result while sending file list: %s"
+msgstr "nieoczekiwany wynik podczas wysyłania listy plików: %s"
+
+#: logging.c:57
+msgid "Failure, exiting\n"
+msgstr "Niepowodzenie, wyjście\n"
+
+#: logging.c:140
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) skopiowano"
+
+#: parsexlog.c:87 parsexlog.c:133
+#, c-format
+msgid "could not read WAL record at %X/%X: %s\n"
+msgstr "nie udało się odczytać rekordu WAL na %X/%X: %s\n"
+
+#: parsexlog.c:91 parsexlog.c:136
+#, c-format
+msgid "could not read WAL record at %X/%X\n"
+msgstr "nie udało się odczytać rekordu WAL na %X/%X\n"
+
+#: parsexlog.c:191
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s\n"
+msgstr "nie udało się odnaleźć poprzedniego rekordu WAL na %X/%X: %s\n"
+
+#: parsexlog.c:195
+#, c-format
+msgid "could not find previous WAL record at %X/%X\n"
+msgstr "nie udało się odnaleźć poprzedniego rekordu WAL na %X/%X\n"
+
+#: parsexlog.c:283
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku \"%s\": %s\n"
+
+#: parsexlog.c:297
+#, c-format
+msgid "could not seek in file \"%s\": %s\n"
+msgstr "nie można pozycjonować w pliku \"%s\": %s\n"
+
+#: parsexlog.c:304
+#, c-format
+msgid "could not read from file \"%s\": %s\n"
+msgstr "nie można czytać z pliku \"%s\": %s\n"
+
+#: parsexlog.c:372
+#, c-format
+msgid ""
+"WAL record modifies a relation, but record type is not recognized\n"
+"lsn: %X/%X, rmgr: %s, info: %02X\n"
+msgstr ""
+"rekord WAL zmienia relację, butale typ rekordu nie został rozpoznany\n"
+"lsn: %X/%X, rmgr: %s, info: %02X\n"
+
+#: pg_rewind.c:64
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynchronizuje klaster PostgreSQL z innÄ… kopiÄ… tego klastra.\n"
+"\n"
+
+#: pg_rewind.c:65
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Użycie:\n"
+" %s [OPCJE]...\n"
+"\n"
+
+#: pg_rewind.c:66
+#, c-format
+msgid "Options:\n"
+msgstr "Opcje:\n"
+
+#: pg_rewind.c:67
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=FOLDER istniejÄ…cy folder danych do zmiany\n"
+
+#: pg_rewind.c:68
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=FOLDER źródłowy folder danych do zsynchronizowania\n"
+
+#: pg_rewind.c:69
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR serwer źródłowy do zsynchronizowania\n"
+
+#: pg_rewind.c:70
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run zatrzymaj przed zmianÄ… czegokolwiek\n"
+
+#: pg_rewind.c:71
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress wypisz komunikaty postępu\n"
+
+#: pg_rewind.c:72
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug wypisz masę komunikatów debugowania\n"
+
+#: pg_rewind.c:73
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: pg_rewind.c:74
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_rewind.c:75
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_rewind.c:130 pg_rewind.c:161 pg_rewind.c:168 pg_rewind.c:175
+#: pg_rewind.c:183
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Użyj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_rewind.c:160
+#, c-format
+msgid "%s: no source specified (--source-pgdata or --source-server)\n"
+msgstr "%s: nie wskazano źródła (--source-pgdata lub --source-server)\n"
+
+#: pg_rewind.c:167
+#, c-format
+msgid "%s: only one of --source-pgdata or --source-server can be specified\n"
+msgstr "%s: tylko jedna z --source-pgdata lub --source-pgdata może być wskazana\n"
+
+#: pg_rewind.c:174
+#, c-format
+msgid "%s: no target data directory specified (--target-pgdata)\n"
+msgstr "%s: nie wskazano docelowego folderu danych (--target-pgdata)\n"
+
+#: pg_rewind.c:181
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_rewind.c:196
+#, c-format
+msgid "cannot be executed by \"root\"\n"
+msgstr "nie może być wykonywane pod \"rootem\"\n"
+
+#: pg_rewind.c:197
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "Musisz uruchomić %s jako superużytkownik PostgreSQL.\n"
+
+#: pg_rewind.c:228
+#, c-format
+msgid "source and target cluster are on the same timeline\n"
+msgstr "klaster źródłowy i docelowy są na tej samej linii czasowej\n"
+
+#: pg_rewind.c:234
+#, c-format
+msgid "servers diverged at WAL position %X/%X on timeline %u\n"
+msgstr "serwery rozeszły się na pozycji WAL %X/%X linii czasowej %u\n"
+
+#: pg_rewind.c:271
+#, c-format
+msgid "no rewind required\n"
+msgstr "przewinięcie nie jest konieczne\n"
+
+#: pg_rewind.c:278
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u\n"
+msgstr "przewinięcie do ostatniego zgodnego punktu kontrolnego na %X/%X linii "
+"czasowej %u\n"
+
+#: pg_rewind.c:286
+#, c-format
+msgid "reading source file list\n"
+msgstr "odczyt źródłowej listy plików\n"
+
+#: pg_rewind.c:288
+#, c-format
+msgid "reading target file list\n"
+msgstr "odczyt docelowej listy plików\n"
+
+#: pg_rewind.c:298
+#, c-format
+msgid "reading WAL in target\n"
+msgstr "odczyt WAL docelowy\n"
+
+#: pg_rewind.c:315
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)\n"
+msgstr "potrzeba skopiować %lu MB (pełna wielkość folderu źródłowego to %lu MB)\n"
+
+#: pg_rewind.c:332
+#, c-format
+msgid ""
+"\n"
+"creating backup label and updating control file\n"
+msgstr ""
+"\n"
+"tworzenie etykiety kopii zapasowej i aktualizacja pliku sterujÄ…cego\n"
+
+#: pg_rewind.c:360
+#, c-format
+msgid "syncing target data directory\n"
+msgstr "docelowy katalog danych synchronizacji\n"
+
+#: pg_rewind.c:363
+#, c-format
+msgid "Done!\n"
+msgstr "Wykonano!\n"
+
+#: pg_rewind.c:375
+#, c-format
+msgid "source and target clusters are from different systems\n"
+msgstr "klastry źródłowy i docelowy pochodzą z innych systemów\n"
+
+#: pg_rewind.c:383
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind\n"
+msgstr "klastry nie sÄ… kompatybilne z tÄ… wersjÄ… pg_rewind\n"
+
+#: pg_rewind.c:393
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\"\n"
+msgstr "serwer docelowy wymaga użycia albo sum kontrolnych albo \"wal_log_hints = on\"\n"
+
+#: pg_rewind.c:404
+#, c-format
+msgid "target server must be shut down cleanly\n"
+msgstr "serwer docelowy musi zostać czysto wyłączony\n"
+
+#: pg_rewind.c:414
+#, c-format
+msgid "source data directory must be shut down cleanly\n"
+msgstr "źródłowy folder danych musi być czysto wyłączony\n"
+
+#: pg_rewind.c:469
+#, c-format
+msgid "invalid control file"
+msgstr "niepoprawny plik kontrolny"
+
+#: pg_rewind.c:480
+#, c-format
+msgid "Source timeline history:\n"
+msgstr "Historia źródłowej linii czasu:\n"
+
+#: pg_rewind.c:482
+#, c-format
+msgid "Target timeline history:\n"
+msgstr "Historia docelowej linii czasu:\n"
+
+#. translator: %d is a timeline number, others are LSN positions
+#: pg_rewind.c:496
+#, c-format
+msgid "%d: %X/%X - %X/%X\n"
+msgstr "%d: %X/%X - %X/%X\n"
+
+#: pg_rewind.c:555
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines\n"
+msgstr "nie można znaleźć wspólnego przodka źródłowej i docelowej osi czasu klastra\n"
+
+#: pg_rewind.c:596
+#, c-format
+msgid "backup label buffer too small\n"
+msgstr "bufor etykiety kopii zapasowej jest za mały\n"
+
+#: pg_rewind.c:619
+#, c-format
+msgid "unexpected control file CRC\n"
+msgstr "nieoczekiwane CRC pliku kontrolnego\n"
+
+#: pg_rewind.c:629
+#, c-format
+msgid "unexpected control file size %d, expected %d\n"
+msgstr "nieoczekiwana długość pliku kontrolnego %d, oczekiwano %d\n"
+
+#: pg_rewind.c:696
+#, c-format
+msgid ""
+"The program \"initdb\" is needed by %s but was\n"
+"not found in the same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"initdb\" jest wymagany przez %s ale nie został\n"
+"znaleziony w tym samym folderze co \"%s\".\n"
+"Sprawdź instalację.\n"
+
+#: pg_rewind.c:700
+#, c-format
+msgid ""
+"The program \"initdb\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"Program \"initdb\" został znaleziony przez \"%s\"\n"
+"ale nie jest w tej samej wersji co %s.\n"
+"Sprawdź instalację.\n"
+
+#: pg_rewind.c:718
+#, c-format
+msgid "sync of target directory failed\n"
+msgstr "nie powiodło się sync folderu docelowego\n"
+
+#: timeline.c:76 timeline.c:82
+#, c-format
+msgid "syntax error in history file: %s\n"
+msgstr "błąd składni w pliku historii: %s\n"
+
+#: timeline.c:77
+#, c-format
+msgid "Expected a numeric timeline ID.\n"
+msgstr "Oczekiwano numerycznego ID linii czasu.\n"
+
+#: timeline.c:83
+#, c-format
+msgid "Expected a transaction log switchpoint location.\n"
+msgstr "Oczekiwano położenia przełączenia dziennika transakcji.\n"
+
+#: timeline.c:88
+#, c-format
+msgid "invalid data in history file: %s\n"
+msgstr "niepoprawne dane w pliku historii: %s\n"
+
+#: timeline.c:89
+#, c-format
+msgid "Timeline IDs must be in increasing sequence.\n"
+msgstr "IDy linii czasu muszą być w kolejności rosnącej.\n"
+
+#: timeline.c:109
+#, c-format
+msgid "invalid data in history file\n"
+msgstr "niepoprawne dane w pliku historii\n"
+
+#: timeline.c:110
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID.\n"
+msgstr "IDy linii czasu muszą być mniejsze niż ID potomnej linii czasu.\n"
+
+#: xlogreader.c:276
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "niepoprawne przesunięcie rekordu w %X/%X"
+
+#: xlogreader.c:284
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "wymagany kontrekord w %X/%X"
+
+#: xlogreader.c:325 xlogreader.c:625
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "niepoprawna długość rekordu w %X/%X: oczekiwana %u, jest %u"
+
+#: xlogreader.c:340
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "za duża długość rekordu %u w %X/%X"
+
+#: xlogreader.c:381
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "brak flagi kontrekordu na %X/%X"
+
+#: xlogreader.c:394
+#, c-format
+msgid "invalid contrecord length %u at %X/%X"
+msgstr "niepoprawna długość kontrekordu %u na %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "niepoprawny ID menażera zasobów %u w %X/%X"
+
+#: xlogreader.c:647 xlogreader.c:664
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "rekord z niepoprawnym poprz-linkiem %X/%X w %X/%X"
+
+#: xlogreader.c:701
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "niepoprawna suma kontrolna danych menadżera zasobów w rekordzie w %X/%X"
+
+#: xlogreader.c:734
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr ""
+"niepoprawny magiczny numer %04X w segmencie dziennika %s, przesunięcie %u"
+
+#: xlogreader.c:748 xlogreader.c:799
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr ""
+"niepoprawny bity informacji %04X w segmencie dziennika %s, przesunięcie %u"
+
+#: xlogreader.c:774
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s"
+msgstr ""
+"plik WAL pochodzi z innego systemu bazy danych: identyfikator systemu bazy "
+"danych z pliku WAL to %s, a identyfikator systemu bazy danych z pg_control "
+"to %s"
+
+#: xlogreader.c:781
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header"
+msgstr ""
+"plik WAL pochodzi z innego systemu bazy danych: niepoprawny XLOG_SEG_SIZE w "
+"nagłówku strony"
+
+#: xlogreader.c:787
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr ""
+"plik WAL pochodzi z innego systemu bazy danych: niepoprawny XLOG_BLCKSZ w "
+"nagłówku strony"
+
+#: xlogreader.c:813
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "nieoczekiwany adrstrony %X/%X w segmencie dziennika %s, przesunięcie %u"
+
+#: xlogreader.c:838
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr ""
+"nieoczekiwany ID linii czasu %u (po %u) w segmencie dziennika %s, "
+"przesunięcie %u"
+
+#: xlogreader.c:1083
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "poza porzÄ…dkiem block_id %u na %X/%X"
+
+#: xlogreader.c:1106
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA jest ustawione, ale nie załączono danych na %X/%X"
+
+#: xlogreader.c:1113
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA nie jest ustawione, długość danych to %u na %X/%X"
+
+#: xlogreader.c:1149
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE jest ustawione, ale przesunięcie dziury %u długości %u "
+"blok obrazu o długości %u na %X/%X"
+
+#: xlogreader.c:1165
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE nie jest ustawione, ale przesunięcie dziury %u o długości "
+"%u na %X/%X"
+
+#: xlogreader.c:1180
+#, c-format
+msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_IS_COMPRESSED jest ustawione, ale blok obrazu o długości %u na %X/%"
+"X"
+
+#: xlogreader.c:1195
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr ""
+"ani BKPIMAGE_HAS_HOLE ani BKPIMAGE_IS_COMPRESSED nie jest ustawione, ale "
+"długość bloku obrazu to %u na %X/%X"
+
+#: xlogreader.c:1211
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL jest ustawione ale brak poprzedniej rel na %X/%X"
+
+#: xlogreader.c:1223
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "niepoprawny block_id %u na %X/%X"
+
+#: xlogreader.c:1291
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "rekord o niepoprawnej długości w %X/%X"
+
+#: xlogreader.c:1380
+#, c-format
+msgid "invalid compressed image at %X/%X, block %d"
+msgstr "niepoprawny skompresowany obraz na %X/%X, blok %d"
+
+#~ msgid "Expected an XLOG switchpoint location.\n"
+#~ msgstr "Oczekiwano położenia przełączenia XLOG.\n"
+
+#~ msgid "could not truncate file \"%s\" to %u bytes: %s\n"
+#~ msgstr "nie można obciąć pliku \"%s\" do %u bajtów: %s\n"
diff --git a/src/bin/pg_rewind/po/pt_BR.po b/src/bin/pg_rewind/po/pt_BR.po
new file mode 100644
index 0000000..378c903
--- /dev/null
+++ b/src/bin/pg_rewind/po/pt_BR.po
@@ -0,0 +1,859 @@
+# Brazilian Portuguese message translation file for pg_rewind
+# Copyright (C) 2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Euler Taveira de Oliveira <euler@timbira.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 9.6\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2016-10-25 16:32-0300\n"
+"PO-Revision-Date: 2015-10-04 16:36-0300\n"
+"Last-Translator: Euler Taveira de Oliveira <euler@timbira.com>\n"
+"Language-Team: Brazilian Portuguese <pgbr-dev@listas.postgresql.org.br>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"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 parsexlog.c:74 parsexlog.c:127
+#: parsexlog.c:179
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/restricted_token.c:68
+#, c-format
+msgid "%s: WARNING: cannot create restricted tokens on this platform\n"
+msgstr "%s: AVISO: não pode criar informações restritas nessa plataforma\n"
+
+#: ../../common/restricted_token.c:77
+#, c-format
+msgid "%s: could not open process token: error code %lu\n"
+msgstr "%s: não pôde abrir informação sobre processo: código de erro %lu\n"
+
+#: ../../common/restricted_token.c:90
+#, c-format
+msgid "%s: could not allocate SIDs: error code %lu\n"
+msgstr "%s: não pôde alocar SIDs: código de erro %lu\n"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "%s: could not create restricted token: error code %lu\n"
+msgstr "%s: não pôde criar informação restrita: código de erro %lu\n"
+
+#: ../../common/restricted_token.c:132
+#, c-format
+msgid "%s: could not start process for command \"%s\": error code %lu\n"
+msgstr "%s: não pôde iniciar processo para comando \"%s\": código de erro %lu\n"
+
+#: ../../common/restricted_token.c:170
+#, c-format
+msgid "%s: could not re-execute with restricted token: error code %lu\n"
+msgstr "%s: não pôde executar novamente com informação restrita: código de erro %lu\n"
+
+#: ../../common/restricted_token.c:186
+#, c-format
+msgid "%s: could not get exit code from subprocess: error code %lu\n"
+msgstr "%s: não pôde obter código de saída de subprocesso: código de erro %lu\n"
+
+#: copy_fetch.c:64
+#, c-format
+msgid "could not open directory \"%s\": %s\n"
+msgstr "não pôde abrir diretório \"%s\": %s\n"
+
+#: copy_fetch.c:93 filemap.c:112 filemap.c:267
+#, c-format
+msgid "could not stat file \"%s\": %s\n"
+msgstr "não pôde executar stat no arquivo \"%s\": %s\n"
+
+#: copy_fetch.c:122
+#, c-format
+msgid "could not read symbolic link \"%s\": %s\n"
+msgstr "não pôde ler link simbólico \"%s\": %s\n"
+
+#: copy_fetch.c:125
+#, c-format
+msgid "symbolic link \"%s\" target is too long\n"
+msgstr "alvo do link simbólico \"%s\" é muito longo\n"
+
+#: copy_fetch.c:140
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform\n"
+msgstr "\"%s\" é um link simbólico mas links simbólicos não são suportados nesta plataforma\n"
+
+#: copy_fetch.c:147
+#, c-format
+msgid "could not read directory \"%s\": %s\n"
+msgstr "não pôde ler diretório \"%s\": %s\n"
+
+#: copy_fetch.c:151
+#, c-format
+msgid "could not close directory \"%s\": %s\n"
+msgstr "não pôde fechar diretório \"%s\": %s\n"
+
+#: copy_fetch.c:171
+#, c-format
+msgid "could not open source file \"%s\": %s\n"
+msgstr "não pôde abrir arquivo de origem \"%s\": %s\n"
+
+#: copy_fetch.c:175
+#, c-format
+msgid "could not seek in source file: %s\n"
+msgstr "não pôde posicionar no arquivo de origem: %s\n"
+
+#: copy_fetch.c:192 file_ops.c:300
+#, c-format
+msgid "could not read file \"%s\": %s\n"
+msgstr "não pôde ler arquivo \"%s\": %s\n"
+
+#: copy_fetch.c:195
+#, c-format
+msgid "unexpected EOF while reading file \"%s\"\n"
+msgstr "EOF inesperado ao ler arquivo \"%s\"\n"
+
+#: copy_fetch.c:202
+#, c-format
+msgid "could not close file \"%s\": %s\n"
+msgstr "não pôde fechar arquivo \"%s\": %s\n"
+
+#: datapagemap.c:124
+#, c-format
+msgid " block %u\n"
+msgstr " bloco %u\n"
+
+#: file_ops.c:64
+#, c-format
+msgid "could not open target file \"%s\": %s\n"
+msgstr "não pôde abrir arquivo de destino \"%s\": %s\n"
+
+#: file_ops.c:78
+#, c-format
+msgid "could not close target file \"%s\": %s\n"
+msgstr "não pôde fechar arquivo de destino \"%s\": %s\n"
+
+#: file_ops.c:98
+#, c-format
+msgid "could not seek in target file \"%s\": %s\n"
+msgstr "não pôde posicionar no arquivo de destino \"%s\": %s\n"
+
+#: file_ops.c:114
+#, c-format
+msgid "could not write file \"%s\": %s\n"
+msgstr "não pôde escrever no arquivo \"%s\": %s\n"
+
+#: file_ops.c:164
+#, c-format
+msgid "invalid action (CREATE) for regular file\n"
+msgstr "ação inválida (CREATE) para arquivo regular\n"
+
+#: file_ops.c:179
+#, c-format
+msgid "could not remove file \"%s\": %s\n"
+msgstr "não pôde remover arquivo \"%s\": %s\n"
+
+#: file_ops.c:196
+#, c-format
+msgid "could not open file \"%s\" for truncation: %s\n"
+msgstr "não pôde abrir arquivo \"%s\" para truncamento: %s\n"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %s\n"
+msgstr "não pôde truncar arquivo \"%s\" para %u: %s\n"
+
+#: file_ops.c:216
+#, c-format
+msgid "could not create directory \"%s\": %s\n"
+msgstr "não pôde criar diretório \"%s\": %s\n"
+
+#: file_ops.c:230
+#, c-format
+msgid "could not remove directory \"%s\": %s\n"
+msgstr "não pôde remover diretório \"%s\": %s\n"
+
+#: file_ops.c:244
+#, c-format
+msgid "could not create symbolic link at \"%s\": %s\n"
+msgstr "não pôde criar link simbólico em \"%s\": %s\n"
+
+#: file_ops.c:258
+#, c-format
+msgid "could not remove symbolic link \"%s\": %s\n"
+msgstr "não pôde remover link simbólico \"%s\": %s\n"
+
+#: file_ops.c:288 file_ops.c:292
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "não pôde abrir arquivo \"%s\" para leitura: %s\n"
+
+#: filemap.c:104
+#, c-format
+msgid "data file \"%s\" in source is not a regular file\n"
+msgstr "arquivo de dados \"%s\" na origem não é um arquivo regular\n"
+
+#: filemap.c:126
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" não é um diretório\n"
+
+#: filemap.c:149
+#, c-format
+msgid "\"%s\" is not a symbolic link\n"
+msgstr "\"%s\" não é um link simbólico\n"
+
+#: filemap.c:161
+#, c-format
+msgid "\"%s\" is not a regular file\n"
+msgstr "\"%s\" não é um arquivo regular\n"
+
+#: filemap.c:279
+#, c-format
+msgid "source file list is empty\n"
+msgstr "lista de arquivos da origem está vazia\n"
+
+#: filemap.c:401
+#, c-format
+msgid "unexpected page modification for directory or symbolic link \"%s\"\n"
+msgstr "modificação de página inesperada em diretório ou link simbólico \"%s\"\n"
+
+#. translator: first %s is a file path, second is a keyword such as COPY
+#: filemap.c:537
+#, c-format
+msgid "%s (%s)\n"
+msgstr "%s (%s)\n"
+
+#: libpq_fetch.c:56
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "não pôde conectar ao servidor: %s"
+
+#: libpq_fetch.c:59
+#, c-format
+msgid "connected to server\n"
+msgstr "conectado ao servidor\n"
+
+#: libpq_fetch.c:69
+#, c-format
+msgid "source server must not be in recovery mode\n"
+msgstr "servidor de origem não deve estar em modo de recuperação\n"
+
+#: libpq_fetch.c:79
+#, c-format
+msgid "full_page_writes must be enabled in the source server\n"
+msgstr "full_page_writes deve estar habilitado no servidor de origem\n"
+
+#: libpq_fetch.c:91
+#, c-format
+msgid "could not set up connection context: %s"
+msgstr "não pôde configurar contexto de conexão: %s"
+
+#: libpq_fetch.c:109
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "erro ao executar consulta (%s) no servidor de origem: %s"
+
+#: libpq_fetch.c:114
+#, c-format
+msgid "unexpected result set from query\n"
+msgstr "conjunto de resultados inesperado da consulta\n"
+
+#: libpq_fetch.c:137
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location\n"
+msgstr "resultado desconhecido \"%s\" para local de inserção atual no WAL\n"
+
+#: libpq_fetch.c:187
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "não pôde obter lista de arquivos: %s"
+
+#: libpq_fetch.c:192
+#, c-format
+msgid "unexpected result set while fetching file list\n"
+msgstr "conjunto de resultados inesperado ao obter lista de arquivos\n"
+
+#: libpq_fetch.c:240
+#, c-format
+msgid "could not send query: %s"
+msgstr "não pôde enviar consulta: %s"
+
+#: libpq_fetch.c:242
+#, c-format
+msgid "getting file chunks\n"
+msgstr "obtendo blocos do arquivo\n"
+
+#: libpq_fetch.c:245
+#, c-format
+msgid "could not set libpq connection to single row mode\n"
+msgstr "não pôde definir conexão libpq para modo de registro único\n"
+
+#: libpq_fetch.c:265
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "resultado inesperado ao obter arquivos remotos: %s"
+
+#: libpq_fetch.c:271
+#, c-format
+msgid "unexpected result set size while fetching remote files\n"
+msgstr "tamanho do conjunto de resultados inesperado ao obter arquivos remotos\n"
+
+#: libpq_fetch.c:277
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u\n"
+msgstr "tipos de daos inesperados no conjunto de resultados ao obter arquivos remotos: %u %u %u\n"
+
+#: libpq_fetch.c:285
+#, c-format
+msgid "unexpected result format while fetching remote files\n"
+msgstr "formato de resultado inesperado ao obter arquivos remotos\n"
+
+#: libpq_fetch.c:291
+#, c-format
+msgid "unexpected null values in result while fetching remote files\n"
+msgstr "valores nulos inesperados em resultado ao obter arquivos remotos\n"
+
+#: libpq_fetch.c:295
+#, c-format
+msgid "unexpected result length while fetching remote files\n"
+msgstr "tamanho de resultado inesperado ao obter arquivos remotos\n"
+
+#: libpq_fetch.c:317
+#, c-format
+msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+msgstr "valor nulo recebido para bloco do arquivo \"%s\", arquivo foi removido\n"
+
+#: libpq_fetch.c:324
+#, c-format
+msgid "received chunk for file \"%s\", offset %d, size %d\n"
+msgstr "bloco recebido para arquivo \"%s\", posição %d, tamanho %d\n"
+
+#: libpq_fetch.c:353
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "não pôde obter arquivo remoto \"%s\": %s"
+
+#: libpq_fetch.c:358
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\"\n"
+msgstr "conjunto de resultados inesperado ao obter arquivo remoto \"%s\"\n"
+
+#: libpq_fetch.c:369
+#, c-format
+msgid "fetched file \"%s\", length %d\n"
+msgstr "arquivo \"%s\" obtido, tamanho %d\n"
+
+#: libpq_fetch.c:401
+#, c-format
+msgid "could not send COPY data: %s"
+msgstr "não pôde enviar dados do COPY: %s"
+
+#: libpq_fetch.c:427
+#, c-format
+msgid "could not create temporary table: %s"
+msgstr "não pôde criar tabela temporária: %s"
+
+#: libpq_fetch.c:435
+#, c-format
+msgid "could not send file list: %s"
+msgstr "não pôde enviar lista de arquivos: %s"
+
+#: libpq_fetch.c:477
+#, c-format
+msgid "could not send end-of-COPY: %s"
+msgstr "não pôde enviar fim do COPY: %s"
+
+#: libpq_fetch.c:483
+#, c-format
+msgid "unexpected result while sending file list: %s"
+msgstr "resultado inesperado ao enviar lista de arquivos: %s"
+
+#: logging.c:57
+msgid "Failure, exiting\n"
+msgstr "Falha, terminando\n"
+
+#: logging.c:140
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) copiado"
+
+#: parsexlog.c:87 parsexlog.c:133
+#, c-format
+msgid "could not read WAL record at %X/%X: %s\n"
+msgstr "não pôde ler registro do WAL em %X/%X: %s\n"
+
+#: parsexlog.c:91 parsexlog.c:136
+#, c-format
+msgid "could not read WAL record at %X/%X\n"
+msgstr "não pôde ler registro do WAL em %X/%X\n"
+
+#: parsexlog.c:191
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s\n"
+msgstr "não pôde encontrar registro do WAL anterior em %X/%X: %s\n"
+
+#: parsexlog.c:195
+#, c-format
+msgid "could not find previous WAL record at %X/%X\n"
+msgstr "não pôde encontrar registro do WAL anterior em %X/%X\n"
+
+#: parsexlog.c:283
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "não pôde abrir arquivo \"%s\": %s\n"
+
+#: parsexlog.c:297
+#, c-format
+msgid "could not seek in file \"%s\": %s\n"
+msgstr "não pôde posicionar no arquivo \"%s\": %s\n"
+
+#: parsexlog.c:304
+#, c-format
+msgid "could not read from file \"%s\": %s\n"
+msgstr "não pôde ler do arquivo \"%s\": %s\n"
+
+#: parsexlog.c:372
+#, c-format
+msgid ""
+"WAL record modifies a relation, but record type is not recognized\n"
+"lsn: %X/%X, rmgr: %s, info: %02X\n"
+msgstr ""
+"registro do WAL modifica uma relação mas tipo do registro é desconhecido\n"
+"lsn: %X/%X, rmgr: %s, info: %02X\n"
+
+#: pg_rewind.c:64
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr "%s sincroniza um agrupamento do PostgreSQL com outra cópia do agrupamento.\n"
+
+#: pg_rewind.c:65
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPÇÃO]...\n"
+"\n"
+
+#: pg_rewind.c:66
+#, c-format
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: pg_rewind.c:67
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRETÓRIO diretório de dados existente a ser modificado\n"
+
+#: pg_rewind.c:68
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRETÓRIO sincroniza com esse diretório de dados de origem\n"
+
+#: pg_rewind.c:69
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=TEXTO sincroniza com esse servidor de origem\n"
+
+#: pg_rewind.c:70
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run para antes de qualquer modifcação\n"
+
+#: pg_rewind.c:71
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress escreve mensagens de progresso\n"
+
+#: pg_rewind.c:72
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug mostra saída da depuração\n"
+
+#: pg_rewind.c:73
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_rewind.c:74
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_rewind.c:75
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Relate erros a <pgsql-bugs@postgresql.org>.\n"
+
+#: pg_rewind.c:130 pg_rewind.c:161 pg_rewind.c:168 pg_rewind.c:175
+#: pg_rewind.c:183
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_rewind.c:160
+#, c-format
+msgid "%s: no source specified (--source-pgdata or --source-server)\n"
+msgstr "%s: nenhuma origem especificada (--source-pgdata ou --source-server)\n"
+
+#: pg_rewind.c:167
+#, c-format
+msgid "%s: only one of --source-pgdata or --source-server can be specified\n"
+msgstr "%s: somente uma das opções --source-pgdata ou --source-server pode ser especificada\n"
+
+#: pg_rewind.c:174
+#, c-format
+msgid "%s: no target data directory specified (--target-pgdata)\n"
+msgstr "%s: nenhum diretório de dados de destino especificado (--target-pgdata)\n"
+
+#: pg_rewind.c:181
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_rewind.c:196
+#, c-format
+msgid "cannot be executed by \"root\"\n"
+msgstr "não pode ser executado pelo \"root\"\n"
+
+#: pg_rewind.c:197
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "Você deve executar %s como um super-usuário do PostgreSQL.\n"
+
+#: pg_rewind.c:228
+#, c-format
+msgid "source and target cluster are on the same timeline\n"
+msgstr "agrupamentos de origem e destino estão na mesma linha do tempo\n"
+
+#: pg_rewind.c:234
+#, c-format
+msgid "servers diverged at WAL position %X/%X on timeline %u\n"
+msgstr "servidores divergem na posição do WAL %X/%X na linha do tempo %u\n"
+
+#: pg_rewind.c:271
+#, c-format
+msgid "no rewind required\n"
+msgstr "nenhuma sincronização é necessária\n"
+
+#: pg_rewind.c:278
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u\n"
+msgstr "sincronizando a partir do último ponto de controle em comum em %X/%X na linha do tempo %u\n"
+
+#: pg_rewind.c:286
+#, c-format
+msgid "reading source file list\n"
+msgstr "lendo lista de arquivos da origem\n"
+
+#: pg_rewind.c:288
+#, c-format
+msgid "reading target file list\n"
+msgstr "lendo lista de arquivos do destino\n"
+
+#: pg_rewind.c:298
+#, c-format
+msgid "reading WAL in target\n"
+msgstr "lendo WAL no destino\n"
+
+#: pg_rewind.c:315
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)\n"
+msgstr "precisa copiar %lu MB (tamanho total do diretório de origem é %lu MB)\n"
+
+#: pg_rewind.c:332
+#, c-format
+msgid ""
+"\n"
+"creating backup label and updating control file\n"
+msgstr ""
+"\n"
+"criando rótulo de cópia de segurança e atualizando arquivo de controle\n"
+
+#: pg_rewind.c:360
+#, c-format
+msgid "syncing target data directory\n"
+msgstr "sincronizando diretório de dados de destino\n"
+
+#: pg_rewind.c:363
+#, c-format
+msgid "Done!\n"
+msgstr "Feito!\n"
+
+#: pg_rewind.c:375
+#, c-format
+msgid "source and target clusters are from different systems\n"
+msgstr "agrupamentos de origem e destino são de sistemas diferentes\n"
+
+#: pg_rewind.c:383
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind\n"
+msgstr "agrupamentos não são compatíveis com esta versão do pg_rewind\n"
+
+#: pg_rewind.c:393
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\"\n"
+msgstr "servidor de destino precisa utilizar soma de verificação de dados ou \"wal_log_hints = on\"\n"
+
+#: pg_rewind.c:404
+#, c-format
+msgid "target server must be shut down cleanly\n"
+msgstr "servidor de destino deve ser desligado corretamente\n"
+
+#: pg_rewind.c:414
+#, c-format
+msgid "source data directory must be shut down cleanly\n"
+msgstr "diretório de dados de origem deve ser desligado corretamente\n"
+
+#: pg_rewind.c:469
+#, c-format
+msgid "invalid control file"
+msgstr "arquivo de controle inválido"
+
+#: pg_rewind.c:480
+#, c-format
+msgid "Source timeline history:\n"
+msgstr "Histórico da linha do tempo de origem:\n"
+
+#: pg_rewind.c:482
+#, c-format
+msgid "Target timeline history:\n"
+msgstr "Histórico da linha do tempo de destino:\n"
+
+#. translator: %d is a timeline number, others are LSN positions
+#: pg_rewind.c:496
+#, c-format
+msgid "%d: %X/%X - %X/%X\n"
+msgstr "%d: %X/%X - %X/%X\n"
+
+#: pg_rewind.c:555
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines\n"
+msgstr "não pôde encontrar antecessor comum das linhas do tempo dos agrupamentos de origem e destino\n"
+
+#: pg_rewind.c:596
+#, c-format
+msgid "backup label buffer too small\n"
+msgstr "buffer do rótulo da cópia de segurança é muito pequeno\n"
+
+#: pg_rewind.c:619
+#, c-format
+msgid "unexpected control file CRC\n"
+msgstr "CRC do arquivo de controle inesperado\n"
+
+#: pg_rewind.c:629
+#, c-format
+msgid "unexpected control file size %d, expected %d\n"
+msgstr "tamanho de arquivo de controle inesperado %d, esperado %d\n"
+
+#: pg_rewind.c:696
+#, c-format
+msgid ""
+"The program \"initdb\" is needed by %s but was\n"
+"not found in the same directory as \"%s\".\n"
+"Check your installation.\n"
+msgstr ""
+"O programa \"initdb\" é requerido pelo %s mas não\n"
+"foi encontrado no mesmo diretório que \"%s\".\n"
+"Verifique sua instalação.\n"
+
+#: pg_rewind.c:700
+#, c-format
+msgid ""
+"The program \"initdb\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation.\n"
+msgstr ""
+"O programa \"initdb\" foi encontrado pelo \"%s\"\n"
+"mas não tem a mesma versão que %s.\n"
+"Verifique sua instalação.\n"
+
+#: pg_rewind.c:718
+#, c-format
+msgid "sync of target directory failed\n"
+msgstr "sincronia do diretório de destino falhou\n"
+
+#: timeline.c:76 timeline.c:82
+#, c-format
+msgid "syntax error in history file: %s\n"
+msgstr "erro de sintaxe no arquivo de histórico: %s\n"
+
+#: timeline.c:77
+#, c-format
+msgid "Expected a numeric timeline ID.\n"
+msgstr "Esperado um ID de linha do tempo numérico.\n"
+
+#: timeline.c:83
+#, c-format
+msgid "Expected a transaction log switchpoint location.\n"
+msgstr "Esperado um local de transição do log de transação.\n"
+
+#: timeline.c:88
+#, c-format
+msgid "invalid data in history file: %s\n"
+msgstr "dado é inválido no arquivo de histórico: %s\n"
+
+#: timeline.c:89
+#, c-format
+msgid "Timeline IDs must be in increasing sequence.\n"
+msgstr "IDs de linha do tempo devem ser uma sequência crescente.\n"
+
+#: timeline.c:109
+#, c-format
+msgid "invalid data in history file\n"
+msgstr "dado é inválido no arquivo de histórico\n"
+
+#: timeline.c:110
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID.\n"
+msgstr "IDs de linha do tempo devem ser menores do que ID de linha do tempo descendente.\n"
+
+#: xlogreader.c:276
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "posição do registro é inválida em %X/%X"
+
+#: xlogreader.c:284
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord é solicitado por %X/%X"
+
+#: xlogreader.c:325 xlogreader.c:624
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "tamanho do registro inválido em %X/%X: desejado %u, obtido %u"
+
+#: xlogreader.c:340
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "tamanho do registro %u em %X/%X é muito longo"
+
+#: xlogreader.c:381
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "não há marcação contrecord em %X/%X"
+
+#: xlogreader.c:394
+#, c-format
+msgid "invalid contrecord length %u at %X/%X"
+msgstr "tamanho de contrecord %u é inválido em %X/%X"
+
+#: xlogreader.c:632
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID do gerenciador de recursos %u é inválido em %X/%X"
+
+#: xlogreader.c:646 xlogreader.c:663
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "registro com prev-link %X/%X incorreto em %X/%X"
+
+#: xlogreader.c:700
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "soma de verificação do gerenciador de recursos é incorreta no registro em %X/%X"
+
+#: xlogreader.c:733
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "número mágico %04X inválido no arquivo de log %s, posição %u"
+
+#: xlogreader.c:747 xlogreader.c:798
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bits de marcação %04X inválidos no arquivo de log %s, posição %u"
+
+#: xlogreader.c:773
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s"
+msgstr "arquivo do WAL é de um sistema de banco de dados diferente: identificador do sistema de banco de dados do arquivo do WAL é %s, identificador do sistema de banco de dados do pg_control é %s"
+
+#: xlogreader.c:780
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header"
+msgstr "arquivo do WAL é de um sistema de banco de dados diferente: XLOG_SEG_SIZE incorreto no cabeçalho da página"
+
+#: xlogreader.c:786
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "arquivo do WAL é de um sistema de banco de dados diferente: XLOG_BLCKSZ incorreto no cabeçalho da página"
+
+#: xlogreader.c:812
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "endereço da página %X/%X inesperado no arquivo de log %s, posição %u"
+
+#: xlogreader.c:837
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "ID de linha do tempo %u fora de sequência (após %u) no arquivo de log %s, posição %u"
+
+#: xlogreader.c:1081
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u fora de ordem em %X/%X"
+
+#: xlogreader.c:1103
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA definido mas nenhum dado incluído em %X/%X"
+
+#: xlogreader.c:1110
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA não foi definido mas tamanho do dado é %u em %X/%X"
+
+#: xlogreader.c:1143
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE definido mas posição do espaço livre %u tamanho %u tamanho da imagem do bloco %u em %X/%X"
+
+#: xlogreader.c:1159
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE não foi definido mas posição do espaço livre %u tamanho %u em %X/%X"
+
+#: xlogreader.c:1174
+#, c-format
+msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED definido mas tamanho da imagem do bloco %u em %X/%X"
+
+#: xlogreader.c:1189
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "nem BKPIMAGE_HAS_HOLE nem BKPIMAGE_IS_COMPRESSED foi definido mas tamanho da imagem do bloco é %u em %X/%X"
+
+#: xlogreader.c:1205
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL definido mas não há relação anterior em %X/%X"
+
+#: xlogreader.c:1217
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u é inválido em %X/%X"
+
+#: xlogreader.c:1282
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "registro com tamanho inválido em %X/%X"
+
+#: xlogreader.c:1371
+#, c-format
+msgid "invalid compressed image at %X/%X, block %d"
+msgstr "imagem compactada é inválida em %X/%X, bloco %d"
diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po
new file mode 100644
index 0000000..3505337
--- /dev/null
+++ b/src/bin/pg_rewind/po/ru.po
@@ -0,0 +1,1228 @@
+# Russian message translation file for pg_rewind
+# Copyright (C) 2015-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <exclusion@gmail.com>, 2015-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-02-02 18:10+0300\n"
+"PO-Revision-Date: 2023-08-30 15:22+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "неверное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "Строка неожиданно закончилаÑÑŒ поÑле ÑпецÑимвола \"%%\"."
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "Строка Ñодержит неожиданный меÑтозаполнитель \"%%%c\"."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "неподходÑщий размер файла \"%s\": %lld вмеÑто %lld байт"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\", воÑÑтановленный из архива: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "ошибка при выполнении restore_command: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "воÑÑтановить файл \"%s\" из архива не удалоÑÑŒ"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памÑти"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать в файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть целевой файл \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть целевой файл \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² целевом файле \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "неопределённый тип файла \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "неверное дейÑтвие (CREATE) Ð´Ð»Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ файла"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ ÑƒÑечениÑ: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "не удалоÑÑŒ обрезать файл \"%s\" до нужного размера (%u): %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "ошибка при удалении каталога \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "ошибка при удалении ÑимволичеÑкой ÑÑылки \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "целевой путь ÑимволичеÑкой ÑÑылки \"%s\" Ñлишком длинный"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "файл данных \"%s\" в иÑточнике не ÑвлÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ файлом"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "повторный иÑходный файл \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñтраницы Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° оÑобого вида \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "неизвеÑтный тип файла \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "файл \"%s\" имеет разный тип в иÑходном и целевом клаÑтере"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "не удалоÑÑŒ определить, что делать Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не удалоÑÑŒ очиÑтить search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "на иÑходном Ñервере должен быть включён режим full_page_writes"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "не удалоÑÑŒ подготовить оператор Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñодержимого файла: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа (%s) на иÑходном Ñервере: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "неожиданный результат запроÑа"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа (%s) на иÑходном Ñервере: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr ""
+"нераÑпознанный результат \"%s\" вмеÑто текущей позиции Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "не удалоÑÑŒ получить ÑпиÑок файлов: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "неожиданный результат при получении ÑпиÑка файлов"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "не удалоÑÑŒ отправить запроÑ: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "не удалоÑÑŒ перевеÑти подключение libpq в одноÑтрочный режим"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "неожиданный результат при получении файлов Ñ Ñервера: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "получено больше Ñегментов данных, чем запрошено"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "неожиданный размер набора результатов при получении файлов Ñ Ñервера"
+
+#: libpq_source.c:515
+#, c-format
+msgid ""
+"unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr ""
+"неожиданные типы данных в наборе результатов при получении файлов Ñ Ñервера: "
+"%u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "неожиданный формат результата при получении файлов Ñ Ñервера"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "неожиданные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL в результате при получении файлов Ñ Ñервера"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° результата при получении файлов Ñ Ñервера"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "получены данные Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\", а запрашивалиÑÑŒ данные Ð´Ð»Ñ \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid ""
+"received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr ""
+"получены данные по Ñмещению %lld в файле \"%s\", а запрашивалиÑÑŒ по Ñмещению "
+"%lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "получено больше данных, чем запрошено Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "получено неожиданное количеÑтво Ñегментов данных"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "не удалоÑÑŒ получить Ñ Ñервера файл \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "неожиданный набор результатов при получении файла \"%s\" Ñ Ñервера"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть иÑходный файл \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid ""
+"size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr ""
+"размер иÑходного файла \"%s\" изменилÑÑ, ожидалоÑÑŒ байт: %d, Ñкопировано: %d"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² иÑходном файле: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "неожиданный конец файла при чтении \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "не удалоÑÑŒ выделить памÑÑ‚ÑŒ Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "не удалоÑÑŒ прочитать запиÑÑŒ WAL в позиции %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "не удалоÑÑŒ прочитать запиÑÑŒ WAL в позиции %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr ""
+"конечный указатель %X/%X неверно задаёт конечную точку; ожидаетÑÑ %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "не удалоÑÑŒ найти предыдущую запиÑÑŒ WAL в позиции %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "не удалоÑÑŒ найти предыдущую запиÑÑŒ WAL в позиции %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² файле \"%s\": %m"
+
+#: parsexlog.c:440
+#, 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 модифицирует отношение, но тип запиÑи не раÑпознан: lsn: %X/%X, "
+"rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s Ñинхронизирует клаÑтер PostgreSQL Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ копией клаÑтера.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"ИÑпользование:\n"
+" %s [ПÐРÐМЕТР]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration "
+"to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal иÑпользовать Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² WAL из\n"
+" архива команду restore_command из целевой\n"
+" конфигурации\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr ""
+" -D, --target-pgdata=КÐТÐЛОГ ÑущеÑтвующий каталог, куда будут запиÑаны "
+"данные\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid ""
+" --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr ""
+" --source-pgdata=КÐТÐЛОГ иÑходный каталог, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ будет проведена "
+"ÑинхронизациÑ\n"
+
+# well-spelled: ПОДКЛ
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr ""
+" --source-server=СТР_ПОДКЛ Ñервер, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ будет проведена "
+"ÑинхронизациÑ\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr ""
+" -n, --dry-run оÑтановитьÑÑ Ð´Ð¾ внеÑÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¸Ñ…-либо "
+"изменений\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на "
+"диÑке\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ходе процеÑÑа\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf запиÑать конфигурацию Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n"
+" (требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=ИМЯ_ФÐЙЛРиÑпользовать указанный оÑновной файл\n"
+" конфигурации Ñервера при запуÑке целевого\n"
+" клаÑтера\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr ""
+" --debug выдавать множеÑтво отладочных Ñообщений\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid ""
+" --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr ""
+" --no-ensure-shutdown не иÑправлÑÑ‚ÑŒ автоматичеÑки ÑоÑтоÑние,\n"
+" возникающее при нештатном отключении\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "иÑточник не указан (требуетÑÑ --source-pgdata или --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "указать можно только --source-pgdata либо --source-server"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "целевой каталог данных не указан (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid ""
+"no source server information (--source-server) specified for --write-"
+"recovery-conf"
+msgstr ""
+"отÑутÑтвует Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± иÑходном Ñервере (--source-server) Ð´Ð»Ñ --write-"
+"recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "программу не должен запуÑкать root"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "ЗапуÑкать %s нужно от имени ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "подключение к Ñерверу уÑтановлено"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "иÑходный и целевой клаÑтер уже на одной линии времени"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "Ñерверы разошлиÑÑŒ в позиции WAL %X/%X на линии времени %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "перемотка не требуетÑÑ"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr ""
+"перемотка от поÑледней общей контрольной точки в позиции %X/%X на линии "
+"времени %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "чтение ÑпиÑка иÑходных файлов"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "чтение ÑпиÑка целевых файлов"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "чтение WAL в целевом клаÑтере"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "требуетÑÑ Ñкопировать %lu МБ (общий размер иÑходного каталога: %lu МБ)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ каталога данных"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "Готово!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "дейÑтвие не определено Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\""
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "в иÑходной ÑиÑтеме произошли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² процеÑÑе работы pg_rewind"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "Ñоздание метки копии и Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего файла"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "иÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑиÑтема оказалаÑÑŒ в неожиданном ÑоÑтоÑнии поÑле перемотки"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "иÑходный и целевой клаÑтеры отноÑÑÑ‚ÑÑ Ðº разным ÑиÑтемам"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "клаÑтеры неÑовмеÑтимы Ñ Ñтой верÑией pg_rewind"
+
+#: pg_rewind.c:745
+#, c-format
+msgid ""
+"target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr ""
+"на целевом Ñервере должны быть контрольные Ñуммы данных или \"wal_log_hints "
+"= on\""
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "целевой Ñервер должен быть выключен штатно"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "работа Ñ Ð¸Ñходным каталогом данных должна быть завершена штатно"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s КБ (%d%%) Ñкопировано"
+
+#: pg_rewind.c:941
+#, c-format
+msgid ""
+"could not find common ancestor of the source and target cluster's timelines"
+msgstr ""
+"не удалоÑÑŒ найти общего предка линий времени иÑходного и целевого клаÑтеров"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "буфер Ð´Ð»Ñ Ð¼ÐµÑ‚ÐºÐ¸ копии Ñлишком мал"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма управлÑющего файла"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "неверный размер управлÑющего файла (%d), ожидалоÑÑŒ: %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the "
+"control file specifies %d bytes"
+msgstr[0] ""
+"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в управлÑющем файле указано значение: %d"
+msgstr[1] ""
+"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в управлÑющем файле указано значение: %d"
+msgstr[2] ""
+"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в управлÑющем файле указано значение: %d"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\""
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ "
+"верÑии %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "команда restore_command в целевом клаÑтере не определена"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr ""
+"выполнение \"%s\" Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоглаÑованноÑти на целевом Ñервере"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr ""
+"не удалоÑÑŒ запуÑтить postgres в целевом клаÑтере в однопользовательÑком "
+"режиме"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "ВыполнÑлаÑÑŒ команда: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в файле иÑтории: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "ОжидаетÑÑ Ñ‡Ð¸Ñловой идентификатор линии времени."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "ОжидаетÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ точки Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° предзапиÑи."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "неверные данные в файле иÑтории: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Идентификаторы линий времени должны возраÑтать."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "неверные данные в файле иÑтории"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr ""
+"Идентификаторы линий времени должны быть меньше идентификатора линии-потомка."
+
+#: xlogreader.c:621
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr ""
+"неверное Ñмещение запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u"
+
+#: xlogreader.c:630
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "в позиции %X/%X запрошено продолжение запиÑи"
+
+#: xlogreader.c:671 xlogreader.c:1136
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr ""
+"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u"
+
+#: xlogreader.c:760
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "нет флага contrecord в позиции %X/%X"
+
+#: xlogreader.c:773
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° contrecord: %u (ожидалаÑÑŒ %lld) в позиции %X/%X"
+
+#: xlogreader.c:1144
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "неверный ID менеджера реÑурÑов %u в позиции %X/%X"
+
+#: xlogreader.c:1157 xlogreader.c:1173
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X в позиции %X/%X"
+
+#: xlogreader.c:1211
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи в позиции "
+"%X/%X"
+
+#: xlogreader.c:1245
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+"неверное магичеÑкое чиÑло %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1260 xlogreader.c:1302
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+"неверные информационные биты %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1276
+#, 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 принадлежит другой СУБД: в нём указан идентификатор ÑиÑтемы БД "
+"%llu, а идентификатор ÑиÑтемы pg_control: %llu"
+
+#: xlogreader.c:1284
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный размер Ñегмента в заголовке "
+"Ñтраницы"
+
+#: xlogreader.c:1290
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке "
+"Ñтраницы"
+
+#: xlogreader.c:1322
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "неожиданный pageaddr %X/%X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1348
+#, c-format
+msgid ""
+"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, "
+"offset %u"
+msgstr ""
+"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте WAL "
+"%s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1754
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "идентификатор блока %u идёт не по порÑдку в позиции %X/%X"
+
+#: xlogreader.c:1778
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA уÑтановлен, но данных в позиции %X/%X нет"
+
+#: xlogreader.c:1785
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA не уÑтановлен, но длина данных равна %u в позиции %X/%X"
+
+#: xlogreader.c:1821
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина %u "
+"при длине образа блока %u в позиции %X/%X"
+
+#: xlogreader.c:1837
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE не уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина "
+"%u в позиции %X/%X"
+
+#: xlogreader.c:1851
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED уÑтановлен, но длина образа блока равна %u в позиции %X/"
+"%X"
+
+#: xlogreader.c:1866
+#, 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 не уÑтановлены, но длина образа "
+"блока равна %u в позиции %X/%X"
+
+#: xlogreader.c:1882
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr ""
+"BKPBLOCK_SAME_REL уÑтановлен, но предыдущее значение не задано в позиции %X/"
+"%X"
+
+#: xlogreader.c:1894
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "неверный идентификатор блока %u в позиции %X/%X"
+
+#: xlogreader.c:1961
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ длиной в позиции %X/%X"
+
+#: xlogreader.c:1987
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не удалоÑÑŒ найти копию блока Ñ ID %d в запиÑи журнала WAL"
+
+#: xlogreader.c:2071
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ неверным блоком %d"
+
+#: xlogreader.c:2078
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼ ÑоÑтоÑнием, блок %d"
+
+#: xlogreader.c:2105 xlogreader.c:2122
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый методом %s, который не "
+"поддерживаетÑÑ Ñтой Ñборкой, блок %d"
+
+#: xlogreader.c:2131
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый неизвеÑтным методом, "
+"блок %d"
+
+#: xlogreader.c:2139
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не удалоÑÑŒ развернуть образ в позиции %X/%X, блок %d"
+
+#, c-format
+#~ msgid "out of memory while trying to decode a record of length %u"
+#~ msgstr "не удалоÑÑŒ выделить памÑÑ‚ÑŒ Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u"
+
+#, c-format
+#~ msgid "record length %u at %X/%X too long"
+#~ msgstr "длина запиÑи %u в позиции %X/%X Ñлишком велика"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)"
+
+#, c-format
+#~ msgid "cannot use restore_command with %%r placeholder"
+#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать restore_command Ñо знаком подÑтановки %%r"
+
+#, c-format
+#~ msgid ""
+#~ "\"%s\" is a symbolic link, but symbolic links are not supported on this "
+#~ "platform"
+#~ msgstr ""
+#~ "\"%s\" — ÑимволичеÑÐºÐ°Ñ ÑÑылка, но в Ñтой ОС ÑимволичеÑкие ÑÑылки не "
+#~ "поддерживаютÑÑ"
+
+#, c-format
+#~ msgid "invalid control file"
+#~ msgstr "неверный управлÑющий файл"
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "неверное Ñмещение запиÑи: %X/%X"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "нет запиÑи contrecord в %X/%X"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "\"%s\" is not a directory"
+#~ msgstr "\"%s\" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼"
+
+#~ msgid "\"%s\" is not a symbolic link"
+#~ msgstr "\"%s\" не ÑвлÑетÑÑ ÑимволичеÑкой ÑÑылкой"
+
+#~ msgid "\"%s\" is not a regular file"
+#~ msgstr "\"%s\" не ÑвлÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ файлом"
+
+#~ msgid "source file list is empty"
+#~ msgstr "ÑпиÑок файлов в иÑточнике пуÑÑ‚"
+
+#~ msgid "source server must not be in recovery mode"
+#~ msgstr "иÑходный Ñервер должен выйти из режима воÑÑтановлениÑ"
+
+#~ msgid "could not send COPY data: %s"
+#~ msgstr "не удалоÑÑŒ отправить данные COPY: %s"
+
+#~ msgid "could not send file list: %s"
+#~ msgstr "не удалоÑÑŒ отправить ÑпиÑок файлов: %s"
+
+#~ msgid "could not send end-of-COPY: %s"
+#~ msgstr "не удалоÑÑŒ отправить Ñообщение о завершении копированиÑ: %s"
+
+#~ msgid "unexpected result while sending file list: %s"
+#~ msgstr "неожиданный результат при передаче ÑпиÑка: %s"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " block %u\n"
+#~ msgstr " блок %u\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "\"%s\" иÑключён из ÑпиÑка иÑходных файлов\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "\"%s\" иÑключён из ÑпиÑка целевых файлов\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#, fuzzy
+#~ msgid "could not set up connection context: %s"
+#~ msgstr "не удалоÑÑŒ наÑтроить контекÑÑ‚ подключениÑ: %s"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "получение Ñегментов файлов\n"
+
+#~ msgid ""
+#~ "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr ""
+#~ "Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\" вмеÑто Ñегмента получено NULL-значение, файл удалён\n"
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "получен файл \"%s\", длина %d\n"
+
+#, fuzzy
+#~ msgid "could not create temporary table: %s"
+#~ msgstr "не удалоÑÑŒ Ñоздать временную таблицу: %s"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Ошибка, выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "не удалоÑÑŒ прочитать файл \"%s\": %s\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени иÑточника:\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени получателÑ:\n"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d: %X/%X - %X/%X\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "Ñбой Ñинхронизации целевого каталога\n"
+
+#~ msgid ""
+#~ "WAL file is from different database system: incorrect XLOG_SEG_SIZE in "
+#~ "page header"
+#~ msgstr ""
+#~ "файл WAL принадлежит другой СУБД: некорректный XLOG_SEG_SIZE в заголовке "
+#~ "Ñтраницы"
diff --git a/src/bin/pg_rewind/po/sv.po b/src/bin/pg_rewind/po/sv.po
new file mode 100644
index 0000000..7826919
--- /dev/null
+++ b/src/bin/pg_rewind/po/sv.po
@@ -0,0 +1,1022 @@
+# Swedish message translation file for pg_rewind
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-02 03:21+0000\n"
+"PO-Revision-Date: 2023-09-05 09:02+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "ogiltigt värde för parameter \"%s\": \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "Sträng avslutas oväntat efter escape-tecken \"%%\"."
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "Sträng innehåller oväntad platshållare \"%%%c\"."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "kunde inte öppna process-token: felkod %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "kunde inte allokera SID: felkod %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "kunde inte skapa token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "kunde inte starta process för kommando \"%s\": felkod %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "kunde inte köra igen med token för begränsad åtkomst: felkod %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "kunde inte hämta statuskod för underprocess: felkod %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "oväntad filstorlek på \"%s\": %lld istället för %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "kunde inte öppna fil \"%s\" återställd från arkiv: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command misslyckades: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "kunde inte återställa fil \"%s\" från arkiv"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "kunde inte skriva till fil \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "kunde inte skapa fil \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "kunde inte öppna målfil \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "kunde inte stänga målfil \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "kunde inte söka i målfil \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "odefinierad filtyp på \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "ogiltig aktion (CREATE) för vanlig fil"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "kunde inte ta bort fil \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "kunde inte öppna fil \"%s\" för trunkering: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "kunde inte trunkera fil \"%s\" till %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "kunde inte ta bort katalog \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "kunde inte skapa en symnbolisk länk vid \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "kan inte ta bort symbolisk länk \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "kunde inte öppna filen \"%s\" för läsning: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "mål för symbolisk länk \"%s\" är för lång"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "kunde inte läsa katalog \"%s\": %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "datafil \"%s\" i källan är inte en vanlig fil"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "duplicerad källflagga \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "oväntad sidmodifiering för icke-regulär fil \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "okänd filtyp på \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "filen \"%s\" har olika typ i källa och mål"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "kunde inte bestämma vad som skulle göras med filen \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "kunde inte nollställa search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "full_page_writes måste vara påslagen i källservern"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "kunde inte förbereda satsen för att hämta filinnehåll: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "fel vid körande av fråga (%s) på källserver: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "oväntad resultatmängd från fråga"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "fel vid körande av fråga (%s) i källserver: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "oväntat resultat \"%s\" för nuvarande WAL-insättningsposition"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "kunde inte hämta fillista: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "oväntad resultatmängd vid hämtning av fillista"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "kunde inte skicka fråga: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "kunde inte sätta libpq-anslutning till enradsläge"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "oväntat resultat vid hämtning av extern fil: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "tog emot fler datastycken än efterfrågat"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "oväntad resultatmängdstorlek vid hämtning av externa filer"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "oväntade datayper i resultatmängd vid hämtning av externa filer: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "oväntat resultatformat vid hämtning av externa filer"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "oväntade null-värden i resultat vid hämtning av externa filer"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "oväntad resultatlängd vid hämtning av externa filer"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "fick data för filen \"%s\", men efterfrågade för \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "fick data från offset %lld i fil \"%s\", men efterfrågade offset %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "tog emot mer än efterfrågat för filen \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "oväntat antal datastycken togs emot"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "kunde inte hämta extern fil \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "oväntat resultatmängd vid hämtning av extern fil \"%s\""
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "kunde inte öppna källfil \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "storleken på källfilen \"%s\" ändrades under körning: %d byte förväntades, %d kopierades"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "kunde inte söka i källfil: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "oväntad EOF under läsning av fil \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "slut på minne vid allokering av en WAL-läs-processor"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "kunde inte läsa WAL-post vid %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "kunde inte läsa WAL-post vid %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "slutpekare %X/%X är inte en giltig slutposition; förväntade %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "kunde inte hitta föregående WAL-post vid %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "kunde inte hitta förgående WAL-post vid %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "kunde inte söka (seek) i fil \"%s\": %m"
+
+#: parsexlog.c:440
+#, 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-post modifierar en relation, men posttypen känns inte igen: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s resynkroniserar ett PostgreSQL-kluster med en annan kopia av klustret.\n"
+"\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"Användning:\n"
+" %s [FLAGGA]...\n"
+"\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal använd restore_command i målkonfigurationen\n"
+" för att hämta WAL-filer från arkiv\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=KATALOG existerande datakatalog att modifiera\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=KATALOG källdatakatalog att synkronisera med\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=ANSLSTR källserver att synkronisera med\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run stoppa innan något modifieras\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync vänta inte på att ändingar säkert\n"
+" skrivits till disk\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress skriv ut förloppmeddelanden\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf skriv konfiguration för replikering\n"
+" (kräver --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr ""
+" --config-file=FILNAMN använd angiven serverkonfiguration när\n"
+" målklustret körs\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug skriv ut en massa debugmeddelanden\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown ingen automatisk hantering av trasig nedstängning\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version skriv ut versioninformation och avsluta sedan\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp och avsluta sedan\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "ingen källa angavs (--source-pgdata eller --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "bara en av --source-pgdata och --source-server får anges"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "ingen måldatakatalog angiven (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "ingen källserverinformation (--source-server) angiven för --write-recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "kan inte köras av \"root\""
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "Du måste köra %s som PostgreSQL:s superuser."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "ansluten till server"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "källa och målkluster är på samma tidslinje"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "servrarna divergerade vid WAL-position %X/%X på tidslinje %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "ingen rewind krävs"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "rewind från senaste gemensamma checkpoint vid %X/%X på tidslinje %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "läser källfillista"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "läser målfillista"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "läser WAL i målet"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "behöver kopiera %lu MB (total källkatalogstorlek är %lu MB)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "synkar måldatakatalog"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "Klar!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "ingen åtgärd beslutades för filen \"%s\""
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "källsystemet ändrades samtidigt som pg_rewind kördes"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "skapar backupetikett och uppdaterar kontrollfil"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "källsystemet var i ett oväntat tillstånd vid slutet av återspolningen"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "källa och målkluster är från olika system"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "klustren är inte kompatibla med denna version av pg_rewind"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "målservern behöver använda antingen datachecksums eller \"wal_log_hints = on\""
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "målserver måste stängas ner utan fel"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "måldatakatalog måste stängas ner utan fel"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) kopierad"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "kunde inte finna en gemensam anfader av källa och målklusterets tidslinjer"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "backupetikett-buffer för liten"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "oväntad kontrollfil-CRC"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "oväntad kontrollfilstorlek %d, förväntade %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte"
+msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men kontrollfilen anger %d byte"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "restore_command är inte satt i målklustret"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "kör \"%s\" för målservern för att slutföra krashåterställning"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "postgres enanvändarläge misslyckades i målklustret"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "Kommandot var: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "syntaxfel i history-fil: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Förväntade ett numeriskt tidslinje-ID."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Förväntade en write-ahead-logg:s switchpoint-position."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "felaktig data i history-fil: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Tidslinje-ID måste komma i en stigande sekvens."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "ogiltig data i historikfil"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Tidslinje-ID:er måste vara mindre än barnens tidslinje-ID:er."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord är begärd vid %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "slut på minne vid avkodning av post med längden %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "postlängd %u vid %X/%X är för lång"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "det finns ingen contrecord-flagga vid %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ogiltigt resurshanterar-ID %u vid %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "post med inkorrekt prev-link %X/%X vid %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "felaktigt magiskt nummer %04X i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ogiltiga infobitar %04X i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1257
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu"
+
+#: xlogreader.c:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvud"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ej-i-sekvens block_id %u vid %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE är satt men håloffset %u längd %u blockavbildlängd %u vid %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE är inte satt men håloffset %u längd %u vid %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ogiltig block_id %u vid %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "post med ogiltig längd vid %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "kunde inte hitta backup-block med ID %d i WAL-post"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt state, block %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med okänd metod, block %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "kunde inte packa upp avbild vid %X/%X, block %d"
+
+#, c-format
+#~ msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+#~ msgstr "\"%s\" är en symbolisk länk men symboliska länkar stöds inte på denna plattform"
+
+#, c-format
+#~ msgid "cannot create restricted tokens on this platform: error code %lu"
+#~ msgstr "kan inte skapa token för begränsad åtkomst på denna plattorm: felkod %lu"
+
+#, c-format
+#~ msgid "cannot use restore_command with %%r placeholder"
+#~ msgstr "kan inte använda restore_command med %%r-platshållare"
+
+#, c-format
+#~ msgid "could not load library \"%s\": error code %lu"
+#~ msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu"
+
+#, c-format
+#~ msgid "invalid control file"
+#~ msgstr "ogiltig kontrollfil"
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "ogiltig postoffset vid %X/%X"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "det finns ingen contrecord vid %X/%X"
diff --git a/src/bin/pg_rewind/po/tr.po b/src/bin/pg_rewind/po/tr.po
new file mode 100644
index 0000000..d314931
--- /dev/null
+++ b/src/bin/pg_rewind/po/tr.po
@@ -0,0 +1,966 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# Abdullah GÃœLNER <agulner@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:48+0000\n"
+"PO-Revision-Date: 2019-06-12 16:57+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/restricted_token.c:69
+#, c-format
+msgid "cannot create restricted tokens on this platform"
+msgstr "bu platformda restricted token oluşturulamıyor"
+
+#: ../../common/restricted_token.c:78
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "process token açma başarısız: hata kodu %lu"
+
+#: ../../common/restricted_token.c:91
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "SIDler ayrılamıyor (allocate): hata kodu %lu"
+
+#: ../../common/restricted_token.c:110
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "restricted token oluşturulamıyor: hata kodu %lu"
+
+#: ../../common/restricted_token.c:131
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "\"%s\" komutu için işlem (process) başlatılamadı: hata kodu %lu"
+
+#: ../../common/restricted_token.c:169
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "restricted token ile tekrar çalıştırılamadı (re-execute): hata kodu %lu"
+
+#: ../../common/restricted_token.c:185
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "alt-işlemden çıkış kodu alınamadı: hata kodu %lu"
+
+#: copy_fetch.c:60
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" dizini açılamıyor: %m"
+
+#: copy_fetch.c:89 filemap.c:189 filemap.c:350
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" dosyası durumlanamadı: %m"
+
+#: copy_fetch.c:118
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" okuma hatası: %m"
+
+#: copy_fetch.c:121
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "symbolic link \"%s\" hedefi çok uzun"
+
+#: copy_fetch.c:136
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\" bir sembolik link, fakat bu platformda sembolik linkler desteklenmiyor"
+
+#: copy_fetch.c:143
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "\"%s\" dizini okunamıyor: %m"
+
+#: copy_fetch.c:147
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" dizini kapatılamadı: %m"
+
+#: copy_fetch.c:167
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "\"%s\" kaynak dosyası açılamadı: %m"
+
+#: copy_fetch.c:171
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "kaynak dosyada arama yapılamadı: %m"
+
+#: copy_fetch.c:188 file_ops.c:312 parsexlog.c:316
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" dosyası okuma hatası: %m"
+
+#: copy_fetch.c:191
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "\"%s\" dosyası okunurken beklenmedik dosya sonu (EOF)"
+
+#: copy_fetch.c:198
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" dosyası kapatılamıyor: %m"
+
+#: file_ops.c:63
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "\"%s\" hedef dosyası açılamadı: %m"
+
+#: file_ops.c:77
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "\"%s\" hedef dosyası kapatılamadı: %m"
+
+#: file_ops.c:97
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "\"%s\" hedef dosyasında arama yapılamadı: %m"
+
+#: file_ops.c:113
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" dosyasına yazma hatası: %m"
+
+#: file_ops.c:163
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "normal (regular) dosya için geçersiz işlem (CREATE)"
+
+#: file_ops.c:186
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "\"%s\" dosyası silinemedi: %m"
+
+#: file_ops.c:204
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "\"%s\" dosyası küçültme (truncation) için açılamadı: %m"
+
+#: file_ops.c:208
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "%s dosyası %u'ya küçültülemedi: %m"
+
+#: file_ops.c:224
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" dizini oluşturulamadı: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "\"%s\" dizini silme hatası: %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "\"%s\" de sembolik link oluşturulamadı: %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" kaldırma hatası: %m"
+
+#: file_ops.c:297 file_ops.c:301
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "\"%s\" dosyası, okunmak için açılamadı: %m"
+
+#: file_ops.c:315 parsexlog.c:318
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%1$s\" dosyası okuma hatası: %3$zu nun %2$d si okundu"
+
+#: filemap.c:181
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "kaynaktaki \"%s\" veri dosyası normal (regular) bir dosya değil"
+
+#: filemap.c:203
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" bir dizin deÄŸil"
+
+#: filemap.c:226
+#, c-format
+msgid "\"%s\" is not a symbolic link"
+msgstr "\"%s\" bir sembolik link deÄŸil"
+
+#: filemap.c:238
+#, c-format
+msgid "\"%s\" is not a regular file"
+msgstr "\"%s\" normal (regular) bir dosya deÄŸil"
+
+#: filemap.c:362
+#, c-format
+msgid "source file list is empty"
+msgstr "kaynak dosya listesi boÅŸ"
+
+#: filemap.c:477
+#, c-format
+msgid "unexpected page modification for directory or symbolic link \"%s\""
+msgstr "\"%s\" dizini veya sembolik linki için beklenmedik sayfa değişikliği (page modification)"
+
+#: libpq_fetch.c:53
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "sunucuya bağlanamadı: %s"
+
+#: libpq_fetch.c:57
+#, c-format
+msgid "connected to server"
+msgstr "sunucuya bağlandı"
+
+#: libpq_fetch.c:61
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "search_path temizlenemedi: %s"
+
+#: libpq_fetch.c:73
+#, c-format
+msgid "source server must not be in recovery mode"
+msgstr "kaynak sunucu kurtarma (recovery) modunda olmamalı"
+
+#: libpq_fetch.c:83
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "kaynak sunucuda full_page_writes etkinleştirilmiş olmalı"
+
+#: libpq_fetch.c:95
+#, c-format
+msgid "could not set up connection context: %s"
+msgstr "bağlantı bağlamı (context) kurulamadı: %s"
+
+#: libpq_fetch.c:113
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "kaynak sunucuda (%s) sorgusu hata üretti: %s"
+
+#: libpq_fetch.c:118
+#, c-format
+msgid "unexpected result set from query"
+msgstr "sorgudan beklenmedik sonuç kümesi"
+
+#: libpq_fetch.c:141
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "geçerli WAL ekleme (insert) yeri için bilinmeyen sonuç \"%s\""
+
+#: libpq_fetch.c:191
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "dosya listesi getirilemedi: %s"
+
+#: libpq_fetch.c:196
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "dosya listesi getirilirken beklenmedik sonuç kümesi"
+
+#: libpq_fetch.c:244
+#, c-format
+msgid "could not send query: %s"
+msgstr "sorgu gönderilemedi: %s"
+
+#: libpq_fetch.c:249
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "libpq bağlantısı tek satır moduna ayarlanamadı"
+
+#: libpq_fetch.c:270
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "uzak dosyalar getirilirken beklenmedik sonuç: %s"
+
+#: libpq_fetch.c:276
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "uzak dosyalar getirilirken beklenmedik sonuç kümesi"
+
+#: libpq_fetch.c:282
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "uzak dosyalar getirilirken sonuç kümesinde beklenmedik veri tipleri: %u %u %u"
+
+#: libpq_fetch.c:290
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "uzak dosyalar getirilirken beklenmedik sonuç formatı"
+
+#: libpq_fetch.c:296
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "uzak dosyalar getirilirken sonuçta beklenmeyen boş (null) değerler"
+
+#: libpq_fetch.c:300
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "uzak dosyalar getirilirken beklenmedik sonuç uzunluğu"
+
+#: libpq_fetch.c:366
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "\"%s\" uzak dosyası getirilemedi: %s"
+
+#: libpq_fetch.c:371
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "\"%s\" uzak dosyası getirilirken beklenmedik sonuç kümesi"
+
+#: libpq_fetch.c:415
+#, c-format
+msgid "could not send COPY data: %s"
+msgstr "COPY veri gönderilemedi: %s"
+
+#: libpq_fetch.c:441
+#, c-format
+msgid "could not create temporary table: %s"
+msgstr "geçici dosya oluşturulamadı: %s"
+
+#: libpq_fetch.c:449
+#, c-format
+msgid "could not send file list: %s"
+msgstr "dosya listesi gönderilemedi: %s"
+
+#: libpq_fetch.c:491
+#, c-format
+msgid "could not send end-of-COPY: %s"
+msgstr "kopya sonu (end-of-COPY) gönderilemedi: %s"
+
+#: libpq_fetch.c:497
+#, c-format
+msgid "unexpected result while sending file list: %s"
+msgstr "dosya listesi gönderilirken beklenmeye sonuç: %s"
+
+#: logging.c:72
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) kopyalandı"
+
+#: parsexlog.c:75 parsexlog.c:129 parsexlog.c:187
+#, c-format
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: parsexlog.c:88 parsexlog.c:135
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "%X/%X deki WAL kaydı okunamadı: %s"
+
+#: parsexlog.c:92 parsexlog.c:138
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "%X/%X deki WAL kaydı okunamadı"
+
+#: parsexlog.c:199
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "önceki WAL kaydı %X/%X de bulunamadı: %s"
+
+#: parsexlog.c:203
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "önceki WAL kaydı %X/%X de bulunamadı"
+
+#: parsexlog.c:294
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" dosyası açılamıyor: %m"
+
+#: parsexlog.c:307
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "\"%s\" dosyası ilerleme hatası: %m"
+
+#: parsexlog.c:387
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X"
+msgstr "WAL kaydı bir nesneyi değiştiriyor, fakat kayıt türü tanınmıyor: lsn: %X/%X, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:69
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL kümesini kümenin diğer bir kopyasıyla yeniden senkronize eder.\n"
+"\n"
+
+#: pg_rewind.c:70
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"kullanım:\n"
+" %s [OPTION]...\n"
+"\n"
+
+#: pg_rewind.c:71
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: pg_rewind.c:72
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DÄ°ZÄ°N deÄŸiÅŸtirilecek mevcut veri dizini\n"
+
+#: pg_rewind.c:73
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DÄ°ZÄ°N senkronize edilecek kaynak veri dizini\n"
+
+#: pg_rewind.c:74
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR senkronize edilecek kaynak sunucu\n"
+
+#: pg_rewind.c:75
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run herhangi bir ÅŸeyi deÄŸiÅŸtirmeden dur\n"
+
+#: pg_rewind.c:76
+#, fuzzy, c-format
+#| msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgid " -N, --no-sync do not wait for changes to be written\n"
+msgstr " -N, --no-sync değişikliklerin diske yazılmasını bekleme\n"
+
+#: pg_rewind.c:77
+#, fuzzy, c-format
+#| msgid " --no-sync do not wait for changes to be written safely to disk\n"
+msgid " safely to disk\n"
+msgstr ""
+" --no-sync değişikliklerin diske yazılması için bekleme\n"
+"\n"
+
+#: pg_rewind.c:78
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress ilerleme mesajları yaz\n"
+
+#: pg_rewind.c:79
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug bir çok hata ayıklama mesajı yaz\n"
+
+#: pg_rewind.c:80
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: pg_rewind.c:81
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_rewind.c:82
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: pg_rewind.c:139 pg_rewind.c:175 pg_rewind.c:182 pg_rewind.c:189
+#: pg_rewind.c:197
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: pg_rewind.c:174
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "kaynak belirtilmemiÅŸ (--source-pgdata veya --source-server)"
+
+#: pg_rewind.c:181
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "--source-pgdata veya --source-server'dan sadece biri belirtilebilir"
+
+#: pg_rewind.c:188
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "hedef veri dizini belirtilmemiÅŸ (--target-pgdata)"
+
+#: pg_rewind.c:195
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı girdisi var (ilki \"%s\")"
+
+#: pg_rewind.c:210
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" tarafından çalıştırılamaz"
+
+#: pg_rewind.c:211
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "%s komutunu PostgreSQL superuser olarak çalıştırmalısınız.\n"
+
+#: pg_rewind.c:222
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "\"%s\" dizininin erişim haklarını okunamıyor: %m"
+
+#: pg_rewind.c:253
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "kaynak ve hedef kümesi aynı zaman çizelgesinde"
+
+#: pg_rewind.c:259
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "sunucular %3$u zaman çizelgesinde %1$X/%2$X WAL konumunda birbirlerinden farklılaşıyor"
+
+#: pg_rewind.c:296
+#, c-format
+msgid "no rewind required"
+msgstr "geri sarma (rewind) gerekmiyor"
+
+#: pg_rewind.c:303
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "%3$u zaman çizelgesinde %1$X/%2$X deki son ortak kontrol noktasından geri sarıyor (rewind)"
+
+#: pg_rewind.c:312
+#, c-format
+msgid "reading source file list"
+msgstr "kaynak dosya listesi okunuyor"
+
+#: pg_rewind.c:315
+#, c-format
+msgid "reading target file list"
+msgstr "hedef dosya listesi okunuyor"
+
+#: pg_rewind.c:326
+#, c-format
+msgid "reading WAL in target"
+msgstr "hedefteki WAL okunuyor"
+
+#: pg_rewind.c:343
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "%lu MB kopyalanmalı (toplam kaynak dizin boyutu %lu MB)"
+
+#: pg_rewind.c:362
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "yedek etiketi oluşturuluyor ve kontrol dosyası güncelleniyor"
+
+#: pg_rewind.c:391
+#, c-format
+msgid "syncing target data directory"
+msgstr "hedef veri dizini senkronize ediliyor"
+
+#: pg_rewind.c:394
+#, c-format
+msgid "Done!"
+msgstr "Tamamlandı!"
+
+#: pg_rewind.c:406
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "kaynak ve hedef kümeleri farklı sistemlerden"
+
+#: pg_rewind.c:414
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "kümeler pg_rewind'in bu sürümüyle uyumlu değil"
+
+#: pg_rewind.c:424
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "hedef sunucu ya veri sağlama toplamları (checksum) ya da \"wal_log_hints = on\" kullanmalı"
+
+#: pg_rewind.c:435
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "hedef sunucu düzgün bir şekilde kapatılmalı"
+
+#: pg_rewind.c:445
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "kaynak veri dizini düzgün bir şekilde kapatılmalı"
+
+#: pg_rewind.c:500
+#, c-format
+msgid "invalid control file\n"
+msgstr "geçersiz kontrol dosyası\n"
+
+#: pg_rewind.c:584
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "kaynak ve hedef kümelerin zaman çizelgelerinin ortak atası bulunamadı"
+
+#: pg_rewind.c:625
+#, c-format
+msgid "backup label buffer too small"
+msgstr "yedek etiketi tamponu (buffer) çok küçük"
+
+#: pg_rewind.c:648
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "beklenmedik kontrol dosyası CRC'si"
+
+#: pg_rewind.c:658
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "beklenmedik kontrol dosyası boyutu %d, beklenen %d"
+
+#: pg_rewind.c:667
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat kontrol dosyası %d bayt belirtmektedir"
+msgstr[1] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat kontrol dosyası %d bayt belirtmektedir"
+
+#: timeline.c:77 timeline.c:83
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "%s geçmiş dosyasında sözdizimi hatası"
+
+#: timeline.c:78
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "Sayısal timeline ID bekleniyordu."
+
+#: timeline.c:84
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "Bir write-ahead log geçiş noktası (switchpoint) lokasyonu bekleniyordu "
+
+#: timeline.c:89
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "geçmiş dosyasında geçersiz veri: %s"
+
+#: timeline.c:90
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Timeline ID daima artan sırayla olmalıdır."
+
+#: timeline.c:110
+#, c-format
+msgid "invalid data in history file"
+msgstr "geçmiş dosyasında geçersiz veri"
+
+#: timeline.c:111
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "timeline ID, child timeline ID'sinden daha düşük olmalıdır."
+
+#: xlogreader.c:299
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "%X/%X adresinde geçersiz kayıt offseti"
+
+#: xlogreader.c:307
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord %X/%X tarafından talep edilmiştir"
+
+#: xlogreader.c:348 xlogreader.c:645
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "%X/%X adresinde geçersiz kayıt uzunluğu: istenen %u, alınan %u"
+
+#: xlogreader.c:372
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$X adresinde çok büyük kayıt uzunluğu: %1$u "
+
+#: xlogreader.c:404
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%X de contrecord bayrağı (flag) bulunmuyor"
+
+#: xlogreader.c:417
+#, c-format
+msgid "invalid contrecord length %u at %X/%X"
+msgstr "%X/%X adresinde geçersiz %u contrecord uzunluğu"
+
+#: xlogreader.c:653
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$X adresinde geçersiz resource manager ID %1$u"
+
+#: xlogreader.c:667 xlogreader.c:684
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "geçersiz incorrect prev-link olan kayıt: %X/%X at %X/%X"
+
+#: xlogreader.c:721
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "resoource manager data checksum %X/%X kaydında geçersiz"
+
+#: xlogreader.c:758
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "%04X geçersiz tanııtım kodu; %s kayıt segmentinde, offset %u"
+
+#: xlogreader.c:772 xlogreader.c:823
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "%04X geçersiz info bits; %s kayıt segmentinde, offset %u"
+
+#: xlogreader.c:798
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s"
+msgstr "WAL dosyası farklı veritabanı sisteminden: WAL dosya veritabanı sistem tanımlayıcı %s, pg_control veritabanı sistem tanımlayıcı %s"
+
+#: xlogreader.c:805
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL dosyası farklı veritabanı sisteminden: page header'da yanlış segment boyutu değeri"
+
+#: xlogreader.c:811
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL dosyası farklı veritabanı sisteminden: page header'da yanlış XLOG_BLCKSZ değeri"
+
+#: xlogreader.c:842
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "beklenmeyen pageaddr %X/%X: log segmenti %s, offset %u"
+
+#: xlogreader.c:867
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "sıra dışı timeline ID %u (%u'dan sonra), bulunduğu log segmenti %s, offset %u"
+
+#: xlogreader.c:1112
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "%X/%X deki %u block_id deÄŸeri bozuk"
+
+#: xlogreader.c:1135
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA ayarlandı, fakat %X/%X de veri yok"
+
+#: xlogreader.c:1142
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA ayarlanmadı, fakat veri uzunluğu %u (%X/%x de)"
+
+#: xlogreader.c:1178
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE ayarlandı, fakat hole offset %u uzunluk %u blok image uzunluğu %u (%X/%X de)"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE ayarlanmadı, fakat hole offset %u uzunluk %u (%X/%X de)"
+
+#: xlogreader.c:1209
+#, c-format
+msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED ayarlandı, fakat block image uzunluğu %u (%X/%X de)"
+
+#: xlogreader.c:1224
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE ve BKPIMAGE_IS_COMPRESSED ayarlanmadı, fakat block image uzunluğu %u (%X/%X de)"
+
+#: xlogreader.c:1240
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL ayarlandı fakat %X/%X de önceki rel yok"
+
+#: xlogreader.c:1252
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%X/%X adresinde %u block_id geçersiz"
+
+#: xlogreader.c:1341
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "%X/%X adresinde geçersiz uzunlukta kayıt"
+
+#: xlogreader.c:1430
+#, c-format
+msgid "invalid compressed image at %X/%X, block %d"
+msgstr "%X/%X adresinde (blok %d), geçersiz compressed image"
+
+#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header"
+#~ msgstr "WAL dosyası farklı veritabanı sisteminden: page header'da yanlış XLOG_SEG_SIZE değeri"
+
+#~ msgid "Timeline IDs must be less than child timeline's ID.\n"
+#~ msgstr "Zamançizelgesi ID'leri alt zaman çizelgesinin ID'lerinden küçük olmalı.\n"
+
+#~ msgid "Timeline IDs must be in increasing sequence.\n"
+#~ msgstr "Zaman çizelgesi ID'leri artan sırada olmalı.\n"
+
+#~ msgid "invalid data in history file: %s\n"
+#~ msgstr "geçmiş dosyasında geçersiz veri: %s\n"
+
+#~ msgid "Expected a write-ahead log switchpoint location.\n"
+#~ msgstr "İşlem kaydı (WAL) geçiş noktası konumu bekleniyor.\n"
+
+#~ msgid "Expected a numeric timeline ID.\n"
+#~ msgstr "Sayısal bir zaman çizelgesi ID'si bekleniyor.\n"
+
+#~ msgid "syntax error in history file: %s\n"
+#~ msgstr "geçmiş dosyasında sözdizimi hatası: %s\n"
+
+#~ msgid "sync of target directory failed\n"
+#~ msgstr "hedef dizinin senkronizasyonu başarısız oldu\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"initdb\" programı \"%s\" tarafından bulundu\n"
+#~ "fakat %s ile aynı sürümde değil.\n"
+#~ "Kurulumunuzu kontrol ediniz\n"
+
+#~ msgid ""
+#~ "The program \"initdb\" is needed by %s but was\n"
+#~ "not found in the same directory as \"%s\".\n"
+#~ "Check your installation.\n"
+#~ msgstr ""
+#~ "\"initdb\" programına %s tarafından ihtiyaç duyuluyor fakat\n"
+#~ "\"%s\" ile aynı dizinde bulunmuyor.\n"
+#~ "Kurulumunuzu kontrol ediniz.\n"
+
+#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n"
+#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n"
+#~ msgstr[0] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat kontrol dosyası %d bayt belirtmektedir\n"
+#~ msgstr[1] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat kontrol dosyası %d bayt belirtmektedir\n"
+
+#~ msgid "%d: %X/%X - %X/%X\n"
+#~ msgstr "%d: %X/%X - %X/%X\n"
+
+#~ msgid "Target timeline history:\n"
+#~ msgstr "Hedef zaman çizelgesi geçmişi:\n"
+
+#~ msgid "Source timeline history:\n"
+#~ msgstr "Kaynak zaman çizelgesi geçmişi:\n"
+
+#~ msgid "%s: could not read permissions of directory \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" dizininin erişim hakları okunamadı : %s\n"
+
+#~ msgid "could not read from file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyasından okuma hatası: %s\n"
+
+#~ msgid "could not seek in file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyasında arama yapılamadı: %s\n"
+
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyası açılamadı: %s\n"
+
+#~ msgid "Failure, exiting\n"
+#~ msgstr "Başarısız, çıkılıyor\n"
+
+#~ msgid "fetched file \"%s\", length %d\n"
+#~ msgstr "\"%s\" dosyası getirildi, uzunluk %d\n"
+
+#~ msgid "received chunk for file \"%s\", offset %s, size %d\n"
+#~ msgstr "\"%s\" dosyası için parça (chunk) alındı, ofset %s, boyut %d\n"
+
+#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n"
+#~ msgstr "\"%s\" dosyası parçası (chunk) için boş (null) değer alındı, dosya silindi\n"
+
+#~ msgid "getting file chunks\n"
+#~ msgstr "dosya parçaları alınıyor\n"
+
+#~ msgid "%s (%s)\n"
+#~ msgstr "%s (%s)\n"
+
+#~ msgid "entry \"%s\" excluded from target file list\n"
+#~ msgstr "\"%s\" kaydı hedef dosya listesinden hariç tutuldu\n"
+
+#~ msgid "entry \"%s\" excluded from source file list\n"
+#~ msgstr "\"%s\" kaydı kaynak dosya listesinden hariç tutuldu\n"
+
+#~ msgid "could not open file \"%s\" for reading: %s\n"
+#~ msgstr "\"%s\" dosyası okuma için açılamadı: %s\n"
+
+#~ msgid "could not remove symbolic link \"%s\": %s\n"
+#~ msgstr "\"%s\" sembolik linki kaldırılamadı: %s\n"
+
+#~ msgid "could not remove directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini silinemedi: %s\n"
+
+#~ msgid "could not create directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini oluşturulamadı: %s\n"
+
+#~ msgid "could not truncate file \"%s\" to %u: %s\n"
+#~ msgstr "\"%s\" dosyası %u'ya küçültülemedi (truncate): %s\n"
+
+#~ msgid "could not remove file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyası silinemedi: %s\n"
+
+#~ msgid "could not write file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyasına yazılamadı: %s\n"
+
+#~ msgid " block %u\n"
+#~ msgstr " blok %u\n"
+
+#~ msgid "could not close file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyası kapatılamadı: %s\n"
+
+#~ msgid "could not read file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyası okunamadı: %s\n"
+
+#~ msgid "could not read directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini okunamıyor: %s\n"
+
+#~ msgid "symbolic link \"%s\" target is too long\n"
+#~ msgstr "\"%s\" sembolik link hedefi çok uzun\n"
+
+#~ msgid "could not read symbolic link \"%s\": %s\n"
+#~ msgstr "\"%s\" sembolik linki okunamadı: %s\n"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyasının durumu görüntülenemedi (stat): %s\n"
+
+#~ msgid "could not open directory \"%s\": %s\n"
+#~ msgstr "\"%s\" dizini açılamıyor: %s\n"
+
+#~ msgid "%s: could not open process token: error code %lu\n"
+#~ msgstr "%s: process token açma başarısız: hata kodu %lu\n"
diff --git a/src/bin/pg_rewind/po/uk.po b/src/bin/pg_rewind/po/uk.po
new file mode 100644
index 0000000..3f3b8ab
--- /dev/null
+++ b/src/bin/pg_rewind/po/uk.po
@@ -0,0 +1,968 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:21+0000\n"
+"PO-Revision-Date: 2023-12-20 12:10\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_rewind.pot\n"
+"X-Crowdin-File-ID: 961\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\": \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "РÑдок неÑподівано завершуєтьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñпеціального Ñимволу \"%%\"."
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "РÑдок міÑтить неочікуваний заповнювач \"%%%c\"."
+
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu"
+
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu"
+
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu"
+
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "неочікуваний розмір файлу Ð´Ð»Ñ \"%s\": %lld заміÑÑ‚ÑŒ %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" відновлений з архіву: %m"
+
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "помилка restore_command: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл \"%s\" з архіву"
+
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "неможливо запиÑати до файлу \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "неможливо Ñтворити файл \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ цільовий файл \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ цільовий файл \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в цільовому файлі \"%s\": %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "невизначений тип файлу Ð´Ð»Ñ \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "неприпуÑтима Ð´Ñ–Ñ (CREATE) Ð´Ð»Ñ Ð·Ð²Ð¸Ñ‡Ð°Ð¹Ð½Ð¾Ð³Ð¾ файлу"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "не можливо видалити файл \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ ÑкороченнÑ: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "не вдалоÑÑ Ñкоротити файл \"%s\" до потрібного розміру %u: %m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "неможливо Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ Ð½Ð° \"%s\": %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñимвольне поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m"
+
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "таргет Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\" задовгий"
+
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "файл даних \"%s\" в джерелі не Ñ” регулÑрним файлом"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "дублікат вихідного файлу \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "неочікувана Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñторінки Ð´Ð»Ñ Ð½ÐµÑ€ÐµÐ³ÑƒÐ»Ñрного файлу \"%s\""
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "невідомий тип файлу Ð´Ð»Ñ \"%s\""
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "файл \"%s\" має різні типи у джерелі та цілі"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "не вдалоÑÑ Ð²Ð¸Ñ€Ñ–ÑˆÐ¸Ñ‚Ð¸, що робити з файлом \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "на початковому Ñервері повинно бути увімкнено full_page_writes"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "не вдалоÑÑ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ інÑтрукцію щоб отримати вміÑÑ‚ файлу: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "помилка при виконанні запиту (%s) на вихідному Ñервері: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "неочікуваний результат запиту"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "помилка при виконанні запиту (%s) на початковому Ñервері: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "нерозпізнаний результат \"%s\" заміÑÑ‚ÑŒ поточної добавленої позиції WAL"
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок файлів: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "неочікуваний результат при отриманні ÑпиÑку файлів"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "не вдалоÑÑ Ð²Ñтановити libpq з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ñ€Ñдкового режиму"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "неочікуваний результат при отриманні віддалених файлів: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "отримано більше фрагментів даних, ніж запитувалоÑÑŒ"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "неочікуваний розмір набору результатів при отриманні віддалених файлів"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "неочікувані типи даних в результаті при отриманні віддалених файлів: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "неочікуваний формат результату при отриманні віддалених файлів"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "неочікувані нульові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² результаті при отриманні віддалених файлів"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "неочікувана довжина результату при отриманні віддалених файлів"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "отримані дані Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\", коли запитувалоÑÑŒ Ð´Ð»Ñ \"%s\""
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "отримано дані по зÑуву %lld файлу \"%s\", коли запитувалоÑÑŒ про зÑув %lld"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "отримано більше, ніж запитувалоÑÑŒ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\""
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "отримано неочікувану кількіÑÑ‚ÑŒ фрагментів даних"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ віддалений файл \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "неочікуваний набір результатів при отриманні віддаленого файлу \"%s\""
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "розмір вихідного файлу \"%s\" паралельно змінивÑÑ: очікувалоÑÑ %d байт, %d Ñкопійовано"
+
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ у вихідному файлі: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "неочікуваний кінець при читанні файлу \"%s\""
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ– під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ WAL на %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ WAL на %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "кінцевий покажчик %X/%X не Ñ” допуÑтимою кінцевою точкою; очікувалоÑÑŒ %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ попередній Ð·Ð°Ð¿Ð¸Ñ WAL на %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ попередній Ð·Ð°Ð¿Ð¸Ñ WAL на %X/%X"
+
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в файлі \"%s\": %m"
+
+#: parsexlog.c:440
+#, 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 модифікує відношеннÑ, але тип запиÑу не розпізнано: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n"
+msgstr "%s Ñинхронізує клаÑтер PostgreSQL з іншою копією клаÑтеру.\n\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid "Usage:\n"
+" %s [OPTION]...\n\n"
+msgstr "ВикориÑтаннÑ:\n"
+" %s [OPTION]...\n\n"
+
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid " -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr " -c, --restore-target-wal викориÑтовує restore_command в цільовій конфігурації, щоб\n"
+" отримати файли WAL з архівів\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY Ñ–Ñнуючий каталог Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY початковий каталог даних Ð´Ð»Ñ Ñинхронізації\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR початковий Ñервер Ð´Ð»Ñ Ñинхронізації\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run зупинитиÑÑ Ð´Ð¾ внеÑÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑŒ-Ñких змін\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync не чекати поки зміни будуть запиÑані на диÑк\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress повідомлÑти про хід процеÑу\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid " -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr " -R, --write-recovery-conf запиÑує конфігурацію Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \n"
+" (потребує --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid " --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr " --config-file=FILENAME викориÑтовувати заданий оÑновний файл конфігурації Ñервера\n"
+" при запуÑку цільового клаÑтера\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug виводити багато налагоджувальних повідомлень\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown не виправлÑти автоматично неочищене Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати довідку, потім вийти\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "джерело не вказано (--source-pgdata чи --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "може бути вказано лише --source-pgdata чи --source-server"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "не вказано жодного каталогу цільових даних (--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "немає інформації про вихідний Ñервер (--source-server) вказаної Ð´Ð»Ñ --write-recovery-conf"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "\"root\" не може це виконувати"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "ЗапуÑкати %s треба від ÑуперкориÑтувача PostgreSQL."
+
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дозволи на каталог \"%s\": %m"
+
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "під'єднано до Ñерверу"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "початковий Ñ– цільовий клаÑтери знаходÑÑ‚ÑŒÑÑ Ð½Ð° одній лінії чаÑу"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "Ñервери розійшлиÑÑŒ в позиції WAL %X/%X на лінії чаÑу %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ потрібне"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ оÑтанньої Ñпільної контрольної точки на %X/%X на лінії чаÑу %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÑпиÑку файлів із джерела"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÑпиÑку цільових файлів"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL у цілі"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "треба Ñкопіювати %lu МБ (загальний розмір каталогу джерела Ñтановить %lu МБ)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ каталогу даних"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "Готово!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "жодних дій щодо файлу \"%s\" не прийнÑто"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "вихідну ÑиÑтему було змінено під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ pg_rewind"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "вихідна ÑиÑтема була в неочікуваному Ñтані наприкінці перемотуваннÑ"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "початковий Ñ– цільовий клаÑтер належать до різних ÑиÑтем"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "клаÑтери не ÑуміÑні з даною верÑією pg_rewind"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "цільовий Ñервер потребує викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми даних або \"wal_log_hints = on\""
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "цільовий Ñервер повинен бути вимкненим штатно"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "робота з початковим каталогом даних повинна бути завершена штатно"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "Ñкопійовано %*s/%s кБ (%d%%)"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñпільного предка ліній чаÑу початкового та цільового клаÑтерів"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "буфер Ð´Ð»Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ð°Ð»Ð¸Ð¹"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "неочікуваний контрольний файл CRC"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "неочікуваний розмір контрольного файлу %d, очікувалоÑÑ %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d"
+msgstr[1] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d"
+msgstr[2] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d"
+msgstr[3] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "команда restore_command не вÑтановлена в цільовому клаÑтері"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ñерверу, щоб завершити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "не вдалоÑÑ Ð²Ð²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ однокориÑтувацький режим postgres в цільовому клаÑтері"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "Команда була: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "ÑинтакÑична помилка у файлі Ñ–Ñторії: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "ОчікуєтьÑÑ Ñ‡Ð¸Ñловий ідентифікатор лінії чаÑу."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "ОчікуєтьÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ випереджувального журналюваннÑ."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "неприпуÑтимі дані у файлу Ñ–Ñторії: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "Ідентифікатори ліній чаÑу повинні збільшуватиÑÑŒ."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "неприпуÑтимі дані у файлі Ñ–Ñторії"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Ідентифікатори ліній чаÑу повинні бути меншими від ідентифікатора дочірньої лінії."
+
+#: xlogreader.c:621
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "неприпуÑтиме Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу в %X/%X: очікувалоÑÑŒ хоча б %u, отримано %u"
+
+#: xlogreader.c:630
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "по зÑуву %X/%X запитано Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу"
+
+#: xlogreader.c:671 xlogreader.c:1136
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "неприпуÑтима довжина запиÑу %X/%X: очікувалаÑÑŒ мінімум %u, отримано %u"
+
+#: xlogreader.c:760
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "немає Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ contrecord в позиції %X/%X"
+
+#: xlogreader.c:773
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "неприпуÑтима довжина contrecord %u (очікувалоÑÑŒ %lld) на %X/%X"
+
+#: xlogreader.c:1144
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "невірний ID менеджера реÑурÑів %u в %X/%X"
+
+#: xlogreader.c:1157 xlogreader.c:1173
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· неправильним попереднім поÑиланнÑм %X/%X на %X/%X"
+
+#: xlogreader.c:1211
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "некоректна контрольна Ñума даних менеджера реÑурÑів у запиÑу по зÑуву %X/%X"
+
+#: xlogreader.c:1245
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "невірне магічне чиÑло %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u"
+
+#: xlogreader.c:1260 xlogreader.c:1302
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "невірні інформаційні біти %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u"
+
+#: xlogreader.c:1276
+#, 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:1284
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний розмір Ñегменту в заголовку Ñторінки"
+
+#: xlogreader.c:1290
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний XLOG_BLCKSZ в заголовку Ñторінки"
+
+#: xlogreader.c:1322
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "неочікуваний pageaddr %X/%X у Ñегменті WAL %s, LSN %X/%X, Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %u"
+
+#: xlogreader.c:1348
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑÑ‚Ñ– ID лінії чаÑу %u (піÑÐ»Ñ %u) у Ñегменті WAL %s, LSN %X/%X, зÑув %u"
+
+#: xlogreader.c:1754
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X"
+
+#: xlogreader.c:1778
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але немає даних в позиції %X/%X"
+
+#: xlogreader.c:1785
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але довжина даних дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1821
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u, при довжині образу блока %u в позиції %X/%X"
+
+#: xlogreader.c:1837
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE не вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u в позиції %X/%X"
+
+#: xlogreader.c:1851
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED вÑтановлений, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1866
+#, 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 не вÑтановлені, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1882
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL вÑтановлений, але попереднє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ задано в позиції %X/%X"
+
+#: xlogreader.c:1894
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "невірний ідентифікатор блоку %u в позиції %X/%X"
+
+#: xlogreader.c:1961
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· невірною довжиною на %X/%X"
+
+#: xlogreader.c:1987
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ блок резервної копії з ID %d у запиÑÑ– WAL"
+
+#: xlogreader.c:2071
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним вказаним блоком %d"
+
+#: xlogreader.c:2078
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним Ñтаном, блок %d"
+
+#: xlogreader.c:2105 xlogreader.c:2122
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² %X/%X, ÑтиÑнуте %s, не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d"
+
+#: xlogreader.c:2131
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X ÑтиÑнуте з невідомим методом, блок %d"
+
+#: xlogreader.c:2139
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° %X/%X, блок %d"
+
diff --git a/src/bin/pg_rewind/po/zh_CN.po b/src/bin/pg_rewind/po/zh_CN.po
new file mode 100644
index 0000000..28d76c3
--- /dev/null
+++ b/src/bin/pg_rewind/po/zh_CN.po
@@ -0,0 +1,959 @@
+# LANGUAGE message translation file for pg_rewind
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:48+0000\n"
+"PO-Revision-Date: 2021-08-15 10:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/restricted_token.c:64
+#, c-format
+msgid "could not load library \"%s\": error code %lu"
+msgstr "无法加载库 \"%s\": é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:73
+#, c-format
+msgid "cannot create restricted tokens on this platform: error code %lu"
+msgstr "无法为该平å°åˆ›å»ºå—é™åˆ¶çš„令牌:é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:82
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "无法打开进程令牌 (token): é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:97
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "无法分é…SID: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:119
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "无法创建å—é™ä»¤ç‰Œ: 错误ç ä¸º %lu"
+
+#: ../../common/restricted_token.c:140
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "无法为命令 \"%s\"创建进程: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:178
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "无法使用å—é™ä»¤ç‰Œå†æ¬¡æ‰§è¡Œ: é”™è¯¯ç  %lu"
+
+#: ../../common/restricted_token.c:194
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "无法从å­è¿›ç¨‹å¾—到退出ç : é”™è¯¯ç  %lu"
+
+#: ../../fe_utils/archive.c:53
+#, c-format
+msgid "cannot use restore_command with %%r placeholder"
+msgstr "无法对%%rå ä½ç¬¦ä½¿ç”¨restore_command"
+
+#: ../../fe_utils/archive.c:74
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\"çš„æ„外文件大å°ï¼š%lld而ä¸æ˜¯%lld"
+
+#: ../../fe_utils/archive.c:85
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "无法打开从存档还原的文件\"%s\": %m"
+
+#: ../../fe_utils/archive.c:97 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法å–文件 \"%s\" 的状æ€: %m"
+
+#: ../../fe_utils/archive.c:112
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command失败: %s"
+
+#: ../../fe_utils/archive.c:121
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "无法从存档还原文件\"%s\""
+
+#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49
+#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100
+#: ../../fe_utils/recovery_gen.c:171 parsexlog.c:77 parsexlog.c:135
+#: parsexlog.c:195
+#, c-format
+msgid "out of memory"
+msgstr "内存ä¸è¶³"
+
+#: ../../fe_utils/recovery_gen.c:134 parsexlog.c:308
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:140
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: ../../fe_utils/recovery_gen.c:152
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "无法创建文件 \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "无法打开目标文件\"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "无法关闭目标文件\"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "无法在目标文件\"%s\"中定ä½ï¼ˆseek): %m"
+
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "无法写入文件 \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "ä¸å¯è¯†åˆ«çš„æ–‡ä»¶æ ¼å¼ \"%s\""
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "对常规文件无效的动作(CREATE)"
+
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "无法删除文件 \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "无法打开文件\"%s\"用于截断:%m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "无法将文件\"%s\"截断为%u:%m"
+
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "无法创建目录 \"%s\": %m"
+
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "无法删除目录 \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "无法在\"%s\"创建符å·é“¾æŽ¥: %m"
+
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "无法删除符å·é“¾æŽ¥ \"%s\": %m"
+
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "为了读å–, 无法打开文件 \"%s\": %m"
+
+#: file_ops.c:341 local_source.c:107 parsexlog.c:346
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读å–文件 \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:348
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "无法读å–文件\"%1$s\":读å–了%3$zu中的%2$d"
+
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: file_ops.c:446
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m"
+
+#: file_ops.c:449
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "符å·é“¾æŽ¥ \"%s\" 目标超长"
+
+#: file_ops.c:464
+#, c-format
+msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform"
+msgstr "\"%s\"是一个符å·é“¾æŽ¥ï¼Œä½†æ˜¯è¿™ä¸ªå¹³å°ä¸Šä¸æ”¯æŒå¹³å°é“¾æŽ¥"
+
+#: file_ops.c:471
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "无法读å–目录 \"%s\": %m"
+
+#: file_ops.c:475
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: filemap.c:237
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "æºå¤´çš„æ•°æ®æ–‡ä»¶\"%s\"ä¸æ˜¯ä¸€ä¸ªå¸¸è§„文件"
+
+#: filemap.c:242 filemap.c:275
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "å¤åˆ¶æºæ–‡ä»¶\"%s\""
+
+#: filemap.c:330
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "éžå¸¸è§„文件\"%s\"çš„æ„外页é¢ä¿®æ”¹"
+
+#: filemap.c:680 filemap.c:774
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\"的未知文件类型"
+
+#: filemap.c:707
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "文件 \"%s\"在æºå’Œç›®æ ‡ä¸­çš„类型ä¸åŒ"
+
+#: filemap.c:779
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "无法决定如何处ç†æ–‡ä»¶\"%s\""
+
+#: libpq_source.c:128
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "无法清除search_path: %s"
+
+#: libpq_source.c:139
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "æºæœåŠ¡å™¨ä¸­çš„full_page_writes必须被å¯ç”¨"
+
+#: libpq_source.c:150
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "无法准备语å¥ä»¥èŽ·å–文件内容: %s"
+
+#: libpq_source.c:169
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "æºæœåŠ¡å™¨ä¸­æœ‰é”™è¯¯è¿è¡Œçš„查询(%s):%s"
+
+#: libpq_source.c:174
+#, c-format
+msgid "unexpected result set from query"
+msgstr "从查询得到æ„料之外的结果集"
+
+#: libpq_source.c:196
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "æºæœåŠ¡å™¨ä¸­æœ‰é”™è¯¯è¿è¡Œçš„查询(%s):%s"
+
+#: libpq_source.c:217
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "当å‰WALæ’å…¥ä½ç½®çš„未识别结果\"%s\""
+
+#: libpq_source.c:268
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "无法å–得文件列表:%s"
+
+#: libpq_source.c:273
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "在å–得文件列表时得到æ„料之外的结果集"
+
+#: libpq_source.c:435
+#, c-format
+msgid "could not send query: %s"
+msgstr "无法å‘é€æŸ¥è¯¢ï¼š%s"
+
+#: libpq_source.c:438
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "无法设置libpq连接为å•è¡Œæ¨¡å¼"
+
+#: libpq_source.c:468
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "在å–得远程文件时得到æ„料之外的结果:%s"
+
+#: libpq_source.c:473
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "收到的数æ®å—比请求的多"
+
+#: libpq_source.c:477
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "在å–得远程文件时得到æ„料之外的结果集大å°"
+
+#: libpq_source.c:483
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "在å–得远程文件时结果集中有æ„料之外的数æ®ç±»åž‹ï¼š%u %u %u"
+
+#: libpq_source.c:491
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "在å–得远程文件时得到æ„料之外的结果格å¼"
+
+#: libpq_source.c:497
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "在å–得远程文件时结果中有æ„料之外的空值"
+
+#: libpq_source.c:501
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "在å–得远程文件时得到æ„料之外的结果长度"
+
+#: libpq_source.c:534
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "当为文件\"%2$s\"请求时,接收到文件\"%1$s\"çš„æ•°æ®"
+
+#: libpq_source.c:538
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "当请求å移é‡%3$lld时,在文件\"%2$s\"çš„å移é‡%1$lld处接收到数æ®"
+
+#: libpq_source.c:550
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "收到的文件\"%s\"比è¦æ±‚的多"
+
+#: libpq_source.c:563
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "接收到æ„外的数æ®å—æ•°"
+
+#: libpq_source.c:606
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "无法å–得远程文件\"%s\": %s"
+
+#: libpq_source.c:611
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "在å–得远程文件\"%s\"时得到æ„料之外的结果集"
+
+#: local_source.c:86
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "无法打开æºæ–‡ä»¶\"%s\": %m"
+
+#: local_source.c:90
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "无法在æºæ–‡ä»¶ä¸­å®šä½ï¼ˆseek):%m"
+
+#: local_source.c:109
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "读å–文件\"%s\"æ—¶é‡åˆ°æ„料之外的EOF"
+
+#: local_source.c:116
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: parsexlog.c:89 parsexlog.c:142
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "无法读å–%X/%X处的WAL记录:%s"
+
+#: parsexlog.c:93 parsexlog.c:145
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "无法读å–%X/%X处的WAL记录"
+
+#: parsexlog.c:208
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "无法在%X/%X找到å‰ä¸€ä¸ªWAL记录:%s"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "无法在%X/%X找到å‰ä¸€ä¸ªWAL记录"
+
+#: parsexlog.c:337
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "无法在文件\"%s\"进行查找: %m"
+
+#: parsexlog.c:429
+#, c-format
+msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmgr: %s, info: %02X"
+msgstr "WAL记录修改了一个关系,但是记录类型无法识别: lsn: %X/%X, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:84
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s用一个PostgreSQL集簇的å¦ä¸€ä¸ªæ‹·è´é‡æ–°åŒæ­¥äº†è¯¥é›†ç°‡ã€‚\n"
+"\n"
+
+#: pg_rewind.c:85
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [选项]...\n"
+"\n"
+
+#: pg_rewind.c:86
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_rewind.c:87
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal 在目标é…置中使用restore_command\n"
+" 从存档中检索WAL文件\n"
+
+#: pg_rewind.c:89
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY 已有的è¦ä¿®æ”¹çš„æ•°æ®ç›®å½•\n"
+
+#: pg_rewind.c:90
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY è¦ä¸Žä¹‹åŒæ­¥çš„æºæ•°æ®ç›®å½•\n"
+
+#: pg_rewind.c:91
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR è¦ä¸Žä¹‹åŒæ­¥çš„æºæœåŠ¡å™¨\n"
+
+#: pg_rewind.c:92
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 在修改任何东西之å‰åœæ­¢\n"
+
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr ""
+" -N, --no-sync ä¸ç”¨ç­‰å¾…å˜åŒ–安全\n"
+" 写入ç£ç›˜\n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 写出进度消æ¯\n"
+
+#: pg_rewind.c:96
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr ""
+" -R, --write-recovery-conf 为å¤åˆ¶å†™é…置文\n"
+" (requires --source-server)\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 写出很多调试消æ¯\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown ä¸è¦è‡ªåŠ¨ä¿®å¤ä¸å¹²å‡€çš„关机\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯ï¼Œç„¶åŽé€€å‡º\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示本帮助,然åŽé€€å‡º\n"
+
+#: pg_rewind.c:102
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_rewind.c:164 pg_rewind.c:213 pg_rewind.c:220 pg_rewind.c:227
+#: pg_rewind.c:234 pg_rewind.c:242
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_rewind.c:212
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "æ²¡æœ‰æŒ‡å®šæº (--source-pgdata 或者 --source-server)"
+
+#: pg_rewind.c:219
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "åªèƒ½æŒ‡å®š--source-pgdataå’Œ--source-server这两个选项之一"
+
+#: pg_rewind.c:226
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "没有指定目标数æ®ç›®å½• (--target-pgdata)"
+
+#: pg_rewind.c:233
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "没有为--write-recovery-conf指定æºæœåŠ¡å™¨ä¿¡æ¯ï¼ˆ--source-server)"
+
+#: pg_rewind.c:240
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_rewind.c:255
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "ä¸èƒ½ç”±\"root\"执行"
+
+#: pg_rewind.c:256
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser.\n"
+msgstr "您现在作为PostgreSQL超级用户è¿è¡Œ%s.\n"
+
+#: pg_rewind.c:267
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "没有读å–目录 \"%s\" çš„æƒé™: %m"
+
+#: pg_rewind.c:287
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:290
+#, c-format
+msgid "connected to server"
+msgstr "已连接æœåŠ¡å™¨"
+
+#: pg_rewind.c:337
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "æºé›†ç°‡å’Œç›®æ ‡é›†ç°‡å¤„于åŒä¸€æ—¶é—´çº¿"
+
+#: pg_rewind.c:346
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "æœåŠ¡å™¨åœ¨æ—¶é—´çº¿%3$u上的WALä½ç½®%1$X/%2$X处å‘生了分歧"
+
+#: pg_rewind.c:394
+#, c-format
+msgid "no rewind required"
+msgstr "ä¸éœ€è¦å€’带(rewind)"
+
+#: pg_rewind.c:403
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "从时间线%3$u上%1$X/%2$X处的最åŽä¸€ä¸ªæ™®é€šæ£€æŸ¥ç‚¹å€’带"
+
+#: pg_rewind.c:413
+#, c-format
+msgid "reading source file list"
+msgstr "读å–æºæ–‡ä»¶åˆ—表"
+
+#: pg_rewind.c:417
+#, c-format
+msgid "reading target file list"
+msgstr "读å–目标文件列表"
+
+#: pg_rewind.c:426
+#, c-format
+msgid "reading WAL in target"
+msgstr "读å–目标中的WAL"
+
+#: pg_rewind.c:447
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "需è¦å¤åˆ¶ %lu MB(整个æºç›®å½•çš„大å°æ˜¯ %lu MB)"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "syncing target data directory"
+msgstr "正在åŒæ­¥ç›®æ ‡æ•°æ®ç›®å½•"
+
+#: pg_rewind.c:481
+#, c-format
+msgid "Done!"
+msgstr "完æˆï¼"
+
+#: pg_rewind.c:564
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "未决定对文件\"%s\"执行任何æ“作"
+
+#: pg_rewind.c:596
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "pg_rewindè¿è¡Œæ—¶ä¿®æ”¹äº†æºç³»ç»Ÿ"
+
+#: pg_rewind.c:600
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "正在创建备份标签并且更新控制文件"
+
+#: pg_rewind.c:650
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "æºç³»ç»Ÿåœ¨rewind结æŸæ—¶å¤„于æ„外状æ€"
+
+#: pg_rewind.c:681
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "æºé›†ç°‡å’Œç›®æ ‡é›†ç°‡æ¥è‡ªä¸åŒçš„系统"
+
+#: pg_rewind.c:689
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "集簇与这个pg_rewind的版本ä¸å…¼å®¹"
+
+#: pg_rewind.c:699
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "目标æœåŠ¡å™¨éœ€è¦ä½¿ç”¨æ•°æ®æ ¡éªŒå’Œæˆ–者让\"wal_log_hints = on\""
+
+#: pg_rewind.c:710
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "目标æœåŠ¡å™¨å¿…须被干净地关闭"
+
+#: pg_rewind.c:720
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "æºæ•°æ®ç›®å½•å¿…须被干净地关闭"
+
+#: pg_rewind.c:772
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "å·²å¤åˆ¶%*s/%s kB (%d%%)"
+
+#: pg_rewind.c:835
+#, c-format
+msgid "invalid control file"
+msgstr "无效的控制文件"
+
+#: pg_rewind.c:919
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "无法找到æºé›†ç°‡å’Œç›®æ ‡é›†ç°‡çš„时间线的共åŒç¥–å…ˆ"
+
+#: pg_rewind.c:960
+#, c-format
+msgid "backup label buffer too small"
+msgstr "备份标签缓冲太å°"
+
+#: pg_rewind.c:983
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "æ„料之外的控制文件CRC"
+
+#: pg_rewind.c:995
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "æ„料之外的控制文件大å°%d,应该是%d"
+
+#: pg_rewind.c:1004
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL段大å°å¿…须是1 MB到1 GB之间的2的幂,但控制文件指定了%d字节"
+msgstr[1] "WAL段大å°å¿…须是1 MB到1 GB之间的2的幂,但控制文件指定了%d字节"
+
+#: pg_rewind.c:1043 pg_rewind.c:1101
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需è¦ç¨‹åº\"%1$s\"\n"
+"但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n"
+"检查您的安装."
+
+#: pg_rewind.c:1048 pg_rewind.c:1106
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程åº\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本ä¸åŒ.\n"
+"检查您的安装."
+
+#: pg_rewind.c:1069
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "目标群集中未设置restore_command"
+
+#: pg_rewind.c:1112
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "对目标æœåŠ¡å™¨æ‰§è¡Œ\"%s\"以完æˆå´©æºƒæ¢å¤"
+
+#: pg_rewind.c:1132
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "目标群集中的postgreså•ç”¨æˆ·æ¨¡å¼å¤±è´¥"
+
+#: pg_rewind.c:1133
+#, c-format
+msgid "Command was: %s"
+msgstr "命令是: %s"
+
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "历å²æ–‡ä»¶ä¸­çš„语法错误: %s"
+
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "期望一个数字 timeline ID."
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "期望一个预写日志切æ¢ç‚¹ä½ç½®."
+
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "历å²æ–‡ä»¶ä¸­çš„无效数æ®: %s"
+
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "TimeLine ID 必须为递增åºåˆ—."
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "历å²æ–‡ä»¶ä¸­æœ‰æ— æ•ˆæ•°æ®"
+
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "Timeline ID å¿…é¡»å°äºŽå­ timeline çš„ ID."
+
+#: xlogreader.c:349
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "%X/%X处有无效的记录å移é‡"
+
+#: xlogreader.c:357
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xä½ç½®å¤„è¦æ±‚继续记录"
+
+#: xlogreader.c:398 xlogreader.c:695
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "%X/%X处有无效记录长度: 应该是%u, 但实际是%u"
+
+#: xlogreader.c:422
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$X处的记录长度%1$u太长"
+
+#: xlogreader.c:453
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "在%X/%X处没有继续记录标志"
+
+#: xlogreader.c:466
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "%3$X/%4$X处有无效的继续记录长度%1$u(应为 %2$lld)"
+
+#: xlogreader.c:703
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$X处有无效的资æºç®¡ç†å™¨ ID %1$u"
+
+#: xlogreader.c:716 xlogreader.c:732
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "具有ä¸æ­£ç¡®å‘å‰é“¾æŽ¥%X/%X的记录出现在%X/%X"
+
+#: xlogreader.c:768
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "在%X/%X处的记录中的资æºç®¡ç†å™¨æ•°æ®æ ¡éªŒå’Œä¸æ­£ç¡®"
+
+#: xlogreader.c:805
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "在日志段%2$sçš„å移é‡%3$u处有无效的magicå·%1$04X"
+
+#: xlogreader.c:819 xlogreader.c:860
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "在日志段%2$sçš„å移é‡%3$u处有无效的infoä½%1$04X"
+
+#: xlogreader.c:834
+#, 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:842
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL文件æ¥è‡ªäºŽä¸åŒçš„æ•°æ®åº“系统:页头部中有ä¸æ­£ç¡®çš„段大å°"
+
+#: xlogreader.c:848
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL文件æ¥è‡ªäºŽä¸åŒçš„æ•°æ®åº“系统:页头部中有ä¸æ­£ç¡®çš„XLOG_BLCKSZ"
+
+#: xlogreader.c:879
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "在日志段%3$sçš„å移é‡%4$u处有æ„料之外的pageaddr %1$X/%2$X"
+
+#: xlogreader.c:904
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "在日志段%3$sçš„å移é‡%4$u处有失åºçš„时间线 ID %1$u(在%2$u之åŽï¼‰"
+
+#: xlogreader.c:1249
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "在%2$X/%3$X处有无åºçš„block_id %1$u"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA已被设置,但是在%X/%X处没有包括数æ®"
+
+#: xlogreader.c:1278
+#, 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:1314
+#, 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:1330
+#, 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:1345
+#, c-format
+msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED已被设置,但是%2$X/%3$X处记录的å—映åƒé•¿åº¦ä¸º%1$u"
+
+#: xlogreader.c:1360
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLEå’ŒBKPIMAGE_IS_COMPRESSED都没有被设置,但是%2$X/%3$X处记录的å—映åƒé•¿åº¦ä¸º%1$u"
+
+#: xlogreader.c:1376
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "设置了BKPBLOCK_SAME_REL,但是在%X/%Xä½ç½®æ²¡æœ‰è®°å½•å…ˆå‰çš„关系"
+
+#: xlogreader.c:1388
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%2$X/%3$X处的block_id %1$u无效"
+
+#: xlogreader.c:1475
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "在%X/%X处的记录的长度无效"
+
+#: xlogreader.c:1564
+#, c-format
+msgid "invalid compressed image at %X/%X, block %d"
+msgstr "%X/%X处是å—%d的无效压缩映åƒ"
diff --git a/src/bin/pg_rewind/po/zh_TW.po b/src/bin/pg_rewind/po/zh_TW.po
new file mode 100644
index 0000000..d4593b9
--- /dev/null
+++ b/src/bin/pg_rewind/po/zh_TW.po
@@ -0,0 +1,1093 @@
+# Traditional Chinese message translation file for pg_rewind
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_rewind (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_rewind (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:51+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體用盡\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+# utils/misc/guc.c:3792
+#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118
+#, c-format
+msgid "invalid value for parameter \"%s\": \"%s\""
+msgstr "給åƒæ•¸\"%s\"的值ä¸åˆæ³•: \"%s\""
+
+#: ../../common/percentrepl.c:80
+#, c-format
+msgid "String ends unexpectedly after escape character \"%%\"."
+msgstr "字串在轉義字元 \"%%\" 後æ„外çµæŸã€‚"
+
+#: ../../common/percentrepl.c:119
+#, c-format
+msgid "String contains unexpected placeholder \"%%%c\"."
+msgstr "字串包å«éžé æœŸçš„ä½”ä½ç¬¦ \"%%%c\"。"
+
+# port/win32/security.c:39
+#: ../../common/restricted_token.c:60
+#, c-format
+msgid "could not open process token: error code %lu"
+msgstr "無法開啟行程 token: 錯誤碼 %lu"
+
+# port/pg_sema.c:117 port/sysv_sema.c:117
+#: ../../common/restricted_token.c:74
+#, c-format
+msgid "could not allocate SIDs: error code %lu"
+msgstr "無法é…ç½® SID: 錯誤碼 %lu"
+
+# port/win32/signal.c:239
+#: ../../common/restricted_token.c:94
+#, c-format
+msgid "could not create restricted token: error code %lu"
+msgstr "無法建立å—é™ token: 錯誤碼 %lu"
+
+#: ../../common/restricted_token.c:115
+#, c-format
+msgid "could not start process for command \"%s\": error code %lu"
+msgstr "無法為指令 \"%s\" 啟動行程: 錯誤碼 %lu"
+
+# port/win32/signal.c:239
+#: ../../common/restricted_token.c:153
+#, c-format
+msgid "could not re-execute with restricted token: error code %lu"
+msgstr "無法使用å—é™ token é‡æ–°åŸ·è¡Œ: 錯誤碼 %lu"
+
+#: ../../common/restricted_token.c:168
+#, c-format
+msgid "could not get exit code from subprocess: error code %lu"
+msgstr "無法從å­è¡Œç¨‹å–å¾—çµæŸç¢¼: 錯誤碼 %lu"
+
+#: ../../fe_utils/archive.c:69
+#, c-format
+msgid "unexpected file size for \"%s\": %lld instead of %lld"
+msgstr "\"%s\" 的檔案大å°èˆ‡é æœŸä¸åŒ: %lld 而ä¸æ˜¯ %lld"
+
+#: ../../fe_utils/archive.c:77
+#, c-format
+msgid "could not open file \"%s\" restored from archive: %m"
+msgstr "無法開啟從å°å­˜æª”還原的檔案 \"%s\": %m"
+
+# access/transam/xlog.c:1936 access/transam/xlog.c:2038
+# access/transam/xlog.c:5291
+#: ../../fe_utils/archive.c:86 file_ops.c:417
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "無法å–得檔案 \"%s\" 的狀態: %m"
+
+#: ../../fe_utils/archive.c:98
+#, c-format
+msgid "restore_command failed: %s"
+msgstr "restore_command 失敗: %s"
+
+#: ../../fe_utils/archive.c:105
+#, c-format
+msgid "could not restore file \"%s\" from archive"
+msgstr "無法從å°å­˜æª”還原檔案 \"%s\""
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45
+#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90
+#: ../../fe_utils/recovery_gen.c:149
+#, c-format
+msgid "out of memory"
+msgstr "記憶體ä¸è¶³"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案 \"%s\": %m"
+
+# access/transam/xlog.c:1555 access/transam/xlog.c:1679
+# access/transam/xlog.c:2964 access/transam/xlog.c:3002 commands/copy.c:1117
+# commands/tablespace.c:668 commands/tablespace.c:674
+# postmaster/postmaster.c:3430 utils/init/miscinit.c:832
+# utils/init/miscinit.c:841 utils/misc/guc.c:4934 utils/misc/guc.c:4998
+#: ../../fe_utils/recovery_gen.c:124
+#, c-format
+msgid "could not write to file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+# access/transam/slru.c:645 access/transam/xlog.c:1526
+# access/transam/xlog.c:1646 access/transam/xlog.c:2911
+# access/transam/xlog.c:5308 access/transam/xlog.c:5426
+# postmaster/postmaster.c:3366
+#: ../../fe_utils/recovery_gen.c:133
+#, c-format
+msgid "could not create file \"%s\": %m"
+msgstr "無法建立檔案 \"%s\": %m"
+
+#: file_ops.c:67
+#, c-format
+msgid "could not open target file \"%s\": %m"
+msgstr "無法開啟目標檔 \"%s\": %m"
+
+#: file_ops.c:81
+#, c-format
+msgid "could not close target file \"%s\": %m"
+msgstr "無法關閉目標檔 \"%s\": %m"
+
+#: file_ops.c:101
+#, c-format
+msgid "could not seek in target file \"%s\": %m"
+msgstr "無法在目標檔 \"%s\" 中 seek: %m"
+
+# access/transam/xlog.c:5319 access/transam/xlog.c:5439
+#: file_ops.c:117
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+#: file_ops.c:150 file_ops.c:177
+#, c-format
+msgid "undefined file type for \"%s\""
+msgstr "\"%s\" 的檔案類型未定義"
+
+#: file_ops.c:173
+#, c-format
+msgid "invalid action (CREATE) for regular file"
+msgstr "å°æ–¼ä¸€èˆ¬æª”案無效的動作(CREATE)"
+
+# access/transam/xlog.c:1944 access/transam/xlog.c:5453
+# access/transam/xlog.c:5607 postmaster/postmaster.c:3504
+#: file_ops.c:200
+#, c-format
+msgid "could not remove file \"%s\": %m"
+msgstr "無法刪除檔案 \"%s\": %m"
+
+#: file_ops.c:218
+#, c-format
+msgid "could not open file \"%s\" for truncation: %m"
+msgstr "無法開啟檔案 \"%s\" 進行縮短: %m"
+
+#: file_ops.c:222
+#, c-format
+msgid "could not truncate file \"%s\" to %u: %m"
+msgstr "無法將檔案 \"%s\" 縮短到 %u: %m"
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: file_ops.c:238
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄 \"%s\": %m"
+
+# commands/tablespace.c:610
+#: file_ops.c:252
+#, c-format
+msgid "could not remove directory \"%s\": %m"
+msgstr "無法刪除目錄 \"%s\": %m"
+
+#: file_ops.c:266
+#, c-format
+msgid "could not create symbolic link at \"%s\": %m"
+msgstr "無法在 \"%s\" 建立符號連çµ: %m"
+
+# commands/tablespace.c:355 commands/tablespace.c:984
+#: file_ops.c:280
+#, c-format
+msgid "could not remove symbolic link \"%s\": %m"
+msgstr "無法刪除symbolic link \"%s\": %m"
+
+# commands/copy.c:1031
+#: file_ops.c:326 file_ops.c:330
+#, c-format
+msgid "could not open file \"%s\" for reading: %m"
+msgstr "無法開啟檔案 \"%s\" 進行讀å–: %m"
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "無法讀å–檔案 \"%s\": %m"
+
+#: file_ops.c:344 parsexlog.c:352
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "無法讀å–檔案 \"%s\": å·²è®€å– %d / %zu"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: file_ops.c:388
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄 \"%s\": %m"
+
+# commands/tablespace.c:355 commands/tablespace.c:984
+#: file_ops.c:441
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\": %m"
+
+#: file_ops.c:444
+#, c-format
+msgid "symbolic link \"%s\" target is too long"
+msgstr "ç¬¦è™Ÿé€£çµ \"%s\" 的目標太長"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#: file_ops.c:462
+#, c-format
+msgid "could not read directory \"%s\": %m"
+msgstr "無法讀å–目錄\"%s\": %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: file_ops.c:466
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "無法關閉目錄 \"%s\": %m"
+
+#: filemap.c:236
+#, c-format
+msgid "data file \"%s\" in source is not a regular file"
+msgstr "來æºçš„資料檔 \"%s\" ä¸æ˜¯ä¸€èˆ¬æª”案"
+
+#: filemap.c:241 filemap.c:274
+#, c-format
+msgid "duplicate source file \"%s\""
+msgstr "é‡è¤‡çš„來æºæª” \"%s\""
+
+#: filemap.c:329
+#, c-format
+msgid "unexpected page modification for non-regular file \"%s\""
+msgstr "éžä¸€èˆ¬æª”案 \"%s\" 的資料é å‡ºç¾éžé æœŸçš„修改"
+
+#: filemap.c:679 filemap.c:773
+#, c-format
+msgid "unknown file type for \"%s\""
+msgstr "\"%s\" 的檔案類型未知"
+
+#: filemap.c:706
+#, c-format
+msgid "file \"%s\" is of different type in source and target"
+msgstr "檔案 \"%s\" 在來æºå’Œç›®æ¨™ä¸­çš„é¡žåž‹ä¸åŒ"
+
+#: filemap.c:778
+#, c-format
+msgid "could not decide what to do with file \"%s\""
+msgstr "無法決定如何處ç†æª”案 \"%s\""
+
+#: libpq_source.c:130
+#, c-format
+msgid "could not clear search_path: %s"
+msgstr "無法清除 search_path: %s"
+
+#: libpq_source.c:141
+#, c-format
+msgid "full_page_writes must be enabled in the source server"
+msgstr "來æºä¼ºæœå™¨å¿…須啟動 full_page_writes"
+
+#: libpq_source.c:152
+#, c-format
+msgid "could not prepare statement to fetch file contents: %s"
+msgstr "無法準備用來擷å–檔案內容的陳述å¼: %s"
+
+#: libpq_source.c:171
+#, c-format
+msgid "error running query (%s) on source server: %s"
+msgstr "來æºä¼ºæœå™¨åŸ·è¡ŒæŸ¥è©¢(%s)時發生錯誤: %s"
+
+#: libpq_source.c:176
+#, c-format
+msgid "unexpected result set from query"
+msgstr "查詢出ç¾éžé æœŸçš„çµæžœé›†"
+
+#: libpq_source.c:198
+#, c-format
+msgid "error running query (%s) in source server: %s"
+msgstr "來æºä¼ºæœå™¨åŸ·è¡ŒæŸ¥è©¢(%s)時發生錯誤: %s"
+
+#: libpq_source.c:219
+#, c-format
+msgid "unrecognized result \"%s\" for current WAL insert location"
+msgstr "ç„¡æ³•è­˜åˆ¥ç›®å‰ WAL æ’å…¥ä½ç½®çš„çµæžœ \"%s\""
+
+#: libpq_source.c:270
+#, c-format
+msgid "could not fetch file list: %s"
+msgstr "無法擷å–檔案清單: %s"
+
+#: libpq_source.c:275
+#, c-format
+msgid "unexpected result set while fetching file list"
+msgstr "æ“·å–檔案清單時出ç¾éžé æœŸçš„çµæžœé›†"
+
+#: libpq_source.c:467
+#, c-format
+msgid "could not send query: %s"
+msgstr "無法傳é€æŸ¥è©¢: %s"
+
+#: libpq_source.c:470
+#, c-format
+msgid "could not set libpq connection to single row mode"
+msgstr "無法將 libpq 連線設為單列模å¼"
+
+#: libpq_source.c:500
+#, c-format
+msgid "unexpected result while fetching remote files: %s"
+msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœ: %s"
+
+#: libpq_source.c:505
+#, c-format
+msgid "received more data chunks than requested"
+msgstr "收到比請求更多的資料塊"
+
+#: libpq_source.c:509
+#, c-format
+msgid "unexpected result set size while fetching remote files"
+msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœé›†å¤§å°"
+
+#: libpq_source.c:515
+#, c-format
+msgid "unexpected data types in result set while fetching remote files: %u %u %u"
+msgstr "æ“·å–é ç«¯æª”案時çµæžœé›†å‡ºç¾éžé æœŸçš„資料型別: %u %u %u"
+
+#: libpq_source.c:523
+#, c-format
+msgid "unexpected result format while fetching remote files"
+msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœæ ¼å¼"
+
+#: libpq_source.c:529
+#, c-format
+msgid "unexpected null values in result while fetching remote files"
+msgstr "æ“·å–é ç«¯æª”案時çµæžœä¸­å‡ºç¾éžé æœŸçš„ null 值"
+
+#: libpq_source.c:533
+#, c-format
+msgid "unexpected result length while fetching remote files"
+msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœé•·åº¦"
+
+#: libpq_source.c:566
+#, c-format
+msgid "received data for file \"%s\", when requested for \"%s\""
+msgstr "收到檔案 \"%s\" 的資料,但請求的是 \"%s\" 的資料"
+
+#: libpq_source.c:570
+#, c-format
+msgid "received data at offset %lld of file \"%s\", when requested for offset %lld"
+msgstr "收到檔案 \"%2$s\" ä½ç§» %1$lld 處的資料,但請求的是ä½ç§» %3$lld 的資料"
+
+#: libpq_source.c:582
+#, c-format
+msgid "received more than requested for file \"%s\""
+msgstr "收到的資料超éŽå°æª”案 \"%s\" 的請求"
+
+#: libpq_source.c:595
+#, c-format
+msgid "unexpected number of data chunks received"
+msgstr "收到éžé æœŸæ•¸é‡çš„資料塊"
+
+#: libpq_source.c:638
+#, c-format
+msgid "could not fetch remote file \"%s\": %s"
+msgstr "無法擷å–é ç«¯æª”案 \"%s\": %s"
+
+#: libpq_source.c:643
+#, c-format
+msgid "unexpected result set while fetching remote file \"%s\""
+msgstr "æ“·å–é ç«¯æª”案 \"%s\" 時出ç¾éžé æœŸçš„çµæžœé›†"
+
+#: local_source.c:90 local_source.c:142
+#, c-format
+msgid "could not open source file \"%s\": %m"
+msgstr "無法開啟來æºæª” \"%s\": %m"
+
+#: local_source.c:117
+#, c-format
+msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied"
+msgstr "來æºæª” \"%s\" 的大å°åŒæ™‚發生變化: é æœŸ %d ä½å…ƒçµ„,已複製 %d ä½å…ƒçµ„"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: local_source.c:121 local_source.c:172
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "無法關閉檔案 \"%s\": %m"
+
+#: local_source.c:146
+#, c-format
+msgid "could not seek in source file: %m"
+msgstr "無法在來æºæª”中 seek: %m"
+
+#: local_source.c:165
+#, c-format
+msgid "unexpected EOF while reading file \"%s\""
+msgstr "讀å–檔案 \"%s\" 時發生é æœŸå¤–çš„ EOF"
+
+#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "é…ç½® WAL 讀å–處ç†å™¨æ™‚耗盡記憶體"
+
+#: parsexlog.c:92 parsexlog.c:146
+#, c-format
+msgid "could not read WAL record at %X/%X: %s"
+msgstr "無法讀å–å…ˆå‰çš„ WAL 紀錄,ä½ç½® %X/%X: %s"
+
+#: parsexlog.c:96 parsexlog.c:149
+#, c-format
+msgid "could not read WAL record at %X/%X"
+msgstr "無法讀å–å…ˆå‰çš„ WAL 紀錄,ä½ç½® %X/%X"
+
+#: parsexlog.c:108
+#, c-format
+msgid "end pointer %X/%X is not a valid end point; expected %X/%X"
+msgstr "çµæŸæŒ‡æ¨™ %X/%X ä¸æ˜¯æœ‰æ•ˆçš„çµæŸé»žï¼Œé æœŸæ˜¯ %X/%X"
+
+#: parsexlog.c:212
+#, c-format
+msgid "could not find previous WAL record at %X/%X: %s"
+msgstr "無法找到先å‰çš„ WAL 紀錄,ä½ç½® %X/%X: %s"
+
+#: parsexlog.c:216
+#, c-format
+msgid "could not find previous WAL record at %X/%X"
+msgstr "無法找到先å‰çš„ WAL 紀錄,ä½ç½® %X/%X"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: parsexlog.c:341
+#, c-format
+msgid "could not seek in file \"%s\": %m"
+msgstr "無法 seek 檔案 \"%s\": %m"
+
+#: parsexlog.c:440
+#, 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 紀錄修改了關è¯ï¼Œä½†ç„¡æ³•è­˜åˆ¥è¨˜éŒ„é¡žåž‹: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X"
+
+#: pg_rewind.c:92
+#, c-format
+msgid ""
+"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n"
+"\n"
+msgstr ""
+"%s å°‡ PostgreSQL å¢é›†èˆ‡å¦ä¸€å€‹å¢é›†é‡æ–°åŒæ­¥\n"
+"\n"
+
+# postmaster/postmaster.c:1016
+#: pg_rewind.c:93
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]...\n"
+"\n"
+msgstr ""
+"用法: \n"
+" %s [OPTION]...\n"
+"\n"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: pg_rewind.c:94
+#, c-format
+msgid "Options:\n"
+msgstr "é¸é …: \n"
+
+#: pg_rewind.c:95
+#, c-format
+msgid ""
+" -c, --restore-target-wal use restore_command in target configuration to\n"
+" retrieve WAL files from archives\n"
+msgstr ""
+" -c, --restore-target-wal 使用目標設定中的 restore_command 來擷å–\n"
+" å°å­˜æª”中的 WAL 檔\n"
+
+#: pg_rewind.c:97
+#, c-format
+msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n"
+msgstr " -D, --target-pgdata=DIRECTORY è¦ä¿®æ”¹çš„ç¾æœ‰è³‡æ–™ç›®éŒ„\n"
+
+#: pg_rewind.c:98
+#, c-format
+msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n"
+msgstr " --source-pgdata=DIRECTORY è¦åŒæ­¥çš„來æºè³‡æ–™ç›®éŒ„\n"
+
+#: pg_rewind.c:99
+#, c-format
+msgid " --source-server=CONNSTR source server to synchronize with\n"
+msgstr " --source-server=CONNSTR è¦åŒæ­¥çš„來æºä¼ºæœå™¨\n"
+
+#: pg_rewind.c:100
+#, c-format
+msgid " -n, --dry-run stop before modifying anything\n"
+msgstr " -n, --dry-run 在修改任何內容之å‰åœæ­¢\n"
+
+#: pg_rewind.c:101
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written\n"
+" safely to disk\n"
+msgstr " -N, --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n"
+
+#: pg_rewind.c:103
+#, c-format
+msgid " -P, --progress write progress messages\n"
+msgstr " -P, --progress 顯示進度資訊\n"
+
+#: pg_rewind.c:104
+#, c-format
+msgid ""
+" -R, --write-recovery-conf write configuration for replication\n"
+" (requires --source-server)\n"
+msgstr " -R, --write-recovery-conf 寫入複寫組態(éœ€è¦ --source-server)\n"
+
+#: pg_rewind.c:106
+#, c-format
+msgid ""
+" --config-file=FILENAME use specified main server configuration\n"
+" file when running target cluster\n"
+msgstr " --config-file=FILENAME 執行目標å¢é›†æ™‚使用指定的主伺æœå™¨çµ„æ…‹\n"
+
+#: pg_rewind.c:108
+#, c-format
+msgid " --debug write a lot of debug messages\n"
+msgstr " --debug 輸出大é‡é™¤éŒ¯è¨Šæ¯\n"
+
+#: pg_rewind.c:109
+#, c-format
+msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n"
+msgstr " --no-ensure-shutdown ä¸è‡ªå‹•ä¿®å¾©ä¸æ­£å¸¸åœæ­¢\n"
+
+#: pg_rewind.c:110
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_rewind.c:111
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_rewind.c:112
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_rewind.c:113
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245
+#: pg_rewind.c:252 pg_rewind.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_rewind.c:230
+#, c-format
+msgid "no source specified (--source-pgdata or --source-server)"
+msgstr "未指定來æº(--source-pgdata 或 --source-server)"
+
+#: pg_rewind.c:237
+#, c-format
+msgid "only one of --source-pgdata or --source-server can be specified"
+msgstr "åªèƒ½æŒ‡å®š --source-pgdata 或 --source-server 中的其中一個"
+
+#: pg_rewind.c:244
+#, c-format
+msgid "no target data directory specified (--target-pgdata)"
+msgstr "未指定目標資料目錄(--target-pgdata)"
+
+#: pg_rewind.c:251
+#, c-format
+msgid "no source server information (--source-server) specified for --write-recovery-conf"
+msgstr "未指定 --write-recovery-conf 的來æºä¼ºæœå™¨è³‡è¨Š(--source-server)"
+
+#: pg_rewind.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_rewind.c:273
+#, c-format
+msgid "cannot be executed by \"root\""
+msgstr "無法用 \"root\" 執行"
+
+#: pg_rewind.c:274
+#, c-format
+msgid "You must run %s as the PostgreSQL superuser."
+msgstr "您必須以 PostgreSQL 超級使用者身分執行 %s。"
+
+# postmaster/postmaster.c:897
+#: pg_rewind.c:284
+#, c-format
+msgid "could not read permissions of directory \"%s\": %m"
+msgstr "無法讀å–目錄\"%s\"的權é™: %m"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: pg_rewind.c:302
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_rewind.c:305
+#, c-format
+msgid "connected to server"
+msgstr "已連線至伺æœå™¨"
+
+#: pg_rewind.c:366
+#, c-format
+msgid "source and target cluster are on the same timeline"
+msgstr "來æºå’Œç›®æ¨™å¢é›†åœ¨ç›¸åŒçš„時間軸上"
+
+#: pg_rewind.c:387
+#, c-format
+msgid "servers diverged at WAL location %X/%X on timeline %u"
+msgstr "伺æœå™¨åˆ†å²ï¼ŒWAL ä½ç½® %X/%X,時間軸 %u"
+
+#: pg_rewind.c:442
+#, c-format
+msgid "no rewind required"
+msgstr "無需回溯"
+
+#: pg_rewind.c:451
+#, c-format
+msgid "rewinding from last common checkpoint at %X/%X on timeline %u"
+msgstr "從最後的共åŒæª¢æŸ¥é»žå›žæº¯ï¼Œä½ç½® %X/%X,時間軸 %u"
+
+#: pg_rewind.c:461
+#, c-format
+msgid "reading source file list"
+msgstr "讀å–來æºæª”案清單"
+
+#: pg_rewind.c:465
+#, c-format
+msgid "reading target file list"
+msgstr "讀å–目標檔案清單"
+
+#: pg_rewind.c:474
+#, c-format
+msgid "reading WAL in target"
+msgstr "讀å–目標的 WAL"
+
+#: pg_rewind.c:495
+#, c-format
+msgid "need to copy %lu MB (total source directory size is %lu MB)"
+msgstr "需è¦è¤‡è£½ %lu MB(來æºç›®éŒ„的總大å°ç‚º %lu MB)"
+
+#: pg_rewind.c:513
+#, c-format
+msgid "syncing target data directory"
+msgstr "åŒæ­¥ç›®æ¨™è³‡æ–™ç›®éŒ„"
+
+#: pg_rewind.c:529
+#, c-format
+msgid "Done!"
+msgstr "完æˆ!"
+
+#: pg_rewind.c:609
+#, c-format
+msgid "no action decided for file \"%s\""
+msgstr "尚未決定å°æª”案 \"%s\" 採å–任何動作"
+
+#: pg_rewind.c:641
+#, c-format
+msgid "source system was modified while pg_rewind was running"
+msgstr "來æºç³»çµ±åœ¨ pg_rewind 執行期間被修改"
+
+#: pg_rewind.c:645
+#, c-format
+msgid "creating backup label and updating control file"
+msgstr "建立備份標籤並更新控制檔"
+
+#: pg_rewind.c:695
+#, c-format
+msgid "source system was in unexpected state at end of rewind"
+msgstr "來æºç³»çµ±åœ¨å›žæº¯çµæŸæ™‚處於éžé æœŸçš„狀態"
+
+#: pg_rewind.c:727
+#, c-format
+msgid "source and target clusters are from different systems"
+msgstr "來æºå’Œç›®æ¨™å¢é›†ä¾†è‡ªä¸åŒçš„系統"
+
+#: pg_rewind.c:735
+#, c-format
+msgid "clusters are not compatible with this version of pg_rewind"
+msgstr "å¢é›†èˆ‡æ­¤ç‰ˆæœ¬çš„ pg_rewind ä¸ç›¸å®¹"
+
+#: pg_rewind.c:745
+#, c-format
+msgid "target server needs to use either data checksums or \"wal_log_hints = on\""
+msgstr "目標伺æœå™¨éœ€è¦ä½¿ç”¨è³‡æ–™æª¢æŸ¥ç¢¼æˆ– \"wal_log_hints = on\""
+
+#: pg_rewind.c:756
+#, c-format
+msgid "target server must be shut down cleanly"
+msgstr "目標伺æœå™¨å¿…須被乾淨地關閉"
+
+#: pg_rewind.c:766
+#, c-format
+msgid "source data directory must be shut down cleanly"
+msgstr "來æºè³‡æ–™ç›®éŒ„必須被乾淨地關閉"
+
+#: pg_rewind.c:813
+#, c-format
+msgid "%*s/%s kB (%d%%) copied"
+msgstr "%*s/%s kB (%d%%) 已被複製"
+
+#: pg_rewind.c:941
+#, c-format
+msgid "could not find common ancestor of the source and target cluster's timelines"
+msgstr "找ä¸åˆ°ä¾†æºå¢é›†å’Œç›®æ¨™å¢é›†æ™‚間軸的共åŒç¥–å…ˆ"
+
+#: pg_rewind.c:982
+#, c-format
+msgid "backup label buffer too small"
+msgstr "備份標籤緩è¡å€éŽå°"
+
+#: pg_rewind.c:1005
+#, c-format
+msgid "unexpected control file CRC"
+msgstr "éžé æœŸçš„控制檔 CRC"
+
+#: pg_rewind.c:1017
+#, c-format
+msgid "unexpected control file size %d, expected %d"
+msgstr "éžé æœŸçš„æŽ§åˆ¶æª”å¤§å° %d,é æœŸç‚º %d"
+
+#: pg_rewind.c:1026
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes"
+msgstr[0] "WAL 片段大å°å¿…須為介於 1 MB 到 1 GB 之間的二的次方數,但是控制檔指定了 %d ä½å…ƒçµ„"
+
+#: pg_rewind.c:1065 pg_rewind.c:1135
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "\"%s\" 需è¦ç¨‹å¼ \"%s\",但在相åŒç›®éŒ„中找ä¸åˆ° \"%s\""
+
+#: pg_rewind.c:1068 pg_rewind.c:1138
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\" æ‰¾åˆ°ç¨‹å¼ \"%1$s\",但版本ä¸æ˜¯ %3$s"
+
+#: pg_rewind.c:1101
+#, c-format
+msgid "restore_command is not set in the target cluster"
+msgstr "目標å¢é›†ä¸­æœªè¨­å®š restore_command"
+
+#: pg_rewind.c:1142
+#, c-format
+msgid "executing \"%s\" for target server to complete crash recovery"
+msgstr "執行 \"%s\" 以完æˆç›®æ¨™ä¼ºæœå™¨çš„崩潰還原"
+
+#: pg_rewind.c:1180
+#, c-format
+msgid "postgres single-user mode in target cluster failed"
+msgstr "目標å¢é›†ä¸­çš„ PostgreSQL 單使用者模å¼å¤±æ•—"
+
+#: pg_rewind.c:1181
+#, c-format
+msgid "Command was: %s"
+msgstr "命令是: %s"
+
+# access/transam/xlog.c:2771
+#: timeline.c:75 timeline.c:81
+#, c-format
+msgid "syntax error in history file: %s"
+msgstr "æ­·å²æª”中的語法錯誤: %s"
+
+# access/transam/xlog.c:2772
+#: timeline.c:76
+#, c-format
+msgid "Expected a numeric timeline ID."
+msgstr "é æœŸæ•¸å­—時間軸 ID。"
+
+#: timeline.c:82
+#, c-format
+msgid "Expected a write-ahead log switchpoint location."
+msgstr "é æœŸçš„ write-ahead 日誌切æ›é»žä½ç½®ã€‚"
+
+# access/transam/xlog.c:2777
+#: timeline.c:87
+#, c-format
+msgid "invalid data in history file: %s"
+msgstr "æ­·å²æª”中的資料無效: %s"
+
+# access/transam/xlog.c:2778
+#: timeline.c:88
+#, c-format
+msgid "Timeline IDs must be in increasing sequence."
+msgstr "時間軸 ID 必須是éžå¢žåºåˆ—。"
+
+#: timeline.c:108
+#, c-format
+msgid "invalid data in history file"
+msgstr "æ­·å²æª”中的資料無效"
+
+# access/transam/xlog.c:2792
+#: timeline.c:109
+#, c-format
+msgid "Timeline IDs must be less than child timeline's ID."
+msgstr "時間軸 ID å¿…é ˆå°æ–¼å­æ™‚間軸的 ID。"
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ä½æ–¼ %X/%X 的記錄 offset 無效: é æœŸè‡³å°‘ %u,實際為 %u"
+
+# access/transam/xlog.c:2443
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%X è¦æ±‚ contrecord"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ä½æ–¼ %X/%X 的記錄長度無效: é æœŸè‡³å°‘ %u,實際為 %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "嘗試解碼長度為 %u 的記錄時耗盡記憶體"
+
+# access/transam/xlog.c:2503
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "ä½æ–¼ %X/%X 的記錄長度 %u éŽé•·"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "ä½æ–¼ %X/%X 沒有 contrecord 標誌"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ä½æ–¼ %3$X/%4$X çš„ contrecord 長度 %1$u 無效(é æœŸç‚º %2$lld)"
+
+# access/transam/xlog.c:2465
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ä½æ–¼ %2$X/%3$X 的無效 block_id %1$u"
+
+# access/transam/xlog.c:2458
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ä½æ–¼ %3$X/%4$X 的記錄有ä¸æ­£ç¢ºçš„ prev-link %1$X/%2$X"
+
+# access/transam/xlog.c:2269
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "ä½æ–¼ %X/%X 的記錄中資æºç®¡ç†å“¡è³‡æ–™æª¢æŸ¥ç¢¼ä¸æ­£ç¢º"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "WAL 片段 %2$s 中的魔數數字 %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "WAL 片段 %2$s 中的資訊ä½å…ƒ %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: 資料é æ¨™é ­ä¸­çš„片段大å°ä¸æ­£ç¢º"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: 資料é æ¨™é ­ä¸­çš„ XLOG_BLCKSZ ä¸æ­£ç¢º"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "éžé æœŸçš„ pageaddr %X/%X ä½æ–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "éžä¾åº timeline ID %u(在 %u 之後)ä½æ–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "éžå¾ªåº block_id %u ä½æ–¼ %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "設定了 BKPBLOCK_HAS_DATA,但在 %X/%X 的沒有包å«ä»»ä½•è³‡æ–™"
+
+#: xlogreader.c:1766
+#, 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:1802
+#, 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 有 offset %1$u 長度 %2$u å½±åƒé•·åº¦ %3$u 的空洞"
+
+#: xlogreader.c:1818
+#, 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 有 offset %1$u 長度 %2$u 的空洞"
+
+#: xlogreader.c:1832
+#, 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:1847
+#, 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:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "設定了 BKPBLOCK_SAME_REL,但在 %X/%X 沒有先å‰çš„ rel"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ä½æ–¼ %2$X/%3$X 的無效 block_id %1$u"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ä½æ–¼ %X/%X 的記錄長度無效"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "在 WAL 記錄中找ä¸åˆ°å…·æœ‰ ID %d 的備份å€å¡Š"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "無法還原指定了無效å€å¡Š %3$d çš„å½±åƒï¼Œä½ç½® %1$X/%2$X"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "無法還原處於無效狀態的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "無法還原用此版本ä¸æ”¯æ´çš„壓縮方法 %3$s 壓縮的影åƒï¼Œä½ç½® %1$X/%2$X,å€å¡Š %4$d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "無法還原使用未知方法壓縮的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "無法解壓縮影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d"
diff --git a/src/bin/pg_rewind/rewind_source.h b/src/bin/pg_rewind/rewind_source.h
new file mode 100644
index 0000000..98af3b5
--- /dev/null
+++ b/src/bin/pg_rewind/rewind_source.h
@@ -0,0 +1,86 @@
+/*-------------------------------------------------------------------------
+ *
+ * rewind_source.h
+ * Abstraction for fetching from source server.
+ *
+ * The source server can be either a libpq connection to a live system,
+ * or a local data directory. The 'rewind_source' struct abstracts the
+ * operations to fetch data from the source system, so that the rest of
+ * the code doesn't need to care what kind of a source its dealing with.
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef REWIND_SOURCE_H
+#define REWIND_SOURCE_H
+
+#include "access/xlogdefs.h"
+#include "file_ops.h"
+#include "filemap.h"
+#include "libpq-fe.h"
+
+typedef struct rewind_source
+{
+ /*
+ * Traverse all files in the source data directory, and call 'callback' on
+ * each file.
+ */
+ void (*traverse_files) (struct rewind_source *,
+ process_file_callback_t callback);
+
+ /*
+ * Fetch a single file into a malloc'd buffer. The file size is returned
+ * in *filesize. The returned buffer is always zero-terminated, which is
+ * handy for text files.
+ */
+ char *(*fetch_file) (struct rewind_source *, const char *path,
+ size_t *filesize);
+
+ /*
+ * Request to fetch (part of) a file in the source system, specified by an
+ * offset and length, and write it to the same offset in the corresponding
+ * target file. The source implementation may queue up the request and
+ * execute it later when convenient. Call finish_fetch() to flush the
+ * queue and execute all requests.
+ */
+ void (*queue_fetch_range) (struct rewind_source *, const char *path,
+ off_t offset, size_t len);
+
+ /*
+ * Like queue_fetch_range(), but requests replacing the whole local file
+ * from the source system. 'len' is the expected length of the file,
+ * although when the source is a live server, the file may change
+ * concurrently. The implementation is not obliged to copy more than 'len'
+ * bytes, even if the file is larger. However, to avoid copying a
+ * truncated version of the file, which can cause trouble if e.g. a
+ * configuration file is modified concurrently, the implementation should
+ * try to copy the whole file, even if it's larger than expected.
+ */
+ void (*queue_fetch_file) (struct rewind_source *, const char *path,
+ size_t len);
+
+ /*
+ * Execute all requests queued up with queue_fetch_range().
+ */
+ void (*finish_fetch) (struct rewind_source *);
+
+ /*
+ * Get the current WAL insert position in the source system.
+ */
+ XLogRecPtr (*get_current_wal_insert_lsn) (struct rewind_source *);
+
+ /*
+ * Free this rewind_source object.
+ */
+ void (*destroy) (struct rewind_source *);
+
+} rewind_source;
+
+/* in libpq_source.c */
+extern rewind_source *init_libpq_source(PGconn *conn);
+
+/* in local_source.c */
+extern rewind_source *init_local_source(const char *datadir);
+
+#endif /* REWIND_SOURCE_H */
diff --git a/src/bin/pg_rewind/t/001_basic.pl b/src/bin/pg_rewind/t/001_basic.pl
new file mode 100644
index 0000000..031594e
--- /dev/null
+++ b/src/bin/pg_rewind/t/001_basic.pl
@@ -0,0 +1,194 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ RewindTest::setup_cluster($test_mode);
+ RewindTest::start_primary();
+
+ # Create a test table and insert a row in primary.
+ primary_psql("CREATE TABLE tbl1 (d text)");
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary')");
+
+ # This test table will be used to test truncation, i.e. the table
+ # is extended in the old primary after promotion
+ primary_psql("CREATE TABLE trunc_tbl (d text)");
+ primary_psql("INSERT INTO trunc_tbl VALUES ('in primary')");
+
+ # This test table will be used to test the "copy-tail" case, i.e. the
+ # table is truncated in the old primary after promotion
+ primary_psql("CREATE TABLE tail_tbl (id integer, d text)");
+ primary_psql("INSERT INTO tail_tbl VALUES (0, 'in primary')");
+
+ # This test table is dropped in the old primary after promotion.
+ primary_psql("CREATE TABLE drop_tbl (d text)");
+ primary_psql("INSERT INTO drop_tbl VALUES ('in primary')");
+
+ primary_psql("CHECKPOINT");
+
+ RewindTest::create_standby($test_mode);
+
+ # Insert additional data on primary that will be replicated to standby
+ primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')");
+ primary_psql(
+ "INSERT INTO trunc_tbl values ('in primary, before promotion')");
+ primary_psql(
+ "INSERT INTO tail_tbl SELECT g, 'in primary, before promotion: ' || g FROM generate_series(1, 10000) g"
+ );
+
+ primary_psql('CHECKPOINT');
+
+ RewindTest::promote_standby();
+
+ # Insert a row in the old primary. This causes the primary and standby
+ # to have "diverged", it's no longer possible to just apply the
+ # standy's logs over primary directory - you need to rewind.
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')");
+
+ # Also insert a new row in the standby, which won't be present in the
+ # old primary.
+ standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')");
+
+ # Insert enough rows to trunc_tbl to extend the file. pg_rewind should
+ # truncate it back to the old size.
+ primary_psql(
+ "INSERT INTO trunc_tbl SELECT 'in primary, after promotion: ' || g FROM generate_series(1, 10000) g"
+ );
+
+ # Truncate tail_tbl. pg_rewind should copy back the truncated part
+ # (We cannot use an actual TRUNCATE command here, as that creates a
+ # whole new relfilenode)
+ primary_psql("DELETE FROM tail_tbl WHERE id > 10");
+ primary_psql("VACUUM tail_tbl");
+
+ # Drop drop_tbl. pg_rewind should copy it back.
+ primary_psql(
+ "insert into drop_tbl values ('in primary, after promotion')");
+ primary_psql("DROP TABLE drop_tbl");
+
+ # Before running pg_rewind, do a couple of extra tests with several
+ # option combinations. As the code paths taken by those tests
+ # do not change for the "local" and "remote" modes, just run them
+ # in "local" mode for simplicity's sake.
+ if ($test_mode eq 'local')
+ {
+ my $primary_pgdata = $node_primary->data_dir;
+ my $standby_pgdata = $node_standby->data_dir;
+
+ # First check that pg_rewind fails if the target cluster is
+ # not stopped as it fails to start up for the forced recovery
+ # step.
+ command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync'
+ ],
+ 'pg_rewind with running target');
+
+ # Again with --no-ensure-shutdown, which should equally fail.
+ # This time pg_rewind complains without attempting to perform
+ # recovery once.
+ command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync', '--no-ensure-shutdown'
+ ],
+ 'pg_rewind --no-ensure-shutdown with running target');
+
+ # Stop the target, and attempt to run with a local source
+ # still running. This fails as pg_rewind requires to have
+ # a source cleanly stopped.
+ $node_primary->stop;
+ command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync', '--no-ensure-shutdown'
+ ],
+ 'pg_rewind with unexpected running source');
+
+ # Stop the target cluster cleanly, and run again pg_rewind
+ # with --dry-run mode. If anything gets generated in the data
+ # folder, the follow-up run of pg_rewind will most likely fail,
+ # so keep this test as the last one of this subset.
+ $node_standby->stop;
+ command_ok(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync', '--dry-run'
+ ],
+ 'pg_rewind --dry-run');
+
+ # Both clusters need to be alive moving forward.
+ $node_standby->start;
+ $node_primary->start;
+ }
+
+ RewindTest::run_pg_rewind($test_mode);
+
+ check_query(
+ 'SELECT * FROM tbl1',
+ qq(in primary
+in primary, before promotion
+in standby, after promotion
+),
+ 'table content');
+
+ check_query(
+ 'SELECT * FROM trunc_tbl',
+ qq(in primary
+in primary, before promotion
+),
+ 'truncation');
+
+ check_query(
+ 'SELECT count(*) FROM tail_tbl',
+ qq(10001
+),
+ 'tail-copy');
+
+ check_query(
+ 'SELECT * FROM drop_tbl',
+ qq(in primary
+),
+ 'drop');
+
+ # Permissions on PGDATA should be default
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($node_primary->data_dir(), 0700, 0600),
+ 'check PGDATA permissions');
+ }
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes
+run_test('local');
+run_test('remote');
+run_test('archive');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/002_databases.pl b/src/bin/pg_rewind/t/002_databases.pl
new file mode 100644
index 0000000..0d480ae
--- /dev/null
+++ b/src/bin/pg_rewind/t/002_databases.pl
@@ -0,0 +1,77 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ RewindTest::setup_cluster($test_mode, ['-g']);
+ RewindTest::start_primary();
+
+ # Create a database in primary with a table.
+ primary_psql('CREATE DATABASE inprimary');
+ primary_psql('CREATE TABLE inprimary_tab (a int)', 'inprimary');
+
+ RewindTest::create_standby($test_mode);
+
+ # Create another database with another table, the creation is
+ # replicated to the standby.
+ primary_psql('CREATE DATABASE beforepromotion');
+ primary_psql('CREATE TABLE beforepromotion_tab (a int)',
+ 'beforepromotion');
+
+ RewindTest::promote_standby();
+
+ # Create databases in the old primary and the new promoted standby.
+ primary_psql('CREATE DATABASE primary_afterpromotion');
+ primary_psql('CREATE TABLE primary_promotion_tab (a int)',
+ 'primary_afterpromotion');
+ standby_psql('CREATE DATABASE standby_afterpromotion');
+ standby_psql('CREATE TABLE standby_promotion_tab (a int)',
+ 'standby_afterpromotion');
+
+ # The clusters are now diverged.
+
+ RewindTest::run_pg_rewind($test_mode);
+
+ # Check that the correct databases are present after pg_rewind.
+ check_query(
+ 'SELECT datname FROM pg_database ORDER BY 1',
+ qq(beforepromotion
+inprimary
+postgres
+standby_afterpromotion
+template0
+template1
+),
+ 'database names');
+
+ # Permissions on PGDATA should have group permissions
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 1
+ if ($windows_os);
+
+ ok(check_mode_recursive($node_primary->data_dir(), 0750, 0640),
+ 'check PGDATA permissions');
+ }
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes.
+run_test('local');
+run_test('remote');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/003_extrafiles.pl b/src/bin/pg_rewind/t/003_extrafiles.pl
new file mode 100644
index 0000000..2e06abb
--- /dev/null
+++ b/src/bin/pg_rewind/t/003_extrafiles.pl
@@ -0,0 +1,119 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Test how pg_rewind reacts to extra files and directories in the data dirs.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use File::Find;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ RewindTest::setup_cluster($test_mode);
+ RewindTest::start_primary();
+
+ my $test_primary_datadir = $node_primary->data_dir;
+
+ # Create a subdir and files that will be present in both
+ mkdir "$test_primary_datadir/tst_both_dir";
+ append_to_file "$test_primary_datadir/tst_both_dir/both_file1",
+ "in both1";
+ append_to_file "$test_primary_datadir/tst_both_dir/both_file2",
+ "in both2";
+ mkdir "$test_primary_datadir/tst_both_dir/both_subdir/";
+ append_to_file
+ "$test_primary_datadir/tst_both_dir/both_subdir/both_file3",
+ "in both3";
+
+ RewindTest::create_standby($test_mode);
+
+ # Create different subdirs and files in primary and standby
+ my $test_standby_datadir = $node_standby->data_dir;
+
+ mkdir "$test_standby_datadir/tst_standby_dir";
+ append_to_file "$test_standby_datadir/tst_standby_dir/standby_file1",
+ "in standby1";
+ append_to_file "$test_standby_datadir/tst_standby_dir/standby_file2",
+ "in standby2";
+ append_to_file
+ "$test_standby_datadir/tst_standby_dir/standby_file3 with 'quotes'",
+ "in standby3";
+ mkdir "$test_standby_datadir/tst_standby_dir/standby_subdir/";
+ append_to_file
+ "$test_standby_datadir/tst_standby_dir/standby_subdir/standby_file4",
+ "in standby4";
+
+ mkdir "$test_primary_datadir/tst_primary_dir";
+ append_to_file "$test_primary_datadir/tst_primary_dir/primary_file1",
+ "in primary1";
+ append_to_file "$test_primary_datadir/tst_primary_dir/primary_file2",
+ "in primary2";
+ mkdir "$test_primary_datadir/tst_primary_dir/primary_subdir/";
+ append_to_file
+ "$test_primary_datadir/tst_primary_dir/primary_subdir/primary_file3",
+ "in primary3";
+
+ RewindTest::promote_standby();
+ RewindTest::run_pg_rewind($test_mode);
+
+ # List files in the data directory after rewind. All the files that
+ # were present in the standby should be present after rewind, and
+ # all the files that were added on the primary should be removed.
+ my @paths;
+ find(
+ sub {
+ push @paths, $File::Find::name
+ if $File::Find::name =~ m/.*tst_.*/;
+ },
+ $test_primary_datadir);
+ @paths = sort @paths;
+
+ # File::Find converts backslashes to slashes in the newer Perl
+ # versions. To support all Perl versions, do the same conversion
+ # for Windows before comparing the paths.
+ if ($windows_os)
+ {
+ for my $filename (@paths)
+ {
+ $filename =~ s{\\}{/}g;
+ }
+ $test_primary_datadir =~ s{\\}{/}g;
+ }
+
+ is_deeply(
+ \@paths,
+ [
+ "$test_primary_datadir/tst_both_dir",
+ "$test_primary_datadir/tst_both_dir/both_file1",
+ "$test_primary_datadir/tst_both_dir/both_file2",
+ "$test_primary_datadir/tst_both_dir/both_subdir",
+ "$test_primary_datadir/tst_both_dir/both_subdir/both_file3",
+ "$test_primary_datadir/tst_standby_dir",
+ "$test_primary_datadir/tst_standby_dir/standby_file1",
+ "$test_primary_datadir/tst_standby_dir/standby_file2",
+ "$test_primary_datadir/tst_standby_dir/standby_file3 with 'quotes'",
+ "$test_primary_datadir/tst_standby_dir/standby_subdir",
+ "$test_primary_datadir/tst_standby_dir/standby_subdir/standby_file4"
+ ],
+ "file lists match");
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes.
+run_test('local');
+run_test('remote');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl b/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl
new file mode 100644
index 0000000..5fb7fa9
--- /dev/null
+++ b/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl
@@ -0,0 +1,80 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+#
+# Test pg_rewind when the target's pg_wal directory is a symlink.
+#
+use strict;
+use warnings;
+use File::Copy;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+sub run_test
+{
+ my $test_mode = shift;
+
+ my $primary_xlogdir =
+ "${PostgreSQL::Test::Utils::tmp_check}/xlog_primary";
+
+ rmtree($primary_xlogdir);
+ RewindTest::setup_cluster($test_mode);
+
+ my $test_primary_datadir = $node_primary->data_dir;
+
+ # turn pg_wal into a symlink
+ print("moving $test_primary_datadir/pg_wal to $primary_xlogdir\n");
+ move("$test_primary_datadir/pg_wal", $primary_xlogdir) or die;
+ dir_symlink($primary_xlogdir, "$test_primary_datadir/pg_wal") or die;
+
+ RewindTest::start_primary();
+
+ # Create a test table and insert a row in primary.
+ primary_psql("CREATE TABLE tbl1 (d text)");
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary')");
+
+ primary_psql("CHECKPOINT");
+
+ RewindTest::create_standby($test_mode);
+
+ # Insert additional data on primary that will be replicated to standby
+ primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')");
+
+ primary_psql('CHECKPOINT');
+
+ RewindTest::promote_standby();
+
+ # Insert a row in the old primary. This causes the primary and standby
+ # to have "diverged", it's no longer possible to just apply the
+ # standy's logs over primary directory - you need to rewind.
+ primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')");
+
+ # Also insert a new row in the standby, which won't be present in the
+ # old primary.
+ standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')");
+
+ RewindTest::run_pg_rewind($test_mode);
+
+ check_query(
+ 'SELECT * FROM tbl1',
+ qq(in primary
+in primary, before promotion
+in standby, after promotion
+),
+ 'table content');
+
+ RewindTest::clean_rewind_test();
+ return;
+}
+
+# Run the test in both modes
+run_test('local');
+run_test('remote');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/005_same_timeline.pl b/src/bin/pg_rewind/t/005_same_timeline.pl
new file mode 100644
index 0000000..b4ef05e
--- /dev/null
+++ b/src/bin/pg_rewind/t/005_same_timeline.pl
@@ -0,0 +1,24 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+#
+# Test that running pg_rewind with the source and target clusters
+# on the same timeline runs successfully.
+#
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+RewindTest::setup_cluster();
+RewindTest::start_primary();
+RewindTest::create_standby();
+RewindTest::run_pg_rewind('local');
+RewindTest::clean_rewind_test();
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/006_options.pl b/src/bin/pg_rewind/t/006_options.pl
new file mode 100644
index 0000000..4b6e39a
--- /dev/null
+++ b/src/bin/pg_rewind/t/006_options.pl
@@ -0,0 +1,45 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+#
+# Test checking options of pg_rewind.
+#
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_rewind');
+program_version_ok('pg_rewind');
+program_options_handling_ok('pg_rewind');
+
+my $primary_pgdata = PostgreSQL::Test::Utils::tempdir;
+my $standby_pgdata = PostgreSQL::Test::Utils::tempdir;
+command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--target-pgdata', $primary_pgdata,
+ '--source-pgdata', $standby_pgdata,
+ 'extra_arg1'
+ ],
+ 'too many arguments');
+command_fails([ 'pg_rewind', '--target-pgdata', $primary_pgdata ],
+ 'no source specified');
+command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--target-pgdata', $primary_pgdata,
+ '--source-pgdata', $standby_pgdata,
+ '--source-server', 'incorrect_source'
+ ],
+ 'both remote and local sources specified');
+command_fails(
+ [
+ 'pg_rewind', '--debug',
+ '--target-pgdata', $primary_pgdata,
+ '--source-pgdata', $standby_pgdata,
+ '--write-recovery-conf'
+ ],
+ 'no local source with --write-recovery-conf');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/007_standby_source.pl b/src/bin/pg_rewind/t/007_standby_source.pl
new file mode 100644
index 0000000..4fd1ed0
--- /dev/null
+++ b/src/bin/pg_rewind/t/007_standby_source.pl
@@ -0,0 +1,178 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+#
+# Test using a standby server as the source.
+#
+# This sets up three nodes: A, B and C. First, A is the primary,
+# B follows A, and C follows B:
+#
+# A (primary) <--- B (standby) <--- C (standby)
+#
+#
+# Then we promote C, and insert some divergent rows in A and C:
+#
+# A (primary) <--- B (standby) C (primary)
+#
+#
+# Finally, we run pg_rewind on C, to re-point it at B again:
+#
+# A (primary) <--- B (standby) <--- C (standby)
+#
+#
+# The test is similar to the basic tests, but since we're dealing with
+# three nodes, not two, we cannot use most of the RewindTest functions
+# as is.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+use File::Copy;
+use PostgreSQL::Test::Cluster;
+use RewindTest;
+
+my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+my $node_a;
+my $node_b;
+my $node_c;
+
+# Set up node A, as primary
+#
+# A (primary)
+
+setup_cluster('a');
+start_primary();
+$node_a = $node_primary;
+
+# Create a test table and insert a row in primary.
+$node_a->safe_psql('postgres', "CREATE TABLE tbl1 (d text)");
+$node_a->safe_psql('postgres', "INSERT INTO tbl1 VALUES ('in A')");
+primary_psql("CHECKPOINT");
+
+# Set up node B and C, as cascaded standbys
+#
+# A (primary) <--- B (standby) <--- C (standby)
+$node_a->backup('my_backup');
+$node_b = PostgreSQL::Test::Cluster->new('node_b');
+$node_b->init_from_backup($node_a, 'my_backup', has_streaming => 1);
+$node_b->set_standby_mode();
+$node_b->start;
+
+$node_b->backup('my_backup');
+$node_c = PostgreSQL::Test::Cluster->new('node_c');
+$node_c->init_from_backup($node_b, 'my_backup', has_streaming => 1);
+$node_c->set_standby_mode();
+$node_c->start;
+
+# Insert additional data on A, and wait for both standbys to catch up.
+$node_a->safe_psql('postgres',
+ "INSERT INTO tbl1 values ('in A, before promotion')");
+$node_a->safe_psql('postgres', 'CHECKPOINT');
+
+my $lsn = $node_a->lsn('write');
+$node_a->wait_for_catchup('node_b', 'write', $lsn);
+$node_b->wait_for_catchup('node_c', 'write', $lsn);
+
+# Promote C
+#
+# A (primary) <--- B (standby) C (primary)
+
+$node_c->promote;
+
+
+# Insert a row in A. This causes A/B and C to have "diverged", so that it's
+# no longer possible to just apply the standy's logs over primary directory
+# - you need to rewind.
+$node_a->safe_psql('postgres',
+ "INSERT INTO tbl1 VALUES ('in A, after C was promoted')");
+
+# make sure it's replicated to B before we continue
+$node_a->wait_for_catchup('node_b');
+
+# Also insert a new row in the standby, which won't be present in the
+# old primary.
+$node_c->safe_psql('postgres',
+ "INSERT INTO tbl1 VALUES ('in C, after C was promoted')");
+
+
+#
+# All set up. We're ready to run pg_rewind.
+#
+my $node_c_pgdata = $node_c->data_dir;
+
+# Stop the node and be ready to perform the rewind.
+$node_c->stop('fast');
+
+# Keep a temporary postgresql.conf or it would be overwritten during the rewind.
+copy(
+ "$node_c_pgdata/postgresql.conf",
+ "$tmp_folder/node_c-postgresql.conf.tmp");
+
+{
+ # Temporarily unset PGAPPNAME so that the server doesn't
+ # inherit it. Otherwise this could affect libpqwalreceiver
+ # connections in confusing ways.
+ local %ENV = %ENV;
+ delete $ENV{PGAPPNAME};
+
+ # Do rewind using a remote connection as source, generating
+ # recovery configuration automatically.
+ command_ok(
+ [
+ 'pg_rewind', "--debug",
+ "--source-server", $node_b->connstr('postgres'),
+ "--target-pgdata=$node_c_pgdata", "--no-sync",
+ "--write-recovery-conf"
+ ],
+ 'pg_rewind remote');
+}
+
+# Now move back postgresql.conf with old settings
+move(
+ "$tmp_folder/node_c-postgresql.conf.tmp",
+ "$node_c_pgdata/postgresql.conf");
+
+# Restart the node.
+$node_c->start;
+
+# set RewindTest::node_primary to point to the rewound node, so that we can
+# use check_query()
+$node_primary = $node_c;
+
+# Run some checks to verify that C has been successfully rewound,
+# and connected back to follow B.
+
+check_query(
+ 'SELECT * FROM tbl1',
+ qq(in A
+in A, before promotion
+in A, after C was promoted
+),
+ 'table content after rewind');
+
+# Insert another row, and observe that it's cascaded from A to B to C.
+$node_a->safe_psql('postgres',
+ "INSERT INTO tbl1 values ('in A, after rewind')");
+
+$node_b->wait_for_replay_catchup('node_c', $node_a);
+
+check_query(
+ 'SELECT * FROM tbl1',
+ qq(in A
+in A, before promotion
+in A, after C was promoted
+in A, after rewind
+),
+ 'table content after rewind and insert');
+
+# clean up
+$node_a->teardown_node;
+$node_b->teardown_node;
+$node_c->teardown_node;
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/008_min_recovery_point.pl b/src/bin/pg_rewind/t/008_min_recovery_point.pl
new file mode 100644
index 0000000..d4c8945
--- /dev/null
+++ b/src/bin/pg_rewind/t/008_min_recovery_point.pl
@@ -0,0 +1,168 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+#
+# Test situation where a target data directory contains
+# WAL records beyond both the last checkpoint and the divergence
+# point:
+#
+# Target WAL (TLI 2):
+#
+# backup ... Checkpoint A ... INSERT 'rewind this'
+# (TLI 1 -> 2)
+#
+# ^ last common ^ minRecoveryPoint
+# checkpoint
+#
+# Source WAL (TLI 3):
+#
+# backup ... Checkpoint A ... Checkpoint B ... INSERT 'keep this'
+# (TLI 1 -> 2) (TLI 2 -> 3)
+#
+#
+# The last common checkpoint is Checkpoint A. But there is WAL on TLI 2
+# after the last common checkpoint that needs to be rewound. We used to
+# have a bug where minRecoveryPoint was ignored, and pg_rewind concluded
+# that the target doesn't need rewinding in this scenario, because the
+# last checkpoint on the target TLI was an ancestor of the source TLI.
+#
+#
+# This test does not make use of RewindTest as it requires three
+# nodes.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use File::Copy;
+
+my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+my $node_1 = PostgreSQL::Test::Cluster->new('node_1');
+$node_1->init(allows_streaming => 1);
+$node_1->append_conf(
+ 'postgresql.conf', qq(
+wal_keep_size='100 MB'
+));
+
+$node_1->start;
+
+# Create a couple of test tables
+$node_1->safe_psql('postgres', 'CREATE TABLE public.foo (t TEXT)');
+$node_1->safe_psql('postgres', 'CREATE TABLE public.bar (t TEXT)');
+$node_1->safe_psql('postgres', "INSERT INTO public.bar VALUES ('in both')");
+
+#
+# Create node_2 and node_3 as standbys following node_1
+#
+my $backup_name = 'my_backup';
+$node_1->backup($backup_name);
+
+my $node_2 = PostgreSQL::Test::Cluster->new('node_2');
+$node_2->init_from_backup($node_1, $backup_name, has_streaming => 1);
+$node_2->start;
+
+my $node_3 = PostgreSQL::Test::Cluster->new('node_3');
+$node_3->init_from_backup($node_1, $backup_name, has_streaming => 1);
+$node_3->start;
+
+# Wait until node 3 has connected and caught up
+$node_1->wait_for_catchup('node_3');
+
+#
+# Swap the roles of node_1 and node_3, so that node_1 follows node_3.
+#
+$node_1->stop('fast');
+$node_3->promote;
+
+# reconfigure node_1 as a standby following node_3
+my $node_3_connstr = $node_3->connstr;
+$node_1->append_conf(
+ 'postgresql.conf', qq(
+primary_conninfo='$node_3_connstr'
+));
+$node_1->set_standby_mode();
+$node_1->start();
+
+# also reconfigure node_2 to follow node_3
+$node_2->append_conf(
+ 'postgresql.conf', qq(
+primary_conninfo='$node_3_connstr'
+));
+$node_2->restart();
+
+#
+# Promote node_1, to create a split-brain scenario.
+#
+
+# make sure node_1 is full caught up with node_3 first
+$node_3->wait_for_catchup('node_1');
+
+$node_1->promote;
+
+#
+# We now have a split-brain with two primaries. Insert a row on both to
+# demonstratively create a split brain. After the rewind, we should only
+# see the insert on 1, as the insert on node 3 is rewound away.
+#
+$node_1->safe_psql('postgres',
+ "INSERT INTO public.foo (t) VALUES ('keep this')");
+# 'bar' is unmodified in node 1, so it won't be overwritten by replaying the
+# WAL from node 1.
+$node_3->safe_psql('postgres',
+ "INSERT INTO public.bar (t) VALUES ('rewind this')");
+
+# Insert more rows in node 1, to bump up the XID counter. Otherwise, if
+# rewind doesn't correctly rewind the changes made on the other node,
+# we might fail to notice if the inserts are invisible because the XIDs
+# are not marked as committed.
+$node_1->safe_psql('postgres',
+ "INSERT INTO public.foo (t) VALUES ('and this')");
+$node_1->safe_psql('postgres',
+ "INSERT INTO public.foo (t) VALUES ('and this too')");
+
+# Wait for node 2 to catch up
+$node_2->poll_query_until('postgres',
+ q|SELECT COUNT(*) > 1 FROM public.bar|, 't');
+
+# At this point node_2 will shut down without a shutdown checkpoint,
+# but with WAL entries beyond the preceding shutdown checkpoint.
+$node_2->stop('fast');
+$node_3->stop('fast');
+
+my $node_2_pgdata = $node_2->data_dir;
+my $node_1_connstr = $node_1->connstr;
+
+# Keep a temporary postgresql.conf or it would be overwritten during the rewind.
+copy(
+ "$node_2_pgdata/postgresql.conf",
+ "$tmp_folder/node_2-postgresql.conf.tmp");
+
+command_ok(
+ [
+ 'pg_rewind', "--source-server=$node_1_connstr",
+ "--target-pgdata=$node_2_pgdata", "--debug"
+ ],
+ 'run pg_rewind');
+
+# Now move back postgresql.conf with old settings
+move(
+ "$tmp_folder/node_2-postgresql.conf.tmp",
+ "$node_2_pgdata/postgresql.conf");
+
+$node_2->start;
+
+# Check contents of the test tables after rewind. The rows inserted in node 3
+# before rewind should've been overwritten with the data from node 1.
+my $result;
+$result = $node_2->safe_psql('postgres', 'SELECT * FROM public.foo');
+is( $result, qq(keep this
+and this
+and this too), 'table foo after rewind');
+
+$result = $node_2->safe_psql('postgres', 'SELECT * FROM public.bar');
+is($result, qq(in both), 'table bar after rewind');
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/009_growing_files.pl b/src/bin/pg_rewind/t/009_growing_files.pl
new file mode 100644
index 0000000..cf60a04
--- /dev/null
+++ b/src/bin/pg_rewind/t/009_growing_files.pl
@@ -0,0 +1,77 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+use FindBin;
+use lib $FindBin::RealBin;
+
+use RewindTest;
+
+RewindTest::setup_cluster("local");
+RewindTest::start_primary();
+
+# Create a test table and insert a row in primary.
+primary_psql("CREATE TABLE tbl1 (d text)");
+primary_psql("INSERT INTO tbl1 VALUES ('in primary')");
+primary_psql("CHECKPOINT");
+
+RewindTest::create_standby("local");
+
+# Insert additional data on primary that will be replicated to standby
+primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')");
+primary_psql('CHECKPOINT');
+
+RewindTest::promote_standby();
+
+# Insert a row in the old primary. This causes the primary and standby to have
+# "diverged", it's no longer possible to just apply the standy's logs over
+# primary directory - you need to rewind. Also insert a new row in the
+# standby, which won't be present in the old primary.
+primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')");
+standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')");
+
+# Stop the nodes before running pg_rewind
+$node_standby->stop;
+$node_primary->stop;
+
+my $primary_pgdata = $node_primary->data_dir;
+my $standby_pgdata = $node_standby->data_dir;
+
+# Add an extra file that we can tamper with without interfering with the data
+# directory data files.
+mkdir "$standby_pgdata/tst_both_dir";
+append_to_file "$standby_pgdata/tst_both_dir/file1", 'a';
+
+# Run pg_rewind and pipe the output from the run into the extra file we want
+# to copy. This will ensure that the file is continuously growing during the
+# copy operation and the result will be an error.
+my $ret = run_log(
+ [
+ 'pg_rewind', '--debug',
+ '--source-pgdata', $standby_pgdata,
+ '--target-pgdata', $primary_pgdata,
+ '--no-sync',
+ ],
+ '2>>',
+ "$standby_pgdata/tst_both_dir/file1");
+ok(!$ret, 'Error out on copying growing file');
+
+# Ensure that the files are of different size, the final error message should
+# only be in one of them making them guaranteed to be different
+my $primary_size = -s "$primary_pgdata/tst_both_dir/file1";
+my $standby_size = -s "$standby_pgdata/tst_both_dir/file1";
+isnt($standby_size, $primary_size, "File sizes should differ");
+
+# Extract the last line from the verbose output as that should have the error
+# message for the unexpected file size
+my $last;
+open my $f, '<', "$standby_pgdata/tst_both_dir/file1";
+$last = $_ while (<$f>);
+close $f;
+like($last, qr/error: size of source file/, "Check error message");
+
+done_testing();
diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm
new file mode 100644
index 0000000..4957791
--- /dev/null
+++ b/src/bin/pg_rewind/t/RewindTest.pm
@@ -0,0 +1,385 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+package RewindTest;
+
+# Test driver for pg_rewind. Each test consists of a cycle where a new cluster
+# is first created with initdb, and a streaming replication standby is set up
+# to follow the primary. Then the primary is shut down and the standby is
+# promoted, and finally pg_rewind is used to rewind the old primary, using the
+# standby as the source.
+#
+# To run a test, the test script (in t/ subdirectory) calls the functions
+# in this module. These functions should be called in this sequence:
+#
+# 1. setup_cluster - creates a PostgreSQL cluster that runs as the primary
+#
+# 2. start_primary - starts the primary server
+#
+# 3. create_standby - runs pg_basebackup to initialize a standby server, and
+# sets it up to follow the primary.
+#
+# 4. promote_standby - runs "pg_ctl promote" to promote the standby server.
+# The old primary keeps running.
+#
+# 5. run_pg_rewind - stops the old primary (if it's still running) and runs
+# pg_rewind to synchronize it with the now-promoted standby server.
+#
+# 6. clean_rewind_test - stops both servers used in the test, if they're
+# still running.
+#
+# The test script can use the helper functions primary_psql and standby_psql
+# to run psql against the primary and standby servers, respectively.
+
+use strict;
+use warnings;
+
+use Carp;
+use Exporter 'import';
+use File::Copy;
+use File::Path qw(rmtree);
+use IPC::Run qw(run);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::RecursiveCopy;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+our @EXPORT = qw(
+ $node_primary
+ $node_standby
+
+ primary_psql
+ standby_psql
+ check_query
+
+ setup_cluster
+ start_primary
+ create_standby
+ promote_standby
+ run_pg_rewind
+ clean_rewind_test
+);
+
+# Our nodes.
+our $node_primary;
+our $node_standby;
+
+sub primary_psql
+{
+ my $cmd = shift;
+ my $dbname = shift || 'postgres';
+
+ system_or_bail 'psql', '-q', '--no-psqlrc', '-d',
+ $node_primary->connstr($dbname), '-c', "$cmd";
+ return;
+}
+
+sub standby_psql
+{
+ my $cmd = shift;
+ my $dbname = shift || 'postgres';
+
+ system_or_bail 'psql', '-q', '--no-psqlrc', '-d',
+ $node_standby->connstr($dbname), '-c', "$cmd";
+ return;
+}
+
+# Run a query against the primary, and check that the output matches what's
+# expected
+sub check_query
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($query, $expected_stdout, $test_name) = @_;
+ my ($stdout, $stderr);
+
+ # we want just the output, no formatting
+ my $result = run [
+ 'psql', '-q', '-A', '-t', '--no-psqlrc', '-d',
+ $node_primary->connstr('postgres'),
+ '-c', $query
+ ],
+ '>', \$stdout, '2>', \$stderr;
+
+ is($result, 1, "$test_name: psql exit code");
+ is($stderr, '', "$test_name: psql no stderr");
+ is($stdout, $expected_stdout, "$test_name: query result matches");
+
+ return;
+}
+
+sub setup_cluster
+{
+ my $extra_name = shift; # Used to differentiate clusters
+ my $extra = shift; # Extra params for initdb
+
+ # Initialize primary, data checksums are mandatory
+ $node_primary =
+ PostgreSQL::Test::Cluster->new(
+ 'primary' . ($extra_name ? "_${extra_name}" : ''));
+
+ # Set up pg_hba.conf and pg_ident.conf for the role running
+ # pg_rewind. This role is used for all the tests, and has
+ # minimal permissions enough to rewind from an online source.
+ $node_primary->init(
+ allows_streaming => 1,
+ extra => $extra,
+ auth_extra => [ '--create-role', 'rewind_user' ]);
+
+ # Set wal_keep_size to prevent WAL segment recycling after enforced
+ # checkpoints in the tests.
+ $node_primary->append_conf(
+ 'postgresql.conf', qq(
+wal_keep_size = 320MB
+));
+ return;
+}
+
+sub start_primary
+{
+ $node_primary->start;
+
+ # Create custom role which is used to run pg_rewind, and adjust its
+ # permissions to the minimum necessary.
+ $node_primary->safe_psql(
+ 'postgres', "
+ CREATE ROLE rewind_user LOGIN;
+ GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean)
+ TO rewind_user;
+ GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean)
+ TO rewind_user;
+ GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text)
+ TO rewind_user;
+ GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean)
+ TO rewind_user;");
+
+ #### Now run the test-specific parts to initialize the primary before setting
+ # up standby
+
+ return;
+}
+
+sub create_standby
+{
+ my $extra_name = shift;
+
+ $node_standby =
+ PostgreSQL::Test::Cluster->new(
+ 'standby' . ($extra_name ? "_${extra_name}" : ''));
+ $node_primary->backup('my_backup');
+ $node_standby->init_from_backup($node_primary, 'my_backup');
+ my $connstr_primary = $node_primary->connstr();
+
+ $node_standby->append_conf(
+ "postgresql.conf", qq(
+primary_conninfo='$connstr_primary'
+));
+
+ $node_standby->set_standby_mode();
+
+ # Start standby
+ $node_standby->start;
+
+ # The standby may have WAL to apply before it matches the primary. That
+ # is fine, because no test examines the standby before promotion.
+
+ return;
+}
+
+sub promote_standby
+{
+ #### Now run the test-specific parts to run after standby has been started
+ # up standby
+
+ # Wait for the standby to receive and write all WAL.
+ $node_primary->wait_for_catchup($node_standby, 'write');
+
+ # Now promote standby and insert some new data on primary, this will put
+ # the primary out-of-sync with the standby.
+ $node_standby->promote;
+
+ return;
+}
+
+sub run_pg_rewind
+{
+ my $test_mode = shift;
+ my $primary_pgdata = $node_primary->data_dir;
+ my $standby_pgdata = $node_standby->data_dir;
+ my $standby_connstr = $node_standby->connstr('postgres');
+ my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+ # Append the rewind-specific role to the connection string.
+ $standby_connstr = "$standby_connstr user=rewind_user";
+
+ if ($test_mode eq 'archive')
+ {
+ # pg_rewind is tested with --restore-target-wal by moving all
+ # WAL files to a secondary location. Note that this leads to
+ # a failure in ensureCleanShutdown(), forcing to the use of
+ # --no-ensure-shutdown in this mode as the initial set of WAL
+ # files needed to ensure a clean restart is gone. This could
+ # be improved by keeping around only a minimum set of WAL
+ # segments but that would just make the test more costly,
+ # without improving the coverage. Hence, instead, stop
+ # gracefully the primary here.
+ $node_primary->stop;
+ }
+ else
+ {
+ # Stop the primary and be ready to perform the rewind. The cluster
+ # needs recovery to finish once, and pg_rewind makes sure that it
+ # happens automatically.
+ $node_primary->stop('immediate');
+ }
+
+ # At this point, the rewind processing is ready to run.
+ # We now have a very simple scenario with a few diverged WAL record.
+ # The real testing begins really now with a bifurcation of the possible
+ # scenarios that pg_rewind supports.
+
+ # Keep a temporary postgresql.conf for primary node or it would be
+ # overwritten during the rewind.
+ copy(
+ "$primary_pgdata/postgresql.conf",
+ "$tmp_folder/primary-postgresql.conf.tmp");
+
+ # Now run pg_rewind
+ if ($test_mode eq "local")
+ {
+
+ # Do rewind using a local pgdata as source
+ # Stop the primary and be ready to perform the rewind
+ $node_standby->stop;
+ command_ok(
+ [
+ 'pg_rewind',
+ "--debug",
+ "--source-pgdata=$standby_pgdata",
+ "--target-pgdata=$primary_pgdata",
+ "--no-sync",
+ "--config-file",
+ "$tmp_folder/primary-postgresql.conf.tmp"
+ ],
+ 'pg_rewind local');
+ }
+ elsif ($test_mode eq "remote")
+ {
+ # Do rewind using a remote connection as source, generating
+ # recovery configuration automatically.
+ command_ok(
+ [
+ 'pg_rewind', "--debug",
+ "--source-server", $standby_connstr,
+ "--target-pgdata=$primary_pgdata", "--no-sync",
+ "--write-recovery-conf", "--config-file",
+ "$tmp_folder/primary-postgresql.conf.tmp"
+ ],
+ 'pg_rewind remote');
+
+ # Check that standby.signal is here as recovery configuration
+ # was requested.
+ ok( -e "$primary_pgdata/standby.signal",
+ 'standby.signal created after pg_rewind');
+
+ # Now, when pg_rewind apparently succeeded with minimal permissions,
+ # add REPLICATION privilege. So we could test that new standby
+ # is able to connect to the new primary with generated config.
+ $node_standby->safe_psql('postgres',
+ "ALTER ROLE rewind_user WITH REPLICATION;");
+ }
+ elsif ($test_mode eq "archive")
+ {
+
+ # Do rewind using a local pgdata as source and specified
+ # directory with target WAL archive. The old primary has
+ # to be stopped at this point.
+
+ # Remove the existing archive directory and move all WAL
+ # segments from the old primary to the archives. These
+ # will be used by pg_rewind.
+ rmtree($node_primary->archive_dir);
+ PostgreSQL::Test::RecursiveCopy::copypath(
+ $node_primary->data_dir . "/pg_wal",
+ $node_primary->archive_dir);
+
+ # Fast way to remove entire directory content
+ rmtree($node_primary->data_dir . "/pg_wal");
+ mkdir($node_primary->data_dir . "/pg_wal");
+
+ # Make sure that directories have the right umask as this is
+ # required by a follow-up check on permissions, and better
+ # safe than sorry.
+ chmod(0700, $node_primary->archive_dir);
+ chmod(0700, $node_primary->data_dir . "/pg_wal");
+
+ # Add appropriate restore_command to the target cluster
+ $node_primary->enable_restoring($node_primary, 0);
+
+ # Stop the new primary and be ready to perform the rewind.
+ $node_standby->stop;
+
+ # Note the use of --no-ensure-shutdown here. WAL files are
+ # gone in this mode and the primary has been stopped
+ # gracefully already. --config-file reuses the original
+ # postgresql.conf as restore_command has been enabled above.
+ command_ok(
+ [
+ 'pg_rewind',
+ "--debug",
+ "--source-pgdata=$standby_pgdata",
+ "--target-pgdata=$primary_pgdata",
+ "--no-sync",
+ "--no-ensure-shutdown",
+ "--restore-target-wal",
+ "--config-file",
+ "$primary_pgdata/postgresql.conf"
+ ],
+ 'pg_rewind archive');
+ }
+ else
+ {
+
+ # Cannot come here normally
+ croak("Incorrect test mode specified");
+ }
+
+ # Now move back postgresql.conf with old settings
+ move(
+ "$tmp_folder/primary-postgresql.conf.tmp",
+ "$primary_pgdata/postgresql.conf");
+
+ chmod(
+ $node_primary->group_access() ? 0640 : 0600,
+ "$primary_pgdata/postgresql.conf")
+ or BAIL_OUT(
+ "unable to set permissions for $primary_pgdata/postgresql.conf");
+
+ # Plug-in rewound node to the now-promoted standby node
+ if ($test_mode ne "remote")
+ {
+ my $port_standby = $node_standby->port;
+ $node_primary->append_conf(
+ 'postgresql.conf', qq(
+primary_conninfo='port=$port_standby'));
+
+ $node_primary->set_standby_mode();
+ }
+
+ # Restart the primary to check that rewind went correctly
+ $node_primary->start;
+
+ #### Now run the test-specific parts to check the result
+
+ return;
+}
+
+# Clean up after the test. Stop both servers, if they're still running.
+sub clean_rewind_test
+{
+ $node_primary->teardown_node if defined $node_primary;
+ $node_standby->teardown_node if defined $node_standby;
+ return;
+}
+
+1;
diff --git a/src/bin/pg_rewind/timeline.c b/src/bin/pg_rewind/timeline.c
new file mode 100644
index 0000000..2d445da
--- /dev/null
+++ b/src/bin/pg_rewind/timeline.c
@@ -0,0 +1,130 @@
+/*-------------------------------------------------------------------------
+ *
+ * timeline.c
+ * timeline-related functions.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "access/timeline.h"
+#include "access/xlog_internal.h"
+#include "pg_rewind.h"
+
+/*
+ * This is copy-pasted from the backend readTimeLineHistory, modified to
+ * return a malloc'd array and to work without backend functions.
+ */
+/*
+ * Try to read a timeline's history file.
+ *
+ * If successful, return the list of component TLIs (the given TLI followed by
+ * its ancestor TLIs). If we can't find the history file, assume that the
+ * timeline has no parents, and return a list of just the specified timeline
+ * ID.
+ */
+TimeLineHistoryEntry *
+rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries)
+{
+ char *fline;
+ TimeLineHistoryEntry *entry;
+ TimeLineHistoryEntry *entries = NULL;
+ int nlines = 0;
+ TimeLineID lasttli = 0;
+ XLogRecPtr prevend;
+ char *bufptr;
+ bool lastline = false;
+
+ /*
+ * Parse the file...
+ */
+ prevend = InvalidXLogRecPtr;
+ bufptr = buffer;
+ while (!lastline)
+ {
+ char *ptr;
+ TimeLineID tli;
+ uint32 switchpoint_hi;
+ uint32 switchpoint_lo;
+ int nfields;
+
+ fline = bufptr;
+ while (*bufptr && *bufptr != '\n')
+ bufptr++;
+ if (!(*bufptr))
+ lastline = true;
+ else
+ *bufptr++ = '\0';
+
+ /* skip leading whitespace and check for # comment */
+ for (ptr = fline; *ptr; ptr++)
+ {
+ if (!isspace((unsigned char) *ptr))
+ break;
+ }
+ if (*ptr == '\0' || *ptr == '#')
+ continue;
+
+ nfields = sscanf(fline, "%u\t%X/%X", &tli, &switchpoint_hi, &switchpoint_lo);
+
+ if (nfields < 1)
+ {
+ /* expect a numeric timeline ID as first field of line */
+ pg_log_error("syntax error in history file: %s", fline);
+ pg_log_error_detail("Expected a numeric timeline ID.");
+ exit(1);
+ }
+ if (nfields != 3)
+ {
+ pg_log_error("syntax error in history file: %s", fline);
+ pg_log_error_detail("Expected a write-ahead log switchpoint location.");
+ exit(1);
+ }
+ if (entries && tli <= lasttli)
+ {
+ pg_log_error("invalid data in history file: %s", fline);
+ pg_log_error_detail("Timeline IDs must be in increasing sequence.");
+ exit(1);
+ }
+
+ lasttli = tli;
+
+ nlines++;
+ entries = pg_realloc(entries, nlines * sizeof(TimeLineHistoryEntry));
+
+ entry = &entries[nlines - 1];
+ entry->tli = tli;
+ entry->begin = prevend;
+ entry->end = ((uint64) (switchpoint_hi)) << 32 | (uint64) switchpoint_lo;
+ prevend = entry->end;
+
+ /* we ignore the remainder of each line */
+ }
+
+ if (entries && targetTLI <= lasttli)
+ {
+ pg_log_error("invalid data in history file");
+ pg_log_error_detail("Timeline IDs must be less than child timeline's ID.");
+ exit(1);
+ }
+
+ /*
+ * Create one more entry for the "tip" of the timeline, which has no entry
+ * in the history file.
+ */
+ nlines++;
+ if (entries)
+ entries = pg_realloc(entries, nlines * sizeof(TimeLineHistoryEntry));
+ else
+ entries = pg_malloc(1 * sizeof(TimeLineHistoryEntry));
+
+ entry = &entries[nlines - 1];
+ entry->tli = targetTLI;
+ entry->begin = prevend;
+ entry->end = InvalidXLogRecPtr;
+
+ *nentries = nlines;
+ return entries;
+}
diff --git a/src/bin/pg_test_fsync/.gitignore b/src/bin/pg_test_fsync/.gitignore
new file mode 100644
index 0000000..5eb5085
--- /dev/null
+++ b/src/bin/pg_test_fsync/.gitignore
@@ -0,0 +1,3 @@
+/pg_test_fsync
+
+/tmp_check/
diff --git a/src/bin/pg_test_fsync/Makefile b/src/bin/pg_test_fsync/Makefile
new file mode 100644
index 0000000..631d0f3
--- /dev/null
+++ b/src/bin/pg_test_fsync/Makefile
@@ -0,0 +1,36 @@
+# src/bin/pg_test_fsync/Makefile
+
+PGFILEDESC = "pg_test_fsync - test various disk sync methods"
+PGAPPICON = win32
+
+subdir = src/bin/pg_test_fsync
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_test_fsync.o
+
+all: pg_test_fsync
+
+pg_test_fsync: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_test_fsync$(X) '$(DESTDIR)$(bindir)/pg_test_fsync$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_test_fsync$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_test_fsync$(X) $(OBJS)
+ rm -rf tmp_check
diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build
new file mode 100644
index 0000000..aaf65c3
--- /dev/null
+++ b/src/bin/pg_test_fsync/meson.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+test_fsync_sources = files(
+ 'pg_test_fsync.c',
+)
+
+if host_system == 'windows'
+ test_fsync_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_test_fsync',
+ '--FILEDESC', 'pg_test_fsync - test various disk sync methods'])
+endif
+
+pg_test_fsync = executable('pg_test_fsync',
+ test_fsync_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_test_fsync
+
+tests += {
+ 'name': 'pg_test_fsync',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_fsync/nls.mk b/src/bin/pg_test_fsync/nls.mk
new file mode 100644
index 0000000..a507820
--- /dev/null
+++ b/src/bin/pg_test_fsync/nls.mk
@@ -0,0 +1,5 @@
+# src/bin/pg_test_fsync/nls.mk
+CATALOG_NAME = pg_test_fsync
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_test_fsync.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) die
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c
new file mode 100644
index 0000000..435df8d
--- /dev/null
+++ b/src/bin/pg_test_fsync/pg_test_fsync.c
@@ -0,0 +1,648 @@
+/*
+ * pg_test_fsync.c
+ * tests all supported fsync() methods
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "access/xlogdefs.h"
+#include "common/logging.h"
+#include "common/pg_prng.h"
+#include "getopt_long.h"
+
+/*
+ * put the temp files in the local directory
+ * unless the user specifies otherwise
+ */
+#define FSYNC_FILENAME "./pg_test_fsync.out"
+
+#define XLOG_BLCKSZ_K (XLOG_BLCKSZ / 1024)
+
+#define LABEL_FORMAT " %-30s"
+#define NA_FORMAT "%21s\n"
+/* translator: maintain alignment with NA_FORMAT */
+#define OPS_FORMAT gettext_noop("%13.3f ops/sec %6.0f usecs/op\n")
+#define USECS_SEC 1000000
+
+/* These are macros to avoid timing the function call overhead. */
+#ifndef WIN32
+#define START_TIMER \
+do { \
+ alarm_triggered = false; \
+ alarm(secs_per_test); \
+ gettimeofday(&start_t, NULL); \
+} while (0)
+#else
+/* WIN32 doesn't support alarm, so we create a thread and sleep there */
+#define START_TIMER \
+do { \
+ alarm_triggered = false; \
+ if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \
+ INVALID_HANDLE_VALUE) \
+ pg_fatal("could not create thread for alarm"); \
+ gettimeofday(&start_t, NULL); \
+} while (0)
+#endif
+
+#define STOP_TIMER \
+do { \
+ gettimeofday(&stop_t, NULL); \
+ print_elapse(start_t, stop_t, ops); \
+} while (0)
+
+
+static const char *progname;
+
+static unsigned int secs_per_test = 5;
+static int needs_unlink = 0;
+static char full_buf[DEFAULT_XLOG_SEG_SIZE],
+ *buf,
+ *filename = FSYNC_FILENAME;
+static struct timeval start_t,
+ stop_t;
+static sig_atomic_t alarm_triggered = false;
+
+
+static void handle_args(int argc, char *argv[]);
+static void prepare_buf(void);
+static void test_open(void);
+static void test_non_sync(void);
+static void test_sync(int writes_per_op);
+static void test_open_syncs(void);
+static void test_open_sync(const char *msg, int writes_size);
+static void test_file_descriptor_sync(void);
+
+#ifndef WIN32
+static void process_alarm(SIGNAL_ARGS);
+#else
+static DWORD WINAPI process_alarm(LPVOID param);
+#endif
+static void signal_cleanup(SIGNAL_ARGS);
+
+#ifdef HAVE_FSYNC_WRITETHROUGH
+static int pg_fsync_writethrough(int fd);
+#endif
+static void print_elapse(struct timeval start_t, struct timeval stop_t, int ops);
+
+#define die(msg) pg_fatal("%s: %m", _(msg))
+
+
+int
+main(int argc, char *argv[])
+{
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_fsync"));
+ progname = get_progname(argv[0]);
+
+ handle_args(argc, argv);
+
+ /* Prevent leaving behind the test file */
+ pqsignal(SIGINT, signal_cleanup);
+ pqsignal(SIGTERM, signal_cleanup);
+#ifndef WIN32
+ pqsignal(SIGALRM, process_alarm);
+#endif
+#ifdef SIGHUP
+ /* Not defined on win32 */
+ pqsignal(SIGHUP, signal_cleanup);
+#endif
+
+ pg_prng_seed(&pg_global_prng_state, (uint64) time(NULL));
+
+ prepare_buf();
+
+ test_open();
+
+ /* Test using 1 XLOG_BLCKSZ write */
+ test_sync(1);
+
+ /* Test using 2 XLOG_BLCKSZ writes */
+ test_sync(2);
+
+ test_open_syncs();
+
+ test_file_descriptor_sync();
+
+ test_non_sync();
+
+ unlink(filename);
+
+ return 0;
+}
+
+static void
+handle_args(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"filename", required_argument, NULL, 'f'},
+ {"secs-per-test", required_argument, NULL, 's'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ unsigned long optval; /* used for option parsing */
+ char *endptr;
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ printf(_("Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"), progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_test_fsync (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((option = getopt_long(argc, argv, "f:s:",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'f':
+ filename = pg_strdup(optarg);
+ break;
+
+ case 's':
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+
+ if (endptr == optarg || *endptr != '\0' ||
+ errno != 0 || optval != (unsigned int) optval)
+ {
+ pg_log_error("invalid argument for option %s", "--secs-per-test");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ secs_per_test = (unsigned int) optval;
+ if (secs_per_test == 0)
+ pg_fatal("%s must be in range %u..%u",
+ "--secs-per-test", 1, UINT_MAX);
+ break;
+
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (argc > optind)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ printf(ngettext("%u second per test\n",
+ "%u seconds per test\n",
+ secs_per_test),
+ secs_per_test);
+#if defined(O_DIRECT)
+ printf(_("O_DIRECT supported on this platform for open_datasync and open_sync.\n"));
+#elif defined(F_NOCACHE)
+ printf(_("F_NOCACHE supported on this platform for open_datasync and open_sync.\n"));
+#else
+ printf(_("Direct I/O is not supported on this platform.\n"));
+#endif
+}
+
+static void
+prepare_buf(void)
+{
+ int ops;
+
+ /* write random data into buffer */
+ for (ops = 0; ops < DEFAULT_XLOG_SEG_SIZE; ops++)
+ full_buf[ops] = (char) pg_prng_int32(&pg_global_prng_state);
+
+ buf = (char *) TYPEALIGN(XLOG_BLCKSZ, full_buf);
+}
+
+static void
+test_open(void)
+{
+ int tmpfile;
+
+ /*
+ * test if we can open the target file
+ */
+ if ((tmpfile = open(filename, O_RDWR | O_CREAT | PG_BINARY, S_IRUSR | S_IWUSR)) == -1)
+ die("could not open output file");
+ needs_unlink = 1;
+ if (write(tmpfile, full_buf, DEFAULT_XLOG_SEG_SIZE) !=
+ DEFAULT_XLOG_SEG_SIZE)
+ die("write failed");
+
+ /* fsync now so that dirty buffers don't skew later tests */
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+
+ close(tmpfile);
+}
+
+static int
+open_direct(const char *path, int flags, mode_t mode)
+{
+ int fd;
+
+#ifdef O_DIRECT
+ flags |= O_DIRECT;
+#endif
+
+ fd = open(path, flags, mode);
+
+#if !defined(O_DIRECT) && defined(F_NOCACHE)
+ if (fd >= 0 && fcntl(fd, F_NOCACHE, 1) < 0)
+ {
+ int save_errno = errno;
+
+ close(fd);
+ errno = save_errno;
+ return -1;
+ }
+#endif
+
+ return fd;
+}
+
+static void
+test_sync(int writes_per_op)
+{
+ int tmpfile,
+ ops,
+ writes;
+ bool fs_warning = false;
+
+ if (writes_per_op == 1)
+ printf(_("\nCompare file sync methods using one %dkB write:\n"), XLOG_BLCKSZ_K);
+ else
+ printf(_("\nCompare file sync methods using two %dkB writes:\n"), XLOG_BLCKSZ_K);
+ printf(_("(in wal_sync_method preference order, except fdatasync is Linux's default)\n"));
+
+ /*
+ * Test open_datasync if available
+ */
+ printf(LABEL_FORMAT, "open_datasync");
+ fflush(stdout);
+
+#ifdef O_DSYNC
+ if ((tmpfile = open_direct(filename, O_RDWR | O_DSYNC | PG_BINARY, 0)) == -1)
+ {
+ printf(NA_FORMAT, _("n/a*"));
+ fs_warning = true;
+ }
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+/*
+ * Test fdatasync if available
+ */
+ printf(LABEL_FORMAT, "fdatasync");
+ fflush(stdout);
+
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ fdatasync(tmpfile);
+ }
+ STOP_TIMER;
+ close(tmpfile);
+
+/*
+ * Test fsync
+ */
+ printf(LABEL_FORMAT, "fsync");
+ fflush(stdout);
+
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+
+/*
+ * If fsync_writethrough is available, test as well
+ */
+ printf(LABEL_FORMAT, "fsync_writethrough");
+ fflush(stdout);
+
+#ifdef HAVE_FSYNC_WRITETHROUGH
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ if (pg_fsync_writethrough(tmpfile) != 0)
+ die("fsync failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+/*
+ * Test open_sync if available
+ */
+ printf(LABEL_FORMAT, "open_sync");
+ fflush(stdout);
+
+#ifdef O_SYNC
+ if ((tmpfile = open_direct(filename, O_RDWR | O_SYNC | PG_BINARY, 0)) == -1)
+ {
+ printf(NA_FORMAT, _("n/a*"));
+ fs_warning = true;
+ }
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < writes_per_op; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ XLOG_BLCKSZ,
+ writes * XLOG_BLCKSZ) != XLOG_BLCKSZ)
+
+ /*
+ * This can generate write failures if the filesystem has
+ * a large block size, e.g. 4k, and there is no support
+ * for O_DIRECT writes smaller than the file system block
+ * size, e.g. XFS.
+ */
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+
+ if (fs_warning)
+ {
+ printf(_("* This file system and its mount options do not support direct\n"
+ " I/O, e.g. ext4 in journaled mode.\n"));
+ }
+}
+
+static void
+test_open_syncs(void)
+{
+ printf(_("\nCompare open_sync with different write sizes:\n"));
+ printf(_("(This is designed to compare the cost of writing 16kB in different write\n"
+ "open_sync sizes.)\n"));
+
+ test_open_sync(_(" 1 * 16kB open_sync write"), 16);
+ test_open_sync(_(" 2 * 8kB open_sync writes"), 8);
+ test_open_sync(_(" 4 * 4kB open_sync writes"), 4);
+ test_open_sync(_(" 8 * 2kB open_sync writes"), 2);
+ test_open_sync(_("16 * 1kB open_sync writes"), 1);
+}
+
+/*
+ * Test open_sync with different size files
+ */
+static void
+test_open_sync(const char *msg, int writes_size)
+{
+#ifdef O_SYNC
+ int tmpfile,
+ ops,
+ writes;
+#endif
+
+ printf(LABEL_FORMAT, msg);
+ fflush(stdout);
+
+#ifdef O_SYNC
+ if ((tmpfile = open_direct(filename, O_RDWR | O_SYNC | PG_BINARY, 0)) == -1)
+ printf(NA_FORMAT, _("n/a*"));
+ else
+ {
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ for (writes = 0; writes < 16 / writes_size; writes++)
+ if (pg_pwrite(tmpfile,
+ buf,
+ writes_size * 1024,
+ writes * writes_size * 1024) !=
+ writes_size * 1024)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+ }
+#else
+ printf(NA_FORMAT, _("n/a"));
+#endif
+}
+
+static void
+test_file_descriptor_sync(void)
+{
+ int tmpfile,
+ ops;
+
+ /*
+ * Test whether fsync can sync data written on a different descriptor for
+ * the same file. This checks the efficiency of multi-process fsyncs
+ * against the same file. Possibly this should be done with writethrough
+ * on platforms which support it.
+ */
+ printf(_("\nTest if fsync on non-write file descriptor is honored:\n"));
+ printf(_("(If the times are similar, fsync() can sync data written on a different\n"
+ "descriptor.)\n"));
+
+ /*
+ * first write, fsync and close, which is the normal behavior without
+ * multiple descriptors
+ */
+ printf(LABEL_FORMAT, "write, fsync, close");
+ fflush(stdout);
+
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+ close(tmpfile);
+
+ /*
+ * open and close the file again to be consistent with the following
+ * test
+ */
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ close(tmpfile);
+ }
+ STOP_TIMER;
+
+ /*
+ * Now open, write, close, open again and fsync This simulates processes
+ * fsyncing each other's writes.
+ */
+ printf(LABEL_FORMAT, "write, close, fsync");
+ fflush(stdout);
+
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ if (write(tmpfile, buf, XLOG_BLCKSZ) != XLOG_BLCKSZ)
+ die("write failed");
+ close(tmpfile);
+ /* reopen file */
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ if (fsync(tmpfile) != 0)
+ die("fsync failed");
+ close(tmpfile);
+ }
+ STOP_TIMER;
+}
+
+static void
+test_non_sync(void)
+{
+ int tmpfile,
+ ops;
+
+ /*
+ * Test a simple write without fsync
+ */
+ printf(_("\nNon-sync'ed %dkB writes:\n"), XLOG_BLCKSZ_K);
+ printf(LABEL_FORMAT, "write");
+ fflush(stdout);
+
+ if ((tmpfile = open(filename, O_RDWR | PG_BINARY, 0)) == -1)
+ die("could not open output file");
+ START_TIMER;
+ for (ops = 0; alarm_triggered == false; ops++)
+ {
+ if (pg_pwrite(tmpfile, buf, XLOG_BLCKSZ, 0) != XLOG_BLCKSZ)
+ die("write failed");
+ }
+ STOP_TIMER;
+ close(tmpfile);
+}
+
+static void
+signal_cleanup(SIGNAL_ARGS)
+{
+ /* Delete the file if it exists. Ignore errors */
+ if (needs_unlink)
+ unlink(filename);
+ /* Finish incomplete line on stdout */
+ puts("");
+ exit(1);
+}
+
+#ifdef HAVE_FSYNC_WRITETHROUGH
+
+static int
+pg_fsync_writethrough(int fd)
+{
+#ifdef WIN32
+ return _commit(fd);
+#elif defined(F_FULLFSYNC)
+ return (fcntl(fd, F_FULLFSYNC, 0) == -1) ? -1 : 0;
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+#endif
+
+/*
+ * print out the writes per second for tests
+ */
+static void
+print_elapse(struct timeval start_t, struct timeval stop_t, int ops)
+{
+ double total_time = (stop_t.tv_sec - start_t.tv_sec) +
+ (stop_t.tv_usec - start_t.tv_usec) * 0.000001;
+ double per_second = ops / total_time;
+ double avg_op_time_us = (total_time / ops) * USECS_SEC;
+
+ printf(_(OPS_FORMAT), per_second, avg_op_time_us);
+}
+
+#ifndef WIN32
+static void
+process_alarm(SIGNAL_ARGS)
+{
+ alarm_triggered = true;
+}
+#else
+static DWORD WINAPI
+process_alarm(LPVOID param)
+{
+ /* WIN32 doesn't support alarm, so we create a thread and sleep here */
+ Sleep(secs_per_test * 1000);
+ alarm_triggered = true;
+ ExitThread(0);
+}
+#endif
diff --git a/src/bin/pg_test_fsync/po/LINGUAS b/src/bin/pg_test_fsync/po/LINGUAS
new file mode 100644
index 0000000..4cc8bed
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_test_fsync/po/cs.po b/src/bin/pg_test_fsync/po/cs.po
new file mode 100644
index 0000000..a654745
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/cs.po
@@ -0,0 +1,210 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-07-13 19:47+0000\n"
+"PO-Revision-Date: 2018-07-13 23:50+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : "
+"2;\n"
+"X-Generator: Poedit 2.0.7\n"
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:30
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:49
+#, c-format
+msgid "Could not create thread for alarm\n"
+msgstr "Nelze vytvořit thread pro alarm\n"
+
+#: pg_test_fsync.c:154
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Použití: %s [-f SOUBOR] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:178 pg_test_fsync.c:190
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_test_fsync.c:188
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr ""
+"%s: příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: pg_test_fsync.c:195
+#, c-format
+msgid "%d second per test\n"
+msgid_plural "%d seconds per test\n"
+msgstr[0] "%d sekund per test\n"
+msgstr[1] "%d seconds per test\n"
+msgstr[2] "%d seconds per test\n"
+
+#: pg_test_fsync.c:200
+#, c-format
+msgid ""
+"O_DIRECT supported on this platform for open_datasync and "
+"open_sync.\n"
+msgstr ""
+"O_DIRECT podporováno na této platformě pro open_datasync a "
+"open_sync.\n"
+
+#: pg_test_fsync.c:202
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O není na této platformě podporováno.\n"
+
+#: pg_test_fsync.c:227 pg_test_fsync.c:292 pg_test_fsync.c:316
+#: pg_test_fsync.c:339 pg_test_fsync.c:480 pg_test_fsync.c:492
+#: pg_test_fsync.c:508 pg_test_fsync.c:514 pg_test_fsync.c:539
+msgid "could not open output file"
+msgstr "nelze otevřít výstupní soubor"
+
+#: pg_test_fsync.c:231 pg_test_fsync.c:273 pg_test_fsync.c:298
+#: pg_test_fsync.c:322 pg_test_fsync.c:345 pg_test_fsync.c:383
+#: pg_test_fsync.c:441 pg_test_fsync.c:482 pg_test_fsync.c:510
+#: pg_test_fsync.c:541
+msgid "write failed"
+msgstr "zápis selhal"
+
+#: pg_test_fsync.c:235 pg_test_fsync.c:324 pg_test_fsync.c:347
+#: pg_test_fsync.c:484 pg_test_fsync.c:516
+msgid "fsync failed"
+msgstr "fsync selhal"
+
+#: pg_test_fsync.c:249
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Srovnání sync metod souboru pomocí jednoho %dkB zápisu:\n"
+
+#: pg_test_fsync.c:251
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Srovnání sync metod souboru pomocí dvou %dkB zápisů:\n"
+
+#: pg_test_fsync.c:252
+#, c-format
+msgid ""
+"(in wal_sync_method preference order, except fdatasync is Linux's "
+"default)\n"
+msgstr ""
+"(v pořadí dle wal_sync_method, s výjimkou že fdatasync je výchozí na "
+"Linuxu)\n"
+
+#: pg_test_fsync.c:263 pg_test_fsync.c:366 pg_test_fsync.c:432
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:275 pg_test_fsync.c:301 pg_test_fsync.c:326
+#: pg_test_fsync.c:349 pg_test_fsync.c:385 pg_test_fsync.c:443
+msgid "seek failed"
+msgstr "nastavení pozice (seek) selhalo"
+
+#: pg_test_fsync.c:281 pg_test_fsync.c:306 pg_test_fsync.c:354
+#: pg_test_fsync.c:391 pg_test_fsync.c:449
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:396
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Tento souborový systém a jeho mount volby nepodporují direct\n"
+" I/O, e.g. ext4 v journaled módu.\n"
+
+#: pg_test_fsync.c:404
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Srovnání open_sync s různými velikostmi zápisů:\n"
+
+#: pg_test_fsync.c:405
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different "
+"write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Toto je navrženo pro srovnání ceny zápisu 16kB s různými "
+"velikostmi\n"
+"zápisů open_sync.)\n"
+
+#: pg_test_fsync.c:408
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync write"
+
+#: pg_test_fsync.c:409
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync writes"
+
+#: pg_test_fsync.c:410
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync writes"
+
+#: pg_test_fsync.c:411
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync writes"
+
+#: pg_test_fsync.c:412
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync writes"
+
+#: pg_test_fsync.c:465
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Testuje zda fsync funguje na non-write file descriptoru:\n"
+
+#: pg_test_fsync.c:466
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a "
+"different\n"
+"descriptor.)\n"
+msgstr ""
+"(Pokud jsou výsledky podobné, fsync() může synchronizovat data\n"
+"zapsaná na různých descriptorech.)\n"
+
+#: pg_test_fsync.c:531
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+
+#: pg_test_fsync.c:608
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
diff --git a/src/bin/pg_test_fsync/po/de.po b/src/bin/pg_test_fsync/po/de.po
new file mode 100644
index 0000000..906080e
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/de.po
@@ -0,0 +1,224 @@
+# German message translation file for pg_test_fsync
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:51+0000\n"
+"PO-Revision-Date: 2022-05-11 22:41+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr " %13.3f Op./s %6.0f µs/Op.\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "konnte Thread für Alarm nicht erzeugen"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Aufruf: %s [-f DATEINAME] [-s SEK-PRO-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ungültiges Argument für Option %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s muss im Bereich %u..%u sein"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u Sekunde pro Test\n"
+msgstr[1] "%u Sekunden pro Test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct-I/O wird auf dieser Plattform nicht unterstützt.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "konnte Ausgabedatei nicht öffnen"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "Schreiben fehlgeschlagen"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync fehlgeschlagen"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Vergleich von Datei-Sync-Methoden bei einem Schreibvorgang aus %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Vergleich von Datei-Sync-Methoden bei zwei Schreibvorgängen aus je %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(in Rangordnung von wal_sync_method, außer dass fdatasync auf Linux Standard ist)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "entf.*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "entf."
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Dieses Dateisystem und die Mount-Optionen unterstützen kein Direct-I/O,\n"
+" z.B. ext4 im Journaled-Modus.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Vergleich von open_sync mit verschiedenen Schreibgrößen:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Damit werden die Kosten für das Schreiben von 16kB in verschieden Größen mit\n"
+"open_sync verglichen.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync schreiben"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync schreiben"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync schreiben"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync schreiben"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync schreiben"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Probe ob fsync auf einem anderen Dateideskriptor funktioniert:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Wenn die Zeiten ähnlich sind, dann kann fsync() auf einem anderen Deskriptor\n"
+"geschriebene Daten syncen.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Nicht gesynctes Schreiben von %dkB:\n"
diff --git a/src/bin/pg_test_fsync/po/el.po b/src/bin/pg_test_fsync/po/el.po
new file mode 100644
index 0000000..4cd3771
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/el.po
@@ -0,0 +1,228 @@
+# Greek message translation file for pg_test_fsync
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:21+0000\n"
+"PO-Revision-Date: 2023-04-14 14:41+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "δεν ήταν δυνατή η δημιουÏγία νήματος για ειδοποίηση"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "ΧÏήση: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "μη έγκυÏη παÏάμετÏος για την επιλογή %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u δευτεÏόλεπτο ανά τεστ\n"
+msgstr[1] "%u δευτεÏόλεπτα ανά τεστ\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT υποστηÏίζεται σε αυτήν την πλατφόÏμα για open_datasync και open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE υποστηÏίζεται σε αυτήν την πλατφόÏμα για open_datasync και open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Άμεσο I/O δεν υποστηÏίζεται σε αυτήν την πλατφόÏμα.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου εξόδου"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "απέτυχε η εγγÏαφή"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync απέτυχε"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"ΣυγκÏίνετε τις μεθόδους συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î±Ïχείων χÏησιμοποιώντας μία εγγÏαφή %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"ΣυγκÏίνετε τις μεθόδους συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î±Ïχείων χÏησιμοποιώντας δÏο εγγÏαφές %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(με wal_sync_method σειÏά Ï€Ïοτίμησης, εκτός από fdatasync είναι η Ï€Ïοεπιλογή σε Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Αυτό το σÏστημα αÏχείων και οι επιλογές Ï€ÏοσάÏτησής του δεν υποστηÏίζουν\n"
+" άμεσο I/O, Ï€.χ. ext4 σε λειτουÏγία journal.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"ΣυγκÏίνετε open_sync με διαφοÏετικά μεγέθη εγγÏαφής:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Αυτό έχει σχεδιαστεί για να συγκÏίνει το κόστος της γÏαφής 16kB σε διαφοÏετικά\n"
+"μεγέθη open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync εγγÏαφή"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync εγγÏαφές"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync εγγÏαφές"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync εγγÏαφές"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync εγγÏαφές"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Ελέγξτε εάν τηÏείται το fsync σε μη-εγγÏάψιμο πεÏιγÏαφέα αÏχείων:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Εάν οι χÏόνοι είναι παÏόμοιοι, το fsync() μποÏεί να συγχÏονίσει δεδομένα εγγεγÏαμμένα\n"
+"σε διαφοÏετικό πεÏιγÏαφέα.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Μη-συγχÏονισμένες %dkB εγγÏαφές:\n"
diff --git a/src/bin/pg_test_fsync/po/es.po b/src/bin/pg_test_fsync/po/es.po
new file mode 100644
index 0000000..b522bdd
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/es.po
@@ -0,0 +1,228 @@
+# Spanish message translation file for pg_test_fsync
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carloswaldo@babelruins.org>, 2017, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:22+0000\n"
+"PO-Revision-Date: 2023-05-22 12:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.4.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/seg %6.0f usegs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "no se pudo crear el thread para la alarma"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Empleo: %s [-f ARCHIVO] [-s SEG-POR-PRUEBA]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento no válido para la opción %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s debe estar en el rango %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u segundo por prueba\n"
+msgstr[1] "%u segundos por prueba\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT tiene soporte en esta plataforma para open_datasync y open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE tiene soporte en esta plataforma para open_datasync y open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O no está soportado en esta plataforma.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357
+#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537
+#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581
+msgid "could not open output file"
+msgstr "no se pudo abrir el archivo de salida"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344
+#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429
+#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555
+#: pg_test_fsync.c:586
+msgid "write failed"
+msgstr "escritura falló"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392
+#: pg_test_fsync.c:529 pg_test_fsync.c:561
+msgid "fsync failed"
+msgstr "fsync falló"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Comparar métodos de sincronización de archivos usando una escritura de %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Comparar métodos de sincronización de archivos usando dos escrituras de %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(en orden de preferencia de wal_sync_method, excepto en Linux donde fdatasync es el predeterminado)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435
+#: pg_test_fsync.c:494
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:440
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Este sistema de archivos con sus opciones de montaje no soportan\n"
+" Direct I/O, e.g. ext4 en modo journal.\n"
+
+#: pg_test_fsync.c:448
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Comparar open_sync con diferentes tamaños de escritura:\n"
+
+#: pg_test_fsync.c:449
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Esto está diseñado para comparar el costo de escribir 16kB en diferentes\n"
+"tamaños de escrituras open_sync.)\n"
+
+#: pg_test_fsync.c:452
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB escritura open_sync"
+
+#: pg_test_fsync.c:453
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB escrituras open_sync"
+
+#: pg_test_fsync.c:454
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB escrituras open_sync"
+
+#: pg_test_fsync.c:455
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB escrituras open_sync"
+
+#: pg_test_fsync.c:456
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB escrituras open_sync"
+
+#: pg_test_fsync.c:510
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Probar si se respeta fsync en un descriptor de archivo que no es de escritura:\n"
+
+#: pg_test_fsync.c:511
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Si los tiempos son similares, fsync() puede sincronizar datos escritos\n"
+"en un descriptor diferente.)\n"
+
+#: pg_test_fsync.c:576
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Escrituras de %dkB no sincronizadas:\n"
diff --git a/src/bin/pg_test_fsync/po/fr.po b/src/bin/pg_test_fsync/po/fr.po
new file mode 100644
index 0000000..dfedfe8
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/fr.po
@@ -0,0 +1,242 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:20+0000\n"
+"PO-Revision-Date: 2022-05-14 17:17+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "n'a pas pu créer un thread pour l'alarme"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s : %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Usage: %s [-f NOMFICHIER] [-s SECS-PAR-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argument invalide pour l'option %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s doit être compris entre %u et %u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u seconde par test\n"
+msgstr[1] "%u secondes par test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT supporté sur cette plateforme pour open_datasync et open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE supporté sur cette plateforme pour open_datasync et open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O n'est pas supporté sur cette plateforme.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "n'a pas pu ouvrir le fichier en sortie"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "échec en écriture"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "échec de la synchronisation (fsync)"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Comparer les méthodes de synchronisation de fichier en utilisant une écriture de %d Ko :\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Comparer les méthodes de synchronisation de fichier sur disque en utilisant deux écritures de %d Ko :\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(dans l'ordre de préférence de wal_sync_method, sauf fdatasync qui est la valeur par défaut sous Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Ce système de fichiers et ses options de montage ne supportent pas les\n"
+" I/O directes, par exemple ext4 en journalisé.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Comparer open_sync avec différentes tailles d'écriture :\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Ceci est conçu pour comparer le coût d'écriture de 16 Ko dans différentes tailles\n"
+"d'écritures open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr " 16 * 1 Ko, écriture avec open_sync"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Teste si fsync est honoré sur un descripteur de fichiers sans écriture :\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Si les temps sont similaires, fsync() peut synchroniser sur disque les données écrites sur\n"
+"un descripteur différent.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"%d Ko d'écritures non synchronisées :\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s : %s\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "seek failed"
+#~ msgstr "seek échoué"
diff --git a/src/bin/pg_test_fsync/po/it.po b/src/bin/pg_test_fsync/po/it.po
new file mode 100644
index 0000000..c381e27
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/it.po
@@ -0,0 +1,226 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:21+0000\n"
+"PO-Revision-Date: 2022-09-30 14:56+0200\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"Last-Translator: Domenico Sgarbossa <sgarbossa.domenico@gmail.com>\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore:"
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f operazioni/sec %6.0f operazioni/sec\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "non è stato possibile creare thread per l'allarme"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Utilizzo: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argomento non valido per l'opzione %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s deve essere compreso nell'intervallo %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u secondo per test\n"
+msgstr[1] "%u secondi per test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT supportato su questa piattaforma per open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE supportato su questa piattaforma per open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "L'I/O diretto non è supportato su questa piattaforma.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "impossibile aprire il file di output"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "scrittura fallita"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync non è riuscito"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Confronta i metodi di sincronizzazione dei file utilizzando una scrittura di %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Confronta i metodi di sincronizzazione dei file utilizzando due scritture %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(nell'ordine di preferenza wal_sync_method, tranne che fdatasync è l'impostazione predefinita di Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Questo file system e le sue opzioni di montaggio non supportano Direct\n"
+" I/O, ad es. ext4 in modalità journal.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Confronta open_sync con diverse dimensioni di scrittura:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Questo è progettato per confrontare il costo di scrittura di 16kB in diverse scritture\n"
+"dimensioni open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16 kB di scrittura open_sync"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8 kB di scritture open_sync"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB di scrittura open_sync"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB di scritture open_sync"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB di scrittura open_sync"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Verifica se fsync sul descrittore di file non di scrittura è rispettato:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Se i tempi sono simili, fsync() può sincronizzare i dati scritti su un altro\n"
+"descrittore.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"%dkB non sincronizzato scrive:\n"
diff --git a/src/bin/pg_test_fsync/po/ja.po b/src/bin/pg_test_fsync/po/ja.po
new file mode 100644
index 0000000..b775b3b
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ja.po
@@ -0,0 +1,237 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL 16)\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:25+0900\n"
+"Last-Translator: Michihide Hotta <hotta@net-newbie.com>\n"
+"Language-Team: \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f æ“作/秒 %6.0f マイクロ秒/æ“作\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "アラーム用ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "使用法: %s [-f ファイルå] [-s テストã‚ãŸã‚Šã®ç§’æ•°]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "オプション%sã®å¼•æ•°ãŒä¸æ­£ã§ã™"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%sã¯%u..%uã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "テスト1件ã‚ãŸã‚Š %u秒\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ open_datasync 㨠open_sync ã«ã¤ã„㦠O_DIRECT ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ open_datasync 㨠open_sync ã«ã¤ã„㦠F_NOCACHE ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ I/O ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "出力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "書ãè¾¼ã¿ã«å¤±æ•—"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync ã«å¤±æ•—"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"1個㮠%dkB write を使ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«åŒæœŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’比較ã—ã¾ã™:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"2個㮠%dkB write を使ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«åŒæœŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’比較ã—ã¾ã™:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(wal_sync_method ã®æŒ‡å®šé †ã®ä¸­ã§ã€Linux ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚ã‚‹ fdatasync ã¯é™¤ãã¾ã™ï¼‰\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "利用ä¸å¯*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "利用ä¸å¯"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã¨ãã®ãƒžã‚¦ãƒ³ãƒˆã‚ªãƒ—ションã§ã¯ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ I/O をサãƒãƒ¼ãƒˆ\n"
+" ã—ã¦ã„ã¾ã›ã‚“。例)ジャーナルモード㮠ext4。\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"open_sync ã‚’ç•°ãªã£ãŸ write サイズã§æ¯”較ã—ã¾ã™:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(ã“れ㯠open_sync ã® write サイズを変ãˆãªãŒã‚‰ã€16kB write ã®ã‚³ã‚¹ãƒˆã‚’\n"
+"比較ã™ã‚‹ã‚ˆã†æŒ‡å®šã•ã‚Œã¦ã„ã¾ã™ã€‚)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync write"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync writes"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync writes"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync writes"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync writes"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"書ãè¾¼ã¿ãªã—ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—タ上㮠fsync ã®æ–¹ãŒå„ªã‚Œã¦ã„ã‚‹ã‹ã‚’テストã—ã¾ã™:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(もã—実行時間ãŒåŒç­‰ã§ã‚ã‚Œã°ã€fsync() ã¯ç•°ãªã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—タ上ã§\n"
+"データを sync ã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"%dkB ã® sync ãªã— write:\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "\"%s --help\" ã§è©³ç´°ã‚’確èªã—ã¦ãã ã•ã„。\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s: コマンドライン引数ãŒå¤šã™ãŽã¾ã™ï¼ˆå…ˆé ­ã¯ \"%s\")\n"
+
+#~ msgid "seek failed"
+#~ msgstr "seek 失敗"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
diff --git a/src/bin/pg_test_fsync/po/ka.po b/src/bin/pg_test_fsync/po/ka.po
new file mode 100644
index 0000000..b151f70
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ka.po
@@ -0,0 +1,226 @@
+# Georgian message translation file for pg_test_fsync
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-05 05:20+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f áƒáƒž/წმ %6.0f მკწმ/áƒáƒž\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილების ძáƒáƒ¤áƒ˜áƒ¡ შექმნრშეუძლებელიáƒ"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: %s [-f ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი] [-s წáƒáƒ›áƒ˜áƒ¢áƒ”სტი]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის: %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s- %u-დáƒáƒœ %u-მდე დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜ უნდრიყáƒáƒ¡"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u second per test\n"
+msgstr[1] "%u seconds per test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე O_DIRECT მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირopen_datasync დრopen_sync-სთვის.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე F_NOCACHE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირopen_datasync დრopen_sync-სთვის.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "DIRECT I/O áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync-ის შეცდáƒáƒ›áƒ"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"სინქრნიზáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ების შედáƒáƒ áƒ”ბრერთი %dკბ ჩáƒáƒ¬áƒ”რით:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"სინქრნიზáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ების შედáƒáƒ áƒ”ბრáƒáƒ áƒ˜ %dკბ ჩáƒáƒ¬áƒ”რით:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(wal_sync_method -ის რჩეული მიმდევრáƒáƒ‘ით, fdatasync-ის გáƒáƒ áƒ“áƒ, რáƒáƒ›áƒ”ლიც ლინუქსზე ნáƒáƒ’ულისხმებიáƒ)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* áƒáƒ› ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ¡ დრმის მიმáƒáƒ’რების პáƒáƒ áƒáƒ›áƒ”ტრებს პირდáƒáƒžáƒ˜áƒ áƒ˜ შეტáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡\n"
+"მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—. მáƒáƒ’: ext4 ჟურნáƒáƒšáƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რით.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"open_sync-ის შედáƒáƒ áƒ”ბრჩáƒáƒ¬áƒ”რის სხვáƒáƒ¤áƒáƒ¡áƒ®áƒ•áƒ ზáƒáƒ›áƒ”ბით:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(გáƒáƒœáƒ™áƒ£áƒ—ვნილირ16კბ-ის ჩáƒáƒ¬áƒ”რის ფáƒáƒ¡áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ áƒ™áƒ•áƒ”ვáƒáƒ“ \n"
+"open_sync-ის სხვáƒáƒ“სხვრზáƒáƒ›áƒ”ბის დრáƒáƒ¡.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16კბ open_sync ჩáƒáƒ¬áƒ”რáƒ"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8კბ open_sync ჩáƒáƒ¬áƒ”რáƒ"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4კბ open_sync ჩáƒáƒ¬áƒ”რáƒ"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2კბ open_sync ჩáƒáƒ¬áƒ”რáƒ"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1კბ open_sync ჩáƒáƒ¬áƒ”რáƒ"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"შემáƒáƒ¬áƒ›áƒ”ბáƒ, ხდებრთუ áƒáƒ áƒ fsync ფáƒáƒ˜áƒšáƒ˜áƒ¡ მითითებით, რáƒáƒ›áƒ”ლიც კთხვისთვისáƒáƒ გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜.\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(თუ დრáƒáƒ”ბი ჰგვáƒáƒœáƒáƒœ, fsync()-ს შეუძლირმáƒáƒœáƒáƒªáƒ”მების სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ,\n"
+"რáƒáƒ›áƒ”ლიც სხვრდესკრიპტáƒáƒ áƒ˜áƒ— ჩáƒáƒ˜áƒ¬áƒ”რáƒ)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"áƒáƒ áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ˜áƒ–ებული %dკბ ჩáƒáƒ¬áƒ”რები:\n"
diff --git a/src/bin/pg_test_fsync/po/ko.po b/src/bin/pg_test_fsync/po/ko.po
new file mode 100644
index 0000000..d26cbae
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ko.po
@@ -0,0 +1,228 @@
+# LANGUAGE 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.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:52+0000\n"
+"PO-Revision-Date: 2023-05-30 12:39+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "알람용 쓰레드를 만들 수 ì—†ìŒ"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "사용법: %s [-f 파ì¼ì´ë¦„] [-s 검사초]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "%s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s ê°’ì€ %u부터 %u까지 지정할 수 있습니다."
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "검사 간격: %u초\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"ì´ í”Œëž«í¼ì—서는 open_datasync, open_sync ì—ì„œ O_DIRECT ì˜µì…˜ì„ ì§€ì›í•¨.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"ì´ í”Œëž«í¼ì—서는 open_datasync, open_sync ì—ì„œ F_NOCACHE ì˜µì…˜ì„ ì§€ì›í•¨.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "ì´ í”Œëž«í¼ì€ direct I/O ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ ì•ŠìŒ.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357
+#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537
+#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581
+msgid "could not open output file"
+msgstr "출력 파ì¼ì„ ì—´ 수 ì—†ìŒ"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344
+#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429
+#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555
+#: pg_test_fsync.c:586
+msgid "write failed"
+msgstr "쓰기 실패"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392
+#: pg_test_fsync.c:529 pg_test_fsync.c:561
+msgid "fsync failed"
+msgstr "fsync 실패"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"í•˜ë‚˜ì˜ %dkB ì“°ê¸°ì— ëŒ€í•œ íŒŒì¼ ì‹±í¬ ë°©ë²• 비êµ:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"ë‘ê°œì˜ %dkB ì“°ê¸°ì— ëŒ€í•œ íŒŒì¼ ì‹±í¬ ë°©ë²• 비êµ:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid ""
+"(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr ""
+"(fdatasyncê°€ 리눅스 기본값ì´ê¸°ì— 제외하고, wal_sync_method 우선으로 처리 "
+"함)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435
+#: pg_test_fsync.c:494
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:440
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* ì´ íŒŒì¼ ì‹œìŠ¤í…œê³¼ 마운트 ì˜µì…˜ì´ direct I/O ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ ì•ŠìŒ\n"
+" 예: journaled modeì—ì„œ ext4\n"
+
+#: pg_test_fsync.c:448
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"서로 다른 쓰기량으로 open_sync 비êµ:\n"
+
+#: pg_test_fsync.c:449
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(서로 다른 í¬ê¸°ë¡œ 16kB를 쓰는ë°, open_sync ì˜µì…˜ì„ ì‚¬ìš©í•  ë•Œì˜ ë¹„ìš© 비êµ)\n"
+
+#: pg_test_fsync.c:452
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync 쓰기"
+
+#: pg_test_fsync.c:453
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync 쓰기"
+
+#: pg_test_fsync.c:454
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync 쓰기"
+
+#: pg_test_fsync.c:455
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync 쓰기"
+
+#: pg_test_fsync.c:456
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync 쓰기"
+
+#: pg_test_fsync.c:510
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"쓰기 방지 파ì¼ì—ì„œ fsync ìž‘ë™ ì—¬ë¶€ 검사:\n"
+
+#: pg_test_fsync.c:511
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(ì´ ê°’ì´ ë¹„ìŠ·í•˜ë‹¤ë©´, fsync() 호출로 여러 íŒŒì¼ ìƒíƒœì— 대해서 sync를 사용\n"
+"í•  수 있ìŒ.)\n"
+
+#: pg_test_fsync.c:576
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Non-sync %dkB 쓰기:\n"
diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build
new file mode 100644
index 0000000..46d0ac5
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_test_fsync/po/pl.po b/src/bin/pg_test_fsync/po/pl.po
new file mode 100644
index 0000000..1554043
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/pl.po
@@ -0,0 +1,189 @@
+# LANGUAGE 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.
+# grzegorz <begina.felicysym@wp.eu>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-03-14 17:46+0000\n"
+"PO-Revision-Date: 2017-03-14 19:29+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: pg_test_fsync.c:47
+#, c-format
+msgid "Cannot create thread for alarm\n"
+msgstr "Nie da się utworzyć wątku dla alarmu\n"
+
+#: pg_test_fsync.c:152
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Składnia: %s [-f NAZWAPLIKU] [-s SEK-NA-TEST]\n"
+
+#: pg_test_fsync.c:176 pg_test_fsync.c:188
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Użyj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_test_fsync.c:186
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_test_fsync.c:193
+#, c-format
+msgid "%d seconds per test\n"
+msgstr "%d sekund na test\n"
+
+#: pg_test_fsync.c:195
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT wspierane na tej platformie dla open_datasync i open_sync.\n"
+
+#: pg_test_fsync.c:197
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Bezpośrednie We/Wy nie jest wspierane na tej platformie.\n"
+
+#: pg_test_fsync.c:222 pg_test_fsync.c:286 pg_test_fsync.c:310
+#: pg_test_fsync.c:333 pg_test_fsync.c:474 pg_test_fsync.c:486
+#: pg_test_fsync.c:502 pg_test_fsync.c:508 pg_test_fsync.c:533
+msgid "could not open output file"
+msgstr "nie można otworzyć pliku wyjścia"
+
+#: pg_test_fsync.c:225 pg_test_fsync.c:267 pg_test_fsync.c:292
+#: pg_test_fsync.c:316 pg_test_fsync.c:339 pg_test_fsync.c:377
+#: pg_test_fsync.c:435 pg_test_fsync.c:476 pg_test_fsync.c:504
+#: pg_test_fsync.c:535
+msgid "write failed"
+msgstr "niepowodzenie zapisu"
+
+#: pg_test_fsync.c:229 pg_test_fsync.c:318 pg_test_fsync.c:341
+#: pg_test_fsync.c:478 pg_test_fsync.c:510
+msgid "fsync failed"
+msgstr "niepowodzenie fsync"
+
+#: pg_test_fsync.c:243
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Porównanie metod sync plików używając jednego zapisu %dkB:\n"
+
+#: pg_test_fsync.c:245
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Porównanie metod sync plików używając dwóch zapisów %dkB:\n"
+
+#: pg_test_fsync.c:246
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(w porząsku preferencji wal_sync_method, poza fdatasync domyślną na "
+"Linuksie)\n"
+
+#: pg_test_fsync.c:257 pg_test_fsync.c:360 pg_test_fsync.c:426
+msgid "n/a*\n"
+msgstr "nd.*\n"
+
+#: pg_test_fsync.c:269 pg_test_fsync.c:295 pg_test_fsync.c:320
+#: pg_test_fsync.c:343 pg_test_fsync.c:379 pg_test_fsync.c:437
+msgid "seek failed"
+msgstr "niepowodzenie pozycjonowania"
+
+#: pg_test_fsync.c:275 pg_test_fsync.c:300 pg_test_fsync.c:348
+#: pg_test_fsync.c:385 pg_test_fsync.c:443
+msgid "n/a\n"
+msgstr "nd.\n"
+
+#: pg_test_fsync.c:390
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Ten system plików i jego opcje systemowe mount nie obsługują\n"
+" bezpośredniego We/Wy, np. ext4 trybie dziennikowym.\n"
+
+#: pg_test_fsync.c:398
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Porównanie open_sync z różnymi długościami zapisu:\n"
+
+#: pg_test_fsync.c:399
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Zaprojektowano to dla porównanie kosztów zapisu 16kB w różnych \n"
+"długościach zapisu open_sync.)\n"
+
+#: pg_test_fsync.c:402
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB zapis open_sync"
+
+#: pg_test_fsync.c:403
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB zapis open_sync"
+
+#: pg_test_fsync.c:404
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB zapis open_sync"
+
+#: pg_test_fsync.c:405
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB zapis open_sync"
+
+#: pg_test_fsync.c:406
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB zapis open_sync"
+
+#: pg_test_fsync.c:459
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Test czy jest honorowany fsync na niezapisywalnym deskryptorze pliku:\n"
+
+#: pg_test_fsync.c:460
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Jeśli czasy są podobne, fsync() może sync dane zapisane na innym\n"
+"deskryptorze.)\n"
+
+#: pg_test_fsync.c:525
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Nie-syncowane zapisy %dkB:\n"
+
+#: pg_test_fsync.c:602
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
diff --git a/src/bin/pg_test_fsync/po/pt_BR.po b/src/bin/pg_test_fsync/po/pt_BR.po
new file mode 100644
index 0000000..e75dcd2
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/pt_BR.po
@@ -0,0 +1,227 @@
+# Brazilian Portuguese message translation file for pg_test_fsync
+#
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2023-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 13:02-0300\n"
+"PO-Revision-Date: 2023-09-27 18:50-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/seg %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "não pôde criar thread para alarme"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Uso: %s [-f ARQUIVO] [-s SEGS-POR-TESTE]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "argumento inválido para opção %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s deve estar no intervalo de %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u segundo por teste\n"
+msgstr[1] "%u segundos por teste\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT suportado nesta plataforma para open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE suportado nesta plataforma para open_datasync e open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direct I/O não é suportado nesta plataforma.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357
+#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537
+#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581
+msgid "could not open output file"
+msgstr "não pôde abrir arquivo de saída"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344
+#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429
+#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555
+#: pg_test_fsync.c:586
+msgid "write failed"
+msgstr "escrita falhou"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392
+#: pg_test_fsync.c:529 pg_test_fsync.c:561
+msgid "fsync failed"
+msgstr "fsync falhou"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Compara métodos de sincronização de arquivos utilizando uma escrita de %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Compara métodos de sincronização de arquivos utilizando duas escritas de %dkB:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(em ordem de preferência do wal_sync_method, exceto fdatasync que é o padrão do Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435
+#: pg_test_fsync.c:494
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:440
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Este sistema de arquivos e suas opções de montagem não suportam\n"
+" direct I/O, e.g. ext4 em modo journal.\n"
+
+#: pg_test_fsync.c:448
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Compara open_sync com diferentes tamanhos de escrita:\n"
+
+#: pg_test_fsync.c:449
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Isso é projetado para comparar o custo de escrita de 16jB em diferentes tamanhos\n"
+"de escrita com open_sync.)\n"
+
+#: pg_test_fsync.c:452
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * escrita de 16kB open_sync"
+
+#: pg_test_fsync.c:453
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * escritas de 8kB open_sync"
+
+#: pg_test_fsync.c:454
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * escritas de 4kB open_sync"
+
+#: pg_test_fsync.c:455
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * escritas de 2kB open_sync"
+
+#: pg_test_fsync.c:456
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * escritas de 1kB open_sync"
+
+#: pg_test_fsync.c:510
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Testar se o fsync em um descritor de arquivo sem escrita é respeitado:\n"
+
+#: pg_test_fsync.c:511
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Se os tempos são similares, fsync() pode sincronizar dados escritos em um\n"
+"descritor diferente.)\n"
+
+#: pg_test_fsync.c:576
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Escritas de %dkB não sincronizadas:\n"
diff --git a/src/bin/pg_test_fsync/po/ru.po b/src/bin/pg_test_fsync/po/ru.po
new file mode 100644
index 0000000..3ee354d
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/ru.po
@@ -0,0 +1,238 @@
+# 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 <a.lakhin@postgrespro.ru>, 2017, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-28 07:59+0300\n"
+"PO-Revision-Date: 2022-09-05 13:36+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f оп/Ñ %6.0f мкÑ/оп\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "не удалоÑÑŒ Ñоздать поток Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñигналов"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "ИÑпользование: %s [-f ИМЯ_ФÐЙЛР] [-s ТЕСТ_СЕК]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "недопуÑтимый аргумент параметра %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "значение %s должно быть в диапазоне %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "на теÑÑ‚ отводитÑÑ %u Ñек.\n"
+msgstr[1] "на теÑÑ‚ отводитÑÑ %u Ñек.\n"
+msgstr[2] "на теÑÑ‚ отводитÑÑ %u Ñек.\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"O_DIRECT на Ñтой платформе не поддерживаетÑÑ Ð´Ð»Ñ open_datasync и open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr ""
+"F_NOCACHE на Ñтой платформе поддерживаетÑÑ Ð´Ð»Ñ open_datasync и open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "ПрÑмой ввод/вывод не поддерживаетÑÑ Ð½Ð° Ñтой платформе.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357
+#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537
+#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581
+msgid "could not open output file"
+msgstr "не удалоÑÑŒ открыть выходной файл"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344
+#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429
+#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555
+#: pg_test_fsync.c:586
+msgid "write failed"
+msgstr "ошибка запиÑи"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392
+#: pg_test_fsync.c:529 pg_test_fsync.c:561
+msgid "fsync failed"
+msgstr "ошибка Ñинхронизации Ñ Ð¤Ð¡"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Сравнение методов Ñинхронизации файлов при однократной запиÑи %d КБ:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Сравнение методов Ñинхронизации файлов при двухкратной запиÑи %d КБ:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid ""
+"(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr ""
+"(в порÑдке Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð»Ñ wal_sync_method, без учёта наибольшего "
+"Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ fdatasync в Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476
+msgid "n/a*"
+msgstr "н/д*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435
+#: pg_test_fsync.c:494
+msgid "n/a"
+msgstr "н/д"
+
+#: pg_test_fsync.c:440
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Эта Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼Ð¸ параметрами Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ поддерживает\n"
+" прÑмой ввод/вывод, как например, ext4 в режиме журналированиÑ.\n"
+
+#: pg_test_fsync.c:448
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Сравнение open_sync при различных объёмах запиÑываемых данных:\n"
+
+#: pg_test_fsync.c:449
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Этот теÑÑ‚ предназначен Ð´Ð»Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ ÑтоимоÑти запиÑи 16 КБ при разных "
+"размерах\n"
+"запиÑи Ñ open_sync.)\n"
+
+# skip-rule: double-space
+#: pg_test_fsync.c:452
+msgid " 1 * 16kB open_sync write"
+msgstr "запиÑÑŒ Ñ open_sync 1 * 16 КБ"
+
+#: pg_test_fsync.c:453
+msgid " 2 * 8kB open_sync writes"
+msgstr "запиÑÑŒ Ñ open_sync 2 * 8 КБ"
+
+#: pg_test_fsync.c:454
+msgid " 4 * 4kB open_sync writes"
+msgstr "запиÑÑŒ Ñ open_sync 4 * 4 КБ"
+
+#: pg_test_fsync.c:455
+msgid " 8 * 2kB open_sync writes"
+msgstr "запиÑÑŒ Ñ open_sync 8 * 2 КБ"
+
+#: pg_test_fsync.c:456
+msgid "16 * 1kB open_sync writes"
+msgstr "запиÑÑŒ Ñ open_sync 16 * 1 КБ"
+
+#: pg_test_fsync.c:510
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Проверка, производитÑÑ Ð»Ð¸ fsync Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»ÐµÐ¼ файла, открытого не Ð´Ð»Ñ "
+"запиÑи:\n"
+
+#: pg_test_fsync.c:511
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(ЕÑли длительноÑÑ‚ÑŒ примерно одинаковаÑ, fsync() может Ñинхронизировать "
+"данные,\n"
+"запиÑанные через другой деÑкриптор.)\n"
+
+#: pg_test_fsync.c:576
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"ÐеÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ %d КБ:\n"
+
+#~ msgid "seek failed"
+#~ msgstr "ошибка позиционированиÑ"
diff --git a/src/bin/pg_test_fsync/po/sv.po b/src/bin/pg_test_fsync/po/sv.po
new file mode 100644
index 0000000..45f059e
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/sv.po
@@ -0,0 +1,229 @@
+# Swedish 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.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:51+0000\n"
+"PO-Revision-Date: 2022-05-09 21:44+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sek %6.0f useks/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "kunde inte skapa alarmtråd"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Användning: %s [-f FILENAMN] [-s SEK-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "ogiltigt argument för flaggan %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s måste vara i intervallet %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u sekund per test\n"
+msgstr[1] "%u sekunder per test\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT stöds på denna plattform för open_datasync och open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE stöds på denna plattform för open_datasync och open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "Direkt I/O stöds inte på denna plattform.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "kunde inte öppna utdatafil"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "skrivning misslyckades"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "fsync misslyckades"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Jämför filsynkningsmetoder genom att använda en %dkB-skrivning:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Jämför filsynkningsmetoder genom att använda två %dkB-skrivningar:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(i wal_sync_method inställningsordning, förutom att fdatasync är standard i Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "ej tillämpbar*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "ej tillämpbar"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Detta filsystem och dess monteringsflaffor stöder inte\n"
+" direkt I/O, t.ex. ext4 i journalläge.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"Jämför open_sync med olika skrivstorlekar:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Detta är gjort för att jämföra kostnaden att skriva 16kB med olika\n"
+"open_sync skrivstorlekar.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync skrivning"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync skrivningar"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync skrivningar"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync skrivningar"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync skrivningar"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Testa om fsync på en icke skrivbar fildeskriptor respekteras:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Om tiderna är liknande, så kan fsync() synka data skriven på\n"
+"olika deskriptorer.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Icke-synkade %dkB-skrivningar:\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Försök med \"%s --help\" för mer information.\n"
diff --git a/src/bin/pg_test_fsync/po/tr.po b/src/bin/pg_test_fsync/po/tr.po
new file mode 100644
index 0000000..12f0e28
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/tr.po
@@ -0,0 +1,194 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+# Abdullah GÃœLNER <agulner@gmail.com>, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-11-28 12:46+0000\n"
+"PO-Revision-Date: 2018-11-28 17:01+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:30
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:49
+#, c-format
+msgid "Could not create thread for alarm\n"
+msgstr "Alarm için thread oluşturulamadı\n"
+
+#: pg_test_fsync.c:154
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Kullanımı: %s [-f DOSYAADI] [-s TEST-BASINA-SANIYE]\n"
+
+#: pg_test_fsync.c:178 pg_test_fsync.c:190
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: pg_test_fsync.c:188
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: Çok fazla komut satırı girdisi var (ilki \"%s\")\n"
+
+#: pg_test_fsync.c:195
+#, c-format
+msgid "%d second per test\n"
+msgid_plural "%d seconds per test\n"
+msgstr[0] "test başına %d saniye\n"
+
+#: pg_test_fsync.c:200
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "Bu platformda open_datasync ve open_sync için O_DIRECT destekleniyor.\n"
+
+#: pg_test_fsync.c:202
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "DoÄŸrudan I/O bu platformda desteklenmiyor.\n"
+
+#: pg_test_fsync.c:227 pg_test_fsync.c:292 pg_test_fsync.c:316
+#: pg_test_fsync.c:339 pg_test_fsync.c:480 pg_test_fsync.c:492
+#: pg_test_fsync.c:508 pg_test_fsync.c:514 pg_test_fsync.c:539
+msgid "could not open output file"
+msgstr "çıktı dosyası açılamadı"
+
+#: pg_test_fsync.c:231 pg_test_fsync.c:273 pg_test_fsync.c:298
+#: pg_test_fsync.c:322 pg_test_fsync.c:345 pg_test_fsync.c:383
+#: pg_test_fsync.c:441 pg_test_fsync.c:482 pg_test_fsync.c:510
+#: pg_test_fsync.c:541
+msgid "write failed"
+msgstr "yazma başarısız oldu"
+
+#: pg_test_fsync.c:235 pg_test_fsync.c:324 pg_test_fsync.c:347
+#: pg_test_fsync.c:484 pg_test_fsync.c:516
+msgid "fsync failed"
+msgstr "fsync başarısız oldu"
+
+#: pg_test_fsync.c:249
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"Dosya sync yöntemlerini bir %dkB yazma kullanarak karşılaştır\n"
+
+#: pg_test_fsync.c:251
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"Dosya sync yöntemlerini iki %dkB yazma kullanarak karşılaştır\n"
+
+#: pg_test_fsync.c:252
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(wal_sync_method tercih sırasında, fdatadync'in Linux'un varsayılanı olması dışında)\n"
+
+#: pg_test_fsync.c:263 pg_test_fsync.c:366 pg_test_fsync.c:432
+msgid "n/a*"
+msgstr "n/a* (uygulanamaz)"
+
+#: pg_test_fsync.c:275 pg_test_fsync.c:301 pg_test_fsync.c:326
+#: pg_test_fsync.c:349 pg_test_fsync.c:385 pg_test_fsync.c:443
+msgid "seek failed"
+msgstr "arama başarıız oldu"
+
+#: pg_test_fsync.c:281 pg_test_fsync.c:306 pg_test_fsync.c:354
+#: pg_test_fsync.c:391 pg_test_fsync.c:449
+msgid "n/a"
+msgstr "n/a (uygulanamaz)"
+
+#: pg_test_fsync.c:396
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Bu dosya sistemi ve bağlama (mount) seçenekleri doğrudan I/O\n"
+" desteklemiyor, örn: günlüklü modda ext4.\n"
+
+#: pg_test_fsync.c:404
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"open_sync ile farklı yazma boyutlarını kıyaslayın\n"
+
+#: pg_test_fsync.c:405
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Bu, farklı write open-sync boyutlarında 16kB yazma maliyetini karşılaştırmak\n"
+"için tasarlanmıştır.)\n"
+
+#: pg_test_fsync.c:408
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync yazma"
+
+#: pg_test_fsync.c:409
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync yazma"
+
+#: pg_test_fsync.c:410
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync yazma"
+
+#: pg_test_fsync.c:411
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync yazma"
+
+#: pg_test_fsync.c:412
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync yazma"
+
+#: pg_test_fsync.c:465
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+
+#: pg_test_fsync.c:466
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Zamanlar benzerse, fsync() farklı bir tanımlayıcıda (descriptor) yazılmış veriyi\n"
+"senkronize edebilir.)\n"
+
+#: pg_test_fsync.c:531
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"sync edilmemiÅŸ %dkB yazma:\n"
+
+#: pg_test_fsync.c:608
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
diff --git a/src/bin/pg_test_fsync/po/uk.po b/src/bin/pg_test_fsync/po/uk.po
new file mode 100644
index 0000000..00a789b
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/uk.po
@@ -0,0 +1,211 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:51+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_test_fsync.pot\n"
+"X-Crowdin-File-ID: 886\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f оп/Ñ %6.0f мкÑ/оп\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "не вдалоÑÑ Ñтворити потік Ð´Ð»Ñ Ñигналізації"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "ВикориÑтаннÑ: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s"
+
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s має бути в діапазоні %u..%u"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "%u Ñекунда на теÑÑ‚\n"
+msgstr[1] "%u Ñекунди на теÑÑ‚\n"
+msgstr[2] "%u Ñекунд на теÑÑ‚\n"
+msgstr[3] "%u Ñекунд на теÑÑ‚\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT на цій платформі підтримуєтьÑÑ Ð´Ð»Ñ open_datasync Ñ– open_sync.\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "F_NOCACHE підтримуєтьÑÑ Ð½Ð° цій платформі Ð´Ð»Ñ open_datasync Ñ– open_sync.\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "ПрÑме введеннÑ/Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð½Ð° цій платформі.\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361
+#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541
+#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585
+msgid "could not open output file"
+msgstr "неможливо відкрити файл виводу"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345
+#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433
+#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559
+#: pg_test_fsync.c:590
+msgid "write failed"
+msgstr "запиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396
+#: pg_test_fsync.c:533 pg_test_fsync.c:565
+msgid "fsync failed"
+msgstr "помилка fsync"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid "\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr "\n"
+"ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² Ñинхронізації файлу, викориÑтовуючи один Ð·Ð°Ð¿Ð¸Ñ %dkB:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid "\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr "\n"
+"ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² Ñинхронізації файлу, викориÑтовуючи два запиÑи %dkB: \n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(в порÑдку переваги Ð´Ð»Ñ wal_sync_method, окрім переваги fdatasync в Linux)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480
+msgid "n/a*"
+msgstr "н/д*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401
+#: pg_test_fsync.c:439 pg_test_fsync.c:498
+msgid "n/a"
+msgstr "н/д"
+
+#: pg_test_fsync.c:444
+#, c-format
+msgid "* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr "* Ð¦Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð° ÑиÑтема з поточними параметрами Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримує\n"
+" прÑме введеннÑ/виведеннÑ, наприклад, ext4 в режимі журналюваннÑ.\n"
+
+#: pg_test_fsync.c:452
+#, c-format
+msgid "\n"
+"Compare open_sync with different write sizes:\n"
+msgstr "\n"
+"ПорівнÑÐ½Ð½Ñ open_sync з різними розмірами запиÑуваннÑ:\n"
+
+#: pg_test_fsync.c:453
+#, c-format
+msgid "(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr "(Це Ñтворено Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑÐ½Ð½Ñ Ð²Ð°Ñ€Ñ‚Ð¾ÑÑ‚Ñ– запиÑу 16 КБ з різними розмірами\n"
+"запиÑÑƒÐ²Ð°Ð½Ð½Ñ open_sync.)\n"
+
+#: pg_test_fsync.c:456
+msgid " 1 * 16kB open_sync write"
+msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 1 * 16 КБ"
+
+#: pg_test_fsync.c:457
+msgid " 2 * 8kB open_sync writes"
+msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 2 * 8 КБ"
+
+#: pg_test_fsync.c:458
+msgid " 4 * 4kB open_sync writes"
+msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 4 * 4 КБ"
+
+#: pg_test_fsync.c:459
+msgid " 8 * 2kB open_sync writes"
+msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 8 * 2 КБ"
+
+#: pg_test_fsync.c:460
+msgid "16 * 1kB open_sync writes"
+msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 16 * 1 КБ"
+
+#: pg_test_fsync.c:514
+#, c-format
+msgid "\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr "\n"
+"Перевірка, чи здійÑнюєтьÑÑ fsync з деÑкриптором файлу, відкритого не Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу:\n"
+
+#: pg_test_fsync.c:515
+#, c-format
+msgid "(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr "(Якщо Ñ‡Ð°Ñ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¹, fsync() може Ñинхронізувати дані, запиÑані іншим деÑкриптором.)\n"
+
+#: pg_test_fsync.c:580
+#, c-format
+msgid "\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr "\n"
+"ÐеÑинхронізований Ð·Ð°Ð¿Ð¸Ñ %d КБ:\n"
+
diff --git a/src/bin/pg_test_fsync/po/vi.po b/src/bin/pg_test_fsync/po/vi.po
new file mode 100644
index 0000000..32a5b54
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/vi.po
@@ -0,0 +1,195 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:17+0000\n"
+"PO-Revision-Date: 2018-04-30 00:47+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Language: vi_VN\n"
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:30
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f thao tác/giây %6.0f micro giây/thao tác\n"
+
+#: pg_test_fsync.c:49
+#, c-format
+msgid "Could not create thread for alarm\n"
+msgstr "Không thể tạo luồng sử dụng cho alarm\n"
+
+#: pg_test_fsync.c:154
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "Cách sử dụng: %s [-f TÊN FILE] [-s SỠGIÂY CHO MỘT KIỂM TRA]\n"
+
+#: pg_test_fsync.c:178 pg_test_fsync.c:190
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_test_fsync.c:188
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: quá nhiá»u đối số cho câu lệnh (đầu tiên là \"%s\")\n"
+
+#: pg_test_fsync.c:195
+#, c-format
+msgid "%d second per test\n"
+msgid_plural "%d seconds per test\n"
+msgstr[0] "%d giây cho mỗi kiểm tra\n"
+
+#: pg_test_fsync.c:200
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "O_DIRECT được há»— trợ trên hệ Ä‘iá»u hành này cho open_datasync và open_sync.\n"
+
+#: pg_test_fsync.c:202
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "I/O trá»±c tiếp không được há»— trợ trên hệ Ä‘iá»u hành này.\n"
+
+#: pg_test_fsync.c:227 pg_test_fsync.c:292 pg_test_fsync.c:316
+#: pg_test_fsync.c:339 pg_test_fsync.c:480 pg_test_fsync.c:492
+#: pg_test_fsync.c:508 pg_test_fsync.c:514 pg_test_fsync.c:539
+msgid "could not open output file"
+msgstr "không thể mở tập tin đầu ra"
+
+#: pg_test_fsync.c:231 pg_test_fsync.c:273 pg_test_fsync.c:298
+#: pg_test_fsync.c:322 pg_test_fsync.c:345 pg_test_fsync.c:383
+#: pg_test_fsync.c:441 pg_test_fsync.c:482 pg_test_fsync.c:510
+#: pg_test_fsync.c:541
+msgid "write failed"
+msgstr "viết không thành công"
+
+#: pg_test_fsync.c:235 pg_test_fsync.c:324 pg_test_fsync.c:347
+#: pg_test_fsync.c:484 pg_test_fsync.c:516
+msgid "fsync failed"
+msgstr "đồng bộ không thành công"
+
+#: pg_test_fsync.c:249
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"So sánh các phương pháp đồng bộ hóa tệp sử dụng viết một %dkB:\n"
+
+#: pg_test_fsync.c:251
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"So sánh các phương pháp đồng bộ hóa tệp sử dụng viết hai %dkB:\n"
+
+#: pg_test_fsync.c:252
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(theo thứ tự ưu tiên tham số wal_sync_method, ngoại trừ fdatasync là mặc định của Linux)\n"
+
+#: pg_test_fsync.c:263 pg_test_fsync.c:366 pg_test_fsync.c:432
+msgid "n/a*"
+msgstr "không khả dụng*"
+
+#: pg_test_fsync.c:275 pg_test_fsync.c:301 pg_test_fsync.c:326
+#: pg_test_fsync.c:349 pg_test_fsync.c:385 pg_test_fsync.c:443
+msgid "seek failed"
+msgstr "seek lá»—i"
+
+#: pg_test_fsync.c:281 pg_test_fsync.c:306 pg_test_fsync.c:354
+#: pg_test_fsync.c:391 pg_test_fsync.c:449
+msgid "n/a"
+msgstr "không khả dụng"
+
+#: pg_test_fsync.c:396
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* Hệ thống tệp này và tùy chá»n mount không há»— trợ I/O trá»±c tiếp\n"
+" ví dụ: ext4 trong chế độ journaled.\n"
+
+#: pg_test_fsync.c:404
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"So sánh open_sync với các kích thước ghi khác nhau:\n"
+
+#: pg_test_fsync.c:405
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr ""
+"(Äiá»u này được thiết kế để so sánh cost của việc viết 16kB trong các \n"
+"kích thước open_sync khác nhau.)\n"
+
+#: pg_test_fsync.c:408
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync write"
+
+#: pg_test_fsync.c:409
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync writes"
+
+#: pg_test_fsync.c:410
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync writes"
+
+#: pg_test_fsync.c:411
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync writes"
+
+#: pg_test_fsync.c:412
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync writes"
+
+#: pg_test_fsync.c:465
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"Kiểm tra xem fsync trên tệp descrtiptor không ghi có tốt không:\n"
+
+#: pg_test_fsync.c:466
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr ""
+"(Nếu số lần là tương đương, fsync() có thể đồng bộ dữ liệu được ghi ở \n"
+"descriptor khác.)\n"
+
+#: pg_test_fsync.c:531
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"Viết %dkB không sync:\n"
+
+#: pg_test_fsync.c:608
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
diff --git a/src/bin/pg_test_fsync/po/zh_CN.po b/src/bin/pg_test_fsync/po/zh_CN.po
new file mode 100644
index 0000000..6331efd
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/zh_CN.po
@@ -0,0 +1,176 @@
+# LANGUAGE message translation file for pg_test_fsync
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@cn.fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 12\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-05-22 17:56+0800\n"
+"PO-Revision-Date: 2019-05-31 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@cn.fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@cn.fujitsu.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:31
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:157
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "用法: %s [-f 文件å] [-s æ¯æ¬¡æµ‹è¯•çš„秒数]\n"
+
+#: pg_test_fsync.c:181 pg_test_fsync.c:192
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_test_fsync.c:197
+#, c-format
+msgid "%d second per test\n"
+msgid_plural "%d seconds per test\n"
+msgstr[0] "%d æ¯æ¬¡æµ‹è¯•çš„秒数\n"
+msgstr[1] "%d æ¯æ¬¡æµ‹è¯•çš„秒数\n"
+
+#: pg_test_fsync.c:202
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "在此平å°ä¸Šï¼ŒO_DIRECT支æŒopen_datasyncå’Œopen_sync.\n"
+
+#: pg_test_fsync.c:204
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "此平å°ä¸æ”¯æŒç›´æŽ¥I/O.\n"
+
+#: pg_test_fsync.c:229 pg_test_fsync.c:294 pg_test_fsync.c:318
+#: pg_test_fsync.c:341 pg_test_fsync.c:482 pg_test_fsync.c:494
+#: pg_test_fsync.c:510 pg_test_fsync.c:516 pg_test_fsync.c:541
+msgid "could not open output file"
+msgstr "无法打开输出文件"
+
+#: pg_test_fsync.c:233 pg_test_fsync.c:275 pg_test_fsync.c:300
+#: pg_test_fsync.c:324 pg_test_fsync.c:347 pg_test_fsync.c:385
+#: pg_test_fsync.c:443 pg_test_fsync.c:484 pg_test_fsync.c:512
+#: pg_test_fsync.c:543
+msgid "write failed"
+msgstr "写入失败"
+
+#: pg_test_fsync.c:237 pg_test_fsync.c:326 pg_test_fsync.c:349
+#: pg_test_fsync.c:486 pg_test_fsync.c:518
+msgid "fsync failed"
+msgstr "fsync失败"
+
+#: pg_test_fsync.c:251
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"使用一个%dkB写æ“作比较文件åŒæ­¥æ–¹æ³•:\n"
+
+#: pg_test_fsync.c:253
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"使用两个%dkB写æ“作比较文件åŒæ­¥æ–¹æ³•:\n"
+
+#: pg_test_fsync.c:254
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(按照wal_sync_method首选顺åºï¼Œfdatasync是Linux的默认值除外)\n"
+
+#: pg_test_fsync.c:265 pg_test_fsync.c:368 pg_test_fsync.c:434
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:277 pg_test_fsync.c:303 pg_test_fsync.c:328
+#: pg_test_fsync.c:351 pg_test_fsync.c:387 pg_test_fsync.c:445
+msgid "seek failed"
+msgstr "查找失败"
+
+#: pg_test_fsync.c:283 pg_test_fsync.c:308 pg_test_fsync.c:356
+#: pg_test_fsync.c:393 pg_test_fsync.c:451
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:398
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr ""
+"* 此文件系统åŠå…¶å®‰è£…选项ä¸æ”¯æŒç›´æŽ¥I/O\n"
+" 例如. ext4 在 journaled 模å¼.\n"
+
+#: pg_test_fsync.c:406
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"在ä¸åŒçš„写入大å°çš„情况下比较open_sync:\n"
+
+#: pg_test_fsync.c:407
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr "这是为了比较在写入ä¸åŒçš„open_sync大å°çš„情况下写入16kB的时间花费\n"
+
+#: pg_test_fsync.c:410
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync写入"
+
+#: pg_test_fsync.c:411
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync写入"
+
+#: pg_test_fsync.c:412
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync写入"
+
+#: pg_test_fsync.c:413
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync写入"
+
+#: pg_test_fsync.c:414
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync写入"
+
+#: pg_test_fsync.c:467
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"测试是å¦æ”¯æŒéžå†™æ–‡ä»¶æ述符上的fsync:\n"
+
+#: pg_test_fsync.c:468
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr "(如果时间相似,fsync()å¯ä»¥åŒæ­¥å†™åœ¨ä¸åŒæ述符上的数æ®.)\n"
+
+#: pg_test_fsync.c:533
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"ä¸åŒæ­¥çš„写入 %dkB :\n"
diff --git a/src/bin/pg_test_fsync/po/zh_TW.po b/src/bin/pg_test_fsync/po/zh_TW.po
new file mode 100644
index 0000000..2a78535
--- /dev/null
+++ b/src/bin/pg_test_fsync/po/zh_TW.po
@@ -0,0 +1,221 @@
+# Traditional Chinese message translation file for pg_test_fsync
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_fsync (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:52+0000\n"
+"PO-Revision-Date: 2023-11-06 08:49+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+#. translator: maintain alignment with NA_FORMAT
+#: pg_test_fsync.c:32
+#, c-format
+msgid "%13.3f ops/sec %6.0f usecs/op\n"
+msgstr "%13.3f ops/sec %6.0f usecs/op\n"
+
+#: pg_test_fsync.c:50
+#, c-format
+msgid "could not create thread for alarm"
+msgstr "無法為警報建立執行緒"
+
+#: pg_test_fsync.c:95
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: pg_test_fsync.c:159
+#, c-format
+msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+msgstr "用法: %s [-f FILENAME] [-s SECS-PER-TEST]\n"
+
+#: pg_test_fsync.c:185
+#, c-format
+msgid "invalid argument for option %s"
+msgstr "é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_test_fsync.c:192
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s å¿…é ˆåœ¨ç¯„åœ %u..%u å…§"
+
+#: pg_test_fsync.c:205
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_test_fsync.c:211
+#, c-format
+msgid "%u second per test\n"
+msgid_plural "%u seconds per test\n"
+msgstr[0] "æ¯å€‹æ¸¬è©¦ %u 秒\n"
+
+#: pg_test_fsync.c:216
+#, c-format
+msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n"
+msgstr "此平臺的 open_datasync å’Œ open_sync æ”¯æ´ O_DIRECT。\n"
+
+#: pg_test_fsync.c:218
+#, c-format
+msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n"
+msgstr "此平臺的 open_datasync å’Œ open_sync æ”¯æ´ F_NOCACHE。\n"
+
+#: pg_test_fsync.c:220
+#, c-format
+msgid "Direct I/O is not supported on this platform.\n"
+msgstr "此平臺ä¸æ”¯æ´ç›´æŽ¥ I/O。\n"
+
+#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357
+#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537
+#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581
+msgid "could not open output file"
+msgstr "無法開啟輸出檔"
+
+#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344
+#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429
+#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555
+#: pg_test_fsync.c:586
+msgid "write failed"
+msgstr "寫入失敗"
+
+#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392
+#: pg_test_fsync.c:529 pg_test_fsync.c:561
+msgid "fsync failed"
+msgstr "fsync 失敗"
+
+#: pg_test_fsync.c:292
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using one %dkB write:\n"
+msgstr ""
+"\n"
+"比較使用一個 %dkB 寫入的檔案åŒæ­¥æ–¹å¼:\n"
+
+#: pg_test_fsync.c:294
+#, c-format
+msgid ""
+"\n"
+"Compare file sync methods using two %dkB writes:\n"
+msgstr ""
+"\n"
+"比較使用兩個 %dkB 寫入的檔案åŒæ­¥æ–¹å¼:\n"
+
+#: pg_test_fsync.c:295
+#, c-format
+msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n"
+msgstr "(按照 wal_sync_method 的優先順åºï¼Œé™¤äº† fdatasync 是 Linux çš„é è¨­é¸é …)\n"
+
+#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476
+msgid "n/a*"
+msgstr "n/a*"
+
+#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435
+#: pg_test_fsync.c:494
+msgid "n/a"
+msgstr "n/a"
+
+#: pg_test_fsync.c:440
+#, c-format
+msgid ""
+"* This file system and its mount options do not support direct\n"
+" I/O, e.g. ext4 in journaled mode.\n"
+msgstr "* 這個檔案系統åŠå…¶æŽ›è¼‰é¸é …ä¸æ”¯æ´ç›´æŽ¥ I/O,例如 ext4 的日誌模å¼ã€‚\n"
+
+#: pg_test_fsync.c:448
+#, c-format
+msgid ""
+"\n"
+"Compare open_sync with different write sizes:\n"
+msgstr ""
+"\n"
+"比較使用ä¸åŒå¯«å…¥å¤§å°çš„ open_sync:\n"
+
+#: pg_test_fsync.c:449
+#, c-format
+msgid ""
+"(This is designed to compare the cost of writing 16kB in different write\n"
+"open_sync sizes.)\n"
+msgstr "(這是為了比較在ä¸åŒçš„ open_sync 寫入大å°ä¸‹å¯«å…¥ 16kB çš„æˆæœ¬è€Œè¨­è¨ˆçš„。)\n"
+
+#: pg_test_fsync.c:452
+msgid " 1 * 16kB open_sync write"
+msgstr " 1 * 16kB open_sync 寫入"
+
+#: pg_test_fsync.c:453
+msgid " 2 * 8kB open_sync writes"
+msgstr " 2 * 8kB open_sync 寫入"
+
+#: pg_test_fsync.c:454
+msgid " 4 * 4kB open_sync writes"
+msgstr " 4 * 4kB open_sync 寫入"
+
+#: pg_test_fsync.c:455
+msgid " 8 * 2kB open_sync writes"
+msgstr " 8 * 2kB open_sync 寫入"
+
+#: pg_test_fsync.c:456
+msgid "16 * 1kB open_sync writes"
+msgstr "16 * 1kB open_sync 寫入"
+
+#: pg_test_fsync.c:510
+#, c-format
+msgid ""
+"\n"
+"Test if fsync on non-write file descriptor is honored:\n"
+msgstr ""
+"\n"
+"測試 fsync éžå¯«å…¥æª”案æ述符是å¦è¢«å°Šé‡:\n"
+
+#: pg_test_fsync.c:511
+#, c-format
+msgid ""
+"(If the times are similar, fsync() can sync data written on a different\n"
+"descriptor.)\n"
+msgstr "(如果時間相近,fsync() å¯ä»¥åŒæ­¥è¢«å¯«å…¥ä¸åŒæ述符的資料。)\n"
+
+#: pg_test_fsync.c:576
+#, c-format
+msgid ""
+"\n"
+"Non-sync'ed %dkB writes:\n"
+msgstr ""
+"\n"
+"ä¸ä½¿ç”¨åŒæ­¥çš„ %dkB 寫入:\n"
diff --git a/src/bin/pg_test_fsync/t/001_basic.pl b/src/bin/pg_test_fsync/t/001_basic.pl
new file mode 100644
index 0000000..401ad2c
--- /dev/null
+++ b/src/bin/pg_test_fsync/t/001_basic.pl
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+#########################################
+# Basic checks
+
+program_help_ok('pg_test_fsync');
+program_version_ok('pg_test_fsync');
+program_options_handling_ok('pg_test_fsync');
+
+#########################################
+# Test invalid option combinations
+
+command_fails_like(
+ [ 'pg_test_fsync', '--secs-per-test', 'a' ],
+ qr/\Qpg_test_fsync: error: invalid argument for option --secs-per-test\E/,
+ 'pg_test_fsync: invalid argument for option --secs-per-test');
+command_fails_like(
+ [ 'pg_test_fsync', '--secs-per-test', '0' ],
+ qr/\Qpg_test_fsync: error: --secs-per-test must be in range 1..4294967295\E/,
+ 'pg_test_fsync: --secs-per-test must be in range');
+
+done_testing();
diff --git a/src/bin/pg_test_timing/.gitignore b/src/bin/pg_test_timing/.gitignore
new file mode 100644
index 0000000..e5aac2a
--- /dev/null
+++ b/src/bin/pg_test_timing/.gitignore
@@ -0,0 +1,3 @@
+/pg_test_timing
+
+/tmp_check/
diff --git a/src/bin/pg_test_timing/Makefile b/src/bin/pg_test_timing/Makefile
new file mode 100644
index 0000000..84d84c3
--- /dev/null
+++ b/src/bin/pg_test_timing/Makefile
@@ -0,0 +1,36 @@
+# src/bin/pg_test_timing/Makefile
+
+PGFILEDESC = "pg_test_timing - test timing overhead"
+PGAPPICON = win32
+
+subdir = src/bin/pg_test_timing
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ pg_test_timing.o
+
+all: pg_test_timing
+
+pg_test_timing: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_test_timing$(X) '$(DESTDIR)$(bindir)/pg_test_timing$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_test_timing$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_test_timing$(X) $(OBJS)
+ rm -rf tmp_check
diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build
new file mode 100644
index 0000000..02f4a5c
--- /dev/null
+++ b/src/bin/pg_test_timing/meson.build
@@ -0,0 +1,31 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_test_timing_sources = files(
+ 'pg_test_timing.c'
+)
+
+if host_system == 'windows'
+ pg_test_timing_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_test_timing',
+ '--FILEDESC', 'pg_test_timing - test timing overhead'])
+endif
+
+pg_test_timing = executable('pg_test_timing',
+ pg_test_timing_sources,
+ dependencies: [frontend_code],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_test_timing
+
+tests += {
+ 'name': 'pg_test_timing',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_test_timing/nls.mk b/src/bin/pg_test_timing/nls.mk
new file mode 100644
index 0000000..331931c
--- /dev/null
+++ b/src/bin/pg_test_timing/nls.mk
@@ -0,0 +1,3 @@
+# src/bin/pg_test_timing/nls.mk
+CATALOG_NAME = pg_test_timing
+GETTEXT_FILES = pg_test_timing.c
diff --git a/src/bin/pg_test_timing/pg_test_timing.c b/src/bin/pg_test_timing/pg_test_timing.c
new file mode 100644
index 0000000..c29d6f8
--- /dev/null
+++ b/src/bin/pg_test_timing/pg_test_timing.c
@@ -0,0 +1,208 @@
+/*
+ * pg_test_timing.c
+ * tests overhead of timing calls and their monotonicity: that
+ * they always move forward
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "getopt_long.h"
+#include "portability/instr_time.h"
+
+static const char *progname;
+
+static unsigned int test_duration = 3;
+
+static void handle_args(int argc, char *argv[]);
+static uint64 test_timing(unsigned int duration);
+static void output(uint64 loop_count);
+
+/* record duration in powers of 2 microseconds */
+long long int histogram[32];
+
+int
+main(int argc, char *argv[])
+{
+ uint64 loop_count;
+
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_timing"));
+ progname = get_progname(argv[0]);
+
+ handle_args(argc, argv);
+
+ loop_count = test_timing(test_duration);
+
+ output(loop_count);
+
+ return 0;
+}
+
+static void
+handle_args(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"duration", required_argument, NULL, 'd'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ unsigned long optval; /* used for option parsing */
+ char *endptr;
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ printf(_("Usage: %s [-d DURATION]\n"), progname);
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_test_timing (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((option = getopt_long(argc, argv, "d:",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'd':
+ errno = 0;
+ optval = strtoul(optarg, &endptr, 10);
+
+ if (endptr == optarg || *endptr != '\0' ||
+ errno != 0 || optval != (unsigned int) optval)
+ {
+ fprintf(stderr, _("%s: invalid argument for option %s\n"),
+ progname, "--duration");
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+ exit(1);
+ }
+
+ test_duration = (unsigned int) optval;
+ if (test_duration == 0)
+ {
+ fprintf(stderr, _("%s: %s must be in range %u..%u\n"),
+ progname, "--duration", 1, UINT_MAX);
+ exit(1);
+ }
+ break;
+
+ default:
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
+ exit(1);
+ break;
+ }
+ }
+
+ if (argc > optind)
+ {
+ fprintf(stderr,
+ _("%s: too many command-line arguments (first is \"%s\")\n"),
+ progname, argv[optind]);
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
+ exit(1);
+ }
+
+
+ printf(ngettext("Testing timing overhead for %u second.\n",
+ "Testing timing overhead for %u seconds.\n",
+ test_duration),
+ test_duration);
+}
+
+static uint64
+test_timing(unsigned int duration)
+{
+ uint64 total_time;
+ int64 time_elapsed = 0;
+ uint64 loop_count = 0;
+ uint64 prev,
+ cur;
+ instr_time start_time,
+ end_time,
+ temp;
+
+ total_time = duration > 0 ? duration * INT64CONST(1000000) : 0;
+
+ INSTR_TIME_SET_CURRENT(start_time);
+ cur = INSTR_TIME_GET_MICROSEC(start_time);
+
+ while (time_elapsed < total_time)
+ {
+ int32 diff,
+ bits = 0;
+
+ prev = cur;
+ INSTR_TIME_SET_CURRENT(temp);
+ cur = INSTR_TIME_GET_MICROSEC(temp);
+ diff = cur - prev;
+
+ /* Did time go backwards? */
+ if (diff < 0)
+ {
+ fprintf(stderr, _("Detected clock going backwards in time.\n"));
+ fprintf(stderr, _("Time warp: %d ms\n"), diff);
+ exit(1);
+ }
+
+ /* What is the highest bit in the time diff? */
+ while (diff)
+ {
+ diff >>= 1;
+ bits++;
+ }
+
+ /* Update appropriate duration bucket */
+ histogram[bits]++;
+
+ loop_count++;
+ INSTR_TIME_SUBTRACT(temp, start_time);
+ time_elapsed = INSTR_TIME_GET_MICROSEC(temp);
+ }
+
+ INSTR_TIME_SET_CURRENT(end_time);
+
+ INSTR_TIME_SUBTRACT(end_time, start_time);
+
+ printf(_("Per loop time including overhead: %0.2f ns\n"),
+ INSTR_TIME_GET_DOUBLE(end_time) * 1e9 / loop_count);
+
+ return loop_count;
+}
+
+static void
+output(uint64 loop_count)
+{
+ int64 max_bit = 31,
+ i;
+ char *header1 = _("< us");
+ char *header2 = /* xgettext:no-c-format */ _("% of total");
+ char *header3 = _("count");
+ int len1 = strlen(header1);
+ int len2 = strlen(header2);
+ int len3 = strlen(header3);
+
+ /* find highest bit value */
+ while (max_bit > 0 && histogram[max_bit] == 0)
+ max_bit--;
+
+ printf(_("Histogram of timing durations:\n"));
+ printf("%*s %*s %*s\n",
+ Max(6, len1), header1,
+ Max(10, len2), header2,
+ Max(10, len3), header3);
+
+ for (i = 0; i <= max_bit; i++)
+ printf("%*ld %*.5f %*lld\n",
+ Max(6, len1), 1l << i,
+ Max(10, len2) - 1, (double) histogram[i] * 100 / loop_count,
+ Max(10, len3), histogram[i]);
+}
diff --git a/src/bin/pg_test_timing/po/LINGUAS b/src/bin/pg_test_timing/po/LINGUAS
new file mode 100644
index 0000000..4cc8bed
--- /dev/null
+++ b/src/bin/pg_test_timing/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_test_timing/po/cs.po b/src/bin/pg_test_timing/po/cs.po
new file mode 100644
index 0000000..1d53e94
--- /dev/null
+++ b/src/bin/pg_test_timing/po/cs.po
@@ -0,0 +1,80 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-07-13 19:46+0000\n"
+"PO-Revision-Date: 2018-07-13 23:50+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.0.7\n"
+
+#: pg_test_timing.c:55
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Použití: %s [-d DURATION]\n"
+
+#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: pg_test_timing.c:85
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: pg_test_timing.c:94
+#, c-format
+msgid "Testing timing overhead for %d second.\n"
+msgid_plural "Testing timing overhead for %d seconds.\n"
+msgstr[0] "Testuji režii Äasování po %d sekund.\n"
+msgstr[1] "Testuji režii Äasování po %d sekundy.\n"
+msgstr[2] "Testuji režii Äasování po %d sekund.\n"
+
+#: pg_test_timing.c:102
+#, c-format
+msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+msgstr "%s: trvání testu musí být kladné celé Äíslo (trvání je \"%d\")\n"
+
+#: pg_test_timing.c:140
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Detekovány posun hodin zpÄ›t v Äase.\n"
+
+#: pg_test_timing.c:141
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Time warp: %d ms\n"
+
+#: pg_test_timing.c:164
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "ÄŒas pro smyÄku vÄetnÄ› režie: %0.2f ns\n"
+
+#: pg_test_timing.c:175
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:176
+#, no-c-format
+msgid "% of total"
+msgstr "% celku"
+
+#: pg_test_timing.c:177
+msgid "count"
+msgstr "poÄet"
+
+#: pg_test_timing.c:186
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogram trvání:\n"
diff --git a/src/bin/pg_test_timing/po/de.po b/src/bin/pg_test_timing/po/de.po
new file mode 100644
index 0000000..6bcbc73
--- /dev/null
+++ b/src/bin/pg_test_timing/po/de.po
@@ -0,0 +1,84 @@
+# German message translation file for pg_test_timing
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-04-12 14:17+0000\n"
+"PO-Revision-Date: 2021-04-12 16:37+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Aufruf: %s [-d DAUER]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: ungültiges Argument für Option %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s muss im Bereich %u..%u sein\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Testen des Overheads der Zeitmessung für %u Sekunde\n"
+msgstr[1] "Testen des Overheads der Zeitmessung für %u Sekunden\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Rückwärts gehende Uhr festgestellt.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Zeitdifferenz: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Zeit pro Durchlauf einschließlich Overhead: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< µs"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% von gesamt"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "Anzahl"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogramm der Dauern der Zeitmessungen:\n"
diff --git a/src/bin/pg_test_timing/po/el.po b/src/bin/pg_test_timing/po/el.po
new file mode 100644
index 0000000..3d1ba0b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/el.po
@@ -0,0 +1,86 @@
+# Greek message translation file for pg_test_timing
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-07-20 03:46+0000\n"
+"PO-Revision-Date: 2021-07-20 10:42+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.0\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "ΧÏήση: %s [-d DURATION]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: μη έγκυÏη παÏάμετÏος για την επιλογή %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: πάÏα πολλοί παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Έλεγχος επίφοÏτου χÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î³Î¹Î± %u δευτεÏόλεπτο.\n"
+msgstr[1] "Έλεγχος επίφοÏτου χÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î³Î¹Î± %u δευτεÏόλεπτα.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Εντοπίστηκε Ïολόι που πηγαίνει Ï€Ïος τα πίσω στο χÏόνο.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "ΧÏονική στÏέβλωση: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "ΧÏόνος ανά βÏόχο συμπεÏιλαμβανομένου επίφοÏτου: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% του συνόλου"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "μετÏητής"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "ΙστόγÏαμμα διαÏκειών χÏονισμοÏ:\n"
diff --git a/src/bin/pg_test_timing/po/es.po b/src/bin/pg_test_timing/po/es.po
new file mode 100644
index 0000000..47cb27d
--- /dev/null
+++ b/src/bin/pg_test_timing/po/es.po
@@ -0,0 +1,86 @@
+# Spanish message translation file for pg_test_timing
+#
+# Copyright (c) 2017-2019, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carloswaldo@babelruins.org>, 2017-2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:19+0000\n"
+"PO-Revision-Date: 2023-05-22 12:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Empleo: %s [-d DURACIÓN]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: argumento no válido para la opción %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Pruebe «%s --help» para mayor información.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s debe estar en el rango %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: demasiados argumentos de línea de órdenes (el primero es «%s»)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Midiendo sobrecosto de lectura de reloj durante %u segundo.\n"
+msgstr[1] "Midiendo sobrecosto de lectura de reloj durante %u segundos.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Se detectó que el reloj retrocede en el tiempo.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Desfase de tiempo: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tiempo por lectura incluyendo sobrecosto: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% del total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "cantidad"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histograma de duraciones de lectura de reloj:\n"
diff --git a/src/bin/pg_test_timing/po/fr.po b/src/bin/pg_test_timing/po/fr.po
new file mode 100644
index 0000000..f97ebee
--- /dev/null
+++ b/src/bin/pg_test_timing/po/fr.po
@@ -0,0 +1,90 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-04-12 05:16+0000\n"
+"PO-Revision-Date: 2022-04-12 17:29+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Usage: %s [-d DURÉE]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s : argument invalide pour l'option %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s : %s doit être compris entre %u et %u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Test du coût du chronométrage pour %u seconde.\n"
+msgstr[1] "Test du coût du chronométrage pour %u secondes.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Détection d'une horloge partant à rebours.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Décalage de temps : %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Durée par boucle incluant le coût : %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% du total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "nombre"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogramme des durées de chronométrage\n"
+
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr "%s : la durée doit être un entier positif (la durée est « %d »)\n"
diff --git a/src/bin/pg_test_timing/po/it.po b/src/bin/pg_test_timing/po/it.po
new file mode 100644
index 0000000..fc0cfe9
--- /dev/null
+++ b/src/bin/pg_test_timing/po/it.po
@@ -0,0 +1,84 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:18+0000\n"
+"PO-Revision-Date: 2022-09-26 15:13+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Utilizzo: %s [-d DURATA]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: argomento non valido per l'opzione %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s deve essere compreso nell'intervallo %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: troppi argomenti nella riga di comando (il primo è \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Testare l'overhead di temporizzazione per %u secondo.\n"
+msgstr[1] "Testare l'overhead di temporizzazione per %u secondi.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Rilevato orologio che va indietro nel tempo.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Distorsione temporale: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tempo per ciclo incluso sovraccarico: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< noi"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% del totale"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "conteggio"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Istogramma delle durate temporali:\n"
diff --git a/src/bin/pg_test_timing/po/ja.po b/src/bin/pg_test_timing/po/ja.po
new file mode 100644
index 0000000..6a34b3d
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ja.po
@@ -0,0 +1,86 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL 16)\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 <hotta@net-newbie.com>\n"
+"Language-Team: \n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "使用方法: %s [-d 期間]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: オプション%sã®å¼•æ•°ãŒç„¡åŠ¹ã§ã™\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "\"%s --help\" ã§è©³ç´°ã‚’確èªã—ã¦ãã ã•ã„。\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %sã¯%u..%uã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: コマンドライン引数ãŒå¤šã™ãŽã¾ã™ï¼ˆå…ˆé ­ã¯ \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "%u秒ã«å¯¾ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’テストã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "クロックã®æ™‚刻ãŒé€†è¡Œã—ã¦ã„ã‚‹ã“ã¨ã‚’検出ã—ã¾ã—ãŸã€‚\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "逆行ã—ãŸæ™‚é–“: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "オーãƒãƒ¼ãƒ˜ãƒƒãƒ‰è¾¼ã¿ã®ãƒ«ãƒ¼ãƒ—時間毎: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "全体ã®ï¼…"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "個数"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "タイミングæŒç¶šæ™‚é–“ã®ãƒ’ストグラム:\n"
+
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr "%s: æŒç¶šæ™‚é–“ã¯æ­£ã®æ•´æ•°ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ (æŒç¶šæ™‚é–“ã¯\"%d\")\n"
diff --git a/src/bin/pg_test_timing/po/ka.po b/src/bin/pg_test_timing/po/ka.po
new file mode 100644
index 0000000..a472b6c
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ka.po
@@ -0,0 +1,84 @@
+# Georgian message translation file for pg_test_timing
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:48+0000\n"
+"PO-Revision-Date: 2022-07-04 11:40+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: %s [-d ხáƒáƒ áƒœáƒ’რძლივáƒáƒ‘áƒ]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის%s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s-ის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "დრáƒáƒ˜áƒ¡ áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•áƒ˜áƒ¡ ზედნáƒáƒ“ების გáƒáƒ›áƒáƒªáƒ“რ%u წáƒáƒ›áƒ˜áƒ—.\n"
+msgstr[1] "დრáƒáƒ˜áƒ¡ áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•áƒ˜áƒ¡ ზედნáƒáƒ“ების გáƒáƒ›áƒáƒªáƒ“რ%u წáƒáƒ›áƒ˜áƒ—.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ, რáƒáƒ› სáƒáƒáƒ—ი უკáƒáƒœ მიდის\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "დრáƒáƒ˜áƒ¡ ნáƒáƒ®áƒ¢áƒáƒ›áƒ˜: %d მწმ\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "თითáƒáƒ”ული მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ დრრზედნáƒáƒ“ების ჩáƒáƒ—ვლით: %0.2f ნწმ\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< მკწმ"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "ჯáƒáƒ›áƒ˜áƒ¡ %"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "რáƒáƒáƒ“ენáƒáƒ‘áƒ"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "დრáƒáƒ˜áƒ¡ áƒáƒ—ვლის ხáƒáƒœáƒ’რძლივáƒáƒ‘ის ჰისტáƒáƒ’რáƒáƒ›áƒ:\n"
diff --git a/src/bin/pg_test_timing/po/ko.po b/src/bin/pg_test_timing/po/ko.po
new file mode 100644
index 0000000..1f1da78
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ko.po
@@ -0,0 +1,82 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:50+0000\n"
+"PO-Revision-Date: 2023-05-30 12:39+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "사용법: %s [-d 간격]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: %s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "ë” ìžì„¸í•œ 정보는 \"%s --help\" ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s ê°’ì€ %u부터 %u까지 지정할 수 있습니다.\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 사용했습니다 (ì‹œìž‘ì€ \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "%uì´ˆ ë™ì•ˆ 타ì´ë° ì˜¤ë²„í•´ë” ê²€ì‚¬.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "거꾸로 í른 ê°ì§€ëœ í´ëŸ­.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "간격: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "오버헤ë”를 í¬í•¨í•œ 루프 시간: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% of total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "회"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "타ì´ë° 간견 히스토그램:\n"
diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build
new file mode 100644
index 0000000..7bc84d5
--- /dev/null
+++ b/src/bin/pg_test_timing/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_test_timing-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_test_timing/po/pl.po b/src/bin/pg_test_timing/po/pl.po
new file mode 100644
index 0000000..1f0242b
--- /dev/null
+++ b/src/bin/pg_test_timing/po/pl.po
@@ -0,0 +1,76 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+# grzegorz <begina.felicysym@wp.eu>, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-04-09 21:15+0000\n"
+"PO-Revision-Date: 2017-05-02 13:55-0400\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: pg_test_timing.c:55
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Składnia: %s [-d TRWANIE]\n"
+
+#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Użyj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: pg_test_timing.c:85
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów (pierwszy to \"%s\")\n"
+
+#: pg_test_timing.c:94
+#, c-format
+msgid "Testing timing overhead for %d second.\n"
+msgid_plural "Testing timing overhead for %d seconds.\n"
+msgstr[0] "Narzut czasowy testowania dla %d. sekundy.\n"
+msgstr[1] "Narzut czasowy testowania dla %d. sekund.\n"
+msgstr[2] "Narzut czasowy testowania dla %d. sekund.\n"
+
+#: pg_test_timing.c:102
+#, c-format
+msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+msgstr "%s: czas trwania musi być dodatnią liczbą całkowitą (czas trwania to \"%d\")\n"
+
+#: pg_test_timing.c:140
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Wykryto zegar liczÄ…cy czas wstecz.\n"
+
+#: pg_test_timing.c:141
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Zakrzywienie czasu: %d ms\n"
+
+#: pg_test_timing.c:164
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Na czas pętli doliczając narzut: %0.2f ns\n"
+
+#: pg_test_timing.c:180
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogram czasów taktowania:\n"
+
+#: pg_test_timing.c:181
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:181
+msgid "count"
+msgstr "ilość"
diff --git a/src/bin/pg_test_timing/po/pt_BR.po b/src/bin/pg_test_timing/po/pt_BR.po
new file mode 100644
index 0000000..3737734
--- /dev/null
+++ b/src/bin/pg_test_timing/po/pt_BR.po
@@ -0,0 +1,85 @@
+# Brazilian Portuguese message translation file for pg_test_timing
+#
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2023-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 13:02-0300\n"
+"PO-Revision-Date: 2023-09-27 18:43-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Uso: %s [-d DURAÇÃO]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: argumento inválido para opção %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Tente \"%s --help\" para obter informações adicionais.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s deve estar no intervalo de %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: muitos argumentos de linha de comando (primeiro é \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Teste de sobrecusto de tempo por %u segundo.\n"
+msgstr[1] "Teste de sobrecusto de tempo por %u segundos.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Relógio detectado retrocedendo no tempo.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Distorção do tempo: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tempo por laço incluindo sobrecusto: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% do total"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "contador"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histograma de durações de tempo:\n"
diff --git a/src/bin/pg_test_timing/po/ru.po b/src/bin/pg_test_timing/po/ru.po
new file mode 100644
index 0000000..c24e78d
--- /dev/null
+++ b/src/bin/pg_test_timing/po/ru.po
@@ -0,0 +1,88 @@
+# Russian message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 06:29+0300\n"
+"PO-Revision-Date: 2021-09-04 12:18+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "ИÑпользование: %s [-d ДЛИТЕЛЬÐОСТЬ]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: недопуÑтимый аргумент параметра %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: параметр %s должен быть в диапазоне %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: Ñлишком много аргументов командной Ñтроки (первый: \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Оценка издержек замеров времени в течение %u Ñек.\n"
+msgstr[1] "Оценка издержек замеров времени в течение %u Ñек.\n"
+msgstr[2] "Оценка издержек замеров времени в течение %u Ñек.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Обнаружен обратный ход чаÑов.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Сдвиг времени: %d мÑ\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ цикла, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ð·Ð´ÐµÑ€Ð¶ÐºÐ¸: %0.2f нÑ\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< мкÑ"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% от общего"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "чиÑло"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "ГиÑтограмма длительноÑти замеров времени:\n"
+
+#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+#~ msgstr ""
+#~ "%s: длительноÑÑ‚ÑŒ должна задаватьÑÑ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ целым (указано: \"%d\")\n"
diff --git a/src/bin/pg_test_timing/po/sv.po b/src/bin/pg_test_timing/po/sv.po
new file mode 100644
index 0000000..92c130d
--- /dev/null
+++ b/src/bin/pg_test_timing/po/sv.po
@@ -0,0 +1,83 @@
+# Swedish message translation file for pg_test_timing
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-11-06 17:16+0000\n"
+"PO-Revision-Date: 2021-11-06 21:59+0100\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Användning: %s [-d TID]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: ogiltigt argument för flaggan %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s måste vara i intervallet %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: för många kommandoradsargument (första är \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "Testar timingoverhead under %u sekund.\n"
+msgstr[1] "Testar timingoverhead under %u sekunder.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Upptäckte att klockan gått bakåt i tiden.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Tidsförskjutning: %d ms\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Tid per varv inklusive overhead: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% av totalt"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "antal"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Histogram över tider:\n"
diff --git a/src/bin/pg_test_timing/po/tr.po b/src/bin/pg_test_timing/po/tr.po
new file mode 100644
index 0000000..8ae31a8
--- /dev/null
+++ b/src/bin/pg_test_timing/po/tr.po
@@ -0,0 +1,78 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-02-11 18:45+0000\n"
+"PO-Revision-Date: 2018-02-12 15:29+0300\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: pg_test_timing.c:55
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Kullanım: %s [-d SÜRE]\n"
+
+#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: pg_test_timing.c:85
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: Çok fazla komut satırı girdisi var (ilki \"%s\")\n"
+
+#: pg_test_timing.c:94
+#, c-format
+msgid "Testing timing overhead for %d second.\n"
+msgid_plural "Testing timing overhead for %d seconds.\n"
+msgstr[0] "Zamanlama yükü %d saniye boyunca test ediliyor\n"
+
+#: pg_test_timing.c:102
+#, c-format
+msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+msgstr "%s: süre pozitif bir tamsayı olmalı (süre \"%d\" dir)\n"
+
+#: pg_test_timing.c:140
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Geriye doğru çalışan saat tespit edildi.\n"
+
+#: pg_test_timing.c:141
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Zaman farkı: %d ms\n"
+
+#: pg_test_timing.c:164
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Ek yük (overhead) dahil döngü başına geçen süre: %0.2f ns\n"
+
+#: pg_test_timing.c:175
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:176
+#, no-c-format
+msgid "% of total"
+msgstr "toplamın % si"
+
+#: pg_test_timing.c:177
+msgid "count"
+msgstr "toplam sayı"
+
+#: pg_test_timing.c:186
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Zamanlama sürelerinin histogramı:\n"
diff --git a/src/bin/pg_test_timing/po/uk.po b/src/bin/pg_test_timing/po/uk.po
new file mode 100644
index 0000000..5313593
--- /dev/null
+++ b/src/bin/pg_test_timing/po/uk.po
@@ -0,0 +1,86 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:49+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_test_timing.pot\n"
+"X-Crowdin-File-ID: 912\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "ВикориÑтаннÑ: %s [-d ТРИВÐЛІСТЬ]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s має бути в діапазоні %u..%u\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: забагато аргументів у командному Ñ€Ñдку (перший \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ð¸Ñ… витрат чаÑу на %u Ñекунду.\n"
+msgstr[1] "ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ð¸Ñ… витрат чаÑу на %u Ñекунди.\n"
+msgstr[2] "ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ð¸Ñ… витрат чаÑу на %u Ñекунд.\n"
+msgstr[3] "ТеÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ð¸Ñ… витрат чаÑу на %u Ñекунд.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Годинник іде в зворотньому напрÑму у минуле.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "ЗÑув чаÑу: %d мÑ\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Ð§Ð°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ цикла, у тому чиÑлі накладні витрати: %0.2f нÑ\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< мкÑ"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "% від загалу"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "кількіÑÑ‚ÑŒ"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "ГіÑтограмма тривалоÑÑ‚Ñ– замірів чаÑу:\n"
+
diff --git a/src/bin/pg_test_timing/po/vi.po b/src/bin/pg_test_timing/po/vi.po
new file mode 100644
index 0000000..9214400
--- /dev/null
+++ b/src/bin/pg_test_timing/po/vi.po
@@ -0,0 +1,78 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:16+0000\n"
+"PO-Revision-Date: 2018-05-04 22:06+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Language: vi_VN\n"
+
+#: pg_test_timing.c:55
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "Cách dùng: %s [-d THỜI LƯỢNG]\n"
+
+#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
+
+#: pg_test_timing.c:85
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: quá nhiá»u đối số cho câu lệnh (đầu tiên là \"%s\")\n"
+
+#: pg_test_timing.c:94
+#, c-format
+msgid "Testing timing overhead for %d second.\n"
+msgid_plural "Testing timing overhead for %d seconds.\n"
+msgstr[0] "Kiểm tra thá»i gian vượt quá cho %d giây.\n"
+
+#: pg_test_timing.c:102
+#, c-format
+msgid "%s: duration must be a positive integer (duration is \"%d\")\n"
+msgstr "%s: thá»i lượng phải là má»™t số nguyên dÆ°Æ¡ng (khoảng thá»i gian: \"%d\")\n"
+
+#: pg_test_timing.c:140
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "Clock được phát hiện Ä‘ang Ä‘i ngược thá»i gian.\n"
+
+#: pg_test_timing.c:141
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "Thá»i gian đảo ngược: %d ms\n"
+
+#: pg_test_timing.c:164
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "Thá»i gian má»—i vòng lặp bao gồm cả thá»i gian vượt quá: %0.2f ns\n"
+
+#: pg_test_timing.c:175
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:176
+#, no-c-format
+msgid "% of total"
+msgstr "% của tổng"
+
+#: pg_test_timing.c:177
+msgid "count"
+msgstr "số lượng"
+
+#: pg_test_timing.c:186
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "Biểu đồ vá» thá»i lượng thá»i gian:\n"
diff --git a/src/bin/pg_test_timing/po/zh_CN.po b/src/bin/pg_test_timing/po/zh_CN.po
new file mode 100644
index 0000000..10b5efc
--- /dev/null
+++ b/src/bin/pg_test_timing/po/zh_CN.po
@@ -0,0 +1,83 @@
+# LANGUAGE message translation file for pg_test_timing
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-06-10 10:50+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "用法: %s [-d æŒç»­æ—¶é—´]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: 选项%sçš„å‚数无效\n"
+
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %så¿…é¡»ä½äºŽ%u..%u的范围内\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 命令行å‚数太多 (第一个是 \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "测试%u秒的计时开销.\n"
+msgstr[1] "测试%u秒的计时开销.\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "检测到时钟时间倒转.\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "时间错ä½: %d 毫秒\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "æ¯æ¬¡å¾ªçŽ¯çš„å¹³å‡å¼€é”€: %0.2f 纳秒\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< 微秒"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "总计的 %"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "计数"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "æŒç»­æ—¶é—´çš„柱状图:\n"
diff --git a/src/bin/pg_test_timing/po/zh_TW.po b/src/bin/pg_test_timing/po/zh_TW.po
new file mode 100644
index 0000000..7629387
--- /dev/null
+++ b/src/bin/pg_test_timing/po/zh_TW.po
@@ -0,0 +1,84 @@
+# Traditional Chinese message translation file for pg_test_timing
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_test_timing (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:49+0000\n"
+"PO-Revision-Date: 2023-11-06 08:50+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+#: pg_test_timing.c:59
+#, c-format
+msgid "Usage: %s [-d DURATION]\n"
+msgstr "用法: %s [-d DURATION]\n"
+
+#: pg_test_timing.c:81
+#, c-format
+msgid "%s: invalid argument for option %s\n"
+msgstr "%s: é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ\n"
+
+# postmaster/postmaster.c:512 postmaster/postmaster.c:525
+#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "用 \"%s --help\" å–得更多資訊。\n"
+
+#: pg_test_timing.c:90
+#, c-format
+msgid "%s: %s must be in range %u..%u\n"
+msgstr "%s: %s å¿…é ˆåœ¨ç¯„åœ %u..%u å…§\n"
+
+#: pg_test_timing.c:107
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: 命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")\n"
+
+#: pg_test_timing.c:115
+#, c-format
+msgid "Testing timing overhead for %u second.\n"
+msgid_plural "Testing timing overhead for %u seconds.\n"
+msgstr[0] "測試 %u 秒的計時é¡å¤–負擔。\n"
+
+#: pg_test_timing.c:151
+#, c-format
+msgid "Detected clock going backwards in time.\n"
+msgstr "åµæ¸¬åˆ°æ™‚é˜æ™‚間倒退。\n"
+
+#: pg_test_timing.c:152
+#, c-format
+msgid "Time warp: %d ms\n"
+msgstr "時間扭曲: %d 毫秒\n"
+
+#: pg_test_timing.c:175
+#, c-format
+msgid "Per loop time including overhead: %0.2f ns\n"
+msgstr "æ¯å€‹å¾ªç’°æ™‚間,包括é¡å¤–è² æ“”: %0.2f ns\n"
+
+#: pg_test_timing.c:186
+msgid "< us"
+msgstr "< us"
+
+#: pg_test_timing.c:187
+#, no-c-format
+msgid "% of total"
+msgstr "佔總數 %"
+
+#: pg_test_timing.c:188
+msgid "count"
+msgstr "次數"
+
+#: pg_test_timing.c:197
+#, c-format
+msgid "Histogram of timing durations:\n"
+msgstr "計時期間的 histogram:\n"
diff --git a/src/bin/pg_test_timing/t/001_basic.pl b/src/bin/pg_test_timing/t/001_basic.pl
new file mode 100644
index 0000000..43bc68c
--- /dev/null
+++ b/src/bin/pg_test_timing/t/001_basic.pl
@@ -0,0 +1,29 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+#########################################
+# Basic checks
+
+program_help_ok('pg_test_timing');
+program_version_ok('pg_test_timing');
+program_options_handling_ok('pg_test_timing');
+
+#########################################
+# Test invalid option combinations
+
+command_fails_like(
+ [ 'pg_test_timing', '--duration', 'a' ],
+ qr/\Qpg_test_timing: invalid argument for option --duration\E/,
+ 'pg_test_timing: invalid argument for option --duration');
+command_fails_like(
+ [ 'pg_test_timing', '--duration', '0' ],
+ qr/\Qpg_test_timing: --duration must be in range 1..4294967295\E/,
+ 'pg_test_timing: --duration must be in range');
+
+done_testing();
diff --git a/src/bin/pg_upgrade/.gitignore b/src/bin/pg_upgrade/.gitignore
new file mode 100644
index 0000000..a66166e
--- /dev/null
+++ b/src/bin/pg_upgrade/.gitignore
@@ -0,0 +1,8 @@
+/pg_upgrade
+# Generated by manual invocation
+/delete_old_cluster.sh
+/delete_old_cluster.bat
+/reindex_hash.sql
+# Generated by test suite
+/log/
+/tmp_check/
diff --git a/src/bin/pg_upgrade/IMPLEMENTATION b/src/bin/pg_upgrade/IMPLEMENTATION
new file mode 100644
index 0000000..229399a
--- /dev/null
+++ b/src/bin/pg_upgrade/IMPLEMENTATION
@@ -0,0 +1,98 @@
+------------------------------------------------------------------------------
+PG_UPGRADE: IN-PLACE UPGRADES FOR POSTGRESQL
+------------------------------------------------------------------------------
+
+Upgrading a PostgreSQL database from one major release to another can be
+an expensive process. For minor upgrades, you can simply install new
+executables and forget about upgrading existing data. But for major
+upgrades, you have to export all of your data using pg_dump, install the
+new release, run initdb to create a new cluster, and then import your
+old data. If you have a lot of data, that can take a considerable amount
+of time. If you have too much data, you may have to buy more storage
+since you need enough room to hold the original data plus the exported
+data. pg_upgrade can reduce the amount of time and disk space required
+for many upgrades.
+
+The URL http://momjian.us/main/writings/pgsql/pg_upgrade.pdf contains a
+presentation about pg_upgrade internals that mirrors the text
+description below.
+
+------------------------------------------------------------------------------
+WHAT IT DOES
+------------------------------------------------------------------------------
+
+pg_upgrade is a tool that performs an in-place upgrade of existing
+data. Some upgrades change the on-disk representation of data;
+pg_upgrade cannot help in those upgrades. However, many upgrades do
+not change the on-disk representation of a user-defined table. In those
+cases, pg_upgrade can move existing user-defined tables from the old
+database cluster into the new cluster.
+
+There are two factors that determine whether an in-place upgrade is
+practical.
+
+Every table in a cluster shares the same on-disk representation of the
+table headers and trailers and the on-disk representation of tuple
+headers. If this changes between the old version of PostgreSQL and the
+new version, pg_upgrade cannot move existing tables to the new cluster;
+you will have to pg_dump the old data and then import that data into the
+new cluster.
+
+Second, all data types should have the same binary representation
+between the two major PostgreSQL versions.
+
+------------------------------------------------------------------------------
+HOW IT WORKS
+------------------------------------------------------------------------------
+
+To use pg_upgrade during an upgrade, start by installing a fresh
+cluster using the newest version in a new directory. When you've
+finished installation, the new cluster will contain the new executables
+and the usual template0, template1, and postgres, but no user-defined
+tables. At this point, you can shut down the old and new postmasters and
+invoke pg_upgrade.
+
+When pg_upgrade starts, it ensures that all required executables are
+present and contain the expected version numbers. The verification
+process also checks the old and new $PGDATA directories to ensure that
+the expected files and subdirectories are in place. If the verification
+process succeeds, pg_upgrade starts the old postmaster and runs
+pg_dumpall --schema-only to capture the metadata contained in the old
+cluster. The script produced by pg_dumpall will be used in a later step
+to recreate all user-defined objects in the new cluster.
+
+Note that the script produced by pg_dumpall will only recreate
+user-defined objects, not system-defined objects. The new cluster will
+contain the system-defined objects created by the latest version of
+PostgreSQL.
+
+Once pg_upgrade has extracted the metadata from the old cluster, it
+performs a number of bookkeeping tasks required to 'sync up' the new
+cluster with the existing data.
+
+First, pg_upgrade copies the commit status information and 'next
+transaction ID' from the old cluster to the new cluster. This step
+ensures that the proper tuples are visible from the new cluster.
+Remember, pg_upgrade does not export/import the content of user-defined
+tables so the transaction IDs in the new cluster must match the
+transaction IDs in the old data. pg_upgrade also copies the starting
+address for write-ahead logs from the old cluster to the new cluster.
+
+Now pg_upgrade begins reconstructing the metadata obtained from the old
+cluster using the first part of the pg_dumpall output.
+
+Next, pg_upgrade executes the remainder of the script produced earlier
+by pg_dumpall --- this script effectively creates the complete
+user-defined metadata from the old cluster to the new cluster. It
+preserves the relfilenode numbers so TOAST and other references
+to relfilenodes in user data is preserved. (See binary-upgrade usage
+in pg_dump). We choose to preserve tablespace and database OIDs as well.
+
+Finally, pg_upgrade links or copies each user-defined table and its
+supporting indexes and toast tables from the old cluster to the new
+cluster.
+
+An important feature of the pg_upgrade design is that it leaves the
+original cluster intact --- if a problem occurs during the upgrade, you
+can still run the previous version, after renaming the tablespaces back
+to the original names.
diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile
new file mode 100644
index 0000000..5834513
--- /dev/null
+++ b/src/bin/pg_upgrade/Makefile
@@ -0,0 +1,60 @@
+# src/bin/pg_upgrade/Makefile
+
+PGFILEDESC = "pg_upgrade - an in-place binary upgrade utility"
+PGAPPICON = win32
+
+subdir = src/bin/pg_upgrade
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ check.o \
+ controldata.o \
+ dump.o \
+ exec.o \
+ file.o \
+ function.o \
+ info.o \
+ option.o \
+ parallel.o \
+ pg_upgrade.o \
+ relfilenumber.o \
+ server.o \
+ tablespace.o \
+ util.o \
+ version.o
+
+override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+# required for 002_pg_upgrade.pl
+REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX)
+export REGRESS_SHLIB
+
+all: pg_upgrade
+
+pg_upgrade: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_upgrade$(X) '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_upgrade$(X) $(OBJS)
+ rm -rf delete_old_cluster.sh log/ tmp_check/ \
+ reindex_hash.sql
+
+export with_icu
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING
new file mode 100644
index 0000000..81a4324
--- /dev/null
+++ b/src/bin/pg_upgrade/TESTING
@@ -0,0 +1,66 @@
+THE SHORT VERSION
+-----------------
+
+On non-Windows machines, you can execute the testing process
+described below by running the following command in this directory:
+
+ make check
+
+This will run the TAP tests to run pg_upgrade, performing an upgrade
+from the version in this source tree to a new instance of the same
+version.
+
+Testing an upgrade from a different PG version is also possible, and
+provides a more thorough test that pg_upgrade does what it's meant for.
+This requires both a source tree and an installed tree for the old
+version, as well as a dump file to set up the instance to be upgraded.
+The following environment variables must be set to enable this testing:
+export olddump=...somewhere/dump.sql (old version's dump)
+export oldinstall=...otherversion/ (old version's install base path)
+See DETAILS below for more information about creation of the dump.
+
+You can also test the different transfer modes (--copy, --link,
+--clone) by setting the environment variable PG_TEST_PG_UPGRADE_MODE
+to the respective command-line option, like
+
+ make check PG_TEST_PG_UPGRADE_MODE=--link
+
+The default is --copy. Note that the other modes are not supported on
+all operating systems.
+
+DETAILS
+-------
+
+The most effective way to test pg_upgrade, aside from testing on user
+data, is by upgrading the PostgreSQL regression database.
+
+This testing process first requires the creation of a valid regression
+database dump that can then be used for $olddump. Such files contain
+most database features and are specific to each major version of Postgres.
+
+Here are the steps needed to create a dump file:
+
+1) Create and populate the regression database in the old cluster.
+ This database can be created by running 'make installcheck' from
+ src/test/regress in the old version's source code tree.
+
+ If you like, you can also populate regression databases for one or
+ more contrib modules by running 'make installcheck USE_MODULE_DB=1'
+ in their directories. (USE_MODULE_DB is essential so that the
+ pg_upgrade test script will understand which database is which.)
+
+2) Use pg_dumpall to dump out the contents of the instance, including the
+ regression database(s), into a SQL file. Use the *old* version's
+ pg_dumpall so that the dump created is compatible with that version.
+
+Once the dump file is created, it can be used repeatedly. Set $olddump
+to point to the dump file and run 'make check' or 'make installcheck'
+in the new version's src/bin/pg_upgrade directory. (If you included any
+contrib databases in the old dump, you must use 'make installcheck' and
+ensure that the corresponding contrib modules have been installed in
+the new version's installation tree.) This will build a temporary cluster
+using the old installation's executables, populate it from the dump file,
+and then try to pg_upgrade it to the new version. Success is reported
+if pg_dumpall output matches between the pre-upgrade and post-upgrade
+databases. In case of trouble, manually comparing those dump files may
+help to isolate the problem.
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
new file mode 100644
index 0000000..f1cd14e
--- /dev/null
+++ b/src/bin/pg_upgrade/check.c
@@ -0,0 +1,1453 @@
+/*
+ * check.c
+ *
+ * server checks and output routines
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/check.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_collation.h"
+#include "fe_utils/string_utils.h"
+#include "mb/pg_wchar.h"
+#include "pg_upgrade.h"
+
+static void check_new_cluster_is_empty(void);
+static void check_is_install_user(ClusterInfo *cluster);
+static void check_proper_datallowconn(ClusterInfo *cluster);
+static void check_for_prepared_transactions(ClusterInfo *cluster);
+static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
+static void check_for_user_defined_postfix_ops(ClusterInfo *cluster);
+static void check_for_incompatible_polymorphics(ClusterInfo *cluster);
+static void check_for_tables_with_oids(ClusterInfo *cluster);
+static void check_for_composite_data_type_usage(ClusterInfo *cluster);
+static void check_for_reg_data_type_usage(ClusterInfo *cluster);
+static void check_for_aclitem_data_type_usage(ClusterInfo *cluster);
+static void check_for_removed_data_type_usage(ClusterInfo *cluster,
+ const char *version,
+ const char *datatype);
+static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
+static void check_for_pg_role_prefix(ClusterInfo *cluster);
+static void check_for_new_tablespace_dir(ClusterInfo *new_cluster);
+static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster);
+
+
+/*
+ * fix_path_separator
+ * For non-Windows, just return the argument.
+ * For Windows convert any forward slash to a backslash
+ * such as is suitable for arguments to builtin commands
+ * like RMDIR and DEL.
+ */
+static char *
+fix_path_separator(char *path)
+{
+#ifdef WIN32
+
+ char *result;
+ char *c;
+
+ result = pg_strdup(path);
+
+ for (c = result; *c != '\0'; c++)
+ if (*c == '/')
+ *c = '\\';
+
+ return result;
+#else
+
+ return path;
+#endif
+}
+
+void
+output_check_banner(bool live_check)
+{
+ if (user_opts.check && live_check)
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks on Old Live Server\n"
+ "------------------------------------------------");
+ }
+ else
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks\n"
+ "-----------------------------");
+ }
+}
+
+
+void
+check_and_dump_old_cluster(bool live_check)
+{
+ /* -- OLD -- */
+
+ if (!live_check)
+ start_postmaster(&old_cluster, true);
+
+ /* Extract a list of databases and tables from the old cluster */
+ get_db_and_rel_infos(&old_cluster);
+
+ init_tablespaces();
+
+ get_loadable_libraries();
+
+
+ /*
+ * Check for various failure cases
+ */
+ check_is_install_user(&old_cluster);
+ check_proper_datallowconn(&old_cluster);
+ check_for_prepared_transactions(&old_cluster);
+ check_for_composite_data_type_usage(&old_cluster);
+ check_for_reg_data_type_usage(&old_cluster);
+ check_for_isn_and_int8_passing_mismatch(&old_cluster);
+
+ /*
+ * PG 16 increased the size of the 'aclitem' type, which breaks the
+ * on-disk format for existing data.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1500)
+ check_for_aclitem_data_type_usage(&old_cluster);
+
+ /*
+ * PG 12 removed types abstime, reltime, tinterval.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ {
+ check_for_removed_data_type_usage(&old_cluster, "12", "abstime");
+ check_for_removed_data_type_usage(&old_cluster, "12", "reltime");
+ check_for_removed_data_type_usage(&old_cluster, "12", "tinterval");
+ }
+
+ /*
+ * PG 14 changed the function signature of encoding conversion functions.
+ * Conversions from older versions cannot be upgraded automatically
+ * because the user-defined functions used by the encoding conversions
+ * need to be changed to match the new signature.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_encoding_conversions(&old_cluster);
+
+ /*
+ * Pre-PG 14 allowed user defined postfix operators, which are not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_postfix_ops(&old_cluster);
+
+ /*
+ * PG 14 changed polymorphic functions from anyarray to
+ * anycompatiblearray.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_incompatible_polymorphics(&old_cluster);
+
+ /*
+ * Pre-PG 12 allowed tables to be declared WITH OIDS, which is not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ check_for_tables_with_oids(&old_cluster);
+
+ /*
+ * PG 12 changed the 'sql_identifier' type storage to be based on name,
+ * not varchar, which breaks on-disk format for existing data. So we need
+ * to prevent upgrade when used in user objects (tables, indexes, ...).
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ old_11_check_for_sql_identifier_data_type_usage(&old_cluster);
+
+ /*
+ * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged
+ * hash indexes
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ {
+ old_9_6_check_for_unknown_data_type_usage(&old_cluster);
+ if (user_opts.check)
+ old_9_6_invalidate_hash_indexes(&old_cluster, true);
+ }
+
+ /* 9.5 and below should not have roles starting with pg_ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 905)
+ check_for_pg_role_prefix(&old_cluster);
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) == 904 &&
+ old_cluster.controldata.cat_ver < JSONB_FORMAT_CHANGE_CAT_VER)
+ check_for_jsonb_9_4_usage(&old_cluster);
+
+ /* Pre-PG 9.4 had a different 'line' data type internal format */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 903)
+ old_9_3_check_for_line_data_type_usage(&old_cluster);
+
+ /*
+ * While not a check option, we do this now because this is the only time
+ * the old server is running.
+ */
+ if (!user_opts.check)
+ generate_old_dump();
+
+ if (!live_check)
+ stop_postmaster(false);
+}
+
+
+void
+check_new_cluster(void)
+{
+ get_db_and_rel_infos(&new_cluster);
+
+ check_new_cluster_is_empty();
+
+ check_loadable_libraries();
+
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ check_file_clone();
+ break;
+ case TRANSFER_MODE_COPY:
+ break;
+ case TRANSFER_MODE_LINK:
+ check_hard_link();
+ break;
+ }
+
+ check_is_install_user(&new_cluster);
+
+ check_for_prepared_transactions(&new_cluster);
+
+ check_for_new_tablespace_dir(&new_cluster);
+}
+
+
+void
+report_clusters_compatible(void)
+{
+ if (user_opts.check)
+ {
+ pg_log(PG_REPORT, "\n*Clusters are compatible*");
+ /* stops new cluster */
+ stop_postmaster(false);
+
+ cleanup_output_dirs();
+ exit(0);
+ }
+
+ pg_log(PG_REPORT, "\n"
+ "If pg_upgrade fails after this point, you must re-initdb the\n"
+ "new cluster before continuing.");
+}
+
+
+void
+issue_warnings_and_set_wal_level(void)
+{
+ /*
+ * We unconditionally start/stop the new server because pg_resetwal -o set
+ * wal_level to 'minimum'. If the user is upgrading standby servers using
+ * the rsync instructions, they will need pg_upgrade to write its final
+ * WAL record showing wal_level as 'replica'.
+ */
+ start_postmaster(&new_cluster, true);
+
+ /* Reindex hash indexes for old < 10.0 */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ old_9_6_invalidate_hash_indexes(&new_cluster, false);
+
+ report_extension_updates(&new_cluster);
+
+ stop_postmaster(false);
+}
+
+
+void
+output_completion_banner(char *deletion_script_file_name)
+{
+ PQExpBufferData user_specification;
+
+ initPQExpBuffer(&user_specification);
+ if (os_info.user_specified)
+ {
+ appendPQExpBufferStr(&user_specification, "-U ");
+ appendShellString(&user_specification, os_info.user);
+ appendPQExpBufferChar(&user_specification, ' ');
+ }
+
+ pg_log(PG_REPORT,
+ "Optimizer statistics are not transferred by pg_upgrade.\n"
+ "Once you start the new server, consider running:\n"
+ " %s/vacuumdb %s--all --analyze-in-stages", new_cluster.bindir, user_specification.data);
+
+ if (deletion_script_file_name)
+ pg_log(PG_REPORT,
+ "Running this script will delete the old cluster's data files:\n"
+ " %s",
+ deletion_script_file_name);
+ else
+ pg_log(PG_REPORT,
+ "Could not create a script to delete the old cluster's data files\n"
+ "because user-defined tablespaces or the new cluster's data directory\n"
+ "exist in the old cluster directory. The old cluster's contents must\n"
+ "be deleted manually.");
+
+ termPQExpBuffer(&user_specification);
+}
+
+
+void
+check_cluster_versions(void)
+{
+ prep_status("Checking cluster versions");
+
+ /* cluster versions should already have been obtained */
+ Assert(old_cluster.major_version != 0);
+ Assert(new_cluster.major_version != 0);
+
+ /*
+ * We allow upgrades from/to the same major version for alpha/beta
+ * upgrades
+ */
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) < 902)
+ pg_fatal("This utility can only upgrade from PostgreSQL version %s and later.",
+ "9.2");
+
+ /* Only current PG version is supported as a target */
+ if (GET_MAJOR_VERSION(new_cluster.major_version) != GET_MAJOR_VERSION(PG_VERSION_NUM))
+ pg_fatal("This utility can only upgrade to PostgreSQL version %s.",
+ PG_MAJORVERSION);
+
+ /*
+ * We can't allow downgrading because we use the target pg_dump, and
+ * pg_dump cannot operate on newer database versions, only current and
+ * older versions.
+ */
+ if (old_cluster.major_version > new_cluster.major_version)
+ pg_fatal("This utility cannot be used to downgrade to older major PostgreSQL versions.");
+
+ /* Ensure binaries match the designated data directories */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) !=
+ GET_MAJOR_VERSION(old_cluster.bin_version))
+ pg_fatal("Old cluster data and binary directories are from different major versions.");
+ if (GET_MAJOR_VERSION(new_cluster.major_version) !=
+ GET_MAJOR_VERSION(new_cluster.bin_version))
+ pg_fatal("New cluster data and binary directories are from different major versions.");
+
+ check_ok();
+}
+
+
+void
+check_cluster_compatibility(bool live_check)
+{
+ /* get/check pg_control data of servers */
+ get_control_data(&old_cluster, live_check);
+ get_control_data(&new_cluster, false);
+ check_control_data(&old_cluster.controldata, &new_cluster.controldata);
+
+ if (live_check && old_cluster.port == new_cluster.port)
+ pg_fatal("When checking a live server, "
+ "the old and new port numbers must be different.");
+}
+
+
+static void
+check_new_cluster_is_empty(void)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
+ {
+ int relnum;
+ RelInfoArr *rel_arr = &new_cluster.dbarr.dbs[dbnum].rel_arr;
+
+ for (relnum = 0; relnum < rel_arr->nrels;
+ relnum++)
+ {
+ /* pg_largeobject and its index should be skipped */
+ if (strcmp(rel_arr->rels[relnum].nspname, "pg_catalog") != 0)
+ pg_fatal("New cluster database \"%s\" is not empty: found relation \"%s.%s\"",
+ new_cluster.dbarr.dbs[dbnum].db_name,
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname);
+ }
+ }
+}
+
+/*
+ * A previous run of pg_upgrade might have failed and the new cluster
+ * directory recreated, but they might have forgotten to remove
+ * the new cluster's tablespace directories. Therefore, check that
+ * new cluster tablespace directories do not already exist. If
+ * they do, it would cause an error while restoring global objects.
+ * This allows the failure to be detected at check time, rather than
+ * during schema restore.
+ */
+static void
+check_for_new_tablespace_dir(ClusterInfo *new_cluster)
+{
+ int tblnum;
+ char new_tablespace_dir[MAXPGPATH];
+
+ prep_status("Checking for new cluster tablespace directories");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statbuf;
+
+ snprintf(new_tablespace_dir, MAXPGPATH, "%s%s",
+ os_info.old_tablespaces[tblnum],
+ new_cluster->tablespace_suffix);
+
+ if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT)
+ pg_fatal("new cluster tablespace directory already exists: \"%s\"",
+ new_tablespace_dir);
+ }
+
+ check_ok();
+}
+
+/*
+ * create_script_for_old_cluster_deletion()
+ *
+ * This is particularly useful for tablespace deletion.
+ */
+void
+create_script_for_old_cluster_deletion(char **deletion_script_file_name)
+{
+ FILE *script = NULL;
+ int tblnum;
+ char old_cluster_pgdata[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ *deletion_script_file_name = psprintf("%sdelete_old_cluster.%s",
+ SCRIPT_PREFIX, SCRIPT_EXT);
+
+ strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(old_cluster_pgdata);
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ /* Some people put the new data directory inside the old one. */
+ if (path_is_prefix_of_path(old_cluster_pgdata, new_cluster_pgdata))
+ {
+ pg_log(PG_WARNING,
+ "\nWARNING: new data directory should not be inside the old data directory, i.e. %s", old_cluster_pgdata);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+
+ /*
+ * Some users (oddly) create tablespaces inside the cluster data
+ * directory. We can't create a proper old cluster delete script in that
+ * case.
+ */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ char old_tablespace_dir[MAXPGPATH];
+
+ strlcpy(old_tablespace_dir, os_info.old_tablespaces[tblnum], MAXPGPATH);
+ canonicalize_path(old_tablespace_dir);
+ if (path_is_prefix_of_path(old_cluster_pgdata, old_tablespace_dir))
+ {
+ /* reproduce warning from CREATE TABLESPACE that is in the log */
+ pg_log(PG_WARNING,
+ "\nWARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s", old_tablespace_dir);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+ }
+
+ prep_status("Creating script to delete old cluster");
+
+ if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ *deletion_script_file_name, strerror(errno));
+
+#ifndef WIN32
+ /* add shebang header */
+ fprintf(script, "#!/bin/sh\n\n");
+#endif
+
+ /* delete old cluster's default tablespace */
+ fprintf(script, RMDIR_CMD " %c%s%c\n", PATH_QUOTE,
+ fix_path_separator(old_cluster.pgdata), PATH_QUOTE);
+
+ /* delete old cluster's alternate tablespaces */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ /*
+ * Do the old cluster's per-database directories share a directory
+ * with a new version-specific tablespace?
+ */
+ if (strlen(old_cluster.tablespace_suffix) == 0)
+ {
+ /* delete per-database directories */
+ int dbnum;
+
+ fprintf(script, "\n");
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ fprintf(script, RMDIR_CMD " %c%s%c%u%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ PATH_SEPARATOR, old_cluster.dbarr.dbs[dbnum].db_oid,
+ PATH_QUOTE);
+ }
+ else
+ {
+ char *suffix_path = pg_strdup(old_cluster.tablespace_suffix);
+
+ /*
+ * Simply delete the tablespace directory, which might be ".old"
+ * or a version-specific subdirectory.
+ */
+ fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ fix_path_separator(suffix_path), PATH_QUOTE);
+ pfree(suffix_path);
+ }
+ }
+
+ fclose(script);
+
+#ifndef WIN32
+ if (chmod(*deletion_script_file_name, S_IRWXU) != 0)
+ pg_fatal("could not add execute permission to file \"%s\": %s",
+ *deletion_script_file_name, strerror(errno));
+#endif
+
+ check_ok();
+}
+
+
+/*
+ * check_is_install_user()
+ *
+ * Check we are the install user, and that the new cluster
+ * has no other users.
+ */
+static void
+check_is_install_user(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking database user is the install user");
+
+ /* Can't use pg_authid because only superusers can view it. */
+ res = executeQueryOrDie(conn,
+ "SELECT rolsuper, oid "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname = current_user "
+ "AND rolname !~ '^pg_'");
+
+ /*
+ * We only allow the install user in the new cluster (see comment below)
+ * and we preserve pg_authid.oid, so this must be the install user in the
+ * old cluster too.
+ */
+ if (PQntuples(res) != 1 ||
+ atooid(PQgetvalue(res, 0, 1)) != BOOTSTRAP_SUPERUSERID)
+ pg_fatal("database user \"%s\" is not the install user",
+ os_info.user);
+
+ PQclear(res);
+
+ res = executeQueryOrDie(conn,
+ "SELECT COUNT(*) "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname !~ '^pg_'");
+
+ if (PQntuples(res) != 1)
+ pg_fatal("could not determine the number of users");
+
+ /*
+ * We only allow the install user in the new cluster because other defined
+ * users might match users defined in the old cluster and generate an
+ * error during pg_dump restore.
+ */
+ if (cluster == &new_cluster && strcmp(PQgetvalue(res, 0, 0), "1") != 0)
+ pg_fatal("Only the install user can be defined in the new cluster.");
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_proper_datallowconn
+ *
+ * Ensure that all non-template0 databases allow connections since they
+ * otherwise won't be restored; and that template0 explicitly doesn't allow
+ * connections since it would make pg_dumpall --globals restore fail.
+ */
+static void
+check_proper_datallowconn(ClusterInfo *cluster)
+{
+ int dbnum;
+ PGconn *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking database connection settings");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "databases_with_datallowconn_false.txt");
+
+ conn_template1 = connectToServer(cluster, "template1");
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ if (strcmp(datname, "template0") == 0)
+ {
+ /* avoid restore failure when pg_dumpall tries to create template0 */
+ if (strcmp(datallowconn, "t") == 0)
+ pg_fatal("template0 must not allow connections, "
+ "i.e. its pg_database.datallowconn must be false");
+ }
+ else
+ {
+ /*
+ * avoid datallowconn == false databases from being skipped on
+ * restore
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+
+ fprintf(script, "%s\n", datname);
+ }
+ }
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("All non-template0 databases must allow connections, i.e. their\n"
+ "pg_database.datallowconn must be true. Your installation contains\n"
+ "non-template0 databases with their pg_database.datallowconn set to\n"
+ "false. Consider allowing connection for all non-template0 databases\n"
+ "or drop the databases which do not allow connections. A list of\n"
+ "databases with the problem is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_prepared_transactions()
+ *
+ * Make sure there are no prepared transactions because the storage format
+ * might have changed.
+ */
+static void
+check_for_prepared_transactions(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking for prepared transactions");
+
+ res = executeQueryOrDie(conn,
+ "SELECT * "
+ "FROM pg_catalog.pg_prepared_xacts");
+
+ if (PQntuples(res) != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster contains prepared transactions");
+ else
+ pg_fatal("The target cluster contains prepared transactions");
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_for_isn_and_int8_passing_mismatch()
+ *
+ * contrib/isn relies on data type int8, and in 8.4 int8 can now be passed
+ * by value. The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
+ * it must match for the old and new servers.
+ */
+static void
+check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for contrib/isn with bigint-passing mismatch");
+
+ if (old_cluster.controldata.float8_pass_by_value ==
+ new_cluster.controldata.float8_pass_by_value)
+ {
+ /* no mismatch */
+ check_ok();
+ return;
+ }
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "contrib_isn_and_int8_pass_by_value.txt");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_proname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* Find any functions coming from contrib/isn */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, p.proname "
+ "FROM pg_catalog.pg_proc p, "
+ " pg_catalog.pg_namespace n "
+ "WHERE p.pronamespace = n.oid AND "
+ " p.probin = '$libdir/isn'");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_proname = PQfnumber(res, "proname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_proname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains \"contrib/isn\" functions which rely on the\n"
+ "bigint data type. Your old and new clusters pass bigint values\n"
+ "differently so this cluster cannot currently be upgraded. You can\n"
+ "manually dump databases in the old cluster that use \"contrib/isn\"\n"
+ "facilities, drop them, perform the upgrade, and then restore them. A\n"
+ "list of the problem functions is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * Verify that no user defined postfix operators exist.
+ */
+static void
+check_for_user_defined_postfix_ops(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined postfix operators");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "postfix_ops.txt");
+
+ /* Find any user defined postfix operators */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_oproid,
+ i_oprnsp,
+ i_oprname,
+ i_typnsp,
+ i_typname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT o.oid AS oproid, "
+ " n.nspname AS oprnsp, "
+ " o.oprname, "
+ " tn.nspname AS typnsp, "
+ " t.typname "
+ "FROM pg_catalog.pg_operator o, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_type t, "
+ " pg_catalog.pg_namespace tn "
+ "WHERE o.oprnamespace = n.oid AND "
+ " o.oprleft = t.oid AND "
+ " t.typnamespace = tn.oid AND "
+ " o.oprright = 0 AND "
+ " o.oid >= 16384");
+ ntups = PQntuples(res);
+ i_oproid = PQfnumber(res, "oproid");
+ i_oprnsp = PQfnumber(res, "oprnsp");
+ i_oprname = PQfnumber(res, "oprname");
+ i_typnsp = PQfnumber(res, "typnsp");
+ i_typname = PQfnumber(res, "typname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s (%s.%s, NONE)\n",
+ PQgetvalue(res, rowno, i_oproid),
+ PQgetvalue(res, rowno, i_oprnsp),
+ PQgetvalue(res, rowno, i_oprname),
+ PQgetvalue(res, rowno, i_typnsp),
+ PQgetvalue(res, rowno, i_typname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains user-defined postfix operators, which are not\n"
+ "supported anymore. Consider dropping the postfix operators and replacing\n"
+ "them with prefix operators or function calls.\n"
+ "A list of user-defined postfix operators is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_incompatible_polymorphics()
+ *
+ * Make sure nothing is using old polymorphic functions with
+ * anyarray/anyelement rather than the new anycompatible variants.
+ */
+static void
+check_for_incompatible_polymorphics(ClusterInfo *cluster)
+{
+ PGresult *res;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+ PQExpBufferData old_polymorphics;
+
+ prep_status("Checking for incompatible polymorphic functions");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "incompatible_polymorphics.txt");
+
+ /* The set of problematic functions varies a bit in different versions */
+ initPQExpBuffer(&old_polymorphics);
+
+ appendPQExpBufferStr(&old_polymorphics,
+ "'array_append(anyarray,anyelement)'"
+ ", 'array_cat(anyarray,anyarray)'"
+ ", 'array_prepend(anyelement,anyarray)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 903)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_remove(anyarray,anyelement)'"
+ ", 'array_replace(anyarray,anyelement,anyelement)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 905)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_position(anyarray,anyelement)'"
+ ", 'array_position(anyarray,anyelement,integer)'"
+ ", 'array_positions(anyarray,anyelement)'"
+ ", 'width_bucket(anyelement,anyarray)'");
+
+ for (int dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ bool db_used = false;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ int ntups;
+ int i_objkind,
+ i_objname;
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ /* Aggregate transition functions */
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS transfn ON transfn.oid=a.aggtransfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggtransfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Aggregate final functions */
+ "UNION ALL "
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS finalfn ON finalfn.oid=a.aggfinalfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggfinalfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Operators */
+ "UNION ALL "
+ "SELECT 'operator' AS objkind, op.oid::regoperator::text AS objname "
+ "FROM pg_operator AS op "
+ "WHERE op.oid >= 16384 "
+ "AND oprcode = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND oprleft = ANY(ARRAY['anyarray', 'anyelement']::regtype[]);",
+ old_polymorphics.data,
+ old_polymorphics.data,
+ old_polymorphics.data);
+
+ ntups = PQntuples(res);
+
+ i_objkind = PQfnumber(res, "objkind");
+ i_objname = PQfnumber(res, "objname");
+
+ for (int rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+
+ fprintf(script, " %s: %s\n",
+ PQgetvalue(res, rowno, i_objkind),
+ PQgetvalue(res, rowno, i_objname));
+ }
+
+ PQclear(res);
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains user-defined objects that refer to internal\n"
+ "polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+ "These user-defined objects must be dropped before upgrading and restored\n"
+ "afterwards, changing them to refer to the new corresponding functions with\n"
+ "arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+ "A list of the problematic objects is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+
+ termPQExpBuffer(&old_polymorphics);
+}
+
+/*
+ * Verify that no tables are declared WITH OIDS.
+ */
+static void
+check_for_tables_with_oids(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for tables WITH OIDS");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_with_oids.txt");
+
+ /* Find any tables declared WITH OIDS */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.relnamespace = n.oid AND "
+ " c.relhasoids AND"
+ " n.nspname NOT IN ('pg_catalog')");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains tables declared WITH OIDS, which is not\n"
+ "supported anymore. Consider removing the oid column using\n"
+ " ALTER TABLE ... SET WITHOUT OIDS;\n"
+ "A list of tables with the problem is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_composite_data_type_usage()
+ * Check for system-defined composite types used in user tables.
+ *
+ * The OIDs of rowtypes of system catalogs and information_schema views
+ * can change across major versions; unlike user-defined types, we have
+ * no mechanism for forcing them to be the same in the new cluster.
+ * Hence, if any user table uses one, that's problematic for pg_upgrade.
+ */
+static void
+check_for_composite_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ Oid firstUserOid;
+ char output_path[MAXPGPATH];
+ char *base_query;
+
+ prep_status("Checking for system-defined composite types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_composite.txt");
+
+ /*
+ * Look for composite types that were made during initdb *or* belong to
+ * information_schema; that's important in case information_schema was
+ * dropped and reloaded.
+ *
+ * The cutoff OID here should match the source cluster's value of
+ * FirstNormalObjectId. We hardcode it rather than using that C #define
+ * because, if that #define is ever changed, our own version's value is
+ * NOT what to use. Eventually we may need a test on the source cluster's
+ * version to select the correct value.
+ */
+ firstUserOid = 16384;
+
+ base_query = psprintf("SELECT t.oid FROM pg_catalog.pg_type t "
+ "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid "
+ " WHERE typtype = 'c' AND (t.oid < %u OR nspname = 'information_schema')",
+ firstUserOid);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains system-defined composite types in user tables.\n"
+ "These type OIDs are not stable across PostgreSQL versions,\n"
+ "so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_reg_data_type_usage()
+ * pg_upgrade only preserves these system values:
+ * pg_class.oid
+ * pg_type.oid
+ * pg_enum.oid
+ *
+ * Many of the reg* data types reference system catalog info that is
+ * not preserved, and hence these data types cannot be used in user
+ * tables upgraded by pg_upgrade.
+ */
+static void
+check_for_reg_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for reg* data types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_reg.txt");
+
+ /*
+ * Note: older servers will not have all of these reg* types, so we have
+ * to write the query like this rather than depending on casts to regtype.
+ */
+ found = check_for_data_types_usage(cluster,
+ "SELECT oid FROM pg_catalog.pg_type t "
+ "WHERE t.typnamespace = "
+ " (SELECT oid FROM pg_catalog.pg_namespace "
+ " WHERE nspname = 'pg_catalog') "
+ " AND t.typname IN ( "
+ /* pg_class.oid is preserved, so 'regclass' is OK */
+ " 'regcollation', "
+ " 'regconfig', "
+ " 'regdictionary', "
+ " 'regnamespace', "
+ " 'regoper', "
+ " 'regoperator', "
+ " 'regproc', "
+ " 'regprocedure' "
+ /* pg_authid.oid is preserved, so 'regrole' is OK */
+ /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */
+ " )",
+ output_path);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains one of the reg* data types in user tables.\n"
+ "These data types reference system OIDs that are not preserved by\n"
+ "pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_aclitem_data_type_usage
+ *
+ * aclitem changed its storage format in 16, so check for it.
+ */
+static void
+check_for_aclitem_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"%s\" data type in user tables",
+ "aclitem");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_aclitem.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.aclitem", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"aclitem\" data type in user tables.\n"
+ "The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+ "so this cluster cannot currently be upgraded. You can drop the\n"
+ "problem columns and restart the upgrade. A list of the problem\n"
+ "columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_removed_data_type_usage
+ *
+ * Check for in-core data types that have been removed. Callers know
+ * the exact list.
+ */
+static void
+check_for_removed_data_type_usage(ClusterInfo *cluster, const char *version,
+ const char *datatype)
+{
+ char output_path[MAXPGPATH];
+ char typename[NAMEDATALEN];
+
+ prep_status("Checking for removed \"%s\" data type in user tables",
+ datatype);
+
+ snprintf(output_path, sizeof(output_path), "tables_using_%s.txt",
+ datatype);
+ snprintf(typename, sizeof(typename), "pg_catalog.%s", datatype);
+
+ if (check_for_data_type_usage(cluster, typename, output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"%s\" data type in user tables.\n"
+ "The \"%s\" type has been removed in PostgreSQL version %s,\n"
+ "so this cluster cannot currently be upgraded. You can drop the\n"
+ "problem columns, or change them to another data type, and restart\n"
+ "the upgrade. A list of the problem columns is in the file:\n"
+ " %s", datatype, datatype, version, output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_jsonb_9_4_usage()
+ *
+ * JSONB changed its storage format during 9.4 beta, so check for it.
+ */
+static void
+check_for_jsonb_9_4_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"jsonb\" data type");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_jsonb.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.jsonb", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"jsonb\" data type in user tables.\n"
+ "The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_pg_role_prefix()
+ *
+ * Versions older than 9.6 should not have any pg_* roles
+ */
+static void
+check_for_pg_role_prefix(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+ int ntups;
+ int i_roloid;
+ int i_rolname;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for roles starting with \"pg_\"");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "pg_role_prefix.txt");
+
+ res = executeQueryOrDie(conn,
+ "SELECT oid AS roloid, rolname "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname ~ '^pg_'");
+
+ ntups = PQntuples(res);
+ i_roloid = PQfnumber(res, "roloid");
+ i_rolname = PQfnumber(res, "rolname");
+ for (int rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ fprintf(script, "%s (oid=%s)\n",
+ PQgetvalue(res, rowno, i_rolname),
+ PQgetvalue(res, rowno, i_roloid));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains roles starting with \"pg_\".\n"
+ "\"pg_\" is a reserved prefix for system roles. The cluster\n"
+ "cannot be upgraded until these roles are renamed.\n"
+ "A list of roles starting with \"pg_\" is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * Verify that no user-defined encoding conversions exist.
+ */
+static void
+check_for_user_defined_encoding_conversions(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined encoding conversions");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "encoding_conversions.txt");
+
+ /* Find any user defined encoding conversions */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_conoid,
+ i_conname,
+ i_nspname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT c.oid as conoid, c.conname, n.nspname "
+ "FROM pg_catalog.pg_conversion c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.connamespace = n.oid AND "
+ " c.oid >= 16384");
+ ntups = PQntuples(res);
+ i_conoid = PQfnumber(res, "conoid");
+ i_conname = PQfnumber(res, "conname");
+ i_nspname = PQfnumber(res, "nspname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s\n",
+ PQgetvalue(res, rowno, i_conoid),
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_conname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains user-defined encoding conversions.\n"
+ "The conversion function parameters changed in PostgreSQL version 14\n"
+ "so this cluster cannot currently be upgraded. You can remove the\n"
+ "encoding conversions in the old cluster and restart the upgrade.\n"
+ "A list of user-defined encoding conversions is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
new file mode 100644
index 0000000..9071a6f
--- /dev/null
+++ b/src/bin/pg_upgrade/controldata.c
@@ -0,0 +1,733 @@
+/*
+ * controldata.c
+ *
+ * controldata functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/controldata.c
+ */
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "pg_upgrade.h"
+#include "common/string.h"
+
+
+/*
+ * get_control_data()
+ *
+ * gets pg_control information in "ctrl". Assumes that bindir and
+ * datadir are valid absolute paths to postgresql bin and pgdata
+ * directories respectively *and* pg_resetwal is version compatible
+ * with datadir. The main purpose of this function is to get pg_control
+ * data in a version independent manner.
+ *
+ * The approach taken here is to invoke pg_resetwal with -n option
+ * and then pipe its output. With little string parsing we get the
+ * pg_control data. pg_resetwal cannot be run while the server is running
+ * so we use pg_controldata; pg_controldata doesn't provide all the fields
+ * we need to actually perform the upgrade, but it provides enough for
+ * check mode. We do not implement pg_resetwal -n because it is hard to
+ * return valid xid data for a running server.
+ */
+void
+get_control_data(ClusterInfo *cluster, bool live_check)
+{
+ char cmd[MAXPGPATH];
+ char bufin[MAX_STRING];
+ FILE *output;
+ char *p;
+ bool got_tli = false;
+ bool got_log_id = false;
+ bool got_log_seg = false;
+ bool got_xid = false;
+ bool got_oid = false;
+ bool got_multi = false;
+ bool got_oldestmulti = false;
+ bool got_oldestxid = false;
+ bool got_mxoff = false;
+ bool got_nextxlogfile = false;
+ bool got_float8_pass_by_value = false;
+ bool got_align = false;
+ bool got_blocksz = false;
+ bool got_largesz = false;
+ bool got_walsz = false;
+ bool got_walseg = false;
+ bool got_ident = false;
+ bool got_index = false;
+ bool got_toast = false;
+ bool got_large_object = false;
+ bool got_date_is_int = false;
+ bool got_data_checksum_version = false;
+ bool got_cluster_state = false;
+ char *lc_collate = NULL;
+ char *lc_ctype = NULL;
+ char *lc_monetary = NULL;
+ char *lc_numeric = NULL;
+ char *lc_time = NULL;
+ char *lang = NULL;
+ char *language = NULL;
+ char *lc_all = NULL;
+ char *lc_messages = NULL;
+ uint32 tli = 0;
+ uint32 logid = 0;
+ uint32 segno = 0;
+ char *resetwal_bin;
+ int rc;
+
+ /*
+ * Because we test the pg_resetwal output as strings, it has to be in
+ * English. Copied from pg_regress.c.
+ */
+ if (getenv("LC_COLLATE"))
+ lc_collate = pg_strdup(getenv("LC_COLLATE"));
+ if (getenv("LC_CTYPE"))
+ lc_ctype = pg_strdup(getenv("LC_CTYPE"));
+ if (getenv("LC_MONETARY"))
+ lc_monetary = pg_strdup(getenv("LC_MONETARY"));
+ if (getenv("LC_NUMERIC"))
+ lc_numeric = pg_strdup(getenv("LC_NUMERIC"));
+ if (getenv("LC_TIME"))
+ lc_time = pg_strdup(getenv("LC_TIME"));
+ if (getenv("LANG"))
+ lang = pg_strdup(getenv("LANG"));
+ if (getenv("LANGUAGE"))
+ language = pg_strdup(getenv("LANGUAGE"));
+ if (getenv("LC_ALL"))
+ lc_all = pg_strdup(getenv("LC_ALL"));
+ if (getenv("LC_MESSAGES"))
+ lc_messages = pg_strdup(getenv("LC_MESSAGES"));
+
+ unsetenv("LC_COLLATE");
+ unsetenv("LC_CTYPE");
+ unsetenv("LC_MONETARY");
+ unsetenv("LC_NUMERIC");
+ unsetenv("LC_TIME");
+#ifndef WIN32
+ unsetenv("LANG");
+#else
+ /* On Windows the default locale may not be English, so force it */
+ setenv("LANG", "en", 1);
+#endif
+ unsetenv("LANGUAGE");
+ unsetenv("LC_ALL");
+ setenv("LC_MESSAGES", "C", 1);
+
+ /*
+ * Check for clean shutdown
+ */
+ if (!live_check || cluster == &new_cluster)
+ {
+ /* only pg_controldata outputs the cluster state */
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"",
+ cluster->bindir, cluster->pgdata);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, strerror(errno));
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ if ((p = strstr(bufin, "Database cluster state:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: database cluster state problem", __LINE__);
+
+ p++; /* remove ':' char */
+
+ /*
+ * We checked earlier for a postmaster lock file, and if we
+ * found one, we tried to start/stop the server to replay the
+ * WAL. However, pg_ctl -m immediate doesn't leave a lock
+ * file, but does require WAL replay, so we check here that
+ * the server was shut down cleanly, from the controldata
+ * perspective.
+ */
+ /* remove leading spaces */
+ while (*p == ' ')
+ p++;
+ if (strcmp(p, "shut down in recovery\n") == 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.");
+ else
+ pg_fatal("The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.");
+ }
+ else if (strcmp(p, "shut down\n") != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was not shut down cleanly.");
+ else
+ pg_fatal("The target cluster was not shut down cleanly.");
+ }
+ got_cluster_state = true;
+ }
+ }
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ if (!got_cluster_state)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster lacks cluster state information:");
+ else
+ pg_fatal("The target cluster lacks cluster state information:");
+ }
+ }
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ resetwal_bin = "pg_resetxlog\" -n";
+ else
+ resetwal_bin = "pg_resetwal\" -n";
+ snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
+ cluster->bindir,
+ live_check ? "pg_controldata\"" : resetwal_bin,
+ cluster->pgdata);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, strerror(errno));
+
+ /* Only in <= 9.2 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ cluster->controldata.data_checksum_version = 0;
+ got_data_checksum_version = true;
+ }
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ /* In verbose mode, log each line */
+ pg_strip_crlf(bufin);
+ pg_log(PG_VERBOSE, "%s", bufin);
+
+ if ((p = strstr(bufin, "pg_control version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: pg_resetwal problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ctrl_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Catalog version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.cat_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's TimeLineID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ tli = str2uint(p);
+ got_tli = true;
+ }
+ else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ logid = str2uint(p);
+ got_log_id = true;
+ }
+ else if ((p = strstr(bufin, "First log file segment after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ segno = str2uint(p);
+ got_log_seg = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtepoch = str2uint(p);
+
+ /*
+ * Delimiter changed from '/' to ':' in 9.6. We don't test for
+ * the catalog version of the change because the catalog version
+ * is pulled from pg_controldata too, and it isn't worth adding an
+ * order dependency for this --- we just check the string.
+ */
+ if (strchr(p, '/') != NULL)
+ p = strchr(p, '/');
+ else if (GET_MAJOR_VERSION(cluster->major_version) >= 906)
+ p = strchr(p, ':');
+ else
+ p = NULL;
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove '/' or ':' char */
+ cluster->controldata.chkpnt_nxtxid = str2uint(p);
+ got_xid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtoid = str2uint(p);
+ got_oid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiXactId:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmulti = str2uint(p);
+ got_multi = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstxid = str2uint(p);
+ got_oldestxid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestMultiXid:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstMulti = str2uint(p);
+ got_oldestmulti = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiOffset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmxoff = str2uint(p);
+ got_mxoff = true;
+ }
+ else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
+ {
+ /* Skip the colon and any whitespace after it */
+ p = strchr(p, ':');
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+ p = strpbrk(p, "01234567890ABCDEF");
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ /* Make sure it looks like a valid WAL file name */
+ if (strspn(p, "0123456789ABCDEF") != 24)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ strlcpy(cluster->controldata.nextxlogfile, p, 25);
+ got_nextxlogfile = true;
+ }
+ else if ((p = strstr(bufin, "Float8 argument passing:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ /* used later for contrib check */
+ cluster->controldata.float8_pass_by_value = strstr(p, "by value") != NULL;
+ got_float8_pass_by_value = true;
+ }
+ else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.align = str2uint(p);
+ got_align = true;
+ }
+ else if ((p = strstr(bufin, "Database block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.blocksz = str2uint(p);
+ got_blocksz = true;
+ }
+ else if ((p = strstr(bufin, "Blocks per segment of large relation:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.largesz = str2uint(p);
+ got_largesz = true;
+ }
+ else if ((p = strstr(bufin, "WAL block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walsz = str2uint(p);
+ got_walsz = true;
+ }
+ else if ((p = strstr(bufin, "Bytes per WAL segment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walseg = str2uint(p);
+ got_walseg = true;
+ }
+ else if ((p = strstr(bufin, "Maximum length of identifiers:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ident = str2uint(p);
+ got_ident = true;
+ }
+ else if ((p = strstr(bufin, "Maximum columns in an index:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.index = str2uint(p);
+ got_index = true;
+ }
+ else if ((p = strstr(bufin, "Maximum size of a TOAST chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.toast = str2uint(p);
+ got_toast = true;
+ }
+ else if ((p = strstr(bufin, "Size of a large-object chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.large_object = str2uint(p);
+ got_large_object = true;
+ }
+ else if ((p = strstr(bufin, "Date/time type storage:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.date_is_int = strstr(p, "64-bit integers") != NULL;
+ got_date_is_int = true;
+ }
+ else if ((p = strstr(bufin, "checksum")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.data_checksum_version = str2uint(p);
+ got_data_checksum_version = true;
+ }
+ }
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ /*
+ * Restore environment variables. Note all but LANG and LC_MESSAGES were
+ * unset above.
+ */
+ if (lc_collate)
+ setenv("LC_COLLATE", lc_collate, 1);
+ if (lc_ctype)
+ setenv("LC_CTYPE", lc_ctype, 1);
+ if (lc_monetary)
+ setenv("LC_MONETARY", lc_monetary, 1);
+ if (lc_numeric)
+ setenv("LC_NUMERIC", lc_numeric, 1);
+ if (lc_time)
+ setenv("LC_TIME", lc_time, 1);
+ if (lang)
+ setenv("LANG", lang, 1);
+ else
+ unsetenv("LANG");
+ if (language)
+ setenv("LANGUAGE", language, 1);
+ if (lc_all)
+ setenv("LC_ALL", lc_all, 1);
+ if (lc_messages)
+ setenv("LC_MESSAGES", lc_messages, 1);
+ else
+ unsetenv("LC_MESSAGES");
+
+ pg_free(lc_collate);
+ pg_free(lc_ctype);
+ pg_free(lc_monetary);
+ pg_free(lc_numeric);
+ pg_free(lc_time);
+ pg_free(lang);
+ pg_free(language);
+ pg_free(lc_all);
+ pg_free(lc_messages);
+
+ /*
+ * Before 9.3, pg_resetwal reported the xlogid and segno of the first log
+ * file after reset as separate lines. Starting with 9.3, it reports the
+ * WAL file name. If the old cluster is older than 9.3, we construct the
+ * WAL file name from the xlogid and segno.
+ */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ if (got_tli && got_log_id && got_log_seg)
+ {
+ snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
+ tli, logid, segno);
+ got_nextxlogfile = true;
+ }
+ }
+
+ /* verify that we got all the mandatory pg_control data */
+ if (!got_xid || !got_oid ||
+ !got_multi || !got_oldestxid ||
+ (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
+ !got_mxoff || (!live_check && !got_nextxlogfile) ||
+ !got_float8_pass_by_value || !got_align || !got_blocksz ||
+ !got_largesz || !got_walsz || !got_walseg || !got_ident ||
+ !got_index || !got_toast ||
+ (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER) ||
+ !got_date_is_int || !got_data_checksum_version)
+ {
+ if (cluster == &old_cluster)
+ pg_log(PG_REPORT,
+ "The source cluster lacks some required control information:");
+ else
+ pg_log(PG_REPORT,
+ "The target cluster lacks some required control information:");
+
+ if (!got_xid)
+ pg_log(PG_REPORT, " checkpoint next XID");
+
+ if (!got_oid)
+ pg_log(PG_REPORT, " latest checkpoint next OID");
+
+ if (!got_multi)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactId");
+
+ if (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ pg_log(PG_REPORT, " latest checkpoint oldest MultiXactId");
+
+ if (!got_oldestxid)
+ pg_log(PG_REPORT, " latest checkpoint oldestXID");
+
+ if (!got_mxoff)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactOffset");
+
+ if (!live_check && !got_nextxlogfile)
+ pg_log(PG_REPORT, " first WAL segment after reset");
+
+ if (!got_float8_pass_by_value)
+ pg_log(PG_REPORT, " float8 argument passing method");
+
+ if (!got_align)
+ pg_log(PG_REPORT, " maximum alignment");
+
+ if (!got_blocksz)
+ pg_log(PG_REPORT, " block size");
+
+ if (!got_largesz)
+ pg_log(PG_REPORT, " large relation segment size");
+
+ if (!got_walsz)
+ pg_log(PG_REPORT, " WAL block size");
+
+ if (!got_walseg)
+ pg_log(PG_REPORT, " WAL segment size");
+
+ if (!got_ident)
+ pg_log(PG_REPORT, " maximum identifier length");
+
+ if (!got_index)
+ pg_log(PG_REPORT, " maximum number of indexed columns");
+
+ if (!got_toast)
+ pg_log(PG_REPORT, " maximum TOAST chunk size");
+
+ if (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER)
+ pg_log(PG_REPORT, " large-object chunk size");
+
+ if (!got_date_is_int)
+ pg_log(PG_REPORT, " dates/times are integers?");
+
+ /* value added in Postgres 9.3 */
+ if (!got_data_checksum_version)
+ pg_log(PG_REPORT, " data checksum version");
+
+ pg_fatal("Cannot continue without required control information, terminating");
+ }
+}
+
+
+/*
+ * check_control_data()
+ *
+ * check to make sure the control data settings are compatible
+ */
+void
+check_control_data(ControlData *oldctrl,
+ ControlData *newctrl)
+{
+ if (oldctrl->align == 0 || oldctrl->align != newctrl->align)
+ pg_fatal("old and new pg_controldata alignments are invalid or do not match.\n"
+ "Likely one cluster is a 32-bit install, the other 64-bit");
+
+ if (oldctrl->blocksz == 0 || oldctrl->blocksz != newctrl->blocksz)
+ pg_fatal("old and new pg_controldata block sizes are invalid or do not match");
+
+ if (oldctrl->largesz == 0 || oldctrl->largesz != newctrl->largesz)
+ pg_fatal("old and new pg_controldata maximum relation segment sizes are invalid or do not match");
+
+ if (oldctrl->walsz == 0 || oldctrl->walsz != newctrl->walsz)
+ pg_fatal("old and new pg_controldata WAL block sizes are invalid or do not match");
+
+ if (oldctrl->walseg == 0 || oldctrl->walseg != newctrl->walseg)
+ pg_fatal("old and new pg_controldata WAL segment sizes are invalid or do not match");
+
+ if (oldctrl->ident == 0 || oldctrl->ident != newctrl->ident)
+ pg_fatal("old and new pg_controldata maximum identifier lengths are invalid or do not match");
+
+ if (oldctrl->index == 0 || oldctrl->index != newctrl->index)
+ pg_fatal("old and new pg_controldata maximum indexed columns are invalid or do not match");
+
+ if (oldctrl->toast == 0 || oldctrl->toast != newctrl->toast)
+ pg_fatal("old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match");
+
+ /* large_object added in 9.5, so it might not exist in the old cluster */
+ if (oldctrl->large_object != 0 &&
+ oldctrl->large_object != newctrl->large_object)
+ pg_fatal("old and new pg_controldata large-object chunk sizes are invalid or do not match");
+
+ if (oldctrl->date_is_int != newctrl->date_is_int)
+ pg_fatal("old and new pg_controldata date/time storage types do not match");
+
+ /*
+ * float8_pass_by_value does not need to match, but is used in
+ * check_for_isn_and_int8_passing_mismatch().
+ */
+
+ /*
+ * We might eventually allow upgrades from checksum to no-checksum
+ * clusters.
+ */
+ if (oldctrl->data_checksum_version == 0 &&
+ newctrl->data_checksum_version != 0)
+ pg_fatal("old cluster does not use data checksums but the new one does");
+ else if (oldctrl->data_checksum_version != 0 &&
+ newctrl->data_checksum_version == 0)
+ pg_fatal("old cluster uses data checksums but the new one does not");
+ else if (oldctrl->data_checksum_version != newctrl->data_checksum_version)
+ pg_fatal("old and new cluster pg_controldata checksum versions do not match");
+}
+
+
+void
+disable_old_cluster(void)
+{
+ char old_path[MAXPGPATH],
+ new_path[MAXPGPATH];
+
+ /* rename pg_control so old server cannot be accidentally started */
+ prep_status("Adding \".old\" suffix to old global/pg_control");
+
+ snprintf(old_path, sizeof(old_path), "%s/global/pg_control", old_cluster.pgdata);
+ snprintf(new_path, sizeof(new_path), "%s/global/pg_control.old", old_cluster.pgdata);
+ if (pg_mv_file(old_path, new_path) != 0)
+ pg_fatal("could not rename file \"%s\" to \"%s\": %m",
+ old_path, new_path);
+ check_ok();
+
+ pg_log(PG_REPORT, "\n"
+ "If you want to start the old cluster, you will need to remove\n"
+ "the \".old\" suffix from %s/global/pg_control.old.\n"
+ "Because \"link\" mode was used, the old cluster cannot be safely\n"
+ "started once the new cluster has been started.",
+ old_cluster.pgdata);
+}
diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c
new file mode 100644
index 0000000..6c8c82d
--- /dev/null
+++ b/src/bin/pg_upgrade/dump.c
@@ -0,0 +1,71 @@
+/*
+ * dump.c
+ *
+ * dump functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/dump.c
+ */
+
+#include "postgres_fe.h"
+
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+void
+generate_old_dump(void)
+{
+ int dbnum;
+
+ prep_status("Creating dump of global objects");
+
+ /* run new pg_dumpall binary for globals */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_dumpall\" %s --globals-only --quote-all-identifiers "
+ "--binary-upgrade %s -f \"%s/%s\"",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ log_opts.dumpdir,
+ GLOBALS_DUMP_FILE);
+ check_ok();
+
+ prep_status_progress("Creating dump of database schemas");
+
+ /* create per-db dump files */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ PQExpBufferData connstr,
+ escaped_connstr;
+
+ initPQExpBuffer(&connstr);
+ appendPQExpBufferStr(&connstr, "dbname=");
+ appendConnStrVal(&connstr, old_db->db_name);
+ initPQExpBuffer(&escaped_connstr);
+ appendShellString(&escaped_connstr, connstr.data);
+ termPQExpBuffer(&connstr);
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ parallel_exec_prog(log_file_name, NULL,
+ "\"%s/pg_dump\" %s --schema-only --quote-all-identifiers "
+ "--binary-upgrade --format=custom %s --file=\"%s/%s\" %s",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ log_opts.dumpdir,
+ sql_file_name, escaped_connstr.data);
+
+ termPQExpBuffer(&escaped_connstr);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c
new file mode 100644
index 0000000..5b2edeb
--- /dev/null
+++ b/src/bin/pg_upgrade/exec.c
@@ -0,0 +1,459 @@
+/*
+ * exec.c
+ *
+ * execution functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/exec.c
+ */
+
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+
+#include "common/string.h"
+#include "pg_upgrade.h"
+
+static void check_data_dir(ClusterInfo *cluster);
+static void check_bin_dir(ClusterInfo *cluster, bool check_versions);
+static void get_bin_version(ClusterInfo *cluster);
+static void check_exec(const char *dir, const char *program, bool check_version);
+
+#ifdef WIN32
+static int win32_check_directory_write_permissions(void);
+#endif
+
+
+/*
+ * get_bin_version
+ *
+ * Fetch major version of binaries for cluster.
+ */
+static void
+get_bin_version(ClusterInfo *cluster)
+{
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *output;
+ int rc;
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get pg_ctl version data using %s: %s",
+ cmd, strerror(errno));
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get pg_ctl version data using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
+ pg_fatal("could not get pg_ctl version output from %s", cmd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ cluster->bin_version = v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ cluster->bin_version = v1 * 10000;
+ }
+}
+
+
+/*
+ * exec_prog()
+ * Execute an external program with stdout/stderr redirected, and report
+ * errors
+ *
+ * Formats a command from the given argument list, logs it to the log file,
+ * and attempts to execute that command. If the command executes
+ * successfully, exec_prog() returns true.
+ *
+ * If the command fails, an error message is optionally written to the specified
+ * log_file, and the program optionally exits.
+ *
+ * The code requires it be called first from the primary thread on Windows.
+ */
+bool
+exec_prog(const char *log_filename, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...)
+{
+ int result = 0;
+ int written;
+ char log_file[MAXPGPATH];
+
+#define MAXCMDLEN (2 * MAXPGPATH)
+ char cmd[MAXCMDLEN];
+ FILE *log;
+ va_list ap;
+
+#ifdef WIN32
+ static DWORD mainThreadId = 0;
+
+ /* We assume we are called from the primary thread first */
+ if (mainThreadId == 0)
+ mainThreadId = GetCurrentThreadId();
+#endif
+
+ snprintf(log_file, MAXPGPATH, "%s/%s", log_opts.logdir, log_filename);
+
+ written = 0;
+ va_start(ap, fmt);
+ written += vsnprintf(cmd + written, MAXCMDLEN - written, fmt, ap);
+ va_end(ap);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long");
+ written += snprintf(cmd + written, MAXCMDLEN - written,
+ " >> \"%s\" 2>&1", log_file);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long");
+
+ pg_log(PG_VERBOSE, "%s", cmd);
+
+#ifdef WIN32
+
+ /*
+ * For some reason, Windows issues a file-in-use error if we write data to
+ * the log file from a non-primary thread just before we create a
+ * subprocess that also writes to the same log file. One fix is to sleep
+ * for 100ms. A cleaner fix is to write to the log file _after_ the
+ * subprocess has completed, so we do this only when writing from a
+ * non-primary thread. fflush(), running system() twice, and pre-creating
+ * the file do not see to help.
+ */
+ if (mainThreadId != GetCurrentThreadId())
+ {
+ fflush(NULL);
+ result = system(cmd);
+ }
+#endif
+
+ log = fopen(log_file, "a");
+
+#ifdef WIN32
+ {
+ /*
+ * "pg_ctl -w stop" might have reported that the server has stopped
+ * because the postmaster.pid file has been removed, but "pg_ctl -w
+ * start" might still be in the process of closing and might still be
+ * holding its stdout and -l log file descriptors open. Therefore,
+ * try to open the log file a few more times.
+ */
+ int iter;
+
+ for (iter = 0; iter < 4 && log == NULL; iter++)
+ {
+ pg_usleep(1000000); /* 1 sec */
+ log = fopen(log_file, "a");
+ }
+ }
+#endif
+
+ if (log == NULL)
+ pg_fatal("could not open log file \"%s\": %m", log_file);
+
+#ifdef WIN32
+ /* Are we printing "command:" before its output? */
+ if (mainThreadId == GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+ fprintf(log, "command: %s\n", cmd);
+#ifdef WIN32
+ /* Are we printing "command:" after its output? */
+ if (mainThreadId != GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+
+ /*
+ * In Windows, we must close the log file at this point so the file is not
+ * open while the command is running, or we get a share violation.
+ */
+ fclose(log);
+
+#ifdef WIN32
+ /* see comment above */
+ if (mainThreadId == GetCurrentThreadId())
+#endif
+ {
+ fflush(NULL);
+ result = system(cmd);
+ }
+
+ if (result != 0 && report_error)
+ {
+ /* we might be in on a progress status line, so go to the next line */
+ report_status(PG_REPORT, "\n*failure*");
+ fflush(stdout);
+
+ pg_log(PG_VERBOSE, "There were problems executing \"%s\"", cmd);
+ if (opt_log_file)
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" or \"%s\" for\n"
+ "the probable cause of the failure.",
+ log_file, opt_log_file);
+ else
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" for\n"
+ "the probable cause of the failure.",
+ log_file);
+ }
+
+#ifndef WIN32
+
+ /*
+ * We can't do this on Windows because it will keep the "pg_ctl start"
+ * output filename open until the server stops, so we do the \n\n above on
+ * that platform. We use a unique filename for "pg_ctl start" that is
+ * never reused while the server is running, so it works fine. We could
+ * log these commands to a third file, but that just adds complexity.
+ */
+ if ((log = fopen(log_file, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m", log_file);
+ fprintf(log, "\n\n");
+ fclose(log);
+#endif
+
+ return result == 0;
+}
+
+
+/*
+ * pid_lock_file_exists()
+ *
+ * Checks whether the postmaster.pid file exists.
+ */
+bool
+pid_lock_file_exists(const char *datadir)
+{
+ char path[MAXPGPATH];
+ int fd;
+
+ snprintf(path, sizeof(path), "%s/postmaster.pid", datadir);
+
+ if ((fd = open(path, O_RDONLY, 0)) < 0)
+ {
+ /* ENOTDIR means we will throw a more useful error later */
+ if (errno != ENOENT && errno != ENOTDIR)
+ pg_fatal("could not open file \"%s\" for reading: %s",
+ path, strerror(errno));
+
+ return false;
+ }
+
+ close(fd);
+ return true;
+}
+
+
+/*
+ * verify_directories()
+ *
+ * does all the hectic work of verifying directories and executables
+ * of old and new server.
+ *
+ * NOTE: May update the values of all parameters
+ */
+void
+verify_directories(void)
+{
+#ifndef WIN32
+ if (access(".", R_OK | W_OK | X_OK) != 0)
+#else
+ if (win32_check_directory_write_permissions() != 0)
+#endif
+ pg_fatal("You must have read and write access in the current directory.");
+
+ check_bin_dir(&old_cluster, false);
+ check_data_dir(&old_cluster);
+ check_bin_dir(&new_cluster, true);
+ check_data_dir(&new_cluster);
+}
+
+
+#ifdef WIN32
+/*
+ * win32_check_directory_write_permissions()
+ *
+ * access() on WIN32 can't check directory permissions, so we have to
+ * optionally create, then delete a file to check.
+ * http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx
+ */
+static int
+win32_check_directory_write_permissions(void)
+{
+ int fd;
+
+ /*
+ * We open a file we would normally create anyway. We do this even in
+ * 'check' mode, which isn't ideal, but this is the best we can do.
+ */
+ if ((fd = open(GLOBALS_DUMP_FILE, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0)
+ return -1;
+ close(fd);
+
+ return unlink(GLOBALS_DUMP_FILE);
+}
+#endif
+
+
+/*
+ * check_single_dir()
+ *
+ * Check for the presence of a single directory in PGDATA, and fail if
+ * is it missing or not accessible.
+ */
+static void
+check_single_dir(const char *pg_data, const char *subdir)
+{
+ struct stat statBuf;
+ char subDirName[MAXPGPATH];
+
+ snprintf(subDirName, sizeof(subDirName), "%s%s%s", pg_data,
+ /* Win32 can't stat() a directory with a trailing slash. */
+ *subdir ? "/" : "",
+ subdir);
+
+ if (stat(subDirName, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s",
+ subDirName, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory",
+ subDirName);
+}
+
+
+/*
+ * check_data_dir()
+ *
+ * This function validates the given cluster directory - we search for a
+ * small set of subdirectories that we expect to find in a valid $PGDATA
+ * directory. If any of the subdirectories are missing (or secured against
+ * us) we display an error message and exit()
+ *
+ */
+static void
+check_data_dir(ClusterInfo *cluster)
+{
+ const char *pg_data = cluster->pgdata;
+
+ /* get the cluster version */
+ cluster->major_version = get_major_server_version(cluster);
+
+ check_single_dir(pg_data, "");
+ check_single_dir(pg_data, "base");
+ check_single_dir(pg_data, "global");
+ check_single_dir(pg_data, "pg_multixact");
+ check_single_dir(pg_data, "pg_subtrans");
+ check_single_dir(pg_data, "pg_tblspc");
+ check_single_dir(pg_data, "pg_twophase");
+
+ /* pg_xlog has been renamed to pg_wal in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_xlog");
+ else
+ check_single_dir(pg_data, "pg_wal");
+
+ /* pg_clog has been renamed to pg_xact in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_clog");
+ else
+ check_single_dir(pg_data, "pg_xact");
+}
+
+
+/*
+ * check_bin_dir()
+ *
+ * This function searches for the executables that we expect to find
+ * in the binaries directory. If we find that a required executable
+ * is missing (or secured against us), we display an error message and
+ * exit().
+ *
+ * If check_versions is true, then the versions of the binaries are checked
+ * against the version of this pg_upgrade. This is for checking the target
+ * bindir.
+ */
+static void
+check_bin_dir(ClusterInfo *cluster, bool check_versions)
+{
+ struct stat statBuf;
+
+ /* check bindir */
+ if (stat(cluster->bindir, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s",
+ cluster->bindir, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory",
+ cluster->bindir);
+
+ check_exec(cluster->bindir, "postgres", check_versions);
+ check_exec(cluster->bindir, "pg_controldata", check_versions);
+ check_exec(cluster->bindir, "pg_ctl", check_versions);
+
+ /*
+ * Fetch the binary version after checking for the existence of pg_ctl.
+ * This way we report a useful error if the pg_ctl binary used for version
+ * fetching is missing/broken.
+ */
+ get_bin_version(cluster);
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ check_exec(cluster->bindir, "pg_resetxlog", check_versions);
+ else
+ check_exec(cluster->bindir, "pg_resetwal", check_versions);
+
+ if (cluster == &new_cluster)
+ {
+ /*
+ * These binaries are only needed for the target version. pg_dump and
+ * pg_dumpall are used to dump the old cluster, but must be of the
+ * target version.
+ */
+ check_exec(cluster->bindir, "initdb", check_versions);
+ check_exec(cluster->bindir, "pg_dump", check_versions);
+ check_exec(cluster->bindir, "pg_dumpall", check_versions);
+ check_exec(cluster->bindir, "pg_restore", check_versions);
+ check_exec(cluster->bindir, "psql", check_versions);
+ check_exec(cluster->bindir, "vacuumdb", check_versions);
+ }
+}
+
+static void
+check_exec(const char *dir, const char *program, bool check_version)
+{
+ char path[MAXPGPATH];
+ char line[MAXPGPATH];
+ char cmd[MAXPGPATH];
+ char versionstr[128];
+
+ snprintf(path, sizeof(path), "%s/%s", dir, program);
+
+ if (validate_exec(path) != 0)
+ pg_fatal("check for \"%s\" failed: %m", path);
+
+ snprintf(cmd, sizeof(cmd), "\"%s\" -V", path);
+
+ if (!pipe_read_line(cmd, line, sizeof(line)))
+ pg_fatal("check for \"%s\" failed: cannot execute",
+ path);
+
+ if (check_version)
+ {
+ pg_strip_crlf(line);
+
+ snprintf(versionstr, sizeof(versionstr), "%s (PostgreSQL) " PG_VERSION, program);
+
+ if (strcmp(line, versionstr) != 0)
+ pg_fatal("check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"",
+ path, line, versionstr);
+ }
+}
diff --git a/src/bin/pg_upgrade/file.c b/src/bin/pg_upgrade/file.c
new file mode 100644
index 0000000..d173602
--- /dev/null
+++ b/src/bin/pg_upgrade/file.c
@@ -0,0 +1,377 @@
+/*
+ * file.c
+ *
+ * file system operations
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/file.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_COPYFILE_H
+#include <copyfile.h>
+#endif
+#ifdef __linux__
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#endif
+
+#include "access/visibilitymapdefs.h"
+#include "common/file_perm.h"
+#include "pg_upgrade.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+/*
+ * cloneFile()
+ *
+ * Clones/reflinks a relation file from src to dst.
+ *
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(src, dst, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not open file \"%s\": %s",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not create file \"%s\": %s",
+ schemaName, relName, dst, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ {
+ int save_errno = errno;
+
+ unlink(dst);
+
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(save_errno));
+ }
+
+ close(src_fd);
+ close(dest_fd);
+#endif
+}
+
+
+/*
+ * copyFile()
+ *
+ * Copies a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#ifndef WIN32
+ int src_fd;
+ int dest_fd;
+ char *buffer;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s",
+ schemaName, relName, dst, strerror(errno));
+
+ /* copy in fairly large chunks for best efficiency */
+#define COPY_BUF_SIZE (50 * BLCKSZ)
+
+ buffer = (char *) pg_malloc(COPY_BUF_SIZE);
+
+ /* perform data copying i.e read src source, write to destination */
+ while (true)
+ {
+ ssize_t nbytes = read(src_fd, buffer, COPY_BUF_SIZE);
+
+ if (nbytes < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s",
+ schemaName, relName, src, strerror(errno));
+
+ if (nbytes == 0)
+ break;
+
+ errno = 0;
+ if (write(dest_fd, buffer, nbytes) != nbytes)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s",
+ schemaName, relName, dst, strerror(errno));
+ }
+ }
+
+ pg_free(buffer);
+ close(src_fd);
+ close(dest_fd);
+
+#else /* WIN32 */
+
+ if (CopyFile(src, dst, true) == 0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(errno));
+ }
+
+#endif /* WIN32 */
+}
+
+
+/*
+ * linkFile()
+ *
+ * Hard-links a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+ if (link(src, dst) < 0)
+ pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(errno));
+}
+
+
+/*
+ * rewriteVisibilityMap()
+ *
+ * Transform a visibility map file, copying from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ *
+ * In versions of PostgreSQL prior to catversion 201603011, PostgreSQL's
+ * visibility map included one bit per heap page; it now includes two.
+ * When upgrading a cluster from before that time to a current PostgreSQL
+ * version, we could refuse to copy visibility maps from the old cluster
+ * to the new cluster; the next VACUUM would recreate them, but at the
+ * price of scanning the entire table. So, instead, we rewrite the old
+ * visibility maps in the new format. That way, the all-visible bits
+ * remain set for the pages for which they were set previously. The
+ * all-frozen bits are never set by this conversion; we leave that to VACUUM.
+ */
+void
+rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName)
+{
+ int src_fd;
+ int dst_fd;
+ PGIOAlignedBlock buffer;
+ PGIOAlignedBlock new_vmbuf;
+ ssize_t totalBytesRead = 0;
+ ssize_t src_filesize;
+ int rewriteVmBytesPerPage;
+ BlockNumber new_blkno = 0;
+ struct stat statbuf;
+
+ /* Compute number of old-format bytes per new page */
+ rewriteVmBytesPerPage = (BLCKSZ - SizeOfPageHeaderData) / 2;
+
+ if ((src_fd = open(fromfile, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if (fstat(src_fd, &statbuf) != 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not stat file \"%s\": %s",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s",
+ schemaName, relName, tofile, strerror(errno));
+
+ /* Save old file size */
+ src_filesize = statbuf.st_size;
+
+ /*
+ * Turn each visibility map page into 2 pages one by one. Each new page
+ * has the same page header as the old one. If the last section of the
+ * last page is empty, we skip it, mostly to avoid turning one-page
+ * visibility maps for small relations into two pages needlessly.
+ */
+ while (totalBytesRead < src_filesize)
+ {
+ ssize_t bytesRead;
+ char *old_cur;
+ char *old_break;
+ char *old_blkend;
+ PageHeaderData pageheader;
+ bool old_lastblk;
+
+ if ((bytesRead = read(src_fd, buffer.data, BLCKSZ)) != BLCKSZ)
+ {
+ if (bytesRead < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s",
+ schemaName, relName, fromfile, strerror(errno));
+ else
+ pg_fatal("error while copying relation \"%s.%s\": partial page found in file \"%s\"",
+ schemaName, relName, fromfile);
+ }
+
+ totalBytesRead += BLCKSZ;
+ old_lastblk = (totalBytesRead == src_filesize);
+
+ /* Save the page header data */
+ memcpy(&pageheader, buffer.data, SizeOfPageHeaderData);
+
+ /*
+ * These old_* variables point to old visibility map page. old_cur
+ * points to current position on old page. old_blkend points to end of
+ * old block. old_break is the end+1 position on the old page for the
+ * data that will be transferred to the current new page.
+ */
+ old_cur = buffer.data + SizeOfPageHeaderData;
+ old_blkend = buffer.data + bytesRead;
+ old_break = old_cur + rewriteVmBytesPerPage;
+
+ while (old_break <= old_blkend)
+ {
+ char *new_cur;
+ bool empty = true;
+ bool old_lastpart;
+
+ /* First, copy old page header to new page */
+ memcpy(new_vmbuf.data, &pageheader, SizeOfPageHeaderData);
+
+ /* Rewriting the last part of the last old page? */
+ old_lastpart = old_lastblk && (old_break == old_blkend);
+
+ new_cur = new_vmbuf.data + SizeOfPageHeaderData;
+
+ /* Process old page bytes one by one, and turn it into new page. */
+ while (old_cur < old_break)
+ {
+ uint8 byte = *(uint8 *) old_cur;
+ uint16 new_vmbits = 0;
+ int i;
+
+ /* Generate new format bits while keeping old information */
+ for (i = 0; i < BITS_PER_BYTE; i++)
+ {
+ if (byte & (1 << i))
+ {
+ empty = false;
+ new_vmbits |=
+ VISIBILITYMAP_ALL_VISIBLE << (BITS_PER_HEAPBLOCK * i);
+ }
+ }
+
+ /* Copy new visibility map bytes to new-format page */
+ new_cur[0] = (char) (new_vmbits & 0xFF);
+ new_cur[1] = (char) (new_vmbits >> 8);
+
+ old_cur++;
+ new_cur += BITS_PER_HEAPBLOCK;
+ }
+
+ /* If the last part of the last page is empty, skip writing it */
+ if (old_lastpart && empty)
+ break;
+
+ /* Set new checksum for visibility map page, if enabled */
+ if (new_cluster.controldata.data_checksum_version != 0)
+ ((PageHeader) new_vmbuf.data)->pd_checksum =
+ pg_checksum_page(new_vmbuf.data, new_blkno);
+
+ errno = 0;
+ if (write(dst_fd, new_vmbuf.data, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s",
+ schemaName, relName, tofile, strerror(errno));
+ }
+
+ /* Advance for next new page */
+ old_break += rewriteVmBytesPerPage;
+ new_blkno++;
+ }
+ }
+
+ /* Clean up */
+ close(dst_fd);
+ close(src_fd);
+}
+
+void
+check_file_clone(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.clonetest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s",
+ strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ {
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(existing_file, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("could not open file \"%s\": %s",
+ existing_file, strerror(errno));
+
+ if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("could not create file \"%s\": %s",
+ new_link_file, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s",
+ strerror(errno));
+
+ close(src_fd);
+ close(dest_fd);
+ }
+#else
+ pg_fatal("file cloning not supported on this platform");
+#endif
+
+ unlink(new_link_file);
+}
+
+void
+check_hard_link(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.linktest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+ if (link(existing_file, new_link_file) < 0)
+ pg_fatal("could not create hard link between old and new data directories: %s\n"
+ "In link mode the old and new data directories must be on the same file system.",
+ strerror(errno));
+
+ unlink(new_link_file);
+}
diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c
new file mode 100644
index 0000000..dc8800c
--- /dev/null
+++ b/src/bin/pg_upgrade/function.c
@@ -0,0 +1,194 @@
+/*
+ * function.c
+ *
+ * server-side function support
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/function.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_language_d.h"
+#include "pg_upgrade.h"
+
+/*
+ * qsort comparator for pointers to library names
+ *
+ * We sort first by name length, then alphabetically for names of the
+ * same length, then database array index. This is to ensure that, eg,
+ * "hstore_plpython" sorts after both "hstore" and "plpython"; otherwise
+ * transform modules will probably fail their LOAD tests. (The backend
+ * ought to cope with that consideration, but it doesn't yet, and even
+ * when it does it'll still be a good idea to have a predictable order of
+ * probing here.)
+ */
+static int
+library_name_compare(const void *p1, const void *p2)
+{
+ const char *str1 = ((const LibraryInfo *) p1)->name;
+ const char *str2 = ((const LibraryInfo *) p2)->name;
+ int slen1 = strlen(str1);
+ int slen2 = strlen(str2);
+ int cmp = strcmp(str1, str2);
+
+ if (slen1 != slen2)
+ return slen1 - slen2;
+ if (cmp != 0)
+ return cmp;
+ else
+ return ((const LibraryInfo *) p1)->dbnum -
+ ((const LibraryInfo *) p2)->dbnum;
+}
+
+
+/*
+ * get_loadable_libraries()
+ *
+ * Fetch the names of all old libraries containing C-language functions.
+ * We will later check that they all exist in the new installation.
+ */
+void
+get_loadable_libraries(void)
+{
+ PGresult **ress;
+ int totaltups;
+ int dbnum;
+
+ ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *));
+ totaltups = 0;
+
+ /* Fetch all library names, removing duplicates within each DB */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(&old_cluster, active_db->db_name);
+
+ /*
+ * Fetch all libraries containing non-built-in C functions in this DB.
+ */
+ ress[dbnum] = executeQueryOrDie(conn,
+ "SELECT DISTINCT probin "
+ "FROM pg_catalog.pg_proc "
+ "WHERE prolang = %u AND "
+ "probin IS NOT NULL AND "
+ "oid >= %u;",
+ ClanguageId,
+ FirstNormalObjectId);
+ totaltups += PQntuples(ress[dbnum]);
+
+ PQfinish(conn);
+ }
+
+ os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo));
+ totaltups = 0;
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ PGresult *res = ress[dbnum];
+ int ntups;
+ int rowno;
+
+ ntups = PQntuples(res);
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ char *lib = PQgetvalue(res, rowno, 0);
+
+ os_info.libraries[totaltups].name = pg_strdup(lib);
+ os_info.libraries[totaltups].dbnum = dbnum;
+
+ totaltups++;
+ }
+ PQclear(res);
+ }
+
+ pg_free(ress);
+
+ os_info.num_libraries = totaltups;
+}
+
+
+/*
+ * check_loadable_libraries()
+ *
+ * Check that the new cluster contains all required libraries.
+ * We do this by actually trying to LOAD each one, thereby testing
+ * compatibility as well as presence.
+ */
+void
+check_loadable_libraries(void)
+{
+ PGconn *conn = connectToServer(&new_cluster, "template1");
+ int libnum;
+ int was_load_failure = false;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for presence of required libraries");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir, "loadable_libraries.txt");
+
+ /*
+ * Now we want to sort the library names into order. This avoids multiple
+ * probes of the same library, and ensures that libraries are probed in a
+ * consistent order, which is important for reproducible behavior if one
+ * library depends on another.
+ */
+ qsort(os_info.libraries, os_info.num_libraries,
+ sizeof(LibraryInfo), library_name_compare);
+
+ for (libnum = 0; libnum < os_info.num_libraries; libnum++)
+ {
+ char *lib = os_info.libraries[libnum].name;
+ int llen = strlen(lib);
+ char cmd[7 + 2 * MAXPGPATH + 1];
+ PGresult *res;
+
+ /* Did the library name change? Probe it. */
+ if (libnum == 0 || strcmp(lib, os_info.libraries[libnum - 1].name) != 0)
+ {
+ strcpy(cmd, "LOAD '");
+ PQescapeStringConn(conn, cmd + strlen(cmd), lib, llen, NULL);
+ strcat(cmd, "'");
+
+ res = PQexec(conn, cmd);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ was_load_failure = true;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ fprintf(script, _("could not load library \"%s\": %s"),
+ lib,
+ PQerrorMessage(conn));
+ }
+ else
+ was_load_failure = false;
+
+ PQclear(res);
+ }
+
+ if (was_load_failure)
+ fprintf(script, _("In database: %s\n"),
+ old_cluster.dbarr.dbs[os_info.libraries[libnum].dbnum].db_name);
+ }
+
+ PQfinish(conn);
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation references loadable libraries that are missing from the\n"
+ "new installation. You can add these libraries to the new installation,\n"
+ "or remove the functions using them from the old installation. A list of\n"
+ "problem libraries is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c
new file mode 100644
index 0000000..a9988ab
--- /dev/null
+++ b/src/bin/pg_upgrade/info.c
@@ -0,0 +1,662 @@
+/*
+ * info.c
+ *
+ * information support functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/info.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map);
+static void report_unmatched_relation(const RelInfo *rel, const DbInfo *db,
+ bool is_new_db);
+static void free_db_and_rel_infos(DbInfoArr *db_arr);
+static void get_template0_info(ClusterInfo *cluster);
+static void get_db_infos(ClusterInfo *cluster);
+static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo);
+static void free_rel_infos(RelInfoArr *rel_arr);
+static void print_db_infos(DbInfoArr *db_arr);
+static void print_rel_infos(RelInfoArr *rel_arr);
+
+
+/*
+ * gen_db_file_maps()
+ *
+ * generates a database mapping from "old_db" to "new_db".
+ *
+ * Returns a malloc'ed array of mappings. The length of the array
+ * is returned into *nmaps.
+ */
+FileNameMap *
+gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
+ int *nmaps,
+ const char *old_pgdata, const char *new_pgdata)
+{
+ FileNameMap *maps;
+ int old_relnum,
+ new_relnum;
+ int num_maps = 0;
+ bool all_matched = true;
+
+ /* There will certainly not be more mappings than there are old rels */
+ maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
+ old_db->rel_arr.nrels);
+
+ /*
+ * Each of the RelInfo arrays should be sorted by OID. Scan through them
+ * and match them up. If we fail to match everything, we'll abort, but
+ * first print as much info as we can about mismatches.
+ */
+ old_relnum = new_relnum = 0;
+ while (old_relnum < old_db->rel_arr.nrels ||
+ new_relnum < new_db->rel_arr.nrels)
+ {
+ RelInfo *old_rel = (old_relnum < old_db->rel_arr.nrels) ?
+ &old_db->rel_arr.rels[old_relnum] : NULL;
+ RelInfo *new_rel = (new_relnum < new_db->rel_arr.nrels) ?
+ &new_db->rel_arr.rels[new_relnum] : NULL;
+
+ /* handle running off one array before the other */
+ if (!new_rel)
+ {
+ /*
+ * old_rel is unmatched. This should never happen, because we
+ * force new rels to have TOAST tables if the old one did.
+ */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ if (!old_rel)
+ {
+ /*
+ * new_rel is unmatched. This shouldn't really happen either, but
+ * if it's a TOAST table, we can ignore it and continue
+ * processing, assuming that the new server made a TOAST table
+ * that wasn't needed.
+ */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /* check for mismatched OID */
+ if (old_rel->reloid < new_rel->reloid)
+ {
+ /* old_rel is unmatched, see comment above */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ else if (old_rel->reloid > new_rel->reloid)
+ {
+ /* new_rel is unmatched, see comment above */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /*
+ * Verify that rels of same OID have same name. The namespace name
+ * should always match, but the relname might not match for TOAST
+ * tables (and, therefore, their indexes).
+ */
+ if (strcmp(old_rel->nspname, new_rel->nspname) != 0 ||
+ strcmp(old_rel->relname, new_rel->relname) != 0)
+ {
+ pg_log(PG_WARNING, "Relation names for OID %u in database \"%s\" do not match: "
+ "old name \"%s.%s\", new name \"%s.%s\"",
+ old_rel->reloid, old_db->db_name,
+ old_rel->nspname, old_rel->relname,
+ new_rel->nspname, new_rel->relname);
+ all_matched = false;
+ old_relnum++;
+ new_relnum++;
+ continue;
+ }
+
+ /* OK, create a mapping entry */
+ create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
+ old_rel, new_rel, maps + num_maps);
+ num_maps++;
+ old_relnum++;
+ new_relnum++;
+ }
+
+ if (!all_matched)
+ pg_fatal("Failed to match up old and new tables in database \"%s\"",
+ old_db->db_name);
+
+ *nmaps = num_maps;
+ return maps;
+}
+
+
+/*
+ * create_rel_filename_map()
+ *
+ * fills a file node map structure and returns it in "map".
+ */
+static void
+create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map)
+{
+ /* In case old/new tablespaces don't match, do them separately. */
+ if (strlen(old_rel->tablespace) == 0)
+ {
+ /*
+ * relation belongs to the default tablespace, hence relfiles should
+ * exist in the data directories.
+ */
+ map->old_tablespace = old_data;
+ map->old_tablespace_suffix = "/base";
+ }
+ else
+ {
+ /* relation belongs to a tablespace, so use the tablespace location */
+ map->old_tablespace = old_rel->tablespace;
+ map->old_tablespace_suffix = old_cluster.tablespace_suffix;
+ }
+
+ /* Do the same for new tablespaces */
+ if (strlen(new_rel->tablespace) == 0)
+ {
+ map->new_tablespace = new_data;
+ map->new_tablespace_suffix = "/base";
+ }
+ else
+ {
+ map->new_tablespace = new_rel->tablespace;
+ map->new_tablespace_suffix = new_cluster.tablespace_suffix;
+ }
+
+ /* DB oid and relfilenumbers are preserved between old and new cluster */
+ map->db_oid = old_db->db_oid;
+ map->relfilenumber = old_rel->relfilenumber;
+
+ /* used only for logging and error reporting, old/new are identical */
+ map->nspname = old_rel->nspname;
+ map->relname = old_rel->relname;
+}
+
+
+/*
+ * Complain about a relation we couldn't match to the other database,
+ * identifying it as best we can.
+ */
+static void
+report_unmatched_relation(const RelInfo *rel, const DbInfo *db, bool is_new_db)
+{
+ Oid reloid = rel->reloid; /* we might change rel below */
+ char reldesc[1000];
+ int i;
+
+ snprintf(reldesc, sizeof(reldesc), "\"%s.%s\"",
+ rel->nspname, rel->relname);
+ if (rel->indtable)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *hrel = &db->rel_arr.rels[i];
+
+ if (hrel->reloid == rel->indtable)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on \"%s.%s\""),
+ hrel->nspname, hrel->relname);
+ /* Shift attention to index's table for toast check */
+ rel = hrel;
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on OID %u"), rel->indtable);
+ }
+ if (rel->toastheap)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *brel = &db->rel_arr.rels[i];
+
+ if (brel->reloid == rel->toastheap)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for \"%s.%s\""),
+ brel->nspname, brel->relname);
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for OID %u"), rel->toastheap);
+ }
+
+ if (is_new_db)
+ pg_log(PG_WARNING, "No match found in old cluster for new relation with OID %u in database \"%s\": %s",
+ reloid, db->db_name, reldesc);
+ else
+ pg_log(PG_WARNING, "No match found in new cluster for old relation with OID %u in database \"%s\": %s",
+ reloid, db->db_name, reldesc);
+}
+
+/*
+ * get_db_and_rel_infos()
+ *
+ * higher level routine to generate dbinfos for the database running
+ * on the given "port". Assumes that server is already running.
+ */
+void
+get_db_and_rel_infos(ClusterInfo *cluster)
+{
+ int dbnum;
+
+ if (cluster->dbarr.dbs != NULL)
+ free_db_and_rel_infos(&cluster->dbarr);
+
+ get_template0_info(cluster);
+ get_db_infos(cluster);
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ get_rel_infos(cluster, &cluster->dbarr.dbs[dbnum]);
+
+ if (cluster == &old_cluster)
+ pg_log(PG_VERBOSE, "\nsource databases:");
+ else
+ pg_log(PG_VERBOSE, "\ntarget databases:");
+
+ if (log_opts.verbose)
+ print_db_infos(&cluster->dbarr);
+}
+
+
+/*
+ * Get information about template0, which will be copied from the old cluster
+ * to the new cluster.
+ */
+static void
+get_template0_info(ClusterInfo *cluster)
+{
+ PGconn *conn = connectToServer(cluster, "template1");
+ DbLocaleInfo *locale;
+ PGresult *dbres;
+ int i_datencoding;
+ int i_datlocprovider;
+ int i_datcollate;
+ int i_datctype;
+ int i_daticulocale;
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 1500)
+ dbres = executeQueryOrDie(conn,
+ "SELECT encoding, datlocprovider, "
+ " datcollate, datctype, daticulocale "
+ "FROM pg_catalog.pg_database "
+ "WHERE datname='template0'");
+ else
+ dbres = executeQueryOrDie(conn,
+ "SELECT encoding, 'c' AS datlocprovider, "
+ " datcollate, datctype, NULL AS daticulocale "
+ "FROM pg_catalog.pg_database "
+ "WHERE datname='template0'");
+
+
+ if (PQntuples(dbres) != 1)
+ pg_fatal("template0 not found");
+
+ locale = pg_malloc(sizeof(DbLocaleInfo));
+
+ i_datencoding = PQfnumber(dbres, "encoding");
+ i_datlocprovider = PQfnumber(dbres, "datlocprovider");
+ i_datcollate = PQfnumber(dbres, "datcollate");
+ i_datctype = PQfnumber(dbres, "datctype");
+ i_daticulocale = PQfnumber(dbres, "daticulocale");
+
+ locale->db_encoding = atoi(PQgetvalue(dbres, 0, i_datencoding));
+ locale->db_collprovider = PQgetvalue(dbres, 0, i_datlocprovider)[0];
+ locale->db_collate = pg_strdup(PQgetvalue(dbres, 0, i_datcollate));
+ locale->db_ctype = pg_strdup(PQgetvalue(dbres, 0, i_datctype));
+ if (PQgetisnull(dbres, 0, i_daticulocale))
+ locale->db_iculocale = NULL;
+ else
+ locale->db_iculocale = pg_strdup(PQgetvalue(dbres, 0, i_daticulocale));
+
+ cluster->template0 = locale;
+
+ PQclear(dbres);
+ PQfinish(conn);
+}
+
+
+/*
+ * get_db_infos()
+ *
+ * Scans pg_database system catalog and populates all user
+ * databases.
+ */
+static void
+get_db_infos(ClusterInfo *cluster)
+{
+ PGconn *conn = connectToServer(cluster, "template1");
+ PGresult *res;
+ int ntups;
+ int tupnum;
+ DbInfo *dbinfos;
+ int i_datname,
+ i_oid,
+ i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, ");
+ if (GET_MAJOR_VERSION(cluster->major_version) < 1500)
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "'c' AS datlocprovider, NULL AS daticulocale, ");
+ else
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "datlocprovider, daticulocale, ");
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
+ "FROM pg_catalog.pg_database d "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON d.dattablespace = t.oid "
+ "WHERE d.datallowconn = true "
+ "ORDER BY 1");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ i_oid = PQfnumber(res, "oid");
+ i_datname = PQfnumber(res, "datname");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ ntups = PQntuples(res);
+ dbinfos = (DbInfo *) pg_malloc(sizeof(DbInfo) * ntups);
+
+ for (tupnum = 0; tupnum < ntups; tupnum++)
+ {
+ dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid));
+ dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname));
+ snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s",
+ PQgetvalue(res, tupnum, i_spclocation));
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ cluster->dbarr.dbs = dbinfos;
+ cluster->dbarr.ndbs = ntups;
+}
+
+
+/*
+ * get_rel_infos()
+ *
+ * gets the relinfos for all the user tables and indexes of the database
+ * referred to by "dbinfo".
+ *
+ * Note: the resulting RelInfo array is assumed to be sorted by OID.
+ * This allows later processing to match up old and new databases efficiently.
+ */
+static void
+get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
+{
+ PGconn *conn = connectToServer(cluster,
+ dbinfo->db_name);
+ PGresult *res;
+ RelInfo *relinfos;
+ int ntups;
+ int relnum;
+ int num_rels = 0;
+ char *nspname = NULL;
+ char *relname = NULL;
+ char *tablespace = NULL;
+ int i_spclocation,
+ i_nspname,
+ i_relname,
+ i_reloid,
+ i_indtable,
+ i_toastheap,
+ i_relfilenumber,
+ i_reltablespace;
+ char query[QUERY_ALLOC];
+ char *last_namespace = NULL,
+ *last_tablespace = NULL;
+
+ query[0] = '\0'; /* initialize query string to empty */
+
+ /*
+ * Create a CTE that collects OIDs of regular user tables and matviews,
+ * but excluding toast tables and indexes. We assume that relations with
+ * OIDs >= FirstNormalObjectId belong to the user. (That's probably
+ * redundant with the namespace-name exclusions, but let's be safe.)
+ *
+ * pg_largeobject contains user data that does not appear in pg_dump
+ * output, so we have to copy that system table. It's easiest to do that
+ * by treating it as a user table.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "WITH regular_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.oid, 0::oid, 0::oid "
+ " FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ") AND "
+ /* exclude possible orphaned temp tables */
+ " ((n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ " n.nspname NOT IN ('pg_catalog', 'information_schema', "
+ " 'binary_upgrade', 'pg_toast') AND "
+ " c.oid >= %u::pg_catalog.oid) OR "
+ " (n.nspname = 'pg_catalog' AND "
+ " relname IN ('pg_largeobject') ))), ",
+ FirstNormalObjectId);
+
+ /*
+ * Add a CTE that collects OIDs of toast tables belonging to the tables
+ * selected by the regular_heap CTE. (We have to do this separately
+ * because the namespace-name rules above don't work for toast tables.)
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " toast_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.reltoastrelid, 0::oid, c.oid "
+ " FROM regular_heap JOIN pg_catalog.pg_class c "
+ " ON regular_heap.reloid = c.oid "
+ " WHERE c.reltoastrelid != 0), ");
+
+ /*
+ * Add a CTE that collects OIDs of all valid indexes on the previously
+ * selected tables. We can ignore invalid indexes since pg_dump does.
+ * Testing indisready is necessary in 9.2, and harmless in earlier/later
+ * versions.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " all_index (reloid, indtable, toastheap) AS ( "
+ " SELECT indexrelid, indrelid, 0::oid "
+ " FROM pg_catalog.pg_index "
+ " WHERE indisvalid AND indisready "
+ " AND indrelid IN "
+ " (SELECT reloid FROM regular_heap "
+ " UNION ALL "
+ " SELECT reloid FROM toast_heap)) ");
+
+ /*
+ * And now we can write the query that retrieves the data we want for each
+ * heap and index relation. Make sure result is sorted by OID.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "SELECT all_rels.*, n.nspname, c.relname, "
+ " c.relfilenode, c.reltablespace, "
+ " pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
+ "FROM (SELECT * FROM regular_heap "
+ " UNION ALL "
+ " SELECT * FROM toast_heap "
+ " UNION ALL "
+ " SELECT * FROM all_index) all_rels "
+ " JOIN pg_catalog.pg_class c "
+ " ON all_rels.reloid = c.oid "
+ " JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON c.reltablespace = t.oid "
+ "ORDER BY 1;");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ ntups = PQntuples(res);
+
+ relinfos = (RelInfo *) pg_malloc(sizeof(RelInfo) * ntups);
+
+ i_reloid = PQfnumber(res, "reloid");
+ i_indtable = PQfnumber(res, "indtable");
+ i_toastheap = PQfnumber(res, "toastheap");
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_relfilenumber = PQfnumber(res, "relfilenode");
+ i_reltablespace = PQfnumber(res, "reltablespace");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (relnum = 0; relnum < ntups; relnum++)
+ {
+ RelInfo *curr = &relinfos[num_rels++];
+
+ curr->reloid = atooid(PQgetvalue(res, relnum, i_reloid));
+ curr->indtable = atooid(PQgetvalue(res, relnum, i_indtable));
+ curr->toastheap = atooid(PQgetvalue(res, relnum, i_toastheap));
+
+ nspname = PQgetvalue(res, relnum, i_nspname);
+ curr->nsp_alloc = false;
+
+ /*
+ * Many of the namespace and tablespace strings are identical, so we
+ * try to reuse the allocated string pointers where possible to reduce
+ * memory consumption.
+ */
+ /* Can we reuse the previous string allocation? */
+ if (last_namespace && strcmp(nspname, last_namespace) == 0)
+ curr->nspname = last_namespace;
+ else
+ {
+ last_namespace = curr->nspname = pg_strdup(nspname);
+ curr->nsp_alloc = true;
+ }
+
+ relname = PQgetvalue(res, relnum, i_relname);
+ curr->relname = pg_strdup(relname);
+
+ curr->relfilenumber = atooid(PQgetvalue(res, relnum, i_relfilenumber));
+ curr->tblsp_alloc = false;
+
+ /* Is the tablespace oid non-default? */
+ if (atooid(PQgetvalue(res, relnum, i_reltablespace)) != 0)
+ {
+ /*
+ * The tablespace location might be "", meaning the cluster
+ * default location, i.e. pg_default or pg_global.
+ */
+ tablespace = PQgetvalue(res, relnum, i_spclocation);
+
+ /* Can we reuse the previous string allocation? */
+ if (last_tablespace && strcmp(tablespace, last_tablespace) == 0)
+ curr->tablespace = last_tablespace;
+ else
+ {
+ last_tablespace = curr->tablespace = pg_strdup(tablespace);
+ curr->tblsp_alloc = true;
+ }
+ }
+ else
+ /* A zero reltablespace oid indicates the database tablespace. */
+ curr->tablespace = dbinfo->db_tablespace;
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ dbinfo->rel_arr.rels = relinfos;
+ dbinfo->rel_arr.nrels = num_rels;
+}
+
+
+static void
+free_db_and_rel_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ free_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ pg_free(db_arr->dbs[dbnum].db_name);
+ }
+ pg_free(db_arr->dbs);
+ db_arr->dbs = NULL;
+ db_arr->ndbs = 0;
+}
+
+
+static void
+free_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ {
+ if (rel_arr->rels[relnum].nsp_alloc)
+ pg_free(rel_arr->rels[relnum].nspname);
+ pg_free(rel_arr->rels[relnum].relname);
+ if (rel_arr->rels[relnum].tblsp_alloc)
+ pg_free(rel_arr->rels[relnum].tablespace);
+ }
+ pg_free(rel_arr->rels);
+ rel_arr->nrels = 0;
+}
+
+
+static void
+print_db_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ pg_log(PG_VERBOSE, "Database: %s", db_arr->dbs[dbnum].db_name);
+ print_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ }
+}
+
+
+static void
+print_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s",
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname,
+ rel_arr->rels[relnum].reloid,
+ rel_arr->rels[relnum].tablespace);
+}
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 0000000..12a97f8
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,50 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_upgrade_sources = files(
+ 'check.c',
+ 'controldata.c',
+ 'dump.c',
+ 'exec.c',
+ 'file.c',
+ 'function.c',
+ 'info.c',
+ 'option.c',
+ 'parallel.c',
+ 'pg_upgrade.c',
+ 'relfilenumber.c',
+ 'server.c',
+ 'tablespace.c',
+ 'util.c',
+ 'version.c',
+)
+
+if host_system == 'windows'
+ pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_upgrade',
+ '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
+pg_upgrade = executable('pg_upgrade',
+ pg_upgrade_sources,
+ c_pch: pch_postgres_fe_h,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_upgrade
+
+
+tests += {
+ 'name': 'pg_upgrade',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_pg_upgrade.pl',
+ ],
+ 'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk
new file mode 100644
index 0000000..9e2c138
--- /dev/null
+++ b/src/bin/pg_upgrade/nls.mk
@@ -0,0 +1,24 @@
+# src/bin/pg_upgrade/nls.mk
+CATALOG_NAME = pg_upgrade
+GETTEXT_FILES = check.c \
+ controldata.c \
+ dump.c \
+ exec.c \
+ file.c \
+ function.c \
+ info.c \
+ option.c \
+ parallel.c \
+ pg_upgrade.c \
+ relfilenumber.c \
+ server.c \
+ tablespace.c \
+ util.c \
+ version.c
+GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status prep_status_progress report_status:2
+GETTEXT_FLAGS = \
+ pg_fatal:1:c-format \
+ pg_log:2:c-format \
+ prep_status:1:c-format \
+ prep_status_progress:1:c-format \
+ report_status:2:c-format
diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c
new file mode 100644
index 0000000..6403610
--- /dev/null
+++ b/src/bin/pg_upgrade/option.c
@@ -0,0 +1,507 @@
+/*
+ * option.c
+ *
+ * options functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/option.c
+ */
+
+#include "postgres_fe.h"
+
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "common/string.h"
+#include "getopt_long.h"
+#include "pg_upgrade.h"
+#include "utils/pidfile.h"
+
+static void usage(void);
+static void check_required_directory(char **dirpath,
+ const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk);
+#define FIX_DEFAULT_READ_ONLY "-c default_transaction_read_only=false"
+
+
+UserOpts user_opts;
+
+
+/*
+ * parseCommandLine()
+ *
+ * Parses the command line (argc, argv[]) and loads structures
+ */
+void
+parseCommandLine(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"old-datadir", required_argument, NULL, 'd'},
+ {"new-datadir", required_argument, NULL, 'D'},
+ {"old-bindir", required_argument, NULL, 'b'},
+ {"new-bindir", required_argument, NULL, 'B'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"old-options", required_argument, NULL, 'o'},
+ {"new-options", required_argument, NULL, 'O'},
+ {"old-port", required_argument, NULL, 'p'},
+ {"new-port", required_argument, NULL, 'P'},
+
+ {"username", required_argument, NULL, 'U'},
+ {"check", no_argument, NULL, 'c'},
+ {"link", no_argument, NULL, 'k'},
+ {"retain", no_argument, NULL, 'r'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"socketdir", required_argument, NULL, 's'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"clone", no_argument, NULL, 1},
+ {"copy", no_argument, NULL, 2},
+
+ {NULL, 0, NULL, 0}
+ };
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ int os_user_effective_id;
+
+ user_opts.do_sync = true;
+ user_opts.transfer_mode = TRANSFER_MODE_COPY;
+
+ os_info.progname = get_progname(argv[0]);
+
+ /* Process libpq env. variables; load values here for usage() output */
+ old_cluster.port = getenv("PGPORTOLD") ? atoi(getenv("PGPORTOLD")) : DEF_PGUPORT;
+ new_cluster.port = getenv("PGPORTNEW") ? atoi(getenv("PGPORTNEW")) : DEF_PGUPORT;
+
+ os_user_effective_id = get_user_info(&os_info.user);
+ /* we override just the database user name; we got the OS id above */
+ if (getenv("PGUSER"))
+ {
+ pg_free(os_info.user);
+ /* must save value, getenv()'s pointer is not stable */
+ os_info.user = pg_strdup(getenv("PGUSER"));
+ }
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_upgrade (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /* Allow help and version to be run as root, so do the test here. */
+ if (os_user_effective_id == 0)
+ pg_fatal("%s: cannot be run as root", os_info.progname);
+
+ while ((option = getopt_long(argc, argv, "b:B:cd:D:j:kNo:O:p:P:rs:U:v",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'b':
+ old_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'B':
+ new_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'c':
+ user_opts.check = true;
+ break;
+
+ case 'd':
+ old_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'D':
+ new_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'j':
+ user_opts.jobs = atoi(optarg);
+ break;
+
+ case 'k':
+ user_opts.transfer_mode = TRANSFER_MODE_LINK;
+ break;
+
+ case 'N':
+ user_opts.do_sync = false;
+ break;
+
+ case 'o':
+ /* append option? */
+ if (!old_cluster.pgopts)
+ old_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *old_pgopts = old_cluster.pgopts;
+
+ old_cluster.pgopts = psprintf("%s %s", old_pgopts, optarg);
+ free(old_pgopts);
+ }
+ break;
+
+ case 'O':
+ /* append option? */
+ if (!new_cluster.pgopts)
+ new_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *new_pgopts = new_cluster.pgopts;
+
+ new_cluster.pgopts = psprintf("%s %s", new_pgopts, optarg);
+ free(new_pgopts);
+ }
+ break;
+
+ case 'p':
+ if ((old_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid old port number");
+ break;
+
+ case 'P':
+ if ((new_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid new port number");
+ break;
+
+ case 'r':
+ log_opts.retain = true;
+ break;
+
+ case 's':
+ user_opts.socketdir = pg_strdup(optarg);
+ break;
+
+ case 'U':
+ pg_free(os_info.user);
+ os_info.user = pg_strdup(optarg);
+ os_info.user_specified = true;
+ break;
+
+ case 'v':
+ log_opts.verbose = true;
+ break;
+
+ case 1:
+ user_opts.transfer_mode = TRANSFER_MODE_CLONE;
+ break;
+
+ case 2:
+ user_opts.transfer_mode = TRANSFER_MODE_COPY;
+ break;
+
+ default:
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ os_info.progname);
+ exit(1);
+ }
+ }
+
+ if (optind < argc)
+ pg_fatal("too many command-line arguments (first is \"%s\")", argv[optind]);
+
+ if (log_opts.verbose)
+ pg_log(PG_REPORT, "Running in verbose mode");
+
+ log_opts.isatty = isatty(fileno(stdout));
+
+ /* Turn off read-only mode; add prefix to PGOPTIONS? */
+ if (getenv("PGOPTIONS"))
+ {
+ char *pgoptions = psprintf("%s %s", FIX_DEFAULT_READ_ONLY,
+ getenv("PGOPTIONS"));
+
+ setenv("PGOPTIONS", pgoptions, 1);
+ pfree(pgoptions);
+ }
+ else
+ setenv("PGOPTIONS", FIX_DEFAULT_READ_ONLY, 1);
+
+ /* Get values from env if not already set */
+ check_required_directory(&old_cluster.bindir, "PGBINOLD", false,
+ "-b", _("old cluster binaries reside"), false);
+ check_required_directory(&new_cluster.bindir, "PGBINNEW", false,
+ "-B", _("new cluster binaries reside"), true);
+ check_required_directory(&old_cluster.pgdata, "PGDATAOLD", false,
+ "-d", _("old cluster data resides"), false);
+ check_required_directory(&new_cluster.pgdata, "PGDATANEW", false,
+ "-D", _("new cluster data resides"), false);
+ check_required_directory(&user_opts.socketdir, "PGSOCKETDIR", true,
+ "-s", _("sockets will be created"), false);
+
+#ifdef WIN32
+
+ /*
+ * On Windows, initdb --sync-only will fail with a "Permission denied"
+ * error on file pg_upgrade_utility.log if pg_upgrade is run inside the
+ * new cluster directory, so we do a check here.
+ */
+ {
+ char cwd[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory");
+ canonicalize_path(cwd);
+ if (path_is_prefix_of_path(new_cluster_pgdata, cwd))
+ pg_fatal("cannot run pg_upgrade from inside the new cluster data directory on Windows");
+ }
+#endif
+}
+
+
+static void
+usage(void)
+{
+ printf(_("pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"));
+ printf(_("Usage:\n"));
+ printf(_(" pg_upgrade [OPTION]...\n\n"));
+ printf(_("Options:\n"));
+ printf(_(" -b, --old-bindir=BINDIR old cluster executable directory\n"));
+ printf(_(" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+ " same directory as pg_upgrade)\n"));
+ printf(_(" -c, --check check clusters only, don't change any data\n"));
+ printf(_(" -d, --old-datadir=DATADIR old cluster data directory\n"));
+ printf(_(" -D, --new-datadir=DATADIR new cluster data directory\n"));
+ printf(_(" -j, --jobs=NUM number of simultaneous processes or threads to use\n"));
+ printf(_(" -k, --link link instead of copying files to new cluster\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -o, --old-options=OPTIONS old cluster options to pass to the server\n"));
+ printf(_(" -O, --new-options=OPTIONS new cluster options to pass to the server\n"));
+ printf(_(" -p, --old-port=PORT old cluster port number (default %d)\n"), old_cluster.port);
+ printf(_(" -P, --new-port=PORT new cluster port number (default %d)\n"), new_cluster.port);
+ printf(_(" -r, --retain retain SQL and log files after success\n"));
+ printf(_(" -s, --socketdir=DIR socket directory to use (default current dir.)\n"));
+ printf(_(" -U, --username=NAME cluster superuser (default \"%s\")\n"), os_info.user);
+ printf(_(" -v, --verbose enable verbose internal logging\n"));
+ printf(_(" -V, --version display version information, then exit\n"));
+ printf(_(" --clone clone instead of copying files to new cluster\n"));
+ printf(_(" --copy copy files to new cluster (default)\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\n"
+ "Before running pg_upgrade you must:\n"
+ " create a new database cluster (using the new version of initdb)\n"
+ " shutdown the postmaster servicing the old cluster\n"
+ " shutdown the postmaster servicing the new cluster\n"));
+ printf(_("\n"
+ "When you run pg_upgrade, you must provide the following information:\n"
+ " the data directory for the old cluster (-d DATADIR)\n"
+ " the data directory for the new cluster (-D DATADIR)\n"
+ " the \"bin\" directory for the old version (-b BINDIR)\n"
+ " the \"bin\" directory for the new version (-B BINDIR)\n"));
+ printf(_("\n"
+ "For example:\n"
+ " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+ "or\n"));
+#ifndef WIN32
+ printf(_(" $ export PGDATAOLD=oldCluster/data\n"
+ " $ export PGDATANEW=newCluster/data\n"
+ " $ export PGBINOLD=oldCluster/bin\n"
+ " $ export PGBINNEW=newCluster/bin\n"
+ " $ pg_upgrade\n"));
+#else
+ printf(_(" C:\\> set PGDATAOLD=oldCluster/data\n"
+ " C:\\> set PGDATANEW=newCluster/data\n"
+ " C:\\> set PGBINOLD=oldCluster/bin\n"
+ " C:\\> set PGBINNEW=newCluster/bin\n"
+ " C:\\> pg_upgrade\n"));
+#endif
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * check_required_directory()
+ *
+ * Checks a directory option.
+ * dirpath - the directory name supplied on the command line, or NULL
+ * envVarName - the name of an environment variable to get if dirpath is NULL
+ * useCwd - true if OK to default to CWD
+ * cmdLineOption - the command line option for this directory
+ * description - a description of this directory option
+ * missingOk - true if OK that both dirpath and envVarName are not existing
+ *
+ * We use the last two arguments to construct a meaningful error message if the
+ * user hasn't provided the required directory name.
+ */
+static void
+check_required_directory(char **dirpath, const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk)
+{
+ if (*dirpath == NULL || strlen(*dirpath) == 0)
+ {
+ const char *envVar;
+
+ if ((envVar = getenv(envVarName)) && strlen(envVar))
+ *dirpath = pg_strdup(envVar);
+ else if (useCwd)
+ {
+ char cwd[MAXPGPATH];
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory");
+ *dirpath = pg_strdup(cwd);
+ }
+ else if (missingOk)
+ return;
+ else
+ pg_fatal("You must identify the directory where the %s.\n"
+ "Please use the %s command-line option or the %s environment variable.",
+ description, cmdLineOption, envVarName);
+ }
+
+ /*
+ * Clean up the path, in particular trimming any trailing path separators,
+ * because we construct paths by appending to this path.
+ */
+ canonicalize_path(*dirpath);
+}
+
+/*
+ * adjust_data_dir
+ *
+ * If a configuration-only directory was specified, find the real data dir
+ * by querying the running server. This has limited checking because we
+ * can't check for a running server because we can't find postmaster.pid.
+ *
+ * On entry, cluster->pgdata has been set from command line or env variable,
+ * but cluster->pgconfig isn't set. We fill both variables with corrected
+ * values.
+ */
+void
+adjust_data_dir(ClusterInfo *cluster)
+{
+ char filename[MAXPGPATH];
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *fp,
+ *output;
+ int rc;
+
+ /* Initially assume config dir and data dir are the same */
+ cluster->pgconfig = pg_strdup(cluster->pgdata);
+
+ /* If there is no postgresql.conf, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/postgresql.conf", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) == NULL)
+ return;
+ fclose(fp);
+
+ /* If PG_VERSION exists, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/PG_VERSION", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) != NULL)
+ {
+ fclose(fp);
+ return;
+ }
+
+ /* Must be a configuration directory, so find the real data directory. */
+
+ if (cluster == &old_cluster)
+ prep_status("Finding the real data directory for the source cluster");
+ else
+ prep_status("Finding the real data directory for the target cluster");
+
+ /*
+ * We don't have a data directory yet, so we can't check the PG version,
+ * so this might fail --- only works for PG 9.2+. If this fails,
+ * pg_upgrade will fail anyway because the data files will not be found.
+ */
+ snprintf(cmd, sizeof(cmd), "\"%s/postgres\" -D \"%s\" -C data_directory",
+ cluster->bindir, cluster->pgconfig);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get data directory using %s: %s",
+ cmd, strerror(errno));
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get data directory using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(cmd_output);
+
+ cluster->pgdata = pg_strdup(cmd_output);
+
+ check_ok();
+}
+
+
+/*
+ * get_sock_dir
+ *
+ * Identify the socket directory to use for this cluster. If we're doing
+ * a live check (old cluster only), we need to find out where the postmaster
+ * is listening. Otherwise, we're going to put the socket into the current
+ * directory.
+ */
+void
+get_sock_dir(ClusterInfo *cluster, bool live_check)
+{
+#if !defined(WIN32)
+ if (!live_check)
+ cluster->sockdir = user_opts.socketdir;
+ else
+ {
+ /*
+ * If we are doing a live check, we will use the old cluster's Unix
+ * domain socket directory so we can connect to the live server.
+ */
+ unsigned short orig_port = cluster->port;
+ char filename[MAXPGPATH],
+ line[MAXPGPATH];
+ FILE *fp;
+ int lineno;
+
+ snprintf(filename, sizeof(filename), "%s/postmaster.pid",
+ cluster->pgdata);
+ if ((fp = fopen(filename, "r")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ filename, strerror(errno));
+
+ for (lineno = 1;
+ lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
+ lineno++)
+ {
+ if (fgets(line, sizeof(line), fp) == NULL)
+ pg_fatal("could not read line %d from file \"%s\": %s",
+ lineno, filename, strerror(errno));
+
+ /* potentially overwrite user-supplied value */
+ if (lineno == LOCK_FILE_LINE_PORT)
+ sscanf(line, "%hu", &old_cluster.port);
+ if (lineno == LOCK_FILE_LINE_SOCKET_DIR)
+ {
+ /* strip trailing newline and carriage return */
+ cluster->sockdir = pg_strdup(line);
+ (void) pg_strip_crlf(cluster->sockdir);
+ }
+ }
+ fclose(fp);
+
+ /* warn of port number correction */
+ if (orig_port != DEF_PGUPORT && old_cluster.port != orig_port)
+ pg_log(PG_WARNING, "user-supplied old port number %hu corrected to %hu",
+ orig_port, cluster->port);
+ }
+#else /* WIN32 */
+ cluster->sockdir = NULL;
+#endif
+}
diff --git a/src/bin/pg_upgrade/parallel.c b/src/bin/pg_upgrade/parallel.c
new file mode 100644
index 0000000..eaf0f0a
--- /dev/null
+++ b/src/bin/pg_upgrade/parallel.c
@@ -0,0 +1,341 @@
+/*
+ * parallel.c
+ *
+ * multi-process support
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/parallel.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/wait.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "pg_upgrade.h"
+
+static int parallel_jobs;
+
+#ifdef WIN32
+/*
+ * Array holding all active threads. There can't be any gaps/zeros so
+ * it can be passed to WaitForMultipleObjects(). We use two arrays
+ * so the thread_handles array can be passed to WaitForMultipleObjects().
+ */
+HANDLE *thread_handles;
+
+typedef struct
+{
+ char *log_file;
+ char *opt_log_file;
+ char *cmd;
+} exec_thread_arg;
+
+typedef struct
+{
+ DbInfoArr *old_db_arr;
+ DbInfoArr *new_db_arr;
+ char *old_pgdata;
+ char *new_pgdata;
+ char *old_tablespace;
+} transfer_thread_arg;
+
+exec_thread_arg **exec_thread_args;
+transfer_thread_arg **transfer_thread_args;
+
+/* track current thread_args struct so reap_child() can be used for all cases */
+void **cur_thread_args;
+
+DWORD win32_exec_prog(exec_thread_arg *args);
+DWORD win32_transfer_all_new_dbs(transfer_thread_arg *args);
+#endif
+
+/*
+ * parallel_exec_prog
+ *
+ * This has the same API as exec_prog, except it does parallel execution,
+ * and therefore must throw errors and doesn't return an error status.
+ */
+void
+parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...)
+{
+ va_list args;
+ char cmd[MAX_STRING];
+
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ exec_thread_arg *new_arg;
+#endif
+
+ va_start(args, fmt);
+ vsnprintf(cmd, sizeof(cmd), fmt, args);
+ va_end(args);
+
+ if (user_opts.jobs <= 1)
+ /* exit_on_error must be true to allow jobs */
+ exec_prog(log_file, opt_log_file, true, true, "%s", cmd);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (exec_thread_args == NULL)
+ {
+ int i;
+
+ exec_thread_args = pg_malloc(user_opts.jobs * sizeof(exec_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ exec_thread_args[i] = pg_malloc0(sizeof(exec_thread_arg));
+ }
+
+ cur_thread_args = (void **) exec_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ /* use _exit to skip atexit() functions */
+ _exit(!exec_prog(log_file, opt_log_file, true, true, "%s", cmd));
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = exec_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ pg_free(new_arg->log_file);
+ new_arg->log_file = pg_strdup(log_file);
+ pg_free(new_arg->opt_log_file);
+ new_arg->opt_log_file = opt_log_file ? pg_strdup(opt_log_file) : NULL;
+ pg_free(new_arg->cmd);
+ new_arg->cmd = pg_strdup(cmd);
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_exec_prog,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_exec_prog(exec_thread_arg *args)
+{
+ int ret;
+
+ ret = !exec_prog(args->log_file, args->opt_log_file, true, true, "%s", args->cmd);
+
+ /* terminates thread */
+ return ret;
+}
+#endif
+
+
+/*
+ * parallel_transfer_all_new_dbs
+ *
+ * This has the same API as transfer_all_new_dbs, except it does parallel execution
+ * by transferring multiple tablespaces in parallel
+ */
+void
+parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace)
+{
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ transfer_thread_arg *new_arg;
+#endif
+
+ if (user_opts.jobs <= 1)
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata, NULL);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (transfer_thread_args == NULL)
+ {
+ int i;
+
+ transfer_thread_args = pg_malloc(user_opts.jobs * sizeof(transfer_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ transfer_thread_args[i] = pg_malloc0(sizeof(transfer_thread_arg));
+ }
+
+ cur_thread_args = (void **) transfer_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ {
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata,
+ old_tablespace);
+ /* if we take another exit path, it will be non-zero */
+ /* use _exit to skip atexit() functions */
+ _exit(0);
+ }
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = transfer_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ new_arg->old_db_arr = old_db_arr;
+ new_arg->new_db_arr = new_db_arr;
+ pg_free(new_arg->old_pgdata);
+ new_arg->old_pgdata = pg_strdup(old_pgdata);
+ pg_free(new_arg->new_pgdata);
+ new_arg->new_pgdata = pg_strdup(new_pgdata);
+ pg_free(new_arg->old_tablespace);
+ new_arg->old_tablespace = old_tablespace ? pg_strdup(old_tablespace) : NULL;
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_transfer_all_new_dbs,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_transfer_all_new_dbs(transfer_thread_arg *args)
+{
+ transfer_all_new_dbs(args->old_db_arr, args->new_db_arr, args->old_pgdata,
+ args->new_pgdata, args->old_tablespace);
+
+ /* terminates thread */
+ return 0;
+}
+#endif
+
+
+/*
+ * collect status from a completed worker child
+ */
+bool
+reap_child(bool wait_for_child)
+{
+#ifndef WIN32
+ int work_status;
+ pid_t child;
+#else
+ int thread_num;
+ DWORD res;
+#endif
+
+ if (user_opts.jobs <= 1 || parallel_jobs == 0)
+ return false;
+
+#ifndef WIN32
+ child = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG);
+ if (child == (pid_t) -1)
+ pg_fatal("%s() failed: %s", "waitpid", strerror(errno));
+ if (child == 0)
+ return false; /* no children, or no dead children */
+ if (work_status != 0)
+ pg_fatal("child process exited abnormally: status %d", work_status);
+#else
+ /* wait for one to finish */
+ thread_num = WaitForMultipleObjects(parallel_jobs, thread_handles,
+ false, wait_for_child ? INFINITE : 0);
+
+ if (thread_num == WAIT_TIMEOUT || thread_num == WAIT_FAILED)
+ return false;
+
+ /* compute thread index in active_threads */
+ thread_num -= WAIT_OBJECT_0;
+
+ /* get the result */
+ GetExitCodeThread(thread_handles[thread_num], &res);
+ if (res != 0)
+ pg_fatal("child worker exited abnormally: %s", strerror(errno));
+
+ /* dispose of handle to stop leaks */
+ CloseHandle(thread_handles[thread_num]);
+
+ /* Move last slot into dead child's position */
+ if (thread_num != parallel_jobs - 1)
+ {
+ void *tmp_args;
+
+ thread_handles[thread_num] = thread_handles[parallel_jobs - 1];
+
+ /*
+ * Move last active thread arg struct into the now-dead slot, and the
+ * now-dead slot to the end for reuse by the next thread. Though the
+ * thread struct is in use by another thread, we can safely swap the
+ * struct pointers within the array.
+ */
+ tmp_args = cur_thread_args[thread_num];
+ cur_thread_args[thread_num] = cur_thread_args[parallel_jobs - 1];
+ cur_thread_args[parallel_jobs - 1] = tmp_args;
+ }
+#endif
+
+ /* do this after job has been removed */
+ parallel_jobs--;
+
+ return true;
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
new file mode 100644
index 0000000..4562daf
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -0,0 +1,862 @@
+/*
+ * pg_upgrade.c
+ *
+ * main source file
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.c
+ */
+
+/*
+ * To simplify the upgrade process, we force certain system values to be
+ * identical between old and new clusters:
+ *
+ * We control all assignments of pg_class.oid (and relfilenode) so toast
+ * oids are the same between old and new clusters. This is important
+ * because toast oids are stored as toast pointers in user tables.
+ *
+ * While pg_class.oid and pg_class.relfilenode are initially the same in a
+ * cluster, they can diverge due to CLUSTER, REINDEX, or VACUUM FULL. We
+ * control assignments of pg_class.relfilenode because we want the filenames
+ * to match between the old and new cluster.
+ *
+ * We control assignment of pg_tablespace.oid because we want the oid to match
+ * between the old and new cluster.
+ *
+ * We control all assignments of pg_type.oid because these oids are stored
+ * in user composite type values.
+ *
+ * We control all assignments of pg_enum.oid because these oids are stored
+ * in user tables as enum values.
+ *
+ * We control all assignments of pg_authid.oid for historical reasons (the
+ * oids used to be stored in pg_largeobject_metadata, which is now copied via
+ * SQL commands), that might change at some point in the future.
+ */
+
+
+
+#include "postgres_fe.h"
+
+#include <time.h>
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+#include "catalog/pg_class_d.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/restricted_token.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+static void set_locale_and_encoding(void);
+static void prepare_new_cluster(void);
+static void prepare_new_globals(void);
+static void create_new_objects(void);
+static void copy_xact_xlog_xid(void);
+static void set_frozenxids(bool minmxid_only);
+static void make_outputdirs(char *pgdata);
+static void setup(char *argv0, bool *live_check);
+
+ClusterInfo old_cluster,
+ new_cluster;
+OSInfo os_info;
+
+char *output_files[] = {
+ SERVER_LOG_FILE,
+#ifdef WIN32
+ /* unique file for pg_ctl start */
+ SERVER_START_LOG_FILE,
+#endif
+ UTILITY_LOG_FILE,
+ INTERNAL_LOG_FILE,
+ NULL
+};
+
+
+int
+main(int argc, char **argv)
+{
+ char *deletion_script_file_name = NULL;
+ bool live_check = false;
+
+ /*
+ * pg_upgrade doesn't currently use common/logging.c, but initialize it
+ * anyway because we might call common code that does.
+ */
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade"));
+
+ /* Set default restrictive mask until new cluster permissions are read */
+ umask(PG_MODE_MASK_OWNER);
+
+ parseCommandLine(argc, argv);
+
+ get_restricted_token();
+
+ adjust_data_dir(&old_cluster);
+ adjust_data_dir(&new_cluster);
+
+ /*
+ * Set mask based on PGDATA permissions, needed for the creation of the
+ * output directories with correct permissions.
+ */
+ if (!GetDataDirectoryCreatePerm(new_cluster.pgdata))
+ pg_fatal("could not read permissions of directory \"%s\": %s",
+ new_cluster.pgdata, strerror(errno));
+
+ umask(pg_mode_mask);
+
+ /*
+ * This needs to happen after adjusting the data directory of the new
+ * cluster in adjust_data_dir().
+ */
+ make_outputdirs(new_cluster.pgdata);
+
+ setup(argv[0], &live_check);
+
+ output_check_banner(live_check);
+
+ check_cluster_versions();
+
+ get_sock_dir(&old_cluster, live_check);
+ get_sock_dir(&new_cluster, false);
+
+ check_cluster_compatibility(live_check);
+
+ check_and_dump_old_cluster(live_check);
+
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ check_new_cluster();
+ report_clusters_compatible();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Performing Upgrade\n"
+ "------------------");
+
+ set_locale_and_encoding();
+
+ prepare_new_cluster();
+
+ stop_postmaster(false);
+
+ /*
+ * Destructive Changes to New Cluster
+ */
+
+ copy_xact_xlog_xid();
+
+ /* New now using xids of the old system */
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ prepare_new_globals();
+
+ create_new_objects();
+
+ stop_postmaster(false);
+
+ /*
+ * Most failures happen in create_new_objects(), which has completed at
+ * this point. We do this here because it is just before linking, which
+ * will link the old and new cluster data files, preventing the old
+ * cluster from being safely started once the new cluster is started.
+ */
+ if (user_opts.transfer_mode == TRANSFER_MODE_LINK)
+ disable_old_cluster();
+
+ transfer_all_new_tablespaces(&old_cluster.dbarr, &new_cluster.dbarr,
+ old_cluster.pgdata, new_cluster.pgdata);
+
+ /*
+ * Assuming OIDs are only used in system tables, there is no need to
+ * restore the OID counter because we have not transferred any OIDs from
+ * the old system, but we do it anyway just in case. We do it late here
+ * because there is no need to have the schema load use new oids.
+ */
+ prep_status("Setting next OID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -o %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtoid,
+ new_cluster.pgdata);
+ check_ok();
+
+ if (user_opts.do_sync)
+ {
+ prep_status("Sync data directory to disk");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ create_script_for_old_cluster_deletion(&deletion_script_file_name);
+
+ issue_warnings_and_set_wal_level();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Upgrade Complete\n"
+ "----------------");
+
+ output_completion_banner(deletion_script_file_name);
+
+ pg_free(deletion_script_file_name);
+
+ cleanup_output_dirs();
+
+ return 0;
+}
+
+/*
+ * Create and assign proper permissions to the set of output directories
+ * used to store any data generated internally, filling in log_opts in
+ * the process.
+ */
+static void
+make_outputdirs(char *pgdata)
+{
+ FILE *fp;
+ char **filename;
+ time_t run_time = time(NULL);
+ char filename_path[MAXPGPATH];
+ char timebuf[128];
+ struct timeval time;
+ time_t tt;
+ int len;
+
+ log_opts.rootdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.rootdir, MAXPGPATH, "%s/%s", pgdata, BASE_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /* BASE_OUTPUTDIR/$timestamp/ */
+ gettimeofday(&time, NULL);
+ tt = (time_t) time.tv_sec;
+ strftime(timebuf, sizeof(timebuf), "%Y%m%dT%H%M%S", localtime(&tt));
+ /* append milliseconds */
+ snprintf(timebuf + strlen(timebuf), sizeof(timebuf) - strlen(timebuf),
+ ".%03d", (int) (time.tv_usec / 1000));
+ log_opts.basedir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.basedir, MAXPGPATH, "%s/%s", log_opts.rootdir,
+ timebuf);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /* BASE_OUTPUTDIR/$timestamp/dump/ */
+ log_opts.dumpdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.dumpdir, MAXPGPATH, "%s/%s/%s", log_opts.rootdir,
+ timebuf, DUMP_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /* BASE_OUTPUTDIR/$timestamp/log/ */
+ log_opts.logdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.logdir, MAXPGPATH, "%s/%s/%s", log_opts.rootdir,
+ timebuf, LOG_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /*
+ * Ignore the error case where the root path exists, as it is kept the
+ * same across runs.
+ */
+ if (mkdir(log_opts.rootdir, pg_dir_create_mode) < 0 && errno != EEXIST)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.rootdir);
+ if (mkdir(log_opts.basedir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.basedir);
+ if (mkdir(log_opts.dumpdir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.dumpdir);
+ if (mkdir(log_opts.logdir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.logdir);
+
+ len = snprintf(filename_path, sizeof(filename_path), "%s/%s",
+ log_opts.logdir, INTERNAL_LOG_FILE);
+ if (len >= sizeof(filename_path))
+ pg_fatal("directory path for new cluster is too long");
+
+ if ((log_opts.internal = fopen_priv(filename_path, "a")) == NULL)
+ pg_fatal("could not open log file \"%s\": %m", filename_path);
+
+ /* label start of upgrade in logfiles */
+ for (filename = output_files; *filename != NULL; filename++)
+ {
+ len = snprintf(filename_path, sizeof(filename_path), "%s/%s",
+ log_opts.logdir, *filename);
+ if (len >= sizeof(filename_path))
+ pg_fatal("directory path for new cluster is too long");
+ if ((fp = fopen_priv(filename_path, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m", filename_path);
+
+ fprintf(fp,
+ "-----------------------------------------------------------------\n"
+ " pg_upgrade run on %s"
+ "-----------------------------------------------------------------\n\n",
+ ctime(&run_time));
+ fclose(fp);
+ }
+}
+
+
+static void
+setup(char *argv0, bool *live_check)
+{
+ /*
+ * make sure the user has a clean environment, otherwise, we may confuse
+ * libpq when we connect to one (or both) of the servers.
+ */
+ check_pghost_envvar();
+
+ /*
+ * In case the user hasn't specified the directory for the new binaries
+ * with -B, default to using the path of the currently executed pg_upgrade
+ * binary.
+ */
+ if (!new_cluster.bindir)
+ {
+ char exec_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, exec_path) < 0)
+ pg_fatal("%s: could not find own program executable", argv0);
+ /* Trim off program name and keep just path */
+ *last_dir_separator(exec_path) = '\0';
+ canonicalize_path(exec_path);
+ new_cluster.bindir = pg_strdup(exec_path);
+ }
+
+ verify_directories();
+
+ /* no postmasters should be running, except for a live check */
+ if (pid_lock_file_exists(old_cluster.pgdata))
+ {
+ /*
+ * If we have a postmaster.pid file, try to start the server. If it
+ * starts, the pid file was stale, so stop the server. If it doesn't
+ * start, assume the server is running. If the pid file is left over
+ * from a server crash, this also allows any committed transactions
+ * stored in the WAL to be replayed so they are not lost, because WAL
+ * files are not transferred from old to new servers. We later check
+ * for a clean shutdown.
+ */
+ if (start_postmaster(&old_cluster, false))
+ stop_postmaster(false);
+ else
+ {
+ if (!user_opts.check)
+ pg_fatal("There seems to be a postmaster servicing the old cluster.\n"
+ "Please shutdown that postmaster and try again.");
+ else
+ *live_check = true;
+ }
+ }
+
+ /* same goes for the new postmaster */
+ if (pid_lock_file_exists(new_cluster.pgdata))
+ {
+ if (start_postmaster(&new_cluster, false))
+ stop_postmaster(false);
+ else
+ pg_fatal("There seems to be a postmaster servicing the new cluster.\n"
+ "Please shutdown that postmaster and try again.");
+ }
+}
+
+
+/*
+ * Copy locale and encoding information into the new cluster's template0.
+ *
+ * We need to copy the encoding, datlocprovider, datcollate, datctype, and
+ * daticulocale. We don't need datcollversion because that's never set for
+ * template0.
+ */
+static void
+set_locale_and_encoding(void)
+{
+ PGconn *conn_new_template1;
+ char *datcollate_literal;
+ char *datctype_literal;
+ char *daticulocale_literal = NULL;
+ DbLocaleInfo *locale = old_cluster.template0;
+
+ prep_status("Setting locale and encoding for new cluster");
+
+ /* escape literals with respect to new cluster */
+ conn_new_template1 = connectToServer(&new_cluster, "template1");
+
+ datcollate_literal = PQescapeLiteral(conn_new_template1,
+ locale->db_collate,
+ strlen(locale->db_collate));
+ datctype_literal = PQescapeLiteral(conn_new_template1,
+ locale->db_ctype,
+ strlen(locale->db_ctype));
+ if (locale->db_iculocale)
+ daticulocale_literal = PQescapeLiteral(conn_new_template1,
+ locale->db_iculocale,
+ strlen(locale->db_iculocale));
+ else
+ daticulocale_literal = pg_strdup("NULL");
+
+ /* update template0 in new cluster */
+ if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500)
+ PQclear(executeQueryOrDie(conn_new_template1,
+ "UPDATE pg_catalog.pg_database "
+ " SET encoding = %d, "
+ " datlocprovider = '%c', "
+ " datcollate = %s, "
+ " datctype = %s, "
+ " daticulocale = %s "
+ " WHERE datname = 'template0' ",
+ locale->db_encoding,
+ locale->db_collprovider,
+ datcollate_literal,
+ datctype_literal,
+ daticulocale_literal));
+ else
+ PQclear(executeQueryOrDie(conn_new_template1,
+ "UPDATE pg_catalog.pg_database "
+ " SET encoding = %d, "
+ " datcollate = %s, "
+ " datctype = %s "
+ " WHERE datname = 'template0' ",
+ locale->db_encoding,
+ datcollate_literal,
+ datctype_literal));
+
+ PQfreemem(datcollate_literal);
+ PQfreemem(datctype_literal);
+ PQfreemem(daticulocale_literal);
+
+ PQfinish(conn_new_template1);
+
+ check_ok();
+}
+
+
+static void
+prepare_new_cluster(void)
+{
+ /*
+ * It would make more sense to freeze after loading the schema, but that
+ * would cause us to lose the frozenxids restored by the load. We use
+ * --analyze so autovacuum doesn't update statistics later
+ */
+ prep_status("Analyzing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --analyze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+
+ /*
+ * We do freeze after analyze so pg_statistic is also frozen. template0 is
+ * not frozen here, but data rows were frozen by initdb, and we set its
+ * datfrozenxid, relfrozenxids, and relminmxid later to match the new xid
+ * counter later.
+ */
+ prep_status("Freezing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --freeze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+}
+
+
+static void
+prepare_new_globals(void)
+{
+ /*
+ * Before we restore anything, set frozenxids of initdb-created tables.
+ */
+ set_frozenxids(false);
+
+ /*
+ * Now restore global objects (roles and tablespaces).
+ */
+ prep_status("Restoring global objects in the new cluster");
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/psql\" " EXEC_PSQL_ARGS " %s -f \"%s/%s\"",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.dumpdir,
+ GLOBALS_DUMP_FILE);
+ check_ok();
+}
+
+
+static void
+create_new_objects(void)
+{
+ int dbnum;
+
+ prep_status_progress("Restoring database schemas in the new cluster");
+
+ /*
+ * We cannot process the template1 database concurrently with others,
+ * because when it's transiently dropped, connection attempts would fail.
+ * So handle it in a separate non-parallelized pass.
+ */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Process only template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") != 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * template1 database will already exist in the target installation,
+ * so tell pg_restore to drop and recreate it; otherwise we would fail
+ * to propagate its database-level properties.
+ */
+ create_opts = "--clean --create";
+
+ exec_prog(log_file_name,
+ NULL,
+ true,
+ true,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname postgres \"%s/%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ log_opts.dumpdir,
+ sql_file_name);
+
+ break; /* done once we've processed template1 */
+ }
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Skip template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") == 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * postgres database will already exist in the target installation, so
+ * tell pg_restore to drop and recreate it; otherwise we would fail to
+ * propagate its database-level properties.
+ */
+ if (strcmp(old_db->db_name, "postgres") == 0)
+ create_opts = "--clean --create";
+ else
+ create_opts = "--create";
+
+ parallel_exec_prog(log_file_name,
+ NULL,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname template1 \"%s/%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ log_opts.dumpdir,
+ sql_file_name);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+
+ /*
+ * We don't have minmxids for databases or relations in pre-9.3 clusters,
+ * so set those after we have restored the schema.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 902)
+ set_frozenxids(true);
+
+ /* update new_cluster info now that we have objects in the databases */
+ get_db_and_rel_infos(&new_cluster);
+}
+
+/*
+ * Delete the given subdirectory contents from the new cluster
+ */
+static void
+remove_new_subdir(const char *subdir, bool rmtopdir)
+{
+ char new_path[MAXPGPATH];
+
+ prep_status("Deleting files from new %s", subdir);
+
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir);
+ if (!rmtree(new_path, rmtopdir))
+ pg_fatal("could not delete directory \"%s\"", new_path);
+
+ check_ok();
+}
+
+/*
+ * Copy the files from the old cluster into it
+ */
+static void
+copy_subdir_files(const char *old_subdir, const char *new_subdir)
+{
+ char old_path[MAXPGPATH];
+ char new_path[MAXPGPATH];
+
+ remove_new_subdir(new_subdir, true);
+
+ snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, old_subdir);
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, new_subdir);
+
+ prep_status("Copying old %s to new server", old_subdir);
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+#ifndef WIN32
+ "cp -Rf \"%s\" \"%s\"",
+#else
+ /* flags: everything, no confirm, quiet, overwrite read-only */
+ "xcopy /e /y /q /r \"%s\" \"%s\\\"",
+#endif
+ old_path, new_path);
+
+ check_ok();
+}
+
+static void
+copy_xact_xlog_xid(void)
+{
+ /*
+ * Copy old commit logs to new data dir. pg_clog has been renamed to
+ * pg_xact in post-10 clusters.
+ */
+ copy_subdir_files(GET_MAJOR_VERSION(old_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact",
+ GET_MAJOR_VERSION(new_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact");
+
+ prep_status("Setting oldest XID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -u %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_oldstxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /* set the next transaction id and epoch of the new cluster */
+ prep_status("Setting next transaction ID and epoch for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -x %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -e %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
+ new_cluster.pgdata);
+ /* must reset commit timestamp limits also */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -c %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtxid,
+ old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /*
+ * If the old server is before the MULTIXACT_FORMATCHANGE_CAT_VER change
+ * (see pg_upgrade.h) and the new server is after, then we don't copy
+ * pg_multixact files, but we need to reset pg_control so that the new
+ * server doesn't attempt to read multis older than the cutoff value.
+ */
+ if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
+ new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ copy_subdir_files("pg_multixact/offsets", "pg_multixact/offsets");
+ copy_subdir_files("pg_multixact/members", "pg_multixact/members");
+
+ prep_status("Setting next multixact ID and offset for new cluster");
+
+ /*
+ * we preserve all files and contents, so we must preserve both "next"
+ * counters here and the oldest multi present on system.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -O %u -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmxoff,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ old_cluster.controldata.chkpnt_oldstMulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+ else if (new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ /*
+ * Remove offsets/0000 file created by initdb that no longer matches
+ * the new multi-xid value. "members" starts at zero so no need to
+ * remove it.
+ */
+ remove_new_subdir("pg_multixact/offsets", false);
+
+ prep_status("Setting oldest multixact ID in new cluster");
+
+ /*
+ * We don't preserve files in this case, but it's important that the
+ * oldest multi is set to the latest value used by the old system, so
+ * that multixact.c returns the empty set for multis that might be
+ * present on disk. We set next multi to the value following that; it
+ * might end up wrapped around (i.e. 0) if the old cluster had
+ * next=MaxMultiXactId, but multixact.c can cope with that just fine.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmulti + 1,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ /* now reset the wal archives in the new cluster */
+ prep_status("Resetting WAL archives");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ /* use timeline 1 to match controldata and no WAL history file */
+ "\"%s/pg_resetwal\" -l 00000001%s \"%s\"", new_cluster.bindir,
+ old_cluster.controldata.nextxlogfile + 8,
+ new_cluster.pgdata);
+ check_ok();
+}
+
+
+/*
+ * set_frozenxids()
+ *
+ * This is called on the new cluster before we restore anything, with
+ * minmxid_only = false. Its purpose is to ensure that all initdb-created
+ * vacuumable tables have relfrozenxid/relminmxid matching the old cluster's
+ * xid/mxid counters. We also initialize the datfrozenxid/datminmxid of the
+ * built-in databases to match.
+ *
+ * As we create user tables later, their relfrozenxid/relminmxid fields will
+ * be restored properly by the binary-upgrade restore script. Likewise for
+ * user-database datfrozenxid/datminmxid. However, if we're upgrading from a
+ * pre-9.3 database, which does not store per-table or per-DB minmxid, then
+ * the relminmxid/datminmxid values filled in by the restore script will just
+ * be zeroes.
+ *
+ * Hence, with a pre-9.3 source database, a second call occurs after
+ * everything is restored, with minmxid_only = true. This pass will
+ * initialize all tables and databases, both those made by initdb and user
+ * objects, with the desired minmxid value. frozenxid values are left alone.
+ */
+static void
+set_frozenxids(bool minmxid_only)
+{
+ int dbnum;
+ PGconn *conn,
+ *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+
+ if (!minmxid_only)
+ prep_status("Setting frozenxid and minmxid counters in new cluster");
+ else
+ prep_status("Setting minmxid counter in new cluster");
+
+ conn_template1 = connectToServer(&new_cluster, "template1");
+
+ if (!minmxid_only)
+ /* set pg_database.datfrozenxid */
+ PQclear(executeQueryOrDie(conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datfrozenxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtxid));
+
+ /* set pg_database.datminmxid */
+ PQclear(executeQueryOrDie(conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datminmxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtmulti));
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ /*
+ * We must update databases where datallowconn = false, e.g.
+ * template0, because autovacuum increments their datfrozenxids,
+ * relfrozenxids, and relminmxid even if autovacuum is turned off, and
+ * even though all the data rows are already frozen. To enable this,
+ * we temporarily change datallowconn.
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = true",
+ quote_identifier(datname)));
+
+ conn = connectToServer(&new_cluster, datname);
+
+ if (!minmxid_only)
+ /* set pg_class.relfrozenxid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_class "
+ "SET relfrozenxid = '%u' "
+ /* only heap, materialized view, and TOAST are vacuumed */
+ "WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_TOASTVALUE) ")",
+ old_cluster.controldata.chkpnt_nxtxid));
+
+ /* set pg_class.relminmxid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_class "
+ "SET relminmxid = '%u' "
+ /* only heap, materialized view, and TOAST are vacuumed */
+ "WHERE relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_TOASTVALUE) ")",
+ old_cluster.controldata.chkpnt_nxtmulti));
+ PQfinish(conn);
+
+ /* Reset datallowconn flag */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = false",
+ quote_identifier(datname)));
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
new file mode 100644
index 0000000..7afa967
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -0,0 +1,473 @@
+/*
+ * pg_upgrade.h
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.h
+ */
+
+#include <unistd.h>
+#include <assert.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include "common/relpath.h"
+#include "libpq-fe.h"
+
+/* For now, pg_upgrade does not use common/logging.c; use our own pg_fatal */
+#undef pg_fatal
+
+/* Use port in the private/dynamic port number range */
+#define DEF_PGUPORT 50432
+
+#define MAX_STRING 1024
+#define QUERY_ALLOC 8192
+
+#define MESSAGE_WIDTH 62
+
+#define GET_MAJOR_VERSION(v) ((v) / 100)
+
+/* contains both global db information and CREATE DATABASE commands */
+#define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql"
+#define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom"
+
+/*
+ * Base directories that include all the files generated internally, from the
+ * root path of the new cluster. The paths are dynamically built as of
+ * BASE_OUTPUTDIR/$timestamp/{LOG_OUTPUTDIR,DUMP_OUTPUTDIR} to ensure their
+ * uniqueness in each run.
+ */
+#define BASE_OUTPUTDIR "pg_upgrade_output.d"
+#define LOG_OUTPUTDIR "log"
+#define DUMP_OUTPUTDIR "dump"
+
+#define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log"
+#define SERVER_LOG_FILE "pg_upgrade_server.log"
+#define UTILITY_LOG_FILE "pg_upgrade_utility.log"
+#define INTERNAL_LOG_FILE "pg_upgrade_internal.log"
+
+extern char *output_files[];
+
+/*
+ * WIN32 files do not accept writes from multiple processes
+ *
+ * On Win32, we can't send both pg_upgrade output and command output to the
+ * same file because we get the error: "The process cannot access the file
+ * because it is being used by another process." so send the pg_ctl
+ * command-line output to a new file, rather than into the server log file.
+ * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
+ * keep the pg_ctl output file open by the running postmaster, even after
+ * pg_ctl exits.
+ *
+ * We could use the Windows pgwin32_open() flags to allow shared file
+ * writes but is unclear how all other tools would use those flags, so
+ * we just avoid it and log a little differently on Windows; we adjust
+ * the error message appropriately.
+ */
+#ifndef WIN32
+#define SERVER_START_LOG_FILE SERVER_LOG_FILE
+#define SERVER_STOP_LOG_FILE SERVER_LOG_FILE
+#else
+#define SERVER_START_LOG_FILE "pg_upgrade_server_start.log"
+/*
+ * "pg_ctl start" keeps SERVER_START_LOG_FILE and SERVER_LOG_FILE open
+ * while the server is running, so we use UTILITY_LOG_FILE for "pg_ctl
+ * stop".
+ */
+#define SERVER_STOP_LOG_FILE UTILITY_LOG_FILE
+#endif
+
+
+#ifndef WIN32
+#define pg_mv_file rename
+#define PATH_SEPARATOR '/'
+#define PATH_QUOTE '\''
+#define RM_CMD "rm -f"
+#define RMDIR_CMD "rm -rf"
+#define SCRIPT_PREFIX "./"
+#define SCRIPT_EXT "sh"
+#define ECHO_QUOTE "'"
+#define ECHO_BLANK ""
+#else
+#define pg_mv_file pgrename
+#define PATH_SEPARATOR '\\'
+#define PATH_QUOTE '"'
+/* @ prefix disables command echo in .bat files */
+#define RM_CMD "@DEL /q"
+#define RMDIR_CMD "@RMDIR /s/q"
+#define SCRIPT_PREFIX ""
+#define SCRIPT_EXT "bat"
+#define EXE_EXT ".exe"
+#define ECHO_QUOTE ""
+#define ECHO_BLANK "."
+#endif
+
+
+/*
+ * The format of visibility map was changed with this 9.6 commit.
+ */
+#define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
+
+/*
+ * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
+ * ("Improve concurrency of foreign key locking") which also updated catalog
+ * version to this value. pg_upgrade behavior depends on whether old and new
+ * server versions are both newer than this, or only the new one is.
+ */
+#define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
+
+/*
+ * large object chunk size added to pg_controldata,
+ * commit 5f93c37805e7485488480916b4585e098d3cc883
+ */
+#define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
+
+/*
+ * change in JSONB format during 9.4 beta
+ */
+#define JSONB_FORMAT_CHANGE_CAT_VER 201409291
+
+
+/*
+ * Each relation is represented by a relinfo structure.
+ */
+typedef struct
+{
+ /* Can't use NAMEDATALEN; not guaranteed to be same on client */
+ char *nspname; /* namespace name */
+ char *relname; /* relation name */
+ Oid reloid; /* relation OID */
+ RelFileNumber relfilenumber; /* relation file number */
+ Oid indtable; /* if index, OID of its table, else 0 */
+ Oid toastheap; /* if toast table, OID of base table, else 0 */
+ char *tablespace; /* tablespace path; "" for cluster default */
+ bool nsp_alloc; /* should nspname be freed? */
+ bool tblsp_alloc; /* should tablespace be freed? */
+} RelInfo;
+
+typedef struct
+{
+ RelInfo *rels;
+ int nrels;
+} RelInfoArr;
+
+/*
+ * The following structure represents a relation mapping.
+ */
+typedef struct
+{
+ const char *old_tablespace;
+ const char *new_tablespace;
+ const char *old_tablespace_suffix;
+ const char *new_tablespace_suffix;
+ Oid db_oid;
+ RelFileNumber relfilenumber;
+ /* the rest are used only for logging and error reporting */
+ char *nspname; /* namespaces */
+ char *relname;
+} FileNameMap;
+
+/*
+ * Structure to store database information
+ */
+typedef struct
+{
+ Oid db_oid; /* oid of the database */
+ char *db_name; /* database name */
+ char db_tablespace[MAXPGPATH]; /* database default tablespace
+ * path */
+ RelInfoArr rel_arr; /* array of all user relinfos */
+} DbInfo;
+
+/*
+ * Locale information about a database.
+ */
+typedef struct
+{
+ char *db_collate;
+ char *db_ctype;
+ char db_collprovider;
+ char *db_iculocale;
+ int db_encoding;
+} DbLocaleInfo;
+
+typedef struct
+{
+ DbInfo *dbs; /* array of db infos */
+ int ndbs; /* number of db infos */
+} DbInfoArr;
+
+/*
+ * The following structure is used to hold pg_control information.
+ * Rather than using the backend's control structure we use our own
+ * structure to avoid pg_control version issues between releases.
+ */
+typedef struct
+{
+ uint32 ctrl_ver;
+ uint32 cat_ver;
+ char nextxlogfile[25];
+ uint32 chkpnt_nxtxid;
+ uint32 chkpnt_nxtepoch;
+ uint32 chkpnt_nxtoid;
+ uint32 chkpnt_nxtmulti;
+ uint32 chkpnt_nxtmxoff;
+ uint32 chkpnt_oldstMulti;
+ uint32 chkpnt_oldstxid;
+ uint32 align;
+ uint32 blocksz;
+ uint32 largesz;
+ uint32 walsz;
+ uint32 walseg;
+ uint32 ident;
+ uint32 index;
+ uint32 toast;
+ uint32 large_object;
+ bool date_is_int;
+ bool float8_pass_by_value;
+ uint32 data_checksum_version;
+} ControlData;
+
+/*
+ * Enumeration to denote transfer modes
+ */
+typedef enum
+{
+ TRANSFER_MODE_CLONE,
+ TRANSFER_MODE_COPY,
+ TRANSFER_MODE_LINK
+} transferMode;
+
+/*
+ * Enumeration to denote pg_log modes
+ */
+typedef enum
+{
+ PG_VERBOSE,
+ PG_STATUS, /* these messages do not get a newline added */
+ PG_REPORT_NONL, /* these too */
+ PG_REPORT,
+ PG_WARNING,
+ PG_FATAL
+} eLogType;
+
+
+/*
+ * cluster
+ *
+ * information about each cluster
+ */
+typedef struct
+{
+ ControlData controldata; /* pg_control information */
+ DbLocaleInfo *template0; /* template0 locale info */
+ DbInfoArr dbarr; /* dbinfos array */
+ char *pgdata; /* pathname for cluster's $PGDATA directory */
+ char *pgconfig; /* pathname for cluster's config file
+ * directory */
+ char *bindir; /* pathname for cluster's executable directory */
+ char *pgopts; /* options to pass to the server, like pg_ctl
+ * -o */
+ char *sockdir; /* directory for Unix Domain socket, if any */
+ unsigned short port; /* port number where postmaster is waiting */
+ uint32 major_version; /* PG_VERSION of cluster */
+ char major_version_str[64]; /* string PG_VERSION of cluster */
+ uint32 bin_version; /* version returned from pg_ctl */
+ const char *tablespace_suffix; /* directory specification */
+} ClusterInfo;
+
+
+/*
+ * LogOpts
+*/
+typedef struct
+{
+ FILE *internal; /* internal log FILE */
+ bool verbose; /* true -> be verbose in messages */
+ bool retain; /* retain log files on success */
+ /* Set of internal directories for output files */
+ char *rootdir; /* Root directory, aka pg_upgrade_output.d */
+ char *basedir; /* Base output directory, with timestamp */
+ char *dumpdir; /* Dumps */
+ char *logdir; /* Log files */
+ bool isatty; /* is stdout a tty */
+} LogOpts;
+
+
+/*
+ * UserOpts
+*/
+typedef struct
+{
+ bool check; /* true -> ask user for permission to make
+ * changes */
+ bool do_sync; /* flush changes to disk */
+ transferMode transfer_mode; /* copy files or link them? */
+ int jobs; /* number of processes/threads to use */
+ char *socketdir; /* directory to use for Unix sockets */
+} UserOpts;
+
+typedef struct
+{
+ char *name;
+ int dbnum;
+} LibraryInfo;
+
+/*
+ * OSInfo
+ */
+typedef struct
+{
+ const char *progname; /* complete pathname for this program */
+ char *user; /* username for clusters */
+ bool user_specified; /* user specified on command-line */
+ char **old_tablespaces; /* tablespaces */
+ int num_old_tablespaces;
+ LibraryInfo *libraries; /* loadable libraries */
+ int num_libraries;
+ ClusterInfo *running_cluster;
+} OSInfo;
+
+
+/*
+ * Global variables
+ */
+extern LogOpts log_opts;
+extern UserOpts user_opts;
+extern ClusterInfo old_cluster,
+ new_cluster;
+extern OSInfo os_info;
+
+
+/* check.c */
+
+void output_check_banner(bool live_check);
+void check_and_dump_old_cluster(bool live_check);
+void check_new_cluster(void);
+void report_clusters_compatible(void);
+void issue_warnings_and_set_wal_level(void);
+void output_completion_banner(char *deletion_script_file_name);
+void check_cluster_versions(void);
+void check_cluster_compatibility(bool live_check);
+void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
+
+
+/* controldata.c */
+
+void get_control_data(ClusterInfo *cluster, bool live_check);
+void check_control_data(ControlData *oldctrl, ControlData *newctrl);
+void disable_old_cluster(void);
+
+
+/* dump.c */
+
+void generate_old_dump(void);
+
+
+/* exec.c */
+
+#define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
+
+bool exec_prog(const char *log_filename, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5, 6);
+void verify_directories(void);
+bool pid_lock_file_exists(const char *datadir);
+
+
+/* file.c */
+
+void cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName);
+void check_file_clone(void);
+void check_hard_link(void);
+
+/* fopen_priv() is no longer different from fopen() */
+#define fopen_priv(path, mode) fopen(path, mode)
+
+/* function.c */
+
+void get_loadable_libraries(void);
+void check_loadable_libraries(void);
+
+/* info.c */
+
+FileNameMap *gen_db_file_maps(DbInfo *old_db,
+ DbInfo *new_db, int *nmaps, const char *old_pgdata,
+ const char *new_pgdata);
+void get_db_and_rel_infos(ClusterInfo *cluster);
+
+/* option.c */
+
+void parseCommandLine(int argc, char *argv[]);
+void adjust_data_dir(ClusterInfo *cluster);
+void get_sock_dir(ClusterInfo *cluster, bool live_check);
+
+/* relfilenumber.c */
+
+void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
+void transfer_all_new_dbs(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+
+/* tablespace.c */
+
+void init_tablespaces(void);
+
+
+/* server.c */
+
+PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
+PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
+
+char *cluster_conn_opts(ClusterInfo *cluster);
+
+bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error);
+void stop_postmaster(bool in_atexit);
+uint32 get_major_server_version(ClusterInfo *cluster);
+void check_pghost_envvar(void);
+
+
+/* util.c */
+
+char *quote_identifier(const char *s);
+int get_user_info(char **user_name_p);
+void check_ok(void);
+void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
+void end_progress_output(void);
+void cleanup_output_dirs(void);
+void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
+void prep_status_progress(const char *fmt,...) pg_attribute_printf(1, 2);
+unsigned int str2uint(const char *str);
+
+
+/* version.c */
+
+bool check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path);
+bool check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path);
+void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster);
+void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster);
+void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster,
+ bool check_mode);
+
+void old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster);
+void report_extension_updates(ClusterInfo *cluster);
+
+/* parallel.c */
+void parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...) pg_attribute_printf(3, 4);
+void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+bool reap_child(bool wait_for_child);
diff --git a/src/bin/pg_upgrade/po/LINGUAS b/src/bin/pg_upgrade/po/LINGUAS
new file mode 100644
index 0000000..4777c84
--- /dev/null
+++ b/src/bin/pg_upgrade/po/LINGUAS
@@ -0,0 +1 @@
+cs de es fr ja ka ko ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_upgrade/po/cs.po b/src/bin/pg_upgrade/po/cs.po
new file mode 100644
index 0000000..06698c5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/cs.po
@@ -0,0 +1,1804 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2021-09-16 09:14+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: check.c:67
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence na Starém Live Serveru\n"
+"----------------------------------------------------\n"
+
+#: check.c:73
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence\n"
+"-----------------------------\n"
+
+#: check.c:193
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Clustery jsou kompatibilní*\n"
+
+#: check.c:199
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Pokud pg_upgrade selže po tomto místě, musíte reinicializovat\n"
+"(initdb) nový cluster než budete pokraÄovat.\n"
+
+#: check.c:233
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Statistiky optimalizéru nejsou zachovány při pg_upgrade,\n"
+"takže po nastartování nového serveru zvažte spuštění:\n"
+" %s\n"
+"\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Spuštění tohoto skriptu smaže datové soubory starého clusteru:\n"
+" %s\n"
+
+#: check.c:244
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Nelze vytvořit skript pro smazání datových souborů starého cluster\n"
+"protože uživatelem definované tablespaces nebo datový adresář nového\n"
+"clusteru jsou v adresáři starého clusteru. Obsah starého clusteru musí\n"
+"být smazán manuálně.\n"
+
+#: check.c:254
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontroluji verze clusterů"
+
+#: check.c:266
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Tato utilita může upgradovat pouze z PostgreSQL verze 8.4 a novějších.\n"
+
+#: check.c:270
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Tato utilita může upgradovat pouze na PostgreSQL verze %s.\n"
+
+#: check.c:279
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Tato utilita nemůže být použita pro downgrade na starší major PostgreSQL verze.\n"
+
+#: check.c:284
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře starého clusteru jsou z jiných major verzí.\n"
+
+#: check.c:287
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře nového clusteru jsou z různých minárních verzí.\n"
+
+#: check.c:304
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "PÅ™i kontrole pre-PG 9.1 živého starého serveru, musíte zadat Äíslo portu starého serveru.\n"
+
+#: check.c:308
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "PÅ™i kontrole živého serveru, staré a nové Äíslo portu musí být různá.\n"
+
+#: check.c:323
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "kódování databáze \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:328
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:331
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:404
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Databáze \"%s\" na novém clusteru není prázdná: nalezena relace \"%s.%s\"\n"
+
+#: check.c:453
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Vytvářím skript pro analyze nového clusteru"
+
+#: check.c:467 check.c:626 check.c:890 check.c:969 check.c:1079 check.c:1170
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199
+#: version.c:341
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "nelze otevřít soubor \"%s\": %s\n"
+
+#: check.c:515 check.c:682
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "nelze přidat právo na spuštění pro soubor \"%s\": %s\n"
+
+#: check.c:545
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Kontroluji tablespace adresáře v novém clusteru"
+
+#: check.c:556
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "tablespace adresář v novém clusteru již existuje \"%s\"\n"
+
+#: check.c:589
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÃNÃ: nový datový adresář by nemÄ›l být ve starém datovém adresáři, e.g. %s\n"
+
+#: check.c:613
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÃNÃ: umístÄ›ní uživatelem definovaných tablespaces by nemÄ›ly být v datovém adresáři, e.g. %s\n"
+
+#: check.c:623
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Vytvářím skript pro smazání starého clusteru"
+
+#: check.c:702
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontroluji že databázový uživatel je použit pro instalaci"
+
+#: check.c:718
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "databázový uživatel \"%s\" nebyl použit pro instalaci\n"
+
+#: check.c:729
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "nelže urÄit poÄet uživatelů\n"
+
+#: check.c:737
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Pouze instalaÄní uživatel může být definován pro nový cluster.\n"
+
+#: check.c:757
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontroluji nastavení databázového spojení"
+
+#: check.c:779
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 nesmí povolovat spojení, i.e. příslušná hodnota pg_database.datallowconn musí být false\n"
+
+#: check.c:789
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Všechny non-template0 databáze musí povolovat spojení, i.e. jejich pg_database.datallowconn musí být true\n"
+
+#: check.c:814
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Kontroluji prepared transakce"
+
+#: check.c:823
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Zdrojový cluster obsahuje prepared transakce\n"
+
+#: check.c:825
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Cílový cluster obsahuje prepared transakce\n"
+
+#: check.c:851
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Kontroluji contrib/isn s bigint-passing rozdílem"
+
+#: check.c:912 check.c:991 check.c:1102 check.c:1193 function.c:262
+#: version.c:245 version.c:282 version.c:425
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:913
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"contrib/isn\" funkce které spoléhají na\n"
+"bigint datový typ. Váš starý a nový cluster předávají bigint hodnoty\n"
+"rozdílně takže tento cluster aktuálně nelze upgradovat. Můžete manuálně\n"
+"upgradovat databáze které používají \"contrib/isn\" prostředky a odstranit\n"
+"\"contrib/isn\" ze starého clusteru a znovu spustit upgrade. Seznam\n"
+"problematických funkcí je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:937
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Kontrola tabulek s WITH OIDS"
+
+#: check.c:992
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje tabulky deklarované s WITH OIDS, což již nadále není podporováno.\n"
+"Zvažte odstranění oid sloupce pomocí\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Seznam tabulek s tímto problémem je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1022
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kontroluji reg* datové typy v uživatelských tabulkách"
+
+#: check.c:1103
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the\n"
+"problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje některý z reg* datových typů v uživatelských\n"
+"tabulkách. Tyto datové typy odkazují na systémové OID hodnoty které\n"
+"nejsou zachovány při pg_upgrade, takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit\n"
+"upgrade. Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1128
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Kontroluji nekompatibilní \"jsonb\" datový typ"
+
+#: check.c:1194
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can remove the problem\n"
+"tables and restart the upgrade. A list of the problem columns is\n"
+"in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"jsonb\" datový typ v uživatelských tabulkách.\n"
+"Interní formát \"jsonb\" se změnil v 9.4 beta takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1216
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Kontroluji existenci rolí zaÄínajících na \"pg_\""
+
+#: check.c:1226
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Zdrojový cluster obsahuje role zaÄínající na \"pg_\"\n"
+
+#: check.c:1228
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Cílový cluster obsahuje role zaÄínající na \"pg_\"\n"
+
+#: check.c:1254
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "selhalo získání aktuální hodnoty locale\n"
+
+#: check.c:1263
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "selhalo získání jména systémové locale pro \"%s\"\n"
+
+#: check.c:1269
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "selhala obnova staré locale \"%s\"\n"
+
+#: controldata.c:127 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "nelze získat control data pomocí %s: %s\n"
+
+#: controldata.c:138
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problém se stavem databázového clusteru\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Zdrojový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Cílový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Zdrojový cluster nebyl zastaven ÄistÄ›.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Cílový cluster nebyl zastaven ÄistÄ›.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Cílový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375
+#: relfilenode.c:243 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal problem\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata retrieval problem\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Cílový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " další XID checkpointu\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " další OID posledního checkpointu\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " další MultiXactId posledního checkpointu\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " nejstarší MultiXactId posledního checkpointu\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " MultiXactOffset posledního checkpointu\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " první WAL segment po resets\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " metoda předávání float8 argumentů\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximální alignment\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " velikost bloku\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " velikost segmentu velkých relací\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " velikost WAL bloku\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " velikost WAL segmentu\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximální délka identifikátoru\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximální poÄet indexovaných sloupců\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximální velikost TOAST chunku\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " velikost large-object chunku\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " datum/Äas jsou integery?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " verze datových kontrolních souÄtů\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Nelze pokraÄovat bez kontrolních informací, konÄím\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"stará a nová hodnota pg_controldata alignmentu jsou neplatné nebo se neshodují\n"
+"Pravděpodobně jeden z clusterů je 32-bitový a druhý je 64-bitový\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti segmentu relace jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL segmentu jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální délky identifikátoru jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximálního poÄtu indexovaných sloupců jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti TOAST chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti large-object chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "stará a nová hodnota pg_controldata typu pro datum/Äas jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "starý cluster nepoužívá data chechsums ale nový ano\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "starý cluster používá data chechsums ale nový nikoliv\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "verze kontrolních souÄtů na starém a novém clusteru se neshodují\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Přidávám \".old\" příponu ke starému global/pg_control souboru"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Nelze přejmenovat %s na %s.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Pokud budete chtít nastartovat starý cluster, budete muset odstranit\n"
+"příponu \".old\" z %s/global/pg_control.old.\n"
+"Protože byl použit \"link\" mód, starý cluster nemůže být bezpeÄnÄ›\n"
+"spuštěn jakmile bude nastartován nový cluster.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Vytvářím dump globálních objektů"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Vytvářím dump databázových schémat\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "nelze získat verzi pg_ctl pomocí %s: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "nelze získat výstup s pg_ctl verzí z %s\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "příkaz je příliš dlouhý\n"
+
+#: exec.c:110 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "nelze otevřít logovací soubor \"%s\": %m\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*failure*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Došlo k problémům při spuštění \"%s\"\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravdÄ›podobnou příÄinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\" nebo \"%s\".\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravdÄ›podobnou příÄinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\".\n"
+
+#: exec.c:204 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "nelze zapsat do log souboru \"%s\": %m\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "nelze otevřít soubor \"%s\" pro Ätení: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Musíte mít práva na Ätení a zápis v aktuálním adresáři.\n"
+
+#: exec.c:310 exec.c:372 exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "kontrola pro \"%s\" selhala: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" není adresář\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "check for \"%s\" failed: not a regular file\n"
+
+#: exec.c:451
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze Äíst soubor (přístup odepÅ™en)\n"
+
+#: exec.c:459
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze spustit soubor (přístup odepřen)\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při klonování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "chyba pÅ™i kopírování relace \"%s.%s\": nelze Äíst ze souboru \"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze zapsat do souboru \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při vytváření odkazů pro relaci \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze získat informace o souboru \"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "chyba pÅ™i kopírování relace \"%s.%s\": ÄásteÄnÄ› zapsaná stránka nalezena v souboru \"%s\"\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "nelze klonovat soubory mezi starým a novým datovým adresářem: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "klonování souborů na této platformě není podporováno\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"nelze vytvořit hard link mezi starým a novým datovým adresářem: %s\n"
+"V link módu musí být starý a nový datový adresář na stejném souborovém systému.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Starý cluster má \"plpython_call_handler\" funkci definovanou\n"
+"v \"public\" schématu což je duplicitní s tou definovanou v \"pg_catalog\"\n"
+"schématu. Ověřit to můžete spuštěním tohoto v psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Veze z \"public\" schématu byla vytvořena instalací plpython před 8.1,\n"
+"a musí být odstraněna aby pg_upgrade mohlo fungovat protože\n"
+"odkazuje na nyní zastaralý \"plpython\" sdílený objekt. Verzi z \"public\"\n"
+"schématu můžete odstranit spuštěním následujícího příkazu:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"v každé postižené databázi:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Pro pokraÄování ze starého clusteru odstraňte problematické funkce.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontroluji dostupnost potřebných knihoven"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "nelze naÄíst knihovnu \"%s\": %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace odkazuje na knihovny které chybí v nové instalaci. Můtete\n"
+"je buÄ pÅ™idat do nové instalace, nebo odstranit funkce které je vyžadují ze\n"
+"staré instalace. Seznam problematických knihoven je v souboru:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Názvy relace pro OID %u v databázi \"%s\" neodpovídají: staré jméno \"%s.%s\", nové jméno \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Chyba při párování starých a nových tabulek v databázi \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " což je index na \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " což je index na OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " což je TOAST tabulka pro \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " což je TOAST tabulka pro OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Ve starém clusteru nebyl nalezen odpovídající záznam pro novou relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "V novém clusteru nebyl nalezen odpovídající záznam pro relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "mapování pro databázi \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u na %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"zdrojové databáze:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"cílové databáze:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: nelze spouštět jako root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "neplatné staré Äíslo portu\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "neplatné nové Äíslo portu\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Běží v módu s detailním (verbose) logováním.\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "binárky starého clusteru jsou umístěny"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "binárky nového clusteru jsou umístěny"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "data starého clusteru jsou umístěna"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "data nového clusteru jsou umístěna"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "sockety budou vytvořeny"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "nelze urÄit aktuální adresář\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "na Windows nelze spouštět pg_upgrade z datového adresáře nového clusteru\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade upgraduje PostgreSQL cluster na jinou major verzi.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [VOLBA]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "PÅ™epínaÄe:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR adresář se spustitelnými soubory starého clusteru\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR adresář se spustitelnými soubory nového clusteru\n"
+" (výchozí hodnota je stejný adresář jako pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check pouze kontroluje clustery, nemění žádná data\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR datový adresář starého clusteru\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR datový adresář nového clusteru\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM poÄet paralelních procesů nebo threadů\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link vytváří odkazy namísto kopírování souborů do nového clusteru\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=VOLBY volby pro starý cluster které se mají předat serveru\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=VOLBY volby pro nový cluster které se mají předat serveru\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT Äíslo portu pro starý cluster (implicitnÄ› %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT Äíslo portu pro nový cluster (implicitnÄ› %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain v případě úspěchu zachovat SQL a log soubory\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR adresář pro sockety (implicitnÄ› souÄasný adresář)\n"
+"\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=JMÉNO superuživatel pro cluster (implicitně \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose zapné podrobné interní logování\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version zobrazí informaci o verzi, poté skonÄí\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone klonuje namísto kopírování souborů do nového clusteru\n"
+"\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobrazí tuto nápovÄ›du, poté skonÄí\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Před spuštěním pg_upgrade musíte:\n"
+" vytvořit nový databázový cluster (pomocí nové verze initdb)\n"
+" zastavit postmaster proces běžící nad starým clusterem\n"
+" zastavit postmaster proces běžízí nad novým clusterem\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Při spuštění pg_upgrade musíte zadat následující informace:\n"
+" datový adresář pro starý cluster (-d DATADIR)\n"
+" datový adresář pro nový cluster (-D DATADIR)\n"
+" \"bin\" adresář pro starou verzi (-b BINDIR)\n"
+" \"bin\" adresář pro novou verzi (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Například:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"nebo\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Musíte zadat adresář kde %s.\n"
+"Použijte prosím volbu %s na příkazové řádce nebo proměnnou prostředí %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Vyhledávám skuteÄný datový adresář pro zdrojový cluster"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Vyhledávám skuteÄný datový adresář pro cílový cluster"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "nelze získat datový adresář pomocí %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "nelze naÄíst řádek %d ze souboru \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "uživatelem-zadané Äíslo starého portu %hu opraveno na %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "nelze vytvořit worker proces: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "nelze vytvořit worker thread: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "volání waitpid() selhalo: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "podřízený proces abnormálnÄ› skonÄil: status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "podřízený proces neoÄekávanÄ› skonÄil: %s\n"
+
+#: pg_upgrade.c:108
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Provádím Upgrade\n"
+"----------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Nastavuji další OID pro nový cluster"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronizuji datový adresář na disk"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Upgrade DokonÄen\n"
+"----------------\n"
+
+#: pg_upgrade.c:220
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_upgrade.c:246
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad starým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:259
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad novým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:273
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyzuji všechny řádky v novém clusteru"
+
+#: pg_upgrade.c:286
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Provádím freeze na všech řádcích v novém clusteru"
+
+#: pg_upgrade.c:306
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Obnovuji globální objekty v novém clusteru"
+
+#: pg_upgrade.c:321
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Obnovuji databázová schémata v novém clusteru\n"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Mažu soubory z nového %s"
+
+#: pg_upgrade.c:429
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "nelze smazat adresář \"%s\"\n"
+
+#: pg_upgrade.c:448
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopíruji starý %s do nového serveru"
+
+#: pg_upgrade.c:475
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Nastavuij následující transaction ID a epochu pro nový cluster"
+
+#: pg_upgrade.c:505
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Nastavuji následující multixact ID a offset pro nový cluster"
+
+#: pg_upgrade.c:529
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Nastavuji nejstarší multixact ID v novém clusteru"
+
+#: pg_upgrade.c:549
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resetuji WAL archivy"
+
+#: pg_upgrade.c:592
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Nastavuji frozenxid a minmxid v novém clusteru"
+
+#: pg_upgrade.c:594
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Nastavuji minmxid v novém clustreru"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Klonuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kopíruji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Linkuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "stará databáze \"%s\" nenalezena v novém clusteru\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kontrole existence souboru \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "přepisuji \"%s\" na \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klonuji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopíruji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "linkuji \"%s\" na \"%s\"\n"
+
+#: server.c:33
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "spojení do databáze selhalo: %s"
+
+#: server.c:39 server.c:141 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Chyba, konÄím\n"
+
+#: server.c:131
+#, c-format
+msgid "executing: %s\n"
+msgstr "spouštím: %s\n"
+
+#: server.c:137
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL příkaz selhal\n"
+"%s\n"
+"%s"
+
+#: server.c:167
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "nelze otevřít soubor s verzí: \"%s\": %m\n"
+
+#: server.c:171
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "neplatný formát řetězce s verzí \"%s\"\n"
+
+#: server.c:297
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"spojení na databázi selhalo: %s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit ke zdrojovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit k cílovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat zdrojový server, nebo selhal pokus o spojení\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat cílový server, nebo selhal pokus o spojení\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq proměnná prostředí %s má hodnotu odkazující na nelokální server: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Při použití tablespaces nelze provádět upgrade na/ze stejné verze\n"
+"systémových katalogů.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "adresář pro tablespace \"%s\" neexistuje\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "nelze přistoupit k tablespace adresáři \"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "cesta k tabespace \"%s\" není adresář\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Kontrola velkých objektů"
+
+#: version.c:77 version.c:384
+#, c-format
+msgid "warning"
+msgstr "varování"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům. Po upgrade vám bude poskytnut příkaz pro\n"
+"naplnění tabulky pg_largeobject_metadata s výchozími právy.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům, takže pro všechny velké objekty musí být\n"
+"definována výchozí práva. Soubor\n"
+" %s\n"
+"po spuÅ¡tÄ›ní z psql pod superuživatelským úÄtem tato výchozí práva nastaví.\n"
+"\n"
+
+#: version.c:239
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Kontrola nekompatibilního \"line\" datového typu"
+
+#: version.c:246
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje datový typ \"line\" v uživatelských tabulkách. Tento\n"
+"datový typ změnil interní a vstupní/výstupní formát mezi vaším starým a novým\n"
+"clusterem takže tento cluster nemůže být aktuálně upgradován. Můžete odstranit\n"
+"problematické tabulky a znovu spustit upgrade. Seznam problematických sloupců\n"
+"je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:276
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Kontrola pro neplatné \"unknown\" uživatelské sloupce"
+
+#: version.c:283
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"unknown\" datový typ v uživatelských tabulkách. Tento\n"
+"datový typ není v uživatelských tabulkách nadále povolen, takže tento cluster nelze\n"
+"aktuálně upgradovat. Můžete problematické tabulky odstranit a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:306
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Kontrola hash indexů"
+
+#: version.c:386
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Po skonÄení upgrade vám budou poskytnuty instrukce\n"
+"jak REINDEX provést.\n"
+"\n"
+
+#: version.c:392
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Soubor\n"
+" %s\n"
+"po spuÅ¡tÄ›ní z psql pod superuživatelským úÄtem znovu vytvoří vÅ¡echny\n"
+"neplatné indexy; dokud k tomu nedojde tyto indexy nebudou používány.\n"
+"\n"
+
+#: version.c:418
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Kontrola pro neplatné \"sql_identifier\" uživatelské sloupce"
+
+#: version.c:426
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables\n"
+"and/or indexes. The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can remove the problem tables or\n"
+"change the data type to \"name\" and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"sql_identifier\" datový typ v uživatelských tabulkách\n"
+"a/nebo indexech. Formát uložení na disku pro tento datový typ se změnil, takže\n"
+"tento cluster nelze aktuálně upgradovat. Můžete problematické tabulky\n"
+"odstranit nebo datový typ změnit na \"name\" a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "nelze naparsovat PG_VERSION soubor z %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statistiky optimalizéru a informace o volném místě nejsou zachovány\n"
+#~ "při pg_upgrade, takže po nastartování nového serveru zvažte spuštění:\n"
+#~ " %s\n"
+#~ "\n"
diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po
new file mode 100644
index 0000000..36efb8e
--- /dev/null
+++ b/src/bin/pg_upgrade/po/de.po
@@ -0,0 +1,1833 @@
+# German message translation file for pg_upgrade
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 13:18+0000\n"
+"PO-Revision-Date: 2023-11-03 10:42-0400\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Führe Konsistenzprüfungen am alten laufenden Server durch\n"
+"---------------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Führe Konsistenzprüfungen durch\n"
+"-------------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Cluster sind kompatibel*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Wenn pg_upgrade ab diesem Punkt fehlschlägt, dann müssen Sie den\n"
+"neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n"
+"werden kann."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Optimizer-Statistiken werden von pg_upgrade nicht übertragen. Wenn Sie\n"
+"den neuen Server starten, sollte Sie diesen Befehl ausführen:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"Ein Skript zum Löschen der Dateien des alten Clusters konnte nicht\n"
+"erzeugt werden, weil benutzerdefinierte Tablespaces oder das\n"
+"Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n"
+"liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Prüfe Cluster-Versionen"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version %s oder später durchführen."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«"
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis, d.h. %s, liegen"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis, d.h. %s, liegen"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Erzeuge Skript zum Löschen des alten Clusters"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht öffnen: %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht ausführbar machen: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "konnte die Anzahl der Benutzer nicht ermitteln"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Prüfe Verbindungseinstellungen der Datenbank"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Alle Datenbanken außer template0 müssen Verbindungen erlauben,\n"
+"d.h. ihr pg_database.datallowconn muss wahr sein. Ihre Installation\n"
+"enthält Datenbanken außer template0, deren pg_database.datallowconn\n"
+"auf falsch gesetzt ist. Sie sollten Verbindungen für alle Datenbanken\n"
+"außer template0 erlauben oder die Datenbanken, die keine Verbindungen\n"
+"erlauben, löschen. Eine Liste der Datenbanken mit diesem Problem ist\n"
+"in der Datei:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Prüfe auf vorbereitete Transaktionen"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Der alte Cluster enthält vorbereitete Transaktionen"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Der neue Cluster enthält vorbereitete Transaktionen"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält Funktionen aus »contrib/isn«, welche den\n"
+"Datentyp bigint verwenden. Der alte und der neue Cluster übergeben\n"
+"bigint auf andere Weise und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können Datenbanken im alten Cluster,\n"
+"die »contrib/isn« verwenden, manuell dumpen, löschen, dann das\n"
+"Upgrade durchführen und sie dann wiederherstellen. Eine Liste\n"
+"der problematischen Funktionen ist in der Datei:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Postfixoperatoren, was\n"
+"nicht mehr unterstützt wird. Entfernen Sie die Postfixoperatoren und\n"
+"ersetzten Sie sie durch Präfixoperatoren oder Funktionsaufrufe. Eine\n"
+"Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Prüfe auf inkompatible polymorphische Funktionen"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Objekte, die auf interne\n"
+"polymorphische Funktionen mit Argumenten vom Typ »anyarray« und\n"
+"»anyelement« verweisen. Diese benutzerdefinierten Objekte müsen vor\n"
+"dem Upgrade gelöscht werden und danach wiederhergestellt werden,\n"
+"nachdem sie so geändert wurden, dass sie auf die entsprechenden\n"
+"Funktionen mit Argumenten vom Typ »anycompatiblearray« und\n"
+"»anycompatible« verweisen.\n"
+"Eine Liste der problematischen Objekte ist in der Datei:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Prüfe auf Tabellen mit WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält Tabellen, die mit WITH OIDS deklariert sind,\n"
+"was nicht mehr unterstützt wird. Entfernen Sie die oid-Spalte mit\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Eine Liste der Tabellen mit dem Problem ist in der Datei:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält systemdefinierte zusammengesetzte Typen in\n"
+"Benutzertabellen. Die OIDs dieser Typen sind nicht über\n"
+"PostgreSQL-Versionen stabil und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können die Problemspalten löschen\n"
+"und das Upgrade neu starten. Eine Liste der Problemspalten ist in der\n"
+"Datei:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält einen der reg*-Datentypen in\n"
+"Benutzertabellen. Diese Datentypen verweisen auf System-OIDs, die von\n"
+"pg_upgrade nicht erhalten werden. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n"
+"löschen und das Upgrade neu starten. Eine Liste der Problemspalten\n"
+"ist in der Datei:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Prüfe auf inkompatiblen Datentyp »%s« in Benutzertabellen"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »aclitem« in\n"
+"Benutzertabellen. Das interne Format von »aclitem« wurde in PostgreSQL\n"
+"16 geändert. Daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Prüfe auf entfernten Datentyp »%s« in Benutzertabellen"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »%s« in Benutzertabellen. Der\n"
+"Typ »%s« wurde in PostgreSQL %s entfernt. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die Problemspalten\n"
+"löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »jsonb« in\n"
+"Benutzertabellen. Das interne Format von »jsonb« wurde während 9.4\n"
+"Beta geändert. Daher kann dieser Cluster gegenwärtig nicht\n"
+"aktualisiert werden. Sie können die Problemspalten löschen und das\n"
+"Upgrade neu starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Prüfe auf Rollen, die mit »pg_« anfangen"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält Rollen, die mit »pg_« anfangen.\n"
+"»pg_« ist ein reservierter Präfix für Systemrollen. Der Cluster kann\n"
+"erst aktualisiert werden, wenn diese Rollen umbenannt sind.\n"
+"Eine Liste der Rollen, die mit »pg_« anfangen, ist in der Datei:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte\n"
+"Kodierungsumwandlungen. Die Parameter von Umwandlungsfunktionen wurden\n"
+"in PostgreSQL Version 14 geändert. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Kodierungsumwandlungen im alten Cluster entfernen und das Upgrade neu\n"
+"starten. Eine Liste der benutzerdefinierten Kodierungsumwandlungen ist\n"
+"in der Datei:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: Problem mit dem Zustand des Clusters"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Der alte Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Der neue Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Der alte Cluster wurde nicht sauber heruntergefahren."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Der neue Cluster wurde nicht sauber heruntergefahren."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: Problem mit pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: Problem beim Ermitteln der Kontrolldaten"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Im alten Cluster fehlen einige notwendige Kontrollinformationen:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Im neuen Cluster fehlen einige notwendige Kontrollinformationen:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " Checkpoint nächste XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " NextOID des letzten Checkpoints"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " NextMultiXactId des letzten Checkpoints"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " oldestMultiXid des letzten Checkpoints"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " oldestXID des letzten Checkpoints"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " NextMultiOffset des letzten Checkpoints"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " erstes WAL-Segment nach dem Reset"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " Ãœbergabe von Float8-Argumenten"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " maximale Ausrichtung (Alignment)"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " Blockgröße"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " Segmentgröße für große Relationen"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL-Blockgröße"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL-Segmentgröße"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " maximale Bezeichnerlänge"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " maximale Anzahl indizierter Spalten"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " maximale TOAST-Chunk-Größe"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " Large-Object-Chunk-Größe"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " Datum/Zeit sind Ganzzahlen?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " Datenprüfsummenversion"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Kann ohne die benötigten Kontrollinformationen nicht fortsetzen, Programm wird beendet"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"altes und neues Alignment in pg_controldata ist ungültig oder stimmt nicht überein\n"
+"Wahrscheinlich ist ein Cluster eine 32-Bit-Installation und der andere 64-Bit"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "alte und neue Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "alte und neue maximale Relationssegmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "alte und neue WAL-Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "alte und neue WAL-Segmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "alte und neue maximale Bezeichnerlängen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "alte und neue Maximalzahlen indizierter Spalten von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "alte und neue maximale TOAST-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "alte und neue Large-Object-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "alte und neue Speicherung von Datums- und Zeittypen von pg_controldata ist ungültig oder stimmt nicht überein"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "der alte Cluster verwendet keine Datenprüfsummen, aber der neue verwendet sie"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "die alte Cluster verwendet Datenprüfsummen, aber der neue nicht"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "Prüfsummenversionen im alten und neuen Cluster stimmen nicht überein"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Füge Endung ».old« an altes global/pg_control an"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Wenn Sie den alten Cluster starten wollen, müssen Sie die Endung\n"
+"».old« von %s/global/pg_control.old entfernen. Da der »link«-Modus\n"
+"verwendet wurde, kann der alte Cluster nicht gefahrlos gestartet\n"
+"werden, nachdem der neue Cluster gestartet worden ist."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Erzeuge Dump der globalen Objekte"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Erzeuge Dump der Datenbankschemas"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "konnte pg_ctl-Version nicht ermitteln von %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "Befehl zu lang"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*fehlgeschlagen*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Probleme beim Ausführen von »%s«"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« oder »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "konnte nicht in Logdatei »%s «schreiben: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Sie müssen Lese- und Schreibzugriff im aktuellen Verzeichnis haben."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "Prüfen von »%s« fehlgeschlagen: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "»%s« ist kein Verzeichnis"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "Prüfen von »%s« fehlgeschlagen: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "Prüfen von »%s« fehlgeschlagen: falsche Version: gefunden »%s«, erwartet »%s«"
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht lesen: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht schreiben: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s« (»%s« nach »%s«): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Erzeugen einer Verknüpfung für Relation »%s.%s« (»%s« nach »%s«): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte »stat« für Datei »%s« nicht ausführen: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: unvollständige Seite gefunden in Datei »%s«"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "konnte Datei nicht vom alten in das neue Datenverzeichnis klonen: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht erstellen: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %s\n"
+"Im Link-Modus müssen das alte und das neue Datenverzeichnis im selben Dateisystem liegen."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Prüfe das Vorhandensein benötigter Bibliotheken"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "konnte Bibliothek »%s« nicht laden: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "In Datenbank: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation verweist auf ladbare Bibliotheken, die in der neuen\n"
+"Installation fehlen. Sie können diese Bibliotheken zur neuen\n"
+"Installation hinzufügen oder die Funktionen in der alten Installation\n"
+"entfernen. Eine Liste der problematischen Bibliotheken ist in der\n"
+"Datei:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Relationsnamen für OID %u in Datenbank »%s« stimmen nicht überein: alten Name »%s.%s«, neuer Name »%s.%s«"
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Alte und neue Tabellen in Datenbank »%s« konnten nicht gepaart werden"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr ", ein Index für »%s.%s«"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr ", ein Index für OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr ", eine TOAST-Tabelle für »%s.%s«"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr ", eine TOAST-Tabelle für OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "Keine Übereinstimmung gefunden im alten Cluster für neue Relation mit OID %u in Datenbank »%s«: %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "Keine Übereinstimmung gefunden im neuen Cluster für alte Relation mit OID %u in Datenbank »%s«: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"Quelldatenbanken:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"Zieldatenbanken:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 nicht gefunden"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Datenbank: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: kann nicht als root ausgeführt werden"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ungültige alte Portnummer"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ungültige neue Portnummer"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Ausführung im Verbose-Modus"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "die Programmdateien des alten Clusters liegen"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "die Programmdateien des neuen Clusters liegen"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "die Daten das alten Clusters liegen"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "die Daten des neuen Clusters liegen"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "die Sockets erzeugt werden sollen"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "auf Windows kann pg_upgrade nicht von innerhalb des Cluster-Datenverzeichnisses ausgeführt werden"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade aktualisiert einen PostgreSQL-Cluster auf eine neue Hauptversion.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINVERZ Programmverzeichnis des alten Clusters\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINVERZ Programmverzeichnis des neuen Clusters\n"
+" (Standard: gleiches Verzeichnis wie pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check nur Cluster prüfen, keine Daten ändern\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATENVERZ Datenverzeichnis des alten Clusters\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATENVERZ Datenverzeichnis des neuen Clusters\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM Anzahl paralleler Prozesse oder Threads\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link Dateien in den neuen Cluster verknüpfen statt kopieren\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONEN Serveroptionen für den alten Cluster\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONEN Serveroptionen für den neuen Cluster\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT Portnummer für den alten Cluster (Standard: %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT Portnummer für den neuen Cluster (Standard: %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL- und Logdateien bei Erfolg aufheben\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME Cluster-Superuser (Standard: »%s«)\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose »Verbose«-Modus einschalten\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone Dateien in den neuen Cluster klonen statt kopieren\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy Dateien in den neuen Cluster kopieren (Voreinstellung)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Vor dem Aufruf von pg_upgrade müssen Sie:\n"
+" den neuen Datenbankcluster anlegen (mit der neuen Version von initdb)\n"
+" den Postmaster für den alten Cluster anhalten\n"
+" den Postmaster für den neuen Cluster anhalten\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Beim Aufruf von pg_upgrade müssen die folgenden Informationen angegeben werden:\n"
+" das Datenverzeichnis des alten Clusters (-d DATENVERZ)\n"
+" das Datenverzeichnis des neuen Clusters (-D DATENVERZ)\n"
+" das »bin«-Verzeichnis der alten Version (-b BINVERZ)\n"
+" das »bin«-Verzeichnis der neuen Version (-B BINVERZ)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Zum Beispiel:\n"
+" pg_upgrade -d alterCluster/data -D neuerCluster/data -b alterCluster/bin -B neuerCluster/bin\n"
+"oder\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=alterCluster/data\n"
+" $ export PGDATANEW=neuerCluster/data\n"
+" $ export PGBINOLD=alterCluster/bin\n"
+" $ export PGBINNEW=neuerCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=alterCluster/data\n"
+" C:\\> set PGDATANEW=neuerCluster/data\n"
+" C:\\> set PGBINOLD=alterCluster/bin\n"
+" C:\\> set PGBINNEW=neuerCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Sie müssen das Verzeichnis angeben, wo %s.\n"
+"Bitte verwenden Sie die Kommandzeilenoption %s oder die Umgebungsvariable %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des alten Clusters"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des neuen Clusters"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "vom Benutzer angegebene Portnummer %hu wurde auf %hu korrigiert"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "konnte Arbeitsprozess nicht erzeugen: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "konnte Arbeits-Thread nicht erzeugen: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() fehlgeschlagen: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "Kindprozess wurde abnormal beendet: Status %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "Kindprozess wurde abnormal beendet: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Führe Upgrade durch\n"
+"-------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Setze nächste OID im neuen Cluster"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisiere Datenverzeichnis auf Festplatte"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Upgrade abgeschlossen\n"
+"---------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "Verzeichnispfad für neuen Cluster ist zu lang"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: konnte eigene Programmdatei nicht finden"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den alten Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den neuen Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Setze Locale und Kodierung für neuen Cluster"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analysiere alle Zeilen im neuen Cluster"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Friere alle Zeilen im neuen Cluster ein"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Stelle globale Objekte im neuen Cluster wieder her"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Stelle Datenbankschemas im neuen Cluster wieder her"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Lösche Dateien aus neuem %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "konnte Verzeichnis »%s« nicht löschen"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopiere altes %s zum neuen Server"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Setze älteste XID im neuen Cluster"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Setze älteste Multixact-ID im neuen Cluster"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Setze WAL-Archive zurück"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Setze frozenxid und minmxid im neuen Cluster"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Setze minmxid im neuen Cluster"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Klone Benutzertabellendateien"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Kopiere Benutzertabellendateien"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Verknüpfe Benutzertabellendateien"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "konvertiere »%s« nach »%s«"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "klone »%s« nach »%s«"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "kopiere »%s« nach »%s«"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "verknüpfe »%s« nach »%s«"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Fehlgeschlagen, Programm wird beendet\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "führe aus: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-Befehl fehlgeschlagen\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "konnte Versionsdatei »%s« nicht öffnen: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "konnte Versionsdatei »%s« nicht interpretieren"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s"
+
+#: server.c:310
+#, 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:312
+#, 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:357
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Kann nicht auf gleiche Systemkatalogversion aktualisieren, wenn\n"
+"Tablespaces verwendet werden."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "Tablespace-Verzeichnis »%s« existiert nicht"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "Tablespace-Pfad »%s« ist kein Verzeichnis"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »line«"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »line« in Benutzertabellen. Das\n"
+"interne Format und das Eingabe-/Ausgabeformat dieses Datentyps wurden\n"
+"zwischen Ihrem alten und neuen Cluster geändert und daher kann dieser\n"
+"Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Problemspalten löschen und das Upgrade neu starten. Eine Liste der\n"
+"Problemspalten ist in der Datei:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »unknown« in\n"
+"Benutzertabellen. Dieser Datentyp ist nicht mehr in Tabellen erlaubt\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Prüfe auf Hash-Indexe"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "Warnung"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n"
+"werden Sie Anweisungen zum REINDEX erhalten."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um alle\n"
+"ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n"
+"verwendet werden."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »sql_identifier« in\n"
+"Benutzertabellen. Das Speicherformat dieses Datentyps wurde geändert\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Prüfe auf Aktualisierungen von Erweiterungen"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "Hinweis"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Ihre Installation enthält Erweiterungen, die mit dem Befehl ALTER\n"
+"EXTENSION aktualisiert werden sollten. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n"
+"Erweiterungen zu aktualisieren."
diff --git a/src/bin/pg_upgrade/po/es.po b/src/bin/pg_upgrade/po/es.po
new file mode 100644
index 0000000..327cc36
--- /dev/null
+++ b/src/bin/pg_upgrade/po/es.po
@@ -0,0 +1,1829 @@
+# spanish message translation file for pg_upgrade
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+# Ãlvaro Herrera <alvherre@alvh.no-ip.org>, 2017.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:19+0000\n"
+"PO-Revision-Date: 2023-10-03 16:20+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Verificando Consistencia en Vivo en el Servidor Antiguo\n"
+"-------------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Verificando Consistencia\n"
+"------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Los clústers son compatibles*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Si pg_upgrade falla a partir de este punto, deberá re-ejecutar initdb\n"
+"en el clúster nuevo antes de continuar."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Las estadísticas para el optimizador no son transferidas por pg_upgrade.\n"
+"Una vez que inicie el servidor nuevo, considere ejecutar:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"Ejecutando este script se borrarán los archivos de datos del servidor antiguo:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"No se pudo crear un script para borrar los archivos de datos del servidor\n"
+"antiguo, porque el directorio del clúster antiguo contiene tablespaces\n"
+"o el directorio de datos del servidor nuevo. El contenido del servidor\n"
+"antiguo debe ser borrado manualmente."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Verificando las versiones de los clústers"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Este programa sólo puede actualizar desde PostgreSQL versión %s y posterior."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Este programa sólo puede actualizar a PostgreSQL versión %s."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Este programa no puede usarse para volver a versiones anteriores de PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "El directorio de datos antiguo y el directorio de binarios antiguo son de versiones diferentes."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "El directorio de datos nuevo y el directorio de binarios nuevo son de versiones diferentes."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Al verificar servidores en caliente, los números de port antiguo y nuevo deben ser diferentes."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "La base de datos «%s» del clúster nuevo no está vacía: se encontró la relación «%s.%s»"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Verificando los directorios de tablespaces para el nuevo clúster"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "directorio de tablespace para el nuevo clúster ya existe: «%s»"
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"ADVERTENCIA: el directorio de datos nuevo no debería estar dentro del directorio antiguo,\n"
+"esto es, %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"ADVERTENCIA: las ubicaciones de tablespaces definidos por el usuario no deberían estar dentro del directorio de datos, esto es, %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Creando un script para borrar el clúster antiguo"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "no se pudo abrir el archivo «%s»: %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Verificando que el usuario de base de datos es el usuario de instalación"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "el usuario de base de datos «%s» no es el usuario de instalación"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "no se pudo determinar el número de usuarios"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Sólo el usuario de instalación puede estar definido en el nuevo clúster."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Verificando los parámetros de conexión de bases de datos"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 no debe permitir conexiones, es decir su pg_database.datallowconn debe ser «false»"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Todas las bases de datos que no son template0 deben permitir conexiones,\n"
+"es decir, pg_database.datallowconn debe ser true. Su instalación contiene\n"
+"bases de datos que no son template0 que tienen pg_database.datallowconn\n"
+"definido a false. Considere permitir conexiones para todas las bases de\n"
+"datos que no son template0 o eliminar las bases de datos que no permiten\n"
+"conexión. Un listado de las bases de datos con el problema se encuentra en:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Verificando transacciones preparadas"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "El clúster de origen contiene transacciones preparadas"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "El clúster de destino contiene transacciones preparadas"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Verificando contrib/isn con discordancia en mecanismo de paso de bigint"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene funciones de «contrib/isn» que usan el tip de dato\n"
+"bigint. Sus clústers nuevo y antiguo pasar el tipo bigint de distinta forma,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede hacer un volcado (dump) de las bases de datos que usan «contrib/isn»,\n"
+"eliminarlas, hacer el upgrade, y luego restaurarlas.\n"
+"Un listado de funciones problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Verificando operadores postfix definidos por el usuario"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene operadores postfix definidos por el usuario, los\n"
+"cuales ya no están soportados. Considere eliminar los operadores postfix\n"
+"y reemplazarlos con operadores de prefijo o llamadas a funciones.\n"
+"Una lista de operadores postfix definidos por el usuario aparece en el archivo:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Verificando funciones polimórficas incompatibles"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene objetos definidos por el usuario que hacen referencia\n"
+"a funciones polimórficas con argumentos de tipo «anyarray» o «anyelement».\n"
+"Esos objetos definidos por el usuario deben eliminarse antes de actualizar\n"
+"y se pueden restaurar después, cambiándolos para que hagan referencia a las nuevas\n"
+"funciones correspondientes con argumentos de tipo «anycompatiblearray» y\n"
+"«anycompatible». Una lista de los objetos problemáticos está en el archivo:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Verificando tablas WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene tablas declaradas WITH OIDS, que ya no está\n"
+"soportado. Considere eliminar la columna oid usando\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Una lista de tablas con este problema aparece en el archivo:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene tipos compuestos definidos por el sistema en\n"
+"tablas de usuario. Los OIDs de estos tipos no son estables entre diferentes\n"
+"versiones de PostgreSQL, por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Verificando tipos de datos reg* en datos de usuario"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene uno de los tipos reg* en tablas de usuario. Estos tipos\n"
+"de dato hacen referencia a OIDs de sistema que no son preservados por pg_upgrade,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Verificando datos de usuario de tipo «%s» incompatible"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n"
+"El formato interno de «jsonb» cambió durante 9.4 beta,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Verificando tipo de datos «%s» eliminado en tablas de usuario"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «%s» en tablas de usuario.\n"
+"El tipo «%s» fue eliminado en la versión %s de PostgreSQL,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas, o cambiarlas a otro\n"
+"tipo de dato, y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Verificando datos de usuario en tipo «jsonb» incompatible"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n"
+"El formato interno de «jsonb» cambió durante 9.4 beta,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Verificando roles que empiecen con «pg_»"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene nombres de rol que comienzan con «pg_».\n"
+"«pg_» es un prefijo reservado para roles de sistema. El clúster\n"
+"no puede ser actualizado hasta que esos roles hayan sido renombrados.\n"
+"Un listado de los roles que empiezan con «pg_» está en el archivo:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Verificando conversiones de codificación definidas por el usuario"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene conversiones de codificación definidas por el usuario.\n"
+"Los parámetros de la función de conversión cambiaron en PostgreSQL 14\n"
+"por lo que este clúster no puede ser actualizado. Puede eliminar\n"
+"las conversiones de codificación en el clúster antiguo y reiniciar la actualización.\n"
+"Un listado de las conversiones de codificación definidas por el usuario está en el archivo:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "no se pudo obtener datos de control usando %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: problema de estado del clúster"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "El clúster de origen fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "El clúster de destino fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "El clúster de origen no fue apagado limpiamente."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "El clúster de destino no fue apagado limpiamente."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Al clúster de origen le falta información de estado:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Al cluster de destino le falta información de estado:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: problema en pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: problema de extracción de controldata"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Al clúster de origen le falta información de control requerida:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Al clúster de destino le falta información de control requerida:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " siguiente XID del último checkpoint"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " siguiente OID del último checkpoint"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " siguiente MultiXactId del último checkpoint"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " MultiXactId más antiguo del último checkpoint"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " XID más antiguo del último checkpoint"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " siguiente MultiXactOffset del siguiente checkpoint"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " primer segmento de WAL después del reinicio"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " método de paso de argumentos float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " alineamiento máximo"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " tamaño de bloques"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " tamaño de segmento de relación grande"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " tamaño de bloque de WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " tamaño de segmento de WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " máximo largo de identificadores"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " máximo número de columnas indexadas"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " tamaño máximo de trozos TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " tamaño de trozos de objetos grandes"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " fechas/horas son enteros?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " versión del checksum de datos"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "No se puede continuar sin la información de control requerida. Terminando"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"Alineamientos de pg_controldata antiguo y nuevo no son válidos o no coinciden.\n"
+"Seguramente un clúster es 32-bit y el otro es 64-bit"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "Los tamaños de bloque antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "El tamaño máximo de segmento de relación antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "El tamaño de bloques de WAL antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "El tamaño de segmentos de WAL antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "Los máximos largos de identificador antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "La cantidad máxima de columnas indexadas antigua y nueva no son válidos o no coinciden"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "Los máximos de trozos TOAST antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "Los tamaños de trozos de objetos grandes antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "Los tipos de almacenamiento de fecha/hora antiguo y nuevo no coinciden"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "El clúster antiguo no usa checksums de datos pero el nuevo sí"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "El clúster antiguo usa checksums de datos pero el nuevo no"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "Las versiones de checksum de datos antigua y nueva no coinciden"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Agregando el sufijo «.old» a global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Si desea iniciar el clúster antiguo, necesitará eliminar el sufijo\n"
+"«.old» de %s/global/pg_control.old.\n"
+"Puesto que se usó el modo «link», el clúster antiguo no puede usarse\n"
+"en forma segura después de que el clúster nuevo haya sido iniciado."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Creando el volcado de objetos globales"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Creando el volcado de esquemas de bases de datos"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "no se pudo obtener datos de versión de pg_ctl usando %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "no se pudo obtener la salida de versión de pg_ctl de %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "orden demasiado larga"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*falló*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Hubo problemas ejecutando «%s»"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consulte las últimas línea de «%s» o «%s» para\n"
+"saber la causa probable de la falla."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consulte las últimas líneas de «%s» para saber\n"
+"la causa probable de la falla."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "no se pudo escribir al archivo de log «%s»"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "no se pudo abrir el archivo «%s» para lectura: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Debe tener privilegios de lectura y escritura en el directorio actual."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "la comprobación de «%s» falló: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "«%s» no es un directorio"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "la comprobación de «%s» falló: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "La comprobación de «%s» falló: no se puede ejecutar"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "La comprobación de «%s» falló: versión incorrecta: se encontró «%s», se esperaba «%s»"
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo escribir el archivo «%s»: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se copiaba la relación «%s.%s» («%s» a «%s»): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se creaba el link para la relación «%s.%s» («%s» a «%s»): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo hacer stat a «%s»: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "error mientras se copiaba la relación «%s.%s»: se encontró una página parcial en el archivo «%s»"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "no se pudo crear el archivo «%s»: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "el clonado de archivos no está soportado en esta plataforma"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"No se pudo crear un link duro entre los directorios de datos nuevo y antiguo: %s\n"
+"En modo link los directorios de dato nuevo y antiguo deben estar en el mismo sistema de archivos."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Verificando la presencia de las bibliotecas requeridas"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "no se pudo cargar la biblioteca «%s»: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "En la base de datos: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación hace referencia a bibliotecas que no están en la nueva\n"
+"instalación. Puede agregar estar bibliotecas la instalación nueva, o\n"
+"eliminar las funciones que las utilizan de la versión antigua. Un listado\n"
+"de las bibliotecas problemáticas está en el archivo:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Los nombres de relación para OID %u en la base de datos «%s» no coinciden: nombre antiguo «%s.%s», nombre nuevo «%s.%s»"
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "No hubo coincidencia en las tablas nueva y antigua en la base de datos «%s»"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " que es un índice en «%s.%s»"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " que es un índice en el OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " que es la tabla TOAST para «%s.%s»"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " que es la tabla TOAST para el OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr ""
+"No se encontró equivalente en el clúster antiguo para la relación nueva con OID %u\n"
+"en la base de datos «%s»: %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr ""
+"No se encontró equivalente en el clúster nuevo para la antigua relación con OID %u\n"
+"en la base de datos «%s»: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"bases de datos de origen:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"bases de datos de destino:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 no encontrado"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Base de datos: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: no puede ejecutarse como root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "número de puerto antiguo no válido"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "número de puerto nuevo no válido"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Pruebe «%s --help» para mayor información.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Ejecutando en modo verboso"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "residen los binarios del clúster antiguo"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "residen los binarios del clúster nuevo"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "residen los datos del clúster antiguo"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "residen los datos del clúster nuevo"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "se crearán los sockets"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "no se pudo identificar el directorio actual"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "no se puede ejecutar pg_upgrade desde dentro del directorio de datos del clúster nuevo en Windows"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr "pg_upgrade actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPCIÓN]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR directorio de ejecutables del clúster antiguo\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n"
+" (por omisión el mismo directorio que pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sólo verificar clústers, no cambiar datos\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR directorio de datos del clúster antiguo\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR directorio de datos del clúster nuevo\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link enlazar (link) archivos en vez de copiarlos\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPCIONES opciones a pasar al servidor antiguo\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPCIONES opciones a pasar al servidor nuevo\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PUERTO número de puerto del clúster antiguo (def. %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PUERTO número de puerto del clúster nuevo (def. %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain preservar archivos SQL y logs en caso de éxito\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR directorio de sockets a usar (omisión: dir. actual)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NOMBRE superusuario del clúster (def. «%s»)\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose activar registro interno verboso\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clonar los archivos en vez de copiarlos\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy copiar los archivos al clúster nuevo (por omisión)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Antes de ejecutar pg_upgrade, debe:\n"
+" crear el nuevo clúster de la base de datos (usando la nueva versión de initdb)\n"
+" apagar el postmaster que atiende al clúster antiguo\n"
+" apagar el postmaster que atiende al clúster nuevo\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Cuando ejecute pg_ugpade, debe proveer la siguiente información:\n"
+" el directorio de datos del clúster antiguo (-d DATADIR)\n"
+" el directorio de datos del clúster nuevo (-D DATADIR)\n"
+" el directorio «bin» para la versión antigua (-b BINDIR)\n"
+" el directorio «bin» para la versión nueva (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Por ejemplo:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"o\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=clusterAntiguo/data\n"
+" $ export PGDATANEW=clusterNuevo/data\n"
+" $ export PGBINOLD=clusterAntiguo/bin\n"
+" $ export PGBINNEW=clusterNuevo/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=clusterAntiguo/data\n"
+" C:\\> set PGDATANEW=clusterNuevo/data\n"
+" C:\\> set PGBINOLD=clusterAntiguo/bin\n"
+" C:\\> set PGBINNEW=clusterNuevo/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Debe identificar el directorio donde %s.\n"
+"Por favor use la opción %s o la variable de ambiente %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Buscando el directorio de datos real para el clúster de origen"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Buscando el directorio de datos real para el clúster de destino"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "no se pudo obtener el directorio de datos usando %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "no se pudo leer la línea %d del archivo «%s»: %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "número de port entregado por el usuario %hu corregido a %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "no se pudo crear el proceso hijo: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "no se pudo crear el thread: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() falló: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "el proceso hijo terminó anormalmente: estado %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "el thread terminó anormalmente: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Llevando a cabo el Upgrade\n"
+"--------------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Seteando siguiente OID para el nuevo clúster"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Sincronizando directorio de datos a disco"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Actualización Completa\n"
+"----------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "nombre de directorio para el nuevo clúster es demasiado largo"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: no se pudo encontrar el ejecutable propio"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster antiguo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster nuevo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Estableciendo la configuración regional y codificación para el nuevo clúster"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analizando todas las filas en el clúster nuevo"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Congelando todas las filas en el nuevo clúster"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restaurando objetos globales en el nuevo clúster"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Restaurando esquemas de bases de datos en el clúster nuevo"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Eliminando archivos del nuevo %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "no se pudo eliminar directorio «%s»"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copiando el %s antiguo al nuevo servidor"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Estableciendo XID más antiguo para el nuevo clúster"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Seteando el ID de transacción y «época» siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Seteando el multixact ID y offset siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Seteando el multixact ID más antiguo en el nuevo clúster"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Reseteando los archivos de WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Seteando contadores frozenxid y minmxid en el clúster nuevo"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Seteando contador minmxid en el clúster nuevo"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonando archivos de relaciones de usuario"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copiando archivos de relaciones de usuario"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Enlazando archivos de relaciones de usuario"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "la base de datos «%s» no se encontró en el clúster nuevo"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se comprobaba la existencia del archivo «%s.%s» («%s» a «%s»); %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "reescribiendo «%s» a «%s»"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "clonando «%s» a «%s»"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "copiando «%s» a «%s»"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "enlazando «%s» a «%s»"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Falló, saliendo\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "ejecutando: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Orden SQL falló\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de versión «%s»: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "no se pudo interpretar el archivo de versión «%s»"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"no se pudo conectar al postmaster de origen iniciado con la orden:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"no se pudo conectar al postmaster de destino iniciado con la orden:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl no pudo iniciar el servidor de origen, o la conexión falló"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl no pudo iniciar el servidor de destino, o la conexión falló"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "la variable de ambiente libpq %s tiene un valor de servidor no-local: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"No se puede actualizar desde el mismo número de versión del catálogo\n"
+"cuando se están usando tablespaces."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "el directorio de tablespace «%s» no existe"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "no se pudo hace stat al directorio de tablespace «%s»: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "la ruta de tablespace «%s» no es un directorio"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "éxito"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Verificando datos de usuario de tipo «line» incompatible"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo de dato «line» en tablas de usuario. Este\n"
+"tipo de dato cambió su formato interno y de entrada/salida entre las\n"
+"versiones de sus clústers antiguo y nuevo, por lo que este clúster no puede\n"
+"actualmente ser actualizado. Puede eliminar las columnas problemáticas y\n"
+"reiniciar la actualización. Un listado de las columnas problemáticas está\n"
+"en el archivo:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Verificando columnas de usuario del tipo no válido «unknown»"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «unknown» en tablas de usuario.\n"
+"Este tipo ya no es permitido en tablas,\n"
+"por lo que este clúster no puede ser actualizado. Puede\n"
+"eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Verificando índices hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "atención"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. Después de la actualización, se le entregarán\n"
+"instrucciones de REINDEX."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos recreará\n"
+"los índices no válidos; hasta entonces, ninguno de esos índices será usado."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Verificando columnas de usuario del tipo «sql_identifier»"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo de dato «sql_identifier» en tablas de usuario.\n"
+"El formato en disco para este tipo de dato ha cambiado, por lo que\n"
+"este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Verificando actualizaciones para extensiones"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "aviso"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Su instalación tiene extensiones que deben ser actualizadas\n"
+"con la sentencia ALTER EXTENSION. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos\n"
+"actualizará estas extensiones."
diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po
new file mode 100644
index 0000000..3804324
--- /dev/null
+++ b/src/bin/pg_upgrade/po/fr.po
@@ -0,0 +1,2158 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-29 17:18+0000\n"
+"PO-Revision-Date: 2023-10-30 13:44+0100\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.4\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Exécution de tests de cohérence sur l'ancien serveur\n"
+"----------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Exécution de tests de cohérence\n"
+"-------------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Les instances sont compatibles*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n"
+"sur la nouvelle instance avant de continuer."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Les statistiques de l'optimiseur ne sont pas transférées par pg_upgrade.\n"
+"Une fois le nouveau serveur démarré, pensez à exécuter :\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"Exécuter ce script supprimera les fichiers de données de l'ancienne instance :\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"N'a pas pu créer un script pour supprimer les fichiers de données\n"
+"de l'ancienne instance parce que les tablespaces définis par l'utilisateur\n"
+"ou le répertoire de données de la nouvelle instance existent dans le répertoire\n"
+"de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n"
+"manuellement."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Vérification des versions des instances"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Cet outil peut seulement mettre à jour les versions %s et ultérieures de PostgreSQL."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Vérification des répertoires de tablespace de la nouvelle instance"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »"
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"AVERTISSEMENT : les emplacements des tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Création du script pour supprimer l'ancienne instance"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "n'a pas pu déterminer le nombre d'utilisateurs"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Vérification des paramètres de connexion de la base de données"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Tous les bases de données, en dehors de template0, doivent autoriser les connexions,\n"
+"autrement dit leur pg_database.datallowconn doit être à true. Votre installation contient\n"
+"des bases, hors template0, dont le pg_database.datallowconn est configuré à false.\n"
+"Autorisez les connections aux bases, hors template0, ou supprimez les bases qui\n"
+"n'autorisent pas les connexions. Une liste des bases problématiques se trouve dans\n"
+"le fichier :\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Vérification des transactions préparées"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "L'instance source contient des transactions préparées"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "L'instance cible contient des transactions préparées"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient les fonctions « contrib/isn » qui se basent sur le\n"
+"type de données bigint. Vos ancienne et nouvelle instances passent les valeurs\n"
+"bigint différemment, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez mettre à jour manuellement vos bases de données\n"
+"qui utilisent « contrib/isn », les supprimer de l'ancienne instance,\n"
+"relancer la mise à jour, puis les restaurer. Une liste des fonctions\n"
+"problématiques est disponible\n"
+"dans le fichier :\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Vérification des opérateurs postfixes définis par les utilisateurs"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des opérateurs postfixes définis par des utilisateurs,\n"
+"qui ne sont plus supportés. Supprimez les opérateurs postfixes et remplacez-les\n"
+"avec des opérateurs préfixes ou des appels de fonctions.\n"
+"Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Vérification des fonctions polymorphiques incompatibles"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des objets définis par les utilisateurs qui font\n"
+"référence à des fonctions polymorphiques internes avec des arguments de\n"
+"type « anyarray » ou « anyelement ». Ces objets doivent être supprimés\n"
+"avant de mettre à jour, puis ils pourront être restaurés, en les changeant\n"
+"pour faire référence aux nouvelles fonctions correspondantes avec des\n"
+"arguments de type « anycompatiblearray » et « anycompatible ». Une liste\n"
+"des objets problématiques se trouve dans le fichier\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Vérification des tables WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des tables déclarées avec WITH OIDS, ce qui n'est plus supporté.\n"
+"Pensez à supprimer la colonne oid en utilisant\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Une liste des tables ayant ce problème se trouve dans le fichier :\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Vérification des types composites définis par le système dans les tables utilisateurs"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des types composites définis par le système dans vos tables\n"
+"utilisateurs. Les OID de ces types ne sont pas stables entre différentes versions\n"
+"de PostgreSQL, donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Vérification des types de données reg* dans les tables utilisateurs"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient un des types de données reg* dans vos tables\n"
+"utilisateurs. Ces types de données référencent des OID système qui ne sont\n"
+"pas préservés par pg_upgrade, donc cette instance ne peut pas être mise à\n"
+"jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n"
+"la mise à jour. Une liste des colonnes problématiques est disponible dans le\n"
+"fichier :\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Vérification du type de données « %s » incompatible dans les tables utilisateurs"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient un type de données « aclitem » dans vos tables utilisateurs.\n"
+"Le format interne de « aclitem » a changé lors du développement de la version 16, donc\n"
+"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n"
+"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n"
+"est disponible dans le fichier :\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Vérification du type de données « %s » supprimé dans les tables utilisateurs"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « %s » dans les tables utilisateurs.\n"
+"Le type «%s » a été supprimé dans PostgreSQL version %s,\n"
+"donc cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques ou les convertir en un autre type de données,\n"
+"et relancer la mise à jour. Vous trouverez une liste des colonnes problématiques dans\n"
+"le fichier :\n"
+" %s\\"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Vérification des types de données « jsonb » incompatibles"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient un type de données « jsonb » dans vos tables utilisateurs.\n"
+"Le format interne de « jsonb » a changé lors du développement de la version 9.4 beta, donc\n"
+"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n"
+"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n"
+"est disponible dans le fichier :\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Vérification des rôles commençant avec « pg_ »"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des rôles commençant par « pg_ ».\n"
+"\"pg_\" est un préfixe réservé aux rôles systèmes. L'instance\n"
+"ne peut pas être mise à jour tant que ces rôles ne sont pas renommés.\n"
+"Une liste des rôles commençant par « pg_ » se trouve dans le fichier :\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Vérification des conversions d'encodage définies par les utilisateurs"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des conversions définies par un utilisateur.\n"
+"Les paramètres des fonctions de conversion ont changé dans PostgreSQL version 14\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous devez supprimer\n"
+"les conversions d'encodage de l'ancienne instance puis relancer la mise à jour.\n"
+"Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "n'a pas pu obtenir les données de contrôle en utilisant %s : %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d : problème sur l'état de l'instance de la base de données"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "L'instance source n'a pas été arrêtée proprement."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "L'instance cible n'a pas été arrêtée proprement."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Il manque certaines informations d'état requises sur l'instance source :"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Il manque certaines informations d'état requises sur l'instance cible :"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d : problème avec pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d : problème de récupération des controldata"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance source :"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " XID du prochain checkpoint"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " prochain OID du dernier checkpoint"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " prochain MultiXactId du dernier checkpoint"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " plus ancien MultiXactId du dernier checkpoint"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " oldestXID du dernier checkpoint"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " prochain MultiXactOffset du dernier checkpoint"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " premier segment WAL après réinitialisation"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " méthode de passage de arguments float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " alignement maximale"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " taille de bloc"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " taille de segment des relations"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " taille de bloc d'un WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " taille d'un segment WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " longueur maximum d'un identifiant"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " nombre maximum de colonnes indexées"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " taille maximale d'un morceau de TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " taille d'un morceau Large-Object"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " les dates/heures sont-ils des integers?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " version des sommes de contrôle des données"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+"Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits."
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Ajout du suffixe « .old » à l'ancien global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Si vous voulez démarrer l'ancienne instance, vous devez supprimer\n"
+"le suffixe « .old » du fichier %s/global/pg_control.old.\n"
+"\n"
+"Comme le mode lien était utilisé, l'ancienne instance ne peut pas\n"
+"être démarré proprement une fois que la nouvelle instance a été démarrée."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Création de la sauvegarde des objets globaux"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Création de la sauvegarde des schémas des bases"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "commande trop longue"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*échec*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Il y a eu des problèmes lors de l'exécution de « %s »"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consultez les dernières lignes de « %s » ou « %s » pour\n"
+"trouver la cause probable de l'échec."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consultez les dernières lignes de « %s » pour\n"
+"trouver la cause probable de l'échec."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "n'a pas pu écrire dans le fichier de traces « %s »"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "échec de la vérification de « %s » : %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "« %s » n'est pas un répertoire"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "échec de la vérification de « %s » : %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "échec de la vérification de « %s » : ne peut pas exécuter"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "échec de la vérification de « %s » : version incorrecte : « %s » trouvée, « %s » attendue"
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu lire le fichier « %s » : %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu écrire le fichier « %s » : %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » (« %s » à « %s ») : %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors de la création du lien pour la relation « %s.%s » (« %s » à « %s ») : %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu tester le fichier « %s » : %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "erreur lors de la copie de la relation « %s.%s » : page partielle trouvée dans le fichier « %s »"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "n'a pas pu cloner le fichier entre l'ancien et le nouveau répertoires : %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "n'a pas pu créer le fichier « %s » : %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "clonage de fichiers non supporté sur cette plateforme"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %s\n"
+"Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Vérification de la présence des bibliothèques requises"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "n'a pas pu charger la bibliothèque « %s » : %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "Dans la base de données : %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation référence des bibliothèques chargeables, mais manquantes sur\n"
+"la nouvelle installation. Vous pouvez ajouter ces bibliothèques à la nouvelle\n"
+"installation ou supprimer les fonctions les utilisant dans l'ancienne installation.\n"
+"Une liste des bibliothèques problématiques est disponible dans le fichier :\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »"
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " qui est un index sur \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " qui est un index sur l'OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " qui est la table TOAST pour « %s.%s »"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " qui est la table TOAST pour l'OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"bases de données sources :"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"bases de données cibles :"
+
+# /* SQL2003 mandates this error if there was no ELSE clause */
+# if (!stmt->have_else)
+# ereport(ERROR,
+# (errcode(ERRCODE_CASE_NOT_FOUND),
+# errmsg("case not found"),
+# errhint("CASE statement is missing ELSE part.")));
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 introuvable"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Base de données : %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname : %s.%s : reloid : %u reltblspace : %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s : ne peut pas être exécuté en tant que root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ancien numéro de port invalide"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "nouveau numéro de port invalide"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Exécution en mode verbeux"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "les binaires de l'ancienne instance résident"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "les binaires de la nouvelle instance résident"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "les données de l'ancienne instance résident"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "les données de la nouvelle instance résident"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "les sockets seront créés"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "n'a pas pu déterminer le répertoire courant"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade met à jour une instance PostgreSQL vers une version majeure\n"
+"différente.\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=RÉP_BIN répertoire des exécutables de l'ancienne\n"
+" instance\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=RÉP_BIN répertoire des exécutables de la nouvelle\n"
+" instance (par défaut, le même répertoire que\n"
+" pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check vérifie seulement les instances, pas de\n"
+" modifications\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=RÉP_DONNÉES répertoire des données de l'ancienne instance\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=RÉP_DONNÉES répertoire des données de la nouvelle instance\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr ""
+" -j, --jobs=NUM nombre de processus ou threads simultanés à\n"
+" utiliser\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link lie les fichiers au lieu de les copier vers la\n"
+" nouvelle instance\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient proprement\n"
+" écrites sur disque\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=OPTIONS options à passer au serveur de l'ancienne\n"
+" instance\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=OPTIONS options à passer au serveur de la nouvelle\n"
+" instance\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=PORT numéro de port de l'ancienne instance (par\n"
+" défaut %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=PORT numéro de port de la nouvelle instance (par\n"
+" défaut %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain conserve les fichiers SQL et de traces en cas\n"
+" de succès\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=RÉP_SOCKET répertoire de la socket à utiliser (par défaut\n"
+" le répertoire courant)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=NOM super-utilisateur de l'instance (par défaut\n"
+" « %s »)\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose active des traces internes verbeuses\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone clone au lieu de copier les fichiers vers la\n"
+" nouvelle instance\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy copie les fichiers vers la nouvelle instance (par défaut)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Avant d'exécuter pg_upgrade, vous devez :\n"
+" créer une nouvelle instance (en utilisant la nouvelle version d'initdb)\n"
+" arrêter le postmaster de l'ancienne instance\n"
+" arrêter le postmaster de la nouvelle instance\n"
+"\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Quand vous exécutez pg_upgrade, vous devez fournir les informations suivantes :\n"
+" le répertoire de données pour l'ancienne instance (-d RÉP_DONNÉES)\n"
+" le répertoire de données pour la nouvelle instance (-D RÉP_DONNÉES)\n"
+" le répertoire « bin » pour l'ancienne version (-b RÉP_BIN)\n"
+" le répertoire « bin » pour la nouvelle version (-B RÉP_BIN)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Par exemple :\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ou\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Vous devez identifier le répertoire où le %s.\n"
+"Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance source"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance cible"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "n'a pas pu créer le processus de travail : %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "n'a pas pu créer le fil de travail: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "échec de %s() : %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "le processus fils a quitté anormalement : statut %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "le processus fils a quitté anormalement : %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Réalisation de la mise à jour\n"
+"-----------------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Configuration du prochain OID sur la nouvelle instance"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisation du répertoire des données sur disque"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Mise à jour terminée\n"
+"--------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "le chemin du répertoire pour la nouvelle instance est trop long"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Il semble qu'un postmaster est démarré sur l'ancienne instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Il semble qu'un postmaster est démarré sur la nouvelle instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Configuration de la locale et de l'encodage pour la nouvelle instance"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyse de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Gel de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restauration des objets globaux dans la nouvelle instance"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Restauration des schémas des bases de données dans la nouvelle instance"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Suppression des fichiers à partir du nouveau %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "n'a pas pu supprimer le répertoire « %s »"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copie de l'ancien %s vers le nouveau serveur"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Configuration du plus ancien XID sur la nouvelle instance"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Réinitialisation des archives WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Configuration du compteur minmxid dans la nouvelle instance"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonage des fichiers des relations utilisateurs"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copie des fichiers des relations utilisateurs"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Création des liens pour les fichiers des relations utilisateurs"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "réécriture de « %s » en « %s »"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "clonage de « %s » en « %s »"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "copie de « %s » en « %s »"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "lien de « %s » vers « %s »"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Échec, sortie\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "exécution : %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"La commande SQL a échoué\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "n'a pas pu analyser le fichier de version « %s »"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"n'a pas pu se connecter au postmaster source lancé avec la commande :\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"n'a pas pu se connecter au postmaster cible lancé avec la commande :\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Ne peut pas mettre à jour vers ou à partir de la même version de\n"
+"catalogue système quand des tablespaces sont utilisés."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "le répertoire « %s » du tablespace n'existe pas"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "le chemin « %s » du tablespace n'est pas un répertoire"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Vérification des types de données line incompatibles"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « line » dans vos tables utilisateurs.\n"
+"Ce type de données a changé de format interne et en entrée/sortie entre vos ancienne\n"
+"et nouvelle versions, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez supprimer les colonnes problématiques et relancer la mise à jour.\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Vérification des colonnes utilisateurs « unknown » invalides"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « unknown » dans vos tables\n"
+"utilisateurs. Ce type de données n'est plus autorisé dans les tables, donc\n"
+"cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Vérification des index hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "attention"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Votre installation contient des index hashs. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n"
+"être recréés avec la commande REINDEX. Après la mise à jour, les instructions\n"
+"REINDEX vous seront données."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Votre installation contient des index hash. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n"
+"être recréés avec la commande REINDEX. Le fichier :\n"
+" %s\n"
+"une fois exécuté par psql en tant que superutilisateur va recréer tous les\n"
+"index invalides. Avant cela, aucun de ces index ne sera utilisé."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « sql_identifier » dans les tables\n"
+"utilisateurs. Le format sur disque pour ce type de données a changé,\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer\n"
+"les colonnes problématiques, puis relancer la mise à jour.\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Vérification des mises à jour d'extension"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "notice"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Votre installation contient des extensions qui doivent être\n"
+"mises à jour avec la commande ALTER EXTENSION. Le fichier\n"
+" %s\n"
+"une fois exécuté par psql par le superutilisateur mettre à jour\n"
+"ces extensions."
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "The old cluster has a \"plpython_call_handler\" function defined\n"
+#~ "in the \"public\" schema which is a duplicate of the one defined\n"
+#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n"
+#~ "in psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "The \"public\" schema version of this function was created by a\n"
+#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+#~ "to complete because it references a now-obsolete \"plpython\"\n"
+#~ "shared object file. You can remove the \"public\" schema version\n"
+#~ "of this function by running the following command:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "in each affected database:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "L'ancienne instance comprend une fonction « plpython_call_handler »\n"
+#~ "définie dans le schéma « public » qui est un duplicat de celle définie\n"
+#~ "dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n"
+#~ "exécutant dans psql :\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "La version de cette fonction dans le schéma « public » a été créée\n"
+#~ "par une installation de plpython antérieure à la version 8.1 et doit\n"
+#~ "être supprimée pour que pg_upgrade puisse termine parce qu'elle\n"
+#~ "référence un fichier objet partagé « plpython » maintenant obsolète.\n"
+#~ "Vous pouvez supprimer la version de cette fonction dans le schéma\n"
+#~ "« public » en exécutant la commande suivante :\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "dans chaque base de données affectée :\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table, so default permissions must be\n"
+#~ "defined for all large objects. The file\n"
+#~ " %s\n"
+#~ "when executed by psql by the database superuser will set the default\n"
+#~ "permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Votre installation contient des Large Objects. La nouvelle base de données\n"
+#~ "a une table de droit supplémentaire pour les Large Objects, donc les droits\n"
+#~ "par défaut doivent être définies pour tous les Large Objects. Le fichier\n"
+#~ " %s\n"
+#~ "une fois exécuté par psql avec un superutilisateur définira les droits par\n"
+#~ "défaut.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table. After upgrading, you will be\n"
+#~ "given a command to populate the pg_largeobject_metadata table with\n"
+#~ "default permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n"
+#~ "Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "échec de la connexion à la base de données : %s"
+
+#, c-format
+#~ msgid " "
+#~ msgstr " "
+
+#, c-format
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid ""
+#~ " --index-collation-versions-unknown\n"
+#~ " mark text indexes as needing to be rebuilt\n"
+#~ msgstr ""
+#~ " --index-collation-versions-unknown\n"
+#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n"
+
+#, c-format
+#~ msgid "\"%s\" is not a directory\n"
+#~ msgstr "« %s » n'est pas un répertoire\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "%s is not a directory\n"
+#~ msgstr "%s n'est pas un répertoire\n"
+
+#, c-format
+#~ msgid "%s.%s: %u to %u\n"
+#~ msgstr "%s.%s : %u vers %u\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#, c-format
+#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+#~ msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n"
+
+#, c-format
+#~ msgid "Checking for large objects"
+#~ msgstr "Vérification des Large Objects"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Création d'un script pour analyser la nouvelle instance"
+
+#, c-format
+#~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les valeurs de la locale ICU de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n"
+#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n"
+#~ "serveur démarré, pensez à exécuter :\n"
+#~ " %s\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Remove the problem functions from the old cluster to continue.\n"
+#~ msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "L'instance source contient des rôles commençant avec « pg_ »\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "L'instance cible contient des rôles commençant avec « pg_ »\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n"
+#~ "à cause de changements dans l'API du moteur fait lors du développement.\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "Incapable de renommer %s à %s.\n"
+
+#, c-format
+#~ msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+#~ msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n"
+
+#~ msgid "cannot find current directory\n"
+#~ msgstr "ne peut pas trouver le répertoire courant\n"
+
+#~ msgid "cannot write to log file %s\n"
+#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr "échec de la vérification de « %s » : ne peut pas exécuter (droit refusé)\n"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr "échec de la vérification de « %s » : ne peut pas lire le fichier (droit refusé)\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "échec de la vérification de « %s » : pas un fichier régulier\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "échec de la connexion à la base de données : %s"
+
+#, c-format
+#~ msgid "could not access directory \"%s\": %m\n"
+#~ msgstr "n'a pas pu accéder au répertoire « %s » : %m\n"
+
+#, c-format
+#~ msgid "could not create directory \"%s\": %m\n"
+#~ msgstr "n'a pas pu créer le répertoire « %s » : %m\n"
+
+#~ msgid ""
+#~ "could not load library \"%s\":\n"
+#~ "%s\n"
+#~ msgstr ""
+#~ "n'a pas pu charger la biblothèque « %s »:\n"
+#~ "%s\n"
+
+#, c-format
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#, c-format
+#~ msgid "could not open log file \"%s\": %m\n"
+#~ msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n"
+
+#, c-format
+#~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les encodages de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "a échoué pour obtenir le nom de la locale système « %s »\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "a échoué pour obtenir la locale courante\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "a échoué pour restaurer l'ancienne locale « %s »\n"
+
+#, c-format
+#~ msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les valeurs de lc_collate de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les valeurs de lc_ctype de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les fournisseurs de locale pour la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "mappings for database \"%s\":\n"
+#~ msgstr "correspondances pour la base de données « %s » :\n"
+
+#, c-format
+#~ msgid "out of memory\n"
+#~ msgstr "mémoire épuisée\n"
+
+#, c-format
+#~ msgid "too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "waitpid() failed: %s\n"
+#~ msgstr "échec de waitpid() : %s\n"
diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po
new file mode 100644
index 0000000..16aaa15
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ja.po
@@ -0,0 +1,1828 @@
+# pg_upgrade.po
+# Japanese message translation file for pg_upgrade
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-26 10:21+0900\n"
+"PO-Revision-Date: 2023-09-26 11:38+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"å…ƒã®å®Ÿè¡Œä¸­ã‚µãƒ¼ãƒãƒ¼ã®ä¸€è²«æ€§ãƒã‚§ãƒƒã‚¯ã‚’実行ã—ã¦ã„ã¾ã™ã€‚\n"
+"--------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã‚’実行ã—ã¦ã„ã¾ã™ã€‚\n"
+"-----------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"* クラスタã¯äº’æ›æ€§ãŒã‚ã‚Šã¾ã™ *"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"ã“ã®å¾Œpg_upgradeãŒå¤±æ•—ã—ãŸå ´åˆã¯ã€ç¶šã‘ã‚‹å‰ã«æ–°ã—ã„クラスタを\n"
+"initdbã§å†ä½œæˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"オプティマイザーã®çµ±è¨ˆã¯ã€pg_upgrade ã§ã¯è»¢é€ã•ã‚Œã¾ã›ã‚“。ãã®ãŸã‚\n"
+"新サーãƒãƒ¼ã‚’èµ·å‹•ã—ãŸå¾Œã€ä»¥ä¸‹ã‚’è¡Œã†ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹ã¨ã€æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ãŒå‰Šé™¤ã•ã‚Œã¾ã™:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"ユーザー定義ã®ãƒ†ãƒ¼ãƒ–ル空間もã—ãã¯æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒ\n"
+"旧クラスタã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã«å­˜åœ¨ã™ã‚‹ãŸã‚ã€æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã®ãƒ‡ãƒ¼ã‚¿\n"
+"ファイルを削除ã™ã‚‹ãŸã‚ã®ã‚¹ã‚¯ãƒªãƒ—トを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ å¤ã„\n"
+"クラスタã®å†…容ã¯æ‰‹å‹•ã§å‰Šé™¤ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "クラスタã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "ã“ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã§ã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³%s以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰ã®ã¿ã‚¢ãƒƒãƒ—グレードã§ãã¾ã™ã€‚"
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "ã“ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¯ã€PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã«ã®ã¿ã‚¢ãƒƒãƒ—グレードã§ãã¾ã™ã€‚"
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "ã“ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¯ PostgreSQL ã®éŽåŽ»ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã™ã‚‹ç”¨é€”ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。"
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "旧クラスタã®ãƒ‡ãƒ¼ã‚¿ã¨ãƒã‚¤ãƒŠãƒªã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ç•°ãªã‚‹ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®ã§ã™ã€‚"
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "新クラスタã®ãƒ‡ãƒ¼ã‚¿ã¨ãƒã‚¤ãƒŠãƒªã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ç•°ãªã‚‹ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®ã§ã™ã€‚"
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "稼åƒä¸­ã®ã‚µãƒ¼ãƒãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹å ´åˆã€æ–°æ—§ã®ãƒãƒ¼ãƒˆç•ªå·ãŒç•°ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "新クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ãŒç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“: リレーション\"%s.%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "æ–°ã—ã„クラスタã®ãƒ†ãƒ¼ãƒ–ル空間ディレクトリを確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "æ–°ã—ã„クラスタã®ãƒ†ãƒ¼ãƒ–ル空間ディレクトリã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: 新データディレクトリãŒæ—§ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¤ã¾ã‚Š %sã®ä¸­ã«ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: ユーザー定義テーブル空間ã®å ´æ‰€ãŒãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¤ã¾ã‚Š %s ã®ä¸­ã«ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“。"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "旧クラスタを削除ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トを作æˆã—ã¦ã„ã¾ã™"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "ファイル\"%s\"ã«å®Ÿè¡Œæ¨©é™ã‚’追加ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "データベースユーザーãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã©ã†ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "データベースユーザー\"%s\"ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "ユーザー数を特定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "新クラスタ内ã§å®šç¾©ã§ãã‚‹ã®ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ã§ã™ã€‚"
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "データベース接続ã®è¨­å®šã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 ã«ã¯æŽ¥ç¶šã‚’許å¯ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã™ãªã‚ã¡ã€pg_database.datallowconn 㯠false ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "致命的"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"template0ã§ã¯ãªã„ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯æŽ¥ç¶šã‚’許å¯ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ã€ã¤ã¾ã‚Š\n"
+"pg_database.datallowconnãŒtrueã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯\n"
+"pg_database.datallowconnãŒfalseã¨ãªã£ã¦ã„ã‚‹template0以外ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒ\n"
+"存在ã—ã¦ã„ã¾ã™ã€‚template0以外ã®ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æŽ¥ç¶šã‚’許å¯ã™ã‚‹ã‹ã€æŽ¥ç¶šãŒ\n"
+"許å¯ã•ã‚Œãªã„データベースをã™ã¹ã¦å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。å•é¡Œã®ã‚るデータベースã®\n"
+"一覧ãŒä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "移行元クラスタã«æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã™"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "移行先クラスタã«æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã™"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint を渡ã™éš›ã«ãƒŸã‚¹ãƒžãƒƒãƒãŒç™ºç”Ÿã™ã‚‹ contrib/isn ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ã€bigintデータ型ã«ä¾å­˜ã™ã‚‹ã€Œcontrib/isnã€ã®é–¢æ•°ãŒ\n"
+"å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚æ–°æ—§ã®ã‚¯ãƒ©ã‚¹ã‚¿é–“ã§ã®bigint値ã®å—ã‘渡ã—方法ãŒç•°ãªã‚‹ãŸã‚ã€\n"
+"ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n"
+"旧クラスタ中ã®ã€Œcontrib/isnã€ã®é–¢æ•°ç­‰ã‚’使ã†ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’手動ã§ãƒ€ãƒ³ãƒ—ã—ã¦ã€\n"
+"ãれらを削除ã—ã¦ã‹ã‚‰ã‚¢ãƒƒãƒ—グレードを実行ã—ã€ãã®å¾Œå‰Šé™¤ã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’\n"
+"リストアã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \n"
+"å•é¡Œã®ã‚る関数ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "ユーザー定義ã®å¾Œç½®æ¼”ç®—å­ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ã®å¾Œç½®æ¼”ç®—å­ãŒå­˜åœ¨ã—ã¾ã™ãŒã€ã“ã‚Œã¯ä»Šå¾Œ\n"
+"サãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“。後置演算å­ã‚’削除ã™ã‚‹ã‹ã€å‰ç½®æ¼”ç®—å­ã‚ã‚‹ã„ã¯é–¢æ•°\n"
+"呼ã³å‡ºã—ã§ç½®ãæ›ãˆã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„:\n"
+"以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©å¾Œç½®æ¼”ç®—å­ã®ä¸€è¦§ãŒã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "éžäº’æ›ã®å¤šæ…‹é–¢æ•°ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ã€\"anyarray\"ã¾ãŸã¯\"anyelement\"åž‹ã®å¼•æ•°ã‚’æŒã¤å†…部多態関数を\n"
+"å‚ç…§ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ã®ã‚ªãƒ–ジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“れらã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ã‚ªãƒ–ジェクトã¯\n"
+"アップグレードå‰ã«å‰Šé™¤ã—ã¦ã€ã®ã¡ã«\"anycompatiblearray\"ãŠã‚ˆã³\"anycompatible\"ã‚’\n"
+"引数ã¨ã™ã‚‹å¯¾å¿œã™ã‚‹æ–°ã—ã„関数をå‚ç…§ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã—ã¦å¾©å…ƒã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"å•é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS宣言ã•ã‚ŒãŸãƒ†ãƒ¼ãƒ–ルをãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯WITH OIDS宣言ã•ã‚ŒãŸãƒ†ãƒ¼ãƒ–ルãŒå­˜åœ¨ã—ã¾ã™ãŒã€ã“ã‚Œã¯ä»Šå¾Œ\n"
+"サãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“。以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§oidカラムを削除ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã“ã®å•é¡Œã‚’抱ãˆã‚‹ãƒ†ãƒ¼ãƒ–ルã®ä¸€è¦§ãŒã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "ユーザーテーブル内ã®ã‚·ã‚¹ãƒ†ãƒ å®šç¾©è¤‡åˆåž‹ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿å†…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ã¯ã€ã‚·ã‚¹ãƒ†ãƒ å®šç¾©ã®è¤‡åˆãƒ‡ãƒ¼ã‚¿åž‹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“れらã®ãƒ‡ãƒ¼ã‚¿åž‹ã®OIDã¯PostgreSQLã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã«ã‚ãŸã£ã¦ä¸å¤‰ã§ã¯ãªã„ãŸã‚ã€\n"
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•é¡Œã®åˆ—を削除ã—ãŸã®ã¡ã«\n"
+"アップグレードをå†å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™: \n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "ユーザーテーブル内㮠reg * データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«reg*データ型ã®ã²ã¨ã¤ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“れらã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã‚·ã‚¹ãƒ†ãƒ OIDã‚’å‚ç…§ã—ã¾ã™ãŒã€ã“れ㯠pg_upgradeã§ã¯\n"
+"ä¿å­˜ã•ã‚Œãªã„ãŸã‚ã€ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n"
+"å•é¡Œã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "ユーザーテーブル中ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹éžäº’æ›ã®\"%s\"データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"aclitem\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“ã®åž‹ã®å†…部フォーマットã¯PostgreSQL ãƒãƒ¼ã‚¸ãƒ§ãƒ³16ã§å¤‰æ›´ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€\n"
+"ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n"
+"å•é¡Œã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "ユーザーテーブル中ã§ä½¿ç”¨ã•ã‚Œã¦ã„る削除ã•ã‚ŒãŸ\"%s\"データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ãƒ‡ãƒ¼ã‚¿åž‹\"%s\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“ã®\"%s\"åž‹ã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã§ã¯å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€ãã®ãŸã‚ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯\n"
+"ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•é¡Œã®åˆ—を削除ã™ã‚‹ã‹ã€ä»–ã®ãƒ‡ãƒ¼ã‚¿åž‹ã«å¤‰æ›´ã—ãŸå¾Œã«\n"
+"アップグレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™: \n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "互æ›æ€§ã®ãªã„\"jsonb\"データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"jsonb\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“ã®åž‹ã®å†…部フォーマットã¯9.4ベータã®é–“ã«å¤‰æ›´ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ç¾æ™‚点ã§ã¯ã“ã®\n"
+"クラスタをアップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n"
+"å•é¡Œã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "'pg_' ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯\"pg_\"ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"\"pg_\"ã¯ã‚·ã‚¹ãƒ†ãƒ ãƒ­ãƒ¼ãƒ«ã®ãŸã‚ã«äºˆç´„ã•ã‚Œã¦ã„る接頭辞ã§ã€ã“れらã®ãƒ­ãƒ¼ãƒ«ã®\n"
+"åå‰ã‚’変更ã—ãªã„ã¨pg_upgradeã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯\n"
+"ã§ãã¾ã›ã‚“。\n"
+"\"pg_\"ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "ユーザー定義ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"変æ›é–¢æ•°ã®ãƒ‘ラメータãŒPostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³14ã§å¤‰æ›´ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€\n"
+"ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n"
+"旧クラスタ内ã®ãれらã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ã‚’削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードを\n"
+"å†å®Ÿè¡Œã§ãã¾ã™ã€‚\n"
+"ユーザー定義ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "%s ã§åˆ¶å¾¡æƒ…å ±ãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: データベースクラスタã®çŠ¶æ…‹ç•°å¸¸"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "移行元クラスタã¯ãƒªã‚«ãƒãƒªãƒ¢ãƒ¼ãƒ‰ä¸­ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ã¾ã™ã€‚アップグレードをã™ã‚‹ã«ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®é€šã‚Šã« \"rsync\" を実行ã™ã‚‹ã‹ã€ãƒ—ライマリã¨ã—ã¦ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¦ãã ã•ã„。"
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "移行先クラスタã¯ãƒªã‚«ãƒãƒªãƒ¢ãƒ¼ãƒ‰ä¸­ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ã¾ã™ã€‚アップグレードをã™ã‚‹ã«ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã®é€šã‚Šã« \"rsync\" を実行ã™ã‚‹ã‹ã€ãƒ—ライマリã¨ã—ã¦ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¦ãã ã•ã„。"
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "移行元クラスタã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "移行先クラスタã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "移行元クラスタã«ã‚¯ãƒ©ã‚¹ã‚¿çŠ¶æ…‹æƒ…å ±ãŒã‚ã‚Šã¾ã›ã‚“:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "移行先クラスタã«ã‚¯ãƒ©ã‚¹ã‚¿çŠ¶æ…‹æƒ…å ±ãŒã‚ã‚Šã¾ã›ã‚“:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal ã§å•é¡Œç™ºç”Ÿ"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: 制御情報ã®å–å¾—ã§å•é¡Œç™ºç”Ÿ"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "移行元クラスタã«å¿…è¦ãªåˆ¶å¾¡æƒ…å ±ã®ä¸€éƒ¨ãŒã‚ã‚Šã¾ã›ã‚“:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "移行先クラスタã«å¿…è¦ãªåˆ¶å¾¡æƒ…å ±ã®ä¸€éƒ¨ãŒã‚ã‚Šã¾ã›ã‚“:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る最å¤ã®MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る最å¤ã®XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " リセット後ã®æœ€åˆã®WALセグメント"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8引数ã®å¼•ã渡ã—方法"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " 最大アラインメント"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " ブロックサイズ"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " 大ããªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã®ã‚µã‚¤ã‚º"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WALã®ãƒ–ロックサイズ"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WALã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚º"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " 識別å­ã®æœ€å¤§é•·"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " インデックス対象カラムã®æœ€å¤§æ•°"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " 最大ã®TOASTãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚º"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " ラージオブジェクトã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚º"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " 日付/時間ãŒæ•´æ•°?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "å¿…è¦ãªåˆ¶å¾¡æƒ…å ±ãŒãªã„ã®ã§ç¶šè¡Œã§ãã¾ã›ã‚“。終了ã—ã¾ã™"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"æ–°æ—§ã®pg_controldataã®ã‚¢ãƒ©ã‚¤ãƒ³ãƒ¡ãƒ³ãƒˆãŒä¸æ­£ã§ã‚ã‚‹ã‹ã‹ã¾ãŸã¯ä¸€è‡´ã—ã¾ã›ã‚“\n"
+"一方ã®ã‚¯ãƒ©ã‚¹ã‚¿ãŒ32ビットã§ã€ä»–æ–¹ãŒ64ビットã§ã‚ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã§ã™"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘るブロックサイズãŒæœ‰åŠ¹ã§ãªã„ã‹ã¾ãŸã¯ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘るリレーションã®æœ€å¤§ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæœ‰åŠ¹ã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘ã‚‹ WAL ブロックサイズãŒæœ‰åŠ¹ã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘ã‚‹WALセグメントサイズãŒæœ‰åŠ¹ã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘る識別å­ã®æœ€å¤§é•·ãŒæœ‰åŠ¹ã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘るインデックス付ã列ã®æœ€å¤§æ•°ãŒæœ‰åŠ¹ã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘ã‚‹TOASTãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºã®æœ€å¤§å€¤ãŒæœ‰åŠ¹ã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘るラージオブジェクトã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºãŒæœ‰åŠ¹ã§ãªã„ã‹ã¾ãŸã¯ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "新旧㮠pg_controldata ã«ãŠã‘る日付/時刻型データã®ä¿å­˜ãƒã‚¤ãƒˆæ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "旧クラスタã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用ã—ã¦ã„ã¾ã›ã‚“ãŒã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ä½¿ç”¨ã—ã¦ã„ã¾ã™"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "旧クラスタã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用ã—ã¦ã„ã¾ã™ãŒã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ä½¿ç”¨ã—ã¦ã„ã¾ã›ã‚“"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "新旧㮠pg_controldata é–“ã§ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "旧㮠global/pg_control ã« \".old\" サフィックスを追加ã—ã¦ã„ã¾ã™"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"旧クラスタを起動ã™ã‚‹å ´åˆã€%s/global/pg_control.oldã‹ã‚‰\n"
+"\".old\"æ‹¡å¼µå­ã‚’削除ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚「リンクã€ãƒ¢ãƒ¼ãƒ‰ãŒä½¿ã‚ã‚Œã¦\n"
+"ã„ã‚‹ãŸã‚ã€ä¸€åº¦æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã‚’èµ·å‹•ã—ã¦ã—ã¾ã†ã¨æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã¯å®‰å…¨ã«èµ·å‹•\n"
+"ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "グローãƒãƒ«ã‚ªãƒ–ジェクトã®ãƒ€ãƒ³ãƒ—を作æˆã—ã¦ã„ã¾ã™"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "データベーススキーマã®ãƒ€ãƒ³ãƒ—を作æˆã—ã¦ã„ã¾ã™ã€‚"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "%s ã§pg_ctlã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "%s ã‹ã‚‰pg_ctlã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³å‡ºåŠ›ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "コマンドãŒé•·ã™ãŽã¾ã™"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失敗*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr ""
+"\"%s実行ã§å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
+"`1"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "ã‚ã‚Šã†ã‚‹å¤±æ•—ã®åŽŸå› ã«ã¤ã„ã¦ã¯\"%s\"ã¾ãŸã¯\"%s\"ã®æœ€å¾Œã®æ•°è¡Œã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "ã‚ã‚Šã†ã‚‹å¤±æ•—ã®åŽŸå› ã«ã¤ã„ã¦ã¯ã€\"%s\"ã®æœ€å¾Œã®æ•°è¡Œã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "ログファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "ファイル\"%s\"を読ã¿å–り用ã¨ã—ã¦ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ:%s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "カレントディレクトリã«å¯¾ã—ã¦èª­ã¿æ›¸ãå¯èƒ½ãªã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒå¿…è¦ã§ã™ã€‚"
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\"ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "\"%s\"ã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸ: 実行ã§ãã¾ã›ã‚“"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "\"%s\"ã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸ: é–“é•ã£ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³: 検出\"%s\"ã€æƒ³å®š\"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)クローン中ã«ã‚¨ãƒ©ãƒ¼: %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)コピー中ã«ã‚¨ãƒ©ãƒ¼: %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)リンク作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼: %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’statã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"中ã«ä¸å®Œå…¨ãªãƒšãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã—ãŸ"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "新旧ディレクトリ間ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ­ãƒ¼ãƒ³ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ­ãƒ¼ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"æ–°æ—§ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé–“ã§ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+"リンクモードã§ã¯ã€æ–°æ—§ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«å­˜åœ¨ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "å¿…è¦ãªãƒ©ã‚¤ãƒ–ラリã®æœ‰ç„¡ã‚’確èªã—ã¦ã„ã¾ã™"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ライブラリ\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "データベース: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ç§»è¡Œå…ˆã®ç’°å¢ƒã«ã¯ãªã„ロードå¯èƒ½ãƒ©ã‚¤ãƒ–ラリをå‚ç…§ã—ã¦ã„ã¾ã™ã€‚\n"
+"ã“れらã®ãƒ©ã‚¤ãƒ–ラリを移行先ã®ç’°å¢ƒã«è¿½åŠ ã™ã‚‹ã‹ã€ã‚‚ã—ãã¯ç§»è¡Œå…ƒã®ç’°å¢ƒã‹ã‚‰\n"
+"ãれらを使ã£ã¦ã„る関数を削除ã—ã¦ãã ã•ã„。 å•é¡Œã®ãƒ©ã‚¤ãƒ–ラリã®ä¸€è¦§ã¯ã€\n"
+"以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å…¥ã£ã¦ã„ã¾ã™:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "データベース\"%2$s\"㧠OID %1$u ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³åãŒä¸€è‡´ã—ã¾ã›ã‚“: å…ƒã®åå‰ \"%3$s.%4$s\"ã€æ–°ã—ã„åå‰ \"%5$s.%6$s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "データベース\"%s\"ã§æ–°æ—§ã®ãƒ†ãƒ¼ãƒ–ルã®ç…§åˆã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " ã“れ㯠\"%s.%s\" 上ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " ã“れ㯠OID %u 上ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " ã“れ㯠\"%s.%s\" ã® TOAST テーブルã§ã™"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " ã“れ㯠OID %u ã® TOAST テーブルã§ã™"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "データベース\"%2$s\"ã§OID%1$uã‚’æŒã¤æ–°ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾å¿œã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ—§ã‚¯ãƒ©ã‚¹ã‚¿å†…ã«ã‚ã‚Šã¾ã›ã‚“: %3$s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "データベース\"%2$s\"ã§OID %1$uã‚’æŒã¤æ—§ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾å¿œã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ–°ã‚¯ãƒ©ã‚¹ã‚¿å†…ã«ã‚ã‚Šã¾ã›ã‚“: %3$s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"移行元データベース:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"移行先データベース:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "データベース: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: rootã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ä¸æ­£ãªæ—§ãƒãƒ¼ãƒˆç•ªå·"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ä¸æ­£ãªæ–°ãƒãƒ¼ãƒˆç•ªå·"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細ã¯\"%s --help\"ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "詳細表示モードã§å®Ÿè¡Œã—ã¦ã„ã¾ã™"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "旧クラスタã®ãƒã‚¤ãƒŠãƒªãŒç½®ã‹ã‚Œã¦ã„ã‚‹"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "新クラスタã®ãƒã‚¤ãƒŠãƒªãŒç½®ã‹ã‚Œã¦ã„ã‚‹"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "旧クラスタã®ãƒ‡ãƒ¼ã‚¿ãŒç½®ã‹ã‚Œã¦ã„ã‚‹"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "新クラスタã®ãƒ‡ãƒ¼ã‚¿ãŒç½®ã‹ã‚Œã¦ã„ã‚‹"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "ソケットãŒä½œæˆã•ã‚Œã‚‹"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "カレントディレクトリを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "Windowsã§ã¯ã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸­ã§pg_upgradeを実行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgradeã¯ã€PostgreSQLã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’別ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™ã€‚\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "使ã„æ–¹:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [オプション]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧クラスタã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新クラスタã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª(デフォルト\n"
+" ã¯pg_upgradeã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check クラスタã®ãƒã‚§ãƒƒã‚¯ã®ã¿ã€ãƒ‡ãƒ¼ã‚¿ã‚’一切変更ã—ãªã„\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs 使用ã™ã‚‹åŒæ™‚実行プロセスã¾ãŸã¯ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ•°\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link 新クラスタã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピーã™ã‚‹ä»£ã‚ã‚Šã«\n"
+" リンクã™ã‚‹\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync 変更ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®ç¢ºå®Ÿãªæ›¸ã出ã—ã‚’å¾…æ©Ÿã—ãªã„\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS サーãƒãƒ¼ã«æ¸¡ã™æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚ªãƒ—ション\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS サーãƒãƒ¼ã«æ¸¡ã™æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚ªãƒ—ション\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧クラスタã®ãƒãƒ¼ãƒˆç•ªå·(デフォルト %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新クラスタã®ãƒãƒ¼ãƒˆç•ªå·(デフォルト %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQLã¨ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã€æˆåŠŸå¾Œã‚‚消ã•ãšã«æ®‹ã™\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 使用ã™ã‚‹ã‚½ã‚±ãƒƒãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª(デフォルトã¯\n"
+" カレントディレクトリ)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME クラスタã®ã‚¹ãƒ¼ãƒ‘ーユーザー(デフォルト\"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 詳細ãªå†…部ログを有効化\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone 新クラスタã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピーã™ã‚‹ä»£ã‚ã‚Šã«\n"
+" クローンã™ã‚‹\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy 新クラスタã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピーã™ã‚‹(デフォルト)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade を実行ã™ã‚‹å‰ã«ã€ä»¥ä¸‹ã®ã“ã¨ã‚’è¡Œã£ã¦ãã ã•ã„:\n"
+" (æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®initdbを使ã£ã¦)æ–°ã—ã„データベースクラスタを作æˆã™ã‚‹\n"
+" 旧クラスタã®postmasterをシャットダウンã™ã‚‹\n"
+" 新クラスタã®postmasterをシャットダウンã™ã‚‹\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade ã‚’å‹•ã‹ã™å ´åˆã€æ¬¡ã®æƒ…報を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™: \n"
+" 旧クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª (-d DATADIR)\n"
+" 新クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª (-D DATADIR) \n"
+" æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®\"bin\"ディレクトリ (-b BINDIR)\n"
+" æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®\"bin\"ディレクトリ(-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"実行例:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ã¾ãŸã¯\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"%sディレクトリを指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"コマンドラインオプション %s ã¾ãŸã¯ç’°å¢ƒå¤‰æ•° %s を使用ã—ã¦ãã ã•ã„。"
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "移行元クラスタã®å®Ÿéš›ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’探ã—ã¦ã„ã¾ã™"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "移行先クラスタã®å®Ÿéš›ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’探ã—ã¦ã„ã¾ã™"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "%s ã§ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "ファイル\"%2$s\"ã®%1$d行目を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %3$s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "ユーザー指定ã®æ—§ãƒãƒ¼ãƒˆç•ªå·%huã¯%huã«è¨‚æ­£ã•ã‚Œã¾ã—ãŸ"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "ワーカープロセスを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "ワーカースレッドを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "å­ãƒ—ロセスãŒç•°å¸¸çµ‚了ã—ã¾ã—ãŸ: ステータス %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "å­ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒç•°å¸¸çµ‚了ã—ã¾ã—ãŸ: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"アップグレードを実行ã—ã¦ã„ã¾ã™ã€‚\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "新クラスタã®ã€æ¬¡ã® OID を設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "データディレクトリをディスクã«åŒæœŸã—ã¾ã™"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"アップグレードãŒå®Œäº†ã—ã¾ã—ãŸ\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "新クラスタã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ»ãƒ‘スãŒé•·ã™ãŽã¾ã™"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: 自身ã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"旧クラスタã§ç¨¼åƒä¸­ã®postmasterãŒã‚るよã†ã§ã™ã€‚\n"
+"ãã®postmasterをシャットダウンã—ãŸã®ã¡ã«ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"新クラスタã§ç¨¼åƒä¸­ã®postmasterãŒã‚るよã†ã§ã™ã€‚\n"
+"ãã®postmasterをシャットダウンã—ãŸã®ã¡ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "新クラスタã®ã€ãƒ­ã‚±ãƒ¼ãƒ«ã¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "新クラスタ内ã®ã™ã¹ã¦ã®è¡Œã‚’分æžã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "新クラスタ内ã®ã™ã¹ã¦ã®è¡Œã‚’å‡çµã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "新クラスタ内ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトを復元ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "新クラスタ内ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¹ã‚­ãƒ¼ãƒžã‚’復元ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "æ–°ã—ã„ %s ã‹ã‚‰ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "旧㮠%s を新サーãƒãƒ¼ã«ã‚³ãƒ”ーã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "新クラスタã®ã€æœ€å¤ã®XIDを設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "新クラスタã®ã€æ¬¡ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã¨åŸºç‚¹ã‚’設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "新クラスタã®ã€æ¬¡ã®multixact IDã¨ã‚ªãƒ•ã‚»ãƒƒãƒˆã‚’設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "新クラスタã®æœ€å¤ã®multixact IDを設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL アーカイブをリセットã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "新クラスタã®frozenxidã¨minmxidカウンタを設定ã—ã¦ã„ã¾ã™"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "新クラスタã®minmxidカウンタを設定ã—ã¦ã„ã¾ã™"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "ユーザーリレーションファイルをクローニングã—ã¦ã„ã¾ã™"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "ユーザーリレーションã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピーã—ã¦ã„ã¾ã™"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "ユーザーリレーションã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’リンクã—ã¦ã„ã¾ã™"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "新クラスタ内ã«æ—§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\"ファイル (\"%s\"ã‹ã‚‰\"%s\")ã®å­˜åœ¨ç¢ºèªä¸­ã«ã‚¨ãƒ©ãƒ¼: %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "\"%s\"ã‚’\"%s\"ã«æ›¸ãæ›ãˆã¦ã„ã¾ã™"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ã‚¯ãƒ­ãƒ¼ãƒ³ã—ã¦ã„ã¾ã™"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "\"%s\"ã‚’\"%s\"ã«ã‚³ãƒ”ーã—ã¦ã„ã¾ã™"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ãƒªãƒ³ã‚¯ã‚’作æˆã—ã¦ã„ã¾ã™"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "失敗ã—ã¾ã—ãŸã€çµ‚了ã—ã¦ã„ã¾ã™\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "実行中: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL コマンドãŒå¤±æ•—ã—ã¾ã—ãŸ\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§èµ·å‹•ã—ãŸç§»è¡Œå…ƒpostmasterã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§èµ·å‹•ã—ãŸç§»è¡Œå…ˆpostmasterã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl ãŒç§»è¡Œå…ƒã‚µãƒ¼ãƒãƒ¼ã®èµ·å‹•ã«å¤±æ•—ã—ãŸã€ã‚ã‚‹ã„ã¯æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl ãŒç§»è¡Œå…ˆã‚µãƒ¼ãƒãƒ¼ã®èµ·å‹•ã«å¤±æ•—ã—ãŸã€ã‚ã‚‹ã„ã¯æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "メモリä¸è¶³ã§ã™"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq ã®ç’°å¢ƒå¤‰æ•° %s ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ãªã„サーãƒãƒ¼å€¤ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"テーブル空間を使用ã—ã¦ã„ã‚‹å ´åˆã€åŒã˜ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã§ã®\n"
+"アップグレードã¯ã§ãã¾ã›ã‚“。"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "テーブル空間ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "テーブル空間ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã‚’ stat ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "テーブル空間ã®ãƒ‘ス\"%s\"ãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "éžäº’æ›ã® \"line\" データ型を確èªã—ã¦ã„ã¾ã™"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"line\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯æ–°æ—§ã®ã‚¯ãƒ©ã‚¹ã‚¿é–“ã§å†…部形å¼ãŠã‚ˆã³å…¥å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒ\n"
+"変更ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。\n"
+"å•é¡Œã®åˆ—を削除ã—ãŸã®ã¡ã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™: \n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "無効ãª\"unknown\"ユーザー列をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ル㫠\"unknown\" データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã‚‚ã¯ã‚„テーブル内ã§ã¯åˆ©ç”¨ã§ããªã„ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点\n"
+"ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•é¡Œã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードを\n"
+"å†å®Ÿè¡Œã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™: \n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯æ–°æ—§ã®ã‚¯ãƒ©ã‚¹ã‚¿é–“ã§\n"
+"内部フォーマットãŒç•°ãªã‚‹ãŸã‚ã€REINDEX コマンドを使ã£ã¦å†æ§‹ç¯‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"アップグレードãŒçµ‚ã‚ã£ãŸã‚‰ã€REINDEX を使ã£ãŸæ“作方法ãŒæŒ‡ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯æ–°æ—§ã®ã‚¯ãƒ©ã‚¹ã‚¿é–“ã§\n"
+"内部フォーマットãŒç•°ãªã‚‹ãŸã‚ã€REINDEX コマンドを使ã£ã¦å†æ§‹ç¯‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"以下ã®ãƒ•ã‚¡ã‚¤ãƒ«\n"
+" %s\n"
+"ã‚’ã€psqlを使用ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚¹ãƒ¼ãƒ‘ーユーザーã¨ã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã§ã€ç„¡åŠ¹ã«ãªã£ãŸ\n"
+"インデックスをå†æ§‹ç¯‰ã§ãã¾ã™ã€‚\n"
+"ãã‚Œã¾ã§ã¯ã€ã“れらã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "無効ãª\"sql_identifier\"ユーザー列を確èªã—ã¦ã„ã¾ã™"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã§ã¯â€sql_identifierâ€ãƒ‡ãƒ¼ã‚¿åž‹ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ã®å½¢å¼ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯\n"
+"アップグレードã§ãã¾ã›ã‚“。å•é¡Œã®ã‚る列を削除ã—ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã™ã‚‹\n"
+"ã“ã¨ãŒã§ãã¾ã™ã€‚\n"
+"å•é¡Œã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ã‚Šã¾ã™: \n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "機能拡張ã®ã‚¢ãƒƒãƒ—デートを確èªã—ã¦ã„ã¾ã™"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "注æ„"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ALTER EXTENSIONコマンドã«ã‚ˆã‚‹ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ãªæ©Ÿèƒ½æ‹¡å¼µãŒ\n"
+"ã‚ã‚Šã¾ã™ã€‚以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’psqlを使ã£ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚¹ãƒ¼ãƒ‘ーユーザーã¨ã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã§\n"
+"ã“れらã®æ©Ÿèƒ½æ‹¡å¼µã‚’アップデートã§ãã¾ã™ã€‚\n"
+" %s"
diff --git a/src/bin/pg_upgrade/po/ka.po b/src/bin/pg_upgrade/po/ka.po
new file mode 100644
index 0000000..a137cf4
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ka.po
@@ -0,0 +1,1910 @@
+# Georgian message translation file for pg_upgrade
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-04 08:18+0000\n"
+"PO-Revision-Date: 2024-01-05 09:28+0100\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრულáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბის შესრულებრძველ ცáƒáƒªáƒ®áƒáƒš სერვერზე\n"
+"------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრულáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბის ჩáƒáƒ¢áƒáƒ áƒ”ბáƒ\n"
+"-----------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*კლáƒáƒ¡áƒ¢áƒ”რები თáƒáƒ•áƒ¡áƒ”ბáƒáƒ“ირ*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"თუ áƒáƒ› წერტილის შემდეგ pg_upgrade áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ებáƒ, გáƒáƒ’რძელებáƒáƒ›áƒ“ე\n"
+"áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის init-db-ის გáƒáƒ™áƒ”თებრშეიძლებრთáƒáƒ•áƒ˜áƒ“áƒáƒœ მáƒáƒ’იწიáƒáƒ—."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™-ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ pg_upgrade-ის მიერ áƒáƒ  ხდებáƒ.\n"
+"რáƒáƒªáƒ áƒáƒ®áƒáƒš სერვერს გáƒáƒ£áƒ¨áƒ•áƒ”ბთ, შეáƒáƒ¡áƒ áƒ£áƒšáƒ”თ ბრძáƒáƒœáƒ”ბáƒ:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"áƒáƒ› სკრიპტის გáƒáƒ¨áƒ•áƒ”ბრძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ”ბს წáƒáƒ¨áƒšáƒ˜áƒ¡:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი ცხრილის სივრცეების áƒáƒœ áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის \n"
+"მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ძველი კლáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ¥áƒáƒ¦áƒáƒ“ლდეში áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის გáƒáƒ›áƒ\n"
+"ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ¨áƒšáƒ˜áƒ¡ სკრიპტის შექმნრშეუძლებელიáƒ. ძველი კლáƒáƒ¡áƒ¢áƒ”რის\n"
+" შემცველáƒáƒ‘რხელით უნდრწáƒáƒ¨áƒáƒšáƒáƒ—."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "კლáƒáƒ¡áƒ¢áƒ”რის ვერსიების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒáƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბრPostgreSQL-ის ვერსიის %s-დáƒáƒœ დრზემáƒáƒ— შეუძლიáƒ."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒáƒ¡ შეუძლირმხáƒáƒšáƒáƒ“ PostgreSQL ვერსიáƒáƒ–ე გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ %s."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "ეს პრáƒáƒ’რáƒáƒ›áƒ áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებულ იქნáƒáƒ¡ უფრრძველი ძირითáƒáƒ“ი PostgreSQL ვერსიების ჩáƒáƒ›áƒáƒ¡áƒáƒ¬áƒ”ვáƒáƒ“."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მები დრგáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒ ძირითáƒáƒ“ი ვერსიიდáƒáƒœáƒáƒ."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მებისრდრგáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒ ძირითáƒáƒ“ ვერსიებს მიეკუთვნებáƒ."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "ცáƒáƒªáƒ®áƒáƒšáƒ˜ სერვერის შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ¡ ძველი დრáƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ”ბი სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒ უნდრიყáƒáƒ¡."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რული მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ: ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ ურთიერთáƒáƒ‘რ\"%s.%s\""
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"გáƒáƒ¤áƒ áƒ—ხილებáƒ: áƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ძველი მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შიგნით áƒáƒ  უნდრიყáƒáƒ¡. მáƒáƒ’: %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"გáƒáƒ¤áƒ áƒ—ხილებáƒ: მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი ცხრილის სივრცეების მდებáƒáƒ áƒ”áƒáƒ‘ები მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შიგნით áƒáƒ  უნდრიყáƒáƒ¡. მáƒáƒ’: %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ სკრიპტის შექმნáƒ"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ–ე \"%s\" გáƒáƒ¨áƒ•áƒ”ბის წვდáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "შემáƒáƒ¬áƒ›áƒ”ბáƒ, დáƒáƒ›áƒ§áƒ”ნებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი დáƒáƒ§áƒ”ნების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს თუ უდრის"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "ვერ დáƒáƒ“გინდრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრრáƒáƒáƒ“ენáƒáƒ‘áƒ"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის მხáƒáƒšáƒáƒ“ დáƒáƒ§áƒ”ნების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მითითებáƒáƒ შესáƒáƒ«áƒšáƒ”ბელი."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0-თáƒáƒœ დáƒáƒ™áƒáƒ•áƒ¨áƒ˜áƒ áƒ”ბრშეუძლებელი უნდრიყáƒáƒ¡. áƒáƒœáƒ£, მისი pg_database.datallowconn პáƒáƒ áƒáƒ›áƒ”ტრი false უნდრიყáƒáƒ¡"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "ფáƒáƒ¢áƒáƒšáƒ£áƒ áƒ˜"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"ყველრáƒáƒ áƒ-template0 ბáƒáƒ–áƒáƒ–ე მიერთებრშესáƒáƒ«áƒšáƒ”ბელი უნდრიყáƒáƒ¡, áƒáƒœáƒ£ მáƒáƒ—ი\n"
+"pg_database.datallowconn -ი true-ს უნდრუნდáƒáƒ“ეს. თქვენი ვერსირშეიცáƒáƒ•áƒ¡\n"
+"áƒáƒ áƒ-template0 ბáƒáƒ–ებს, რáƒáƒ›áƒšáƒ”ბის pg_database.datallowconn -ი false-ზერდáƒáƒ§áƒ”ნებული.\n"
+"სáƒáƒ¡áƒ£áƒ áƒ•áƒ”ლირდáƒáƒ£áƒ¨áƒ•áƒáƒ— მიერთებრყველრáƒáƒ áƒ-template0 ბáƒáƒ–áƒáƒ–ე, áƒáƒœ\n"
+"წáƒáƒ¨áƒáƒšáƒáƒ— ბáƒáƒ–ები, რáƒáƒ›áƒšáƒ”ბზეც წვდáƒáƒ›áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს.\n"
+"პრáƒáƒ‘ლემური ბáƒáƒ–ების სიის ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კლáƒáƒ¡áƒ¢áƒ”რი მáƒáƒ›áƒ–áƒáƒ“ებულ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბს შეიცáƒáƒ•áƒ¡"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რი მáƒáƒ›áƒ–áƒáƒ“ებულ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბს შეიცáƒáƒ•áƒ¡"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "\"contrib/isn\"-ის bgint-passing-ის áƒáƒ -დáƒáƒ›áƒ—ხვევáƒáƒ–ე შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსისრშეიცáƒáƒ•áƒ¡ \"contrib/isn\" ფუნქციებს, რáƒáƒ›áƒšáƒ”ბიც bigint მáƒáƒœáƒáƒªáƒ”მების ტიპს ეყრდნáƒáƒ‘áƒ. თქვენი ძველი \n"
+"დრáƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რები bigint მნიშვნელáƒáƒ‘ებს სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒáƒœáƒáƒ˜áƒ áƒáƒ“ áƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბენ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› თქვენი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ \n"
+"შეუძლებელიáƒ. შეგიძლიáƒáƒ—, თქვენს ძველ კლáƒáƒ¡áƒ¢áƒ”რში, ბáƒáƒ–ები, რáƒáƒ›áƒšáƒ”ბიც \"contrib/isn\" ფუნქციებს იყენებს, წáƒáƒ¨áƒáƒšáƒáƒ—\n"
+", გáƒáƒœáƒáƒáƒ®áƒšáƒáƒ— ბáƒáƒ–რდრáƒáƒ¦áƒáƒ“გინáƒáƒ— ფუნქციები. პრáƒáƒ‘ლემური ფუნქციების სირშეგიძლიáƒáƒ— იხილáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილ postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს,\n"
+"რáƒáƒ›áƒšáƒ”ბიც მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ. სáƒáƒ­áƒ˜áƒ áƒ იქნებრpostfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის წáƒáƒ¨áƒšáƒ დრმáƒáƒ—ი \n"
+"prefix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბით áƒáƒœ ფუნქციების გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბებით ჩáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბáƒ.\n"
+"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიის ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "შეუთáƒáƒ•áƒ¡áƒ”ბელი პáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒšáƒ˜ ფუნქციების áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილ áƒáƒ‘იექტებს, რáƒáƒ›áƒšáƒ”ბიც\n"
+"შიდრპáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒš ფუნქციებს იძáƒáƒ®áƒ”ბენ áƒáƒ áƒ’უმენტების ტიპით \"anyarray\" áƒáƒœ \"anyelement\".\n"
+"ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მერ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ‘იექტები უნდრმáƒáƒáƒªáƒ˜áƒšáƒáƒ— ვერსიის áƒáƒ¬áƒ”ვáƒáƒ›áƒ“ე დáƒ\n"
+"შემდეგ áƒáƒ¦áƒáƒ“გინáƒáƒ—, რáƒáƒ—რმáƒáƒ— áƒáƒ®áƒáƒš შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ ფუნქციებს მიმáƒáƒ áƒ—áƒáƒœ, áƒáƒ áƒ’უმენტების ტიპით\n"
+"\"anycompatiblearray\" დრ\"anycompatible\".\n"
+"ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბული პრáƒáƒ‘ლემური áƒáƒ‘იექტები:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS ცხრილების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•áƒ¡ ცხრილებს, რáƒáƒ›áƒšáƒ”ბიც WITH OIDS-ითáƒáƒ\n"
+"áƒáƒ¦áƒ¬áƒ”რილი, რáƒáƒª მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ. სáƒáƒ­áƒ˜áƒ áƒáƒ წáƒáƒ¨áƒáƒšáƒáƒ— oid ცხრილები ბრძáƒáƒœáƒ”ბით\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"ცხრილების სიáƒ, რáƒáƒ›áƒ”ლსáƒáƒª ეს პრáƒáƒ‘ლემრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეგიძლიáƒáƒ— იხილáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში სისტემის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒ›áƒžáƒáƒ–იტური ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში სისტემის მიერ áƒáƒ¦áƒ¬áƒ”რილ კáƒáƒ›áƒžáƒáƒ–იტურ ტიპებს შეიცáƒáƒ•áƒ¡.\n"
+"áƒáƒ› ტიპის OID-ები PostgreSQL-ის ვერსიებს შáƒáƒ áƒ˜áƒ¡ მუდმივი áƒáƒ áƒáƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შეუძლებელირშეგიძლიáƒáƒ—\n"
+"წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"პრáƒáƒ‘ლემური სვეტების სიის ხილვრშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში reg* მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში reg* მáƒáƒœáƒáƒªáƒ”მების ტიპს შეიცáƒáƒ•áƒ¡\n"
+"áƒáƒ› მáƒáƒœáƒáƒªáƒ”მების ტიპის სისტემური OID-ები pg_upgrade-ის იერ áƒáƒ  ნáƒáƒ áƒ©áƒ£áƒœáƒ“ებáƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის\n"
+"გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ. პრáƒáƒ‘ლემის მáƒáƒ¡áƒáƒ’ვáƒáƒ áƒ”ბლáƒáƒ“ შეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜áƒ¡ სვეტები\n"
+"დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"პრáƒáƒ‘ლემური სვეტების სიის ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში შეუთáƒáƒ•áƒ¡áƒ”ბელი \"%s\" მáƒáƒœáƒáƒªáƒ”მების ტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"jsonb\" ტიპს შეიცáƒáƒ•áƒ¡.\n"
+"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 9.4 ბეტáƒáƒ¡ დრáƒáƒ¡, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n"
+"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ \"%s\" მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"%s\" ტიპს შეიცáƒáƒ•áƒ¡.\n"
+"ტიპი \"%s\" გáƒáƒ£áƒ¥áƒ›áƒ“რPostgreSQL-ის %s-ე ვერსიáƒáƒ¨áƒ˜\n"
+"áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n"
+"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები, áƒáƒœ შეცვáƒáƒšáƒáƒ— მáƒáƒ—ი ტიპი დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "შეუთáƒáƒ•áƒ¡áƒ”ბელი \"jsonb\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"jsonb\" ტიპს შეიცáƒáƒ•áƒ¡.\n"
+"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 9.4 ბეტáƒáƒ¡ დრáƒáƒ¡, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n"
+"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "რáƒáƒšáƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•áƒ¡ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც\n"
+"\"pg_\" სუფიქსით იწყებáƒ. ეს კი სისტემური რáƒáƒšáƒ”ბისთვის შემáƒáƒœáƒáƒ®áƒ£áƒšáƒ˜ რáƒáƒšáƒ”ბიáƒ.\n"
+"კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელირმáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› áƒáƒ› რáƒáƒšáƒ”ბს სáƒáƒ®áƒ”ლს áƒáƒ  გáƒáƒ“áƒáƒáƒ áƒ¥áƒ›áƒ”ვთ.\n"
+"რáƒáƒšáƒ”ბის სიáƒ, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებიáƒáƒœ, შეგიძლიáƒáƒ— იპáƒáƒ•áƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒ“ირების კáƒáƒœáƒ•áƒ”რტáƒáƒªáƒ˜áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბს შეიცáƒáƒ•áƒ¡.\n"
+"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 14-ე ვერსიáƒáƒ¨áƒ˜, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n"
+"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "%s-სთვის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის პრáƒáƒ‘ლემáƒ"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კლáƒáƒ¡áƒ¢áƒ”რი áƒáƒ¦áƒ“გენის რეჟიმში იყáƒ, რáƒáƒªáƒ გáƒáƒ˜áƒ—იშáƒ. გáƒáƒœáƒ¡áƒáƒáƒ®áƒšáƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"rsync\", რáƒáƒ’áƒáƒ áƒª ეს დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜áƒ, áƒáƒœ გáƒáƒ›áƒáƒ áƒ—ეთ, რáƒáƒ’áƒáƒ áƒª ძირითáƒáƒ“ი."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რი áƒáƒ¦áƒ“გენის რეჟიმში იყáƒ, რáƒáƒªáƒ გáƒáƒ˜áƒ—იშáƒ. გáƒáƒœáƒ¡áƒáƒáƒ®áƒšáƒ”ბლáƒáƒ“, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"rsync\", რáƒáƒ’áƒáƒ áƒª ეს დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜áƒ, áƒáƒœ გáƒáƒ›áƒáƒ áƒ—ეთ, რáƒáƒ’áƒáƒ áƒª ძირითáƒáƒ“ი."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბáƒáƒ–რწესების დáƒáƒªáƒ•áƒ˜áƒ— áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–რწესების დáƒáƒªáƒ•áƒ˜áƒ— áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ კლáƒáƒ¡áƒ¢áƒ”რს მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რს მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal -ის პრáƒáƒ‘ლემáƒ"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: controldata -ის მიღების შეცდáƒáƒ›áƒ"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ კლáƒáƒ¡áƒ¢áƒ”რს ზáƒáƒ’იერთი სáƒáƒ­áƒ˜áƒ áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რს ზáƒáƒ’იერთი სáƒáƒ­áƒ˜áƒ áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უძველესი MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უძველესი XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " პირველი WAL სეგმენტი გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შემდეგ"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 áƒáƒ áƒ’უმენტი გáƒáƒ•áƒšáƒ˜áƒ¡ მეთáƒáƒ“ი"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " დიდი ურთიერთáƒáƒ‘ის სეგმენტის ზáƒáƒ›áƒ"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL-ის სეგმენტის ზáƒáƒ›áƒ"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " ინდექსირებული სვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " TOAST ნáƒáƒ’ლეჯის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " დრáƒáƒ”ბი დრთáƒáƒ áƒ˜áƒ¦áƒ”ბი მთელი რიცხვებიáƒ?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "ვერ გáƒáƒ’რძელდებრსáƒáƒ­áƒ˜áƒ áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ”შე, დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒ"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata სწáƒáƒ áƒ”ბები ბáƒáƒ—ილირáƒáƒœ áƒáƒ  ემთხვევáƒ\n"
+"სáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“, ერთი კლáƒáƒ¡áƒ¢áƒ”რი 32-ბიტიáƒáƒœáƒ˜áƒ, დáƒáƒœáƒáƒ áƒ©áƒ”ნი კი 64"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ”ბი ბáƒáƒ—ილირáƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ურთიერთáƒáƒ‘ის სეგმენტის ზáƒáƒ›áƒ”ბი ბáƒáƒ—ილირáƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის WAL-ის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის WAL-ის სეგმენტის ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძეები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ინდექსირებული სვეტები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის TOAST-ის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის თáƒáƒ áƒ˜áƒ¦áƒ˜/დრáƒáƒ˜áƒ¡ შენáƒáƒ®áƒ•áƒ˜áƒ¡ ტიპები áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რი áƒáƒ  იყენებს მáƒáƒœáƒáƒªáƒ”მთრშემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¡, მáƒáƒ’რáƒáƒ› áƒáƒ®áƒáƒšáƒ˜ áƒáƒ™áƒ”თებს"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რი იყენებს მáƒáƒœáƒáƒªáƒ”მთრშემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¡, áƒáƒ®áƒáƒšáƒ˜ კი áƒáƒ áƒ"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რების pg_controldata -ის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიები áƒáƒ  ემთხვევáƒ"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "ძველ გლáƒáƒ‘áƒáƒšáƒ£áƒ /pg_control-ზე \".old\" სუფიქსის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"თუ გნებáƒáƒ•áƒ—, გáƒáƒ£áƒ¨áƒ•áƒáƒ— ძველი კლáƒáƒ¡áƒ¢áƒ”რი, სáƒáƒ­áƒ˜áƒ áƒáƒ\n"
+"წáƒáƒ¨áƒáƒšáƒáƒ— .old სუფიქსი %s/global/pg_control.old-დáƒáƒœ.\n"
+"იმის გáƒáƒ›áƒ, რáƒáƒ› გáƒáƒ›áƒáƒ§áƒ”ნებული იყრ\"ბმულის\" რეჟიმი, ძველი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ¨áƒ•áƒ”ბრმáƒáƒ¡ შემდეგ, რáƒáƒª\n"
+"áƒáƒ®áƒáƒšáƒ˜ სერვერი გáƒáƒ”შვáƒ, ძველის გáƒáƒ¨áƒ•áƒ”ბრუსáƒáƒ¤áƒ áƒ—ხრáƒáƒ¦áƒáƒ áƒáƒ."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ‘იექტების დáƒáƒ›áƒžáƒ˜áƒ¡ შექმნáƒ"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სქემების დáƒáƒ›áƒžáƒ˜áƒ¡ შექმნáƒ"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "%s გáƒáƒ›áƒáƒ§áƒ”ნებით pg_ctl ვერსიის მáƒáƒœáƒáƒªáƒ”მები ვერ მივიღე: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "%s გáƒáƒ›áƒáƒ§áƒ”ნებით pg_ctl ვერსირვერ მივიღე"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "ბრძáƒáƒœáƒ”ბრძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*შეცდáƒáƒ›áƒ"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "%s-ის შესრულების პრáƒáƒ‘ლემáƒ"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ მიზეზის გáƒáƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”ნáƒáƒ“ გáƒáƒ“áƒáƒáƒ•áƒšáƒ”თ თვáƒáƒšáƒ˜ \n"
+"\"%s\"-ის áƒáƒœ \"%s\"-ის ბáƒáƒšáƒ რáƒáƒ›áƒ“ენიმე ფáƒáƒ˜áƒšáƒ¡."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ მიზეზის გáƒáƒ›áƒáƒ¡áƒáƒ•áƒšáƒ”ნáƒáƒ“ გáƒáƒ“áƒáƒáƒ•áƒšáƒ”თ თვáƒáƒšáƒ˜\n"
+"\"%s\"-ის ბáƒáƒšáƒ რáƒáƒ›áƒ“ენიმე ხáƒáƒ–ს."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "შეცდáƒáƒ›áƒ %s-ის წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში ჩáƒáƒ¬áƒ”რáƒ/წáƒáƒ™áƒ˜áƒ—ხვის წვდáƒáƒ›áƒ”ბი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ვერსიáƒ: ვიპáƒáƒ•áƒ” \"%s\" მáƒáƒ•áƒ”ლáƒáƒ“ი \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ : ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) ბმულის შექმნისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის \"%s.%s\" კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ ნáƒáƒ¬áƒ˜áƒšáƒáƒ‘რივი გვერდი"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების ძველ დრáƒáƒ®áƒáƒš სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შáƒáƒ áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ კლáƒáƒœáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე კლáƒáƒœáƒ˜áƒ áƒ”ბრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"ძველი დრáƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შურმყáƒáƒ áƒ˜ ბმულის შექმნრშეუძლებელიáƒ: %s\n"
+"ბმულის რეჟიმში ძველი დრáƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები ერთი დრიგივე ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ–ე უნდრიყáƒáƒ¡."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "სáƒáƒ­áƒ˜áƒ áƒ ბიბლიáƒáƒ—ეკების áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვის შეცდáƒáƒ›áƒ: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმიმáƒáƒ áƒ—áƒáƒ•áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒáƒ“ ბიბლიáƒáƒ—ეკები, რáƒáƒ›áƒšáƒ”ბიც თქვენს სისტემáƒáƒ¨áƒ˜\n"
+"áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ. შეგიძლიáƒáƒ— დáƒáƒáƒ›áƒáƒ¢áƒáƒ— ეს ბიბლიáƒáƒ—ეკები áƒáƒ®áƒáƒš ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ¨áƒ˜,\n"
+"áƒáƒœ წáƒáƒ¨áƒáƒšáƒáƒ— ფუნქციები, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ— იყენებენ, ძველი ვერსიიდáƒáƒœ.\n"
+"პრáƒáƒ‘ლემური ბიბლიáƒáƒ—ეკების სიის ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "ურთიერთáƒáƒ‘ის სáƒáƒ®áƒ”ლები OID-ით %u ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" áƒáƒ  ემთხვევáƒ: ძველი სáƒáƒ®áƒ”ლი \"%s.%s.\", áƒáƒ®áƒáƒšáƒ˜ კი \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "შეცდáƒáƒ›áƒ ძველ დრáƒáƒ®áƒáƒš ცხრილებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒ—ხვევისáƒáƒ¡ ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " რáƒáƒ›áƒ”ლიც ინდექსირ\"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " რáƒáƒª áƒáƒ áƒ˜áƒ¡ ინდექსი OID-ზე %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " რáƒáƒ›áƒ”ლიც TOAST ცხრილირ\"%s.%s\"-სთვის"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " რáƒáƒ›áƒ”ლიც TOAST ცხრილირ%u-ე OID-სთვის"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "ძველ კლáƒáƒ¡áƒ¢áƒ”რში áƒáƒ®áƒáƒšáƒ˜ ურთიერთáƒáƒ‘ისთვის OID -ით %u ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დáƒáƒ›áƒ—ხვევრვერ ვიპáƒáƒ•áƒ”: %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ძველი ურთიერთáƒáƒ‘ისთვის OID -ით %u ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დáƒáƒ›áƒ—ხვევრვერ ვიპáƒáƒ•áƒ”: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბáƒáƒ–ები:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–ები:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "ბáƒáƒ–áƒ: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: root-ით ვერ გáƒáƒ£áƒ¨áƒ•áƒ”ბთ"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ძველი პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი შეტყáƒáƒ‘ინებების ჩáƒáƒ áƒ—ვáƒ"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ”ბი მდებáƒáƒ áƒ”áƒáƒ‘ს"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ”ბი მდებáƒáƒ áƒ”áƒáƒ‘ს"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მები მდებáƒáƒ áƒ”áƒáƒ‘ს"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მები მდებáƒáƒ áƒ”áƒáƒ‘ს"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "სáƒáƒ™áƒ”ტები შეიქმნებáƒ"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "pg_upgrade-ის გáƒáƒ¨áƒ•áƒ”ბრWindows-ზე áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“იდáƒáƒœ შეუძლებელიáƒ"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade -ი PostgreSQL კლáƒáƒ¡áƒ¢áƒ”რს სხვრმთáƒáƒ•áƒáƒ  ვერსიáƒáƒ–ე გáƒáƒœáƒáƒáƒ®áƒšáƒ”ბს.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR ძველი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმევი\n"
+" იგივე სáƒáƒ¥áƒáƒ¦áƒšáƒ“ე, რáƒáƒª pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check კლáƒáƒ¡áƒ¢áƒ”რების მხáƒáƒšáƒáƒ“ შემáƒáƒ¬áƒ›áƒ”ბáƒ. მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  შეიცვლებáƒ\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM ერთდრáƒáƒ£áƒšáƒáƒ“ გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბი პრáƒáƒªáƒ”სების áƒáƒœ ნáƒáƒ™áƒáƒ“ების რიცხვი\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ‘მáƒ, კáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•áƒšáƒáƒ“\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•áƒ”ლáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, -old-options=OPTIONS სერვერზე გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მი ძველი კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრები\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, -new-options=OPTIONS სერვერზე გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მი áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრები\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, -old-port=PORT ძველი კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი (ნáƒáƒ’ულისხმევი %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი (ნáƒáƒ’ულისხმევი %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL დრჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბს დáƒáƒ¢áƒáƒ•áƒ”ბრწáƒáƒ áƒ›áƒáƒ¢áƒ”ბის შემდეგ \n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმევირმიმდინáƒáƒ áƒ”.)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი კლáƒáƒ¡áƒ¢áƒ”რის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმევი: \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose შიდრდáƒáƒ›áƒáƒ¢áƒ”ბითი ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ფáƒáƒ˜áƒšáƒ”ბის კლáƒáƒœáƒ˜áƒ áƒ”ბრკáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•áƒšáƒáƒ“ \n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --clone áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ფáƒáƒ˜áƒšáƒ”ბის კლáƒáƒœáƒ˜áƒ áƒ”ბრკáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•áƒšáƒáƒ“ (ნáƒáƒ’ულისხმევი)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade-ის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ›áƒ“ე áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ:\n"
+" შექმნáƒáƒ— áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რი (initdb-ის áƒáƒ®áƒáƒšáƒ˜ ვერსიით)\n"
+" გáƒáƒ›áƒáƒ áƒ—áƒáƒ— postmaster სერვისი ძველ კლáƒáƒ¡áƒ¢áƒ”რზე\n"
+" გáƒáƒ›áƒáƒ áƒ—áƒáƒ— postmaster სერვისი áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რზე\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade-ის გáƒáƒ¨áƒ•áƒ”ბისáƒáƒ¡ სáƒáƒ­áƒ˜áƒ áƒáƒ შემდეგი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მáƒ:\n"
+" ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (-d DATADIR)\n"
+" áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (-D DATADIR)\n"
+" ძველი ვერსიის \"bin\" სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (-b BINDIR)\n"
+" áƒáƒ®áƒáƒšáƒ˜ ვერსიის \"bin\" სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"áƒáƒœ\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"%s-ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ.\n"
+"გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ %s პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒœ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის რეáƒáƒšáƒ£áƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის პáƒáƒ•áƒœáƒ"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რის რეáƒáƒšáƒ£áƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის პáƒáƒ•áƒœáƒ"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s გáƒáƒ›áƒáƒ§áƒ”ნებით: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%2$s) %1$d-ე ხáƒáƒ–ის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %3$s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ მáƒáƒ¬áƒáƒ“ებული ძველი პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი %hu შესწáƒáƒ áƒ”ბულირ%hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შექმნრშეუძლებელიáƒ: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” ნáƒáƒ™áƒáƒ“ის შექმნრშეუძლებელიáƒ: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "შვილი პრáƒáƒªáƒ”სი áƒáƒ áƒáƒœáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "შვილი დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” áƒáƒ áƒáƒœáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის შემდეგი OID დáƒáƒ§áƒ”ნებáƒ"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის დისკთáƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"გáƒáƒœáƒáƒ®áƒšáƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, ძველ კლáƒáƒ¡áƒ¢áƒ”რს postmaster ჯერ კიდევ ემსáƒáƒ®áƒ£áƒ áƒ”ბáƒ.\n"
+"გáƒáƒ›áƒáƒ áƒ—ეთ postmaster დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ სცáƒáƒ“ეთ."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რს postmaster ემსáƒáƒ®áƒ£áƒ áƒ”ბáƒ.\n"
+"გáƒáƒ›áƒáƒ áƒ—ეთ postmaster დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ სცáƒáƒ“ეთ."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ დრკáƒáƒ“ირების დáƒáƒ§áƒ”ნებáƒ"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ყველრმწკრივის áƒáƒœáƒáƒšáƒ˜áƒ–ი"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ყველრმწკრივის გáƒáƒ§áƒ˜áƒœáƒ•áƒ"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რში გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ‘იექტების áƒáƒ¦áƒ“გენáƒ"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ბáƒáƒ–ის სქემების áƒáƒ¦áƒ“გენáƒ"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ áƒáƒ®áƒáƒšáƒ˜ %s-დáƒáƒœ"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "ძველი %s -ის კáƒáƒžáƒ˜áƒ áƒ”ბრáƒáƒ®áƒáƒš სერვერზე"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "უძველესი XID დáƒáƒ§áƒ”ნებრáƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ეპáƒáƒ¥áƒ˜áƒ¡áƒ დრID-ის დáƒáƒ§áƒ”ნებáƒ"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის შემდეგი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბისრდრID-ის დáƒáƒ§áƒ”ნებáƒ"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში უძველესი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL áƒáƒ áƒ¥áƒ˜áƒ•áƒ”ბის გáƒáƒ“áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში frozenxid დრminmxid მთვლელების დáƒáƒ§áƒ”ნებáƒ"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში minmxid მთვლელის დáƒáƒ§áƒ”ნებáƒ"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ურთიერთáƒáƒ‘ის ფáƒáƒ˜áƒšáƒ”ბის კლáƒáƒœáƒ˜áƒ áƒ”ბáƒ"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ურთიერთáƒáƒ‘ის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბáƒ"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ურთიერთáƒáƒ‘ის ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ‘მáƒ"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "ძველი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒžáƒáƒ•áƒœáƒ˜"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ¡ \"%s.%s\" (\"%s\" \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "გáƒáƒ“áƒáƒ¬áƒ”რრ\"%s\"-დáƒáƒœ \"%s\"-მდე"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "კლáƒáƒœáƒ˜áƒ áƒ”ბრ\"%s\"-დáƒáƒœ \"%s\"-მდე"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბრ\"%s\"-დáƒáƒœ \"%s\"-მდე"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "ბმრ\"%s\"-დáƒáƒœ \"%s\"-მდე"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "შეცდáƒáƒ›áƒ. დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒ\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "შესრულებáƒ: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL ბრძáƒáƒœáƒ”ბსი შეცდáƒáƒ›áƒ\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "ვერსიის ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "ვერსიის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ვერ ვუკáƒáƒ•áƒ¨áƒ˜áƒ áƒ“ები სáƒáƒ¬áƒ§áƒ˜áƒ¡ postmaster-ს, რáƒáƒ›áƒ”ლიც შემდეგი ბრძáƒáƒœáƒ”ბით გáƒáƒ”შვáƒ:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ვერ ვუკáƒáƒ•áƒ¨áƒ˜áƒ áƒ“ები სáƒáƒ›áƒ˜áƒ–ნე postmaster-ს, რáƒáƒ›áƒ”ლიც შემდეგი ბრძáƒáƒœáƒ”ბით გáƒáƒ”შვáƒ:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl-ის შეცდáƒáƒ›áƒ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სერვერის გáƒáƒ¨áƒ•áƒ”ბისáƒáƒ¡ áƒáƒœ შეერთების შეცდáƒáƒ›áƒ"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl-ის შეცდáƒáƒ›áƒ სáƒáƒ›áƒ˜áƒ–ნე სერვერის გáƒáƒ¨áƒ•áƒ”ბისáƒáƒ¡ áƒáƒœ შეერთების შეცდáƒáƒ›áƒ"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq-ის გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ %s-ს áƒáƒ áƒáƒšáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სერვერის მნიშვნელáƒáƒ‘áƒ: %s გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"ცხრილის სივრცეების გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ იგივე სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ის \n"
+"ვერსიის მქáƒáƒœáƒ”ზე/მქáƒáƒœáƒ”მდე გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "ცხრილების სივრცის ბილიკი %s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "დიáƒáƒ®"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "შეუთáƒáƒ•áƒ¡áƒ”ბელი \"line\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"თქვენი პáƒáƒ™áƒ”ტი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში \"line\" მáƒáƒœáƒáƒªáƒ”მის ტიპს შეიცáƒáƒ•áƒ¡.\n"
+"ეს მáƒáƒœáƒáƒªáƒ”მის ტიპი შეიცვáƒáƒšáƒ შიგნიდáƒáƒœ. áƒáƒ¡áƒ”ვე შეცვáƒáƒšáƒ მისი შეყვáƒáƒœáƒ/გáƒáƒ›áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜. áƒáƒ›áƒ˜áƒ¢áƒáƒ› თქვენი\n"
+"კლáƒáƒ¡áƒ¢áƒ”რის ძველი ვერსიის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შეუძლებელიáƒ. შეგიძლიáƒáƒ—\n"
+"წáƒáƒ¨áƒáƒšáƒáƒ— ეს სვეტები დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ.\n"
+"პრáƒáƒ‘ლენული სვეტების სირშეგიძლიáƒáƒ— იხილáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ \"unknown\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სვეტების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"unknown\" ტიპს შეიცáƒáƒ•áƒ¡.\n"
+"ეს მáƒáƒœáƒáƒªáƒ”მის ტიპი ცხრილებში დáƒáƒ¨áƒ•áƒ”ბული áƒáƒ¦áƒáƒ áƒáƒ, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n"
+"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n"
+"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•áƒ შეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ჰეშის ინდექსების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირჰეშ ინდექსებს შეიცáƒáƒ•áƒ¡ áƒáƒ› ინდექსებს გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბული\n"
+"შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ”ბი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ— ძველ დრáƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რებს შáƒáƒ áƒ˜áƒ¡, áƒáƒ¡áƒ” რáƒáƒ›, სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒ—ი\n"
+"რეინდექსი REINDEX ბრძáƒáƒœáƒ”ბის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით. გáƒáƒœáƒáƒ®áƒšáƒ”ბის შემდეგ\n"
+"REINDEX-ის ინსტრუქციებიც გáƒáƒ“მáƒáƒ’ეცემáƒáƒ—."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირჰეშ ინდექსებშ შეიცáƒáƒ•áƒ¡. áƒáƒ› ინდექსებს თქვენს ძველ\n"
+"დრáƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რებში გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბული შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒ¡áƒ” რáƒáƒ›, სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒ—ი\n"
+"რეინდექსი REINDEX ბრძáƒáƒœáƒ”ბის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით. ფáƒáƒ˜áƒšáƒ˜\n"
+" %s\n"
+", შესრულებული psql-ით მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ, თáƒáƒ•áƒ˜áƒ“áƒáƒœ შექნის ყველáƒ\n"
+"áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ინდექსს. მáƒáƒœáƒáƒ›áƒ“ე კი, áƒáƒ› ინდექსებიდáƒáƒœ áƒáƒ áƒª ერთი გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒ  იქნებáƒ."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ \"sql_identifier\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სვეტების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში \"sql_identifier\" მáƒáƒœáƒáƒªáƒ”მების ტიპს შეიცáƒáƒ•áƒ¡.\n"
+"მáƒáƒœáƒáƒªáƒ”მის áƒáƒ› ტიპის დისკზე შენáƒáƒ®áƒ•áƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ, áƒáƒ¡áƒ” რáƒáƒ›, áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ.\n"
+"შეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრთáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ.\n"
+"პრáƒáƒ‘ლემური ცხრილების სიის ხილვრშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒœáƒáƒ®áƒšáƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡, რáƒáƒ›áƒ”ლიც უნდრგáƒáƒœáƒáƒ®áƒšáƒ“ეს\n"
+"ALTER EXTENSION ბრძáƒáƒœáƒ”ბით. ფáƒáƒ˜áƒšáƒ˜\n"
+" %s\n"
+", რáƒáƒªáƒ ის შესრულდებრpsql-ით ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ, გáƒáƒœáƒáƒáƒ®áƒšáƒ”ბს áƒáƒ›\n"
+"გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბებს."
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#, c-format
+#~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "ICU-ს ენის მნიშვნელáƒáƒ‘ები მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ისთვის \"%s\" áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კლáƒáƒ¡áƒ¢áƒ”რი შეიცáƒáƒ•áƒ¡ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რი შეიცáƒáƒ•áƒ¡ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "%s-ის %s-áƒáƒ“ გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ.\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ (წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ)\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: რეგულáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ\n"
+
+#, c-format
+#~ msgid "could not access directory \"%s\": %m\n"
+#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m\n"
+
+#, c-format
+#~ msgid "could not create directory \"%s\": %m\n"
+#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m\n"
+
+#, c-format
+#~ msgid "could not get control data directory using %s: %s"
+#~ msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s გáƒáƒ›áƒáƒ§áƒ”ნებით: %s"
+
+#, c-format
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s\n"
+
+#, c-format
+#~ msgid "could not open log file \"%s\": %m\n"
+#~ msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m\n"
+
+#, c-format
+#~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ“ირებრ\"%s\" áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "%s-სთვის სისტემური ენის მიღების შეცდáƒáƒ›áƒ\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "მიმდინáƒáƒ áƒ” ენის მიღების პრáƒáƒ‘ლემáƒ\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "ძველი ენის (\"%s\") áƒáƒ¦áƒ“გენის პრáƒáƒ‘ლემáƒ\n"
+
+#, c-format
+#~ msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის lc_collate მნიშვნელáƒáƒ‘ები \"%s\" áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n"
+
+#, c-format
+#~ msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის lc_ctype მნიშვნელáƒáƒ‘ები \"%s\" áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n"
+
+#, c-format
+#~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის \"%s\" ენის მáƒáƒ›áƒ¬áƒáƒ“ებლები áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n"
+
+#, c-format
+#~ msgid "out of memory\n"
+#~ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#, c-format
+#~ msgid "too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")\n"
diff --git a/src/bin/pg_upgrade/po/ko.po b/src/bin/pg_upgrade/po/ko.po
new file mode 100644
index 0000000..3851add
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ko.po
@@ -0,0 +1,1882 @@
+# LANGUAGE 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.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:49+0000\n"
+"PO-Revision-Date: 2023-09-08 16:11+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: check.c:69
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"옛 ìš´ì˜ ì„œë²„ì—ì„œ ì¼ê´€ì„± 검사를 진행합니다.\n"
+"------------------------------------------"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"ì¼ê´€ì„± 검사 수행중\n"
+"------------------"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*í´ëŸ¬ìŠ¤í„° 호환성*"
+
+#: check.c:229
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"여기서 pg_upgrade ìž‘ì—…ì„ ì‹¤íŒ¨í•œë‹¤ë©´, ìž¬ì‹œë„ í•˜ê¸° ì „ì— ë¨¼ì €\n"
+"새 í´ëŸ¬ìŠ¤í„°ë¥¼ 처ìŒë¶€í„° 다시 만들어 진행해야 합니다."
+
+#: check.c:270
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"pg_upgrade ìž‘ì—…ì—서는 최ì í™”기를 위한 통계 정보까지 업그레ì´ë“œ\n"
+"하지는 않습니다. 새 서버가 실행 ë  ë•Œ, ë‹¤ìŒ ëª…ë ¹ì„ ìˆ˜í–‰í•˜ê¸¸ 권합니다:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:276
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"아래 스í¬ë¦½íŠ¸ë¥¼ 실행하면, 옛 í´ëŸ¬ìŠ¤í„° ìžë£Œë¥¼ 지울 것입니다:\n"
+" %s"
+
+#: check.c:281
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"옛 í´ëŸ¬ìŠ¤í„° ìžë£Œ 파ì¼ì„ 지우는 스í¬ë¦½íŠ¸ë¥¼ 만들지 못했습니다.\n"
+"ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë‚˜, 새 í´ëŸ¬ìŠ¤í„°ê°€ 옛 í´ëŸ¬ìŠ¤í„° 안ì—\n"
+"있기 때문입니다. 옛 í´ëŸ¬ìŠ¤í„° ìžë£ŒëŠ” ì§ì ‘ 찾아서 지우세요."
+
+#: check.c:293
+#, c-format
+msgid "Checking cluster versions"
+msgstr "í´ëŸ¬ìŠ¤í„° 버전 검사 중"
+
+#: check.c:305
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "ì´ ë„구는 PostgreSQL %s ê³¼ ê·¸ ì´ìƒ 버전ì—ì„œ 사용할 수 있습니다."
+
+#: check.c:310
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "ì´ ë„구는 PostgreSQL %s 버전으로만 업그레ì´ë“œ í•  수 있습니다."
+
+#: check.c:319
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr ""
+"ì´ ë„구는 ë” ë‚®ì€ ë©”ì´ì ¸ PostgreSQL 버전으로 다운그레ì´ë“œí•˜ëŠ”ë° ì‚¬ìš©í•  수 ì—†"
+"습니다."
+
+#: check.c:324
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions."
+msgstr "옛 í´ëŸ¬ìŠ¤í„° ìžë£Œì™€ ì‹¤í–‰íŒŒì¼ ë””ë ‰í„°ë¦¬ê°€ 서로 ë©”ì´ì ¸ ë²„ì „ì´ ë‹¤ë¦…ë‹ˆë‹¤."
+
+#: check.c:327
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions."
+msgstr "새 í´ëŸ¬ìŠ¤í„° ìžë£Œì™€ ì‹¤í–‰íŒŒì¼ ë””ë ‰í„°ë¦¬ê°€ 서로 ë©”ì´ì ¸ ë²„ì „ì´ ë‹¤ë¦…ë‹ˆë‹¤."
+
+#: check.c:342
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be different."
+msgstr ""
+"ìš´ì˜ ì„œë²„ 검사를 í•  때는, 옛 서버, 새 ì„œë²„ì˜ í¬íŠ¸ë¥¼ 다르게 지정해야 합니다."
+
+#: check.c:362
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr ""
+"\"%s\" 새 ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ê°€ 비어있지 ì•ŠìŒ: \"%s.%s\" 릴레ì´ì…˜ì„ 찾았ìŒ"
+
+#: check.c:385
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "새 í´ëŸ¬ìŠ¤í„° í…Œì´ë¸”스페ì´ìŠ¤ 디렉터리 검사 중"
+
+#: check.c:396
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "새 í´ëŸ¬ìŠ¤í„° í…Œì´ë¸”스페ì´ìŠ¤ 디렉터리가 ì´ë¯¸ 있ìŒ: \"%s\""
+
+#: check.c:429
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i."
+"e. %s"
+msgstr ""
+"\n"
+"경고: 새 ë°ì´í„° 디렉터리는 옛 ë°ì´í„° 디렉터리 ì•ˆì— ë‘˜ 수 없습니다, 예: %s"
+
+#: check.c:453
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, i.e. %s"
+msgstr ""
+"\n"
+"경고: ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”스페ì´ìŠ¤ 위치를 ë°ì´í„° 디렉터리 ì•ˆì— ë‘˜ 수 없습니다, "
+"예: %s"
+
+#: check.c:463
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "옛 í´ëŸ¬ìŠ¤í„°ë¥¼ 지우는 스í¬ë¦½íŠ¸ë¥¼ 만듭니다"
+
+#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056
+#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s"
+
+#: check.c:517
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "\"%s\" 파ì¼ì— 실행 ê¶Œí•œì„ ì¶”ê°€ í•  수 ì—†ìŒ: %s"
+
+#: check.c:537
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 사용ìžê°€ 설치 ìž‘ì—…ì„ í•œ 사용ìžì¸ì§€ 확ì¸í•©ë‹ˆë‹¤"
+
+#: check.c:553
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ 사용ìžëŠ” 설치 ìž‘ì—…ì„ í•œ 사용ìžê°€ 아닙니다"
+
+#: check.c:564
+#, c-format
+msgid "could not determine the number of users"
+msgstr "ì‚¬ìš©ìž ìˆ˜ë¥¼ 확ì¸í•  수 ì—†ìŒ"
+
+#: check.c:572
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì—서만 설치 사용 사용ìžê°€ ì •ì˜ë  수 있ìŒ"
+
+#: check.c:601
+#, c-format
+msgid "Checking database connection settings"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì—°ê²° ì„¤ì •ì„ í™•ì¸ ì¤‘"
+
+#: check.c:627
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false"
+msgstr ""
+"template0 ë°ì´í„°ë² ì´ìŠ¤ ì ‘ì†ì„ 금지해야 합니다. 예: 해당 ë°ì´í„°ë² ì´ìŠ¤ì˜ "
+"pg_database.datallowconn ê°’ì´ false여야 합니다."
+
+#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135
+#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394
+#: function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "ì¹˜ëª…ì  ì˜¤ë¥˜"
+
+#: check.c:655
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"template0ì´ ì•„ë‹Œ 모든 ë°ì´í„°ë² ì´ìŠ¤ëŠ” ì—°ê²°ì„ í—ˆìš©í•´ì•¼í•˜ë©°, 즉 \n"
+"pg_database.datallowconn ê°’ì´ true여야합니다. ì„¤ì¹˜ëœ ë°ì´í„°ë² ì´ìŠ¤\n"
+"중 pg_database.datallowconn ê°’ì´ falseë¡œ ì„¤ì •ëœ template0ì´ ì•„ë‹Œ\n"
+"ë°ì´í„°ë² ì´ìŠ¤ê°€ 있습니다. template0ì´ ì•„ë‹Œ ë°ì´í„°ë² ì´ìŠ¤ì˜ 모든 ì—°ê²°ì„\n"
+"허용하거나 ì—°ê²°ì„ í—ˆìš©í•˜ì§€ 않는 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 삭제하는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.\n"
+"문제가 있는 ë°ì´í„°ë² ì´ìŠ¤ 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ì— 기ë¡í•´ ë‘었습니다:\n"
+" %s"
+
+#: check.c:680
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì„ í™•ì¸ ì¤‘"
+
+#: check.c:689
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŒ"
+
+#: check.c:691
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì— 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŒ"
+
+#: check.c:716
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "contrib/isn ëª¨ë“ˆì˜ bigint 처리가 서로 ê°™ì€ì§€ í™•ì¸ ì¤‘"
+
+#: check.c:776
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"설치ë˜ì–´ 있는 \"contrib/isn\" ëª¨ë“ˆì€ bigint ìžë£Œí˜•ì„ 사용합니다.\n"
+"ì´ bigint ìžë£Œí˜•ì˜ 처리 ë°©ì‹ì´ 새 버전과 옛 버전 ì‚¬ì´ í˜¸í™˜ì„±ì´ ì—†ì–´,\n"
+"ì´ í´ëŸ¬ìŠ¤í„° 업그레ì´ë“œë¥¼ í•  수 없습니다. 먼저 수ë™ìœ¼ë¡œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ \n"
+"ë¤í”„하고, 해당 ëª¨ë“ˆì„ ì‚­ì œí•˜ê³ , 업그레ì´ë“œ í•œ ë’¤ 다시 ë¤í”„ 파ì¼ì„ ì´ìš©í•´\n"
+"ë³µì›í•  수 있습니다. 문제가 있는 함수는 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:798
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "ì‚¬ìš©ìž ì •ì˜ postfix ì—°ì‚°ìžë¥¼ 검사 중"
+
+#: check.c:874
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"ë” ì´ìƒ ì‚¬ìš©ìž ì •ì˜ postfix ì—°ì‚°ìžë¥¼ 지ì›í•˜ì§€ 않습니다.\n"
+"해당 ì—°ì‚°ìžë¥¼ 지우고, prefix ì—°ì‚°ìžë¡œ 바꾸거나, 함수 호출\n"
+"ë°©ì‹ìœ¼ë¡œ 바꾸는 ê²ƒì„ ê³ ë ¤í•´ 보십시오.\n"
+"관련 ì‚¬ìš©ìž ì •ì˜ postfix ì—°ì‚°ìž ëª©ë¡ì€ 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:898
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "불완전한 다형 함수를 확ì¸í•©ë‹ˆë‹¤"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement"
+"\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"ì´ ì„œë²„ì—는 \"anyarray\" ë˜ëŠ” \"anyelement\" ìœ í˜•ì˜ ì¸ìˆ˜ë¥¼ 사용하는 \n"
+"내부 다형 함수를 참조하는 ì‚¬ìš©ìž ì •ì˜ ê°ì²´ê°€ 있습니다. \n"
+"ì´ëŸ¬í•œ ì‚¬ìš©ìž ì •ì˜ ê°ì²´ëŠ” 업그레ì´ë“œí•˜ê¸° ì „ì— ì‚­ì œí•˜ê³ , \n"
+"\"anycompatiblearray\" ë˜ëŠ” \"anycompatible\" ìœ í˜•ì˜ ìƒˆë¡œìš´ ëŒ€ì‘ í•¨ìˆ˜ë¥¼\n"
+"참조하ë„ë¡ ë³€ê²½í•œ 후 다시 ë³µì›í•´ì•¼í•©ë‹ˆë‹¤. 문제가 있는 ê°ì²´ 목ë¡ì€\n"
+"ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS 옵션 있는 í…Œì´ë¸” í™•ì¸ ì¤‘"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"ë” ì´ìƒ WITH OIDS ì˜µì…˜ì„ ì‚¬ìš©í•˜ëŠ” í…Œì´ë¸”ì„ ì§€ì›í•˜ì§€ 않습니다.\n"
+"먼저 oid ì¹¼ëŸ¼ì´ ìžˆëŠ” 기존 í…Œì´ë¸”ì„ ëŒ€ìƒìœ¼ë¡œ ë‹¤ìŒ ëª…ë ¹ì„ ì‹¤í–‰í•´ì„œ\n"
+"ì´ ì˜µì…˜ì„ ëº„ ê²ƒì„ ê³ ë ¤í•´ 보십시오.\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"관련 í…Œì´ë¸” 목ë¡ì€ 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:1105
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— ë‚´ìž¥ 복합 ìžë£Œí˜•ì„ 쓰는지 í™•ì¸ ì¤‘"
+
+#: check.c:1136
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"해당 ë°ì´í„°ë² ì´ìŠ¤ 사용ìžê°€ 만든 í…Œì´ë¸”ì—ì„œ 내장 복합 ìžë£Œí˜•ì„ 사용하고 있습니"
+"다.\n"
+"ì´ ìžë£Œí˜•ì˜ OID ê°’ì´ PostgreSQL 버전별로 다를 수 있어,\n"
+"업그레ì´ë“œ í•  수 없습니다. 해당 ì¹¼ëŸ¼ì„ ì‚­ì œí•œ ë’¤ 다시 업그레ì´ë“œí•˜ì„¸ìš”.\n"
+"해당 ì¹¼ëŸ¼ì´ ìžˆëŠ” í…Œì´ë¸” 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— reg* ìžë£Œí˜•ì„ 쓰는지 í™•ì¸ ì¤‘"
+
+#: check.c:1197
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"옛 서버ì—ì„œ 사용ìžê°€ 만든 í…Œì´ë¸”ì—ì„œ reg* ìžë£Œí˜•ì„ 사용하고 있습니다.\n"
+"ì´ ìžë£Œí˜•ë“¤ì€ pg_upgrade 명령으로 ë‚´ì •ëœ ì‹œìŠ¤í…œ OID를 사용하지 못할 수\n"
+"있습니다. 그래서 업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다.\n"
+"사용하고 있는 ì¹¼ëŸ¼ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ë‹¤ì‹œ ì‹œë„하세요.\n"
+"ì´ëŸ° ìžë£Œí˜•ì„ 사용하는 ì¹¼ëŸ¼ë“¤ì€ ì•„ëž˜ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:1218
+#, c-format
+msgid "Checking for incompatible \"aclitem\" data type in user tables"
+msgstr "ì‚¬ìš©ìž í…Œì´ë¸”ì—ì„œ \"aclitem\" ìžë£Œí˜• 호환성 검사 중"
+
+#: check.c:1225
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"ì‚¬ìš©ìž í…Œì´ë¸”ì—ì„œ \"jsonb\" ìžë£Œí˜•ì„ 사용하고 있습니다.\n"
+"9.4 베타 비전 ì´í›„ \"jsonb\" 내부 ìžë£Œ 구조가 바뀌었습니다.\n"
+"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n"
+"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”\n"
+"해당 ìžë£Œí˜•ì„ 사용하는 ì¹¼ëŸ¼ë“¤ì€ ì•„ëž˜ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:1246
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "\"jsonb\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘"
+
+#: check.c:1255
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ì‚¬ìš©ìž í…Œì´ë¸”ì—ì„œ \"jsonb\" ìžë£Œí˜•ì„ 사용하고 있습니다.\n"
+"9.4 베타 비전 ì´í›„ \"jsonb\" 내부 ìžë£Œ 구조가 바뀌었습니다.\n"
+"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n"
+"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”\n"
+"해당 ìžë£Œí˜•ì„ 사용하는 ì¹¼ëŸ¼ë“¤ì€ ì•„ëž˜ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: check.c:1282
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\"ë¡œ 시작하는 롤 í™•ì¸ ì¤‘"
+
+#: check.c:1314
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"기존 ë°ì´í„°ë² ì´ìŠ¤ì— 사용ìžê°€ 만든 \"pg_\"ë¡œ 시작하는 롤ì´\n"
+"있습니다. \"pg_\"는 시스템 롤로 ì˜ˆì•½ëœ ì ‘ë‘어입니다.\n"
+"ì´ ë¡¤ë“¤ì„ ë‹¤ë¥¸ ì´ë¦„으로 바꿔야 업그레ì´ë“œê°€ 가능합니다.\n"
+"\"pg_\"ë¡œ 시작하는 롤 ì´ë¦„ 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ì— 있습니다:\n"
+" %s"
+
+#: check.c:1334
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "ì‚¬ìš©ìž ì •ì˜ ì¸ì½”딩 ë³€í™˜ê·œì¹™ì„ ê²€ì‚¬ 중"
+
+#: check.c:1395
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"ì‚¬ìš©ìž ì •ì˜ ì¸ì½”딩 변환 규칙용 변환 함수 매개 변수가\n"
+"PostgreSQL 14 비전 ì´í›„ 바뀌었습니다.\n"
+"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n"
+"먼저 ì´ëŸ° 변환 ê·œì¹™ì„ ì˜› 서버ì—ì„œ 지우고 다시 ì‹œë„하세요.\n"
+"해당 변환 규칙 목ë¡ì€ 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "%s 사용하는 컨트롤 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„° ìƒíƒœ 문제"
+
+#: controldata.c:158
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"ì›ë³¸ í´ëŸ¬ìŠ¤í„°ëŠ” 복구 모드(대기 서버 모드나, 복구 중) ìƒíƒœì—ì„œ 중지 ë˜ì—ˆìŠµë‹ˆ"
+"다. 업그레ì´ë“œ 하려면, ë¬¸ì„œì— ì–¸ê¸‰í•œ 것 처럼 \"rsync\"를 사용하든가, ê·¸ 서버"
+"를 ìš´ì˜ ì„œë²„ 모드로 바꾼 ë’¤ 중지하고 작업하십시오."
+
+#: controldata.c:160
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ëŠ” 복구 모드(대기 서버 모드나, 복구 중) ìƒíƒœì—ì„œ 중지 ë˜ì—ˆìŠµë‹ˆ"
+"다. 업그레ì´ë“œ 하려면, ë¬¸ì„œì— ì–¸ê¸‰í•œ 것 처럼 \"rsync\"를 사용하든가, ê·¸ 서버"
+"를 ìš´ì˜ ì„œë²„ 모드로 바꾼 ë’¤ 중지하고 작업하십시오."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ëŠ” ì •ìƒì ìœ¼ë¡œ 종료ë˜ì–´ì•¼ 함"
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ëŠ” ì •ìƒ ì¢…ë£Œë˜ì–´ì•¼ 함"
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ì— í´ëŸ¬ìŠ¤í„° ìƒíƒœ ì •ë³´ê°€ ì—†ìŒ:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì— í´ëŸ¬ìŠ¤í„° ìƒíƒœ ì •ë³´ê°€ ì—†ìŒ:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal 문제"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: controldata ë³µì› ë¬¸ì œ"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— 필요한 컨트롤 ì •ë³´ê°€ 몇몇 빠져있ìŒ:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì— 필요한 컨트롤 ì •ë³´ê°€ 몇몇 빠져있ìŒ:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " ì²´í¬í¬ì¸íŠ¸ ë‹¤ìŒ XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " 마지막 ì²´í¬í¬ì¸íŠ¸ ë‹¤ìŒ OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " 마지막 ì²´í¬í¬ì¸íŠ¸ ë‹¤ìŒ MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " 마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " 마지막 ì²´í¬í¬ì¸íŠ¸ ì œì¼ ì˜¤ëž˜ëœ XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " 마지막 ì²´í¬í¬ì¸íŠ¸ ë‹¤ìŒ MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " 리셋 ë’¤ 첫 WAL ì¡°ê°"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 ì¸ìž 처리 ë°©ì‹"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " 최대 정렬"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " ë¸”ë¡ í¬ê¸°"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " 대형 릴레ì´ì…˜ ì¡°ê° í¬ê¸°"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL ë¸”ë¡ í¬ê¸°"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL ì¡°ê° í¬ê¸°"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " 최대 ì‹ë³„ìž ê¸¸ì´"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " 최대 ì¸ë±ìŠ¤ 칼럼 수"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " 최대 토스트 ì¡°ê° í¬ê¸°"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " 대형 ê°ì²´ ì¡°ê° í¬ê¸°"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " date/time ìžë£Œí˜•ì„ 정수로?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " ìžë£Œ ì²´í¬ì„¬ 버전"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "필요한 컨트롤 ì •ë³´ ì—†ì´ëŠ” 진행할 수 ì—†ìŒ, 중지 함"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ì •ë ¬ì´ ì„œë¡œ 다릅니다.\n"
+"하나는 32비트고, 하나는 64ë¹„íŠ¸ì¸ ê²½ìš° 같습니다."
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ë¸”ë¡ í¬ê¸°ê°€ 서로 다릅니다."
+
+#: controldata.c:666
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 릴레ì´ì…˜ ì¡°ê° í¬ê°€ê°€ 서로 다릅니다."
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata WAL ë¸”ë¡ í¬ê¸°ê°€ 서로 다릅니다."
+
+#: controldata.c:672
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata WAL ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다."
+
+#: controldata.c:675
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 ì‹ë³„ìž ê¸¸ì´ê°€ 서로 다릅니다."
+
+#: controldata.c:678
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 ì¸ë±ìŠ¤ 칼럼수가 서로 다릅니다."
+
+#: controldata.c:681
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 토스트 ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다."
+
+#: controldata.c:686
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 대형 ê°ì²´ ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다."
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata date/time 저장 í¬ê¸°ê°€ 서로 다릅니다."
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr ""
+"옛 í´ëŸ¬ìŠ¤í„°ëŠ” ë°ì´í„° ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ ì•Šê³ , 새 í´ëŸ¬ìŠ¤í„°ëŠ” 사용하고 있습"
+"니다."
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr ""
+"옛 í´ëŸ¬ìŠ¤í„°ëŠ” ë°ì´í„° ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê³ , 새 í´ëŸ¬ìŠ¤í„°ëŠ” 사용하고 있지 않습"
+"니다."
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ì²´í¬ì„¬ ë²„ì „ì´ ì„œë¡œ 다릅니다."
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "옛 global/pg_control 파ì¼ì— \".old\" ì´ë¦„ì„ ë§ë¶™ìž…니다."
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"옛 버전으로 옛 í´ëŸ¬ìŠ¤í„°ë¥¼ 사용해서 서버를 실행하려면,\n"
+"%s/global/pg_control.old 파ì¼ì˜ ì´ë¦„ì„ \".old\" 빼고 바꾸어\n"
+"사용해야합니다. 업그레ì´ë“œë¥¼ \"link\" 모드로 했기 때문ì—,\n"
+"한번ì´ë¼ë„ 새 ë²„ì „ì˜ ì„œë²„ê°€ ì´ í´ëŸ¬ìŠ¤í„°ë¥¼ ì´ìš©í•´ì„œ 실행ë˜ì—ˆë‹¤ë©´,\n"
+"ì´ íŒŒì¼ì´ ë” ì´ìƒ 안전하지 않기 때문입니다."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "ì „ì—­ ê°ì²´ ë¤í”„를 만듭니다"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 스키마 ë¤í”„를 만듭니다"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "%s ëª…ë ¹ì„ ì‚¬ìš©í•´ì„œ pg_ctl 버전 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "%sì—ì„œ pg_ctl ë²„ì „ì„ ì•Œ 수 ì—†ìŒ"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "ëª…ë ¹ì´ ë„ˆë¬´ 긺"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*실패*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "\"%s\" 실행ì—ì„œ 문제 ë°œìƒ"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"\"%s\" ë˜ëŠ” \"%s\" 파ì¼ì˜ 마지막 ë¶€ë¶„ì„ ì‚´íŽ´ë³´ë©´\n"
+"ì´ ë¬¸ì œë¥¼ í’€ 실마리가 ë³´ì¼ ê²ƒìž…ë‹ˆë‹¤."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"\"%s\" 파ì¼ì˜ 마지막 ë¶€ë¶„ì„ ì‚´íŽ´ë³´ë©´\n"
+"ì´ ë¬¸ì œë¥¼ í’€ 실마리가 ë³´ì¼ ê²ƒìž…ë‹ˆë‹¤."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "\"%s\" 로그 파ì¼ì„ 쓸 수 ì—†ìŒ: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "\"%s\" 파ì¼ì„ ì½ê¸° 위해 ì—´ 수 없습니다: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "현재 ë””ë ‰í„°ë¦¬ì˜ ì½ê¸° 쓰기 ê¶Œí•œì„ ë¶€ì—¬í•˜ì„¸ìš”."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "\"%s\" 검사 실패: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" 파ì¼ì€ 디렉터리가 아닙니다."
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "\"%s\" 검사 실패: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "\"%s\" 검사 실패: 실행할 수 ì—†ìŒ"
+
+#: exec.c:456
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "\"%s\" 검사 실패: ìž˜ëª»ëœ ë²„ì „: 현재 \"%s\", 기대값 \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ í´ë¡  중 오류: %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레ì´ì…˜ í´ë¡  중 오류: \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레ì´ì…˜ í´ë¡  중 오류: \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ 복사 중 오류: %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ ë§í¬ 만드는 중 오류: %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr ""
+"\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" íŒŒì¼ ìƒíƒœ 정보를 ì•Œ 수 ì—†ìŒ: %s"
+
+#: file.c:229
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì— 페ì´ì§€ê°€ ì†ìƒë˜ì—ˆìŒ"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "옛 ë°ì´í„° 디렉터리와 새 ë°ì´í„° 디렉터리 ì‚¬ì´ íŒŒì¼ í´ë¡  실패: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "ì´ ìš´ì˜ì²´ì œëŠ” íŒŒì¼ í´ë¡  ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다."
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system."
+msgstr ""
+"ë°ì´í„° 디렉터리간 하드 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %s\n"
+"하드 ë§í¬ë¥¼ 사용하려면, ë‘ ë””ë ‰í„°ë¦¬ê°€ ê°™ì€ ì‹œìŠ¤í…œ 볼륨 ì•ˆì— ìžˆì–´ì•¼ 합니다."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "필요한 ë¼ì´ë¸ŒëŸ¬ë¦¬ í™•ì¸ ì¤‘"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ 로드 실패: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"옛 버전ì—는 있고, 새 버전ì—는 없는 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì´ 있습니다. 새 버전ì—\n"
+"해당 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì„ 설치하거나, 옛 버전ì—ì„œ 해당 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 삭제하고,\n"
+"업그레ì´ë“œ ìž‘ì—…ì„ í•´ì•¼í•©ë‹ˆë‹¤. 문제가 있는 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì€ 다ìŒê³¼ 같습니다:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s"
+"\", new name \"%s.%s\""
+msgstr ""
+"%u OIDì— ëŒ€í•œ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì´ ì„œë¡œ 다릅니다: 옛 ì´ë¦„: \"%s.%s\", "
+"새 ì´ë¦„: \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ ë‚´ í…Œì´ë¸” ì´ë¦„ì´ ì„œë¡œ 다릅니다"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 해당 ì¸ë±ìŠ¤: \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 해당 ì¸ë±ìŠ¤ì˜ OID: %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" ê°ì²´ì˜ 토스트 í…Œì´ë¸”"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 해당 토스트 ë² ì´ë¸”ì˜ OID: %u"
+
+#: info.c:261
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database \"%s"
+"\": %s"
+msgstr ""
+"새 í´ëŸ¬ìŠ¤í„°ì˜ %u OID (해당 ë°ì´í„°ë² ì´ìŠ¤: \"%s\")ê°€ 옛 í´ëŸ¬ìŠ¤í„°ì— ì—†ìŒ: %s"
+
+#: info.c:264
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database \"%s"
+"\": %s"
+msgstr ""
+"옛 í´ëŸ¬ìŠ¤í„°ì˜ %u OID (해당 ë°ì´í„°ë² ì´ìŠ¤: \"%s\")ê°€ 새 í´ëŸ¬ìŠ¤í„°ì— ì—†ìŒ: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"ì›ë³¸ ë°ì´í„°ë² ì´ìŠ¤:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: root 권한으로 실행할 수 ì—†ìŒ"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ìž˜ëª»ëœ ì˜› í¬íŠ¸ 번호"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ìž˜ëª»ëœ ìƒˆ í¬íŠ¸ 번호"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\" ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정 í–ˆìŒ (시작: \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "ìž‘ì—… ë‚´ì—­ì„ ìžì„¸ížˆ ë´„"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "옛 í´ëŸ¬ìŠ¤í„° ì‹¤í–‰íŒŒì¼ ìœ„ì¹˜"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "새 í´ëŸ¬ìŠ¤í„° ì‹¤íŒ½íŒŒì¼ ìœ„ì¹˜"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "옛 í´ëŸ¬ìŠ¤í„° ìžë£Œ 위치"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "새 í´ëŸ¬ìŠ¤í„° ìžë£Œ 위치"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "소켓 íŒŒì¼ ë§Œë“¤ 위치"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "현재 디렉터리 위치를 ì•Œ 수 ì—†ìŒ"
+
+#: option.c:259
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr ""
+"윈ë„우즈 환경ì—서는 pg_upgrade ëª…ë ¹ì€ ìƒˆ í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리 안ì—서는 실"
+"행할 수 ì—†ìŒ"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"새 ë°ì´í„° í´ëŸ¬ìŠ¤í„° 버전과 pg_upgrade ë²„ì „ì˜ ë©”ì´ì € ë²„ì „ì´ ì„œë¡œ 다릅니다.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [옵션]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "옵션:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 옛 í´ëŸ¬ìŠ¤í„° 실행 파ì¼ì˜ 디렉터리\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 새 í´ëŸ¬ìŠ¤í„° 실행 파ì¼ì˜ 디렉터리 (기본값:\n"
+" pg_upgrade가 있는 디렉터리)\n"
+
+#: option.c:275
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 실 ìž‘ì—… ì—†ì´, 그냥 검사만\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 옛 í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 새 í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리\n"
+
+#: option.c:278
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=NUM ë™ì‹œì— ìž‘ì—…í•  프로세스 ë˜ëŠ” 쓰레드 수\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link 새 í´ëŸ¬ìŠ¤í„° êµ¬ì¶•ì„ ë³µì‚¬ 대신 ë§í¬ 사용\n"
+
+#: option.c:280
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" -N, --no-sync ìž‘ì—… 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ ì•ŠìŒ\n"
+
+#: option.c:281
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=옵션 옛 서버ì—ì„œ 사용할 서버 옵션들\n"
+
+#: option.c:282
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=옵션 새 서버ì—ì„œ 사용할 서버 옵션들\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 옛 í´ëŸ¬ìŠ¤í„° í¬íŠ¸ 번호 (기본값 %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 새 í´ëŸ¬ìŠ¤í„° í¬íŠ¸ 번호 (기본값 %d)\n"
+
+#: option.c:285
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain ìž‘ì—… 완료 후 ì‚¬ìš©í–ˆë˜ SQLê³¼ 로그 íŒŒì¼ ë‚¨ê¹€\n"
+
+#: option.c:286
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 사용할 소켓 디렉터리 (기본값: 현재 디렉터"
+"리)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=ì´ë¦„ í´ëŸ¬ìŠ¤í„° 슈í¼ìœ ì € (기본값 \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose ìž‘ì—… ë‚´ì—­ì„ ìžì„¸ížˆ 남김\n"
+
+#: option.c:289
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone 새 í´ëŸ¬ìŠ¤í„° êµ¬ì¶•ì„ ë³µì‚¬ 대신 í´ë¡  사용\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy 새 í´ëŸ¬ìŠ¤í„°ë¡œ íŒŒì¼ ë³µì‚¬ (기본값)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade ìž‘ì—… ì „ì— ë¨¼ì € 해야 í•  것들:\n"
+" 새 ë²„ì „ì˜ initdb 명령으로 새 ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„°ë¥¼ 만들고\n"
+" 옛 서버를 중지하고\n"
+" 새 ì„œë²„ë„ ì¤‘ì§€í•˜ì„¸ìš”.\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade ìž‘ì—…ì€ ë‹¤ìŒ ë„¤ê°œì˜ ì˜µì…˜ ê°’ì€ ë°˜ë“œì‹œ 지정해야 함:\n"
+" 옛 ë°ì´í„° í´ëŸ¬ìŠ¤í„° 디렉터리 (-d DATADIR)\n"
+" 새 ë°ì´í„° í´ëŸ¬ìŠ¤í„° 디렉터리 (-D DATADIR)\n"
+" 옛 ë²„ì „ì˜ \"bin\" 디렉터리 (-b BINDIR)\n"
+" 새 ë²„ì „ì˜ \"bin\" 디렉터리 (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"사용예:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"%s ìœ„ì¹˜ì˜ ë””ë ‰í„°ë¦¬ë¥¼ 알고 있어야 함.\n"
+"%s 명령행 옵션ì´ë‚˜, %s 환경 변수를 사용하세요."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ìš© 실 ë°ì´í„° 디렉터리를 찾는 중"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ìš© 실 ë°ì´í„° 디렉터리를 찾는 중"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "%s 지정한 ë°ì´í„° 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "%d 번째 ì¤„ì„ \"%s\" 파ì¼ì—ì„œ ì½ì„ 수 ì—†ìŒ: %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "지정한 %hu 옛 í¬íŠ¸ 번호를 %hu 번호로 바꿈"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "ìž‘ì—…ìš© 프로세스를 만들 수 ì—†ìŒ: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "ìž‘ì—…ìš© 쓰레드를 만들 수 ì—†ìŒ: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() 실패: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "하위 ìž‘ì—…ìžê°€ ë¹„ì •ìƒ ì¢…ë£Œë¨: ìƒíƒœê°’ %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "하위 ìž‘ì—…ìžê°€ ë¹„ì •ìƒ ì¢…ë£Œë¨: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"업그레ì´ë“œ 진행 중\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ë‹¤ìŒ OID 설정 중"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "ë°ì´í„° 디렉터리 fsync ìž‘ì—… 중"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"업그레ì´ë“œ 마침\n"
+"---------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© 디렉터리 ì´ë¦„ì´ ë„ˆë¬´ ê¹€"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: 실행할 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다."
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"옛 서버가 현재 ìš´ì˜ ë˜ê³  있습니다.\n"
+"먼저 서버를 중지하고 진행하세요."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"새 서버가 현재 ìš´ì˜ ë˜ê³  있습니다.\n"
+"먼저 서버를 중지하고 진행하세요."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© 로케ì¼ê³¼ ì¸ì½”딩 설정 중"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì˜ 모든 ë¡œìš°ì— ëŒ€í•´ì„œ 통계 ì •ë³´ 수집 중"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì˜ 모든 ë¡œìš°ì— ëŒ€í•´ì„œ ì˜êµ¬ 격리(freeze) 중"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ì „ì—­ ê°ì²´ë¥¼ ë³µì› ì¤‘"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ë°ì´í„°ë² ì´ìŠ¤ 스키마 ë³µì› ì¤‘"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "새 %sì—ì„œ íŒŒì¼ ì§€ìš°ëŠ” 중"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "\"%s\" 디렉터리를 ì‚­ì œ í•  수 ì—†ìŒ"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "옛 %s ê°ì²´ë¥¼ 새 서버로 복사 중"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ì œì¼ ì˜¤ëž˜ëœ XID 설정 중"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ë‹¤ìŒ íŠ¸ëžœìž­ì…˜ ID와 epoch ê°’ 설정 중"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ë‹¤ìŒ ë©€í‹° 트랜잭션 ID와 위치 ê°’ 설정 중"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ì œì¼ ì˜¤ëž˜ëœ ë©€í‹° 트랜잭션 ID 설정 중"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL ì•„ì¹´ì´ë¸Œ 재설정 중"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì—ì„œ frozenxid, minmxid ê°’ 설정 중"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "새 í´ëŸ¬ìŠ¤í„°ì—ì„œ minmxid ê°’ 설정 중"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ í´ë¡  중"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ ë³µì‚¬ 중"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ ë§í¬ 중"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "\"%s\" ì´ë¦„ì˜ ì˜› ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 새 í´ëŸ¬ìŠ¤í„°ì—ì„œ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: relfilenumber.c:218
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 파ì¼ì´ 있는지 í™•ì¸ ë„중 오류 ë°œìƒ: %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ 다시 쓰는 중"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ í´ë¡  중"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ 복사 중"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ ë§í¬ 중"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "실패, 종료함\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "실행중: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL 명령 실패\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "\"%s\" 버전 íŒŒì¼ ì—´ê¸° 실패: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "\"%s\" 버전 íŒŒì¼ êµ¬ë¬¸ ë¶„ì„ ì‹¤íŒ¨"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì‹¤í–‰ëœ ì›ë³¸ 서버로 ì ‘ì†í•  수 ì—†ìŒ:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì‹¤í–‰ëœ ëŒ€ìƒ ì„œë²„ë¡œ ì ‘ì†í•  수 ì—†ìŒ:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "ì›ë³¸ 서버를 실행하는 pg_ctl ìž‘ì—… 실패, ë˜ëŠ” ì—°ê²° 실패"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "ëŒ€ìƒ ì„œë²„ë¥¼ 실행하는 pg_ctl ìž‘ì—… 실패, ë˜ëŠ” ì—°ê²° 실패"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "%s libpq 환경 변수가 로컬 서버 ê°’ì´ ì•„ë‹˜: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 사용하는 경우 ê°™ì€ ì‹œìŠ¤í…œ 카탈로그 버전으로\n"
+"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "\"%s\" ì´ë¦„ì˜ í…Œì´ë¸”스페ì´ìŠ¤ 디렉터리가 ì—†ìŒ"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "\"%s\" í…Œì´ë¸”스페ì´ìŠ¤ ë””ë ‰í„°ë¦¬ì˜ ìƒíƒœ 정보를 구할 수 ì—†ìŒ: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "\"%s\" í…Œì´ë¸”스페ì´ìŠ¤ 경로는 디렉터리가 아님"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "\"line\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"해당 ë°ì´í„°ë² ì´ìŠ¤ì—ì„œ \"line\" ìžë£Œí˜•ì„ 사용하는 í…Œì´ë¸”ì´ ìžˆìŠµë‹ˆë‹¤.\n"
+"ì´ ìžë£Œí˜•ì˜ 입출력 ë°©ì‹ì´ 옛 버전과 새 버전ì—ì„œ 서로 호환하지 않습니다.\n"
+"먼저 ì´ ìžë£Œí˜•ì„ 사용하는 í…Œì´ë¸”ì„ ì‚­ì œ 후 업그레ì´ë“œ ìž‘ì—…ì„ í•˜ê³ ,\n"
+"수ë™ìœ¼ë¡œ ë³µì› ìž‘ì—…ì„ í•´ì•¼ 합니다.\n"
+"ìž‘ì—… ëŒ€ìƒ í…Œì´ë¸” 목ë¡ì„ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "ìž˜ëª»ëœ \"unknown\" ì‚¬ìš©ìž ì¹¼ëŸ¼ì„ í™•ì¸ ì¤‘"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"해당 ë°ì´í„°ë² ì´ìŠ¤ì—ì„œ ì‚¬ìš©ìž í…Œì´ë¸”ì—ì„œ \"unknown\" ìžë£Œí˜•ì„ 사용하고 있습니"
+"다.\n"
+"ì´ ìžë£Œí˜•ì€ ë” ì´ìƒ 사용할 수 없습니다. ì´ ë¬¸ì œë¥¼ 옛 버전ì—ì„œ 먼저 정리하고\n"
+"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n"
+"해당 í…Œì´ë¸” 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "해쉬 ì¸ë±ìŠ¤ í™•ì¸ ì¤‘"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "경고"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"해당 ë°ì´í„°ë² ì´ìŠ¤ì—ì„œ 해쉬 ì¸ë±ìŠ¤ë¥¼ 사용하고 있습니다. 해쉬 ì¸ë±ìŠ¤ ìžë£Œêµ¬ì¡°"
+"ê°€\n"
+"새 버전ì—ì„œ 호환ë˜ì§€ 않습니다. 업그레ì´ë“œ í›„ì— í•´ë‹¹ ì¸ë±ìŠ¤ë“¤ì„\n"
+"REINDEX 명령으로 다시 만들어야 합니다."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"해당 ë°ì´í„°ë² ì´ìŠ¤ì—ì„œ 해쉬 ì¸ë±ìŠ¤ë¥¼ 사용하고 있습니다. 해쉬 ì¸ë±ìŠ¤ ìžë£Œêµ¬ì¡°"
+"ê°€\n"
+"새 버전ì—ì„œ 호환ë˜ì§€ 않습니다. 업그레ì´ë“œ 후 ë‹¤ìŒ íŒŒì¼ì„\n"
+"슈í¼ìœ ì € 권한으로 실행한 psqlì—ì„œ 실행해서, REINDEX ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”:\n"
+" %s\n"
+"ì´ ìž‘ì—…ì´ ìžˆê¸° 전까지는 해당 ì¸ë±ìŠ¤ëŠ” invalid ìƒíƒœë¡œ 사용할 수 없게 ë©ë‹ˆë‹¤."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "ìž˜ëª»ëœ \"sql_identifier\" ì‚¬ìš©ìž ì¹¼ëŸ¼ì„ í™•ì¸ ì¤‘"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"ì‚¬ìš©ìž í…Œì´ë¸” ë˜ëŠ” ì¸ë±ìŠ¤ì— \"sql_identifier\" ìžë£Œí˜•ì„ 사용하고\n"
+"있습니다. ì´ ìžë£Œí˜•ì˜ 저장 ì–‘ì‹ì´ 바뀌었기ì—, 업그레ì´ë“œ í•  수\n"
+"없습니다. 해당 í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ì„ ì§€ìš°ê³  다시 업그레ì´ë“œ 하십시오.\n"
+"ë¬¸ì œì˜ ì¹¼ëŸ¼ì´ ìžˆëŠ” 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "확장 모듈 ì—…ë°ì´íŠ¸ í™•ì¸ ì¤‘"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "알림"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"해당 서버ì—는 ì—…ë°ì´íŠ¸ 해야하는 확장 ëª¨ë“ˆì´ ìžˆìŠµë‹ˆë‹¤.\n"
+"ì´ ìž‘ì—…ì€ ALTER EXTENSION 명령으로 í•  수 있으며, ìž‘ì—… 명령ì€\n"
+" %s\n"
+"íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤. ë°ì´í„°ë² ì´ìŠ¤ 슈í¼ìœ ì €ë¡œ psqlë¡œ ì ‘ì†í•´ì„œ\n"
+"ì´ íŒŒì¼ ì•ˆì— ìžˆëŠ” ëª…ë ¹ì„ ìˆ˜í–‰í•˜ë©´ 확장 ëª¨ë“ˆì„ ì—…ë°ì´íŠ¸ í•  수 있습니다."
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 0000000..8531c3b
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_upgrade-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po
new file mode 100644
index 0000000..a761d48
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ru.po
@@ -0,0 +1,2272 @@
+# Russian message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Maxim Yablokov <m.yablokov@postgrespro.ru>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:08+0300\n"
+"PO-Revision-Date: 2023-11-03 09:24+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Проверка целоÑтноÑти на Ñтаром работающем Ñервере\n"
+"-------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Проведение проверок целоÑтноÑти\n"
+"-------------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*КлаÑтеры ÑовмеÑтимы*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"ЕÑли работа pg_upgrade поÑле Ñтого прервётÑÑ, вы должны заново выполнить "
+"initdb\n"
+"Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера, чтобы продолжить."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"СтатиÑтика оптимизатора утилитой pg_upgrade не переноÑитÑÑ.\n"
+"ЗапуÑтив новый Ñервер, имеет ÑмыÑл выполнить:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"При запуÑке Ñтого Ñкрипта будут удалены файлы данных Ñтарого клаÑтера:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"Ðе удалоÑÑŒ Ñоздать Ñкрипт Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² данных Ñтарого клаÑтера,\n"
+"так как каталог Ñтарого клаÑтера Ñодержит пользовательÑкие табличные\n"
+"проÑтранÑтва или каталог данных нового клаÑтера.\n"
+"Содержимое Ñтарого клаÑтера нужно будет удалить вручную."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Проверка верÑий клаÑтеров"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr ""
+"Эта утилита может производить обновление только Ñ Ð²ÐµÑ€Ñии PostgreSQL %s и "
+"новее."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Эта утилита может повышать верÑию PostgreSQL только до %s."
+
+#: check.c:332
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr ""
+"Эта утилита не может понижать верÑию до более Ñтарой оÑновной верÑии "
+"PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions."
+msgstr ""
+"Каталоги данных и иÑполнÑемых файлов Ñтарого клаÑтера отноÑÑÑ‚ÑÑ Ðº разным "
+"оÑновным верÑиÑм."
+
+#: check.c:340
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions."
+msgstr ""
+"Каталоги данных и иÑполнÑемых файлов нового клаÑтера отноÑÑÑ‚ÑÑ Ðº разным "
+"оÑновным верÑиÑм."
+
+#: check.c:355
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be different."
+msgstr ""
+"Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ работающего Ñервера новый номер порта должен отличатьÑÑ Ð¾Ñ‚ "
+"Ñтарого."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr ""
+"ÐÐ¾Ð²Ð°Ñ Ð±Ð°Ð·Ð° данных клаÑтера \"%s\" не пуÑтаÑ: найдено отношение \"%s.%s\""
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Проверка каталогов табличных проÑтранÑтв в новом клаÑтере"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr ""
+"каталог табличного проÑтранÑтва в новом клаÑтере уже ÑущеÑтвует: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i."
+"e. %s"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕÐИЕ: новый каталог данных не должен раÑполагатьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ Ñтарого "
+"каталога данных, то еÑÑ‚ÑŒ, в %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, i.e. %s"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕÐИЕ: пользовательÑкие табличные проÑтранÑтва не должны "
+"раÑполагатьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ каталога данных, то еÑÑ‚ÑŒ, в %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Создание Ñкрипта Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñтарого клаÑтера"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "не удалоÑÑŒ добавить право Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Проверка, ÑвлÑетÑÑ Ð»Ð¸ пользователь БД Ñтартовым пользователем"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "пользователь БД \"%s\" не ÑвлÑетÑÑ Ñтартовым пользователем"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "не удалоÑÑŒ определить количеÑтво пользователей"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Ð’ новом клаÑтере может быть определён только Ñтартовый пользователь."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Проверка параметров Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных"
+
+#: check.c:640
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false"
+msgstr ""
+"база template0 не должна допуÑкать подключениÑ, то еÑÑ‚ÑŒ её ÑвойÑтво "
+"pg_database.datallowconn должно быть false"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "Ñбой"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Ð’Ñе базы, кроме template0, должны допуÑкать подключениÑ, то еÑÑ‚ÑŒ их ÑвойÑтво "
+"pg_database.datallowconn должно быть true. Ð’ вашей инÑталлÑции ÑодержатÑÑ\n"
+"базы (не ÑÑ‡Ð¸Ñ‚Ð°Ñ template0), у которых pg_database.datallowconn — false.\n"
+"Имеет ÑмыÑл разрешить Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех баз данных, кроме template0,\n"
+"или удалить базы, к которым Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒÑÑ. СпиÑок баз данных\n"
+"Ñ Ñтой проблемой ÑодержитÑÑ Ð² файле:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… транзакций"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "ИÑходный клаÑтер Ñодержит подготовленные транзакции"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Целевой клаÑтер Ñодержит подготовленные транзакции"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Проверка неÑоответÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ передаче bigint в contrib/isn"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции имеютÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"contrib/isn\", задейÑтвующие тип "
+"biging.\n"
+"Однако в новом клаÑтере Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ bigint передаётÑÑ Ð½Ðµ так, как в Ñтаром,\n"
+"так что обновление клаÑтера в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете\n"
+"вручную выгрузить базы данных, где иÑпользуетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾ÑÑ‚ÑŒ \"contrib/"
+"isn\",\n"
+"или удалить \"contrib/isn\" из Ñтарого клаÑтера и перезапуÑтить обновление. "
+"СпиÑок\n"
+"проблемных функций приведён в файле:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Проверка пользовательÑких поÑтфикÑных операторов"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции ÑодержатÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие поÑтфикÑные операторы, "
+"которые\n"
+"теперь не поддерживаютÑÑ. Их Ñледует удалить и иÑпользовать вмеÑто них\n"
+"префикÑные операторы или функции.\n"
+"СпиÑок пользовательÑких поÑтфикÑных операторов приведён в файле:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Проверка неÑовмеÑтимых полиморфных функций"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or "
+"\"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции ÑодержатÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие объекты, обращающиеÑÑ\n"
+"к внутренним полиморфным функциÑм Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ типа \"anyarray\" или "
+"\"anyelement\".\n"
+"Такие объекты необходимо удалить перед процедурой Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ воÑÑтановить\n"
+"поÑле, изменив их так, чтобы они обращалиÑÑŒ к новым аналогичным функциÑм\n"
+"Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ типа \"anycompatiblearray\" и \"anycompatible\".\n"
+"СпиÑок проблемных объектов приведён в файле:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Проверка таблиц Ñо ÑвойÑтвом WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции ÑодержатÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ Ñо ÑвойÑтвом WITH OIDS, которое "
+"теперь\n"
+"не поддерживаетÑÑ. ОтказатьÑÑ Ð¾Ñ‚ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтолбцов oid можно так:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"СпиÑок проблемных таблиц приведён в файле:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Проверка ÑиÑтемных ÑоÑтавных типов в пользовательÑких таблицах"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют ÑиÑтемные ÑоÑтавные "
+"типы.\n"
+"OID таких типов могут различатьÑÑ Ð² разных верÑиÑÑ… PostgreSQL, в наÑтоÑщем\n"
+"ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы\n"
+"и перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Проверка типов данных reg* в пользовательÑких таблицах"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы Ñодержат один из типов reg*.\n"
+"Эти типы данных ÑÑылаютÑÑ Ð½Ð° ÑиÑтемные OID, которые не ÑохранÑÑŽÑ‚ÑÑ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ð¾Ð¹\n"
+"pg_upgrade, так что обновление клаÑтера в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹\n"
+"можете удалить проблемные Ñтолбцы и перезапуÑтить обновление. СпиÑок "
+"проблемных\n"
+"Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Проверка неÑовмеÑтимого типа данных \"%s\" в пользовательÑких таблицах"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных "
+"\"aclitem\".\n"
+"Внутренний формат \"aclitem\" изменилÑÑ Ð² PostgreSQL верÑии 16, поÑтому "
+"обновить\n"
+"клаÑтер в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы "
+"и\n"
+"перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Проверка удалённого типа данных \"%s\" в пользовательÑких таблицах"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных \"%s\".\n"
+"Тип \"%s\" был удалён в PostgreSQL верÑии %s, поÑтому обновить\n"
+"клаÑтер в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы "
+"и\n"
+"перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Проверка неÑовмеÑтимого типа данных \"jsonb\""
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции таблицы иÑпользуют тип данных jsonb.\n"
+"Внутренний формат \"jsonb\" изменилÑÑ Ð² верÑии 9.4 beta, поÑтому обновить "
+"клаÑтер\n"
+"в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы и\n"
+"перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Проверка ролей Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, начинающимиÑÑ Ñ \"pg_\""
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции имеютÑÑ Ñ€Ð¾Ð»Ð¸ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, начинающимиÑÑ Ñ \"pg_\".\n"
+"ÐŸÑ€ÐµÑ„Ð¸ÐºÑ \"pg_\" зарезервирован Ð´Ð»Ñ ÑиÑтемных ролей. Пока Ñти роли\n"
+"не будут переименованы, обновить клаÑтер невозможно.\n"
+"СпиÑок ролей Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом \"pg_\" приведён в файле:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Проверка пользовательÑких перекодировок"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции имеютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие перекодировки.\n"
+"У функций перекодировок в PostgreSQL 14 поменÑлиÑÑŒ параметры, поÑтому\n"
+"в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить\n"
+"перекодировки в Ñтаром клаÑтере и перезапуÑтить обновление.\n"
+"СпиÑок пользовательÑких перекодировок приведён в файле:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "не удалоÑÑŒ получить управлÑющие данные, выполнив %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: недопуÑтимое ÑоÑтоÑние клаÑтера баз данных"
+
+#: controldata.c:158
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"ИÑходный клаÑтер был отключён в режиме воÑÑтановлениÑ. Чтобы произвеÑти "
+"обновление, иÑпользуйте документированный ÑпоÑоб Ñ rsync или отключите его в "
+"режиме главного Ñервера."
+
+#: controldata.c:160
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"Целевой клаÑтер был отключён в режиме воÑÑтановлениÑ. Чтобы произвеÑти "
+"обновление, иÑпользуйте документированный ÑпоÑоб Ñ rsync или отключите его в "
+"режиме главного Ñервера."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "ИÑходный клаÑтер не был отключён штатным образом."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Целевой клаÑтер не был отключён штатным образом."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Ð’ иÑходном клаÑтере не хватает информации о ÑоÑтоÑнии клаÑтера:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Ð’ целевом клаÑтере не хватает информации о ÑоÑтоÑнии клаÑтера:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: проблема Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð¾Ð¼ pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: проблема Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸ÐµÐ¼ управлÑющих данных"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Ð’ иÑходном клаÑтере не хватает необходимой управлÑющей информации:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Ð’ целевом клаÑтере не хватает необходимой управлÑющей информации:"
+
+# skip-rule: capital-letter-first
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " Ñледующий XID конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " Ñледующий OID поÑледней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " Ñледующий MultiXactId поÑледней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " Ñтарейший MultiXactId поÑледней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " oldestXID поÑледней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " Ñледующий MultiXactOffset поÑледней конт. точки"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " первый Ñегмент WAL поÑле ÑброÑа"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " метод передачи аргумента float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " макÑимальное выравнивание"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " размер блока"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " размер Ñегмента большого отношениÑ"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " размер блока WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " размер Ñегмента WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификатора"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " макÑимальное чиÑло Ñтолбцов в индекÑе"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " макÑимальный размер порции TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " размер порции большого объекта"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " дата/Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€ÐµÐ´Ñтавлены целыми чиÑлами?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " верÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм данных"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr ""
+"Ðет необходимой управлÑющей информации Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ, работа прерываетÑÑ"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"Ñтарое и новое выравнивание в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны\n"
+"ВероÑтно, один клаÑтер уÑтановлен в 32-битной ÑиÑтеме, а другой ~ в 64-битной"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr ""
+"Ñтарый и новый размер блоков в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны"
+
+#: controldata.c:666
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match"
+msgstr ""
+"Ñтарый и новый макÑимальный размер Ñегментов отношений в pg_controldata "
+"различаютÑÑ Ð¸Ð»Ð¸ некорректны"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr ""
+"Ñтарый и новый размер блоков WAL в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны"
+
+#: controldata.c:672
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr ""
+"Ñтарый и новый размер Ñегментов WAL в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ "
+"некорректны"
+
+#: controldata.c:675
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match"
+msgstr ""
+"ÑÑ‚Ð°Ñ€Ð°Ñ Ð¸ Ð½Ð¾Ð²Ð°Ñ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификаторов в pg_controldata "
+"различаютÑÑ Ð¸Ð»Ð¸ некорректны"
+
+#: controldata.c:678
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match"
+msgstr ""
+"Ñтарый и новый макÑимум чиÑла Ñтолбцов, ÑоÑтавлÑющих индекÑÑ‹, в "
+"pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны"
+
+#: controldata.c:681
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match"
+msgstr ""
+"Ñтарый и новый макÑимальный размер порции TOAST в pg_controldata различаютÑÑ "
+"или некорректны"
+
+#: controldata.c:686
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match"
+msgstr ""
+"Ñтарый и новый размер порции большого объекта различаютÑÑ Ð¸Ð»Ð¸ некорректны"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr ""
+"Ñтарый и новый тип Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ "
+"некорректны"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr ""
+"в Ñтаром клаÑтере не применÑлиÑÑŒ контрольные Ñуммы данных, но в новом они "
+"еÑÑ‚ÑŒ"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr ""
+"в Ñтаром клаÑтере применÑлиÑÑŒ контрольные Ñуммы данных, но в новом их нет"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr ""
+"ÑÑ‚Ð°Ñ€Ð°Ñ Ð¸ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм клаÑтера в pg_controldata различаютÑÑ"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Добавление раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \".old\" к Ñтарому файлу global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"ЕÑли вы захотите запуÑтить Ñтарый клаÑтер, вам нужно будет убрать\n"
+"раÑширение \".old\" у файла %s/global/pg_control.old.\n"
+"Так как применÑлÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ \"ÑÑылок\", работа Ñтарого клаÑтера\n"
+"поÑле того, как будет запущен новый, не гарантируетÑÑ."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Формирование выгрузки глобальных объектов"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Формирование выгрузки Ñхем базы данных"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "не удалоÑÑŒ получить данные верÑии pg_ctl, выполнив %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "не удалоÑÑŒ получить верÑию pg_ctl из результата %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "команда Ñлишком длиннаÑ"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*ошибка*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "При выполнении \"%s\" возникли проблемы"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Чтобы понÑÑ‚ÑŒ причину ошибки, проÑмотрите поÑледние неÑколько Ñтрок\n"
+"файла \"%s\" или \"%s\"."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Чтобы понÑÑ‚ÑŒ причину ошибки, проÑмотрите поÑледние неÑколько Ñтрок\n"
+"файла \"%s\"."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать в файл протокола \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "У Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть права на чтение и запиÑÑŒ в текущем каталоге."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "проверка ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\" не пройдена: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "файл \"%s\" не прошёл проверку: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "программа \"%s\" не прошла проверку: ошибка выполнениÑ"
+
+#: exec.c:456
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr ""
+"программа \"%s\" не прошла проверку: получена Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ \"%s\", "
+"ожидалаÑÑŒ \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr ""
+"ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ открыть файл \"%s\": "
+"%s"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr ""
+"ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ Ñоздать файл \"%s\": "
+"%s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr ""
+"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ открыть файл \"%s\": "
+"%s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr ""
+"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ Ñоздать файл \"%s\": "
+"%s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr ""
+"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ прочитать файл "
+"\"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr ""
+"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ запиÑать в файл "
+"\"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr ""
+"ошибка при Ñоздании ÑÑылки Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr ""
+"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ получить информацию о "
+"файле \"%s\": %s"
+
+#: file.c:229
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr ""
+"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": в файле \"%s\" обнаружена "
+"Ð½ÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ñтраница"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "не удалоÑÑŒ клонировать файл из Ñтарого каталога данных в новый: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "клонирование файлов не поддерживаетÑÑ Ð² Ñтой ОС"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system."
+msgstr ""
+"не удалоÑÑŒ Ñоздать жёÑткую ÑÑылку между Ñтарым и новым каталогами данных: "
+"%s\n"
+"Ð’ режиме \"ÑÑылок\" Ñтарый и новый каталоги данных должны находитьÑÑ Ð² одной "
+"файловой ÑиÑтеме."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ñ‹Ñ… библиотек"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "загрузить библиотеку \"%s\" не удалоÑÑŒ: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "В базе данных: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции еÑÑ‚ÑŒ ÑÑылки на загружаемые библиотеки, отÑутÑтвующие\n"
+"в новой инÑталлÑции. Ð’Ñ‹ можете добавить Ñти библиотеки в новую инÑталлÑцию\n"
+"или удалить функции, иÑпользующие их, из Ñтарой. СпиÑок проблемных\n"
+"библиотек приведён в файле:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s."
+"%s\", new name \"%s.%s\""
+msgstr ""
+"Имена Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u в базе данных \"%s\" различаютÑÑ: Ñтарое Ð¸Ð¼Ñ - \"%s."
+"%s\", новое - \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Ðе удалоÑÑŒ ÑопоÑтавить Ñтарые таблицы Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ в базе данных \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " Ñто Ð¸Ð½Ð´ÐµÐºÑ Ð² \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " Ñто Ð¸Ð½Ð´ÐµÐºÑ Ð² отношении Ñ OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " Ñто TOAST-таблица Ð´Ð»Ñ \"%s.%s\""
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " Ñто TOAST-таблица Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u"
+
+#: info.c:261
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database "
+"\"%s\": %s"
+msgstr ""
+"Ð’ Ñтаром клаÑтере не нашлоÑÑŒ ÑоответÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u в "
+"базе данных \"%s\": %s"
+
+#: info.c:264
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database "
+"\"%s\": %s"
+msgstr ""
+"Ð’ новом клаÑтере не нашлоÑÑŒ ÑоответÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ñтарого Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u в "
+"базе данных \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"иÑходные базы данных:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"целевые базы данных:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "база template0 не найдена"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "База данных: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "имÑ_отношениÑ: %s.%s: oid_отношениÑ: %u табл_проÑтранÑтво: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: программу не должен запуÑкать root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "неверный Ñтарый номер порта"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "неверный новый номер порта"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Программа запущена в режиме подробных Ñообщений"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "раÑположение иÑполнÑемых файлов Ñтарого клаÑтера"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "раÑположение иÑполнÑемых файлов нового клаÑтера"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "раÑположение данных Ñтарого клаÑтера"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "раÑположение данных нового клаÑтера"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "раÑположение Ñокетов"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "не удалоÑÑŒ определить текущий каталог"
+
+#: option.c:259
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr ""
+"в Windows Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿ÑƒÑтить pg_upgrade внутри каталога данных нового клаÑтера"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade обновлÑет клаÑтер PostgreSQL до другой оÑновной верÑии.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [ПÐРÐМЕТР]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=КÐТ_BIN каталог иÑполнÑемых файлов Ñтарого клаÑтера\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=КÐТ_BIN каталог иÑполнÑемых файлов нового клаÑтера\n"
+" (по умолчанию каталог программы pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check только проверить клаÑтеры, не менÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ "
+"данные\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=КÐТ_DATA каталог данных Ñтарого клаÑтера\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=КÐТ_DATA каталог данных нового клаÑтера\n"
+
+#: option.c:278
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО чиÑло одновременно иÑпользуемых процеÑÑов "
+"или\n"
+" потоков\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link уÑтанавливать ÑÑылки вмеÑто ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ "
+"файлов\n"
+" в новый клаÑтер\n"
+
+#: option.c:280
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на "
+"диÑке\n"
+
+#: option.c:281
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=ПÐРÐМЕТРЫ параметры Ñтарого клаÑтера, передаваемые "
+"Ñерверу\n"
+
+#: option.c:282
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=ПÐРÐМЕТРЫ параметры нового клаÑтера, передаваемые "
+"Ñерверу\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=ПОРТ номер порта Ñтарого клаÑтера (по умолчанию "
+"%d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=ПОРТ номер порта нового клаÑтера (по умолчанию "
+"%d)\n"
+
+#: option.c:285
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain Ñохранить файлы журналов и SQL в Ñлучае "
+"уÑпеха\n"
+
+#: option.c:286
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=КÐТÐЛОГ каталог Ñокетов (по умолчанию текущий)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=ИМЯ Ñуперпользователь клаÑтера (по умолчанию "
+"\"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr ""
+" -v, --verbose включить вывод подробных внутренних "
+"Ñообщений\n"
+
+#: option.c:289
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone клонировать, а не копировать файлы в новый "
+"клаÑтер\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr ""
+" --copy копировать файлы в новый клаÑтер (по "
+"умолчанию)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"До запуÑка pg_upgrade вы должны:\n"
+" Ñоздать новый клаÑтер баз данных (иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð½Ð¾Ð²ÑƒÑŽ верÑию initdb)\n"
+" оÑтановить процеÑÑ postmaster, обÑлуживающий Ñтарый клаÑтер\n"
+" оÑтановить процеÑÑ postmaster, обÑлуживающий новый клаÑтер\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"ЗапуÑÐºÐ°Ñ pg_upgrade, вы должны указать:\n"
+" путь к каталогу данных Ñтарого клаÑтера (-d КÐТ_ДÐÐÐЫХ)\n"
+" путь к каталогу данных нового клаÑтера (-D КÐТ_ДÐÐÐЫХ)\n"
+" путь к каталогу \"bin\" Ñтарой верÑии (-b КÐТ_BIN)\n"
+" путь к каталогу \"bin\" новой верÑии (-B КÐТ_BIN)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Ðапример:\n"
+" pg_upgrade -d Ñтарый_клаÑтер/data -D новый_клаÑтер/data -b Ñтарый_клаÑтер/"
+"bin -B новый_клаÑтер/bin\n"
+"или\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=Ñтарый_клаÑтер/data\n"
+" $ export PGDATANEW=новый_клаÑтер/data\n"
+" $ export PGBINOLD=Ñтарый_клаÑтер/bin\n"
+" $ export PGBINNEW=новый_клаÑтер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=Ñтарый_клаÑтер/data\n"
+" C:\\> set PGDATANEW=новый_клаÑтер/data\n"
+" C:\\> set PGBINOLD=Ñтарый_клаÑтер/bin\n"
+" C:\\> set PGBINNEW=новый_клаÑтер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Ð’Ñ‹ должны указать каталог, где находитÑÑ %s.\n"
+"ВоÑпользуйтеÑÑŒ Ð´Ð»Ñ Ñтого ключом командной Ñтроки %s или переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ "
+"%s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "ПоиÑк фактичеÑкого каталога данных Ð´Ð»Ñ Ð¸Ñходного клаÑтера"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "ПоиÑк фактичеÑкого каталога данных Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ клаÑтера"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "не удалоÑÑŒ получить каталог данных, выполнив %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "не удалоÑÑŒ прочитать Ñтроку %d из файла \"%s\": %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "заданный пользователем Ñтарый номер порта %hu изменён на %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "не удалоÑÑŒ Ñоздать рабочий процеÑÑ: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "не удалоÑÑŒ Ñоздать рабочий поток: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "ошибка в %s(): %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð½ÐµÑˆÑ‚Ð°Ñ‚Ð½Ð¾ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð°Ð²Ð°Ñ€Ð¸Ð¹Ð½Ð¾: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Выполнение обновлениÑ\n"
+"---------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "УÑтановка Ñледующего OID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных Ñ Ð¤Ð¡"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Обновление завершено\n"
+"--------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "путь к каталогу данных нового клаÑтера Ñлишком длинный"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый файл"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Видимо, запущен процеÑÑ postmaster, обÑлуживающий Ñтарый клаÑтер.\n"
+"ОÑтановите его и попробуйте ещё раз."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Видимо, запущен процеÑÑ postmaster, обÑлуживающий новый клаÑтер.\n"
+"ОÑтановите его и попробуйте ещё раз."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "УÑтановка локали и кодировки Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Ðнализ вÑех Ñтрок в новом клаÑтере"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Замораживание вÑех Ñтрок в новом клаÑтере"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "ВоÑÑтановление глобальных объектов в новом клаÑтере"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "ВоÑÑтановление Ñхем баз данных в новом клаÑтере"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Удаление файлов из нового каталога %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "ошибка при удалении каталога \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копирование Ñтарого каталога %s на новый Ñервер"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "УÑтановка Ñтарейшего OID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr ""
+"УÑтановка Ñледующего идентификатора транзакции и Ñпохи Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr ""
+"УÑтановка Ñледующего идентификатора и ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ "
+"клаÑтера"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "УÑтановка Ñтарейшего идентификатора мультитранзакции в новом клаÑтере"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¾Ð² WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "УÑтановка Ñчётчиков frozenxid и minmxid в новом клаÑтере"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "УÑтановка Ñчётчика minmxid в новом клаÑтере"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Клонирование файлов пользовательÑких отношений"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Копирование файлов пользовательÑких отношений"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Подключение файлов пользовательÑких отношений ÑÑылками"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "ÑÑ‚Ð°Ñ€Ð°Ñ Ð±Ð°Ð·Ð° данных \"%s\" не найдена в новом клаÑтере"
+
+#: relfilenumber.c:218
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr ""
+"ошибка при проверке ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ \"%s\" "
+"в \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "перепиÑывание \"%s\" в \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "клонирование \"%s\" в \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "копирование \"%s\" в \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "Ñоздание ÑÑылки на \"%s\" в \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Ошибка, выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "выполнÑетÑÑ: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Ошибка SQL-команды\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл Ñ Ð²ÐµÑ€Ñией \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "не удалоÑÑŒ разобрать файл Ñ Ð²ÐµÑ€Ñией \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"не удалоÑÑŒ подключитьÑÑ Ðº главному процеÑÑу иÑходного Ñервера, запущенному "
+"командой:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"не удалоÑÑŒ подключитьÑÑ Ðº главному процеÑÑу целевого Ñервера, запущенному "
+"командой:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr ""
+"программа pg_ctl не Ñмогла запуÑтить иÑходный Ñервер, либо к нему не удалоÑÑŒ "
+"подключитьÑÑ"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr ""
+"программа pg_ctl не Ñмогла запуÑтить целевой Ñервер, либо к нему не удалоÑÑŒ "
+"подключитьÑÑ"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памÑти"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr ""
+"в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ %s Ð´Ð»Ñ libpq указан Ð°Ð´Ñ€ÐµÑ Ð½Ðµ локального Ñервера: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Обновление в рамках одной верÑии ÑиÑтемного каталога невозможно,\n"
+"еÑли иÑпользуютÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ проÑтранÑтва."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "каталог табличного проÑтранÑтва \"%s\" не ÑущеÑтвует"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr ""
+"не удалоÑÑŒ получить информацию о каталоге табличного проÑтранÑтва \"%s\": %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "путь табличного проÑтранÑтва \"%s\" не указывает на каталог"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доÑтупа к каталогу \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ок"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Проверка неÑовмеÑтимого типа данных \"line\""
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных "
+"\"line\".\n"
+"Ð’ Ñтаром клаÑтере внутренний формат и формат ввода/вывода Ñтого типа "
+"отличаетÑÑ\n"
+"от нового, поÑтому в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ "
+"можете\n"
+"удалить проблемные Ñтолбцы и перезапуÑтить обновление. СпиÑок проблемных\n"
+"Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Проверка неправильных пользовательÑких Ñтолбцов типа \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных "
+"\"unknown\".\n"
+"Теперь иÑпользование Ñтого типа данных в таблицах не допуÑкаетÑÑ, поÑтому\n"
+"в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить "
+"проблемные\n"
+"Ñтолбцы и перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в "
+"файле:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Проверка хеш-индекÑов"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "предупреждение"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ñ…ÐµÑˆ-индекÑÑ‹. Эти индекÑÑ‹ имеют разные\n"
+"внутренние форматы в Ñтаром и новом клаÑтерах, поÑтому их необходимо\n"
+"переÑтроить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды REINDEX. По завершении Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹ получите\n"
+"инÑтрукции по выполнению REINDEX."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ñ…ÐµÑˆ-индекÑÑ‹. Эти индекÑÑ‹ имеют разные\n"
+"внутренние форматы в Ñтаром и новом клаÑтерах, поÑтому их необходимо\n"
+"переÑтроить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды REINDEX. Скрипт\n"
+" %s\n"
+"будучи выполненным админиÑтратором БД в psql, переÑоздаÑÑ‚ вÑе неправильные\n"
+"индекÑÑ‹; до Ñтого никакие хеш-индекÑÑ‹ не будут иÑпользоватьÑÑ."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr ""
+"Проверка неправильных пользовательÑких Ñтолбцов типа \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных\n"
+"\"sql_identifier\". Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… данных на диÑке поменÑлÑÑ,\n"
+"поÑтому обновить данный клаÑтер невозможно. Ð’Ñ‹ можете удалить проблемные\n"
+"Ñтолбцы и перезапуÑтить обновление.\n"
+"СпиÑок проблемных Ñтолбцов приведён в файле:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Проверка обновлённых раÑширений"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "замечание"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Ð’ вашей инÑталлÑции еÑÑ‚ÑŒ раÑширениÑ, которые надо обновить\n"
+"командой ALTER EXTENSION. Скрипт\n"
+" %s\n"
+"будучи выполненным админиÑтратором БД в psql, обновит вÑе\n"
+"Ñти раÑширениÑ."
+
+#, c-format
+#~ msgid ""
+#~ "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr ""
+#~ "кодировки в базе данных \"%s\" различаютÑÑ: ÑÑ‚Ð°Ñ€Ð°Ñ - \"%s\", Ð½Ð¾Ð²Ð°Ñ - "
+#~ "\"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "lc_collate values for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ lc_collate в базе данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", "
+#~ "новое - \"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "lc_ctype values for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ lc_ctype в базе данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", "
+#~ "новое - \"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "locale providers for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "провайдеры локали в базе данных \"%s\" различаютÑÑ: Ñтарый - \"%s\", "
+#~ "новый - \"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "ICU locale values for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", "
+#~ "новое - \"%s\"\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "Ð’ иÑходном клаÑтере еÑÑ‚ÑŒ роли, имена которых начинаютÑÑ Ñ \"pg_\"\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "Ð’ целевом клаÑтере еÑÑ‚ÑŒ роли, имена которых начинаютÑÑ Ñ \"pg_\"\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "не удалоÑÑŒ получить текущую локаль\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "не удалоÑÑŒ получить ÑиÑтемное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ Ð´Ð»Ñ \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль \"%s\"\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "Ðе удалоÑÑŒ переименовать %s в %s.\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "программа \"%s\" не прошла проверку: Ñто не обычный файл\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr ""
+#~ "программа \"%s\" не прошла проверку: ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (нет доÑтупа)\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#~ msgid ""
+#~ "When checking a pre-PG 9.1 live old server, you must specify the old "
+#~ "server's port number.\n"
+#~ msgstr ""
+#~ "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñтарого работающего Ñервера верÑии до 9.1 необходимо указать "
+#~ "номер порта Ñтого Ñервера.\n"
+
+#~ msgid ""
+#~ "All non-template0 databases must allow connections, i.e. their "
+#~ "pg_database.datallowconn must be true\n"
+#~ msgstr ""
+#~ "Ð’Ñе базы, кроме template0, должны допуÑкать подключениÑ, то еÑÑ‚ÑŒ их "
+#~ "ÑвойÑтво pg_database.datallowconn должно быть true\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "The old cluster has a \"plpython_call_handler\" function defined\n"
+#~ "in the \"public\" schema which is a duplicate of the one defined\n"
+#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n"
+#~ "in psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "The \"public\" schema version of this function was created by a\n"
+#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+#~ "to complete because it references a now-obsolete \"plpython\"\n"
+#~ "shared object file. You can remove the \"public\" schema version\n"
+#~ "of this function by running the following command:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "in each affected database:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ð’ Ñтаром клаÑтере имеетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"plpython_call_handler\",\n"
+#~ "Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð² Ñхеме \"public\", предÑтавлÑÑŽÑ‰Ð°Ñ Ñобой копию функции,\n"
+#~ "определённой в Ñхеме \"pg_catalog\". Ð’Ñ‹ можете убедитьÑÑ Ð² Ñтом,\n"
+#~ "выполнив в psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "ВерÑÐ¸Ñ Ñтой функции в Ñхеме \"public\" была Ñоздана инÑталлÑцией\n"
+#~ "plpython верÑии до 8.1 и должна быть удалена Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹\n"
+#~ "pg_upgrade, так как она ÑÑылаетÑÑ Ð½Ð° Ñтавший уÑтаревшим\n"
+#~ "разделÑемый объектный файл \"plpython\". Ð’Ñ‹ можете удалить верÑию Ñтой "
+#~ "функции\n"
+#~ "из Ñхемы \"public\", выполнив Ñледующую команду:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "в каждой затронутой базе данных:\n"
+#~ "\n"
+
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid "Remove the problem functions from the old cluster to continue.\n"
+#~ msgstr "Удалите проблемные функции из Ñтарого клаÑтера Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ.\n"
+
+#~ msgid "mappings for database \"%s\":\n"
+#~ msgstr "Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\":\n"
+
+#~ msgid "%s.%s: %u to %u\n"
+#~ msgstr "%s.%s: %u в %u\n"
+
+#~ msgid " "
+#~ msgstr " "
+
+#~ msgid "Checking for large objects"
+#~ msgstr "Проверка больших объектов"
+
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table. After upgrading, you will be\n"
+#~ "given a command to populate the pg_largeobject_metadata table with\n"
+#~ "default permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ðµ объекты. Ð’ новой базе данных\n"
+#~ "имеетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов. ПоÑле "
+#~ "обновлениÑ\n"
+#~ "вам будет предÑтавлена команда Ð´Ð»Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ прав\n"
+#~ "pg_largeobject_metadata правами по умолчанию.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table, so default permissions must be\n"
+#~ "defined for all large objects. The file\n"
+#~ " %s\n"
+#~ "when executed by psql by the database superuser will set the default\n"
+#~ "permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ðµ объекты. Ð’ новой базе данных\n"
+#~ "имеетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов, поÑтому\n"
+#~ "Ð´Ð»Ñ Ð²Ñех больших объектов должны определÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð°Ð²Ð° по умолчанию. Скрипт\n"
+#~ " %s\n"
+#~ "будучи выполненным админиÑтратором БД в psql, уÑтановит нужные права\n"
+#~ "по умолчанию.\n"
+#~ "\n"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Создание Ñкрипта Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° нового клаÑтера"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr ""
+#~ "проверка файла \"%s\" не пройдена: не удаётÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ файл (нет "
+#~ "доÑтупа)\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "не удалоÑÑŒ подключитьÑÑ Ðº базе: %s"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "СтатиÑтика оптимизатора и ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ Ñвободном меÑте утилитой pg_upgrade\n"
+#~ "не переноÑÑÑ‚ÑÑ, поÑтому, запуÑтив новый Ñервер, имеет ÑмыÑл выполнить:\n"
+#~ " %s\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "не удалоÑÑŒ разобрать файл PG_VERSION из %s\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Эта утилита поддерживает обновление только до верÑии 9.0 поÑле "
+#~ "2010-01-11,\n"
+#~ "так как в API Ñерверной чаÑти были внеÑены изменениÑ.\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл %s: %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Ðе удалоÑÑŒ прочитать Ñтроку %d из %s: %m\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po
new file mode 100644
index 0000000..89cfa95
--- /dev/null
+++ b/src/bin/pg_upgrade/po/sv.po
@@ -0,0 +1,1903 @@
+# Swedish message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-25 07:19+0000\n"
+"PO-Revision-Date: 2023-08-27 10:30+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: check.c:69
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Utför konsistenskontroller på gamla live-servern\n"
+"------------------------------------------------"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Utför konsistenskontroller\n"
+"--------------------------"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Klustren är kompatibla*"
+
+#: check.c:229
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Om pg_upgrade misslyckas efter denna punkt så måste du\n"
+"köra om initdb på nya klustret innan du fortsätter."
+
+#: check.c:270
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Optimeringsstatistik överförs inte av pg_upgrade.\n"
+"När du startar nya servern så vill du nog köra:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:276
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"När detta skript körs så raderas gamla klustrets datafiler:\n"
+" %s"
+
+#: check.c:281
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"Kunde inte skapa ett script som raderar gamla klustrets datafiler\n"
+"då användardefinierade tabellutrymmen eller nya klustrets datakatalog\n"
+"ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n"
+"måste raderas för hand."
+
+#: check.c:293
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontrollerar klustrets versioner"
+
+#: check.c:305
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version %s eller senare."
+
+#: check.c:310
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s."
+
+#: check.c:319
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL."
+
+#: check.c:324
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Gammal klusterdata och binära kataloger är från olika major-versioner."
+
+#: check.c:327
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Nya klusterdata och binära kataloger är från olika major-versioner."
+
+#: check.c:342
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Vid kontroll av en live-server så måste gamla och nya portnumren vara olika."
+
+#: check.c:362
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\""
+
+#: check.c:385
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Letar efter nya tablespace-kataloger i klustret"
+
+#: check.c:396
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "i klustret finns redan ny tablespace-katalog: \"%s\""
+
+#: check.c:429
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s"
+
+#: check.c:453
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"VARNING: användardefinierade tabellutrymmens plats skall inte vara i datakatalogen, dvs. %s"
+
+#: check.c:463
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Skapar skript för att radera gamla klustret"
+
+#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056
+#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "kunde inte öppna fil \"%s\": %s"
+
+#: check.c:517
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s"
+
+#: check.c:537
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontrollerar att databasanvändaren är installationsanvändaren"
+
+#: check.c:553
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "databasanvändare \"%s\" är inte installationsanvändaren"
+
+#: check.c:564
+#, c-format
+msgid "could not determine the number of users"
+msgstr "kunde inte bestämma antalet användare"
+
+#: check.c:572
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Bara installationsanvändaren får finnas i nya klustret."
+
+#: check.c:601
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontrollerar databasens anslutningsinställningar"
+
+#: check.c:627
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 får inte tillåta anslutningar, dvs dess pg_database.datallowconn måste vara false"
+
+#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135
+#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394
+#: function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatalt"
+
+#: check.c:655
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Alla databaser förutom template0 måste tillåta anslutningar, dvs deras\n"
+"pg_database.datallowconn måste vara true. Din installation har andra\n"
+"databaser än template0 som har pg_database.datallowconn sat till false\n"
+"Överväg att tillåta anslutningar för alla databaser förutom template0\n"
+"eller släng de databaser som inte tillåter anslutningar. En lista med\n"
+"problemdatabaser finns i filen:\n"
+" %s"
+
+#: check.c:680
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Letar efter förberedda transaktioner"
+
+#: check.c:689
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Källklustret innehåller förberedda transaktioner"
+
+#: check.c:691
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Målklustret innehåller förberedda transaktioner"
+
+#: check.c:716
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Letar efter contrib/isn med bigint-anropsfel"
+
+#: check.c:776
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller \"contrib/isn\"-funktioner son beror på\n"
+"datatypen bigint. Ditt gamla och nya kluster skickar bigint-värden\n"
+"på olika sätt så detta kluster kan för närvarande inte uppgraderas. Du\n"
+"kan manuellt dumpa databaser i gamla klustret som använder \"contrib/isn\"-finesser,\n"
+"radera dessa databaser, utföra uppgraderingen och sedan återställa databaserna.\n"
+"En lista med problemfunktionerna finns i filen:\n"
+" %s"
+
+#: check.c:798
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Letar efter användardefinierade postfix-operatorer"
+
+#: check.c:874
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användardefinierade postfix-operatorer, vilket\n"
+"inte stöds längre. Överväg att ta bort postfix-operatorer och ersätt dem\n"
+"med prefix-operatorer eller funktionsanrrop.\n"
+"En lista med användardefinierade postfix-operatorer finns i filen:\n"
+" %s"
+
+#: check.c:898
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Letar efter inkompatibla polymorfa funktioner"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användardefinierade objekt som\n"
+"refererar till interna polymorfa funktioner med argument av\n"
+"typen \"anyarray\" eller \"anyelement\".\n"
+"Dessa användardefinierade objekt måste slängas innan uppgradering\n"
+"och kan återskapas efteråt efter att de ändrats till att referera till\n"
+"motsvarande nya funktioner med argument av typerna \"anycompatiblearray\"\n"
+"and \"anycompatible\".\n"
+"En lista med problemobjekten finns i filen:\n"
+" %s"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Letar efter tabeller med WITH OIDS"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller tabeller deklarerade med WITH OIDS som inte\n"
+"stöds längre. Överväg att ta bort oid-kolumnen med\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"En lista över tabeller med detta problem finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1105
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\""
+
+#: check.c:1136
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användartabeller med systemdefinierade typer\n"
+"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n"
+"PostgreSQL-versioner så detta kluster kan inte uppgraderas för tillfället.\n"
+"Du kan slänga problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1164
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Letar efter reg*-datatyper i användartabeller"
+
+#: check.c:1197
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation använder en av reg*-datatyperna i en användartabell.\n"
+"Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n"
+"så detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"problemkolumnerna och starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1218
+#, c-format
+msgid "Checking for incompatible \"aclitem\" data type in user tables"
+msgstr "Letar efter inkompatibel \"aclitem\"-datatyp i användartabeller"
+
+#: check.c:1225
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller \"aclitem\"-datatypen i användartabeller.\n"
+"Interna formatet för \"aclitem\" ändrades i PostgreSQL 16 så detta kluster\n"
+"kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n"
+"och starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1246
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Letar efter inkompatibel \"jsonb\"-datatyp"
+
+#: check.c:1255
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller \"jsonb\"-datatypen i användartabeller.\n"
+"Interna formatet för \"jsonb\" ändrades under 9.4-betan så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n"
+"starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: check.c:1282
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Letar efter roller som startar med \"pg_\""
+
+#: check.c:1314
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller roller som startar på \"pg_\".\n"
+"\"pg_\" är ett reserverat prefix för systemroller. Klustret\n"
+"kan inte uppgraderas innan dessa roller har bytt namn.\n"
+"En lista med rollerna som startar på \"pg_\" finns i denna fil:\n"
+" %s"
+
+#: check.c:1334
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Letar efter användardefinierade teckenkodkonverteringar"
+
+#: check.c:1395
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användardefinierade teckenkodkonverteringar.\n"
+"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 så\n"
+"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n"
+"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "kunde inte hämta kontrolldata med %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: state-problem för databaskluster"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Källklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Målklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Källklustret har inte stängts ner på ett korrekt sätt."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Målklustret har inte stängts ner på ett korrekt sätt."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Källklustret saknar information om kluster-state:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "MÃ¥lklustret saknar information om kluster-state:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal-problem"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: problem vid hämtning av kontrolldata"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Källklustret saknar lite kontrolldata som krävs:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Målklustret saknar lite kontrolldata som krävs:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " checkpoint nästa-XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " senaste checkpoint nästa-OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " senaster checkpoint nästa-MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " senaste checkpoint äldsta-MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " senaste checkpoint äldsta-XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " senaste checkpoint nästa-MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " första WAL-segmentet efter reset"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 argumentöverföringsmetod"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " maximal alignment"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " blockstorlek"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " stora relationers segmentstorlek"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL-blockstorlek"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL-segmentstorlek"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " maximal identifierarlängd"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " maximalt antal indexerade kolumner"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " maximal TOAST-chunkstorlek"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " stora-objekt chunkstorlek"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " datum/tid är heltal?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " datachecksumversion"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n"
+"Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximalt indexerade kolumner ogiltiga eller matchar inte"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "gamla klustret använder inte datachecksummor men nya gör det"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "gamla klustret använder datachecksummor men nya gör inte det"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Lägger till \".old\"-suffix till gamla global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Om du vill starta gamla klustret så måste du ta bort\n"
+"\".old\"-suffixet från %s/global/pg_control.old.\n"
+"Detta då \"link\"-läge användes och gamla klustret kan inte\n"
+"startas på ett säkert sätt efter att nya klustret startats."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Skapar dump med globala objekt"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Skapar dump innehållande databasscheman"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "kunde inte läsa versionutdata för pg_ctl från %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "kommandot för långt"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "kunde inte öppna loggfil \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*misslyckande*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Det var problem med att köra \"%s\""
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Se de sista raderna i \"%s\" eller \"%s\" för\n"
+"en trolig orsak till misslyckandet."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Se de sista raderna i \"%s\" för\n"
+"en trolig orsak till misslyckandet."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "kunde inte skriva till loggfil \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "kunde inte öppna fil \"%s\" för läsning: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Du måste ha läs och skrivrättigheter till den aktuella katalogen."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "kontroll av \"%s\" misslyckades: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" är inte en katalog"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "kontroll av \"%s\" misslyckades: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte läsa filen \"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skriva filen \"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid kopiering av relation \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid skapande av länk för relation \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte göra stat på file \"%s\": %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "fel vid kopiering av relation \"%s.%s\": partiell sida hittad i fil \"%s\""
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "kunde inte klona fil mellan gamla och nya datakatalogen: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "kan inte skapa fil \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "filkloning stöds inte på denna plattform"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"kunde inte skapa hård länk mellan gamla och nya datakatalogerna: %s\n"
+"I länk-läge måste gamla och nya datakatalogerna vara i samma filsystem."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontrollerar att krävda länkbibliotek finns"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "kunde inte ladda länkbibliotek \"%s\": %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "I databas: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Din installation refererar till laddbara bibliotek som saknas i nya\n"
+"installationen. Du kan lägga till dessa itll nya installationen eller\n"
+"ta bort funktionerna som använder dem i gamla installationen. En lista\n"
+"med problembiblioteken finns i filen:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " vilket är ett index för \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " vilket är ett index för OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " vilket är TOAST-tabellen för \"%s.%s\""
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " vilket är TOAST-tabellen för OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"källdatabaser:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"måldatabaser:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "hittade inte template0"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Databas: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relnamn: %s.%s: reloid: %u reltblutrymme: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: kan inte köras som root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ogiltigt gammalt portnummer"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ogiltigt nytt portnummer"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Kör i utförligt läge"
+
+# FIXME: the source code need to be fixed here. it paste words together
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "gamla klusterbinärer är i"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "nya klusterbinärer är i"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "gamla klusterdatan är i"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "nya klusterdatan är i"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "uttag kommer skapas"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "kunde inte bestämma aktuell katalog"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "kan inte köra pg_upgrade inifrån nya klusterdatakatalogen i Windows"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade uppgraderar ett PostgreSQL-kluster till en annan major-version.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [FLAGGA]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINKAT gamla klustrets katalog för körbara filer\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINKAT nya klustrets katalog för körbara filer\n"
+" (standard är samma som för pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check testa klustren bara, ändra ingen data\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATAKAT gamla klustrets datakatalog\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATAKAT nya klustrets datakatalog\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM antal samtidiga processer eller trådar att använda\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link länka istället för att kopiera filer till nya klustret\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=FLAGGOR serverflaggor för gamla klustret\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=FLAGGOR serverflaggor för nya klustret\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT gamla klustrets portnummer (standard %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT nya klustrets portnummer (standard %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain behåll SQL och loggfiler efter lyckad uppgradering\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAMN klustrets superuser (standard \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose slå på utförligt intern loggning\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " -clone klona istället för att kopiera filer till nya klustret\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy kopiera filer till nya klustret (standard)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denns hjälp, avsluta sedan\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Innan du kör pg_upgrade måste du:\n"
+" skapa ett nytt databaskluster (med nya versionens initdb)\n"
+" stänga ner den postmaster som hanterar gamla klustret\n"
+" stänga ner den postmaster som hanterar nya klustret\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"När du kör pg_upgrade måste du ange följande information:\n"
+" datakatalogen för gamla klustret (-d DATAKAT)\n"
+" datakatalogen för nya klustret (-D DATAKAT)\n"
+" \"bin\"-katalogen för gamla versionen (-b BINKAT)\n"
+" \"bin\"-katalogen för nya versionen (-B BINKAT)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Till exempel:\n"
+" pg_upgrade -d gammaltKluster/data -D nyttKluster/data -b gammaltKluster/bin -B nyttKluster/bin\n"
+"eller\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=gammaltKluster/data\n"
+" $ export PGDATANEW=nyttKluster/data\n"
+" $ export PGBINOLD=gammaltKluster/bin\n"
+" $ export PGBINNEW=nyttKluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=gammaltKluster/data\n"
+" C:\\> set PGDATANEW=nyttKluster/data\n"
+" C:\\> set PGBINOLD=gammaltKluster/bin\n"
+" C:\\> set PGBINNEW=nyttKluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Du måste identifiera katalogen där %s.\n"
+"Använd kommandoradsflaggan %s eller omgivningsvariabeln %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Letar efter den riktiga datakatalogen i källklustret"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Letar efter den riktiga datakatalogen för målklustret"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "kunde inte hämta datakatalogen med %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "kunde inte läsa rad %d från fil \"%s\": %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "kunde inte skapa arbetsprocess: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "kunde inte skapa arbetstråd: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() misslyckades: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "barnprocess avslutade felaktigt: status %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "barnprocess avslutade felaktigt: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Utför uppgradering\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Sätter nästa OID för nya klustret"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synkar datakatalog till disk"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Uppgradering klar\n"
+"-----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "katalogsökväg för nytt kluster är för lång"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar gamla klustret.\n"
+"Stänga ner den postmastern och försök igen."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar nya klustret.\n"
+"Stänga ner den postmastern och försök igen."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Sätter lokal och teckenkodning för nya klustret"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyserar alla rader i nya klustret"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Fryser alla rader i nya klustret"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Återställer globala objekt i nya klustret"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Återställer databasscheman i nya klustret"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Raderar filer från ny %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "kunde inte ta bort katalog \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopierar gammal %s till ny server"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Sätter äldsta XID för nya klustret"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Sätter nästa multixact-ID och offset för nytt kluster"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Sätter äldsta multixact-ID i nytt kluster"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resettar WAL-arkiv"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Sätter räknarenm minmxid för nytt kluster"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Klonar användarens relationsfiler"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Kopierar användarens relationsfiler"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Länkar användarens relationsfiler"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "skriver om \"%s\" till \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "klonar \"%s\" till \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "kopierar \"%s\" till \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "länkar \"%s\" till \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Misslyckades, avslutar\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "kör: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-kommando misslyckades\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "kunde inte öppna versionsfil \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "kunde inte tolka versionsfil \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"kunde inte ansluta till käll-postmaster som startats med kommandot:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"kunde inte ansluta till mål-postmaster som startats med kommandot:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl misslyckades att start källservern eller så misslyckades anslutningen"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl misslyckades att start målservern eller så misslyckades anslutningen"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Kan inte uppgradera till/från samma systemkatalogversion när\n"
+"man använder tablespace."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "tablespace-katalogen \"%s\" finns inte"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "kunde inte göra stat på tablespace-katalog \"%s\": %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "tablespace-sökväg \"%s\" är inte en katalog"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+# FIXME: is this msgid correct?
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Letar efter inkompatibel \"line\"-datatyp"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller datatypen \"line\" i användartabeller. Denna\n"
+"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n"
+"gamla och nya version så detta kluster kan för närvarande inte uppgraderas.\n"
+"Du kan radera problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller datatypen \"unknown\" i användartabeller.\n"
+"Denna datatyp tillåts inte längre i tabeller så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"Ã¥terstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Letar efter hash-index"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "varning"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Efter uppgraderingen så kommer du få\n"
+"REINDEX-instruktioner."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer återskapa alla\n"
+"ogiltiga index; innan dess så kommer inget av dess index användas."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller datatypen \"sql_identifier\" i användartabeller.\n"
+"Formatet på disk för denna datatyp har ändrats så detta kluster kan för\n"
+"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"Ã¥terstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Letar efter uppdatering av utökningar"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "notis"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Din installation innehåller utökningar som skall updateras med kommandot\n"
+"ALTER EXTENSION. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer uppdatera\n"
+"dessa utökningar."
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#, c-format
+#~ msgid "%s() failed: %s\n"
+#~ msgstr "%s() misslyckades: %s\n"
+
+#, c-format
+#~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "inställning av ICU-lokal för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "Källklustret innehåller roller som startar med \"pg_\"\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "Målklustret innehåller roller som startar med \"pg_\"\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "Kan inte byta namn på %s till %s.\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera (rättighet saknas)\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "kontroll av \"%s\" misslyckades: inte en vanlig fil\n"
+
+#, c-format
+#~ msgid "could not access directory \"%s\": %m\n"
+#~ msgstr "kunde inte komma åt katalog \"%s\": %m\n"
+
+#, c-format
+#~ msgid "could not create directory \"%s\": %m\n"
+#~ msgstr "kunde inte skapa katalog \"%s\": %m\n"
+
+#, c-format
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "kan inte öppna fil \"%s\": %s\n"
+
+#, c-format
+#~ msgid "could not open log file \"%s\": %m\n"
+#~ msgstr "kunde inte öppna loggfil \"%s\": %m\n"
+
+#, c-format
+#~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "kodning för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "misslyckades med att hämta systemlokalnamn för \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "misslyckades med att hämta aktuell lokal\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "misslyckades med att återställa gamla lokalen \"%s\"\n"
+
+#, c-format
+#~ msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "lc_collate-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "lc_ctype-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "localleverantörer för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "out of memory\n"
+#~ msgstr "slut på minne\n"
+
+#, c-format
+#~ msgid "too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "för många kommandoradsargument (första är \"%s\")\n"
diff --git a/src/bin/pg_upgrade/po/tr.po b/src/bin/pg_upgrade/po/tr.po
new file mode 100644
index 0000000..f6b2798
--- /dev/null
+++ b/src/bin/pg_upgrade/po/tr.po
@@ -0,0 +1,1668 @@
+# LANGUAGE 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.
+# Abdullah GÃœLNER <agulner@gmail.com>, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2019-04-02 07:45+0000\n"
+"PO-Revision-Date: 2019-04-03 14:47+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: check.c:66
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Eski Canlı Sunucuda Tutarlılık Testleri Gerçekleştirliyor\n"
+"------------------------------------------------\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Tutarlılık Testleri Gerçekleştiriliyor\n"
+"-----------------------------\n"
+
+#: check.c:166
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Cluster'lar uyumlu*\n"
+
+#: check.c:172
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Eğer pg_upgrade bu noktadan sonra başarısız olursa,\n"
+"devam etmeden önce yeni cluster'da tekrar initdb yapılmalıdır.\n"
+
+#: check.c:208
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eniyileyici (optimizer) istatistikleri pg_upgrade tarafından aktarılmadığından\n"
+"yeni sunucuyu başlattığınızda, %s\n"
+"çalıştırmanız önerilir.\n"
+"\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"Optimizer statistics and free space information are not transferred\n"
+"by pg_upgrade so, once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eniyileyici (optimizer) istatistikleri ve boÅŸ alan bilgisi pg_upgrade\n"
+"tarafından aktarılmadığından, yeni sunucuyu başlattığınızda \n"
+"%s çalıştırmanız önerilir\n"
+"\n"
+
+#: check.c:220
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Bu betiğin (script) çalıştırılması eski cluster'ın veri dosyalarını silecektir:\n"
+" %s\n"
+
+#: check.c:225
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Eski kümenin (cluster) veri dosyalarını silecek betik (script) oluşturulamadı;\n"
+"çünkü eski kümenin dizininde kullanıcı-tanımlı tablespace'ler veya \n"
+"yeni kümenin veri dizini bulunuyor. Eski kümeye ait içerikler\n"
+"elle silinmeli.\n"
+
+#: check.c:235
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Cluster sürümleri kontrol ediliyor"
+
+#: check.c:247
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Bu uygulama sadece PostgreSQL 8.4 ve sonraki sürümlerden yükseltme yapabilir.\n"
+
+#: check.c:251
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Bu uygulama sadece PostgreSQL'in %s sürümüne yükseltme yapabilir.\n"
+
+#: check.c:260
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "pg-upgrade uygulaması daha eski ana PostgreSQL sürümlerine geçiş için kullanılamaz.\n"
+
+#: check.c:265
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Eski kümenin (cluster) veri ve ikili (binary) dizinleri farklı ana sürümlerden.\n"
+
+#: check.c:268
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Yeni küme (cluster) veri ve ikili (binary) dizinleri farklı ana (major) sürümlerden.\n"
+
+#: check.c:285
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "PG 9.1 öncesi eski bir canlı sunucu kontrol edildiğinde, eski sunucunun port numarasını belirtmelisiniz.\n"
+
+#: check.c:289
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Canlı bir sunucu kontrol edilirken, eski ve yeni port numaraları farklı olmalı.\n"
+
+#: check.c:304
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için dil kodlaması eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:309
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için lc_collate değerleri eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:312
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için lc_ctype değerleri eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:385
+#, c-format
+msgid "New cluster database \"%s\" is not empty\n"
+msgstr "Yeni cluster veritabanı \"%s\" boş değil\n"
+
+#: check.c:432
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Yeni kümeyi (cluster) analiz etmek için betik (script) oluşturuluyor "
+
+#: check.c:446 check.c:574 check.c:838 check.c:949 check.c:1040 function.c:253
+#: option.c:480 version.c:57 version.c:156 version.c:257 version.c:339
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "\"%s\" dosyası açılamadı: %s\n"
+
+#: check.c:501 check.c:630
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "\"%s\" dosyasına çalıştırma (execute) izni eklenemedi: %s\n"
+
+#: check.c:537
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"UYARI: yeni veri dizini eski veri dizini içinde olmamalı, örn. %s\n"
+
+#: check.c:561
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"UYARI: kullanıcı-tanımlı tablespace lokasyonları veri dizini içinde olmamalıdır, örn. %s\n"
+
+#: check.c:571
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Eski kümeyi (cluster) silmek için betik (script) oluşturuluyor."
+
+#: check.c:650
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Veritabanı kullanıcısının kurulum kullanıcısı olup olmadığı kontrol ediliyor"
+
+#: check.c:666
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "Veritabanı kullanıcısı \"%s\" kurulum kullanıcısı değil\n"
+
+#: check.c:677
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "kullanıcı sayısı belirlenemedi\n"
+
+#: check.c:685
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Yeni kümede (cluster) sadece kurulum kullanıcısı tanımlanabilir\n"
+
+#: check.c:705
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Veritabanı bağlantı ayarları kontrol ediliyor"
+
+#: check.c:727
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 bağlantıya izin vermemeli, yani pg_database.datallowconn değeri \"false\" olmalı\n"
+
+#: check.c:737
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "template0 dışındaki tüm veritabanları bağlantıya izin vermeli, yani pg_database.datallowconn değerleri \"true\" olmalı\n"
+
+#: check.c:762
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Hazırlanmış işlemler (prepared transaction) için kontrol gerçekleştiriliyor"
+
+#: check.c:771
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Kaynak küme (cluster) hazırlanmış işlemler (prepared transaction) içeriyor\n"
+
+#: check.c:773
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Hedef küme(cluster) hazırlanmış işlemler içeriyor\n"
+
+#: check.c:799
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint-geçirme uyuşmazlığı olan contrib/isn için denetim gerçekleştiriliyor"
+
+#: check.c:860 check.c:972 check.c:1063 function.c:268 version.c:179
+#: version.c:280
+#, c-format
+msgid "fatal\n"
+msgstr "ölümcül (fatal)\n"
+
+#: check.c:861
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually upgrade databases that use \"contrib/isn\" facilities and remove\n"
+"\"contrib/isn\" from the old cluster and restart the upgrade. A list of\n"
+"the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz bigint veri tipine dayalı \"contrib/isn\" fonksiyonları\n"
+"içeriyor. Eski ve yeni kümeleriniz (cluster) bigint değerlerini farklı\n"
+"geçirdiğinden bu küme şu anda yükseltilemiyor. \"contrib/isn\" imkanlarını\n"
+"kullanan veritabanlarını \"contrib/isn\" yi eski kümeden çıkartarak\n"
+" elle yükseltebilir ve yükseltmeyi tekrar başlatabilirsiniz.\n"
+"Problemli fonksiyonların bir listesi aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kullanıcı tablolarındaki reg* veri tipleri için kontrol yapılıyor"
+
+#: check.c:973
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz kullanıcı tablolarında reg* veri tiplerinden birini kullanıyor.\n"
+"Bu veri tipleri pg_upgrade tarafından korunmayan sistem OID'lerine referans\n"
+"veriyor, dolayısıyla bu küme şu anda yükseltilemiyor. Sorunlu tabloları\n"
+"çıkartıp yükseltmeyi yeniden başlatabilirsiniz. Sorunlu sütunların listesi\n"
+"aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+
+#: check.c:998
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Uyumlu olmayan (incompatible) \"jsonb\" veri tipi için kontrol gerçekleştiriliyor"
+
+#: check.c:1064
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade. A list\n"
+"of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kullanıcı tablolarınızda \"jsonb\" veri tipi içeren alanlar bulunmaktadır.\n"
+"9.4 beta ile birlikte \"jsonb\" iç formatı değiştiğinden bu küme (cluster) şu anda\n"
+"yükseltilemiyor. Sorunlu tabloları çıkartarak (remove) yükseltmeyi tekrar \n"
+"başlatabilirsiniz. Problemli sütunların bir listesini şu dosyada bulabilirsiniz:\n"
+"%s\n"
+
+#: check.c:1085
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\" ie başlayan roller için kontrol gerçekleştiriliyor"
+
+#: check.c:1095
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Kaynak küme (cluster) \"pg_\" ile başlayan roller içeriyor\n"
+
+#: check.c:1097
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Hedef küme (cluster) \"pg_\" ile başlayan roller içeriyor\n"
+
+#: check.c:1123
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "geçerli yerel ayarları (locale) almakta başarısız olundu\n"
+
+#: check.c:1132
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\" için sistem yerel ayarlarını (locale) almakta başarısız olundu\n"
+
+#: check.c:1138
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "Eski \"%s\" yerel ayarlarını (locale) geri yüklemekte başarısız olundu\n"
+
+#: controldata.c:128 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s kullanılarak kontrol verisi alınamadı: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: veritabanı kümesini durumu ile ilgili sorun\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Kaynak küme kurtarma (recovery) modunda iken kapatıldı. Yükseltmek için, belgelerde açıklandığı gibi \"rsync\" kullanın ya da birincil (primary) sunucu olarak kapatın.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Hedef küme kurtarma (recovery) modunda iken kapatıldı. Yükseltmek için, belgelerde açıklandığı gibi \"rsync\" kullanın ya da birincil (primary) sunucu olarak kapatın.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Kaynak küme düzgün bir şekilde kapatılmamış.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Hedef küme düzgün bir şekilde kapatılmamış.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Kaynak kümede (cluster) küme durumu bilgisi eksik:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Hedef kümede (cluster) küme durumu bilgisi eksik:\n"
+
+#: controldata.c:208 dump.c:51 pg_upgrade.c:333 pg_upgrade.c:370
+#: relfilenode.c:244 util.c:80
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal sorunu\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata alma (retrieval) sorunu\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Kaynak kümede (cluster) bazı gerekli kontrol bilgileri eksik:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Hedef kümede (cluster) bazı gerekli kontrol bilgileri eksik:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " sonraki XID kontrol noktası (checkpoint)\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " sonraki OID en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " sonraki MultiXactId en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " En eski MultiXactId en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " sonraki MultiXactOffset en son kontrol noktası\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " sıfırlama (reset) sonrası ilk WAL kesimi (segment)\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 argumanı geçirme yöntemi\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " azami hizalanma (max alignment)\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " blok boyutu (block size)\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " büyük ilişki (relation) kesimi (segment) boyutu\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL blok boyutu (block size)\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL kesim boyutu (segment size)\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " azami tanımlayıcı (identifier) uzunluğu\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " azami indeksli sütun sayısı\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " azami TOAST yığın (chunk) boyutu\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " büyük-nesne yığın (chunk) boyutu\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " tarih/saat değerleri tamsayı mı?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " veri sağlama (checksum) sürümü\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Gerekli kontrol bilgisi olmadan devam edilemez, sonlandırılıyor\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"eski ve yeni pg_controldata hizalamaları (alignment) ya geçersiz ya da eşleşmiyor\n"
+"Muhtemelen bir küme 32-bit diğeri 64-bit kurulumları\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata hizalamaları (alignment) ya geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami ilişki (relation) kesim (segment) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata WAL blok boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata WAL kesim (segment) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami tanımlayıcı uzunlukları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami indeksli sütunları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami TOAST yığın (chunk) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata büyük-nesne (large-obj.) yığın (chunk) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "eski ve yeni pg_controldata tarih/saat saklama tipleri geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "eski küme veri sağlamaları (checksum) kullanmıyorken yenisi kullanıyor\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "eski küme veri sağlamaları (checksum) kullanıyorken yenisi kullanmıyor\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "eski ve yeni küme (cluster) pg_controldata sağlama sürümleri geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "eski global/pg_control'e \".old\" soneki ekleniyor"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s ismi %s'ye deÄŸiÅŸtirilemiyor.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Eski kümeyi (cluster) başlatmak istiyorsanız, \".old\" sonekini\n"
+"%s/global/pg_control.old 'dan çıkartmanız gerekecektir.\n"
+"\"link\" kipi (mode) kullanıldığından, bir kere yeni küme başlatıldığında\n"
+"eski küme güvenle başlatılamaz.\n"
+"\n"
+
+#: dump.c:22
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Global nesnelerin dökümü (dump) oluşturuluyor"
+
+#: dump.c:33
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Veritabanı şemalarının dökümü (dump) oluşturuluyor\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s kullanılarak pg_ctl sürüm verisi alınamadı: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "%s den pg_ctl sürüm çıktısı alınamadı\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "çok uzun komut\n"
+
+#: exec.c:110 util.c:38 util.c:226
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 exec.c:204 option.c:101 option.c:217
+#, c-format
+msgid "could not write to log file \"%s\"\n"
+msgstr "\"%s\" günlük (log) dosyasına yazılamadı\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*hata*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\"nin çalıştırılmasında sorunlar oluştu\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Hatanın muhtemel sebebi için \"%s\" veya \n"
+"\"%s\"nin son bir kaç satırına bakınız.\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Hatanın muhtemel sebebi için \"%s\" nin\n"
+"son bir kaç satırına bakınız.\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "\"%s\" dosyası okuma için açılamadı: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Geçerli dizinde okuma ve yazma erişiminiz olmalı.\n"
+
+#: exec.c:310 exec.c:372 exec.c:427
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\" kontrolü aksadı: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" bir dizin deÄŸil\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr ""
+"\"%s\" kontrolü hata verdi: normal bir dosya değil\n"
+" \n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "\"%s\" kontrolü hata verdi: dosya okunamıyor (izin yok)\n"
+
+#: exec.c:450
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\" kontrolü hata verdi: çalıştırılamıyor (izin yok)\n"
+
+#: file.c:44 file.c:147
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası açılamadı: %s\n"
+
+#: file.c:49 file.c:156
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası oluşturulamadı: %s\n"
+
+#: file.c:63 file.c:180
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası okunamadı: %s\n"
+
+#: file.c:75 file.c:258
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasına yazılamadı: %s\n"
+
+#: file.c:89
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu (\"%s\" \"%s\"ye): %s\n"
+
+#: file.c:108
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" ilişkisi için bağlantı oluşturulurken hata oluştu (\"%s\" \"%s\"ye): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasının durumu görüntülenemiyor (stat) : %s\n"
+
+#: file.c:183
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasında kısmi (partial) sayfa (page) bulundu\n"
+
+#: file.c:284
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"eski ve yeni veri dizinleri arasında sabit bağlantı (hard link) oluşturulamadı: %s\n"
+"Bağlantı kipinde eski ve yeni veri dizinleri aynı dosya sisteminde olmalı.\n"
+
+#: function.c:110
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"Eski kümenin \"public\" şemasında tanımlı bir \"plpython_call_handler\"\n"
+"fonksiyonu var ki bunun bir kopyası da \"pg_catalog\" şemasında da tanımlı.\n"
+"Bunu teyit etmek için psql'de şunu çalıştırabilirsiniz:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Bu fonksiyonun \"public\" şemasındaki sürümü plpython'un 8.1 öncesi bir\n"
+"kurulumu tarafından oluşturulmuş, ve eski \"plpython\" paylaşımlı nesne \n"
+"dosyasına referans verdiği için pg_upgrade'in tamamlanması için \n"
+"kaldırılmalıdır. Bu fonksiyonun \"public\" şemasınaki sürümünü etkilenen\n"
+"bütün veritabanlarında aşağıdaki komutu çalıştırarak kaldırabilirsiniz:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+
+#: function.c:128
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:138
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Devam etmek için problemli fonksiyonları çıkartınız (remove).\n"
+
+#: function.c:211
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Gereken kütüphanelerin varlığı kontrol ediliyor"
+
+#: function.c:255
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" kütüphanesi yüklenemedi: %s"
+
+#: function.c:269
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eski kurulumunuz yenisinde eksik olan yüklenebilir kütüphanelere referans\n"
+"veriyor. Bu kütüphaneleri yeni kuruluma ekleyebilir, ya da bunları kullanan\n"
+"fonksiyonları eski kurulumdan çıkarabilirsiniz. Sorunlu kütüphanelerin bir\n"
+"listesi aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+" \n"
+
+#: info.c:133
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "%u OID'si için \"%s\" veritabanındaki ilişki isimleri eşleşmiyor: eski isim \"%s.%s\", yeni isim \"%s.%s\"\n"
+
+#: info.c:153
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "\"%s\" veritabanında eski ve yeni tabloların eşleştirilmesi başarısız oldu\n"
+
+#: info.c:242
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " \"%s.%s\" üzerinde bir indeks "
+
+#: info.c:252
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " %u OID'li nesne üzerinde bir indeks"
+
+#: info.c:264
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" için TOAST tablosu"
+
+#: info.c:272
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " %u OID'li nesne için TOAST tablosu"
+
+#: info.c:276
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "%u OID li yeni ilişki (relation) için eski kümede (cluster) karşılık bulunamadı (veritabanı: \"%s): %s\n"
+
+#: info.c:279
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "%u OID li eski ilişki (relation) için yeni kümede (cluster) karşılık bulunamadı (veritabanı: \"%s): %s\n"
+
+#: info.c:291
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "\"%s\" veritabanı için eşleştrimeler:\n"
+
+#: info.c:294
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u yu %uya\n"
+
+#: info.c:299 info.c:638
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"kaynak veritabanları:\n"
+
+#: info.c:326
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"hedef veritabanları:\n"
+
+#: info.c:636
+#, c-format
+msgid "Database: %s\n"
+msgstr "Veritabanı: %s\n"
+
+#: info.c:649
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:98
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root kullanıcısyla çalıştırılamaz\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid old port number\n"
+msgstr "geçersiz eski port numarası\n"
+
+#: option.c:180
+#, c-format
+msgid "invalid new port number\n"
+msgstr "geçersiz yeni port numarası\n"
+
+#: option.c:202
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Verbose kipte çalışıyor\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: option.c:242
+msgid "old cluster binaries reside"
+msgstr "eski küme ikili dosyaları bulunmakta"
+
+#: option.c:244
+msgid "new cluster binaries reside"
+msgstr "yeni küme ikili dosyaları bulunmakta"
+
+#: option.c:246
+msgid "old cluster data resides"
+msgstr "eski küme verisi bulunmakta"
+
+#: option.c:248
+msgid "new cluster data resides"
+msgstr "yeni küme verisi bulunmakta"
+
+#: option.c:265 option.c:462
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "geçerli dizin belirlenemedi\n"
+
+#: option.c:268
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "pg_upgrade, Windows üzerindeki yeni küme (cluster) veri dizini içerisinden çalıştırılamıyor\n"
+
+#: option.c:277
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade bir PostgreSQL kümesini (cluster) farklı bir ana sürüme yükseltir.\n"
+"\n"
+
+#: option.c:278
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [SEÇENEK]...\n"
+"\n"
+
+#: option.c:280
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: option.c:281
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR eski küme (cluster) için çalıştırılabilir (executable) dizini\n"
+
+#: option.c:282
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory\n"
+msgstr " -B, --new-bindir=BINDIR yeni küme (cluster) çalıştırılabilir (executable) dizini\n"
+
+#: option.c:283
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sadece kümeleri (cluster) kontrol et, veri değişikliği yapma\n"
+
+#: option.c:284
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR eski küme (cluster) veri dizini\n"
+
+#: option.c:285
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR yeni küme (cluster) veri dizini\n"
+
+#: option.c:286
+#, c-format
+msgid " -j, --jobs number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs kullanılacak eşzamanlı süreç veya iş parçacığı (thread) sayısı\n"
+
+#: option.c:287
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link dosyaları yeni kümeye (cluster) kopyalama yerine bağlantılandır\n"
+
+#: option.c:288
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS sunucuya geçirilecek eski küme (cluster) seçenekleri\n"
+
+#: option.c:289
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --ne-options=OPTIONS sunucuya geçirilecek yeni küme (cluster) seçenekleri\n"
+
+#: option.c:290
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT eski küme port numarası (varsayılan %d)\n"
+
+#: option.c:291
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT yeni küme port numarası (varsayılan %d)\n"
+
+#: option.c:292
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain başarılı işlem sonrası SQL ve log dosyalarını tut\n"
+
+#: option.c:293
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=NAME küme (cluster) superuser'ı (varsayılan \"%s\")\n"
+" \n"
+
+#: option.c:294
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose açıklamalı (verbose) dahili loglamayı etkinleştir\n"
+
+#: option.c:295
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini görüntüle, sonrasında çık\n"
+
+#: option.c:296
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonrasında çık\n"
+
+#: option.c:297
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade 'i çalıştırmadan önce yapılması gerekenler:\n"
+" (initdb'nin yeni sürümünü kullanarak) yeni bir veritabanı kümesi (cluster) oluşturmak\n"
+" eski kümeye hizmet veren postmaster'ı kapatmak\n"
+" yeni kümeye hizmet veren postmaster'ı kapatmak\n"
+
+#: option.c:302
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade çalıştırdığınızda, aşağıdaki bilgileri sağlamalısınız:\n"
+" eski küme için veri dizini (-d DATADIR)\n"
+" yeni küme için veri dizini (-D DATADIR)\n"
+" eski sürüm için \"bin\" dizini (-b BINDIR)\n"
+" yeni sürüm için \"bin\" dizini (-B BINDIR)\n"
+
+#: option.c:308
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Örnek:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"veya\n"
+"\n"
+"\n"
+
+#: option.c:313
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:319
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:325
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: option.c:358
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%s'nin olduÄŸu dizini belirtmelisiniz.\n"
+"Lütfen %s komut-satırı seçeneğini ya da %s ortam değişkenini kullanınız.\n"
+
+#: option.c:409
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Kaynak küme (cluster) için gerçek veri dizini bulunuyor"
+
+#: option.c:411
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Hedef küme (cluster) için gerçek veri dizini bulunuyor"
+
+#: option.c:423
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s kullanılarak veri dizini alınamadı: %s\n"
+
+#: option.c:488
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "%d satırı, \"%s\" dosyasından okunamadı: %s\n"
+
+#: option.c:506
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "kullanıcı tarafından sağlanan eski port numarası%hu %hu olarak düzeltildi\n"
+
+#: parallel.c:128 parallel.c:241
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "işçi süreci yaratılamadı: %s\n"
+
+#: parallel.c:147 parallel.c:262
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "işçi threadi yaratılamadı: %s\n"
+
+#: parallel.c:305
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "waitpid() başarısız oldu: %s\n"
+
+#: parallel.c:309
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "alt süreç (child process) olağan dışı olarak sonlandı: durum %d\n"
+
+#: parallel.c:324
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "Alt işçi (child worker) olağan dışı olarak sonlandı: %s\n"
+
+#: pg_upgrade.c:106
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "\"%s\" dizininin erişim hakları okunamıyor: %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Yükseltme (upgrade) gerçekleştiriliyor\n"
+"----------------------------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Yeni küme (cluster) için sonraki OID belirleniyor"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Veri dizinini diske eÅŸzamanla (sync)"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Yükseltme (upgrade) tamamlandı\n"
+"----------------------------\n"
+
+#: pg_upgrade.c:231
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Eski kümeye (cluster) hizmet veren bir postmaster var görünüyor.\n"
+"Lütfen o postmaster'ı kapatıp tekrar deneyin.\n"
+
+#: pg_upgrade.c:244
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Yeni kümeye (cluster) hizmet veren bir postmaster var görünüyor.\n"
+"Lütfen o postmaster'ı kapatıp tekrar deneyin.\n"
+
+#: pg_upgrade.c:250
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_upgrade.c:267
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Yeni cluster daki tüm satırlar (row) analiz ediliyor."
+
+#: pg_upgrade.c:280
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Yeni cluster daki tüm satırlar donduruluyor."
+
+#: pg_upgrade.c:300
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Yeni kümede (cluster) global objeler geri yükleniyor (restore)"
+
+#: pg_upgrade.c:315
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Yeni kümede (cluster) veritabanı şemaları geri yükleniyor\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "yeni %s deki dosyalar siliniyor"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "%s dizini silinemedi\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Eski %s yeni sunucuya kopyalanıyor"
+
+#: pg_upgrade.c:471
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Yeni küme (cluster) için sonraki işlem (transaction) ID ve dönem değeri belirleniyor."
+
+#: pg_upgrade.c:501
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Yeni kümede (cluster) sonraki multixact ID değeri ve göreli konum değeri (offset) belirleniyor"
+
+#: pg_upgrade.c:525
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Yeni kümede (cluster) en eski multixact ID değeri belirleniyor"
+
+#: pg_upgrade.c:545
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL arşivleri sıfırlanıyor (reset)"
+
+#: pg_upgrade.c:588
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Yeni kümede (cluster) frozenxid ve minmxid sayaçları belirleniyor"
+
+#: pg_upgrade.c:590
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Yeni kümede (cluster) minmxid sayacı belirleniyor"
+
+#: relfilenode.c:34
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Kullanıcı ilişki dosyaları bağlantılanıyor\n"
+
+#: relfilenode.c:36
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kullanıcı ilişki dosyaları kopyalanıyor\n"
+
+#: relfilenode.c:110
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "eski veritabanı \"%s\" yeni kümede (cluster) bulunmuyor\n"
+
+#: relfilenode.c:231
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "dosya varlığını kontrol sırasında hata oluştu \"%s.%s\" (\"%s\"yi \"%s\"ye): %s\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\"ye yeniden yazılıyor\n"
+
+#: relfilenode.c:255
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\"ye kopyalanıyor\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\" ye bağlantılanıyor\n"
+
+#: server.c:34
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "veritabanına bağlantı başarısız oldu: %s"
+
+#: server.c:40 server.c:142 util.c:136 util.c:166
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Başarısız, çıkılıyor\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "çalıştırılıyor: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL komutu çalıştırılamadı\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file: %s\n"
+msgstr "sürüm dosyası açılamadı: %s\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse PG_VERSION file from %s\n"
+msgstr "PG_VERSION dosyası %s den ayrıştırılamadı (parse)\n"
+
+#: server.c:295
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"veritabanına bağlantı başarısız oldu: %s"
+
+#: server.c:300
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"aşağıdaki komutla başlatılan kaynak postmaster'a bağlanılamadı:\n"
+"%s\n"
+
+#: server.c:304
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"aşağıdaki komutla başlatılan hedef postmaster'a bağlanılamadı:\n"
+"%s\n"
+
+#: server.c:318
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl kaynak sunucuyu başlatmakta başarısız oldu, ya da bağlantı başarısız\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl hedef sunucuyu başlatmakta başarısız oldu, ya da bağlantı başarısız\n"
+
+#: server.c:365
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: server.c:378
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "%s libpq ortam deÄŸiÅŸkeni yerel olmayan (non-local) bir sunucu deÄŸerine sahip: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Tablespace'ler kullanıldığında aynı sistem katalog sürümüne/sürümünden\n"
+"yükseltme yapılamaz.\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "tablespace için \"%s\" dizini mevcut değil\n"
+
+#: tablespace.c:91
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "\"%s\" tablesapace dizininin durumu görüntülenemedi (stat): %s\n"
+
+#: tablespace.c:96
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "tablespace için verilen \"%s\" yolu bir dizin değil\n"
+
+#: util.c:50
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:83
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:175
+#, c-format
+msgid "ok"
+msgstr "tamam"
+
+#: version.c:32
+#, c-format
+msgid "Checking for large objects"
+msgstr "Büyük nesneler (large objects) için kontrol yapılıyor"
+
+#: version.c:80 version.c:382
+#, c-format
+msgid "warning"
+msgstr "uyarı"
+
+#: version.c:82
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda büyük nesneler mevcut. Yeni veritabanının\n"
+"ilave bir büyük nesne yetkilendirme tablosu var. Yükseltme sonrası,\n"
+"size pg_largeobjet_metadata tablosunu varsayılan yetkilerle\n"
+" doldurmak için bir komut verilecek.\n"
+"\n"
+" \n"
+
+#: version.c:88
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda büyük nesneler mevcut. Yeni veritabanının\n"
+"ilave bir büyük nesne yetkilendirme tablosu var, yani bütün büyük\n"
+"nesneler için varsayılan yetkiler tanımlanmalı. Aşağıdaki dosya:\n"
+" %s\n"
+"psql'de veritabanı superuser'ı tarafından çalıştırıldığında varsayılan yetkileri ayarlayacak.\n"
+"\n"
+"\n"
+"\n"
+
+#: version.c:118
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Uyumlu olmayan \"line\" veri tipi için kontrol yapılıyor"
+
+#: version.c:180
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuzda kullanıcı tablolarında \"line\" veri tipi mevcut. Bu \n"
+"veri tipi, girdi/çıktı formatı eski ve yeni sürümler arasında değişiklik\n"
+"gösterdiği için bu küme şu anda yükseltilemiyor. Sorunlu tabloları\n"
+"çıkartıp yükseltmeyi tekrar başlatabilirsiniz. Problemli sütunları \n"
+"aşağıdaki dosyada bulabilirsiniz:\n"
+" %s\n"
+"\n"
+"\n"
+
+#: version.c:215
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Geçersiz \"bilinmeyen\" kullanıcı sütunları için kontrol yapılıyor"
+
+#: version.c:281
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz kullanıcı tablolarında \"unknown\" veri tipini içeriyor. Bu veri tipi\n"
+"tablolarda artık kullanılamadığından, bu küme (cluster) şu anda yüksletilemez\n"
+"Problemli tabloları çıkartarak (remove) yükseltmeyi tekrar başlatabilirsiniz.\n"
+"Problemli alanların bir listesini şu dosya içinde bulabilirsiniz:\n"
+" %s\n"
+"\n"
+
+#: version.c:304
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Hash indeksler kontrol ediliyor"
+
+#: version.c:384
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda hash indeksler mevcut. Bu indeksler eski ve yeni \n"
+"kümelerinizde farklı dahili formatlara sahip, bu yüzden REINDEX \n"
+"komutuyla tekrar indekslemelisiniz. Yükseltme sonrası size \n"
+"REINDEX talimatları verilecek.\n"
+"\n"
+"\n"
+
+#: version.c:390
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda hash indeksler mevcut. Bu indeksler eski ve yeni \n"
+"kümelerinizde farklı dahili formatlara sahip, bu yüzden REINDEX \n"
+"komutuyla tekrar indekslemelisiniz. Aşağıdaki dosya:\n"
+" %s\n"
+"psql'de veritabanı superuser'ı tarafından çalıştırıldığında bütün geçersiz\n"
+"indeksleri yeniden oluşturacak; o zamana kadar bu indeksler kullanılmayacak.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po
new file mode 100644
index 0000000..07c0119
--- /dev/null
+++ b/src/bin/pg_upgrade/po/uk.po
@@ -0,0 +1,1698 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:18+0000\n"
+"PO-Revision-Date: 2023-12-20 11:53\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_upgrade.pot\n"
+"X-Crowdin-File-ID: 963\n"
+
+#: check.c:72
+#, c-format
+msgid "Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr "Перевірка ціліÑтноÑÑ‚Ñ– на Ñтарому працюючому Ñервері\n"
+"------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid "Performing Consistency Checks\n"
+"-----------------------------"
+msgstr "ÐŸÑ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¾Ðº ціліÑтноÑÑ‚Ñ–\n"
+"-----------------------------"
+
+#: check.c:234
+#, c-format
+msgid "\n"
+"*Clusters are compatible*"
+msgstr "\n"
+"*КлаÑтери ÑуміÑні*"
+
+#: check.c:242
+#, c-format
+msgid "\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr "\n"
+"Якщо робота pg_upgrade піÑÐ»Ñ Ñ†Ñ–Ñ”Ñ— точки перерветьÑÑ, вам потрібно буде заново виконати initdb \n"
+"Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера, перед продовженнÑм."
+
+#: check.c:283
+#, c-format
+msgid "Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr "СтатиÑтика оптимізатора не передаєтьÑÑ Ð·Ð° допомогою pg_upgrade.\n"
+"ПіÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку нового Ñерверу розглÑньте можливіÑÑ‚ÑŒ запуÑку:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid "Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr "При запуÑку цього Ñкрипту файли даних Ñтарого клаÑтера будуть видалені:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid "Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr "Ðе вдалоÑÑ Ñтворити Ñкрипт Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² даних Ñтарого клаÑтеру,\n"
+"тому що каталог даних Ñтарого клаÑтера міÑтить кориÑтувацькі табличні\n"
+"проÑтори або каталог даних нового клаÑтера. ВміÑÑ‚ Ñтарого клаÑтера\n"
+"треба буде видалити вручну."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Перевірка верÑій клаÑтерів"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° може виконувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з верÑÑ–Ñ— PostgreSQL %s Ñ– новіше."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° може тільки підвищувати верÑÑ–ÑŽ PostgreSQL до верÑÑ–Ñ— %s."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° не може викориÑтовуватиÑÑŒ Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— до більш Ñтарих оÑновних верÑій PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Каталог даних Ñ– двійковий каталог Ñтарого клаÑтера з різних оÑновних верÑій."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Каталог даних нового клаÑтера Ñ– двійковий каталог з різних оÑновних верÑій."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ працюючого Ñервера, Ñтарий Ñ– новий номер порта повинні бути різними."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "Ðовий клаÑтер бази даних \"%s\" не порожній: знайдено Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\""
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Перевірка каталогів табличних проÑторів клаÑтера"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "каталог нового клаÑтерного табличного проÑтору вже Ñ–Ñнує: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid "\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr "\n"
+"ПОПЕРЕДЖЕÐÐЯ: новий каталог даних не повинен бути вÑередині Ñтарого каталогу даних, наприклад %s"
+
+#: check.c:466
+#, c-format
+msgid "\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr "\n"
+"ПОПЕРЕДЖЕÐÐЯ: кориÑтувацькі Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… проÑторів не повинні бути вÑередині каталогу даних, наприклад %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñкрипту Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñтарого клаÑтеру"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ право Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Перевірка, чи Ñ” кориÑтувач бази даних Ñтартовим кориÑтувачем"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "кориÑтувач бази даних \"%s\" не Ñ” Ñтартовим кориÑтувачем"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ кількіÑÑ‚ÑŒ кориÑтувачів"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Ð’ новому клаÑтері може бути визначеним тільки Ñтартовий кориÑтувач."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Перевірка параметрів Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 не повинна дозволÑти підключеннÑ, тобто pg_database.datallowconn повинно бути false"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "збій"
+
+#: check.c:668
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr "Ð’ÑÑ– бази даних, окрім template0, повинні дозволÑти підключеннÑ, тобто\n"
+"pg_database.datallowconn повинно бути true. Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить\n"
+"бази даних окрім template0 Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_database.datallowconn Ñких дорівнює \n"
+"false. РозглÑньте можливіÑÑ‚ÑŒ надати дозвіл на Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… баз даних, \n"
+"Ñкі не Ñ” шаблоном, або видалити баз даних, Ñкі не дозволÑÑŽÑ‚ÑŒ з’єднаннÑ. \n"
+"СпиÑок баз даних з проблемою знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Перевірка підготовлених транзакцій"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Початковий клаÑтер міÑтить підготовлені транзакції"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Цільовий клаÑтер міÑтить підготовлені транзакції"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Перевірка невідповідноÑÑ‚Ñ– при передаванні bigint в contrib/isn"
+
+#: check.c:789
+#, c-format
+msgid "Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить функції \"contrib/isn\", що викориÑтовують тип даних bigint. Старі та нові клаÑтери передають Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ bigint по-різному, тому цей клаÑтер наразі неможливо оновити. Ви можете вручну вивантажити бази даних зі Ñтарого клаÑтеру, що викориÑтовує заÑоби \"contrib/isn\", видалити Ñ—Ñ…, виконати оновленнÑ, а потім відновити Ñ—Ñ…. СпиÑок проблемних функцій подано у файлі:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Перевірка поÑтфікÑних операторів визначених кориÑтувачем"
+
+#: check.c:887
+#, c-format
+msgid "Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить кориÑтувацькі поÑтфікÑні оператори, що більше не підтримуютьÑÑ.\n"
+"РозглÑньте можливіÑÑ‚ÑŒ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑтфікÑних операторів та заміни Ñ—Ñ… на префікÑні оператори або виклики функцій.\n"
+"СпиÑок кориÑтувацьких поÑтфікÑних операторів знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Перевірка неÑуміÑних поліморфних функцій"
+
+#: check.c:1013
+#, c-format
+msgid "Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr "У вашій інÑталÑції міÑÑ‚ÑÑ‚ÑŒÑÑ ÐºÐ¾Ñ€Ð¸Ñтувацькі об'єкти, Ñкі поÑилаютьÑÑ Ð½Ð° внутрішні\n"
+"поліморфні функції з аргументами типу \"anyarray\" або \"anyelement\".\n"
+"Ці кориÑтувацькі об'єкти повинні бути видалені перед оновленнÑм Ñ– відновлені\n"
+"піÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾, змінивши Ñ—Ñ… поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° нові відповідні функції з\n"
+"аргументами типу \"anycompatiblearray\" і \"anycompatible\".\n"
+"СпиÑок проблемних об'єктів знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Перевірка таблиць WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid "Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить таблиці, Ñтворені Ñк WITH OIDS, що більше не підтримуютьÑÑ. РозглÑньте Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñтовпців, що міÑÑ‚ÑÑ‚ÑŒ oid за допомогою\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"СпиÑок проблемних таблиць подано у файлі:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Перевірка Ñкладених типів визначених ÑиÑтемою у таблицÑÑ… кориÑтувача"
+
+#: check.c:1149
+#, c-format
+msgid "Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить Ñкладені типи визначені ÑиÑтемою у таблицÑÑ… кориÑтувача.\n"
+"Ці типи OID не Ñтабільні між верÑÑ–Ñми PostgreSQL, тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Перевірка типів даних reg* в кориÑтувацьких таблицÑÑ…"
+
+#: check.c:1210
+#, c-format
+msgid "Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить один з типів даних reg* у таблицÑÑ… кориÑтувача.\n"
+"Ці типи даних поÑилаютьÑÑ Ð½Ð° OID ÑиÑтеми, Ñкі не зберігаютьÑÑ Ð·Ð° допомогою pg_upgrade, тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Перевірка неÑуміÑного типу даних \"%s\" в кориÑтувацьких таблицÑÑ…"
+
+#: check.c:1239
+#, c-format
+msgid "Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"aclitem\" у таблицÑÑ… кориÑтувача.\n"
+"Внутрішній формат \"aclitem\" змінено під Ñ‡Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ— 16,\n"
+"тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Перевірка видаленого типу даних \"%s\" в кориÑтувацьких таблицÑÑ…"
+
+#: check.c:1273
+#, c-format
+msgid "Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr "КориÑтувацькі таблиці у вашій інÑталÑції міÑÑ‚ÑÑ‚ÑŒ тип даних \"%s\".\n"
+"Тип \"%s\" був видалений з верÑÑ–Ñ— PostgreSQL %s, тому цей клаÑтер \n"
+"наразі не може бути оновлений. Ви можете видалите проблемні \n"
+"Ñтовпці або змінити Ñ—Ñ… на інший тип даних, Ñ– перезапуÑтити\n"
+"оновленнÑ. СпиÑок проблемних Ñтовпців Ñ” у файлі:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Перевірка неÑуміÑного типу даних \"jsonb\""
+
+#: check.c:1304
+#, c-format
+msgid "Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"jsonb\" у таблицÑÑ… кориÑтувача.\n"
+"Внутрішній формат \"jsonb\" змінено під Ñ‡Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ— 9.4 beta,\n"
+"тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Перевірка ролей, Ñкі починаютьÑÑ Ð· \"pg_\""
+
+#: check.c:1363
+#, c-format
+msgid "Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить ролі, Ñкі починаютьÑÑ Ð· \"pg_\".\n"
+"\"pg_\" Ñ” зарезервованим префікÑом Ð´Ð»Ñ ÑиÑтемних ролей. КлаÑтер\n"
+"не може бути оновлений, поки ці ролі не будуть перейменовані.\n"
+"СпиÑок ролей, Ñкі починаютьÑÑ Ð· \"pg_\" у файлі:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Перевірка кориÑтувацьких Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½ÑŒ"
+
+#: check.c:1444
+#, c-format
+msgid "Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить кориÑтувацькі Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½ÑŒ.\n"
+"Параметри функції Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð¾ у верÑÑ–Ñ— PostgreSQL 14,\n"
+"тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½ÑŒ в Ñтарому клаÑтері та перезапуÑтити оновленнÑ.\n"
+"СпиÑок перетворень кодувань знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ контрольні дані за допомогою %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: неприпуÑтимий Ñтан клаÑтера баз даних"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Початковий клаÑтер завершив роботу в режимі відновленнÑ. Щоб виконати оновленнÑ, викориÑтайте документований ÑпоÑіб з \"rsync\" або вимкніть його в режимі головного Ñерверу."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Цільовий клаÑтер завершив роботу в режимі відновленнÑ. Щоб виконати оновленнÑ, викориÑтайте документований ÑпоÑіб з \"rsync\" або вимкніть його в режимі головного Ñерверу."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Початковий клаÑтер завершив роботу некоректно."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Цільовий клаÑтер завершив роботу некоректно."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Ð’ початковому клаÑтері відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñтан клаÑтера:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Ð’ цільовому клаÑтері відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñтан клаÑтера:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: проблема pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: проблема з отриманнÑм контрольних даних"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "У початковому клаÑтері відÑÑƒÑ‚Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð° контрольна інформаціÑ:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "У цільовому клаÑтері відÑÑƒÑ‚Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð° контрольна інформаціÑ:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " наÑтупний XID контрольної точки"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " наÑтупний OID оÑтанньої контрольної точки"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " наÑтупний MultiXactId оÑтанньої контрольної точки"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " найÑтарший MultiXactId оÑтанньої контрольної точки"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " найÑтарший oldestXID оÑтанньої контрольної точки"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " наÑтупний MultiXactOffset оÑтанньої контрольної точки"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " перший Ñегмет WAL піÑÐ»Ñ ÑкиданнÑ"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " метод передачі аргументу float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " макÑимальне вирівнюваннÑ"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " розмір блоку"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " розмір Ñегменту великого відношеннÑ"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " розмір блоку WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " розмір Ñегменту WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " макÑимальна довжина ідентифікатора"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " макÑимальна кількіÑÑ‚ÑŒ індекÑованих Ñтовпців"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " макÑимальний розмір порції TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " розмір порції великого об'єкту"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " дата/Ñ‡Ð°Ñ Ð¿Ñ€ÐµÐ´Ñтавлені цілими чиÑлами?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум даних"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Ðе можна продовжити без необхідної контрольної інформації, завершеннÑ"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr "Ñтаре Ñ– нове Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð² pg_controldata неприпуÑтимі або не збігаютьÑÑ\n"
+"Ймовірно, один клаÑтер вÑтановлений у 32-бітній ÑиÑтемі, а інший - у 64-бітній"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "Ñтарий Ñ– новий розмір блоків в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "Ñтарий Ñ– новий макÑимальний розмір Ñегментів відношень в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "Ñтарий Ñ– новий розмір блоків WAL в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "Ñтарий Ñ– новий розмір Ñегментів WAL в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "Ñтара Ñ– нова макÑимальна довжина ідентифікаторів в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "Ñтара Ñ– нова макÑимальна кількіÑÑ‚ÑŒ індекÑованих Ñтовпців в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "Ñтарий Ñ– новий макÑимальний розмір порції TOAST в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "Ñтарий Ñ– новий розмір порції великого об'єкту в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "Ñтарий Ñ– новий тип Ñховища дати/чаÑу в pg_controldata неприпуÑтимі або не збігаютьÑÑ"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "Ñтарий клаÑтер не викориÑтовує контрольні Ñуми даних, але новий викориÑтовує"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "Ñтарий клаÑтер викориÑтовує контрольні Ñуми даних, але новий не викориÑтовує"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "Ñтара Ñ– нова верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум клаÑтера в pg_controldata не збігаютьÑÑ"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÑуфікÑа \".old\" до Ñтарого файла global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid "\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr "\n"
+"Якщо ви хочете запуÑтити Ñтарий клаÑтер, вам необхідно видалити\n"
+"ÑÑƒÑ„Ñ–ÐºÑ \".old\" з файлу %s/global/pg_control.old. Через викориÑтаннÑ\n"
+"режиму \"link\" робота Ñтарого клаÑтера піÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку нового може бути\n"
+"небезпечна."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¸Ñ… об'єктів"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð°Ð¼Ð¿Ñƒ Ñхем бази даних"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані верÑÑ–Ñ— pg_ctl, виконавши %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ pg_ctl з результату %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "команда занадто довга"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid "\n"
+"*failure*"
+msgstr "\n"
+"*неполадка*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ \"%s\" виникли проблеми"
+
+#: exec.c:199
+#, c-format
+msgid "Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "Щоб зрозуміти причину неполадки, звернітьÑÑ Ð´Ð¾ декількох оÑтанніх Ñ€Ñдків\n"
+"файлу \"%s\" або \"%s\"."
+
+#: exec.c:204
+#, c-format
+msgid "Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "Щоб зрозуміти причину неполадки, звернітьÑÑ Ð´Ð¾ декількох оÑтанніх Ñ€Ñдків\n"
+"файлу \"%s\"."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу журналу \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Ви повинні мати права на Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ– Ð·Ð°Ð¿Ð¸Ñ Ð² поточному каталозі."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "перевірка \"%s\" провалена: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" не є каталогом"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "перевірка \"%s\" провалена: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "помилка перевірки \"%s\": не можна виконати"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "помилка перевірки \"%s\": неправильна верÑÑ–Ñ: знайдено \"%s\", очікувалоÑÑŒ \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" (\"%s\" до \"%s\"): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñтворити файл \"%s\": %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñтворити файл \"%s\": %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" ( з \"%s\" в \"%s\"): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" ( з \"%s\" в \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтан файлу \"%s\": %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": у файлі \"%s\" знайдена чаÑткова Ñторінка"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "не вдалоÑÑ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ файл між Ñтарим Ñ– новим каталогами даних: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "не вдалоÑÑ Ñтворити файл \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² не підтримуєтьÑÑ Ð½Ð° цій платформі"
+
+#: file.c:372
+#, c-format
+msgid "could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr "не вдалоÑÑ Ñтворити жорÑтке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ Ñтарим Ñ– новим каталогами даних: %s\n"
+"Ð’ режимі поÑилань Ñтарий Ñ– новий каталоги даних повинні знаходитиÑÑŒ в одній файловій ÑиÑтемі."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Перевірка наÑвноÑÑ‚Ñ– необхідних бібліотек"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку \"%s\": %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "У базі даних: %s\n"
+
+#: function.c:186
+#, c-format
+msgid "Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr "У вашій інÑталÑції Ñ” поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° завантажувані бібліотеки, що \n"
+"відÑутні в новій інÑталÑції. Ви можете додати ці бібліотеки до нової інÑталÑції\n"
+"або видалити функції, Ñкі викориÑтовують Ñ—Ñ… зі Ñтарої інÑталÑції. СпиÑок\n"
+"проблемних бібліотек подано у файлі:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Імена відношень з OID %u в базі даних \"%s\" не збігаютьÑÑ: Ñтаре ім'Ñ \"%s.%s\", нове ім'Ñ \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Ðе вдалоÑÑ Ð·Ñ–Ñтавити Ñтарі таблиці з новими в базі даних \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " це Ñ–Ð½Ð´ÐµÐºÑ Ð² \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " це Ñ–Ð½Ð´ÐµÐºÑ Ñƒ відношенні з OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " це TOAST-Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ \"%s.%s\""
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " це TOAST-Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "У Ñтарому клаÑтері не знайдено відповідноÑÑ‚Ñ– Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u в базі даних %s\": %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "У новому клаÑтері не знайдено відповідноÑÑ‚Ñ– Ð´Ð»Ñ Ñтарого Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u в базі даних \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid "\n"
+"source databases:"
+msgstr "\n"
+"вихідні бази даних:"
+
+#: info.c:291
+#, c-format
+msgid "\n"
+"target databases:"
+msgstr "\n"
+"цільові бази даних:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 не знайдено"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "База даних: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "ім'Ñ_відношеннÑ: %s.%s: oid_відношеннÑ: %u табл_проÑÑ‚Ñ–Ñ€: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: не можна запуÑтити Ñк root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "неприпуÑтимий Ñтарий номер порту"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "неприпуÑтимий новий номер порту"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "ВиконуєтьÑÑ Ð² детальному режимі"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ñ–Ð¹ÐºÐ¾Ð²Ð¸Ñ… даних Ñтарого клаÑтера"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ñ–Ð¹ÐºÐ¾Ð²Ð¸Ñ… даних нового клаÑтера"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñтарого клаÑтера"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… нового клаÑтера"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "Ñокети будуть Ñтворені"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "у Windows не можна виконати pg_upgrade вÑередині каталогу даних нового клаÑтера"
+
+#: option.c:268
+#, c-format
+msgid "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"
+msgstr "pg_upgrade оновлює клаÑтер PostgreSQL до іншої оÑновної верÑÑ–Ñ—.\n\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: option.c:270
+#, c-format
+msgid " pg_upgrade [OPTION]...\n\n"
+msgstr " pg_upgrade [OPTION]...\n\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR каталог виконуваних файлів Ñтарого клаÑтера\n"
+
+#: option.c:273
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr " -B, --new-bindir=BINDIR каталог виконуваних файлів нового клаÑтера (за замовчуваннÑм\n"
+" той Ñамий каталог, що Ñ– pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check тільки перевірити клаÑтери, не змінювати ніÑкі дані\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR каталог даних Ñтарого клаÑтера\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR каталог даних нового клаÑтера\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM чиÑло одночаÑних процеÑів або потоків Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link вÑтановлювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–ÑÑ‚ÑŒ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² до нового клаÑтера\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на диÑку\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS параметри Ñтарого клаÑтера, Ñкі передаютьÑÑ Ñерверу\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS параметри нового клаÑтера, Ñкі передаютьÑÑ Ñерверу\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT номер порту Ñтарого клаÑтера (за замовчуваннÑм %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT номер порту нового клаÑтера (за замовчуваннÑм %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain зберегти файли журналів Ñ– SQL піÑÐ»Ñ ÑƒÑпішного завершеннÑ\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ñокету Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ (за Ð·Ð°Ð¼Ð¾Ð²Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð° директоріÑ)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME ÑуперкориÑтувач клаÑтера (за замовчуваннÑм \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose активувати Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¸Ñ… внутрішніх повідомлень\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version відобразити інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone клонувати заміÑÑ‚ÑŒ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² до нового клаÑтера\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy копіювати файли до нового клаÑтеру (за замовчуваннÑм)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: option.c:293
+#, c-format
+msgid "\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr "\n"
+"До Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ pg_upgrade ви повинні:\n"
+" Ñтворити новий клаÑтер баз даних (викориÑтовуючи нову верÑÑ–ÑŽ initdb)\n"
+" завершити Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster, Ñкий обÑлуговує Ñтарий клаÑтер\n"
+" завершити Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster, Ñкий обÑлуговує новий клаÑтер\n"
+
+#: option.c:298
+#, c-format
+msgid "\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr "\n"
+"Коли ви виконуєте pg_upgrade, ви повинні надати наÑтупну інформацію:\n"
+" каталог даних Ñтарого клаÑтера (-d DATADIR)\n"
+" каталог даних нового клаÑтера (-D DATADIR)\n"
+" каталог \"bin\" Ñтарого клаÑтера (-b BINDIR)\n"
+" каталог \"bin\" нового клаÑтера (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid "\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr "\n"
+"Ðаприклад:\n"
+" pg_upgrade -d Ñтарий_клаÑтер/data -D новий_клаÑтер/data -b Ñтарий_клаÑтер/bin -B новий_клаÑтер/bin\n"
+"або\n"
+
+#: option.c:309
+#, c-format
+msgid " $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr " $ export PGDATAOLD=Ñтарий_клаÑтер/data\n"
+" $ export PGDATANEW=новий_клаÑтер/data\n"
+" $ export PGBINOLD=Ñтарий_клаÑтер/bin\n"
+" $ export PGBINNEW=новий_клаÑтер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid " C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr " C:\\> set PGDATAOLD=Ñтарий_клаÑтер/data\n"
+" C:\\> set PGDATANEW=новий_клаÑтер/data\n"
+" C:\\> set PGBINOLD=Ñтарий_клаÑтер/bin\n"
+" C:\\> set PGBINNEW=новий_клаÑтер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid "You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr "Ви повинні визначити каталог, де знаходитьÑÑ %s.\n"
+"Будь лаÑка, викориÑтайте параметр командного Ñ€Ñдка %s або змінну Ñередовища %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Пошук дійÑного каталогу даних Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Пошук дійÑного каталогу даних Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ каталог даних, виконавши %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñ€Ñдок %d з файлу \"%s\": %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "вказаний кориÑтувачем Ñтарий номер порту %hu змінений на %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "не вдалоÑÑ Ñтворити робочий процеÑ: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "не вдалоÑÑ Ñтворити робочий потік: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() помилка: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð½ÐµÐ½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾: ÑÑ‚Ð°Ñ‚ÑƒÑ %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ права на каталог \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid "\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr "\n"
+"Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ñтупного OID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних на диÑк"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid "\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr "\n"
+"ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "шлÑÑ… каталогу Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтеру занадто довгий"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ð»Ð°Ñної програми"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid "There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr "Мабуть, запущений Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster, Ñкий обÑлуговує Ñтарий клаÑтер.\n"
+"Будь лаÑка, завершіть роботу процеÑу Ñ– Ñпробуйте знову."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid "There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr "Мабуть, запущений Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster, Ñкий обÑлуговує новий клаÑтер.\n"
+"Будь лаÑка, завершіть роботу процеÑу Ñ– Ñпробуйте знову."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "УÑтановка локалі та ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтеру"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Ðналіз вÑÑ–Ñ… Ñ€Ñдків у новому клаÑтері"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… Ñ€Ñдків у новому клаÑтері"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¸Ñ… об'єктів у новому клаÑтері"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñхем баз даних у новому клаÑтері"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² з нового %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñтарого %s до нового Ñерверу"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð¹Ñтарішого XID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтеру"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "УÑтановка наÑтупного ID транзакції й епохи Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "УÑтановка наÑтупного ID Ñ– зÑуву мультитранзакції Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "УÑтановка найÑтаршого ID мультитранзакції в новому клаÑтері"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñ–Ð² WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "УÑтановка лічильників frozenxid Ñ– minmxid у новому клаÑтері"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "УÑтановка лічильника minmxid у новому клаÑтері"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "ÐšÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "ÐŸÑ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "Ñтара база даних \"%s\" не знайдена в новому клаÑтері"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñ–ÑÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s.%s\" (з \"%s\" в \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "перепиÑÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" на \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" до \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° \"%s\" в \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Помилка, вихід\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "виконуєтьÑÑ: %s"
+
+#: server.c:139
+#, c-format
+msgid "SQL command failed\n"
+"%s\n"
+"%s"
+msgstr "Помилка SQL-команди\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл верÑÑ–Ñ— \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ файл верÑÑ–Ñ— \"%s\""
+
+#: server.c:288
+#, c-format
+msgid "\n"
+"%s"
+msgstr "\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid "could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ початкового процеÑу postmaster, запущеного командою:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid "could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ цільового процеÑу postmaster, запущеного командою:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl не зміг запуÑтити початковий Ñервер або ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° підключеннÑ"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl не зміг запуÑтити цільовий Ñервер або ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° підключеннÑ"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "у змінній Ñередовища Ð´Ð»Ñ libpq %s задано не локальне значеннÑ: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid "Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² межах однієї верÑÑ–Ñ— ÑиÑтемного каталогу неможливе,\n"
+"Ñкщо викориÑтовуютьÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ– проÑтори."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "каталог табличного проÑтору \"%s\" не Ñ–Ñнує"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтан каталогу табличного проÑтору \"%s\": %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "шлÑÑ… табличного проÑтору \"%s\" не вказує на каталог"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доÑтупу до каталогу \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Перевірка неÑуміÑного типу даних \"line\""
+
+#: version.c:193
+#, c-format
+msgid "Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"line\" в таблицÑÑ… кориÑтувача.\n"
+"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою Ñтарою та новими верÑÑ–Ñми,\n"
+"тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Перевірка неприпуÑтимих кориÑтувацьких Ñтовпців \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid "Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить \"unknown\" тип даних у таблицÑÑ… кориÑтувача.\n"
+"Цей тип даних більше не допуÑкаєтьÑÑ Ð² таблицÑÑ…,\n"
+"тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Перевірка геш-індекÑів"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "попередженнÑ"
+
+#: version.c:337
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr "\n"
+"Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить геш-індекÑи. Ці індекÑи мають різні внутрішні\n"
+"формати в Ñтарому Ñ– новому клаÑтерах, тож Ñ—Ñ… потрібно повторно індекÑувати\n"
+"за допомогою команди REINDEX. ПіÑÐ»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð¼ буде надано інÑтрукції REINDEX."
+
+#: version.c:343
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr "\n"
+"Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить геш-індекÑи. Ці індекÑи мають різні внутрішні\n"
+"формати в Ñтарому Ñ– новому клаÑтерах, тож Ñ—Ñ… потрібно повторно індекÑувати\n"
+"за допомогою команди REINDEX. Файл\n"
+" %s\n"
+"піÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑуперкориÑтувачем бази даних в psql, повторно Ñтворить\n"
+"вÑÑ– неприпуÑтимі індекÑи; до цього ніÑкі геш-індекÑи не будуть викориÑтовуватиÑÑŒ."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Перевірка неприпуÑтимих кориÑтувацьких Ñтовпців \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить \"sql_identifier\" тип даних у таблицÑÑ… кориÑтувача.\n"
+"Формат Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних змінено,\n"
+"тому цей клаÑтер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n"
+"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Перевірка оновлень розширеннÑ"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "повідомленнÑ"
+
+#: version.c:451
+#, c-format
+msgid "\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr "\n"
+"Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить розширеннÑ, Ñкі потрібно оновити\n"
+"командою ALTER EXTENSION. Файл\n"
+" %s,\n"
+"коли виконуєтьÑÑ ÑуперкориÑтувачем бази даних за допомогою\n"
+"psql, оновить ці розширеннÑ."
+
diff --git a/src/bin/pg_upgrade/po/zh_CN.po b/src/bin/pg_upgrade/po/zh_CN.po
new file mode 100644
index 0000000..4ab61a5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/zh_CN.po
@@ -0,0 +1,1850 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 18:40+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:70
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"在旧的活动的æœåŠ¡å™¨ä¸Šæ‰§è¡Œä¸€è‡´æ€§æ£€æŸ¥\n"
+"------------------------------------------------\n"
+
+#: check.c:76
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"正在执行一致性检查\n"
+"-----------------------------\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*群集是兼容的*\n"
+
+#: check.c:219
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"如果pg_upgrade在这一点之åŽå¤±è´¥ï¼Œåœ¨ç»§ç»­ä¹‹å‰å¿…é¡»é‡æ–°åˆå§‹åŒ–新集群.\n"
+
+#: check.c:264
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"优化器统计数æ®ä¸ä¼šé€šè¿‡pg_upgrade传输。\n"
+"å¯åŠ¨æ–°æœåŠ¡å™¨åŽï¼Œè€ƒè™‘è¿è¡Œ:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"è¿è¡Œæ­¤è„šæœ¬å°†åˆ é™¤æ—§ç¾¤é›†çš„æ•°æ®æ–‡ä»¶:\n"
+" %s\n"
+
+#: check.c:275
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"无法创建删除旧群集数æ®æ–‡ä»¶çš„脚本.\n"
+"因为用户定义的表空间或新集群的数æ®ç›®å½•å­˜åœ¨äºŽæ—§é›†ç¾¤ç›®å½•ä¸­.\n"
+"必须手动删除旧群集的内容.\n"
+
+#: check.c:287
+#, c-format
+msgid "Checking cluster versions"
+msgstr "正在检查群集版本"
+
+#: check.c:299
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "此实用程åºåªèƒ½ä»ŽPostgreSQL 8.4åŠæ›´é«˜ç‰ˆæœ¬å‡çº§.\n"
+
+#: check.c:303
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "此实用程åºåªèƒ½å‡çº§åˆ°PostgreSQL版本%s.\n"
+
+#: check.c:312
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "此实用程åºä¸èƒ½ç”¨äºŽé™çº§åˆ°æ—§çš„主PostgreSQL版本.\n"
+
+#: check.c:317
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "旧的集群数æ®å’ŒäºŒè¿›åˆ¶ç›®å½•æ¥è‡ªä¸åŒçš„主版本.\n"
+
+#: check.c:320
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "新的集群数æ®å’ŒäºŒè¿›åˆ¶ç›®å½•æ¥è‡ªä¸åŒçš„主版本.\n"
+
+#: check.c:337
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "在检查pre-PG 9.1之å‰çš„活动旧æœåŠ¡å™¨æ—¶ï¼Œå¿…须指定旧æœåŠ¡å™¨çš„端å£å·.\n"
+
+#: check.c:341
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "检查活动æœåŠ¡å™¨æ—¶ï¼Œæ–°ç«¯å£å·å’Œæ—§ç«¯å£å·å¿…é¡»ä¸åŒ.\n"
+
+#: check.c:356
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "æ•°æ®åº“\"%s\"çš„ç¼–ç ä¸åŒ¹é…: 旧的 \"%s\", æ–°çš„ \"%s\"\n"
+
+#: check.c:361
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "æ•°æ®åº“\"%s\"çš„lc_collateä¸åŒ¹é…: 旧的 \"%s\", æ–°çš„ \"%s\"\n"
+
+#: check.c:364
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "æ•°æ®åº“\"%s\"çš„lc_ctypeä¸åŒ¹é…: 旧的 \"%s\", æ–°çš„ \"%s\"\n"
+
+#: check.c:437
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "新群集数æ®åº“\"%s\"ä¸æ˜¯ç©ºçš„:找到关系\"%s.%s\"\n"
+
+#: check.c:494
+msgid "Checking for new cluster tablespace directories"
+msgstr "正在检查新的群集表空间目录"
+
+#: check.c:505
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "新的群集表空间目录已存在: \"%s\"\n"
+
+#: check.c:538
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:新数æ®ç›®å½•ä¸åº”ä½äºŽæ—§æ•°æ®ç›®å½•ä¸­ï¼Œä¾‹å¦‚ %s\n"
+
+#: check.c:562
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:用户定义的表空间ä½ç½®ä¸åº”在数æ®ç›®å½•ä¸­ï¼Œä¾‹å¦‚ %s\n"
+
+#: check.c:572
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "正在创建删除旧群集的脚本"
+
+#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336
+#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376
+#: version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "无法打开文件 \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "无法å‘文件\"%s\"添加执行æƒé™: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "正在检查数æ®åº“用户是å¦ä¸ºå®‰è£…用户"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "æ•°æ®åº“用户\"%s\"ä¸æ˜¯å®‰è£…用户\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "无法确定用户数\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "åªèƒ½åœ¨æ–°ç¾¤é›†ä¸­å®šä¹‰å®‰è£…用户.\n"
+
+#: check.c:706
+#, c-format
+msgid "Checking database connection settings"
+msgstr "正在检查数æ®åº“连接设置"
+
+#: check.c:728
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0ä¸èƒ½å…许连接,å³ï¼Œå…¶pg_database.datallowconn必须为false\n"
+
+#: check.c:738
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "所有éžtemplate0æ•°æ®åº“å¿…é¡»å…许连接,å³ï¼Œå®ƒä»¬çš„pg_database.dataallowconn必须为true\n"
+
+#: check.c:763
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "正在检查准备的交易记录"
+
+#: check.c:772
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "æºç¾¤é›†åŒ…å«å‡†å¤‡å¥½çš„事务\n"
+
+#: check.c:774
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "目标集群包å«å‡†å¤‡å¥½çš„事务\n"
+
+#: check.c:800
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "正在检查contrib/isnå’Œbigint-passing是å¦ä¸åŒ¹é…"
+
+#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183
+#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "致命的\n"
+
+#: check.c:862
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«\"contrib/isn\"函数,这些函数ä¾èµ–于bigintæ•°æ®ç±»åž‹\n"
+"旧群集和新群集传递的bigint值ä¸åŒï¼Œå› æ­¤å½“å‰æ— æ³•å‡çº§æ­¤ç¾¤é›†\n"
+"您å¯ä»¥æ‰‹åŠ¨çš„在旧集群中转储数æ®åº“,\n"
+"使用 \"contrib/isn\"\n"
+"删除它们,执行å‡çº§ï¼Œç„¶åŽæ¢å¤å®ƒä»¬ã€‚\n"
+"文件中有问题函数的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:885
+msgid "Checking for user-defined postfix operators"
+msgstr "正在检查用户定义的åŽç¼€è¿ç®—符"
+
+#: check.c:963
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·å®šä¹‰çš„åŽç¼€è¿ç®—符,它们\n"
+"ä¸å†æ”¯æŒäº†ã€‚考虑删除åŽç¼€è¿ç®—符并用å‰ç¼€è¿ç®—符或函数调用替æ¢å®ƒä»¬\n"
+"函数调用替æ¢å®ƒä»¬.\n"
+"以下的文件中有用户定义的åŽç¼€è¿ç®—符列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:984
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "正在检查带有OIDS的表"
+
+#: check.c:1039
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨OID声明的表,这ä¸å†å—支æŒ\n"
+"考虑使用以下的SQL移除OID列\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"有问题的表在以下的文件中:\n"
+" %s\n"
+"\n"
+
+#: check.c:1067
+msgid "Checking for system-defined composite types in user tables"
+msgstr "在用户表中检查系统定义的å¤åˆç±»åž‹"
+
+#: check.c:1096
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·è¡¨ä¸­çš„系统定义的å¤åˆç±»åž‹ã€‚\n"
+"这些类型OID在PostgreSQL版本中ä¸ç¨³å®šã€‚\n"
+"因此,当å‰æ— æ³•å‡çº§æ­¤ç¾¤é›†ã€‚\n"
+"ä½ å¯ä»¥åˆ é™¤æœ‰é—®é¢˜çš„列并é‡æ–°å¯åŠ¨å‡çº§ã€‚\n"
+"以下的文件中有问题列的列表\n"
+" %s\n"
+"\n"
+
+#: check.c:1124
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "正在检查用户表中的reg*æ•°æ®ç±»åž‹"
+
+#: check.c:1155
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·è¡¨ä¸­çš„æŸä¸ªreg*æ•°æ®ç±»åž‹.\n"
+"这些数æ®ç±»åž‹å¼•ç”¨äº†pg_upgradeä¸ä¿ç•™çš„系统OID, \n"
+"因此当å‰æ— æ³•å‡çº§æ­¤ç¾¤é›† . You can\n"
+"您å¯ä»¥åˆ é™¤é—®é¢˜è¡¨å¹¶é‡æ–°å¯åŠ¨å‡çº§.\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "正在检查ä¸å…¼å®¹çš„\"jsonb\"æ•°æ®ç±»åž‹"
+
+#: check.c:1184
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·è¡¨ä¸­çš„\"jsonb\"æ•°æ®ç±»åž‹.\n"
+"\"jsonb\"的内部格å¼åœ¨9.4测试版期间å‘生了更改,\n"
+"因此当å‰æ— æ³•å‡çº§è¯¥é›†ç¾¤ã€‚\n"
+"您å¯ä»¥åˆ é™¤é—®é¢˜è¡¨å¹¶é‡æ–°å¯åŠ¨å‡çº§. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1206
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "正在检查以\"pg_\"开头的角色"
+
+#: check.c:1216
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "æºé›†ç¾¤åŒ…å«ä»¥\"pg_\"开头的角色\n"
+
+#: check.c:1218
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "目标集群包å«ä»¥\"pg_\"开头的角色\n"
+
+#: check.c:1239
+msgid "Checking for user-defined encoding conversions"
+msgstr "正在检查用户定义的编ç è½¬æ¢"
+
+#: check.c:1302
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·å®šä¹‰çš„ç¼–ç è½¬æ¢ã€‚\n"
+"转æ¢å‡½æ•°å‚数在PostgreSQL版本14中已更改。\n"
+"因此当å‰æ— æ³•å‡çº§æ­¤ç¾¤é›†ã€‚\n"
+"您å¯ä»¥åˆ é™¤é—®é¢˜è¡¨å¹¶é‡æ–°å¯åŠ¨å‡çº§. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1329
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "无法获å–当å‰åŒºåŸŸè®¾ç½®\n"
+
+#: check.c:1338
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "无法获å–\"%s\"的系统区域设置å称\n"
+
+#: check.c:1344
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "还原旧区域\"%s\"失败\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "无法使用%s获å–控制数æ®ï¼š%s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: æ•°æ®åº“集群状æ€é—®é¢˜\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "在æ¢å¤æ¨¡å¼ä¸‹ï¼Œæºç¾¤é›†å·²å…³é—­ã€‚è¦å‡çº§ï¼Œè¯·ä½¿ç”¨æ–‡æ¡£ä¸­çš„\"rsync\",或将其作为主æœåŠ¡å™¨å…³é—­ã€‚\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "目标群集在æ¢å¤æ¨¡å¼ä¸‹å…³é—­ã€‚è¦å‡çº§ï¼Œè¯·ä½¿ç”¨æ–‡æ¡£ä¸­çš„\"rsync\",或将其作为主æœåŠ¡å™¨å…³é—­ã€‚\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "æºç¾¤é›†æœªå®Œå…¨å…³é—­ã€‚\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "目标群集未完全关闭。\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "æºé›†ç¾¤ç¼ºå°‘集群状æ€ä¿¡æ¯:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "目标集群缺少集群状æ€ä¿¡æ¯:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal问题\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: 控制数æ®æ£€ç´¢é—®é¢˜\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "æºé›†ç¾¤ç¼ºå°‘一些必需的控制信æ¯:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "目标集群缺少一些必需的控制信æ¯:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " 下一个XID检查点\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 最新检查点下一个OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 最新检查点下一个MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 最新检查点最旧的MultiXactId\n"
+
+#: controldata.c:591
+msgid " latest checkpoint oldestXID\n"
+msgstr " 最新检查点的最旧XID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 最新检查点下一个MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " é‡ç½®åŽçš„第一个WAL段\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8å‚数传递方法\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 最大对é½æ–¹å¼\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " å—大å°\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " 大关系段大å°\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WALå—大å°\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL段大å°\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 最大标识符长度\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " 最大索引列数\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 最大TOASTå—大å°\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " 大对象å—大å°\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " 日期/时间是整数?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " æ•°æ®æ ¡éªŒå’Œç‰ˆæœ¬\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "没有所需的控制信æ¯ï¼Œæ— æ³•ç»§ç»­ï¼Œæ­£åœ¨ç»ˆæ­¢\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"æ–°æ—§pg_controldata对é½æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+"å¯èƒ½ä¸€ä¸ªé›†ç¾¤æ˜¯32ä½å®‰è£…,å¦ä¸€ä¸ªæ˜¯64ä½å®‰è£…\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "æ–°æ—§pg_controldataå—大å°æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "æ–°æ—§pg controldata最大关系段大å°æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "æ–°æ—§pg_controldata WALå—大å°æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "æ–°æ—§pg_controldata WAL段大å°æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "æ–°æ—§pg_controldata最大标识符长度无效或ä¸åŒ¹é…\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "æ–°æ—§pg_controldata最大索引列无效或ä¸åŒ¹é…\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "æ–°æ—§pg_controldata最大TOASTå—大å°æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "旧的和新的pg_controldata大对象å—大å°æ— æ•ˆæˆ–ä¸åŒ¹é…\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "新的和旧的pg_controldata日期/时间存储类型ä¸åŒ¹é…\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "旧群集ä¸ä½¿ç”¨æ•°æ®æ ¡éªŒå’Œï¼Œä½†æ–°ç¾¤é›†ä½¿ç”¨æ•°æ®æ ¡éªŒå’Œ\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "旧群集使用数æ®æ ¡éªŒå’Œï¼Œä½†æ–°ç¾¤é›†ä¸ä½¿ç”¨\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "旧群集和新群集pg_controldata校验和版本ä¸åŒ¹é…\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "å‘旧的global/pg_control添加\".old\"åŽç¼€"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "无法将%sé‡å‘½å为%s。\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"如果è¦å¯åŠ¨æ—§ç¾¤é›†ï¼Œåˆ™éœ€è¦ä»Ž%s/global/pg_control.old中\n"
+"删除\".old\"åŽç¼€ã€‚\n"
+"由于使用了\"link\"模å¼ï¼Œä¸€æ—¦æ–°ç¾¤é›†å¯åŠ¨ï¼Œ\n"
+"旧群集就无法安全å¯åŠ¨ã€‚\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "正在创建全局对象的转储"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "正在创建数æ®åº“schemas的转储\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "无法使用using %s获å–pg_ctl的版本数æ®: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "无法从%s获å–pg_ctl版本输出\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "命令太长了\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+msgid "could not open log file \"%s\": %m\n"
+msgstr "无法打开日志文件\"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失败*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "执行\"%s\"时出现问题\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的å¯èƒ½åŽŸå› ï¼Œè¯·æŸ¥é˜…\"%s\"或 \"%s\"的最åŽå‡ è¡Œã€‚\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的å¯èƒ½åŽŸå› ï¼Œè¯·æŸ¥é˜…\"%s\"的最åŽå‡ è¡Œã€‚\n"
+
+#: exec.c:205 option.c:226
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "ä¸èƒ½å†™åˆ°æ—¥å¿—文件\"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "无法打开文件\"%s\"用于读å–: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "您必须具有当å‰ç›®å½•ä¸­çš„读写æƒé™ã€‚\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "检查\"%s\"失败: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\"ä¸æ˜¯ä¸€ä¸ªç›®å½•\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "检查\"%s\"失败:ä¸æ˜¯å¸¸è§„文件\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "检查\"%s\"失败:无法执行(æƒé™è¢«æ‹’ç»ï¼‰\n"
+
+#: exec.c:439
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "检查\"%s\"失败:无法执行\n"
+
+#: exec.c:449
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "检查\"%s\"失败:版本ä¸æ­£ç¡®ï¼šæ‰¾åˆ°\"%s\",应为\"%s\"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "克隆关系\"%s.%s\"时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "å¤åˆ¶å…³ç³»\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "å¤åˆ¶å…³ç³»\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "å¤åˆ¶å…³ç³»\"%s.%s\"时出错:无法读å–文件\"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "å¤åˆ¶å…³ç³»\"%s.%s\"时出错:无法写入文件 \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "将关系\"%s.%s\"(\"%s\"å¤åˆ¶åˆ°\"%s\")时出错: %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "为关系\"%s.%s\"创建链接时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "å¤åˆ¶å…³ç³»\"%s.%s\"时出错:无法统计文件\"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "å¤åˆ¶å…³ç³»\"%s.%s\"时出错:在文件\"%s\"中找到部分页\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "无法在新旧数æ®ç›®å½•ä¹‹é—´å…‹éš†æ–‡ä»¶: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "无法创建文件 \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "此平å°ä¸æ”¯æŒæ–‡ä»¶å…‹éš†\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"无法在新旧数æ®ç›®å½•ä¹‹é—´åˆ›å»ºç¡¬é“¾æŽ¥: %s\n"
+"在链接模å¼ä¸‹ï¼Œæ—§çš„和新的数æ®ç›®å½•å¿…须在åŒä¸€æ–‡ä»¶ç³»ç»Ÿä¸Šã€‚\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The old cluster has a \"plpython_call_handler\" function defined\n"
+"in the \"public\" schema which is a duplicate of the one defined\n"
+"in the \"pg_catalog\" schema. You can confirm this by executing\n"
+"in psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"The \"public\" schema version of this function was created by a\n"
+"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
+"to complete because it references a now-obsolete \"plpython\"\n"
+"shared object file. You can remove the \"public\" schema version\n"
+"of this function by running the following command:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"in each affected database:\n"
+"\n"
+msgstr ""
+"\n"
+"旧集群在\"public\"模å¼ä¸­å®šä¹‰äº†ä¸€ä¸ª\"plpython_call_handler\"函数,\n"
+"这是\"pg_catalog\"模å¼ä¸­å®šä¹‰çš„函数的副本。\n"
+" 您å¯ä»¥é€šè¿‡æ‰§è¡Œ\n"
+"在 psql中:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"这个函数的\"public\"模å¼ç‰ˆæœ¬æ˜¯ç”±plpythonçš„8.1之å‰çš„安装创建的, \n"
+"必须删除æ‰èƒ½å®Œæˆpg_upgrade\n"
+"因为它引用了一个现在已ç»è¿‡æ—¶çš„\"plpython\"共享对象文件。\n"
+"通过è¿è¡Œä»¥ä¸‹å‘½ä»¤ï¼Œå¯ä»¥åˆ é™¤æ­¤å‡½æ•°çš„\"public\"模å¼ç‰ˆæœ¬:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"在æ¯ä¸ªå—å½±å“çš„æ•°æ®åº“中:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "从旧群集中删除问题函数以继续。\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "正在检查是å¦å­˜åœ¨æ‰€éœ€çš„库"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "无法加载库 \"%s\": %s"
+
+#: function.c:253
+msgid "In database: %s\n"
+msgstr "在数æ®åº“: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装引用了新安装中缺少的å¯åŠ è½½åº“。\n"
+"您å¯ä»¥å°†è¿™äº›åº“添加到新安装中,或者从旧安装中删除使用它们的函数。\n"
+"文件中有问题库列表:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "æ•°æ®åº“\"%2$s\"中OID %1$u的关系å称ä¸åŒ¹é…:旧å称 \"%3$s.%4$s\",新å称\"%5$s.%6$s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "未能匹é…æ•°æ®åº“\"%s\"中的新旧表\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 这是\"%s.%s\"上的索引"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 哪一个OID %u上的索引"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " 哪一个是\"%s.%s\"的TOAST表"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 哪一个是OID %u的TOAST表"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "在旧群集中找ä¸åˆ°ä¸Žæ•°æ®åº“\"%2$s\"中OID %1$u的新关系的匹é…项: %3$s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "在新群集中找ä¸åˆ°ä¸Žæ•°æ®åº“\"%2$s\"中OID %1$u的旧关系的匹é…项:%3$s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "映射为数æ®åº“\"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u到%u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"æºæ•°æ®åº“:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"目标数æ®åº“:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "æ•°æ®åº“: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: ä¸èƒ½ä½¿ç”¨root用户è¿è¡Œ\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "旧端å£å·æ— æ•ˆ\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "新端å£å·æ— æ•ˆ\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: option.c:214
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "以详细模å¼è¿è¡Œ\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "旧群集二进制文件驻留"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "新群集二进制文件驻留"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "旧群集数æ®é©»ç•™"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "新群集数æ®é©»ç•™"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "将创建套接字"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "无法确定当å‰ç›®å½•\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "无法从Windows上的新群集数æ®ç›®å½•å†…è¿è¡Œpg_upgrade\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgradeå°†PostgreSQL集群å‡çº§åˆ°å…¶ä»–主版本。\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [选项]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧群集å¯æ‰§è¡Œç›®å½•\n"
+
+#: option.c:293
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新群集å¯æ‰§è¡Œç›®å½•\n"
+" (默认目录与pg_upgrade相åŒ)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 仅检查群集,ä¸æ›´æ”¹ä»»ä½•æ•°æ®\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧群集数æ®ç›®å½•\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新群集数æ®ç›®å½•\n"
+
+#: option.c:298
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM è¦åŒæ—¶ä½¿ç”¨çš„进程或线程数\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link 使用硬链接æ¥ä»£æ›¿å°†æ–‡ä»¶æ‹·è´åˆ°æ–°ç¾¤é›†\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS è¦ä¼ é€’到æœåŠ¡å™¨çš„旧群集选项\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS è¦ä¼ é€’到æœåŠ¡å™¨çš„新群集选项\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧群集端å£å·ï¼ˆé»˜è®¤å€¼ä¸º%d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新群集端å£å·ï¼ˆé»˜è®¤å€¼ä¸º%d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain æˆåŠŸåŽä¿ç•™SQL和日志文件\n"
+
+#: option.c:305
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR è¦ä½¿ç”¨çš„套接字目录(默认值为当å‰è·¯å¾„)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME 集群超级用户(默认值为\"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose å¯ç”¨è¯¦ç»†çš„内部日志\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version 显示版本信æ¯ï¼Œç„¶åŽé€€å‡º\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone 克隆而ä¸æ˜¯å°†æ–‡ä»¶å¤åˆ¶åˆ°æ–°ç¾¤é›†\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助,然åŽé€€å‡º\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"在è¿è¡Œpg_upgrade之å‰ï¼Œæ‚¨å¿…é¡» :\n"
+" 创建一个新的数æ®åº“群集 (使用新版本的initdb)\n"
+" 关闭旧群集的postmasteræœåŠ¡\n"
+" 关闭新群集的postmasteræœåŠ¡\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"è¿è¡Œpg_upgrade时,必须æ供以下信æ¯:\n"
+" 旧群集的数æ®ç›®å½• (-d DATADIR)\n"
+" 新群集的数æ®ç›®å½• (-D DATADIR)\n"
+" 旧版本的\"bin\"目录 (-b BINDIR)\n"
+" 新版本的\"bin\"目录 (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"例如:\n"
+" pg_upgrade -d 旧集群/data -D 新集群/data -b 旧集群/bin -B 新集群/bin\n"
+"或者\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=旧集群/data\n"
+" $ export PGDATANEW=新集群/data\n"
+" $ export PGBINOLD=旧集群/bin\n"
+" $ export PGBINNEW=新集群/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=旧集群/data\n"
+" C:\\> set PGDATANEW=新集群/data\n"
+" C:\\> set PGBINOLD=旧集群/bin\n"
+" C:\\> set PGBINNEW=新集群/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"必须标识%s所在的目录。\n"
+"请使用%s命令行选项或%s环境å˜é‡ã€‚\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "正在查找æºç¾¤é›†çš„实际数æ®ç›®å½•"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "正在查找目标群集的实际数æ®ç›®å½•"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "无法使用%s获å–æ•°æ®ç›®å½•: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "无法从文件\"%2$s\"读å–第%1$dè¡Œ: %3$s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "用户æ供的旧端å£å·%hu已更正为%hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "无法创建工作进程: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "无法创建工作线程: %s\n"
+
+#: parallel.c:300
+msgid "%s() failed: %s\n"
+msgstr "%s()失败: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "å­è¿›ç¨‹å¼‚å¸¸é€€å‡ºï¼šçŠ¶æ€ %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "å­å·¥ä½œçº¿ç¨‹å¼‚常退出: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "无法读å–目录\"%s\"çš„æƒé™: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"正在执行å‡çº§\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "为新群集设置下一个OID"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "将数æ®ç›®å½•åŒæ­¥åˆ°ç£ç›˜"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"å‡çº§å®Œæˆ\n"
+"----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好åƒæœ‰ä¸€ä¸ªpostmaster正在为旧群集æœåŠ¡ã€‚\n"
+"请关闭那个postmaster,然åŽå†è¯•ä¸€æ¬¡ã€‚\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好åƒæœ‰ä¸€ä¸ªpostmaster正在为新群集æœåŠ¡ã€‚\n"
+"请关闭那个postmaster,然åŽå†è¯•ä¸€æ¬¡ã€‚\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "正在分æžæ–°ç¾¤é›†ä¸­çš„所有行"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "正在冻结新群集中的所有行"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "正在在新群集中还原全局对象"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "在新群集中还原数æ®åº“schemas\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "正在从新%s中删除文件"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "无法删除目录\"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "正在将旧的 %så¤åˆ¶åˆ°æ–°æœåŠ¡ä¸­"
+
+#: pg_upgrade.c:470
+msgid "Setting oldest XID for new cluster"
+msgstr "为新群集设置最旧的XID"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "正在为新集群设置下一个事务ID和epoch"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "正在为新集群设置下一个多事务IDå’Œå移é‡"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "在新集群中设置最旧的多事务ID"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "正在é‡ç½®WALå½’æ¡£"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "正在在新集群中设置frozenxid和minmxid计数器"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "正在在新群集中设置minmxid计数器"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "正在克隆用户关系文件\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "正在å¤åˆ¶ç”¨æˆ·å…³ç³»æ–‡ä»¶\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "正在链接用户关系文件\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "在新群集中找ä¸åˆ°æ—§æ•°æ®åº“\"%s\"\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "检查文件是å¦å­˜åœ¨\"%s.%s\"时出错 (\"%s\" 到 \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"é‡å†™ä¸º\"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"克隆到\"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"å¤åˆ¶åˆ°\"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "正在将\"%s\"链接到\"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "故障,退出\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "正在执行: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL命令失败 \n"
+"%s\n"
+"%s"
+
+#: server.c:168
+msgid "could not open version file \"%s\": %m\n"
+msgstr "无法打开版本文件\"%s\": %m\n"
+
+#: server.c:172
+msgid "could not parse version file \"%s\"\n"
+msgstr "无法解æžç‰ˆæœ¬æ–‡ä»¶\"%s\"\n"
+
+#: server.c:298
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令å¯åŠ¨çš„æºpostmaster :\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令å¯åŠ¨çš„目标postmaster :\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl无法å¯åŠ¨æºæœåŠ¡å™¨ï¼Œæˆ–者连接失败\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl无法å¯åŠ¨ç›®æ ‡æœåŠ¡å™¨ï¼Œæˆ–连接失败\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq环境å˜é‡%s具有éžæœ¬åœ°æœåŠ¡å™¨å€¼: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"使用表空间时无法å‡çº§åˆ°ç›¸åŒçš„系统目录版本。\n"
+"或者,使用表空间时无法从åŒä¸€ç³»ç»Ÿç›®å½•ç‰ˆæœ¬å‡çº§ã€‚\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "表空间目录\"%s\"ä¸å­˜åœ¨\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "无法统计表空间目录\"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "表空间路径\"%s\"ä¸æ˜¯ç›®å½•\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "æˆåŠŸ"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "正在检查大对象"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包å«å¤§å¯¹è±¡ã€‚æ–°æ•°æ®åº“有一个附加的大对象æƒé™è¡¨ã€‚\n"
+"å‡çº§åŽï¼Œå°†å‘您æ供一个命令,以使用默认æƒé™å¡«å……\n"
+"pg_largeobject_metadata表。\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包å«å¤§å¯¹è±¡ã€‚ æ–°æ•°æ®åº“有一个附加的大对象æƒé™è¡¨ï¼Œ\n"
+"因此必须为所有大对象定义默认æƒé™ã€‚文件\n"
+" %s\n"
+"当数æ®åº“ç”±psql执行时,超级用户将设置默认æƒé™ã€‚\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "正在检查ä¸å…¼å®¹çš„\"line\"æ•°æ®ç±»åž‹"
+
+#: version.c:279
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·è¡¨ä¸­çš„\"line\"æ•°æ®ç±»åž‹ã€‚\n"
+"此数æ®ç±»åž‹æ›´æ”¹äº†æ—§ç¾¤é›†å’Œæ–°ç¾¤é›†ä¹‹é—´çš„\n"
+"内部格å¼å’Œè¾“å…¥/输出格å¼ï¼Œ\n"
+"因此当å‰æ— æ³•å‡çº§æ­¤ç¾¤é›†ã€‚\n"
+"您å¯ä»¥åˆ é™¤é—®é¢˜è¡¨å¹¶é‡æ–°å¯åŠ¨å‡çº§ã€‚\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "正在检查无效的\"unknown\"用户列"
+
+#: version.c:317
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·è¡¨ä¸­çš„\"unknown\"æ•°æ®ç±»åž‹ã€‚\n"
+"表中ä¸å†å…许此数æ®ç±»åž‹ï¼Œ\n"
+"因此当å‰æ— æ³•å‡çº§æ­¤ç¾¤é›†ã€‚\n"
+"您å¯ä»¥åˆ é™¤é—®é¢˜è¡¨å¹¶é‡æ–°å¯åŠ¨å‡çº§ã€‚\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "正在检查哈希索引"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包å«å“ˆå¸Œç´¢å¼•ã€‚\n"
+"这些索引在旧集群和新集群之间具有ä¸åŒçš„内部格å¼ï¼Œå› æ­¤å¿…é¡»\n"
+"使用REINDEX命令é‡æ–°ç´¢å¼•å®ƒä»¬ã€‚\n"
+"å‡çº§åŽï¼Œæ‚¨å°†å¾—到REINDEX指令。\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包å«å“ˆå¸Œç´¢å¼•. These indexes have different\n"
+"这些索引在旧集群和新集群之间具有ä¸åŒçš„内部格å¼ï¼Œ\n"
+"因此必须使用REINDEX命令é‡æ–°ç´¢å¼•å®ƒä»¬ã€‚ 文件\n"
+" %s\n"
+"当数æ®åº“超级用户通过psql执行时,将é‡æ–°åˆ›å»ºæ‰€æœ‰æ— æ•ˆçš„索引;\n"
+"在此之å‰ï¼Œä¸ä¼šä½¿ç”¨è¿™äº›ç´¢å¼•ã€‚\n"
+"\n"
+
+#: version.c:453
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "正在检查无效的\"sql_identifier\"用户列"
+
+#: version.c:461
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包å«ç”¨æˆ·è¡¨ä¸­çš„\"sql_identifier\"æ•°æ®ç±»åž‹ã€‚\n"
+"此数æ®ç±»åž‹çš„ç£ç›˜æ ¼å¼å·²æ›´æ”¹ã€‚\n"
+"因此当å‰æ— æ³•å‡çº§æ­¤ç¾¤é›†ã€‚\n"
+"您å¯ä»¥åˆ é™¤é—®é¢˜è¡¨å¹¶é‡æ–°å¯åŠ¨å‡çº§ã€‚\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+msgid "Checking for extension updates"
+msgstr "正在检查扩展更新"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "通知"
+
+#: version.c:538
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包å«åº”使用\n"
+"ALTER EXTENSION命令更新的扩展。 文件\n"
+" %s\n"
+"当数æ®åº“超级用户通过psql执行时,\n"
+"将更新这些扩展。\n"
+"\n"
+
diff --git a/src/bin/pg_upgrade/po/zh_TW.po b/src/bin/pg_upgrade/po/zh_TW.po
new file mode 100644
index 0000000..872dec7
--- /dev/null
+++ b/src/bin/pg_upgrade/po/zh_TW.po
@@ -0,0 +1,1805 @@
+# Traditional Chinese message translation file for pg_upgrade
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-08 21:49+0000\n"
+"PO-Revision-Date: 2023-11-06 08:50+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+#: check.c:69
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"在舊的伺æœå™¨ä¸ŠåŸ·è¡Œä¸€è‡´æ€§æª¢æŸ¥\n"
+"------------------------------------------------"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"執行一致性檢查\n"
+"-----------------------------"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*å¢é›†ç›¸å®¹*"
+
+#: check.c:229
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"如果 pg_upgrade 在這個階段後失敗,您必須執行 initdb å†æ¬¡\n"
+"建立新å¢é›†æ‰èƒ½ç¹¼çºŒã€‚"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"pg_upgrade ä¸æœƒè½‰ç§»å„ªåŒ–器統計資料。\n"
+"啟動新伺æœå™¨ä¹‹å¾Œè«‹è€ƒæ…®åŸ·è¡Œ:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:276
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"執行此腳本將刪除舊å¢é›†çš„資料檔:\n"
+" %s"
+
+#: check.c:281
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"無法建立用來刪除舊å¢é›†è³‡æ–™æª”的腳本。\n"
+"因為在舊å¢é›†ç›®éŒ„中存在使用者定義的表空間或新å¢é›†çš„資料目錄。\n"
+"必須手動刪除舊å¢é›†çš„內容。"
+
+#: check.c:293
+#, c-format
+msgid "Checking cluster versions"
+msgstr "檢查å¢é›†ç‰ˆæœ¬"
+
+#: check.c:305
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "本工具åªèƒ½å¾ž PostgreSQL 版本 %s åŠæ›´æ–°çš„版本å‡ç´šã€‚"
+
+#: check.c:310
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "本工具åªèƒ½å‡ç´šè‡³ PostgreSQL 版本 %s。"
+
+#: check.c:319
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "本工具無法用於é™ç´šè‡³è¼ƒèˆŠçš„ä¸»è¦ PostgreSQL 版本。"
+
+#: check.c:324
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "舊å¢é›†çš„資料和執行檔目錄來自ä¸åŒçš„主è¦ç‰ˆæœ¬ã€‚"
+
+#: check.c:327
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "æ–°å¢é›†çš„資料和執行檔目錄來自ä¸åŒçš„主è¦ç‰ˆæœ¬ã€‚"
+
+#: check.c:342
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "檢查伺æœå™¨æ™‚,新舊連接埠必須ä¸åŒã€‚"
+
+#: check.c:362
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "æ–°å¢é›†è³‡æ–™åº« \"%s\" ä¸æ˜¯ç©ºçš„: 找到 relation \"%s.%s\""
+
+#: check.c:385
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "檢查新å¢é›†çš„表空間目錄"
+
+#: check.c:396
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "æ–°å¢é›†çš„表空間目錄已存在: \"%s\""
+
+#: check.c:429
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: 新的資料目錄ä¸æ‡‰è©²ä½æ–¼èˆŠçš„è³‡æ–™ç›®éŒ„å…§ï¼Œå³ %s"
+
+#: check.c:453
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: 使用者定義的表空間ä½ç½®ä¸æ‡‰è©²ä½æ–¼è³‡æ–™ç›®éŒ„å…§ï¼Œå³ %s"
+
+#: check.c:463
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "建立刪除舊å¢é›†çš„腳本"
+
+# fe-lobj.c:410
+# fe-lobj.c:495
+#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056
+#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "無法開啟檔案 \"%s\":%s"
+
+#: check.c:517
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "無法將執行權é™åŠ åˆ°æª”案 \"%s\": %s"
+
+#: check.c:537
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "檢查資料庫使用者是å¦ç‚ºå®‰è£ä½¿ç”¨è€…"
+
+#: check.c:553
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "資料庫使用者 \"%s\" ä¸æ˜¯å®‰è£ä½¿ç”¨è€…"
+
+#: check.c:564
+#, c-format
+msgid "could not determine the number of users"
+msgstr "無法確定使用者數é‡"
+
+#: check.c:572
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "åªæœ‰å®‰è£ä½¿ç”¨è€…能在新å¢é›†ä¸­è¢«å®šç¾©ã€‚"
+
+#: check.c:601
+#, c-format
+msgid "Checking database connection settings"
+msgstr "檢查資料庫連線設定"
+
+#: check.c:627
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 ä¸å…許連線,å³å…¶ pg_database.datallowconn 必須為 false"
+
+#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135
+#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394
+#: function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:655
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"æ‰€æœ‰éž template0 的資料庫必須å…許連線,å³å®ƒå€‘çš„\n"
+"pg_database.datallowconn 必須為 true。您的安è£ä¸­åŒ…å«äº†è¨­å®šç‚º false çš„\n"
+"éž template0 資料庫。請考慮å…è¨±æ‰€æœ‰éž template0 資料庫的連線,或刪除\n"
+"ä¸å…許連線的資料庫。異常資料庫的清單在下列檔案中:\n"
+" %s"
+
+#: check.c:680
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "檢查已é å‚™çš„交易"
+
+#: check.c:689
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "來æºå¢é›†åŒ…å«å·²é å‚™çš„交易"
+
+#: check.c:691
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "目標å¢é›†åŒ…å«å·²é å‚™çš„交易"
+
+#: check.c:716
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "檢查 contrib/isn å‚³éž bigint æ–¹å¼ä¸ä¸€è‡´"
+
+#: check.c:776
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«ä¾è³´æ–¼ bigint 資料型別的 \"contrib/isn\" 函數。由於您的\n"
+"æ–°ã€èˆŠå¢é›†ä»¥ä¸åŒæ–¹å¼å‚³éž bigint 值,因此目å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您\n"
+"å¯ä»¥æ‰‹å‹•å‚™ä»½ä¸¦åˆªé™¤èˆŠå¢é›†ä¸­ä½¿ç”¨ \"contrib/isn\" 功能的資料庫,進行\n"
+"å‡ç´šï¼Œç„¶å¾Œé‚„原它們。å•é¡Œå‡½æ•¸çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:798
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "檢查使用者定義的後綴é‹ç®—符"
+
+#: check.c:874
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«ä¸å†æ”¯æ´çš„使用者定義後綴é‹ç®—符,請考慮刪除後綴é‹ç®—符\n"
+"並替æ›ç‚ºå‰ç¶´é‹ç®—符或函數呼å«ã€‚\n"
+"使用者定義後綴é‹ç®—符的清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:898
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "檢查ä¸ç›¸å®¹çš„多型函數"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«åƒè€ƒå…§éƒ¨å¤šåž‹å‡½æ•¸çš„使用者定義物件,其引數類型為\n"
+"\"anyarray\" 或 \"anyelement\"。這些使用者定義物件必須在å‡ç´šä¹‹å‰\n"
+"刪除,å‡ç´šä¹‹å¾Œå†é‚„原,並將它們改為åƒè€ƒæ–°çš„å°æ‡‰å‡½æ•¸ï¼Œå…¶å¼•æ•¸é¡ž\n"
+"型為 \"anycompatiblearray\" 和 \"anycompatible\"。\n"
+"å•é¡Œç‰©ä»¶çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "檢查資料表 WITH OIDS"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«å®£å‘Š WITH OIDS 的資料表,但這已ä¸å†å—支æ´ã€‚請考慮\n"
+"使用以下方法移除 oid 欄ä½\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"å•é¡Œè³‡æ–™è¡¨çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:1105
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "檢查使用者資料表中的系統定義複åˆåž‹åˆ¥"
+
+#: check.c:1136
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£ä¸­åŒ…å«ä½¿ç”¨è€…資料表中的系統定義複åˆåž‹åˆ¥ã€‚這些型別的 OID 在\n"
+"ä¸åŒçš„ PostgreSQL 版本中ä¸ç©©å®šï¼Œå› æ­¤ç›®å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤\n"
+"有å•é¡Œçš„欄ä½ï¼Œç„¶å¾Œé‡æ–°é–‹å§‹å‡ç´šã€‚\n"
+"å•é¡Œæ¬„ä½çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "檢查使用者資料表中有無 reg* 資料型別"
+
+#: check.c:1197
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£ä¸­åœ¨ä½¿ç”¨è€…資料表中包å«äº† reg* 資料型別,這些資料型別\n"
+"åƒç…§äº†ç³»çµ± OID,而這些 OID 並ä¸æœƒè¢« pg_upgrade ä¿ç•™ï¼Œå› æ­¤ç›®\n"
+"å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤æœ‰å•é¡Œçš„欄ä½ä¸¦é‡æ–°é€²è¡Œå‡ç´šã€‚\n"
+"å•é¡Œæ¬„ä½çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:1218
+#, c-format
+msgid "Checking for incompatible \"aclitem\" data type in user tables"
+msgstr "檢查使用者資料表中有無ä¸ç›¸å®¹çš„ \"aclitem\" 資料型別"
+
+#: check.c:1225
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£ä¸­åœ¨ä½¿ç”¨è€…資料表中包å«äº† \"aclitem\" 資料型別。由於\n"
+"PostgreSQL 版本 16 中 \"aclitem\" 的內部格å¼å·²æ›´æ”¹ï¼Œå› æ­¤ç›®å‰ç„¡æ³•\n"
+"å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤å•é¡Œæ¬„ä½ï¼Œç„¶å¾Œé‡æ–°é€²è¡Œå‡ç´šã€‚\n"
+"å•é¡Œæ¬„ä½çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:1246
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "檢查ä¸ç›¸å®¹çš„ \"jsonb\" 資料型別"
+
+#: check.c:1255
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£ä¸­åœ¨ä½¿ç”¨è€…表格中包å«äº† \"jsonb\" 資料型別。\n"
+"\"jsonb\" 的內部格å¼åœ¨ 9.4 beta 期間有所更改,因此目å‰ç„¡æ³•\n"
+"å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤æœ‰å•é¡Œçš„欄ä½ï¼Œç„¶å¾Œé‡æ–°é€²è¡Œå‡ç´šã€‚\n"
+"å•é¡Œæ¬„ä½çš„清單在以下檔案中:\n"
+" %s"
+
+#: check.c:1282
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "檢查以 \"pg_\" 開頭的角色"
+
+#: check.c:1314
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«ä»¥ \"pg_\" 開頭的角色,\"pg_\" 是系統角色的\n"
+"ä¿ç•™å­—首,在這些角色被é‡æ–°å‘½å之å‰ï¼Œç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚\n"
+"以 \"pg_\" 開頭的角色列表ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: check.c:1334
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "檢查使用者自訂的編碼轉æ›"
+
+#: check.c:1395
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«äº†ä½¿ç”¨è€…自定義的編碼轉æ›ï¼Œç”±æ–¼è½‰æ›å‡½æ•¸çš„åƒæ•¸åœ¨\n"
+"PostgreSQL 版本 14 中有所更改,因此目å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥\n"
+"移除舊å¢é›†ä¸­çš„編碼轉æ›ï¼Œç„¶å¾Œé‡æ–°é€²è¡Œå‡ç´šã€‚\n"
+"使用者自定義的編碼轉æ›åˆ—表ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "無法用 %s å–得控制資料: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: 資料庫å¢é›†ç‹€æ…‹å•é¡Œ"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "來æºå¢é›†åœ¨å¾©åŽŸæ¨¡å¼ä¸‹è¢«é—œé–‰ã€‚è‹¥è¦é€²è¡Œå‡ç´šï¼Œè«‹ä¾ç…§æ–‡ä»¶ä½¿ç”¨ \"rsync\",或者將其作為主è¦æ¨¡å¼é—œé–‰ã€‚"
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "目標å¢é›†åœ¨å¾©åŽŸæ¨¡å¼ä¸‹è¢«é—œé–‰ã€‚è‹¥è¦é€²è¡Œå‡ç´šï¼Œè«‹ä¾ç…§æ–‡ä»¶ä½¿ç”¨ \"rsync\",或者將其作為主è¦æ¨¡å¼é—œé–‰ã€‚"
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "來æºå¢é›†æœªä¹¾æ·¨åœ°é—œé–‰ã€‚"
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "目標å¢é›†æœªä¹¾æ·¨åœ°é—œé–‰ã€‚"
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "來æºå¢é›†ç¼ºå°‘å¢é›†ç‹€æ…‹è³‡è¨Š:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "目標å¢é›†ç¼ºå°‘å¢é›†ç‹€æ…‹è³‡è¨Š:"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal å•é¡Œ"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: controldata å–å¾—å•é¡Œ"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "來æºå¢é›†ç¼ºå°‘一些必è¦çš„控制資訊:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "目標å¢é›†ç¼ºå°‘一些必è¦çš„控制資訊:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " 檢查點下一個 XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " 最新檢查點下一個 OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " 最新檢查點下一個 MultiXactID"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " 最新檢查點最早 MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " 最新檢查點最早 XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " 最新檢查點下一個 MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " é‡è¨­å¾Œç¬¬ä¸€å€‹ WAL 片段"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 引數傳éžæ–¹å¼"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " 最大å°é½Šå€¼"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " å€å¡Šå¤§å°"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " 大型 relation 片段大å°"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL å€å¡Šå¤§å°"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL 片段大å°"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " 最大識別å稱長度"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " 最大索引欄ä½æ•¸"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " TOAST 塊大å°ä¸Šé™"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " 大物件塊大å°"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " 時間/日期是整數?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " 資料檢查碼版本"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "å› å¿…è¦çš„控制信æ¯ä¸è¶³è€Œç„¡æ³•ç¹¼çºŒï¼Œçµ‚止中"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"新舊 pg_controldata å°é½Šæ–¹å¼ç„¡æ•ˆæˆ–ä¸ä¸€è‡´ã€‚\n"
+"很å¯èƒ½å…¶ä¸­ä¸€å€‹å¢é›†æ˜¯ 32 ä½å…ƒï¼Œè€Œå¦ä¸€å€‹æ˜¯ 64 ä½å…ƒ"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "新舊 pg_controldata å€å¡Šå¤§å°ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 最大 relation 片段大å°ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "新舊 pg_controldata WAL å€å¡Šå¤§å°ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "新舊 pg_controldata WAL 片段大å°ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "新舊 pg_controldata 最大識別å稱長度無效或ä¸ä¸€è‡´"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "新舊 pg_controldata 最大索引欄ä½æ•¸ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 最大 TOAST 塊大å°ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 大物件塊大å°ç„¡æ•ˆæˆ–ä¸ä¸€è‡´"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "新舊 pg_controldata 日期/時間儲存類型ä¸ä¸€è‡´"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "舊的å¢é›†ä¸ä½¿ç”¨è³‡æ–™æª¢æŸ¥ç¢¼ï¼Œä½†æ–°çš„å¢é›†æœ‰ç”¨"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "舊的å¢é›†ä½¿ç”¨è³‡æ–™æª¢æŸ¥ç¢¼ï¼Œä½†æ–°çš„å¢é›†ä¸ä½¿ç”¨"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "æ–°ã€èˆŠå¢é›† pg_controldata 檢查碼版本ä¸ä¸€è‡´"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "將 \".old\" 後綴加到 global/pg_control"
+
+# access/transam/xlog.c:3037 access/transam/xlog.c:3819
+# access/transam/xlog.c:3862 commands/user.c:282 commands/user.c:412
+# postmaster/pgarch.c:597
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "無法將檔案\"%s\"é‡æ–°å‘½å為\"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"如果您想啟動舊的å¢é›†ï¼Œæ‚¨éœ€è¦å¾ž %s/global/pg_control.old 中\n"
+"刪除 \".old\" 後綴。因為使用了 \"link\" 模å¼ï¼Œä¸€æ—¦æ–°çš„å¢é›†å·²ç¶“啟動,\n"
+"å°±ä¸èƒ½å®‰å…¨åœ°å•Ÿå‹•èˆŠçš„å¢é›†ã€‚"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "建立全域物件的備份"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "建立資料庫 schema 的備份"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "無法用 %s å–å¾— pg_ctl 版本資料: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "無法從 %s å–å¾— pg_ctl 版本輸出"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "命令太長"
+
+# utils/init/miscinit.c:533
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "無法開啟日誌檔 \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失敗*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "執行 \"%s\" 時發生å•é¡Œ"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"請查看 \"%s\" 或 \"%s\" 的最後幾行,尋找å¯èƒ½\n"
+"導致失敗的原因。"
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"請查看 \"%s\" 最後幾行,尋找å¯èƒ½\n"
+"導致失敗的原因。"
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "無法寫入記錄檔 \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "無法開啟檔案 \"%s\" 進行讀å–: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "您必須有目å‰ç›®éŒ„的讀å–和寫入權é™ã€‚"
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "檢查 \"%s\" 失敗: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" ä¸æ˜¯ç›®éŒ„"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "檢查 \"%s\" 失敗: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "檢查 \"%s\" 失敗: 無法執行"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "檢查 \"%s\" 失敗: 版本ä¸æ­£ç¢º: 找到 \"%s\",é æœŸæ˜¯ \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "clone relation \"%s.%s\"(\"%s\" 至 \"%s\")時發生錯誤: %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "clone relation \"%s.%s\" 時發生錯誤: 無法開啟檔案 \"%s\": %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "clone relation \"%s.%s\" 時發生錯誤: 無法建立檔案 \"%s\": %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法開啟檔案 \"%s\": %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法建立檔案 \"%s\": %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法讀å–檔案 \"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法寫入檔案 \"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "複製 relation \"%s.%s\"(\"%s\" 至 \"%s\")時發生錯誤: %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "建立 relation \"%s.%s\" 的連çµæ™‚發生錯誤(\"%s\" 至 \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "è¤‡è£½é—œè¯ \"%s.%s\" 時發生錯誤: 無法å–得檔案 \"%s\" 的狀態: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 在檔案 \"%s\" 中找到部分é é¢"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "無法在舊和新的資料目錄之間 clone 檔案: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "無法建立檔案 \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "此平臺ä¸æ”¯æ´ clone 檔案"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"無法在舊資料目錄和新資料目錄之間建立硬連çµ: %s\n"
+"在 link 模å¼ï¼ŒèˆŠè³‡æ–™ç›®éŒ„和新資料目錄必須ä½æ–¼ç›¸åŒçš„檔案系統。"
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "檢查必è¦ç¨‹å¼åº«æ˜¯å¦å­˜åœ¨"
+
+# utils/fmgr/dfmgr.c:145
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "無法載入程å¼åº«\"%s\": %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "在資料庫中: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åƒè€ƒäº†åœ¨æ–°å®‰è£ä¸­æ²’有的å¯è¼‰å…¥ç¨‹å¼åº«ã€‚您å¯ä»¥å°‡é€™äº›ç¨‹å¼åº«æ–°å¢žè‡³\n"
+"新安è£ï¼Œæˆ–從舊安è£ä¸­åˆªé™¤ä½¿ç”¨å®ƒå€‘的函數。\n"
+"å•é¡Œç¨‹å¼åº«çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "OID %u çš„é—œè¯å稱在資料庫 %s 中ä¸ä¸€è‡´: 舊å稱 \"%s.%s\",新å稱 \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "無法在資料庫 \"%s\" 中å°æ‡‰æ–°ã€èˆŠè³‡æ–™è¡¨"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 是 \"%s.%s\" 的索引"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 是 OID %u 的索引"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " 是 \"%s.%s\" 的 TOAST 資料表"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 是 OID %u 的 TOAST 資料表"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "無法在舊å¢é›†ä¸­ç‚º OID 為 %u çš„æ–°é—œè¯æ‰¾åˆ°å°æ‡‰ï¼Œè³‡æ–™åº« \"%s\": %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "無法在新å¢é›†ä¸­ç‚º OID 為 %u 的舊關è¯æ‰¾åˆ°å°æ‡‰ï¼Œè³‡æ–™åº« \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"來æºè³‡æ–™åº«:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"目標資料庫:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "找ä¸åˆ° template0"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "資料庫: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: ä¸èƒ½ä»¥ root 身份執行"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "舊連接埠無效"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "新連接埠無效"
+
+# postmaster/postmaster.c:512 postmaster/postmaster.c:525
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "用 \"%s --help\" å–得更多資訊。\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個個是 \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "以詳細模å¼åŸ·è¡Œ"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "舊å¢é›†åŸ·è¡Œæª”所在"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "æ–°å¢é›†åŸ·è¡Œæª”所在"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "舊å¢é›†è³‡æ–™æ‰€åœ¨"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "æ–°å¢é›†è³‡æ–™æ‰€åœ¨"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "將建立 socket"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "無法確定目å‰ç›®éŒ„"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "在 Windows 上無法在新å¢é›†çš„資料目錄內執行 pg_upgrade"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade å°‡ PostgreSQL å¢é›†å‡ç´šåˆ°ä¸åŒçš„主è¦ç‰ˆæœ¬ã€‚\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "é¸é …: \n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 舊å¢é›†åŸ·è¡Œæª”目錄\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr " -B, --new-bindir=BINDIR æ–°å¢é›†åŸ·è¡Œæª”目錄(é è¨­èˆ‡ pg_upgrade 相åŒç›®éŒ„)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check åªæª¢æŸ¥å¢é›†ï¼Œä¸è®Šæ›´ä»»ä½•è³‡æ–™\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 舊å¢é›†è³‡æ–™ç›®éŒ„\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR æ–°å¢é›†è³‡æ–™ç›®éŒ„\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM åŒæ™‚使用的行程或執行緒數目\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link 連çµæª”案至新å¢é›†ï¼Œè€Œéžè¤‡è£½\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS 傳éžçµ¦ä¼ºæœå™¨çš„舊å¢é›†é¸é …\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS 傳éžçµ¦ä¼ºæœå™¨çš„æ–°å¢é›†é¸é …\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 舊å¢é›†é€£æŽ¥åŸ (é è¨­ %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT æ–°å¢é›†é€£æŽ¥åŸ (é è¨­ %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain 在æˆåŠŸå¾Œä¿ç•™ SQL 和日誌檔案\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR 使用的 socket 目錄(é è¨­ç‚ºç›®å‰ç›®éŒ„)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME å¢é›†è¶…級使用者(é è¨­ç‚º \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 啟動詳細的內部記錄\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clone 檔案至新å¢é›†è€Œéžè¤‡è£½\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy 複製檔案至新å¢é›†(é è¨­)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"在執行 pg_upgrade 之å‰ï¼Œæ‚¨å¿…é ˆ:\n"
+" 建立一個新的資料庫å¢é›†(使用新版本的 initdb)\n"
+" 關閉舊å¢é›†çš„ postmaster\n"
+" 關閉新å¢é›†çš„ postmaster\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"當您執行 pg_upgrade 時,必須æ供以下資訊:\n"
+" 舊å¢é›†çš„資料目錄(-d DATADIR)\n"
+" æ–°å¢é›†çš„資料目錄(-D DATADIR)\n"
+" 舊版本的 \"bin\" 目錄(-b BINDIR)\n"
+" 新版本的 \"bin\" 目錄(-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"例如:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"或\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網é : <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"您必須確èª%s的目錄ä½ç½®ã€‚\n"
+"請使用 %s 命令列é¸é …或環境變數 %s。"
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "尋找來æºå¢é›†çš„實際資料目錄"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "尋找目標å¢é›†çš„實際資料目錄"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "無法用 %s å–得資料目錄: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "無法從文件 \"%2$s\" 讀å–第 %1$d 行內容: %3$s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "使用者æ供的舊埠號 %hu 已更正為 %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "無法建立工作行程: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "無法建立工作執行緒: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() 失敗: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "å­è¡Œç¨‹ç•°å¸¸çµæŸ: 狀態 %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "工作å­è¡Œç¨‹ç•°å¸¸çµæŸ: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "無法讀å–目錄 \"%s\" 的權é™: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"進行å‡ç´š\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "設定新å¢é›†çš„下一個 OID"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "åŒæ­¥è³‡æ–™ç›®éŒ„至ç£ç¢Ÿ"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"å‡ç´šå®Œæˆ\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "æ–°å¢é›†çš„目錄路徑太長"
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄\"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: 找ä¸åˆ°è‡ªèº«ç¨‹å¼çš„執行檔"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"似乎有 postmaster 正在使用舊å¢é›†ã€‚\n"
+"請關閉該 postmaster 然後é‡è©¦ã€‚"
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"似乎有 postmaster 正在使用新å¢é›†ã€‚\n"
+"請關閉該 postmaster 然後é‡è©¦ã€‚"
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "設定新å¢é›†çš„å€åŸŸå’Œç·¨ç¢¼"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "分æžæ–°å¢é›†ä¸­çš„所有資料列"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "å‡çµæ–°å¢é›†ä¸­çš„所有資料列"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "還原新å¢é›†ä¸­çš„全域物件"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "還原新å¢é›†ä¸­çš„資料庫 schema"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "從新的 %s 刪除檔案"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "無法刪除目錄 \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "將舊的 %s 複製到新伺æœå™¨"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "為新å¢é›†è¨­å®šæœ€æ—©çš„ XID"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "為新å¢é›†è¨­å®šä¸‹ä¸€å€‹äº¤æ˜“ ID å’Œ epoch"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "為新å¢é›†è¨­å®šä¸‹ä¸€å€‹ multixact ID å’Œ offset"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "為新å¢é›†è¨­å®šæœ€æ—©çš„ multixact ID"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "é‡è¨­ WAL å°å­˜æª”"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "在新å¢é›†ä¸­è¨­å®š frozenxid å’Œ minmxid 計數器"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "在新å¢é›†ä¸­è¨­å®š minmxid 計數器"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clone 使用者 relation 檔"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "複製使用者 relation 檔"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "連çµä½¿ç”¨è€… relation 檔"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "在新å¢é›†ä¸­æ‰¾ä¸åˆ°èˆŠè³‡æ–™åº« \"%s\""
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "檢查檔案存在性時發生錯誤 \"%s.%s\"(\"%s\" 至 \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "å°‡ \"%s\" é‡å¯«ç‚º \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "clone \"%s\" 至 \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "複製 \"%s\" 至 \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "é€£çµ \"%s\" 至 \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "失敗,çµæŸ\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "執行: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL 命令失敗\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "無法開啟版本檔 \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "無法解æžç‰ˆæœ¬æª” \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ç„¡æ³•é€£ç·šåˆ°ç”¨ä»¥ä¸‹å‘½ä»¤å•Ÿå‹•çš„ä¾†æº postmaster:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"無法連線到用以下命令啟動的目標 postmaster:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl 啟動來æºä¼ºæœå™¨å¤±æ•—或連線失敗"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl 啟動目標伺æœå™¨å¤±æ•—或連線失敗"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "記憶體用盡"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq 環境變數 %s 具有éžæœ¬åœ°ä¼ºæœå™¨å€¼: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr "使用表空間時,無法å‡ç´šåˆ°/從相åŒçš„系統目錄版本。"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "表空間目錄 \"%s\" ä¸å­˜åœ¨"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "無法å–得表格空間目錄 \"%s\" 的狀態: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "表空間路徑 \"%s\" ä¸æ˜¯ç›®éŒ„"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+# utils/init/postinit.c:283
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "無法存å–目錄 \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "檢查ä¸ç›¸å®¹çš„ \"line\" 資料型別"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«ä½¿ç”¨è€…表格中的 \"line\" 資料型別,這個資料型別\n"
+"在您的舊版本和新版本之間改變了其內部和輸入/輸出格å¼ï¼Œ\n"
+"所以目å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤å•é¡Œçš„欄ä½ï¼Œç„¶å¾Œé‡\n"
+"新進行å‡ç´šã€‚å•é¡Œæ¬„ä½çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "檢查無效的 \"unknown\" 使用者欄ä½"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«ä½¿ç”¨è€…表格中的 \"unknown\" 資料型別。此資料型別ä¸å†\n"
+"å…許在表格中使用,所以目å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤å•é¡Œçš„欄ä½ï¼Œ\n"
+"然後é‡æ–°é€²è¡Œå‡ç´šã€‚å•é¡Œæ¬„ä½çš„清單ä½æ–¼ä»¥ä¸‹æª”案中:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "檢查雜湊索引"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "warning"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"您的安è£åŒ…å«é›œæ¹Šç´¢å¼•ã€‚這些索引在您的舊å¢é›†å’Œæ–°å¢é›†ä¹‹é–“具有ä¸åŒçš„\n"
+"內部格å¼ï¼Œå› æ­¤å¿…須使用 REINDEX 命令é‡æ–°ç´¢å¼•å®ƒå€‘。å‡ç´šå®Œæˆå¾Œï¼Œæ‚¨\n"
+"將收到é‡æ–°ç´¢å¼•çš„指示。"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"您的安è£åŒ…å«é›œæ¹Šç´¢å¼•ã€‚這些索引在您的舊å¢é›†å’Œæ–°å¢é›†ä¹‹é–“具有ä¸åŒçš„\n"
+"內部格å¼ï¼Œå› æ­¤å¿…須使用 REINDEX 命令é‡æ–°ç´¢å¼•å®ƒå€‘。當檔案\n"
+" %s\n"
+"被資料庫超級使用者用 psql 執行時,將é‡å»ºæ‰€æœ‰ç„¡æ•ˆçš„索引。在此之å‰ï¼Œ\n"
+"這些索引將ä¸æœƒè¢«ä½¿ç”¨ã€‚"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "檢查無效的 \"sql_identifier\" 使用者欄ä½"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安è£åŒ…å«ä½¿ç”¨è€…表格中的 \"sql_identifier\" 資料型別。這個資料型別的\n"
+"ç£ç¢Ÿæ ¼å¼å·²ç¶“改變,所以目å‰ç„¡æ³•å‡ç´šæ­¤å¢é›†ã€‚您å¯ä»¥åˆªé™¤å•é¡Œçš„欄ä½ï¼Œ\n"
+"然後é‡æ–°å•Ÿå‹•å‡ç´šã€‚å•é¡Œæ¬„ä½çš„清單ä½æ–¼æª”案中:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "檢查擴充模組更新"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "notice"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"您的安è£åŒ…å«æ‡‰è©²ä½¿ç”¨ ALTER EXTENSION 命令更新的擴充模組。\n"
+"當檔案\n"
+" %s\n"
+"被資料庫超級使用者用 psql 執行時,會更新這些擴充模組。"
diff --git a/src/bin/pg_upgrade/relfilenumber.c b/src/bin/pg_upgrade/relfilenumber.c
new file mode 100644
index 0000000..34bc9c1
--- /dev/null
+++ b/src/bin/pg_upgrade/relfilenumber.c
@@ -0,0 +1,259 @@
+/*
+ * relfilenumber.c
+ *
+ * relfilenumber functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/relfilenumber.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace);
+static void transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit);
+
+
+/*
+ * transfer_all_new_tablespaces()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata)
+{
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ prep_status_progress("Cloning user relation files");
+ break;
+ case TRANSFER_MODE_COPY:
+ prep_status_progress("Copying user relation files");
+ break;
+ case TRANSFER_MODE_LINK:
+ prep_status_progress("Linking user relation files");
+ break;
+ }
+
+ /*
+ * Transferring files by tablespace is tricky because a single database
+ * can use multiple tablespaces. For non-parallel mode, we just pass a
+ * NULL tablespace path, which matches all tablespaces. In parallel mode,
+ * we pass the default tablespace and all user-created tablespaces and let
+ * those operations happen in parallel.
+ */
+ if (user_opts.jobs <= 1)
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, NULL);
+ else
+ {
+ int tblnum;
+
+ /* transfer default tablespace */
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, old_pgdata);
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ parallel_transfer_all_new_dbs(old_db_arr,
+ new_db_arr,
+ old_pgdata,
+ new_pgdata,
+ os_info.old_tablespaces[tblnum]);
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+ }
+
+ end_progress_output();
+ check_ok();
+}
+
+
+/*
+ * transfer_all_new_dbs()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata, char *old_tablespace)
+{
+ int old_dbnum,
+ new_dbnum;
+
+ /* Scan the old cluster databases and transfer their files */
+ for (old_dbnum = new_dbnum = 0;
+ old_dbnum < old_db_arr->ndbs;
+ old_dbnum++, new_dbnum++)
+ {
+ DbInfo *old_db = &old_db_arr->dbs[old_dbnum],
+ *new_db = NULL;
+ FileNameMap *mappings;
+ int n_maps;
+
+ /*
+ * Advance past any databases that exist in the new cluster but not in
+ * the old, e.g. "postgres". (The user might have removed the
+ * 'postgres' database from the old cluster.)
+ */
+ for (; new_dbnum < new_db_arr->ndbs; new_dbnum++)
+ {
+ new_db = &new_db_arr->dbs[new_dbnum];
+ if (strcmp(old_db->db_name, new_db->db_name) == 0)
+ break;
+ }
+
+ if (new_dbnum >= new_db_arr->ndbs)
+ pg_fatal("old database \"%s\" not found in the new cluster",
+ old_db->db_name);
+
+ mappings = gen_db_file_maps(old_db, new_db, &n_maps, old_pgdata,
+ new_pgdata);
+ if (n_maps)
+ {
+ transfer_single_new_db(mappings, n_maps, old_tablespace);
+ }
+ /* We allocate something even for n_maps == 0 */
+ pg_free(mappings);
+ }
+}
+
+/*
+ * transfer_single_new_db()
+ *
+ * create links for mappings stored in "maps" array.
+ */
+static void
+transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
+{
+ int mapnum;
+ bool vm_must_add_frozenbit = false;
+
+ /*
+ * Do we need to rewrite visibilitymap?
+ */
+ if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_FROZEN_BIT_CAT_VER &&
+ new_cluster.controldata.cat_ver >= VISIBILITY_MAP_FROZEN_BIT_CAT_VER)
+ vm_must_add_frozenbit = true;
+
+ for (mapnum = 0; mapnum < size; mapnum++)
+ {
+ if (old_tablespace == NULL ||
+ strcmp(maps[mapnum].old_tablespace, old_tablespace) == 0)
+ {
+ /* transfer primary file */
+ transfer_relfile(&maps[mapnum], "", vm_must_add_frozenbit);
+
+ /*
+ * Copy/link any fsm and vm files, if they exist
+ */
+ transfer_relfile(&maps[mapnum], "_fsm", vm_must_add_frozenbit);
+ transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
+ }
+ }
+}
+
+
+/*
+ * transfer_relfile()
+ *
+ * Copy or link file from old cluster to new one. If vm_must_add_frozenbit
+ * is true, visibility map forks are converted and rewritten, even in link
+ * mode.
+ */
+static void
+transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit)
+{
+ char old_file[MAXPGPATH];
+ char new_file[MAXPGPATH];
+ int segno;
+ char extent_suffix[65];
+ struct stat statbuf;
+
+ /*
+ * Now copy/link any related segments as well. Remember, PG breaks large
+ * files into 1GB segments, the first segment has no extension, subsequent
+ * segments are named relfilenumber.1, relfilenumber.2, relfilenumber.3.
+ */
+ for (segno = 0;; segno++)
+ {
+ if (segno == 0)
+ extent_suffix[0] = '\0';
+ else
+ snprintf(extent_suffix, sizeof(extent_suffix), ".%d", segno);
+
+ snprintf(old_file, sizeof(old_file), "%s%s/%u/%u%s%s",
+ map->old_tablespace,
+ map->old_tablespace_suffix,
+ map->db_oid,
+ map->relfilenumber,
+ type_suffix,
+ extent_suffix);
+ snprintf(new_file, sizeof(new_file), "%s%s/%u/%u%s%s",
+ map->new_tablespace,
+ map->new_tablespace_suffix,
+ map->db_oid,
+ map->relfilenumber,
+ type_suffix,
+ extent_suffix);
+
+ /* Is it an extent, fsm, or vm file? */
+ if (type_suffix[0] != '\0' || segno != 0)
+ {
+ /* Did file open fail? */
+ if (stat(old_file, &statbuf) != 0)
+ {
+ /* File does not exist? That's OK, just return */
+ if (errno == ENOENT)
+ return;
+ else
+ pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ map->nspname, map->relname, old_file, new_file,
+ strerror(errno));
+ }
+
+ /* If file is empty, just return */
+ if (statbuf.st_size == 0)
+ return;
+ }
+
+ unlink(new_file);
+
+ /* Copying files might take some time, so give feedback. */
+ pg_log(PG_STATUS, "%s", old_file);
+
+ if (vm_must_add_frozenbit && strcmp(type_suffix, "_vm") == 0)
+ {
+ /* Need to rewrite visibility map format */
+ pg_log(PG_VERBOSE, "rewriting \"%s\" to \"%s\"",
+ old_file, new_file);
+ rewriteVisibilityMap(old_file, new_file, map->nspname, map->relname);
+ }
+ else
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"",
+ old_file, new_file);
+ cloneFile(old_file, new_file, map->nspname, map->relname);
+ break;
+ case TRANSFER_MODE_COPY:
+ pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"",
+ old_file, new_file);
+ copyFile(old_file, new_file, map->nspname, map->relname);
+ break;
+ case TRANSFER_MODE_LINK:
+ pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"",
+ old_file, new_file);
+ linkFile(old_file, new_file, map->nspname, map->relname);
+ }
+ }
+}
diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c
new file mode 100644
index 0000000..0bc3d28
--- /dev/null
+++ b/src/bin/pg_upgrade/server.c
@@ -0,0 +1,377 @@
+/*
+ * server.c
+ *
+ * database server functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/server.c
+ */
+
+#include "postgres_fe.h"
+
+#include "common/connect.h"
+#include "fe_utils/string_utils.h"
+#include "libpq/pqcomm.h"
+#include "pg_upgrade.h"
+
+static PGconn *get_db_conn(ClusterInfo *cluster, const char *db_name);
+
+
+/*
+ * connectToServer()
+ *
+ * Connects to the desired database on the designated server.
+ * If the connection attempt fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGconn *
+connectToServer(ClusterInfo *cluster, const char *db_name)
+{
+ PGconn *conn = get_db_conn(cluster, db_name);
+
+ if (conn == NULL || PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "%s", PQerrorMessage(conn));
+
+ if (conn)
+ PQfinish(conn);
+
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+
+ PQclear(executeQueryOrDie(conn, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ return conn;
+}
+
+
+/*
+ * get_db_conn()
+ *
+ * get database connection, using named database + standard params for cluster
+ *
+ * Caller must check for connection failure!
+ */
+static PGconn *
+get_db_conn(ClusterInfo *cluster, const char *db_name)
+{
+ PQExpBufferData conn_opts;
+ PGconn *conn;
+
+ /* Build connection string with proper quoting */
+ initPQExpBuffer(&conn_opts);
+ appendPQExpBufferStr(&conn_opts, "dbname=");
+ appendConnStrVal(&conn_opts, db_name);
+ appendPQExpBufferStr(&conn_opts, " user=");
+ appendConnStrVal(&conn_opts, os_info.user);
+ appendPQExpBuffer(&conn_opts, " port=%d", cluster->port);
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(&conn_opts, " host=");
+ appendConnStrVal(&conn_opts, cluster->sockdir);
+ }
+
+ conn = PQconnectdb(conn_opts.data);
+ termPQExpBuffer(&conn_opts);
+ return conn;
+}
+
+
+/*
+ * cluster_conn_opts()
+ *
+ * Return standard command-line options for connecting to this cluster when
+ * using psql, pg_dump, etc. Ideally this would match what get_db_conn()
+ * sets, but the utilities we need aren't very consistent about the treatment
+ * of database name options, so we leave that out.
+ *
+ * Result is valid until the next call to this function.
+ */
+char *
+cluster_conn_opts(ClusterInfo *cluster)
+{
+ static PQExpBuffer buf;
+
+ if (buf == NULL)
+ buf = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buf);
+
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(buf, "--host ");
+ appendShellString(buf, cluster->sockdir);
+ appendPQExpBufferChar(buf, ' ');
+ }
+ appendPQExpBuffer(buf, "--port %d --username ", cluster->port);
+ appendShellString(buf, os_info.user);
+
+ return buf->data;
+}
+
+
+/*
+ * executeQueryOrDie()
+ *
+ * Formats a query string from the given arguments and executes the
+ * resulting query. If the query fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGresult *
+executeQueryOrDie(PGconn *conn, const char *fmt,...)
+{
+ static char query[QUERY_ALLOC];
+ va_list args;
+ PGresult *result;
+ ExecStatusType status;
+
+ va_start(args, fmt);
+ vsnprintf(query, sizeof(query), fmt, args);
+ va_end(args);
+
+ pg_log(PG_VERBOSE, "executing: %s", query);
+ result = PQexec(conn, query);
+ status = PQresultStatus(result);
+
+ if ((status != PGRES_TUPLES_OK) && (status != PGRES_COMMAND_OK))
+ {
+ pg_log(PG_REPORT, "SQL command failed\n%s\n%s", query,
+ PQerrorMessage(conn));
+ PQclear(result);
+ PQfinish(conn);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+ else
+ return result;
+}
+
+
+/*
+ * get_major_server_version()
+ *
+ * gets the version (in unsigned int form) for the given datadir. Assumes
+ * that datadir is an absolute path to a valid pgdata directory. The version
+ * is retrieved by reading the PG_VERSION file.
+ */
+uint32
+get_major_server_version(ClusterInfo *cluster)
+{
+ FILE *version_fd;
+ char ver_filename[MAXPGPATH];
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
+ cluster->pgdata);
+ if ((version_fd = fopen(ver_filename, "r")) == NULL)
+ pg_fatal("could not open version file \"%s\": %m", ver_filename);
+
+ if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
+ sscanf(cluster->major_version_str, "%d.%d", &v1, &v2) < 1)
+ pg_fatal("could not parse version file \"%s\"", ver_filename);
+
+ fclose(version_fd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ return v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ return v1 * 10000;
+ }
+}
+
+
+static void
+stop_postmaster_atexit(void)
+{
+ stop_postmaster(true);
+}
+
+
+bool
+start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
+{
+ char cmd[MAXPGPATH * 4 + 1000];
+ PGconn *conn;
+ bool pg_ctl_return = false;
+ char socket_string[MAXPGPATH + 200];
+
+ static bool exit_hook_registered = false;
+
+ if (!exit_hook_registered)
+ {
+ atexit(stop_postmaster_atexit);
+ exit_hook_registered = true;
+ }
+
+ socket_string[0] = '\0';
+
+#if !defined(WIN32)
+ /* prevent TCP/IP connections, restrict socket access */
+ strcat(socket_string,
+ " -c listen_addresses='' -c unix_socket_permissions=0700");
+
+ /* Have a sockdir? Tell the postmaster. */
+ if (cluster->sockdir)
+ snprintf(socket_string + strlen(socket_string),
+ sizeof(socket_string) - strlen(socket_string),
+ " -c %s='%s'",
+ (GET_MAJOR_VERSION(cluster->major_version) <= 902) ?
+ "unix_socket_directory" : "unix_socket_directories",
+ cluster->sockdir);
+#endif
+
+ /*
+ * Use -b to disable autovacuum.
+ *
+ * Turn off durability requirements to improve object creation speed, and
+ * we only modify the new cluster, so only use it there. If there is a
+ * crash, the new cluster has to be recreated anyway. fsync=off is a big
+ * win on ext4.
+ */
+ snprintf(cmd, sizeof(cmd),
+ "\"%s/pg_ctl\" -w -l \"%s/%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start",
+ cluster->bindir,
+ log_opts.logdir,
+ SERVER_LOG_FILE, cluster->pgconfig, cluster->port,
+ (cluster == &new_cluster) ?
+ " -c synchronous_commit=off -c fsync=off -c full_page_writes=off" : "",
+ cluster->pgopts ? cluster->pgopts : "", socket_string);
+
+ /*
+ * Don't throw an error right away, let connecting throw the error because
+ * it might supply a reason for the failure.
+ */
+ pg_ctl_return = exec_prog(SERVER_START_LOG_FILE,
+ /* pass both file names if they differ */
+ (strcmp(SERVER_LOG_FILE,
+ SERVER_START_LOG_FILE) != 0) ?
+ SERVER_LOG_FILE : NULL,
+ report_and_exit_on_error, false,
+ "%s", cmd);
+
+ /* Did it fail and we are just testing if the server could be started? */
+ if (!pg_ctl_return && !report_and_exit_on_error)
+ return false;
+
+ /*
+ * We set this here to make sure atexit() shuts down the server, but only
+ * if we started the server successfully. We do it before checking for
+ * connectivity in case the server started but there is a connectivity
+ * failure. If pg_ctl did not return success, we will exit below.
+ *
+ * Pre-9.1 servers do not have PQping(), so we could be leaving the server
+ * running if authentication was misconfigured, so someday we might went
+ * to be more aggressive about doing server shutdowns even if pg_ctl
+ * fails, but now (2013-08-14) it seems prudent to be cautious. We don't
+ * want to shutdown a server that might have been accidentally started
+ * during the upgrade.
+ */
+ if (pg_ctl_return)
+ os_info.running_cluster = cluster;
+
+ /*
+ * pg_ctl -w might have failed because the server couldn't be started, or
+ * there might have been a connection problem in _checking_ if the server
+ * has started. Therefore, even if pg_ctl failed, we continue and test
+ * for connectivity in case we get a connection reason for the failure.
+ */
+ if ((conn = get_db_conn(cluster, "template1")) == NULL ||
+ PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "\n%s", PQerrorMessage(conn));
+ if (conn)
+ PQfinish(conn);
+ if (cluster == &old_cluster)
+ pg_fatal("could not connect to source postmaster started with the command:\n"
+ "%s",
+ cmd);
+ else
+ pg_fatal("could not connect to target postmaster started with the command:\n"
+ "%s",
+ cmd);
+ }
+ PQfinish(conn);
+
+ /*
+ * If pg_ctl failed, and the connection didn't fail, and
+ * report_and_exit_on_error is enabled, fail now. This could happen if
+ * the server was already running.
+ */
+ if (!pg_ctl_return)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("pg_ctl failed to start the source server, or connection failed");
+ else
+ pg_fatal("pg_ctl failed to start the target server, or connection failed");
+ }
+
+ return true;
+}
+
+
+void
+stop_postmaster(bool in_atexit)
+{
+ ClusterInfo *cluster;
+
+ if (os_info.running_cluster == &old_cluster)
+ cluster = &old_cluster;
+ else if (os_info.running_cluster == &new_cluster)
+ cluster = &new_cluster;
+ else
+ return; /* no cluster running */
+
+ exec_prog(SERVER_STOP_LOG_FILE, NULL, !in_atexit, !in_atexit,
+ "\"%s/pg_ctl\" -w -D \"%s\" -o \"%s\" %s stop",
+ cluster->bindir, cluster->pgconfig,
+ cluster->pgopts ? cluster->pgopts : "",
+ in_atexit ? "-m fast" : "-m smart");
+
+ os_info.running_cluster = NULL;
+}
+
+
+/*
+ * check_pghost_envvar()
+ *
+ * Tests that PGHOST does not point to a non-local server
+ */
+void
+check_pghost_envvar(void)
+{
+ PQconninfoOption *option;
+ PQconninfoOption *start;
+
+ /* Get valid libpq env vars from the PQconndefaults function */
+
+ start = PQconndefaults();
+
+ if (!start)
+ pg_fatal("out of memory");
+
+ for (option = start; option->keyword != NULL; option++)
+ {
+ if (option->envvar && (strcmp(option->envvar, "PGHOST") == 0 ||
+ strcmp(option->envvar, "PGHOSTADDR") == 0))
+ {
+ const char *value = getenv(option->envvar);
+
+ if (value && strlen(value) > 0 &&
+ /* check for 'local' host values */
+ (strcmp(value, "localhost") != 0 && strcmp(value, "127.0.0.1") != 0 &&
+ strcmp(value, "::1") != 0 && !is_unixsock_path(value)))
+ pg_fatal("libpq environment variable %s has a non-local server value: %s",
+ option->envvar, value);
+ }
+ }
+
+ /* Free the memory that libpq allocated on our behalf */
+ PQconninfoFree(start);
+}
diff --git a/src/bin/pg_upgrade/t/001_basic.pl b/src/bin/pg_upgrade/t/001_basic.pl
new file mode 100644
index 0000000..ceac4e0
--- /dev/null
+++ b/src/bin/pg_upgrade/t/001_basic.pl
@@ -0,0 +1,13 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_upgrade');
+program_version_ok('pg_upgrade');
+program_options_handling_ok('pg_upgrade');
+
+done_testing();
diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
new file mode 100644
index 0000000..e5f57e5
--- /dev/null
+++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
@@ -0,0 +1,461 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+# Set of tests for pg_upgrade, including cross-version checks.
+use strict;
+use warnings;
+
+use Cwd qw(abs_path);
+use File::Basename qw(dirname);
+use File::Compare;
+use File::Find qw(find);
+use File::Path qw(rmtree);
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::AdjustUpgrade;
+use Test::More;
+
+# Can be changed to test the other modes.
+my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy';
+
+# Generate a database with a name made of a range of ASCII characters.
+sub generate_db
+{
+ my ($node, $prefix, $from_char, $to_char, $suffix) = @_;
+
+ my $dbname = $prefix;
+ for my $i ($from_char .. $to_char)
+ {
+ next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR
+ $dbname = $dbname . sprintf('%c', $i);
+ }
+
+ $dbname .= $suffix;
+ $node->command_ok(
+ [ 'createdb', $dbname ],
+ "created database with ASCII characters from $from_char to $to_char");
+}
+
+# Filter the contents of a dump before its use in a content comparison.
+# This returns the path to the filtered dump.
+sub filter_dump
+{
+ my ($is_old, $old_version, $dump_file) = @_;
+ my $dump_contents = slurp_file($dump_file);
+
+ if ($is_old)
+ {
+ $dump_contents = adjust_old_dumpfile($old_version, $dump_contents);
+ }
+ else
+ {
+ $dump_contents = adjust_new_dumpfile($old_version, $dump_contents);
+ }
+
+ my $dump_file_filtered = "${dump_file}_filtered";
+ open(my $dh, '>', $dump_file_filtered)
+ || die "opening $dump_file_filtered";
+ print $dh $dump_contents;
+ close($dh);
+
+ return $dump_file_filtered;
+}
+
+# The test of pg_upgrade requires two clusters, an old one and a new one
+# that gets upgraded. Before running the upgrade, a logical dump of the
+# old cluster is taken, and a second logical dump of the new one is taken
+# after the upgrade. The upgrade test passes if there are no differences
+# (after filtering) in these two dumps.
+
+# Testing upgrades with an older version of PostgreSQL requires setting up
+# two environment variables, as of:
+# - "olddump", to point to a dump file that will be used to set up the old
+# instance to upgrade from.
+# - "oldinstall", to point to the installation path of the old cluster.
+if ( (defined($ENV{olddump}) && !defined($ENV{oldinstall}))
+ || (!defined($ENV{olddump}) && defined($ENV{oldinstall})))
+{
+ # Not all variables are defined, so leave and die if test is
+ # done with an older installation.
+ die "olddump or oldinstall is undefined";
+}
+
+# Paths to the dumps taken during the tests.
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $dump1_file = "$tempdir/dump1.sql";
+my $dump2_file = "$tempdir/dump2.sql";
+
+note "testing using transfer mode $mode";
+
+# Initialize node to upgrade
+my $oldnode =
+ PostgreSQL::Test::Cluster->new('old_node',
+ install_path => $ENV{oldinstall});
+
+my %node_params = ();
+
+# To increase coverage of non-standard segment size and group access without
+# increasing test runtime, run these tests with a custom setting.
+# --allow-group-access and --wal-segsize have been added in v11.
+my @custom_opts = ();
+if ($oldnode->pg_version >= 11)
+{
+ push @custom_opts, ('--wal-segsize', '1');
+ push @custom_opts, '--allow-group-access';
+}
+
+# Set up the locale settings for the original cluster, so that we
+# can test that pg_upgrade copies the locale settings of template0
+# from the old to the new cluster.
+
+my $original_encoding = "6"; # UTF-8
+my $original_provider = "c";
+my $original_locale = "C";
+my $original_iculocale = "";
+my $provider_field = "'c' AS datlocprovider";
+my $iculocale_field = "NULL AS daticulocale";
+if ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes')
+{
+ $provider_field = "datlocprovider";
+ $iculocale_field = "daticulocale";
+ $original_provider = "i";
+ $original_iculocale = "fr-CA";
+}
+
+my @initdb_params = @custom_opts;
+
+push @initdb_params, ('--encoding', 'UTF-8');
+push @initdb_params, ('--locale', $original_locale);
+if ($original_provider eq "i")
+{
+ push @initdb_params, ('--locale-provider', 'icu');
+ push @initdb_params, ('--icu-locale', 'fr-CA');
+}
+
+$node_params{extra} = \@initdb_params;
+$oldnode->init(%node_params);
+$oldnode->start;
+
+my $result;
+$result = $oldnode->safe_psql(
+ 'postgres',
+ "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field
+ FROM pg_database WHERE datname='template0'");
+is( $result,
+ "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale",
+ "check locales in original cluster");
+
+# The default location of the source code is the root of this directory.
+my $srcdir = abs_path("../../..");
+
+# Set up the data of the old instance with a dump or pg_regress.
+if (defined($ENV{olddump}))
+{
+ # Use the dump specified.
+ my $olddumpfile = $ENV{olddump};
+ die "no dump file found!" unless -e $olddumpfile;
+
+ # Load the dump using the "postgres" database as "regression" does
+ # not exist yet, and we are done here.
+ $oldnode->command_ok([ 'psql', '-X', '-f', $olddumpfile, 'postgres' ],
+ 'loaded old dump file');
+}
+else
+{
+ # Default is to use pg_regress to set up the old instance.
+
+ # Create databases with names covering most ASCII bytes. The
+ # first name exercises backslashes adjacent to double quotes, a
+ # Windows special case.
+ generate_db($oldnode, 'regression\\"\\', 1, 45, '\\\\"\\\\\\');
+ generate_db($oldnode, 'regression', 46, 90, '');
+ generate_db($oldnode, 'regression', 91, 127, '');
+
+ # Grab any regression options that may be passed down by caller.
+ my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || "";
+
+ # --dlpath is needed to be able to find the location of regress.so
+ # and any libraries the regression tests require.
+ my $dlpath = dirname($ENV{REGRESS_SHLIB});
+
+ # --outputdir points to the path where to place the output files.
+ my $outputdir = $PostgreSQL::Test::Utils::tmp_check;
+
+ # --inputdir points to the path of the input files.
+ my $inputdir = "$srcdir/src/test/regress";
+
+ note 'running regression tests in old instance';
+ my $rc =
+ system($ENV{PG_REGRESS}
+ . " $extra_opts "
+ . "--dlpath=\"$dlpath\" "
+ . "--bindir= "
+ . "--host="
+ . $oldnode->host . " "
+ . "--port="
+ . $oldnode->port . " "
+ . "--schedule=$srcdir/src/test/regress/parallel_schedule "
+ . "--max-concurrent-tests=20 "
+ . "--inputdir=\"$inputdir\" "
+ . "--outputdir=\"$outputdir\"");
+ if ($rc != 0)
+ {
+ # Dump out the regression diffs file, if there is one
+ my $diffs = "$outputdir/regression.diffs";
+ if (-e $diffs)
+ {
+ print "=== dumping $diffs ===\n";
+ print slurp_file($diffs);
+ print "=== EOF ===\n";
+ }
+ }
+ is($rc, 0, 'regression tests pass');
+}
+
+# Initialize a new node for the upgrade.
+my $newnode = PostgreSQL::Test::Cluster->new('new_node');
+
+# Reset to original parameters.
+@initdb_params = @custom_opts;
+
+# The new cluster will be initialized with different locale settings,
+# but these settings will be overwritten with those of the original
+# cluster.
+push @initdb_params, ('--encoding', 'SQL_ASCII');
+push @initdb_params, ('--locale-provider', 'libc');
+
+$node_params{extra} = \@initdb_params;
+$newnode->init(%node_params);
+
+my $newbindir = $newnode->config_data('--bindir');
+my $oldbindir = $oldnode->config_data('--bindir');
+
+# Before dumping, get rid of objects not existing or not supported in later
+# versions. This depends on the version of the old server used, and matters
+# only if different major versions are used for the dump.
+if (defined($ENV{oldinstall}))
+{
+ # Consult AdjustUpgrade to find out what we need to do.
+ my $dbnames =
+ $oldnode->safe_psql('postgres', qq(SELECT datname FROM pg_database));
+ my %dbnames;
+ do { $dbnames{$_} = 1; }
+ foreach split /\s+/s, $dbnames;
+ my $adjust_cmds =
+ adjust_database_contents($oldnode->pg_version, %dbnames);
+
+ foreach my $updb (keys %$adjust_cmds)
+ {
+ my $upcmds = join(";\n", @{ $adjust_cmds->{$updb} });
+
+ # For simplicity, use the newer version's psql to issue the commands.
+ $newnode->command_ok(
+ [
+ 'psql', '-X',
+ '-v', 'ON_ERROR_STOP=1',
+ '-c', $upcmds,
+ '-d', $oldnode->connstr($updb),
+ ],
+ "ran version adaptation commands for database $updb");
+ }
+}
+
+# Take a dump before performing the upgrade as a base comparison. Note
+# that we need to use pg_dumpall from the new node here.
+my @dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $oldnode->connstr('postgres'),
+ '-f', $dump1_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump before running pg_upgrade');
+
+# After dumping, update references to the old source tree's regress.so
+# to point to the new tree.
+if (defined($ENV{oldinstall}))
+{
+ # First, fetch all the references to libraries that are not part
+ # of the default path $libdir.
+ my $output = $oldnode->safe_psql('regression',
+ "SELECT DISTINCT probin::text FROM pg_proc WHERE probin NOT LIKE '\$libdir%';"
+ );
+ chomp($output);
+ my @libpaths = split("\n", $output);
+
+ my $dump_data = slurp_file($dump1_file);
+
+ my $newregresssrc = dirname($ENV{REGRESS_SHLIB});
+ foreach (@libpaths)
+ {
+ my $libpath = $_;
+ $libpath = dirname($libpath);
+ $dump_data =~ s/$libpath/$newregresssrc/g;
+ }
+
+ open my $fh, ">", $dump1_file or die "could not open dump file";
+ print $fh $dump_data;
+ close $fh;
+
+ # This replaces any references to the old tree's regress.so
+ # the new tree's regress.so. Any references that do *not*
+ # match $libdir are switched so as this request does not
+ # depend on the path of the old source tree. This is useful
+ # when using an old dump. Do the operation on all the databases
+ # that allow connections so as this includes the regression
+ # database and anything the user has set up.
+ $output = $oldnode->safe_psql('postgres',
+ "SELECT datname FROM pg_database WHERE datallowconn;");
+ chomp($output);
+ my @datnames = split("\n", $output);
+ foreach (@datnames)
+ {
+ my $datname = $_;
+ $oldnode->safe_psql(
+ $datname, "UPDATE pg_proc SET probin =
+ regexp_replace(probin, '.*/', '$newregresssrc/')
+ WHERE probin NOT LIKE '\$libdir/%'");
+ }
+}
+
+# Create an invalid database, will be deleted below
+$oldnode->safe_psql('postgres', qq(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+
+# In a VPATH build, we'll be started in the source directory, but we want
+# to run pg_upgrade in the build directory so that any files generated finish
+# in it, like delete_old_cluster.{sh,bat}.
+chdir ${PostgreSQL::Test::Utils::tmp_check};
+
+# Upgrade the instance.
+$oldnode->stop;
+
+# Cause a failure at the start of pg_upgrade, this should create the logging
+# directory pg_upgrade_output.d but leave it around. Keep --check for an
+# early exit.
+command_fails(
+ [
+ 'pg_upgrade', '--no-sync',
+ '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir,
+ '-b', $oldbindir . '/does/not/exist/',
+ '-B', $newbindir,
+ '-s', $newnode->host,
+ '-p', $oldnode->port,
+ '-P', $newnode->port,
+ $mode, '--check',
+ ],
+ 'run of pg_upgrade --check for new instance with incorrect binary path');
+ok(-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ not removed after pg_upgrade failure");
+rmtree($newnode->data_dir . "/pg_upgrade_output.d");
+
+# Check that pg_upgrade aborts when encountering an invalid database
+command_checks_all(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ $mode, '--check',
+ ],
+ 1,
+ [qr/invalid/], # pg_upgrade prints errors on stdout :(
+ [qr//],
+ 'invalid database causes failure');
+rmtree($newnode->data_dir . "/pg_upgrade_output.d");
+
+# And drop it, so we can continue
+$oldnode->start;
+$oldnode->safe_psql('postgres', 'DROP DATABASE regression_invalid');
+$oldnode->stop;
+
+# --check command works here, cleans up pg_upgrade_output.d.
+command_ok(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ $mode, '--check',
+ ],
+ 'run of pg_upgrade --check for new instance');
+ok(!-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ removed after pg_upgrade --check success");
+
+# Actual run, pg_upgrade_output.d is removed at the end.
+command_ok(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ $mode,
+ ],
+ 'run of pg_upgrade for new instance');
+ok( !-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ removed after pg_upgrade success");
+
+$newnode->start;
+
+# Check if there are any logs coming from pg_upgrade, that would only be
+# retained on failure.
+my $log_path = $newnode->data_dir . "/pg_upgrade_output.d";
+if (-d $log_path)
+{
+ my @log_files;
+ find(
+ sub {
+ push @log_files, $File::Find::name
+ if $File::Find::name =~ m/.*\.log/;
+ },
+ $newnode->data_dir . "/pg_upgrade_output.d");
+ foreach my $log (@log_files)
+ {
+ note "=== contents of $log ===\n";
+ print slurp_file($log);
+ print "=== EOF ===\n";
+ }
+}
+
+# Test that upgraded cluster has original locale settings.
+$result = $newnode->safe_psql(
+ 'postgres',
+ "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field
+ FROM pg_database WHERE datname='template0'");
+is( $result,
+ "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale",
+ "check that locales in new cluster match original cluster");
+
+# Second dump from the upgraded instance.
+@dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'),
+ '-f', $dump2_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump after running pg_upgrade');
+
+# Filter the contents of the dumps.
+my $dump1_filtered = filter_dump(1, $oldnode->pg_version, $dump1_file);
+my $dump2_filtered = filter_dump(0, $oldnode->pg_version, $dump2_file);
+
+# Compare the two dumps, there should be no differences.
+my $compare_res = compare($dump1_filtered, $dump2_filtered);
+is($compare_res, 0, 'old and new dumps match after pg_upgrade');
+
+# Provide more context if the dumps do not match.
+if ($compare_res != 0)
+{
+ my ($stdout, $stderr) =
+ run_command([ 'diff', '-u', $dump1_filtered, $dump2_filtered ]);
+ print "=== diff of $dump1_filtered and $dump2_filtered\n";
+ print "=== stdout ===\n";
+ print $stdout;
+ print "=== stderr ===\n";
+ print $stderr;
+ print "=== EOF ===\n";
+}
+
+done_testing();
diff --git a/src/bin/pg_upgrade/tablespace.c b/src/bin/pg_upgrade/tablespace.c
new file mode 100644
index 0000000..69cef7f
--- /dev/null
+++ b/src/bin/pg_upgrade/tablespace.c
@@ -0,0 +1,111 @@
+/*
+ * tablespace.c
+ *
+ * tablespace functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/tablespace.c
+ */
+
+#include "postgres_fe.h"
+
+#include "pg_upgrade.h"
+
+static void get_tablespace_paths(void);
+static void set_tablespace_directory_suffix(ClusterInfo *cluster);
+
+
+void
+init_tablespaces(void)
+{
+ get_tablespace_paths();
+
+ set_tablespace_directory_suffix(&old_cluster);
+ set_tablespace_directory_suffix(&new_cluster);
+
+ if (os_info.num_old_tablespaces > 0 &&
+ strcmp(old_cluster.tablespace_suffix, new_cluster.tablespace_suffix) == 0)
+ pg_fatal("Cannot upgrade to/from the same system catalog version when\n"
+ "using tablespaces.");
+}
+
+
+/*
+ * get_tablespace_paths()
+ *
+ * Scans pg_tablespace and returns a malloc'ed array of all tablespace
+ * paths. It's the caller's responsibility to free the array.
+ */
+static void
+get_tablespace_paths(void)
+{
+ PGconn *conn = connectToServer(&old_cluster, "template1");
+ PGresult *res;
+ int tblnum;
+ int i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT pg_catalog.pg_tablespace_location(oid) AS spclocation "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname != 'pg_default' AND "
+ " spcname != 'pg_global'");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ if ((os_info.num_old_tablespaces = PQntuples(res)) != 0)
+ os_info.old_tablespaces =
+ (char **) pg_malloc(os_info.num_old_tablespaces * sizeof(char *));
+ else
+ os_info.old_tablespaces = NULL;
+
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statBuf;
+
+ os_info.old_tablespaces[tblnum] = pg_strdup(PQgetvalue(res, tblnum, i_spclocation));
+
+ /*
+ * Check that the tablespace path exists and is a directory.
+ * Effectively, this is checking only for tables/indexes in
+ * non-existent tablespace directories. Databases located in
+ * non-existent tablespaces already throw a backend error.
+ * Non-existent tablespace directories can occur when a data directory
+ * that contains user tablespaces is moved as part of pg_upgrade
+ * preparation and the symbolic links are not updated.
+ */
+ if (stat(os_info.old_tablespaces[tblnum], &statBuf) != 0)
+ {
+ if (errno == ENOENT)
+ report_status(PG_FATAL,
+ "tablespace directory \"%s\" does not exist",
+ os_info.old_tablespaces[tblnum]);
+ else
+ report_status(PG_FATAL,
+ "could not stat tablespace directory \"%s\": %s",
+ os_info.old_tablespaces[tblnum], strerror(errno));
+ }
+ if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL,
+ "tablespace path \"%s\" is not a directory",
+ os_info.old_tablespaces[tblnum]);
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+}
+
+
+static void
+set_tablespace_directory_suffix(ClusterInfo *cluster)
+{
+ /* This cluster has a version-specific subdirectory */
+
+ /* The leading slash is needed to start a new directory. */
+ cluster->tablespace_suffix = psprintf("/PG_%s_%d",
+ cluster->major_version_str,
+ cluster->controldata.cat_ver);
+}
diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c
new file mode 100644
index 0000000..21ba4c8
--- /dev/null
+++ b/src/bin/pg_upgrade/util.c
@@ -0,0 +1,355 @@
+/*
+ * util.c
+ *
+ * utility functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/util.c
+ */
+
+#include "postgres_fe.h"
+
+#include <signal.h>
+
+#include "common/username.h"
+#include "pg_upgrade.h"
+
+LogOpts log_opts;
+
+static void pg_log_v(eLogType type, const char *fmt, va_list ap) pg_attribute_printf(2, 0);
+
+
+/*
+ * report_status()
+ *
+ * Displays the result of an operation (ok, failed, error message,...)
+ *
+ * This is no longer functionally different from pg_log(), but we keep
+ * it around to maintain a notational distinction between operation
+ * results and other messages.
+ */
+void
+report_status(eLogType type, const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(type, fmt, args);
+ va_end(args);
+}
+
+
+void
+end_progress_output(void)
+{
+ /*
+ * For output to a tty, erase prior contents of progress line. When either
+ * tty or verbose, indent so that report_status() output will align
+ * nicely.
+ */
+ if (log_opts.isatty)
+ {
+ printf("\r");
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, "");
+ }
+ else if (log_opts.verbose)
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, "");
+}
+
+/*
+ * Remove any logs generated internally. To be used once when exiting.
+ */
+void
+cleanup_output_dirs(void)
+{
+ fclose(log_opts.internal);
+
+ /* Remove dump and log files? */
+ if (log_opts.retain)
+ return;
+
+ /*
+ * Try twice. The second time might wait for files to finish being
+ * unlinked, on Windows.
+ */
+ if (!rmtree(log_opts.basedir, true))
+ rmtree(log_opts.basedir, true);
+
+ /* Remove pg_upgrade_output.d only if empty */
+ switch (pg_check_dir(log_opts.rootdir))
+ {
+ case 0: /* non-existent */
+ case 3: /* exists and contains a mount point */
+ Assert(false);
+ break;
+
+ case 1: /* exists and empty */
+ case 2: /* exists and contains only dot files */
+
+ /*
+ * Try twice. The second time might wait for files to finish
+ * being unlinked, on Windows.
+ */
+ if (!rmtree(log_opts.rootdir, true))
+ rmtree(log_opts.rootdir, true);
+ break;
+
+ case 4: /* exists */
+
+ /*
+ * Keep the root directory as this includes some past log
+ * activity.
+ */
+ break;
+
+ default:
+ /* different failure, just report it */
+ pg_log(PG_WARNING, "could not access directory \"%s\": %m",
+ log_opts.rootdir);
+ break;
+ }
+}
+
+/*
+ * prep_status
+ *
+ * Displays a message that describes an operation we are about to begin.
+ * We pad the message out to MESSAGE_WIDTH characters so that all of the
+ * "ok" and "failed" indicators line up nicely. (Overlength messages
+ * will be truncated, so don't get too verbose.)
+ *
+ * A typical sequence would look like this:
+ * prep_status("about to flarb the next %d files", fileCount);
+ * if ((message = flarbFiles(fileCount)) == NULL)
+ * report_status(PG_REPORT, "ok");
+ * else
+ * pg_log(PG_FATAL, "failed: %s", message);
+ */
+void
+prep_status(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ /* trim strings */
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, message);
+}
+
+/*
+ * prep_status_progress
+ *
+ * Like prep_status(), but for potentially longer running operations.
+ * Details about what item is currently being processed can be displayed
+ * with pg_log(PG_STATUS, ...). A typical sequence would look like this:
+ *
+ * prep_status_progress("copying files");
+ * for (...)
+ * pg_log(PG_STATUS, "%s", filename);
+ * end_progress_output();
+ * report_status(PG_REPORT, "ok");
+ */
+void
+prep_status_progress(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ /*
+ * If outputting to a tty or in verbose, append newline. pg_log_v() will
+ * put the individual progress items onto the next line.
+ */
+ if (log_opts.isatty || log_opts.verbose)
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message);
+ else
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, message);
+}
+
+static void
+pg_log_v(eLogType type, const char *fmt, va_list ap)
+{
+ char message[QUERY_ALLOC];
+
+ /* No incoming message should end in newline; we add that here. */
+ Assert(fmt);
+ Assert(fmt[0] == '\0' || fmt[strlen(fmt) - 1] != '\n');
+
+ vsnprintf(message, sizeof(message), _(fmt), ap);
+
+ /* PG_VERBOSE and PG_STATUS are only output in verbose mode */
+ /* fopen() on log_opts.internal might have failed, so check it */
+ if (((type != PG_VERBOSE && type != PG_STATUS) || log_opts.verbose) &&
+ log_opts.internal != NULL)
+ {
+ if (type == PG_STATUS)
+ /* status messages get two leading spaces, see below */
+ fprintf(log_opts.internal, " %s\n", message);
+ else if (type == PG_REPORT_NONL)
+ fprintf(log_opts.internal, "%s", message);
+ else
+ fprintf(log_opts.internal, "%s\n", message);
+ fflush(log_opts.internal);
+ }
+
+ switch (type)
+ {
+ case PG_VERBOSE:
+ if (log_opts.verbose)
+ printf("%s\n", message);
+ break;
+
+ case PG_STATUS:
+
+ /*
+ * For output to a terminal, we add two leading spaces and no
+ * newline; instead append \r so that the next message is output
+ * on the same line. Truncate on the left to fit into
+ * MESSAGE_WIDTH (counting the spaces as part of that).
+ *
+ * If going to non-interactive output, only display progress if
+ * verbose is enabled. Otherwise the output gets unreasonably
+ * large by default.
+ */
+ if (log_opts.isatty)
+ {
+ bool itfits = (strlen(message) <= MESSAGE_WIDTH - 2);
+
+ /* prefix with "..." if we do leading truncation */
+ printf(" %s%-*.*s\r",
+ itfits ? "" : "...",
+ MESSAGE_WIDTH - 2, MESSAGE_WIDTH - 2,
+ itfits ? message :
+ message + strlen(message) - MESSAGE_WIDTH + 3 + 2);
+ }
+ else if (log_opts.verbose)
+ printf(" %s\n", message);
+ break;
+
+ case PG_REPORT_NONL:
+ /* This option is for use by prep_status and friends */
+ printf("%s", message);
+ break;
+
+ case PG_REPORT:
+ case PG_WARNING:
+ printf("%s\n", message);
+ break;
+
+ case PG_FATAL:
+ /* Extra newline in case we're interrupting status output */
+ printf("\n%s\n", message);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ break;
+
+ /* No default:, we want a warning for omitted cases */
+ }
+ fflush(stdout);
+}
+
+
+void
+pg_log(eLogType type, const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(type, fmt, args);
+ va_end(args);
+}
+
+
+void
+pg_fatal(const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(PG_FATAL, fmt, args);
+ va_end(args);
+ /* NOTREACHED */
+ printf(_("Failure, exiting\n"));
+ exit(1);
+}
+
+
+void
+check_ok(void)
+{
+ /* all seems well */
+ report_status(PG_REPORT, "ok");
+}
+
+
+/*
+ * quote_identifier()
+ * Properly double-quote a SQL identifier.
+ *
+ * The result should be pg_free'd, but most callers don't bother because
+ * memory leakage is not a big deal in this program.
+ */
+char *
+quote_identifier(const char *s)
+{
+ char *result = pg_malloc(strlen(s) * 2 + 3);
+ char *r = result;
+
+ *r++ = '"';
+ while (*s)
+ {
+ if (*s == '"')
+ *r++ = *s;
+ *r++ = *s;
+ s++;
+ }
+ *r++ = '"';
+ *r++ = '\0';
+
+ return result;
+}
+
+
+/*
+ * get_user_info()
+ */
+int
+get_user_info(char **user_name_p)
+{
+ int user_id;
+ const char *user_name;
+ char *errstr;
+
+#ifndef WIN32
+ user_id = geteuid();
+#else
+ user_id = 1;
+#endif
+
+ user_name = get_user_name(&errstr);
+ if (!user_name)
+ pg_fatal("%s", errstr);
+
+ /* make a copy */
+ *user_name_p = pg_strdup(user_name);
+
+ return user_id;
+}
+
+
+/*
+ * str2uint()
+ *
+ * convert string to oid
+ */
+unsigned int
+str2uint(const char *str)
+{
+ return strtoul(str, NULL, 10);
+}
diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c
new file mode 100644
index 0000000..403a6d7
--- /dev/null
+++ b/src/bin/pg_upgrade/version.c
@@ -0,0 +1,461 @@
+/*
+ * version.c
+ *
+ * Postgres-version-specific routines
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/version.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_class_d.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+
+/*
+ * check_for_data_types_usage()
+ * Detect whether there are any stored columns depending on given type(s)
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * base_query should be a SELECT yielding a single column named "oid",
+ * containing the pg_type OIDs of one or more types that are known to have
+ * inconsistent on-disk representations across server versions.
+ *
+ * We check for the type(s) in tables, matviews, and indexes, but not views;
+ * there's no storage involved in a view.
+ */
+bool
+check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path)
+{
+ bool found = false;
+ FILE *script = NULL;
+ int dbnum;
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ PQExpBufferData querybuf;
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname,
+ i_attname;
+
+ /*
+ * The type(s) of interest might be wrapped in a domain, array,
+ * composite, or range, and these container types can be nested (to
+ * varying extents depending on server version, but that's not of
+ * concern here). To handle all these cases we need a recursive CTE.
+ */
+ initPQExpBuffer(&querybuf);
+ appendPQExpBuffer(&querybuf,
+ "WITH RECURSIVE oids AS ( "
+ /* start with the type(s) returned by base_query */
+ " %s "
+ " UNION ALL "
+ " SELECT * FROM ( "
+ /* inner WITH because we can only reference the CTE once */
+ " WITH x AS (SELECT oid FROM oids) "
+ /* domains on any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' "
+ " UNION ALL "
+ /* arrays over any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' "
+ " UNION ALL "
+ /* composite types containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x "
+ " WHERE t.typtype = 'c' AND "
+ " t.oid = c.reltype AND "
+ " c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid = x.oid "
+ " UNION ALL "
+ /* ranges containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
+ " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid"
+ " ) foo "
+ ") "
+ /* now look for stored columns of any such type */
+ "SELECT n.nspname, c.relname, a.attname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_attribute a "
+ "WHERE c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid IN (SELECT oid FROM oids) AND "
+ " c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_INDEX) ") AND "
+ " c.relnamespace = n.oid AND "
+ /* exclude possible orphaned temp tables */
+ " n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ /* exclude system catalogs, too */
+ " n.nspname NOT IN ('pg_catalog', 'information_schema')",
+ base_query);
+
+ res = executeQueryOrDie(conn, "%s", querybuf.data);
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_attname = PQfnumber(res, "attname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname),
+ PQgetvalue(res, rowno, i_attname));
+ }
+
+ PQclear(res);
+
+ termPQExpBuffer(&querybuf);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ return found;
+}
+
+/*
+ * check_for_data_type_usage()
+ * Detect whether there are any stored columns depending on the given type
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * type_name should be a fully qualified type name. This is just a
+ * trivial wrapper around check_for_data_types_usage() to convert a
+ * type name into a base query.
+ */
+bool
+check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path)
+{
+ bool found;
+ char *base_query;
+
+ base_query = psprintf("SELECT '%s'::pg_catalog.regtype AS oid",
+ type_name);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ return found;
+}
+
+
+/*
+ * old_9_3_check_for_line_data_type_usage()
+ * 9.3 -> 9.4
+ * Fully implement the 'line' data type in 9.4, which previously returned
+ * "not enabled" by default and was only functionally enabled with a
+ * compile-time switch; as of 9.4 "line" has a different on-disk
+ * representation format.
+ */
+void
+old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"line\" data type");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_line.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.line", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"line\" data type in user tables.\n"
+ "This data type changed its internal and input/output format\n"
+ "between your old and new versions so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * old_9_6_check_for_unknown_data_type_usage()
+ * 9.6 -> 10
+ * It's no longer allowed to create tables or views with "unknown"-type
+ * columns. We do not complain about views with such columns, because
+ * they should get silently converted to "text" columns during the DDL
+ * dump and reload; it seems unlikely to be worth making users do that
+ * by hand. However, if there's a table with such a column, the DDL
+ * reload will fail, so we should pre-detect that rather than failing
+ * mid-upgrade. Worse, if there's a matview with such a column, the
+ * DDL reload will silently change it to "text" which won't match the
+ * on-disk storage (which is like "cstring"). So we *must* reject that.
+ */
+void
+old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"unknown\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_unknown.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.unknown", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"unknown\" data type in user tables.\n"
+ "This data type is no longer allowed in tables, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_9_6_invalidate_hash_indexes()
+ * 9.6 -> 10
+ * Hash index binary format has changed from 9.6->10.0
+ */
+void
+old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char *output_path = "reindex_hash.sql";
+
+ prep_status("Checking for hash indexes");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find hash indexes */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_index i, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"
+ );
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (!check_mode)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "REINDEX INDEX %s.%s;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+ quote_identifier(PQgetvalue(res, rowno, i_relname)));
+ }
+ }
+
+ PQclear(res);
+
+ if (!check_mode && db_used)
+ {
+ /* mark hash indexes as invalid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_index i "
+ "SET indisvalid = false "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"));
+ }
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_WARNING, "warning");
+ if (check_mode)
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. After upgrading, you will be given\n"
+ "REINDEX instructions.");
+ else
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will recreate all invalid\n"
+ "indexes; until then, none of these indexes will be used.",
+ output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_11_check_for_sql_identifier_data_type_usage()
+ * 11 -> 12
+ * In 12, the sql_identifier data type was switched from name to varchar,
+ * which does affect the storage (name is by-ref, but not varlena). This
+ * means user tables using sql_identifier for columns are broken because
+ * the on-disk format is different.
+ */
+void
+old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"sql_identifier\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_sql_identifier.txt");
+
+ if (check_for_data_type_usage(cluster, "information_schema.sql_identifier",
+ output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"sql_identifier\" data type in user tables.\n"
+ "The on-disk format for this data type has changed, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * report_extension_updates()
+ * Report extensions that should be updated.
+ */
+void
+report_extension_updates(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char *output_path = "update_extensions.sql";
+
+ prep_status("Checking for extension updates");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_name;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find extensions needing updates */
+ res = executeQueryOrDie(conn,
+ "SELECT name "
+ "FROM pg_available_extensions "
+ "WHERE installed_version != default_version"
+ );
+
+ ntups = PQntuples(res);
+ i_name = PQfnumber(res, "name");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "ALTER EXTENSION %s UPDATE;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_name)));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ report_status(PG_REPORT, "notice");
+ pg_log(PG_REPORT, "\n"
+ "Your installation contains extensions that should be updated\n"
+ "with the ALTER EXTENSION command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will update\n"
+ "these extensions.",
+ output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_verifybackup/.gitignore b/src/bin/pg_verifybackup/.gitignore
new file mode 100644
index 0000000..910b227
--- /dev/null
+++ b/src/bin/pg_verifybackup/.gitignore
@@ -0,0 +1,2 @@
+/pg_verifybackup
+/tmp_check/
diff --git a/src/bin/pg_verifybackup/Makefile b/src/bin/pg_verifybackup/Makefile
new file mode 100644
index 0000000..596df15
--- /dev/null
+++ b/src/bin/pg_verifybackup/Makefile
@@ -0,0 +1,49 @@
+# src/bin/pg_verifybackup/Makefile
+
+PGFILEDESC = "pg_verifybackup - verify a backup against using a backup manifest"
+PGAPPICON = win32
+
+# make these available to TAP test scripts
+export TAR
+# Note that GZIP cannot be used directly as this environment variable is
+# used by the command "gzip" to pass down options, so stick with a different
+# name.
+export GZIP_PROGRAM=$(GZIP)
+export LZ4=$(LZ4)
+export ZSTD=$(ZSTD)
+
+subdir = src/bin/pg_verifybackup
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ parse_manifest.o \
+ pg_verifybackup.o
+
+all: pg_verifybackup
+
+pg_verifybackup: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_verifybackup$(X) '$(DESTDIR)$(bindir)/pg_verifybackup$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_verifybackup$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_verifybackup$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build
new file mode 100644
index 0000000..9369da1
--- /dev/null
+++ b/src/bin/pg_verifybackup/meson.build
@@ -0,0 +1,45 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_verifybackup_sources = files(
+ 'parse_manifest.c',
+ 'pg_verifybackup.c'
+)
+
+if host_system == 'windows'
+ pg_verifybackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_verifybackup',
+ '--FILEDESC', 'pg_verifybackup - verify a backup against using a backup manifest'])
+endif
+
+pg_verifybackup = executable('pg_verifybackup',
+ pg_verifybackup_sources,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_verifybackup
+
+tests += {
+ 'name': 'pg_verifybackup',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'GZIP_PROGRAM': gzip.path(),
+ 'TAR': tar.path(),
+ 'LZ4': program_lz4.found() ? program_lz4.path() : '',
+ 'ZSTD': program_zstd.found() ? program_zstd.path() : ''},
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_algorithm.pl',
+ 't/003_corruption.pl',
+ 't/004_options.pl',
+ 't/005_bad_manifest.pl',
+ 't/006_encoding.pl',
+ 't/007_wal.pl',
+ 't/008_untar.pl',
+ 't/009_extract.pl',
+ 't/010_client_untar.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_verifybackup/nls.mk b/src/bin/pg_verifybackup/nls.mk
new file mode 100644
index 0000000..eba73a2
--- /dev/null
+++ b/src/bin/pg_verifybackup/nls.mk
@@ -0,0 +1,16 @@
+# src/bin/pg_verifybackup/nls.mk
+CATALOG_NAME = pg_verifybackup
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ parse_manifest.c \
+ pg_verifybackup.c \
+ ../../common/fe_memutils.c \
+ ../../common/jsonapi.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ json_manifest_parse_failure:2 \
+ error_cb:2 \
+ report_backup_error:2 \
+ report_fatal_error
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ error_cb:2:c-format \
+ report_backup_error:2:c-format \
+ report_fatal_error:1:c-format
diff --git a/src/bin/pg_verifybackup/parse_manifest.c b/src/bin/pg_verifybackup/parse_manifest.c
new file mode 100644
index 0000000..2379f7b
--- /dev/null
+++ b/src/bin/pg_verifybackup/parse_manifest.c
@@ -0,0 +1,760 @@
+/*-------------------------------------------------------------------------
+ *
+ * parse_manifest.c
+ * Parse a backup manifest in JSON format.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_verifybackup/parse_manifest.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "parse_manifest.h"
+#include "common/jsonapi.h"
+
+/*
+ * Semantic states for JSON manifest parsing.
+ */
+typedef enum
+{
+ JM_EXPECT_TOPLEVEL_START,
+ JM_EXPECT_TOPLEVEL_END,
+ JM_EXPECT_TOPLEVEL_FIELD,
+ JM_EXPECT_VERSION_VALUE,
+ JM_EXPECT_FILES_START,
+ JM_EXPECT_FILES_NEXT,
+ JM_EXPECT_THIS_FILE_FIELD,
+ JM_EXPECT_THIS_FILE_VALUE,
+ JM_EXPECT_WAL_RANGES_START,
+ JM_EXPECT_WAL_RANGES_NEXT,
+ JM_EXPECT_THIS_WAL_RANGE_FIELD,
+ JM_EXPECT_THIS_WAL_RANGE_VALUE,
+ JM_EXPECT_MANIFEST_CHECKSUM_VALUE,
+ JM_EXPECT_EOF
+} JsonManifestSemanticState;
+
+/*
+ * Possible fields for one file as described by the manifest.
+ */
+typedef enum
+{
+ JMFF_PATH,
+ JMFF_ENCODED_PATH,
+ JMFF_SIZE,
+ JMFF_LAST_MODIFIED,
+ JMFF_CHECKSUM_ALGORITHM,
+ JMFF_CHECKSUM
+} JsonManifestFileField;
+
+/*
+ * Possible fields for one file as described by the manifest.
+ */
+typedef enum
+{
+ JMWRF_TIMELINE,
+ JMWRF_START_LSN,
+ JMWRF_END_LSN
+} JsonManifestWALRangeField;
+
+/*
+ * Internal state used while decoding the JSON-format backup manifest.
+ */
+typedef struct
+{
+ JsonManifestParseContext *context;
+ JsonManifestSemanticState state;
+
+ /* These fields are used for parsing objects in the list of files. */
+ JsonManifestFileField file_field;
+ char *pathname;
+ char *encoded_pathname;
+ char *size;
+ char *algorithm;
+ pg_checksum_type checksum_algorithm;
+ char *checksum;
+
+ /* These fields are used for parsing objects in the list of WAL ranges. */
+ JsonManifestWALRangeField wal_range_field;
+ char *timeline;
+ char *start_lsn;
+ char *end_lsn;
+
+ /* Miscellaneous other stuff. */
+ bool saw_version_field;
+ char *manifest_checksum;
+} JsonManifestParseState;
+
+static JsonParseErrorType json_manifest_object_start(void *state);
+static JsonParseErrorType json_manifest_object_end(void *state);
+static JsonParseErrorType json_manifest_array_start(void *state);
+static JsonParseErrorType json_manifest_array_end(void *state);
+static JsonParseErrorType json_manifest_object_field_start(void *state, char *fname,
+ bool isnull);
+static JsonParseErrorType json_manifest_scalar(void *state, char *token,
+ JsonTokenType tokentype);
+static void json_manifest_finalize_file(JsonManifestParseState *parse);
+static void json_manifest_finalize_wal_range(JsonManifestParseState *parse);
+static void verify_manifest_checksum(JsonManifestParseState *parse,
+ char *buffer, size_t size);
+static void json_manifest_parse_failure(JsonManifestParseContext *context,
+ char *msg);
+
+static int hexdecode_char(char c);
+static bool hexdecode_string(uint8 *result, char *input, int nbytes);
+static bool parse_xlogrecptr(XLogRecPtr *result, char *input);
+
+/*
+ * Main entrypoint to parse a JSON-format backup manifest.
+ *
+ * Caller should set up the parsing context and then invoke this function.
+ * For each file whose information is extracted from the manifest,
+ * context->perfile_cb is invoked. In case of trouble, context->error_cb is
+ * invoked and is expected not to return.
+ */
+void
+json_parse_manifest(JsonManifestParseContext *context, char *buffer,
+ size_t size)
+{
+ JsonLexContext *lex;
+ JsonParseErrorType json_error;
+ JsonSemAction sem;
+ JsonManifestParseState parse;
+
+ /* Set up our private parsing context. */
+ parse.context = context;
+ parse.state = JM_EXPECT_TOPLEVEL_START;
+ parse.saw_version_field = false;
+
+ /* Create a JSON lexing context. */
+ lex = makeJsonLexContextCstringLen(buffer, size, PG_UTF8, true);
+
+ /* Set up semantic actions. */
+ sem.semstate = &parse;
+ sem.object_start = json_manifest_object_start;
+ sem.object_end = json_manifest_object_end;
+ sem.array_start = json_manifest_array_start;
+ sem.array_end = json_manifest_array_end;
+ sem.object_field_start = json_manifest_object_field_start;
+ sem.object_field_end = NULL;
+ sem.array_element_start = NULL;
+ sem.array_element_end = NULL;
+ sem.scalar = json_manifest_scalar;
+
+ /* Run the actual JSON parser. */
+ json_error = pg_parse_json(lex, &sem);
+ if (json_error != JSON_SUCCESS)
+ json_manifest_parse_failure(context, "parsing failed");
+ if (parse.state != JM_EXPECT_EOF)
+ json_manifest_parse_failure(context, "manifest ended unexpectedly");
+
+ /* Verify the manifest checksum. */
+ verify_manifest_checksum(&parse, buffer, size);
+}
+
+/*
+ * Invoked at the start of each object in the JSON document.
+ *
+ * The document as a whole is expected to be an object; each file and each
+ * WAL range is also expected to be an object. If we're anywhere else in the
+ * document, it's an error.
+ */
+static JsonParseErrorType
+json_manifest_object_start(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_TOPLEVEL_START:
+ parse->state = JM_EXPECT_TOPLEVEL_FIELD;
+ break;
+ case JM_EXPECT_FILES_NEXT:
+ parse->state = JM_EXPECT_THIS_FILE_FIELD;
+ parse->pathname = NULL;
+ parse->encoded_pathname = NULL;
+ parse->size = NULL;
+ parse->algorithm = NULL;
+ parse->checksum = NULL;
+ break;
+ case JM_EXPECT_WAL_RANGES_NEXT:
+ parse->state = JM_EXPECT_THIS_WAL_RANGE_FIELD;
+ parse->timeline = NULL;
+ parse->start_lsn = NULL;
+ parse->end_lsn = NULL;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected object start");
+ break;
+ }
+
+ return JSON_SUCCESS;
+}
+
+/*
+ * Invoked at the end of each object in the JSON document.
+ *
+ * The possible cases here are the same as for json_manifest_object_start.
+ * There's nothing special to do at the end of the document, but when we
+ * reach the end of an object representing a particular file or WAL range,
+ * we must call json_manifest_finalize_file() to save the associated details.
+ */
+static JsonParseErrorType
+json_manifest_object_end(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_TOPLEVEL_END:
+ parse->state = JM_EXPECT_EOF;
+ break;
+ case JM_EXPECT_THIS_FILE_FIELD:
+ json_manifest_finalize_file(parse);
+ parse->state = JM_EXPECT_FILES_NEXT;
+ break;
+ case JM_EXPECT_THIS_WAL_RANGE_FIELD:
+ json_manifest_finalize_wal_range(parse);
+ parse->state = JM_EXPECT_WAL_RANGES_NEXT;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected object end");
+ break;
+ }
+
+ return JSON_SUCCESS;
+}
+
+/*
+ * Invoked at the start of each array in the JSON document.
+ *
+ * Within the toplevel object, the value associated with the "Files" key
+ * should be an array. Similarly for the "WAL-Ranges" key. No other arrays
+ * are expected.
+ */
+static JsonParseErrorType
+json_manifest_array_start(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_FILES_START:
+ parse->state = JM_EXPECT_FILES_NEXT;
+ break;
+ case JM_EXPECT_WAL_RANGES_START:
+ parse->state = JM_EXPECT_WAL_RANGES_NEXT;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected array start");
+ break;
+ }
+
+ return JSON_SUCCESS;
+}
+
+/*
+ * Invoked at the end of each array in the JSON document.
+ *
+ * The cases here are analogous to those in json_manifest_array_start.
+ */
+static JsonParseErrorType
+json_manifest_array_end(void *state)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_FILES_NEXT:
+ case JM_EXPECT_WAL_RANGES_NEXT:
+ parse->state = JM_EXPECT_TOPLEVEL_FIELD;
+ break;
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected array end");
+ break;
+ }
+
+ return JSON_SUCCESS;
+}
+
+/*
+ * Invoked at the start of each object field in the JSON document.
+ */
+static JsonParseErrorType
+json_manifest_object_field_start(void *state, char *fname, bool isnull)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_TOPLEVEL_FIELD:
+
+ /*
+ * Inside toplevel object. The version indicator should always be
+ * the first field.
+ */
+ if (!parse->saw_version_field)
+ {
+ if (strcmp(fname, "PostgreSQL-Backup-Manifest-Version") != 0)
+ json_manifest_parse_failure(parse->context,
+ "expected version indicator");
+ parse->state = JM_EXPECT_VERSION_VALUE;
+ parse->saw_version_field = true;
+ break;
+ }
+
+ /* Is this the list of files? */
+ if (strcmp(fname, "Files") == 0)
+ {
+ parse->state = JM_EXPECT_FILES_START;
+ break;
+ }
+
+ /* Is this the list of WAL ranges? */
+ if (strcmp(fname, "WAL-Ranges") == 0)
+ {
+ parse->state = JM_EXPECT_WAL_RANGES_START;
+ break;
+ }
+
+ /* Is this the manifest checksum? */
+ if (strcmp(fname, "Manifest-Checksum") == 0)
+ {
+ parse->state = JM_EXPECT_MANIFEST_CHECKSUM_VALUE;
+ break;
+ }
+
+ /* It's not a field we recognize. */
+ json_manifest_parse_failure(parse->context,
+ "unrecognized top-level field");
+ break;
+
+ case JM_EXPECT_THIS_FILE_FIELD:
+ /* Inside object for one file; which key have we got? */
+ if (strcmp(fname, "Path") == 0)
+ parse->file_field = JMFF_PATH;
+ else if (strcmp(fname, "Encoded-Path") == 0)
+ parse->file_field = JMFF_ENCODED_PATH;
+ else if (strcmp(fname, "Size") == 0)
+ parse->file_field = JMFF_SIZE;
+ else if (strcmp(fname, "Last-Modified") == 0)
+ parse->file_field = JMFF_LAST_MODIFIED;
+ else if (strcmp(fname, "Checksum-Algorithm") == 0)
+ parse->file_field = JMFF_CHECKSUM_ALGORITHM;
+ else if (strcmp(fname, "Checksum") == 0)
+ parse->file_field = JMFF_CHECKSUM;
+ else
+ json_manifest_parse_failure(parse->context,
+ "unexpected file field");
+ parse->state = JM_EXPECT_THIS_FILE_VALUE;
+ break;
+
+ case JM_EXPECT_THIS_WAL_RANGE_FIELD:
+ /* Inside object for one file; which key have we got? */
+ if (strcmp(fname, "Timeline") == 0)
+ parse->wal_range_field = JMWRF_TIMELINE;
+ else if (strcmp(fname, "Start-LSN") == 0)
+ parse->wal_range_field = JMWRF_START_LSN;
+ else if (strcmp(fname, "End-LSN") == 0)
+ parse->wal_range_field = JMWRF_END_LSN;
+ else
+ json_manifest_parse_failure(parse->context,
+ "unexpected WAL range field");
+ parse->state = JM_EXPECT_THIS_WAL_RANGE_VALUE;
+ break;
+
+ default:
+ json_manifest_parse_failure(parse->context,
+ "unexpected object field");
+ break;
+ }
+
+ return JSON_SUCCESS;
+}
+
+/*
+ * Invoked at the start of each scalar in the JSON document.
+ *
+ * Object field names don't reach this code; those are handled by
+ * json_manifest_object_field_start. When we're inside of the object for
+ * a particular file or WAL range, that function will have noticed the name
+ * of the field, and we'll get the corresponding value here. When we're in
+ * the toplevel object, the parse state itself tells us which field this is.
+ *
+ * In all cases except for PostgreSQL-Backup-Manifest-Version, which we
+ * can just check on the spot, the goal here is just to save the value in
+ * the parse state for later use. We don't actually do anything until we
+ * reach either the end of the object representing this file, or the end
+ * of the manifest, as the case may be.
+ */
+static JsonParseErrorType
+json_manifest_scalar(void *state, char *token, JsonTokenType tokentype)
+{
+ JsonManifestParseState *parse = state;
+
+ switch (parse->state)
+ {
+ case JM_EXPECT_VERSION_VALUE:
+ if (strcmp(token, "1") != 0)
+ json_manifest_parse_failure(parse->context,
+ "unexpected manifest version");
+ parse->state = JM_EXPECT_TOPLEVEL_FIELD;
+ break;
+
+ case JM_EXPECT_THIS_FILE_VALUE:
+ switch (parse->file_field)
+ {
+ case JMFF_PATH:
+ parse->pathname = token;
+ break;
+ case JMFF_ENCODED_PATH:
+ parse->encoded_pathname = token;
+ break;
+ case JMFF_SIZE:
+ parse->size = token;
+ break;
+ case JMFF_LAST_MODIFIED:
+ pfree(token); /* unused */
+ break;
+ case JMFF_CHECKSUM_ALGORITHM:
+ parse->algorithm = token;
+ break;
+ case JMFF_CHECKSUM:
+ parse->checksum = token;
+ break;
+ }
+ parse->state = JM_EXPECT_THIS_FILE_FIELD;
+ break;
+
+ case JM_EXPECT_THIS_WAL_RANGE_VALUE:
+ switch (parse->wal_range_field)
+ {
+ case JMWRF_TIMELINE:
+ parse->timeline = token;
+ break;
+ case JMWRF_START_LSN:
+ parse->start_lsn = token;
+ break;
+ case JMWRF_END_LSN:
+ parse->end_lsn = token;
+ break;
+ }
+ parse->state = JM_EXPECT_THIS_WAL_RANGE_FIELD;
+ break;
+
+ case JM_EXPECT_MANIFEST_CHECKSUM_VALUE:
+ parse->state = JM_EXPECT_TOPLEVEL_END;
+ parse->manifest_checksum = token;
+ break;
+
+ default:
+ json_manifest_parse_failure(parse->context, "unexpected scalar");
+ break;
+ }
+
+ return JSON_SUCCESS;
+}
+
+/*
+ * Do additional parsing and sanity-checking of the details gathered for one
+ * file, and invoke the per-file callback so that the caller gets those
+ * details. This happens for each file when the corresponding JSON object is
+ * completely parsed.
+ */
+static void
+json_manifest_finalize_file(JsonManifestParseState *parse)
+{
+ JsonManifestParseContext *context = parse->context;
+ size_t size;
+ char *ep;
+ int checksum_string_length;
+ pg_checksum_type checksum_type;
+ int checksum_length;
+ uint8 *checksum_payload;
+
+ /* Pathname and size are required. */
+ if (parse->pathname == NULL && parse->encoded_pathname == NULL)
+ json_manifest_parse_failure(parse->context, "missing path name");
+ if (parse->pathname != NULL && parse->encoded_pathname != NULL)
+ json_manifest_parse_failure(parse->context,
+ "both path name and encoded path name");
+ if (parse->size == NULL)
+ json_manifest_parse_failure(parse->context, "missing size");
+ if (parse->algorithm == NULL && parse->checksum != NULL)
+ json_manifest_parse_failure(parse->context,
+ "checksum without algorithm");
+
+ /* Decode encoded pathname, if that's what we have. */
+ if (parse->encoded_pathname != NULL)
+ {
+ int encoded_length = strlen(parse->encoded_pathname);
+ int raw_length = encoded_length / 2;
+
+ parse->pathname = palloc(raw_length + 1);
+ if (encoded_length % 2 != 0 ||
+ !hexdecode_string((uint8 *) parse->pathname,
+ parse->encoded_pathname,
+ raw_length))
+ json_manifest_parse_failure(parse->context,
+ "could not decode file name");
+ parse->pathname[raw_length] = '\0';
+ pfree(parse->encoded_pathname);
+ parse->encoded_pathname = NULL;
+ }
+
+ /* Parse size. */
+ size = strtoul(parse->size, &ep, 10);
+ if (*ep)
+ json_manifest_parse_failure(parse->context,
+ "file size is not an integer");
+
+ /* Parse the checksum algorithm, if it's present. */
+ if (parse->algorithm == NULL)
+ checksum_type = CHECKSUM_TYPE_NONE;
+ else if (!pg_checksum_parse_type(parse->algorithm, &checksum_type))
+ context->error_cb(context, "unrecognized checksum algorithm: \"%s\"",
+ parse->algorithm);
+
+ /* Parse the checksum payload, if it's present. */
+ checksum_string_length = parse->checksum == NULL ? 0
+ : strlen(parse->checksum);
+ if (checksum_string_length == 0)
+ {
+ checksum_length = 0;
+ checksum_payload = NULL;
+ }
+ else
+ {
+ checksum_length = checksum_string_length / 2;
+ checksum_payload = palloc(checksum_length);
+ if (checksum_string_length % 2 != 0 ||
+ !hexdecode_string(checksum_payload, parse->checksum,
+ checksum_length))
+ context->error_cb(context,
+ "invalid checksum for file \"%s\": \"%s\"",
+ parse->pathname, parse->checksum);
+ }
+
+ /* Invoke the callback with the details we've gathered. */
+ context->perfile_cb(context, parse->pathname, size,
+ checksum_type, checksum_length, checksum_payload);
+
+ /* Free memory we no longer need. */
+ if (parse->size != NULL)
+ {
+ pfree(parse->size);
+ parse->size = NULL;
+ }
+ if (parse->algorithm != NULL)
+ {
+ pfree(parse->algorithm);
+ parse->algorithm = NULL;
+ }
+ if (parse->checksum != NULL)
+ {
+ pfree(parse->checksum);
+ parse->checksum = NULL;
+ }
+}
+
+/*
+ * Do additional parsing and sanity-checking of the details gathered for one
+ * WAL range, and invoke the per-WAL-range callback so that the caller gets
+ * those details. This happens for each WAL range when the corresponding JSON
+ * object is completely parsed.
+ */
+static void
+json_manifest_finalize_wal_range(JsonManifestParseState *parse)
+{
+ JsonManifestParseContext *context = parse->context;
+ TimeLineID tli;
+ XLogRecPtr start_lsn,
+ end_lsn;
+ char *ep;
+
+ /* Make sure all fields are present. */
+ if (parse->timeline == NULL)
+ json_manifest_parse_failure(parse->context, "missing timeline");
+ if (parse->start_lsn == NULL)
+ json_manifest_parse_failure(parse->context, "missing start LSN");
+ if (parse->end_lsn == NULL)
+ json_manifest_parse_failure(parse->context, "missing end LSN");
+
+ /* Parse timeline. */
+ tli = strtoul(parse->timeline, &ep, 10);
+ if (*ep)
+ json_manifest_parse_failure(parse->context,
+ "timeline is not an integer");
+ if (!parse_xlogrecptr(&start_lsn, parse->start_lsn))
+ json_manifest_parse_failure(parse->context,
+ "could not parse start LSN");
+ if (!parse_xlogrecptr(&end_lsn, parse->end_lsn))
+ json_manifest_parse_failure(parse->context,
+ "could not parse end LSN");
+
+ /* Invoke the callback with the details we've gathered. */
+ context->perwalrange_cb(context, tli, start_lsn, end_lsn);
+
+ /* Free memory we no longer need. */
+ if (parse->timeline != NULL)
+ {
+ pfree(parse->timeline);
+ parse->timeline = NULL;
+ }
+ if (parse->start_lsn != NULL)
+ {
+ pfree(parse->start_lsn);
+ parse->start_lsn = NULL;
+ }
+ if (parse->end_lsn != NULL)
+ {
+ pfree(parse->end_lsn);
+ parse->end_lsn = NULL;
+ }
+}
+
+/*
+ * Verify that the manifest checksum is correct.
+ *
+ * The last line of the manifest file is excluded from the manifest checksum,
+ * because the last line is expected to contain the checksum that covers
+ * the rest of the file.
+ */
+static void
+verify_manifest_checksum(JsonManifestParseState *parse, char *buffer,
+ size_t size)
+{
+ JsonManifestParseContext *context = parse->context;
+ size_t i;
+ size_t number_of_newlines = 0;
+ size_t ultimate_newline = 0;
+ size_t penultimate_newline = 0;
+ pg_cryptohash_ctx *manifest_ctx;
+ uint8 manifest_checksum_actual[PG_SHA256_DIGEST_LENGTH];
+ uint8 manifest_checksum_expected[PG_SHA256_DIGEST_LENGTH];
+
+ /* Find the last two newlines in the file. */
+ for (i = 0; i < size; ++i)
+ {
+ if (buffer[i] == '\n')
+ {
+ ++number_of_newlines;
+ penultimate_newline = ultimate_newline;
+ ultimate_newline = i;
+ }
+ }
+
+ /*
+ * Make sure that the last newline is right at the end, and that there are
+ * at least two lines total. We need this to be true in order for the
+ * following code, which computes the manifest checksum, to work properly.
+ */
+ if (number_of_newlines < 2)
+ json_manifest_parse_failure(parse->context,
+ "expected at least 2 lines");
+ if (ultimate_newline != size - 1)
+ json_manifest_parse_failure(parse->context,
+ "last line not newline-terminated");
+
+ /* Checksum the rest. */
+ manifest_ctx = pg_cryptohash_create(PG_SHA256);
+ if (manifest_ctx == NULL)
+ context->error_cb(context, "out of memory");
+ if (pg_cryptohash_init(manifest_ctx) < 0)
+ context->error_cb(context, "could not initialize checksum of manifest");
+ if (pg_cryptohash_update(manifest_ctx, (uint8 *) buffer, penultimate_newline + 1) < 0)
+ context->error_cb(context, "could not update checksum of manifest");
+ if (pg_cryptohash_final(manifest_ctx, manifest_checksum_actual,
+ sizeof(manifest_checksum_actual)) < 0)
+ context->error_cb(context, "could not finalize checksum of manifest");
+
+ /* Now verify it. */
+ if (parse->manifest_checksum == NULL)
+ context->error_cb(parse->context, "manifest has no checksum");
+ if (strlen(parse->manifest_checksum) != PG_SHA256_DIGEST_LENGTH * 2 ||
+ !hexdecode_string(manifest_checksum_expected, parse->manifest_checksum,
+ PG_SHA256_DIGEST_LENGTH))
+ context->error_cb(context, "invalid manifest checksum: \"%s\"",
+ parse->manifest_checksum);
+ if (memcmp(manifest_checksum_actual, manifest_checksum_expected,
+ PG_SHA256_DIGEST_LENGTH) != 0)
+ context->error_cb(context, "manifest checksum mismatch");
+ pg_cryptohash_free(manifest_ctx);
+}
+
+/*
+ * Report a parse error.
+ *
+ * This is intended to be used for fairly low-level failures that probably
+ * shouldn't occur unless somebody has deliberately constructed a bad manifest,
+ * or unless the server is generating bad manifests due to some bug. msg should
+ * be a short string giving some hint as to what the problem is.
+ */
+static void
+json_manifest_parse_failure(JsonManifestParseContext *context, char *msg)
+{
+ context->error_cb(context, "could not parse backup manifest: %s", msg);
+}
+
+/*
+ * Convert a character which represents a hexadecimal digit to an integer.
+ *
+ * Returns -1 if the character is not a hexadecimal digit.
+ */
+static int
+hexdecode_char(char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+
+ return -1;
+}
+
+/*
+ * Decode a hex string into a byte string, 2 hex chars per byte.
+ *
+ * Returns false if invalid characters are encountered; otherwise true.
+ */
+static bool
+hexdecode_string(uint8 *result, char *input, int nbytes)
+{
+ int i;
+
+ for (i = 0; i < nbytes; ++i)
+ {
+ int n1 = hexdecode_char(input[i * 2]);
+ int n2 = hexdecode_char(input[i * 2 + 1]);
+
+ if (n1 < 0 || n2 < 0)
+ return false;
+ result[i] = n1 * 16 + n2;
+ }
+
+ return true;
+}
+
+/*
+ * Parse an XLogRecPtr expressed using the usual string format.
+ */
+static bool
+parse_xlogrecptr(XLogRecPtr *result, char *input)
+{
+ uint32 hi;
+ uint32 lo;
+
+ if (sscanf(input, "%X/%X", &hi, &lo) != 2)
+ return false;
+ *result = ((uint64) hi) << 32 | lo;
+ return true;
+}
diff --git a/src/bin/pg_verifybackup/parse_manifest.h b/src/bin/pg_verifybackup/parse_manifest.h
new file mode 100644
index 0000000..7387a91
--- /dev/null
+++ b/src/bin/pg_verifybackup/parse_manifest.h
@@ -0,0 +1,46 @@
+/*-------------------------------------------------------------------------
+ *
+ * parse_manifest.h
+ * Parse a backup manifest in JSON format.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_verifybackup/parse_manifest.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PARSE_MANIFEST_H
+#define PARSE_MANIFEST_H
+
+#include "access/xlogdefs.h"
+#include "common/checksum_helper.h"
+#include "mb/pg_wchar.h"
+
+struct JsonManifestParseContext;
+typedef struct JsonManifestParseContext JsonManifestParseContext;
+
+typedef void (*json_manifest_perfile_callback) (JsonManifestParseContext *,
+ char *pathname,
+ size_t size, pg_checksum_type checksum_type,
+ int checksum_length, uint8 *checksum_payload);
+typedef void (*json_manifest_perwalrange_callback) (JsonManifestParseContext *,
+ TimeLineID tli,
+ XLogRecPtr start_lsn, XLogRecPtr end_lsn);
+typedef void (*json_manifest_error_callback) (JsonManifestParseContext *,
+ const char *fmt,...) pg_attribute_printf(2, 3)
+ pg_attribute_noreturn();
+
+struct JsonManifestParseContext
+{
+ void *private_data;
+ json_manifest_perfile_callback perfile_cb;
+ json_manifest_perwalrange_callback perwalrange_cb;
+ json_manifest_error_callback error_cb;
+};
+
+extern void json_parse_manifest(JsonManifestParseContext *context,
+ char *buffer, size_t size);
+
+#endif
diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c
new file mode 100644
index 0000000..059836f
--- /dev/null
+++ b/src/bin/pg_verifybackup/pg_verifybackup.c
@@ -0,0 +1,997 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_verifybackup.c
+ * Verify a backup against a backup manifest.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_verifybackup/pg_verifybackup.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <time.h>
+
+#include "common/hashfn.h"
+#include "common/logging.h"
+#include "fe_utils/simple_list.h"
+#include "getopt_long.h"
+#include "parse_manifest.h"
+#include "pgtime.h"
+
+/*
+ * For efficiency, we'd like our hash table containing information about the
+ * manifest to start out with approximately the correct number of entries.
+ * There's no way to know the exact number of entries without reading the whole
+ * file, but we can get an estimate by dividing the file size by the estimated
+ * number of bytes per line.
+ *
+ * This could be off by about a factor of two in either direction, because the
+ * checksum algorithm has a big impact on the line lengths; e.g. a SHA512
+ * checksum is 128 hex bytes, whereas a CRC-32C value is only 8, and there
+ * might be no checksum at all.
+ */
+#define ESTIMATED_BYTES_PER_MANIFEST_LINE 100
+
+/*
+ * How many bytes should we try to read from a file at once?
+ */
+#define READ_CHUNK_SIZE 4096
+
+/*
+ * Each file described by the manifest file is parsed to produce an object
+ * like this.
+ */
+typedef struct manifest_file
+{
+ uint32 status; /* hash status */
+ char *pathname;
+ size_t size;
+ pg_checksum_type checksum_type;
+ int checksum_length;
+ uint8 *checksum_payload;
+ bool matched;
+ bool bad;
+} manifest_file;
+
+#define should_verify_checksum(m) \
+ (((m)->matched) && !((m)->bad) && (((m)->checksum_type) != CHECKSUM_TYPE_NONE))
+
+/*
+ * Define a hash table which we can use to store information about the files
+ * mentioned in the backup manifest.
+ */
+static uint32 hash_string_pointer(char *s);
+#define SH_PREFIX manifest_files
+#define SH_ELEMENT_TYPE manifest_file
+#define SH_KEY_TYPE char *
+#define SH_KEY pathname
+#define SH_HASH_KEY(tb, key) hash_string_pointer(key)
+#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0)
+#define SH_SCOPE static inline
+#define SH_RAW_ALLOCATOR pg_malloc0
+#define SH_DECLARE
+#define SH_DEFINE
+#include "lib/simplehash.h"
+
+/*
+ * Each WAL range described by the manifest file is parsed to produce an
+ * object like this.
+ */
+typedef struct manifest_wal_range
+{
+ TimeLineID tli;
+ XLogRecPtr start_lsn;
+ XLogRecPtr end_lsn;
+ struct manifest_wal_range *next;
+ struct manifest_wal_range *prev;
+} manifest_wal_range;
+
+/*
+ * Details we need in callbacks that occur while parsing a backup manifest.
+ */
+typedef struct parser_context
+{
+ manifest_files_hash *ht;
+ manifest_wal_range *first_wal_range;
+ manifest_wal_range *last_wal_range;
+} parser_context;
+
+/*
+ * All of the context information we need while checking a backup manifest.
+ */
+typedef struct verifier_context
+{
+ manifest_files_hash *ht;
+ char *backup_directory;
+ SimpleStringList ignore_list;
+ bool exit_on_error;
+ bool saw_any_error;
+} verifier_context;
+
+static void parse_manifest_file(char *manifest_path,
+ manifest_files_hash **ht_p,
+ manifest_wal_range **first_wal_range_p);
+
+static void record_manifest_details_for_file(JsonManifestParseContext *context,
+ char *pathname, size_t size,
+ pg_checksum_type checksum_type,
+ int checksum_length,
+ uint8 *checksum_payload);
+static void record_manifest_details_for_wal_range(JsonManifestParseContext *context,
+ TimeLineID tli,
+ XLogRecPtr start_lsn,
+ XLogRecPtr end_lsn);
+static void report_manifest_error(JsonManifestParseContext *context,
+ const char *fmt,...)
+ pg_attribute_printf(2, 3) pg_attribute_noreturn();
+
+static void verify_backup_directory(verifier_context *context,
+ char *relpath, char *fullpath);
+static void verify_backup_file(verifier_context *context,
+ char *relpath, char *fullpath);
+static void report_extra_backup_files(verifier_context *context);
+static void verify_backup_checksums(verifier_context *context);
+static void verify_file_checksum(verifier_context *context,
+ manifest_file *m, char *fullpath);
+static void parse_required_wal(verifier_context *context,
+ char *pg_waldump_path,
+ char *wal_directory,
+ manifest_wal_range *first_wal_range);
+
+static void report_backup_error(verifier_context *context,
+ const char *pg_restrict fmt,...)
+ pg_attribute_printf(2, 3);
+static void report_fatal_error(const char *pg_restrict fmt,...)
+ pg_attribute_printf(1, 2) pg_attribute_noreturn();
+static bool should_ignore_relpath(verifier_context *context, char *relpath);
+
+static void progress_report(bool finished);
+static void usage(void);
+
+static const char *progname;
+
+/* options */
+static bool show_progress = false;
+static bool skip_checksums = false;
+
+/* Progress indicators */
+static uint64 total_size = 0;
+static uint64 done_size = 0;
+
+/*
+ * Main entry point.
+ */
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ {"exit-on-error", no_argument, NULL, 'e'},
+ {"ignore", required_argument, NULL, 'i'},
+ {"manifest-path", required_argument, NULL, 'm'},
+ {"no-parse-wal", no_argument, NULL, 'n'},
+ {"progress", no_argument, NULL, 'P'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"skip-checksums", no_argument, NULL, 's'},
+ {"wal-directory", required_argument, NULL, 'w'},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ verifier_context context;
+ manifest_wal_range *first_wal_range;
+ char *manifest_path = NULL;
+ bool no_parse_wal = false;
+ bool quiet = false;
+ char *wal_directory = NULL;
+ char *pg_waldump_path = NULL;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_verifybackup"));
+ progname = get_progname(argv[0]);
+
+ memset(&context, 0, sizeof(context));
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_verifybackup (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /*
+ * Skip certain files in the toplevel directory.
+ *
+ * Ignore the backup_manifest file, because it's not included in the
+ * backup manifest.
+ *
+ * Ignore the pg_wal directory, because those files are not included in
+ * the backup manifest either, since they are fetched separately from the
+ * backup itself, and verified via a separate mechanism.
+ *
+ * Ignore postgresql.auto.conf, recovery.signal, and standby.signal,
+ * because we expect that those files may sometimes be created or changed
+ * as part of the backup process. For example, pg_basebackup -R will
+ * modify postgresql.auto.conf and create standby.signal.
+ */
+ simple_string_list_append(&context.ignore_list, "backup_manifest");
+ simple_string_list_append(&context.ignore_list, "pg_wal");
+ simple_string_list_append(&context.ignore_list, "postgresql.auto.conf");
+ simple_string_list_append(&context.ignore_list, "recovery.signal");
+ simple_string_list_append(&context.ignore_list, "standby.signal");
+
+ while ((c = getopt_long(argc, argv, "ei:m:nPqsw:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'e':
+ context.exit_on_error = true;
+ break;
+ case 'i':
+ {
+ char *arg = pstrdup(optarg);
+
+ canonicalize_path(arg);
+ simple_string_list_append(&context.ignore_list, arg);
+ break;
+ }
+ case 'm':
+ manifest_path = pstrdup(optarg);
+ canonicalize_path(manifest_path);
+ break;
+ case 'n':
+ no_parse_wal = true;
+ break;
+ case 'P':
+ show_progress = true;
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 's':
+ skip_checksums = true;
+ break;
+ case 'w':
+ wal_directory = pstrdup(optarg);
+ canonicalize_path(wal_directory);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* Get backup directory name */
+ if (optind >= argc)
+ {
+ pg_log_error("no backup directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ context.backup_directory = pstrdup(argv[optind++]);
+ canonicalize_path(context.backup_directory);
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* Complain if the specified arguments conflict */
+ if (show_progress && quiet)
+ pg_fatal("cannot specify both %s and %s",
+ "-P/--progress", "-q/--quiet");
+
+ /* Unless --no-parse-wal was specified, we will need pg_waldump. */
+ if (!no_parse_wal)
+ {
+ int ret;
+
+ pg_waldump_path = pg_malloc(MAXPGPATH);
+ ret = find_other_exec(argv[0], "pg_waldump",
+ "pg_waldump (PostgreSQL) " PG_VERSION "\n",
+ pg_waldump_path);
+ if (ret < 0)
+ {
+ char full_path[MAXPGPATH];
+
+ if (find_my_exec(argv[0], full_path) < 0)
+ strlcpy(full_path, progname, sizeof(full_path));
+
+ if (ret == -1)
+ pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"",
+ "pg_waldump", "pg_verifybackup", full_path);
+ else
+ pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s",
+ "pg_waldump", full_path, "pg_verifybackup");
+ }
+ }
+
+ /* By default, look for the manifest in the backup directory. */
+ if (manifest_path == NULL)
+ manifest_path = psprintf("%s/backup_manifest",
+ context.backup_directory);
+
+ /* By default, look for the WAL in the backup directory, too. */
+ if (wal_directory == NULL)
+ wal_directory = psprintf("%s/pg_wal", context.backup_directory);
+
+ /*
+ * Try to read the manifest. We treat any errors encountered while parsing
+ * the manifest as fatal; there doesn't seem to be much point in trying to
+ * verify the backup directory against a corrupted manifest.
+ */
+ parse_manifest_file(manifest_path, &context.ht, &first_wal_range);
+
+ /*
+ * Now scan the files in the backup directory. At this stage, we verify
+ * that every file on disk is present in the manifest and that the sizes
+ * match. We also set the "matched" flag on every manifest entry that
+ * corresponds to a file on disk.
+ */
+ verify_backup_directory(&context, NULL, context.backup_directory);
+
+ /*
+ * The "matched" flag should now be set on every entry in the hash table.
+ * Any entries for which the bit is not set are files mentioned in the
+ * manifest that don't exist on disk.
+ */
+ report_extra_backup_files(&context);
+
+ /*
+ * Now do the expensive work of verifying file checksums, unless we were
+ * told to skip it.
+ */
+ if (!skip_checksums)
+ verify_backup_checksums(&context);
+
+ /*
+ * Try to parse the required ranges of WAL records, unless we were told
+ * not to do so.
+ */
+ if (!no_parse_wal)
+ parse_required_wal(&context, pg_waldump_path,
+ wal_directory, first_wal_range);
+
+ /*
+ * If everything looks OK, tell the user this, unless we were asked to
+ * work quietly.
+ */
+ if (!context.saw_any_error && !quiet)
+ printf(_("backup successfully verified\n"));
+
+ return context.saw_any_error ? 1 : 0;
+}
+
+/*
+ * Parse a manifest file. Construct a hash table with information about
+ * all the files it mentions, and a linked list of all the WAL ranges it
+ * mentions.
+ */
+static void
+parse_manifest_file(char *manifest_path, manifest_files_hash **ht_p,
+ manifest_wal_range **first_wal_range_p)
+{
+ int fd;
+ struct stat statbuf;
+ off_t estimate;
+ uint32 initial_size;
+ manifest_files_hash *ht;
+ char *buffer;
+ int rc;
+ parser_context private_context;
+ JsonManifestParseContext context;
+
+ /* Open the manifest file. */
+ if ((fd = open(manifest_path, O_RDONLY | PG_BINARY, 0)) < 0)
+ report_fatal_error("could not open file \"%s\": %m", manifest_path);
+
+ /* Figure out how big the manifest is. */
+ if (fstat(fd, &statbuf) != 0)
+ report_fatal_error("could not stat file \"%s\": %m", manifest_path);
+
+ /* Guess how large to make the hash table based on the manifest size. */
+ estimate = statbuf.st_size / ESTIMATED_BYTES_PER_MANIFEST_LINE;
+ initial_size = Min(PG_UINT32_MAX, Max(estimate, 256));
+
+ /* Create the hash table. */
+ ht = manifest_files_create(initial_size, NULL);
+
+ /*
+ * Slurp in the whole file.
+ *
+ * This is not ideal, but there's currently no easy way to get
+ * pg_parse_json() to perform incremental parsing.
+ */
+ buffer = pg_malloc(statbuf.st_size);
+ rc = read(fd, buffer, statbuf.st_size);
+ if (rc != statbuf.st_size)
+ {
+ if (rc < 0)
+ report_fatal_error("could not read file \"%s\": %m",
+ manifest_path);
+ else
+ report_fatal_error("could not read file \"%s\": read %d of %lld",
+ manifest_path, rc, (long long int) statbuf.st_size);
+ }
+
+ /* Close the manifest file. */
+ close(fd);
+
+ /* Parse the manifest. */
+ private_context.ht = ht;
+ private_context.first_wal_range = NULL;
+ private_context.last_wal_range = NULL;
+ context.private_data = &private_context;
+ context.perfile_cb = record_manifest_details_for_file;
+ context.perwalrange_cb = record_manifest_details_for_wal_range;
+ context.error_cb = report_manifest_error;
+ json_parse_manifest(&context, buffer, statbuf.st_size);
+
+ /* Done with the buffer. */
+ pfree(buffer);
+
+ /* Return the file hash table and WAL range list we constructed. */
+ *ht_p = ht;
+ *first_wal_range_p = private_context.first_wal_range;
+}
+
+/*
+ * Report an error while parsing the manifest.
+ *
+ * We consider all such errors to be fatal errors. The manifest parser
+ * expects this function not to return.
+ */
+static void
+report_manifest_error(JsonManifestParseContext *context, const char *fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap);
+ va_end(ap);
+
+ exit(1);
+}
+
+/*
+ * Record details extracted from the backup manifest for one file.
+ */
+static void
+record_manifest_details_for_file(JsonManifestParseContext *context,
+ char *pathname, size_t size,
+ pg_checksum_type checksum_type,
+ int checksum_length, uint8 *checksum_payload)
+{
+ parser_context *pcxt = context->private_data;
+ manifest_files_hash *ht = pcxt->ht;
+ manifest_file *m;
+ bool found;
+
+ /* Make a new entry in the hash table for this file. */
+ m = manifest_files_insert(ht, pathname, &found);
+ if (found)
+ report_fatal_error("duplicate path name in backup manifest: \"%s\"",
+ pathname);
+
+ /* Initialize the entry. */
+ m->size = size;
+ m->checksum_type = checksum_type;
+ m->checksum_length = checksum_length;
+ m->checksum_payload = checksum_payload;
+ m->matched = false;
+ m->bad = false;
+}
+
+/*
+ * Record details extracted from the backup manifest for one WAL range.
+ */
+static void
+record_manifest_details_for_wal_range(JsonManifestParseContext *context,
+ TimeLineID tli,
+ XLogRecPtr start_lsn, XLogRecPtr end_lsn)
+{
+ parser_context *pcxt = context->private_data;
+ manifest_wal_range *range;
+
+ /* Allocate and initialize a struct describing this WAL range. */
+ range = palloc(sizeof(manifest_wal_range));
+ range->tli = tli;
+ range->start_lsn = start_lsn;
+ range->end_lsn = end_lsn;
+ range->prev = pcxt->last_wal_range;
+ range->next = NULL;
+
+ /* Add it to the end of the list. */
+ if (pcxt->first_wal_range == NULL)
+ pcxt->first_wal_range = range;
+ else
+ pcxt->last_wal_range->next = range;
+ pcxt->last_wal_range = range;
+}
+
+/*
+ * Verify one directory.
+ *
+ * 'relpath' is NULL if we are to verify the top-level backup directory,
+ * and otherwise the relative path to the directory that is to be verified.
+ *
+ * 'fullpath' is the backup directory with 'relpath' appended; i.e. the actual
+ * filesystem path at which it can be found.
+ */
+static void
+verify_backup_directory(verifier_context *context, char *relpath,
+ char *fullpath)
+{
+ DIR *dir;
+ struct dirent *dirent;
+
+ dir = opendir(fullpath);
+ if (dir == NULL)
+ {
+ /*
+ * If even the toplevel backup directory cannot be found, treat this
+ * as a fatal error.
+ */
+ if (relpath == NULL)
+ report_fatal_error("could not open directory \"%s\": %m", fullpath);
+
+ /*
+ * Otherwise, treat this as a non-fatal error, but ignore any further
+ * errors related to this path and anything beneath it.
+ */
+ report_backup_error(context,
+ "could not open directory \"%s\": %m", fullpath);
+ simple_string_list_append(&context->ignore_list, relpath);
+
+ return;
+ }
+
+ while (errno = 0, (dirent = readdir(dir)) != NULL)
+ {
+ char *filename = dirent->d_name;
+ char *newfullpath = psprintf("%s/%s", fullpath, filename);
+ char *newrelpath;
+
+ /* Skip "." and ".." */
+ if (filename[0] == '.' && (filename[1] == '\0'
+ || strcmp(filename, "..") == 0))
+ continue;
+
+ if (relpath == NULL)
+ newrelpath = pstrdup(filename);
+ else
+ newrelpath = psprintf("%s/%s", relpath, filename);
+
+ if (!should_ignore_relpath(context, newrelpath))
+ verify_backup_file(context, newrelpath, newfullpath);
+
+ pfree(newfullpath);
+ pfree(newrelpath);
+ }
+
+ if (closedir(dir))
+ {
+ report_backup_error(context,
+ "could not close directory \"%s\": %m", fullpath);
+ return;
+ }
+}
+
+/*
+ * Verify one file (which might actually be a directory or a symlink).
+ *
+ * The arguments to this function have the same meaning as the arguments to
+ * verify_backup_directory.
+ */
+static void
+verify_backup_file(verifier_context *context, char *relpath, char *fullpath)
+{
+ struct stat sb;
+ manifest_file *m;
+
+ if (stat(fullpath, &sb) != 0)
+ {
+ report_backup_error(context,
+ "could not stat file or directory \"%s\": %m",
+ relpath);
+
+ /*
+ * Suppress further errors related to this path name and, if it's a
+ * directory, anything underneath it.
+ */
+ simple_string_list_append(&context->ignore_list, relpath);
+
+ return;
+ }
+
+ /* If it's a directory, just recurse. */
+ if (S_ISDIR(sb.st_mode))
+ {
+ verify_backup_directory(context, relpath, fullpath);
+ return;
+ }
+
+ /* If it's not a directory, it should be a plain file. */
+ if (!S_ISREG(sb.st_mode))
+ {
+ report_backup_error(context,
+ "\"%s\" is not a file or directory",
+ relpath);
+ return;
+ }
+
+ /* Check whether there's an entry in the manifest hash. */
+ m = manifest_files_lookup(context->ht, relpath);
+ if (m == NULL)
+ {
+ report_backup_error(context,
+ "\"%s\" is present on disk but not in the manifest",
+ relpath);
+ return;
+ }
+
+ /* Flag this entry as having been encountered in the filesystem. */
+ m->matched = true;
+
+ /* Check that the size matches. */
+ if (m->size != sb.st_size)
+ {
+ report_backup_error(context,
+ "\"%s\" has size %lld on disk but size %zu in the manifest",
+ relpath, (long long int) sb.st_size, m->size);
+ m->bad = true;
+ }
+
+ /* Update statistics for progress report, if necessary */
+ if (show_progress && !skip_checksums && should_verify_checksum(m))
+ total_size += m->size;
+
+ /*
+ * We don't verify checksums at this stage. We first finish verifying that
+ * we have the expected set of files with the expected sizes, and only
+ * afterwards verify the checksums. That's because computing checksums may
+ * take a while, and we'd like to report more obvious problems quickly.
+ */
+}
+
+/*
+ * Scan the hash table for entries where the 'matched' flag is not set; report
+ * that such files are present in the manifest but not on disk.
+ */
+static void
+report_extra_backup_files(verifier_context *context)
+{
+ manifest_files_iterator it;
+ manifest_file *m;
+
+ manifest_files_start_iterate(context->ht, &it);
+ while ((m = manifest_files_iterate(context->ht, &it)) != NULL)
+ if (!m->matched && !should_ignore_relpath(context, m->pathname))
+ report_backup_error(context,
+ "\"%s\" is present in the manifest but not on disk",
+ m->pathname);
+}
+
+/*
+ * Verify checksums for hash table entries that are otherwise unproblematic.
+ * If we've already reported some problem related to a hash table entry, or
+ * if it has no checksum, just skip it.
+ */
+static void
+verify_backup_checksums(verifier_context *context)
+{
+ manifest_files_iterator it;
+ manifest_file *m;
+
+ progress_report(false);
+
+ manifest_files_start_iterate(context->ht, &it);
+ while ((m = manifest_files_iterate(context->ht, &it)) != NULL)
+ {
+ if (should_verify_checksum(m) &&
+ !should_ignore_relpath(context, m->pathname))
+ {
+ char *fullpath;
+
+ /* Compute the full pathname to the target file. */
+ fullpath = psprintf("%s/%s", context->backup_directory,
+ m->pathname);
+
+ /* Do the actual checksum verification. */
+ verify_file_checksum(context, m, fullpath);
+
+ /* Avoid leaking memory. */
+ pfree(fullpath);
+ }
+ }
+
+ progress_report(true);
+}
+
+/*
+ * Verify the checksum of a single file.
+ */
+static void
+verify_file_checksum(verifier_context *context, manifest_file *m,
+ char *fullpath)
+{
+ pg_checksum_context checksum_ctx;
+ char *relpath = m->pathname;
+ int fd;
+ int rc;
+ size_t bytes_read = 0;
+ uint8 buffer[READ_CHUNK_SIZE];
+ uint8 checksumbuf[PG_CHECKSUM_MAX_LENGTH];
+ int checksumlen;
+
+ /* Open the target file. */
+ if ((fd = open(fullpath, O_RDONLY | PG_BINARY, 0)) < 0)
+ {
+ report_backup_error(context, "could not open file \"%s\": %m",
+ relpath);
+ return;
+ }
+
+ /* Initialize checksum context. */
+ if (pg_checksum_init(&checksum_ctx, m->checksum_type) < 0)
+ {
+ report_backup_error(context, "could not initialize checksum of file \"%s\"",
+ relpath);
+ close(fd);
+ return;
+ }
+
+ /* Read the file chunk by chunk, updating the checksum as we go. */
+ while ((rc = read(fd, buffer, READ_CHUNK_SIZE)) > 0)
+ {
+ bytes_read += rc;
+ if (pg_checksum_update(&checksum_ctx, buffer, rc) < 0)
+ {
+ report_backup_error(context, "could not update checksum of file \"%s\"",
+ relpath);
+ close(fd);
+ return;
+ }
+
+ /* Report progress */
+ done_size += rc;
+ progress_report(false);
+ }
+ if (rc < 0)
+ report_backup_error(context, "could not read file \"%s\": %m",
+ relpath);
+
+ /* Close the file. */
+ if (close(fd) != 0)
+ {
+ report_backup_error(context, "could not close file \"%s\": %m",
+ relpath);
+ return;
+ }
+
+ /* If we didn't manage to read the whole file, bail out now. */
+ if (rc < 0)
+ return;
+
+ /*
+ * Double-check that we read the expected number of bytes from the file.
+ * Normally, a file size mismatch would be caught in verify_backup_file
+ * and this check would never be reached, but this provides additional
+ * safety and clarity in the event of concurrent modifications or
+ * filesystem misbehavior.
+ */
+ if (bytes_read != m->size)
+ {
+ report_backup_error(context,
+ "file \"%s\" should contain %zu bytes, but read %zu bytes",
+ relpath, m->size, bytes_read);
+ return;
+ }
+
+ /* Get the final checksum. */
+ checksumlen = pg_checksum_final(&checksum_ctx, checksumbuf);
+ if (checksumlen < 0)
+ {
+ report_backup_error(context,
+ "could not finalize checksum of file \"%s\"",
+ relpath);
+ return;
+ }
+
+ /* And check it against the manifest. */
+ if (checksumlen != m->checksum_length)
+ report_backup_error(context,
+ "file \"%s\" has checksum of length %d, but expected %d",
+ relpath, m->checksum_length, checksumlen);
+ else if (memcmp(checksumbuf, m->checksum_payload, checksumlen) != 0)
+ report_backup_error(context,
+ "checksum mismatch for file \"%s\"",
+ relpath);
+}
+
+/*
+ * Attempt to parse the WAL files required to restore from backup using
+ * pg_waldump.
+ */
+static void
+parse_required_wal(verifier_context *context, char *pg_waldump_path,
+ char *wal_directory, manifest_wal_range *first_wal_range)
+{
+ manifest_wal_range *this_wal_range = first_wal_range;
+
+ while (this_wal_range != NULL)
+ {
+ char *pg_waldump_cmd;
+
+ pg_waldump_cmd = psprintf("\"%s\" --quiet --path=\"%s\" --timeline=%u --start=%X/%X --end=%X/%X\n",
+ pg_waldump_path, wal_directory, this_wal_range->tli,
+ LSN_FORMAT_ARGS(this_wal_range->start_lsn),
+ LSN_FORMAT_ARGS(this_wal_range->end_lsn));
+ fflush(NULL);
+ if (system(pg_waldump_cmd) != 0)
+ report_backup_error(context,
+ "WAL parsing failed for timeline %u",
+ this_wal_range->tli);
+
+ this_wal_range = this_wal_range->next;
+ }
+}
+
+/*
+ * Report a problem with the backup.
+ *
+ * Update the context to indicate that we saw an error, and exit if the
+ * context says we should.
+ */
+static void
+report_backup_error(verifier_context *context, const char *pg_restrict fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap);
+ va_end(ap);
+
+ context->saw_any_error = true;
+ if (context->exit_on_error)
+ exit(1);
+}
+
+/*
+ * Report a fatal error and exit
+ */
+static void
+report_fatal_error(const char *pg_restrict fmt,...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap);
+ va_end(ap);
+
+ exit(1);
+}
+
+/*
+ * Is the specified relative path, or some prefix of it, listed in the set
+ * of paths to ignore?
+ *
+ * Note that by "prefix" we mean a parent directory; for this purpose,
+ * "aa/bb" is not a prefix of "aa/bbb", but it is a prefix of "aa/bb/cc".
+ */
+static bool
+should_ignore_relpath(verifier_context *context, char *relpath)
+{
+ SimpleStringListCell *cell;
+
+ for (cell = context->ignore_list.head; cell != NULL; cell = cell->next)
+ {
+ char *r = relpath;
+ char *v = cell->val;
+
+ while (*v != '\0' && *r == *v)
+ ++r, ++v;
+
+ if (*v == '\0' && (*r == '\0' || *r == '/'))
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Helper function for manifest_files hash table.
+ */
+static uint32
+hash_string_pointer(char *s)
+{
+ unsigned char *ss = (unsigned char *) s;
+
+ return hash_bytes(ss, strlen(s));
+}
+
+/*
+ * Print a progress report based on the global variables.
+ *
+ * Progress report is written at maximum once per second, unless the finished
+ * parameter is set to true.
+ *
+ * If finished is set to true, this is the last progress report. The cursor
+ * is moved to the next line.
+ */
+static void
+progress_report(bool finished)
+{
+ static pg_time_t last_progress_report = 0;
+ pg_time_t now;
+ int percent_size = 0;
+ char totalsize_str[32];
+ char donesize_str[32];
+
+ if (!show_progress)
+ return;
+
+ now = time(NULL);
+ if (now == last_progress_report && !finished)
+ return; /* Max once per second */
+
+ last_progress_report = now;
+ percent_size = total_size ? (int) ((done_size * 100 / total_size)) : 0;
+
+ snprintf(totalsize_str, sizeof(totalsize_str), UINT64_FORMAT,
+ total_size / 1024);
+ snprintf(donesize_str, sizeof(donesize_str), UINT64_FORMAT,
+ done_size / 1024);
+
+ fprintf(stderr,
+ _("%*s/%s kB (%d%%) verified"),
+ (int) strlen(totalsize_str),
+ donesize_str, totalsize_str, percent_size);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+/*
+ * Print out usage information and exit.
+ */
+static void
+usage(void)
+{
+ printf(_("%s verifies a backup against the backup manifest.\n\n"), progname);
+ printf(_("Usage:\n %s [OPTION]... BACKUPDIR\n\n"), progname);
+ printf(_("Options:\n"));
+ printf(_(" -e, --exit-on-error exit immediately on error\n"));
+ printf(_(" -i, --ignore=RELATIVE_PATH ignore indicated path\n"));
+ printf(_(" -m, --manifest-path=PATH use specified path for manifest\n"));
+ printf(_(" -n, --no-parse-wal do not try to parse WAL files\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -q, --quiet do not print any output, except for errors\n"));
+ printf(_(" -s, --skip-checksums skip checksum verification\n"));
+ printf(_(" -w, --wal-directory=PATH use specified path for WAL files\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/pg_verifybackup/po/LINGUAS b/src/bin/pg_verifybackup/po/LINGUAS
new file mode 100644
index 0000000..2358abb
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/LINGUAS
@@ -0,0 +1 @@
+de el es fr it ja ka ko ru sv uk zh_CN zh_TW
diff --git a/src/bin/pg_verifybackup/po/de.po b/src/bin/pg_verifybackup/po/de.po
new file mode 100644
index 0000000..a7a366c
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/de.po
@@ -0,0 +1,518 @@
+# German message translation file for pg_verifybackup
+# Copyright (C) 2020-2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-26 12:47+0000\n"
+"PO-Revision-Date: 2023-04-26 15:04+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Escape-Sequenz »\\%s« ist nicht gültig."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Zeichen mit Wert 0x%02x muss escapt werden."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Ende der Eingabe erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "»,« oder »]« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "»:« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "JSON-Wert erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "Die Eingabezeichenkette endete unerwartet."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "»,« oder »}« erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Zeichenkette erwartet, aber »%s« gefunden."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Token »%s« ist ungültig."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 kann nicht in »text« umgewandelt werden."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Unicode-Escape-Wert konnte nicht in die Serverkodierung %s umgewandelt werden."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "Parsen fehlgeschlagen"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "Manifest endete unerwartet"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "unerwarteter Objektstart"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "unerwartetes Objektende"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "unerwarteter Array-Start"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "unerwartetes Array-Ende"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "unerwartete Versionskennzeichnung"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "unbekanntes Feld auf oberster Ebene"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "unerwartetes Feld für Datei"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "unerwartetes Feld für WAL-Bereich"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "unbekanntes Feld für Objekt"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "unerwartete Manifestversion"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "unerwarteter Skalar"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "fehlender Pfadname"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "sowohl Pfadname als auch kodierter Pfadname angegeben"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "Größenangabe fehlt"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "Prüfsumme ohne Algorithmus"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "konnte Dateinamen nicht dekodieren"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "Dateigröße ist keine ganze Zahl"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "unbekannter Prüfsummenalgorithmus: »%s«"
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "ungültige Prüfsumme für Datei »%s«: »%s«"
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "Zeitleiste fehlt"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "Start-LSN fehlt"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "End-LSN fehlt"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "Zeitleiste ist keine ganze Zahl"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "konnte Start-LSN nicht parsen"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "konnte End-LSN nicht parsen"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "mindestens 2 Zeilen erwartet"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "letzte Zeile nicht durch Newline abgeschlossen"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "konnte Prüfsumme des Manifests nicht initialisieren"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "konnte Prüfsumme des Manifests nicht aktualisieren"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "konnte Prüfsumme des Manifests nicht abschließen"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "Manifest hat keine Prüfsumme"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "ungültige Manifestprüfsumme: »%s«"
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "Manifestprüfsumme stimmt nicht überein"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "konnte Backup-Manifest nicht parsen: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "kein Backup-Verzeichnis angegeben"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "%s und %s können nicht beide angegeben werden"
+
+#: pg_verifybackup.c:319
+#, 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_verifybackup.c:322
+#, 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_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "Backup erfolgreich überprüft\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "doppelter Pfadname im Backup-Manifest: »%s«"
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht schließen: %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "»%s« ist keine Datei und kein Verzeichnis"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "»%s« ist auf der Festplatte vorhanden, aber nicht im Manifest"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "»%s« hat Größe %lld auf Festplatte aber Größe %zu im Manifest"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "»%s« steht im Manifest, ist aber nicht auf der Festplatte vorhanden"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "konnte Prüfsumme der Datei »%s« nicht initialisieren"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "konnte Prüfsumme der Datei »%s« nicht aktualisieren"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "Datei »%s« sollte %zu Bytes enthalten, aber %zu Bytes wurden gelesen"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "konnte Prüfsumme der Datei »%s« nicht abschließen"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "Datei »%s« hat Prüfsumme mit Länge %d, aber %d wurde erwartet"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "Prüfsumme stimmt nicht überein für Datei »%s«"
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "Parsen des WAL fehlgeschlagen für Zeitleiste %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s kB (%d%%) überprüft"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s überprüft ein Backup anhand eines Backup-Manifests.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Aufruf:\n"
+" %s [OPTION]... BACKUPVERZ\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error bei Fehler sofort beenden\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=REL-PFAD angegebenen Pfad ignorieren\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PFAD angegebenen Pfad für Manifest verwenden\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal nicht versuchen WAL-Dateien zu parsen\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet keine Ausgabe, außer Fehler\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums Überprüfung der Prüfsummen überspringen\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PFAD angegebenen Pfad für WAL-Dateien verwenden\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/el.po b/src/bin/pg_verifybackup/po/el.po
new file mode 100644
index 0000000..3e3f20c
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/el.po
@@ -0,0 +1,525 @@
+# Greek message translation file for pg_verifybackup
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:16+0000\n"
+"PO-Revision-Date: 2023-08-15 15:22+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Η ακολουθία διαφυγής «\\%s» δεν είναι έγκυÏη."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Ο χαÏακτήÏας με τιμή 0x%02x Ï€Ïέπει να διαφÏγει."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Ανέμενε τέλος εισόδου, αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Ανέμενε στοιχείο συστυχίας ή «]», αλλά βÏέθηκε «%s»."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Ανέμενε «,» ή «]», αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Ανέμενε «:», αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Ανέμενε τιμή JSON, αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "Η συμβολοσειÏά εισόδου τεÏματίστηκε αναπάντεχα."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Ανέμενε συμβολοσειÏά ή «}», αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Ανέμενε «,» ή «}», αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Ανέμενε συμβολοσειÏά, αλλά βÏήκε «%s»."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Το διακÏιτικό «%s» δεν είναι έγκυÏο."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "Δεν είναι δυνατή η μετατÏοπή του \\u0000 σε κείμενο."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "Το «\\u» Ï€Ïέπει να ακολουθείται από τέσσεÏα δεκαεξαδικά ψηφία."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Δεν μποÏοÏν να χÏησιμοποιηθοÏν τιμές διαφυγής Unicode για τιμές σημείου κώδικα άνω του 007F όταν η κωδικοποίηση δεν είναι UTF8."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Τιμές διαφυγής Unicode δεν δÏναται να μεταφÏαστοÏν στην εντοπιότητα %s του διακομιστή."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Υψηλό διακÏιτικό Unicode δεν Ï€Ïέπει να ακολουθεί υψηλό διακÏιτικό."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Χαμηλό διακÏιτικό Unicode Ï€Ïέπει να ακολουθεί υψηλό διακÏιτικό."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "απέτυχε η ανάλυση"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "η διακήÏυξη έληξε απÏοσδόκητα"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "μη αναμενόμενη αÏχή αντικειμένου"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "μη αναμενόμενο τέλος αντικειμένου"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "μη αναμενόμενη αÏχή συστοιχίας"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "μη αναμενόμενο τέλος συστοιχίας"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "ανέμενε ένδειξη έκδοσης"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "μη αναγνωÏίσιμο πεδίο ανώτατου επιπέδου"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "μη αναμενόμενο πεδίο αÏχείου"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "μη αναμενόμενο πεδίο πεÏιοχής WAL"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "μη αναμενόμενο πεδίο αντικειμένου"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "μη αναμενόμενη έκδοση διακήÏυξης"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "μη αναμενόμενο scalar"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "λείπει όνομα διαδÏομής"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "και όνομα διαδÏομής και κωδικοποιημένο όνομα διαδÏομής"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "λείπει το μέγεθος"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "άθÏοισμα ελέγχου χωÏίς αλγόÏιθμο"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "δεν ήταν δυνατή η αποκωδικοποίηση του ονόματος αÏχείου"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "το μέγεθος αÏχείου δεν είναι ακέÏαιος"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "μη αναγνωÏίσιμος αλγόÏιθμος αθÏοίσματος ελέγχου: «%s»"
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "μη έγκυÏο άθÏοισμα ελέγχου για το αÏχείο «%s»: «%s»"
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "λείπει η χÏονογÏαμμή"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "λείπει αÏχικό LSN"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "λείπει τελικό LSN"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "η χÏονογÏαμμή δεν είναι ακέÏαιος"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "δεν ήταν δυνατή η ανάλυση του αÏÏ‡Î¹ÎºÎ¿Ï LSN"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "δεν ήταν δυνατή η ανάλυση του Ï„ÎµÎ»Î¹ÎºÎ¿Ï LSN"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "αναμένονταν τουλάχιστον 2 γÏαμμές"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "η τελευταία γÏαμμή δεν τεÏματίστηκε με newline"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "έλλειψη μνήμης"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση του αθÏοίσματος ελέγχου της διακήÏυξης"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "δεν ήταν δυνατή η ενημέÏωση του αθÏοίσματος ελέγχου της διακήÏυξης"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "δεν ήταν δυνατή η ολοκλήÏωση του αθÏοίσματος ελέγχου της διακήÏυξης"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "η διακήÏυξη δεν έχει άθÏοισμα ελέγχου"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "μη έγκυÏο άθÏοισμα ελέγχου διακήÏυξης: «%s»"
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "αναντιστοιχία ελέγχου αθÏοίσματος διακήÏυξης"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "δεν ήταν δυνατή η ανάλυση του αντιγÏάφου ασφαλείας της διακήÏυξης: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "δεν οÏίστηκε κατάλογος αντιγÏάφου ασφαλείας"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "δεν είναι δυνατός ο καθοÏισμός τόσο %s και %s"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»"
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "το αντίγÏαφο ασφαλείας επαληθεÏτηκε με επιτυχία\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "διπλότυπο όνομα διαδÏομής στη διακήÏυξη αντιγÏάφου ασφαλείας: «%s»"
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο ή κατάλογο «%s»: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "«%s» δεν είναι αÏχείο ή κατάλογος"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "«%s» βÏίσκεται στο δίσκο, αλλά όχι στη διακήÏυξη"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "«%s» έχει μέγεθος %lld στο δίσκο, αλλά μέγεθος %zu στη διακήÏυξη"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "«%s» βÏίσκεται στη διακήÏυξη αλλά όχι στο δίσκο"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "δεν ήταν δυνατή η αÏχικοποίηση του αθÏοίσματος ελέγχου του αÏχείου «%s»"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "δεν ήταν δυνατή η ενημέÏωση αθÏοίσματος ελέγχου του αÏχείου «%s»"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "το αÏχείο «%s» έπÏεπε να πεÏιέχει %zu bytes, αλλά να αναγνώστηκαν %zu bytes"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "δεν ήταν δυνατή η ολοκλήÏωση του αθÏοίσματος ελέγχου του αÏχείου «%s»"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "το αÏχείο «%s» έχει άθÏοισμα ελέγχου μήκους %d, αλλά αναμένεται %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "αναντιστοιχία αθÏοίσματος ελέγχου για το αÏχείο «%s»"
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "απέτυχε η ανάλυση WAL για την χÏονογÏαμμή %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s kB (%d%%) επιβεβαιώθηκαν"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s επαληθεÏει ένα αντίγÏαφο ασφαλείας έναντι της διακήÏυξης αντιγÏάφων ασφαλείας.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"ΧÏήση:\n"
+" %s [ΕΠΙΛΟΓΗ]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Επιλογές:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error να εξέλθει άμεσα σε σφάλμα\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH αγνόησε την υποδεικνυόμενη διαδÏομή\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH χÏησιμοποίησε την καθοÏισμένη διαδÏομή για την διακήÏυξη\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal μην δοκιμάσεις να αναλÏσεις αÏχεία WAL\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet να μην εκτυπώσεις καμία έξοδο, εκτός από σφάλματα\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums παÏάκαμψε την επαλήθευση αθÏοισμάτων ελέγχου\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH χÏησιμοποίησε την καθοÏισμένη διαδÏομή για αÏχεία WAL\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
diff --git a/src/bin/pg_verifybackup/po/es.po b/src/bin/pg_verifybackup/po/es.po
new file mode 100644
index 0000000..0cb958f
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/es.po
@@ -0,0 +1,523 @@
+# Spanish message translation file for pg_verifybackup
+# Copyright (C) 2020-2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Ãlvaro Herrera <alvherre@alvh.no-ip.org>, 2020.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:17+0000\n"
+"PO-Revision-Date: 2023-05-22 12:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.4.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "La secuencia de escape «%s» no es válida."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Los caracteres con valor 0x%02x deben ser escapados."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Se esperaba el fin de la entrada, se encontró «%s»."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Se esperaba un elemento de array o «]», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Se esperaba «,» o «]», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Se esperaba «:», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Se esperaba un valor JSON, se encontró «%s»."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "La cadena de entrada terminó inesperadamente."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Se esperaba una cadena o «}», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Se esperaba «,» o «}», se encontró «%s»."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Se esperaba una cadena, se encontró «%s»."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "El elemento «%s» no es válido."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 no puede ser convertido a text."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "«\\u» debe ser seguido por cuatro dígitos hexadecimales."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "El valor de escape Unicode no pudo ser traducido a la codificación del servidor %s."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Un «high-surrogate» Unicode no puede venir después de un «high-surrogate»."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Un «low-surrogate» Unicode debe seguir a un «high-surrogate»."
+
+# XXX change upstream message
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "procesamiento falló"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "el manifiesto terminó inesperadamente"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "inicio de objeto inesperado"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "fin de objeto inesperado"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "inicio de array inesperado"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "fin de array inesperado"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "se esperaba indicador de versión"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "campo de nivel superior no reconocido"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "campo de archivo inesperado"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "campo de rango de WAL inesperado"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "campo de objeto inesperado"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "versión de manifiesto inesperada"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "escalar inesperado"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "ruta de archivo faltante"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "hay ambos ruta de archivo (path name) y ruta codificada (encoded path name)"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "tamaño faltante"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "suma de comprobación sin algoritmo"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "no se pudo decodificar el nombre del archivo"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "el tamaño del archivo no es un número entero"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "algoritmo de suma de comprobación no reconocido: \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "suma de comprobación no válida para el archivo \"%s\": \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "falta el timeline"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "falta el LSN de inicio"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "falta el LSN de término"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "el timeline no es un número entero"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "no se pudo interpretar el LSN de inicio"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "no se pudo interpretar el LSN de término"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "esperado al menos 2 líneas"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "última línea no termina en nueva línea"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "no se pudo inicializar la suma de verificación del manifiesto"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "no se pudo actualizar la suma de verificación del manifiesto"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "no se pudo finalizar la suma de verificación del manifiesto"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "el manifiesto no tiene suma de comprobación"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "suma de comprobación de manifiesto no válida: \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "discordancia en la suma de comprobación del manifiesto"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "no se pudo analizar el manifiesto de la copia de seguridad: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "no fue especificado el directorio de respaldo"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "no se puede especificar %s junto con %s"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "el programa «%s» es requerido por %s, pero no pudo encontrarlo en el mismo directorio que «%s»"
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "el programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "copia de seguridad verificada correctamente\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "nombre de ruta duplicado en el manifiesto de la copia de seguridad: \"%s\""
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" no es un archivo o directorio"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" está presente en el disco pero no en el manifiesto"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" tiene un tamaño %lld en el disco pero un tamaño %zu en el manifiesto"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" está presente en el manifiesto pero no en el disco"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "no se pudo inicializar la suma de verificación para el archivo «%s»"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "no se pudo actualizar la suma de verificación para el archivo «%s»"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "el archivo \"%s\" debe contener %zu bytes, pero se leyeron %zu bytes"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "no se pudo finalizar la suma de verificación para el archivo «%s»"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "el archivo \"%s\" tiene una suma de comprobación de longitud %d, pero se esperaba %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "no coincide la suma de comprobación para el archivo \"%s\""
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "Error al interpretar el WAL para el timeline %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s kB (%d%%) verificados"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s verifica una copia de seguridad con el fichero de manifiesto de la copia de seguridad.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Uso:\n"
+" %s [OPCIÓN]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error salir inmediatamente en caso de error\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH ignorar la ruta indicada\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH usar la ruta especificada para el manifiesto\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal no intentar analizar archivos WAL\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet no escribir ningún mensaje, excepto errores\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums omitir la verificación de la suma de comprobación\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH utilizar la ruta especificada para los archivos WAL\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar la información de la versión, luego salir\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help muestra esta ayuda, luego salir\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/fr.po b/src/bin/pg_verifybackup/po/fr.po
new file mode 100644
index 0000000..da8c72f
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/fr.po
@@ -0,0 +1,537 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2020-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2020-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:17+0000\n"
+"PO-Revision-Date: 2023-09-05 07:49+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "La séquence d'échappement « \\%s » est invalide."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Le caractère de valeur 0x%02x doit être échappé."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Attendait une fin de l'entrée, mais a trouvé « %s »."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "« , » ou « ] » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "« : » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Valeur JSON attendue, mais « %s » trouvé."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "La chaîne en entrée se ferme de manière inattendue."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Chaîne ou « } » attendu, mais « %s » trouvé."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "« , » ou « } » attendu, mais trouvé « %s »."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Chaîne attendue, mais « %s » trouvé."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Le jeton « %s » n'est pas valide."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 ne peut pas être converti en texte."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "La valeur d'échappement unicode ne peut pas être traduite dans l'encodage du serveur %s."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Une substitution unicode haute ne doit pas suivre une substitution haute."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "échec de l'analyse"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "le manifeste se termine de façon inattendue"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "début d'objet inattendu"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "fin d'objet inattendue"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "début de tableau inattendu"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "fin de tableau inattendue"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "indicateur de version inattendu"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "champ haut niveau inconnu"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "champ de fichier inattendu"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "champ d'intervalle de WAL inattendu"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "champ d'objet inattendu"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "version du manifeste inattendue"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "scalaire inattendu"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "nom de chemin manquant"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "le nom du chemin et le nom du chemin encodé"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "taille manquante"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "somme de contrôle sans algorithme"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "n'a pas pu décoder le nom du fichier"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "la taille du fichier n'est pas un entier"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "algorithme de somme de contrôle inconnu : « %s »"
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "somme de contrôle invalide pour le fichier « %s » : « %s »"
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "timeline manquante"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "LSN de début manquante"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "LSN de fin manquante"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "la timeline n'est pas un entier"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "n'a pas pu analyser le LSN de début"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "n'a pas pu analyser le LSN de fin"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "attendait au moins deux lignes"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "dernière ligne non terminée avec un caractère newline"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "n'a pas pu initialiser la somme de contrôle du manifeste"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "n'a pas pu mettre à jour la somme de contrôle du manifeste"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "n'a pas pu finaliser la somme de contrôle du manifeste"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "le manifeste n'a pas de somme de contrôle"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "somme de contrôle du manifeste invalide : « %s »"
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "différence de somme de contrôle pour le manifeste"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "n'a pas pu analyser le manifeste de sauvegarde : %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "pas de répertoire de sauvegarde spécifié"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "ne peut pas spécifier à la fois %s et %s"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »"
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "sauvegarde vérifiée avec succès\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "nom de chemin dupliqué dans le manifeste de sauvegarde : « %s »"
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "n'a pas pu fermer le répertoire « %s » : %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr ""
+"n'a pas pu récupérer les informations sur le fichier ou répertoire\n"
+"« %s » : %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "« %s » n'est ni un fichier ni un répertoire"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "« %s » est présent sur disque mais pas dans le manifeste"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "« %s » a une taille de %lld sur disque mais de %zu dans le manifeste"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "« %s » est présent dans le manifeste mais pas sur disque"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "n'a pas pu initialiser la somme de contrôle du fichier « %s »"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "n'a pas pu mettre à jour la somme de contrôle du fichier « %s »"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "le fichier « %s » devrait contenir %zu octets, mais la lecture produit %zu octets"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "n'a pas pu finaliser la somme de contrôle du fichier « %s »"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "le fichier « %s » a une somme de contrôle de taille %d, alors que %d était attendu"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "différence de somme de contrôle pour le fichier « %s »"
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "analyse du WAL échouée pour la timeline %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s Ko (%d%%) vérifiés"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s vérifie une sauvegarde à partir du manifeste de sauvegarde.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Usage:\n"
+" %s [OPTION]... REP_SAUVEGARDE\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error quitte immédiatement en cas d'erreur\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=CHEMIN_RELATIF ignore le chemin indiqué\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=CHEMIN utilise le chemin spécifié pour le manifeste\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal n'essaie pas d'analyse les fichiers WAL\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche les informations de progression\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet n'affiche aucun message sauf pour les erreurs\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums ignore la vérification des sommes de contrôle\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=CHEMIN utilise le chemin spécifié pour les fichiers WAL\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
diff --git a/src/bin/pg_verifybackup/po/it.po b/src/bin/pg_verifybackup/po/it.po
new file mode 100644
index 0000000..317b0b7
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/it.po
@@ -0,0 +1,500 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:16+0000\n"
+"PO-Revision-Date: 2023-09-05 08:24+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "La sequenza di escape \"\\%s\" non è valida."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Il carattere con valore 0x%02x deve essere sottoposto ad escape."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Era prevista la fine dell'input, trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Era previsto un elemento di array oppure \"]\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1087
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Era previsto \",\" oppure \"]\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1090
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Era previsto \":\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1093
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Era previsto un valore JSON, trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1096
+msgid "The input string ended unexpectedly."
+msgstr "La stringa di input è terminata inaspettatamente."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Era prevista una stringa oppure \"}\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1101
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Era previsto \",\" oppure \"}\", trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1104
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Era prevista una stringa, trovato \"%s\" invece."
+
+#: ../../common/jsonapi.c:1107
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Il token \"%s\" non è valido."
+
+#: ../../common/jsonapi.c:1110
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 non può essere convertito in testo."
+
+#: ../../common/jsonapi.c:1112
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" deve essere seguito da quattro cifre esadecimali."
+
+#: ../../common/jsonapi.c:1115
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "I valori di escape Unicode non possono essere utilizzati per i valori del punto di codice superiori a 007F quando la codifica non è UTF8."
+
+#: ../../common/jsonapi.c:1117
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Il surrogato alto Unicode non deve seguire un surrogato alto."
+
+#: ../../common/jsonapi.c:1119
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Il surrogato basso Unicode deve seguire un surrogato alto."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "analisi non riuscita"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "manifest è terminato in modo imprevisto"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "inizio dell'oggetto imprevisto"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "fine dell'oggetto inaspettato"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "avvio imprevisto dell'array"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "fine imprevista dell'array"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "indicatore della versione prevista"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "campo di primo livello non riconosciuto"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "campo file imprevisto"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "campo dell'intervallo WAL imprevisto"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "campo oggetto imprevisto"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "versione manifest imprevista"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "scalare inaspettato"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "nome del percorso mancante"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "sia il nome del percorso che il nome del percorso codificato"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "dimensione mancante"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "checksum senza algoritmo"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "impossibile decodificare il nome del file"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "la dimensione del file non è un numero intero"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "algoritmo di checksum non riconosciuto: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "checksum non valido per il file \"%s\": \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "sequenza temporale mancante"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "LSN iniziale mancante"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "LSN finale mancante"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "la sequenza temporale non è un numero intero"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "impossibile analizzare l'LSN di avvio"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "impossibile analizzare l'LSN finale"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "previsto almeno 2 righe"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "ultima riga non terminata da una nuova riga"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: parse_manifest.c:659
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "impossibile inizializzare il checksum di manifest"
+
+#: parse_manifest.c:661
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "impossibile aggiornare il checksum di manifest"
+
+#: parse_manifest.c:664
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "non è stato possibile finalizzare il checksum di manifest"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "manifest non ha checksum"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "checksum manifest non valido: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "mancata corrispondenza del checksum manifesto"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "impossibile analizzare il manifest di backup: %s"
+
+#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "nessuna directory di backup specificata"
+
+#: pg_verifybackup.c:274
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_verifybackup.c:297
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "il programma \"%s\" è necessario per %s ma non è stato trovato nella stessa directory di \"%s\""
+
+#: pg_verifybackup.c:300
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "il programma \"%s\" è stato trovato da \"%s\" ma non era della stessa versione di %s"
+
+#: pg_verifybackup.c:356
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "backup verificato con successo\n"
+
+#: pg_verifybackup.c:382 pg_verifybackup.c:718
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:386
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: pg_verifybackup.c:406 pg_verifybackup.c:745
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:409
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "impossibile leggere il file \"%s\": leggere %d di %lld"
+
+#: pg_verifybackup.c:469
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "nome del percorso duplicato nel manifest di backup: \"%s\""
+
+#: pg_verifybackup.c:532 pg_verifybackup.c:539
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:571
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "impossibile chiudere la directory \"%s\": %m"
+
+#: pg_verifybackup.c:591
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file o directory \"%s\": %m"
+
+#: pg_verifybackup.c:614
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" non è un file o una directory"
+
+#: pg_verifybackup.c:624
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" è presente sul disco ma non nel manifest"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" ha la dimensione %lld sul disco ma la dimensione %zu nel manifest"
+
+#: pg_verifybackup.c:663
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" è presente nel manifest ma non sul disco"
+
+#: pg_verifybackup.c:726
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "impossibile inizializzare il checksum del file \"%s\""
+
+#: pg_verifybackup.c:738
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "impossibile aggiornare il checksum del file \"%s\""
+
+#: pg_verifybackup.c:751
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "chiusura del file \"%s\" fallita: %m"
+
+#: pg_verifybackup.c:770
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "il file \"%s\" dovrebbe contenere %zu byte, ma leggere %zu byte"
+
+#: pg_verifybackup.c:780
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "impossibile finalizzare il checksum del file \"%s\""
+
+#: pg_verifybackup.c:788
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "il file \"%s\" ha un checksum di lunghezza %d, ma previsto %d"
+
+#: pg_verifybackup.c:792
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "mancata corrispondenza del checksum per il file \"%s\""
+
+#: pg_verifybackup.c:816
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "Analisi WAL non riuscita per la sequenza temporale %u"
+
+#: pg_verifybackup.c:902
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s verifica un backup rispetto al manifest di backup.\n"
+"\n"
+
+#: pg_verifybackup.c:903
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Utilizzo:\n"
+" %s [OPZIONE]... DIR.BACKUP\n"
+"\n"
+
+#: pg_verifybackup.c:904
+#, c-format
+msgid "Options:\n"
+msgstr "Opzioni:\n"
+
+#: pg_verifybackup.c:905
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error esce immediatamente in caso di errore\n"
+
+#: pg_verifybackup.c:906
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH ignora il percorso indicato\n"
+
+#: pg_verifybackup.c:907
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH usa il percorso specificato per manifest\n"
+
+#: pg_verifybackup.c:908
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal non tenta di analizzare i file WAL\n"
+
+#: pg_verifybackup.c:909
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet non stampa alcun output, ad eccezione degli errori\n"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums salta la verifica del checksum\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH usa il percorso specificato per i file WAL\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto, quindi esci\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/ja.po b/src/bin/pg_verifybackup/po/ja.po
new file mode 100644
index 0000000..98b280b
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ja.po
@@ -0,0 +1,520 @@
+# Japanese message translation file for pg_verifybackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Haiying Tang <tanghy.fnst@cn.fujitsu.com>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-02-06 16:00+0900\n"
+"PO-Revision-Date: 2023-02-06 17:30+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“ (内部エラー)\n"
+
+#: ../../common/jsonapi.c:1126
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "エスケープシーケンス\"\\%s\"ã¯ä¸æ­£ã§ã™ã€‚"
+
+#: ../../common/jsonapi.c:1129
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "0x%02x値をæŒã¤æ–‡å­—ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../common/jsonapi.c:1132
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "入力ã®çµ‚端を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1135
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "é…列è¦ç´ ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1138
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "\",\"ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1141
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "\":\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "JSON値を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1147
+msgid "The input string ended unexpectedly."
+msgstr "入力文字列ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1149
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "文字列ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1152
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "\",\"ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1155
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "文字列を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1158
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "トークン\"%s\"ã¯ä¸æ­£ã§ã™ã€‚"
+
+#: ../../common/jsonapi.c:1161
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 ã¯ãƒ†ã‚­ã‚¹ãƒˆã«å¤‰æ›ã§ãã¾ã›ã‚“。"
+
+#: ../../common/jsonapi.c:1163
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\"ã®å¾Œã«ã¯16進数ã®4æ¡ãŒç¶šã‹ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: ../../common/jsonapi.c:1166
+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:1169
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Unicodeエスケープã®å€¤ãŒã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°%sã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: ../../common/jsonapi.c:1172
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicodeã®ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã„ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
+
+#: ../../common/jsonapi.c:1174
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicodeã®ãƒ­ãƒ¼ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã‹ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "パースã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "目録ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "予期ã—ãªã„オブジェクトã®é–‹å§‹"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "予期ã—ãªã„オブジェクトã®çµ‚ã‚ã‚Š"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "予期ã—ãªã„é…列ã®é–‹å§‹"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "予期ã—ãªã„é…列ã®çµ‚ã‚ã‚Š"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æŒ‡ç¤ºå­ã‚’想定ã—ã¦ã„ã¾ã—ãŸ"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "èªè­˜ã§ããªã„トップレベルフィールド"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "予期ã—ãªã„ファイルフィールド"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "予期ã—ãªã„WAL範囲フィールド"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "予期ã—ãªã„オブジェクトフィールド"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "予期ã—ãªã„目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "予期ã—ãªã„スカラー"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "パスåãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "パスåã¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•ã‚ŒãŸãƒ‘スåã®ä¸¡æ–¹"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "サイズãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "アルゴリズムãªã—ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ "
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "ファイルåをデコードã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "ファイルサイズãŒæ•´æ•°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "èªè­˜ã§ããªã„ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ : \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "\"%s\" ファイルã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒç„¡åŠ¹: \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "タイムラインãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "開始LSNãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "終了LSNãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "タイムラインãŒæ•´æ•°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "開始LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "終了LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "å°‘ãªãã¨ã‚‚2è¡ŒãŒå¿…è¦ã§ã™"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "最後ã®è¡ŒãŒæ”¹è¡Œã§çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "メモリä¸è¶³ã§ã™"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®å®Œäº†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "目録ã«ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "無効ãªç›®éŒ²ãƒã‚§ãƒƒã‚¯ã‚µãƒ : \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ä¸ä¸€è‡´"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "%sã¨%sã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#: pg_verifybackup.c:319
+#, 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\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“ã‚Œã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚Œã¾ã—ãŸ\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録内ã®é‡è¤‡ãƒ‘スå: \"%s\""
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "\"%s\"ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æƒ…報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\"ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\"ã¯ãƒ‡ã‚£ã‚¹ã‚¯ã«å­˜åœ¨ã—ã¾ã™ãŒã€ç›®éŒ²ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\"ã¯ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ã®ã‚µã‚¤ã‚ºã¯%lldã§ã™ãŒã€ç›®éŒ²ä¸Šã¯%zuã¨ãªã£ã¦ã„ã¾ã™"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\"ã¯ç›®éŒ²ã«ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ‡ã‚£ã‚¹ã‚¯ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "file\"%s\"ã¯%zuãƒã‚¤ãƒˆã‚’å«ã‚€å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€%zuãƒã‚¤ãƒˆãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã—ãŸ"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®å®Œäº†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®é•·ã•ã¯%dã§ã™ãŒã€äºˆæœŸã•ã‚Œã‚‹ã®ã¯%dã§ã™"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã›ã‚“"
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "タイムライン%uã®WALã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s kB (%d%%) 検証ã—ã¾ã—ãŸ"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%sã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ã«å¯¾ã—ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を検証ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"使用方法:\n"
+" %s [オプション]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error エラー時ã«ç›´ã¡ã«çµ‚了ã™ã‚‹\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH 指示ã•ã‚ŒãŸãƒ‘スを無視\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH 目録ã¨ã—ã¦æŒ‡å®šã—ãŸãƒ‘スを使用ã™ã‚‹\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal WALファイルをパースã—よã†ã¨ã—ãªã„\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状æ³ã‚’表示\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet エラー以外何も出力ã—ãªã„\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ã‚’スキップ\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH WALファイルã«æŒ‡å®šã—ãŸãƒ‘スを使用ã™ã‚‹\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/ka.po b/src/bin/pg_verifybackup/po/ka.po
new file mode 100644
index 0000000..69b6e7a
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ka.po
@@ -0,0 +1,519 @@
+# Georgian message translation file for pg_verifybackup
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:17+0000\n"
+"PO-Revision-Date: 2023-04-20 08:19+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ მიმდევრáƒáƒ‘რ\"\\%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "სიმბáƒáƒšáƒ კáƒáƒ“ით 0x%02x áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ ეკრáƒáƒœáƒ˜áƒ áƒ”ბული უნდრიყáƒáƒ¡."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი შეყვáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ ელემენტს áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი \",\" áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი \":\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი JSON მნიშვნელáƒáƒ‘áƒáƒ¡. მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი სტრიქáƒáƒœáƒ¡ áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი \",\", áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი სტრიქáƒáƒœáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%s\"."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 ტექსტáƒáƒ“ ვერ გáƒáƒ áƒ“áƒáƒ˜áƒ¥áƒ›áƒœáƒ”ბáƒ."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" ს თექვსმეტáƒáƒ‘ითი ციფრები უნდრმáƒáƒ°áƒ§áƒ•áƒ”ბáƒáƒ“ეს."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ კáƒáƒ“ების გáƒáƒ›áƒáƒ§áƒ”ნებრკáƒáƒ“ის წერტილის მნიშვნელáƒáƒ‘ებáƒáƒ“ 007F-ის ზემáƒáƒ— შეუძლებელიáƒ, თუ კáƒáƒ“ირებრUTF-8 áƒáƒ áƒáƒ."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ მნიშვნელáƒáƒ‘ის თáƒáƒ áƒ’მნრსერვერის კáƒáƒ“ირებáƒáƒ¨áƒ˜ %s შეუძლებელიáƒ."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "უნიკáƒáƒ“ის მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ მáƒáƒ¦áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ áƒáƒ  უნდრმáƒáƒ¡áƒ“ევდეს."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "უნიკáƒáƒ“ის დáƒáƒ‘áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ უნდრმისდევდეს."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ვერსიის მáƒáƒ©áƒ•áƒ”ნებელი"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "უცნáƒáƒ‘ი ველი ზედრდáƒáƒœáƒ”ზე"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი WAL-ის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡áƒ—ვის"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი ველი"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის მáƒáƒ£áƒšáƒáƒ“ნელი ვერსიáƒ"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი სკáƒáƒšáƒáƒ áƒ˜"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "áƒáƒ™áƒšáƒ˜áƒ ბილიკის სáƒáƒ®áƒ”ლი"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "áƒáƒ áƒ˜áƒ•áƒ”, ბილიკის სáƒáƒ®áƒ”ლი დრბილიკის კáƒáƒ“ირებული სáƒáƒ®áƒ”ლი"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "ზáƒáƒ›áƒ áƒáƒ™áƒšáƒ˜áƒ"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის გáƒáƒ áƒ”შე"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ¨áƒ˜áƒ¤áƒ•áƒ áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ მთელი რიცხვი áƒáƒ áƒáƒ"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ უცნáƒáƒ‘ი áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "áƒáƒ™áƒšáƒ˜áƒ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "áƒáƒ™áƒšáƒ˜áƒ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "áƒáƒ™áƒšáƒ˜áƒ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ LSN"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი მთელი რიცხვი áƒáƒ áƒáƒ"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "სáƒáƒ‘áƒáƒšáƒáƒ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "ველáƒáƒ“ებáƒáƒ“ი სულ ცáƒáƒ¢áƒ 2 ხáƒáƒ–ს"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "ბáƒáƒšáƒ ხáƒáƒ–ი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ— áƒáƒ  სრულდებáƒ"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s"
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  ემთხვევáƒ"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცრáƒáƒ›áƒ: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "áƒáƒ áƒ˜áƒ•áƒ”, %s დრ%s ერთáƒáƒ“ მითითებრშეუძლებელიáƒ"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ"
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•áƒœáƒ˜áƒ „%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით შემáƒáƒ¬áƒ›áƒ“áƒ\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %lld-დáƒáƒœ"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტში მითითებული ბილიკის სáƒáƒ®áƒ”ლი დუბლირებულიáƒ: %s"
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" პáƒáƒ•áƒœáƒ შეუძლებელიáƒ: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" áƒáƒ áƒª ფáƒáƒ˜áƒšáƒ˜áƒ, áƒáƒ áƒª სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" დისკზე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ მáƒáƒœáƒ˜áƒ¤áƒ”სტში"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "დისკზე \"%s\"-ის ზáƒáƒ›áƒáƒ %lld, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒ˜áƒ¤áƒ”სტში მითითებული ზáƒáƒ›áƒáƒ %zu"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒ˜áƒ¤áƒ”სტში, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ დისკზე"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" უნდრშეიცáƒáƒ•áƒ“ეს %zu ბáƒáƒ˜áƒ¢áƒ¡ მáƒáƒ’რáƒáƒ› წáƒáƒ™áƒ˜áƒ—ხულირ%zu ბáƒáƒ˜áƒ¢áƒ˜"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ სიგრძერ%d, მáƒáƒ•áƒ”ლáƒáƒ“ით %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\""
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "WAL-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ისთვის %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s კბ (%d%%) გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ“áƒ"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr "%s მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ მის მáƒáƒœáƒ˜áƒ¤áƒ”სტს შეáƒáƒ“áƒáƒ áƒ”ბს\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+" %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒ¡áƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error დáƒáƒ£áƒ§áƒáƒ•áƒœáƒ”ბლივი გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=შედáƒáƒ áƒ”ბითი_ბილიკ ბითითებული ბილიკის იგნáƒáƒ áƒ˜\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=ბილიკი მáƒáƒœáƒ˜áƒ¤áƒ”სტისთვის მითითებული ბილიკის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal WAL ფáƒáƒ˜áƒšáƒ”ბი áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ“ებáƒ\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet შეცდáƒáƒ›áƒ”ბის გáƒáƒ áƒ“რეკრáƒáƒœáƒ–ე áƒáƒ áƒáƒ¤áƒ”რი გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=ბილიკი WAL ფáƒáƒ˜áƒšáƒ”ბისთვის მითითებული ბილიკის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/ko.po b/src/bin/pg_verifybackup/po/ko.po
new file mode 100644
index 0000000..acdc3da
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ko.po
@@ -0,0 +1,529 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:47+0000\n"
+"PO-Revision-Date: 2023-05-26 13:22+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: PostgreSQL Korea <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (내부 오류)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "ìž˜ëª»ëœ ì´ìŠ¤ì¼€ì´í”„ ì¡°í•©: \"\\%s\""
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "0x%02x ê°’ì˜ ë¬¸ìžëŠ” ì´ìŠ¤ì¼€ì´í”„ ë˜ì–´ì•¼í•¨."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "ìž…ë ¥ ìžë£Œì˜ ëì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ì´ ë” ìžˆìŒ."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "\"]\" ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ"
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "\",\" ë˜ëŠ” \"]\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ"
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "\":\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ"
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "JSON ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ìž„"
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "ìž…ë ¥ 문ìžì—´ì´ 예ìƒì¹˜ 않게 ë났ìŒ."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "\"}\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ"
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "\",\" ë˜ëŠ” \"}\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ"
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "문ìžì—´ ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ìž„"
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "ìž˜ëª»ëœ í† í°: \"%s\""
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 ê°’ì€ text 형으로 변환할 수 ì—†ìŒ."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" í‘œê¸°ë²•ì€ ë’¤ì— 4ê°œì˜ 16진수가 와야합니다."
+
+#: ../../common/jsonapi.c:1184
+msgid ""
+"Unicode escape values cannot be used for code point values above 007F when "
+"the encoding is not UTF8."
+msgstr ""
+"ì¸ì½”ë”©ì€ UTF8ì´ ì•„ë‹ ë•Œ 유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì€ 007F ì´ìƒ 코드 í¬ì¸íŠ¸ 값으"
+"ë¡œ 사용할 수 ì—†ìŒ."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid ""
+"Unicode escape value could not be translated to the server's encoding %s."
+msgstr "서버 ì¸ì½”ë”©ì´ %s ì¸ ê²½ìš° 해당 유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì„ ë³€í™˜í•  수 ì—†ìŒ."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드)는 ìƒìœ„ 딸림 코드 ë’¤ì— ì˜¤ë©´ 안ë¨."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드) ë’¤ì—는 하위 딸림 코드가 있어야 함."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "구문 ë¶„ì„ ì‹¤íŒ¨"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "메니페스트가 비정ìƒì ìœ¼ë¡œ ë났ìŒ"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "비정ìƒì ì¸ 개체 시작"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "비정ìƒì ì¸ 개체 ë"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "비정ìƒì ì¸ ë°°ì—´ 시작"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "비정ìƒì ì¸ ë°°ì—´ ë"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "버전 지시ìžê°€ 있어야 함"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "최ìƒìœ„ 필드를 ì•Œ 수 ì—†ìŒ"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "예ìƒì¹˜ 못한 íŒŒì¼ í•„ë“œ"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "예ìƒì¹˜ 못한 WAL 범위 í•„ë“œ"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "예ìƒì¹˜ 못한 개체 í•„ë“œ"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "예ìƒì¹˜ 못한 메니페스트 버전"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "예ìƒì¹˜ 못한 스칼ë¼"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "패스 ì´ë¦„ ë¹ ì§"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "패스 ì´ë¦„ê³¼ ì¸ì½”딩 ëœ íŒ¨ìŠ¤ ì´ë¦„ì´ í•¨ê»˜ 있ìŒ"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "í¬ê¸° ë¹ ì§"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "알고리즘 없는 ì²´í¬ì„¬"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "íŒŒì¼ ì´ë¦„ì„ ë””ì½”ë”©í•  수 ì—†ìŒ"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "íŒŒì¼ í¬ê¸°ê°€ 정수가 아님"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "ì•Œ 수 없는 ì²´í¬ì„¬ 알고리즘: \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "\"%s\" 파ì¼ì˜ ì²´í¬ì„¬ì´ 잘못ë¨: \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "타임ë¼ì¸ ë¹ ì§"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "시작 LSN ë¹ ì§"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "ë LSN ë¹ ì§"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "타임ë¼ì¸ì´ 정수가 아님"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "시작 LSN ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "ë LSN ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "ì ì–´ë„ 2ì¤„ì´ ë” ìžˆì–´ì•¼ 함"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "마지막 ì¤„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ ì—†ìŒ"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "메니페스트 ì²´í¬ì„¬ 초기화를 í•  수 ì—†ìŒ"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "메니페스트 ì²´í¬ì„¬ 갱신 í•  수 ì—†ìŒ"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "메니페스트 ì²´í¬ì„¬ 마무리 ìž‘ì—… í•  수 ì—†ìŒ"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "ë©”ë‹ˆíŽ˜ìŠ¤íŠ¸ì— ì²´í¬ì„¬ ì—†ìŒ"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "ìž˜ëª»ëœ ë©”ë‹ˆíŽ˜ìŠ¤íŠ¸ ì²´í¬ì„¬: \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "메니페스트 ì²´í¬ì„¬ 불ì¼ì¹˜"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "백업 메니페스트 구문 ë¶„ì„ ì‹¤íŒ¨: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "백업 디렉터리를 지정하지 않았ìŒ"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "%s 옵션과 %s ì˜µì…˜ì„ ê°™ì´ ì§€ì •í•  수는 ì—†ìŒ"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr ""
+"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s ìž‘ì—…ì—ì„œ 필요하지만 ê°™ì€ \"%s\" 디렉터리 ë‚´ì— ì—†ìŠµë‹ˆë‹¤."
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—…ì„ ìœ„í•´ 찾았지만 %s 버전과 같지 않습니다."
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "백업 검사 완료\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "백업 메니페스트 ì•ˆì— ê²½ë¡œ ì´ë¦„ì´ ì¤‘ë³µë¨: \"%s\""
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "íŒŒì¼ ë˜ëŠ” 디렉터리 \"%s\"ì˜ ìƒíƒœë¥¼ 확ì¸í•  수 ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" ì´ë¦„ì€ íŒŒì¼ì´ë‚˜ 디렉터리가 아님"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "디스í¬ì—는 \"%s\" 개체가 있으나, 메니페스트 안ì—는 ì—†ìŒ"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" ì˜ ë””ìŠ¤í¬ í¬ê¸°ëŠ” %lld ì´ë‚˜ 메니페스트 안ì—는 %zu 입니다."
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "메니페스트 안ì—는 \"%s\" 개체가 있으나 디스í¬ì—는 ì—†ìŒ"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 초기화 í•  수 ì—†ìŒ"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 갱신할 수 ì—†ìŒ"
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "\"%s\" 파ì¼ì€ %zu ë°”ì´íŠ¸ì´ë‚˜ %zu ë°”ì´íŠ¸ë¥¼ ì½ìŒ"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 마무리 í•  수 ì—†ìŒ"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ %d, 예ìƒë˜ëŠ” ê°’: %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "\"%s\" 파ì¼ì˜ ì²´í¬ì„¬ì´ 맞지 ì•ŠìŒ"
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "타임ë¼ì¸ %uë²ˆì˜ WAL ë¶„ì„ ì˜¤ë¥˜"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s kB (%d%%) 검사ë¨"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ ë°±ì—… 메니페스트로 ë°±ì—…ì„ ê²€ì‚¬í•©ë‹ˆë‹¤.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"사용법:\n"
+" %s [옵션]... 백업디렉터리\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "옵션들:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error 오류가 있으면 작업 중지\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=ìƒëŒ€ê²½ë¡œ 지정한 경로 건너뜀\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=경로 메니페스트 íŒŒì¼ ê²½ë¡œ 지정\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal WAL íŒŒì¼ ê²€ì‚¬ 건너뜀\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 진행 정보를 보여줌\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid ""
+" -q, --quiet do not print any output, except for errors\n"
+msgstr ""
+" -q, --quiet 오류를 빼고 나머지는 아무 ê²ƒë„ ì•ˆ 보여줌\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums ì²´í¬ì„¬ 검사 건너뜀\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=경로 WAL 파ì¼ì´ 있는 경로 지정\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build
new file mode 100644
index 0000000..181cf64
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_verifybackup/po/ru.po b/src/bin/pg_verifybackup/po/ru.po
new file mode 100644
index 0000000..64005fe
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/ru.po
@@ -0,0 +1,539 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-28 07:59+0300\n"
+"PO-Revision-Date: 2023-08-30 12:42+0300\n"
+"Last-Translator: Alexander Lakhin <a.lakhin@postgrespro.ru>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+"X-Generator: Lokalize 19.12.3\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑпецпоÑледовательноÑÑ‚ÑŒ: \"\\%s\"."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Символ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 0x%02x необходимо Ñкранировать."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "ОжидалÑÑ ÐºÐ¾Ð½ÐµÑ† текÑта, но обнаружено продолжение \"%s\"."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "ОжидалÑÑ Ñлемент маÑÑива или \"]\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "ОжидалаÑÑŒ \",\" или \"]\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "ОжидалоÑÑŒ \":\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "ОжидалоÑÑŒ значение JSON, но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "Ðеожиданный конец входной Ñтроки."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "ОжидалаÑÑŒ Ñтрока или \"}\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "ОжидалаÑÑŒ \",\" или \"}\", но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "ОжидалаÑÑŒ Ñтрока, но обнаружено \"%s\"."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Ошибочный Ñлемент текÑта \"%s\"."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в текÑÑ‚."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "За \"\\u\" должны Ñледовать четыре шеÑтнадцатеричные цифры."
+
+#: ../../common/jsonapi.c:1184
+msgid ""
+"Unicode escape values cannot be used for code point values above 007F when "
+"the encoding is not UTF8."
+msgstr ""
+"Спецкоды Unicode Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ выше 007F можно иÑпользовать только Ñ "
+"кодировкой UTF8."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid ""
+"Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Спецкод Unicode Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в Ñерверную кодировку %s."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr ""
+"Старшее Ñлово Ñуррогата Unicode не может Ñледовать за другим Ñтаршим Ñловом."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Младшее Ñлово Ñуррогата Unicode должно Ñледовать за Ñтаршим Ñловом."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "ошибка при разборе"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "неожиданный конец манифеÑта"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "неожиданное начало объекта"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "неожиданный конец объекта"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "неожиданное начало маÑÑива"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "неожиданный конец маÑÑива"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "ожидалоÑÑŒ указание верÑии"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "нераÑпознанное поле на верхнем уровне"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "неизвеÑтное поле Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "неизвеÑтное поле в указании диапазона WAL"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "неожиданное поле объекта"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "неожиданное ÑкалÑрное значение"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "отÑутÑтвует указание пути"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "указание пути задано в обычном виде и в закодированном"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "отÑутÑтвует указание размера"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "не задан алгоритм раÑчёта контрольной Ñуммы"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "не удалоÑÑŒ декодировать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "размер файла не ÑвлÑетÑÑ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленным"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "нераÑпознанный алгоритм раÑчёта контрольных Ñумм: \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "отÑутÑтвует Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "отÑутÑтвует начальный LSN"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "отÑутÑтвует конечный LSN"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ задаётÑÑ Ð½Ðµ целым чиÑлом"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "не удалоÑÑŒ разобрать начальный LSN"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "не удалоÑÑŒ разобрать конечный LSN"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "ожидалоÑÑŒ как минимум 2 Ñтроки"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "поÑледнÑÑ Ñтрока не оканчиваетÑÑ Ñимволом новой Ñтроки"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памÑти"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы манифеÑта"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы манифеÑта"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "не удалоÑÑŒ завершить раÑчёт контрольной Ñуммы манифеÑта"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "в манифеÑте нет контрольной Ñуммы"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма в манифеÑте: \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "ошибка контрольной Ñуммы манифеÑта"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "не удалоÑÑŒ разобрать манифеÑÑ‚ копии: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "каталог копии не указан"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "указать %s и %s одновременно нельзÑ"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid ""
+"program \"%s\" is needed by %s but was not found in the same directory as "
+"\"%s\""
+msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\""
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr ""
+"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ "
+"верÑии %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "ÐºÐ¾Ð¿Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð° уÑпешно\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %lld)"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "дублирующийÑÑ Ð¿ÑƒÑ‚ÑŒ в манифеÑте копии: \"%s\""
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" не указывает на файл или каталог"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "файл \"%s\" приÑутÑтвует на диÑке, но отÑутÑтвует в манифеÑте"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr ""
+"файл \"%s\" имеет размер на диÑке: %lld, тогда как размер в манифеÑте: %zu"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "файл \"%s\" приÑутÑтвует в манифеÑте, но отÑутÑтвует на диÑке"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы файла \"%s\""
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы файла \"%s\""
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "файл \"%s\" должен Ñодержать байт: %zu, но фактичеÑки прочитано: %zu"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "не удалоÑÑŒ завершить раÑчёт контрольной Ñуммы файла \"%s\""
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr ""
+"Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\" задана ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма размером %d, но ожидаемый размер: "
+"%d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "ошибка контрольной Ñуммы Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\""
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "не удалоÑÑŒ разобрать WAL Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s КБ (%d%%) проверено"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s проверÑет резервную копию, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑÑ‚ копии.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"ИÑпользование:\n"
+" %s [ПÐРÐМЕТР]... КÐТÐЛОГ_КОПИИ\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error немедленный выход при ошибке\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr ""
+" -i, --ignore=ОТÐОСИТЕЛЬÐЫЙ_ПУТЬ\n"
+" игнорировать заданный путь\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=ПУТЬ иÑпользовать заданный файл манифеÑта\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal не пытатьÑÑ Ñ€Ð°Ð·Ð±Ð¸Ñ€Ð°Ñ‚ÑŒ файлы WAL\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid ""
+" -q, --quiet do not print any output, except for errors\n"
+msgstr ""
+" -q, --quiet не выводить никаких Ñообщений, кроме ошибок\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums пропуÑтить проверку контрольных Ñумм\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr ""
+" -w, --wal-directory=ПУТЬ иÑпользовать заданный путь к файлам WAL\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
diff --git a/src/bin/pg_verifybackup/po/sv.po b/src/bin/pg_verifybackup/po/sv.po
new file mode 100644
index 0000000..17240fe
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/sv.po
@@ -0,0 +1,548 @@
+# Swedish message translation file for pg_verifybackup
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-01 14:17+0000\n"
+"PO-Revision-Date: 2023-08-01 22:19+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "Escape-sekvens \"\\%s\" är ogiltig."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Tecken med värde 0x%02x måste escape:as."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "Förväntade slut på indata, men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "Förväntade sig \":\" men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "Förväntade JSON-värde, men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "Indatasträngen avslutades oväntat."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "Förväntade sträng, men hittade \"%s\"."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Token \"%s\" är ogiltig."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 kan inte konverteras till text."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" måste följas av fyra hexdecimala siffror."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Escape-värde för unicode kan inte översättas till serverns kodning %s."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicodes övre surrogathalva får inte komma efter en övre surrogathalva."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicodes lägre surrogathalva måste följa en övre surrogathalva."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "parsning misslyckades"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "manifestet avslutades oväntat"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "oväntad objektstart"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "oväntat objektslut"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "oväntad array-start"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "oväntat array-slut"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "förväntade en versionsindikator"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "okänt toppnivåfält"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "oväntat filfält"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "oväntat WAL-intervall-fält"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "oväntat objektfält"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "oväntad manifestversion"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "oväntad skalar"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "saknas sökväg"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "både sökväg och kodad sökväg"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "saknar storlek"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "kontrollsumma utan algoritm"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "kunde inte avkoda filnamn"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "filstorlek är inte ett haltal"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "okänd algoritm för kontrollsumma: \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "ogiltig kontrollsumma för fil \"%s\": \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "saknar tidslinje"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "saknar start-LSN"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "saknar slut-LSN"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "tidslinje är inte ett heltal"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "kunde inte parsa start-LSN"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "kunde inte parsa slut-LSN"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "förväntade minst två rader"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "sista raden är inte nyradsterminerad"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "kunde inte initiera kontrollsumma för backup-manifest"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "kunde inte uppdatera kontrollsumma för backup-manifest"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "kunde inte göra klart kontrollsumma för backup-manifest"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "manifestet har ingen kontrollsumma"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "ogiltig kontrollsumma för manifest: \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "kontrollsumma för manifest matchar inte"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "kunde inte parsa backup-manifest: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "ingen backup-katalog angiven"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "kan inte ange både %s och %s"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\""
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "korrekt verifierad backup\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "duplicerad sökväg i backup-manifest: \"%s\""
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "kunde inte stänga katalog \"%s\": %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "kunde inte ta status på fil eller katalog \"%s\": %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" är inte en fil eller katalog"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" finns på disk men är inte i manifestet"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" har storlek %lld på disk men storlek %zu i manifestet"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" finns i manifestet men inte på disk"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "kunde inte initiera kontrollsumma för filen \"%s\""
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "kunde inte uppdatera kontrollsumma för filen \"%s\""
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "filen \"%s\" skall innehålla %zu byte men vi läste %zu byte"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "kunde inte göra klart kontrollsumma för filen \"%s\""
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "filen \"%s\" har kontrollsumma med längd %d men förväntade %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "kontrollsumman matchar inte för fil \"%s\""
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "WAL-parsning misslyckades för tidslinje %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s kB (%d%%) verifierad"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s verifierar en backup gentemot backup-manifestet.\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"Användning:\n"
+" %s [FLAGGOR]... BACKUPKAT\n"
+"\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error avsluta direkt vid fel\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIV_SÖKVÄG hoppa över angiven sökväg\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=SÖKVÄG använd denna sökväg till manifestet\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal försök inte parsa WAL-filer\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden förutom fel\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums hoppa över verifiering av kontrollsummor\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=SÖKVÄG använd denna sökväg till WAL-filer\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" is needed by %s but was not found in the\n"
+#~ "same directory as \"%s\".\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Programmet \"%s\" behövs av %s men hittades inte i samma\n"
+#~ "katalog som \"%s\".\n"
+#~ "Kontrollera din installation."
+
+#, c-format
+#~ msgid ""
+#~ "The program \"%s\" was found by \"%s\"\n"
+#~ "but was not the same version as %s.\n"
+#~ "Check your installation."
+#~ msgstr ""
+#~ "Programmet \"%s\" hittades av \"%s\"\n"
+#~ "men är inte av samma version som %s.\n"
+#~ "Kontrollera din installation."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatalt: "
diff --git a/src/bin/pg_verifybackup/po/uk.po b/src/bin/pg_verifybackup/po/uk.po
new file mode 100644
index 0000000..034b976
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/uk.po
@@ -0,0 +1,511 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:17+0000\n"
+"PO-Revision-Date: 2023-12-19 15:37\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_verifybackup.pot\n"
+"X-Crowdin-File-ID: 959\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "ÐеприпуÑтима Ñпеціальна поÑлідовніÑÑ‚ÑŒ \"\\%s\"."
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "Символ зі значеннÑм 0x%02x повинен бути пропущений."
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "ОчікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ введеннÑ, але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "ОчікувавÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ маÑиву або \"]\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "ОчікувалоÑÑŒ \",\" або \"]\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "ОчікувалоÑÑŒ \":\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "ОчікувалоÑÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON, але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "ÐеÑподіваний кінець вхідного Ñ€Ñдка."
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "ОчікувавÑÑ Ñ€Ñдок або \"}\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "ОчікувалоÑÑŒ \",\" або \"}\", але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "ОчікувавÑÑ Ñ€Ñдок, але знайдено \"%s\"."
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "ÐеприпуÑтимий маркер \"%s\"."
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 не можна перетворити в текÑÑ‚."
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "За \"\\u\" повинні прÑмувати чотири шіÑтнадцÑткових чиÑла."
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ Unicode не можна викориÑтовувати Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ кодових точок більше 007F, Ñкщо ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ UTF8."
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñимволу Unicode не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти в ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера %s."
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Старший Ñурогат Unicode не повинен прÑмувати за іншим Ñтаршим Ñурогатом."
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Молодший Ñурогат Unicode не повинен прÑмувати за іншим молодшим Ñурогатом."
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "помилка парÑингу"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "маніфеÑÑ‚ закінчивÑÑ Ð½ÐµÑподівано"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "неочікуваний початок об'єкта"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "неочікуваний кінець об'єкта"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "неочікуваний початок маÑиву"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "неочікуваний кінець маÑиву"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "індикатор очікуваної верÑÑ–Ñ—"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "нерозпізнане поле верхнього рівнÑ"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "неочікуване поле файлу"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "неочікуване поле діапазону WAL"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "неочікуване поле об'єкта"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "неочікувана верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "неочікуваний ÑкалÑÑ€"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "пропущено шлÑÑ…"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "Ñ– ім'Ñ ÑˆÐ»Ñху, Ñ– закодований шлÑÑ…"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "відÑутній розмір"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "контрольна Ñума без алгоритму"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "не вдалоÑÑ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "розмір файлу не Ñ” цілим чиÑлом"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "нерозпізнаний алгоритм контрольної Ñуми: \"%s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "неприпуÑтима контрольна Ñума Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "відÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñова шкала"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "відÑутній LSN початку"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "відÑутній LSN кінцÑ"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "чаÑова Ð»Ñ–Ð½Ñ–Ñ Ð½Ðµ Ñ” цілим чиÑлом"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початковий LSN"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцевий LSN"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "очікувалоÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– 2 Ñ€Ñдки"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "оÑтанній Ñ€Ñдок не завершений новим Ñ€Ñдком"
+
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму маніфеÑту"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму маніфеÑту"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "не вдалоÑÑ Ð¾Ñтаточно завершити контрольну Ñуму маніфеÑту"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "у маніфеÑÑ‚Ñ– немає контрольної Ñуми"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "неприпуÑтима контрольна Ñума маніфеÑту: \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "невідповідніÑÑ‚ÑŒ контрольної Ñуми маніфеÑту"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ маніфеÑÑ‚ резервної копії: %s"
+
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "не вказано папку резервної копії"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "не можна вказати Ñк %s, так Ñ– %s"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\""
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "резервну копію уÑпішно перевірено\n"
+
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m"
+
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "дубльований шлÑÑ… у маніфеÑÑ‚Ñ– резервного копіюваннÑ: \"%s\""
+
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл або каталог \"%s\": %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\" не є файлом або каталогом"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "\"%s\" приÑутній на диÑку, але не у маніфеÑÑ‚Ñ–"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" має розмір %lld на диÑку, але розмір %zu у маніфеÑÑ‚Ñ–"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "\"%s\" приÑутній у маніфеÑÑ‚Ñ–, але не на диÑку"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму файлу \"%s\""
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму файлу \"%s\""
+
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "файл \"%s\" муÑить міÑтити %zu байтів, але прочитано %zu байтів"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "не вдалоÑÑ Ð¾Ñтаточно завершити контрольну Ñуму файлу \"%s\""
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "файл \"%s\" має контрольну Ñуму довжини %d, але очікувалоÑÑŒ %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "невідповідніÑÑ‚ÑŒ контрольної Ñуми Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\""
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ WAL Ð´Ð»Ñ Ñ‡Ð°Ñової шкали %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "%*s/%s MB (%d%%) перевірено"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid "%s verifies a backup against the backup manifest.\n\n"
+msgstr "%s перевірÑÑ” резервну копію відповідно до маніфеÑту резервного копіюваннÑ.\n\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid "Usage:\n"
+" %s [OPTION]... BACKUPDIR\n\n"
+msgstr "ВикориÑтаннÑ:\n"
+" %s [OPTION]... КÐТÐЛОГ_КОПІЮВÐÐÐЯ\n\n"
+
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error вийти при помилці\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH ігнорувати вказаний шлÑÑ…\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH викориÑтовувати вказаний шлÑÑ… Ð´Ð»Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal не намагатиÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ файли WAL\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress повідомлÑти про хід процеÑу\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums не перевірÑти контрольні Ñуми\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH викориÑтовувати вказаний шлÑÑ… Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² WAL\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
diff --git a/src/bin/pg_verifybackup/po/zh_CN.po b/src/bin/pg_verifybackup/po/zh_CN.po
new file mode 100644
index 0000000..b7d97c8
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/zh_CN.po
@@ -0,0 +1,494 @@
+# LANGUAGE message translation file for pg_verifybackup
+# Copyright (C) 2020 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:45+0000\n"
+"PO-Revision-Date: 2021-08-15 16:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的:"
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/jsonapi.c:1066
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "转义åºåˆ— \"\\%s\" 无效."
+
+#: ../../common/jsonapi.c:1069
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "值为 0x%02x 的字符必须进行转义处ç†."
+
+#: ../../common/jsonapi.c:1072
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "期望输入结æŸï¼Œç»“æžœå‘现是\"%s\"."
+
+#: ../../common/jsonapi.c:1075
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "期望为数组元素或者\"]\",但å‘现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1078
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "期望是\",\" 或 \"]\",但å‘现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1081
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "期望得到 \":\",但å‘现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1084
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "期望是JSON值, 但结果å‘现是\"%s\"."
+
+#: ../../common/jsonapi.c:1087
+msgid "The input string ended unexpectedly."
+msgstr "输入字符串æ„外终止."
+
+#: ../../common/jsonapi.c:1089
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "期望是字符串或\"}\",但å‘现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1092
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "期望是 \",\" 或 \"}\",但å‘现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1095
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "期望是字符串, 但å‘现结果是\"%s\"."
+
+#: ../../common/jsonapi.c:1098
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "令牌 \"%s\" 无效."
+
+#: ../../common/jsonapi.c:1101
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000ä¸èƒ½è¢«è½¬æ¢ä¸ºæ–‡æœ¬ã€‚"
+
+#: ../../common/jsonapi.c:1103
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" åŽå¿…须紧跟有效的å六进制数数字"
+
+#: ../../common/jsonapi.c:1106
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "当编ç ä¸æ˜¯UTF8时,大于007Fçš„ç ä½å€¼ä¸èƒ½ä½¿ç”¨Unicode转义值."
+
+#: ../../common/jsonapi.c:1108
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicode 的高ä½ä»£ç†é¡¹ä¸èƒ½ç´§éšå¦ä¸€ä¸ªé«˜ä½ä»£ç†é¡¹."
+
+#: ../../common/jsonapi.c:1110
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicode 代ä½ä»£ç†é¡¹å¿…须紧éšä¸€ä¸ªé«˜ä½ä»£ç†é¡¹."
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "清å•æ„外结æŸ"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "æ„外的对象开始"
+
+#: parse_manifest.c:224
+msgid "unexpected object end"
+msgstr "æ„外的对象结æŸ"
+
+#: parse_manifest.c:251
+msgid "unexpected array start"
+msgstr "æ„外的数组开始"
+
+#: parse_manifest.c:274
+msgid "unexpected array end"
+msgstr "æ„外的数组结æŸ"
+
+#: parse_manifest.c:299
+msgid "expected version indicator"
+msgstr "预期的版本指示器"
+
+#: parse_manifest.c:328
+msgid "unrecognized top-level field"
+msgstr "无法识别的顶层字段"
+
+#: parse_manifest.c:347
+msgid "unexpected file field"
+msgstr "æ„外的文件字段"
+
+#: parse_manifest.c:361
+msgid "unexpected WAL range field"
+msgstr "æ„外的WAL范围字段"
+
+#: parse_manifest.c:367
+msgid "unexpected object field"
+msgstr "æ„外的对象字段"
+
+#: parse_manifest.c:397
+msgid "unexpected manifest version"
+msgstr "æ„外的清å•ç‰ˆæœ¬"
+
+#: parse_manifest.c:448
+msgid "unexpected scalar"
+msgstr "æ„外的标é‡"
+
+#: parse_manifest.c:472
+msgid "missing path name"
+msgstr "缺少路径å"
+
+#: parse_manifest.c:475
+msgid "both path name and encoded path name"
+msgstr "路径å和编ç è·¯å¾„å"
+
+#: parse_manifest.c:477
+msgid "missing size"
+msgstr "缺少大å°"
+
+#: parse_manifest.c:480
+msgid "checksum without algorithm"
+msgstr "校验和没有算法"
+
+#: parse_manifest.c:494
+msgid "could not decode file name"
+msgstr "无法解ç æ–‡ä»¶å"
+
+#: parse_manifest.c:504
+msgid "file size is not an integer"
+msgstr "文件大å°ä¸æ˜¯æ•´æ•°"
+
+#: parse_manifest.c:510
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "无法识别的校验和算法: \"%s\""
+
+#: parse_manifest.c:529
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "文件\"%s\"的校验和无效: \"%s\""
+
+#: parse_manifest.c:572
+msgid "missing timeline"
+msgstr "缺少时间线"
+
+#: parse_manifest.c:574
+msgid "missing start LSN"
+msgstr "缺少起始LSN"
+
+#: parse_manifest.c:576
+msgid "missing end LSN"
+msgstr "缺少结æŸLSN"
+
+#: parse_manifest.c:582
+msgid "timeline is not an integer"
+msgstr "时间线ä¸æ˜¯æ•´æ•°"
+
+#: parse_manifest.c:585
+msgid "could not parse start LSN"
+msgstr "无法解æžèµ·å§‹LSN"
+
+#: parse_manifest.c:588
+msgid "could not parse end LSN"
+msgstr "无法解æžç»“æŸLSN"
+
+#: parse_manifest.c:649
+msgid "expected at least 2 lines"
+msgstr "至少需è¦2è¡Œ"
+
+#: parse_manifest.c:652
+msgid "last line not newline-terminated"
+msgstr "最åŽä¸€è¡Œæœªä»¥æ¢è¡Œç¬¦ç»“å°¾"
+
+#: parse_manifest.c:657
+#, c-format
+msgid "out of memory"
+msgstr "内存ä¸è¶³"
+
+#: parse_manifest.c:659
+msgid "could not initialize checksum of manifest"
+msgstr "无法åˆå§‹åŒ–清å•çš„校验和"
+
+#: parse_manifest.c:661
+msgid "could not update checksum of manifest"
+msgstr "无法更新清å•çš„校验和"
+
+#: parse_manifest.c:664
+msgid "could not finalize checksum of manifest"
+msgstr "无法完æˆæ¸…å•çš„校验和"
+
+#: parse_manifest.c:668
+#, c-format
+msgid "manifest has no checksum"
+msgstr "清å•æ²¡æœ‰æ ¡éªŒå’Œ"
+
+#: parse_manifest.c:672
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "清å•æ ¡éªŒå’Œæ— æ•ˆ: \"%s\""
+
+#: parse_manifest.c:676
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "清å•æ ¡éªŒå’Œä¸åŒ¹é…"
+
+#: parse_manifest.c:691
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "清å•æ ¡éªŒå’Œä¸åŒ¹é…: %s"
+
+#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: pg_verifybackup.c:264
+#, c-format
+msgid "no backup directory specified"
+msgstr "未指定备份目录"
+
+#: pg_verifybackup.c:275
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_verifybackup.c:298
+#, c-format
+msgid ""
+"The program \"%s\" is needed by %s but was not found in the\n"
+"same directory as \"%s\".\n"
+"Check your installation."
+msgstr ""
+"%2$s需è¦ç¨‹åº\"%1$s\"\n"
+"但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n"
+"检查您的安装."
+
+#: pg_verifybackup.c:303
+#, c-format
+msgid ""
+"The program \"%s\" was found by \"%s\"\n"
+"but was not the same version as %s.\n"
+"Check your installation."
+msgstr ""
+"程åº\"%s\"是由\"%s\"找到的\n"
+"但与%s的版本ä¸åŒ.\n"
+"检查您的安装."
+
+#: pg_verifybackup.c:362
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "备份已æˆåŠŸéªŒè¯\n"
+
+#: pg_verifybackup.c:388 pg_verifybackup.c:724
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: pg_verifybackup.c:392
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法å–文件 \"%s\" 的状æ€: %m"
+
+#: pg_verifybackup.c:412 pg_verifybackup.c:753
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读å–文件 \"%s\": %m"
+
+#: pg_verifybackup.c:415
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "无法读å–文件\"%1$s\":读å–了%3$lld中的%2$d"
+
+#: pg_verifybackup.c:475
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "备份清å•ä¸­çš„路径åé‡å¤: \"%s\""
+
+#: pg_verifybackup.c:538 pg_verifybackup.c:545
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: pg_verifybackup.c:577
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "无法关闭目录 \"%s\": %m"
+
+#: pg_verifybackup.c:597
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "无法统计文件或目录\"%s\": %m"
+
+#: pg_verifybackup.c:620
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "\"%s\"ä¸æ˜¯æ–‡ä»¶æˆ–目录"
+
+#: pg_verifybackup.c:630
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "ç£ç›˜ä¸Šæœ‰\"%s\",但清å•ä¸­æ²¡æœ‰"
+
+#: pg_verifybackup.c:642
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\"在ç£ç›˜ä¸Šæœ‰å¤§å°%lld,但在清å•ä¸­æœ‰å¤§å°%zu"
+
+#: pg_verifybackup.c:669
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "清å•ä¸­æœ‰\"%s\",但ç£ç›˜ä¸Šæ²¡æœ‰"
+
+#: pg_verifybackup.c:732
+msgid "could not initialize checksum of file \"%s\""
+msgstr "无法åˆå§‹åŒ–文件\"%s\"的校验和"
+
+#: pg_verifybackup.c:744
+msgid "could not update checksum of file \"%s\""
+msgstr "无法更新文件\"%s\"的校验和"
+
+#: pg_verifybackup.c:759
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "无法关闭文件 \"%s\": %m"
+
+#: pg_verifybackup.c:778
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "文件\"%s\"应包å«%zu到字节,但读å–到%zu字节"
+
+#: pg_verifybackup.c:788
+msgid "could not finalize checksum of file \"%s\""
+msgstr "无法完æˆæ–‡ä»¶\"%s\"的校验和"
+
+#: pg_verifybackup.c:796
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "文件\"%s\"的校验和长度为%d,但应为%d"
+
+#: pg_verifybackup.c:800
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "文件\"%s\"的校验和ä¸åŒ¹é…"
+
+#: pg_verifybackup.c:824
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "时间线%uçš„WAL解æžå¤±è´¥"
+
+#: pg_verifybackup.c:910
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s æ ¹æ®å¤‡ä»½æ¸…å•éªŒè¯å¤‡ä»½.\n"
+"\n"
+
+#: pg_verifybackup.c:911
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [选项]... BACKUPDIR\n"
+"\n"
+
+#: pg_verifybackup.c:912
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: pg_verifybackup.c:913
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error 出错时立å³é€€å‡º\n"
+
+#: pg_verifybackup.c:914
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH 忽略指定的路径\n"
+
+#: pg_verifybackup.c:915
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH 使用清å•çš„指定路径\n"
+
+#: pg_verifybackup.c:916
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal ä¸è¯•å›¾è§£æžWAL文件\n"
+
+#: pg_verifybackup.c:917
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet ä¸æ‰“å°ä»»ä½•è¾“出,错误除外\n"
+
+#: pg_verifybackup.c:918
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums 跳过校验和验è¯\n"
+
+#: pg_verifybackup.c:919
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH 对WAL文件使用指定路径\n"
+
+#: pg_verifybackup.c:920
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯ï¼Œç„¶åŽé€€å‡º\n"
+
+#: pg_verifybackup.c:921
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助,然åŽé€€å‡º\n"
+
+#: pg_verifybackup.c:922
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: pg_verifybackup.c:923
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
diff --git a/src/bin/pg_verifybackup/po/zh_TW.po b/src/bin/pg_verifybackup/po/zh_TW.po
new file mode 100644
index 0000000..c1b710b
--- /dev/null
+++ b/src/bin/pg_verifybackup/po/zh_TW.po
@@ -0,0 +1,583 @@
+# Traditional Chinese message translation file for pg_verifybackup
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:47+0000\n"
+"PO-Revision-Date: 2023-11-06 08:50+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體用盡\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+#: ../../common/jsonapi.c:1144
+#, c-format
+msgid "Escape sequence \"\\%s\" is invalid."
+msgstr "無效的跳脫åºåˆ— \"\\%s\"。"
+
+#: ../../common/jsonapi.c:1147
+#, c-format
+msgid "Character with value 0x%02x must be escaped."
+msgstr "必須跳脫值為 0x%02x 的字元。"
+
+#: ../../common/jsonapi.c:1150
+#, c-format
+msgid "Expected end of input, but found \"%s\"."
+msgstr "é æœŸè¼¸å…¥çµæŸï¼Œä½†æ‰¾åˆ° \"%s\"。"
+
+#: ../../common/jsonapi.c:1153
+#, c-format
+msgid "Expected array element or \"]\", but found \"%s\"."
+msgstr "é æœŸæ˜¯é™£åˆ—元素或 \"]\",但找到 \"%s\"。"
+
+#: ../../common/jsonapi.c:1156
+#, c-format
+msgid "Expected \",\" or \"]\", but found \"%s\"."
+msgstr "é æœŸæ˜¯ \",\" 或 \"]\",但找到 \"%s\"。"
+
+#: ../../common/jsonapi.c:1159
+#, c-format
+msgid "Expected \":\", but found \"%s\"."
+msgstr "é æœŸæ˜¯ \":\",但找到 \"%s\""
+
+#: ../../common/jsonapi.c:1162
+#, c-format
+msgid "Expected JSON value, but found \"%s\"."
+msgstr "é æœŸæ˜¯ JSON 內容,但找到 \"%s\"。"
+
+#: ../../common/jsonapi.c:1165
+msgid "The input string ended unexpectedly."
+msgstr "輸入字串éžé æœŸåœ°çµæŸã€‚"
+
+#: ../../common/jsonapi.c:1167
+#, c-format
+msgid "Expected string or \"}\", but found \"%s\"."
+msgstr "é æœŸæ˜¯å­—串或 \"}\",但找到 \"%s\"。"
+
+#: ../../common/jsonapi.c:1170
+#, c-format
+msgid "Expected \",\" or \"}\", but found \"%s\"."
+msgstr "é æœŸæ˜¯ \",\" 或 \"}\",但找到 \"%s\"。"
+
+#: ../../common/jsonapi.c:1173
+#, c-format
+msgid "Expected string, but found \"%s\"."
+msgstr "é æœŸæ˜¯å­—串,但找到 \"%s\"。"
+
+#: ../../common/jsonapi.c:1176
+#, c-format
+msgid "Token \"%s\" is invalid."
+msgstr "Token \"%s\" 是無效的。"
+
+#: ../../common/jsonapi.c:1179
+msgid "\\u0000 cannot be converted to text."
+msgstr "\\u0000 無法轉æˆæ–‡å­—。"
+
+#: ../../common/jsonapi.c:1181
+msgid "\"\\u\" must be followed by four hexadecimal digits."
+msgstr "\"\\u\" 必須後接四個å六進ä½æ•¸å­—。"
+
+#: ../../common/jsonapi.c:1184
+msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."
+msgstr "當編碼ä¸æ˜¯ UTF8 時,無法使用 Unicode 跳脫值來表示大於 007F 的編碼ä½ç½®ã€‚"
+
+#: ../../common/jsonapi.c:1187
+#, c-format
+msgid "Unicode escape value could not be translated to the server's encoding %s."
+msgstr "Unicode 跳脫值ä¸èƒ½è¢«è½‰æˆä¼ºæœå™¨çš„編碼 %s。"
+
+#: ../../common/jsonapi.c:1190
+msgid "Unicode high surrogate must not follow a high surrogate."
+msgstr "Unicode 高ä½ä»£ç†ä¸èƒ½è·Ÿè‘—高ä½ä»£ç†ã€‚"
+
+#: ../../common/jsonapi.c:1192
+msgid "Unicode low surrogate must follow a high surrogate."
+msgstr "Unicode 低ä½ä»£ç†å¿…須跟著高ä½ä»£ç†ã€‚"
+
+#: parse_manifest.c:150
+msgid "parsing failed"
+msgstr "解æžå¤±æ•—"
+
+#: parse_manifest.c:152
+msgid "manifest ended unexpectedly"
+msgstr "清單éžé æœŸåœ°çµæŸ"
+
+#: parse_manifest.c:191
+msgid "unexpected object start"
+msgstr "éžé æœŸçš„物件開始"
+
+#: parse_manifest.c:226
+msgid "unexpected object end"
+msgstr "éžé æœŸçš„物件çµæŸ"
+
+#: parse_manifest.c:255
+msgid "unexpected array start"
+msgstr "éžé æœŸçš„陣列開始"
+
+#: parse_manifest.c:280
+msgid "unexpected array end"
+msgstr "éžé æœŸçš„陣列çµæŸ"
+
+#: parse_manifest.c:307
+msgid "expected version indicator"
+msgstr "é æœŸçš„版本指示器"
+
+#: parse_manifest.c:336
+msgid "unrecognized top-level field"
+msgstr "無法識別的頂層欄ä½"
+
+#: parse_manifest.c:355
+msgid "unexpected file field"
+msgstr "éžé æœŸçš„檔案欄ä½"
+
+#: parse_manifest.c:369
+msgid "unexpected WAL range field"
+msgstr "éžé æœŸçš„ WAL 範åœæ¬„ä½"
+
+#: parse_manifest.c:375
+msgid "unexpected object field"
+msgstr "éžé æœŸçš„物件欄ä½"
+
+#: parse_manifest.c:407
+msgid "unexpected manifest version"
+msgstr "éžé æœŸçš„清單版本"
+
+#: parse_manifest.c:458
+msgid "unexpected scalar"
+msgstr "éžé æœŸçš„ç´”é‡å€¼"
+
+#: parse_manifest.c:484
+msgid "missing path name"
+msgstr "缺少路徑å稱"
+
+#: parse_manifest.c:487
+msgid "both path name and encoded path name"
+msgstr "åŒæ™‚存在路徑å稱和編碼路徑å稱"
+
+#: parse_manifest.c:489
+msgid "missing size"
+msgstr "缺少大å°"
+
+#: parse_manifest.c:492
+msgid "checksum without algorithm"
+msgstr "檢查碼沒有演算法"
+
+#: parse_manifest.c:506
+msgid "could not decode file name"
+msgstr "無法解碼檔案å稱"
+
+#: parse_manifest.c:516
+msgid "file size is not an integer"
+msgstr "檔案大å°ä¸æ˜¯æ•´æ•¸"
+
+#: parse_manifest.c:522
+#, c-format
+msgid "unrecognized checksum algorithm: \"%s\""
+msgstr "無法識別的檢查碼演算法: \" %s\""
+
+#: parse_manifest.c:541
+#, c-format
+msgid "invalid checksum for file \"%s\": \"%s\""
+msgstr "檔案 \"%s\" 的檢查碼無效: \"%s\""
+
+#: parse_manifest.c:584
+msgid "missing timeline"
+msgstr "缺少時間線"
+
+#: parse_manifest.c:586
+msgid "missing start LSN"
+msgstr "缺少起始 LSN"
+
+#: parse_manifest.c:588
+msgid "missing end LSN"
+msgstr "缺少çµæŸ LSN"
+
+#: parse_manifest.c:594
+msgid "timeline is not an integer"
+msgstr "時間線ä¸æ˜¯æ•´æ•¸"
+
+#: parse_manifest.c:597
+msgid "could not parse start LSN"
+msgstr "無法解æžèµ·å§‹ LSN"
+
+#: parse_manifest.c:600
+msgid "could not parse end LSN"
+msgstr "無法解æžçµæŸ LSN"
+
+#: parse_manifest.c:661
+msgid "expected at least 2 lines"
+msgstr "é æœŸè‡³å°‘有 2 è¡Œ"
+
+#: parse_manifest.c:664
+msgid "last line not newline-terminated"
+msgstr "最後一行未以æ›è¡Œç¬¦è™ŸçµæŸ"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: parse_manifest.c:669
+#, c-format
+msgid "out of memory"
+msgstr "記憶體ä¸è¶³"
+
+#: parse_manifest.c:671
+#, c-format
+msgid "could not initialize checksum of manifest"
+msgstr "無法åˆå§‹åŒ–清單的檢查碼"
+
+#: parse_manifest.c:673
+#, c-format
+msgid "could not update checksum of manifest"
+msgstr "無法更新清單的檢查碼"
+
+#: parse_manifest.c:676
+#, c-format
+msgid "could not finalize checksum of manifest"
+msgstr "無法完æˆæ¸…單的檢查碼"
+
+#: parse_manifest.c:680
+#, c-format
+msgid "manifest has no checksum"
+msgstr "清單沒有檢查碼"
+
+#: parse_manifest.c:684
+#, c-format
+msgid "invalid manifest checksum: \"%s\""
+msgstr "無效的清單檢查碼: \"%s\""
+
+#: parse_manifest.c:688
+#, c-format
+msgid "manifest checksum mismatch"
+msgstr "清單檢查碼ä¸ä¸€è‡´"
+
+#: parse_manifest.c:703
+#, c-format
+msgid "could not parse backup manifest: %s"
+msgstr "無法解æžå‚™ä»½æ¸…å–®: %s"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: pg_verifybackup.c:281
+#, c-format
+msgid "no backup directory specified"
+msgstr "未指定備份目錄"
+
+#: pg_verifybackup.c:291
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+#: pg_verifybackup.c:299
+#, c-format
+msgid "cannot specify both %s and %s"
+msgstr "無法åŒæ™‚指定 %s å’Œ %s"
+
+#: pg_verifybackup.c:319
+#, c-format
+msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\""
+msgstr "ç¨‹å¼ \"%s\" 為 %s 所需,但未在åŒä¸€ç›®éŒ„中找到 \"%s\""
+
+#: pg_verifybackup.c:322
+#, c-format
+msgid "program \"%s\" was found by \"%s\" but was not the same version as %s"
+msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本ä¸åŒæ–¼ %s"
+
+#: pg_verifybackup.c:378
+#, c-format
+msgid "backup successfully verified\n"
+msgstr "備份檢查æˆåŠŸ\n"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: pg_verifybackup.c:404 pg_verifybackup.c:748
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案 \"%s\": %m"
+
+# access/transam/xlog.c:1936 access/transam/xlog.c:2038
+# access/transam/xlog.c:5291
+#: pg_verifybackup.c:408
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "無法å–得檔案 \"%s\" 的狀態: %m"
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: pg_verifybackup.c:428 pg_verifybackup.c:779
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "無法讀å–檔案 \"%s\": %m"
+
+#: pg_verifybackup.c:431
+#, c-format
+msgid "could not read file \"%s\": read %d of %lld"
+msgstr "無法讀å–檔案 \"%s\": å·²è®€å– %d / %lld"
+
+#: pg_verifybackup.c:491
+#, c-format
+msgid "duplicate path name in backup manifest: \"%s\""
+msgstr "備份清單中有é‡è¤‡çš„路徑å稱: \"%s\""
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_verifybackup.c:554 pg_verifybackup.c:561
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄 \"%s\": %m"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_verifybackup.c:593
+#, c-format
+msgid "could not close directory \"%s\": %m"
+msgstr "無法關閉目錄 \"%s\": %m"
+
+# access/transam/slru.c:967 commands/tablespace.c:577
+# commands/tablespace.c:721
+#: pg_verifybackup.c:613
+#, c-format
+msgid "could not stat file or directory \"%s\": %m"
+msgstr "無法å–得檔案或目錄 \"%s\" 的狀態: %m"
+
+#: pg_verifybackup.c:636
+#, c-format
+msgid "\"%s\" is not a file or directory"
+msgstr "%s ä¸æ˜¯æª”案也ä¸æ˜¯ç›®éŒ„"
+
+#: pg_verifybackup.c:646
+#, c-format
+msgid "\"%s\" is present on disk but not in the manifest"
+msgstr "ç£ç¢Ÿæœ‰ \"%s\" 但ä¸åœ¨æ¸…單上"
+
+#: pg_verifybackup.c:658
+#, c-format
+msgid "\"%s\" has size %lld on disk but size %zu in the manifest"
+msgstr "\"%s\" 在ç£ç¢Ÿçš„大å°ç‚º %lld 但在清單上的大å°ç‚º %zu"
+
+#: pg_verifybackup.c:689
+#, c-format
+msgid "\"%s\" is present in the manifest but not on disk"
+msgstr "清單有 \"%s\" 但ä¸åœ¨ç£ç¢Ÿä¸Š"
+
+#: pg_verifybackup.c:756
+#, c-format
+msgid "could not initialize checksum of file \"%s\""
+msgstr "無法åˆå§‹åŒ–檔案 \"%s\" 的檢查碼"
+
+#: pg_verifybackup.c:768
+#, c-format
+msgid "could not update checksum of file \"%s\""
+msgstr "無法更新檔案 \"%s\" 的檢查碼"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: pg_verifybackup.c:785
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "無法關閉檔案\"%s\": %m"
+
+#: pg_verifybackup.c:804
+#, c-format
+msgid "file \"%s\" should contain %zu bytes, but read %zu bytes"
+msgstr "檔案 \"%s\" æ‡‰è©²åŒ…å« %zu ä½å…ƒçµ„ï¼Œä½†å¯¦éš›è®€å– %zu ä½å…ƒçµ„"
+
+#: pg_verifybackup.c:814
+#, c-format
+msgid "could not finalize checksum of file \"%s\""
+msgstr "無法完æˆæª”案 \"%s\" 的檢查碼"
+
+#: pg_verifybackup.c:822
+#, c-format
+msgid "file \"%s\" has checksum of length %d, but expected %d"
+msgstr "檔案 \"%s\" 的檢查碼長度為 %d,但é æœŸç‚º %d"
+
+#: pg_verifybackup.c:826
+#, c-format
+msgid "checksum mismatch for file \"%s\""
+msgstr "檔案 \"%s\" 的檢查碼ä¸ä¸€è‡´"
+
+#: pg_verifybackup.c:851
+#, c-format
+msgid "WAL parsing failed for timeline %u"
+msgstr "WAL 解æžå¤±æ•—,時間線 %u"
+
+#: pg_verifybackup.c:965
+#, c-format
+msgid "%*s/%s kB (%d%%) verified"
+msgstr "已驗證 %*s/%s kB (%d%%)"
+
+#: pg_verifybackup.c:982
+#, c-format
+msgid ""
+"%s verifies a backup against the backup manifest.\n"
+"\n"
+msgstr ""
+"%s 驗證備份和備份清單是å¦ä¸€è‡´ã€‚\n"
+"\n"
+
+#: pg_verifybackup.c:983
+#, c-format
+msgid ""
+"Usage:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+msgstr ""
+"用法:\n"
+" %s [OPTION]... BACKUPDIR\n"
+"\n"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: pg_verifybackup.c:984
+#, c-format
+msgid "Options:\n"
+msgstr "é¸é …: \n"
+
+#: pg_verifybackup.c:985
+#, c-format
+msgid " -e, --exit-on-error exit immediately on error\n"
+msgstr " -e, --exit-on-error 發生錯誤立å³çµæŸ\n"
+
+#: pg_verifybackup.c:986
+#, c-format
+msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n"
+msgstr " -i, --ignore=RELATIVE_PATH 忽略指定的路徑\n"
+
+#: pg_verifybackup.c:987
+#, c-format
+msgid " -m, --manifest-path=PATH use specified path for manifest\n"
+msgstr " -m, --manifest-path=PATH 指定清單的路徑\n"
+
+#: pg_verifybackup.c:988
+#, c-format
+msgid " -n, --no-parse-wal do not try to parse WAL files\n"
+msgstr " -n, --no-parse-wal ä¸å˜—è©¦è§£æž WAL 檔\n"
+
+#: pg_verifybackup.c:989
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 顯示進度資訊\n"
+
+#: pg_verifybackup.c:990
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet ä¸é¡¯ç¤ºä»»ä½•è¼¸å‡ºï¼Œé™¤äº†éŒ¯èª¤è¨Šæ¯\n"
+
+#: pg_verifybackup.c:991
+#, c-format
+msgid " -s, --skip-checksums skip checksum verification\n"
+msgstr " -s, --skip-checksums è·³éŽæª¢æŸ¥ç¢¼é©—è­‰\n"
+
+#: pg_verifybackup.c:992
+#, c-format
+msgid " -w, --wal-directory=PATH use specified path for WAL files\n"
+msgstr " -w, --wal-directory=PATH 用指定的路徑存放 WAL 檔\n"
+
+#: pg_verifybackup.c:993
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_verifybackup.c:994
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_verifybackup.c:995
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_verifybackup.c:996
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
diff --git a/src/bin/pg_verifybackup/t/001_basic.pl b/src/bin/pg_verifybackup/t/001_basic.pl
new file mode 100644
index 0000000..73e8663
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/001_basic.pl
@@ -0,0 +1,38 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+program_help_ok('pg_verifybackup');
+program_version_ok('pg_verifybackup');
+program_options_handling_ok('pg_verifybackup');
+
+command_fails_like(
+ ['pg_verifybackup'],
+ qr/no backup directory specified/,
+ 'target directory must be specified');
+command_fails_like(
+ [ 'pg_verifybackup', $tempdir ],
+ qr/could not open file.*\/backup_manifest\"/,
+ 'pg_verifybackup requires a manifest');
+command_fails_like(
+ [ 'pg_verifybackup', $tempdir, $tempdir ],
+ qr/too many command-line arguments/,
+ 'multiple target directories not allowed');
+
+# create fake manifest file
+open(my $fh, '>', "$tempdir/backup_manifest") || die "open: $!";
+close($fh);
+
+# but then try to use an alternate, nonexisting manifest
+command_fails_like(
+ [ 'pg_verifybackup', '-m', "$tempdir/not_the_manifest", $tempdir ],
+ qr/could not open file.*\/not_the_manifest\"/,
+ 'pg_verifybackup respects -m flag');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/002_algorithm.pl b/src/bin/pg_verifybackup/t/002_algorithm.pl
new file mode 100644
index 0000000..5b02ea4
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/002_algorithm.pl
@@ -0,0 +1,61 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Verify that we can take and verify backups with various checksum types.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+for my $algorithm (qw(bogus none crc32c sha224 sha256 sha384 sha512))
+{
+ my $backup_path = $primary->backup_dir . '/' . $algorithm;
+ my @backup = (
+ 'pg_basebackup', '-D', $backup_path,
+ '--manifest-checksums', $algorithm, '--no-sync', '-cfast');
+ my @verify = ('pg_verifybackup', '-e', $backup_path);
+
+ # A backup with a bogus algorithm should fail.
+ if ($algorithm eq 'bogus')
+ {
+ $primary->command_fails(\@backup,
+ "backup fails with algorithm \"$algorithm\"");
+ next;
+ }
+
+ # A backup with a valid algorithm should work.
+ $primary->command_ok(\@backup, "backup ok with algorithm \"$algorithm\"");
+
+ # We expect each real checksum algorithm to be mentioned on every line of
+ # the backup manifest file except the first and last; for simplicity, we
+ # just check that it shows up lots of times. When the checksum algorithm
+ # is none, we just check that the manifest exists.
+ if ($algorithm eq 'none')
+ {
+ ok(-f "$backup_path/backup_manifest", "backup manifest exists");
+ }
+ else
+ {
+ my $manifest = slurp_file("$backup_path/backup_manifest");
+ my $count_of_algorithm_in_manifest =
+ (() = $manifest =~ /$algorithm/mig);
+ cmp_ok($count_of_algorithm_in_manifest,
+ '>', 100, "$algorithm is mentioned many times in the manifest");
+ }
+
+ # Make sure that it verifies OK.
+ $primary->command_ok(\@verify,
+ "verify backup with algorithm \"$algorithm\"");
+
+ # Remove backup immediately to save disk space.
+ rmtree($backup_path);
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/003_corruption.pl b/src/bin/pg_verifybackup/t/003_corruption.pl
new file mode 100644
index 0000000..4cc3dd0
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/003_corruption.pl
@@ -0,0 +1,292 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Verify that various forms of corruption are detected by pg_verifybackup.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+# Include a user-defined tablespace in the hopes of detecting problems in that
+# area.
+my $source_ts_path = PostgreSQL::Test::Utils::tempdir_short();
+my $source_ts_prefix = $source_ts_path;
+$source_ts_prefix =~ s!(^[A-Z]:/[^/]*)/.*!$1!;
+
+$primary->safe_psql('postgres', <<EOM);
+CREATE TABLE x1 (a int);
+INSERT INTO x1 VALUES (111);
+CREATE TABLESPACE ts1 LOCATION '$source_ts_path';
+CREATE TABLE x2 (a int) TABLESPACE ts1;
+INSERT INTO x1 VALUES (222);
+EOM
+
+my @scenario = (
+ {
+ 'name' => 'extra_file',
+ 'mutilate' => \&mutilate_extra_file,
+ 'fails_like' =>
+ qr/extra_file.*present on disk but not in the manifest/
+ },
+ {
+ 'name' => 'extra_tablespace_file',
+ 'mutilate' => \&mutilate_extra_tablespace_file,
+ 'fails_like' =>
+ qr/extra_ts_file.*present on disk but not in the manifest/
+ },
+ {
+ 'name' => 'missing_file',
+ 'mutilate' => \&mutilate_missing_file,
+ 'fails_like' =>
+ qr/pg_xact\/0000.*present in the manifest but not on disk/
+ },
+ {
+ 'name' => 'missing_tablespace',
+ 'mutilate' => \&mutilate_missing_tablespace,
+ 'fails_like' =>
+ qr/pg_tblspc.*present in the manifest but not on disk/
+ },
+ {
+ 'name' => 'append_to_file',
+ 'mutilate' => \&mutilate_append_to_file,
+ 'fails_like' => qr/has size \d+ on disk but size \d+ in the manifest/
+ },
+ {
+ 'name' => 'truncate_file',
+ 'mutilate' => \&mutilate_truncate_file,
+ 'fails_like' => qr/has size 0 on disk but size \d+ in the manifest/
+ },
+ {
+ 'name' => 'replace_file',
+ 'mutilate' => \&mutilate_replace_file,
+ 'fails_like' => qr/checksum mismatch for file/
+ },
+ {
+ 'name' => 'bad_manifest',
+ 'mutilate' => \&mutilate_bad_manifest,
+ 'fails_like' => qr/manifest checksum mismatch/
+ },
+ {
+ 'name' => 'open_file_fails',
+ 'mutilate' => \&mutilate_open_file_fails,
+ 'fails_like' => qr/could not open file/,
+ 'skip_on_windows' => 1
+ },
+ {
+ 'name' => 'open_directory_fails',
+ 'mutilate' => \&mutilate_open_directory_fails,
+ 'cleanup' => \&cleanup_open_directory_fails,
+ 'fails_like' => qr/could not open directory/,
+ 'skip_on_windows' => 1
+ },
+ {
+ 'name' => 'search_directory_fails',
+ 'mutilate' => \&mutilate_search_directory_fails,
+ 'cleanup' => \&cleanup_search_directory_fails,
+ 'fails_like' => qr/could not stat file or directory/,
+ 'skip_on_windows' => 1
+ });
+
+for my $scenario (@scenario)
+{
+ my $name = $scenario->{'name'};
+
+ SKIP:
+ {
+ skip "unix-style permissions not supported on Windows", 4
+ if $scenario->{'skip_on_windows'} && $windows_os;
+
+ # Take a backup and check that it verifies OK.
+ my $backup_path = $primary->backup_dir . '/' . $name;
+ my $backup_ts_path = PostgreSQL::Test::Utils::tempdir_short();
+ # The tablespace map parameter confuses Msys2, which tries to mangle
+ # it. Tell it not to.
+ # See https://www.msys2.org/wiki/Porting/#filesystem-namespaces
+ local $ENV{MSYS2_ARG_CONV_EXCL} = $source_ts_prefix;
+ $primary->command_ok(
+ [
+ 'pg_basebackup', '-D', $backup_path, '--no-sync', '-cfast',
+ '-T', "${source_ts_path}=${backup_ts_path}"
+ ],
+ "base backup ok");
+ command_ok([ 'pg_verifybackup', $backup_path ],
+ "intact backup verified");
+
+ # Mutilate the backup in some way.
+ $scenario->{'mutilate'}->($backup_path);
+
+ # Now check that the backup no longer verifies.
+ command_fails_like(
+ [ 'pg_verifybackup', $backup_path ],
+ $scenario->{'fails_like'},
+ "corrupt backup fails verification: $name");
+
+ # Run cleanup hook, if provided.
+ $scenario->{'cleanup'}->($backup_path)
+ if exists $scenario->{'cleanup'};
+
+ # Finally, use rmtree to reclaim space.
+ rmtree($backup_path);
+ }
+}
+
+sub create_extra_file
+{
+ my ($backup_path, $relative_path) = @_;
+ my $pathname = "$backup_path/$relative_path";
+ open(my $fh, '>', $pathname) || die "open $pathname: $!";
+ print $fh "This is an extra file.\n";
+ close($fh);
+ return;
+}
+
+# Add a file into the root directory of the backup.
+sub mutilate_extra_file
+{
+ my ($backup_path) = @_;
+ create_extra_file($backup_path, "extra_file");
+ return;
+}
+
+# Add a file inside the user-defined tablespace.
+sub mutilate_extra_tablespace_file
+{
+ my ($backup_path) = @_;
+ my ($tsoid) =
+ grep { $_ ne '.' && $_ ne '..' } slurp_dir("$backup_path/pg_tblspc");
+ my ($catvdir) = grep { $_ ne '.' && $_ ne '..' }
+ slurp_dir("$backup_path/pg_tblspc/$tsoid");
+ my ($tsdboid) = grep { $_ ne '.' && $_ ne '..' }
+ slurp_dir("$backup_path/pg_tblspc/$tsoid/$catvdir");
+ create_extra_file($backup_path,
+ "pg_tblspc/$tsoid/$catvdir/$tsdboid/extra_ts_file");
+ return;
+}
+
+# Remove a file.
+sub mutilate_missing_file
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/pg_xact/0000";
+ unlink($pathname) || die "$pathname: $!";
+ return;
+}
+
+# Remove the symlink to the user-defined tablespace.
+sub mutilate_missing_tablespace
+{
+ my ($backup_path) = @_;
+ my ($tsoid) =
+ grep { $_ ne '.' && $_ ne '..' } slurp_dir("$backup_path/pg_tblspc");
+ my $pathname = "$backup_path/pg_tblspc/$tsoid";
+ if ($windows_os)
+ {
+ # rmdir works on some windows setups, unlink on others.
+ # Instead of trying to implement precise rules, just try one and then
+ # the other.
+ unless (rmdir($pathname))
+ {
+ my $err = $!;
+ unlink($pathname) || die "$pathname: rmdir: $err, unlink: $!";
+ }
+ }
+ else
+ {
+ unlink($pathname) || die "$pathname: $!";
+ }
+ return;
+}
+
+# Append an additional bytes to a file.
+sub mutilate_append_to_file
+{
+ my ($backup_path) = @_;
+ append_to_file "$backup_path/global/pg_control", 'x';
+ return;
+}
+
+# Truncate a file to zero length.
+sub mutilate_truncate_file
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/global/pg_control";
+ open(my $fh, '>', $pathname) || die "open $pathname: $!";
+ close($fh);
+ return;
+}
+
+# Replace a file's contents without changing the length of the file. This is
+# not a particularly efficient way to do this, so we pick a file that's
+# expected to be short.
+sub mutilate_replace_file
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/PG_VERSION";
+ my $contents = slurp_file($pathname);
+ open(my $fh, '>', $pathname) || die "open $pathname: $!";
+ print $fh 'q' x length($contents);
+ close($fh);
+ return;
+}
+
+# Corrupt the backup manifest.
+sub mutilate_bad_manifest
+{
+ my ($backup_path) = @_;
+ append_to_file "$backup_path/backup_manifest", "\n";
+ return;
+}
+
+# Create a file that can't be opened. (This is skipped on Windows.)
+sub mutilate_open_file_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/PG_VERSION";
+ chmod(0, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# Create a directory that can't be opened. (This is skipped on Windows.)
+sub mutilate_open_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/pg_subtrans";
+ chmod(0, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# restore permissions on the unreadable directory we created.
+sub cleanup_open_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/pg_subtrans";
+ chmod(0700, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# Create a directory that can't be searched. (This is skipped on Windows.)
+sub mutilate_search_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/base";
+ chmod(0400, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+# rmtree can't cope with a mode 400 directory, so change back to 700.
+sub cleanup_search_directory_fails
+{
+ my ($backup_path) = @_;
+ my $pathname = "$backup_path/base";
+ chmod(0700, $pathname) || die "chmod $pathname: $!";
+ return;
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/004_options.pl b/src/bin/pg_verifybackup/t/004_options.pl
new file mode 100644
index 0000000..2aa8352
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/004_options.pl
@@ -0,0 +1,117 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Verify the behavior of assorted pg_verifybackup options.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Start up the server and take a backup.
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+my $backup_path = $primary->backup_dir . '/test_options';
+$primary->command_ok(
+ [ 'pg_basebackup', '-D', $backup_path, '--no-sync', '-cfast' ],
+ "base backup ok");
+
+# Verify that pg_verifybackup -q succeeds and produces no output.
+my $stdout;
+my $stderr;
+my $result = IPC::Run::run [ 'pg_verifybackup', '-q', $backup_path ],
+ '>', \$stdout, '2>', \$stderr;
+ok($result, "-q succeeds: exit code 0");
+is($stdout, '', "-q succeeds: no stdout");
+is($stderr, '', "-q succeeds: no stderr");
+
+# Test invalid options
+command_fails_like(
+ [ 'pg_verifybackup', '--progress', '--quiet', $backup_path ],
+ qr{cannot specify both -P/--progress and -q/--quiet},
+ 'cannot use --progress and --quiet at the same time');
+
+# Corrupt the PG_VERSION file.
+my $version_pathname = "$backup_path/PG_VERSION";
+my $version_contents = slurp_file($version_pathname);
+open(my $fh, '>', $version_pathname) || die "open $version_pathname: $!";
+print $fh 'q' x length($version_contents);
+close($fh);
+
+# Verify that pg_verifybackup -q now fails.
+command_fails_like(
+ [ 'pg_verifybackup', '-q', $backup_path ],
+ qr/checksum mismatch for file \"PG_VERSION\"/,
+ '-q checksum mismatch');
+
+# Since we didn't change the length of the file, verification should succeed
+# if we ignore checksums. Check that we get the right message, too.
+command_like(
+ [ 'pg_verifybackup', '-s', $backup_path ],
+ qr/backup successfully verified/,
+ '-s skips checksumming');
+
+# Validation should succeed if we ignore the problem file. Also, check
+# the progress information.
+command_checks_all(
+ [ 'pg_verifybackup', '--progress', '-i', 'PG_VERSION', $backup_path ],
+ 0,
+ [qr/backup successfully verified/],
+ [qr{(\d+/\d+ kB \(\d+%\) verified)+}],
+ '-i ignores problem file');
+
+# PG_VERSION is already corrupt; let's try also removing all of pg_xact.
+rmtree($backup_path . "/pg_xact");
+
+# We're ignoring the problem with PG_VERSION, but not the problem with
+# pg_xact, so verification should fail here.
+command_fails_like(
+ [ 'pg_verifybackup', '-i', 'PG_VERSION', $backup_path ],
+ qr/pg_xact.*is present in the manifest but not on disk/,
+ '-i does not ignore all problems');
+
+# If we use -i twice, we should be able to ignore all of the problems.
+command_like(
+ [ 'pg_verifybackup', '-i', 'PG_VERSION', '-i', 'pg_xact', $backup_path ],
+ qr/backup successfully verified/,
+ 'multiple -i options work');
+
+# Verify that when -i is not used, both problems are reported.
+$result = IPC::Run::run [ 'pg_verifybackup', $backup_path ],
+ '>', \$stdout, '2>', \$stderr;
+ok(!$result, "multiple problems: fails");
+like(
+ $stderr,
+ qr/pg_xact.*is present in the manifest but not on disk/,
+ "multiple problems: missing files reported");
+like(
+ $stderr,
+ qr/checksum mismatch for file \"PG_VERSION\"/,
+ "multiple problems: checksum mismatch reported");
+
+# Verify that when -e is used, only the problem detected first is reported.
+$result = IPC::Run::run [ 'pg_verifybackup', '-e', $backup_path ],
+ '>', \$stdout, '2>', \$stderr;
+ok(!$result, "-e reports 1 error: fails");
+like(
+ $stderr,
+ qr/pg_xact.*is present in the manifest but not on disk/,
+ "-e reports 1 error: missing files reported");
+unlike(
+ $stderr,
+ qr/checksum mismatch for file \"PG_VERSION\"/,
+ "-e reports 1 error: checksum mismatch not reported");
+
+# Test valid manifest with nonexistent backup directory.
+command_fails_like(
+ [
+ 'pg_verifybackup', '-m',
+ "$backup_path/backup_manifest", "$backup_path/fake"
+ ],
+ qr/could not open directory/,
+ 'nonexistent backup directory');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/005_bad_manifest.pl b/src/bin/pg_verifybackup/t/005_bad_manifest.pl
new file mode 100644
index 0000000..c94fdd5
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/005_bad_manifest.pl
@@ -0,0 +1,209 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Test the behavior of pg_verifybackup when the backup manifest has
+# problems.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+test_bad_manifest('input string ended unexpectedly',
+ qr/could not parse backup manifest: parsing failed/, <<EOM);
+{
+EOM
+
+test_parse_error('unexpected object end', <<EOM);
+{}
+EOM
+
+test_parse_error('unexpected array start', <<EOM);
+[]
+EOM
+
+test_parse_error('expected version indicator', <<EOM);
+{"not-expected": 1}
+EOM
+
+test_parse_error('unexpected manifest version', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": "phooey"}
+EOM
+
+test_parse_error('unexpected scalar', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": true}
+EOM
+
+test_parse_error('unrecognized top-level field', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Oops": 1}
+EOM
+
+test_parse_error('unexpected object start', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": {}}
+EOM
+
+test_parse_error('missing path name', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [{}]}
+EOM
+
+test_parse_error('both path name and encoded path name', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Encoded-Path": "1234"}
+]}
+EOM
+
+test_parse_error('unexpected file field', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Oops": 1}
+]}
+EOM
+
+test_parse_error('missing size', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x"}
+]}
+EOM
+
+test_parse_error('file size is not an integer', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": "Oops"}
+]}
+EOM
+
+test_parse_error('could not decode file name', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Encoded-Path": "123", "Size": 0}
+]}
+EOM
+
+test_fatal_error('duplicate path name in backup manifest', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 0},
+ {"Path": "x", "Size": 0}
+]}
+EOM
+
+test_parse_error('checksum without algorithm', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 100, "Checksum": "Oops"}
+]}
+EOM
+
+test_fatal_error('unrecognized checksum algorithm', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 100, "Checksum-Algorithm": "Oops", "Checksum": "00"}
+]}
+EOM
+
+test_fatal_error('invalid checksum for file', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [
+ {"Path": "x", "Size": 100, "Checksum-Algorithm": "CRC32C", "Checksum": "0"}
+]}
+EOM
+
+test_parse_error('missing start LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1}
+]}
+EOM
+
+test_parse_error('missing end LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('unexpected WAL range field', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Oops": 1}
+]}
+EOM
+
+test_parse_error('missing timeline', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {}
+]}
+EOM
+
+test_parse_error('unexpected object end', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "0/0", "End-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('timeline is not an integer', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": true, "Start-LSN": "0/0", "End-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('could not parse start LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "oops", "End-LSN": "0/0"}
+]}
+EOM
+
+test_parse_error('could not parse end LSN', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "WAL-Ranges": [
+ {"Timeline": 1, "Start-LSN": "0/0", "End-LSN": "oops"}
+]}
+EOM
+
+test_parse_error('expected at least 2 lines', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [], "Manifest-Checksum": null}
+EOM
+
+my $manifest_without_newline = <<EOM;
+{"PostgreSQL-Backup-Manifest-Version": 1,
+ "Files": [],
+ "Manifest-Checksum": null}
+EOM
+chomp($manifest_without_newline);
+test_parse_error('last line not newline-terminated',
+ $manifest_without_newline);
+
+test_fatal_error('invalid manifest checksum', <<EOM);
+{"PostgreSQL-Backup-Manifest-Version": 1, "Files": [],
+ "Manifest-Checksum": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890-"}
+EOM
+
+sub test_parse_error
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($test_name, $manifest_contents) = @_;
+
+ test_bad_manifest($test_name,
+ qr/could not parse backup manifest: $test_name/,
+ $manifest_contents);
+ return;
+}
+
+sub test_fatal_error
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($test_name, $manifest_contents) = @_;
+
+ test_bad_manifest($test_name, qr/error: $test_name/, $manifest_contents);
+ return;
+}
+
+sub test_bad_manifest
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($test_name, $regexp, $manifest_contents) = @_;
+
+ open(my $fh, '>', "$tempdir/backup_manifest") || die "open: $!";
+ print $fh $manifest_contents;
+ close($fh);
+
+ command_fails_like([ 'pg_verifybackup', $tempdir ], $regexp, $test_name);
+ return;
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/006_encoding.pl b/src/bin/pg_verifybackup/t/006_encoding.pl
new file mode 100644
index 0000000..0b37bda
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/006_encoding.pl
@@ -0,0 +1,34 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Verify that pg_verifybackup handles hex-encoded filenames correctly.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+my $backup_path = $primary->backup_dir . '/test_encoding';
+$primary->command_ok(
+ [
+ 'pg_basebackup', '-D',
+ $backup_path, '--no-sync',
+ '-cfast', '--manifest-force-encode'
+ ],
+ "backup ok with forced hex encoding");
+
+my $manifest = slurp_file("$backup_path/backup_manifest");
+my $count_of_encoded_path_in_manifest = (() = $manifest =~ /Encoded-Path/mig);
+cmp_ok($count_of_encoded_path_in_manifest,
+ '>', 100, "many paths are encoded in the manifest");
+
+command_like(
+ [ 'pg_verifybackup', '-s', $backup_path ],
+ qr/backup successfully verified/,
+ 'backup with forced encoding verified');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/007_wal.pl b/src/bin/pg_verifybackup/t/007_wal.pl
new file mode 100644
index 0000000..89f96f8
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/007_wal.pl
@@ -0,0 +1,79 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# Test pg_verifybackup's WAL verification.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Start up the server and take a backup.
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+my $backup_path = $primary->backup_dir . '/test_wal';
+$primary->command_ok(
+ [ 'pg_basebackup', '-D', $backup_path, '--no-sync', '-cfast' ],
+ "base backup ok");
+
+# Rename pg_wal.
+my $original_pg_wal = $backup_path . '/pg_wal';
+my $relocated_pg_wal = $primary->backup_dir . '/relocated_pg_wal';
+rename($original_pg_wal, $relocated_pg_wal) || die "rename pg_wal: $!";
+
+# WAL verification should fail.
+command_fails_like(
+ [ 'pg_verifybackup', $backup_path ],
+ qr/WAL parsing failed for timeline 1/,
+ 'missing pg_wal causes failure');
+
+# Should work if we skip WAL verification.
+command_ok(
+ [ 'pg_verifybackup', '-n', $backup_path ],
+ 'missing pg_wal OK if not verifying WAL');
+
+# Should also work if we specify the correct WAL location.
+command_ok([ 'pg_verifybackup', '-w', $relocated_pg_wal, $backup_path ],
+ '-w can be used to specify WAL directory');
+
+# Move directory back to original location.
+rename($relocated_pg_wal, $original_pg_wal) || die "rename pg_wal back: $!";
+
+# Get a list of files in that directory that look like WAL files.
+my @walfiles = grep { /^[0-9A-F]{24}$/ } slurp_dir($original_pg_wal);
+
+# Replace the contents of one of the files with garbage of equal length.
+my $wal_corruption_target = $original_pg_wal . '/' . $walfiles[0];
+my $wal_size = -s $wal_corruption_target;
+open(my $fh, '>', $wal_corruption_target)
+ || die "open $wal_corruption_target: $!";
+print $fh 'w' x $wal_size;
+close($fh);
+
+# WAL verification should fail.
+command_fails_like(
+ [ 'pg_verifybackup', $backup_path ],
+ qr/WAL parsing failed for timeline 1/,
+ 'corrupt WAL file causes failure');
+
+# Check that WAL-Ranges has correct values with a history file and
+# a timeline > 1. Rather than plugging in a new standby, do a
+# self-promotion of this node.
+$primary->stop;
+$primary->append_conf('standby.signal', '');
+$primary->start;
+$primary->promote;
+$primary->safe_psql('postgres', 'SELECT pg_switch_wal()');
+my $backup_path2 = $primary->backup_dir . '/test_tli';
+# The base backup run below does a checkpoint, that removes the first segment
+# of the current timeline.
+$primary->command_ok(
+ [ 'pg_basebackup', '-D', $backup_path2, '--no-sync', '-cfast' ],
+ "base backup 2 ok");
+command_ok(
+ [ 'pg_verifybackup', $backup_path2 ],
+ 'valid base backup with timeline > 1');
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl
new file mode 100644
index 0000000..1a783d1
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/008_untar.pl
@@ -0,0 +1,135 @@
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# This test case aims to verify that server-side backups and server-side
+# backup compression work properly, and it also aims to verify that
+# pg_verifybackup can verify a base backup that didn't start out in plain
+# format.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+my $backup_path = $primary->backup_dir . '/server-backup';
+my $extract_path = $primary->backup_dir . '/extracted-backup';
+
+my @test_configuration = (
+ {
+ 'compression_method' => 'none',
+ 'backup_flags' => [],
+ 'backup_archive' => 'base.tar',
+ 'enabled' => 1
+ },
+ {
+ 'compression_method' => 'gzip',
+ 'backup_flags' => [ '--compress', 'server-gzip' ],
+ 'backup_archive' => 'base.tar.gz',
+ 'decompress_program' => $ENV{'GZIP_PROGRAM'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define HAVE_LIBZ 1")
+ },
+ {
+ 'compression_method' => 'lz4',
+ 'backup_flags' => [ '--compress', 'server-lz4' ],
+ 'backup_archive' => 'base.tar.lz4',
+ 'decompress_program' => $ENV{'LZ4'},
+ 'decompress_flags' => [ '-d', '-m' ],
+ 'enabled' => check_pg_config("#define USE_LZ4 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd:level=1,long' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ });
+
+for my $tc (@test_configuration)
+{
+ my $method = $tc->{'compression_method'};
+
+ SKIP:
+ {
+ skip "$method compression not supported by this build", 3
+ if !$tc->{'enabled'};
+ skip "no decompressor available for $method", 3
+ if exists $tc->{'decompress_program'}
+ && (!defined $tc->{'decompress_program'}
+ || $tc->{'decompress_program'} eq '');
+
+ # Take a server-side backup.
+ my @backup = (
+ 'pg_basebackup', '--no-sync',
+ '-cfast', '--target',
+ "server:$backup_path", '-Xfetch');
+ push @backup, @{ $tc->{'backup_flags'} };
+ $primary->command_ok(\@backup,
+ "server side backup, compression $method");
+
+
+ # Verify that the we got the files we expected.
+ my $backup_files = join(',',
+ sort grep { $_ ne '.' && $_ ne '..' } slurp_dir($backup_path));
+ my $expected_backup_files =
+ join(',', sort ('backup_manifest', $tc->{'backup_archive'}));
+ is($backup_files, $expected_backup_files,
+ "found expected backup files, compression $method");
+
+ # Decompress.
+ if (exists $tc->{'decompress_program'})
+ {
+ my @decompress = ($tc->{'decompress_program'});
+ push @decompress, @{ $tc->{'decompress_flags'} }
+ if $tc->{'decompress_flags'};
+ push @decompress, $backup_path . '/' . $tc->{'backup_archive'};
+ system_or_bail(@decompress);
+ }
+
+ SKIP:
+ {
+ my $tar = $ENV{TAR};
+ # don't check for a working tar here, to accommodate various odd
+ # cases such as AIX. If tar doesn't work the init_from_backup below
+ # will fail.
+ skip "no tar program available", 1
+ if (!defined $tar || $tar eq '');
+
+ # Untar.
+ mkdir($extract_path);
+ system_or_bail($tar, 'xf', $backup_path . '/base.tar',
+ '-C', $extract_path);
+
+ # Verify.
+ $primary->command_ok(
+ [
+ 'pg_verifybackup', '-n',
+ '-m', "$backup_path/backup_manifest",
+ '-e', $extract_path
+ ],
+ "verify backup, compression $method");
+ }
+
+ # Cleanup.
+ unlink($backup_path . '/backup_manifest');
+ unlink($backup_path . '/base.tar');
+ unlink($backup_path . '/' . $tc->{'backup_archive'});
+ rmtree($extract_path);
+ }
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl
new file mode 100644
index 0000000..f4d5378
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/009_extract.pl
@@ -0,0 +1,97 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# This test aims to verify that the client can decompress and extract
+# a backup which was compressed by the server.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+my @test_configuration = (
+ {
+ 'compression_method' => 'none',
+ 'backup_flags' => [],
+ 'enabled' => 1
+ },
+ {
+ 'compression_method' => 'gzip',
+ 'backup_flags' => [ '--compress', 'server-gzip:5' ],
+ 'enabled' => check_pg_config("#define HAVE_LIBZ 1")
+ },
+ {
+ 'compression_method' => 'lz4',
+ 'backup_flags' => [ '--compress', 'server-lz4:5' ],
+ 'enabled' => check_pg_config("#define USE_LZ4 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd:5' ],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ },
+ {
+ 'compression_method' => 'parallel zstd',
+ 'backup_flags' => [ '--compress', 'server-zstd:workers=3' ],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1"),
+ 'possibly_unsupported' =>
+ qr/could not set compression worker count to 3: Unsupported parameter/
+ });
+
+for my $tc (@test_configuration)
+{
+ my $backup_path = $primary->backup_dir . '/' . 'extract_backup';
+ my $method = $tc->{'compression_method'};
+
+ SKIP:
+ {
+ skip "$method compression not supported by this build", 2
+ if !$tc->{'enabled'};
+
+ # Take backup with server compression enabled.
+ my @backup = (
+ 'pg_basebackup', '-D', $backup_path,
+ '-Xfetch', '--no-sync', '-cfast', '-Fp');
+ push @backup, @{ $tc->{'backup_flags'} };
+
+ my @verify = ('pg_verifybackup', '-e', $backup_path);
+
+ # A backup with a valid compression method should work.
+ my $backup_stdout = '';
+ my $backup_stderr = '';
+ my $backup_result = $primary->run_log(\@backup, '>', \$backup_stdout,
+ '2>', \$backup_stderr);
+ if ($backup_stdout ne '')
+ {
+ print "# standard output was:\n$backup_stdout";
+ }
+ if ($backup_stderr ne '')
+ {
+ print "# standard error was:\n$backup_stderr";
+ }
+ if ( !$backup_result
+ && $tc->{'possibly_unsupported'}
+ && $backup_stderr =~ /$tc->{'possibly_unsupported'}/)
+ {
+ skip "compression with $method not supported by this build", 2;
+ }
+ else
+ {
+ ok($backup_result, "backup done, compression $method");
+ }
+
+ # Make sure that it verifies OK.
+ $primary->command_ok(\@verify,
+ "backup verified, compression method \"$method\"");
+ }
+
+ # Remove backup immediately to save disk space.
+ rmtree($backup_path);
+}
+
+done_testing();
diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl
new file mode 100644
index 0000000..44d83e7
--- /dev/null
+++ b/src/bin/pg_verifybackup/t/010_client_untar.pl
@@ -0,0 +1,163 @@
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+# This test case aims to verify that client-side backup compression work
+# properly, and it also aims to verify that pg_verifybackup can verify a base
+# backup that didn't start out in plain format.
+
+use strict;
+use warnings;
+use File::Path qw(rmtree);
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $primary = PostgreSQL::Test::Cluster->new('primary');
+$primary->init(allows_streaming => 1);
+$primary->start;
+
+my $backup_path = $primary->backup_dir . '/client-backup';
+my $extract_path = $primary->backup_dir . '/extracted-backup';
+
+my @test_configuration = (
+ {
+ 'compression_method' => 'none',
+ 'backup_flags' => [],
+ 'backup_archive' => 'base.tar',
+ 'enabled' => 1
+ },
+ {
+ 'compression_method' => 'gzip',
+ 'backup_flags' => [ '--compress', 'client-gzip:5' ],
+ 'backup_archive' => 'base.tar.gz',
+ 'decompress_program' => $ENV{'GZIP_PROGRAM'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define HAVE_LIBZ 1")
+ },
+ {
+ 'compression_method' => 'lz4',
+ 'backup_flags' => [ '--compress', 'client-lz4:5' ],
+ 'backup_archive' => 'base.tar.lz4',
+ 'decompress_program' => $ENV{'LZ4'},
+ 'decompress_flags' => ['-d'],
+ 'output_file' => 'base.tar',
+ 'enabled' => check_pg_config("#define USE_LZ4 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'client-zstd:5' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ },
+ {
+ 'compression_method' => 'zstd',
+ 'backup_flags' => [ '--compress', 'client-zstd:level=1,long' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1")
+ },
+ {
+ 'compression_method' => 'parallel zstd',
+ 'backup_flags' => [ '--compress', 'client-zstd:workers=3' ],
+ 'backup_archive' => 'base.tar.zst',
+ 'decompress_program' => $ENV{'ZSTD'},
+ 'decompress_flags' => ['-d'],
+ 'enabled' => check_pg_config("#define USE_ZSTD 1"),
+ 'possibly_unsupported' =>
+ qr/could not set compression worker count to 3: Unsupported parameter/
+ });
+
+for my $tc (@test_configuration)
+{
+ my $method = $tc->{'compression_method'};
+
+ SKIP:
+ {
+ skip "$method compression not supported by this build", 3
+ if !$tc->{'enabled'};
+ skip "no decompressor available for $method", 3
+ if exists $tc->{'decompress_program'}
+ && (!defined $tc->{'decompress_program'}
+ || $tc->{'decompress_program'} eq '');
+
+ # Take a client-side backup.
+ my @backup = (
+ 'pg_basebackup', '-D', $backup_path,
+ '-Xfetch', '--no-sync', '-cfast', '-Ft');
+ push @backup, @{ $tc->{'backup_flags'} };
+ my $backup_stdout = '';
+ my $backup_stderr = '';
+ my $backup_result = $primary->run_log(\@backup, '>', \$backup_stdout,
+ '2>', \$backup_stderr);
+ if ($backup_stdout ne '')
+ {
+ print "# standard output was:\n$backup_stdout";
+ }
+ if ($backup_stderr ne '')
+ {
+ print "# standard error was:\n$backup_stderr";
+ }
+ if ( !$backup_result
+ && $tc->{'possibly_unsupported'}
+ && $backup_stderr =~ /$tc->{'possibly_unsupported'}/)
+ {
+ skip "compression with $method not supported by this build", 3;
+ }
+ else
+ {
+ ok($backup_result, "client side backup, compression $method");
+ }
+
+ # Verify that the we got the files we expected.
+ my $backup_files = join(',',
+ sort grep { $_ ne '.' && $_ ne '..' } slurp_dir($backup_path));
+ my $expected_backup_files =
+ join(',', sort ('backup_manifest', $tc->{'backup_archive'}));
+ is($backup_files, $expected_backup_files,
+ "found expected backup files, compression $method");
+
+ # Decompress.
+ if (exists $tc->{'decompress_program'})
+ {
+ my @decompress = ($tc->{'decompress_program'});
+ push @decompress, @{ $tc->{'decompress_flags'} }
+ if $tc->{'decompress_flags'};
+ push @decompress, $backup_path . '/' . $tc->{'backup_archive'};
+ push @decompress, $backup_path . '/' . $tc->{'output_file'}
+ if $tc->{'output_file'};
+ system_or_bail(@decompress);
+ }
+
+ SKIP:
+ {
+ my $tar = $ENV{TAR};
+ # don't check for a working tar here, to accommodate various odd
+ # cases such as AIX. If tar doesn't work the init_from_backup below
+ # will fail.
+ skip "no tar program available", 1
+ if (!defined $tar || $tar eq '');
+
+ # Untar.
+ mkdir($extract_path);
+ system_or_bail($tar, 'xf', $backup_path . '/base.tar',
+ '-C', $extract_path);
+
+ # Verify.
+ $primary->command_ok(
+ [
+ 'pg_verifybackup', '-n',
+ '-m', "$backup_path/backup_manifest",
+ '-e', $extract_path
+ ],
+ "verify backup, compression $method");
+ }
+
+ # Cleanup.
+ rmtree($extract_path);
+ rmtree($backup_path);
+ }
+}
+
+done_testing();
diff --git a/src/bin/pg_waldump/.gitignore b/src/bin/pg_waldump/.gitignore
new file mode 100644
index 0000000..ec51f41
--- /dev/null
+++ b/src/bin/pg_waldump/.gitignore
@@ -0,0 +1,32 @@
+/pg_waldump
+
+# Source files copied from src/backend/access/rmgrdesc/
+/brindesc.c
+/clogdesc.c
+/committsdesc.c
+/dbasedesc.c
+/genericdesc.c
+/gindesc.c
+/gistdesc.c
+/hashdesc.c
+/heapdesc.c
+/logicalmsgdesc.c
+/mxactdesc.c
+/nbtdesc.c
+/relmapdesc.c
+/replorigindesc.c
+/rmgrdesc_utils.c
+/seqdesc.c
+/smgrdesc.c
+/spgdesc.c
+/standbydesc.c
+/tblspcdesc.c
+/xactdesc.c
+/xlogdesc.c
+
+# Source files copied from src/backend/access/transam/
+/xlogreader.c
+/xlogstats.c
+
+# Generated by test suite
+/tmp_check/
diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile
new file mode 100644
index 0000000..0ecf582
--- /dev/null
+++ b/src/bin/pg_waldump/Makefile
@@ -0,0 +1,56 @@
+# src/bin/pg_waldump/Makefile
+
+PGFILEDESC = "pg_waldump - decode and display WAL"
+PGAPPICON=win32
+
+subdir = src/bin/pg_waldump
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(RMGRDESCOBJS) \
+ $(WIN32RES) \
+ compat.o \
+ pg_waldump.o \
+ rmgrdesc.o \
+ xlogreader.o \
+ xlogstats.o
+
+override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
+
+RMGRDESCSOURCES = $(sort $(notdir $(wildcard $(top_srcdir)/src/backend/access/rmgrdesc/*desc*.c)))
+RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
+
+
+all: pg_waldump
+
+pg_waldump: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%
+ rm -f $@ && $(LN_S) $< .
+
+xlogstats.c: % : $(top_srcdir)/src/backend/access/transam/%
+ rm -f $@ && $(LN_S) $< .
+
+$(RMGRDESCSOURCES): % : $(top_srcdir)/src/backend/access/rmgrdesc/%
+ rm -f $@ && $(LN_S) $< .
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_waldump$(X) '$(DESTDIR)$(bindir)/pg_waldump$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_waldump$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_waldump$(X) $(OBJS) $(RMGRDESCSOURCES) xlogreader.c xlogstats.c
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_waldump/compat.c b/src/bin/pg_waldump/compat.c
new file mode 100644
index 0000000..2aca73f
--- /dev/null
+++ b/src/bin/pg_waldump/compat.c
@@ -0,0 +1,64 @@
+/*-------------------------------------------------------------------------
+ *
+ * compat.c
+ * Reimplementations of various backend functions.
+ *
+ * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_waldump/compat.c
+ *
+ * This file contains client-side implementations for various backend
+ * functions that the rm_desc functions in *desc.c files rely on.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/* ugly hack, same as in e.g pg_controldata */
+#define FRONTEND 1
+#include "postgres.h"
+
+#include <time.h>
+
+#include "utils/datetime.h"
+
+/* copied from timestamp.c */
+pg_time_t
+timestamptz_to_time_t(TimestampTz t)
+{
+ pg_time_t result;
+
+ result = (pg_time_t) (t / USECS_PER_SEC +
+ ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY));
+ return result;
+}
+
+/*
+ * Stopgap implementation of timestamptz_to_str that doesn't depend on backend
+ * infrastructure. This will work for timestamps that are within the range
+ * of the platform time_t type. (pg_time_t is compatible except for possibly
+ * being wider.)
+ *
+ * XXX the return value points to a static buffer, so beware of using more
+ * than one result value concurrently.
+ *
+ * XXX: The backend timestamp infrastructure should instead be split out and
+ * moved into src/common. That's a large project though.
+ */
+const char *
+timestamptz_to_str(TimestampTz t)
+{
+ static char buf[MAXDATELEN + 1];
+ char ts[MAXDATELEN + 1];
+ char zone[MAXDATELEN + 1];
+ time_t result = (time_t) timestamptz_to_time_t(t);
+ struct tm *ltime = localtime(&result);
+
+ strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S", ltime);
+ strftime(zone, sizeof(zone), "%Z", ltime);
+
+ snprintf(buf, sizeof(buf), "%s.%06d %s",
+ ts, (int) (t % USECS_PER_SEC), zone);
+
+ return buf;
+}
diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build
new file mode 100644
index 0000000..ae674d1
--- /dev/null
+++ b/src/bin/pg_waldump/meson.build
@@ -0,0 +1,39 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_waldump_sources = files(
+ 'compat.c',
+ 'pg_waldump.c',
+ 'rmgrdesc.c',
+)
+
+pg_waldump_sources += rmgr_desc_sources
+pg_waldump_sources += xlogreader_sources
+pg_waldump_sources += files('../../backend/access/transam/xlogstats.c')
+
+if host_system == 'windows'
+ pg_waldump_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_waldump',
+ '--FILEDESC', 'pg_waldump - decode and display WA'])
+endif
+
+pg_waldump = executable('pg_waldump',
+ pg_waldump_sources,
+ dependencies: [frontend_code, lz4, zstd],
+ c_args: ['-DFRONTEND'], # needed for xlogreader et al
+ kwargs: default_bin_args,
+)
+bin_targets += pg_waldump
+
+tests += {
+ 'name': 'pg_waldump',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_save_fullpage.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_waldump/nls.mk b/src/bin/pg_waldump/nls.mk
new file mode 100644
index 0000000..4f00e12
--- /dev/null
+++ b/src/bin/pg_waldump/nls.mk
@@ -0,0 +1,9 @@
+# src/bin/pg_waldump/nls.mk
+CATALOG_NAME = pg_waldump
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_waldump.c \
+ xlogreader.c \
+ xlogstats.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ report_invalid_record:2:c-format
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
new file mode 100644
index 0000000..96845e1
--- /dev/null
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -0,0 +1,1319 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_waldump.c - decode and display WAL
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_waldump/pg_waldump.c
+ *-------------------------------------------------------------------------
+ */
+
+#define FRONTEND 1
+#include "postgres.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/transam.h"
+#include "access/xlog_internal.h"
+#include "access/xlogreader.h"
+#include "access/xlogrecord.h"
+#include "access/xlogstats.h"
+#include "common/fe_memutils.h"
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "common/relpath.h"
+#include "getopt_long.h"
+#include "rmgrdesc.h"
+#include "storage/bufpage.h"
+
+/*
+ * NOTE: For any code change or issue fix here, it is highly recommended to
+ * give a thought about doing the same in pg_walinspect contrib module as well.
+ */
+
+static const char *progname;
+
+static int WalSegSz;
+static volatile sig_atomic_t time_to_stop = false;
+
+static const RelFileLocator emptyRelFileLocator = {0, 0, 0};
+
+typedef struct XLogDumpPrivate
+{
+ TimeLineID timeline;
+ XLogRecPtr startptr;
+ XLogRecPtr endptr;
+ bool endptr_reached;
+} XLogDumpPrivate;
+
+typedef struct XLogDumpConfig
+{
+ /* display options */
+ bool quiet;
+ bool bkp_details;
+ int stop_after_records;
+ int already_displayed_records;
+ bool follow;
+ bool stats;
+ bool stats_per_record;
+
+ /* filter options */
+ bool filter_by_rmgr[RM_MAX_ID + 1];
+ bool filter_by_rmgr_enabled;
+ TransactionId filter_by_xid;
+ bool filter_by_xid_enabled;
+ RelFileLocator filter_by_relation;
+ bool filter_by_extended;
+ bool filter_by_relation_enabled;
+ BlockNumber filter_by_relation_block;
+ bool filter_by_relation_block_enabled;
+ ForkNumber filter_by_relation_forknum;
+ bool filter_by_fpw;
+
+ /* save options */
+ char *save_fullpage_path;
+} XLogDumpConfig;
+
+
+/*
+ * When sigint is called, just tell the system to exit at the next possible
+ * moment.
+ */
+#ifndef WIN32
+
+static void
+sigint_handler(SIGNAL_ARGS)
+{
+ time_to_stop = true;
+}
+#endif
+
+static void
+print_rmgr_list(void)
+{
+ int i;
+
+ for (i = 0; i <= RM_MAX_BUILTIN_ID; i++)
+ {
+ printf("%s\n", GetRmgrDesc(i)->rm_name);
+ }
+}
+
+/*
+ * Check whether directory exists and whether we can open it. Keep errno set so
+ * that the caller can report errors somewhat more accurately.
+ */
+static bool
+verify_directory(const char *directory)
+{
+ DIR *dir = opendir(directory);
+
+ if (dir == NULL)
+ return false;
+ closedir(dir);
+ return true;
+}
+
+/*
+ * Create if necessary the directory storing the full-page images extracted
+ * from the WAL records read.
+ */
+static void
+create_fullpage_directory(char *path)
+{
+ int ret;
+
+ switch ((ret = pg_check_dir(path)))
+ {
+ case 0:
+ /* Does not exist, so create it */
+ if (pg_mkdir_p(path, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", path);
+ break;
+ case 1:
+ /* Present and empty, so do nothing */
+ break;
+ case 2:
+ case 3:
+ case 4:
+ /* Exists and not empty */
+ pg_fatal("directory \"%s\" exists but is not empty", path);
+ break;
+ default:
+ /* Trouble accessing directory */
+ pg_fatal("could not access directory \"%s\": %m", path);
+ }
+}
+
+/*
+ * Split a pathname as dirname(1) and basename(1) would.
+ *
+ * XXX this probably doesn't do very well on Windows. We probably need to
+ * apply canonicalize_path(), at the very least.
+ */
+static void
+split_path(const char *path, char **dir, char **fname)
+{
+ char *sep;
+
+ /* split filepath into directory & filename */
+ sep = strrchr(path, '/');
+
+ /* directory path */
+ if (sep != NULL)
+ {
+ *dir = pnstrdup(path, sep - path);
+ *fname = pg_strdup(sep + 1);
+ }
+ /* local directory */
+ else
+ {
+ *dir = NULL;
+ *fname = pg_strdup(path);
+ }
+}
+
+/*
+ * Open the file in the valid target directory.
+ *
+ * return a read only fd
+ */
+static int
+open_file_in_directory(const char *directory, const char *fname)
+{
+ int fd = -1;
+ char fpath[MAXPGPATH];
+
+ Assert(directory != NULL);
+
+ snprintf(fpath, MAXPGPATH, "%s/%s", directory, fname);
+ fd = open(fpath, O_RDONLY | PG_BINARY, 0);
+
+ if (fd < 0 && errno != ENOENT)
+ pg_fatal("could not open file \"%s\": %m", fname);
+ return fd;
+}
+
+/*
+ * Try to find fname in the given directory. Returns true if it is found,
+ * false otherwise. If fname is NULL, search the complete directory for any
+ * file with a valid WAL file name. If file is successfully opened, set the
+ * wal segment size.
+ */
+static bool
+search_directory(const char *directory, const char *fname)
+{
+ int fd = -1;
+ DIR *xldir;
+
+ /* open file if valid filename is provided */
+ if (fname != NULL)
+ fd = open_file_in_directory(directory, fname);
+
+ /*
+ * A valid file name is not passed, so search the complete directory. If
+ * we find any file whose name is a valid WAL file name then try to open
+ * it. If we cannot open it, bail out.
+ */
+ else if ((xldir = opendir(directory)) != NULL)
+ {
+ struct dirent *xlde;
+
+ while ((xlde = readdir(xldir)) != NULL)
+ {
+ if (IsXLogFileName(xlde->d_name))
+ {
+ fd = open_file_in_directory(directory, xlde->d_name);
+ fname = pg_strdup(xlde->d_name);
+ break;
+ }
+ }
+
+ closedir(xldir);
+ }
+
+ /* set WalSegSz if file is successfully opened */
+ if (fd >= 0)
+ {
+ PGAlignedXLogBlock buf;
+ int r;
+
+ r = read(fd, buf.data, XLOG_BLCKSZ);
+ if (r == XLOG_BLCKSZ)
+ {
+ XLogLongPageHeader longhdr = (XLogLongPageHeader) buf.data;
+
+ WalSegSz = longhdr->xlp_seg_size;
+
+ if (!IsValidWalSegSize(WalSegSz))
+ pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte",
+ "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes",
+ WalSegSz),
+ fname, WalSegSz);
+ }
+ else if (r < 0)
+ pg_fatal("could not read file \"%s\": %m",
+ fname);
+ else
+ pg_fatal("could not read file \"%s\": read %d of %d",
+ fname, r, XLOG_BLCKSZ);
+ close(fd);
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Identify the target directory.
+ *
+ * Try to find the file in several places:
+ * if directory != NULL:
+ * directory /
+ * directory / XLOGDIR /
+ * else
+ * .
+ * XLOGDIR /
+ * $PGDATA / XLOGDIR /
+ *
+ * The valid target directory is returned.
+ */
+static char *
+identify_target_directory(char *directory, char *fname)
+{
+ char fpath[MAXPGPATH];
+
+ if (directory != NULL)
+ {
+ if (search_directory(directory, fname))
+ return pg_strdup(directory);
+
+ /* directory / XLOGDIR */
+ snprintf(fpath, MAXPGPATH, "%s/%s", directory, XLOGDIR);
+ if (search_directory(fpath, fname))
+ return pg_strdup(fpath);
+ }
+ else
+ {
+ const char *datadir;
+
+ /* current directory */
+ if (search_directory(".", fname))
+ return pg_strdup(".");
+ /* XLOGDIR */
+ if (search_directory(XLOGDIR, fname))
+ return pg_strdup(XLOGDIR);
+
+ datadir = getenv("PGDATA");
+ /* $PGDATA / XLOGDIR */
+ if (datadir != NULL)
+ {
+ snprintf(fpath, MAXPGPATH, "%s/%s", datadir, XLOGDIR);
+ if (search_directory(fpath, fname))
+ return pg_strdup(fpath);
+ }
+ }
+
+ /* could not locate WAL file */
+ if (fname)
+ pg_fatal("could not locate WAL file \"%s\"", fname);
+ else
+ pg_fatal("could not find any WAL file");
+
+ return NULL; /* not reached */
+}
+
+/* pg_waldump's XLogReaderRoutine->segment_open callback */
+static void
+WALDumpOpenSegment(XLogReaderState *state, XLogSegNo nextSegNo,
+ TimeLineID *tli_p)
+{
+ TimeLineID tli = *tli_p;
+ char fname[MAXPGPATH];
+ int tries;
+
+ XLogFileName(fname, tli, nextSegNo, state->segcxt.ws_segsize);
+
+ /*
+ * In follow mode there is a short period of time after the server has
+ * written the end of the previous file before the new file is available.
+ * So we loop for 5 seconds looking for the file to appear before giving
+ * up.
+ */
+ for (tries = 0; tries < 10; tries++)
+ {
+ state->seg.ws_file = open_file_in_directory(state->segcxt.ws_dir, fname);
+ if (state->seg.ws_file >= 0)
+ return;
+ if (errno == ENOENT)
+ {
+ int save_errno = errno;
+
+ /* File not there yet, try again */
+ pg_usleep(500 * 1000);
+
+ errno = save_errno;
+ continue;
+ }
+ /* Any other error, fall through and fail */
+ break;
+ }
+
+ pg_fatal("could not find file \"%s\": %m", fname);
+}
+
+/*
+ * pg_waldump's XLogReaderRoutine->segment_close callback. Same as
+ * wal_segment_close
+ */
+static void
+WALDumpCloseSegment(XLogReaderState *state)
+{
+ close(state->seg.ws_file);
+ /* need to check errno? */
+ state->seg.ws_file = -1;
+}
+
+/* pg_waldump's XLogReaderRoutine->page_read callback */
+static int
+WALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen,
+ XLogRecPtr targetPtr, char *readBuff)
+{
+ XLogDumpPrivate *private = state->private_data;
+ int count = XLOG_BLCKSZ;
+ WALReadError errinfo;
+
+ if (private->endptr != InvalidXLogRecPtr)
+ {
+ if (targetPagePtr + XLOG_BLCKSZ <= private->endptr)
+ count = XLOG_BLCKSZ;
+ else if (targetPagePtr + reqLen <= private->endptr)
+ count = private->endptr - targetPagePtr;
+ else
+ {
+ private->endptr_reached = true;
+ return -1;
+ }
+ }
+
+ if (!WALRead(state, readBuff, targetPagePtr, count, private->timeline,
+ &errinfo))
+ {
+ WALOpenSegment *seg = &errinfo.wre_seg;
+ char fname[MAXPGPATH];
+
+ XLogFileName(fname, seg->ws_tli, seg->ws_segno,
+ state->segcxt.ws_segsize);
+
+ if (errinfo.wre_errno != 0)
+ {
+ errno = errinfo.wre_errno;
+ pg_fatal("could not read from file %s, offset %d: %m",
+ fname, errinfo.wre_off);
+ }
+ else
+ pg_fatal("could not read from file %s, offset %d: read %d of %d",
+ fname, errinfo.wre_off, errinfo.wre_read,
+ errinfo.wre_req);
+ }
+
+ return count;
+}
+
+/*
+ * Boolean to return whether the given WAL record matches a specific relation
+ * and optionally block.
+ */
+static bool
+XLogRecordMatchesRelationBlock(XLogReaderState *record,
+ RelFileLocator matchRlocator,
+ BlockNumber matchBlock,
+ ForkNumber matchFork)
+{
+ int block_id;
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ RelFileLocator rlocator;
+ ForkNumber forknum;
+ BlockNumber blk;
+
+ if (!XLogRecGetBlockTagExtended(record, block_id,
+ &rlocator, &forknum, &blk, NULL))
+ continue;
+
+ if ((matchFork == InvalidForkNumber || matchFork == forknum) &&
+ (RelFileLocatorEquals(matchRlocator, emptyRelFileLocator) ||
+ RelFileLocatorEquals(matchRlocator, rlocator)) &&
+ (matchBlock == InvalidBlockNumber || matchBlock == blk))
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Boolean to return whether the given WAL record contains a full page write.
+ */
+static bool
+XLogRecordHasFPW(XLogReaderState *record)
+{
+ int block_id;
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ if (!XLogRecHasBlockRef(record, block_id))
+ continue;
+
+ if (XLogRecHasBlockImage(record, block_id))
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Function to externally save all FPWs stored in the given WAL record.
+ * Decompression is applied to all the blocks saved, if necessary.
+ */
+static void
+XLogRecordSaveFPWs(XLogReaderState *record, const char *savepath)
+{
+ int block_id;
+
+ for (block_id = 0; block_id <= XLogRecMaxBlockId(record); block_id++)
+ {
+ PGAlignedBlock buf;
+ Page page;
+ char filename[MAXPGPATH];
+ char forkname[FORKNAMECHARS + 2]; /* _ + terminating zero */
+ FILE *file;
+ BlockNumber blk;
+ RelFileLocator rnode;
+ ForkNumber fork;
+
+ if (!XLogRecHasBlockRef(record, block_id))
+ continue;
+
+ if (!XLogRecHasBlockImage(record, block_id))
+ continue;
+
+ page = (Page) buf.data;
+
+ /* Full page exists, so let's save it */
+ if (!RestoreBlockImage(record, block_id, page))
+ pg_fatal("%s", record->errormsg_buf);
+
+ (void) XLogRecGetBlockTagExtended(record, block_id,
+ &rnode, &fork, &blk, NULL);
+
+ if (fork >= 0 && fork <= MAX_FORKNUM)
+ sprintf(forkname, "_%s", forkNames[fork]);
+ else
+ pg_fatal("invalid fork number: %u", fork);
+
+ snprintf(filename, MAXPGPATH, "%s/%08X-%08X-%08X.%u.%u.%u.%u%s", savepath,
+ record->seg.ws_tli,
+ LSN_FORMAT_ARGS(record->ReadRecPtr),
+ rnode.spcOid, rnode.dbOid, rnode.relNumber, blk, forkname);
+
+ file = fopen(filename, PG_BINARY_W);
+ if (!file)
+ pg_fatal("could not open file \"%s\": %m", filename);
+
+ if (fwrite(page, BLCKSZ, 1, file) != 1)
+ pg_fatal("could not write file \"%s\": %m", filename);
+
+ if (fclose(file) != 0)
+ pg_fatal("could not close file \"%s\": %m", filename);
+ }
+}
+
+/*
+ * Print a record to stdout
+ */
+static void
+XLogDumpDisplayRecord(XLogDumpConfig *config, XLogReaderState *record)
+{
+ const char *id;
+ const RmgrDescData *desc = GetRmgrDesc(XLogRecGetRmid(record));
+ uint32 rec_len;
+ uint32 fpi_len;
+ uint8 info = XLogRecGetInfo(record);
+ XLogRecPtr xl_prev = XLogRecGetPrev(record);
+ StringInfoData s;
+
+ XLogRecGetLen(record, &rec_len, &fpi_len);
+
+ printf("rmgr: %-11s len (rec/tot): %6u/%6u, tx: %10u, lsn: %X/%08X, prev %X/%08X, ",
+ desc->rm_name,
+ rec_len, XLogRecGetTotalLen(record),
+ XLogRecGetXid(record),
+ LSN_FORMAT_ARGS(record->ReadRecPtr),
+ LSN_FORMAT_ARGS(xl_prev));
+
+ id = desc->rm_identify(info);
+ if (id == NULL)
+ printf("desc: UNKNOWN (%x) ", info & ~XLR_INFO_MASK);
+ else
+ printf("desc: %s ", id);
+
+ initStringInfo(&s);
+ desc->rm_desc(&s, record);
+ printf("%s", s.data);
+
+ resetStringInfo(&s);
+ XLogRecGetBlockRefInfo(record, true, config->bkp_details, &s, NULL);
+ printf("%s", s.data);
+ pfree(s.data);
+}
+
+/*
+ * Display a single row of record counts and sizes for an rmgr or record.
+ */
+static void
+XLogDumpStatsRow(const char *name,
+ uint64 n, uint64 total_count,
+ uint64 rec_len, uint64 total_rec_len,
+ uint64 fpi_len, uint64 total_fpi_len,
+ uint64 tot_len, uint64 total_len)
+{
+ double n_pct,
+ rec_len_pct,
+ fpi_len_pct,
+ tot_len_pct;
+
+ n_pct = 0;
+ if (total_count != 0)
+ n_pct = 100 * (double) n / total_count;
+
+ rec_len_pct = 0;
+ if (total_rec_len != 0)
+ rec_len_pct = 100 * (double) rec_len / total_rec_len;
+
+ fpi_len_pct = 0;
+ if (total_fpi_len != 0)
+ fpi_len_pct = 100 * (double) fpi_len / total_fpi_len;
+
+ tot_len_pct = 0;
+ if (total_len != 0)
+ tot_len_pct = 100 * (double) tot_len / total_len;
+
+ printf("%-27s "
+ "%20" INT64_MODIFIER "u (%6.02f) "
+ "%20" INT64_MODIFIER "u (%6.02f) "
+ "%20" INT64_MODIFIER "u (%6.02f) "
+ "%20" INT64_MODIFIER "u (%6.02f)\n",
+ name, n, n_pct, rec_len, rec_len_pct, fpi_len, fpi_len_pct,
+ tot_len, tot_len_pct);
+}
+
+
+/*
+ * Display summary statistics about the records seen so far.
+ */
+static void
+XLogDumpDisplayStats(XLogDumpConfig *config, XLogStats *stats)
+{
+ int ri,
+ rj;
+ uint64 total_count = 0;
+ uint64 total_rec_len = 0;
+ uint64 total_fpi_len = 0;
+ uint64 total_len = 0;
+ double rec_len_pct,
+ fpi_len_pct;
+
+ /*
+ * Leave if no stats have been computed yet, as tracked by the end LSN.
+ */
+ if (XLogRecPtrIsInvalid(stats->endptr))
+ return;
+
+ /*
+ * Each row shows its percentages of the total, so make a first pass to
+ * calculate column totals.
+ */
+
+ for (ri = 0; ri <= RM_MAX_ID; ri++)
+ {
+ if (!RmgrIdIsValid(ri))
+ continue;
+
+ total_count += stats->rmgr_stats[ri].count;
+ total_rec_len += stats->rmgr_stats[ri].rec_len;
+ total_fpi_len += stats->rmgr_stats[ri].fpi_len;
+ }
+ total_len = total_rec_len + total_fpi_len;
+
+ printf("WAL statistics between %X/%X and %X/%X:\n",
+ LSN_FORMAT_ARGS(stats->startptr), LSN_FORMAT_ARGS(stats->endptr));
+
+ /*
+ * 27 is strlen("Transaction/COMMIT_PREPARED"), 20 is strlen(2^64), 8 is
+ * strlen("(100.00%)")
+ */
+
+ printf("%-27s %20s %8s %20s %8s %20s %8s %20s %8s\n"
+ "%-27s %20s %8s %20s %8s %20s %8s %20s %8s\n",
+ "Type", "N", "(%)", "Record size", "(%)", "FPI size", "(%)", "Combined size", "(%)",
+ "----", "-", "---", "-----------", "---", "--------", "---", "-------------", "---");
+
+ for (ri = 0; ri <= RM_MAX_ID; ri++)
+ {
+ uint64 count,
+ rec_len,
+ fpi_len,
+ tot_len;
+ const RmgrDescData *desc;
+
+ if (!RmgrIdIsValid(ri))
+ continue;
+
+ desc = GetRmgrDesc(ri);
+
+ if (!config->stats_per_record)
+ {
+ count = stats->rmgr_stats[ri].count;
+ rec_len = stats->rmgr_stats[ri].rec_len;
+ fpi_len = stats->rmgr_stats[ri].fpi_len;
+ tot_len = rec_len + fpi_len;
+
+ if (RmgrIdIsCustom(ri) && count == 0)
+ continue;
+
+ XLogDumpStatsRow(desc->rm_name,
+ count, total_count, rec_len, total_rec_len,
+ fpi_len, total_fpi_len, tot_len, total_len);
+ }
+ else
+ {
+ for (rj = 0; rj < MAX_XLINFO_TYPES; rj++)
+ {
+ const char *id;
+
+ count = stats->record_stats[ri][rj].count;
+ rec_len = stats->record_stats[ri][rj].rec_len;
+ fpi_len = stats->record_stats[ri][rj].fpi_len;
+ tot_len = rec_len + fpi_len;
+
+ /* Skip undefined combinations and ones that didn't occur */
+ if (count == 0)
+ continue;
+
+ /* the upper four bits in xl_info are the rmgr's */
+ id = desc->rm_identify(rj << 4);
+ if (id == NULL)
+ id = psprintf("UNKNOWN (%x)", rj << 4);
+
+ XLogDumpStatsRow(psprintf("%s/%s", desc->rm_name, id),
+ count, total_count, rec_len, total_rec_len,
+ fpi_len, total_fpi_len, tot_len, total_len);
+ }
+ }
+ }
+
+ printf("%-27s %20s %8s %20s %8s %20s %8s %20s\n",
+ "", "--------", "", "--------", "", "--------", "", "--------");
+
+ /*
+ * The percentages in earlier rows were calculated against the column
+ * total, but the ones that follow are against the row total. Note that
+ * these are displayed with a % symbol to differentiate them from the
+ * earlier ones, and are thus up to 9 characters long.
+ */
+
+ rec_len_pct = 0;
+ if (total_len != 0)
+ rec_len_pct = 100 * (double) total_rec_len / total_len;
+
+ fpi_len_pct = 0;
+ if (total_len != 0)
+ fpi_len_pct = 100 * (double) total_fpi_len / total_len;
+
+ printf("%-27s "
+ "%20" INT64_MODIFIER "u %-9s"
+ "%20" INT64_MODIFIER "u %-9s"
+ "%20" INT64_MODIFIER "u %-9s"
+ "%20" INT64_MODIFIER "u %-6s\n",
+ "Total", stats->count, "",
+ total_rec_len, psprintf("[%.02f%%]", rec_len_pct),
+ total_fpi_len, psprintf("[%.02f%%]", fpi_len_pct),
+ total_len, "[100%]");
+}
+
+static void
+usage(void)
+{
+ printf(_("%s decodes and displays PostgreSQL write-ahead logs for debugging.\n\n"),
+ progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [STARTSEG [ENDSEG]]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -b, --bkp-details output detailed information about backup blocks\n"));
+ printf(_(" -B, --block=N with --relation, only show records that modify block N\n"));
+ printf(_(" -e, --end=RECPTR stop reading at WAL location RECPTR\n"));
+ printf(_(" -f, --follow keep retrying after reaching end of WAL\n"));
+ printf(_(" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+ " valid names are main, fsm, vm, init\n"));
+ printf(_(" -n, --limit=N number of records to display\n"));
+ printf(_(" -p, --path=PATH directory in which to find WAL segment files or a\n"
+ " directory with a ./pg_wal that contains such files\n"
+ " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"));
+ printf(_(" -q, --quiet do not print any output, except for errors\n"));
+ printf(_(" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+ " use --rmgr=list to list valid resource manager names\n"));
+ printf(_(" -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"));
+ printf(_(" -s, --start=RECPTR start reading at WAL location RECPTR\n"));
+ printf(_(" -t, --timeline=TLI timeline from which to read WAL records\n"
+ " (default: 1 or the value used in STARTSEG)\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -w, --fullpage only show records with a full page write\n"));
+ printf(_(" -x, --xid=XID only show records with transaction ID XID\n"));
+ printf(_(" -z, --stats[=record] show statistics instead of records\n"
+ " (optionally, show per-record statistics)\n"));
+ printf(_(" --save-fullpage=DIR save full page images to DIR\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+int
+main(int argc, char **argv)
+{
+ uint32 xlogid;
+ uint32 xrecoff;
+ XLogReaderState *xlogreader_state;
+ XLogDumpPrivate private;
+ XLogDumpConfig config;
+ XLogStats stats;
+ XLogRecord *record;
+ XLogRecPtr first_record;
+ char *waldir = NULL;
+ char *errormsg;
+
+ static struct option long_options[] = {
+ {"bkp-details", no_argument, NULL, 'b'},
+ {"block", required_argument, NULL, 'B'},
+ {"end", required_argument, NULL, 'e'},
+ {"follow", no_argument, NULL, 'f'},
+ {"fork", required_argument, NULL, 'F'},
+ {"fullpage", no_argument, NULL, 'w'},
+ {"help", no_argument, NULL, '?'},
+ {"limit", required_argument, NULL, 'n'},
+ {"path", required_argument, NULL, 'p'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"relation", required_argument, NULL, 'R'},
+ {"rmgr", required_argument, NULL, 'r'},
+ {"start", required_argument, NULL, 's'},
+ {"timeline", required_argument, NULL, 't'},
+ {"xid", required_argument, NULL, 'x'},
+ {"version", no_argument, NULL, 'V'},
+ {"stats", optional_argument, NULL, 'z'},
+ {"save-fullpage", required_argument, NULL, 1},
+ {NULL, 0, NULL, 0}
+ };
+
+ int option;
+ int optindex = 0;
+
+#ifndef WIN32
+ pqsignal(SIGINT, sigint_handler);
+#endif
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_waldump"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_waldump (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ memset(&private, 0, sizeof(XLogDumpPrivate));
+ memset(&config, 0, sizeof(XLogDumpConfig));
+ memset(&stats, 0, sizeof(XLogStats));
+
+ private.timeline = 1;
+ private.startptr = InvalidXLogRecPtr;
+ private.endptr = InvalidXLogRecPtr;
+ private.endptr_reached = false;
+
+ config.quiet = false;
+ config.bkp_details = false;
+ config.stop_after_records = -1;
+ config.already_displayed_records = 0;
+ config.follow = false;
+ /* filter_by_rmgr array was zeroed by memset above */
+ config.filter_by_rmgr_enabled = false;
+ config.filter_by_xid = InvalidTransactionId;
+ config.filter_by_xid_enabled = false;
+ config.filter_by_extended = false;
+ config.filter_by_relation_enabled = false;
+ config.filter_by_relation_block_enabled = false;
+ config.filter_by_relation_forknum = InvalidForkNumber;
+ config.filter_by_fpw = false;
+ config.save_fullpage_path = NULL;
+ config.stats = false;
+ config.stats_per_record = false;
+
+ stats.startptr = InvalidXLogRecPtr;
+ stats.endptr = InvalidXLogRecPtr;
+
+ if (argc <= 1)
+ {
+ pg_log_error("no arguments specified");
+ goto bad_argument;
+ }
+
+ while ((option = getopt_long(argc, argv, "bB:e:fF:n:p:qr:R:s:t:wx:z",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'b':
+ config.bkp_details = true;
+ break;
+ case 'B':
+ if (sscanf(optarg, "%u", &config.filter_by_relation_block) != 1 ||
+ !BlockNumberIsValid(config.filter_by_relation_block))
+ {
+ pg_log_error("invalid block number: \"%s\"", optarg);
+ goto bad_argument;
+ }
+ config.filter_by_relation_block_enabled = true;
+ config.filter_by_extended = true;
+ break;
+ case 'e':
+ if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
+ {
+ pg_log_error("invalid WAL location: \"%s\"",
+ optarg);
+ goto bad_argument;
+ }
+ private.endptr = (uint64) xlogid << 32 | xrecoff;
+ break;
+ case 'f':
+ config.follow = true;
+ break;
+ case 'F':
+ config.filter_by_relation_forknum = forkname_to_number(optarg);
+ if (config.filter_by_relation_forknum == InvalidForkNumber)
+ {
+ pg_log_error("invalid fork name: \"%s\"", optarg);
+ goto bad_argument;
+ }
+ config.filter_by_extended = true;
+ break;
+ case 'n':
+ if (sscanf(optarg, "%d", &config.stop_after_records) != 1)
+ {
+ pg_log_error("invalid value \"%s\" for option %s", optarg, "-n/--limit");
+ goto bad_argument;
+ }
+ break;
+ case 'p':
+ waldir = pg_strdup(optarg);
+ break;
+ case 'q':
+ config.quiet = true;
+ break;
+ case 'r':
+ {
+ int rmid;
+
+ if (pg_strcasecmp(optarg, "list") == 0)
+ {
+ print_rmgr_list();
+ exit(EXIT_SUCCESS);
+ }
+
+ /*
+ * First look for the generated name of a custom rmgr, of
+ * the form "custom###". We accept this form, because the
+ * custom rmgr module is not loaded, so there's no way to
+ * know the real name. This convention should be
+ * consistent with that in rmgrdesc.c.
+ */
+ if (sscanf(optarg, "custom%03d", &rmid) == 1)
+ {
+ if (!RmgrIdIsCustom(rmid))
+ {
+ pg_log_error("custom resource manager \"%s\" does not exist",
+ optarg);
+ goto bad_argument;
+ }
+ config.filter_by_rmgr[rmid] = true;
+ config.filter_by_rmgr_enabled = true;
+ }
+ else
+ {
+ /* then look for builtin rmgrs */
+ for (rmid = 0; rmid <= RM_MAX_BUILTIN_ID; rmid++)
+ {
+ if (pg_strcasecmp(optarg, GetRmgrDesc(rmid)->rm_name) == 0)
+ {
+ config.filter_by_rmgr[rmid] = true;
+ config.filter_by_rmgr_enabled = true;
+ break;
+ }
+ }
+ if (rmid > RM_MAX_BUILTIN_ID)
+ {
+ pg_log_error("resource manager \"%s\" does not exist",
+ optarg);
+ goto bad_argument;
+ }
+ }
+ }
+ break;
+ case 'R':
+ if (sscanf(optarg, "%u/%u/%u",
+ &config.filter_by_relation.spcOid,
+ &config.filter_by_relation.dbOid,
+ &config.filter_by_relation.relNumber) != 3 ||
+ !OidIsValid(config.filter_by_relation.spcOid) ||
+ !RelFileNumberIsValid(config.filter_by_relation.relNumber))
+ {
+ pg_log_error("invalid relation specification: \"%s\"", optarg);
+ pg_log_error_detail("Expecting \"tablespace OID/database OID/relation filenode\".");
+ goto bad_argument;
+ }
+ config.filter_by_relation_enabled = true;
+ config.filter_by_extended = true;
+ break;
+ case 's':
+ if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
+ {
+ pg_log_error("invalid WAL location: \"%s\"",
+ optarg);
+ goto bad_argument;
+ }
+ else
+ private.startptr = (uint64) xlogid << 32 | xrecoff;
+ break;
+ case 't':
+
+ /*
+ * This is like option_parse_int() but needs to handle
+ * unsigned 32-bit int. Also, we accept both decimal and
+ * hexadecimal specifications here.
+ */
+ {
+ char *endptr;
+ unsigned long val;
+
+ errno = 0;
+ val = strtoul(optarg, &endptr, 0);
+
+ while (*endptr != '\0' && isspace((unsigned char) *endptr))
+ endptr++;
+
+ if (*endptr != '\0')
+ {
+ pg_log_error("invalid value \"%s\" for option %s",
+ optarg, "-t/--timeline");
+ goto bad_argument;
+ }
+
+ if (errno == ERANGE || val < 1 || val > UINT_MAX)
+ {
+ pg_log_error("%s must be in range %u..%u",
+ "-t/--timeline", 1, UINT_MAX);
+ goto bad_argument;
+ }
+
+ private.timeline = val;
+
+ break;
+ }
+ case 'w':
+ config.filter_by_fpw = true;
+ break;
+ case 'x':
+ if (sscanf(optarg, "%u", &config.filter_by_xid) != 1)
+ {
+ pg_log_error("invalid transaction ID specification: \"%s\"",
+ optarg);
+ goto bad_argument;
+ }
+ config.filter_by_xid_enabled = true;
+ break;
+ case 'z':
+ config.stats = true;
+ config.stats_per_record = false;
+ if (optarg)
+ {
+ if (strcmp(optarg, "record") == 0)
+ config.stats_per_record = true;
+ else if (strcmp(optarg, "rmgr") != 0)
+ {
+ pg_log_error("unrecognized value for option %s: %s",
+ "--stats", optarg);
+ goto bad_argument;
+ }
+ }
+ break;
+ case 1:
+ config.save_fullpage_path = pg_strdup(optarg);
+ break;
+ default:
+ goto bad_argument;
+ }
+ }
+
+ if (config.filter_by_relation_block_enabled &&
+ !config.filter_by_relation_enabled)
+ {
+ pg_log_error("option %s requires option %s to be specified",
+ "-B/--block", "-R/--relation");
+ goto bad_argument;
+ }
+
+ if ((optind + 2) < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 2]);
+ goto bad_argument;
+ }
+
+ if (waldir != NULL)
+ {
+ /* validate path points to directory */
+ if (!verify_directory(waldir))
+ {
+ pg_log_error("could not open directory \"%s\": %m", waldir);
+ goto bad_argument;
+ }
+ }
+
+ if (config.save_fullpage_path != NULL)
+ create_fullpage_directory(config.save_fullpage_path);
+
+ /* parse files as start/end boundaries, extract path if not specified */
+ if (optind < argc)
+ {
+ char *directory = NULL;
+ char *fname = NULL;
+ int fd;
+ XLogSegNo segno;
+
+ split_path(argv[optind], &directory, &fname);
+
+ if (waldir == NULL && directory != NULL)
+ {
+ waldir = directory;
+
+ if (!verify_directory(waldir))
+ pg_fatal("could not open directory \"%s\": %m", waldir);
+ }
+
+ waldir = identify_target_directory(waldir, fname);
+ fd = open_file_in_directory(waldir, fname);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\"", fname);
+ close(fd);
+
+ /* parse position from file */
+ XLogFromFileName(fname, &private.timeline, &segno, WalSegSz);
+
+ if (XLogRecPtrIsInvalid(private.startptr))
+ XLogSegNoOffsetToRecPtr(segno, 0, WalSegSz, private.startptr);
+ else if (!XLByteInSeg(private.startptr, segno, WalSegSz))
+ {
+ pg_log_error("start WAL location %X/%X is not inside file \"%s\"",
+ LSN_FORMAT_ARGS(private.startptr),
+ fname);
+ goto bad_argument;
+ }
+
+ /* no second file specified, set end position */
+ if (!(optind + 1 < argc) && XLogRecPtrIsInvalid(private.endptr))
+ XLogSegNoOffsetToRecPtr(segno + 1, 0, WalSegSz, private.endptr);
+
+ /* parse ENDSEG if passed */
+ if (optind + 1 < argc)
+ {
+ XLogSegNo endsegno;
+
+ /* ignore directory, already have that */
+ split_path(argv[optind + 1], &directory, &fname);
+
+ fd = open_file_in_directory(waldir, fname);
+ if (fd < 0)
+ pg_fatal("could not open file \"%s\"", fname);
+ close(fd);
+
+ /* parse position from file */
+ XLogFromFileName(fname, &private.timeline, &endsegno, WalSegSz);
+
+ if (endsegno < segno)
+ pg_fatal("ENDSEG %s is before STARTSEG %s",
+ argv[optind + 1], argv[optind]);
+
+ if (XLogRecPtrIsInvalid(private.endptr))
+ XLogSegNoOffsetToRecPtr(endsegno + 1, 0, WalSegSz,
+ private.endptr);
+
+ /* set segno to endsegno for check of --end */
+ segno = endsegno;
+ }
+
+
+ if (!XLByteInSeg(private.endptr, segno, WalSegSz) &&
+ private.endptr != (segno + 1) * WalSegSz)
+ {
+ pg_log_error("end WAL location %X/%X is not inside file \"%s\"",
+ LSN_FORMAT_ARGS(private.endptr),
+ argv[argc - 1]);
+ goto bad_argument;
+ }
+ }
+ else
+ waldir = identify_target_directory(waldir, NULL);
+
+ /* we don't know what to print */
+ if (XLogRecPtrIsInvalid(private.startptr))
+ {
+ pg_log_error("no start WAL location given");
+ goto bad_argument;
+ }
+
+ /* done with argument parsing, do the actual work */
+
+ /* we have everything we need, start reading */
+ xlogreader_state =
+ XLogReaderAllocate(WalSegSz, waldir,
+ XL_ROUTINE(.page_read = WALDumpReadPage,
+ .segment_open = WALDumpOpenSegment,
+ .segment_close = WALDumpCloseSegment),
+ &private);
+ if (!xlogreader_state)
+ pg_fatal("out of memory while allocating a WAL reading processor");
+
+ /* first find a valid recptr to start from */
+ first_record = XLogFindNextRecord(xlogreader_state, private.startptr);
+
+ if (first_record == InvalidXLogRecPtr)
+ pg_fatal("could not find a valid record after %X/%X",
+ LSN_FORMAT_ARGS(private.startptr));
+
+ /*
+ * Display a message that we're skipping data if `from` wasn't a pointer
+ * to the start of a record and also wasn't a pointer to the beginning of
+ * a segment (e.g. we were used in file mode).
+ */
+ if (first_record != private.startptr &&
+ XLogSegmentOffset(private.startptr, WalSegSz) != 0)
+ printf(ngettext("first record is after %X/%X, at %X/%X, skipping over %u byte\n",
+ "first record is after %X/%X, at %X/%X, skipping over %u bytes\n",
+ (first_record - private.startptr)),
+ LSN_FORMAT_ARGS(private.startptr),
+ LSN_FORMAT_ARGS(first_record),
+ (uint32) (first_record - private.startptr));
+
+ if (config.stats == true && !config.quiet)
+ stats.startptr = first_record;
+
+ for (;;)
+ {
+ if (time_to_stop)
+ {
+ /* We've been Ctrl-C'ed, so leave */
+ break;
+ }
+
+ /* try to read the next record */
+ record = XLogReadRecord(xlogreader_state, &errormsg);
+ if (!record)
+ {
+ if (!config.follow || private.endptr_reached)
+ break;
+ else
+ {
+ pg_usleep(1000000L); /* 1 second */
+ continue;
+ }
+ }
+
+ /* apply all specified filters */
+ if (config.filter_by_rmgr_enabled &&
+ !config.filter_by_rmgr[record->xl_rmid])
+ continue;
+
+ if (config.filter_by_xid_enabled &&
+ config.filter_by_xid != record->xl_xid)
+ continue;
+
+ /* check for extended filtering */
+ if (config.filter_by_extended &&
+ !XLogRecordMatchesRelationBlock(xlogreader_state,
+ config.filter_by_relation_enabled ?
+ config.filter_by_relation :
+ emptyRelFileLocator,
+ config.filter_by_relation_block_enabled ?
+ config.filter_by_relation_block :
+ InvalidBlockNumber,
+ config.filter_by_relation_forknum))
+ continue;
+
+ if (config.filter_by_fpw && !XLogRecordHasFPW(xlogreader_state))
+ continue;
+
+ /* perform any per-record work */
+ if (!config.quiet)
+ {
+ if (config.stats == true)
+ {
+ XLogRecStoreStats(&stats, xlogreader_state);
+ stats.endptr = xlogreader_state->EndRecPtr;
+ }
+ else
+ XLogDumpDisplayRecord(&config, xlogreader_state);
+ }
+
+ /* save full pages if requested */
+ if (config.save_fullpage_path != NULL)
+ XLogRecordSaveFPWs(xlogreader_state, config.save_fullpage_path);
+
+ /* check whether we printed enough */
+ config.already_displayed_records++;
+ if (config.stop_after_records > 0 &&
+ config.already_displayed_records >= config.stop_after_records)
+ break;
+ }
+
+ if (config.stats == true && !config.quiet)
+ XLogDumpDisplayStats(&config, &stats);
+
+ if (time_to_stop)
+ exit(0);
+
+ if (errormsg)
+ pg_fatal("error in WAL record at %X/%X: %s",
+ LSN_FORMAT_ARGS(xlogreader_state->ReadRecPtr),
+ errormsg);
+
+ XLogReaderFree(xlogreader_state);
+
+ return EXIT_SUCCESS;
+
+bad_argument:
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ return EXIT_FAILURE;
+}
diff --git a/src/bin/pg_waldump/po/LINGUAS b/src/bin/pg_waldump/po/LINGUAS
new file mode 100644
index 0000000..a8022e6
--- /dev/null
+++ b/src/bin/pg_waldump/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr it ja ka ko ru sv tr uk vi zh_CN zh_TW
diff --git a/src/bin/pg_waldump/po/cs.po b/src/bin/pg_waldump/po/cs.po
new file mode 100644
index 0000000..b8b1278
--- /dev/null
+++ b/src/bin/pg_waldump/po/cs.po
@@ -0,0 +1,338 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:14+0000\n"
+"PO-Revision-Date: 2020-10-31 21:06+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: pg_waldump.c:146
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: pg_waldump.c:202
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale hlaviÄka WAL souboru \"%s\" udává %d byte"
+msgstr[1] "velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale hlaviÄka WAL souboru \"%s\" udává %d byty"
+msgstr[2] "velikost WAL segmentu musí být mocnina dvou mezi 1 MB a 1 GB, ale hlaviÄka WAL souboru \"%s\" udává %d bytů"
+
+#: pg_waldump.c:210
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "nelze Äíst soubor \"%s\": %m"
+
+#: pg_waldump.c:213
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "nelze Äíst soubor \"%s\": naÄteno %d z %zu"
+
+#: pg_waldump.c:275
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "nelze najít WAL soubor \"%s\""
+
+#: pg_waldump.c:277
+#, c-format
+msgid "could not find any WAL file"
+msgstr "nelze najít žádný WAL soubor"
+
+#: pg_waldump.c:318
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "nelze najít soubor \"%s\": %m"
+
+#: pg_waldump.c:367
+#, c-format
+msgid "could not read from file %s, offset %u: %m"
+msgstr "nelze Äíst ze souboru %s, offset %u : %m"
+
+#: pg_waldump.c:371
+#, c-format
+msgid "could not read from file %s, offset %u: read %d of %zu"
+msgstr "nelze Äíst ze souboru %s, offset %u, naÄteno %d z %zu"
+
+#: pg_waldump.c:720
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s dekóduje a zobrazuje PostgreSQL write-ahead logy pro úÄely debugování.\n"
+"\n"
+
+#: pg_waldump.c:722
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: pg_waldump.c:723
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:724
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe:\n"
+
+#: pg_waldump.c:725
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details output detailed information about backup blocks\n"
+
+#: pg_waldump.c:726
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR pÅ™estane Äíst WAL na pozici RECPTR\n"
+
+#: pg_waldump.c:727
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow dále to zkoušet po dosažení konce WAL\n"
+
+#: pg_waldump.c:728
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N poÄet záznamů pro zobrazení\n"
+
+#: pg_waldump.c:729
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH adresář ve kterém hledat log segmenty nebo\n"
+" adresář s ./pg_wal který tyto soubory obsahuje\n"
+" (implicitní: aktuální adresář, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:732
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet nevypisovat žádné zprávy, s výjimkou chyb\n"
+
+#: pg_waldump.c:733
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR zobrazí pouze záznamy generované resource managerem RMGR;\n"
+" použijte --rmgr=list pro seznam platných jmen resource managerů\n"
+
+#: pg_waldump.c:735
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR zaÄne Äíst WAL na pozici RECPTR\n"
+
+#: pg_waldump.c:736
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI timeline ze které Äíst log záznamy\n"
+" (implicitní: 1 nebo hodnota v STARTSEG)\n"
+
+#: pg_waldump.c:738
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version vypiÅ¡ informace o verzi, potom skonÄi\n"
+
+#: pg_waldump.c:739
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID zobrazí pouze záznamy pro transakci s ID XID\n"
+
+#: pg_waldump.c:740
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] zobrazí statistiky namísto záznamů\n"
+" (volitelně, zobrazí per-record statistiky)\n"
+
+#: pg_waldump.c:742
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukaž tuto nápovÄ›du, potom skonÄi\n"
+
+#: pg_waldump.c:743
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: pg_waldump.c:744
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: pg_waldump.c:821
+#, c-format
+msgid "no arguments specified"
+msgstr "nezadán žádný argument"
+
+#: pg_waldump.c:836
+#, c-format
+msgid "could not parse end WAL location \"%s\""
+msgstr "nelze naparsovat koncovou WAL pozici \"%s\""
+
+#: pg_waldump.c:848
+#, c-format
+msgid "could not parse limit \"%s\""
+msgstr "nelze naparsovat limit \"%s\""
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "resource manager \"%s\" neexistuje"
+
+#: pg_waldump.c:888
+#, c-format
+msgid "could not parse start WAL location \"%s\""
+msgstr "nelze naparsovat poÄáteÄní WAL pozici \"%s\""
+
+#: pg_waldump.c:898
+#, c-format
+msgid "could not parse timeline \"%s\""
+msgstr "nelze naparsovat timeline \"%s\""
+
+#: pg_waldump.c:905
+#, c-format
+msgid "could not parse \"%s\" as a transaction ID"
+msgstr "nelze naparsovat \"%s\" jako ID transakce"
+
+#: pg_waldump.c:920
+#, c-format
+msgid "unrecognized argument to --stats: %s"
+msgstr "nerozpoznaný argument pro --stats: %s"
+
+#: pg_waldump.c:933
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")"
+
+#: pg_waldump.c:943 pg_waldump.c:963
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "nelze otevřít adresář \"%s\": %m"
+
+#: pg_waldump.c:969 pg_waldump.c:1000
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "nelze otevřít soubor \"%s\""
+
+#: pg_waldump.c:979
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "poÄátaÄní WAL pozice %X/%X není v souboru \"%s\""
+
+#: pg_waldump.c:1007
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s je před STARTSEG %s"
+
+#: pg_waldump.c:1022
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "koncová WAL pozice %X/%X není v souboru \"%s\""
+
+#: pg_waldump.c:1035
+#, c-format
+msgid "no start WAL location given"
+msgstr "není zadána žádná WAL pozice"
+
+#: pg_waldump.c:1049
+#, c-format
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: pg_waldump.c:1055
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "nelze najít platný záznam po %X/%X"
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "první záznam po %X/%X, na %X/%X, přeskakuji %u bytů\n"
+msgstr[1] "první záznam po %X/%X, na %X/%X, přeskakuji %u byty\n"
+msgstr[2] "první záznam po %X/%X, na %X/%X, přeskakuji %u bytů\n"
+
+#: pg_waldump.c:1117
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "chyba ve WAL záznamu na %X/%X: %s"
+
+#: pg_waldump.c:1127
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#~ msgid "%s: FATAL: "
+#~ msgstr "%s: FATAL: "
+
+#~ msgid "not enough data in file \"%s\""
+#~ msgstr "nedostatek dat v souboru \"%s\""
+
+#~ msgid "could not open directory \"%s\": %s"
+#~ msgstr "nelze otevřít adresář \"%s\": %s"
+
+#~ msgid "path \"%s\" could not be opened: %s"
+#~ msgstr "cestu \"%s\" nelze otevřít: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "could not seek in log file %s to offset %u: %s"
+#~ msgstr "nelze nastavit pozici (seek) v log souboru %s na offset %u: %s"
+
+#~ msgid "could not read file \"%s\": %s"
+#~ msgstr "nelze Äíst soubor \"%s\": %s"
+
+#~ msgid "could not open file \"%s\": %s"
+#~ msgstr "nelze otevřít soubor \"%s\": %s"
diff --git a/src/bin/pg_waldump/po/de.po b/src/bin/pg_waldump/po/de.po
new file mode 100644
index 0000000..19f8793
--- /dev/null
+++ b/src/bin/pg_waldump/po/de.po
@@ -0,0 +1,574 @@
+# German message translation file for pg_waldump
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-02 04:18+0000\n"
+"PO-Revision-Date: 2023-11-08 21:40+0100\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "Verzeichnis »%s« existiert aber ist nicht leer"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: pg_waldump.c:199 pg_waldump.c:527
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Byte an"
+msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Bytes an"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht lesen: %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "konnte Datei »%s« nicht lesen: %d von %d gelesen"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "konnte WAL-Datei »%s« nicht finden"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "konnte keine WAL-Datei finden"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht finden: %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "konnte nicht aus Datei %s, Position %d lesen: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "konnte nicht aus Datei %s, Position %d lesen: %d von %d gelesen"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "ungültige Fork-Nummer: %u"
+
+#: pg_waldump.c:530
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schreiben: %m"
+
+#: pg_waldump.c:533
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht schließen: %m"
+
+#: pg_waldump.c:753
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s dekodiert und zeigt PostgreSQL-Write-Ahead-Logs zum Debuggen.\n"
+"\n"
+
+#: pg_waldump.c:755
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details detaillierte Informationen über Backup-Blöcke ausgeben\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N mit --relation, nur Datensätze zeigen, die Block N\n"
+" modifizieren\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR bei WAL-Position RECPTR zu lesen aufhören\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow am Ende des WAL weiter versuchen\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK nur Datensätze zeigen, die Blöcke in Fork FORK\n"
+" modifizieren; gültige Werte sind main, fsm, vm, init\n"
+
+#: pg_waldump.c:764
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N Anzahl der anzuzeigenden Datensätze\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH Verzeichnis mit den WAL-Segmentdateien oder Verzeichnis\n"
+" mit ./pg_wal mit solchen Dateien (Vorgabe: aktuelles\n"
+" Verzeichnis, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:768
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet keine Ausgabe, außer Fehler\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR nur Datensätze erzeugt von Resource-Manager RMGR zeigen;\n"
+" --rmgr=list zeigt gültige Resource-Manager-Namen\n"
+
+#: pg_waldump.c:771
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr ""
+" -R, --relation=T/D/R nur Datensätze zeigen, die Blöcke in Relation T/D/R\n"
+" modifizieren\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR bei WAL-Position RECPTR zu lesen anfangen\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=ZAHL Zeitleiste aus der WAL-Einträge gelesen werden sollen\n"
+" (Vorgabe: 1 oder der in STARTSEG verwendete Wert)\n"
+
+#: pg_waldump.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage nur Datensätze mit einem Full-Page-Write zeigen\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID nur Datensätze mit Transaktions-ID XID zeigen\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] Statistiken statt Datensätzen anzeigen\n"
+" (optional Statistiken pro Datensatz zeigen)\n"
+
+#: pg_waldump.c:780
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=VERZ Full-Page-Images in VERZ speichern\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "no arguments specified"
+msgstr "keine Argumente angegeben"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ungültige Blocknummer: »%s«"
+
+#: pg_waldump.c:904 pg_waldump.c:1002
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ungültige WAL-Position: »%s«"
+
+#: pg_waldump.c:917
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ungültiger Fork-Name: »%s«"
+
+#: pg_waldump.c:925 pg_waldump.c:1028
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: pg_waldump.c:956
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "Custom-Resource-Manager »%s« existiert nicht"
+
+#: pg_waldump.c:977
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "Resource-Manager »%s« existiert nicht"
+
+#: pg_waldump.c:992
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ungültige Relationsangabe: »%s«"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Erwartet wurde »Tablespace-OID/Datenbank-OID/Relation-Filenode«."
+
+#: pg_waldump.c:1035
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s muss im Bereich %u..%u sein"
+
+#: pg_waldump.c:1050
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ungültige Transaktions-ID-Angabe: »%s«"
+
+#: pg_waldump.c:1065
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "unbekannter Wert für Option %s: %s"
+
+#: pg_waldump.c:1082
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "Option %s erfordert, dass Option %s angegeben wird"
+
+#: pg_waldump.c:1089
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_waldump.c:1099 pg_waldump.c:1122
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_waldump.c:1128 pg_waldump.c:1158
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "konnte Datei »%s« nicht öffnen"
+
+#: pg_waldump.c:1138
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL-Startposition %X/%X ist nicht innerhalb der Datei »%s«"
+
+#: pg_waldump.c:1165
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s kommt vor STARTSEG %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL-Endposition %X/%X ist nicht innerhalb der Datei »%s«"
+
+#: pg_waldump.c:1192
+#, c-format
+msgid "no start WAL location given"
+msgstr "keine WAL-Startposition angegeben"
+
+#: pg_waldump.c:1206
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors"
+
+#: pg_waldump.c:1212
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "konnte keinen gültigen Datensatz nach %X/%X finden"
+
+#: pg_waldump.c:1222
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Byte wurde übersprungen\n"
+msgstr[1] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Bytes wurden übersprungen\n"
+
+#: pg_waldump.c:1307
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "Fehler in WAL-Eintrag bei %X/%X: %s"
+
+#: pg_waldump.c:1316
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhalten"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "Contrecord angefordert von %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, 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:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "Datensatzlänge %u bei %X/%X ist zu lang"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "keine Contrecord-Flag bei %X/%X"
+
+#: xlogreader.c:789
+#, 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:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "Contrecord fehlt bei %X/%X"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ungültige Resource-Manager-ID %u bei %X/%X"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, 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:1196
+#, 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:1230
+#, 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:1245 xlogreader.c:1287
+#, 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:1261
+#, 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:1269
+#, 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:1275
+#, 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:1307
+#, 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:1333
+#, 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:1739
+#, 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:1763
+#, 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:1770
+#, 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:1806
+#, 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:1822
+#, 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:1836
+#, 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:1851
+#, 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:1867
+#, 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:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ungültige block_id %u bei %X/%X"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "Datensatz mit ungültiger Länge bei %X/%X"
+
+#: xlogreader.c:1972
+#, 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:2056
+#, 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:2063
+#, 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:2090 xlogreader.c:2107
+#, 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:2116
+#, 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:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d"
diff --git a/src/bin/pg_waldump/po/el.po b/src/bin/pg_waldump/po/el.po
new file mode 100644
index 0000000..5cc4cbd
--- /dev/null
+++ b/src/bin/pg_waldump/po/el.po
@@ -0,0 +1,608 @@
+# Greek message translation file for pg_waldump
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:17+0000\n"
+"PO-Revision-Date: 2023-08-15 15:33+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ο κατάλογος «%s» υπάÏχει και δεν είναι άδειος"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του καταλόγου «%s»: %m"
+
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά η κεφαλίδα «%s» του αÏχείου WAL καθοÏίζει %d byte"
+msgstr[1] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά η κεφαλίδα «%s» του αÏχείου WAL καθοÏίζει %d bytes"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "δεν ήταν δυνατός ο εντοπισμός του αÏχείου WAL «%s»"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "δεν ήταν δυνατή η εÏÏεση οποιουδήποτε αÏχείου WAL"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εÏÏεση του αÏχείου «%s»: %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο %s, μετατόπιση %d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο %s, μετατόπιση %d: ανέγνωσε %d από %d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "μη έγκυÏος αÏιθμός fork %u"
+
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m"
+
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s αποκωδικοποιεί και εμφανίζει αÏχεία καταγÏαφής εμπÏόσθιας-εγγÏαφής PostgreSQL για αποσφαλμάτωση.\n"
+"\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details πάÏαγε λεπτομεÏείς πληÏοφοÏίες σχετικά με τα μπλοκ αντιγÏάφων ασφαλείας\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N μαζί με --relation, εμφάνισε μόνο εγγÏαφές που Ï„ÏοποποιοÏν το μπλοκ N\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR σταμάτησε την ανάγνωση στη τοποθεσία WAL RECPTR\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow εξακολοÏθησε την Ï€Ïοσπάθεια μετά την επίτευξη του τέλους του WAL\n"
+
+#: pg_waldump.c:763
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK εμφάνισε μόνο εγγÏαφές που Ï„ÏοποποιοÏν μπλοκ στο fork FORK,\n"
+" έγκυÏες ονομασίες είναι main, fsm, vm, init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N αÏιθμός των εγγÏαφών για εμφάνιση\n"
+
+#: pg_waldump.c:766
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH κατάλογος στον οποίο βÏίσκονται αÏχεία τμήματος WAL ή\n"
+" ένα κατάλογο με ./pg_wal που πεÏιέχει τέτοια αÏχεία\n"
+" (Ï€Ïοεπιλογή: Ï„Ïέχων κατάλογος, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet να μην εκτυπωθεί καμία έξοδος, εκτός από σφάλματα\n"
+
+#: pg_waldump.c:770
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR εμφάνισε μόνο εγγÏαφές που δημιουÏγοÏνται από τον διαχειÏιστή πόÏων RMGR·\n"
+" χÏησιμοποίησε --rmgr=list για την παÏάθεση έγκυÏων ονομάτων διαχειÏιστών πόÏων\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R εμφάνισε μόνο εγγÏαφές που Ï„ÏοποποιοÏν μπλοκ στη σχέση T/D/R\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR άÏχισε την ανάγνωση WAL από την τοποθεσία RECPTR\n"
+
+#: pg_waldump.c:774
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI χÏονογÏαμή από την οποία να αναγνωστοÏν εγγÏαφές WAL\n"
+" (Ï€Ïοεπιλογή: 1 ή η τιμή που χÏησιμοποιήθηκε στο STARTSEG)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage εμφάνισε μόνο εγγÏαφές με εγγÏαφή πλήÏους σελίδας\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID εμφάνισε μόνο εγγÏαφές με ID συναλλαγής XID\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] εμφάνισε στατιστικά στοιχεία αντί για εγγÏαφές\n"
+" (Ï€ÏοαιÏετικά, εμφάνισε στατιστικά στοιχεία ανά εγγÏαφή)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=DIR αποθήκευσε πλήÏεις εικόνες σελίδων σε DIR\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "δεν καθοÏίστηκαν παÏάμετÏοι"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "μη έγκυÏος αÏιθμός μπλοκ: «%s»"
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "άκυÏη τοποθεσία WAL: «%s»"
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "μη έγκυÏη ονομασία fork «%s»"
+
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "ο Ï€ÏοσαÏμοσμένος διαχειÏιστής πόÏων «%s» δεν υπάÏχει"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "ο διαχειÏιστής πόÏων «%s» δεν υπάÏχει"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή σχέσης: «%s»"
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Αναμένει \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %u..%u"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή ID συναλλαγής: «%s»"
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "μη αναγνωÏίσιμη τιμή για την επιλογή %s: %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "η επιλογή %s απαιτεί να έχει καθοÏιστεί η επιλογή %s"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)"
+
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»"
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "τοποθεσία εκκίνησης WAL %X/%X δεν βÏίσκεται μέσα στο αÏχείο «%s»"
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s βÏίσκεται Ï€Ïιν από STARTSEG %s"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "η τελική τοποθεσία WAL %X/%X δεν βÏίσκεται μέσα στο αÏχείο «%s»"
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "δεν δόθηκε καμία τοποθεσία έναÏξης WAL"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση επεξεÏγαστή ανάγνωσης WAL"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "δεν ήταν δυνατή η εÏÏεση έγκυÏης εγγÏαφής μετά %X/%X"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "Ï€Ïώτη εγγÏαφή βÏίσκεται μετά από %X/%X, σε %X/%X, παÏακάμπτοντας %u byte\n"
+msgstr[1] "Ï€Ïώτη εγγÏαφή βÏίσκεται μετά από %X/%X, σε %X/%X, παÏακάμπτοντας %u bytes\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "σφάλμα στην εγγÏαφή WAL στο %X/%X: %s"
+
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: ανέμενε τουλάχιστον %u, έλαβε %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord ζητείται από %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: ανένεμενε τουλάχιστον %u, έλαβε %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "έλλειψη μνήμης κατά την Ï€Ïοσπάθεια αποκωδικοποίησης εγγÏαφής με μήκος %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "μήκος εγγÏαφής %u σε %X/%X Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "δεν υπάÏχει σημαία contrecord στο %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "μη έγκυÏο μήκος contrecord %u (αναμένεται %lld) σε %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "μη έγκυÏο ID %u διαχειÏιστή πόÏων στο %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "εγγÏαφή με εσφαλμένο prev-link %X/%X σε %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "εσφαλμένο άθÏοισμα ελέγχου δεδομένων διαχειÏιστή πόÏων σε εγγÏαφή στο %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "μη έγκυÏος μαγικός αÏιθμός %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "μη έγκυÏα info bits %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "εκτός ακολουθίας ID χÏονογÏαμμής %u (μετά %u) στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "εκτός ακολουθίας block_id %u στο %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA έχει οÏιστεί, αλλά δεν πεÏιλαμβάνονται δεδομένα σε %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA δεν έχει οÏιστεί, αλλά το μήκος των δεδομένων είναι %u σε %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE έχει οÏιστεί, αλλά οπή με μετατόπιση %u μήκος %u μήκος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE δεν έχει οÏιστεί, αλλά οπή με μετατόπιση %u μήκος %u σε %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_IS_COMPRESSED έχει οÏιστεί, αλλά μέγεθος μπλοκ εικόνας %u σε %X/%X"
+
+#: xlogreader.c:1847
+#, 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_IS_COMPRESSED είναι οÏισμένα, αλλά το μήκος της εικόνας μπλοκ είναι %u στο %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL είναι οÏισμένο, αλλά καμία Ï€ÏοηγοÏμενη rel στο %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "μη έγκυÏο block_id %u στο %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "εγγÏαφή με μη έγκυÏο μήκος στο %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ αντιγÏάφου με ID %d στην εγγÏαφή WAL"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με οÏισμένο άκυÏο μπλοκ %d"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με άκυÏη κατάσταση, μπλοκ %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με %s που δεν υποστηÏίζεται από την υλοποίηση, μπλοκ %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με άγνωστη μέθοδο, μπλοκ %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας στο %X/%X, μπλοκ %d"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες.\n"
+
+#~ msgid "could not parse \"%s\" as a transaction ID"
+#~ msgstr "δεν ήταν δυνατή η ανάλυση του «%s» ως ID συναλλαγής"
+
+#~ msgid "could not parse end WAL location \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της τελικής τοποθεσίας WAL «%s»"
+
+#~ msgid "could not parse limit \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση του οÏίου «%s»"
+
+#~ msgid "could not parse start WAL location \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της αÏχικής τοποθεσίας WAL «%s»"
+
+#~ msgid "could not parse timeline \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάλυση της χÏονογÏαμμής «%s»"
+
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %zu"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "μη έγκυÏη μετατόπιση εγγÏαφών σε %X/%X"
+
+#~ msgid "invalid timeline specification: \"%s\""
+#~ msgstr "άκυÏη Ï€ÏοδιαγÏαφή χÏονοδιαγÏαμμής: «%s»"
+
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "λείπει contrecord στο %X/%X"
+
+#~ msgid "out of memory"
+#~ msgstr "έλλειψη μνήμης"
+
+#~ msgid "unrecognized argument to --stats: %s"
+#~ msgstr "μη αναγνωÏισμένη παÏάμετÏος για --stats: %s"
diff --git a/src/bin/pg_waldump/po/es.po b/src/bin/pg_waldump/po/es.po
new file mode 100644
index 0000000..67a0cf3
--- /dev/null
+++ b/src/bin/pg_waldump/po/es.po
@@ -0,0 +1,576 @@
+# Spanish message translation file for pg_waldump
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-22 07:18+0000\n"
+"PO-Revision-Date: 2023-09-05 07:35+0200\n"
+"Last-Translator: Carlos Chapi <carlos.chapi@2ndquadrant.com>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.2\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "el directorio «%s» existe pero no está vacío"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: pg_waldump.c:199 pg_waldump.c:527
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "el tamaño de segmento WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero la cabecera del archivo WAL «%s» especifica %d byte"
+msgstr[1] "el tamaño de segmento WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero la cabecera del archivo WAL «%s» especifica %d bytes"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "no se pudo leer el archivo «%s»: %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "no se pudo leer el archivo «%s»: leídos %d de %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "no se pudo ubicar el archivo WAL «%s»"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "no se pudo encontrar ningún archivo WAL"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "no se pudo encontrar el archivo «%s»: %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "no se pudo leer desde el archivo «%s» en la posición %d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "no se pudo leer del archivo %s, posición %d: leídos %d de %d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "número de “fork†no válido: %u"
+
+#: pg_waldump.c:530
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "no se pudo escribir el archivo «%s»: %m"
+
+#: pg_waldump.c:533
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "no se pudo cerrar el archivo «%s»: %m"
+
+#: pg_waldump.c:753
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s decodifica y muestra segmentos de WAL de PostgreSQL para depuración.\n"
+"\n"
+
+#: pg_waldump.c:755
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPCIÓN]... [SEGINICIAL [SEGFINAL]]\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details mostrar información detallada sobre bloques de respaldo\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N con --relation, sólo mostrar registros que modifican\n"
+" el bloque N\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR detener la lectura del WAL en la posición RECPTR\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow seguir reintentando después de alcanzar el final del WAL\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --form=FORK sólo mostrar registros que modifican bloques en el\n"
+" «fork» FORK; nombres válidos son main, fsm, vm, init\n"
+
+#: pg_waldump.c:764
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N número de registros a mostrar\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=RUTA directorio donde encontrar segmentos WAL o que\n"
+" contenga un directorio ./pg_wal con dichos archivos\n"
+" (por omisión: directorio actual, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:768
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet no escribir ningún mensaje, excepto errores\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=GREC sólo mostrar registros generados por el gestor de\n"
+" recursos GREC; use --rmgr=list para listar nombres válidos\n"
+
+#: pg_waldump.c:771
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R sólo mostrar registros que modifican bloques en relación T/D/R\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR empezar a leer el WAL en la posición RECPTR\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI “timeline†del cual leer registros WAL\n"
+" (por omisión: 1 o el valor usado en SEGINICIAL)\n"
+
+#: pg_waldump.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage sólo mostrar registros con escrituras de página completa\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID sólo mostrar registros con el id de transacción XID\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=registro] mostrar estadísticas en lugar de registros\n"
+" (opcionalmente, mostrar estadísticas por registro)\n"
+
+#: pg_waldump.c:780
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=DIR guardar imágenes de página completa en DIR\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda, luego salir\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "no arguments specified"
+msgstr "no se especificó ningún argumento"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "número de bloque no válido: «%s»"
+
+#: pg_waldump.c:904 pg_waldump.c:1002
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ubicación de WAL no válida: «%s»"
+
+#: pg_waldump.c:917
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "nombre de «fork» no válido: «%s»"
+
+#: pg_waldump.c:925 pg_waldump.c:1028
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción «%s»"
+
+#: pg_waldump.c:956
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "el gestor de recursos personalizado «%s» no existe"
+
+#: pg_waldump.c:977
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "el gestor de recursos «%s» no existe"
+
+#: pg_waldump.c:992
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "especificación de relación no válida: «%s»"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Se esperaba «OID de tablespace/OID de base de datos/filenode de relación»."
+
+#: pg_waldump.c:1035
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s debe estar en el rango %u..%u"
+
+#: pg_waldump.c:1050
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "especificación de ID de transacción no válida: «%s»"
+
+#: pg_waldump.c:1065
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "valor no reconocido para la opción %s: %s"
+
+#: pg_waldump.c:1082
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "la opción %s requiere que se especifique la opción %s"
+
+#: pg_waldump.c:1089
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_waldump.c:1099 pg_waldump.c:1122
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_waldump.c:1128 pg_waldump.c:1158
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "no se pudo abrir el archivo «%s»"
+
+#: pg_waldump.c:1138
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "la posición inicial de WAL %X/%X no está en el archivo «%s»"
+
+#: pg_waldump.c:1165
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "SEGFINAL %s está antes del SEGINICIAL %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "la posición final de WAL %X/%X no está en el archivo «%s»"
+
+#: pg_waldump.c:1192
+#, c-format
+msgid "no start WAL location given"
+msgstr "no se especificó posición inicial de WAL"
+
+#: pg_waldump.c:1206
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "se agotó la memoria mientras se emplazaba un procesador de lectura de WAL"
+
+#: pg_waldump.c:1212
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "no se pudo encontrar un registro válido después de %X/%X"
+
+#: pg_waldump.c:1222
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u byte\n"
+msgstr[1] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u bytes\n"
+
+#: pg_waldump.c:1307
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "error en registro de WAL en %X/%X: %s"
+
+#: pg_waldump.c:1316
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "desplazamiento de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord solicitado por %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "largo de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "largo de registro %u en %X/%X demasiado largo"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "no hay bandera de contrecord en %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X"
+
+#: xlogreader.c:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "falta contrecord en %X/%X"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ID de gestor de recursos %u no válido en %X/%X"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "registro con prev-link %X/%X incorrecto en %X/%X"
+
+#: xlogreader.c:1196
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X"
+
+#: xlogreader.c:1230
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "número mágico %04X no válido en segmento WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1245 xlogreader.c:1287
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "info bits %04X no válidos en segment WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1261
+#, 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 "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu"
+
+#: xlogreader.c:1269
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1275
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina"
+
+#: xlogreader.c:1307
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "pageaddr %X/%X inesperado en segmento WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1333
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ID de timeline %u fuera de secuencia (después de %u) en segmento WAL %s, LSN %X/%X, posición %u"
+
+#: xlogreader.c:1739
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u fuera de orden en %X/%X"
+
+#: xlogreader.c:1763
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X"
+
+#: xlogreader.c:1770
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X"
+
+#: xlogreader.c:1806
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X"
+
+#: xlogreader.c:1822
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X"
+
+#: xlogreader.c:1836
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1851
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X"
+
+#: xlogreader.c:1867
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X "
+
+#: xlogreader.c:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u no válido en %X/%X"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "registro con largo no válido en %X/%X"
+
+#: xlogreader.c:1972
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL"
+
+#: xlogreader.c:2056
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "no se pudo restaurar imagen en %X/%X con bloque especificado %d no válido"
+
+#: xlogreader.c:2063
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "no se pudo restaurar imagen en %X/%X con estado no válido, bloque %d"
+
+#: xlogreader.c:2090 xlogreader.c:2107
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "no se pudo restaurar imagen en %X/%X comprimida con %s no soportado por esta instalación, bloque %d"
+
+#: xlogreader.c:2116
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "no se pudo restaurar imagen en %X/%X comprimida método desconocido, bloque %d"
+
+#: xlogreader.c:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "no se pudo descomprimir imagen en %X/%X, bloque %d"
diff --git a/src/bin/pg_waldump/po/fr.po b/src/bin/pg_waldump/po/fr.po
new file mode 100644
index 0000000..b5cb1c6
--- /dev/null
+++ b/src/bin/pg_waldump/po/fr.po
@@ -0,0 +1,693 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:18+0000\n"
+"PO-Revision-Date: 2023-09-05 07:50+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "le répertoire « %s » existe mais n'est pas vide"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octet"
+msgstr[1] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octets"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "n'a pas pu lire le fichier « %s » : %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "n'a pas pu trouver le fichier WAL « %s »"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "n'a pas pu trouver un seul fichier WAL"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "n'a pas pu trouver le fichier « %s » : %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %d lu sur %d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "numéro du fork invalide : %u"
+
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "impossible d'écrire le fichier « %s » : %m"
+
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "n'a pas pu fermer le fichier « %s » : %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s décode et affiche les journaux de transactions PostgreSQL pour du\n"
+"débogage.\n"
+"\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [SEG_DEBUT [SEG_FIN]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr ""
+" -b, --bkp-details affiche des informations détaillées sur les\n"
+" blocs de sauvegarde\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N avec --relation, affiche seulement les enregistrements\n"
+" qui modifient le bloc N\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr ""
+" -e, --end=RECPTR arrête la lecture des journaux de transactions à\n"
+" l'emplacement RECPTR\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr ""
+" -f, --follow continue après avoir atteint la fin des journaux\n"
+" de transactions\n"
+
+#: pg_waldump.c:763
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK affiche seulement les enregistrements qui modifient\n"
+" des blocs dans le fork FORK ;\n"
+" les noms valides sont main, fsm, vm, init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N nombre d'enregistrements à afficher\n"
+
+#: pg_waldump.c:766
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=CHEMIN répertoire où trouver les fichiers des segments\n"
+" de journaux de transactions ou un répertoire\n"
+" avec ./pg_wal qui contient ces fichiers (par\n"
+" défaut : répertoire courant, ./pg_wal,\n"
+" $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet n'écrit aucun message, sauf en cas d'erreur\n"
+
+#: pg_waldump.c:770
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR affiche seulement les enregistrements générés\n"
+" par le gestionnaire de ressources RMGR, utilisez\n"
+" --rmgr=list pour avoir une liste des noms valides\n"
+" de gestionnaires de ressources\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr ""
+" -R, --relation=T/D/R affiche seulement les enregistrements qui modifient\n"
+" les blocs de la relation T/D/R\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr ""
+" -s, --start=RECPTR commence à lire à l'emplacement RECPTR des\n"
+" journaux de transactions\n"
+
+#: pg_waldump.c:774
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI timeline à partir de laquelle lire les\n"
+" enregistrements des journaux (par défaut : 1 ou\n"
+" la valeur utilisée dans SEG_DÉBUT)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr ""
+" -w, --fullpage affiche seulement les enregistrements avec\n"
+" un bloc complet (FPW)\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr ""
+" -x, --xid=XID affiche seulement des enregistrements avec\n"
+" l'identifiant de transaction XID\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=enregistrement] affiche des statistiques à la place\n"
+" d'enregistrements (en option, affiche des\n"
+" statistiques par enregistrement)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=RÉP sauvegarde les images complètes dans RÉP\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "aucun argument spécifié"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "numéro de bloc invalide : « %s »"
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "emplacement WAL invalide : « %s »"
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "nom du fork invalide : « %s »"
+
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "le gestionnaire de ressources personnalisé « %s » n'existe pas"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "le gestionnaire de ressources « %s » n'existe pas"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "spécification de relation invalide : « %s »"
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Attendait « OID tablespace/OID base/filenode relation »."
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s doit être compris entre %u et %u"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "spécification d'identifiant de transaction invalide : « %s »"
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "valeur non reconnue pour l'option %s : %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "l'option %s requiert la spécification de l'option %s"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "n'a pas pu ouvrir le fichier « %s »"
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "l'emplacement de début des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »"
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "SEG_FIN %s est avant SEG_DÉBUT %s"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "l'emplacement de fin des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »"
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "pas d'emplacement donné de début du journal de transactions"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "plus de mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "n'a pas pu trouver un enregistrement valide après %X/%X"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octet\n"
+msgstr[1] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octets\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "erreur dans l'enregistrement des journaux de transactions à %X/%X : %s"
+
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "décalage invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "« contrecord » est requis par %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "longueur invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "longueur trop importante de l'enregistrement %u à %X/%X"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "il n'existe pas de drapeau contrecord à %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"somme de contrôle des données du gestionnaire de ressources incorrecte à\n"
+"l'enregistrement %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "numéro magique invalide %04X dans le segment WAL %s, LSN %X/%X, décalage %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "bits d'information %04X invalides dans le segment WAL %s, LSN %X/%X, décalage %u"
+
+#: xlogreader.c:1257
+#, 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 "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu"
+
+#: xlogreader.c:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, LSN %X/%X, segment %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment WAL %s, LSN %X/%X, décalage %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %u désordonné à %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u invalide à %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "enregistrement de longueur invalide à %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: FATAL: "
+#~ msgstr "%s : FATAL : "
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid "cannot open directory \"%s\": %s"
+#~ msgstr "ne peut pas ouvrir le répertoire « %s » : %s"
+
+#~ msgid "could not open directory \"%s\": %s"
+#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s"
+
+#~ msgid "could not open file \"%s\": %s"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s"
+
+#, c-format
+#~ msgid "could not parse \"%s\" as a transaction ID"
+#~ msgstr "n'a pas pu analyser « %s » comme un identifiant de transaction"
+
+#, c-format
+#~ msgid "could not parse end WAL location \"%s\""
+#~ msgstr "n'a pas pu analyser l'emplacement de fin du journal de transactions « %s »"
+
+#, c-format
+#~ msgid "could not parse fork \"%s\""
+#~ msgstr "n'a pas pu analyser le fork « %s »"
+
+#, c-format
+#~ msgid "could not parse limit \"%s\""
+#~ msgstr "n'a pas pu analyser la limite « %s »"
+
+#, c-format
+#~ msgid "could not parse start WAL location \"%s\""
+#~ msgstr "n'a pas pu analyser l'emplacement de début du journal de transactions « %s »"
+
+#, c-format
+#~ msgid "could not parse timeline \"%s\""
+#~ msgstr "n'a pas pu analyser la timeline « %s »"
+
+#, c-format
+#~ msgid "could not parse valid block number \"%s\""
+#~ msgstr "n'a pas pu analyser le numéro de bloc valide « %s »"
+
+#~ msgid "could not read file \"%s\": %s"
+#~ msgstr "n'a pas pu lire le fichier « %s » : %s"
+
+#, c-format
+#~ msgid "could not read file \"%s\": read %d of %zu"
+#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu"
+
+#~ msgid "could not read from log file %s, offset %u, length %d: %s"
+#~ msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u, longueur %d : %s"
+
+#~ msgid "could not seek in log file %s to offset %u: %s"
+#~ msgstr "n'a pas pu se déplacer dans le fichier de transactions %s au décalage %u : %s"
+
+#~ msgid "could not seek in log segment %s to offset %u: %s"
+#~ msgstr "n'a pas pu rechercher dans le segment %s du journal de transactions au décalage %u : %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "décalage invalide de l'enregistrement %X/%X"
+
+#, c-format
+#~ msgid "invalid timeline specification: \"%s\""
+#~ msgstr "spécification de timeline invalide : « %s »"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "contrecord manquant à %X/%X"
+
+#~ msgid "not enough data in file \"%s\""
+#~ msgstr "données insuffisantes dans le fichier « %s »"
+
+#, c-format
+#~ msgid "out of memory"
+#~ msgstr "mémoire épuisée"
+
+#~ msgid "path \"%s\" could not be opened: %s"
+#~ msgstr "le chemin « %s » n'a pas pu être ouvert : %s"
+
+#, c-format
+#~ msgid "unrecognized argument to --stats: %s"
+#~ msgstr "argument non reconnu pour --stats : %s"
diff --git a/src/bin/pg_waldump/po/it.po b/src/bin/pg_waldump/po/it.po
new file mode 100644
index 0000000..580b737
--- /dev/null
+++ b/src/bin/pg_waldump/po/it.po
@@ -0,0 +1,532 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:17+0000\n"
+"PO-Revision-Date: 2023-09-05 08:29+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: pg_waldump.c:160
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "La dimensione del segmento WAL deve essere una potenza di due tra 1 MB e 1 GB, ma l'intestazione del file WAL \"%s\" specifica %d byte"
+msgstr[1] "La dimensione dei segmenti WAL deve essere una potenza di due tra 1 MB e 1 GB, ma l'intestazione del file WAL \"%s\" specifica %d byte"
+
+#: pg_waldump.c:222
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "lettura del file \"%s\" fallita: %m"
+
+#: pg_waldump.c:225
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "lettura del file \"%s\" fallita: letti %d di %d"
+
+#: pg_waldump.c:286
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "impossibile individuare il file WAL \"%s\""
+
+#: pg_waldump.c:288
+#, c-format
+msgid "could not find any WAL file"
+msgstr "non è stato possibile trovare alcun file WAL"
+
+#: pg_waldump.c:329
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "impossibile trovare il file \"%s\": %m"
+
+#: pg_waldump.c:378
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "impossibile leggere dal file %s, offset %d: %m"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "impossibile leggere dal file %s, offset %d: leggere %d di %d"
+
+#: pg_waldump.c:658
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s decodifica e visualizza i registri write-ahead di PostgreSQL per il debug.\n"
+"\n"
+
+#: pg_waldump.c:660
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_waldump.c:661
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPZIONE]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:662
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_waldump.c:663
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details restituisce informazioni dettagliate sui blocchi di backup\n"
+
+#: pg_waldump.c:664
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N con --relation, mostra solo i record che modificano il blocco N\n"
+
+#: pg_waldump.c:665
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR interrompe la lettura nella posizione WAL RECPTR\n"
+
+#: pg_waldump.c:666
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow continua a riprovare dopo aver raggiunto la fine del WAL\n"
+
+#: pg_waldump.c:667
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK mostra solo i record che modificano i blocchi nel fork FORK;\n"
+" i nomi validi sono main, fsm, vm, init\n"
+
+#: pg_waldump.c:669
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N numero di record da visualizzare\n"
+
+#: pg_waldump.c:670
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH directory in cui trovare i file del segmento di log o a\n"
+" directory con un ./pg_wal che contiene tali file\n"
+" (predefinito: directory corrente, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:673
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet non stampa alcun output, ad eccezione degli errori\n"
+
+#: pg_waldump.c:674
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR mostra solo i record generati dal gestore risorse RMGR;\n"
+" usa --rmgr=list per elencare i nomi validi del gestore risorse\n"
+
+#: pg_waldump.c:676
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R mostra solo i record che modificano i blocchi in relazione a T/D/R\n"
+
+#: pg_waldump.c:677
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR inizia a leggere nella posizione WAL RECPTR\n"
+
+#: pg_waldump.c:678
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI timeline da cui leggere i record di registro\n"
+" (predefinito: 1 o il valore utilizzato in STARTSEG)\n"
+
+#: pg_waldump.c:680
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_waldump.c:681
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage mostra solo i record con una scrittura a pagina intera\n"
+
+#: pg_waldump.c:682
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID mostra solo i record con ID transazione XID\n"
+
+#: pg_waldump.c:683
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] mostra le statistiche invece dei record\n"
+" (facoltativamente, mostra le statistiche per record)\n"
+
+#: pg_waldump.c:685
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_waldump.c:686
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: pg_waldump.c:687
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid "no arguments specified"
+msgstr "nessun argomento specificato"
+
+#: pg_waldump.c:797
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "numero di blocco non valido: \"%s\""
+
+#: pg_waldump.c:806 pg_waldump.c:904
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "posizione WAL non valida: \"%s\""
+
+#: pg_waldump.c:819
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "nome fork non valido: \"%s\""
+
+#: pg_waldump.c:827
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: pg_waldump.c:858
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "il gestore risorse personalizzato \"%s\" non esiste"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "il gestore risorse \"%s\" non esiste"
+
+#: pg_waldump.c:894
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "specifica relazione non valida: \"%s\""
+
+#: pg_waldump.c:895
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "In attesa di \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:914
+#, c-format
+msgid "invalid timeline specification: \"%s\""
+msgstr "specifica della sequenza temporale non valida: \"%s\""
+
+#: pg_waldump.c:924
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "specificazione ID transazione non valida: \"%s\""
+
+#: pg_waldump.c:939
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "unrecognized value for option %s: %s"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "l'opzione %s richiede che sia specificata l'opzione %s"
+
+#: pg_waldump.c:960
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_waldump.c:970 pg_waldump.c:990
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_waldump.c:996 pg_waldump.c:1026
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "impossibile aprire il file \"%s\""
+
+#: pg_waldump.c:1006
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "avviare la posizione WAL %X/%X non è all'interno del file \"%s\""
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s è prima di STARTSEG %s"
+
+#: pg_waldump.c:1048
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "posizione WAL finale %X/%X non è all'interno del file \"%s\""
+
+#: pg_waldump.c:1060
+#, c-format
+msgid "no start WAL location given"
+msgstr "nessuna posizione iniziale WAL fornita"
+
+#: pg_waldump.c:1074
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "memoria insufficiente durante l'allocazione di un processore di lettura WAL"
+
+#: pg_waldump.c:1080
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "impossibile trovare un record valido dopo %X/%X"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "il primo record è dopo %X/%X, a %X/%X, saltando %u byte\n"
+msgstr[1] "i primi records sono dopo %X/%X, a %X/%X, saltando %u byte\n"
+
+#: pg_waldump.c:1171
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "errore nel record WAL a %X/%X: %s"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: xlogreader.c:625
+#, c-format
+msgid "invalid record offset at %X/%X"
+msgstr "offset del record non valido a %X/%X"
+
+#: xlogreader.c:633
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord richiesto da %X/%X"
+
+#: xlogreader.c:674 xlogreader.c:1121
+#, c-format
+msgid "invalid record length at %X/%X: wanted %u, got %u"
+msgstr "lunghezza del record a %X/%X non valida: atteso %u, ricevuto %u"
+
+#: xlogreader.c:703
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "memoria insufficiente durante il tentativo di decodificare un record di lunghezza %u"
+
+#: xlogreader.c:725
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "lunghezza del record %u a %X/%X eccessiva"
+
+#: xlogreader.c:774
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "non c'è un flag di contrecord a %X/%X"
+
+#: xlogreader.c:787
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "lunghezza contrada non valida %u (prevista %lld) a %X/%X"
+
+#: xlogreader.c:922
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "missing contrecord at %X/%X"
+
+#: xlogreader.c:1129
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "l'ID di gestione risorse %u non è valido a %X/%X"
+
+#: xlogreader.c:1142 xlogreader.c:1158
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "record con link-precedente %X/%X non corretto a %X/%X"
+
+#: xlogreader.c:1194
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "checksum dei dati del manager di risorse non corretto nel record a %X/%X"
+
+#: xlogreader.c:1231
+#, c-format
+msgid "invalid magic number %04X in log segment %s, offset %u"
+msgstr "numero magico %04X non valido nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1245 xlogreader.c:1286
+#, c-format
+msgid "invalid info bits %04X in log segment %s, offset %u"
+msgstr "bit di info %04X non validi nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1260
+#, 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 "Il file WAL proviene da un sistema di database diverso: l'identificatore del sistema del database del file WAL è %llu, l'identificatore del sistema del database pg_control è %llu"
+
+#: xlogreader.c:1268
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "il file di WAL è di un diverso database: dimensione del segmento sbagliata nell'header di pagina"
+
+#: xlogreader.c:1274
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "il file di WAL è di un database diverso: XLOG_BLCKSZ non corretto nell'header di pagina"
+
+#: xlogreader.c:1305
+#, c-format
+msgid "unexpected pageaddr %X/%X in log segment %s, offset %u"
+msgstr "pageaddr inaspettato %X/%X nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1330
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u"
+msgstr "l'ID della timeline %u (dopo %u) è fuori sequenza nel segmento di log %s, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id fuori sequenza %u a %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA impostato, ma dati non inclusi a %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA non impostato, ma la lunghezza dei dati è %u a %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE impostato, ma offset buco %u lunghezza %u lunghezza dell'immagine del blocco %u a %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE non impostato, ma offset buco %u lunghezza %u a %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED impostato, ma blocca la lunghezza dell'immagine %u a %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "né BKPIMAGE_HAS_HOLE né BKPIMAGE_COMPRESSED impostati, ma la lunghezza dell'immagine del blocco è %u a %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL impostato ma non c'è un rel precedente a %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "block_id %u non valido a %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "record con lunghezza non valida a %X/%X"
+
+#: xlogreader.c:1967
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "impossibile individuare il blocco di backup con ID %d nel record WAL"
+
+#: xlogreader.c:2051
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "impossibile ripristinare l'immagine in %X/%X con il blocco %d non valido specificato"
+
+#: xlogreader.c:2058
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X con stato non valido, blocco %d"
+
+#: xlogreader.c:2085 xlogreader.c:2102
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con %s non supportata da build, blocco %d"
+
+#: xlogreader.c:2111
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "impossibile ripristinare l'immagine in %X/%X compressa con metodo sconosciuto, blocco %d"
+
+#: xlogreader.c:2119
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "impossibile decomprimere l'immagine in %X/%X, blocco %d"
diff --git a/src/bin/pg_waldump/po/ja.po b/src/bin/pg_waldump/po/ja.po
new file mode 100644
index 0000000..dd7932d
--- /dev/null
+++ b/src/bin/pg_waldump/po/ja.po
@@ -0,0 +1,572 @@
+# Japanese message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 12:26+0900\n"
+"PO-Revision-Date: 2023-04-19 12:30+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:199 pg_waldump.c:527
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—WALファイル\"%s\"ã®ãƒ˜ãƒƒãƒ€ã§ã¯%dãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®èª­ã¿å–ã‚Šã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "ファイル\"%1$s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %3$d中%2$d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "WALファイル\"%s\"ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "WALファイルãŒå…¨ãã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "ファイル\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "ファイル %sã€ã‚ªãƒ•ã‚»ãƒƒãƒˆ%dã‹ã‚‰èª­ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "ファイル%1$sã€ã‚ªãƒ•ã‚»ãƒƒãƒˆ%2$dã‹ã‚‰èª­ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %4$d中%3$d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "ä¸æ­£ãªãƒ•ã‚©ãƒ¼ã‚¯ç•ªå·ã§ã™: %u"
+
+#: pg_waldump.c:530
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:533
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:753
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%sã¯ãƒ‡ãƒãƒƒã‚°ã®ãŸã‚ã«PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚’デコードã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_waldump.c:755
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [オプション] ... [開始セグメント [終了セグメント]]\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックã«é–¢ã™ã‚‹è©³ç´°æƒ…報を出力\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N --relationã¨å…±ã«æŒ‡å®šã™ã‚‹ã“ã¨ã§ã“ã®ãƒ–ロックNã‚’æ›´æ–°ã™ã‚‹\n"
+" レコードã®ã¿ã‚’表示\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR WALä½ç½®RECPTRã§èª­ã¿è¾¼ã¿ã‚’åœæ­¢\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow WALã®çµ‚端ã«é”ã—ã¦ã‹ã‚‰ã‚‚リトライを続ã‘ã‚‹\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK 指定フォークã®ãƒ–ロックを更新ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿è¡¨ç¤º;\n"
+" 指定å¯èƒ½ãªåå‰ã¯main, fsm, vm, init\n"
+
+#: pg_waldump.c:764
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N 表示ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰æ•°\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH WA:セグメントファイルを探ã™ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¾ãŸã¯\n"
+" åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚ã‚‹ ./pg_walã‚’æ ¼ç´ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+" (デフォルト: カレントディレクトリ, ./pg_wal,\n"
+" $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:768
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet エラー以外何も出力ã—ãªã„\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR 指定ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§ç”Ÿæˆã•ã‚ŒãŸãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿è¡¨ç¤º\n"
+" --rmgr=list ã§æœ‰åŠ¹ãªãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®ä¸€è¦§ã‚’表示\n"
+
+#: pg_waldump.c:771
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R リレーションT/D/Rã®ãƒ–ロックを更新ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿è¡¨ç¤º\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR WALä½ç½®RECPTRã‹ã‚‰èª­ã¿è¾¼ã¿ã‚’開始\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI WALレコードを読ã¿è¾¼ã‚€ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³\n"
+" (デフォルト: 1 ã¾ãŸã¯STARTSEGã§ä½¿ã‚ã‚ŒãŸå€¤)\n"
+
+#: pg_waldump.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage 全ページ書ãè¾¼ã¿ã‚’å«ã‚€ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿ã‚’表示\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID トランザクションIDãŒXIDã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿ã‚’表示ã™ã‚‹\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=レコード] レコードã®ä»£ã‚ã‚Šã«çµ±è¨ˆæƒ…報を表示ã™ã‚‹\n"
+" (オプションã§ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã”ã¨ã®çµ±è¨ˆã‚’表示ã™ã‚‹)\n"
+
+#: pg_waldump.c:780
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=DIR フルページイメージをDIRã«ä¿å­˜\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "no arguments specified"
+msgstr "引数ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ä¸æ­£ãªãƒ–ロック番å·: \"%s\""
+
+#: pg_waldump.c:904 pg_waldump.c:1002
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ä¸æ­£ãªWAL LSN: \"%s\""
+
+#: pg_waldump.c:917
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ä¸æ­£ãªãƒ•ã‚©ãƒ¼ã‚¯å: \"%s\""
+
+#: pg_waldump.c:925 pg_waldump.c:1028
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\""
+
+#: pg_waldump.c:956
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£ãƒ¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_waldump.c:977
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "リソースマãƒãƒ¼ã‚¸ãƒ£ãƒ¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: pg_waldump.c:992
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ä¸æ­£ãªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³æŒ‡å®š: \"%s\""
+
+#: pg_waldump.c:993
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "\"テーブル空間OID/データベースOID/リレーション・ファイルノードâ€ã‚’期待ã—ã¦ã„ã¾ã™ã€‚"
+
+#: pg_waldump.c:1035
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%sã¯%u..%uã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: pg_waldump.c:1050
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ä¸æ­£ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID指定: \"%s\""
+
+#: pg_waldump.c:1065
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "%sオプションã«å¯¾ã™ã‚‹èªè­˜ã§ããªã„値: %s"
+
+#: pg_waldump.c:1082
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "%sオプション指定時ã¯%sオプションも必è¦ã§ã™"
+
+#: pg_waldump.c:1089
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")"
+
+#: pg_waldump.c:1099 pg_waldump.c:1122
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: pg_waldump.c:1128 pg_waldump.c:1158
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "ファイル\"%s\"ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_waldump.c:1138
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "WALã®é–‹å§‹ä½ç½®%X/%Xã¯ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ä¸­ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_waldump.c:1165
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG%sãŒSTARTSEG %sよりå‰ã«ç¾ã‚Œã¾ã—ãŸ"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "WALã®çµ‚了ä½ç½®%X/%Xã¯ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ä¸­ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: pg_waldump.c:1192
+#, c-format
+msgid "no start WAL location given"
+msgstr "WALã®é–‹å§‹ä½ç½®ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: pg_waldump.c:1206
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL読ã¿å–り機構ã§ã®ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã«ä¸­ã«ãƒ¡ãƒ¢ãƒªä¸è¶³"
+
+#: pg_waldump.c:1212
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%Xã®å¾Œã«æœ‰åŠ¹ãªãƒ¬ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_waldump.c:1222
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "先頭レコードãŒ%X/%Xã®å¾Œã®%X/%Xã®ä½ç½®ã«ã‚ã‚Šã¾ã—ãŸã€‚%uãƒã‚¤ãƒˆåˆ†ã‚’スキップã—ã¦ã„ã¾ã™\n"
+
+#: pg_waldump.c:1307
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "WALレコードã®%X/%Xã§ã‚¨ãƒ©ãƒ¼: %s"
+
+#: pg_waldump.c:1316
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚ªãƒ•ã‚»ãƒƒãƒˆãŒä¸æ­£ã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xã§ã¯ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·ãŒä¸æ­£ã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "é•·ã•%uã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã®ãƒ¡ãƒ¢ãƒªä¸è¶³"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "%2$X/%3$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·%1$uãŒå¤§ãã™ãŽã¾ã™"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%Xã§contrecordフラグãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "%3$X/%4$Xã®ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ã®é•·ã•%1$u(æ­£ã—ãã¯%2$lld)ã¯ä¸æ­£ã§ã™"
+
+#: xlogreader.c:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "%X/%Xã«ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "%2$X/%3$Xã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ID %1$uã¯ä¸æ­£ã§ã™"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "%3$X/%4$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å¾Œæ–¹ãƒªãƒ³ã‚¯%1$X/%2$XãŒä¸æ­£ã§ã™"
+
+#: xlogreader.c:1196
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸æ­£ã§ã™"
+
+#: xlogreader.c:1230
+#, 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:1245 xlogreader.c:1287
+#, 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:1261
+#, 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:1269
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1275
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®XLOG_BLCKSZãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1307
+#, 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:1333
+#, 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:1739
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "block_id %uãŒ%X/%Xã§ä¸æ­£ã§ã™"
+
+#: xlogreader.c:1763
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ãŒã€%X/%Xã«ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1770
+#, 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:1806
+#, 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:1822
+#, 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:1836
+#, 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:1851
+#, 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:1867
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_RELãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ãŒã€%X/%Xã«ãŠã„ã¦ä»¥å‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: xlogreader.c:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "%2$X/%3$Xã«ãŠã‘ã‚‹block_id %1$uãŒä¸æ­£ã§ã™"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã‚µã‚¤ã‚ºãŒä¸æ­£ã§ã™"
+
+#: xlogreader.c:1972
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WALレコード中ã®ID %dã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2056
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%Xã§ä¸æ­£ãªãƒ–ロック%dãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ãŸã‚イメージãŒå¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2063
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ­£ãªçŠ¶æ…‹ã§ã‚ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2090 xlogreader.c:2107
+#, 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:2116
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ˜Žãªæ–¹å¼ã§åœ§ç¸®ã•ã‚Œã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: xlogreader.c:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "%X/%Xã®ãƒ–ロック%dãŒä¼¸å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ"
diff --git a/src/bin/pg_waldump/po/ka.po b/src/bin/pg_waldump/po/ka.po
new file mode 100644
index 0000000..a469835
--- /dev/null
+++ b/src/bin/pg_waldump/po/ka.po
@@ -0,0 +1,580 @@
+# Georgian message translation file for pg_waldump
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-19 11:18+0000\n"
+"PO-Revision-Date: 2023-04-20 08:20+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:199 pg_waldump.c:527
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1 გბ-ს სáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•áƒ¡áƒáƒ áƒ—ი %d ბáƒáƒ˜áƒ¢áƒ–ე მიუთითებს"
+msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1 გბ-ს სáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•áƒ¡áƒáƒ áƒ—ი %d ბáƒáƒ˜áƒ¢áƒ–ე მიუთითებს"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "wal ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "ვერცერთი WAL ფáƒáƒ˜áƒšáƒ˜ ვერ ვიპáƒáƒ•áƒ”"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ (%s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%s)წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%s)წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%d: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "ფáƒáƒ áƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: \"%u\""
+
+#: pg_waldump.c:530
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:533
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:753
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s áƒáƒ®áƒ“ენს PostgreSQL-ის წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ¨áƒ˜áƒ¤áƒ•áƒ áƒáƒ¡ დრჩვენებáƒáƒ¡ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვისთვის.\n"
+"\n"
+
+#: pg_waldump.c:755
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+" პáƒáƒ áƒáƒ›áƒ”ტრები\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details დáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ”ბული ბლáƒáƒ™áƒ”ბის დეტáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N --relation -სთáƒáƒœ ერთáƒáƒ“, მხáƒáƒšáƒáƒ“ იმ ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ, რáƒáƒ›áƒ”ლიც N ბლáƒáƒ™áƒ¡ ცვლიáƒáƒœ\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR კითხვის შეწყეტრWAL-ის RECPTR მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ–ე \n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¡ მიღწევის შემდეგ ცდები áƒáƒ  შეწყდებáƒ\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=ფáƒáƒ áƒ™áƒ˜ ნáƒáƒ©áƒ•áƒ”ნები იქნებრჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც მითითებულ ფáƒáƒ áƒ™áƒ¨áƒ˜ ბლáƒáƒ™áƒ”ბს ცვლიáƒáƒœ;\n"
+" დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბი სáƒáƒ®áƒ”ლებირmain, fsm, vm, init\n"
+
+#: pg_waldump.c:764
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N სáƒáƒ©áƒ•áƒ”ნებელი ჩáƒáƒœáƒáƒ¬áƒ”რების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=ბილიკი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე, რáƒáƒ›áƒ”ლშიც უნდრვიპáƒáƒ•áƒ WAL\n"
+" სეგმენტის ფáƒáƒ˜áƒšáƒ”ბი áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე, რáƒáƒ›áƒ”ლიც ./pg_wal-ით, რáƒáƒ›áƒ”ლიც áƒáƒ› \n"
+" ფáƒáƒ˜áƒšáƒ”ბს შეიცáƒáƒ•áƒ¡ (ნáƒáƒ’ულისხმები: მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე, ./pg_wal დრ$PGDATA/pg_wal\n"
+
+#: pg_waldump.c:768
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet შეცდáƒáƒ›áƒ”ბის გáƒáƒ áƒ“რეკრáƒáƒœáƒ–ე áƒáƒ áƒáƒ¤áƒ”რი გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR მხáƒáƒšáƒáƒ“ RMGR რესურსების მმáƒáƒ áƒ—ველის მიერ გენერირებული ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ. ;\n"
+" რესურსების მმáƒáƒ áƒ—ველების სიის მისáƒáƒ¦áƒ”ბáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ --rmgr=list\n"
+
+#: pg_waldump.c:771
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R ნáƒáƒ©áƒ•áƒ”ნები იქნებრჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც ცვლიáƒáƒœ ბლáƒáƒ™áƒ”ბს ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ T/D/R\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR კითხვის WAL მდებáƒáƒ áƒ”áƒáƒ‘რRECPTR-სთáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბáƒ\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი, ის შემდეგáƒáƒª დáƒáƒ˜áƒ¬áƒ§áƒ”ბრWAL ჩáƒáƒœáƒáƒ¬áƒ”რების კითხვáƒ\n"
+" (ნáƒáƒ’ულისხმები: 1 áƒáƒœ STARTSEG-ში გáƒáƒ›áƒáƒ§áƒ”ნებული მნიშვნელáƒáƒ‘áƒ)\n"
+
+#: pg_waldump.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage მხáƒáƒšáƒáƒ“ სრული გვერდის ჩáƒáƒ¬áƒ”რის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID მხáƒáƒšáƒáƒ“ იმ ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ, რáƒáƒ›áƒšáƒ˜áƒ¡ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID XID-ს უდრის\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=ჩáƒáƒœáƒáƒ¬áƒ”რი] ჩáƒáƒœáƒ¬áƒ”რების მáƒáƒ’იერ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩვენებáƒ\n"
+" (áƒáƒ¡áƒ”ვე შესáƒáƒ«áƒšáƒ”ბელირსáƒáƒ—ითáƒáƒáƒ“ ჩáƒáƒœáƒáƒ¬áƒ”რის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩვენებáƒáƒª)\n"
+
+#: pg_waldump.c:780
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში სრული გვერდის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში შენáƒáƒ®áƒ•áƒ\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: pg_waldump.c:879
+#, c-format
+msgid "no arguments specified"
+msgstr "áƒáƒ áƒ’უმენტები მითითებული áƒáƒ áƒáƒ"
+
+#: pg_waldump.c:895
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: \"%s\""
+
+#: pg_waldump.c:904 pg_waldump.c:1002
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "wal-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ: \"%s\""
+
+#: pg_waldump.c:917
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ფáƒáƒ áƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\""
+
+#: pg_waldump.c:925 pg_waldump.c:1028
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s"
+
+#: pg_waldump.c:956
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "რესურსების მმáƒáƒ áƒ—ველი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_waldump.c:977
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "რესურსების მმáƒáƒ áƒ—ველი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_waldump.c:992
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: \"%s\""
+
+#: pg_waldump.c:993
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "მáƒáƒ•áƒ”ლáƒáƒ“ი \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:1035
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s- %u-დáƒáƒœ %u-მდე დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜ უნდრიყáƒáƒ¡"
+
+#: pg_waldump.c:1050
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: \"%s\""
+
+#: pg_waldump.c:1065
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (%s) უცნáƒáƒ‘ი მნიშვნელáƒáƒ‘áƒ: %s"
+
+#: pg_waldump.c:1082
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრს %s თáƒáƒ•áƒ˜áƒ¡ მხრივ სჭირდებრპáƒáƒ áƒáƒ›áƒ”ტრის %s მითითებáƒ"
+
+#: pg_waldump.c:1089
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: pg_waldump.c:1099 pg_waldump.c:1122
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: pg_waldump.c:1128 pg_waldump.c:1158
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ: \"%s\""
+
+#: pg_waldump.c:1138
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ WAL მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შიგნით áƒáƒ áƒáƒ"
+
+#: pg_waldump.c:1165
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s STARTSEG %s -ის წინáƒáƒ"
+
+#: pg_waldump.c:1180
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ WAL მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შიგნით áƒáƒ áƒáƒ"
+
+#: pg_waldump.c:1192
+#, c-format
+msgid "no start WAL location given"
+msgstr "wal-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘რმითითებული áƒáƒ áƒáƒ"
+
+#: pg_waldump.c:1206
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრWAL-ის წáƒáƒ›áƒ™áƒ˜áƒ—ხáƒáƒ•áƒ˜ პრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ¡áƒ—ვის"
+
+#: pg_waldump.c:1212
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%X -ის შემდეგ სწáƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: pg_waldump.c:1222
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "პირველი ჩáƒáƒœáƒáƒ¬áƒ”რი %X/%X-ის შემდეგáƒáƒ, %X/%X-სთáƒáƒœ. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებრ%u ბáƒáƒ˜áƒ¢áƒ˜\n"
+msgstr[1] "პირველი ჩáƒáƒœáƒáƒ¬áƒ”რი %X/%X-ის შემდეგáƒáƒ, %X/%X-სთáƒáƒœ. გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებრ%u ბáƒáƒ˜áƒ¢áƒ˜\n"
+
+#: pg_waldump.c:1307
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში %X/%X: %s"
+
+#: pg_waldump.c:1316
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•áƒ”ლáƒáƒ“ი მინიმუმ %u, მივიღე %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ %X/%X-ის მიერ"
+
+#: xlogreader.c:676 xlogreader.c:1123
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•áƒ”ლáƒáƒ“ი მინიმუმ %u, მივიღე %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "contrecord áƒáƒšáƒáƒ›áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "contrecord -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე %u (მáƒáƒ•áƒ”ლáƒáƒ“ი %lld) მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:924
+#, c-format
+msgid "missing contrecord at %X/%X"
+msgstr "contrecord მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: xlogreader.c:1131
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "რესურსის მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1144 xlogreader.c:1160
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წინრბმულით %X/%X მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1196
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "რესურსის მმáƒáƒ áƒ—ველის მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ რიცხვი ჩáƒáƒœáƒáƒ¬áƒ”რში მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1230
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1245 xlogreader.c:1287
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ ბიტები %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1261
+#, 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:1269
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრბáƒáƒ–ის სიტემიდáƒáƒœáƒáƒ: სეგმáƒáƒœáƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ გვერდის თáƒáƒ•áƒ¡áƒáƒ áƒ—ში"
+
+#: xlogreader.c:1275
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: გვერდის თáƒáƒ•áƒ¡áƒáƒ áƒ—ში მითითებული XLOG_BLKSZ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ"
+
+#: xlogreader.c:1307
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი pageaddr %X/%X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1333
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "მიმდევრáƒáƒ‘ის-გáƒáƒ áƒ” დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (%u-ის შემდეგ) ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u"
+
+#: xlogreader.c:1739
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ურიგრblock_id %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1763
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: xlogreader.c:1770
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მები სიგრძით %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1806
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•áƒ áƒ”ტის წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u სიგრძე %u ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1822
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•áƒ áƒ”ტის წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრ%u სიგრძე %u მისáƒáƒœáƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1836
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძერ%u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1851
+#, 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 დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u-áƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1867
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› წინრმნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1879
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ block_id %u %X/%X"
+
+#: xlogreader.c:1946
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძით მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#: xlogreader.c:1972
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡, ID-ით %d, მáƒáƒ«áƒ”ბნისáƒáƒ¡"
+
+#: xlogreader.c:2056
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, რáƒáƒªáƒ მითითებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბლáƒáƒ™áƒ˜ %d"
+
+#: xlogreader.c:2063
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ით, ბლáƒáƒ™áƒ˜ %d"
+
+#: xlogreader.c:2090 xlogreader.c:2107
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "%3$s მეთáƒáƒ“ით შეკუმშული áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %1$X/%2$X, ბლáƒáƒ™áƒ˜ %4$d შეუძლებელიáƒ. მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირáƒáƒ› áƒáƒ’ების მიერ"
+
+#: xlogreader.c:2116
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, შეკუმშულირუცნáƒáƒ‘ი მეთáƒáƒ“ით, ბლáƒáƒ™áƒ˜ %d"
+
+#: xlogreader.c:2124
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, ბლáƒáƒ™áƒ˜ %d"
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X"
+
+#, c-format
+#~ msgid "invalid timeline specification: \"%s\""
+#~ msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: \"%s\""
diff --git a/src/bin/pg_waldump/po/ko.po b/src/bin/pg_waldump/po/ko.po
new file mode 100644
index 0000000..3594b9b
--- /dev/null
+++ b/src/bin/pg_waldump/po/ko.po
@@ -0,0 +1,615 @@
+# LANGUAGE 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.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:48+0000\n"
+"PO-Revision-Date: 2023-05-26 13:22+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "\"%s\" 디렉터리가 있지만, 비어있지 ì•ŠìŒ"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" ë””ë ‰í„°ë¦¬ì— ì ‘ê·¼ í•  수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d bytes"
+msgstr[0] ""
+"WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—ì„œ 1GBì‚¬ì´ 2^n ì´ì–´ì•¼í•˜ì§€ë§Œ, \"%s\" WAL íŒŒì¼ í—¤ë”ì—"
+"는 %d ë°”ì´íŠ¸ë¡œ 지정ë˜ì–´ìžˆìŠµë‹ˆë‹¤"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "\"%s\" WAL íŒŒì¼ ì°¾ê¸° 실패"
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "ì–´ë–¤ WAL 파ì¼ë„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "\"%s\" 파ì¼ì—ì„œ %d 위치를 ì½ì„ 수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "%s 파ì¼ì—ì„œ %d 위치ì—ì„œ ì½ê¸° 실패: %d ì½ìŒ, ì „ì²´ %d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "ìž˜ëª»ëœ í¬í¬ 번호: %u"
+
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr "%s ëª…ë ¹ì€ ë””ë²„ê¹…ì„ ìœ„í•´ PostgreSQL 미리 쓰기 로그(WAL)를 분ì„합니다.\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [옵션]... [ì‹œìž‘íŒŒì¼ [마침파ì¼]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid ""
+" -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details 백업 블ë¡ì— 대한 ìžì„¸í•œ ì •ë³´ë„ ì¶œë ¥í•¨\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid ""
+" -B, --block=N with --relation, only show records that modify "
+"block N\n"
+msgstr ""
+" -B, --block=N --relation 옵션과 함께, ë³€ê²½ëœ N번 블ë¡ì˜ 레코드만"
+"ë´„\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR RECPTR WAL 위치ì—ì„œ ì½ê¸° 멈춤\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow WAL ë까지 ì½ì€ ë’¤ì—ë„ ê³„ì† ì§„í–‰í•¨\n"
+
+#: pg_waldump.c:763
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK 지정한 FORK 종류 í¬í¬ì˜ 변경 블ë¡ì˜ 레코드만\n"
+" 사용가능한 í¬í¬: main, fsm, vm, init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N 출력할 레코드 수\n"
+
+#: pg_waldump.c:766
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/"
+"pg_wal)\n"
+msgstr ""
+" -p, --path=PATH WAL ì¡°ê° íŒŒì¼ì´ 있는 디렉터리 지정, ë˜ëŠ”\n"
+" ./pg_wal 디렉터리가 있는 디렉터리 지정\n"
+" (기본값: 현재 디렉터리, ./pg_wal, PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet 오류를 빼고 나머지는 아무 ê²ƒë„ ì•ˆ 보여줌\n"
+
+#: pg_waldump.c:770
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager "
+"RMGR;\n"
+" use --rmgr=list to list valid resource manager "
+"names\n"
+msgstr ""
+" -r, --rmgr=RMGR 리소스 ê´€ë¦¬ìž RMGRì—ì„œ 만든 레코드만 출력함\n"
+" 리소스 ê´€ë¦¬ìž ì´ë“¤ì„ --rmgr=list ë¡œ ë´„\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid ""
+" -R, --relation=T/D/R only show records that modify blocks in relation T/"
+"D/R\n"
+msgstr ""
+" -R, --relation=T/D/R T/D/R 릴레ì´ì…˜ì—ì„œ 변경 ë¸”ë¡ ë ˆì½”ë“œë§Œ 보여줌\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR WAL RECPTR 위치ì—ì„œ ì½ê¸° 시작\n"
+
+#: pg_waldump.c:774
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI WAL 레코드를 시작할 타임ë¼ì¸ 번호\n"
+" (기본값: 1 ë˜ëŠ” STARTSEGì— ì‚¬ìš©ëœ ê°’)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보 보여주고 마침\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage full page write 레코드만 보여줌\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID 트랜잭션 XID 레코드만 출력\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] ë ˆí¬ë“œ 통계 정보를 보여줌\n"
+" (추가로, 레코드당 통계정보를 출력)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=DIR DIRì— ì „ì²´ 페ì´ì§€ ì´ë¯¸ì§€ 저장\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "ì¸ìžë¥¼ 지정하세요"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ìž˜ëª»ëœ ë¸”ë¡ ë²ˆí˜¸: \"%s\""
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ìž˜ëª»ëœ WAL 위치: \"%s\""
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ìž˜ëª»ëœ í¬í¬ ì´ë¦„: \"%s\""
+
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" ê°’ì€ %s 옵션 값으로 유효하지 ì•ŠìŒ"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "\"%s\" ì´ë¦„ì˜ ì‚¬ìš©ìž ì •ì˜ ë¦¬ì†ŒìŠ¤ 관리ìžê°€ ì—†ìŒ"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "\"%s\" ì´ë¦„ì˜ ë¦¬ì†ŒìŠ¤ 관리ìžê°€ ì—†ìŒ"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ìž˜ëª»ëœ ë¦´ë ˆì´ì…˜ ì–‘ì‹: \"%s\""
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "\"í…Œì´ë¸”스페ì´ìŠ¤OID/ë°ì´í„°ë² ì´ìŠ¤OID/릴레ì´ì…˜ filenode\" ì–‘ì‹ì„ 기대함"
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s ê°’ì€ %u부터 %u까지만 허용함"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ìž˜ëª»ëœ íŠ¸ëžœìž­ì…˜ ID ì–‘ì‹: \"%s\""
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "%s ì˜µì…˜ì— ëŒ€í•œ ì•Œ 수 없는 ê°’: %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "%s ì˜µì…˜ì€ %s 옵션 ì„¤ì •ì´ í•„ìš”í•©ë‹ˆë‹¤."
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")"
+
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ"
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "%X/%X WAL 시작 위치가 \"%s\" 파ì¼ì— ì—†ìŒ"
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "%s ENDSEGê°€ %s STARTSEG ì•žì— ìžˆìŒ"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "%X/%X WAL ë 위치가 \"%s\" 파ì¼ì— ì—†ìŒ"
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "입력한 WAL 위치ì—ì„œ 시작할 수 ì—†ìŒ"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "WAL ì½ê¸° 프로세서를 할당하는 ì¤‘ì— ë©”ëª¨ë¦¬ 부족 ë°œìƒ"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%X 위치 ë’¤ì— ì˜¬ë°”ë¥¸ 레코드가 ì—†ìŒ"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "첫 레코드가 %X/%X ë’¤ì— ìžˆê³ , (%X/%X), %u ë°”ì´íŠ¸ 건너 뜀\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "%X/%X 위치ì—ì„œ WAL 레코드 오류: %s"
+
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 오프셋: 위치 %X/%X, 기대값 %u, 실재값 %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%Xì—ì„œ contrecord를 필요로 함"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´: 위치 %X/%X, 기대값 %u, 실재값 %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "%u ê¸¸ì´ ë ˆì½”ë“œë¥¼ 디코드 ìž‘ì—…ì„ ìœ„í•œ 메모리가 부족함"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "너무 긴 길ì´(%u)ì˜ ë ˆì½”ë“œê°€ %X/%Xì— ìžˆìŒ"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "%X/%X ìœ„ì¹˜ì— contrecord 플래그가 ì—†ìŒ"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u (기대값: %lld), 위치 %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ìž˜ëª»ëœ ìžì› 관리 ID %u, 위치: %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ë ˆì½”ë“œì˜ ìž˜ëª»ëœ í”„ë¦¬ë§í¬ %X/%X, 해당 레코드 %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "ìž˜ëª»ëœ ìžì›ê´€ë¦¬ìž ë°ì´í„° ì²´í¬ì„¬, 위치: %X/%X 레코드"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 %u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì— ì§€ì •ëœ ê°’ì´ ìž˜"
+"ëª»ëœ ì¡°ê° í¬ê¸°ìž„"
+
+#: xlogreader.c:1271
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìŠ¤ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì˜ XLOG_BLCKSZ ê°’"
+"ì´ ë°”ë¥´ì§€ ì•ŠìŒ"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid ""
+"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, "
+"offset %u"
+msgstr ""
+"타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 "
+"%u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X ì— ìžë£Œê°€ ì—†ìŒ"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길ì´ì˜ ìžë£Œê°€ 있ìŒ, 위치 %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: "
+"%u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ì•ˆë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1847
+#, 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 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´"
+"는 %u, 대ìƒ: %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL ì„¤ì •ì´ ë˜ì–´ 있지만, %X/%X ì— ì´ì „ 릴레ì´ì…˜ ì—†ìŒ"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ìž˜ëª»ëœ block_id %u, 위치 %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´, 위치 %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "WAL 레코드ì—ì„œ %d IDì˜ ë°±ì—… ë¸”ë¡ ìœ„ì¹˜ë¥¼ 바르게 ìž¡ì„ ìˆ˜ ì—†ìŒ"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "%X/%X ìœ„ì¹˜ì— ì´ë¯¸ì§€ë¥¼ ë³µì›í•  수 ì—†ìŒ, 해당 %d 블ë¡ì´ 깨졌ìŒ"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, ìž˜ëª»ëœ ìƒíƒœì˜ 압축 ì´ë¯¸ì§€, 위치 %X/%X, ë¸”ë¡ %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"%X/%X 압축 ìœ„ì¹˜ì— ì´ë¯¸ì§€ ë³µì›í•  수 ì—†ìŒ, %s ì••ì¶•ì„ ì§€ì›í•˜ì§€ ì•ŠìŒ, 해당 블ë¡: "
+"%d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"%X/%X 압축 ìœ„ì¹˜ì— ì´ë¯¸ì§€ ë³µì›í•  수 ì—†ìŒ, ì•Œ 수 ì—†ì€ ë°©ë²•, 해당 블ë¡: %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "압축 ì´ë¯¸ì§€ 풀기 실패, 위치 %X/%X, ë¸”ë¡ %d"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "%X/%X ìœ„ì¹˜ì— contrecord ì—†ìŒ"
diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build
new file mode 100644
index 0000000..c418803
--- /dev/null
+++ b/src/bin/pg_waldump/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_waldump-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_waldump/po/ru.po b/src/bin/pg_waldump/po/ru.po
new file mode 100644
index 0000000..4a2754d
--- /dev/null
+++ b/src/bin/pg_waldump/po/ru.po
@@ -0,0 +1,709 @@
+# 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.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2018, 2019, 2020, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-02-02 18:10+0300\n"
+"PO-Revision-Date: 2023-08-30 15:41+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доÑтупа к каталогу \"%s\": %m"
+
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл \"%s\": %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d byte"
+msgid_plural ""
+"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL "
+"file \"%s\" header specifies %d bytes"
+msgstr[0] ""
+"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d"
+msgstr[1] ""
+"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d"
+msgstr[2] ""
+"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 "
+"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %d)"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "не удалоÑÑŒ найти файл WAL \"%s\""
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "не удалоÑÑŒ найти ни одного файла WAL"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "не удалоÑÑŒ найти файл \"%s\": %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "не удалоÑÑŒ прочитать из файла %s по Ñмещению %d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr ""
+"не удалоÑÑŒ прочитать из файла %s по Ñмещению %d (прочитано байт: %d из %d)"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "неверный номер ÑлоÑ: %u"
+
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m"
+
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s декодирует и показывает журналы предзапиÑи PostgreSQL Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки.\n"
+"\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ÐÐЧÐЛЬÐЫЙ_СЕГМЕÐТ [КОÐЕЧÐЫЙ_СЕГМЕÐТ]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid ""
+" -b, --bkp-details output detailed information about backup blocks\n"
+msgstr ""
+" -b, --bkp-details вывеÑти подробную информацию о копиÑÑ… Ñтраниц\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid ""
+" -B, --block=N with --relation, only show records that modify "
+"block N\n"
+msgstr ""
+" -B, --block=N в Ñочетании Ñ --relation указывает выводить только\n"
+" запиÑи, в которых менÑетÑÑ Ð±Ð»Ð¾Ðº N\n"
+
+# well-spelled: ПОЗЗÐП
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr ""
+" -e, --end=ПОЗЗÐП прекратить чтение в заданной позиции запиÑи в WAL\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr ""
+" -f, --follow повторÑÑ‚ÑŒ попытки Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾ доÑтижении конца WAL\n"
+
+# well-spelled: ÐœÐГР
+#: pg_waldump.c:763
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=СЛОЙ выводить только запиÑи, в которых менÑÑŽÑ‚ÑÑ Ð±Ð»Ð¾ÐºÐ¸ в "
+"СЛОЕ\n"
+" Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ из ÑпиÑка: main, fsm, vm, init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N чиÑло выводимых запиÑей\n"
+
+# skip-rule: space-before-period
+#: pg_waldump.c:766
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/"
+"pg_wal)\n"
+msgstr ""
+" -p, --path=ПУТЬ каталог, где нужно иÑкать файлы Ñегментов WAL, или\n"
+" каталог Ñ Ð¿Ð¾Ð´ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ ./pg_wal, Ñодержащим такие "
+"файлы\n"
+" (по умолчанию: текущий каталог,\n"
+" ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet не выводить никаких Ñообщений, кроме ошибок\n"
+
+# well-spelled: ÐœÐГР
+#: pg_waldump.c:770
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager "
+"RMGR;\n"
+" use --rmgr=list to list valid resource manager "
+"names\n"
+msgstr ""
+" -r, --rmgr=ÐœÐГР выводить запиÑи только менеджера реÑурÑов ÐœÐГР;\n"
+" Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка доÑтупных менеджеров реÑурÑов\n"
+" укажите --rmgr=list\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid ""
+" -R, --relation=T/D/R only show records that modify blocks in relation T/"
+"D/R\n"
+msgstr ""
+" -R, --relation=T/D/R выводить только запиÑи, в которых менÑÑŽÑ‚ÑÑ Ð±Ð»Ð¾ÐºÐ¸\n"
+" в отношении T/D/R\n"
+
+# well-spelled: ПОЗЗÐП
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr ""
+" -s, --start=ПОЗЗÐП начать чтение Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ позиции запиÑи в WAL\n"
+
+# well-spelled: ЛВР
+#: pg_waldump.c:774
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=ЛВР Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸, запиÑи которой будут прочитаны\n"
+" (по умолчанию: 1 или линиÑ, определÑÐµÐ¼Ð°Ñ "
+"аргументом\n"
+" ÐÐЧÐЛЬÐЫЙ_СЕГМЕÐТ)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr ""
+" -w, --fullpage выводить только запиÑи, Ñодержащие полные Ñтраницы\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr ""
+" -x, --xid=XID выводить только запиÑи Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼\n"
+" идентификатором транзакции\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] показывать ÑтатиÑтику вмеÑто запиÑей\n"
+" (также возможно получить ÑтатиÑтику по запиÑÑм)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr ""
+" --save-fullpage=ПУТЬ запиÑывать полные образы Ñтраниц в заданный "
+"каталог\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "аргументы не указаны"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "неверный номер блока: \"%s\""
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL: \"%s\""
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "неверное Ð¸Ð¼Ñ ÑлоÑ: \"%s\""
+
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "пользовательÑкий менеджер реÑурÑов \"%s\" не ÑущеÑтвует"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "менеджер реÑурÑов \"%s\" не ÑущеÑтвует"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "неверное указание отношениÑ: \"%s\""
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr ""
+"ОжидаетÑÑ \"OID табл. проÑтранÑтва/OID базы данных/файловый узел отношениÑ\"."
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "значение %s должно быть в диапазоне %u..%u"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "неверное указание ID транзакции: \"%s\""
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "нераÑпознанное значение параметра %s: %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "параметр %s требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "не удалоÑÑŒ открыть файл \"%s\""
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL %X/%X находитÑÑ Ð½Ðµ в файле \"%s\""
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "КОÐЕЧÐЫЙ_СЕГМЕÐТ %s меньше, чем ÐÐЧÐЛЬÐЫЙ_СЕГМЕÐТ %s"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL %X/%X находитÑÑ Ð½Ðµ в файле \"%s\""
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL не задана"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "не удалоÑÑŒ выделить памÑÑ‚ÑŒ Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ WAL"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "не удалоÑÑŒ найти дейÑтвительную запиÑÑŒ поÑле позиции %X/%X"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] ""
+"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б\n"
+msgstr[1] ""
+"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б\n"
+msgstr[2] ""
+"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "ошибка в запиÑи WAL в позиции %X/%X: %s"
+
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: xlogreader.c:621
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr ""
+"неверное Ñмещение запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u"
+
+#: xlogreader.c:630
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "в позиции %X/%X запрошено продолжение запиÑи"
+
+#: xlogreader.c:671 xlogreader.c:1136
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr ""
+"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u"
+
+#: xlogreader.c:760
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "нет флага contrecord в позиции %X/%X"
+
+#: xlogreader.c:773
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° contrecord: %u (ожидалаÑÑŒ %lld) в позиции %X/%X"
+
+#: xlogreader.c:1144
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "неверный ID менеджера реÑурÑов %u в позиции %X/%X"
+
+#: xlogreader.c:1157 xlogreader.c:1173
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X в позиции %X/%X"
+
+#: xlogreader.c:1211
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr ""
+"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи в позиции "
+"%X/%X"
+
+#: xlogreader.c:1245
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+"неверное магичеÑкое чиÑло %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1260 xlogreader.c:1302
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+"неверные информационные биты %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1276
+#, 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 принадлежит другой СУБД: в нём указан идентификатор ÑиÑтемы БД "
+"%llu, а идентификатор ÑиÑтемы pg_control: %llu"
+
+#: xlogreader.c:1284
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect segment size in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный размер Ñегмента в заголовке "
+"Ñтраницы"
+
+#: xlogreader.c:1290
+#, c-format
+msgid ""
+"WAL file is from different database system: incorrect XLOG_BLCKSZ in page "
+"header"
+msgstr ""
+"файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке "
+"Ñтраницы"
+
+#: xlogreader.c:1322
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "неожиданный pageaddr %X/%X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1348
+#, c-format
+msgid ""
+"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, "
+"offset %u"
+msgstr ""
+"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте WAL "
+"%s, LSN %X/%X, Ñмещение %u"
+
+#: xlogreader.c:1754
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "идентификатор блока %u идёт не по порÑдку в позиции %X/%X"
+
+#: xlogreader.c:1778
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA уÑтановлен, но данных в позиции %X/%X нет"
+
+#: xlogreader.c:1785
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr ""
+"BKPBLOCK_HAS_DATA не уÑтановлен, но длина данных равна %u в позиции %X/%X"
+
+#: xlogreader.c:1821
+#, c-format
+msgid ""
+"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at "
+"%X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина %u "
+"при длине образа блока %u в позиции %X/%X"
+
+#: xlogreader.c:1837
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_HAS_HOLE не уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина "
+"%u в позиции %X/%X"
+
+#: xlogreader.c:1851
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr ""
+"BKPIMAGE_COMPRESSED уÑтановлен, но длина образа блока равна %u в позиции %X/"
+"%X"
+
+#: xlogreader.c:1866
+#, 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 не уÑтановлены, но длина образа "
+"блока равна %u в позиции %X/%X"
+
+#: xlogreader.c:1882
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr ""
+"BKPBLOCK_SAME_REL уÑтановлен, но предыдущее значение не задано в позиции %X/"
+"%X"
+
+#: xlogreader.c:1894
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "неверный идентификатор блока %u в позиции %X/%X"
+
+#: xlogreader.c:1961
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ длиной в позиции %X/%X"
+
+#: xlogreader.c:1987
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не удалоÑÑŒ найти копию блока Ñ ID %d в запиÑи журнала WAL"
+
+#: xlogreader.c:2071
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ неверным блоком %d"
+
+#: xlogreader.c:2078
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼ ÑоÑтоÑнием, блок %d"
+
+#: xlogreader.c:2105 xlogreader.c:2122
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with %s not supported by build, "
+"block %d"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый методом %s, который не "
+"поддерживаетÑÑ Ñтой Ñборкой, блок %d"
+
+#: xlogreader.c:2131
+#, c-format
+msgid ""
+"could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr ""
+"не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый неизвеÑтным методом, "
+"блок %d"
+
+#: xlogreader.c:2139
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не удалоÑÑŒ развернуть образ в позиции %X/%X, блок %d"
+
+#, c-format
+#~ msgid "out of memory while trying to decode a record of length %u"
+#~ msgstr "не удалоÑÑŒ выделить памÑÑ‚ÑŒ Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u"
+
+#, c-format
+#~ msgid "record length %u at %X/%X too long"
+#~ msgstr "длина запиÑи %u в позиции %X/%X Ñлишком велика"
+
+#, c-format
+#~ msgid "invalid timeline specification: \"%s\""
+#~ msgstr "неверное указание линии времени: \"%s\""
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "неверное Ñмещение запиÑи: %X/%X"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "нет запиÑи contrecord в %X/%X"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "%s: FATAL: "
+#~ msgstr "%s: СБОЙ: "
+
+#~ msgid "could not parse \"%s\" as a transaction ID"
+#~ msgstr "не удалоÑÑŒ разобрать в \"%s\" идентификатор транзакции"
+
+#~ msgid "could not parse limit \"%s\""
+#~ msgstr "не удалоÑÑŒ разобрать предел в \"%s\""
+
+#~ msgid "could not parse start WAL location \"%s\""
+#~ msgstr "не удалоÑÑŒ разобрать начальную позицию в WAL \"%s\""
+
+#~ msgid "could not parse timeline \"%s\""
+#~ msgstr "не удалоÑÑŒ разобрать линию времени в \"%s\""
+
+#~ msgid "could not seek in log file %s to offset %u: %s"
+#~ msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² файле журнала %s к Ñмещению %u: %s"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "not enough data in file \"%s\""
+#~ msgstr "недоÑтаточно данных в файле \"%s\""
+
+#~ msgid "out of memory"
+#~ msgstr "нехватка памÑти"
+
+#~ msgid "path \"%s\" could not be opened: %s"
+#~ msgstr "не удалоÑÑŒ открыть путь \"%s\": %s"
diff --git a/src/bin/pg_waldump/po/sv.po b/src/bin/pg_waldump/po/sv.po
new file mode 100644
index 0000000..4fd2ceb
--- /dev/null
+++ b/src/bin/pg_waldump/po/sv.po
@@ -0,0 +1,581 @@
+# Swedish 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.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-02 03:17+0000\n"
+"PO-Revision-Date: 2023-08-30 08:59+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "katalogen \"%s\" existerar men är inte tom"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte"
+msgstr[1] "WAL-segmentstorlek måste vara en tvåpotens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "kunde inte läsa fil \"%s\": %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "kunde inte läsa fil \"%s\": läste %d av %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "kunde inte lokalisera WAL-fil \"%s\""
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "kunde inte hitta några WAL-filer"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "kunde inte hitta filen \"%s\": %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "Kunde inte läsa från fil %s på offset %d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "kunde inte läsa från fil %s, offset %d, läste %d av %d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "ogiltigt fork-nummer: %u"
+
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "kunde inte skriva fil \"%s\": %m"
+
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "kunde inte stänga fil \"%s\": %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr "%s avkodar och visar PostgreSQLs write-ahead-logg för debuggning.\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [FLAGGA]... [STARTSEG [SLUTSEG]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details skriv detaljerad information om backupblock\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr ""
+" -B, --block=N tillsammans med --relation, visa bara poster som\n"
+" modifierar block N\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR stoppa läsning vid WAL-position RECPTR\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow fortsätt försök efter att ha nått slutet av WAL\n"
+
+#: pg_waldump.c:763
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=GREN visa bara poster som modifierar block i grenen GREN\n"
+" gilriga namn är main, fsm, vm och init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N antal poster att visa\n"
+
+#: pg_waldump.c:766
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=SÖKVÄG katalog där man hittar WAL-segmentfiler eller en\n"
+" katalog med en ./pg_wal som innehåller sådana filer\n"
+" (standard: aktuell katalog, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden förutom fel\n"
+
+#: pg_waldump.c:770
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR visa bara poster skapade av resurshanteraren RMGR;\n"
+" använd --rmgr=list för att lista giltiga resurshanterarnamn\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr ""
+" -R, --relation=T/D/R visa bara poster som modifierar block i\n"
+" relationen T/D/R\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR börja läsning vid WAL-position RECPTR\n"
+
+#: pg_waldump.c:774
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI tidslinje från vilken vi läser WAL-poster\n"
+" (standard: 1 eller värdet som används i STARTSEG)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage visa bara poster som skrivit hela sidor\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID visa baras poster med transaktions-ID XID\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=post] visa statistik istället för poster\n"
+" (alternativt, visa statistik per post)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=KAT spara kopia av hela sidor till KAT\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa den här hjälpen, avsluta sedan\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "inga argument angivna"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "ogiltigt portnummer \"%s\""
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "ogiltig WAL-position: \"%s\""
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "ogiltigt fork-namn: \"%s\""
+
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "egendefinierad resurshanterare \"%s\" finns inte"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "resurshanterare \"%s\" finns inte"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "ogiltig inställning av relation: \"%s\""
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Skall vara en av \"OID för tabellutrymme/OID för databas/relations filnod\"."
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s måste vara i intervallet %u..%u"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "ogiltig inställning av transaktions-ID: %s"
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "okänt värde för flaggan %s: %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "flaggan %s kräver att flaggan %s också anges"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "kunde inte öppna filen \"%s\""
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "start-WAL-position %X/%X är inte i filen \"%s\""
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "SLUTSEG %s är före STARTSEG %s"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "slut-WAL-position %X/%X är inte i filen \"%s\""
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "ingen start-WAL-position angiven"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "slut på minne vid allokering av en WAL-läs-processor"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "kunde inte hitta en giltig post efter %X/%X"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n"
+msgstr[1] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "fel i WAL-post vid %X/%X: %s"
+
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ogiltig postoffset vid %X/%X: förväntade minst %u, fick %u"
+
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "contrecord är begärd vid %X/%X"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "slut på minne vid avkodning av post med längden %u"
+
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "postlängd %u vid %X/%X är för lång"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "det finns ingen contrecord-flagga vid %X/%X"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X"
+
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "ogiltigt resurshanterar-ID %u vid %X/%X"
+
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "post med inkorrekt prev-link %X/%X vid %X/%X"
+
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "felaktigt magiskt nummer %04X i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "ogiltiga infobitar %04X i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1257
+#, c-format
+msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu"
+msgstr "WAL-fil är från ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu"
+
+#: xlogreader.c:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt segmentstorlek i sidhuvud"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL-fil är från ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u"
+
+# FIXME
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "\"ej i sekvens\"-fel på tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "\"ej i sekvens\"-block_id %u vid %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X"
+
+#: xlogreader.c:1766
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X"
+
+#: xlogreader.c:1802
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE är satt men håloffset %u längd %u blockavbildlängd %u vid %X/%X"
+
+#: xlogreader.c:1818
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE är inte satt men håloffset %u längd %u vid %X/%X"
+
+#: xlogreader.c:1832
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X"
+
+#: xlogreader.c:1847
+#, c-format
+msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X"
+msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X"
+
+#: xlogreader.c:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ogiltig block_id %u vid %X/%X"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "post med ogiltig längd vid %X/%X"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "kunde inte hitta backup-block med ID %d i WAL-post"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt block %d angivet"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X med ogiltigt state, block %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "kunde inte återställa avbild vid %X/%X, komprimerad med okänd metod, block %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "kunde inte packa upp avbild vid %X/%X, block %d"
+
+#, c-format
+#~ msgid "invalid record offset at %X/%X"
+#~ msgstr "ogiltig postoffset vid %X/%X"
+
+#, c-format
+#~ msgid "invalid timeline specification: \"%s\""
+#~ msgstr "ogiltig inställning av tidslinje: %s"
+
+#, c-format
+#~ msgid "missing contrecord at %X/%X"
+#~ msgstr "det saknas en contrecord vid %X/%X"
diff --git a/src/bin/pg_waldump/po/tr.po b/src/bin/pg_waldump/po/tr.po
new file mode 100644
index 0000000..e572031
--- /dev/null
+++ b/src/bin/pg_waldump/po/tr.po
@@ -0,0 +1,306 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
+# Abdullah Gülner <agulner@gmail.com>, 2017, 2018, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:46+0000\n"
+"PO-Revision-Date: 2019-06-12 17:17+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: pg_waldump.c:148
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "\"%s\" dosyası açılamıyor: %s"
+
+#: pg_waldump.c:205
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat \"%s\" WAL dosyasının başlığında (header) %d bayt belirtilmektedir"
+msgstr[1] "WAL segment boyutu 1 MB ve 1GB arasında 2 nin üssü bir değer olmalıdır, fakat \"%s\" WAL dosyasının başlığında (header) %d bayt belirtilmektedir"
+
+#: pg_waldump.c:213
+#, c-format
+msgid "could not read file \"%s\": %s"
+msgstr "\"%s\" dosyası okunamadı: %s"
+
+#: pg_waldump.c:216
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "\"%1$s\" dosyası okuma hatası: %3$zu nun %2$d si okundu"
+
+#: pg_waldump.c:294
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "\"%s\" WAL dosyasının yeri tespit edilemedi"
+
+#: pg_waldump.c:296
+#, c-format
+msgid "could not find any WAL file"
+msgstr "hiç WAL dosyası bulunamadı"
+
+#: pg_waldump.c:367
+#, c-format
+msgid "could not find file \"%s\": %s"
+msgstr "\"%s\" dosyası bulunamadı: %s"
+
+#: pg_waldump.c:382
+#, c-format
+msgid "could not seek in log file %s to offset %u: %s"
+msgstr "%s log dosyasında aranamadı %u göreli konumuna (pfset) kadar: %s"
+
+#: pg_waldump.c:405
+#, c-format
+msgid "could not read from log file %s, offset %u, length %d: %s"
+msgstr "log dosyasından okunamadı %s, göreli konum (offset) %u, uzunluk %d: %s"
+
+#: pg_waldump.c:408
+#, c-format
+msgid "could not read from log file %s, offset %u: read %d of %zu"
+msgstr "%1$s log dosyasından okunamadı , göreli konum (offset) %2$u: %4$zu'nin %3$d'si okundu"
+
+#: pg_waldump.c:787
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL write-ahead loglarını hata ayıklama için çözer (decode) ve görüntüler.\n"
+"\n"
+
+#: pg_waldump.c:789
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: pg_waldump.c:790
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [SEÇENEK]... [BAŞLAMASEG [BİTİŞSEG]]\n"
+
+#: pg_waldump.c:791
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: pg_waldump.c:792
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details yedek blokları hakkında ayrıntılı bilgi görüntüler\n"
+
+#: pg_waldump.c:793
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR RECPTR WAL konumunda okumayı durdur\n"
+
+#: pg_waldump.c:794
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow WAL sonuna ulaştıktan sonra denemeye devam et\n"
+
+#: pg_waldump.c:795
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N görüntülenecek kayıt sayısı\n"
+
+#: pg_waldump.c:796
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH log segment dosyalarının bulunacağı dizin veya\n"
+" öyle dosyaları içeren ./pg_wal'li bir dizin \n"
+" (varsayılan: geçerli dizin, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:799
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR sadece RMGR kaynak yöneticisi tarafından oluşturulan kayıtları göster;\n"
+" geçerli kaynak yöneticisi adlarını listelemek için --rmgr=list kullanın\n"
+
+#: pg_waldump.c:801
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR RECPTR WAL konumunda okumayı başlat\n"
+
+#: pg_waldump.c:802
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI log kayıtlarının okunacağı zaman çizelgesi\n"
+" (varsayılan: 1 veya BAŞLAMASEG'de belirtilen değer)\n"
+
+#: pg_waldump.c:804
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini görüntüle, sonra çık\n"
+
+#: pg_waldump.c:805
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID sadece XID işlem ID'li kayıtları göster\n"
+
+#: pg_waldump.c:806
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] kayıtlar yerine istatistikleri göster\n"
+" (opsiyonel olarak, kayıt bazında istatistikleri göster)\n"
+
+#: pg_waldump.c:808
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: pg_waldump.c:868
+#, c-format
+msgid "no arguments specified"
+msgstr "hiç argüman belirtilmemiş"
+
+#: pg_waldump.c:883
+#, c-format
+msgid "could not parse end WAL location \"%s\""
+msgstr "bitiş WAL konumu \"%s\" ayrıştırılamadı"
+
+#: pg_waldump.c:899
+#, c-format
+msgid "could not parse limit \"%s\""
+msgstr "\"%s\" limiti ayrıştırılamadı"
+
+#: pg_waldump.c:927
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "\"%s\" kaynak yöneticisi mevcut değil"
+
+#: pg_waldump.c:936
+#, c-format
+msgid "could not parse start WAL location \"%s\""
+msgstr "başlama WAL konumu \"%s\" ayrıştırılamadı"
+
+#: pg_waldump.c:946
+#, c-format
+msgid "could not parse timeline \"%s\""
+msgstr "\"%s\" zaman çizelgesi ayrıştırılamadı"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "could not parse \"%s\" as a transaction ID"
+msgstr "\"%s\" bir işlem (transaction) ID'si olarak ayrıştırılamadı"
+
+#: pg_waldump.c:972
+#, c-format
+msgid "unrecognized argument to --stats: %s"
+msgstr "--stats için bilinmeyen argüman: %s"
+
+#: pg_waldump.c:985
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok fazla komut satırı argümanı var (ilki \"%s\")"
+
+#: pg_waldump.c:995
+#, c-format
+msgid "path \"%s\" could not be opened: %s"
+msgstr "\"%s\" yolu açılamadı: %s"
+
+#: pg_waldump.c:1016
+#, c-format
+msgid "could not open directory \"%s\": %s"
+msgstr "\"%s\" dizini açılamadı: %s"
+
+#: pg_waldump.c:1023 pg_waldump.c:1054
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "\"%s\" dosyası açılamadı"
+
+#: pg_waldump.c:1033
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "başlama WAL konumu %X/%X \"%s\" dosyası içinde yok"
+
+#: pg_waldump.c:1061
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "BİTİŞSEG %s BAŞLAMASEG %s den önce"
+
+#: pg_waldump.c:1076
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "bitiş WAL konumu %X/%X \"%s\" dosyası içinde yok"
+
+#: pg_waldump.c:1089
+#, c-format
+msgid "no start WAL location given"
+msgstr "baÅŸlama WAL konumu belirtilmemiÅŸ"
+
+#: pg_waldump.c:1099
+#, c-format
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: pg_waldump.c:1105
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%X den sonra geçerli bir kayıt bulunamadı"
+
+#: pg_waldump.c:1116
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "ilk kayıt %X/%X 'den sonra, %X/%X 'dedir, %u bayt atlanıyor\n"
+msgstr[1] "ilk kayıt %X/%X 'den sonra, %X/%X 'dedir, %u bayt atlanıyor\n"
+
+#: pg_waldump.c:1167
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "%X/%X de WAL kaydında hata: %s"
+
+#: pg_waldump.c:1177
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#~ msgid "not enough data in file \"%s\""
+#~ msgstr "\"%s\" dosyasında yetersiz veri"
+
+#~ msgid "%s: FATAL: "
+#~ msgstr "%s: KRÄ°TÄ°K (FATAL): "
diff --git a/src/bin/pg_waldump/po/uk.po b/src/bin/pg_waldump/po/uk.po
new file mode 100644
index 0000000..23ad959
--- /dev/null
+++ b/src/bin/pg_waldump/po/uk.po
@@ -0,0 +1,542 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:17+0000\n"
+"PO-Revision-Date: 2023-12-19 15:38\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_waldump.pot\n"
+"X-Crowdin-File-ID: 979\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m"
+
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній"
+
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доÑтупу до каталогу \"%s\": %m"
+
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байт"
+msgstr[1] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байти"
+msgstr[2] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байтів"
+msgstr[3] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байтів"
+
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ WAL файл \"%s\""
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ жодного WAL файлу"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл \"%s\": %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл %s, зÑув %d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу %s, зÑув %d: прочитано %d з %d"
+
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "неприпуÑтимий номер форку: %u"
+
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m"
+
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "неможливо закрити файл \"%s\": %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n\n"
+msgstr "%s декодує Ñ– відображає журнали попереднього запиÑу PostgreSQL Ð´Ð»Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ.\n\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]...[STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details виводити детальну інформацію про блоки резервних копій\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N з --relation, лише показати запиÑи, Ñкі змінюють блок N\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR зупинити Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL з міÑÑ†Ñ RECPTR\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow повторювати Ñпроби піÑÐ»Ñ Ð´Ð¾ÑÑÐ³Ð½ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ WAL\n"
+
+#: pg_waldump.c:763
+#, c-format
+msgid " -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr " -F, --fork=FORK показати лише запиÑи, Ñкі змінюють блоки в форці FORK;\n"
+" дійÑні імена: main, fsm, vm, init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N чиÑло запиÑів Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ\n"
+
+#: pg_waldump.c:766
+#, c-format
+msgid " -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr " -p, --path=PATH каталог, у Ñкому шукати файли Ñегментів журналу \n"
+" або каталог з ./pg_wal, що міÑтить такі файли\n"
+" (за замовчуваннÑм: чинний каталог, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n"
+
+#: pg_waldump.c:770
+#, c-format
+msgid " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr " -r, --rmgr=RMGR відображати запиÑи, згенеровані лише реÑурÑним менеджером RMGR;\n"
+" викориÑтовувати --rmgr=list Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду ÑпиÑку припуÑтимих імен реÑурÑного менеджера\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R відобразити тільки запиÑи, Ñкі змінюють блоки у відношенні T/D/R\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR почати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL з міÑÑ†Ñ RECPTR\n"
+
+#: pg_waldump.c:774
+#, c-format
+msgid " -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr " -t, --timeline=TLI чаÑова шкала, WAL-запиÑи Ñкої будуть прочитані\n"
+" (за замовчуваннÑм: 1 або значеннÑ, що викориÑтовуєтьÑÑ Ñƒ STARTSEG)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage показувати запиÑи лише з повним запиÑом на Ñторінці\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID показати запиÑи лише з ідентифікатором транзакцій XID\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid " -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr " -z, --stats[=record] показати ÑтатиÑтику заміÑÑ‚ÑŒ запиÑів (необов'Ñзково, відобразити щорÑдкову ÑтатиÑтику)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=DIR зберігати повні Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñторінок в DIR\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку потім вийти\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "не вказано аргументів"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "неприпуÑтимий номер блоку: \"%s\""
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "неприпуÑтиме Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL: \"%s\""
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "неприпуÑтиме ім'Ñ Ñ„Ð¾Ñ€ÐºÑƒ: \"%s\""
+
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "кориÑтувацький менеджер реÑурÑів \"%s\" не Ñ–Ñнує"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "менеджер реÑурÑів \"%s\" не Ñ–Ñнує"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ: \"%s\""
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "Очікуємо \"tablespace OID/database OID/relation filenode\"."
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s має бути в діапазоні %u..%u"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° транзакції: \"%s\""
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s: %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "параметр %s вимагає викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\""
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL %X/%X не вÑередині файлу \"%s\""
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s перед STARTSEG %s"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL %X/%X не вÑередині файлу \"%s\""
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "не задано початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ– під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ припуÑтимий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байт\n"
+msgstr[1] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байти\n"
+msgstr[2] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байтів\n"
+msgstr[3] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байти\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "помилка у запиÑÑ– WAL у %X/%X: %s"
+
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: xlogreader.c:621
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr ""
+
+#: xlogreader.c:630
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "по зÑуву %X/%X запитано Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу"
+
+#: xlogreader.c:671 xlogreader.c:1136
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr ""
+
+#: xlogreader.c:760
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "немає Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ contrecord в позиції %X/%X"
+
+#: xlogreader.c:773
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "неприпуÑтима довжина contrecord %u (очікувалоÑÑŒ %lld) на %X/%X"
+
+#: xlogreader.c:1144
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "невірний ID менеджера реÑурÑів %u в %X/%X"
+
+#: xlogreader.c:1157 xlogreader.c:1173
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· неправильним попереднім поÑиланнÑм %X/%X на %X/%X"
+
+#: xlogreader.c:1211
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "некоректна контрольна Ñума даних менеджера реÑурÑів у запиÑу по зÑуву %X/%X"
+
+#: xlogreader.c:1245
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+
+#: xlogreader.c:1260 xlogreader.c:1302
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+
+#: xlogreader.c:1276
+#, 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:1284
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний розмір Ñегменту в заголовку Ñторінки"
+
+#: xlogreader.c:1290
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний XLOG_BLCKSZ в заголовку Ñторінки"
+
+#: xlogreader.c:1322
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+
+#: xlogreader.c:1348
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr ""
+
+#: xlogreader.c:1754
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X"
+
+#: xlogreader.c:1778
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але немає даних в позиції %X/%X"
+
+#: xlogreader.c:1785
+#, c-format
+msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X"
+msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але довжина даних дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1821
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u, при довжині образу блока %u в позиції %X/%X"
+
+#: xlogreader.c:1837
+#, c-format
+msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X"
+msgstr "BKPIMAGE_HAS_HOLE не вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u в позиції %X/%X"
+
+#: xlogreader.c:1851
+#, c-format
+msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X"
+msgstr "BKPIMAGE_COMPRESSED вÑтановлений, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1866
+#, 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 не вÑтановлені, але довжина образу блока дорівнює %u в позиції %X/%X"
+
+#: xlogreader.c:1882
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "BKPBLOCK_SAME_REL вÑтановлений, але попереднє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ задано в позиції %X/%X"
+
+#: xlogreader.c:1894
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "невірний ідентифікатор блоку %u в позиції %X/%X"
+
+#: xlogreader.c:1961
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· невірною довжиною на %X/%X"
+
+#: xlogreader.c:1987
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ блок резервної копії з ID %d у запиÑÑ– WAL"
+
+#: xlogreader.c:2071
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним вказаним блоком %d"
+
+#: xlogreader.c:2078
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним Ñтаном, блок %d"
+
+#: xlogreader.c:2105 xlogreader.c:2122
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² %X/%X, ÑтиÑнуте %s, не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d"
+
+#: xlogreader.c:2131
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X ÑтиÑнуте з невідомим методом, блок %d"
+
+#: xlogreader.c:2139
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° %X/%X, блок %d"
+
diff --git a/src/bin/pg_waldump/po/vi.po b/src/bin/pg_waldump/po/vi.po
new file mode 100644
index 0000000..037d995
--- /dev/null
+++ b/src/bin/pg_waldump/po/vi.po
@@ -0,0 +1,309 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# FIRST AUTHOR <kakalot49@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2018-04-22 12:16+0000\n"
+"PO-Revision-Date: 2018-05-04 22:19+0900\n"
+"Language-Team: <pgvn_translators@postgresql.vn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.0.6\n"
+"Last-Translator: Dang Minh Huong <kakalot49@gmail.com>\n"
+"Language: vi_VN\n"
+
+#: pg_waldump.c:85
+#, c-format
+msgid "%s: FATAL: "
+msgstr "%s: FATAL: "
+
+#: pg_waldump.c:166
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "không thể mở tệp \"%s\": %s"
+
+#: pg_waldump.c:221
+#, c-format
+msgid ""
+"WAL segment size must be a power of two between 1MB and 1GB, but the WAL "
+"file \"%s\" header specifies %d bytes"
+msgstr ""
+"Kích thước phân đoạn WAL phải là lũy thừa của hai giá trị từ 1MB đến "
+"1GB, nhưng header của tệp WAL \"%s\" chỉ định %d bytes"
+
+#: pg_waldump.c:227
+#, c-format
+msgid "could not read file \"%s\": %s"
+msgstr "không thể Ä‘á»c tệp \"%s\": %s"
+
+#: pg_waldump.c:230
+#, c-format
+msgid "not enough data in file \"%s\""
+msgstr "không đủ dữ liệu trong tệp \"%s\""
+
+#: pg_waldump.c:307
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "không thể định vị tệp WAL \"%s\""
+
+#: pg_waldump.c:309
+#, c-format
+msgid "could not find any WAL file"
+msgstr "không thể tìm thấy tệp WAL nào cả"
+
+#: pg_waldump.c:380
+#, c-format
+msgid "could not find file \"%s\": %s"
+msgstr "không thể tìm được tệp \"%s\": %s"
+
+#: pg_waldump.c:395
+#, c-format
+msgid "could not seek in log file %s to offset %u: %s"
+msgstr "không thể tìm kiếm trong tệp log %s tới offset %u: %s"
+
+#: pg_waldump.c:415
+#, c-format
+msgid "could not read from log file %s, offset %u, length %d: %s"
+msgstr "không thể Ä‘á»c từ tệp log %s, offset %u, Ä‘á»™ dài %d: %s"
+
+#: pg_waldump.c:794
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s giải mã và hiển thị các bản ghi WAL của PostgreSQL cho debug.\n"
+"\n"
+
+#: pg_waldump.c:796
+#, c-format
+msgid "Usage:\n"
+msgstr "Cách sử dụng:\n"
+
+#: pg_waldump.c:797
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:798
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Tùy chá»n:\n"
+
+#: pg_waldump.c:799
+#, c-format
+msgid ""
+" -b, --bkp-details output detailed information about backup "
+"blocks\n"
+msgstr ""
+" -b, --bkp-details xuất thông tin chi tiết vỠcác khối sao lưu\n"
+
+#: pg_waldump.c:800
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR dừng Ä‘á»c WAL tại vị trí RECPTR\n"
+
+#: pg_waldump.c:801
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr ""
+" -f, --follow tiếp tục thử lại sau khi đến tới vị trí cuối "
+"của WAL\n"
+
+#: pg_waldump.c:802
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N số bản ghi để hiển thị\n"
+
+#: pg_waldump.c:803
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or "
+"a\n"
+" directory with a ./pg_wal that contains such "
+"files\n"
+" (default: current directory, ./pg_wal, $PGDATA/"
+"pg_wal)\n"
+msgstr ""
+" -p, --path=PATH thư mục để tìm tệp phân đoạn log hay thư mục \n"
+" chứa những tệp đó như là ./pg_wal (mặc định: "
+"thư mục \n"
+" hiện tại, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:806
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager "
+"RMGR;\n"
+" use --rmgr=list to list valid resource manager "
+"names\n"
+msgstr ""
+" -r, --rmgr=RMGR chỉ hiển thị các bản ghi được tạo bởi trình "
+"quản lý \n"
+" tài nguyên RMGR; sử dụng --rmgr=list để hiểu "
+"thị\n"
+" tên các trình quản lý tài nguyên hợp lệ\n"
+
+#: pg_waldump.c:808
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR bắt đầu Ä‘á»c tại vị trí RECPTR của WAL\n"
+
+#: pg_waldump.c:809
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI Ä‘á»c bản ghi vá»›i giá trị timeline chỉ định\n"
+" (mặc định: 1 hoặc giá trị sử dụng trong "
+"STARTSEG)\n"
+
+#: pg_waldump.c:811
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr ""
+" -V, --version hiển thị thông tin phiên bản, sau đó thoát\n"
+
+#: pg_waldump.c:812
+#, c-format
+msgid ""
+" -x, --xid=XID only show records with transaction ID XID\n"
+msgstr ""
+" -x, --xid=XID chỉ xuất bản ghi với transaction ID là XID\n"
+
+#: pg_waldump.c:813
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] hiển thị số liệu thống kê thay vì bản ghi\n"
+" (tùy chá»n, hiển thị số liệu thống kê cho má»—i "
+"bản ghi)\n"
+
+#: pg_waldump.c:815
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help hiện thị trợ giúp này, sau đó kết thúc\n"
+
+#: pg_waldump.c:874
+#, c-format
+msgid "%s: no arguments specified\n"
+msgstr "%s: không có đối số nào được chỉ định\n"
+
+#: pg_waldump.c:889
+#, c-format
+msgid "%s: could not parse end WAL location \"%s\"\n"
+msgstr "%s: không thể phân tích cú pháp vị trí kết thúc WAL \"%s\"\n"
+
+#: pg_waldump.c:905
+#, c-format
+msgid "%s: could not parse limit \"%s\"\n"
+msgstr "%s: không thể phân tích giới hạn\"%s\"\n"
+
+#: pg_waldump.c:934
+#, c-format
+msgid "%s: resource manager \"%s\" does not exist\n"
+msgstr "%s: trình quản lý tài nguyên \"%s\" không tồn tại\n"
+
+#: pg_waldump.c:943
+#, c-format
+msgid "%s: could not parse start WAL location \"%s\"\n"
+msgstr ""
+"%s: không thể phân tích cú pháp vị trí bắt đầu WAL \"%s\"\n"
+"\n"
+
+#: pg_waldump.c:953
+#, c-format
+msgid "%s: could not parse timeline \"%s\"\n"
+msgstr "%s: không thể phân tích timeline \"%s\"\n"
+
+#: pg_waldump.c:965
+#, c-format
+msgid "%s: could not parse \"%s\" as a transaction ID\n"
+msgstr "%s: không thể phân tích \"%s\" như là một transaction ID\n"
+
+#: pg_waldump.c:980
+#, c-format
+msgid "%s: unrecognized argument to --stats: %s\n"
+msgstr "%s: đối số không được công nhận cho tùy chá»n --stats: %s\n"
+
+#: pg_waldump.c:994
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: có quá nhiá»u đối số dòng lệnh (đầu tiên là \"%s\")\n"
+
+#: pg_waldump.c:1005
+#, c-format
+msgid "%s: path \"%s\" could not be opened: %s\n"
+msgstr "%s: Ä‘Æ°á»ng dẫn \"%s\" không thể mở được %s\n"
+
+#: pg_waldump.c:1026
+#, c-format
+msgid "could not open directory \"%s\": %s"
+msgstr "không thể mở thư mục \"%s\": %s"
+
+#: pg_waldump.c:1033 pg_waldump.c:1066
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "không thể mở tệp \"%s\""
+
+#: pg_waldump.c:1044
+#, c-format
+msgid "%s: start WAL location %X/%X is not inside file \"%s\"\n"
+msgstr "%s: vị trí bắt đầu WAL %X/%X không nằm trong tệp \"%s\"\n"
+
+#: pg_waldump.c:1073
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s ở trước STARTSEG %s"
+
+#: pg_waldump.c:1089
+#, c-format
+msgid "%s: end WAL location %X/%X is not inside file \"%s\"\n"
+msgstr ""
+"%s: vị trí kết thúc WAL %X/%X không nằm trong tệp \"%s\"\n"
+"\n"
+
+#: pg_waldump.c:1103
+#, c-format
+msgid "%s: no start WAL location given\n"
+msgstr "%s: không có vị trí bắt đầu WAL được chỉ định\n"
+
+#: pg_waldump.c:1113
+#, c-format
+msgid "out of memory"
+msgstr "hết bộ nhớ"
+
+#: pg_waldump.c:1119
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "không thể tìm thấy bản ghi hợp lệ sau %X/%X"
+
+#: pg_waldump.c:1130
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural ""
+"first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "bản ghi đầu tiên sau %X/%X, at %X/%X, bỠqua %u bytes\n"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "lỗi trong bản ghi WAL ở %X/%X: %s"
+
+#: pg_waldump.c:1191
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Hãy thử \"%s --help\" để biết thêm thông tin.\n"
diff --git a/src/bin/pg_waldump/po/zh_CN.po b/src/bin/pg_waldump/po/zh_CN.po
new file mode 100644
index 0000000..5aeb928
--- /dev/null
+++ b/src/bin/pg_waldump/po/zh_CN.po
@@ -0,0 +1,307 @@
+# LANGUAGE message translation file for pg_waldump
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@cn.fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 13\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-06-05 01:45+0000\n"
+"PO-Revision-Date: 2020-06-23 18:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@cn.fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@cn.fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: pg_waldump.c:146
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "无法打开文件 \"%s\": %m"
+
+#: pg_waldump.c:202
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL段大å°å¿…须是1MB到1GB之间的2次幂,但WAL文件\"%s\"头指定了%d个字节"
+msgstr[1] "WAL段大å°å¿…须是1MB到1GB之间的2次幂,但WAL文件\"%s\"头指定了%d个字节"
+
+#: pg_waldump.c:210
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "无法读å–文件 \"%s\": %m"
+
+#: pg_waldump.c:213
+#, c-format
+msgid "could not read file \"%s\": read %d of %zu"
+msgstr "无法读å–文件\"%1$s\":读å–了%3$zu中的%2$d"
+
+#: pg_waldump.c:275
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "找ä¸åˆ°WAL文件\"%s\""
+
+#: pg_waldump.c:277
+#, c-format
+msgid "could not find any WAL file"
+msgstr "找ä¸åˆ°ä»»ä½•WAL文件"
+
+#: pg_waldump.c:318
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "找ä¸åˆ°æ–‡ä»¶\"%s\": %m"
+
+#: pg_waldump.c:367
+#, c-format
+msgid "could not read from file %s, offset %u: %m"
+msgstr "无法从文件 %s读å–,åç§»é‡ %u: %m"
+
+#: pg_waldump.c:371
+#, c-format
+msgid "could not read from file %s, offset %u: read %d of %zu"
+msgstr "无法从文件%1$s读å–,å移é‡%2$u,读å–%4$zu中的%3$d"
+
+#: pg_waldump.c:720
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr ""
+"%s 为了调试,解ç å¹¶æ˜¾ç¤ºPostgreSQL预写日志.\n"
+"\n"
+
+#: pg_waldump.c:722
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_waldump.c:723
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [选项]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:724
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: pg_waldump.c:725
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details 输出有关备份å—的详细信æ¯\n"
+
+#: pg_waldump.c:726
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR 在指定的WALä½ç½®åœæ­¢è¯»å–\n"
+
+#: pg_waldump.c:727
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow 在到达å¯ç”¨WAL的末尾之åŽï¼Œç»§ç»­é‡è¯•\n"
+
+#: pg_waldump.c:728
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N è¦æ˜¾ç¤ºçš„记录数\n"
+
+#: pg_waldump.c:729
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find log segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH 在其中查找日志段文件的目录\n"
+" 或包å«æ­¤ç±»æ–‡ä»¶çš„./pg_wal目录\n"
+" (默认值: 当å‰çš„目录, ./pg_wal, $PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:732
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet ä¸æ‰“å°ä»»ä½•è¾“出,错误除外\n"
+
+#: pg_waldump.c:733
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR åªæ˜¾ç¤ºç”±RMGR资æºç®¡ç†å™¨ç”Ÿæˆçš„记录\n"
+" 使用--rmgr=list列出有效的资æºç®¡ç†å™¨å称\n"
+
+#: pg_waldump.c:735
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR 在WAL中ä½äºŽRECPTR处开始阅读\n"
+
+#: pg_waldump.c:736
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read log records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI è¦ä»Žå“ªä¸ªæ—¶é—´çº¿è¯»å–日志记录\n"
+" (默认值:1或者是使用STARTSEG中的值)\n"
+
+#: pg_waldump.c:738
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_waldump.c:739
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID åªæ˜¾ç¤ºç”¨ç»™å®šäº‹åŠ¡ID标记的记录\n"
+
+#: pg_waldump.c:740
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] 显示统计信æ¯è€Œä¸æ˜¯è®°å½•\n"
+" (或者,显示æ¯ä¸ªè®°å½•çš„统计信æ¯)\n"
+
+#: pg_waldump.c:742
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_waldump.c:743
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至 <%s>.\n"
+
+#: pg_waldump.c:744
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: pg_waldump.c:821
+#, c-format
+msgid "no arguments specified"
+msgstr "未指定å‚æ•°"
+
+#: pg_waldump.c:836
+#, c-format
+msgid "could not parse end WAL location \"%s\""
+msgstr "无法解æžWAL结æŸä½ç½®\"%s\""
+
+#: pg_waldump.c:848
+#, c-format
+msgid "could not parse limit \"%s\""
+msgstr "无法解æžé™åˆ¶\"%s\""
+
+#: pg_waldump.c:879
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "资æºç®¡ç†å™¨\"%s\"ä¸å­˜åœ¨"
+
+#: pg_waldump.c:888
+#, c-format
+msgid "could not parse start WAL location \"%s\""
+msgstr "无法解æžWAL起始ä½ç½®\"%s\""
+
+#: pg_waldump.c:898
+#, c-format
+msgid "could not parse timeline \"%s\""
+msgstr "无法解æžæ—¶é—´çº¿\"%s\""
+
+#: pg_waldump.c:905
+#, c-format
+msgid "could not parse \"%s\" as a transaction ID"
+msgstr "无法将\"%s\"解æžä¸ºäº‹åŠ¡ID"
+
+#: pg_waldump.c:920
+#, c-format
+msgid "unrecognized argument to --stats: %s"
+msgstr "无法识别的å‚æ•°--stats: %s"
+
+#: pg_waldump.c:933
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: pg_waldump.c:943 pg_waldump.c:963
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "无法打开目录 \"%s\": %m"
+
+#: pg_waldump.c:969 pg_waldump.c:1000
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "could not open file\"%s\""
+
+#: pg_waldump.c:979
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL开始ä½ç½®%X/%Xä¸åœ¨æ–‡ä»¶\"%s\"中"
+
+#: pg_waldump.c:1007
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s在STARTSEG %s之å‰"
+
+#: pg_waldump.c:1022
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL结æŸä½ç½®%X/%Xä¸åœ¨æ–‡ä»¶\"%s\"中"
+
+#: pg_waldump.c:1035
+#, c-format
+msgid "no start WAL location given"
+msgstr "未给出WAL起始ä½ç½®"
+
+#: pg_waldump.c:1049
+#, c-format
+msgid "out of memory"
+msgstr "内存用尽"
+
+#: pg_waldump.c:1055
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "在%X/%X之åŽæ‰¾ä¸åˆ°æœ‰æ•ˆè®°å½•"
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "第一æ¡è®°å½•åœ¨%X/%X之åŽï¼Œä½äºŽ%X/%X,跳过了%u个字节\n"
+msgstr[1] "第一æ¡è®°å½•åœ¨%X/%X之åŽï¼Œä½äºŽ%X/%X,跳过了%u个字节\n"
+
+#: pg_waldump.c:1117
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "在WAL记录中的%X/%X处错误为: %s"
+
+#: pg_waldump.c:1127
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n" \ No newline at end of file
diff --git a/src/bin/pg_waldump/po/zh_TW.po b/src/bin/pg_waldump/po/zh_TW.po
new file mode 100644
index 0000000..5eb35fb
--- /dev/null
+++ b/src/bin/pg_waldump/po/zh_TW.po
@@ -0,0 +1,591 @@
+# Traditional Chinese message translation file for pg_waldump
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_waldump (PostgreSQL) package.
+# Zhenbang Wei <znbang@gmail.com>, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_waldump (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:48+0000\n"
+"PO-Revision-Date: 2023-11-06 08:50+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: pg_waldump.c:137
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄\"%s\": %m"
+
+# commands/tablespace.c:334
+#: pg_waldump.c:146
+#, c-format
+msgid "directory \"%s\" exists but is not empty"
+msgstr "目錄 \"%s\" 已存在,但ä¸æ˜¯ç©ºç›®éŒ„"
+
+# utils/init/postinit.c:283
+#: pg_waldump.c:150
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "無法存å–目錄 \"%s\": %m"
+
+# access/transam/slru.c:638 access/transam/xlog.c:1631
+# access/transam/xlog.c:2742 access/transam/xlog.c:2832
+# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935
+# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889
+# utils/misc/database.c:68
+#: pg_waldump.c:199 pg_waldump.c:528
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "無法開啟檔案\"%s\": %m"
+
+#: pg_waldump.c:255
+#, c-format
+msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte"
+msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes"
+msgstr[0] "WAL 片段大å°å¿…須為介於 1 MB 到 1 GB 之間的二的次方數,但是 WAL 檔 \"%s\" 的標頭指定了 %d ä½å…ƒçµ„"
+
+# access/transam/xlog.c:1659 access/transam/xlog.c:2942
+# access/transam/xlog.c:5397 access/transam/xlog.c:5448
+# access/transam/xlog.c:5520 access/transam/xlog.c:5545
+# access/transam/xlog.c:5583
+#: pg_waldump.c:261
+#, c-format
+msgid "could not read file \"%s\": %m"
+msgstr "無法讀å–檔案\"%s\": %m"
+
+#: pg_waldump.c:264
+#, c-format
+msgid "could not read file \"%s\": read %d of %d"
+msgstr "無法讀å–檔案 \"%s\": å·²è®€å– %d / %d"
+
+#: pg_waldump.c:325
+#, c-format
+msgid "could not locate WAL file \"%s\""
+msgstr "找ä¸åˆ° WAL 檔 \"%s\""
+
+#: pg_waldump.c:327
+#, c-format
+msgid "could not find any WAL file"
+msgstr "找ä¸åˆ°ä»»ä½• WAL 檔"
+
+#: pg_waldump.c:368
+#, c-format
+msgid "could not find file \"%s\": %m"
+msgstr "找ä¸åˆ°æª”案 \"%s\": %m"
+
+#: pg_waldump.c:417
+#, c-format
+msgid "could not read from file %s, offset %d: %m"
+msgstr "無法從檔案 %s 讀å–,ä½ç§» %d: %m"
+
+#: pg_waldump.c:421
+#, c-format
+msgid "could not read from file %s, offset %d: read %d of %d"
+msgstr "無法從檔案 %s 讀å–,ä½ç§» %d: å·²è®€å– %d / %d"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: pg_waldump.c:511
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_waldump.c:519
+#, c-format
+msgid "invalid fork number: %u"
+msgstr "無效的分å‰è™Ÿç¢¼: %u"
+
+# access/transam/xlog.c:5319 access/transam/xlog.c:5439
+#: pg_waldump.c:531
+#, c-format
+msgid "could not write file \"%s\": %m"
+msgstr "無法寫入檔案 \"%s\": %m"
+
+# access/transam/slru.c:680 access/transam/xlog.c:1567
+# access/transam/xlog.c:1691 access/transam/xlog.c:3013
+#: pg_waldump.c:534
+#, c-format
+msgid "could not close file \"%s\": %m"
+msgstr "無法關閉檔案 \"%s\": %m"
+
+#: pg_waldump.c:754
+#, c-format
+msgid ""
+"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n"
+"\n"
+msgstr "%s 解碼並顯示 PostgreSQL 的 write-ahead 日誌以進行除錯。\n"
+
+#: pg_waldump.c:756
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: pg_waldump.c:757
+#, c-format
+msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n"
+
+#: pg_waldump.c:758
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"é¸é …:\n"
+
+#: pg_waldump.c:759
+#, c-format
+msgid " -b, --bkp-details output detailed information about backup blocks\n"
+msgstr " -b, --bkp-details 輸出關於備份å€å¡Šçš„詳細資訊\n"
+
+#: pg_waldump.c:760
+#, c-format
+msgid " -B, --block=N with --relation, only show records that modify block N\n"
+msgstr " -B, --block=N 與 --relation 一起使用,åªé¡¯ç¤ºä¿®æ”¹å€å¡Š N 的記錄\n"
+
+#: pg_waldump.c:761
+#, c-format
+msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n"
+msgstr " -e, --end=RECPTR 在 WAL ä½ç½® RECPTR åœæ­¢è®€å–\n"
+
+#: pg_waldump.c:762
+#, c-format
+msgid " -f, --follow keep retrying after reaching end of WAL\n"
+msgstr " -f, --follow åˆ°é” WAL çµå°¾å¾Œç¹¼çºŒå˜—試\n"
+
+#: pg_waldump.c:763
+#, c-format
+msgid ""
+" -F, --fork=FORK only show records that modify blocks in fork FORK;\n"
+" valid names are main, fsm, vm, init\n"
+msgstr ""
+" -F, --fork=FORK åªé¡¯ç¤ºåˆ†å‰ FORK 中修改å€å¡Šçš„記錄;\n"
+" 有效的å稱有 main, fsm, vm, init\n"
+
+#: pg_waldump.c:765
+#, c-format
+msgid " -n, --limit=N number of records to display\n"
+msgstr " -n, --limit=N è¦é¡¯ç¤ºçš„記錄數é‡\n"
+
+#: pg_waldump.c:766
+#, c-format
+msgid ""
+" -p, --path=PATH directory in which to find WAL segment files or a\n"
+" directory with a ./pg_wal that contains such files\n"
+" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"
+msgstr ""
+" -p, --path=PATH åŒ…å« WAL ç‰‡æ®µæª”çš„ç›®éŒ„ï¼Œæˆ–åŒ…å« ./pg_wal 的目錄,\n"
+" 且 ./pg_wal 內有 WAL 片段檔\n"
+" (é è¨­: ç›®å‰ç›®éŒ„ã€./pg_walã€$PGDATA/pg_wal)\n"
+
+#: pg_waldump.c:769
+#, c-format
+msgid " -q, --quiet do not print any output, except for errors\n"
+msgstr " -q, --quiet ä¸é¡¯ç¤ºä»»ä½•è¼¸å‡ºï¼Œé™¤äº†éŒ¯èª¤è¨Šæ¯\n"
+
+#: pg_waldump.c:770
+#, c-format
+msgid ""
+" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n"
+" use --rmgr=list to list valid resource manager names\n"
+msgstr ""
+" -r, --rmgr=RMGR åªé¡¯ç¤ºç”±è³‡æºç®¡ç†å“¡ RMGR 產生的記錄;\n"
+" 用 --rmgr=list 列出有效的資æºç®¡ç†å“¡å稱\n"
+
+#: pg_waldump.c:772
+#, c-format
+msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n"
+msgstr " -R, --relation=T/D/R åªé¡¯ç¤ºåœ¨ T/D/R é—œè¯ä¸­ä¿®æ”¹å€å¡Šçš„記錄\n"
+
+#: pg_waldump.c:773
+#, c-format
+msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n"
+msgstr " -s, --start=RECPTR 從 WAL ä½ç½® RECPTR 開始讀å–\n"
+
+#: pg_waldump.c:774
+#, c-format
+msgid ""
+" -t, --timeline=TLI timeline from which to read WAL records\n"
+" (default: 1 or the value used in STARTSEG)\n"
+msgstr ""
+" -t, --timeline=TLI è®€å– WAL 記錄的時間軸\n"
+" (é è¨­: 1 或 STARTSEG 的值)\n"
+
+#: pg_waldump.c:776
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+#: pg_waldump.c:777
+#, c-format
+msgid " -w, --fullpage only show records with a full page write\n"
+msgstr " -w, --fullpage åªé¡¯ç¤ºæœ‰å®Œæ•´è³‡æ–™é å¯«å…¥çš„記錄\n"
+
+#: pg_waldump.c:778
+#, c-format
+msgid " -x, --xid=XID only show records with transaction ID XID\n"
+msgstr " -x, --xid=XID åªé¡¯ç¤ºæœ‰äº¤æ˜“ ID XID 的記錄\n"
+
+#: pg_waldump.c:779
+#, c-format
+msgid ""
+" -z, --stats[=record] show statistics instead of records\n"
+" (optionally, show per-record statistics)\n"
+msgstr ""
+" -z, --stats[=record] 顯示統計資料而ä¸æ˜¯è¨˜éŒ„\n"
+" (å¯é¸æ€§é¡¯ç¤ºæ¯ç­†è¨˜éŒ„的統計資料)\n"
+
+#: pg_waldump.c:781
+#, c-format
+msgid " --save-fullpage=DIR save full page images to DIR\n"
+msgstr " --save-fullpage=DIR 將完整資料é å½±åƒå­˜å…¥ DIR\n"
+
+#: pg_waldump.c:782
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後çµæŸ\n"
+
+#: pg_waldump.c:783
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>。\n"
+
+#: pg_waldump.c:784
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網站: <%s>\n"
+
+#: pg_waldump.c:880
+#, c-format
+msgid "no arguments specified"
+msgstr "未指定任何åƒæ•¸"
+
+#: pg_waldump.c:896
+#, c-format
+msgid "invalid block number: \"%s\""
+msgstr "無效的å€å¡Šç·¨è™Ÿ: \"%s\""
+
+#: pg_waldump.c:905 pg_waldump.c:1003
+#, c-format
+msgid "invalid WAL location: \"%s\""
+msgstr "無效的 WAL ä½ç½®: \"%s\""
+
+#: pg_waldump.c:918
+#, c-format
+msgid "invalid fork name: \"%s\""
+msgstr "無效的分å‰å稱: \"%s\""
+
+# utils/adt/formatting.c:2044
+#: pg_waldump.c:926 pg_waldump.c:1029
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "é¸é … %2$s 的值 \"%1$s\" 無效"
+
+#: pg_waldump.c:957
+#, c-format
+msgid "custom resource manager \"%s\" does not exist"
+msgstr "自訂資æºç®¡ç†å“¡ \"%s\" ä¸å­˜åœ¨"
+
+#: pg_waldump.c:978
+#, c-format
+msgid "resource manager \"%s\" does not exist"
+msgstr "資æºç®¡ç†å“¡ \"%s\" ä¸å­˜åœ¨"
+
+#: pg_waldump.c:993
+#, c-format
+msgid "invalid relation specification: \"%s\""
+msgstr "無效的關è¯è¦æ ¼: \"%s\""
+
+#: pg_waldump.c:994
+#, c-format
+msgid "Expecting \"tablespace OID/database OID/relation filenode\"."
+msgstr "é æœŸ \"表空間 OID/資料庫 OID/é—œè¯æª”案節點\"。"
+
+#: pg_waldump.c:1036
+#, c-format
+msgid "%s must be in range %u..%u"
+msgstr "%s å¿…é ˆåœ¨ç¯„åœ %u..%u å…§"
+
+#: pg_waldump.c:1051
+#, c-format
+msgid "invalid transaction ID specification: \"%s\""
+msgstr "無效的交易 ID è¦æ ¼: \"%s\""
+
+#: pg_waldump.c:1066
+#, c-format
+msgid "unrecognized value for option %s: %s"
+msgstr "ç„¡æ³•è¾¨è­˜é …é¸ %s 的值: %s"
+
+#: pg_waldump.c:1083
+#, c-format
+msgid "option %s requires option %s to be specified"
+msgstr "é¸é … %s 需è¦æŒ‡å®šé¸é … %s"
+
+#: pg_waldump.c:1090
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列åƒæ•¸éŽå¤š(第一個是 \"%s\")"
+
+# access/transam/slru.c:930 commands/tablespace.c:529
+# commands/tablespace.c:694 utils/adt/misc.c:174
+#: pg_waldump.c:1100 pg_waldump.c:1123
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "無法開啟目錄\"%s\": %m"
+
+#: pg_waldump.c:1129 pg_waldump.c:1159
+#, c-format
+msgid "could not open file \"%s\""
+msgstr "無法開啟檔案 \"%s\""
+
+#: pg_waldump.c:1139
+#, c-format
+msgid "start WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL 開始ä½ç½® %X/%X ä¸åœ¨æª”案 \"%s\" å…§"
+
+#: pg_waldump.c:1166
+#, c-format
+msgid "ENDSEG %s is before STARTSEG %s"
+msgstr "ENDSEG %s 在 STARTSEG %s 之å‰"
+
+#: pg_waldump.c:1181
+#, c-format
+msgid "end WAL location %X/%X is not inside file \"%s\""
+msgstr "WAL çµæŸä½ç½® %X/%X ä¸åœ¨æª”案 \"%s\" å…§"
+
+#: pg_waldump.c:1193
+#, c-format
+msgid "no start WAL location given"
+msgstr "未æä¾› WAL 開始ä½ç½"
+
+#: pg_waldump.c:1207
+#, c-format
+msgid "out of memory while allocating a WAL reading processor"
+msgstr "é…ç½® WAL 讀å–處ç†å™¨æ™‚耗盡記憶體"
+
+#: pg_waldump.c:1213
+#, c-format
+msgid "could not find a valid record after %X/%X"
+msgstr "%X/%X 之後找ä¸åˆ°æœ‰æ•ˆçš„記錄"
+
+#: pg_waldump.c:1223
+#, c-format
+msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n"
+msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n"
+msgstr[0] "第一筆記錄在 %X/%X 之後,ä½æ–¼ %X/%Xï¼Œè·³éŽ %u 個ä½å…ƒçµ„\n"
+
+#: pg_waldump.c:1308
+#, c-format
+msgid "error in WAL record at %X/%X: %s"
+msgstr "WAL 記錄在 %X/%X 出ç¾éŒ¯èª¤: %s"
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: pg_waldump.c:1317
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+#: xlogreader.c:626
+#, c-format
+msgid "invalid record offset at %X/%X: expected at least %u, got %u"
+msgstr "ä½æ–¼ %X/%X 的記錄 offset 無效: é æœŸè‡³å°‘ %u,實際為 %u"
+
+# access/transam/xlog.c:2443
+#: xlogreader.c:635
+#, c-format
+msgid "contrecord is requested by %X/%X"
+msgstr "%X/%X è¦æ±‚ contrecord"
+
+#: xlogreader.c:676 xlogreader.c:1119
+#, c-format
+msgid "invalid record length at %X/%X: expected at least %u, got %u"
+msgstr "ä½æ–¼ %X/%X 的記錄長度無效: é æœŸè‡³å°‘ %u,實際為 %u"
+
+#: xlogreader.c:705
+#, c-format
+msgid "out of memory while trying to decode a record of length %u"
+msgstr "嘗試解碼長度為 %u 的記錄時耗盡記憶體"
+
+# access/transam/xlog.c:2503
+#: xlogreader.c:727
+#, c-format
+msgid "record length %u at %X/%X too long"
+msgstr "ä½æ–¼ %X/%X 的記錄長度 %u éŽé•·"
+
+#: xlogreader.c:776
+#, c-format
+msgid "there is no contrecord flag at %X/%X"
+msgstr "ä½æ–¼ %X/%X 沒有 contrecord 標誌"
+
+#: xlogreader.c:789
+#, c-format
+msgid "invalid contrecord length %u (expected %lld) at %X/%X"
+msgstr "ä½æ–¼ %3$X/%4$X çš„ contrecord 長度 %1$u 無效(é æœŸç‚º %2$lld)"
+
+# access/transam/xlog.c:2465
+#: xlogreader.c:1127
+#, c-format
+msgid "invalid resource manager ID %u at %X/%X"
+msgstr "無效的資æºç®¡ç†å™¨ ID %u æ–¼ %X/%X"
+
+# access/transam/xlog.c:2458
+#: xlogreader.c:1140 xlogreader.c:1156
+#, c-format
+msgid "record with incorrect prev-link %X/%X at %X/%X"
+msgstr "ä½æ–¼ %3$X/%4$X 的記錄有ä¸æ­£ç¢ºçš„ prev-link %1$X/%2$X"
+
+# access/transam/xlog.c:2269
+#: xlogreader.c:1192
+#, c-format
+msgid "incorrect resource manager data checksum in record at %X/%X"
+msgstr "ä½æ–¼ %X/%X 的記錄中資æºç®¡ç†å“¡è³‡æ–™æª¢æŸ¥ç¢¼ä¸æ­£ç¢º"
+
+#: xlogreader.c:1226
+#, c-format
+msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "WAL 片段 %2$s 中的魔數數字 %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u"
+
+#: xlogreader.c:1241 xlogreader.c:1283
+#, c-format
+msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "WAL 片段 %2$s 中的資訊ä½å…ƒ %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u"
+
+#: xlogreader.c:1257
+#, 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:1265
+#, c-format
+msgid "WAL file is from different database system: incorrect segment size in page header"
+msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: 資料é æ¨™é ­ä¸­çš„片段大å°ä¸æ­£ç¢º"
+
+#: xlogreader.c:1271
+#, c-format
+msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header"
+msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: 資料é æ¨™é ­ä¸­çš„ XLOG_BLCKSZ ä¸æ­£ç¢º"
+
+#: xlogreader.c:1303
+#, c-format
+msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "éžé æœŸçš„ pageaddr %X/%X ä½æ–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u"
+
+#: xlogreader.c:1329
+#, c-format
+msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u"
+msgstr "éžä¾åº timeline ID %u(在 %u 之後)ä½æ–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u"
+
+#: xlogreader.c:1735
+#, c-format
+msgid "out-of-order block_id %u at %X/%X"
+msgstr "éžå¾ªåº block_id %u ä½æ–¼ %X/%X"
+
+#: xlogreader.c:1759
+#, c-format
+msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X"
+msgstr "設定了 BKPBLOCK_HAS_DATA,但在 %X/%X 的沒有包å«ä»»ä½•è³‡æ–™"
+
+#: xlogreader.c:1766
+#, 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:1802
+#, 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 有 offset %1$u 長度 %2$u å½±åƒé•·åº¦ %3$u 的空洞"
+
+#: xlogreader.c:1818
+#, 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 有 offset %1$u 長度 %2$u 的空洞"
+
+#: xlogreader.c:1832
+#, 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:1847
+#, 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:1863
+#, c-format
+msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X"
+msgstr "設定了 BKPBLOCK_SAME_REL,但在 %X/%X 沒有先å‰çš„ rel"
+
+#: xlogreader.c:1875
+#, c-format
+msgid "invalid block_id %u at %X/%X"
+msgstr "ä½æ–¼ %2$X/%3$X 的無效 block_id %1$u"
+
+#: xlogreader.c:1942
+#, c-format
+msgid "record with invalid length at %X/%X"
+msgstr "ä½æ–¼ %X/%X 的記錄長度無效"
+
+#: xlogreader.c:1968
+#, c-format
+msgid "could not locate backup block with ID %d in WAL record"
+msgstr "在 WAL 記錄中找ä¸åˆ°å…·æœ‰ ID %d 的備份å€å¡Š"
+
+#: xlogreader.c:2052
+#, c-format
+msgid "could not restore image at %X/%X with invalid block %d specified"
+msgstr "無法還原指定了無效å€å¡Š %3$d çš„å½±åƒï¼Œä½ç½® %1$X/%2$X"
+
+#: xlogreader.c:2059
+#, c-format
+msgid "could not restore image at %X/%X with invalid state, block %d"
+msgstr "無法還原處於無效狀態的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d"
+
+#: xlogreader.c:2086 xlogreader.c:2103
+#, c-format
+msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d"
+msgstr "無法還原用此版本ä¸æ”¯æ´çš„壓縮方法 %3$s 壓縮的影åƒï¼Œä½ç½® %1$X/%2$X,å€å¡Š %4$d"
+
+#: xlogreader.c:2112
+#, c-format
+msgid "could not restore image at %X/%X compressed with unknown method, block %d"
+msgstr "無法還原使用未知方法壓縮的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d"
+
+#: xlogreader.c:2120
+#, c-format
+msgid "could not decompress image at %X/%X, block %d"
+msgstr "無法解壓縮影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d"
diff --git a/src/bin/pg_waldump/rmgrdesc.c b/src/bin/pg_waldump/rmgrdesc.c
new file mode 100644
index 0000000..6b8c17b
--- /dev/null
+++ b/src/bin/pg_waldump/rmgrdesc.c
@@ -0,0 +1,99 @@
+/*
+ * rmgrdesc.c
+ *
+ * pg_waldump resource managers definition
+ *
+ * src/bin/pg_waldump/rmgrdesc.c
+ */
+#define FRONTEND 1
+#include "postgres.h"
+
+#include "access/brin_xlog.h"
+#include "access/clog.h"
+#include "access/commit_ts.h"
+#include "access/generic_xlog.h"
+#include "access/ginxlog.h"
+#include "access/gistxlog.h"
+#include "access/hash_xlog.h"
+#include "access/heapam_xlog.h"
+#include "access/multixact.h"
+#include "access/nbtxlog.h"
+#include "access/rmgr.h"
+#include "access/spgxlog.h"
+#include "access/xact.h"
+#include "access/xlog_internal.h"
+#include "catalog/storage_xlog.h"
+#include "commands/dbcommands_xlog.h"
+#include "commands/sequence.h"
+#include "commands/tablespace.h"
+#include "replication/message.h"
+#include "replication/origin.h"
+#include "rmgrdesc.h"
+#include "storage/standbydefs.h"
+#include "utils/relmapper.h"
+
+#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \
+ { name, desc, identify},
+
+static const RmgrDescData RmgrDescTable[RM_N_BUILTIN_IDS] = {
+#include "access/rmgrlist.h"
+};
+
+#define CUSTOM_NUMERIC_NAME_LEN sizeof("custom###")
+
+static char CustomNumericNames[RM_N_CUSTOM_IDS][CUSTOM_NUMERIC_NAME_LEN] = {{0}};
+static RmgrDescData CustomRmgrDesc[RM_N_CUSTOM_IDS] = {{0}};
+static bool CustomRmgrDescInitialized = false;
+
+/*
+ * No information on custom resource managers; just print the ID.
+ */
+static void
+default_desc(StringInfo buf, XLogReaderState *record)
+{
+ appendStringInfo(buf, "rmid: %d", XLogRecGetRmid(record));
+}
+
+/*
+ * No information on custom resource managers; just return NULL and let the
+ * caller handle it.
+ */
+static const char *
+default_identify(uint8 info)
+{
+ return NULL;
+}
+
+/*
+ * We are unable to get the real name of a custom rmgr because the module is
+ * not loaded. Generate a table of rmgrs with numeric names of the form
+ * "custom###", where "###" is the 3-digit resource manager ID.
+ */
+static void
+initialize_custom_rmgrs(void)
+{
+ for (int i = 0; i < RM_N_CUSTOM_IDS; i++)
+ {
+ snprintf(CustomNumericNames[i], CUSTOM_NUMERIC_NAME_LEN,
+ "custom%03d", i + RM_MIN_CUSTOM_ID);
+ CustomRmgrDesc[i].rm_name = CustomNumericNames[i];
+ CustomRmgrDesc[i].rm_desc = default_desc;
+ CustomRmgrDesc[i].rm_identify = default_identify;
+ }
+ CustomRmgrDescInitialized = true;
+}
+
+const RmgrDescData *
+GetRmgrDesc(RmgrId rmid)
+{
+ Assert(RmgrIdIsValid(rmid));
+
+ if (RmgrIdIsBuiltin(rmid))
+ return &RmgrDescTable[rmid];
+ else
+ {
+ if (!CustomRmgrDescInitialized)
+ initialize_custom_rmgrs();
+ return &CustomRmgrDesc[rmid - RM_MIN_CUSTOM_ID];
+ }
+}
diff --git a/src/bin/pg_waldump/rmgrdesc.h b/src/bin/pg_waldump/rmgrdesc.h
new file mode 100644
index 0000000..f733cd4
--- /dev/null
+++ b/src/bin/pg_waldump/rmgrdesc.h
@@ -0,0 +1,23 @@
+/*
+ * rmgrdesc.h
+ *
+ * pg_waldump resource managers declaration
+ *
+ * src/bin/pg_waldump/rmgrdesc.h
+ */
+#ifndef RMGRDESC_H
+#define RMGRDESC_H
+
+#include "access/xlogreader.h"
+#include "lib/stringinfo.h"
+
+typedef struct RmgrDescData
+{
+ const char *rm_name;
+ void (*rm_desc) (StringInfo buf, XLogReaderState *record);
+ const char *(*rm_identify) (uint8 info);
+} RmgrDescData;
+
+extern const RmgrDescData *GetRmgrDesc(RmgrId rmid);
+
+#endif /* RMGRDESC_H */
diff --git a/src/bin/pg_waldump/t/001_basic.pl b/src/bin/pg_waldump/t/001_basic.pl
new file mode 100644
index 0000000..492a8ca
--- /dev/null
+++ b/src/bin/pg_waldump/t/001_basic.pl
@@ -0,0 +1,13 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_waldump');
+program_version_ok('pg_waldump');
+program_options_handling_ok('pg_waldump');
+
+done_testing();
diff --git a/src/bin/pg_waldump/t/002_save_fullpage.pl b/src/bin/pg_waldump/t/002_save_fullpage.pl
new file mode 100644
index 0000000..f072580
--- /dev/null
+++ b/src/bin/pg_waldump/t/002_save_fullpage.pl
@@ -0,0 +1,113 @@
+
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use File::Basename;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::RecursiveCopy;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my ($blocksize, $walfile_name);
+
+# Function to extract the LSN from the given block structure
+sub get_block_lsn
+{
+ my $path = shift;
+ my $blocksize = shift;
+ my $block;
+
+ open my $fh, '<', $path or die "couldn't open file: $path\n";
+ die "could not read block\n"
+ if $blocksize != read($fh, $block, $blocksize);
+ my ($lsn_hi, $lsn_lo) = unpack('LL', $block);
+
+ $lsn_hi = sprintf('%08X', $lsn_hi);
+ $lsn_lo = sprintf('%08X', $lsn_lo);
+
+ return ($lsn_hi, $lsn_lo);
+}
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->append_conf(
+ 'postgresql.conf', q{
+wal_level = 'replica'
+max_wal_senders = 4
+});
+$node->start;
+
+# Generate data/WAL to examine that will have full pages in them.
+$node->safe_psql(
+ 'postgres',
+ "SELECT 'init' FROM pg_create_physical_replication_slot('regress_pg_waldump_slot', true, false);
+CREATE TABLE test_table AS SELECT generate_series(1,100) a;
+-- Force FPWs on the next writes.
+CHECKPOINT;
+UPDATE test_table SET a = a + 1;
+");
+
+($walfile_name, $blocksize) = split '\|' => $node->safe_psql('postgres',
+ "SELECT pg_walfile_name(pg_switch_wal()), current_setting('block_size')");
+
+# Get the relation node, etc for the new table
+my $relation = $node->safe_psql(
+ 'postgres',
+ q{SELECT format(
+ '%s/%s/%s',
+ CASE WHEN reltablespace = 0 THEN dattablespace ELSE reltablespace END,
+ pg_database.oid,
+ pg_relation_filenode(pg_class.oid))
+ FROM pg_class, pg_database
+ WHERE relname = 'test_table' AND
+ datname = current_database()}
+);
+
+my $walfile = $node->data_dir . '/pg_wal/' . $walfile_name;
+my $tmp_folder = PostgreSQL::Test::Utils::tempdir;
+
+ok(-f $walfile, "Got a WAL file");
+
+$node->command_ok(
+ [
+ 'pg_waldump', '--quiet',
+ '--save-fullpage', "$tmp_folder/raw",
+ '--relation', $relation,
+ $walfile
+ ],
+ 'pg_waldump with --save-fullpage runs');
+
+# This regexp will match filenames formatted as:
+# TLI-LSNh-LSNl.TBLSPCOID.DBOID.NODEOID.dd_fork with the components being:
+# - Timeline ID in hex format.
+# - WAL LSN in hex format, as two 8-character numbers.
+# - Tablespace OID (0 for global).
+# - Database OID.
+# - Relfilenode.
+# - Block number.
+# - Fork this block came from (vm, init, fsm, or main).
+my $file_re =
+ qr/^[0-9A-F]{8}-([0-9A-F]{8})-([0-9A-F]{8})[.][0-9]+[.][0-9]+[.][0-9]+[.][0-9]+(?:_vm|_init|_fsm|_main)?$/;
+
+my $file_count = 0;
+
+# Verify filename format matches --save-fullpage.
+for my $fullpath (glob "$tmp_folder/raw/*")
+{
+ my $file = File::Basename::basename($fullpath);
+
+ like($file, $file_re, "verify filename format for file $file");
+ $file_count++;
+
+ my ($hi_lsn_fn, $lo_lsn_fn) = ($file =~ $file_re);
+ my ($hi_lsn_bk, $lo_lsn_bk) = get_block_lsn($fullpath, $blocksize);
+
+ # The LSN on the block comes before the file's LSN.
+ ok( $hi_lsn_fn . $lo_lsn_fn gt $hi_lsn_bk . $lo_lsn_bk,
+ 'LSN stored in the file precedes the one stored in the block');
+}
+
+ok($file_count > 0, 'verify that at least one block has been saved');
+
+done_testing();
diff --git a/src/bin/pgbench/.gitignore b/src/bin/pgbench/.gitignore
new file mode 100644
index 0000000..07492a9
--- /dev/null
+++ b/src/bin/pgbench/.gitignore
@@ -0,0 +1,5 @@
+/exprparse.h
+/exprparse.c
+/exprscan.c
+/pgbench
+/tmp_check/
diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile
new file mode 100644
index 0000000..68b6eb0
--- /dev/null
+++ b/src/bin/pgbench/Makefile
@@ -0,0 +1,63 @@
+# src/bin/pgbench/Makefile
+
+PGFILEDESC = "pgbench - a simple program for running benchmark tests"
+PGAPPICON = win32
+
+subdir = src/bin/pgbench
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ exprparse.o \
+ exprscan.o \
+ pgbench.o
+
+override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+ifneq ($(PORTNAME), win32)
+override CFLAGS += $(PTHREAD_CFLAGS)
+else
+override CPPFLAGS += -DFD_SETSIZE=1024
+endif
+LIBS += $(PTHREAD_LIBS)
+
+
+all: pgbench
+
+pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+# See notes in src/backend/parser/Makefile about the following two rules
+exprparse.h: exprparse.c
+ touch $@
+
+exprparse.c: BISONFLAGS += -d
+
+# Force these dependencies to be known even without dependency info built:
+exprparse.o exprscan.o: exprparse.h
+
+distprep: exprparse.c exprscan.c
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pgbench$(X) '$(DESTDIR)$(bindir)/pgbench$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pgbench$(X)'
+
+clean distclean:
+ rm -f pgbench$(X) $(OBJS)
+ rm -rf tmp_check
+
+maintainer-clean: distclean
+ rm -f exprparse.h exprparse.c exprscan.c
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pgbench/exprparse.c b/src/bin/pgbench/exprparse.c
new file mode 100644
index 0000000..0dfe88c
--- /dev/null
+++ b/src/bin/pgbench/exprparse.c
@@ -0,0 +1,2114 @@
+/* A Bison parser, made by GNU Bison 3.7.5. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30705
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.7.5"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 1
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+/* Substitute the variable and function names. */
+#define yyparse expr_yyparse
+#define yylex expr_yylex
+#define yyerror expr_yyerror
+#define yydebug expr_yydebug
+#define yynerrs expr_yynerrs
+
+/* First part of user prologue. */
+#line 1 "exprparse.y"
+
+/*-------------------------------------------------------------------------
+ *
+ * exprparse.y
+ * bison grammar for a simple expression syntax
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprparse.y
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "pgbench.h"
+
+#define PGBENCH_NARGS_VARIABLE (-1)
+#define PGBENCH_NARGS_CASE (-2)
+#define PGBENCH_NARGS_HASH (-3)
+#define PGBENCH_NARGS_PERMUTE (-4)
+
+PgBenchExpr *expr_parse_result;
+
+static PgBenchExprList *make_elist(PgBenchExpr *expr, PgBenchExprList *list);
+static PgBenchExpr *make_null_constant(void);
+static PgBenchExpr *make_boolean_constant(bool bval);
+static PgBenchExpr *make_integer_constant(int64 ival);
+static PgBenchExpr *make_double_constant(double dval);
+static PgBenchExpr *make_variable(char *varname);
+static PgBenchExpr *make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr);
+static PgBenchExpr *make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr);
+static int find_func(yyscan_t yyscanner, const char *fname);
+static PgBenchExpr *make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args);
+static PgBenchExpr *make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part);
+
+
+#line 116 "exprparse.c"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast<Type> (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+#include "exprparse.h"
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_NULL_CONST = 3, /* NULL_CONST */
+ YYSYMBOL_INTEGER_CONST = 4, /* INTEGER_CONST */
+ YYSYMBOL_MAXINT_PLUS_ONE_CONST = 5, /* MAXINT_PLUS_ONE_CONST */
+ YYSYMBOL_DOUBLE_CONST = 6, /* DOUBLE_CONST */
+ YYSYMBOL_BOOLEAN_CONST = 7, /* BOOLEAN_CONST */
+ YYSYMBOL_VARIABLE = 8, /* VARIABLE */
+ YYSYMBOL_FUNCTION = 9, /* FUNCTION */
+ YYSYMBOL_AND_OP = 10, /* AND_OP */
+ YYSYMBOL_OR_OP = 11, /* OR_OP */
+ YYSYMBOL_NOT_OP = 12, /* NOT_OP */
+ YYSYMBOL_NE_OP = 13, /* NE_OP */
+ YYSYMBOL_LE_OP = 14, /* LE_OP */
+ YYSYMBOL_GE_OP = 15, /* GE_OP */
+ YYSYMBOL_LS_OP = 16, /* LS_OP */
+ YYSYMBOL_RS_OP = 17, /* RS_OP */
+ YYSYMBOL_IS_OP = 18, /* IS_OP */
+ YYSYMBOL_CASE_KW = 19, /* CASE_KW */
+ YYSYMBOL_WHEN_KW = 20, /* WHEN_KW */
+ YYSYMBOL_THEN_KW = 21, /* THEN_KW */
+ YYSYMBOL_ELSE_KW = 22, /* ELSE_KW */
+ YYSYMBOL_END_KW = 23, /* END_KW */
+ YYSYMBOL_ISNULL_OP = 24, /* ISNULL_OP */
+ YYSYMBOL_NOTNULL_OP = 25, /* NOTNULL_OP */
+ YYSYMBOL_26_ = 26, /* '<' */
+ YYSYMBOL_27_ = 27, /* '>' */
+ YYSYMBOL_28_ = 28, /* '=' */
+ YYSYMBOL_29_ = 29, /* '|' */
+ YYSYMBOL_30_ = 30, /* '#' */
+ YYSYMBOL_31_ = 31, /* '&' */
+ YYSYMBOL_32_ = 32, /* '~' */
+ YYSYMBOL_33_ = 33, /* '+' */
+ YYSYMBOL_34_ = 34, /* '-' */
+ YYSYMBOL_35_ = 35, /* '*' */
+ YYSYMBOL_36_ = 36, /* '/' */
+ YYSYMBOL_37_ = 37, /* '%' */
+ YYSYMBOL_UNARY = 38, /* UNARY */
+ YYSYMBOL_39_ = 39, /* ',' */
+ YYSYMBOL_40_ = 40, /* '(' */
+ YYSYMBOL_41_ = 41, /* ')' */
+ YYSYMBOL_YYACCEPT = 42, /* $accept */
+ YYSYMBOL_result = 43, /* result */
+ YYSYMBOL_elist = 44, /* elist */
+ YYSYMBOL_expr = 45, /* expr */
+ YYSYMBOL_when_then_list = 46, /* when_then_list */
+ YYSYMBOL_case_control = 47, /* case_control */
+ YYSYMBOL_function = 48 /* function */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ <limits.h> and (if available) <stdint.h> are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
+#endif
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
+#endif
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
+#endif
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
+
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int8 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
+#endif
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
+#endif
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 25
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 320
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 42
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 7
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 47
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 88
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 281
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int8 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 30, 2, 37, 31, 2,
+ 40, 41, 35, 33, 39, 34, 2, 36, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 26, 28, 27, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 29, 2, 32, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 38
+};
+
+#if YYDEBUG
+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_uint8 yyrline[] =
+{
+ 0, 83, 83, 88, 89, 90, 93, 94, 96, 99,
+ 102, 104, 105, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
+ 124, 125, 129, 130, 135, 139, 145, 146, 147, 148,
+ 150, 151, 152, 156, 157, 160, 161, 163
+};
+#endif
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "NULL_CONST",
+ "INTEGER_CONST", "MAXINT_PLUS_ONE_CONST", "DOUBLE_CONST",
+ "BOOLEAN_CONST", "VARIABLE", "FUNCTION", "AND_OP", "OR_OP", "NOT_OP",
+ "NE_OP", "LE_OP", "GE_OP", "LS_OP", "RS_OP", "IS_OP", "CASE_KW",
+ "WHEN_KW", "THEN_KW", "ELSE_KW", "END_KW", "ISNULL_OP", "NOTNULL_OP",
+ "'<'", "'>'", "'='", "'|'", "'#'", "'&'", "'~'", "'+'", "'-'", "'*'",
+ "'/'", "'%'", "UNARY", "','", "'('", "')'", "$accept", "result", "elist",
+ "expr", "when_then_list", "case_control", "function", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
+#endif
+
+#ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+ (internal) symbol number NUM (which must be that of a token). */
+static const yytype_int16 yytoknum[] =
+{
+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 60, 62, 61, 124,
+ 35, 38, 126, 43, 45, 42, 47, 37, 281, 44,
+ 40, 41
+};
+#endif
+
+#define YYPACT_NINF (-33)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-1)
+
+#define yytable_value_is_error(Yyn) \
+ ((Yyn) == YYTABLE_NINF)
+
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ 64, -33, -33, -33, -33, -33, -33, 64, -19, 64,
+ 64, 46, 64, 13, 205, -33, -22, 258, 64, -6,
+ 11, -33, -33, -33, 92, -33, 64, 64, 64, 64,
+ 64, 64, 64, 3, -33, -33, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 121, 64,
+ 64, -33, -33, 258, 233, 283, 283, 283, 11, 11,
+ -33, -33, 5, 283, 283, 283, 11, 11, 11, -9,
+ -9, -33, -33, -33, -32, 205, 64, 149, 177, -33,
+ -33, 64, -33, 205, 64, -33, 205, 205
+};
+
+ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int8 yydefact[] =
+{
+ 0, 36, 38, 39, 37, 40, 47, 0, 0, 0,
+ 0, 0, 0, 0, 2, 42, 0, 11, 0, 0,
+ 10, 7, 9, 8, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 30, 31, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 45, 6, 28, 29, 22, 18, 20, 26, 27,
+ 32, 34, 0, 17, 19, 21, 24, 25, 23, 12,
+ 13, 14, 15, 16, 0, 4, 0, 0, 0, 33,
+ 35, 0, 41, 44, 0, 46, 5, 43
+};
+
+ /* YYPGOTO[NTERM-NUM]. */
+static const yytype_int8 yypgoto[] =
+{
+ -33, -33, -33, -7, -33, -33, -33
+};
+
+ /* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int8 yydefgoto[] =
+{
+ 0, 13, 74, 14, 19, 15, 16
+};
+
+ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int8 yytable[] =
+{
+ 17, 18, 20, 21, 23, 24, 60, 81, 79, 82,
+ 61, 48, 80, 25, 49, 62, 50, 51, 47, 53,
+ 54, 55, 56, 57, 58, 59, 44, 45, 46, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
+ 75, 0, 77, 78, 42, 43, 44, 45, 46, 1,
+ 2, 22, 3, 4, 5, 6, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 8, 0, 1, 2, 83,
+ 3, 4, 5, 6, 86, 0, 7, 87, 9, 10,
+ 11, 0, 0, 8, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 10, 11, 0,
+ 0, 0, 26, 27, 12, 28, 29, 30, 31, 32,
+ 33, 0, 0, 0, 0, 0, 34, 35, 36, 37,
+ 38, 39, 40, 41, 0, 42, 43, 44, 45, 46,
+ 0, 26, 27, 52, 28, 29, 30, 31, 32, 33,
+ 0, 0, 76, 0, 0, 34, 35, 36, 37, 38,
+ 39, 40, 41, 0, 42, 43, 44, 45, 46, 26,
+ 27, 0, 28, 29, 30, 31, 32, 33, 0, 0,
+ 84, 0, 0, 34, 35, 36, 37, 38, 39, 40,
+ 41, 0, 42, 43, 44, 45, 46, 26, 27, 0,
+ 28, 29, 30, 31, 32, 33, 0, 0, 0, 0,
+ 85, 34, 35, 36, 37, 38, 39, 40, 41, 0,
+ 42, 43, 44, 45, 46, 26, 27, 0, 28, 29,
+ 30, 31, 32, 33, 0, 0, 0, 0, 0, 34,
+ 35, 36, 37, 38, 39, 40, 41, 0, 42, 43,
+ 44, 45, 46, 26, 0, 0, 28, 29, 30, 31,
+ 32, 33, 0, 0, 0, 0, 0, 34, 35, 36,
+ 37, 38, 39, 40, 41, 0, 42, 43, 44, 45,
+ 46, 28, 29, 30, 31, 32, 33, 0, 0, 0,
+ 0, 0, 34, 35, 36, 37, 38, 39, 40, 41,
+ 0, 42, 43, 44, 45, 46, -1, -1, -1, 31,
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, -1,
+ -1, -1, 39, 40, 41, 0, 42, 43, 44, 45,
+ 46
+};
+
+static const yytype_int8 yycheck[] =
+{
+ 7, 20, 9, 10, 11, 12, 3, 39, 3, 41,
+ 7, 18, 7, 0, 20, 12, 22, 23, 40, 26,
+ 27, 28, 29, 30, 31, 32, 35, 36, 37, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, -1, 49, 50, 33, 34, 35, 36, 37, 3,
+ 4, 5, 6, 7, 8, 9, -1, -1, 12, -1,
+ -1, -1, -1, -1, -1, 19, -1, 3, 4, 76,
+ 6, 7, 8, 9, 81, -1, 12, 84, 32, 33,
+ 34, -1, -1, 19, -1, -1, 40, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 32, 33, 34, -1,
+ -1, -1, 10, 11, 40, 13, 14, 15, 16, 17,
+ 18, -1, -1, -1, -1, -1, 24, 25, 26, 27,
+ 28, 29, 30, 31, -1, 33, 34, 35, 36, 37,
+ -1, 10, 11, 41, 13, 14, 15, 16, 17, 18,
+ -1, -1, 21, -1, -1, 24, 25, 26, 27, 28,
+ 29, 30, 31, -1, 33, 34, 35, 36, 37, 10,
+ 11, -1, 13, 14, 15, 16, 17, 18, -1, -1,
+ 21, -1, -1, 24, 25, 26, 27, 28, 29, 30,
+ 31, -1, 33, 34, 35, 36, 37, 10, 11, -1,
+ 13, 14, 15, 16, 17, 18, -1, -1, -1, -1,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, -1,
+ 33, 34, 35, 36, 37, 10, 11, -1, 13, 14,
+ 15, 16, 17, 18, -1, -1, -1, -1, -1, 24,
+ 25, 26, 27, 28, 29, 30, 31, -1, 33, 34,
+ 35, 36, 37, 10, -1, -1, 13, 14, 15, 16,
+ 17, 18, -1, -1, -1, -1, -1, 24, 25, 26,
+ 27, 28, 29, 30, 31, -1, 33, 34, 35, 36,
+ 37, 13, 14, 15, 16, 17, 18, -1, -1, -1,
+ -1, -1, 24, 25, 26, 27, 28, 29, 30, 31,
+ -1, 33, 34, 35, 36, 37, 13, 14, 15, 16,
+ 17, -1, -1, -1, -1, -1, -1, -1, -1, 26,
+ 27, 28, 29, 30, 31, -1, 33, 34, 35, 36,
+ 37
+};
+
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+ symbol of state STATE-NUM. */
+static const yytype_int8 yystos[] =
+{
+ 0, 3, 4, 6, 7, 8, 9, 12, 19, 32,
+ 33, 34, 40, 43, 45, 47, 48, 45, 20, 46,
+ 45, 45, 5, 45, 45, 0, 10, 11, 13, 14,
+ 15, 16, 17, 18, 24, 25, 26, 27, 28, 29,
+ 30, 31, 33, 34, 35, 36, 37, 40, 45, 20,
+ 22, 23, 41, 45, 45, 45, 45, 45, 45, 45,
+ 3, 7, 12, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 44, 45, 21, 45, 45, 3,
+ 7, 39, 41, 45, 21, 23, 45, 45
+};
+
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const yytype_int8 yyr1[] =
+{
+ 0, 42, 43, 44, 44, 44, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+ 45, 45, 45, 46, 46, 47, 47, 48
+};
+
+ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 1, 0, 1, 3, 3, 2, 2, 2,
+ 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 3, 4, 3, 4, 1, 1, 1, 1,
+ 1, 4, 1, 5, 4, 3, 5, 1
+};
+
+
+enum { YYENOMEM = -2 };
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (yyscanner, YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+# ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+
+
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value, yyscanner); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, yyscan_t yyscanner)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ YY_USE (yyscanner);
+ if (!yyvaluep)
+ return;
+# ifdef YYPRINT
+ if (yykind < YYNTOKENS)
+ YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
+# endif
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, yyscan_t yyscanner)
+{
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
+
+ yy_symbol_value_print (yyo, yykind, yyvaluep, yyscanner);
+ YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule, yyscan_t yyscanner)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)], yyscanner);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule, yyscanner); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep, yyscan_t yyscanner)
+{
+ YY_USE (yyvaluep);
+ YY_USE (yyscanner);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (yyscan_t yyscanner)
+{
+/* Lookahead token kind. */
+int yychar;
+
+
+/* The semantic value of the lookahead symbol. */
+/* Default value used for initialization, for pacifying older GCCs
+ or non-GCC compilers. */
+YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
+YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
+
+ /* Number of syntax errors so far. */
+ int yynerrs = 0;
+
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
+
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ goto yyexhaustedlab;
+#else
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ goto yyexhaustedlab;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ goto yyexhaustedlab;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+ if (yystate == YYFINAL)
+ YYACCEPT;
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
+
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex (&yylval, yyscanner);
+ }
+
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
+
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 2: /* result: expr */
+#line 83 "exprparse.y"
+ {
+ expr_parse_result = (yyvsp[0].expr);
+ (void) yynerrs; /* suppress compiler warning */
+ }
+#line 1268 "exprparse.c"
+ break;
+
+ case 3: /* elist: %empty */
+#line 88 "exprparse.y"
+ { (yyval.elist) = NULL; }
+#line 1274 "exprparse.c"
+ break;
+
+ case 4: /* elist: expr */
+#line 89 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), NULL); }
+#line 1280 "exprparse.c"
+ break;
+
+ case 5: /* elist: elist ',' expr */
+#line 90 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), (yyvsp[-2].elist)); }
+#line 1286 "exprparse.c"
+ break;
+
+ case 6: /* expr: '(' expr ')' */
+#line 93 "exprparse.y"
+ { (yyval.expr) = (yyvsp[-1].expr); }
+#line 1292 "exprparse.c"
+ break;
+
+ case 7: /* expr: '+' expr */
+#line 94 "exprparse.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1298 "exprparse.c"
+ break;
+
+ case 8: /* expr: '-' expr */
+#line 96 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "-",
+ make_integer_constant(0), (yyvsp[0].expr)); }
+#line 1305 "exprparse.c"
+ break;
+
+ case 9: /* expr: '-' MAXINT_PLUS_ONE_CONST */
+#line 100 "exprparse.y"
+ { (yyval.expr) = make_integer_constant(PG_INT64_MIN); }
+#line 1311 "exprparse.c"
+ break;
+
+ case 10: /* expr: '~' expr */
+#line 102 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "#",
+ make_integer_constant(~INT64CONST(0)), (yyvsp[0].expr)); }
+#line 1318 "exprparse.c"
+ break;
+
+ case 11: /* expr: NOT_OP expr */
+#line 104 "exprparse.y"
+ { (yyval.expr) = make_uop(yyscanner, "!not", (yyvsp[0].expr)); }
+#line 1324 "exprparse.c"
+ break;
+
+ case 12: /* expr: expr '+' expr */
+#line 105 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "+", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1330 "exprparse.c"
+ break;
+
+ case 13: /* expr: expr '-' expr */
+#line 106 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "-", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1336 "exprparse.c"
+ break;
+
+ case 14: /* expr: expr '*' expr */
+#line 107 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "*", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1342 "exprparse.c"
+ break;
+
+ case 15: /* expr: expr '/' expr */
+#line 108 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "/", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1348 "exprparse.c"
+ break;
+
+ case 16: /* expr: expr '%' expr */
+#line 109 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "mod", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1354 "exprparse.c"
+ break;
+
+ case 17: /* expr: expr '<' expr */
+#line 110 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1360 "exprparse.c"
+ break;
+
+ case 18: /* expr: expr LE_OP expr */
+#line 111 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<=", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1366 "exprparse.c"
+ break;
+
+ case 19: /* expr: expr '>' expr */
+#line 112 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<", (yyvsp[0].expr), (yyvsp[-2].expr)); }
+#line 1372 "exprparse.c"
+ break;
+
+ case 20: /* expr: expr GE_OP expr */
+#line 113 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<=", (yyvsp[0].expr), (yyvsp[-2].expr)); }
+#line 1378 "exprparse.c"
+ break;
+
+ case 21: /* expr: expr '=' expr */
+#line 114 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "=", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1384 "exprparse.c"
+ break;
+
+ case 22: /* expr: expr NE_OP expr */
+#line 115 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<>", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1390 "exprparse.c"
+ break;
+
+ case 23: /* expr: expr '&' expr */
+#line 116 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "&", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1396 "exprparse.c"
+ break;
+
+ case 24: /* expr: expr '|' expr */
+#line 117 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "|", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1402 "exprparse.c"
+ break;
+
+ case 25: /* expr: expr '#' expr */
+#line 118 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "#", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1408 "exprparse.c"
+ break;
+
+ case 26: /* expr: expr LS_OP expr */
+#line 119 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "<<", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1414 "exprparse.c"
+ break;
+
+ case 27: /* expr: expr RS_OP expr */
+#line 120 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, ">>", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1420 "exprparse.c"
+ break;
+
+ case 28: /* expr: expr AND_OP expr */
+#line 121 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!and", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1426 "exprparse.c"
+ break;
+
+ case 29: /* expr: expr OR_OP expr */
+#line 122 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!or", (yyvsp[-2].expr), (yyvsp[0].expr)); }
+#line 1432 "exprparse.c"
+ break;
+
+ case 30: /* expr: expr ISNULL_OP */
+#line 124 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!is", (yyvsp[-1].expr), make_null_constant()); }
+#line 1438 "exprparse.c"
+ break;
+
+ case 31: /* expr: expr NOTNULL_OP */
+#line 125 "exprparse.y"
+ {
+ (yyval.expr) = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", (yyvsp[-1].expr), make_null_constant()));
+ }
+#line 1447 "exprparse.c"
+ break;
+
+ case 32: /* expr: expr IS_OP NULL_CONST */
+#line 129 "exprparse.y"
+ { (yyval.expr) = make_op(yyscanner, "!is", (yyvsp[-2].expr), make_null_constant()); }
+#line 1453 "exprparse.c"
+ break;
+
+ case 33: /* expr: expr IS_OP NOT_OP NULL_CONST */
+#line 131 "exprparse.y"
+ {
+ (yyval.expr) = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", (yyvsp[-3].expr), make_null_constant()));
+ }
+#line 1462 "exprparse.c"
+ break;
+
+ case 34: /* expr: expr IS_OP BOOLEAN_CONST */
+#line 136 "exprparse.y"
+ {
+ (yyval.expr) = make_op(yyscanner, "!is", (yyvsp[-2].expr), make_boolean_constant((yyvsp[0].bval)));
+ }
+#line 1470 "exprparse.c"
+ break;
+
+ case 35: /* expr: expr IS_OP NOT_OP BOOLEAN_CONST */
+#line 140 "exprparse.y"
+ {
+ (yyval.expr) = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", (yyvsp[-3].expr), make_boolean_constant((yyvsp[0].bval))));
+ }
+#line 1479 "exprparse.c"
+ break;
+
+ case 36: /* expr: NULL_CONST */
+#line 145 "exprparse.y"
+ { (yyval.expr) = make_null_constant(); }
+#line 1485 "exprparse.c"
+ break;
+
+ case 37: /* expr: BOOLEAN_CONST */
+#line 146 "exprparse.y"
+ { (yyval.expr) = make_boolean_constant((yyvsp[0].bval)); }
+#line 1491 "exprparse.c"
+ break;
+
+ case 38: /* expr: INTEGER_CONST */
+#line 147 "exprparse.y"
+ { (yyval.expr) = make_integer_constant((yyvsp[0].ival)); }
+#line 1497 "exprparse.c"
+ break;
+
+ case 39: /* expr: DOUBLE_CONST */
+#line 148 "exprparse.y"
+ { (yyval.expr) = make_double_constant((yyvsp[0].dval)); }
+#line 1503 "exprparse.c"
+ break;
+
+ case 40: /* expr: VARIABLE */
+#line 150 "exprparse.y"
+ { (yyval.expr) = make_variable((yyvsp[0].str)); }
+#line 1509 "exprparse.c"
+ break;
+
+ case 41: /* expr: function '(' elist ')' */
+#line 151 "exprparse.y"
+ { (yyval.expr) = make_func(yyscanner, (yyvsp[-3].ival), (yyvsp[-1].elist)); }
+#line 1515 "exprparse.c"
+ break;
+
+ case 42: /* expr: case_control */
+#line 152 "exprparse.y"
+ { (yyval.expr) = (yyvsp[0].expr); }
+#line 1521 "exprparse.c"
+ break;
+
+ case 43: /* when_then_list: when_then_list WHEN_KW expr THEN_KW expr */
+#line 156 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), make_elist((yyvsp[-2].expr), (yyvsp[-4].elist))); }
+#line 1527 "exprparse.c"
+ break;
+
+ case 44: /* when_then_list: WHEN_KW expr THEN_KW expr */
+#line 157 "exprparse.y"
+ { (yyval.elist) = make_elist((yyvsp[0].expr), make_elist((yyvsp[-2].expr), NULL)); }
+#line 1533 "exprparse.c"
+ break;
+
+ case 45: /* case_control: CASE_KW when_then_list END_KW */
+#line 160 "exprparse.y"
+ { (yyval.expr) = make_case(yyscanner, (yyvsp[-1].elist), make_null_constant()); }
+#line 1539 "exprparse.c"
+ break;
+
+ case 46: /* case_control: CASE_KW when_then_list ELSE_KW expr END_KW */
+#line 161 "exprparse.y"
+ { (yyval.expr) = make_case(yyscanner, (yyvsp[-3].elist), (yyvsp[-1].expr)); }
+#line 1545 "exprparse.c"
+ break;
+
+ case 47: /* function: FUNCTION */
+#line 163 "exprparse.y"
+ { (yyval.ival) = find_func(yyscanner, (yyvsp[0].str)); pg_free((yyvsp[0].str)); }
+#line 1551 "exprparse.c"
+ break;
+
+
+#line 1555 "exprparse.c"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (yyscanner, YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval, yyscanner);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp, yyscanner);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+
+#if !defined yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here. |
+`-------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (yyscanner, YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturn;
+#endif
+
+
+/*-------------------------------------------------------.
+| yyreturn -- parsing is finished, clean up and return. |
+`-------------------------------------------------------*/
+yyreturn:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval, yyscanner);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yyscanner);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+
+ return yyresult;
+}
+
+#line 166 "exprparse.y"
+
+
+static PgBenchExpr *
+make_null_constant(void)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_NULL;
+ expr->u.constant.u.ival = 0;
+ return expr;
+}
+
+static PgBenchExpr *
+make_integer_constant(int64 ival)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_INT;
+ expr->u.constant.u.ival = ival;
+ return expr;
+}
+
+static PgBenchExpr *
+make_double_constant(double dval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_DOUBLE;
+ expr->u.constant.u.dval = dval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_boolean_constant(bool bval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_BOOLEAN;
+ expr->u.constant.u.bval = bval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_variable(char *varname)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_VARIABLE;
+ expr->u.variable.varname = varname;
+ return expr;
+}
+
+/* binary operators */
+static PgBenchExpr *
+make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator),
+ make_elist(rexpr, make_elist(lexpr, NULL)));
+}
+
+/* unary operator */
+static PgBenchExpr *
+make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator), make_elist(expr, NULL));
+}
+
+/*
+ * List of available functions:
+ * - fname: function name, "!..." for special internal functions
+ * - nargs: number of arguments. Special cases:
+ * - PGBENCH_NARGS_VARIABLE is a special value for least & greatest
+ * meaning #args >= 1;
+ * - PGBENCH_NARGS_CASE is for the "CASE WHEN ..." function, which
+ * has #args >= 3 and odd;
+ * - PGBENCH_NARGS_HASH is for hash functions, which have one required
+ * and one optional argument;
+ * - tag: function identifier from PgBenchFunction enum
+ */
+static const struct
+{
+ const char *fname;
+ int nargs;
+ PgBenchFunction tag;
+} PGBENCH_FUNCTIONS[] =
+{
+ /* parsed as operators, executed as functions */
+ {
+ "+", 2, PGBENCH_ADD
+ },
+ {
+ "-", 2, PGBENCH_SUB
+ },
+ {
+ "*", 2, PGBENCH_MUL
+ },
+ {
+ "/", 2, PGBENCH_DIV
+ },
+ {
+ "mod", 2, PGBENCH_MOD
+ },
+ /* actual functions */
+ {
+ "abs", 1, PGBENCH_ABS
+ },
+ {
+ "least", PGBENCH_NARGS_VARIABLE, PGBENCH_LEAST
+ },
+ {
+ "greatest", PGBENCH_NARGS_VARIABLE, PGBENCH_GREATEST
+ },
+ {
+ "debug", 1, PGBENCH_DEBUG
+ },
+ {
+ "pi", 0, PGBENCH_PI
+ },
+ {
+ "sqrt", 1, PGBENCH_SQRT
+ },
+ {
+ "ln", 1, PGBENCH_LN
+ },
+ {
+ "exp", 1, PGBENCH_EXP
+ },
+ {
+ "int", 1, PGBENCH_INT
+ },
+ {
+ "double", 1, PGBENCH_DOUBLE
+ },
+ {
+ "random", 2, PGBENCH_RANDOM
+ },
+ {
+ "random_gaussian", 3, PGBENCH_RANDOM_GAUSSIAN
+ },
+ {
+ "random_exponential", 3, PGBENCH_RANDOM_EXPONENTIAL
+ },
+ {
+ "random_zipfian", 3, PGBENCH_RANDOM_ZIPFIAN
+ },
+ {
+ "pow", 2, PGBENCH_POW
+ },
+ {
+ "power", 2, PGBENCH_POW
+ },
+ /* logical operators */
+ {
+ "!and", 2, PGBENCH_AND
+ },
+ {
+ "!or", 2, PGBENCH_OR
+ },
+ {
+ "!not", 1, PGBENCH_NOT
+ },
+ /* bitwise integer operators */
+ {
+ "&", 2, PGBENCH_BITAND
+ },
+ {
+ "|", 2, PGBENCH_BITOR
+ },
+ {
+ "#", 2, PGBENCH_BITXOR
+ },
+ {
+ "<<", 2, PGBENCH_LSHIFT
+ },
+ {
+ ">>", 2, PGBENCH_RSHIFT
+ },
+ /* comparison operators */
+ {
+ "=", 2, PGBENCH_EQ
+ },
+ {
+ "<>", 2, PGBENCH_NE
+ },
+ {
+ "<=", 2, PGBENCH_LE
+ },
+ {
+ "<", 2, PGBENCH_LT
+ },
+ {
+ "!is", 2, PGBENCH_IS
+ },
+ /* "case when ... then ... else ... end" construction */
+ {
+ "!case_end", PGBENCH_NARGS_CASE, PGBENCH_CASE
+ },
+ {
+ "hash", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_murmur2", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_fnv1a", PGBENCH_NARGS_HASH, PGBENCH_HASH_FNV1A
+ },
+ {
+ "permute", PGBENCH_NARGS_PERMUTE, PGBENCH_PERMUTE
+ },
+ /* keep as last array element */
+ {
+ NULL, 0, 0
+ }
+};
+
+/*
+ * Find a function from its name
+ *
+ * return the index of the function from the PGBENCH_FUNCTIONS array
+ * or fail if the function is unknown.
+ */
+static int
+find_func(yyscan_t yyscanner, const char *fname)
+{
+ int i = 0;
+
+ while (PGBENCH_FUNCTIONS[i].fname)
+ {
+ if (pg_strcasecmp(fname, PGBENCH_FUNCTIONS[i].fname) == 0)
+ return i;
+ i++;
+ }
+
+ expr_yyerror_more(yyscanner, "unexpected function name", fname);
+
+ /* not reached */
+ return -1;
+}
+
+/* Expression linked list builder */
+static PgBenchExprList *
+make_elist(PgBenchExpr *expr, PgBenchExprList *list)
+{
+ PgBenchExprLink *cons;
+
+ if (list == NULL)
+ {
+ list = pg_malloc(sizeof(PgBenchExprList));
+ list->head = NULL;
+ list->tail = NULL;
+ }
+
+ cons = pg_malloc(sizeof(PgBenchExprLink));
+ cons->expr = expr;
+ cons->next = NULL;
+
+ if (list->head == NULL)
+ list->head = cons;
+ else
+ list->tail->next = cons;
+
+ list->tail = cons;
+
+ return list;
+}
+
+/* Return the length of an expression list */
+static int
+elist_length(PgBenchExprList *list)
+{
+ PgBenchExprLink *link = list != NULL ? list->head : NULL;
+ int len = 0;
+
+ for (; link != NULL; link = link->next)
+ len++;
+
+ return len;
+}
+
+/* Build function call expression */
+static PgBenchExpr *
+make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args)
+{
+ int len = elist_length(args);
+
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ Assert(fnumber >= 0);
+
+ /* validate arguments number including few special cases */
+ switch (PGBENCH_FUNCTIONS[fnumber].nargs)
+ {
+ /* check at least one arg for least & greatest */
+ case PGBENCH_NARGS_VARIABLE:
+ if (len == 0)
+ expr_yyerror_more(yyscanner, "at least one argument expected",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ break;
+
+ /* case (when ... then ...)+ (else ...)? end */
+ case PGBENCH_NARGS_CASE:
+ /* 'else' branch is always present, but could be a NULL-constant */
+ if (len < 3 || len % 2 != 1)
+ expr_yyerror_more(yyscanner,
+ "odd and >= 3 number of arguments expected",
+ "case control structure");
+ break;
+
+ /* hash functions with optional seed argument */
+ case PGBENCH_NARGS_HASH:
+ if (len < 1 || len > 2)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 1)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* pseudorandom permutation function with optional seed argument */
+ case PGBENCH_NARGS_PERMUTE:
+ if (len < 2 || len > 3)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 2)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* common case: positive arguments number */
+ default:
+ Assert(PGBENCH_FUNCTIONS[fnumber].nargs >= 0);
+
+ if (PGBENCH_FUNCTIONS[fnumber].nargs != len)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ }
+
+ expr->etype = ENODE_FUNCTION;
+ expr->u.function.function = PGBENCH_FUNCTIONS[fnumber].tag;
+
+ /* only the link is used, the head/tail is not useful anymore */
+ expr->u.function.args = args != NULL ? args->head : NULL;
+ if (args)
+ pg_free(args);
+
+ return expr;
+}
+
+static PgBenchExpr *
+make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part)
+{
+ return make_func(yyscanner,
+ find_func(yyscanner, "!case_end"),
+ make_elist(else_part, when_then_list));
+}
diff --git a/src/bin/pgbench/exprparse.h b/src/bin/pgbench/exprparse.h
new file mode 100644
index 0000000..16acc84
--- /dev/null
+++ b/src/bin/pgbench/exprparse.h
@@ -0,0 +1,110 @@
+/* A Bison parser, made by GNU Bison 3.7.5. */
+
+/* Bison interface for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+#ifndef YY_EXPR_YY_EXPRPARSE_H_INCLUDED
+# define YY_EXPR_YY_EXPRPARSE_H_INCLUDED
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int expr_yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ NULL_CONST = 258, /* NULL_CONST */
+ INTEGER_CONST = 259, /* INTEGER_CONST */
+ MAXINT_PLUS_ONE_CONST = 260, /* MAXINT_PLUS_ONE_CONST */
+ DOUBLE_CONST = 261, /* DOUBLE_CONST */
+ BOOLEAN_CONST = 262, /* BOOLEAN_CONST */
+ VARIABLE = 263, /* VARIABLE */
+ FUNCTION = 264, /* FUNCTION */
+ AND_OP = 265, /* AND_OP */
+ OR_OP = 266, /* OR_OP */
+ NOT_OP = 267, /* NOT_OP */
+ NE_OP = 268, /* NE_OP */
+ LE_OP = 269, /* LE_OP */
+ GE_OP = 270, /* GE_OP */
+ LS_OP = 271, /* LS_OP */
+ RS_OP = 272, /* RS_OP */
+ IS_OP = 273, /* IS_OP */
+ CASE_KW = 274, /* CASE_KW */
+ WHEN_KW = 275, /* WHEN_KW */
+ THEN_KW = 276, /* THEN_KW */
+ ELSE_KW = 277, /* ELSE_KW */
+ END_KW = 278, /* END_KW */
+ ISNULL_OP = 279, /* ISNULL_OP */
+ NOTNULL_OP = 280, /* NOTNULL_OP */
+ UNARY = 281 /* UNARY */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
+#line 49 "exprparse.y"
+
+ int64 ival;
+ double dval;
+ bool bval;
+ char *str;
+ PgBenchExpr *expr;
+ PgBenchExprList *elist;
+
+#line 99 "exprparse.h"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+int expr_yyparse (yyscan_t yyscanner);
+
+#endif /* !YY_EXPR_YY_EXPRPARSE_H_INCLUDED */
diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y
new file mode 100644
index 0000000..6cb063c
--- /dev/null
+++ b/src/bin/pgbench/exprparse.y
@@ -0,0 +1,531 @@
+%{
+/*-------------------------------------------------------------------------
+ *
+ * exprparse.y
+ * bison grammar for a simple expression syntax
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprparse.y
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "pgbench.h"
+
+#define PGBENCH_NARGS_VARIABLE (-1)
+#define PGBENCH_NARGS_CASE (-2)
+#define PGBENCH_NARGS_HASH (-3)
+#define PGBENCH_NARGS_PERMUTE (-4)
+
+PgBenchExpr *expr_parse_result;
+
+static PgBenchExprList *make_elist(PgBenchExpr *expr, PgBenchExprList *list);
+static PgBenchExpr *make_null_constant(void);
+static PgBenchExpr *make_boolean_constant(bool bval);
+static PgBenchExpr *make_integer_constant(int64 ival);
+static PgBenchExpr *make_double_constant(double dval);
+static PgBenchExpr *make_variable(char *varname);
+static PgBenchExpr *make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr);
+static PgBenchExpr *make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr);
+static int find_func(yyscan_t yyscanner, const char *fname);
+static PgBenchExpr *make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args);
+static PgBenchExpr *make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part);
+
+%}
+
+%pure-parser
+%expect 0
+%name-prefix="expr_yy"
+
+%parse-param {yyscan_t yyscanner}
+%lex-param {yyscan_t yyscanner}
+
+%union
+{
+ int64 ival;
+ double dval;
+ bool bval;
+ char *str;
+ PgBenchExpr *expr;
+ PgBenchExprList *elist;
+}
+
+%type <elist> elist when_then_list
+%type <expr> expr case_control
+%type <ival> INTEGER_CONST function
+%type <dval> DOUBLE_CONST
+%type <bval> BOOLEAN_CONST
+%type <str> VARIABLE FUNCTION
+
+%token NULL_CONST INTEGER_CONST MAXINT_PLUS_ONE_CONST DOUBLE_CONST
+%token BOOLEAN_CONST VARIABLE FUNCTION
+%token AND_OP OR_OP NOT_OP NE_OP LE_OP GE_OP LS_OP RS_OP IS_OP
+%token CASE_KW WHEN_KW THEN_KW ELSE_KW END_KW
+
+/* Precedence: lowest to highest, taken from postgres SQL parser */
+%left OR_OP
+%left AND_OP
+%right NOT_OP
+%nonassoc IS_OP ISNULL_OP NOTNULL_OP
+%nonassoc '<' '>' '=' LE_OP GE_OP NE_OP
+%left '|' '#' '&' LS_OP RS_OP '~'
+%left '+' '-'
+%left '*' '/' '%'
+%right UNARY
+
+%%
+
+result: expr {
+ expr_parse_result = $1;
+ (void) yynerrs; /* suppress compiler warning */
+ }
+
+elist: { $$ = NULL; }
+ | expr { $$ = make_elist($1, NULL); }
+ | elist ',' expr { $$ = make_elist($3, $1); }
+ ;
+
+expr: '(' expr ')' { $$ = $2; }
+ | '+' expr %prec UNARY { $$ = $2; }
+ /* unary minus "-x" implemented as "0 - x" */
+ | '-' expr %prec UNARY { $$ = make_op(yyscanner, "-",
+ make_integer_constant(0), $2); }
+ /* special PG_INT64_MIN handling, only after a unary minus */
+ | '-' MAXINT_PLUS_ONE_CONST %prec UNARY
+ { $$ = make_integer_constant(PG_INT64_MIN); }
+ /* binary ones complement "~x" implemented as 0xffff... xor x" */
+ | '~' expr { $$ = make_op(yyscanner, "#",
+ make_integer_constant(~INT64CONST(0)), $2); }
+ | NOT_OP expr { $$ = make_uop(yyscanner, "!not", $2); }
+ | expr '+' expr { $$ = make_op(yyscanner, "+", $1, $3); }
+ | expr '-' expr { $$ = make_op(yyscanner, "-", $1, $3); }
+ | expr '*' expr { $$ = make_op(yyscanner, "*", $1, $3); }
+ | expr '/' expr { $$ = make_op(yyscanner, "/", $1, $3); }
+ | expr '%' expr { $$ = make_op(yyscanner, "mod", $1, $3); }
+ | expr '<' expr { $$ = make_op(yyscanner, "<", $1, $3); }
+ | expr LE_OP expr { $$ = make_op(yyscanner, "<=", $1, $3); }
+ | expr '>' expr { $$ = make_op(yyscanner, "<", $3, $1); }
+ | expr GE_OP expr { $$ = make_op(yyscanner, "<=", $3, $1); }
+ | expr '=' expr { $$ = make_op(yyscanner, "=", $1, $3); }
+ | expr NE_OP expr { $$ = make_op(yyscanner, "<>", $1, $3); }
+ | expr '&' expr { $$ = make_op(yyscanner, "&", $1, $3); }
+ | expr '|' expr { $$ = make_op(yyscanner, "|", $1, $3); }
+ | expr '#' expr { $$ = make_op(yyscanner, "#", $1, $3); }
+ | expr LS_OP expr { $$ = make_op(yyscanner, "<<", $1, $3); }
+ | expr RS_OP expr { $$ = make_op(yyscanner, ">>", $1, $3); }
+ | expr AND_OP expr { $$ = make_op(yyscanner, "!and", $1, $3); }
+ | expr OR_OP expr { $$ = make_op(yyscanner, "!or", $1, $3); }
+ /* IS variants */
+ | expr ISNULL_OP { $$ = make_op(yyscanner, "!is", $1, make_null_constant()); }
+ | expr NOTNULL_OP {
+ $$ = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", $1, make_null_constant()));
+ }
+ | expr IS_OP NULL_CONST { $$ = make_op(yyscanner, "!is", $1, make_null_constant()); }
+ | expr IS_OP NOT_OP NULL_CONST
+ {
+ $$ = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", $1, make_null_constant()));
+ }
+ | expr IS_OP BOOLEAN_CONST
+ {
+ $$ = make_op(yyscanner, "!is", $1, make_boolean_constant($3));
+ }
+ | expr IS_OP NOT_OP BOOLEAN_CONST
+ {
+ $$ = make_uop(yyscanner, "!not",
+ make_op(yyscanner, "!is", $1, make_boolean_constant($4)));
+ }
+ /* constants */
+ | NULL_CONST { $$ = make_null_constant(); }
+ | BOOLEAN_CONST { $$ = make_boolean_constant($1); }
+ | INTEGER_CONST { $$ = make_integer_constant($1); }
+ | DOUBLE_CONST { $$ = make_double_constant($1); }
+ /* misc */
+ | VARIABLE { $$ = make_variable($1); }
+ | function '(' elist ')' { $$ = make_func(yyscanner, $1, $3); }
+ | case_control { $$ = $1; }
+ ;
+
+when_then_list:
+ when_then_list WHEN_KW expr THEN_KW expr { $$ = make_elist($5, make_elist($3, $1)); }
+ | WHEN_KW expr THEN_KW expr { $$ = make_elist($4, make_elist($2, NULL)); }
+
+case_control:
+ CASE_KW when_then_list END_KW { $$ = make_case(yyscanner, $2, make_null_constant()); }
+ | CASE_KW when_then_list ELSE_KW expr END_KW { $$ = make_case(yyscanner, $2, $4); }
+
+function: FUNCTION { $$ = find_func(yyscanner, $1); pg_free($1); }
+ ;
+
+%%
+
+static PgBenchExpr *
+make_null_constant(void)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_NULL;
+ expr->u.constant.u.ival = 0;
+ return expr;
+}
+
+static PgBenchExpr *
+make_integer_constant(int64 ival)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_INT;
+ expr->u.constant.u.ival = ival;
+ return expr;
+}
+
+static PgBenchExpr *
+make_double_constant(double dval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_DOUBLE;
+ expr->u.constant.u.dval = dval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_boolean_constant(bool bval)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_CONSTANT;
+ expr->u.constant.type = PGBT_BOOLEAN;
+ expr->u.constant.u.bval = bval;
+ return expr;
+}
+
+static PgBenchExpr *
+make_variable(char *varname)
+{
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ expr->etype = ENODE_VARIABLE;
+ expr->u.variable.varname = varname;
+ return expr;
+}
+
+/* binary operators */
+static PgBenchExpr *
+make_op(yyscan_t yyscanner, const char *operator,
+ PgBenchExpr *lexpr, PgBenchExpr *rexpr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator),
+ make_elist(rexpr, make_elist(lexpr, NULL)));
+}
+
+/* unary operator */
+static PgBenchExpr *
+make_uop(yyscan_t yyscanner, const char *operator, PgBenchExpr *expr)
+{
+ return make_func(yyscanner, find_func(yyscanner, operator), make_elist(expr, NULL));
+}
+
+/*
+ * List of available functions:
+ * - fname: function name, "!..." for special internal functions
+ * - nargs: number of arguments. Special cases:
+ * - PGBENCH_NARGS_VARIABLE is a special value for least & greatest
+ * meaning #args >= 1;
+ * - PGBENCH_NARGS_CASE is for the "CASE WHEN ..." function, which
+ * has #args >= 3 and odd;
+ * - PGBENCH_NARGS_HASH is for hash functions, which have one required
+ * and one optional argument;
+ * - tag: function identifier from PgBenchFunction enum
+ */
+static const struct
+{
+ const char *fname;
+ int nargs;
+ PgBenchFunction tag;
+} PGBENCH_FUNCTIONS[] =
+{
+ /* parsed as operators, executed as functions */
+ {
+ "+", 2, PGBENCH_ADD
+ },
+ {
+ "-", 2, PGBENCH_SUB
+ },
+ {
+ "*", 2, PGBENCH_MUL
+ },
+ {
+ "/", 2, PGBENCH_DIV
+ },
+ {
+ "mod", 2, PGBENCH_MOD
+ },
+ /* actual functions */
+ {
+ "abs", 1, PGBENCH_ABS
+ },
+ {
+ "least", PGBENCH_NARGS_VARIABLE, PGBENCH_LEAST
+ },
+ {
+ "greatest", PGBENCH_NARGS_VARIABLE, PGBENCH_GREATEST
+ },
+ {
+ "debug", 1, PGBENCH_DEBUG
+ },
+ {
+ "pi", 0, PGBENCH_PI
+ },
+ {
+ "sqrt", 1, PGBENCH_SQRT
+ },
+ {
+ "ln", 1, PGBENCH_LN
+ },
+ {
+ "exp", 1, PGBENCH_EXP
+ },
+ {
+ "int", 1, PGBENCH_INT
+ },
+ {
+ "double", 1, PGBENCH_DOUBLE
+ },
+ {
+ "random", 2, PGBENCH_RANDOM
+ },
+ {
+ "random_gaussian", 3, PGBENCH_RANDOM_GAUSSIAN
+ },
+ {
+ "random_exponential", 3, PGBENCH_RANDOM_EXPONENTIAL
+ },
+ {
+ "random_zipfian", 3, PGBENCH_RANDOM_ZIPFIAN
+ },
+ {
+ "pow", 2, PGBENCH_POW
+ },
+ {
+ "power", 2, PGBENCH_POW
+ },
+ /* logical operators */
+ {
+ "!and", 2, PGBENCH_AND
+ },
+ {
+ "!or", 2, PGBENCH_OR
+ },
+ {
+ "!not", 1, PGBENCH_NOT
+ },
+ /* bitwise integer operators */
+ {
+ "&", 2, PGBENCH_BITAND
+ },
+ {
+ "|", 2, PGBENCH_BITOR
+ },
+ {
+ "#", 2, PGBENCH_BITXOR
+ },
+ {
+ "<<", 2, PGBENCH_LSHIFT
+ },
+ {
+ ">>", 2, PGBENCH_RSHIFT
+ },
+ /* comparison operators */
+ {
+ "=", 2, PGBENCH_EQ
+ },
+ {
+ "<>", 2, PGBENCH_NE
+ },
+ {
+ "<=", 2, PGBENCH_LE
+ },
+ {
+ "<", 2, PGBENCH_LT
+ },
+ {
+ "!is", 2, PGBENCH_IS
+ },
+ /* "case when ... then ... else ... end" construction */
+ {
+ "!case_end", PGBENCH_NARGS_CASE, PGBENCH_CASE
+ },
+ {
+ "hash", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_murmur2", PGBENCH_NARGS_HASH, PGBENCH_HASH_MURMUR2
+ },
+ {
+ "hash_fnv1a", PGBENCH_NARGS_HASH, PGBENCH_HASH_FNV1A
+ },
+ {
+ "permute", PGBENCH_NARGS_PERMUTE, PGBENCH_PERMUTE
+ },
+ /* keep as last array element */
+ {
+ NULL, 0, 0
+ }
+};
+
+/*
+ * Find a function from its name
+ *
+ * return the index of the function from the PGBENCH_FUNCTIONS array
+ * or fail if the function is unknown.
+ */
+static int
+find_func(yyscan_t yyscanner, const char *fname)
+{
+ int i = 0;
+
+ while (PGBENCH_FUNCTIONS[i].fname)
+ {
+ if (pg_strcasecmp(fname, PGBENCH_FUNCTIONS[i].fname) == 0)
+ return i;
+ i++;
+ }
+
+ expr_yyerror_more(yyscanner, "unexpected function name", fname);
+
+ /* not reached */
+ return -1;
+}
+
+/* Expression linked list builder */
+static PgBenchExprList *
+make_elist(PgBenchExpr *expr, PgBenchExprList *list)
+{
+ PgBenchExprLink *cons;
+
+ if (list == NULL)
+ {
+ list = pg_malloc(sizeof(PgBenchExprList));
+ list->head = NULL;
+ list->tail = NULL;
+ }
+
+ cons = pg_malloc(sizeof(PgBenchExprLink));
+ cons->expr = expr;
+ cons->next = NULL;
+
+ if (list->head == NULL)
+ list->head = cons;
+ else
+ list->tail->next = cons;
+
+ list->tail = cons;
+
+ return list;
+}
+
+/* Return the length of an expression list */
+static int
+elist_length(PgBenchExprList *list)
+{
+ PgBenchExprLink *link = list != NULL ? list->head : NULL;
+ int len = 0;
+
+ for (; link != NULL; link = link->next)
+ len++;
+
+ return len;
+}
+
+/* Build function call expression */
+static PgBenchExpr *
+make_func(yyscan_t yyscanner, int fnumber, PgBenchExprList *args)
+{
+ int len = elist_length(args);
+
+ PgBenchExpr *expr = pg_malloc(sizeof(PgBenchExpr));
+
+ Assert(fnumber >= 0);
+
+ /* validate arguments number including few special cases */
+ switch (PGBENCH_FUNCTIONS[fnumber].nargs)
+ {
+ /* check at least one arg for least & greatest */
+ case PGBENCH_NARGS_VARIABLE:
+ if (len == 0)
+ expr_yyerror_more(yyscanner, "at least one argument expected",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ break;
+
+ /* case (when ... then ...)+ (else ...)? end */
+ case PGBENCH_NARGS_CASE:
+ /* 'else' branch is always present, but could be a NULL-constant */
+ if (len < 3 || len % 2 != 1)
+ expr_yyerror_more(yyscanner,
+ "odd and >= 3 number of arguments expected",
+ "case control structure");
+ break;
+
+ /* hash functions with optional seed argument */
+ case PGBENCH_NARGS_HASH:
+ if (len < 1 || len > 2)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 1)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* pseudorandom permutation function with optional seed argument */
+ case PGBENCH_NARGS_PERMUTE:
+ if (len < 2 || len > 3)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+
+ if (len == 2)
+ {
+ PgBenchExpr *var = make_variable("default_seed");
+ args = make_elist(var, args);
+ }
+ break;
+
+ /* common case: positive arguments number */
+ default:
+ Assert(PGBENCH_FUNCTIONS[fnumber].nargs >= 0);
+
+ if (PGBENCH_FUNCTIONS[fnumber].nargs != len)
+ expr_yyerror_more(yyscanner, "unexpected number of arguments",
+ PGBENCH_FUNCTIONS[fnumber].fname);
+ }
+
+ expr->etype = ENODE_FUNCTION;
+ expr->u.function.function = PGBENCH_FUNCTIONS[fnumber].tag;
+
+ /* only the link is used, the head/tail is not useful anymore */
+ expr->u.function.args = args != NULL ? args->head : NULL;
+ if (args)
+ pg_free(args);
+
+ return expr;
+}
+
+static PgBenchExpr *
+make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else_part)
+{
+ return make_func(yyscanner,
+ find_func(yyscanner, "!case_end"),
+ make_elist(else_part, when_then_list));
+}
diff --git a/src/bin/pgbench/exprscan.c b/src/bin/pgbench/exprscan.c
new file mode 100644
index 0000000..44bc0ec
--- /dev/null
+++ b/src/bin/pgbench/exprscan.c
@@ -0,0 +1,2843 @@
+#line 2 "exprscan.c"
+/*-------------------------------------------------------------------------
+ *
+ * exprscan.l
+ * lexical scanner for pgbench backslash commands
+ *
+ * This lexer supports two operating modes:
+ *
+ * In INITIAL state, just parse off whitespace-separated words (this mode
+ * is basically equivalent to strtok(), which is what we used to use).
+ *
+ * In EXPR state, lex for the simple expression syntax of exprparse.y.
+ *
+ * In either mode, stop upon hitting newline or end of string.
+ *
+ * Note that this lexer operates within the framework created by psqlscan.l,
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprscan.l
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+/*
+ * NB: include exprparse.h only AFTER including pgbench.h, because pgbench.h
+ * contains definitions needed for YYSTYPE. Likewise, pgbench.h must come after
+ * psqlscan_int.h for yyscan_t.
+ */
+#include "fe_utils/psqlscan_int.h"
+#include "pgbench.h"
+#include "exprparse.h"
+
+#line 37 "exprscan.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef yy_create_buffer
+#define expr_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer expr_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define expr_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer expr_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define expr_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer expr_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define expr_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string expr_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define expr_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes expr_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define expr_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer expr_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define expr_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer expr_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define expr_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state expr_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define expr_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer expr_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define expr_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state expr_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define expr_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state expr_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define expr_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack expr_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define expr_yylex_ALREADY_DEFINED
+#else
+#define yylex expr_yylex
+#endif
+
+#ifdef yyrestart
+#define expr_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart expr_yyrestart
+#endif
+
+#ifdef yylex_init
+#define expr_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init expr_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define expr_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra expr_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define expr_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy expr_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define expr_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug expr_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define expr_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug expr_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define expr_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra expr_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define expr_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra expr_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define expr_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in expr_yyget_in
+#endif
+
+#ifdef yyset_in
+#define expr_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in expr_yyset_in
+#endif
+
+#ifdef yyget_out
+#define expr_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out expr_yyget_out
+#endif
+
+#ifdef yyset_out
+#define expr_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out expr_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define expr_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng expr_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define expr_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text expr_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define expr_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno expr_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define expr_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno expr_yyset_lineno
+#endif
+
+#ifdef yyget_column
+#define expr_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column expr_yyget_column
+#endif
+
+#ifdef yyset_column
+#define expr_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column expr_yyset_column
+#endif
+
+#ifdef yywrap
+#define expr_yywrap_ALREADY_DEFINED
+#else
+#define yywrap expr_yywrap
+#endif
+
+#ifdef yyget_lval
+#define expr_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval expr_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define expr_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval expr_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define expr_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc expr_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define expr_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc expr_yyrealloc
+#endif
+
+#ifdef yyfree
+#define expr_yyfree_ALREADY_DEFINED
+#else
+#define yyfree expr_yyfree
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+ are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin , yyscanner )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = yyg->yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
+
+static void yyensure_buffer_stack ( yyscan_t yyscanner );
+static void yy_load_buffer_state ( yyscan_t yyscanner );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define expr_yywrap(yyscanner) (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+static yy_state_type yy_get_previous_state ( yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner);
+static int yy_get_next_buffer ( yyscan_t yyscanner );
+static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yyg->yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yyg->yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yyg->yy_c_buf_p = yy_cp;
+#define YY_NUM_RULES 51
+#define YY_END_OF_BUFFER 52
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[129] =
+ { 0,
+ 0, 0, 0, 0, 52, 1, 3, 5, 1, 50,
+ 47, 49, 50, 22, 10, 21, 24, 25, 8, 6,
+ 26, 7, 50, 9, 43, 43, 50, 18, 11, 19,
+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 50, 20, 23, 1, 1, 3, 4, 0, 47, 13,
+ 45, 44, 43, 0, 43, 38, 16, 14, 12, 15,
+ 17, 46, 46, 46, 46, 46, 46, 30, 46, 46,
+ 28, 46, 46, 46, 48, 0, 2, 0, 0, 44,
+ 0, 44, 43, 27, 46, 46, 37, 46, 46, 29,
+ 46, 46, 46, 46, 0, 45, 43, 33, 36, 46,
+
+ 46, 46, 39, 35, 40, 34, 43, 41, 46, 46,
+ 43, 31, 46, 43, 32, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 42, 0
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 2, 2, 4, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 5, 1, 6, 1, 7, 8, 1, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 1, 28,
+ 29, 30, 1, 1, 31, 32, 33, 34, 35, 36,
+ 32, 37, 38, 32, 32, 39, 32, 40, 41, 32,
+ 32, 42, 43, 44, 45, 32, 46, 32, 32, 32,
+ 1, 47, 1, 1, 32, 1, 31, 32, 33, 34,
+
+ 35, 36, 32, 37, 38, 32, 32, 39, 32, 40,
+ 41, 32, 32, 42, 43, 44, 45, 32, 46, 32,
+ 32, 32, 1, 48, 1, 49, 1, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32
+ } ;
+
+static const YY_CHAR yy_meta[50] =
+ { 0,
+ 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
+ 1, 3, 1, 3, 4, 1, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 1, 1, 1, 1,
+ 6, 6, 6, 6, 7, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 1, 1, 1
+ } ;
+
+static const flex_int16_t yy_base[138] =
+ { 0,
+ 0, 3, 50, 0, 204, 156, 6, 205, 97, 205,
+ 7, 205, 173, 205, 205, 205, 205, 205, 205, 205,
+ 205, 205, 0, 205, 0, 1, 0, 0, 205, 2,
+ 161, 0, 169, 0, 168, 155, 0, 155, 0, 159,
+ 9, 205, 205, 148, 99, 15, 205, 191, 19, 205,
+ 158, 157, 172, 10, 171, 0, 205, 205, 205, 205,
+ 205, 0, 155, 145, 144, 152, 146, 144, 139, 143,
+ 0, 146, 135, 143, 205, 172, 205, 169, 13, 128,
+ 32, 0, 14, 0, 120, 110, 0, 100, 97, 101,
+ 101, 99, 103, 97, 92, 0, 29, 0, 0, 101,
+
+ 95, 88, 0, 0, 0, 0, 19, 0, 93, 92,
+ 103, 0, 74, 88, 0, 89, 91, 92, 93, 97,
+ 100, 101, 104, 102, 111, 110, 7, 205, 146, 153,
+ 9, 157, 160, 163, 166, 171, 174
+ } ;
+
+static const flex_int16_t yy_def[138] =
+ { 0,
+ 129, 129, 128, 3, 128, 130, 128, 128, 130, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 131, 128, 132, 132, 133, 128, 128, 128,
+ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 128, 128, 128, 130, 130, 128, 128, 128, 128, 128,
+ 131, 135, 26, 136, 26, 133, 128, 128, 128, 128,
+ 128, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 128, 128, 128, 128, 137, 135,
+ 136, 81, 26, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 137, 95, 26, 134, 134, 134,
+
+ 134, 134, 134, 134, 134, 134, 26, 134, 134, 134,
+ 26, 134, 134, 26, 134, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 0, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128
+ } ;
+
+static const flex_int16_t yy_nxt[255] =
+ { 0,
+ 128, 7, 8, 7, 7, 8, 7, 46, 49, 46,
+ 49, 75, 76, 51, 52, 52, 46, 128, 46, 55,
+ 49, 81, 49, 81, 95, 53, 95, 57, 58, 59,
+ 60, 61, 53, 97, 54, 54, 72, 53, 65, 66,
+ 69, 73, 111, 128, 70, 128, 9, 53, 107, 9,
+ 10, 11, 12, 11, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 25, 25, 25,
+ 25, 25, 25, 25, 25, 26, 27, 28, 29, 30,
+ 31, 32, 33, 32, 34, 35, 32, 36, 32, 37,
+ 38, 32, 32, 39, 32, 40, 41, 42, 43, 47,
+
+ 48, 77, 78, 128, 116, 128, 53, 53, 117, 53,
+ 53, 53, 115, 118, 120, 53, 119, 121, 53, 53,
+ 53, 114, 53, 122, 123, 124, 125, 126, 53, 53,
+ 113, 112, 110, 109, 127, 108, 106, 105, 104, 103,
+ 102, 101, 100, 45, 99, 45, 6, 6, 6, 6,
+ 6, 6, 6, 44, 98, 44, 44, 44, 44, 44,
+ 53, 53, 54, 53, 56, 56, 56, 62, 62, 62,
+ 80, 77, 80, 82, 75, 82, 96, 94, 96, 93,
+ 92, 91, 90, 89, 88, 87, 86, 85, 84, 83,
+ 53, 54, 79, 47, 45, 74, 71, 68, 67, 64,
+
+ 63, 50, 45, 128, 5, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128
+ } ;
+
+static const flex_int16_t yy_chk[255] =
+ { 0,
+ 0, 1, 1, 1, 2, 2, 2, 7, 11, 7,
+ 11, 41, 41, 131, 25, 26, 46, 0, 46, 26,
+ 49, 54, 49, 54, 79, 127, 79, 28, 28, 28,
+ 30, 30, 83, 83, 25, 26, 39, 107, 34, 34,
+ 37, 39, 107, 81, 37, 81, 1, 97, 97, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 9,
+
+ 9, 45, 45, 95, 114, 95, 114, 116, 116, 117,
+ 118, 119, 113, 117, 119, 120, 118, 120, 121, 122,
+ 124, 111, 123, 121, 122, 123, 124, 125, 126, 125,
+ 110, 109, 102, 101, 126, 100, 94, 93, 92, 91,
+ 90, 89, 88, 9, 86, 45, 129, 129, 129, 129,
+ 129, 129, 129, 130, 85, 130, 130, 130, 130, 130,
+ 132, 132, 80, 132, 133, 133, 133, 134, 134, 134,
+ 135, 78, 135, 136, 76, 136, 137, 74, 137, 73,
+ 72, 70, 69, 68, 67, 66, 65, 64, 63, 55,
+ 53, 52, 51, 48, 44, 40, 38, 36, 35, 33,
+
+ 31, 13, 6, 5, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128
+ } ;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+#line 1 "exprscan.l"
+
+#line 38 "exprscan.l"
+/* context information for reporting errors in expressions */
+static const char *expr_source = NULL;
+static int expr_lineno = 0;
+static int expr_start_offset = 0;
+static const char *expr_command = NULL;
+
+/* indicates whether last yylex() call read a newline */
+static bool last_was_newline = false;
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int expr_yyget_column(yyscan_t yyscanner);
+extern void expr_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+#line 798 "exprscan.c"
+/* Except for the prefix, these options should match psqlscan.l */
+#define YY_NO_INPUT 1
+/* Character classes */
+/* {space} + {nonspace} + {newline} should cover all characters */
+/* Line continuation marker */
+/* case insensitive keywords */
+/* Exclusive states */
+
+#line 807 "exprscan.c"
+
+#define INITIAL 0
+#define EXPR 1
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+ {
+
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE yyextra_r;
+
+ /* The rest are the same as the globals declared in the non-reentrant scanner. */
+ FILE *yyin_r, *yyout_r;
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+ char yy_hold_char;
+ int yy_n_chars;
+ int yyleng_r;
+ char *yy_c_buf_p;
+ int yy_init;
+ int yy_start;
+ int yy_did_buffer_switch_on_eof;
+ int yy_start_stack_ptr;
+ int yy_start_stack_depth;
+ int *yy_start_stack;
+ yy_state_type yy_last_accepting_state;
+ char* yy_last_accepting_cpos;
+
+ int yylineno_r;
+ int yy_flex_debug_r;
+
+ char *yytext_r;
+ int yy_more_flag;
+ int yy_more_len;
+
+ YYSTYPE * yylval_r;
+
+ }; /* end struct yyguts_t */
+
+static int yy_init_globals ( yyscan_t yyscanner );
+
+ /* This must go here because YYSTYPE and YYLTYPE are included
+ * from bison output in section 1.*/
+ # define yylval yyg->yylval_r
+
+int yylex_init (yyscan_t* scanner);
+
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( yyscan_t yyscanner );
+
+int yyget_debug ( yyscan_t yyscanner );
+
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
+
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+
+FILE *yyget_in ( yyscan_t yyscanner );
+
+void yyset_in ( FILE * _in_str , yyscan_t yyscanner );
+
+FILE *yyget_out ( yyscan_t yyscanner );
+
+void yyset_out ( FILE * _out_str , yyscan_t yyscanner );
+
+ int yyget_leng ( yyscan_t yyscanner );
+
+char *yyget_text ( yyscan_t yyscanner );
+
+int yyget_lineno ( yyscan_t yyscanner );
+
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
+
+int yyget_column ( yyscan_t yyscanner );
+
+void yyset_column ( int _column_no , yyscan_t yyscanner );
+
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
+
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( yyscan_t yyscanner );
+#else
+extern int yywrap ( yyscan_t yyscanner );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * , yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( yyscan_t yyscanner );
+#else
+static int input ( yyscan_t yyscanner );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner);
+
+#define YY_DECL int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yylval = yylval_param;
+
+ if ( !yyg->yy_init )
+ {
+ yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yyg->yy_start )
+ yyg->yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_load_buffer_state( yyscanner );
+ }
+
+ {
+#line 103 "exprscan.l"
+
+
+
+#line 107 "exprscan.l"
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+
+ /* Reset was-newline flag */
+ last_was_newline = false;
+
+
+ /* INITIAL state */
+
+#line 1103 "exprscan.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yyg->yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yyg->yy_start;
+yy_match:
+ do
+ {
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 129 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ ++yy_cp;
+ }
+ while ( yy_current_state != 128 );
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = yyg->yy_hold_char;
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+ goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 125 "exprscan.l"
+{
+ /* Found a word, emit and return it */
+ psqlscan_emit(cur_state, yytext, yyleng);
+ return 1;
+ }
+ YY_BREAK
+/*
+ * We need this rule to avoid returning "word\" instead of recognizing
+ * a continuation marker just after a word:
+ */
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 135 "exprscan.l"
+{
+ /* Found "word\\\r?\n", emit and return just "word" */
+ int wordlen = yyleng - 2;
+ if (yytext[wordlen] == '\r')
+ wordlen--;
+ Assert(yytext[wordlen] == '\\');
+ psqlscan_emit(cur_state, yytext, wordlen);
+ return 1;
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 145 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 147 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 5:
+/* rule 5 can match eol */
+YY_RULE_SETUP
+#line 149 "exprscan.l"
+{
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+ YY_BREAK
+/* EXPR state */
+
+case 6:
+YY_RULE_SETUP
+#line 159 "exprscan.l"
+{ return '+'; }
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 160 "exprscan.l"
+{ return '-'; }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 161 "exprscan.l"
+{ return '*'; }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 162 "exprscan.l"
+{ return '/'; }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 163 "exprscan.l"
+{ return '%'; } /* C version, also in Pg SQL */
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 164 "exprscan.l"
+{ return '='; }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 165 "exprscan.l"
+{ return NE_OP; }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 166 "exprscan.l"
+{ return NE_OP; } /* C version, also in Pg SQL */
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 167 "exprscan.l"
+{ return LE_OP; }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 168 "exprscan.l"
+{ return GE_OP; }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 169 "exprscan.l"
+{ return LS_OP; }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 170 "exprscan.l"
+{ return RS_OP; }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 171 "exprscan.l"
+{ return '<'; }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 172 "exprscan.l"
+{ return '>'; }
+ YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 173 "exprscan.l"
+{ return '|'; }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 174 "exprscan.l"
+{ return '&'; }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 175 "exprscan.l"
+{ return '#'; }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 176 "exprscan.l"
+{ return '~'; }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 178 "exprscan.l"
+{ return '('; }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 179 "exprscan.l"
+{ return ')'; }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 180 "exprscan.l"
+{ return ','; }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 182 "exprscan.l"
+{ return AND_OP; }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 183 "exprscan.l"
+{ return OR_OP; }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 184 "exprscan.l"
+{ return NOT_OP; }
+ YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 185 "exprscan.l"
+{ return IS_OP; }
+ YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 186 "exprscan.l"
+{ return ISNULL_OP; }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 187 "exprscan.l"
+{ return NOTNULL_OP; }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 189 "exprscan.l"
+{ return CASE_KW; }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 190 "exprscan.l"
+{ return WHEN_KW; }
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 191 "exprscan.l"
+{ return THEN_KW; }
+ YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 192 "exprscan.l"
+{ return ELSE_KW; }
+ YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 193 "exprscan.l"
+{ return END_KW; }
+ YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 195 "exprscan.l"
+{
+ yylval->str = pg_strdup(yytext + 1);
+ return VARIABLE;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 200 "exprscan.l"
+{ return NULL_CONST; }
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 201 "exprscan.l"
+{
+ yylval->bval = true;
+ return BOOLEAN_CONST;
+ }
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 205 "exprscan.l"
+{
+ yylval->bval = false;
+ return BOOLEAN_CONST;
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 209 "exprscan.l"
+{
+ /*
+ * Special handling for PG_INT64_MIN, which can't
+ * accurately be represented here, as the minus sign is
+ * lexed separately and INT64_MIN can't be represented as
+ * a positive integer.
+ */
+ return MAXINT_PLUS_ONE_CONST;
+ }
+ YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 218 "exprscan.l"
+{
+ if (!strtoint64(yytext, true, &yylval->ival))
+ expr_yyerror_more(yyscanner, "bigint constant overflow",
+ strdup(yytext));
+ return INTEGER_CONST;
+ }
+ YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 224 "exprscan.l"
+{
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+ YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 230 "exprscan.l"
+{
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+ YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 236 "exprscan.l"
+{
+ yylval->str = pg_strdup(yytext);
+ return FUNCTION;
+ }
+ YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 241 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 48:
+/* rule 48 can match eol */
+YY_RULE_SETUP
+#line 243 "exprscan.l"
+{ /* ignore */ }
+ YY_BREAK
+case 49:
+/* rule 49 can match eol */
+YY_RULE_SETUP
+#line 245 "exprscan.l"
+{
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+ YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 251 "exprscan.l"
+{
+ /*
+ * must strdup yytext so that expr_yyerror_more doesn't
+ * change it while finding end of line
+ */
+ expr_yyerror_more(yyscanner, "unexpected character",
+ pg_strdup(yytext));
+ /* NOTREACHED, syntax_error calls exit() */
+ return 0;
+ }
+ YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(EXPR):
+#line 264 "exprscan.l"
+{
+ if (cur_state->buffer_stack == NULL)
+ return 0; /* end of input reached */
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+ YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 276 "exprscan.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+ YY_BREAK
+#line 1502 "exprscan.c"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yyg->yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yyg->yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yyg->yy_last_accepting_cpos;
+ yy_current_state = yyg->yy_last_accepting_state;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yyg->yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap( yyscanner ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p =
+ yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yyg->yy_c_buf_p =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = yyg->yytext_ptr;
+ int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ yyg->yy_n_chars, num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ if ( yyg->yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin , yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_current_state = yyg->yy_start;
+
+ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+ {
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 129 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
+{
+ int yy_is_jam;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+ char *yy_cp = yyg->yy_c_buf_p;
+
+ YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ yyg->yy_last_accepting_state = yy_current_state;
+ yyg->yy_last_accepting_cpos = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 129 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ yy_is_jam = (yy_current_state == 128);
+
+ (void)yyg;
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner)
+#else
+ static int input (yyscan_t yyscanner)
+#endif
+
+{
+ int c;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ /* This was really a NUL. */
+ *yyg->yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr);
+ ++yyg->yy_c_buf_p;
+
+ switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin , yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( yyscanner ) )
+ return 0;
+
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput(yyscanner);
+#else
+ return input(yyscanner);
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( yyscanner );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+static void yy_load_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file , yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * @param yyscanner The scanner object.
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf , yyscanner );
+
+ yyfree( (void *) b , yyscanner );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+
+{
+ int oerrno = errno;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_flush_buffer( b , yyscanner);
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ * @param yyscanner The scanner object.
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack(yyscanner);
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ yyg->yy_buffer_stack_top++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+void yypop_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yyg->yy_buffer_stack_top > 0)
+ --yyg->yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (yyscan_t yyscanner)
+{
+ yy_size_t num_to_alloc;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (!yyg->yy_buffer_stack) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+ }
+
+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
+ (yyg->yy_buffer_stack,
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b , yyscanner );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n , yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n , yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = yyg->yy_hold_char; \
+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+ *yyg->yy_c_buf_p = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_lineno (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_column (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_in (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_out (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int yyget_leng (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *yyget_text (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ * @param yyscanner The scanner object.
+ */
+void yyset_lineno (int _line_number , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
+
+ yylineno = _line_number;
+}
+
+/** Set the current column.
+ * @param _column_no column number
+ * @param yyscanner The scanner object.
+ */
+void yyset_column (int _column_no , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_column called with no buffer" );
+
+ yycolumn = _column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyout = _out_str ;
+}
+
+int yyget_debug (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yy_flex_debug = _bdebug ;
+}
+
+/* Accessor methods for yylval and yylloc */
+
+YYSTYPE * yyget_lval (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yylval;
+}
+
+void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yylval = yylval_param;
+}
+
+/* User-visible API */
+
+/* yylex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+int yylex_init(yyscan_t* ptr_yy_globals)
+{
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* yylex_init_extra has the same functionality as yylex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to yyalloc in
+ * the yyextra field.
+ */
+int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )
+{
+ struct yyguts_t dummy_yyguts;
+
+ yyset_extra (yy_user_defined, &dummy_yyguts);
+
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ yyset_extra (yy_user_defined, *ptr_yy_globals);
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+static int yy_init_globals (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ yyg->yy_buffer_stack = NULL;
+ yyg->yy_buffer_stack_top = 0;
+ yyg->yy_buffer_stack_max = 0;
+ yyg->yy_c_buf_p = NULL;
+ yyg->yy_init = 0;
+ yyg->yy_start = 0;
+
+ yyg->yy_start_stack_ptr = 0;
+ yyg->yy_start_stack_depth = 0;
+ yyg->yy_start_stack = NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state(yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ yyfree(yyg->yy_buffer_stack , yyscanner);
+ yyg->yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ yyfree( yyg->yy_start_stack , yyscanner );
+ yyg->yy_start_stack = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( yyscanner);
+
+ /* Destroy the main struct (reentrant only). */
+ yyfree ( yyscanner , yyscanner );
+ yyscanner = NULL;
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s , yyscan_t yyscanner)
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 276 "exprscan.l"
+
+
+/* LCOV_EXCL_STOP */
+
+void
+expr_yyerror_more(yyscan_t yyscanner, const char *message, const char *more)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+ int error_detection_offset = expr_scanner_offset(state) - 1;
+ YYSTYPE lval;
+ char *full_line;
+
+ /*
+ * While parsing an expression, we may not have collected the whole line
+ * yet from the input source. Lex till EOL so we can report whole line.
+ * (If we're at EOF, it's okay to call yylex() an extra time.)
+ */
+ if (!last_was_newline)
+ {
+ while (yylex(&lval, yyscanner))
+ /* skip */ ;
+ }
+
+ /* Extract the line, trimming trailing newline if any */
+ full_line = expr_scanner_get_substring(state,
+ expr_start_offset,
+ expr_scanner_offset(state),
+ true);
+
+ syntax_error(expr_source, expr_lineno, full_line, expr_command,
+ message, more, error_detection_offset - expr_start_offset);
+}
+
+void
+expr_yyerror(yyscan_t yyscanner, const char *message)
+{
+ expr_yyerror_more(yyscanner, message, NULL);
+}
+
+/*
+ * Collect a space-separated word from a backslash command and return it
+ * in word_buf, along with its starting string offset in *offset.
+ * Returns true if successful, false if at end of command.
+ */
+bool
+expr_lex_one_word(PsqlScanState state, PQExpBuffer word_buf, int *offset)
+{
+ int lexresult;
+ YYSTYPE lval;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = word_buf;
+ resetPQExpBuffer(word_buf);
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = INITIAL;
+
+ /* And lex. */
+ lexresult = yylex(&lval, state->scanner);
+
+ /*
+ * Save start offset of word, if any. We could do this more efficiently,
+ * but for now this seems fine.
+ */
+ if (lexresult)
+ *offset = expr_scanner_offset(state) - word_buf->len;
+ else
+ *offset = -1;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return (bool) lexresult;
+}
+
+/*
+ * Prepare to lex an expression via expr_yyparse().
+ *
+ * Returns the yyscan_t that is to be passed to expr_yyparse().
+ * (This is just state->scanner, but callers don't need to know that.)
+ */
+yyscan_t
+expr_scanner_init(PsqlScanState state,
+ const char *source, int lineno, int start_offset,
+ const char *command)
+{
+ /* Save error context info */
+ expr_source = source;
+ expr_lineno = lineno;
+ expr_start_offset = start_offset;
+ expr_command = command;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = EXPR;
+
+ return state->scanner;
+}
+
+/*
+ * Finish lexing an expression.
+ */
+void
+expr_scanner_finish(yyscan_t yyscanner)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+
+ /*
+ * Reselect appropriate initial state for SQL lexer.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Get offset from start of string to end of current lexer token.
+ *
+ * We rely on the knowledge that flex modifies the scan buffer by storing
+ * a NUL at the end of the current token (yytext). Note that this might
+ * not work quite right if we were parsing a sub-buffer, but since pgbench
+ * never invokes that functionality, it doesn't matter.
+ */
+int
+expr_scanner_offset(PsqlScanState state)
+{
+ return strlen(state->scanbuf);
+}
+
+/*
+ * Get a malloc'd copy of the lexer input string from start_offset
+ * to just before end_offset. If chomp is true, drop any trailing
+ * newline(s).
+ */
+char *
+expr_scanner_get_substring(PsqlScanState state,
+ int start_offset, int end_offset,
+ bool chomp)
+{
+ char *result;
+ const char *scanptr = state->scanbuf + start_offset;
+ int slen = end_offset - start_offset;
+
+ Assert(slen >= 0);
+ Assert(end_offset <= strlen(state->scanbuf));
+
+ if (chomp)
+ {
+ while (slen > 0 &&
+ (scanptr[slen - 1] == '\n' || scanptr[slen - 1] == '\r'))
+ slen--;
+ }
+
+ result = (char *) pg_malloc(slen + 1);
+ memcpy(result, scanptr, slen);
+ result[slen] = '\0';
+
+ return result;
+}
+
+/*
+ * Get the line number associated with the given string offset
+ * (which must not be past the end of where we've lexed to).
+ */
+int
+expr_scanner_get_lineno(PsqlScanState state, int offset)
+{
+ int lineno = 1;
+ const char *p = state->scanbuf;
+
+ while (*p && offset > 0)
+ {
+ if (*p == '\n')
+ lineno++;
+ p++, offset--;
+ }
+ return lineno;
+}
+
diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l
new file mode 100644
index 0000000..4bba292
--- /dev/null
+++ b/src/bin/pgbench/exprscan.l
@@ -0,0 +1,473 @@
+%top{
+/*-------------------------------------------------------------------------
+ *
+ * exprscan.l
+ * lexical scanner for pgbench backslash commands
+ *
+ * This lexer supports two operating modes:
+ *
+ * In INITIAL state, just parse off whitespace-separated words (this mode
+ * is basically equivalent to strtok(), which is what we used to use).
+ *
+ * In EXPR state, lex for the simple expression syntax of exprparse.y.
+ *
+ * In either mode, stop upon hitting newline or end of string.
+ *
+ * Note that this lexer operates within the framework created by psqlscan.l,
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pgbench/exprscan.l
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+/*
+ * NB: include exprparse.h only AFTER including pgbench.h, because pgbench.h
+ * contains definitions needed for YYSTYPE. Likewise, pgbench.h must come after
+ * psqlscan_int.h for yyscan_t.
+ */
+#include "fe_utils/psqlscan_int.h"
+#include "pgbench.h"
+#include "exprparse.h"
+}
+
+%{
+/* context information for reporting errors in expressions */
+static const char *expr_source = NULL;
+static int expr_lineno = 0;
+static int expr_start_offset = 0;
+static const char *expr_command = NULL;
+
+/* indicates whether last yylex() call read a newline */
+static bool last_was_newline = false;
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int expr_yyget_column(yyscan_t yyscanner);
+extern void expr_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+%}
+
+/* Except for the prefix, these options should match psqlscan.l */
+%option reentrant
+%option bison-bridge
+%option 8bit
+%option never-interactive
+%option nodefault
+%option noinput
+%option nounput
+%option noyywrap
+%option warn
+%option prefix="expr_yy"
+
+/* Character classes */
+alpha [a-zA-Z\200-\377_]
+digit [0-9]
+alnum [A-Za-z\200-\377_0-9]
+/* {space} + {nonspace} + {newline} should cover all characters */
+space [ \t\r\f\v]
+nonspace [^ \t\r\f\v\n]
+newline [\n]
+
+/* Line continuation marker */
+continuation \\\r?{newline}
+
+/* case insensitive keywords */
+and [Aa][Nn][Dd]
+or [Oo][Rr]
+not [Nn][Oo][Tt]
+case [Cc][Aa][Ss][Ee]
+when [Ww][Hh][Ee][Nn]
+then [Tt][Hh][Ee][Nn]
+else [Ee][Ll][Ss][Ee]
+end [Ee][Nn][Dd]
+true [Tt][Rr][Uu][Ee]
+false [Ff][Aa][Ll][Ss][Ee]
+null [Nn][Uu][Ll][Ll]
+is [Ii][Ss]
+isnull [Ii][Ss][Nn][Uu][Ll][Ll]
+notnull [Nn][Oo][Tt][Nn][Uu][Ll][Ll]
+
+/* Exclusive states */
+%x EXPR
+
+%%
+
+%{
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+
+ /* Reset was-newline flag */
+ last_was_newline = false;
+%}
+
+ /* INITIAL state */
+
+{nonspace}+ {
+ /* Found a word, emit and return it */
+ psqlscan_emit(cur_state, yytext, yyleng);
+ return 1;
+ }
+
+ /*
+ * We need this rule to avoid returning "word\" instead of recognizing
+ * a continuation marker just after a word:
+ */
+{nonspace}+{continuation} {
+ /* Found "word\\\r?\n", emit and return just "word" */
+ int wordlen = yyleng - 2;
+ if (yytext[wordlen] == '\r')
+ wordlen--;
+ Assert(yytext[wordlen] == '\\');
+ psqlscan_emit(cur_state, yytext, wordlen);
+ return 1;
+ }
+
+{space}+ { /* ignore */ }
+
+{continuation} { /* ignore */ }
+
+{newline} {
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+
+ /* EXPR state */
+
+<EXPR>{
+
+"+" { return '+'; }
+"-" { return '-'; }
+"*" { return '*'; }
+"/" { return '/'; }
+"%" { return '%'; } /* C version, also in Pg SQL */
+"=" { return '='; }
+"<>" { return NE_OP; }
+"!=" { return NE_OP; } /* C version, also in Pg SQL */
+"<=" { return LE_OP; }
+">=" { return GE_OP; }
+"<<" { return LS_OP; }
+">>" { return RS_OP; }
+"<" { return '<'; }
+">" { return '>'; }
+"|" { return '|'; }
+"&" { return '&'; }
+"#" { return '#'; }
+"~" { return '~'; }
+
+"(" { return '('; }
+")" { return ')'; }
+"," { return ','; }
+
+{and} { return AND_OP; }
+{or} { return OR_OP; }
+{not} { return NOT_OP; }
+{is} { return IS_OP; }
+{isnull} { return ISNULL_OP; }
+{notnull} { return NOTNULL_OP; }
+
+{case} { return CASE_KW; }
+{when} { return WHEN_KW; }
+{then} { return THEN_KW; }
+{else} { return ELSE_KW; }
+{end} { return END_KW; }
+
+:{alnum}+ {
+ yylval->str = pg_strdup(yytext + 1);
+ return VARIABLE;
+ }
+
+{null} { return NULL_CONST; }
+{true} {
+ yylval->bval = true;
+ return BOOLEAN_CONST;
+ }
+{false} {
+ yylval->bval = false;
+ return BOOLEAN_CONST;
+ }
+"9223372036854775808" {
+ /*
+ * Special handling for PG_INT64_MIN, which can't
+ * accurately be represented here, as the minus sign is
+ * lexed separately and INT64_MIN can't be represented as
+ * a positive integer.
+ */
+ return MAXINT_PLUS_ONE_CONST;
+ }
+{digit}+ {
+ if (!strtoint64(yytext, true, &yylval->ival))
+ expr_yyerror_more(yyscanner, "bigint constant overflow",
+ strdup(yytext));
+ return INTEGER_CONST;
+ }
+{digit}+(\.{digit}*)?([eE][-+]?{digit}+)? {
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+\.{digit}+([eE][-+]?{digit}+)? {
+ if (!strtodouble(yytext, true, &yylval->dval))
+ expr_yyerror_more(yyscanner, "double constant overflow",
+ strdup(yytext));
+ return DOUBLE_CONST;
+ }
+{alpha}{alnum}* {
+ yylval->str = pg_strdup(yytext);
+ return FUNCTION;
+ }
+
+{space}+ { /* ignore */ }
+
+{continuation} { /* ignore */ }
+
+{newline} {
+ /* report end of command */
+ last_was_newline = true;
+ return 0;
+ }
+
+. {
+ /*
+ * must strdup yytext so that expr_yyerror_more doesn't
+ * change it while finding end of line
+ */
+ expr_yyerror_more(yyscanner, "unexpected character",
+ pg_strdup(yytext));
+ /* NOTREACHED, syntax_error calls exit() */
+ return 0;
+ }
+
+}
+
+<<EOF>> {
+ if (cur_state->buffer_stack == NULL)
+ return 0; /* end of input reached */
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+
+%%
+
+/* LCOV_EXCL_STOP */
+
+void
+expr_yyerror_more(yyscan_t yyscanner, const char *message, const char *more)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+ int error_detection_offset = expr_scanner_offset(state) - 1;
+ YYSTYPE lval;
+ char *full_line;
+
+ /*
+ * While parsing an expression, we may not have collected the whole line
+ * yet from the input source. Lex till EOL so we can report whole line.
+ * (If we're at EOF, it's okay to call yylex() an extra time.)
+ */
+ if (!last_was_newline)
+ {
+ while (yylex(&lval, yyscanner))
+ /* skip */ ;
+ }
+
+ /* Extract the line, trimming trailing newline if any */
+ full_line = expr_scanner_get_substring(state,
+ expr_start_offset,
+ expr_scanner_offset(state),
+ true);
+
+ syntax_error(expr_source, expr_lineno, full_line, expr_command,
+ message, more, error_detection_offset - expr_start_offset);
+}
+
+void
+expr_yyerror(yyscan_t yyscanner, const char *message)
+{
+ expr_yyerror_more(yyscanner, message, NULL);
+}
+
+/*
+ * Collect a space-separated word from a backslash command and return it
+ * in word_buf, along with its starting string offset in *offset.
+ * Returns true if successful, false if at end of command.
+ */
+bool
+expr_lex_one_word(PsqlScanState state, PQExpBuffer word_buf, int *offset)
+{
+ int lexresult;
+ YYSTYPE lval;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = word_buf;
+ resetPQExpBuffer(word_buf);
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = INITIAL;
+
+ /* And lex. */
+ lexresult = yylex(&lval, state->scanner);
+
+ /*
+ * Save start offset of word, if any. We could do this more efficiently,
+ * but for now this seems fine.
+ */
+ if (lexresult)
+ *offset = expr_scanner_offset(state) - word_buf->len;
+ else
+ *offset = -1;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return (bool) lexresult;
+}
+
+/*
+ * Prepare to lex an expression via expr_yyparse().
+ *
+ * Returns the yyscan_t that is to be passed to expr_yyparse().
+ * (This is just state->scanner, but callers don't need to know that.)
+ */
+yyscan_t
+expr_scanner_init(PsqlScanState state,
+ const char *source, int lineno, int start_offset,
+ const char *command)
+{
+ /* Save error context info */
+ expr_source = source;
+ expr_lineno = lineno;
+ expr_start_offset = start_offset;
+ expr_command = command;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set start state */
+ state->start_state = EXPR;
+
+ return state->scanner;
+}
+
+/*
+ * Finish lexing an expression.
+ */
+void
+expr_scanner_finish(yyscan_t yyscanner)
+{
+ PsqlScanState state = yyget_extra(yyscanner);
+
+ /*
+ * Reselect appropriate initial state for SQL lexer.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Get offset from start of string to end of current lexer token.
+ *
+ * We rely on the knowledge that flex modifies the scan buffer by storing
+ * a NUL at the end of the current token (yytext). Note that this might
+ * not work quite right if we were parsing a sub-buffer, but since pgbench
+ * never invokes that functionality, it doesn't matter.
+ */
+int
+expr_scanner_offset(PsqlScanState state)
+{
+ return strlen(state->scanbuf);
+}
+
+/*
+ * Get a malloc'd copy of the lexer input string from start_offset
+ * to just before end_offset. If chomp is true, drop any trailing
+ * newline(s).
+ */
+char *
+expr_scanner_get_substring(PsqlScanState state,
+ int start_offset, int end_offset,
+ bool chomp)
+{
+ char *result;
+ const char *scanptr = state->scanbuf + start_offset;
+ int slen = end_offset - start_offset;
+
+ Assert(slen >= 0);
+ Assert(end_offset <= strlen(state->scanbuf));
+
+ if (chomp)
+ {
+ while (slen > 0 &&
+ (scanptr[slen - 1] == '\n' || scanptr[slen - 1] == '\r'))
+ slen--;
+ }
+
+ result = (char *) pg_malloc(slen + 1);
+ memcpy(result, scanptr, slen);
+ result[slen] = '\0';
+
+ return result;
+}
+
+/*
+ * Get the line number associated with the given string offset
+ * (which must not be past the end of where we've lexed to).
+ */
+int
+expr_scanner_get_lineno(PsqlScanState state, int offset)
+{
+ int lineno = 1;
+ const char *p = state->scanbuf;
+
+ while (*p && offset > 0)
+ {
+ if (*p == '\n')
+ lineno++;
+ p++, offset--;
+ }
+ return lineno;
+}
diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build
new file mode 100644
index 0000000..e3c7619
--- /dev/null
+++ b/src/bin/pgbench/meson.build
@@ -0,0 +1,48 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pgbench_sources = files(
+ 'pgbench.c',
+)
+
+exprscan = custom_target('exprscan',
+ input: 'exprscan.l',
+ output: 'exprscan.c',
+ command: flex_cmd,
+)
+generated_sources += exprscan
+pgbench_sources += exprscan
+
+exprparse = custom_target('exprparse',
+ input: 'exprparse.y',
+ kwargs: bison_kw,
+)
+generated_sources += exprparse.to_list()
+pgbench_sources += exprparse
+
+if host_system == 'windows'
+ pgbench_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pgbench',
+ '--FILEDESC', 'pgbench - a simple program for running benchmark tests'])
+endif
+
+pgbench = executable('pgbench',
+ pgbench_sources,
+ dependencies: [frontend_code, libpq, thread_dep],
+ include_directories: include_directories('.'),
+ c_pch: pch_postgres_fe_h,
+ c_args: host_system == 'windows' ? ['-DFD_SETSIZE=1024'] : [],
+ kwargs: default_bin_args,
+)
+bin_targets += pgbench
+
+tests += {
+ 'name': 'pgbench',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'tests': [
+ 't/001_pgbench_with_server.pl',
+ 't/002_pgbench_no_server.pl',
+ ],
+ },
+}
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
new file mode 100644
index 0000000..c1134ea
--- /dev/null
+++ b/src/bin/pgbench/pgbench.c
@@ -0,0 +1,7841 @@
+/*
+ * pgbench.c
+ *
+ * A simple benchmark program for PostgreSQL
+ * Originally written by Tatsuo Ishii and enhanced by many contributors.
+ *
+ * src/bin/pgbench/pgbench.c
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ * ALL RIGHTS RESERVED;
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose, without fee, and without a written agreement
+ * is hereby granted, provided that the above copyright notice and this
+ * paragraph and the following two paragraphs appear in all copies.
+ *
+ * IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
+ * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
+ * DOCUMENTATION, EVEN IF THE AUTHOR OR DISTRIBUTORS HAVE BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * THE AUTHOR AND DISTRIBUTORS SPECIFICALLY DISCLAIMS ANY WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE AUTHOR AND DISTRIBUTORS HAS NO OBLIGATIONS TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ */
+
+#if defined(WIN32) && FD_SETSIZE < 1024
+#error FD_SETSIZE needs to have been increased
+#endif
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/resource.h> /* for getrlimit */
+
+/* For testing, PGBENCH_USE_SELECT can be defined to force use of that code */
+#if defined(HAVE_PPOLL) && !defined(PGBENCH_USE_SELECT)
+#define POLL_USING_PPOLL
+#ifdef HAVE_POLL_H
+#include <poll.h>
+#endif
+#else /* no ppoll(), so use select() */
+#define POLL_USING_SELECT
+#include <sys/select.h>
+#endif
+
+#include "common/int.h"
+#include "common/logging.h"
+#include "common/pg_prng.h"
+#include "common/string.h"
+#include "common/username.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/conditional.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+#include "getopt_long.h"
+#include "libpq-fe.h"
+#include "pgbench.h"
+#include "port/pg_bitutils.h"
+#include "portability/instr_time.h"
+
+/* X/Open (XSI) requires <math.h> to provide M_PI, but core POSIX does not */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define ERRCODE_T_R_SERIALIZATION_FAILURE "40001"
+#define ERRCODE_T_R_DEADLOCK_DETECTED "40P01"
+#define ERRCODE_UNDEFINED_TABLE "42P01"
+
+/*
+ * Hashing constants
+ */
+#define FNV_PRIME UINT64CONST(0x100000001b3)
+#define FNV_OFFSET_BASIS UINT64CONST(0xcbf29ce484222325)
+#define MM2_MUL UINT64CONST(0xc6a4a7935bd1e995)
+#define MM2_MUL_TIMES_8 UINT64CONST(0x35253c9ade8f4ca8)
+#define MM2_ROT 47
+
+/*
+ * Multi-platform socket set implementations
+ */
+
+#ifdef POLL_USING_PPOLL
+#define SOCKET_WAIT_METHOD "ppoll"
+
+typedef struct socket_set
+{
+ int maxfds; /* allocated length of pollfds[] array */
+ int curfds; /* number currently in use */
+ struct pollfd pollfds[FLEXIBLE_ARRAY_MEMBER];
+} socket_set;
+
+#endif /* POLL_USING_PPOLL */
+
+#ifdef POLL_USING_SELECT
+#define SOCKET_WAIT_METHOD "select"
+
+typedef struct socket_set
+{
+ int maxfd; /* largest FD currently set in fds */
+ fd_set fds;
+} socket_set;
+
+#endif /* POLL_USING_SELECT */
+
+/*
+ * Multi-platform thread implementations
+ */
+
+#ifdef WIN32
+/* Use Windows threads */
+#include <windows.h>
+#define GETERRNO() (_dosmaperr(GetLastError()), errno)
+#define THREAD_T HANDLE
+#define THREAD_FUNC_RETURN_TYPE unsigned
+#define THREAD_FUNC_RETURN return 0
+#define THREAD_FUNC_CC __stdcall
+#define THREAD_CREATE(handle, function, arg) \
+ ((*(handle) = (HANDLE) _beginthreadex(NULL, 0, (function), (arg), 0, NULL)) == 0 ? errno : 0)
+#define THREAD_JOIN(handle) \
+ (WaitForSingleObject(handle, INFINITE) != WAIT_OBJECT_0 ? \
+ GETERRNO() : CloseHandle(handle) ? 0 : GETERRNO())
+#define THREAD_BARRIER_T SYNCHRONIZATION_BARRIER
+#define THREAD_BARRIER_INIT(barrier, n) \
+ (InitializeSynchronizationBarrier((barrier), (n), 0) ? 0 : GETERRNO())
+#define THREAD_BARRIER_WAIT(barrier) \
+ EnterSynchronizationBarrier((barrier), \
+ SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY)
+#define THREAD_BARRIER_DESTROY(barrier)
+#elif defined(ENABLE_THREAD_SAFETY)
+/* Use POSIX threads */
+#include "port/pg_pthread.h"
+#define THREAD_T pthread_t
+#define THREAD_FUNC_RETURN_TYPE void *
+#define THREAD_FUNC_RETURN return NULL
+#define THREAD_FUNC_CC
+#define THREAD_CREATE(handle, function, arg) \
+ pthread_create((handle), NULL, (function), (arg))
+#define THREAD_JOIN(handle) \
+ pthread_join((handle), NULL)
+#define THREAD_BARRIER_T pthread_barrier_t
+#define THREAD_BARRIER_INIT(barrier, n) \
+ pthread_barrier_init((barrier), NULL, (n))
+#define THREAD_BARRIER_WAIT(barrier) pthread_barrier_wait((barrier))
+#define THREAD_BARRIER_DESTROY(barrier) pthread_barrier_destroy((barrier))
+#else
+/* No threads implementation, use none (-j 1) */
+#define THREAD_T void *
+#define THREAD_FUNC_RETURN_TYPE void *
+#define THREAD_FUNC_RETURN return NULL
+#define THREAD_FUNC_CC
+#define THREAD_BARRIER_T int
+#define THREAD_BARRIER_INIT(barrier, n) (*(barrier) = 0)
+#define THREAD_BARRIER_WAIT(barrier)
+#define THREAD_BARRIER_DESTROY(barrier)
+#endif
+
+
+/********************************************************************
+ * some configurable parameters */
+
+#define DEFAULT_INIT_STEPS "dtgvp" /* default -I setting */
+#define ALL_INIT_STEPS "dtgGvpf" /* all possible steps */
+
+#define LOG_STEP_SECONDS 5 /* seconds between log messages */
+#define DEFAULT_NXACTS 10 /* default nxacts */
+
+#define MIN_GAUSSIAN_PARAM 2.0 /* minimum parameter for gauss */
+
+#define MIN_ZIPFIAN_PARAM 1.001 /* minimum parameter for zipfian */
+#define MAX_ZIPFIAN_PARAM 1000.0 /* maximum parameter for zipfian */
+
+int nxacts = 0; /* number of transactions per client */
+int duration = 0; /* duration in seconds */
+int64 end_time = 0; /* when to stop in micro seconds, under -T */
+
+/*
+ * scaling factor. for example, scale = 10 will make 1000000 tuples in
+ * pgbench_accounts table.
+ */
+int scale = 1;
+
+/*
+ * fillfactor. for example, fillfactor = 90 will use only 90 percent
+ * space during inserts and leave 10 percent free.
+ */
+int fillfactor = 100;
+
+/*
+ * use unlogged tables?
+ */
+bool unlogged_tables = false;
+
+/*
+ * log sampling rate (1.0 = log everything, 0.0 = option not given)
+ */
+double sample_rate = 0.0;
+
+/*
+ * When threads are throttled to a given rate limit, this is the target delay
+ * to reach that rate in usec. 0 is the default and means no throttling.
+ */
+double throttle_delay = 0;
+
+/*
+ * Transactions which take longer than this limit (in usec) are counted as
+ * late, and reported as such, although they are completed anyway. When
+ * throttling is enabled, execution time slots that are more than this late
+ * are skipped altogether, and counted separately.
+ */
+int64 latency_limit = 0;
+
+/*
+ * tablespace selection
+ */
+char *tablespace = NULL;
+char *index_tablespace = NULL;
+
+/*
+ * Number of "pgbench_accounts" partitions. 0 is the default and means no
+ * partitioning.
+ */
+static int partitions = 0;
+
+/* partitioning strategy for "pgbench_accounts" */
+typedef enum
+{
+ PART_NONE, /* no partitioning */
+ PART_RANGE, /* range partitioning */
+ PART_HASH /* hash partitioning */
+} partition_method_t;
+
+static partition_method_t partition_method = PART_NONE;
+static const char *PARTITION_METHOD[] = {"none", "range", "hash"};
+
+/* random seed used to initialize base_random_sequence */
+int64 random_seed = -1;
+
+/*
+ * end of configurable parameters
+ *********************************************************************/
+
+#define nbranches 1 /* Makes little sense to change this. Change
+ * -s instead */
+#define ntellers 10
+#define naccounts 100000
+
+/*
+ * The scale factor at/beyond which 32bit integers are incapable of storing
+ * 64bit values.
+ *
+ * Although the actual threshold is 21474, we use 20000 because it is easier to
+ * document and remember, and isn't that far away from the real threshold.
+ */
+#define SCALE_32BIT_THRESHOLD 20000
+
+bool use_log; /* log transaction latencies to a file */
+bool use_quiet; /* quiet logging onto stderr */
+int agg_interval; /* log aggregates instead of individual
+ * transactions */
+bool per_script_stats = false; /* whether to collect stats per script */
+int progress = 0; /* thread progress report every this seconds */
+bool progress_timestamp = false; /* progress report with Unix time */
+int nclients = 1; /* number of clients */
+int nthreads = 1; /* number of threads */
+bool is_connect; /* establish connection for each transaction */
+bool report_per_command = false; /* report per-command latencies,
+ * retries after errors and failures
+ * (errors without retrying) */
+int main_pid; /* main process id used in log filename */
+
+/*
+ * There are different types of restrictions for deciding that the current
+ * transaction with a serialization/deadlock error can no longer be retried and
+ * should be reported as failed:
+ * - max_tries (--max-tries) can be used to limit the number of tries;
+ * - latency_limit (-L) can be used to limit the total time of tries;
+ * - duration (-T) can be used to limit the total benchmark time.
+ *
+ * They can be combined together, and you need to use at least one of them to
+ * retry the transactions with serialization/deadlock errors. If none of them is
+ * used, the default value of max_tries is 1 and such transactions will not be
+ * retried.
+ */
+
+/*
+ * We cannot retry a transaction after the serialization/deadlock error if its
+ * number of tries reaches this maximum; if its value is zero, it is not used.
+ */
+uint32 max_tries = 1;
+
+bool failures_detailed = false; /* whether to group failures in
+ * reports or logs by basic types */
+
+const char *pghost = NULL;
+const char *pgport = NULL;
+const char *username = NULL;
+const char *dbName = NULL;
+char *logfile_prefix = NULL;
+const char *progname;
+
+#define WSEP '@' /* weight separator */
+
+volatile sig_atomic_t timer_exceeded = false; /* flag from signal handler */
+
+/*
+ * We don't want to allocate variables one by one; for efficiency, add a
+ * constant margin each time it overflows.
+ */
+#define VARIABLES_ALLOC_MARGIN 8
+
+/*
+ * Variable definitions.
+ *
+ * If a variable only has a string value, "svalue" is that value, and value is
+ * "not set". If the value is known, "value" contains the value (in any
+ * variant).
+ *
+ * In this case "svalue" contains the string equivalent of the value, if we've
+ * had occasion to compute that, or NULL if we haven't.
+ */
+typedef struct
+{
+ char *name; /* variable's name */
+ char *svalue; /* its value in string form, if known */
+ PgBenchValue value; /* actual variable's value */
+} Variable;
+
+/*
+ * Data structure for client variables.
+ */
+typedef struct
+{
+ Variable *vars; /* array of variable definitions */
+ int nvars; /* number of variables */
+
+ /*
+ * The maximum number of variables that we can currently store in 'vars'
+ * without having to reallocate more space. We must always have max_vars
+ * >= nvars.
+ */
+ int max_vars;
+
+ bool vars_sorted; /* are variables sorted by name? */
+} Variables;
+
+#define MAX_SCRIPTS 128 /* max number of SQL scripts allowed */
+#define SHELL_COMMAND_SIZE 256 /* maximum size allowed for shell command */
+
+/*
+ * Simple data structure to keep stats about something.
+ *
+ * XXX probably the first value should be kept and used as an offset for
+ * better numerical stability...
+ */
+typedef struct SimpleStats
+{
+ int64 count; /* how many values were encountered */
+ double min; /* the minimum seen */
+ double max; /* the maximum seen */
+ double sum; /* sum of values */
+ double sum2; /* sum of squared values */
+} SimpleStats;
+
+/*
+ * The instr_time type is expensive when dealing with time arithmetic. Define
+ * a type to hold microseconds instead. Type int64 is good enough for about
+ * 584500 years.
+ */
+typedef int64 pg_time_usec_t;
+
+/*
+ * Data structure to hold various statistics: per-thread and per-script stats
+ * are maintained and merged together.
+ */
+typedef struct StatsData
+{
+ pg_time_usec_t start_time; /* interval start time, for aggregates */
+
+ /*----------
+ * Transactions are counted depending on their execution and outcome.
+ * First a transaction may have started or not: skipped transactions occur
+ * under --rate and --latency-limit when the client is too late to execute
+ * them. Secondly, a started transaction may ultimately succeed or fail,
+ * possibly after some retries when --max-tries is not one. Thus
+ *
+ * the number of all transactions =
+ * 'skipped' (it was too late to execute them) +
+ * 'cnt' (the number of successful transactions) +
+ * 'failed' (the number of failed transactions).
+ *
+ * A successful transaction can have several unsuccessful tries before a
+ * successful run. Thus
+ *
+ * 'cnt' (the number of successful transactions) =
+ * successfully retried transactions (they got a serialization or a
+ * deadlock error(s), but were
+ * successfully retried from the very
+ * beginning) +
+ * directly successful transactions (they were successfully completed on
+ * the first try).
+ *
+ * A failed transaction is defined as unsuccessfully retried transactions.
+ * It can be one of two types:
+ *
+ * failed (the number of failed transactions) =
+ * 'serialization_failures' (they got a serialization error and were not
+ * successfully retried) +
+ * 'deadlock_failures' (they got a deadlock error and were not
+ * successfully retried).
+ *
+ * If the transaction was retried after a serialization or a deadlock
+ * error this does not guarantee that this retry was successful. Thus
+ *
+ * 'retries' (number of retries) =
+ * number of retries in all retried transactions =
+ * number of retries in (successfully retried transactions +
+ * failed transactions);
+ *
+ * 'retried' (number of all retried transactions) =
+ * successfully retried transactions +
+ * failed transactions.
+ *----------
+ */
+ int64 cnt; /* number of successful transactions, not
+ * including 'skipped' */
+ int64 skipped; /* number of transactions skipped under --rate
+ * and --latency-limit */
+ int64 retries; /* number of retries after a serialization or
+ * a deadlock error in all the transactions */
+ int64 retried; /* number of all transactions that were
+ * retried after a serialization or a deadlock
+ * error (perhaps the last try was
+ * unsuccessful) */
+ int64 serialization_failures; /* number of transactions that were
+ * not successfully retried after a
+ * serialization error */
+ int64 deadlock_failures; /* number of transactions that were not
+ * successfully retried after a deadlock
+ * error */
+ SimpleStats latency;
+ SimpleStats lag;
+} StatsData;
+
+/*
+ * For displaying Unix epoch timestamps, as some time functions may have
+ * another reference.
+ */
+pg_time_usec_t epoch_shift;
+
+/*
+ * Error status for errors during script execution.
+ */
+typedef enum EStatus
+{
+ ESTATUS_NO_ERROR = 0,
+ ESTATUS_META_COMMAND_ERROR,
+
+ /* SQL errors */
+ ESTATUS_SERIALIZATION_ERROR,
+ ESTATUS_DEADLOCK_ERROR,
+ ESTATUS_OTHER_SQL_ERROR
+} EStatus;
+
+/*
+ * Transaction status at the end of a command.
+ */
+typedef enum TStatus
+{
+ TSTATUS_IDLE,
+ TSTATUS_IN_BLOCK,
+ TSTATUS_CONN_ERROR,
+ TSTATUS_OTHER_ERROR
+} TStatus;
+
+/* Various random sequences are initialized from this one. */
+static pg_prng_state base_random_sequence;
+
+/* Synchronization barrier for start and connection */
+static THREAD_BARRIER_T barrier;
+
+/*
+ * Connection state machine states.
+ */
+typedef enum
+{
+ /*
+ * The client must first choose a script to execute. Once chosen, it can
+ * either be throttled (state CSTATE_PREPARE_THROTTLE under --rate), start
+ * right away (state CSTATE_START_TX) or not start at all if the timer was
+ * exceeded (state CSTATE_FINISHED).
+ */
+ CSTATE_CHOOSE_SCRIPT,
+
+ /*
+ * CSTATE_START_TX performs start-of-transaction processing. Establishes
+ * a new connection for the transaction in --connect mode, records the
+ * transaction start time, and proceed to the first command.
+ *
+ * Note: once a script is started, it will either error or run till its
+ * end, where it may be interrupted. It is not interrupted while running,
+ * so pgbench --time is to be understood as tx are allowed to start in
+ * that time, and will finish when their work is completed.
+ */
+ CSTATE_START_TX,
+
+ /*
+ * In CSTATE_PREPARE_THROTTLE state, we calculate when to begin the next
+ * transaction, and advance to CSTATE_THROTTLE. CSTATE_THROTTLE state
+ * sleeps until that moment, then advances to CSTATE_START_TX, or
+ * CSTATE_FINISHED if the next transaction would start beyond the end of
+ * the run.
+ */
+ CSTATE_PREPARE_THROTTLE,
+ CSTATE_THROTTLE,
+
+ /*
+ * We loop through these states, to process each command in the script:
+ *
+ * CSTATE_START_COMMAND starts the execution of a command. On a SQL
+ * command, the command is sent to the server, and we move to
+ * CSTATE_WAIT_RESULT state unless in pipeline mode. On a \sleep
+ * meta-command, the timer is set, and we enter the CSTATE_SLEEP state to
+ * wait for it to expire. Other meta-commands are executed immediately. If
+ * the command about to start is actually beyond the end of the script,
+ * advance to CSTATE_END_TX.
+ *
+ * CSTATE_WAIT_RESULT waits until we get a result set back from the server
+ * for the current command.
+ *
+ * CSTATE_SLEEP waits until the end of \sleep.
+ *
+ * CSTATE_END_COMMAND records the end-of-command timestamp, increments the
+ * command counter, and loops back to CSTATE_START_COMMAND state.
+ *
+ * CSTATE_SKIP_COMMAND is used by conditional branches which are not
+ * executed. It quickly skip commands that do not need any evaluation.
+ * This state can move forward several commands, till there is something
+ * to do or the end of the script.
+ */
+ CSTATE_START_COMMAND,
+ CSTATE_WAIT_RESULT,
+ CSTATE_SLEEP,
+ CSTATE_END_COMMAND,
+ CSTATE_SKIP_COMMAND,
+
+ /*
+ * States for failed commands.
+ *
+ * If the SQL/meta command fails, in CSTATE_ERROR clean up after an error:
+ * (1) clear the conditional stack; (2) if we have an unterminated
+ * (possibly failed) transaction block, send the rollback command to the
+ * server and wait for the result in CSTATE_WAIT_ROLLBACK_RESULT. If
+ * something goes wrong with rolling back, go to CSTATE_ABORTED.
+ *
+ * But if everything is ok we are ready for future transactions: if this
+ * is a serialization or deadlock error and we can re-execute the
+ * transaction from the very beginning, go to CSTATE_RETRY; otherwise go
+ * to CSTATE_FAILURE.
+ *
+ * In CSTATE_RETRY report an error, set the same parameters for the
+ * transaction execution as in the previous tries and process the first
+ * transaction command in CSTATE_START_COMMAND.
+ *
+ * In CSTATE_FAILURE report a failure, set the parameters for the
+ * transaction execution as they were before the first run of this
+ * transaction (except for a random state) and go to CSTATE_END_TX to
+ * complete this transaction.
+ */
+ CSTATE_ERROR,
+ CSTATE_WAIT_ROLLBACK_RESULT,
+ CSTATE_RETRY,
+ CSTATE_FAILURE,
+
+ /*
+ * CSTATE_END_TX performs end-of-transaction processing. It calculates
+ * latency, and logs the transaction. In --connect mode, it closes the
+ * current connection.
+ *
+ * Then either starts over in CSTATE_CHOOSE_SCRIPT, or enters
+ * CSTATE_FINISHED if we have no more work to do.
+ */
+ CSTATE_END_TX,
+
+ /*
+ * Final states. CSTATE_ABORTED means that the script execution was
+ * aborted because a command failed, CSTATE_FINISHED means success.
+ */
+ CSTATE_ABORTED,
+ CSTATE_FINISHED
+} ConnectionStateEnum;
+
+/*
+ * Connection state.
+ */
+typedef struct
+{
+ PGconn *con; /* connection handle to DB */
+ int id; /* client No. */
+ ConnectionStateEnum state; /* state machine's current state. */
+ ConditionalStack cstack; /* enclosing conditionals state */
+
+ /*
+ * Separate randomness for each client. This is used for random functions
+ * PGBENCH_RANDOM_* during the execution of the script.
+ */
+ pg_prng_state cs_func_rs;
+
+ int use_file; /* index in sql_script for this client */
+ int command; /* command number in script */
+
+ /* client variables */
+ Variables variables;
+
+ /* various times about current transaction in microseconds */
+ pg_time_usec_t txn_scheduled; /* scheduled start time of transaction */
+ pg_time_usec_t sleep_until; /* scheduled start time of next cmd */
+ pg_time_usec_t txn_begin; /* used for measuring schedule lag times */
+ pg_time_usec_t stmt_begin; /* used for measuring statement latencies */
+
+ /* whether client prepared each command of each script */
+ bool **prepared;
+
+ /*
+ * For processing failures and repeating transactions with serialization
+ * or deadlock errors:
+ */
+ EStatus estatus; /* the error status of the current transaction
+ * execution; this is ESTATUS_NO_ERROR if
+ * there were no errors */
+ pg_prng_state random_state; /* random state */
+ uint32 tries; /* how many times have we already tried the
+ * current transaction? */
+
+ /* per client collected stats */
+ int64 cnt; /* client transaction count, for -t; skipped
+ * and failed transactions are also counted
+ * here */
+} CState;
+
+/*
+ * Thread state
+ */
+typedef struct
+{
+ int tid; /* thread id */
+ THREAD_T thread; /* thread handle */
+ CState *state; /* array of CState */
+ int nstate; /* length of state[] */
+
+ /*
+ * Separate randomness for each thread. Each thread option uses its own
+ * random state to make all of them independent of each other and
+ * therefore deterministic at the thread level.
+ */
+ pg_prng_state ts_choose_rs; /* random state for selecting a script */
+ pg_prng_state ts_throttle_rs; /* random state for transaction throttling */
+ pg_prng_state ts_sample_rs; /* random state for log sampling */
+
+ int64 throttle_trigger; /* previous/next throttling (us) */
+ FILE *logfile; /* where to log, or NULL */
+
+ /* per thread collected stats in microseconds */
+ pg_time_usec_t create_time; /* thread creation time */
+ pg_time_usec_t started_time; /* thread is running */
+ pg_time_usec_t bench_start; /* thread is benchmarking */
+ pg_time_usec_t conn_duration; /* cumulated connection and disconnection
+ * delays */
+
+ StatsData stats;
+ int64 latency_late; /* count executed but late transactions */
+} TState;
+
+/*
+ * queries read from files
+ */
+#define SQL_COMMAND 1
+#define META_COMMAND 2
+
+/*
+ * max number of backslash command arguments or SQL variables,
+ * including the command or SQL statement itself
+ */
+#define MAX_ARGS 256
+
+typedef enum MetaCommand
+{
+ META_NONE, /* not a known meta-command */
+ META_SET, /* \set */
+ META_SETSHELL, /* \setshell */
+ META_SHELL, /* \shell */
+ META_SLEEP, /* \sleep */
+ META_GSET, /* \gset */
+ META_ASET, /* \aset */
+ META_IF, /* \if */
+ META_ELIF, /* \elif */
+ META_ELSE, /* \else */
+ META_ENDIF, /* \endif */
+ META_STARTPIPELINE, /* \startpipeline */
+ META_ENDPIPELINE /* \endpipeline */
+} MetaCommand;
+
+typedef enum QueryMode
+{
+ QUERY_SIMPLE, /* simple query */
+ QUERY_EXTENDED, /* extended query */
+ QUERY_PREPARED, /* extended query with prepared statements */
+ NUM_QUERYMODE
+} QueryMode;
+
+static QueryMode querymode = QUERY_SIMPLE;
+static const char *QUERYMODE[] = {"simple", "extended", "prepared"};
+
+/*
+ * struct Command represents one command in a script.
+ *
+ * lines The raw, possibly multi-line command text. Variable substitution
+ * not applied.
+ * first_line A short, single-line extract of 'lines', for error reporting.
+ * type SQL_COMMAND or META_COMMAND
+ * meta The type of meta-command, with META_NONE/GSET/ASET if command
+ * is SQL.
+ * argc Number of arguments of the command, 0 if not yet processed.
+ * argv Command arguments, the first of which is the command or SQL
+ * string itself. For SQL commands, after post-processing
+ * argv[0] is the same as 'lines' with variables substituted.
+ * prepname The name that this command is prepared under, in prepare mode
+ * varprefix SQL commands terminated with \gset or \aset have this set
+ * to a non NULL value. If nonempty, it's used to prefix the
+ * variable name that receives the value.
+ * aset do gset on all possible queries of a combined query (\;).
+ * expr Parsed expression, if needed.
+ * stats Time spent in this command.
+ * retries Number of retries after a serialization or deadlock error in the
+ * current command.
+ * failures Number of errors in the current command that were not retried.
+ */
+typedef struct Command
+{
+ PQExpBufferData lines;
+ char *first_line;
+ int type;
+ MetaCommand meta;
+ int argc;
+ char *argv[MAX_ARGS];
+ char *prepname;
+ char *varprefix;
+ PgBenchExpr *expr;
+ SimpleStats stats;
+ int64 retries;
+ int64 failures;
+} Command;
+
+typedef struct ParsedScript
+{
+ const char *desc; /* script descriptor (eg, file name) */
+ int weight; /* selection weight */
+ Command **commands; /* NULL-terminated array of Commands */
+ StatsData stats; /* total time spent in script */
+} ParsedScript;
+
+static ParsedScript sql_script[MAX_SCRIPTS]; /* SQL script files */
+static int num_scripts; /* number of scripts in sql_script[] */
+static int64 total_weight = 0;
+
+static bool verbose_errors = false; /* print verbose messages of all errors */
+
+/* Builtin test scripts */
+typedef struct BuiltinScript
+{
+ const char *name; /* very short name for -b ... */
+ const char *desc; /* short description */
+ const char *script; /* actual pgbench script */
+} BuiltinScript;
+
+static const BuiltinScript builtin_script[] =
+{
+ {
+ "tpcb-like",
+ "<builtin: TPC-B (sort of)>",
+ "\\set aid random(1, " CppAsString2(naccounts) " * :scale)\n"
+ "\\set bid random(1, " CppAsString2(nbranches) " * :scale)\n"
+ "\\set tid random(1, " CppAsString2(ntellers) " * :scale)\n"
+ "\\set delta random(-5000, 5000)\n"
+ "BEGIN;\n"
+ "UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;\n"
+ "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
+ "UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;\n"
+ "UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;\n"
+ "INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
+ "END;\n"
+ },
+ {
+ "simple-update",
+ "<builtin: simple update>",
+ "\\set aid random(1, " CppAsString2(naccounts) " * :scale)\n"
+ "\\set bid random(1, " CppAsString2(nbranches) " * :scale)\n"
+ "\\set tid random(1, " CppAsString2(ntellers) " * :scale)\n"
+ "\\set delta random(-5000, 5000)\n"
+ "BEGIN;\n"
+ "UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;\n"
+ "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
+ "INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
+ "END;\n"
+ },
+ {
+ "select-only",
+ "<builtin: select only>",
+ "\\set aid random(1, " CppAsString2(naccounts) " * :scale)\n"
+ "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
+ }
+};
+
+
+/* Function prototypes */
+static void setNullValue(PgBenchValue *pv);
+static void setBoolValue(PgBenchValue *pv, bool bval);
+static void setIntValue(PgBenchValue *pv, int64 ival);
+static void setDoubleValue(PgBenchValue *pv, double dval);
+static bool evaluateExpr(CState *st, PgBenchExpr *expr,
+ PgBenchValue *retval);
+static ConnectionStateEnum executeMetaCommand(CState *st, pg_time_usec_t *now);
+static void doLog(TState *thread, CState *st,
+ StatsData *agg, bool skipped, double latency, double lag);
+static void processXactStats(TState *thread, CState *st, pg_time_usec_t *now,
+ bool skipped, StatsData *agg);
+static void addScript(const ParsedScript *script);
+static THREAD_FUNC_RETURN_TYPE THREAD_FUNC_CC threadRun(void *arg);
+static void finishCon(CState *st);
+static void setalarm(int seconds);
+static socket_set *alloc_socket_set(int count);
+static void free_socket_set(socket_set *sa);
+static void clear_socket_set(socket_set *sa);
+static void add_socket_to_set(socket_set *sa, int fd, int idx);
+static int wait_on_socket_set(socket_set *sa, int64 usecs);
+static bool socket_has_input(socket_set *sa, int fd, int idx);
+
+
+/* callback functions for our flex lexer */
+static const PsqlScanCallbacks pgbench_callbacks = {
+ NULL, /* don't need get_variable functionality */
+};
+
+static inline pg_time_usec_t
+pg_time_now(void)
+{
+ instr_time now;
+
+ INSTR_TIME_SET_CURRENT(now);
+
+ return (pg_time_usec_t) INSTR_TIME_GET_MICROSEC(now);
+}
+
+static inline void
+pg_time_now_lazy(pg_time_usec_t *now)
+{
+ if ((*now) == 0)
+ (*now) = pg_time_now();
+}
+
+#define PG_TIME_GET_DOUBLE(t) (0.000001 * (t))
+
+static void
+usage(void)
+{
+ printf("%s is a benchmarking tool for PostgreSQL.\n\n"
+ "Usage:\n"
+ " %s [OPTION]... [DBNAME]\n"
+ "\nInitialization options:\n"
+ " -i, --initialize invokes initialization mode\n"
+ " -I, --init-steps=[" ALL_INIT_STEPS "]+ (default \"" DEFAULT_INIT_STEPS "\")\n"
+ " run selected initialization steps\n"
+ " -F, --fillfactor=NUM set fill factor\n"
+ " -n, --no-vacuum do not run VACUUM during initialization\n"
+ " -q, --quiet quiet logging (one message each 5 seconds)\n"
+ " -s, --scale=NUM scaling factor\n"
+ " --foreign-keys create foreign key constraints between tables\n"
+ " --index-tablespace=TABLESPACE\n"
+ " create indexes in the specified tablespace\n"
+ " --partition-method=(range|hash)\n"
+ " partition pgbench_accounts with this method (default: range)\n"
+ " --partitions=NUM partition pgbench_accounts into NUM parts (default: 0)\n"
+ " --tablespace=TABLESPACE create tables in the specified tablespace\n"
+ " --unlogged-tables create tables as unlogged tables\n"
+ "\nOptions to select what to run:\n"
+ " -b, --builtin=NAME[@W] add builtin script NAME weighted at W (default: 1)\n"
+ " (use \"-b list\" to list available scripts)\n"
+ " -f, --file=FILENAME[@W] add script FILENAME weighted at W (default: 1)\n"
+ " -N, --skip-some-updates skip updates of pgbench_tellers and pgbench_branches\n"
+ " (same as \"-b simple-update\")\n"
+ " -S, --select-only perform SELECT-only transactions\n"
+ " (same as \"-b select-only\")\n"
+ "\nBenchmarking options:\n"
+ " -c, --client=NUM number of concurrent database clients (default: 1)\n"
+ " -C, --connect establish new connection for each transaction\n"
+ " -D, --define=VARNAME=VALUE\n"
+ " define variable for use by custom script\n"
+ " -j, --jobs=NUM number of threads (default: 1)\n"
+ " -l, --log write transaction times to log file\n"
+ " -L, --latency-limit=NUM count transactions lasting more than NUM ms as late\n"
+ " -M, --protocol=simple|extended|prepared\n"
+ " protocol for submitting queries (default: simple)\n"
+ " -n, --no-vacuum do not run VACUUM before tests\n"
+ " -P, --progress=NUM show thread progress report every NUM seconds\n"
+ " -r, --report-per-command report latencies, failures, and retries per command\n"
+ " -R, --rate=NUM target rate in transactions per second\n"
+ " -s, --scale=NUM report this scale factor in output\n"
+ " -t, --transactions=NUM number of transactions each client runs (default: 10)\n"
+ " -T, --time=NUM duration of benchmark test in seconds\n"
+ " -v, --vacuum-all vacuum all four standard tables before tests\n"
+ " --aggregate-interval=NUM aggregate data over NUM seconds\n"
+ " --failures-detailed report the failures grouped by basic types\n"
+ " --log-prefix=PREFIX prefix for transaction time log file\n"
+ " (default: \"pgbench_log\")\n"
+ " --max-tries=NUM max number of tries to run transaction (default: 1)\n"
+ " --progress-timestamp use Unix epoch timestamps for progress\n"
+ " --random-seed=SEED set random seed (\"time\", \"rand\", integer)\n"
+ " --sampling-rate=NUM fraction of transactions to log (e.g., 0.01 for 1%%)\n"
+ " --show-script=NAME show builtin script code, then exit\n"
+ " --verbose-errors print messages of all errors\n"
+ "\nCommon options:\n"
+ " -d, --debug print debugging output\n"
+ " -h, --host=HOSTNAME database server host or socket directory\n"
+ " -p, --port=PORT database server port number\n"
+ " -U, --username=USERNAME connect as specified database user\n"
+ " -V, --version output version information, then exit\n"
+ " -?, --help show this help, then exit\n"
+ "\n"
+ "Report bugs to <%s>.\n"
+ "%s home page: <%s>\n",
+ progname, progname, PACKAGE_BUGREPORT, PACKAGE_NAME, PACKAGE_URL);
+}
+
+/* return whether str matches "^\s*[-+]?[0-9]+$" */
+static bool
+is_an_int(const char *str)
+{
+ const char *ptr = str;
+
+ /* skip leading spaces; cast is consistent with strtoint64 */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* skip sign */
+ if (*ptr == '+' || *ptr == '-')
+ ptr++;
+
+ /* at least one digit */
+ if (*ptr && !isdigit((unsigned char) *ptr))
+ return false;
+
+ /* eat all digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ ptr++;
+
+ /* must have reached end of string */
+ return *ptr == '\0';
+}
+
+
+/*
+ * strtoint64 -- convert a string to 64-bit integer
+ *
+ * This function is a slightly modified version of pg_strtoint64() from
+ * src/backend/utils/adt/numutils.c.
+ *
+ * The function returns whether the conversion worked, and if so
+ * "*result" is set to the result.
+ *
+ * If not errorOK, an error message is also printed out on errors.
+ */
+bool
+strtoint64(const char *str, bool errorOK, int64 *result)
+{
+ const char *ptr = str;
+ int64 tmp = 0;
+ bool neg = false;
+
+ /*
+ * Do our own scan, rather than relying on sscanf which might be broken
+ * for long long.
+ *
+ * As INT64_MIN can't be stored as a positive 64 bit integer, accumulate
+ * value as a negative number.
+ */
+
+ /* skip leading spaces */
+ while (*ptr && isspace((unsigned char) *ptr))
+ ptr++;
+
+ /* handle sign */
+ if (*ptr == '-')
+ {
+ ptr++;
+ neg = true;
+ }
+ else if (*ptr == '+')
+ ptr++;
+
+ /* require at least one digit */
+ if (unlikely(!isdigit((unsigned char) *ptr)))
+ goto invalid_syntax;
+
+ /* process digits */
+ while (*ptr && isdigit((unsigned char) *ptr))
+ {
+ int8 digit = (*ptr++ - '0');
+
+ if (unlikely(pg_mul_s64_overflow(tmp, 10, &tmp)) ||
+ unlikely(pg_sub_s64_overflow(tmp, digit, &tmp)))
+ goto out_of_range;
+ }
+
+ /* allow trailing whitespace, but not other trailing chars */
+ while (*ptr != '\0' && isspace((unsigned char) *ptr))
+ ptr++;
+
+ if (unlikely(*ptr != '\0'))
+ goto invalid_syntax;
+
+ if (!neg)
+ {
+ if (unlikely(tmp == PG_INT64_MIN))
+ goto out_of_range;
+ tmp = -tmp;
+ }
+
+ *result = tmp;
+ return true;
+
+out_of_range:
+ if (!errorOK)
+ pg_log_error("value \"%s\" is out of range for type bigint", str);
+ return false;
+
+invalid_syntax:
+ if (!errorOK)
+ pg_log_error("invalid input syntax for type bigint: \"%s\"", str);
+ return false;
+}
+
+/* convert string to double, detecting overflows/underflows */
+bool
+strtodouble(const char *str, bool errorOK, double *dv)
+{
+ char *end;
+
+ errno = 0;
+ *dv = strtod(str, &end);
+
+ if (unlikely(errno != 0))
+ {
+ if (!errorOK)
+ pg_log_error("value \"%s\" is out of range for type double", str);
+ return false;
+ }
+
+ if (unlikely(end == str || *end != '\0'))
+ {
+ if (!errorOK)
+ pg_log_error("invalid input syntax for type double: \"%s\"", str);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Initialize a prng state struct.
+ *
+ * We derive the seed from base_random_sequence, which must be set up already.
+ */
+static void
+initRandomState(pg_prng_state *state)
+{
+ pg_prng_seed(state, pg_prng_uint64(&base_random_sequence));
+}
+
+
+/*
+ * random number generator: uniform distribution from min to max inclusive.
+ *
+ * Although the limits are expressed as int64, you can't generate the full
+ * int64 range in one call, because the difference of the limits mustn't
+ * overflow int64. This is not checked.
+ */
+static int64
+getrand(pg_prng_state *state, int64 min, int64 max)
+{
+ return min + (int64) pg_prng_uint64_range(state, 0, max - min);
+}
+
+/*
+ * random number generator: exponential distribution from min to max inclusive.
+ * the parameter is so that the density of probability for the last cut-off max
+ * value is exp(-parameter).
+ */
+static int64
+getExponentialRand(pg_prng_state *state, int64 min, int64 max,
+ double parameter)
+{
+ double cut,
+ uniform,
+ rand;
+
+ /* abort if wrong parameter, but must really be checked beforehand */
+ Assert(parameter > 0.0);
+ cut = exp(-parameter);
+ /* pg_prng_double value in [0, 1), uniform in (0, 1] */
+ uniform = 1.0 - pg_prng_double(state);
+
+ /*
+ * inner expression in (cut, 1] (if parameter > 0), rand in [0, 1)
+ */
+ Assert((1.0 - cut) != 0.0);
+ rand = -log(cut + (1.0 - cut) * uniform) / parameter;
+ /* return int64 random number within between min and max */
+ return min + (int64) ((max - min + 1) * rand);
+}
+
+/* random number generator: gaussian distribution from min to max inclusive */
+static int64
+getGaussianRand(pg_prng_state *state, int64 min, int64 max,
+ double parameter)
+{
+ double stdev;
+ double rand;
+
+ /* abort if parameter is too low, but must really be checked beforehand */
+ Assert(parameter >= MIN_GAUSSIAN_PARAM);
+
+ /*
+ * Get normally-distributed random number in the range -parameter <= stdev
+ * < parameter.
+ *
+ * This loop is executed until the number is in the expected range.
+ *
+ * As the minimum parameter is 2.0, the probability of looping is low:
+ * sqrt(-2 ln(r)) <= 2 => r >= e^{-2} ~ 0.135, then when taking the
+ * average sinus multiplier as 2/pi, we have a 8.6% looping probability in
+ * the worst case. For a parameter value of 5.0, the looping probability
+ * is about e^{-5} * 2 / pi ~ 0.43%.
+ */
+ do
+ {
+ stdev = pg_prng_double_normal(state);
+ }
+ while (stdev < -parameter || stdev >= parameter);
+
+ /* stdev is in [-parameter, parameter), normalization to [0,1) */
+ rand = (stdev + parameter) / (parameter * 2.0);
+
+ /* return int64 random number within between min and max */
+ return min + (int64) ((max - min + 1) * rand);
+}
+
+/*
+ * random number generator: generate a value, such that the series of values
+ * will approximate a Poisson distribution centered on the given value.
+ *
+ * Individual results are rounded to integers, though the center value need
+ * not be one.
+ */
+static int64
+getPoissonRand(pg_prng_state *state, double center)
+{
+ /*
+ * Use inverse transform sampling to generate a value > 0, such that the
+ * expected (i.e. average) value is the given argument.
+ */
+ double uniform;
+
+ /* pg_prng_double value in [0, 1), uniform in (0, 1] */
+ uniform = 1.0 - pg_prng_double(state);
+
+ return (int64) (-log(uniform) * center + 0.5);
+}
+
+/*
+ * Computing zipfian using rejection method, based on
+ * "Non-Uniform Random Variate Generation",
+ * Luc Devroye, p. 550-551, Springer 1986.
+ *
+ * This works for s > 1.0, but may perform badly for s very close to 1.0.
+ */
+static int64
+computeIterativeZipfian(pg_prng_state *state, int64 n, double s)
+{
+ double b = pow(2.0, s - 1.0);
+ double x,
+ t,
+ u,
+ v;
+
+ /* Ensure n is sane */
+ if (n <= 1)
+ return 1;
+
+ while (true)
+ {
+ /* random variates */
+ u = pg_prng_double(state);
+ v = pg_prng_double(state);
+
+ x = floor(pow(u, -1.0 / (s - 1.0)));
+
+ t = pow(1.0 + 1.0 / x, s - 1.0);
+ /* reject if too large or out of bound */
+ if (v * x * (t - 1.0) / (b - 1.0) <= t / b && x <= n)
+ break;
+ }
+ return (int64) x;
+}
+
+/* random number generator: zipfian distribution from min to max inclusive */
+static int64
+getZipfianRand(pg_prng_state *state, int64 min, int64 max, double s)
+{
+ int64 n = max - min + 1;
+
+ /* abort if parameter is invalid */
+ Assert(MIN_ZIPFIAN_PARAM <= s && s <= MAX_ZIPFIAN_PARAM);
+
+ return min - 1 + computeIterativeZipfian(state, n, s);
+}
+
+/*
+ * FNV-1a hash function
+ */
+static int64
+getHashFnv1a(int64 val, uint64 seed)
+{
+ int64 result;
+ int i;
+
+ result = FNV_OFFSET_BASIS ^ seed;
+ for (i = 0; i < 8; ++i)
+ {
+ int32 octet = val & 0xff;
+
+ val = val >> 8;
+ result = result ^ octet;
+ result = result * FNV_PRIME;
+ }
+
+ return result;
+}
+
+/*
+ * Murmur2 hash function
+ *
+ * Based on original work of Austin Appleby
+ * https://github.com/aappleby/smhasher/blob/master/src/MurmurHash2.cpp
+ */
+static int64
+getHashMurmur2(int64 val, uint64 seed)
+{
+ uint64 result = seed ^ MM2_MUL_TIMES_8; /* sizeof(int64) */
+ uint64 k = (uint64) val;
+
+ k *= MM2_MUL;
+ k ^= k >> MM2_ROT;
+ k *= MM2_MUL;
+
+ result ^= k;
+ result *= MM2_MUL;
+
+ result ^= result >> MM2_ROT;
+ result *= MM2_MUL;
+ result ^= result >> MM2_ROT;
+
+ return (int64) result;
+}
+
+/*
+ * Pseudorandom permutation function
+ *
+ * For small sizes, this generates each of the (size!) possible permutations
+ * of integers in the range [0, size) with roughly equal probability. Once
+ * the size is larger than 20, the number of possible permutations exceeds the
+ * number of distinct states of the internal pseudorandom number generator,
+ * and so not all possible permutations can be generated, but the permutations
+ * chosen should continue to give the appearance of being random.
+ *
+ * THIS FUNCTION IS NOT CRYPTOGRAPHICALLY SECURE.
+ * DO NOT USE FOR SUCH PURPOSE.
+ */
+static int64
+permute(const int64 val, const int64 isize, const int64 seed)
+{
+ /* using a high-end PRNG is probably overkill */
+ pg_prng_state state;
+ uint64 size;
+ uint64 v;
+ int masklen;
+ uint64 mask;
+ int i;
+
+ if (isize < 2)
+ return 0; /* nothing to permute */
+
+ /* Initialize prng state using the seed */
+ pg_prng_seed(&state, (uint64) seed);
+
+ /* Computations are performed on unsigned values */
+ size = (uint64) isize;
+ v = (uint64) val % size;
+
+ /* Mask to work modulo largest power of 2 less than or equal to size */
+ masklen = pg_leftmost_one_pos64(size);
+ mask = (((uint64) 1) << masklen) - 1;
+
+ /*
+ * Permute the input value by applying several rounds of pseudorandom
+ * bijective transformations. The intention here is to distribute each
+ * input uniformly randomly across the range, and separate adjacent inputs
+ * approximately uniformly randomly from each other, leading to a fairly
+ * random overall choice of permutation.
+ *
+ * To separate adjacent inputs, we multiply by a random number modulo
+ * (mask + 1), which is a power of 2. For this to be a bijection, the
+ * multiplier must be odd. Since this is known to lead to less randomness
+ * in the lower bits, we also apply a rotation that shifts the topmost bit
+ * into the least significant bit. In the special cases where size <= 3,
+ * mask = 1 and each of these operations is actually a no-op, so we also
+ * XOR the value with a different random number to inject additional
+ * randomness. Since the size is generally not a power of 2, we apply
+ * this bijection on overlapping upper and lower halves of the input.
+ *
+ * To distribute the inputs uniformly across the range, we then also apply
+ * a random offset modulo the full range.
+ *
+ * Taken together, these operations resemble a modified linear
+ * congruential generator, as is commonly used in pseudorandom number
+ * generators. The number of rounds is fairly arbitrary, but six has been
+ * found empirically to give a fairly good tradeoff between performance
+ * and uniform randomness. For small sizes it selects each of the (size!)
+ * possible permutations with roughly equal probability. For larger
+ * sizes, not all permutations can be generated, but the intended random
+ * spread is still produced.
+ */
+ for (i = 0; i < 6; i++)
+ {
+ uint64 m,
+ r,
+ t;
+
+ /* Random multiply (by an odd number), XOR and rotate of lower half */
+ m = (pg_prng_uint64(&state) & mask) | 1;
+ r = pg_prng_uint64(&state) & mask;
+ if (v <= mask)
+ {
+ v = ((v * m) ^ r) & mask;
+ v = ((v << 1) & mask) | (v >> (masklen - 1));
+ }
+
+ /* Random multiply (by an odd number), XOR and rotate of upper half */
+ m = (pg_prng_uint64(&state) & mask) | 1;
+ r = pg_prng_uint64(&state) & mask;
+ t = size - 1 - v;
+ if (t <= mask)
+ {
+ t = ((t * m) ^ r) & mask;
+ t = ((t << 1) & mask) | (t >> (masklen - 1));
+ v = size - 1 - t;
+ }
+
+ /* Random offset */
+ r = pg_prng_uint64_range(&state, 0, size - 1);
+ v = (v + r) % size;
+ }
+
+ return (int64) v;
+}
+
+/*
+ * Initialize the given SimpleStats struct to all zeroes
+ */
+static void
+initSimpleStats(SimpleStats *ss)
+{
+ memset(ss, 0, sizeof(SimpleStats));
+}
+
+/*
+ * Accumulate one value into a SimpleStats struct.
+ */
+static void
+addToSimpleStats(SimpleStats *ss, double val)
+{
+ if (ss->count == 0 || val < ss->min)
+ ss->min = val;
+ if (ss->count == 0 || val > ss->max)
+ ss->max = val;
+ ss->count++;
+ ss->sum += val;
+ ss->sum2 += val * val;
+}
+
+/*
+ * Merge two SimpleStats objects
+ */
+static void
+mergeSimpleStats(SimpleStats *acc, SimpleStats *ss)
+{
+ if (acc->count == 0 || ss->min < acc->min)
+ acc->min = ss->min;
+ if (acc->count == 0 || ss->max > acc->max)
+ acc->max = ss->max;
+ acc->count += ss->count;
+ acc->sum += ss->sum;
+ acc->sum2 += ss->sum2;
+}
+
+/*
+ * Initialize a StatsData struct to mostly zeroes, with its start time set to
+ * the given value.
+ */
+static void
+initStats(StatsData *sd, pg_time_usec_t start)
+{
+ sd->start_time = start;
+ sd->cnt = 0;
+ sd->skipped = 0;
+ sd->retries = 0;
+ sd->retried = 0;
+ sd->serialization_failures = 0;
+ sd->deadlock_failures = 0;
+ initSimpleStats(&sd->latency);
+ initSimpleStats(&sd->lag);
+}
+
+/*
+ * Accumulate one additional item into the given stats object.
+ */
+static void
+accumStats(StatsData *stats, bool skipped, double lat, double lag,
+ EStatus estatus, int64 tries)
+{
+ /* Record the skipped transaction */
+ if (skipped)
+ {
+ /* no latency to record on skipped transactions */
+ stats->skipped++;
+ return;
+ }
+
+ /*
+ * Record the number of retries regardless of whether the transaction was
+ * successful or failed.
+ */
+ if (tries > 1)
+ {
+ stats->retries += (tries - 1);
+ stats->retried++;
+ }
+
+ switch (estatus)
+ {
+ /* Record the successful transaction */
+ case ESTATUS_NO_ERROR:
+ stats->cnt++;
+
+ addToSimpleStats(&stats->latency, lat);
+
+ /* and possibly the same for schedule lag */
+ if (throttle_delay)
+ addToSimpleStats(&stats->lag, lag);
+ break;
+
+ /* Record the failed transaction */
+ case ESTATUS_SERIALIZATION_ERROR:
+ stats->serialization_failures++;
+ break;
+ case ESTATUS_DEADLOCK_ERROR:
+ stats->deadlock_failures++;
+ break;
+ default:
+ /* internal error which should never occur */
+ pg_fatal("unexpected error status: %d", estatus);
+ }
+}
+
+/* call PQexec() and exit() on failure */
+static void
+executeStatement(PGconn *con, const char *sql)
+{
+ PGresult *res;
+
+ res = PQexec(con, sql);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("query failed: %s", PQerrorMessage(con));
+ pg_log_error_detail("Query was: %s", sql);
+ exit(1);
+ }
+ PQclear(res);
+}
+
+/* call PQexec() and complain, but without exiting, on failure */
+static void
+tryExecuteStatement(PGconn *con, const char *sql)
+{
+ PGresult *res;
+
+ res = PQexec(con, sql);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("%s", PQerrorMessage(con));
+ pg_log_error_detail("(ignoring this error and continuing anyway)");
+ }
+ PQclear(res);
+}
+
+/* set up a connection to the backend */
+static PGconn *
+doConnect(void)
+{
+ PGconn *conn;
+ bool new_pass;
+ static char *password = NULL;
+
+ /*
+ * Start the connection. Loop until we have a password if requested by
+ * backend.
+ */
+ do
+ {
+#define PARAMS_ARRAY_SIZE 7
+
+ const char *keywords[PARAMS_ARRAY_SIZE];
+ const char *values[PARAMS_ARRAY_SIZE];
+
+ keywords[0] = "host";
+ values[0] = pghost;
+ keywords[1] = "port";
+ values[1] = pgport;
+ keywords[2] = "user";
+ values[2] = username;
+ keywords[3] = "password";
+ values[3] = password;
+ keywords[4] = "dbname";
+ values[4] = dbName;
+ keywords[5] = "fallback_application_name";
+ values[5] = progname;
+ keywords[6] = NULL;
+ values[6] = NULL;
+
+ new_pass = false;
+
+ conn = PQconnectdbParams(keywords, values, true);
+
+ if (!conn)
+ {
+ pg_log_error("connection to database \"%s\" failed", dbName);
+ return NULL;
+ }
+
+ if (PQstatus(conn) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(conn) &&
+ !password)
+ {
+ PQfinish(conn);
+ password = simple_prompt("Password: ", false);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ /* check to see that the backend connection was successfully made */
+ if (PQstatus(conn) == CONNECTION_BAD)
+ {
+ pg_log_error("%s", PQerrorMessage(conn));
+ PQfinish(conn);
+ return NULL;
+ }
+
+ return conn;
+}
+
+/* qsort comparator for Variable array */
+static int
+compareVariableNames(const void *v1, const void *v2)
+{
+ return strcmp(((const Variable *) v1)->name,
+ ((const Variable *) v2)->name);
+}
+
+/* Locate a variable by name; returns NULL if unknown */
+static Variable *
+lookupVariable(Variables *variables, char *name)
+{
+ Variable key;
+
+ /* On some versions of Solaris, bsearch of zero items dumps core */
+ if (variables->nvars <= 0)
+ return NULL;
+
+ /* Sort if we have to */
+ if (!variables->vars_sorted)
+ {
+ qsort(variables->vars, variables->nvars, sizeof(Variable),
+ compareVariableNames);
+ variables->vars_sorted = true;
+ }
+
+ /* Now we can search */
+ key.name = name;
+ return (Variable *) bsearch(&key,
+ variables->vars,
+ variables->nvars,
+ sizeof(Variable),
+ compareVariableNames);
+}
+
+/* Get the value of a variable, in string form; returns NULL if unknown */
+static char *
+getVariable(Variables *variables, char *name)
+{
+ Variable *var;
+ char stringform[64];
+
+ var = lookupVariable(variables, name);
+ if (var == NULL)
+ return NULL; /* not found */
+
+ if (var->svalue)
+ return var->svalue; /* we have it in string form */
+
+ /* We need to produce a string equivalent of the value */
+ Assert(var->value.type != PGBT_NO_VALUE);
+ if (var->value.type == PGBT_NULL)
+ snprintf(stringform, sizeof(stringform), "NULL");
+ else if (var->value.type == PGBT_BOOLEAN)
+ snprintf(stringform, sizeof(stringform),
+ "%s", var->value.u.bval ? "true" : "false");
+ else if (var->value.type == PGBT_INT)
+ snprintf(stringform, sizeof(stringform),
+ INT64_FORMAT, var->value.u.ival);
+ else if (var->value.type == PGBT_DOUBLE)
+ snprintf(stringform, sizeof(stringform),
+ "%.*g", DBL_DIG, var->value.u.dval);
+ else /* internal error, unexpected type */
+ Assert(0);
+ var->svalue = pg_strdup(stringform);
+ return var->svalue;
+}
+
+/* Try to convert variable to a value; return false on failure */
+static bool
+makeVariableValue(Variable *var)
+{
+ size_t slen;
+
+ if (var->value.type != PGBT_NO_VALUE)
+ return true; /* no work */
+
+ slen = strlen(var->svalue);
+
+ if (slen == 0)
+ /* what should it do on ""? */
+ return false;
+
+ if (pg_strcasecmp(var->svalue, "null") == 0)
+ {
+ setNullValue(&var->value);
+ }
+
+ /*
+ * accept prefixes such as y, ye, n, no... but not for "o". 0/1 are
+ * recognized later as an int, which is converted to bool if needed.
+ */
+ else if (pg_strncasecmp(var->svalue, "true", slen) == 0 ||
+ pg_strncasecmp(var->svalue, "yes", slen) == 0 ||
+ pg_strcasecmp(var->svalue, "on") == 0)
+ {
+ setBoolValue(&var->value, true);
+ }
+ else if (pg_strncasecmp(var->svalue, "false", slen) == 0 ||
+ pg_strncasecmp(var->svalue, "no", slen) == 0 ||
+ pg_strcasecmp(var->svalue, "off") == 0 ||
+ pg_strcasecmp(var->svalue, "of") == 0)
+ {
+ setBoolValue(&var->value, false);
+ }
+ else if (is_an_int(var->svalue))
+ {
+ /* if it looks like an int, it must be an int without overflow */
+ int64 iv;
+
+ if (!strtoint64(var->svalue, false, &iv))
+ return false;
+
+ setIntValue(&var->value, iv);
+ }
+ else /* type should be double */
+ {
+ double dv;
+
+ if (!strtodouble(var->svalue, true, &dv))
+ {
+ pg_log_error("malformed variable \"%s\" value: \"%s\"",
+ var->name, var->svalue);
+ return false;
+ }
+ setDoubleValue(&var->value, dv);
+ }
+ return true;
+}
+
+/*
+ * Check whether a variable's name is allowed.
+ *
+ * We allow any non-ASCII character, as well as ASCII letters, digits, and
+ * underscore.
+ *
+ * Keep this in sync with the definitions of variable name characters in
+ * "src/fe_utils/psqlscan.l", "src/bin/psql/psqlscanslash.l" and
+ * "src/bin/pgbench/exprscan.l". Also see parseVariable(), below.
+ *
+ * Note: this static function is copied from "src/bin/psql/variables.c"
+ * but changed to disallow variable names starting with a digit.
+ */
+static bool
+valid_variable_name(const char *name)
+{
+ const unsigned char *ptr = (const unsigned char *) name;
+
+ /* Mustn't be zero-length */
+ if (*ptr == '\0')
+ return false;
+
+ /* must not start with [0-9] */
+ if (IS_HIGHBIT_SET(*ptr) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_", *ptr) != NULL)
+ ptr++;
+ else
+ return false;
+
+ /* remaining characters can include [0-9] */
+ while (*ptr)
+ {
+ if (IS_HIGHBIT_SET(*ptr) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_0123456789", *ptr) != NULL)
+ ptr++;
+ else
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Make sure there is enough space for 'needed' more variable in the variables
+ * array.
+ */
+static void
+enlargeVariables(Variables *variables, int needed)
+{
+ /* total number of variables required now */
+ needed += variables->nvars;
+
+ if (variables->max_vars < needed)
+ {
+ variables->max_vars = needed + VARIABLES_ALLOC_MARGIN;
+ variables->vars = (Variable *)
+ pg_realloc(variables->vars, variables->max_vars * sizeof(Variable));
+ }
+}
+
+/*
+ * Lookup a variable by name, creating it if need be.
+ * Caller is expected to assign a value to the variable.
+ * Returns NULL on failure (bad name).
+ */
+static Variable *
+lookupCreateVariable(Variables *variables, const char *context, char *name)
+{
+ Variable *var;
+
+ var = lookupVariable(variables, name);
+ if (var == NULL)
+ {
+ /*
+ * Check for the name only when declaring a new variable to avoid
+ * overhead.
+ */
+ if (!valid_variable_name(name))
+ {
+ pg_log_error("%s: invalid variable name: \"%s\"", context, name);
+ return NULL;
+ }
+
+ /* Create variable at the end of the array */
+ enlargeVariables(variables, 1);
+
+ var = &(variables->vars[variables->nvars]);
+
+ var->name = pg_strdup(name);
+ var->svalue = NULL;
+ /* caller is expected to initialize remaining fields */
+
+ variables->nvars++;
+ /* we don't re-sort the array till we have to */
+ variables->vars_sorted = false;
+ }
+
+ return var;
+}
+
+/* Assign a string value to a variable, creating it if need be */
+/* Returns false on failure (bad name) */
+static bool
+putVariable(Variables *variables, const char *context, char *name,
+ const char *value)
+{
+ Variable *var;
+ char *val;
+
+ var = lookupCreateVariable(variables, context, name);
+ if (!var)
+ return false;
+
+ /* dup then free, in case value is pointing at this variable */
+ val = pg_strdup(value);
+
+ free(var->svalue);
+ var->svalue = val;
+ var->value.type = PGBT_NO_VALUE;
+
+ return true;
+}
+
+/* Assign a value to a variable, creating it if need be */
+/* Returns false on failure (bad name) */
+static bool
+putVariableValue(Variables *variables, const char *context, char *name,
+ const PgBenchValue *value)
+{
+ Variable *var;
+
+ var = lookupCreateVariable(variables, context, name);
+ if (!var)
+ return false;
+
+ free(var->svalue);
+ var->svalue = NULL;
+ var->value = *value;
+
+ return true;
+}
+
+/* Assign an integer value to a variable, creating it if need be */
+/* Returns false on failure (bad name) */
+static bool
+putVariableInt(Variables *variables, const char *context, char *name,
+ int64 value)
+{
+ PgBenchValue val;
+
+ setIntValue(&val, value);
+ return putVariableValue(variables, context, name, &val);
+}
+
+/*
+ * Parse a possible variable reference (:varname).
+ *
+ * "sql" points at a colon. If what follows it looks like a valid
+ * variable name, return a malloc'd string containing the variable name,
+ * and set *eaten to the number of characters consumed (including the colon).
+ * Otherwise, return NULL.
+ */
+static char *
+parseVariable(const char *sql, int *eaten)
+{
+ int i = 1; /* starting at 1 skips the colon */
+ char *name;
+
+ /* keep this logic in sync with valid_variable_name() */
+ if (IS_HIGHBIT_SET(sql[i]) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_", sql[i]) != NULL)
+ i++;
+ else
+ return NULL;
+
+ while (IS_HIGHBIT_SET(sql[i]) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_0123456789", sql[i]) != NULL)
+ i++;
+
+ name = pg_malloc(i);
+ memcpy(name, &sql[1], i - 1);
+ name[i - 1] = '\0';
+
+ *eaten = i;
+ return name;
+}
+
+static char *
+replaceVariable(char **sql, char *param, int len, char *value)
+{
+ int valueln = strlen(value);
+
+ if (valueln > len)
+ {
+ size_t offset = param - *sql;
+
+ *sql = pg_realloc(*sql, strlen(*sql) - len + valueln + 1);
+ param = *sql + offset;
+ }
+
+ if (valueln != len)
+ memmove(param + valueln, param + len, strlen(param + len) + 1);
+ memcpy(param, value, valueln);
+
+ return param + valueln;
+}
+
+static char *
+assignVariables(Variables *variables, char *sql)
+{
+ char *p,
+ *name,
+ *val;
+
+ p = sql;
+ while ((p = strchr(p, ':')) != NULL)
+ {
+ int eaten;
+
+ name = parseVariable(p, &eaten);
+ if (name == NULL)
+ {
+ while (*p == ':')
+ {
+ p++;
+ }
+ continue;
+ }
+
+ val = getVariable(variables, name);
+ free(name);
+ if (val == NULL)
+ {
+ p++;
+ continue;
+ }
+
+ p = replaceVariable(&sql, p, eaten, val);
+ }
+
+ return sql;
+}
+
+static void
+getQueryParams(Variables *variables, const Command *command,
+ const char **params)
+{
+ int i;
+
+ for (i = 0; i < command->argc - 1; i++)
+ params[i] = getVariable(variables, command->argv[i + 1]);
+}
+
+static char *
+valueTypeName(PgBenchValue *pval)
+{
+ if (pval->type == PGBT_NO_VALUE)
+ return "none";
+ else if (pval->type == PGBT_NULL)
+ return "null";
+ else if (pval->type == PGBT_INT)
+ return "int";
+ else if (pval->type == PGBT_DOUBLE)
+ return "double";
+ else if (pval->type == PGBT_BOOLEAN)
+ return "boolean";
+ else
+ {
+ /* internal error, should never get there */
+ Assert(false);
+ return NULL;
+ }
+}
+
+/* get a value as a boolean, or tell if there is a problem */
+static bool
+coerceToBool(PgBenchValue *pval, bool *bval)
+{
+ if (pval->type == PGBT_BOOLEAN)
+ {
+ *bval = pval->u.bval;
+ return true;
+ }
+ else /* NULL, INT or DOUBLE */
+ {
+ pg_log_error("cannot coerce %s to boolean", valueTypeName(pval));
+ *bval = false; /* suppress uninitialized-variable warnings */
+ return false;
+ }
+}
+
+/*
+ * Return true or false from an expression for conditional purposes.
+ * Non zero numerical values are true, zero and NULL are false.
+ */
+static bool
+valueTruth(PgBenchValue *pval)
+{
+ switch (pval->type)
+ {
+ case PGBT_NULL:
+ return false;
+ case PGBT_BOOLEAN:
+ return pval->u.bval;
+ case PGBT_INT:
+ return pval->u.ival != 0;
+ case PGBT_DOUBLE:
+ return pval->u.dval != 0.0;
+ default:
+ /* internal error, unexpected type */
+ Assert(0);
+ return false;
+ }
+}
+
+/* get a value as an int, tell if there is a problem */
+static bool
+coerceToInt(PgBenchValue *pval, int64 *ival)
+{
+ if (pval->type == PGBT_INT)
+ {
+ *ival = pval->u.ival;
+ return true;
+ }
+ else if (pval->type == PGBT_DOUBLE)
+ {
+ double dval = rint(pval->u.dval);
+
+ if (isnan(dval) || !FLOAT8_FITS_IN_INT64(dval))
+ {
+ pg_log_error("double to int overflow for %f", dval);
+ return false;
+ }
+ *ival = (int64) dval;
+ return true;
+ }
+ else /* BOOLEAN or NULL */
+ {
+ pg_log_error("cannot coerce %s to int", valueTypeName(pval));
+ return false;
+ }
+}
+
+/* get a value as a double, or tell if there is a problem */
+static bool
+coerceToDouble(PgBenchValue *pval, double *dval)
+{
+ if (pval->type == PGBT_DOUBLE)
+ {
+ *dval = pval->u.dval;
+ return true;
+ }
+ else if (pval->type == PGBT_INT)
+ {
+ *dval = (double) pval->u.ival;
+ return true;
+ }
+ else /* BOOLEAN or NULL */
+ {
+ pg_log_error("cannot coerce %s to double", valueTypeName(pval));
+ return false;
+ }
+}
+
+/* assign a null value */
+static void
+setNullValue(PgBenchValue *pv)
+{
+ pv->type = PGBT_NULL;
+ pv->u.ival = 0;
+}
+
+/* assign a boolean value */
+static void
+setBoolValue(PgBenchValue *pv, bool bval)
+{
+ pv->type = PGBT_BOOLEAN;
+ pv->u.bval = bval;
+}
+
+/* assign an integer value */
+static void
+setIntValue(PgBenchValue *pv, int64 ival)
+{
+ pv->type = PGBT_INT;
+ pv->u.ival = ival;
+}
+
+/* assign a double value */
+static void
+setDoubleValue(PgBenchValue *pv, double dval)
+{
+ pv->type = PGBT_DOUBLE;
+ pv->u.dval = dval;
+}
+
+static bool
+isLazyFunc(PgBenchFunction func)
+{
+ return func == PGBENCH_AND || func == PGBENCH_OR || func == PGBENCH_CASE;
+}
+
+/* lazy evaluation of some functions */
+static bool
+evalLazyFunc(CState *st,
+ PgBenchFunction func, PgBenchExprLink *args, PgBenchValue *retval)
+{
+ PgBenchValue a1,
+ a2;
+ bool ba1,
+ ba2;
+
+ Assert(isLazyFunc(func) && args != NULL && args->next != NULL);
+
+ /* args points to first condition */
+ if (!evaluateExpr(st, args->expr, &a1))
+ return false;
+
+ /* second condition for AND/OR and corresponding branch for CASE */
+ args = args->next;
+
+ switch (func)
+ {
+ case PGBENCH_AND:
+ if (a1.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+
+ if (!coerceToBool(&a1, &ba1))
+ return false;
+
+ if (!ba1)
+ {
+ setBoolValue(retval, false);
+ return true;
+ }
+
+ if (!evaluateExpr(st, args->expr, &a2))
+ return false;
+
+ if (a2.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+ else if (!coerceToBool(&a2, &ba2))
+ return false;
+ else
+ {
+ setBoolValue(retval, ba2);
+ return true;
+ }
+
+ return true;
+
+ case PGBENCH_OR:
+
+ if (a1.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+
+ if (!coerceToBool(&a1, &ba1))
+ return false;
+
+ if (ba1)
+ {
+ setBoolValue(retval, true);
+ return true;
+ }
+
+ if (!evaluateExpr(st, args->expr, &a2))
+ return false;
+
+ if (a2.type == PGBT_NULL)
+ {
+ setNullValue(retval);
+ return true;
+ }
+ else if (!coerceToBool(&a2, &ba2))
+ return false;
+ else
+ {
+ setBoolValue(retval, ba2);
+ return true;
+ }
+
+ case PGBENCH_CASE:
+ /* when true, execute branch */
+ if (valueTruth(&a1))
+ return evaluateExpr(st, args->expr, retval);
+
+ /* now args contains next condition or final else expression */
+ args = args->next;
+
+ /* final else case? */
+ if (args->next == NULL)
+ return evaluateExpr(st, args->expr, retval);
+
+ /* no, another when, proceed */
+ return evalLazyFunc(st, PGBENCH_CASE, args, retval);
+
+ default:
+ /* internal error, cannot get here */
+ Assert(0);
+ break;
+ }
+ return false;
+}
+
+/* maximum number of function arguments */
+#define MAX_FARGS 16
+
+/*
+ * Recursive evaluation of standard functions,
+ * which do not require lazy evaluation.
+ */
+static bool
+evalStandardFunc(CState *st,
+ PgBenchFunction func, PgBenchExprLink *args,
+ PgBenchValue *retval)
+{
+ /* evaluate all function arguments */
+ int nargs = 0;
+ PgBenchValue vargs[MAX_FARGS];
+ PgBenchExprLink *l = args;
+ bool has_null = false;
+
+ for (nargs = 0; nargs < MAX_FARGS && l != NULL; nargs++, l = l->next)
+ {
+ if (!evaluateExpr(st, l->expr, &vargs[nargs]))
+ return false;
+ has_null |= vargs[nargs].type == PGBT_NULL;
+ }
+
+ if (l != NULL)
+ {
+ pg_log_error("too many function arguments, maximum is %d", MAX_FARGS);
+ return false;
+ }
+
+ /* NULL arguments */
+ if (has_null && func != PGBENCH_IS && func != PGBENCH_DEBUG)
+ {
+ setNullValue(retval);
+ return true;
+ }
+
+ /* then evaluate function */
+ switch (func)
+ {
+ /* overloaded operators */
+ case PGBENCH_ADD:
+ case PGBENCH_SUB:
+ case PGBENCH_MUL:
+ case PGBENCH_DIV:
+ case PGBENCH_MOD:
+ case PGBENCH_EQ:
+ case PGBENCH_NE:
+ case PGBENCH_LE:
+ case PGBENCH_LT:
+ {
+ PgBenchValue *lval = &vargs[0],
+ *rval = &vargs[1];
+
+ Assert(nargs == 2);
+
+ /* overloaded type management, double if some double */
+ if ((lval->type == PGBT_DOUBLE ||
+ rval->type == PGBT_DOUBLE) && func != PGBENCH_MOD)
+ {
+ double ld,
+ rd;
+
+ if (!coerceToDouble(lval, &ld) ||
+ !coerceToDouble(rval, &rd))
+ return false;
+
+ switch (func)
+ {
+ case PGBENCH_ADD:
+ setDoubleValue(retval, ld + rd);
+ return true;
+
+ case PGBENCH_SUB:
+ setDoubleValue(retval, ld - rd);
+ return true;
+
+ case PGBENCH_MUL:
+ setDoubleValue(retval, ld * rd);
+ return true;
+
+ case PGBENCH_DIV:
+ setDoubleValue(retval, ld / rd);
+ return true;
+
+ case PGBENCH_EQ:
+ setBoolValue(retval, ld == rd);
+ return true;
+
+ case PGBENCH_NE:
+ setBoolValue(retval, ld != rd);
+ return true;
+
+ case PGBENCH_LE:
+ setBoolValue(retval, ld <= rd);
+ return true;
+
+ case PGBENCH_LT:
+ setBoolValue(retval, ld < rd);
+ return true;
+
+ default:
+ /* cannot get here */
+ Assert(0);
+ }
+ }
+ else /* we have integer operands, or % */
+ {
+ int64 li,
+ ri,
+ res;
+
+ if (!coerceToInt(lval, &li) ||
+ !coerceToInt(rval, &ri))
+ return false;
+
+ switch (func)
+ {
+ case PGBENCH_ADD:
+ if (pg_add_s64_overflow(li, ri, &res))
+ {
+ pg_log_error("bigint add out of range");
+ return false;
+ }
+ setIntValue(retval, res);
+ return true;
+
+ case PGBENCH_SUB:
+ if (pg_sub_s64_overflow(li, ri, &res))
+ {
+ pg_log_error("bigint sub out of range");
+ return false;
+ }
+ setIntValue(retval, res);
+ return true;
+
+ case PGBENCH_MUL:
+ if (pg_mul_s64_overflow(li, ri, &res))
+ {
+ pg_log_error("bigint mul out of range");
+ return false;
+ }
+ setIntValue(retval, res);
+ return true;
+
+ case PGBENCH_EQ:
+ setBoolValue(retval, li == ri);
+ return true;
+
+ case PGBENCH_NE:
+ setBoolValue(retval, li != ri);
+ return true;
+
+ case PGBENCH_LE:
+ setBoolValue(retval, li <= ri);
+ return true;
+
+ case PGBENCH_LT:
+ setBoolValue(retval, li < ri);
+ return true;
+
+ case PGBENCH_DIV:
+ case PGBENCH_MOD:
+ if (ri == 0)
+ {
+ pg_log_error("division by zero");
+ return false;
+ }
+ /* special handling of -1 divisor */
+ if (ri == -1)
+ {
+ if (func == PGBENCH_DIV)
+ {
+ /* overflow check (needed for INT64_MIN) */
+ if (li == PG_INT64_MIN)
+ {
+ pg_log_error("bigint div out of range");
+ return false;
+ }
+ else
+ setIntValue(retval, -li);
+ }
+ else
+ setIntValue(retval, 0);
+ return true;
+ }
+ /* else divisor is not -1 */
+ if (func == PGBENCH_DIV)
+ setIntValue(retval, li / ri);
+ else /* func == PGBENCH_MOD */
+ setIntValue(retval, li % ri);
+
+ return true;
+
+ default:
+ /* cannot get here */
+ Assert(0);
+ }
+ }
+
+ Assert(0);
+ return false; /* NOTREACHED */
+ }
+
+ /* integer bitwise operators */
+ case PGBENCH_BITAND:
+ case PGBENCH_BITOR:
+ case PGBENCH_BITXOR:
+ case PGBENCH_LSHIFT:
+ case PGBENCH_RSHIFT:
+ {
+ int64 li,
+ ri;
+
+ if (!coerceToInt(&vargs[0], &li) || !coerceToInt(&vargs[1], &ri))
+ return false;
+
+ if (func == PGBENCH_BITAND)
+ setIntValue(retval, li & ri);
+ else if (func == PGBENCH_BITOR)
+ setIntValue(retval, li | ri);
+ else if (func == PGBENCH_BITXOR)
+ setIntValue(retval, li ^ ri);
+ else if (func == PGBENCH_LSHIFT)
+ setIntValue(retval, li << ri);
+ else if (func == PGBENCH_RSHIFT)
+ setIntValue(retval, li >> ri);
+ else /* cannot get here */
+ Assert(0);
+
+ return true;
+ }
+
+ /* logical operators */
+ case PGBENCH_NOT:
+ {
+ bool b;
+
+ if (!coerceToBool(&vargs[0], &b))
+ return false;
+
+ setBoolValue(retval, !b);
+ return true;
+ }
+
+ /* no arguments */
+ case PGBENCH_PI:
+ setDoubleValue(retval, M_PI);
+ return true;
+
+ /* 1 overloaded argument */
+ case PGBENCH_ABS:
+ {
+ PgBenchValue *varg = &vargs[0];
+
+ Assert(nargs == 1);
+
+ if (varg->type == PGBT_INT)
+ {
+ int64 i = varg->u.ival;
+
+ setIntValue(retval, i < 0 ? -i : i);
+ }
+ else
+ {
+ double d = varg->u.dval;
+
+ Assert(varg->type == PGBT_DOUBLE);
+ setDoubleValue(retval, d < 0.0 ? -d : d);
+ }
+
+ return true;
+ }
+
+ case PGBENCH_DEBUG:
+ {
+ PgBenchValue *varg = &vargs[0];
+
+ Assert(nargs == 1);
+
+ fprintf(stderr, "debug(script=%d,command=%d): ",
+ st->use_file, st->command + 1);
+
+ if (varg->type == PGBT_NULL)
+ fprintf(stderr, "null\n");
+ else if (varg->type == PGBT_BOOLEAN)
+ fprintf(stderr, "boolean %s\n", varg->u.bval ? "true" : "false");
+ else if (varg->type == PGBT_INT)
+ fprintf(stderr, "int " INT64_FORMAT "\n", varg->u.ival);
+ else if (varg->type == PGBT_DOUBLE)
+ fprintf(stderr, "double %.*g\n", DBL_DIG, varg->u.dval);
+ else /* internal error, unexpected type */
+ Assert(0);
+
+ *retval = *varg;
+
+ return true;
+ }
+
+ /* 1 double argument */
+ case PGBENCH_DOUBLE:
+ case PGBENCH_SQRT:
+ case PGBENCH_LN:
+ case PGBENCH_EXP:
+ {
+ double dval;
+
+ Assert(nargs == 1);
+
+ if (!coerceToDouble(&vargs[0], &dval))
+ return false;
+
+ if (func == PGBENCH_SQRT)
+ dval = sqrt(dval);
+ else if (func == PGBENCH_LN)
+ dval = log(dval);
+ else if (func == PGBENCH_EXP)
+ dval = exp(dval);
+ /* else is cast: do nothing */
+
+ setDoubleValue(retval, dval);
+ return true;
+ }
+
+ /* 1 int argument */
+ case PGBENCH_INT:
+ {
+ int64 ival;
+
+ Assert(nargs == 1);
+
+ if (!coerceToInt(&vargs[0], &ival))
+ return false;
+
+ setIntValue(retval, ival);
+ return true;
+ }
+
+ /* variable number of arguments */
+ case PGBENCH_LEAST:
+ case PGBENCH_GREATEST:
+ {
+ bool havedouble;
+ int i;
+
+ Assert(nargs >= 1);
+
+ /* need double result if any input is double */
+ havedouble = false;
+ for (i = 0; i < nargs; i++)
+ {
+ if (vargs[i].type == PGBT_DOUBLE)
+ {
+ havedouble = true;
+ break;
+ }
+ }
+ if (havedouble)
+ {
+ double extremum;
+
+ if (!coerceToDouble(&vargs[0], &extremum))
+ return false;
+ for (i = 1; i < nargs; i++)
+ {
+ double dval;
+
+ if (!coerceToDouble(&vargs[i], &dval))
+ return false;
+ if (func == PGBENCH_LEAST)
+ extremum = Min(extremum, dval);
+ else
+ extremum = Max(extremum, dval);
+ }
+ setDoubleValue(retval, extremum);
+ }
+ else
+ {
+ int64 extremum;
+
+ if (!coerceToInt(&vargs[0], &extremum))
+ return false;
+ for (i = 1; i < nargs; i++)
+ {
+ int64 ival;
+
+ if (!coerceToInt(&vargs[i], &ival))
+ return false;
+ if (func == PGBENCH_LEAST)
+ extremum = Min(extremum, ival);
+ else
+ extremum = Max(extremum, ival);
+ }
+ setIntValue(retval, extremum);
+ }
+ return true;
+ }
+
+ /* random functions */
+ case PGBENCH_RANDOM:
+ case PGBENCH_RANDOM_EXPONENTIAL:
+ case PGBENCH_RANDOM_GAUSSIAN:
+ case PGBENCH_RANDOM_ZIPFIAN:
+ {
+ int64 imin,
+ imax,
+ delta;
+
+ Assert(nargs >= 2);
+
+ if (!coerceToInt(&vargs[0], &imin) ||
+ !coerceToInt(&vargs[1], &imax))
+ return false;
+
+ /* check random range */
+ if (unlikely(imin > imax))
+ {
+ pg_log_error("empty range given to random");
+ return false;
+ }
+ else if (unlikely(pg_sub_s64_overflow(imax, imin, &delta) ||
+ pg_add_s64_overflow(delta, 1, &delta)))
+ {
+ /* prevent int overflows in random functions */
+ pg_log_error("random range is too large");
+ return false;
+ }
+
+ if (func == PGBENCH_RANDOM)
+ {
+ Assert(nargs == 2);
+ setIntValue(retval, getrand(&st->cs_func_rs, imin, imax));
+ }
+ else /* gaussian & exponential */
+ {
+ double param;
+
+ Assert(nargs == 3);
+
+ if (!coerceToDouble(&vargs[2], &param))
+ return false;
+
+ if (func == PGBENCH_RANDOM_GAUSSIAN)
+ {
+ if (param < MIN_GAUSSIAN_PARAM)
+ {
+ pg_log_error("gaussian parameter must be at least %f (not %f)",
+ MIN_GAUSSIAN_PARAM, param);
+ return false;
+ }
+
+ setIntValue(retval,
+ getGaussianRand(&st->cs_func_rs,
+ imin, imax, param));
+ }
+ else if (func == PGBENCH_RANDOM_ZIPFIAN)
+ {
+ if (param < MIN_ZIPFIAN_PARAM || param > MAX_ZIPFIAN_PARAM)
+ {
+ pg_log_error("zipfian parameter must be in range [%.3f, %.0f] (not %f)",
+ MIN_ZIPFIAN_PARAM, MAX_ZIPFIAN_PARAM, param);
+ return false;
+ }
+
+ setIntValue(retval,
+ getZipfianRand(&st->cs_func_rs, imin, imax, param));
+ }
+ else /* exponential */
+ {
+ if (param <= 0.0)
+ {
+ pg_log_error("exponential parameter must be greater than zero (not %f)",
+ param);
+ return false;
+ }
+
+ setIntValue(retval,
+ getExponentialRand(&st->cs_func_rs,
+ imin, imax, param));
+ }
+ }
+
+ return true;
+ }
+
+ case PGBENCH_POW:
+ {
+ PgBenchValue *lval = &vargs[0];
+ PgBenchValue *rval = &vargs[1];
+ double ld,
+ rd;
+
+ Assert(nargs == 2);
+
+ if (!coerceToDouble(lval, &ld) ||
+ !coerceToDouble(rval, &rd))
+ return false;
+
+ setDoubleValue(retval, pow(ld, rd));
+
+ return true;
+ }
+
+ case PGBENCH_IS:
+ {
+ Assert(nargs == 2);
+
+ /*
+ * note: this simple implementation is more permissive than
+ * SQL
+ */
+ setBoolValue(retval,
+ vargs[0].type == vargs[1].type &&
+ vargs[0].u.bval == vargs[1].u.bval);
+ return true;
+ }
+
+ /* hashing */
+ case PGBENCH_HASH_FNV1A:
+ case PGBENCH_HASH_MURMUR2:
+ {
+ int64 val,
+ seed;
+
+ Assert(nargs == 2);
+
+ if (!coerceToInt(&vargs[0], &val) ||
+ !coerceToInt(&vargs[1], &seed))
+ return false;
+
+ if (func == PGBENCH_HASH_MURMUR2)
+ setIntValue(retval, getHashMurmur2(val, seed));
+ else if (func == PGBENCH_HASH_FNV1A)
+ setIntValue(retval, getHashFnv1a(val, seed));
+ else
+ /* cannot get here */
+ Assert(0);
+
+ return true;
+ }
+
+ case PGBENCH_PERMUTE:
+ {
+ int64 val,
+ size,
+ seed;
+
+ Assert(nargs == 3);
+
+ if (!coerceToInt(&vargs[0], &val) ||
+ !coerceToInt(&vargs[1], &size) ||
+ !coerceToInt(&vargs[2], &seed))
+ return false;
+
+ if (size <= 0)
+ {
+ pg_log_error("permute size parameter must be greater than zero");
+ return false;
+ }
+
+ setIntValue(retval, permute(val, size, seed));
+ return true;
+ }
+
+ default:
+ /* cannot get here */
+ Assert(0);
+ /* dead code to avoid a compiler warning */
+ return false;
+ }
+}
+
+/* evaluate some function */
+static bool
+evalFunc(CState *st,
+ PgBenchFunction func, PgBenchExprLink *args, PgBenchValue *retval)
+{
+ if (isLazyFunc(func))
+ return evalLazyFunc(st, func, args, retval);
+ else
+ return evalStandardFunc(st, func, args, retval);
+}
+
+/*
+ * Recursive evaluation of an expression in a pgbench script
+ * using the current state of variables.
+ * Returns whether the evaluation was ok,
+ * the value itself is returned through the retval pointer.
+ */
+static bool
+evaluateExpr(CState *st, PgBenchExpr *expr, PgBenchValue *retval)
+{
+ switch (expr->etype)
+ {
+ case ENODE_CONSTANT:
+ {
+ *retval = expr->u.constant;
+ return true;
+ }
+
+ case ENODE_VARIABLE:
+ {
+ Variable *var;
+
+ if ((var = lookupVariable(&st->variables, expr->u.variable.varname)) == NULL)
+ {
+ pg_log_error("undefined variable \"%s\"", expr->u.variable.varname);
+ return false;
+ }
+
+ if (!makeVariableValue(var))
+ return false;
+
+ *retval = var->value;
+ return true;
+ }
+
+ case ENODE_FUNCTION:
+ return evalFunc(st,
+ expr->u.function.function,
+ expr->u.function.args,
+ retval);
+
+ default:
+ /* internal error which should never occur */
+ pg_fatal("unexpected enode type in evaluation: %d", expr->etype);
+ }
+}
+
+/*
+ * Convert command name to meta-command enum identifier
+ */
+static MetaCommand
+getMetaCommand(const char *cmd)
+{
+ MetaCommand mc;
+
+ if (cmd == NULL)
+ mc = META_NONE;
+ else if (pg_strcasecmp(cmd, "set") == 0)
+ mc = META_SET;
+ else if (pg_strcasecmp(cmd, "setshell") == 0)
+ mc = META_SETSHELL;
+ else if (pg_strcasecmp(cmd, "shell") == 0)
+ mc = META_SHELL;
+ else if (pg_strcasecmp(cmd, "sleep") == 0)
+ mc = META_SLEEP;
+ else if (pg_strcasecmp(cmd, "if") == 0)
+ mc = META_IF;
+ else if (pg_strcasecmp(cmd, "elif") == 0)
+ mc = META_ELIF;
+ else if (pg_strcasecmp(cmd, "else") == 0)
+ mc = META_ELSE;
+ else if (pg_strcasecmp(cmd, "endif") == 0)
+ mc = META_ENDIF;
+ else if (pg_strcasecmp(cmd, "gset") == 0)
+ mc = META_GSET;
+ else if (pg_strcasecmp(cmd, "aset") == 0)
+ mc = META_ASET;
+ else if (pg_strcasecmp(cmd, "startpipeline") == 0)
+ mc = META_STARTPIPELINE;
+ else if (pg_strcasecmp(cmd, "endpipeline") == 0)
+ mc = META_ENDPIPELINE;
+ else
+ mc = META_NONE;
+ return mc;
+}
+
+/*
+ * Run a shell command. The result is assigned to the variable if not NULL.
+ * Return true if succeeded, or false on error.
+ */
+static bool
+runShellCommand(Variables *variables, char *variable, char **argv, int argc)
+{
+ char command[SHELL_COMMAND_SIZE];
+ int i,
+ len = 0;
+ FILE *fp;
+ char res[64];
+ char *endptr;
+ int retval;
+
+ /*----------
+ * Join arguments with whitespace separators. Arguments starting with
+ * exactly one colon are treated as variables:
+ * name - append a string "name"
+ * :var - append a variable named 'var'
+ * ::name - append a string ":name"
+ *----------
+ */
+ for (i = 0; i < argc; i++)
+ {
+ char *arg;
+ int arglen;
+
+ if (argv[i][0] != ':')
+ {
+ arg = argv[i]; /* a string literal */
+ }
+ else if (argv[i][1] == ':')
+ {
+ arg = argv[i] + 1; /* a string literal starting with colons */
+ }
+ else if ((arg = getVariable(variables, argv[i] + 1)) == NULL)
+ {
+ pg_log_error("%s: undefined variable \"%s\"", argv[0], argv[i]);
+ return false;
+ }
+
+ arglen = strlen(arg);
+ if (len + arglen + (i > 0 ? 1 : 0) >= SHELL_COMMAND_SIZE - 1)
+ {
+ pg_log_error("%s: shell command is too long", argv[0]);
+ return false;
+ }
+
+ if (i > 0)
+ command[len++] = ' ';
+ memcpy(command + len, arg, arglen);
+ len += arglen;
+ }
+
+ command[len] = '\0';
+
+ fflush(NULL); /* needed before either system() or popen() */
+
+ /* Fast path for non-assignment case */
+ if (variable == NULL)
+ {
+ if (system(command))
+ {
+ if (!timer_exceeded)
+ pg_log_error("%s: could not launch shell command", argv[0]);
+ return false;
+ }
+ return true;
+ }
+
+ /* Execute the command with pipe and read the standard output. */
+ if ((fp = popen(command, "r")) == NULL)
+ {
+ pg_log_error("%s: could not launch shell command", argv[0]);
+ return false;
+ }
+ if (fgets(res, sizeof(res), fp) == NULL)
+ {
+ if (!timer_exceeded)
+ pg_log_error("%s: could not read result of shell command", argv[0]);
+ (void) pclose(fp);
+ return false;
+ }
+ if (pclose(fp) < 0)
+ {
+ pg_log_error("%s: could not run shell command: %m", argv[0]);
+ return false;
+ }
+
+ /* Check whether the result is an integer and assign it to the variable */
+ retval = (int) strtol(res, &endptr, 10);
+ while (*endptr != '\0' && isspace((unsigned char) *endptr))
+ endptr++;
+ if (*res == '\0' || *endptr != '\0')
+ {
+ pg_log_error("%s: shell command must return an integer (not \"%s\")", argv[0], res);
+ return false;
+ }
+ if (!putVariableInt(variables, "setshell", variable, retval))
+ return false;
+
+ pg_log_debug("%s: shell parameter name: \"%s\", value: \"%s\"", argv[0], argv[1], res);
+
+ return true;
+}
+
+/*
+ * Report the abortion of the client when processing SQL commands.
+ */
+static void
+commandFailed(CState *st, const char *cmd, const char *message)
+{
+ pg_log_error("client %d aborted in command %d (%s) of script %d; %s",
+ st->id, st->command, cmd, st->use_file, message);
+}
+
+/*
+ * Report the error in the command while the script is executing.
+ */
+static void
+commandError(CState *st, const char *message)
+{
+ Assert(sql_script[st->use_file].commands[st->command]->type == SQL_COMMAND);
+ pg_log_info("client %d got an error in command %d (SQL) of script %d; %s",
+ st->id, st->command, st->use_file, message);
+}
+
+/* return a script number with a weighted choice. */
+static int
+chooseScript(TState *thread)
+{
+ int i = 0;
+ int64 w;
+
+ if (num_scripts == 1)
+ return 0;
+
+ w = getrand(&thread->ts_choose_rs, 0, total_weight - 1);
+ do
+ {
+ w -= sql_script[i++].weight;
+ } while (w >= 0);
+
+ return i - 1;
+}
+
+/*
+ * Allocate space for CState->prepared: we need one boolean for each command
+ * of each script.
+ */
+static void
+allocCStatePrepared(CState *st)
+{
+ Assert(st->prepared == NULL);
+
+ st->prepared = pg_malloc(sizeof(bool *) * num_scripts);
+ for (int i = 0; i < num_scripts; i++)
+ {
+ ParsedScript *script = &sql_script[i];
+ int numcmds;
+
+ for (numcmds = 0; script->commands[numcmds] != NULL; numcmds++)
+ ;
+ st->prepared[i] = pg_malloc0(sizeof(bool) * numcmds);
+ }
+}
+
+/*
+ * Prepare the SQL command from st->use_file at command_num.
+ */
+static void
+prepareCommand(CState *st, int command_num)
+{
+ Command *command = sql_script[st->use_file].commands[command_num];
+
+ /* No prepare for non-SQL commands */
+ if (command->type != SQL_COMMAND)
+ return;
+
+ if (!st->prepared)
+ allocCStatePrepared(st);
+
+ if (!st->prepared[st->use_file][command_num])
+ {
+ PGresult *res;
+
+ pg_log_debug("client %d preparing %s", st->id, command->prepname);
+ res = PQprepare(st->con, command->prepname,
+ command->argv[0], command->argc - 1, NULL);
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ pg_log_error("%s", PQerrorMessage(st->con));
+ PQclear(res);
+ st->prepared[st->use_file][command_num] = true;
+ }
+}
+
+/*
+ * Prepare all the commands in the script that come after the \startpipeline
+ * that's at position st->command, and the first \endpipeline we find.
+ *
+ * This sets the ->prepared flag for each relevant command as well as the
+ * \startpipeline itself, but doesn't move the st->command counter.
+ */
+static void
+prepareCommandsInPipeline(CState *st)
+{
+ int j;
+ Command **commands = sql_script[st->use_file].commands;
+
+ Assert(commands[st->command]->type == META_COMMAND &&
+ commands[st->command]->meta == META_STARTPIPELINE);
+
+ if (!st->prepared)
+ allocCStatePrepared(st);
+
+ /*
+ * We set the 'prepared' flag on the \startpipeline itself to flag that we
+ * don't need to do this next time without calling prepareCommand(), even
+ * though we don't actually prepare this command.
+ */
+ if (st->prepared[st->use_file][st->command])
+ return;
+
+ for (j = st->command + 1; commands[j] != NULL; j++)
+ {
+ if (commands[j]->type == META_COMMAND &&
+ commands[j]->meta == META_ENDPIPELINE)
+ break;
+
+ prepareCommand(st, j);
+ }
+
+ st->prepared[st->use_file][st->command] = true;
+}
+
+/* Send a SQL command, using the chosen querymode */
+static bool
+sendCommand(CState *st, Command *command)
+{
+ int r;
+
+ if (querymode == QUERY_SIMPLE)
+ {
+ char *sql;
+
+ sql = pg_strdup(command->argv[0]);
+ sql = assignVariables(&st->variables, sql);
+
+ pg_log_debug("client %d sending %s", st->id, sql);
+ r = PQsendQuery(st->con, sql);
+ free(sql);
+ }
+ else if (querymode == QUERY_EXTENDED)
+ {
+ const char *sql = command->argv[0];
+ const char *params[MAX_ARGS];
+
+ getQueryParams(&st->variables, command, params);
+
+ pg_log_debug("client %d sending %s", st->id, sql);
+ r = PQsendQueryParams(st->con, sql, command->argc - 1,
+ NULL, params, NULL, NULL, 0);
+ }
+ else if (querymode == QUERY_PREPARED)
+ {
+ const char *params[MAX_ARGS];
+
+ prepareCommand(st, st->command);
+ getQueryParams(&st->variables, command, params);
+
+ pg_log_debug("client %d sending %s", st->id, command->prepname);
+ r = PQsendQueryPrepared(st->con, command->prepname, command->argc - 1,
+ params, NULL, NULL, 0);
+ }
+ else /* unknown sql mode */
+ r = 0;
+
+ if (r == 0)
+ {
+ pg_log_debug("client %d could not send %s", st->id, command->argv[0]);
+ return false;
+ }
+ else
+ return true;
+}
+
+/*
+ * Get the error status from the error code.
+ */
+static EStatus
+getSQLErrorStatus(const char *sqlState)
+{
+ if (sqlState != NULL)
+ {
+ if (strcmp(sqlState, ERRCODE_T_R_SERIALIZATION_FAILURE) == 0)
+ return ESTATUS_SERIALIZATION_ERROR;
+ else if (strcmp(sqlState, ERRCODE_T_R_DEADLOCK_DETECTED) == 0)
+ return ESTATUS_DEADLOCK_ERROR;
+ }
+
+ return ESTATUS_OTHER_SQL_ERROR;
+}
+
+/*
+ * Returns true if this type of error can be retried.
+ */
+static bool
+canRetryError(EStatus estatus)
+{
+ return (estatus == ESTATUS_SERIALIZATION_ERROR ||
+ estatus == ESTATUS_DEADLOCK_ERROR);
+}
+
+/*
+ * Process query response from the backend.
+ *
+ * If varprefix is not NULL, it's the variable name prefix where to store
+ * the results of the *last* command (META_GSET) or *all* commands
+ * (META_ASET).
+ *
+ * Returns true if everything is A-OK, false if any error occurs.
+ */
+static bool
+readCommandResponse(CState *st, MetaCommand meta, char *varprefix)
+{
+ PGresult *res;
+ PGresult *next_res;
+ int qrynum = 0;
+
+ /*
+ * varprefix should be set only with \gset or \aset, and \endpipeline and
+ * SQL commands do not need it.
+ */
+ Assert((meta == META_NONE && varprefix == NULL) ||
+ ((meta == META_ENDPIPELINE) && varprefix == NULL) ||
+ ((meta == META_GSET || meta == META_ASET) && varprefix != NULL));
+
+ res = PQgetResult(st->con);
+
+ while (res != NULL)
+ {
+ bool is_last;
+
+ /* peek at the next result to know whether the current is last */
+ next_res = PQgetResult(st->con);
+ is_last = (next_res == NULL);
+
+ switch (PQresultStatus(res))
+ {
+ case PGRES_COMMAND_OK: /* non-SELECT commands */
+ case PGRES_EMPTY_QUERY: /* may be used for testing no-op overhead */
+ if (is_last && meta == META_GSET)
+ {
+ pg_log_error("client %d script %d command %d query %d: expected one row, got %d",
+ st->id, st->use_file, st->command, qrynum, 0);
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ goto error;
+ }
+ break;
+
+ case PGRES_TUPLES_OK:
+ if ((is_last && meta == META_GSET) || meta == META_ASET)
+ {
+ int ntuples = PQntuples(res);
+
+ if (meta == META_GSET && ntuples != 1)
+ {
+ /* under \gset, report the error */
+ pg_log_error("client %d script %d command %d query %d: expected one row, got %d",
+ st->id, st->use_file, st->command, qrynum, PQntuples(res));
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ goto error;
+ }
+ else if (meta == META_ASET && ntuples <= 0)
+ {
+ /* coldly skip empty result under \aset */
+ break;
+ }
+
+ /* store results into variables */
+ for (int fld = 0; fld < PQnfields(res); fld++)
+ {
+ char *varname = PQfname(res, fld);
+
+ /* allocate varname only if necessary, freed below */
+ if (*varprefix != '\0')
+ varname = psprintf("%s%s", varprefix, varname);
+
+ /* store last row result as a string */
+ if (!putVariable(&st->variables, meta == META_ASET ? "aset" : "gset", varname,
+ PQgetvalue(res, ntuples - 1, fld)))
+ {
+ /* internal error */
+ pg_log_error("client %d script %d command %d query %d: error storing into variable %s",
+ st->id, st->use_file, st->command, qrynum, varname);
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ goto error;
+ }
+
+ if (*varprefix != '\0')
+ pg_free(varname);
+ }
+ }
+ /* otherwise the result is simply thrown away by PQclear below */
+ break;
+
+ case PGRES_PIPELINE_SYNC:
+ pg_log_debug("client %d pipeline ending", st->id);
+ if (PQexitPipelineMode(st->con) != 1)
+ pg_log_error("client %d failed to exit pipeline mode: %s", st->id,
+ PQerrorMessage(st->con));
+ break;
+
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ st->estatus = getSQLErrorStatus(PQresultErrorField(res,
+ PG_DIAG_SQLSTATE));
+ if (canRetryError(st->estatus))
+ {
+ if (verbose_errors)
+ commandError(st, PQerrorMessage(st->con));
+ goto error;
+ }
+ /* fall through */
+
+ default:
+ /* anything else is unexpected */
+ pg_log_error("client %d script %d aborted in command %d query %d: %s",
+ st->id, st->use_file, st->command, qrynum,
+ PQerrorMessage(st->con));
+ goto error;
+ }
+
+ PQclear(res);
+ qrynum++;
+ res = next_res;
+ }
+
+ if (qrynum == 0)
+ {
+ pg_log_error("client %d command %d: no results", st->id, st->command);
+ return false;
+ }
+
+ return true;
+
+error:
+ PQclear(res);
+ PQclear(next_res);
+ do
+ {
+ res = PQgetResult(st->con);
+ PQclear(res);
+ } while (res);
+
+ return false;
+}
+
+/*
+ * Parse the argument to a \sleep command, and return the requested amount
+ * of delay, in microseconds. Returns true on success, false on error.
+ */
+static bool
+evaluateSleep(Variables *variables, int argc, char **argv, int *usecs)
+{
+ char *var;
+ int usec;
+
+ if (*argv[1] == ':')
+ {
+ if ((var = getVariable(variables, argv[1] + 1)) == NULL)
+ {
+ pg_log_error("%s: undefined variable \"%s\"", argv[0], argv[1] + 1);
+ return false;
+ }
+
+ usec = atoi(var);
+
+ /* Raise an error if the value of a variable is not a number */
+ if (usec == 0 && !isdigit((unsigned char) *var))
+ {
+ pg_log_error("%s: invalid sleep time \"%s\" for variable \"%s\"",
+ argv[0], var, argv[1] + 1);
+ return false;
+ }
+ }
+ else
+ usec = atoi(argv[1]);
+
+ if (argc > 2)
+ {
+ if (pg_strcasecmp(argv[2], "ms") == 0)
+ usec *= 1000;
+ else if (pg_strcasecmp(argv[2], "s") == 0)
+ usec *= 1000000;
+ }
+ else
+ usec *= 1000000;
+
+ *usecs = usec;
+ return true;
+}
+
+
+/*
+ * Returns true if the error can be retried.
+ */
+static bool
+doRetry(CState *st, pg_time_usec_t *now)
+{
+ Assert(st->estatus != ESTATUS_NO_ERROR);
+
+ /* We can only retry serialization or deadlock errors. */
+ if (!canRetryError(st->estatus))
+ return false;
+
+ /*
+ * We must have at least one option to limit the retrying of transactions
+ * that got an error.
+ */
+ Assert(max_tries || latency_limit || duration > 0);
+
+ /*
+ * We cannot retry the error if we have reached the maximum number of
+ * tries.
+ */
+ if (max_tries && st->tries >= max_tries)
+ return false;
+
+ /*
+ * We cannot retry the error if we spent too much time on this
+ * transaction.
+ */
+ if (latency_limit)
+ {
+ pg_time_now_lazy(now);
+ if (*now - st->txn_scheduled > latency_limit)
+ return false;
+ }
+
+ /*
+ * We cannot retry the error if the benchmark duration is over.
+ */
+ if (timer_exceeded)
+ return false;
+
+ /* OK */
+ return true;
+}
+
+/*
+ * Read results and discard it until a sync point.
+ */
+static int
+discardUntilSync(CState *st)
+{
+ /* send a sync */
+ if (!PQpipelineSync(st->con))
+ {
+ pg_log_error("client %d aborted: failed to send a pipeline sync",
+ st->id);
+ return 0;
+ }
+
+ /* receive PGRES_PIPELINE_SYNC and null following it */
+ for (;;)
+ {
+ PGresult *res = PQgetResult(st->con);
+
+ if (PQresultStatus(res) == PGRES_PIPELINE_SYNC)
+ {
+ PQclear(res);
+ res = PQgetResult(st->con);
+ Assert(res == NULL);
+ break;
+ }
+ PQclear(res);
+ }
+
+ /* exit pipeline */
+ if (PQexitPipelineMode(st->con) != 1)
+ {
+ pg_log_error("client %d aborted: failed to exit pipeline mode for rolling back the failed transaction",
+ st->id);
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ * Get the transaction status at the end of a command especially for
+ * checking if we are in a (failed) transaction block.
+ */
+static TStatus
+getTransactionStatus(PGconn *con)
+{
+ PGTransactionStatusType tx_status;
+
+ tx_status = PQtransactionStatus(con);
+ switch (tx_status)
+ {
+ case PQTRANS_IDLE:
+ return TSTATUS_IDLE;
+ case PQTRANS_INTRANS:
+ case PQTRANS_INERROR:
+ return TSTATUS_IN_BLOCK;
+ case PQTRANS_UNKNOWN:
+ /* PQTRANS_UNKNOWN is expected given a broken connection */
+ if (PQstatus(con) == CONNECTION_BAD)
+ return TSTATUS_CONN_ERROR;
+ /* fall through */
+ case PQTRANS_ACTIVE:
+ default:
+
+ /*
+ * We cannot find out whether we are in a transaction block or
+ * not. Internal error which should never occur.
+ */
+ pg_log_error("unexpected transaction status %d", tx_status);
+ return TSTATUS_OTHER_ERROR;
+ }
+
+ /* not reached */
+ Assert(false);
+ return TSTATUS_OTHER_ERROR;
+}
+
+/*
+ * Print verbose messages of an error
+ */
+static void
+printVerboseErrorMessages(CState *st, pg_time_usec_t *now, bool is_retry)
+{
+ static PQExpBuffer buf = NULL;
+
+ if (buf == NULL)
+ buf = createPQExpBuffer();
+ else
+ resetPQExpBuffer(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);
+
+ /* Print max_tries if it is not unlimited. */
+ if (max_tries)
+ appendPQExpBuffer(buf, "/%u", max_tries);
+
+ /*
+ * If the latency limit is used, print a percentage of the current
+ * transaction latency from the latency limit.
+ */
+ if (latency_limit)
+ {
+ pg_time_now_lazy(now);
+ appendPQExpBuffer(buf, ", %.3f%% of the maximum time of tries was used",
+ (100.0 * (*now - st->txn_scheduled) / latency_limit));
+ }
+ appendPQExpBufferStr(buf, ")\n");
+
+ pg_log_info("%s", buf->data);
+}
+
+/*
+ * Advance the state machine of a connection.
+ */
+static void
+advanceConnectionState(TState *thread, CState *st, StatsData *agg)
+{
+
+ /*
+ * gettimeofday() isn't free, so we get the current timestamp lazily the
+ * first time it's needed, and reuse the same value throughout this
+ * function after that. This also ensures that e.g. the calculated
+ * latency reported in the log file and in the totals are the same. Zero
+ * means "not set yet". Reset "now" when we execute shell commands or
+ * expressions, which might take a non-negligible amount of time, though.
+ */
+ pg_time_usec_t now = 0;
+
+ /*
+ * Loop in the state machine, until we have to wait for a result from the
+ * server or have to sleep for throttling or \sleep.
+ *
+ * Note: In the switch-statement below, 'break' will loop back here,
+ * meaning "continue in the state machine". Return is used to return to
+ * the caller, giving the thread the opportunity to advance another
+ * client.
+ */
+ for (;;)
+ {
+ Command *command;
+
+ switch (st->state)
+ {
+ /* Select transaction (script) to run. */
+ case CSTATE_CHOOSE_SCRIPT:
+ st->use_file = chooseScript(thread);
+ Assert(conditional_stack_empty(st->cstack));
+
+ /* reset transaction variables to default values */
+ st->estatus = ESTATUS_NO_ERROR;
+ st->tries = 1;
+
+ pg_log_debug("client %d executing script \"%s\"",
+ st->id, sql_script[st->use_file].desc);
+
+ /*
+ * If time is over, we're done; otherwise, get ready to start
+ * a new transaction, or to get throttled if that's requested.
+ */
+ st->state = timer_exceeded ? CSTATE_FINISHED :
+ throttle_delay > 0 ? CSTATE_PREPARE_THROTTLE : CSTATE_START_TX;
+ break;
+
+ /* Start new transaction (script) */
+ case CSTATE_START_TX:
+ pg_time_now_lazy(&now);
+
+ /* establish connection if needed, i.e. under --connect */
+ if (st->con == NULL)
+ {
+ pg_time_usec_t start = now;
+
+ if ((st->con = doConnect()) == NULL)
+ {
+ /*
+ * as the bench is already running, we do not abort
+ * the process
+ */
+ pg_log_error("client %d aborted while establishing connection", st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+
+ /* reset now after connection */
+ now = pg_time_now();
+
+ thread->conn_duration += now - start;
+
+ /* Reset session-local state */
+ pg_free(st->prepared);
+ st->prepared = NULL;
+ }
+
+ /*
+ * It is the first try to run this transaction. Remember the
+ * random state: maybe it will get an error and we will need
+ * to run it again.
+ */
+ st->random_state = st->cs_func_rs;
+
+ /* record transaction start time */
+ st->txn_begin = now;
+
+ /*
+ * When not throttling, this is also the transaction's
+ * scheduled start time.
+ */
+ if (!throttle_delay)
+ st->txn_scheduled = now;
+
+ /* Begin with the first command */
+ st->state = CSTATE_START_COMMAND;
+ st->command = 0;
+ break;
+
+ /*
+ * Handle throttling once per transaction by sleeping.
+ */
+ case CSTATE_PREPARE_THROTTLE:
+
+ /*
+ * Generate a delay such that the series of delays will
+ * approximate a Poisson distribution centered on the
+ * throttle_delay time.
+ *
+ * If transactions are too slow or a given wait is shorter
+ * than a transaction, the next transaction will start right
+ * away.
+ */
+ Assert(throttle_delay > 0);
+
+ thread->throttle_trigger +=
+ getPoissonRand(&thread->ts_throttle_rs, throttle_delay);
+ st->txn_scheduled = thread->throttle_trigger;
+
+ /*
+ * If --latency-limit is used, and this slot is already late
+ * so that the transaction will miss the latency limit even if
+ * it completed immediately, skip this time slot and loop to
+ * reschedule.
+ */
+ if (latency_limit)
+ {
+ pg_time_now_lazy(&now);
+
+ if (thread->throttle_trigger < now - latency_limit)
+ {
+ processXactStats(thread, st, &now, true, agg);
+
+ /*
+ * Finish client if -T or -t was exceeded.
+ *
+ * Stop counting skipped transactions under -T as soon
+ * as the timer is exceeded. Because otherwise it can
+ * take a very long time to count all of them
+ * especially when quite a lot of them happen with
+ * unrealistically high rate setting in -R, which
+ * would prevent pgbench from ending immediately.
+ * Because of this behavior, note that there is no
+ * guarantee that all skipped transactions are counted
+ * under -T though there is under -t. This is OK in
+ * practice because it's very unlikely to happen with
+ * realistic setting.
+ */
+ if (timer_exceeded || (nxacts > 0 && st->cnt >= nxacts))
+ st->state = CSTATE_FINISHED;
+
+ /* Go back to top of loop with CSTATE_PREPARE_THROTTLE */
+ break;
+ }
+ }
+
+ /*
+ * stop client if next transaction is beyond pgbench end of
+ * execution; otherwise, throttle it.
+ */
+ st->state = end_time > 0 && st->txn_scheduled > end_time ?
+ CSTATE_FINISHED : CSTATE_THROTTLE;
+ break;
+
+ /*
+ * Wait until it's time to start next transaction.
+ */
+ case CSTATE_THROTTLE:
+ pg_time_now_lazy(&now);
+
+ if (now < st->txn_scheduled)
+ return; /* still sleeping, nothing to do here */
+
+ /* done sleeping, but don't start transaction if we're done */
+ st->state = timer_exceeded ? CSTATE_FINISHED : CSTATE_START_TX;
+ break;
+
+ /*
+ * Send a command to server (or execute a meta-command)
+ */
+ case CSTATE_START_COMMAND:
+ command = sql_script[st->use_file].commands[st->command];
+
+ /*
+ * Transition to script end processing if done, but close up
+ * shop if a pipeline is open at this point.
+ */
+ if (command == NULL)
+ {
+ if (PQpipelineStatus(st->con) == PQ_PIPELINE_OFF)
+ st->state = CSTATE_END_TX;
+ else
+ {
+ pg_log_error("client %d aborted: end of script reached with pipeline open",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ }
+
+ break;
+ }
+
+ /* record begin time of next command, and initiate it */
+ if (report_per_command)
+ {
+ pg_time_now_lazy(&now);
+ st->stmt_begin = now;
+ }
+
+ /* Execute the command */
+ if (command->type == SQL_COMMAND)
+ {
+ /* disallow \aset and \gset in pipeline mode */
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF)
+ {
+ if (command->meta == META_GSET)
+ {
+ commandFailed(st, "gset", "\\gset is not allowed in pipeline mode");
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ else if (command->meta == META_ASET)
+ {
+ commandFailed(st, "aset", "\\aset is not allowed in pipeline mode");
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ }
+
+ if (!sendCommand(st, command))
+ {
+ commandFailed(st, "SQL", "SQL command send failed");
+ st->state = CSTATE_ABORTED;
+ }
+ else
+ {
+ /* Wait for results, unless in pipeline mode */
+ if (PQpipelineStatus(st->con) == PQ_PIPELINE_OFF)
+ st->state = CSTATE_WAIT_RESULT;
+ else
+ st->state = CSTATE_END_COMMAND;
+ }
+ }
+ else if (command->type == META_COMMAND)
+ {
+ /*-----
+ * Possible state changes when executing meta commands:
+ * - on errors CSTATE_ABORTED
+ * - on sleep CSTATE_SLEEP
+ * - else CSTATE_END_COMMAND
+ */
+ st->state = executeMetaCommand(st, &now);
+ if (st->state == CSTATE_ABORTED)
+ st->estatus = ESTATUS_META_COMMAND_ERROR;
+ }
+
+ /*
+ * We're now waiting for an SQL command to complete, or
+ * finished processing a metacommand, or need to sleep, or
+ * something bad happened.
+ */
+ Assert(st->state == CSTATE_WAIT_RESULT ||
+ st->state == CSTATE_END_COMMAND ||
+ st->state == CSTATE_SLEEP ||
+ st->state == CSTATE_ABORTED);
+ break;
+
+ /*
+ * non executed conditional branch
+ */
+ case CSTATE_SKIP_COMMAND:
+ Assert(!conditional_active(st->cstack));
+ /* quickly skip commands until something to do... */
+ while (true)
+ {
+ command = sql_script[st->use_file].commands[st->command];
+
+ /* cannot reach end of script in that state */
+ Assert(command != NULL);
+
+ /*
+ * if this is conditional related, update conditional
+ * state
+ */
+ if (command->type == META_COMMAND &&
+ (command->meta == META_IF ||
+ command->meta == META_ELIF ||
+ command->meta == META_ELSE ||
+ command->meta == META_ENDIF))
+ {
+ switch (conditional_stack_peek(st->cstack))
+ {
+ case IFSTATE_FALSE:
+ if (command->meta == META_IF ||
+ command->meta == META_ELIF)
+ {
+ /* we must evaluate the condition */
+ st->state = CSTATE_START_COMMAND;
+ }
+ else if (command->meta == META_ELSE)
+ {
+ /* we must execute next command */
+ conditional_stack_poke(st->cstack,
+ IFSTATE_ELSE_TRUE);
+ st->state = CSTATE_START_COMMAND;
+ st->command++;
+ }
+ else if (command->meta == META_ENDIF)
+ {
+ Assert(!conditional_stack_empty(st->cstack));
+ conditional_stack_pop(st->cstack);
+ if (conditional_active(st->cstack))
+ st->state = CSTATE_START_COMMAND;
+
+ /*
+ * else state remains in
+ * CSTATE_SKIP_COMMAND
+ */
+ st->command++;
+ }
+ break;
+
+ case IFSTATE_IGNORED:
+ case IFSTATE_ELSE_FALSE:
+ if (command->meta == META_IF)
+ conditional_stack_push(st->cstack,
+ IFSTATE_IGNORED);
+ else if (command->meta == META_ENDIF)
+ {
+ Assert(!conditional_stack_empty(st->cstack));
+ conditional_stack_pop(st->cstack);
+ if (conditional_active(st->cstack))
+ st->state = CSTATE_START_COMMAND;
+ }
+ /* could detect "else" & "elif" after "else" */
+ st->command++;
+ break;
+
+ case IFSTATE_NONE:
+ case IFSTATE_TRUE:
+ case IFSTATE_ELSE_TRUE:
+ default:
+
+ /*
+ * inconsistent if inactive, unreachable dead
+ * code
+ */
+ Assert(false);
+ }
+ }
+ else
+ {
+ /* skip and consider next */
+ st->command++;
+ }
+
+ if (st->state != CSTATE_SKIP_COMMAND)
+ /* out of quick skip command loop */
+ break;
+ }
+ break;
+
+ /*
+ * Wait for the current SQL command to complete
+ */
+ case CSTATE_WAIT_RESULT:
+ pg_log_debug("client %d receiving", st->id);
+
+ /*
+ * Only check for new network data if we processed all data
+ * fetched prior. Otherwise we end up doing a syscall for each
+ * individual pipelined query, which has a measurable
+ * performance impact.
+ */
+ if (PQisBusy(st->con) && !PQconsumeInput(st->con))
+ {
+ /* there's something wrong */
+ commandFailed(st, "SQL", "perhaps the backend died while processing");
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ if (PQisBusy(st->con))
+ return; /* don't have the whole result yet */
+
+ /* store or discard the query results */
+ if (readCommandResponse(st,
+ sql_script[st->use_file].commands[st->command]->meta,
+ sql_script[st->use_file].commands[st->command]->varprefix))
+ {
+ /*
+ * outside of pipeline mode: stop reading results.
+ * pipeline mode: continue reading results until an
+ * end-of-pipeline response.
+ */
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON)
+ st->state = CSTATE_END_COMMAND;
+ }
+ else if (canRetryError(st->estatus))
+ st->state = CSTATE_ERROR;
+ else
+ st->state = CSTATE_ABORTED;
+ break;
+
+ /*
+ * Wait until sleep is done. This state is entered after a
+ * \sleep metacommand. The behavior is similar to
+ * CSTATE_THROTTLE, but proceeds to CSTATE_START_COMMAND
+ * instead of CSTATE_START_TX.
+ */
+ case CSTATE_SLEEP:
+ pg_time_now_lazy(&now);
+ if (now < st->sleep_until)
+ return; /* still sleeping, nothing to do here */
+ /* Else done sleeping. */
+ st->state = CSTATE_END_COMMAND;
+ break;
+
+ /*
+ * End of command: record stats and proceed to next command.
+ */
+ case CSTATE_END_COMMAND:
+
+ /*
+ * command completed: accumulate per-command execution times
+ * in thread-local data structure, if per-command latencies
+ * are requested.
+ */
+ if (report_per_command)
+ {
+ pg_time_now_lazy(&now);
+
+ command = sql_script[st->use_file].commands[st->command];
+ /* XXX could use a mutex here, but we choose not to */
+ addToSimpleStats(&command->stats,
+ PG_TIME_GET_DOUBLE(now - st->stmt_begin));
+ }
+
+ /* Go ahead with next command, to be executed or skipped */
+ st->command++;
+ st->state = conditional_active(st->cstack) ?
+ CSTATE_START_COMMAND : CSTATE_SKIP_COMMAND;
+ break;
+
+ /*
+ * Clean up after an error.
+ */
+ case CSTATE_ERROR:
+ {
+ TStatus tstatus;
+
+ Assert(st->estatus != ESTATUS_NO_ERROR);
+
+ /* Clear the conditional stack */
+ conditional_stack_reset(st->cstack);
+
+ /* Read and discard until a sync point in pipeline mode */
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF)
+ {
+ if (!discardUntilSync(st))
+ {
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ }
+
+ /*
+ * Check if we have a (failed) transaction block or not,
+ * and roll it back if any.
+ */
+ tstatus = getTransactionStatus(st->con);
+ if (tstatus == TSTATUS_IN_BLOCK)
+ {
+ /* Try to rollback a (failed) transaction block. */
+ if (!PQsendQuery(st->con, "ROLLBACK"))
+ {
+ pg_log_error("client %d aborted: failed to send sql command for rolling back the failed transaction",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ }
+ else
+ st->state = CSTATE_WAIT_ROLLBACK_RESULT;
+ }
+ else if (tstatus == TSTATUS_IDLE)
+ {
+ /*
+ * If time is over, we're done; otherwise, check if we
+ * can retry the error.
+ */
+ st->state = timer_exceeded ? CSTATE_FINISHED :
+ doRetry(st, &now) ? CSTATE_RETRY : CSTATE_FAILURE;
+ }
+ else
+ {
+ if (tstatus == TSTATUS_CONN_ERROR)
+ pg_log_error("perhaps the backend died while processing");
+
+ pg_log_error("client %d aborted while receiving the transaction status", st->id);
+ st->state = CSTATE_ABORTED;
+ }
+ break;
+ }
+
+ /*
+ * Wait for the rollback command to complete
+ */
+ case CSTATE_WAIT_ROLLBACK_RESULT:
+ {
+ PGresult *res;
+
+ pg_log_debug("client %d receiving", st->id);
+ if (!PQconsumeInput(st->con))
+ {
+ pg_log_error("client %d aborted while rolling back the transaction after an error; perhaps the backend died while processing",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ if (PQisBusy(st->con))
+ return; /* don't have the whole result yet */
+
+ /*
+ * Read and discard the query result;
+ */
+ res = PQgetResult(st->con);
+ switch (PQresultStatus(res))
+ {
+ case PGRES_COMMAND_OK:
+ /* OK */
+ PQclear(res);
+ /* null must be returned */
+ res = PQgetResult(st->con);
+ Assert(res == NULL);
+
+ /*
+ * If time is over, we're done; otherwise, check
+ * if we can retry the error.
+ */
+ st->state = timer_exceeded ? CSTATE_FINISHED :
+ doRetry(st, &now) ? CSTATE_RETRY : CSTATE_FAILURE;
+ break;
+ default:
+ pg_log_error("client %d aborted while rolling back the transaction after an error; %s",
+ st->id, PQerrorMessage(st->con));
+ PQclear(res);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ break;
+ }
+
+ /*
+ * Retry the transaction after an error.
+ */
+ case CSTATE_RETRY:
+ command = sql_script[st->use_file].commands[st->command];
+
+ /*
+ * Inform that the transaction will be retried after the
+ * error.
+ */
+ if (verbose_errors)
+ printVerboseErrorMessages(st, &now, true);
+
+ /* Count tries and retries */
+ st->tries++;
+ command->retries++;
+
+ /*
+ * Reset the random state as they were at the beginning of the
+ * transaction.
+ */
+ st->cs_func_rs = st->random_state;
+
+ /* Process the first transaction command. */
+ st->command = 0;
+ st->estatus = ESTATUS_NO_ERROR;
+ st->state = CSTATE_START_COMMAND;
+ break;
+
+ /*
+ * Record a failed transaction.
+ */
+ case CSTATE_FAILURE:
+ command = sql_script[st->use_file].commands[st->command];
+
+ /* Accumulate the failure. */
+ command->failures++;
+
+ /*
+ * Inform that the failed transaction will not be retried.
+ */
+ if (verbose_errors)
+ printVerboseErrorMessages(st, &now, false);
+
+ /* End the failed transaction. */
+ st->state = CSTATE_END_TX;
+ break;
+
+ /*
+ * End of transaction (end of script, really).
+ */
+ case CSTATE_END_TX:
+ {
+ TStatus tstatus;
+
+ /* transaction finished: calculate latency and do log */
+ processXactStats(thread, st, &now, false, agg);
+
+ /*
+ * missing \endif... cannot happen if CheckConditional was
+ * okay
+ */
+ Assert(conditional_stack_empty(st->cstack));
+
+ /*
+ * We must complete all the transaction blocks that were
+ * started in this script.
+ */
+ tstatus = getTransactionStatus(st->con);
+ if (tstatus == TSTATUS_IN_BLOCK)
+ {
+ pg_log_error("client %d aborted: end of script reached without completing the last transaction",
+ st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+ else if (tstatus != TSTATUS_IDLE)
+ {
+ if (tstatus == TSTATUS_CONN_ERROR)
+ pg_log_error("perhaps the backend died while processing");
+
+ pg_log_error("client %d aborted while receiving the transaction status", st->id);
+ st->state = CSTATE_ABORTED;
+ break;
+ }
+
+ if (is_connect)
+ {
+ pg_time_usec_t start = now;
+
+ pg_time_now_lazy(&start);
+ finishCon(st);
+ now = pg_time_now();
+ thread->conn_duration += now - start;
+ }
+
+ if ((st->cnt >= nxacts && duration <= 0) || timer_exceeded)
+ {
+ /* script completed */
+ st->state = CSTATE_FINISHED;
+ break;
+ }
+
+ /* next transaction (script) */
+ st->state = CSTATE_CHOOSE_SCRIPT;
+
+ /*
+ * Ensure that we always return on this point, so as to
+ * avoid an infinite loop if the script only contains meta
+ * commands.
+ */
+ return;
+ }
+
+ /*
+ * Final states. Close the connection if it's still open.
+ */
+ case CSTATE_ABORTED:
+ case CSTATE_FINISHED:
+
+ /*
+ * Don't measure the disconnection delays here even if in
+ * CSTATE_FINISHED and -C/--connect option is specified.
+ * Because in this case all the connections that this thread
+ * established are closed at the end of transactions and the
+ * disconnection delays should have already been measured at
+ * that moment.
+ *
+ * In CSTATE_ABORTED state, the measurement is no longer
+ * necessary because we cannot report complete results anyways
+ * in this case.
+ */
+ finishCon(st);
+ return;
+ }
+ }
+}
+
+/*
+ * Subroutine for advanceConnectionState -- initiate or execute the current
+ * meta command, and return the next state to set.
+ *
+ * *now is updated to the current time, unless the command is expected to
+ * take no time to execute.
+ */
+static ConnectionStateEnum
+executeMetaCommand(CState *st, pg_time_usec_t *now)
+{
+ Command *command = sql_script[st->use_file].commands[st->command];
+ int argc;
+ char **argv;
+
+ Assert(command != NULL && command->type == META_COMMAND);
+
+ argc = command->argc;
+ argv = command->argv;
+
+ if (unlikely(__pg_log_level <= PG_LOG_DEBUG))
+ {
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf, "client %d executing \\%s", st->id, argv[0]);
+ for (int i = 1; i < argc; i++)
+ appendPQExpBuffer(&buf, " %s", argv[i]);
+
+ pg_log_debug("%s", buf.data);
+
+ termPQExpBuffer(&buf);
+ }
+
+ if (command->meta == META_SLEEP)
+ {
+ int usec;
+
+ /*
+ * A \sleep doesn't execute anything, we just get the delay from the
+ * argument, and enter the CSTATE_SLEEP state. (The per-command
+ * latency will be recorded in CSTATE_SLEEP state, not here, after the
+ * delay has elapsed.)
+ */
+ if (!evaluateSleep(&st->variables, argc, argv, &usec))
+ {
+ commandFailed(st, "sleep", "execution of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ pg_time_now_lazy(now);
+ st->sleep_until = (*now) + usec;
+ return CSTATE_SLEEP;
+ }
+ else if (command->meta == META_SET)
+ {
+ PgBenchExpr *expr = command->expr;
+ PgBenchValue result;
+
+ if (!evaluateExpr(st, expr, &result))
+ {
+ commandFailed(st, argv[0], "evaluation of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ if (!putVariableValue(&st->variables, argv[0], argv[1], &result))
+ {
+ commandFailed(st, "set", "assignment of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_IF)
+ {
+ /* backslash commands with an expression to evaluate */
+ PgBenchExpr *expr = command->expr;
+ PgBenchValue result;
+ bool cond;
+
+ if (!evaluateExpr(st, expr, &result))
+ {
+ commandFailed(st, argv[0], "evaluation of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ cond = valueTruth(&result);
+ conditional_stack_push(st->cstack, cond ? IFSTATE_TRUE : IFSTATE_FALSE);
+ }
+ else if (command->meta == META_ELIF)
+ {
+ /* backslash commands with an expression to evaluate */
+ PgBenchExpr *expr = command->expr;
+ PgBenchValue result;
+ bool cond;
+
+ if (conditional_stack_peek(st->cstack) == IFSTATE_TRUE)
+ {
+ /* elif after executed block, skip eval and wait for endif. */
+ conditional_stack_poke(st->cstack, IFSTATE_IGNORED);
+ return CSTATE_END_COMMAND;
+ }
+
+ if (!evaluateExpr(st, expr, &result))
+ {
+ commandFailed(st, argv[0], "evaluation of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+
+ cond = valueTruth(&result);
+ Assert(conditional_stack_peek(st->cstack) == IFSTATE_FALSE);
+ conditional_stack_poke(st->cstack, cond ? IFSTATE_TRUE : IFSTATE_FALSE);
+ }
+ else if (command->meta == META_ELSE)
+ {
+ switch (conditional_stack_peek(st->cstack))
+ {
+ case IFSTATE_TRUE:
+ conditional_stack_poke(st->cstack, IFSTATE_ELSE_FALSE);
+ break;
+ case IFSTATE_FALSE: /* inconsistent if active */
+ case IFSTATE_IGNORED: /* inconsistent if active */
+ case IFSTATE_NONE: /* else without if */
+ case IFSTATE_ELSE_TRUE: /* else after else */
+ case IFSTATE_ELSE_FALSE: /* else after else */
+ default:
+ /* dead code if conditional check is ok */
+ Assert(false);
+ }
+ }
+ else if (command->meta == META_ENDIF)
+ {
+ Assert(!conditional_stack_empty(st->cstack));
+ conditional_stack_pop(st->cstack);
+ }
+ else if (command->meta == META_SETSHELL)
+ {
+ if (!runShellCommand(&st->variables, argv[1], argv + 2, argc - 2))
+ {
+ commandFailed(st, "setshell", "execution of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_SHELL)
+ {
+ if (!runShellCommand(&st->variables, NULL, argv + 1, argc - 1))
+ {
+ commandFailed(st, "shell", "execution of meta-command failed");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_STARTPIPELINE)
+ {
+ /*
+ * In pipeline mode, we use a workflow based on libpq pipeline
+ * functions.
+ */
+ if (querymode == QUERY_SIMPLE)
+ {
+ commandFailed(st, "startpipeline", "cannot use pipeline mode with the simple query protocol");
+ return CSTATE_ABORTED;
+ }
+
+ /*
+ * If we're in prepared-query mode, we need to prepare all the
+ * commands that are inside the pipeline before we actually start the
+ * pipeline itself. This solves the problem that running BEGIN
+ * ISOLATION LEVEL SERIALIZABLE in a pipeline would fail due to a
+ * snapshot having been acquired by the prepare within the pipeline.
+ */
+ if (querymode == QUERY_PREPARED)
+ prepareCommandsInPipeline(st);
+
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_OFF)
+ {
+ commandFailed(st, "startpipeline", "already in pipeline mode");
+ return CSTATE_ABORTED;
+ }
+ if (PQenterPipelineMode(st->con) == 0)
+ {
+ commandFailed(st, "startpipeline", "failed to enter pipeline mode");
+ return CSTATE_ABORTED;
+ }
+ }
+ else if (command->meta == META_ENDPIPELINE)
+ {
+ if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON)
+ {
+ commandFailed(st, "endpipeline", "not in pipeline mode");
+ return CSTATE_ABORTED;
+ }
+ if (!PQpipelineSync(st->con))
+ {
+ commandFailed(st, "endpipeline", "failed to send a pipeline sync");
+ return CSTATE_ABORTED;
+ }
+ /* Now wait for the PGRES_PIPELINE_SYNC and exit pipeline mode there */
+ /* collect pending results before getting out of pipeline mode */
+ return CSTATE_WAIT_RESULT;
+ }
+
+ /*
+ * executing the expression or shell command might have taken a
+ * non-negligible amount of time, so reset 'now'
+ */
+ *now = 0;
+
+ return CSTATE_END_COMMAND;
+}
+
+/*
+ * Return the number of failed transactions.
+ */
+static int64
+getFailures(const StatsData *stats)
+{
+ return (stats->serialization_failures +
+ stats->deadlock_failures);
+}
+
+/*
+ * Return a string constant representing the result of a transaction
+ * that is not successfully processed.
+ */
+static const char *
+getResultString(bool skipped, EStatus estatus)
+{
+ if (skipped)
+ return "skipped";
+ else if (failures_detailed)
+ {
+ switch (estatus)
+ {
+ case ESTATUS_SERIALIZATION_ERROR:
+ return "serialization";
+ case ESTATUS_DEADLOCK_ERROR:
+ return "deadlock";
+ default:
+ /* internal error which should never occur */
+ pg_fatal("unexpected error status: %d", estatus);
+ }
+ }
+ else
+ return "failed";
+}
+
+/*
+ * Print log entry after completing one transaction.
+ *
+ * We print Unix-epoch timestamps in the log, so that entries can be
+ * correlated against other logs.
+ *
+ * XXX We could obtain the time from the caller and just shift it here, to
+ * avoid the cost of an extra call to pg_time_now().
+ */
+static void
+doLog(TState *thread, CState *st,
+ StatsData *agg, bool skipped, double latency, double lag)
+{
+ FILE *logfile = thread->logfile;
+ pg_time_usec_t now = pg_time_now() + epoch_shift;
+
+ Assert(use_log);
+
+ /*
+ * Skip the log entry if sampling is enabled and this row doesn't belong
+ * to the random sample.
+ */
+ if (sample_rate != 0.0 &&
+ pg_prng_double(&thread->ts_sample_rs) > sample_rate)
+ return;
+
+ /* should we aggregate the results or not? */
+ if (agg_interval > 0)
+ {
+ pg_time_usec_t next;
+
+ /*
+ * Loop until we reach the interval of the current moment, and print
+ * any empty intervals in between (this may happen with very low tps,
+ * e.g. --rate=0.1).
+ */
+
+ while ((next = agg->start_time + agg_interval * INT64CONST(1000000)) <= now)
+ {
+ double lag_sum = 0.0;
+ double lag_sum2 = 0.0;
+ double lag_min = 0.0;
+ double lag_max = 0.0;
+ int64 skipped = 0;
+ int64 serialization_failures = 0;
+ int64 deadlock_failures = 0;
+ int64 retried = 0;
+ int64 retries = 0;
+
+ /* print aggregated report to logfile */
+ fprintf(logfile, INT64_FORMAT " " INT64_FORMAT " %.0f %.0f %.0f %.0f",
+ agg->start_time / 1000000, /* seconds since Unix epoch */
+ agg->cnt,
+ agg->latency.sum,
+ agg->latency.sum2,
+ agg->latency.min,
+ agg->latency.max);
+
+ if (throttle_delay)
+ {
+ lag_sum = agg->lag.sum;
+ lag_sum2 = agg->lag.sum2;
+ lag_min = agg->lag.min;
+ lag_max = agg->lag.max;
+ }
+ fprintf(logfile, " %.0f %.0f %.0f %.0f",
+ lag_sum,
+ lag_sum2,
+ lag_min,
+ lag_max);
+
+ if (latency_limit)
+ skipped = agg->skipped;
+ fprintf(logfile, " " INT64_FORMAT, skipped);
+
+ if (max_tries != 1)
+ {
+ retried = agg->retried;
+ retries = agg->retries;
+ }
+ fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT, retried, retries);
+
+ if (failures_detailed)
+ {
+ serialization_failures = agg->serialization_failures;
+ deadlock_failures = agg->deadlock_failures;
+ }
+ fprintf(logfile, " " INT64_FORMAT " " INT64_FORMAT,
+ serialization_failures,
+ deadlock_failures);
+
+ fputc('\n', logfile);
+
+ /* reset data and move to next interval */
+ initStats(agg, next);
+ }
+
+ /* accumulate the current transaction */
+ accumStats(agg, skipped, latency, lag, st->estatus, st->tries);
+ }
+ else
+ {
+ /* no, print raw transactions */
+ if (!skipped && st->estatus == ESTATUS_NO_ERROR)
+ fprintf(logfile, "%d " INT64_FORMAT " %.0f %d " INT64_FORMAT " "
+ INT64_FORMAT,
+ st->id, st->cnt, latency, st->use_file,
+ now / 1000000, now % 1000000);
+ else
+ fprintf(logfile, "%d " INT64_FORMAT " %s %d " INT64_FORMAT " "
+ INT64_FORMAT,
+ st->id, st->cnt, getResultString(skipped, st->estatus),
+ st->use_file, now / 1000000, now % 1000000);
+
+ if (throttle_delay)
+ fprintf(logfile, " %.0f", lag);
+ if (max_tries != 1)
+ fprintf(logfile, " %u", st->tries - 1);
+ fputc('\n', logfile);
+ }
+}
+
+/*
+ * Accumulate and report statistics at end of a transaction.
+ *
+ * (This is also called when a transaction is late and thus skipped.
+ * Note that even skipped and failed transactions are counted in the CState
+ * "cnt" field.)
+ */
+static void
+processXactStats(TState *thread, CState *st, pg_time_usec_t *now,
+ bool skipped, StatsData *agg)
+{
+ double latency = 0.0,
+ lag = 0.0;
+ bool detailed = progress || throttle_delay || latency_limit ||
+ use_log || per_script_stats;
+
+ if (detailed && !skipped && st->estatus == ESTATUS_NO_ERROR)
+ {
+ pg_time_now_lazy(now);
+
+ /* compute latency & lag */
+ latency = (*now) - st->txn_scheduled;
+ lag = st->txn_begin - st->txn_scheduled;
+ }
+
+ /* keep detailed thread stats */
+ accumStats(&thread->stats, skipped, latency, lag, st->estatus, st->tries);
+
+ /* count transactions over the latency limit, if needed */
+ if (latency_limit && latency > latency_limit)
+ thread->latency_late++;
+
+ /* client stat is just counting */
+ st->cnt++;
+
+ if (use_log)
+ doLog(thread, st, agg, skipped, latency, lag);
+
+ /* XXX could use a mutex here, but we choose not to */
+ if (per_script_stats)
+ accumStats(&sql_script[st->use_file].stats, skipped, latency, lag,
+ st->estatus, st->tries);
+}
+
+
+/* discard connections */
+static void
+disconnect_all(CState *state, int length)
+{
+ int i;
+
+ for (i = 0; i < length; i++)
+ finishCon(&state[i]);
+}
+
+/*
+ * Remove old pgbench tables, if any exist
+ */
+static void
+initDropTables(PGconn *con)
+{
+ fprintf(stderr, "dropping old tables...\n");
+
+ /*
+ * We drop all the tables in one command, so that whether there are
+ * foreign key dependencies or not doesn't matter.
+ */
+ executeStatement(con, "drop table if exists "
+ "pgbench_accounts, "
+ "pgbench_branches, "
+ "pgbench_history, "
+ "pgbench_tellers");
+}
+
+/*
+ * Create "pgbench_accounts" partitions if needed.
+ *
+ * This is the larger table of pgbench default tpc-b like schema
+ * with a known size, so we choose to partition it.
+ */
+static void
+createPartitions(PGconn *con)
+{
+ PQExpBufferData query;
+
+ /* we must have to create some partitions */
+ Assert(partitions > 0);
+
+ fprintf(stderr, "creating %d partitions...\n", partitions);
+
+ initPQExpBuffer(&query);
+
+ for (int p = 1; p <= partitions; p++)
+ {
+ if (partition_method == PART_RANGE)
+ {
+ int64 part_size = (naccounts * (int64) scale + partitions - 1) / partitions;
+
+ printfPQExpBuffer(&query,
+ "create%s table pgbench_accounts_%d\n"
+ " partition of pgbench_accounts\n"
+ " for values from (",
+ unlogged_tables ? " unlogged" : "", p);
+
+ /*
+ * For RANGE, we use open-ended partitions at the beginning and
+ * end to allow any valid value for the primary key. Although the
+ * actual minimum and maximum values can be derived from the
+ * scale, it is more generic and the performance is better.
+ */
+ if (p == 1)
+ appendPQExpBufferStr(&query, "minvalue");
+ else
+ appendPQExpBuffer(&query, INT64_FORMAT, (p - 1) * part_size + 1);
+
+ appendPQExpBufferStr(&query, ") to (");
+
+ if (p < partitions)
+ appendPQExpBuffer(&query, INT64_FORMAT, p * part_size + 1);
+ else
+ appendPQExpBufferStr(&query, "maxvalue");
+
+ appendPQExpBufferChar(&query, ')');
+ }
+ else if (partition_method == PART_HASH)
+ printfPQExpBuffer(&query,
+ "create%s table pgbench_accounts_%d\n"
+ " partition of pgbench_accounts\n"
+ " for values with (modulus %d, remainder %d)",
+ unlogged_tables ? " unlogged" : "", p,
+ partitions, p - 1);
+ else /* cannot get there */
+ Assert(0);
+
+ /*
+ * Per ddlinfo in initCreateTables, fillfactor is needed on table
+ * pgbench_accounts.
+ */
+ appendPQExpBuffer(&query, " with (fillfactor=%d)", fillfactor);
+
+ executeStatement(con, query.data);
+ }
+
+ termPQExpBuffer(&query);
+}
+
+/*
+ * Create pgbench's standard tables
+ */
+static void
+initCreateTables(PGconn *con)
+{
+ /*
+ * Note: TPC-B requires at least 100 bytes per row, and the "filler"
+ * fields in these table declarations were intended to comply with that.
+ * The pgbench_accounts table complies with that because the "filler"
+ * column is set to blank-padded empty string. But for all other tables
+ * the columns default to NULL and so don't actually take any space. We
+ * could fix that by giving them non-null default values. However, that
+ * would completely break comparability of pgbench results with prior
+ * versions. Since pgbench has never pretended to be fully TPC-B compliant
+ * anyway, we stick with the historical behavior.
+ */
+ struct ddlinfo
+ {
+ const char *table; /* table name */
+ const char *smcols; /* column decls if accountIDs are 32 bits */
+ const char *bigcols; /* column decls if accountIDs are 64 bits */
+ int declare_fillfactor;
+ };
+ static const struct ddlinfo DDLs[] = {
+ {
+ "pgbench_history",
+ "tid int,bid int,aid int,delta int,mtime timestamp,filler char(22)",
+ "tid int,bid int,aid bigint,delta int,mtime timestamp,filler char(22)",
+ 0
+ },
+ {
+ "pgbench_tellers",
+ "tid int not null,bid int,tbalance int,filler char(84)",
+ "tid int not null,bid int,tbalance int,filler char(84)",
+ 1
+ },
+ {
+ "pgbench_accounts",
+ "aid int not null,bid int,abalance int,filler char(84)",
+ "aid bigint not null,bid int,abalance int,filler char(84)",
+ 1
+ },
+ {
+ "pgbench_branches",
+ "bid int not null,bbalance int,filler char(88)",
+ "bid int not null,bbalance int,filler char(88)",
+ 1
+ }
+ };
+ int i;
+ PQExpBufferData query;
+
+ fprintf(stderr, "creating tables...\n");
+
+ initPQExpBuffer(&query);
+
+ for (i = 0; i < lengthof(DDLs); i++)
+ {
+ const struct ddlinfo *ddl = &DDLs[i];
+
+ /* Construct new create table statement. */
+ printfPQExpBuffer(&query, "create%s table %s(%s)",
+ unlogged_tables ? " unlogged" : "",
+ ddl->table,
+ (scale >= SCALE_32BIT_THRESHOLD) ? ddl->bigcols : ddl->smcols);
+
+ /* Partition pgbench_accounts table */
+ if (partition_method != PART_NONE && strcmp(ddl->table, "pgbench_accounts") == 0)
+ appendPQExpBuffer(&query,
+ " partition by %s (aid)", PARTITION_METHOD[partition_method]);
+ else if (ddl->declare_fillfactor)
+ {
+ /* fillfactor is only expected on actual tables */
+ appendPQExpBuffer(&query, " with (fillfactor=%d)", fillfactor);
+ }
+
+ if (tablespace != NULL)
+ {
+ char *escape_tablespace;
+
+ escape_tablespace = PQescapeIdentifier(con, tablespace, strlen(tablespace));
+ appendPQExpBuffer(&query, " tablespace %s", escape_tablespace);
+ PQfreemem(escape_tablespace);
+ }
+
+ executeStatement(con, query.data);
+ }
+
+ termPQExpBuffer(&query);
+
+ if (partition_method != PART_NONE)
+ createPartitions(con);
+}
+
+/*
+ * Truncate away any old data, in one command in case there are foreign keys
+ */
+static void
+initTruncateTables(PGconn *con)
+{
+ executeStatement(con, "truncate table "
+ "pgbench_accounts, "
+ "pgbench_branches, "
+ "pgbench_history, "
+ "pgbench_tellers");
+}
+
+/*
+ * Fill the standard tables with some data generated and sent from the client
+ */
+static void
+initGenerateDataClientSide(PGconn *con)
+{
+ PQExpBufferData sql;
+ PGresult *res;
+ int i;
+ int64 k;
+ char *copy_statement;
+
+ /* used to track elapsed time and estimate of the remaining time */
+ pg_time_usec_t start;
+ int log_interval = 1;
+
+ /* Stay on the same line if reporting to a terminal */
+ char eol = isatty(fileno(stderr)) ? '\r' : '\n';
+
+ fprintf(stderr, "generating data (client-side)...\n");
+
+ /*
+ * we do all of this in one transaction to enable the backend's
+ * data-loading optimizations
+ */
+ executeStatement(con, "begin");
+
+ /* truncate away any old data */
+ initTruncateTables(con);
+
+ initPQExpBuffer(&sql);
+
+ /*
+ * fill branches, tellers, accounts in that order in case foreign keys
+ * already exist
+ */
+ for (i = 0; i < nbranches * scale; i++)
+ {
+ /* "filler" column defaults to NULL */
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_branches(bid,bbalance) values(%d,0)",
+ i + 1);
+ executeStatement(con, sql.data);
+ }
+
+ for (i = 0; i < ntellers * scale; i++)
+ {
+ /* "filler" column defaults to NULL */
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_tellers(tid,bid,tbalance) values (%d,%d,0)",
+ i + 1, i / ntellers + 1);
+ executeStatement(con, sql.data);
+ }
+
+ /*
+ * accounts is big enough to be worth using COPY and tracking runtime
+ */
+
+ /* use COPY with FREEZE on v14 and later without partitioning */
+ if (partitions == 0 && PQserverVersion(con) >= 140000)
+ copy_statement = "copy pgbench_accounts from stdin with (freeze on)";
+ else
+ copy_statement = "copy pgbench_accounts from stdin";
+
+ res = PQexec(con, copy_statement);
+
+ if (PQresultStatus(res) != PGRES_COPY_IN)
+ pg_fatal("unexpected copy in result: %s", PQerrorMessage(con));
+ PQclear(res);
+
+ start = pg_time_now();
+
+ for (k = 0; k < (int64) naccounts * scale; k++)
+ {
+ int64 j = k + 1;
+
+ /* "filler" column defaults to blank padded empty string */
+ printfPQExpBuffer(&sql,
+ INT64_FORMAT "\t" INT64_FORMAT "\t%d\t\n",
+ j, k / naccounts + 1, 0);
+ if (PQputline(con, sql.data))
+ pg_fatal("PQputline failed");
+
+ if (CancelRequested)
+ break;
+
+ /*
+ * If we want to stick with the original logging, print a message each
+ * 100k inserted rows.
+ */
+ if ((!use_quiet) && (j % 100000 == 0))
+ {
+ double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
+ double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j;
+
+ fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c",
+ j, (int64) naccounts * scale,
+ (int) (((int64) j * 100) / (naccounts * (int64) scale)),
+ elapsed_sec, remaining_sec, eol);
+ }
+ /* let's not call the timing for each row, but only each 100 rows */
+ else if (use_quiet && (j % 100 == 0))
+ {
+ double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
+ double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j;
+
+ /* have we reached the next interval (or end)? */
+ if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS))
+ {
+ fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c",
+ j, (int64) naccounts * scale,
+ (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec, eol);
+
+ /* skip to the next interval */
+ log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS);
+ }
+ }
+ }
+
+ if (eol != '\n')
+ fputc('\n', stderr); /* Need to move to next line */
+
+ if (PQputline(con, "\\.\n"))
+ pg_fatal("very last PQputline failed");
+ if (PQendcopy(con))
+ pg_fatal("PQendcopy failed");
+
+ termPQExpBuffer(&sql);
+
+ executeStatement(con, "commit");
+}
+
+/*
+ * Fill the standard tables with some data generated on the server
+ *
+ * As already the case with the client-side data generation, the filler
+ * column defaults to NULL in pgbench_branches and pgbench_tellers,
+ * and is a blank-padded string in pgbench_accounts.
+ */
+static void
+initGenerateDataServerSide(PGconn *con)
+{
+ PQExpBufferData sql;
+
+ fprintf(stderr, "generating data (server-side)...\n");
+
+ /*
+ * we do all of this in one transaction to enable the backend's
+ * data-loading optimizations
+ */
+ executeStatement(con, "begin");
+
+ /* truncate away any old data */
+ initTruncateTables(con);
+
+ initPQExpBuffer(&sql);
+
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_branches(bid,bbalance) "
+ "select bid, 0 "
+ "from generate_series(1, %d) as bid", nbranches * scale);
+ executeStatement(con, sql.data);
+
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_tellers(tid,bid,tbalance) "
+ "select tid, (tid - 1) / %d + 1, 0 "
+ "from generate_series(1, %d) as tid", ntellers, ntellers * scale);
+ executeStatement(con, sql.data);
+
+ printfPQExpBuffer(&sql,
+ "insert into pgbench_accounts(aid,bid,abalance,filler) "
+ "select aid, (aid - 1) / %d + 1, 0, '' "
+ "from generate_series(1, " INT64_FORMAT ") as aid",
+ naccounts, (int64) naccounts * scale);
+ executeStatement(con, sql.data);
+
+ termPQExpBuffer(&sql);
+
+ executeStatement(con, "commit");
+}
+
+/*
+ * Invoke vacuum on the standard tables
+ */
+static void
+initVacuum(PGconn *con)
+{
+ fprintf(stderr, "vacuuming...\n");
+ executeStatement(con, "vacuum analyze pgbench_branches");
+ executeStatement(con, "vacuum analyze pgbench_tellers");
+ executeStatement(con, "vacuum analyze pgbench_accounts");
+ executeStatement(con, "vacuum analyze pgbench_history");
+}
+
+/*
+ * Create primary keys on the standard tables
+ */
+static void
+initCreatePKeys(PGconn *con)
+{
+ static const char *const DDLINDEXes[] = {
+ "alter table pgbench_branches add primary key (bid)",
+ "alter table pgbench_tellers add primary key (tid)",
+ "alter table pgbench_accounts add primary key (aid)"
+ };
+ int i;
+ PQExpBufferData query;
+
+ fprintf(stderr, "creating primary keys...\n");
+ initPQExpBuffer(&query);
+
+ for (i = 0; i < lengthof(DDLINDEXes); i++)
+ {
+ resetPQExpBuffer(&query);
+ appendPQExpBufferStr(&query, DDLINDEXes[i]);
+
+ if (index_tablespace != NULL)
+ {
+ char *escape_tablespace;
+
+ escape_tablespace = PQescapeIdentifier(con, index_tablespace,
+ strlen(index_tablespace));
+ appendPQExpBuffer(&query, " using index tablespace %s", escape_tablespace);
+ PQfreemem(escape_tablespace);
+ }
+
+ executeStatement(con, query.data);
+ }
+
+ termPQExpBuffer(&query);
+}
+
+/*
+ * Create foreign key constraints between the standard tables
+ */
+static void
+initCreateFKeys(PGconn *con)
+{
+ static const char *const DDLKEYs[] = {
+ "alter table pgbench_tellers add constraint pgbench_tellers_bid_fkey foreign key (bid) references pgbench_branches",
+ "alter table pgbench_accounts add constraint pgbench_accounts_bid_fkey foreign key (bid) references pgbench_branches",
+ "alter table pgbench_history add constraint pgbench_history_bid_fkey foreign key (bid) references pgbench_branches",
+ "alter table pgbench_history add constraint pgbench_history_tid_fkey foreign key (tid) references pgbench_tellers",
+ "alter table pgbench_history add constraint pgbench_history_aid_fkey foreign key (aid) references pgbench_accounts"
+ };
+ int i;
+
+ fprintf(stderr, "creating foreign keys...\n");
+ for (i = 0; i < lengthof(DDLKEYs); i++)
+ {
+ executeStatement(con, DDLKEYs[i]);
+ }
+}
+
+/*
+ * Validate an initialization-steps string
+ *
+ * (We could just leave it to runInitSteps() to fail if there are wrong
+ * characters, but since initialization can take awhile, it seems friendlier
+ * to check during option parsing.)
+ */
+static void
+checkInitSteps(const char *initialize_steps)
+{
+ if (initialize_steps[0] == '\0')
+ pg_fatal("no initialization steps specified");
+
+ for (const char *step = initialize_steps; *step != '\0'; step++)
+ {
+ if (strchr(ALL_INIT_STEPS " ", *step) == NULL)
+ {
+ pg_log_error("unrecognized initialization step \"%c\"", *step);
+ pg_log_error_detail("Allowed step characters are: \"" ALL_INIT_STEPS "\".");
+ exit(1);
+ }
+ }
+}
+
+/*
+ * Invoke each initialization step in the given string
+ */
+static void
+runInitSteps(const char *initialize_steps)
+{
+ PQExpBufferData stats;
+ PGconn *con;
+ const char *step;
+ double run_time = 0.0;
+ bool first = true;
+
+ initPQExpBuffer(&stats);
+
+ if ((con = doConnect()) == NULL)
+ pg_fatal("could not create connection for initialization");
+
+ setup_cancel_handler(NULL);
+ SetCancelConn(con);
+
+ for (step = initialize_steps; *step != '\0'; step++)
+ {
+ char *op = NULL;
+ pg_time_usec_t start = pg_time_now();
+
+ switch (*step)
+ {
+ case 'd':
+ op = "drop tables";
+ initDropTables(con);
+ break;
+ case 't':
+ op = "create tables";
+ initCreateTables(con);
+ break;
+ case 'g':
+ op = "client-side generate";
+ initGenerateDataClientSide(con);
+ break;
+ case 'G':
+ op = "server-side generate";
+ initGenerateDataServerSide(con);
+ break;
+ case 'v':
+ op = "vacuum";
+ initVacuum(con);
+ break;
+ case 'p':
+ op = "primary keys";
+ initCreatePKeys(con);
+ break;
+ case 'f':
+ op = "foreign keys";
+ initCreateFKeys(con);
+ break;
+ case ' ':
+ break; /* ignore */
+ default:
+ pg_log_error("unrecognized initialization step \"%c\"", *step);
+ PQfinish(con);
+ exit(1);
+ }
+
+ if (op != NULL)
+ {
+ double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
+
+ if (!first)
+ appendPQExpBufferStr(&stats, ", ");
+ else
+ first = false;
+
+ appendPQExpBuffer(&stats, "%s %.2f s", op, elapsed_sec);
+
+ run_time += elapsed_sec;
+ }
+ }
+
+ fprintf(stderr, "done in %.2f s (%s).\n", run_time, stats.data);
+ ResetCancelConn();
+ PQfinish(con);
+ termPQExpBuffer(&stats);
+}
+
+/*
+ * Extract pgbench table information into global variables scale,
+ * partition_method and partitions.
+ */
+static void
+GetTableInfo(PGconn *con, bool scale_given)
+{
+ PGresult *res;
+
+ /*
+ * get the scaling factor that should be same as count(*) from
+ * pgbench_branches if this is not a custom query
+ */
+ res = PQexec(con, "select count(*) from pgbench_branches");
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ char *sqlState = PQresultErrorField(res, PG_DIAG_SQLSTATE);
+
+ pg_log_error("could not count number of branches: %s", PQerrorMessage(con));
+
+ if (sqlState && strcmp(sqlState, ERRCODE_UNDEFINED_TABLE) == 0)
+ pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".",
+ PQdb(con));
+
+ exit(1);
+ }
+ scale = atoi(PQgetvalue(res, 0, 0));
+ if (scale < 0)
+ pg_fatal("invalid count(*) from pgbench_branches: \"%s\"",
+ PQgetvalue(res, 0, 0));
+ PQclear(res);
+
+ /* warn if we override user-given -s switch */
+ if (scale_given)
+ pg_log_warning("scale option ignored, using count from pgbench_branches table (%d)",
+ scale);
+
+ /*
+ * Get the partition information for the first "pgbench_accounts" table
+ * found in search_path.
+ *
+ * The result is empty if no "pgbench_accounts" is found.
+ *
+ * Otherwise, it always returns one row even if the table is not
+ * partitioned (in which case the partition strategy is NULL).
+ *
+ * The number of partitions can be 0 even for partitioned tables, if no
+ * partition is attached.
+ *
+ * We assume no partitioning on any failure, so as to avoid failing on an
+ * old version without "pg_partitioned_table".
+ */
+ res = PQexec(con,
+ "select o.n, p.partstrat, pg_catalog.count(i.inhparent) "
+ "from pg_catalog.pg_class as c "
+ "join pg_catalog.pg_namespace as n on (n.oid = c.relnamespace) "
+ "cross join lateral (select pg_catalog.array_position(pg_catalog.current_schemas(true), n.nspname)) as o(n) "
+ "left join pg_catalog.pg_partitioned_table as p on (p.partrelid = c.oid) "
+ "left join pg_catalog.pg_inherits as i on (c.oid = i.inhparent) "
+ "where c.relname = 'pgbench_accounts' and o.n is not null "
+ "group by 1, 2 "
+ "order by 1 asc "
+ "limit 1");
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ /* probably an older version, coldly assume no partitioning */
+ partition_method = PART_NONE;
+ partitions = 0;
+ }
+ else if (PQntuples(res) == 0)
+ {
+ /*
+ * This case is unlikely as pgbench already found "pgbench_branches"
+ * above to compute the scale.
+ */
+ pg_log_error("no pgbench_accounts table found in search_path");
+ pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con));
+ exit(1);
+ }
+ else /* PQntuples(res) == 1 */
+ {
+ /* normal case, extract partition information */
+ if (PQgetisnull(res, 0, 1))
+ partition_method = PART_NONE;
+ else
+ {
+ char *ps = PQgetvalue(res, 0, 1);
+
+ /* column must be there */
+ Assert(ps != NULL);
+
+ if (strcmp(ps, "r") == 0)
+ partition_method = PART_RANGE;
+ else if (strcmp(ps, "h") == 0)
+ partition_method = PART_HASH;
+ else
+ {
+ /* possibly a newer version with new partition method */
+ pg_fatal("unexpected partition method: \"%s\"", ps);
+ }
+ }
+
+ partitions = atoi(PQgetvalue(res, 0, 2));
+ }
+
+ PQclear(res);
+}
+
+/*
+ * Replace :param with $n throughout the command's SQL text, which
+ * is a modifiable string in cmd->lines.
+ */
+static bool
+parseQuery(Command *cmd)
+{
+ char *sql,
+ *p;
+
+ cmd->argc = 1;
+
+ p = sql = pg_strdup(cmd->lines.data);
+ while ((p = strchr(p, ':')) != NULL)
+ {
+ char var[13];
+ char *name;
+ int eaten;
+
+ name = parseVariable(p, &eaten);
+ if (name == NULL)
+ {
+ while (*p == ':')
+ {
+ p++;
+ }
+ continue;
+ }
+
+ /*
+ * cmd->argv[0] is the SQL statement itself, so the max number of
+ * arguments is one less than MAX_ARGS
+ */
+ if (cmd->argc >= MAX_ARGS)
+ {
+ pg_log_error("statement has too many arguments (maximum is %d): %s",
+ MAX_ARGS - 1, cmd->lines.data);
+ pg_free(name);
+ return false;
+ }
+
+ sprintf(var, "$%d", cmd->argc);
+ p = replaceVariable(&sql, p, eaten, var);
+
+ cmd->argv[cmd->argc] = name;
+ cmd->argc++;
+ }
+
+ Assert(cmd->argv[0] == NULL);
+ cmd->argv[0] = sql;
+ return true;
+}
+
+/*
+ * syntax error while parsing a script (in practice, while parsing a
+ * backslash command, because we don't detect syntax errors in SQL)
+ *
+ * source: source of script (filename or builtin-script ID)
+ * lineno: line number within script (count from 1)
+ * line: whole line of backslash command, if available
+ * command: backslash command name, if available
+ * msg: the actual error message
+ * more: optional extra message
+ * column: zero-based column number, or -1 if unknown
+ */
+void
+syntax_error(const char *source, int lineno,
+ const char *line, const char *command,
+ const char *msg, const char *more, int column)
+{
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf, "%s:%d: %s", source, lineno, msg);
+ if (more != NULL)
+ appendPQExpBuffer(&buf, " (%s)", more);
+ if (column >= 0 && line == NULL)
+ appendPQExpBuffer(&buf, " at column %d", column + 1);
+ if (command != NULL)
+ appendPQExpBuffer(&buf, " in command \"%s\"", command);
+
+ pg_log_error("%s", buf.data);
+
+ termPQExpBuffer(&buf);
+
+ if (line != NULL)
+ {
+ fprintf(stderr, "%s\n", line);
+ if (column >= 0)
+ fprintf(stderr, "%*c error found here\n", column + 1, '^');
+ }
+
+ exit(1);
+}
+
+/*
+ * Return a pointer to the start of the SQL command, after skipping over
+ * whitespace and "--" comments.
+ * If the end of the string is reached, return NULL.
+ */
+static char *
+skip_sql_comments(char *sql_command)
+{
+ char *p = sql_command;
+
+ /* Skip any leading whitespace, as well as "--" style comments */
+ for (;;)
+ {
+ if (isspace((unsigned char) *p))
+ p++;
+ else if (strncmp(p, "--", 2) == 0)
+ {
+ p = strchr(p, '\n');
+ if (p == NULL)
+ return NULL;
+ p++;
+ }
+ else
+ break;
+ }
+
+ /* NULL if there's nothing but whitespace and comments */
+ if (*p == '\0')
+ return NULL;
+
+ return p;
+}
+
+/*
+ * Parse a SQL command; return a Command struct, or NULL if it's a comment
+ *
+ * On entry, psqlscan.l has collected the command into "buf", so we don't
+ * really need to do much here except check for comments and set up a Command
+ * struct.
+ */
+static Command *
+create_sql_command(PQExpBuffer buf, const char *source)
+{
+ Command *my_command;
+ char *p = skip_sql_comments(buf->data);
+
+ if (p == NULL)
+ return NULL;
+
+ /* Allocate and initialize Command structure */
+ my_command = (Command *) pg_malloc(sizeof(Command));
+ initPQExpBuffer(&my_command->lines);
+ appendPQExpBufferStr(&my_command->lines, p);
+ my_command->first_line = NULL; /* this is set later */
+ my_command->type = SQL_COMMAND;
+ my_command->meta = META_NONE;
+ my_command->argc = 0;
+ my_command->retries = 0;
+ my_command->failures = 0;
+ memset(my_command->argv, 0, sizeof(my_command->argv));
+ my_command->varprefix = NULL; /* allocated later, if needed */
+ my_command->expr = NULL;
+ initSimpleStats(&my_command->stats);
+ my_command->prepname = NULL; /* set later, if needed */
+
+ return my_command;
+}
+
+/* Free a Command structure and associated data */
+static void
+free_command(Command *command)
+{
+ termPQExpBuffer(&command->lines);
+ pg_free(command->first_line);
+ for (int i = 0; i < command->argc; i++)
+ pg_free(command->argv[i]);
+ pg_free(command->varprefix);
+
+ /*
+ * It should also free expr recursively, but this is currently not needed
+ * as only gset commands (which do not have an expression) are freed.
+ */
+ pg_free(command);
+}
+
+/*
+ * Once an SQL command is fully parsed, possibly by accumulating several
+ * parts, complete other fields of the Command structure.
+ */
+static void
+postprocess_sql_command(Command *my_command)
+{
+ char buffer[128];
+ static int prepnum = 0;
+
+ Assert(my_command->type == SQL_COMMAND);
+
+ /* Save the first line for error display. */
+ strlcpy(buffer, my_command->lines.data, sizeof(buffer));
+ buffer[strcspn(buffer, "\n\r")] = '\0';
+ my_command->first_line = pg_strdup(buffer);
+
+ /* Parse query and generate prepared statement name, if necessary */
+ switch (querymode)
+ {
+ case QUERY_SIMPLE:
+ my_command->argv[0] = my_command->lines.data;
+ my_command->argc++;
+ break;
+ case QUERY_PREPARED:
+ my_command->prepname = psprintf("P_%d", prepnum++);
+ /* fall through */
+ case QUERY_EXTENDED:
+ if (!parseQuery(my_command))
+ exit(1);
+ break;
+ default:
+ exit(1);
+ }
+}
+
+/*
+ * Parse a backslash command; return a Command struct, or NULL if comment
+ *
+ * At call, we have scanned only the initial backslash.
+ */
+static Command *
+process_backslash_command(PsqlScanState sstate, const char *source)
+{
+ Command *my_command;
+ PQExpBufferData word_buf;
+ int word_offset;
+ int offsets[MAX_ARGS]; /* offsets of argument words */
+ int start_offset;
+ int lineno;
+ int j;
+
+ initPQExpBuffer(&word_buf);
+
+ /* Remember location of the backslash */
+ start_offset = expr_scanner_offset(sstate) - 1;
+ lineno = expr_scanner_get_lineno(sstate, start_offset);
+
+ /* Collect first word of command */
+ if (!expr_lex_one_word(sstate, &word_buf, &word_offset))
+ {
+ termPQExpBuffer(&word_buf);
+ return NULL;
+ }
+
+ /* Allocate and initialize Command structure */
+ my_command = (Command *) pg_malloc0(sizeof(Command));
+ my_command->type = META_COMMAND;
+ my_command->argc = 0;
+ initSimpleStats(&my_command->stats);
+
+ /* Save first word (command name) */
+ j = 0;
+ offsets[j] = word_offset;
+ my_command->argv[j++] = pg_strdup(word_buf.data);
+ my_command->argc++;
+
+ /* ... and convert it to enum form */
+ my_command->meta = getMetaCommand(my_command->argv[0]);
+
+ if (my_command->meta == META_SET ||
+ my_command->meta == META_IF ||
+ my_command->meta == META_ELIF)
+ {
+ yyscan_t yyscanner;
+
+ /* For \set, collect var name */
+ if (my_command->meta == META_SET)
+ {
+ if (!expr_lex_one_word(sstate, &word_buf, &word_offset))
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing argument", NULL, -1);
+
+ offsets[j] = word_offset;
+ my_command->argv[j++] = pg_strdup(word_buf.data);
+ my_command->argc++;
+ }
+
+ /* then for all parse the expression */
+ yyscanner = expr_scanner_init(sstate, source, lineno, start_offset,
+ my_command->argv[0]);
+
+ if (expr_yyparse(yyscanner) != 0)
+ {
+ /* dead code: exit done from syntax_error called by yyerror */
+ exit(1);
+ }
+
+ my_command->expr = expr_parse_result;
+
+ /* Save line, trimming any trailing newline */
+ my_command->first_line =
+ expr_scanner_get_substring(sstate,
+ start_offset,
+ expr_scanner_offset(sstate),
+ true);
+
+ expr_scanner_finish(yyscanner);
+
+ termPQExpBuffer(&word_buf);
+
+ return my_command;
+ }
+
+ /* For all other commands, collect remaining words. */
+ while (expr_lex_one_word(sstate, &word_buf, &word_offset))
+ {
+ /*
+ * my_command->argv[0] is the command itself, so the max number of
+ * arguments is one less than MAX_ARGS
+ */
+ if (j >= MAX_ARGS)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "too many arguments", NULL, -1);
+
+ offsets[j] = word_offset;
+ my_command->argv[j++] = pg_strdup(word_buf.data);
+ my_command->argc++;
+ }
+
+ /* Save line, trimming any trailing newline */
+ my_command->first_line =
+ expr_scanner_get_substring(sstate,
+ start_offset,
+ expr_scanner_offset(sstate),
+ true);
+
+ if (my_command->meta == META_SLEEP)
+ {
+ if (my_command->argc < 2)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing argument", NULL, -1);
+
+ if (my_command->argc > 3)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "too many arguments", NULL,
+ offsets[3] - start_offset);
+
+ /*
+ * Split argument into number and unit to allow "sleep 1ms" etc. We
+ * don't have to terminate the number argument with null because it
+ * will be parsed with atoi, which ignores trailing non-digit
+ * characters.
+ */
+ if (my_command->argv[1][0] != ':')
+ {
+ char *c = my_command->argv[1];
+ bool have_digit = false;
+
+ /* Skip sign */
+ if (*c == '+' || *c == '-')
+ c++;
+
+ /* Require at least one digit */
+ if (*c && isdigit((unsigned char) *c))
+ have_digit = true;
+
+ /* Eat all digits */
+ while (*c && isdigit((unsigned char) *c))
+ c++;
+
+ if (*c)
+ {
+ if (my_command->argc == 2 && have_digit)
+ {
+ my_command->argv[2] = c;
+ offsets[2] = offsets[1] + (c - my_command->argv[1]);
+ my_command->argc = 3;
+ }
+ else
+ {
+ /*
+ * Raise an error if argument starts with non-digit
+ * character (after sign).
+ */
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "invalid sleep time, must be an integer",
+ my_command->argv[1], offsets[1] - start_offset);
+ }
+ }
+ }
+
+ if (my_command->argc == 3)
+ {
+ if (pg_strcasecmp(my_command->argv[2], "us") != 0 &&
+ pg_strcasecmp(my_command->argv[2], "ms") != 0 &&
+ pg_strcasecmp(my_command->argv[2], "s") != 0)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "unrecognized time unit, must be us, ms or s",
+ my_command->argv[2], offsets[2] - start_offset);
+ }
+ }
+ else if (my_command->meta == META_SETSHELL)
+ {
+ if (my_command->argc < 3)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing argument", NULL, -1);
+ }
+ else if (my_command->meta == META_SHELL)
+ {
+ if (my_command->argc < 2)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "missing command", NULL, -1);
+ }
+ else if (my_command->meta == META_ELSE || my_command->meta == META_ENDIF ||
+ my_command->meta == META_STARTPIPELINE ||
+ my_command->meta == META_ENDPIPELINE)
+ {
+ if (my_command->argc != 1)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "unexpected argument", NULL, -1);
+ }
+ else if (my_command->meta == META_GSET || my_command->meta == META_ASET)
+ {
+ if (my_command->argc > 2)
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "too many arguments", NULL, -1);
+ }
+ else
+ {
+ /* my_command->meta == META_NONE */
+ syntax_error(source, lineno, my_command->first_line, my_command->argv[0],
+ "invalid command", NULL, -1);
+ }
+
+ termPQExpBuffer(&word_buf);
+
+ return my_command;
+}
+
+static void
+ConditionError(const char *desc, int cmdn, const char *msg)
+{
+ pg_fatal("condition error in script \"%s\" command %d: %s",
+ desc, cmdn, msg);
+}
+
+/*
+ * Partial evaluation of conditionals before recording and running the script.
+ */
+static void
+CheckConditional(const ParsedScript *ps)
+{
+ /* statically check conditional structure */
+ ConditionalStack cs = conditional_stack_create();
+ int i;
+
+ for (i = 0; ps->commands[i] != NULL; i++)
+ {
+ Command *cmd = ps->commands[i];
+
+ if (cmd->type == META_COMMAND)
+ {
+ switch (cmd->meta)
+ {
+ case META_IF:
+ conditional_stack_push(cs, IFSTATE_FALSE);
+ break;
+ case META_ELIF:
+ if (conditional_stack_empty(cs))
+ ConditionError(ps->desc, i + 1, "\\elif without matching \\if");
+ if (conditional_stack_peek(cs) == IFSTATE_ELSE_FALSE)
+ ConditionError(ps->desc, i + 1, "\\elif after \\else");
+ break;
+ case META_ELSE:
+ if (conditional_stack_empty(cs))
+ ConditionError(ps->desc, i + 1, "\\else without matching \\if");
+ if (conditional_stack_peek(cs) == IFSTATE_ELSE_FALSE)
+ ConditionError(ps->desc, i + 1, "\\else after \\else");
+ conditional_stack_poke(cs, IFSTATE_ELSE_FALSE);
+ break;
+ case META_ENDIF:
+ if (!conditional_stack_pop(cs))
+ ConditionError(ps->desc, i + 1, "\\endif without matching \\if");
+ break;
+ default:
+ /* ignore anything else... */
+ break;
+ }
+ }
+ }
+ if (!conditional_stack_empty(cs))
+ ConditionError(ps->desc, i + 1, "\\if without matching \\endif");
+ conditional_stack_destroy(cs);
+}
+
+/*
+ * Parse a script (either the contents of a file, or a built-in script)
+ * and add it to the list of scripts.
+ */
+static void
+ParseScript(const char *script, const char *desc, int weight)
+{
+ ParsedScript ps;
+ PsqlScanState sstate;
+ PQExpBufferData line_buf;
+ int alloc_num;
+ int index;
+ int lineno;
+ int start_offset;
+
+#define COMMANDS_ALLOC_NUM 128
+ alloc_num = COMMANDS_ALLOC_NUM;
+
+ /* Initialize all fields of ps */
+ ps.desc = desc;
+ ps.weight = weight;
+ ps.commands = (Command **) pg_malloc(sizeof(Command *) * alloc_num);
+ initStats(&ps.stats, 0);
+
+ /* Prepare to parse script */
+ sstate = psql_scan_create(&pgbench_callbacks);
+
+ /*
+ * Ideally, we'd scan scripts using the encoding and stdstrings settings
+ * we get from a DB connection. However, without major rearrangement of
+ * pgbench's argument parsing, we can't have a DB connection at the time
+ * we parse scripts. Using SQL_ASCII (encoding 0) should work well enough
+ * with any backend-safe encoding, though conceivably we could be fooled
+ * if a script file uses a client-only encoding. We also assume that
+ * stdstrings should be true, which is a bit riskier.
+ */
+ psql_scan_setup(sstate, script, strlen(script), 0, true);
+ start_offset = expr_scanner_offset(sstate) - 1;
+
+ initPQExpBuffer(&line_buf);
+
+ index = 0;
+
+ for (;;)
+ {
+ PsqlScanResult sr;
+ promptStatus_t prompt;
+ Command *command = NULL;
+
+ resetPQExpBuffer(&line_buf);
+ lineno = expr_scanner_get_lineno(sstate, start_offset);
+
+ sr = psql_scan(sstate, &line_buf, &prompt);
+
+ /* If we collected a new SQL command, process that */
+ command = create_sql_command(&line_buf, desc);
+
+ /* store new command */
+ if (command)
+ ps.commands[index++] = command;
+
+ /* If we reached a backslash, process that */
+ if (sr == PSCAN_BACKSLASH)
+ {
+ command = process_backslash_command(sstate, desc);
+
+ if (command)
+ {
+ /*
+ * If this is gset or aset, merge into the preceding command.
+ * (We don't use a command slot in this case).
+ */
+ if (command->meta == META_GSET || command->meta == META_ASET)
+ {
+ Command *cmd;
+
+ if (index == 0)
+ syntax_error(desc, lineno, NULL, NULL,
+ "\\gset must follow an SQL command",
+ NULL, -1);
+
+ cmd = ps.commands[index - 1];
+
+ if (cmd->type != SQL_COMMAND ||
+ cmd->varprefix != NULL)
+ syntax_error(desc, lineno, NULL, NULL,
+ "\\gset must follow an SQL command",
+ cmd->first_line, -1);
+
+ /* get variable prefix */
+ if (command->argc <= 1 || command->argv[1][0] == '\0')
+ cmd->varprefix = pg_strdup("");
+ else
+ cmd->varprefix = pg_strdup(command->argv[1]);
+
+ /* update the sql command meta */
+ cmd->meta = command->meta;
+
+ /* cleanup unused command */
+ free_command(command);
+
+ continue;
+ }
+
+ /* Attach any other backslash command as a new command */
+ ps.commands[index++] = command;
+ }
+ }
+
+ /*
+ * Since we used a command slot, allocate more if needed. Note we
+ * always allocate one more in order to accommodate the NULL
+ * terminator below.
+ */
+ if (index >= alloc_num)
+ {
+ alloc_num += COMMANDS_ALLOC_NUM;
+ ps.commands = (Command **)
+ pg_realloc(ps.commands, sizeof(Command *) * alloc_num);
+ }
+
+ /* Done if we reached EOF */
+ if (sr == PSCAN_INCOMPLETE || sr == PSCAN_EOL)
+ break;
+ }
+
+ ps.commands[index] = NULL;
+
+ addScript(&ps);
+
+ termPQExpBuffer(&line_buf);
+ psql_scan_finish(sstate);
+ psql_scan_destroy(sstate);
+}
+
+/*
+ * Read the entire contents of file fd, and return it in a malloc'd buffer.
+ *
+ * The buffer will typically be larger than necessary, but we don't care
+ * in this program, because we'll free it as soon as we've parsed the script.
+ */
+static char *
+read_file_contents(FILE *fd)
+{
+ char *buf;
+ size_t buflen = BUFSIZ;
+ size_t used = 0;
+
+ buf = (char *) pg_malloc(buflen);
+
+ for (;;)
+ {
+ size_t nread;
+
+ nread = fread(buf + used, 1, BUFSIZ, fd);
+ used += nread;
+ /* If fread() read less than requested, must be EOF or error */
+ if (nread < BUFSIZ)
+ break;
+ /* Enlarge buf so we can read some more */
+ buflen += BUFSIZ;
+ buf = (char *) pg_realloc(buf, buflen);
+ }
+ /* There is surely room for a terminator */
+ buf[used] = '\0';
+
+ return buf;
+}
+
+/*
+ * Given a file name, read it and add its script to the list.
+ * "-" means to read stdin.
+ * NB: filename must be storage that won't disappear.
+ */
+static void
+process_file(const char *filename, int weight)
+{
+ FILE *fd;
+ char *buf;
+
+ /* Slurp the file contents into "buf" */
+ if (strcmp(filename, "-") == 0)
+ fd = stdin;
+ else if ((fd = fopen(filename, "r")) == NULL)
+ pg_fatal("could not open file \"%s\": %m", filename);
+
+ buf = read_file_contents(fd);
+
+ if (ferror(fd))
+ pg_fatal("could not read file \"%s\": %m", filename);
+
+ if (fd != stdin)
+ fclose(fd);
+
+ ParseScript(buf, filename, weight);
+
+ free(buf);
+}
+
+/* Parse the given builtin script and add it to the list. */
+static void
+process_builtin(const BuiltinScript *bi, int weight)
+{
+ ParseScript(bi->script, bi->desc, weight);
+}
+
+/* show available builtin scripts */
+static void
+listAvailableScripts(void)
+{
+ int i;
+
+ fprintf(stderr, "Available builtin scripts:\n");
+ for (i = 0; i < lengthof(builtin_script); i++)
+ fprintf(stderr, " %13s: %s\n", builtin_script[i].name, builtin_script[i].desc);
+ fprintf(stderr, "\n");
+}
+
+/* return builtin script "name" if unambiguous, fails if not found */
+static const BuiltinScript *
+findBuiltin(const char *name)
+{
+ int i,
+ found = 0,
+ len = strlen(name);
+ const BuiltinScript *result = NULL;
+
+ for (i = 0; i < lengthof(builtin_script); i++)
+ {
+ if (strncmp(builtin_script[i].name, name, len) == 0)
+ {
+ result = &builtin_script[i];
+ found++;
+ }
+ }
+
+ /* ok, unambiguous result */
+ if (found == 1)
+ return result;
+
+ /* error cases */
+ if (found == 0)
+ pg_log_error("no builtin script found for name \"%s\"", name);
+ else /* found > 1 */
+ pg_log_error("ambiguous builtin name: %d builtin scripts found for prefix \"%s\"", found, name);
+
+ listAvailableScripts();
+ exit(1);
+}
+
+/*
+ * Determine the weight specification from a script option (-b, -f), if any,
+ * and return it as an integer (1 is returned if there's no weight). The
+ * script name is returned in *script as a malloc'd string.
+ */
+static int
+parseScriptWeight(const char *option, char **script)
+{
+ char *sep;
+ int weight;
+
+ if ((sep = strrchr(option, WSEP)))
+ {
+ int namelen = sep - option;
+ long wtmp;
+ char *badp;
+
+ /* generate the script name */
+ *script = pg_malloc(namelen + 1);
+ strncpy(*script, option, namelen);
+ (*script)[namelen] = '\0';
+
+ /* process digits of the weight spec */
+ errno = 0;
+ wtmp = strtol(sep + 1, &badp, 10);
+ if (errno != 0 || badp == sep + 1 || *badp != '\0')
+ pg_fatal("invalid weight specification: %s", sep);
+ if (wtmp > INT_MAX || wtmp < 0)
+ pg_fatal("weight specification out of range (0 .. %d): %lld",
+ INT_MAX, (long long) wtmp);
+ weight = wtmp;
+ }
+ else
+ {
+ *script = pg_strdup(option);
+ weight = 1;
+ }
+
+ return weight;
+}
+
+/* append a script to the list of scripts to process */
+static void
+addScript(const ParsedScript *script)
+{
+ if (script->commands == NULL || script->commands[0] == NULL)
+ pg_fatal("empty command list for script \"%s\"", script->desc);
+
+ if (num_scripts >= MAX_SCRIPTS)
+ pg_fatal("at most %d SQL scripts are allowed", MAX_SCRIPTS);
+
+ CheckConditional(script);
+
+ sql_script[num_scripts] = *script;
+ num_scripts++;
+}
+
+/*
+ * Print progress report.
+ *
+ * On entry, *last and *last_report contain the statistics and time of last
+ * progress report. On exit, they are updated with the new stats.
+ */
+static void
+printProgressReport(TState *threads, int64 test_start, pg_time_usec_t now,
+ StatsData *last, int64 *last_report)
+{
+ /* generate and show report */
+ pg_time_usec_t run = now - *last_report;
+ int64 cnt,
+ failures,
+ retried;
+ double tps,
+ total_run,
+ latency,
+ sqlat,
+ lag,
+ stdev;
+ char tbuf[315];
+ StatsData cur;
+
+ /*
+ * Add up the statistics of all threads.
+ *
+ * XXX: No locking. There is no guarantee that we get an atomic snapshot
+ * of the transaction count and latencies, so these figures can well be
+ * off by a small amount. The progress report's purpose is to give a
+ * quick overview of how the test is going, so that shouldn't matter too
+ * much. (If a read from a 64-bit integer is not atomic, you might get a
+ * "torn" read and completely bogus latencies though!)
+ */
+ initStats(&cur, 0);
+ for (int i = 0; i < nthreads; i++)
+ {
+ mergeSimpleStats(&cur.latency, &threads[i].stats.latency);
+ mergeSimpleStats(&cur.lag, &threads[i].stats.lag);
+ cur.cnt += threads[i].stats.cnt;
+ cur.skipped += threads[i].stats.skipped;
+ cur.retries += threads[i].stats.retries;
+ cur.retried += threads[i].stats.retried;
+ cur.serialization_failures +=
+ threads[i].stats.serialization_failures;
+ cur.deadlock_failures += threads[i].stats.deadlock_failures;
+ }
+
+ /* we count only actually executed transactions */
+ cnt = cur.cnt - last->cnt;
+ total_run = (now - test_start) / 1000000.0;
+ tps = 1000000.0 * cnt / run;
+ if (cnt > 0)
+ {
+ latency = 0.001 * (cur.latency.sum - last->latency.sum) / cnt;
+ sqlat = 1.0 * (cur.latency.sum2 - last->latency.sum2) / cnt;
+ stdev = 0.001 * sqrt(sqlat - 1000000.0 * latency * latency);
+ lag = 0.001 * (cur.lag.sum - last->lag.sum) / cnt;
+ }
+ else
+ {
+ latency = sqlat = stdev = lag = 0;
+ }
+ failures = getFailures(&cur) - getFailures(last);
+ retried = cur.retried - last->retried;
+
+ if (progress_timestamp)
+ {
+ snprintf(tbuf, sizeof(tbuf), "%.3f s",
+ PG_TIME_GET_DOUBLE(now + epoch_shift));
+ }
+ else
+ {
+ /* round seconds are expected, but the thread may be late */
+ snprintf(tbuf, sizeof(tbuf), "%.1f s", total_run);
+ }
+
+ fprintf(stderr,
+ "progress: %s, %.1f tps, lat %.3f ms stddev %.3f, " INT64_FORMAT " failed",
+ tbuf, tps, latency, stdev, failures);
+
+ if (throttle_delay)
+ {
+ fprintf(stderr, ", lag %.3f ms", lag);
+ if (latency_limit)
+ fprintf(stderr, ", " INT64_FORMAT " skipped",
+ cur.skipped - last->skipped);
+ }
+
+ /* it can be non-zero only if max_tries is not equal to one */
+ if (max_tries != 1)
+ fprintf(stderr,
+ ", " INT64_FORMAT " retried, " INT64_FORMAT " retries",
+ retried, cur.retries - last->retries);
+ fprintf(stderr, "\n");
+
+ *last = cur;
+ *last_report = now;
+}
+
+static void
+printSimpleStats(const char *prefix, SimpleStats *ss)
+{
+ if (ss->count > 0)
+ {
+ double latency = ss->sum / ss->count;
+ double stddev = sqrt(ss->sum2 / ss->count - latency * latency);
+
+ printf("%s average = %.3f ms\n", prefix, 0.001 * latency);
+ printf("%s stddev = %.3f ms\n", prefix, 0.001 * stddev);
+ }
+}
+
+/* print version banner */
+static void
+printVersion(PGconn *con)
+{
+ int server_ver = PQserverVersion(con);
+ int client_ver = PG_VERSION_NUM;
+
+ if (server_ver != client_ver)
+ {
+ const char *server_version;
+ char sverbuf[32];
+
+ /* Try to get full text form, might include "devel" etc */
+ server_version = PQparameterStatus(con, "server_version");
+ /* Otherwise fall back on server_ver */
+ if (!server_version)
+ {
+ formatPGVersionNumber(server_ver, true,
+ sverbuf, sizeof(sverbuf));
+ server_version = sverbuf;
+ }
+
+ printf(_("%s (%s, server %s)\n"),
+ "pgbench", PG_VERSION, server_version);
+ }
+ /* For version match, only print pgbench version */
+ else
+ printf("%s (%s)\n", "pgbench", PG_VERSION);
+ fflush(stdout);
+}
+
+/* print out results */
+static void
+printResults(StatsData *total,
+ pg_time_usec_t total_duration, /* benchmarking time */
+ pg_time_usec_t conn_total_duration, /* is_connect */
+ pg_time_usec_t conn_elapsed_duration, /* !is_connect */
+ int64 latency_late)
+{
+ /* tps is about actually executed transactions during benchmarking */
+ int64 failures = getFailures(total);
+ int64 total_cnt = total->cnt + total->skipped + failures;
+ double bench_duration = PG_TIME_GET_DOUBLE(total_duration);
+ double tps = total->cnt / bench_duration;
+
+ /* Report test parameters. */
+ printf("transaction type: %s\n",
+ num_scripts == 1 ? sql_script[0].desc : "multiple scripts");
+ printf("scaling factor: %d\n", scale);
+ /* only print partitioning information if some partitioning was detected */
+ if (partition_method != PART_NONE)
+ printf("partition method: %s\npartitions: %d\n",
+ PARTITION_METHOD[partition_method], partitions);
+ printf("query mode: %s\n", QUERYMODE[querymode]);
+ printf("number of clients: %d\n", nclients);
+ printf("number of threads: %d\n", nthreads);
+
+ if (max_tries)
+ printf("maximum number of tries: %u\n", max_tries);
+
+ if (duration <= 0)
+ {
+ printf("number of transactions per client: %d\n", nxacts);
+ printf("number of transactions actually processed: " INT64_FORMAT "/%d\n",
+ total->cnt, nxacts * nclients);
+ }
+ else
+ {
+ printf("duration: %d s\n", duration);
+ printf("number of transactions actually processed: " INT64_FORMAT "\n",
+ total->cnt);
+ }
+
+ printf("number of failed transactions: " INT64_FORMAT " (%.3f%%)\n",
+ failures, 100.0 * failures / total_cnt);
+
+ if (failures_detailed)
+ {
+ printf("number of serialization failures: " INT64_FORMAT " (%.3f%%)\n",
+ total->serialization_failures,
+ 100.0 * total->serialization_failures / total_cnt);
+ printf("number of deadlock failures: " INT64_FORMAT " (%.3f%%)\n",
+ total->deadlock_failures,
+ 100.0 * total->deadlock_failures / total_cnt);
+ }
+
+ /* it can be non-zero only if max_tries is not equal to one */
+ if (max_tries != 1)
+ {
+ printf("number of transactions retried: " INT64_FORMAT " (%.3f%%)\n",
+ total->retried, 100.0 * total->retried / total_cnt);
+ printf("total number of retries: " INT64_FORMAT "\n", total->retries);
+ }
+
+ /* Remaining stats are nonsensical if we failed to execute any xacts */
+ if (total->cnt + total->skipped <= 0)
+ return;
+
+ if (throttle_delay && latency_limit)
+ printf("number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n",
+ total->skipped, 100.0 * total->skipped / total_cnt);
+
+ if (latency_limit)
+ printf("number of transactions above the %.1f ms latency limit: " INT64_FORMAT "/" INT64_FORMAT " (%.3f%%)\n",
+ latency_limit / 1000.0, latency_late, total->cnt,
+ (total->cnt > 0) ? 100.0 * latency_late / total->cnt : 0.0);
+
+ if (throttle_delay || progress || latency_limit)
+ printSimpleStats("latency", &total->latency);
+ else
+ {
+ /* no measurement, show average latency computed from run time */
+ printf("latency average = %.3f ms%s\n",
+ 0.001 * total_duration * nclients / total_cnt,
+ failures > 0 ? " (including failures)" : "");
+ }
+
+ if (throttle_delay)
+ {
+ /*
+ * Report average transaction lag under rate limit throttling. This
+ * is the delay between scheduled and actual start times for the
+ * transaction. The measured lag may be caused by thread/client load,
+ * the database load, or the Poisson throttling process.
+ */
+ printf("rate limit schedule lag: avg %.3f (max %.3f) ms\n",
+ 0.001 * total->lag.sum / total->cnt, 0.001 * total->lag.max);
+ }
+
+ /*
+ * Under -C/--connect, each transaction incurs a significant connection
+ * cost, it would not make much sense to ignore it in tps, and it would
+ * not be tps anyway.
+ *
+ * Otherwise connections are made just once at the beginning of the run
+ * and should not impact performance but for very short run, so they are
+ * (right)fully ignored in tps.
+ */
+ if (is_connect)
+ {
+ printf("average connection time = %.3f ms\n", 0.001 * conn_total_duration / (total->cnt + failures));
+ printf("tps = %f (including reconnection times)\n", tps);
+ }
+ else
+ {
+ printf("initial connection time = %.3f ms\n", 0.001 * conn_elapsed_duration);
+ printf("tps = %f (without initial connection time)\n", tps);
+ }
+
+ /* Report per-script/command statistics */
+ if (per_script_stats || report_per_command)
+ {
+ int i;
+
+ for (i = 0; i < num_scripts; i++)
+ {
+ if (per_script_stats)
+ {
+ StatsData *sstats = &sql_script[i].stats;
+ int64 script_failures = getFailures(sstats);
+ int64 script_total_cnt =
+ sstats->cnt + sstats->skipped + script_failures;
+
+ printf("SQL script %d: %s\n"
+ " - weight: %d (targets %.1f%% of total)\n"
+ " - " INT64_FORMAT " transactions (%.1f%% of total, tps = %f)\n",
+ i + 1, sql_script[i].desc,
+ sql_script[i].weight,
+ 100.0 * sql_script[i].weight / total_weight,
+ sstats->cnt,
+ 100.0 * sstats->cnt / total->cnt,
+ sstats->cnt / bench_duration);
+
+ printf(" - number of failed transactions: " INT64_FORMAT " (%.3f%%)\n",
+ script_failures,
+ 100.0 * script_failures / script_total_cnt);
+
+ if (failures_detailed)
+ {
+ printf(" - number of serialization failures: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->serialization_failures,
+ (100.0 * sstats->serialization_failures /
+ script_total_cnt));
+ printf(" - number of deadlock failures: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->deadlock_failures,
+ (100.0 * sstats->deadlock_failures /
+ script_total_cnt));
+ }
+
+ /* it can be non-zero only if max_tries is not equal to one */
+ if (max_tries != 1)
+ {
+ printf(" - number of transactions retried: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->retried,
+ 100.0 * sstats->retried / script_total_cnt);
+ printf(" - total number of retries: " INT64_FORMAT "\n",
+ sstats->retries);
+ }
+
+ if (throttle_delay && latency_limit && script_total_cnt > 0)
+ printf(" - number of transactions skipped: " INT64_FORMAT " (%.3f%%)\n",
+ sstats->skipped,
+ 100.0 * sstats->skipped / script_total_cnt);
+
+ printSimpleStats(" - latency", &sstats->latency);
+ }
+
+ /*
+ * Report per-command statistics: latencies, retries after errors,
+ * failures (errors without retrying).
+ */
+ if (report_per_command)
+ {
+ Command **commands;
+
+ printf("%sstatement latencies in milliseconds%s:\n",
+ per_script_stats ? " - " : "",
+ (max_tries == 1 ?
+ " and failures" :
+ ", failures and retries"));
+
+ for (commands = sql_script[i].commands;
+ *commands != NULL;
+ commands++)
+ {
+ SimpleStats *cstats = &(*commands)->stats;
+
+ if (max_tries == 1)
+ printf(" %11.3f %10" INT64_MODIFIER "d %s\n",
+ (cstats->count > 0) ?
+ 1000.0 * cstats->sum / cstats->count : 0.0,
+ (*commands)->failures,
+ (*commands)->first_line);
+ else
+ printf(" %11.3f %10" INT64_MODIFIER "d %10" INT64_MODIFIER "d %s\n",
+ (cstats->count > 0) ?
+ 1000.0 * cstats->sum / cstats->count : 0.0,
+ (*commands)->failures,
+ (*commands)->retries,
+ (*commands)->first_line);
+ }
+ }
+ }
+ }
+}
+
+/*
+ * Set up a random seed according to seed parameter (NULL means default),
+ * and initialize base_random_sequence for use in initializing other sequences.
+ */
+static bool
+set_random_seed(const char *seed)
+{
+ uint64 iseed;
+
+ if (seed == NULL || strcmp(seed, "time") == 0)
+ {
+ /* rely on current time */
+ iseed = pg_time_now();
+ }
+ else if (strcmp(seed, "rand") == 0)
+ {
+ /* use some "strong" random source */
+ if (!pg_strong_random(&iseed, sizeof(iseed)))
+ {
+ pg_log_error("could not generate random seed");
+ return false;
+ }
+ }
+ else
+ {
+ /* parse unsigned-int seed value */
+ unsigned long ulseed;
+ char garbage;
+
+ /* Don't try to use UINT64_FORMAT here; it might not work for sscanf */
+ if (sscanf(seed, "%lu%c", &ulseed, &garbage) != 1)
+ {
+ pg_log_error("unrecognized random seed option \"%s\"", seed);
+ pg_log_error_detail("Expecting an unsigned integer, \"time\" or \"rand\".");
+ return false;
+ }
+ iseed = (uint64) ulseed;
+ }
+
+ if (seed != NULL)
+ pg_log_info("setting random seed to %llu", (unsigned long long) iseed);
+
+ random_seed = iseed;
+
+ /* Initialize base_random_sequence using seed */
+ pg_prng_seed(&base_random_sequence, (uint64) iseed);
+
+ return true;
+}
+
+int
+main(int argc, char **argv)
+{
+ static struct option long_options[] = {
+ /* systematic long/short named options */
+ {"builtin", required_argument, NULL, 'b'},
+ {"client", required_argument, NULL, 'c'},
+ {"connect", no_argument, NULL, 'C'},
+ {"debug", no_argument, NULL, 'd'},
+ {"define", required_argument, NULL, 'D'},
+ {"file", required_argument, NULL, 'f'},
+ {"fillfactor", required_argument, NULL, 'F'},
+ {"host", required_argument, NULL, 'h'},
+ {"initialize", no_argument, NULL, 'i'},
+ {"init-steps", required_argument, NULL, 'I'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"log", no_argument, NULL, 'l'},
+ {"latency-limit", required_argument, NULL, 'L'},
+ {"no-vacuum", no_argument, NULL, 'n'},
+ {"port", required_argument, NULL, 'p'},
+ {"progress", required_argument, NULL, 'P'},
+ {"protocol", required_argument, NULL, 'M'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"report-per-command", no_argument, NULL, 'r'},
+ {"rate", required_argument, NULL, 'R'},
+ {"scale", required_argument, NULL, 's'},
+ {"select-only", no_argument, NULL, 'S'},
+ {"skip-some-updates", no_argument, NULL, 'N'},
+ {"time", required_argument, NULL, 'T'},
+ {"transactions", required_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
+ {"vacuum-all", no_argument, NULL, 'v'},
+ /* long-named only options */
+ {"unlogged-tables", no_argument, NULL, 1},
+ {"tablespace", required_argument, NULL, 2},
+ {"index-tablespace", required_argument, NULL, 3},
+ {"sampling-rate", required_argument, NULL, 4},
+ {"aggregate-interval", required_argument, NULL, 5},
+ {"progress-timestamp", no_argument, NULL, 6},
+ {"log-prefix", required_argument, NULL, 7},
+ {"foreign-keys", no_argument, NULL, 8},
+ {"random-seed", required_argument, NULL, 9},
+ {"show-script", required_argument, NULL, 10},
+ {"partitions", required_argument, NULL, 11},
+ {"partition-method", required_argument, NULL, 12},
+ {"failures-detailed", no_argument, NULL, 13},
+ {"max-tries", required_argument, NULL, 14},
+ {"verbose-errors", no_argument, NULL, 15},
+ {NULL, 0, NULL, 0}
+ };
+
+ int c;
+ bool is_init_mode = false; /* initialize mode? */
+ char *initialize_steps = NULL;
+ bool foreign_keys = false;
+ bool is_no_vacuum = false;
+ bool do_vacuum_accounts = false; /* vacuum accounts table? */
+ int optindex;
+ bool scale_given = false;
+
+ bool benchmarking_option_set = false;
+ bool initialization_option_set = false;
+ bool internal_script_used = false;
+
+ CState *state; /* status of clients */
+ TState *threads; /* array of thread */
+
+ pg_time_usec_t
+ start_time, /* start up time */
+ bench_start = 0, /* first recorded benchmarking time */
+ conn_total_duration; /* cumulated connection time in
+ * threads */
+ int64 latency_late = 0;
+ StatsData stats;
+ int weight;
+
+ int i;
+ int nclients_dealt;
+
+#ifdef HAVE_GETRLIMIT
+ struct rlimit rlim;
+#endif
+
+ PGconn *con;
+ char *env;
+
+ int exit_code = 0;
+ struct timeval tv;
+
+ /*
+ * Record difference between Unix time and instr_time time. We'll use
+ * this for logging and aggregation.
+ */
+ gettimeofday(&tv, NULL);
+ epoch_shift = tv.tv_sec * INT64CONST(1000000) + tv.tv_usec - pg_time_now();
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pgbench (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ state = (CState *) pg_malloc0(sizeof(CState));
+
+ /* set random seed early, because it may be used while parsing scripts. */
+ if (!set_random_seed(getenv("PGBENCH_RANDOM_SEED")))
+ pg_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable");
+
+ while ((c = getopt_long(argc, argv, "b:c:CdD:f:F:h:iI:j:lL:M:nNp:P:qrR:s:St:T:U:v", long_options, &optindex)) != -1)
+ {
+ char *script;
+
+ switch (c)
+ {
+ case 'b':
+ if (strcmp(optarg, "list") == 0)
+ {
+ listAvailableScripts();
+ exit(0);
+ }
+ weight = parseScriptWeight(optarg, &script);
+ process_builtin(findBuiltin(script), weight);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ break;
+ case 'c':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-c/--clients", 1, INT_MAX,
+ &nclients))
+ {
+ exit(1);
+ }
+#ifdef HAVE_GETRLIMIT
+ if (getrlimit(RLIMIT_NOFILE, &rlim) == -1)
+ pg_fatal("getrlimit failed: %m");
+ if (rlim.rlim_cur < nclients + 3)
+ {
+ pg_log_error("need at least %d open files, but system limit is %ld",
+ nclients + 3, (long) rlim.rlim_cur);
+ pg_log_error_hint("Reduce number of clients, or use limit/ulimit to increase the system limit.");
+ exit(1);
+ }
+#endif /* HAVE_GETRLIMIT */
+ break;
+ case 'C':
+ benchmarking_option_set = true;
+ is_connect = true;
+ break;
+ case 'd':
+ pg_logging_increase_verbosity();
+ break;
+ case 'D':
+ {
+ char *p;
+
+ benchmarking_option_set = true;
+
+ if ((p = strchr(optarg, '=')) == NULL || p == optarg || *(p + 1) == '\0')
+ pg_fatal("invalid variable definition: \"%s\"", optarg);
+
+ *p++ = '\0';
+ if (!putVariable(&state[0].variables, "option", optarg, p))
+ exit(1);
+ }
+ break;
+ case 'f':
+ weight = parseScriptWeight(optarg, &script);
+ process_file(script, weight);
+ benchmarking_option_set = true;
+ break;
+ case 'F':
+ initialization_option_set = true;
+ if (!option_parse_int(optarg, "-F/--fillfactor", 10, 100,
+ &fillfactor))
+ exit(1);
+ break;
+ case 'h':
+ pghost = pg_strdup(optarg);
+ break;
+ case 'i':
+ is_init_mode = true;
+ break;
+ case 'I':
+ pg_free(initialize_steps);
+ initialize_steps = pg_strdup(optarg);
+ checkInitSteps(initialize_steps);
+ initialization_option_set = true;
+ break;
+ case 'j': /* jobs */
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &nthreads))
+ {
+ exit(1);
+ }
+#ifndef ENABLE_THREAD_SAFETY
+ if (nthreads != 1)
+ pg_fatal("threads are not supported on this platform; use -j1");
+#endif /* !ENABLE_THREAD_SAFETY */
+ break;
+ case 'l':
+ benchmarking_option_set = true;
+ use_log = true;
+ break;
+ case 'L':
+ {
+ double limit_ms = atof(optarg);
+
+ if (limit_ms <= 0.0)
+ pg_fatal("invalid latency limit: \"%s\"", optarg);
+ benchmarking_option_set = true;
+ latency_limit = (int64) (limit_ms * 1000);
+ }
+ break;
+ case 'M':
+ benchmarking_option_set = true;
+ for (querymode = 0; querymode < NUM_QUERYMODE; querymode++)
+ if (strcmp(optarg, QUERYMODE[querymode]) == 0)
+ break;
+ if (querymode >= NUM_QUERYMODE)
+ pg_fatal("invalid query mode (-M): \"%s\"", optarg);
+ break;
+ case 'n':
+ is_no_vacuum = true;
+ break;
+ case 'N':
+ process_builtin(findBuiltin("simple-update"), 1);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ break;
+ case 'p':
+ pgport = pg_strdup(optarg);
+ break;
+ case 'P':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-P/--progress", 1, INT_MAX,
+ &progress))
+ exit(1);
+ break;
+ case 'q':
+ initialization_option_set = true;
+ use_quiet = true;
+ break;
+ case 'r':
+ benchmarking_option_set = true;
+ report_per_command = true;
+ break;
+ case 'R':
+ {
+ /* get a double from the beginning of option value */
+ double throttle_value = atof(optarg);
+
+ benchmarking_option_set = true;
+
+ if (throttle_value <= 0.0)
+ pg_fatal("invalid rate limit: \"%s\"", optarg);
+ /* Invert rate limit into per-transaction delay in usec */
+ throttle_delay = 1000000.0 / throttle_value;
+ }
+ break;
+ case 's':
+ scale_given = true;
+ if (!option_parse_int(optarg, "-s/--scale", 1, INT_MAX,
+ &scale))
+ exit(1);
+ break;
+ case 'S':
+ process_builtin(findBuiltin("select-only"), 1);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ break;
+ case 't':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-t/--transactions", 1, INT_MAX,
+ &nxacts))
+ exit(1);
+ break;
+ case 'T':
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "-T/--time", 1, INT_MAX,
+ &duration))
+ exit(1);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'v':
+ benchmarking_option_set = true;
+ do_vacuum_accounts = true;
+ break;
+ case 1: /* unlogged-tables */
+ initialization_option_set = true;
+ unlogged_tables = true;
+ break;
+ case 2: /* tablespace */
+ initialization_option_set = true;
+ tablespace = pg_strdup(optarg);
+ break;
+ case 3: /* index-tablespace */
+ initialization_option_set = true;
+ index_tablespace = pg_strdup(optarg);
+ break;
+ case 4: /* sampling-rate */
+ benchmarking_option_set = true;
+ sample_rate = atof(optarg);
+ if (sample_rate <= 0.0 || sample_rate > 1.0)
+ pg_fatal("invalid sampling rate: \"%s\"", optarg);
+ break;
+ case 5: /* aggregate-interval */
+ benchmarking_option_set = true;
+ if (!option_parse_int(optarg, "--aggregate-interval", 1, INT_MAX,
+ &agg_interval))
+ exit(1);
+ break;
+ case 6: /* progress-timestamp */
+ progress_timestamp = true;
+ benchmarking_option_set = true;
+ break;
+ case 7: /* log-prefix */
+ benchmarking_option_set = true;
+ logfile_prefix = pg_strdup(optarg);
+ break;
+ case 8: /* foreign-keys */
+ initialization_option_set = true;
+ foreign_keys = true;
+ break;
+ case 9: /* random-seed */
+ benchmarking_option_set = true;
+ if (!set_random_seed(optarg))
+ pg_fatal("error while setting random seed from --random-seed option");
+ break;
+ case 10: /* list */
+ {
+ const BuiltinScript *s = findBuiltin(optarg);
+
+ fprintf(stderr, "-- %s: %s\n%s\n", s->name, s->desc, s->script);
+ exit(0);
+ }
+ break;
+ case 11: /* partitions */
+ initialization_option_set = true;
+ if (!option_parse_int(optarg, "--partitions", 0, INT_MAX,
+ &partitions))
+ exit(1);
+ break;
+ case 12: /* partition-method */
+ initialization_option_set = true;
+ if (pg_strcasecmp(optarg, "range") == 0)
+ partition_method = PART_RANGE;
+ else if (pg_strcasecmp(optarg, "hash") == 0)
+ partition_method = PART_HASH;
+ else
+ pg_fatal("invalid partition method, expecting \"range\" or \"hash\", got: \"%s\"",
+ optarg);
+ break;
+ case 13: /* failures-detailed */
+ benchmarking_option_set = true;
+ failures_detailed = true;
+ break;
+ case 14: /* max-tries */
+ {
+ int32 max_tries_arg = atoi(optarg);
+
+ if (max_tries_arg < 0)
+ pg_fatal("invalid number of maximum tries: \"%s\"", optarg);
+
+ benchmarking_option_set = true;
+ max_tries = (uint32) max_tries_arg;
+ }
+ break;
+ case 15: /* verbose-errors */
+ benchmarking_option_set = true;
+ verbose_errors = true;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* set default script if none */
+ if (num_scripts == 0 && !is_init_mode)
+ {
+ process_builtin(findBuiltin("tpcb-like"), 1);
+ benchmarking_option_set = true;
+ internal_script_used = true;
+ }
+
+ /* complete SQL command initialization and compute total weight */
+ for (i = 0; i < num_scripts; i++)
+ {
+ Command **commands = sql_script[i].commands;
+
+ for (int j = 0; commands[j] != NULL; j++)
+ if (commands[j]->type == SQL_COMMAND)
+ postprocess_sql_command(commands[j]);
+
+ /* cannot overflow: weight is 32b, total_weight 64b */
+ total_weight += sql_script[i].weight;
+ }
+
+ if (total_weight == 0 && !is_init_mode)
+ pg_fatal("total script weight must not be zero");
+
+ /* show per script stats if several scripts are used */
+ if (num_scripts > 1)
+ per_script_stats = true;
+
+ /*
+ * Don't need more threads than there are clients. (This is not merely an
+ * optimization; throttle_delay is calculated incorrectly below if some
+ * threads have no clients assigned to them.)
+ */
+ if (nthreads > nclients)
+ nthreads = nclients;
+
+ /*
+ * Convert throttle_delay to a per-thread delay time. Note that this
+ * might be a fractional number of usec, but that's OK, since it's just
+ * the center of a Poisson distribution of delays.
+ */
+ throttle_delay *= nthreads;
+
+ if (argc > optind)
+ dbName = argv[optind++];
+ else
+ {
+ if ((env = getenv("PGDATABASE")) != NULL && *env != '\0')
+ dbName = env;
+ else if ((env = getenv("PGUSER")) != NULL && *env != '\0')
+ dbName = env;
+ else
+ dbName = get_user_name_or_exit(progname);
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (is_init_mode)
+ {
+ if (benchmarking_option_set)
+ pg_fatal("some of the specified options cannot be used in initialization (-i) mode");
+
+ if (partitions == 0 && partition_method != PART_NONE)
+ pg_fatal("--partition-method requires greater than zero --partitions");
+
+ /* set default method */
+ if (partitions > 0 && partition_method == PART_NONE)
+ partition_method = PART_RANGE;
+
+ if (initialize_steps == NULL)
+ initialize_steps = pg_strdup(DEFAULT_INIT_STEPS);
+
+ if (is_no_vacuum)
+ {
+ /* Remove any vacuum step in initialize_steps */
+ char *p;
+
+ while ((p = strchr(initialize_steps, 'v')) != NULL)
+ *p = ' ';
+ }
+
+ if (foreign_keys)
+ {
+ /* Add 'f' to end of initialize_steps, if not already there */
+ if (strchr(initialize_steps, 'f') == NULL)
+ {
+ initialize_steps = (char *)
+ pg_realloc(initialize_steps,
+ strlen(initialize_steps) + 2);
+ strcat(initialize_steps, "f");
+ }
+ }
+
+ runInitSteps(initialize_steps);
+ exit(0);
+ }
+ else
+ {
+ if (initialization_option_set)
+ pg_fatal("some of the specified options cannot be used in benchmarking mode");
+ }
+
+ if (nxacts > 0 && duration > 0)
+ pg_fatal("specify either a number of transactions (-t) or a duration (-T), not both");
+
+ /* Use DEFAULT_NXACTS if neither nxacts nor duration is specified. */
+ if (nxacts <= 0 && duration <= 0)
+ nxacts = DEFAULT_NXACTS;
+
+ /* --sampling-rate may be used only with -l */
+ if (sample_rate > 0.0 && !use_log)
+ pg_fatal("log sampling (--sampling-rate) is allowed only when logging transactions (-l)");
+
+ /* --sampling-rate may not be used with --aggregate-interval */
+ if (sample_rate > 0.0 && agg_interval > 0)
+ pg_fatal("log sampling (--sampling-rate) and aggregation (--aggregate-interval) cannot be used at the same time");
+
+ if (agg_interval > 0 && !use_log)
+ pg_fatal("log aggregation is allowed only when actually logging transactions");
+
+ if (!use_log && logfile_prefix)
+ pg_fatal("log file prefix (--log-prefix) is allowed only when logging transactions (-l)");
+
+ if (duration > 0 && agg_interval > duration)
+ pg_fatal("number of seconds for aggregation (%d) must not be higher than test duration (%d)", agg_interval, duration);
+
+ if (duration > 0 && agg_interval > 0 && duration % agg_interval != 0)
+ pg_fatal("duration (%d) must be a multiple of aggregation interval (%d)", duration, agg_interval);
+
+ if (progress_timestamp && progress == 0)
+ pg_fatal("--progress-timestamp is allowed only under --progress");
+
+ if (!max_tries)
+ {
+ if (!latency_limit && duration <= 0)
+ pg_fatal("an unlimited number of transaction tries can only be used with --latency-limit or a duration (-T)");
+ }
+
+ /*
+ * save main process id in the global variable because process id will be
+ * changed after fork.
+ */
+ main_pid = (int) getpid();
+
+ if (nclients > 1)
+ {
+ state = (CState *) pg_realloc(state, sizeof(CState) * nclients);
+ memset(state + 1, 0, sizeof(CState) * (nclients - 1));
+
+ /* copy any -D switch values to all clients */
+ for (i = 1; i < nclients; i++)
+ {
+ int j;
+
+ state[i].id = i;
+ for (j = 0; j < state[0].variables.nvars; j++)
+ {
+ Variable *var = &state[0].variables.vars[j];
+
+ if (var->value.type != PGBT_NO_VALUE)
+ {
+ if (!putVariableValue(&state[i].variables, "startup",
+ var->name, &var->value))
+ exit(1);
+ }
+ else
+ {
+ if (!putVariable(&state[i].variables, "startup",
+ var->name, var->svalue))
+ exit(1);
+ }
+ }
+ }
+ }
+
+ /* other CState initializations */
+ for (i = 0; i < nclients; i++)
+ {
+ state[i].cstack = conditional_stack_create();
+ initRandomState(&state[i].cs_func_rs);
+ }
+
+ /* opening connection... */
+ con = doConnect();
+ if (con == NULL)
+ pg_fatal("could not create connection for setup");
+
+ /* report pgbench and server versions */
+ printVersion(con);
+
+ pg_log_debug("pghost: %s pgport: %s nclients: %d %s: %d dbName: %s",
+ PQhost(con), PQport(con), nclients,
+ duration <= 0 ? "nxacts" : "duration",
+ duration <= 0 ? nxacts : duration, PQdb(con));
+
+ if (internal_script_used)
+ GetTableInfo(con, scale_given);
+
+ /*
+ * :scale variables normally get -s or database scale, but don't override
+ * an explicit -D switch
+ */
+ if (lookupVariable(&state[0].variables, "scale") == NULL)
+ {
+ for (i = 0; i < nclients; i++)
+ {
+ if (!putVariableInt(&state[i].variables, "startup", "scale", scale))
+ exit(1);
+ }
+ }
+
+ /*
+ * Define a :client_id variable that is unique per connection. But don't
+ * override an explicit -D switch.
+ */
+ if (lookupVariable(&state[0].variables, "client_id") == NULL)
+ {
+ for (i = 0; i < nclients; i++)
+ if (!putVariableInt(&state[i].variables, "startup", "client_id", i))
+ exit(1);
+ }
+
+ /* set default seed for hash functions */
+ if (lookupVariable(&state[0].variables, "default_seed") == NULL)
+ {
+ uint64 seed = pg_prng_uint64(&base_random_sequence);
+
+ for (i = 0; i < nclients; i++)
+ if (!putVariableInt(&state[i].variables, "startup", "default_seed",
+ (int64) seed))
+ exit(1);
+ }
+
+ /* set random seed unless overwritten */
+ if (lookupVariable(&state[0].variables, "random_seed") == NULL)
+ {
+ for (i = 0; i < nclients; i++)
+ if (!putVariableInt(&state[i].variables, "startup", "random_seed",
+ random_seed))
+ exit(1);
+ }
+
+ if (!is_no_vacuum)
+ {
+ fprintf(stderr, "starting vacuum...");
+ tryExecuteStatement(con, "vacuum pgbench_branches");
+ tryExecuteStatement(con, "vacuum pgbench_tellers");
+ tryExecuteStatement(con, "truncate pgbench_history");
+ fprintf(stderr, "end.\n");
+
+ if (do_vacuum_accounts)
+ {
+ fprintf(stderr, "starting vacuum pgbench_accounts...");
+ tryExecuteStatement(con, "vacuum analyze pgbench_accounts");
+ fprintf(stderr, "end.\n");
+ }
+ }
+ PQfinish(con);
+
+ /* set up thread data structures */
+ threads = (TState *) pg_malloc(sizeof(TState) * nthreads);
+ nclients_dealt = 0;
+
+ for (i = 0; i < nthreads; i++)
+ {
+ TState *thread = &threads[i];
+
+ thread->tid = i;
+ thread->state = &state[nclients_dealt];
+ thread->nstate =
+ (nclients - nclients_dealt + nthreads - i - 1) / (nthreads - i);
+ initRandomState(&thread->ts_choose_rs);
+ initRandomState(&thread->ts_throttle_rs);
+ initRandomState(&thread->ts_sample_rs);
+ thread->logfile = NULL; /* filled in later */
+ thread->latency_late = 0;
+ initStats(&thread->stats, 0);
+
+ nclients_dealt += thread->nstate;
+ }
+
+ /* all clients must be assigned to a thread */
+ Assert(nclients_dealt == nclients);
+
+ /* get start up time for the whole computation */
+ start_time = pg_time_now();
+
+ /* set alarm if duration is specified. */
+ if (duration > 0)
+ setalarm(duration);
+
+ errno = THREAD_BARRIER_INIT(&barrier, nthreads);
+ if (errno != 0)
+ pg_fatal("could not initialize barrier: %m");
+
+#ifdef ENABLE_THREAD_SAFETY
+ /* start all threads but thread 0 which is executed directly later */
+ for (i = 1; i < nthreads; i++)
+ {
+ TState *thread = &threads[i];
+
+ thread->create_time = pg_time_now();
+ errno = THREAD_CREATE(&thread->thread, threadRun, thread);
+
+ if (errno != 0)
+ pg_fatal("could not create thread: %m");
+ }
+#else
+ Assert(nthreads == 1);
+#endif /* ENABLE_THREAD_SAFETY */
+
+ /* compute when to stop */
+ threads[0].create_time = pg_time_now();
+ if (duration > 0)
+ end_time = threads[0].create_time + (int64) 1000000 * duration;
+
+ /* run thread 0 directly */
+ (void) threadRun(&threads[0]);
+
+ /* wait for other threads and accumulate results */
+ initStats(&stats, 0);
+ conn_total_duration = 0;
+
+ for (i = 0; i < nthreads; i++)
+ {
+ TState *thread = &threads[i];
+
+#ifdef ENABLE_THREAD_SAFETY
+ if (i > 0)
+ THREAD_JOIN(thread->thread);
+#endif /* ENABLE_THREAD_SAFETY */
+
+ for (int j = 0; j < thread->nstate; j++)
+ if (thread->state[j].state != CSTATE_FINISHED)
+ exit_code = 2;
+
+ /* aggregate thread level stats */
+ mergeSimpleStats(&stats.latency, &thread->stats.latency);
+ mergeSimpleStats(&stats.lag, &thread->stats.lag);
+ stats.cnt += thread->stats.cnt;
+ stats.skipped += thread->stats.skipped;
+ stats.retries += thread->stats.retries;
+ stats.retried += thread->stats.retried;
+ stats.serialization_failures += thread->stats.serialization_failures;
+ stats.deadlock_failures += thread->stats.deadlock_failures;
+ latency_late += thread->latency_late;
+ conn_total_duration += thread->conn_duration;
+
+ /* first recorded benchmarking start time */
+ if (bench_start == 0 || thread->bench_start < bench_start)
+ bench_start = thread->bench_start;
+ }
+
+ /*
+ * All connections should be already closed in threadRun(), so this
+ * disconnect_all() will be a no-op, but clean up the connections just to
+ * be sure. We don't need to measure the disconnection delays here.
+ */
+ disconnect_all(state, nclients);
+
+ /*
+ * Beware that performance of short benchmarks with many threads and
+ * possibly long transactions can be deceptive because threads do not
+ * start and finish at the exact same time. The total duration computed
+ * here encompasses all transactions so that tps shown is somehow slightly
+ * underestimated.
+ */
+ printResults(&stats, pg_time_now() - bench_start, conn_total_duration,
+ bench_start - start_time, latency_late);
+
+ THREAD_BARRIER_DESTROY(&barrier);
+
+ if (exit_code != 0)
+ pg_log_error("Run was aborted; the above results are incomplete.");
+
+ return exit_code;
+}
+
+static THREAD_FUNC_RETURN_TYPE THREAD_FUNC_CC
+threadRun(void *arg)
+{
+ TState *thread = (TState *) arg;
+ CState *state = thread->state;
+ pg_time_usec_t start;
+ int nstate = thread->nstate;
+ int remains = nstate; /* number of remaining clients */
+ socket_set *sockets = alloc_socket_set(nstate);
+ int64 thread_start,
+ last_report,
+ next_report;
+ StatsData last,
+ aggs;
+
+ /* open log file if requested */
+ if (use_log)
+ {
+ char logpath[MAXPGPATH];
+ char *prefix = logfile_prefix ? logfile_prefix : "pgbench_log";
+
+ if (thread->tid == 0)
+ snprintf(logpath, sizeof(logpath), "%s.%d", prefix, main_pid);
+ else
+ snprintf(logpath, sizeof(logpath), "%s.%d.%d", prefix, main_pid, thread->tid);
+
+ thread->logfile = fopen(logpath, "w");
+
+ if (thread->logfile == NULL)
+ pg_fatal("could not open logfile \"%s\": %m", logpath);
+ }
+
+ /* explicitly initialize the state machines */
+ for (int i = 0; i < nstate; i++)
+ state[i].state = CSTATE_CHOOSE_SCRIPT;
+
+ /* READY */
+ THREAD_BARRIER_WAIT(&barrier);
+
+ thread_start = pg_time_now();
+ thread->started_time = thread_start;
+ thread->conn_duration = 0;
+ last_report = thread_start;
+ next_report = last_report + (int64) 1000000 * progress;
+
+ /* STEADY */
+ if (!is_connect)
+ {
+ /* make connections to the database before starting */
+ for (int i = 0; i < nstate; i++)
+ {
+ if ((state[i].con = doConnect()) == NULL)
+ {
+ /* coldly abort on initial connection failure */
+ pg_fatal("could not create connection for client %d",
+ state[i].id);
+ }
+ }
+ }
+
+ /* GO */
+ THREAD_BARRIER_WAIT(&barrier);
+
+ start = pg_time_now();
+ thread->bench_start = start;
+ thread->throttle_trigger = start;
+
+ /*
+ * The log format currently has Unix epoch timestamps with whole numbers
+ * of seconds. Round the first aggregate's start time down to the nearest
+ * Unix epoch second (the very first aggregate might really have started a
+ * fraction of a second later, but later aggregates are measured from the
+ * whole number time that is actually logged).
+ */
+ initStats(&aggs, (start + epoch_shift) / 1000000 * 1000000);
+ last = aggs;
+
+ /* loop till all clients have terminated */
+ while (remains > 0)
+ {
+ int nsocks; /* number of sockets to be waited for */
+ pg_time_usec_t min_usec;
+ pg_time_usec_t now = 0; /* set this only if needed */
+
+ /*
+ * identify which client sockets should be checked for input, and
+ * compute the nearest time (if any) at which we need to wake up.
+ */
+ clear_socket_set(sockets);
+ nsocks = 0;
+ min_usec = PG_INT64_MAX;
+ for (int i = 0; i < nstate; i++)
+ {
+ CState *st = &state[i];
+
+ if (st->state == CSTATE_SLEEP || st->state == CSTATE_THROTTLE)
+ {
+ /* a nap from the script, or under throttling */
+ pg_time_usec_t this_usec;
+
+ /* get current time if needed */
+ pg_time_now_lazy(&now);
+
+ /* min_usec should be the minimum delay across all clients */
+ this_usec = (st->state == CSTATE_SLEEP ?
+ st->sleep_until : st->txn_scheduled) - now;
+ if (min_usec > this_usec)
+ min_usec = this_usec;
+ }
+ else if (st->state == CSTATE_WAIT_RESULT ||
+ st->state == CSTATE_WAIT_ROLLBACK_RESULT)
+ {
+ /*
+ * waiting for result from server - nothing to do unless the
+ * socket is readable
+ */
+ int sock = PQsocket(st->con);
+
+ if (sock < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(st->con));
+ goto done;
+ }
+
+ add_socket_to_set(sockets, sock, nsocks++);
+ }
+ else if (st->state != CSTATE_ABORTED &&
+ st->state != CSTATE_FINISHED)
+ {
+ /*
+ * This client thread is ready to do something, so we don't
+ * want to wait. No need to examine additional clients.
+ */
+ min_usec = 0;
+ break;
+ }
+ }
+
+ /* also wake up to print the next progress report on time */
+ if (progress && min_usec > 0 && thread->tid == 0)
+ {
+ pg_time_now_lazy(&now);
+
+ if (now >= next_report)
+ min_usec = 0;
+ else if ((next_report - now) < min_usec)
+ min_usec = next_report - now;
+ }
+
+ /*
+ * If no clients are ready to execute actions, sleep until we receive
+ * data on some client socket or the timeout (if any) elapses.
+ */
+ if (min_usec > 0)
+ {
+ int rc = 0;
+
+ if (min_usec != PG_INT64_MAX)
+ {
+ if (nsocks > 0)
+ {
+ rc = wait_on_socket_set(sockets, min_usec);
+ }
+ else /* nothing active, simple sleep */
+ {
+ pg_usleep(min_usec);
+ }
+ }
+ else /* no explicit delay, wait without timeout */
+ {
+ rc = wait_on_socket_set(sockets, 0);
+ }
+
+ if (rc < 0)
+ {
+ if (errno == EINTR)
+ {
+ /* On EINTR, go back to top of loop */
+ continue;
+ }
+ /* must be something wrong */
+ pg_log_error("%s() failed: %m", SOCKET_WAIT_METHOD);
+ goto done;
+ }
+ }
+ else
+ {
+ /* min_usec <= 0, i.e. something needs to be executed now */
+
+ /* If we didn't wait, don't try to read any data */
+ clear_socket_set(sockets);
+ }
+
+ /* ok, advance the state machine of each connection */
+ nsocks = 0;
+ for (int i = 0; i < nstate; i++)
+ {
+ CState *st = &state[i];
+
+ if (st->state == CSTATE_WAIT_RESULT ||
+ st->state == CSTATE_WAIT_ROLLBACK_RESULT)
+ {
+ /* don't call advanceConnectionState unless data is available */
+ int sock = PQsocket(st->con);
+
+ if (sock < 0)
+ {
+ pg_log_error("invalid socket: %s", PQerrorMessage(st->con));
+ goto done;
+ }
+
+ if (!socket_has_input(sockets, sock, nsocks++))
+ continue;
+ }
+ else if (st->state == CSTATE_FINISHED ||
+ st->state == CSTATE_ABORTED)
+ {
+ /* this client is done, no need to consider it anymore */
+ continue;
+ }
+
+ advanceConnectionState(thread, st, &aggs);
+
+ /*
+ * If advanceConnectionState changed client to finished state,
+ * that's one fewer client that remains.
+ */
+ if (st->state == CSTATE_FINISHED || st->state == CSTATE_ABORTED)
+ remains--;
+ }
+
+ /* progress report is made by thread 0 for all threads */
+ if (progress && thread->tid == 0)
+ {
+ pg_time_usec_t now2 = pg_time_now();
+
+ if (now2 >= next_report)
+ {
+ /*
+ * Horrible hack: this relies on the thread pointer we are
+ * passed to be equivalent to threads[0], that is the first
+ * entry of the threads array. That is why this MUST be done
+ * by thread 0 and not any other.
+ */
+ printProgressReport(thread, thread_start, now2,
+ &last, &last_report);
+
+ /*
+ * Ensure that the next report is in the future, in case
+ * pgbench/postgres got stuck somewhere.
+ */
+ do
+ {
+ next_report += (int64) 1000000 * progress;
+ } while (now2 >= next_report);
+ }
+ }
+ }
+
+done:
+ disconnect_all(state, nstate);
+
+ if (thread->logfile)
+ {
+ if (agg_interval > 0)
+ {
+ /* log aggregated but not yet reported transactions */
+ doLog(thread, state, &aggs, false, 0, 0);
+ }
+ fclose(thread->logfile);
+ thread->logfile = NULL;
+ }
+ free_socket_set(sockets);
+ THREAD_FUNC_RETURN;
+}
+
+static void
+finishCon(CState *st)
+{
+ if (st->con != NULL)
+ {
+ PQfinish(st->con);
+ st->con = NULL;
+ }
+}
+
+/*
+ * Support for duration option: set timer_exceeded after so many seconds.
+ */
+
+#ifndef WIN32
+
+static void
+handle_sig_alarm(SIGNAL_ARGS)
+{
+ timer_exceeded = true;
+}
+
+static void
+setalarm(int seconds)
+{
+ pqsignal(SIGALRM, handle_sig_alarm);
+ alarm(seconds);
+}
+
+#else /* WIN32 */
+
+static VOID CALLBACK
+win32_timer_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
+{
+ timer_exceeded = true;
+}
+
+static void
+setalarm(int seconds)
+{
+ HANDLE queue;
+ HANDLE timer;
+
+ /* This function will be called at most once, so we can cheat a bit. */
+ queue = CreateTimerQueue();
+ if (seconds > ((DWORD) -1) / 1000 ||
+ !CreateTimerQueueTimer(&timer, queue,
+ win32_timer_callback, NULL, seconds * 1000, 0,
+ WT_EXECUTEINTIMERTHREAD | WT_EXECUTEONLYONCE))
+ pg_fatal("failed to set timer");
+}
+
+#endif /* WIN32 */
+
+
+/*
+ * These functions provide an abstraction layer that hides the syscall
+ * we use to wait for input on a set of sockets.
+ *
+ * Currently there are two implementations, based on ppoll(2) and select(2).
+ * ppoll() is preferred where available due to its typically higher ceiling
+ * on the number of usable sockets. We do not use the more-widely-available
+ * poll(2) because it only offers millisecond timeout resolution, which could
+ * be problematic with high --rate settings.
+ *
+ * Function APIs:
+ *
+ * alloc_socket_set: allocate an empty socket set with room for up to
+ * "count" sockets.
+ *
+ * free_socket_set: deallocate a socket set.
+ *
+ * clear_socket_set: reset a socket set to empty.
+ *
+ * add_socket_to_set: add socket with indicated FD to slot "idx" in the
+ * socket set. Slots must be filled in order, starting with 0.
+ *
+ * wait_on_socket_set: wait for input on any socket in set, or for timeout
+ * to expire. timeout is measured in microseconds; 0 means wait forever.
+ * Returns result code of underlying syscall (>=0 if OK, else see errno).
+ *
+ * socket_has_input: after waiting, call this to see if given socket has
+ * input. fd and idx parameters should match some previous call to
+ * add_socket_to_set.
+ *
+ * Note that wait_on_socket_set destructively modifies the state of the
+ * socket set. After checking for input, caller must apply clear_socket_set
+ * and add_socket_to_set again before waiting again.
+ */
+
+#ifdef POLL_USING_PPOLL
+
+static socket_set *
+alloc_socket_set(int count)
+{
+ socket_set *sa;
+
+ sa = (socket_set *) pg_malloc0(offsetof(socket_set, pollfds) +
+ sizeof(struct pollfd) * count);
+ sa->maxfds = count;
+ sa->curfds = 0;
+ return sa;
+}
+
+static void
+free_socket_set(socket_set *sa)
+{
+ pg_free(sa);
+}
+
+static void
+clear_socket_set(socket_set *sa)
+{
+ sa->curfds = 0;
+}
+
+static void
+add_socket_to_set(socket_set *sa, int fd, int idx)
+{
+ Assert(idx < sa->maxfds && idx == sa->curfds);
+ sa->pollfds[idx].fd = fd;
+ sa->pollfds[idx].events = POLLIN;
+ sa->pollfds[idx].revents = 0;
+ sa->curfds++;
+}
+
+static int
+wait_on_socket_set(socket_set *sa, int64 usecs)
+{
+ if (usecs > 0)
+ {
+ struct timespec timeout;
+
+ timeout.tv_sec = usecs / 1000000;
+ timeout.tv_nsec = (usecs % 1000000) * 1000;
+ return ppoll(sa->pollfds, sa->curfds, &timeout, NULL);
+ }
+ else
+ {
+ return ppoll(sa->pollfds, sa->curfds, NULL, NULL);
+ }
+}
+
+static bool
+socket_has_input(socket_set *sa, int fd, int idx)
+{
+ /*
+ * In some cases, threadRun will apply clear_socket_set and then try to
+ * apply socket_has_input anyway with arguments that it used before that,
+ * or might've used before that except that it exited its setup loop
+ * early. Hence, if the socket set is empty, silently return false
+ * regardless of the parameters. If it's not empty, we can Assert that
+ * the parameters match a previous call.
+ */
+ if (sa->curfds == 0)
+ return false;
+
+ Assert(idx < sa->curfds && sa->pollfds[idx].fd == fd);
+ return (sa->pollfds[idx].revents & POLLIN) != 0;
+}
+
+#endif /* POLL_USING_PPOLL */
+
+#ifdef POLL_USING_SELECT
+
+static socket_set *
+alloc_socket_set(int count)
+{
+ return (socket_set *) pg_malloc0(sizeof(socket_set));
+}
+
+static void
+free_socket_set(socket_set *sa)
+{
+ pg_free(sa);
+}
+
+static void
+clear_socket_set(socket_set *sa)
+{
+ FD_ZERO(&sa->fds);
+ sa->maxfd = -1;
+}
+
+static void
+add_socket_to_set(socket_set *sa, int fd, int idx)
+{
+ /* See connect_slot() for background on this code. */
+#ifdef WIN32
+ if (sa->fds.fd_count + 1 >= FD_SETSIZE)
+ {
+ pg_log_error("too many concurrent database clients for this platform: %d",
+ sa->fds.fd_count + 1);
+ exit(1);
+ }
+#else
+ if (fd < 0 || fd >= FD_SETSIZE)
+ {
+ pg_log_error("socket file descriptor out of range for select(): %d",
+ fd);
+ pg_log_error_hint("Try fewer concurrent database clients.");
+ exit(1);
+ }
+#endif
+ FD_SET(fd, &sa->fds);
+ if (fd > sa->maxfd)
+ sa->maxfd = fd;
+}
+
+static int
+wait_on_socket_set(socket_set *sa, int64 usecs)
+{
+ if (usecs > 0)
+ {
+ struct timeval timeout;
+
+ timeout.tv_sec = usecs / 1000000;
+ timeout.tv_usec = usecs % 1000000;
+ return select(sa->maxfd + 1, &sa->fds, NULL, NULL, &timeout);
+ }
+ else
+ {
+ return select(sa->maxfd + 1, &sa->fds, NULL, NULL, NULL);
+ }
+}
+
+static bool
+socket_has_input(socket_set *sa, int fd, int idx)
+{
+ return (FD_ISSET(fd, &sa->fds) != 0);
+}
+
+#endif /* POLL_USING_SELECT */
diff --git a/src/bin/pgbench/pgbench.h b/src/bin/pgbench/pgbench.h
new file mode 100644
index 0000000..957c9ca
--- /dev/null
+++ b/src/bin/pgbench/pgbench.h
@@ -0,0 +1,167 @@
+/*-------------------------------------------------------------------------
+ *
+ * pgbench.h
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef PGBENCH_H
+#define PGBENCH_H
+
+#include "fe_utils/psqlscan.h"
+
+/*
+ * This file is included outside exprscan.l, in places where we can't see
+ * flex's definition of typedef yyscan_t. Fortunately, it's documented as
+ * being "void *", so we can use a macro to keep the function declarations
+ * here looking like the definitions in exprscan.l. exprparse.y and
+ * pgbench.c also use this to be able to declare things as "yyscan_t".
+ */
+#define yyscan_t void *
+
+/*
+ * Likewise, we can't see exprparse.y's definition of union YYSTYPE here,
+ * but for now there's no need to know what the union contents are.
+ */
+union YYSTYPE;
+
+/*
+ * Variable types used in parser.
+ */
+typedef enum
+{
+ PGBT_NO_VALUE,
+ PGBT_NULL,
+ PGBT_INT,
+ PGBT_DOUBLE,
+ PGBT_BOOLEAN
+ /* add other types here */
+} PgBenchValueType;
+
+typedef struct
+{
+ PgBenchValueType type;
+ union
+ {
+ int64 ival;
+ double dval;
+ bool bval;
+ /* add other types here */
+ } u;
+} PgBenchValue;
+
+/* Types of expression nodes */
+typedef enum PgBenchExprType
+{
+ ENODE_CONSTANT,
+ ENODE_VARIABLE,
+ ENODE_FUNCTION
+} PgBenchExprType;
+
+/* List of operators and callable functions */
+typedef enum PgBenchFunction
+{
+ PGBENCH_ADD,
+ PGBENCH_SUB,
+ PGBENCH_MUL,
+ PGBENCH_DIV,
+ PGBENCH_MOD,
+ PGBENCH_DEBUG,
+ PGBENCH_ABS,
+ PGBENCH_LEAST,
+ PGBENCH_GREATEST,
+ PGBENCH_INT,
+ PGBENCH_DOUBLE,
+ PGBENCH_PI,
+ PGBENCH_SQRT,
+ PGBENCH_LN,
+ PGBENCH_EXP,
+ PGBENCH_RANDOM,
+ PGBENCH_RANDOM_GAUSSIAN,
+ PGBENCH_RANDOM_EXPONENTIAL,
+ PGBENCH_RANDOM_ZIPFIAN,
+ PGBENCH_POW,
+ PGBENCH_AND,
+ PGBENCH_OR,
+ PGBENCH_NOT,
+ PGBENCH_BITAND,
+ PGBENCH_BITOR,
+ PGBENCH_BITXOR,
+ PGBENCH_LSHIFT,
+ PGBENCH_RSHIFT,
+ PGBENCH_EQ,
+ PGBENCH_NE,
+ PGBENCH_LE,
+ PGBENCH_LT,
+ PGBENCH_IS,
+ PGBENCH_CASE,
+ PGBENCH_HASH_FNV1A,
+ PGBENCH_HASH_MURMUR2,
+ PGBENCH_PERMUTE
+} PgBenchFunction;
+
+typedef struct PgBenchExpr PgBenchExpr;
+typedef struct PgBenchExprLink PgBenchExprLink;
+typedef struct PgBenchExprList PgBenchExprList;
+
+struct PgBenchExpr
+{
+ PgBenchExprType etype;
+ union
+ {
+ PgBenchValue constant;
+ struct
+ {
+ char *varname;
+ } variable;
+ struct
+ {
+ PgBenchFunction function;
+ PgBenchExprLink *args;
+ } function;
+ } u;
+};
+
+/* List of expression nodes */
+struct PgBenchExprLink
+{
+ PgBenchExpr *expr;
+ PgBenchExprLink *next;
+};
+
+struct PgBenchExprList
+{
+ PgBenchExprLink *head;
+ PgBenchExprLink *tail;
+};
+
+extern PgBenchExpr *expr_parse_result;
+
+extern int expr_yyparse(yyscan_t yyscanner);
+extern int expr_yylex(union YYSTYPE *yylval_param, yyscan_t yyscanner);
+extern void expr_yyerror(yyscan_t yyscanner, const char *message) pg_attribute_noreturn();
+extern void expr_yyerror_more(yyscan_t yyscanner, const char *message,
+ const char *more) pg_attribute_noreturn();
+extern bool expr_lex_one_word(PsqlScanState state, PQExpBuffer word_buf,
+ int *offset);
+extern yyscan_t expr_scanner_init(PsqlScanState state,
+ const char *source, int lineno, int start_offset,
+ const char *command);
+extern void expr_scanner_finish(yyscan_t yyscanner);
+extern int expr_scanner_offset(PsqlScanState state);
+extern char *expr_scanner_get_substring(PsqlScanState state,
+ int start_offset, int end_offset,
+ bool chomp);
+extern int expr_scanner_get_lineno(PsqlScanState state, int offset);
+
+extern void syntax_error(const char *source, int lineno, const char *line,
+ const char *command, const char *msg,
+ const char *more, int column) pg_attribute_noreturn();
+
+extern bool strtoint64(const char *str, bool errorOK, int64 *result);
+extern bool strtodouble(const char *str, bool errorOK, double *dv);
+
+#endif /* PGBENCH_H */
diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl
new file mode 100644
index 0000000..8c9a08e
--- /dev/null
+++ b/src/bin/pgbench/t/001_pgbench_with_server.pl
@@ -0,0 +1,1475 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# start a pgbench specific server
+my $node = PostgreSQL::Test::Cluster->new('main');
+# Set to untranslated messages, to be able to compare program output with
+# expected strings.
+$node->init(extra => [ '--locale', 'C' ]);
+$node->start;
+
+# tablespace for testing, because partitioned tables cannot use pg_default
+# explicitly and we want to test that table creation with tablespace works
+# for partitioned tables.
+my $ts = $node->basedir . '/regress_pgbench_tap_1_ts_dir';
+mkdir $ts or die "cannot create directory $ts";
+
+# the next commands will issue a syntax error if the path contains a "'"
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE regress_pgbench_tap_1_ts LOCATION '$ts';");
+
+# Test concurrent OID generation via pg_enum_oid_index. This indirectly
+# exercises LWLock and spinlock concurrency.
+my $labels = join ',', map { "'l$_'" } 1 .. 1000;
+$node->pgbench(
+ '--no-vacuum --client=5 --protocol=prepared --transactions=25',
+ 0,
+ [qr{processed: 125/125}],
+ [qr{^$}],
+ 'concurrent OID generation',
+ {
+ '001_pgbench_concurrent_insert' =>
+ "CREATE TYPE pg_temp.e AS ENUM ($labels); DROP TYPE pg_temp.e;"
+ });
+
+# Trigger various connection errors
+$node->pgbench(
+ 'no-such-database',
+ 1,
+ [qr{^$}],
+ [
+ qr{connection to server .* failed},
+ qr{FATAL: database "no-such-database" does not exist}
+ ],
+ 'no such database');
+
+$node->pgbench(
+ '-S -t 1', 1, [],
+ [qr{Perhaps you need to do initialization}],
+ 'run without init');
+
+# Initialize pgbench tables scale 1
+$node->pgbench(
+ '-i', 0,
+ [qr{^$}],
+ [
+ qr{creating tables},
+ qr{vacuuming},
+ qr{creating primary keys},
+ qr{done in \d+\.\d\d s }
+ ],
+ 'pgbench scale 1 initialization',);
+
+# Again, with all possible options
+$node->pgbench(
+ '--initialize --init-steps=dtpvg --scale=1 --unlogged-tables --fillfactor=98 --foreign-keys --quiet --tablespace=regress_pgbench_tap_1_ts --index-tablespace=regress_pgbench_tap_1_ts --partitions=2 --partition-method=hash',
+ 0,
+ [qr{^$}i],
+ [
+ qr{dropping old tables},
+ qr{creating tables},
+ qr{creating 2 partitions},
+ qr{vacuuming},
+ qr{creating primary keys},
+ qr{creating foreign keys},
+ qr{(?!vacuuming)}, # no vacuum
+ qr{done in \d+\.\d\d s }
+ ],
+ 'pgbench scale 1 initialization');
+
+# Test interaction of --init-steps with legacy step-selection options
+$node->pgbench(
+ '--initialize --init-steps=dtpvGvv --no-vacuum --foreign-keys --unlogged-tables --partitions=3',
+ 0,
+ [qr{^$}],
+ [
+ qr{dropping old tables},
+ qr{creating tables},
+ qr{creating 3 partitions},
+ qr{creating primary keys},
+ qr{generating data \(server-side\)},
+ qr{creating foreign keys},
+ qr{(?!vacuuming)}, # no vacuum
+ qr{done in \d+\.\d\d s }
+ ],
+ 'pgbench --init-steps');
+
+# Run all builtin scripts, for a few transactions each
+$node->pgbench(
+ '--transactions=5 -Dfoo=bla --client=2 --protocol=simple --builtin=t'
+ . ' --connect -n -v -n',
+ 0,
+ [
+ qr{builtin: TPC-B},
+ qr{clients: 2\b},
+ qr{processed: 10/10},
+ qr{mode: simple},
+ qr{maximum number of tries: 1}
+ ],
+ [qr{^$}],
+ 'pgbench tpcb-like');
+
+$node->pgbench(
+ '--transactions=20 --client=5 -M extended --builtin=si -C --no-vacuum -s 1',
+ 0,
+ [
+ qr{builtin: simple update},
+ qr{clients: 5\b},
+ qr{threads: 1\b},
+ qr{processed: 100/100},
+ qr{mode: extended}
+ ],
+ [qr{scale option ignored}],
+ 'pgbench simple update');
+
+$node->pgbench(
+ '-t 100 -c 7 -M prepared -b se --debug',
+ 0,
+ [
+ qr{builtin: select only},
+ qr{clients: 7\b},
+ qr{threads: 1\b},
+ qr{processed: 700/700},
+ qr{mode: prepared}
+ ],
+ [
+ qr{vacuum}, qr{client 0}, qr{client 1}, qr{sending},
+ qr{receiving}, qr{executing}
+ ],
+ 'pgbench select only');
+
+# check if threads are supported
+my $nthreads = 2;
+
+{
+ my ($stderr);
+ run_log([ 'pgbench', '-j', '2', '--bad-option' ], '2>', \$stderr);
+ $nthreads = 1 if $stderr =~ m/threads are not supported on this platform/;
+}
+
+# run custom scripts
+$node->pgbench(
+ "-t 100 -c 1 -j $nthreads -M prepared -n",
+ 0,
+ [
+ qr{type: multiple scripts},
+ qr{mode: prepared},
+ qr{script 1: .*/001_pgbench_custom_script_1},
+ qr{weight: 2},
+ qr{script 2: .*/001_pgbench_custom_script_2},
+ qr{weight: 1},
+ qr{processed: 100/100}
+ ],
+ [qr{^$}],
+ 'pgbench custom scripts',
+ {
+ '001_pgbench_custom_script_1@1' => q{-- select only
+\set aid random(1, :scale * 100000)
+SELECT abalance::INTEGER AS balance
+ FROM pgbench_accounts
+ WHERE aid=:aid;
+},
+ '001_pgbench_custom_script_2@2' => q{-- special variables
+BEGIN;
+\set foo 1
+-- cast are needed for typing under -M prepared
+SELECT :foo::INT + :scale::INT * :client_id::INT AS bla;
+COMMIT;
+}
+ });
+
+$node->pgbench(
+ '-n -t 10 -c 1 -M simple',
+ 0,
+ [
+ qr{type: .*/001_pgbench_custom_script_3},
+ qr{processed: 10/10},
+ qr{mode: simple}
+ ],
+ [qr{^$}],
+ 'pgbench custom script',
+ {
+ '001_pgbench_custom_script_3' => q{-- select only variant
+\set aid random(1, :scale * 100000)
+BEGIN;
+SELECT abalance::INTEGER AS balance
+ FROM pgbench_accounts
+ WHERE aid=:aid;
+COMMIT;
+}
+ });
+
+$node->pgbench(
+ '-n -t 10 -c 2 -M extended',
+ 0,
+ [
+ qr{type: .*/001_pgbench_custom_script_4},
+ qr{processed: 20/20},
+ qr{mode: extended}
+ ],
+ [qr{^$}],
+ 'pgbench custom script',
+ {
+ '001_pgbench_custom_script_4' => q{-- select only variant
+\set aid random(1, :scale * 100000)
+BEGIN;
+SELECT abalance::INTEGER AS balance
+ FROM pgbench_accounts
+ WHERE aid=:aid;
+COMMIT;
+}
+ });
+
+# Verify server logging of query parameters.
+# (This doesn't really belong here, but pgbench is a convenient way
+# to issue commands using extended query mode with parameters.)
+
+# 1. Logging neither with errors nor with statements
+$node->append_conf('postgresql.conf',
+ "log_min_duration_statement = 0\n"
+ . "log_parameter_max_length = 0\n"
+ . "log_parameter_max_length_on_error = 0");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type json},
+ qr{(?!unnamed portal with parameters)}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_1' => q[select '{ invalid ' as value \gset
+select $$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$$ as long \gset
+select column1::jsonb from (values (:value), (:long)) as q;
+]
+ });
+my $log = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+unlike(
+ $log,
+ qr[DETAIL: parameters: \$1 = '\{ invalid ',],
+ "no parameters logged");
+$log = undef;
+
+# 2. Logging truncated parameters on error, full with statements
+$node->append_conf('postgresql.conf',
+ "log_parameter_max_length = -1\n"
+ . "log_parameter_max_length_on_error = 64");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: division by zero},
+ qr{CONTEXT: unnamed portal with parameters: \$1 = '1', \$2 = NULL}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_2' => q{select '1' as one \gset
+SELECT 1 / (random() / 2)::int, :one::int, :two::int;
+}
+ });
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type json},
+ qr[CONTEXT: JSON data, line 1: \{ invalid\.\.\.[\r\n]+unnamed portal with parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que \.\.\.']m
+ ],
+ 'server parameter logging',
+ {
+ '001_param_3' => q[select '{ invalid ' as value \gset
+select $$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$$ as long \gset
+select column1::jsonb from (values (:value), (:long)) as q;
+]
+ });
+$log = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+like(
+ $log,
+ qr[DETAIL: parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia\?'''],
+ "parameter report does not truncate");
+$log = undef;
+
+# 3. Logging full parameters on error, truncated with statements
+$node->append_conf('postgresql.conf',
+ "log_min_duration_statement = -1\n"
+ . "log_parameter_max_length = 7\n"
+ . "log_parameter_max_length_on_error = -1");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: division by zero},
+ qr{CONTEXT: unnamed portal with parameters: \$1 = '1', \$2 = NULL}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_4' => q{select '1' as one \gset
+SELECT 1 / (random() / 2)::int, :one::int, :two::int;
+}
+ });
+
+$node->append_conf('postgresql.conf', "log_min_duration_statement = 0");
+$node->reload;
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type json},
+ qr[CONTEXT: JSON data, line 1: \{ invalid\.\.\.[\r\n]+unnamed portal with parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia\?']m
+ ],
+ 'server parameter logging',
+ {
+ '001_param_5' => q[select '{ invalid ' as value \gset
+select $$'Valame Dios!' dijo Sancho; 'no le dije yo a vuestra merced que mirase bien lo que hacia?'$$ as long \gset
+select column1::jsonb from (values (:value), (:long)) as q;
+]
+ });
+$log = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+like(
+ $log,
+ qr[DETAIL: parameters: \$1 = '\{ inval\.\.\.', \$2 = '''Valame\.\.\.'],
+ "parameter report truncates");
+$log = undef;
+
+# Check that bad parameters are reported during typinput phase of BIND
+$node->pgbench(
+ '-n -t1 -c1 -M prepared',
+ 2,
+ [],
+ [
+ qr{ERROR: invalid input syntax for type smallint: "1a"},
+ qr{CONTEXT: unnamed portal parameter \$2 = '1a'}
+ ],
+ 'server parameter logging',
+ {
+ '001_param_6' => q{select 42 as value1, '1a' as value2 \gset
+select :value1::smallint, :value2::smallint;
+}
+ });
+
+# Restore default logging config
+$node->append_conf('postgresql.conf',
+ "log_min_duration_statement = -1\n"
+ . "log_parameter_max_length_on_error = 0\n"
+ . "log_parameter_max_length = -1");
+$node->reload;
+
+# test expressions
+$node->pgbench(
+ '--random-seed=5432 -t 1 -Dfoo=-10.1 -Dbla=false -Di=+3 -Dn=null -Dt=t -Df=of -Dd=1.0',
+ 0,
+ [ qr{type: .*/001_pgbench_expressions}, qr{processed: 1/1} ],
+ [
+ qr{setting random seed to 5432\b},
+
+ # After explicit seeding, the four random checks (1-3,20) are
+ # deterministic; but see also magic values in checks 111,113.
+ qr{command=1.: int 17\b}, # uniform random
+ qr{command=2.: int 104\b}, # exponential random
+ qr{command=3.: int 1498\b}, # gaussian random
+ qr{command=4.: int 4\b},
+ qr{command=5.: int 5\b},
+ qr{command=6.: int 6\b},
+ qr{command=7.: int 7\b},
+ qr{command=8.: int 8\b},
+ qr{command=9.: int 9\b},
+ qr{command=10.: int 10\b},
+ qr{command=11.: int 11\b},
+ qr{command=12.: int 12\b},
+ qr{command=15.: double 15\b},
+ qr{command=16.: double 16\b},
+ qr{command=17.: double 17\b},
+ qr{command=20.: int 3\b}, # zipfian random
+ qr{command=21.: double -27\b},
+ qr{command=22.: double 1024\b},
+ qr{command=23.: double 1\b},
+ qr{command=24.: double 1\b},
+ qr{command=25.: double -0.125\b},
+ qr{command=26.: double -0.125\b},
+ qr{command=27.: double -0.00032\b},
+ qr{command=28.: double 8.50705917302346e\+0?37\b},
+ qr{command=29.: double 1e\+0?30\b},
+ qr{command=30.: boolean false\b},
+ qr{command=31.: boolean true\b},
+ qr{command=32.: int 32\b},
+ qr{command=33.: int 33\b},
+ qr{command=34.: double 34\b},
+ qr{command=35.: int 35\b},
+ qr{command=36.: int 36\b},
+ qr{command=37.: double 37\b},
+ qr{command=38.: int 38\b},
+ qr{command=39.: int 39\b},
+ qr{command=40.: boolean true\b},
+ qr{command=41.: null\b},
+ qr{command=42.: null\b},
+ qr{command=43.: boolean true\b},
+ qr{command=44.: boolean true\b},
+ qr{command=45.: boolean true\b},
+ qr{command=46.: int 46\b},
+ qr{command=47.: boolean true\b},
+ qr{command=48.: boolean true\b},
+ qr{command=49.: int -5817877081768721676\b},
+ qr{command=50.: boolean true\b},
+ qr{command=51.: int -7793829335365542153\b},
+ qr{command=52.: int -?\d+\b},
+ qr{command=53.: boolean true\b},
+ qr{command=65.: int 65\b},
+ qr{command=74.: int 74\b},
+ qr{command=83.: int 83\b},
+ qr{command=86.: int 86\b},
+ qr{command=93.: int 93\b},
+ qr{command=95.: int 0\b},
+ qr{command=96.: int 1\b}, # :scale
+ qr{command=97.: int 0\b}, # :client_id
+ qr{command=98.: int 5432\b}, # :random_seed
+ qr{command=99.: int -9223372036854775808\b}, # min int
+ qr{command=100.: int 9223372036854775807\b}, # max int
+ # pseudorandom permutation tests
+ qr{command=101.: boolean true\b},
+ qr{command=102.: boolean true\b},
+ qr{command=103.: boolean true\b},
+ qr{command=104.: boolean true\b},
+ qr{command=105.: boolean true\b},
+ qr{command=109.: boolean true\b},
+ qr{command=110.: boolean true\b},
+ qr{command=111.: boolean true\b},
+ qr{command=113.: boolean true\b},
+ ],
+ 'pgbench expressions',
+ {
+ '001_pgbench_expressions' => q{-- integer functions
+\set i1 debug(random(10, 19))
+\set i2 debug(random_exponential(100, 199, 10.0))
+\set i3 debug(random_gaussian(1000, 1999, 10.0))
+\set i4 debug(abs(-4))
+\set i5 debug(greatest(5, 4, 3, 2))
+\set i6 debug(11 + least(-5, -4, -3, -2))
+\set i7 debug(int(7.3))
+-- integer arithmetic and bit-wise operators
+\set i8 debug(17 / (4|1) + ( 4 + (7 >> 2)))
+\set i9 debug(- (3 * 4 - (-(~ 1) + -(~ 0))) / -1 + 3 % -1)
+\set ia debug(10 + (0 + 0 * 0 - 0 / 1))
+\set ib debug(:ia + :scale)
+\set ic debug(64 % (((2 + 1 * 2 + (1 # 2) | 4 * (2 & 11)) - (1 << 2)) + 2))
+-- double functions and operators
+\set d1 debug(sqrt(+1.5 * 2.0) * abs(-0.8E1))
+\set d2 debug(double(1 + 1) * (-75.0 / :foo))
+\set pi debug(pi() * 4.9)
+\set d4 debug(greatest(4, 2, -1.17) * 4.0 * Ln(Exp(1.0)))
+\set d5 debug(least(-5.18, .0E0, 1.0/0) * -3.3)
+-- reset variables
+\set i1 0
+\set d1 false
+-- yet another integer function
+\set id debug(random_zipfian(1, 9, 1.3))
+--- pow and power
+\set poweri debug(pow(-3,3))
+\set powerd debug(pow(2.0,10))
+\set poweriz debug(pow(0,0))
+\set powerdz debug(pow(0.0,0.0))
+\set powernegi debug(pow(-2,-3))
+\set powernegd debug(pow(-2.0,-3.0))
+\set powernegd2 debug(power(-5.0,-5.0))
+\set powerov debug(pow(9223372036854775807, 2))
+\set powerov2 debug(pow(10,30))
+-- comparisons and logical operations
+\set c0 debug(1.0 = 0.0 and 1.0 != 0.0)
+\set c1 debug(0 = 1 Or 1.0 = 1)
+\set c4 debug(case when 0 < 1 then 32 else 0 end)
+\set c5 debug(case when true then 33 else 0 end)
+\set c6 debug(case when false THEN -1 when 1 = 1 then 13 + 19 + 2.0 end )
+\set c7 debug(case when (1 > 0) and (1 >= 0) and (0 < 1) and (0 <= 1) and (0 != 1) and (0 = 0) and (0 <> 1) then 35 else 0 end)
+\set c8 debug(CASE \
+ WHEN (1.0 > 0.0) AND (1.0 >= 0.0) AND (0.0 < 1.0) AND (0.0 <= 1.0) AND \
+ (0.0 != 1.0) AND (0.0 = 0.0) AND (0.0 <> 1.0) AND (0.0 = 0.0) \
+ THEN 36 \
+ ELSE 0 \
+ END)
+\set c9 debug(CASE WHEN NOT FALSE THEN 3 * 12.3333334 END)
+\set ca debug(case when false then 0 when 1-1 <> 0 then 1 else 38 end)
+\set cb debug(10 + mod(13 * 7 + 12, 13) - mod(-19 * 11 - 17, 19))
+\set cc debug(NOT (0 > 1) AND (1 <= 1) AND NOT (0 >= 1) AND (0 < 1) AND \
+ NOT (false and true) AND (false OR TRUE) AND (NOT :f) AND (NOT FALSE) AND \
+ NOT (NOT TRUE))
+-- NULL value and associated operators
+\set n0 debug(NULL + NULL * exp(NULL))
+\set n1 debug(:n0)
+\set n2 debug(NOT (:n0 IS NOT NULL OR :d1 IS NULL))
+\set n3 debug(:n0 IS NULL AND :d1 IS NOT NULL AND :d1 NOTNULL)
+\set n4 debug(:n0 ISNULL AND NOT :n0 IS TRUE AND :n0 IS NOT FALSE)
+\set n5 debug(CASE WHEN :n IS NULL THEN 46 ELSE NULL END)
+-- use a variables of all types
+\set n6 debug(:n IS NULL AND NOT :f AND :t)
+-- conditional truth
+\set cs debug(CASE WHEN 1 THEN TRUE END AND CASE WHEN 1.0 THEN TRUE END AND CASE WHEN :n THEN NULL ELSE TRUE END)
+-- hash functions
+\set h0 debug(hash(10, 5432))
+\set h1 debug(:h0 = hash_murmur2(10, 5432))
+\set h3 debug(hash_fnv1a(10, 5432))
+\set h4 debug(hash(10))
+\set h5 debug(hash(10) = hash(10, :default_seed))
+-- lazy evaluation
+\set zy 0
+\set yz debug(case when :zy = 0 then -1 else (1 / :zy) end)
+\set yz debug(case when :zy = 0 or (1 / :zy) < 0 then -1 else (1 / :zy) end)
+\set yz debug(case when :zy > 0 and (1 / :zy) < 0 then (1 / :zy) else 1 end)
+-- substitute variables of all possible types
+\set v0 NULL
+\set v1 TRUE
+\set v2 5432
+\set v3 -54.21E-2
+SELECT :v0, :v1, :v2, :v3;
+-- if tests
+\set nope 0
+\if 1 > 0
+\set id debug(65)
+\elif 0
+\set nope 1
+\else
+\set nope 1
+\endif
+\if 1 < 0
+\set nope 1
+\elif 1 > 0
+\set ie debug(74)
+\else
+\set nope 1
+\endif
+\if 1 < 0
+\set nope 1
+\elif 1 < 0
+\set nope 1
+\else
+\set if debug(83)
+\endif
+\if 1 = 1
+\set ig debug(86)
+\elif 0
+\set nope 1
+\endif
+\if 1 = 0
+\set nope 1
+\elif 1 <> 0
+\set ih debug(93)
+\endif
+-- must be zero if false branches where skipped
+\set nope debug(:nope)
+-- check automatic variables
+\set sc debug(:scale)
+\set ci debug(:client_id)
+\set rs debug(:random_seed)
+-- minint constant parsing
+\set min debug(-9223372036854775808)
+\set max debug(-(:min + 1))
+-- parametric pseudorandom permutation function
+\set t debug(permute(0, 2) + permute(1, 2) = 1)
+\set t debug(permute(0, 3) + permute(1, 3) + permute(2, 3) = 3)
+\set t debug(permute(0, 4) + permute(1, 4) + permute(2, 4) + permute(3, 4) = 6)
+\set t debug(permute(0, 5) + permute(1, 5) + permute(2, 5) + permute(3, 5) + permute(4, 5) = 10)
+\set t debug(permute(0, 16) + permute(1, 16) + permute(2, 16) + permute(3, 16) + \
+ permute(4, 16) + permute(5, 16) + permute(6, 16) + permute(7, 16) + \
+ permute(8, 16) + permute(9, 16) + permute(10, 16) + permute(11, 16) + \
+ permute(12, 16) + permute(13, 16) + permute(14, 16) + permute(15, 16) = 120)
+-- random sanity checks
+\set size random(2, 1000)
+\set v random(0, :size - 1)
+\set p permute(:v, :size)
+\set t debug(0 <= :p and :p < :size and :p = permute(:v + :size, :size) and :p <> permute(:v + 1, :size))
+-- actual values
+\set t debug(permute(:v, 1) = 0)
+\set t debug(permute(0, 2, 5431) = 0 and permute(1, 2, 5431) = 1 and \
+ permute(0, 2, 5433) = 1 and permute(1, 2, 5433) = 0)
+-- check permute's portability across architectures
+\set size debug(:max - 10)
+\set t debug(permute(:size-1, :size, 5432) = 520382784483822430 and \
+ permute(:size-2, :size, 5432) = 1143715004660802862 and \
+ permute(:size-3, :size, 5432) = 447293596416496998 and \
+ permute(:size-4, :size, 5432) = 916527772266572956 and \
+ permute(:size-5, :size, 5432) = 2763809008686028849 and \
+ permute(:size-6, :size, 5432) = 8648551549198294572 and \
+ permute(:size-7, :size, 5432) = 4542876852200565125)
+}
+ });
+
+# random determinism when seeded
+$node->safe_psql('postgres',
+ 'CREATE UNLOGGED TABLE seeded_random(seed INT8 NOT NULL, rand TEXT NOT NULL, val INTEGER NOT NULL);'
+);
+
+# same value to check for determinism
+my $seed = int(rand(1000000000));
+for my $i (1, 2)
+{
+ $node->pgbench(
+ "--random-seed=$seed -t 1",
+ 0,
+ [qr{processed: 1/1}],
+ [qr{setting random seed to $seed\b}],
+ "random seeded with $seed",
+ {
+ "001_pgbench_random_seed_$i" => q{-- test random functions
+\set ur random(1000, 1999)
+\set er random_exponential(2000, 2999, 2.0)
+\set gr random_gaussian(3000, 3999, 3.0)
+\set zr random_zipfian(4000, 4999, 1.5)
+INSERT INTO seeded_random(seed, rand, val) VALUES
+ (:random_seed, 'uniform', :ur),
+ (:random_seed, 'exponential', :er),
+ (:random_seed, 'gaussian', :gr),
+ (:random_seed, 'zipfian', :zr);
+}
+ });
+}
+
+# check that all runs generated the same 4 values
+my ($ret, $out, $err) = $node->psql('postgres',
+ 'SELECT seed, rand, val, COUNT(*) FROM seeded_random GROUP BY seed, rand, val'
+);
+
+ok($ret == 0, "psql seeded_random count ok");
+ok($err eq '', "psql seeded_random count stderr is empty");
+ok($out =~ /\b$seed\|uniform\|1\d\d\d\|2/,
+ "psql seeded_random count uniform");
+ok( $out =~ /\b$seed\|exponential\|2\d\d\d\|2/,
+ "psql seeded_random count exponential");
+ok( $out =~ /\b$seed\|gaussian\|3\d\d\d\|2/,
+ "psql seeded_random count gaussian");
+ok($out =~ /\b$seed\|zipfian\|4\d\d\d\|2/,
+ "psql seeded_random count zipfian");
+
+$node->safe_psql('postgres', 'DROP TABLE seeded_random;');
+
+# backslash commands
+$node->pgbench(
+ '-t 1', 0,
+ [
+ qr{type: .*/001_pgbench_backslash_commands},
+ qr{processed: 1/1},
+ qr{shell-echo-output}
+ ],
+ [qr{command=8.: int 1\b}],
+ 'pgbench backslash commands',
+ {
+ '001_pgbench_backslash_commands' => q{-- run set
+\set zero 0
+\set one 1.0
+-- sleep
+\sleep :one ms
+\sleep 100 us
+\sleep 0 s
+\sleep :zero
+-- setshell and continuation
+\setshell another_one\
+ echo \
+ :one
+\set n debug(:another_one)
+-- shell
+\shell echo shell-echo-output
+}
+ });
+
+# working \gset
+$node->pgbench(
+ '-t 1', 0,
+ [ qr{type: .*/001_pgbench_gset}, qr{processed: 1/1} ],
+ [
+ qr{command=3.: int 0\b},
+ qr{command=5.: int 1\b},
+ qr{command=6.: int 2\b},
+ qr{command=8.: int 3\b},
+ qr{command=10.: int 4\b},
+ qr{command=12.: int 5\b}
+ ],
+ 'pgbench gset command',
+ {
+ '001_pgbench_gset' => q{-- test gset
+-- no columns
+SELECT \gset
+-- one value
+SELECT 0 AS i0 \gset
+\set i debug(:i0)
+-- two values
+SELECT 1 AS i1, 2 AS i2 \gset
+\set i debug(:i1)
+\set i debug(:i2)
+-- with prefix
+SELECT 3 AS i3 \gset x_
+\set i debug(:x_i3)
+-- overwrite existing variable
+SELECT 0 AS i4, 4 AS i4 \gset
+\set i debug(:i4)
+-- work on the last SQL command under \;
+\; \; SELECT 0 AS i5 \; SELECT 5 AS i5 \; \; \gset
+\set i debug(:i5)
+}
+ });
+# \gset cannot accept more than one row, causing command to fail.
+$node->pgbench(
+ '-t 1', 2,
+ [ qr{type: .*/001_pgbench_gset_two_rows}, qr{processed: 0/1} ],
+ [qr{expected one row, got 2\b}],
+ 'pgbench gset command with two rows',
+ {
+ '001_pgbench_gset_two_rows' => q{
+SELECT 5432 AS fail UNION SELECT 5433 ORDER BY 1 \gset
+}
+ });
+
+# working \aset
+# Valid cases.
+$node->pgbench(
+ '-t 1', 0,
+ [ qr{type: .*/001_pgbench_aset}, qr{processed: 1/1} ],
+ [ qr{command=3.: int 8\b}, qr{command=4.: int 7\b} ],
+ 'pgbench aset command',
+ {
+ '001_pgbench_aset' => q{
+-- test aset, which applies to a combined query
+\; SELECT 6 AS i6 \; SELECT 7 AS i7 \; \aset
+-- unless it returns more than one row, last is kept
+SELECT 8 AS i6 UNION SELECT 9 ORDER BY 1 DESC \aset
+\set i debug(:i6)
+\set i debug(:i7)
+}
+ });
+# Empty result set with \aset, causing command to fail.
+$node->pgbench(
+ '-t 1', 2,
+ [ qr{type: .*/001_pgbench_aset_empty}, qr{processed: 0/1} ],
+ [
+ qr{undefined variable \"i8\"},
+ qr{evaluation of meta-command failed\b}
+ ],
+ 'pgbench aset command with empty result',
+ {
+ '001_pgbench_aset_empty' => q{
+-- empty result
+\; SELECT 5432 AS i8 WHERE FALSE \; \aset
+\set i debug(:i8)
+}
+ });
+
+# Working \startpipeline
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 0,
+ [ qr{type: .*/001_pgbench_pipeline}, qr{actually processed: 1/1} ],
+ [],
+ 'working \startpipeline',
+ {
+ '001_pgbench_pipeline' => q{
+-- test startpipeline
+\startpipeline
+} . "select 1;\n" x 10 . q{
+\endpipeline
+}
+ });
+
+# Working \startpipeline in prepared query mode
+$node->pgbench(
+ '-t 1 -n -M prepared',
+ 0,
+ [ qr{type: .*/001_pgbench_pipeline_prep}, qr{actually processed: 1/1} ],
+ [],
+ 'working \startpipeline',
+ {
+ '001_pgbench_pipeline_prep' => q{
+-- test startpipeline
+\startpipeline
+\endpipeline
+\startpipeline
+} . "select 1;\n" x 10 . q{
+\endpipeline
+}
+ });
+
+# Try \startpipeline twice
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{already in pipeline mode}],
+ 'error: call \startpipeline twice',
+ {
+ '001_pgbench_pipeline_2' => q{
+-- startpipeline twice
+\startpipeline
+\startpipeline
+}
+ });
+
+# Try to end a pipeline that hasn't started
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{not in pipeline mode}],
+ 'error: \endpipeline with no start',
+ {
+ '001_pgbench_pipeline_3' => q{
+-- pipeline not started
+\endpipeline
+}
+ });
+
+# Try \gset in pipeline mode
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{gset is not allowed in pipeline mode}],
+ 'error: \gset not allowed in pipeline mode',
+ {
+ '001_pgbench_pipeline_4' => q{
+\startpipeline
+select 1 \gset f
+\endpipeline
+}
+ });
+
+# Try \startpipeline without \endpipeline in a single transaction
+$node->pgbench(
+ '-t 1 -n -M extended',
+ 2,
+ [],
+ [qr{end of script reached with pipeline open}],
+ 'error: call \startpipeline without \endpipeline in a single transaction',
+ {
+ '001_pgbench_pipeline_5' => q{
+-- startpipeline only with single transaction
+\startpipeline
+}
+ });
+
+# Try \startpipeline without \endpipeline
+$node->pgbench(
+ '-t 2 -n -M extended',
+ 2,
+ [],
+ [qr{end of script reached with pipeline open}],
+ 'error: call \startpipeline without \endpipeline',
+ {
+ '001_pgbench_pipeline_6' => q{
+-- startpipeline only
+\startpipeline
+}
+ });
+
+# Working \startpipeline in prepared query mode with serializable
+$node->pgbench(
+ '-c4 -t 10 -n -M prepared',
+ 0,
+ [
+ qr{type: .*/001_pgbench_pipeline_serializable},
+ qr{actually processed: (\d+)/\1}
+ ],
+ [],
+ 'working \startpipeline with serializable',
+ {
+ '001_pgbench_pipeline_serializable' => q{
+-- test startpipeline with serializable
+\startpipeline
+BEGIN ISOLATION LEVEL SERIALIZABLE;
+} . "select 1;\n" x 10 . q{
+END;
+\endpipeline
+}
+ });
+
+# trigger many expression errors
+my @errors = (
+
+ # [ test name, expected status, expected stderr, script ]
+ # SQL
+ [
+ 'sql syntax error',
+ 2,
+ [
+ qr{ERROR: syntax error},
+ qr{prepared statement .* does not exist}
+ ],
+ q{-- SQL syntax error
+ SELECT 1 + ;
+}
+ ],
+ [
+ 'sql too many args', 1,
+ [qr{statement has too many arguments.*\b255\b}],
+ q{-- MAX_ARGS=256 for prepared
+\set i 0
+SELECT LEAST(} . join(', ', (':i') x 256) . q{)}
+ ],
+
+ # SHELL
+ [
+ 'shell bad command', 2,
+ [qr{\(shell\) .* meta-command failed}], q{\shell no-such-command}
+ ],
+ [
+ 'shell undefined variable', 2,
+ [qr{undefined variable ":nosuchvariable"}],
+ q{-- undefined variable in shell
+\shell echo ::foo :nosuchvariable
+}
+ ],
+ [ 'shell missing command', 1, [qr{missing command }], q{\shell} ],
+ [
+ 'shell too many args', 1, [qr{too many arguments in command "shell"}],
+ q{-- 256 arguments to \shell
+\shell echo } . join(' ', ('arg') x 255)
+ ],
+
+ # SET
+ [
+ 'set syntax error', 1,
+ [qr{syntax error in command "set"}], q{\set i 1 +}
+ ],
+ [
+ 'set no such function', 1,
+ [qr{unexpected function name}], q{\set i noSuchFunction()}
+ ],
+ [
+ 'set invalid variable name', 2,
+ [qr{invalid variable name}], q{\set . 1}
+ ],
+ [ 'set division by zero', 2, [qr{division by zero}], q{\set i 1/0} ],
+ [
+ 'set undefined variable',
+ 2,
+ [qr{undefined variable "nosuchvariable"}],
+ q{\set i :nosuchvariable}
+ ],
+ [ 'set unexpected char', 1, [qr{unexpected character .;.}], q{\set i ;} ],
+ [
+ 'set too many args',
+ 2,
+ [qr{too many function arguments}],
+ q{\set i least(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)}
+ ],
+ [
+ 'set empty random range', 2,
+ [qr{empty range given to random}], q{\set i random(5,3)}
+ ],
+ [
+ 'set random range too large', 2,
+ [qr{random range is too large}], q{\set i random(:minint, :maxint)}
+ ],
+ [
+ 'set gaussian param too small',
+ 2,
+ [qr{gaussian param.* at least 2}],
+ q{\set i random_gaussian(0, 10, 1.0)}
+ ],
+ [
+ 'set exponential param greater 0',
+ 2,
+ [qr{exponential parameter must be greater }],
+ q{\set i random_exponential(0, 10, 0.0)}
+ ],
+ [
+ 'set zipfian param to 1',
+ 2,
+ [qr{zipfian parameter must be in range \[1\.001, 1000\]}],
+ q{\set i random_zipfian(0, 10, 1)}
+ ],
+ [
+ 'set zipfian param too large',
+ 2,
+ [qr{zipfian parameter must be in range \[1\.001, 1000\]}],
+ q{\set i random_zipfian(0, 10, 1000000)}
+ ],
+ [
+ 'set non numeric value', 2,
+ [qr{malformed variable "foo" value: "bla"}], q{\set i :foo + 1}
+ ],
+ [ 'set no expression', 1, [qr{syntax error}], q{\set i} ],
+ [ 'set missing argument', 1, [qr{missing argument}i], q{\set} ],
+ [
+ 'set not a bool', 2,
+ [qr{cannot coerce double to boolean}], q{\set b NOT 0.0}
+ ],
+ [
+ 'set not an int', 2,
+ [qr{cannot coerce boolean to int}], q{\set i TRUE + 2}
+ ],
+ [
+ 'set not a double', 2,
+ [qr{cannot coerce boolean to double}], q{\set d ln(TRUE)}
+ ],
+ [
+ 'set case error',
+ 1,
+ [qr{syntax error in command "set"}],
+ q{\set i CASE TRUE THEN 1 ELSE 0 END}
+ ],
+ [
+ 'set random error', 2,
+ [qr{cannot coerce boolean to int}], q{\set b random(FALSE, TRUE)}
+ ],
+ [
+ 'set number of args mismatch', 1,
+ [qr{unexpected number of arguments}], q{\set d ln(1.0, 2.0))}
+ ],
+ [
+ 'set at least one arg', 1,
+ [qr{at least one argument expected}], q{\set i greatest())}
+ ],
+
+ # SET: ARITHMETIC OVERFLOW DETECTION
+ [
+ 'set double to int overflow', 2,
+ [qr{double to int overflow for 100}], q{\set i int(1E32)}
+ ],
+ [
+ 'set bigint add overflow', 2,
+ [qr{int add out}], q{\set i (1<<62) + (1<<62)}
+ ],
+ [
+ 'set bigint sub overflow',
+ 2, [qr{int sub out}], q{\set i 0 - (1<<62) - (1<<62) - (1<<62)}
+ ],
+ [
+ 'set bigint mul overflow', 2,
+ [qr{int mul out}], q{\set i 2 * (1<<62)}
+ ],
+ [
+ 'set bigint div out of range', 2,
+ [qr{bigint div out of range}], q{\set i :minint / -1}
+ ],
+
+ # SETSHELL
+ [
+ 'setshell not an int', 2,
+ [qr{command must return an integer}], q{\setshell i echo -n one}
+ ],
+ [ 'setshell missing arg', 1, [qr{missing argument }], q{\setshell var} ],
+ [
+ 'setshell no such command', 2,
+ [qr{could not read result }], q{\setshell var no-such-command}
+ ],
+
+ # SLEEP
+ [
+ 'sleep undefined variable', 2,
+ [qr{sleep: undefined variable}], q{\sleep :nosuchvariable}
+ ],
+ [
+ 'sleep too many args', 1,
+ [qr{too many arguments}], q{\sleep too many args}
+ ],
+ [
+ 'sleep missing arg', 1,
+ [ qr{missing argument}, qr{\\sleep} ], q{\sleep}
+ ],
+ [
+ 'sleep unknown unit', 1,
+ [qr{unrecognized time unit}], q{\sleep 1 week}
+ ],
+
+ # MISC
+ [
+ 'misc invalid backslash command', 1,
+ [qr{invalid command .* "nosuchcommand"}], q{\nosuchcommand}
+ ],
+ [ 'misc empty script', 1, [qr{empty command list for script}], q{} ],
+ [
+ 'bad boolean', 2,
+ [qr{malformed variable.*trueXXX}], q{\set b :badtrue or true}
+ ],
+ [
+ 'invalid permute size',
+ 2,
+ [qr{permute size parameter must be greater than zero}],
+ q{\set i permute(0, 0)}
+ ],
+
+ # GSET
+ [
+ 'gset no row', 2,
+ [qr{expected one row, got 0\b}], q{SELECT WHERE FALSE \gset}
+ ],
+ [ 'gset alone', 1, [qr{gset must follow an SQL command}], q{\gset} ],
+ [
+ 'gset no SQL', 1,
+ [qr{gset must follow an SQL command}], q{\set i +1
+\gset}
+ ],
+ [
+ 'gset too many arguments', 1,
+ [qr{too many arguments}], q{SELECT 1 \gset a b}
+ ],
+ [
+ 'gset after gset', 1,
+ [qr{gset must follow an SQL command}], q{SELECT 1 AS i \gset
+\gset}
+ ],
+ [
+ 'gset non SELECT',
+ 2,
+ [qr{expected one row, got 0}],
+ q{DROP TABLE IF EXISTS no_such_table \gset}
+ ],
+ [
+ 'gset bad default name', 2,
+ [qr{error storing into variable \?column\?}], q{SELECT 1 \gset}
+ ],
+ [
+ 'gset bad name',
+ 2,
+ [qr{error storing into variable bad name!}],
+ q{SELECT 1 AS "bad name!" \gset}
+ ],);
+
+for my $e (@errors)
+{
+ my ($name, $status, $re, $script, $no_prepare) = @$e;
+ $status != 0 or die "invalid expected status for test \"$name\"";
+ my $n = '001_pgbench_error_' . $name;
+ $n =~ s/ /_/g;
+ $node->pgbench(
+ '-n -t 1 -Dfoo=bla -Dnull=null -Dtrue=true -Done=1 -Dzero=0.0 -Dbadtrue=trueXXX'
+ . ' -Dmaxint=9223372036854775807 -Dminint=-9223372036854775808'
+ . ($no_prepare ? '' : ' -M prepared'),
+ $status,
+ [ $status == 1 ? qr{^$} : qr{processed: 0/1} ],
+ $re,
+ 'pgbench script error: ' . $name,
+ { $n => $script });
+}
+
+# throttling
+$node->pgbench(
+ '-t 100 -S --rate=100000 --latency-limit=1000000 -c 2 -n -r',
+ 0,
+ [ qr{processed: 200/200}, qr{builtin: select only} ],
+ [qr{^$}],
+ 'pgbench throttling');
+
+$node->pgbench(
+
+ # given the expected rate and the 2 ms tx duration, at most one is executed
+ '-t 10 --rate=100000 --latency-limit=1 -n -r',
+ 0,
+ [
+ qr{processed: [01]/10},
+ qr{type: .*/001_pgbench_sleep},
+ qr{above the 1.0 ms latency limit: [01]/}
+ ],
+ [qr{^$}],
+ 'pgbench late throttling',
+ { '001_pgbench_sleep' => q{\sleep 2ms} });
+
+# return a list of files from directory $dir matching regexpr $re
+# this works around glob portability and escaping issues
+sub list_files
+{
+ my ($dir, $re) = @_;
+ opendir my $dh, $dir or die "cannot opendir $dir: $!";
+ my @files = grep /$re/, readdir $dh;
+ closedir $dh or die "cannot closedir $dir: $!";
+ return map { $dir . '/' . $_ } @files;
+}
+
+# Check log contents and clean them up:
+# $dir: directory holding logs
+# $prefix: file prefix for per-thread logs
+# $nb: number of expected files
+# $min/$max: minimum and maximum number of lines in log files
+# $re: regular expression each log line has to match
+sub check_pgbench_logs
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($dir, $prefix, $nb, $min, $max, $re) = @_;
+
+ # $prefix is simple enough, thus does not need escaping
+ my @logs = list_files($dir, qr{^$prefix\..*$});
+ ok(@logs == $nb, "number of log files");
+ ok(grep(/\/$prefix\.\d+(\.\d+)?$/, @logs) == $nb, "file name format");
+
+ my $log_number = 0;
+ for my $log (sort @logs)
+ {
+ # Check the contents of each log file.
+ my $contents_raw = slurp_file($log);
+
+ my @contents = split(/\n/, $contents_raw);
+ my $clen = @contents;
+ ok( $min <= $clen && $clen <= $max,
+ "transaction count for $log ($clen)");
+ my $clen_match = grep(/$re/, @contents);
+ ok($clen_match == $clen, "transaction format for $prefix");
+
+ # Show more information if some logs don't match
+ # to help with debugging.
+ if ($clen_match != $clen)
+ {
+ foreach my $log (@contents)
+ {
+ print "# Log entry not matching: $log\n"
+ unless $log =~ /$re/;
+ }
+ }
+ }
+ return;
+}
+
+my $bdir = $node->basedir;
+
+# Run with sampling rate, 2 clients with 50 transactions each.
+$node->pgbench(
+ "-n -S -t 50 -c 2 --log --sampling-rate=0.5", 0,
+ [ qr{select only}, qr{processed: 100/100} ], [qr{^$}],
+ 'pgbench logs', undef,
+ "--log-prefix=$bdir/001_pgbench_log_2");
+# The IDs of the clients (1st field) in the logs should be either 0 or 1.
+check_pgbench_logs($bdir, '001_pgbench_log_2', 1, 8, 92,
+ qr{^[01] \d{1,2} \d+ \d \d+ \d+$});
+
+# Run with different read-only option pattern, 1 client with 10 transactions.
+$node->pgbench(
+ "-n -b select-only -t 10 -l", 0,
+ [ qr{select only}, qr{processed: 10/10} ], [qr{^$}],
+ 'pgbench logs contents', undef,
+ "--log-prefix=$bdir/001_pgbench_log_3");
+# The ID of a single client (1st field) should match 0.
+check_pgbench_logs($bdir, '001_pgbench_log_3', 1, 10, 10,
+ qr{^0 \d{1,2} \d+ \d \d+ \d+$});
+
+# abortion of the client if the script contains an incomplete transaction block
+$node->pgbench(
+ '--no-vacuum',
+ 2,
+ [qr{processed: 1/10}],
+ [
+ qr{client 0 aborted: end of script reached without completing the last transaction}
+ ],
+ 'incomplete transaction block',
+ { '001_pgbench_incomplete_transaction_block' => q{BEGIN;SELECT 1;} });
+
+# Test the concurrent update in the table row and deadlocks.
+
+$node->safe_psql('postgres',
+ 'CREATE UNLOGGED TABLE first_client_table (value integer); '
+ . 'CREATE UNLOGGED TABLE xy (x integer, y integer); '
+ . 'INSERT INTO xy VALUES (1, 2);');
+
+# Serialization error and retry
+
+local $ENV{PGOPTIONS} = "-c default_transaction_isolation=repeatable\\ read";
+
+# Check that we have a serialization error and the same random value of the
+# delta variable in the next try
+my $err_pattern =
+ "(client (0|1) sending UPDATE xy SET y = y \\+ -?\\d+\\b).*"
+ . "client \\2 got an error in command 3 \\(SQL\\) of script 0; "
+ . "ERROR: could not serialize access due to concurrent update\\b.*"
+ . "\\1";
+
+$node->pgbench(
+ "-n -c 2 -t 1 -d --verbose-errors --max-tries 2",
+ 0,
+ [
+ qr{processed: 2/2\b},
+ qr{number of transactions retried: 1\b},
+ qr{total number of retries: 1\b}
+ ],
+ [qr/$err_pattern/s],
+ 'concurrent update with retrying',
+ {
+ '001_pgbench_serialization' => q{
+-- What's happening:
+-- The first client starts the transaction with the isolation level Repeatable
+-- Read:
+--
+-- BEGIN;
+-- UPDATE xy SET y = ... WHERE x = 1;
+--
+-- The second client starts a similar transaction with the same isolation level:
+--
+-- BEGIN;
+-- UPDATE xy SET y = ... WHERE x = 1;
+-- <waiting for the first client>
+--
+-- The first client commits its transaction, and the second client gets a
+-- serialization error.
+
+\set delta random(-5000, 5000)
+
+-- The second client will stop here
+SELECT pg_advisory_lock(0);
+
+-- Start transaction with concurrent update
+BEGIN;
+UPDATE xy SET y = y + :delta WHERE x = 1 AND pg_advisory_lock(1) IS NOT NULL;
+
+-- Wait for the second client
+DO $$
+DECLARE
+ exists boolean;
+ waiters integer;
+BEGIN
+ -- The second client always comes in second, and the number of rows in the
+ -- table first_client_table reflect this. Here the first client inserts a row,
+ -- so the second client will see a non-empty table when repeating the
+ -- transaction after the serialization error.
+ SELECT EXISTS (SELECT * FROM first_client_table) INTO STRICT exists;
+ IF NOT exists THEN
+ -- Let the second client begin
+ PERFORM pg_advisory_unlock(0);
+ -- And wait until the second client tries to get the same lock
+ LOOP
+ SELECT COUNT(*) INTO STRICT waiters FROM pg_locks WHERE
+ locktype = 'advisory' AND objsubid = 1 AND
+ ((classid::bigint << 32) | objid::bigint = 1::bigint) AND NOT granted;
+ IF waiters = 1 THEN
+ INSERT INTO first_client_table VALUES (1);
+
+ -- Exit loop
+ EXIT;
+ END IF;
+ END LOOP;
+ END IF;
+END$$;
+
+COMMIT;
+SELECT pg_advisory_unlock_all();
+}
+ });
+
+# Clean up
+
+$node->safe_psql('postgres', 'DELETE FROM first_client_table;');
+
+local $ENV{PGOPTIONS} = "-c default_transaction_isolation=read\\ committed";
+
+# Deadlock error and retry
+
+# Check that we have a deadlock error
+$err_pattern =
+ "client (0|1) got an error in command (3|5) \\(SQL\\) of script 0; "
+ . "ERROR: deadlock detected\\b";
+
+$node->pgbench(
+ "-n -c 2 -t 1 --max-tries 2 --verbose-errors",
+ 0,
+ [
+ qr{processed: 2/2\b},
+ qr{number of transactions retried: 1\b},
+ qr{total number of retries: 1\b}
+ ],
+ [qr{$err_pattern}],
+ 'deadlock with retrying',
+ {
+ '001_pgbench_deadlock' => q{
+-- What's happening:
+-- The first client gets the lock 2.
+-- The second client gets the lock 3 and tries to get the lock 2.
+-- The first client tries to get the lock 3 and one of them gets a deadlock
+-- error.
+--
+-- A client that does not get a deadlock error must hold a lock at the
+-- transaction start. Thus in the end it releases all of its locks before the
+-- client with the deadlock error starts a retry (we do not want any errors
+-- again).
+
+-- Since the client with the deadlock error has not released the blocking locks,
+-- let's do this here.
+SELECT pg_advisory_unlock_all();
+
+-- The second client and the client with the deadlock error stop here
+SELECT pg_advisory_lock(0);
+SELECT pg_advisory_lock(1);
+
+-- The second client and the client with the deadlock error always come after
+-- the first and the number of rows in the table first_client_table reflects
+-- this. Here the first client inserts a row, so in the future the table is
+-- always non-empty.
+DO $$
+DECLARE
+ exists boolean;
+BEGIN
+ SELECT EXISTS (SELECT * FROM first_client_table) INTO STRICT exists;
+ IF exists THEN
+ -- We are the second client or the client with the deadlock error
+
+ -- The first client will take care by itself of this lock (see below)
+ PERFORM pg_advisory_unlock(0);
+
+ PERFORM pg_advisory_lock(3);
+
+ -- The second client can get a deadlock here
+ PERFORM pg_advisory_lock(2);
+ ELSE
+ -- We are the first client
+
+ -- This code should not be used in a new transaction after an error
+ INSERT INTO first_client_table VALUES (1);
+
+ PERFORM pg_advisory_lock(2);
+ END IF;
+END$$;
+
+DO $$
+DECLARE
+ num_rows integer;
+ waiters integer;
+BEGIN
+ -- Check if we are the first client
+ SELECT COUNT(*) FROM first_client_table INTO STRICT num_rows;
+ IF num_rows = 1 THEN
+ -- This code should not be used in a new transaction after an error
+ INSERT INTO first_client_table VALUES (2);
+
+ -- Let the second client begin
+ PERFORM pg_advisory_unlock(0);
+ PERFORM pg_advisory_unlock(1);
+
+ -- Make sure the second client is ready for deadlock
+ LOOP
+ SELECT COUNT(*) INTO STRICT waiters FROM pg_locks WHERE
+ locktype = 'advisory' AND
+ objsubid = 1 AND
+ ((classid::bigint << 32) | objid::bigint = 2::bigint) AND
+ NOT granted;
+
+ IF waiters = 1 THEN
+ -- Exit loop
+ EXIT;
+ END IF;
+ END LOOP;
+
+ PERFORM pg_advisory_lock(0);
+ -- And the second client took care by itself of the lock 1
+ END IF;
+END$$;
+
+-- The first client can get a deadlock here
+SELECT pg_advisory_lock(3);
+
+SELECT pg_advisory_unlock_all();
+}
+ });
+
+# Clean up
+$node->safe_psql('postgres', 'DROP TABLE first_client_table, xy;');
+
+
+# done
+$node->safe_psql('postgres', 'DROP TABLESPACE regress_pgbench_tap_1_ts');
+$node->stop;
+done_testing();
diff --git a/src/bin/pgbench/t/002_pgbench_no_server.pl b/src/bin/pgbench/t/002_pgbench_no_server.pl
new file mode 100644
index 0000000..0ec54fb
--- /dev/null
+++ b/src/bin/pgbench/t/002_pgbench_no_server.pl
@@ -0,0 +1,387 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+#
+# pgbench tests which do not need a server
+#
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# create a directory for scripts
+my $testname = $0;
+$testname =~ s,.*/,,;
+$testname =~ s/\.pl$//;
+
+my $testdir = "$PostgreSQL::Test::Utils::tmp_check/t_${testname}_stuff";
+mkdir $testdir
+ or BAIL_OUT("could not create test directory \"${testdir}\": $!");
+
+# invoke pgbench
+sub pgbench
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($opts, $stat, $out, $err, $name) = @_;
+ command_checks_all([ 'pgbench', split(/\s+/, $opts) ],
+ $stat, $out, $err, $name);
+ return;
+}
+
+# invoke pgbench with scripts
+sub pgbench_scripts
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($opts, $stat, $out, $err, $name, $files) = @_;
+ my @cmd = ('pgbench', split /\s+/, $opts);
+ my @filenames = ();
+ if (defined $files)
+ {
+ for my $fn (sort keys %$files)
+ {
+ my $filename = $testdir . '/' . $fn;
+
+ # cleanup file weight if any
+ $filename =~ s/\@\d+$//;
+
+ # cleanup from prior runs
+ unlink $filename;
+ append_to_file($filename, $$files{$fn});
+ push @cmd, '-f', $filename;
+ }
+ }
+ command_checks_all(\@cmd, $stat, $out, $err, $name);
+ return;
+}
+
+#
+# Option various errors
+#
+
+my @options = (
+
+ # name, options, stderr checks
+ [
+ 'bad option',
+ '-h home -p 5432 -U calvin -d --bad-option',
+ [qr{--help.*more information}]
+ ],
+ [
+ 'no file',
+ '-f no-such-file',
+ [qr{could not open file "no-such-file":}]
+ ],
+ [
+ 'no builtin',
+ '-b no-such-builtin',
+ [qr{no builtin script .* "no-such-builtin"}]
+ ],
+ [
+ 'invalid weight',
+ '--builtin=select-only@one',
+ [qr{invalid weight specification: \@one}]
+ ],
+ [
+ 'invalid weight',
+ '-b select-only@-1',
+ [qr{weight spec.* out of range .*: -1}]
+ ],
+ [ 'too many scripts', '-S ' x 129, [qr{at most 128 SQL scripts}] ],
+ [
+ 'bad #clients', '-c three',
+ [qr{invalid value "three" for option -c/--clients}]
+ ],
+ [
+ 'bad #threads', '-j eleven',
+ [qr{invalid value "eleven" for option -j/--jobs}]
+ ],
+ [
+ 'bad scale', '-i -s two',
+ [qr{invalid value "two" for option -s/--scale}]
+ ],
+ [
+ 'invalid #transactions',
+ '-t zil', [qr{invalid value "zil" for option -t/--transactions}]
+ ],
+ [
+ 'invalid duration',
+ '-T ten', [qr{invalid value "ten" for option -T/--time}]
+ ],
+ [
+ '-t XOR -T',
+ '-N -l --aggregate-interval=5 --log-prefix=notused -t 1000 -T 1',
+ [qr{specify either }]
+ ],
+ [
+ '-T XOR -t',
+ '-P 1 --progress-timestamp -l --sampling-rate=0.001 -T 10 -t 1000',
+ [qr{specify either }]
+ ],
+ [ 'bad variable', '--define foobla', [qr{invalid variable definition}] ],
+ [ 'invalid fillfactor', '-F 1', [qr{-F/--fillfactor must be in range}] ],
+ [ 'invalid query mode', '-M no-such-mode', [qr{invalid query mode}] ],
+ [
+ 'invalid progress', '--progress=0',
+ [qr{-P/--progress must be in range}]
+ ],
+ [ 'invalid rate', '--rate=0.0', [qr{invalid rate limit}] ],
+ [ 'invalid latency', '--latency-limit=0.0', [qr{invalid latency limit}] ],
+ [
+ 'invalid sampling rate', '--sampling-rate=0',
+ [qr{invalid sampling rate}]
+ ],
+ [
+ 'invalid aggregate interval',
+ '--aggregate-interval=-3',
+ [qr{--aggregate-interval must be in range}]
+ ],
+ [
+ 'weight zero',
+ '-b se@0 -b si@0 -b tpcb@0',
+ [qr{weight must not be zero}]
+ ],
+ [ 'init vs run', '-i -S', [qr{cannot be used in initialization}] ],
+ [ 'run vs init', '-S -F 90', [qr{cannot be used in benchmarking}] ],
+ [ 'ambiguous builtin', '-b s', [qr{ambiguous}] ],
+ [
+ '--progress-timestamp => --progress', '--progress-timestamp',
+ [qr{allowed only under}]
+ ],
+ [
+ '-I without init option',
+ '-I dtg',
+ [qr{cannot be used in benchmarking mode}]
+ ],
+ [
+ 'invalid init step',
+ '-i -I dta',
+ [
+ qr{unrecognized initialization step},
+ qr{Allowed step characters are}
+ ]
+ ],
+ [
+ 'bad random seed',
+ '--random-seed=one',
+ [
+ qr{unrecognized random seed option "one"},
+ qr{Expecting an unsigned integer, "time" or "rand"},
+ qr{error while setting random seed from --random-seed option}
+ ]
+ ],
+ [
+ 'bad partition method',
+ '-i --partition-method=BAD',
+ [ qr{"range"}, qr{"hash"}, qr{"BAD"} ]
+ ],
+ [
+ 'bad partition number',
+ '-i --partitions -1',
+ [qr{--partitions must be in range}]
+ ],
+ [
+ 'partition method without partitioning',
+ '-i --partition-method=hash',
+ [qr{partition-method requires greater than zero --partitions}]
+ ],
+ [
+ 'bad maximum number of tries',
+ '--max-tries -10',
+ [qr{invalid number of maximum tries: "-10"}]
+ ],
+ [
+ 'an infinite number of tries',
+ '--max-tries 0',
+ [
+ qr{an unlimited number of transaction tries can only be used with --latency-limit or a duration}
+ ]
+ ],
+
+ # logging sub-options
+ [
+ 'sampling => log', '--sampling-rate=0.01',
+ [qr{log sampling .* only when}]
+ ],
+ [
+ 'sampling XOR aggregate',
+ '-l --sampling-rate=0.1 --aggregate-interval=3',
+ [qr{sampling .* aggregation .* cannot be used at the same time}]
+ ],
+ [
+ 'aggregate => log', '--aggregate-interval=3',
+ [qr{aggregation .* only when}]
+ ],
+ [ 'log-prefix => log', '--log-prefix=x', [qr{prefix .* only when}] ],
+ [
+ 'duration & aggregation',
+ '-l -T 1 --aggregate-interval=3',
+ [qr{aggr.* not be higher}]
+ ],
+ [
+ 'duration % aggregation',
+ '-l -T 5 --aggregate-interval=3',
+ [qr{multiple}]
+ ],);
+
+for my $o (@options)
+{
+ my ($name, $opts, $err_checks) = @$o;
+ pgbench($opts, 1, [qr{^$}], $err_checks,
+ 'pgbench option error: ' . $name);
+}
+
+# Help
+pgbench(
+ '--help', 0,
+ [
+ qr{benchmarking tool for PostgreSQL},
+ qr{Usage},
+ qr{Initialization options:},
+ qr{Common options:},
+ qr{Report bugs to}
+ ],
+ [qr{^$}],
+ 'pgbench help');
+
+# Version
+pgbench('-V', 0, [qr{^pgbench .PostgreSQL. }], [qr{^$}], 'pgbench version');
+
+# list of builtins
+pgbench(
+ '-b list',
+ 0,
+ [qr{^$}],
+ [
+ qr{Available builtin scripts:}, qr{tpcb-like},
+ qr{simple-update}, qr{select-only}
+ ],
+ 'pgbench builtin list');
+
+# builtin listing
+pgbench(
+ '--show-script se',
+ 0,
+ [qr{^$}],
+ [
+ qr{select-only: }, qr{SELECT abalance FROM pgbench_accounts WHERE},
+ qr{(?!UPDATE)}, qr{(?!INSERT)}
+ ],
+ 'pgbench builtin listing');
+
+my @script_tests = (
+
+ # name, err, { file => contents }
+ [
+ 'missing endif',
+ [qr{\\if without matching \\endif}],
+ { 'if-noendif.sql' => '\if 1' }
+ ],
+ [
+ 'missing if on elif',
+ [qr{\\elif without matching \\if}],
+ { 'elif-noif.sql' => '\elif 1' }
+ ],
+ [
+ 'missing if on else',
+ [qr{\\else without matching \\if}],
+ { 'else-noif.sql' => '\else' }
+ ],
+ [
+ 'missing if on endif',
+ [qr{\\endif without matching \\if}],
+ { 'endif-noif.sql' => '\endif' }
+ ],
+ [
+ 'elif after else',
+ [qr{\\elif after \\else}],
+ { 'else-elif.sql' => "\\if 1\n\\else\n\\elif 0\n\\endif" }
+ ],
+ [
+ 'else after else',
+ [qr{\\else after \\else}],
+ { 'else-else.sql' => "\\if 1\n\\else\n\\else\n\\endif" }
+ ],
+ [
+ 'if syntax error',
+ [qr{syntax error in command "if"}],
+ { 'if-bad.sql' => "\\if\n\\endif\n" }
+ ],
+ [
+ 'elif syntax error',
+ [qr{syntax error in command "elif"}],
+ { 'elif-bad.sql' => "\\if 0\n\\elif +\n\\endif\n" }
+ ],
+ [
+ 'else syntax error',
+ [qr{unexpected argument in command "else"}],
+ { 'else-bad.sql' => "\\if 0\n\\else BAD\n\\endif\n" }
+ ],
+ [
+ 'endif syntax error',
+ [qr{unexpected argument in command "endif"}],
+ { 'endif-bad.sql' => "\\if 0\n\\endif BAD\n" }
+ ],
+ [
+ 'not enough arguments for least',
+ [qr{at least one argument expected \(least\)}],
+ { 'bad-least.sql' => "\\set i least()\n" }
+ ],
+ [
+ 'not enough arguments for greatest',
+ [qr{at least one argument expected \(greatest\)}],
+ { 'bad-greatest.sql' => "\\set i greatest()\n" }
+ ],
+ [
+ 'not enough arguments for hash',
+ [qr{unexpected number of arguments \(hash\)}],
+ { 'bad-hash-1.sql' => "\\set i hash()\n" }
+ ],
+ [
+ 'too many arguments for hash',
+ [qr{unexpected number of arguments \(hash\)}],
+ { 'bad-hash-2.sql' => "\\set i hash(1,2,3)\n" }
+ ],
+ # overflow
+ [
+ 'bigint overflow 1',
+ [qr{bigint constant overflow}],
+ { 'overflow-1.sql' => "\\set i 100000000000000000000\n" }
+ ],
+ [
+ 'double overflow 2',
+ [qr{double constant overflow}],
+ { 'overflow-2.sql' => "\\set d 1.0E309\n" }
+ ],
+ [
+ 'double overflow 3',
+ [qr{double constant overflow}],
+ { 'overflow-3.sql' => "\\set d .1E310\n" }
+ ],
+ [
+ 'set i',
+ [ qr{set i 1 }, qr{\^ error found here} ],
+ { 'set_i_op' => "\\set i 1 +\n" }
+ ],
+ [
+ 'not enough arguments to permute',
+ [qr{unexpected number of arguments \(permute\)}],
+ { 'bad-permute-1.sql' => "\\set i permute(1)\n" }
+ ],
+ [
+ 'too many arguments to permute',
+ [qr{unexpected number of arguments \(permute\)}],
+ { 'bad-permute-2.sql' => "\\set i permute(1, 2, 3, 4)\n" }
+ ],);
+
+for my $t (@script_tests)
+{
+ my ($name, $err, $files) = @$t;
+ pgbench_scripts('', 1, [qr{^$}], $err, 'pgbench option error: ' . $name,
+ $files);
+}
+
+done_testing();
diff --git a/src/bin/pgevent/MSG00001.bin b/src/bin/pgevent/MSG00001.bin
new file mode 100644
index 0000000..6ac08e5
--- /dev/null
+++ b/src/bin/pgevent/MSG00001.bin
Binary files differ
diff --git a/src/bin/pgevent/Makefile b/src/bin/pgevent/Makefile
new file mode 100644
index 0000000..9987d11
--- /dev/null
+++ b/src/bin/pgevent/Makefile
@@ -0,0 +1,39 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pgevent
+#
+# Copyright (c) 1996-2023, PostgreSQL Global Development Group
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "Eventlog message formatter"
+PGAPPICON=win32
+
+subdir = src/bin/pgevent
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+ifeq ($(PORTNAME), win32)
+
+OBJS = \
+ pgevent.o \
+ pgmsgevent.o \
+ $(WIN32RES)
+NAME=pgevent
+
+SHLIB_LINK =
+SHLIB_EXPORTS = exports.txt
+
+all: all-lib
+
+install: all install-lib
+
+include $(top_srcdir)/src/Makefile.shlib
+
+pgmsgevent.o: pgmsgevent.rc
+ $(WINDRES) $< -o $@ --include-dir=$(top_builddir)/src/include --include-dir=$(top_srcdir)/src/include --include-dir=$(srcdir) --include-dir=.
+
+clean distclean: clean-lib
+ rm -f $(OBJS) win32ver.rc
+
+endif
diff --git a/src/bin/pgevent/README b/src/bin/pgevent/README
new file mode 100644
index 0000000..10ec8d2
--- /dev/null
+++ b/src/bin/pgevent/README
@@ -0,0 +1,20 @@
+src/bin/pgevent/README
+
+pgevent
+=======
+
+MSG00001.bin is a binary file, result of Microsoft MC compiler. MC compiler
+can be downloaded for free with MS Core SDK but it is not included with MSYS
+tools and I didn't find an alternative way to compile MC file.
+
+To summarize: the command "MC pgmsgevent.mc" generates pgmsgevent.h,
+pgmsgevent.rc, and MSG00001.bin files. In MC file, we declare a string
+with %s format, so we can write anything we want in the future without
+needing to change the definition of this string.
+
+To finish, because DllUnregisterServer and DllRegisterServer are system
+defined entry points, we need to export these two functions with their names
+without "decoration", so we cannot use auto generated .def files without
+handy modifications.
+
+Laurent Ballester
diff --git a/src/bin/pgevent/exports.txt b/src/bin/pgevent/exports.txt
new file mode 100644
index 0000000..8facaed
--- /dev/null
+++ b/src/bin/pgevent/exports.txt
@@ -0,0 +1,3 @@
+ DllUnregisterServer@0 ;
+ DllRegisterServer@0 ;
+ DllInstall ;
diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build
new file mode 100644
index 0000000..eca930a
--- /dev/null
+++ b/src/bin/pgevent/meson.build
@@ -0,0 +1,32 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+if host_system != 'windows'
+ subdir_done()
+endif
+
+pgevent_sources = files(
+ 'pgevent.c',
+)
+
+pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pgevent',
+ '--FILEDESC', 'Eventlog message formatter',])
+
+pgevent_sources += windows.compile_resources('pgmsgevent.rc')
+
+# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach
+pgevent_link_args = []
+if cc.get_id() == 'msvc'
+ pgevent_link_args += '/ignore:4104'
+endif
+
+pgevent = shared_library('pgevent',
+ pgevent_sources,
+ dependencies: [frontend_code],
+ link_args: pgevent_link_args,
+ vs_module_defs: 'pgevent.def',
+ kwargs: default_lib_args + {
+ 'name_prefix': '',
+ },
+)
+bin_targets += pgevent
diff --git a/src/bin/pgevent/pgevent.c b/src/bin/pgevent/pgevent.c
new file mode 100644
index 0000000..807a2c9
--- /dev/null
+++ b/src/bin/pgevent/pgevent.c
@@ -0,0 +1,160 @@
+/*-------------------------------------------------------------------------
+ *
+ * pgevent.c
+ * Defines the entry point for pgevent dll.
+ * The DLL defines event source for backend
+ *
+ *
+ * IDENTIFICATION
+ * src/bin/pgevent/pgevent.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <olectl.h>
+
+/* Global variables */
+HANDLE g_module = NULL; /* hModule of DLL */
+
+/*
+ * The event source is stored as a registry key.
+ * The maximum length of a registry key is 255 characters.
+ * http://msdn.microsoft.com/en-us/library/ms724872(v=vs.85).aspx
+ */
+char event_source[256] = DEFAULT_EVENT_SOURCE;
+
+/* Prototypes */
+HRESULT DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
+STDAPI DllRegisterServer(void);
+STDAPI DllUnregisterServer(void);
+BOOL WINAPI DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved);
+
+/*
+ * DllInstall --- Passes the command line argument to DLL
+ */
+
+HRESULT
+DllInstall(BOOL bInstall,
+ LPCWSTR pszCmdLine)
+{
+ if (pszCmdLine && *pszCmdLine != '\0')
+ wcstombs(event_source, pszCmdLine, sizeof(event_source));
+
+ /*
+ * This is an ugly hack due to the strange behavior of "regsvr32 /i".
+ *
+ * When installing, regsvr32 calls DllRegisterServer before DllInstall.
+ * When uninstalling (i.e. "regsvr32 /u /i"), on the other hand, regsvr32
+ * calls DllInstall and then DllUnregisterServer as expected.
+ *
+ * This strange behavior forces us to specify -n (i.e. "regsvr32 /n /i").
+ * Without -n, DllRegisterServer called before DllInstall would mistakenly
+ * overwrite the default "PostgreSQL" event source registration.
+ */
+ if (bInstall)
+ DllRegisterServer();
+ return S_OK;
+}
+
+/*
+ * DllRegisterServer --- Instructs DLL to create its registry entries
+ */
+
+STDAPI
+DllRegisterServer(void)
+{
+ HKEY key;
+ DWORD data;
+ char buffer[_MAX_PATH];
+ char key_name[400];
+
+ /* Set the name of DLL full path name. */
+ if (!GetModuleFileName((HMODULE) g_module, buffer, sizeof(buffer)))
+ {
+ MessageBox(NULL, "Could not retrieve DLL filename", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /*
+ * Add PostgreSQL source name as a subkey under the Application key in the
+ * EventLog registry key.
+ */
+ _snprintf(key_name, sizeof(key_name),
+ "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
+ event_source);
+ if (RegCreateKey(HKEY_LOCAL_MACHINE, key_name, &key))
+ {
+ MessageBox(NULL, "Could not create the registry key.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /* Add the name to the EventMessageFile subkey. */
+ if (RegSetValueEx(key,
+ "EventMessageFile",
+ 0,
+ REG_EXPAND_SZ,
+ (LPBYTE) buffer,
+ strlen(buffer) + 1))
+ {
+ MessageBox(NULL, "Could not set the event message file.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ /* Set the supported event types in the TypesSupported subkey. */
+ data = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+
+ if (RegSetValueEx(key,
+ "TypesSupported",
+ 0,
+ REG_DWORD,
+ (LPBYTE) &data,
+ sizeof(DWORD)))
+ {
+ MessageBox(NULL, "Could not set the supported types.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+
+ RegCloseKey(key);
+ return S_OK;
+}
+
+/*
+ * DllUnregisterServer --- Instructs DLL to remove only those entries created through DllRegisterServer
+ */
+
+STDAPI
+DllUnregisterServer(void)
+{
+ char key_name[400];
+
+ /*
+ * Remove PostgreSQL source name as a subkey under the Application key in
+ * the EventLog registry key.
+ */
+
+ _snprintf(key_name, sizeof(key_name),
+ "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\%s",
+ event_source);
+ if (RegDeleteKey(HKEY_LOCAL_MACHINE, key_name))
+ {
+ MessageBox(NULL, "Could not delete the registry key.", "PostgreSQL error", MB_OK | MB_ICONSTOP);
+ return SELFREG_E_TYPELIB;
+ }
+ return S_OK;
+}
+
+/*
+ * DllMain --- is an optional entry point into a DLL.
+ */
+
+BOOL WINAPI
+DllMain(HANDLE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+)
+{
+ if (ul_reason_for_call == DLL_PROCESS_ATTACH)
+ g_module = hModule;
+ return TRUE;
+}
diff --git a/src/bin/pgevent/pgevent.def b/src/bin/pgevent/pgevent.def
new file mode 100644
index 0000000..6b4d44a
--- /dev/null
+++ b/src/bin/pgevent/pgevent.def
@@ -0,0 +1,5 @@
+; dlltool --output-def pgevent.def pgevent.o pgmsgevent.o
+EXPORTS
+ DllUnregisterServer ;
+ DllRegisterServer ;
+ DllInstall ;
diff --git a/src/bin/pgevent/pgmsgevent.h b/src/bin/pgevent/pgmsgevent.h
new file mode 100644
index 0000000..aba71e4
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.h
@@ -0,0 +1,46 @@
+/* src/bin/pgevent/pgmsgevent.h */
+
+/* */
+/* Values are 32 bit values laid out as follows: */
+/* */
+/* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 */
+/* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 */
+/* +---+-+-+-----------------------+-------------------------------+ */
+/* |Sev|C|R| Facility | Code | */
+/* +---+-+-+-----------------------+-------------------------------+ */
+/* */
+/* where */
+/* */
+/* Sev - is the severity code */
+/* */
+/* 00 - Success */
+/* 01 - Informational */
+/* 10 - Warning */
+/* 11 - Error */
+/* */
+/* C - is the Customer code flag */
+/* */
+/* R - is a reserved bit */
+/* */
+/* Facility - is the facility code */
+/* */
+/* Code - is the facility's status code */
+/* */
+/* */
+/* Define the facility codes */
+/* */
+
+
+/* */
+/* Define the severity codes */
+/* */
+
+
+/* */
+/* MessageId: PGWIN32_EVENTLOG_MSG */
+/* */
+/* MessageText: */
+/* */
+/* %1 */
+/* */
+#define PGWIN32_EVENTLOG_MSG 0x00000000L
diff --git a/src/bin/pgevent/pgmsgevent.mc b/src/bin/pgevent/pgmsgevent.mc
new file mode 100644
index 0000000..5d16e3e
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.mc
@@ -0,0 +1,5 @@
+MessageId=0
+SymbolicName=PGWIN32_EVENTLOG_MSG
+Language=English
+%1
+.
diff --git a/src/bin/pgevent/pgmsgevent.rc b/src/bin/pgevent/pgmsgevent.rc
new file mode 100644
index 0000000..0885a89
--- /dev/null
+++ b/src/bin/pgevent/pgmsgevent.rc
@@ -0,0 +1,2 @@
+LANGUAGE 0x9,0x1
+1 11 MSG00001.bin
diff --git a/src/bin/psql/.gitignore b/src/bin/psql/.gitignore
new file mode 100644
index 0000000..10b6dd3
--- /dev/null
+++ b/src/bin/psql/.gitignore
@@ -0,0 +1,5 @@
+/psqlscanslash.c
+/sql_help.h
+/sql_help.c
+/psql
+/tmp_check/
diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
new file mode 100644
index 0000000..1f2bf0c
--- /dev/null
+++ b/src/bin/psql/Makefile
@@ -0,0 +1,90 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/psql
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/psql/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "psql - the PostgreSQL interactive terminal"
+PGAPPICON=win32
+
+subdir = src/bin/psql
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# make this available to TAP test scripts
+export with_readline
+
+REFDOCDIR= $(top_srcdir)/doc/src/sgml/ref
+
+override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ command.o \
+ common.o \
+ copy.o \
+ crosstabview.o \
+ describe.o \
+ help.o \
+ input.o \
+ large_obj.o \
+ mainloop.o \
+ prompt.o \
+ psqlscanslash.o \
+ sql_help.o \
+ startup.o \
+ stringutils.o \
+ tab-complete.o \
+ variables.o
+
+
+all: psql
+
+psql: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+help.o: sql_help.h
+
+# See notes in src/backend/parser/Makefile about the following two rules
+sql_help.c: sql_help.h
+ touch $@
+
+sql_help.h: create_help.pl $(wildcard $(REFDOCDIR)/*.sgml)
+ $(PERL) $< --docdir $(REFDOCDIR) --basename $*
+
+psqlscanslash.c: FLEXFLAGS = -Cfe -p -p
+psqlscanslash.c: FLEX_NO_BACKUP=yes
+psqlscanslash.c: FLEX_FIX_WARNING=yes
+
+distprep: sql_help.h sql_help.c psqlscanslash.c
+
+install: all installdirs
+ $(INSTALL_PROGRAM) psql$(X) '$(DESTDIR)$(bindir)/psql$(X)'
+ $(INSTALL_DATA) $(srcdir)/psqlrc.sample '$(DESTDIR)$(datadir)/psqlrc.sample'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)' '$(DESTDIR)$(datadir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/psql$(X)' '$(DESTDIR)$(datadir)/psqlrc.sample'
+
+clean distclean:
+ rm -f psql$(X) $(OBJS) lex.backup
+ rm -rf tmp_check
+
+# files removed here are supposed to be in the distribution tarball,
+# so do not clean them in the clean/distclean rules
+maintainer-clean: distclean
+ rm -f sql_help.h sql_help.c psqlscanslash.c
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
new file mode 100644
index 0000000..6733f00
--- /dev/null
+++ b/src/bin/psql/command.c
@@ -0,0 +1,5798 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/command.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <time.h>
+#include <pwd.h>
+#include <utime.h>
+#ifndef WIN32
+#include <sys/stat.h> /* for stat() */
+#include <sys/time.h> /* for setitimer() */
+#include <fcntl.h> /* open() flags */
+#include <unistd.h> /* for geteuid(), getpid(), stat() */
+#else
+#include <win32.h>
+#include <io.h>
+#include <fcntl.h>
+#include <direct.h>
+#include <sys/stat.h> /* for stat() */
+#endif
+
+#include "catalog/pg_class_d.h"
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "copy.h"
+#include "crosstabview.h"
+#include "describe.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/print.h"
+#include "fe_utils/string_utils.h"
+#include "help.h"
+#include "input.h"
+#include "large_obj.h"
+#include "libpq-fe.h"
+#include "libpq/pqcomm.h"
+#include "mainloop.h"
+#include "portability/instr_time.h"
+#include "pqexpbuffer.h"
+#include "psqlscanslash.h"
+#include "settings.h"
+#include "variables.h"
+
+/*
+ * Editable database object types.
+ */
+typedef enum EditableObjectType
+{
+ EditableFunction,
+ EditableView
+} EditableObjectType;
+
+/* local function declarations */
+static backslashResult exec_command(const char *cmd,
+ PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf);
+static backslashResult exec_command_a(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_bind(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_C(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_connect(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_cd(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_conninfo(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_copy(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_copyright(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_crosstabview(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_d(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static bool exec_command_dfo(PsqlScanState scan_state, const char *cmd,
+ const char *pattern,
+ bool show_verbose, bool show_system);
+static backslashResult exec_command_edit(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_ef_ev(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, bool is_func);
+static backslashResult exec_command_echo(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_elif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_else(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_endif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_encoding(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_errverbose(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_f(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_g(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult process_command_g_options(char *first_option,
+ PsqlScanState scan_state,
+ bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_gdesc(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_getenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_gexec(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_gset(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_help(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_html(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_include(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_if(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_list(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_lo(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_out(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_print(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_password(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_prompt(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_pset(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_quit(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_reset(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf);
+static backslashResult exec_command_s(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_set(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_setenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_sf_sv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd, bool is_func);
+static backslashResult exec_command_t(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_T(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_timing(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_unset(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_write(PsqlScanState scan_state, bool active_branch,
+ const char *cmd,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_watch(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static backslashResult exec_command_x(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_z(PsqlScanState scan_state, bool active_branch,
+ const char *cmd);
+static backslashResult exec_command_shell_escape(PsqlScanState scan_state, bool active_branch);
+static backslashResult exec_command_slash_command_help(PsqlScanState scan_state, bool active_branch);
+static char *read_connect_arg(PsqlScanState scan_state);
+static PQExpBuffer gather_boolean_expression(PsqlScanState scan_state);
+static bool is_true_boolean_expression(PsqlScanState scan_state, const char *name);
+static void ignore_boolean_expression(PsqlScanState scan_state);
+static void ignore_slash_options(PsqlScanState scan_state);
+static void ignore_slash_filepipe(PsqlScanState scan_state);
+static void ignore_slash_whole_line(PsqlScanState scan_state);
+static bool is_branching_command(const char *cmd);
+static void save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static void discard_query_text(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf);
+static bool copy_previous_query(PQExpBuffer query_buf, PQExpBuffer previous_buf);
+static bool do_connect(enum trivalue reuse_previous_specification,
+ char *dbname, char *user, char *host, char *port);
+static bool do_edit(const char *filename_arg, PQExpBuffer query_buf,
+ int lineno, bool discard_on_quit, bool *edited);
+static bool do_shell(const char *command);
+static bool do_watch(PQExpBuffer query_buf, double sleep, int iter);
+static bool lookup_object_oid(EditableObjectType obj_type, const char *desc,
+ Oid *obj_oid);
+static bool get_create_object_cmd(EditableObjectType obj_type, Oid oid,
+ PQExpBuffer buf);
+static int strip_lineno_from_objdesc(char *obj);
+static int count_lines_in_buf(PQExpBuffer buf);
+static void print_with_linenumbers(FILE *output, char *lines, bool is_func);
+static void minimal_error_message(PGresult *res);
+
+static void printSSLInfo(void);
+static void printGSSInfo(void);
+static bool printPsetInfo(const char *param, printQueryOpt *popt);
+static char *pset_value_string(const char *param, printQueryOpt *popt);
+
+#ifdef WIN32
+static void checkWin32Codepage(void);
+#endif
+
+
+
+/*----------
+ * HandleSlashCmds:
+ *
+ * Handles all the different commands that start with '\'.
+ * Ordinarily called by MainLoop().
+ *
+ * scan_state is a lexer working state that is set to continue scanning
+ * just after the '\'. The lexer is advanced past the command and all
+ * arguments on return.
+ *
+ * cstack is the current \if stack state. This will be examined, and
+ * possibly modified by conditional commands.
+ *
+ * query_buf contains the query-so-far, which may be modified by
+ * execution of the backslash command (for example, \r clears it).
+ *
+ * previous_buf contains the query most recently sent to the server
+ * (empty if none yet). This should not be modified here, but some
+ * commands copy its content into query_buf.
+ *
+ * query_buf and previous_buf will be NULL when executing a "-c"
+ * command-line option.
+ *
+ * Returns a status code indicating what action is desired, see command.h.
+ *----------
+ */
+
+backslashResult
+HandleSlashCmds(PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf)
+{
+ backslashResult status;
+ char *cmd;
+ char *arg;
+
+ Assert(scan_state != NULL);
+ Assert(cstack != NULL);
+
+ /* Parse off the command name */
+ cmd = psql_scan_slash_command(scan_state);
+
+ /* And try to execute it */
+ status = exec_command(cmd, scan_state, cstack, query_buf, previous_buf);
+
+ if (status == PSQL_CMD_UNKNOWN)
+ {
+ pg_log_error("invalid command \\%s", cmd);
+ if (pset.cur_cmd_interactive)
+ pg_log_error_hint("Try \\? for help.");
+ status = PSQL_CMD_ERROR;
+ }
+
+ if (status != PSQL_CMD_ERROR)
+ {
+ /*
+ * Eat any remaining arguments after a valid command. We want to
+ * suppress evaluation of backticks in this situation, so transiently
+ * push an inactive conditional-stack entry.
+ */
+ bool active_branch = conditional_active(cstack);
+
+ conditional_stack_push(cstack, IFSTATE_IGNORED);
+ while ((arg = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)))
+ {
+ if (active_branch)
+ pg_log_warning("\\%s: extra argument \"%s\" ignored", cmd, arg);
+ free(arg);
+ }
+ conditional_stack_pop(cstack);
+ }
+ else
+ {
+ /* silently throw away rest of line after an erroneous command */
+ while ((arg = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false)))
+ free(arg);
+ }
+
+ /* if there is a trailing \\, swallow it */
+ psql_scan_slash_command_end(scan_state);
+
+ free(cmd);
+
+ /* some commands write to queryFout, so make sure output is sent */
+ fflush(pset.queryFout);
+
+ return status;
+}
+
+
+/*
+ * Subroutine to actually try to execute a backslash command.
+ *
+ * The typical "success" result code is PSQL_CMD_SKIP_LINE, although some
+ * commands return something else. Failure result code is PSQL_CMD_ERROR,
+ * unless PSQL_CMD_UNKNOWN is more appropriate.
+ */
+static backslashResult
+exec_command(const char *cmd,
+ PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf)
+{
+ backslashResult status;
+ bool active_branch = conditional_active(cstack);
+
+ /*
+ * In interactive mode, warn when we're ignoring a command within a false
+ * \if-branch. But we continue on, so as to parse and discard the right
+ * amount of parameter text. Each individual backslash command subroutine
+ * is responsible for doing nothing after discarding appropriate
+ * arguments, if !active_branch.
+ */
+ if (pset.cur_cmd_interactive && !active_branch &&
+ !is_branching_command(cmd))
+ {
+ pg_log_warning("\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block",
+ cmd);
+ }
+
+ if (strcmp(cmd, "a") == 0)
+ status = exec_command_a(scan_state, active_branch);
+ else if (strcmp(cmd, "bind") == 0)
+ status = exec_command_bind(scan_state, active_branch);
+ else if (strcmp(cmd, "C") == 0)
+ status = exec_command_C(scan_state, active_branch);
+ else if (strcmp(cmd, "c") == 0 || strcmp(cmd, "connect") == 0)
+ status = exec_command_connect(scan_state, active_branch);
+ else if (strcmp(cmd, "cd") == 0)
+ status = exec_command_cd(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "conninfo") == 0)
+ status = exec_command_conninfo(scan_state, active_branch);
+ else if (pg_strcasecmp(cmd, "copy") == 0)
+ status = exec_command_copy(scan_state, active_branch);
+ else if (strcmp(cmd, "copyright") == 0)
+ status = exec_command_copyright(scan_state, active_branch);
+ else if (strcmp(cmd, "crosstabview") == 0)
+ status = exec_command_crosstabview(scan_state, active_branch);
+ else if (cmd[0] == 'd')
+ status = exec_command_d(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "e") == 0 || strcmp(cmd, "edit") == 0)
+ status = exec_command_edit(scan_state, active_branch,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "ef") == 0)
+ status = exec_command_ef_ev(scan_state, active_branch, query_buf, true);
+ else if (strcmp(cmd, "ev") == 0)
+ status = exec_command_ef_ev(scan_state, active_branch, query_buf, false);
+ else if (strcmp(cmd, "echo") == 0 || strcmp(cmd, "qecho") == 0 ||
+ strcmp(cmd, "warn") == 0)
+ status = exec_command_echo(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "elif") == 0)
+ status = exec_command_elif(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "else") == 0)
+ status = exec_command_else(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "endif") == 0)
+ status = exec_command_endif(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "encoding") == 0)
+ status = exec_command_encoding(scan_state, active_branch);
+ else if (strcmp(cmd, "errverbose") == 0)
+ status = exec_command_errverbose(scan_state, active_branch);
+ else if (strcmp(cmd, "f") == 0)
+ status = exec_command_f(scan_state, active_branch);
+ else if (strcmp(cmd, "g") == 0 || strcmp(cmd, "gx") == 0)
+ status = exec_command_g(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "gdesc") == 0)
+ status = exec_command_gdesc(scan_state, active_branch);
+ else if (strcmp(cmd, "getenv") == 0)
+ status = exec_command_getenv(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "gexec") == 0)
+ status = exec_command_gexec(scan_state, active_branch);
+ else if (strcmp(cmd, "gset") == 0)
+ status = exec_command_gset(scan_state, active_branch);
+ else if (strcmp(cmd, "h") == 0 || strcmp(cmd, "help") == 0)
+ status = exec_command_help(scan_state, active_branch);
+ else if (strcmp(cmd, "H") == 0 || strcmp(cmd, "html") == 0)
+ status = exec_command_html(scan_state, active_branch);
+ else if (strcmp(cmd, "i") == 0 || strcmp(cmd, "include") == 0 ||
+ strcmp(cmd, "ir") == 0 || strcmp(cmd, "include_relative") == 0)
+ status = exec_command_include(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "if") == 0)
+ status = exec_command_if(scan_state, cstack, query_buf);
+ else if (strcmp(cmd, "l") == 0 || strcmp(cmd, "list") == 0 ||
+ strcmp(cmd, "l+") == 0 || strcmp(cmd, "list+") == 0)
+ status = exec_command_list(scan_state, active_branch, cmd);
+ else if (strncmp(cmd, "lo_", 3) == 0)
+ status = exec_command_lo(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "o") == 0 || strcmp(cmd, "out") == 0)
+ status = exec_command_out(scan_state, active_branch);
+ else if (strcmp(cmd, "p") == 0 || strcmp(cmd, "print") == 0)
+ status = exec_command_print(scan_state, active_branch,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "password") == 0)
+ status = exec_command_password(scan_state, active_branch);
+ else if (strcmp(cmd, "prompt") == 0)
+ status = exec_command_prompt(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "pset") == 0)
+ status = exec_command_pset(scan_state, active_branch);
+ else if (strcmp(cmd, "q") == 0 || strcmp(cmd, "quit") == 0)
+ status = exec_command_quit(scan_state, active_branch);
+ else if (strcmp(cmd, "r") == 0 || strcmp(cmd, "reset") == 0)
+ status = exec_command_reset(scan_state, active_branch, query_buf);
+ else if (strcmp(cmd, "s") == 0)
+ status = exec_command_s(scan_state, active_branch);
+ else if (strcmp(cmd, "set") == 0)
+ status = exec_command_set(scan_state, active_branch);
+ else if (strcmp(cmd, "setenv") == 0)
+ status = exec_command_setenv(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "sf") == 0 || strcmp(cmd, "sf+") == 0)
+ status = exec_command_sf_sv(scan_state, active_branch, cmd, true);
+ else if (strcmp(cmd, "sv") == 0 || strcmp(cmd, "sv+") == 0)
+ status = exec_command_sf_sv(scan_state, active_branch, cmd, false);
+ else if (strcmp(cmd, "t") == 0)
+ status = exec_command_t(scan_state, active_branch);
+ else if (strcmp(cmd, "T") == 0)
+ status = exec_command_T(scan_state, active_branch);
+ else if (strcmp(cmd, "timing") == 0)
+ status = exec_command_timing(scan_state, active_branch);
+ else if (strcmp(cmd, "unset") == 0)
+ status = exec_command_unset(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "w") == 0 || strcmp(cmd, "write") == 0)
+ status = exec_command_write(scan_state, active_branch, cmd,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "watch") == 0)
+ status = exec_command_watch(scan_state, active_branch,
+ query_buf, previous_buf);
+ else if (strcmp(cmd, "x") == 0)
+ status = exec_command_x(scan_state, active_branch);
+ else if (strcmp(cmd, "z") == 0 || strcmp(cmd, "zS") == 0)
+ status = exec_command_z(scan_state, active_branch, cmd);
+ else if (strcmp(cmd, "!") == 0)
+ status = exec_command_shell_escape(scan_state, active_branch);
+ else if (strcmp(cmd, "?") == 0)
+ status = exec_command_slash_command_help(scan_state, active_branch);
+ else
+ status = PSQL_CMD_UNKNOWN;
+
+ /*
+ * All the commands that return PSQL_CMD_SEND want to execute previous_buf
+ * if query_buf is empty. For convenience we implement that here, not in
+ * the individual command subroutines.
+ */
+ if (status == PSQL_CMD_SEND)
+ (void) copy_previous_query(query_buf, previous_buf);
+
+ return status;
+}
+
+
+/*
+ * \a -- toggle field alignment
+ *
+ * This makes little sense but we keep it around.
+ */
+static backslashResult
+exec_command_a(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ if (pset.popt.topt.format != PRINT_ALIGNED)
+ success = do_pset("format", "aligned", &pset.popt, pset.quiet);
+ else
+ success = do_pset("format", "unaligned", &pset.popt, pset.quiet);
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \bind -- set query parameters
+ */
+static backslashResult
+exec_command_bind(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *opt;
+ int nparams = 0;
+ int nalloc = 0;
+
+ pset.bind_params = NULL;
+
+ while ((opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false)))
+ {
+ nparams++;
+ if (nparams > nalloc)
+ {
+ nalloc = nalloc ? nalloc * 2 : 1;
+ pset.bind_params = pg_realloc_array(pset.bind_params, char *, nalloc);
+ }
+ pset.bind_params[nparams - 1] = opt;
+ }
+
+ pset.bind_nparams = nparams;
+ pset.bind_flag = true;
+ }
+
+ return status;
+}
+
+/*
+ * \C -- override table title (formerly change HTML caption)
+ */
+static backslashResult
+exec_command_C(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = do_pset("title", opt, &pset.popt, pset.quiet);
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \c or \connect -- connect to database using the specified parameters.
+ *
+ * \c [-reuse-previous=BOOL] dbname user host port
+ *
+ * Specifying a parameter as '-' is equivalent to omitting it. Examples:
+ *
+ * \c - - hst Connect to current database on current port of
+ * host "hst" as current user.
+ * \c - usr - prt Connect to current database on port "prt" of current host
+ * as user "usr".
+ * \c dbs Connect to database "dbs" on current port of current host
+ * as current user.
+ */
+static backslashResult
+exec_command_connect(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ static const char prefix[] = "-reuse-previous=";
+ char *opt1,
+ *opt2,
+ *opt3,
+ *opt4;
+ enum trivalue reuse_previous = TRI_DEFAULT;
+
+ opt1 = read_connect_arg(scan_state);
+ if (opt1 != NULL && strncmp(opt1, prefix, sizeof(prefix) - 1) == 0)
+ {
+ bool on_off;
+
+ success = ParseVariableBool(opt1 + sizeof(prefix) - 1,
+ "-reuse-previous",
+ &on_off);
+ if (success)
+ {
+ reuse_previous = on_off ? TRI_YES : TRI_NO;
+ free(opt1);
+ opt1 = read_connect_arg(scan_state);
+ }
+ }
+
+ if (success) /* give up if reuse_previous was invalid */
+ {
+ opt2 = read_connect_arg(scan_state);
+ opt3 = read_connect_arg(scan_state);
+ opt4 = read_connect_arg(scan_state);
+
+ success = do_connect(reuse_previous, opt1, opt2, opt3, opt4);
+
+ free(opt2);
+ free(opt3);
+ free(opt4);
+ }
+ free(opt1);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \cd -- change directory
+ */
+static backslashResult
+exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ char *dir;
+
+ if (opt)
+ dir = opt;
+ else
+ {
+#ifndef WIN32
+ /* This should match get_home_path() */
+ dir = getenv("HOME");
+ if (dir == NULL || dir[0] == '\0')
+ {
+ uid_t user_id = geteuid();
+ struct passwd *pw;
+
+ errno = 0; /* clear errno before call */
+ pw = getpwuid(user_id);
+ if (pw)
+ dir = pw->pw_dir;
+ else
+ {
+ pg_log_error("could not get home directory for user ID %ld: %s",
+ (long) user_id,
+ errno ? strerror(errno) : _("user does not exist"));
+ success = false;
+ }
+ }
+#else /* WIN32 */
+
+ /*
+ * On Windows, 'cd' without arguments prints the current
+ * directory, so if someone wants to code this here instead...
+ */
+ dir = "/";
+#endif /* WIN32 */
+ }
+
+ if (success &&
+ chdir(dir) < 0)
+ {
+ pg_log_error("\\%s: could not change directory to \"%s\": %m",
+ cmd, dir);
+ success = false;
+ }
+
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \conninfo -- display information about the current connection
+ */
+static backslashResult
+exec_command_conninfo(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *db = PQdb(pset.db);
+
+ if (db == NULL)
+ printf(_("You are currently not connected to a database.\n"));
+ else
+ {
+ char *host = PQhost(pset.db);
+ char *hostaddr = PQhostaddr(pset.db);
+
+ if (is_unixsock_path(host))
+ {
+ /* hostaddr overrides host */
+ if (hostaddr && *hostaddr)
+ printf(_("You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"),
+ db, PQuser(pset.db), hostaddr, PQport(pset.db));
+ else
+ printf(_("You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
+ db, PQuser(pset.db), host, PQport(pset.db));
+ }
+ else
+ {
+ if (hostaddr && *hostaddr && strcmp(host, hostaddr) != 0)
+ printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"),
+ db, PQuser(pset.db), host, hostaddr, PQport(pset.db));
+ else
+ printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
+ db, PQuser(pset.db), host, PQport(pset.db));
+ }
+ printSSLInfo();
+ printGSSInfo();
+ }
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \copy -- run a COPY command
+ */
+static backslashResult
+exec_command_copy(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+
+ success = do_copy(opt);
+ free(opt);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \copyright -- print copyright notice
+ */
+static backslashResult
+exec_command_copyright(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ print_copyright();
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \crosstabview -- execute a query and display result in crosstab
+ */
+static backslashResult
+exec_command_crosstabview(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ int i;
+
+ for (i = 0; i < lengthof(pset.ctv_args); i++)
+ pset.ctv_args[i] = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ pset.crosstab_flag = true;
+ status = PSQL_CMD_SEND;
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return status;
+}
+
+/*
+ * \d* commands
+ */
+static backslashResult
+exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *pattern;
+ bool show_verbose,
+ show_system;
+
+ /* We don't do SQLID reduction on the pattern yet */
+ pattern = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ show_verbose = strchr(cmd, '+') ? true : false;
+ show_system = strchr(cmd, 'S') ? true : false;
+
+ switch (cmd[1])
+ {
+ case '\0':
+ case '+':
+ case 'S':
+ if (pattern)
+ success = describeTableDetails(pattern, show_verbose, show_system);
+ else
+ /* standard listing of interesting things */
+ success = listTables("tvmsE", NULL, show_verbose, show_system);
+ break;
+ case 'A':
+ {
+ char *pattern2 = NULL;
+
+ if (pattern && cmd[2] != '\0' && cmd[2] != '+')
+ pattern2 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true);
+
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ success = describeAccessMethods(pattern, show_verbose);
+ break;
+ case 'c':
+ success = listOperatorClasses(pattern, pattern2, show_verbose);
+ break;
+ case 'f':
+ success = listOperatorFamilies(pattern, pattern2, show_verbose);
+ break;
+ case 'o':
+ success = listOpFamilyOperators(pattern, pattern2, show_verbose);
+ break;
+ case 'p':
+ success = listOpFamilyFunctions(pattern, pattern2, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+
+ free(pattern2);
+ }
+ break;
+ case 'a':
+ success = describeAggregates(pattern, show_verbose, show_system);
+ break;
+ case 'b':
+ success = describeTablespaces(pattern, show_verbose);
+ break;
+ case 'c':
+ if (strncmp(cmd, "dconfig", 7) == 0)
+ success = describeConfigurationParameters(pattern,
+ show_verbose,
+ show_system);
+ else
+ success = listConversions(pattern,
+ show_verbose,
+ show_system);
+ break;
+ case 'C':
+ success = listCasts(pattern, show_verbose);
+ break;
+ case 'd':
+ if (strncmp(cmd, "ddp", 3) == 0)
+ success = listDefaultACLs(pattern);
+ else
+ success = objectDescription(pattern, show_system);
+ break;
+ case 'D':
+ success = listDomains(pattern, show_verbose, show_system);
+ break;
+ case 'f': /* function subsystem */
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ case 'S':
+ case 'a':
+ case 'n':
+ case 'p':
+ case 't':
+ case 'w':
+ success = exec_command_dfo(scan_state, cmd, pattern,
+ show_verbose, show_system);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ break;
+ case 'g':
+ /* no longer distinct from \du */
+ success = describeRoles(pattern, show_verbose, show_system);
+ break;
+ case 'l':
+ success = listLargeObjects(show_verbose);
+ break;
+ case 'L':
+ success = listLanguages(pattern, show_verbose, show_system);
+ break;
+ case 'n':
+ success = listSchemas(pattern, show_verbose, show_system);
+ break;
+ case 'o':
+ success = exec_command_dfo(scan_state, cmd, pattern,
+ show_verbose, show_system);
+ break;
+ case 'O':
+ success = listCollations(pattern, show_verbose, show_system);
+ break;
+ case 'p':
+ success = permissionsList(pattern, show_system);
+ break;
+ case 'P':
+ {
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ case 't':
+ case 'i':
+ case 'n':
+ success = listPartitionedTables(&cmd[2], pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ }
+ break;
+ case 'T':
+ success = describeTypes(pattern, show_verbose, show_system);
+ break;
+ case 't':
+ case 'v':
+ case 'm':
+ case 'i':
+ case 's':
+ case 'E':
+ success = listTables(&cmd[1], pattern, show_verbose, show_system);
+ break;
+ case 'r':
+ if (cmd[2] == 'd' && cmd[3] == 's')
+ {
+ char *pattern2 = NULL;
+
+ if (pattern)
+ pattern2 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ success = listDbRoleSettings(pattern, pattern2);
+
+ free(pattern2);
+ }
+ else if (cmd[2] == 'g')
+ success = describeRoleGrants(pattern, show_system);
+ else
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ case 'R':
+ switch (cmd[2])
+ {
+ case 'p':
+ if (show_verbose)
+ success = describePublications(pattern);
+ else
+ success = listPublications(pattern);
+ break;
+ case 's':
+ success = describeSubscriptions(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ }
+ break;
+ case 'u':
+ success = describeRoles(pattern, show_verbose, show_system);
+ break;
+ case 'F': /* text search subsystem */
+ switch (cmd[2])
+ {
+ case '\0':
+ case '+':
+ success = listTSConfigs(pattern, show_verbose);
+ break;
+ case 'p':
+ success = listTSParsers(pattern, show_verbose);
+ break;
+ case 'd':
+ success = listTSDictionaries(pattern, show_verbose);
+ break;
+ case 't':
+ success = listTSTemplates(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ break;
+ case 'e': /* SQL/MED subsystem */
+ switch (cmd[2])
+ {
+ case 's':
+ success = listForeignServers(pattern, show_verbose);
+ break;
+ case 'u':
+ success = listUserMappings(pattern, show_verbose);
+ break;
+ case 'w':
+ success = listForeignDataWrappers(pattern, show_verbose);
+ break;
+ case 't':
+ success = listForeignTables(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ break;
+ }
+ break;
+ case 'x': /* Extensions */
+ if (show_verbose)
+ success = listExtensionContents(pattern);
+ else
+ success = listExtensions(pattern);
+ break;
+ case 'X': /* Extended Statistics */
+ success = listExtendedStats(pattern);
+ break;
+ case 'y': /* Event Triggers */
+ success = listEventTriggers(pattern, show_verbose);
+ break;
+ default:
+ status = PSQL_CMD_UNKNOWN;
+ }
+
+ free(pattern);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ if (!success)
+ status = PSQL_CMD_ERROR;
+
+ return status;
+}
+
+/* \df and \do; messy enough to split out of exec_command_d */
+static bool
+exec_command_dfo(PsqlScanState scan_state, const char *cmd,
+ const char *pattern,
+ bool show_verbose, bool show_system)
+{
+ bool success;
+ char *arg_patterns[FUNC_MAX_ARGS];
+ int num_arg_patterns = 0;
+
+ /* Collect argument-type patterns too */
+ if (pattern) /* otherwise it was just \df or \do */
+ {
+ char *ap;
+
+ while ((ap = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true)) != NULL)
+ {
+ arg_patterns[num_arg_patterns++] = ap;
+ if (num_arg_patterns >= FUNC_MAX_ARGS)
+ break; /* protect limited-size array */
+ }
+ }
+
+ if (cmd[1] == 'f')
+ success = describeFunctions(&cmd[2], pattern,
+ arg_patterns, num_arg_patterns,
+ show_verbose, show_system);
+ else
+ success = describeOperators(pattern,
+ arg_patterns, num_arg_patterns,
+ show_verbose, show_system);
+
+ while (--num_arg_patterns >= 0)
+ free(arg_patterns[num_arg_patterns]);
+
+ return success;
+}
+
+/*
+ * \e or \edit -- edit the current query buffer, or edit a file and
+ * make it the query buffer
+ */
+static backslashResult
+exec_command_edit(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ if (!query_buf)
+ {
+ pg_log_error("no query buffer");
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ char *fname;
+ char *ln = NULL;
+ int lineno = -1;
+
+ fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ if (fname)
+ {
+ /* try to get separate lineno arg */
+ ln = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ if (ln == NULL)
+ {
+ /* only one arg; maybe it is lineno not fname */
+ if (fname[0] &&
+ strspn(fname, "0123456789") == strlen(fname))
+ {
+ /* all digits, so assume it is lineno */
+ ln = fname;
+ fname = NULL;
+ }
+ }
+ }
+ if (ln)
+ {
+ lineno = atoi(ln);
+ if (lineno < 1)
+ {
+ pg_log_error("invalid line number: %s", ln);
+ status = PSQL_CMD_ERROR;
+ }
+ }
+ if (status != PSQL_CMD_ERROR)
+ {
+ bool discard_on_quit;
+
+ expand_tilde(&fname);
+ if (fname)
+ {
+ canonicalize_path(fname);
+ /* Always clear buffer if the file isn't modified */
+ discard_on_quit = true;
+ }
+ else
+ {
+ /*
+ * If query_buf is empty, recall previous query for
+ * editing. But in that case, the query buffer should be
+ * emptied if editing doesn't modify the file.
+ */
+ discard_on_quit = copy_previous_query(query_buf,
+ previous_buf);
+ }
+
+ if (do_edit(fname, query_buf, lineno, discard_on_quit, NULL))
+ status = PSQL_CMD_NEWEDIT;
+ else
+ status = PSQL_CMD_ERROR;
+ }
+ free(fname);
+ free(ln);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return status;
+}
+
+/*
+ * \ef/\ev -- edit the named function/view, or
+ * present a blank CREATE FUNCTION/VIEW template if no argument is given
+ */
+static backslashResult
+exec_command_ef_ev(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, bool is_func)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *obj_desc = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE,
+ NULL, true);
+ int lineno = -1;
+
+ if (!query_buf)
+ {
+ pg_log_error("no query buffer");
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ Oid obj_oid = InvalidOid;
+ EditableObjectType eot = is_func ? EditableFunction : EditableView;
+
+ lineno = strip_lineno_from_objdesc(obj_desc);
+ if (lineno == 0)
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!obj_desc)
+ {
+ /* set up an empty command to fill in */
+ resetPQExpBuffer(query_buf);
+ if (is_func)
+ appendPQExpBufferStr(query_buf,
+ "CREATE FUNCTION ( )\n"
+ " RETURNS \n"
+ " LANGUAGE \n"
+ " -- common options: IMMUTABLE STABLE STRICT SECURITY DEFINER\n"
+ "AS $function$\n"
+ "\n$function$\n");
+ else
+ appendPQExpBufferStr(query_buf,
+ "CREATE VIEW AS\n"
+ " SELECT \n"
+ " -- something...\n");
+ }
+ else if (!lookup_object_oid(eot, obj_desc, &obj_oid))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!get_create_object_cmd(eot, obj_oid, query_buf))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (is_func && lineno > 0)
+ {
+ /*
+ * lineno "1" should correspond to the first line of the
+ * function body. We expect that pg_get_functiondef() will
+ * emit that on a line beginning with "AS ", "BEGIN ", or
+ * "RETURN ", and that there can be no such line before the
+ * real start of the function body. Increment lineno by the
+ * number of lines before that line, so that it becomes
+ * relative to the first line of the function definition.
+ */
+ const char *lines = query_buf->data;
+
+ while (*lines != '\0')
+ {
+ if (strncmp(lines, "AS ", 3) == 0 ||
+ strncmp(lines, "BEGIN ", 6) == 0 ||
+ strncmp(lines, "RETURN ", 7) == 0)
+ break;
+ lineno++;
+ /* find start of next line */
+ lines = strchr(lines, '\n');
+ if (!lines)
+ break;
+ lines++;
+ }
+ }
+ }
+
+ if (status != PSQL_CMD_ERROR)
+ {
+ bool edited = false;
+
+ if (!do_edit(NULL, query_buf, lineno, true, &edited))
+ status = PSQL_CMD_ERROR;
+ else if (!edited)
+ puts(_("No changes"));
+ else
+ status = PSQL_CMD_NEWEDIT;
+ }
+
+ free(obj_desc);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return status;
+}
+
+/*
+ * \echo, \qecho, and \warn -- echo arguments to stdout, query output, or stderr
+ */
+static backslashResult
+exec_command_echo(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ if (active_branch)
+ {
+ char *value;
+ char quoted;
+ bool no_newline = false;
+ bool first = true;
+ FILE *fout;
+
+ if (strcmp(cmd, "qecho") == 0)
+ fout = pset.queryFout;
+ else if (strcmp(cmd, "warn") == 0)
+ fout = stderr;
+ else
+ fout = stdout;
+
+ while ((value = psql_scan_slash_option(scan_state,
+ OT_NORMAL, &quoted, false)))
+ {
+ if (first && !no_newline && !quoted && strcmp(value, "-n") == 0)
+ no_newline = true;
+ else
+ {
+ if (first)
+ first = false;
+ else
+ fputc(' ', fout);
+ fputs(value, fout);
+ }
+ free(value);
+ }
+ if (!no_newline)
+ fputs("\n", fout);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \encoding -- set/show client side encoding
+ */
+static backslashResult
+exec_command_encoding(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *encoding = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!encoding)
+ {
+ /* show encoding */
+ puts(pg_encoding_to_char(pset.encoding));
+ }
+ else
+ {
+ /* set encoding */
+ if (PQsetClientEncoding(pset.db, encoding) == -1)
+ pg_log_error("%s: invalid encoding name or conversion procedure not found", encoding);
+ else
+ {
+ /* save encoding info into psql internal data */
+ pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = pset.encoding;
+ SetVariable(pset.vars, "ENCODING",
+ pg_encoding_to_char(pset.encoding));
+ }
+ free(encoding);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \errverbose -- display verbose message from last failed query
+ */
+static backslashResult
+exec_command_errverbose(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ if (pset.last_error_result)
+ {
+ char *msg;
+
+ msg = PQresultVerboseErrorMessage(pset.last_error_result,
+ PQERRORS_VERBOSE,
+ PQSHOW_CONTEXT_ALWAYS);
+ if (msg)
+ {
+ pg_log_error("%s", msg);
+ PQfreemem(msg);
+ }
+ else
+ puts(_("out of memory"));
+ }
+ else
+ puts(_("There is no previous error."));
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \f -- change field separator
+ */
+static backslashResult
+exec_command_f(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ success = do_pset("fieldsep", fname, &pset.popt, pset.quiet);
+ free(fname);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \g [(pset-option[=pset-value] ...)] [filename/shell-command]
+ * \gx [(pset-option[=pset-value] ...)] [filename/shell-command]
+ *
+ * Send the current query. If pset options are specified, they are made
+ * active just for this query. If a filename or pipe command is given,
+ * the query output goes there. \gx implicitly sets "expanded=on" along
+ * with any other pset options that are specified.
+ */
+static backslashResult
+exec_command_g(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+ char *fname;
+
+ /*
+ * Because the option processing for this is fairly complicated, we do it
+ * and then decide whether the branch is active.
+ */
+ fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, false);
+
+ if (fname && fname[0] == '(')
+ {
+ /* Consume pset options through trailing ')' ... */
+ status = process_command_g_options(fname + 1, scan_state,
+ active_branch, cmd);
+ free(fname);
+ /* ... and again attempt to scan the filename. */
+ fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, false);
+ }
+
+ if (status == PSQL_CMD_SKIP_LINE && active_branch)
+ {
+ if (!fname)
+ pset.gfname = NULL;
+ else
+ {
+ expand_tilde(&fname);
+ pset.gfname = pg_strdup(fname);
+ }
+ if (strcmp(cmd, "gx") == 0)
+ {
+ /* save settings if not done already, then force expanded=on */
+ if (pset.gsavepopt == NULL)
+ pset.gsavepopt = savePsetInfo(&pset.popt);
+ pset.popt.topt.expanded = 1;
+ }
+ status = PSQL_CMD_SEND;
+ }
+
+ free(fname);
+
+ return status;
+}
+
+/*
+ * Process parenthesized pset options for \g
+ *
+ * Note: okay to modify first_option, but not to free it; caller does that
+ */
+static backslashResult
+process_command_g_options(char *first_option, PsqlScanState scan_state,
+ bool active_branch, const char *cmd)
+{
+ bool success = true;
+ bool found_r_paren = false;
+
+ do
+ {
+ char *option;
+ size_t optlen;
+
+ /* If not first time through, collect a new option */
+ if (first_option)
+ option = first_option;
+ else
+ {
+ option = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ if (!option)
+ {
+ if (active_branch)
+ {
+ pg_log_error("\\%s: missing right parenthesis", cmd);
+ success = false;
+ }
+ break;
+ }
+ }
+
+ /* Check for terminating right paren, and remove it from string */
+ optlen = strlen(option);
+ if (optlen > 0 && option[optlen - 1] == ')')
+ {
+ option[--optlen] = '\0';
+ found_r_paren = true;
+ }
+
+ /* If there was anything besides parentheses, parse/execute it */
+ if (optlen > 0)
+ {
+ /* We can have either "name" or "name=value" */
+ char *valptr = strchr(option, '=');
+
+ if (valptr)
+ *valptr++ = '\0';
+ if (active_branch)
+ {
+ /* save settings if not done already, then apply option */
+ if (pset.gsavepopt == NULL)
+ pset.gsavepopt = savePsetInfo(&pset.popt);
+ success &= do_pset(option, valptr, &pset.popt, true);
+ }
+ }
+
+ /* Clean up after this option. We should not free first_option. */
+ if (first_option)
+ first_option = NULL;
+ else
+ free(option);
+ } while (!found_r_paren);
+
+ /* If we failed after already changing some options, undo side-effects */
+ if (!success && active_branch && pset.gsavepopt)
+ {
+ restorePsetInfo(&pset.popt, pset.gsavepopt);
+ pset.gsavepopt = NULL;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \gdesc -- describe query result
+ */
+static backslashResult
+exec_command_gdesc(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ pset.gdesc_flag = true;
+ status = PSQL_CMD_SEND;
+ }
+
+ return status;
+}
+
+/*
+ * \getenv -- set variable from environment variable
+ */
+static backslashResult
+exec_command_getenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *myvar = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ char *envvar = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!myvar || !envvar)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ char *envval = getenv(envvar);
+
+ if (envval && !SetVariable(pset.vars, myvar, envval))
+ success = false;
+ }
+ free(myvar);
+ free(envvar);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \gexec -- send query and execute each field of result
+ */
+static backslashResult
+exec_command_gexec(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ pset.gexec_flag = true;
+ status = PSQL_CMD_SEND;
+ }
+
+ return status;
+}
+
+/*
+ * \gset [prefix] -- send query and store result into variables
+ */
+static backslashResult
+exec_command_gset(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *prefix = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (prefix)
+ pset.gset_prefix = prefix;
+ else
+ {
+ /* we must set a non-NULL prefix to trigger storing */
+ pset.gset_prefix = pg_strdup("");
+ }
+ /* gset_prefix is freed later */
+ status = PSQL_CMD_SEND;
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return status;
+}
+
+/*
+ * \help [topic] -- print help about SQL commands
+ */
+static backslashResult
+exec_command_help(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+ size_t len;
+
+ /* strip any trailing spaces and semicolons */
+ if (opt)
+ {
+ len = strlen(opt);
+ while (len > 0 &&
+ (isspace((unsigned char) opt[len - 1])
+ || opt[len - 1] == ';'))
+ opt[--len] = '\0';
+ }
+
+ helpSQL(opt, pset.popt.topt.pager);
+ free(opt);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \H and \html -- toggle HTML formatting
+ */
+static backslashResult
+exec_command_html(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ if (pset.popt.topt.format != PRINT_HTML)
+ success = do_pset("format", "html", &pset.popt, pset.quiet);
+ else
+ success = do_pset("format", "aligned", &pset.popt, pset.quiet);
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \i and \ir -- include a file
+ */
+static backslashResult
+exec_command_include(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ if (!fname)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ bool include_relative;
+
+ include_relative = (strcmp(cmd, "ir") == 0
+ || strcmp(cmd, "include_relative") == 0);
+ expand_tilde(&fname);
+ success = (process_file(fname, include_relative) == EXIT_SUCCESS);
+ free(fname);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \if <expr> -- beginning of an \if..\endif block
+ *
+ * <expr> is parsed as a boolean expression. Invalid expressions will emit a
+ * warning and be treated as false. Statements that follow a false expression
+ * will be parsed but ignored. Note that in the case where an \if statement
+ * is itself within an inactive section of a block, then the entire inner
+ * \if..\endif block will be parsed but ignored.
+ */
+static backslashResult
+exec_command_if(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ if (conditional_active(cstack))
+ {
+ /*
+ * First, push a new active stack entry; this ensures that the lexer
+ * will perform variable substitution and backtick evaluation while
+ * scanning the expression. (That should happen anyway, since we know
+ * we're in an active outer branch, but let's be sure.)
+ */
+ conditional_stack_push(cstack, IFSTATE_TRUE);
+
+ /* Remember current query state in case we need to restore later */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ /*
+ * Evaluate the expression; if it's false, change to inactive state.
+ */
+ if (!is_true_boolean_expression(scan_state, "\\if expression"))
+ conditional_stack_poke(cstack, IFSTATE_FALSE);
+ }
+ else
+ {
+ /*
+ * We're within an inactive outer branch, so this entire \if block
+ * will be ignored. We don't want to evaluate the expression, so push
+ * the "ignored" stack state before scanning it.
+ */
+ conditional_stack_push(cstack, IFSTATE_IGNORED);
+
+ /* Remember current query state in case we need to restore later */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ ignore_boolean_expression(scan_state);
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \elif <expr> -- alternative branch in an \if..\endif block
+ *
+ * <expr> is evaluated the same as in \if <expr>.
+ */
+static backslashResult
+exec_command_elif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ bool success = true;
+
+ switch (conditional_stack_peek(cstack))
+ {
+ case IFSTATE_TRUE:
+
+ /*
+ * Just finished active branch of this \if block. Update saved
+ * state so we will keep whatever data was put in query_buf by the
+ * active branch.
+ */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ /*
+ * Discard \elif expression and ignore the rest until \endif.
+ * Switch state before reading expression to ensure proper lexer
+ * behavior.
+ */
+ conditional_stack_poke(cstack, IFSTATE_IGNORED);
+ ignore_boolean_expression(scan_state);
+ break;
+ case IFSTATE_FALSE:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * Have not yet found a true expression in this \if block, so this
+ * might be the first. We have to change state before examining
+ * the expression, or the lexer won't do the right thing.
+ */
+ conditional_stack_poke(cstack, IFSTATE_TRUE);
+ if (!is_true_boolean_expression(scan_state, "\\elif expression"))
+ conditional_stack_poke(cstack, IFSTATE_FALSE);
+ break;
+ case IFSTATE_IGNORED:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * Skip expression and move on. Either the \if block already had
+ * an active section, or whole block is being skipped.
+ */
+ ignore_boolean_expression(scan_state);
+ break;
+ case IFSTATE_ELSE_TRUE:
+ case IFSTATE_ELSE_FALSE:
+ pg_log_error("\\elif: cannot occur after \\else");
+ success = false;
+ break;
+ case IFSTATE_NONE:
+ /* no \if to elif from */
+ pg_log_error("\\elif: no matching \\if");
+ success = false;
+ break;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \else -- final alternative in an \if..\endif block
+ *
+ * Statements within an \else branch will only be executed if
+ * all previous \if and \elif expressions evaluated to false
+ * and the block was not itself being ignored.
+ */
+static backslashResult
+exec_command_else(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ bool success = true;
+
+ switch (conditional_stack_peek(cstack))
+ {
+ case IFSTATE_TRUE:
+
+ /*
+ * Just finished active branch of this \if block. Update saved
+ * state so we will keep whatever data was put in query_buf by the
+ * active branch.
+ */
+ save_query_text_state(scan_state, cstack, query_buf);
+
+ /* Now skip the \else branch */
+ conditional_stack_poke(cstack, IFSTATE_ELSE_FALSE);
+ break;
+ case IFSTATE_FALSE:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * We've not found any true \if or \elif expression, so execute
+ * the \else branch.
+ */
+ conditional_stack_poke(cstack, IFSTATE_ELSE_TRUE);
+ break;
+ case IFSTATE_IGNORED:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /*
+ * Either we previously processed the active branch of this \if,
+ * or the whole \if block is being skipped. Either way, skip the
+ * \else branch.
+ */
+ conditional_stack_poke(cstack, IFSTATE_ELSE_FALSE);
+ break;
+ case IFSTATE_ELSE_TRUE:
+ case IFSTATE_ELSE_FALSE:
+ pg_log_error("\\else: cannot occur after \\else");
+ success = false;
+ break;
+ case IFSTATE_NONE:
+ /* no \if to else from */
+ pg_log_error("\\else: no matching \\if");
+ success = false;
+ break;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \endif -- ends an \if...\endif block
+ */
+static backslashResult
+exec_command_endif(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ bool success = true;
+
+ switch (conditional_stack_peek(cstack))
+ {
+ case IFSTATE_TRUE:
+ case IFSTATE_ELSE_TRUE:
+ /* Close the \if block, keeping the query text */
+ success = conditional_stack_pop(cstack);
+ Assert(success);
+ break;
+ case IFSTATE_FALSE:
+ case IFSTATE_IGNORED:
+ case IFSTATE_ELSE_FALSE:
+
+ /*
+ * Discard any query text added by the just-skipped branch.
+ */
+ discard_query_text(scan_state, cstack, query_buf);
+
+ /* Close the \if block */
+ success = conditional_stack_pop(cstack);
+ Assert(success);
+ break;
+ case IFSTATE_NONE:
+ /* no \if to end */
+ pg_log_error("\\endif: no matching \\if");
+ success = false;
+ break;
+ }
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \l -- list databases
+ */
+static backslashResult
+exec_command_list(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *pattern;
+ bool show_verbose;
+
+ pattern = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ show_verbose = strchr(cmd, '+') ? true : false;
+
+ success = listAllDbs(pattern, show_verbose);
+
+ free(pattern);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \lo_* -- large object operations
+ */
+static backslashResult
+exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt1,
+ *opt2;
+
+ opt1 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ opt2 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ if (strcmp(cmd + 3, "export") == 0)
+ {
+ if (!opt2)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ expand_tilde(&opt2);
+ success = do_lo_export(opt1, opt2);
+ }
+ }
+
+ else if (strcmp(cmd + 3, "import") == 0)
+ {
+ if (!opt1)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ expand_tilde(&opt1);
+ success = do_lo_import(opt1, opt2);
+ }
+ }
+
+ else if (strcmp(cmd + 3, "list") == 0)
+ success = listLargeObjects(false);
+ else if (strcmp(cmd + 3, "list+") == 0)
+ success = listLargeObjects(true);
+
+ else if (strcmp(cmd + 3, "unlink") == 0)
+ {
+ if (!opt1)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ success = do_lo_unlink(opt1);
+ }
+
+ else
+ status = PSQL_CMD_UNKNOWN;
+
+ free(opt1);
+ free(opt2);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ if (!success)
+ status = PSQL_CMD_ERROR;
+
+ return status;
+}
+
+/*
+ * \o -- set query output
+ */
+static backslashResult
+exec_command_out(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, true);
+
+ expand_tilde(&fname);
+ success = setQFout(fname);
+ free(fname);
+ }
+ else
+ ignore_slash_filepipe(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \p -- print the current query buffer
+ */
+static backslashResult
+exec_command_print(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ if (active_branch)
+ {
+ /*
+ * We want to print the same thing \g would execute, but not to change
+ * the query buffer state; so we can't use copy_previous_query().
+ * Also, beware of possibility that buffer pointers are NULL.
+ */
+ if (query_buf && query_buf->len > 0)
+ puts(query_buf->data);
+ else if (previous_buf && previous_buf->len > 0)
+ puts(previous_buf->data);
+ else if (!pset.quiet)
+ puts(_("Query buffer is empty."));
+ fflush(stdout);
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \password -- set user password
+ */
+static backslashResult
+exec_command_password(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *user = psql_scan_slash_option(scan_state,
+ OT_SQLID, NULL, true);
+ char *pw1 = NULL;
+ char *pw2 = NULL;
+ PQExpBufferData buf;
+ PromptInterruptContext prompt_ctx;
+
+ if (user == NULL)
+ {
+ /* By default, the command applies to CURRENT_USER */
+ PGresult *res;
+
+ res = PSQLexec("SELECT CURRENT_USER");
+ if (!res)
+ return PSQL_CMD_ERROR;
+
+ user = pg_strdup(PQgetvalue(res, 0, 0));
+ PQclear(res);
+ }
+
+ /* Set up to let SIGINT cancel simple_prompt_extended() */
+ prompt_ctx.jmpbuf = sigint_interrupt_jmp;
+ prompt_ctx.enabled = &sigint_interrupt_enabled;
+ prompt_ctx.canceled = false;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf, _("Enter new password for user \"%s\": "), user);
+
+ pw1 = simple_prompt_extended(buf.data, false, &prompt_ctx);
+ if (!prompt_ctx.canceled)
+ pw2 = simple_prompt_extended("Enter it again: ", false, &prompt_ctx);
+
+ if (prompt_ctx.canceled)
+ {
+ /* fail silently */
+ success = false;
+ }
+ else if (strcmp(pw1, pw2) != 0)
+ {
+ pg_log_error("Passwords didn't match.");
+ success = false;
+ }
+ else
+ {
+ char *encrypted_password;
+
+ encrypted_password = PQencryptPasswordConn(pset.db, pw1, user, NULL);
+
+ if (!encrypted_password)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ success = false;
+ }
+ else
+ {
+ PGresult *res;
+
+ printfPQExpBuffer(&buf, "ALTER USER %s PASSWORD ",
+ fmtId(user));
+ appendStringLiteralConn(&buf, encrypted_password, pset.db);
+ res = PSQLexec(buf.data);
+ if (!res)
+ success = false;
+ else
+ PQclear(res);
+ PQfreemem(encrypted_password);
+ }
+ }
+
+ free(user);
+ free(pw1);
+ free(pw2);
+ termPQExpBuffer(&buf);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \prompt -- prompt and set variable
+ */
+static backslashResult
+exec_command_prompt(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt,
+ *prompt_text = NULL;
+ char *arg1,
+ *arg2;
+
+ arg1 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false);
+ arg2 = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false);
+
+ if (!arg1)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else
+ {
+ char *result;
+ PromptInterruptContext prompt_ctx;
+
+ /* Set up to let SIGINT cancel simple_prompt_extended() */
+ prompt_ctx.jmpbuf = sigint_interrupt_jmp;
+ prompt_ctx.enabled = &sigint_interrupt_enabled;
+ prompt_ctx.canceled = false;
+
+ if (arg2)
+ {
+ prompt_text = arg1;
+ opt = arg2;
+ }
+ else
+ opt = arg1;
+
+ if (!pset.inputfile)
+ {
+ result = simple_prompt_extended(prompt_text, true, &prompt_ctx);
+ }
+ else
+ {
+ if (prompt_text)
+ {
+ fputs(prompt_text, stdout);
+ fflush(stdout);
+ }
+ result = gets_fromFile(stdin);
+ if (!result)
+ {
+ pg_log_error("\\%s: could not read value for variable",
+ cmd);
+ success = false;
+ }
+ }
+
+ if (prompt_ctx.canceled ||
+ (result && !SetVariable(pset.vars, opt, result)))
+ success = false;
+
+ free(result);
+ free(prompt_text);
+ free(opt);
+ }
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \pset -- set printing parameters
+ */
+static backslashResult
+exec_command_pset(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt0 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ char *opt1 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt0)
+ {
+ /* list all variables */
+
+ int i;
+ static const char *const my_list[] = {
+ "border", "columns", "csv_fieldsep", "expanded", "fieldsep",
+ "fieldsep_zero", "footer", "format", "linestyle", "null",
+ "numericlocale", "pager", "pager_min_lines",
+ "recordsep", "recordsep_zero",
+ "tableattr", "title", "tuples_only",
+ "unicode_border_linestyle",
+ "unicode_column_linestyle",
+ "unicode_header_linestyle",
+ "xheader_width",
+ NULL
+ };
+
+ for (i = 0; my_list[i] != NULL; i++)
+ {
+ char *val = pset_value_string(my_list[i], &pset.popt);
+
+ printf("%-24s %s\n", my_list[i], val);
+ free(val);
+ }
+
+ success = true;
+ }
+ else
+ success = do_pset(opt0, opt1, &pset.popt, pset.quiet);
+
+ free(opt0);
+ free(opt1);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \q or \quit -- exit psql
+ */
+static backslashResult
+exec_command_quit(PsqlScanState scan_state, bool active_branch)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ status = PSQL_CMD_TERMINATE;
+
+ return status;
+}
+
+/*
+ * \r -- reset (clear) the query buffer
+ */
+static backslashResult
+exec_command_reset(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf)
+{
+ if (active_branch)
+ {
+ resetPQExpBuffer(query_buf);
+ psql_scan_reset(scan_state);
+ if (!pset.quiet)
+ puts(_("Query buffer reset (cleared)."));
+ }
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+/*
+ * \s -- save history in a file or show it on the screen
+ */
+static backslashResult
+exec_command_s(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ expand_tilde(&fname);
+ success = printHistory(fname, pset.popt.topt.pager);
+ if (success && !pset.quiet && fname)
+ printf(_("Wrote history to file \"%s\".\n"), fname);
+ if (!fname)
+ putchar('\n');
+ free(fname);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \set -- set variable
+ */
+static backslashResult
+exec_command_set(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt0 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt0)
+ {
+ /* list all variables */
+ PrintVariables(pset.vars);
+ success = true;
+ }
+ else
+ {
+ /*
+ * Set variable to the concatenation of the arguments.
+ */
+ char *newval;
+ char *opt;
+
+ opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ newval = pg_strdup(opt ? opt : "");
+ free(opt);
+
+ while ((opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)))
+ {
+ newval = pg_realloc(newval, strlen(newval) + strlen(opt) + 1);
+ strcat(newval, opt);
+ free(opt);
+ }
+
+ if (!SetVariable(pset.vars, opt0, newval))
+ success = false;
+
+ free(newval);
+ }
+ free(opt0);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \setenv -- set environment variable
+ */
+static backslashResult
+exec_command_setenv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *envvar = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+ char *envval = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!envvar)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else if (strchr(envvar, '=') != NULL)
+ {
+ pg_log_error("\\%s: environment variable name must not contain \"=\"",
+ cmd);
+ success = false;
+ }
+ else if (!envval)
+ {
+ /* No argument - unset the environment variable */
+ unsetenv(envvar);
+ success = true;
+ }
+ else
+ {
+ /* Set variable to the value of the next argument */
+ setenv(envvar, envval, 1);
+ success = true;
+ }
+ free(envvar);
+ free(envval);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \sf/\sv -- show a function/view's source code
+ */
+static backslashResult
+exec_command_sf_sv(PsqlScanState scan_state, bool active_branch,
+ const char *cmd, bool is_func)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ bool show_linenumbers = (strchr(cmd, '+') != NULL);
+ PQExpBuffer buf;
+ char *obj_desc;
+ Oid obj_oid = InvalidOid;
+ EditableObjectType eot = is_func ? EditableFunction : EditableView;
+
+ buf = createPQExpBuffer();
+ obj_desc = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, true);
+ if (!obj_desc)
+ {
+ if (is_func)
+ pg_log_error("function name is required");
+ else
+ pg_log_error("view name is required");
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!lookup_object_oid(eot, obj_desc, &obj_oid))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else if (!get_create_object_cmd(eot, obj_oid, buf))
+ {
+ /* error already reported */
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ FILE *output;
+ bool is_pager;
+
+ /* Select output stream: stdout, pager, or file */
+ if (pset.queryFout == stdout)
+ {
+ /* count lines in function to see if pager is needed */
+ int lineno = count_lines_in_buf(buf);
+
+ output = PageOutput(lineno, &(pset.popt.topt));
+ is_pager = true;
+ }
+ else
+ {
+ /* use previously set output file, without pager */
+ output = pset.queryFout;
+ is_pager = false;
+ }
+
+ if (show_linenumbers)
+ {
+ /* add line numbers */
+ print_with_linenumbers(output, buf->data, is_func);
+ }
+ else
+ {
+ /* just send the definition to output */
+ fputs(buf->data, output);
+ }
+
+ if (is_pager)
+ ClosePager(output);
+ }
+
+ free(obj_desc);
+ destroyPQExpBuffer(buf);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return status;
+}
+
+/*
+ * \t -- turn off table headers and row count
+ */
+static backslashResult
+exec_command_t(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = do_pset("tuples_only", opt, &pset.popt, pset.quiet);
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \T -- define html <table ...> attributes
+ */
+static backslashResult
+exec_command_T(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *value = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ success = do_pset("tableattr", value, &pset.popt, pset.quiet);
+ free(value);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \timing -- enable/disable timing of queries
+ */
+static backslashResult
+exec_command_timing(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (opt)
+ success = ParseVariableBool(opt, "\\timing", &pset.timing);
+ else
+ pset.timing = !pset.timing;
+ if (!pset.quiet)
+ {
+ if (pset.timing)
+ puts(_("Timing is on."));
+ else
+ puts(_("Timing is off."));
+ }
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \unset -- unset variable
+ */
+static backslashResult
+exec_command_unset(PsqlScanState scan_state, bool active_branch,
+ const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ success = false;
+ }
+ else if (!SetVariable(pset.vars, opt, NULL))
+ success = false;
+
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \w -- write query buffer to file
+ */
+static backslashResult
+exec_command_write(PsqlScanState scan_state, bool active_branch,
+ const char *cmd,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ backslashResult status = PSQL_CMD_SKIP_LINE;
+
+ if (active_branch)
+ {
+ char *fname = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, true);
+ FILE *fd = NULL;
+ bool is_pipe = false;
+
+ if (!query_buf)
+ {
+ pg_log_error("no query buffer");
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ if (!fname)
+ {
+ pg_log_error("\\%s: missing required argument", cmd);
+ status = PSQL_CMD_ERROR;
+ }
+ else
+ {
+ expand_tilde(&fname);
+ if (fname[0] == '|')
+ {
+ is_pipe = true;
+ fflush(NULL);
+ disable_sigpipe_trap();
+ fd = popen(&fname[1], "w");
+ }
+ else
+ {
+ canonicalize_path(fname);
+ fd = fopen(fname, "w");
+ }
+ if (!fd)
+ {
+ pg_log_error("%s: %m", fname);
+ status = PSQL_CMD_ERROR;
+ }
+ }
+ }
+
+ if (fd)
+ {
+ int result;
+
+ /*
+ * We want to print the same thing \g would execute, but not to
+ * change the query buffer state; so we can't use
+ * copy_previous_query(). Also, beware of possibility that buffer
+ * pointers are NULL.
+ */
+ if (query_buf && query_buf->len > 0)
+ fprintf(fd, "%s\n", query_buf->data);
+ else if (previous_buf && previous_buf->len > 0)
+ fprintf(fd, "%s\n", previous_buf->data);
+
+ if (is_pipe)
+ {
+ result = pclose(fd);
+
+ if (result != 0)
+ {
+ pg_log_error("%s: %s", fname, wait_result_to_str(result));
+ status = PSQL_CMD_ERROR;
+ }
+ SetShellResultVariables(result);
+ }
+ else
+ {
+ result = fclose(fd);
+
+ if (result == EOF)
+ {
+ pg_log_error("%s: %m", fname);
+ status = PSQL_CMD_ERROR;
+ }
+ }
+ }
+
+ if (is_pipe)
+ restore_sigpipe_trap();
+
+ free(fname);
+ }
+ else
+ ignore_slash_filepipe(scan_state);
+
+ return status;
+}
+
+/*
+ * \watch -- execute a query every N seconds.
+ * Optionally, stop after M iterations.
+ */
+static backslashResult
+exec_command_watch(PsqlScanState scan_state, bool active_branch,
+ PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ bool have_sleep = false;
+ bool have_iter = false;
+ double sleep = 2;
+ int iter = 0;
+
+ /*
+ * Parse arguments. We allow either an unlabeled interval or
+ * "name=value", where name is from the set ('i', 'interval', 'c',
+ * 'count').
+ */
+ while (success)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+ char *valptr;
+ char *opt_end;
+
+ if (!opt)
+ break; /* no more arguments */
+
+ valptr = strchr(opt, '=');
+ if (valptr)
+ {
+ /* Labeled argument */
+ valptr++;
+ if (strncmp("i=", opt, strlen("i=")) == 0 ||
+ strncmp("interval=", opt, strlen("interval=")) == 0)
+ {
+ if (have_sleep)
+ {
+ pg_log_error("\\watch: interval value is specified more than once");
+ success = false;
+ }
+ else
+ {
+ have_sleep = true;
+ errno = 0;
+ sleep = strtod(valptr, &opt_end);
+ if (sleep < 0 || *opt_end || errno == ERANGE)
+ {
+ pg_log_error("\\watch: incorrect interval value \"%s\"", valptr);
+ success = false;
+ }
+ }
+ }
+ else if (strncmp("c=", opt, strlen("c=")) == 0 ||
+ strncmp("count=", opt, strlen("count=")) == 0)
+ {
+ if (have_iter)
+ {
+ pg_log_error("\\watch: iteration count is specified more than once");
+ success = false;
+ }
+ else
+ {
+ have_iter = true;
+ errno = 0;
+ iter = strtoint(valptr, &opt_end, 10);
+ if (iter <= 0 || *opt_end || errno == ERANGE)
+ {
+ pg_log_error("\\watch: incorrect iteration count \"%s\"", valptr);
+ success = false;
+ }
+ }
+ }
+ else
+ {
+ pg_log_error("\\watch: unrecognized parameter \"%s\"", opt);
+ success = false;
+ }
+ }
+ else
+ {
+ /* Unlabeled argument: take it as interval */
+ if (have_sleep)
+ {
+ pg_log_error("\\watch: interval value is specified more than once");
+ success = false;
+ }
+ else
+ {
+ have_sleep = true;
+ errno = 0;
+ sleep = strtod(opt, &opt_end);
+ if (sleep < 0 || *opt_end || errno == ERANGE)
+ {
+ pg_log_error("\\watch: incorrect interval value \"%s\"", opt);
+ success = false;
+ }
+ }
+ }
+
+ free(opt);
+ }
+
+ /* If we parsed arguments successfully, do the command */
+ if (success)
+ {
+ /* If query_buf is empty, recall and execute previous query */
+ (void) copy_previous_query(query_buf, previous_buf);
+
+ success = do_watch(query_buf, sleep, iter);
+ }
+
+ /* Reset the query buffer as though for \r */
+ resetPQExpBuffer(query_buf);
+ psql_scan_reset(scan_state);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \x -- set or toggle expanded table representation
+ */
+static backslashResult
+exec_command_x(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ success = do_pset("expanded", opt, &pset.popt, pset.quiet);
+ free(opt);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \z -- list table privileges (equivalent to \dp)
+ */
+static backslashResult
+exec_command_z(PsqlScanState scan_state, bool active_branch, const char *cmd)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *pattern;
+ bool show_system;
+
+ pattern = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, true);
+
+ show_system = strchr(cmd, 'S') ? true : false;
+
+ success = permissionsList(pattern, show_system);
+
+ free(pattern);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \! -- execute shell command
+ */
+static backslashResult
+exec_command_shell_escape(PsqlScanState scan_state, bool active_branch)
+{
+ bool success = true;
+
+ if (active_branch)
+ {
+ char *opt = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+
+ success = do_shell(opt);
+ free(opt);
+ }
+ else
+ ignore_slash_whole_line(scan_state);
+
+ return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
+}
+
+/*
+ * \? -- print help about backslash commands
+ */
+static backslashResult
+exec_command_slash_command_help(PsqlScanState scan_state, bool active_branch)
+{
+ if (active_branch)
+ {
+ char *opt0 = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false);
+
+ if (!opt0 || strcmp(opt0, "commands") == 0)
+ slashUsage(pset.popt.topt.pager);
+ else if (strcmp(opt0, "options") == 0)
+ usage(pset.popt.topt.pager);
+ else if (strcmp(opt0, "variables") == 0)
+ helpVariables(pset.popt.topt.pager);
+ else
+ slashUsage(pset.popt.topt.pager);
+
+ free(opt0);
+ }
+ else
+ ignore_slash_options(scan_state);
+
+ return PSQL_CMD_SKIP_LINE;
+}
+
+
+/*
+ * Read and interpret an argument to the \connect slash command.
+ *
+ * Returns a malloc'd string, or NULL if no/empty argument.
+ */
+static char *
+read_connect_arg(PsqlScanState scan_state)
+{
+ char *result;
+ char quote;
+
+ /*
+ * Ideally we should treat the arguments as SQL identifiers. But for
+ * backwards compatibility with 7.2 and older pg_dump files, we have to
+ * take unquoted arguments verbatim (don't downcase them). For now,
+ * double-quoted arguments may be stripped of double quotes (as if SQL
+ * identifiers). By 7.4 or so, pg_dump files can be expected to
+ * double-quote all mixed-case \connect arguments, and then we can get rid
+ * of OT_SQLIDHACK.
+ */
+ result = psql_scan_slash_option(scan_state, OT_SQLIDHACK, &quote, true);
+
+ if (!result)
+ return NULL;
+
+ if (quote)
+ return result;
+
+ if (*result == '\0' || strcmp(result, "-") == 0)
+ {
+ free(result);
+ return NULL;
+ }
+
+ return result;
+}
+
+/*
+ * Read a boolean expression, return it as a PQExpBuffer string.
+ *
+ * Note: anything more or less than one token will certainly fail to be
+ * parsed by ParseVariableBool, so we don't worry about complaining here.
+ * This routine's return data structure will need to be rethought anyway
+ * to support likely future extensions such as "\if defined VARNAME".
+ */
+static PQExpBuffer
+gather_boolean_expression(PsqlScanState scan_state)
+{
+ PQExpBuffer exp_buf = createPQExpBuffer();
+ int num_options = 0;
+ char *value;
+
+ /* collect all arguments for the conditional command into exp_buf */
+ while ((value = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)) != NULL)
+ {
+ /* add spaces between tokens */
+ if (num_options > 0)
+ appendPQExpBufferChar(exp_buf, ' ');
+ appendPQExpBufferStr(exp_buf, value);
+ num_options++;
+ free(value);
+ }
+
+ return exp_buf;
+}
+
+/*
+ * Read a boolean expression, return true if the expression
+ * was a valid boolean expression that evaluated to true.
+ * Otherwise return false.
+ *
+ * Note: conditional stack's top state must be active, else lexer will
+ * fail to expand variables and backticks.
+ */
+static bool
+is_true_boolean_expression(PsqlScanState scan_state, const char *name)
+{
+ PQExpBuffer buf = gather_boolean_expression(scan_state);
+ bool value = false;
+ bool success = ParseVariableBool(buf->data, name, &value);
+
+ destroyPQExpBuffer(buf);
+ return success && value;
+}
+
+/*
+ * Read a boolean expression, but do nothing with it.
+ *
+ * Note: conditional stack's top state must be INACTIVE, else lexer will
+ * expand variables and backticks, which we do not want here.
+ */
+static void
+ignore_boolean_expression(PsqlScanState scan_state)
+{
+ PQExpBuffer buf = gather_boolean_expression(scan_state);
+
+ destroyPQExpBuffer(buf);
+}
+
+/*
+ * Read and discard "normal" slash command options.
+ *
+ * This should be used for inactive-branch processing of any slash command
+ * that eats one or more OT_NORMAL, OT_SQLID, or OT_SQLIDHACK parameters.
+ * We don't need to worry about exactly how many it would eat, since the
+ * cleanup logic in HandleSlashCmds would silently discard any extras anyway.
+ */
+static void
+ignore_slash_options(PsqlScanState scan_state)
+{
+ char *arg;
+
+ while ((arg = psql_scan_slash_option(scan_state,
+ OT_NORMAL, NULL, false)) != NULL)
+ free(arg);
+}
+
+/*
+ * Read and discard FILEPIPE slash command argument.
+ *
+ * This *MUST* be used for inactive-branch processing of any slash command
+ * that takes an OT_FILEPIPE option. Otherwise we might consume a different
+ * amount of option text in active and inactive cases.
+ */
+static void
+ignore_slash_filepipe(PsqlScanState scan_state)
+{
+ char *arg = psql_scan_slash_option(scan_state,
+ OT_FILEPIPE, NULL, false);
+
+ free(arg);
+}
+
+/*
+ * Read and discard whole-line slash command argument.
+ *
+ * This *MUST* be used for inactive-branch processing of any slash command
+ * that takes an OT_WHOLE_LINE option. Otherwise we might consume a different
+ * amount of option text in active and inactive cases.
+ */
+static void
+ignore_slash_whole_line(PsqlScanState scan_state)
+{
+ char *arg = psql_scan_slash_option(scan_state,
+ OT_WHOLE_LINE, NULL, false);
+
+ free(arg);
+}
+
+/*
+ * Return true if the command given is a branching command.
+ */
+static bool
+is_branching_command(const char *cmd)
+{
+ return (strcmp(cmd, "if") == 0 ||
+ strcmp(cmd, "elif") == 0 ||
+ strcmp(cmd, "else") == 0 ||
+ strcmp(cmd, "endif") == 0);
+}
+
+/*
+ * 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.
+ */
+static void
+save_query_text_state(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ 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));
+}
+
+/*
+ * Discard any query text absorbed during an inactive conditional branch.
+ *
+ * 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.)
+ */
+static void
+discard_query_text(PsqlScanState scan_state, ConditionalStack cstack,
+ PQExpBuffer query_buf)
+{
+ if (query_buf)
+ {
+ int new_len = conditional_stack_get_query_len(cstack);
+
+ Assert(new_len >= 0 && new_len <= query_buf->len);
+ query_buf->len = new_len;
+ query_buf->data[new_len] = '\0';
+ }
+ psql_scan_set_paren_depth(scan_state,
+ conditional_stack_get_paren_depth(cstack));
+}
+
+/*
+ * If query_buf is empty, copy previous_buf into it.
+ *
+ * This is used by various slash commands for which re-execution of a
+ * previous query is a common usage. For convenience, we allow the
+ * case of query_buf == NULL (and do nothing).
+ *
+ * Returns "true" if the previous query was copied into the query
+ * buffer, else "false".
+ */
+static bool
+copy_previous_query(PQExpBuffer query_buf, PQExpBuffer previous_buf)
+{
+ if (query_buf && query_buf->len == 0)
+ {
+ appendPQExpBufferStr(query_buf, previous_buf->data);
+ return true;
+ }
+ return false;
+}
+
+/*
+ * Ask the user for a password; 'username' is the username the
+ * password is for, if one has been explicitly specified.
+ * Returns a malloc'd string.
+ * If 'canceled' is provided, *canceled will be set to true if the prompt
+ * is canceled via SIGINT, and to false otherwise.
+ */
+static char *
+prompt_for_password(const char *username, bool *canceled)
+{
+ char *result;
+ PromptInterruptContext prompt_ctx;
+
+ /* Set up to let SIGINT cancel simple_prompt_extended() */
+ prompt_ctx.jmpbuf = sigint_interrupt_jmp;
+ prompt_ctx.enabled = &sigint_interrupt_enabled;
+ prompt_ctx.canceled = false;
+
+ if (username == NULL || username[0] == '\0')
+ result = simple_prompt_extended("Password: ", false, &prompt_ctx);
+ else
+ {
+ char *prompt_text;
+
+ prompt_text = psprintf(_("Password for user %s: "), username);
+ result = simple_prompt_extended(prompt_text, false, &prompt_ctx);
+ free(prompt_text);
+ }
+
+ if (canceled)
+ *canceled = prompt_ctx.canceled;
+
+ return result;
+}
+
+static bool
+param_is_newly_set(const char *old_val, const char *new_val)
+{
+ if (new_val == NULL)
+ return false;
+
+ if (old_val == NULL || strcmp(old_val, new_val) != 0)
+ return true;
+
+ return false;
+}
+
+/*
+ * do_connect -- handler for \connect
+ *
+ * Connects to a database with given parameters. If we are told to re-use
+ * parameters, parameters from the previous connection are used where the
+ * command's own options do not supply a value. Otherwise, libpq defaults
+ * are used.
+ *
+ * In interactive mode, if connection fails with the given parameters,
+ * the old connection will be kept.
+ */
+static bool
+do_connect(enum trivalue reuse_previous_specification,
+ char *dbname, char *user, char *host, char *port)
+{
+ PGconn *o_conn = pset.db,
+ *n_conn = NULL;
+ PQconninfoOption *cinfo;
+ int nconnopts = 0;
+ bool same_host = false;
+ char *password = NULL;
+ char *client_encoding;
+ bool success = true;
+ bool keep_password = true;
+ bool has_connection_string;
+ bool reuse_previous;
+
+ has_connection_string = dbname ?
+ recognized_connection_string(dbname) : false;
+
+ /* Complain if we have additional arguments after a connection string. */
+ if (has_connection_string && (user || host || port))
+ {
+ pg_log_error("Do not give user, host, or port separately when using a connection string");
+ return false;
+ }
+
+ switch (reuse_previous_specification)
+ {
+ case TRI_YES:
+ reuse_previous = true;
+ break;
+ case TRI_NO:
+ reuse_previous = false;
+ break;
+ default:
+ reuse_previous = !has_connection_string;
+ break;
+ }
+
+ /*
+ * If we intend to re-use connection parameters, collect them out of the
+ * old connection, then replace individual values as necessary. (We may
+ * need to resort to looking at pset.dead_conn, if the connection died
+ * previously.) Otherwise, obtain a PQconninfoOption array containing
+ * libpq's defaults, and modify that. Note this function assumes that
+ * PQconninfo, PQconndefaults, and PQconninfoParse will all produce arrays
+ * containing the same options in the same order.
+ */
+ if (reuse_previous)
+ {
+ if (o_conn)
+ cinfo = PQconninfo(o_conn);
+ else if (pset.dead_conn)
+ cinfo = PQconninfo(pset.dead_conn);
+ else
+ {
+ /* This is reachable after a non-interactive \connect failure */
+ pg_log_error("No database connection exists to re-use parameters from");
+ return false;
+ }
+ }
+ else
+ cinfo = PQconndefaults();
+
+ if (cinfo)
+ {
+ if (has_connection_string)
+ {
+ /* Parse the connstring and insert values into cinfo */
+ PQconninfoOption *replcinfo;
+ char *errmsg;
+
+ replcinfo = PQconninfoParse(dbname, &errmsg);
+ if (replcinfo)
+ {
+ PQconninfoOption *ci;
+ PQconninfoOption *replci;
+ bool have_password = false;
+
+ for (ci = cinfo, replci = replcinfo;
+ ci->keyword && replci->keyword;
+ ci++, replci++)
+ {
+ Assert(strcmp(ci->keyword, replci->keyword) == 0);
+ /* Insert value from connstring if one was provided */
+ if (replci->val)
+ {
+ /*
+ * We know that both val strings were allocated by
+ * libpq, so the least messy way to avoid memory leaks
+ * is to swap them.
+ */
+ char *swap = replci->val;
+
+ replci->val = ci->val;
+ ci->val = swap;
+
+ /*
+ * Check whether connstring provides options affecting
+ * password re-use. While any change in user, host,
+ * hostaddr, or port causes us to ignore the old
+ * connection's password, we don't force that for
+ * dbname, since passwords aren't database-specific.
+ */
+ if (replci->val == NULL ||
+ strcmp(ci->val, replci->val) != 0)
+ {
+ if (strcmp(replci->keyword, "user") == 0 ||
+ strcmp(replci->keyword, "host") == 0 ||
+ strcmp(replci->keyword, "hostaddr") == 0 ||
+ strcmp(replci->keyword, "port") == 0)
+ keep_password = false;
+ }
+ /* Also note whether connstring contains a password. */
+ if (strcmp(replci->keyword, "password") == 0)
+ have_password = true;
+ }
+ else if (!reuse_previous)
+ {
+ /*
+ * When we have a connstring and are not re-using
+ * parameters, swap *all* entries, even those not set
+ * by the connstring. This avoids absorbing
+ * environment-dependent defaults from the result of
+ * PQconndefaults(). We don't want to do that because
+ * they'd override service-file entries if the
+ * connstring specifies a service parameter, whereas
+ * the priority should be the other way around. libpq
+ * can certainly recompute any defaults we don't pass
+ * here. (In this situation, it's a bit wasteful to
+ * have called PQconndefaults() at all, but not doing
+ * so would require yet another major code path here.)
+ */
+ replci->val = ci->val;
+ ci->val = NULL;
+ }
+ }
+ Assert(ci->keyword == NULL && replci->keyword == NULL);
+
+ /* While here, determine how many option slots there are */
+ nconnopts = ci - cinfo;
+
+ PQconninfoFree(replcinfo);
+
+ /*
+ * If the connstring contains a password, tell the loop below
+ * that we may use it, regardless of other settings (i.e.,
+ * cinfo's password is no longer an "old" password).
+ */
+ if (have_password)
+ keep_password = true;
+
+ /* Don't let code below try to inject dbname into params. */
+ dbname = NULL;
+ }
+ else
+ {
+ /* PQconninfoParse failed */
+ if (errmsg)
+ {
+ pg_log_error("%s", errmsg);
+ PQfreemem(errmsg);
+ }
+ else
+ pg_log_error("out of memory");
+ success = false;
+ }
+ }
+ else
+ {
+ /*
+ * If dbname isn't a connection string, then we'll inject it and
+ * the other parameters into the keyword array below. (We can't
+ * easily insert them into the cinfo array because of memory
+ * management issues: PQconninfoFree would misbehave on Windows.)
+ * However, to avoid dependencies on the order in which parameters
+ * appear in the array, make a preliminary scan to set
+ * keep_password and same_host correctly.
+ *
+ * While any change in user, host, or port causes us to ignore the
+ * old connection's password, we don't force that for dbname,
+ * since passwords aren't database-specific.
+ */
+ PQconninfoOption *ci;
+
+ for (ci = cinfo; ci->keyword; ci++)
+ {
+ if (user && strcmp(ci->keyword, "user") == 0)
+ {
+ if (!(ci->val && strcmp(user, ci->val) == 0))
+ keep_password = false;
+ }
+ else if (host && strcmp(ci->keyword, "host") == 0)
+ {
+ if (ci->val && strcmp(host, ci->val) == 0)
+ same_host = true;
+ else
+ keep_password = false;
+ }
+ else if (port && strcmp(ci->keyword, "port") == 0)
+ {
+ if (!(ci->val && strcmp(port, ci->val) == 0))
+ keep_password = false;
+ }
+ }
+
+ /* While here, determine how many option slots there are */
+ nconnopts = ci - cinfo;
+ }
+ }
+ else
+ {
+ /* We failed to create the cinfo structure */
+ pg_log_error("out of memory");
+ success = false;
+ }
+
+ /*
+ * If the user asked to be prompted for a password, ask for one now. If
+ * not, use the password from the old connection, provided the username
+ * etc have not changed. Otherwise, try to connect without a password
+ * first, and then ask for a password if needed.
+ *
+ * XXX: this behavior leads to spurious connection attempts recorded in
+ * the postmaster's log. But libpq offers no API that would let us obtain
+ * a password and then continue with the first connection attempt.
+ */
+ if (pset.getPassword == TRI_YES && success)
+ {
+ bool canceled = false;
+
+ /*
+ * If a connstring or URI is provided, we don't know which username
+ * will be used, since we haven't dug that out of the connstring.
+ * Don't risk issuing a misleading prompt. As in startup.c, it does
+ * not seem worth working harder, since this getPassword setting is
+ * normally only used in noninteractive cases.
+ */
+ password = prompt_for_password(has_connection_string ? NULL : user,
+ &canceled);
+ success = !canceled;
+ }
+
+ /*
+ * Consider whether to force client_encoding to "auto" (overriding
+ * anything in the connection string). We do so if we have a terminal
+ * connection and there is no PGCLIENTENCODING environment setting.
+ */
+ if (pset.notty || getenv("PGCLIENTENCODING"))
+ client_encoding = NULL;
+ else
+ client_encoding = "auto";
+
+ /* Loop till we have a connection or fail, which we might've already */
+ while (success)
+ {
+ const char **keywords = pg_malloc((nconnopts + 1) * sizeof(*keywords));
+ const char **values = pg_malloc((nconnopts + 1) * sizeof(*values));
+ int paramnum = 0;
+ PQconninfoOption *ci;
+
+ /*
+ * Copy non-default settings into the PQconnectdbParams parameter
+ * arrays; but inject any values specified old-style, as well as any
+ * interactively-obtained password, and a couple of fields we want to
+ * set forcibly.
+ *
+ * If you change this code, see also the initial-connection code in
+ * main().
+ */
+ for (ci = cinfo; ci->keyword; ci++)
+ {
+ keywords[paramnum] = ci->keyword;
+
+ if (dbname && strcmp(ci->keyword, "dbname") == 0)
+ values[paramnum++] = dbname;
+ else if (user && strcmp(ci->keyword, "user") == 0)
+ values[paramnum++] = user;
+ else if (host && strcmp(ci->keyword, "host") == 0)
+ values[paramnum++] = host;
+ else if (host && !same_host && strcmp(ci->keyword, "hostaddr") == 0)
+ {
+ /* If we're changing the host value, drop any old hostaddr */
+ values[paramnum++] = NULL;
+ }
+ else if (port && strcmp(ci->keyword, "port") == 0)
+ values[paramnum++] = port;
+ /* If !keep_password, we unconditionally drop old password */
+ else if ((password || !keep_password) &&
+ strcmp(ci->keyword, "password") == 0)
+ values[paramnum++] = password;
+ else if (strcmp(ci->keyword, "fallback_application_name") == 0)
+ values[paramnum++] = pset.progname;
+ else if (client_encoding &&
+ strcmp(ci->keyword, "client_encoding") == 0)
+ values[paramnum++] = client_encoding;
+ else if (ci->val)
+ values[paramnum++] = ci->val;
+ /* else, don't bother making libpq parse this keyword */
+ }
+ /* add array terminator */
+ keywords[paramnum] = NULL;
+ values[paramnum] = NULL;
+
+ /* Note we do not want libpq to re-expand the dbname parameter */
+ n_conn = PQconnectdbParams(keywords, values, false);
+
+ pg_free(keywords);
+ pg_free(values);
+
+ if (PQstatus(n_conn) == CONNECTION_OK)
+ break;
+
+ /*
+ * Connection attempt failed; either retry the connection attempt with
+ * a new password, or give up.
+ */
+ if (!password && PQconnectionNeedsPassword(n_conn) && pset.getPassword != TRI_NO)
+ {
+ bool canceled = false;
+
+ /*
+ * Prompt for password using the username we actually connected
+ * with --- it might've come out of "dbname" rather than "user".
+ */
+ password = prompt_for_password(PQuser(n_conn), &canceled);
+ PQfinish(n_conn);
+ n_conn = NULL;
+ success = !canceled;
+ continue;
+ }
+
+ /*
+ * We'll report the error below ... unless n_conn is NULL, indicating
+ * that libpq didn't have enough memory to make a PGconn.
+ */
+ if (n_conn == NULL)
+ pg_log_error("out of memory");
+
+ success = false;
+ } /* end retry loop */
+
+ /* Release locally allocated data, whether we succeeded or not */
+ pg_free(password);
+ PQconninfoFree(cinfo);
+
+ if (!success)
+ {
+ /*
+ * Failed to connect to the database. In interactive mode, keep the
+ * previous connection to the DB; in scripting mode, close our
+ * previous connection as well.
+ */
+ if (pset.cur_cmd_interactive)
+ {
+ if (n_conn)
+ {
+ pg_log_info("%s", PQerrorMessage(n_conn));
+ PQfinish(n_conn);
+ }
+
+ /* pset.db is left unmodified */
+ if (o_conn)
+ pg_log_info("Previous connection kept");
+ }
+ else
+ {
+ if (n_conn)
+ {
+ pg_log_error("\\connect: %s", PQerrorMessage(n_conn));
+ PQfinish(n_conn);
+ }
+
+ if (o_conn)
+ {
+ /*
+ * Transition to having no connection.
+ *
+ * Unlike CheckConnection(), we close the old connection
+ * immediately to prevent its parameters from being re-used.
+ * This is so that a script cannot accidentally reuse
+ * parameters it did not expect to. Otherwise, the state
+ * cleanup should be the same as in CheckConnection().
+ */
+ PQfinish(o_conn);
+ pset.db = NULL;
+ ResetCancelConn();
+ UnsyncVariables();
+ }
+
+ /* On the same reasoning, release any dead_conn to prevent reuse */
+ if (pset.dead_conn)
+ {
+ PQfinish(pset.dead_conn);
+ pset.dead_conn = NULL;
+ }
+ }
+
+ return false;
+ }
+
+ /*
+ * Replace the old connection with the new one, and update
+ * connection-dependent variables. Keep the resynchronization logic in
+ * sync with CheckConnection().
+ */
+ PQsetNoticeProcessor(n_conn, NoticeProcessor, NULL);
+ pset.db = n_conn;
+ SyncVariables();
+ connection_warnings(false); /* Must be after SyncVariables */
+
+ /* Tell the user about the new connection */
+ if (!pset.quiet)
+ {
+ if (!o_conn ||
+ param_is_newly_set(PQhost(o_conn), PQhost(pset.db)) ||
+ param_is_newly_set(PQport(o_conn), PQport(pset.db)))
+ {
+ char *connhost = PQhost(pset.db);
+ char *hostaddr = PQhostaddr(pset.db);
+
+ if (is_unixsock_path(connhost))
+ {
+ /* hostaddr overrides connhost */
+ if (hostaddr && *hostaddr)
+ printf(_("You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), hostaddr, PQport(pset.db));
+ else
+ printf(_("You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), connhost, PQport(pset.db));
+ }
+ else
+ {
+ if (hostaddr && *hostaddr && strcmp(connhost, hostaddr) != 0)
+ printf(_("You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), connhost, hostaddr, PQport(pset.db));
+ else
+ printf(_("You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db), connhost, PQport(pset.db));
+ }
+ }
+ else
+ printf(_("You are now connected to database \"%s\" as user \"%s\".\n"),
+ PQdb(pset.db), PQuser(pset.db));
+ }
+
+ /* Drop no-longer-needed connection(s) */
+ if (o_conn)
+ PQfinish(o_conn);
+ if (pset.dead_conn)
+ {
+ PQfinish(pset.dead_conn);
+ pset.dead_conn = NULL;
+ }
+
+ return true;
+}
+
+
+void
+connection_warnings(bool in_startup)
+{
+ if (!pset.quiet && !pset.notty)
+ {
+ int client_ver = PG_VERSION_NUM;
+ char cverbuf[32];
+ char sverbuf[32];
+
+ if (pset.sversion != client_ver)
+ {
+ const char *server_version;
+
+ /* Try to get full text form, might include "devel" etc */
+ server_version = PQparameterStatus(pset.db, "server_version");
+ /* Otherwise fall back on pset.sversion */
+ if (!server_version)
+ {
+ formatPGVersionNumber(pset.sversion, true,
+ sverbuf, sizeof(sverbuf));
+ server_version = sverbuf;
+ }
+
+ printf(_("%s (%s, server %s)\n"),
+ pset.progname, PG_VERSION, server_version);
+ }
+ /* For version match, only print psql banner on startup. */
+ else if (in_startup)
+ printf("%s (%s)\n", pset.progname, PG_VERSION);
+
+ /*
+ * Warn if server's major version is newer than ours, or if server
+ * predates our support cutoff (currently 9.2).
+ */
+ if (pset.sversion / 100 > client_ver / 100 ||
+ pset.sversion < 90200)
+ printf(_("WARNING: %s major version %s, server major version %s.\n"
+ " Some psql features might not work.\n"),
+ pset.progname,
+ formatPGVersionNumber(client_ver, false,
+ cverbuf, sizeof(cverbuf)),
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+
+#ifdef WIN32
+ if (in_startup)
+ checkWin32Codepage();
+#endif
+ printSSLInfo();
+ printGSSInfo();
+ }
+}
+
+
+/*
+ * printSSLInfo
+ *
+ * Prints information about the current SSL connection, if SSL is in use
+ */
+static void
+printSSLInfo(void)
+{
+ const char *protocol;
+ const char *cipher;
+ const char *compression;
+
+ if (!PQsslInUse(pset.db))
+ return; /* no SSL */
+
+ protocol = PQsslAttribute(pset.db, "protocol");
+ cipher = PQsslAttribute(pset.db, "cipher");
+ compression = PQsslAttribute(pset.db, "compression");
+
+ printf(_("SSL connection (protocol: %s, cipher: %s, compression: %s)\n"),
+ protocol ? protocol : _("unknown"),
+ cipher ? cipher : _("unknown"),
+ (compression && strcmp(compression, "off") != 0) ? _("on") : _("off"));
+}
+
+/*
+ * printGSSInfo
+ *
+ * Prints information about the current GSSAPI connection, if GSSAPI encryption is in use
+ */
+static void
+printGSSInfo(void)
+{
+ if (!PQgssEncInUse(pset.db))
+ return; /* no GSSAPI encryption in use */
+
+ printf(_("GSSAPI-encrypted connection\n"));
+}
+
+
+/*
+ * checkWin32Codepage
+ *
+ * Prints a warning when win32 console codepage differs from Windows codepage
+ */
+#ifdef WIN32
+static void
+checkWin32Codepage(void)
+{
+ unsigned int wincp,
+ concp;
+
+ wincp = GetACP();
+ concp = GetConsoleCP();
+ if (wincp != concp)
+ {
+ printf(_("WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+ " 8-bit characters might not work correctly. See psql reference\n"
+ " page \"Notes for Windows users\" for details.\n"),
+ concp, wincp);
+ }
+}
+#endif
+
+
+/*
+ * SyncVariables
+ *
+ * Make psql's internal variables agree with connection state upon
+ * establishing a new connection.
+ */
+void
+SyncVariables(void)
+{
+ char vbuf[32];
+ const char *server_version;
+
+ /* get stuff from connection */
+ pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = pset.encoding;
+ pset.sversion = PQserverVersion(pset.db);
+
+ SetVariable(pset.vars, "DBNAME", PQdb(pset.db));
+ SetVariable(pset.vars, "USER", PQuser(pset.db));
+ SetVariable(pset.vars, "HOST", PQhost(pset.db));
+ SetVariable(pset.vars, "PORT", PQport(pset.db));
+ SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding));
+
+ /* this bit should match connection_warnings(): */
+ /* Try to get full text form of version, might include "devel" etc */
+ server_version = PQparameterStatus(pset.db, "server_version");
+ /* Otherwise fall back on pset.sversion */
+ if (!server_version)
+ {
+ formatPGVersionNumber(pset.sversion, true, vbuf, sizeof(vbuf));
+ server_version = vbuf;
+ }
+ SetVariable(pset.vars, "SERVER_VERSION_NAME", server_version);
+
+ snprintf(vbuf, sizeof(vbuf), "%d", pset.sversion);
+ SetVariable(pset.vars, "SERVER_VERSION_NUM", vbuf);
+
+ /* send stuff to it, too */
+ PQsetErrorVerbosity(pset.db, pset.verbosity);
+ PQsetErrorContextVisibility(pset.db, pset.show_context);
+}
+
+/*
+ * UnsyncVariables
+ *
+ * Clear variables that should be not be set when there is no connection.
+ */
+void
+UnsyncVariables(void)
+{
+ SetVariable(pset.vars, "DBNAME", NULL);
+ SetVariable(pset.vars, "USER", NULL);
+ SetVariable(pset.vars, "HOST", NULL);
+ SetVariable(pset.vars, "PORT", NULL);
+ SetVariable(pset.vars, "ENCODING", NULL);
+ SetVariable(pset.vars, "SERVER_VERSION_NAME", NULL);
+ SetVariable(pset.vars, "SERVER_VERSION_NUM", NULL);
+}
+
+
+/*
+ * helper for do_edit(): actually invoke the editor
+ *
+ * Returns true on success, false if we failed to invoke the editor or
+ * it returned nonzero status. (An error message is printed for failed-
+ * to-invoke cases, but not if the editor returns nonzero status.)
+ */
+static bool
+editFile(const char *fname, int lineno)
+{
+ const char *editorName;
+ const char *editor_lineno_arg = NULL;
+ char *sys;
+ int result;
+
+ Assert(fname != NULL);
+
+ /* Find an editor to use */
+ editorName = getenv("PSQL_EDITOR");
+ if (!editorName)
+ editorName = getenv("EDITOR");
+ if (!editorName)
+ editorName = getenv("VISUAL");
+ if (!editorName)
+ editorName = DEFAULT_EDITOR;
+
+ /* Get line number argument, if we need it. */
+ if (lineno > 0)
+ {
+ editor_lineno_arg = getenv("PSQL_EDITOR_LINENUMBER_ARG");
+#ifdef DEFAULT_EDITOR_LINENUMBER_ARG
+ if (!editor_lineno_arg)
+ editor_lineno_arg = DEFAULT_EDITOR_LINENUMBER_ARG;
+#endif
+ if (!editor_lineno_arg)
+ {
+ pg_log_error("environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number");
+ return false;
+ }
+ }
+
+ /*
+ * On Unix the EDITOR value should *not* be quoted, since it might include
+ * switches, eg, EDITOR="pico -t"; it's up to the user to put quotes in it
+ * if necessary. But this policy is not very workable on Windows, due to
+ * severe brain damage in their command shell plus the fact that standard
+ * program paths include spaces.
+ */
+#ifndef WIN32
+ if (lineno > 0)
+ sys = psprintf("exec %s %s%d '%s'",
+ editorName, editor_lineno_arg, lineno, fname);
+ else
+ sys = psprintf("exec %s '%s'",
+ editorName, fname);
+#else
+ if (lineno > 0)
+ sys = psprintf("\"%s\" %s%d \"%s\"",
+ editorName, editor_lineno_arg, lineno, fname);
+ else
+ sys = psprintf("\"%s\" \"%s\"",
+ editorName, fname);
+#endif
+ fflush(NULL);
+ result = system(sys);
+ if (result == -1)
+ pg_log_error("could not start editor \"%s\"", editorName);
+ else if (result == 127)
+ pg_log_error("could not start /bin/sh");
+ free(sys);
+
+ return result == 0;
+}
+
+
+/*
+ * do_edit -- handler for \e
+ *
+ * If you do not specify a filename, the current query buffer will be copied
+ * into a temporary file.
+ *
+ * After this function is done, the resulting file will be copied back into the
+ * query buffer. As an exception to this, the query buffer will be emptied
+ * if the file was not modified (or the editor failed) and the caller passes
+ * "discard_on_quit" = true.
+ *
+ * If "edited" isn't NULL, *edited will be set to true if the query buffer
+ * is successfully replaced.
+ */
+static bool
+do_edit(const char *filename_arg, PQExpBuffer query_buf,
+ int lineno, bool discard_on_quit, bool *edited)
+{
+ char fnametmp[MAXPGPATH];
+ FILE *stream = NULL;
+ const char *fname;
+ bool error = false;
+ int fd;
+ struct stat before,
+ after;
+
+ if (filename_arg)
+ fname = filename_arg;
+ else
+ {
+ /* make a temp file to edit */
+#ifndef WIN32
+ const char *tmpdir = getenv("TMPDIR");
+
+ if (!tmpdir)
+ tmpdir = "/tmp";
+#else
+ char tmpdir[MAXPGPATH];
+ int ret;
+
+ ret = GetTempPath(MAXPGPATH, tmpdir);
+ if (ret == 0 || ret > MAXPGPATH)
+ {
+ pg_log_error("could not locate temporary directory: %s",
+ !ret ? strerror(errno) : "");
+ return false;
+ }
+#endif
+
+ /*
+ * No canonicalize_path() here. EDIT.EXE run from CMD.EXE prepends the
+ * current directory to the supplied path unless we use only
+ * backslashes, so we do that.
+ */
+#ifndef WIN32
+ snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d.sql", tmpdir,
+ "/", (int) getpid());
+#else
+ snprintf(fnametmp, sizeof(fnametmp), "%s%spsql.edit.%d.sql", tmpdir,
+ "" /* trailing separator already present */ , (int) getpid());
+#endif
+
+ fname = (const char *) fnametmp;
+
+ fd = open(fname, O_WRONLY | O_CREAT | O_EXCL, 0600);
+ if (fd != -1)
+ stream = fdopen(fd, "w");
+
+ if (fd == -1 || !stream)
+ {
+ pg_log_error("could not open temporary file \"%s\": %m", fname);
+ error = true;
+ }
+ else
+ {
+ unsigned int ql = query_buf->len;
+
+ /* force newline-termination of what we send to editor */
+ if (ql > 0 && query_buf->data[ql - 1] != '\n')
+ {
+ appendPQExpBufferChar(query_buf, '\n');
+ ql++;
+ }
+
+ if (fwrite(query_buf->data, 1, ql, stream) != ql)
+ {
+ pg_log_error("%s: %m", fname);
+
+ if (fclose(stream) != 0)
+ pg_log_error("%s: %m", fname);
+
+ if (remove(fname) != 0)
+ pg_log_error("%s: %m", fname);
+
+ error = true;
+ }
+ else if (fclose(stream) != 0)
+ {
+ pg_log_error("%s: %m", fname);
+ if (remove(fname) != 0)
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+ else
+ {
+ struct utimbuf ut;
+
+ /*
+ * Try to set the file modification time of the temporary file
+ * a few seconds in the past. Otherwise, the low granularity
+ * (one second, or even worse on some filesystems) that we can
+ * portably measure with stat(2) could lead us to not
+ * recognize a modification, if the user typed very quickly.
+ *
+ * This is a rather unlikely race condition, so don't error
+ * out if the utime(2) call fails --- that would make the cure
+ * worse than the disease.
+ */
+ ut.modtime = ut.actime = time(NULL) - 2;
+ (void) utime(fname, &ut);
+ }
+ }
+ }
+
+ if (!error && stat(fname, &before) != 0)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+
+ /* call editor */
+ if (!error)
+ error = !editFile(fname, lineno);
+
+ if (!error && stat(fname, &after) != 0)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+
+ /* file was edited if the size or modification time has changed */
+ if (!error &&
+ (before.st_size != after.st_size ||
+ before.st_mtime != after.st_mtime))
+ {
+ stream = fopen(fname, PG_BINARY_R);
+ if (!stream)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+ else
+ {
+ /* read file back into query_buf */
+ char line[1024];
+
+ resetPQExpBuffer(query_buf);
+ while (fgets(line, sizeof(line), stream) != NULL)
+ appendPQExpBufferStr(query_buf, line);
+
+ if (ferror(stream))
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ resetPQExpBuffer(query_buf);
+ }
+ else if (edited)
+ {
+ *edited = true;
+ }
+
+ fclose(stream);
+ }
+ }
+ else
+ {
+ /*
+ * If the file was not modified, and the caller requested it, discard
+ * the query buffer.
+ */
+ if (discard_on_quit)
+ resetPQExpBuffer(query_buf);
+ }
+
+ /* remove temp file */
+ if (!filename_arg)
+ {
+ if (remove(fname) == -1)
+ {
+ pg_log_error("%s: %m", fname);
+ error = true;
+ }
+ }
+
+ return !error;
+}
+
+
+
+/*
+ * process_file
+ *
+ * Reads commands from filename and passes them to the main processing loop.
+ * Handler for \i and \ir, but can be used for other things as well. Returns
+ * MainLoop() error code.
+ *
+ * If use_relative_path is true and filename is not an absolute path, then open
+ * the file from where the currently processed file (if any) is located.
+ */
+int
+process_file(char *filename, bool use_relative_path)
+{
+ FILE *fd;
+ int result;
+ char *oldfilename;
+ char relpath[MAXPGPATH];
+
+ if (!filename)
+ {
+ fd = stdin;
+ filename = NULL;
+ }
+ else if (strcmp(filename, "-") != 0)
+ {
+ canonicalize_path(filename);
+
+ /*
+ * If we were asked to resolve the pathname relative to the location
+ * of the currently executing script, and there is one, and this is a
+ * relative pathname, then prepend all but the last pathname component
+ * of the current script to this pathname.
+ */
+ if (use_relative_path && pset.inputfile &&
+ !is_absolute_path(filename) && !has_drive_prefix(filename))
+ {
+ strlcpy(relpath, pset.inputfile, sizeof(relpath));
+ get_parent_directory(relpath);
+ join_path_components(relpath, relpath, filename);
+ canonicalize_path(relpath);
+
+ filename = relpath;
+ }
+
+ fd = fopen(filename, PG_BINARY_R);
+
+ if (!fd)
+ {
+ pg_log_error("%s: %m", filename);
+ return EXIT_FAILURE;
+ }
+ }
+ else
+ {
+ fd = stdin;
+ filename = "<stdin>"; /* for future error messages */
+ }
+
+ oldfilename = pset.inputfile;
+ pset.inputfile = filename;
+
+ pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
+
+ result = MainLoop(fd);
+
+ if (fd != stdin)
+ fclose(fd);
+
+ pset.inputfile = oldfilename;
+
+ pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
+
+ return result;
+}
+
+
+
+static const char *
+_align2string(enum printFormat in)
+{
+ switch (in)
+ {
+ case PRINT_NOTHING:
+ return "nothing";
+ break;
+ case PRINT_ALIGNED:
+ return "aligned";
+ break;
+ case PRINT_ASCIIDOC:
+ return "asciidoc";
+ break;
+ case PRINT_CSV:
+ return "csv";
+ break;
+ case PRINT_HTML:
+ return "html";
+ break;
+ case PRINT_LATEX:
+ return "latex";
+ break;
+ case PRINT_LATEX_LONGTABLE:
+ return "latex-longtable";
+ break;
+ case PRINT_TROFF_MS:
+ return "troff-ms";
+ break;
+ case PRINT_UNALIGNED:
+ return "unaligned";
+ break;
+ case PRINT_WRAPPED:
+ return "wrapped";
+ break;
+ }
+ return "unknown";
+}
+
+/*
+ * Parse entered Unicode linestyle. If ok, update *linestyle and return
+ * true, else return false.
+ */
+static bool
+set_unicode_line_style(const char *value, size_t vallen,
+ unicode_linestyle *linestyle)
+{
+ if (pg_strncasecmp("single", value, vallen) == 0)
+ *linestyle = UNICODE_LINESTYLE_SINGLE;
+ else if (pg_strncasecmp("double", value, vallen) == 0)
+ *linestyle = UNICODE_LINESTYLE_DOUBLE;
+ else
+ return false;
+ return true;
+}
+
+static const char *
+_unicode_linestyle2string(int linestyle)
+{
+ switch (linestyle)
+ {
+ case UNICODE_LINESTYLE_SINGLE:
+ return "single";
+ break;
+ case UNICODE_LINESTYLE_DOUBLE:
+ return "double";
+ break;
+ }
+ return "unknown";
+}
+
+/*
+ * do_pset
+ *
+ * Performs the assignment "param = value", where value could be NULL;
+ * for some params that has an effect such as inversion, for others
+ * it does nothing.
+ *
+ * Adjusts the state of the formatting options at *popt. (In practice that
+ * is always pset.popt, but maybe someday it could be different.)
+ *
+ * If successful and quiet is false, then invokes printPsetInfo() to report
+ * the change.
+ *
+ * Returns true if successful, else false (eg for invalid param or value).
+ */
+bool
+do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
+{
+ size_t vallen = 0;
+
+ Assert(param != NULL);
+
+ if (value)
+ vallen = strlen(value);
+
+ /* set format */
+ if (strcmp(param, "format") == 0)
+ {
+ static const struct fmt
+ {
+ const char *name;
+ enum printFormat number;
+ } formats[] =
+ {
+ /* remember to update error message below when adding more */
+ {"aligned", PRINT_ALIGNED},
+ {"asciidoc", PRINT_ASCIIDOC},
+ {"csv", PRINT_CSV},
+ {"html", PRINT_HTML},
+ {"latex", PRINT_LATEX},
+ {"troff-ms", PRINT_TROFF_MS},
+ {"unaligned", PRINT_UNALIGNED},
+ {"wrapped", PRINT_WRAPPED}
+ };
+
+ if (!value)
+ ;
+ else
+ {
+ int match_pos = -1;
+
+ for (int i = 0; i < lengthof(formats); i++)
+ {
+ if (pg_strncasecmp(formats[i].name, value, vallen) == 0)
+ {
+ if (match_pos < 0)
+ match_pos = i;
+ else
+ {
+ pg_log_error("\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"",
+ value,
+ formats[match_pos].name, formats[i].name);
+ return false;
+ }
+ }
+ }
+ if (match_pos >= 0)
+ popt->topt.format = formats[match_pos].number;
+ else if (pg_strncasecmp("latex-longtable", value, vallen) == 0)
+ {
+ /*
+ * We must treat latex-longtable specially because latex is a
+ * prefix of it; if both were in the table above, we'd think
+ * "latex" is ambiguous.
+ */
+ popt->topt.format = PRINT_LATEX_LONGTABLE;
+ }
+ else
+ {
+ pg_log_error("\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped");
+ return false;
+ }
+ }
+ }
+
+ /* set table line style */
+ else if (strcmp(param, "linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (pg_strncasecmp("ascii", value, vallen) == 0)
+ popt->topt.line_style = &pg_asciiformat;
+ else if (pg_strncasecmp("old-ascii", value, vallen) == 0)
+ popt->topt.line_style = &pg_asciiformat_old;
+ else if (pg_strncasecmp("unicode", value, vallen) == 0)
+ popt->topt.line_style = &pg_utf8format;
+ else
+ {
+ pg_log_error("\\pset: allowed line styles are ascii, old-ascii, unicode");
+ return false;
+ }
+ }
+
+ /* set unicode border line style */
+ else if (strcmp(param, "unicode_border_linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (set_unicode_line_style(value, vallen,
+ &popt->topt.unicode_border_linestyle))
+ refresh_utf8format(&(popt->topt));
+ else
+ {
+ pg_log_error("\\pset: allowed Unicode border line styles are single, double");
+ return false;
+ }
+ }
+
+ /* set unicode column line style */
+ else if (strcmp(param, "unicode_column_linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (set_unicode_line_style(value, vallen,
+ &popt->topt.unicode_column_linestyle))
+ refresh_utf8format(&(popt->topt));
+ else
+ {
+ pg_log_error("\\pset: allowed Unicode column line styles are single, double");
+ return false;
+ }
+ }
+
+ /* set unicode header line style */
+ else if (strcmp(param, "unicode_header_linestyle") == 0)
+ {
+ if (!value)
+ ;
+ else if (set_unicode_line_style(value, vallen,
+ &popt->topt.unicode_header_linestyle))
+ refresh_utf8format(&(popt->topt));
+ else
+ {
+ pg_log_error("\\pset: allowed Unicode header line styles are single, double");
+ return false;
+ }
+ }
+
+ /* set border style/width */
+ else if (strcmp(param, "border") == 0)
+ {
+ if (value)
+ popt->topt.border = atoi(value);
+ }
+
+ /* set expanded/vertical mode */
+ else if (strcmp(param, "x") == 0 ||
+ strcmp(param, "expanded") == 0 ||
+ strcmp(param, "vertical") == 0)
+ {
+ if (value && pg_strcasecmp(value, "auto") == 0)
+ popt->topt.expanded = 2;
+ else if (value)
+ {
+ bool on_off;
+
+ if (ParseVariableBool(value, NULL, &on_off))
+ popt->topt.expanded = on_off ? 1 : 0;
+ else
+ {
+ PsqlVarEnumError(param, value, "on, off, auto");
+ return false;
+ }
+ }
+ else
+ popt->topt.expanded = !popt->topt.expanded;
+ }
+
+ /* header line width in expanded mode */
+ else if (strcmp(param, "xheader_width") == 0)
+ {
+ if (!value)
+ ;
+ else if (pg_strcasecmp(value, "full") == 0)
+ popt->topt.expanded_header_width_type = PRINT_XHEADER_FULL;
+ else if (pg_strcasecmp(value, "column") == 0)
+ popt->topt.expanded_header_width_type = PRINT_XHEADER_COLUMN;
+ else if (pg_strcasecmp(value, "page") == 0)
+ popt->topt.expanded_header_width_type = PRINT_XHEADER_PAGE;
+ else
+ {
+ int intval = atoi(value);
+
+ if (intval == 0)
+ {
+ pg_log_error("\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width", "full", "column", "page");
+ return false;
+ }
+
+ popt->topt.expanded_header_width_type = PRINT_XHEADER_EXACT_WIDTH;
+ popt->topt.expanded_header_exact_width = intval;
+ }
+ }
+
+ /* field separator for CSV format */
+ else if (strcmp(param, "csv_fieldsep") == 0)
+ {
+ if (value)
+ {
+ /* CSV separator has to be a one-byte character */
+ if (strlen(value) != 1)
+ {
+ pg_log_error("\\pset: csv_fieldsep must be a single one-byte character");
+ return false;
+ }
+ if (value[0] == '"' || value[0] == '\n' || value[0] == '\r')
+ {
+ pg_log_error("\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return");
+ return false;
+ }
+ popt->topt.csvFieldSep[0] = value[0];
+ }
+ }
+
+ /* locale-aware numeric output */
+ else if (strcmp(param, "numericlocale") == 0)
+ {
+ if (value)
+ return ParseVariableBool(value, param, &popt->topt.numericLocale);
+ else
+ popt->topt.numericLocale = !popt->topt.numericLocale;
+ }
+
+ /* null display */
+ else if (strcmp(param, "null") == 0)
+ {
+ if (value)
+ {
+ free(popt->nullPrint);
+ popt->nullPrint = pg_strdup(value);
+ }
+ }
+
+ /* field separator for unaligned text */
+ else if (strcmp(param, "fieldsep") == 0)
+ {
+ if (value)
+ {
+ free(popt->topt.fieldSep.separator);
+ popt->topt.fieldSep.separator = pg_strdup(value);
+ popt->topt.fieldSep.separator_zero = false;
+ }
+ }
+
+ else if (strcmp(param, "fieldsep_zero") == 0)
+ {
+ free(popt->topt.fieldSep.separator);
+ popt->topt.fieldSep.separator = NULL;
+ popt->topt.fieldSep.separator_zero = true;
+ }
+
+ /* record separator for unaligned text */
+ else if (strcmp(param, "recordsep") == 0)
+ {
+ if (value)
+ {
+ free(popt->topt.recordSep.separator);
+ popt->topt.recordSep.separator = pg_strdup(value);
+ popt->topt.recordSep.separator_zero = false;
+ }
+ }
+
+ else if (strcmp(param, "recordsep_zero") == 0)
+ {
+ free(popt->topt.recordSep.separator);
+ popt->topt.recordSep.separator = NULL;
+ popt->topt.recordSep.separator_zero = true;
+ }
+
+ /* toggle between full and tuples-only format */
+ else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0)
+ {
+ if (value)
+ return ParseVariableBool(value, param, &popt->topt.tuples_only);
+ else
+ popt->topt.tuples_only = !popt->topt.tuples_only;
+ }
+
+ /* set title override */
+ else if (strcmp(param, "C") == 0 || strcmp(param, "title") == 0)
+ {
+ free(popt->title);
+ if (!value)
+ popt->title = NULL;
+ else
+ popt->title = pg_strdup(value);
+ }
+
+ /* set HTML table tag options */
+ else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0)
+ {
+ free(popt->topt.tableAttr);
+ if (!value)
+ popt->topt.tableAttr = NULL;
+ else
+ popt->topt.tableAttr = pg_strdup(value);
+ }
+
+ /* toggle use of pager */
+ else if (strcmp(param, "pager") == 0)
+ {
+ if (value && pg_strcasecmp(value, "always") == 0)
+ popt->topt.pager = 2;
+ else if (value)
+ {
+ bool on_off;
+
+ if (!ParseVariableBool(value, NULL, &on_off))
+ {
+ PsqlVarEnumError(param, value, "on, off, always");
+ return false;
+ }
+ popt->topt.pager = on_off ? 1 : 0;
+ }
+ else if (popt->topt.pager == 1)
+ popt->topt.pager = 0;
+ else
+ popt->topt.pager = 1;
+ }
+
+ /* set minimum lines for pager use */
+ else if (strcmp(param, "pager_min_lines") == 0)
+ {
+ if (value &&
+ !ParseVariableNum(value, "pager_min_lines", &popt->topt.pager_min_lines))
+ return false;
+ }
+
+ /* disable "(x rows)" footer */
+ else if (strcmp(param, "footer") == 0)
+ {
+ if (value)
+ return ParseVariableBool(value, param, &popt->topt.default_footer);
+ else
+ popt->topt.default_footer = !popt->topt.default_footer;
+ }
+
+ /* set border style/width */
+ else if (strcmp(param, "columns") == 0)
+ {
+ if (value)
+ popt->topt.columns = atoi(value);
+ }
+ else
+ {
+ pg_log_error("\\pset: unknown option: %s", param);
+ return false;
+ }
+
+ if (!quiet)
+ printPsetInfo(param, &pset.popt);
+
+ return true;
+}
+
+/*
+ * printPsetInfo: print the state of the "param" formatting parameter in popt.
+ */
+static bool
+printPsetInfo(const char *param, printQueryOpt *popt)
+{
+ Assert(param != NULL);
+
+ /* show border style/width */
+ if (strcmp(param, "border") == 0)
+ printf(_("Border style is %d.\n"), popt->topt.border);
+
+ /* show the target width for the wrapped format */
+ else if (strcmp(param, "columns") == 0)
+ {
+ if (!popt->topt.columns)
+ printf(_("Target width is unset.\n"));
+ else
+ printf(_("Target width is %d.\n"), popt->topt.columns);
+ }
+
+ /* show expanded/vertical mode */
+ else if (strcmp(param, "x") == 0 || strcmp(param, "expanded") == 0 || strcmp(param, "vertical") == 0)
+ {
+ if (popt->topt.expanded == 1)
+ printf(_("Expanded display is on.\n"));
+ else if (popt->topt.expanded == 2)
+ printf(_("Expanded display is used automatically.\n"));
+ else
+ printf(_("Expanded display is off.\n"));
+ }
+
+ /* show xheader width value */
+ else if (strcmp(param, "xheader_width") == 0)
+ {
+ if (popt->topt.expanded_header_width_type == PRINT_XHEADER_FULL)
+ printf(_("Expanded header width is \"%s\".\n"), "full");
+ else if (popt->topt.expanded_header_width_type == PRINT_XHEADER_COLUMN)
+ printf(_("Expanded header width is \"%s\".\n"), "column");
+ else if (popt->topt.expanded_header_width_type == PRINT_XHEADER_PAGE)
+ printf(_("Expanded header width is \"%s\".\n"), "page");
+ else if (popt->topt.expanded_header_width_type == PRINT_XHEADER_EXACT_WIDTH)
+ printf(_("Expanded header width is %d.\n"), popt->topt.expanded_header_exact_width);
+ }
+
+ /* show field separator for CSV format */
+ else if (strcmp(param, "csv_fieldsep") == 0)
+ {
+ printf(_("Field separator for CSV is \"%s\".\n"),
+ popt->topt.csvFieldSep);
+ }
+
+ /* show field separator for unaligned text */
+ else if (strcmp(param, "fieldsep") == 0)
+ {
+ if (popt->topt.fieldSep.separator_zero)
+ printf(_("Field separator is zero byte.\n"));
+ else
+ printf(_("Field separator is \"%s\".\n"),
+ popt->topt.fieldSep.separator);
+ }
+
+ else if (strcmp(param, "fieldsep_zero") == 0)
+ {
+ printf(_("Field separator is zero byte.\n"));
+ }
+
+ /* show disable "(x rows)" footer */
+ else if (strcmp(param, "footer") == 0)
+ {
+ if (popt->topt.default_footer)
+ printf(_("Default footer is on.\n"));
+ else
+ printf(_("Default footer is off.\n"));
+ }
+
+ /* show format */
+ else if (strcmp(param, "format") == 0)
+ {
+ printf(_("Output format is %s.\n"), _align2string(popt->topt.format));
+ }
+
+ /* show table line style */
+ else if (strcmp(param, "linestyle") == 0)
+ {
+ printf(_("Line style is %s.\n"),
+ get_line_style(&popt->topt)->name);
+ }
+
+ /* show null display */
+ else if (strcmp(param, "null") == 0)
+ {
+ printf(_("Null display is \"%s\".\n"),
+ popt->nullPrint ? popt->nullPrint : "");
+ }
+
+ /* show locale-aware numeric output */
+ else if (strcmp(param, "numericlocale") == 0)
+ {
+ if (popt->topt.numericLocale)
+ printf(_("Locale-adjusted numeric output is on.\n"));
+ else
+ printf(_("Locale-adjusted numeric output is off.\n"));
+ }
+
+ /* show toggle use of pager */
+ else if (strcmp(param, "pager") == 0)
+ {
+ if (popt->topt.pager == 1)
+ printf(_("Pager is used for long output.\n"));
+ else if (popt->topt.pager == 2)
+ printf(_("Pager is always used.\n"));
+ else
+ printf(_("Pager usage is off.\n"));
+ }
+
+ /* show minimum lines for pager use */
+ else if (strcmp(param, "pager_min_lines") == 0)
+ {
+ printf(ngettext("Pager won't be used for less than %d line.\n",
+ "Pager won't be used for less than %d lines.\n",
+ popt->topt.pager_min_lines),
+ popt->topt.pager_min_lines);
+ }
+
+ /* show record separator for unaligned text */
+ else if (strcmp(param, "recordsep") == 0)
+ {
+ if (popt->topt.recordSep.separator_zero)
+ printf(_("Record separator is zero byte.\n"));
+ else if (strcmp(popt->topt.recordSep.separator, "\n") == 0)
+ printf(_("Record separator is <newline>.\n"));
+ else
+ printf(_("Record separator is \"%s\".\n"),
+ popt->topt.recordSep.separator);
+ }
+
+ else if (strcmp(param, "recordsep_zero") == 0)
+ {
+ printf(_("Record separator is zero byte.\n"));
+ }
+
+ /* show HTML table tag options */
+ else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0)
+ {
+ if (popt->topt.tableAttr)
+ printf(_("Table attributes are \"%s\".\n"),
+ popt->topt.tableAttr);
+ else
+ printf(_("Table attributes unset.\n"));
+ }
+
+ /* show title override */
+ else if (strcmp(param, "C") == 0 || strcmp(param, "title") == 0)
+ {
+ if (popt->title)
+ printf(_("Title is \"%s\".\n"), popt->title);
+ else
+ printf(_("Title is unset.\n"));
+ }
+
+ /* show toggle between full and tuples-only format */
+ else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0)
+ {
+ if (popt->topt.tuples_only)
+ printf(_("Tuples only is on.\n"));
+ else
+ printf(_("Tuples only is off.\n"));
+ }
+
+ /* Unicode style formatting */
+ else if (strcmp(param, "unicode_border_linestyle") == 0)
+ {
+ printf(_("Unicode border line style is \"%s\".\n"),
+ _unicode_linestyle2string(popt->topt.unicode_border_linestyle));
+ }
+
+ else if (strcmp(param, "unicode_column_linestyle") == 0)
+ {
+ printf(_("Unicode column line style is \"%s\".\n"),
+ _unicode_linestyle2string(popt->topt.unicode_column_linestyle));
+ }
+
+ else if (strcmp(param, "unicode_header_linestyle") == 0)
+ {
+ printf(_("Unicode header line style is \"%s\".\n"),
+ _unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+ }
+
+ else
+ {
+ pg_log_error("\\pset: unknown option: %s", param);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * savePsetInfo: make a malloc'd copy of the data in *popt.
+ *
+ * Possibly this should be somewhere else, but it's a bit specific to psql.
+ */
+printQueryOpt *
+savePsetInfo(const printQueryOpt *popt)
+{
+ printQueryOpt *save;
+
+ save = (printQueryOpt *) pg_malloc(sizeof(printQueryOpt));
+
+ /* Flat-copy all the scalar fields, then duplicate sub-structures. */
+ memcpy(save, popt, sizeof(printQueryOpt));
+
+ /* topt.line_style points to const data that need not be duplicated */
+ if (popt->topt.fieldSep.separator)
+ save->topt.fieldSep.separator = pg_strdup(popt->topt.fieldSep.separator);
+ if (popt->topt.recordSep.separator)
+ save->topt.recordSep.separator = pg_strdup(popt->topt.recordSep.separator);
+ if (popt->topt.tableAttr)
+ save->topt.tableAttr = pg_strdup(popt->topt.tableAttr);
+ if (popt->nullPrint)
+ save->nullPrint = pg_strdup(popt->nullPrint);
+ if (popt->title)
+ save->title = pg_strdup(popt->title);
+
+ /*
+ * footers and translate_columns are never set in psql's print settings,
+ * so we needn't write code to duplicate them.
+ */
+ Assert(popt->footers == NULL);
+ Assert(popt->translate_columns == NULL);
+
+ return save;
+}
+
+/*
+ * restorePsetInfo: restore *popt from the previously-saved copy *save,
+ * then free *save.
+ */
+void
+restorePsetInfo(printQueryOpt *popt, printQueryOpt *save)
+{
+ /* Free all the old data we're about to overwrite the pointers to. */
+
+ /* topt.line_style points to const data that need not be duplicated */
+ free(popt->topt.fieldSep.separator);
+ free(popt->topt.recordSep.separator);
+ free(popt->topt.tableAttr);
+ free(popt->nullPrint);
+ free(popt->title);
+
+ /*
+ * footers and translate_columns are never set in psql's print settings,
+ * so we needn't write code to duplicate them.
+ */
+ Assert(popt->footers == NULL);
+ Assert(popt->translate_columns == NULL);
+
+ /* Now we may flat-copy all the fields, including pointers. */
+ memcpy(popt, save, sizeof(printQueryOpt));
+
+ /* Lastly, free "save" ... but its sub-structures now belong to popt. */
+ free(save);
+}
+
+static const char *
+pset_bool_string(bool val)
+{
+ return val ? "on" : "off";
+}
+
+
+static char *
+pset_quoted_string(const char *str)
+{
+ char *ret = pg_malloc(strlen(str) * 2 + 3);
+ char *r = ret;
+
+ *r++ = '\'';
+
+ for (; *str; str++)
+ {
+ if (*str == '\n')
+ {
+ *r++ = '\\';
+ *r++ = 'n';
+ }
+ else if (*str == '\'')
+ {
+ *r++ = '\\';
+ *r++ = '\'';
+ }
+ else
+ *r++ = *str;
+ }
+
+ *r++ = '\'';
+ *r = '\0';
+
+ return ret;
+}
+
+
+/*
+ * Return a malloc'ed string for the \pset value.
+ *
+ * Note that for some string parameters, print.c distinguishes between unset
+ * and empty string, but for others it doesn't. This function should produce
+ * output that produces the correct setting when fed back into \pset.
+ */
+static char *
+pset_value_string(const char *param, printQueryOpt *popt)
+{
+ Assert(param != NULL);
+
+ if (strcmp(param, "border") == 0)
+ return psprintf("%d", popt->topt.border);
+ else if (strcmp(param, "columns") == 0)
+ return psprintf("%d", popt->topt.columns);
+ else if (strcmp(param, "csv_fieldsep") == 0)
+ return pset_quoted_string(popt->topt.csvFieldSep);
+ else if (strcmp(param, "expanded") == 0)
+ return pstrdup(popt->topt.expanded == 2
+ ? "auto"
+ : pset_bool_string(popt->topt.expanded));
+ else if (strcmp(param, "fieldsep") == 0)
+ return pset_quoted_string(popt->topt.fieldSep.separator
+ ? popt->topt.fieldSep.separator
+ : "");
+ else if (strcmp(param, "fieldsep_zero") == 0)
+ return pstrdup(pset_bool_string(popt->topt.fieldSep.separator_zero));
+ else if (strcmp(param, "footer") == 0)
+ return pstrdup(pset_bool_string(popt->topt.default_footer));
+ else if (strcmp(param, "format") == 0)
+ return pstrdup(_align2string(popt->topt.format));
+ else if (strcmp(param, "linestyle") == 0)
+ return pstrdup(get_line_style(&popt->topt)->name);
+ else if (strcmp(param, "null") == 0)
+ return pset_quoted_string(popt->nullPrint
+ ? popt->nullPrint
+ : "");
+ else if (strcmp(param, "numericlocale") == 0)
+ return pstrdup(pset_bool_string(popt->topt.numericLocale));
+ else if (strcmp(param, "pager") == 0)
+ return psprintf("%d", popt->topt.pager);
+ else if (strcmp(param, "pager_min_lines") == 0)
+ return psprintf("%d", popt->topt.pager_min_lines);
+ else if (strcmp(param, "recordsep") == 0)
+ return pset_quoted_string(popt->topt.recordSep.separator
+ ? popt->topt.recordSep.separator
+ : "");
+ else if (strcmp(param, "recordsep_zero") == 0)
+ return pstrdup(pset_bool_string(popt->topt.recordSep.separator_zero));
+ else if (strcmp(param, "tableattr") == 0)
+ return popt->topt.tableAttr ? pset_quoted_string(popt->topt.tableAttr) : pstrdup("");
+ else if (strcmp(param, "title") == 0)
+ return popt->title ? pset_quoted_string(popt->title) : pstrdup("");
+ else if (strcmp(param, "tuples_only") == 0)
+ return pstrdup(pset_bool_string(popt->topt.tuples_only));
+ else if (strcmp(param, "unicode_border_linestyle") == 0)
+ return pstrdup(_unicode_linestyle2string(popt->topt.unicode_border_linestyle));
+ else if (strcmp(param, "unicode_column_linestyle") == 0)
+ return pstrdup(_unicode_linestyle2string(popt->topt.unicode_column_linestyle));
+ else if (strcmp(param, "unicode_header_linestyle") == 0)
+ return pstrdup(_unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+ else if (strcmp(param, "xheader_width") == 0)
+ {
+ if (popt->topt.expanded_header_width_type == PRINT_XHEADER_FULL)
+ return pstrdup("full");
+ else if (popt->topt.expanded_header_width_type == PRINT_XHEADER_COLUMN)
+ return pstrdup("column");
+ else if (popt->topt.expanded_header_width_type == PRINT_XHEADER_PAGE)
+ return pstrdup("page");
+ else
+ {
+ /* must be PRINT_XHEADER_EXACT_WIDTH */
+ char wbuff[32];
+
+ snprintf(wbuff, sizeof(wbuff), "%d",
+ popt->topt.expanded_header_exact_width);
+ return pstrdup(wbuff);
+ }
+ }
+ else
+ return pstrdup("ERROR");
+}
+
+
+
+#ifndef WIN32
+#define DEFAULT_SHELL "/bin/sh"
+#else
+/*
+ * CMD.EXE is in different places in different Win32 releases so we
+ * have to rely on the path to find it.
+ */
+#define DEFAULT_SHELL "cmd.exe"
+#endif
+
+static bool
+do_shell(const char *command)
+{
+ int result;
+
+ fflush(NULL);
+ if (!command)
+ {
+ char *sys;
+ const char *shellName;
+
+ shellName = getenv("SHELL");
+#ifdef WIN32
+ if (shellName == NULL)
+ shellName = getenv("COMSPEC");
+#endif
+ if (shellName == NULL)
+ shellName = DEFAULT_SHELL;
+
+ /* See EDITOR handling comment for an explanation */
+#ifndef WIN32
+ sys = psprintf("exec %s", shellName);
+#else
+ sys = psprintf("\"%s\"", shellName);
+#endif
+ result = system(sys);
+ free(sys);
+ }
+ else
+ result = system(command);
+
+ SetShellResultVariables(result);
+
+ if (result == 127 || result == -1)
+ {
+ pg_log_error("\\!: failed");
+ return false;
+ }
+ return true;
+}
+
+/*
+ * do_watch -- handler for \watch
+ *
+ * We break this out of exec_command to avoid having to plaster "volatile"
+ * onto a bunch of exec_command's variables to silence stupider compilers.
+ */
+static bool
+do_watch(PQExpBuffer query_buf, double sleep, int iter)
+{
+ long sleep_ms = (long) (sleep * 1000);
+ printQueryOpt myopt = pset.popt;
+ const char *strftime_fmt;
+ const char *user_title;
+ char *title;
+ const char *pagerprog = NULL;
+ FILE *pagerpipe = NULL;
+ int title_len;
+ int res = 0;
+#ifndef WIN32
+ sigset_t sigalrm_sigchld_sigint;
+ sigset_t sigalrm_sigchld;
+ sigset_t sigint;
+ struct itimerval interval;
+ bool done = false;
+#endif
+
+ if (!query_buf || query_buf->len <= 0)
+ {
+ pg_log_error("\\watch cannot be used with an empty query");
+ return false;
+ }
+
+#ifndef WIN32
+ sigemptyset(&sigalrm_sigchld_sigint);
+ sigaddset(&sigalrm_sigchld_sigint, SIGCHLD);
+ sigaddset(&sigalrm_sigchld_sigint, SIGALRM);
+ sigaddset(&sigalrm_sigchld_sigint, SIGINT);
+
+ sigemptyset(&sigalrm_sigchld);
+ sigaddset(&sigalrm_sigchld, SIGCHLD);
+ sigaddset(&sigalrm_sigchld, SIGALRM);
+
+ sigemptyset(&sigint);
+ sigaddset(&sigint, SIGINT);
+
+ /*
+ * Block SIGALRM and SIGCHLD before we start the timer and the pager (if
+ * configured), to avoid races. sigwait() will receive them.
+ */
+ sigprocmask(SIG_BLOCK, &sigalrm_sigchld, NULL);
+
+ /*
+ * Set a timer to interrupt sigwait() so we can run the query at the
+ * requested intervals.
+ */
+ interval.it_value.tv_sec = sleep_ms / 1000;
+ interval.it_value.tv_usec = (sleep_ms % 1000) * 1000;
+ interval.it_interval = interval.it_value;
+ if (setitimer(ITIMER_REAL, &interval, NULL) < 0)
+ {
+ pg_log_error("could not set timer: %m");
+ done = true;
+ }
+#endif
+
+ /*
+ * For \watch, we ignore the size of the result and always use the pager
+ * as long as we're talking to a terminal and "\pset pager" is enabled.
+ * However, we'll only use the pager identified by PSQL_WATCH_PAGER. We
+ * ignore the regular PSQL_PAGER or PAGER environment variables, because
+ * traditional pagers probably won't be very useful for showing a stream
+ * of results.
+ */
+#ifndef WIN32
+ pagerprog = getenv("PSQL_WATCH_PAGER");
+ /* if variable is empty or all-white-space, don't use pager */
+ if (pagerprog && strspn(pagerprog, " \t\r\n") == strlen(pagerprog))
+ pagerprog = NULL;
+#endif
+ if (pagerprog && myopt.topt.pager &&
+ isatty(fileno(stdin)) && isatty(fileno(stdout)))
+ {
+ fflush(NULL);
+ disable_sigpipe_trap();
+ pagerpipe = popen(pagerprog, "w");
+
+ if (!pagerpipe)
+ /* silently proceed without pager */
+ restore_sigpipe_trap();
+ }
+
+ /*
+ * Choose format for timestamps. We might eventually make this a \pset
+ * option. In the meantime, using a variable for the format suppresses
+ * overly-anal-retentive gcc warnings about %c being Y2K sensitive.
+ */
+ strftime_fmt = "%c";
+
+ /*
+ * Set up rendering options, in particular, disable the pager unless
+ * PSQL_WATCH_PAGER was successfully launched.
+ */
+ if (!pagerpipe)
+ myopt.topt.pager = 0;
+
+
+ /*
+ * If there's a title in the user configuration, make sure we have room
+ * for it in the title buffer. Allow 128 bytes for the timestamp plus 128
+ * bytes for the rest.
+ */
+ user_title = myopt.title;
+ title_len = (user_title ? strlen(user_title) : 0) + 256;
+ title = pg_malloc(title_len);
+
+ for (;;)
+ {
+ time_t timer;
+ char timebuf[128];
+
+ /*
+ * Prepare title for output. Note that we intentionally include a
+ * newline at the end of the title; this is somewhat historical but it
+ * makes for reasonably nicely formatted output in simple cases.
+ */
+ timer = time(NULL);
+ strftime(timebuf, sizeof(timebuf), strftime_fmt, localtime(&timer));
+
+ if (user_title)
+ snprintf(title, title_len, _("%s\t%s (every %gs)\n"),
+ user_title, timebuf, sleep);
+ else
+ snprintf(title, title_len, _("%s (every %gs)\n"),
+ timebuf, sleep);
+ myopt.title = title;
+
+ /* Run the query and print out the result */
+ res = PSQLexecWatch(query_buf->data, &myopt, pagerpipe);
+
+ /*
+ * PSQLexecWatch handles the case where we can no longer repeat the
+ * query, and returns 0 or -1.
+ */
+ if (res <= 0)
+ break;
+
+ /* If we have iteration count, check that it's not exceeded yet */
+ if (iter && (--iter <= 0))
+ break;
+
+ if (pagerpipe && ferror(pagerpipe))
+ break;
+
+ if (sleep == 0)
+ continue;
+
+#ifdef WIN32
+
+ /*
+ * Set up cancellation of 'watch' via SIGINT. We redo this each time
+ * through the loop since it's conceivable something inside
+ * PSQLexecWatch could change sigint_interrupt_jmp.
+ */
+ if (sigsetjmp(sigint_interrupt_jmp, 1) != 0)
+ break;
+
+ /*
+ * Enable 'watch' cancellations and wait a while before running the
+ * query again. Break the sleep into short intervals (at most 1s).
+ */
+ sigint_interrupt_enabled = true;
+ for (long i = sleep_ms; i > 0;)
+ {
+ long s = Min(i, 1000L);
+
+ pg_usleep(s * 1000L);
+ if (cancel_pressed)
+ break;
+ i -= s;
+ }
+ sigint_interrupt_enabled = false;
+#else
+ /* sigwait() will handle SIGINT. */
+ sigprocmask(SIG_BLOCK, &sigint, NULL);
+ if (cancel_pressed)
+ done = true;
+
+ /* Wait for SIGINT, SIGCHLD or SIGALRM. */
+ while (!done)
+ {
+ int signal_received;
+
+ errno = sigwait(&sigalrm_sigchld_sigint, &signal_received);
+ if (errno != 0)
+ {
+ /* Some other signal arrived? */
+ if (errno == EINTR)
+ continue;
+ else
+ {
+ pg_log_error("could not wait for signals: %m");
+ done = true;
+ break;
+ }
+ }
+ /* On ^C or pager exit, it's time to stop running the query. */
+ if (signal_received == SIGINT || signal_received == SIGCHLD)
+ done = true;
+ /* Otherwise, we must have SIGALRM. Time to run the query again. */
+ break;
+ }
+
+ /* Unblock SIGINT so that slow queries can be interrupted. */
+ sigprocmask(SIG_UNBLOCK, &sigint, NULL);
+ if (done)
+ break;
+#endif
+ }
+
+ if (pagerpipe)
+ {
+ pclose(pagerpipe);
+ restore_sigpipe_trap();
+ }
+ else
+ {
+ /*
+ * If the terminal driver echoed "^C", libedit/libreadline might be
+ * confused about the cursor position. Therefore, inject a newline
+ * before the next prompt is displayed. We only do this when not
+ * using a pager, because pagers are expected to restore the screen to
+ * a sane state on exit.
+ */
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ }
+
+#ifndef WIN32
+ /* Disable the interval timer. */
+ memset(&interval, 0, sizeof(interval));
+ setitimer(ITIMER_REAL, &interval, NULL);
+ /* Unblock SIGINT, SIGCHLD and SIGALRM. */
+ sigprocmask(SIG_UNBLOCK, &sigalrm_sigchld_sigint, NULL);
+#endif
+
+ pg_free(title);
+ return (res >= 0);
+}
+
+/*
+ * a little code borrowed from PSQLexec() to manage ECHO_HIDDEN output.
+ * returns true unless we have ECHO_HIDDEN_NOEXEC.
+ */
+static bool
+echo_hidden_command(const char *query)
+{
+ if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF)
+ {
+ printf(_("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(stdout);
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ if (pset.echo_hidden == PSQL_ECHO_HIDDEN_NOEXEC)
+ return false;
+ }
+ return true;
+}
+
+/*
+ * Look up the object identified by obj_type and desc. If successful,
+ * store its OID in *obj_oid and return true, else return false.
+ *
+ * Note that we'll fail if the object doesn't exist OR if there are multiple
+ * matching candidates OR if there's something syntactically wrong with the
+ * object description; unfortunately it can be hard to tell the difference.
+ */
+static bool
+lookup_object_oid(EditableObjectType obj_type, const char *desc,
+ Oid *obj_oid)
+{
+ bool result = true;
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+
+ switch (obj_type)
+ {
+ case EditableFunction:
+
+ /*
+ * We have a function description, e.g. "x" or "x(int)". Issue a
+ * query to retrieve the function's OID using a cast to regproc or
+ * regprocedure (as appropriate).
+ */
+ appendPQExpBufferStr(query, "SELECT ");
+ appendStringLiteralConn(query, desc, pset.db);
+ appendPQExpBuffer(query, "::pg_catalog.%s::pg_catalog.oid",
+ strchr(desc, '(') ? "regprocedure" : "regproc");
+ break;
+
+ case EditableView:
+
+ /*
+ * Convert view name (possibly schema-qualified) to OID. Note:
+ * this code doesn't check if the relation is actually a view.
+ * We'll detect that in get_create_object_cmd().
+ */
+ appendPQExpBufferStr(query, "SELECT ");
+ appendStringLiteralConn(query, desc, pset.db);
+ appendPQExpBufferStr(query, "::pg_catalog.regclass::pg_catalog.oid");
+ break;
+ }
+
+ if (!echo_hidden_command(query->data))
+ {
+ destroyPQExpBuffer(query);
+ return false;
+ }
+ res = PQexec(pset.db, query->data);
+ if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
+ *obj_oid = atooid(PQgetvalue(res, 0, 0));
+ else
+ {
+ minimal_error_message(res);
+ result = false;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ return result;
+}
+
+/*
+ * Construct a "CREATE OR REPLACE ..." command that describes the specified
+ * database object. If successful, the result is stored in buf.
+ */
+static bool
+get_create_object_cmd(EditableObjectType obj_type, Oid oid,
+ PQExpBuffer buf)
+{
+ bool result = true;
+ PQExpBuffer query = createPQExpBuffer();
+ PGresult *res;
+
+ switch (obj_type)
+ {
+ case EditableFunction:
+ printfPQExpBuffer(query,
+ "SELECT pg_catalog.pg_get_functiondef(%u)",
+ oid);
+ break;
+
+ case EditableView:
+
+ /*
+ * pg_get_viewdef() just prints the query, so we must prepend
+ * CREATE for ourselves. We must fully qualify the view name to
+ * ensure the right view gets replaced. Also, check relation kind
+ * to be sure it's a view.
+ *
+ * Starting with PG 9.4, views may have WITH [LOCAL|CASCADED]
+ * CHECK OPTION. These are not part of the view definition
+ * returned by pg_get_viewdef() and so need to be retrieved
+ * separately. Materialized views (introduced in 9.3) may have
+ * arbitrary storage parameter reloptions.
+ */
+ if (pset.sversion >= 90400)
+ {
+ printfPQExpBuffer(query,
+ "SELECT nspname, relname, relkind, "
+ "pg_catalog.pg_get_viewdef(c.oid, true), "
+ "pg_catalog.array_remove(pg_catalog.array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
+ "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
+ "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption "
+ "FROM pg_catalog.pg_class c "
+ "LEFT JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid WHERE c.oid = %u",
+ oid);
+ }
+ else
+ {
+ printfPQExpBuffer(query,
+ "SELECT nspname, relname, relkind, "
+ "pg_catalog.pg_get_viewdef(c.oid, true), "
+ "c.reloptions AS reloptions, "
+ "NULL AS checkoption "
+ "FROM pg_catalog.pg_class c "
+ "LEFT JOIN pg_catalog.pg_namespace n "
+ "ON c.relnamespace = n.oid WHERE c.oid = %u",
+ oid);
+ }
+ break;
+ }
+
+ if (!echo_hidden_command(query->data))
+ {
+ destroyPQExpBuffer(query);
+ return false;
+ }
+ res = PQexec(pset.db, query->data);
+ if (PQresultStatus(res) == PGRES_TUPLES_OK && PQntuples(res) == 1)
+ {
+ resetPQExpBuffer(buf);
+ switch (obj_type)
+ {
+ case EditableFunction:
+ appendPQExpBufferStr(buf, PQgetvalue(res, 0, 0));
+ break;
+
+ case EditableView:
+ {
+ char *nspname = PQgetvalue(res, 0, 0);
+ char *relname = PQgetvalue(res, 0, 1);
+ char *relkind = PQgetvalue(res, 0, 2);
+ char *viewdef = PQgetvalue(res, 0, 3);
+ char *reloptions = PQgetvalue(res, 0, 4);
+ char *checkoption = PQgetvalue(res, 0, 5);
+
+ /*
+ * If the backend ever supports CREATE OR REPLACE
+ * MATERIALIZED VIEW, allow that here; but as of today it
+ * does not, so editing a matview definition in this way
+ * is impossible.
+ */
+ switch (relkind[0])
+ {
+#ifdef NOT_USED
+ case RELKIND_MATVIEW:
+ appendPQExpBufferStr(buf, "CREATE OR REPLACE MATERIALIZED VIEW ");
+ break;
+#endif
+ case RELKIND_VIEW:
+ appendPQExpBufferStr(buf, "CREATE OR REPLACE VIEW ");
+ break;
+ default:
+ pg_log_error("\"%s.%s\" is not a view",
+ nspname, relname);
+ result = false;
+ break;
+ }
+ appendPQExpBuffer(buf, "%s.", fmtId(nspname));
+ appendPQExpBufferStr(buf, fmtId(relname));
+
+ /* reloptions, if not an empty array "{}" */
+ if (reloptions != NULL && strlen(reloptions) > 2)
+ {
+ appendPQExpBufferStr(buf, "\n WITH (");
+ if (!appendReloptionsArray(buf, reloptions, "",
+ pset.encoding,
+ standard_strings()))
+ {
+ pg_log_error("could not parse reloptions array");
+ result = false;
+ }
+ appendPQExpBufferChar(buf, ')');
+ }
+
+ /* View definition from pg_get_viewdef (a SELECT query) */
+ appendPQExpBuffer(buf, " AS\n%s", viewdef);
+
+ /* Get rid of the semicolon that pg_get_viewdef appends */
+ if (buf->len > 0 && buf->data[buf->len - 1] == ';')
+ buf->data[--(buf->len)] = '\0';
+
+ /* WITH [LOCAL|CASCADED] CHECK OPTION */
+ if (checkoption && checkoption[0] != '\0')
+ appendPQExpBuffer(buf, "\n WITH %s CHECK OPTION",
+ checkoption);
+ }
+ break;
+ }
+ /* Make sure result ends with a newline */
+ if (buf->len > 0 && buf->data[buf->len - 1] != '\n')
+ appendPQExpBufferChar(buf, '\n');
+ }
+ else
+ {
+ minimal_error_message(res);
+ result = false;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+
+ return result;
+}
+
+/*
+ * If the given argument of \ef or \ev ends with a line number, delete the line
+ * number from the argument string and return it as an integer. (We need
+ * this kluge because we're too lazy to parse \ef's function or \ev's view
+ * argument carefully --- we just slop it up in OT_WHOLE_LINE mode.)
+ *
+ * Returns -1 if no line number is present, 0 on error, or a positive value
+ * on success.
+ */
+static int
+strip_lineno_from_objdesc(char *obj)
+{
+ char *c;
+ int lineno;
+
+ if (!obj || obj[0] == '\0')
+ return -1;
+
+ c = obj + strlen(obj) - 1;
+
+ /*
+ * This business of parsing backwards is dangerous as can be in a
+ * multibyte environment: there is no reason to believe that we are
+ * looking at the first byte of a character, nor are we necessarily
+ * working in a "safe" encoding. Fortunately the bitpatterns we are
+ * looking for are unlikely to occur as non-first bytes, but beware of
+ * trying to expand the set of cases that can be recognized. We must
+ * guard the <ctype.h> macros by using isascii() first, too.
+ */
+
+ /* skip trailing whitespace */
+ while (c > obj && isascii((unsigned char) *c) && isspace((unsigned char) *c))
+ c--;
+
+ /* must have a digit as last non-space char */
+ if (c == obj || !isascii((unsigned char) *c) || !isdigit((unsigned char) *c))
+ return -1;
+
+ /* find start of digit string */
+ while (c > obj && isascii((unsigned char) *c) && isdigit((unsigned char) *c))
+ c--;
+
+ /* digits must be separated from object name by space or closing paren */
+ /* notice also that we are not allowing an empty object name ... */
+ if (c == obj || !isascii((unsigned char) *c) ||
+ !(isspace((unsigned char) *c) || *c == ')'))
+ return -1;
+
+ /* parse digit string */
+ c++;
+ lineno = atoi(c);
+ if (lineno < 1)
+ {
+ pg_log_error("invalid line number: %s", c);
+ return 0;
+ }
+
+ /* strip digit string from object name */
+ *c = '\0';
+
+ return lineno;
+}
+
+/*
+ * Count number of lines in the buffer.
+ * This is used to test if pager is needed or not.
+ */
+static int
+count_lines_in_buf(PQExpBuffer buf)
+{
+ int lineno = 0;
+ const char *lines = buf->data;
+
+ while (*lines != '\0')
+ {
+ lineno++;
+ /* find start of next line */
+ lines = strchr(lines, '\n');
+ if (!lines)
+ break;
+ lines++;
+ }
+
+ return lineno;
+}
+
+/*
+ * Write text at *lines to output with line numbers.
+ *
+ * For functions, lineno "1" should correspond to the first line of the
+ * function body; lines before that are unnumbered. We expect that
+ * pg_get_functiondef() will emit that on a line beginning with "AS ",
+ * "BEGIN ", or "RETURN ", and that there can be no such line before
+ * the real start of the function body.
+ *
+ * Caution: this scribbles on *lines.
+ */
+static void
+print_with_linenumbers(FILE *output, char *lines, bool is_func)
+{
+ bool in_header = is_func;
+ int lineno = 0;
+
+ while (*lines != '\0')
+ {
+ char *eol;
+
+ if (in_header &&
+ (strncmp(lines, "AS ", 3) == 0 ||
+ strncmp(lines, "BEGIN ", 6) == 0 ||
+ strncmp(lines, "RETURN ", 7) == 0))
+ in_header = false;
+
+ /* increment lineno only for body's lines */
+ if (!in_header)
+ lineno++;
+
+ /* find and mark end of current line */
+ eol = strchr(lines, '\n');
+ if (eol != NULL)
+ *eol = '\0';
+
+ /* show current line as appropriate */
+ if (in_header)
+ fprintf(output, " %s\n", lines);
+ else
+ fprintf(output, "%-7d %s\n", lineno, lines);
+
+ /* advance to next line, if any */
+ if (eol == NULL)
+ break;
+ lines = ++eol;
+ }
+}
+
+/*
+ * Report just the primary error; this is to avoid cluttering the output
+ * with, for instance, a redisplay of the internally generated query
+ */
+static void
+minimal_error_message(PGresult *res)
+{
+ PQExpBuffer msg;
+ const char *fld;
+
+ msg = createPQExpBuffer();
+
+ fld = PQresultErrorField(res, PG_DIAG_SEVERITY);
+ if (fld)
+ printfPQExpBuffer(msg, "%s: ", fld);
+ else
+ printfPQExpBuffer(msg, "ERROR: ");
+ fld = PQresultErrorField(res, PG_DIAG_MESSAGE_PRIMARY);
+ if (fld)
+ appendPQExpBufferStr(msg, fld);
+ else
+ appendPQExpBufferStr(msg, "(not available)");
+ appendPQExpBufferChar(msg, '\n');
+
+ pg_log_error("%s", msg->data);
+
+ destroyPQExpBuffer(msg);
+}
diff --git a/src/bin/psql/command.h b/src/bin/psql/command.h
new file mode 100644
index 0000000..9af85de
--- /dev/null
+++ b/src/bin/psql/command.h
@@ -0,0 +1,49 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/command.h
+ */
+#ifndef COMMAND_H
+#define COMMAND_H
+
+#include "fe_utils/conditional.h"
+#include "fe_utils/print.h"
+#include "fe_utils/psqlscan.h"
+
+typedef enum _backslashResult
+{
+ PSQL_CMD_UNKNOWN = 0, /* not done parsing yet (internal only) */
+ PSQL_CMD_SEND, /* query complete; send off */
+ PSQL_CMD_SKIP_LINE, /* keep building query */
+ PSQL_CMD_TERMINATE, /* quit program */
+ PSQL_CMD_NEWEDIT, /* query buffer was changed (e.g., via \e) */
+ PSQL_CMD_ERROR /* the execution of the backslash command
+ * resulted in an error */
+} backslashResult;
+
+
+extern backslashResult HandleSlashCmds(PsqlScanState scan_state,
+ ConditionalStack cstack,
+ PQExpBuffer query_buf,
+ PQExpBuffer previous_buf);
+
+extern int process_file(char *filename, bool use_relative_path);
+
+extern bool do_pset(const char *param,
+ const char *value,
+ printQueryOpt *popt,
+ bool quiet);
+
+extern printQueryOpt *savePsetInfo(const printQueryOpt *popt);
+
+extern void restorePsetInfo(printQueryOpt *popt, printQueryOpt *save);
+
+extern void connection_warnings(bool in_startup);
+
+extern void SyncVariables(void);
+
+extern void UnsyncVariables(void);
+
+#endif /* COMMAND_H */
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
new file mode 100644
index 0000000..5973df2
--- /dev/null
+++ b/src/bin/psql/common.c
@@ -0,0 +1,2427 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/common.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <math.h>
+#include <pwd.h>
+#include <signal.h>
+#ifndef WIN32
+#include <unistd.h> /* for write() */
+#else
+#include <io.h> /* for _write() */
+#include <win32.h>
+#endif
+
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "copy.h"
+#include "crosstabview.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/mbprint.h"
+#include "fe_utils/string_utils.h"
+#include "portability/instr_time.h"
+#include "settings.h"
+
+static bool DescribeQuery(const char *query, double *elapsed_msec);
+static bool ExecQueryUsingCursor(const char *query, double *elapsed_msec);
+static int ExecQueryAndProcessResults(const char *query,
+ double *elapsed_msec,
+ bool *svpt_gone_p,
+ bool is_watch,
+ const printQueryOpt *opt,
+ FILE *printQueryFout);
+static bool command_no_begin(const char *query);
+static bool is_select_command(const char *query);
+
+
+/*
+ * openQueryOutputFile --- attempt to open a query output file
+ *
+ * fname == NULL selects stdout, else an initial '|' selects a pipe,
+ * else plain file.
+ *
+ * Returns output file pointer into *fout, and is-a-pipe flag into *is_pipe.
+ * Caller is responsible for adjusting SIGPIPE state if it's a pipe.
+ *
+ * On error, reports suitable error message and returns false.
+ */
+bool
+openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe)
+{
+ if (!fname || fname[0] == '\0')
+ {
+ *fout = stdout;
+ *is_pipe = false;
+ }
+ else if (*fname == '|')
+ {
+ fflush(NULL);
+ *fout = popen(fname + 1, "w");
+ *is_pipe = true;
+ }
+ else
+ {
+ *fout = fopen(fname, "w");
+ *is_pipe = false;
+ }
+
+ if (*fout == NULL)
+ {
+ pg_log_error("%s: %m", fname);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * setQFout
+ * -- handler for -o command line option and \o command
+ *
+ * On success, updates pset with the new output file and returns true.
+ * On failure, returns false without changing pset state.
+ */
+bool
+setQFout(const char *fname)
+{
+ FILE *fout;
+ bool is_pipe;
+
+ /* First make sure we can open the new output file/pipe */
+ if (!openQueryOutputFile(fname, &fout, &is_pipe))
+ return false;
+
+ /* Close old file/pipe */
+ if (pset.queryFout && pset.queryFout != stdout && pset.queryFout != stderr)
+ {
+ if (pset.queryFoutPipe)
+ SetShellResultVariables(pclose(pset.queryFout));
+ else
+ fclose(pset.queryFout);
+ }
+
+ pset.queryFout = fout;
+ pset.queryFoutPipe = is_pipe;
+
+ /* Adjust SIGPIPE handling appropriately: ignore signal if is_pipe */
+ set_sigpipe_trap_state(is_pipe);
+ restore_sigpipe_trap();
+
+ return true;
+}
+
+
+/*
+ * Variable-fetching callback for flex lexer
+ *
+ * If the specified variable exists, return its value as a string (malloc'd
+ * and expected to be freed by the caller); else return NULL.
+ *
+ * If "quote" isn't PQUOTE_PLAIN, then return the value suitably quoted and
+ * escaped for the specified quoting requirement. (Failure in escaping
+ * should lead to printing an error and returning NULL.)
+ *
+ * "passthrough" is the pointer previously given to psql_scan_set_passthrough.
+ * In psql, passthrough points to a ConditionalStack, which we check to
+ * determine whether variable expansion is allowed.
+ */
+char *
+psql_get_variable(const char *varname, PsqlScanQuoteType quote,
+ void *passthrough)
+{
+ char *result = NULL;
+ const char *value;
+
+ /* In an inactive \if branch, suppress all variable substitutions */
+ if (passthrough && !conditional_active((ConditionalStack) passthrough))
+ return NULL;
+
+ value = GetVariable(pset.vars, varname);
+ if (!value)
+ return NULL;
+
+ switch (quote)
+ {
+ case PQUOTE_PLAIN:
+ result = pg_strdup(value);
+ break;
+ case PQUOTE_SQL_LITERAL:
+ case PQUOTE_SQL_IDENT:
+ {
+ /*
+ * For these cases, we use libpq's quoting functions, which
+ * assume the string is in the connection's client encoding.
+ */
+ char *escaped_value;
+
+ if (!pset.db)
+ {
+ pg_log_error("cannot escape without active connection");
+ return NULL;
+ }
+
+ if (quote == PQUOTE_SQL_LITERAL)
+ escaped_value =
+ PQescapeLiteral(pset.db, value, strlen(value));
+ else
+ escaped_value =
+ PQescapeIdentifier(pset.db, value, strlen(value));
+
+ if (escaped_value == NULL)
+ {
+ const char *error = PQerrorMessage(pset.db);
+
+ pg_log_info("%s", error);
+ return NULL;
+ }
+
+ /*
+ * Rather than complicate the lexer's API with a notion of
+ * which free() routine to use, just pay the price of an extra
+ * strdup().
+ */
+ result = pg_strdup(escaped_value);
+ PQfreemem(escaped_value);
+ break;
+ }
+ case PQUOTE_SHELL_ARG:
+ {
+ /*
+ * For this we use appendShellStringNoError, which is
+ * encoding-agnostic, which is fine since the shell probably
+ * is too. In any case, the only special character is "'",
+ * which is not known to appear in valid multibyte characters.
+ */
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+ if (!appendShellStringNoError(&buf, value))
+ {
+ pg_log_error("shell command argument contains a newline or carriage return: \"%s\"",
+ value);
+ free(buf.data);
+ return NULL;
+ }
+ result = buf.data;
+ break;
+ }
+
+ /* No default: we want a compiler warning for missing cases */
+ }
+
+ return result;
+}
+
+
+/*
+ * for backend Notice messages (INFO, WARNING, etc)
+ */
+void
+NoticeProcessor(void *arg, const char *message)
+{
+ (void) arg; /* not used */
+ pg_log_info("%s", message);
+}
+
+
+
+/*
+ * Code to support query cancellation
+ *
+ * Before we start a query, we enable the SIGINT signal catcher to send a
+ * cancel request to the backend.
+ *
+ * SIGINT is supposed to abort all long-running psql operations, not only
+ * database queries. In most places, this is accomplished by checking
+ * cancel_pressed during long-running loops. However, that won't work when
+ * blocked on user input (in readline() or fgets()). In those places, we
+ * set sigint_interrupt_enabled true while blocked, instructing the signal
+ * catcher to longjmp through sigint_interrupt_jmp. We assume readline and
+ * fgets are coded to handle possible interruption.
+ *
+ * On Windows, currently this does not work, so control-C is less useful
+ * there.
+ */
+volatile sig_atomic_t sigint_interrupt_enabled = false;
+
+sigjmp_buf sigint_interrupt_jmp;
+
+static void
+psql_cancel_callback(void)
+{
+#ifndef WIN32
+ /* if we are waiting for input, longjmp out of it */
+ if (sigint_interrupt_enabled)
+ {
+ sigint_interrupt_enabled = false;
+ siglongjmp(sigint_interrupt_jmp, 1);
+ }
+#endif
+
+ /* else, set cancel flag to stop any long-running loops */
+ cancel_pressed = true;
+}
+
+void
+psql_setup_cancel_handler(void)
+{
+ setup_cancel_handler(psql_cancel_callback);
+}
+
+
+/* ConnectionUp
+ *
+ * Returns whether our backend connection is still there.
+ */
+static bool
+ConnectionUp(void)
+{
+ return PQstatus(pset.db) != CONNECTION_BAD;
+}
+
+
+
+/* CheckConnection
+ *
+ * Verify that we still have a good connection to the backend, and if not,
+ * see if it can be restored.
+ *
+ * Returns true if either the connection was still there, or it could be
+ * restored successfully; false otherwise. If, however, there was no
+ * connection and the session is non-interactive, this will exit the program
+ * with a code of EXIT_BADCONN.
+ */
+static bool
+CheckConnection(void)
+{
+ bool OK;
+
+ OK = ConnectionUp();
+ if (!OK)
+ {
+ if (!pset.cur_cmd_interactive)
+ {
+ pg_log_error("connection to server was lost");
+ exit(EXIT_BADCONN);
+ }
+
+ fprintf(stderr, _("The connection to the server was lost. Attempting reset: "));
+ PQreset(pset.db);
+ OK = ConnectionUp();
+ if (!OK)
+ {
+ fprintf(stderr, _("Failed.\n"));
+
+ /*
+ * Transition to having no connection; but stash away the failed
+ * connection so that we can still refer to its parameters in a
+ * later \connect attempt. Keep the state cleanup here in sync
+ * with do_connect().
+ */
+ if (pset.dead_conn)
+ PQfinish(pset.dead_conn);
+ pset.dead_conn = pset.db;
+ pset.db = NULL;
+ ResetCancelConn();
+ UnsyncVariables();
+ }
+ else
+ {
+ fprintf(stderr, _("Succeeded.\n"));
+
+ /*
+ * Re-sync, just in case anything changed. Keep this in sync with
+ * do_connect().
+ */
+ SyncVariables();
+ connection_warnings(false); /* Must be after SyncVariables */
+ }
+ }
+
+ return OK;
+}
+
+
+
+
+/*
+ * AcceptResult
+ *
+ * Checks whether a result is valid, giving an error message if necessary;
+ * and ensures that the connection to the backend is still up.
+ *
+ * Returns true for valid result, false for error state.
+ */
+static bool
+AcceptResult(const PGresult *result, bool show_error)
+{
+ bool OK;
+
+ if (!result)
+ OK = false;
+ else
+ switch (PQresultStatus(result))
+ {
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ case PGRES_EMPTY_QUERY:
+ case PGRES_COPY_IN:
+ case PGRES_COPY_OUT:
+ /* Fine, do nothing */
+ OK = true;
+ break;
+
+ case PGRES_BAD_RESPONSE:
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ OK = false;
+ break;
+
+ default:
+ OK = false;
+ pg_log_error("unexpected PQresultStatus: %d",
+ PQresultStatus(result));
+ break;
+ }
+
+ if (!OK && show_error)
+ {
+ const char *error = PQerrorMessage(pset.db);
+
+ if (strlen(error))
+ pg_log_info("%s", error);
+
+ CheckConnection();
+ }
+
+ return OK;
+}
+
+
+/*
+ * Set special variables from a query result
+ * - ERROR: true/false, whether an error occurred on this query
+ * - SQLSTATE: code of error, or "00000" if no error, or "" if unknown
+ * - ROW_COUNT: how many rows were returned or affected, or "0"
+ * - LAST_ERROR_SQLSTATE: same for last error
+ * - LAST_ERROR_MESSAGE: message of last error
+ *
+ * Note: current policy is to apply this only to the results of queries
+ * entered by the user, not queries generated by slash commands.
+ */
+static void
+SetResultVariables(PGresult *result, bool success)
+{
+ if (success)
+ {
+ const char *ntuples = PQcmdTuples(result);
+
+ SetVariable(pset.vars, "ERROR", "false");
+ SetVariable(pset.vars, "SQLSTATE", "00000");
+ SetVariable(pset.vars, "ROW_COUNT", *ntuples ? ntuples : "0");
+ }
+ else
+ {
+ const char *code = PQresultErrorField(result, PG_DIAG_SQLSTATE);
+ const char *mesg = PQresultErrorField(result, PG_DIAG_MESSAGE_PRIMARY);
+
+ SetVariable(pset.vars, "ERROR", "true");
+
+ /*
+ * If there is no SQLSTATE code, use an empty string. This can happen
+ * for libpq-detected errors (e.g., lost connection, ENOMEM).
+ */
+ if (code == NULL)
+ code = "";
+ SetVariable(pset.vars, "SQLSTATE", code);
+ SetVariable(pset.vars, "ROW_COUNT", "0");
+ SetVariable(pset.vars, "LAST_ERROR_SQLSTATE", code);
+ SetVariable(pset.vars, "LAST_ERROR_MESSAGE", mesg ? mesg : "");
+ }
+}
+
+
+/*
+ * Set special variables from a shell command result
+ * - SHELL_ERROR: true/false, whether command returned exit code 0
+ * - SHELL_EXIT_CODE: exit code according to shell conventions
+ *
+ * The argument is a wait status as returned by wait(2) or waitpid(2),
+ * which also applies to pclose(3) and system(3).
+ */
+void
+SetShellResultVariables(int wait_result)
+{
+ char buf[32];
+
+ SetVariable(pset.vars, "SHELL_ERROR",
+ (wait_result == 0) ? "false" : "true");
+ snprintf(buf, sizeof(buf), "%d", wait_result_to_exit_code(wait_result));
+ SetVariable(pset.vars, "SHELL_EXIT_CODE", buf);
+}
+
+
+/*
+ * ClearOrSaveResult
+ *
+ * If the result represents an error, remember it for possible display by
+ * \errverbose. Otherwise, just PQclear() it.
+ *
+ * Note: current policy is to apply this to the results of all queries,
+ * including "back door" queries, for debugging's sake. It's OK to use
+ * PQclear() directly on results known to not be error results, however.
+ */
+static void
+ClearOrSaveResult(PGresult *result)
+{
+ if (result)
+ {
+ switch (PQresultStatus(result))
+ {
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ PQclear(pset.last_error_result);
+ pset.last_error_result = result;
+ break;
+
+ default:
+ PQclear(result);
+ break;
+ }
+ }
+}
+
+
+/*
+ * Consume all results
+ */
+static void
+ClearOrSaveAllResults(void)
+{
+ PGresult *result;
+
+ while ((result = PQgetResult(pset.db)) != NULL)
+ ClearOrSaveResult(result);
+}
+
+
+/*
+ * Print microtiming output. Always print raw milliseconds; if the interval
+ * is >= 1 second, also break it down into days/hours/minutes/seconds.
+ */
+static void
+PrintTiming(double elapsed_msec)
+{
+ double seconds;
+ double minutes;
+ double hours;
+ double days;
+
+ if (elapsed_msec < 1000.0)
+ {
+ /* This is the traditional (pre-v10) output format */
+ printf(_("Time: %.3f ms\n"), elapsed_msec);
+ return;
+ }
+
+ /*
+ * Note: we could print just seconds, in a format like %06.3f, when the
+ * total is less than 1min. But that's hard to interpret unless we tack
+ * on "s" or otherwise annotate it. Forcing the display to include
+ * minutes seems like a better solution.
+ */
+ seconds = elapsed_msec / 1000.0;
+ minutes = floor(seconds / 60.0);
+ seconds -= 60.0 * minutes;
+ if (minutes < 60.0)
+ {
+ printf(_("Time: %.3f ms (%02d:%06.3f)\n"),
+ elapsed_msec, (int) minutes, seconds);
+ return;
+ }
+
+ hours = floor(minutes / 60.0);
+ minutes -= 60.0 * hours;
+ if (hours < 24.0)
+ {
+ printf(_("Time: %.3f ms (%02d:%02d:%06.3f)\n"),
+ elapsed_msec, (int) hours, (int) minutes, seconds);
+ return;
+ }
+
+ days = floor(hours / 24.0);
+ hours -= 24.0 * days;
+ printf(_("Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"),
+ elapsed_msec, days, (int) hours, (int) minutes, seconds);
+}
+
+
+/*
+ * PSQLexec
+ *
+ * This is the way to send "backdoor" queries (those not directly entered
+ * by the user). It is subject to -E but not -e.
+ *
+ * Caller is responsible for handling the ensuing processing if a COPY
+ * command is sent.
+ *
+ * Note: we don't bother to check PQclientEncoding; it is assumed that no
+ * caller uses this path to issue "SET CLIENT_ENCODING".
+ */
+PGresult *
+PSQLexec(const char *query)
+{
+ PGresult *res;
+
+ if (!pset.db)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ return NULL;
+ }
+
+ if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF)
+ {
+ printf(_("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(stdout);
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ if (pset.echo_hidden == PSQL_ECHO_HIDDEN_NOEXEC)
+ return NULL;
+ }
+
+ SetCancelConn(pset.db);
+
+ res = PQexec(pset.db, query);
+
+ ResetCancelConn();
+
+ if (!AcceptResult(res, true))
+ {
+ ClearOrSaveResult(res);
+ res = NULL;
+ }
+
+ return res;
+}
+
+
+/*
+ * PSQLexecWatch
+ *
+ * This function is used for \watch command to send the query to
+ * the server and print out the result.
+ *
+ * Returns 1 if the query executed successfully, 0 if it cannot be repeated,
+ * e.g., because of the interrupt, -1 on error.
+ */
+int
+PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout)
+{
+ bool timing = pset.timing;
+ double elapsed_msec = 0;
+ int res;
+
+ if (!pset.db)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ return 0;
+ }
+
+ SetCancelConn(pset.db);
+
+ res = ExecQueryAndProcessResults(query, &elapsed_msec, NULL, true, opt, printQueryFout);
+
+ ResetCancelConn();
+
+ /* Possible microtiming output */
+ if (timing)
+ PrintTiming(elapsed_msec);
+
+ return res;
+}
+
+
+/*
+ * PrintNotifications: check for asynchronous notifications, and print them out
+ */
+static void
+PrintNotifications(void)
+{
+ PGnotify *notify;
+
+ PQconsumeInput(pset.db);
+ while ((notify = PQnotifies(pset.db)) != NULL)
+ {
+ /* for backward compatibility, only show payload if nonempty */
+ if (notify->extra[0])
+ fprintf(pset.queryFout, _("Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"),
+ notify->relname, notify->extra, notify->be_pid);
+ else
+ fprintf(pset.queryFout, _("Asynchronous notification \"%s\" received from server process with PID %d.\n"),
+ notify->relname, notify->be_pid);
+ fflush(pset.queryFout);
+ PQfreemem(notify);
+ PQconsumeInput(pset.db);
+ }
+}
+
+
+/*
+ * PrintQueryTuples: assuming query result is OK, print its tuples
+ *
+ * We use the options given by opt unless that's NULL, in which case
+ * we use pset.popt.
+ *
+ * Output is to printQueryFout unless that's NULL, in which case
+ * we use pset.queryFout.
+ *
+ * Returns true if successful, false otherwise.
+ */
+static bool
+PrintQueryTuples(const PGresult *result, const printQueryOpt *opt,
+ FILE *printQueryFout)
+{
+ bool ok = true;
+ FILE *fout = printQueryFout ? printQueryFout : pset.queryFout;
+
+ printQuery(result, opt ? opt : &pset.popt, fout, false, pset.logfile);
+ fflush(fout);
+ if (ferror(fout))
+ {
+ pg_log_error("could not print result table: %m");
+ ok = false;
+ }
+
+ return ok;
+}
+
+
+/*
+ * StoreQueryTuple: assuming query result is OK, save data into variables
+ *
+ * Returns true if successful, false otherwise.
+ */
+static bool
+StoreQueryTuple(const PGresult *result)
+{
+ bool success = true;
+
+ if (PQntuples(result) < 1)
+ {
+ pg_log_error("no rows returned for \\gset");
+ success = false;
+ }
+ else if (PQntuples(result) > 1)
+ {
+ pg_log_error("more than one row returned for \\gset");
+ success = false;
+ }
+ else
+ {
+ int i;
+
+ for (i = 0; i < PQnfields(result); i++)
+ {
+ char *colname = PQfname(result, i);
+ char *varname;
+ char *value;
+
+ /* concatenate prefix and column name */
+ varname = psprintf("%s%s", pset.gset_prefix, colname);
+
+ if (VariableHasHook(pset.vars, varname))
+ {
+ pg_log_warning("attempt to \\gset into specially treated variable \"%s\" ignored",
+ varname);
+ continue;
+ }
+
+ if (!PQgetisnull(result, 0, i))
+ value = PQgetvalue(result, 0, i);
+ else
+ {
+ /* for NULL value, unset rather than set the variable */
+ value = NULL;
+ }
+
+ if (!SetVariable(pset.vars, varname, value))
+ {
+ free(varname);
+ success = false;
+ break;
+ }
+
+ free(varname);
+ }
+ }
+
+ return success;
+}
+
+
+/*
+ * ExecQueryTuples: assuming query result is OK, execute each query
+ * result field as a SQL statement
+ *
+ * Returns true if successful, false otherwise.
+ */
+static bool
+ExecQueryTuples(const PGresult *result)
+{
+ bool success = true;
+ int nrows = PQntuples(result);
+ int ncolumns = PQnfields(result);
+ int r,
+ c;
+
+ /*
+ * We must turn off gexec_flag to avoid infinite recursion. Note that
+ * this allows ExecQueryUsingCursor to be applied to the individual query
+ * results. SendQuery prevents it from being applied when fetching the
+ * queries-to-execute, because it can't handle recursion either.
+ */
+ pset.gexec_flag = false;
+
+ for (r = 0; r < nrows; r++)
+ {
+ for (c = 0; c < ncolumns; c++)
+ {
+ if (!PQgetisnull(result, r, c))
+ {
+ const char *query = PQgetvalue(result, r, c);
+
+ /* Abandon execution if cancel_pressed */
+ if (cancel_pressed)
+ goto loop_exit;
+
+ /*
+ * ECHO_ALL mode should echo these queries, but SendQuery
+ * assumes that MainLoop did that, so we have to do it here.
+ */
+ if (pset.echo == PSQL_ECHO_ALL && !pset.singlestep)
+ {
+ puts(query);
+ fflush(stdout);
+ }
+
+ if (!SendQuery(query))
+ {
+ /* Error - abandon execution if ON_ERROR_STOP */
+ success = false;
+ if (pset.on_error_stop)
+ goto loop_exit;
+ }
+ }
+ }
+ }
+
+loop_exit:
+
+ /*
+ * Restore state. We know gexec_flag was on, else we'd not be here. (We
+ * also know it'll get turned off at end of command, but that's not ours
+ * to do here.)
+ */
+ pset.gexec_flag = true;
+
+ /* Return true if all queries were successful */
+ return success;
+}
+
+
+/*
+ * Marshal the COPY data. Either path will get the
+ * connection out of its COPY state, then call PQresultStatus()
+ * 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.
+ *
+ * Update *resultp if further processing is necessary; set to NULL otherwise.
+ * Return a result when queryFout can safely output a result status: on COPY
+ * IN, or on COPY OUT if written to something other than pset.queryFout.
+ * Returning NULL prevents the command status from being printed, which we
+ * want if the status line doesn't get taken as part of the COPY data.
+ */
+static bool
+HandleCopyResult(PGresult **resultp, FILE *copystream)
+{
+ bool success;
+ PGresult *copy_result;
+ ExecStatusType result_status = PQresultStatus(*resultp);
+
+ Assert(result_status == PGRES_COPY_OUT ||
+ result_status == PGRES_COPY_IN);
+
+ SetCancelConn(pset.db);
+
+ if (result_status == PGRES_COPY_OUT)
+ {
+ success = handleCopyOut(pset.db,
+ copystream,
+ &copy_result)
+ && (copystream != NULL);
+
+ /*
+ * Suppress status printing if the report would go to the same place
+ * as the COPY data just went. Note this doesn't prevent error
+ * reporting, since handleCopyOut did that.
+ */
+ if (copystream == pset.queryFout)
+ {
+ PQclear(copy_result);
+ copy_result = NULL;
+ }
+ }
+ else
+ {
+ /* COPY IN */
+ /* Ignore the copystream argument passed to the function */
+ copystream = pset.copyStream ? pset.copyStream : pset.cur_cmd_source;
+ success = handleCopyIn(pset.db,
+ copystream,
+ PQbinaryTuples(*resultp),
+ &copy_result);
+ }
+ ResetCancelConn();
+
+ /*
+ * Replace the PGRES_COPY_OUT/IN result with COPY command's exit status,
+ * or with NULL if we want to suppress printing anything.
+ */
+ PQclear(*resultp);
+ *resultp = copy_result;
+
+ return success;
+}
+
+/*
+ * PrintQueryStatus: report command status as required
+ *
+ * Note: Utility function for use by PrintQueryResult() only.
+ */
+static void
+PrintQueryStatus(PGresult *result, FILE *printQueryFout)
+{
+ char buf[16];
+ FILE *fout = printQueryFout ? printQueryFout : pset.queryFout;
+
+ if (!pset.quiet)
+ {
+ if (pset.popt.topt.format == PRINT_HTML)
+ {
+ fputs("<p>", fout);
+ html_escaped_print(PQcmdStatus(result), fout);
+ fputs("</p>\n", fout);
+ }
+ else
+ fprintf(fout, "%s\n", PQcmdStatus(result));
+ fflush(fout);
+ }
+
+ if (pset.logfile)
+ fprintf(pset.logfile, "%s\n", PQcmdStatus(result));
+
+ snprintf(buf, sizeof(buf), "%u", (unsigned int) PQoidValue(result));
+ SetVariable(pset.vars, "LASTOID", buf);
+}
+
+
+/*
+ * PrintQueryResult: print out (or store or execute) query result as required
+ *
+ * Note: Utility function for use by SendQuery() only.
+ *
+ * last is true if this is the last result of a command string.
+ * opt and printQueryFout are defined as for PrintQueryTuples.
+ * printStatusFout is where to send command status; NULL means pset.queryFout.
+ *
+ * Returns true if the query executed successfully, false otherwise.
+ */
+static bool
+PrintQueryResult(PGresult *result, bool last,
+ const printQueryOpt *opt, FILE *printQueryFout,
+ FILE *printStatusFout)
+{
+ bool success;
+ const char *cmdstatus;
+
+ if (!result)
+ return false;
+
+ switch (PQresultStatus(result))
+ {
+ case PGRES_TUPLES_OK:
+ /* store or execute or print the data ... */
+ if (last && pset.gset_prefix)
+ success = StoreQueryTuple(result);
+ else if (last && pset.gexec_flag)
+ success = ExecQueryTuples(result);
+ else if (last && pset.crosstab_flag)
+ success = PrintResultInCrosstab(result);
+ else if (last || pset.show_all_results)
+ success = PrintQueryTuples(result, opt, printQueryFout);
+ else
+ success = true;
+
+ /* if it's INSERT/UPDATE/DELETE RETURNING, also print status */
+ if (last || pset.show_all_results)
+ {
+ cmdstatus = PQcmdStatus(result);
+ if (strncmp(cmdstatus, "INSERT", 6) == 0 ||
+ strncmp(cmdstatus, "UPDATE", 6) == 0 ||
+ strncmp(cmdstatus, "DELETE", 6) == 0)
+ PrintQueryStatus(result, printStatusFout);
+ }
+
+ break;
+
+ case PGRES_COMMAND_OK:
+ if (last || pset.show_all_results)
+ PrintQueryStatus(result, printStatusFout);
+ success = true;
+ break;
+
+ case PGRES_EMPTY_QUERY:
+ success = true;
+ break;
+
+ case PGRES_COPY_OUT:
+ case PGRES_COPY_IN:
+ /* nothing to do here: already processed */
+ success = true;
+ break;
+
+ case PGRES_BAD_RESPONSE:
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ success = false;
+ break;
+
+ default:
+ success = false;
+ pg_log_error("unexpected PQresultStatus: %d",
+ PQresultStatus(result));
+ break;
+ }
+
+ return success;
+}
+
+/*
+ * SendQuery: send the query string to the backend
+ * (and print out result)
+ *
+ * Note: This is the "front door" way to send a query. That is, use it to
+ * send queries actually entered by the user. These queries will be subject to
+ * single step mode.
+ * To send "back door" queries (generated by slash commands, etc.) in a
+ * controlled way, use PSQLexec().
+ *
+ * Returns true if the query executed successfully, false otherwise.
+ */
+bool
+SendQuery(const char *query)
+{
+ bool timing = pset.timing;
+ PGTransactionStatusType transaction_status;
+ double elapsed_msec = 0;
+ bool OK = false;
+ int i;
+ bool on_error_rollback_savepoint = false;
+ bool svpt_gone = false;
+
+ if (!pset.db)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ goto sendquery_cleanup;
+ }
+
+ if (pset.singlestep)
+ {
+ char buf[3];
+
+ fflush(stderr);
+ printf(_("***(Single step mode: verify command)*******************************************\n"
+ "%s\n"
+ "***(press return to proceed or enter x and return to cancel)********************\n"),
+ query);
+ fflush(stdout);
+ if (fgets(buf, sizeof(buf), stdin) != NULL)
+ if (buf[0] == 'x')
+ goto sendquery_cleanup;
+ if (cancel_pressed)
+ goto sendquery_cleanup;
+ }
+ else if (pset.echo == PSQL_ECHO_QUERIES)
+ {
+ puts(query);
+ fflush(stdout);
+ }
+
+ if (pset.logfile)
+ {
+ fprintf(pset.logfile,
+ _("********* QUERY **********\n"
+ "%s\n"
+ "**************************\n\n"), query);
+ fflush(pset.logfile);
+ }
+
+ SetCancelConn(pset.db);
+
+ transaction_status = PQtransactionStatus(pset.db);
+
+ if (transaction_status == PQTRANS_IDLE &&
+ !pset.autocommit &&
+ !command_no_begin(query))
+ {
+ PGresult *result;
+
+ result = PQexec(pset.db, "BEGIN");
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ ClearOrSaveResult(result);
+ goto sendquery_cleanup;
+ }
+ ClearOrSaveResult(result);
+ transaction_status = PQtransactionStatus(pset.db);
+ }
+
+ if (transaction_status == PQTRANS_INTRANS &&
+ pset.on_error_rollback != PSQL_ERROR_ROLLBACK_OFF &&
+ (pset.cur_cmd_interactive ||
+ pset.on_error_rollback == PSQL_ERROR_ROLLBACK_ON))
+ {
+ PGresult *result;
+
+ result = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint");
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ ClearOrSaveResult(result);
+ goto sendquery_cleanup;
+ }
+ ClearOrSaveResult(result);
+ on_error_rollback_savepoint = true;
+ }
+
+ if (pset.gdesc_flag)
+ {
+ /* Describe query's result columns, without executing it */
+ OK = DescribeQuery(query, &elapsed_msec);
+ }
+ else if (pset.fetch_count <= 0 || pset.gexec_flag ||
+ pset.crosstab_flag || !is_select_command(query))
+ {
+ /* Default fetch-it-all-and-print mode */
+ OK = (ExecQueryAndProcessResults(query, &elapsed_msec, &svpt_gone, false, NULL, NULL) > 0);
+ }
+ else
+ {
+ /* Fetch-in-segments mode */
+ OK = ExecQueryUsingCursor(query, &elapsed_msec);
+ }
+
+ if (!OK && pset.echo == PSQL_ECHO_ERRORS)
+ pg_log_info("STATEMENT: %s", query);
+
+ /* If we made a temporary savepoint, possibly release/rollback */
+ if (on_error_rollback_savepoint)
+ {
+ const char *svptcmd = NULL;
+
+ transaction_status = PQtransactionStatus(pset.db);
+
+ switch (transaction_status)
+ {
+ case PQTRANS_INERROR:
+ /* We always rollback on an error */
+ svptcmd = "ROLLBACK TO pg_psql_temporary_savepoint";
+ break;
+
+ case PQTRANS_IDLE:
+ /* If they are no longer in a transaction, then do nothing */
+ break;
+
+ case PQTRANS_INTRANS:
+
+ /*
+ * Release our savepoint, but do nothing if they are messing
+ * with savepoints themselves
+ */
+ if (!svpt_gone)
+ svptcmd = "RELEASE pg_psql_temporary_savepoint";
+ break;
+
+ case PQTRANS_ACTIVE:
+ case PQTRANS_UNKNOWN:
+ default:
+ OK = false;
+ /* PQTRANS_UNKNOWN is expected given a broken connection. */
+ if (transaction_status != PQTRANS_UNKNOWN || ConnectionUp())
+ pg_log_error("unexpected transaction status (%d)",
+ transaction_status);
+ break;
+ }
+
+ if (svptcmd)
+ {
+ PGresult *svptres;
+
+ svptres = PQexec(pset.db, svptcmd);
+ if (PQresultStatus(svptres) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ ClearOrSaveResult(svptres);
+ OK = false;
+
+ goto sendquery_cleanup;
+ }
+ PQclear(svptres);
+ }
+ }
+
+ /* Possible microtiming output */
+ if (timing)
+ PrintTiming(elapsed_msec);
+
+ /* check for events that may occur during query execution */
+
+ if (pset.encoding != PQclientEncoding(pset.db) &&
+ PQclientEncoding(pset.db) >= 0)
+ {
+ /* track effects of SET CLIENT_ENCODING */
+ pset.encoding = PQclientEncoding(pset.db);
+ pset.popt.topt.encoding = pset.encoding;
+ SetVariable(pset.vars, "ENCODING",
+ pg_encoding_to_char(pset.encoding));
+ }
+
+ PrintNotifications();
+
+ /* perform cleanup that should occur after any attempted query */
+
+sendquery_cleanup:
+
+ /* global cancellation reset */
+ ResetCancelConn();
+
+ /* reset \g's output-to-filename trigger */
+ if (pset.gfname)
+ {
+ free(pset.gfname);
+ pset.gfname = NULL;
+ }
+
+ /* restore print settings if \g changed them */
+ if (pset.gsavepopt)
+ {
+ restorePsetInfo(&pset.popt, pset.gsavepopt);
+ pset.gsavepopt = NULL;
+ }
+
+ /* clean up after \bind */
+ if (pset.bind_flag)
+ {
+ for (i = 0; i < pset.bind_nparams; i++)
+ free(pset.bind_params[i]);
+ free(pset.bind_params);
+ pset.bind_params = NULL;
+ pset.bind_flag = false;
+ }
+
+ /* reset \gset trigger */
+ if (pset.gset_prefix)
+ {
+ free(pset.gset_prefix);
+ pset.gset_prefix = NULL;
+ }
+
+ /* reset \gdesc trigger */
+ pset.gdesc_flag = false;
+
+ /* reset \gexec trigger */
+ pset.gexec_flag = false;
+
+ /* reset \crosstabview trigger */
+ pset.crosstab_flag = false;
+ for (i = 0; i < lengthof(pset.ctv_args); i++)
+ {
+ pg_free(pset.ctv_args[i]);
+ pset.ctv_args[i] = NULL;
+ }
+
+ return OK;
+}
+
+
+/*
+ * DescribeQuery: describe the result columns of a query, without executing it
+ *
+ * Returns true if the operation executed successfully, false otherwise.
+ *
+ * If pset.timing is on, total query time (exclusive of result-printing) is
+ * stored into *elapsed_msec.
+ */
+static bool
+DescribeQuery(const char *query, double *elapsed_msec)
+{
+ bool timing = pset.timing;
+ PGresult *result;
+ bool OK;
+ instr_time before,
+ after;
+
+ *elapsed_msec = 0;
+
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+ else
+ INSTR_TIME_SET_ZERO(before);
+
+ /*
+ * To parse the query but not execute it, we prepare it, using the unnamed
+ * prepared statement. This is invisible to psql users, since there's no
+ * way to access the unnamed prepared statement from psql user space. The
+ * next Parse or Query protocol message would overwrite the statement
+ * anyway. (So there's no great need to clear it when done, which is a
+ * good thing because libpq provides no easy way to do that.)
+ */
+ result = PQprepare(pset.db, "", query, 0, NULL);
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ SetResultVariables(result, false);
+ ClearOrSaveResult(result);
+ return false;
+ }
+ PQclear(result);
+
+ result = PQdescribePrepared(pset.db, "");
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ if (OK && result)
+ {
+ if (PQnfields(result) > 0)
+ {
+ PQExpBufferData buf;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT name AS \"%s\", pg_catalog.format_type(tp, tpm) AS \"%s\"\n"
+ "FROM (VALUES ",
+ gettext_noop("Column"),
+ gettext_noop("Type"));
+
+ for (i = 0; i < PQnfields(result); i++)
+ {
+ const char *name;
+ char *escname;
+
+ if (i > 0)
+ appendPQExpBufferStr(&buf, ",");
+
+ name = PQfname(result, i);
+ escname = PQescapeLiteral(pset.db, name, strlen(name));
+
+ if (escname == NULL)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ PQclear(result);
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBuffer(&buf, "(%s, '%u'::pg_catalog.oid, %d)",
+ escname,
+ PQftype(result, i),
+ PQfmod(result, i));
+
+ PQfreemem(escname);
+ }
+
+ appendPQExpBufferStr(&buf, ") s(name, tp, tpm)");
+ PQclear(result);
+
+ result = PQexec(pset.db, buf.data);
+ OK = AcceptResult(result, true);
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ if (OK && result)
+ OK = PrintQueryResult(result, true, NULL, NULL, NULL);
+
+ termPQExpBuffer(&buf);
+ }
+ else
+ fprintf(pset.queryFout,
+ _("The command has no result, or the result has no columns.\n"));
+ }
+
+ SetResultVariables(result, OK);
+ ClearOrSaveResult(result);
+
+ return OK;
+}
+
+
+/*
+ * ExecQueryAndProcessResults: utility function for use by SendQuery()
+ * and PSQLexecWatch().
+ *
+ * Sends query and cycles through PGresult objects.
+ *
+ * If our command string contained a COPY FROM STDIN or COPY TO STDOUT, the
+ * PGresult associated with these commands must be processed by providing an
+ * input or output stream. In that event, we'll marshal data for the COPY.
+ *
+ * For other commands, the results are processed normally, depending on their
+ * status.
+ *
+ * Returns 1 on complete success, 0 on interrupt and -1 or errors. Possible
+ * failure modes include purely client-side problems; check the transaction
+ * status for the server-side opinion.
+ *
+ * Note that on a combined query, failure does not mean that nothing was
+ * committed.
+ */
+static int
+ExecQueryAndProcessResults(const char *query,
+ double *elapsed_msec, bool *svpt_gone_p,
+ bool is_watch,
+ const printQueryOpt *opt, FILE *printQueryFout)
+{
+ bool timing = pset.timing;
+ bool success;
+ instr_time before,
+ after;
+ PGresult *result;
+ FILE *gfile_fout = NULL;
+ bool gfile_is_pipe = false;
+
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+ else
+ INSTR_TIME_SET_ZERO(before);
+
+ if (pset.bind_flag)
+ success = PQsendQueryParams(pset.db, query, pset.bind_nparams, NULL, (const char *const *) pset.bind_params, NULL, NULL, 0);
+ else
+ success = PQsendQuery(pset.db, query);
+
+ if (!success)
+ {
+ const char *error = PQerrorMessage(pset.db);
+
+ if (strlen(error))
+ pg_log_info("%s", error);
+
+ CheckConnection();
+
+ return -1;
+ }
+
+ /*
+ * If SIGINT is sent while the query is processing, the interrupt will be
+ * consumed. The user's intention, though, is to cancel the entire watch
+ * process, so detect a sent cancellation request and exit in this case.
+ */
+ if (is_watch && cancel_pressed)
+ {
+ ClearOrSaveAllResults();
+ return 0;
+ }
+
+ /* first result */
+ result = PQgetResult(pset.db);
+
+ while (result != NULL)
+ {
+ ExecStatusType result_status;
+ PGresult *next_result;
+ bool last;
+
+ if (!AcceptResult(result, false))
+ {
+ /*
+ * Some error occurred, either a server-side failure or a failure
+ * to submit the command string. Record that.
+ */
+ const char *error = PQresultErrorMessage(result);
+
+ if (strlen(error))
+ pg_log_info("%s", error);
+
+ CheckConnection();
+ if (!is_watch)
+ SetResultVariables(result, false);
+
+ /* keep the result status before clearing it */
+ result_status = PQresultStatus(result);
+ ClearOrSaveResult(result);
+ success = false;
+
+ /*
+ * switch to next result
+ */
+ if (result_status == PGRES_COPY_BOTH ||
+ result_status == PGRES_COPY_OUT ||
+ result_status == PGRES_COPY_IN)
+
+ /*
+ * For some obscure reason PQgetResult does *not* return a
+ * NULL in copy cases despite the result having been cleared,
+ * but keeps returning an "empty" result that we have to
+ * ignore manually.
+ */
+ result = NULL;
+ else
+ result = PQgetResult(pset.db);
+
+ /*
+ * Get current timing measure in case an error occurs
+ */
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec = INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ continue;
+ }
+ else if (svpt_gone_p && !*svpt_gone_p)
+ {
+ /*
+ * Check if the user ran any command that would destroy our
+ * internal savepoint: If the user did COMMIT AND CHAIN, RELEASE
+ * or ROLLBACK, our savepoint is gone. If they issued a SAVEPOINT,
+ * releasing ours would remove theirs.
+ */
+ const char *cmd = PQcmdStatus(result);
+
+ *svpt_gone_p = (strcmp(cmd, "COMMIT") == 0 ||
+ strcmp(cmd, "SAVEPOINT") == 0 ||
+ strcmp(cmd, "RELEASE") == 0 ||
+ strcmp(cmd, "ROLLBACK") == 0);
+ }
+
+ result_status = PQresultStatus(result);
+
+ /* must handle COPY before changing the current result */
+ Assert(result_status != PGRES_COPY_BOTH);
+ if (result_status == PGRES_COPY_IN ||
+ result_status == PGRES_COPY_OUT)
+ {
+ 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.
+ */
+ if (result_status == PGRES_COPY_OUT)
+ {
+ if (is_watch)
+ {
+ /* invoked by \watch */
+ copy_stream = printQueryFout ? printQueryFout : pset.queryFout;
+ }
+ else if (pset.copyStream)
+ {
+ /* invoked by \copy */
+ copy_stream = pset.copyStream;
+ }
+ else if (pset.gfname)
+ {
+ /* send to \g file, which we may have opened already */
+ if (gfile_fout == NULL)
+ {
+ if (openQueryOutputFile(pset.gfname,
+ &gfile_fout, &gfile_is_pipe))
+ {
+ if (gfile_is_pipe)
+ disable_sigpipe_trap();
+ copy_stream = gfile_fout;
+ }
+ else
+ success = false;
+ }
+ else
+ copy_stream = gfile_fout;
+ }
+ else
+ {
+ /* fall back to the generic query output stream */
+ copy_stream = pset.queryFout;
+ }
+ }
+
+ /*
+ * Even if the output stream could not be opened, we call
+ * HandleCopyResult() with a NULL output stream to collect and
+ * discard the COPY data.
+ */
+ success &= HandleCopyResult(&result, copy_stream);
+ }
+
+ /*
+ * Check PQgetResult() again. In the typical case of a single-command
+ * string, it will return NULL. Otherwise, we'll have other results
+ * to process. We need to do that to check whether this is the last.
+ */
+ next_result = PQgetResult(pset.db);
+ last = (next_result == NULL);
+
+ /*
+ * Update current timing measure.
+ *
+ * It will include the display of previous results, if any. This
+ * cannot be helped because the server goes on processing further
+ * queries anyway while the previous ones are being displayed. The
+ * parallel execution of the client display hides the server time when
+ * it is shorter.
+ *
+ * With combined queries, timing must be understood as an upper bound
+ * of the time spent processing them.
+ */
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec = INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ /* this may or may not print something depending on settings */
+ if (result != NULL)
+ {
+ /*
+ * If results need to be printed into the file specified by \g,
+ * open it, unless we already did. Note that when pset.gfname is
+ * set, the passed-in value of printQueryFout is not used for
+ * tuple output, but it's still used for status output.
+ */
+ FILE *tuples_fout = printQueryFout;
+ bool do_print = true;
+
+ if (PQresultStatus(result) == PGRES_TUPLES_OK &&
+ pset.gfname)
+ {
+ if (gfile_fout == NULL)
+ {
+ if (openQueryOutputFile(pset.gfname,
+ &gfile_fout, &gfile_is_pipe))
+ {
+ if (gfile_is_pipe)
+ disable_sigpipe_trap();
+ }
+ else
+ success = do_print = false;
+ }
+ tuples_fout = gfile_fout;
+ }
+ if (do_print)
+ success &= PrintQueryResult(result, last, opt,
+ tuples_fout, printQueryFout);
+ }
+
+ /* set variables on last result if all went well */
+ if (!is_watch && last && success)
+ SetResultVariables(result, true);
+
+ ClearOrSaveResult(result);
+ result = next_result;
+
+ if (cancel_pressed)
+ {
+ ClearOrSaveAllResults();
+ break;
+ }
+ }
+
+ /* close \g file if we opened it */
+ if (gfile_fout)
+ {
+ if (gfile_is_pipe)
+ {
+ SetShellResultVariables(pclose(gfile_fout));
+ restore_sigpipe_trap();
+ }
+ else
+ fclose(gfile_fout);
+ }
+
+ /* may need this to recover from conn loss during COPY */
+ if (!CheckConnection())
+ return -1;
+
+ return cancel_pressed ? 0 : success ? 1 : -1;
+}
+
+
+/*
+ * ExecQueryUsingCursor: run a SELECT-like query using a cursor
+ *
+ * This feature allows result sets larger than RAM to be dealt with.
+ *
+ * Returns true if the query executed successfully, false otherwise.
+ *
+ * If pset.timing is on, total query time (exclusive of result-printing) is
+ * stored into *elapsed_msec.
+ */
+static bool
+ExecQueryUsingCursor(const char *query, double *elapsed_msec)
+{
+ bool OK = true;
+ PGresult *result;
+ PQExpBufferData buf;
+ printQueryOpt my_popt = pset.popt;
+ bool timing = pset.timing;
+ FILE *fout;
+ bool is_pipe;
+ bool is_pager = false;
+ bool started_txn = false;
+ int64 total_tuples = 0;
+ int ntuples;
+ int fetch_count;
+ char fetch_cmd[64];
+ instr_time before,
+ after;
+ int flush_error;
+
+ *elapsed_msec = 0;
+
+ /* initialize print options for partial table output */
+ my_popt.topt.start_table = true;
+ my_popt.topt.stop_table = false;
+ my_popt.topt.prior_records = 0;
+
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+ else
+ INSTR_TIME_SET_ZERO(before);
+
+ /* if we're not in a transaction, start one */
+ if (PQtransactionStatus(pset.db) == PQTRANS_IDLE)
+ {
+ result = PQexec(pset.db, "BEGIN");
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ ClearOrSaveResult(result);
+ if (!OK)
+ return false;
+ started_txn = true;
+ }
+
+ /* Send DECLARE CURSOR */
+ initPQExpBuffer(&buf);
+ appendPQExpBuffer(&buf, "DECLARE _psql_cursor NO SCROLL CURSOR FOR\n%s",
+ query);
+
+ result = PQexec(pset.db, buf.data);
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ if (!OK)
+ SetResultVariables(result, OK);
+ ClearOrSaveResult(result);
+ termPQExpBuffer(&buf);
+ if (!OK)
+ goto cleanup;
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ /*
+ * In \gset mode, we force the fetch count to be 2, so that we will throw
+ * the appropriate error if the query returns more than one row.
+ */
+ if (pset.gset_prefix)
+ fetch_count = 2;
+ else
+ fetch_count = pset.fetch_count;
+
+ snprintf(fetch_cmd, sizeof(fetch_cmd),
+ "FETCH FORWARD %d FROM _psql_cursor",
+ fetch_count);
+
+ /* prepare to write output to \g argument, if any */
+ if (pset.gfname)
+ {
+ if (!openQueryOutputFile(pset.gfname, &fout, &is_pipe))
+ {
+ OK = false;
+ goto cleanup;
+ }
+ if (is_pipe)
+ disable_sigpipe_trap();
+ }
+ else
+ {
+ fout = pset.queryFout;
+ is_pipe = false; /* doesn't matter */
+ }
+
+ /* clear any pre-existing error indication on the output stream */
+ clearerr(fout);
+
+ for (;;)
+ {
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ /* get fetch_count tuples at a time */
+ result = PQexec(pset.db, fetch_cmd);
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ /* shut down pager before printing error message */
+ if (is_pager)
+ {
+ ClosePager(fout);
+ is_pager = false;
+ }
+
+ OK = AcceptResult(result, true);
+ Assert(!OK);
+ SetResultVariables(result, OK);
+ ClearOrSaveResult(result);
+ break;
+ }
+
+ if (pset.gset_prefix)
+ {
+ /* StoreQueryTuple will complain if not exactly one row */
+ OK = StoreQueryTuple(result);
+ ClearOrSaveResult(result);
+ break;
+ }
+
+ /*
+ * Note we do not deal with \gdesc, \gexec or \crosstabview modes here
+ */
+
+ ntuples = PQntuples(result);
+ total_tuples += ntuples;
+
+ if (ntuples < fetch_count)
+ {
+ /* this is the last result set, so allow footer decoration */
+ my_popt.topt.stop_table = true;
+ }
+ else if (fout == stdout && !is_pager)
+ {
+ /*
+ * If query requires multiple result sets, hack to ensure that
+ * only one pager instance is used for the whole mess
+ */
+ fout = PageOutput(INT_MAX, &(my_popt.topt));
+ is_pager = true;
+ }
+
+ printQuery(result, &my_popt, fout, is_pager, pset.logfile);
+
+ ClearOrSaveResult(result);
+
+ /* after the first result set, disallow header decoration */
+ my_popt.topt.start_table = false;
+ my_popt.topt.prior_records += ntuples;
+
+ /*
+ * Make sure to flush the output stream, so intermediate results are
+ * visible to the client immediately. We check the results because if
+ * the pager dies/exits/etc, there's no sense throwing more data at
+ * it.
+ */
+ flush_error = fflush(fout);
+
+ /*
+ * Check if we are at the end, if a cancel was pressed, or if there
+ * were any errors either trying to flush out the results, or more
+ * generally on the output stream at all. If we hit any errors
+ * writing things to the stream, we presume $PAGER has disappeared and
+ * stop bothering to pull down more data.
+ */
+ if (ntuples < fetch_count || cancel_pressed || flush_error ||
+ ferror(fout))
+ break;
+ }
+
+ if (pset.gfname)
+ {
+ /* close \g argument file/pipe */
+ if (is_pipe)
+ {
+ SetShellResultVariables(pclose(fout));
+ restore_sigpipe_trap();
+ }
+ else
+ fclose(fout);
+ }
+ else if (is_pager)
+ {
+ /* close transient pager */
+ ClosePager(fout);
+ }
+
+ if (OK)
+ {
+ /*
+ * We don't have a PGresult here, and even if we did it wouldn't have
+ * the right row count, so fake SetResultVariables(). In error cases,
+ * we already set the result variables above.
+ */
+ char buf[32];
+
+ SetVariable(pset.vars, "ERROR", "false");
+ SetVariable(pset.vars, "SQLSTATE", "00000");
+ snprintf(buf, sizeof(buf), INT64_FORMAT, total_tuples);
+ SetVariable(pset.vars, "ROW_COUNT", buf);
+ }
+
+cleanup:
+ if (timing)
+ INSTR_TIME_SET_CURRENT(before);
+
+ /*
+ * We try to close the cursor on either success or failure, but on failure
+ * ignore the result (it's probably just a bleat about being in an aborted
+ * transaction)
+ */
+ result = PQexec(pset.db, "CLOSE _psql_cursor");
+ if (OK)
+ {
+ OK = AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ ClearOrSaveResult(result);
+ }
+ else
+ PQclear(result);
+
+ if (started_txn)
+ {
+ result = PQexec(pset.db, OK ? "COMMIT" : "ROLLBACK");
+ OK &= AcceptResult(result, true) &&
+ (PQresultStatus(result) == PGRES_COMMAND_OK);
+ ClearOrSaveResult(result);
+ }
+
+ if (timing)
+ {
+ INSTR_TIME_SET_CURRENT(after);
+ INSTR_TIME_SUBTRACT(after, before);
+ *elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
+ }
+
+ return OK;
+}
+
+
+/*
+ * Advance the given char pointer over white space and SQL comments.
+ */
+static const char *
+skip_white_space(const char *query)
+{
+ int cnestlevel = 0; /* slash-star comment nest level */
+
+ while (*query)
+ {
+ int mblen = PQmblenBounded(query, pset.encoding);
+
+ /*
+ * Note: we assume the encoding is a superset of ASCII, so that for
+ * example "query[0] == '/'" is meaningful. However, we do NOT assume
+ * that the second and subsequent bytes of a multibyte character
+ * couldn't look like ASCII characters; so it is critical to advance
+ * by mblen, not 1, whenever we haven't exactly identified the
+ * character we are skipping over.
+ */
+ if (isspace((unsigned char) *query))
+ query += mblen;
+ else if (query[0] == '/' && query[1] == '*')
+ {
+ cnestlevel++;
+ query += 2;
+ }
+ else if (cnestlevel > 0 && query[0] == '*' && query[1] == '/')
+ {
+ cnestlevel--;
+ query += 2;
+ }
+ else if (cnestlevel == 0 && query[0] == '-' && query[1] == '-')
+ {
+ query += 2;
+
+ /*
+ * We have to skip to end of line since any slash-star inside the
+ * -- comment does NOT start a slash-star comment.
+ */
+ while (*query)
+ {
+ if (*query == '\n')
+ {
+ query++;
+ break;
+ }
+ query += PQmblenBounded(query, pset.encoding);
+ }
+ }
+ else if (cnestlevel > 0)
+ query += mblen;
+ else
+ break; /* found first token */
+ }
+
+ return query;
+}
+
+
+/*
+ * Check whether a command is one of those for which we should NOT start
+ * a new transaction block (ie, send a preceding BEGIN).
+ *
+ * These include the transaction control statements themselves, plus
+ * certain statements that the backend disallows inside transaction blocks.
+ */
+static bool
+command_no_begin(const char *query)
+{
+ int wordlen;
+
+ /*
+ * First we must advance over any whitespace and comments.
+ */
+ query = skip_white_space(query);
+
+ /*
+ * Check word length (since "beginx" is not "begin").
+ */
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ /*
+ * Transaction control commands. These should include every keyword that
+ * gives rise to a TransactionStmt in the backend grammar, except for the
+ * savepoint-related commands.
+ *
+ * (We assume that START must be START TRANSACTION, since there is
+ * presently no other "START foo" command.)
+ */
+ if (wordlen == 5 && pg_strncasecmp(query, "abort", 5) == 0)
+ return true;
+ if (wordlen == 5 && pg_strncasecmp(query, "begin", 5) == 0)
+ return true;
+ if (wordlen == 5 && pg_strncasecmp(query, "start", 5) == 0)
+ return true;
+ if (wordlen == 6 && pg_strncasecmp(query, "commit", 6) == 0)
+ return true;
+ if (wordlen == 3 && pg_strncasecmp(query, "end", 3) == 0)
+ return true;
+ if (wordlen == 8 && pg_strncasecmp(query, "rollback", 8) == 0)
+ return true;
+ if (wordlen == 7 && pg_strncasecmp(query, "prepare", 7) == 0)
+ {
+ /* PREPARE TRANSACTION is a TC command, PREPARE foo is not */
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 11 && pg_strncasecmp(query, "transaction", 11) == 0)
+ return true;
+ return false;
+ }
+
+ /*
+ * Commands not allowed within transactions. The statements checked for
+ * here should be exactly those that call PreventInTransactionBlock() in
+ * the backend.
+ */
+ if (wordlen == 6 && pg_strncasecmp(query, "vacuum", 6) == 0)
+ return true;
+ if (wordlen == 7 && pg_strncasecmp(query, "cluster", 7) == 0)
+ {
+ /* CLUSTER with any arguments is allowed in transactions */
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ if (isalpha((unsigned char) query[0]))
+ return false; /* has additional words */
+ return true; /* it's CLUSTER without arguments */
+ }
+
+ if (wordlen == 6 && pg_strncasecmp(query, "create", 6) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 8 && pg_strncasecmp(query, "database", 8) == 0)
+ return true;
+ if (wordlen == 10 && pg_strncasecmp(query, "tablespace", 10) == 0)
+ return true;
+
+ /* CREATE [UNIQUE] INDEX CONCURRENTLY isn't allowed in xacts */
+ if (wordlen == 6 && pg_strncasecmp(query, "unique", 6) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+ }
+
+ if (wordlen == 5 && pg_strncasecmp(query, "index", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 12 && pg_strncasecmp(query, "concurrently", 12) == 0)
+ return true;
+ }
+
+ return false;
+ }
+
+ if (wordlen == 5 && pg_strncasecmp(query, "alter", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ /* ALTER SYSTEM isn't allowed in xacts */
+ if (wordlen == 6 && pg_strncasecmp(query, "system", 6) == 0)
+ return true;
+
+ return false;
+ }
+
+ /*
+ * Note: these tests will match DROP SYSTEM and REINDEX TABLESPACE, which
+ * aren't really valid commands so we don't care much. The other four
+ * possible matches are correct.
+ */
+ if ((wordlen == 4 && pg_strncasecmp(query, "drop", 4) == 0) ||
+ (wordlen == 7 && pg_strncasecmp(query, "reindex", 7) == 0))
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 8 && pg_strncasecmp(query, "database", 8) == 0)
+ return true;
+ if (wordlen == 6 && pg_strncasecmp(query, "system", 6) == 0)
+ return true;
+ if (wordlen == 10 && pg_strncasecmp(query, "tablespace", 10) == 0)
+ return true;
+ if (wordlen == 5 && (pg_strncasecmp(query, "index", 5) == 0 ||
+ pg_strncasecmp(query, "table", 5) == 0))
+ {
+ query += wordlen;
+ query = skip_white_space(query);
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ /*
+ * REINDEX [ TABLE | INDEX ] CONCURRENTLY are not allowed in
+ * xacts.
+ */
+ if (wordlen == 12 && pg_strncasecmp(query, "concurrently", 12) == 0)
+ return true;
+ }
+
+ /* DROP INDEX CONCURRENTLY isn't allowed in xacts */
+ if (wordlen == 5 && pg_strncasecmp(query, "index", 5) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 12 && pg_strncasecmp(query, "concurrently", 12) == 0)
+ return true;
+
+ return false;
+ }
+
+ return false;
+ }
+
+ /* DISCARD ALL isn't allowed in xacts, but other variants are allowed. */
+ if (wordlen == 7 && pg_strncasecmp(query, "discard", 7) == 0)
+ {
+ query += wordlen;
+
+ query = skip_white_space(query);
+
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 3 && pg_strncasecmp(query, "all", 3) == 0)
+ return true;
+ return false;
+ }
+
+ return false;
+}
+
+
+/*
+ * Check whether the specified command is a SELECT (or VALUES).
+ */
+static bool
+is_select_command(const char *query)
+{
+ int wordlen;
+
+ /*
+ * First advance over any whitespace, comments and left parentheses.
+ */
+ for (;;)
+ {
+ query = skip_white_space(query);
+ if (query[0] == '(')
+ query++;
+ else
+ break;
+ }
+
+ /*
+ * Check word length (since "selectx" is not "select").
+ */
+ wordlen = 0;
+ while (isalpha((unsigned char) query[wordlen]))
+ wordlen += PQmblenBounded(&query[wordlen], pset.encoding);
+
+ if (wordlen == 6 && pg_strncasecmp(query, "select", 6) == 0)
+ return true;
+
+ if (wordlen == 6 && pg_strncasecmp(query, "values", 6) == 0)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Test if the current user is a database superuser.
+ */
+bool
+is_superuser(void)
+{
+ const char *val;
+
+ if (!pset.db)
+ return false;
+
+ val = PQparameterStatus(pset.db, "is_superuser");
+
+ if (val && strcmp(val, "on") == 0)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Test if the current session uses standard string literals.
+ */
+bool
+standard_strings(void)
+{
+ const char *val;
+
+ if (!pset.db)
+ return false;
+
+ val = PQparameterStatus(pset.db, "standard_conforming_strings");
+
+ if (val && strcmp(val, "on") == 0)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Return the session user of the current connection.
+ */
+const char *
+session_username(void)
+{
+ const char *val;
+
+ if (!pset.db)
+ return NULL;
+
+ val = PQparameterStatus(pset.db, "session_authorization");
+ if (val)
+ return val;
+ else
+ return PQuser(pset.db);
+}
+
+
+/* expand_tilde
+ *
+ * substitute '~' with HOME or '~username' with username's home dir
+ *
+ */
+void
+expand_tilde(char **filename)
+{
+ if (!filename || !(*filename))
+ return;
+
+ /*
+ * WIN32 doesn't use tilde expansion for file names. Also, it uses tilde
+ * for short versions of long file names, though the tilde is usually
+ * toward the end, not at the beginning.
+ */
+#ifndef WIN32
+
+ /* try tilde expansion */
+ if (**filename == '~')
+ {
+ char *fn;
+ char oldp,
+ *p;
+ struct passwd *pw;
+ char home[MAXPGPATH];
+
+ fn = *filename;
+ *home = '\0';
+
+ p = fn + 1;
+ while (*p != '/' && *p != '\0')
+ p++;
+
+ oldp = *p;
+ *p = '\0';
+
+ if (*(fn + 1) == '\0')
+ get_home_path(home); /* ~ or ~/ only */
+ else if ((pw = getpwnam(fn + 1)) != NULL)
+ strlcpy(home, pw->pw_dir, sizeof(home)); /* ~user */
+
+ *p = oldp;
+ if (strlen(home) != 0)
+ {
+ char *newfn;
+
+ newfn = psprintf("%s%s", home, p);
+ free(fn);
+ *filename = newfn;
+ }
+ }
+#endif
+}
+
+/*
+ * Checks if connection string starts with either of the valid URI prefix
+ * designators.
+ *
+ * Returns the URI prefix length, 0 if the string doesn't contain a URI prefix.
+ *
+ * XXX This is a duplicate of the eponymous libpq function.
+ */
+static int
+uri_prefix_length(const char *connstr)
+{
+ /* The connection URI must start with either of the following designators: */
+ static const char uri_designator[] = "postgresql://";
+ static const char short_uri_designator[] = "postgres://";
+
+ if (strncmp(connstr, uri_designator,
+ sizeof(uri_designator) - 1) == 0)
+ return sizeof(uri_designator) - 1;
+
+ if (strncmp(connstr, short_uri_designator,
+ sizeof(short_uri_designator) - 1) == 0)
+ return sizeof(short_uri_designator) - 1;
+
+ return 0;
+}
+
+/*
+ * Recognized connection string either starts with a valid URI prefix or
+ * contains a "=" in it.
+ *
+ * Must be consistent with parse_connection_string: anything for which this
+ * returns true should at least look like it's parseable by that routine.
+ *
+ * XXX This is a duplicate of the eponymous libpq function.
+ */
+bool
+recognized_connection_string(const char *connstr)
+{
+ return uri_prefix_length(connstr) != 0 || strchr(connstr, '=') != NULL;
+}
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
new file mode 100644
index 0000000..812b94a
--- /dev/null
+++ b/src/bin/psql/common.h
@@ -0,0 +1,47 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/common.h
+ */
+#ifndef COMMON_H
+#define COMMON_H
+
+#include <setjmp.h>
+#include <signal.h>
+
+#include "fe_utils/print.h"
+#include "fe_utils/psqlscan.h"
+#include "libpq-fe.h"
+
+extern bool openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe);
+extern bool setQFout(const char *fname);
+
+extern char *psql_get_variable(const char *varname, PsqlScanQuoteType quote,
+ void *passthrough);
+
+extern void NoticeProcessor(void *arg, const char *message);
+
+extern volatile sig_atomic_t sigint_interrupt_enabled;
+
+extern sigjmp_buf sigint_interrupt_jmp;
+
+extern void psql_setup_cancel_handler(void);
+
+extern void SetShellResultVariables(int wait_result);
+
+extern PGresult *PSQLexec(const char *query);
+extern int PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout);
+
+extern bool SendQuery(const char *query);
+
+extern bool is_superuser(void);
+extern bool standard_strings(void);
+extern const char *session_username(void);
+
+extern void expand_tilde(char **filename);
+
+extern bool recognized_connection_string(const char *connstr);
+
+#endif /* COMMON_H */
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
new file mode 100644
index 0000000..8d6ce4c
--- /dev/null
+++ b/src/bin/psql/copy.c
@@ -0,0 +1,726 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/copy.c
+ */
+#include "postgres_fe.h"
+
+#include <signal.h>
+#include <sys/stat.h>
+#ifndef WIN32
+#include <unistd.h> /* for isatty */
+#else
+#include <io.h> /* I think */
+#endif
+
+#include "common.h"
+#include "common/logging.h"
+#include "copy.h"
+#include "libpq-fe.h"
+#include "pqexpbuffer.h"
+#include "prompt.h"
+#include "settings.h"
+#include "stringutils.h"
+
+/*
+ * parse_slash_copy
+ * -- parses \copy command line
+ *
+ * The documented syntax is:
+ * \copy tablename [(columnlist)] from|to filename [options]
+ * \copy ( query stmt ) to filename [options]
+ *
+ * where 'filename' can be one of the following:
+ * '<file path>' | PROGRAM '<command>' | stdin | stdout | pstdout | pstdout
+ * and 'query' can be one of the following:
+ * SELECT | UPDATE | INSERT | DELETE
+ *
+ * An undocumented fact is that you can still write BINARY before the
+ * tablename; this is a hangover from the pre-7.3 syntax. The options
+ * syntax varies across backend versions, but we avoid all that mess
+ * by just transmitting the stuff after the filename literally.
+ *
+ * table name can be double-quoted and can have a schema part.
+ * column names can be double-quoted.
+ * filename can be single-quoted like SQL literals.
+ * command must be single-quoted like SQL literals.
+ *
+ * returns a malloc'ed structure with the options, or NULL on parsing error
+ */
+
+struct copy_options
+{
+ char *before_tofrom; /* COPY string before TO/FROM */
+ char *after_tofrom; /* COPY string after TO/FROM filename */
+ char *file; /* NULL = stdin/stdout */
+ bool program; /* is 'file' a program to popen? */
+ bool psql_inout; /* true = use psql stdin/stdout */
+ bool from; /* true = FROM, false = TO */
+};
+
+
+static void
+free_copy_options(struct copy_options *ptr)
+{
+ if (!ptr)
+ return;
+ free(ptr->before_tofrom);
+ free(ptr->after_tofrom);
+ free(ptr->file);
+ free(ptr);
+}
+
+
+/* concatenate "more" onto "var", freeing the original value of *var */
+static void
+xstrcat(char **var, const char *more)
+{
+ char *newvar;
+
+ newvar = psprintf("%s%s", *var, more);
+ free(*var);
+ *var = newvar;
+}
+
+
+static struct copy_options *
+parse_slash_copy(const char *args)
+{
+ struct copy_options *result;
+ char *token;
+ const char *whitespace = " \t\n\r";
+ char nonstd_backslash = standard_strings() ? 0 : '\\';
+
+ if (!args)
+ {
+ pg_log_error("\\copy: arguments required");
+ return NULL;
+ }
+
+ result = pg_malloc0(sizeof(struct copy_options));
+
+ result->before_tofrom = pg_strdup(""); /* initialize for appending */
+
+ token = strtokx(args, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ /* The following can be removed when we drop 7.3 syntax support */
+ if (pg_strcasecmp(token, "binary") == 0)
+ {
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ }
+
+ /* Handle COPY (query) case */
+ if (token[0] == '(')
+ {
+ int parens = 1;
+
+ while (parens > 0)
+ {
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, "()", "\"'",
+ nonstd_backslash, true, false, pset.encoding);
+ if (!token)
+ goto error;
+ if (token[0] == '(')
+ parens++;
+ else if (token[0] == ')')
+ parens--;
+ }
+ }
+
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ /*
+ * strtokx() will not have returned a multi-character token starting with
+ * '.', so we don't need strcmp() here. Likewise for '(', etc, below.
+ */
+ if (token[0] == '.')
+ {
+ /* handle schema . table */
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ }
+
+ if (token[0] == '(')
+ {
+ /* handle parenthesized column list */
+ for (;;)
+ {
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, "()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ if (token[0] == ')')
+ break;
+ }
+ xstrcat(&result->before_tofrom, " ");
+ xstrcat(&result->before_tofrom, token);
+ token = strtokx(NULL, whitespace, ".,()", "\"",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+ }
+
+ if (pg_strcasecmp(token, "from") == 0)
+ result->from = true;
+ else if (pg_strcasecmp(token, "to") == 0)
+ result->from = false;
+ else
+ goto error;
+
+ /* { 'filename' | PROGRAM 'command' | STDIN | STDOUT | PSTDIN | PSTDOUT } */
+ token = strtokx(NULL, whitespace, ";", "'",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ if (pg_strcasecmp(token, "program") == 0)
+ {
+ int toklen;
+
+ token = strtokx(NULL, whitespace, ";", "'",
+ 0, false, false, pset.encoding);
+ if (!token)
+ goto error;
+
+ /*
+ * The shell command must be quoted. This isn't fool-proof, but
+ * catches most quoting errors.
+ */
+ toklen = strlen(token);
+ if (token[0] != '\'' || toklen < 2 || token[toklen - 1] != '\'')
+ goto error;
+
+ strip_quotes(token, '\'', 0, pset.encoding);
+
+ result->program = true;
+ result->file = pg_strdup(token);
+ }
+ else if (pg_strcasecmp(token, "stdin") == 0 ||
+ pg_strcasecmp(token, "stdout") == 0)
+ {
+ result->file = NULL;
+ }
+ else if (pg_strcasecmp(token, "pstdin") == 0 ||
+ pg_strcasecmp(token, "pstdout") == 0)
+ {
+ result->psql_inout = true;
+ result->file = NULL;
+ }
+ else
+ {
+ /* filename can be optionally quoted */
+ strip_quotes(token, '\'', 0, pset.encoding);
+ result->file = pg_strdup(token);
+ expand_tilde(&result->file);
+ }
+
+ /* Collect the rest of the line (COPY options) */
+ token = strtokx(NULL, "", NULL, NULL,
+ 0, false, false, pset.encoding);
+ if (token)
+ result->after_tofrom = pg_strdup(token);
+
+ return result;
+
+error:
+ if (token)
+ pg_log_error("\\copy: parse error at \"%s\"", token);
+ else
+ pg_log_error("\\copy: parse error at end of line");
+ free_copy_options(result);
+
+ return NULL;
+}
+
+
+/*
+ * Execute a \copy command (frontend copy). We have to open a file (or execute
+ * a command), then submit a COPY query to the backend and either feed it data
+ * from the file or route its response into the file.
+ */
+bool
+do_copy(const char *args)
+{
+ PQExpBufferData query;
+ FILE *copystream;
+ struct copy_options *options;
+ bool success;
+
+ /* parse options */
+ options = parse_slash_copy(args);
+
+ if (!options)
+ return false;
+
+ /* prepare to read or write the target file */
+ if (options->file && !options->program)
+ canonicalize_path(options->file);
+
+ if (options->from)
+ {
+ if (options->file)
+ {
+ if (options->program)
+ {
+ fflush(NULL);
+ errno = 0;
+ copystream = popen(options->file, PG_BINARY_R);
+ }
+ else
+ copystream = fopen(options->file, PG_BINARY_R);
+ }
+ else if (!options->psql_inout)
+ copystream = pset.cur_cmd_source;
+ else
+ copystream = stdin;
+ }
+ else
+ {
+ if (options->file)
+ {
+ if (options->program)
+ {
+ fflush(NULL);
+ disable_sigpipe_trap();
+ errno = 0;
+ copystream = popen(options->file, PG_BINARY_W);
+ }
+ else
+ copystream = fopen(options->file, PG_BINARY_W);
+ }
+ else if (!options->psql_inout)
+ copystream = pset.queryFout;
+ else
+ copystream = stdout;
+ }
+
+ if (!copystream)
+ {
+ if (options->program)
+ pg_log_error("could not execute command \"%s\": %m",
+ options->file);
+ else
+ pg_log_error("%s: %m",
+ options->file);
+ free_copy_options(options);
+ return false;
+ }
+
+ if (!options->program)
+ {
+ struct stat st;
+ int result;
+
+ /* make sure the specified file is not a directory */
+ if ((result = fstat(fileno(copystream), &st)) < 0)
+ pg_log_error("could not stat file \"%s\": %m",
+ options->file);
+
+ if (result == 0 && S_ISDIR(st.st_mode))
+ pg_log_error("%s: cannot copy from/to a directory",
+ options->file);
+
+ if (result < 0 || S_ISDIR(st.st_mode))
+ {
+ fclose(copystream);
+ free_copy_options(options);
+ return false;
+ }
+ }
+
+ /* build the command we will send to the backend */
+ initPQExpBuffer(&query);
+ printfPQExpBuffer(&query, "COPY ");
+ appendPQExpBufferStr(&query, options->before_tofrom);
+ if (options->from)
+ appendPQExpBufferStr(&query, " FROM STDIN ");
+ else
+ appendPQExpBufferStr(&query, " TO STDOUT ");
+ if (options->after_tofrom)
+ appendPQExpBufferStr(&query, options->after_tofrom);
+
+ /* run it like a user command, but with copystream as data source/sink */
+ pset.copyStream = copystream;
+ success = SendQuery(query.data);
+ pset.copyStream = NULL;
+ termPQExpBuffer(&query);
+
+ if (options->file != NULL)
+ {
+ if (options->program)
+ {
+ int pclose_rc = pclose(copystream);
+
+ if (pclose_rc != 0)
+ {
+ if (pclose_rc < 0)
+ pg_log_error("could not close pipe to external command: %m");
+ else
+ {
+ char *reason = wait_result_to_str(pclose_rc);
+
+ pg_log_error("%s: %s", options->file,
+ reason ? reason : "");
+ free(reason);
+ }
+ success = false;
+ }
+ SetShellResultVariables(pclose_rc);
+ restore_sigpipe_trap();
+ }
+ else
+ {
+ if (fclose(copystream) != 0)
+ {
+ pg_log_error("%s: %m", options->file);
+ success = false;
+ }
+ }
+ }
+ free_copy_options(options);
+ return success;
+}
+
+
+/*
+ * Functions for handling COPY IN/OUT data transfer.
+ *
+ * If you want to use COPY TO STDOUT/FROM STDIN in your application,
+ * this is the code to steal ;)
+ */
+
+/*
+ * handleCopyOut
+ * receives data as a result of a COPY ... TO STDOUT command
+ *
+ * conn should be a database connection that you just issued COPY TO on
+ * and got back a PGRES_COPY_OUT result.
+ *
+ * copystream is the file stream for the data to go to.
+ * copystream can be NULL to eat the data without writing it anywhere.
+ *
+ * The final status for the COPY is returned into *res (but note
+ * we already reported the error, if it's not a success result).
+ *
+ * result is true if successful, false if not.
+ */
+bool
+handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res)
+{
+ bool OK = true;
+ char *buf;
+ int ret;
+
+ for (;;)
+ {
+ ret = PQgetCopyData(conn, &buf, 0);
+
+ if (ret < 0)
+ break; /* done or server/connection error */
+
+ if (buf)
+ {
+ if (OK && copystream && fwrite(buf, 1, ret, copystream) != ret)
+ {
+ pg_log_error("could not write COPY data: %m");
+ /* complain only once, keep reading data from server */
+ OK = false;
+ }
+ PQfreemem(buf);
+ }
+ }
+
+ if (OK && copystream && fflush(copystream))
+ {
+ pg_log_error("could not write COPY data: %m");
+ OK = false;
+ }
+
+ if (ret == -2)
+ {
+ pg_log_error("COPY data transfer failed: %s", PQerrorMessage(conn));
+ OK = false;
+ }
+
+ /*
+ * Check command status and return to normal libpq state.
+ *
+ * If for some reason libpq is still reporting PGRES_COPY_OUT state, we
+ * would like to forcibly exit that state, since our caller would be
+ * unable to distinguish that situation from reaching the next COPY in a
+ * command string that happened to contain two consecutive COPY TO STDOUT
+ * commands. However, libpq provides no API for doing that, and in
+ * principle it's a libpq bug anyway if PQgetCopyData() returns -1 or -2
+ * but hasn't exited COPY_OUT state internally. So we ignore the
+ * possibility here.
+ */
+ *res = PQgetResult(conn);
+ if (PQresultStatus(*res) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(conn));
+ OK = false;
+ }
+
+ return OK;
+}
+
+/*
+ * handleCopyIn
+ * 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.
+ * 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).
+ *
+ * result is true if successful, false if not.
+ */
+
+/* read chunk size for COPY IN - size is not critical */
+#define COPYBUFSIZ 8192
+
+bool
+handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res)
+{
+ bool OK;
+ char buf[COPYBUFSIZ];
+ bool showprompt;
+
+ /*
+ * Establish longjmp destination for exiting from wait-for-input. (This is
+ * only effective while sigint_interrupt_enabled is TRUE.)
+ */
+ if (sigsetjmp(sigint_interrupt_jmp, 1) != 0)
+ {
+ /* got here with longjmp */
+
+ /* Terminate data transfer */
+ 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;
+
+ OK = true;
+
+ if (isbinary)
+ {
+ /* interactive input probably silly, but give one prompt anyway */
+ if (showprompt)
+ {
+ const char *prompt = get_prompt(PROMPT_COPY, NULL);
+
+ fputs(prompt, stdout);
+ fflush(stdout);
+ }
+
+ for (;;)
+ {
+ int buflen;
+
+ /* enable longjmp while waiting for input */
+ sigint_interrupt_enabled = true;
+
+ buflen = fread(buf, 1, COPYBUFSIZ, copystream);
+
+ sigint_interrupt_enabled = false;
+
+ if (buflen <= 0)
+ break;
+
+ if (PQputCopyData(conn, buf, buflen) <= 0)
+ {
+ OK = false;
+ break;
+ }
+ }
+ }
+ else
+ {
+ bool copydone = false;
+ int buflen;
+ bool at_line_begin = true;
+
+ /*
+ * In text mode, we have to read the input one line at a time, so that
+ * we can stop reading at the EOF marker (\.). We mustn't read beyond
+ * the EOF marker, because if the data was inlined in a SQL script, we
+ * would eat up the commands after the EOF marker.
+ */
+ buflen = 0;
+ while (!copydone)
+ {
+ char *fgresult;
+
+ if (at_line_begin && showprompt)
+ {
+ const char *prompt = get_prompt(PROMPT_COPY, NULL);
+
+ fputs(prompt, stdout);
+ fflush(stdout);
+ }
+
+ /* enable longjmp while waiting for input */
+ sigint_interrupt_enabled = true;
+
+ fgresult = fgets(&buf[buflen], COPYBUFSIZ - buflen, copystream);
+
+ sigint_interrupt_enabled = false;
+
+ if (!fgresult)
+ copydone = true;
+ else
+ {
+ int linelen;
+
+ linelen = strlen(fgresult);
+ buflen += linelen;
+
+ /* current line is done? */
+ if (buf[buflen - 1] == '\n')
+ {
+ /* check for EOF marker, but not on a partial line */
+ if (at_line_begin)
+ {
+ /*
+ * This code erroneously assumes '\.' on a line alone
+ * inside a quoted CSV string terminates the \copy.
+ * https://www.postgresql.org/message-id/E1TdNVQ-0001ju-GO@wrigleys.postgresql.org
+ * https://www.postgresql.org/message-id/bfcd57e4-8f23-4c3e-a5db-2571d09208e2@beta.fastmail.com
+ */
+ if ((linelen == 3 && memcmp(fgresult, "\\.\n", 3) == 0) ||
+ (linelen == 4 && memcmp(fgresult, "\\.\r\n", 4) == 0))
+ {
+ copydone = true;
+ }
+ }
+
+ if (copystream == pset.cur_cmd_source)
+ {
+ pset.lineno++;
+ pset.stmt_lineno++;
+ }
+ at_line_begin = true;
+ }
+ else
+ at_line_begin = false;
+ }
+
+ /*
+ * If the buffer is full, or we've reached the EOF, flush it.
+ *
+ * Make sure there's always space for four more bytes in the
+ * buffer, plus a NUL terminator. That way, an EOF marker is
+ * never split across two fgets() calls, which simplifies the
+ * logic.
+ */
+ if (buflen >= COPYBUFSIZ - 5 || (copydone && buflen > 0))
+ {
+ if (PQputCopyData(conn, buf, buflen) <= 0)
+ {
+ OK = false;
+ break;
+ }
+
+ buflen = 0;
+ }
+ }
+ }
+
+ /* Check for read error */
+ if (ferror(copystream))
+ OK = false;
+
+ /*
+ * Terminate data transfer. We can't send an error message if we're using
+ * protocol version 2. (libpq no longer supports protocol version 2, but
+ * keep the version checks just in case you're using a pre-v14 libpq.so at
+ * runtime)
+ */
+ if (PQputCopyEnd(conn,
+ (OK || PQprotocolVersion(conn) < 3) ? NULL :
+ _("aborted because of read failure")) <= 0)
+ OK = false;
+
+copyin_cleanup:
+
+ /*
+ * Clear the EOF flag on the stream, in case copying ended due to an EOF
+ * signal. This allows an interactive TTY session to perform another COPY
+ * FROM STDIN later. (In non-STDIN cases, we're about to close the file
+ * anyway, so it doesn't matter.) Although we don't ever test the flag
+ * with feof(), some fread() implementations won't read more data if it's
+ * set. This also clears the error flag, but we already checked that.
+ */
+ clearerr(copystream);
+
+ /*
+ * Check command status and return to normal libpq state.
+ *
+ * We do not want to return with the status still PGRES_COPY_IN: our
+ * caller would be unable to distinguish that situation from reaching the
+ * next COPY in a command string that happened to contain two consecutive
+ * COPY FROM STDIN commands. We keep trying PQputCopyEnd() in the hope
+ * it'll work eventually. (What's actually likely to happen is that in
+ * attempting to flush the data, libpq will eventually realize that the
+ * connection is lost. But that's fine; it will get us out of COPY_IN
+ * state, which is what we need.)
+ */
+ while (*res = PQgetResult(conn), PQresultStatus(*res) == PGRES_COPY_IN)
+ {
+ OK = false;
+ PQclear(*res);
+ /* We can't send an error message if we're using protocol version 2 */
+ PQputCopyEnd(conn,
+ (PQprotocolVersion(conn) < 3) ? NULL :
+ _("trying to exit copy mode"));
+ }
+ if (PQresultStatus(*res) != PGRES_COMMAND_OK)
+ {
+ pg_log_info("%s", PQerrorMessage(conn));
+ OK = false;
+ }
+
+ return OK;
+}
diff --git a/src/bin/psql/copy.h b/src/bin/psql/copy.h
new file mode 100644
index 0000000..1d33fcf
--- /dev/null
+++ b/src/bin/psql/copy.h
@@ -0,0 +1,24 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/copy.h
+ */
+#ifndef COPY_H
+#define COPY_H
+
+#include "libpq-fe.h"
+
+
+/* handler for \copy */
+extern bool do_copy(const char *args);
+
+/* lower level processors for copy in/out streams */
+
+extern bool handleCopyOut(PGconn *conn, FILE *copystream,
+ PGresult **res);
+extern bool handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary,
+ PGresult **res);
+
+#endif
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
new file mode 100644
index 0000000..0809db4
--- /dev/null
+++ b/src/bin/psql/create_help.pl
@@ -0,0 +1,233 @@
+#! /usr/bin/perl
+
+#################################################################
+# create_help.pl -- converts SGML docs to internal psql help
+#
+# Copyright (c) 2000-2023, PostgreSQL Global Development Group
+#
+# src/bin/psql/create_help.pl
+#################################################################
+
+#
+# This script automatically generates the help on SQL in psql from
+# the SGML docs. So far the format of the docs was consistent
+# enough that this worked, but this here is by no means an SGML
+# parser.
+#
+# Call: perl create_help.pl docdir sql_help
+# The name of the header file doesn't matter to this script, but it
+# sure does matter to the rest of the source.
+#
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+my $docdir = '';
+my $outdir = '.';
+my $depfile = '';
+my $hfilebasename = '';
+
+GetOptions(
+ 'docdir=s' => \$docdir,
+ 'outdir=s' => \$outdir,
+ 'basename=s' => \$hfilebasename,
+ 'depfile=s' => \$depfile,) or die "$0: wrong arguments";
+
+$docdir or die "$0: missing required argument: docdir\n";
+$hfilebasename or die "$0: missing required argument: basename\n";
+
+my $hfile = $hfilebasename . '.h';
+my $cfile = $hfilebasename . '.c';
+
+my $define = $hfilebasename;
+$define =~ tr/a-z/A-Z/;
+$define =~ s/\W/_/g;
+
+opendir(my $dh, $docdir)
+ or die "$0: could not open documentation source dir '$docdir': $!\n";
+open(my $hfile_handle, '>', "$outdir/$hfile")
+ or die "$0: could not open output file '$hfile': $!\n";
+open(my $cfile_handle, '>', "$outdir/$cfile")
+ or die "$0: could not open output file '$cfile': $!\n";
+
+my $depfile_handle;
+if ($depfile)
+{
+ open($depfile_handle, '>', $depfile)
+ or die "$0: could not open output file '$depfile': $!\n";
+}
+
+print $hfile_handle "/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#ifndef $define
+#define $define
+
+#include \"pqexpbuffer.h\"
+
+struct _helpStruct
+{
+ const char *cmd; /* the command name */
+ const char *help; /* the help associated with it */
+ const char *docbook_id; /* DocBook XML id (for generating URL) */
+ void (*syntaxfunc) (PQExpBuffer); /* function that prints the
+ * syntax associated with it */
+ int nl_count; /* number of newlines in syntax (for pager) */
+};
+
+extern const struct _helpStruct QL_HELP[];
+";
+
+print $cfile_handle "/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#define N_(x) (x) /* gettext noop */
+
+#include \"postgres_fe.h\"
+#include \"$hfile\"
+
+";
+
+my $maxlen = 0;
+
+my %entries;
+
+foreach my $file (sort readdir $dh)
+{
+ my ($cmdid, @cmdnames, $cmddesc, $cmdsynopsis);
+ $file =~ /\.sgml$/ or next;
+
+ print $depfile_handle "$outdir/$cfile $outdir/$hfile: $docdir/$file\n"
+ if ($depfile);
+
+ open(my $fh, '<', "$docdir/$file") or next;
+ my $filecontent = join('', <$fh>);
+ close $fh;
+
+ # Ignore files that are not for SQL language statements
+ $filecontent =~
+ m!<refmiscinfo>\s*SQL - Language Statements\s*</refmiscinfo>!i
+ or next;
+
+ $filecontent =~ m!<refentry id="([a-z-]+)">!
+ and $cmdid = $1;
+
+ # Collect multiple refnames
+ LOOP:
+ {
+ $filecontent =~ m!\G.*?<refname>\s*([a-z ]+?)\s*</refname>!cgis
+ and push @cmdnames, $1
+ and redo LOOP;
+ }
+ $filecontent =~ m!<refpurpose>\s*(.+?)\s*</refpurpose>!is
+ and $cmddesc = $1;
+ $filecontent =~ m!<synopsis>\s*(.+?)\s*</synopsis>!is
+ and $cmdsynopsis = $1;
+
+ if (@cmdnames && $cmddesc && $cmdid && $cmdsynopsis)
+ {
+ s/\"/\\"/g foreach @cmdnames;
+
+ $cmddesc =~ s/<[^>]+>//g;
+ $cmddesc =~ s/\s+/ /g;
+ $cmddesc =~ s/\"/\\"/g;
+
+ my @params = ();
+
+ my $nl_count = () = $cmdsynopsis =~ /\n/g;
+
+ $cmdsynopsis =~ s/%/%%/g;
+
+ while ($cmdsynopsis =~ m!<(\w+)[^>]*>(.+?)</\1[^>]*>!)
+ {
+ my $match = $2;
+ $match =~ s/<[^>]+>//g;
+ $match =~ s/%%/%/g;
+ push @params, $match;
+ $cmdsynopsis =~ s!<(\w+)[^>]*>.+?</\1[^>]*>!%s!;
+ }
+ $cmdsynopsis =~ s/\r?\n/\\n/g;
+ $cmdsynopsis =~ s/\"/\\"/g;
+
+ foreach my $cmdname (@cmdnames)
+ {
+ $entries{$cmdname} = {
+ cmdid => $cmdid,
+ cmddesc => $cmddesc,
+ cmdsynopsis => $cmdsynopsis,
+ params => \@params,
+ nl_count => $nl_count
+ };
+ $maxlen =
+ ($maxlen >= length $cmdname) ? $maxlen : length $cmdname;
+ }
+ }
+ else
+ {
+ die "$0: parsing file '$file' failed (N='@cmdnames' D='$cmddesc')\n";
+ }
+}
+
+foreach (sort keys %entries)
+{
+ my $prefix = "\t" x 5 . ' ';
+ my $id = $_;
+ $id =~ s/ /_/g;
+ my $synopsis = "\"$entries{$_}{cmdsynopsis}\"";
+ $synopsis =~ s/\\n/\\n"\n$prefix"/g;
+ my @args =
+ ("buf", $synopsis, map("_(\"$_\")", @{ $entries{$_}{params} }));
+ print $cfile_handle "static void
+sql_help_$id(PQExpBuffer buf)
+{
+\tappendPQExpBuffer(" . join(",\n$prefix", @args) . ");
+}
+
+";
+}
+
+print $cfile_handle "
+const struct _helpStruct QL_HELP[] = {
+";
+foreach (sort keys %entries)
+{
+ my $id = $_;
+ $id =~ s/ /_/g;
+ print $cfile_handle "\t{\"$_\",
+\t\tN_(\"$entries{$_}{cmddesc}\"),
+\t\t\"$entries{$_}{cmdid}\",
+\t\tsql_help_$id,
+\t$entries{$_}{nl_count}},
+
+";
+}
+
+print $cfile_handle "
+\t{NULL, NULL, NULL}\t\t\t/* End of list marker */
+};
+";
+
+print $hfile_handle "
+#define QL_HELP_COUNT "
+ . scalar(keys %entries) . " /* number of help items */
+#define QL_MAX_CMD_LEN $maxlen /* largest strlen(cmd) */
+
+
+#endif /* $define */
+";
+
+close $cfile_handle;
+close $hfile_handle;
+close $depfile_handle if ($depfile);
+closedir $dh;
diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c
new file mode 100644
index 0000000..e1ad0e6
--- /dev/null
+++ b/src/bin/psql/crosstabview.c
@@ -0,0 +1,713 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/crosstabview.c
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "crosstabview.h"
+#include "pqexpbuffer.h"
+#include "psqlscanslash.h"
+#include "settings.h"
+
+/*
+ * Value/position from the resultset that goes into the horizontal or vertical
+ * crosstabview header.
+ */
+typedef struct _pivot_field
+{
+ /*
+ * Pointer obtained from PQgetvalue() for colV or colH. Each distinct
+ * value becomes an entry in the vertical header (colV), or horizontal
+ * header (colH). A Null value is represented by a NULL pointer.
+ */
+ char *name;
+
+ /*
+ * When a sort is requested on an alternative column, this holds
+ * PQgetvalue() for the sort column corresponding to <name>. If <name>
+ * appear multiple times, it's the first value in the order of the results
+ * that is kept. A Null value is represented by a NULL pointer.
+ */
+ char *sort_value;
+
+ /*
+ * Rank of this value, starting at 0. Initially, it's the relative
+ * position of the first appearance of <name> in the resultset. For
+ * example, if successive rows contain B,A,C,A,D then it's B:0,A:1,C:2,D:3
+ * When a sort column is specified, ranks get updated in a final pass to
+ * reflect the desired order.
+ */
+ int rank;
+} pivot_field;
+
+/* Node in avl_tree */
+typedef struct _avl_node
+{
+ /* Node contents */
+ pivot_field field;
+
+ /*
+ * Height of this node in the tree (number of nodes on the longest path to
+ * a leaf).
+ */
+ int height;
+
+ /*
+ * Child nodes. [0] points to left subtree, [1] to right subtree. Never
+ * NULL, points to the empty node avl_tree.end when no left or right
+ * value.
+ */
+ struct _avl_node *children[2];
+} avl_node;
+
+/*
+ * Control structure for the AVL tree (binary search tree kept
+ * balanced with the AVL algorithm)
+ */
+typedef struct _avl_tree
+{
+ int count; /* Total number of nodes */
+ avl_node *root; /* root of the tree */
+ avl_node *end; /* Immutable dereferenceable empty tree */
+} avl_tree;
+
+
+static bool printCrosstab(const PGresult *result,
+ int num_columns, pivot_field *piv_columns, int field_for_columns,
+ int num_rows, pivot_field *piv_rows, int field_for_rows,
+ int field_for_data);
+static void avlInit(avl_tree *tree);
+static void avlMergeValue(avl_tree *tree, char *name, char *sort_value);
+static int avlCollectFields(avl_tree *tree, avl_node *node,
+ pivot_field *fields, int idx);
+static void avlFree(avl_tree *tree, avl_node *node);
+static void rankSort(int num_columns, pivot_field *piv_columns);
+static int indexOfColumn(char *arg, const PGresult *res);
+static int pivotFieldCompare(const void *a, const void *b);
+static int rankCompare(const void *a, const void *b);
+
+
+/*
+ * Main entry point to this module.
+ *
+ * Process the data from *res according to the options in pset (global),
+ * to generate the horizontal and vertical headers contents,
+ * then call printCrosstab() for the actual output.
+ */
+bool
+PrintResultInCrosstab(const PGresult *res)
+{
+ bool retval = false;
+ avl_tree piv_columns;
+ avl_tree piv_rows;
+ pivot_field *array_columns = NULL;
+ pivot_field *array_rows = NULL;
+ int num_columns = 0;
+ int num_rows = 0;
+ int field_for_rows;
+ int field_for_columns;
+ int field_for_data;
+ int sort_field_for_columns;
+ int rn;
+
+ avlInit(&piv_rows);
+ avlInit(&piv_columns);
+
+ if (PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ pg_log_error("\\crosstabview: statement did not return a result set");
+ goto error_return;
+ }
+
+ if (PQnfields(res) < 3)
+ {
+ pg_log_error("\\crosstabview: query must return at least three columns");
+ goto error_return;
+ }
+
+ /* Process first optional arg (vertical header column) */
+ if (pset.ctv_args[0] == NULL)
+ field_for_rows = 0;
+ else
+ {
+ field_for_rows = indexOfColumn(pset.ctv_args[0], res);
+ if (field_for_rows < 0)
+ goto error_return;
+ }
+
+ /* Process second optional arg (horizontal header column) */
+ if (pset.ctv_args[1] == NULL)
+ field_for_columns = 1;
+ else
+ {
+ field_for_columns = indexOfColumn(pset.ctv_args[1], res);
+ if (field_for_columns < 0)
+ goto error_return;
+ }
+
+ /* Insist that header columns be distinct */
+ if (field_for_columns == field_for_rows)
+ {
+ pg_log_error("\\crosstabview: vertical and horizontal headers must be different columns");
+ goto error_return;
+ }
+
+ /* Process third optional arg (data column) */
+ if (pset.ctv_args[2] == NULL)
+ {
+ int i;
+
+ /*
+ * If the data column was not specified, we search for the one not
+ * used as either vertical or horizontal headers. Must be exactly
+ * three columns, or this won't be unique.
+ */
+ if (PQnfields(res) != 3)
+ {
+ pg_log_error("\\crosstabview: data column must be specified when query returns more than three columns");
+ goto error_return;
+ }
+
+ field_for_data = -1;
+ for (i = 0; i < PQnfields(res); i++)
+ {
+ if (i != field_for_rows && i != field_for_columns)
+ {
+ field_for_data = i;
+ break;
+ }
+ }
+ Assert(field_for_data >= 0);
+ }
+ else
+ {
+ field_for_data = indexOfColumn(pset.ctv_args[2], res);
+ if (field_for_data < 0)
+ goto error_return;
+ }
+
+ /* Process fourth optional arg (horizontal header sort column) */
+ if (pset.ctv_args[3] == NULL)
+ sort_field_for_columns = -1; /* no sort column */
+ else
+ {
+ sort_field_for_columns = indexOfColumn(pset.ctv_args[3], res);
+ if (sort_field_for_columns < 0)
+ goto error_return;
+ }
+
+ /*
+ * First part: accumulate the names that go into the vertical and
+ * horizontal headers, each into an AVL binary tree to build the set of
+ * DISTINCT values.
+ */
+
+ for (rn = 0; rn < PQntuples(res); rn++)
+ {
+ char *val;
+ char *val1;
+
+ /* horizontal */
+ val = PQgetisnull(res, rn, field_for_columns) ? NULL :
+ PQgetvalue(res, rn, field_for_columns);
+ val1 = NULL;
+
+ if (sort_field_for_columns >= 0 &&
+ !PQgetisnull(res, rn, sort_field_for_columns))
+ val1 = PQgetvalue(res, rn, sort_field_for_columns);
+
+ avlMergeValue(&piv_columns, val, val1);
+
+ if (piv_columns.count > CROSSTABVIEW_MAX_COLUMNS)
+ {
+ pg_log_error("\\crosstabview: maximum number of columns (%d) exceeded",
+ CROSSTABVIEW_MAX_COLUMNS);
+ goto error_return;
+ }
+
+ /* vertical */
+ val = PQgetisnull(res, rn, field_for_rows) ? NULL :
+ PQgetvalue(res, rn, field_for_rows);
+
+ avlMergeValue(&piv_rows, val, NULL);
+ }
+
+ /*
+ * Second part: Generate sorted arrays from the AVL trees.
+ */
+
+ num_columns = piv_columns.count;
+ num_rows = piv_rows.count;
+
+ array_columns = (pivot_field *)
+ pg_malloc(sizeof(pivot_field) * num_columns);
+
+ array_rows = (pivot_field *)
+ pg_malloc(sizeof(pivot_field) * num_rows);
+
+ avlCollectFields(&piv_columns, piv_columns.root, array_columns, 0);
+ avlCollectFields(&piv_rows, piv_rows.root, array_rows, 0);
+
+ /*
+ * Third part: optionally, process the ranking data for the horizontal
+ * header
+ */
+ if (sort_field_for_columns >= 0)
+ rankSort(num_columns, array_columns);
+
+ /*
+ * Fourth part: print the crosstab'ed result.
+ */
+ retval = printCrosstab(res,
+ num_columns, array_columns, field_for_columns,
+ num_rows, array_rows, field_for_rows,
+ field_for_data);
+
+error_return:
+ avlFree(&piv_columns, piv_columns.root);
+ avlFree(&piv_rows, piv_rows.root);
+ pg_free(array_columns);
+ pg_free(array_rows);
+
+ return retval;
+}
+
+/*
+ * Output the pivoted resultset with the printTable* functions. Return true
+ * if successful, false otherwise.
+ */
+static bool
+printCrosstab(const PGresult *result,
+ int num_columns, pivot_field *piv_columns, int field_for_columns,
+ int num_rows, pivot_field *piv_rows, int field_for_rows,
+ int field_for_data)
+{
+ printQueryOpt popt = pset.popt;
+ printTableContent cont;
+ int i,
+ rn;
+ char col_align;
+ int *horiz_map;
+ bool retval = false;
+
+ printTableInit(&cont, &popt.topt, popt.title, num_columns + 1, num_rows);
+
+ /* Step 1: set target column names (horizontal header) */
+
+ /* The name of the first column is kept unchanged by the pivoting */
+ printTableAddHeader(&cont,
+ PQfname(result, field_for_rows),
+ false,
+ column_type_alignment(PQftype(result,
+ field_for_rows)));
+
+ /*
+ * To iterate over piv_columns[] by piv_columns[].rank, create a reverse
+ * map associating each piv_columns[].rank to its index in piv_columns.
+ * This avoids an O(N^2) loop later.
+ */
+ horiz_map = (int *) pg_malloc(sizeof(int) * num_columns);
+ for (i = 0; i < num_columns; i++)
+ horiz_map[piv_columns[i].rank] = i;
+
+ /*
+ * The display alignment depends on its PQftype().
+ */
+ col_align = column_type_alignment(PQftype(result, field_for_data));
+
+ for (i = 0; i < num_columns; i++)
+ {
+ char *colname;
+
+ colname = piv_columns[horiz_map[i]].name ?
+ piv_columns[horiz_map[i]].name :
+ (popt.nullPrint ? popt.nullPrint : "");
+
+ printTableAddHeader(&cont, colname, false, col_align);
+ }
+ pg_free(horiz_map);
+
+ /* Step 2: set row names in the first output column (vertical header) */
+ for (i = 0; i < num_rows; i++)
+ {
+ int k = piv_rows[i].rank;
+
+ cont.cells[k * (num_columns + 1)] = piv_rows[i].name ?
+ piv_rows[i].name :
+ (popt.nullPrint ? popt.nullPrint : "");
+ }
+ cont.cellsadded = num_rows * (num_columns + 1);
+
+ /*
+ * Step 3: fill in the content cells.
+ */
+ for (rn = 0; rn < PQntuples(result); rn++)
+ {
+ int row_number;
+ int col_number;
+ pivot_field *rp,
+ *cp;
+ pivot_field elt;
+
+ /* Find target row */
+ if (!PQgetisnull(result, rn, field_for_rows))
+ elt.name = PQgetvalue(result, rn, field_for_rows);
+ else
+ elt.name = NULL;
+ rp = (pivot_field *) bsearch(&elt,
+ piv_rows,
+ num_rows,
+ sizeof(pivot_field),
+ pivotFieldCompare);
+ Assert(rp != NULL);
+ row_number = rp->rank;
+
+ /* Find target column */
+ if (!PQgetisnull(result, rn, field_for_columns))
+ elt.name = PQgetvalue(result, rn, field_for_columns);
+ else
+ elt.name = NULL;
+
+ cp = (pivot_field *) bsearch(&elt,
+ piv_columns,
+ num_columns,
+ sizeof(pivot_field),
+ pivotFieldCompare);
+ Assert(cp != NULL);
+ col_number = cp->rank;
+
+ /* Place value into cell */
+ if (col_number >= 0 && row_number >= 0)
+ {
+ int idx;
+
+ /* index into the cont.cells array */
+ idx = 1 + col_number + row_number * (num_columns + 1);
+
+ /*
+ * If the cell already contains a value, raise an error.
+ */
+ if (cont.cells[idx] != NULL)
+ {
+ pg_log_error("\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"",
+ rp->name ? rp->name :
+ (popt.nullPrint ? popt.nullPrint : "(null)"),
+ cp->name ? cp->name :
+ (popt.nullPrint ? popt.nullPrint : "(null)"));
+ goto error;
+ }
+
+ cont.cells[idx] = !PQgetisnull(result, rn, field_for_data) ?
+ PQgetvalue(result, rn, field_for_data) :
+ (popt.nullPrint ? popt.nullPrint : "");
+ }
+ }
+
+ /*
+ * The non-initialized cells must be set to an empty string for the print
+ * functions
+ */
+ for (i = 0; i < cont.cellsadded; i++)
+ {
+ if (cont.cells[i] == NULL)
+ cont.cells[i] = "";
+ }
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+ retval = true;
+
+error:
+ printTableCleanup(&cont);
+
+ return retval;
+}
+
+/*
+ * The avl* functions below provide a minimalistic implementation of AVL binary
+ * trees, to efficiently collect the distinct values that will form the horizontal
+ * and vertical headers. It only supports adding new values, no removal or even
+ * search.
+ */
+static void
+avlInit(avl_tree *tree)
+{
+ tree->end = (avl_node *) pg_malloc0(sizeof(avl_node));
+ tree->end->children[0] = tree->end->children[1] = tree->end;
+ tree->count = 0;
+ tree->root = tree->end;
+}
+
+/* Deallocate recursively an AVL tree, starting from node */
+static void
+avlFree(avl_tree *tree, avl_node *node)
+{
+ if (node->children[0] != tree->end)
+ {
+ avlFree(tree, node->children[0]);
+ pg_free(node->children[0]);
+ }
+ if (node->children[1] != tree->end)
+ {
+ avlFree(tree, node->children[1]);
+ pg_free(node->children[1]);
+ }
+ if (node == tree->root)
+ {
+ /* free the root separately as it's not child of anything */
+ if (node != tree->end)
+ pg_free(node);
+ /* free the tree->end struct only once and when all else is freed */
+ pg_free(tree->end);
+ }
+}
+
+/* Set the height to 1 plus the greatest of left and right heights */
+static void
+avlUpdateHeight(avl_node *n)
+{
+ n->height = 1 + (n->children[0]->height > n->children[1]->height ?
+ n->children[0]->height :
+ n->children[1]->height);
+}
+
+/* Rotate a subtree left (dir=0) or right (dir=1). Not recursive */
+static avl_node *
+avlRotate(avl_node **current, int dir)
+{
+ avl_node *before = *current;
+ avl_node *after = (*current)->children[dir];
+
+ *current = after;
+ before->children[dir] = after->children[!dir];
+ avlUpdateHeight(before);
+ after->children[!dir] = before;
+
+ return after;
+}
+
+static int
+avlBalance(avl_node *n)
+{
+ return n->children[0]->height - n->children[1]->height;
+}
+
+/*
+ * After an insertion, possibly rebalance the tree so that the left and right
+ * node heights don't differ by more than 1.
+ * May update *node.
+ */
+static void
+avlAdjustBalance(avl_tree *tree, avl_node **node)
+{
+ avl_node *current = *node;
+ int b = avlBalance(current) / 2;
+
+ if (b != 0)
+ {
+ int dir = (1 - b) / 2;
+
+ if (avlBalance(current->children[dir]) == -b)
+ avlRotate(&current->children[dir], !dir);
+ current = avlRotate(node, dir);
+ }
+ if (current != tree->end)
+ avlUpdateHeight(current);
+}
+
+/*
+ * Insert a new value/field, starting from *node, reaching the correct position
+ * in the tree by recursion. Possibly rebalance the tree and possibly update
+ * *node. Do nothing if the value is already present in the tree.
+ */
+static void
+avlInsertNode(avl_tree *tree, avl_node **node, pivot_field field)
+{
+ avl_node *current = *node;
+
+ if (current == tree->end)
+ {
+ avl_node *new_node = (avl_node *)
+ pg_malloc(sizeof(avl_node));
+
+ new_node->height = 1;
+ new_node->field = field;
+ new_node->children[0] = new_node->children[1] = tree->end;
+ tree->count++;
+ *node = new_node;
+ }
+ else
+ {
+ int cmp = pivotFieldCompare(&field, &current->field);
+
+ if (cmp != 0)
+ {
+ avlInsertNode(tree,
+ cmp > 0 ? &current->children[1] : &current->children[0],
+ field);
+ avlAdjustBalance(tree, node);
+ }
+ }
+}
+
+/* Insert the value into the AVL tree, if it does not preexist */
+static void
+avlMergeValue(avl_tree *tree, char *name, char *sort_value)
+{
+ pivot_field field;
+
+ field.name = name;
+ field.rank = tree->count;
+ field.sort_value = sort_value;
+ avlInsertNode(tree, &tree->root, field);
+}
+
+/*
+ * Recursively extract node values into the names array, in sorted order with a
+ * left-to-right tree traversal.
+ * Return the next candidate offset to write into the names array.
+ * fields[] must be preallocated to hold tree->count entries
+ */
+static int
+avlCollectFields(avl_tree *tree, avl_node *node, pivot_field *fields, int idx)
+{
+ if (node == tree->end)
+ return idx;
+
+ idx = avlCollectFields(tree, node->children[0], fields, idx);
+ fields[idx] = node->field;
+ return avlCollectFields(tree, node->children[1], fields, idx + 1);
+}
+
+static void
+rankSort(int num_columns, pivot_field *piv_columns)
+{
+ int *hmap; /* [[offset in piv_columns, rank], ...for
+ * every header entry] */
+ int i;
+
+ hmap = (int *) pg_malloc(sizeof(int) * num_columns * 2);
+ for (i = 0; i < num_columns; i++)
+ {
+ char *val = piv_columns[i].sort_value;
+
+ /* ranking information is valid if non null and matches /^-?\d+$/ */
+ if (val &&
+ ((*val == '-' &&
+ strspn(val + 1, "0123456789") == strlen(val + 1)) ||
+ strspn(val, "0123456789") == strlen(val)))
+ {
+ hmap[i * 2] = atoi(val);
+ hmap[i * 2 + 1] = i;
+ }
+ else
+ {
+ /* invalid rank information ignored (equivalent to rank 0) */
+ hmap[i * 2] = 0;
+ hmap[i * 2 + 1] = i;
+ }
+ }
+
+ qsort(hmap, num_columns, sizeof(int) * 2, rankCompare);
+
+ for (i = 0; i < num_columns; i++)
+ {
+ piv_columns[hmap[i * 2 + 1]].rank = i;
+ }
+
+ pg_free(hmap);
+}
+
+/*
+ * Look up a column reference, which can be either:
+ * - a number from 1 to PQnfields(res)
+ * - a column name matching one of PQfname(res,...)
+ *
+ * Returns zero-based column number, or -1 if not found or ambiguous.
+ *
+ * Note: may modify contents of "arg" string.
+ */
+static int
+indexOfColumn(char *arg, const PGresult *res)
+{
+ int idx;
+
+ if (arg[0] && strspn(arg, "0123456789") == strlen(arg))
+ {
+ /* if arg contains only digits, it's a column number */
+ idx = atoi(arg) - 1;
+ if (idx < 0 || idx >= PQnfields(res))
+ {
+ pg_log_error("\\crosstabview: column number %d is out of range 1..%d",
+ idx + 1, PQnfields(res));
+ return -1;
+ }
+ }
+ else
+ {
+ int i;
+
+ /*
+ * Dequote and downcase the column name. By checking for all-digits
+ * before doing this, we can ensure that a quoted name is treated as a
+ * name even if it's all digits.
+ */
+ dequote_downcase_identifier(arg, true, pset.encoding);
+
+ /* Now look for match(es) among res' column names */
+ idx = -1;
+ for (i = 0; i < PQnfields(res); i++)
+ {
+ if (strcmp(arg, PQfname(res, i)) == 0)
+ {
+ if (idx >= 0)
+ {
+ /* another idx was already found for the same name */
+ pg_log_error("\\crosstabview: ambiguous column name: \"%s\"", arg);
+ return -1;
+ }
+ idx = i;
+ }
+ }
+ if (idx == -1)
+ {
+ pg_log_error("\\crosstabview: column name not found: \"%s\"", arg);
+ return -1;
+ }
+ }
+
+ return idx;
+}
+
+/*
+ * Value comparator for vertical and horizontal headers
+ * used for deduplication only.
+ * - null values are considered equal
+ * - non-null < null
+ * - non-null values are compared with strcmp()
+ */
+static int
+pivotFieldCompare(const void *a, const void *b)
+{
+ const pivot_field *pa = (const pivot_field *) a;
+ const pivot_field *pb = (const pivot_field *) b;
+
+ /* test null values */
+ if (!pb->name)
+ return pa->name ? -1 : 0;
+ else if (!pa->name)
+ return 1;
+
+ /* non-null values */
+ return strcmp(pa->name, pb->name);
+}
+
+static int
+rankCompare(const void *a, const void *b)
+{
+ return *((const int *) a) - *((const int *) b);
+}
diff --git a/src/bin/psql/crosstabview.h b/src/bin/psql/crosstabview.h
new file mode 100644
index 0000000..cc7b80f
--- /dev/null
+++ b/src/bin/psql/crosstabview.h
@@ -0,0 +1,29 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/crosstabview.h
+ */
+
+#ifndef CROSSTABVIEW_H
+#define CROSSTABVIEW_H
+
+#include "libpq-fe.h"
+
+/*
+ * Limit the number of output columns generated in memory by the crosstabview
+ * algorithm. A new output column is added for each distinct value found in the
+ * column that pivots (to form the horizontal header).
+ * The purpose of this limit is to fail early instead of over-allocating or spending
+ * too much time if the crosstab to generate happens to be unreasonably large
+ * (worst case: a NxN cartesian product with N=number of tuples).
+ * The value of 1600 corresponds to the maximum columns per table in storage,
+ * but it could be as much as INT_MAX theoretically.
+ */
+#define CROSSTABVIEW_MAX_COLUMNS 1600
+
+/* prototypes */
+extern bool PrintResultInCrosstab(const PGresult *res);
+
+#endif /* CROSSTABVIEW_H */
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
new file mode 100644
index 0000000..45f6a86
--- /dev/null
+++ b/src/bin/psql/describe.c
@@ -0,0 +1,7108 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Support for the various \d ("describe") commands. Note that the current
+ * expectation is that all functions in this file will succeed when working
+ * with servers of versions 9.2 and up. It's okay to omit irrelevant
+ * information for an old server, but not to fail outright. (But failing
+ * against a pre-9.2 server is allowed.)
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/describe.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "catalog/pg_am.h"
+#include "catalog/pg_attribute_d.h"
+#include "catalog/pg_cast_d.h"
+#include "catalog/pg_class_d.h"
+#include "catalog/pg_default_acl_d.h"
+#include "common.h"
+#include "common/logging.h"
+#include "describe.h"
+#include "fe_utils/mbprint.h"
+#include "fe_utils/print.h"
+#include "fe_utils/string_utils.h"
+#include "settings.h"
+#include "variables.h"
+
+static const char *map_typename_pattern(const char *pattern);
+static bool describeOneTableDetails(const char *schemaname,
+ const char *relationname,
+ const char *oid,
+ bool verbose);
+static void add_tablespace_footer(printTableContent *const cont, char relkind,
+ Oid tablespace, const bool newline);
+static void add_role_attribute(PQExpBuffer buf, const char *const str);
+static bool listTSParsersVerbose(const char *pattern);
+static bool describeOneTSParser(const char *oid, const char *nspname,
+ const char *prsname);
+static bool listTSConfigsVerbose(const char *pattern);
+static bool describeOneTSConfig(const char *oid, const char *nspname,
+ const char *cfgname,
+ const char *pnspname, const char *prsname);
+static void printACLColumn(PQExpBuffer buf, const char *colname);
+static bool listOneExtensionContents(const char *extname, const char *oid);
+static bool validateSQLNamePattern(PQExpBuffer buf, const char *pattern,
+ bool have_where, bool force_escape,
+ const char *schemavar, const char *namevar,
+ const char *altnamevar,
+ const char *visibilityrule,
+ bool *added_clause, int maxparts);
+
+
+/*----------------
+ * Handlers for various slash commands displaying some sort of list
+ * of things in the database.
+ *
+ * Note: try to format the queries to look nice in -E output.
+ *----------------
+ */
+
+
+/*
+ * \da
+ * Takes an optional regexp to select particular aggregates
+ */
+bool
+describeAggregates(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " p.proname AS \"%s\",\n"
+ " pg_catalog.format_type(p.prorettype, NULL) AS \"%s\",\n"
+ " CASE WHEN p.pronargs = 0\n"
+ " THEN CAST('*' AS pg_catalog.text)\n"
+ " ELSE pg_catalog.pg_get_function_arguments(p.oid)\n"
+ " END AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"));
+
+ if (pset.sversion >= 110000)
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"\n"
+ "FROM pg_catalog.pg_proc p\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
+ "WHERE p.prokind = 'a'\n",
+ gettext_noop("Description"));
+ else
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"\n"
+ "FROM pg_catalog.pg_proc p\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n"
+ "WHERE p.proisagg\n",
+ gettext_noop("Description"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "p.proname", NULL,
+ "pg_catalog.pg_function_is_visible(p.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of aggregate functions");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dA
+ * Takes an optional regexp to select particular access methods
+ */
+bool
+describeAccessMethods(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, true, false, false};
+
+ if (pset.sversion < 90600)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support access methods.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT amname AS \"%s\",\n"
+ " CASE amtype"
+ " WHEN 'i' THEN '%s'"
+ " WHEN 't' THEN '%s'"
+ " END AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Index"),
+ gettext_noop("Table"),
+ gettext_noop("Type"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n amhandler AS \"%s\",\n"
+ " pg_catalog.obj_description(oid, 'pg_am') AS \"%s\"",
+ gettext_noop("Handler"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_am\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "amname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of access methods");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \db
+ * Takes an optional regexp to select particular tablespaces
+ */
+bool
+describeTablespaces(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT spcname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(spcowner) AS \"%s\",\n"
+ " pg_catalog.pg_tablespace_location(oid) AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Location"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "spcacl");
+ appendPQExpBuffer(&buf,
+ ",\n spcoptions AS \"%s\""
+ ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\""
+ ",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"",
+ gettext_noop("Options"),
+ gettext_noop("Size"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_tablespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "spcname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of tablespaces");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \df
+ * Takes an optional regexp to select particular functions.
+ *
+ * As with \d, you can specify the kinds of functions you want:
+ *
+ * a for aggregates
+ * n for normal
+ * p for procedure
+ * t for trigger
+ * w for window
+ *
+ * and you can mix and match these in any order.
+ */
+bool
+describeFunctions(const char *functypes, const char *func_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem)
+{
+ bool showAggregate = strchr(functypes, 'a') != NULL;
+ bool showNormal = strchr(functypes, 'n') != NULL;
+ bool showProcedure = strchr(functypes, 'p') != NULL;
+ bool showTrigger = strchr(functypes, 't') != NULL;
+ bool showWindow = strchr(functypes, 'w') != NULL;
+ bool have_where;
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false, true, true, true, false, true, false, false, false, false};
+
+ /* No "Parallel" column before 9.6 */
+ static const bool translate_columns_pre_96[] = {false, false, false, false, true, true, false, true, false, false, false, false};
+
+ if (strlen(functypes) != strspn(functypes, "anptwS+"))
+ {
+ pg_log_error("\\df only takes [anptwS+] as options");
+ return true;
+ }
+
+ if (showProcedure && pset.sversion < 110000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("\\df does not take a \"%c\" option with server version %s",
+ 'p',
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ if (!showAggregate && !showNormal && !showProcedure && !showTrigger && !showWindow)
+ {
+ showAggregate = showNormal = showTrigger = showWindow = true;
+ if (pset.sversion >= 110000)
+ showProcedure = true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " p.proname as \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (pset.sversion >= 110000)
+ appendPQExpBuffer(&buf,
+ " pg_catalog.pg_get_function_result(p.oid) as \"%s\",\n"
+ " pg_catalog.pg_get_function_arguments(p.oid) as \"%s\",\n"
+ " CASE p.prokind\n"
+ " WHEN 'a' THEN '%s'\n"
+ " WHEN 'w' THEN '%s'\n"
+ " WHEN 'p' THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"),
+ /* translator: "agg" is short for "aggregate" */
+ gettext_noop("agg"),
+ gettext_noop("window"),
+ gettext_noop("proc"),
+ gettext_noop("func"),
+ gettext_noop("Type"));
+ else
+ appendPQExpBuffer(&buf,
+ " pg_catalog.pg_get_function_result(p.oid) as \"%s\",\n"
+ " pg_catalog.pg_get_function_arguments(p.oid) as \"%s\",\n"
+ " CASE\n"
+ " WHEN p.proisagg THEN '%s'\n"
+ " WHEN p.proiswindow THEN '%s'\n"
+ " WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("Result data type"),
+ gettext_noop("Argument data types"),
+ /* translator: "agg" is short for "aggregate" */
+ gettext_noop("agg"),
+ gettext_noop("window"),
+ gettext_noop("trigger"),
+ gettext_noop("func"),
+ gettext_noop("Type"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n CASE\n"
+ " WHEN p.provolatile = 'i' THEN '%s'\n"
+ " WHEN p.provolatile = 's' THEN '%s'\n"
+ " WHEN p.provolatile = 'v' THEN '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("immutable"),
+ gettext_noop("stable"),
+ gettext_noop("volatile"),
+ gettext_noop("Volatility"));
+ if (pset.sversion >= 90600)
+ appendPQExpBuffer(&buf,
+ ",\n CASE\n"
+ " WHEN p.proparallel = 'r' THEN '%s'\n"
+ " WHEN p.proparallel = 's' THEN '%s'\n"
+ " WHEN p.proparallel = 'u' THEN '%s'\n"
+ " END as \"%s\"",
+ gettext_noop("restricted"),
+ gettext_noop("safe"),
+ gettext_noop("unsafe"),
+ gettext_noop("Parallel"));
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.pg_get_userbyid(p.proowner) as \"%s\""
+ ",\n CASE WHEN prosecdef THEN '%s' ELSE '%s' END AS \"%s\"",
+ gettext_noop("Owner"),
+ gettext_noop("definer"),
+ gettext_noop("invoker"),
+ gettext_noop("Security"));
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "p.proacl");
+ appendPQExpBuffer(&buf,
+ ",\n l.lanname as \"%s\"",
+ gettext_noop("Language"));
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN l.lanname IN ('internal', 'c') THEN p.prosrc END as \"%s\"",
+ gettext_noop("Internal name"));
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_proc p"
+ "\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\n");
+
+ for (int i = 0; i < num_arg_patterns; i++)
+ {
+ appendPQExpBuffer(&buf,
+ " LEFT JOIN pg_catalog.pg_type t%d ON t%d.oid = p.proargtypes[%d]\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt%d ON nt%d.oid = t%d.typnamespace\n",
+ i, i, i, i, i, i);
+ }
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang\n");
+
+ have_where = false;
+
+ /* filter by function type, if requested */
+ if (showNormal && showAggregate && showProcedure && showTrigger && showWindow)
+ /* Do nothing */ ;
+ else if (showNormal)
+ {
+ if (!showAggregate)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind <> 'a'\n");
+ else
+ appendPQExpBufferStr(&buf, "NOT p.proisagg\n");
+ }
+ if (!showProcedure && pset.sversion >= 110000)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ appendPQExpBufferStr(&buf, "p.prokind <> 'p'\n");
+ }
+ if (!showTrigger)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ appendPQExpBufferStr(&buf, "p.prorettype <> 'pg_catalog.trigger'::pg_catalog.regtype\n");
+ }
+ if (!showWindow)
+ {
+ if (have_where)
+ appendPQExpBufferStr(&buf, " AND ");
+ else
+ {
+ appendPQExpBufferStr(&buf, "WHERE ");
+ have_where = true;
+ }
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind <> 'w'\n");
+ else
+ appendPQExpBufferStr(&buf, "NOT p.proiswindow\n");
+ }
+ }
+ else
+ {
+ bool needs_or = false;
+
+ appendPQExpBufferStr(&buf, "WHERE (\n ");
+ have_where = true;
+ /* Note: at least one of these must be true ... */
+ if (showAggregate)
+ {
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind = 'a'\n");
+ else
+ appendPQExpBufferStr(&buf, "p.proisagg\n");
+ needs_or = true;
+ }
+ if (showTrigger)
+ {
+ if (needs_or)
+ appendPQExpBufferStr(&buf, " OR ");
+ appendPQExpBufferStr(&buf,
+ "p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype\n");
+ needs_or = true;
+ }
+ if (showProcedure)
+ {
+ if (needs_or)
+ appendPQExpBufferStr(&buf, " OR ");
+ appendPQExpBufferStr(&buf, "p.prokind = 'p'\n");
+ needs_or = true;
+ }
+ if (showWindow)
+ {
+ if (needs_or)
+ appendPQExpBufferStr(&buf, " OR ");
+ if (pset.sversion >= 110000)
+ appendPQExpBufferStr(&buf, "p.prokind = 'w'\n");
+ else
+ appendPQExpBufferStr(&buf, "p.proiswindow\n");
+ }
+ appendPQExpBufferStr(&buf, " )\n");
+ }
+
+ if (!validateSQLNamePattern(&buf, func_pattern, have_where, false,
+ "n.nspname", "p.proname", NULL,
+ "pg_catalog.pg_function_is_visible(p.oid)",
+ NULL, 3))
+ goto error_return;
+
+ for (int i = 0; i < num_arg_patterns; i++)
+ {
+ if (strcmp(arg_patterns[i], "-") != 0)
+ {
+ /*
+ * Match type-name patterns against either internal or external
+ * name, like \dT. Unlike \dT, there seems no reason to
+ * discriminate against arrays or composite types.
+ */
+ char nspname[64];
+ char typname[64];
+ char ft[64];
+ char tiv[64];
+
+ snprintf(nspname, sizeof(nspname), "nt%d.nspname", i);
+ snprintf(typname, sizeof(typname), "t%d.typname", i);
+ snprintf(ft, sizeof(ft),
+ "pg_catalog.format_type(t%d.oid, NULL)", i);
+ snprintf(tiv, sizeof(tiv),
+ "pg_catalog.pg_type_is_visible(t%d.oid)", i);
+ if (!validateSQLNamePattern(&buf,
+ map_typename_pattern(arg_patterns[i]),
+ true, false,
+ nspname, typname, ft, tiv,
+ NULL, 3))
+ goto error_return;
+ }
+ else
+ {
+ /* "-" pattern specifies no such parameter */
+ appendPQExpBuffer(&buf, " AND t%d.typname IS NULL\n", i);
+ }
+ }
+
+ if (!showSystem && !func_pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of functions");
+ myopt.translate_header = true;
+ if (pset.sversion >= 90600)
+ {
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+ }
+ else
+ {
+ myopt.translate_columns = translate_columns_pre_96;
+ myopt.n_translate_columns = lengthof(translate_columns_pre_96);
+ }
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+
+/*
+ * \dT
+ * describe types
+ */
+bool
+describeTypes(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " pg_catalog.format_type(t.oid, NULL) AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ " t.typname AS \"%s\",\n"
+ " CASE WHEN t.typrelid != 0\n"
+ " THEN CAST('tuple' AS pg_catalog.text)\n"
+ " WHEN t.typlen < 0\n"
+ " THEN CAST('var' AS pg_catalog.text)\n"
+ " ELSE CAST(t.typlen AS pg_catalog.text)\n"
+ " END AS \"%s\",\n"
+ " pg_catalog.array_to_string(\n"
+ " ARRAY(\n"
+ " SELECT e.enumlabel\n"
+ " FROM pg_catalog.pg_enum e\n"
+ " WHERE e.enumtypid = t.oid\n"
+ " ORDER BY e.enumsortorder\n"
+ " ),\n"
+ " E'\\n'\n"
+ " ) AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(t.typowner) AS \"%s\",\n",
+ gettext_noop("Internal name"),
+ gettext_noop("Size"),
+ gettext_noop("Elements"),
+ gettext_noop("Owner"));
+ printACLColumn(&buf, "t.typacl");
+ appendPQExpBufferStr(&buf, ",\n ");
+ }
+
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(t.oid, 'pg_type') as \"%s\"\n",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_type t\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n");
+
+ /*
+ * do not include complex types (typrelid!=0) unless they are standalone
+ * composite types
+ */
+ appendPQExpBufferStr(&buf, "WHERE (t.typrelid = 0 ");
+ appendPQExpBufferStr(&buf, "OR (SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
+ " FROM pg_catalog.pg_class c "
+ "WHERE c.oid = t.typrelid))\n");
+
+ /*
+ * do not include array types unless the pattern contains []
+ */
+ if (pattern == NULL || strstr(pattern, "[]") == NULL)
+ appendPQExpBufferStr(&buf, " AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ /* Match name pattern against either internal or external name */
+ if (!validateSQLNamePattern(&buf, map_typename_pattern(pattern),
+ true, false,
+ "n.nspname", "t.typname",
+ "pg_catalog.format_type(t.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of data types");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * Map some variant type names accepted by the backend grammar into
+ * canonical type names.
+ *
+ * Helper for \dT and other functions that take typename patterns.
+ * This doesn't completely mask the fact that these names are special;
+ * for example, a pattern of "dec*" won't magically match "numeric".
+ * But it goes a long way to reduce the surprise factor.
+ */
+static const char *
+map_typename_pattern(const char *pattern)
+{
+ static const char *const typename_map[] = {
+ /*
+ * These names are accepted by gram.y, although they are neither the
+ * "real" name seen in pg_type nor the canonical name printed by
+ * format_type().
+ */
+ "decimal", "numeric",
+ "float", "double precision",
+ "int", "integer",
+
+ /*
+ * We also have to map the array names for cases where the canonical
+ * name is different from what pg_type says.
+ */
+ "bool[]", "boolean[]",
+ "decimal[]", "numeric[]",
+ "float[]", "double precision[]",
+ "float4[]", "real[]",
+ "float8[]", "double precision[]",
+ "int[]", "integer[]",
+ "int2[]", "smallint[]",
+ "int4[]", "integer[]",
+ "int8[]", "bigint[]",
+ "time[]", "time without time zone[]",
+ "timetz[]", "time with time zone[]",
+ "timestamp[]", "timestamp without time zone[]",
+ "timestamptz[]", "timestamp with time zone[]",
+ "varbit[]", "bit varying[]",
+ "varchar[]", "character varying[]",
+ NULL
+ };
+
+ if (pattern == NULL)
+ return NULL;
+ for (int i = 0; typename_map[i] != NULL; i += 2)
+ {
+ if (pg_strcasecmp(pattern, typename_map[i]) == 0)
+ return typename_map[i + 1];
+ }
+ return pattern;
+}
+
+
+/*
+ * \do
+ * Describe operators
+ */
+bool
+describeOperators(const char *oper_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ /*
+ * Note: before Postgres 9.1, we did not assign comments to any built-in
+ * operators, preferring to let the comment on the underlying function
+ * suffice. The coalesce() on the obj_description() calls below supports
+ * this convention by providing a fallback lookup of a comment on the
+ * operator's function. Since 9.1 there is a policy that every built-in
+ * operator should have a comment; so the coalesce() is no longer
+ * necessary so far as built-in operators are concerned. We keep it
+ * anyway, for now, because third-party modules may still be following the
+ * old convention.
+ *
+ * The support for postfix operators in this query is dead code as of
+ * Postgres 14, but we need to keep it for as long as we support talking
+ * to pre-v14 servers.
+ */
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " o.oprname AS \"%s\",\n"
+ " CASE WHEN o.oprkind='l' THEN NULL ELSE pg_catalog.format_type(o.oprleft, NULL) END AS \"%s\",\n"
+ " CASE WHEN o.oprkind='r' THEN NULL ELSE pg_catalog.format_type(o.oprright, NULL) END AS \"%s\",\n"
+ " pg_catalog.format_type(o.oprresult, NULL) AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Left arg type"),
+ gettext_noop("Right arg type"),
+ gettext_noop("Result type"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ " o.oprcode AS \"%s\",\n",
+ gettext_noop("Function"));
+
+ appendPQExpBuffer(&buf,
+ " coalesce(pg_catalog.obj_description(o.oid, 'pg_operator'),\n"
+ " pg_catalog.obj_description(o.oprcode, 'pg_proc')) AS \"%s\"\n"
+ "FROM pg_catalog.pg_operator o\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
+ gettext_noop("Description"));
+
+ if (num_arg_patterns >= 2)
+ {
+ num_arg_patterns = 2; /* ignore any additional arguments */
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_type t0 ON t0.oid = o.oprleft\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt0 ON nt0.oid = t0.typnamespace\n"
+ " LEFT JOIN pg_catalog.pg_type t1 ON t1.oid = o.oprright\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt1 ON nt1.oid = t1.typnamespace\n");
+ }
+ else if (num_arg_patterns == 1)
+ {
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_type t0 ON t0.oid = o.oprright\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt0 ON nt0.oid = t0.typnamespace\n");
+ }
+
+ if (!showSystem && !oper_pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, oper_pattern,
+ !showSystem && !oper_pattern, true,
+ "n.nspname", "o.oprname", NULL,
+ "pg_catalog.pg_operator_is_visible(o.oid)",
+ NULL, 3))
+ goto error_return;
+
+ if (num_arg_patterns == 1)
+ appendPQExpBufferStr(&buf, " AND o.oprleft = 0\n");
+
+ for (int i = 0; i < num_arg_patterns; i++)
+ {
+ if (strcmp(arg_patterns[i], "-") != 0)
+ {
+ /*
+ * Match type-name patterns against either internal or external
+ * name, like \dT. Unlike \dT, there seems no reason to
+ * discriminate against arrays or composite types.
+ */
+ char nspname[64];
+ char typname[64];
+ char ft[64];
+ char tiv[64];
+
+ snprintf(nspname, sizeof(nspname), "nt%d.nspname", i);
+ snprintf(typname, sizeof(typname), "t%d.typname", i);
+ snprintf(ft, sizeof(ft),
+ "pg_catalog.format_type(t%d.oid, NULL)", i);
+ snprintf(tiv, sizeof(tiv),
+ "pg_catalog.pg_type_is_visible(t%d.oid)", i);
+ if (!validateSQLNamePattern(&buf,
+ map_typename_pattern(arg_patterns[i]),
+ true, false,
+ nspname, typname, ft, tiv,
+ NULL, 3))
+ goto error_return;
+ }
+ else
+ {
+ /* "-" pattern specifies no such parameter */
+ appendPQExpBuffer(&buf, " AND t%d.typname IS NULL\n", i);
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3, 4;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operators");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * listAllDbs
+ *
+ * for \l, \list, and -l switch
+ */
+bool
+listAllDbs(const char *pattern, bool verbose)
+{
+ PGresult *res;
+ PQExpBufferData buf;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " d.datname as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(d.datdba) as \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(d.encoding) as \"%s\",\n",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Encoding"));
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ " CASE d.datlocprovider WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n",
+ gettext_noop("Locale Provider"));
+ else
+ appendPQExpBuffer(&buf,
+ " 'libc' AS \"%s\",\n",
+ gettext_noop("Locale Provider"));
+ appendPQExpBuffer(&buf,
+ " d.datcollate as \"%s\",\n"
+ " d.datctype as \"%s\",\n",
+ gettext_noop("Collate"),
+ gettext_noop("Ctype"));
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ " d.daticulocale as \"%s\",\n",
+ gettext_noop("ICU Locale"));
+ else
+ appendPQExpBuffer(&buf,
+ " NULL as \"%s\",\n",
+ gettext_noop("ICU Locale"));
+ if (pset.sversion >= 160000)
+ appendPQExpBuffer(&buf,
+ " d.daticurules as \"%s\",\n",
+ gettext_noop("ICU Rules"));
+ else
+ appendPQExpBuffer(&buf,
+ " NULL as \"%s\",\n",
+ gettext_noop("ICU Rules"));
+ appendPQExpBufferStr(&buf, " ");
+ printACLColumn(&buf, "d.datacl");
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n"
+ " 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\"",
+ gettext_noop("Size"),
+ gettext_noop("Tablespace"),
+ gettext_noop("Description"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_database d\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid\n");
+
+ if (pattern)
+ {
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "d.datname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of databases");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * List Tables' Grant/Revoke Permissions
+ * \z (now also \dp -- perhaps more mnemonic)
+ */
+bool
+permissionsList(const char *pattern, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, true, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ /*
+ * we ignore indexes and toast tables since they have no meaningful rights
+ */
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " c.relname as \"%s\",\n"
+ " CASE c.relkind"
+ " WHEN " CppAsString2(RELKIND_RELATION) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_VIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_MATVIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_SEQUENCE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+ " END as \"%s\",\n"
+ " ",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("table"),
+ gettext_noop("view"),
+ gettext_noop("materialized view"),
+ gettext_noop("sequence"),
+ gettext_noop("foreign table"),
+ gettext_noop("partitioned table"),
+ gettext_noop("Type"));
+
+ printACLColumn(&buf, "c.relacl");
+
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT attname || E':\\n ' || pg_catalog.array_to_string(attacl, E'\\n ')\n"
+ " FROM pg_catalog.pg_attribute a\n"
+ " WHERE attrelid = c.oid AND NOT attisdropped AND attacl IS NOT NULL\n"
+ " ), E'\\n') AS \"%s\"",
+ gettext_noop("Column privileges"));
+
+ if (pset.sversion >= 90500 && pset.sversion < 100000)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT polname\n"
+ " || CASE WHEN polcmd != '*' THEN\n"
+ " E' (' || polcmd::pg_catalog.text || E'):'\n"
+ " ELSE E':'\n"
+ " END\n"
+ " || CASE WHEN polqual IS NOT NULL THEN\n"
+ " E'\\n (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)\n"
+ " ELSE E''\n"
+ " END\n"
+ " || CASE WHEN polwithcheck IS NOT NULL THEN\n"
+ " E'\\n (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)\n"
+ " ELSE E''\n"
+ " END"
+ " || CASE WHEN polroles <> '{0}' THEN\n"
+ " E'\\n to: ' || pg_catalog.array_to_string(\n"
+ " ARRAY(\n"
+ " SELECT rolname\n"
+ " FROM pg_catalog.pg_roles\n"
+ " WHERE oid = ANY (polroles)\n"
+ " ORDER BY 1\n"
+ " ), E', ')\n"
+ " ELSE E''\n"
+ " END\n"
+ " FROM pg_catalog.pg_policy pol\n"
+ " WHERE polrelid = c.oid), E'\\n')\n"
+ " AS \"%s\"",
+ gettext_noop("Policies"));
+
+ if (pset.sversion >= 100000)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT polname\n"
+ " || CASE WHEN NOT polpermissive THEN\n"
+ " E' (RESTRICTIVE)'\n"
+ " ELSE '' END\n"
+ " || CASE WHEN polcmd != '*' THEN\n"
+ " E' (' || polcmd::pg_catalog.text || E'):'\n"
+ " ELSE E':'\n"
+ " END\n"
+ " || CASE WHEN polqual IS NOT NULL THEN\n"
+ " E'\\n (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)\n"
+ " ELSE E''\n"
+ " END\n"
+ " || CASE WHEN polwithcheck IS NOT NULL THEN\n"
+ " E'\\n (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)\n"
+ " ELSE E''\n"
+ " END"
+ " || CASE WHEN polroles <> '{0}' THEN\n"
+ " E'\\n to: ' || pg_catalog.array_to_string(\n"
+ " ARRAY(\n"
+ " SELECT rolname\n"
+ " FROM pg_catalog.pg_roles\n"
+ " WHERE oid = ANY (polroles)\n"
+ " ORDER BY 1\n"
+ " ), E', ')\n"
+ " ELSE E''\n"
+ " END\n"
+ " FROM pg_catalog.pg_policy pol\n"
+ " WHERE polrelid = c.oid), E'\\n')\n"
+ " AS \"%s\"",
+ gettext_noop("Policies"));
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_class c\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
+ "WHERE c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ","
+ CppAsString2(RELKIND_VIEW) ","
+ CppAsString2(RELKIND_MATVIEW) ","
+ CppAsString2(RELKIND_SEQUENCE) ","
+ CppAsString2(RELKIND_FOREIGN_TABLE) ","
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ myopt.nullPrint = NULL;
+ printfPQExpBuffer(&buf, _("Access privileges"));
+ myopt.title = buf.data;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * \ddp
+ *
+ * List Default ACLs. The pattern can match either schema or role name.
+ */
+bool
+listDefaultACLs(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS \"%s\",\n"
+ " n.nspname AS \"%s\",\n"
+ " CASE d.defaclobjtype WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' WHEN '%c' THEN '%s' END AS \"%s\",\n"
+ " ",
+ gettext_noop("Owner"),
+ gettext_noop("Schema"),
+ DEFACLOBJ_RELATION,
+ gettext_noop("table"),
+ DEFACLOBJ_SEQUENCE,
+ gettext_noop("sequence"),
+ DEFACLOBJ_FUNCTION,
+ gettext_noop("function"),
+ DEFACLOBJ_TYPE,
+ gettext_noop("type"),
+ DEFACLOBJ_NAMESPACE,
+ gettext_noop("schema"),
+ gettext_noop("Type"));
+
+ printACLColumn(&buf, "d.defaclacl");
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_default_acl d\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL,
+ "n.nspname",
+ "pg_catalog.pg_get_userbyid(d.defaclrole)",
+ NULL,
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ myopt.nullPrint = NULL;
+ printfPQExpBuffer(&buf, _("Default access privileges"));
+ myopt.title = buf.data;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * Get object comments
+ *
+ * \dd [foo]
+ *
+ * Note: This command only lists comments for object types which do not have
+ * their comments displayed by their own backslash commands. The following
+ * types of objects will be displayed: constraint, operator class,
+ * operator family, rule, and trigger.
+ *
+ */
+bool
+objectDescription(const char *pattern, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ appendPQExpBuffer(&buf,
+ "SELECT DISTINCT tt.nspname AS \"%s\", tt.name AS \"%s\", tt.object AS \"%s\", d.description AS \"%s\"\n"
+ "FROM (\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Object"),
+ gettext_noop("Description"));
+
+ /* Table constraint descriptions */
+ appendPQExpBuffer(&buf,
+ " SELECT pgc.oid as oid, pgc.tableoid AS tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(pgc.conname AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_constraint pgc\n"
+ " JOIN pg_catalog.pg_class c "
+ "ON c.oid = pgc.conrelid\n"
+ " LEFT JOIN pg_catalog.pg_namespace n "
+ " ON n.oid = c.relnamespace\n",
+ gettext_noop("table constraint"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern,
+ false, "n.nspname", "pgc.conname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Domain constraint descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT pgc.oid as oid, pgc.tableoid AS tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(pgc.conname AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_constraint pgc\n"
+ " JOIN pg_catalog.pg_type t "
+ "ON t.oid = pgc.contypid\n"
+ " LEFT JOIN pg_catalog.pg_namespace n "
+ " ON n.oid = t.typnamespace\n",
+ gettext_noop("domain constraint"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern,
+ false, "n.nspname", "pgc.conname", NULL,
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Operator class descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT o.oid as oid, o.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(o.opcname AS pg_catalog.text) as name,\n"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_opclass o\n"
+ " JOIN pg_catalog.pg_am am ON "
+ "o.opcmethod = am.oid\n"
+ " JOIN pg_catalog.pg_namespace n ON "
+ "n.oid = o.opcnamespace\n",
+ gettext_noop("operator class"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "o.opcname", NULL,
+ "pg_catalog.pg_opclass_is_visible(o.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Operator family descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT opf.oid as oid, opf.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(opf.opfname AS pg_catalog.text) AS name,\n"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_opfamily opf\n"
+ " JOIN pg_catalog.pg_am am "
+ "ON opf.opfmethod = am.oid\n"
+ " JOIN pg_catalog.pg_namespace n "
+ "ON opf.opfnamespace = n.oid\n",
+ gettext_noop("operator family"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "opf.opfname", NULL,
+ "pg_catalog.pg_opfamily_is_visible(opf.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Rule descriptions (ignore rules for views) */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT r.oid as oid, r.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(r.rulename AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_rewrite r\n"
+ " JOIN pg_catalog.pg_class c ON c.oid = r.ev_class\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
+ " WHERE r.rulename != '_RETURN'\n",
+ gettext_noop("rule"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "r.rulename", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ /* Trigger descriptions */
+ appendPQExpBuffer(&buf,
+ "UNION ALL\n"
+ " SELECT t.oid as oid, t.tableoid as tableoid,\n"
+ " n.nspname as nspname,\n"
+ " CAST(t.tgname AS pg_catalog.text) as name,"
+ " CAST('%s' AS pg_catalog.text) as object\n"
+ " FROM pg_catalog.pg_trigger t\n"
+ " JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n",
+ gettext_noop("trigger"));
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, false,
+ "n.nspname", "t.tgname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf,
+ ") AS tt\n"
+ " JOIN pg_catalog.pg_description d ON (tt.oid = d.objoid AND tt.tableoid = d.classoid AND d.objsubid = 0)\n");
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 3;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("Object descriptions");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * describeTableDetails (for \d)
+ *
+ * This routine finds the tables to be displayed, and calls
+ * describeOneTableDetails for each one.
+ *
+ * verbose: if true, this is \d+
+ */
+bool
+describeTableDetails(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid,\n"
+ " n.nspname,\n"
+ " c.relname\n"
+ "FROM pg_catalog.pg_class c\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, !showSystem && !pattern, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 2, 3;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any relation named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any relations.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *oid;
+ const char *nspname;
+ const char *relname;
+
+ oid = PQgetvalue(res, i, 0);
+ nspname = PQgetvalue(res, i, 1);
+ relname = PQgetvalue(res, i, 2);
+
+ if (!describeOneTableDetails(nspname, relname, oid, verbose))
+ {
+ PQclear(res);
+ return false;
+ }
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * describeOneTableDetails (for \d)
+ *
+ * Unfortunately, the information presented here is so complicated that it
+ * cannot be done in a single query. So we have to assemble the printed table
+ * by hand and pass it to the underlying printTable() function.
+ */
+static bool
+describeOneTableDetails(const char *schemaname,
+ const char *relationname,
+ const char *oid,
+ bool verbose)
+{
+ bool retval = false;
+ PQExpBufferData buf;
+ PGresult *res = NULL;
+ printTableOpt myopt = pset.popt.topt;
+ printTableContent cont;
+ bool printTableInitialized = false;
+ int i;
+ char *view_def = NULL;
+ char *headers[12];
+ PQExpBufferData title;
+ PQExpBufferData tmpbuf;
+ int cols;
+ int attname_col = -1, /* column indexes in "res" */
+ atttype_col = -1,
+ attrdef_col = -1,
+ attnotnull_col = -1,
+ attcoll_col = -1,
+ attidentity_col = -1,
+ attgenerated_col = -1,
+ isindexkey_col = -1,
+ indexdef_col = -1,
+ fdwopts_col = -1,
+ attstorage_col = -1,
+ attcompression_col = -1,
+ attstattarget_col = -1,
+ attdescr_col = -1;
+ int numrows;
+ struct
+ {
+ int16 checks;
+ char relkind;
+ bool hasindex;
+ bool hasrules;
+ bool hastriggers;
+ bool rowsecurity;
+ bool forcerowsecurity;
+ bool hasoids;
+ bool ispartition;
+ Oid tablespace;
+ char *reloptions;
+ char *reloftype;
+ char relpersistence;
+ char relreplident;
+ char *relam;
+ } tableinfo;
+ bool show_column_details = false;
+
+ myopt.default_footer = false;
+ /* This output looks confusing in expanded mode. */
+ myopt.expanded = false;
+
+ initPQExpBuffer(&buf);
+ initPQExpBuffer(&title);
+ initPQExpBuffer(&tmpbuf);
+
+ /* Get general table info */
+ if (pset.sversion >= 120000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, "
+ "false AS relhasoids, c.relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident, am.amname\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "LEFT JOIN pg_catalog.pg_am am ON (c.relam = am.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else if (pset.sversion >= 100000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, "
+ "c.relhasoids, c.relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else if (pset.sversion >= 90500)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, c.relrowsecurity, c.relforcerowsecurity, "
+ "c.relhasoids, false as relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else if (pset.sversion >= 90400)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, false, false, c.relhasoids, "
+ "false as relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence, c.relreplident\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c.relchecks, c.relkind, c.relhasindex, c.relhasrules, "
+ "c.relhastriggers, false, false, c.relhasoids, "
+ "false as relispartition, %s, c.reltablespace, "
+ "CASE WHEN c.reloftype = 0 THEN '' ELSE c.reloftype::pg_catalog.regtype::pg_catalog.text END, "
+ "c.relpersistence\n"
+ "FROM pg_catalog.pg_class c\n "
+ "LEFT JOIN pg_catalog.pg_class tc ON (c.reltoastrelid = tc.oid)\n"
+ "WHERE c.oid = '%s';",
+ (verbose ?
+ "pg_catalog.array_to_string(c.reloptions || "
+ "array(select 'toast.' || x from pg_catalog.unnest(tc.reloptions) x), ', ')\n"
+ : "''"),
+ oid);
+ }
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ /* Did we get anything? */
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ pg_log_error("Did not find any relation with OID %s.", oid);
+ goto error_return;
+ }
+
+ tableinfo.checks = atoi(PQgetvalue(res, 0, 0));
+ tableinfo.relkind = *(PQgetvalue(res, 0, 1));
+ tableinfo.hasindex = strcmp(PQgetvalue(res, 0, 2), "t") == 0;
+ tableinfo.hasrules = strcmp(PQgetvalue(res, 0, 3), "t") == 0;
+ tableinfo.hastriggers = strcmp(PQgetvalue(res, 0, 4), "t") == 0;
+ tableinfo.rowsecurity = strcmp(PQgetvalue(res, 0, 5), "t") == 0;
+ tableinfo.forcerowsecurity = strcmp(PQgetvalue(res, 0, 6), "t") == 0;
+ tableinfo.hasoids = strcmp(PQgetvalue(res, 0, 7), "t") == 0;
+ tableinfo.ispartition = strcmp(PQgetvalue(res, 0, 8), "t") == 0;
+ tableinfo.reloptions = pg_strdup(PQgetvalue(res, 0, 9));
+ tableinfo.tablespace = atooid(PQgetvalue(res, 0, 10));
+ tableinfo.reloftype = (strcmp(PQgetvalue(res, 0, 11), "") != 0) ?
+ pg_strdup(PQgetvalue(res, 0, 11)) : NULL;
+ tableinfo.relpersistence = *(PQgetvalue(res, 0, 12));
+ tableinfo.relreplident = (pset.sversion >= 90400) ?
+ *(PQgetvalue(res, 0, 13)) : 'd';
+ if (pset.sversion >= 120000)
+ tableinfo.relam = PQgetisnull(res, 0, 14) ?
+ (char *) NULL : pg_strdup(PQgetvalue(res, 0, 14));
+ else
+ tableinfo.relam = NULL;
+ PQclear(res);
+ res = NULL;
+
+ /*
+ * If it's a sequence, deal with it here separately.
+ */
+ if (tableinfo.relkind == RELKIND_SEQUENCE)
+ {
+ PGresult *result = NULL;
+ printQueryOpt myopt = pset.popt;
+ char *footers[2] = {NULL, NULL};
+
+ if (pset.sversion >= 100000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n"
+ " seqstart AS \"%s\",\n"
+ " seqmin AS \"%s\",\n"
+ " seqmax AS \"%s\",\n"
+ " seqincrement AS \"%s\",\n"
+ " CASE WHEN seqcycle THEN '%s' ELSE '%s' END AS \"%s\",\n"
+ " seqcache AS \"%s\"\n",
+ gettext_noop("Type"),
+ gettext_noop("Start"),
+ gettext_noop("Minimum"),
+ gettext_noop("Maximum"),
+ gettext_noop("Increment"),
+ gettext_noop("yes"),
+ gettext_noop("no"),
+ gettext_noop("Cycles?"),
+ gettext_noop("Cache"));
+ appendPQExpBuffer(&buf,
+ "FROM pg_catalog.pg_sequence\n"
+ "WHERE seqrelid = '%s';",
+ oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT 'bigint' AS \"%s\",\n"
+ " start_value AS \"%s\",\n"
+ " min_value AS \"%s\",\n"
+ " max_value AS \"%s\",\n"
+ " increment_by AS \"%s\",\n"
+ " CASE WHEN is_cycled THEN '%s' ELSE '%s' END AS \"%s\",\n"
+ " cache_value AS \"%s\"\n",
+ gettext_noop("Type"),
+ gettext_noop("Start"),
+ gettext_noop("Minimum"),
+ gettext_noop("Maximum"),
+ gettext_noop("Increment"),
+ gettext_noop("yes"),
+ gettext_noop("no"),
+ gettext_noop("Cycles?"),
+ gettext_noop("Cache"));
+ appendPQExpBuffer(&buf, "FROM %s", fmtId(schemaname));
+ /* must be separate because fmtId isn't reentrant */
+ appendPQExpBuffer(&buf, ".%s;", fmtId(relationname));
+ }
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ /* Get the column that owns this sequence */
+ printfPQExpBuffer(&buf, "SELECT pg_catalog.quote_ident(nspname) || '.' ||"
+ "\n pg_catalog.quote_ident(relname) || '.' ||"
+ "\n pg_catalog.quote_ident(attname),"
+ "\n d.deptype"
+ "\nFROM pg_catalog.pg_class c"
+ "\nINNER JOIN pg_catalog.pg_depend d ON c.oid=d.refobjid"
+ "\nINNER JOIN pg_catalog.pg_namespace n ON n.oid=c.relnamespace"
+ "\nINNER JOIN pg_catalog.pg_attribute a ON ("
+ "\n a.attrelid=c.oid AND"
+ "\n a.attnum=d.refobjsubid)"
+ "\nWHERE d.classid='pg_catalog.pg_class'::pg_catalog.regclass"
+ "\n AND d.refclassid='pg_catalog.pg_class'::pg_catalog.regclass"
+ "\n AND d.objid='%s'"
+ "\n AND d.deptype IN ('a', 'i')",
+ oid);
+
+ result = PSQLexec(buf.data);
+
+ /*
+ * If we get no rows back, don't show anything (obviously). We should
+ * never get more than one row back, but if we do, just ignore it and
+ * don't print anything.
+ */
+ if (!result)
+ goto error_return;
+ else if (PQntuples(result) == 1)
+ {
+ switch (PQgetvalue(result, 0, 1)[0])
+ {
+ case 'a':
+ footers[0] = psprintf(_("Owned by: %s"),
+ PQgetvalue(result, 0, 0));
+ break;
+ case 'i':
+ footers[0] = psprintf(_("Sequence for identity column: %s"),
+ PQgetvalue(result, 0, 0));
+ break;
+ }
+ }
+ PQclear(result);
+
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged sequence \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Sequence \"%s.%s\""),
+ schemaname, relationname);
+
+ myopt.footers = footers;
+ myopt.topt.default_footer = false;
+ myopt.title = title.data;
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ free(footers[0]);
+
+ retval = true;
+ goto error_return; /* not an error, just return early */
+ }
+
+ /* Identify whether we should print collation, nullable, default vals */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_VIEW ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_COMPOSITE_TYPE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ show_column_details = true;
+
+ /*
+ * Get per-column info
+ *
+ * Since the set of query columns we need varies depending on relkind and
+ * server version, we compute all the column numbers on-the-fly. Column
+ * number variables for columns not fetched are left as -1; this avoids
+ * duplicative test logic below.
+ */
+ cols = 0;
+ printfPQExpBuffer(&buf, "SELECT a.attname");
+ attname_col = cols++;
+ appendPQExpBufferStr(&buf, ",\n pg_catalog.format_type(a.atttypid, a.atttypmod)");
+ atttype_col = cols++;
+
+ if (show_column_details)
+ {
+ /* use "pretty" mode for expression to avoid excessive parentheses */
+ appendPQExpBufferStr(&buf,
+ ",\n (SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid, true)"
+ "\n FROM pg_catalog.pg_attrdef d"
+ "\n WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)"
+ ",\n a.attnotnull");
+ attrdef_col = cols++;
+ attnotnull_col = cols++;
+ appendPQExpBufferStr(&buf, ",\n (SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t\n"
+ " WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) AS attcollation");
+ attcoll_col = cols++;
+ if (pset.sversion >= 100000)
+ appendPQExpBufferStr(&buf, ",\n a.attidentity");
+ else
+ appendPQExpBufferStr(&buf, ",\n ''::pg_catalog.char AS attidentity");
+ attidentity_col = cols++;
+ if (pset.sversion >= 120000)
+ appendPQExpBufferStr(&buf, ",\n a.attgenerated");
+ else
+ appendPQExpBufferStr(&buf, ",\n ''::pg_catalog.char AS attgenerated");
+ attgenerated_col = cols++;
+ }
+ if (tableinfo.relkind == RELKIND_INDEX ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX)
+ {
+ if (pset.sversion >= 110000)
+ {
+ appendPQExpBuffer(&buf, ",\n CASE WHEN a.attnum <= (SELECT i.indnkeyatts FROM pg_catalog.pg_index i WHERE i.indexrelid = '%s') THEN '%s' ELSE '%s' END AS is_key",
+ oid,
+ gettext_noop("yes"),
+ gettext_noop("no"));
+ isindexkey_col = cols++;
+ }
+ appendPQExpBufferStr(&buf, ",\n pg_catalog.pg_get_indexdef(a.attrelid, a.attnum, TRUE) AS indexdef");
+ indexdef_col = cols++;
+ }
+ /* FDW options for foreign table column */
+ if (tableinfo.relkind == RELKIND_FOREIGN_TABLE)
+ {
+ appendPQExpBufferStr(&buf, ",\n CASE WHEN attfdwoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(attfdwoptions)), ', ') || ')' END AS attfdwoptions");
+ fdwopts_col = cols++;
+ }
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n a.attstorage");
+ attstorage_col = cols++;
+
+ /* compression info, if relevant to relkind */
+ if (pset.sversion >= 140000 &&
+ !pset.hide_compression &&
+ (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_MATVIEW))
+ {
+ appendPQExpBufferStr(&buf, ",\n a.attcompression AS attcompression");
+ attcompression_col = cols++;
+ }
+
+ /* stats target, if relevant to relkind */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_INDEX ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ appendPQExpBufferStr(&buf, ",\n CASE WHEN a.attstattarget=-1 THEN NULL ELSE a.attstattarget END AS attstattarget");
+ attstattarget_col = cols++;
+ }
+
+ /*
+ * In 9.0+, we have column comments for: relations, views, composite
+ * types, and foreign tables (cf. CommentObject() in comment.c).
+ */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_VIEW ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_COMPOSITE_TYPE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ appendPQExpBufferStr(&buf, ",\n pg_catalog.col_description(a.attrelid, a.attnum)");
+ attdescr_col = cols++;
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_attribute a");
+ appendPQExpBuffer(&buf, "\nWHERE a.attrelid = '%s' AND a.attnum > 0 AND NOT a.attisdropped", oid);
+ appendPQExpBufferStr(&buf, "\nORDER BY a.attnum;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+ numrows = PQntuples(res);
+
+ /* Make title */
+ switch (tableinfo.relkind)
+ {
+ case RELKIND_RELATION:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged table \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_VIEW:
+ printfPQExpBuffer(&title, _("View \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_MATVIEW:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged materialized view \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Materialized view \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_INDEX:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged index \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Index \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_PARTITIONED_INDEX:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged partitioned index \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Partitioned index \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_TOASTVALUE:
+ printfPQExpBuffer(&title, _("TOAST table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_COMPOSITE_TYPE:
+ printfPQExpBuffer(&title, _("Composite type \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_FOREIGN_TABLE:
+ printfPQExpBuffer(&title, _("Foreign table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ case RELKIND_PARTITIONED_TABLE:
+ if (tableinfo.relpersistence == 'u')
+ printfPQExpBuffer(&title, _("Unlogged partitioned table \"%s.%s\""),
+ schemaname, relationname);
+ else
+ printfPQExpBuffer(&title, _("Partitioned table \"%s.%s\""),
+ schemaname, relationname);
+ break;
+ default:
+ /* untranslated unknown relkind */
+ printfPQExpBuffer(&title, "?%c? \"%s.%s\"",
+ tableinfo.relkind, schemaname, relationname);
+ break;
+ }
+
+ /* Fill headers[] with the names of the columns we will output */
+ cols = 0;
+ headers[cols++] = gettext_noop("Column");
+ headers[cols++] = gettext_noop("Type");
+ if (show_column_details)
+ {
+ headers[cols++] = gettext_noop("Collation");
+ headers[cols++] = gettext_noop("Nullable");
+ headers[cols++] = gettext_noop("Default");
+ }
+ if (isindexkey_col >= 0)
+ headers[cols++] = gettext_noop("Key?");
+ if (indexdef_col >= 0)
+ headers[cols++] = gettext_noop("Definition");
+ if (fdwopts_col >= 0)
+ headers[cols++] = gettext_noop("FDW options");
+ if (attstorage_col >= 0)
+ headers[cols++] = gettext_noop("Storage");
+ if (attcompression_col >= 0)
+ headers[cols++] = gettext_noop("Compression");
+ if (attstattarget_col >= 0)
+ headers[cols++] = gettext_noop("Stats target");
+ if (attdescr_col >= 0)
+ headers[cols++] = gettext_noop("Description");
+
+ Assert(cols <= lengthof(headers));
+
+ printTableInit(&cont, &myopt, title.data, cols, numrows);
+ printTableInitialized = true;
+
+ for (i = 0; i < cols; i++)
+ printTableAddHeader(&cont, headers[i], true, 'l');
+
+ /* Generate table cells to be printed */
+ for (i = 0; i < numrows; i++)
+ {
+ /* Column */
+ printTableAddCell(&cont, PQgetvalue(res, i, attname_col), false, false);
+
+ /* Type */
+ printTableAddCell(&cont, PQgetvalue(res, i, atttype_col), false, false);
+
+ /* Collation, Nullable, Default */
+ if (show_column_details)
+ {
+ char *identity;
+ char *generated;
+ char *default_str;
+ bool mustfree = false;
+
+ printTableAddCell(&cont, PQgetvalue(res, i, attcoll_col), false, false);
+
+ printTableAddCell(&cont,
+ strcmp(PQgetvalue(res, i, attnotnull_col), "t") == 0 ? "not null" : "",
+ false, false);
+
+ identity = PQgetvalue(res, i, attidentity_col);
+ generated = PQgetvalue(res, i, attgenerated_col);
+
+ if (identity[0] == ATTRIBUTE_IDENTITY_ALWAYS)
+ default_str = "generated always as identity";
+ else if (identity[0] == ATTRIBUTE_IDENTITY_BY_DEFAULT)
+ default_str = "generated by default as identity";
+ else if (generated[0] == ATTRIBUTE_GENERATED_STORED)
+ {
+ default_str = psprintf("generated always as (%s) stored",
+ PQgetvalue(res, i, attrdef_col));
+ mustfree = true;
+ }
+ else
+ default_str = PQgetvalue(res, i, attrdef_col);
+
+ printTableAddCell(&cont, default_str, false, mustfree);
+ }
+
+ /* Info for index columns */
+ if (isindexkey_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, isindexkey_col), true, false);
+ if (indexdef_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, indexdef_col), false, false);
+
+ /* FDW options for foreign table columns */
+ if (fdwopts_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, fdwopts_col), false, false);
+
+ /* Storage mode, if relevant */
+ if (attstorage_col >= 0)
+ {
+ char *storage = PQgetvalue(res, i, attstorage_col);
+
+ /* these strings are literal in our syntax, so not translated. */
+ printTableAddCell(&cont, (storage[0] == 'p' ? "plain" :
+ (storage[0] == 'm' ? "main" :
+ (storage[0] == 'x' ? "extended" :
+ (storage[0] == 'e' ? "external" :
+ "???")))),
+ false, false);
+ }
+
+ /* Column compression, if relevant */
+ if (attcompression_col >= 0)
+ {
+ char *compression = PQgetvalue(res, i, attcompression_col);
+
+ /* these strings are literal in our syntax, so not translated. */
+ printTableAddCell(&cont, (compression[0] == 'p' ? "pglz" :
+ (compression[0] == 'l' ? "lz4" :
+ (compression[0] == '\0' ? "" :
+ "???"))),
+ false, false);
+ }
+
+ /* Statistics target, if the relkind supports this feature */
+ if (attstattarget_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, attstattarget_col),
+ false, false);
+
+ /* Column comments, if the relkind supports this feature */
+ if (attdescr_col >= 0)
+ printTableAddCell(&cont, PQgetvalue(res, i, attdescr_col),
+ false, false);
+ }
+
+ /* Make footers */
+
+ if (tableinfo.ispartition)
+ {
+ /* Footer information for a partition child table */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT inhparent::pg_catalog.regclass,\n"
+ " pg_catalog.pg_get_expr(c.relpartbound, c.oid),\n ");
+
+ appendPQExpBufferStr(&buf,
+ pset.sversion >= 140000 ? "inhdetachpending" :
+ "false as inhdetachpending");
+
+ /* If verbose, also request the partition constraint definition */
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ ",\n pg_catalog.pg_get_partition_constraintdef(c.oid)");
+ appendPQExpBuffer(&buf,
+ "\nFROM pg_catalog.pg_class c"
+ " JOIN pg_catalog.pg_inherits i"
+ " ON c.oid = inhrelid"
+ "\nWHERE c.oid = '%s';", oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) > 0)
+ {
+ char *parent_name = PQgetvalue(result, 0, 0);
+ char *partdef = PQgetvalue(result, 0, 1);
+ char *detached = PQgetvalue(result, 0, 2);
+
+ printfPQExpBuffer(&tmpbuf, _("Partition of: %s %s%s"), parent_name,
+ partdef,
+ strcmp(detached, "t") == 0 ? " DETACH PENDING" : "");
+ printTableAddFooter(&cont, tmpbuf.data);
+
+ if (verbose)
+ {
+ char *partconstraintdef = NULL;
+
+ if (!PQgetisnull(result, 0, 3))
+ partconstraintdef = PQgetvalue(result, 0, 3);
+ /* If there isn't any constraint, show that explicitly */
+ if (partconstraintdef == NULL || partconstraintdef[0] == '\0')
+ printfPQExpBuffer(&tmpbuf, _("No partition constraint"));
+ else
+ printfPQExpBuffer(&tmpbuf, _("Partition constraint: %s"),
+ partconstraintdef);
+ printTableAddFooter(&cont, tmpbuf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ if (tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ /* Footer information for a partitioned table (partitioning parent) */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_get_partkeydef('%s'::pg_catalog.oid);",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) == 1)
+ {
+ char *partkeydef = PQgetvalue(result, 0, 0);
+
+ printfPQExpBuffer(&tmpbuf, _("Partition key: %s"), partkeydef);
+ printTableAddFooter(&cont, tmpbuf.data);
+ }
+ PQclear(result);
+ }
+
+ if (tableinfo.relkind == RELKIND_TOASTVALUE)
+ {
+ /* For a TOAST table, print name of owning table */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname, c.relname\n"
+ "FROM pg_catalog.pg_class c"
+ " JOIN pg_catalog.pg_namespace n"
+ " ON n.oid = c.relnamespace\n"
+ "WHERE reltoastrelid = '%s';", oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) == 1)
+ {
+ char *schemaname = PQgetvalue(result, 0, 0);
+ char *relname = PQgetvalue(result, 0, 1);
+
+ printfPQExpBuffer(&tmpbuf, _("Owning table: \"%s.%s\""),
+ schemaname, relname);
+ printTableAddFooter(&cont, tmpbuf.data);
+ }
+ PQclear(result);
+ }
+
+ if (tableinfo.relkind == RELKIND_INDEX ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX)
+ {
+ /* Footer information about an index */
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT i.indisunique, i.indisprimary, i.indisclustered, "
+ "i.indisvalid,\n"
+ " (NOT i.indimmediate) AND "
+ "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+ "WHERE conrelid = i.indrelid AND "
+ "conindid = i.indexrelid AND "
+ "contype IN ('p','u','x') AND "
+ "condeferrable) AS condeferrable,\n"
+ " (NOT i.indimmediate) AND "
+ "EXISTS (SELECT 1 FROM pg_catalog.pg_constraint "
+ "WHERE conrelid = i.indrelid AND "
+ "conindid = i.indexrelid AND "
+ "contype IN ('p','u','x') AND "
+ "condeferred) AS condeferred,\n");
+
+ if (pset.sversion >= 90400)
+ appendPQExpBufferStr(&buf, "i.indisreplident,\n");
+ else
+ appendPQExpBufferStr(&buf, "false AS indisreplident,\n");
+
+ if (pset.sversion >= 150000)
+ appendPQExpBufferStr(&buf, "i.indnullsnotdistinct,\n");
+ else
+ appendPQExpBufferStr(&buf, "false AS indnullsnotdistinct,\n");
+
+ appendPQExpBuffer(&buf, " a.amname, c2.relname, "
+ "pg_catalog.pg_get_expr(i.indpred, i.indrelid, true)\n"
+ "FROM pg_catalog.pg_index i, pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_am a\n"
+ "WHERE i.indexrelid = c.oid AND c.oid = '%s' AND c.relam = a.oid\n"
+ "AND i.indrelid = c2.oid;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else if (PQntuples(result) != 1)
+ {
+ PQclear(result);
+ goto error_return;
+ }
+ else
+ {
+ char *indisunique = PQgetvalue(result, 0, 0);
+ char *indisprimary = PQgetvalue(result, 0, 1);
+ char *indisclustered = PQgetvalue(result, 0, 2);
+ char *indisvalid = PQgetvalue(result, 0, 3);
+ char *deferrable = PQgetvalue(result, 0, 4);
+ char *deferred = PQgetvalue(result, 0, 5);
+ char *indisreplident = PQgetvalue(result, 0, 6);
+ char *indnullsnotdistinct = PQgetvalue(result, 0, 7);
+ char *indamname = PQgetvalue(result, 0, 8);
+ char *indtable = PQgetvalue(result, 0, 9);
+ char *indpred = PQgetvalue(result, 0, 10);
+
+ if (strcmp(indisprimary, "t") == 0)
+ printfPQExpBuffer(&tmpbuf, _("primary key, "));
+ else if (strcmp(indisunique, "t") == 0)
+ {
+ printfPQExpBuffer(&tmpbuf, _("unique"));
+ if (strcmp(indnullsnotdistinct, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(" nulls not distinct"));
+ appendPQExpBufferStr(&tmpbuf, _(", "));
+ }
+ else
+ resetPQExpBuffer(&tmpbuf);
+ appendPQExpBuffer(&tmpbuf, "%s, ", indamname);
+
+ /* we assume here that index and table are in same schema */
+ appendPQExpBuffer(&tmpbuf, _("for table \"%s.%s\""),
+ schemaname, indtable);
+
+ if (strlen(indpred))
+ appendPQExpBuffer(&tmpbuf, _(", predicate (%s)"), indpred);
+
+ if (strcmp(indisclustered, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", clustered"));
+
+ if (strcmp(indisvalid, "t") != 0)
+ appendPQExpBufferStr(&tmpbuf, _(", invalid"));
+
+ if (strcmp(deferrable, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", deferrable"));
+
+ if (strcmp(deferred, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", initially deferred"));
+
+ if (strcmp(indisreplident, "t") == 0)
+ appendPQExpBufferStr(&tmpbuf, _(", replica identity"));
+
+ printTableAddFooter(&cont, tmpbuf.data);
+
+ /*
+ * If it's a partitioned index, we'll print the tablespace below
+ */
+ if (tableinfo.relkind == RELKIND_INDEX)
+ add_tablespace_footer(&cont, tableinfo.relkind,
+ tableinfo.tablespace, true);
+ }
+
+ PQclear(result);
+ }
+ /* If you add relkinds here, see also "Finish printing..." stanza below */
+ else if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX ||
+ tableinfo.relkind == RELKIND_TOASTVALUE)
+ {
+ /* Footer information about a table */
+ PGresult *result = NULL;
+ int tuples = 0;
+
+ /* print indexes */
+ if (tableinfo.hasindex)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT c2.relname, i.indisprimary, i.indisunique, "
+ "i.indisclustered, i.indisvalid, "
+ "pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),\n "
+ "pg_catalog.pg_get_constraintdef(con.oid, true), "
+ "contype, condeferrable, condeferred");
+ if (pset.sversion >= 90400)
+ appendPQExpBufferStr(&buf, ", i.indisreplident");
+ else
+ appendPQExpBufferStr(&buf, ", false AS indisreplident");
+ appendPQExpBufferStr(&buf, ", c2.reltablespace");
+ appendPQExpBuffer(&buf,
+ "\nFROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i\n"
+ " LEFT JOIN pg_catalog.pg_constraint con ON (conrelid = i.indrelid AND conindid = i.indexrelid AND contype IN ('p','u','x'))\n"
+ "WHERE c.oid = '%s' AND c.oid = i.indrelid AND i.indexrelid = c2.oid\n"
+ "ORDER BY i.indisprimary DESC, c2.relname;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Indexes:"));
+ for (i = 0; i < tuples; i++)
+ {
+ /* untranslated index name */
+ printfPQExpBuffer(&buf, " \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ /* If exclusion constraint, print the constraintdef */
+ if (strcmp(PQgetvalue(result, i, 7), "x") == 0)
+ {
+ appendPQExpBuffer(&buf, " %s",
+ PQgetvalue(result, i, 6));
+ }
+ else
+ {
+ const char *indexdef;
+ const char *usingpos;
+
+ /* Label as primary key or unique (but not both) */
+ if (strcmp(PQgetvalue(result, i, 1), "t") == 0)
+ appendPQExpBufferStr(&buf, " PRIMARY KEY,");
+ else if (strcmp(PQgetvalue(result, i, 2), "t") == 0)
+ {
+ if (strcmp(PQgetvalue(result, i, 7), "u") == 0)
+ appendPQExpBufferStr(&buf, " UNIQUE CONSTRAINT,");
+ else
+ appendPQExpBufferStr(&buf, " UNIQUE,");
+ }
+
+ /* Everything after "USING" is echoed verbatim */
+ indexdef = PQgetvalue(result, i, 5);
+ usingpos = strstr(indexdef, " USING ");
+ if (usingpos)
+ indexdef = usingpos + 7;
+ appendPQExpBuffer(&buf, " %s", indexdef);
+
+ /* Need these for deferrable PK/UNIQUE indexes */
+ if (strcmp(PQgetvalue(result, i, 8), "t") == 0)
+ appendPQExpBufferStr(&buf, " DEFERRABLE");
+
+ if (strcmp(PQgetvalue(result, i, 9), "t") == 0)
+ appendPQExpBufferStr(&buf, " INITIALLY DEFERRED");
+ }
+
+ /* Add these for all cases */
+ if (strcmp(PQgetvalue(result, i, 3), "t") == 0)
+ appendPQExpBufferStr(&buf, " CLUSTER");
+
+ if (strcmp(PQgetvalue(result, i, 4), "t") != 0)
+ appendPQExpBufferStr(&buf, " INVALID");
+
+ if (strcmp(PQgetvalue(result, i, 10), "t") == 0)
+ appendPQExpBufferStr(&buf, " REPLICA IDENTITY");
+
+ printTableAddFooter(&cont, buf.data);
+
+ /* Print tablespace of the index on the same line */
+ add_tablespace_footer(&cont, RELKIND_INDEX,
+ atooid(PQgetvalue(result, i, 11)),
+ false);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print table (and column) check constraints */
+ if (tableinfo.checks)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT r.conname, "
+ "pg_catalog.pg_get_constraintdef(r.oid, true)\n"
+ "FROM pg_catalog.pg_constraint r\n"
+ "WHERE r.conrelid = '%s' AND r.contype = 'c'\n"
+ "ORDER BY 1;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Check constraints:"));
+ for (i = 0; i < tuples; i++)
+ {
+ /* untranslated constraint name and def */
+ printfPQExpBuffer(&buf, " \"%s\" %s",
+ PQgetvalue(result, i, 0),
+ PQgetvalue(result, i, 1));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /*
+ * Print foreign-key constraints (there are none if no triggers,
+ * except if the table is partitioned, in which case the triggers
+ * appear in the partitions)
+ */
+ if (tableinfo.hastriggers ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ if (pset.sversion >= 120000 &&
+ (tableinfo.ispartition || tableinfo.relkind == RELKIND_PARTITIONED_TABLE))
+ {
+ /*
+ * Put the constraints defined in this table first, followed
+ * by the constraints defined in ancestor partitioned tables.
+ */
+ printfPQExpBuffer(&buf,
+ "SELECT conrelid = '%s'::pg_catalog.regclass AS sametable,\n"
+ " conname,\n"
+ " pg_catalog.pg_get_constraintdef(oid, true) AS condef,\n"
+ " conrelid::pg_catalog.regclass AS ontable\n"
+ " FROM pg_catalog.pg_constraint,\n"
+ " pg_catalog.pg_partition_ancestors('%s')\n"
+ " WHERE conrelid = relid AND contype = 'f' AND conparentid = 0\n"
+ "ORDER BY sametable DESC, conname;",
+ oid, oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT true as sametable, conname,\n"
+ " pg_catalog.pg_get_constraintdef(r.oid, true) as condef,\n"
+ " conrelid::pg_catalog.regclass AS ontable\n"
+ "FROM pg_catalog.pg_constraint r\n"
+ "WHERE r.conrelid = '%s' AND r.contype = 'f'\n",
+ oid);
+
+ if (pset.sversion >= 120000)
+ appendPQExpBufferStr(&buf, " AND conparentid = 0\n");
+ appendPQExpBufferStr(&buf, "ORDER BY conname");
+ }
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ int i_sametable = PQfnumber(result, "sametable"),
+ i_conname = PQfnumber(result, "conname"),
+ i_condef = PQfnumber(result, "condef"),
+ i_ontable = PQfnumber(result, "ontable");
+
+ printTableAddFooter(&cont, _("Foreign-key constraints:"));
+ for (i = 0; i < tuples; i++)
+ {
+ /*
+ * Print untranslated constraint name and definition. Use
+ * a "TABLE tab" prefix when the constraint is defined in
+ * a parent partitioned table.
+ */
+ if (strcmp(PQgetvalue(result, i, i_sametable), "f") == 0)
+ printfPQExpBuffer(&buf, " TABLE \"%s\" CONSTRAINT \"%s\" %s",
+ PQgetvalue(result, i, i_ontable),
+ PQgetvalue(result, i, i_conname),
+ PQgetvalue(result, i, i_condef));
+ else
+ printfPQExpBuffer(&buf, " \"%s\" %s",
+ PQgetvalue(result, i, i_conname),
+ PQgetvalue(result, i, i_condef));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print incoming foreign-key references */
+ if (tableinfo.hastriggers ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE)
+ {
+ if (pset.sversion >= 120000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT conname, conrelid::pg_catalog.regclass AS ontable,\n"
+ " pg_catalog.pg_get_constraintdef(oid, true) AS condef\n"
+ " FROM pg_catalog.pg_constraint c\n"
+ " WHERE confrelid IN (SELECT pg_catalog.pg_partition_ancestors('%s')\n"
+ " UNION ALL VALUES ('%s'::pg_catalog.regclass))\n"
+ " AND contype = 'f' AND conparentid = 0\n"
+ "ORDER BY conname;",
+ oid, oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT conname, conrelid::pg_catalog.regclass AS ontable,\n"
+ " pg_catalog.pg_get_constraintdef(oid, true) AS condef\n"
+ " FROM pg_catalog.pg_constraint\n"
+ " WHERE confrelid = %s AND contype = 'f'\n"
+ "ORDER BY conname;",
+ oid);
+ }
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ int i_conname = PQfnumber(result, "conname"),
+ i_ontable = PQfnumber(result, "ontable"),
+ i_condef = PQfnumber(result, "condef");
+
+ printTableAddFooter(&cont, _("Referenced by:"));
+ for (i = 0; i < tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " TABLE \"%s\" CONSTRAINT \"%s\" %s",
+ PQgetvalue(result, i, i_ontable),
+ PQgetvalue(result, i, i_conname),
+ PQgetvalue(result, i, i_condef));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print any row-level policies */
+ if (pset.sversion >= 90500)
+ {
+ printfPQExpBuffer(&buf, "SELECT pol.polname,");
+ if (pset.sversion >= 100000)
+ appendPQExpBufferStr(&buf,
+ " pol.polpermissive,\n");
+ else
+ appendPQExpBufferStr(&buf,
+ " 't' as polpermissive,\n");
+ appendPQExpBuffer(&buf,
+ " CASE WHEN pol.polroles = '{0}' THEN NULL ELSE pg_catalog.array_to_string(array(select rolname from pg_catalog.pg_roles where oid = any (pol.polroles) order by 1),',') END,\n"
+ " pg_catalog.pg_get_expr(pol.polqual, pol.polrelid),\n"
+ " pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid),\n"
+ " CASE pol.polcmd\n"
+ " WHEN 'r' THEN 'SELECT'\n"
+ " WHEN 'a' THEN 'INSERT'\n"
+ " WHEN 'w' THEN 'UPDATE'\n"
+ " WHEN 'd' THEN 'DELETE'\n"
+ " END AS cmd\n"
+ "FROM pg_catalog.pg_policy pol\n"
+ "WHERE pol.polrelid = '%s' ORDER BY 1;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ /*
+ * Handle cases where RLS is enabled and there are policies, or
+ * there aren't policies, or RLS isn't enabled but there are
+ * policies
+ */
+ if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples > 0)
+ printTableAddFooter(&cont, _("Policies:"));
+
+ if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples > 0)
+ printTableAddFooter(&cont, _("Policies (forced row security enabled):"));
+
+ if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples == 0)
+ printTableAddFooter(&cont, _("Policies (row security enabled): (none)"));
+
+ if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples == 0)
+ printTableAddFooter(&cont, _("Policies (forced row security enabled): (none)"));
+
+ if (!tableinfo.rowsecurity && tuples > 0)
+ printTableAddFooter(&cont, _("Policies (row security disabled):"));
+
+ /* Might be an empty set - that's ok */
+ for (i = 0; i < tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " POLICY \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ if (*(PQgetvalue(result, i, 1)) == 'f')
+ appendPQExpBufferStr(&buf, " AS RESTRICTIVE");
+
+ if (!PQgetisnull(result, i, 5))
+ appendPQExpBuffer(&buf, " FOR %s",
+ PQgetvalue(result, i, 5));
+
+ if (!PQgetisnull(result, i, 2))
+ {
+ appendPQExpBuffer(&buf, "\n TO %s",
+ PQgetvalue(result, i, 2));
+ }
+
+ if (!PQgetisnull(result, i, 3))
+ appendPQExpBuffer(&buf, "\n USING (%s)",
+ PQgetvalue(result, i, 3));
+
+ if (!PQgetisnull(result, i, 4))
+ appendPQExpBuffer(&buf, "\n WITH CHECK (%s)",
+ PQgetvalue(result, i, 4));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ PQclear(result);
+ }
+
+ /* print any extended statistics */
+ if (pset.sversion >= 140000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT oid, "
+ "stxrelid::pg_catalog.regclass, "
+ "stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS nsp, "
+ "stxname,\n"
+ "pg_catalog.pg_get_statisticsobjdef_columns(oid) AS columns,\n"
+ " 'd' = any(stxkind) AS ndist_enabled,\n"
+ " 'f' = any(stxkind) AS deps_enabled,\n"
+ " 'm' = any(stxkind) AS mcv_enabled,\n"
+ "stxstattarget\n"
+ "FROM pg_catalog.pg_statistic_ext\n"
+ "WHERE stxrelid = '%s'\n"
+ "ORDER BY nsp, stxname;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Statistics objects:"));
+
+ for (i = 0; i < tuples; i++)
+ {
+ bool gotone = false;
+ bool has_ndistinct;
+ bool has_dependencies;
+ bool has_mcv;
+ bool has_all;
+ bool has_some;
+
+ has_ndistinct = (strcmp(PQgetvalue(result, i, 5), "t") == 0);
+ has_dependencies = (strcmp(PQgetvalue(result, i, 6), "t") == 0);
+ has_mcv = (strcmp(PQgetvalue(result, i, 7), "t") == 0);
+
+ printfPQExpBuffer(&buf, " ");
+
+ /* statistics object name (qualified with namespace) */
+ appendPQExpBuffer(&buf, "\"%s.%s\"",
+ PQgetvalue(result, i, 2),
+ PQgetvalue(result, i, 3));
+
+ /*
+ * When printing kinds we ignore expression statistics,
+ * which are used only internally and can't be specified
+ * by user. We don't print the kinds when none are
+ * specified (in which case it has to be statistics on a
+ * single expr) or when all are specified (in which case
+ * we assume it's expanded by CREATE STATISTICS).
+ */
+ has_all = (has_ndistinct && has_dependencies && has_mcv);
+ has_some = (has_ndistinct || has_dependencies || has_mcv);
+
+ if (has_some && !has_all)
+ {
+ appendPQExpBufferStr(&buf, " (");
+
+ /* options */
+ if (has_ndistinct)
+ {
+ appendPQExpBufferStr(&buf, "ndistinct");
+ gotone = true;
+ }
+
+ if (has_dependencies)
+ {
+ appendPQExpBuffer(&buf, "%sdependencies", gotone ? ", " : "");
+ gotone = true;
+ }
+
+ if (has_mcv)
+ {
+ appendPQExpBuffer(&buf, "%smcv", gotone ? ", " : "");
+ }
+
+ appendPQExpBufferChar(&buf, ')');
+ }
+
+ appendPQExpBuffer(&buf, " ON %s FROM %s",
+ PQgetvalue(result, i, 4),
+ PQgetvalue(result, i, 1));
+
+ /* Show the stats target if it's not default */
+ if (strcmp(PQgetvalue(result, i, 8), "-1") != 0)
+ appendPQExpBuffer(&buf, "; STATISTICS %s",
+ PQgetvalue(result, i, 8));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+ else if (pset.sversion >= 100000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT oid, "
+ "stxrelid::pg_catalog.regclass, "
+ "stxnamespace::pg_catalog.regnamespace AS nsp, "
+ "stxname,\n"
+ " (SELECT pg_catalog.string_agg(pg_catalog.quote_ident(attname),', ')\n"
+ " FROM pg_catalog.unnest(stxkeys) s(attnum)\n"
+ " JOIN pg_catalog.pg_attribute a ON (stxrelid = a.attrelid AND\n"
+ " a.attnum = s.attnum AND NOT attisdropped)) AS columns,\n"
+ " 'd' = any(stxkind) AS ndist_enabled,\n"
+ " 'f' = any(stxkind) AS deps_enabled,\n"
+ " 'm' = any(stxkind) AS mcv_enabled,\n");
+
+ if (pset.sversion >= 130000)
+ appendPQExpBufferStr(&buf, " stxstattarget\n");
+ else
+ appendPQExpBufferStr(&buf, " -1 AS stxstattarget\n");
+ appendPQExpBuffer(&buf, "FROM pg_catalog.pg_statistic_ext\n"
+ "WHERE stxrelid = '%s'\n"
+ "ORDER BY 1;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ printTableAddFooter(&cont, _("Statistics objects:"));
+
+ for (i = 0; i < tuples; i++)
+ {
+ bool gotone = false;
+
+ printfPQExpBuffer(&buf, " ");
+
+ /* statistics object name (qualified with namespace) */
+ appendPQExpBuffer(&buf, "\"%s.%s\" (",
+ PQgetvalue(result, i, 2),
+ PQgetvalue(result, i, 3));
+
+ /* options */
+ if (strcmp(PQgetvalue(result, i, 5), "t") == 0)
+ {
+ appendPQExpBufferStr(&buf, "ndistinct");
+ gotone = true;
+ }
+
+ if (strcmp(PQgetvalue(result, i, 6), "t") == 0)
+ {
+ appendPQExpBuffer(&buf, "%sdependencies", gotone ? ", " : "");
+ gotone = true;
+ }
+
+ if (strcmp(PQgetvalue(result, i, 7), "t") == 0)
+ {
+ appendPQExpBuffer(&buf, "%smcv", gotone ? ", " : "");
+ }
+
+ appendPQExpBuffer(&buf, ") ON %s FROM %s",
+ PQgetvalue(result, i, 4),
+ PQgetvalue(result, i, 1));
+
+ /* Show the stats target if it's not default */
+ if (strcmp(PQgetvalue(result, i, 8), "-1") != 0)
+ appendPQExpBuffer(&buf, "; STATISTICS %s",
+ PQgetvalue(result, i, 8));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print rules */
+ if (tableinfo.hasrules && tableinfo.relkind != RELKIND_MATVIEW)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true)), "
+ "ev_enabled\n"
+ "FROM pg_catalog.pg_rewrite r\n"
+ "WHERE r.ev_class = '%s' ORDER BY 1;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ bool have_heading;
+ int category;
+
+ for (category = 0; category < 4; category++)
+ {
+ have_heading = false;
+
+ for (i = 0; i < tuples; i++)
+ {
+ const char *ruledef;
+ bool list_rule = false;
+
+ switch (category)
+ {
+ case 0:
+ if (*PQgetvalue(result, i, 2) == 'O')
+ list_rule = true;
+ break;
+ case 1:
+ if (*PQgetvalue(result, i, 2) == 'D')
+ list_rule = true;
+ break;
+ case 2:
+ if (*PQgetvalue(result, i, 2) == 'A')
+ list_rule = true;
+ break;
+ case 3:
+ if (*PQgetvalue(result, i, 2) == 'R')
+ list_rule = true;
+ break;
+ }
+ if (!list_rule)
+ continue;
+
+ if (!have_heading)
+ {
+ switch (category)
+ {
+ case 0:
+ printfPQExpBuffer(&buf, _("Rules:"));
+ break;
+ case 1:
+ printfPQExpBuffer(&buf, _("Disabled rules:"));
+ break;
+ case 2:
+ printfPQExpBuffer(&buf, _("Rules firing always:"));
+ break;
+ case 3:
+ printfPQExpBuffer(&buf, _("Rules firing on replica only:"));
+ break;
+ }
+ printTableAddFooter(&cont, buf.data);
+ have_heading = true;
+ }
+
+ /* Everything after "CREATE RULE" is echoed verbatim */
+ ruledef = PQgetvalue(result, i, 1);
+ ruledef += 12;
+ printfPQExpBuffer(&buf, " %s", ruledef);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ }
+ PQclear(result);
+ }
+
+ /* print any publications */
+ if (pset.sversion >= 100000)
+ {
+ if (pset.sversion >= 150000)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n"
+ " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n"
+ "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n"
+ "UNION\n"
+ "SELECT pubname\n"
+ " , pg_get_expr(pr.prqual, c.oid)\n"
+ " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n"
+ " (SELECT string_agg(attname, ', ')\n"
+ " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
+ " pg_catalog.pg_attribute\n"
+ " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n"
+ " ELSE NULL END) "
+ "FROM pg_catalog.pg_publication p\n"
+ " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
+ " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n"
+ "WHERE pr.prrelid = '%s'\n"
+ "UNION\n"
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
+ "ORDER BY 1;",
+ oid, oid, oid, oid);
+ }
+ else
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ "JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
+ "WHERE pr.prrelid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT pubname\n"
+ " , NULL\n"
+ " , NULL\n"
+ "FROM pg_catalog.pg_publication p\n"
+ "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
+ "ORDER BY 1;",
+ oid, oid);
+ }
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ printTableAddFooter(&cont, _("Publications:"));
+
+ /* Might be an empty set - that's ok */
+ for (i = 0; i < tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ /* column list (if any) */
+ if (!PQgetisnull(result, i, 2))
+ appendPQExpBuffer(&buf, " (%s)",
+ PQgetvalue(result, i, 2));
+
+ /* row filter (if any) */
+ if (!PQgetisnull(result, i, 1))
+ appendPQExpBuffer(&buf, " WHERE %s",
+ PQgetvalue(result, i, 1));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ PQclear(result);
+ }
+ }
+
+ /* Get view_def if table is a view or materialized view */
+ if ((tableinfo.relkind == RELKIND_VIEW ||
+ tableinfo.relkind == RELKIND_MATVIEW) && verbose)
+ {
+ PGresult *result;
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_get_viewdef('%s'::pg_catalog.oid, true);",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) > 0)
+ view_def = pg_strdup(PQgetvalue(result, 0, 0));
+
+ PQclear(result);
+ }
+
+ if (view_def)
+ {
+ PGresult *result = NULL;
+
+ /* Footer information about a view */
+ printTableAddFooter(&cont, _("View definition:"));
+ printTableAddFooter(&cont, view_def);
+
+ /* print rules */
+ if (tableinfo.hasrules)
+ {
+ printfPQExpBuffer(&buf,
+ "SELECT r.rulename, trim(trailing ';' from pg_catalog.pg_get_ruledef(r.oid, true))\n"
+ "FROM pg_catalog.pg_rewrite r\n"
+ "WHERE r.ev_class = '%s' AND r.rulename != '_RETURN' ORDER BY 1;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+
+ if (PQntuples(result) > 0)
+ {
+ printTableAddFooter(&cont, _("Rules:"));
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ const char *ruledef;
+
+ /* Everything after "CREATE RULE" is echoed verbatim */
+ ruledef = PQgetvalue(result, i, 1);
+ ruledef += 12;
+
+ printfPQExpBuffer(&buf, " %s", ruledef);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+ }
+ }
+
+ /*
+ * Print triggers next, if any (but only user-defined triggers). This
+ * could apply to either a table or a view.
+ */
+ if (tableinfo.hastriggers)
+ {
+ PGresult *result;
+ int tuples;
+
+ printfPQExpBuffer(&buf,
+ "SELECT t.tgname, "
+ "pg_catalog.pg_get_triggerdef(t.oid, true), "
+ "t.tgenabled, t.tgisinternal,\n");
+
+ /*
+ * Detect whether each trigger is inherited, and if so, get the name
+ * of the topmost table it's inherited from. We have no easy way to
+ * do that pre-v13, for lack of the tgparentid column. Even with
+ * tgparentid, a straightforward search for the topmost parent would
+ * require a recursive CTE, which seems unduly expensive. We cheat a
+ * bit by assuming parent triggers will match by tgname; then, joining
+ * with pg_partition_ancestors() allows the planner to make use of
+ * pg_trigger_tgrelid_tgname_index if it wishes. We ensure we find
+ * the correct topmost parent by stopping at the first-in-partition-
+ * ancestry-order trigger that has tgparentid = 0. (There might be
+ * unrelated, non-inherited triggers with the same name further up the
+ * stack, so this is important.)
+ */
+ if (pset.sversion >= 130000)
+ appendPQExpBufferStr(&buf,
+ " CASE WHEN t.tgparentid != 0 THEN\n"
+ " (SELECT u.tgrelid::pg_catalog.regclass\n"
+ " FROM pg_catalog.pg_trigger AS u,\n"
+ " pg_catalog.pg_partition_ancestors(t.tgrelid) WITH ORDINALITY AS a(relid, depth)\n"
+ " WHERE u.tgname = t.tgname AND u.tgrelid = a.relid\n"
+ " AND u.tgparentid = 0\n"
+ " ORDER BY a.depth LIMIT 1)\n"
+ " END AS parent\n");
+ else
+ appendPQExpBufferStr(&buf, " NULL AS parent\n");
+
+ appendPQExpBuffer(&buf,
+ "FROM pg_catalog.pg_trigger t\n"
+ "WHERE t.tgrelid = '%s' AND ",
+ oid);
+
+ /*
+ * tgisinternal is set true for inherited triggers of partitions in
+ * servers between v11 and v14, though these must still be shown to
+ * the user. So we use another property that is true for such
+ * inherited triggers to avoid them being hidden, which is their
+ * dependence on another trigger.
+ */
+ if (pset.sversion >= 110000 && pset.sversion < 150000)
+ appendPQExpBufferStr(&buf, "(NOT t.tgisinternal OR (t.tgisinternal AND t.tgenabled = 'D') \n"
+ " OR EXISTS (SELECT 1 FROM pg_catalog.pg_depend WHERE objid = t.oid \n"
+ " AND refclassid = 'pg_catalog.pg_trigger'::pg_catalog.regclass))");
+ else
+ /* display/warn about disabled internal triggers */
+ appendPQExpBufferStr(&buf, "(NOT t.tgisinternal OR (t.tgisinternal AND t.tgenabled = 'D'))");
+ appendPQExpBufferStr(&buf, "\nORDER BY 1;");
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ tuples = PQntuples(result);
+
+ if (tuples > 0)
+ {
+ bool have_heading;
+ int category;
+
+ /*
+ * split the output into 4 different categories. Enabled triggers,
+ * disabled triggers and the two special ALWAYS and REPLICA
+ * configurations.
+ */
+ for (category = 0; category <= 4; category++)
+ {
+ have_heading = false;
+ for (i = 0; i < tuples; i++)
+ {
+ bool list_trigger;
+ const char *tgdef;
+ const char *usingpos;
+ const char *tgenabled;
+ const char *tgisinternal;
+
+ /*
+ * Check if this trigger falls into the current category
+ */
+ tgenabled = PQgetvalue(result, i, 2);
+ tgisinternal = PQgetvalue(result, i, 3);
+ list_trigger = false;
+ switch (category)
+ {
+ case 0:
+ if (*tgenabled == 'O' || *tgenabled == 't')
+ list_trigger = true;
+ break;
+ case 1:
+ if ((*tgenabled == 'D' || *tgenabled == 'f') &&
+ *tgisinternal == 'f')
+ list_trigger = true;
+ break;
+ case 2:
+ if ((*tgenabled == 'D' || *tgenabled == 'f') &&
+ *tgisinternal == 't')
+ list_trigger = true;
+ break;
+ case 3:
+ if (*tgenabled == 'A')
+ list_trigger = true;
+ break;
+ case 4:
+ if (*tgenabled == 'R')
+ list_trigger = true;
+ break;
+ }
+ if (list_trigger == false)
+ continue;
+
+ /* Print the category heading once */
+ if (have_heading == false)
+ {
+ switch (category)
+ {
+ case 0:
+ printfPQExpBuffer(&buf, _("Triggers:"));
+ break;
+ case 1:
+ printfPQExpBuffer(&buf, _("Disabled user triggers:"));
+ break;
+ case 2:
+ printfPQExpBuffer(&buf, _("Disabled internal triggers:"));
+ break;
+ case 3:
+ printfPQExpBuffer(&buf, _("Triggers firing always:"));
+ break;
+ case 4:
+ printfPQExpBuffer(&buf, _("Triggers firing on replica only:"));
+ break;
+ }
+ printTableAddFooter(&cont, buf.data);
+ have_heading = true;
+ }
+
+ /* Everything after "TRIGGER" is echoed verbatim */
+ tgdef = PQgetvalue(result, i, 1);
+ usingpos = strstr(tgdef, " TRIGGER ");
+ if (usingpos)
+ tgdef = usingpos + 9;
+
+ printfPQExpBuffer(&buf, " %s", tgdef);
+
+ /* Visually distinguish inherited triggers */
+ if (!PQgetisnull(result, i, 4))
+ appendPQExpBuffer(&buf, ", ON TABLE %s",
+ PQgetvalue(result, i, 4));
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ }
+ PQclear(result);
+ }
+
+ /*
+ * Finish printing the footer information about a table.
+ */
+ if (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_MATVIEW ||
+ tableinfo.relkind == RELKIND_FOREIGN_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX ||
+ tableinfo.relkind == RELKIND_TOASTVALUE)
+ {
+ bool is_partitioned;
+ PGresult *result;
+ int tuples;
+
+ /* simplify some repeated tests below */
+ is_partitioned = (tableinfo.relkind == RELKIND_PARTITIONED_TABLE ||
+ tableinfo.relkind == RELKIND_PARTITIONED_INDEX);
+
+ /* print foreign server name */
+ if (tableinfo.relkind == RELKIND_FOREIGN_TABLE)
+ {
+ char *ftoptions;
+
+ /* Footer information about foreign table */
+ printfPQExpBuffer(&buf,
+ "SELECT s.srvname,\n"
+ " pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT pg_catalog.quote_ident(option_name)"
+ " || ' ' || pg_catalog.quote_literal(option_value)\n"
+ " FROM pg_catalog.pg_options_to_table(ftoptions)), ', ')\n"
+ "FROM pg_catalog.pg_foreign_table f,\n"
+ " pg_catalog.pg_foreign_server s\n"
+ "WHERE f.ftrelid = '%s' AND s.oid = f.ftserver;",
+ oid);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else if (PQntuples(result) != 1)
+ {
+ PQclear(result);
+ goto error_return;
+ }
+
+ /* Print server name */
+ printfPQExpBuffer(&buf, _("Server: %s"),
+ PQgetvalue(result, 0, 0));
+ printTableAddFooter(&cont, buf.data);
+
+ /* Print per-table FDW options, if any */
+ ftoptions = PQgetvalue(result, 0, 1);
+ if (ftoptions && ftoptions[0] != '\0')
+ {
+ printfPQExpBuffer(&buf, _("FDW options: (%s)"), ftoptions);
+ printTableAddFooter(&cont, buf.data);
+ }
+ PQclear(result);
+ }
+
+ /* print tables inherited from (exclude partitioned parents) */
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhparent AND i.inhrelid = '%s'\n"
+ " AND c.relkind != " CppAsString2(RELKIND_PARTITIONED_TABLE)
+ " AND c.relkind != " CppAsString2(RELKIND_PARTITIONED_INDEX)
+ "\nORDER BY inhseqno;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ {
+ const char *s = _("Inherits");
+ int sw = pg_wcswidth(s, strlen(s), pset.encoding);
+
+ tuples = PQntuples(result);
+
+ for (i = 0; i < tuples; i++)
+ {
+ if (i == 0)
+ printfPQExpBuffer(&buf, "%s: %s",
+ s, PQgetvalue(result, i, 0));
+ else
+ printfPQExpBuffer(&buf, "%*s %s",
+ sw, "", PQgetvalue(result, i, 0));
+ if (i < tuples - 1)
+ appendPQExpBufferChar(&buf, ',');
+
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ PQclear(result);
+ }
+
+ /* print child tables (with additional info if partitions) */
+ if (pset.sversion >= 140000)
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass, c.relkind,"
+ " inhdetachpending,"
+ " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n"
+ "ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT',"
+ " c.oid::pg_catalog.regclass::pg_catalog.text;",
+ oid);
+ else if (pset.sversion >= 100000)
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass, c.relkind,"
+ " false AS inhdetachpending,"
+ " pg_catalog.pg_get_expr(c.relpartbound, c.oid)\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n"
+ "ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT',"
+ " c.oid::pg_catalog.regclass::pg_catalog.text;",
+ oid);
+ else
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid::pg_catalog.regclass, c.relkind,"
+ " false AS inhdetachpending, NULL\n"
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i\n"
+ "WHERE c.oid = i.inhrelid AND i.inhparent = '%s'\n"
+ "ORDER BY c.oid::pg_catalog.regclass::pg_catalog.text;",
+ oid);
+
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ tuples = PQntuples(result);
+
+ /*
+ * For a partitioned table with no partitions, always print the number
+ * of partitions as zero, even when verbose output is expected.
+ * Otherwise, we will not print "Partitions" section for a partitioned
+ * table without any partitions.
+ */
+ if (is_partitioned && tuples == 0)
+ {
+ printfPQExpBuffer(&buf, _("Number of partitions: %d"), tuples);
+ printTableAddFooter(&cont, buf.data);
+ }
+ else if (!verbose)
+ {
+ /* print the number of child tables, if any */
+ if (tuples > 0)
+ {
+ if (is_partitioned)
+ printfPQExpBuffer(&buf, _("Number of partitions: %d (Use \\d+ to list them.)"), tuples);
+ else
+ printfPQExpBuffer(&buf, _("Number of child tables: %d (Use \\d+ to list them.)"), tuples);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ else
+ {
+ /* display the list of child tables */
+ const char *ct = is_partitioned ? _("Partitions") : _("Child tables");
+ int ctw = pg_wcswidth(ct, strlen(ct), pset.encoding);
+
+ for (i = 0; i < tuples; i++)
+ {
+ char child_relkind = *PQgetvalue(result, i, 1);
+
+ if (i == 0)
+ printfPQExpBuffer(&buf, "%s: %s",
+ ct, PQgetvalue(result, i, 0));
+ else
+ printfPQExpBuffer(&buf, "%*s %s",
+ ctw, "", PQgetvalue(result, i, 0));
+ if (!PQgetisnull(result, i, 3))
+ appendPQExpBuffer(&buf, " %s", PQgetvalue(result, i, 3));
+ if (child_relkind == RELKIND_PARTITIONED_TABLE ||
+ child_relkind == RELKIND_PARTITIONED_INDEX)
+ appendPQExpBufferStr(&buf, ", PARTITIONED");
+ else if (child_relkind == RELKIND_FOREIGN_TABLE)
+ appendPQExpBufferStr(&buf, ", FOREIGN");
+ if (strcmp(PQgetvalue(result, i, 2), "t") == 0)
+ appendPQExpBufferStr(&buf, " (DETACH PENDING)");
+ if (i < tuples - 1)
+ appendPQExpBufferChar(&buf, ',');
+
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+ PQclear(result);
+
+ /* Table type */
+ if (tableinfo.reloftype)
+ {
+ printfPQExpBuffer(&buf, _("Typed table of type: %s"), tableinfo.reloftype);
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ if (verbose &&
+ (tableinfo.relkind == RELKIND_RELATION ||
+ tableinfo.relkind == RELKIND_MATVIEW) &&
+
+ /*
+ * No need to display default values; we already display a REPLICA
+ * IDENTITY marker on indexes.
+ */
+ tableinfo.relreplident != 'i' &&
+ ((strcmp(schemaname, "pg_catalog") != 0 && tableinfo.relreplident != 'd') ||
+ (strcmp(schemaname, "pg_catalog") == 0 && tableinfo.relreplident != 'n')))
+ {
+ const char *s = _("Replica Identity");
+
+ printfPQExpBuffer(&buf, "%s: %s",
+ s,
+ tableinfo.relreplident == 'f' ? "FULL" :
+ tableinfo.relreplident == 'n' ? "NOTHING" :
+ "???");
+
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ /* OIDs, if verbose and not a materialized view */
+ if (verbose && tableinfo.relkind != RELKIND_MATVIEW && tableinfo.hasoids)
+ printTableAddFooter(&cont, _("Has OIDs: yes"));
+
+ /* Tablespace info */
+ add_tablespace_footer(&cont, tableinfo.relkind, tableinfo.tablespace,
+ true);
+
+ /* Access method info */
+ if (verbose && tableinfo.relam != NULL && !pset.hide_tableam)
+ {
+ printfPQExpBuffer(&buf, _("Access method: %s"), tableinfo.relam);
+ printTableAddFooter(&cont, buf.data);
+ }
+ }
+
+ /* reloptions, if verbose */
+ if (verbose &&
+ tableinfo.reloptions && tableinfo.reloptions[0] != '\0')
+ {
+ const char *t = _("Options");
+
+ printfPQExpBuffer(&buf, "%s: %s", t, tableinfo.reloptions);
+ printTableAddFooter(&cont, buf.data);
+ }
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+
+ retval = true;
+
+error_return:
+
+ /* clean up */
+ if (printTableInitialized)
+ printTableCleanup(&cont);
+ termPQExpBuffer(&buf);
+ termPQExpBuffer(&title);
+ termPQExpBuffer(&tmpbuf);
+
+ free(view_def);
+
+ PQclear(res);
+
+ return retval;
+}
+
+/*
+ * Add a tablespace description to a footer. If 'newline' is true, it is added
+ * in a new line; otherwise it's appended to the current value of the last
+ * footer.
+ */
+static void
+add_tablespace_footer(printTableContent *const cont, char relkind,
+ Oid tablespace, const bool newline)
+{
+ /* relkinds for which we support tablespaces */
+ if (relkind == RELKIND_RELATION ||
+ relkind == RELKIND_MATVIEW ||
+ relkind == RELKIND_INDEX ||
+ relkind == RELKIND_PARTITIONED_TABLE ||
+ relkind == RELKIND_PARTITIONED_INDEX ||
+ relkind == RELKIND_TOASTVALUE)
+ {
+ /*
+ * We ignore the database default tablespace so that users not using
+ * tablespaces don't need to know about them.
+ */
+ if (tablespace != 0)
+ {
+ PGresult *result = NULL;
+ PQExpBufferData buf;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT spcname FROM pg_catalog.pg_tablespace\n"
+ "WHERE oid = '%u';", tablespace);
+ result = PSQLexec(buf.data);
+ if (!result)
+ {
+ termPQExpBuffer(&buf);
+ return;
+ }
+ /* Should always be the case, but.... */
+ if (PQntuples(result) > 0)
+ {
+ if (newline)
+ {
+ /* Add the tablespace as a new footer */
+ printfPQExpBuffer(&buf, _("Tablespace: \"%s\""),
+ PQgetvalue(result, 0, 0));
+ printTableAddFooter(cont, buf.data);
+ }
+ else
+ {
+ /* Append the tablespace to the latest footer */
+ printfPQExpBuffer(&buf, "%s", cont->footer->data);
+
+ /*-------
+ translator: before this string there's an index description like
+ '"foo_pkey" PRIMARY KEY, btree (a)' */
+ appendPQExpBuffer(&buf, _(", tablespace \"%s\""),
+ PQgetvalue(result, 0, 0));
+ printTableSetFooter(cont, buf.data);
+ }
+ }
+ PQclear(result);
+ termPQExpBuffer(&buf);
+ }
+ }
+}
+
+/*
+ * \du or \dg
+ *
+ * Describes roles. Any schema portion of the pattern is ignored.
+ */
+bool
+describeRoles(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printTableContent cont;
+ printTableOpt myopt = pset.popt.topt;
+ int ncols = 2;
+ int nrows = 0;
+ int i;
+ int conns;
+ const char align = 'l';
+ char **attr;
+
+ myopt.default_footer = false;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT r.rolname, r.rolsuper, r.rolinherit,\n"
+ " r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,\n"
+ " r.rolconnlimit, r.rolvaliduntil");
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, "\n, pg_catalog.shobj_description(r.oid, 'pg_authid') AS description");
+ ncols++;
+ }
+ appendPQExpBufferStr(&buf, "\n, r.rolreplication");
+
+ if (pset.sversion >= 90500)
+ {
+ appendPQExpBufferStr(&buf, "\n, r.rolbypassrls");
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_roles r\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE r.rolname !~ '^pg_'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "r.rolname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ return false;
+
+ nrows = PQntuples(res);
+ attr = pg_malloc0((nrows + 1) * sizeof(*attr));
+
+ printTableInit(&cont, &myopt, _("List of roles"), ncols, nrows);
+
+ printTableAddHeader(&cont, gettext_noop("Role name"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Attributes"), true, align);
+
+ if (verbose)
+ printTableAddHeader(&cont, gettext_noop("Description"), true, align);
+
+ for (i = 0; i < nrows; i++)
+ {
+ printTableAddCell(&cont, PQgetvalue(res, i, 0), false, false);
+
+ resetPQExpBuffer(&buf);
+ if (strcmp(PQgetvalue(res, i, 1), "t") == 0)
+ add_role_attribute(&buf, _("Superuser"));
+
+ if (strcmp(PQgetvalue(res, i, 2), "t") != 0)
+ add_role_attribute(&buf, _("No inheritance"));
+
+ if (strcmp(PQgetvalue(res, i, 3), "t") == 0)
+ add_role_attribute(&buf, _("Create role"));
+
+ if (strcmp(PQgetvalue(res, i, 4), "t") == 0)
+ add_role_attribute(&buf, _("Create DB"));
+
+ if (strcmp(PQgetvalue(res, i, 5), "t") != 0)
+ add_role_attribute(&buf, _("Cannot login"));
+
+ if (strcmp(PQgetvalue(res, i, (verbose ? 9 : 8)), "t") == 0)
+ add_role_attribute(&buf, _("Replication"));
+
+ if (pset.sversion >= 90500)
+ if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0)
+ add_role_attribute(&buf, _("Bypass RLS"));
+
+ conns = atoi(PQgetvalue(res, i, 6));
+ if (conns >= 0)
+ {
+ if (buf.len > 0)
+ appendPQExpBufferChar(&buf, '\n');
+
+ if (conns == 0)
+ appendPQExpBufferStr(&buf, _("No connections"));
+ else
+ appendPQExpBuffer(&buf, ngettext("%d connection",
+ "%d connections",
+ conns),
+ conns);
+ }
+
+ if (strcmp(PQgetvalue(res, i, 7), "") != 0)
+ {
+ if (buf.len > 0)
+ appendPQExpBufferChar(&buf, '\n');
+ appendPQExpBufferStr(&buf, _("Password valid until "));
+ appendPQExpBufferStr(&buf, PQgetvalue(res, i, 7));
+ }
+
+ attr[i] = pg_strdup(buf.data);
+
+ printTableAddCell(&cont, attr[i], false, false);
+
+ if (verbose)
+ printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false);
+ }
+ termPQExpBuffer(&buf);
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+ printTableCleanup(&cont);
+
+ for (i = 0; i < nrows; i++)
+ free(attr[i]);
+ free(attr);
+
+ PQclear(res);
+ return true;
+}
+
+static void
+add_role_attribute(PQExpBuffer buf, const char *const str)
+{
+ if (buf->len > 0)
+ appendPQExpBufferStr(buf, ", ");
+
+ appendPQExpBufferStr(buf, str);
+}
+
+/*
+ * \drds
+ */
+bool
+listDbRoleSettings(const char *pattern, const char *pattern2)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool havewhere;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf, "SELECT rolname AS \"%s\", datname AS \"%s\",\n"
+ "pg_catalog.array_to_string(setconfig, E'\\n') AS \"%s\"\n"
+ "FROM pg_catalog.pg_db_role_setting s\n"
+ "LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase\n"
+ "LEFT JOIN pg_catalog.pg_roles r ON r.oid = setrole\n",
+ gettext_noop("Role"),
+ gettext_noop("Database"),
+ gettext_noop("Settings"));
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "r.rolname", NULL, NULL, &havewhere, 1))
+ goto error_return;
+ if (!validateSQLNamePattern(&buf, pattern2, havewhere, false,
+ NULL, "d.datname", NULL, NULL,
+ NULL, 1))
+ goto error_return;
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ /*
+ * Most functions in this file are content to print an empty table when
+ * there are no matching objects. We intentionally deviate from that
+ * here, but only in !quiet mode, because of the possibility that the user
+ * is confused about what the two pattern arguments mean.
+ */
+ if (PQntuples(res) == 0 && !pset.quiet)
+ {
+ if (pattern && pattern2)
+ pg_log_error("Did not find any settings for role \"%s\" and database \"%s\".",
+ pattern, pattern2);
+ else if (pattern)
+ pg_log_error("Did not find any settings for role \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any settings.");
+ }
+ else
+ {
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of settings");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+ }
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \drg
+ * Describes role grants.
+ */
+bool
+describeRoleGrants(const char *pattern, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT m.rolname AS \"%s\", r.rolname AS \"%s\",\n"
+ " pg_catalog.concat_ws(', ',\n",
+ gettext_noop("Role name"),
+ gettext_noop("Member of"));
+
+ if (pset.sversion >= 160000)
+ appendPQExpBufferStr(&buf,
+ " CASE WHEN pam.admin_option THEN 'ADMIN' END,\n"
+ " CASE WHEN pam.inherit_option THEN 'INHERIT' END,\n"
+ " CASE WHEN pam.set_option THEN 'SET' END\n");
+ else
+ appendPQExpBufferStr(&buf,
+ " CASE WHEN pam.admin_option THEN 'ADMIN' END,\n"
+ " CASE WHEN m.rolinherit THEN 'INHERIT' END,\n"
+ " 'SET'\n");
+
+ appendPQExpBuffer(&buf,
+ " ) AS \"%s\",\n"
+ " g.rolname AS \"%s\"\n",
+ gettext_noop("Options"),
+ gettext_noop("Grantor"));
+
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_roles m\n"
+ " JOIN pg_catalog.pg_auth_members pam ON (pam.member = m.oid)\n"
+ " LEFT JOIN pg_catalog.pg_roles r ON (pam.roleid = r.oid)\n"
+ " LEFT JOIN pg_catalog.pg_roles g ON (pam.grantor = g.oid)\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE m.rolname !~ '^pg_'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "m.rolname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;\n");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of role grants");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * listTables()
+ *
+ * handler for \dt, \di, etc.
+ *
+ * tabtypes is an array of characters, specifying what info is desired:
+ * t - tables
+ * i - indexes
+ * v - views
+ * m - materialized views
+ * s - sequences
+ * E - foreign table (Note: different from 'f', the relkind value)
+ * (any order of the above is fine)
+ */
+bool
+listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem)
+{
+ bool showTables = strchr(tabtypes, 't') != NULL;
+ bool showIndexes = strchr(tabtypes, 'i') != NULL;
+ bool showViews = strchr(tabtypes, 'v') != NULL;
+ bool showMatViews = strchr(tabtypes, 'm') != NULL;
+ bool showSeq = strchr(tabtypes, 's') != NULL;
+ bool showForeign = strchr(tabtypes, 'E') != NULL;
+
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ int cols_so_far;
+ bool translate_columns[] = {false, false, true, false, false, false, false, false, false};
+
+ /* If tabtypes is empty, we default to \dtvmsE (but see also command.c) */
+ if (!(showTables || showIndexes || showViews || showMatViews || showSeq || showForeign))
+ showTables = showViews = showMatViews = showSeq = showForeign = true;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " c.relname as \"%s\",\n"
+ " CASE c.relkind"
+ " WHEN " CppAsString2(RELKIND_RELATION) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_VIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_MATVIEW) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_INDEX) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_SEQUENCE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_TOASTVALUE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_FOREIGN_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_INDEX) " THEN '%s'"
+ " END as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(c.relowner) as \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("table"),
+ gettext_noop("view"),
+ gettext_noop("materialized view"),
+ gettext_noop("index"),
+ gettext_noop("sequence"),
+ gettext_noop("TOAST table"),
+ gettext_noop("foreign table"),
+ gettext_noop("partitioned table"),
+ gettext_noop("partitioned index"),
+ gettext_noop("Type"),
+ gettext_noop("Owner"));
+ cols_so_far = 4;
+
+ if (showIndexes)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n c2.relname as \"%s\"",
+ gettext_noop("Table"));
+ cols_so_far++;
+ }
+
+ if (verbose)
+ {
+ /*
+ * Show whether a relation is permanent, temporary, or unlogged.
+ */
+ appendPQExpBuffer(&buf,
+ ",\n CASE c.relpersistence WHEN 'p' THEN '%s' WHEN 't' THEN '%s' WHEN 'u' THEN '%s' END as \"%s\"",
+ gettext_noop("permanent"),
+ gettext_noop("temporary"),
+ gettext_noop("unlogged"),
+ gettext_noop("Persistence"));
+ translate_columns[cols_so_far] = true;
+
+ /*
+ * We don't bother to count cols_so_far below here, as there's no need
+ * to; this might change with future additions to the output columns.
+ */
+
+ /*
+ * Access methods exist for tables, materialized views and indexes.
+ * This has been introduced in PostgreSQL 12 for tables.
+ */
+ if (pset.sversion >= 120000 && !pset.hide_tableam &&
+ (showTables || showMatViews || showIndexes))
+ appendPQExpBuffer(&buf,
+ ",\n am.amname as \"%s\"",
+ gettext_noop("Access method"));
+
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_table_size(c.oid)) as \"%s\""
+ ",\n pg_catalog.obj_description(c.oid, 'pg_class') as \"%s\"",
+ gettext_noop("Size"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_class c"
+ "\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace");
+
+ if (pset.sversion >= 120000 && !pset.hide_tableam &&
+ (showTables || showMatViews || showIndexes))
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_am am ON am.oid = c.relam");
+
+ if (showIndexes)
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid"
+ "\n LEFT JOIN pg_catalog.pg_class c2 ON i.indrelid = c2.oid");
+
+ appendPQExpBufferStr(&buf, "\nWHERE c.relkind IN (");
+ if (showTables)
+ {
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_RELATION) ","
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ",");
+ /* with 'S' or a pattern, allow 't' to match TOAST tables too */
+ if (showSystem || pattern)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_TOASTVALUE) ",");
+ }
+ if (showViews)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_VIEW) ",");
+ if (showMatViews)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_MATVIEW) ",");
+ if (showIndexes)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_INDEX) ","
+ CppAsString2(RELKIND_PARTITIONED_INDEX) ",");
+ if (showSeq)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_SEQUENCE) ",");
+ if (showSystem || pattern)
+ appendPQExpBufferStr(&buf, "'s',"); /* was RELKIND_SPECIAL */
+ if (showForeign)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_FOREIGN_TABLE) ",");
+
+ appendPQExpBufferStr(&buf, "''"); /* dummy */
+ appendPQExpBufferStr(&buf, ")\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname !~ '^pg_toast'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1,2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ /*
+ * Most functions in this file are content to print an empty table when
+ * there are no matching objects. We intentionally deviate from that
+ * here, but only in !quiet mode, for historical reasons.
+ */
+ if (PQntuples(res) == 0 && !pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any relation named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any relations.");
+ }
+ else
+ {
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of relations");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dP
+ * Takes an optional regexp to select particular relations
+ *
+ * As with \d, you can specify the kinds of relations you want:
+ *
+ * t for tables
+ * i for indexes
+ *
+ * And there's additional flags:
+ *
+ * n to list non-leaf partitioned tables
+ *
+ * and you can mix and match these in any order.
+ */
+bool
+listPartitionedTables(const char *reltypes, const char *pattern, bool verbose)
+{
+ bool showTables = strchr(reltypes, 't') != NULL;
+ bool showIndexes = strchr(reltypes, 'i') != NULL;
+ bool showNested = strchr(reltypes, 'n') != NULL;
+ PQExpBufferData buf;
+ PQExpBufferData title;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool translate_columns[] = {false, false, false, false, false, false, false, false, false};
+ const char *tabletitle;
+ bool mixed_output = false;
+
+ /*
+ * Note: Declarative table partitioning is only supported as of Pg 10.0.
+ */
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support declarative table partitioning.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ /* If no relation kind was selected, show them all */
+ if (!showTables && !showIndexes)
+ showTables = showIndexes = true;
+
+ if (showIndexes && !showTables)
+ tabletitle = _("List of partitioned indexes"); /* \dPi */
+ else if (showTables && !showIndexes)
+ tabletitle = _("List of partitioned tables"); /* \dPt */
+ else
+ {
+ /* show all kinds */
+ tabletitle = _("List of partitioned relations");
+ mixed_output = true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " c.relname as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(c.relowner) as \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Owner"));
+
+ if (mixed_output)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n CASE c.relkind"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_TABLE) " THEN '%s'"
+ " WHEN " CppAsString2(RELKIND_PARTITIONED_INDEX) " THEN '%s'"
+ " END as \"%s\"",
+ gettext_noop("partitioned table"),
+ gettext_noop("partitioned index"),
+ gettext_noop("Type"));
+
+ translate_columns[3] = true;
+ }
+
+ if (showNested || pattern)
+ appendPQExpBuffer(&buf,
+ ",\n inh.inhparent::pg_catalog.regclass as \"%s\"",
+ gettext_noop("Parent name"));
+
+ if (showIndexes)
+ appendPQExpBuffer(&buf,
+ ",\n c2.oid::pg_catalog.regclass as \"%s\"",
+ gettext_noop("Table"));
+
+ if (verbose)
+ {
+ if (showNested)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n s.dps as \"%s\"",
+ gettext_noop("Leaf partition size"));
+ appendPQExpBuffer(&buf,
+ ",\n s.tps as \"%s\"",
+ gettext_noop("Total size"));
+ }
+ else
+ /* Sizes of all partitions are considered in this case. */
+ appendPQExpBuffer(&buf,
+ ",\n s.tps as \"%s\"",
+ gettext_noop("Total size"));
+
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(c.oid, 'pg_class') as \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_class c"
+ "\n LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace");
+
+ if (showIndexes)
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid"
+ "\n LEFT JOIN pg_catalog.pg_class c2 ON i.indrelid = c2.oid");
+
+ if (showNested || pattern)
+ appendPQExpBufferStr(&buf,
+ "\n LEFT JOIN pg_catalog.pg_inherits inh ON c.oid = inh.inhrelid");
+
+ if (verbose)
+ {
+ if (pset.sversion < 120000)
+ {
+ appendPQExpBufferStr(&buf,
+ ",\n LATERAL (WITH RECURSIVE d\n"
+ " AS (SELECT inhrelid AS oid, 1 AS level\n"
+ " FROM pg_catalog.pg_inherits\n"
+ " WHERE inhparent = c.oid\n"
+ " UNION ALL\n"
+ " SELECT inhrelid, level + 1\n"
+ " FROM pg_catalog.pg_inherits i\n"
+ " JOIN d ON i.inhparent = d.oid)\n"
+ " SELECT pg_catalog.pg_size_pretty(sum(pg_catalog.pg_table_size("
+ "d.oid))) AS tps,\n"
+ " pg_catalog.pg_size_pretty(sum("
+ "\n CASE WHEN d.level = 1"
+ " THEN pg_catalog.pg_table_size(d.oid) ELSE 0 END)) AS dps\n"
+ " FROM d) s");
+ }
+ else
+ {
+ /* PostgreSQL 12 has pg_partition_tree function */
+ appendPQExpBufferStr(&buf,
+ ",\n LATERAL (SELECT pg_catalog.pg_size_pretty(sum("
+ "\n CASE WHEN ppt.isleaf AND ppt.level = 1"
+ "\n THEN pg_catalog.pg_table_size(ppt.relid)"
+ " ELSE 0 END)) AS dps"
+ ",\n pg_catalog.pg_size_pretty(sum("
+ "pg_catalog.pg_table_size(ppt.relid))) AS tps"
+ "\n FROM pg_catalog.pg_partition_tree(c.oid) ppt) s");
+ }
+ }
+
+ appendPQExpBufferStr(&buf, "\nWHERE c.relkind IN (");
+ if (showTables)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_PARTITIONED_TABLE) ",");
+ if (showIndexes)
+ appendPQExpBufferStr(&buf, CppAsString2(RELKIND_PARTITIONED_INDEX) ",");
+ appendPQExpBufferStr(&buf, "''"); /* dummy */
+ appendPQExpBufferStr(&buf, ")\n");
+
+ appendPQExpBufferStr(&buf, !showNested && !pattern ?
+ " AND NOT c.relispartition\n" : "");
+
+ if (!pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname !~ '^pg_toast'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBuffer(&buf, "ORDER BY \"Schema\", %s%s\"Name\";",
+ mixed_output ? "\"Type\" DESC, " : "",
+ showNested || pattern ? "\"Parent name\" NULLS FIRST, " : "");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ initPQExpBuffer(&title);
+ appendPQExpBufferStr(&title, tabletitle);
+
+ myopt.nullPrint = NULL;
+ myopt.title = title.data;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dL
+ *
+ * Describes languages.
+ */
+bool
+listLanguages(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT l.lanname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(l.lanowner) as \"%s\",\n"
+ " l.lanpltrusted AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Trusted"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ",\n NOT l.lanispl AS \"%s\",\n"
+ " l.lanplcallfoid::pg_catalog.regprocedure AS \"%s\",\n"
+ " l.lanvalidator::pg_catalog.regprocedure AS \"%s\",\n "
+ "l.laninline::pg_catalog.regprocedure AS \"%s\",\n ",
+ gettext_noop("Internal language"),
+ gettext_noop("Call handler"),
+ gettext_noop("Validator"),
+ gettext_noop("Inline handler"));
+ printACLColumn(&buf, "l.lanacl");
+ }
+
+ appendPQExpBuffer(&buf,
+ ",\n d.description AS \"%s\""
+ "\nFROM pg_catalog.pg_language l\n"
+ "LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = l.tableoid AND d.objoid = l.oid\n"
+ " AND d.objsubid = 0\n",
+ gettext_noop("Description"));
+
+ if (pattern)
+ {
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "l.lanname", NULL, NULL,
+ NULL, 2))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+ }
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, "WHERE l.lanplcallfoid != 0\n");
+
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of languages");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dD
+ *
+ * Describes domains.
+ */
+bool
+listDomains(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname as \"%s\",\n"
+ " t.typname as \"%s\",\n"
+ " pg_catalog.format_type(t.typbasetype, t.typtypmod) as \"%s\",\n"
+ " (SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type bt\n"
+ " WHERE c.oid = t.typcollation AND bt.oid = t.typbasetype AND t.typcollation <> bt.typcollation) as \"%s\",\n"
+ " CASE WHEN t.typnotnull THEN 'not null' END as \"%s\",\n"
+ " t.typdefault as \"%s\",\n"
+ " pg_catalog.array_to_string(ARRAY(\n"
+ " SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM pg_catalog.pg_constraint r WHERE t.oid = r.contypid\n"
+ " ), ' ') as \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Type"),
+ gettext_noop("Collation"),
+ gettext_noop("Nullable"),
+ gettext_noop("Default"),
+ gettext_noop("Check"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "t.typacl");
+ appendPQExpBuffer(&buf,
+ ",\n d.description as \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_type t\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_description d "
+ "ON d.classoid = t.tableoid AND d.objoid = t.oid "
+ "AND d.objsubid = 0\n");
+
+ appendPQExpBufferStr(&buf, "WHERE t.typtype = 'd'\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "t.typname", NULL,
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of domains");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dc
+ *
+ * Describes conversions.
+ */
+bool
+listConversions(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] =
+ {false, false, false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " c.conname AS \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(c.conforencoding) AS \"%s\",\n"
+ " pg_catalog.pg_encoding_to_char(c.contoencoding) AS \"%s\",\n"
+ " CASE WHEN c.condefault THEN '%s'\n"
+ " ELSE '%s' END AS \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Source"),
+ gettext_noop("Destination"),
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Default?"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n d.description AS \"%s\"",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_conversion c\n"
+ " JOIN pg_catalog.pg_namespace n "
+ "ON n.oid = c.connamespace\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ "LEFT JOIN pg_catalog.pg_description d "
+ "ON d.classoid = c.tableoid\n"
+ " AND d.objoid = c.oid "
+ "AND d.objsubid = 0\n");
+
+ appendPQExpBufferStr(&buf, "WHERE true\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.conname", NULL,
+ "pg_catalog.pg_conversion_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of conversions");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dconfig
+ *
+ * Describes configuration parameters.
+ */
+bool
+describeConfigurationParameters(const char *pattern, bool verbose,
+ bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT s.name AS \"%s\", "
+ "pg_catalog.current_setting(s.name) AS \"%s\"",
+ gettext_noop("Parameter"),
+ gettext_noop("Value"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ ", s.vartype AS \"%s\", s.context AS \"%s\", ",
+ gettext_noop("Type"),
+ gettext_noop("Context"));
+ if (pset.sversion >= 150000)
+ printACLColumn(&buf, "p.paracl");
+ else
+ appendPQExpBuffer(&buf, "NULL AS \"%s\"",
+ gettext_noop("Access privileges"));
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_settings s\n");
+
+ if (verbose && pset.sversion >= 150000)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_parameter_acl p\n"
+ " ON pg_catalog.lower(s.name) = p.parname\n");
+
+ if (pattern)
+ processSQLNamePattern(pset.db, &buf, pattern,
+ false, false,
+ NULL, "pg_catalog.lower(s.name)", NULL,
+ NULL, NULL, NULL);
+ else
+ appendPQExpBufferStr(&buf, "WHERE s.source <> 'default' AND\n"
+ " s.setting IS DISTINCT FROM s.boot_val\n");
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ if (pattern)
+ myopt.title = _("List of configuration parameters");
+ else
+ myopt.title = _("List of non-default configuration parameters");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dy
+ *
+ * Describes Event Triggers.
+ */
+bool
+listEventTriggers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] =
+ {false, false, false, true, false, false, false};
+
+ if (pset.sversion < 90300)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support event triggers.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT evtname as \"%s\", "
+ "evtevent as \"%s\", "
+ "pg_catalog.pg_get_userbyid(e.evtowner) as \"%s\",\n"
+ " case evtenabled when 'O' then '%s'"
+ " when 'R' then '%s'"
+ " when 'A' then '%s'"
+ " when 'D' then '%s' end as \"%s\",\n"
+ " e.evtfoid::pg_catalog.regproc as \"%s\", "
+ "pg_catalog.array_to_string(array(select x"
+ " from pg_catalog.unnest(evttags) as t(x)), ', ') as \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Event"),
+ gettext_noop("Owner"),
+ gettext_noop("enabled"),
+ gettext_noop("replica"),
+ gettext_noop("always"),
+ gettext_noop("disabled"),
+ gettext_noop("Enabled"),
+ gettext_noop("Function"),
+ gettext_noop("Tags"));
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\npg_catalog.obj_description(e.oid, 'pg_event_trigger') as \"%s\"",
+ gettext_noop("Description"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_event_trigger e ");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "evtname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of event triggers");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dX
+ *
+ * Describes extended statistics.
+ */
+bool
+listExtendedStats(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support extended statistics.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT \n"
+ "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text AS \"%s\", \n"
+ "es.stxname AS \"%s\", \n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (pset.sversion >= 140000)
+ appendPQExpBuffer(&buf,
+ "pg_catalog.format('%%s FROM %%s', \n"
+ " pg_catalog.pg_get_statisticsobjdef_columns(es.oid), \n"
+ " es.stxrelid::pg_catalog.regclass) AS \"%s\"",
+ gettext_noop("Definition"));
+ else
+ appendPQExpBuffer(&buf,
+ "pg_catalog.format('%%s FROM %%s', \n"
+ " (SELECT pg_catalog.string_agg(pg_catalog.quote_ident(a.attname),', ') \n"
+ " FROM pg_catalog.unnest(es.stxkeys) s(attnum) \n"
+ " JOIN pg_catalog.pg_attribute a \n"
+ " ON (es.stxrelid = a.attrelid \n"
+ " AND a.attnum = s.attnum \n"
+ " AND NOT a.attisdropped)), \n"
+ "es.stxrelid::pg_catalog.regclass) AS \"%s\"",
+ gettext_noop("Definition"));
+
+ appendPQExpBuffer(&buf,
+ ",\nCASE WHEN 'd' = any(es.stxkind) THEN 'defined' \n"
+ "END AS \"%s\", \n"
+ "CASE WHEN 'f' = any(es.stxkind) THEN 'defined' \n"
+ "END AS \"%s\"",
+ gettext_noop("Ndistinct"),
+ gettext_noop("Dependencies"));
+
+ /*
+ * Include the MCV statistics kind.
+ */
+ if (pset.sversion >= 120000)
+ {
+ appendPQExpBuffer(&buf,
+ ",\nCASE WHEN 'm' = any(es.stxkind) THEN 'defined' \n"
+ "END AS \"%s\" ",
+ gettext_noop("MCV"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ " \nFROM pg_catalog.pg_statistic_ext es \n");
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ false, false,
+ "es.stxnamespace::pg_catalog.regnamespace::pg_catalog.text", "es.stxname",
+ NULL, "pg_catalog.pg_statistics_obj_is_visible(es.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of extended statistics");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dC
+ *
+ * Describes casts.
+ */
+bool
+listCasts(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.format_type(castsource, NULL) AS \"%s\",\n"
+ " pg_catalog.format_type(casttarget, NULL) AS \"%s\",\n",
+ gettext_noop("Source type"),
+ gettext_noop("Target type"));
+
+ /*
+ * We don't attempt to localize '(binary coercible)' or '(with inout)',
+ * because there's too much risk of gettext translating a function name
+ * that happens to match some string in the PO database.
+ */
+ appendPQExpBuffer(&buf,
+ " CASE WHEN c.castmethod = '%c' THEN '(binary coercible)'\n"
+ " WHEN c.castmethod = '%c' THEN '(with inout)'\n"
+ " ELSE p.proname\n"
+ " END AS \"%s\",\n",
+ COERCION_METHOD_BINARY,
+ COERCION_METHOD_INOUT,
+ gettext_noop("Function"));
+
+ appendPQExpBuffer(&buf,
+ " CASE WHEN c.castcontext = '%c' THEN '%s'\n"
+ " WHEN c.castcontext = '%c' THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END AS \"%s\"",
+ COERCION_CODE_EXPLICIT,
+ gettext_noop("no"),
+ COERCION_CODE_ASSIGNMENT,
+ gettext_noop("in assignment"),
+ gettext_noop("yes"),
+ gettext_noop("Implicit?"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n d.description AS \"%s\"",
+ gettext_noop("Description"));
+
+ /*
+ * We need a left join to pg_proc for binary casts; the others are just
+ * paranoia.
+ */
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_cast c LEFT JOIN pg_catalog.pg_proc p\n"
+ " ON c.castfunc = p.oid\n"
+ " LEFT JOIN pg_catalog.pg_type ts\n"
+ " ON c.castsource = ts.oid\n"
+ " LEFT JOIN pg_catalog.pg_namespace ns\n"
+ " ON ns.oid = ts.typnamespace\n"
+ " LEFT JOIN pg_catalog.pg_type tt\n"
+ " ON c.casttarget = tt.oid\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt\n"
+ " ON nt.oid = tt.typnamespace\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = c.tableoid AND d.objoid = "
+ "c.oid AND d.objsubid = 0\n");
+
+ appendPQExpBufferStr(&buf, "WHERE ( (true");
+
+ /*
+ * Match name pattern against either internal or external name of either
+ * castsource or casttarget
+ */
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "ns.nspname", "ts.typname",
+ "pg_catalog.format_type(ts.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(ts.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, ") OR (true");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "nt.nspname", "tt.typname",
+ "pg_catalog.format_type(tt.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(tt.oid)",
+ NULL, 3))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, ") )\nORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of casts");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dO
+ *
+ * Describes collations.
+ */
+bool
+listCollations(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false, false, false, false, true, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname AS \"%s\",\n"
+ " c.collname AS \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (pset.sversion >= 100000)
+ appendPQExpBuffer(&buf,
+ " CASE c.collprovider WHEN 'd' THEN 'default' WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n",
+ gettext_noop("Provider"));
+ else
+ appendPQExpBuffer(&buf,
+ " 'libc' AS \"%s\",\n",
+ gettext_noop("Provider"));
+
+ appendPQExpBuffer(&buf,
+ " c.collcollate AS \"%s\",\n"
+ " c.collctype AS \"%s\",\n",
+ gettext_noop("Collate"),
+ gettext_noop("Ctype"));
+
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ " c.colliculocale AS \"%s\",\n",
+ gettext_noop("ICU Locale"));
+ else
+ appendPQExpBuffer(&buf,
+ " c.collcollate AS \"%s\",\n",
+ gettext_noop("ICU Locale"));
+
+ if (pset.sversion >= 160000)
+ appendPQExpBuffer(&buf,
+ " c.collicurules AS \"%s\",\n",
+ gettext_noop("ICU Rules"));
+ else
+ appendPQExpBuffer(&buf,
+ " NULL AS \"%s\",\n",
+ gettext_noop("ICU Rules"));
+
+ if (pset.sversion >= 120000)
+ appendPQExpBuffer(&buf,
+ " CASE WHEN c.collisdeterministic THEN '%s' ELSE '%s' END AS \"%s\"",
+ gettext_noop("yes"), gettext_noop("no"),
+ gettext_noop("Deterministic?"));
+ else
+ appendPQExpBuffer(&buf,
+ " '%s' AS \"%s\"",
+ gettext_noop("yes"),
+ gettext_noop("Deterministic?"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(c.oid, 'pg_collation') AS \"%s\"",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_collation c, pg_catalog.pg_namespace n\n"
+ "WHERE n.oid = c.collnamespace\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n"
+ " AND n.nspname <> 'information_schema'\n");
+
+ /*
+ * Hide collations that aren't usable in the current database's encoding.
+ * If you think to change this, note that pg_collation_is_visible rejects
+ * unusable collations, so you will need to hack name pattern processing
+ * somehow to avoid inconsistent behavior.
+ */
+ appendPQExpBufferStr(&buf, " AND c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.collname", NULL,
+ "pg_catalog.pg_collation_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of collations");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dn
+ *
+ * Describes schemas (namespaces)
+ */
+bool
+listSchemas(const char *pattern, bool verbose, bool showSystem)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ int pub_schema_tuples = 0;
+ char **footers = NULL;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(n.nspowner) AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "n.nspacl");
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.obj_description(n.oid, 'pg_namespace') AS \"%s\"",
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_namespace n\n");
+
+ if (!showSystem && !pattern)
+ appendPQExpBufferStr(&buf,
+ "WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'\n");
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ !showSystem && !pattern, false,
+ NULL, "n.nspname", NULL,
+ NULL,
+ NULL, 2))
+ goto error_return;
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ goto error_return;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of schemas");
+ myopt.translate_header = true;
+
+ if (pattern && pset.sversion >= 150000)
+ {
+ PGresult *result;
+ int i;
+
+ printfPQExpBuffer(&buf,
+ "SELECT pubname \n"
+ "FROM pg_catalog.pg_publication p\n"
+ " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n"
+ " JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid \n"
+ "WHERE n.nspname = '%s'\n"
+ "ORDER BY 1",
+ pattern);
+ result = PSQLexec(buf.data);
+ if (!result)
+ goto error_return;
+ else
+ pub_schema_tuples = PQntuples(result);
+
+ if (pub_schema_tuples > 0)
+ {
+ /*
+ * Allocate memory for footers. Size of footers will be 1 (for
+ * storing "Publications:" string) + publication schema mapping
+ * count + 1 (for storing NULL).
+ */
+ footers = (char **) pg_malloc((1 + pub_schema_tuples + 1) * sizeof(char *));
+ footers[0] = pg_strdup(_("Publications:"));
+
+ /* Might be an empty set - that's ok */
+ for (i = 0; i < pub_schema_tuples; i++)
+ {
+ printfPQExpBuffer(&buf, " \"%s\"",
+ PQgetvalue(result, i, 0));
+
+ footers[i + 1] = pg_strdup(buf.data);
+ }
+
+ footers[i + 1] = NULL;
+ myopt.footers = footers;
+ }
+
+ PQclear(result);
+ }
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ /* Free the memory allocated for the footer */
+ if (footers)
+ {
+ char **footer = NULL;
+
+ for (footer = footers; *footer; footer++)
+ pg_free(*footer);
+
+ pg_free(footers);
+ }
+
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+
+/*
+ * \dFp
+ * list text search parsers
+ */
+bool
+listTSParsers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ if (verbose)
+ return listTSParsersVerbose(pattern);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname as \"%s\",\n"
+ " p.prsname as \"%s\",\n"
+ " pg_catalog.obj_description(p.oid, 'pg_ts_parser') as \"%s\"\n"
+ "FROM pg_catalog.pg_ts_parser p\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.prsnamespace\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description")
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "p.prsname", NULL,
+ "pg_catalog.pg_ts_parser_is_visible(p.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search parsers");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * full description of parsers
+ */
+static bool
+listTSParsersVerbose(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT p.oid,\n"
+ " n.nspname,\n"
+ " p.prsname\n"
+ "FROM pg_catalog.pg_ts_parser p\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.prsnamespace\n"
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "p.prsname", NULL,
+ "pg_catalog.pg_ts_parser_is_visible(p.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any text search parser named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any text search parsers.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *oid;
+ const char *nspname = NULL;
+ const char *prsname;
+
+ oid = PQgetvalue(res, i, 0);
+ if (!PQgetisnull(res, i, 1))
+ nspname = PQgetvalue(res, i, 1);
+ prsname = PQgetvalue(res, i, 2);
+
+ if (!describeOneTSParser(oid, nspname, prsname))
+ {
+ PQclear(res);
+ return false;
+ }
+
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+describeOneTSParser(const char *oid, const char *nspname, const char *prsname)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ PQExpBufferData title;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {true, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT '%s' AS \"%s\",\n"
+ " p.prsstart::pg_catalog.regproc AS \"%s\",\n"
+ " pg_catalog.obj_description(p.prsstart, 'pg_proc') as \"%s\"\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prstoken::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prstoken, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prsend::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prsend, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prsheadline::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prsheadline, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s'\n"
+ "UNION ALL\n"
+ "SELECT '%s',\n"
+ " p.prslextype::pg_catalog.regproc,\n"
+ " pg_catalog.obj_description(p.prslextype, 'pg_proc')\n"
+ " FROM pg_catalog.pg_ts_parser p\n"
+ " WHERE p.oid = '%s';",
+ gettext_noop("Start parse"),
+ gettext_noop("Method"),
+ gettext_noop("Function"),
+ gettext_noop("Description"),
+ oid,
+ gettext_noop("Get next token"),
+ oid,
+ gettext_noop("End parse"),
+ oid,
+ gettext_noop("Get headline"),
+ oid,
+ gettext_noop("Get token types"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ initPQExpBuffer(&title);
+ if (nspname)
+ printfPQExpBuffer(&title, _("Text search parser \"%s.%s\""),
+ nspname, prsname);
+ else
+ printfPQExpBuffer(&title, _("Text search parser \"%s\""), prsname);
+ myopt.title = title.data;
+ myopt.footers = NULL;
+ myopt.topt.default_footer = false;
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT t.alias as \"%s\",\n"
+ " t.description as \"%s\"\n"
+ "FROM pg_catalog.ts_token_type( '%s'::pg_catalog.oid ) as t\n"
+ "ORDER BY 1;",
+ gettext_noop("Token name"),
+ gettext_noop("Description"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ {
+ termPQExpBuffer(&title);
+ return false;
+ }
+
+ myopt.nullPrint = NULL;
+ if (nspname)
+ printfPQExpBuffer(&title, _("Token types for parser \"%s.%s\""),
+ nspname, prsname);
+ else
+ printfPQExpBuffer(&title, _("Token types for parser \"%s\""), prsname);
+ myopt.title = title.data;
+ myopt.footers = NULL;
+ myopt.topt.default_footer = true;
+ myopt.translate_header = true;
+ myopt.translate_columns = NULL;
+ myopt.n_translate_columns = 0;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dFd
+ * list text search dictionaries
+ */
+bool
+listTSDictionaries(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname as \"%s\",\n"
+ " d.dictname as \"%s\",\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"));
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&buf,
+ " ( SELECT COALESCE(nt.nspname, '(null)')::pg_catalog.text || '.' || t.tmplname FROM\n"
+ " pg_catalog.pg_ts_template t\n"
+ " LEFT JOIN pg_catalog.pg_namespace nt ON nt.oid = t.tmplnamespace\n"
+ " WHERE d.dicttemplate = t.oid ) AS \"%s\",\n"
+ " d.dictinitoption as \"%s\",\n",
+ gettext_noop("Template"),
+ gettext_noop("Init options"));
+ }
+
+ appendPQExpBuffer(&buf,
+ " pg_catalog.obj_description(d.oid, 'pg_ts_dict') as \"%s\"\n",
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_ts_dict d\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.dictnamespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "d.dictname", NULL,
+ "pg_catalog.pg_ts_dict_is_visible(d.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search dictionaries");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dFt
+ * list text search templates
+ */
+bool
+listTSTemplates(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ if (verbose)
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname AS \"%s\",\n"
+ " t.tmplname AS \"%s\",\n"
+ " t.tmplinit::pg_catalog.regproc AS \"%s\",\n"
+ " t.tmpllexize::pg_catalog.regproc AS \"%s\",\n"
+ " pg_catalog.obj_description(t.oid, 'pg_ts_template') AS \"%s\"\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Init"),
+ gettext_noop("Lexize"),
+ gettext_noop("Description"));
+ else
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname AS \"%s\",\n"
+ " t.tmplname AS \"%s\",\n"
+ " pg_catalog.obj_description(t.oid, 'pg_ts_template') AS \"%s\"\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_ts_template t\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.tmplnamespace\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "t.tmplname", NULL,
+ "pg_catalog.pg_ts_template_is_visible(t.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search templates");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dF
+ * list text search configurations
+ */
+bool
+listTSConfigs(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ if (verbose)
+ return listTSConfigsVerbose(pattern);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " n.nspname as \"%s\",\n"
+ " c.cfgname as \"%s\",\n"
+ " pg_catalog.obj_description(c.oid, 'pg_ts_config') as \"%s\"\n"
+ "FROM pg_catalog.pg_ts_config c\n"
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.cfgnamespace\n",
+ gettext_noop("Schema"),
+ gettext_noop("Name"),
+ gettext_noop("Description")
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "c.cfgname", NULL,
+ "pg_catalog.pg_ts_config_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of text search configurations");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+listTSConfigsVerbose(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT c.oid, c.cfgname,\n"
+ " n.nspname,\n"
+ " p.prsname,\n"
+ " np.nspname as pnspname\n"
+ "FROM pg_catalog.pg_ts_config c\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.cfgnamespace,\n"
+ " pg_catalog.pg_ts_parser p\n"
+ " LEFT JOIN pg_catalog.pg_namespace np ON np.oid = p.prsnamespace\n"
+ "WHERE p.oid = c.cfgparser\n"
+ );
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ "n.nspname", "c.cfgname", NULL,
+ "pg_catalog.pg_ts_config_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 3, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any text search configuration named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any text search configurations.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *oid;
+ const char *cfgname;
+ const char *nspname = NULL;
+ const char *prsname;
+ const char *pnspname = NULL;
+
+ oid = PQgetvalue(res, i, 0);
+ cfgname = PQgetvalue(res, i, 1);
+ if (!PQgetisnull(res, i, 2))
+ nspname = PQgetvalue(res, i, 2);
+ prsname = PQgetvalue(res, i, 3);
+ if (!PQgetisnull(res, i, 4))
+ pnspname = PQgetvalue(res, i, 4);
+
+ if (!describeOneTSConfig(oid, nspname, cfgname, pnspname, prsname))
+ {
+ PQclear(res);
+ return false;
+ }
+
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname,
+ const char *pnspname, const char *prsname)
+{
+ PQExpBufferData buf,
+ title;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " ( SELECT t.alias FROM\n"
+ " pg_catalog.ts_token_type(c.cfgparser) AS t\n"
+ " WHERE t.tokid = m.maptokentype ) AS \"%s\",\n"
+ " pg_catalog.btrim(\n"
+ " ARRAY( SELECT mm.mapdict::pg_catalog.regdictionary\n"
+ " FROM pg_catalog.pg_ts_config_map AS mm\n"
+ " WHERE mm.mapcfg = m.mapcfg AND mm.maptokentype = m.maptokentype\n"
+ " ORDER BY mapcfg, maptokentype, mapseqno\n"
+ " ) :: pg_catalog.text,\n"
+ " '{}') AS \"%s\"\n"
+ "FROM pg_catalog.pg_ts_config AS c, pg_catalog.pg_ts_config_map AS m\n"
+ "WHERE c.oid = '%s' AND m.mapcfg = c.oid\n"
+ "GROUP BY m.mapcfg, m.maptokentype, c.cfgparser\n"
+ "ORDER BY 1;",
+ gettext_noop("Token"),
+ gettext_noop("Dictionaries"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ initPQExpBuffer(&title);
+
+ if (nspname)
+ appendPQExpBuffer(&title, _("Text search configuration \"%s.%s\""),
+ nspname, cfgname);
+ else
+ appendPQExpBuffer(&title, _("Text search configuration \"%s\""),
+ cfgname);
+
+ if (pnspname)
+ appendPQExpBuffer(&title, _("\nParser: \"%s.%s\""),
+ pnspname, prsname);
+ else
+ appendPQExpBuffer(&title, _("\nParser: \"%s\""),
+ prsname);
+
+ myopt.nullPrint = NULL;
+ myopt.title = title.data;
+ myopt.footers = NULL;
+ myopt.topt.default_footer = false;
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+
+ PQclear(res);
+ return true;
+}
+
+
+/*
+ * \dew
+ *
+ * Describes foreign-data wrappers
+ */
+bool
+listForeignDataWrappers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT fdw.fdwname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(fdw.fdwowner) AS \"%s\",\n"
+ " fdw.fdwhandler::pg_catalog.regproc AS \"%s\",\n"
+ " fdw.fdwvalidator::pg_catalog.regproc AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Handler"),
+ gettext_noop("Validator"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "fdwacl");
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN fdwoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(fdwoptions)), ', ') || ')' "
+ " END AS \"%s\""
+ ",\n d.description AS \"%s\" ",
+ gettext_noop("FDW options"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_foreign_data_wrapper fdw\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ "LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = fdw.tableoid "
+ "AND d.objoid = fdw.oid AND d.objsubid = 0\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "fdwname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of foreign-data wrappers");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \des
+ *
+ * Describes foreign servers.
+ */
+bool
+listForeignServers(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT s.srvname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(s.srvowner) AS \"%s\",\n"
+ " f.fdwname AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Foreign-data wrapper"));
+
+ if (verbose)
+ {
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "s.srvacl");
+ appendPQExpBuffer(&buf,
+ ",\n"
+ " s.srvtype AS \"%s\",\n"
+ " s.srvversion AS \"%s\",\n"
+ " CASE WHEN srvoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(srvoptions)), ', ') || ')' "
+ " END AS \"%s\",\n"
+ " d.description AS \"%s\"",
+ gettext_noop("Type"),
+ gettext_noop("Version"),
+ gettext_noop("FDW options"),
+ gettext_noop("Description"));
+ }
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_foreign_server s\n"
+ " JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid=s.srvfdw\n");
+
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ "LEFT JOIN pg_catalog.pg_description d\n "
+ "ON d.classoid = s.tableoid AND d.objoid = s.oid "
+ "AND d.objsubid = 0\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "s.srvname", NULL, NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of foreign servers");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \deu
+ *
+ * Describes user mappings.
+ */
+bool
+listUserMappings(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT um.srvname AS \"%s\",\n"
+ " um.usename AS \"%s\"",
+ gettext_noop("Server"),
+ gettext_noop("User name"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN umoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(umoptions)), ', ') || ')' "
+ " END AS \"%s\"",
+ gettext_noop("FDW options"));
+
+ appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_user_mappings um\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "um.srvname", "um.usename", NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of user mappings");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \det
+ *
+ * Describes foreign tables.
+ */
+bool
+listForeignTables(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname AS \"%s\",\n"
+ " c.relname AS \"%s\",\n"
+ " s.srvname AS \"%s\"",
+ gettext_noop("Schema"),
+ gettext_noop("Table"),
+ gettext_noop("Server"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE WHEN ftoptions IS NULL THEN '' ELSE "
+ " '(' || pg_catalog.array_to_string(ARRAY(SELECT "
+ " pg_catalog.quote_ident(option_name) || ' ' || "
+ " pg_catalog.quote_literal(option_value) FROM "
+ " pg_catalog.pg_options_to_table(ftoptions)), ', ') || ')' "
+ " END AS \"%s\",\n"
+ " d.description AS \"%s\"",
+ gettext_noop("FDW options"),
+ gettext_noop("Description"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_foreign_table ft\n"
+ " INNER JOIN pg_catalog.pg_class c"
+ " ON c.oid = ft.ftrelid\n"
+ " INNER JOIN pg_catalog.pg_namespace n"
+ " ON n.oid = c.relnamespace\n"
+ " INNER JOIN pg_catalog.pg_foreign_server s"
+ " ON s.oid = ft.ftserver\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_description d\n"
+ " ON d.classoid = c.tableoid AND "
+ "d.objoid = c.oid AND d.objsubid = 0\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ "n.nspname", "c.relname", NULL,
+ "pg_catalog.pg_table_is_visible(c.oid)",
+ NULL, 3))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of foreign tables");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dx
+ *
+ * Briefly describes installed extensions.
+ */
+bool
+listExtensions(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT e.extname AS \"%s\", "
+ "e.extversion AS \"%s\", n.nspname AS \"%s\", c.description AS \"%s\"\n"
+ "FROM pg_catalog.pg_extension e "
+ "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace "
+ "LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid "
+ "AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass\n",
+ gettext_noop("Name"),
+ gettext_noop("Version"),
+ gettext_noop("Schema"),
+ gettext_noop("Description"));
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ false, false,
+ NULL, "e.extname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of installed extensions");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dx+
+ *
+ * List contents of installed extensions.
+ */
+bool
+listExtensionContents(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ int i;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT e.extname, e.oid\n"
+ "FROM pg_catalog.pg_extension e\n");
+
+ if (!validateSQLNamePattern(&buf, pattern,
+ false, false,
+ NULL, "e.extname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any extension named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any extensions.");
+ }
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char *extname;
+ const char *oid;
+
+ extname = PQgetvalue(res, i, 0);
+ oid = PQgetvalue(res, i, 1);
+
+ if (!listOneExtensionContents(extname, oid))
+ {
+ PQclear(res);
+ return false;
+ }
+ if (cancel_pressed)
+ {
+ PQclear(res);
+ return false;
+ }
+ }
+
+ PQclear(res);
+ return true;
+}
+
+static bool
+listOneExtensionContents(const char *extname, const char *oid)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ PQExpBufferData title;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+ printfPQExpBuffer(&buf,
+ "SELECT pg_catalog.pg_describe_object(classid, objid, 0) AS \"%s\"\n"
+ "FROM pg_catalog.pg_depend\n"
+ "WHERE refclassid = 'pg_catalog.pg_extension'::pg_catalog.regclass AND refobjid = '%s' AND deptype = 'e'\n"
+ "ORDER BY 1;",
+ gettext_noop("Object description"),
+ oid);
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ initPQExpBuffer(&title);
+ printfPQExpBuffer(&title, _("Objects in extension \"%s\""), extname);
+ myopt.title = title.data;
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ termPQExpBuffer(&title);
+ PQclear(res);
+ return true;
+}
+
+/*
+ * validateSQLNamePattern
+ *
+ * Wrapper around string_utils's processSQLNamePattern which also checks the
+ * pattern's validity. In addition to that function's parameters, takes a
+ * 'maxparts' parameter specifying the maximum number of dotted names the
+ * pattern is allowed to have, and a 'added_clause' parameter that returns by
+ * reference whether a clause was added to 'buf'. Returns whether the pattern
+ * passed validation, after logging any errors.
+ */
+static bool
+validateSQLNamePattern(PQExpBuffer buf, const char *pattern, bool have_where,
+ bool force_escape, const char *schemavar,
+ const char *namevar, const char *altnamevar,
+ const char *visibilityrule, bool *added_clause,
+ int maxparts)
+{
+ PQExpBufferData dbbuf;
+ int dotcnt;
+ bool added;
+
+ initPQExpBuffer(&dbbuf);
+ added = processSQLNamePattern(pset.db, buf, pattern, have_where, force_escape,
+ schemavar, namevar, altnamevar,
+ visibilityrule, &dbbuf, &dotcnt);
+ if (added_clause != NULL)
+ *added_clause = added;
+
+ if (dotcnt >= maxparts)
+ {
+ pg_log_error("improper qualified name (too many dotted names): %s",
+ pattern);
+ goto error_return;
+ }
+
+ if (maxparts > 1 && dotcnt == maxparts - 1)
+ {
+ if (PQdb(pset.db) == NULL)
+ {
+ pg_log_error("You are currently not connected to a database.");
+ goto error_return;
+ }
+ if (strcmp(PQdb(pset.db), dbbuf.data) != 0)
+ {
+ pg_log_error("cross-database references are not implemented: %s",
+ pattern);
+ goto error_return;
+ }
+ }
+ termPQExpBuffer(&dbbuf);
+ return true;
+
+error_return:
+ termPQExpBuffer(&dbbuf);
+ return false;
+}
+
+/*
+ * \dRp
+ * Lists publications.
+ *
+ * Takes an optional regexp to select particular publications
+ */
+bool
+listPublications(const char *pattern)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false, false, false, false, false};
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support publications.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT pubname AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(pubowner) AS \"%s\",\n"
+ " puballtables AS \"%s\",\n"
+ " pubinsert AS \"%s\",\n"
+ " pubupdate AS \"%s\",\n"
+ " pubdelete AS \"%s\"",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("All tables"),
+ gettext_noop("Inserts"),
+ gettext_noop("Updates"),
+ gettext_noop("Deletes"));
+ if (pset.sversion >= 110000)
+ appendPQExpBuffer(&buf,
+ ",\n pubtruncate AS \"%s\"",
+ gettext_noop("Truncates"));
+ if (pset.sversion >= 130000)
+ appendPQExpBuffer(&buf,
+ ",\n pubviaroot AS \"%s\"",
+ gettext_noop("Via root"));
+
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_publication\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "pubname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of publications");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+
+ return true;
+}
+
+/*
+ * Add footer to publication description.
+ */
+static bool
+addFooterToPublicationDesc(PQExpBuffer buf, const char *footermsg,
+ bool as_schema, printTableContent *const cont)
+{
+ PGresult *res;
+ int count = 0;
+ int i = 0;
+
+ res = PSQLexec(buf->data);
+ if (!res)
+ return false;
+ else
+ count = PQntuples(res);
+
+ if (count > 0)
+ printTableAddFooter(cont, footermsg);
+
+ for (i = 0; i < count; i++)
+ {
+ if (as_schema)
+ printfPQExpBuffer(buf, " \"%s\"", PQgetvalue(res, i, 0));
+ else
+ {
+ printfPQExpBuffer(buf, " \"%s.%s\"", PQgetvalue(res, i, 0),
+ PQgetvalue(res, i, 1));
+
+ if (!PQgetisnull(res, i, 3))
+ appendPQExpBuffer(buf, " (%s)", PQgetvalue(res, i, 3));
+
+ if (!PQgetisnull(res, i, 2))
+ appendPQExpBuffer(buf, " WHERE %s", PQgetvalue(res, i, 2));
+ }
+
+ printTableAddFooter(cont, buf->data);
+ }
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * \dRp+
+ * Describes publications including the contents.
+ *
+ * Takes an optional regexp to select particular publications
+ */
+bool
+describePublications(const char *pattern)
+{
+ PQExpBufferData buf;
+ int i;
+ PGresult *res;
+ bool has_pubtruncate;
+ bool has_pubviaroot;
+
+ PQExpBufferData title;
+ printTableContent cont;
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support publications.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ has_pubtruncate = (pset.sversion >= 110000);
+ has_pubviaroot = (pset.sversion >= 130000);
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT oid, pubname,\n"
+ " pg_catalog.pg_get_userbyid(pubowner) AS owner,\n"
+ " puballtables, pubinsert, pubupdate, pubdelete");
+ if (has_pubtruncate)
+ appendPQExpBufferStr(&buf,
+ ", pubtruncate");
+ if (has_pubviaroot)
+ appendPQExpBufferStr(&buf,
+ ", pubviaroot");
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_publication\n");
+
+ if (!validateSQLNamePattern(&buf, pattern, false, false,
+ NULL, "pubname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 2;");
+
+ res = PSQLexec(buf.data);
+ if (!res)
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ if (PQntuples(res) == 0)
+ {
+ if (!pset.quiet)
+ {
+ if (pattern)
+ pg_log_error("Did not find any publication named \"%s\".",
+ pattern);
+ else
+ pg_log_error("Did not find any publications.");
+ }
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+ return false;
+ }
+
+ for (i = 0; i < PQntuples(res); i++)
+ {
+ const char align = 'l';
+ int ncols = 5;
+ int nrows = 1;
+ char *pubid = PQgetvalue(res, i, 0);
+ char *pubname = PQgetvalue(res, i, 1);
+ bool puballtables = strcmp(PQgetvalue(res, i, 3), "t") == 0;
+ printTableOpt myopt = pset.popt.topt;
+
+ if (has_pubtruncate)
+ ncols++;
+ if (has_pubviaroot)
+ ncols++;
+
+ initPQExpBuffer(&title);
+ printfPQExpBuffer(&title, _("Publication %s"), pubname);
+ printTableInit(&cont, &myopt, title.data, ncols, nrows);
+
+ printTableAddHeader(&cont, gettext_noop("Owner"), true, align);
+ printTableAddHeader(&cont, gettext_noop("All tables"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Inserts"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Updates"), true, align);
+ printTableAddHeader(&cont, gettext_noop("Deletes"), true, align);
+ if (has_pubtruncate)
+ printTableAddHeader(&cont, gettext_noop("Truncates"), true, align);
+ if (has_pubviaroot)
+ printTableAddHeader(&cont, gettext_noop("Via root"), true, align);
+
+ printTableAddCell(&cont, PQgetvalue(res, i, 2), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 3), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 4), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 5), false, false);
+ printTableAddCell(&cont, PQgetvalue(res, i, 6), false, false);
+ if (has_pubtruncate)
+ printTableAddCell(&cont, PQgetvalue(res, i, 7), false, false);
+ if (has_pubviaroot)
+ printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false);
+
+ if (!puballtables)
+ {
+ /* Get the tables for the specified publication */
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname, c.relname");
+ if (pset.sversion >= 150000)
+ {
+ appendPQExpBufferStr(&buf,
+ ", pg_get_expr(pr.prqual, c.oid)");
+ appendPQExpBufferStr(&buf,
+ ", (CASE WHEN pr.prattrs IS NOT NULL THEN\n"
+ " pg_catalog.array_to_string("
+ " ARRAY(SELECT attname\n"
+ " FROM\n"
+ " pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
+ " pg_catalog.pg_attribute\n"
+ " WHERE attrelid = c.oid AND attnum = prattrs[s]), ', ')\n"
+ " ELSE NULL END)");
+ }
+ else
+ appendPQExpBufferStr(&buf,
+ ", NULL, NULL");
+ appendPQExpBuffer(&buf,
+ "\nFROM pg_catalog.pg_class c,\n"
+ " pg_catalog.pg_namespace n,\n"
+ " pg_catalog.pg_publication_rel pr\n"
+ "WHERE c.relnamespace = n.oid\n"
+ " AND c.oid = pr.prrelid\n"
+ " AND pr.prpubid = '%s'\n"
+ "ORDER BY 1,2", pubid);
+ if (!addFooterToPublicationDesc(&buf, _("Tables:"), false, &cont))
+ goto error_return;
+
+ if (pset.sversion >= 150000)
+ {
+ /* Get the schemas for the specified publication */
+ printfPQExpBuffer(&buf,
+ "SELECT n.nspname\n"
+ "FROM pg_catalog.pg_namespace n\n"
+ " JOIN pg_catalog.pg_publication_namespace pn ON n.oid = pn.pnnspid\n"
+ "WHERE pn.pnpubid = '%s'\n"
+ "ORDER BY 1", pubid);
+ if (!addFooterToPublicationDesc(&buf, _("Tables from schemas:"),
+ true, &cont))
+ goto error_return;
+ }
+ }
+
+ printTable(&cont, pset.queryFout, false, pset.logfile);
+ printTableCleanup(&cont);
+
+ termPQExpBuffer(&title);
+ }
+
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ return true;
+
+error_return:
+ printTableCleanup(&cont);
+ PQclear(res);
+ termPQExpBuffer(&buf);
+ termPQExpBuffer(&title);
+ return false;
+}
+
+/*
+ * \dRs
+ * Describes subscriptions.
+ *
+ * Takes an optional regexp to select particular subscriptions
+ */
+bool
+describeSubscriptions(const char *pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ static const bool translate_columns[] = {false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false};
+
+ if (pset.sversion < 100000)
+ {
+ char sverbuf[32];
+
+ pg_log_error("The server (version %s) does not support subscriptions.",
+ formatPGVersionNumber(pset.sversion, false,
+ sverbuf, sizeof(sverbuf)));
+ return true;
+ }
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT subname AS \"%s\"\n"
+ ", pg_catalog.pg_get_userbyid(subowner) AS \"%s\"\n"
+ ", subenabled AS \"%s\"\n"
+ ", subpublications AS \"%s\"\n",
+ gettext_noop("Name"),
+ gettext_noop("Owner"),
+ gettext_noop("Enabled"),
+ gettext_noop("Publication"));
+
+ if (verbose)
+ {
+ /* Binary mode and streaming are only supported in v14 and higher */
+ if (pset.sversion >= 140000)
+ {
+ appendPQExpBuffer(&buf,
+ ", subbinary AS \"%s\"\n",
+ gettext_noop("Binary"));
+
+ if (pset.sversion >= 160000)
+ appendPQExpBuffer(&buf,
+ ", (CASE substream\n"
+ " WHEN 'f' THEN 'off'\n"
+ " WHEN 't' THEN 'on'\n"
+ " WHEN 'p' THEN 'parallel'\n"
+ " END) AS \"%s\"\n",
+ gettext_noop("Streaming"));
+ else
+ appendPQExpBuffer(&buf,
+ ", substream AS \"%s\"\n",
+ gettext_noop("Streaming"));
+ }
+
+ /* Two_phase and disable_on_error are only supported in v15 and higher */
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ ", subtwophasestate AS \"%s\"\n"
+ ", subdisableonerr AS \"%s\"\n",
+ gettext_noop("Two-phase commit"),
+ gettext_noop("Disable on error"));
+
+ if (pset.sversion >= 160000)
+ appendPQExpBuffer(&buf,
+ ", suborigin AS \"%s\"\n"
+ ", subpasswordrequired AS \"%s\"\n"
+ ", subrunasowner AS \"%s\"\n",
+ gettext_noop("Origin"),
+ gettext_noop("Password required"),
+ gettext_noop("Run as owner?"));
+
+ appendPQExpBuffer(&buf,
+ ", subsynccommit AS \"%s\"\n"
+ ", subconninfo AS \"%s\"\n",
+ gettext_noop("Synchronous commit"),
+ gettext_noop("Conninfo"));
+
+ /* Skip LSN is only supported in v15 and higher */
+ if (pset.sversion >= 150000)
+ appendPQExpBuffer(&buf,
+ ", subskiplsn AS \"%s\"\n",
+ gettext_noop("Skip LSN"));
+ }
+
+ /* Only display subscriptions in current database. */
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_subscription\n"
+ "WHERE subdbid = (SELECT oid\n"
+ " FROM pg_catalog.pg_database\n"
+ " WHERE datname = pg_catalog.current_database())");
+
+ if (!validateSQLNamePattern(&buf, pattern, true, false,
+ NULL, "subname", NULL,
+ NULL,
+ NULL, 1))
+ {
+ termPQExpBuffer(&buf);
+ return false;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of subscriptions");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
+
+/*
+ * printACLColumn
+ *
+ * Helper function for consistently formatting ACL (privilege) columns.
+ * The proper targetlist entry is appended to buf. Note lack of any
+ * whitespace or comma decoration.
+ */
+static void
+printACLColumn(PQExpBuffer buf, const char *colname)
+{
+ appendPQExpBuffer(buf,
+ "pg_catalog.array_to_string(%s, E'\\n') AS \"%s\"",
+ colname, gettext_noop("Access privileges"));
+}
+
+/*
+ * \dAc
+ * Lists operator classes
+ *
+ * Takes optional regexps to filter by index access method and input data type.
+ */
+bool
+listOperatorClasses(const char *access_method_pattern,
+ const char *type_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+ static const bool translate_columns[] = {false, false, false, false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " pg_catalog.format_type(c.opcintype, NULL) AS \"%s\",\n"
+ " CASE\n"
+ " WHEN c.opckeytype <> 0 AND c.opckeytype <> c.opcintype\n"
+ " THEN pg_catalog.format_type(c.opckeytype, NULL)\n"
+ " ELSE NULL\n"
+ " END AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opclass_is_visible(c.oid)\n"
+ " THEN pg_catalog.format('%%I', c.opcname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', n.nspname, c.opcname)\n"
+ " END AS \"%s\",\n"
+ " (CASE WHEN c.opcdefault\n"
+ " THEN '%s'\n"
+ " ELSE '%s'\n"
+ " END) AS \"%s\"",
+ gettext_noop("AM"),
+ gettext_noop("Input type"),
+ gettext_noop("Storage type"),
+ gettext_noop("Operator class"),
+ gettext_noop("yes"),
+ gettext_noop("no"),
+ gettext_noop("Default?"));
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n"
+ " THEN pg_catalog.format('%%I', of.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', ofn.nspname, of.opfname)\n"
+ " END AS \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(c.opcowner) AS \"%s\"\n",
+ gettext_noop("Operator family"),
+ gettext_noop("Owner"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_opclass c\n"
+ " LEFT JOIN pg_catalog.pg_am am on am.oid = c.opcmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.opcnamespace\n"
+ " LEFT JOIN pg_catalog.pg_type t ON t.oid = c.opcintype\n"
+ " LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = c.opcfamily\n"
+ " LEFT JOIN pg_catalog.pg_namespace ofn ON ofn.oid = of.opfnamespace\n");
+
+ if (access_method_pattern)
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname", NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ if (type_pattern)
+ {
+ /* Match type name pattern against either internal or external name */
+ if (!validateSQLNamePattern(&buf, type_pattern, have_where, false,
+ "tn.nspname", "t.typname",
+ "pg_catalog.format_type(t.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ goto error_return;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;");
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operator classes");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dAf
+ * Lists operator families
+ *
+ * Takes optional regexps to filter by index access method and input data type.
+ */
+bool
+listOperatorFamilies(const char *access_method_pattern,
+ const char *type_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+ static const bool translate_columns[] = {false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(f.oid)\n"
+ " THEN pg_catalog.format('%%I', f.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', n.nspname, f.opfname)\n"
+ " END AS \"%s\",\n"
+ " (SELECT\n"
+ " pg_catalog.string_agg(pg_catalog.format_type(oc.opcintype, NULL), ', ')\n"
+ " FROM pg_catalog.pg_opclass oc\n"
+ " WHERE oc.opcfamily = f.oid) \"%s\"",
+ gettext_noop("AM"),
+ gettext_noop("Operator family"),
+ gettext_noop("Applicable types"));
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ",\n pg_catalog.pg_get_userbyid(f.opfowner) AS \"%s\"\n",
+ gettext_noop("Owner"));
+ appendPQExpBufferStr(&buf,
+ "\nFROM pg_catalog.pg_opfamily f\n"
+ " LEFT JOIN pg_catalog.pg_am am on am.oid = f.opfmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = f.opfnamespace\n");
+
+ if (access_method_pattern)
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname", NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ if (type_pattern)
+ {
+ appendPQExpBuffer(&buf,
+ " %s EXISTS (\n"
+ " SELECT 1\n"
+ " FROM pg_catalog.pg_type t\n"
+ " JOIN pg_catalog.pg_opclass oc ON oc.opcintype = t.oid\n"
+ " LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n"
+ " WHERE oc.opcfamily = f.oid\n",
+ have_where ? "AND" : "WHERE");
+ /* Match type name pattern against either internal or external name */
+ if (!validateSQLNamePattern(&buf, type_pattern, true, false,
+ "tn.nspname", "t.typname",
+ "pg_catalog.format_type(t.oid, NULL)",
+ "pg_catalog.pg_type_is_visible(t.oid)",
+ NULL, 3))
+ goto error_return;
+ appendPQExpBufferStr(&buf, " )\n");
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2;");
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operator families");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dAo
+ * Lists operators of operator families
+ *
+ * Takes optional regexps to filter by index access method and operator
+ * family.
+ */
+bool
+listOpFamilyOperators(const char *access_method_pattern,
+ const char *family_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+
+ static const bool translate_columns[] = {false, false, false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n"
+ " THEN pg_catalog.format('%%I', of.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', nsf.nspname, of.opfname)\n"
+ " END AS \"%s\",\n"
+ " o.amopopr::pg_catalog.regoperator AS \"%s\"\n,"
+ " o.amopstrategy AS \"%s\",\n"
+ " CASE o.amoppurpose\n"
+ " WHEN 'o' THEN '%s'\n"
+ " WHEN 's' THEN '%s'\n"
+ " END AS \"%s\"\n",
+ gettext_noop("AM"),
+ gettext_noop("Operator family"),
+ gettext_noop("Operator"),
+ gettext_noop("Strategy"),
+ gettext_noop("ordering"),
+ gettext_noop("search"),
+ gettext_noop("Purpose"));
+
+ if (verbose)
+ appendPQExpBuffer(&buf,
+ ", ofs.opfname AS \"%s\"\n",
+ gettext_noop("Sort opfamily"));
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_amop o\n"
+ " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = o.amopfamily\n"
+ " LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod AND am.oid = o.amopmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace nsf ON of.opfnamespace = nsf.oid\n");
+ if (verbose)
+ appendPQExpBufferStr(&buf,
+ " LEFT JOIN pg_catalog.pg_opfamily ofs ON ofs.oid = o.amopsortfamily\n");
+
+ if (access_method_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname",
+ NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ }
+
+ if (family_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, family_pattern, have_where, false,
+ "nsf.nspname", "of.opfname", NULL, NULL,
+ NULL, 3))
+ goto error_return;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2,\n"
+ " o.amoplefttype = o.amoprighttype DESC,\n"
+ " pg_catalog.format_type(o.amoplefttype, NULL),\n"
+ " pg_catalog.format_type(o.amoprighttype, NULL),\n"
+ " o.amopstrategy;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of operators of operator families");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dAp
+ * Lists support functions of operator families
+ *
+ * Takes optional regexps to filter by index access method and operator
+ * family.
+ */
+bool
+listOpFamilyFunctions(const char *access_method_pattern,
+ const char *family_pattern, bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+ bool have_where = false;
+ static const bool translate_columns[] = {false, false, false, false, false, false};
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT\n"
+ " am.amname AS \"%s\",\n"
+ " CASE\n"
+ " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n"
+ " THEN pg_catalog.format('%%I', of.opfname)\n"
+ " ELSE pg_catalog.format('%%I.%%I', ns.nspname, of.opfname)\n"
+ " END AS \"%s\",\n"
+ " pg_catalog.format_type(ap.amproclefttype, NULL) AS \"%s\",\n"
+ " pg_catalog.format_type(ap.amprocrighttype, NULL) AS \"%s\",\n"
+ " ap.amprocnum AS \"%s\"\n",
+ gettext_noop("AM"),
+ gettext_noop("Operator family"),
+ gettext_noop("Registered left type"),
+ gettext_noop("Registered right type"),
+ gettext_noop("Number"));
+
+ if (!verbose)
+ appendPQExpBuffer(&buf,
+ ", p.proname AS \"%s\"\n",
+ gettext_noop("Function"));
+ else
+ appendPQExpBuffer(&buf,
+ ", ap.amproc::pg_catalog.regprocedure AS \"%s\"\n",
+ gettext_noop("Function"));
+
+ appendPQExpBufferStr(&buf,
+ "FROM pg_catalog.pg_amproc ap\n"
+ " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = ap.amprocfamily\n"
+ " LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod\n"
+ " LEFT JOIN pg_catalog.pg_namespace ns ON of.opfnamespace = ns.oid\n"
+ " LEFT JOIN pg_catalog.pg_proc p ON ap.amproc = p.oid\n");
+
+ if (access_method_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, access_method_pattern,
+ false, false, NULL, "am.amname",
+ NULL, NULL,
+ &have_where, 1))
+ goto error_return;
+ }
+ if (family_pattern)
+ {
+ if (!validateSQLNamePattern(&buf, family_pattern, have_where, false,
+ "ns.nspname", "of.opfname", NULL, NULL,
+ NULL, 3))
+ goto error_return;
+ }
+
+ appendPQExpBufferStr(&buf, "ORDER BY 1, 2,\n"
+ " ap.amproclefttype = ap.amprocrighttype DESC,\n"
+ " 3, 4, 5;");
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("List of support functions of operator families");
+ myopt.translate_header = true;
+ myopt.translate_columns = translate_columns;
+ myopt.n_translate_columns = lengthof(translate_columns);
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+
+error_return:
+ termPQExpBuffer(&buf);
+ return false;
+}
+
+/*
+ * \dl or \lo_list
+ * Lists large objects
+ */
+bool
+listLargeObjects(bool verbose)
+{
+ PQExpBufferData buf;
+ PGresult *res;
+ printQueryOpt myopt = pset.popt;
+
+ initPQExpBuffer(&buf);
+
+ printfPQExpBuffer(&buf,
+ "SELECT oid as \"%s\",\n"
+ " pg_catalog.pg_get_userbyid(lomowner) as \"%s\",\n ",
+ gettext_noop("ID"),
+ gettext_noop("Owner"));
+
+ if (verbose)
+ {
+ printACLColumn(&buf, "lomacl");
+ appendPQExpBufferStr(&buf, ",\n ");
+ }
+
+ appendPQExpBuffer(&buf,
+ "pg_catalog.obj_description(oid, 'pg_largeobject') as \"%s\"\n"
+ "FROM pg_catalog.pg_largeobject_metadata\n"
+ "ORDER BY oid",
+ gettext_noop("Description"));
+
+ res = PSQLexec(buf.data);
+ termPQExpBuffer(&buf);
+ if (!res)
+ return false;
+
+ myopt.nullPrint = NULL;
+ myopt.title = _("Large objects");
+ myopt.translate_header = true;
+
+ printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
+
+ PQclear(res);
+ return true;
+}
diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h
new file mode 100644
index 0000000..24c0884
--- /dev/null
+++ b/src/bin/psql/describe.h
@@ -0,0 +1,152 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/describe.h
+ */
+#ifndef DESCRIBE_H
+#define DESCRIBE_H
+
+
+/* \da */
+extern bool describeAggregates(const char *pattern, bool verbose, bool showSystem);
+
+/* \dA */
+extern bool describeAccessMethods(const char *pattern, bool verbose);
+
+/* \db */
+extern bool describeTablespaces(const char *pattern, bool verbose);
+
+/* \df, \dfa, \dfn, \dft, \dfw, etc. */
+extern bool describeFunctions(const char *functypes, const char *func_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem);
+
+/* \dT */
+extern bool describeTypes(const char *pattern, bool verbose, bool showSystem);
+
+/* \do */
+extern bool describeOperators(const char *oper_pattern,
+ char **arg_patterns, int num_arg_patterns,
+ bool verbose, bool showSystem);
+
+/* \du, \dg */
+extern bool describeRoles(const char *pattern, bool verbose, bool showSystem);
+
+/* \drds */
+extern bool listDbRoleSettings(const char *pattern, const char *pattern2);
+
+/* \drg */
+extern bool describeRoleGrants(const char *pattern, bool showSystem);
+
+/* \z (or \dp) */
+extern bool permissionsList(const char *pattern, bool showSystem);
+
+/* \ddp */
+extern bool listDefaultACLs(const char *pattern);
+
+/* \dd */
+extern bool objectDescription(const char *pattern, bool showSystem);
+
+/* \d foo */
+extern bool describeTableDetails(const char *pattern, bool verbose, bool showSystem);
+
+/* \dF */
+extern bool listTSConfigs(const char *pattern, bool verbose);
+
+/* \dFp */
+extern bool listTSParsers(const char *pattern, bool verbose);
+
+/* \dFd */
+extern bool listTSDictionaries(const char *pattern, bool verbose);
+
+/* \dFt */
+extern bool listTSTemplates(const char *pattern, bool verbose);
+
+/* \l */
+extern bool listAllDbs(const char *pattern, bool verbose);
+
+/* \dt, \di, \ds, \dS, etc. */
+extern bool listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem);
+
+/* \dP */
+extern bool listPartitionedTables(const char *reltypes, const char *pattern, bool verbose);
+
+/* \dD */
+extern bool listDomains(const char *pattern, bool verbose, bool showSystem);
+
+/* \dc */
+extern bool listConversions(const char *pattern, bool verbose, bool showSystem);
+
+/* \dconfig */
+extern bool describeConfigurationParameters(const char *pattern, bool verbose,
+ bool showSystem);
+
+/* \dC */
+extern bool listCasts(const char *pattern, bool verbose);
+
+/* \dO */
+extern bool listCollations(const char *pattern, bool verbose, bool showSystem);
+
+/* \dn */
+extern bool listSchemas(const char *pattern, bool verbose, bool showSystem);
+
+/* \dew */
+extern bool listForeignDataWrappers(const char *pattern, bool verbose);
+
+/* \des */
+extern bool listForeignServers(const char *pattern, bool verbose);
+
+/* \deu */
+extern bool listUserMappings(const char *pattern, bool verbose);
+
+/* \det */
+extern bool listForeignTables(const char *pattern, bool verbose);
+
+/* \dL */
+extern bool listLanguages(const char *pattern, bool verbose, bool showSystem);
+
+/* \dx */
+extern bool listExtensions(const char *pattern);
+
+/* \dx+ */
+extern bool listExtensionContents(const char *pattern);
+
+/* \dX */
+extern bool listExtendedStats(const char *pattern);
+
+/* \dy */
+extern bool listEventTriggers(const char *pattern, bool verbose);
+
+/* \dRp */
+bool listPublications(const char *pattern);
+
+/* \dRp+ */
+bool describePublications(const char *pattern);
+
+/* \dRs */
+bool describeSubscriptions(const char *pattern, bool verbose);
+
+/* \dAc */
+extern bool listOperatorClasses(const char *access_method_pattern,
+ const char *type_pattern,
+ bool verbose);
+
+/* \dAf */
+extern bool listOperatorFamilies(const char *access_method_pattern,
+ const char *type_pattern,
+ bool verbose);
+
+/* \dAo */
+extern bool listOpFamilyOperators(const char *access_method_pattern,
+ const char *family_pattern, bool verbose);
+
+/* \dAp */
+extern bool listOpFamilyFunctions(const char *access_method_pattern,
+ const char *family_pattern, bool verbose);
+
+/* \dl or \lo_list */
+extern bool listLargeObjects(bool verbose);
+
+#endif /* DESCRIBE_H */
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
new file mode 100644
index 0000000..b2b749d
--- /dev/null
+++ b/src/bin/psql/help.c
@@ -0,0 +1,772 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/help.c
+ */
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <unistd.h> /* for geteuid() */
+#else
+#include <win32.h>
+#endif
+
+#ifndef WIN32
+#include <sys/ioctl.h> /* for ioctl() */
+#endif
+
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+
+#include "common.h"
+#include "common/logging.h"
+#include "common/username.h"
+#include "help.h"
+#include "input.h"
+#include "settings.h"
+#include "sql_help.h"
+
+/*
+ * PLEASE:
+ * If you change something in this file, also make the same changes
+ * in the DocBook documentation, file ref/psql-ref.sgml. If you don't
+ * know how to do it, please find someone who can help you.
+ */
+
+/* Some helper macros to make the code less verbose */
+#define HELP0(str) appendPQExpBufferStr(&buf, _(str))
+#define HELPN(str,...) appendPQExpBuffer(&buf, _(str), __VA_ARGS__)
+#define ON(var) ((var) ? _("on") : _("off"))
+
+
+/*
+ * usage
+ *
+ * print out command line arguments
+ */
+void
+usage(unsigned short int pager)
+{
+ const char *env;
+ const char *user;
+ char *errstr;
+ PQExpBufferData buf;
+ int nlcount;
+ FILE *output;
+
+ /* Find default user, in case we need it. */
+ user = getenv("PGUSER");
+ if (!user)
+ {
+ user = get_user_name(&errstr);
+ if (!user)
+ pg_fatal("%s", errstr);
+ }
+
+ /*
+ * To avoid counting the output lines manually, build the output in "buf"
+ * and then count them.
+ */
+ initPQExpBuffer(&buf);
+
+ HELP0("psql is the PostgreSQL interactive terminal.\n\n");
+ HELP0("Usage:\n");
+ HELP0(" psql [OPTION]... [DBNAME [USERNAME]]\n\n");
+
+ HELP0("General options:\n");
+ /* Display default database */
+ env = getenv("PGDATABASE");
+ if (!env)
+ env = user;
+ HELP0(" -c, --command=COMMAND run only single command (SQL or internal) and exit\n");
+ HELPN(" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n",
+ env);
+ HELP0(" -f, --file=FILENAME execute commands from file, then exit\n");
+ HELP0(" -l, --list list available databases, then exit\n");
+ HELP0(" -v, --set=, --variable=NAME=VALUE\n"
+ " set psql variable NAME to VALUE\n"
+ " (e.g., -v ON_ERROR_STOP=1)\n");
+ HELP0(" -V, --version output version information, then exit\n");
+ HELP0(" -X, --no-psqlrc do not read startup file (~/.psqlrc)\n");
+ HELP0(" -1 (\"one\"), --single-transaction\n"
+ " execute as a single transaction (if non-interactive)\n");
+ HELP0(" -?, --help[=options] show this help, then exit\n");
+ HELP0(" --help=commands list backslash commands, then exit\n");
+ HELP0(" --help=variables list special variables, then exit\n");
+
+ HELP0("\nInput and output options:\n");
+ HELP0(" -a, --echo-all echo all input from script\n");
+ HELP0(" -b, --echo-errors echo failed commands\n");
+ HELP0(" -e, --echo-queries echo commands sent to server\n");
+ HELP0(" -E, --echo-hidden display queries that internal commands generate\n");
+ HELP0(" -L, --log-file=FILENAME send session log to file\n");
+ HELP0(" -n, --no-readline disable enhanced command line editing (readline)\n");
+ HELP0(" -o, --output=FILENAME send query results to file (or |pipe)\n");
+ HELP0(" -q, --quiet run quietly (no messages, only query output)\n");
+ HELP0(" -s, --single-step single-step mode (confirm each query)\n");
+ HELP0(" -S, --single-line single-line mode (end of line terminates SQL command)\n");
+
+ HELP0("\nOutput format options:\n");
+ HELP0(" -A, --no-align unaligned table output mode\n");
+ HELP0(" --csv CSV (Comma-Separated Values) table output mode\n");
+ HELPN(" -F, --field-separator=STRING\n"
+ " field separator for unaligned output (default: \"%s\")\n",
+ DEFAULT_FIELD_SEP);
+ HELP0(" -H, --html HTML table output mode\n");
+ HELP0(" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n");
+ HELP0(" -R, --record-separator=STRING\n"
+ " record separator for unaligned output (default: newline)\n");
+ HELP0(" -t, --tuples-only print rows only\n");
+ HELP0(" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n");
+ HELP0(" -x, --expanded turn on expanded table output\n");
+ HELP0(" -z, --field-separator-zero\n"
+ " set field separator for unaligned output to zero byte\n");
+ HELP0(" -0, --record-separator-zero\n"
+ " set record separator for unaligned output to zero byte\n");
+
+ HELP0("\nConnection options:\n");
+ /* Display default host */
+ env = getenv("PGHOST");
+ HELPN(" -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n",
+ env ? env : _("local socket"));
+ /* Display default port */
+ env = getenv("PGPORT");
+ HELPN(" -p, --port=PORT database server port (default: \"%s\")\n",
+ env ? env : DEF_PGPORT_STR);
+ /* Display default user */
+ HELPN(" -U, --username=USERNAME database user name (default: \"%s\")\n",
+ user);
+ HELP0(" -w, --no-password never prompt for password\n");
+ HELP0(" -W, --password force password prompt (should happen automatically)\n");
+
+ HELP0("\nFor more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+ "commands) from within psql, or consult the psql section in the PostgreSQL\n"
+ "documentation.\n\n");
+ HELPN("Report bugs to <%s>.\n", PACKAGE_BUGREPORT);
+ HELPN("%s home page: <%s>\n", PACKAGE_NAME, PACKAGE_URL);
+
+ /* Now we can count the lines. */
+ nlcount = 0;
+ for (const char *ptr = buf.data; *ptr; ptr++)
+ {
+ if (*ptr == '\n')
+ nlcount++;
+ }
+
+ /* And dump the output, with appropriate pagination. */
+ output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(buf.data, output);
+
+ ClosePager(output);
+
+ termPQExpBuffer(&buf);
+}
+
+
+/*
+ * slashUsage
+ *
+ * print out help for the backslash commands
+ */
+void
+slashUsage(unsigned short int pager)
+{
+ PQExpBufferData buf;
+ int nlcount;
+ FILE *output;
+ char *currdb;
+
+ currdb = PQdb(pset.db);
+
+ /*
+ * To avoid counting the output lines manually, build the output in "buf"
+ * and then count them.
+ */
+ initPQExpBuffer(&buf);
+
+ HELP0("General\n");
+ HELP0(" \\bind [PARAM]... set query parameters\n");
+ HELP0(" \\copyright show PostgreSQL usage and distribution terms\n");
+ HELP0(" \\crosstabview [COLUMNS] execute query and display result in crosstab\n");
+ HELP0(" \\errverbose show most recent error message at maximum verbosity\n");
+ HELP0(" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+ " \\g with no arguments is equivalent to a semicolon\n");
+ HELP0(" \\gdesc describe result of query, without executing it\n");
+ HELP0(" \\gexec execute query, then execute each value in its result\n");
+ HELP0(" \\gset [PREFIX] execute query and store result in psql variables\n");
+ HELP0(" \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n");
+ HELP0(" \\q quit psql\n");
+ HELP0(" \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n");
+ HELP0("\n");
+
+ HELP0("Help\n");
+
+ HELP0(" \\? [commands] show help on backslash commands\n");
+ HELP0(" \\? options show help on psql command-line options\n");
+ HELP0(" \\? variables show help on special variables\n");
+ HELP0(" \\h [NAME] help on syntax of SQL commands, * for all commands\n");
+ HELP0("\n");
+
+ HELP0("Query Buffer\n");
+ HELP0(" \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n");
+ HELP0(" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n");
+ HELP0(" \\ev [VIEWNAME [LINE]] edit view definition with external editor\n");
+ HELP0(" \\p show the contents of the query buffer\n");
+ HELP0(" \\r reset (clear) the query buffer\n");
+#ifdef USE_READLINE
+ HELP0(" \\s [FILE] display history or save it to file\n");
+#endif
+ HELP0(" \\w FILE write query buffer to file\n");
+ HELP0("\n");
+
+ HELP0("Input/Output\n");
+ HELP0(" \\copy ... perform SQL COPY with data stream to the client host\n");
+ HELP0(" \\echo [-n] [STRING] write string to standard output (-n for no newline)\n");
+ HELP0(" \\i FILE execute commands from file\n");
+ HELP0(" \\ir FILE as \\i, but relative to location of current script\n");
+ HELP0(" \\o [FILE] send all query results to file or |pipe\n");
+ HELP0(" \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n");
+ HELP0(" \\warn [-n] [STRING] write string to standard error (-n for no newline)\n");
+ HELP0("\n");
+
+ HELP0("Conditional\n");
+ HELP0(" \\if EXPR begin conditional block\n");
+ HELP0(" \\elif EXPR alternative within current conditional block\n");
+ HELP0(" \\else final alternative within current conditional block\n");
+ HELP0(" \\endif end conditional block\n");
+ HELP0("\n");
+
+ HELP0("Informational\n");
+ HELP0(" (options: S = show system objects, + = additional detail)\n");
+ HELP0(" \\d[S+] list tables, views, and sequences\n");
+ HELP0(" \\d[S+] NAME describe table, view, sequence, or index\n");
+ HELP0(" \\da[S] [PATTERN] list aggregates\n");
+ HELP0(" \\dA[+] [PATTERN] list access methods\n");
+ HELP0(" \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n");
+ HELP0(" \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n");
+ HELP0(" \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n");
+ HELP0(" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n");
+ HELP0(" \\db[+] [PATTERN] list tablespaces\n");
+ HELP0(" \\dc[S+] [PATTERN] list conversions\n");
+ HELP0(" \\dconfig[+] [PATTERN] list configuration parameters\n");
+ HELP0(" \\dC[+] [PATTERN] list casts\n");
+ HELP0(" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n");
+ HELP0(" \\dD[S+] [PATTERN] list domains\n");
+ HELP0(" \\ddp [PATTERN] list default privileges\n");
+ HELP0(" \\dE[S+] [PATTERN] list foreign tables\n");
+ HELP0(" \\des[+] [PATTERN] list foreign servers\n");
+ HELP0(" \\det[+] [PATTERN] list foreign tables\n");
+ HELP0(" \\deu[+] [PATTERN] list user mappings\n");
+ HELP0(" \\dew[+] [PATTERN] list foreign-data wrappers\n");
+ HELP0(" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+ " list [only agg/normal/procedure/trigger/window] functions\n");
+ HELP0(" \\dF[+] [PATTERN] list text search configurations\n");
+ HELP0(" \\dFd[+] [PATTERN] list text search dictionaries\n");
+ HELP0(" \\dFp[+] [PATTERN] list text search parsers\n");
+ HELP0(" \\dFt[+] [PATTERN] list text search templates\n");
+ HELP0(" \\dg[S+] [PATTERN] list roles\n");
+ HELP0(" \\di[S+] [PATTERN] list indexes\n");
+ HELP0(" \\dl[+] list large objects, same as \\lo_list\n");
+ HELP0(" \\dL[S+] [PATTERN] list procedural languages\n");
+ HELP0(" \\dm[S+] [PATTERN] list materialized views\n");
+ HELP0(" \\dn[S+] [PATTERN] list schemas\n");
+ HELP0(" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+ " list operators\n");
+ HELP0(" \\dO[S+] [PATTERN] list collations\n");
+ HELP0(" \\dp[S] [PATTERN] list table, view, and sequence access privileges\n");
+ HELP0(" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n");
+ HELP0(" \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n");
+ HELP0(" \\drg[S] [PATTERN] list role grants\n");
+ HELP0(" \\dRp[+] [PATTERN] list replication publications\n");
+ HELP0(" \\dRs[+] [PATTERN] list replication subscriptions\n");
+ HELP0(" \\ds[S+] [PATTERN] list sequences\n");
+ HELP0(" \\dt[S+] [PATTERN] list tables\n");
+ HELP0(" \\dT[S+] [PATTERN] list data types\n");
+ HELP0(" \\du[S+] [PATTERN] list roles\n");
+ HELP0(" \\dv[S+] [PATTERN] list views\n");
+ HELP0(" \\dx[+] [PATTERN] list extensions\n");
+ HELP0(" \\dX [PATTERN] list extended statistics\n");
+ HELP0(" \\dy[+] [PATTERN] list event triggers\n");
+ HELP0(" \\l[+] [PATTERN] list databases\n");
+ HELP0(" \\sf[+] FUNCNAME show a function's definition\n");
+ HELP0(" \\sv[+] VIEWNAME show a view's definition\n");
+ HELP0(" \\z[S] [PATTERN] same as \\dp\n");
+ HELP0("\n");
+
+ HELP0("Large Objects\n");
+ HELP0(" \\lo_export LOBOID FILE write large object to file\n");
+ HELP0(" \\lo_import FILE [COMMENT]\n"
+ " read large object from file\n");
+ HELP0(" \\lo_list[+] list large objects\n");
+ HELP0(" \\lo_unlink LOBOID delete a large object\n");
+ HELP0("\n");
+
+ HELP0("Formatting\n");
+ HELP0(" \\a toggle between unaligned and aligned output mode\n");
+ HELP0(" \\C [STRING] set table title, or unset if none\n");
+ HELP0(" \\f [STRING] show or set field separator for unaligned query output\n");
+ HELPN(" \\H toggle HTML output mode (currently %s)\n",
+ ON(pset.popt.topt.format == PRINT_HTML));
+ HELP0(" \\pset [NAME [VALUE]] set table output option\n"
+ " (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+ " fieldsep_zero|footer|format|linestyle|null|\n"
+ " numericlocale|pager|pager_min_lines|recordsep|\n"
+ " recordsep_zero|tableattr|title|tuples_only|\n"
+ " unicode_border_linestyle|unicode_column_linestyle|\n"
+ " unicode_header_linestyle)\n");
+ HELPN(" \\t [on|off] show only rows (currently %s)\n",
+ ON(pset.popt.topt.tuples_only));
+ HELP0(" \\T [STRING] set HTML <table> tag attributes, or unset if none\n");
+ HELPN(" \\x [on|off|auto] toggle expanded output (currently %s)\n",
+ pset.popt.topt.expanded == 2 ? _("auto") : ON(pset.popt.topt.expanded));
+ HELP0("\n");
+
+ HELP0("Connection\n");
+ if (currdb)
+ HELPN(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+ " connect to new database (currently \"%s\")\n",
+ currdb);
+ else
+ HELP0(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+ " connect to new database (currently no connection)\n");
+ HELP0(" \\conninfo display information about current connection\n");
+ HELP0(" \\encoding [ENCODING] show or set client encoding\n");
+ HELP0(" \\password [USERNAME] securely change the password for a user\n");
+ HELP0("\n");
+
+ HELP0("Operating System\n");
+ HELP0(" \\cd [DIR] change the current working directory\n");
+ HELP0(" \\getenv PSQLVAR ENVVAR fetch environment variable\n");
+ HELP0(" \\setenv NAME [VALUE] set or unset environment variable\n");
+ HELPN(" \\timing [on|off] toggle timing of commands (currently %s)\n",
+ ON(pset.timing));
+ HELP0(" \\! [COMMAND] execute command in shell or start interactive shell\n");
+ HELP0("\n");
+
+ HELP0("Variables\n");
+ HELP0(" \\prompt [TEXT] NAME prompt user to set internal variable\n");
+ HELP0(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n");
+ HELP0(" \\unset NAME unset (delete) internal variable\n");
+
+ /* Now we can count the lines. */
+ nlcount = 0;
+ for (const char *ptr = buf.data; *ptr; ptr++)
+ {
+ if (*ptr == '\n')
+ nlcount++;
+ }
+
+ /* And dump the output, with appropriate pagination. */
+ output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(buf.data, output);
+
+ ClosePager(output);
+
+ termPQExpBuffer(&buf);
+}
+
+
+/*
+ * helpVariables
+ *
+ * show list of available variables (options) from command line
+ */
+void
+helpVariables(unsigned short int pager)
+{
+ PQExpBufferData buf;
+ int nlcount;
+ FILE *output;
+
+ /*
+ * To avoid counting the output lines manually, build the output in "buf"
+ * and then count them.
+ */
+ initPQExpBuffer(&buf);
+
+ HELP0("List of specially treated variables\n\n");
+
+ HELP0("psql variables:\n");
+ HELP0("Usage:\n");
+ HELP0(" psql --set=NAME=VALUE\n or \\set NAME VALUE inside psql\n\n");
+
+ HELP0(" AUTOCOMMIT\n"
+ " if set, successful SQL commands are automatically committed\n");
+ HELP0(" COMP_KEYWORD_CASE\n"
+ " determines the case used to complete SQL key words\n"
+ " [lower, upper, preserve-lower, preserve-upper]\n");
+ HELP0(" DBNAME\n"
+ " the currently connected database name\n");
+ HELP0(" ECHO\n"
+ " controls what input is written to standard output\n"
+ " [all, errors, none, queries]\n");
+ HELP0(" ECHO_HIDDEN\n"
+ " if set, display internal queries executed by backslash commands;\n"
+ " if set to \"noexec\", just show them without execution\n");
+ HELP0(" ENCODING\n"
+ " current client character set encoding\n");
+ HELP0(" ERROR\n"
+ " \"true\" if last query failed, else \"false\"\n");
+ HELP0(" FETCH_COUNT\n"
+ " the number of result rows to fetch and display at a time (0 = unlimited)\n");
+ HELP0(" HIDE_TABLEAM\n"
+ " if set, table access methods are not displayed\n");
+ HELP0(" HIDE_TOAST_COMPRESSION\n"
+ " if set, compression methods are not displayed\n");
+ HELP0(" HISTCONTROL\n"
+ " controls command history [ignorespace, ignoredups, ignoreboth]\n");
+ HELP0(" HISTFILE\n"
+ " file name used to store the command history\n");
+ HELP0(" HISTSIZE\n"
+ " maximum number of commands to store in the command history\n");
+ HELP0(" HOST\n"
+ " the currently connected database server host\n");
+ HELP0(" IGNOREEOF\n"
+ " number of EOFs needed to terminate an interactive session\n");
+ HELP0(" LASTOID\n"
+ " value of the last affected OID\n");
+ HELP0(" LAST_ERROR_MESSAGE\n"
+ " LAST_ERROR_SQLSTATE\n"
+ " message and SQLSTATE of last error, or empty string and \"00000\" if none\n");
+ HELP0(" ON_ERROR_ROLLBACK\n"
+ " if set, an error doesn't stop a transaction (uses implicit savepoints)\n");
+ HELP0(" ON_ERROR_STOP\n"
+ " stop batch execution after error\n");
+ HELP0(" PORT\n"
+ " server port of the current connection\n");
+ HELP0(" PROMPT1\n"
+ " specifies the standard psql prompt\n");
+ HELP0(" PROMPT2\n"
+ " specifies the prompt used when a statement continues from a previous line\n");
+ HELP0(" PROMPT3\n"
+ " specifies the prompt used during COPY ... FROM STDIN\n");
+ HELP0(" QUIET\n"
+ " run quietly (same as -q option)\n");
+ HELP0(" ROW_COUNT\n"
+ " number of rows returned or affected by last query, or 0\n");
+ HELP0(" SERVER_VERSION_NAME\n"
+ " SERVER_VERSION_NUM\n"
+ " server's version (in short string or numeric format)\n");
+ HELP0(" SHELL_ERROR\n"
+ " \"true\" if the last shell command failed, \"false\" if it succeeded\n");
+ HELP0(" SHELL_EXIT_CODE\n"
+ " exit status of the last shell command\n");
+ HELP0(" SHOW_ALL_RESULTS\n"
+ " show all results of a combined query (\\;) instead of only the last\n");
+ HELP0(" SHOW_CONTEXT\n"
+ " controls display of message context fields [never, errors, always]\n");
+ HELP0(" SINGLELINE\n"
+ " if set, end of line terminates SQL commands (same as -S option)\n");
+ HELP0(" SINGLESTEP\n"
+ " single-step mode (same as -s option)\n");
+ HELP0(" SQLSTATE\n"
+ " SQLSTATE of last query, or \"00000\" if no error\n");
+ HELP0(" USER\n"
+ " the currently connected database user\n");
+ HELP0(" VERBOSITY\n"
+ " controls verbosity of error reports [default, verbose, terse, sqlstate]\n");
+ HELP0(" VERSION\n"
+ " VERSION_NAME\n"
+ " VERSION_NUM\n"
+ " psql's version (in verbose string, short string, or numeric format)\n");
+
+ HELP0("\nDisplay settings:\n");
+ HELP0("Usage:\n");
+ HELP0(" psql --pset=NAME[=VALUE]\n or \\pset NAME [VALUE] inside psql\n\n");
+
+ HELP0(" border\n"
+ " border style (number)\n");
+ HELP0(" columns\n"
+ " target width for the wrapped format\n");
+ HELP0(" expanded (or x)\n"
+ " expanded output [on, off, auto]\n");
+ HELPN(" fieldsep\n"
+ " field separator for unaligned output (default \"%s\")\n",
+ DEFAULT_FIELD_SEP);
+ HELP0(" fieldsep_zero\n"
+ " set field separator for unaligned output to a zero byte\n");
+ HELP0(" footer\n"
+ " enable or disable display of the table footer [on, off]\n");
+ HELP0(" format\n"
+ " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n");
+ HELP0(" linestyle\n"
+ " set the border line drawing style [ascii, old-ascii, unicode]\n");
+ HELP0(" null\n"
+ " set the string to be printed in place of a null value\n");
+ HELP0(" numericlocale\n"
+ " enable display of a locale-specific character to separate groups of digits\n");
+ HELP0(" pager\n"
+ " control when an external pager is used [yes, no, always]\n");
+ HELP0(" recordsep\n"
+ " record (line) separator for unaligned output\n");
+ HELP0(" recordsep_zero\n"
+ " set record separator for unaligned output to a zero byte\n");
+ HELP0(" tableattr (or T)\n"
+ " specify attributes for table tag in html format, or proportional\n"
+ " column widths for left-aligned data types in latex-longtable format\n");
+ HELP0(" title\n"
+ " set the table title for subsequently printed tables\n");
+ HELP0(" tuples_only\n"
+ " if set, only actual table data is shown\n");
+ HELP0(" unicode_border_linestyle\n"
+ " unicode_column_linestyle\n"
+ " unicode_header_linestyle\n"
+ " set the style of Unicode line drawing [single, double]\n");
+
+ HELP0("\nEnvironment variables:\n");
+ HELP0("Usage:\n");
+
+#ifndef WIN32
+ HELP0(" NAME=VALUE [NAME=VALUE] psql ...\n or \\setenv NAME [VALUE] inside psql\n\n");
+#else
+ HELP0(" set NAME=VALUE\n psql ...\n or \\setenv NAME [VALUE] inside psql\n\n");
+#endif
+
+ HELP0(" COLUMNS\n"
+ " number of columns for wrapped format\n");
+ HELP0(" PGAPPNAME\n"
+ " same as the application_name connection parameter\n");
+ HELP0(" PGDATABASE\n"
+ " same as the dbname connection parameter\n");
+ HELP0(" PGHOST\n"
+ " same as the host connection parameter\n");
+ HELP0(" PGPASSFILE\n"
+ " password file name\n");
+ HELP0(" PGPASSWORD\n"
+ " connection password (not recommended)\n");
+ HELP0(" PGPORT\n"
+ " same as the port connection parameter\n");
+ HELP0(" PGUSER\n"
+ " same as the user connection parameter\n");
+ HELP0(" PSQL_EDITOR, EDITOR, VISUAL\n"
+ " editor used by the \\e, \\ef, and \\ev commands\n");
+ HELP0(" PSQL_EDITOR_LINENUMBER_ARG\n"
+ " how to specify a line number when invoking the editor\n");
+ HELP0(" PSQL_HISTORY\n"
+ " alternative location for the command history file\n");
+ HELP0(" PSQL_PAGER, PAGER\n"
+ " name of external pager program\n");
+#ifndef WIN32
+ HELP0(" PSQL_WATCH_PAGER\n"
+ " name of external pager program used for \\watch\n");
+#endif
+ HELP0(" PSQLRC\n"
+ " alternative location for the user's .psqlrc file\n");
+ HELP0(" SHELL\n"
+ " shell used by the \\! command\n");
+ HELP0(" TMPDIR\n"
+ " directory for temporary files\n");
+
+ /* Now we can count the lines. */
+ nlcount = 0;
+ for (const char *ptr = buf.data; *ptr; ptr++)
+ {
+ if (*ptr == '\n')
+ nlcount++;
+ }
+
+ /* And dump the output, with appropriate pagination. */
+ output = PageOutput(nlcount, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(buf.data, output);
+
+ ClosePager(output);
+
+ termPQExpBuffer(&buf);
+}
+
+
+/*
+ * helpSQL -- help with SQL commands
+ *
+ * Note: we assume caller removed any trailing spaces in "topic".
+ */
+void
+helpSQL(const char *topic, unsigned short int pager)
+{
+#define VALUE_OR_NULL(a) ((a) ? (a) : "")
+
+ if (!topic || strlen(topic) == 0)
+ {
+ /* Print all the available command names */
+ int screen_width;
+ int ncolumns;
+ int nrows;
+ FILE *output;
+ int i;
+ int j;
+
+ /* Find screen width to determine how many columns will fit */
+#ifdef TIOCGWINSZ
+ struct winsize screen_size;
+
+ if (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1)
+ screen_width = 80; /* ioctl failed, assume 80 */
+ else
+ screen_width = screen_size.ws_col;
+#else
+ screen_width = 80; /* default assumption */
+#endif
+
+ ncolumns = (screen_width - 3) / (QL_MAX_CMD_LEN + 1);
+ ncolumns = Max(ncolumns, 1);
+ nrows = (QL_HELP_COUNT + (ncolumns - 1)) / ncolumns;
+
+ output = PageOutput(nrows + 1, pager ? &(pset.popt.topt) : NULL);
+
+ fputs(_("Available help:\n"), output);
+
+ for (i = 0; i < nrows; i++)
+ {
+ fprintf(output, " ");
+ for (j = 0; j < ncolumns - 1; j++)
+ fprintf(output, "%-*s",
+ QL_MAX_CMD_LEN + 1,
+ VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
+ if (i + j * nrows < QL_HELP_COUNT)
+ fprintf(output, "%s",
+ VALUE_OR_NULL(QL_HELP[i + j * nrows].cmd));
+ fputc('\n', output);
+ }
+
+ ClosePager(output);
+ }
+ else
+ {
+ int i,
+ pass;
+ FILE *output = NULL;
+ size_t len,
+ wordlen,
+ j;
+ int nl_count;
+
+ /*
+ * len is the amount of the input to compare to the help topic names.
+ * We first try exact match, then first + second words, then first
+ * word only.
+ */
+ len = strlen(topic);
+
+ for (pass = 1; pass <= 3; pass++)
+ {
+ if (pass > 1) /* Nothing on first pass - try the opening
+ * word(s) */
+ {
+ wordlen = j = 1;
+ while (j < len && topic[j++] != ' ')
+ wordlen++;
+ if (pass == 2 && j < len)
+ {
+ wordlen++;
+ while (j < len && topic[j++] != ' ')
+ wordlen++;
+ }
+ if (wordlen >= len)
+ {
+ /* Failed to shorten input, so try next pass if any */
+ continue;
+ }
+ len = wordlen;
+ }
+
+ /*
+ * Count newlines for pager. This logic must agree with what the
+ * following loop will do!
+ */
+ nl_count = 0;
+ for (i = 0; QL_HELP[i].cmd; i++)
+ {
+ if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
+ strcmp(topic, "*") == 0)
+ {
+ /* magic constant here must match format below! */
+ nl_count += 7 + QL_HELP[i].nl_count;
+
+ /* If we have an exact match, exit. Fixes \h SELECT */
+ if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
+ break;
+ }
+ }
+ /* If no matches, don't open the output yet */
+ if (nl_count == 0)
+ continue;
+
+ if (!output)
+ output = PageOutput(nl_count, pager ? &(pset.popt.topt) : NULL);
+
+ for (i = 0; QL_HELP[i].cmd; i++)
+ {
+ if (pg_strncasecmp(topic, QL_HELP[i].cmd, len) == 0 ||
+ strcmp(topic, "*") == 0)
+ {
+ PQExpBufferData buffer;
+ char *url;
+
+ initPQExpBuffer(&buffer);
+ QL_HELP[i].syntaxfunc(&buffer);
+ url = psprintf("https://www.postgresql.org/docs/%s/%s.html",
+ strstr(PG_VERSION, "devel") ? "devel" : PG_MAJORVERSION,
+ QL_HELP[i].docbook_id);
+ /* # of newlines in format must match constant above! */
+ fprintf(output, _("Command: %s\n"
+ "Description: %s\n"
+ "Syntax:\n%s\n\n"
+ "URL: %s\n\n"),
+ QL_HELP[i].cmd,
+ _(QL_HELP[i].help),
+ buffer.data,
+ url);
+ free(url);
+ termPQExpBuffer(&buffer);
+
+ /* If we have an exact match, exit. Fixes \h SELECT */
+ if (pg_strcasecmp(topic, QL_HELP[i].cmd) == 0)
+ break;
+ }
+ }
+ break;
+ }
+
+ /* If we never found anything, report that */
+ if (!output)
+ {
+ output = PageOutput(2, pager ? &(pset.popt.topt) : NULL);
+ fprintf(output, _("No help available for \"%s\".\n"
+ "Try \\h with no arguments to see available help.\n"),
+ topic);
+ }
+
+ ClosePager(output);
+ }
+}
+
+
+
+void
+print_copyright(void)
+{
+ puts("PostgreSQL Database Management System\n"
+ "(formerly known as Postgres, then as Postgres95)\n\n"
+ "Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group\n\n"
+ "Portions Copyright (c) 1994, The Regents of the University of California\n\n"
+ "Permission to use, copy, modify, and distribute this software and its\n"
+ "documentation for any purpose, without fee, and without a written agreement\n"
+ "is hereby granted, provided that the above copyright notice and this\n"
+ "paragraph and the following two paragraphs appear in all copies.\n\n"
+ "IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n"
+ "DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING\n"
+ "LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS\n"
+ "DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE\n"
+ "POSSIBILITY OF SUCH DAMAGE.\n\n"
+ "THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,\n"
+ "INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n"
+ "AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS\n"
+ "ON AN \"AS IS\" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO\n"
+ "PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\n");
+}
diff --git a/src/bin/psql/help.h b/src/bin/psql/help.h
new file mode 100644
index 0000000..2bd8993
--- /dev/null
+++ b/src/bin/psql/help.h
@@ -0,0 +1,21 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/help.h
+ */
+#ifndef HELP_H
+#define HELP_H
+
+void usage(unsigned short int pager);
+
+void slashUsage(unsigned short int pager);
+
+void helpVariables(unsigned short int pager);
+
+void helpSQL(const char *topic, unsigned short int pager);
+
+void print_copyright(void);
+
+#endif
diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c
new file mode 100644
index 0000000..873d850
--- /dev/null
+++ b/src/bin/psql/input.c
@@ -0,0 +1,551 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/input.c
+ */
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+#include <fcntl.h>
+#include <limits.h>
+
+#include "common.h"
+#include "common/logging.h"
+#include "input.h"
+#include "settings.h"
+#include "tab-complete.h"
+
+#ifndef WIN32
+#define PSQLHISTORY ".psql_history"
+#else
+#define PSQLHISTORY "psql_history"
+#endif
+
+/* Runtime options for turning off readline and history */
+/* (of course there is no runtime command for doing that :) */
+#ifdef USE_READLINE
+static bool useReadline;
+static bool useHistory;
+
+static char *psql_history;
+
+static int history_lines_added;
+
+
+/*
+ * Preserve newlines in saved queries by mapping '\n' to NL_IN_HISTORY
+ *
+ * It is assumed NL_IN_HISTORY will never be entered by the user
+ * nor appear inside a multi-byte string. 0x00 is not properly
+ * handled by the readline routines so it can not be used
+ * for this purpose.
+ */
+#define NL_IN_HISTORY 0x01
+#endif
+
+static void finishInput(void);
+
+
+/*
+ * gets_interactive()
+ *
+ * Gets a line of interactive input, using readline if desired.
+ *
+ * prompt: the prompt string to be used
+ * query_buf: buffer containing lines already read in the current command
+ * (query_buf is not modified here, but may be consulted for tab completion)
+ *
+ * The result is a malloc'd string.
+ *
+ * Caller *must* have set up sigint_interrupt_jmp before calling.
+ */
+char *
+gets_interactive(const char *prompt, PQExpBuffer query_buf)
+{
+#ifdef USE_READLINE
+ if (useReadline)
+ {
+ char *result;
+
+ /*
+ * Some versions of readline don't notice SIGWINCH signals that arrive
+ * when not actively reading input. The simplest fix is to always
+ * re-read the terminal size. This leaves a window for SIGWINCH to be
+ * missed between here and where readline() enables libreadline's
+ * signal handler, but that's probably short enough to be ignored.
+ */
+#ifdef HAVE_RL_RESET_SCREEN_SIZE
+ rl_reset_screen_size();
+#endif
+
+ /* Make current query_buf available to tab completion callback */
+ tab_completion_query_buf = query_buf;
+
+ /* Enable SIGINT to longjmp to sigint_interrupt_jmp */
+ sigint_interrupt_enabled = true;
+
+ /* On some platforms, readline is declared as readline(char *) */
+ result = readline((char *) prompt);
+
+ /* Disable SIGINT again */
+ sigint_interrupt_enabled = false;
+
+ /* Pure neatnik-ism */
+ tab_completion_query_buf = NULL;
+
+ return result;
+ }
+#endif
+
+ fputs(prompt, stdout);
+ fflush(stdout);
+ return gets_fromFile(stdin);
+}
+
+
+/*
+ * Append the line to the history buffer, making sure there is a trailing '\n'
+ */
+void
+pg_append_history(const char *s, PQExpBuffer history_buf)
+{
+#ifdef USE_READLINE
+ if (useHistory && s)
+ {
+ appendPQExpBufferStr(history_buf, s);
+ if (!s[0] || s[strlen(s) - 1] != '\n')
+ appendPQExpBufferChar(history_buf, '\n');
+ }
+#endif
+}
+
+
+/*
+ * Emit accumulated history entry to readline's history mechanism,
+ * then reset the buffer to empty.
+ *
+ * Note: we write nothing if history_buf is empty, so extra calls to this
+ * function don't hurt. There must have been at least one line added by
+ * pg_append_history before we'll do anything.
+ */
+void
+pg_send_history(PQExpBuffer history_buf)
+{
+#ifdef USE_READLINE
+ static char *prev_hist = NULL;
+
+ char *s = history_buf->data;
+ int i;
+
+ /* Trim any trailing \n's (OK to scribble on history_buf) */
+ for (i = strlen(s) - 1; i >= 0 && s[i] == '\n'; i--)
+ ;
+ s[i + 1] = '\0';
+
+ if (useHistory && s[0])
+ {
+ if (((pset.histcontrol & hctl_ignorespace) &&
+ s[0] == ' ') ||
+ ((pset.histcontrol & hctl_ignoredups) &&
+ prev_hist && strcmp(s, prev_hist) == 0))
+ {
+ /* Ignore this line as far as history is concerned */
+ }
+ else
+ {
+ /* Save each previous line for ignoredups processing */
+ free(prev_hist);
+ prev_hist = pg_strdup(s);
+ /* And send it to readline */
+ add_history(s);
+ /* Count lines added to history for use later */
+ history_lines_added++;
+ }
+ }
+
+ resetPQExpBuffer(history_buf);
+#endif
+}
+
+
+/*
+ * gets_fromFile
+ *
+ * Gets a line of noninteractive input from a file (which could be stdin).
+ * The result is a malloc'd string, or NULL on EOF or input error.
+ *
+ * Caller *must* have set up sigint_interrupt_jmp before calling.
+ *
+ * Note: we re-use a static PQExpBuffer for each call. This is to avoid
+ * leaking memory if interrupted by SIGINT.
+ */
+char *
+gets_fromFile(FILE *source)
+{
+ static PQExpBuffer buffer = NULL;
+
+ char line[1024];
+
+ if (buffer == NULL) /* first time through? */
+ buffer = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buffer);
+
+ for (;;)
+ {
+ char *result;
+
+ /* Enable SIGINT to longjmp to sigint_interrupt_jmp */
+ sigint_interrupt_enabled = true;
+
+ /* Get some data */
+ result = fgets(line, sizeof(line), source);
+
+ /* Disable SIGINT again */
+ sigint_interrupt_enabled = false;
+
+ /* EOF or error? */
+ if (result == NULL)
+ {
+ if (ferror(source))
+ {
+ pg_log_error("could not read from input file: %m");
+ return NULL;
+ }
+ break;
+ }
+
+ appendPQExpBufferStr(buffer, line);
+
+ if (PQExpBufferBroken(buffer))
+ {
+ pg_log_error("out of memory");
+ return NULL;
+ }
+
+ /* EOL? */
+ if (buffer->len > 0 && buffer->data[buffer->len - 1] == '\n')
+ {
+ buffer->data[buffer->len - 1] = '\0';
+ return pg_strdup(buffer->data);
+ }
+ }
+
+ if (buffer->len > 0) /* EOF after reading some bufferload(s) */
+ return pg_strdup(buffer->data);
+
+ /* EOF, so return null */
+ return NULL;
+}
+
+
+#ifdef USE_READLINE
+
+/*
+ * Macros to iterate over each element of the history list in order
+ *
+ * You would think this would be simple enough, but in its inimitable fashion
+ * libedit has managed to break it: in libreadline we must use next_history()
+ * to go from oldest to newest, but in libedit we must use previous_history().
+ * To detect what to do, we make a trial call of previous_history(): if it
+ * fails, then either next_history() is what to use, or there's zero or one
+ * history entry so that it doesn't matter which direction we go.
+ *
+ * In case that wasn't disgusting enough: the code below is not as obvious as
+ * it might appear. In some libedit releases history_set_pos(0) fails until
+ * at least one add_history() call has been done. This is not an issue for
+ * printHistory() or encode_history(), which cannot be invoked before that has
+ * happened. In decode_history(), that's not so, and what actually happens is
+ * that we are sitting on the newest entry to start with, previous_history()
+ * fails, and we iterate over all the entries using next_history(). So the
+ * decode_history() loop iterates over the entries in the wrong order when
+ * using such a libedit release, and if there were another attempt to use
+ * BEGIN_ITERATE_HISTORY() before some add_history() call had happened, it
+ * wouldn't work. Fortunately we don't care about either of those things.
+ *
+ * Usage pattern is:
+ *
+ * BEGIN_ITERATE_HISTORY(varname);
+ * {
+ * loop body referencing varname->line;
+ * }
+ * END_ITERATE_HISTORY();
+ */
+#define BEGIN_ITERATE_HISTORY(VARNAME) \
+ do { \
+ HIST_ENTRY *VARNAME; \
+ bool use_prev_; \
+ \
+ history_set_pos(0); \
+ use_prev_ = (previous_history() != NULL); \
+ history_set_pos(0); \
+ for (VARNAME = current_history(); VARNAME != NULL; \
+ VARNAME = use_prev_ ? previous_history() : next_history()) \
+ { \
+ (void) 0
+
+#define END_ITERATE_HISTORY() \
+ } \
+ } while(0)
+
+
+/*
+ * Convert newlines to NL_IN_HISTORY for safe saving in readline history file
+ */
+static void
+encode_history(void)
+{
+ BEGIN_ITERATE_HISTORY(cur_hist);
+ {
+ char *cur_ptr;
+
+ /* some platforms declare HIST_ENTRY.line as const char * */
+ for (cur_ptr = (char *) cur_hist->line; *cur_ptr; cur_ptr++)
+ {
+ if (*cur_ptr == '\n')
+ *cur_ptr = NL_IN_HISTORY;
+ }
+ }
+ END_ITERATE_HISTORY();
+}
+
+/*
+ * Reverse the above encoding
+ */
+static void
+decode_history(void)
+{
+ BEGIN_ITERATE_HISTORY(cur_hist);
+ {
+ char *cur_ptr;
+
+ /* some platforms declare HIST_ENTRY.line as const char * */
+ for (cur_ptr = (char *) cur_hist->line; *cur_ptr; cur_ptr++)
+ {
+ if (*cur_ptr == NL_IN_HISTORY)
+ *cur_ptr = '\n';
+ }
+ }
+ END_ITERATE_HISTORY();
+}
+#endif /* USE_READLINE */
+
+
+/*
+ * Put any startup stuff related to input in here. It's good to maintain
+ * abstraction this way.
+ *
+ * The only "flag" right now is 1 for use readline & history.
+ */
+void
+initializeInput(int flags)
+{
+#ifdef USE_READLINE
+ if (flags & 1)
+ {
+ const char *histfile;
+ char home[MAXPGPATH];
+
+ useReadline = true;
+
+ /* set appropriate values for Readline's global variables */
+ initialize_readline();
+
+#ifdef HAVE_RL_VARIABLE_BIND
+ /* set comment-begin to a useful value for SQL */
+ (void) rl_variable_bind("comment-begin", "-- ");
+#endif
+
+ /* this reads ~/.inputrc, so do it after rl_variable_bind */
+ rl_initialize();
+
+ useHistory = true;
+ using_history();
+ history_lines_added = 0;
+
+ histfile = GetVariable(pset.vars, "HISTFILE");
+
+ if (histfile == NULL)
+ {
+ char *envhist;
+
+ envhist = getenv("PSQL_HISTORY");
+ if (envhist != NULL && strlen(envhist) > 0)
+ histfile = envhist;
+ }
+
+ if (histfile == NULL)
+ {
+ if (get_home_path(home))
+ psql_history = psprintf("%s/%s", home, PSQLHISTORY);
+ }
+ else
+ {
+ psql_history = pg_strdup(histfile);
+ expand_tilde(&psql_history);
+ }
+
+ if (psql_history)
+ {
+ read_history(psql_history);
+ decode_history();
+ }
+ }
+#endif
+
+ atexit(finishInput);
+}
+
+
+/*
+ * This function saves the readline history when psql exits.
+ *
+ * fname: pathname of history file. (Should really be "const char *",
+ * but some ancient versions of readline omit the const-decoration.)
+ *
+ * max_lines: if >= 0, limit history file to that many entries.
+ */
+#ifdef USE_READLINE
+static bool
+saveHistory(char *fname, int max_lines)
+{
+ int errnum;
+
+ /*
+ * Suppressing the write attempt when HISTFILE is set to /dev/null may
+ * look like a negligible optimization, but it's necessary on e.g. macOS,
+ * where write_history will fail because it tries to chmod the target
+ * file.
+ */
+ if (strcmp(fname, DEVNULL) != 0)
+ {
+ /*
+ * Encode \n, since otherwise readline will reload multiline history
+ * entries as separate lines. (libedit doesn't really need this, but
+ * we do it anyway since it's too hard to tell which implementation we
+ * are using.)
+ */
+ encode_history();
+
+ /*
+ * On newer versions of libreadline, truncate the history file as
+ * needed and then append what we've added. This avoids overwriting
+ * history from other concurrent sessions (although there are still
+ * race conditions when two sessions exit at about the same time). If
+ * we don't have those functions, fall back to write_history().
+ */
+#if defined(HAVE_HISTORY_TRUNCATE_FILE) && defined(HAVE_APPEND_HISTORY)
+ {
+ int nlines;
+ int fd;
+
+ /* truncate previous entries if needed */
+ if (max_lines >= 0)
+ {
+ nlines = Max(max_lines - history_lines_added, 0);
+ (void) history_truncate_file(fname, nlines);
+ }
+ /* append_history fails if file doesn't already exist :-( */
+ fd = open(fname, O_CREAT | O_WRONLY | PG_BINARY, 0600);
+ if (fd >= 0)
+ close(fd);
+ /* append the appropriate number of lines */
+ if (max_lines >= 0)
+ nlines = Min(max_lines, history_lines_added);
+ else
+ nlines = history_lines_added;
+ errnum = append_history(nlines, fname);
+ if (errnum == 0)
+ return true;
+ }
+#else /* don't have append support */
+ {
+ /* truncate what we have ... */
+ if (max_lines >= 0)
+ stifle_history(max_lines);
+ /* ... and overwrite file. Tough luck for concurrent sessions. */
+ errnum = write_history(fname);
+ if (errnum == 0)
+ return true;
+ }
+#endif
+
+ pg_log_error("could not save history to file \"%s\": %m", fname);
+ }
+ return false;
+}
+#endif
+
+
+
+/*
+ * Print history to the specified file, or to the console if fname is NULL
+ * (psql \s command)
+ *
+ * We used to use saveHistory() for this purpose, but that doesn't permit
+ * use of a pager; moreover libedit's implementation behaves incompatibly
+ * (preferring to encode its output) and may fail outright when the target
+ * file is specified as /dev/tty.
+ */
+bool
+printHistory(const char *fname, unsigned short int pager)
+{
+#ifdef USE_READLINE
+ FILE *output;
+ bool is_pager;
+
+ if (!useHistory)
+ return false;
+
+ if (fname == NULL)
+ {
+ /* use pager, if enabled, when printing to console */
+ output = PageOutput(INT_MAX, pager ? &(pset.popt.topt) : NULL);
+ is_pager = true;
+ }
+ else
+ {
+ output = fopen(fname, "w");
+ if (output == NULL)
+ {
+ pg_log_error("could not save history to file \"%s\": %m", fname);
+ return false;
+ }
+ is_pager = false;
+ }
+
+ BEGIN_ITERATE_HISTORY(cur_hist);
+ {
+ fprintf(output, "%s\n", cur_hist->line);
+ }
+ END_ITERATE_HISTORY();
+
+ if (is_pager)
+ ClosePager(output);
+ else
+ fclose(output);
+
+ return true;
+#else
+ pg_log_error("history is not supported by this installation");
+ return false;
+#endif
+}
+
+
+static void
+finishInput(void)
+{
+#ifdef USE_READLINE
+ if (useHistory && psql_history)
+ {
+ (void) saveHistory(psql_history, pset.histsize);
+ free(psql_history);
+ psql_history = NULL;
+ }
+#endif
+}
diff --git a/src/bin/psql/input.h b/src/bin/psql/input.h
new file mode 100644
index 0000000..ca948f3
--- /dev/null
+++ b/src/bin/psql/input.h
@@ -0,0 +1,51 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/input.h
+ */
+#ifndef INPUT_H
+#define INPUT_H
+
+/*
+ * If some other file needs to have access to readline/history, include this
+ * file and save yourself all this work.
+ *
+ * USE_READLINE is what to conditionalize readline-dependent code on.
+ */
+#ifdef HAVE_LIBREADLINE
+#define USE_READLINE 1
+
+#if defined(HAVE_READLINE_READLINE_H)
+#include <readline/readline.h>
+#if defined(HAVE_READLINE_HISTORY_H)
+#include <readline/history.h>
+#endif
+#elif defined(HAVE_EDITLINE_READLINE_H)
+#include <editline/readline.h>
+#if defined(HAVE_EDITLINE_HISTORY_H)
+#include <editline/history.h>
+#endif
+#elif defined(HAVE_READLINE_H)
+#include <readline.h>
+#if defined(HAVE_HISTORY_H)
+#include <history.h>
+#endif
+#endif /* HAVE_READLINE_READLINE_H, etc */
+#endif /* HAVE_LIBREADLINE */
+
+#include "pqexpbuffer.h"
+
+
+extern char *gets_interactive(const char *prompt, PQExpBuffer query_buf);
+extern char *gets_fromFile(FILE *source);
+
+extern void initializeInput(int flags);
+
+extern bool printHistory(const char *fname, unsigned short int pager);
+
+extern void pg_append_history(const char *s, PQExpBuffer history_buf);
+extern void pg_send_history(PQExpBuffer history_buf);
+
+#endif /* INPUT_H */
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
new file mode 100644
index 0000000..8bfe914
--- /dev/null
+++ b/src/bin/psql/large_obj.c
@@ -0,0 +1,264 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/large_obj.c
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "large_obj.h"
+#include "settings.h"
+
+static void print_lo_result(const char *fmt,...) pg_attribute_printf(1, 2);
+
+static void
+print_lo_result(const char *fmt,...)
+{
+ va_list ap;
+
+ if (!pset.quiet)
+ {
+ if (pset.popt.topt.format == PRINT_HTML)
+ fputs("<p>", pset.queryFout);
+
+ va_start(ap, fmt);
+ vfprintf(pset.queryFout, fmt, ap);
+ va_end(ap);
+
+ if (pset.popt.topt.format == PRINT_HTML)
+ fputs("</p>\n", pset.queryFout);
+ else
+ fputs("\n", pset.queryFout);
+ }
+
+ if (pset.logfile)
+ {
+ va_start(ap, fmt);
+ vfprintf(pset.logfile, fmt, ap);
+ va_end(ap);
+ fputs("\n", pset.logfile);
+ }
+}
+
+
+/*
+ * Prepare to do a large-object operation. We *must* be inside a transaction
+ * block for all these operations, so start one if needed.
+ *
+ * Returns true if okay, false if failed. *own_transaction is set to indicate
+ * if we started our own transaction or not.
+ */
+static bool
+start_lo_xact(const char *operation, bool *own_transaction)
+{
+ PGTransactionStatusType tstatus;
+ PGresult *res;
+
+ *own_transaction = false;
+
+ if (!pset.db)
+ {
+ pg_log_error("%s: not connected to a database", operation);
+ return false;
+ }
+
+ tstatus = PQtransactionStatus(pset.db);
+
+ switch (tstatus)
+ {
+ case PQTRANS_IDLE:
+ /* need to start our own xact */
+ if (!(res = PSQLexec("BEGIN")))
+ return false;
+ PQclear(res);
+ *own_transaction = true;
+ break;
+ case PQTRANS_INTRANS:
+ /* use the existing xact */
+ break;
+ case PQTRANS_INERROR:
+ pg_log_error("%s: current transaction is aborted", operation);
+ return false;
+ default:
+ pg_log_error("%s: unknown transaction status", operation);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * Clean up after a successful LO operation
+ */
+static bool
+finish_lo_xact(const char *operation, bool own_transaction)
+{
+ PGresult *res;
+
+ if (own_transaction && pset.autocommit)
+ {
+ /* close out our own xact */
+ if (!(res = PSQLexec("COMMIT")))
+ {
+ res = PSQLexec("ROLLBACK");
+ PQclear(res);
+ return false;
+ }
+ PQclear(res);
+ }
+
+ return true;
+}
+
+/*
+ * Clean up after a failed LO operation
+ */
+static bool
+fail_lo_xact(const char *operation, bool own_transaction)
+{
+ PGresult *res;
+
+ if (own_transaction && pset.autocommit)
+ {
+ /* close out our own xact */
+ res = PSQLexec("ROLLBACK");
+ PQclear(res);
+ }
+
+ return false; /* always */
+}
+
+
+/*
+ * do_lo_export()
+ *
+ * Write a large object to a file
+ */
+bool
+do_lo_export(const char *loid_arg, const char *filename_arg)
+{
+ int status;
+ bool own_transaction;
+
+ if (!start_lo_xact("\\lo_export", &own_transaction))
+ return false;
+
+ SetCancelConn(NULL);
+ status = lo_export(pset.db, atooid(loid_arg), filename_arg);
+ ResetCancelConn();
+
+ /* of course this status is documented nowhere :( */
+ if (status != 1)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ return fail_lo_xact("\\lo_export", own_transaction);
+ }
+
+ if (!finish_lo_xact("\\lo_export", own_transaction))
+ return false;
+
+ print_lo_result("lo_export");
+
+ return true;
+}
+
+
+/*
+ * do_lo_import()
+ *
+ * Copy large object from file to database
+ */
+bool
+do_lo_import(const char *filename_arg, const char *comment_arg)
+{
+ PGresult *res;
+ Oid loid;
+ char oidbuf[32];
+ bool own_transaction;
+
+ if (!start_lo_xact("\\lo_import", &own_transaction))
+ return false;
+
+ SetCancelConn(NULL);
+ loid = lo_import(pset.db, filename_arg);
+ ResetCancelConn();
+
+ if (loid == InvalidOid)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ return fail_lo_xact("\\lo_import", own_transaction);
+ }
+
+ /* insert description if given */
+ if (comment_arg)
+ {
+ char *cmdbuf;
+ char *bufptr;
+ size_t slen = strlen(comment_arg);
+
+ cmdbuf = pg_malloc_extended(slen * 2 + 256, MCXT_ALLOC_NO_OOM);
+ if (!cmdbuf)
+ return fail_lo_xact("\\lo_import", own_transaction);
+ sprintf(cmdbuf, "COMMENT ON LARGE OBJECT %u IS '", loid);
+ bufptr = cmdbuf + strlen(cmdbuf);
+ bufptr += PQescapeStringConn(pset.db, bufptr, comment_arg, slen, NULL);
+ strcpy(bufptr, "'");
+
+ if (!(res = PSQLexec(cmdbuf)))
+ {
+ free(cmdbuf);
+ return fail_lo_xact("\\lo_import", own_transaction);
+ }
+
+ PQclear(res);
+ free(cmdbuf);
+ }
+
+ if (!finish_lo_xact("\\lo_import", own_transaction))
+ return false;
+
+ print_lo_result("lo_import %u", loid);
+
+ sprintf(oidbuf, "%u", loid);
+ SetVariable(pset.vars, "LASTOID", oidbuf);
+
+ return true;
+}
+
+
+/*
+ * do_lo_unlink()
+ *
+ * removes a large object out of the database
+ */
+bool
+do_lo_unlink(const char *loid_arg)
+{
+ int status;
+ Oid loid = atooid(loid_arg);
+ bool own_transaction;
+
+ if (!start_lo_xact("\\lo_unlink", &own_transaction))
+ return false;
+
+ SetCancelConn(NULL);
+ status = lo_unlink(pset.db, loid);
+ ResetCancelConn();
+
+ if (status == -1)
+ {
+ pg_log_info("%s", PQerrorMessage(pset.db));
+ return fail_lo_xact("\\lo_unlink", own_transaction);
+ }
+
+ if (!finish_lo_xact("\\lo_unlink", own_transaction))
+ return false;
+
+ print_lo_result("lo_unlink %u", loid);
+
+ return true;
+}
diff --git a/src/bin/psql/large_obj.h b/src/bin/psql/large_obj.h
new file mode 100644
index 0000000..02a16c1
--- /dev/null
+++ b/src/bin/psql/large_obj.h
@@ -0,0 +1,15 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/large_obj.h
+ */
+#ifndef LARGE_OBJ_H
+#define LARGE_OBJ_H
+
+bool do_lo_export(const char *loid_arg, const char *filename_arg);
+bool do_lo_import(const char *filename_arg, const char *comment_arg);
+bool do_lo_unlink(const char *loid_arg);
+
+#endif /* LARGE_OBJ_H */
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
new file mode 100644
index 0000000..692c6db
--- /dev/null
+++ b/src/bin/psql/mainloop.c
@@ -0,0 +1,662 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/mainloop.c
+ */
+#include "postgres_fe.h"
+
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "input.h"
+#include "mainloop.h"
+#include "mb/pg_wchar.h"
+#include "prompt.h"
+#include "settings.h"
+
+/* callback functions for our flex lexer */
+const PsqlScanCallbacks psqlscan_callbacks = {
+ psql_get_variable,
+};
+
+
+/*
+ * Main processing loop for reading lines of input
+ * and sending them to the backend.
+ *
+ * This loop is re-entrant. May be called by \i command
+ * which reads input from a file.
+ */
+int
+MainLoop(FILE *source)
+{
+ PsqlScanState scan_state; /* lexer working state */
+ ConditionalStack cond_stack; /* \if status stack */
+ volatile PQExpBuffer query_buf; /* buffer for query being accumulated */
+ volatile PQExpBuffer previous_buf; /* if there isn't anything in the new
+ * buffer yet, use this one for \e,
+ * etc. */
+ PQExpBuffer history_buf; /* earlier lines of a multi-line command, not
+ * yet saved to readline history */
+ char *line; /* current line of input */
+ int added_nl_pos;
+ bool success;
+ bool line_saved_in_history;
+ volatile int successResult = EXIT_SUCCESS;
+ volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN;
+ volatile promptStatus_t prompt_status = PROMPT_READY;
+ volatile bool need_redisplay = false;
+ volatile int count_eof = 0;
+ volatile bool die_on_error = false;
+ FILE *prev_cmd_source;
+ bool prev_cmd_interactive;
+ uint64 prev_lineno;
+
+ /* Save the prior command source */
+ prev_cmd_source = pset.cur_cmd_source;
+ prev_cmd_interactive = pset.cur_cmd_interactive;
+ prev_lineno = pset.lineno;
+ /* pset.stmt_lineno does not need to be saved and restored */
+
+ /* Establish new source */
+ pset.cur_cmd_source = source;
+ pset.cur_cmd_interactive = ((source == stdin) && !pset.notty);
+ pset.lineno = 0;
+ pset.stmt_lineno = 1;
+
+ /* Create working state */
+ scan_state = psql_scan_create(&psqlscan_callbacks);
+ cond_stack = conditional_stack_create();
+ psql_scan_set_passthrough(scan_state, (void *) cond_stack);
+
+ query_buf = createPQExpBuffer();
+ previous_buf = createPQExpBuffer();
+ history_buf = createPQExpBuffer();
+ if (PQExpBufferBroken(query_buf) ||
+ PQExpBufferBroken(previous_buf) ||
+ PQExpBufferBroken(history_buf))
+ pg_fatal("out of memory");
+
+ /* main loop to get queries and execute them */
+ while (successResult == EXIT_SUCCESS)
+ {
+ /*
+ * Clean up after a previous Control-C
+ */
+ if (cancel_pressed)
+ {
+ if (!pset.cur_cmd_interactive)
+ {
+ /*
+ * You get here if you stopped a script with Ctrl-C.
+ */
+ successResult = EXIT_USER;
+ break;
+ }
+
+ cancel_pressed = false;
+ }
+
+ /*
+ * Establish longjmp destination for exiting from wait-for-input. We
+ * must re-do this each time through the loop for safety, since the
+ * jmpbuf might get changed during command execution.
+ */
+ if (sigsetjmp(sigint_interrupt_jmp, 1) != 0)
+ {
+ /* got here with longjmp */
+
+ /* reset parsing state */
+ psql_scan_finish(scan_state);
+ psql_scan_reset(scan_state);
+ resetPQExpBuffer(query_buf);
+ resetPQExpBuffer(history_buf);
+ count_eof = 0;
+ slashCmdStatus = PSQL_CMD_UNKNOWN;
+ prompt_status = PROMPT_READY;
+ need_redisplay = false;
+ pset.stmt_lineno = 1;
+ cancel_pressed = false;
+
+ if (pset.cur_cmd_interactive)
+ {
+ putc('\n', stdout);
+
+ /*
+ * if interactive user is in an \if block, then Ctrl-C will
+ * exit from the innermost \if.
+ */
+ if (!conditional_stack_empty(cond_stack))
+ {
+ pg_log_error("\\if: escaped");
+ conditional_stack_pop(cond_stack);
+ }
+ }
+ else
+ {
+ successResult = EXIT_USER;
+ break;
+ }
+ }
+
+ fflush(stdout);
+
+ /*
+ * get another line
+ */
+ if (pset.cur_cmd_interactive)
+ {
+ /* May need to reset prompt, eg after \r command */
+ if (query_buf->len == 0)
+ prompt_status = PROMPT_READY;
+ /* If query buffer came from \e, redisplay it with a prompt */
+ if (need_redisplay)
+ {
+ if (query_buf->len > 0)
+ {
+ fputs(get_prompt(PROMPT_READY, cond_stack), stdout);
+ fputs(query_buf->data, stdout);
+ fflush(stdout);
+ }
+ need_redisplay = false;
+ }
+ /* Now we can fetch a line */
+ line = gets_interactive(get_prompt(prompt_status, cond_stack),
+ query_buf);
+ }
+ else
+ {
+ line = gets_fromFile(source);
+ if (!line && ferror(source))
+ successResult = EXIT_FAILURE;
+ }
+
+ /*
+ * query_buf holds query already accumulated. line is the malloc'd
+ * new line of input (note it must be freed before looping around!)
+ */
+
+ /* No more input. Time to quit, or \i done */
+ if (line == NULL)
+ {
+ if (pset.cur_cmd_interactive)
+ {
+ /* This tries to mimic bash's IGNOREEOF feature. */
+ count_eof++;
+
+ if (count_eof < pset.ignoreeof)
+ {
+ if (!pset.quiet)
+ printf(_("Use \"\\q\" to leave %s.\n"), pset.progname);
+ continue;
+ }
+
+ puts(pset.quiet ? "" : "\\q");
+ }
+ break;
+ }
+
+ count_eof = 0;
+
+ pset.lineno++;
+
+ /* ignore UTF-8 Unicode byte-order mark */
+ if (pset.lineno == 1 && pset.encoding == PG_UTF8 && strncmp(line, "\xef\xbb\xbf", 3) == 0)
+ memmove(line, line + 3, strlen(line + 3) + 1);
+
+ /* Detect attempts to run custom-format dumps as SQL scripts */
+ if (pset.lineno == 1 && !pset.cur_cmd_interactive &&
+ strncmp(line, "PGDMP", 5) == 0)
+ {
+ free(line);
+ puts(_("The input is a PostgreSQL custom-format dump.\n"
+ "Use the pg_restore command-line client to restore this dump to a database.\n"));
+ fflush(stdout);
+ successResult = EXIT_FAILURE;
+ break;
+ }
+
+ /* no further processing of empty lines, unless within a literal */
+ if (line[0] == '\0' && !psql_scan_in_quote(scan_state))
+ {
+ free(line);
+ continue;
+ }
+
+ /* Recognize "help", "quit", "exit" only in interactive mode */
+ if (pset.cur_cmd_interactive)
+ {
+ char *first_word = line;
+ char *rest_of_line = NULL;
+ bool found_help = false;
+ bool found_exit_or_quit = false;
+ bool found_q = false;
+
+ /*
+ * The assistance words, help/exit/quit, must have no whitespace
+ * before them, and only whitespace after, with an optional
+ * semicolon. This prevents indented use of these words, perhaps
+ * as identifiers, from invoking the assistance behavior.
+ */
+ if (pg_strncasecmp(first_word, "help", 4) == 0)
+ {
+ rest_of_line = first_word + 4;
+ found_help = true;
+ }
+ else if (pg_strncasecmp(first_word, "exit", 4) == 0 ||
+ pg_strncasecmp(first_word, "quit", 4) == 0)
+ {
+ rest_of_line = first_word + 4;
+ found_exit_or_quit = true;
+ }
+ else if (strncmp(first_word, "\\q", 2) == 0)
+ {
+ rest_of_line = first_word + 2;
+ found_q = true;
+ }
+
+ /*
+ * If we found a command word, check whether the rest of the line
+ * contains only whitespace plus maybe one semicolon. If not,
+ * ignore the command word after all. These commands are only for
+ * compatibility with other SQL clients and are not documented.
+ */
+ if (rest_of_line != NULL)
+ {
+ /*
+ * Ignore unless rest of line is whitespace, plus maybe one
+ * semicolon
+ */
+ while (isspace((unsigned char) *rest_of_line))
+ ++rest_of_line;
+ if (*rest_of_line == ';')
+ ++rest_of_line;
+ while (isspace((unsigned char) *rest_of_line))
+ ++rest_of_line;
+ if (*rest_of_line != '\0')
+ {
+ found_help = false;
+ found_exit_or_quit = false;
+ }
+ }
+
+ /*
+ * "help" is only a command when the query buffer is empty, but we
+ * emit a one-line message even when it isn't to help confused
+ * users. The text is still added to the query buffer in that
+ * case.
+ */
+ if (found_help)
+ {
+ if (query_buf->len != 0)
+#ifndef WIN32
+ puts(_("Use \\? for help or press control-C to clear the input buffer."));
+#else
+ puts(_("Use \\? for help."));
+#endif
+ else
+ {
+ puts(_("You are using psql, the command-line interface to PostgreSQL."));
+ printf(_("Type: \\copyright for distribution terms\n"
+ " \\h for help with SQL commands\n"
+ " \\? for help with psql commands\n"
+ " \\g or terminate with semicolon to execute query\n"
+ " \\q to quit\n"));
+ free(line);
+ fflush(stdout);
+ continue;
+ }
+ }
+
+ /*
+ * "quit" and "exit" are only commands when the query buffer is
+ * empty, but we emit a one-line message even when it isn't to
+ * help confused users. The text is still added to the query
+ * buffer in that case.
+ */
+ if (found_exit_or_quit)
+ {
+ if (query_buf->len != 0)
+ {
+ if (prompt_status == PROMPT_READY ||
+ prompt_status == PROMPT_CONTINUE ||
+ prompt_status == PROMPT_PAREN)
+ puts(_("Use \\q to quit."));
+ else
+#ifndef WIN32
+ puts(_("Use control-D to quit."));
+#else
+ puts(_("Use control-C to quit."));
+#endif
+ }
+ else
+ {
+ /* exit app */
+ free(line);
+ fflush(stdout);
+ successResult = EXIT_SUCCESS;
+ break;
+ }
+ }
+
+ /*
+ * If they typed "\q" in a place where "\q" is not active, supply
+ * a hint. The text is still added to the query buffer.
+ */
+ if (found_q && query_buf->len != 0 &&
+ prompt_status != PROMPT_READY &&
+ prompt_status != PROMPT_CONTINUE &&
+ prompt_status != PROMPT_PAREN)
+#ifndef WIN32
+ puts(_("Use control-D to quit."));
+#else
+ puts(_("Use control-C to quit."));
+#endif
+ }
+
+ /* echo back if flag is set, unless interactive */
+ if (pset.echo == PSQL_ECHO_ALL && !pset.cur_cmd_interactive)
+ {
+ puts(line);
+ fflush(stdout);
+ }
+
+ /* insert newlines into query buffer between source lines */
+ if (query_buf->len > 0)
+ {
+ appendPQExpBufferChar(query_buf, '\n');
+ added_nl_pos = query_buf->len;
+ }
+ else
+ added_nl_pos = -1; /* flag we didn't add one */
+
+ /* Setting this will not have effect until next line. */
+ die_on_error = pset.on_error_stop;
+
+ /*
+ * Parse line, looking for command separators.
+ */
+ psql_scan_setup(scan_state, line, strlen(line),
+ pset.encoding, standard_strings());
+ success = true;
+ line_saved_in_history = false;
+
+ while (success || !die_on_error)
+ {
+ PsqlScanResult scan_result;
+ promptStatus_t prompt_tmp = prompt_status;
+ size_t pos_in_query;
+ char *tmp_line;
+
+ pos_in_query = query_buf->len;
+ scan_result = psql_scan(scan_state, query_buf, &prompt_tmp);
+ prompt_status = prompt_tmp;
+
+ if (PQExpBufferBroken(query_buf))
+ pg_fatal("out of memory");
+
+ /*
+ * Increase statement line number counter for each linebreak added
+ * to the query buffer by the last psql_scan() call. There only
+ * will be ones to add when navigating to a statement in
+ * readline's history containing newlines.
+ */
+ tmp_line = query_buf->data + pos_in_query;
+ while (*tmp_line != '\0')
+ {
+ if (*(tmp_line++) == '\n')
+ pset.stmt_lineno++;
+ }
+
+ if (scan_result == PSCAN_EOL)
+ pset.stmt_lineno++;
+
+ /*
+ * Send command if semicolon found, or if end of line and we're in
+ * single-line mode.
+ */
+ if (scan_result == PSCAN_SEMICOLON ||
+ (scan_result == PSCAN_EOL && pset.singleline))
+ {
+ /*
+ * Save line in history. We use history_buf to accumulate
+ * multi-line queries into a single history entry. Note that
+ * history accumulation works on input lines, so it doesn't
+ * matter whether the query will be ignored due to \if.
+ */
+ if (pset.cur_cmd_interactive && !line_saved_in_history)
+ {
+ pg_append_history(line, history_buf);
+ pg_send_history(history_buf);
+ line_saved_in_history = true;
+ }
+
+ /* execute query unless we're in an inactive \if branch */
+ if (conditional_active(cond_stack))
+ {
+ success = SendQuery(query_buf->data);
+ slashCmdStatus = success ? PSQL_CMD_SEND : PSQL_CMD_ERROR;
+ pset.stmt_lineno = 1;
+
+ /* transfer query to previous_buf by pointer-swapping */
+ {
+ PQExpBuffer swap_buf = previous_buf;
+
+ previous_buf = query_buf;
+ query_buf = swap_buf;
+ }
+ resetPQExpBuffer(query_buf);
+
+ added_nl_pos = -1;
+ /* we need not do psql_scan_reset() here */
+ }
+ else
+ {
+ /* if interactive, warn about non-executed query */
+ if (pset.cur_cmd_interactive)
+ pg_log_error("query ignored; use \\endif or Ctrl-C to exit current \\if block");
+ /* fake an OK result for purposes of loop checks */
+ success = true;
+ slashCmdStatus = PSQL_CMD_SEND;
+ pset.stmt_lineno = 1;
+ /* note that query_buf doesn't change state */
+ }
+ }
+ else if (scan_result == PSCAN_BACKSLASH)
+ {
+ /* handle backslash command */
+
+ /*
+ * If we added a newline to query_buf, and nothing else has
+ * been inserted in query_buf by the lexer, then strip off the
+ * newline again. This avoids any change to query_buf when a
+ * line contains only a backslash command. Also, in this
+ * situation we force out any previous lines as a separate
+ * history entry; we don't want SQL and backslash commands
+ * intermixed in history if at all possible.
+ */
+ if (query_buf->len == added_nl_pos)
+ {
+ query_buf->data[--query_buf->len] = '\0';
+ pg_send_history(history_buf);
+ }
+ added_nl_pos = -1;
+
+ /* save backslash command in history */
+ if (pset.cur_cmd_interactive && !line_saved_in_history)
+ {
+ pg_append_history(line, history_buf);
+ pg_send_history(history_buf);
+ line_saved_in_history = true;
+ }
+
+ /* execute backslash command */
+ slashCmdStatus = HandleSlashCmds(scan_state,
+ cond_stack,
+ query_buf,
+ previous_buf);
+
+ success = slashCmdStatus != PSQL_CMD_ERROR;
+
+ /*
+ * Resetting stmt_lineno after a backslash command isn't
+ * always appropriate, but it's what we've done historically
+ * and there have been few complaints.
+ */
+ pset.stmt_lineno = 1;
+
+ if (slashCmdStatus == PSQL_CMD_SEND)
+ {
+ /* should not see this in inactive branch */
+ Assert(conditional_active(cond_stack));
+
+ success = SendQuery(query_buf->data);
+
+ /* transfer query to previous_buf by pointer-swapping */
+ {
+ PQExpBuffer swap_buf = previous_buf;
+
+ previous_buf = query_buf;
+ query_buf = swap_buf;
+ }
+ resetPQExpBuffer(query_buf);
+
+ /* flush any paren nesting info after forced send */
+ psql_scan_reset(scan_state);
+ }
+ else if (slashCmdStatus == PSQL_CMD_NEWEDIT)
+ {
+ /* should not see this in inactive branch */
+ Assert(conditional_active(cond_stack));
+ /* ensure what came back from editing ends in a newline */
+ if (query_buf->len > 0 &&
+ query_buf->data[query_buf->len - 1] != '\n')
+ appendPQExpBufferChar(query_buf, '\n');
+ /* rescan query_buf as new input */
+ psql_scan_finish(scan_state);
+ free(line);
+ line = pg_strdup(query_buf->data);
+ resetPQExpBuffer(query_buf);
+ /* reset parsing state since we are rescanning whole line */
+ psql_scan_reset(scan_state);
+ psql_scan_setup(scan_state, line, strlen(line),
+ pset.encoding, standard_strings());
+ line_saved_in_history = false;
+ prompt_status = PROMPT_READY;
+ /* we'll want to redisplay after parsing what we have */
+ need_redisplay = true;
+ }
+ else if (slashCmdStatus == PSQL_CMD_TERMINATE)
+ break;
+ }
+
+ /* fall out of loop if lexer reached EOL */
+ if (scan_result == PSCAN_INCOMPLETE ||
+ scan_result == PSCAN_EOL)
+ break;
+ }
+
+ /*
+ * Add line to pending history if we didn't do so already. Then, if
+ * the query buffer is still empty, flush out any unsent history
+ * entry. This means that empty lines (containing only whitespace and
+ * perhaps a dash-dash comment) that precede a query will be recorded
+ * as separate history entries, not as part of that query.
+ */
+ if (pset.cur_cmd_interactive)
+ {
+ if (!line_saved_in_history)
+ pg_append_history(line, history_buf);
+ if (query_buf->len == 0)
+ pg_send_history(history_buf);
+ }
+
+ psql_scan_finish(scan_state);
+ free(line);
+
+ if (slashCmdStatus == PSQL_CMD_TERMINATE)
+ {
+ successResult = EXIT_SUCCESS;
+ break;
+ }
+
+ if (!pset.cur_cmd_interactive)
+ {
+ if (!success && die_on_error)
+ successResult = EXIT_USER;
+ /* Have we lost the db connection? */
+ else if (!pset.db)
+ successResult = EXIT_BADCONN;
+ }
+ } /* while !endoffile/session */
+
+ /*
+ * If we have a non-semicolon-terminated query at the end of file, we
+ * process it unless the input source is interactive --- in that case it
+ * seems better to go ahead and quit. Also skip if this is an error exit.
+ */
+ if (query_buf->len > 0 && !pset.cur_cmd_interactive &&
+ successResult == EXIT_SUCCESS)
+ {
+ /* save query in history */
+ /* currently unneeded since we don't use this block if interactive */
+#ifdef NOT_USED
+ if (pset.cur_cmd_interactive)
+ pg_send_history(history_buf);
+#endif
+
+ /* execute query unless we're in an inactive \if branch */
+ if (conditional_active(cond_stack))
+ {
+ success = SendQuery(query_buf->data);
+ }
+ else
+ {
+ if (pset.cur_cmd_interactive)
+ pg_log_error("query ignored; use \\endif or Ctrl-C to exit current \\if block");
+ success = true;
+ }
+
+ if (!success && die_on_error)
+ successResult = EXIT_USER;
+ else if (pset.db == NULL)
+ successResult = EXIT_BADCONN;
+ }
+
+ /*
+ * Check for unbalanced \if-\endifs unless user explicitly quit, or the
+ * script is erroring out
+ */
+ if (slashCmdStatus != PSQL_CMD_TERMINATE &&
+ successResult != EXIT_USER &&
+ !conditional_stack_empty(cond_stack))
+ {
+ pg_log_error("reached EOF without finding closing \\endif(s)");
+ if (die_on_error && !pset.cur_cmd_interactive)
+ successResult = EXIT_USER;
+ }
+
+ /*
+ * Let's just make real sure the SIGINT handler won't try to use
+ * sigint_interrupt_jmp after we exit this routine. If there is an outer
+ * MainLoop instance, it will reset sigint_interrupt_jmp to point to
+ * itself at the top of its loop, before any further interactive input
+ * happens.
+ */
+ sigint_interrupt_enabled = false;
+
+ destroyPQExpBuffer(query_buf);
+ destroyPQExpBuffer(previous_buf);
+ destroyPQExpBuffer(history_buf);
+
+ psql_scan_destroy(scan_state);
+ conditional_stack_destroy(cond_stack);
+
+ pset.cur_cmd_source = prev_cmd_source;
+ pset.cur_cmd_interactive = prev_cmd_interactive;
+ pset.lineno = prev_lineno;
+
+ return successResult;
+} /* MainLoop() */
diff --git a/src/bin/psql/mainloop.h b/src/bin/psql/mainloop.h
new file mode 100644
index 0000000..5232a7e
--- /dev/null
+++ b/src/bin/psql/mainloop.h
@@ -0,0 +1,17 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/mainloop.h
+ */
+#ifndef MAINLOOP_H
+#define MAINLOOP_H
+
+#include "fe_utils/psqlscan.h"
+
+extern const PsqlScanCallbacks psqlscan_callbacks;
+
+extern int MainLoop(FILE *source);
+
+#endif /* MAINLOOP_H */
diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build
new file mode 100644
index 0000000..a0a4ac7
--- /dev/null
+++ b/src/bin/psql/meson.build
@@ -0,0 +1,74 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+psql_sources = files(
+ 'command.c',
+ 'common.c',
+ 'copy.c',
+ 'crosstabview.c',
+ 'describe.c',
+ 'help.c',
+ 'input.c',
+ 'large_obj.c',
+ 'mainloop.c',
+ 'prompt.c',
+ 'startup.c',
+ 'stringutils.c',
+ 'tab-complete.c',
+ 'variables.c',
+)
+
+psqlscanslash = custom_target('psqlscanslash',
+ input: 'psqlscanslash.l',
+ output: 'psqlscanslash.c',
+ command: [flex_cmd, '--no-backup', '--fix-warnings', '--', '-Cfe', '-p', '-p'])
+generated_sources += psqlscanslash
+psql_sources += psqlscanslash
+
+sql_help = custom_target('psql_help',
+ output: ['sql_help.c', 'sql_help.h'],
+ depfile: 'sql_help.dep',
+ command: [
+ perl, files('create_help.pl'),
+ '--docdir', '@SOURCE_ROOT@/doc/src/sgml/ref',
+ '--depfile', '@DEPFILE@',
+ '--outdir', '@OUTDIR@',
+ '--basename', 'sql_help',
+ ],
+)
+generated_sources += sql_help.to_list()
+psql_sources += sql_help
+
+if host_system == 'windows'
+ psql_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'psql',
+ '--FILEDESC', 'psql - the PostgreSQL interactive terminal',])
+endif
+
+psql = executable('psql',
+ psql_sources,
+ c_pch: pch_postgres_fe_h,
+ include_directories: include_directories('.'),
+ dependencies: [frontend_code, libpq, readline],
+ kwargs: default_bin_args,
+)
+bin_targets += psql
+
+install_data('psqlrc.sample',
+ install_dir: dir_data,
+)
+
+tests += {
+ 'name': 'psql',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'with_readline': readline.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_basic.pl',
+ 't/010_tab_completion.pl',
+ 't/020_cancel.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/psql/nls.mk b/src/bin/psql/nls.mk
new file mode 100644
index 0000000..cf0b800
--- /dev/null
+++ b/src/bin/psql/nls.mk
@@ -0,0 +1,30 @@
+# src/bin/psql/nls.mk
+CATALOG_NAME = psql
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ command.c \
+ common.c \
+ copy.c \
+ crosstabview.c \
+ help.c \
+ input.c \
+ large_obj.c \
+ mainloop.c \
+ psqlscanslash.c \
+ startup.c \
+ describe.c \
+ sql_help.h \
+ sql_help.c \
+ tab-complete.c \
+ variables.c \
+ ../../fe_utils/cancel.c \
+ ../../fe_utils/print.c \
+ ../../fe_utils/psqlscan.c \
+ ../../common/exec.c \
+ ../../common/fe_memutils.c \
+ ../../common/username.c \
+ ../../common/wait_error.c \
+ ../../port/thread.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
+ HELP0 HELPN N_ simple_prompt simple_prompt_extended
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
+ HELPN:1:c-format
diff --git a/src/bin/psql/po/LINGUAS b/src/bin/psql/po/LINGUAS
new file mode 100644
index 0000000..00f815d
--- /dev/null
+++ b/src/bin/psql/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/psql/po/cs.po b/src/bin/psql/po/cs.po
new file mode 100644
index 0000000..e50d301
--- /dev/null
+++ b/src/bin/psql/po/cs.po
@@ -0,0 +1,6600 @@
+# Czech translation of psql
+#
+# pgtranslation Id: psql.po,v 1.6 2011/09/08 18:23:06 petere Exp $
+# Karel Žák, 2001-2003, 2004.
+# Zdeněk Kotala, 2009, 2011, 2012, 2013.
+# Tomáš Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: psql-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:14+0000\n"
+"PO-Revision-Date: 2023-09-05 09:51+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "nelze získat aktuální adresář: %m"
+
+#: ../../common/exec.c:156
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "neplatný binární soubor\"%s\""
+
+#: ../../common/exec.c:206
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nelze Äíst binární soubor \"%s\""
+
+#: ../../common/exec.c:214
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nelze najít příkaz \"%s\" ke spuštění"
+
+#: ../../common/exec.c:270 ../../common/exec.c:309
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "nelze změnit adresář na \"%s\" : %m"
+
+#: ../../common/exec.c:287
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "nelze pÅ™eÄíst symbolický odkaz \"%s\": %m"
+
+#: ../../common/exec.c:410
+#, c-format
+msgid "pclose failed: %m"
+msgstr "volání pclose selhalo: %m"
+
+#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676
+#: command.c:1255 command.c:3146 command.c:3195 command.c:3307 input.c:227
+#: mainloop.c:81 mainloop.c:402
+#, c-format
+msgid "out of memory"
+msgstr "nedostatek paměti"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat null pointer (interní chyba)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nelze naÄíst efektivní user ID \"%ld\": %s"
+
+#: ../../common/username.c:45 command.c:559
+msgid "user does not exist"
+msgstr "uživatel neexistuje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "vyhledávání uživatele selhalo: chybový kód %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "příkaz není spustitelný"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "příkaz nenalezen"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "potomek skonÄil s návratovým kódem %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "potomek byl ukonÄen výjimkou 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "potomek byl ukonÄen signálem %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "potomek skonÄil s nerozponaným stavem %d"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "Požadavek na zrušení byl poslán\n"
+
+#: ../../fe_utils/cancel.c:165
+msgid "Could not send cancel request: "
+msgstr "Nelze poslat požadavek na zrušení: "
+
+#: ../../fe_utils/cancel.c:210
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "Nelze poslat požadavek na zrušení: %s"
+
+#: ../../fe_utils/print.c:350
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu řádka)"
+msgstr[1] "(%lu řádky)"
+msgstr[2] "(%lu řádek)"
+
+#: ../../fe_utils/print.c:3055
+#, c-format
+msgid "Interrupted\n"
+msgstr "Přerušeno\n"
+
+#: ../../fe_utils/print.c:3119
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Nelze pÅ™idat hlaviÄku k obsahu tabulky: pÅ™ekroÄen poÄet sloupců %d.\n"
+
+#: ../../fe_utils/print.c:3159
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Nelze pÅ™idat buňku do obsahu tabulky: pÅ™ekroÄen celkový poÄet bunÄ›k %d.\n"
+
+#: ../../fe_utils/print.c:3414
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "specifikován neplatný formát výstupu (interní chyba): %d"
+
+#: ../../fe_utils/psqlscan.l:694
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "přeskakuji rekursivní expanzi proměnné \"%s\""
+
+#: command.c:224
+#, c-format
+msgid "invalid command \\%s"
+msgstr "neplatný příkaz \\%s"
+
+#: command.c:226
+#, c-format
+msgid "Try \\? for help."
+msgstr "Zkuste \\? pro zobrazení nápovědy."
+
+#: command.c:244
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: nadbyteÄný argument \"%s\" ignorován"
+
+#: command.c:296
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s příkaz ignorován; použijte \\endif nebo Ctrl-C pro ukonÄení aktuálního \\if bloku"
+
+#: command.c:557
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "nelze získat domácí adresář pro uživatele ID %ld: %s"
+
+#: command.c:575
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: nelze změnit adresář na \"%s\": %m"
+
+#: command.c:600
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Aktuálně nejste připojeni k databázi.\n"
+
+#: command.c:613
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na adrese \"%s\" na portu\"%s\".\n"
+
+#: command.c:616
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Jste připojeni k databázi \"%s\" jako uživatel \"%s\" přes socket v \"%s\" naportu \"%s\".\n"
+
+#: command.c:622
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" (adresa \"%s\") na portu\"%s\".\n"
+
+#: command.c:625
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" na portu\"%s\".\n"
+
+#: command.c:965 command.c:1061 command.c:2550
+#, c-format
+msgid "no query buffer"
+msgstr "v historii není žádný dotaz"
+
+#: command.c:998 command.c:5139
+#, c-format
+msgid "invalid line number: %s"
+msgstr "neplatné Äíslo řádky: %s"
+
+#: command.c:1052
+#, c-format
+msgid "The server (version %s) does not support editing function source."
+msgstr "Server (verze %s) nepodporuje editaci zdrojového kódu funkce."
+
+#: command.c:1055
+#, c-format
+msgid "The server (version %s) does not support editing view definitions."
+msgstr "Server (verze %s) nepodporuje editaci definice pohledu."
+
+#: command.c:1137
+msgid "No changes"
+msgstr "Žádné změny"
+
+#: command.c:1216
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: neplatné jméno kódování nebo nenalezena konverzní funkce"
+
+#: command.c:1251 command.c:1992 command.c:3142 command.c:3329 command.c:5241
+#: common.c:174 common.c:223 common.c:388 common.c:1237 common.c:1265
+#: common.c:1373 common.c:1480 common.c:1518 copy.c:488 copy.c:707 help.c:62
+#: large_obj.c:157 large_obj.c:192 large_obj.c:254
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1258
+msgid "There is no previous error."
+msgstr "Žádná předchozí chyba."
+
+#: command.c:1371
+#, c-format
+#| msgid "Missing left parenthesis."
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: chybějící pravá závorka"
+
+#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044
+#: command.c:2281 command.c:2517 command.c:2557
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: chybí požadovaný argument"
+
+#: command.c:1679
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: nemůže být zadáno po \\else"
+
+#: command.c:1684
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: žádné odpovídající \\if"
+
+#: command.c:1748
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: nemůže být zadáno po \\else"
+
+#: command.c:1753
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: žádné odpovídající \\if"
+
+#: command.c:1793
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: žádné odpovídající \\if"
+
+#: command.c:1948
+msgid "Query buffer is empty."
+msgstr "Buffer dotazů je prázdný."
+
+#: command.c:1970
+msgid "Enter new password: "
+msgstr "Zadejte nové heslo: "
+
+#: command.c:1971
+msgid "Enter it again: "
+msgstr "Zadejte znova: "
+
+#: command.c:1975
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Hesla se neshodují."
+
+#: command.c:2074
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: nelze naÄíst hodnotu promÄ›nné"
+
+#: command.c:2177
+msgid "Query buffer reset (cleared)."
+msgstr "Buffer dotazů vyprázdněn."
+
+#: command.c:2199
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Historie zapsána do souboru: \"%s\".\n"
+
+#: command.c:2286
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: název proměnné prostředí nesmí obsahovat \"=\""
+
+#: command.c:2347
+#, c-format
+msgid "The server (version %s) does not support showing function source."
+msgstr "Server (verze %s) nepodporuje zobrazování zdrojového kódu funkce."
+
+#: command.c:2350
+#, c-format
+msgid "The server (version %s) does not support showing view definitions."
+msgstr "Server (verze %s) nepodporuje zobrazování definice pohledu."
+
+#: command.c:2357
+#, c-format
+msgid "function name is required"
+msgstr "function name is required"
+
+#: command.c:2359
+#, c-format
+msgid "view name is required"
+msgstr "je vyžadováno jméno pohledu"
+
+#: command.c:2489
+msgid "Timing is on."
+msgstr "Sledování Äasu je zapnuto."
+
+#: command.c:2491
+msgid "Timing is off."
+msgstr "Sledování Äasu je vypnuto."
+
+#: command.c:2576 command.c:2604 command.c:3739 command.c:3742 command.c:3745
+#: command.c:3751 command.c:3753 command.c:3761 command.c:3771 command.c:3780
+#: command.c:3794 command.c:3811 command.c:3869 common.c:70 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2988 startup.c:236 startup.c:287
+msgid "Password: "
+msgstr "Heslo: "
+
+#: command.c:2993 startup.c:284
+#, c-format
+msgid "Password for user %s: "
+msgstr "Heslo pro uživatele %s: "
+
+#: command.c:3046
+#, c-format
+msgid "All connection parameters must be supplied because no database connection exists"
+msgstr "Všechny parametry musí být zadány protože žádné připojení k databázi neexistuje"
+
+#: command.c:3335
+#, c-format
+msgid "Previous connection kept"
+msgstr "Předchozí spojení zachováno"
+
+#: command.c:3341
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3388
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na adrese \"%s\" na portu\"%s\".\n"
+
+#: command.c:3391
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+
+#: command.c:3397
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" (adresa \"%s\") na portu\"%s\".\n"
+
+#: command.c:3400
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\" na serveru \"%s\" na portu\"%s\".\n"
+
+#: command.c:3405
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Nyní jste připojeni k databázi \"%s\" jako uživatel \"%s\".\n"
+
+#: command.c:3438
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, server %s)\n"
+
+#: command.c:3446
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"VAROVÃNÃ: %s major verze %s, major verze serveru %s.\n"
+" Některé vlastnosti psql nemusí fungovat.\n"
+
+#: command.c:3485
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "SSL spojení (protokol: %s, šifra: %s, bitů: %s, komprese: %s)\n"
+
+#: command.c:3486 command.c:3487 command.c:3488
+msgid "unknown"
+msgstr "neznámé"
+
+#: command.c:3489 help.c:45
+msgid "off"
+msgstr "vypnuto"
+
+#: command.c:3489 help.c:45
+msgid "on"
+msgstr "zapnuto"
+
+#: command.c:3503
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-šifrované spojení\n"
+
+#: command.c:3523
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"VAROVÃNÃ: Kódová stránka konzole (%u) není shodná s kódovou stránkou\n"
+" Windows (%u) 8-bitové znaky nemusí fungovat správně. Další\n"
+" informace najdete v manuálu k psql na stránce \"Poznámky pro\n"
+" uživatele Windows.\"\n"
+
+#: command.c:3627
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "promÄ›nná prostÅ™edí PSQL_EDITOR_LINENUMBER_ARG musí být nastavena pro zadáníÄísla řádky"
+
+#: command.c:3656
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "nelze spustit editor \"%s\""
+
+#: command.c:3658
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "nelze spustit /bin/sh"
+
+#: command.c:3696
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "nelze najít doÄasný adresář: %s"
+
+#: command.c:3723
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "nelze otevřít doÄasný soubor \"%s\": %m"
+
+#: command.c:4028
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: nejednoznaÄná zkratka \"%s\" odpovídá \"%s\" a \"%s\""
+
+#: command.c:4048
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: dovolené formáty jsou aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4067
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: povolené styly řádek jsou ascii, old-ascii, unicode"
+
+#: command.c:4082
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: povolené styly Unicode rámeÄků jsou single, double"
+
+#: command.c:4097
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: povolené styly Unicode sloupců jsou single, double"
+
+#: command.c:4112
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: povolené styly Unicode rámeÄků záhlaví single, double"
+
+#: command.c:4155
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep musí být jediný jedno-bytový znak"
+
+#: command.c:4160
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep nemůže být dvojitá uvozovka, nový řádek, nebo konec řádky"
+
+#: command.c:4297 command.c:4485
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: neznámá volba: %s"
+
+#: command.c:4317
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Styl rámeÄků je %d.\n"
+
+#: command.c:4323
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Cílová šířka není nastavena.\n"
+
+#: command.c:4325
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Cílová šířka je %d.\n"
+
+#: command.c:4332
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Rozšířené zobrazení zapnuto.\n"
+
+#: command.c:4334
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Rozšířené zobrazení je zapnuto automaticky.\n"
+
+#: command.c:4336
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Rozšířené zobrazení vypnuto.\n"
+
+#: command.c:4342
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "OddÄ›lovaÄ polí pro CSV je '\"%s\"'.\n"
+
+#: command.c:4350 command.c:4358
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "OddÄ›lovaÄ polí je nulový byte.\n"
+
+#: command.c:4352
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "OddÄ›lovaÄ polí je '\"%s\"'.\n"
+
+#: command.c:4365
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Implicitní zápatí je zapnuto.\n"
+
+#: command.c:4367
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Implicitní zápatí je vypnuto.\n"
+
+#: command.c:4373
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Výstupní formát je %s.\n"
+
+#: command.c:4379
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Styl Äar je %s.\n"
+
+#: command.c:4386
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null je zobrazován jako '\"%s\"'.\n"
+
+#: command.c:4394
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Zobrazení Äíselného výstupu dle národního nastavení je vypnuto.\n"
+
+#: command.c:4396
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Zobrazení Äíselného výstupu dle národního nastavení je vypnuto.\n"
+
+#: command.c:4403
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Stránkování je zapnuto pro dlouhé výstupy.\n"
+
+#: command.c:4405
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Stránkování je vždy použito.\n"
+
+#: command.c:4407
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Stránkování je vypnuto.\n"
+
+#: command.c:4413
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Pager nebude použit pro méně než %d řáden.\n"
+msgstr[1] "Pager won't be used for less than %d lines.\n"
+msgstr[2] "Pager won't be used for less than %d lines.\n"
+
+#: command.c:4423 command.c:4433
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "OddÄ›lovaÄ záznamů je nulový byte.\n"
+
+#: command.c:4425
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "OddÄ›lovaÄ záznamů je <newline>.\n"
+
+#: command.c:4427
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "OddÄ›lovaÄ záznamů je '\"%s\"'.\n"
+
+#: command.c:4440
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Atributy tabulky jsou \"%s\".\n"
+
+#: command.c:4443
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Atributy tabulky nejsou nastaveny.\n"
+
+#: command.c:4450
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Nadpis je \"%s\".\n"
+
+#: command.c:4452
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Nadpis není nastaven.\n"
+
+#: command.c:4459
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Zobrazování pouze záznamů je vypnuto.\n"
+
+#: command.c:4461
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Zobrazování pouze záznamů je vypnuto.\n"
+
+#: command.c:4467
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Styl Unicode rámeÄků je \"%s\".\n"
+
+#: command.c:4473
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Styl Unicode sloupců je \"%s\".\n"
+
+#: command.c:4479
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Styl Unicode rámeÄků záhlaví je \"%s\".\n"
+
+#: command.c:4712
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: selhal"
+
+#: command.c:4737 common.c:648
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch neze použít s prázdným dotazem"
+
+#: command.c:4778
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (každé %gs)\n"
+
+#: command.c:4781
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (každé %gs)\n"
+
+#: command.c:4835 command.c:4842 common.c:548 common.c:555 common.c:1220
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* DOTAZ **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5034
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" není pohled"
+
+#: command.c:5050
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "nelze naparsovat pole reloptions"
+
+#: common.c:159
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "nelze escapovat bez aktivního spojení"
+
+#: common.c:200
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "argument shell příkazu obsahuje pÅ™echod na nový řádek nebo návrat na zaÄátek (carriage return): \"%s\""
+
+#: common.c:304
+#, c-format
+msgid "connection to server was lost"
+msgstr "spojení na server bylo ztraceno"
+
+#: common.c:308
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Spojení na server bylo ztraceno. Zkoušen restart: "
+
+#: common.c:313
+#, c-format
+msgid "Failed.\n"
+msgstr "Nepodařilo se.\n"
+
+#: common.c:326
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Podařilo se.\n"
+
+#: common.c:378 common.c:938 common.c:1155
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "neoÄekávaný PQresultStatus: %d"
+
+#: common.c:487
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "ÄŒas: %.3f ms\n"
+
+#: common.c:502
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "ÄŒas: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:511
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "ÄŒas: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:518
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "ÄŒas: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:542 common.c:600 common.c:1191
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Aktuálně nejste připojeni k databázi."
+
+#: common.c:655
+#, c-format
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watch nelze použít s COPY"
+
+#: common.c:660
+#, c-format
+msgid "unexpected result status for \\watch"
+msgstr "neoÄekávaný stav výsledku pro \\watch"
+
+#: common.c:690
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchronní upozornění \"%s\" s obsahem \"%s\" obdrženo ze serverového procesu s PID %d.\n"
+
+#: common.c:693
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchronní upozornění \"%s\" obdrženo z procesu serveru s PID %d.\n"
+
+#: common.c:726 common.c:743
+#, c-format
+msgid "could not print result table: %m"
+msgstr "nelze Äíst vypsat tabulku: %m"
+
+#: common.c:764
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "žádné řádky nevráceny pro \\gset"
+
+#: common.c:769
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "více než jedna řádka vrácena pro \\gset"
+
+#: common.c:1200
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Krokovací mód: potvrÄte příkaz)*******************************************\n"
+"%s\n"
+"***(stiskněte return pro zpracování nebo x a return pro zrušení)********************\n"
+
+#: common.c:1255
+#, c-format
+msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+msgstr "Server (verze %s) nepodporuje savepoints pro ON_ERROR_ROLLBACK."
+
+#: common.c:1318
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "PŘÃKAZ: %s"
+
+#: common.c:1361
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "neoÄekávaný stav transakce: (%d)"
+
+#: common.c:1502 describe.c:2001
+msgid "Column"
+msgstr "Sloupec"
+
+#: common.c:1503 describe.c:177 describe.c:393 describe.c:411 describe.c:456
+#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711
+#: describe.c:1735 describe.c:2002 describe.c:3729 describe.c:3939
+#: describe.c:4172 describe.c:5378
+msgid "Type"
+msgstr "Typ"
+
+#: common.c:1552
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Příkaz nevrátil žádný výsledek, nebo výsledek nemá žádné sloupce.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: argumenty jsou povinné"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: chyba na \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: chyba na konci řádku"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "nelze spustit příkaz \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "nelze provést stat souboru \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: nelze kopírovat z/do adresáře"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "nelze zavřít rouru (pipe) pro externí příkaz: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "nelze zapsat data příkazu COPY: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "přenos dat příkazu COPY selhal: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "zrušeno na žádost uživatele"
+
+# common.c:485
+#: copy.c:541
+msgid ""
+"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."
+msgstr ""
+"Zadejte data pro kopírování následovaná novým řádkem.\n"
+"UkonÄete zpÄ›tným lomítkem a teÄkou na samostatném řádku."
+
+#: copy.c:669
+msgid "aborted because of read failure"
+msgstr "pÅ™eruÅ¡eno z důvodu chyby Ätení"
+
+#: copy.c:703
+msgid "trying to exit copy mode"
+msgstr "pokouším se opustit copy mód"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: příkaz nevrátil žádný výsledek"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: dotaz musí vracet alespoň tři sloupce"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: vertikální a horozintální záklaví musí být různé sloupce"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: datový sloupec musí být specifikován pokud má dotaz více než tři sloupce"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: maximální poÄet sloupců (%d) pÅ™ekroÄen"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: výsledek dotazu obsahuje několik hodnot pro řádek \"%s\", sloupec \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: Äíslo sloupce %d je mimo rozsah 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nejednoznaÄný název sloupce: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: sloupec nenaleze: \"%s\""
+
+#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954
+#: describe.c:1115 describe.c:1187 describe.c:3718 describe.c:3926
+#: describe.c:4170 describe.c:4261 describe.c:4528 describe.c:4688
+#: describe.c:4929 describe.c:5004 describe.c:5015 describe.c:5077
+#: describe.c:5502 describe.c:5585
+msgid "Schema"
+msgstr "Schéma"
+
+#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374
+#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188
+#: describe.c:3719 describe.c:3927 describe.c:4093 describe.c:4171
+#: describe.c:4262 describe.c:4341 describe.c:4529 describe.c:4613
+#: describe.c:4689 describe.c:4930 describe.c:5005 describe.c:5016
+#: describe.c:5078 describe.c:5275 describe.c:5359 describe.c:5583
+#: describe.c:5755 describe.c:5995
+msgid "Name"
+msgstr "Jméno"
+
+#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467
+msgid "Result data type"
+msgstr "Datový typ výsledku"
+
+#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405
+#: describe.c:451 describe.c:468
+msgid "Argument data types"
+msgstr "Datový typ parametru"
+
+#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513
+#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020
+#: describe.c:3506 describe.c:3779 describe.c:3973 describe.c:4124
+#: describe.c:4198 describe.c:4271 describe.c:4354 describe.c:4437
+#: describe.c:4556 describe.c:4622 describe.c:4690 describe.c:4831
+#: describe.c:4873 describe.c:4946 describe.c:5008 describe.c:5017
+#: describe.c:5079 describe.c:5301 describe.c:5381 describe.c:5516
+#: describe.c:5586 large_obj.c:290 large_obj.c:300
+msgid "Description"
+msgstr "Popis"
+
+#: describe.c:135
+msgid "List of aggregate functions"
+msgstr "Seznam agregaÄních funkcí"
+
+#: describe.c:160
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Server (verze %s) nepodporuje přístupové metody (access methods)."
+
+#: describe.c:175
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:176 describe.c:3737 describe.c:3952 describe.c:5503
+msgid "Table"
+msgstr "Tabulka"
+
+#: describe.c:184 describe.c:5280
+msgid "Handler"
+msgstr "Handler"
+
+#: describe.c:203
+msgid "List of access methods"
+msgstr "Seznam přístupových metod"
+
+#: describe.c:229
+#, c-format
+msgid "The server (version %s) does not support tablespaces."
+msgstr "Server (verze %s) nepodporuje tablespaces."
+
+#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873
+#: describe.c:1114 describe.c:3730 describe.c:3928 describe.c:4097
+#: describe.c:4343 describe.c:4614 describe.c:5276 describe.c:5360
+#: describe.c:5756 describe.c:5893 describe.c:5996 describe.c:6111
+#: describe.c:6190 large_obj.c:289
+msgid "Owner"
+msgstr "Vlastník"
+
+#: describe.c:244 describe.c:252
+msgid "Location"
+msgstr "Umístění"
+
+#: describe.c:263 describe.c:3323
+msgid "Options"
+msgstr "Volby"
+
+#: describe.c:268 describe.c:690 describe.c:889 describe.c:3771 describe.c:3775
+msgid "Size"
+msgstr "Velikost"
+
+#: describe.c:290
+msgid "List of tablespaces"
+msgstr "Seznam tablespaces"
+
+#: describe.c:333
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "pro \\df můžete použít pouze pÅ™epínaÄe [anptwS+]"
+
+#: describe.c:341 describe.c:352
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "pro \\df nelze použít volbu \"%c\" ve verzi serveru %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:389 describe.c:407 describe.c:453 describe.c:470
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:390 describe.c:408
+msgid "window"
+msgstr "window"
+
+#: describe.c:391
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:392 describe.c:410 describe.c:455 describe.c:472
+msgid "func"
+msgstr "func"
+
+#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:483
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:484
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:485
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:486
+msgid "Volatility"
+msgstr "Volatilita"
+
+#: describe.c:494
+msgid "restricted"
+msgstr "restricted"
+
+#: describe.c:495
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:496
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:497
+msgid "Parallel"
+msgstr "Parallel"
+
+#: describe.c:502
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:503
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:504
+msgid "Security"
+msgstr "BezpeÄnost"
+
+#: describe.c:511
+msgid "Language"
+msgstr "Jazyk"
+
+#: describe.c:512
+msgid "Source code"
+msgstr "Zdrojový kód"
+
+#: describe.c:641
+msgid "List of functions"
+msgstr "Seznam funkcí"
+
+#: describe.c:689
+msgid "Internal name"
+msgstr "Interní jméno"
+
+#: describe.c:711
+msgid "Elements"
+msgstr "Složky"
+
+#: describe.c:768
+msgid "List of data types"
+msgstr "Seznam datových typů"
+
+#: describe.c:812
+msgid "Left arg type"
+msgstr "Typ levého argumentu"
+
+#: describe.c:813
+msgid "Right arg type"
+msgstr "Typ pravého argumentu"
+
+#: describe.c:814
+msgid "Result type"
+msgstr "Typ výsledku"
+
+#: describe.c:819 describe.c:4349 describe.c:4414 describe.c:4420
+#: describe.c:4830 describe.c:6362 describe.c:6366
+msgid "Function"
+msgstr "Funkce"
+
+#: describe.c:844
+msgid "List of operators"
+msgstr "Seznam operátorů"
+
+#: describe.c:874
+msgid "Encoding"
+msgstr "Kódování"
+
+#: describe.c:879 describe.c:4530
+msgid "Collate"
+msgstr "Collation"
+
+#: describe.c:880 describe.c:4531
+msgid "Ctype"
+msgstr "CType"
+
+#: describe.c:893
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:915
+msgid "List of databases"
+msgstr "Seznam databází"
+
+#: describe.c:956 describe.c:1117 describe.c:3720
+msgid "table"
+msgstr "tabulka"
+
+#: describe.c:957 describe.c:3721
+msgid "view"
+msgstr "pohled"
+
+#: describe.c:958 describe.c:3722
+msgid "materialized view"
+msgstr "materializovaný pohled"
+
+#: describe.c:959 describe.c:1119 describe.c:3724
+msgid "sequence"
+msgstr "sekvence"
+
+#: describe.c:960 describe.c:3726
+msgid "foreign table"
+msgstr "foreign_tabulka"
+
+#: describe.c:961 describe.c:3727 describe.c:3937
+msgid "partitioned table"
+msgstr "partitioned tabulka"
+
+#
+#: describe.c:973
+msgid "Column privileges"
+msgstr "Přístupová práva k atributům"
+
+#: describe.c:1004 describe.c:1038
+msgid "Policies"
+msgstr "Politiky"
+
+#: describe.c:1070 describe.c:6052 describe.c:6056
+msgid "Access privileges"
+msgstr "Přístupová práva"
+
+#: describe.c:1101
+#, c-format
+msgid "The server (version %s) does not support altering default privileges."
+msgstr "Server (verze %s) nepodporuje změny výchozích privilegií."
+
+#: describe.c:1121
+msgid "function"
+msgstr "funkce"
+
+#: describe.c:1123
+msgid "type"
+msgstr "typ"
+
+#: describe.c:1125
+msgid "schema"
+msgstr "schéma"
+
+#: describe.c:1149
+msgid "Default access privileges"
+msgstr "Implicitní přístupová práva"
+
+#: describe.c:1189
+msgid "Object"
+msgstr "Objekt"
+
+#: describe.c:1203
+msgid "table constraint"
+msgstr "omezení tabulky"
+
+#: describe.c:1225
+msgid "domain constraint"
+msgstr "omezení domény"
+
+#: describe.c:1253
+msgid "operator class"
+msgstr "třída operátorů"
+
+#: describe.c:1282
+msgid "operator family"
+msgstr "rodina operátorů"
+
+#: describe.c:1304
+msgid "rule"
+msgstr "rule"
+
+#: describe.c:1346
+msgid "Object descriptions"
+msgstr "Popis objektu"
+
+#: describe.c:1402 describe.c:3843
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Nelze nalézt relaci se jménem \"%s\"."
+
+#: describe.c:1405 describe.c:3846
+#, c-format
+msgid "Did not find any relations."
+msgstr "Nelze nalézt žádnou relaci."
+
+#: describe.c:1660
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Nelze nalézt relaci se OID %s."
+
+#: describe.c:1712 describe.c:1736
+msgid "Start"
+msgstr "Start"
+
+#: describe.c:1713 describe.c:1737
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1714 describe.c:1738
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1715 describe.c:1739
+msgid "Increment"
+msgstr "Inkrement"
+
+#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4265
+#: describe.c:4431 describe.c:4545 describe.c:4550 describe.c:6099
+msgid "yes"
+msgstr "ano"
+
+#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4265
+#: describe.c:4428 describe.c:4545 describe.c:6100
+msgid "no"
+msgstr "ne"
+
+#: describe.c:1718 describe.c:1742
+msgid "Cycles?"
+msgstr "Cycles?"
+
+#: describe.c:1719 describe.c:1743
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1786
+#, c-format
+msgid "Owned by: %s"
+msgstr "Vlastník: %s"
+
+#: describe.c:1790
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sekvence pro identity sloupec: %s"
+
+#: describe.c:1797
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sekvence \"%s.%s\""
+
+#: describe.c:1933
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Unlogged tabulka \"%s.%s\""
+
+#: describe.c:1936
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabulka \"%s.%s\""
+
+#: describe.c:1940
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Pohled \"%s.%s\""
+
+#: describe.c:1945
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Unlogged materializovaný pohled \"%s.%s\""
+
+#: describe.c:1948
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materializovaný pohled \"%s.%s\""
+
+#: describe.c:1953
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Unlogged index \"%s.%s\""
+
+#: describe.c:1956
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index \"%s.%s\""
+
+#: describe.c:1961
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Unlogged partitioned index \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Partitioned index \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "Speciální relace \"%s.%s\""
+
+#: describe.c:1973
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST tabulka \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Složený typ \"%s.%s\""
+
+#: describe.c:1981
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Foreign tabulka \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Unlogged partitioned tabulka \"%s.%s\""
+
+#: describe.c:1989
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Partitioned tabulka \"%s.%s\""
+
+#: describe.c:2005 describe.c:4178
+msgid "Collation"
+msgstr "Collation"
+
+#: describe.c:2006 describe.c:4185
+msgid "Nullable"
+msgstr "Nullable"
+
+#: describe.c:2007 describe.c:4186
+msgid "Default"
+msgstr "ImplicitnÄ›"
+
+#: describe.c:2010
+msgid "Key?"
+msgstr "KlíÄ?"
+
+#: describe.c:2012
+msgid "Definition"
+msgstr "Definice"
+
+#: describe.c:2014 describe.c:5296 describe.c:5380 describe.c:5451
+#: describe.c:5515
+msgid "FDW options"
+msgstr "FDW volby"
+
+#: describe.c:2016
+msgid "Storage"
+msgstr "Uložení"
+
+#: describe.c:2018
+msgid "Stats target"
+msgstr "Stats target"
+
+#: describe.c:2131
+#, c-format
+msgid "Partition of: %s %s"
+msgstr "Partition pro: %s %s"
+
+#: describe.c:2143
+msgid "No partition constraint"
+msgstr "Žádné omezení partition"
+
+#: describe.c:2145
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Omezení partition: %s"
+
+#: describe.c:2169
+#, c-format
+msgid "Partition key: %s"
+msgstr "Partition klíÄ: %s"
+
+#: describe.c:2195
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Owning table: \"%s.%s\""
+
+#: describe.c:2266
+msgid "primary key, "
+msgstr "primární klíÄ, "
+
+#: describe.c:2268
+msgid "unique, "
+msgstr "unikátní, "
+
+#: describe.c:2274
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "pro tabulku \"%s.%s\""
+
+#: describe.c:2278
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predikát (%s)"
+
+#: describe.c:2281
+msgid ", clustered"
+msgstr ", clusterován"
+
+#: describe.c:2284
+msgid ", invalid"
+msgstr ", neplatný"
+
+#: describe.c:2287
+msgid ", deferrable"
+msgstr ", odložitelný"
+
+#: describe.c:2290
+msgid ", initially deferred"
+msgstr ", iniciálně odložený"
+
+#: describe.c:2293
+msgid ", replica identity"
+msgstr ", replica identity"
+
+#: describe.c:2360
+msgid "Indexes:"
+msgstr "Indexy:"
+
+#: describe.c:2444
+msgid "Check constraints:"
+msgstr "Kontrolní pravidla:"
+
+#: describe.c:2512
+msgid "Foreign-key constraints:"
+msgstr "Podmínky cizího klíÄe:"
+
+#: describe.c:2575
+msgid "Referenced by:"
+msgstr "Odkazovaný:"
+
+#: describe.c:2625
+msgid "Policies:"
+msgstr "Politiky:"
+
+#: describe.c:2628
+msgid "Policies (forced row security enabled):"
+msgstr "Poitiky (forced row security zapnuta):"
+
+#: describe.c:2631
+msgid "Policies (row security enabled): (none)"
+msgstr "Politiky (row security zapnuta): (žádné)"
+
+#: describe.c:2634
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Politiky (forced row security zapnuta): (žádné)"
+
+#: describe.c:2637
+msgid "Policies (row security disabled):"
+msgstr "Politiky (row security vypnuta):"
+
+#: describe.c:2705
+msgid "Statistics objects:"
+msgstr "Statistické objekty:"
+
+#: describe.c:2819 describe.c:2923
+msgid "Rules:"
+msgstr "Rules:"
+
+#: describe.c:2822
+msgid "Disabled rules:"
+msgstr "Vypnutá pravidla (rules):"
+
+#: describe.c:2825
+msgid "Rules firing always:"
+msgstr "Vždy spouštěná pravidla:"
+
+#: describe.c:2828
+msgid "Rules firing on replica only:"
+msgstr "Pravidla spouštěná jen na replice:"
+
+#: describe.c:2868
+msgid "Publications:"
+msgstr "Publikace:"
+
+#: describe.c:2906
+msgid "View definition:"
+msgstr "Definice pohledu:"
+
+#: describe.c:3053
+msgid "Triggers:"
+msgstr "Triggery:"
+
+#: describe.c:3057
+msgid "Disabled user triggers:"
+msgstr "Vypnuté uživatelské triggery:"
+
+#: describe.c:3059
+msgid "Disabled triggers:"
+msgstr "Vypnuté triggery:"
+
+#: describe.c:3062
+msgid "Disabled internal triggers:"
+msgstr "Vypnuté interní triggery:"
+
+#: describe.c:3065
+msgid "Triggers firing always:"
+msgstr "Vždy spouštěné triggery:"
+
+#: describe.c:3068
+msgid "Triggers firing on replica only:"
+msgstr "Triggery spouštěné jen na replice:"
+
+#: describe.c:3140
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3148
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW volby: (%s)"
+
+#: describe.c:3169
+msgid "Inherits"
+msgstr "Dědí"
+
+#: describe.c:3229
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "PoÄet partition: %d"
+
+#: describe.c:3238
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "PoÄet partitions: %d (Použijte \\d+ pro jejich seznam.)"
+
+#: describe.c:3240
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "PoÄet podřízených tabulek: %d (Použijte \\d+ pro jejich seznam.)"
+
+#: describe.c:3247
+msgid "Child tables"
+msgstr "Podřízené tabulky"
+
+#: describe.c:3247
+msgid "Partitions"
+msgstr "Partitions"
+
+#: describe.c:3276
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Typovaná tabulka typu: %s"
+
+#: describe.c:3292
+msgid "Replica Identity"
+msgstr "Replica Identity"
+
+#: describe.c:3305
+msgid "Has OIDs: yes"
+msgstr "Má OID: ano"
+
+#: describe.c:3314
+#, c-format
+msgid "Access method: %s"
+msgstr "Přístupová metoda: %s"
+
+#: describe.c:3394
+#, 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:3406
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace: \"%s\""
+
+#: describe.c:3499
+msgid "List of roles"
+msgstr "Seznam rolí"
+
+#: describe.c:3501
+msgid "Role name"
+msgstr "Jméno role"
+
+#: describe.c:3502
+msgid "Attributes"
+msgstr "Atributy"
+
+#: describe.c:3503
+msgid "Member of"
+msgstr "Je Älenem"
+
+#: describe.c:3514
+msgid "Superuser"
+msgstr "Super-uživatel"
+
+#: describe.c:3517
+msgid "No inheritance"
+msgstr "Bez dÄ›diÄnosti"
+
+#: describe.c:3520
+msgid "Create role"
+msgstr "VytvoÅ™ roli"
+
+#: describe.c:3523
+msgid "Create DB"
+msgstr "VytvoÅ™ DB"
+
+#: describe.c:3526
+msgid "Cannot login"
+msgstr "Nemohu se přihlásit"
+
+#: describe.c:3530
+msgid "Replication"
+msgstr "Replikace"
+
+#: describe.c:3534
+msgid "Bypass RLS"
+msgstr "Obejít RLS"
+
+#: describe.c:3543
+msgid "No connections"
+msgstr "Není spojení"
+
+#: describe.c:3545
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d spojení"
+msgstr[1] "%d spojení"
+msgstr[2] "%d spojení"
+
+#: describe.c:3555
+msgid "Password valid until "
+msgstr "Heslo platné do "
+
+#: describe.c:3605
+#, c-format
+msgid "The server (version %s) does not support per-database role settings."
+msgstr "Server (verze %s) nepodporuje nastavení rolí pro jednotlivé databáze."
+
+#: describe.c:3618
+msgid "Role"
+msgstr "Role"
+
+#: describe.c:3619
+msgid "Database"
+msgstr "Databáze"
+
+#: describe.c:3620
+msgid "Settings"
+msgstr "Nastavení"
+
+#: describe.c:3641
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Nelze nalézt žádné nastavení pro roli \"%s\" a databázi \"%s\"."
+
+#: describe.c:3644
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Nelze nalézt žádné nastavení pro roli \"%s\"."
+
+#: describe.c:3647
+#, c-format
+msgid "Did not find any settings."
+msgstr "Žádná nastavení nenalezena."
+
+#: describe.c:3652
+msgid "List of settings"
+msgstr "Seznam nastavení"
+
+#: describe.c:3723
+msgid "index"
+msgstr "index"
+
+#: describe.c:3725
+msgid "special"
+msgstr "speciální"
+
+#: describe.c:3728 describe.c:3938
+msgid "partitioned index"
+msgstr "partitioned index"
+
+#: describe.c:3752
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3753
+msgid "temporary"
+msgstr "temporary"
+
+#: describe.c:3754
+msgid "unlogged"
+msgstr "unlogged"
+
+#: describe.c:3755
+msgid "Persistence"
+msgstr "Persistence"
+
+#: describe.c:3851
+msgid "List of relations"
+msgstr "Seznam relací"
+
+#: describe.c:3899
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Server (verze %s) nepodporuje deklarativní partitioning."
+
+#: describe.c:3910
+msgid "List of partitioned indexes"
+msgstr "Seznam partitioned indexů"
+
+#: describe.c:3912
+msgid "List of partitioned tables"
+msgstr "Seznam partitioned tabulek"
+
+#: describe.c:3916
+msgid "List of partitioned relations"
+msgstr "Seznam partitioned relací"
+
+#: describe.c:3947
+msgid "Parent name"
+msgstr "Jméno předka"
+
+#: describe.c:3960
+msgid "Leaf partition size"
+msgstr "Leaf partition size"
+
+#: describe.c:3963 describe.c:3969
+msgid "Total size"
+msgstr "Celková velikost"
+
+#: describe.c:4101
+msgid "Trusted"
+msgstr "Důvěryhodný"
+
+#: describe.c:4109
+msgid "Internal language"
+msgstr "Interní jazyk"
+
+#: describe.c:4110
+msgid "Call handler"
+msgstr "Call handler"
+
+#: describe.c:4111 describe.c:5283
+msgid "Validator"
+msgstr "Validátor"
+
+#: describe.c:4114
+msgid "Inline handler"
+msgstr "Inline handler"
+
+#: describe.c:4142
+msgid "List of languages"
+msgstr "Seznam jazyků"
+
+#: describe.c:4187
+msgid "Check"
+msgstr "Kontrola"
+
+#: describe.c:4229
+msgid "List of domains"
+msgstr "Seznam domén"
+
+#: describe.c:4263
+msgid "Source"
+msgstr "Zdroj"
+
+#: describe.c:4264
+msgid "Destination"
+msgstr "Cíl"
+
+#: describe.c:4266 describe.c:6101
+msgid "Default?"
+msgstr "ImplicitnÄ›?"
+
+#: describe.c:4303
+msgid "List of conversions"
+msgstr "Seznam konverzí"
+
+#: describe.c:4342
+msgid "Event"
+msgstr "Událost"
+
+#: describe.c:4344
+msgid "enabled"
+msgstr "povoleno"
+
+#: describe.c:4345
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4346
+msgid "always"
+msgstr "vždy"
+
+#: describe.c:4347
+msgid "disabled"
+msgstr "disabled"
+
+#: describe.c:4348 describe.c:5997
+msgid "Enabled"
+msgstr "Povoleno"
+
+#: describe.c:4350
+msgid "Tags"
+msgstr "Tagy"
+
+#: describe.c:4369
+msgid "List of event triggers"
+msgstr "Seznam event triggerů"
+
+#: describe.c:4398
+msgid "Source type"
+msgstr "Zdrojový typ"
+
+#: describe.c:4399
+msgid "Target type"
+msgstr "Cílový typ"
+
+#: describe.c:4430
+msgid "in assignment"
+msgstr "v přiřazení"
+
+#: describe.c:4432
+msgid "Implicit?"
+msgstr "ImplicitnÄ›?"
+
+#: describe.c:4487
+msgid "List of casts"
+msgstr "Seznam přetypování"
+
+#: describe.c:4515
+#, c-format
+msgid "The server (version %s) does not support collations."
+msgstr "Server (verze %s) nepodporuje collations."
+
+#: describe.c:4536 describe.c:4540
+msgid "Provider"
+msgstr "Provider"
+
+#: describe.c:4546 describe.c:4551
+msgid "Deterministic?"
+msgstr "Deterministická?"
+
+#: describe.c:4586
+msgid "List of collations"
+msgstr "Seznam collations"
+
+#: describe.c:4645
+msgid "List of schemas"
+msgstr "Seznam schémat"
+
+#: describe.c:4670 describe.c:4917 describe.c:4988 describe.c:5059
+#, c-format
+msgid "The server (version %s) does not support full text search."
+msgstr "Server (verze %s) nepodporuje fulltextové vyhledávání."
+
+#: describe.c:4705
+msgid "List of text search parsers"
+msgstr "Seznam fulltextových parserů"
+
+#: describe.c:4750
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Nelze nalézt fulltextový parser se jménem \"%s\"."
+
+#: describe.c:4753
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Nelze nalézt žádný fulltextový parser."
+
+#: describe.c:4828
+msgid "Start parse"
+msgstr "ZaÄátek parsování"
+
+#: describe.c:4829
+msgid "Method"
+msgstr "Metoda"
+
+#: describe.c:4833
+msgid "Get next token"
+msgstr "Získej další token"
+
+#: describe.c:4835
+msgid "End parse"
+msgstr "Konec parsování"
+
+#: describe.c:4837
+msgid "Get headline"
+msgstr "Získej záhlaví"
+
+#: describe.c:4839
+msgid "Get token types"
+msgstr "Získej typy tokenu"
+
+#: describe.c:4850
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Fulltextový parser \"%s.%s\""
+
+#: describe.c:4853
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Fulltextový parser \"%s\""
+
+#: describe.c:4872
+msgid "Token name"
+msgstr "Jméno tokenu"
+
+#: describe.c:4883
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Jméno tokenu pro parser \"%s.%s\""
+
+#: describe.c:4886
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Typ tokenu pro parser \"%s\""
+
+#: describe.c:4940
+msgid "Template"
+msgstr "Å ablona"
+
+#: describe.c:4941
+msgid "Init options"
+msgstr "Init options"
+
+#: describe.c:4963
+msgid "List of text search dictionaries"
+msgstr "Seznam fulltextových slovníků"
+
+#: describe.c:5006
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5007
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5034
+msgid "List of text search templates"
+msgstr "Seznam fulltextových šablon"
+
+#: describe.c:5094
+msgid "List of text search configurations"
+msgstr "Seznam fulltextových konfigurací"
+
+#: describe.c:5140
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Nelze nalézt fulltextovou konfiguraci se jménem \"%s\"."
+
+#: describe.c:5143
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Nelze nalézt žádnou fulltextovou konfiguraci."
+
+#: describe.c:5209
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5210
+msgid "Dictionaries"
+msgstr "Slovníky"
+
+#: describe.c:5221
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Fulltextová konfigurace \"%s.%s\""
+
+#: describe.c:5224
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Fulltextová konfigurace \"%s\""
+
+#: describe.c:5228
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Parser: \"%s.%s\""
+
+#: describe.c:5231
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: \"%s\""
+
+#: describe.c:5265
+#, c-format
+msgid "The server (version %s) does not support foreign-data wrappers."
+msgstr "Server (verze %s) nepodporuje foreign-data wrappery."
+
+#: describe.c:5323
+msgid "List of foreign-data wrappers"
+msgstr "Seznam foreign-data wrapperů"
+
+#: describe.c:5348
+#, c-format
+msgid "The server (version %s) does not support foreign servers."
+msgstr "Server (verze %s) nepodporuje foreign servery."
+
+#: describe.c:5361
+msgid "Foreign-data wrapper"
+msgstr "Foreign-data wrapper"
+
+#: describe.c:5379 describe.c:5584
+msgid "Version"
+msgstr "Verze"
+
+#: describe.c:5405
+msgid "List of foreign servers"
+msgstr "Seznam foreign serverů"
+
+#: describe.c:5430
+#, c-format
+msgid "The server (version %s) does not support user mappings."
+msgstr "Server (verze %s) nepodporuje mapování uživatelů."
+
+#: describe.c:5440 describe.c:5504
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5441
+msgid "User name"
+msgstr "Uživatelské jméno"
+
+#: describe.c:5466
+msgid "List of user mappings"
+msgstr "Seznam mapování uživatelů"
+
+#: describe.c:5491
+#, c-format
+msgid "The server (version %s) does not support foreign tables."
+msgstr "Server (verze %s) nepodporuje foreign tabulky."
+
+#: describe.c:5544
+msgid "List of foreign tables"
+msgstr "Seznam foreign tabulek"
+
+#: describe.c:5569 describe.c:5626
+#, c-format
+msgid "The server (version %s) does not support extensions."
+msgstr "Server (verze %s) nepodporuje extensions."
+
+#: describe.c:5601
+msgid "List of installed extensions"
+msgstr "Seznam instalovaných extensions"
+
+#: describe.c:5654
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Nelze nalézt extension se jménem \"%s\"."
+
+#: describe.c:5657
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Nelze nalézt žádnou extension."
+
+#: describe.c:5701
+msgid "Object description"
+msgstr "Popis objektu"
+
+#: describe.c:5711
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objekty v rozšíření \"%s\""
+
+#: describe.c:5740 describe.c:5816
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Server (verze %s) nepodporuje publikace."
+
+#: describe.c:5757 describe.c:5894
+msgid "All tables"
+msgstr "VÅ¡echny tabulky"
+
+#: describe.c:5758 describe.c:5895
+msgid "Inserts"
+msgstr "Insert"
+
+#: describe.c:5759 describe.c:5896
+msgid "Updates"
+msgstr "Update"
+
+#: describe.c:5760 describe.c:5897
+msgid "Deletes"
+msgstr "Delete"
+
+#: describe.c:5764 describe.c:5899
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:5768 describe.c:5901
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:5785
+msgid "List of publications"
+msgstr "Seznam publikací"
+
+#: describe.c:5858
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Nelze nalézt publikaci se jménem \"%s\"."
+
+#: describe.c:5861
+#, c-format
+msgid "Did not find any publications."
+msgstr "Nelze nalézt žádnou publikaci."
+
+#: describe.c:5890
+#, c-format
+msgid "Publication %s"
+msgstr "Publikace %s"
+
+#: describe.c:5938
+msgid "Tables:"
+msgstr "Tabulky:"
+
+#: describe.c:5982
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Server (verze %s) nepodporuje subskripce."
+
+#: describe.c:5998
+msgid "Publication"
+msgstr "Publikace"
+
+#: describe.c:6005
+msgid "Synchronous commit"
+msgstr "Synchronní commit"
+
+#: describe.c:6006
+msgid "Conninfo"
+msgstr "Spojení"
+
+#: describe.c:6028
+msgid "List of subscriptions"
+msgstr "Seznam subskripcí"
+
+#: describe.c:6095 describe.c:6184 describe.c:6270 describe.c:6353
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6096
+msgid "Input type"
+msgstr "Vstupní typ"
+
+#: describe.c:6097
+msgid "Storage type"
+msgstr "Typ uložení"
+
+#: describe.c:6098
+msgid "Operator class"
+msgstr "Třída operátorů"
+
+#: describe.c:6110 describe.c:6185 describe.c:6271 describe.c:6354
+msgid "Operator family"
+msgstr "Rodina operátorů"
+
+#: describe.c:6143
+msgid "List of operator classes"
+msgstr "Seznam tříd operátorů"
+
+#: describe.c:6186
+msgid "Applicable types"
+msgstr "Aplikovatelné typy"
+
+#: describe.c:6225
+msgid "List of operator families"
+msgstr "Seznam rodin operátorů"
+
+#: describe.c:6272
+msgid "Operator"
+msgstr "Operátor"
+
+#: describe.c:6273
+msgid "Strategy"
+msgstr "Strategie"
+
+#: describe.c:6274
+msgid "ordering"
+msgstr "řazení"
+
+#: describe.c:6275
+msgid "search"
+msgstr "hledání"
+
+#: describe.c:6276
+msgid "Purpose"
+msgstr "ÚÄel"
+
+#: describe.c:6281
+msgid "Sort opfamily"
+msgstr "Rodina operátorů"
+
+#: describe.c:6312
+msgid "List of operators of operator families"
+msgstr "List operátorů v rodinách operátorů"
+
+#: describe.c:6355
+msgid "Registered left type"
+msgstr "Typ levého argumentu"
+
+#: describe.c:6356
+msgid "Registered right type"
+msgstr "Typ pravého argumentu"
+
+#: describe.c:6357
+msgid "Number"
+msgstr "Číslo"
+
+#: describe.c:6393
+msgid "List of support functions of operator families"
+msgstr "Seznam support funkcí pro rodiny operátorů"
+
+#: help.c:73
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql je PostgreSQL interaktivní terminál.\n"
+"\n"
+
+#: help.c:74 help.c:355 help.c:431 help.c:474
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: help.c:75
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [PŘEPÃNAÄŒE]... [DATABÃZE [UŽIVATEL]]\n"
+"\n"
+
+#: help.c:77
+#, c-format
+msgid "General options:\n"
+msgstr "Základní volby:\n"
+
+#: help.c:82
+#, c-format
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=PŘÃKAZ provede pouze jeden příkaz (SQL nebo interní) a skonÄí\n"
+
+#: help.c:83
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DATABÃZE jméno databáze pro spojení (implicitnÄ›: \"%s\")\n"
+
+#: help.c:84
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=SOUBOR provede příkazy ze souboru a skonÄí\n"
+
+#: help.c:85
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list vypíše seznam dostupných databází a skonÄí\n"
+
+#: help.c:86
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=JMÉNO=HODNOTA\n"
+" nastaví psql proměnnou JMÉNO na HODNOTA\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+"\n"
+
+#: help.c:89
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informace o verzi a skonÄí\n"
+
+#: help.c:90
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc neÄíst inicializaÄní soubor (~/.psqlrc)\n"
+
+#: help.c:91
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"jedna\"), --single-transaction\n"
+" proveÄ operaci v rámci jedné transakce\n"
+
+#: help.c:93
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] ukáže tuto nápovÄ›du, a skonÄí\n"
+
+#: help.c:94
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands vypíše interní příkazy, poté skonÄí\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables vypíše speciální promÄ›nné, poté skonÄí\n"
+
+#: help.c:97
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Vstupní a výstupní pÅ™epínaÄe:\n"
+
+#: help.c:98
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all ukáže všechny vstupy ze skriptu\n"
+
+#: help.c:99
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors vypíše příkazy které selhaly\n"
+
+#: help.c:100
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e --echo-queries ukáže všechny příkazy poslané na server\n"
+
+#: help.c:101
+#, c-format
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden ukáže dotazy generované interními příkazy\n"
+
+#: help.c:102
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=SOUBOR uloží záznam sezení do souboru\n"
+
+#: help.c:103
+#, c-format
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline vypne pokroÄilé editaÄní možnosti příkazové řádky (podpora readline)\n"
+
+#: help.c:104
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=SOUBOR zapíše výsledek dotazu do souboru (nebo |roury)\n"
+
+#: help.c:105
+#, c-format
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet tichý chod (bez hlášek, pouze výstupy dotazů)\n"
+
+#: help.c:106
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step krokovací mód (nutné potvrzení každého dotazu)\n"
+
+#: help.c:107
+#, c-format
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line jednořádkový mód (konec řádky ukonÄuje SQL příkaz)\n"
+
+#: help.c:109
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Výstupní formát je:\n"
+
+#: help.c:110
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align mód nezarovnaného formátu tabulky\n"
+
+#: help.c:111
+#, c-format
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV (Comma-Separated Values) mód výstupu tabulek\n"
+
+#: help.c:112
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=ŘETĚZEC\n"
+" oddÄ›lovaÄ polí pro nezarovnaný výstup (implicitnÄ›: \"%s\")\n"
+
+#: help.c:115
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html mód HTML formátu tabulky\n"
+
+#: help.c:116
+#, c-format
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] nastaví zobrazovací parametr VAR na hodnotu ARG (viz. příkaz \\pset)\n"
+
+#: help.c:117
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=ŘETĚZEC\n"
+" oddÄ›lovaÄ záznamů pro nezarovnaný výstup (implicitnÄ›: newline)\n"
+
+#: help.c:119
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only tiskni pouze řádky\n"
+
+#: help.c:120
+#, c-format
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT nastaví atributy HTML tabulky (např. width, border)\n"
+
+#: help.c:121
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded zapne rozšířený tabulkový výstup\n"
+
+#: help.c:122
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" nastaví oddÄ›lovaÄ polí pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:124
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" nastaví oddÄ›lovaÄ záznamů pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:127
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Parametry spojení:\n"
+
+#: help.c:130
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresář se soketem (implicitně: \"%s\")\n"
+
+#: help.c:131
+msgid "local socket"
+msgstr "lokální soket"
+
+#: help.c:134
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT port databázového serveru (implicitně: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=JMÉNO jméno databázového uživatele (implicitně: \"%s\")\n"
+
+#: help.c:141
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password neptá se na heslo\n"
+
+#: help.c:142
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password vynucený dotaz na heslo (měl by být proveden automaticky)\n"
+
+#: help.c:144
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Pro více informací použijte \"\\?\" (pro interní příkazy) nebo \"\\help\"\n"
+"(pro SQL příkazy), nebo se podívejte do dokumentace PostgreSQL a\n"
+"Äásti vÄ›nované psql.\n"
+"\n"
+
+#: help.c:147
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Chyby hlašte na <%s>.\n"
+
+#: help.c:148
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: help.c:174
+#, c-format
+msgid "General\n"
+msgstr "Hlavní\n"
+
+#: help.c:175
+#, c-format
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright zobrazí podmínky použití a distribuce PostgreSQL\n"
+
+#: help.c:176
+#, c-format
+msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [SLOUPCE] spustí dotaz a zobrazí výsledek přes crosstab\n"
+
+#: help.c:177
+#, c-format
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose zobrazí polední chybovou hlášku s maximem podrobností\n"
+
+#: help.c:178
+#, c-format
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+
+#: help.c:180
+#, c-format
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc popíše výsledek dotazu, bez spuštění\n"
+
+#: help.c:181
+#, c-format
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec spustí dotaz, poté spustí každou hodnotu z jeho výsledku\n"
+
+#: help.c:182
+#, c-format
+msgid " \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr " \\gset [PREFIX] spustí dotaz a uloží výsledky v psql proměnných\n"
+
+#: help.c:183
+#, c-format
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(VOLBY)] [SOUBOR] jako \\g, ale vynucuje rozšířený mód výstupu\n"
+
+#: help.c:184
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q ukonÄení psql\n"
+
+#: help.c:185
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] každých SEC vteřin spusť dotaz\n"
+
+#: help.c:188
+#, c-format
+msgid "Help\n"
+msgstr "Nápověda\n"
+
+#: help.c:190
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] zobrazí nápovědu k interním příkazům\n"
+
+#: help.c:191
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options zobrazí nápovědu k psql parametrům psql pro příkazovou řádku\n"
+
+#: help.c:192
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables zobrazí nápovědu ke speciálním proměnným\n"
+
+#: help.c:193
+#, c-format
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [JMÉNO] nápověda syntaxe SQL příkazů, * pro všechny příkazy\n"
+
+#: help.c:196
+#, c-format
+msgid "Query Buffer\n"
+msgstr "Paměť dotazu\n"
+
+#: help.c:197
+#, c-format
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [SOUBOR] [ŘÃDEK] editace aktuálního dotazu (nebo souboru) v externím editoru\n"
+
+#: help.c:198
+#, c-format
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [JMENOFUNKCE [ŘÃDEK]] editace definice funkce v externím editoru\n"
+
+#: help.c:199
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [VIEWNAME [LINE]] editace definice pohledu v externím editoru\n"
+"\n"
+
+#: help.c:200
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p ukázat souÄasný obsah pamÄ›ti s dotazem\n"
+
+#: help.c:201
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r vyprázdnění paměti s dotazy\n"
+
+#: help.c:203
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [SOUBOR] vytiskne historii nebo ji uloží do souboru\n"
+
+#: help.c:205
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w SOUBOR zapsání paměti s dotazem do souboru\n"
+
+#: help.c:208
+#, c-format
+msgid "Input/Output\n"
+msgstr "Vstup/Výstup\n"
+
+#: help.c:209
+#, c-format
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... provede SQL COPY s tokem dat na klienta\n"
+
+#: help.c:210
+#, c-format
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr ""
+" \\echo [-n] [ŘETÄšZEC] vypsání textu na standardní výstup (-n pro potlaÄení\n"
+" nového řádku)\n"
+
+#: help.c:211
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i SOUBOR provedení příkazů ze souboru\n"
+
+#: help.c:212
+#, c-format
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE jako \\i, ale relativně k pozici v aktuálním skriptu\n"
+
+#: help.c:213
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [SOUBOR] přesměrování výsledků dotazu do souboru nebo |roury\n"
+
+#: help.c:214
+#, c-format
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [ŘETÄšZEC] vypsání textu na \\o výstup dotazů (-n pro potlaÄení\n"
+" nového řádku)\n"
+
+#: help.c:215
+#, c-format
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr ""
+" \\warn [-n] [TEXT] vypsání textu na standardní výstup (-n pro potlaÄení\n"
+" nového řádku)\n"
+
+#: help.c:218
+#, c-format
+msgid "Conditional\n"
+msgstr "Podmínka\n"
+
+#: help.c:219
+#, c-format
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR zaÄne podmínÄ›ný blok\n"
+
+#: help.c:220
+#, c-format
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativa v souÄasném podmínÄ›ném bloku\n"
+
+#: help.c:221
+#, c-format
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else poslední alternativa v souÄasném podmínÄ›ném bloku\n"
+
+#: help.c:222
+#, c-format
+msgid " \\endif end conditional block\n"
+msgstr " \\endif ukonÄí podmínÄ›ný blok\n"
+
+#: help.c:225
+#, c-format
+msgid "Informational\n"
+msgstr "InformaÄní\n"
+
+#: help.c:226
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (volby: S = zobraz systémové objekty, + = další detaily)\n"
+
+#: help.c:227
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] seznam tabulek, pohledů a sekvencí\n"
+
+#: help.c:228
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] JMÉNO popis tabulky, pohledů, sekvence nebo indexu\n"
+
+#: help.c:229
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [VZOR] seznam agregaÄních funkcí\n"
+
+#: help.c:230
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] seznam přístupových metod\n"
+
+#: help.c:231
+#, c-format
+#| msgid " \\do[S] [PATTERN] list operators\n"
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] vypíše třídy operátorů\n"
+
+#: help.c:232
+#, c-format
+#| msgid " \\do[S] [PATTERN] list operators\n"
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] vypíše rodiny operátorů\n"
+
+#: help.c:233
+#, c-format
+#| msgid " \\do[S] [PATTERN] list operators\n"
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] vypíše operátory pro rodiny operátorů\n"
+
+#: help.c:234
+#, c-format
+msgid " \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp [AMPTRN [OPFPTRN]] vypíše support funkce rodin operátorů\n"
+
+#: help.c:235
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [VZOR] seznam tablespaces\n"
+
+#: help.c:236
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] seznam konverzí\n"
+
+#: help.c:237
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] seznam přetypování\n"
+
+#: help.c:238
+#, c-format
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] zobrazí popis objektů nezobrazených jinde\n"
+
+#: help.c:239
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] seznam domén\n"
+
+#: help.c:240
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [VZOR] seznam implicitních privilegií\n"
+
+#: help.c:241
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [VZOR] seznam foreign tabulek\n"
+
+#: help.c:242
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [VZOR] seznam foreign tabulek\n"
+
+#: help.c:243
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [VZOR] seznam foreign serverů\n"
+
+#: help.c:244
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [VZOR] seznam mapování uživatelů\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [VZOR] seznam foreign-data wrapperů\n"
+
+#: help.c:246
+#, c-format
+msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n"
+msgstr " \\df[anptw][S+] [VZOR] seznam [pouze agg/normal/procedures/trigger/window] funkcí\n"
+
+#: help.c:247
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [VZOR] seznam konfigurací fulltextového vyhledávání\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [VZOR] seznam slovníků fulltextového vyhledávání\n"
+
+#: help.c:249
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [VZOR] seznam parserů fulltextového vyhledávání\n"
+
+#: help.c:250
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [VZOR] seznam šablon fulltextového vyhledávání\n"
+
+#: help.c:251
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] seznam rolí\n"
+
+#: help.c:252
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [VZOR] seznam indexů\n"
+
+#: help.c:253
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr " \\dl seznam \"large object\" stejné jako \\lo_list\n"
+
+#: help.c:254
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [VZOR] seznam procedurálních jazyků\n"
+
+#: help.c:255
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] seznam materializovaných pohledů\n"
+
+#: help.c:256
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [VZOR] seznam schémat\n"
+
+#: help.c:257
+#, c-format
+msgid " \\do[S] [PATTERN] list operators\n"
+msgstr " \\do[S] [VZOR] seznam operátorů\n"
+
+#: help.c:258
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [VZOR] seznam collations\n"
+
+#: help.c:259
+#, c-format
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [VZOR] seznam přístupových práv tabulek, pohledů a sekvencí\n"
+
+#: help.c:260
+#, c-format
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] seznam [pouze index/table] partitioned relations [n=nested]\n"
+
+#: help.c:261
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [VZOR1 [VZOR2]] seznam nastavení rolí pro jednotlivé databáze\n"
+
+#: help.c:262
+#, c-format
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] seznam replikaÄních publikací\n"
+
+#: help.c:263
+#, c-format
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] seznam replikaÄních subskripcí\n"
+
+#: help.c:264
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [VZOR] seznam sekvencí\n"
+
+#: help.c:265
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [VZOR] seznam tabulek\n"
+
+#: help.c:266
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [VZOR] seznam datových typů\n"
+
+#: help.c:267
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] seznam rolí\n"
+
+#: help.c:268
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [VZOR] seznam pohledů\n"
+
+#: help.c:269
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [VZOR] seznam rozšíření\n"
+
+#: help.c:270
+#, c-format
+msgid " \\dy [PATTERN] list event triggers\n"
+msgstr " \\dy [PATTERN] seznam event triggerů\n"
+
+#: help.c:271
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] seznam databází\n"
+
+#: help.c:272
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME zobrazí definici funkce\n"
+
+#: help.c:273
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME zobrazí definici pohledu\n"
+
+#: help.c:274
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [VZOR] stejné jako \\dp\n"
+
+#: help.c:277
+#, c-format
+msgid "Formatting\n"
+msgstr "Formátování\n"
+
+#: help.c:278
+#, c-format
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a přepíná mezi 'unaligned' a 'aligned' modem výstupu\n"
+
+#: help.c:279
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [ŘETĚZEC] nastaví titulek tabulky nebo odnastaví pokud není definován řetězec\n"
+
+#: help.c:280
+#, c-format
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [ŘETÄšZEC] nastaví nebo zobrazí oddÄ›lovaÄe polí pro nezarovnaný výstup dotazů\n"
+
+#: help.c:281
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H zapne HTML mód výstupu (nyní %s)\n"
+
+#: help.c:283
+#, c-format
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:290
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] ukazovat pouze řádky (nyní %s)\n"
+
+#: help.c:292
+#, c-format
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [ŘETĚZEC] nastavení atributů HTML tagu <table>\n"
+
+#: help.c:293
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] zapne rozšířený mód výstupu (nyní %s)\n"
+
+#: help.c:297
+#, c-format
+msgid "Connection\n"
+msgstr "Spojení\n"
+
+#: help.c:299
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] [DATABÃZE|- UŽIVATEL|- HOST|- PORT|-] | conninfo]\n"
+" pÅ™ipojí se do nové databáze (souÄasná \"%s\")\n"
+
+#: help.c:303
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] [DATABÃZE|- UŽIVATEL|- HOST|- PORT|-] | conninfo]\n"
+" pÅ™ipojí se do nové databáze (souÄasnÄ› žádné spojení)\n"
+
+#: help.c:305
+#, c-format
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo zobrazí informace o aktuálním spojení\n"
+
+#: help.c:306
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KÓDOVÃNÃ] zobrazení nebo nastavení kódování klienta\n"
+
+#: help.c:307
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [UŽIVATEL] bezpeÄná zmÄ›na hesla uživatele\n"
+
+#: help.c:310
+#, c-format
+msgid "Operating System\n"
+msgstr "OperaÄní systém\n"
+
+#: help.c:311
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [ADRESÃŘ] zmÄ›na aktuálního pracovního adresář\n"
+
+#: help.c:312
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] nastaví nebo zruší proměnnou prostředí\n"
+
+#: help.c:313
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] použít sledování Äasu u příkazů (nyní %s)\n"
+
+#: help.c:315
+#, c-format
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [PŘÃKAZ] provedení příkazu v shellu nebo nastartuje interaktivní shell\n"
+
+#: help.c:318
+#, c-format
+msgid "Variables\n"
+msgstr "Proměnné\n"
+
+#: help.c:319
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] PROMĚNà vyzve uživatele, aby zadal hodnotu proměnné\n"
+
+#: help.c:320
+#, c-format
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [PROMÄšNÃ [HODNOTA]]\n"
+" nastavení interní proměnné nebo bez parametrů zobrazí\n"
+" seznam všech proměnných\n"
+
+#: help.c:321
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset JMÉNO zrušení interní proměnné\n"
+
+#: help.c:324
+#, c-format
+msgid "Large Objects\n"
+msgstr "Velké objekty (LO)\n"
+
+#: help.c:325
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID SOUBOR\n"
+" \\lo_import SOUBOR [KOMENTÃŘ]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID operace s \"large\" objekty\n"
+
+#: help.c:352
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Seznam proměnných se zvláštním významem\n"
+"\n"
+
+#: help.c:354
+#, c-format
+msgid "psql variables:\n"
+msgstr "psql proměnné:\n"
+
+#: help.c:356
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" nebo \\set NAME VALUE v psql\n"
+"\n"
+
+#: help.c:358
+#, c-format
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" pokud nastaveno, úspěšnÄ› dokonÄené SQL příkazy jsou automaticky commitovány\n"
+
+#: help.c:360
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" urÄuje velikost písmen pro dokonÄování SQL klíÄových slov\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:363
+#, c-format
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" název aktuálně připojené databáze\n"
+
+#: help.c:365
+#, c-format
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" urÄuje jaký vstup je zapisován na standardní výstup\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:368
+#, c-format
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" pokud je nastaveno, zobrazuje dotazy spouštěné interními (backslash) příkazy;\n"
+" při nastavení na \"noexec\", pouze zobrazí bez spuštění\n"
+
+#: help.c:371
+#, c-format
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" aktuální kódování znakové sady klienta\n"
+
+#: help.c:373
+#, c-format
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" nastaveno na true pokud poslední dotaz selhal, jinak false\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" poÄet řádek výsledku pro naÄtení a zobrazení nanjednou (0 = unlimited)\n"
+
+#: help.c:377
+#, c-format
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" pokud nastaveno, informace o table access methods nejsou zobrazovány\n"
+
+#: help.c:379
+#, c-format
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" nastavuje chování historie příkazů [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:381
+#, c-format
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" název souboru pro uložení historie příkazů\n"
+
+#: help.c:383
+#, c-format
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" maximální poÄet položek uložených v historii pÅ™kazů\n"
+
+#: help.c:385
+#, c-format
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" databázový server ke kterému jste aktuálně připojeni\n"
+
+#: help.c:387
+#, c-format
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" poÄet EOF znaků potÅ™ebných pro ukonÄení interaktivníhi sezení\n"
+
+#: help.c:389
+#, c-format
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" hodnota posledního změněného OID\n"
+
+#: help.c:391
+#, c-format
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" zpráva a SQLSTATE poslední chyby, nebo prázdný řetězec a \"00000\" pokud se chyba nevyskytla\n"
+
+#: help.c:394
+#, c-format
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" pokud nastaveno, chyba nepřeruší transakci (používá implicitní savepointy)\n"
+
+#: help.c:396
+#, c-format
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" zastaví dávkové spouštění v případě výskytu chyby\n"
+
+#: help.c:398
+#, c-format
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" port na serveru používaný aktuálním spojením\n"
+
+#: help.c:400
+#, c-format
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" specifikuje standardní psql prompt\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" specifikuje prompt používaný pokud příkaz pokraÄuje z pÅ™edchozí řádky\n"
+
+#: help.c:404
+#, c-format
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" specifikuje prompt používaný během COPY ... FROM STDIN\n"
+
+#: help.c:406
+#, c-format
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" tichý běh (stejné jako volba -q)\n"
+
+#: help.c:408
+#, c-format
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" poÄet řádek vrácených nebo ovlivnÄ›ných pÅ™edchozím dotazem, nebo 0\n"
+
+#: help.c:410
+#, c-format
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" verze serveru (v krátkém textovém nebo numerickém formátu)\n"
+
+#: help.c:413
+#, c-format
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" urÄuje zobrazení informací o kontextu zpráv [never, errors, always]\n"
+
+#: help.c:415
+#, c-format
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" pokud nastaveno, konec řádky ukonÄuje SQL příkazy (stejné jako volba -S)\n"
+
+#: help.c:417
+#, c-format
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" single-step mód (stejné jako volba -s)\n"
+
+#: help.c:419
+#, c-format
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE posledního dotazu, nebo \"00000\" pokud skonÄil bez chyby\n"
+
+#: help.c:421
+#, c-format
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" uživatelský úÄet ke kterému jste aktuálnÄ› pÅ™ipojeni\n"
+
+#: help.c:423
+#, c-format
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" urÄuje podrobnost chybových hlášení [default, verbose, terse, sqlstate]\n"
+
+#: help.c:425
+#, c-format
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" verze psql (v podropbném řetězci, krátkém řetězci, nebo numerickém formátu)\n"
+
+#: help.c:430
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Nastavení zobrazení:\n"
+
+#: help.c:432
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" nebo \\pset NAME [VALUE] v psql\n"
+"\n"
+
+#: help.c:434
+#, c-format
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" styl rámeÄků (Äíslo)\n"
+
+#: help.c:436
+#, c-format
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" cílová šířka pro zalomený formát\n"
+
+#: help.c:438
+#, c-format
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (nebo x)\n"
+" rozšířený výstup [on, off, auto]\n"
+
+#: help.c:440
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" oddÄ›lovaÄ položek pro nezarovnaný výstup (výchozí \"%s\")\n"
+
+#: help.c:443
+#, c-format
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" nastaví oddÄ›lovaÄ polí pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:445
+#, c-format
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" zapne nebo vypne zobrazení zápatí tabulky [on, off]\n"
+
+#: help.c:447
+#, c-format
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" nastaví formát výstupu [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:449
+#, c-format
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestype\n"
+" nastaví styl vykreslování rámeÄků [ascii, old-ascii, unicode]\n"
+
+#: help.c:451
+#, c-format
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" nastaví řetězec vypisovaný místo null hodnoty\n"
+
+#: help.c:453
+#, c-format
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" zapne zobrazení lokalizovaného znaku pro oddÄ›lení skupin Äíslic\n"
+
+#: help.c:455
+#, c-format
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" urÄuje kdy se použije externí pager [yes, no, always]\n"
+
+#: help.c:457
+#, c-format
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" oddÄ›lovaÄ záznamů (řádek) pro nezarovnaný výstup\n"
+
+#: help.c:459
+#, c-format
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" nastaví oddÄ›lovaÄ záznamů pro nezarovnaný výstup na nulový byte\n"
+
+#: help.c:461
+#, c-format
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" specifikuje attributy pro table tag v html formátu, nebo proporcionální\n"
+" šířky sloupců pro datové typy zarovnávané doleva v latex-longtable formátu\n"
+
+#: help.c:464
+#, c-format
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" nastavuje titulek tabulky pro následně vypisované tabulky\n"
+
+#: help.c:466
+#, c-format
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" pokud nastaveno, jsou vypsána pouze data z tabulky\n"
+
+#: help.c:468
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" nastaví styl Unicode rámeÄků [single, double]\n"
+
+#: help.c:473
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Proměnné prostředí:\n"
+
+#: help.c:477
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" nebo \\setenv NAME [VALUE] v rámci psql\n"
+"\n"
+
+#: help.c:479
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" nebo \\setenv NAME [VALUE] v rámci psql\n"
+"\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" poÄet sloupců pro zalamovaný formát\n"
+
+#: help.c:484
+#, c-format
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" stejné jako application_name v parametrech spojení\n"
+
+#: help.c:486
+#, c-format
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" stejné jako dbname v parametrech spojení\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" stejné jako host v parametrech spojení\n"
+
+#: help.c:490
+#, c-format
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" heslo pro spojení (nedoporuÄuje se)\n"
+
+#: help.c:492
+#, c-format
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" jméno souboru s hesly\n"
+
+#: help.c:494
+#, c-format
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" stejné jako port v parametrech spojení\n"
+
+#: help.c:496
+#, c-format
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" stejné jako user v parametrech spojení\n"
+
+#: help.c:498
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor používaný příkazy \\e, \\ef, a \\ev\n"
+
+#: help.c:500
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" jak specifikovat Äíslo řádky pÅ™i spouÅ¡tÄ›ní editoru\n"
+
+#: help.c:502
+#, c-format
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" alternativní umístění pro soubor s historií příkazů\n"
+
+#: help.c:504
+#, c-format
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" jméno externího stránkovacího programu (pageru)\n"
+
+#: help.c:506
+#, c-format
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" alternativní umístění uživatelova .psqlrc souboru\n"
+
+#: help.c:508
+#, c-format
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell používaný \\! příkazem\n"
+
+#: help.c:510
+#, c-format
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" adresář pro doÄasné soubory\n"
+
+#: help.c:554
+msgid "Available help:\n"
+msgstr "Dostupná nápověda:\n"
+
+#: help.c:642
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Příkaz: %s\n"
+"Popis: %s\n"
+"Syntaxe:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:661
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Nápověda pro \"%s\" je nedostupná.\n"
+"Pomocí \\h bez parametrů lze získat seznam dostupných nápověd.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "nelze Äíst vstupní soubor: %m"
+
+#: input.c:471 input.c:509
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "nelze uložit historii do souboru \"%s\": %m"
+
+#: input.c:528
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "historie není podporována pro tuto instalaci"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: není spojení s databází"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: souÄasná transakce je pÅ™eruÅ¡ena (abort)"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: neznámý status transakce"
+
+#: large_obj.c:288 large_obj.c:299
+msgid "ID"
+msgstr "ID"
+
+#: large_obj.c:309
+msgid "Large objects"
+msgstr "Velké objekty (LO)"
+
+#: mainloop.c:136
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapované"
+
+#: mainloop.c:195
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Použijte \"\\q\" pro odchod z %s.\n"
+
+#: mainloop.c:217
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Na vstupu je dump v PostgreSQL \"custom\" formátu.\n"
+"Pro obnovení této zálohy použijte klienta pg_restore pro příkazovou řádku.\n"
+
+#: mainloop.c:298
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Použijte \\? pro nápovědu nebo stiskněte control-C pro vymazání vstupního bufferu."
+
+#: mainloop.c:300
+msgid "Use \\? for help."
+msgstr "Pro zobrazení nápovědy použijte \"\\?\"."
+
+#: mainloop.c:304
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Používáte psql, řádkový nástroj pro připojení k PostgreSQL."
+
+#: mainloop.c:305
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Pište: \\copyright pro podmínky distribuce\n"
+" \\h pro nápovědu k SQL příkazům\n"
+" \\? pro nápovědu k psql příkazům\n"
+" \\g nebo stÅ™edník pro ukonÄení SQL příkazů\n"
+" \\q pro ukonÄení programu\n"
+
+#: mainloop.c:329
+msgid "Use \\q to quit."
+msgstr "Použijte \\q pro ukonÄení."
+
+#: mainloop.c:332 mainloop.c:356
+msgid "Use control-D to quit."
+msgstr "Použijte control-D pro ukonÄení."
+
+#: mainloop.c:334 mainloop.c:358
+msgid "Use control-C to quit."
+msgstr "Použijte control-C pro ukonÄení."
+
+#: mainloop.c:465 mainloop.c:613
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "dotaz ignorován; použijte \\endif nebo Ctrl-C pro ukonÄení aktuálního \\if bloku"
+
+#: mainloop.c:631
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "dosažen EOF bez nalezení ukonÄujícího \\endif(s)"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "neukonÄený Å™etÄ›zec v uvozovkách"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: nedostatek paměti"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123
+#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237
+#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247
+#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265
+#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322
+#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442
+#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525
+#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592
+#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604
+#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662
+#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706
+#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764
+#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805
+#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852
+#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885
+#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980
+#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025
+#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058
+#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078
+#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096
+#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121
+#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128
+#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270
+#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280
+#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398
+#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428
+#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438
+#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459
+#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483
+#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521
+#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530
+#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629
+#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639
+#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696
+#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021
+#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108
+#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200
+#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387
+#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467
+#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554
+#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916
+#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041
+#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071
+#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154
+#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248
+#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286
+#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322
+#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354
+#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390
+#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428
+#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496
+#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579
+#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949
+#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596
+msgid "name"
+msgstr "jméno"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783
+#: sql_help.c:3213 sql_help.c:4193
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250
+#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571
+#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786
+#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984
+#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079
+#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392
+#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482
+#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640
+msgid "new_name"
+msgstr "nové_jméno"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248
+#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618
+#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789
+#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057
+#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332
+#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520
+#: sql_help.c:1635 sql_help.c:2889
+msgid "new_owner"
+msgstr "nový_vlastník"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319
+#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737
+#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095
+#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472
+#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642
+msgid "new_schema"
+msgstr "nové_schéma"
+
+#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222
+msgid "where aggregate_signature is:"
+msgstr "kde aggregate_signature je:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350
+#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516
+#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838
+#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976
+#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801
+#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851
+#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025
+#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218
+#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429
+#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206
+#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229
+msgid "argmode"
+msgstr "mód_argumentu"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351
+#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839
+#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977
+#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802
+#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852
+#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026
+#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219
+#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430
+#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224
+#: sql_help.c:4227 sql_help.c:4230
+msgid "argname"
+msgstr "jméno_argumentu"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352
+#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840
+#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978
+#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803
+#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853
+#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217
+#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403
+#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214
+#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231
+msgid "argtype"
+msgstr "typ_argumentu"
+
+#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926
+#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613
+#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203
+#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341
+#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099
+#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788
+#: sql_help.c:3961 sql_help.c:4658
+msgid "option"
+msgstr "volba"
+
+#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342
+#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262
+msgid "where option can be:"
+msgstr "kde volba může být:"
+
+#: sql_help.c:114 sql_help.c:2137
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138
+#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101
+msgid "connlimit"
+msgstr "connlimit"
+
+#: sql_help.c:116 sql_help.c:2139
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325
+msgid "new_tablespace"
+msgstr "nový_tablespace"
+
+#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546
+#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935
+#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005
+#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590
+#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508
+#: sql_help.c:3980 sql_help.c:4396
+msgid "configuration_parameter"
+msgstr "konfiguraÄní_parametr"
+
+#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484
+#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864
+#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075
+#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141
+#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375
+#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591
+#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253
+#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372
+#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510
+#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783
+#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875
+#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789
+#: sql_help.c:4397 sql_help.c:4398
+msgid "value"
+msgstr "hodnota"
+
+#: sql_help.c:197
+msgid "target_role"
+msgstr "cílová_role"
+
+#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608
+#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762
+#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110
+msgid "schema_name"
+msgstr "jméno_schématu"
+
+#: sql_help.c:199
+msgid "abbreviated_grant_or_revoke"
+msgstr "zkrácený_grant_nebo_revoke"
+
+#: sql_help.c:200
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "kde zkrácený_grant_nebo_revoke je jedno z:"
+
+#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205
+#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210
+#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946
+#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347
+#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483
+#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563
+#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106
+#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772
+#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417
+msgid "role_name"
+msgstr "jméno_role"
+
+#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293
+#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631
+#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270
+#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805
+#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820
+#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283
+#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335
+#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521
+#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573
+#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577
+#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741
+#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793
+#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797
+msgid "expression"
+msgstr "výraz"
+
+#: sql_help.c:239
+msgid "domain_constraint"
+msgstr "omezení_domény"
+
+#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475
+#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315
+#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789
+#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269
+#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832
+msgid "constraint_name"
+msgstr "jméno_omezení"
+
+#: sql_help.c:244 sql_help.c:1269
+msgid "new_constraint_name"
+msgstr "jméno_nového_omezení"
+
+#: sql_help.c:317 sql_help.c:1073
+msgid "new_version"
+msgstr "nová_verze"
+
+#: sql_help.c:321 sql_help.c:323
+msgid "member_object"
+msgstr "Älenský_objekt"
+
+#: sql_help.c:324
+msgid "where member_object is:"
+msgstr "kde Älenský_objekt je:"
+
+#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333
+#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346
+#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360
+#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367
+#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793
+#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797
+#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806
+#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821
+#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831
+#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835
+#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839
+#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194
+#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203
+#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215
+#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219
+#: sql_help.c:4220
+msgid "object_name"
+msgstr "jméno_objektu"
+
+#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072
+#: sql_help.c:2074 sql_help.c:3231
+msgid "source_type"
+msgstr "zdrojový_typ"
+
+#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073
+#: sql_help.c:2075 sql_help.c:3232
+msgid "target_type"
+msgstr "cílový_typ"
+
+#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070
+#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457
+#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311
+#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550
+#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770
+#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781
+msgid "function_name"
+msgstr "jméno_funkce"
+
+#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450
+msgid "operator_name"
+msgstr "jméno_operátoru"
+
+#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808
+#: sql_help.c:2427 sql_help.c:3355
+msgid "left_type"
+msgstr "levý_typ"
+
+#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809
+#: sql_help.c:2428 sql_help.c:3356
+msgid "right_type"
+msgstr "pravý_typ"
+
+#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736
+#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791
+#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447
+#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374
+msgid "index_method"
+msgstr "metoda_indexování"
+
+#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205
+msgid "procedure_name"
+msgstr "procedure_name"
+
+#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211
+msgid "routine_name"
+msgstr "routine_name"
+
+#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304
+#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536
+#: sql_help.c:3766 sql_help.c:4114
+msgid "type_name"
+msgstr "jméno_typu"
+
+#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506
+#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758
+#: sql_help.c:4106
+msgid "lang_name"
+msgstr "jméno_jazyka"
+
+#: sql_help.c:369
+msgid "and aggregate_signature is:"
+msgstr "a aggregate_signature je:"
+
+#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201
+msgid "handler_function"
+msgstr "handler_function"
+
+#: sql_help.c:393 sql_help.c:2202
+msgid "validator_function"
+msgstr "validator_function"
+
+#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979
+#: sql_help.c:1263 sql_help.c:1529
+msgid "action"
+msgstr "akce"
+
+#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458
+#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467
+#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675
+#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265
+#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292
+#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297
+#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305
+#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357
+#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630
+#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788
+#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921
+#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301
+#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633
+#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777
+#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804
+#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849
+#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134
+#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834
+#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086
+#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623
+#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801
+msgid "column_name"
+msgstr "jméno_sloupce"
+
+#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638
+msgid "new_column_name"
+msgstr "nové_jméno_sloupce"
+
+#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000
+#: sql_help.c:1282 sql_help.c:1539
+msgid "where action is one of:"
+msgstr "kde akce je jedno z:"
+
+#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284
+#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156
+#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770
+#: sql_help.c:3043 sql_help.c:3921
+msgid "data_type"
+msgstr "datový_typ"
+
+#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290
+#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247
+#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792
+#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829
+msgid "collation"
+msgstr "collation"
+
+#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257
+#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801
+msgid "column_constraint"
+msgstr "omezení_sloupce"
+
+#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670
+msgid "integer"
+msgstr "integer"
+
+#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306
+#: sql_help.c:1309
+msgid "attribute_option"
+msgstr "volba_atributu"
+
+#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258
+#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802
+msgid "table_constraint"
+msgstr "omezení_tabulky"
+
+#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316
+#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842
+msgid "trigger_name"
+msgstr "jméno_triggeru"
+
+#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330
+#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799
+msgid "parent_table"
+msgstr "nadřízená_tabulka"
+
+#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999
+#: sql_help.c:1498 sql_help.c:2187
+msgid "extension_name"
+msgstr "název_extension"
+
+#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306
+msgid "result_rows"
+msgstr "výsledné_řádky"
+
+#: sql_help.c:543 sql_help.c:2307
+msgid "support_function"
+msgstr "support_funkce"
+
+#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937
+#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588
+#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604
+#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736
+#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747
+#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759
+#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767
+#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088
+#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097
+#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109
+#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117
+#: sql_help.c:4118
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130
+#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427
+msgid "user_name"
+msgstr "uživatel"
+
+#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611
+#: sql_help.c:3771 sql_help.c:4119
+msgid "where role_specification can be:"
+msgstr "kde role_specification může být:"
+
+#: sql_help.c:570
+msgid "group_name"
+msgstr "group_name"
+
+#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376
+#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811
+#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764
+#: sql_help.c:4112
+msgid "tablespace_name"
+msgstr "jméno_tablespace"
+
+#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333
+#: sql_help.c:1371 sql_help.c:1722
+msgid "index_name"
+msgstr "jméno_indexu"
+
+#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326
+#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408
+#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850
+#: sql_help.c:2874
+msgid "storage_parameter"
+msgstr "parametr_uložení"
+
+#: sql_help.c:602
+msgid "column_number"
+msgstr "column_number"
+
+#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202
+msgid "large_object_oid"
+msgstr "oid_large_objektu"
+
+#: sql_help.c:713 sql_help.c:2431
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:714 sql_help.c:2432
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:766 sql_help.c:778 sql_help.c:2449
+msgid "strategy_number"
+msgstr "Äíslo_strategie"
+
+#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779
+#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452
+#: sql_help.c:2455 sql_help.c:2456
+msgid "op_type"
+msgstr "typ_operátoru"
+
+#: sql_help.c:770 sql_help.c:2453
+msgid "sort_family_name"
+msgstr "sort_family_name"
+
+#: sql_help.c:771 sql_help.c:781 sql_help.c:2454
+msgid "support_number"
+msgstr "support_number"
+
+#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965
+#: sql_help.c:2967
+msgid "argument_type"
+msgstr "typ_argumentu"
+
+#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884
+#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497
+#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815
+#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906
+#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405
+#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632
+#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798
+#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391
+#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739
+#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087
+#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348
+#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587
+#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758
+#: sql_help.c:4807
+msgid "table_name"
+msgstr "jméno_tabulky"
+
+#: sql_help.c:811 sql_help.c:2484
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:812 sql_help.c:2485
+msgid "check_expression"
+msgstr "check_expression"
+
+#: sql_help.c:886 sql_help.c:2526
+msgid "publication_parameter"
+msgstr "publication_parameter"
+
+#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558
+#: sql_help.c:3102
+msgid "password"
+msgstr "heslo"
+
+#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559
+#: sql_help.c:3103
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589
+#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744
+#: sql_help.c:4092
+msgid "database_name"
+msgstr "jméno_databáze"
+
+#: sql_help.c:1048 sql_help.c:2627
+msgid "increment"
+msgstr "inkrement"
+
+#: sql_help.c:1049 sql_help.c:2628
+msgid "minvalue"
+msgstr "min_hodnota"
+
+#: sql_help.c:1050 sql_help.c:2629
+msgid "maxvalue"
+msgstr "max_hodnota"
+
+#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385
+#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1052 sql_help.c:1301
+msgid "restart"
+msgstr "restart"
+
+#: sql_help.c:1053 sql_help.c:2631
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1097
+#| msgid "new_table"
+msgid "new_target"
+msgstr "nový_cíl"
+
+#: sql_help.c:1113 sql_help.c:2675
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1115 sql_help.c:2676
+msgid "publication_name"
+msgstr "publication_name"
+
+#: sql_help.c:1116
+msgid "set_publication_option"
+msgstr "set_publication_option"
+
+#: sql_help.c:1119
+msgid "refresh_option"
+msgstr "refresh_option"
+
+#: sql_help.c:1124 sql_help.c:2677
+msgid "subscription_parameter"
+msgstr "subscription_parameter"
+
+#: sql_help.c:1278 sql_help.c:1281
+msgid "partition_name"
+msgstr "partition_name"
+
+#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803
+msgid "partition_bound_spec"
+msgstr "partition_bound_spec"
+
+#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817
+msgid "sequence_options"
+msgstr "sequence_options"
+
+#: sql_help.c:1300
+msgid "sequence_option"
+msgstr "sequence_option"
+
+#: sql_help.c:1312
+msgid "table_constraint_using_index"
+msgstr "omezení_tabulky_s_využitím_indexu"
+
+#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323
+msgid "rewrite_rule_name"
+msgstr "přepisovací_pravidlo"
+
+#: sql_help.c:1334 sql_help.c:2842
+msgid "and partition_bound_spec is:"
+msgstr "a partition_bound_spec je:"
+
+#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843
+#: sql_help.c:2844 sql_help.c:2845
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+#: sql_help.c:1340
+msgid "and column_constraint is:"
+msgstr "a column_constraint je:"
+
+#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505
+#: sql_help.c:2815
+msgid "default_expr"
+msgstr "implicitní_výraz"
+
+#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358
+#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828
+#: sql_help.c:2830 sql_help.c:2834
+msgid "index_parameters"
+msgstr "parametry_indexu"
+
+#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837
+msgid "reftable"
+msgstr "odkazovaná_tabulka"
+
+#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838
+msgid "refcolumn"
+msgstr "odkazovaný_sloupec"
+
+#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368
+#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840
+msgid "referential_action"
+msgstr "referential_action"
+
+#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824
+msgid "and table_constraint is:"
+msgstr "a omezení_tabulky je:"
+
+#: sql_help.c:1360 sql_help.c:2832
+msgid "exclude_element"
+msgstr "exclude_element"
+
+#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383
+#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752
+msgid "operator"
+msgstr "operátor"
+
+#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835
+msgid "predicate"
+msgstr "predikát"
+
+#: sql_help.c:1369
+msgid "and table_constraint_using_index is:"
+msgstr "a omezení_tabulky_s_využitím_indexu je:"
+
+#: sql_help.c:1372 sql_help.c:2848
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parametry_indexu v UNIQUE, PRIMARY KEY, a EXCLUDE omezeních jsou:"
+
+#: sql_help.c:1377 sql_help.c:2853
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "exclude_element v EXCLUDE omezení je:"
+
+#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793
+#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830
+msgid "opclass"
+msgstr "třída_operátoru"
+
+#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891
+msgid "tablespace_option"
+msgstr "volba_tablespace"
+
+#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433
+msgid "token_type"
+msgstr "typ_tokenu"
+
+#: sql_help.c:1421 sql_help.c:1424
+msgid "dictionary_name"
+msgstr "jméno_slovníku"
+
+#: sql_help.c:1426 sql_help.c:1430
+msgid "old_dictionary"
+msgstr "starý_slovník"
+
+#: sql_help.c:1427 sql_help.c:1431
+msgid "new_dictionary"
+msgstr "nový_slovník"
+
+#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544
+#: sql_help.c:3042
+msgid "attribute_name"
+msgstr "jméno_atributu"
+
+#: sql_help.c:1527
+msgid "new_attribute_name"
+msgstr "nové_jméno_atributu"
+
+#: sql_help.c:1531 sql_help.c:1535
+msgid "new_enum_value"
+msgstr "nová_enum_hodnota"
+
+#: sql_help.c:1532
+msgid "neighbor_enum_value"
+msgstr "neighbor_enum_value"
+
+#: sql_help.c:1534
+msgid "existing_enum_value"
+msgstr "existing_enum_value"
+
+#: sql_help.c:1537
+#| msgid "operator"
+msgid "property"
+msgstr "vlastnost"
+
+#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643
+#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786
+#: sql_help.c:4098
+msgid "server_name"
+msgstr "jméno_serveru"
+
+#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135
+msgid "view_option_name"
+msgstr "název_volby_pohledu"
+
+#: sql_help.c:1645 sql_help.c:3136
+msgid "view_option_value"
+msgstr "hodnota_volby_pohledu"
+
+#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660
+msgid "table_and_columns"
+msgstr "table_and_columns"
+
+#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963
+#: sql_help.c:4661
+msgid "where option can be one of:"
+msgstr "kde volba je jedno z:"
+
+#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917
+#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622
+#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626
+#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668
+#: sql_help.c:4669
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1671 sql_help.c:4671
+msgid "and table_and_columns is:"
+msgstr "a table_and_columns je:"
+
+#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469
+msgid "transaction_mode"
+msgstr "transakÄní_mód"
+
+#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470
+msgid "where transaction_mode is one of:"
+msgstr "kde transakÄní_mód je jedno z:"
+
+#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316
+#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551
+#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762
+#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1787
+msgid "relation_name"
+msgstr "název_relace"
+
+#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094
+msgid "domain_name"
+msgstr "jméno_domény"
+
+#: sql_help.c:1814
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1827
+msgid "rule_name"
+msgstr "jméno_pravidla"
+
+#: sql_help.c:1846
+msgid "text"
+msgstr "text"
+
+#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135
+msgid "transaction_id"
+msgstr "id_transakce"
+
+#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856
+msgid "filename"
+msgstr "jméno_souboru"
+
+#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584
+#: sql_help.c:2585
+msgid "command"
+msgstr "příkaz"
+
+#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171
+#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376
+#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630
+#: sql_help.c:4745 sql_help.c:4747
+msgid "condition"
+msgstr "podmínka"
+
+#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137
+#: sql_help.c:3155 sql_help.c:3821
+msgid "query"
+msgstr "dotaz"
+
+#: sql_help.c:1913
+msgid "format_name"
+msgstr "jméno_formátu"
+
+#: sql_help.c:1915
+msgid "delimiter_character"
+msgstr "oddělovací_znak"
+
+#: sql_help.c:1916
+msgid "null_string"
+msgstr "null_string"
+
+#: sql_help.c:1918
+msgid "quote_character"
+msgstr "quote_character"
+
+#: sql_help.c:1919
+msgid "escape_character"
+msgstr "escape_character"
+
+#: sql_help.c:1923
+msgid "encoding_name"
+msgstr "název_kódování"
+
+#: sql_help.c:1934
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037
+msgid "state_data_type"
+msgstr "datový_typ_stavu"
+
+#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2010 sql_help.c:2040
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2011 sql_help.c:2041
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2012 sql_help.c:2042
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043
+msgid "initial_condition"
+msgstr "výchozí_podmínka"
+
+#: sql_help.c:2014 sql_help.c:2044
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2015 sql_help.c:2045
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2016 sql_help.c:2046
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2017 sql_help.c:2047
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2018 sql_help.c:2048
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2019 sql_help.c:2049
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2020 sql_help.c:2050
+msgid "sort_operator"
+msgstr "operátor_třídění"
+
+#: sql_help.c:2033
+msgid "or the old syntax"
+msgstr "nebo stará syntaxe"
+
+#: sql_help.c:2035
+msgid "base_type"
+msgstr "základní_typ"
+
+#: sql_help.c:2092 sql_help.c:2133
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2093 sql_help.c:2134
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2094 sql_help.c:2135
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2095 sql_help.c:4188
+msgid "provider"
+msgstr "provider"
+
+#: sql_help.c:2097 sql_help.c:2189
+msgid "version"
+msgstr "verze"
+
+#: sql_help.c:2099
+msgid "existing_collation"
+msgstr "existující_collation"
+
+#: sql_help.c:2109
+msgid "source_encoding"
+msgstr "kódování_zdroje"
+
+#: sql_help.c:2110
+msgid "dest_encoding"
+msgstr "kódování_cíle"
+
+#: sql_help.c:2131 sql_help.c:2917
+msgid "template"
+msgstr "Å¡ablona"
+
+#: sql_help.c:2132
+msgid "encoding"
+msgstr "kódování"
+
+#: sql_help.c:2159
+msgid "constraint"
+msgstr "omezení"
+
+#: sql_help.c:2160
+msgid "where constraint is:"
+msgstr "kde omezení je:"
+
+#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990
+msgid "event"
+msgstr "událost"
+
+#: sql_help.c:2175
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2263 sql_help.c:2812
+msgid "where column_constraint is:"
+msgstr "kde omezení_sloupce je:"
+
+#: sql_help.c:2300
+msgid "rettype"
+msgstr "návratový_typ"
+
+#: sql_help.c:2302
+msgid "column_type"
+msgstr "typ_sloupce"
+
+#: sql_help.c:2311 sql_help.c:2511
+msgid "definition"
+msgstr "definice"
+
+#: sql_help.c:2312 sql_help.c:2512
+msgid "obj_file"
+msgstr "obj_file"
+
+#: sql_help.c:2313 sql_help.c:2513
+msgid "link_symbol"
+msgstr "link_symbol"
+
+#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794
+#: sql_help.c:2808 sql_help.c:2873
+msgid "method"
+msgstr "metoda"
+
+#: sql_help.c:2371
+#| msgid "storage_parameter"
+msgid "opclass_parameter"
+msgstr "opclass_parametr"
+
+#: sql_help.c:2388
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2389
+msgid "inline_handler"
+msgstr "inline_handler"
+
+#: sql_help.c:2390
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2429
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2430
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2448
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2459
+msgid "storage_type"
+msgstr "typ_uložení"
+
+#: sql_help.c:2586 sql_help.c:2997
+msgid "where event can be one of:"
+msgstr "kde událost může být jedno z:"
+
+#: sql_help.c:2605 sql_help.c:2607
+msgid "schema_element"
+msgstr "prvek_schématu"
+
+#: sql_help.c:2644
+msgid "server_type"
+msgstr "typ_serveru"
+
+#: sql_help.c:2645
+msgid "server_version"
+msgstr "verze_serveru"
+
+#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096
+msgid "fdw_name"
+msgstr "fdw_jméno"
+
+#: sql_help.c:2659
+msgid "statistics_name"
+msgstr "statistics_name"
+
+#: sql_help.c:2660
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+#: sql_help.c:2674
+msgid "subscription_name"
+msgstr "subscription_name"
+
+#: sql_help.c:2774
+msgid "source_table"
+msgstr "zdrojová_tabulka"
+
+#: sql_help.c:2775
+msgid "like_option"
+msgstr "like_volba"
+
+#: sql_help.c:2841
+msgid "and like_option is:"
+msgstr "a like_volba je:"
+
+#: sql_help.c:2890
+msgid "directory"
+msgstr "adresář"
+
+#: sql_help.c:2904
+msgid "parser_name"
+msgstr "jméno_parseru"
+
+#: sql_help.c:2905
+msgid "source_config"
+msgstr "source_config"
+
+#: sql_help.c:2934
+msgid "start_function"
+msgstr "start_funkce"
+
+#: sql_help.c:2935
+msgid "gettoken_function"
+msgstr "gettoken_funkce"
+
+#: sql_help.c:2936
+msgid "end_function"
+msgstr "end_function"
+
+#: sql_help.c:2937
+msgid "lextypes_function"
+msgstr "lextypes_funkce"
+
+#: sql_help.c:2938
+msgid "headline_function"
+msgstr "headline_funkce"
+
+#: sql_help.c:2950
+msgid "init_function"
+msgstr "init_funkce"
+
+#: sql_help.c:2951
+msgid "lexize_function"
+msgstr "lexize_funkce"
+
+#: sql_help.c:2964
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:2966
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:2992
+msgid "referenced_table_name"
+msgstr "jméno_odkazované_tabulky"
+
+#: sql_help.c:2993
+msgid "transition_relation_name"
+msgstr "transition_relation_name"
+
+#: sql_help.c:2996
+msgid "arguments"
+msgstr "argumenty"
+
+#: sql_help.c:3046 sql_help.c:4221
+msgid "label"
+msgstr "popisek"
+
+#: sql_help.c:3048
+msgid "subtype"
+msgstr "subtyp"
+
+#: sql_help.c:3049
+msgid "subtype_operator_class"
+msgstr "třída_operátorů_subtypu"
+
+#: sql_help.c:3051
+msgid "canonical_function"
+msgstr "kanonická_funkce"
+
+#: sql_help.c:3052
+msgid "subtype_diff_function"
+msgstr "diff_funkce_subtypu"
+
+#: sql_help.c:3054
+msgid "input_function"
+msgstr "vstupní_funkce"
+
+#: sql_help.c:3055
+msgid "output_function"
+msgstr "výstupní_funkce"
+
+#: sql_help.c:3056
+msgid "receive_function"
+msgstr "receive_funkce"
+
+#: sql_help.c:3057
+msgid "send_function"
+msgstr "send_funkce"
+
+#: sql_help.c:3058
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3059
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3060
+msgid "analyze_function"
+msgstr "analyze_funkce"
+
+#: sql_help.c:3061
+msgid "internallength"
+msgstr "interní_délka"
+
+#: sql_help.c:3062
+msgid "alignment"
+msgstr "zarovnání"
+
+#: sql_help.c:3063
+msgid "storage"
+msgstr "uložení"
+
+#: sql_help.c:3064
+msgid "like_type"
+msgstr "like_typ"
+
+#: sql_help.c:3065
+msgid "category"
+msgstr "kategorie"
+
+#: sql_help.c:3066
+msgid "preferred"
+msgstr "preferovaný"
+
+#: sql_help.c:3067
+msgid "default"
+msgstr "implicitní"
+
+#: sql_help.c:3068
+msgid "element"
+msgstr "prvek"
+
+#: sql_help.c:3069
+msgid "delimiter"
+msgstr "oddÄ›lovaÄ"
+
+#: sql_help.c:3070
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370
+#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740
+msgid "with_query"
+msgstr "with_dotaz"
+
+#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306
+#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325
+#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552
+#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759
+#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776
+#: sql_help.c:4784
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329
+#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568
+#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788
+msgid "from_item"
+msgstr "z_položky"
+
+#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631
+msgid "cursor_name"
+msgstr "jméno_kurzoru"
+
+#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632
+msgid "output_expression"
+msgstr "výstupní_výraz"
+
+#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373
+#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743
+msgid "output_name"
+msgstr "výstupní_jméno"
+
+#: sql_help.c:3190
+msgid "code"
+msgstr "kód"
+
+#: sql_help.c:3595
+msgid "parameter"
+msgstr "parametr"
+
+#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922
+msgid "statement"
+msgstr "příkaz"
+
+#: sql_help.c:3652 sql_help.c:3896
+msgid "direction"
+msgstr "směr"
+
+#: sql_help.c:3654 sql_help.c:3898
+msgid "where direction can be empty or one of:"
+msgstr "kde směr může být prázdný nebo jedno z:"
+
+#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658
+#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901
+#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535
+#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755
+msgid "count"
+msgstr "poÄet"
+
+#: sql_help.c:3741 sql_help.c:4089
+msgid "sequence_name"
+msgstr "sekvence"
+
+#: sql_help.c:3754 sql_help.c:4102
+msgid "arg_name"
+msgstr "jméno_argumentu"
+
+#: sql_help.c:3755 sql_help.c:4103
+msgid "arg_type"
+msgstr "typ_argumentu"
+
+#: sql_help.c:3760 sql_help.c:4108
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3784
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3787
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3822
+msgid "conflict_target"
+msgstr "conflict_target"
+
+#: sql_help.c:3823
+msgid "conflict_action"
+msgstr "conflict_action"
+
+#: sql_help.c:3826
+msgid "where conflict_target can be one of:"
+msgstr "where conflict_target can be one of:"
+
+#: sql_help.c:3827
+msgid "index_column_name"
+msgstr "index_column_name"
+
+#: sql_help.c:3828
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:3831
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:3833
+msgid "and conflict_action is one of:"
+msgstr "a conflict_action je jedno z:"
+
+#: sql_help.c:3839 sql_help.c:4628
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604
+msgid "channel"
+msgstr "kanál"
+
+#: sql_help.c:3870
+msgid "lockmode"
+msgstr "mód_zámku"
+
+#: sql_help.c:3871
+msgid "where lockmode is one of:"
+msgstr "kde mód_zámku je jedno z:"
+
+#: sql_help.c:3912
+msgid "payload"
+msgstr "náklad"
+
+#: sql_help.c:3939
+msgid "old_role"
+msgstr "stará_role"
+
+#: sql_help.c:3940
+msgid "new_role"
+msgstr "nová_role"
+
+#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151
+msgid "savepoint_name"
+msgstr "jméno_savepointu"
+
+#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578
+#: sql_help.c:4746 sql_help.c:4798
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748
+msgid "window_name"
+msgstr "jméno_okna"
+
+#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749
+msgid "window_definition"
+msgstr "definice_okna"
+
+#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381
+#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750
+#: sql_help.c:4764 sql_help.c:4802
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757
+msgid "where from_item can be one of:"
+msgstr "kde z_položky může být jedno z:"
+
+#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314
+#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549
+#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766
+#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785
+msgid "column_alias"
+msgstr "alias_sloupce"
+
+#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580
+#: sql_help.c:4767 sql_help.c:4800
+msgid "with_query_name"
+msgstr "jméno_with_dotazu"
+
+#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557
+#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780
+#: sql_help.c:4783
+msgid "column_definition"
+msgstr "definice_sloupce"
+
+#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787
+msgid "join_type"
+msgstr "typ_joinu"
+
+#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789
+msgid "join_condition"
+msgstr "joinovací_podmínka"
+
+#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790
+msgid "join_column"
+msgstr "joinovací_sloupec"
+
+#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791
+msgid "and grouping_element can be one of:"
+msgstr "a grouping_element může být jedno z:"
+
+#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799
+msgid "and with_query is:"
+msgstr "a with_dotaz je:"
+
+#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803
+msgid "values"
+msgstr "hodnoty"
+
+#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4374
+msgid "new_table"
+msgstr "nová_tabulka"
+
+#: sql_help.c:4399
+msgid "timezone"
+msgstr "Äasová_zóna"
+
+#: sql_help.c:4444
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:4686
+msgid "sort_expression"
+msgstr "sort_expression"
+
+#: sql_help.c:4813 sql_help.c:5791
+msgid "abort the current transaction"
+msgstr "nestandardní ukonÄení (abort) souÄasné transakce"
+
+#: sql_help.c:4819
+msgid "change the definition of an aggregate function"
+msgstr "změna definice agregátní funkce"
+
+#: sql_help.c:4825
+msgid "change the definition of a collation"
+msgstr "změní definici collation"
+
+#: sql_help.c:4831
+msgid "change the definition of a conversion"
+msgstr "změna definice konverze"
+
+#: sql_help.c:4837
+msgid "change a database"
+msgstr "změní databázi"
+
+#: sql_help.c:4843
+msgid "define default access privileges"
+msgstr "definuje výchozí přístupová práva"
+
+#: sql_help.c:4849
+msgid "change the definition of a domain"
+msgstr "změní definici domény"
+
+#: sql_help.c:4855
+msgid "change the definition of an event trigger"
+msgstr "změní definici event triggeru"
+
+#: sql_help.c:4861
+msgid "change the definition of an extension"
+msgstr "změna definice extension"
+
+#: sql_help.c:4867
+msgid "change the definition of a foreign-data wrapper"
+msgstr "změní definici foreign-data wrapperu"
+
+#: sql_help.c:4873
+msgid "change the definition of a foreign table"
+msgstr "změní definici foreign tabulky"
+
+#: sql_help.c:4879
+msgid "change the definition of a function"
+msgstr "změní definici funkce"
+
+#: sql_help.c:4885
+msgid "change role name or membership"
+msgstr "zmÄ›ní jméno role nebo Älenství"
+
+#: sql_help.c:4891
+msgid "change the definition of an index"
+msgstr "změní definici indexu"
+
+#: sql_help.c:4897
+msgid "change the definition of a procedural language"
+msgstr "změní definici procedurálního jazyka"
+
+#: sql_help.c:4903
+msgid "change the definition of a large object"
+msgstr "změní definici large objektu"
+
+#: sql_help.c:4909
+msgid "change the definition of a materialized view"
+msgstr "změní definici materializovaného pohledu"
+
+#: sql_help.c:4915
+msgid "change the definition of an operator"
+msgstr "změní definici operátoru"
+
+#: sql_help.c:4921
+msgid "change the definition of an operator class"
+msgstr "změní definici třídy operátorů"
+
+#: sql_help.c:4927
+msgid "change the definition of an operator family"
+msgstr "změní definici rodiny operátorů"
+
+#: sql_help.c:4933
+msgid "change the definition of a row level security policy"
+msgstr "změní definici row level security politiky"
+
+#: sql_help.c:4939
+msgid "change the definition of a procedure"
+msgstr "změní definici procedury"
+
+#: sql_help.c:4945
+msgid "change the definition of a publication"
+msgstr "změní definici publikace"
+
+#: sql_help.c:4951 sql_help.c:5053
+msgid "change a database role"
+msgstr "změní databázovou roli"
+
+#: sql_help.c:4957
+msgid "change the definition of a routine"
+msgstr "změní definici rutiny"
+
+#: sql_help.c:4963
+msgid "change the definition of a rule"
+msgstr "změní definici pravidla"
+
+#: sql_help.c:4969
+msgid "change the definition of a schema"
+msgstr "změní definici schématu"
+
+#: sql_help.c:4975
+msgid "change the definition of a sequence generator"
+msgstr "změní definici generátoru sekvencí"
+
+#: sql_help.c:4981
+msgid "change the definition of a foreign server"
+msgstr "změní definici foreign serveru"
+
+#: sql_help.c:4987
+msgid "change the definition of an extended statistics object"
+msgstr "změna definice rozšířené statistiky"
+
+#: sql_help.c:4993
+msgid "change the definition of a subscription"
+msgstr "změní definici subskripce"
+
+#: sql_help.c:4999
+msgid "change a server configuration parameter"
+msgstr "zmÄ›ní serverový konfiguraÄní parametr"
+
+#: sql_help.c:5005
+msgid "change the definition of a table"
+msgstr "změní definici tabulky"
+
+#: sql_help.c:5011
+msgid "change the definition of a tablespace"
+msgstr "změní definici tablespace"
+
+#: sql_help.c:5017
+msgid "change the definition of a text search configuration"
+msgstr "změní definici konfigurace fulltextového vyhledávání"
+
+#: sql_help.c:5023
+msgid "change the definition of a text search dictionary"
+msgstr "změní definici slovníku pro fulltextové vyhledávání"
+
+#: sql_help.c:5029
+msgid "change the definition of a text search parser"
+msgstr "změní definici parseru pro fulltextové vyhledávání"
+
+#: sql_help.c:5035
+msgid "change the definition of a text search template"
+msgstr "změní definici šablony pro fulltextové vyhledávání"
+
+#: sql_help.c:5041
+msgid "change the definition of a trigger"
+msgstr "změní definici triggeru"
+
+#: sql_help.c:5047
+msgid "change the definition of a type"
+msgstr "změní definici datového typu"
+
+#: sql_help.c:5059
+msgid "change the definition of a user mapping"
+msgstr "změní definici mapování uživatelů"
+
+#: sql_help.c:5065
+msgid "change the definition of a view"
+msgstr "změní definici pohledu"
+
+#: sql_help.c:5071
+msgid "collect statistics about a database"
+msgstr "shromáždí statistické informace o databázi"
+
+#: sql_help.c:5077 sql_help.c:5869
+msgid "start a transaction block"
+msgstr "nastartuje nový transakÄní blok"
+
+#: sql_help.c:5083
+msgid "invoke a procedure"
+msgstr "spustí proceduru"
+
+#: sql_help.c:5089
+msgid "force a write-ahead log checkpoint"
+msgstr "vynutí checkpoint transakÄního logu"
+
+#: sql_help.c:5095
+msgid "close a cursor"
+msgstr "uzavře kursor"
+
+#: sql_help.c:5101
+msgid "cluster a table according to an index"
+msgstr "přerovná obsah tabulky dle indexu"
+
+#: sql_help.c:5107
+msgid "define or change the comment of an object"
+msgstr "definuje nebo změní komentář objektu"
+
+#: sql_help.c:5113 sql_help.c:5671
+msgid "commit the current transaction"
+msgstr "potvrzení aktuální transakce"
+
+#: sql_help.c:5119
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "potvrzení aktuální transakce, která byla již dříve připravena pro dvoufázový commit"
+
+#: sql_help.c:5125
+msgid "copy data between a file and a table"
+msgstr "kopíruje data mezi souborem a tabulkou"
+
+#: sql_help.c:5131
+msgid "define a new access method"
+msgstr "definuje novou přístupovou metodu"
+
+#: sql_help.c:5137
+msgid "define a new aggregate function"
+msgstr "definuje novou agrefunkci"
+
+#: sql_help.c:5143
+msgid "define a new cast"
+msgstr "definuje nové přetypování"
+
+#: sql_help.c:5149
+msgid "define a new collation"
+msgstr "definuje novou collation"
+
+#: sql_help.c:5155
+msgid "define a new encoding conversion"
+msgstr "definuje novou konverzi kódování"
+
+#: sql_help.c:5161
+msgid "create a new database"
+msgstr "vytvoří novou databázi"
+
+#: sql_help.c:5167
+msgid "define a new domain"
+msgstr "definuje novou atributovou doménu"
+
+#: sql_help.c:5173
+msgid "define a new event trigger"
+msgstr "definuje nový event trigger"
+
+#: sql_help.c:5179
+msgid "install an extension"
+msgstr "instaluje rozšíření"
+
+#: sql_help.c:5185
+msgid "define a new foreign-data wrapper"
+msgstr "definuje nový foreign-data wrapper"
+
+#: sql_help.c:5191
+msgid "define a new foreign table"
+msgstr "definuje nový foreign tabulku"
+
+#: sql_help.c:5197
+msgid "define a new function"
+msgstr "definuje novou funkci"
+
+#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365
+msgid "define a new database role"
+msgstr "definuje novou databázovou roli"
+
+#: sql_help.c:5209
+msgid "define a new index"
+msgstr "definuje nový index"
+
+#: sql_help.c:5215
+msgid "define a new procedural language"
+msgstr "definuje nový procedurální jazyk"
+
+#: sql_help.c:5221
+msgid "define a new materialized view"
+msgstr "definuje nový materializovaný pohled"
+
+#: sql_help.c:5227
+msgid "define a new operator"
+msgstr "definuje nový operátor"
+
+#: sql_help.c:5233
+msgid "define a new operator class"
+msgstr "definuje novou třídu operátorů"
+
+#: sql_help.c:5239
+msgid "define a new operator family"
+msgstr "definuje novou rodinu operátorů"
+
+#: sql_help.c:5245
+msgid "define a new row level security policy for a table"
+msgstr "definute novou row level security politiku pro tabulku"
+
+#: sql_help.c:5251
+msgid "define a new procedure"
+msgstr "definuje novou proceduru"
+
+#: sql_help.c:5257
+msgid "define a new publication"
+msgstr "definuje novou publikaci"
+
+#: sql_help.c:5269
+msgid "define a new rewrite rule"
+msgstr "definuje nové přepisovací pravidlo (rule)"
+
+#: sql_help.c:5275
+msgid "define a new schema"
+msgstr "definuje nové schéma"
+
+#: sql_help.c:5281
+msgid "define a new sequence generator"
+msgstr "definuje nový generátor sekvencí"
+
+#: sql_help.c:5287
+msgid "define a new foreign server"
+msgstr "definuje nový foreign server"
+
+#: sql_help.c:5293
+msgid "define extended statistics"
+msgstr "definuje nové rozšířené statistiky"
+
+#: sql_help.c:5299
+msgid "define a new subscription"
+msgstr "definuje novou subskripci"
+
+#: sql_help.c:5305
+msgid "define a new table"
+msgstr "definuje novou tabulku"
+
+#: sql_help.c:5311 sql_help.c:5827
+msgid "define a new table from the results of a query"
+msgstr "definuje novou tabulku dle výsledku dotazu"
+
+#: sql_help.c:5317
+msgid "define a new tablespace"
+msgstr "definuje nový tablespace"
+
+#: sql_help.c:5323
+msgid "define a new text search configuration"
+msgstr "definuje novou konfiguraci fulltextového vyhledávání"
+
+#: sql_help.c:5329
+msgid "define a new text search dictionary"
+msgstr "definuje nový slovník pro fulltextové vyhledávání"
+
+#: sql_help.c:5335
+msgid "define a new text search parser"
+msgstr "definuje nový parser pro fulltextové vyhledávání"
+
+#: sql_help.c:5341
+msgid "define a new text search template"
+msgstr "definuje novou šablonu pro fulltextové vyhledávání"
+
+#: sql_help.c:5347
+msgid "define a new transform"
+msgstr "definuje novou transformaci"
+
+#: sql_help.c:5353
+msgid "define a new trigger"
+msgstr "definuje nový trigger"
+
+#: sql_help.c:5359
+msgid "define a new data type"
+msgstr "definuje nový datový typ"
+
+#: sql_help.c:5371
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definuje nové mapování uživatele na vzdálený server"
+
+#: sql_help.c:5377
+msgid "define a new view"
+msgstr "definuje nový pohled"
+
+#: sql_help.c:5383
+msgid "deallocate a prepared statement"
+msgstr "dealokuje připravený dotaz (prepared statement)"
+
+#: sql_help.c:5389
+msgid "define a cursor"
+msgstr "definuje kursor"
+
+#: sql_help.c:5395
+msgid "delete rows of a table"
+msgstr "smaže řádky z takulky"
+
+#: sql_help.c:5401
+msgid "discard session state"
+msgstr "zahodí stav session"
+
+#: sql_help.c:5407
+msgid "execute an anonymous code block"
+msgstr "spustí anonymní blok kódu"
+
+#: sql_help.c:5413
+msgid "remove an access method"
+msgstr "odstraní definici přístupové metody"
+
+#: sql_help.c:5419
+msgid "remove an aggregate function"
+msgstr "odstraní agregaÄní funkci"
+
+#: sql_help.c:5425
+msgid "remove a cast"
+msgstr "odstraní definici přetypování"
+
+#: sql_help.c:5431
+msgid "remove a collation"
+msgstr "odstraní collation"
+
+#: sql_help.c:5437
+msgid "remove a conversion"
+msgstr "odstraní konverzi"
+
+#: sql_help.c:5443
+msgid "remove a database"
+msgstr "odstraní databázi"
+
+#: sql_help.c:5449
+msgid "remove a domain"
+msgstr "odstraní doménu"
+
+#: sql_help.c:5455
+msgid "remove an event trigger"
+msgstr "odstraní event trigger"
+
+#: sql_help.c:5461
+msgid "remove an extension"
+msgstr "odstraní extension"
+
+#: sql_help.c:5467
+msgid "remove a foreign-data wrapper"
+msgstr "odstraní foreign-data wrapper"
+
+#: sql_help.c:5473
+msgid "remove a foreign table"
+msgstr "odstraní foreign tabulku"
+
+#: sql_help.c:5479
+msgid "remove a function"
+msgstr "odstraní funkci"
+
+#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653
+msgid "remove a database role"
+msgstr "odstraní databázovou roli"
+
+#: sql_help.c:5491
+msgid "remove an index"
+msgstr "odstraní index"
+
+#: sql_help.c:5497
+msgid "remove a procedural language"
+msgstr "odstraní procedurální jazyk"
+
+#: sql_help.c:5503
+msgid "remove a materialized view"
+msgstr "odstraní materializovaný pohled"
+
+#: sql_help.c:5509
+msgid "remove an operator"
+msgstr "odstraní operátor"
+
+#: sql_help.c:5515
+msgid "remove an operator class"
+msgstr "odstraní třídu operátorů"
+
+#: sql_help.c:5521
+msgid "remove an operator family"
+msgstr "odstraní rodinu operátorů"
+
+#: sql_help.c:5527
+msgid "remove database objects owned by a database role"
+msgstr "odstraní objekty vlastněné databázovou rolí"
+
+#: sql_help.c:5533
+msgid "remove a row level security policy from a table"
+msgstr "odstraní row level security politiku z tabulky"
+
+#: sql_help.c:5539
+msgid "remove a procedure"
+msgstr "odstraní proceduru"
+
+#: sql_help.c:5545
+msgid "remove a publication"
+msgstr "odstraní publikaci"
+
+#: sql_help.c:5557
+msgid "remove a routine"
+msgstr "odstraní rutinu"
+
+#: sql_help.c:5563
+msgid "remove a rewrite rule"
+msgstr "odstraní přepisovací pravidlo (rule)"
+
+#: sql_help.c:5569
+msgid "remove a schema"
+msgstr "odstraní schéma"
+
+#: sql_help.c:5575
+msgid "remove a sequence"
+msgstr "odstraní sekvenci"
+
+#: sql_help.c:5581
+msgid "remove a foreign server descriptor"
+msgstr "odstraní deskriptor foreign serveru"
+
+#: sql_help.c:5587
+msgid "remove extended statistics"
+msgstr "odstraní rozšířené statistiky"
+
+#: sql_help.c:5593
+msgid "remove a subscription"
+msgstr "odstraní subskripci"
+
+#: sql_help.c:5599
+msgid "remove a table"
+msgstr "odstraní tabulku"
+
+#: sql_help.c:5605
+msgid "remove a tablespace"
+msgstr "odstraní tablespace"
+
+#: sql_help.c:5611
+msgid "remove a text search configuration"
+msgstr "odstraní konfiguraci fulltextového vyhledávání"
+
+#: sql_help.c:5617
+msgid "remove a text search dictionary"
+msgstr "odstraní slovn?ik pro fulltextové vyhledávání"
+
+#: sql_help.c:5623
+msgid "remove a text search parser"
+msgstr "odstraní parser pro fulltextové vyhledávání"
+
+#: sql_help.c:5629
+msgid "remove a text search template"
+msgstr "odstraní Šablonu fulltextového vyhledávání"
+
+#: sql_help.c:5635
+msgid "remove a transform"
+msgstr "odstraní transformaci"
+
+#: sql_help.c:5641
+msgid "remove a trigger"
+msgstr "odstraní trigger"
+
+#: sql_help.c:5647
+msgid "remove a data type"
+msgstr "odstraní datový typ"
+
+#: sql_help.c:5659
+msgid "remove a user mapping for a foreign server"
+msgstr "odstraní mapování uživatele z foreign serveru"
+
+#: sql_help.c:5665
+msgid "remove a view"
+msgstr "odstraní náhled"
+
+#: sql_help.c:5677
+msgid "execute a prepared statement"
+msgstr "provede připravený dotaz (prepared statement)"
+
+#: sql_help.c:5683
+msgid "show the execution plan of a statement"
+msgstr "ukáže prováděcí plán dotazu"
+
+#: sql_help.c:5689
+msgid "retrieve rows from a query using a cursor"
+msgstr "naÄte řádky z výsledku dotazu pomocí kursoru"
+
+#: sql_help.c:5695
+msgid "define access privileges"
+msgstr "definuje přístupová práva"
+
+#: sql_help.c:5701
+msgid "import table definitions from a foreign server"
+msgstr "importuje definice tabulek z foreign serveru"
+
+#: sql_help.c:5707
+msgid "create new rows in a table"
+msgstr "přidá nové řádky do tabulky"
+
+#: sql_help.c:5713
+msgid "listen for a notification"
+msgstr "naslouchá upozorněním"
+
+#: sql_help.c:5719
+msgid "load a shared library file"
+msgstr "naÄte sdílenou knihovnu"
+
+#: sql_help.c:5725
+msgid "lock a named relation (table, etc)"
+msgstr "zamkne uvedenou relaci (tabulku, etc)"
+
+#: sql_help.c:5731
+msgid "position a cursor"
+msgstr "přemístí kursor"
+
+#: sql_help.c:5737
+msgid "generate a notification"
+msgstr "generuje upozornění"
+
+#: sql_help.c:5743
+msgid "prepare a statement for execution"
+msgstr "připraví a uloží dotaz pro provedení"
+
+#: sql_help.c:5749
+msgid "prepare the current transaction for two-phase commit"
+msgstr "přípraví aktuální transakci pro dvoufázoví commit"
+
+#: sql_help.c:5755
+msgid "change the ownership of database objects owned by a database role"
+msgstr "změní vlastníka databázových objektů vlastněných databázovou rolí"
+
+#: sql_help.c:5761
+msgid "replace the contents of a materialized view"
+msgstr "nahraÄ obsah materializovaného pohledu"
+
+#: sql_help.c:5767
+msgid "rebuild indexes"
+msgstr "znovuvytvoří indexy"
+
+#: sql_help.c:5773
+msgid "destroy a previously defined savepoint"
+msgstr "odstraní dříve vytvořený savepoint"
+
+#: sql_help.c:5779
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "přenastaví parametr běhu na implicitní hodnotu"
+
+#: sql_help.c:5785
+msgid "remove access privileges"
+msgstr "odstraní přístupová práva"
+
+#: sql_help.c:5797
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "zruší transakci, která byla připravena pro dvoufázový commit"
+
+#: sql_help.c:5803
+msgid "roll back to a savepoint"
+msgstr "vrátí se na savepoint"
+
+#: sql_help.c:5809
+msgid "define a new savepoint within the current transaction"
+msgstr "definuje nový savepoint uvnitř aktuální transakce"
+
+#: sql_help.c:5815
+msgid "define or change a security label applied to an object"
+msgstr "definuje nebo zmÄ›ní bezpeÄnostní Å¡títek aplikovaný na objekt"
+
+#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911
+msgid "retrieve rows from a table or view"
+msgstr "vybere řádky z tabulky nebo náhledu"
+
+#: sql_help.c:5833
+msgid "change a run-time parameter"
+msgstr "změní parametry běhu"
+
+#: sql_help.c:5839
+msgid "set constraint check timing for the current transaction"
+msgstr "nastaví mód kontroly omezení (constraints) pro aktuální transakci"
+
+#: sql_help.c:5845
+msgid "set the current user identifier of the current session"
+msgstr "nastaví uživatelský identifikátor aktuální session"
+
+#: sql_help.c:5851
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "nastaví uživatelský identifikátor session a identifikátor aktuálníhouživatele pro aktuální session"
+
+#: sql_help.c:5857
+msgid "set the characteristics of the current transaction"
+msgstr "nastaví charakteristiku pro aktualní trasakci"
+
+#: sql_help.c:5863
+msgid "show the value of a run-time parameter"
+msgstr "zobrazí hodnoty run-time parametrů"
+
+#: sql_help.c:5881
+msgid "empty a table or set of tables"
+msgstr "zruší obsah tabulky nebo skupiny tabulek"
+
+#: sql_help.c:5887
+msgid "stop listening for a notification"
+msgstr "ukonÄí naslouchání pÅ™ipomínkám"
+
+#: sql_help.c:5893
+msgid "update rows of a table"
+msgstr "aktualizuje řádky tabulky"
+
+#: sql_help.c:5899
+msgid "garbage-collect and optionally analyze a database"
+msgstr "provede úklid a případně analýzu databáze"
+
+#: sql_help.c:5905
+msgid "compute a set of rows"
+msgstr "spoÄítá množinu řádek"
+
+#: startup.c:212
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 může být použito pouze pro neinteraktivní módy"
+
+#: startup.c:299
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "nelze se připojit k serveru: %s"
+
+#: startup.c:327
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "nelze otevřít soubor \"%s\": %m"
+
+#: startup.c:439
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Pro získání nápovědy napište \"help\".\n"
+"\n"
+
+#: startup.c:589
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "nelze nastavit parametr zobrazení \"%s\""
+
+#: startup.c:697
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: startup.c:714
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "varování: nadbyteÄný parametr příkazové řádky \"%s\" ignorován"
+
+#: startup.c:763
+#, c-format
+msgid "could not find own program executable"
+msgstr "nelze najít vlastní spustitelný soubor"
+
+#: tab-complete.c:4640
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"tab completion dotaz selhal: %s\n"
+"Dotaz byl:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "nerozpoznaná hodnota \"%s\" pro \"%s\": oÄekáván Boolean výraz"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "neplatná hodnota \"%s\" pro \"%s\": oÄekáváno celé Äíslo"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "neplatný název proměnné: \"%s\""
+
+#: variables.c:393
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"nerozpoznaná hodnota \"%s\" pro \"%s\"\n"
+"Možné hodnoty jsou: %s."
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "nelze Äíst symbolický link \"%s\""
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "potomek byl ukonÄen signálem %s"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Neplatný příkaz \\%s. Použijte \\? pro nápovědu.\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid "Procedure"
+#~ msgstr "Procedura"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "neukonÄený Å™etÄ›zec v uvozovkách\n"
+
+#~ msgid "string_literal"
+#~ msgstr "string_literal"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: nelze otevřít logovací soubor \"%s\": %s\n"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "\\%s: chyba\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy: %s"
+
+#~ msgid "\\copy: unexpected response (%d)\n"
+#~ msgstr "\\copy: neoÄekávaná odezva (%d)\n"
+
+#~ msgid "data type"
+#~ msgstr "datový typ"
+
+#~ msgid " on host \"%s\""
+#~ msgstr " na poÄítaÄ \"%s\""
+
+#~ msgid " at port \"%s\""
+#~ msgstr " na port \"%s\""
+
+#~ msgid " as user \"%s\""
+#~ msgstr " jako uživatel \"%s\""
+
+#~ msgid "define a new constraint trigger"
+#~ msgstr "defunuje nový constraint trigger"
+
+#~ msgid " \"%s\" IN %s %s"
+#~ msgstr " \"%s\" IN %s %s"
+
+#~ msgid "ABORT [ WORK | TRANSACTION ]"
+#~ msgstr "ABORT [ WORK | TRANSACTION ]"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "obsahuje podporu pro editaci příkazové řádky "
+
+#~ msgid "tablespace"
+#~ msgstr "tablespace"
+
+#~ msgid "new_column"
+#~ msgstr "nový_sloupec"
+
+#~ msgid "column"
+#~ msgstr "sloupec"
+
+#~ msgid " \\l[+] list all databases\n"
+#~ msgstr " \\l[+] seznam databází\n"
+
+#~ msgid "%s: -1 is incompatible with -c and -l\n"
+#~ msgstr "%s: -1 je nekompatibilní s -c a -l\n"
+
+#~ msgid "unrecognized Boolean value; assuming \"on\"\n"
+#~ msgstr "nerozpoznaná boolean hodnota; předpokládám \"on\".\n"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: nelze nastavit proměnnou \"%s\"\n"
+
+#~ msgid "attribute"
+#~ msgstr "atribut"
+
+#~ msgid "input_data_type"
+#~ msgstr "vstupní_datový_typ"
+
+#~ msgid "agg_type"
+#~ msgstr "typ_agregace"
+
+#~ msgid "agg_name"
+#~ msgstr "jméno_agregace"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Žádné řádky)\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help ukáže tuto nápovÄ›du a skonÄí\n"
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "nelze získat aktuální uživatelské jméno: %s\n"
+
+#~ msgid "Object Description"
+#~ msgstr "Popis objektu"
+
+#~ msgid "Modifier"
+#~ msgstr "Modifikátor"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "Žádné relace nenalezeny.\n"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "Odpovídající relace nebyla nalezena.\n"
+
+#~ msgid "No settings found.\n"
+#~ msgstr "Žádné nastavení nenalezeno.\n"
+
+#~ msgid "No matching settings found.\n"
+#~ msgstr "Odpovídající relace nebyla nalezena.\n"
+
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr "Tato verze serveru nepodporuje nastavení rolí dle databáze.\n"
+
+#~ msgid "default %s"
+#~ msgstr "implicitnÄ› %s"
+
+#~ msgid "not null"
+#~ msgstr "not null"
+
+#~ msgid "collate %s"
+#~ msgstr "collate %s"
+
+#~ msgid "Value"
+#~ msgstr "Hodnota"
+
+#~ msgid "Modifiers"
+#~ msgstr "Modifikátory"
+
+#~ msgid "normal"
+#~ msgstr "normal"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "nelze nastavit proměnnou \"%s\"\n"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "Zkontroluj každých %lds\t%s"
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Zobrazovány jsou pouze záznamy."
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Zobrazí Äíselný výstup dle národního nastavení."
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "SSL spojení (neznámá šifra)\n"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s: chyba při nastavování proměnné\n"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Zašifrování hesla selhalo.\n"
+
+#~ msgid "lock a table"
+#~ msgstr "uzamkne tabulku"
+
+#~ msgid "from_list"
+#~ msgstr "from_seznam"
+
+#~ msgid "using_list"
+#~ msgstr "using_seznam"
+
+#~ msgid "old_version"
+#~ msgstr "stará_verze"
+
+#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+#~ msgstr " \\g [SOUBOR] nebo ; pošle SQL dotaz na server (a zapíše výsledek do souboru nebo |roury)\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Chyby posílejte na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/psql/po/de.po b/src/bin/psql/po/de.po
new file mode 100644
index 0000000..ab17986
--- /dev/null
+++ b/src/bin/psql/po/de.po
@@ -0,0 +1,6577 @@
+# German message translation file for psql
+# Peter Eisentraut <peter@eisentraut.org>, 2001 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-30 12:17+0000\n"
+"PO-Revision-Date: 2023-08-01 10:03+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ungültige Programmdatei »%s«: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "konnte Programmdatei »%s« nicht lesen: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "konnte kein »%s« zum Ausführen finden"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() fehlgeschlagen: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+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
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "Benutzer existiert nicht"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "Befehl ist nicht ausführbar"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "Befehl nicht gefunden"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "Kindprozess hat mit Code %d beendet"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "Kindprozess wurde durch Ausnahme 0x%X beendet"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "Kindprozess wurde von Signal %d beendet: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "Kindprozess hat mit unbekanntem Status %d beendet"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Abbruchsanforderung gesendet\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Konnte Abbruchsanforderung nicht senden: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Zeile)"
+msgstr[1] "(%lu Zeilen)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Unterbrochen\n"
+
+#: ../../fe_utils/print.c:3218
+#, 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:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ungültiges Ausgabeformat (interner Fehler): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "rekursive Auswertung der Variable »%s« wird ausgelassen"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "lokaler Benutzer mit ID %d existiert nicht"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "ungültige Anweisung \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Versuchen Sie \\? für Hilfe."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: überflüssiges Argument »%s« ignoriert"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "Befehl \\%s ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "konnte Home-Verzeichnis für Benutzer-ID %ld nicht ermitteln: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: konnte nicht in das Verzeichnis »%s« wechseln: %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "kein Anfragepuffer"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ungültige Zeilennummer: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "keine Änderungen"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: ungültiger Kodierungsname oder Umwandlungsprozedur nicht gefunden"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "Es gibt keinen vorangegangenen Fehler."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: rechte Klammer fehlt"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: notwendiges Argument fehlt"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: kann nicht nach \\else kommen"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: kein passendes \\if"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: kann nicht nach \\else kommen"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: kein passendes \\if"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: kein passendes \\if"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "Anfragepuffer ist leer."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Neues Passwort für Benutzer »%s« eingeben: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Geben Sie es noch einmal ein: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Passwörter stimmten nicht überein."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: konnte Wert für Variable nicht lesen"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Anfragepuffer wurde gelöscht."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Befehlsgeschichte in Datei »%s« geschrieben.\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: Name der Umgebungsvariable darf kein »=« enthalten"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "Funktionsname wird benötigt"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "Sichtname wird benötigt"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Zeitmessung ist an."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Zeitmessung ist aus."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: Intervallwert mehrmals angegeben"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: falscher Intervallwert »%s«"
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: Wiederholungszahl mehrmals angegeben"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: falsche Wiederholungszahl »%s«"
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: unbekannter Parameter »%s«"
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Passwort: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Passwort für Benutzer %s: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Geben Sie Benutzer, Host oder Port nicht separat an, wenn eine Verbindungsangabe verwendet wird"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Es gibt keine Verbindung, von der die Parameter verwendet werden können"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Vorherige Verbindung wurde behalten"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s«.\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, Server %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"WARNUNG: %s-Hauptversion %s, Server-Hauptversion %s.\n"
+" Einige Features von psql werden eventuell nicht funktionieren.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL-Verbindung (Protokoll: %s, Verschlüsselungsmethode: %s, Komprimierung: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "unbekannt"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "aus"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "an"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-verschlüsselte Verbindung\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"Warnung: Konsolencodeseite (%u) unterscheidet sich von der Windows-\n"
+" Codeseite (%u). 8-Bit-Zeichen funktionieren möglicherweise nicht\n"
+" richtig. Einzelheiten finden Sie auf der psql-Handbuchseite unter\n"
+" »Notes for Windows users«.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "Umgebungsvariable PSQL_EDITOR_LINENUMBER_ARG muss gesetzt werden, um eine Zeilennummer angeben zu können"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "konnte Editor »%s« nicht starten"
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "konnte /bin/sh nicht starten"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "konnte temporäres Verzeichnis nicht finden: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "konnte temporäre Datei »%s« nicht öffnen: %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: Abkürzung »%s« ist nicht eindeutig, passt auf »%s« und »%s«"
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: zulässige Formate sind aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: zulässige Linienstile sind ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: zulässige Unicode-Rahmnenlinienstile sind single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: zulässige Unicode-Spaltenlinienstile sind single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: zulässige Unicode-Kopflinienstile sind single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: zulässige Werte für xheader_width sind »%s« (Standard), »%s«, »%s« oder eine Zahl, die die genaue Breite angibt"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep muss ein einzelnes Ein-Byte-Zeichen sein"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep kann nicht doppeltes Anführungszeichen, Newline oder Carriage Return sein"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: unbekannte Option: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Rahmenstil ist %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Zielbreite ist nicht gesetzt.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Zielbreite ist %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Erweiterte Anzeige ist an.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Erweiterte Anzeige wird automatisch verwendet.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Erweiterte Anzeige ist aus.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "Erweiterte Kopfzeilenbreite ist »%s«.\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "Erweiterte Kopfzeilenbreite ist %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Feldtrennzeichen für CSV ist »%s«.\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Feldtrennzeichen ist ein Null-Byte.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Feldtrennzeichen ist »%s«.\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Standardfußzeile ist an.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Standardfußzeile ist aus.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Ausgabeformat ist »%s«.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Linienstil ist %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null-Anzeige ist »%s«.\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Lokalisiertes Format für numerische Daten ist an.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Lokalisiertes Format für numerische Daten ist aus.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Pager wird für lange Ausgaben verwendet.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Pager wird immer verwendet.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Pager-Verwendung ist aus.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Pager wird nicht für weniger als %d Zeile verwendet werden.\n"
+msgstr[1] "Pager wird nicht für weniger als %d Zeilen verwendet werden.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Satztrennzeichen ist ein Null-Byte.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Satztrennzeichen ist <newline>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Satztrennzeichen ist »%s«.\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Tabellenattribute sind »%s«.\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Tabellenattribute sind nicht gesetzt.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Titel ist »%s«.\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Titel ist nicht gesetzt.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Nur Datenzeilen ist an.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Nur Datenzeilen ist aus.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode-Rahmenlinienstil ist »%s«.\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode-Spaltenlinienstil ist »%s«.\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode-Kopflinienstil ist »%s«.\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: fehlgeschlagen"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch kann nicht mit einer leeren Anfrage verwendet werden"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "konnte Timer nicht setzen: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (alle %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (alle %gs)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "konnte nicht auf Signale warten: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** ANFRAGE *********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "»%s.%s« ist keine Sicht"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "konnte reloptions-Array nicht interpretieren"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "Escape kann nicht ohne aktive Verbindung ausgeführt werden"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«"
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "Verbindung zum Server wurde verloren"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Die Verbindung zum Server wurde verloren. Versuche Reset: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Fehlgeschlagen.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Erfolgreich.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "unerwarteter PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Zeit: %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Zeit: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Zeit: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Zeit: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchrone Benachrichtigung »%s« mit Daten »%s« vom Serverprozess mit PID %d empfangen.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchrone Benachrichtigung »%s« vom Serverprozess mit PID %d empfangen.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "konnte Ergebnistabelle nicht ausgeben: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "keine Zeilen für \\gset zurückgegeben"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "mehr als eine Zeile für \\gset zurückgegeben"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "Versuch von \\gset in besonders behandelte Variable »%s« ignoriert"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Einzelschrittmodus: Anfrage bestätigen)*************************************\n"
+"%s\n"
+"***(Drücken Sie die Eingabetaste um fortzufahren oder »x« um abzubrechen)*******\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ANWEISUNG: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "unerwarteter Transaktionsstatus (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Spalte"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Typ"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Der Befehl hat kein Ergebnis oder das Ergebnis hat keine Spalten.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: benötigt Argumente"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: Parse-Fehler bei »%s«"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: Parse-Fehler am Zeilenende"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "konnte Befehl »%s« nicht ausführen: %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: ein Verzeichnis kann nicht kopiert werden"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "konnte Pipe zu externem Programm nicht schließen: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "konnte COPY-Daten nicht schreiben: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Datentransfer mit COPY fehlgeschlagen: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "vom Benutzer abgebrochen"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.\n"
+"Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile, oder einem EOF-Signal."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "abgebrochen wegen Lesenfehlers"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "versuche, den COPY-Modus zu verlassen"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: Anweisung hat keine Ergebnismenge zurückgegeben"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: Anfrage muss mindestens drei Spalten zurückgeben"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: die vertikalen und horizontalen Kopffelder müssen verschiedene Spalten sein"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: Datenspalte muss angegeben werden, wenn die Anfrage mehr als drei Spalten zurückgibt"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: maximale Anzahl Spalten (%d) überschritten"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: Anfrageergebnis enthält mehrfache Datenwerte für Zeile »%s«, Spalte »%s«"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: Spaltennummer %d ist außerhalb des zulässigen Bereichs 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: zweideutiger Spaltenname: »%s«"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«"
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Schema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Name"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Ergebnisdatentyp"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Argumentdatentypen"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "Beschreibung"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Liste der Aggregatfunktionen"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Der Server (Version %s) unterstützt keine Zugriffsmethoden."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Tabelle"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Handler"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Liste der Zugriffsmethoden"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Eigentümer"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Pfad"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Optionen"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Größe"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Liste der Tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df akzeptiert nur [anptwS+] als Optionen"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df akzeptiert die Option »%c« nicht mit Serverversion %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "Agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "Fenster"
+
+#: describe.c:356
+msgid "proc"
+msgstr "Proz"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "Funk"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "Trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "unveränderlich"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stabil"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatil"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilität"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "beschränkt"
+
+#: describe.c:398
+msgid "safe"
+msgstr "sicher"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsicher"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallel"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Sicherheit"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Sprache"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Interner Name"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "Liste der Funktionen"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Elemente"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "Liste der Datentypen"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Linker Typ"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Rechter Typ"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Ergebnistyp"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "Funktion"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "Liste der Operatoren"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Kodierung"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "Locale-Provider"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Sortierfolge"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Zeichentyp"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICU-Locale"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "ICU-Regeln"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "Liste der Datenbanken"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "Tabelle"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "Sicht"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "materialisierte Sicht"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "Sequenz"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "Fremdtabelle"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "partitionierte Tabelle"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Spaltenprivilegien"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Policys"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Zugriffsprivilegien"
+
+#: describe.c:1195
+msgid "function"
+msgstr "Funktion"
+
+#: describe.c:1197
+msgid "type"
+msgstr "Typ"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "Schema"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Vorgegebene Zugriffsprivilegien"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Objekt"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "Tabellen-Constraint"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "Domänen-Constraint"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "Operatorklasse"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "Operatorfamilie"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "Rule"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "Objektbeschreibungen"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Keine Relation namens »%s« gefunden"
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "Keine Relationen gefunden"
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Keine Relation mit OID %s gefunden"
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Start"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "Inkrement"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "ja"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "nein"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "Zyklisch?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Eigentümer: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sequenz für Identitätsspalte: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Ungeloggte Sequenz »%s.%s«"
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sequenz »%s.%s«"
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Ungeloggte Tabelle »%s.%s«"
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabelle »%s.%s«"
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Sicht »%s.%s«"
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Ungeloggte materialisierte Sicht »%s.%s«"
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materialisierte Sicht »%s.%s«"
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ungeloggter Index »%s.%s«"
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index »%s.%s«"
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ungeloggter partitionierter Index »%s.%s«"
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Partitionierter Index »%s.%s«"
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST-Tabelle »%s.%s«"
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Zusammengesetzter Typ »%s.%s«"
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Fremdtabelle »%s.%s«"
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Ungeloggte partitionierte Tabelle »%s.%s«"
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Partitionierte Tabelle »%s.%s«"
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "Sortierfolge"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "NULL erlaubt?"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "Vorgabewert"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Schlüssel?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "Definition"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "FDW-Optionen"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Speicherung"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Kompression"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Statistikziel"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partition von: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Kein Partitions-Constraint"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Partitions-Constraint: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Partitionsschlüssel: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Gehört zu Tabelle: »%s.%s«"
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "Primärschlüssel, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "unique"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "für Tabelle »%s.%s«"
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", Prädikat (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", geclustert"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", ungültig"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", DEFERRABLE"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", INITIALLY DEFERRED"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", Replika-Identität"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "Indexe:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "Check-Constraints:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "Fremdschlüssel-Constraints:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "Fremdschlüsselverweise von:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Policys:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Statistikobjekte:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Regeln:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Abgeschaltete Regeln:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Regeln, die immer aktiv werden:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Regeln, die nur im Replikat aktiv werden:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Publikationen:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Sichtdefinition:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Trigger:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Abgeschaltete Benutzer-Trigger:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Abgeschaltete interne Trigger:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Trigger, die immer aktiv werden:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Trigger, die nur im Replikat aktiv werden:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW-Optionen: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "Erbt von"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Anzahl Partitionen: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Anzahl Partitionen: %d (Mit \\d+ alle anzeigen.)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Anzahl Kindtabellen: %d (Mit \\d+ alle anzeigen.)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Kindtabellen"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Partitionen"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Getypte Tabelle vom Typ: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Replika-Identität"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Hat OIDs: ja"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Zugriffsmethode: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", Tablespace »%s«"
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "Liste der Rollen"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Rollenname"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Attribute"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superuser"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "keine Vererbung"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Rolle erzeugen"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "DB erzeugen"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "kann nicht einloggen"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replikation"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Bypass RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "keine Verbindungen"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d Verbindung"
+msgstr[1] "%d Verbindungen"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Passwort gültig bis "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Rolle"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "Datenbank"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Einstellung"
+
+#: describe.c:3801
+#, 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
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Keine Einstellungen für Rolle »%s« gefunden"
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Keine Einstellungen gefunden"
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "Liste der Einstellungen"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Mitglied von"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Grantor"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Liste der Rollen-Grants"
+
+#: describe.c:3952
+msgid "index"
+msgstr "Index"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST-Tabelle"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "partitionierter Index"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "temporär"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "ungeloggt"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "Persistenz"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Zugriffsmethode"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "Liste der Relationen"
+
+#: describe.c:4130
+#, 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:4141
+msgid "List of partitioned indexes"
+msgstr "Liste partitionierter Indexe"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "Liste partitionierte Tabellen"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "Liste partitionierter Relationen"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Elternname"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Größe Leaf-Partition"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Gesamtgröße"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Vertraut"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Interne Sprache"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Call-Handler"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Validator"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Inline-Handler"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "Liste der Sprachen"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Liste der Domänen"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Quelle"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "Ziel"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "Standard?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "Liste der Konversionen"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Parameter"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Wert"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "Kontext"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "Liste der Konfigurationsparameter"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "Liste der veränderten Konfigurationsparameter"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Ereignis"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "eingeschaltet"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "Replika"
+
+#: describe.c:4658
+msgid "always"
+msgstr "immer"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "ausgeschaltet"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "Eingeschaltet"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Tags"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "Liste der Ereignistrigger"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Abhängigkeiten"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "Liste der erweiterten Statistiken"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Quelltyp"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Zieltyp"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "in Zuweisung"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Implizit?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "Liste der Typumwandlungen"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "Provider"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Deterministisch?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "Liste der Sortierfolgen"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Liste der Schemas"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "Liste der Textsucheparser"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Kein Textsucheparser namens »%s« gefunden"
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Keine Textsucheparser gefunden"
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Parsen starten"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Methode"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Nächstes Token lesen"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Parsen beenden"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Ãœberschrift ermitteln"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Tokentypen ermitteln"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Textsucheparser »%s.%s«"
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Textsucheparser »%s«"
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Tokenname"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tokentypen für Parser »%s.%s«"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tokentypen für Parser »%s«"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Vorlage"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Initialisierungsoptionen"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "Liste der Textsuchewörterbücher"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "Liste der Textsuchevorlagen"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "Liste der Textsuchekonfigurationen"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Keine Textsuchekonfiguration namens »%s« gefunden"
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Keine Textsuchekonfigurationen gefunden"
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Wörterbücher"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Textsuchekonfiguration »%s.%s«"
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Textsuchekonfiguration »%s«"
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Parser: »%s.%s«"
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: »%s«"
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "Liste der Fremddaten-Wrapper"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Fremddaten-Wrapper"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "Version"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "Liste der Fremdserver"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Benutzername"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "Liste der Benutzerabbildungen"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "Liste der Fremdtabellen"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "Liste der installierten Erweiterungen"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Keine Erweiterung namens »%s« gefunden"
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Keine Erweiterungen gefunden"
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "Objektbeschreibung"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objekte in Erweiterung »%s«"
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "falscher qualifizierter Name (zu viele Namensteile): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Der Server (Version %s) unterstützt keine Publikationen."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Alle Tabellen"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Inserts"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Updates"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Deletes"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Ãœber Wurzel"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "Liste der Publikationen"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Keine Publikation namens »%s« gefunden"
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Keine Publikationen gefunden"
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "Publikation %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Tabellen:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Tabellen aus Schemas:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Der Server (Version %s) unterstützt keine Subskriptionen."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "Publikation"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Binär"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "Streaming"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Two-Phase-Commit"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "Bei Fehler abschalten"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Herkunft"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Passwort nötig"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "Als Eigentümer ausführen?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Synchroner Commit"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Verbindungsinfo"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "Skip-LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "Liste der Subskriptionen"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Eingabetyp"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Storage-Typ"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "Operatorklasse"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "Operatorfamilie"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "Liste der Operatorklassen"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Passende Typen"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "Liste der Operatorfamilien"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Operator"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "Strategie"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "Sortieren"
+
+#: describe.c:6911
+msgid "search"
+msgstr "Suchen"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Zweck"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "Sortier-Opfamilie"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "Liste der Operatoren in Operatorfamilien"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "Registrierter linker Typ"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "Registrierter rechter Typ"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "Nummer"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Large Objects"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql ist das interaktive PostgreSQL-Terminal.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTION]... [DBNAME [BENUTZERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Allgemeine Optionen:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=ANWEISUNG einzelne Anweisung ausführen und beenden\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=DBNAME Datenbank, zu der verbunden werden soll\n"
+" (Standard: »%s«)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=DATEINAME Anweisungen aus Datei ausführen und danach beenden\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list verfügbare Datenbanken auflisten und beenden\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=WERT\n"
+" psql-Variable NAME auf WERT setzen\n"
+" (z.B. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc Startdatei (~/.psqlrc) nicht lesen\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (»eins«), --single-transaction\n"
+" als eine einzige Transaktion ausführen (wenn nicht\n"
+" interaktiv)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] diese Hilfe anzeigen, dann beenden\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands Backslash-Befehle auflisten, dann beenden\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables besondere Variablen auflisten, dann beenden\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Eingabe- und Ausgabeoptionen:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all Skript-Inhalt wiedergeben\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors fehlgeschlagene Anweisungen wiedergeben\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries an den Server geschickte Anweisungen zeigen\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden von internen Anweisungen erzeugte Anfragen zeigen\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr ""
+" -L, --log-file=DATEINAME\n"
+" Sitzungslog in Datei senden\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline erweiterte Zeilenbearbeitung (Readline) ausschalten\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=DATEINAME Anfrageergebnisse in Datei (oder |Pipe) senden\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet stille Ausführung (keine Mitteilungen, nur\n"
+" Anfrageergebnisse)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step Einzelschrittmodus (jede Anfrage bestätigen)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line Einzelzeilenmodus (Zeilenende beendet SQL-Anweisung)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Ausgabeformatoptionen:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align unausgerichteter Tabellenausgabemodus\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv Tabellenausgabemodus CSV (Comma-Separated Values)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=ZEICHEN\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus\n"
+" (Standard: »%s«)\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML-Tabellenausgabemodus\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] Ausgabeoption VAR auf ARG setzen (siehe\n"
+" \\pset-Anweisung)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=ZEICHEN\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus\n"
+" (Standard: Newline)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only nur Datenzeilen ausgeben\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT HTML »table«-Tag-Attribute setzen (z.B. width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded erweiterte Tabellenausgabe einschalten\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus auf\n"
+" Null-Byte setzen\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus auf\n"
+" Null-Byte setzen\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME Hostname des Datenbankservers oder\n"
+" Socket-Verzeichnis (Standard: »%s«)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "lokales Socket"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT Port des Datenbankservers (Standard: »%s«)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=NAME Datenbank-Benutzername (Standard: »%s«)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Für mehr Informationen, geben Sie »\\?« (für interne Anweisungen) oder\n"
+"»\\help« (für SQL-Anweisungen) in psql ein oder schauen Sie in den psql-\n"
+"Abschnitt der PostgreSQL-Dokumentation.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Allgemein\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... Anfrageparameter setzen\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL-Urheberrechtsinformationen zeigen\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [SPALTEN] Anfrage ausführen und Ergebnis als Kreuztabelle\n"
+" anzeigen\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose letzte Fehlermeldung mit vollen Details anzeigen\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPT)] [DATEI] SQL-Anweisung ausführen (und Ergebnis in Datei oder\n"
+" |Pipe schreiben); \\g ohne Argumente entspricht Semikolon\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc Ergebnis der Anfrage beschreiben ohne sie auszuführen\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr ""
+" \\gexec Anfrage ausführen, dann jeden Ergebniswert als\n"
+" Anweisung ausführen\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr ""
+" \\gset [PREFIX] SQL-Anweisung ausführen und Ergebnis in psql-Variablen\n"
+" ablegen\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPT)] [DATEI] wie \\g, aber mit erweitertem Ausgabemodus\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q psql beenden\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEK] [c=N] Anfrage alle SEK Sekunden ausführen, bis zu N Mal\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Hilfe\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] Hilfe über Backslash-Befehle anzeigen\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options Hilfe über psql-Kommandozeilenoptionen anzeigen\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables Hilfe über besondere Variablen anzeigen\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] Syntaxhilfe über SQL-Anweisung, * für alle Anweisungen\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Anfragepuffer\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [DATEI] [ZEILE] Anfragepuffer (oder Datei) mit externem Editor bearbeiten\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNKNAME [ZEILE]] Funktionsdefinition mit externem Editor bearbeiten\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [SICHTNAME [ZEILE]] Sichtdefinition mit externem Editor bearbeiten\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p aktuellen Inhalt der Anfragepuffers zeigen\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r Anfragepuffer löschen\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [DATEI] Befehlsgeschichte ausgeben oder in Datei schreiben\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w DATEI Anfragepuffer in Datei schreiben\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "Eingabe/Ausgabe\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... SQL COPY mit Datenstrom auf Client-Host ausführen\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXT] Text auf Standardausgabe schreiben (-n für ohne Newline)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i DATEI Befehle aus Datei ausführen\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir DATEI wie \\i, aber relativ zum Ort des aktuellen Skripts\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [DATEI] alle Anfrageergebnisse in Datei oder |Pipe schreiben\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [TEXT] Text auf Ausgabestrom für \\o schreiben (-n für ohne\n"
+" Newline)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr ""
+" \\warn [-n] [TEXT] Text auf Standardfehlerausgabe schreiben (-n für ohne\n"
+" Newline)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Bedingte Anweisungen\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if AUSDRUCK Beginn einer bedingten Anweisung\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif AUSDRUCK Alternative in aktueller bedingter Anweisung\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else letzte Alternative in aktueller bedingter Anweisung\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif Ende einer bedingten Anweisung\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Informationen\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (Optionen: S = Systemobjekte zeigen, + = zusätzliche Details zeigen)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] Tabellen, Sichten und Sequenzen auflisten\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME Tabelle, Sicht, Sequenz oder Index beschreiben\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MUSTER] Aggregatfunktionen auflisten\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MUSTER] Zugriffsmethoden auflisten\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMMUST [TYPMUST]] Operatorklassen auflisten\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMMUST [TYPMUST]] Operatorfamilien auflisten\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMMUST [OPFMUST]] Operatoren in Operatorfamilien auflisten\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMMUST [OPFMUST]] Unterst.funktionen in Operatorfamilien auflisten\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MUSTER] Tablespaces auflisten\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MUSTER] Konversionen auflisten\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [MUSTER] Konfigurationsparameter auflisten\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MUSTER] Typumwandlungen (Casts) auflisten\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [MUSTER] Objektbeschreibungen zeigen, die nirgendwo anders\n"
+" erscheinen\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MUSTER] Domänen auflisten\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MUSTER] Vorgabeprivilegien auflisten\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MUSTER] Fremdtabellen auflisten\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MUSTER] Fremdserver auflisten\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MUSTER] Fremdtabellen auflisten\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MUSTER] Benutzerabbildungen auflisten\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MUSTER] Fremddaten-Wrapper auflisten\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNKMUSTR [TYPMUSTR ...]]\n"
+" Funktionen [nur Agg/normale/Proz/Trigger/Fenster] auflisten\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [MUSTER] Textsuchekonfigurationen auflisten\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [MUSTER] Textsuchewörterbücher auflisten\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [MUSTER] Textsucheparser auflisten\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [MUSTER] Textsuchevorlagen auflisten\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MUSTER] Rollen auflisten\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MUSTER] Indexe auflisten\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] Large Objects auflisten, wie \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MUSTER] prozedurale Sprachen auflisten\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [MUSTER] materialisierte Sichten auflisten\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MUSTER] Schemas auflisten\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPMUST [TYPMUST [TYPMUST]]]\n"
+" Operatoren auflisten\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MUSTER] Sortierfolgen auflisten\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp[S] [MUSTER] Zugriffsprivilegien für Tabellen, Sichten und\n"
+" Sequenzen auflisten\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr ""
+" \\dP[itn+] [MUSTER] partitionierte Relationen [nur Indexe/Tabellen]\n"
+" auflisten [n=geschachtelt]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLLMUST [DBMUST]] datenbankspezifische Rolleneinstellungen auflisten\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [MUSTER] Rollen-Grants auflisten\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [MUSTER] Replikationspublikationen auflisten\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MUSTER] Replikationssubskriptionen auflisten\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MUSTER] Sequenzen auflisten\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MUSTER] Tabellen auflisten\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MUSTER] Datentypen auflisten\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MUSTER] Rollen auflisten\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MUSTER] Sichten auflisten\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MUSTER] Erweiterungen auflisten\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [MUSTER] erweiterte Statistiken auflisten\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [MUSTER] Ereignistrigger auflisten\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [MUSTER] Datenbanken auflisten\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNKNAME Funktionsdefinition zeigen\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] SICHTNAME Sichtdefinition zeigen\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [MUSTER] äquivalent zu \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Large Objects\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr ""
+" \\lo_export LOBOID DATEI\n"
+" Large Object in Datei schreiben\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import DATEI [KOMMENTAR]\n"
+" Large Object aus Datei lesen\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] Large Objects auflisten\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID Large Object löschen\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "Formatierung\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a zwischen unausgerichtetem und ausgerichtetem Ausgabemodus\n"
+" umschalten\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [TEXT] Tabellentitel setzen oder löschen\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [ZEICHEN] Feldtrennzeichen zeigen oder setzen\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML-Ausgabemodus umschalten (gegenwärtig %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [WERT]] Tabellenausgabeoption setzen\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] nur Datenzeilen zeigen (gegenwärtig %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [TEXT] HTML <table>-Tag-Attribute setzen oder löschen\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] erweiterte Ausgabe umschalten (gegenwärtig %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "Verbindung\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n"
+" mit neuer Datenbank verbinden (aktuell »%s«)\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n"
+" mit neuer Datenbank verbinden (aktuell keine Verbindung)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo Informationen über aktuelle Verbindung anzeigen\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KODIERUNG] Client-Kodierung zeigen oder setzen\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr ""
+" \\password [BENUTZERNAME]\n"
+" sicheres Ändern eines Benutzerpasswortes\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "Betriebssystem\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [VERZ] Arbeitsverzeichnis wechseln\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR Umgebungsvariable auslesen\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [WERT] Umgebungsvariable setzen oder löschen\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] Zeitmessung umschalten (gegenwärtig %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [BEFEHL] Befehl in Shell ausführen oder interaktive Shell starten\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Variablen\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME interne Variable vom Benutzer abfragen\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [WERT]] interne Variable setzen, oder alle anzeigen\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME interne Variable löschen\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Liste besonderer Variablen\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql-Variablen:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=WERT\n"
+" oder \\set NAME WERT innerhalb von psql\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" wenn gesetzt werden alle erfolgreichen SQL-Befehle automatisch committet\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" bestimmt, ob SQL-Schlüsselwörter in Groß- oder Kleinschreibung\n"
+" vervollständigt werden [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" Name der aktuellen Datenbank\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" kontrolliert, welche Eingaben auf die Standardausgabe geschrieben werden\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" wenn gesetzt, interne Anfragen, die von Backslash-Befehlen ausgeführt werden,\n"
+" anzeigen; wenn auf »noexec« gesetzt, nur anzeigen, nicht ausführen\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" aktuelle Zeichensatzkodierung des Clients\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" »true« wenn die letzte Anfrage fehlgeschlagen ist, sonst »false«\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" Anzahl auf einmal zu holender und anzuzeigender Zeilen (0 = unbegrenzt)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" wenn gesetzt werden Tabellenzugriffsmethoden nicht angezeigt\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" wenn gesetzt werden Kompressionsmethoden nicht angezeigt\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" kontrolliert Befehlsgeschichte [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" Dateiname für die Befehlsgeschichte\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" maximale Anzahl der in der Befehlsgeschichte zu speichernden Befehle\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" der aktuell verbundene Datenbankserverhost\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" Anzahl benötigter EOFs um eine interaktive Sitzung zu beenden\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" Wert der zuletzt beinträchtigten OID\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" Fehlermeldung und SQLSTATE des letzten Fehlers, oder leer und »000000« wenn\n"
+" kein Fehler\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" wenn gesetzt beendet ein Fehler die Transaktion nicht (verwendet implizite\n"
+" Sicherungspunkte)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" Skriptausführung bei Fehler beenden\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" Serverport der aktuellen Verbindung\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" der normale psql-Prompt\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" der Prompt, wenn eine Anweisung von der vorherigen Zeile fortgesetzt wird\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" der Prompt während COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" stille Ausführung (wie Option -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" Anzahl der von der letzten Anfrage beeinträchtigten Zeilen, oder 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" Serverversion (kurze Zeichenkette oder numerisches Format)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" »true« wenn der letzte Shell-Befehl fehlgeschlagen ist, sonst »false«\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" Statuscode des letzten Shell-Befehls\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" alle Ergebnisse einer kombinierten Anfrage (\\;) anzeigen statt nur das letzte\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" kontrolliert die Anzeige von Kontextinformationen in Meldungen\n"
+" [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" wenn gesetzt beendet Zeilenende die SQL-Anweisung (wie Option -S)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" Einzelschrittmodus (wie Option -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE der letzten Anfrage, oder »00000« wenn kein Fehler\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" der aktuell verbundene Datenbankbenutzer\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" kontrolliert wieviele Details in Fehlermeldungen enthalten sind\n"
+" [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" Version von psql (lange Zeichenkette, kurze Zeichenkette oder numerisch)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Anzeigeeinstellungen:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=WERT]\n"
+" oder \\pset NAME [WERT] innerhalb von psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" Rahmenstil (Zahl)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" Zielbreite für das Format »wrapped«\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (oder x)\n"
+" erweiterte Ausgabe [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus (Standard »%s«)\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" Feldtrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" Tabellenfußzeile ein- oder auschalten [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" Ausgabeformat setzen [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" Rahmenlinienstil setzen [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" setzt die Zeichenkette, die anstelle eines NULL-Wertes ausgegeben wird\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" Verwendung eines Locale-spezifischen Zeichens zur Trennung von Zifferngruppen\n"
+" einschalten [on, off]\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" kontrolliert Verwendung eines externen Pager-Programms [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" Satztrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" Attribute für das »table«-Tag im Format »html« oder proportionale\n"
+" Spaltenbreite für links ausgerichtete Datentypen im Format »latex-longtable«\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" setzt den Titel darauffolgend ausgegebener Tabellen\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" wenn gesetzt werden nur die eigentlichen Tabellendaten gezeigt\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" setzt den Stil für Unicode-Linien [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Umgebungsvariablen:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=WERT [NAME=WERT] psql ...\n"
+" oder \\setenv NAME [WERT] innerhalb von psql\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=WERT\n"
+" psql ...\n"
+" oder \\setenv NAME [WERT] innerhalb von psql\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" Anzahl Spalten im Format »wrapped«\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" wie Verbindungsparameter »application_name«\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" wie Verbindungsparameter »dbname«\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" wie Verbindungsparameter »host«\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" Name der Passwortdatei\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" Verbindungspasswort (nicht empfohlen)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" wie Verbindungsparameter »port«\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" wie Verbindungsparameter »user«\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" Editor für Befehle \\e, \\ef und \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" wie die Zeilennummer beim Aufruf des Editors angegeben wird\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" alternativer Pfad für History-Datei\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" Name des externen Pager-Programms\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" Name des externen Pager-Programms für \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" alternativer Pfad für .psqlrc-Datei des Benutzers\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" Shell für den Befehl \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" Verzeichnis für temporäre Dateien\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "Verfügbare Hilfe:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Anweisung: %s\n"
+"Beschreibung: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Keine Hilfe verfügbar für »%s«.\n"
+"Versuchen Sie \\h ohne Argumente, um die verfügbare Hilfe zu sehen.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "konnte nicht aus Eingabedatei lesen: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "konnte Befehlsgeschichte nicht in Datei »%s« speichern: %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "Befehlsgeschichte wird von dieser Installation nicht unterstützt"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: nicht mit einer Datenbank verbunden"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: aktuelle Transaktion ist abgebrochen"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: unbekannter Transaktionsstatus"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: abgebrochen"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Verwenden Sie »\\q«, um %s zu verlassen.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Die Eingabe ist ein PostgreSQL-Dump im Custom-Format.\n"
+"Verwenden Sie den Kommandozeilen-Client pg_restore, um diesen Dump in die\n"
+"Datenbank zurückzuspielen.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Verwenden Sie \\? für Hilfe oder drücken Sie Strg-C um den Eingabepuffer zu löschen."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Verwenden Sie \\? für Hilfe."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Dies ist psql, die Kommandozeilenschnittstelle für PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Geben Sie ein: \\copyright für Urheberrechtsinformationen\n"
+" \\h für Hilfe über SQL-Anweisungen\n"
+" \\? für Hilfe über interne Anweisungen\n"
+" \\g oder Semikolon, um eine Anfrage auszuführen\n"
+" \\q um zu beenden\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Verwenden Sie \\q zum beenden."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Verwenden Sie Strg-D zum beenden."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Verwenden Sie Strg-C zum beenden."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "Anfrage ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "Dateiende erreicht, aber schließendes \\endif fehlt"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: Speicher aufgebraucht"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "Name"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "Aggregatsignatur"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "neuer_Name"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "neuer_Eigentümer"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "neues_Schema"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "wobei Aggregatsignatur Folgendes ist:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "Argmodus"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "Argname"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "Argtyp"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "Option"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "wobei Option Folgendes sein kann:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "Verbindungslimit"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "neuer_Tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "Konfigurationsparameter"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "Wert"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "Zielrolle"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "Schemaname"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "abgekürztes_Grant_oder_Revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "wobei abgekürztes_Grant_oder_Revoke Folgendes sein kann:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "Rollenname"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "Ausdruck"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "Domänen-Constraint"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "Constraint-Name"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "neuer_Constraint-Name"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "neue_Version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "Elementobjekt"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "wobei Elementobjekt Folgendes ist:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "Objektname"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "Aggregatname"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "Quelltyp"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "Zieltyp"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "Funktionsname"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "Operatorname"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "linker_Typ"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "rechter_Typ"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "Indexmethode"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "Prozedurname"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "Routinenname"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "Typname"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "Sprachname"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "und Aggregatsignatur Folgendes ist:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "Handler-Funktion"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "Validator-Funktion"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "Aktion"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "Spaltenname"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "neuer_Spaltenname"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "wobei Aktion Folgendes sein kann:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "Datentyp"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "Sortierfolge"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "Spalten-Constraint"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "ganze_Zahl"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "Attributoption"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "Tabellen-Constraint"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "Triggername"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "Elterntabelle"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "Erweiterungsname"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "Ausführungskosten"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "Ergebniszeilen"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "Support-Funktion"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "Rollenangabe"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "Benutzername"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "wobei Rollenangabe Folgendes sein kann:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "Gruppenname"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "Tablespace-Name"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "Indexname"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "Storage-Parameter"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "Spaltennummer"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "Large-Object-OID"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "Kompressionsmethode"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "neue_Zugriffsmethode"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "Res-Funktion"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "Join-Funktion"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "Strategienummer"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "Optyp"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "Sortierfamilienname"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "Unterst-Nummer"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "Argumenttyp"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "Tabellenname"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "Using-Ausdruck"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "Check-Ausdruck"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "Publikationsobjekt"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "Publikationsparameter"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "wobei Publikationsobjekt Folgendes sein kann:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "Passwort"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "Zeit"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "Datenbankname"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "Inkrement"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "Minwert"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "Maxwert"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "Start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "Restart"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "Cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "neues_Ziel"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "Verbindungsinfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "Publikationsname"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "Publikationsoption"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "Refresh-Option"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "Subskriptionsparameter"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "Skip-Option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "Partitionsname"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "Partitionsbegrenzungsangabe"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "Sequenzoptionen"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "Sequenzoption"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "Tabellen-Constraint-für-Index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "Regelname"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "und Partitionsbegrenzungsangabe Folgendes ist:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "Partitionsbegrenzungsausdruck"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "numerische_Konstante"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "und Spalten-Constraint Folgendes ist:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "Vorgabeausdruck"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "Generierungsausdruck"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "Indexparameter"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "Reftabelle"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "Refspalte"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "Fremdschlüsselaktion"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "und Tabellen-Constraint Folgendes ist:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "Exclude-Element"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "Operator"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "Prädikat"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "und Tabellen-Constraint-für-Index Folgendes ist:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "Indexparameter bei UNIQUE-, PRIMARY KEY- und EXCLUDE-Constraints sind:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "Exclude-Element in einem EXCLUDE-Constraint ist:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "Opklasse"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "Fremdschlüsselaktion in FOREIGN KEY/REFERENCES ist:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "Tablespace-Option"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "Tokentyp"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "Wörterbuchname"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "altes_Wörterbuch"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "neues_Wörterbuch"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "Attributname"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "neuer_Attributname"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "neuer_Enum-Wert"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "Nachbar-Enum-Wert"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existierender_Enum-Wert"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "Eigenschaft"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "Servername"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "Sichtoptionsname"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "Sichtoptionswert"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "Tabelle-und-Spalten"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "wobei Option eine der folgenden sein kann:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "Größe"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "und Tabelle-und-Spalten Folgendes ist:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "Transaktionsmodus"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "wobei Transaktionsmodus Folgendes sein kann:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "Argument"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "Relationsname"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "Domänenname"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "Policy-Name"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "Regelname"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "Zeichenkettenkonstante"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "Transaktions-ID"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "Dateiname"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "Befehl"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "Bedingung"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "Anfrage"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "Formatname"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "Trennzeichen"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "Null-Zeichenkette"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "Vorgabewert-Zeichenkette"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "Quote-Zeichen"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "Escape-Zeichen"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "Kodierungsname"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "Zugriffsmethodentyp"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "Arg-Datentyp"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "Ãœbergangsfunktion"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "Zustandsdatentyp"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "Zustandsdatengröße"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "Abschlussfunktion"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "Combine-Funktion"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "Serialisierungsfunktion"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "Deserialisierungsfunktion"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "Anfangswert"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "Moving-Ãœbergangsfunktion"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "Moving-Inversfunktion"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "Moving-Zustandsdatentyp"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "Moving-Zustandsdatengröße"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "Moving-Abschlussfunktion"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "Moving-Anfangswert"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "Sortieroperator"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "oder die alte Syntax"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "Basistyp"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "Locale"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "Provider"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "Regeln"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "Version"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "existierende_Sortierfolge"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "Quellkodierung"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "Zielkodierung"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "Vorlage"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "Kodierung"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "Strategie"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "ICU-Locale"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "ICU-Regeln"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "Locale-Provider"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "Sortierfolgenversion"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "OID"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "Constraint"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "wobei Constraint Folgendes ist:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "Ereignis"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "Filtervariable"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "Filterwert"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "wobei Spalten-Constraint Folgendes ist:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "Rückgabetyp"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "Spaltentyp"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "Definition"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "Objektdatei"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "Linksymbol"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "SQL-Rumpf"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "Uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "Methode"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "Opklassen-Parameter"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "Handler"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "Inline-Handler"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "Valfunktion"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "Kommutator-Op"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "Umkehrungs-Op"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "Familienname"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "Storage-Typ"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "wobei Ereignis eins der folgenden sein kann:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "Schemaelement"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "Servertyp"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "Serverversion"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "FDW-Name"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "Statistikname"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "Statistikart"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "Subskriptionsname"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "Quelltabelle"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "Like-Option"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "und Like-Option Folgendes ist:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "Verzeichnis"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "Parser-Name"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "Quellkonfig"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "Startfunktion"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "Gettext-Funktion"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "Endfunktion"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "Lextypenfunktion"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "Headline-Funktion"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "Init-Funktion"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "Lexize-Funktion"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "From-SQL-Funktionsname"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "To-SQL-Funktionsname"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "verwiesener_Tabellenname"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "Ãœbergangsrelationsname"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "Argumente"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "Label"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "Untertyp"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "Untertyp-Operatorklasse"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "Canonical-Funktion"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "Untertyp-Diff-Funktion"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "Multirange-Typname"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "Eingabefunktion"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "Ausgabefunktion"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "Empfangsfunktion"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "Sendefunktion"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "Typmod-Eingabefunktion"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "Typmod-Ausgabefunktion"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "Analyze-Funktion"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "Subscript-Funktion"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "interne_Länge"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "Ausrichtung"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "Speicherung"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "wie_Typ"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "Kategorie"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "bevorzugt"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "Vorgabewert"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "Element"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "Trennzeichen"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "sortierbar"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "With-Anfrage"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "Alias"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "From-Element"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "Cursor-Name"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "Ausgabeausdruck"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "Ausgabename"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "Code"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "Parameter"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "Anweisung"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "Richtung"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "wobei Richtung eine der folgenden sein kann:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "Anzahl"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "Sequenzname"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "Argname"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "Argtyp"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "Large-Object-OID"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "fernes_Schema"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "lokales_Schema"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "Konfliktziel"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "Konfliktaktion"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "wobei Konfliktziel Folgendes sein kann:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "Indexspaltenname"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "Indexausdruck"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "Indexprädikat"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "und Konfliktaktion Folgendes sein kann:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "Sub-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "Kanal"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "Sperrmodus"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "wobei Sperrmodus Folgendes sein kann:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "Zieltabellenname"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "Zielalias"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "Datenquelle"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "Verbundbedingung"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "When-Klausel"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "wobei Datenquelle Folgendes ist:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "Quelltabellenname"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "Quellanfrage"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "Quellalias"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "und When-Klausel Folgendes ist:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "Merge-Update"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "Merge-Delete"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "Merge-Insert"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "und Merge-Insert Folgendes ist:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "und Merge-Update Folgendes ist:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "und Merge-Delete Folgendes ist:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "Payload"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "alte_Rolle"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "neue_Rolle"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "Sicherungspunktsname"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "Gruppierelement"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "Fenstername"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "Fensterdefinition"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "Select"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "wobei From-Element Folgendes sein kann:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "Spaltenalias"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "Stichprobenmethode"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "Startwert"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "With-Anfragename"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "Spaltendefinition"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "Verbundtyp"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "Verbundspalte"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "Join-Using-Alias"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "und Gruppierelement eins der folgenden sein kann:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "und With-Anfrage ist:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "values"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "Search-Seq-Spaltenname"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "Cycle-Mark-Spaltenname"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "Cycle-Mark-Wert"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "Cycle-Mark-Standard"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "Cycle-Pfad-Spaltenname"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "neue_Tabelle"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "Snapshot-ID"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "Sortierausdruck"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "bricht die aktuelle Transaktion ab"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "ändert die Definition einer Aggregatfunktion"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "ändert die Definition einer Sortierfolge"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "ändert die Definition einer Zeichensatzkonversion"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "ändert eine Datenbank"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "definiert vorgegebene Zugriffsprivilegien"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "ändert die Definition einer Domäne"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "ändert die Definition eines Ereignistriggers"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "ändert die Definition einer Erweiterung"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "ändert die Definition eines Fremddaten-Wrappers"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "ändert die Definition einer Fremdtabelle"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "ändert die Definition einer Funktion"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "ändert Rollenname oder -mitglieder"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "ändert die Definition eines Index"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "ändert die Definition einer prozeduralen Sprache"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "ändert die Definition eines Large Object"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "ändert die Definition einer materialisierten Sicht"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "ändert die Definition eines Operators"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "ändert die Definition einer Operatorklasse"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "ändert die Definition einer Operatorfamilie"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "ändert die Definition einer Policy für Sicherheit auf Zeilenebene"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "ändert die Definition einer Prozedur"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "ändert die Definition einer Publikation"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "ändert eine Datenbankrolle"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "ändert die Definition einer Routine"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "ändert die Definition einer Regel"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "ändert die Definition eines Schemas"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "ändert die Definition eines Sequenzgenerators"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "ändert die Definition eines Fremdservers"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "ändert die Definition eines erweiterten Statistikobjekts"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "ändert die Definition einer Subskription"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "ändert einen Server-Konfigurationsparameter"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "ändert die Definition einer Tabelle"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "ändert die Definition eines Tablespace"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "ändert die Definition einer Textsuchekonfiguration"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "ändert die Definition eines Textsuchewörterbuchs"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "ändert die Definition eines Textsucheparsers"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "ändert die Definition einer Textsuchevorlage"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "ändert die Definition eines Triggers"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "ändert die Definition eines Typs"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "ändert die Definition einer Benutzerabbildung"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "ändert die Definition einer Sicht"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "sammelt Statistiken über eine Datenbank"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "startet einen Transaktionsblock"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "ruft eine Prozedur auf"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "erzwingt einen Checkpoint im Write-Ahead-Log"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "schließt einen Cursor"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "clustert eine Tabelle nach einem Index"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "definiert oder ändert den Kommentar eines Objektes"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "schließt die aktuelle Transaktion ab"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "schließt eine Transaktion ab, die vorher für Two-Phase-Commit vorbereitet worden war"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "kopiert Daten zwischen einer Datei und einer Tabelle"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "definiert eine neue Zugriffsmethode"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "definiert eine neue Aggregatfunktion"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "definiert eine neue Typumwandlung"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "definiert eine neue Sortierfolge"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "definiert eine neue Kodierungskonversion"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "erzeugt eine neue Datenbank"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "definiert eine neue Domäne"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "definiert einen neuen Ereignistrigger"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "installiert eine Erweiterung"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "definiert einen neuen Fremddaten-Wrapper"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "definiert eine neue Fremdtabelle"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "definiert eine neue Funktion"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "definiert eine neue Datenbankrolle"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "definiert einen neuen Index"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "definiert eine neue prozedurale Sprache"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "definiert eine neue materialisierte Sicht"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "definiert einen neuen Operator"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "definiert eine neue Operatorklasse"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "definiert eine neue Operatorfamilie"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "definiert eine neue Policy für Sicherheit auf Zeilenebene für eine Tabelle"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "definiert eine neue Prozedur"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "definiert eine neue Publikation"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "definiert eine neue Umschreiberegel"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "definiert ein neues Schema"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "definiert einen neuen Sequenzgenerator"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "definiert einen neuen Fremdserver"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "definiert erweiterte Statistiken"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "definiert eine neue Subskription"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "definiert eine neue Tabelle"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "definiert eine neue Tabelle aus den Ergebnissen einer Anfrage"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "definiert einen neuen Tablespace"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "definiert eine neue Textsuchekonfiguration"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "definiert ein neues Textsuchewörterbuch"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "definiert einen neuen Textsucheparser"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "definiert eine neue Textsuchevorlage"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "definiert eine neue Transformation"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "definiert einen neuen Trigger"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "definiert einen neuen Datentyp"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definiert eine neue Abbildung eines Benutzers auf einen Fremdserver"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "definiert eine neue Sicht"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "gibt einen vorbereiteten Befehl frei"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "definiert einen Cursor"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "löscht Zeilen einer Tabelle"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "verwirft den Sitzungszustand"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "führt einen anonymen Codeblock aus"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "entfernt eine Zugriffsmethode"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "entfernt eine Aggregatfunktion"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "entfernt eine Typumwandlung"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "entfernt eine Sortierfolge"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "entfernt eine Zeichensatzkonversion"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "entfernt eine Datenbank"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "entfernt eine Domäne"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "entfernt einen Ereignistrigger"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "entfernt eine Erweiterung"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "entfernt einen Fremddaten-Wrapper"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "entfernt eine Fremdtabelle"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "entfernt eine Funktion"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "entfernt eine Datenbankrolle"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "entfernt einen Index"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "entfernt eine prozedurale Sprache"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "entfernt eine materialisierte Sicht"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "entfernt einen Operator"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "entfernt eine Operatorklasse"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "entfernt eine Operatorfamilie"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "entfernt die einer Datenbankrolle gehörenden Datenbankobjekte"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "entfernt eine Policy für Sicherheit auf Zeilenebene von einer Tabelle"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "entfernt eine Prozedur"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "entfernt eine Publikation"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "entfernt eine Routine"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "entfernt eine Umschreiberegel"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "entfernt ein Schema"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "entfernt eine Sequenz"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "entfernt einen Fremdserverdeskriptor"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "entfernt erweiterte Statistiken"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "entfernt eine Subskription"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "entfernt eine Tabelle"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "entfernt einen Tablespace"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "entfernt eine Textsuchekonfiguration"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "entfernt ein Textsuchewörterbuch"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "entfernt einen Textsucheparser"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "entfernt eine Textsuchevorlage"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "entfernt eine Transformation"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "entfernt einen Trigger"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "entfernt einen Datentyp"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "entfernt eine Benutzerabbildung für einen Fremdserver"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "entfernt eine Sicht"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "führt einen vorbereiteten Befehl aus"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "zeigt den Ausführungsplan eines Befehls"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "liest Zeilen aus einer Anfrage mit einem Cursor"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "definiert Zugriffsprivilegien"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "importiert Tabellendefinitionen von einem Fremdserver"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "erzeugt neue Zeilen in einer Tabelle"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "hört auf eine Benachrichtigung"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "lädt eine dynamische Bibliotheksdatei"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "sperrt eine Tabelle"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "fügt Zeilen in eine Tabelle ein oder ändert oder löscht Zeilen einer Tabelle, abhängig von Bedingungen"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "positioniert einen Cursor"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "erzeugt eine Benachrichtigung"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "bereitet einen Befehl zur Ausführung vor"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "bereitet die aktuelle Transaktion für Two-Phase-Commit vor"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "ändert den Eigentümer der der Rolle gehörenden Datenbankobjekte"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "ersetzt den Inhalt einer materialisierten Sicht"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "baut Indexe neu"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "gibt einen zuvor definierten Sicherungspunkt frei"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "setzt einen Konfigurationsparameter auf die Voreinstellung zurück"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "entfernt Zugriffsprivilegien"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "storniert eine Transaktion, die vorher für Two-Phase-Commit vorbereitet worden war"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "rollt eine Transaktion bis zu einem Sicherungspunkt zurück"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "definiert einen neuen Sicherungspunkt in der aktuellen Transaktion"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "definiert oder ändert ein Security-Label eines Objektes"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "liest Zeilen aus einer Tabelle oder Sicht"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "ändert einen Konfigurationsparameter"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "setzt die Zeitsteuerung für Check-Constraints in der aktuellen Transaktion"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "setzt den aktuellen Benutzernamen der aktuellen Sitzung"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "setzt den Sitzungsbenutzernamen und den aktuellen Benutzernamen der aktuellen Sitzung"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "setzt die Charakteristika der aktuellen Transaktion"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "zeigt den Wert eines Konfigurationsparameters"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "leert eine oder mehrere Tabellen"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "beendet das Hören auf eine Benachrichtigung"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "aktualisiert Zeilen einer Tabelle"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "säubert und analysiert eine Datenbank"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "berechnet eine Zeilenmenge"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 kann nur im nicht interaktiven Modus verwendet werden"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Geben Sie »help« für Hilfe ein.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "konnte Ausgabeparameter »%s« nicht setzen"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "überflüssiges Kommandozeilenargument »%s« ignoriert"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "konnte eigene Programmdatei nicht finden"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"Anfrage zur Tab-Vervollständigung fehlgeschlagen: %s\n"
+"Anfrage war:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "unbekannter Wert »%s« für »%s«: Boole'scher Wert erwartet"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "ungültiger Wert »%s« für »%s«: ganze Zahl erwartet"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ungültiger Variablenname: »%s«"
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"unbekannter Wert »%s« für »%s«\n"
+"Verfügbare Werte sind: %s."
diff --git a/src/bin/psql/po/el.po b/src/bin/psql/po/el.po
new file mode 100644
index 0000000..9e4179a
--- /dev/null
+++ b/src/bin/psql/po/el.po
@@ -0,0 +1,6644 @@
+# Greek message translation file for psql
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-15 13:47+0000\n"
+"PO-Revision-Date: 2023-08-16 11:55+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() απέτυχε: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ενεÏγής ταυτότητας χÏήστη %ld: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "ο χÏήστης δεν υπάÏχει"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "εντολή μη εκτελέσιμη"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "εντολή δεν βÏέθηκε"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Αίτηση ακÏÏωσης εστάλη\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακÏÏωσης: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu σειÏά)"
+msgstr[1] "(%lu σειÏές)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Διακόπηκε\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη κεφαλίδας σε πεÏιεχόμενο πίνακα: υπέÏβαση του πλήθους στηλών %d.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη ÎºÎµÎ»Î¹Î¿Ï ÏƒÎµ πεÏιεχόμενο πίνακα: υπέÏβαση του ÏƒÏ…Î½Î¿Î»Î¹ÎºÎ¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï ÎºÎµÎ»Î¹ÏŽÎ½ %d.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "μη έγκυÏη μοÏφή εξόδου (εσωτεÏικό σφάλμα): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "παÏαλείπεται η αναδÏομική επέκταση της μεταβλητής «%s»"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ID Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï‡Ïήστη %d: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "δεν υπάÏχει τοπικός χÏήστης με ID %d"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "μη έγκυÏη εντολή «%s»"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Δοκιμάστε \\? για βοήθεια."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: επιπλέον παÏάμετÏος «%s» αγνοείται"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s εντολή αγνοείται, χÏησιμοποιείστε \\endif ή Ctrl-C για να εξέλθετε από το παÏόν μπλοκ \\if"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η ανάλληψη Ï€ÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï… για τον χÏήστη με ID %ld: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στην διεÏθυνση «%s» στη θÏÏα «%s».\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» μέσω του υποδεχέα «%s» στη θÏÏα «%s».\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» (διεÏθυνση «%s») στη θÏÏα «%s».\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» στη θÏÏα «%s».\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "μη ενδιάμεση μνήμη εÏώτησης"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "μη έγκυÏος αÏιθμός γÏαμμής «%s»"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Καθόλου αλλάγες"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: μη έγκυÏη ονομασία κωδικοποίησης ή δεν βÏέθηκε η διεÏγασία μετατÏοπής"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "Δεν υπάÏχει Ï€ÏοηγοÏμενο σφάλμα."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: λείπει δεξιά παÏένθεση"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: λείπει αναγκαία παÏάμετÏος"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: δεν δÏναται να Ï€ÏοκÏψει μετά \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: δεν υπάÏχει αντίστοιχο \\if"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: δεν δÏναται να Ï€ÏοκÏψει μετά \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: δεν υπάÏχει αντίστοιχο \\if"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: δεν υπάÏχει αντίστοιχο \\if"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "Άδεια ενδιάμεση μνήμη εÏώτησης."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Εισάγετε νέο κωδικό Ï€Ïόσβασης για το χÏήστη «%s»: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Εισάγετε ξανά: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Οι κωδικοί Ï€Ïόσβασης δεν είναι ίδιοι."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: δεν ήταν δυνατή η ανάγνωση τιμής για την μεταβλητή"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Μηδενισμός ενδιάμεσης μνήμη εÏώτησης (καθάÏισμα)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "‘ΕγÏαψε την ιστοÏία στο αÏχείο «%s».\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: η ονομασία μεταβλητή πεÏιβάλλοντος environment δεν δÏναται να εμπεÏιέχει «=«"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "η ονομασία συνάÏτησης είναι αναγκαία"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "η ονομασία οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ αναγκαία"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Η χÏονομέτÏηση είναι ενεÏγή."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Η χÏονομέτÏηση είναι ανενεÏγή."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: η τιμή του διαστήματος καθοÏίζεται πεÏισσότεÏες από μία φοÏές"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: εσφαλμένη τιμή διαστήματος «%s»"
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: ο αÏιθμός των επαναλήψεων καθοÏίζεται πεÏισσότεÏες από μία φοÏές"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: εσφαλμένος αÏιθμός επαναλήψεων «%s»"
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: μη αναγνωÏίσιμη παÏάμετÏος «%s»"
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Κωδικός Ï€Ïόσβασης: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Κωδικός Ï€Ïόσβασης για τον χÏήστη %s: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Îα μην οÏιστεί ξεχωÏιστά ο χÏήστης, ο κεντÏικός υπολογιστής, ή η θÏÏα όταν χÏησιμοποιείται μια συμβολοσειÏά σÏνδεσης"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Δεν υπάÏχει σÏνδεση βάσης δεδομένων για την επαναχÏησιμοποίηση παÏαμέτÏων"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "ΚÏατήθηκε η Ï€ÏοηγοÏμενη σÏνδεση"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr ""
+"ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στη διεÏθυνση «%s» στη θÏÏα «%s».\n"
+"=\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» μέσω του υποδεχέα «%s» στη θÏÏα «%s».\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» (διεÏθυνση «%s») στη θÏÏα «%s».\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» στη θÏÏα «%s».\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s».\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, διακομιστής %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: %s κÏÏια έκδοση %s, %s κÏÏια έκδοση διακομιστή.\n"
+" ΟÏισμένες δυνατότητες psql ενδέχεται να μην λειτουÏγοÏν.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL σÏνδεση (Ï€Ïωτόκολλο: %s, cipher: %s, συμπίεση: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "άγνωστο"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "κλειστό"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "ανοικτό"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-κÏυπτογÏαφημένη σÏνδεση\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Ο πηγαίος κώδικας της κονσόλας (%u) διαφέÏει από τον πηγαίο κώδικα των Windows(%u)\n"
+" ΧαÏακτήÏες 8-bit δÏναται να μην λειτουÏγοÏν οÏθά. Δείτε την αναφοÏά στη σελίδα\n"
+" psql με τίτλο «Σημειώσεις για χÏήστες Windows» για πληÏοφοÏίες.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "η μεταβλητή πεÏιβάλλοντος PSQL_EDITOR_LINENUMBER_ARG Ï€Ïέπει να έχει οÏιστεί για να οÏίσετε αÏιθμό σειÏάς"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "δεν μπόÏεσε να εκκινήσει τον editor «%s»"
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "δεν μπόÏεσε να εκκινήσει το /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "δεν ήταν δυνατός ο εντοπισμός του Ï€ÏοσωÏÎ¹Î½Î¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï… %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου «%s»: %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: διφοÏοÏμενης συντόμευση «%s» ταιÏιάζει τόσο «%s» όσο «%s»"
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: επιτÏεπόμενες μοÏφές είναι aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: επιτÏεπόμενες μοÏφές γÏαμμών είναι ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: επιτÏεπόμενες μοÏφές Unicode border line είναι single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: επιτÏεπόμενες μοÏφές Unicode column line είναι single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: επιτÏεπόμενες μοÏφές Unicode header line είναι single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: οι επιτÏεπόμενες τιμές xheader_width είναι «%s» (Ï€Ïοεπιλογή), «%s», «%s» ή ένας αÏιθμός που καθοÏίζει το ακÏιβές πλάτος"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep Ï€Ïέπει να είναι ένας χαÏακτήÏας ενός-byte"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep δεν μποÏεί να είναι διπλά εισαγωγικά, νέα γÏαμμή, ή carriage return"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: άγνωστη επιλογή: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Border style είναι %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Target width δεν είναι οÏισμένο.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Target width είναι %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Εκτεταμένη οθόνη είναι ενεÏγή.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Εκτεταμένη οθόνη χÏησιμοποιείται αυτόματα.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Εκτεταμένη οθόνη είναι ανενεÏγή.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "Το πλάτος της διευÏυμένης κεφαλίδας είναι «%s».\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "Το πλάτος της διευÏυμένης κεφαλίδας είναι %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "ΔιαχωÏιστής πεδίων CSV είναι ο «%s».\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "ΔιαχωÏιστής πεδίων είναι το μηδενικό byte\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "ΔιαχωÏιστής πεδίων είναι ο «%s».\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "ΠÏοκαθοÏισμένο υποσέλιδο είναι ενεÏγό.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "ΠÏοκαθοÏισμένο υποσέλιδο είναι ανενεÏγό.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Η μοÏφή εξόδου είναι %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Η μοÏφή γÏαμμής είναι %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Εμφάνιση Null είναι «%s».\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Η κατά εντοπιότητα διοÏθωμένη μοÏφή αÏιθμητικής εξόδου είναι ενεÏγή.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Η κατά εντοπιότητα διοÏθωμένη μοÏφή αÏιθμητικής εξόδου είναι ανενεÏγή.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "ΧÏησιμοποιείται Pager για μεγάλη έξοδο.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "ΧÏησιμοποιείται Pager συνέχεια.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Η χÏήση Pager είναι ανενεÏγή.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Ο Pager δεν θα χÏησιμοποιηθεί για λιγότεÏο από %d γÏαμμή.\n"
+msgstr[1] "Ο Pager δεν θα χÏησιμοποιηθεί για λιγότεÏες από %d γÏαμμές.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "ΔιαχωÏιστής εγγÏαφών είναι το μηδενικό byte\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "ΔιαχωÏιστής εγγÏαφών είναι ο <newline>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "ΔιαχωÏιστής εγγÏαφών είναι ο/η «%s».\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Τα χαÏακτηÏιστικά του πίνακα είναι «%s».\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "ΧαÏακτηÏιστικά πίνακα μη οÏισμένα.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Ο τίτλος είναι «%s».\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Ο τίτλος δεν είναι οÏισμένος.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "ΕνεÏγή όψη μόνο πλειάδων.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "ΑνενεÏγή όψη μόνο πλειάδων.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Το στυλ πεÏιγÏάμματος γÏαμμής Unicode είναι «%s».\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Το στυλ πεÏιγÏάμματος στήλης Unicode είναι «%s».\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Το στυλ πεÏιγÏάμματος γÏαμμής κεφαλίδας Unicode είναι «%s».\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: απέτυχε"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch δεν μποÏεί να χÏησιμοποιηθεί με κενή εÏώτηση"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "δεν ήταν δυνατή η ÏÏθμιση του χÏονομετÏητή: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (κάθε %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr ""
+"%s (κάθε %gs)\n"
+"\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "δεν ήταν δυνατή η αναμονή για σήματα: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* ΕΡΩΤΗΣΗ **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "«%s.%s» δεν είναι μία όψη"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "δεν είναι δυνατή η διαφυγή χωÏίς ενεÏγή σÏνδεση"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "παÏάμετÏος της εντολής κελÏφους πεÏιέχει μια νέα γÏαμμή ή μια επιστÏοφή μεταφοÏάς: «%s»"
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "χάθηκε η σÏνδεση στον διακομιστή"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Χάθηκε η σÏνδεση στον διακομιστή. ΠÏοσπάθεια επαναφοÏάς: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Απέτυχε.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Πέτυχε.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "μη αναμενόμενο PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "ΧÏόνος: %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "ΧÏόνος: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "ΧÏόνος: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "ΧÏόνος: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Ελήφθει ασÏγχÏονη ειδοποίηση «%s» με ωφέλιμο φοÏτίο «%s» από τη διαδικασία διακομιστή με %d PID.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Ελήφθει ασÏγχÏονη ειδοποίηση «%s» από τη διαδικασία διακομιστή με %d PID.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "δεν μπόÏεσε να εκτυπώσει τον πίνακα αποτελέσματος: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "δεν επιστÏάφηκαν σειÏές για \\gset"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "πεÏισσότεÏες από μία γÏαμμές επιστÏάφηκαν για \\gset"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "αγνοείται η Ï€Ïοσπάθεια να τεθεί \\gset στην ειδικά διαμοÏφωμένη μεταβλητή «%s»"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(ΛειτουÏγία Î¼Î¿Î½Î¿Ï Î²Î®Î¼Î±Ï„Î¿Ï‚: επιβεβαιώστε την εντολή)*******************************************\n"
+"%s\n"
+"***(πατήστε return για να συνεχίσετε ή εισάγετε x και return για να ακυÏώσετε)********************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ΔΗΛΩΣΗ: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "μη αναμενόμενη κατάσταση συναλλαγής: %d"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Στήλη"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "ΤÏπος"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Η εντολή δεν έχει αποτέλεσμα, η το αποτέλεσμα δεν έχει στήλες.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: παÏάμετÏοι επιβάλλονται"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: σφάλμα ανάλυσης σε «%s»"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: σφάλμα ανάλυσης στο τέλος γÏαμμής"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: δεν μποÏεί να αντιγÏάψει από/Ï€Ïος κατάλογο"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "δεν ήταν δυνατό το κλείσιμο της διοχέτευσης σε εξωτεÏική εντολή: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "δεν ήταν δυνατή η εγγÏαφή δεδομένων COPY: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "ΜεταφοÏά δεδομένων μέσω COPY απέτυχε: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "ακυÏώθηκε από τον χÏήστη"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Εισαγάγετε τα δεδομένα που θα αντιγÏαφοÏν ακολουθοÏμενα από νέα γÏαμμή.\n"
+"ΤεÏματίστε με μια ανάστÏοφη κάθετο και μια τελεία σε μια ξεχωÏιστή γÏαμμή, ή ένα σήμα EOF."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "ματαιώθηκε λόγω σφάλματος κατά την ανάγνωση"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "Ï€Ïοσπαθεί να τεÏματίσει τη λειτουÏγία αντιγÏαφής"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: η δήλωση δεν επέστÏεψε σετ αποτελεσμάτων"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: η εÏώτηση Ï€Ïέπει να επιστÏέψει τουλάχιστον Ï„Ïεις στήλες"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: κάθετες και οÏιζόντιες κεφαλίδες Ï€Ïέπει να βÏίσκονται σε διαφοÏετικές στήλες"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: επιβάλλεται να έχει οÏιστεί στήλη δεδομένων όταν η εÏώτηση επιστÏέφει πεÏισσότεÏες από Ï„Ïεις στήλες"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: υπεÏβλήθηκε ο μέγιστος αÏιθμός στηλών (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: το αποτέλεσμα της εÏώτησης πεÏιλαμβάνει πολλαπλές τιμές δεδομένων για την σειÏά «%s», στήλη «%s»"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: αÏιθμός στήλης %d βÏίσκεται εκτός διαστήματος 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: αμφίσημο όνομα στήλης: «%s»"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: όνομα στήλης δεν βÏέθηκε: «%s»"
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Σχήμα"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Όνομα"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "ΤÏπος δεδομένων αποτελεσμάτων"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "ΤÏπος δεδομένων παÏαμέτÏων"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "ΠεÏιγÏαφή"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Λίστα των συγκεντÏωτικών συναÏτήσεων"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει μεθόδους Ï€Ïόσβασης."
+
+#: describe.c:168
+msgid "Index"
+msgstr "ΕυÏετήÏιο"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Πίνακας"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "ΔιαχειÏιστής"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Λίστα μεθόδων Ï€Ïόσβασης"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Ιδιοκτήτης"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Τοποθεσία"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Επιλογές"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Μέγεθος"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Λίστα tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df λαμβάνει μόνο [anptwS+] ως επιλογές"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df δεν λαμβάνει την επιλογή «%c» στην έκδοση διακομιστή %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "window"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "ΠÏοσωÏινή"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "πεÏιοÏισμένη"
+
+#: describe.c:398
+msgid "safe"
+msgstr "ασφαλής"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "ανασφαλής"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "ΠαÏάλληλη"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Ασφάλεια"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Γλώσσα"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "ΕσωτεÏική ονομασία"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "Λίστα συναÏτήσεων"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Στοιχεία"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "Λίστα Ï„Ïπων δεδομένων"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "ΤÏπος αÏιστεÏής παÏαμέτÏου"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "ΤÏπος δεξιάς παÏαμέτÏου"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "ΤÏπος αποτελέσματος"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "ΣυνάÏτηση"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "Λίστα operators"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Κωδικοποίηση"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "ΠάÏοχος εντοπιότητας"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "ΣÏνθεση"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICU εντοπιότητα"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "Κανόνες ICU"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "Λίστα βάσεων δεδομένων"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "πίνακας"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "όψη"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "υλοποιημένη όψη"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "ακολουθία"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "ξένος πίνακας"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "κατατμημένος πίνακας"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "ΠÏονόμια στήλης"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Πολιτικές"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "ΠÏονόμια Ï€Ïόσβασης"
+
+#: describe.c:1195
+msgid "function"
+msgstr "συνάÏτηση"
+
+#: describe.c:1197
+msgid "type"
+msgstr "Ï„Ïπος"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "σχήμα"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "ΠÏοεπιλεγμένες επιλογές δικαιωμάτων"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Ατνικείμενο"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "πεÏιοÏισμός πίνακα"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "πεÏιοÏισμός πεδίου"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "κλάση χειÏιστή"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "οικογένεια χειÏιστή"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "πεÏιγÏαφή"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "ΠεÏιγÏαφές αντικειμένου"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Δεν βÏέθηκε καμία σχέση με όνομα «%s»."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "Δεν βÏέθηκαν καθόλου σχέσεις."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Δεν βÏέθηκαν καθόλου σχέσεις με OID %s."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Εκκίνηση"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Ελάχιστο"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "Μέγιστο"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "ΕπαÏξηση"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "ναι"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "όχι"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "ΚÏκλοι;"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "ΠÏοσωÏινή μνήμη"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Ανήκει σε: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Ακολουθία για τη στήλη ταυτότητας: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ΑκαταχώÏητη ακολουθία «%s.%s»"
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Ακολουθία «%s.%s»"
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ΑκαταχώÏητος πίνακας «%s.%s»"
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Πίνακας «%s.%s»"
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Όψη «%s.%s»"
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "ΑκαταχώÏητη υλοποιημένη όψη «%s.%s»"
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Υλοποιημένη όψη «%s.%s»"
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "ΑκαταχώÏητο ευÏετήÏιο «%s.%s»"
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "ΕυÏετήÏιο «%s.%s»"
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "ΑκαταχώÏητο κατατετμημένο ευÏετήÏιο «%s.%s»"
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Κατατετμημένο ευÏετήÏιο «%s.%s»"
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST πίνακας «%s.%s»"
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Συνθετικός Ï„Ïπος «%s.%s»"
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Ξενικός πίνακας «%s.%s»"
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ΑκαταχώÏητος κατατετμημένος πίνακας «%s.%s»"
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Κατατετμημένος πίνακας «%s.%s»"
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "ΣÏνθεση"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "Nullable"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "ΠÏοκαθοÏισμένο"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Κλειδί;"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "ΟÏισμός"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "Επιλογές FDW"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Αποθήκευση"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Συμπίεση"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Στόχος στατιστικών"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Κατάτμηση του: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Κανένας πεÏιοÏισμός κατάτμησης"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "ΠεÏιοÏισμός κατάτμησης: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Κλειδί κατάτμησης: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Ιδιοκτήτης πίνακα «%s.%s»"
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "κÏÏιο κλειδί, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "μοναδικό"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls μη διακÏιτά"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "για πίνακα «%s.%s»"
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", Ï€Ïόβλεψη (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", συσταδοποιημένο"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", άκυÏο"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", αναβαλλόμενο"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", αÏχικά αναβαλλόμενο"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", ταυτότητα πανομοιόματος"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "ΕυÏετήÏια:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "ΠεÏιοÏισμοί ελέγχου:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "ΠεÏιοÏισμοί ξενικών κλειδιών:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "ΑναφέÏεται από:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Πολιτικές:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Πολιτικές (ενεÏγοποιημένη επιβολή ασφάλειας γÏαμμών):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Πολιτικές (ενεÏγοποιημένη ασφάλεια γÏαμμών): (καμία)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Πολιτικές (ενεÏγοποιημένη επιβολή ασφάλειας γÏαμμών): (καμία)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Πολιτικές (απενεÏγοποιημένη ασφάλεια γÏαμμών):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Αντικείμενα στατιστικών:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Κανόνες:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "ΑπενεÏγοποιημένοι κανόνες:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Κανόνες πάντα σε χÏήση:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Κανόνες σε χÏήση μόνο στο ομοίωμα:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "ΔημοσιεÏσεις:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "ΟÏισμός όψης:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Triggers:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "ΑπενεÏγοποιημένες triggers χÏήστη:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "ΑπενεÏγοποιημένες εσωτεÏικές triggers:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Triggers πάντα σε χÏήση:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Triggers σε χÏήση μόνο στο ομοίωμα:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Διακομιστής: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW επιλογές: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "ΚληÏονομεί"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "ΑÏιθμός κατατμήσεων: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "ΑÏιθμός κατατμήσεων: %d (ΧÏησιμοποιείστε \\d+ για να τους απαÏιθμήσετε.)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "ΑÏιθμός απογονικών πινάκων: %d (ΧÏησιμοποιείστε \\d+ για να τους απαÏιθμήσετε.)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Απογονικοί πίνακες"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Κατατμήσεις"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Τυποποιημένος πίνακας Ï„Ïπου: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Ταυτότητα Ομοιόματος"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Έχει OIDs: ναι"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Μέθοδος Ï€Ïόσβασης: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", χώÏος πίνακα «%s»"
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "Λίστα Ïόλων"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Όνομα Ïόλου"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "ΧαÏακτηÏιστικά"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "ΥπεÏχÏήστης"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Καμία κληÏονιμιά"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "ΔημιουÏγήστε Ïόλο"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "ΔημιουÏγήστε βάση δεδομένων"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Δεν δÏναται σÏνδεση"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "ΑντιγÏαφή"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "ΠαÏάκαμψη RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Καθόλου συνδέσεις"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d σÏνδεση"
+msgstr[1] "%d συνδέσεις"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Κωδικός Ï€Ïόσβασης ενεÏγός μέχÏι "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Ρόλος"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "Βάση δεδομένων"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Ρυθμίσεις"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Δεν βÏέθηκαν Ïυθμίσεις για το Ïόλο «%s» και τη βάση δεδομένων «%s»."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Δεν βÏέθηκαν Ïυθμίσεις για το Ïόλο «%s»."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Δεν βÏέθηκαν Ïυθμίσεις."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "Λίστα Ïυθμίσεων"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Μέλος του"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "ΧοÏηγός"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Λίστα χοÏηγιών Ïόλων"
+
+#: describe.c:3952
+msgid "index"
+msgstr "ευÏετήÏιο"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST πίνακας"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "κατατετμημένο ευÏετήÏιο"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "μόνιμο"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "Ï€ÏοσωÏινό"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "ακαταχώÏητο"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "ΔιάÏκεια"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Μέθοδος Ï€Ïόσβασης"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "Λίστα σχέσεων"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την δηλωτική δημιουÏγία κατατμήσεων πίνακα."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "Λίστα κατατμημένων ευÏετηÏίων"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "Λίστα κατατμημένων πινάκων"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "Λίστα κατατμημένων σχέσεων"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Γονικό όνομα"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Μέγεθος φÏλλου κατάτμησης"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Συνολικό μέγεθος"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Εμπιστευόμενο"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "ΕσωτεÏική γλώσσα"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "ΠÏόγÏαμμα χειÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ»Î®ÏƒÎµÏ‰Î½"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Ελεκτής"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Ενσωματωμένος χειÏιστής"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "Λίστα γλωσσών"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Έλεγχος"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Λίστα πεδίων"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Πηγή"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "ΠÏοοÏισμός"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "ΠÏοεπιλογή;"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "Λίστα μετατÏοπών"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "ΠαÏάμετÏος"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Τιμή"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "ΠεÏιεχόμενο"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "Λίστα Ïυθμίσεων παÏαμέτÏων"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "Λίστα μη Ï€Ïοεπιλεγμένων Ïυθμίσεων παÏαμέτÏων"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει εναÏσματα συμβάντων."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Συμβάν"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "ενεγÏοποιημένο"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "ομοίωμα"
+
+#: describe.c:4658
+msgid "always"
+msgstr "πάντα"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "απενεÏγοποιημένο"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "ΕνεÏγοποιημένο"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Ετικέτες"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "Λίστα ενεÏγοποιήσεων συμβάντων"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει εκτεταμένες στατιστικές."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Dependencies"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "Λίστα εκτεταμένων στατιστικών"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "ΤÏπος πηγής"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "ΤÏπος Ï€ÏοοÏιστμοÏ"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "σε ανάθεση"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Έμμεσα;"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "Λίστα casts"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "ΠάÏοχος"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "ÎτετεÏμινιστικό;"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "Λίστα συÏÏαφών"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Λίστα σχημάτων"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "Λίστα αναλυτών αναζήτησης κειμένου"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Δεν βÏήκε ανάλυση αναζήτησης κειμένου με το όνομα «%s»."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Δεν βÏήκε ανάλυση αναζήτησης κειμένου."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Εκκίνηση ανάλυσης"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Μέθοδος"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Λήψη επόμενου ενδεικτικοÏ"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Τέλος ανάλυσης"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Λήψη επικεφαλίδας"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Λήψη Ï„Ïπων ενδεικτικών"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Αναλυτής αναζήτης κειμένου «%s.%s»"
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Αναλυτής αναζήτης κειμένου «%s»"
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Ονομασία ενδεικτικοÏ"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "ΤÏποι ενδεικτικών αναλυτή «%s.%s»"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "ΤÏποι ενδεικτικών αναλυτή «%s»"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "ΠÏότυπο"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Επιλογές εκκίνησης"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "Λίστα λεξικών αναζήτησης κειμένου"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "Εκκίνηση"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "Λίστα Ï€ÏοτÏπων αναζήτησης κειμένου"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "Λίστα Ïυθμίσεων αναζήτησης κειμένου"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Δεν βÏέθηκαν Ïυθμίσεις αναζήτησης κειμένου με όνομα «%s»."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Δεν βÏέθηκαν Ïυθμίσεις αναζήτησης κειμένου."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Ενδεικτικό"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Λεξικά"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "ΡÏθμιση αναζήτησης κειμένου «%s.%s»"
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "ΡÏθμιση αναζήτησης κειμένου «%s»"
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Αναλυτής: «%s.%s»"
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Αναλυτής: «%s»"
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "Λίστα πεÏιτÏλιξης ξένων δεδομένων"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "ΠεÏιτÏλιξη ξένων δεδομένων"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "Έκδοση"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "Λίστα ξενικών διακομιστών"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Διακομιστής"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Όνομα χÏήστη"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "Λίστα αντιστοιχιών χÏηστών"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "Λίστα ξενικών πινάκων"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "Λίστα εγκατεστημένων επεκτάσεων"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Δεν βÏέθηκε καμία επέκταση με το όνομα «%s»."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Δεν βÏέθηκαν επεκτάσεις."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "ΠεÏιγÏαφή αντικειμένου"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Αντικείμενα στην επέκταση «%s»"
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ακατάλληλο αναγνωÏισμένο όνομα (πάÏα πολλά διάστικτα ονόματα): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "οι παÏαπομπές Î¼ÎµÏ„Î±Î¾Ï Î²Î¬ÏƒÎµÏ‰Î½ δεδομένων δεν είναι υλοποιημένες: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει δημοσιεÏσεις."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Όλοι οι πίνακες"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Εισαγωγές"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "ΕνημεÏώσεις"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "ΔιαγÏαφές"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "ΠεÏικοπές"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Διαμέσου υπεÏχÏήστη"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "Λίστα δημοσιεÏσεων"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Δεν βÏέθηκε καμία δημοσίευση με όνομα «%s»."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Δεν βÏέθηκε καμία δημοσίευση."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "Δημοσίευση %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Πίνακες:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Πίνακες από σχήματα:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει συνδÏομές."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "Δημοσίευση"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Δυαδικό"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "Ροής"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Συναλλαγή δÏο φάσεων"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "ΑπενεÏγοποίηση μετά από σφάλμα"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Πηγή"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Απαιτείται κωδικός Ï€Ïόσβασης"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "ΤÏέξτε ως ιδιοκτήτης;"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "ΣÏγχÏονη δέσμευση"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "ΠαÏάλειψη LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "Λίστα συνδÏομών"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "ΑΜ"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "ΤÏπος εισόδου"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "ΤÏπος αποθήκευσης"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "Κλάση χειÏιστή"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "Οικογένεια χειÏιστή"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "Λίστα οικογένειας κλάσεων"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "ΕφαÏμόσιμοι Ï„Ïποι"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "Λίστα οικογενειών χειÏιστών"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "ΧειÏιστής"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "ΣτÏατηγική"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "διάταξη"
+
+#: describe.c:6911
+msgid "search"
+msgstr "αναζήτηση"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Στόχος"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "Διάταξη opfamily"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "Λίστα χειÏιστών των οικογενειών χειÏιστών"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "ΚαταχωÏημένος αÏιστεÏός Ï„Ïπος"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "ΚαταχωÏημένος δεξιός Ï„Ïπος"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "ΑÏιθμός"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "Λίστα συναÏτήσεων υποστήÏιξης των οικογενειών χειÏιστών"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Μεγάλα αντικείμενα"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql είναι το διαδÏαστικό τεÏματικό της PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [ΕΠΙΛΟΓΗ]... [DBNAME [USERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Γενικές επιλογές:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=COMMAND εκτέλεσε μόνο μία μονή εντολή (SQL ή εσωτεÏική) και έξελθε\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων στην οποία θα συνδεθείτε (Ï€Ïοεπιλογή: «%s»)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME εκτέλεσε εντολές από αÏχείο, στη συνέχεια έξοδος\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list απαÏίθμησε τις διαθέσιμες βάσεις δεδομένων, στη συνέχεια έξοδος\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" ÏŒÏισε την μεταβλητή της psql NAME στην τιμή VALUE\n"
+" (π.χ., -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc να μην διαβαστεί το αÏχείο εκκίνησης (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 («one»), --single-transaction\n"
+" εκτέλεσε ως μεμονωμένη συναλλαγή (εάν δεν είναι διαδÏαστική)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] εμφάνισε αυτής της βοήθειας και, στη συνέχεια, έξοδος\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands απαÏίθμησε τις εντολές ανάποδης καθέτου και, στη συνέχεια, έξοδος\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables απαÏίθμησε τις ειδικές μεταβλητές και, στη συνέχεια, έξοδος\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Επιλογές εισόδου και εξόδου:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all echo όλη την είσοδο από σενάÏιο\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors echo όλες τις αποτυχημένες εντολές\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries echo τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden εμφάνισε εÏωτήματα που δημιουÏγοÏνται από εσωτεÏικές εντολές\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME στείλε την καταγÏαφή της συνεδÏίας στο αÏχείο\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline απενεÏγοποιήσε την βελτιωμένη επεξεÏγασία γÏαμμής εντολών (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME στείλε τα αποτελέσματα εÏωτημάτων σε αÏχείο (ή |pipe)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet εκτέλεσε σιωπηλά (καθόλου μηνÏματα, μόνο έξοδος εÏωτημάτων)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step λειτουÏγία Î¼Î¿Î½Î¿Ï Î²Î®Î¼Î±Ï„Î¿Ï‚ (επιβεβαίωσε κάθε εÏώτημα)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line λειτουÏγία μονής γÏαμμής (το τέλος της γÏαμμής τεÏματίζει την εντολή SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Επιλογές μοÏφής εξόδου:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align λειτουÏγία εξόδου πίνακα μη ευθυγÏαμμισμένη λειτουÏγία εξόδου πίνακα\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv λειτουÏγία εξόδου πίνακα CSV (τιμές διαχωÏισμένες με κόμματα)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" διαχωÏιστικό πεδίου για μη ευθυγÏαμμισμένη έξοδο (Ï€Ïοεπιλογή: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html λειτουÏγία εξόδου πίνακα HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] ÏŒÏισε την επιλογή εκτÏπωσης VAR σε ARG (δείτε την εντολή \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" διαχωÏιστικό εγγÏαφών για μη ευθυγÏαμμισμένη έξοδο (Ï€Ïοεπιλογή: νέα γÏαμμή)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only εκτÏπωσε μόνο γÏαμμές\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT ÏŒÏισε τα χαÏακτηÏιστικά ετικετών πίνακα HTML (Ï€.χ. πλάτος, πεÏίγÏαμμα)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ενεÏγοποίησε λειτουÏγία εκτεταμένης εξόδου πίνακα\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" ÏŒÏισε το διαχωÏιστικό πεδίου για μη ευθυγÏαμμισμένη έξοδο στο μηδενικό byte\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" ÏŒÏισε το διαχωÏιστικό εγγÏαφών για μη ευθυγÏαμμισμένη έξοδο στο μηδενικό byte\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σÏνδεσης:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME κεντÏικός υπολογιστής διακομιστή βάσης δεδομένων ή κατάλογος υποδοχών (Ï€Ïοεπιλογή: «%s»)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "τοπική υποδοχή"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων (Ï€Ïοεπιλογή: «%s»)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη βάσης δεδομένων (Ï€Ïοεπιλογή: «%s»)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης (Ï€Ïέπει να συμβεί αυτόματα)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Για πεÏισσότεÏες πληÏοφοÏίες, πληκτÏολογήστε \"\\?\" (για εσωτεÏικές εντολές) ή «\\help» (για SQL\n"
+"εντολές) μέσα από το psql, ή συμβουλευτείτε την ενότητα psql στην τεκμηÏίωση της PostgreSQL\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Γενικά\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... ÏŒÏισε τις παÏαμέτÏους του εÏωτήματος\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright εμφάνισε τους ÏŒÏους χÏήσης και διανομής της PostgreSQL\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] εκτέλεσε το εÏώτημα και εμφάνισε Ï„o αποτελέσμα σε όψη crosstab\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose εμφάνισε το πιο Ï€Ïόσφατο μήνυμα σφάλματος στη μέγιστη λεπτομέÏεια\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] εκτέλεσε το εÏώτημα (και στείλε το αποτελέσματα σε αÏχείο ή |pipe).\n"
+" \\g χωÏίς οÏίσματα ισοδυναμεί με το εÏωματικό\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc πεÏίγÏαψε το αποτέλεσμα του εÏωτήματος, χωÏίς να εκτελεστεί\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec εκτέλεσε το εÏώτημα και, στη συνέχεια, εκτέλεσε κάθε τιμή του αποτελέσματός της\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] εκτέλεσε το εÏώτημα και αποθήκευσε το αποτελέσμα σε psql μεταβλητές\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] όμοια με \\g, αλλά επιβάλλει λειτουÏγία εκτεταμένης εξόδου\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q τεÏμάτισε psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] εκτέλεση εÏωτήματος κάθε SEC δευτεÏόλεπτα, έως και N φοÏές\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Βοήθεια\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] εμφάνισε την βοήθεια για τις εντολές ανάποδης καθέτου\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options εμφάνισε την βοήθεια για τις επιλογές εντολών γÏαμμής της psql\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables εμφάνισε την βοήθεια για τις ειδικές μεταβλητές\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] βοήθεια για την σÏνταξη των εντολών SQL, * για όλες τις εντολών\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Ενδιάμεση μνήμη ΕÏωτήματος\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] επεξεÏγάσου την ενδιάμεση μνήμη (ή αÏχείο) εÏωτήματος με εξωτεÏικό επεξεÏγαστή κειμένου\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] επεξεÏγάσου τον οÏισμό της συνάÏτησης με εξωτεÏικό επεξεÏγαστή κειμένου\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] επεξεÏγάσου τον οÏισμό της όψης με εξωτεÏικό επεξεÏγαστή κειμένου\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p εμφάνισε τα πεÏιοχόμενα της ενδιάμεσης μνήμης εÏωτήματος\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r επαναφοÏά (αÏχικοποίηση) της ενδιάμεσης μνήμης εÏωτήματος\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] εμφάνισε το ιστοÏικό η αποθήκευσε το σε αÏχείο\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE γÏάψε την ενδιάμεση μνήμη εÏωτήματος σε αÏχείο\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "Είσοδος/Έξοδος\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... εκτέλεσε SQL COPY με Ïοή δεδομένων σε διακομιστή πελάτη\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] γÏάψε την στοιχειοσειÏά στην τυπική έξοδο (-n για παÏάληψη νέας γÏαμμής)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE εκτέλεσε εντολές από αÏχείο\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE όπως \\i, αλλά σε σχέση με την τοποθεσία του Ï„Ïέχοντος σεναÏίου\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] στείλε όλα τα αποτελέσματα εÏωτημάτων σε αÏχείο ή |pipe\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] γÏάψε την στοιχειοσειÏά στην Ïοή εξόδου \\o (-n για παÏάληψη νέας γÏαμμής)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] γÏάψε την στοιχειοσειÏά στο τυπικό σφάλμα (-n για παÏάληψη νέας γÏαμμής)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Υπό συνθήκη\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR έναÏξη υπό συνθήκης μπλοκ\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR εναλλακτική λÏση εντός του Ï„Ïέχοντος μπλοκ υπό ÏŒÏους\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else τελική εναλλακτική λÏση εντός του Ï„Ïέχοντος μπλοκ υπό ÏŒÏους\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif τεÏματισμός μπλοκ υπό ÏŒÏους\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "ΠληÏοφοÏιακά\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (επιλογές: S = εμφάνισε αντικείμενα συστήματος, + = επιπλέον λεπτομέÏιες)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] εμφάνισε πίνακες, όψεις και σειÏές\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME πεÏιέγÏαψε πίνακα, όψη, σειÏά, ή ευÏετήÏιο\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] απαÏίθμησε συγκεντÏωτικά\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] απαÏίθμησε μεθόδους Ï€Ïόσβασης\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] απαÏίθμησε κλάσεις χειÏιστή\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] απαÏίθμησε οικογένειες χειÏιστών\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] απαÏίθμησε χειÏιστές των οικογενειών χειÏιστών\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] απαÏίθμησε συναÏτήσεις των οικογενειών χειÏιστών\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] απαÏίθμησε πινακοχώÏους\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] απαÏίθμησε μετατÏοπές\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] απαÏίθμησε παÏαμέτÏους ÏÏθμισης\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] απαÏίθμησε casts\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] εμφάνισε πεÏιγÏαφές αντικειμένων που δεν φαίνονται πουθενά αλλοÏ\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] απαÏίθμησε πεδία\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] απαÏίθμησε Ï€Ïοεπιλεγμένα Ï€Ïονόμια\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] απαÏίθμησε ξενικοÏÏ‚ πίνακες\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] απαÏίθμησε ξενικοÏÏ‚ διακομιστές\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] απαÏίθμησε ξενικοÏÏ‚ πίνακες\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] απαÏίθμησε αντιστοιχίες χÏηστών\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] απαÏίθμησε πεÏιτυλίξεις ξένων δεδομένων\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN …]]\n"
+" απαÏίθμησε συναÏτήσεις [μόνο agg/normal/procedures/trigger/window]\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] απαÏίθμησε Ïυθμίσεις αναζήτησης κειμένου\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] απαÏίθμησε λεξικά αναζήτησης κειμένου\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] απαÏίθμησε αναλυτές αναζήτησης κειμένου\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] απαÏίθμησε Ï€Ïότυπα αναζήτησης κειμένου\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] απαÏίθμησε Ïόλους\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] απαÏίθμησε ευÏετήÏια\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] απαÏίθμησε μεγάλα αντικείμενα, όπως \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] απαÏίθμησε διαδικαστικές γλώσσες\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] απαÏίθμησε υλοποιημένες όψεις\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] απαÏίθμησε σχήματα\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" απαÏίθμησε χειÏιστές\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] απαÏίθμησε συÏÏαφές\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [PATTERN] απαÏίθμησε Ï€Ïονόμια Ï€Ïόσβασης πίνακα, όψης και σειÏάς\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] απαÏίθμησε διαχωÏισμένες σχέσεις [μόνο ευÏετήÏιο/πίνακα] [n=nested]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] απαÏίθμησε Ïυθμίσεις Ïόλου ανά βάση δεδομένων\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [PATTERN] απαÏίθμησε χοÏηγοÏÏ‚ Ïόλων\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] απαÏίθμησε δημοσιεÏσεις αναπαÏαγωγής\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] απαÏίθμησε συνδÏομές αναπαÏαγωγής\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] απαÏίθμησε ακολουθίες\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] απαÏίθμησε πίνακες\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] απαÏίθμησε Ï„Ïπους δεδομένων\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] απαÏίθμησε Ïόλους\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] απαÏίθμησε όψεις\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] απαÏίθμησε Ï€Ïοεκτάσεις\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] απαÏίθμησε εναÏσματα συμβάντων\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] απαÏίθμησε εναÏσματα συμβάντων\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] απαÏίθμησε βάσεις δεδομένων\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME εμφάνισε τον οÏισμό μίας συνάÏτησης\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME εμφάνισε τον οÏισμό μίας όψης\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [PATTERN] όπως \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Μεγάλα αντικείμενα\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE εγγÏαφή μεγάλου αντικειμένου σε αÏχείο\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENT]\n"
+" ανάγνωση μεγάλων αντικειμένων από αÏχείο\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] απαÏίθμησε μεγάλα αντικείμενα\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID διαγÏαφή μεγάλου αντικειμένου\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "ΜοÏφοποίηση\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a εναλλαγή Î¼ÎµÏ„Î±Î¾Ï Î¼Î· ευθυγÏαμμισμένης και ευθυγÏαμμισμένης μοÏφής εξόδου\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] ÏŒÏισε τίτλο πίνακα, ή αναίÏεσε εάν κενό\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [STRING] εμφάνισε ή ÏŒÏισε τον διαχωÏιστή πεδίου για μη ευθυγÏαμμισμένη έξοδο εÏωτήματος\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H εναλλαγή λειτουÏγίας εξόδου HTML (επί του παÏόντος %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] ÏŒÏισε την επιλογή εξόδου πίνακα\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] εμφάνισε μόνο γÏαμμές (επί του παÏόντος %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] οÏίστε χαÏακτηÏιστικά ετικέτας <table> HTML, ή αναιÏέστε εάν δεν υπάÏχουν\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] εναλλαγή τιμής διευÏυμένης εξόδου (επί του παÏόντος %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "αυτόματο"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "ΣÏνδεση\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" σÏνδεση σε νέα βάση δεδομένων (επί του παÏόντος «%s»)\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" σÏνδεση σε νέα βάση δεδομένων (επί του παÏόντος καμία σÏνδεση)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo εμφάνιση πληÏοφοÏιών σχετικά με την παÏοÏσα σÏνδεση\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] εμφάνισε ή ÏŒÏισε την κωδικοποίηση του πελάτη\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] άλλαξε με ασφάλεια τον κωδικό Ï€Ïόσβασης ενός χÏήστη\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "ΛειτουÏγικό σÏστημα\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] άλλαξε τον παÏόν κατάλογο εÏγασίας\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR λήψη μεταβλητής πεÏιβάλλοντος\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] ÏŒÏισε ή αναίÏεσε μεταβλητή πεÏιβάλλοντος\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] εναλλαγή χÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Ï„Ï‰Î½ εντολών (επί του παÏόντος %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [COMMAND] εκτέλεσε εντολή σε κέλυφος ή ξεκίνησε διαδÏαστικό κέλυφος\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Μεταβλητές\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME Ï€ÏοέτÏεψε τον χÏήστη να οÏίσει εσωτεÏική μεταβλητή\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [VALUE]] ÏŒÏισε εσωτεÏική μεταβλητή, ή απαÏίθμησέ τες όλες εάν δεν υπάÏχουν παÏάμετÏοι\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME αναίÏεσε (διέγÏαψε) εσωτεÏική μεταβλητή\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"ΑπαÏίθμηση των ειδικά επεξεÏγασμένων μεταβλητών\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql μεταβλητές:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" ή \\set NAME VALUE μέσα σε psql\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" εφόσον οÏισμένο, επιτυχημένες εντολές SQL ολοκληÏώνονται αυτόματα\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" καθοÏίζει τον Ï„Ïπο (πεζά, κεφαλαία) για την ολοκλήÏωση ÏŒÏων SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" ονομασία της συνδεδεμένης βάσης δεδομένων\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" ελέγχει ποία είσοδος γÏάφεται στην τυπική έξοδο\n"
+" [all, errors, none, queries]\n"
+"\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" εάν έχει οÏιστεί, εμφανίστε εσωτεÏικά εÏωτήματα που εκτελοÏνται από εντολές ανάστÏωσής τους.\n"
+" εάν οÏιστεί σε \"noexec\", απλά δείξτε τους χωÏίς εκτέλεση\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" Ï„Ïέχουσα κωδικοποίηση χαÏακτήÏων του Ï€ÏογÏάμματος-πελάτη\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ΣΦΑΛΜΑ\n"
+" \"true\" αν το τελευταίο εÏώτημα απέτυχε, αλλιώς \"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" αÏιθμός των σειÏών αποτελεσμάτων για λήψη και εμφάνιση ανά επανάλληψη (0 = απεÏιόÏιστος)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" εάν έχει οÏιστεί, δεν εμφανίζονται μέθοδοι Ï€Ïόσβασης πίνακα\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" εάν έχει οÏιστεί, δεν εμφανίζονται μέθοδοι συμπίεσης\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" ελέγχει το ιστοÏικό εντολών [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" όνομα αÏχείου που χÏησιμοποιείται για την αποθήκευση του ιστοÏÎ¹ÎºÎ¿Ï ÎµÎ½Ï„Î¿Î»ÏŽÎ½\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" μέγιστος αÏιθμός εντολών που θα αποθηκευτοÏν στο ιστοÏικό εντολών\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" ο συνδεδεμένος κεντÏικός υπολογιστής διακομιστή βάσης δεδομένων\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" αÏιθμός των EOF που απαιτοÏνται για τον τεÏματισμό μιας διαδÏαστικής συνεδÏίας\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" τιμή του τελευταίου επηÏεασμένου OID\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" μήνυμα και SQLSTATE του τελευταίου σφάλματος, ή κενή συμβολοσειÏά και \"00000\" εάν δεν\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" εάν έχει οÏιστεί, ένα σφάλμα δεν διακόπτει μια συναλλαγή (χÏησιμοποιεί έμμεσα σημεία αποθήκευσης)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" σταμάτησε την ομαδική εκτέλεση μετά από σφάλμα\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" θÏÏα διακομιστή της Ï„Ïέχουσας σÏνδεσης\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" οÏίζει την τυπική Ï€ÏοτÏοπή psql\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" καθοÏίζει την Ï€ÏοτÏοπή που χÏησιμοποιείται όταν μια Ï€Ïόταση συνεχίζεται από Ï€ÏοηγοÏμενη γÏαμμή\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" καθοÏίζει την Ï€ÏοτÏοπή που χÏησιμοποιείται κατά την διάÏκεια COPY … FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" σιωπηλή εκτέλεση(όμοια με την επιλογή -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" αÏιθμός των επηÏεασμένων ή επιστÏεφομένων σειÏών του τελευταίου εÏωτήματος, ή 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" έκδοση διακομιστή (σε σÏντομη συμβολοσειÏά ή αÏιθμητική μοÏφή)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" \"true\" αν η τελευταία εντολή κελÏφους απέτυχε, \"false\" αν πέτυχε\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" κατάσταση εξόδου της τελευταίας εντολής του κελÏφους\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" εμφάνισε όλα τα αποτελέσματα εÏωτημάτων (\\;) αντί μόνο του τελευταίου\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" ελέγχει την εμφάνιση των πεδίων του πεÏιεχομένου μηνÏματος [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" εάν έχει οÏιστεί, το τέλος γÏαμμής ολοκληÏώνει τα εÏωτήματα SQL (όμοια με την επιλογή -S)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" λειτουÏγία μονοÏ-βήματος(όμοια με την επιλογή -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE του τελευταίου εÏωτήματος, ή «00000» εάν δεν υπήÏξαν σφάλματα\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" ο Ï„Ïέχων συνδεδεμένος χÏήστης βάσης δεδομένων\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" ελέγχει την πεÏιφÏαστικότητα των αναφοÏών σφαλμάτων [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" η έκδοση της psql (σε πεÏιγÏαφική συμβολοσειÏά, σÏντομη συμβολοσειÏά, ή αÏιθμητική μοÏφή)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Ρυθμίσεις εμφάνισης:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" ή \\set NAME VALUE μέσα σε συνεδÏία psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" στυλ πεÏιγÏάμματος (αÏιθμός)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" πλάτος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ±Ï„Î¬ την εμφάνιση αναδιπλωμένης μοÏφής\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (ή x)\n"
+" διευÏυμένη έξοδος [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" διαχωÏιστικό πεδίου σε μοÏφή μή ευθυγÏαμισμένης εξόδου (Ï€ÏοκαθοÏιμένο «%s»)\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" οÏίζει το διαχωÏιστικό πεδίου για τη μοÏφή μη ευθυγÏαμμισμένης εξόδου στο μηδενικό byte\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" ενεÏγοποιεί ή απενεÏγοποιεί την εμφάνιση του υποσέλιδου σε πίνακα [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" οÏίζει τη μοÏφή εξόδου [unaligned, aligned, wrapped, html, asciidoc, …]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" οÏίζει τη μοÏφή πεÏιγÏάμματος [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" οÏίζει τη συμβολοσειÏά που θα εκτυπωθεί στη θέση κενής τιμής\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ενεÏγοποίηση εμφάνισης ενός χαÏακτήÏα εντοπιότητας για το διαχωÏισμό ομάδων ψηφίων\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" Pager\n"
+" ελέγχει πότε χÏησιμοποιείται εξωτεÏικός σελιδοποιητής [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" διαχωÏιστικό εγγÏαφών (σειÏάς) κατά την έξοδο μη ευθυγÏαμμισμένης μοÏφής\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" οÏίζει το διαχωÏιστικό εγγÏαφών στο μηδενικό byte κατά την έξοδο μη ευθυγÏαμμισμένης μοÏφής\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (ή T)\n"
+" καθοÏίζει τα χαÏακτηÏιστικά ενός πίνακα tag σε μοÏφή HTML, ή καθοÏίζει\n"
+" αναλογικό πλάτος στηλών για Ï„Ïπους δεδομένων με αÏιστεÏή στοίχιση σε μοÏφή latex-longtable\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" οÏίζει τον τίτλο πίνακα για χÏήση στους επόμενα εκτυπωμένους πίνακες\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" εάν έχει οÏισθεί, τότε εμφανίζονται μόνο τα δεδομένα πίνακα\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" οÏισμός του στυλ γÏαμμής Unicode [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Μεταβλητές πεÏιβάλλοντος:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql …\n"
+" ή \\setenv ΟÎΟΜΑ [ΤΙΜΗ] μέσα σε συνεδÏία psql\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" οÏίστε NAME=VALUE\n"
+" psql ...\n"
+" ή \\setenv NAME [VALUE] μέσα σε συνεδÏία psql\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" αÏιθμός στηλών για αναδιπλωμένη μοÏφή\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" όμοια με την παÏάμετÏο σÏνδεσης application_name\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" όμοια με την παÏάμετÏο σÏνδεσης dbname\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" όμοια με την παÏάμετÏο της σÏνδεσης κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î®\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" αÏχείο κωδικών Ï€Ïόσβασης\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" κωδικός Ï€Ïόσβασης σÏνδεσης (δεν συνιστάται)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" όμοια με την παÏάμετÏο σÏνδεσης θÏÏας\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" όμοια με την παÏάμετÏο σÏνδεσης χÏήστη\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" Ï€ÏόγÏαμμα επεξεÏγασίας κειμένου που χÏησιμοποιείται από τις εντολές \\e, \\ef και \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" Ï„Ïόπος καθοÏÎ¹ÏƒÎ¼Î¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï Î³Ïαμμής κατά την κλήση του επεξεÏγαστή κειμένου\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" εναλλακτική τοποθεσία για το αÏχείο ιστοÏÎ¹ÎºÎ¿Ï ÎµÎ½Ï„Î¿Î»ÏŽÎ½\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" όνομα του εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος σελιδοποίησης\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" όνομα του εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος σελιδοποίησης για \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" εναλλακτική τοποθεσία για το αÏχείο .psqlrc του χÏήστη\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell που χÏησιμοποιείται κατά την εντολή \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" κατάλογος για Ï€ÏοσωÏινά αÏχεία\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "Διαθέσιμη βοήθεια:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Εντολή: %s\n"
+"ΠεÏιγÏαφή: %s\n"
+"ΣÏνταξη:\n"
+"%s\n"
+"\n"
+"ΔιεÏθυνση URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Δεν υπάÏχει διαθέσιμη βοήθεια για το \"%s\".\n"
+"Δοκιμάστε \\h χωÏίς παÏαμέτÏους για να δείτε τη διαθέσιμη βοήθεια.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η αποθήκευση του ιστοÏÎ¹ÎºÎ¿Ï ÏƒÏ„Î¿ αÏχείο «%s»: %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "το ιστοÏικό δεν υποστηÏίζεται από την παÏοÏσα εγκατάσταση"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: δεν είναι συνδεμένο σε μία βάση δεδομένων"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: η Ï„Ïέχουσα συναλλαγή ματαιώθηκε"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: άγνωστη κατάσταση συναλλαγής"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: με διαφυγή"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "ΧÏησιμοποιείστε «\\q» για να εξέλθετε %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Η είσοδος είναι μια απόθεση PostgreSQL Ï€ÏοσαÏμοσμένης μοÏφής.\n"
+"ΧÏησιμοποιήστε το Ï€ÏόγÏαμμα γÏαμμής εντολών pg_restore για να επαναφέÏετε αυτήν την απόθεση σε μια βάση δεδομένων.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "ΧÏησιμοποιείστε \\? για βοήθεια ή πληκτÏολογήστε control-C για να αδειάσετε την ενδιάμεση μνήμη εισόδου."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "ΧÏησιμοποιείστε \\? για βοήθεια."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "ΧÏησιμοποιείτε psql, τη διασÏνδεση γÏαμμής εντολών της PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"ΠληκτÏολογείστε: \\copyright για τους ÏŒÏους διανομής\n"
+" \\h για βοήθεια σχετικά με τις εντολές SQL\n"
+" \\? για βοήθεια σχετικά με τις εντολές psql\n"
+" \\g ή ολοκληÏώστε με εÏωτηματικό για να εκτελέσετε εÏώτημα\n"
+" \\q για έξοδο\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "ΧÏησιμοποιείστε «\\q» για να εξέλθετε."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "ΠληκτÏολογείστε control-D για να εξέλθετε."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "ΠληκτÏολογείστε control-D για να εξέλθετε."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "το εÏώτημα παÏαβλέφθηκε· χÏησιμοποιήστε το \\endif ή το Ctrl-C για να κλείσετε το Ï„Ïέχον υπό συνθήκη \\if μπλοκ"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "έφτασε στο EOF χωÏίς να βÏεθοÏν τελικά \\endif(s)"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "ανολοκλήÏωτη συμβολοσειÏά με εισαγωγικά"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: έλλειψη μνήμης"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "ονομασία"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "new_name"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "new_owner"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "new_schema"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "όπου aggregate_signature είναι:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "argmode"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "argname"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "argtype"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "επιλογή"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "όπου option μποÏεί να είναι:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "connlimit"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "new_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "configuration_parameter"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "value"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "target_role"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "schema_name"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "abbreviated_grant_or_revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "όπου abbreviated_grant_or_revoke είναι ένα από:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "role_name"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "expression"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "domain_constraint"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "constraint_name"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "new_constraint_name"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "new_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "member_object"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "όπου member_object είναι:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "object_name"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "source_type"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "source_type"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "function_name"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "operator_name"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "source_type"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "source_type"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "source_type"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "procedure_name"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "routine_name"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "type_name"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "lang_name"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "και aggregate_signature είναι:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "handler_function"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "validator_function"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "action"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "column_name"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "new_column_name"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "όπου action είναι ένα από:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "data_type"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "collation"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "column_constraint"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "integer"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "attribute_option"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "table_constraint"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "trigger_name"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "parent_table"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "extension_name"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "result_rows"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "support_function"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "user_name"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "όπου role_specification μποÏεί να είναι:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "group_name"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "group_name"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "index_name"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "storage_parameter"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "column_number"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "large_object_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "strategy_number"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "op_type"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "index_name"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "support_number"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "argument_type"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "table_name"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "check_expression"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "publication_object"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "publication_parameter"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "όπου publication_object είναι ένα από:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "password"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "database_name"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "increment"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "minvalue"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "maxvalue"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "restart"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "new_target"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "publication_name"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "refresh_option"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "subscription_parameter"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "partition_name"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "partition_bound_spec"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "sequence_options"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "sequence_option"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "table_constraint_using_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "rewrite_rule_name"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "και partition_bound_spec είναι:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "και column_constraint είναι:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "default_expr"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "index_parameters"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "reftable"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "refcolumn"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "referential_action"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "και table_constraint είναι:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "exclude_element"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "operator"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "predicate"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "και table_constraint_using_index είναι:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "index_parameters για πεÏιοÏισμοÏÏ‚ UNIQUE, PRIMARY KEY και EXCLUDE είναι:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "exclude_element σε έναν πεÏιοÏισμό Ï„Ïπου EXCLUDE είναι:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "opclass"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referential_action σε ένα πεÏιοÏισμό FOREIGN KEY/REFERENCES είναι:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "tablespace_option"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "token_type"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "dictionary_name"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "old_dictionary"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "new_dictionary"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "attribute_name"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "new_attribute_name"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "new_enum_value"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "neighbor_enum_value"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existing_enum_value"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "property"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "server_name"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "view_option_name"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "view_option_value"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "table_and_columns"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "όπου option μποÏεί να είναι ένα από:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "μέγεθος"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "και table_and_columns είναι:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "transaction_mode"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "όπου transaction_mode είναι ένα από:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "relation_name"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "domain_name"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "rule_name"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "string_literal"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "transaction_id"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "filename"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "command"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "condition"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "query"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "format_name"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "delimiter_character"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "null_string"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "default_string"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "quote_character"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "escape_character"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "encoding_name"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "state_data_type"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "initial_condition"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "sort_operator"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "ή την παλαιά σÏνταξη"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "base_type"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "provider"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "κανόνες"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "version"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "existing_collation"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "source_encoding"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "dest_encoding"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "template"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "dest_encoding"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "strategy"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "icu_rules"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "constraint"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "όπου constraint είναι:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "event"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "filter_value"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "όπου column_constraint είναι:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "rettype"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "column_type"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "definition"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "obj_file"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "link_symbol"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "method"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "inline_handler"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "storage_type"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "όπου event μποÏεί να είναι ένα από:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "schema_element"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "server_type"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "server_version"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "fdw_name"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "statistics_name"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "subscription_name"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "source_table"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "like_option"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "και like_option είναι:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "directory"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "parser_name"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "source_config"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "start_function"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "gettoken_function"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "end_function"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "lextypes_function"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "headline_function"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "init_function"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "lexize_function"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "referenced_table_name"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "transition_relation_name"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "arguments"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "label"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "subtype"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "canonical_function"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "input_function"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "output_function"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "receive_function"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "send_function"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "analyze_function"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "internallength"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "alignment"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "storage"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "category"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "preferred"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "default"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "element"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "delimiter"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "with_query"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "from_item"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "cursor_name"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "output_expression"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "output_name"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "code"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "parameter"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "statement"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "direction"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "όπου κατεÏθυνση μποÏεί να είναι μία από:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "count"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "sequence_name"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "arg_name"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "arg_type"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "conflict_target"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "conflict_action"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "όπου conflict_target μποÏεί να είναι ένα από:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "index_column_name"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "και conflict_action είναι ένα από:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "channel"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "lockmode"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "όπου lockmode είναι ένα από:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "table_table_name"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "target_alias"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "join_condition"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "όπου data_source είναι:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "source_table_name"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "και when_clause είναι:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "και merge_insert είναι:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "και merge_update είναι:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "και merge_delete είναι:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "old_role"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "new_role"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "savepoint_name"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "window_name"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "window_definition"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "όπου from_item μποÏεί να είναι ένα από:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "column_alias"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "with_query_name"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "column_definition"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "join_type"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "join_column"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "και grouping_element μποÏεί να είναι ένα από:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "και with_query είναι:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "values"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "new_table"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "sort_expression"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "ματαιώστε την Ï„Ïέχουσα συναλλαγή"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "αλλάξτε τον οÏισμό μιας συνάÏτησης συγκεντÏωτικών αποτελεσμάτων"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "αλλάξτε τον οÏισμό συÏÏαφής"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "αλλάξτε τον οÏισμό μίας μετατÏοπής"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "αλλάξτε μία βάση δεδομένων"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "οÏίσθε τα Ï€Ïοεπιλεγμένα δικαιώματα Ï€Ïόσβασης"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "αλλάξτε τον οÏισμό ενός τομέα"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "αλλάξτε τον οÏισμό μιας ενεÏγοποίησης συμβάντος"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "αλλάξτε τον οÏισμό μίας Ï€Ïοέκτασης"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "αλλάξτε τον οÏισιμό μιας πεÏιτÏλιξης ξένων δεδομένων"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "αλλάξτε τον οÏισιμό ενός Î¾ÎµÎ½Î¹ÎºÎ¿Ï Ï€Î¯Î½Î±ÎºÎ±"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "αλλάξτε τον οÏισμό μιας συνάÏτησης"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "αλλάξτε το όνομα Ïόλου ή ιδιότητας μέλους"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "αλλάξτε τον οÏισμό ενός ευÏετηÏίου"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "αλλάξτε τον οÏισμό μιας διαδικαστικής γλώσσας"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "αλλάξτε τον οÏισιμό ενός μεγάλου αντικειμένου"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "αλλάξτε τον οÏισμό μίας υλοποιημένης όψης"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "αλλάξτε τον οÏισμό ενός χειÏιστή"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "αλλάξτε τον οÏισμό μίας κλάσης χειÏιστή"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "αλλάξτε τον οÏισμό μίας οικογένειας χειÏιστή"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "αλλάξτε τον οÏισμό μιας πολιτικής ασφάλειας επιπέδου σειÏάς"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "αλλάξτε τον οÏισμό μίας διαδικασίας"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "αλλάξτε τον οÏισμό μίας δημοσίευσης"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "αλλάξτε τον Ïόλο μίας βάσης δεδομένων"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "αλλάξτε τον οÏισμό μιας Ïουτίνας"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "αλλάξτε τον οÏισμό ενός κανόνα"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "αλλάξτε τον οÏισμό ενός σχήματος"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "αλλάξτε τον οÏισμό μίας γεννήτÏιας ακολουθίας"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "αλλάξτε τον οÏισμό ενός Î¾ÎµÎ½Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "αλλάξτε τον οÏισμό ενός εκτεταμένου αντικειμένου στατιστικών"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "αλλάξτε τον οÏισμό μιας συνδÏομής"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "αλλάξτε μία παÏάμετÏο διαμόÏφωσης διακομιστή"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "αλλάξτε τον οÏισμό ενός πίνακα"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "αλλάξτε τον οÏισμό ενός πινακοχώÏου"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "αλλάξτε τον οÏισμό μίας διαμόÏφωσης αναζήτησης κειμένου"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "αλλάξτε τον οÏισμό ενός Î»ÎµÎ¾Î¹ÎºÎ¿Ï Î±Î½Î±Î¶Î®Ï„Î·ÏƒÎ·Ï‚ κειμένου"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "αλλάξτε τον οÏισμό ενός αναλυτή αναζήτησης κειμένου"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "αλλάξτε τον οÏισμό ενός Ï€ÏοτÏπου αναζήτησης κειμένου"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "αλλάξτε τον οÏισμό μιας ενεÏγοποίησης"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "αλλάξτε τον οÏισμό ενός Ï„Ïπου"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "αλλάξτε τον οÏισμό μίας αντιστοίχισης χÏήστη"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "αλλάξτε τον οÏισμό μίας όψης"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "συλλέξτε στατιστικά σχετικά με μία βάση δεδομένων"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "εκκινήστε ένα μπλοκ συναλλαγής"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "κλήση διαδικασίας"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "επιβάλλετε εισαγωγή ενός σημείου ελέγχου (checkpoint) του write-ahead log"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "κλείστε έναν δÏομέα"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "δημιουÏγείστε συστάδα ενός πίνακα σÏμφωνα με ένα ευÏετήÏιο"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "οÏίσετε ή αλλάξτε το σχόλιο ενός αντικειμένου"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "ολοκληÏώστε την Ï„Ïέχουσας συναλλαγής"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "ολοκληÏώστε μία συναλλαγή που είχε Ï€Ïοετοιμαστεί νωÏίτεÏα για ολοκλήÏωση σε δÏο φάσεις"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "αντιγÏάψτε δεδομένα Î¼ÎµÏ„Î±Î¾Ï ÎµÎ½ÏŒÏ‚ αÏχείου και ενός πίνακα"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "οÏίσετε μία νέα μέθοδο Ï€Ïόσβασης"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "οÏίσετε μία νέα συνάÏτηση συγκεντÏωτικών αποτελεσμάτων"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "οÏίσετε ένα νέο καστ"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "οÏίσετε μία νέα συÏÏαφή"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "οÏίσετε μία νέα μετατÏοπή κωδικοποίησης"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "δημιουÏγήστε μία νέα βάση δεδομένων"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "οÏίσετε ένα νέο πεδίο"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "οÏίσετε μία νέα ενεÏγοποίησης συμβάντος"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "εγκαταστήστε μία νέα Ï€Ïοέκταση"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "οÏίσετε μία νέα πεÏιτÏλιξη ξένων δεδομένων"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "οÏίσετε ένα νέο ξενικό πίνακα"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "οÏίσετε μία νέα συνάÏτηση"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "οÏίστε έναν νέο Ïόλο βάσης δεδομένων"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "οÏίστε ένα νέο ευÏετήÏιο"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "οÏίστε μία νέα διαδικαστική γλώσσα"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "οÏίστε μία νέα υλοποιημένη όψη"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "οÏίστε έναν νέο χειÏιστή"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "οÏίστε μία νέα κλάση χειÏιστή"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "οÏίστε μία νέα οικογένεια χειÏιστή"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "οÏίστε μία νέα πολιτική Ï€Ïοστασίας σειÏάς για έναν πίνακα"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "οÏίστε μία νέα διαδικασία"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "οÏίστε μία νέα κοινοποιήση"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "οÏίστε ένα νέο κανόνα επανεγγÏαφής"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "οÏίστε ένα νέο σχήμα"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "οÏίστε ένα νέο παÏαγωγό ακολουθίων"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "οÏίστε ένα νέο ξενικό διακομιστή"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "οÏίστε εκτεταμένα στατιστικά στοιχεία"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "οÏίστε μία νέα συνδÏομή"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "οÏίσετε ένα νέο πίνακα"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "οÏίστε ένα νέο πίνακα από τα αποτελέσματα ενός εÏωτήματος"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "οÏίστε ένα νέο πινακοχώÏο"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "οÏίστε μία νέα διαμόÏφωση αναζήτησης κειμένου"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "οÏίστε ένα νέο λεξικό αναζήτησης κειμένου"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "οÏίστε ένα νέο αναλυτή αναζήτησης κειμένου"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "οÏίστε ένα νέο Ï€Ïότυπο αναζήτησης κειμένου"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "οÏίστε μία νέα μετατÏοπή"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "οÏίσετε μία νέα ενεÏγοποίηση"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "οÏίσετε ένα νέο Ï„Ïπο δεδομένων"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "οÏίστε μία νέα αντιστοίχιση ενός χÏήστη σε έναν ξένο διακομιστή"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "οÏίστε μία νέα όψη"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "καταÏγήστε μία Ï€Ïοετοιμασμένη δήλωση"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "οÏίστε έναν δÏομέα"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "διαγÏάψτε σειÏές ενός πίνακα"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "καταÏγήστε την κατάσταση συνεδÏίας"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "εκτελέστε ανώνυμο μπλοκ κώδικα"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "αφαιÏέστε μία μέθοδο Ï€Ïόσβασης"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "αφαιÏέστε μία συνάÏτηση συγκεντÏωτικών αποτελεσμάτων"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "αφαιÏέστε ένα καστ"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "αφαιÏέστε μία συÏÏαφή"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "αφαιÏέστε μία μετατÏοπή"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "αφαιÏέστε μία βάση δεδομένων"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "αφαιÏέστε ένα πεδίο"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "αφαιÏέστε μία ενεÏγοποίηση συμβάντος"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "αφαιÏέστε μία Ï€Ïοέκταση"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "αφαιÏέστε μία πεÏιτÏλιξη ξένων δεδομένων"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "αφαιÏέστε έναν ξενικό πίνακα"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "αφαιÏέστε μία συνάÏτηση"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "αφαιÏέστε έναν Ïόλο μίας βάσης δεδομένων"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "αφαιÏέστε ένα ευÏετήÏιο"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "αφαιÏέστε μία διαδικαστική γλώσσα"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "αφαιÏέστε μία υλοποιημένη όψη"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "αφαιÏέστε έναν χειÏιστή"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "αφαιÏέστε μία κλάση χειÏιστή"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "αφαιÏέστε μία οικογένεια χειÏιστή"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "αφαιÏέστε αντικειμένα βάσης δεδομένων που ανήκουν σε Ïόλο βάσης δεδομένων"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "αφαιÏέστε μία πολιτική ασφαλείας επιπέδου σειÏάς από έναν πίνακα"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "αφαιÏέστε μία διαδικασία"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "αφαιÏέστε μία δημοσίευση"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "αφαιÏέστε μία Ïουτίνα"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "αφαιÏέστε έναν κανόνα επανεγγÏαφής"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "αφαιÏέστε ένα σχήμα"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "αφαιÏέστε μία ακολουθία"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "αφαιÏέστε έναν πεÏιγÏαφέα Î¾ÎµÎ½Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "αφαιÏέστε εκτεταμένα στατιστικά στοιχεία"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "αφαιÏέστε μία συνδÏομή"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "αφαιÏέστε έναν πίνακα"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "αφαιÏέστε έναν πινακοχώÏο"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "αφαιÏέστε μία διαμόÏφωση αναζήτησης κειμένου"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "αφαιÏέστε ένα λεξικό αναζήτησης κειμένου"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "αφαιÏέστε έναν αναλυτή αναζήτησης κειμένου"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "αφαιÏέστε ένα Ï€Ïότυπο αναζήτησης κειμένου"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "αφαιÏέστε μία μετατÏοπή"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "αφαιÏέστε μία ενεÏγοποίηση"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "αφαιÏέστε έναν Ï„Ïπο δεδομένων"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "αφαιÏέστε μία αντιστοίχιση χÏήστη για ξένο διακομιστή"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "αφαιÏέστε μία όψη"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "εκτελέστε μία Ï€Ïοεπιλεγμένη δήλωση"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "εμφανίστε το πλάνο εκτέλεσης μίας δήλωσης"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "ανακτήστε σειÏές από εÏώτημα μέσω δÏομέα"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "οÏίσθε δικαιώματα Ï€Ïόσβασης"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "εισαγωγή οÏισμών πίνακα από ξένο διακομιστή"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "δημιουÏγήστε καινοÏÏγιες σειÏές σε έναν πίνακα"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "ακοÏστε για μία κοινοποίηση"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "φοÏτώστε ένα αÏχείο κοινόχÏηστης βιβλιοθήκης"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "κλειδώστε έναν πίνακα"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "υπό ÏŒÏους εισαγωγή, ενημέÏωση, ή διαγÏαφή σειÏών ενός πίνακα"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "τοποθετήστε έναν δÏομέα"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "δημιουÏγήστε μία κοινοποίηση"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "Ï€Ïοετοιμάστε μία δήλωση για εκτέλεση"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "Ï€Ïοετοιμάστε την Ï„Ïέχουσας συναλλαγής για ολοκλήÏωση σε δÏο φάσεις"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "αλλάξτε την κυÏιότητα αντικειμένων βάσης δεδομένων που ανήκουν σε Ïόλο βάσης δεδομένων"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "αντικαθαστήστε τα πεÏιεχόμενα μίας υλοποιημένης όψης"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "επανακατασκευάστε ευÏετήÏια"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "απελευθέÏωσε ένα Ï€ÏοηγοÏμενα οÏισμένο σημείο αποθήκευσης"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "επαναφοÏά της τιμής μιας παÏαμέτÏου χÏόνου εκτέλεσης στην Ï€Ïοεπιλεγμένη τιμή"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "αφαιÏέστε δικαιώματα Ï€Ïόσβασης"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "ακÏÏωση συναλλαγής που είχε Ï€Ïοετοιμαστεί Ï€Ïοηγουμένως για ολοκλήÏωση σε δÏο φάσεις"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "επαναφοÏά σε σημείο αποθήκευσης"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "οÏίστε ένα νέο σημείο αποθήκευσης (savepoint) μέσα στην Ï„Ïέχουσα συναλλαγή"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "οÏίστε ή αλλάξτε μία ετικέτα ασφαλείας που εφαÏμόζεται σε ένα αντικείμενο"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "ανακτήστε σειÏές από πίνακα ή όψη"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "αλλάξτε μία παÏάμετÏο χÏόνου εκτέλεσης"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "οÏίστε τον χÏονισμό ελέγχου πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¹Î± την Ï„Ïέχουσα συναλλαγή"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "οÏίστε το αναγνωÏιστικό Ï„Ïέχοντος χÏήστη της Ï„Ïέχουσας συνεδÏίας"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "οÏίστε το αναγνωÏιστικό χÏήστη συνεδÏίας και το αναγνωÏιστικό Ï„Ïέχοντος χÏήστη της Ï„Ïέχουσας συνεδÏίας"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "οÏίστε τα χαÏακτηÏιστικά της Ï„Ïέχουσας συναλλαγής"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "εμφάνιση της τιμής μιας παÏαμέτÏου χÏόνου εκτέλεσης"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "αδειάστε έναν πίνακα ή ένα σÏνολο πινάκων"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "σταματήστε να ακοÏτε μια κοινοποίηση"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "ενημέÏωση σειÏών πίνακα"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "συλλογή αποÏÏιμμάτων και Ï€ÏοαιÏετική ανάλυση βάσης δεδομένων"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "υπολογίστε ένα σÏνολο σειÏών"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 μποÏεί να χÏησιμοποιηθεί μόνο σε μη διαδÏαστική λειτουÏγία"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου καταγÏαφής «%s»: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"ΓÏάψτε «help» για βοήθεια.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "δεν ήταν δυνατός ο οÏισμός παÏαμέτÏου εκτÏπωσης «%s»"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "παÏαβλέπεται η Ï€Ïόσθετη παÏάμετÏος γÏαμμής εντολών «%s»"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "δεν ήταν δυνατή η εÏÏεση του ιδίου εκτελέσιμου Ï€ÏογÏάμματος"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"ολοκλήÏωσης καÏτέλας εÏωτήματος απέτυχε: %s\n"
+"Το εÏώτημα ήταν:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "μη αναγνωÏίσιμη τιμή «%s» για «%s»: αναμένεται Boolean"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "άκυÏη τιμή «%s» για «%s»: αναμένεται ακέÏαιος"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "άκυÏη ονομασία παÏαμέτÏου «%s»"
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"μη αναγνωÏίσιμη τιμή \"%s\" για \"%s\"\n"
+"Οι διαθέσιμες τιμές είναι: %s."
+
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID λειτουÏγίες μεγάλου αντικειμένου\n"
+
+#~ msgid "All connection parameters must be supplied because no database connection exists"
+#~ msgstr "ΠÏέπει να δωθοÏν όλες οι παÏέμετÏοι γιατί δεν υπάÏχει σÏνδεση με τη βάση δεδομένων"
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "ΑπενεÏγοποιημένες triggers:"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Εισάγετε νέο κωδικό Ï€Ïόσβασης: "
+
+#~ msgid "Source code"
+#~ msgstr "Πηγαίος κώδικας"
+
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "Ειδική σχέση «%s.%s»"
+
+#~ msgid "The server (version %s) does not support altering default privileges."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την Ï„Ïοποποίηση Ï€Ïοεπιλεγμένων δικαιωμάτων."
+
+#~ msgid "The server (version %s) does not support collations."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει συÏÏαφές."
+
+#~ msgid "The server (version %s) does not support editing function source."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την επεξεÏγασία πηγών συναÏτήσεων."
+
+#~ msgid "The server (version %s) does not support editing view definitions."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την επεξεÏγασία οÏισμών Ï€Ïοβολής."
+
+#~ msgid "The server (version %s) does not support foreign servers."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικοÏÏ‚ διακομιστές."
+
+#~ msgid "The server (version %s) does not support foreign tables."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν ξενικοÏÏ‚ πίνακες."
+
+#~ msgid "The server (version %s) does not support foreign-data wrappers."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει πεÏιτÏλιξη ξένων δεδομένων."
+
+#~ msgid "The server (version %s) does not support full text search."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει αναζήτηση πλήÏους κειμένου."
+
+#~ msgid "The server (version %s) does not support per-database role settings."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει Ïυθμίσεις Ïόλων ανά βάση δεδομένων."
+
+#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει savepoints για ON_ERROR_ROLLBACK."
+
+#~ msgid "The server (version %s) does not support showing function source."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την εμφάνιση του κώδικα της συνάÏτησης."
+
+#~ msgid "The server (version %s) does not support showing view definitions."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την επεξεÏγασία οÏισμών Ï€Ïοβολής."
+
+#~ msgid "The server (version %s) does not support tablespaces."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει tablespaces."
+
+#~ msgid "The server (version %s) does not support user mappings."
+#~ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει αντιστοιχίσεις χÏηστών."
+
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch δεν μποÏεί να χÏησιμοποιηθεί μαζί με COPY"
+
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m"
+
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m"
+
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»"
+
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "απέτυχε η εντολή pclose: %m"
+
+#~ msgid "special"
+#~ msgstr "ειδικό"
+
+#~ msgid "timezone"
+#~ msgstr "timezone"
+
+#~ msgid "unexpected result status for \\watch"
+#~ msgstr "μη αναμενόμενη κατάσταση αποτελέσματος για \\watch"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "όπου direction μποÏεί να είναι άδειο ή ένα από:"
diff --git a/src/bin/psql/po/es.po b/src/bin/psql/po/es.po
new file mode 100644
index 0000000..8abea99
--- /dev/null
+++ b/src/bin/psql/po/es.po
@@ -0,0 +1,6500 @@
+# spanish translation of psql.
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera, <alvherre@alvh.no-ip.org>, 2003-2015
+# Diego A. Gil <diego@adminsa.com>, 2005
+# Martín Marqués <martin@2ndquadrant.com>, 2013
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:17+0000\n"
+"PO-Revision-Date: 2023-10-04 11:48+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binario «%s» no válido: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "no se pudo leer el binario «%s»: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "no se pudo encontrar un «%s» para ejecutar"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falló: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "el usuario no existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "la orden no es ejecutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "orden no encontrada"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "el proceso hijo terminó con código de salida %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "el proceso hijo fue terminado por una excepción 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "el proceso hijo fue terminado por una señal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "el proceso hijo terminó con código no reconocido %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Petición de cancelación enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "No se pudo enviar la petición de cancelación: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu fila)"
+msgstr[1] "(%lu filas)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrumpido\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de salida no válido (error interno): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "saltando expansión recursiva de la variable «%s»"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "no se pudo buscar el usuario local de ID %d: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "no existe un usuario local con ID %d"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "orden \\%s no válida"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Digite \\? para obtener ayuda."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: argumento extra «%s» ignorado"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "orden \\%s ignorada: use \\endif o Ctrl-C para salir del bloque \\if actual"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "no se pudo obtener directorio home para el usuario de ID %ld: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: no se pudo cambiar directorio a «%s»: %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "No está conectado a una base de datos.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "no hay búfer de consulta"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "número de línea no válido: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Sin cambios"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: nombre de codificación no válido o procedimiento de conversión no encontrado"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "No hay error anterior."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: falta el paréntesis derecho"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: falta argumento requerido"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: no puede ocurrir después de \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: no hay un \\if coincidente"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: no puede ocurrir después de \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: no hay un \\if coincidente"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: no hay un \\if coincidente"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "El búfer de consulta está vacío."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Ingrese nueva contraseña para usuario «%s»: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Ingrésela nuevamente: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Las contraseñas no coinciden."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "%s: no se pudo leer el valor para la variable"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "El búfer de consulta ha sido reiniciado (limpiado)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Se escribió la historia en el archivo «%s».\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: el nombre de variable de ambiente no debe contener «=»"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "el nombre de la función es requerido"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "el nombre de la vista es requerido"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "El despliegue de duración está activado."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "El despliegue de duración está desactivado."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: valor de intervalo ese especifica más de una vez"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: valor de intervalo incorrecto «%s»"
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: cantidad de iteraciones se especifica más de una vez"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: cantidad de iteraciones incorrecta «%s»"
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: parámetro «%s» no reconocido"
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Contraseña para usuario %s: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "No proporcione usuario, host o puerto de forma separada al usar una cadena de conexión"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "No existe una conexión de base de datos para poder reusar sus parámetros"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Se ha mantenido la conexión anterior"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Ahora está conectado a la base de datos «%s» con el usuario «%s».\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, servidor %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ADVERTENCIA: %s versión mayor %s, servidor versión mayor %s.\n"
+" Algunas características de psql podrían no funcionar.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "Conexión SSL (protocolo: %s, cifrado: %s, compresión: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "desconocido"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "desactivado"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "activado"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Conexión Cifrada GSSAPI\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ADVERTENCIA: El código de página de la consola (%u) difiere del código\n"
+" de página de Windows (%u).\n"
+" Los caracteres de 8 bits pueden funcionar incorrectamente.\n"
+" Vea la página de referencia de psql «Notes for Windows users»\n"
+" para obtener más detalles.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "la variable de ambiente PSQL_EDITOR_LINENUMBER_SWITCH debe estar definida para poder especificar un número de línea"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "no se pudo iniciar el editor «%s»"
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "no se pudo iniciar /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "no se pudo ubicar el directorio temporal: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "no se pudo abrir archivo temporal «%s»: %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: abreviación ambigua «%s» coincide tanto con «%s» como con «%s»"
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: formatos permitidos son aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: estilos de línea permitidos son ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: estilos de línea Unicode de borde permitidos son single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: estilos de línea Unicode de columna permitidos son single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: estilos de línea Unicode de encabezado permitidos son single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: los valores permitidos de xheader_width son «%s» (por omisión), «%s», «%s», o un número que indica el ancho exacto"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep debe ser un carácter de un solo byte"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldset ni puede ser una comilla doble, un salto de línea, o un retorno de carro"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: opción desconocida: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "El estilo de borde es %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "El ancho no está definido.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "El ancho es %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Se ha activado el despliegue expandido.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "El despliegue expandido se usa automáticamente.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Se ha desactivado el despliegue expandido.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "El ancho del encabezado expandido es '%s'.\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "El ancho de encabezado expandido es %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "El separador de campos para CSV es «%s».\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "El separador de campos es el byte cero.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "El separador de campos es «%s».\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "El pie por omisión está activo.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "El pie de página por omisión está desactivado.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "El formato de salida es %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "El estilo de línea es %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Despliegue de nulos es «%s».\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "La salida numérica ajustada localmente está habilitada.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "La salida numérica ajustada localmente está deshabilitada.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "El paginador se usará para salida larga.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "El paginador se usará siempre.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "El paginador no se usará.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "El paginador no se usará para menos de %d línea.\n"
+msgstr[1] "El paginador no se usará para menos de %d líneas.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "El separador de filas es el byte cero.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "El separador de filas es <salto de línea>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "El separador de filas es «%s».\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Los atributos de tabla son «%s».\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Los atributos de tabla han sido indefinidos.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "El título es «%s».\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "El título ha sido indefinido.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Mostrar sólo filas está activado.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Mostrar sólo filas está desactivado.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "El estilo Unicode de borde es «%s».\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "El estilo de línea Unicode de columna es «%s».\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "El estilo de línea Unicode de encabezado es «%s».\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: falló"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch no puede ser usado con una consulta vacía"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "no se pudo establecer un temporizador: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (cada %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (cada %gs)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "no se pudo esperar señales: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "«%s.%s» no es una vista"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "no se pudo interpretar el array reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "no se puede escapar sin una conexión activa"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»"
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "se ha perdido la conexión al servidor"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "La conexión al servidor se ha perdido. Intentando reiniciar: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Falló.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Con éxito.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "PQresultStatus no esperado: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Duración: %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Duración: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Duración: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Duración: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "No está conectado a una base de datos."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Notificación asíncrona «%s» con carga «%s» recibida del proceso de servidor con PID %d.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Notificación asíncrona «%s» recibida del proceso de servidor con PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "no se pudo mostrar la tabla de resultados: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset no retornó renglón alguno"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset retornó más de un renglón"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "se ignoró intentó de hacer \\gset a variable con tratamiento especial «%s»"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Modo paso a paso: verifique la orden)****************************************\n"
+"%s\n"
+"***(presione enter para continuar, o x y enter para cancelar)*******************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "SENTENCIA: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "estado de transacción inesperado (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Columna"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Tipo"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "La orden no tiene resultado, o el resultado no tiene columnas.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: argumentos requeridos"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: error de procesamiento en «%s»"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: error de procesamiento al final de la línea"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "no se pudo ejecutar la orden «%s»: %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: no se puede copiar desde/hacia un directorio"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "no se pudo cerrar la tubería a la orden externa: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "no se pudo escribir datos COPY: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "falló la transferencia de datos COPY: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "cancelada por el usuario"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Ingrese los datos a ser copiados seguidos de un fin de línea.\n"
+"Termine con un backslash y un punto, o una señal EOF."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "se abortó por un error de lectura"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "tratando de salir del modo copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: la sentencia no produjo un conjunto de resultados"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: la consulta debe retornar al menos tres columnas"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: los encabezados verticales y horizontales deben ser columnas distintas"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: la columna de datos debe ser especificada cuando la consulta retorna más de tres columnas"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: se superó el número máximo de columnas (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: el resultado de la consulta contiene múltiples valores para la fila «%s», columna «%s»"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: el número de columna %d está fuera del rango 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nombre de columna «%s» ambiguo"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: nombre de columna «%s» no encontrado"
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Esquema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Nombre"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Tipo de dato de salida"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Tipos de datos de argumentos"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "Descripción"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Listado de funciones de agregación"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "El servidor (versión %s) no soporta métodos de acceso."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Indice"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Tabla"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Manejador"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista de métodos de acceso"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Dueño"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Ubicación"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Opciones"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Tamaño"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Listado de tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df sólo acepta las opciones [antpwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df no acepta la opción «%c» en un servidor versión %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ventana"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "disparador"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "inmutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "estable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volátil"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilidad"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "restringida"
+
+#: describe.c:398
+msgid "safe"
+msgstr "segura"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "insegura"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Paralelismo"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definidor"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invocador"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Seguridad"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Lenguaje"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Nombre interno"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "Listado de funciones"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Elementos"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "Listado de tipos de dato"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Tipo arg izq"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Tipo arg der"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Tipo resultado"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "Función"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "Listado de operadores"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Codificación"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "Proveedor de locale"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Collate"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "configuración ICU"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "Reglas ICU:"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "Listado de base de datos"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "tabla"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "vista"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "vistas materializadas"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "secuencia"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "tabla foránea"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "tabla particionada"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Privilegios de acceso a columnas"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Políticas"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Privilegios"
+
+#: describe.c:1195
+msgid "function"
+msgstr "función"
+
+#: describe.c:1197
+msgid "type"
+msgstr "tipo"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "esquema"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Privilegios de acceso por omisión"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Objeto"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "restricción de tabla"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "restricción de dominio"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "clase de operadores"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "familia de operadores"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "regla"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "Descripciones de objetos"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "No se encontró relación llamada «%s»."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "No se encontró ninguna relación."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "No se encontró relación con OID %s."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Inicio"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "Máximo"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "Incremento"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "sí"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "no"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "¿Cicla?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Asociada a: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Secuencia para columna identidad: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Secuencia unlogged «%s.%s»"
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Secuencia «%s.%s»"
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Tabla unlogged «%s.%s»"
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabla «%s.%s»"
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vista «%s.%s»"
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Vista materializada unlogged «%s.%s»"
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Vista materializada \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ãndice unlogged «%s.%s»"
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Ãndice «%s.%s»"
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ãndice particionado unlogged «%s.%s»"
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Ãndice particionado «%s.%s»"
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Tabla TOAST «%s.%s»"
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Tipo compuesto «%s.%s»"
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Tabla foránea «%s.%s»"
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Tabla unlogged particionada «%s.%s»"
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Tabla particionada «%s.%s»"
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "Ordenamiento"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "Nulable"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "Por omisión"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "¿Llave?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "Definición"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "Opciones de FDW"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Almacenamiento"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Compresión"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Estadísticas"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partición de: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Sin restricción de partición"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Restricción de partición: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Llave de partición: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Tabla dueña: «%s.%s»"
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "llave primaria, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "único"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls no distintos"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "de tabla «%s.%s»"
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicado (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", clustered"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", no válido"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", postergable"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", inicialmente postergada"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", identidad de replicación"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "Ãndices:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "Restricciones CHECK:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "Restricciones de llave foránea:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "Referenciada por:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Políticas:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Políticas (seguridad de registros forzada):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Políticas (seguridad de filas activa): (ninguna)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Políticas (seguridad de filas forzada): (ninguna)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Políticas (seguridad de filas inactiva):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Objetos de estadísticas:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Reglas:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Reglas deshabilitadas:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Reglas que se activan siempre:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Reglas que se activan sólo en las réplicas:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Publicaciones:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Definición de vista:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Triggers:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Disparadores de usuario deshabilitados:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Disparadores internos deshabilitados:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Disparadores que siempre se ejecutan:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Disparadores que se ejecutan sólo en las réplicas:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Servidor: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Opciones de FDW: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "Hereda"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Número de particiones: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Número de particiones: %d (Use \\d+ para listarlas.)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Número de tablas hijas: %d (Use \\d+ para listarlas.)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Tablas hijas"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Particiones"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Tabla tipada de tipo: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Identidad de replicación"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Tiene OIDs: sí"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Método de acceso: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace «%s»"
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "Lista de roles"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Nombre de rol"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Atributos"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superusuario"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Sin herencia"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Crear rol"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Crear BD"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "No puede conectarse"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replicación"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Ignora RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Ninguna conexión"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d conexión"
+msgstr[1] "%d conexiones"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Constraseña válida hasta "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Nombre de rol"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "Base de Datos"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Parámetros"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "No se encontró ningún parámetro para el rol «%s» y la base de datos «%s»."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "No se encontró ningún parámetro para el rol «%s»."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "No se encontró ningún parámetro."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "Listado de parámetros"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Miembro de"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Otorgador"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Lista de roles otorgados"
+
+#: describe.c:3952
+msgid "index"
+msgstr "índice"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "Tabla TOAST"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "índice particionado"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "permanente"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "temporal"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "unlogged"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "Persistencia"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Método de acceso"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "Listado de relaciones"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "El servidor (versión %s) no soporta particionamiento declarativo de tablas."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "Listado de índices particionados"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "Listado de tablas particionadas"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "Listado de relaciones particionadas"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Nombre del padre"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Tamaño de particiones hoja"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Tamaño total"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Confiable"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Lenguaje interno"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Manejador de llamada"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Validador"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Manejador en línea"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "Lista de lenguajes"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Listado de dominios"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Fuente"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "Destino"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "Por omisión?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "Listado de conversiones"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Parámetro"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Valor"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "Contexto"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "Listado de parámetro de configuración"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "Listado de parámetros de configuración no-default"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "El servidor (versión %s) no soporta triggers por eventos."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Evento"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "activo"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "réplica"
+
+#: describe.c:4658
+msgid "always"
+msgstr "siempre"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "inactivo"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "Activo"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "Listado de disparadores por eventos"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "El servidor (versión %s) no soporta estadísticas extendidas."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Dependencias"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "Lista de estadísticas extendidas"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Tipo fuente"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Tipo destino"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "en asignación"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Implícito?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "Listado de conversiones de tipo (casts)"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "Proveedor"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "¿Determinístico?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "Listado de ordenamientos"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Listado de esquemas"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "Listado de analizadores de búsqueda en texto"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "No se encontró ningún analizador de búsqueda en texto llamado «%s»."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "No se encontró ningún analizador de búsqueda en texto."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Inicio de parse"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Método"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Obtener siguiente elemento"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Fin de parse"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Obtener encabezado"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Obtener tipos de elemento"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analizador de búsqueda en texto «%s.%s»"
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analizador de búsqueda en texto «%s»"
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Nombre de elemento"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tipos de elemento para el analizador «%s.%s»"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tipos de elemento para el analizador «%s»"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Plantilla"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Opciones de inicialización"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "Listado de diccionarios de búsqueda en texto"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "Inicializador"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Fn. análisis léx."
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "Listado de plantillas de búsqueda en texto"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "Listado de configuraciones de búsqueda en texto"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "No se encontró una configuración de búsqueda en texto llamada «%s»."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "No se encontró una configuración de búsqueda en texto."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Elemento"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Diccionarios"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configuración de búsqueda en texto «%s.%s»"
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configuración de búsqueda en texto «%s»"
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analizador: «%s.%s»"
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analizador: «%s»"
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "Listado de conectores de datos externos"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Conectores de datos externos"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "Versión"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "Listado de servidores foráneos"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Servidor"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Nombre de usuario"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "Listado de mapeos de usuario"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "Listado de tablas foráneas"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "Listado de extensiones instaladas"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "No se encontró extensión llamada «%s»."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "No se encontró ninguna extensión."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "Descripción de objeto"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objetos en extensión «%s»"
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "el nombre no es válido (demasiados puntos): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "no están implementadas las referencias entre bases de datos: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "El servidor (versión %s) no soporta publicaciones."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Todas las tablas"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Inserts"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Updates"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Deletes"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "Listado de publicaciones"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "No se encontró publicación llamada «%s»."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "No se encontró ninguna publicación."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "Publicación %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Tablas:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Tablas de esquemas:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "El servidor (versión %s) no soporta suscripciones."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "Publicación"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Binario"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "De flujo"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Commit 2-fases"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "Desactivar en error"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Origen"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Contraseña requerida"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "¿Ejec. como dueño?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Commit síncrono"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "Saltar LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "Listado de suscripciones"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Tipo de entrada"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Tipo de almacenamiento"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "Clase de operador"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "Familia de operadores"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "Listado de clases de operador"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Tipos aplicables"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "Listado de familias de operadores"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Operador"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "Estrategia"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "ordenamiento"
+
+#: describe.c:6911
+msgid "search"
+msgstr "búsqueda"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Propósito"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "familia de ops de ordenamiento"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "Lista de operadores de familias de operadores"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "Tipo de dato izquierdo registrado"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "Tipo de dato derecho registrado"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "Número"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "Listado de funciones de la familia de operadores %s"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Objetos grandes"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql es el terminal interactivo de PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPCIONES]... [BASE-DE-DATOS [USUARIO]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Opciones generales:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=ORDEN ejecutar sólo una orden (SQL o interna) y salir\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=NOMBRE nombre de base de datos a conectarse\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ARCHIVO ejecutar órdenes desde archivo, luego salir\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list listar bases de datos, luego salir\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOMBRE=VALOR\n"
+" definir variable de psql NOMBRE a VALOR\n"
+" (p.ej. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión, luego salir\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc no leer archivo de configuración (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 («uno»), --single-transaction\n"
+" ejecuta órdenes en una única transacción\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=opcs] mostrar esta ayuda, luego salir\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands listar órdenes backslash, luego salir\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables listar variables especiales, luego salir\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Opciones de entrada y salida:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all mostrar las órdenes del script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors mostrar órdenes fallidas\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries mostrar órdenes enviadas al servidor\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden mostrar consultas generadas por órdenes internas\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=ARCH envía el registro de la sesión a un archivo\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline deshabilitar edición de línea de órdenes (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=ARCHIVO enviar resultados de consultas a archivo (u |orden)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet modo silencioso (sin mensajes, sólo resultados)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step modo paso a paso (confirmar cada consulta)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line modo de líneas (fin de línea termina la orden SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Opciones de formato de salida:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align modo de salida desalineado\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv modo de salida de tabla CSV (valores separados por comas)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=CADENA separador de campos para salida desalineada\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html modo de salida en tablas HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] definir opción de impresión VAR en ARG (ver orden \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=CADENA separador de registros para salida desalineada\n"
+" (por omisión: salto de línea)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only sólo muestra registros\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr ""
+" -T, --table-attr=TEXTO\n"
+" definir atributos de marcas de tabla HTML (ancho, borde)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded activar modo expandido de salida de tablas\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" definir separador de campos para salida desalineada al byte cero\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" definir separador de filas para salida desalineada al byte cero\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=NOMBRE nombre del anfitrión o directorio de socket\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "socket local"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PUERTO puerto del servidor (por omisión: «%s»)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr ""
+" -U, --username=NOMBRE\n"
+" nombre de usuario (por omisión: «%s»)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forzar petición de contraseña\n"
+" (debería ser automático)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Para obtener más ayuda, digite «\\?» (para órdenes internas) o «\\help»\n"
+"(para órdenes SQL) dentro de psql, o consulte la sección de psql\n"
+"en la documentación de PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reporte de errores a <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "General\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr ""
+" \\bind [PARAM]...\n"
+" definir parámetros de consulta\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright mostrar términos de uso y distribución de PostgreSQL\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [COLUMNAS]\n"
+" ejecutar la consulta y desplegar en «crosstab»\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose mostrar error más reciente en máxima verbosidad\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE]\n"
+" ejecuta la consulta (y envía el resultado a un fichero o |pipe);\n"
+" \\g sin argumentos es equivalente a un punto y coma\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc describir resultado de la consulta, sin ejecutarla\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec ejecutar la consulta, luego ejecuta cada valor del resultado\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr ""
+" \\gset [PREFIJO] ejecutar la consulta y almacenar el resultado en variables\n"
+" de psql\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(OPTIONS)] [FILE]\n"
+" como \\g, pero fuerza el modo de salida expandido\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q salir de psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEG] [c=N] ejecute consulta cada SEG segundos, hasta N veces\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Ayuda\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] desplegar ayuda sobre las órdenes backslash\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options desplegar ayuda sobre opciones de línea de órdenes\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables desplegar ayuda sobre variables especiales\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr ""
+" \\h [NOMBRE] mostrar ayuda de sintaxis de órdenes SQL;\n"
+" use «*» para todas las órdenes\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Búfer de consulta\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [ARCHIVO] [LÃNEA]\n"
+" editar el búfer de consulta (o archivo) con editor externo\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [NOMBRE-FUNCIÓN [LÃNEA]]\n"
+" editar una función con editor externo\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [NOMBRE-VISTA [LÃNEA]]\n"
+" editar definición de una vista con editor externo\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p mostrar el contenido del búfer de consulta\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r reiniciar (limpiar) el búfer de consulta\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ARCHIVO] mostrar historial de órdenes o guardarlo en archivo\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w ARCHIVO escribir búfer de consulta a archivo\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr ""
+"Entrada/Salida\n"
+" (con -n, donde existe, se omite el salto de línea final)\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... ejecutar orden SQL COPY con flujo de datos al cliente\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] escribe la cadena en la salida estándar\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ARCHIVO ejecutar órdenes desde archivo\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ARCHIVO como \\i, pero relativo a la ubicación del script actual\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ARCHIVO] enviar resultados de consultas a archivo u |orden\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] escribe la cadena hacia flujo de salida \\o\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] escribe la cadena a la salida de error estándar\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Condicional\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPRESIÓN inicia bloque condicional\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativa dentro del bloque condicional actual\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternativa final dentro del bloque condicional actual\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif termina el bloque condicional\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Informativo\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (opciones: S = desplegar objetos de sistema, + = agregar más detalle)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] listar tablas, vistas y secuencias\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NOMBRE describir tabla, índice, secuencia o vista\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATRÓN] listar funciones de agregación\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATRÓN] listar métodos de acceso\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] listar las clases de operadores\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] listar las familias de operadores\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] listar los operadores de la familia de operadores\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] enumera las funciones de la familia de operadores\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATRÓN] listar tablespaces\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATRÓN] listar conversiones\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATRÓN] listar parámetros de configuración\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATRÓN] listar conversiones de tipo (casts)\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATRÓN] listar comentarios de objetos que no aparecen en otra parte\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATRÓN] listar dominios\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATRÓN] listar privilegios por omisión\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATRÓN] listar tablas foráneas\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATRÓN] listar servidores foráneos\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATRÓN] listar tablas foráneas\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATRÓN] listar mapeos de usuario\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATRÓN] listar conectores de datos externos\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" listar funciones [sólo ag./normal/proc./trigger/ventana]\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATRÓN] listar configuraciones de búsqueda en texto\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATRÓN] listar diccionarios de búsqueda en texto\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATRÓN] listar analizadores (parsers) de búsq. en texto\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATRÓN] listar plantillas de búsqueda en texto\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATRÓN] listar roles\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATRÓN] listar índices\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] listar objetos grandes, lo mismo que \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATRÓN] listar lenguajes procedurales\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATRÓN] listar vistas materializadas\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATRÓN] listar esquemas\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" listar operadores\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S] [PATRÓN] listar ordenamientos (collations)\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [PATRÓN] listar privilegios de acceso a tablas, vistas y secuencias\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[tin+] [PATRÓN] listar relaciones particionadas (sólo tablas/índices) [n=anidadas]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [PATRÓN_ROL [PATRÓN_BASE]]\n"
+" listar parámetros de rol por base de datos\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [PATRÓN] listar roles\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATRÓN] listar publicaciones de replicación\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATRÓN] listar suscripciones de replicación\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATRÓN] listar secuencias\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATRÓN] listar tablas\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATRÓN] listar tipos de dato\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATRÓN] listar roles\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATRÓN] listar vistas\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATRÓN] listar extensiones\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATRÓN] listar estadísticas extendidas\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATRÓN] listar disparadores por eventos\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATRÓN] listar bases de datos\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCIÓN mostrar la definición de una función\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VISTA mostrar la definición de una vista\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [PATRÓN] lo mismo que \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Objetos Grandes\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID ARCHIVO escribir objeto grande a archivo\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ARCHIVO [COMENTARIO]\n"
+" leer objeto grande desde archivo\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] listar objetos grandes\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID borrar un objeto grande\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "Formato\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a cambiar entre modo de salida alineado y sin alinear\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [CADENA] definir título de tabla, o indefinir si es vacío\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [CADENA] mostrar o definir separador de campos para\n"
+" modo de salida sin alinear\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H cambiar modo de salida HTML (actualmente %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOMBRE [VALOR]] define opción de tabla de salida\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|fieldsep_zero|\n"
+" footer|format|linestyle|null|numericlocale|pager|\n"
+" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
+" tuples_only|unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] mostrar sólo filas (actualmente %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [CADENA] definir atributos HTML de <table>, o indefinir si es vacío\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] cambiar modo expandido (actualmente %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "Conexiones\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n"
+" conectar a una nueva base de datos (actual: «%s»)\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n"
+" conectar a una nueva base de datos (no hay conexión actual)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo despliega la información sobre la conexión actual\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr ""
+" \\encoding [CODIFICACIÓN]\n"
+" mostrar o definir codificación del cliente\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr ""
+" \\password [USUARIO]\n"
+" cambiar la contraseña para un usuario en forma segura\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "Sistema Operativo\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] cambiar el directorio de trabajo actual\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR obtener variable de ambiente\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr ""
+" \\setenv NOMBRE [VALOR]\n"
+" definir o indefinir variable de ambiente\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr ""
+" \\timing [on|off] mostrar tiempo de ejecución de órdenes\n"
+" (actualmente %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [ORDEN] ejecutar orden en intérprete de órdenes (shell),\n"
+" o iniciar intérprete interactivo\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Variables\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXTO] NOMBRE preguntar al usuario el valor de la variable\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NOMBRE [VALOR]] definir variables internas,\n"
+" listar todas si no se dan parámetros\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOMBRE indefinir (eliminar) variable interna\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Lista de variables con tratamiento especial\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "variables psql:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOMBRE=VALOR\n"
+" o \\set NOMBRE VALOR dentro de psql\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT si está definida, órdenes SQL exitosas se comprometen\n"
+" automáticamente\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE determina si usar mayúsculas al completar palabras SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr " DBNAME la base de datos actualmente conectada\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO controla qué entrada se escribe a la salida estándar\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN muestra consultas internas usadas por órdenes backslash\n"
+" con «noexec» sólo las muestra sin ejecutarlas\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr " ENCODING codificación actual del cliente\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" «true» si la última consulta falló; si no, «false»\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT número de filas del resultado que extraer y mostrar cada vez\n"
+" (por omisión: 0=sin límite)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" ocultar métodos de acceso de tabla\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" ocultar métodos de compresión\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL controla la lista de historia de órdenes\n"
+" [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr " HISTFILE nombre de archivo para almacenar historia de órdenes\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr " HISTSIZE número de órdenes a guardar en la historia de órdenes\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr " HOST el servidor actualmente conectado\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF si no está definida, enviar un EOF a sesión interactiva\n"
+" termina la aplicación\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr " LASTOID el valor del último OID afectado\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" mensaje y SQLSTATE del último error, o cadena vacía y\n"
+" «00000» si no hubo\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK si está definido, un error no aborta la transacción\n"
+" (usa «savepoints» implícitos)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr " ON_ERROR_STOP detiene ejecución por lotes al ocurrir un error\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr " PORT puerto del servidor de la conexión actual\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr " PROMPT1 especifica el prompt estándar de psql\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2 especifica el prompt usado cuando una sentencia continúa\n"
+" de una línea anterior\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr " PROMPT3 especifica el prompt usado durante COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr " QUIET ejecuta silenciosamente (igual que -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT número de tuplas retornadas o afectadas por última\n"
+" consulta, o 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" versión del servidor (cadena corta o numérica)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" «true» si la última orden de shell falló, «false» si tuvo éxito\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" estado de salida de la última orden de shell\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" mostrar todos los resultados de una consulta combinada (\\;) en lugar\n"
+" de sólo mostrar el último\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT controla el despliegue de campos de contexto de mensaje\n"
+" [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr " SINGLELINE fin de línea termina modo de órdenes SQL (igual que -S)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr " SINGLESTEP modo paso a paso (igual que -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr " SQLSTATE SQLSTATE de la última consulta, o «00000» si no hubo error\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr " USER el usuario actualmente conectado\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY controla la verbosidad de errores [default, verbose,\n"
+" terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" versión de psql (cadena verbosa, corta o numérica)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Parámetros de despliegue:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOMBRE[=VALOR]\n"
+" o \\pset NOMBRE [VALOR] dentro de psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr " border estilo de borde (número)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr " columns define el ancho para formato «wrapped»\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr " expanded (o x) salida expandida [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep separador de campos para formato «unaligned»\n"
+" (por omisión: «%s»)\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr " fieldsep_zero separador de campos en «unaligned» es byte cero\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr " footer activa o desactiva el pie de tabla [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr " format define el formato de salida [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr " linestyle define el estilo de dibujo de líneas [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr " null define la cadena a imprimirse para valores null\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale activa despliegue de carácter específico del lenguaje para\n"
+" separar grupos de dígitos\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr " pager controla cuándo se usará un paginador externo [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr " recordsep separador de registros (líneas) para formato «unaligned»\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr " recordsep_zero separador de registros en «unaligned» es byte cero\n"
+
+# XXX WTF does this mean?
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (o T) especifica atributos para el tag «table» en formato «html»,\n"
+" o ancho proporcional de columnas alineadas a la izquierda\n"
+" en formato «latex-longtable»\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr " title define el título de tablas\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr " tuples_only si está definido, sólo los datos de la tabla se muestran\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" define el estilo de líneas Unicode [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variables de ambiente:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOMBRE=VALOR [NOMBRE=VALOR] psql ...\n"
+" o \\setenv NOMBRE [VALOR] dentro de psql\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NOMBRE=VALOR\n"
+" psql ...\n"
+" o \\setenv NOMBRE [VALOR] dentro de psql\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr " COLUMNS número de columnas para formato «wrapped»\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr " PGAPPNAME igual que el parámetro de conexión application_name\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr " PGDATABASE igual que el parámetro de conexión dbname\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr " PGHOST igual que el parámetro de conexión host\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr " PGPASSFILE nombre de archivo de contraseñas\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr " PGPASSWORD contraseña de la conexión (no recomendado)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr " PGPORT igual que el parámetro de conexión port\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr " PGUSER igual que el parámetro de conexión user\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor usado por órdenes \\e, \\ef, y \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARGS\n"
+" cómo especificar número de línea al invocar al editor\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr " PSQL_HISTORY ubicación alternativa del archivo de historia de órdenes\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr " PSQL_PAGER, PAGER nombre de programa paginador externo\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr " PSQL_WATCH_PAGER paginador externo para usar con \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr " PSQLRC ubicación alternativa para el archivo .psqlrc del usuario\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr " SHELL intérprete usado por la orden \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr " TMPDIR directorio para archivos temporales\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "Ayuda disponible:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Orden: %s\n"
+"Descripción: %s\n"
+"Sintaxis:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"No hay ayuda disponible para «%s».\n"
+"Pruebe \\h sin argumentos para mostrar los elementos de ayuda disponibles.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "no se pudo leer el archivo de entrada: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "no se pudo guardar historial a archivo «%s»: %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "el historial de órdenes no está soportado en esta instalación"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: no está conectado a una base de datos"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: transacción en curso está abortada"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: estado de transacción desconocido"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapado"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Use «\\q» para salir de %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"La entrada es un dump de PostgreSQL en formato custom.\n"
+"Use el programa pg_restore para restaurar este dump a una base de datos.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Use \\? para ayuda o presione control-C para limpiar el búfer de entrada."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Digite \\? para obtener ayuda."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Está usando psql, la interfaz de línea de órdenes de PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Digite: \\copyright para ver los términos de distribución\n"
+" \\h para ayuda de órdenes SQL\n"
+" \\? para ayuda de órdenes psql\n"
+" \\g o punto y coma («;») para ejecutar la consulta\n"
+" \\q para salir\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Use \\q para salir."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Use control-D para salir."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Use control-C para salir."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "consulta ignorada; use \\endif o Ctrl-C para salir del bloque \\if actual"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "se alcanzó EOF sin encontrar el/los \\endif de cierre"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "una cadena de caracteres entre comillas está inconclusa"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: memoria agotada"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "nombre"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "signatura_func_agregación"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nuevo_nombre"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "nuevo_dueño"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nuevo_esquema"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "donde signatura_func_agregación es:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "modo_arg"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "nombre_arg"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "tipo_arg"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "opción"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "donde opción puede ser:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "límite_conexiones"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "esplantilla"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "nuevo_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "parámetro_de_configuración"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "valor"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "rol_destino"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "nombre_de_esquema"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_o_revoke_abreviado"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "donde grant_o_revoke_abreviado es uno de:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "nombre_de_rol"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "expresión"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "restricción_de_dominio"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "nombre_restricción"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nuevo_nombre_restricción"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nueva_versión"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "objeto_miembro"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "dondo objeto_miembro es:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "nombre_de_objeto"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "nombre_función_agregación"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "tipo_fuente"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "tipo_destino"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "nombre_de_función"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "nombre_operador"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "tipo_izq"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "tipo_der"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "método_de_índice"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "nombre_de_procedimiento"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "nombre_de_rutina"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "nombre_de_tipo"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "nombre_lenguaje"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "y signatura_func_agregación es:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "función_manejadora"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "función_validadora"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "acción"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "nombre_de_columna"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nuevo_nombre_de_columna"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "donde acción es una de:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "tipo_de_dato"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "ordenamiento"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "restricción_de_columna"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "entero"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "opción_de_atributo"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "restricción_de_tabla"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "nombre_disparador"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "tabla_padre"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "nombre_de_extensión"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "costo_de_ejecución"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "núm_de_filas"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "función_de_soporte"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "especificación_de_rol"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "nombre_de_usuario"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "donde especificación_de_rol puede ser:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nombre_de_grupo"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "nombre_de_tablespace"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "nombre_índice"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "parámetro_de_almacenamiento"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "número_de_columna"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "oid_de_objeto_grande"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "método_de_compresión"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "nuevo_método_de_acceso"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "proc_res"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "proc_join"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "número_de_estrategia"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "tipo_op"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "nombre_familia_ordenamiento"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "número_de_soporte"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "tipo_argumento"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "nombre_de_tabla"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "expresión_using"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "expresión_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "objeto_de_publicación"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "parámetro_de_publicación"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "donde objeto_de_publicación es uno de:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "contraseña"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "fecha_hora"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "nombre_de_base_de_datos"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "incremento"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "valormin"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "valormax"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "inicio"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "reinicio"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "nuevo_valor"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "nombre_de_publicación"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "opción_de_publicación"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "opción_refresh"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "parámetro_de_suscripción"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "opción_skip"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "nombre_de_partición"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "borde_de_partición"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "opciones_de_secuencia"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "opción_de_secuencia"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "restricción_de_tabla_con_índice"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "nombre_regla_de_reescritura"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "y borde_de_partición es:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "expresión_de_borde_de_partición"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "literal_numérico"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "donde restricción_de_columna es:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "expr_por_omisión"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "expr_de_generación"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "parámetros_de_índice"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "tabla_ref"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "columna_ref"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "acción_referencial"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "y restricción_de_tabla es:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "elemento_de_exclusión"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "operador"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "predicado"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "y restricción_de_tabla_con_índice es:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parámetros_de_índice en UNIQUE, PRIMARY KEY y EXCLUDE son:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "elemento_de_exclusión en una restricción EXCLUDE es:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "clase_de_ops"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "acción_referencial en una restricción FOREIGN KEY/REFERENCES es:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "opción_de_tablespace"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "tipo_de_token"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "nombre_diccionario"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "diccionario_antiguo"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "diccionario_nuevo"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "nombre_atributo"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nuevo_nombre_atributo"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nuevo_valor_enum"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "valor_enum_vecino"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "valor_enum_existente"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "propiedad"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "nombre_de_servidor"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "nombre_opción_de_vista"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "valor_opción_de_vista"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "tabla_y_columnas"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "donde opción puede ser una de:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "booleano"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "tamaño"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "y tabla_y_columnas es:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "modo_de_transacción"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "donde modo_de_transacción es uno de:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "argumento"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "nombre_relación"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "nombre_de_dominio"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "nombre_de_política"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "nombre_regla"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "literal_de_cadena"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "id_de_transacción"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "nombre_de_archivo"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "orden"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "condición"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "consulta"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "nombre_de_formato"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "carácter_delimitador"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "cadena_null"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "cadena_por_omisión"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "carácter_de_comilla"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "carácter_de_escape"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "nombre_codificación"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "tipo_de_método_de_acceso"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "tipo_de_dato_arg"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "func_transición"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "tipo_de_dato_de_estado"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "tamaño_de_dato_de_estado"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "func_final"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "func_combinación"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "func_serial"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "func_deserial"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "condición_inicial"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "func_transición_m"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "func_inv_m"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "tipo_de_dato_de_estado_m"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "tamaño_de_dato_de_estado_m"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "func_final_m"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "condición_inicial_m"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "operador_de_ordenamiento"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "o la sintaxis antigua"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "tipo_base"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "configuración regional"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "proveedor"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "reglas"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "versión"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "ordenamiento_existente"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "codificación_origen"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "codificación_destino"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "plantilla"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "codificación"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "estrategia"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "locale_icu"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "reglas_icu"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "proveedor_locale"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "versión_ordenamiento"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "restricción"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "donde restricción es:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "evento"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "variable_de_filtrado"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "valor_de_filtrado"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "donde restricción_de_columna es:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "tipo_ret"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "tipo_columna"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "definición"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "archivo_obj"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "símbolo_enlace"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "contenido_sql"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "método"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "parámetro_opclass"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "manejador_de_llamada"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "manejador_en_línea"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "función_val"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "op_conm"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "op_neg"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "nombre_familia"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "tipo_almacenamiento"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "donde evento puede ser una de:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "elemento_de_esquema"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "tipo_de_servidor"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "versión_de_servidor"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "nombre_fdw"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "nombre_de_estadística"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "tipo_de_estadística"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "nombre_de_suscripción"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "tabla_origen"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "opción_de_like"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "y opción_de_like es:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "directorio"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "nombre_de_parser"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "config_origen"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "función_inicio"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "función_gettoken"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "función_fin"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "función_lextypes"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "función_headline"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "función_init"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "función_lexize"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "nombre_de_función_from"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "nombre_de_función_to"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "nombre_tabla_referenciada"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "nombre_de_relación_de_transición"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "argumentos"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "etiqueta"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "subtipo"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "clase_de_operador_del_subtipo"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "función_canónica"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "función_diff_del_subtipo"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "nombre_de_tipo_de_multirango"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "función_entrada"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "función_salida"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "función_receive"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "función_send"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "función_entrada_del_modificador_de_tipo"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "función_salida_del_modificador_de_tipo"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "función_analyze"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "función_de_subíndice"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "largo_interno"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "alineamiento"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "almacenamiento"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "como_tipo"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "categoría"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "preferido"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "valor_por_omisión"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "elemento"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "delimitador"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "ordenable"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "consulta_with"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "item_de_from"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "nombre_de_cursor"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "expresión_de_salida"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "nombre_de_salida"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "código"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "parámetro"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "sentencia"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "dirección"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "donde dirección puede ser una de:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "cantidad"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "nombre_secuencia"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "nombre_arg"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "tipo_arg"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "esquema_remoto"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "esquema_local"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "destino_de_conflict"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "acción_de_conflict"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "donde destino_de_conflict puede ser uno de:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "nombre_de_columna_de_índice"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "expresión_de_índice"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "predicado_de_índice"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "donde acción_de_conflict es una de:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "canal"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "modo_bloqueo"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "donde modo_bloqueo es uno de:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "nombre_de_tabla_destino"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "alias_de_destino"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "origin_de_datos"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "condición_de_join"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "cláusula_when"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "donde origen_de_datos es:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "nombre_tabla_origen"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "consulta_origen"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "alias_origen"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "y cláusula_when es:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "update_de_merge"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "delete_de_merge"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "insert_de_merge"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "y insert_de_merge es:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "y update_de_merge es:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "y delete_de_merge es:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "carga"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "rol_antiguo"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "rol_nuevo"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "nombre_de_savepoint"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "elemento_agrupante"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "nombre_de_ventana"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "definición_de_ventana"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "donde item_de_from puede ser uno de:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "alias_de_columna"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "método_de_sampleo"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "semilla"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "nombre_consulta_with"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "definición_de_columna"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "tipo_de_join"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "columna_de_join"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "join_con_alias"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "donde elemento_agrupante puede ser una de:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "y consulta_with es:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "valores"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "nombre_col_para_sec_de_búsqueda"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "nombre_col_para_marca_de_ciclo"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "valor_marca_de_ciclo"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "valor_predet_marca_de_ciclo"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "nombre_col_para_ruta_de_ciclo"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "nueva_tabla"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "id_de_snapshot"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "expresión_orden"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "aborta la transacción en curso"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "cambia la definición de una función de agregación"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "cambia la definición de un ordenamiento"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "cambia la definición de una conversión"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "cambia una base de datos"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "define privilegios de acceso por omisión"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "cambia la definición de un dominio"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "cambia la definición de un disparador por evento"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "cambia la definición de una extensión"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "cambia la definición de un conector de datos externos"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "cambia la definición de una tabla foránea"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "cambia la definición de una función"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "cambiar nombre del rol o membresía"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "cambia la definición de un índice"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "cambia la definición de un lenguaje procedural"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "cambia la definición de un objeto grande"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "cambia la definición de una vista materializada"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "cambia la definición de un operador"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "cambia la definición de una clase de operadores"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "cambia la definición de una familia de operadores"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "cambia la definición de una política de seguridad a nivel de registros"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "cambia la definición de un procedimiento"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "cambia la definición de una publicación"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "cambia un rol de la base de datos"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "cambia la definición de una rutina"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "cambia la definición de una regla"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "cambia la definición de un esquema"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "cambia la definición de un generador secuencial"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "cambia la definición de un servidor foráneo"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "cambia la definición de un objeto de estadísticas extendidas"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "cambia la definición de una suscripción"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "cambia un parámetro de configuración del servidor"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "cambia la definición de una tabla"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "cambia la definición de un tablespace"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "cambia la definición de una configuración de búsqueda en texto"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "cambia la definición de un diccionario de búsqueda en texto"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "cambia la definición de un analizador de búsqueda en texto"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "cambia la definición de una plantilla de búsqueda en texto"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "cambia la definición de un disparador"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "cambia la definición de un tipo"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "cambia la definición de un mapeo de usuario"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "cambia la definición de una vista"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "recolecta estadísticas sobre una base de datos"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "inicia un bloque de transacción"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "invocar un procedimiento"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "fuerza un checkpoint de wal"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "cierra un cursor"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "reordena una tabla siguiendo un índice"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "define o cambia un comentario sobre un objeto"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "compromete la transacción en curso"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "confirma una transacción que fue preparada para two-phase commit"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "copia datos entre un archivo y una tabla"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "define un nuevo método de acceso"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "define una nueva función de agregación"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "define una nueva conversión de tipo"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "define un nuevo ordenamiento"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "define una nueva conversión de codificación"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "crea una nueva base de datos"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "define un nuevo dominio"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "define un nuevo disparador por evento"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "instala una extensión"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "define un nuevo conector de datos externos"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "define una nueva tabla foránea"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "define una nueva función"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "define un nuevo rol de la base de datos"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "define un nuevo índice"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "define un nuevo lenguaje procedural"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "define una nueva vista materializada"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "define un nuevo operador"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "define una nueva clase de operadores"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "define una nueva familia de operadores"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "define una nueva política de seguridad a nivel de registros para una tabla"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "define un nuevo procedimiento"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "define una nueva publicación"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "define una nueva regla de reescritura"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "define un nuevo esquema"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "define un nuevo generador secuencial"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "define un nuevo servidor foráneo"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "define estadísticas extendidas"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "define una nueva suscripción"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "define una nueva tabla"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "crea una nueva tabla usando los resultados de una consulta"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "define un nuevo tablespace"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "define una nueva configuración de búsqueda en texto"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "define un nuevo diccionario de búsqueda en texto"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "define un nuevo analizador de búsqueda en texto"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "define una nueva plantilla de búsqueda en texto"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "define una nueva transformación"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "define un nuevo disparador"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "define un nuevo tipo de datos"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "define un nuevo mapa de usuario a servidor foráneo"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "define una nueva vista"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "elimina una sentencia preparada"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "define un nuevo cursor"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "elimina filas de una tabla"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "descartar datos de la sesión"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "ejecutar un bloque anónimo de código"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "elimina un método de acceso"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "elimina una función de agregación"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "elimina una conversión de tipo"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "elimina un ordenamiento"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "elimina una conversión de codificación"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "elimina una base de datos"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "elimina un dominio"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "elimina un disparador por evento"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "elimina una extensión"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "elimina un conector de datos externos"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "elimina una tabla foránea"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "elimina una función"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "elimina un rol de base de datos"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "elimina un índice"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "elimina un lenguaje procedural"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "elimina una vista materializada"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "elimina un operador"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "elimina una clase de operadores"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "elimina una familia de operadores"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "elimina objetos de propiedad de un rol de la base de datos"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "elimina una política de seguridad a nivel de registros de una tabla"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "elimina un procedimiento"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "elimina una publicación"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "elimina una rutina"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "elimina una regla de reescritura"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "elimina un esquema"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "elimina un generador secuencial"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "elimina un descriptor de servidor foráneo"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "elimina estadísticas extendidas"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "elimina una suscripción"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "elimina una tabla"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "elimina un tablespace"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "elimina una configuración de búsqueda en texto"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "elimina un diccionario de búsqueda en texto"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "elimina un analizador de búsqueda en texto"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "elimina una plantilla de búsqueda en texto"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "elimina una transformación"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "elimina un disparador"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "elimina un tipo de datos"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "elimina un mapeo de usuario para un servidor remoto"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "elimina una vista"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "ejecuta una sentencia preparada"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "muestra el plan de ejecución de una sentencia"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "recupera filas de una consulta usando un cursor"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "define privilegios de acceso"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "importa definiciones de tablas desde un servidor foráneo"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "crea nuevas filas en una tabla"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "escucha notificaciones"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "carga un archivo de biblioteca compartida"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "bloquea una tabla"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "condicionalmente inserta, actualiza o elimina filas de una tabla"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "reposiciona un cursor"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "genera una notificación"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "prepara una sentencia para ejecución"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "prepara la transacción actual para two-phase commit"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "cambia de dueño a los objetos de propiedad de un rol de la base de datos"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "reemplaza los contenidos de una vista materializada"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "reconstruye índices"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "libera un “savepoint†definido previamente"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "restaura el valor de un parámetro de configuración al valor inicial"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "revoca privilegios de acceso"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "cancela una transacción que fue previamente preparada para two-phase commit"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "descartar hacia un “savepointâ€"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "define un nuevo â€savepoint†en la transacción en curso"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "define o cambia una etiqueta de seguridad sobre un objeto"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "recupera filas desde una tabla o vista"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "cambia un parámetro de configuración"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "define el modo de verificación de las restricciones de la transacción en curso"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "define el identificador de usuario actual de la sesión actual"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr ""
+"define el identificador del usuario de sesión y el identificador\n"
+"del usuario actual de la sesión en curso"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "define las características de la transacción en curso"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "muestra el valor de un parámetro de configuración"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "vacía una tabla o conjunto de tablas"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "deja de escuchar una notificación"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "actualiza filas de una tabla"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "recolecta basura y opcionalmente estadísticas sobre una base de datos"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "calcula un conjunto de registros"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 sólo puede ser usado en modo no interactivo"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Digite «help» para obtener ayuda.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "no se pudo definir parámetro de impresión «%s»"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "se ignoró argumento extra «%s» en línea de órdenes"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "no se pudo encontrar el ejecutable propio"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"la consulta para completación por tabulador falló: %s\n"
+"La consulta era:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valor «%s» no reconocido para «%s»: se esperaba booleano"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valor «%s» no válido para «%s»: se esperaba número entero"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nombre de variable no válido: «%s»"
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valor «%s» no reconocido para «%s»\n"
+"Los valores disponibles son: %s."
diff --git a/src/bin/psql/po/fr.po b/src/bin/psql/po/fr.po
new file mode 100644
index 0000000..676d05a
--- /dev/null
+++ b/src/bin/psql/po/fr.po
@@ -0,0 +1,7124 @@
+# LANGUAGE message translation file for psql
+# Copyright (C) 2001-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Peter Eisentraut <peter_e@gmx.net>, 2001.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-29 09:17+0000\n"
+"PO-Revision-Date: 2023-09-05 09:52+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binaire « %s » invalide : %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "n'a pas pu lire le binaire « %s » : %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "n'a pas pu trouver un « %s » à exécuter"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "échec de %s() : %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "l'utilisateur n'existe pas"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "commande non exécutable"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "commande introuvable"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "le processus fils a quitté avec le code de sortie %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "le processus fils a été terminé par l'exception 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "le processus fils a été terminé par le signal %d : %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "le processus fils a quitté avec un statut %d non reconnu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requête d'annulation envoyée\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "N'a pas pu envoyer la requête d'annulation : "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu ligne)"
+msgstr[1] "(%lu lignes)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompu\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n"
+"%d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n"
+"cellules %d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "format de sortie invalide (erreur interne) : %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "ignore l'expansion récursive de la variable « %s »"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "commande \\%s invalide"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Essayez \\? pour l'aide."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s : argument « %s » supplémentaire ignoré"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "commande \\%s ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "n'a pas pu obtenir le répertoire principal pour l'identifiant d'utilisateur %ld : %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s : n'a pas pu accéder au répertoire « %s » : %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Vous n'êtes pas connecté à une base de données.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s ») via le port « %s ».\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "aucun tampon de requête"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "numéro de ligne invalide : %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Aucun changement"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s : nom d'encodage invalide ou procédure de conversion introuvable"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "Il n'y a pas d'erreur précédente."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: parenthèse droite manquante"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s : argument requis manquant"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif : ne peut pas survenir après \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif : pas de \\if correspondant"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else : ne peut pas survenir après \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else : pas de \\if correspondant"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif : pas de \\if correspondant"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "Le tampon de requête est vide."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Saisir le nouveau mot de passe de l'utilisateur « %s » : "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Saisir le mot de passe à nouveau : "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Les mots de passe ne sont pas identiques."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s : n'a pas pu lire la valeur pour la variable"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Le tampon de requête a été effacé."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Historique sauvegardé dans le fichier « %s ».\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s : le nom de la variable d'environnement ne doit pas contenir « = »"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "le nom de la fonction est requis"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "le nom de la vue est requis"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Chronométrage activé."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Chronométrage désactivé."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s : %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s : %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch : la valeur d'intervalle est spécifiée plus d'une fois"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch : valeur d'intervalle incorrecte « %s »"
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: le nombre d'itération est spécifié plus d'une fois"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch : nombre d'itération incorrect « %s »"
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch : paramètre « %s » non reconnu"
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Mot de passe pour l'utilisateur %s : "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Ne pas donner utilisateur, hôte ou port lors de l'utilisation d'une chaîne de connexion"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Aucune connexion de base existante pour réutiliser ses paramètres"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Connexion précédente conservée"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect : %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s » ) via le port « %s ».\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s ».\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, serveur %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ATTENTION : %s version majeure %s, version majeure du serveur %s.\n"
+" Certaines fonctionnalités de psql pourraient ne pas fonctionner.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "Connexion SSL (protocole : %s, chiffrement : %s, compression : %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "inconnu"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "désactivé"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "activé"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "connexion chiffrée avec GSSAPI\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"Attention : l'encodage console (%u) diffère de l'encodage Windows (%u).\n"
+" Les caractères 8 bits peuvent ne pas fonctionner correctement.\n"
+" Voir la section « Notes aux utilisateurs de Windows » de la page\n"
+" référence de psql pour les détails.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "la variable d'environnement PSQL_EDITOR_LINENUMBER_ARG doit être définie avec un numéro de ligne"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "n'a pas pu exécuter l'éditeur « %s »"
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "n'a pas pu exécuter /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "n'a pas pu localiser le répertoire temporaire : %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: abréviation ambigüe : « %s » correspond à « %s » comme à « %s »"
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset : les formats autorisés sont aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: les styles de lignes autorisés sont ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset : les styles autorisés de ligne de bordure Unicode sont single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset : les styles autorisés pour la ligne de colonne Unicode sont single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset : les styles autorisés pour la ligne d'en-tête Unicode sont single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: les valeurs acceptées pour xheader_width sont « %s » (par défaut), « %s », « %s » ou un nombre indiquant la largeur exacte"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep doit être un unique caractère d'un octet"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep ne peut pas être un guillemet, un retour à la ligne ou un retour chariot"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset : option inconnue : %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Le style de bordure est %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "La largeur cible n'est pas configuré.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "La largeur cible est %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Affichage étendu activé.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "L'affichage étendu est utilisé automatiquement.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Affichage étendu désactivé.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "La largeur étendue de l'entête est « %s ».\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "La largeur étendue de l'entête est %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Le séparateur de champs pour un CSV est « %s ».\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Le séparateur de champs est l'octet zéro.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Le séparateur de champs est « %s ».\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Le bas de page pas défaut est activé.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Le bas de page par défaut est désactivé.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Le format de sortie est %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Le style de ligne est %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "L'affichage de null est « %s ».\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "L'affichage de la sortie numérique adaptée à la locale est activé.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "L'affichage de la sortie numérique adaptée à la locale est désactivé.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Le paginateur est utilisé pour les affichages longs.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Le paginateur est toujours utilisé.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "L'utilisation du paginateur est désactivé.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Le paginateur ne sera pas utilisé pour moins que %d ligne.\n"
+msgstr[1] "Le paginateur ne sera pas utilisé pour moins que %d lignes.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Le séparateur d'enregistrements est l'octet zéro.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Le séparateur d'enregistrement est <saut de ligne>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Le séparateur d'enregistrements est « %s ».\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Les attributs de la table sont « %s ».\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Les attributs de la table ne sont pas définis.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Le titre est « %s ».\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Le titre n'est pas défini.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "L'affichage des tuples seuls est activé.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "L'affichage des tuples seuls est désactivé.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Le style de bordure Unicode est « %s ».\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Le style de ligne Unicode est « %s ».\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Le style d'en-tête Unicode est « %s ».\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\! : échec"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch ne peut pas être utilisé avec une requête vide"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "n'a pas pu configurer le chronomètre : %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (chaque %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (chaque %gs)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "n'a pas pu attendre le signal : %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** REQUÊTE *********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "« %s.%s » n'est pas une vue"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "n'a pas pu analyser le tableau reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "ne peut mettre entre guillemets sans connexion active"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »"
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "la connexion au serveur a été perdue"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "La connexion au serveur a été perdue. Tentative de réinitialisation : "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Échec.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Succès.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "PQresultStatus inattendu : %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Temps : %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Durée : %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Durée : %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Durée : %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Vous n'êtes pas connecté à une base de données."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Notification asynchrone « %s » reçue avec le contenu « %s » en provenance du\n"
+"processus serveur de PID %d.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Notification asynchrone « %s » reçue en provenance du processus serveur de\n"
+"PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "n'a pas pu imprimer la table résultante : %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "aucune ligne retournée pour \\gset"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "plus d'une ligne retournée pour \\gset"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "tentative ignorée d'utilisation de \\gset dans une variable traitée spécialement « %s »"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Mode étape par étape: vérifiez la commande)*********************************\n"
+"%s\n"
+"***(appuyez sur entrée pour l'exécuter ou tapez x puis entrée pour annuler)***\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "INSTRUCTION : %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "état de la transaction inattendu (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Colonne"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Type"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "La commande n'a pas de résultats ou le résultat n'a pas de colonnes.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy : arguments requis"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy : erreur d'analyse sur « %s »"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy : erreur d'analyse à la fin de la ligne"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "n'a pas pu exécuter la commande « %s » : %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s : ne peut pas copier depuis/vers un répertoire"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "n'a pas pu écrire les données du COPY : %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Échec du transfert de données COPY : %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "annulé par l'utilisateur"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Saisissez les données à copier suivies d'un saut de ligne.\n"
+"Terminez avec un antislash et un point seuls sur une ligne ou un signal EOF."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "annulé du fait d'une erreur de lecture"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "tente de sortir du mode copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview : la commande n'a pas retourné d'ensemble de résultats"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview : la requête doit renvoyer au moins trois colonnes"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview : les en-têtes horizontales et verticales doivent être des colonnes différentes"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview : la colonne de données doit être spécifiée quand la requête retourne plus de trois colonnes"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview : nombre maximum de colonnes (%d) dépassé"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview : le résultat de la requête contient plusieurs valeurs de données pour la ligne « %s », colonne « %s »"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview : le numéro de colonne %d est en dehors des limites 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview : nom de colonne ambigu : « %s »"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview : nom de colonne non trouvé : « %s »"
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Schéma"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Nom"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Type de données du résultat"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Type de données des paramètres"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "Description"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Liste des fonctions d'agrégation"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Le serveur (version %s) ne supporte pas les méthodes d'accès."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Table"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Gestionnaire"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Liste des méthodes d'accès"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Propriétaire"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Emplacement"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Options"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Taille"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Liste des tablespaces"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df ne prend que [anptwS+] comme options"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df ne prend pas d'option « %c » pour un serveur en version %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "window"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatibilité"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "restricted"
+
+#: describe.c:398
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallèle"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Sécurité"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Langage"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Nom interne"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "Liste des fonctions"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Éléments"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "Liste des types de données"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Type de l'arg. gauche"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Type de l'arg. droit"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Type du résultat"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "Fonction"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "Liste des opérateurs"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Encodage"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "Fournisseur de locale"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Collationnement"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Type caract."
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "Locale ICU"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "Règles ICU :"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "Liste des bases de données"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "table"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "vue"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "vue matérialisée"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "séquence"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "table distante"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "table partitionnée"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Droits d'accès à la colonne"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Politiques"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Droits d'accès"
+
+#: describe.c:1195
+msgid "function"
+msgstr "fonction"
+
+#: describe.c:1197
+msgid "type"
+msgstr "type"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "schéma"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Droits d'accès par défaut"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Objet"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "contrainte de table"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "contrainte de domaine"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "classe d'opérateur"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "famille d'opérateur"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "règle"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "Descriptions des objets"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Aucune relation nommée « %s » n'a été trouvée."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "Aucune relation n'a été trouvée."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Aucune relation avec l'OID « %s » n'a été trouvée."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Début"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "Incrément"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "oui"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "non"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "Cycles ?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Propriétaire : %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Séquence pour la colonne d'identité : %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Séquence non journalisée « %s.%s »"
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Séquence « %s.%s »"
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Table non tracée « %s.%s »"
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Table « %s.%s »"
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vue « %s.%s »"
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Vue matérialisée non journalisée « %s.%s »"
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Vue matérialisée « %s.%s »"
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Index non tracé « %s.%s »"
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index « %s.%s »"
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Index partitionné non journalisé « %s.%s »"
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Index partitionné « %s.%s »"
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Table TOAST « %s.%s »"
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Type composé « %s.%s »"
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Table distante « %s.%s »"
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Table non journalisée « %s.%s »"
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Table partitionnée « %s.%s »"
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "Collationnement"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "NULL-able"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "Par défaut"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Clé ?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "Définition"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "Options FDW"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Stockage"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Compression"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Cible de statistiques"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partition de : %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Aucune contrainte de partition"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Contrainte de partition : %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Clé de partition : %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Table propriétaire : « %s.%s »"
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "clé primaire, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "unique"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls non distincts"
+
+#: describe.c:2321
+msgid ", "
+msgstr " , "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "pour la table « %s.%s »"
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", prédicat (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", en cluster"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", invalide"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", déferrable"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", initialement déferré"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", identité réplica"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "Index :"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "Contraintes de vérification :"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "Contraintes de clés étrangères :"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "Référencé par :"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Politiques :"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Politiques (mode sécurité de ligne activé en forcé) :"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Politiques (mode sécurité de ligne activé) : (aucune)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Politiques (mode sécurité de ligne activé en forcé) : (aucune)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Politiques (mode sécurité de ligne désactivé) :"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Objets statistiques :"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Règles :"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Règles désactivées :"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Règles toujous activées :"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Règles activées uniquement sur le réplica :"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Publications :"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Définition de la vue :"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Triggers :"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Triggers utilisateurs désactivés :"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Triggers internes désactivés :"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Triggers toujours activés :"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Triggers activés uniquement sur le réplica :"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Serveur : %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Options FDW : (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "Hérite de"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Nombre de partitions : %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Nombre de partitions : %d (utilisez \\d+ pour les lister)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Nombre de tables enfants : %d (utilisez \\d+ pour les lister)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Tables enfant"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Partitions"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Table de type : %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Identité de réplicat"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Contient des OID : oui"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Méthode d'accès : %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace « %s »"
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "Liste des rôles"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Nom du rôle"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Attributs"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superutilisateur"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Pas d'héritage"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Créer un rôle"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Créer une base"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Ne peut pas se connecter"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Réplication"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Contournement RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Sans connexions"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d connexion"
+msgstr[1] "%d connexions"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Mot de passe valide jusqu'à "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Rôle"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "Base de données"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Réglages"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Aucune configuration pour le rôle « %s » et la base de données « %s » n'a été trouvée."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Aucune configuration pour le rôle « %s » n'a été trouvée."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Aucune configuration n'a été trouvée."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "Liste des paramètres"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Membre de"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Donneur de droits"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Liste des droits de rôles"
+
+#: describe.c:3952
+msgid "index"
+msgstr "index"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "Table TOAST"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "index partitionné"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "temporaire"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "non journalisé"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "Persistence"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Méthode d'accès"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "Liste des relations"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Le serveur (version %s) ne supporte pas le partitionnement déclaratif des tables."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "Liste des index partitionnés"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "Liste des tables partitionnées"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "Liste des relations partitionnées"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Nom du parent"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Taille de la partition de dernier niveau"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Taille totale"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "De confiance"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Langage interne"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Gestionnaire d'appel"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Validateur"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Gestionnaire en ligne"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "Liste des langages"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Vérification"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Liste des domaines"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Source"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "Destination"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "Par défaut ?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "Liste des conversions"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Paramètre"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Valeur"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "Contexte"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "Liste des paramètres de configuration"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "Liste des paramètres de configuration à valeur personnalisée"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Le serveur (version %s) ne supporte pas les triggers d'événement."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Événement"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "activé"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "réplicat"
+
+#: describe.c:4658
+msgid "always"
+msgstr "toujours"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "désactivé"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "Activé"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Tags"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "Liste des triggers sur évènement"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Le serveur (version %s) ne supporte pas les statistiques étendues."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Dépendances"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "Liste des statistiques étendues"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Type source"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Type cible"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "assigné"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Implicite ?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "Liste des conversions explicites"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "Fournisseur"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Déterministe ?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "Liste des collationnements"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Liste des schémas"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "Liste des analyseurs de la recherche de texte"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Aucun analyseur de la recherche de texte nommé « %s » n'a été trouvé."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Aucun analyseur de recherche de texte n'a été trouvé."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Début de l'analyse"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Méthode"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Obtenir le prochain jeton"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Fin de l'analyse"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Obtenir l'en-tête"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Obtenir les types de jeton"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analyseur « %s.%s » de la recherche de texte"
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analyseur « %s » de la recherche de texte"
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Nom du jeton"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Types de jeton pour l'analyseur « %s.%s »"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Types de jeton pour l'analyseur « %s »"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Modèle"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Options d'initialisation"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "Liste des dictionnaires de la recherche de texte"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "Initialisation"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "Liste des modèles de la recherche de texte"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "Liste des configurations de la recherche de texte"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Aucune configuration de la recherche de texte nommée « %s » n'a été trouvée."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Aucune configuration de recherche de texte n'a été trouvée."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Jeton"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Dictionnaires"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configuration « %s.%s » de la recherche de texte"
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configuration « %s » de la recherche de texte"
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analyseur : « %s.%s »"
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analyseur : « %s »"
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "Liste des wrappers de données distantes"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Wrapper des données distantes"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "Version"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "Liste des serveurs distants"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Serveur"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Nom de l'utilisateur"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "Liste des correspondances utilisateurs"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "Liste des tables distantes"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "Liste des extensions installées"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Aucune extension nommée « %s » n'a été trouvée."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Aucune extension n'a été trouvée."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "Description d'objet"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objets dans l'extension « %s »"
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "les références entre bases de données ne sont pas implémentées : %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Le serveur (version %s) ne supporte pas les publications."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Toutes les tables"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Insertions"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Mises à jour"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Suppressions"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Tronque"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Via la racine"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "Liste des publications"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Aucune publication nommée « %s » n'a été trouvée."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Aucune publication n'a été trouvée."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "Publication %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Tables :"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Tables des schémas :"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Le serveur (version %s) ne supporte pas les souscriptions."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "Publication"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Binaire"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "Flux"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Commit en deux phases"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "Désactiver en cas d'erreur"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Origine"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Mot de passe requis"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "Exécuté en tant que propriétaire ?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Validation synchrone"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Informations de connexion"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "Ignore LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "Liste des souscriptions"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Type en entrée"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Type de stockage"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "Classe d'opérateur"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "Famille d'opérateur"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "Liste des classes d'opérateurs"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Types applicables"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "Liste des familles d'opérateurs"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Opérateur"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "Stratégie"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "ordre"
+
+#: describe.c:6911
+msgid "search"
+msgstr "recherche"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "But"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "Tri famille d'opérateur"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "Liste d'opérateurs des familles d'opérateurs"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "Type de l'arg. gauche enregistré"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "Type de l'arg. droit enregistré"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "Numéro"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "Liste des fonctions de support des familles d'opérateurs"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "« Large objects »"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql est l'interface interactive de PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTIONS]... [BASE [UTILISATEUR]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Options générales :\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr ""
+" -c, --command=COMMANDE exécute une commande unique (SQL ou interne), puis\n"
+" quitte\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=BASE indique le nom de la base de données à laquelle se\n"
+" connecter (par défaut : « %s »)\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FICHIER exécute les commandes du fichier, puis quitte\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list affiche les bases de données disponibles, puis quitte\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOM=VALEUR\n"
+" configure la variable psql NOM en VALEUR\n"
+" (par exemple : -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ne lit pas le fichier de démarrage (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (« un »), --single-transaction\n"
+" exécute dans une transaction unique (si non\n"
+" interactif)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] affiche cette aide et quitte\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commandes liste les méta-commandes, puis quitte\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables liste les variables spéciales, puis quitte\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Options d'entrée/sortie :\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all affiche les lignes du script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors affiche les commandes échouées\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries affiche les commandes envoyées au serveur\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr ""
+" -E, --echo-hidden affiche les requêtes engendrées par les commandes\n"
+" internes\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FICHIER envoie les traces dans le fichier\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline désactive l'édition avancée de la ligne de commande\n"
+" (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr ""
+" -o, --output=FICHIER écrit les résultats des requêtes dans un fichier (ou\n"
+" |tube)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet s'exécute silencieusement (pas de messages, uniquement\n"
+" le résultat des requêtes)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr ""
+" -s, --single-step active le mode étape par étape (confirmation pour\n"
+" chaque requête)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr ""
+" -S, --single-line active le mode ligne par ligne (EOL termine la\n"
+" commande SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Options de formattage de la sortie :\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr ""
+" -A, --no-align active le mode d'affichage non aligné des tables\n"
+" (-P format=unaligned)\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr ""
+" --csv mode d'affichage CSV (valeurs séparées par des\n"
+" virgules)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=CHAINE\n"
+" séparateur de champs pour un affichage non aligné\n"
+" (par défaut : « %s »)\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr ""
+" -H, --html active le mode d'affichage HTML des tables\n"
+" (-P format=html)\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] initialise l'option d'impression VAR à ARG (voir la\n"
+" commande \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=CHAINE\n"
+" séparateur d'enregistrements pour un affichage non\n"
+" aligné (par défaut : saut de ligne)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only affiche seulement les lignes (-P tuples_only)\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr ""
+" -T, --table-attr=TEXTE initialise les attributs des balises HTML de tableau\n"
+" (largeur, bordure)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded active l'affichage étendu des tables (-P expanded)\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" initialise le séparateur de champs pour un affichage\n"
+" non aligné à l'octet zéro\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" initialise le séparateur d'enregistrements pour un\n"
+" affichage non aligné à l'octet zéro\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HÔTE nom d'hôte du serveur de la base de données ou\n"
+" répertoire de la socket (par défaut : %s)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "socket locale"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr ""
+" -p, --port=PORT port du serveur de la base de données (par défaut :\n"
+" « %s »)\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr ""
+" -U, --username=UTILISATEUR\n"
+" nom d'utilisateur de la base de données (par\n"
+" défaut : « %s »)\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ne demande jamais un mot de passe\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password force la demande du mot de passe (devrait survenir\n"
+" automatiquement)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Pour en savoir davantage, saisissez « \\? » (pour les commandes internes) ou\n"
+"« \\help » (pour les commandes SQL) dans psql, ou consultez la section psql de\n"
+"la documentation de PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Général\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... configure les paramètres de la requête\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr ""
+" \\copyright affiche les conditions d'utilisation et de\n"
+" distribution de PostgreSQL\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLONNES] exécute la requête et affiche le résultat dans un tableau croisé\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose affiche le message d'erreur le plus récent avec une verbosité maximale\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FICHIER] exécute la requête (et envoie les résultats à un fichier ou à |pipe);\n"
+" \\g sans arguments est équivalent à un point-virgule\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc décrit le résultat de la requête sans l'exécuter\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec exécute la requête et exécute chaque valeur du résultat\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PRÉFIXE] exécute la requête et enregistre le résultat dans des variables psql\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FICHIER] comme \\g, mais force le mode de sortie étendu\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q quitte psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] exécute la requête toutes les SEC secondes, jusqu'à N fois\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Aide\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commandes] affiche l'aide sur les métacommandes\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options affiche l'aide sur les options en ligne de commande de psql\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables affiche l'aide sur les variables spéciales\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr ""
+" \\h [NOM] aide-mémoire pour les commandes SQL, * pour toutes\n"
+" les commandes\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Tampon de requête\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [FICHIER] [LIGNE] édite le tampon de requête ou le fichier avec un\n"
+" éditeur externe\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [FONCTION [LIGNE]] édite la définition de fonction avec un éditeur\n"
+" externe\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [VUE [LIGNE]] édite la définition de vue avec un éditeur\n"
+" externe\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p affiche le contenu du tampon de requête\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r efface le tampon de requêtes\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr ""
+" \\s [FICHIER] affiche l'historique ou le sauvegarde dans un\n"
+" fichier\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr ""
+" \\w [FICHIER] écrit le contenu du tampon de requêtes dans un\n"
+" fichier\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "Entrée/Sortie\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr ""
+" \\copy ... exécute SQL COPY avec le flux de données dirigé vers\n"
+" l'hôte client\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXTE] écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FICHIER exécute les commandes du fichier\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr ""
+" \\ir FICHIER identique à \\i, mais relatif à l'emplacement du script\n"
+" ou un |tube\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr ""
+" \\o [FICHIER] envoie les résultats de la requête vers un fichier\n"
+" ou un |tube\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [TEXTE] écrit un texte sur la sortie des résultats des\n"
+" requêtes (\\o) (-n pour supprimer le retour à la ligne)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [TEXTE] écrit le texte sur la sortie des erreurs (-n pour supprimer le retour à la ligne)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Conditionnel\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR début du bloc conditionnel\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif alternative à l'intérieur du bloc conditionnel courant\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternative finale à l'intérieur du bloc conditionnel courant\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif bloc conditionnel de fin\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Informations\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (options : S = affiche les objets systèmes, + = informations supplémentaires)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] affiche la liste des tables, vues et séquences\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr ""
+" \\d[S+] NOM affiche la description de la table, de la vue,\n"
+" de la séquence ou de l'index\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MODÈLE] affiche les aggrégats\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MODÈLE] affiche la liste des méthodes d'accès\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] affiche les classes d'opérateurs\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] affiche les familles d'opérateur\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] affiche les opérateurs des familles d'opérateur\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] liste les fonctions de support des familles d'opérateur\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MODÈLE] affiche la liste des tablespaces\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MODÈLE] affiche la liste des conversions\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [MODÈLE] affiche les paramètres de configuration\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MODÈLE] affiche la liste des transtypages\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [MODÈLE] affiche les commentaires des objets dont le commentaire\n"
+" n'est affiché nul part ailleurs\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MODÈLE] affiche la liste des domaines\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MODÈLE] affiche les droits par défaut\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MODÈLE] affiche la liste des tables distantes\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MODÈLE] affiche la liste des serveurs distants\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MODÈLE] affiche la liste des tables distantes\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MODÈLE] affiche la liste des correspondances utilisateurs\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MODÈLE] affiche la liste des wrappers de données distantes\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" affiche la liste des fonctions [seulement agrégat/normal/procédure/trigger/window]\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr ""
+" \\dF[+] [MODÈLE] affiche la liste des configurations de la recherche\n"
+" plein texte\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr ""
+" \\dFd[+] [MODÈLE] affiche la liste des dictionnaires de la recherche de\n"
+" texte\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr ""
+" \\dFp[+] [MODÈLE] affiche la liste des analyseurs de la recherche de\n"
+" texte\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr ""
+" \\dFt[+] [MODÈLE] affiche la liste des modèles de la recherche de\n"
+" texte\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MODÈLE] affiche la liste des index\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] liste des « Large Objects », identique à \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MODÈLE] affiche la liste des langages procéduraux\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [MODÈLE] affiche la liste des vues matérialisées\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MODÈLE] affiche la liste des schémas\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" affiche la liste des opérateurs\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MODÈLE] affiche la liste des collationnements\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp[S] [MODÈLE] affiche la liste des droits d'accès aux tables,\n"
+" vues, séquences\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] affiche les relations partitionnées [seulement index/table] [n=imbriquées]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [ROLEPTRN [DBPTRN]] liste la configuration utilisateur par base de données\n"
+"\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\dg[S] [MODÈLE] affiche la liste des droits des rôles\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[S+] [MODÈLE] affiche la liste des publications de réplication\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MODÈLE] affiche la liste des souscriptions de réplication\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MODÈLE] affiche la liste des séquences\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MODÈLE] affiche la liste des tables\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MODÈLE] affiche la liste des types de données\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MODÈLE] affiche la liste des vues\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MODÈLE] affiche la liste des extensions\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [MODÈLE] affiche les statistiques étendues\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [MODÈLE] affiche les triggers sur évènement\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [MODÈLE] affiche la liste des bases de données\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] [FONCTION] édite la définition d'une fonction\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv [FONCTION] édite la définition d'une vue\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [MODÈLE] identique à \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "« Large objects »\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr ""
+" \\lo_export LOBOID FICHIER\n"
+" écrit un « Large Object » dans le fichier\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FICHIER [COMMENTAIRE]\n"
+" lit un « Large Object » à partir du fichier\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\dl[+] liste des « Large Objects »\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID supprime un « Large Object »\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "Formatage\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a bascule entre les modes de sortie alignée et non\n"
+" alignée\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [CHAÎNE] initialise le titre d'une table, ou le désactive en\n"
+" l'absence d'argument\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [CHAÎNE] affiche ou initialise le séparateur de champ pour\n"
+" une sortie non alignée des requêtes\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H bascule le mode de sortie HTML (actuellement %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOM [VALEUR]] règle l'affichage de la table\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t affiche uniquement les lignes (actuellement %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [CHAÃŽNE] initialise les attributs HTML de la balise <table>,\n"
+" ou l'annule en l'absence d'argument\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] bascule l'affichage étendu (actuellement %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "Connexions\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[BASE|- UTILISATEUR|- HÔTE|- PORT|-] | conninfo}\n"
+" se connecte à une autre base de données\n"
+" (actuellement « %s »)\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[BASE|- UTILISATEUR|- HÔTE|- PORT|-] | conninfo}\n"
+" se connecte à une nouvelle base de données\n"
+" (aucune connexion actuellement)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo affiche des informations sur la connexion en cours\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODAGE] affiche ou initialise l'encodage du client\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr ""
+" \\password [UTILISATEUR]\n"
+" modifie de façon sécurisé le mot de passe d'un\n"
+" utilisateur\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "Système d'exploitation\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [RÉPERTOIRE] change de répertoire de travail\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR récupère une variable d'environnement\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NOM [VALEUR] (dés)initialise une variable d'environnement\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr ""
+" \\timing [on|off] bascule l'activation du chronométrage des commandes\n"
+" (actuellement %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [COMMANDE] exécute la commande dans un shell ou exécute un\n"
+" shell interactif\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Variables\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr ""
+" \\prompt [TEXTE] NOM demande à l'utilisateur de configurer la variable\n"
+" interne\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NOM [VALEUR]] initialise une variable interne ou les affiche\n"
+" toutes en l'absence de paramètre\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOM désactive (supprime) la variable interne\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Liste des variables traitées spécialement\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "variables psql :\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOM=VALEUR\n"
+" ou \\set NOM VALEUR dans psql\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" si activé, les commandes SQL réussies sont automatiquement validées\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" détermine la casse utilisée pour compléter les mots clés SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" le nom de base de données actuel\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" contrôle ce qui est envoyé sur la sortie standard\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" si activé, affiche les requêtes internes exécutées par les méta-commandes ;\n"
+" si configuré à « noexec », affiche les requêtes sans les exécuter\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" encodage du jeu de caractères client\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" true si la dernière requête a échoué, sinon false\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" le nombre de lignes résultats à récupérer et à afficher à la fois\n"
+" (0 pour illimité)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" si activé, les méthodes d'accès ne sont pas affichées\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" si activé, les méthodes de compression methods ne sont pas affichées\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" contrôle l'historique des commandes [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" nom du fichier utilisé pour stocker l'historique des commandes\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" nombre maximum de commandes à stocker dans l'historique de commandes\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" l'hôte de la base de données\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" nombre d'EOF nécessaire pour terminer une session interactive\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" valeur du dernier OID affecté\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message et SQLSTATE de la dernière erreur ou une chaîne vide et \"00000\" if si aucune erreur\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" si activé, une erreur n'arrête pas une transaction (utilise des savepoints implicites)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" arrête l'exécution d'un batch après une erreur\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" port du serveur pour la connexion actuelle\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" spécifie l'invite standard de psql\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" spécifie l'invite utilisé quand une requête continue après la ligne courante\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" spécifie l'invite utilisée lors d'un COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" s'exécute en silence (identique à l'option -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" nombre de lignes renvoyées ou affectées par la dernière requête, ou 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" version du serveur (chaîne courte ou format numérique)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" true si la dernière requête a échoué, sinon false\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" code de sortie de la dernière commande shell\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" affiche tous les résultats d'une requête combinée (\\;) au lieu du dernier uniquement\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" contrôle l'affichage des champs de contexte du message [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" une fin de ligne termine le mode de commande SQL (identique à l'option -S)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" mode pas à pas (identique à l'option -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE de la dernière requête, ou \"00000\" si aucune erreur\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" l'utilisateur actuellement connecté\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" contrôle la verbosité des rapports d'erreurs [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" version de psql (chaîne longue, chaîne courte, ou format numérique)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Paramètres d'affichage :\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOM[=VALEUR]\n"
+" ou \\pset NOM [VALEUR] dans psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" style de bordure (nombre)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" largeur cible pour le format encadré\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (ou x)\n"
+" sortie étendue [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" champ séparateur pour l'affichage non aligné (par défaut « %s »)\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" configure le séparateur de champ pour l'affichage non alignée à l'octet zéro\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" active ou désactive l'affiche du bas de tableau [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" active le format de sortie [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" configure l'affichage des lignes de bordure [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" configure la chaîne à afficher à la place d'une valeur NULL\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" active ou désactive l'affichage d'un caractère spécifique à la locale pour séparer\n"
+" des groupes de chiffres [on, off]\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" contrôle quand un paginateur externe est utilisé [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" enregistre le séparateur de ligne pour les affichages non alignés\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" initialise le séparateur d'enregistrements pour un affichage\n"
+" non aligné à l'octet zéro\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (ou T)\n"
+" indique les attributs pour la balise de table dans le format html ou les largeurs\n"
+" proportionnelles de colonnes pour les types de données alignés à gauche dans le\n"
+" format latex-longtable\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" configure le titre de la table pour toute table affichée\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" si activé, seules les données de la table sont affichées\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" configure le style d'affichage de ligne Unicode [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variables d'environnement :\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOM=VALEUR [NOM=VALEUR] psql ...\n"
+" ou \\setenv NOM [VALEUR] dans psql\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NOM=VALEUR\n"
+" psql ...\n"
+" ou \\setenv NOM [VALEUR] dans psql\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" nombre de colonnes pour le format encadré\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" identique au paramètre de connexion application_name\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" identique au paramètre de connexion dbname\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" identique au paramètre de connexion host\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" nom du fichier de mot de passe\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" mot de passe de connexion (non recommendé)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" identique au paramètre de connexion port\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" identique au paramètre de connexion user\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" éditeur utilisé par les commandes \\e, \\ef et \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" comment spécifier un numéro de ligne lors de l'appel de l'éditeur\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" autre emplacement pour le fichier d'historique des commandes\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nom du paginateur externe\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" nom du paginateur externe utilisé pour \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" autre emplacement pour le fichier .psqlrc de l'utilisateur\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell utilisé par la commande \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" répertoire pour les fichiers temporaires\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "Aide-mémoire disponible :\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Commande : %s\n"
+"Description : %s\n"
+"Syntaxe :\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Aucun aide-mémoire disponible pour « %s ».\n"
+"Essayez \\h sans arguments pour afficher les aide-mémoires disponibles.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "n'a pas pu lire à partir du fichier en entrée : %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "n'a pas pu sauvegarder l'historique dans le fichier « %s » : %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "l'historique n'est pas supportée par cette installation"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s : non connecté à une base de données"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s : la transaction en cours est abandonnée"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s : état de la transaction inconnu"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if : échappé"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Saisissez « \\q » pour quitter %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Les données en entrée proviennent d'une sauvegarde PostgreSQL au format custom.\n"
+"Utilisez l'outil en ligne de commande pg_restore pour restaurer cette sauvegarde dans une base de données.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Utilisez \\? pour l'aide ou appuyez sur control-C pour vider le tampon de saisie."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Utilisez \\? pour l'aide."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Vous utilisez psql, l'interface en ligne de commande de PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Saisissez:\n"
+" \\copyright pour les termes de distribution\n"
+" \\h pour l'aide-mémoire des commandes SQL\n"
+" \\? pour l'aide-mémoire des commandes psql\n"
+" \\g ou point-virgule en fin d'instruction pour exécuter la requête\n"
+" \\q pour quitter\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Utilisez \\q pour quitter."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Utilisez control-D pour quitter."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Utilisez control-C pour quitter."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "requête ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "a atteint EOF sans trouver le(s) \\endif fermant"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "chaîne entre guillemets non terminée"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s : mémoire épuisée"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "nom"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "signature_agrégat"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nouveau_nom"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "nouveau_propriétaire"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nouveau_schéma"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "où signature_agrégat est :"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "mode_argument"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "nom_agrégat"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "type_argument"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "option"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "où option peut être :"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "limite_de_connexion"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "nouveau_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "paramètre_configuration"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "valeur"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "rôle_cible"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "nom_schéma"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_ou_revoke_raccourci"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "où abbreviated_grant_or_revoke fait partie de :"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "nom_rôle"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "expression"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "contrainte_domaine"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "nom_contrainte"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nouvelle_nom_contrainte"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nouvelle_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "objet_membre"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "où objet_membre fait partie de :"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "nom_objet"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "nom_agrégat"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "type_source"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "type_cible"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "nom_fonction"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "nom_opérateur"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "type_argument_gauche"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "type_argument_droit"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "méthode_indexage"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "nom_procédure"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "nom_routine"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "nom_type"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "nom_langage"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "et signature_agrégat est :"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "fonction_gestionnaire"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "fonction_validateur"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "action"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "nom_colonne"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nouvelle_nom_colonne"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "où action fait partie de :"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "type_données"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "collationnement"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "contrainte_colonne"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "entier"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "option_attribut"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "contrainte_table"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "nom_trigger"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "table_parent"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "nom_extension"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "coût_exécution"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "lignes_de_résultat"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "fonction_support"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "specification_role"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "nom_utilisateur"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "où specification_role peut être :"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nom_groupe"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "nom_tablespace"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "nom_index"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "paramètre_stockage"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "numéro_colonne"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "oid_large_object"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "méthode_compression"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "numéro_de_stratégie"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "type_op"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "nom_famille_tri"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "numéro_de_support"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "type_argument"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "nom_table"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "expression_using"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "expression_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "objet_publication"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "paramètre_publication"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "où publication_object fait partie de :"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "mot_de_passe"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "horodatage"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "nom_base_de_donnée"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "incrément"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "valeur_min"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "valeur_max"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "début"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "nouveau_début"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "nouvelle_cible"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "nom_publication"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "option_publication"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "option_rafraichissement"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "paramètre_souscription"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "option_skip"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "nom_partition"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "spec_limite_partition"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "options_séquence"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "option_séquence"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "contrainte_table_utilisant_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "nom_règle_réécriture"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "et partition_bound_spec est :"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "expr_limite_partition"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "et contrainte_colonne est :"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "expression_par_défaut"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "expression_génération"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "paramètres_index"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "table_référence"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "colonne_référence"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "action"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "et contrainte_table est :"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "élément_exclusion"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "opérateur"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "prédicat"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "et contrainte_table_utilisant_index est :"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "dans les contraintes UNIQUE, PRIMARY KEY et EXCLUDE, les paramètres_index sont :"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "élément_exclusion dans une contrainte EXCLUDE est :"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "classe_d_opérateur"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referential_action dans une contrainte FOREIGN KEY/REFERENCES est :"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "option_tablespace"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "type_jeton"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "nom_dictionnaire"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "ancien_dictionnaire"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "nouveau_dictionnaire"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "nom_attribut"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nouveau_nom_attribut"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nouvelle_valeur_enum"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "valeur_enum_voisine"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "valeur_enum_existante"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "propriété"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "nom_serveur"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "nom_option_vue"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "valeur_option_vue"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "table_et_colonnes"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "où option fait partie de :"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "taille"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "et table_et_colonnes est :"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "mode_transaction"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "où mode_transaction fait partie de :"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "nom_relation"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "nom_domaine"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "nom_politique"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "nom_règle"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "littéral_chaîne"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "id_transaction"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "nom_fichier"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "commande"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "condition"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "requête"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "nom_format"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "caractère_délimiteur"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "chaîne_null"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "chaîne_par_défaut"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "caractère_guillemet"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "chaîne_d_échappement"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "nom_encodage"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "type_données_arg"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "type_de_données_statut"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "taille_de_données_statut"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "condition_initiale"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "m_type_de_données_statut"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "m_taille_de_données_statut"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "m_condition_initiale"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "opérateur_de_tri"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "ou l'ancienne syntaxe"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "type_base"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "fournisseur"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "règles"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "version"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "collationnement_existant"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "encodage_source"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "encodage_destination"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "modèle"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "encodage"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "stratégie"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "règles_icu"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "contrainte"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "où la contrainte est :"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "événement"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "filtre_valeur"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "où contrainte_colonne est :"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "type_en_retour"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "type_colonne"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "définition"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "fichier_objet"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "symbole_link"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "corps_sql"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "méthode"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "paramètre_opclass"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "gestionnaire_d_appel"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "gestionnaire_en_ligne"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "fonction_val"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "nom_famille"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "type_stockage"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "où événement fait partie de :"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "élément_schéma"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "type_serveur"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "version_serveur"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "nom_fdw"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "nom_statistique"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "nom_souscription"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "table_source"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "option_like"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "et option_like est :"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "répertoire"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "nom_analyseur"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "configuration_source"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "fonction_start"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "fonction_gettoken"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "fonction_end"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "fonction_lextypes"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "fonction_headline"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "fonction_init"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "fonction_lexize"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "nom_fonction_from_sql"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "nom_fonction_to_sql"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "nom_table_référencée"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "nom_relation_transition"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "arguments"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "label"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "sous_type"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "classe_opérateur_sous_type"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "fonction_canonique"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "fonction_diff_sous_type"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "nom_type_multirange"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "fonction_en_sortie"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "fonction_en_sortie"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "fonction_receive"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "fonction_send"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "fonction_en_entrée_modificateur_type"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "fonction_en_sortie_modificateur_type"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "fonction_analyze"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "fonction_indice"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "longueur_interne"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "alignement"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "stockage"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "type_like"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "catégorie"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "préféré"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "par défaut"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "élément"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "délimiteur"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "collationnable"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "requête_with"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "élément_from"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "nom_curseur"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "expression_en_sortie"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "nom_en_sortie"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "code"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "paramètre"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "instruction"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "direction"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "où direction fait partie de :"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "nombre"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "nom_séquence"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "nom_argument"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "type_arg"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "schema_distant"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "schéma_local"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "cible_conflit"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "action_conflit"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "où cible_conflit fait partie de :"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "index_nom_colonne"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "index_prédicat"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "où action_conflit fait partie de :"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "sous-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "canal"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "mode_de_verrou"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "où mode_de_verrou fait partie de :"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "target_table_name"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "target_alias"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "condition_de_jointure"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "où data_source est :"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "source_table_name"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "et when_clause est :"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "merge_delete"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "et merge_insert est :"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "et merge_update est :"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "et merge_delete est :"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "contenu"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "ancien_rôle"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "nouveau_rôle"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "nom_savepoint"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "element_regroupement"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "nom_window"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "définition_window"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "sélection"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "où élément_from fait partie de :"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "alias_colonne"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "méthode_echantillonnage"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "graine"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "nom_requête_with"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "définition_colonne"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "type_de_jointure"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "colonne_de_jointure"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "join_utilisant_alias"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "où element_regroupement fait partie de :"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "et requête_with est :"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "valeurs"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "nom_colonne_seq_recherche"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "nom_colonne_marque_cycle"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "valeur_marque_cycle"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "défaut_marque_cyle"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "nom_colonne_chemin_cycle"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "nouvelle_table"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "id_snapshot"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "expression_de_tri"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "abandonner la transaction en cours"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "modifier la définition d'une fonction d'agrégation"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "modifier la définition d'un collationnement"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "modifier la définition d'une conversion"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "modifier une base de données"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "définir les droits d'accès par défaut"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "modifier la définition d'un domaine"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "modifier la définition d'un trigger sur évènement"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "modifier la définition d'une extension"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "modifier la définition d'un wrapper de données distantes"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "modifier la définition d'une table distante"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "modifier la définition d'une fonction"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "modifier le nom d'un groupe ou la liste des ses membres"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "modifier la définition d'un index"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "modifier la définition d'un langage procédural"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "modifier la définition d'un « Large Object »"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "modifier la définition d'une vue matérialisée"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "modifier la définition d'un opérateur"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "modifier la définition d'une classe d'opérateurs"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "modifier la définition d'une famille d'opérateur"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "modifier la définition d'une politique de sécurité au niveau ligne"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "modifier la définition d'une procédure"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "modifier la définition d'une publication"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "modifier un rôle"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "modifier la définition d'une routine"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "modifier la définition d'une règle"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "modifier la définition d'un schéma"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "modifier la définition d'un générateur de séquence"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "modifier la définition d'un serveur distant"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "modifier la définition d'un objet de statistiques étendues"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "modifier la définition d'une souscription"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "modifie un paramètre de configuration du serveur"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "modifier la définition d'une table"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "modifier la définition d'un tablespace"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "modifier la définition d'une configuration de la recherche de texte"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "modifier la définition d'un dictionnaire de la recherche de texte"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "modifier la définition d'un analyseur de la recherche de texte"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "modifier la définition d'un modèle de la recherche de texte"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "modifier la définition d'un trigger"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "modifier la définition d'un type"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "modifier la définition d'une correspondance d'utilisateur"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "modifier la définition d'une vue"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "acquérir des statistiques concernant la base de données"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "débuter un bloc de transaction"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "appeler une procédure"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "forcer un point de vérification des journaux de transactions"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "fermer un curseur"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "réorganiser (cluster) une table en fonction d'un index"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "définir ou modifier les commentaires d'un objet"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "valider la transaction en cours"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr ""
+"valider une transaction précédemment préparée pour une validation en deux\n"
+"phases"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "copier des données entre un fichier et une table"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "définir une nouvelle méthode d'accès"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "définir une nouvelle fonction d'agrégation"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "définir un nouveau transtypage"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "définir un nouveau collationnement"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "définir une nouvelle conversion d'encodage"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "créer une nouvelle base de données"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "définir un nouveau domaine"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "définir un nouveau trigger sur évènement"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "installer une extension"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "définir un nouveau wrapper de données distantes"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "définir une nouvelle table distante"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "définir une nouvelle fonction"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "définir un nouveau rôle"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "définir un nouvel index"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "définir un nouveau langage de procédures"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "définir une nouvelle vue matérialisée"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "définir un nouvel opérateur"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "définir une nouvelle classe d'opérateur"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "définir une nouvelle famille d'opérateur"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "définir une nouvelle politique de sécurité au niveau ligne pour une table"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "définir une nouvelle procédure"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "définir une nouvelle publication"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "définir une nouvelle règle de réécriture"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "définir un nouveau schéma"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "définir un nouveau générateur de séquence"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "définir un nouveau serveur distant"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "définir des statistiques étendues"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "définir une nouvelle souscription"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "définir une nouvelle table"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "définir une nouvelle table à partir des résultats d'une requête"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "définir un nouveau tablespace"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "définir une nouvelle configuration de la recherche de texte"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "définir un nouveau dictionnaire de la recherche de texte"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "définir un nouvel analyseur de la recherche de texte"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "définir un nouveau modèle de la recherche de texte"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "définir une nouvelle transformation"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "définir un nouveau trigger"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "définir un nouveau type de données"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "définit une nouvelle correspondance d'un utilisateur vers un serveur distant"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "définir une nouvelle vue"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "désallouer une instruction préparée"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "définir un curseur"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "supprimer des lignes d'une table"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "annuler l'état de la session"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "exécute un bloc de code anonyme"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "supprimer une méthode d'accès"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "supprimer une fonction d'agrégation"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "supprimer un transtypage"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "supprimer un collationnement"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "supprimer une conversion"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "supprimer une base de données"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "supprimer un domaine"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "supprimer un trigger sur évènement"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "supprimer une extension"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "supprimer un wrapper de données distantes"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "supprimer une table distante"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "supprimer une fonction"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "supprimer un rôle de la base de données"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "supprimer un index"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "supprimer un langage procédural"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "supprimer une vue matérialisée"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "supprimer un opérateur"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "supprimer une classe d'opérateur"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "supprimer une famille d'opérateur"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "supprimer les objets appartenant à un rôle"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "supprimer une politique de sécurité au niveau ligne pour une table"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "supprimer une procédure"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "supprimer une publication"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "supprimer une routine"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "supprimer une règle de réécriture"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "supprimer un schéma"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "supprimer une séquence"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "supprimer un descripteur de serveur distant"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "supprimer des statistiques étendues"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "supprimer une souscription"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "supprimer une table"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "supprimer un tablespace"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "supprimer une configuration de la recherche de texte"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "supprimer un dictionnaire de la recherche de texte"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "supprimer un analyseur de la recherche de texte"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "supprimer un modèle de la recherche de texte"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "supprimer une transformation"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "supprimer un trigger"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "supprimer un type de données"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "supprime une correspondance utilisateur pour un serveur distant"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "supprimer une vue"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "exécuter une instruction préparée"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "afficher le plan d'exécution d'une instruction"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "extraire certaines lignes d'une requête à l'aide d'un curseur"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "définir des privilèges d'accès"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "importer la définition d'une table à partir d'un serveur distant"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "créer de nouvelles lignes dans une table"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "se mettre à l'écoute d'une notification"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "charger un fichier de bibliothèque partagée"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "verrouiller une table"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "insère, modifie ou supprime des lignes d'une table de façon conditionnelle"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "positionner un curseur"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "engendrer une notification"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "préparer une instruction pour exécution"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "préparer la transaction en cours pour une validation en deux phases"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "changer le propriétaire des objets d'un rôle"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "remplacer le contenu d'une vue matérialisée"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "reconstruire des index"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "détruire un savepoint précédemment défini"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "réinitialiser un paramètre d'exécution à sa valeur par défaut"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "supprimer des privilèges d'accès"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr ""
+"annuler une transaction précédemment préparée pour une validation en deux\n"
+"phases"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "annuler jusqu'au point de retournement"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "définir un nouveau point de retournement pour la transaction en cours"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "définir ou modifier un label de sécurité à un objet"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "extraire des lignes d'une table ou d'une vue"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "modifier un paramètre d'exécution"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "définir le moment de la vérification des contraintes pour la transaction en cours"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "définir l'identifiant actuel de l'utilisateur de la session courante"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr ""
+"définir l'identifiant de l'utilisateur de session et l'identifiant actuel de\n"
+"l'utilisateur de la session courante"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "définir les caractéristiques de la transaction en cours"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "afficher la valeur d'un paramètre d'exécution"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "vider une table ou un ensemble de tables"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "arrêter l'écoute d'une notification"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "actualiser les lignes d'une table"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "compacter et optionnellement analyser une base de données"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "calculer un ensemble de lignes"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 peut seulement être utilisé dans un mode non interactif"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Saisissez « help » pour l'aide.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "n'a pas pu configurer le paramètre d'impression « %s »"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "option supplémentaire « %s » ignorée"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "n'a pas pu trouver son propre exécutable"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"la complétion de la requête a échoué : %s\n"
+"La requête était :\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valeur « %s » non reconnue pour « %s » : booléen attendu"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valeur « %s » invalide pour « %s » : entier attendu"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nom de variable « %s » invalide"
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valeur « %s » non reconnue pour « %s »\n"
+"Les valeurs disponibles sont : %s."
+
+#~ msgid " \"%s\""
+#~ msgstr " « %s »"
+
+#~ msgid " \"%s\" IN %s %s"
+#~ msgstr " \"%s\" DANS %s %s"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide, puis quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version, puis quitte\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " SERVER_VERSION_NAME server's version (short string)\n"
+#~ msgstr " SERVER_VERSION_NAME version du serveur (chaîne courte)\n"
+
+#~ msgid " VERSION psql's version (verbose string)\n"
+#~ msgstr " VERSION version de psql (chaîne verbeuse)\n"
+
+#~ msgid " VERSION_NAME psql's version (short string)\n"
+#~ msgstr " VERSION_NAME version de psql (chaîne courte)\n"
+
+#~ msgid " VERSION_NUM psql's version (numeric format)\n"
+#~ msgstr " VERSION_NUM version de psql (format numérique)\n"
+
+#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dFd [MODÈLE] affiche la liste des dictionnaires de la recherche\n"
+#~ " de texte (ajouter « + » pour plus de détails)\n"
+
+#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dFp [MODÈLE] affiche la liste des analyseurs de la recherche de\n"
+#~ " texte (ajouter « + » pour plus de détails)\n"
+
+#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dT [MODÈLE] affiche la liste des types de données (ajouter « + »\n"
+#~ " pour plus de détails)\n"
+
+#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\db [MODÈLE] affiche la liste des tablespaces (ajouter « + » pour\n"
+#~ " plus de détails)\n"
+
+#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\df [MODÈLE] affiche la liste des fonctions (ajouter « + » pour\n"
+#~ " plus de détails)\n"
+
+#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\dn [MODÈLE] affiche la liste des schémas (ajouter « + » pour\n"
+#~ " plus de détails)\n"
+
+#~ msgid ""
+#~ " \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n"
+#~ " list tables/indexes/sequences/views/system tables\n"
+#~ msgstr ""
+#~ " \\d{t|i|s|v|S} [MODÈLE] (ajouter « + » pour plus de détails)\n"
+#~ " affiche la liste des\n"
+#~ " tables/index/séquences/vues/tables système\n"
+
+#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+#~ msgstr ""
+#~ " \\g [FICHIER] ou ; envoie le tampon de requêtes au serveur (et les\n"
+#~ " résultats au fichier ou |tube)\n"
+
+#~ msgid " \\l list all databases (add \"+\" for more detail)\n"
+#~ msgstr ""
+#~ " \\l affiche la liste des bases de données (ajouter « + »\n"
+#~ " pour plus de détails)\n"
+
+#~ msgid " \\l[+] list all databases\n"
+#~ msgstr " \\l[+] affiche la liste des bases de données\n"
+
+#, c-format
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export OIDLOB FICHIER\n"
+#~ " \\lo_import FICHIER [COMMENTAIRE]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink OIDLOB opérations sur les « Large Objects »\n"
+
+#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n"
+#~ msgstr ""
+#~ " \\z [MODÈLE] affiche la liste des privilèges d'accès aux tables,\n"
+#~ " vues et séquences (identique à \\dp)\n"
+
+#~ msgid " as user \"%s\""
+#~ msgstr " comme utilisateur « %s »"
+
+#~ msgid " at port \"%s\""
+#~ msgstr " sur le port « %s »"
+
+#~ msgid " on host \"%s\""
+#~ msgstr " sur l'hôte « %s »"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s : %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s : n'a pas pu initialiser la variable « %s »\n"
+
+#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "%s : pg_strdup : ne peut pas dupliquer le pointeur null (erreur interne)\n"
+
+#~ msgid "(1 row)"
+#~ msgid_plural "(%lu rows)"
+#~ msgstr[0] "(1 ligne)"
+#~ msgstr[1] "(%lu lignes)"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Aucune ligne)\n"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "?%c? \"%s.%s\""
+#~ msgstr "?%c? « %s.%s »"
+
+#~ msgid "Access privileges for database \"%s\""
+#~ msgstr "Droits d'accès pour la base de données « %s »"
+
+#~ msgid "All connection parameters must be supplied because no database connection exists"
+#~ msgstr "Tous les paramètres de connexion doivent être fournis car il n'existe pas de connexion à une base de données"
+
+#~ msgid "Copy, Large Object\n"
+#~ msgstr "Copie, « Large Object »\n"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s"
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Triggers désactivés :"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Saisir le nouveau mot de passe : "
+
+#~ msgid "Exclusion constraints:"
+#~ msgstr "Contraintes d'exclusion :"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Commande \\%s invalide. Essayez \\? pour l'aide-mémoire.\n"
+
+#~ msgid "Modifier"
+#~ msgstr "Modificateur"
+
+#~ msgid "Modifiers"
+#~ msgstr "Modificateurs"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "Aucune relation correspondante trouvée.\n"
+
+#~ msgid "No matching settings found.\n"
+#~ msgstr "Aucun paramètre correspondant trouvé.\n"
+
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr "Pas de supprot des paramètres rôle par base de données pour la version de ce serveur.\n"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "Aucune relation trouvée.\n"
+
+#~ msgid "No settings found.\n"
+#~ msgstr "Aucun paramètre trouvé.\n"
+
+#~ msgid "Object Description"
+#~ msgstr "Description d'un objet"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Échec du chiffrement du mot de passe.\n"
+
+#~ msgid "Procedure"
+#~ msgstr "Procédure"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+#~ msgstr "Rapportez les bogues à <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "Connexion SSL (chiffrement inconnu)\n"
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Affichage de la sortie numérique adaptée à la locale."
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Affichage des tuples seuls."
+
+#~ msgid "Source code"
+#~ msgstr "Code source"
+
+#, c-format
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "Relation spéciale « %s.%s »"
+
+#, c-format
+#~ msgid "The server (version %s) does not support altering default privileges."
+#~ msgstr "Le serveur (version %s) ne supporte pas la modification des droits par défaut."
+
+#, c-format
+#~ msgid "The server (version %s) does not support collations."
+#~ msgstr "Le serveur (version %s) ne supporte pas les collationnements."
+
+#, c-format
+#~ msgid "The server (version %s) does not support editing function source."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'édition du code de la fonction."
+
+#, c-format
+#~ msgid "The server (version %s) does not support editing view definitions."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'édition des définitions de vue."
+
+#, c-format
+#~ msgid "The server (version %s) does not support foreign servers."
+#~ msgstr "Le serveur (version %s) ne supporte pas les serveurs distants."
+
+#, c-format
+#~ msgid "The server (version %s) does not support foreign tables."
+#~ msgstr "Le serveur (version %s) ne supporte pas les tables distantes."
+
+#, c-format
+#~ msgid "The server (version %s) does not support foreign-data wrappers."
+#~ msgstr "Le serveur (version %s) ne supporte pas les wrappers de données distantes."
+
+#, c-format
+#~ msgid "The server (version %s) does not support full text search."
+#~ msgstr "Le serveur (version %s) ne supporte pas la recherche plein texte."
+
+#, c-format
+#~ msgid "The server (version %s) does not support per-database role settings."
+#~ msgstr "Le serveur (version %s) ne supporte pas les paramètres de rôles par bases de données."
+
+#, c-format
+#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+#~ msgstr "Le serveur (version %s) ne supporte pas les points de sauvegarde pour ON_ERROR_ROLLBACK."
+
+#, c-format
+#~ msgid "The server (version %s) does not support showing function source."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage du code de la fonction."
+
+#, c-format
+#~ msgid "The server (version %s) does not support showing view definitions."
+#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage des définitions de vues."
+
+#, c-format
+#~ msgid "The server (version %s) does not support tablespaces."
+#~ msgstr "Le serveur (version %s) ne supporte pas les tablespaces."
+
+#, c-format
+#~ msgid "The server (version %s) does not support user mappings."
+#~ msgstr "Le serveur (version %s) ne supporte pas les correspondances d'utilisateurs."
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "WARNING: You are connected to a server with major version %d.%d,\n"
+#~ "but your %s client is major version %d.%d. Some backslash commands,\n"
+#~ "such as \\d, might not work properly.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ATTENTION : vous êtes connecté sur un serveur dont la version majeure est\n"
+#~ "%d.%d alors que votre client %s est en version majeure %d.%d. Certaines\n"
+#~ "commandes avec antislashs, comme \\d, peuvent ne pas fonctionner\n"
+#~ "correctement.\n"
+#~ "\n"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "Vérifier chaque %lds\t%s"
+
+#~ msgid ""
+#~ "Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bienvenue dans %s %s (serveur %s), l'interface interactive de PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Welcome to %s %s, the PostgreSQL interactive terminal.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bienvenue dans %s %s, l'interface interactive de PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "\\%s : erreur\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s : erreur lors de l'initialisation de la variable\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy : %s"
+
+#~ msgid "\\copy: unexpected response (%d)\n"
+#~ msgstr "\\copy : réponse inattendue (%d)\n"
+
+#, c-format
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch ne peut pas être utilisé avec COPY"
+
+#~ msgid "agg_name"
+#~ msgstr "nom_d_agrégat"
+
+#~ msgid "agg_type"
+#~ msgstr "type_aggrégat"
+
+#~ msgid "attribute"
+#~ msgstr "attribut"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "le processus fils a été terminé par le signal %d"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "le processus fils a été terminé par le signal %s"
+
+#~ msgid "collate %s"
+#~ msgstr "collationnement %s"
+
+#~ msgid "collation_name"
+#~ msgstr "nom_collation"
+
+#~ msgid "column"
+#~ msgstr "colonne"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "contient une gestion avancée de la ligne de commande"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "n'a pas pu accéder au répertoire « %s »"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %m"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s"
+
+#~ msgid "could not close pipe to external command: %s\n"
+#~ msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %s\n"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "n'a pas pu se connecter au serveur : %s"
+
+#~ msgid "could not execute command \"%s\": %s\n"
+#~ msgstr "n'a pas pu exécuter la commande « %s » : %s\n"
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "n'a pas pu obtenir le nom d'utilisateur courant : %s\n"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %m"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "n'a pas pu identifier le répertoire courant : %s"
+
+#~ msgid "could not open temporary file \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %s\n"
+
+#, c-format
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "n'a pas pu lire le binaire « %s »"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "n'a pas pu lire le lien symbolique « %s »"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %m"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "n'a pas pu initialiser la variable « %s »\n"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n"
+
+#~ msgid "data type"
+#~ msgstr "type de données"
+
+#~ msgid "default %s"
+#~ msgstr "Par défaut, %s"
+
+#~ msgid "define a new constraint trigger"
+#~ msgstr "définir une nouvelle contrainte de déclenchement"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#~ msgid "from_list"
+#~ msgstr "liste_from"
+
+#~ msgid "input_data_type"
+#~ msgstr "type_de_données_en_entrée"
+
+#, c-format
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "binaire « %s » invalide"
+
+#~ msgid "lock a named relation (table, etc)"
+#~ msgstr "verrouille une relation nommée (table, etc)"
+
+#~ msgid "match"
+#~ msgstr "match"
+
+#~ msgid "new_column"
+#~ msgstr "nouvelle_colonne"
+
+#~ msgid "normal"
+#~ msgstr "normal"
+
+#~ msgid "not null"
+#~ msgstr "non NULL"
+
+#~ msgid "pclose failed: %m"
+#~ msgstr "échec de pclose : %m"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "échec de pclose : %s"
+
+#~ msgid "rolename"
+#~ msgstr "nom_rôle"
+
+#~ msgid "serialtype"
+#~ msgstr "serialtype"
+
+#~ msgid "special"
+#~ msgstr "spécial"
+
+#~ msgid "statistic_type"
+#~ msgstr "type_statistique"
+
+#~ msgid "tablespace"
+#~ msgstr "tablespace"
+
+#~ msgid "text"
+#~ msgstr "texte"
+
+#~ msgid "timezone"
+#~ msgstr "fuseau_horaire"
+
+#, c-format
+#~ msgid "unexpected result status for \\watch"
+#~ msgstr "statut résultat inattendu pour \\watch"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "chaîne entre guillemets non terminée\n"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "où direction peut être vide ou faire partie de :"
diff --git a/src/bin/psql/po/he.po b/src/bin/psql/po/he.po
new file mode 100644
index 0000000..e59b58e
--- /dev/null
+++ b/src/bin/psql/po/he.po
@@ -0,0 +1,5800 @@
+# psql message translation file for psql
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldberg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-09 16:09+0300\n"
+"PO-Revision-Date: 2017-05-11 20:43+0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.1\n"
+"Last-Translator: Michael Goldberg <mic.goldberg@gmail.com>, 2017\n"
+"Language: he_IL\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "×œ× ×™×•×›×œ לזהות ×ת הספריה הנוכחית: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "בינ×רי ×œ× ×—×•×§×™ \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×‘×™× ×רי \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× \"%s\" לביצוע"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "×œ× ×œ×©× ×•×ª לשנות ספריות ל \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת הקישור הסימבולי \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose נכשל: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 command.c:608 input.c:227 mainloop.c:82
+#: mainloop.c:276
+#, c-format
+msgid "out of memory\n"
+msgstr "×ין זיכרון פנוי\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "×œ× × ×™×ª×Ÿ לשכפל מצביע ריק (שגי××” פנימית)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "×œ× ×™×›×•×œ לחפש יעיל ×ת המשתמש ×¢× ×ž×–×”×” % ld: %s"
+
+#: ../../common/username.c:45 command.c:555
+msgid "user does not exist"
+msgstr "משתמש ×œ× ×§×™×™×"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "כישלון בדיקה עבור ×©× ×”×ž×©×ª×ž×©: קוד שגי××” % lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "הפקודה ×œ× ×”×¤×¢×œ×”"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "הפקודה ×œ× × ×ž×¦××”"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי חריגה 0 0x %X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "תהליך צ××¦× ×”×•×¤×¡×§ על ידי ×”×ות %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "תהליך צ××¦× ×™×¦× ×¢× ×ž×¦×‘ ×œ× ×ž×–×•×”×” %d"
+
+#: ../../fe_utils/print.c:353
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(% lu שורה)"
+msgstr[1] "(% lu שורות)"
+
+#: ../../fe_utils/print.c:2913
+#, c-format
+msgid "Interrupted\n"
+msgstr "הופסק\n"
+
+#: ../../fe_utils/print.c:2977
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "×ין ×פשרות להוסיף כותרת לתוכן בטבלה: סה\"×› חריגה של %d העמודות.\n"
+
+#: ../../fe_utils/print.c:3017
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "×œ× × ×™×ª×Ÿ להוסיף ×ª× ×œ×ª×•×›×Ÿ בטבלה: סה\"×› חריגה של %d הת××™×.\n"
+
+#: ../../fe_utils/print.c:3266
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "תבנית הפלט ×œ× ×ª×™×§× ×™×ª (שגי××” פנימית): %d"
+
+#: ../../fe_utils/psqlscan.l:713
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\"\n"
+msgstr "דילוג על הרחבת רקורסיבית של משתנה \"%s\"\n"
+
+#: command.c:223
+#, c-format
+msgid "Invalid command \\%s. Try \\? for help.\n"
+msgstr "הפקודה ×œ× ×—×•×§×™×ª \\%s. נסה \\? לקבלת עזרה.\n"
+
+#: command.c:225
+#, c-format
+msgid "invalid command \\%s\n"
+msgstr "פקודה ×œ× ×—×•×§×™×ª \\%s\n"
+
+#: command.c:243
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored\n"
+msgstr "\\%s: התעלמות מה×רגומנט הנוסף \"%s\"\n"
+
+#: command.c:295
+#, c-format
+msgid ""
+"\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block\n"
+msgstr ""
+"\\%s התעלמות מהפקודה; להשתמש \\endif ×ו Ctrl-C כדי לצ×ת מבלוק \\if הנוכחי\n"
+
+#: command.c:553
+#, c-format
+msgid "could not get home directory for user ID %ld: %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לקבל ×ת ספריית הבית עבור משתמש ×¢× ×ž×–×”×” % ld: %s\n"
+
+#: command.c:571
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %s\n"
+msgstr "\\%s: ×œ× × ×™×ª×Ÿ לשנות ×ת ספריה ל\"%s\": %s\n"
+
+#: command.c:596 common.c:648 common.c:706 common.c:1242
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "×תה ×œ× ×ž×—×•×‘×¨ כרגע למסד נתוני×.\n"
+
+#: command.c:621
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"×תה מחובר מסד ×”× ×ª×•× ×™× '%s' כמשתמש '%s ' ב×מצעות שקע ב- \"%s\" בפורט \"%s\".\n"
+
+#: command.c:624
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port "
+"\"%s\".\n"
+msgstr "×תה מחובר מסד ×”× ×ª×•× ×™× '%s' כמשתמש \"%s\" בשרת \"%s\" בפורט \"%s\".\n"
+
+#: command.c:912 command.c:1002 command.c:1111 command.c:2520
+#, c-format
+msgid "no query buffer\n"
+msgstr "×ין מ×גר ש×ילתה\n"
+
+#: command.c:945 command.c:4757
+#, c-format
+msgid "invalid line number: %s\n"
+msgstr "מספר שורה ×œ× ×—×•×§×™: %s\n"
+
+#: command.c:995
+#, c-format
+msgid "The server (version %s) does not support editing function source.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בעריכת קוד מקור של הפונקציה.\n"
+
+#: command.c:1070 command.c:1151
+msgid "No changes"
+msgstr "×ין שינויי×"
+
+#: command.c:1104
+#, c-format
+msgid "The server (version %s) does not support editing view definitions.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בעריכת של הגדרות התצוגה.\n"
+
+#: command.c:1228
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found\n"
+msgstr "%s: ×©× ×”×§×™×“×•×“ ×œ× ×—×•×§×™ ×ו שגרת ההמרה ×œ× × ×ž×¦××”\n"
+
+#: command.c:1263 command.c:1885 command.c:3161 command.c:4859 common.c:173
+#: common.c:244 common.c:541 common.c:1288 common.c:1316 common.c:1417
+#: copy.c:489 copy.c:699 large_obj.c:156 large_obj.c:191 large_obj.c:253
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1267
+msgid "out of memory"
+msgstr "×ין זיכרון פנוי"
+
+#: command.c:1270
+msgid "There is no previous error."
+msgstr "×ין שגי××” קודמת."
+
+#: command.c:1441 command.c:1746 command.c:1760 command.c:1777 command.c:1937
+#: command.c:2174 command.c:2487 command.c:2527
+#, c-format
+msgid "\\%s: missing required argument\n"
+msgstr "\\%s: חסר ×רגומנט נדרש\n"
+
+#: command.c:1572
+#, c-format
+msgid "\\elif: cannot occur after \\else\n"
+msgstr "\\elif: ×œ× ×™×›×•×œ×” להתרחש ל×חר \\else\n"
+
+#: command.c:1577
+#, c-format
+msgid "\\elif: no matching \\if\n"
+msgstr "\\elif: \\if ×œ× ×ª×•×מות\n"
+
+#: command.c:1641
+#, c-format
+msgid "\\else: cannot occur after \\else\n"
+msgstr "\\else: ×œ× ×™×›×•×œ×” להתרחש ל×חר \\else\n"
+
+#: command.c:1646
+#, c-format
+msgid "\\else: no matching \\if\n"
+msgstr "\\else: \\if ×œ× ×ª×•×מות\n"
+
+#: command.c:1686
+#, c-format
+msgid "\\endif: no matching \\if\n"
+msgstr "\\endif: \\if ×œ× ×ª×•×מות\n"
+
+#: command.c:1841
+msgid "Query buffer is empty."
+msgstr "מ×גר הש×ילתה ריק."
+
+#: command.c:1863
+msgid "Enter new password: "
+msgstr "הזן סיסמה חדשה: "
+
+#: command.c:1864
+msgid "Enter it again: "
+msgstr "הזן שוב: "
+
+#: command.c:1868
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "סיסמ×ות ×ינן תו×מות.\n"
+
+#: command.c:1967
+#, c-format
+msgid "\\%s: could not read value for variable\n"
+msgstr "\\%s: ×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ת ערך המשתנה\n"
+
+#: command.c:2070
+msgid "Query buffer reset (cleared)."
+msgstr "מ×גר הש×ילתה ××•×¤× (נוקה)."
+
+#: command.c:2092
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "כתב היסטוריה לקובץ \"%s\".\n"
+
+#: command.c:2179
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\"\n"
+msgstr "\\%s: ×©× ×ž×©×ª× ×” סביבה ×ינו יכול להכיל \"=\"\n"
+
+#: command.c:2235
+#, c-format
+msgid "The server (version %s) does not support showing function source.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בתצוגת קוד מקור של הפונקציה.\n"
+
+#: command.c:2242
+#, c-format
+msgid "function name is required\n"
+msgstr "×©× ×”×¤×•× ×§×¦×™×” נדרש\n"
+
+#: command.c:2329
+#, c-format
+msgid "The server (version %s) does not support showing view definitions.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בתצוגה של הגדרות התצוגה.\n"
+
+#: command.c:2336
+#, c-format
+msgid "view name is required\n"
+msgstr "×©× ×ª×¦×•×’×” נדרש\n"
+
+#: command.c:2459
+msgid "Timing is on."
+msgstr "התזמון הופעל."
+
+#: command.c:2461
+msgid "Timing is off."
+msgstr "התזמון הופסק."
+
+#: command.c:2546 command.c:2574 command.c:3510 command.c:3513 command.c:3516
+#: command.c:3522 command.c:3524 command.c:3532 command.c:3542 command.c:3551
+#: command.c:3565 command.c:3582 command.c:3640 common.c:69 copy.c:332
+#: copy.c:392 copy.c:405 psqlscanslash.l:760 psqlscanslash.l:771
+#: psqlscanslash.l:781
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#: command.c:2953 startup.c:202
+msgid "Password: "
+msgstr "סיסמה: "
+
+#: command.c:2958 startup.c:204
+#, c-format
+msgid "Password for user %s: "
+msgstr "הסיסמה עבור המשתמש %s: "
+
+#: command.c:3008
+#, c-format
+msgid ""
+"All connection parameters must be supplied because no database connection "
+"exists\n"
+msgstr "יש לספק ×ת כל פרמטרי החיבור ×›×™ ×ין חיבור מסד × ×ª×•× ×™× ×§×™×™×\n"
+
+#: command.c:3165
+#, c-format
+msgid "Previous connection kept\n"
+msgstr "החיבור ×”×§×•×“× × ×©×ž×¨\n"
+
+#: command.c:3169
+#, c-format
+msgid "\\connect: %s"
+msgstr "התחבר ל %s"
+
+#: command.c:3205
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" "
+"at port \"%s\".\n"
+msgstr ""
+"×תה מחובר כעת למסד ×”× ×ª×•× ×™× '%s' כמשתמש '%s ' ב×מצעות שקע ב- \"%s\" בפורט \"%s"
+"\".\n"
+
+#: command.c:3208
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"×תה מחובר כעת למסד ×”× ×ª×•× ×™× '%s' כמשתמש \"%s\" בשרת \"%s\" בפורט \"%s\".\n"
+
+#: command.c:3212
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "×תה מחובר כעת למסד ×”× ×ª×•× ×™× '%s' משתמש '%s'.\n"
+
+#: command.c:3245
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, השרת %s)\n"
+
+#: command.c:3253
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"×זהרה: %s גירסה ר×שית %s, גירסה ר×שית בשרת %s.\n"
+" כמה תכונות psql ××œ×•×œ×™× ×œ× ×œ×¢×‘×•×“.\n"
+
+#: command.c:3290
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "חיבור SSL (פרוטוקול: %s, צופן: %s, סיביות: %s, דחיסה: %s)\n"
+
+#: command.c:3291 command.c:3292 command.c:3293
+msgid "unknown"
+msgstr "×œ× ×™×“×•×¢"
+
+#: command.c:3294 help.c:45
+msgid "off"
+msgstr "כבוי"
+
+#: command.c:3294 help.c:45
+msgid "on"
+msgstr "פעיל"
+
+#: command.c:3314
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"×זהרה: קידוד המסוף (%u) שונה מקידוד ב Windows \n"
+" (%u) 8-bit ×ª×•×•×™× ×œ× ×™×¤×¢×œ×• כהלכה. ר××” דף הסבר psql\n"
+" \"הערות עבור משתמשי חלונות\" לקבלת פרטי×.\n"
+
+#: command.c:3399
+#, c-format
+msgid ""
+"environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a "
+"line number\n"
+msgstr ""
+"משתנה הסביבה PSQL_EDITOR_LINENUMBER_ARG חייב להיות מוגדר על מנת לציין מספר "
+"שורה\n"
+
+#: command.c:3428
+#, c-format
+msgid "could not start editor \"%s\"\n"
+msgstr "×œ× × ×™×ª×Ÿ להפעיל ×ת עורך \"%s\"\n"
+
+#: command.c:3430
+#, c-format
+msgid "could not start /bin/sh\n"
+msgstr "×œ× × ×™×ª×Ÿ להפעיל ×ת /bin/sh\n"
+
+#: command.c:3468
+#, c-format
+msgid "could not locate temporary directory: %s\n"
+msgstr "×œ× × ×™×ª×Ÿ ל×תר ×ת הספריה הזמנית: %s\n"
+
+#: command.c:3495
+#, c-format
+msgid "could not open temporary file \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ת הקובץ הזמני \"%s\": %s\n"
+
+#: command.c:3769
+#, c-format
+msgid ""
+"\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, "
+"latex, latex-longtable, troff-ms\n"
+msgstr ""
+"\\pset: תבניות מותרות הן unaligned, aligned, wrapped, html, asciidoc, "
+"latex, latex-longtable, troff-ms\n"
+
+#: command.c:3787
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n"
+msgstr "\\pset: סגנונות מותרות הן ascii, old-ascii, unicode\n"
+
+#: command.c:3802
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double\n"
+msgstr "\\pset: סגנונות קו גבול Unicode מותרות ×”× single, double\n"
+
+#: command.c:3817
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double\n"
+msgstr "\\pset: סגנונות של העמודה Unicode מותרות ×”× single, double\n"
+
+#: command.c:3832
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double\n"
+msgstr "\\pset: מותר סגנונות שורה עליונה Unicode מותרות ×”× single, double\n"
+
+#: command.c:3997 command.c:4176
+#, c-format
+msgid "\\pset: unknown option: %s\n"
+msgstr "\\pset: ×פשרות ×œ× ×™×“×•×¢×”: %s\n"
+
+#: command.c:4015
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "סגנון הגבול הינו %d.\n"
+
+#: command.c:4021
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "רוחב היעד ×œ× ×”×•×’×“×¨.\n"
+
+#: command.c:4023
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "רוחב היעד ×”×•× %d.\n"
+
+#: command.c:4030
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "תצוגה מורחבת מופעלת.\n"
+
+#: command.c:4032
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "תצוגה מורחבת מופעלת ב×ופן ×וטומטי.\n"
+
+#: command.c:4034
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "תצוגה מורחבת כבויה.\n"
+
+#: command.c:4041 command.c:4049
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "מפריד השדות ×”×•× ×פס בתי×.\n"
+
+#: command.c:4043
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "מפריד השדות ×”×•× \"%s\".\n"
+
+#: command.c:4056
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "כותרת תחתונה של ברירת המחדל מופעלת.\n"
+
+#: command.c:4058
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "כותרת תחתונה של ברירת המחדל כבויה.\n"
+
+#: command.c:4064
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "תבנית הפלט ×”×•× %s.\n"
+
+#: command.c:4070
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "סגנון הקו ×”×•× %s.\n"
+
+#: command.c:4077
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "תצוגת Null ×”×™× \"%s\".\n"
+
+#: command.c:4085
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "הפלט המספרי המות×× ×œ×¤×™ ×זור מופעל.\n"
+
+#: command.c:4087
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "הפלט המספרי המות×× ×œ×¤×™ ×זור כבוי.\n"
+
+#: command.c:4094
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "זימונית בשימוש עבור הפלט ×רוך.\n"
+
+#: command.c:4096
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "זימונית בשימוש תמיד.\n"
+
+#: command.c:4098
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "השימוש בזימונית כבוי.\n"
+
+#: command.c:4104
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "זימונית ×œ× ×ª×”×™×” בשימוש עבור פחות מ- %d שורה.\n"
+msgstr[1] "זימונית ×œ× ×ª×”×™×” בשימוש עבור פחות מ- %d שורות.\n"
+
+#: command.c:4114 command.c:4124
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "מפריד רשומות ×”×•× ×פס בתי×.\n"
+
+#: command.c:4116
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "מפריד רשומות ×”×™× <שורה חדשה>.\n"
+
+#: command.c:4118
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "מפריד רשומות ×”×™× \"%s\".\n"
+
+#: command.c:4131
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "תכונות הטבלה ×”× \"%s\".\n"
+
+#: command.c:4134
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "תכונות הטבלה ×œ× ×”×•×’×“×¨×•.\n"
+
+#: command.c:4141
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "הכותרת ×”×™× \"%s\".\n"
+
+#: command.c:4143
+#, c-format
+msgid "Title is unset.\n"
+msgstr "כותרת ×œ× ×”×•×’×“×¨×”.\n"
+
+#: command.c:4150
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "רק tuples הופעל.\n"
+
+#: command.c:4152
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "רק tuples כבוי.\n"
+
+#: command.c:4158
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "סגנון קו הגבול Unicode ×”×•× \"%s\".\n"
+
+#: command.c:4164
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "סגנון קו עמודה Unicode ×”×•× \"%s\".\n"
+
+#: command.c:4170
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "סגנון קו כותרת Unicode ×”×•× \"%s\".\n"
+
+#: command.c:4330
+#, c-format
+msgid "\\!: failed\n"
+msgstr "\\!: נכשל\n"
+
+#: command.c:4355 common.c:754
+#, c-format
+msgid "\\watch cannot be used with an empty query\n"
+msgstr "×œ× × ×™×ª×Ÿ להשתמש ב \\watch ×¢× ×©×ילתה ריקה\n"
+
+#: command.c:4396
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s )כל %gs(\n"
+
+#: command.c:4399
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (כל %gs)\n"
+
+#: command.c:4453 command.c:4460 common.c:654 common.c:661 common.c:1271
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"*********ש×ילתה*********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:4652
+#, c-format
+msgid "\"%s.%s\" is not a view\n"
+msgstr "\"%s.%s\" ××™× ×” תצוגה\n"
+
+#: command.c:4668
+#, c-format
+msgid "could not parse reloptions array\n"
+msgstr "×œ× ×”×™×ª×” ×פשרות לנתח ×ת מערך reloptions\n"
+
+#: common.c:158
+#, c-format
+msgid "cannot escape without active connection\n"
+msgstr "×œ× ×ž×¡×•×’×œ לברוח בלי חיבור פעיל\n"
+
+#: common.c:199
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\"\n"
+msgstr "×רגומנט הפקודה shell מכיל שורה חדשה ×ו גררה: \"%s\"\n"
+
+#: common.c:415
+#, c-format
+msgid "connection to server was lost\n"
+msgstr "חיבור לשרת ×בד\n"
+
+#: common.c:419
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "החיבור לשרת ×בד. ניסיון ל×פס: "
+
+#: common.c:424
+#, c-format
+msgid "Failed.\n"
+msgstr "נכשל.\n"
+
+#: common.c:431
+#, c-format
+msgid "Succeeded.\n"
+msgstr "הצליח.\n"
+
+#: common.c:531 common.c:1034 common.c:1206
+#, c-format
+msgid "unexpected PQresultStatus: %d\n"
+msgstr "×œ× ×¦×¤×•×™ PQresultStatus : %d\n"
+
+#: common.c:593
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "זמן: %.3f ms\n"
+
+#: common.c:608
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "זמן: %.3f ms (% 02d:%06.3f)\n"
+
+#: common.c:617
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "זמן: %.3f ms (% 02d:%02d:%06.3f)\n"
+
+#: common.c:624
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "זמן:%.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:761
+#, c-format
+msgid "\\watch cannot be used with COPY\n"
+msgstr "×œ× × ×™×ª×Ÿ להשתמש \\watch ×¢× COPY\n"
+
+#: common.c:766
+#, c-format
+msgid "unexpected result status for \\watch\n"
+msgstr "מצב התוצ××” ×œ× ×¦×¤×•×™ עבור \\watch\n"
+
+#: common.c:795
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" with payload \"%s\" received from server "
+"process with PID %d.\n"
+msgstr "הודעה ×סינכרונית \"%s\" ×¢× ×”×ž×˜×¢×Ÿ \"%s\" התקבלה מתהליך שרת ×¢× PID %d.\n"
+
+#: common.c:798
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "הודעה ×סינכרונית \"%s\" התקבלה מתהליך שרת ×¢× PID %d.\n"
+
+#: common.c:860
+#, c-format
+msgid "no rows returned for \\gset\n"
+msgstr "×ין השורות המוחזרות עבור \\gset\n"
+
+#: common.c:865
+#, c-format
+msgid "more than one row returned for \\gset\n"
+msgstr "יותר משורה ×חת מוחזרת עבור \\gset\n"
+
+#: common.c:1251
+#, c-format
+msgid ""
+"***(Single step mode: verify "
+"command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to "
+"cancel)********************\n"
+msgstr ""
+"***(מצב צעד יחיד: ×•×“× ×”×¤×§×•×“×”)*******************************************\n"
+"%s\n"
+" ***(לחץ על כדי לחזור ×ו הזן X ולחזור לביטול)********************\n"
+
+#: common.c:1306
+#, c-format
+msgid ""
+"The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n"
+msgstr "השרת (גירסה %s) ×œ× ×ª×•×ž×š ב savepoints עבור ON_ERROR_ROLLBACK.\n"
+
+#: common.c:1362
+#, c-format
+msgid "STATEMENT: %s\n"
+msgstr "משפט: %s\n"
+
+#: common.c:1405
+#, c-format
+msgid "unexpected transaction status (%d)\n"
+msgstr "מצב טרנזקציה ×œ× ×¦×¤×•×™ (%d)\n"
+
+#: copy.c:99
+#, c-format
+msgid "\\copy: arguments required\n"
+msgstr "\\copy: ×”××¨×’×•×ž× ×˜×™× ×”×“×¨×•×©×™×\n"
+
+#: copy.c:254
+#, c-format
+msgid "\\copy: parse error at \"%s\"\n"
+msgstr "\\copy: ניתוח שגי××” ב- \"%s\"\n"
+
+#: copy.c:256
+#, c-format
+msgid "\\copy: parse error at end of line\n"
+msgstr "\\copy: ניתוח שגי××” בסוף שורה\n"
+
+#: copy.c:329
+#, c-format
+msgid "could not execute command \"%s\": %s\n"
+msgstr "×œ× ×”×™×” ניתן לבצע ×ת הפקודה \"%s\": %s\n"
+
+#: copy.c:345
+#, c-format
+msgid "could not stat file \"%s\": %s\n"
+msgstr "×œ× ×”×™×” ניתן stat קובץ \"%s\": %s\n"
+
+#: copy.c:349
+#, c-format
+msgid "%s: cannot copy from/to a directory\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ להעתיק ×ת מ/×ל ספריה\n"
+
+#: copy.c:386
+#, c-format
+msgid "could not close pipe to external command: %s\n"
+msgstr "×œ× ×™×›×•×œ לסגור ×ת צינור לפקודה חיצוניי×: %s\n"
+
+#: copy.c:452 copy.c:463
+#, c-format
+msgid "could not write COPY data: %s\n"
+msgstr "×œ× ×™×•×›×œ×• לכתוב ×ת COPY נתוני×: %s\n"
+
+#: copy.c:470
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "העברת × ×ª×•× ×™× COPY נכשלה: %s"
+
+#: copy.c:531
+msgid "canceled by user"
+msgstr "בוטלה על-ידי המשתמש"
+
+#: copy.c:542
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself."
+msgstr ""
+"להזין × ×ª×•× ×™× ×¢×œ מנת ×œ×”×¢×ª×™×§× ×•×חר כך שורה חדשה.\n"
+"×œ×¡×™×™× ×¢× ×§×• נטוי הפוך, ונקודה בשורה עצמה."
+
+#: copy.c:671
+msgid "aborted because of read failure"
+msgstr "בוטלו עקב כשל קרי××”"
+
+#: copy.c:695
+msgid "trying to exit copy mode"
+msgstr "מנסה לצ×ת ממצב עותק"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set\n"
+msgstr "\\crosstabview: משפט ×œ× ×”×—×–×™×¨ סט התוצ××”\n"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns\n"
+msgstr "\\crosstabview: הש×ילתה חייבת להחזיר לפחות שלוש עמודות\n"
+
+#: crosstabview.c:156
+#, c-format
+msgid ""
+"\\crosstabview: vertical and horizontal headers must be different columns\n"
+msgstr "\\crosstabview: כותרות ×ופקיות ו×נכיות חייבות להיות עמודות שונות\n"
+
+#: crosstabview.c:172
+#, c-format
+msgid ""
+"\\crosstabview: data column must be specified when query returns more than "
+"three columns\n"
+msgstr ""
+"\\crosstabview: יש לציין עמודת ×”× ×ª×•× ×™× ×›×שר הש×ילתה מחזירה יותר משלוש "
+"עמודות\n"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded\n"
+msgstr "\\crosstabview: חריגה במספר מרבי של עמודות (%d)\n"
+
+#: crosstabview.c:397
+#, c-format
+msgid ""
+"\\crosstabview: query result contains multiple data values for row \"%s\", "
+"column \"%s\"\n"
+msgstr ""
+"\\crosstabview: התוצ×ות הש×ילתה מכילות ×¢×¨×›×™× × ×ª×•× ×™× ×ž×¨×•×‘×™× ×¢×‘×•×¨ שורה \"%s\", "
+"עמודה \"%s\"\n"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d\n"
+msgstr "\\crosstabview: מספר העמודה %d × ×ž×¦× ×ž×—×•×¥ לטווח 1..%d\n"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\"\n"
+msgstr "\\crosstabview: ×©× ×”×¢×ž×•×“×” רב-משמעי: \"%s\"\n"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\"\n"
+msgstr "\\crosstabview: ×©× ×¢×ž×•×“×” ×œ× × ×ž×¦×: \"%s\"\n"
+
+#: describe.c:73 describe.c:342 describe.c:599 describe.c:730 describe.c:874
+#: describe.c:1035 describe.c:1107 describe.c:3305 describe.c:3511
+#: describe.c:3602 describe.c:3850 describe.c:3995 describe.c:4227
+#: describe.c:4302 describe.c:4313 describe.c:4375 describe.c:4795
+#: describe.c:4878
+msgid "Schema"
+msgstr "סכמה"
+
+#: describe.c:74 describe.c:162 describe.c:228 describe.c:236 describe.c:343
+#: describe.c:600 describe.c:731 describe.c:792 describe.c:875 describe.c:1108
+#: describe.c:3306 describe.c:3434 describe.c:3512 describe.c:3603
+#: describe.c:3682 describe.c:3851 describe.c:3920 describe.c:3996
+#: describe.c:4228 describe.c:4303 describe.c:4314 describe.c:4376
+#: describe.c:4568 describe.c:4652 describe.c:4876 describe.c:5043
+#: describe.c:5232
+msgid "Name"
+msgstr "ש×"
+
+#: describe.c:75 describe.c:355 describe.c:401 describe.c:418
+msgid "Result data type"
+msgstr "טיפוס × ×ª×•× ×™× ×©×œ תוצ××”"
+
+#: describe.c:83 describe.c:96 describe.c:100 describe.c:356 describe.c:402
+#: describe.c:419
+msgid "Argument data types"
+msgstr "טיפוס ×”× ×ª×•× ×™× ×©×œ ×”×רגומנט"
+
+#: describe.c:107 describe.c:172 describe.c:259 describe.c:464 describe.c:648
+#: describe.c:746 describe.c:817 describe.c:1110 describe.c:1746
+#: describe.c:3105 describe.c:3340 describe.c:3465 describe.c:3539
+#: describe.c:3612 describe.c:3695 describe.c:3763 describe.c:3863
+#: describe.c:3929 describe.c:3997 describe.c:4133 describe.c:4173
+#: describe.c:4244 describe.c:4306 describe.c:4315 describe.c:4377
+#: describe.c:4594 describe.c:4674 describe.c:4809 describe.c:4879
+#: large_obj.c:289 large_obj.c:299
+msgid "Description"
+msgstr "תי×ור‪"
+
+#: describe.c:125
+msgid "List of aggregate functions"
+msgstr "רשימת פונקציות הצבירה"
+
+#: describe.c:149
+#, c-format
+msgid "The server (version %s) does not support access methods.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בשיטות גישה.\n"
+
+#: describe.c:163
+msgid "Index"
+msgstr "×ינדקס"
+
+#: describe.c:164 describe.c:362 describe.c:407 describe.c:424 describe.c:882
+#: describe.c:1046 describe.c:1706 describe.c:3315 describe.c:3513
+#: describe.c:4671
+msgid "Type"
+msgstr "סוג"
+
+#: describe.c:171 describe.c:4573
+msgid "Handler"
+msgstr "הנדלר"
+
+#: describe.c:190
+msgid "List of access methods"
+msgstr "רשימת שיטות גישה"
+
+#: describe.c:215
+#, c-format
+msgid "The server (version %s) does not support tablespaces.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך במרחבי טבל×ות.\n"
+
+#: describe.c:229 describe.c:237 describe.c:452 describe.c:638 describe.c:793
+#: describe.c:1034 describe.c:3316 describe.c:3438 describe.c:3684
+#: describe.c:3921 describe.c:4569 describe.c:4653 describe.c:5044
+#: describe.c:5233 large_obj.c:288
+msgid "Owner"
+msgstr "בעלי×"
+
+#: describe.c:230 describe.c:238
+msgid "Location"
+msgstr "מיקו×"
+
+#: describe.c:249 describe.c:2920
+msgid "Options"
+msgstr "×פשריות"
+
+#: describe.c:254 describe.c:611 describe.c:809 describe.c:3332 describe.c:3336
+msgid "Size"
+msgstr "גודל"
+
+#: describe.c:276
+msgid "List of tablespaces"
+msgstr "רשימת מרחבי טבל×ות"
+
+#: describe.c:316
+#, c-format
+msgid "\\df only takes [antwS+] as options\n"
+msgstr "\\df לוקח רק [antwS +] ×›×פשרויות\n"
+
+#: describe.c:324
+#, c-format
+msgid "\\df does not take a \"w\" option with server version %s\n"
+msgstr "\\df ×œ× ×œ×•×§×— ×ופציה \"w\" ×¢× ×’×™×¨×¡×ª השרת %s\n"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:358 describe.c:404 describe.c:421
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:359
+msgid "window"
+msgstr "חלון"
+
+#: describe.c:360 describe.c:405 describe.c:422 describe.c:1244
+msgid "trigger"
+msgstr "הדק"
+
+#: describe.c:361 describe.c:406 describe.c:423
+msgid "normal"
+msgstr "תקין"
+
+#: describe.c:434
+msgid "immutable"
+msgstr "בלתי ניתן לשינוי"
+
+#: describe.c:435
+msgid "stable"
+msgstr "יציב"
+
+#: describe.c:436
+msgid "volatile"
+msgstr "נדיף"
+
+#: describe.c:437
+msgid "Volatility"
+msgstr "תנודתיות"
+
+#: describe.c:445
+msgid "restricted"
+msgstr "מוגבל"
+
+#: describe.c:446
+msgid "safe"
+msgstr "בטוח"
+
+#: describe.c:447
+msgid "unsafe"
+msgstr "×œ× ×‘×˜×•×—"
+
+#: describe.c:448
+msgid "Parallel"
+msgstr "מקבילי"
+
+#: describe.c:453
+msgid "definer"
+msgstr "מגדיר"
+
+#: describe.c:454
+msgid "invoker"
+msgstr "מפעיל"
+
+#: describe.c:455
+msgid "Security"
+msgstr "×בטחה"
+
+#: describe.c:462
+msgid "Language"
+msgstr "ספה"
+
+#: describe.c:463
+msgid "Source code"
+msgstr "קוד מקור"
+
+#: describe.c:562
+msgid "List of functions"
+msgstr "רשימת פונקציות"
+
+#: describe.c:610
+msgid "Internal name"
+msgstr "×©× ×¤× ×™×ž×™"
+
+#: describe.c:632
+msgid "Elements"
+msgstr "×למנטי×"
+
+#: describe.c:689
+msgid "List of data types"
+msgstr "רשימת סוגי הנתוני×"
+
+#: describe.c:732
+msgid "Left arg type"
+msgstr "סוג ×רגומנט השמ×לי"
+
+#: describe.c:733
+msgid "Right arg type"
+msgstr "סוג ×רגומנט ימני"
+
+#: describe.c:734
+msgid "Result type"
+msgstr "טיפוס × ×ª×•× ×™× ×©×œ תוצ××”"
+
+#: describe.c:739 describe.c:3754 describe.c:4132
+msgid "Function"
+msgstr "פונקציה"
+
+#: describe.c:764
+msgid "List of operators"
+msgstr "רשימת מפעילי×"
+
+#: describe.c:794
+msgid "Encoding"
+msgstr "קידוד"
+
+#: describe.c:799 describe.c:3852
+msgid "Collate"
+msgstr "סדר ×לפביתי"
+
+#: describe.c:800 describe.c:3853
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:813
+msgid "Tablespace"
+msgstr "מרחב טבל×ות"
+
+#: describe.c:835
+msgid "List of databases"
+msgstr "רשימת מ×גרי מידע"
+
+#: describe.c:876 describe.c:881 describe.c:1037 describe.c:3307
+#: describe.c:3314
+msgid "table"
+msgstr "טבלה"
+
+#: describe.c:877 describe.c:3308
+msgid "view"
+msgstr "תצוגה"
+
+#: describe.c:878 describe.c:3309
+msgid "materialized view"
+msgstr "תצוגה ממומשת"
+
+#: describe.c:879 describe.c:1039 describe.c:3311
+msgid "sequence"
+msgstr "סדרה"
+
+#: describe.c:880 describe.c:3313
+msgid "foreign table"
+msgstr "טבלה זרה"
+
+#: describe.c:893
+msgid "Column privileges"
+msgstr "הרש×ות על עמודות"
+
+#: describe.c:924 describe.c:958
+msgid "Policies"
+msgstr "מדיניות"
+
+#: describe.c:990 describe.c:5289 describe.c:5293
+msgid "Access privileges"
+msgstr "הרש×ות גישה"
+
+#: describe.c:1021
+#, c-format
+msgid "The server (version %s) does not support altering default privileges.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בשינוי של הרש×ות ברירת מחדל.\n"
+
+#: describe.c:1041
+msgid "function"
+msgstr "פונקציה"
+
+#: describe.c:1043
+msgid "type"
+msgstr "סוג"
+
+#: describe.c:1045
+msgid "schema"
+msgstr "סכמה"
+
+#: describe.c:1069
+msgid "Default access privileges"
+msgstr "הרש×ות גישה ברירת מחדל"
+
+#: describe.c:1109
+msgid "Object"
+msgstr "×ובייקט"
+
+#: describe.c:1123
+msgid "table constraint"
+msgstr "×ילוץ טבל××™"
+
+#: describe.c:1145
+msgid "domain constraint"
+msgstr "×ילוץ התחו×"
+
+#: describe.c:1173
+msgid "operator class"
+msgstr "מחלקת המפעיל"
+
+#: describe.c:1202
+msgid "operator family"
+msgstr "משפחת המפעיל"
+
+#: describe.c:1224
+msgid "rule"
+msgstr "כלל"
+
+#: describe.c:1266
+msgid "Object descriptions"
+msgstr "תי××•×¨×™× ×©×œ ×ובייקט"
+
+#: describe.c:1320
+#, c-format
+msgid "Did not find any relation named \"%s\".\n"
+msgstr "×œ× ×ž×¦× ×›×œ קשר ×‘×©× \"%s\".\n"
+
+#: describe.c:1529
+#, c-format
+msgid "Did not find any relation with OID %s.\n"
+msgstr "×œ× ×ž×¦× ×›×œ קשר ×¢× OID %s.\n"
+
+#: describe.c:1642 describe.c:1691
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "טבלה ×œ× ×‘×ž×¢×§×‘ \"%s.%s\""
+
+#: describe.c:1645 describe.c:1694
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "טבלה \"%s.%s\""
+
+#: describe.c:1649
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "תצוגה \"%s.%s\""
+
+#: describe.c:1654
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "תצוג ממומשת ×œ× ×‘×ž×¢×§×‘ \"%s.%s\""
+
+#: describe.c:1657
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "תצוגה ממומשת \"%s.%s\""
+
+#: describe.c:1661
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "רצף \"%s.%s\""
+
+#: describe.c:1666
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "×ינדקס ×œ× ×‘×ž×¢×§×‘ \"%s.%s\""
+
+#: describe.c:1669
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "×ינדקס \"%s.%s\""
+
+#: describe.c:1674
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "קשר מיוחד \"%s.%s\""
+
+#: describe.c:1678
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "בטבלת TOAST \"%s.%s\""
+
+#: describe.c:1682
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "סוג מורכב \"%s.%s\""
+
+#: describe.c:1686
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "טבלה זרה \"%s.%s\""
+
+#: describe.c:1705
+msgid "Column"
+msgstr "עמודה"
+
+#: describe.c:1716 describe.c:3519
+msgid "Collation"
+msgstr "סדר ×לפביתי"
+
+#: describe.c:1717 describe.c:3526
+msgid "Nullable"
+msgstr "ערך null"
+
+#: describe.c:1718 describe.c:3527
+msgid "Default"
+msgstr "ברירת מחדל"
+
+#: describe.c:1723
+msgid "Value"
+msgstr "ערך"
+
+#: describe.c:1726
+msgid "Definition"
+msgstr "הגדרה"
+
+#: describe.c:1729 describe.c:4589 describe.c:4673 describe.c:4744
+#: describe.c:4808
+msgid "FDW Options"
+msgstr "×פשריות FDW"
+
+#: describe.c:1733
+msgid "Storage"
+msgstr "×חסון"
+
+#: describe.c:1738
+msgid "Stats target"
+msgstr "סטטיסטיקה היעד"
+
+#: describe.c:1876
+#, c-format
+msgid "Partition of: %s %s"
+msgstr "חלוקת: %s %s"
+
+#: describe.c:1897
+#, c-format
+msgid "Partition key: %s"
+msgstr "מחיצה מפתח: %s"
+
+#: describe.c:1965
+msgid "primary key, "
+msgstr "מפתח ר×שי, "
+
+#: describe.c:1967
+msgid "unique, "
+msgstr "ייחודי, "
+
+#: describe.c:1973
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "לטבלה \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", הפרדיק×ט (%s)"
+
+#: describe.c:1980
+msgid ", clustered"
+msgstr ", מקובץ"
+
+#: describe.c:1983
+msgid ", invalid"
+msgstr ", ×œ× ×ª×§×™×Ÿ"
+
+#: describe.c:1986
+msgid ", deferrable"
+msgstr ", נדחה"
+
+#: describe.c:1989
+msgid ", initially deferred"
+msgstr ", נדחה תחילה"
+
+#: describe.c:1992
+msgid ", replica identity"
+msgstr ", זהות משוכפלת"
+
+#: describe.c:2031
+#, c-format
+msgid "Owned by: %s"
+msgstr "בבעלות של: %s"
+
+#: describe.c:2036
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "רצף עבור עמודת זהות: %s"
+
+#: describe.c:2100
+msgid "Indexes:"
+msgstr "×ינדקסי×:"
+
+#: describe.c:2184
+msgid "Check constraints:"
+msgstr "בדיקת ×ילוצי×:"
+
+#: describe.c:2215
+msgid "Foreign-key constraints:"
+msgstr "×ילוצי מפתח זר:"
+
+#: describe.c:2246
+msgid "Referenced by:"
+msgstr "הופנה על-ידי:"
+
+#: describe.c:2306
+msgid "Policies:"
+msgstr "מדיניות:"
+
+#: describe.c:2309
+msgid "Policies (forced row security enabled):"
+msgstr "מדיניות (כפיה של ×בטחה ברמת השורה מופעלת):"
+
+#: describe.c:2312
+msgid "Policies (row security enabled): (none)"
+msgstr "מדיניות (×בטחה ברמת השורה מופעלת): (לל×)"
+
+#: describe.c:2315
+msgid "Policies (forced row security enabled): (none)"
+msgstr "מדיניות (כפיה של ×בטחה ברמת השורה מופעלת): (לל×)"
+
+#: describe.c:2318
+msgid "Policies (row security disabled):"
+msgstr "מדיניות (×בטחה ברמת השורה מבוטלת):"
+
+#: describe.c:2379
+msgid "Statistics:"
+msgstr "סטטיסטיקות:"
+
+#: describe.c:2481 describe.c:2563
+msgid "Rules:"
+msgstr "כללי×:"
+
+#: describe.c:2484
+msgid "Disabled rules:"
+msgstr "×—×•×§×™× ×ž×•×©×‘×ª×™×:"
+
+#: describe.c:2487
+msgid "Rules firing always:"
+msgstr "×—×•×§×™× ×שר ×™×•×¨×™× ×ª×ž×™×“:"
+
+#: describe.c:2490
+msgid "Rules firing on replica only:"
+msgstr "כללי ×שר ×™×•×¨×™× ×‘×¢×•×ª×§ בלבד:"
+
+#: describe.c:2527
+msgid "Publications:"
+msgstr "פרסומי×:"
+
+#: describe.c:2546
+msgid "View definition:"
+msgstr "הגדרת תצוגה:"
+
+#: describe.c:2681
+msgid "Triggers:"
+msgstr "טריגירי×:"
+
+#: describe.c:2685
+msgid "Disabled user triggers:"
+msgstr "×˜×¨×™×’×¨×™× ×©×œ ×ž×©×ª×ž×©×™× ×ž×•×©×‘×ª×™×:"
+
+#: describe.c:2687
+msgid "Disabled triggers:"
+msgstr "×˜×¨×™×’×¨×™× ×ž×•×©×‘×ª×™×:"
+
+#: describe.c:2690
+msgid "Disabled internal triggers:"
+msgstr "×˜×¨×™×’×¨×™× ×¤× ×™×ž×™×™× ×ž×•×©×‘×ª×™×:"
+
+#: describe.c:2693
+msgid "Triggers firing always:"
+msgstr "×˜×¨×™×’×¨×™× ×¤×•×¢×œ×™× ×ª×ž×™×“:"
+
+#: describe.c:2696
+msgid "Triggers firing on replica only:"
+msgstr "×˜×¨×™×’×¨×™× ×¤×•×¢×œ×™× ×‘×¢×•×ª×§ בלבד:"
+
+#: describe.c:2782
+msgid "Inherits"
+msgstr "יורש"
+
+#: describe.c:2836
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "מספר טבל×ות הצ×צ×: %d (שימוש \\d+ כדי לפרט ×ות×)."
+
+#: describe.c:2838
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "מספר החלוקות: %d (שימוש \\d+ כדי לפרט ×ות×)."
+
+#: describe.c:2846
+msgid "Child tables"
+msgstr "טבל×ות הצ×צ×"
+
+#: describe.c:2846
+msgid "Partitions"
+msgstr "מחיצות"
+
+#: describe.c:2880
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "טבלה מסוג: %s"
+
+#: describe.c:2896
+msgid "Replica Identity"
+msgstr "זהות העותק"
+
+#: describe.c:2909
+msgid "Has OIDs: yes"
+msgstr "יש OIDs: כן"
+
+#: describe.c:2993
+#, 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:3005
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", מרחב טבל××™: \"%s\""
+
+#: describe.c:3098
+msgid "List of roles"
+msgstr "רשימת תפקידי×"
+
+#: describe.c:3100
+msgid "Role name"
+msgstr "×©× ×ª×¤×§×™×“"
+
+#: describe.c:3101
+msgid "Attributes"
+msgstr "מ×פייני×"
+
+#: describe.c:3102
+msgid "Member of"
+msgstr "חבר ב"
+
+#: describe.c:3113
+msgid "Superuser"
+msgstr "משתמש על"
+
+#: describe.c:3116
+msgid "No inheritance"
+msgstr "×ין הורשה"
+
+#: describe.c:3119
+msgid "Create role"
+msgstr "צור תפקיד"
+
+#: describe.c:3122
+msgid "Create DB"
+msgstr "צור מסד נתוני×"
+
+#: describe.c:3125
+msgid "Cannot login"
+msgstr "×œ× ×ž×¦×œ×™×— להתחבר"
+
+#: describe.c:3129
+msgid "Replication"
+msgstr "שכפול"
+
+#: describe.c:3133
+msgid "Bypass RLS"
+msgstr "מעקף RLS"
+
+#: describe.c:3142
+msgid "No connections"
+msgstr "×ין חיבורי×"
+
+#: describe.c:3144
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d חיבור"
+msgstr[1] "%d חיבורי×"
+
+#: describe.c:3154
+msgid "Password valid until "
+msgstr "הסיסמה בתוקף עד "
+
+#: describe.c:3210
+msgid "Role"
+msgstr "תפקיד"
+
+#: describe.c:3211
+msgid "Database"
+msgstr "מסד נתוני×"
+
+#: describe.c:3212
+msgid "Settings"
+msgstr "הגדרות"
+
+#: describe.c:3222
+#, c-format
+msgid "No per-database role settings support in this server version.\n"
+msgstr "×ין הגדרות תפקיד ספציפי למסד ×”× ×ª×•× ×™× ×ª×•×ž×›×™× ×‘×’×™×¨×¡×ª השרת.\n"
+
+#: describe.c:3233
+#, c-format
+msgid "No matching settings found.\n"
+msgstr "×œ× × ×ž×¦×ו הגדרות תו×מות.\n"
+
+#: describe.c:3235
+#, c-format
+msgid "No settings found.\n"
+msgstr "הגדרות ×œ× × ×ž×¦×ו.\n"
+
+#: describe.c:3240
+msgid "List of settings"
+msgstr "רשימת הגדרות"
+
+#: describe.c:3310
+msgid "index"
+msgstr "×ינדקס"
+
+#: describe.c:3312
+msgid "special"
+msgstr "מיוחד"
+
+#: describe.c:3321 describe.c:4796
+msgid "Table"
+msgstr "טבלה"
+
+#: describe.c:3398
+#, c-format
+msgid "No matching relations found.\n"
+msgstr "×œ× × ×ž×¦×ו ×™×—×¡×™× ×ª×•×מי×.\n"
+
+#: describe.c:3400
+#, c-format
+msgid "No relations found.\n"
+msgstr "×™×—×¡×™× ×œ× × ×ž×¦×ו.\n"
+
+#: describe.c:3405
+msgid "List of relations"
+msgstr "רשימת יחסי×"
+
+#: describe.c:3442
+msgid "Trusted"
+msgstr "×מין"
+
+#: describe.c:3450
+msgid "Internal Language"
+msgstr "שפה פנימית"
+
+#: describe.c:3451
+msgid "Call Handler"
+msgstr "קרי××” למטפל"
+
+#: describe.c:3452 describe.c:4576
+msgid "Validator"
+msgstr "מ×מת"
+
+#: describe.c:3455
+msgid "Inline Handler"
+msgstr "המטפל מוטבע"
+
+#: describe.c:3483
+msgid "List of languages"
+msgstr "רשימת השפות"
+
+#: describe.c:3528
+msgid "Check"
+msgstr "בדיקה"
+
+#: describe.c:3570
+msgid "List of domains"
+msgstr "רשימת תחומי×"
+
+#: describe.c:3604
+msgid "Source"
+msgstr "מקור"
+
+#: describe.c:3605
+msgid "Destination"
+msgstr "יעד"
+
+#: describe.c:3606 describe.c:3755
+msgid "no"
+msgstr "ל×"
+
+#: describe.c:3606 describe.c:3757
+msgid "yes"
+msgstr "כן"
+
+#: describe.c:3607
+msgid "Default?"
+msgstr "ברירת מחדל?"
+
+#: describe.c:3644
+msgid "List of conversions"
+msgstr "רשימת המרות"
+
+#: describe.c:3683
+msgid "Event"
+msgstr "×ירוע"
+
+#: describe.c:3685
+msgid "enabled"
+msgstr "מ×ופשר"
+
+#: describe.c:3686
+msgid "replica"
+msgstr "עותק משוכפל"
+
+#: describe.c:3687
+msgid "always"
+msgstr "תמיד"
+
+#: describe.c:3688
+msgid "disabled"
+msgstr "מבוטל"
+
+#: describe.c:3689 describe.c:5234
+msgid "Enabled"
+msgstr "מ×ופשר"
+
+#: describe.c:3690
+msgid "Procedure"
+msgstr "פרוצדורה"
+
+#: describe.c:3691
+msgid "Tags"
+msgstr "תגיות"
+
+#: describe.c:3710
+msgid "List of event triggers"
+msgstr "רשימת ×˜×¨×™×’×¨×™× ×©×œ ×ירועי×"
+
+#: describe.c:3752
+msgid "Source type"
+msgstr "סוג מקור"
+
+#: describe.c:3753
+msgid "Target type"
+msgstr "סוג מטרה"
+
+#: describe.c:3756
+msgid "in assignment"
+msgstr "בהקצ××”"
+
+#: describe.c:3758
+msgid "Implicit?"
+msgstr "בצורה עקיפה?"
+
+#: describe.c:3809
+msgid "List of casts"
+msgstr "רשימת המרות"
+
+#: describe.c:3837
+#, c-format
+msgid "The server (version %s) does not support collations.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך ב×וספי×.\n"
+
+#: describe.c:3858
+msgid "Provider"
+msgstr "ספק"
+
+#: describe.c:3893
+msgid "List of collations"
+msgstr "רשימת ×”×וספי×"
+
+#: describe.c:3952
+msgid "List of schemas"
+msgstr "רשימת הסכימות"
+
+#: describe.c:3977 describe.c:4215 describe.c:4286 describe.c:4357
+#, c-format
+msgid "The server (version %s) does not support full text search.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בחיפוש טקסט מל×.\n"
+
+#: describe.c:4012
+msgid "List of text search parsers"
+msgstr "רשימת מנתחי מבנה חיפוש טקסט"
+
+#: describe.c:4055
+#, c-format
+msgid "Did not find any text search parser named \"%s\".\n"
+msgstr "×œ× ×ž×¦× ×›×œ מנתח החיפוש טקסט ×‘×©× \"%s\".\n"
+
+#: describe.c:4130
+msgid "Start parse"
+msgstr "מתחיל ניתוח"
+
+#: describe.c:4131
+msgid "Method"
+msgstr "שיטה"
+
+#: describe.c:4135
+msgid "Get next token"
+msgstr "תקבל ×סימון גישה הב×"
+
+#: describe.c:4137
+msgid "End parse"
+msgstr "סוף ניתוח"
+
+#: describe.c:4139
+msgid "Get headline"
+msgstr "תקבל שורת כותרת"
+
+#: describe.c:4141
+msgid "Get token types"
+msgstr "תקבל ×¡×•×’×™× ×©×œ ×סימוני גישה"
+
+#: describe.c:4151
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "מנתח החיפוש טקסט \"%s.%s\""
+
+#: describe.c:4153
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "מנתח החיפוש טקסט \"%s\""
+
+#: describe.c:4172
+msgid "Token name"
+msgstr "×©× ×©×œ ×סימון גישה"
+
+#: describe.c:4183
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "סוגי ×סימוני גישה עבור מנתח \"%s.%s\""
+
+#: describe.c:4185
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "סוגי ×סימוני גישה עבור מנתח \"%s\""
+
+#: describe.c:4238
+msgid "Template"
+msgstr "תבנית"
+
+#: describe.c:4239
+msgid "Init options"
+msgstr "×פשריות init"
+
+#: describe.c:4261
+msgid "List of text search dictionaries"
+msgstr "רשימת ×ž×™×œ×•× ×™× ×©×œ חיפוש טקסט"
+
+#: describe.c:4304
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:4305
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:4332
+msgid "List of text search templates"
+msgstr "רשימת תבניות של חיפוש טקסט"
+
+#: describe.c:4392
+msgid "List of text search configurations"
+msgstr "רשימת התצורות של חיפוש טקסט"
+
+#: describe.c:4436
+#, c-format
+msgid "Did not find any text search configuration named \"%s\".\n"
+msgstr "×œ× × ×ž×¦× ×›×œ תצורת חיפוש טקסט ×‘×©× \"%s\".\n"
+
+#: describe.c:4502
+msgid "Token"
+msgstr "×סימון גישה"
+
+#: describe.c:4503
+msgid "Dictionaries"
+msgstr "מילוני×"
+
+#: describe.c:4514
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "תצורה של חיפוש טקסט \"%s.%s\""
+
+#: describe.c:4517
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "תצורה של חיפוש טקסט \"%s\""
+
+#: describe.c:4521
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"מנתח: \"%s.%s\""
+
+#: describe.c:4524
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"מנתח: \"%s\""
+
+#: describe.c:4558
+#, c-format
+msgid "The server (version %s) does not support foreign-data wrappers.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בעטיפות × ×ª×•× ×™× ×–×¨×™×.\n"
+
+#: describe.c:4616
+msgid "List of foreign-data wrappers"
+msgstr "רשימת עטיפות × ×ª×•× ×™× ×–×¨×™×"
+
+#: describe.c:4641
+#, c-format
+msgid "The server (version %s) does not support foreign servers.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך ×‘×©×¨×ª×™× ×–×¨×™×.\n"
+
+#: describe.c:4654
+msgid "Foreign-data wrapper"
+msgstr "מעטפת החוץ-נתוני×"
+
+#: describe.c:4672 describe.c:4877
+msgid "Version"
+msgstr "גירסה"
+
+#: describe.c:4698
+msgid "List of foreign servers"
+msgstr "רשימת ×©×¨×ª×™× ×–×¨×™×"
+
+#: describe.c:4723
+#, c-format
+msgid "The server (version %s) does not support user mappings.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך ×‘×ž×™×¤×•×™×™× ×©×œ המשתמש.\n"
+
+#: describe.c:4733 describe.c:4797
+msgid "Server"
+msgstr "שרת"
+
+#: describe.c:4734
+msgid "User name"
+msgstr "×©× ×ž×©×ª×ž×©"
+
+#: describe.c:4759
+msgid "List of user mappings"
+msgstr "רשימת ×ž×™×¤×•×™×™× ×©×œ×ž×©×ª×ž×©×™×"
+
+#: describe.c:4784
+#, c-format
+msgid "The server (version %s) does not support foreign tables.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בטבל×ות זרות.\n"
+
+#: describe.c:4837
+msgid "List of foreign tables"
+msgstr "רשימת הטבל×ות הזרות"
+
+#: describe.c:4862 describe.c:4919
+#, c-format
+msgid "The server (version %s) does not support extensions.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בהרחבות.\n"
+
+#: describe.c:4894
+msgid "List of installed extensions"
+msgstr "רשימת ההרחבות המותקנות"
+
+#: describe.c:4947
+#, c-format
+msgid "Did not find any extension named \"%s\".\n"
+msgstr "×œ× ×ž×¦× ×›×œ הרחבה ×‘×©× \"%s\".\n"
+
+#: describe.c:4950
+#, c-format
+msgid "Did not find any extensions.\n"
+msgstr "×œ× × ×ž×¦×ו כל הרחבות.\n"
+
+#: describe.c:4994
+msgid "Object Description"
+msgstr "תי×ור ×”×ובייקט"
+
+#: describe.c:5003
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "××•×‘×™×™×§×˜×™× ×‘×”×¨×—×‘×” \"%s\""
+
+#: describe.c:5029 describe.c:5091
+#, c-format
+msgid "The server (version %s) does not support publications.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך בפרסומי×.\n"
+
+#: describe.c:5045 describe.c:5136
+msgid "Inserts"
+msgstr "מוסיף"
+
+#: describe.c:5046 describe.c:5137
+msgid "Updates"
+msgstr "מעדכן"
+
+#: describe.c:5047 describe.c:5138
+msgid "Deletes"
+msgstr "מוחק"
+
+#: describe.c:5064
+msgid "List of publications"
+msgstr "רשימת פרסומי×"
+
+#: describe.c:5133
+#, c-format
+msgid "Publication %s"
+msgstr "×¤×¨×¡×•× %s"
+
+#: describe.c:5178
+msgid "Tables:"
+msgstr "טבל×ות:"
+
+#: describe.c:5219
+#, c-format
+msgid "The server (version %s) does not support subscriptions.\n"
+msgstr "השרת (גירסה %s) ×ינו תומך במנויי×.\n"
+
+#: describe.c:5235
+msgid "Publication"
+msgstr "פרסו×"
+
+#: describe.c:5242
+msgid "Synchronous commit"
+msgstr "ביצוע סינכרוני"
+
+#: describe.c:5243
+msgid "Conninfo"
+msgstr "הגדרות חיבור"
+
+#: describe.c:5265
+msgid "List of subscriptions"
+msgstr "רשימת מנויי×"
+
+#: help.c:62
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: help.c:73
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql ×”×™× ×ž×¡×•×£ PostgreSQL ×ינטר×קטיבי.\n"
+"\n"
+
+#: help.c:74 help.c:342 help.c:376 help.c:403
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: help.c:75
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psqlpsql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+
+#: help.c:77
+#, c-format
+msgid "General options:\n"
+msgstr "×פשרויות כלליות:\n"
+
+#: help.c:82
+#, c-format
+msgid ""
+" -c, --command=COMMAND run only single command (SQL or internal) and "
+"exit\n"
+msgstr " -c, --command=COMMAND מריץ בפקודה ×חת בלבד (SQL ×ו פנימיי×) ויוצ×\n"
+
+#: help.c:83
+#, c-format
+msgid ""
+" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=DBNAME ×©× ×ž×¡×“ ×”× ×ª×•× ×™× ×›×“×™ להתחבר (ברירת מחדל: \"%s\")\n"
+
+#: help.c:84
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME לבצע פקודות מקובץ, ול×חר מכן לצ×ת\n"
+
+#: help.c:85
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr ""
+" -l, --list רשימה של מסדי × ×ª×•× ×™× ×–×ž×™× ×™×, ול×חר מכן היצי××”\n"
+
+#: help.c:86
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" הגדרת משתנה psql c×©× ×œ×¢×¨×š\n"
+" (למשל - v ON_ERROR_STOP = 1)\n"
+
+#: help.c:89
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: help.c:90
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ×œ× ×œ×§×¨×•× ×ת קובץ ההפעלה (~/.psqlrc)\n"
+
+#: help.c:91
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-"
+"interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" לבצע כטרנזקציה יחידה (×× ×œ× ×ינטר×קטיבי)\n"
+
+#: help.c:93
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] הצג עזרה זו, ול×חר מכן היצי××”\n"
+
+#: help.c:94
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr ""
+" --help=commands רשימת פקודות ×›× ×§×• נטוי הפוך, ול×חר מכן היצי××”\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables רשימת ×ž×©×ª× ×™× ×ž×™×•×—×“×™×, ול×חר מכן היצי××”\n"
+
+#: help.c:97
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"×פשרויות קלט ופלט:\n"
+
+#: help.c:98
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all ×קו כל קלט מקובץ מסקריפט\n"
+
+#: help.c:99
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors ×קו כל פקודות שנכשלו \n"
+
+#: help.c:100
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries ×קו פקודות הנשלחו לשרת\n"
+
+#: help.c:101
+#, c-format
+msgid ""
+" -E, --echo-hidden display queries that internal commands generate\n"
+msgstr ""
+" -E, --echo-hidden מר××” ש×ילתות ×שר נוצרו על ידי פקודות פנימיות\n"
+
+#: help.c:102
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME שלח יומן של הפעלה לקובץ\n"
+
+#: help.c:103
+#, c-format
+msgid ""
+" -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline להשבית עריכה של שורת פקודה משופרת (readline)\n"
+
+#: help.c:104
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME שלח ×ת תוצ×ות הש×ילתה לקובץ (×ו | צינור)\n"
+
+#: help.c:105
+#, c-format
+msgid ""
+" -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet לרוץ בשקט (×ין הודעות, רק פלט של ש×ילתה)\n"
+
+#: help.c:106
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr ""
+" -s, --single-step מצב של צעד ×חר צעד צעד יחיד (ל×שר כל ש×ילתה)\n"
+
+#: help.c:107
+#, c-format
+msgid ""
+" -S, --single-line single-line mode (end of line terminates SQL "
+"command)\n"
+msgstr ""
+" -S, --single-line מצב שורה בודדת (סוף שורה ×ž×¡×™×™× ×”×¤×§×•×“×” SQL)\n"
+
+#: help.c:109
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"×פשרויות תבנית פלט:\n"
+
+#: help.c:110
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align מצב הפלט של טבלה ×œ× ×ž×™×•×©×¨×ª\n"
+
+#: help.c:111
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: "
+"\"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" מפריד השדות לפלט ×œ× ×ž×™×•×©×¨ (ברירת מחדל: \"%s\")\n"
+
+#: help.c:114
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html מצב הפלט של הטבלה HTML\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset "
+"command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] הגדרת ×פשרות הדפסה VAR ל ARG (ר××” הפקודה "
+"\\pset)\n"
+
+#: help.c:116
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: "
+"newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" מפריד רשומות עבור פלט ×œ× ×ž×™×•×©×¨ (ברירת מחדל: שורה "
+"חדשה)\n"
+
+#: help.c:118
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only הדפסת שורות בלבד\n"
+
+#: help.c:119
+#, c-format
+msgid ""
+" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, "
+"border)\n"
+msgstr ""
+" -T, --table-attr=TEXT לקבוע תכונות של תג HTML טבלה (למשל, ' רוחב ', ' "
+"גבול ')\n"
+
+#: help.c:120
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded הפעל ×ת הפלט בטבלה המורחבת\n"
+
+#: help.c:121
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" קובע מפריד שדות עבור פלט ×œ× ×ž×™×•×©×¨ ל×פס בתי×\n"
+
+#: help.c:123
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" מגדיר מפריד רשומות עבור פלט ×œ× ×ž×™×•×©×¨ ל×פס בתי×\n"
+
+#: help.c:126
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"×פשרויות חיבור:\n"
+
+#: help.c:129
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory "
+"(default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME שרת מ×רח של מסד ×”× ×ª×•× ×™× ×ו ספריית שקע (ברירת "
+"המחדל: \"%s\"))\n"
+
+#: help.c:130
+msgid "local socket"
+msgstr "שקע מקומי"
+
+#: help.c:133
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr ""
+" -p, --port=PORT יצי×ת שרת מסד × ×ª×•× ×™× (ברירת המחדל: \"%s\")\n"
+
+#: help.c:139
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr ""
+" -U, --username=USERNAME ×©× ×ž×©×ª×ž×© של מסד ×”× ×ª×•× ×™× (ברירת מחדל: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ×œ×¢×•×œ× ×œ× ×œ×‘×§×© סיסמה\n"
+
+#: help.c:141
+#, c-format
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password נדרשת בקשת סיסמה (צריך לקרות ב×ופן ×וטומטי)\n"
+
+#: help.c:143
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help"
+"\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"לקבלת מידע נוסף, הקלד \"\\?\" (עבור פקודות פנימיות) ×ו \"\\help\" (עבור "
+"פקודות SQL)\n"
+"מבתוך psql ×ו עיין במקטע psql PostgreSQL בתיעוד.\n"
+"\n"
+
+#: help.c:146
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: help.c:172
+#, c-format
+msgid "General\n"
+msgstr "כללי\n"
+
+#: help.c:173
+#, c-format
+msgid ""
+" \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr ""
+" \\copyright להר×ות PostgreSQL תנ××™ שימוש והפצה\n"
+"\n"
+
+#: help.c:174
+#, c-format
+msgid ""
+" \\errverbose show most recent error message at maximum "
+"verbosity\n"
+msgstr " \\errverbose להציג הודעת השגי××” ×”×חרונה ×¢× ×ž×œ×œ המרבי\n"
+
+#: help.c:175
+#, c-format
+msgid ""
+" \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+msgstr " \\g [FILE] or ; לבצע ש×ילתה (ושלח תוצ×ות לקובץ ×ו | צינור)\n"
+
+#: help.c:176
+#, c-format
+msgid " \\gx [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [FILE] כמו \\g, ×בל כופה מצב הפלט מורחב\n"
+
+#: help.c:177
+#, c-format
+msgid ""
+" \\gexec execute query, then execute each value in its "
+"result\n"
+msgstr ""
+" \\gexec לבצע ש×ילתה ול×חר מכן לבצע כל ערך על התוצ××” שלו\n"
+
+#: help.c:178
+#, c-format
+msgid ""
+" \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr ""
+"\\gse \\gset [PREFIX] לבצע ש×ילתה ולשמור ×ת התוצ×ות במשתני psql\n"
+
+#: help.c:179
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q להפסיק psql\n"
+
+#: help.c:180
+#, c-format
+msgid ""
+" \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] לבצע ש×ילתה ולהציג תוצ×ות במטריצה\n"
+
+#: help.c:181
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] לבצע ש×ילתה כל SEC שניות\n"
+
+#: help.c:184
+#, c-format
+msgid "Help\n"
+msgstr "עזרה\n"
+
+#: help.c:186
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] הצג עזרה על פקודות שלקו נטוי הפוך\n"
+
+#: help.c:187
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr ""
+" \\? options הצג עזרה על ×פשרויות שורת הפקודה של פקודות psql\n"
+
+#: help.c:188
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables הצג עזרה על ×ž×©×ª× ×™× ×ž×™×•×—×“×™×\n"
+
+#: help.c:189
+#, c-format
+msgid ""
+" \\h [NAME] help on syntax of SQL commands, * for all "
+"commands\n"
+msgstr ""
+" \\h [NAME] עזרה על תחביר של פקודות SQL, * עבור כל פקודות\n"
+
+#: help.c:192
+#, c-format
+msgid "Query Buffer\n"
+msgstr "מ×גר ש×ילתה\n"
+
+#: help.c:193
+#, c-format
+msgid ""
+" \\e [FILE] [LINE] edit the query buffer (or file) with external "
+"editor\n"
+msgstr ""
+" \\e [FILE] [LINE] לערוך ×ת מ×גר הש×ילתה (×ו קובץ) בעורך חיצוני\n"
+
+#: help.c:194
+#, c-format
+msgid ""
+" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] לערוך הגדרת הפונקציה בעורך חיצוני\n"
+
+#: help.c:195
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] לערוך הגדרות תצוגה בעורך חיצוני\n"
+
+#: help.c:196
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p להציג תוכן של המ×גר ש×ילתה\n"
+
+#: help.c:197
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r ל×פס (לנקות) המ×גר ש×ילתה\n"
+
+#: help.c:199
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] להציג היסטוריה ×ו לשמור ×ותה בקובץ\n"
+
+#: help.c:201
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE לכתוב מ×גר הש×ילתה לקובץ\n"
+
+#: help.c:204
+#, c-format
+msgid "Input/Output\n"
+msgstr "קלט / פלט\n"
+
+#: help.c:205
+#, c-format
+msgid ""
+" \\copy ... perform SQL COPY with data stream to the client "
+"host\n"
+msgstr " \\copy ... ביצוע SQL COPY ×¢× ×–×¨× ×”× ×ª×•× ×™× ×œ×ž×—×©×‘ הלקוח\n"
+
+#: help.c:206
+#, c-format
+msgid " \\echo [STRING] write string to standard output\n"
+msgstr " \\echo [STRING] לכתוב מחרוזת לפלט הסטנדרטי\n"
+
+#: help.c:207
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE לבצע פקודות מקובץ\n"
+
+#: help.c:208
+#, c-format
+msgid ""
+" \\ir FILE as \\i, but relative to location of current "
+"script\n"
+msgstr " \\ir FILE כמו \\i ××œ× ×‘×™×—×¡ ×œ×ž×™×§×•× ×©×œ סקריפט הנוכחי\n"
+
+#: help.c:209
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] לשלוח כל תוצ×ות ש×ילתה לקובץ ×ו | צינור\n"
+
+#: help.c:210
+#, c-format
+msgid ""
+" \\qecho [STRING] write string to query output stream (see \\o)\n"
+msgstr " \\qecho [STRING] לכתוב מחרוזת הש×ילתה ×œ×–×¨× ×”×¤×œ×˜ (ר××” \\o)\n"
+
+#: help.c:213
+#, c-format
+msgid "Conditional\n"
+msgstr "מותנה\n"
+
+#: help.c:214
+#, c-format
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR התחלה של בלוק מותנה\n"
+
+#: help.c:215
+#, c-format
+msgid ""
+" \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR ×לטרנטיבה בתוך בלוק מותנה הנוכחי\n"
+
+#: help.c:216
+#, c-format
+msgid ""
+" \\else final alternative within current conditional "
+"block\n"
+msgstr " \\else ×לטרנטיבית הסופית בתוך בלוק מותנה הנוכחי\n"
+
+#: help.c:217
+#, c-format
+msgid " \\endif end conditional block\n"
+msgstr " \\endif קצה בלוק מותנה\n"
+
+#: help.c:220
+#, c-format
+msgid "Informational\n"
+msgstr "מידע\n"
+
+#: help.c:221
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr "(×פשרויות: S = הצג ××•×‘×™×™×§×˜×™× ×©×œ מערכת, + = ×¤×¨×˜×™× × ×•×¡×¤×™×)\n"
+
+#: help.c:222
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] רשימת טבל×ות, תצוגות, רצפי×\n"
+
+#: help.c:223
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME לת×ר ×ת הטבלה, התצוגה, רצף ×ו ×ינדקס\n"
+
+#: help.c:224
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] רשימת ×”×גרגטי×\n"
+
+#: help.c:225
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] רשימת שיטות גישה\n"
+
+#: help.c:226
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] רשימת מרחבי טבל×ות\n"
+
+#: help.c:227
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] רשימת המרות\n"
+
+#: help.c:228
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] רשימת הטלות\n"
+
+#: help.c:229
+#, c-format
+msgid ""
+" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [PATTERN] הצג תי×ורי ×”×ובייקט ×שר ×ינו ×ž×•×¦×’×™× ×‘×ž×§×•× ×חר\n"
+
+#: help.c:230
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] רשימת הרש×ות ברירת מחדל\n"
+
+#: help.c:231
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] רשימת דומייני×\n"
+
+#: help.c:232
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] רשימת טבל×ות זרות\n"
+
+#: help.c:233
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] רשימת ×©×¨×ª×™× ×–×¨×™×\n"
+
+#: help.c:234
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] רשימת מיפויי המשתמש\n"
+
+#: help.c:235
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] רשימת עטיפות × ×ª×•× ×™× ×–×¨×™×\n"
+
+#: help.c:236
+#, c-format
+msgid ""
+" \\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions\n"
+msgstr ""
+" \\df[antw][S+] [PATRN] ברשימת הפונקציות [רק צבירה/רגילות/טריגרי×/חלונות]\n"
+
+#: help.c:237
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] רשימת תצורות חיפוש טקסט\n"
+
+#: help.c:238
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] רשימת ×ž×™×œ×•× ×™× ×©×œ חיפוש טקסט\n"
+
+#: help.c:239
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] רשימת מנתחי מבנה חיפוש טקסט\n"
+
+#: help.c:240
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] רשימ, תבניות חיפוש טקסט\n"
+
+#: help.c:241
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] רשימת תפקידי×\n"
+
+#: help.c:242
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] רשימת ×ינדקסי×\n"
+
+#: help.c:243
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr ""
+" \\dl רשימת ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×, בדיוק כמו \\lo_list\n"
+
+#: help.c:244
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] רשימת שפות פרוצדורליות\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] רשימת תצוגות ממומשות\n"
+
+#: help.c:246
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] רשימת הסכימות\n"
+
+#: help.c:247
+#, c-format
+msgid " \\do[S] [PATTERN] list operators\n"
+msgstr " \\do[S] [PATTERN] רשימת ×ופרטורי×\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] רשימת ×”×וספי×\n"
+
+#: help.c:249
+#, c-format
+msgid ""
+" \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [PATTERN] רשימת זכויות גישה לטבלה, תצוגה ורצף\n"
+
+#: help.c:250
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [PATRN1 [PATRN2]] רשימת הגדרות תפקיד ספציפיות למסד נתוני×\n"
+
+#: help.c:251
+#, c-format
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] רשימת ×¤×¨×¡×•×ž×™× ×©×œ שכפול\n"
+
+#: help.c:252
+#, c-format
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] רשימת ×ž× ×•×™×™× ×œ×©×›×¤×•×œ×™×\n"
+
+#: help.c:253
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] רשימת רצפי×\n"
+
+#: help.c:254
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] רשימת טבל×ות\n"
+
+#: help.c:255
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] רשימת סוגי נתוני×\n"
+
+#: help.c:256
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] רשימת תפקידי×\n"
+
+#: help.c:257
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] רשימת תצוגות\n"
+
+#: help.c:258
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] רשימת טבל×ות זרות\n"
+
+#: help.c:259
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] רשימת הרחבות\n"
+
+#: help.c:260
+#, c-format
+msgid " \\dy [PATTERN] list event triggers\n"
+msgstr " \\dy [PATTERN] רשימת ×˜×¨×™×’×¨×™× ×©×œ ×ירועי×\n"
+
+#: help.c:261
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] רשימת מסדי נתוני×\n"
+
+#: help.c:262
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME להציג ההגדרה של פונקציה\n"
+
+#: help.c:263
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME להציג ההגדרה של תצוגה\n"
+
+#: help.c:264
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [PATTERN] בדיוק כמו \\dp\n"
+
+#: help.c:267
+#, c-format
+msgid "Formatting\n"
+msgstr "פירמוט\n"
+
+#: help.c:268
+#, c-format
+msgid ""
+" \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a לעבור בין מצב פלט ×œ× ×ž×™×•×©×¨ למיושר\n"
+
+#: help.c:269
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] להגדיר כותרת טבלה ×ו ×œ× ×œ×§×‘×¢ ×× ×œ×\n"
+
+#: help.c:270
+#, c-format
+msgid ""
+" \\f [STRING] show or set field separator for unaligned query "
+"output\n"
+msgstr ""
+" \\f [STRING] מר××” ×ו מגדיר מפריד שדה לפלט הש×ילתה ×œ× ×ž×™×•×©×¨\n"
+
+#: help.c:271
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H לעבור בין מצבי הפלט HTML (×›×™×•× %s)\n"
+
+#: help.c:273
+#, c-format
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (NAME := {format|border|expanded|fieldsep|"
+"fieldsep_zero|footer|null|\n"
+" numericlocale|recordsep|recordsep_zero|tuples_only|"
+"title|tableattr|pager|\n"
+" unicode_border_linestyle|unicode_column_linestyle|"
+"unicode_header_linestyle})\n"
+msgstr ""
+" \\pset [NAME [VALUE]] הגדרת ×פשרות של טבלת הפלט\n"
+" (NAME := {format|border|expanded|fieldsep|"
+"fieldsep_zero|footer|null|\\n\n"
+" numericlocale|recordsep|recordsep_zero|"
+"tuples_only|title|tableattr|pager|\n"
+" unicode_border_linestyle|unicode_column_linestyle|"
+"unicode_header_linestyle})\n"
+
+#: help.c:277
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] להציג רק שורות (×›×™×•× %s)\n"
+
+#: help.c:279
+#, c-format
+msgid ""
+" \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [STRING] להגדיר תגיות HTML עבור טבלה, ×ו ×œ× ×œ×§×‘×•×¢ ×× ×œ×\n"
+
+#: help.c:280
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] החלף מצב הפלט המורחב (×›×™×•× %s)\n"
+
+#: help.c:284
+#, c-format
+msgid "Connection\n"
+msgstr "חיבור\n"
+
+#: help.c:286
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" להתחבר למסד ×”× ×ª×•× ×™× ×”×—×“×© (כרגע \"%s\")\n"
+
+#: help.c:290
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" להתחבר ×ל מסד × ×ª×•× ×™× ×—×“×© (כרגע ×ין חיבור)\n"
+
+#: help.c:292
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] הצג ×ו קבע קידוד של לקוח\n"
+
+#: help.c:293
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] לשנות ×ת הסיסמה עבור המשתמש בצורה מ×ובטחת\n"
+
+#: help.c:294
+#, c-format
+msgid ""
+" \\conninfo display information about current connection\n"
+msgstr " \\conninfo הצג מידע ×ודות החיבור הנוכחי\n"
+
+#: help.c:297
+#, c-format
+msgid "Operating System\n"
+msgstr "מערכת הפעלה\n"
+
+#: help.c:298
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] שינוי לספריה הנוכחית\n"
+
+#: help.c:299
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] לקבוע ×ו ל×פס משתנה הסביבה\n"
+
+#: help.c:300
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] החלפת העיתוי של פקודות (כרגע %s)\n"
+
+#: help.c:302
+#, c-format
+msgid ""
+" \\! [COMMAND] execute command in shell or start interactive "
+"shell\n"
+msgstr ""
+" \\! [COMMAND] להפעיל פקודה ב shell ×ו להתחיל shell ×ינטר×קטיבי\n"
+
+#: help.c:305
+#, c-format
+msgid "Variables\n"
+msgstr "משתני×\n"
+
+#: help.c:306
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME לבקש מהמשתמש להגדיר משתנה פנימי\n"
+
+#: help.c:307
+#, c-format
+msgid ""
+" \\set [NAME [VALUE]] set internal variable, or list all if no "
+"parameters\n"
+msgstr ""
+" \\set [NAME [VALUE]] להגדיר משתנה פנימי, ×ו להציג ×ת ×›×•×œ× ×× ×ין "
+"פרמטרי×\n"
+
+#: help.c:308
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME ל×פס (למחוק) משתנה פנימי\n"
+
+#: help.c:311
+#, c-format
+msgid "Large Objects\n"
+msgstr "××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×\n"
+
+#: help.c:312
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID FILE\n"
+"\\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID פעולות על ××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×\n"
+
+#: help.c:339
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"רשימת ×ž×©×ª× ×™× ×ž×˜×•×¤×œ×™× ×‘×ž×™×•×—×“\n"
+"\n"
+
+#: help.c:341
+#, c-format
+msgid "psql variables:\n"
+msgstr "psql משתני×:\n"
+
+#: help.c:343
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+"×ו \\set NAME VALUE בתוך psql\n"
+"\n"
+
+#: help.c:345
+#, c-format
+msgid ""
+" AUTOCOMMIT if set, successful SQL commands are automatically "
+"committed\n"
+msgstr " AUTOCOMMIT ×× ×”×•×¤×¢×œ, פקודות SQL מחויבות ב×ופן ×וטומטי\n"
+
+#: help.c:346
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE קובע ×ת המקרה ×שר בשימוש כדי ×œ×”×©×œ×™× ×ž×™×œ×•×ª מפתח SQL\n"
+" [התחתון, העליון, שמר-נמוך, שמר-עליון]\n"
+
+#: help.c:348
+#, c-format
+msgid " DBNAME the currently connected database name\n"
+msgstr " DBNAME ×©× ×ž×¡×“ ×”× ×ª×•× ×™× ×ž×—×•×‘×¨ כעת\n"
+
+#: help.c:349
+#, c-format
+msgid ""
+" ECHO controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO שולט ×יך קלט נכתב לפלט הסטנדרטי\n"
+" [כל, שגי×ות, לל×, ש×ילתות]\n"
+
+#: help.c:351
+#, c-format
+msgid ""
+" ECHO_HIDDEN if set, display internal queries executed by backslash "
+"commands;\n"
+" if set to \"noexec\", just show without execution\n"
+msgstr ""
+" ECHO_HIDDEN ×× ×”×•×’×“×¨, הצגת ש×ילתות פנימיות תבוצע על-ידי פקודות של "
+"קו נטוי הפוך ;\n"
+" ×× ×ž×•×’×“×¨ ל- \"noexec\", פשוט מר××” ×œ×œ× ×‘×™×¦×•×¢\n"
+
+#: help.c:353
+#, c-format
+msgid " ENCODING current client character set encoding\n"
+msgstr " ENCODING קידוד של ערכת ×”×ª×•×•×™× ×”× ×•×›×—×™×ª של הלקוח\n"
+
+#: help.c:354
+#, c-format
+msgid ""
+" FETCH_COUNT the number of result rows to fetch and display at a "
+"time\n"
+" (default: 0=unlimited)\n"
+msgstr ""
+" FETCH_COUNT מספר השורות כדי ×œ×”×‘×™× ×•×œ×”×¦×™×’ כל פע×\n"
+" (ברירת המחדל: 0 = ×œ×œ× ×”×’×‘×œ×”)\n"
+
+#: help.c:356
+#, c-format
+msgid ""
+" HISTCONTROL controls command history [ignorespace, ignoredups, "
+"ignoreboth]\n"
+msgstr ""
+" HISTCONTROL ההיסטוריה של הפקודות [ignorespace, ignoredups, "
+"ignoreboth]\n"
+
+#: help.c:357
+#, c-format
+msgid " HISTFILE file name used to store the command history\n"
+msgstr " HISTFILE ×©× ×”×§×•×‘×¥ בו ל×חסן ×ת היסטוריית הפקודות\n"
+
+#: help.c:358
+#, c-format
+msgid ""
+" HISTSIZE max number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE מספר פקודות מקסימלי ×שר ×™×חסנו בהיסטוריית הפקודות\n"
+
+#: help.c:359
+#, c-format
+msgid " HOST the currently connected database server host\n"
+msgstr " HOST המ×רח של שרת מסד ×”× ×ª×•× ×™× ×ž×—×•×‘×¨ כעת\n"
+
+#: help.c:360
+#, c-format
+msgid ""
+" IGNOREEOF number of EOFs needed to terminate an interactive "
+"session\n"
+msgstr ""
+" IGNOREEOF מספר EOFs ×שר ×¦×¨×™×›×™× ×‘×›×“×™ ×œ×¡×™×™× ×ת מפגש ×ינטר×קטיבי\n"
+
+#: help.c:361
+#, c-format
+msgid " LASTOID value of the last affected OID\n"
+msgstr " LASTOID הערך ×”×חרון של OID ×שר מושפע ל×חרונה\n"
+
+#: help.c:362
+#, c-format
+msgid ""
+" ON_ERROR_ROLLBACK if set, an error doesn't stop a transaction (uses "
+"implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK ×× ×”×•×¤×¢×œ, שגי××” ×œ× ×ª×¢×¦×•×¨ טרנזקציה (משתמשת בsavepoints "
+"מרומזי×)\n"
+
+#: help.c:363
+#, c-format
+msgid " ON_ERROR_STOP stop batch execution after error\n"
+msgstr " ON_ERROR_STOP עצירת ביצוע של תהליך ×צווה ל×חר שגי××”\n"
+
+#: help.c:364
+#, c-format
+msgid " PORT server port of the current connection\n"
+msgstr " PORT יצי×ת השרת של החיבור הנוכחי\n"
+
+#: help.c:365
+#, c-format
+msgid " PROMPT1 specifies the standard psql prompt\n"
+msgstr " PROMPT1 מציין ×ת שורת psql סטנדרטי\n"
+
+#: help.c:366
+#, c-format
+msgid ""
+" PROMPT2 specifies the prompt used when a statement continues "
+"from a previous line\n"
+msgstr " PROMPT2 מציין ×ת שורת הפקודה ×›×שר המשפט ממשיך מקו הקוד×\n"
+
+#: help.c:367
+#, c-format
+msgid ""
+" PROMPT3 specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3 מציין ×ת הפקודה ×שר בשימוש במהלך COPY ... FROM STDIN\n"
+
+#: help.c:368
+#, c-format
+msgid " QUIET run quietly (same as -q option)\n"
+msgstr " QUIET לרוץ בשקט (כמו ×”×פשרות - q)\n"
+
+#: help.c:369
+#, c-format
+msgid ""
+" SHOW_CONTEXT controls display of message context fields [never, "
+"errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT שולט בתצוגה של שדות בהקשר הודעה [לעול×, שגי×ות, תמיד]\n"
+
+#: help.c:370
+#, c-format
+msgid ""
+" SINGLELINE end of line terminates SQL command mode (same as -S "
+"option)\n"
+msgstr " SINGLELINE סוף שורה מסיימת מצב פקודת SQL (כמו ×”×פשרות -S)\n"
+
+#: help.c:371
+#, c-format
+msgid " SINGLESTEP single-step mode (same as -s option)\n"
+msgstr " SINGLESTEP מצב צעד יחיד (כמו ×”×פשרות -s)\n"
+
+#: help.c:372
+#, c-format
+msgid " USER the currently connected database user\n"
+msgstr " USER המשתמש שמחובר כעת למסד נתוני×\n"
+
+#: help.c:373
+#, c-format
+msgid ""
+" VERBOSITY controls verbosity of error reports [default, verbose, "
+"terse]\n"
+msgstr ""
+" VERBOSITY שולט על מלל של דוחות השגי××” [ברירת-מחדל, מילולי, "
+"תמציתי]\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"הגדרות תצוגה\n"
+
+#: help.c:377
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql - pset = ×©× [= ערך]\n"
+"×ו \\pset [ערך] ×©× ×‘×ª×•×š psql\n"
+"\n"
+
+#: help.c:379
+#, c-format
+msgid " border border style (number)\n"
+msgstr " border סגנון גבול(מספר)\n"
+
+#: help.c:380
+#, c-format
+msgid " columns target width for the wrapped format\n"
+msgstr " columns רוחב היעד רוחב עבור התבנית עטופה\n"
+
+#: help.c:381
+#, c-format
+msgid " expanded (or x) expanded output [on, off, auto]\n"
+msgstr " expanded (or x) פלט מורחב [פעיל, כבוי, ×וטומטי]\n"
+
+#: help.c:382
+#, c-format
+msgid ""
+" fieldsep field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep מפריד השדות עבור unaligned פלט (ברירת מחדל \"%s\")\n"
+
+#: help.c:383
+#, c-format
+msgid ""
+" fieldsep_zero set field separator for unaligned output to zero byte\n"
+msgstr " fieldsep_zero להגדיר מפריד השדות לפלט unaligned ל×פס בתי×\n"
+
+#: help.c:384
+#, c-format
+msgid ""
+" footer enable or disable display of the table footer [on, "
+"off]\n"
+msgstr ""
+" footer ל×פשר ×ו להשבית ×ת תצוגה של כותרת תחתונה של הטבלה "
+"[פועל, מושבת]\n"
+
+#: help.c:385
+#, c-format
+msgid ""
+" format set output format [unaligned, aligned, wrapped, html, "
+"asciidoc, ...]\n"
+msgstr ""
+" format הגדרת תבנית הפלט [unaligned, aligned, wrapped, html, "
+"asciidoc, ...]\n"
+
+#: help.c:386
+#, c-format
+msgid ""
+" linestyle set the border line drawing style [ascii, old-ascii, "
+"unicode]\n"
+msgstr ""
+" linestyle להגדיר סגנון הקו של קו הגבול [ascii, old-ascii, "
+"unicode]\n"
+
+#: help.c:387
+#, c-format
+msgid ""
+" null set the string to be printed in place of a null value\n"
+msgstr " null להגדיר ×ת המחרוזת שיודפס ×‘×ž×§×•× ×¢×¨×š null\n"
+
+#: help.c:388
+#, c-format
+msgid ""
+" numericlocale enable or disable display of a locale-specific "
+"character to separate\n"
+" groups of digits [on, off]\n"
+msgstr ""
+" numericlocale להפעיל ×ו לבטל תצוגה של מותנית הגדרות ×זוריות כדי "
+"להפריד\n"
+" בין קבוצות של ספרות [on, off]\n"
+
+#: help.c:390
+#, c-format
+msgid ""
+" pager control when an external pager is used [yes, no, "
+"always]\n"
+msgstr ""
+" pager שליטה ×›×שר ×ž×©×ª×ž×©×™× ×‘×–×™×ž×•× ×™×ª חיצונית [כן, ל×, תמיד]\n"
+
+#: help.c:391
+#, c-format
+msgid " recordsep record (line) separator for unaligned output\n"
+msgstr " recordsep מפריד רשומות (קווי×) לפלט ×œ× ×ž×™×•×©×¨\n"
+
+#: help.c:392
+#, c-format
+msgid ""
+" recordsep_zero set record separator for unaligned output to zero byte\n"
+msgstr " recordsep_zero לקבוע מפריד לפלט ×œ× ×ž×™×•×©×¨ ל×פס בתי×\n"
+
+#: help.c:393
+#, c-format
+msgid ""
+" tableattr (or T) specify attributes for table tag in html format or "
+"proportional\n"
+" column widths for left-aligned data types in latex-"
+"longtable format\n"
+msgstr ""
+" tableattr (or T) לציין תכונות עבור תג טבלה בתבנית html ×ו רוחבי העמודות "
+"×™×—×¡×™×™× ×¢×‘×•×¨ סוגי ×”× ×ª×•× ×™× ×ž×™×•×©×¨ לשמ×ל בפורמט latex-longtable\n"
+
+#: help.c:395
+#, c-format
+msgid ""
+" title set the table title for any subsequently printed "
+"tables\n"
+msgstr ""
+" title להגדיר כותרת כותרת טבלה עבור כל טבל×ות ×שר מודפסות ל×חר "
+"מכן\n"
+
+#: help.c:396
+#, c-format
+msgid " tuples_only if set, only actual table data is shown\n"
+msgstr " tuples_only ×× × ×§×‘×¢, בפועל רק × ×ª×•× ×™× ×קטו××œ×™×™× ×‘×˜×‘×œ×” מוצגי×\n"
+
+#: help.c:397
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" להגדיר ×ת הסגנון של Unicode עבור [יחיד, כפול]\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"משתני סביבה:\n"
+
+#: help.c:406
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+"×ו \\setenv NAME [VALUE] בתוך psql\n"
+"\n"
+
+#: help.c:408
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+"×ו \\setenv NAME [VALUE] בתוך psql\n"
+"\n"
+
+#: help.c:411
+#, c-format
+msgid " COLUMNS number of columns for wrapped format\n"
+msgstr " COLUMNS מספר עמודות עבור תבנית עוטפת\n"
+
+#: help.c:412
+#, c-format
+msgid " PAGER name of external pager program\n"
+msgstr " PAGER ×©× ×ª×›× ×™×ª זימונית חיצונית\n"
+
+#: help.c:413
+#, c-format
+msgid ""
+" PGAPPNAME same as the application_name connection parameter\n"
+msgstr " PGAPPNAME כמו הפרמטר חיבור application_name\n"
+
+#: help.c:414
+#, c-format
+msgid " PGDATABASE same as the dbname connection parameter\n"
+msgstr " PGDATABASE בדיוק כמו הפרמטר חיבור dbname\n"
+
+#: help.c:415
+#, c-format
+msgid " PGHOST same as the host connection parameter\n"
+msgstr " PGHOST כמו הפרמטר חיבור מחשב מ×רח\n"
+
+#: help.c:416
+#, c-format
+msgid " PGPORT same as the port connection parameter\n"
+msgstr " PGPORT כמו הפרמטר חיבור פורט\n"
+
+#: help.c:417
+#, c-format
+msgid " PGUSER same as the user connection parameter\n"
+msgstr " PGUSER כמו הפרמטר חיבור המשתמש\n"
+
+#: help.c:418
+#, c-format
+msgid " PGPASSWORD connection password (not recommended)\n"
+msgstr " PGPASSWORD סיסמת החיבור (×œ× ×ž×•×ž×œ×¥)\n"
+
+#: help.c:419
+#, c-format
+msgid " PGPASSFILE password file name\n"
+msgstr " PGPASSFILE ×©× ×§×•×‘×¥ הסיסמה\n"
+
+#: help.c:420
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+"עורך ×שר בשימוש ×¢× ×‘×¤×§×•×“×•×ª \\e, \\ef ו- \\ev\n"
+
+#: help.c:422
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+"כיצד לציין ×ת מספר השורה בעת הפעלת העורך\n"
+
+#: help.c:424
+#, c-format
+msgid ""
+" PSQL_HISTORY alternative location for the command history file\n"
+msgstr " PSQL_HISTORY ×ž×™×§×•× ×—×œ×•×¤×™ עבור קובץ היסטורית הפקודות\n"
+
+#: help.c:425
+#, c-format
+msgid " PSQLRC alternative location for the user's .psqlrc file\n"
+msgstr " PSQLRC ×ž×™×§×•× ×—×œ×•×¤×™ עבור קובץ .psqlrc של המשתמש\n"
+
+#: help.c:426
+#, c-format
+msgid " SHELL shell used by the \\! command\n"
+msgstr "SHELL בshell ×ž×©×ª×ž×©×™× ×¢× ×¤×§×•×“×ª \\!\n"
+
+#: help.c:427
+#, c-format
+msgid " TMPDIR directory for temporary files\n"
+msgstr " TMPDIR הספריה ×œ×§×‘×¦×™× ×–×ž× ×™×™×\n"
+
+#: help.c:470
+msgid "Available help:\n"
+msgstr "עזרה זמינה:\n"
+
+#: help.c:554
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+msgstr ""
+"הפקודה: %s\n"
+"תי×ור: %s\n"
+"תחביר:\n"
+"%s\n"
+"\n"
+
+#: help.c:570
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"×ין עזרה ×–×ž×™× ×™× ×¢×‘×•×¨ '%s'.\n"
+"נסה \\h ×œ×œ× ××¨×’×•×ž× ×˜×™× ×›×“×™ לר×ות ×ת העזרה הזמינה\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %s\n"
+msgstr "×œ× × ×™×ª×Ÿ ×œ×§×¨×•× ×ž×ª×•×š קובץ הקלט: %s\n"
+
+#: input.c:471 input.c:510
+#, c-format
+msgid "could not save history to file \"%s\": %s\n"
+msgstr "×œ× × ×™×ª×Ÿ לשמור ×ת ההיסטוריה לקובץ \"%s\": %s\n"
+
+#: input.c:530
+#, c-format
+msgid "history is not supported by this installation\n"
+msgstr "ההיסטוריה ××™× ×” נתמכת על-ידי התקנה זו\n"
+
+#: large_obj.c:64
+#, c-format
+msgid "%s: not connected to a database\n"
+msgstr "%s ×ינו מחובר למסד נתוני×:\n"
+
+#: large_obj.c:83
+#, c-format
+msgid "%s: current transaction is aborted\n"
+msgstr "%s: התנועה הנוכחית בוטלה\n"
+
+#: large_obj.c:86
+#, c-format
+msgid "%s: unknown transaction status\n"
+msgstr "%s: מצב תנועה ×œ× ×™×“×•×¢\n"
+
+#: large_obj.c:287 large_obj.c:298
+msgid "ID"
+msgstr "מזהה ID"
+
+#: large_obj.c:308
+msgid "Large objects"
+msgstr "××•×‘×™×™×§×˜×™× ×’×“×•×œ×™×"
+
+#: mainloop.c:136
+#, c-format
+msgid "\\if: escaped\n"
+msgstr "\\if: נחלץ\n"
+
+#: mainloop.c:183
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "השתמש ב \"\\q\" על מנת לעזוב ×ת %s.\n"
+
+#: mainloop.c:205
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"הקלט ×”×•× dump מות×מת ×ישית PostgreSQL .\n"
+"השתמש בשורת הפקודה pg_restore כדי לשחזר ×ת dump ×”×–×” למסד נתוני×.\n"
+
+#: mainloop.c:225
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "×תה משתמש ב psql, ממשק שורת פקודה PostgreSQL."
+
+#: mainloop.c:226
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"הקלד: \\copyright עבור תנ××™ הפצה\n"
+" \\h לעזרה ×¢× ×¤×§×•×“×•×ª SQL\n"
+" \\? לעזרה ×¢× ×¤×§×•×“×•×ª psql\n"
+" \\g ×ו ×¡×™×™× ×¢× × ×§×•×“×”-פסיק כדי לבצע ש×ילתה\n"
+" \\q לסיי×\n"
+
+#: mainloop.c:339 mainloop.c:476
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block\n"
+msgstr ""
+"התעלמות מש×ילתה; השתמש ב \\endif ×ו Ctrl-C כדי לצ×ת מבלוק \\if הנוכחי\n"
+
+#: mainloop.c:494
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)\n"
+msgstr "×”×’×¢×” לסוף קובץ מבלי ×œ×ž×¦×•× ×¡×’×™×¨×” \\endif(s)\n"
+
+#: psqlscanslash.l:614
+#, c-format
+msgid "unterminated quoted string\n"
+msgstr "מחרוזת מסומנת ×œ×œ× ×¡×’×™×¨×”\n"
+
+#: psqlscanslash.l:787
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "×ין זיכרון פנוי: %s\n"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:66 sql_help.c:67
+#: sql_help.c:69 sql_help.c:71 sql_help.c:82 sql_help.c:84 sql_help.c:86
+#: sql_help.c:112 sql_help.c:118 sql_help.c:120 sql_help.c:122 sql_help.c:124
+#: sql_help.c:127 sql_help.c:129 sql_help.c:131 sql_help.c:236 sql_help.c:238
+#: sql_help.c:239 sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:264 sql_help.c:265 sql_help.c:266
+#: sql_help.c:268 sql_help.c:315 sql_help.c:317 sql_help.c:319 sql_help.c:321
+#: sql_help.c:382 sql_help.c:387 sql_help.c:389 sql_help.c:432 sql_help.c:434
+#: sql_help.c:437 sql_help.c:439 sql_help.c:506 sql_help.c:511 sql_help.c:516
+#: sql_help.c:521 sql_help.c:526 sql_help.c:575 sql_help.c:577 sql_help.c:579
+#: sql_help.c:581 sql_help.c:584 sql_help.c:586 sql_help.c:597 sql_help.c:599
+#: sql_help.c:640 sql_help.c:642 sql_help.c:644 sql_help.c:647 sql_help.c:649
+#: sql_help.c:651 sql_help.c:684 sql_help.c:688 sql_help.c:692 sql_help.c:711
+#: sql_help.c:714 sql_help.c:717 sql_help.c:746 sql_help.c:758 sql_help.c:766
+#: sql_help.c:769 sql_help.c:772 sql_help.c:787 sql_help.c:790 sql_help.c:814
+#: sql_help.c:817 sql_help.c:819 sql_help.c:821 sql_help.c:823 sql_help.c:825
+#: sql_help.c:866 sql_help.c:889 sql_help.c:900 sql_help.c:902 sql_help.c:921
+#: sql_help.c:931 sql_help.c:933 sql_help.c:935 sql_help.c:947 sql_help.c:951
+#: sql_help.c:953 sql_help.c:964 sql_help.c:966 sql_help.c:968 sql_help.c:995
+#: sql_help.c:1000 sql_help.c:1003 sql_help.c:1006 sql_help.c:1008
+#: sql_help.c:1009 sql_help.c:1010 sql_help.c:1012 sql_help.c:1103
+#: sql_help.c:1105 sql_help.c:1108 sql_help.c:1111 sql_help.c:1113
+#: sql_help.c:1115 sql_help.c:1118 sql_help.c:1121 sql_help.c:1187
+#: sql_help.c:1189 sql_help.c:1191 sql_help.c:1194 sql_help.c:1215
+#: sql_help.c:1218 sql_help.c:1221 sql_help.c:1224 sql_help.c:1228
+#: sql_help.c:1230 sql_help.c:1232 sql_help.c:1234 sql_help.c:1248
+#: sql_help.c:1251 sql_help.c:1253 sql_help.c:1255 sql_help.c:1265
+#: sql_help.c:1267 sql_help.c:1277 sql_help.c:1279 sql_help.c:1289
+#: sql_help.c:1292 sql_help.c:1314 sql_help.c:1316 sql_help.c:1318
+#: sql_help.c:1321 sql_help.c:1323 sql_help.c:1325 sql_help.c:1328
+#: sql_help.c:1378 sql_help.c:1416 sql_help.c:1419 sql_help.c:1421
+#: sql_help.c:1423 sql_help.c:1425 sql_help.c:1427 sql_help.c:1430
+#: sql_help.c:1470 sql_help.c:1681 sql_help.c:1745 sql_help.c:1764
+#: sql_help.c:1777 sql_help.c:1833 sql_help.c:1839 sql_help.c:1849
+#: sql_help.c:1869 sql_help.c:1894 sql_help.c:1912 sql_help.c:1941
+#: sql_help.c:2034 sql_help.c:2076 sql_help.c:2098 sql_help.c:2118
+#: sql_help.c:2119 sql_help.c:2154 sql_help.c:2174 sql_help.c:2196
+#: sql_help.c:2210 sql_help.c:2231 sql_help.c:2261 sql_help.c:2286
+#: sql_help.c:2332 sql_help.c:2606 sql_help.c:2619 sql_help.c:2636
+#: sql_help.c:2652 sql_help.c:2692 sql_help.c:2744 sql_help.c:2748
+#: sql_help.c:2750 sql_help.c:2756 sql_help.c:2774 sql_help.c:2801
+#: sql_help.c:2836 sql_help.c:2848 sql_help.c:2857 sql_help.c:2901
+#: sql_help.c:2915 sql_help.c:2943 sql_help.c:2951 sql_help.c:2959
+#: sql_help.c:2967 sql_help.c:2975 sql_help.c:2983 sql_help.c:2991
+#: sql_help.c:2999 sql_help.c:3008 sql_help.c:3019 sql_help.c:3027
+#: sql_help.c:3035 sql_help.c:3043 sql_help.c:3051 sql_help.c:3061
+#: sql_help.c:3070 sql_help.c:3079 sql_help.c:3087 sql_help.c:3096
+#: sql_help.c:3104 sql_help.c:3112 sql_help.c:3121 sql_help.c:3129
+#: sql_help.c:3137 sql_help.c:3145 sql_help.c:3153 sql_help.c:3161
+#: sql_help.c:3169 sql_help.c:3177 sql_help.c:3185 sql_help.c:3193
+#: sql_help.c:3201 sql_help.c:3218 sql_help.c:3227 sql_help.c:3235
+#: sql_help.c:3252 sql_help.c:3267 sql_help.c:3535 sql_help.c:3586
+#: sql_help.c:3615 sql_help.c:3623 sql_help.c:4046 sql_help.c:4094
+#: sql_help.c:4235
+msgid "name"
+msgstr "ש×"
+
+#: sql_help.c:37 sql_help.c:40 sql_help.c:43 sql_help.c:326 sql_help.c:1539
+#: sql_help.c:2916 sql_help.c:3840
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:38 sql_help.c:68 sql_help.c:83 sql_help.c:119 sql_help.c:251
+#: sql_help.c:269 sql_help.c:390 sql_help.c:438 sql_help.c:515 sql_help.c:561
+#: sql_help.c:576 sql_help.c:598 sql_help.c:648 sql_help.c:713 sql_help.c:768
+#: sql_help.c:789 sql_help.c:826 sql_help.c:867 sql_help.c:891 sql_help.c:901
+#: sql_help.c:934 sql_help.c:954 sql_help.c:967 sql_help.c:1013 sql_help.c:1112
+#: sql_help.c:1188 sql_help.c:1231 sql_help.c:1252 sql_help.c:1266
+#: sql_help.c:1278 sql_help.c:1291 sql_help.c:1322 sql_help.c:1379
+#: sql_help.c:1424
+msgid "new_name"
+msgstr "new_name"
+
+#: sql_help.c:41 sql_help.c:70 sql_help.c:85 sql_help.c:121 sql_help.c:249
+#: sql_help.c:267 sql_help.c:388 sql_help.c:474 sql_help.c:520 sql_help.c:600
+#: sql_help.c:609 sql_help.c:667 sql_help.c:687 sql_help.c:716 sql_help.c:771
+#: sql_help.c:824 sql_help.c:903 sql_help.c:932 sql_help.c:952 sql_help.c:965
+#: sql_help.c:1011 sql_help.c:1172 sql_help.c:1190 sql_help.c:1233
+#: sql_help.c:1254 sql_help.c:1317 sql_help.c:1422 sql_help.c:2592
+msgid "new_owner"
+msgstr "new_owner"
+
+#: sql_help.c:44 sql_help.c:72 sql_help.c:87 sql_help.c:253 sql_help.c:318
+#: sql_help.c:440 sql_help.c:525 sql_help.c:650 sql_help.c:691 sql_help.c:719
+#: sql_help.c:774 sql_help.c:936 sql_help.c:969 sql_help.c:1114 sql_help.c:1235
+#: sql_help.c:1256 sql_help.c:1268 sql_help.c:1280 sql_help.c:1324
+#: sql_help.c:1426
+msgid "new_schema"
+msgstr "new_schema"
+
+#: sql_help.c:45 sql_help.c:1595 sql_help.c:2917 sql_help.c:3861
+msgid "where aggregate_signature is:"
+msgstr "×יפה aggregate_signature הו×:"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:336 sql_help.c:361
+#: sql_help.c:364 sql_help.c:367 sql_help.c:507 sql_help.c:512 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:1557 sql_help.c:1596
+#: sql_help.c:1599 sql_help.c:1602 sql_help.c:1746 sql_help.c:1765
+#: sql_help.c:1768 sql_help.c:2035 sql_help.c:2918 sql_help.c:2921
+#: sql_help.c:2924 sql_help.c:3009 sql_help.c:3420 sql_help.c:3753
+#: sql_help.c:3846 sql_help.c:3862 sql_help.c:3865 sql_help.c:3868
+msgid "argmode"
+msgstr "argmode"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:337 sql_help.c:362
+#: sql_help.c:365 sql_help.c:368 sql_help.c:508 sql_help.c:513 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:1558 sql_help.c:1597
+#: sql_help.c:1600 sql_help.c:1603 sql_help.c:1747 sql_help.c:1766
+#: sql_help.c:1769 sql_help.c:2036 sql_help.c:2919 sql_help.c:2922
+#: sql_help.c:2925 sql_help.c:3010 sql_help.c:3847 sql_help.c:3863
+#: sql_help.c:3866 sql_help.c:3869
+msgid "argname"
+msgstr "argname"
+
+#: sql_help.c:48 sql_help.c:51 sql_help.c:54 sql_help.c:338 sql_help.c:363
+#: sql_help.c:366 sql_help.c:369 sql_help.c:509 sql_help.c:514 sql_help.c:519
+#: sql_help.c:524 sql_help.c:529 sql_help.c:1559 sql_help.c:1598
+#: sql_help.c:1601 sql_help.c:1604 sql_help.c:2037 sql_help.c:2920
+#: sql_help.c:2923 sql_help.c:2926 sql_help.c:3011 sql_help.c:3848
+#: sql_help.c:3864 sql_help.c:3867 sql_help.c:3870
+msgid "argtype"
+msgstr "argtype"
+
+#: sql_help.c:113 sql_help.c:385 sql_help.c:463 sql_help.c:475 sql_help.c:815
+#: sql_help.c:861 sql_help.c:949 sql_help.c:1249 sql_help.c:1373
+#: sql_help.c:1401 sql_help.c:1652 sql_help.c:1658 sql_help.c:1944
+#: sql_help.c:1985 sql_help.c:1992 sql_help.c:2001 sql_help.c:2077
+#: sql_help.c:2233 sql_help.c:2262 sql_help.c:2354 sql_help.c:2367
+#: sql_help.c:2394 sql_help.c:2621 sql_help.c:2802 sql_help.c:2824
+#: sql_help.c:3287 sql_help.c:3454
+msgid "option"
+msgstr "×ופציה"
+
+#: sql_help.c:114 sql_help.c:816 sql_help.c:862 sql_help.c:1374 sql_help.c:2078
+#: sql_help.c:2234 sql_help.c:2263 sql_help.c:2395 sql_help.c:2803
+msgid "where option can be:"
+msgstr "×יפה ×”×פשרות יכולה להיות ×חת מ:"
+
+#: sql_help.c:115 sql_help.c:1876
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:116 sql_help.c:863 sql_help.c:1375 sql_help.c:1877
+#: sql_help.c:2264 sql_help.c:2804
+msgid "connlimit"
+msgstr "connlimit"
+
+#: sql_help.c:117 sql_help.c:1878
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:123 sql_help.c:588 sql_help.c:653 sql_help.c:1117 sql_help.c:1165
+msgid "new_tablespace"
+msgstr "new_tablespace"
+
+#: sql_help.c:125 sql_help.c:128 sql_help.c:130 sql_help.c:534 sql_help.c:536
+#: sql_help.c:537 sql_help.c:870 sql_help.c:874 sql_help.c:877 sql_help.c:1024
+#: sql_help.c:1027 sql_help.c:1381 sql_help.c:1384 sql_help.c:1386
+#: sql_help.c:2046 sql_help.c:3640 sql_help.c:4035
+msgid "configuration_parameter"
+msgstr "configuration_parameter"
+
+#: sql_help.c:126 sql_help.c:386 sql_help.c:458 sql_help.c:464 sql_help.c:476
+#: sql_help.c:535 sql_help.c:583 sql_help.c:659 sql_help.c:665 sql_help.c:871
+#: sql_help.c:950 sql_help.c:1025 sql_help.c:1026 sql_help.c:1147
+#: sql_help.c:1167 sql_help.c:1193 sql_help.c:1250 sql_help.c:1382
+#: sql_help.c:1402 sql_help.c:1945 sql_help.c:1986 sql_help.c:1993
+#: sql_help.c:2002 sql_help.c:2047 sql_help.c:2048 sql_help.c:2106
+#: sql_help.c:2138 sql_help.c:2355 sql_help.c:2368 sql_help.c:2494
+#: sql_help.c:2506 sql_help.c:2519 sql_help.c:2556 sql_help.c:2578
+#: sql_help.c:2595 sql_help.c:2622 sql_help.c:2825 sql_help.c:3455
+#: sql_help.c:4036 sql_help.c:4037
+msgid "value"
+msgstr "ערך"
+
+#: sql_help.c:198
+msgid "target_role"
+msgstr "target_role"
+
+#: sql_help.c:199 sql_help.c:1928 sql_help.c:2310 sql_help.c:2315
+#: sql_help.c:3402 sql_help.c:3409 sql_help.c:3423 sql_help.c:3429
+#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762
+msgid "schema_name"
+msgstr "schema_name"
+
+#: sql_help.c:200
+msgid "abbreviated_grant_or_revoke"
+msgstr "abbreviated_grant_or_revoke"
+
+#: sql_help.c:201
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "×יפה abbreviated_grant_or_revoke ×”×•× ×חד מ:"
+
+#: sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 sql_help.c:206
+#: sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 sql_help.c:211
+#: sql_help.c:559 sql_help.c:587 sql_help.c:652 sql_help.c:792 sql_help.c:881
+#: sql_help.c:1116 sql_help.c:1389 sql_help.c:2081 sql_help.c:2082
+#: sql_help.c:2083 sql_help.c:2084 sql_help.c:2085 sql_help.c:2212
+#: sql_help.c:2267 sql_help.c:2268 sql_help.c:2269 sql_help.c:2270
+#: sql_help.c:2271 sql_help.c:2807 sql_help.c:2808 sql_help.c:2809
+#: sql_help.c:2810 sql_help.c:2811 sql_help.c:3436 sql_help.c:3437
+#: sql_help.c:3438 sql_help.c:3736 sql_help.c:3740 sql_help.c:3743
+#: sql_help.c:3745 sql_help.c:3747 sql_help.c:3749 sql_help.c:3751
+#: sql_help.c:3757 sql_help.c:3759 sql_help.c:3761 sql_help.c:3763
+#: sql_help.c:3765 sql_help.c:3767 sql_help.c:3768 sql_help.c:3769
+#: sql_help.c:4056
+msgid "role_name"
+msgstr "role_name"
+
+#: sql_help.c:237 sql_help.c:451 sql_help.c:1132 sql_help.c:1134
+#: sql_help.c:1418 sql_help.c:1897 sql_help.c:1901 sql_help.c:2005
+#: sql_help.c:2009 sql_help.c:2102 sql_help.c:2490 sql_help.c:2502
+#: sql_help.c:2515 sql_help.c:2523 sql_help.c:2534 sql_help.c:2560
+#: sql_help.c:3486 sql_help.c:3501 sql_help.c:3503 sql_help.c:3921
+#: sql_help.c:3922 sql_help.c:3931 sql_help.c:3972 sql_help.c:3973
+#: sql_help.c:3974 sql_help.c:3975 sql_help.c:3976 sql_help.c:3977
+#: sql_help.c:4010 sql_help.c:4011 sql_help.c:4016 sql_help.c:4021
+#: sql_help.c:4160 sql_help.c:4161 sql_help.c:4170 sql_help.c:4211
+#: sql_help.c:4212 sql_help.c:4213 sql_help.c:4214 sql_help.c:4215
+#: sql_help.c:4216 sql_help.c:4263 sql_help.c:4265 sql_help.c:4298
+#: sql_help.c:4354 sql_help.c:4355 sql_help.c:4364 sql_help.c:4405
+#: sql_help.c:4406 sql_help.c:4407 sql_help.c:4408 sql_help.c:4409
+#: sql_help.c:4410
+msgid "expression"
+msgstr "ביטוי"
+
+#: sql_help.c:240
+msgid "domain_constraint"
+msgstr "domain_constraint"
+
+#: sql_help.c:242 sql_help.c:244 sql_help.c:247 sql_help.c:466 sql_help.c:467
+#: sql_help.c:1109 sql_help.c:1153 sql_help.c:1154 sql_help.c:1155
+#: sql_help.c:1175 sql_help.c:1545 sql_help.c:1547 sql_help.c:1900
+#: sql_help.c:2004 sql_help.c:2008 sql_help.c:2522 sql_help.c:2533
+#: sql_help.c:3498
+msgid "constraint_name"
+msgstr "constraint_name"
+
+#: sql_help.c:245 sql_help.c:1110
+msgid "new_constraint_name"
+msgstr "new_constraint_name"
+
+#: sql_help.c:316 sql_help.c:948
+msgid "new_version"
+msgstr "new_version"
+
+#: sql_help.c:320 sql_help.c:322
+msgid "member_object"
+msgstr "×ובייקט"
+
+#: sql_help.c:323
+msgid "where member_object is:"
+msgstr "×יפה member_object הו×:"
+
+#: sql_help.c:324 sql_help.c:329 sql_help.c:330 sql_help.c:331 sql_help.c:332
+#: sql_help.c:333 sql_help.c:334 sql_help.c:339 sql_help.c:343 sql_help.c:345
+#: sql_help.c:347 sql_help.c:348 sql_help.c:349 sql_help.c:350 sql_help.c:351
+#: sql_help.c:352 sql_help.c:353 sql_help.c:354 sql_help.c:355 sql_help.c:358
+#: sql_help.c:359 sql_help.c:1537 sql_help.c:1542 sql_help.c:1549
+#: sql_help.c:1550 sql_help.c:1551 sql_help.c:1552 sql_help.c:1553
+#: sql_help.c:1554 sql_help.c:1555 sql_help.c:1560 sql_help.c:1562
+#: sql_help.c:1566 sql_help.c:1568 sql_help.c:1572 sql_help.c:1573
+#: sql_help.c:1574 sql_help.c:1577 sql_help.c:1578 sql_help.c:1579
+#: sql_help.c:1580 sql_help.c:1581 sql_help.c:1582 sql_help.c:1583
+#: sql_help.c:1584 sql_help.c:1585 sql_help.c:1586 sql_help.c:1587
+#: sql_help.c:1592 sql_help.c:1593 sql_help.c:3836 sql_help.c:3841
+#: sql_help.c:3842 sql_help.c:3843 sql_help.c:3844 sql_help.c:3850
+#: sql_help.c:3851 sql_help.c:3852 sql_help.c:3853 sql_help.c:3854
+#: sql_help.c:3855 sql_help.c:3856 sql_help.c:3857 sql_help.c:3858
+#: sql_help.c:3859
+msgid "object_name"
+msgstr "object_name"
+
+#: sql_help.c:325 sql_help.c:1538 sql_help.c:3839
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:327 sql_help.c:1540 sql_help.c:1811 sql_help.c:1815
+#: sql_help.c:1817 sql_help.c:2934
+msgid "source_type"
+msgstr "source_type"
+
+#: sql_help.c:328 sql_help.c:1541 sql_help.c:1812 sql_help.c:1816
+#: sql_help.c:1818 sql_help.c:2935
+msgid "target_type"
+msgstr "target_type"
+
+#: sql_help.c:335 sql_help.c:756 sql_help.c:1556 sql_help.c:1813
+#: sql_help.c:1852 sql_help.c:1915 sql_help.c:2155 sql_help.c:2186
+#: sql_help.c:2698 sql_help.c:3419 sql_help.c:3752 sql_help.c:3845
+#: sql_help.c:3950 sql_help.c:3954 sql_help.c:3958 sql_help.c:3961
+#: sql_help.c:4189 sql_help.c:4193 sql_help.c:4197 sql_help.c:4200
+#: sql_help.c:4383 sql_help.c:4387 sql_help.c:4391 sql_help.c:4394
+msgid "function_name"
+msgstr "function_name"
+
+#: sql_help.c:340 sql_help.c:749 sql_help.c:1563 sql_help.c:2179
+msgid "operator_name"
+msgstr "operator_name"
+
+#: sql_help.c:341 sql_help.c:685 sql_help.c:689 sql_help.c:693 sql_help.c:1564
+#: sql_help.c:2156 sql_help.c:3052
+msgid "left_type"
+msgstr "left_type"
+
+#: sql_help.c:342 sql_help.c:686 sql_help.c:690 sql_help.c:694 sql_help.c:1565
+#: sql_help.c:2157 sql_help.c:3053
+msgid "right_type"
+msgstr "right_type"
+
+#: sql_help.c:344 sql_help.c:346 sql_help.c:712 sql_help.c:715 sql_help.c:718
+#: sql_help.c:747 sql_help.c:759 sql_help.c:767 sql_help.c:770 sql_help.c:773
+#: sql_help.c:1567 sql_help.c:1569 sql_help.c:2176 sql_help.c:2197
+#: sql_help.c:2539 sql_help.c:3062 sql_help.c:3071
+msgid "index_method"
+msgstr "index_method"
+
+#: sql_help.c:356 sql_help.c:1171 sql_help.c:1588 sql_help.c:2043
+#: sql_help.c:2497 sql_help.c:2665 sql_help.c:3209 sql_help.c:3433
+#: sql_help.c:3766
+msgid "type_name"
+msgstr "type_name"
+
+#: sql_help.c:357 sql_help.c:1589 sql_help.c:2042 sql_help.c:2666
+#: sql_help.c:2892 sql_help.c:3210 sql_help.c:3425 sql_help.c:3758
+msgid "lang_name"
+msgstr "lang_name"
+
+#: sql_help.c:360
+msgid "and aggregate_signature is:"
+msgstr "×יפה aggregate_signature הו×:"
+
+#: sql_help.c:383 sql_help.c:1683 sql_help.c:1942
+msgid "handler_function"
+msgstr "handler_function"
+
+#: sql_help.c:384 sql_help.c:1943
+msgid "validator_function"
+msgstr "validator_function"
+
+#: sql_help.c:433 sql_help.c:510 sql_help.c:641 sql_help.c:1104 sql_help.c:1315
+#: sql_help.c:2530 sql_help.c:2531 sql_help.c:2547 sql_help.c:2548
+msgid "action"
+msgstr "פעולה"
+
+#: sql_help.c:435 sql_help.c:442 sql_help.c:446 sql_help.c:447 sql_help.c:450
+#: sql_help.c:452 sql_help.c:453 sql_help.c:454 sql_help.c:456 sql_help.c:459
+#: sql_help.c:461 sql_help.c:462 sql_help.c:645 sql_help.c:655 sql_help.c:657
+#: sql_help.c:660 sql_help.c:662 sql_help.c:930 sql_help.c:1106 sql_help.c:1124
+#: sql_help.c:1128 sql_help.c:1129 sql_help.c:1133 sql_help.c:1135
+#: sql_help.c:1136 sql_help.c:1137 sql_help.c:1139 sql_help.c:1142
+#: sql_help.c:1143 sql_help.c:1145 sql_help.c:1148 sql_help.c:1150
+#: sql_help.c:1417 sql_help.c:1420 sql_help.c:1440 sql_help.c:1544
+#: sql_help.c:1649 sql_help.c:1654 sql_help.c:1668 sql_help.c:1669
+#: sql_help.c:1670 sql_help.c:1983 sql_help.c:1996 sql_help.c:2040
+#: sql_help.c:2101 sql_help.c:2136 sql_help.c:2340 sql_help.c:2369
+#: sql_help.c:2370 sql_help.c:2481 sql_help.c:2489 sql_help.c:2498
+#: sql_help.c:2501 sql_help.c:2510 sql_help.c:2514 sql_help.c:2535
+#: sql_help.c:2537 sql_help.c:2544 sql_help.c:2559 sql_help.c:2576
+#: sql_help.c:2701 sql_help.c:2837 sql_help.c:3404 sql_help.c:3405
+#: sql_help.c:3485 sql_help.c:3500 sql_help.c:3502 sql_help.c:3504
+#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3838 sql_help.c:3981
+#: sql_help.c:4220 sql_help.c:4262 sql_help.c:4264 sql_help.c:4266
+#: sql_help.c:4283 sql_help.c:4286 sql_help.c:4414
+msgid "column_name"
+msgstr "column_name"
+
+#: sql_help.c:436 sql_help.c:646 sql_help.c:1107
+msgid "new_column_name"
+msgstr "new_column_name"
+
+#: sql_help.c:441 sql_help.c:531 sql_help.c:654 sql_help.c:1123 sql_help.c:1331
+msgid "where action is one of:"
+msgstr "×יפה הפעולה ×”×™× ×חת מ:"
+
+#: sql_help.c:443 sql_help.c:448 sql_help.c:922 sql_help.c:1125 sql_help.c:1130
+#: sql_help.c:1333 sql_help.c:1337 sql_help.c:1895 sql_help.c:1984
+#: sql_help.c:2175 sql_help.c:2333 sql_help.c:2482 sql_help.c:2746
+#: sql_help.c:3587
+msgid "data_type"
+msgstr "data_type"
+
+#: sql_help.c:444 sql_help.c:449 sql_help.c:1126 sql_help.c:1131
+#: sql_help.c:1334 sql_help.c:1338 sql_help.c:1896 sql_help.c:1987
+#: sql_help.c:2103 sql_help.c:2483 sql_help.c:2491 sql_help.c:2503
+#: sql_help.c:2516 sql_help.c:2747 sql_help.c:2753 sql_help.c:3495
+msgid "collation"
+msgstr "סדר ×לפביתי"
+
+#: sql_help.c:445 sql_help.c:1127 sql_help.c:1988 sql_help.c:1997
+#: sql_help.c:2484 sql_help.c:2499 sql_help.c:2511
+msgid "column_constraint"
+msgstr "column_constraint"
+
+#: sql_help.c:455 sql_help.c:656 sql_help.c:1144
+msgid "integer"
+msgstr "מספר של×"
+
+#: sql_help.c:457 sql_help.c:460 sql_help.c:658 sql_help.c:661 sql_help.c:1146
+#: sql_help.c:1149
+msgid "attribute_option"
+msgstr "attribute_option"
+
+#: sql_help.c:465 sql_help.c:1151 sql_help.c:1989 sql_help.c:1998
+#: sql_help.c:2485 sql_help.c:2500 sql_help.c:2512
+msgid "table_constraint"
+msgstr "table_constraint"
+
+#: sql_help.c:468 sql_help.c:469 sql_help.c:470 sql_help.c:471 sql_help.c:1156
+#: sql_help.c:1157 sql_help.c:1158 sql_help.c:1159 sql_help.c:1590
+msgid "trigger_name"
+msgstr "trigger_name"
+
+#: sql_help.c:472 sql_help.c:473 sql_help.c:1169 sql_help.c:1170
+#: sql_help.c:1990 sql_help.c:1995 sql_help.c:2488 sql_help.c:2509
+msgid "parent_table"
+msgstr "parent_table"
+
+#: sql_help.c:530 sql_help.c:580 sql_help.c:643 sql_help.c:1294 sql_help.c:1927
+msgid "extension_name"
+msgstr "extension_name"
+
+#: sql_help.c:532 sql_help.c:2044
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:533 sql_help.c:2045
+msgid "result_rows"
+msgstr "result_rows"
+
+#: sql_help.c:554 sql_help.c:556 sql_help.c:860 sql_help.c:868 sql_help.c:872
+#: sql_help.c:875 sql_help.c:878 sql_help.c:1372 sql_help.c:1380
+#: sql_help.c:1383 sql_help.c:1385 sql_help.c:1387 sql_help.c:2311
+#: sql_help.c:2313 sql_help.c:2316 sql_help.c:2317 sql_help.c:3403
+#: sql_help.c:3407 sql_help.c:3410 sql_help.c:3412 sql_help.c:3414
+#: sql_help.c:3416 sql_help.c:3418 sql_help.c:3424 sql_help.c:3426
+#: sql_help.c:3428 sql_help.c:3430 sql_help.c:3432 sql_help.c:3434
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:555 sql_help.c:557 sql_help.c:1399 sql_help.c:1870
+#: sql_help.c:2319 sql_help.c:2822 sql_help.c:3243 sql_help.c:4066
+msgid "user_name"
+msgstr "user_name"
+
+#: sql_help.c:558 sql_help.c:880 sql_help.c:1388 sql_help.c:2318
+#: sql_help.c:3435
+msgid "where role_specification can be:"
+msgstr "×יפה role_specification יכול להיות:"
+
+#: sql_help.c:560
+msgid "group_name"
+msgstr "group_name"
+
+#: sql_help.c:578 sql_help.c:1875 sql_help.c:2107 sql_help.c:2139
+#: sql_help.c:2495 sql_help.c:2507 sql_help.c:2520 sql_help.c:2557
+#: sql_help.c:2579 sql_help.c:2591 sql_help.c:3431 sql_help.c:3764
+msgid "tablespace_name"
+msgstr "tablespace_name"
+
+#: sql_help.c:582 sql_help.c:585 sql_help.c:664 sql_help.c:666 sql_help.c:1166
+#: sql_help.c:1168 sql_help.c:2105 sql_help.c:2137 sql_help.c:2493
+#: sql_help.c:2505 sql_help.c:2518 sql_help.c:2555 sql_help.c:2577
+msgid "storage_parameter"
+msgstr "storage_parameter"
+
+#: sql_help.c:608 sql_help.c:1561 sql_help.c:3849
+msgid "large_object_oid"
+msgstr "large_object_oid"
+
+#: sql_help.c:663 sql_help.c:1164 sql_help.c:1173 sql_help.c:1176
+#: sql_help.c:1480
+msgid "index_name"
+msgstr "index_name"
+
+#: sql_help.c:695 sql_help.c:2160
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:696 sql_help.c:2161
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:748 sql_help.c:760 sql_help.c:2178
+msgid "strategy_number"
+msgstr "strategy_number"
+
+#: sql_help.c:750 sql_help.c:751 sql_help.c:754 sql_help.c:755 sql_help.c:761
+#: sql_help.c:762 sql_help.c:764 sql_help.c:765 sql_help.c:2180 sql_help.c:2181
+#: sql_help.c:2184 sql_help.c:2185
+msgid "op_type"
+msgstr "op_type"
+
+#: sql_help.c:752 sql_help.c:2182
+msgid "sort_family_name"
+msgstr "sort_family_name"
+
+#: sql_help.c:753 sql_help.c:763 sql_help.c:2183
+msgid "support_number"
+msgstr "support_number"
+
+#: sql_help.c:757 sql_help.c:1814 sql_help.c:2187 sql_help.c:2668
+#: sql_help.c:2670
+msgid "argument_type"
+msgstr "argument_type"
+
+#: sql_help.c:788 sql_help.c:791 sql_help.c:818 sql_help.c:820 sql_help.c:822
+#: sql_help.c:890 sql_help.c:929 sql_help.c:1290 sql_help.c:1293
+#: sql_help.c:1439 sql_help.c:1479 sql_help.c:1546 sql_help.c:1571
+#: sql_help.c:1576 sql_help.c:1591 sql_help.c:1648 sql_help.c:1653
+#: sql_help.c:1982 sql_help.c:1994 sql_help.c:2099 sql_help.c:2135
+#: sql_help.c:2211 sql_help.c:2232 sql_help.c:2288 sql_help.c:2339
+#: sql_help.c:2371 sql_help.c:2480 sql_help.c:2496 sql_help.c:2508
+#: sql_help.c:2575 sql_help.c:2694 sql_help.c:2871 sql_help.c:3088
+#: sql_help.c:3113 sql_help.c:3219 sql_help.c:3401 sql_help.c:3406
+#: sql_help.c:3451 sql_help.c:3483 sql_help.c:3734 sql_help.c:3739
+#: sql_help.c:3837 sql_help.c:3936 sql_help.c:3938 sql_help.c:3987
+#: sql_help.c:4026 sql_help.c:4175 sql_help.c:4177 sql_help.c:4226
+#: sql_help.c:4260 sql_help.c:4282 sql_help.c:4284 sql_help.c:4285
+#: sql_help.c:4369 sql_help.c:4371 sql_help.c:4420
+msgid "table_name"
+msgstr "table_name"
+
+#: sql_help.c:793 sql_help.c:2213
+msgid "using_expression"
+msgstr "table_constraint_using_index"
+
+#: sql_help.c:794 sql_help.c:2214
+msgid "check_expression"
+msgstr "check_expression"
+
+#: sql_help.c:864 sql_help.c:1376 sql_help.c:2079 sql_help.c:2265
+#: sql_help.c:2805
+msgid "password"
+msgstr "סיסמ×"
+
+#: sql_help.c:865 sql_help.c:1377 sql_help.c:2080 sql_help.c:2266
+#: sql_help.c:2806
+msgid "timestamp"
+msgstr "חותמת זמן"
+
+#: sql_help.c:869 sql_help.c:873 sql_help.c:876 sql_help.c:879 sql_help.c:3411
+#: sql_help.c:3744
+msgid "database_name"
+msgstr "database_name"
+
+#: sql_help.c:923 sql_help.c:2334
+msgid "increment"
+msgstr "הגדלה"
+
+#: sql_help.c:924 sql_help.c:2335
+msgid "minvalue"
+msgstr "ערך מינימלי"
+
+#: sql_help.c:925 sql_help.c:2336
+msgid "maxvalue"
+msgstr "ערך מקסימלי"
+
+#: sql_help.c:926 sql_help.c:2337 sql_help.c:3934 sql_help.c:4024
+#: sql_help.c:4173 sql_help.c:4302 sql_help.c:4367
+msgid "start"
+msgstr "ל×תחל"
+
+#: sql_help.c:927 sql_help.c:1141
+msgid "restart"
+msgstr "הפעלה מחדש"
+
+#: sql_help.c:928 sql_help.c:2338
+msgid "cache"
+msgstr "זיכרון מטמון"
+
+#: sql_help.c:996
+msgid "suboption"
+msgstr "suboption"
+
+#: sql_help.c:997
+msgid "where suboption can be:"
+msgstr "×יפה suboption יכול להיות:"
+
+#: sql_help.c:998 sql_help.c:2396
+msgid "slot_name"
+msgstr "slot_name"
+
+#: sql_help.c:999 sql_help.c:2397
+msgid "synchronous_commit"
+msgstr "synchronous_commit"
+
+#: sql_help.c:1001 sql_help.c:2393
+msgid "publication_name"
+msgstr "publication_name"
+
+#: sql_help.c:1002 sql_help.c:1004
+msgid "puboption"
+msgstr "puboption"
+
+#: sql_help.c:1005
+msgid "where puboption can be:"
+msgstr "×יפה puboption ×™×›×•×œ×™× ×œ×”×™×•×ª:"
+
+#: sql_help.c:1007 sql_help.c:2392
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1119 sql_help.c:1122
+msgid "partition_name"
+msgstr "partition_name"
+
+#: sql_help.c:1120 sql_help.c:1999 sql_help.c:2513
+msgid "partition_bound_spec"
+msgstr "partition_bound_spec"
+
+#: sql_help.c:1138 sql_help.c:2525
+msgid "sequence_options"
+msgstr "sequence_options"
+
+#: sql_help.c:1140
+msgid "sequence_option"
+msgstr "sequence_option"
+
+#: sql_help.c:1152
+msgid "table_constraint_using_index"
+msgstr "table_constraint_using_index"
+
+#: sql_help.c:1160 sql_help.c:1161 sql_help.c:1162 sql_help.c:1163
+msgid "rewrite_rule_name"
+msgstr "rewrite_rule_name"
+
+#: sql_help.c:1174
+msgid "and table_constraint_using_index is:"
+msgstr "ו table_constraint_using_index הו×:"
+
+#: sql_help.c:1192 sql_help.c:1195 sql_help.c:2594
+msgid "tablespace_option"
+msgstr "tablespace_option"
+
+#: sql_help.c:1216 sql_help.c:1219 sql_help.c:1225 sql_help.c:1229
+msgid "token_type"
+msgstr "token_type"
+
+#: sql_help.c:1217 sql_help.c:1220
+msgid "dictionary_name"
+msgstr "dictionary_name"
+
+#: sql_help.c:1222 sql_help.c:1226
+msgid "old_dictionary"
+msgstr "old_dictionary"
+
+#: sql_help.c:1223 sql_help.c:1227
+msgid "new_dictionary"
+msgstr "new_dictionary"
+
+#: sql_help.c:1319 sql_help.c:1332 sql_help.c:1335 sql_help.c:1336
+#: sql_help.c:2745
+msgid "attribute_name"
+msgstr "attribute_name"
+
+#: sql_help.c:1320
+msgid "new_attribute_name"
+msgstr "new_attribute_name"
+
+#: sql_help.c:1326 sql_help.c:1330
+msgid "new_enum_value"
+msgstr "new_enum_value"
+
+#: sql_help.c:1327
+msgid "neighbor_enum_value"
+msgstr "neighbor_enum_value"
+
+#: sql_help.c:1329
+msgid "existing_enum_value"
+msgstr "existing_enum_value"
+
+#: sql_help.c:1400 sql_help.c:1991 sql_help.c:2000 sql_help.c:2350
+#: sql_help.c:2823 sql_help.c:3244 sql_help.c:3417 sql_help.c:3452
+#: sql_help.c:3750
+msgid "server_name"
+msgstr "server_name"
+
+#: sql_help.c:1428 sql_help.c:1431 sql_help.c:2838
+msgid "view_option_name"
+msgstr "view_option_name"
+
+#: sql_help.c:1429 sql_help.c:2839
+msgid "view_option_value"
+msgstr "view_option_value"
+
+#: sql_help.c:1454 sql_help.c:4082 sql_help.c:4084 sql_help.c:4108
+msgid "transaction_mode"
+msgstr "transaction_mode"
+
+#: sql_help.c:1455 sql_help.c:4085 sql_help.c:4109
+msgid "where transaction_mode is one of:"
+msgstr "×יפה transaction_mode ×”×•× ×חד מ:"
+
+#: sql_help.c:1543
+msgid "relation_name"
+msgstr "relation_name"
+
+#: sql_help.c:1548 sql_help.c:3413 sql_help.c:3746
+msgid "domain_name"
+msgstr "domain_name"
+
+#: sql_help.c:1570
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1575
+msgid "rule_name"
+msgstr "rule_name"
+
+#: sql_help.c:1594
+msgid "text"
+msgstr "טקסט"
+
+#: sql_help.c:1619 sql_help.c:3596 sql_help.c:3784
+msgid "transaction_id"
+msgstr "transaction_id"
+
+#: sql_help.c:1650 sql_help.c:1656 sql_help.c:3522
+msgid "filename"
+msgstr "×©× ×§×•×‘×¥"
+
+#: sql_help.c:1651 sql_help.c:1657 sql_help.c:2290 sql_help.c:2291
+#: sql_help.c:2292
+msgid "command"
+msgstr "הפקודה"
+
+#: sql_help.c:1655 sql_help.c:2140 sql_help.c:2580 sql_help.c:2840
+#: sql_help.c:2858 sql_help.c:3487
+msgid "query"
+msgstr "ש×ילתה"
+
+#: sql_help.c:1659 sql_help.c:3290
+msgid "where option can be one of:"
+msgstr "×יפה ×”×פשרות יכולה להיות ×חת מ:"
+
+#: sql_help.c:1660
+msgid "format_name"
+msgstr "format_name"
+
+#: sql_help.c:1661 sql_help.c:1662 sql_help.c:1665 sql_help.c:3291
+#: sql_help.c:3292 sql_help.c:3293 sql_help.c:3294 sql_help.c:3295
+#: sql_help.c:3296
+msgid "boolean"
+msgstr "בולי×× ×™"
+
+#: sql_help.c:1663
+msgid "delimiter_character"
+msgstr "delimiter_character"
+
+#: sql_help.c:1664
+msgid "null_string"
+msgstr "null_string"
+
+#: sql_help.c:1666
+msgid "quote_character"
+msgstr "quote_character"
+
+#: sql_help.c:1667
+msgid "escape_character"
+msgstr "escape_character"
+
+#: sql_help.c:1671
+msgid "encoding_name"
+msgstr "encoding_name"
+
+#: sql_help.c:1682
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:1748 sql_help.c:1767 sql_help.c:1770
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:1749 sql_help.c:1771 sql_help.c:1779
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:1750 sql_help.c:1772 sql_help.c:1780
+msgid "state_data_type"
+msgstr "state_data_type"
+
+#: sql_help.c:1751 sql_help.c:1773 sql_help.c:1781
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:1752 sql_help.c:1774 sql_help.c:1782
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:1753 sql_help.c:1783
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:1754 sql_help.c:1784
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:1755 sql_help.c:1785
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:1756 sql_help.c:1775 sql_help.c:1786
+msgid "initial_condition"
+msgstr "initial_condition"
+
+#: sql_help.c:1757 sql_help.c:1787
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:1758 sql_help.c:1788
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:1759 sql_help.c:1789
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:1760 sql_help.c:1790
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:1761 sql_help.c:1791
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:1762 sql_help.c:1792
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:1763 sql_help.c:1793
+msgid "sort_operator"
+msgstr "sort_operator"
+
+#: sql_help.c:1776
+msgid "or the old syntax"
+msgstr "×ו ×ת התחביר הישן"
+
+#: sql_help.c:1778
+msgid "base_type"
+msgstr "base_type"
+
+#: sql_help.c:1834
+msgid "locale"
+msgstr "הגדרות ×זוריות"
+
+#: sql_help.c:1835 sql_help.c:1873
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:1836 sql_help.c:1874
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:1837 sql_help.c:3835
+msgid "provider"
+msgstr "ספק"
+
+#: sql_help.c:1838 sql_help.c:1929
+msgid "version"
+msgstr "גירס×"
+
+#: sql_help.c:1840
+msgid "existing_collation"
+msgstr "existing_collation"
+
+#: sql_help.c:1850
+msgid "source_encoding"
+msgstr "source_encoding"
+
+#: sql_help.c:1851
+msgid "dest_encoding"
+msgstr "dest_encoding"
+
+#: sql_help.c:1871 sql_help.c:2620
+msgid "template"
+msgstr "תבנית"
+
+#: sql_help.c:1872
+msgid "encoding"
+msgstr "קידוד"
+
+#: sql_help.c:1898
+msgid "constraint"
+msgstr "×ילוץ"
+
+#: sql_help.c:1899
+msgid "where constraint is:"
+msgstr "×יפה ×ילוץ הו×:"
+
+#: sql_help.c:1913 sql_help.c:2287 sql_help.c:2693
+msgid "event"
+msgstr "×ירוע"
+
+#: sql_help.c:1914
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:1930
+msgid "old_version"
+msgstr "old_version"
+
+#: sql_help.c:2003 sql_help.c:2521
+msgid "where column_constraint is:"
+msgstr "×יפה column_constraint הו×:"
+
+#: sql_help.c:2006 sql_help.c:2038 sql_help.c:2524
+msgid "default_expr"
+msgstr "default_expr"
+
+#: sql_help.c:2007 sql_help.c:2532
+msgid "and table_constraint is:"
+msgstr "ו table_constraint הו×:"
+
+#: sql_help.c:2039
+msgid "rettype"
+msgstr "rettype"
+
+#: sql_help.c:2041
+msgid "column_type"
+msgstr "column_type"
+
+#: sql_help.c:2049
+msgid "definition"
+msgstr "הגדרה"
+
+#: sql_help.c:2050
+msgid "obj_file"
+msgstr "obj_file"
+
+#: sql_help.c:2051
+msgid "link_symbol"
+msgstr "link_symbol"
+
+#: sql_help.c:2052
+msgid "attribute"
+msgstr "תכונה"
+
+#: sql_help.c:2086 sql_help.c:2272 sql_help.c:2812
+msgid "uid"
+msgstr "מזהה uid"
+
+#: sql_help.c:2100
+msgid "method"
+msgstr "מתודה"
+
+#: sql_help.c:2104 sql_help.c:2492 sql_help.c:2504 sql_help.c:2517
+#: sql_help.c:2561 sql_help.c:3496
+msgid "opclass"
+msgstr "opclass"
+
+#: sql_help.c:2108 sql_help.c:2543
+msgid "predicate"
+msgstr "נשו×"
+
+#: sql_help.c:2120
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2121
+msgid "inline_handler"
+msgstr "inline_handler"
+
+#: sql_help.c:2122
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2158
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2159
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2177
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2188
+msgid "storage_type"
+msgstr "storage_type"
+
+#: sql_help.c:2289 sql_help.c:2697 sql_help.c:2874 sql_help.c:3506
+#: sql_help.c:3925 sql_help.c:3927 sql_help.c:4015 sql_help.c:4017
+#: sql_help.c:4164 sql_help.c:4166 sql_help.c:4269 sql_help.c:4358
+#: sql_help.c:4360
+msgid "condition"
+msgstr "מצב"
+
+#: sql_help.c:2293 sql_help.c:2700
+msgid "where event can be one of:"
+msgstr "×יפה ×”×ירוע יכול להיות ×חד מ:"
+
+#: sql_help.c:2312 sql_help.c:2314
+msgid "schema_element"
+msgstr "schema_element"
+
+#: sql_help.c:2351
+msgid "server_type"
+msgstr "server_type"
+
+#: sql_help.c:2352
+msgid "server_version"
+msgstr "server_version"
+
+#: sql_help.c:2353 sql_help.c:3415 sql_help.c:3748
+msgid "fdw_name"
+msgstr "fdw_name"
+
+#: sql_help.c:2366
+msgid "statistics_name"
+msgstr "statistics_name"
+
+#: sql_help.c:2391
+msgid "subscription_name"
+msgstr "subscription_name"
+
+#: sql_help.c:2486
+msgid "source_table"
+msgstr "source_table"
+
+#: sql_help.c:2487
+msgid "like_option"
+msgstr "sequence_option"
+
+#: sql_help.c:2526 sql_help.c:2527 sql_help.c:2536 sql_help.c:2538
+#: sql_help.c:2542
+msgid "index_parameters"
+msgstr "index_parameters"
+
+#: sql_help.c:2528 sql_help.c:2545
+msgid "reftable"
+msgstr "reftable"
+
+#: sql_help.c:2529 sql_help.c:2546
+msgid "refcolumn"
+msgstr "refcolumn"
+
+#: sql_help.c:2540
+msgid "exclude_element"
+msgstr "exclude_element"
+
+#: sql_help.c:2541 sql_help.c:3932 sql_help.c:4022 sql_help.c:4171
+#: sql_help.c:4300 sql_help.c:4365
+msgid "operator"
+msgstr "×ופרטור"
+
+#: sql_help.c:2549
+msgid "and like_option is:"
+msgstr "ו like_option הו×:"
+
+#: sql_help.c:2550
+msgid "and partition_bound_spec is:"
+msgstr "ו partition_bound_spec הו×:"
+
+#: sql_help.c:2551 sql_help.c:2552 sql_help.c:2553
+msgid "bound_literal"
+msgstr "bound_literal"
+
+#: sql_help.c:2554
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "ב××™×œ×•×¦×™× UNIQUE, PRIMARY KEY ו EXCLUDE ××¨×’×•×ž× ×˜×™× index_parameters ×”×:"
+
+#: sql_help.c:2558
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "במשפט EXCLUDE ×ופציה exclude_element ×”×™×:"
+
+#: sql_help.c:2593
+msgid "directory"
+msgstr "ספריה"
+
+#: sql_help.c:2607
+msgid "parser_name"
+msgstr "parser_name"
+
+#: sql_help.c:2608
+msgid "source_config"
+msgstr "source_config"
+
+#: sql_help.c:2637
+msgid "start_function"
+msgstr "start_function"
+
+#: sql_help.c:2638
+msgid "gettoken_function"
+msgstr "gettoken_function"
+
+#: sql_help.c:2639
+msgid "end_function"
+msgstr "end_function"
+
+#: sql_help.c:2640
+msgid "lextypes_function"
+msgstr "lextypes_function"
+
+#: sql_help.c:2641
+msgid "headline_function"
+msgstr "headline_function"
+
+#: sql_help.c:2653
+msgid "init_function"
+msgstr "init_function"
+
+#: sql_help.c:2654
+msgid "lexize_function"
+msgstr "lexize_function"
+
+#: sql_help.c:2667
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:2669
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:2695
+msgid "referenced_table_name"
+msgstr "referenced_table_name"
+
+#: sql_help.c:2696
+msgid "transition_relation_name"
+msgstr "transition_relation_name"
+
+#: sql_help.c:2699
+msgid "arguments"
+msgstr "×רגומנטי×"
+
+#: sql_help.c:2749 sql_help.c:3860
+msgid "label"
+msgstr "תווית"
+
+#: sql_help.c:2751
+msgid "subtype"
+msgstr "סוג משנה"
+
+#: sql_help.c:2752
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class"
+
+#: sql_help.c:2754
+msgid "canonical_function"
+msgstr "canonical_function"
+
+#: sql_help.c:2755
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function"
+
+#: sql_help.c:2757
+msgid "input_function"
+msgstr "input_function"
+
+#: sql_help.c:2758
+msgid "output_function"
+msgstr "output_function"
+
+#: sql_help.c:2759
+msgid "receive_function"
+msgstr "receive_function"
+
+#: sql_help.c:2760
+msgid "send_function"
+msgstr "send_function"
+
+#: sql_help.c:2761
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:2762
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:2763
+msgid "analyze_function"
+msgstr "analyze_function"
+
+#: sql_help.c:2764
+msgid "internallength"
+msgstr "internallength"
+
+#: sql_help.c:2765
+msgid "alignment"
+msgstr "יישור"
+
+#: sql_help.c:2766
+msgid "storage"
+msgstr "×חסון"
+
+#: sql_help.c:2767
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:2768
+msgid "category"
+msgstr "קטגוריה"
+
+#: sql_help.c:2769
+msgid "preferred"
+msgstr "מועדף"
+
+#: sql_help.c:2770
+msgid "default"
+msgstr "ברירת מחדל"
+
+#: sql_help.c:2771
+msgid "element"
+msgstr "×למנט"
+
+#: sql_help.c:2772
+msgid "delimiter"
+msgstr "מפריד"
+
+#: sql_help.c:2773
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:2870 sql_help.c:3482 sql_help.c:3920 sql_help.c:4009
+#: sql_help.c:4159 sql_help.c:4259 sql_help.c:4353
+msgid "with_query"
+msgstr "with_query"
+
+#: sql_help.c:2872 sql_help.c:3484 sql_help.c:3939 sql_help.c:3945
+#: sql_help.c:3948 sql_help.c:3952 sql_help.c:3956 sql_help.c:3964
+#: sql_help.c:4178 sql_help.c:4184 sql_help.c:4187 sql_help.c:4191
+#: sql_help.c:4195 sql_help.c:4203 sql_help.c:4261 sql_help.c:4372
+#: sql_help.c:4378 sql_help.c:4381 sql_help.c:4385 sql_help.c:4389
+#: sql_help.c:4397
+msgid "alias"
+msgstr "כינוי"
+
+#: sql_help.c:2873
+msgid "using_list"
+msgstr "using_list"
+
+#: sql_help.c:2875 sql_help.c:3322 sql_help.c:3563 sql_help.c:4270
+msgid "cursor_name"
+msgstr "cursor_name"
+
+#: sql_help.c:2876 sql_help.c:3490 sql_help.c:4271
+msgid "output_expression"
+msgstr "output_expression"
+
+#: sql_help.c:2877 sql_help.c:3491 sql_help.c:3923 sql_help.c:4012
+#: sql_help.c:4162 sql_help.c:4272 sql_help.c:4356
+msgid "output_name"
+msgstr "output_name"
+
+#: sql_help.c:2893
+msgid "code"
+msgstr "קוד"
+
+#: sql_help.c:3268
+msgid "parameter"
+msgstr "פרמטר"
+
+#: sql_help.c:3288 sql_help.c:3289 sql_help.c:3588
+msgid "statement"
+msgstr "משפט"
+
+#: sql_help.c:3321 sql_help.c:3562
+msgid "direction"
+msgstr "כיוון"
+
+#: sql_help.c:3323 sql_help.c:3564
+msgid "where direction can be empty or one of:"
+msgstr "×יפה כיוון יכול להיות ריק ×ו ×חד מ:"
+
+#: sql_help.c:3324 sql_help.c:3325 sql_help.c:3326 sql_help.c:3327
+#: sql_help.c:3328 sql_help.c:3565 sql_help.c:3566 sql_help.c:3567
+#: sql_help.c:3568 sql_help.c:3569 sql_help.c:3933 sql_help.c:3935
+#: sql_help.c:4023 sql_help.c:4025 sql_help.c:4172 sql_help.c:4174
+#: sql_help.c:4301 sql_help.c:4303 sql_help.c:4366 sql_help.c:4368
+msgid "count"
+msgstr "כמות"
+
+#: sql_help.c:3408 sql_help.c:3741
+msgid "sequence_name"
+msgstr "sequence_name"
+
+#: sql_help.c:3421 sql_help.c:3754
+msgid "arg_name"
+msgstr "arg_name"
+
+#: sql_help.c:3422 sql_help.c:3755
+msgid "arg_type"
+msgstr "arg_type"
+
+#: sql_help.c:3427 sql_help.c:3760
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3450
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3453
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3488
+msgid "conflict_target"
+msgstr "conflict_target"
+
+#: sql_help.c:3489
+msgid "conflict_action"
+msgstr "conflict_action"
+
+#: sql_help.c:3492
+msgid "where conflict_target can be one of:"
+msgstr "×יפה conflict_target יכול להיות ×חד מ:"
+
+#: sql_help.c:3493
+msgid "index_column_name"
+msgstr "index_column_name"
+
+#: sql_help.c:3494
+msgid "index_expression"
+msgstr "index_expression"
+
+#: sql_help.c:3497
+msgid "index_predicate"
+msgstr "×ינדקס"
+
+#: sql_help.c:3499
+msgid "and conflict_action is one of:"
+msgstr "ו conflict_action ×”×•× ×חד מ:"
+
+#: sql_help.c:3505 sql_help.c:4267
+msgid "sub-SELECT"
+msgstr "תת ש×ילתה"
+
+#: sql_help.c:3514 sql_help.c:3577 sql_help.c:4243
+msgid "channel"
+msgstr "ערוץ"
+
+#: sql_help.c:3536
+msgid "lockmode"
+msgstr "lockmode"
+
+#: sql_help.c:3537
+msgid "where lockmode is one of:"
+msgstr "×יפה lockmode ×”×•× ×חד מ:"
+
+#: sql_help.c:3578
+msgid "payload"
+msgstr "מטען"
+
+#: sql_help.c:3605
+msgid "old_role"
+msgstr "old_role"
+
+#: sql_help.c:3606
+msgid "new_role"
+msgstr "new_role"
+
+#: sql_help.c:3631 sql_help.c:3792 sql_help.c:3800
+msgid "savepoint_name"
+msgstr "savepoint_name"
+
+#: sql_help.c:3924 sql_help.c:3966 sql_help.c:3968 sql_help.c:4014
+#: sql_help.c:4163 sql_help.c:4205 sql_help.c:4207 sql_help.c:4357
+#: sql_help.c:4399 sql_help.c:4401
+msgid "from_item"
+msgstr "from_item"
+
+#: sql_help.c:3926 sql_help.c:3978 sql_help.c:4165 sql_help.c:4217
+#: sql_help.c:4359 sql_help.c:4411
+msgid "grouping_element"
+msgstr "ו grouping_element יכול להיות ×חד מ:"
+
+#: sql_help.c:3928 sql_help.c:4018 sql_help.c:4167 sql_help.c:4361
+msgid "window_name"
+msgstr "חלון"
+
+#: sql_help.c:3929 sql_help.c:4019 sql_help.c:4168 sql_help.c:4362
+msgid "window_definition"
+msgstr "הגדרה"
+
+#: sql_help.c:3930 sql_help.c:3944 sql_help.c:3982 sql_help.c:4020
+#: sql_help.c:4169 sql_help.c:4183 sql_help.c:4221 sql_help.c:4363
+#: sql_help.c:4377 sql_help.c:4415
+msgid "select"
+msgstr "בחר"
+
+#: sql_help.c:3937 sql_help.c:4176 sql_help.c:4370
+msgid "where from_item can be one of:"
+msgstr "×יפה from_item יכול להיות ×חד מ:"
+
+#: sql_help.c:3940 sql_help.c:3946 sql_help.c:3949 sql_help.c:3953
+#: sql_help.c:3965 sql_help.c:4179 sql_help.c:4185 sql_help.c:4188
+#: sql_help.c:4192 sql_help.c:4204 sql_help.c:4373 sql_help.c:4379
+#: sql_help.c:4382 sql_help.c:4386 sql_help.c:4398
+msgid "column_alias"
+msgstr "column_alias"
+
+#: sql_help.c:3941 sql_help.c:4180 sql_help.c:4374
+msgid "sampling_method"
+msgstr "שיטה"
+
+#: sql_help.c:3942 sql_help.c:3951 sql_help.c:3955 sql_help.c:3959
+#: sql_help.c:3962 sql_help.c:4181 sql_help.c:4190 sql_help.c:4194
+#: sql_help.c:4198 sql_help.c:4201 sql_help.c:4375 sql_help.c:4384
+#: sql_help.c:4388 sql_help.c:4392 sql_help.c:4395
+msgid "argument"
+msgstr "×רגומנט"
+
+#: sql_help.c:3943 sql_help.c:4182 sql_help.c:4376
+msgid "seed"
+msgstr "זרע"
+
+#: sql_help.c:3947 sql_help.c:3980 sql_help.c:4186 sql_help.c:4219
+#: sql_help.c:4380 sql_help.c:4413
+msgid "with_query_name"
+msgstr "with_query_name"
+
+#: sql_help.c:3957 sql_help.c:3960 sql_help.c:3963 sql_help.c:4196
+#: sql_help.c:4199 sql_help.c:4202 sql_help.c:4390 sql_help.c:4393
+#: sql_help.c:4396
+msgid "column_definition"
+msgstr "column_definition"
+
+#: sql_help.c:3967 sql_help.c:4206 sql_help.c:4400
+msgid "join_type"
+msgstr "join_type"
+
+#: sql_help.c:3969 sql_help.c:4208 sql_help.c:4402
+msgid "join_condition"
+msgstr "join_condition"
+
+#: sql_help.c:3970 sql_help.c:4209 sql_help.c:4403
+msgid "join_column"
+msgstr "join_column"
+
+#: sql_help.c:3971 sql_help.c:4210 sql_help.c:4404
+msgid "and grouping_element can be one of:"
+msgstr "ו grouping_element יכול להיות ×חד מ:"
+
+#: sql_help.c:3979 sql_help.c:4218 sql_help.c:4412
+msgid "and with_query is:"
+msgstr "ו with_query הו×:"
+
+#: sql_help.c:3983 sql_help.c:4222 sql_help.c:4416
+msgid "values"
+msgstr "ערכי×"
+
+#: sql_help.c:3984 sql_help.c:4223 sql_help.c:4417
+msgid "insert"
+msgstr "הכנסה"
+
+#: sql_help.c:3985 sql_help.c:4224 sql_help.c:4418
+msgid "update"
+msgstr "עדכון"
+
+#: sql_help.c:3986 sql_help.c:4225 sql_help.c:4419
+msgid "delete"
+msgstr "מחיקה"
+
+#: sql_help.c:4013
+msgid "new_table"
+msgstr "new_table"
+
+#: sql_help.c:4038
+msgid "timezone"
+msgstr "×זור זמן"
+
+#: sql_help.c:4083
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:4268
+msgid "from_list"
+msgstr "from_list"
+
+#: sql_help.c:4299
+msgid "sort_expression"
+msgstr "sort_expression"
+
+#: sql_help.c:4426 sql_help.c:5211
+msgid "abort the current transaction"
+msgstr "בטל ×ת התנועה הנוכחית"
+
+#: sql_help.c:4431
+msgid "change the definition of an aggregate function"
+msgstr "שינוי ההגדרה של פונקציית צבירה"
+
+#: sql_help.c:4436
+msgid "change the definition of a collation"
+msgstr "שינוי ההגדרה של collation"
+
+#: sql_help.c:4441
+msgid "change the definition of a conversion"
+msgstr "שינוי ההגדרה של המרה"
+
+#: sql_help.c:4446
+msgid "change a database"
+msgstr "שינוי מסד נתוני×"
+
+#: sql_help.c:4451
+msgid "define default access privileges"
+msgstr "להגדיר הרש×ות גישה ברירת המחדל"
+
+#: sql_help.c:4456
+msgid "change the definition of a domain"
+msgstr "שינוי ההגדרה של תחו×"
+
+#: sql_help.c:4461
+msgid "change the definition of an event trigger"
+msgstr "שינוי ההגדרה של טריגר ×”×ירועי×"
+
+#: sql_help.c:4466
+msgid "change the definition of an extension"
+msgstr "שינוי ההגדרה של הרחבה"
+
+#: sql_help.c:4471
+msgid "change the definition of a foreign-data wrapper"
+msgstr "שינוי ההגדרה של עטיפת × ×ª×•× ×™× ×–×¨×™×"
+
+#: sql_help.c:4476
+msgid "change the definition of a foreign table"
+msgstr "תשנה ×ת ההגדרה של טבלה זרה"
+
+#: sql_help.c:4481
+msgid "change the definition of a function"
+msgstr "שינוי ההגדרה של פונקציה"
+
+#: sql_help.c:4486
+msgid "change role name or membership"
+msgstr "שינוי ×©× ×ª×¤×§×™×“ ×ו חברות"
+
+#: sql_help.c:4491
+msgid "change the definition of an index"
+msgstr "שינוי ההגדרה של ×ינדקס"
+
+#: sql_help.c:4496
+msgid "change the definition of a procedural language"
+msgstr "שינוי ההגדרה של שפה פרוצדורלי"
+
+#: sql_help.c:4501
+msgid "change the definition of a large object"
+msgstr "שינוי ההגדרה של ×ובייקט גדול"
+
+#: sql_help.c:4506
+msgid "change the definition of a materialized view"
+msgstr "תשנה ×ת ההגדרה של תצוגה ממומשת"
+
+#: sql_help.c:4511
+msgid "change the definition of an operator"
+msgstr "שינוי ההגדרה של ×ופרטור"
+
+#: sql_help.c:4516
+msgid "change the definition of an operator class"
+msgstr "לשנות ×ת ההגדרה של מחלקת ×”×ופרטור"
+
+#: sql_help.c:4521
+msgid "change the definition of an operator family"
+msgstr "שינוי ההגדרה של משפחה של ×”×ופרטור"
+
+#: sql_help.c:4526
+msgid "change the definition of a row level security policy"
+msgstr "שינוי ההגדרה של מדיניות ×בטחה ברמת השורה"
+
+#: sql_help.c:4531
+msgid "change the definition of a publication"
+msgstr "שינוי ההגדרה של פרסו×"
+
+#: sql_help.c:4536 sql_help.c:4616
+msgid "change a database role"
+msgstr "שינוי תפקיד מסד נתוני×"
+
+#: sql_help.c:4541
+msgid "change the definition of a rule"
+msgstr "תשנה ×ת ההגדרה של כלל"
+
+#: sql_help.c:4546
+msgid "change the definition of a schema"
+msgstr "שינוי ההגדרה של סכימה"
+
+#: sql_help.c:4551
+msgid "change the definition of a sequence generator"
+msgstr "שינוי ההגדרה של מחולל רצף"
+
+#: sql_help.c:4556
+msgid "change the definition of a foreign server"
+msgstr "שינוי ההגדרה של שרת החוץ"
+
+#: sql_help.c:4561
+msgid "change the definition of a extended statistics"
+msgstr "שינוי ההגדרה של סטטיסטיקה מורחבת"
+
+#: sql_help.c:4566
+msgid "change the definition of a subscription"
+msgstr "שינוי ההגדרה של מנוי"
+
+#: sql_help.c:4571
+msgid "change a server configuration parameter"
+msgstr "שינוי פרמטר תצורת שרת"
+
+#: sql_help.c:4576
+msgid "change the definition of a table"
+msgstr "תשנה ×ת ההגדרה של טבלה"
+
+#: sql_help.c:4581
+msgid "change the definition of a tablespace"
+msgstr "תשנה ×ת ההגדרה של מרחב טבל×ות"
+
+#: sql_help.c:4586
+msgid "change the definition of a text search configuration"
+msgstr "תשנה ×ת ההגדרה של תצורת חיפוש טקסט"
+
+#: sql_help.c:4591
+msgid "change the definition of a text search dictionary"
+msgstr "תשנה ×ת ההגדרה של מילון חיפוש טקסט"
+
+#: sql_help.c:4596
+msgid "change the definition of a text search parser"
+msgstr "תשנה ×ת ההגדרה של מנתח חיפוש טקסט"
+
+#: sql_help.c:4601
+msgid "change the definition of a text search template"
+msgstr "תשנה ×ת ההגדרה של תבנית חיפוש טקסט"
+
+#: sql_help.c:4606
+msgid "change the definition of a trigger"
+msgstr "תשנה ×ת ההגדרה של טריגר"
+
+#: sql_help.c:4611
+msgid "change the definition of a type"
+msgstr "תשנה ×ת ההגדרה של סוג"
+
+#: sql_help.c:4621
+msgid "change the definition of a user mapping"
+msgstr "תשנה ×ת ההגדרה של מיפוי משתמש"
+
+#: sql_help.c:4626
+msgid "change the definition of a view"
+msgstr "תשנה ×ת ההגדרה של תצוגה"
+
+#: sql_help.c:4631
+msgid "collect statistics about a database"
+msgstr "ת×סוף × ×ª×•× ×™× ×¡×˜×˜×™×¡×˜×™×™× ×ודות מסד נתוני×"
+
+#: sql_help.c:4636 sql_help.c:5276
+msgid "start a transaction block"
+msgstr "הפעלת בלוק של טרנזקציה"
+
+#: sql_help.c:4641
+msgid "force a transaction log checkpoint"
+msgstr "תכפה על נקודת הבדיקה של יומן הטרנזקציות"
+
+#: sql_help.c:4646
+msgid "close a cursor"
+msgstr "סגור ×ת הסמן"
+
+#: sql_help.c:4651
+msgid "cluster a table according to an index"
+msgstr "×שכול טבלה לפי ×ינדקס"
+
+#: sql_help.c:4656
+msgid "define or change the comment of an object"
+msgstr "תגדיר ×ו תשנה ×ת ההערה של ×ובייקט"
+
+#: sql_help.c:4661 sql_help.c:5111
+msgid "commit the current transaction"
+msgstr "×”×©×œ× ×ת הטרנזקציה הנוכחית"
+
+#: sql_help.c:4666
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "×œ×”×©×œ×™× ×ת הטרנזקציה ×שר הוכנה ×ž×•×§×“× ×œ×§×¨×ת ביצוע דו-שלבי"
+
+#: sql_help.c:4671
+msgid "copy data between a file and a table"
+msgstr "העתק ×ת × ×ª×•× ×™× ×‘×™×Ÿ קובץ ולטבלה"
+
+#: sql_help.c:4676
+msgid "define a new access method"
+msgstr "הגדר שיטת גישה חדשה"
+
+#: sql_help.c:4681
+msgid "define a new aggregate function"
+msgstr "תגדיר ×ת פונקצית צבירה חדשה"
+
+#: sql_help.c:4686
+msgid "define a new cast"
+msgstr "תגדיר המרה חדשה"
+
+#: sql_help.c:4691
+msgid "define a new collation"
+msgstr "תגדיר ×וסף חדש"
+
+#: sql_help.c:4696
+msgid "define a new encoding conversion"
+msgstr "תגדיר המרת קידוד חדשה"
+
+#: sql_help.c:4701
+msgid "create a new database"
+msgstr "תיצור מסד × ×ª×•× ×™× ×—×“×©"
+
+#: sql_help.c:4706
+msgid "define a new domain"
+msgstr "תגדיר ×ª×—×•× ×—×“×©"
+
+#: sql_help.c:4711
+msgid "define a new event trigger"
+msgstr "תגדיר טריגר ×ירוע חדש"
+
+#: sql_help.c:4716
+msgid "install an extension"
+msgstr "התקן ×ת ההרחבה"
+
+#: sql_help.c:4721
+msgid "define a new foreign-data wrapper"
+msgstr "להגדיר עטיפת × ×ª×•× ×™× ×–×¨×™× ×—×“×©×”"
+
+#: sql_help.c:4726
+msgid "define a new foreign table"
+msgstr "להגדיר טבלה זרה חדשה"
+
+#: sql_help.c:4731
+msgid "define a new function"
+msgstr "להגדיר פונקציה חדשה"
+
+#: sql_help.c:4736 sql_help.c:4781 sql_help.c:4866
+msgid "define a new database role"
+msgstr "להגדיר תפקיד מסד × ×ª×•× ×™× ×—×“×©"
+
+#: sql_help.c:4741
+msgid "define a new index"
+msgstr "להגדיר ×ינדקס חדש"
+
+#: sql_help.c:4746
+msgid "define a new procedural language"
+msgstr "להגדיר שפה פרוצדורלית חדשה"
+
+#: sql_help.c:4751
+msgid "define a new materialized view"
+msgstr "להגדיר תצוגה ממומשת חדשה"
+
+#: sql_help.c:4756
+msgid "define a new operator"
+msgstr "להגדיר ×ופרטור חדש"
+
+#: sql_help.c:4761
+msgid "define a new operator class"
+msgstr "להגדיר מחלקה של ×ופרטור חדשה"
+
+#: sql_help.c:4766
+msgid "define a new operator family"
+msgstr "להגדיר משפחה של ×ופרטור חדשה"
+
+#: sql_help.c:4771
+msgid "define a new row level security policy for a table"
+msgstr "להגדיר מדיניות ×בטחה חדשה ברמת שורה בטבלה"
+
+#: sql_help.c:4776
+msgid "define a new publication"
+msgstr "להגדיר ×¤×¨×¡×•× ×—×“×©"
+
+#: sql_help.c:4786
+msgid "define a new rewrite rule"
+msgstr "להגדיר כלל לשכתב חדש"
+
+#: sql_help.c:4791
+msgid "define a new schema"
+msgstr "להגדיר סכימה חדשה"
+
+#: sql_help.c:4796
+msgid "define a new sequence generator"
+msgstr "להגדיר גנרטור רצף חדש"
+
+#: sql_help.c:4801
+msgid "define a new foreign server"
+msgstr "להגדיר שרת החוץ חדש"
+
+#: sql_help.c:4806
+msgid "define extended statistics"
+msgstr "להגדיר × ×ª×•× ×™× ×¡×˜×˜×™×¡×˜×™×™× ×ž×•×¨×—×‘×™×"
+
+#: sql_help.c:4811
+msgid "define a new subscription"
+msgstr "להגדיר מנוי חדש"
+
+#: sql_help.c:4816
+msgid "define a new table"
+msgstr "להגדיר טבלה חדשה"
+
+#: sql_help.c:4821 sql_help.c:5241
+msgid "define a new table from the results of a query"
+msgstr "להגדיר טבלה חדשה מתוצ×ות של ש×ילתה"
+
+#: sql_help.c:4826
+msgid "define a new tablespace"
+msgstr "להגדיר מרחב טבל×ות חדש"
+
+#: sql_help.c:4831
+msgid "define a new text search configuration"
+msgstr "להגדיר תצורה חיפוש טקסט חדשה"
+
+#: sql_help.c:4836
+msgid "define a new text search dictionary"
+msgstr "להגדיר מילון חדש של חיפוש טקסט"
+
+#: sql_help.c:4841
+msgid "define a new text search parser"
+msgstr "להגדיר מנתח החיפוש טקסט חדש"
+
+#: sql_help.c:4846
+msgid "define a new text search template"
+msgstr "להגדיר תבנית חדשה של חיפוש טקסט"
+
+#: sql_help.c:4851
+msgid "define a new transform"
+msgstr "להגדיר המרה חדשה"
+
+#: sql_help.c:4856
+msgid "define a new trigger"
+msgstr "להגדיר טריגר ×ירוע חדש"
+
+#: sql_help.c:4861
+msgid "define a new data type"
+msgstr "להגדיר סוג × ×ª×•× ×™× ×—×“×©"
+
+#: sql_help.c:4871
+msgid "define a new mapping of a user to a foreign server"
+msgstr "להגדיר מיפוי חדש של המשתמש לשרת החוץ"
+
+#: sql_help.c:4876
+msgid "define a new view"
+msgstr "להגדיר תצוגה חדשה"
+
+#: sql_help.c:4881
+msgid "deallocate a prepared statement"
+msgstr "לבטל הקצ××” של הצהרה מוכנה"
+
+#: sql_help.c:4886
+msgid "define a cursor"
+msgstr "להגדיר ×ת הסמן"
+
+#: sql_help.c:4891
+msgid "delete rows of a table"
+msgstr "למחוק שורות בטבלה"
+
+#: sql_help.c:4896
+msgid "discard session state"
+msgstr "לבטל מצב הפעלה"
+
+#: sql_help.c:4901
+msgid "execute an anonymous code block"
+msgstr "לבצע בלוק של קוד ×נונימי"
+
+#: sql_help.c:4906
+msgid "remove an access method"
+msgstr "להסיר ×ת שיטת גישה"
+
+#: sql_help.c:4911
+msgid "remove an aggregate function"
+msgstr "להסיר ×ת פונקציית צבירה"
+
+#: sql_help.c:4916
+msgid "remove a cast"
+msgstr "להסיר המרה"
+
+#: sql_help.c:4921
+msgid "remove a collation"
+msgstr "להסיר ×יסוף"
+
+#: sql_help.c:4926
+msgid "remove a conversion"
+msgstr "להסיר ×ת ההמרה"
+
+#: sql_help.c:4931
+msgid "remove a database"
+msgstr "להסיר מסד נתוני×"
+
+#: sql_help.c:4936
+msgid "remove a domain"
+msgstr "להסיר תחו×"
+
+#: sql_help.c:4941
+msgid "remove an event trigger"
+msgstr "להסיר טריגר של ×ירועי×"
+
+#: sql_help.c:4946
+msgid "remove an extension"
+msgstr "להסיר הרחבה"
+
+#: sql_help.c:4951
+msgid "remove a foreign-data wrapper"
+msgstr "להסיר ×ת עטיפת × ×ª×•× ×™× ×–×¨×™×"
+
+#: sql_help.c:4956
+msgid "remove a foreign table"
+msgstr "להסיר טבלה זרה"
+
+#: sql_help.c:4961
+msgid "remove a function"
+msgstr "להסיר פונקציה"
+
+#: sql_help.c:4966 sql_help.c:5016 sql_help.c:5096
+msgid "remove a database role"
+msgstr "להסיר תפקיד של מסד נתוני×"
+
+#: sql_help.c:4971
+msgid "remove an index"
+msgstr "להסיר ×ינדקס"
+
+#: sql_help.c:4976
+msgid "remove a procedural language"
+msgstr "להסיר שפה פרוצדורלי"
+
+#: sql_help.c:4981
+msgid "remove a materialized view"
+msgstr "להסיר תצוגת ממומשת"
+
+#: sql_help.c:4986
+msgid "remove an operator"
+msgstr "להסיר ×ת ×ופרטור"
+
+#: sql_help.c:4991
+msgid "remove an operator class"
+msgstr "להסיר מחלקה של ×ופרטור"
+
+#: sql_help.c:4996
+msgid "remove an operator family"
+msgstr "להסיר משפחה של ×”×ופרטור"
+
+#: sql_help.c:5001
+msgid "remove database objects owned by a database role"
+msgstr "להסיר ××•×‘×™×™×§×˜×™× ×©×œ מסד × ×ª×•× ×™× ×‘×‘×¢×œ×•×ª תפקיד מסד נתוני×"
+
+#: sql_help.c:5006
+msgid "remove a row level security policy from a table"
+msgstr "להסיר מדיניות ×בטחה ברמת שורה מטבלה"
+
+#: sql_help.c:5011
+msgid "remove a publication"
+msgstr "להסיר פרסו×"
+
+#: sql_help.c:5021
+msgid "remove a rewrite rule"
+msgstr "להסיר כלל לשכתב"
+
+#: sql_help.c:5026
+msgid "remove a schema"
+msgstr "להסיר סכימה"
+
+#: sql_help.c:5031
+msgid "remove a sequence"
+msgstr "להסיר ×ת רצף"
+
+#: sql_help.c:5036
+msgid "remove a foreign server descriptor"
+msgstr "להסיר מת×ר של שרת החוץ"
+
+#: sql_help.c:5041
+msgid "remove extended statistics"
+msgstr "להסיר × ×ª×•× ×™× ×¡×˜×˜×™×¡×˜×™×™× ×ž×•×¨×—×‘×™×"
+
+#: sql_help.c:5046
+msgid "remove a subscription"
+msgstr "להסיר מנוי"
+
+#: sql_help.c:5051
+msgid "remove a table"
+msgstr "להסיר טבלה"
+
+#: sql_help.c:5056
+msgid "remove a tablespace"
+msgstr "להסיר של מרחב טבל×ות"
+
+#: sql_help.c:5061
+msgid "remove a text search configuration"
+msgstr "להסיר ×ת תצורת חיפוש טקסט"
+
+#: sql_help.c:5066
+msgid "remove a text search dictionary"
+msgstr "להסיר מילון חיפוש טקסט"
+
+#: sql_help.c:5071
+msgid "remove a text search parser"
+msgstr "להסיר מנתח חיפוש טקסט"
+
+#: sql_help.c:5076
+msgid "remove a text search template"
+msgstr "להסיר תבנית חיפוש טקסט"
+
+#: sql_help.c:5081
+msgid "remove a transform"
+msgstr "להסיר המרה"
+
+#: sql_help.c:5086
+msgid "remove a trigger"
+msgstr "להסיר ×ת ההדק"
+
+#: sql_help.c:5091
+msgid "remove a data type"
+msgstr "להסיר סוג נתוני×"
+
+#: sql_help.c:5101
+msgid "remove a user mapping for a foreign server"
+msgstr "להסיר מיפוי משתמש עבור שרת החוץ"
+
+#: sql_help.c:5106
+msgid "remove a view"
+msgstr "להסיר תצוגה"
+
+#: sql_help.c:5116
+msgid "execute a prepared statement"
+msgstr "לבצע הצהרה מוכנה"
+
+#: sql_help.c:5121
+msgid "show the execution plan of a statement"
+msgstr "להציג תוכנית ביצוע של משפט"
+
+#: sql_help.c:5126
+msgid "retrieve rows from a query using a cursor"
+msgstr "להחזיר שורות מש×ילתה ב×מצעות הסמן"
+
+#: sql_help.c:5131
+msgid "define access privileges"
+msgstr "להגדיר הרש×ות גישה"
+
+#: sql_help.c:5136
+msgid "import table definitions from a foreign server"
+msgstr "×™×™×‘×•× ×”×’×“×¨×•×ª הטבלה משרת החוץ"
+
+#: sql_help.c:5141
+msgid "create new rows in a table"
+msgstr "ליצור שורות חדשות בטבלה"
+
+#: sql_help.c:5146
+msgid "listen for a notification"
+msgstr "להישמע להודעה"
+
+#: sql_help.c:5151
+msgid "load a shared library file"
+msgstr "לטעון קובץ לספריה המשותפת"
+
+#: sql_help.c:5156
+msgid "lock a table"
+msgstr "לנעול טבלה"
+
+#: sql_help.c:5161
+msgid "position a cursor"
+msgstr "×œ×ž×§× ×ת הסמן"
+
+#: sql_help.c:5166
+msgid "generate a notification"
+msgstr "ליצור הודעה"
+
+#: sql_help.c:5171
+msgid "prepare a statement for execution"
+msgstr "להכין משפט לביצוע"
+
+#: sql_help.c:5176
+msgid "prepare the current transaction for two-phase commit"
+msgstr "להכין ×ת הטרנזקציה הנוכחית עבור ביצוע דו-שלבי"
+
+#: sql_help.c:5181
+msgid "change the ownership of database objects owned by a database role"
+msgstr ""
+"לשנות ×ת הבעלות על ×ובייקטי מסד ×”× ×ª×•× ×™× ×שר בבעלות של תפקיד מסד הנתוני×"
+
+#: sql_help.c:5186
+msgid "replace the contents of a materialized view"
+msgstr "להחליף ×ת התוכן של תצוגה ממומשת"
+
+#: sql_help.c:5191
+msgid "rebuild indexes"
+msgstr "לבנות מחדש ×ינדקסי×"
+
+#: sql_help.c:5196
+msgid "destroy a previously defined savepoint"
+msgstr "להשמיד ×ת נקודת השמירה שהוגדרו בעבר"
+
+#: sql_help.c:5201
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "לשחזר ×ת הערך של פרמטר זמן ריצה לערך ברירת המחדל"
+
+#: sql_help.c:5206
+msgid "remove access privileges"
+msgstr "להסיר הרש×ות גישה"
+
+#: sql_help.c:5216
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "לבטל ×ת הטרנזקציה ×שר הוכנה ×§×•×“× ×‘×™×¦×•×¢ דו-שלבי"
+
+#: sql_help.c:5221
+msgid "roll back to a savepoint"
+msgstr "לחזור לנקודת שמירה בטרנזקציה"
+
+#: sql_help.c:5226
+msgid "define a new savepoint within the current transaction"
+msgstr "להגדיר של נקודת שמירה חדשה בתוך התנועה הנוכחית"
+
+#: sql_help.c:5231
+msgid "define or change a security label applied to an object"
+msgstr "להגדיר ×ו לשנות ×ת תווית ×”×בטחה המוצמד ל×ובייקט"
+
+#: sql_help.c:5236 sql_help.c:5281 sql_help.c:5311
+msgid "retrieve rows from a table or view"
+msgstr "ל×חזר שורות מטבלה ×ו תצוגה"
+
+#: sql_help.c:5246
+msgid "change a run-time parameter"
+msgstr "תשנה ×ת פרמטר זמן ריצה"
+
+#: sql_help.c:5251
+msgid "set constraint check timing for the current transaction"
+msgstr "להגדיר עיתוי לבדוק ×ילוץ עבור הטרנזקציה הנוכחית"
+
+#: sql_help.c:5256
+msgid "set the current user identifier of the current session"
+msgstr "לקבוע ×ת מזהה המשתמש הנוכחי של ההפעלה הנוכחית"
+
+#: sql_help.c:5261
+msgid ""
+"set the session user identifier and the current user identifier of the "
+"current session"
+msgstr "קבע ×ת מזהה המשתמש של ההפעלה ו×ת מזהה המשתמש הנוכחי של ההפעלה הנוכחית"
+
+#: sql_help.c:5266
+msgid "set the characteristics of the current transaction"
+msgstr "תגדיר ×ת המ××¤×™×™× ×™× ×©×œ הטרנזקציה הנוכחית"
+
+#: sql_help.c:5271
+msgid "show the value of a run-time parameter"
+msgstr "תציג ×ת הערך של פרמטר זמן ריצה"
+
+#: sql_help.c:5286
+msgid "empty a table or set of tables"
+msgstr "תרוקן טבלה ×ו קבוצת הטבל×ות"
+
+#: sql_help.c:5291
+msgid "stop listening for a notification"
+msgstr "×ª×¤×¡×™×§×™× ×œ×”×§×©×™×‘ עבור הודעה"
+
+#: sql_help.c:5296
+msgid "update rows of a table"
+msgstr "תעדכן שורות בטבלה"
+
+#: sql_help.c:5301
+msgid "garbage-collect and optionally analyze a database"
+msgstr "תוסוף ×שפה ו×ופציונלי תנתח ב×ופן מסד נתוני×"
+
+#: sql_help.c:5306
+msgid "compute a set of rows"
+msgstr "לחשב סידרה של שורות"
+
+#: startup.c:184
+#, c-format
+msgid "%s: -1 can only be used in non-interactive mode\n"
+msgstr "%s:-1 יכול לשמש רק במצב ש×ינו ×ינטר×קטיבי\n"
+
+#: startup.c:287
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ לפתוח קובץ יומן ×”×¨×™×©×•× \"%s\": %s\n"
+
+#: startup.c:394
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"לקבלת עזרה, נסה \"help\".\n"
+"\n"
+
+#: startup.c:543
+#, c-format
+msgid "%s: could not set printing parameter \"%s\"\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ להגדיר פרמטר הדפסה \"%s\"\n"
+
+#: startup.c:645
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s --help' לקבלת מידע נוסף.\n"
+
+#: startup.c:662
+#, c-format
+msgid "%s: warning: extra command-line argument \"%s\" ignored\n"
+msgstr "%s: ×זהרה: התעלמות מ×רגומנט שורת הפקודה נוסף \"%s\"\n"
+
+#: startup.c:711
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ª×•×›× ×™×ª הפעלה משלו\n"
+
+#: tab-complete.c:4097
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s\n"
+msgstr ""
+"השלמת הש×ילתה ×¢× ×˜×ב נכשלה: %s\n"
+"ש×ילתה היתה:\n"
+"%s\n"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": boolean expected\n"
+msgstr "ערך ×œ× ×ž×–×•×”×” \"%s\" עבור \"%s\": צפוי ערך בולי×× ×™\n"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected\n"
+msgstr "ערך ×œ× ×—×•×§×™ \"%s\" עבור \"%s\": צפוי מספר של×\n"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\"\n"
+msgstr "×©× ×ž×©×ª× ×” ×œ× ×—×•×§×™: \"%s\"\n"
+
+#: variables.c:393
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s.\n"
+msgstr ""
+"ערך ×œ× ×ž×–×•×”×” \"%s\" עבור \"%s\"\n"
+"×”×¢×¨×›×™× ×”×–×ž×™× ×™× ×”×: %s.\n"
diff --git a/src/bin/psql/po/it.po b/src/bin/psql/po/it.po
new file mode 100644
index 0000000..7f071c3
--- /dev/null
+++ b/src/bin/psql/po/it.po
@@ -0,0 +1,6643 @@
+#
+# psql.po
+# Italian message translation file for psql
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Cosimo D'Arcangelo <cosimo.darcangelo@itpug.org>
+# Massimo Mangoni <massimo.mangoni@phoops.it>
+# Mirko Tebaldi <mirkotebaldi@yahoo.it>
+# Gabriele Bartolini <gabriele.bartolini@2ndquadrant.it>
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:16+0000\n"
+"PO-Revision-Date: 2023-09-05 09:53+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "identificazione della directory corrente fallita: %m"
+
+#: ../../common/exec.c:168
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "binario non valido \"%s\""
+
+#: ../../common/exec.c:218
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "lettura del binario \"%s\" fallita"
+
+#: ../../common/exec.c:226
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "programma \"%s\" da eseguire non trovato"
+
+#: ../../common/exec.c:282 ../../common/exec.c:321
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "spostamento nella directory \"%s\" fallito: %m"
+
+#: ../../common/exec.c:299
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "lettura del link simbolico \"%s\" fallita: %m"
+
+#: ../../common/exec.c:422
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() non riuscito: %m"
+
+#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697
+#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "memoria esaurita"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "impossibile cercare l'ID utente effettivo %ld: %s"
+
+#: ../../common/username.c:45 command.c:576
+msgid "user does not exist"
+msgstr "l'utente non esiste"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ricerca del nome utente fallita: codice di errore %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "comando non eseguibile"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "comando non trovato"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "processo figlio uscito con codice di uscita %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "processo figlio terminato da eccezione 0x%X"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "processo figlio terminato da segnale %d: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "processo figlio uscito con stato non riconosciuto %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Richiesta di annullamento inviata\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Impossibile inviare la richiesta di annullamento: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu riga)"
+msgstr[1] "(%lu righe)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrotto\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Non è possibile aggiungere l'intestazione al contenuto della tabella: il numero di colonne %d è stato superato.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Non è possibile aggiungere celle al contenuto della tabella: il numero totale di celle %d è stato superato.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "il formato di output non è valido (errore interno): %d"
+
+#: ../../fe_utils/psqlscan.l:702
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "saltare l'espansione ricorsiva della variabile \"%s\""
+
+#: ../../port/thread.c:100 ../../port/thread.c:136
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "impossibile cercare l'ID utente locale %d: %s"
+
+#: ../../port/thread.c:105 ../../port/thread.c:141
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "l'utente locale con ID %d non esiste"
+
+#: command.c:233
+#, c-format
+msgid "invalid command \\%s"
+msgstr "comando errato \\%s"
+
+#: command.c:235
+#, c-format
+msgid "Try \\? for help."
+msgstr "Usa \\? per avere un aiuto."
+
+#: command.c:253
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: parametro in eccesso \"%s\" ignorato"
+
+#: command.c:305
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "comando \\%s ignorato; usa \\endif o Ctrl-C per uscire dal blocco \\if corrente"
+
+#: command.c:574
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "directory home non trovata per l'ID utente %ld: %s"
+
+#: command.c:593
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: spostamento della directory a \"%s\" fallito: %m"
+
+#: command.c:618
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Al momento non sei connesso ad un database.\n"
+
+#: command.c:628
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n"
+
+#: command.c:631
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" tramite il socket in \"%s\" porta \"%s\".\n"
+
+#: command.c:637
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" (indirizzo \"%s\") sulla porta \"%s\".\n"
+
+#: command.c:640
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n"
+
+#: command.c:1031 command.c:1126 command.c:2660
+#, c-format
+msgid "no query buffer"
+msgstr "nessun buffer query"
+
+#: command.c:1064 command.c:5497
+#, c-format
+msgid "invalid line number: %s"
+msgstr "numero di riga non valido: \"%s\""
+
+#: command.c:1202
+msgid "No changes"
+msgstr "Nessuna modifica"
+
+#: command.c:1281
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: nome codifica errato oppure non esiste una procedura di conversione"
+
+#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5599
+#: common.c:177 common.c:226 common.c:395 common.c:1137 common.c:1155
+#: common.c:1229 common.c:1336 common.c:1374 common.c:1459 common.c:1495
+#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1323
+msgid "There is no previous error."
+msgstr "Non c'è un errore precedente."
+
+#: command.c:1436
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: parentesi a destra mancanti"
+
+#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988
+#: command.c:2172 command.c:2414 command.c:2627 command.c:2667
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: parametro richiesto mancante"
+
+#: command.c:1781
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: non può apparire dopo \\else"
+
+#: command.c:1786
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: \\if corrispondente non trovato"
+
+#: command.c:1850
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: non può apparire dopo \\else"
+
+#: command.c:1855
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: \\if corrispondente non trovato"
+
+#: command.c:1895
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: \\if corrispondente non trovato"
+
+#: command.c:2052
+msgid "Query buffer is empty."
+msgstr "Il buffer query è vuoto."
+
+#: command.c:2095
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Inserisci la password per l'utente \"%s\": "
+
+#: command.c:2099
+msgid "Enter it again: "
+msgstr "Conferma password: "
+
+#: command.c:2108
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Le password non corrispondono."
+
+#: command.c:2207
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: errore nella lettura del valore della variabile"
+
+#: command.c:2310
+msgid "Query buffer reset (cleared)."
+msgstr "Buffer query resettato (svuotato)."
+
+#: command.c:2332
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Storia scritta nel file \"%s\".\n"
+
+#: command.c:2419
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: il nome della variabile d'ambiente non deve contenere \"=\""
+
+#: command.c:2467
+#, c-format
+msgid "function name is required"
+msgstr "il nome della funzione è richiesto"
+
+#: command.c:2469
+#, c-format
+msgid "view name is required"
+msgstr "il nome della vista è richiesto"
+
+#: command.c:2599
+msgid "Timing is on."
+msgstr "Controllo tempo attivato."
+
+#: command.c:2601
+msgid "Timing is off."
+msgstr "Controllo tempo disattivato."
+
+#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958
+#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014
+#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3113 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Password: "
+
+#: command.c:3118 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Inserisci la password per l'utente %s: "
+
+#: command.c:3174
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Non fornire utente, host o porta separatamente quando si utilizza una stringa di connessione"
+
+#: command.c:3209
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Non esiste alcuna connessione al database da cui riutilizzare i parametri"
+
+#: command.c:3517
+#, c-format
+msgid "Previous connection kept"
+msgstr "Connessione precedente mantenuta"
+
+#: command.c:3523
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3579
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'indirizzo \"%s\" porta \"%s\".\n"
+
+#: command.c:3582
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" tramite socket \"%s\" porta \"%s\".\n"
+
+#: command.c:3588
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" (indiirizzo \"%s\") sulla porta \"%s\".\n"
+
+#: command.c:3591
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Adesso sei collegato al database \"%s\" con nome utente \"%s\" sull'host \"%s\" porta \"%s\".\n"
+
+#: command.c:3596
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Sei collegato al database \"%s\" con nome utente \"%s\".\n"
+
+#: command.c:3636
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, server %s)\n"
+
+#: command.c:3649
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ATTENZIONE: versione maggiore %s %s, versione maggiore server %s.\n"
+" Alcune caratteristiche di psql potrebbero non funzionare.\n"
+
+#: command.c:3686
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "connessione SSL (protocollo: %s, cifrario: %s, compressione: %s)\n"
+
+#: command.c:3687 command.c:3688
+msgid "unknown"
+msgstr "sconosciuto"
+
+#: command.c:3689 help.c:42
+msgid "off"
+msgstr "disattivato"
+
+#: command.c:3689 help.c:42
+msgid "on"
+msgstr "attivato"
+
+#: command.c:3703
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Connessione crittografata GSSAPI\n"
+
+#: command.c:3723
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ATTENZIONE: Il code page della console (%u) differisce dal code page\n"
+" di Windows (%u). I caratteri a 8-bit potrebbero non\n"
+" funzionare correttamente. Vedi le pagine di riferimento\n"
+" psql \"Note per utenti Windows\" per i dettagli.\n"
+
+#: command.c:3828
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "la variabile di ambiente PSQL_EDITOR_LINENUMBER_ARG deve specificare un numero di riga"
+
+#: command.c:3857
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "avvio dell'editor \"%s\" fallito"
+
+#: command.c:3859
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "avvio di /bin/sh fallito"
+
+#: command.c:3909
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "directory temporanea non trovata: %s"
+
+#: command.c:3936
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "errore nell'apertura del file temporaneo \"%s\": %m"
+
+#: command.c:4272
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: l'abbreviazione ambigua \"%s\" corrisponde sia a \"%s\" che a \"%s\""
+
+#: command.c:4292
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: i formati consentiti sono unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms"
+
+#: command.c:4311
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: gli stili di linea permessi sono ascii, old-ascii, unicode"
+
+#: command.c:4326
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: gli stili riga Unicode dei bordi consentiti sono single, double"
+
+#: command.c:4341
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: gli stili riga Unicode delle colonne consentiti sono single, double"
+
+#: command.c:4356
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: gli stili riga Unicode delle intestazioni consentiti sono single, double"
+
+#: command.c:4399
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep deve essere un singolo carattere di un byte"
+
+#: command.c:4404
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep non può essere un apice, una nuova riga o un ritorno a capo"
+
+#: command.c:4541 command.c:4729
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: opzione sconosciuta: %s"
+
+#: command.c:4561
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Lo stile del bordo è %d.\n"
+
+#: command.c:4567
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "La lunghezza di destinazione non è impostata.\n"
+
+#: command.c:4569
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "La larghezza di destinazione è %d.\n"
+
+#: command.c:4576
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "La visualizzazione espansa è attiva.\n"
+
+#: command.c:4578
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "La visualizzazione espansa è usata automaticamente.\n"
+
+#: command.c:4580
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "La visualizzazione espansa è disattivata.\n"
+
+#: command.c:4586
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Il separatore di campo per i CSV è \"%s\".\n"
+
+#: command.c:4594 command.c:4602
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Il separatore di campo è il byte zero.\n"
+
+#: command.c:4596
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Il separatore di campo è \"%s\".\n"
+
+#: command.c:4609
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Il piè di pagina di default è attivo.\n"
+
+#: command.c:4611
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Il piè di pagina di default è disattivato.\n"
+
+#: command.c:4617
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Il formato di output è %s.\n"
+
+#: command.c:4623
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Lo stile della linea è %s.\n"
+
+#: command.c:4630
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "La visualizzazione dei null è \"%s\".\n"
+
+#: command.c:4638
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "La correzione dell'output numerico secondo il locale è attiva.\n"
+
+#: command.c:4640
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "La correzione dell'output numerico secondo il locale è disattivata.\n"
+
+#: command.c:4647
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Usa la paginazione per risultati estesi.\n"
+
+#: command.c:4649
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Paginazione sempre attiva.\n"
+
+#: command.c:4651
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Paginazione disattivata.\n"
+
+#: command.c:4657
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "La paginazione non verrà usata per meno di %d riga.\n"
+msgstr[1] "La paginazione non verrà usata per meno di %d righe.\n"
+
+#: command.c:4667 command.c:4677
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Il separatore di record è il byte zero.\n"
+
+#: command.c:4669
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Il separatore di record è <a capo>.\n"
+
+#: command.c:4671
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Il separatore di record è \"%s\".\n"
+
+#: command.c:4684
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Gli attributi di tabella sono \"%s\".\n"
+
+#: command.c:4687
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Gli attributi di tabella non sono specificati.\n"
+
+#: command.c:4694
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Il titolo è \"%s\".\n"
+
+#: command.c:4696
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Il titolo non è assegnato.\n"
+
+#: command.c:4703
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "La visualizzazione dei soli dati è attiva.\n"
+
+#: command.c:4705
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "La visualizzazione dei soli dati è disattivata.\n"
+
+#: command.c:4711
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Lo stile riga Unicode dei bordi è \"%s\".\n"
+
+#: command.c:4717
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Lo stile riga Unicode delle colonne è \"%s\".\n"
+
+#: command.c:4723
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Lo stile riga Unicode delle intestazioni è \"%s\".\n"
+
+#: command.c:4956
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: fallita"
+
+#: command.c:4990
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch non può essere usato con una query vuota"
+
+#: command.c:5022
+#, c-format
+msgid "could not set timer: %m"
+msgstr "redirezione di stderr fallita: %m"
+
+#: command.c:5084
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (ogni %gs)\n"
+
+#: command.c:5087
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (ogni %gs)\n"
+
+#: command.c:5148
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "impossibile attendere i segnali: %m"
+
+#: command.c:5206 command.c:5213 common.c:568 common.c:575 common.c:1118
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5392
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" non è una vista"
+
+#: command.c:5408
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "interpretazione dell'array reloptions fallita"
+
+#: common.c:162
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "non è possibile effettuare l'escape senza una connessione attiva"
+
+#: common.c:203
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "l'argomento del comando da shell contiene un caratteri newline o un ritorno a capo: \"%s\""
+
+#: common.c:307
+#, c-format
+msgid "connection to server was lost"
+msgstr "connessione al server persa"
+
+#: common.c:311
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Connessione al server persa. Tentativo di reset: "
+
+#: common.c:316
+#, c-format
+msgid "Failed.\n"
+msgstr "Fallito.\n"
+
+#: common.c:333
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Riuscito.\n"
+
+#: common.c:385 common.c:1054
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "rilevato PQresultStatus imprevisto: %d"
+
+#: common.c:507
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Tempo: %.3f ms\n"
+
+#: common.c:522
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:538
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:562 common.c:619 common.c:1089 describe.c:6135
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Al momento non sei connesso ad un database."
+
+#: common.c:650
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Notifica asincrona \"%s\" con payload \"%s\" ricevuta dal processo server con PID %d.\n"
+
+#: common.c:653
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Notifica asincrona \"%s\" ricevuta dal processo server con PID %d.\n"
+
+#: common.c:686 common.c:705
+#, c-format
+msgid "could not print result table: %m"
+msgstr "impossibile stampare la tabella dei risultati: %m"
+
+#: common.c:726
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "nessuna riga restituita per \\gset"
+
+#: common.c:731
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "più di una riga restituita per \\gset"
+
+#: common.c:749
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "tentativo di \\gset nella variabile \"%s\" trattata in modo speciale ignorato"
+
+#: common.c:1098
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Modalità passo singolo: verifica comando)***********************************\n"
+"%s\n"
+"***(premi invio per procedere oppure digita x ed invio per annullare)***********\n"
+
+#: common.c:1181
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "COMANDO: %s"
+
+#: common.c:1217
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "stato della transazione imprevisto (%d)"
+
+#: common.c:1358 describe.c:2020
+msgid "Column"
+msgstr "Colonna"
+
+#: common.c:1359 describe.c:170 describe.c:358 describe.c:376 describe.c:1037
+#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021
+#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504
+#: describe.c:5767
+msgid "Type"
+msgstr "Tipo"
+
+#: common.c:1408
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Il comando non ha prodotto risultati, o il risultato non ha colonne.\n"
+
+#: common.c:1561
+#, c-format
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watch non può essere usato con COPY"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: parametri richiesti"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: errore di sintassi a \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: errore di sintassi a fine riga"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "esecuzione del comando \"%s\" fallita: %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: non è possibile copiare da/a una directory"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "chiusura della pipe per verso il comando esterno fallita: %m"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "scrittura dei dati COPY fallita: %m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "trasferimento dei dati COPY fallito: %s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "annullata dall'utente"
+
+#: copy.c:541
+msgid ""
+"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."
+msgstr ""
+"Inserire i dati da copiare seguiti da un \"a capo\".\n"
+"Terminare con un backslash ed un punto su una singola riga, o un segnale EOF."
+
+#: copy.c:684
+msgid "aborted because of read failure"
+msgstr "interrotto a causa di lettura non riuscita"
+
+#: copy.c:718
+msgid "trying to exit copy mode"
+msgstr "tentativo di uscita dalla modalità copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: l'istruzione non ha restituito dati"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: la query deve restituire almeno tre colonne"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: le intestazioni verticali ed orizzontali devono essere in colonne diverse"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: la colonna dei dati deve essere specificata quando la query restituisce più di tre colonne"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: numero massimo di colonne (%d) superato"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: i risultati della query contengono più di un valore per la riga \"%s\", colonna \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: il numero di colonna %d è al di fuori dell'intervallo 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nome di colonna ambiguo: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: colonna non trovata: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029
+#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090
+#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866
+#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420
+#: describe.c:5477 describe.c:5881 describe.c:5959
+msgid "Schema"
+msgstr "Schema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636
+#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258
+#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341
+#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867
+#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410
+#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748
+#: describe.c:5957 describe.c:6186 describe.c:6494
+msgid "Name"
+msgstr "Nome"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Tipo dato del risultato"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Tipo dato dei parametri"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423
+#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041
+#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280
+#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777
+#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248
+#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422
+#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895
+#: describe.c:5960 describe.c:6992
+msgid "Description"
+msgstr "Descrizione"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Lista delle funzione aggregate"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Il server (versione %s) non supporta metodi di accesso."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Indice"
+
+#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882
+msgid "Table"
+msgstr "Tabella"
+
+#: describe.c:177 describe.c:5679
+msgid "Handler"
+msgstr "Handler"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista dei metodi di accesso"
+
+#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181
+#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588
+#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187
+#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718
+#: describe.c:6980
+msgid "Owner"
+msgstr "Proprietario"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Posizione"
+
+#: describe.c:241 describe.c:3509
+msgid "Options"
+msgstr "Opzioni"
+
+#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934
+msgid "Size"
+msgstr "Dimensione"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Lista dei tablespace"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df accetta come opzioni solo [anptwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df non accetta un'opzione \"%c\" con il server in versione %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "aggr"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "finestra"
+
+#: describe.c:356
+msgid "proc"
+msgstr "procedura"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "funzione"
+
+#: describe.c:374 describe.c:1390
+msgid "trigger"
+msgstr "trigger"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutabile"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stabile"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilità"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "ristretta"
+
+#: describe.c:398
+msgid "safe"
+msgstr "sicura"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "non sicura"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallela"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definitore"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invocatore"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Sicurezza"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Linguaggio"
+
+#: describe.c:416 describe.c:420
+msgid "Source code"
+msgstr "Codice sorgente"
+
+#: describe.c:594
+msgid "List of functions"
+msgstr "Lista delle funzioni"
+
+#: describe.c:657
+msgid "Internal name"
+msgstr "Nome interno"
+
+#: describe.c:659
+msgid "Elements"
+msgstr "Elementi"
+
+#: describe.c:711
+msgid "List of data types"
+msgstr "Lista dei tipi di dati"
+
+#: describe.c:814
+msgid "Left arg type"
+msgstr "Argomento sinistro"
+
+#: describe.c:815
+msgid "Right arg type"
+msgstr "Argomento destro"
+
+#: describe.c:816
+msgid "Result type"
+msgstr "Tipo di risultato"
+
+#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247
+#: describe.c:6909 describe.c:6913
+msgid "Function"
+msgstr "Funzione"
+
+#: describe.c:902
+msgid "List of operators"
+msgstr "Lista degli operatori"
+
+#: describe.c:938
+msgid "Encoding"
+msgstr "Codifica"
+
+#: describe.c:939 describe.c:4868
+msgid "Collate"
+msgstr "Ordinamento"
+
+#: describe.c:940 describe.c:4869
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878
+msgid "ICU Locale"
+msgstr "ICU Locale"
+
+#: describe.c:946 describe.c:952
+msgid "Locale Provider"
+msgstr "Provider di localizzazione"
+
+#: describe.c:964
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:990
+msgid "List of databases"
+msgstr "Lista dei database"
+
+#: describe.c:1031 describe.c:1184 describe.c:3882
+msgid "table"
+msgstr "tabella"
+
+#: describe.c:1032 describe.c:3883
+msgid "view"
+msgstr "vista"
+
+#: describe.c:1033 describe.c:3884
+msgid "materialized view"
+msgstr "vista materializzata"
+
+#: describe.c:1034 describe.c:1186 describe.c:3886
+msgid "sequence"
+msgstr "sequenza"
+
+#: describe.c:1035 describe.c:3888
+msgid "foreign table"
+msgstr "tabella esterna"
+
+#: describe.c:1036 describe.c:3889 describe.c:4101
+msgid "partitioned table"
+msgstr "tabella partizionata"
+
+#: describe.c:1047
+msgid "Column privileges"
+msgstr "Privilegi di colonna"
+
+#: describe.c:1078 describe.c:1112
+msgid "Policies"
+msgstr "Regole di sicurezza"
+
+#: describe.c:1143 describe.c:4510 describe.c:6577
+msgid "Access privileges"
+msgstr "Privilegi di accesso"
+
+#: describe.c:1188
+msgid "function"
+msgstr "funzione"
+
+#: describe.c:1190
+msgid "type"
+msgstr "tipo"
+
+#: describe.c:1192
+msgid "schema"
+msgstr "schema"
+
+#: describe.c:1215
+msgid "Default access privileges"
+msgstr "Privilegi di accesso di default"
+
+#: describe.c:1259
+msgid "Object"
+msgstr "Oggetto"
+
+#: describe.c:1273
+msgid "table constraint"
+msgstr "vincolo di tabella"
+
+#: describe.c:1297
+msgid "domain constraint"
+msgstr "vincolo di dominio"
+
+#: describe.c:1321
+msgid "operator class"
+msgstr "classe operatori"
+
+#: describe.c:1345
+msgid "operator family"
+msgstr "famiglia operatori"
+
+#: describe.c:1368
+msgid "rule"
+msgstr "regola"
+
+#: describe.c:1414
+msgid "Object descriptions"
+msgstr "Descrizioni oggetti"
+
+#: describe.c:1479 describe.c:4007
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Non è stata trovata nessuna relazione chiamata \"%s\"."
+
+#: describe.c:1482 describe.c:4010
+#, c-format
+msgid "Did not find any relations."
+msgstr "Non è stata trovata nessuna relazione."
+
+#: describe.c:1678
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Non è stata trovata nessuna relazione con OID %s."
+
+#: describe.c:1726 describe.c:1750
+msgid "Start"
+msgstr "Inizio"
+
+#: describe.c:1727 describe.c:1751
+msgid "Minimum"
+msgstr "Minimo"
+
+#: describe.c:1728 describe.c:1752
+msgid "Maximum"
+msgstr "Massimo"
+
+#: describe.c:1729 describe.c:1753
+msgid "Increment"
+msgstr "Incremento"
+
+#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426
+#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620
+msgid "yes"
+msgstr "sì"
+
+#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426
+#: describe.c:4768 describe.c:4892 describe.c:6621
+msgid "no"
+msgstr "no"
+
+#: describe.c:1732 describe.c:1756
+msgid "Cycles?"
+msgstr "Riparte?"
+
+#: describe.c:1733 describe.c:1757
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1798
+#, c-format
+msgid "Owned by: %s"
+msgstr "Proprietario: %s"
+
+#: describe.c:1802
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sequenza per la colonna identità: %s"
+
+#: describe.c:1810
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Sequenza non registrata \"%s.%s\""
+
+#: describe.c:1813
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sequenza \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Tabella non loggata \"%s.%s\""
+
+#: describe.c:1960
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabella \"%s.%s\""
+
+#: describe.c:1964
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vista \"%s.%s\""
+
+#: describe.c:1969
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Vista materializzata non loggata \"%s.%s\""
+
+#: describe.c:1972
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Vista materializzata \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Indice non loggato \"%s.%s\""
+
+#: describe.c:1980
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Indice \"%s.%s\""
+
+#: describe.c:1985
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Indice partizionato non registrato \"%s.%s\""
+
+#: describe.c:1988
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Indice partizionato \"%s.%s\""
+
+#: describe.c:1992
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Tabella TOAST \"%s.%s\""
+
+#: describe.c:1996
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Tipo composito \"%s.%s\""
+
+#: describe.c:2000
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Tabella esterna \"%s.%s\""
+
+#: describe.c:2005
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Tabella partizionata non registrata \"%s.%s\""
+
+#: describe.c:2008
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Tabella partizionata \"%s.%s\""
+
+#: describe.c:2024 describe.c:4343
+msgid "Collation"
+msgstr "Ordinamento"
+
+#: describe.c:2025 describe.c:4344
+msgid "Nullable"
+msgstr "Può essere null"
+
+#: describe.c:2026 describe.c:4345
+msgid "Default"
+msgstr "Default"
+
+#: describe.c:2029
+msgid "Key?"
+msgstr "Chiave?"
+
+#: describe.c:2031 describe.c:4665 describe.c:4676
+msgid "Definition"
+msgstr "Definizione"
+
+#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835
+#: describe.c:5894
+msgid "FDW options"
+msgstr "Opzioni FDW"
+
+#: describe.c:2035
+msgid "Storage"
+msgstr "Memorizzazione"
+
+#: describe.c:2037
+msgid "Compression"
+msgstr "Compression"
+
+#: describe.c:2039
+msgid "Stats target"
+msgstr "Destinazione statistiche"
+
+#: describe.c:2175
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partizione di: %s %s%s"
+
+#: describe.c:2188
+msgid "No partition constraint"
+msgstr "Nessun vincolo di partizione"
+
+#: describe.c:2190
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Vincolo di partizione: %s"
+
+#: describe.c:2214
+#, c-format
+msgid "Partition key: %s"
+msgstr "Chiave di partizione: %s"
+
+#: describe.c:2240
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Tabella proprietaria: \"%s.%s\""
+
+#: describe.c:2309
+msgid "primary key, "
+msgstr "chiave primaria, "
+
+#: describe.c:2312
+msgid "unique"
+msgstr "univoco"
+
+#: describe.c:2314
+msgid " nulls not distinct"
+msgstr " nulls non distinti"
+
+#: describe.c:2315
+msgid ", "
+msgstr ", "
+
+#: describe.c:2322
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "per la tabella \"%s.%s\""
+
+#: describe.c:2326
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicato (%s)"
+
+#: describe.c:2329
+msgid ", clustered"
+msgstr ", raggruppato"
+
+#: describe.c:2332
+msgid ", invalid"
+msgstr ", non valido"
+
+#: describe.c:2335
+msgid ", deferrable"
+msgstr ", deferibile"
+
+#: describe.c:2338
+msgid ", initially deferred"
+msgstr ", inizialmente deferito"
+
+#: describe.c:2341
+msgid ", replica identity"
+msgstr ", identità di replica"
+
+#: describe.c:2395
+msgid "Indexes:"
+msgstr "Indici:"
+
+#: describe.c:2478
+msgid "Check constraints:"
+msgstr "Vincoli di controllo:"
+
+#: describe.c:2546
+msgid "Foreign-key constraints:"
+msgstr "Vincoli di integrità referenziale:"
+
+#: describe.c:2609
+msgid "Referenced by:"
+msgstr "Referenziato da:"
+
+#: describe.c:2659
+msgid "Policies:"
+msgstr "Regole di sicurezza:"
+
+#: describe.c:2662
+msgid "Policies (forced row security enabled):"
+msgstr "Regole (sicurezza per riga forzata abilitata):"
+
+#: describe.c:2665
+msgid "Policies (row security enabled): (none)"
+msgstr "Regole (sicurezza per riga abilitata): (nessuna)"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Regole (sicurezza per riga forzata abilitata): (nessuna)"
+
+#: describe.c:2671
+msgid "Policies (row security disabled):"
+msgstr "Regole (sicurezza per riga disabilitata):"
+
+#: describe.c:2731 describe.c:2835
+msgid "Statistics objects:"
+msgstr "Oggetti statistiche:"
+
+#: describe.c:2937 describe.c:3090
+msgid "Rules:"
+msgstr "Regole:"
+
+#: describe.c:2940
+msgid "Disabled rules:"
+msgstr "Regole disabilitate:"
+
+#: describe.c:2943
+msgid "Rules firing always:"
+msgstr "Regole sempre abilitate:"
+
+#: describe.c:2946
+msgid "Rules firing on replica only:"
+msgstr "Regole abilitate solo su replica:"
+
+#: describe.c:3025 describe.c:5030
+msgid "Publications:"
+msgstr "Pubblicazioni:"
+
+#: describe.c:3073
+msgid "View definition:"
+msgstr "Definizione vista:"
+
+#: describe.c:3236
+msgid "Triggers:"
+msgstr "Trigger:"
+
+#: describe.c:3239
+msgid "Disabled user triggers:"
+msgstr "Trigger utente disabilitati:"
+
+#: describe.c:3242
+msgid "Disabled internal triggers:"
+msgstr "Trigger interni disabilitati:"
+
+#: describe.c:3245
+msgid "Triggers firing always:"
+msgstr "Trigger sempre abilitati:"
+
+#: describe.c:3248
+msgid "Triggers firing on replica only:"
+msgstr "Trigger abilitati solo su replica:"
+
+#: describe.c:3319
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3327
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Opzioni FDW (%s)"
+
+#: describe.c:3348
+msgid "Inherits"
+msgstr "Eredita"
+
+#: describe.c:3413
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Numero di partizioni: %d"
+
+#: describe.c:3422
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Numero di partizioni: %d (Usa \\d+ per elencarle.)"
+
+#: describe.c:3424
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Numero di tabelle figlio: %d (Usa \\d+ per elencarle.)"
+
+#: describe.c:3431
+msgid "Child tables"
+msgstr "Tabelle figlio"
+
+#: describe.c:3431
+msgid "Partitions"
+msgstr "Partizioni"
+
+#: describe.c:3462
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Tabella di tipo: %s"
+
+#: describe.c:3478
+msgid "Replica Identity"
+msgstr "Identità di replica"
+
+#: describe.c:3491
+msgid "Has OIDs: yes"
+msgstr "Ha OID: sì"
+
+#: describe.c:3500
+#, c-format
+msgid "Access method: %s"
+msgstr "Metodo di accesso %s"
+
+#: describe.c:3579
+#, 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:3591
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace \"%s\""
+
+#: describe.c:3668
+msgid "List of roles"
+msgstr "Lista dei ruoli"
+
+#: describe.c:3670
+msgid "Role name"
+msgstr "Nome ruolo"
+
+#: describe.c:3671
+msgid "Attributes"
+msgstr "Attributi"
+
+#: describe.c:3673
+msgid "Member of"
+msgstr "Membro di"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superutente"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Nessuna ereditarietà"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Crea ruoli"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Crea DB"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Login non possibile"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replica"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Scavalca RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Niente connessioni"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d connessione"
+msgstr[1] "%d connessioni"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Password valida fino a "
+
+#: describe.c:3777
+msgid "Role"
+msgstr "Ruolo"
+
+#: describe.c:3778
+msgid "Database"
+msgstr "Database"
+
+#: describe.c:3779
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: describe.c:3803
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\" e il database \"%s\"."
+
+#: describe.c:3806
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Non è stata trovata nessuna impostazione per il ruolo \"%s\"."
+
+#: describe.c:3809
+#, c-format
+msgid "Did not find any settings."
+msgstr "Non è stata trovata nessuna impostazione."
+
+#: describe.c:3814
+msgid "List of settings"
+msgstr "Lista delle impostazioni"
+
+#: describe.c:3885
+msgid "index"
+msgstr "indice"
+
+#: describe.c:3887
+msgid "TOAST table"
+msgstr "Tabella TOAST"
+
+#: describe.c:3890 describe.c:4102
+msgid "partitioned index"
+msgstr "indice partizionato"
+
+#: describe.c:3910
+msgid "permanent"
+msgstr "permanente"
+
+#: describe.c:3911
+msgid "temporary"
+msgstr "temporaneo"
+
+#: describe.c:3912
+msgid "unlogged"
+msgstr "non registrato"
+
+#: describe.c:3913
+msgid "Persistence"
+msgstr "Persistenza"
+
+#: describe.c:3929
+msgid "Access method"
+msgstr "Metodo di accesso"
+
+#: describe.c:4015
+msgid "List of relations"
+msgstr "Lista delle relazioni"
+
+#: describe.c:4063
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Il server (versione %s) non supporta il partizionamento dichiarativo delle tabelle."
+
+#: describe.c:4074
+msgid "List of partitioned indexes"
+msgstr "Elenco di indici partizionati"
+
+#: describe.c:4076
+msgid "List of partitioned tables"
+msgstr "Elenco delle tabelle partizionate"
+
+#: describe.c:4080
+msgid "List of partitioned relations"
+msgstr "Lista delle relazioni"
+
+#: describe.c:4111
+msgid "Parent name"
+msgstr "Nome del genitore"
+
+#: describe.c:4124
+msgid "Leaf partition size"
+msgstr "Dimensione partizione foglia"
+
+#: describe.c:4127 describe.c:4133
+msgid "Total size"
+msgstr "Dimensione totale"
+
+#: describe.c:4258
+msgid "Trusted"
+msgstr "Fidato"
+
+#: describe.c:4267
+msgid "Internal language"
+msgstr "Linguaggio interno"
+
+#: describe.c:4268
+msgid "Call handler"
+msgstr "Handler di chiamata"
+
+#: describe.c:4269 describe.c:5680
+msgid "Validator"
+msgstr "Validatore"
+
+#: describe.c:4270
+msgid "Inline handler"
+msgstr "Handler inline"
+
+#: describe.c:4305
+msgid "List of languages"
+msgstr "Lista dei linguaggi"
+
+#: describe.c:4346
+msgid "Check"
+msgstr "Controllo"
+
+#: describe.c:4390
+msgid "List of domains"
+msgstr "Lista dei domini"
+
+#: describe.c:4424
+msgid "Source"
+msgstr "Sorgente"
+
+#: describe.c:4425
+msgid "Destination"
+msgstr "Destinazione"
+
+#: describe.c:4427 describe.c:6622
+msgid "Default?"
+msgstr "Predefinito?"
+
+#: describe.c:4469
+msgid "List of conversions"
+msgstr "Lista delle conversioni"
+
+#: describe.c:4497
+msgid "Parameter"
+msgstr "Parametro"
+
+#: describe.c:4498
+msgid "Value"
+msgstr "Valore"
+
+#: describe.c:4505
+msgid "Context"
+msgstr "Contesto"
+
+#: describe.c:4538
+msgid "List of configuration parameters"
+msgstr "Elenco dei parametri di configurazione"
+
+#: describe.c:4540
+msgid "List of non-default configuration parameters"
+msgstr "Elenco dei parametri di configurazione non predefiniti"
+
+#: describe.c:4567
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Il server (versione %s) non supporta i trigger di eventi."
+
+#: describe.c:4587
+msgid "Event"
+msgstr "Evento"
+
+#: describe.c:4589
+msgid "enabled"
+msgstr "abilitato"
+
+#: describe.c:4590
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4591
+msgid "always"
+msgstr "sempre"
+
+#: describe.c:4592
+msgid "disabled"
+msgstr "disabilitato"
+
+#: describe.c:4593 describe.c:6496
+msgid "Enabled"
+msgstr "Abilitato"
+
+#: describe.c:4595
+msgid "Tags"
+msgstr "Tag"
+
+#: describe.c:4619
+msgid "List of event triggers"
+msgstr "Lista di trigger di evento"
+
+#: describe.c:4646
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Il server (versione %s) non supporta le statistiche estese."
+
+#: describe.c:4683
+msgid "Ndistinct"
+msgstr "Ndistinto"
+
+#: describe.c:4684
+msgid "Dependencies"
+msgstr "Dipendenze"
+
+#: describe.c:4694
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4718
+msgid "List of extended statistics"
+msgstr "Definisci una statistica estesa"
+
+#: describe.c:4745
+msgid "Source type"
+msgstr "Tipo di partenza"
+
+#: describe.c:4746
+msgid "Target type"
+msgstr "Tipo di arrivo"
+
+#: describe.c:4770
+msgid "in assignment"
+msgstr "in assegnazione"
+
+#: describe.c:4772
+msgid "Implicit?"
+msgstr "Implicito?"
+
+#: describe.c:4831
+msgid "List of casts"
+msgstr "Lista delle conversioni di tipo"
+
+#: describe.c:4883 describe.c:4887
+msgid "Provider"
+msgstr "Provider"
+
+#: describe.c:4893 describe.c:4898
+msgid "Deterministic?"
+msgstr "Deterministico?"
+
+#: describe.c:4938
+msgid "List of collations"
+msgstr "Lista degli ordinamenti"
+
+#: describe.c:5000
+msgid "List of schemas"
+msgstr "Lista degli schemi"
+
+#: describe.c:5117
+msgid "List of text search parsers"
+msgstr "Lista degli analizzatori di ricerca resto"
+
+#: describe.c:5167
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Non è stato trovato nessun analizzatore di ricerca testo chiamato \"%s\"."
+
+#: describe.c:5170
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Non è stato trovato nessun analizzatore di ricerca testo."
+
+#: describe.c:5245
+msgid "Start parse"
+msgstr "Inizio analisi"
+
+#: describe.c:5246
+msgid "Method"
+msgstr "Metodo"
+
+#: describe.c:5250
+msgid "Get next token"
+msgstr "Ottiene il token successivo"
+
+#: describe.c:5252
+msgid "End parse"
+msgstr "Fine analisi"
+
+#: describe.c:5254
+msgid "Get headline"
+msgstr "Ottiene intestazione"
+
+#: describe.c:5256
+msgid "Get token types"
+msgstr "Ottieni i tipi token"
+
+#: describe.c:5267
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analizzatore di ricerca teso \"%s.%s\""
+
+#: describe.c:5270
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analizzatore di ricerca testo \"%s\""
+
+#: describe.c:5289
+msgid "Token name"
+msgstr "Nome token"
+
+#: describe.c:5303
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tipi token per l'analizzatore \"%s.%s\""
+
+#: describe.c:5306
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tipi token per l'analizzatore \"%s\""
+
+#: describe.c:5350
+msgid "Template"
+msgstr "Modello"
+
+#: describe.c:5351
+msgid "Init options"
+msgstr "Opzioni iniziali"
+
+#: describe.c:5378
+msgid "List of text search dictionaries"
+msgstr "Lista dei dizionari di ricerca testo"
+
+#: describe.c:5411
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5412
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5444
+msgid "List of text search templates"
+msgstr "Lista dei modelli di ricerca testo"
+
+#: describe.c:5499
+msgid "List of text search configurations"
+msgstr "Lista delle configurazioni di ricerca testo"
+
+#: describe.c:5550
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Non è stata trovata nessuna configurazione di ricerca testo chiamata \"%s\"."
+
+#: describe.c:5553
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Non è stata trovata nessuna configurazione di ricerca testo."
+
+#: describe.c:5619
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5620
+msgid "Dictionaries"
+msgstr "Dizionari"
+
+#: describe.c:5631
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configurazione di ricerca testo \"%s.%s\""
+
+#: describe.c:5634
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configurazione di ricerca testo \"%s\""
+
+#: describe.c:5638
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analizzatore \"%s.%s\""
+
+#: describe.c:5641
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analizzatore: \"%s\""
+
+#: describe.c:5722
+msgid "List of foreign-data wrappers"
+msgstr "Lista dei wrapper di dati esterni"
+
+#: describe.c:5750
+msgid "Foreign-data wrapper"
+msgstr "Wrapper per dati esterni"
+
+#: describe.c:5768 describe.c:5958
+msgid "Version"
+msgstr "Versione"
+
+#: describe.c:5799
+msgid "List of foreign servers"
+msgstr "Lista dei server esterni"
+
+#: describe.c:5824 describe.c:5883
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5825
+msgid "User name"
+msgstr "Nome utente"
+
+#: describe.c:5855
+msgid "List of user mappings"
+msgstr "Lista delle mappature degli utenti"
+
+#: describe.c:5928
+msgid "List of foreign tables"
+msgstr "Lista delle tabelle esterne"
+
+#: describe.c:5980
+msgid "List of installed extensions"
+msgstr "Lista delle estensioni installate"
+
+#: describe.c:6028
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Non è stata trovata nessuna estensione chiamata \"%s\"."
+
+#: describe.c:6031
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Non è stata trovata nessuna estensione."
+
+#: describe.c:6075
+msgid "Object description"
+msgstr "Descrizione dell'oggetto"
+
+#: describe.c:6085
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Oggetti nell'estensione \"%s\""
+
+#: describe.c:6126
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificato improprio (troppi nomi puntati): %s"
+
+#: describe.c:6140
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "i riferimenti tra database diversi non sono implementati: %s"
+
+#: describe.c:6171 describe.c:6298
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Il server (versione %s) non supporta pubblicazioni."
+
+#: describe.c:6188 describe.c:6376
+msgid "All tables"
+msgstr "Tutte le tabelle"
+
+#: describe.c:6189 describe.c:6377
+msgid "Inserts"
+msgstr "Inserimenti"
+
+#: describe.c:6190 describe.c:6378
+msgid "Updates"
+msgstr "Modifiche"
+
+#: describe.c:6191 describe.c:6379
+msgid "Deletes"
+msgstr "Cancellazioni"
+
+#: describe.c:6195 describe.c:6381
+msgid "Truncates"
+msgstr "Troncamenti"
+
+#: describe.c:6199 describe.c:6383
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6221
+msgid "List of publications"
+msgstr "Lista delle pubblicazioni"
+
+#: describe.c:6345
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Non è stata trovata nessuna pubblicazione chiamata \"%s\"."
+
+#: describe.c:6348
+#, c-format
+msgid "Did not find any publications."
+msgstr "Non è stata trovata nessuna pubblicazione."
+
+#: describe.c:6372
+#, c-format
+msgid "Publication %s"
+msgstr "Pubblicazione %s"
+
+#: describe.c:6425
+msgid "Tables:"
+msgstr "Tabelle:"
+
+#: describe.c:6437
+msgid "Tables from schemas:"
+msgstr "Tabelle da schemi:"
+
+#: describe.c:6481
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Il server (versione %s) non supporta sottoscrizioni."
+
+#: describe.c:6497
+msgid "Publication"
+msgstr "Pubblicazione"
+
+#: describe.c:6506
+msgid "Binary"
+msgstr "Binario"
+
+#: describe.c:6507
+msgid "Streaming"
+msgstr "Streaming"
+
+#: describe.c:6514
+msgid "Two-phase commit"
+msgstr "Commit in due fasi"
+
+#: describe.c:6515
+msgid "Disable on error"
+msgstr "Disattiva in caso di errore"
+
+#: describe.c:6520
+msgid "Synchronous commit"
+msgstr "Commit sincrono"
+
+#: describe.c:6521
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6527
+msgid "Skip LSN"
+msgstr "Salta LSN"
+
+#: describe.c:6554
+msgid "List of subscriptions"
+msgstr "Lista di sottoscrizioni"
+
+#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6617
+msgid "Input type"
+msgstr "Tipo di input"
+
+#: describe.c:6618
+msgid "Storage type"
+msgstr "Tipo di archiviazione"
+
+#: describe.c:6619
+msgid "Operator class"
+msgstr "Classe operatori"
+
+#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901
+msgid "Operator family"
+msgstr "Famiglia operatori"
+
+#: describe.c:6667
+msgid "List of operator classes"
+msgstr "Elenco delle classi di operatori"
+
+#: describe.c:6714
+msgid "Applicable types"
+msgstr "Tipi applicabili"
+
+#: describe.c:6756
+msgid "List of operator families"
+msgstr "Elenco delle famiglie di operatori"
+
+#: describe.c:6807
+msgid "Operator"
+msgstr "Operatore"
+
+#: describe.c:6808
+msgid "Strategy"
+msgstr "Strategia"
+
+#: describe.c:6809
+msgid "ordering"
+msgstr "ordinare"
+
+#: describe.c:6810
+msgid "search"
+msgstr "ricerca"
+
+#: describe.c:6811
+msgid "Purpose"
+msgstr "Scopo"
+
+#: describe.c:6816
+msgid "Sort opfamily"
+msgstr "Ordina la famiglia"
+
+#: describe.c:6855
+msgid "List of operators of operator families"
+msgstr "Elenco degli operatori delle famiglie di operatori"
+
+#: describe.c:6902
+msgid "Registered left type"
+msgstr "Tipo sinistro registrato"
+
+#: describe.c:6903
+msgid "Registered right type"
+msgstr "Tipo destro registrato"
+
+#: describe.c:6904
+msgid "Number"
+msgstr "Numero"
+
+#: describe.c:6948
+msgid "List of support functions of operator families"
+msgstr "Elenco delle funzioni di supporto delle famiglie di operatori"
+
+#: describe.c:6979
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7000
+msgid "Large objects"
+msgstr "Large object"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql è il terminale interattivo per PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:393 help.c:473 help.c:516
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPZIONI]... [NOME DB [NOME UTENTE]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Opzioni generali:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr ""
+" -c, --command=COMANDO esegue solamente un comando singolo (SQL o interno)\n"
+" e termina\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=NOMEDB specifica il nome del database a cui connettersi\n"
+" (default: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=NOME FILE esegui i comandi da un file ed esci\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l --list elenca i database disponibili ed esci\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOME=VALORE\n"
+" imposta la variabile psql NOME a VALORE\n"
+" (es.: -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc non leggere il file di avvio (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"uno\"), --single-transaction\n"
+" esegui in un'unica transazione (se non interattivo)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=opzioni] mostra quest'aiuto ed esci\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands mostra la lista dei comandi backslash ed esci\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables mostra la lista delle variabili speciali ed esci\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Opzioni di input e output:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all mostra tutti gli input dallo script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors mostra i comandi falliti\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries mostra i comandi inviati al server\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden mostra le query generate dai comandi interni\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=NOME_FILE invia log di sessione al file\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline disabilita la modifica avanzata della riga\n"
+" di comando (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr ""
+" -o, --output=NOME_FILE reindirizza i risultati al file specificato\n"
+" (oppure |pipe)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet esegui in modo silenzioso (nessun messaggio, solo\n"
+" risultati query)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step modalità passo singolo (conferma ogni query)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr ""
+" -S, --single-line modalità riga singola (la fine riga termina\n"
+" il comando SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Opzioni formato output:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align modo output tabelle disallineato\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv Modalità di output della tabella CSV (valori separati da virgola).\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRINGA\n"
+" separatore di campo per output non allineato\n"
+" (default: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html modo output tabelle in HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] imposta l'opzione di stampa VAR ad ARG (vedi anche\n"
+" il comando \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRINGa\n"
+" separatore di record per output non allineato\n"
+" (default: \"a capo\")\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only mostra solo le righe\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr ""
+" -T, --table-attr=TESTO imposta gli attributi delle tabelle HTML\n"
+" (es: larghezza, bordo)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded attiva output tabelle espanso\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" usa il byte zero come separatore di campo per l'output\n"
+" non allineato\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" usa il byte zero come separatore di record per l'output\n"
+" non allineato\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME host server del database o directory socket\n"
+" (default: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "sockect locale"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORTA porta di ascolto del database (default: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=UTENTE nome utente del database (default: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non chiedere mai le password\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr ""
+" -W, --password forza la richiesta di una password (dovrebbe essere\n"
+" automatico)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Per maggiori informazioni digita \"\\?\" (per comandi interni) oppure \"\\help\"\n"
+"per comandi SQL) da psql, oppure consultare la sezione psql nella\n"
+"documentazione PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s pagina iniziale: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Generali\n"
+
+#: help.c:192
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright mostra i termini di uso e distribuzione di PostgreSQL\n"
+
+#: help.c:193
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLONNE] esegui la query e mostra il risultato in crosstab\n"
+
+#: help.c:194
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose mostra il messaggio di errore più recente alla massima loquacità\n"
+
+#: help.c:195
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPZIONI)] [FILE] esegue la query (e invia il risultato a file o |pipe);\n"
+" \\g senza argomenti equivale a un punto e virgola\n"
+
+#: help.c:197
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc descrivi il risultato della query, senza eseguirla\n"
+
+#: help.c:198
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec esegui la query, poi esegui ogni valore nel suo risultato\n"
+
+#: help.c:199
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] esegui la query e salva il risultato in una variabile psql\n"
+
+#: help.c:200
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPZIONI)] [FILE] come \\g, ma forza la modalità di output espansa\n\n"
+
+#: help.c:201
+msgid " \\q quit psql\n"
+msgstr " \\q esci da psql\n"
+
+#: help.c:202
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] esegui una query ogni SEC secondi\n"
+
+#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304
+#: help.c:324 help.c:337 help.c:346
+msgid "\n"
+msgstr "\n"
+
+#: help.c:205
+msgid "Help\n"
+msgstr "Aiuto\n"
+
+#: help.c:207
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] mostra aiuto sui comandi backslash\n"
+
+#: help.c:208
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options mostra aiuto sulle opzioni di riga di comando psql\n"
+
+#: help.c:209
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables mostra aiusto sulle variabili speciali\n"
+
+#: help.c:210
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr ""
+" \\h [NOME] mostra aiuto sulla sintassi dei comandi SQL, * mostra\n"
+" tutti i comandi\n"
+
+#: help.c:213
+msgid "Query Buffer\n"
+msgstr "Buffer Query\n"
+
+#: help.c:214
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [FILE] [RIGA] modifica il buffer della query (o il file) con\n"
+" l'editor esterno\n"
+
+#: help.c:215
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [FUNZIONE [RIGA]] modifica la definizione della funzione con l'editor\n"
+" esterno\n"
+
+#: help.c:216
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VISTA [LINE]] modifica la definizione della vista con un editor esterno\n"
+
+#: help.c:217
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p mostra i contenuti del buffer query\n"
+
+#: help.c:218
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r reimposta (cancella) il buffer query\n"
+
+#: help.c:220
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] mostra la cronologia salvala in un file\n"
+
+#: help.c:222
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE scrivi il buffer query su file\n"
+
+#: help.c:225
+msgid "Input/Output\n"
+msgstr "Input/Output\n"
+
+#: help.c:226
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... esegui una SQL COPY con flusso di dati dal client\n"
+
+#: help.c:227
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] scrive la stringa nello standard output (-n per nessuna nuova riga)\n"
+
+#: help.c:228
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE esegui i comandi dal file\n"
+
+#: help.c:229
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr ""
+" \\ir FILE come \\i, ma relativo alla posizione nello script\n"
+" corrente\n"
+
+#: help.c:230
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr ""
+" \\o [FILE] invia i risultati della query ad un file oppure\n"
+" una |pipe\n"
+
+#: help.c:231
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] scrive la stringa in \\o flusso di output (-n per nessuna nuova riga)\n\n"
+
+#: help.c:232
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] scrive la stringa nell'errore standard (-n per nessuna nuova riga)\n"
+
+#: help.c:235
+msgid "Conditional\n"
+msgstr "Condizionale\n"
+
+#: help.c:236
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if ESPR inizia un blocco condizionale\n"
+
+#: help.c:237
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif ESPR alternativa all'interno di un blocco condizionale\n"
+
+#: help.c:238
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternativa finale in un blocco condizionale\n"
+
+#: help.c:239
+msgid " \\endif end conditional block\n"
+msgstr " \\endif fine del blocco condizionale\n"
+
+#: help.c:242
+msgid "Informational\n"
+msgstr "Informativi\n"
+
+#: help.c:243
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (opzioni: S = mostra gli oggetti di sistema, + = dettagli addizionali)\n"
+
+#: help.c:244
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] elenca le tabelle, le viste e le sequenze\n"
+
+#: help.c:245
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NOME descrive la tabella, vista, sequenza o indice\n"
+
+#: help.c:246
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MODELLO] elenca le funzioni di aggregazione\n"
+
+#: help.c:247
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MODELLO] elenca i metodi di accesso\n"
+
+#: help.c:248
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] elenca le classi di operatori\n"
+
+#: help.c:249
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] elenca le famiglie di operatori\n"
+
+#: help.c:250
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] elenca gli operatori delle famiglie di operatori\n"
+
+#: help.c:251
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] elenca le funzioni di supporto delle famiglie di operatori\n"
+
+#: help.c:252
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MODELLO] elenca i tablespace\n"
+
+#: help.c:253
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MODELLO] elenca le conversioni di codifica\n"
+
+#: help.c:254
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] elenca i parametri di configurazione\n"
+
+#: help.c:255
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MODELLO] elenca le conversioni di tipo\n"
+
+#: help.c:256
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [MODELLO] mostra la descrizione di oggetti non elencati altrove\n"
+
+#: help.c:257
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MODELLO] elenca i domini\n"
+
+#: help.c:258
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MODELLO] elenca i privilegi predefiniti\n"
+
+#: help.c:259
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MODELLO] elenca le tabelle esterne\n"
+
+#: help.c:260
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MODELLO] elenca i server esterni\n"
+
+#: help.c:261
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MODELLO] elenca le tabelle esterne\n"
+
+#: help.c:262
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MODELLO] elenca le mappature degli utenti\n"
+
+#: help.c:263
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MODELLO] elenca i wrapper di dati esterni\n"
+
+#: help.c:264
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" elenco funzioni di [solo agg/normal/procedura/trigger/finestra]\n"
+
+#: help.c:266
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [MODELLO] elenca le configurazioni di ricerca testo\n"
+
+#: help.c:267
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [MODELLO] elenca i dizionari di ricerca testo\n"
+
+#: help.c:268
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [MODELLO] elenca gli analizzatori di ricerca testo\n"
+
+#: help.c:269
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [MODELLO] elenca i modelli di ricerca di testo\n"
+
+#: help.c:270
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MODELLO] elenca i ruoli\n"
+
+#: help.c:271
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MODELLO] elenca gli indici\n"
+
+#: help.c:272
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] elenca i large object, stesso risultato di \\lo_list\n"
+
+#: help.c:273
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MODELLO] elenca i linguaggi procedurali\n"
+
+#: help.c:274
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] elenca le viste materializzate\n"
+
+#: help.c:275
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MODELLO] elenca gli schemi\n"
+
+#: help.c:276
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" operatori di liste\n"
+
+#: help.c:278
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MODELLO] elenca gli ordinamenti\n"
+
+#: help.c:279
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp [MODELLO] elenca i permessi di accesso alla tabella, vista\n"
+" o sequenza\n"
+
+#: help.c:280
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] list [solo indice/tabella] relazioni partizionate [n=nidificato]\n"
+
+#: help.c:281
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] elenca le impostazioni del ruolo per database\n"
+
+#: help.c:282
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [MODELLO] elenca le pubblicazioni di replica\n"
+
+#: help.c:283
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MODELLO] elenca le sottoscrizioni di replica\n"
+
+#: help.c:284
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MODELLO] elenca le sequenze\n"
+
+#: help.c:285
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MODELLO] elenca le tabelle\n"
+
+#: help.c:286
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MODELLO] elenca i tipi di dato\n"
+
+#: help.c:287
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MODELLO] elenca i ruoli\n"
+
+#: help.c:288
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MODELLO] elenca le viste\n"
+
+#: help.c:289
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MODELLO] elenca le estensioni\n"
+
+#: help.c:290
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] elenca le statistiche estese\n"
+
+#: help.c:291
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] elenca i trigger di evento\n"
+
+#: help.c:292
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] elenca i database\n"
+
+#: help.c:293
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNZIONE mostra la definizione di una funzione\n"
+
+#: help.c:294
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VISTA mostra la definizione di una vista\n"
+
+#: help.c:295
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [MODELLO] uguale a \\dp\n"
+
+#: help.c:298
+msgid "Large Objects\n"
+msgstr "Large Object\n"
+
+#: help.c:299
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export FILE LOBOID scrive un oggetto di grandi dimensioni su un file\n"
+
+#: help.c:300
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENTO]\n"
+" leggi oggetti di grandi dimensioni da file\n"
+
+#: help.c:302
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] elenca gli oggetti di grandi dimensioni\n"
+
+#: help.c:303
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID elimina un oggetto di grandi dimensioni\n"
+
+#: help.c:306
+msgid "Formatting\n"
+msgstr "Formattazione\n"
+
+#: help.c:307
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a alterna tra modalità di output allineata e disallineata\n"
+
+#: help.c:308
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [STRINGA] imposta nome tabella oppure elimina se la stringa\n"
+" non è specificata\n"
+
+#: help.c:309
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [STRINGA] mostra o imposta il separatore di campo per l'output\n"
+" query disallineato\n"
+
+#: help.c:310
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H cambia modalità HTML (attualmente %s)\n"
+
+#: help.c:312
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOME [VALORE]] imposta opzioni di output tabella\n"
+" (NOME := {border|columns|expanded|fieldsep|fieldsep_zero|\n"
+" footer|format|linestyle|null|numericlocale|pager|\n"
+" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
+" tuples_only|unicode_border_linestyle|\n"
+" unicode_column_linestyle|unicode_header_linestyle})\n"
+
+#: help.c:319
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] mostra solo le righe (attualmente %s)\n"
+
+#: help.c:321
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [STRINGA] imposta gli attributi HTML di <table>, se non\n"
+" specificato allora annullali\n"
+
+#: help.c:322
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr ""
+" \\x [on|off|auto] cambia modalità output espansa\n"
+" (attualmente %s)\n"
+
+#: help.c:323
+msgid "auto"
+msgstr "auto"
+
+#: help.c:326
+msgid "Connection\n"
+msgstr "Connessione\n"
+
+#: help.c:328
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connetti ad un nuovo database (attualmente \"%s\")\n"
+
+#: help.c:332
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connetti ad un nuovo database (nessuna connessione attiva)\n"
+
+#: help.c:334
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo mostra le informazioni su la connessione corrente\n"
+
+#: help.c:335
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [CODIFICA] mostra o imposta la codifica del client\n"
+
+#: help.c:336
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [UTENTE] cambia la password per un utente in sicurezza\n"
+
+#: help.c:339
+msgid "Operating System\n"
+msgstr "Sistema operativo\n"
+
+#: help.c:340
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIRECTORY] cambia la directory di lavoro\n"
+
+#: help.c:341
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR recupera la variabile di ambiente\n"
+
+#: help.c:342
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NOME [VALORE] imposta o elimina una variabile d'ambiente\n"
+
+#: help.c:343
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr ""
+" \\timing [on|off] imposta cronometro dei comandi\n"
+" (attualmente %s)\n"
+
+#: help.c:345
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [COMANDO] esegui un comando in una shell oppure avvia una shell\n"
+" interattiva\n"
+
+#: help.c:348
+msgid "Variables\n"
+msgstr "Variabili\n"
+
+#: help.c:349
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TESTO] NOME richiedi all'utente di impostare una variabile interna\n"
+
+#: help.c:350
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NOME [VALORE]] imposta una variabile interna, oppure mostrale tutte\n"
+" se non sono specificati parametri\n"
+
+#: help.c:351
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOME cancella una variabile interna\n"
+
+#: help.c:390
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Lista delle variabili speciali\n"
+"\n"
+
+#: help.c:392
+msgid "psql variables:\n"
+msgstr "variabili psql:\n"
+
+#: help.c:394
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOME=VALORE\n"
+" oppure \\set NOME VALORE dentro psql\n"
+"\n"
+
+#: help.c:396
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" se impostato, i comandi SQL riusciti sono salvati automaticamente\n"
+
+#: help.c:398
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" determina il caso usato per completare le parole chiave SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:401
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" il nome del database attualmente connesso\n"
+
+#: help.c:403
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" controlla quale input è scritto su standard output\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:406
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" se impostato, mostra le query interne dei comandi backslash;\n"
+" se impostato a \"noexec\", mostrale solo senza eseguirle\n"
+
+#: help.c:409
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" codifica del set di caratteri del client corrente\n"
+
+#: help.c:411
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" true se l'ultima query è fallita, altrimenti false\n"
+
+#: help.c:413
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" il numero di righe del risultato da leggere e mostrare per volta (0 = tutte)\n"
+
+#: help.c:415
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" se impostato, i metodi di accesso alla tabella non vengono visualizzati\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" se impostato, i metodi di compressione non vengono visualizzati\n"
+
+#: help.c:419
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" controlla la storia dei comandi [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:421
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" nome del file usato per memorizzare la storia dei comandi\n"
+
+#: help.c:423
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" numero massimo di comandi da salvare nella storia dei comandi\n"
+
+#: help.c:425
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" l'host del server del database attualmente connesso\n"
+
+#: help.c:427
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" numero di EOF richiesti per terminare una sessione interattiva\n"
+
+#: help.c:429
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" valore dell'ultimo OID interessato\n"
+
+#: help.c:431
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" messaggio e SQLSTATE dell'ultimo errore, o stringa vuota e \"00000\" se non c'è\n"
+
+#: help.c:434
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" se impostato, un errore non termina una transazione (usa punti di\n"
+" salvataggio impliciti)\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" termina l'esecuzione batch dopo un errore\n"
+
+#: help.c:438
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" porta del server attualmente connesso\n"
+
+#: help.c:440
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" specifica il prompt psql standard\n"
+
+#: help.c:442
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" specifica il prompt usato quando un'istruzione continua da una riga\n"
+" precedente\n"
+
+#: help.c:444
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" specifica il prompt usato in COPY ... FROM STDIN\n"
+
+#: help.c:446
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" esegui silenziosamente (come con l'opzione -q)\n"
+
+#: help.c:448
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" numero di righe restituite o toccate dall'ultima query, o 0\n"
+
+#: help.c:450
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" versione del server (come stringa breve o formato numerico)\n"
+
+#: help.c:453
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" mostra tutti i risultati di una query combinata (\\;) anziché solo l'ultima\n"
+
+#: help.c:455
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" controlla la visualizzazione dei campi di contesto dei messaggi [never,\n"
+" errors, always]\n"
+
+#: help.c:457
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" se impostato, la fine riga termina i comandi SQL (come con l'opzione -S)\n"
+
+#: help.c:459
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" modalità passo singolo (come con l'opzione -s)\n"
+
+#: help.c:461
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" il codice SQLSTATE dell'ultima query, o \"00000\" se non c'è stato errore\n"
+
+#: help.c:463
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" l'utente database attualmente connesso\n"
+
+#: help.c:465
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" controlla la verbosità dei rapporti di errore [predefinito, dettagliato, conciso, sqlstate]\n"
+
+#: help.c:467
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" la versione di psql (come stringa estesa, stringa breve, formato numerico)\n"
+
+#: help.c:472
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Impostazioni di visualizzazione:\n"
+
+#: help.c:474
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOME[=VALORE]\n"
+" oppure \\pset NOME [VALORE] dentro psql\n"
+"\n"
+
+#: help.c:476
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" stile bordo (numero)\n"
+
+#: help.c:478
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" larghezza destinazione per il formato wrapped\n"
+
+#: help.c:480
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (o x)\n"
+" output espanso [on, off, auto]\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" separatore di campo per l'output non allineato (default \"%s\")\n"
+
+#: help.c:485
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" imposta il separatore di campo per l'output non allineato al byte zero\n"
+
+#: help.c:487
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" abilita o disabilita la visualizzazione del piè di pagina [on, off]\n"
+
+#: help.c:489
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" imposta il formato di output [unaligned, aligned, wrapped, html, asciidoc,\n"
+" ...]\n"
+
+#: help.c:491
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" imposta lo stile di disegno delle righe dei bordi [ascii, old-ascii,\n"
+" unicode]\n"
+
+#: help.c:493
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" imposta la stringa da visualizzare al posto dei valori null\n"
+
+#: help.c:495
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" abilita i caratteri specifici per il locale per separare i gruppi di cifre\n"
+" [on, off]\n"
+
+#: help.c:497
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" controlla quando usare la paginazione esterna [yes, no, always]\n"
+
+#: help.c:499
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" separatore di record (riga) per l'output non allineato\n"
+
+#: help.c:501
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" imposta il separatore di campo per l'output non allineato al byte zero\n"
+
+#: help.c:503
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" specifica gli attributi per il tag table in formato html o la larghezza\n"
+" colonna proporzionale dei dati allineati a sinistra in formato\n"
+" latex-longtable\n"
+
+#: help.c:506
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" imposta il titolo della tabella per le tabelle stampate in seguito\n"
+
+#: help.c:508
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" se impostato, mostra solo i dati della tabella\n"
+
+#: help.c:510
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" imposta lo stile di disegno delle righe Unicode [single, double]\n"
+
+#: help.c:515
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variabili d'ambiente:\n"
+
+#: help.c:519
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOME=VALORE [NOME=VALORE] psql ...\n"
+" oppure \\setenv NOME [VALORE] dentro psql\n"
+"\n"
+
+#: help.c:521
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NOME=VALORE\n"
+" psql ...\n"
+" oppure \\setenv NOME [VALORE] dentro psql\n"
+"\n"
+
+#: help.c:524
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" numero di colonne per il formato wrapped\n"
+
+#: help.c:526
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" come il parametro di connessione application_name\n"
+
+#: help.c:528
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" come il parametro di connessione dbname\n"
+
+#: help.c:530
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" come il parametro di connessione host\n"
+
+#: help.c:532
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" nome del file delle password\n"
+
+#: help.c:534
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" password di connessione (uso non raccomandato)\n"
+
+#: help.c:536
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" come il parametro di connessione port\n"
+
+#: help.c:538
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" come il parametro di connessione user\n"
+
+#: help.c:540
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor usato dai comandi \\e, \\ef, \\ev\n"
+
+#: help.c:542
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" come specificare un numero di riga quando si invoca l'editor\n"
+
+#: help.c:544
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" posizione alternativa del file della storia dei comandi\n"
+
+#: help.c:546
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nome del programma di paginazione esterno\n"
+
+#: help.c:549
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nome del programma di paginazione esterno\n"
+
+#: help.c:552
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" posizione alternativa del file .psqlrc dell'utente\n"
+
+#: help.c:554
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" shell usata dal comando \\!\n"
+
+#: help.c:556
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" directory per i file temporanei\n"
+
+#: help.c:616
+msgid "Available help:\n"
+msgstr "Aiuti disponibili:\n"
+
+#: help.c:711
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Comando: %s\n"
+"Descrizione: %s\n"
+"Sintassi:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+"\n"
+
+#: help.c:734
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Nessun aiuto disponibile per \"%s\".\n"
+"Prova a digitare \\h senza parametri per vedere gli aiuti disponibili.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "impossibile leggere dal file di input: %m"
+
+#: input.c:478 input.c:516
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "impossibile salvare la cronologia nel file \"%s\": %m"
+
+#: input.c:535
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "la cronologia non è supportata da questa installazione"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: non connesso ad un database"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: questa transazione è stata interrotta"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: stato della transazione sconosciuto"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapato"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Utilizza \"\\q\" per uscire %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"L'input è un file di dump in formato PostgreSQL.\n"
+"Usa il tool di riga di comando pg_restore per ripristinare questo dump in un database.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Usa \\? per avere un aiuto o premi control-C per svuotare il buffer di input."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Usa \\? per avere un aiuto."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Stai utilizzando psql, l'interfaccia a riga di comando di PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Digita: \\copyright per le condizioni di distribuzione\n"
+" \\h per la guida sui comandi SQL\n"
+" \\? per la guida sui comandi psql\n"
+" \\g o termina con punto e virgola per eseguire la query\n"
+" \\q per uscire\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Usa \\q per uscire."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Usa control-D per uscire."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Usa control-C per uscire."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "query ignorata: usa \\endif o Ctrl-C per uscire dal blocco \\if corrente"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "raggiunta fine file senza aver trovato \\endif finali"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "stringa tra virgolette non terminata"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: memoria esaurita"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996
+#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154
+#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228
+#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431
+#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517
+#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594
+#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730
+#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071
+#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171
+#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259
+#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338
+#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396
+#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428
+#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464
+#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499
+#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537
+#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574
+#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606
+#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638
+#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680
+#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4031
+#: sql_help.c:4142 sql_help.c:4171 sql_help.c:4186 sql_help.c:4689
+#: sql_help.c:4737 sql_help.c:4895
+msgid "name"
+msgstr "nome"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846
+#: sql_help.c:3339 sql_help.c:4457
+msgid "aggregate_signature"
+msgstr "signature_aggregato"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nuovo_nome"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011
+msgid "new_owner"
+msgstr "nuovo_proprietario"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nuovo_schema"
+
+#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4486
+msgid "where aggregate_signature is:"
+msgstr "dove signature_aggregato è:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911
+#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085
+#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341
+#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527
+#: sql_help.c:3555 sql_help.c:3906 sql_help.c:4356 sql_help.c:4463
+#: sql_help.c:4470 sql_help.c:4476 sql_help.c:4487 sql_help.c:4490
+#: sql_help.c:4493
+msgid "argmode"
+msgstr "modo_arg"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086
+#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342
+#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528
+#: sql_help.c:3556 sql_help.c:4464 sql_help.c:4471 sql_help.c:4477
+#: sql_help.c:4488 sql_help.c:4491 sql_help.c:4494
+msgid "argname"
+msgstr "nome_arg"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597
+#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440
+#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4465 sql_help.c:4472
+#: sql_help.c:4478 sql_help.c:4489 sql_help.c:4492 sql_help.c:4495
+msgid "argtype"
+msgstr "tipo_arg"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974
+#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343
+#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040
+#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742
+#: sql_help.c:3950 sql_help.c:4185 sql_help.c:4958
+msgid "option"
+msgstr "opzione"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433
+#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388
+msgid "where option can be:"
+msgstr "dove opzione può essere:"
+
+#: sql_help.c:116 sql_help.c:2209
+msgid "allowconn"
+msgstr "permetti_conn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210
+#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227
+msgid "connlimit"
+msgstr "limite_conn"
+
+#: sql_help.c:118 sql_help.c:2211
+msgid "istemplate"
+msgstr "è_template"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4189
+msgid "new_tablespace"
+msgstr "nuovo_tablespace"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601
+#: sql_help.c:3918 sql_help.c:4207 sql_help.c:4368 sql_help.c:4677
+msgid "configuration_parameter"
+msgstr "parametro_config"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344
+#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467
+#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626
+#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915
+#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014
+#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3951 sql_help.c:4678
+#: sql_help.c:4679 sql_help.c:4680 sql_help.c:4681
+msgid "value"
+msgstr "valore"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "ruolo_destinazione"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631
+#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3881 sql_help.c:3890
+#: sql_help.c:3909 sql_help.c:3921 sql_help.c:4331 sql_help.c:4340
+#: sql_help.c:4359 sql_help.c:4371
+msgid "schema_name"
+msgstr "nome_schema"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_o_revoke_abbreviato"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "dove grant_o_revoke_abbreviato è uno di:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438
+#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575
+#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667
+#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232
+#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3930 sql_help.c:3934
+#: sql_help.c:4380 sql_help.c:4384 sql_help.c:4699
+msgid "role_name"
+msgstr "nome_ruolo"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352
+#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774
+#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924
+#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3982
+#: sql_help.c:3997 sql_help.c:3999 sql_help.c:4086 sql_help.c:4089
+#: sql_help.c:4091 sql_help.c:4550 sql_help.c:4551 sql_help.c:4560
+#: sql_help.c:4607 sql_help.c:4608 sql_help.c:4609 sql_help.c:4610
+#: sql_help.c:4611 sql_help.c:4612 sql_help.c:4652 sql_help.c:4653
+#: sql_help.c:4658 sql_help.c:4663 sql_help.c:4807 sql_help.c:4808
+#: sql_help.c:4817 sql_help.c:4864 sql_help.c:4865 sql_help.c:4866
+#: sql_help.c:4867 sql_help.c:4868 sql_help.c:4869 sql_help.c:4923
+#: sql_help.c:4925 sql_help.c:4985 sql_help.c:5045 sql_help.c:5046
+#: sql_help.c:5055 sql_help.c:5102 sql_help.c:5103 sql_help.c:5104
+#: sql_help.c:5105 sql_help.c:5106 sql_help.c:5107
+msgid "expression"
+msgstr "espressione"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "vincolo_di_dominio"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852
+#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351
+#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3994
+msgid "constraint_name"
+msgstr "nome_vincolo"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nuovo_nome_vincolo"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nuova_versione"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "oggetto_membro"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "dove oggetto_membro è:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856
+#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860
+#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869
+#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884
+#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894
+#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898
+#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4453 sql_help.c:4458
+#: sql_help.c:4459 sql_help.c:4460 sql_help.c:4461 sql_help.c:4467
+#: sql_help.c:4468 sql_help.c:4473 sql_help.c:4474 sql_help.c:4479
+#: sql_help.c:4480 sql_help.c:4481 sql_help.c:4482 sql_help.c:4483
+#: sql_help.c:4484
+msgid "object_name"
+msgstr "nome_oggetto"
+
+#: sql_help.c:329 sql_help.c:1845 sql_help.c:4456
+msgid "aggregate_name"
+msgstr "nome_aggregato"
+
+#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135
+#: sql_help.c:2137 sql_help.c:3357
+msgid "source_type"
+msgstr "tipo_sorgente"
+
+#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136
+#: sql_help.c:2138 sql_help.c:3358
+msgid "target_type"
+msgstr "tipo_destinazione"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133
+#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549
+#: sql_help.c:3117 sql_help.c:4355 sql_help.c:4462 sql_help.c:4579
+#: sql_help.c:4583 sql_help.c:4587 sql_help.c:4590 sql_help.c:4836
+#: sql_help.c:4840 sql_help.c:4844 sql_help.c:4847 sql_help.c:5074
+#: sql_help.c:5078 sql_help.c:5082 sql_help.c:5085
+msgid "function_name"
+msgstr "nome_funzione"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542
+msgid "operator_name"
+msgstr "nome_operatore"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871
+#: sql_help.c:2519 sql_help.c:3481
+msgid "left_type"
+msgstr "tipo_sx"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872
+#: sql_help.c:2520 sql_help.c:3482
+msgid "right_type"
+msgstr "tipo_dx"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539
+#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500
+msgid "index_method"
+msgstr "metodo_indice"
+
+#: sql_help.c:352 sql_help.c:1880 sql_help.c:4469
+msgid "procedure_name"
+msgstr "nome_procedura"
+
+#: sql_help.c:356 sql_help.c:1886 sql_help.c:3905 sql_help.c:4475
+msgid "routine_name"
+msgstr "nome_routine"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394
+#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662
+#: sql_help.c:3927 sql_help.c:4377
+msgid "type_name"
+msgstr "nome_di_tipo"
+
+#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599
+#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3912
+#: sql_help.c:4362
+msgid "lang_name"
+msgstr "nome_linguaggio"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "e signature_aggregato è:"
+
+#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275
+msgid "handler_function"
+msgstr "funzione_handler"
+
+#: sql_help.c:396 sql_help.c:2276
+msgid "validator_function"
+msgstr "funzione_validazione"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "azione"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851
+#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984
+#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391
+#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629
+#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887
+#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919
+#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955
+#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978
+#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3884
+#: sql_help.c:3885 sql_help.c:3981 sql_help.c:3996 sql_help.c:3998
+#: sql_help.c:4000 sql_help.c:4085 sql_help.c:4088 sql_help.c:4090
+#: sql_help.c:4334 sql_help.c:4335 sql_help.c:4455 sql_help.c:4616
+#: sql_help.c:4622 sql_help.c:4624 sql_help.c:4873 sql_help.c:4879
+#: sql_help.c:4881 sql_help.c:4922 sql_help.c:4924 sql_help.c:4926
+#: sql_help.c:4973 sql_help.c:5111 sql_help.c:5117 sql_help.c:5119
+msgid "column_name"
+msgstr "nome_colonna"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nuovo_nome_colonna"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "dove azione è una di:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229
+#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888
+#: sql_help.c:3167 sql_help.c:4143
+msgid "data_type"
+msgstr "tipo_di_dato"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329
+#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911
+#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3991
+msgid "collation"
+msgstr "ordinamento"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339
+#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920
+msgid "column_constraint"
+msgstr "vincolo_di_colonna"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4970
+msgid "integer"
+msgstr "intero"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "opzione_attributo"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340
+#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921
+msgid "table_constraint"
+msgstr "vincoli_di_tabella"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905
+msgid "trigger_name"
+msgstr "nome_trigger"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918
+msgid "parent_table"
+msgstr "tabella_padre"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2261
+msgid "extension_name"
+msgstr "nome_estensione"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395
+msgid "execution_cost"
+msgstr "costo_di_esecuzione"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396
+msgid "result_rows"
+msgstr "righe_risultato"
+
+#: sql_help.c:547 sql_help.c:2397
+msgid "support_function"
+msgstr "support_function"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709
+#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3882
+#: sql_help.c:3883 sql_help.c:3887 sql_help.c:3888 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3894 sql_help.c:3895 sql_help.c:3897
+#: sql_help.c:3898 sql_help.c:3900 sql_help.c:3901 sql_help.c:3903
+#: sql_help.c:3904 sql_help.c:3910 sql_help.c:3911 sql_help.c:3913
+#: sql_help.c:3914 sql_help.c:3916 sql_help.c:3917 sql_help.c:3919
+#: sql_help.c:3920 sql_help.c:3922 sql_help.c:3923 sql_help.c:3925
+#: sql_help.c:3926 sql_help.c:3928 sql_help.c:3929 sql_help.c:3931
+#: sql_help.c:3932 sql_help.c:4332 sql_help.c:4333 sql_help.c:4337
+#: sql_help.c:4338 sql_help.c:4341 sql_help.c:4342 sql_help.c:4344
+#: sql_help.c:4345 sql_help.c:4347 sql_help.c:4348 sql_help.c:4350
+#: sql_help.c:4351 sql_help.c:4353 sql_help.c:4354 sql_help.c:4360
+#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4366
+#: sql_help.c:4367 sql_help.c:4369 sql_help.c:4370 sql_help.c:4372
+#: sql_help.c:4373 sql_help.c:4375 sql_help.c:4376 sql_help.c:4378
+#: sql_help.c:4379 sql_help.c:4381 sql_help.c:4382
+msgid "role_specification"
+msgstr "specifica_ruolo"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198
+#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4709
+msgid "user_name"
+msgstr "nome_utente"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716
+#: sql_help.c:3933 sql_help.c:4383
+msgid "where role_specification can be:"
+msgstr "dove specifica_ruolo può essere:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nome_gruppo"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468
+#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930
+#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3924
+#: sql_help.c:4374
+msgid "tablespace_name"
+msgstr "nome_tablespace"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783
+msgid "index_name"
+msgstr "nome_indice"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500
+#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969
+#: sql_help.c:2996
+msgid "storage_parameter"
+msgstr "parametro_di_memorizzazione"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "numero_colonna"
+
+#: sql_help.c:631 sql_help.c:1868 sql_help.c:4466
+msgid "large_object_oid"
+msgstr "oid_large_object"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2523
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2524
+msgid "join_proc"
+msgstr "proc_join"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2541
+msgid "strategy_number"
+msgstr "strategia_num"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2547 sql_help.c:2548
+msgid "op_type"
+msgstr "tipo_op"
+
+#: sql_help.c:782 sql_help.c:2545
+msgid "sort_family_name"
+msgstr "nome_famiglia_sort"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2546
+msgid "support_number"
+msgstr "num_supporto"
+
+#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087
+#: sql_help.c:3089
+msgid "argument_type"
+msgstr "tipo_argomento"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779
+#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891
+#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324
+#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574
+#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770
+#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917
+#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517
+#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3880 sql_help.c:3886
+#: sql_help.c:3947 sql_help.c:3979 sql_help.c:4330 sql_help.c:4336
+#: sql_help.c:4454 sql_help.c:4565 sql_help.c:4567 sql_help.c:4629
+#: sql_help.c:4668 sql_help.c:4822 sql_help.c:4824 sql_help.c:4886
+#: sql_help.c:4920 sql_help.c:4972 sql_help.c:5060 sql_help.c:5062
+#: sql_help.c:5124
+msgid "table_name"
+msgstr "nome_tabella"
+
+#: sql_help.c:823 sql_help.c:2576
+msgid "using_expression"
+msgstr "espressione_using"
+
+#: sql_help.c:824 sql_help.c:2577
+msgid "check_expression"
+msgstr "espressione_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624
+msgid "publication_object"
+msgstr "publication_object"
+
+#: sql_help.c:903 sql_help.c:2625
+msgid "publication_parameter"
+msgstr "parametro_pubblicazione"
+
+#: sql_help.c:909 sql_help.c:2627
+msgid "where publication_object is one of:"
+msgstr "dove publication_object è uno di:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662
+#: sql_help.c:3228
+msgid "password"
+msgstr "password"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663
+#: sql_help.c:3229
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3893
+#: sql_help.c:4343
+msgid "database_name"
+msgstr "nome_database"
+
+#: sql_help.c:1073 sql_help.c:2732
+msgid "increment"
+msgstr "incremento"
+
+#: sql_help.c:1074 sql_help.c:2733
+msgid "minvalue"
+msgstr "valoremin"
+
+#: sql_help.c:1075 sql_help.c:2734
+msgid "maxvalue"
+msgstr "valoremax"
+
+#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4563 sql_help.c:4666
+#: sql_help.c:4820 sql_help.c:4989 sql_help.c:5058
+msgid "start"
+msgstr "inizio"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "riavvio"
+
+#: sql_help.c:1078 sql_help.c:2736
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "new_target"
+
+#: sql_help.c:1142 sql_help.c:2789
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790
+msgid "publication_name"
+msgstr "nome_pubblicazione"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "opzione_refresh"
+
+#: sql_help.c:1161 sql_help.c:2791
+msgid "subscription_parameter"
+msgstr "parametro_sottoscrizione"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "nome_partizione"
+
+#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922
+msgid "partition_bound_spec"
+msgstr "specifica_margine_partizione"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936
+msgid "sequence_options"
+msgstr "opzioni_sequenza"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "opzione_sequenza"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "vincoli_di_tabella_con_indice"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "nome_regola_di_riscrittura"
+
+#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961
+msgid "and partition_bound_spec is:"
+msgstr "e specifica_margine_partizione è:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354
+#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963
+#: sql_help.c:2964
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358
+#: sql_help.c:2965 sql_help.c:2966
+msgid "numeric_literal"
+msgstr "letterale_numerico"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "e vincolo_di_colonna è:"
+
+#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598
+#: sql_help.c:2934
+msgid "default_expr"
+msgstr "expr_default"
+
+#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947
+#: sql_help.c:2949 sql_help.c:2953
+msgid "index_parameters"
+msgstr "parametri_di_indice"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956
+msgid "reftable"
+msgstr "tabella_ref"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957
+msgid "refcolumn"
+msgstr "colonna_ref"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959
+msgid "referential_action"
+msgstr "referential_action"
+
+#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943
+msgid "and table_constraint is:"
+msgstr "e vincolo_di_tabella è:"
+
+#: sql_help.c:1409 sql_help.c:2951
+msgid "exclude_element"
+msgstr "elemento_di_esclusione"
+
+#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4561 sql_help.c:4664
+#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056
+msgid "operator"
+msgstr "operatore"
+
+#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954
+msgid "predicate"
+msgstr "predicato"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "e vincolo_di_tabella_con_indice è:"
+
+#: sql_help.c:1421 sql_help.c:2967
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parametri_di_indice nei vincoli UNIQUE, PRIMARY KEY e EXCLUDE sono:"
+
+#: sql_help.c:1426 sql_help.c:2972
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "elemento_di_esclusione in un vincolo EXCLUDE è:"
+
+#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912
+#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3992
+msgid "opclass"
+msgstr "classe_op"
+
+#: sql_help.c:1430 sql_help.c:2976
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referential_action in un vincolo FOREIGN KEY/REFERENCES è:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013
+msgid "tablespace_option"
+msgstr "opzione_tablespace"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "tipo_di_token"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "nome_dizionario"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "vecchio_dizionario"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "nuovo_dizionario"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3166
+msgid "attribute_name"
+msgstr "nome_attributo"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nuovo_nome_attributo"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nuovo_valore_enum"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "valore_enum_vicino"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "valore_enum_esistente"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "proprietà"
+
+#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748
+#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3902 sql_help.c:3948
+#: sql_help.c:4352
+msgid "server_name"
+msgstr "nome_server"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261
+msgid "view_option_name"
+msgstr "nome_opzione_vista"
+
+#: sql_help.c:1698 sql_help.c:3262
+msgid "view_option_value"
+msgstr "valore_opzione_vista"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4959 sql_help.c:4960
+msgid "table_and_columns"
+msgstr "tabelle_e_colonne"
+
+#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745
+#: sql_help.c:4187 sql_help.c:4961
+msgid "where option can be one of:"
+msgstr "dove opzione può essere una di:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977
+#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747
+#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4188 sql_help.c:4190
+#: sql_help.c:4962 sql_help.c:4963 sql_help.c:4964 sql_help.c:4965
+#: sql_help.c:4966 sql_help.c:4967 sql_help.c:4968 sql_help.c:4969
+msgid "boolean"
+msgstr "booleano"
+
+#: sql_help.c:1724 sql_help.c:4971
+msgid "and table_and_columns is:"
+msgstr "e tabelle_e_colonne è:"
+
+#: sql_help.c:1740 sql_help.c:4725 sql_help.c:4727 sql_help.c:4751
+msgid "transaction_mode"
+msgstr "modalità_transazione"
+
+#: sql_help.c:1741 sql_help.c:4728 sql_help.c:4752
+msgid "where transaction_mode is one of:"
+msgstr "dove modalità_transazione è una di:"
+
+#: sql_help.c:1750 sql_help.c:4571 sql_help.c:4580 sql_help.c:4584
+#: sql_help.c:4588 sql_help.c:4591 sql_help.c:4828 sql_help.c:4837
+#: sql_help.c:4841 sql_help.c:4845 sql_help.c:4848 sql_help.c:5066
+#: sql_help.c:5075 sql_help.c:5079 sql_help.c:5083 sql_help.c:5086
+msgid "argument"
+msgstr "argomento"
+
+#: sql_help.c:1850
+msgid "relation_name"
+msgstr "nome_relazione"
+
+#: sql_help.c:1855 sql_help.c:3896 sql_help.c:4346
+msgid "domain_name"
+msgstr "nome_dominio"
+
+#: sql_help.c:1877
+msgid "policy_name"
+msgstr "nome_regola"
+
+#: sql_help.c:1890
+msgid "rule_name"
+msgstr "nome_ruolo"
+
+#: sql_help.c:1909
+msgid "text"
+msgstr "testo"
+
+#: sql_help.c:1934 sql_help.c:4152 sql_help.c:4399
+msgid "transaction_id"
+msgstr "id_transazione"
+
+#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4018
+msgid "filename"
+msgstr "nome_file"
+
+#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688
+#: sql_help.c:2689
+msgid "command"
+msgstr "comando"
+
+#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297
+#: sql_help.c:4002 sql_help.c:4079 sql_help.c:4082 sql_help.c:4554
+#: sql_help.c:4556 sql_help.c:4657 sql_help.c:4659 sql_help.c:4811
+#: sql_help.c:4813 sql_help.c:4929 sql_help.c:5049 sql_help.c:5051
+msgid "condition"
+msgstr "condizione"
+
+#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263
+#: sql_help.c:3281 sql_help.c:3983
+msgid "query"
+msgstr "query"
+
+#: sql_help.c:1976
+msgid "format_name"
+msgstr "nome_formato"
+
+#: sql_help.c:1978
+msgid "delimiter_character"
+msgstr "carattere_delimitatore"
+
+#: sql_help.c:1979
+msgid "null_string"
+msgstr "stringa_nulla"
+
+#: sql_help.c:1981
+msgid "quote_character"
+msgstr "carattere_virgolette"
+
+#: sql_help.c:1982
+msgid "escape_character"
+msgstr "carattere_di_escape"
+
+#: sql_help.c:1986
+msgid "encoding_name"
+msgstr "nome_codifica"
+
+#: sql_help.c:1997
+msgid "access_method_type"
+msgstr "tipo_metodo_accesso"
+
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090
+msgid "arg_data_type"
+msgstr "topo_dato_argomento"
+
+#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099
+msgid "sfunc"
+msgstr "sfunz"
+
+#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100
+msgid "state_data_type"
+msgstr "tipo_dato_stato"
+
+#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101
+msgid "state_data_size"
+msgstr "dimensione_dato_stato"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "ffunc"
+msgstr "ffunz"
+
+#: sql_help.c:2073 sql_help.c:2103
+msgid "combinefunc"
+msgstr "funz_combine"
+
+#: sql_help.c:2074 sql_help.c:2104
+msgid "serialfunc"
+msgstr "funz_serial"
+
+#: sql_help.c:2075 sql_help.c:2105
+msgid "deserialfunc"
+msgstr "funz_deserial"
+
+#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106
+msgid "initial_condition"
+msgstr "condizione_iniziale"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "msfunc"
+msgstr "msfunz"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "minvfunc"
+msgstr "minvfunz"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "mstate_data_type"
+msgstr "tipo_dato_mstato"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "mstate_data_size"
+msgstr "tipo_dato_mstato"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "mffunc"
+msgstr "mffunz"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minitial_condition"
+msgstr "condizione_minima"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "sort_operator"
+msgstr "operatore_di_ordinamento"
+
+#: sql_help.c:2096
+msgid "or the old syntax"
+msgstr "o la vecchia sintassi"
+
+#: sql_help.c:2098
+msgid "base_type"
+msgstr "tipo_base"
+
+#: sql_help.c:2155 sql_help.c:2202
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2156 sql_help.c:2203
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2157 sql_help.c:2204
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2158 sql_help.c:4452
+msgid "provider"
+msgstr "provider"
+
+#: sql_help.c:2160 sql_help.c:2263
+msgid "version"
+msgstr "versione"
+
+#: sql_help.c:2162
+msgid "existing_collation"
+msgstr "ordinamento_esistente"
+
+#: sql_help.c:2172
+msgid "source_encoding"
+msgstr "codifica_origine"
+
+#: sql_help.c:2173
+msgid "dest_encoding"
+msgstr "codifica_destinazione"
+
+#: sql_help.c:2199 sql_help.c:3039
+msgid "template"
+msgstr "template"
+
+#: sql_help.c:2200
+msgid "encoding"
+msgstr "codifica"
+
+#: sql_help.c:2201
+msgid "strategy"
+msgstr "strategia"
+
+#: sql_help.c:2205
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2206
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2207
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2212
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2232
+msgid "constraint"
+msgstr "vincolo"
+
+#: sql_help.c:2233
+msgid "where constraint is:"
+msgstr "dove vincolo di è:"
+
+#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112
+msgid "event"
+msgstr "evento"
+
+#: sql_help.c:2248
+msgid "filter_variable"
+msgstr "valiabile_filtro"
+
+#: sql_help.c:2249
+msgid "filter_value"
+msgstr "filter_value"
+
+#: sql_help.c:2345 sql_help.c:2931
+msgid "where column_constraint is:"
+msgstr "dove vincolo_di_colonna è:"
+
+#: sql_help.c:2390
+msgid "rettype"
+msgstr "tipo_ritorno"
+
+#: sql_help.c:2392
+msgid "column_type"
+msgstr "tipo_colonna"
+
+#: sql_help.c:2401 sql_help.c:2604
+msgid "definition"
+msgstr "definizione"
+
+#: sql_help.c:2402 sql_help.c:2605
+msgid "obj_file"
+msgstr "file_obj"
+
+#: sql_help.c:2403 sql_help.c:2606
+msgid "link_symbol"
+msgstr "simbolo_link"
+
+#: sql_help.c:2404 sql_help.c:2607
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913
+#: sql_help.c:2927 sql_help.c:2995
+msgid "method"
+msgstr "metodo"
+
+#: sql_help.c:2463
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2480
+msgid "call_handler"
+msgstr "handler_chiamata"
+
+#: sql_help.c:2481
+msgid "inline_handler"
+msgstr "handler_inline"
+
+#: sql_help.c:2482
+msgid "valfunction"
+msgstr "funzione_valid"
+
+#: sql_help.c:2521
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2522
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2540
+msgid "family_name"
+msgstr "nome_famiglia"
+
+#: sql_help.c:2551
+msgid "storage_type"
+msgstr "tipo_memorizzazione"
+
+#: sql_help.c:2690 sql_help.c:3119
+msgid "where event can be one of:"
+msgstr "dove evento può essere uno di:"
+
+#: sql_help.c:2710 sql_help.c:2712
+msgid "schema_element"
+msgstr "elemento_di_schema"
+
+#: sql_help.c:2749
+msgid "server_type"
+msgstr "tipo_di_server"
+
+#: sql_help.c:2750
+msgid "server_version"
+msgstr "versione_server"
+
+#: sql_help.c:2751 sql_help.c:3899 sql_help.c:4349
+msgid "fdw_name"
+msgstr "nome_fdw"
+
+#: sql_help.c:2768 sql_help.c:2771
+msgid "statistics_name"
+msgstr "nome_statistica"
+
+#: sql_help.c:2772
+msgid "statistics_kind"
+msgstr "tipo_statistica"
+
+#: sql_help.c:2788
+msgid "subscription_name"
+msgstr "nome_sottoscrizione"
+
+#: sql_help.c:2893
+msgid "source_table"
+msgstr "tabella_origine"
+
+#: sql_help.c:2894
+msgid "like_option"
+msgstr "opzioni_di_like"
+
+#: sql_help.c:2960
+msgid "and like_option is:"
+msgstr "e opzione_like è:"
+
+#: sql_help.c:3012
+msgid "directory"
+msgstr "directory"
+
+#: sql_help.c:3026
+msgid "parser_name"
+msgstr "nome_parser"
+
+#: sql_help.c:3027
+msgid "source_config"
+msgstr "config_origine"
+
+#: sql_help.c:3056
+msgid "start_function"
+msgstr "funzione_inizio"
+
+#: sql_help.c:3057
+msgid "gettoken_function"
+msgstr "funzione_gettoken"
+
+#: sql_help.c:3058
+msgid "end_function"
+msgstr "funzione_fine"
+
+#: sql_help.c:3059
+msgid "lextypes_function"
+msgstr "funzione_lextypes"
+
+#: sql_help.c:3060
+msgid "headline_function"
+msgstr "funzione_headline"
+
+#: sql_help.c:3072
+msgid "init_function"
+msgstr "funzione_init"
+
+#: sql_help.c:3073
+msgid "lexize_function"
+msgstr "funzione_lexize"
+
+#: sql_help.c:3086
+msgid "from_sql_function_name"
+msgstr "nome_funzione_from_sql"
+
+#: sql_help.c:3088
+msgid "to_sql_function_name"
+msgstr "nome_funzione_to_sql"
+
+#: sql_help.c:3114
+msgid "referenced_table_name"
+msgstr "nome_tabella_referenziata"
+
+#: sql_help.c:3115
+msgid "transition_relation_name"
+msgstr "nome_tabella_transizione"
+
+#: sql_help.c:3118
+msgid "arguments"
+msgstr "argomenti"
+
+#: sql_help.c:3170 sql_help.c:4485
+msgid "label"
+msgstr "etichetta"
+
+#: sql_help.c:3172
+msgid "subtype"
+msgstr "sottotipo"
+
+#: sql_help.c:3173
+msgid "subtype_operator_class"
+msgstr "classe_operatore_sottotipo"
+
+#: sql_help.c:3175
+msgid "canonical_function"
+msgstr "funzione_canonica"
+
+#: sql_help.c:3176
+msgid "subtype_diff_function"
+msgstr "funzione_diff_sottotipo"
+
+#: sql_help.c:3177
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3179
+msgid "input_function"
+msgstr "funzione_input"
+
+#: sql_help.c:3180
+msgid "output_function"
+msgstr "funzione_output"
+
+#: sql_help.c:3181
+msgid "receive_function"
+msgstr "funzione_receive"
+
+#: sql_help.c:3182
+msgid "send_function"
+msgstr "funzione_send"
+
+#: sql_help.c:3183
+msgid "type_modifier_input_function"
+msgstr "funzione_input_modificatore_tipo"
+
+#: sql_help.c:3184
+msgid "type_modifier_output_function"
+msgstr "funzione_output_modificatore_tipo"
+
+#: sql_help.c:3185
+msgid "analyze_function"
+msgstr "funzione_analyze"
+
+#: sql_help.c:3186
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3187
+msgid "internallength"
+msgstr "lunghezza_interna"
+
+#: sql_help.c:3188
+msgid "alignment"
+msgstr "allineamento"
+
+#: sql_help.c:3189
+msgid "storage"
+msgstr "memorizzazione"
+
+#: sql_help.c:3190
+msgid "like_type"
+msgstr "tipo_like"
+
+#: sql_help.c:3191
+msgid "category"
+msgstr "categoria"
+
+#: sql_help.c:3192
+msgid "preferred"
+msgstr "preferito"
+
+#: sql_help.c:3193
+msgid "default"
+msgstr "predefinito"
+
+#: sql_help.c:3194
+msgid "element"
+msgstr "elemento"
+
+#: sql_help.c:3195
+msgid "delimiter"
+msgstr "delimitatore"
+
+#: sql_help.c:3196
+msgid "collatable"
+msgstr "ordinabile"
+
+#: sql_help.c:3293 sql_help.c:3978 sql_help.c:4068 sql_help.c:4549
+#: sql_help.c:4651 sql_help.c:4806 sql_help.c:4919 sql_help.c:5044
+msgid "with_query"
+msgstr "query_with"
+
+#: sql_help.c:3295 sql_help.c:3980 sql_help.c:4568 sql_help.c:4574
+#: sql_help.c:4577 sql_help.c:4581 sql_help.c:4585 sql_help.c:4593
+#: sql_help.c:4825 sql_help.c:4831 sql_help.c:4834 sql_help.c:4838
+#: sql_help.c:4842 sql_help.c:4850 sql_help.c:4921 sql_help.c:5063
+#: sql_help.c:5069 sql_help.c:5072 sql_help.c:5076 sql_help.c:5080
+#: sql_help.c:5088
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3296 sql_help.c:4553 sql_help.c:4595 sql_help.c:4597
+#: sql_help.c:4601 sql_help.c:4603 sql_help.c:4604 sql_help.c:4605
+#: sql_help.c:4656 sql_help.c:4810 sql_help.c:4852 sql_help.c:4854
+#: sql_help.c:4858 sql_help.c:4860 sql_help.c:4861 sql_help.c:4862
+#: sql_help.c:4928 sql_help.c:5048 sql_help.c:5090 sql_help.c:5092
+#: sql_help.c:5096 sql_help.c:5098 sql_help.c:5099 sql_help.c:5100
+msgid "from_item"
+msgstr "elemento_from"
+
+#: sql_help.c:3298 sql_help.c:3780 sql_help.c:4119 sql_help.c:4930
+msgid "cursor_name"
+msgstr "nome_cursore"
+
+#: sql_help.c:3299 sql_help.c:3986 sql_help.c:4931
+msgid "output_expression"
+msgstr "espressione_output"
+
+#: sql_help.c:3300 sql_help.c:3987 sql_help.c:4552 sql_help.c:4654
+#: sql_help.c:4809 sql_help.c:4932 sql_help.c:5047
+msgid "output_name"
+msgstr "nome_output"
+
+#: sql_help.c:3316
+msgid "code"
+msgstr "codice"
+
+#: sql_help.c:3721
+msgid "parameter"
+msgstr "parametro"
+
+#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4144
+msgid "statement"
+msgstr "istruzione"
+
+#: sql_help.c:3779 sql_help.c:3781 sql_help.c:4118 sql_help.c:4120
+msgid "direction"
+msgstr "direzione"
+
+#: sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 sql_help.c:3785
+#: sql_help.c:3786 sql_help.c:4121 sql_help.c:4122 sql_help.c:4123
+#: sql_help.c:4124 sql_help.c:4125 sql_help.c:4562 sql_help.c:4564
+#: sql_help.c:4665 sql_help.c:4667 sql_help.c:4819 sql_help.c:4821
+#: sql_help.c:4988 sql_help.c:4990 sql_help.c:5057 sql_help.c:5059
+msgid "count"
+msgstr "conteggio"
+
+#: sql_help.c:3889 sql_help.c:4339
+msgid "sequence_name"
+msgstr "nome_sequenza"
+
+#: sql_help.c:3907 sql_help.c:4357
+msgid "arg_name"
+msgstr "nome_arg"
+
+#: sql_help.c:3908 sql_help.c:4358
+msgid "arg_type"
+msgstr "tipo_arg"
+
+#: sql_help.c:3915 sql_help.c:4365
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3946
+msgid "remote_schema"
+msgstr "schema_remoto"
+
+#: sql_help.c:3949
+msgid "local_schema"
+msgstr "schema_locale"
+
+#: sql_help.c:3984
+msgid "conflict_target"
+msgstr "target_conflitto"
+
+#: sql_help.c:3985
+msgid "conflict_action"
+msgstr "azione_conflitto"
+
+#: sql_help.c:3988
+msgid "where conflict_target can be one of:"
+msgstr "dove target_conflitto può essere uno di:"
+
+#: sql_help.c:3989
+msgid "index_column_name"
+msgstr "nome_colonna_indice"
+
+#: sql_help.c:3990
+msgid "index_expression"
+msgstr "espressione_indice"
+
+#: sql_help.c:3993
+msgid "index_predicate"
+msgstr "indice_predicato"
+
+#: sql_help.c:3995
+msgid "and conflict_action is one of:"
+msgstr "e azione_conflitto è una di:"
+
+#: sql_help.c:4001 sql_help.c:4927
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4010 sql_help.c:4133 sql_help.c:4903
+msgid "channel"
+msgstr "canale"
+
+#: sql_help.c:4032
+msgid "lockmode"
+msgstr "modalità_lock"
+
+#: sql_help.c:4033
+msgid "where lockmode is one of:"
+msgstr "dove modalità_lock è una di:"
+
+#: sql_help.c:4069
+msgid "target_table_name"
+msgstr "target_table_name"
+
+#: sql_help.c:4070
+msgid "target_alias"
+msgstr "target_alias"
+
+#: sql_help.c:4071
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4072 sql_help.c:4598 sql_help.c:4855 sql_help.c:5093
+msgid "join_condition"
+msgstr "condizione_join"
+
+#: sql_help.c:4073
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4074
+msgid "where data_source is:"
+msgstr "dove data_source è:"
+
+#: sql_help.c:4075
+msgid "source_table_name"
+msgstr "source_table_name"
+
+#: sql_help.c:4076
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4077
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4078
+msgid "and when_clause is:"
+msgstr "e when_clause è:"
+
+#: sql_help.c:4080
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4081
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4083
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4084
+msgid "and merge_insert is:"
+msgstr "e merge_insert è:"
+
+#: sql_help.c:4087
+msgid "and merge_update is:"
+msgstr "e merge_update è:"
+
+#: sql_help.c:4092
+msgid "and merge_delete is:"
+msgstr "and merge_delete is:"
+
+#: sql_help.c:4134
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4161
+msgid "old_role"
+msgstr "vecchio_ruolo"
+
+#: sql_help.c:4162
+msgid "new_role"
+msgstr "nuovo_ruolo"
+
+#: sql_help.c:4198 sql_help.c:4407 sql_help.c:4415
+msgid "savepoint_name"
+msgstr "nome_punto_salvataggio"
+
+#: sql_help.c:4555 sql_help.c:4613 sql_help.c:4812 sql_help.c:4870
+#: sql_help.c:5050 sql_help.c:5108
+msgid "grouping_element"
+msgstr "elemento_raggruppante"
+
+#: sql_help.c:4557 sql_help.c:4660 sql_help.c:4814 sql_help.c:5052
+msgid "window_name"
+msgstr "nome_finestra"
+
+#: sql_help.c:4558 sql_help.c:4661 sql_help.c:4815 sql_help.c:5053
+msgid "window_definition"
+msgstr "definizione_finestra"
+
+#: sql_help.c:4559 sql_help.c:4573 sql_help.c:4617 sql_help.c:4662
+#: sql_help.c:4816 sql_help.c:4830 sql_help.c:4874 sql_help.c:5054
+#: sql_help.c:5068 sql_help.c:5112
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4566 sql_help.c:4823 sql_help.c:5061
+msgid "where from_item can be one of:"
+msgstr "dove from_item può essere uno di:"
+
+#: sql_help.c:4569 sql_help.c:4575 sql_help.c:4578 sql_help.c:4582
+#: sql_help.c:4594 sql_help.c:4826 sql_help.c:4832 sql_help.c:4835
+#: sql_help.c:4839 sql_help.c:4851 sql_help.c:5064 sql_help.c:5070
+#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5089
+msgid "column_alias"
+msgstr "alias_colonna"
+
+#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065
+msgid "sampling_method"
+msgstr "metodo_di_campionamento"
+
+#: sql_help.c:4572 sql_help.c:4829 sql_help.c:5067
+msgid "seed"
+msgstr "seme"
+
+#: sql_help.c:4576 sql_help.c:4615 sql_help.c:4833 sql_help.c:4872
+#: sql_help.c:5071 sql_help.c:5110
+msgid "with_query_name"
+msgstr "nome_query_with"
+
+#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4592 sql_help.c:4843
+#: sql_help.c:4846 sql_help.c:4849 sql_help.c:5081 sql_help.c:5084
+#: sql_help.c:5087
+msgid "column_definition"
+msgstr "definizione_colonna"
+
+#: sql_help.c:4596 sql_help.c:4602 sql_help.c:4853 sql_help.c:4859
+#: sql_help.c:5091 sql_help.c:5097
+msgid "join_type"
+msgstr "tipo_join"
+
+#: sql_help.c:4599 sql_help.c:4856 sql_help.c:5094
+msgid "join_column"
+msgstr "colonna_join"
+
+#: sql_help.c:4600 sql_help.c:4857 sql_help.c:5095
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4606 sql_help.c:4863 sql_help.c:5101
+msgid "and grouping_element can be one of:"
+msgstr "e elemento_raggruppante può essere uno di:"
+
+#: sql_help.c:4614 sql_help.c:4871 sql_help.c:5109
+msgid "and with_query is:"
+msgstr "e with_query è:"
+
+#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113
+msgid "values"
+msgstr "valori"
+
+#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4620 sql_help.c:4877 sql_help.c:5115
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4627 sql_help.c:4884 sql_help.c:5122
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5123
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4655
+msgid "new_table"
+msgstr "nuova_tabella"
+
+#: sql_help.c:4726
+msgid "snapshot_id"
+msgstr "id_snapshot"
+
+#: sql_help.c:4986
+msgid "sort_expression"
+msgstr "espressione_ordinamento"
+
+#: sql_help.c:5130 sql_help.c:6114
+msgid "abort the current transaction"
+msgstr "annulla la transazione corrente"
+
+#: sql_help.c:5136
+msgid "change the definition of an aggregate function"
+msgstr "cambia la definizione di una funzione di aggregazione"
+
+#: sql_help.c:5142
+msgid "change the definition of a collation"
+msgstr "cambia la definizione di un ordinamento"
+
+#: sql_help.c:5148
+msgid "change the definition of a conversion"
+msgstr "cambia la definizione di una conversione"
+
+#: sql_help.c:5154
+msgid "change a database"
+msgstr "cambia un database"
+
+#: sql_help.c:5160
+msgid "define default access privileges"
+msgstr "definisci i privilegi di accesso di default"
+
+#: sql_help.c:5166
+msgid "change the definition of a domain"
+msgstr "cambia la definizione di un dominio"
+
+#: sql_help.c:5172
+msgid "change the definition of an event trigger"
+msgstr "cambia la definizione di un trigger di evento"
+
+#: sql_help.c:5178
+msgid "change the definition of an extension"
+msgstr "cambia la definizione di una estensione"
+
+#: sql_help.c:5184
+msgid "change the definition of a foreign-data wrapper"
+msgstr "cambia la definizione di un wrapper di dati esterni"
+
+#: sql_help.c:5190
+msgid "change the definition of a foreign table"
+msgstr "cambia la definizione di una tabella esterna"
+
+#: sql_help.c:5196
+msgid "change the definition of a function"
+msgstr "cambia la definizione di una funzione"
+
+#: sql_help.c:5202
+msgid "change role name or membership"
+msgstr "cambia il nome del ruolo o l'appartenenza"
+
+#: sql_help.c:5208
+msgid "change the definition of an index"
+msgstr "cambia la definizione di un indice"
+
+#: sql_help.c:5214
+msgid "change the definition of a procedural language"
+msgstr "cambia la definizione di un linguaggio procedurale"
+
+#: sql_help.c:5220
+msgid "change the definition of a large object"
+msgstr "cambia la definizione di un large object"
+
+#: sql_help.c:5226
+msgid "change the definition of a materialized view"
+msgstr "cambia la definizione di una vista materializzata"
+
+#: sql_help.c:5232
+msgid "change the definition of an operator"
+msgstr "cambia la definizione di un operatore"
+
+#: sql_help.c:5238
+msgid "change the definition of an operator class"
+msgstr "cambia la definizione di una classe di operatori"
+
+#: sql_help.c:5244
+msgid "change the definition of an operator family"
+msgstr "cambia la definizione di una famiglia di operatori"
+
+#: sql_help.c:5250
+msgid "change the definition of a row-level security policy"
+msgstr "cambia la definizione di una regola di sicurezza per riga"
+
+#: sql_help.c:5256
+msgid "change the definition of a procedure"
+msgstr "cambia la definizione di una procedura"
+
+#: sql_help.c:5262
+msgid "change the definition of a publication"
+msgstr "cambia la definizione di una pubblicazione"
+
+#: sql_help.c:5268 sql_help.c:5370
+msgid "change a database role"
+msgstr "cambia un ruolo di database"
+
+#: sql_help.c:5274
+msgid "change the definition of a routine"
+msgstr "cambia la definizione di una routine"
+
+#: sql_help.c:5280
+msgid "change the definition of a rule"
+msgstr "cambia la definizione di una regola"
+
+#: sql_help.c:5286
+msgid "change the definition of a schema"
+msgstr "cambia la definizione di uno schema"
+
+#: sql_help.c:5292
+msgid "change the definition of a sequence generator"
+msgstr "cambia la definizione di un generatore di sequenza"
+
+#: sql_help.c:5298
+msgid "change the definition of a foreign server"
+msgstr "cambia la definizione di un server esterno"
+
+#: sql_help.c:5304
+msgid "change the definition of an extended statistics object"
+msgstr "cambia la definizione di una statistica estesa"
+
+#: sql_help.c:5310
+msgid "change the definition of a subscription"
+msgstr "cambia la definizione di una sottoscrizione"
+
+#: sql_help.c:5316
+msgid "change a server configuration parameter"
+msgstr "cambia un parametro di configurazione del server"
+
+#: sql_help.c:5322
+msgid "change the definition of a table"
+msgstr "cambia la definizione di una tabella"
+
+#: sql_help.c:5328
+msgid "change the definition of a tablespace"
+msgstr "cambia la definizione di un tablespace"
+
+#: sql_help.c:5334
+msgid "change the definition of a text search configuration"
+msgstr "cambia la definizione di una configurazione di ricerca testo"
+
+#: sql_help.c:5340
+msgid "change the definition of a text search dictionary"
+msgstr "cambia la definizione di un dizionario di ricerca testo"
+
+#: sql_help.c:5346
+msgid "change the definition of a text search parser"
+msgstr "cambia la definizione di un analizzatore di ricerca testo"
+
+#: sql_help.c:5352
+msgid "change the definition of a text search template"
+msgstr "cambia la definizione di un modello di ricerca testo"
+
+#: sql_help.c:5358
+msgid "change the definition of a trigger"
+msgstr "cambia la definizione di un trigger"
+
+#: sql_help.c:5364
+msgid "change the definition of a type"
+msgstr "cambia la definizione di un tipo di dato"
+
+#: sql_help.c:5376
+msgid "change the definition of a user mapping"
+msgstr "cambia la definizione di una mappatura degli"
+
+#: sql_help.c:5382
+msgid "change the definition of a view"
+msgstr "cambia la definizione di una vista"
+
+#: sql_help.c:5388
+msgid "collect statistics about a database"
+msgstr "raccogli statistiche sul database"
+
+#: sql_help.c:5394 sql_help.c:6192
+msgid "start a transaction block"
+msgstr "avvia un blocco di transazione"
+
+#: sql_help.c:5400
+msgid "invoke a procedure"
+msgstr "esegui una procedura"
+
+#: sql_help.c:5406
+msgid "force a write-ahead log checkpoint"
+msgstr "forza un checkpoint del write-ahead log"
+
+#: sql_help.c:5412
+msgid "close a cursor"
+msgstr "chiudi un cursore"
+
+#: sql_help.c:5418
+msgid "cluster a table according to an index"
+msgstr "raggruppa una tabella in base ad un indice"
+
+#: sql_help.c:5424
+msgid "define or change the comment of an object"
+msgstr "definisci o modifica il commento di un oggetto"
+
+#: sql_help.c:5430 sql_help.c:5988
+msgid "commit the current transaction"
+msgstr "rendi persistente la transazione corrente"
+
+#: sql_help.c:5436
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "concludi transazione che è stata precedentemente preparata per un commit a due fasi"
+
+#: sql_help.c:5442
+msgid "copy data between a file and a table"
+msgstr "copia i dati tra un file ed una tabella"
+
+#: sql_help.c:5448
+msgid "define a new access method"
+msgstr "definisci un nuovo metodo di accesso"
+
+#: sql_help.c:5454
+msgid "define a new aggregate function"
+msgstr "definisci una nuova funzione aggregata"
+
+#: sql_help.c:5460
+msgid "define a new cast"
+msgstr "definisci una nuova conversione di tipi"
+
+#: sql_help.c:5466
+msgid "define a new collation"
+msgstr "definisci un nuovo ordinamento"
+
+#: sql_help.c:5472
+msgid "define a new encoding conversion"
+msgstr "definisci una nuova conversione di codifica"
+
+#: sql_help.c:5478
+msgid "create a new database"
+msgstr "crea un nuovo database"
+
+#: sql_help.c:5484
+msgid "define a new domain"
+msgstr "definisci un nuovo dominio"
+
+#: sql_help.c:5490
+msgid "define a new event trigger"
+msgstr "definisci un nuovo trigger di evento"
+
+#: sql_help.c:5496
+msgid "install an extension"
+msgstr "installa un'estensione"
+
+#: sql_help.c:5502
+msgid "define a new foreign-data wrapper"
+msgstr "definisci un nuovo wrapper di dati esterni"
+
+#: sql_help.c:5508
+msgid "define a new foreign table"
+msgstr "definisci una nuova tabella esterna"
+
+#: sql_help.c:5514
+msgid "define a new function"
+msgstr "definisci una nuova funzione"
+
+#: sql_help.c:5520 sql_help.c:5580 sql_help.c:5682
+msgid "define a new database role"
+msgstr "definisci un nuovo ruolo database"
+
+#: sql_help.c:5526
+msgid "define a new index"
+msgstr "crea un nuovo indice"
+
+#: sql_help.c:5532
+msgid "define a new procedural language"
+msgstr "definisci un nuovo linguaggio procedurale"
+
+#: sql_help.c:5538
+msgid "define a new materialized view"
+msgstr "definisci una nuova vista materializzata"
+
+#: sql_help.c:5544
+msgid "define a new operator"
+msgstr "definisci un nuovo operatore"
+
+#: sql_help.c:5550
+msgid "define a new operator class"
+msgstr "definisci una nuova classe di operatori"
+
+#: sql_help.c:5556
+msgid "define a new operator family"
+msgstr "definisci una nuova famiglia operatore"
+
+#: sql_help.c:5562
+msgid "define a new row-level security policy for a table"
+msgstr "definisci una nuova regola di sicurezza per riga per una tabella"
+
+#: sql_help.c:5568
+msgid "define a new procedure"
+msgstr "definisci una nuova procedura"
+
+#: sql_help.c:5574
+msgid "define a new publication"
+msgstr "definisci una nuova pubblicazione"
+
+#: sql_help.c:5586
+msgid "define a new rewrite rule"
+msgstr "definisci una nuova regola di riscrittura"
+
+#: sql_help.c:5592
+msgid "define a new schema"
+msgstr "crea un nuovo schema"
+
+#: sql_help.c:5598
+msgid "define a new sequence generator"
+msgstr "definisci un nuovo generatore di sequenze"
+
+#: sql_help.c:5604
+msgid "define a new foreign server"
+msgstr "definisci un nuovo server esterno"
+
+#: sql_help.c:5610
+msgid "define extended statistics"
+msgstr "definisci una statistica estesa"
+
+#: sql_help.c:5616
+msgid "define a new subscription"
+msgstr "definisci una nuova sottoscrizione"
+
+#: sql_help.c:5622
+msgid "define a new table"
+msgstr "crea una nuova tabella"
+
+#: sql_help.c:5628 sql_help.c:6150
+msgid "define a new table from the results of a query"
+msgstr "crea una nuova tabella dai risultati di una query"
+
+#: sql_help.c:5634
+msgid "define a new tablespace"
+msgstr "crea un nuovo tablespace"
+
+#: sql_help.c:5640
+msgid "define a new text search configuration"
+msgstr "definisci una nuova configurazione di ricerca testo"
+
+#: sql_help.c:5646
+msgid "define a new text search dictionary"
+msgstr "definisci un nuovo dizionario di ricerca testo"
+
+#: sql_help.c:5652
+msgid "define a new text search parser"
+msgstr "definisci un nuovo analizzatore di ricerca testo"
+
+#: sql_help.c:5658
+msgid "define a new text search template"
+msgstr "definisci un nuovo modello di ricerca testo"
+
+#: sql_help.c:5664
+msgid "define a new transform"
+msgstr "definisci una nuova trasformazione"
+
+#: sql_help.c:5670
+msgid "define a new trigger"
+msgstr "definisci un nuovo trigger"
+
+#: sql_help.c:5676
+msgid "define a new data type"
+msgstr "definisci un nuovo tipo di dato"
+
+#: sql_help.c:5688
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definisci una nuova mappatura di un utente ad un server esterno"
+
+#: sql_help.c:5694
+msgid "define a new view"
+msgstr "definisci una nuova vista"
+
+#: sql_help.c:5700
+msgid "deallocate a prepared statement"
+msgstr "dealloca una istruzione preparata"
+
+#: sql_help.c:5706
+msgid "define a cursor"
+msgstr "definisci un cursore"
+
+#: sql_help.c:5712
+msgid "delete rows of a table"
+msgstr "elimina le righe di una tabella"
+
+#: sql_help.c:5718
+msgid "discard session state"
+msgstr "cancella lo stato della sessione"
+
+#: sql_help.c:5724
+msgid "execute an anonymous code block"
+msgstr "esegui un blocco di codice anonimo"
+
+#: sql_help.c:5730
+msgid "remove an access method"
+msgstr "rimuovi un metodo di accesso"
+
+#: sql_help.c:5736
+msgid "remove an aggregate function"
+msgstr "elimina una funzione aggregata"
+
+#: sql_help.c:5742
+msgid "remove a cast"
+msgstr "elimina una conversione di tipi"
+
+#: sql_help.c:5748
+msgid "remove a collation"
+msgstr "elimina un ordinamento"
+
+#: sql_help.c:5754
+msgid "remove a conversion"
+msgstr "elimina una conversione"
+
+#: sql_help.c:5760
+msgid "remove a database"
+msgstr "elimina un database"
+
+#: sql_help.c:5766
+msgid "remove a domain"
+msgstr "elimina un dominio"
+
+#: sql_help.c:5772
+msgid "remove an event trigger"
+msgstr "elimina un trigger di evento"
+
+#: sql_help.c:5778
+msgid "remove an extension"
+msgstr "elimina una estensione"
+
+#: sql_help.c:5784
+msgid "remove a foreign-data wrapper"
+msgstr "elimina un wrapper di dati esterni"
+
+#: sql_help.c:5790
+msgid "remove a foreign table"
+msgstr "elimina una tabella esterna"
+
+#: sql_help.c:5796
+msgid "remove a function"
+msgstr "elimina una funzione"
+
+#: sql_help.c:5802 sql_help.c:5868 sql_help.c:5970
+msgid "remove a database role"
+msgstr "elimina un ruolo di database"
+
+#: sql_help.c:5808
+msgid "remove an index"
+msgstr "elimina un indice"
+
+#: sql_help.c:5814
+msgid "remove a procedural language"
+msgstr "elimina un linguaggio procedurale"
+
+#: sql_help.c:5820
+msgid "remove a materialized view"
+msgstr "elimina una vista materializzata"
+
+#: sql_help.c:5826
+msgid "remove an operator"
+msgstr "elimina un operatore"
+
+#: sql_help.c:5832
+msgid "remove an operator class"
+msgstr "elimina una classe di operatori"
+
+#: sql_help.c:5838
+msgid "remove an operator family"
+msgstr "elimina una famiglia operatore"
+
+#: sql_help.c:5844
+msgid "remove database objects owned by a database role"
+msgstr "elimina gli oggetti database di proprietà di un ruolo di database"
+
+#: sql_help.c:5850
+msgid "remove a row-level security policy from a table"
+msgstr "rimuovi una regola di sicurezza per riga da una tabella"
+
+#: sql_help.c:5856
+msgid "remove a procedure"
+msgstr "rimuovi una procedura"
+
+#: sql_help.c:5862
+msgid "remove a publication"
+msgstr "rimuovi una pubblicazione"
+
+#: sql_help.c:5874
+msgid "remove a routine"
+msgstr "rimuovi una routine"
+
+#: sql_help.c:5880
+msgid "remove a rewrite rule"
+msgstr "elimina una regola di riscrittura"
+
+#: sql_help.c:5886
+msgid "remove a schema"
+msgstr "elimina uno schema"
+
+#: sql_help.c:5892
+msgid "remove a sequence"
+msgstr "elimina una sequenza"
+
+#: sql_help.c:5898
+msgid "remove a foreign server descriptor"
+msgstr "elimina una descrizione server esterno"
+
+#: sql_help.c:5904
+msgid "remove extended statistics"
+msgstr "rimuovi una statistica estesa"
+
+#: sql_help.c:5910
+msgid "remove a subscription"
+msgstr "rimuovi una sottoscrizione"
+
+#: sql_help.c:5916
+msgid "remove a table"
+msgstr "elimina una tabella"
+
+#: sql_help.c:5922
+msgid "remove a tablespace"
+msgstr "elimina un tablespace"
+
+#: sql_help.c:5928
+msgid "remove a text search configuration"
+msgstr "elimina una configurazione di ricerca testo"
+
+#: sql_help.c:5934
+msgid "remove a text search dictionary"
+msgstr "elimina un dizionario di ricerca testo"
+
+#: sql_help.c:5940
+msgid "remove a text search parser"
+msgstr "elimina un analizzatore di ricerca testo"
+
+#: sql_help.c:5946
+msgid "remove a text search template"
+msgstr "elimina un modello di ricerca testo"
+
+#: sql_help.c:5952
+msgid "remove a transform"
+msgstr "elimina una trasformazione"
+
+#: sql_help.c:5958
+msgid "remove a trigger"
+msgstr "elimina un trigger"
+
+#: sql_help.c:5964
+msgid "remove a data type"
+msgstr "elimina un tipo di dato"
+
+#: sql_help.c:5976
+msgid "remove a user mapping for a foreign server"
+msgstr "elimina la mappatura degli utenti per un server esterno"
+
+#: sql_help.c:5982
+msgid "remove a view"
+msgstr "elimina una vista"
+
+#: sql_help.c:5994
+msgid "execute a prepared statement"
+msgstr "esegui una istruzione preparata"
+
+#: sql_help.c:6000
+msgid "show the execution plan of a statement"
+msgstr "mostra il piano di esecuzione di una istruzione"
+
+#: sql_help.c:6006
+msgid "retrieve rows from a query using a cursor"
+msgstr "estrai delle righe da una query utilizzando un cursore"
+
+#: sql_help.c:6012
+msgid "define access privileges"
+msgstr "definisci i privilegi di accesso"
+
+#: sql_help.c:6018
+msgid "import table definitions from a foreign server"
+msgstr "importa le definizioni di tabella da un server remoto"
+
+#: sql_help.c:6024
+msgid "create new rows in a table"
+msgstr "crea nuove righe in una tabella"
+
+#: sql_help.c:6030
+msgid "listen for a notification"
+msgstr "attendi l'arrivo di notifiche"
+
+#: sql_help.c:6036
+msgid "load a shared library file"
+msgstr "carica un file di libreria condivisa"
+
+#: sql_help.c:6042
+msgid "lock a table"
+msgstr "blocca una tabella"
+
+#: sql_help.c:6048
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "inserire, aggiornare o eliminare condizionalmente le righe di una tabella"
+
+#: sql_help.c:6054
+msgid "position a cursor"
+msgstr "posiziona un cursore"
+
+#: sql_help.c:6060
+msgid "generate a notification"
+msgstr "genera una notifica"
+
+#: sql_help.c:6066
+msgid "prepare a statement for execution"
+msgstr "prepara una istruzione per l'esecuzione"
+
+#: sql_help.c:6072
+msgid "prepare the current transaction for two-phase commit"
+msgstr "prepara la transazione corrente per un commit a due fasi"
+
+#: sql_help.c:6078
+msgid "change the ownership of database objects owned by a database role"
+msgstr "cambia il proprietario degli oggetti del database posseduti da un ruolo"
+
+#: sql_help.c:6084
+msgid "replace the contents of a materialized view"
+msgstr "sostituisci il contenuto di una vista materializzata"
+
+#: sql_help.c:6090
+msgid "rebuild indexes"
+msgstr "ricostruisci indici"
+
+#: sql_help.c:6096
+msgid "destroy a previously defined savepoint"
+msgstr "distruggi un punto di salvataggio precedentemente definito"
+
+#: sql_help.c:6102
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "ripristina un parametro di esecuzione al suo valore di predefinito"
+
+#: sql_help.c:6108
+msgid "remove access privileges"
+msgstr "elimina i privilegi di accesso"
+
+#: sql_help.c:6120
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "annulla una transazione che era stata preparata per un commit a due fasi"
+
+#: sql_help.c:6126
+msgid "roll back to a savepoint"
+msgstr "annulla le modifiche fino a un punto di salvataggio"
+
+#: sql_help.c:6132
+msgid "define a new savepoint within the current transaction"
+msgstr "definisci un nuovo punto di salvataggio per la transazione corrente"
+
+#: sql_help.c:6138
+msgid "define or change a security label applied to an object"
+msgstr "definisci o modifica un'etichetta di sicurezza applicata a un oggetto"
+
+#: sql_help.c:6144 sql_help.c:6198 sql_help.c:6234
+msgid "retrieve rows from a table or view"
+msgstr "estrai righe da una tabella o una vista"
+
+#: sql_help.c:6156
+msgid "change a run-time parameter"
+msgstr "modifica un parametro di esecuzione"
+
+#: sql_help.c:6162
+msgid "set constraint check timing for the current transaction"
+msgstr "imposta il momento del controllo dei vincoli per la transazione corrente"
+
+#: sql_help.c:6168
+msgid "set the current user identifier of the current session"
+msgstr "imposta l'identificativo utente della sessione corrente"
+
+#: sql_help.c:6174
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "imposta l'identificazione utente della sessione e l'identificazione utente corrente della sessione corrente"
+
+#: sql_help.c:6180
+msgid "set the characteristics of the current transaction"
+msgstr "imposta le caratteristiche della transazione corrente"
+
+#: sql_help.c:6186
+msgid "show the value of a run-time parameter"
+msgstr "mostra il valore di un parametro di esecuzione"
+
+#: sql_help.c:6204
+msgid "empty a table or set of tables"
+msgstr "svuota una tabella o una lista di tabelle"
+
+#: sql_help.c:6210
+msgid "stop listening for a notification"
+msgstr "termina l'attesa di notifiche"
+
+#: sql_help.c:6216
+msgid "update rows of a table"
+msgstr "modifica le righe di una tabella"
+
+#: sql_help.c:6222
+msgid "garbage-collect and optionally analyze a database"
+msgstr "pulisci ed eventualmente analizza il database"
+
+#: sql_help.c:6228
+msgid "compute a set of rows"
+msgstr "genera una sequenza di righe"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 può essere utilizzato solo in modalità non interattiva"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "apertura del file di log \"%s\" fallita: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Digita \"help\" per avere un aiuto.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "impossibile impostare il parametro di stampa \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "argomento aggiuntivo della riga di comando \"%s\" ignorato"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "non è stato possibile trovare il proprio programma eseguibile"
+
+#: tab-complete.c:5952
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"query per il completamento tab fallita: %s\n"
+"La query era:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valore \"%s\" non valido per \"%s\": è necessario un booleano"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valore \"%s\" non valido per \"%s\": è necessario un intero"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nome di variabile non valido: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valore \"%s\" non riconosciuto per \"%s\"\n"
+"I valori disponibili sono: %s."
+
+#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+#~ msgstr ""
+#~ " \\g [FILE] o ; esegui la query (ed invia i risultati ad un file o\n"
+#~ " ad una |pipe)\n"
+
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENTO] \n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID operazioni sui large object\n"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: apertura del file di log \"%s\" fallita: %s\n"
+
+#~ msgid "All connection parameters must be supplied because no database connection exists\n"
+#~ msgstr "Tutti i parametri di connessione devono essere forniti perché non esiste alcuna connessione di database\n"
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Trigger disabilitati:"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Inserire la nuova password: "
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Comando errato \\%s. Prova \\? per la guida.\n"
+
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "relazione speciale \"%s.%s\""
+
+#~ msgid "The server (version %s) does not support altering default privileges.\n"
+#~ msgstr "Il server (versione %s) non supporta la modifica dei privilegi di default.\n"
+
+#~ msgid "The server (version %s) does not support editing function source.\n"
+#~ msgstr "Il server (versione %s) non supporta la modifica dei sorgenti delle funzioni.\n"
+
+#~ msgid "The server (version %s) does not support editing view definitions.\n"
+#~ msgstr "Il server (versione %s) non supporta la modifica della definizione delle viste.\n"
+
+#~ msgid "The server (version %s) does not support foreign servers.\n"
+#~ msgstr "Il server (versione %s) non supporta server esterni.\n"
+
+#~ msgid "The server (version %s) does not support foreign tables.\n"
+#~ msgstr "Il server (versione %s) non supporta tabelle esterne.\n"
+
+#~ msgid "The server (version %s) does not support foreign-data wrappers.\n"
+#~ msgstr "Il server (versione %s) non supporta i wrapper di dati esterni.\n"
+
+#~ msgid "The server (version %s) does not support full text search.\n"
+#~ msgstr "Il server (versione %s) non supporta la ricerca full text.\n"
+
+#~ msgid "The server (version %s) does not support per-database role settings.\n"
+#~ msgstr "Il server (versione %s) non supporta l'impostazione dei ruoli per database.\n"
+
+#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n"
+#~ msgstr "Il server (versione %s) non supporta savepoint per ON_ERROR_ROLLBACK.\n"
+
+#~ msgid "The server (version %s) does not support showing function source.\n"
+#~ msgstr "Il server (versione %s) non supporta la visualizzazione dei sorgenti delle funzioni.\n"
+
+#~ msgid "The server (version %s) does not support showing view definitions.\n"
+#~ msgstr "-\"Il server (versione %s) non supporta la visualizzazione della definizione delle viste.\n"
+
+#~ msgid "The server (version %s) does not support tablespaces.\n"
+#~ msgstr "Il server (versione %s) non supporta i tablespace.\n"
+
+#~ msgid "The server (version %s) does not support user mappings.\n"
+#~ msgstr "Il server (versione %s) non supporta la mappatura di utenti.\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "processo figlio terminato da segnale %s"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "spostamento nella directory \"%s\" fallito: %s"
+
+#~ msgid "could not close pipe to external command: %s\n"
+#~ msgstr "chiusura della pipe verso il comando esterno fallita: %s\n"
+
+#~ msgid "could not execute command \"%s\": %s\n"
+#~ msgstr "esecuzione del comando \"%s\" fallito: %s\n"
+
+#~ msgid "could not open temporary file \"%s\": %s\n"
+#~ msgstr "apertura del file temporaneo \"%s\" fallita: %s\n"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "lettura del link simbolico \"%s\" fallita"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "richiesta informazioni sul file \"%s\" fallita: %s\n"
+
+#~ msgid "from_list"
+#~ msgstr "lista_from"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose fallita: %s"
+
+#~ msgid "special"
+#~ msgstr "speciale"
+
+#~ msgid "string_literal"
+#~ msgstr "letterale_stringa"
+
+#~ msgid "timezone"
+#~ msgstr "timezone"
+
+#~ msgid "unexpected result status for \\watch\n"
+#~ msgstr "risultato imprevisto per \\watch\n"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "stringa tra virgolette non terminata\n"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "dove direzione può essere vuota o una di:"
diff --git a/src/bin/psql/po/ja.po b/src/bin/psql/po/ja.po
new file mode 100644
index 0000000..6794918
--- /dev/null
+++ b/src/bin/psql/po/ja.po
@@ -0,0 +1,6567 @@
+# psql.po
+# Japanese message translation file for psql
+#
+# Copyright (C) 2010-2022 PostgreSQL Global Development Group
+#
+# Michihide Hotta <hotta@net-newbie.com>, 2010.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-07-20 09:25+0900\n"
+"PO-Revision-Date: 2023-11-22 10:49+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ä¸æ­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–ã‚Œã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "実行対象ã®\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’複製ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“(内部エラー) \n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "実効ユーザーID %ld ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ユーザーåã®æ¤œç´¢ã«å¤±æ•—: エラー コード %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "コマンドãŒå®Ÿè¡Œå½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­ãƒ—ロセスãŒçµ‚了コード %d ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­ãƒ—ロセスãŒä¾‹å¤– 0x%X ã§å¼·åˆ¶çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­ãƒ—ロセスã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­ãƒ—ロセスã¯èªè­˜ã§ããªã„ステータス %d ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "キャンセルè¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "キャンセルè¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "割り込ã¿\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "テーブルã®å†…容ã«ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’追加ã§ãã¾ã›ã‚“: 列数ã®ä¸Šé™å€¤%dを超ãˆã¦ã„ã¾ã™ã€‚\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "テーブルã®å†…容ã«ã‚»ãƒ«ã‚’追加ã§ãã¾ã›ã‚“: セルã®åˆè¨ˆæ•° %d ãŒåˆ¶é™å€¤ã‚’超ãˆã¦ã„ã¾ã™ã€‚\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "出力フォーマットãŒç„¡åŠ¹(内部エラー):%d"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "ローカルユーザーID %dã®å‚ç…§ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "ID %d ã‚’æŒã¤ãƒ­ãƒ¼ã‚«ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "ä¸æ­£ãªã‚³ãƒžãƒ³ãƒ‰ \\%s "
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr " \\? ã§ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚"
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: 余分ãªå¼•æ•°\"%s\"ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s コマンドã¯ç„¡è¦–ã•ã‚Œã¾ã™; ç¾åœ¨ã®\\ifブロックを抜ã‘ã‚‹ã«ã¯\\endifã¾ãŸã¯Ctrl-Cを使用ã—ã¾ã™"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "ユーザーID %ldã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—㟠: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: ディレクトリを\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“。\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"上ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€\"%s\"ã®ã‚½ã‚±ãƒƒãƒˆã‚’介ã—ã¦ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"(アドレス\"%s\")上ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"上ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ä¸æ­£ãªè¡Œç•ªå·ã§ã™: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "変更ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: エンコーディングåãŒä¸æ­£ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯å¤‰æ›ãƒ—ロシージャãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "ç›´å‰ã®ã‚¨ãƒ©ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: å³æ‹¬å¼§ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: å¿…è¦ãªå¼•æ•°ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: \\else ã®å¾Œã«ã¯ç½®ã‘ã¾ã›ã‚“"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: 対応ã™ã‚‹ \\if ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: \\else ã®å¾Œã«ã¯ç½®ã‘ã¾ã›ã‚“"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: 対応ã™ã‚‹ \\if ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: 対応ã™ã‚‹ \\if ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã¯ç©ºã§ã™ã€‚"
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "ユーザー\"%s\"ã®æ–°ã—ã„パスワードを入力ã—ã¦ãã ã•ã„: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "ã‚‚ã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: 変数ã®å€¤ã‚’読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ãŒãƒªã‚»ãƒƒãƒˆ(クリア)ã•ã‚Œã¾ã—ãŸã€‚"
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "ファイル\"%s\"ã«ãƒ’ストリーを出力ã—ã¾ã—ãŸã€‚\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: 環境変数åã«\"=\"ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "関数åãŒå¿…è¦ã§ã™"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "ビューåãŒå¿…è¦ã§ã™"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "タイミング㯠on ã§ã™ã€‚"
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "タイミング㯠off ã§ã™ã€‚"
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: インターãƒãƒ«å€¤ãŒ2回以上指定ã•ã‚Œã¾ã—ãŸ"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: ä¸æ­£ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒ«å€¤ \"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: å復回数ãŒ2回以上指定ã•ã‚Œã¾ã—ãŸ"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: ä¸æ­£ãªå復回数 '%s'"
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: èªè­˜ã§ããªã„パラーメータ \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "パスワード: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "ユーザー %s ã®ãƒ‘スワード: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "接続文字列使用時ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã€ãƒ›ã‚¹ãƒˆãŠã‚ˆã³ãƒãƒ¼ãƒˆã¯å€‹åˆ¥ã«æŒ‡å®šã—ãªã„ã§ãã ã•ã„"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "パラメータå†åˆ©ç”¨ã«ä½¿ç”¨å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "以å‰ã®æŽ¥ç¶šã¯ä¿æŒã•ã‚Œã¦ã„ã¾ã™"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ã‚½ã‚±ãƒƒãƒˆ\"%s\"ã®ãƒãƒ¼ãƒˆ\"%s\"を介ã—ã¦æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"(アドレス\"%s\")ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"ã®ãƒãƒ¼ãƒˆ\"%s\"を介ã—ã¦æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%sã€ã‚µãƒ¼ãƒãƒ¼ %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"警告: %s ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ %s ã§ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ %s ã§ã™ã€‚\n"
+" psql ã®æ©Ÿèƒ½ã®ä¸­ã§ã€å‹•ä½œã—ãªã„ã‚‚ã®ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL接続(プロトコル: %sã€æš—å·åŒ–æ–¹å¼: %sã€åœ§ç¸®: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "ä¸æ˜Ž"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "オフ"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "オン"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPIæš—å·åŒ–接続\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"警告:コンソールã®ã‚³ãƒ¼ãƒ‰ãƒšãƒ¼ã‚¸(%u)ãŒWindowsã®ã‚³ãƒ¼ãƒ‰ãƒšãƒ¼ã‚¸(%u)ã¨ç•°ãªã‚‹ãŸã‚ã€\n"
+" 8ビット文字ãŒæ­£ã—ã表示ã•ã‚Œãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚詳細ã¯psqlリファレンスマニュアルã®\n"
+" \"Windowsユーザーå‘ã‘ã®æ³¨æ„\" (Notes for Windows users)ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "環境変数PSQL_EDITOR_LINENUMBER_ARGã§è¡Œç•ªå·ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "エディタ\"%s\"ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "/bin/shã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "一時ディレクトリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "一時ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: 曖昧ãªçŸ­ç¸®å½¢\"%s\"ãŒ\"%s\"ã¨\"%s\"ã®ã©ã¡ã‚‰ã«ã‚‚åˆè‡´ã—ã¾ã™"
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: 有効ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: 有効ãªç·šã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: 有効㪠Unicode 罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: 有効㪠Unicode 列罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: 有効㪠Unicode ヘッダー罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: xheader_widthã«æŒ‡å®šå¯èƒ½ãªå€¤ã¯ã€\"%s\" (default)ã€\"%s\"ã€\"%s\"ã€ã¾ãŸã¯å¹…ãã®ã‚‚ã®ã‚’指定ã™ã‚‹æ•°å€¤ã§ã™"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsepã¯å˜ä¸€ã®1ãƒã‚¤ãƒˆæ–‡å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsepã¯ãƒ€ãƒ–ルクォートã€æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ã«ã¯ã§ãã¾ã›ã‚“"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: 未定義ã®ã‚ªãƒ—ション:%s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "罫線スタイル㯠%d ã§ã™ã€‚\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "ターゲットã®å¹…ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "ターゲットã®å¹…㯠%d ã§ã™ã€‚\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "拡張表示㯠on ã§ã™ã€‚\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "拡張表示ãŒè‡ªå‹•çš„ã«ä½¿ã‚ã‚Œã¾ã™ã€‚\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "拡張表示㯠off ã§ã™ã€‚\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "拡張表示ヘッダ幅ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "拡張表示ヘッダ幅ã¯%dã§ã™ã€‚\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSVã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åŒºåˆ‡ã‚Šæ–‡å­—ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "フィールド区切り文字ã¯ã‚¼ãƒ­ãƒã‚¤ãƒˆã§ã™ã€‚\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "フィールド区切り文字ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "デフォルトフッター(行数ã®è¡¨ç¤º)㯠on ã§ã™ã€‚\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "デフォルトフッター(行数ã®è¡¨ç¤º)㯠off ã§ã™ã€‚\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "出力形å¼ã¯ %s ã§ã™ã€‚\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "ç·šã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ %s ã§ã™ã€‚\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null表示ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "『数値出力時ã®ãƒ­ã‚±ãƒ¼ãƒ«èª¿æ•´ã€ã¯ on ã§ã™ã€‚\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "『数値出力時ã®ãƒ­ã‚±ãƒ¼ãƒ«èª¿æ•´ã€ã¯ off ã§ã™ã€‚\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "表示ãŒç¸¦ã«é•·ããªã‚‹å ´åˆã¯ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’使ã„ã¾ã™ã€‚\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "常ã«ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’使ã„ã¾ã™ã€‚\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "「ページャーを使ã†ã€ã¯ off ã§ã™ã€‚\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "%d 行未満ã®å ´åˆã€ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ä½¿ã‚ã‚Œã¾ã›ã‚“。\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "レコードã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯ã‚¼ãƒ­ãƒã‚¤ãƒˆã§ã™\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "レコード区切り文字ã¯<newline>ã§ã™ã€‚\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "レコード区切り記å·ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "テーブル属性ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "テーブル属性ã¯è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "タイトルã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "タイトルã¯è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "「タプルã®ã¿è¡¨ç¤ºã€ã¯ on ã§ã™ã€‚\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "「タプルã®ã¿è¡¨ç¤ºã€ã¯ off ã§ã™ã€‚\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode ã®ç½«ç·šã‚¹ã‚¿ã‚¤ãƒ«ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode 行罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicodeヘッダー行ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯\"%s\"ã§ã™ã€‚\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: 失敗"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watchã¯ç©ºã®å•ã„åˆã‚ã›ã§ã¯ä½¿ãˆã¾ã›ã‚“"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "タイマーを設定ã§ãã¾ã›ã‚“: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (%g 秒毎)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (%g 秒毎)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "シグナルを待機ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** å•ã„åˆã‚ã› ******\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\"ã¯ãƒ“ューã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptionsé…列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "有効ãªæŽ¥ç¶šãŒãªã„ã®ã§ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã§ãã¾ã›ã‚“"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒå¤±ã‚ã‚Œã¾ã—ãŸ"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒå¤±ã‚ã‚Œã¾ã—ãŸã€‚リセットã—ã¦ã„ã¾ã™: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "失敗。\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "æˆåŠŸã€‚\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "想定外ã®PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "時間: %.3f ミリ秒\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "時間: %.3f ミリ秒(%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "時間: %.3f ミリ秒 (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "時間: %.3f ミリ秒 (%.0f 日 %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“。"
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "PID %3$dã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã‹ã‚‰ã€ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰\"%2$s\"ã‚’æŒã¤éžåŒæœŸé€šçŸ¥\"%1$s\"ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "PID %2$dã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã‹ã‚‰éžåŒæœŸé€šçŸ¥\"%1$s\"ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "çµæžœãƒ†ãƒ¼ãƒ–ルを表示ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset ã«å¯¾ã—ã¦è¿”ã™ã¹ãè¡ŒãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset ã«å¯¾ã—ã¦è¤‡æ•°ã®è¡ŒãŒè¿”ã•ã‚Œã¾ã—ãŸ"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "特殊変数\"%s\"ã¸ã®\\gsetã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(シングルステップモード: コマンドを確èªã—ã¦ãã ã•ã„)********\n"
+"%s\n"
+"***([Enter] を押ã—ã¦é€²ã‚€ã‹ã€x [Enter] ã§ã‚­ãƒ£ãƒ³ã‚»ãƒ«)**************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "æ–‡: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "想定外ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çŠ¶æ…‹(%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "列"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "タイプ"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯çµæžœã‚’è¿”å´ã—ãªã„ã‹ã€çµæžœã«ã‚«ãƒ©ãƒ ãŒå«ã¾ã‚Œã¾ã›ã‚“。\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: 引数ãŒå¿…è¦ã§ã™"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: \"%s\"ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: è¡Œã®æœ«å°¾ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: ディレクトリã‹ã‚‰/ã¸ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "外部コマンドã«å¯¾ã™ã‚‹ãƒ‘イプをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "COPY データを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY データã®è»¢é€ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "ユーザーã«ã‚ˆã£ã¦ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"コピーã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã«ç¶šã„ã¦æ”¹è¡Œã‚’入力ã—ã¦ãã ã•ã„。\n"
+"ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã¨ãƒ”リオドã ã‘ã®è¡Œã€ã‚‚ã—ã㯠EOF シグナルã§çµ‚了ã—ã¾ã™ã€‚"
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "読ã¿å–りエラーã®ãŸã‚中止"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "コピーモードを終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: æ–‡ã¯çµæžœã‚»ãƒƒãƒˆã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸ"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: å•ã„åˆã‚ã›ã¯ã€å°‘ãªãã¨ã‚‚3ã¤ã®åˆ—ã‚’è¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: åž‚ç›´æ–¹å‘ã¨æ°´å¹³æ–¹å‘ã®ãƒ˜ãƒƒãƒ€ãƒ¼ã¯ç•°ãªã£ãŸåˆ—ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: å•ã„åˆã‚ã›ãŒ 4 ã¤ä»¥ä¸Šã®åˆ—ã‚’è¿”ã™å ´åˆã€ãƒ‡ãƒ¼ã‚¿åˆ—を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "列数ãŒåˆ¶é™å€¤(%d)を超ãˆã¦ã„ã¾ã™"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: å•ã„åˆã‚ã›çµæžœã®ä¸­ã®\"%s\"è¡Œ \"%s\"列ã«è¤‡æ•°ã®ãƒ‡ãƒ¼ã‚¿å€¤ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: 列番å·%dãŒç¯„囲外ã§ã™(1..%d)"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: 列åãŒã‚ã„ã¾ã„ã§ã™: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 列åãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "スキーマ"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "åå‰"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "çµæžœã®ãƒ‡ãƒ¼ã‚¿åž‹"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "引数ã®ãƒ‡ãƒ¼ã‚¿åž‹"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "説明"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "集約関数一覧"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。"
+
+#: describe.c:168
+msgid "Index"
+msgstr "インデックス"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "テーブル"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "ãƒãƒ³ãƒ‰ãƒ©"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "アクセスメソッド一覧"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "所有者"
+
+#: describe.c:231
+msgid "Location"
+msgstr "場所"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "オプション"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "サイズ"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "テーブル空間一覧"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\dfã§æŒ‡å®šã§ãるオプション㯠[anptwS+] ã®ã¿ã§ã™"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\dfã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³%2$sã§ã¯\"%1$c\"オプションã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "集約"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ウィンドウ"
+
+#: describe.c:356
+msgid "proc"
+msgstr "プロシージャ"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "関数"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "トリガー"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "IMMUTABLE"
+
+#: describe.c:387
+msgid "stable"
+msgstr "STABLE"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "VOLATILE"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "関数ã®å¤‰å‹•æ€§åˆ†é¡ž"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "制é™ä»˜ã"
+
+#: describe.c:398
+msgid "safe"
+msgstr "安全"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "å±é™º"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "並列実行"
+
+#: describe.c:405
+msgid "definer"
+msgstr "定義ロール"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "起動ロール"
+
+#: describe.c:407
+msgid "Security"
+msgstr "セキュリティ"
+
+#: describe.c:412
+msgid "Language"
+msgstr "手続ã言語"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "内部å"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "関数一覧"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "構æˆè¦ç´ "
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "データ型一覧"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "左辺ã®åž‹"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "å³è¾ºã®åž‹"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "çµæžœã®åž‹"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "関数"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "演算å­ä¸€è¦§"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "エンコーディング"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "ロケールプロãƒã‚¤ãƒ€ãƒ¼"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "ç…§åˆé †åº"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype(変æ›æ¼”ç®—å­)"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICUロケール"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "ICUルール:"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "テーブル空間"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "データベース一覧"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "テーブル"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "ビュー"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "実体化ビュー"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "シーケンス"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "外部テーブル"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "パーティションテーブル"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "列ã®æ¨©é™"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "ãƒãƒªã‚·ãƒ¼"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "アクセス権é™"
+
+#: describe.c:1195
+msgid "function"
+msgstr "関数"
+
+#: describe.c:1197
+msgid "type"
+msgstr "åž‹"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "スキーマ"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "デフォルトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "オブジェクト"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "テーブル制約"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "ドメイン制約"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "演算å­æ—"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "ルール"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "オブジェクトã®èª¬æ˜Ž"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "リレーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "OID %sã‚’æŒã¤ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "開始"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "最å°"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "最大"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "増分"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "ã¯ã„"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "ã„ã„ãˆ"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "循環?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "キャッシュ"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "所有者: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "識別列ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ログ出力ãªã—ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹\"%s.%s\""
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "シーケンス \"%s.%s\""
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ログ出力ãªã—ã®ãƒ†ãƒ¼ãƒ–ル\"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "テーブル\"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "ビュー\"%s.%s\""
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "ログ出力ãªã—ã®å®Ÿä½“化ビュー\"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "実体化ビュー\"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "ログ出力ãªã—ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "インデックス\"%s.%s\""
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "ログ出力ãªã—ã®ãƒ‘ーティション親インデックス\"%s.%s\""
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "パーティションインデックス\"%s.%s\""
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST テーブル\"%s.%s\""
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "複åˆåž‹\"%s.%s\""
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "外部テーブル\"%s.%s\""
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ログ出力ãªã—ã®ãƒ‘ーティション親テーブル\"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "パーティションテーブル\"%s.%s\""
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "ç…§åˆé †åº"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "Null 値を許容"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "デフォルト"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "キー?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "定義"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "FDW オプション"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "ストレージ"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "圧縮"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "統計目標"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "親パーティション: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "パーティション制約ãªã—"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "パーティションã®åˆ¶ç´„: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "パーティションキー: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "所属先テーブル\"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "プライマリキー, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "ユニーク"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "テーブル\"%s.%s\"用"
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr "ã€è¿°èªž (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr "ã€ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼åŒ–"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr "無効"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr "ã€é…延å¯èƒ½"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr "ã€æœ€åˆã‹ã‚‰é…延中"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr "ã€ãƒ¬ãƒ—リカ㮠id"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "インデックス:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "Check 制約:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "外部キー制約:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "å‚照元:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "ãƒãƒªã‚·ãƒ¼:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "ãƒãƒªã‚·ãƒ¼(行セキュリティを強制的ã«æœ‰åŠ¹åŒ–):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "ãƒãƒªã‚·ãƒ¼(行セキュリティ有効化): (ãªã—)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "ãƒãƒªã‚·ãƒ¼(行セキュリティを強制的ã«æœ‰åŠ¹åŒ–): (ãªã—)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "ãƒãƒªã‚·ãƒ¼(行セキュリティを無効化):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "統計オブジェクト:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "ルール:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "無効化ã•ã‚ŒãŸãƒ«ãƒ¼ãƒ«:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "常ã«é©ç”¨ã™ã‚‹ãƒ«ãƒ¼ãƒ«:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "レプリカ上ã§ã®ã¿é©ç”¨ã™ã‚‹ãƒ«ãƒ¼ãƒ«:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "パブリケーション:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "ビューã®å®šç¾©:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "トリガー:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "無効化ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒˆãƒªã‚¬:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "無効化ã•ã‚ŒãŸå†…部トリガー:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "常ã«é©ç”¨ã™ã‚‹ã™ã‚‹ãƒˆãƒªã‚¬ãƒ¼:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "レプリカ上ã§ã®ã¿é©ç”¨ã™ã‚‹ãƒˆãƒªã‚¬ãƒ¼:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "サーãƒãƒ¼: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW オプション: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "継承元"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "パーティション数: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "パーティション数: %d (\\d+ ã§ä¸€è¦§ã‚’表示)。"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "å­ãƒ†ãƒ¼ãƒ–ル数: %d (\\d+ ã§ä¸€è¦§ã‚’表示)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "å­ãƒ†ãƒ¼ãƒ–ル"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "パーティション"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "%s åž‹ã®åž‹ä»˜ãテーブル"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "レプリカ識別"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "OID ã‚ã‚Š: ã¯ã„"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "アクセスメソッド: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr "ã€ãƒ†ãƒ¼ãƒ–ル空間\"%s\""
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "ロール一覧"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "ロールå"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "属性"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "スーパーユーザー"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "継承ãªã—"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "ロール作æˆå¯"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "DB作æˆå¯"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "ログインã§ãã¾ã›ã‚“"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "レプリケーションå¯"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "RLS ã®ãƒã‚¤ãƒ‘ス"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "接続ãªã—"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d 個ã®æŽ¥ç¶š"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "パスワードã®æœ‰åŠ¹æœŸé™ "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "ロール"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "データベース"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "設定"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "ロール\"%s\"ã¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã®è¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "ロール\"%s\"ã®è¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "設定ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "設定一覧"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "所属グループ"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "付与者"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "ロール権é™ä»˜ä¸Žä¸€è¦§"
+
+#: describe.c:3952
+msgid "index"
+msgstr "インデックス"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST テーブル"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "パーティションインデックス"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "永続"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "一時"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "ログãªã—"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "永続性"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "アクセスメソッド"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "リレーション一覧"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯å®£è¨€çš„テーブルパーティショニングをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。"
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "パーティションインデックスã®ä¸€è¦§"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "パーティションテーブルã®ä¸€è¦§"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "パーティションリレーションã®ä¸€è¦§"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "親ã®åå‰"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "末端パーティションã®ã‚µã‚¤ã‚º"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "トータルサイズ"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "信頼済ã¿"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "内部言語"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "呼ã³å‡ºã—ãƒãƒ³ãƒ‰ãƒ©ãƒ¼"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "インラインãƒãƒ³ãƒ‰ãƒ©ãƒ¼"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "手続ã言語一覧"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "CHECK制約"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "ドメイン一覧"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "変æ›å…ƒ"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "変æ›å…ˆ"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "デフォルト?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "符å·åŒ–æ–¹å¼ä¸€è¦§"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "パラメータ"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "値"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "コンテクスト"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "設定パラメータã®ä¸€è¦§"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "éžãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®è¨­å®šãƒ‘ラメータã®ä¸€è¦§"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ãƒ¼ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。"
+
+#: describe.c:4654
+msgid "Event"
+msgstr "イベント"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "有効"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "レプリカ"
+
+#: describe.c:4658
+msgid "always"
+msgstr "常時"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "無効"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "有効状態"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "ã‚¿ã‚°"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "イベントトリガー一覧"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯æ‹¡å¼µçµ±è¨ˆæƒ…報をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。"
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Dependencies"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "拡張統計情報ã®ä¸€è¦§"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "変æ›å…ƒã®åž‹"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "変æ›å…ˆã®åž‹"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "代入時ã®ã¿"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "暗黙的ã«é©ç”¨ ?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "キャスト一覧"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "プロãƒã‚¤ãƒ€ãƒ¼"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "確定的?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "ç…§åˆé †åºä¸€è¦§"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "スキーマ一覧"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "テキスト検索用パーサ一覧"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "テキスト検索用パーサ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "テキスト検索パーサãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "パース開始"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "メソッド"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "次ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’å–å¾—"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "パース終了"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "見出ã—ã‚’å–å¾—"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "トークンタイプをå–å¾—"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "テキスト検索パーサ\"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "テキスト検索パーサ\"%s\""
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "トークンå"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "パーサ\"%s.%s\"ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚¿ã‚¤ãƒ—"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "パーサ\"%s\"ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚¿ã‚¤ãƒ—"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "テンプレート"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "åˆæœŸåŒ–オプション"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "テキスト検索用辞書一覧"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "åˆæœŸåŒ–"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Lex 処ç†"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "テキスト検索テンプレート一覧"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "テキスト検索設定一覧"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "テキスト検索用設定\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "テキスト検索設定ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:5698
+msgid "Token"
+msgstr "トークン"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "辞書"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "テキスト検索設定\"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "テキスト検索設定\"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"パーサ: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"パーサ: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "外部データラッパ一覧"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "外部データラッパ"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "外部サーãƒãƒ¼ä¸€è¦§"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "サーãƒãƒ¼"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "ユーザーå"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "ユーザーマッピング一覧"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "外部テーブル一覧"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "インストール済ã¿ã®æ‹¡å¼µä¸€è¦§"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "\"%s\"ã¨ã„ã†åå‰ã®æ©Ÿèƒ½æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "機能拡張ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "オブジェクトã®èª¬æ˜Ž"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "機能拡張\"%s\"内ã®ã‚ªãƒ–ジェクト"
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "データベース間ã®å‚ç…§ã¯å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ãƒ‘ブリケーションをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。"
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "全テーブル"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Insertæ–‡"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Updateæ–‡"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Deleteæ–‡"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Truncateæ–‡"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "最上ä½ãƒ‘ーティションテーブル経由"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "パブリケーション一覧"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒ‘ブリケーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "パブリケーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "パブリケーション %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "テーブル:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "以下ã®ã‚¹ã‚­ãƒ¼ãƒžå†…ã®ãƒ†ãƒ¼ãƒ–ル:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ã‚µãƒ–スクリプションをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。"
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "パブリケーション"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "ãƒã‚¤ãƒŠãƒª"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "ストリーミング"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "2相コミット"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "エラー時無効化"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "起点"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "パスワード必須"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "所有者ã¨ã—ã¦å®Ÿè¡Œ?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "åŒæœŸã‚³ãƒŸãƒƒãƒˆ"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "接続情報"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "スキップLSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "サブスクリプション一覧"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "入力ã®åž‹"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "ストレージタイプ"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "演算å­æ—"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹ä¸€è¦§"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "é©ç”¨å¯èƒ½åž‹"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "演算å­æ—一覧"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "演算å­"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "ストラテジ"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "é †åºä»˜ã‘"
+
+#: describe.c:6911
+msgid "search"
+msgstr "検索"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "目的"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "ソート演算å­æ—"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "演算å­æ—ã®æ¼”ç®—å­ä¸€è¦§"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "登録左辺型"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "登録å³è¾ºåž‹"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "番å·"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "演算å­æ—ã®ã‚µãƒãƒ¼ãƒˆé–¢æ•°ä¸€è¦§"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "ラージ オブジェクト"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql 㯠PostgreSQL ã®å¯¾è©±åž‹ã‚¿ãƒ¼ãƒŸãƒŠãƒ«ã§ã™ã€‚\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "使ã„æ–¹:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [オプション]... [データベースå [ユーザーå]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "一般的ãªã‚ªãƒ—ション:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=コマンド å˜ä¸€ã®(SQLã¾ãŸã¯å†…部)コマンドを一ã¤ã ã‘実行ã—ã¦çµ‚了\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBå 接続ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å(デフォルト: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME ファイルã‹ã‚‰ã‚³ãƒžãƒ³ãƒ‰ã‚’読ã¿è¾¼ã‚“ã§å®Ÿè¡Œå¾Œã€çµ‚了\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l(エル), --list 使用å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ä¸€è¦§ã‚’表示ã—ã¦çµ‚了\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=åå‰=値\n"
+" psql 変数 'åå‰' ã« '値' をセット\n"
+" (例: -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc åˆæœŸåŒ–ファイル (~/.psqlrc) を読ã¿è¾¼ã¾ãªã„\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (æ•°å­—ã®1), --single-transaction\n"
+" (対話形å¼ã§ãªã„å ´åˆ)å˜ä¸€ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¨ã—ã¦å®Ÿè¡Œ\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã®ä¸€è¦§ã‚’表示ã—ã¦çµ‚了\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 特殊変数ã®ä¸€è¦§ã‚’表示ã—ã¦çµ‚了\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"入出力オプション:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all スクリプトã‹ã‚‰èª­ã¿è¾¼ã‚“ã å…¥åŠ›ã‚’ã™ã¹ã¦è¡¨ç¤º\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 失敗ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries サーãƒãƒ¼ã¸é€ä¿¡ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 内部コマンドãŒç”Ÿæˆã—ãŸå•ã„åˆã‚ã›ã‚’表示\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME セッションログをファイルã«æ›¸ã込む\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline 拡張コマンドライン編集機能(readline)を無効ã«ã™ã‚‹\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME å•ã„åˆã‚ã›ã®çµæžœã‚’ファイル (ã¾ãŸã¯ |パイプ)ã«é€ã‚‹\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet é™ã‹ã«å®Ÿè¡Œ (メッセージãªã—ã§ã€å•ã„åˆã‚ã›ã®å‡ºåŠ›ã®ã¿)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step シングルステップモード (å„å•ã„åˆã‚ã›ã”ã¨ã«ç¢ºèª)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line å˜ä¸€è¡Œãƒ¢ãƒ¼ãƒ‰ (行末ã§SQLコマンドを終端)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"出力フォーマットã®ã‚ªãƒ—ション\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align æ¡æƒãˆãªã—ã®ãƒ†ãƒ¼ãƒ–ル出力モード\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV(カンマ区切り)テーブル出力モード\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=文字列\n"
+" æ¡æƒãˆãªã—出力時ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åŒºåˆ‡ã‚Šæ–‡å­—\n"
+" (デフォルト: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML テーブル出力モード\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr ""
+" -P, --pset=変数[=値] 表示オプション '変数' ã‚’ '値' ã«ã‚»ãƒƒãƒˆ\n"
+" (\\pset コマンドをå‚ç…§)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=文字列\n"
+" æ¡æƒãˆãªã—出力ã«ãŠã‘るレコード区切り文字\n"
+" (デフォルト: 改行)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only è¡Œã®ã¿ã‚’表示\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT HTMLテーブルã®ã‚¿ã‚°å±žæ€§ã‚’セット (width, borderç­‰)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded 拡張テーブル出力ã«åˆ‡ã‚Šæ›¿ãˆã‚‹\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" æ¡æƒãˆãªã—出力ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åŒºåˆ‡ã‚Šã‚’ãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" æ¡æƒãˆãªã—出力ã®ãƒ¬ã‚³ãƒ¼ãƒ‰åŒºåˆ‡ã‚Šã‚’ãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆã®\n"
+" ディレクトリ(デフォルト: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "ローカルソケット"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·(デフォルト: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME データベースã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å (デフォルト: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力をè¦æ±‚ã—ãªã„\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password パスワードプロンプトã®å¼·åˆ¶è¡¨ç¤º(本æ¥ã¯è‡ªå‹•çš„ã«è¡¨ç¤º)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"詳細ã¯psqlã®ä¸­ã§\"\\?\"(内部コマンドã®å ´åˆ)ã¾ãŸã¯\"\\help\"(SQLコマンドã®å ´åˆ)\n"
+"をタイプã™ã‚‹ã‹ã€PostgreSQLドキュメント中ã®psqlã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "一般\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... å•ã„åˆã‚ã›ãƒ‘ラメータを設定\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL ã®ä½¿ã„æ–¹ã¨é…布æ¡ä»¶ã‚’表示\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [列リスト] å•ã„åˆã‚ã›ã‚’実行ã—ã€çµæžœã‚’クロス表形å¼ã§å‡ºåŠ›\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose 最後ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’最大ã®å†—長性ã§è¡¨ç¤º\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] å•ã„åˆã‚ã›å®Ÿè¡Œ (çµæžœã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ |パイプã¸å‡ºåŠ›);\n"
+" 引数ãªã—ã®\\gã¯ã‚»ãƒŸã‚³ãƒ­ãƒ³ã¨åŒç¾©\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc å•ã„åˆã‚ã›ã‚’実行ã›ãšã«çµæžœã®èª¬æ˜Žã‚’è¡Œã†\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec å•ã„åˆã‚ã›ã‚’実行ã—ã€çµæžœã®ä¸­ã®å€‹ã€…ã®å€¤ã‚’実行\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] å•ã„åˆã‚ã›ã‚’実行ã—ã¦çµæžœã‚’ psql 変数ã«æ ¼ç´\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [ファイルå] \\g ã¨åŒã˜ã€ãŸã ã—拡張出力モードを強制\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q psql を終了ã™ã‚‹\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] å•ã„åˆã‚ã›ã‚’SEC秒ã”ã¨ã«æœ€å¤§N回実行ã™ã‚‹\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "ヘルプ\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [コマンド] ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã®ãƒ˜ãƒ«ãƒ—を表示\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? オプション psql ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ãƒ»ã‚ªãƒ—ションã®ãƒ˜ãƒ«ãƒ—を表示\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? 変数å 特殊変数ã®ãƒ˜ãƒ«ãƒ—を表示\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [åå‰] SQLコマンドã®æ–‡æ³•ãƒ˜ãƒ«ãƒ—ã®è¡¨ç¤ºã€‚* ã§å…¨ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr ""
+" \\e [ファイル] [行番å·] ç¾åœ¨ã®å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡(やファイル)を外部エディタã§\n"
+" 編集\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [関数å [行番å·]] 関数定義を外部エディタã§ç·¨é›†\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [ビューå [行番å·]] ビュー定義を外部エディタã§ç·¨é›†\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã®å†…容を表示\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã‚’リセット(クリア)\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ファイル] ヒストリを表示ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å­˜\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w ファイル å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã®å†…容をファイルã«ä¿å­˜\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "入出力\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr ""
+" \\copy ... クライアントホストã«å¯¾ã—ã€ãƒ‡ãƒ¼ã‚¿ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’使ã£ã¦\n"
+" SQL COPYを実行\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [文字列] 文字列を標準出力ã«æ›¸ã込む (-n ã§æ”¹è¡Œã—ãªã„)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ファイル ファイルã‹ã‚‰ã‚³ãƒžãƒ³ãƒ‰ã‚’読ã¿è¾¼ã‚“ã§å®Ÿè¡Œ\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr ""
+" \\ir ファイル \\i ã¨åŒã˜ã€‚ãŸã ã—ç¾åœ¨ã®ã‚¹ã‚¯ãƒªãƒ—トã®å ´æ‰€ã‹ã‚‰ã®ç›¸å¯¾ãƒ‘ス\n"
+" ã§æŒ‡å®š\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ファイル] å•ã„åˆã‚ã›çµæžœã‚’ã™ã¹ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ |パイプ ã¸é€å‡º\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr ""
+" \\qecho [-n] [文字列] 文字列を\\oã§æŒ‡å®šã—ãŸå‡ºåŠ›ã‚¹ãƒˆãƒªãƒ¼ãƒ ã«æ›¸ã込む(-n ã§æ”¹è¡Œ\n"
+" ã—ãªã„)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [文字列] 文字列を標準エラー出力ã«æ›¸ã込む (-n ã§æ”¹è¡Œã—ãªã„)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "æ¡ä»¶åˆ†å²\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR æ¡ä»¶åˆ†å²ãƒ–ロックã®é–‹å§‹\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR ç¾åœ¨ã®æ¡ä»¶åˆ†å²ãƒ–ロック内ã®é¸æŠžè‚¢\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else ç¾åœ¨ã®æ¡ä»¶åˆ†å²ãƒ–ロックã«ãŠã‘る最後ã®é¸æŠžè‚¢\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif æ¡ä»¶åˆ†å²ãƒ–ロックã®çµ‚了\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "情報表示\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (オプション:S = システムオブジェクトを表示, + = 詳細表示)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] テーブルã€ãƒ“ューã€ãŠã‚ˆã³ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr ""
+" \\d[S+] åå‰ ãƒ†ãƒ¼ãƒ–ãƒ«ã€ãƒ“ューã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã€ã¾ãŸã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®\n"
+" 説明を表示\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [パターン] 集約関数ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [パターン] アクセスメソッドã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 演算å­ã‚¯ãƒ©ã‚¹ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 演算å­æ—ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 演算å­æ—ã®æ¼”ç®—å­ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 演算å­æ—ã®ã‚µãƒãƒ¼ãƒˆé–¢æ•°ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [パターン] テーブル空間ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [パターン] 符å·åŒ–æ–¹å¼é–“ã®å¤‰æ›ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] 設定パラメータã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [パターン] キャストã®ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [パターン] ä»–ã§ã¯è¡¨ç¤ºã•ã‚Œãªã„オブジェクトã®èª¬æ˜Žã‚’表示\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [パターン] ドメインã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [パターン] デフォルト権é™ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [パターン] 外部テーブルã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [パターン] 外部サーãƒãƒ¼ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [パターン] 外部テーブルã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [パターン] ユーザーマッピングã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [パターン] 外部データラッパã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [関数パターン [型パターン ...]]\n"
+" [集約/通常/プロシージャ/トリガー/ウィンドウ]\n"
+" 関数ã®ã¿ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [パターン] テキスト検索設定ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [パターン] テキスト検索辞書ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [パターン] テキスト検索パーサã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [パターン] テキスト検索テンプレートã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [パターン] ロールã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [パターン] インデックスã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] ラージオブジェクトã®ä¸€è¦§ã‚’表示ã€\\lo_list ã¨åŒã˜\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [パターン] 手続ã言語ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [パターン] 実体化ビューã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [パターン] スキーマã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [演算å­ãƒ‘ターン [型パターン [型パターン]]]\n"
+" 演算å­ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [パターン] ç…§åˆé †åºã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [パターン] テーブルã€ãƒ“ューã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr ""
+" \\dP[itn+] [パターン] パーティションリレーション[テーブル/インデックスã®ã¿]\n"
+" ã®ä¸€è¦§ã‚’表示 [n=入れå­]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [ロールパターン [DBパターン]]\n"
+" データベース毎ã®ãƒ­ãƒ¼ãƒ«è¨­å®šã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr ""
+" \\drg[S] [PATTERN] ロール権é™ä»˜ä¸Žã®ä¸€è¦§ã‚’表示\n"
+"\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [パターン] レプリケーションã®ãƒ‘ブリケーションã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [パターン] レプリケーションã®ã‚µãƒ–スクリプションã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [パターン] シーケンスã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [パターン] テーブルã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [パターン] データ型ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [パターン] ロールã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [パターン] ビューã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [パターン] 機能拡張ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [パターン] 拡張統計情報ã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [パターン] イベントトリガーã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [パターン] データベースã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] 関数å 関数ã®å®šç¾©ã‚’表示\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ビューå ビューã®å®šç¾©ã‚’表示\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [パターン] \\dp ã¨åŒã˜\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "ラージ・オブジェクト\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr ""
+" \\lo_export LOBOID ファイルå\n"
+" ラージ・オブエジェクトをファイルã«æ›¸ã込む\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ファイルå [コメント]\n"
+" ラージ・オブジェクトをファイルã‹ã‚‰èª­ã¿è¾¼ã‚€\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] ラージ・オブジェクトã®ä¸€è¦§ã‚’表示\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID ラージ・オブジェクトを削除\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "書å¼è¨­å®š\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a éžæ•´åˆ—ã¨æ•´åˆ—é–“ã®å‡ºåŠ›ãƒ¢ãƒ¼ãƒ‰ã®åˆ‡ã‚Šæ›¿ãˆ\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [文字列] テーブルã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’設定ã€å€¤ãŒãªã‘ã‚Œã°å‰Šé™¤\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [文字列] å•ã„åˆã‚ã›çµæžœã®éžæ•´åˆ—出力時ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åŒºåˆ‡ã‚Šæ–‡å­—ã‚’\n"
+" 表示ã¾ãŸã¯è¨­å®š\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML出力モードã®åˆ‡ã‚Šæ›¿ãˆ (ç¾åœ¨å€¤: %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [åå‰ [値]] テーブル出力ã®ã‚ªãƒ—ション設定\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] çµæžœè¡Œã®ã¿è¡¨ç¤º (ç¾åœ¨å€¤: %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [文字列] HTMLã®<table>タグ属性ã®è¨­å®šã€å€¤ãŒãªã‘ã‚Œã°è§£é™¤\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] 拡張出力ã®åˆ‡ã‚Šæ›¿ãˆ (ç¾åœ¨å€¤: %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "自動(auto)"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "接続\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBå|- ユーザーå|- ホストå|- ãƒãƒ¼ãƒˆç•ªå·|-] | 接続文字列}\n"
+" æ–°ã—ã„データベースã«æŽ¥ç¶š (ç¾åœ¨: \"%s\")\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBå|- ユーザーå|- ホストå|- ãƒãƒ¼ãƒˆç•ªå·|-] | 接続文字列}\n"
+" æ–°ã—ã„データベースã«æŽ¥ç¶š (ç¾åœ¨: 未接続)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo ç¾åœ¨ã®æŽ¥ç¶šã«é–¢ã™ã‚‹æƒ…報を表示\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [エンコーディング] クライアントã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’表示ã¾ãŸã¯è¨­å®š\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [ユーザーå] ユーザーã®ãƒ‘スワードを安全ã«å¤‰æ›´\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "オペレーティングシステム\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] カレントディレクトリを変更\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr ""
+" \\getenv psql変数 環境変数\n"
+" 環境変数をå–å¾—\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv åå‰ [値] 環境変数を設定ã¾ãŸã¯è§£é™¤\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] コマンドã®å®Ÿè¡Œæ™‚間表示ã®åˆ‡ã‚Šæ›¿ãˆ (ç¾åœ¨å€¤: %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [コマンド] シェルã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‹ã€ã‚‚ã—ãã¯å¯¾è©±åž‹ã‚·ã‚§ãƒ«ã‚’\n"
+" èµ·å‹•ã—ã¾ã™ã€‚\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "変数\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [テキスト] 変数å ユーザーã«å¯¾ã—ã¦å†…部変数ã®è¨­å®šã‚’è¦æ±‚ã—ã¾ã™\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [変数å [値]] 内部変数ã®å€¤ã‚’設定ã€ãƒ‘ラメータãŒãªã‘ã‚Œã°ä¸€è¦§ã‚’表示\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset 変数å 内部変数を削除\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"特別ã«æ‰±ã‚れる変数ã®ä¸€è¦§\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql変数:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=åå‰=値\n"
+" ã¾ãŸã¯psql内㧠\\set åå‰ å€¤\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" セットã•ã‚Œã¦ã„ã‚‹å ´åˆã€SQLコマンドãŒæˆåŠŸã—ãŸéš›ã«è‡ªå‹•çš„ã«ã‚³ãƒŸãƒƒãƒˆ\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" SQLキーワードã®è£œå®Œã«ä½¿ã†æ–‡å­—ケースを指定\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" ç¾åœ¨æŽ¥ç¶šä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" ã©ã®å…¥åŠ›ã‚’標準出力ã¸ã®å‡ºåŠ›å¯¾è±¡ã¨ã™ã‚‹ã‹ã‚’設定\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" セットã•ã‚Œã¦ã„ã‚Œã°ã€ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã§å®Ÿè¡Œã•ã‚Œã‚‹å†…部å•ã„åˆã‚ã›ã‚’\n"
+" 表示; \"noexec\"を設定ã—ãŸå ´åˆã¯å®Ÿè¡Œã›ãšã«è¡¨ç¤ºã®ã¿\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" ç¾åœ¨ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®æ–‡å­—セットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" 最後ã®å•ã„åˆã‚ã›ãŒå¤±æ•—ã§ã‚ã‚Œã°\"true\"ã€ãã†ã§ãªã‘ã‚Œã°\"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" 一度ã«å–å¾—ãŠã‚ˆã³è¡¨ç¤ºã™ã‚‹çµæžœã®è¡Œæ•° (0 = 無制é™)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 設定ã™ã‚‹ã¨ã€ãƒ†ãƒ¼ãƒ–ルアクセスメソッドã¯è¡¨ç¤ºã•ã‚Œãªã„\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 設定ã™ã‚‹ã¨ã€åœ§ç¸®æ–¹å¼ã¯è¡¨ç¤ºã•ã‚Œãªã„\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" コマンド履歴ã®åˆ¶å¾¡ [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" コマンド履歴をä¿å­˜ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" コマンド履歴ã§ä¿å­˜ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰æ•°ã®ä¸Šé™\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" ç¾åœ¨æŽ¥ç¶šä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ãƒ›ã‚¹ãƒˆ\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" 対話形セッションを終ã‚らã›ã‚‹ã®ã«å¿…è¦ãªEOFã®æ•°\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 最後ã®å¤‰æ›´ã®å½±éŸ¿ã‚’å—ã‘ãŸOID\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 最後ã®ã‚¨ãƒ©ãƒ¼ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŠã‚ˆã³ SQLSTATEã€\n"
+" ãªã«ã‚‚ãªã‘ã‚Œã°ç©ºã®æ–‡å­—列ãŠã‚ˆã³\"00000\"\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" セットã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚¨ãƒ©ãƒ¼ã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã—ãªã„ (æš—é»™ã®ã‚»ãƒ¼ãƒ–\n"
+" ãƒã‚¤ãƒ³ãƒˆã‚’使用)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" エラー発生後ã«ãƒãƒƒãƒå®Ÿè¡Œã‚’åœæ­¢\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" ç¾åœ¨ã®æŽ¥ç¶šã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ãƒˆ\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" psql ã®æ¨™æº–ã®ãƒ—ロンプトを指定\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" æ–‡ãŒå‰è¡Œã‹ã‚‰ç¶™ç¶šã™ã‚‹å ´åˆã®ãƒ—ロンプトを指定\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" COPY ... FROM STDIN ã®æœ€ä¸­ã«ä½¿ã‚れるプロンプトを指定\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" メッセージを表示ã—ãªã„ (-q オプションã¨åŒã˜)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 最後ã®å•ã„åˆã‚ã›ã§è¿”å´ã—ãŸã€ã¾ãŸã¯å½±éŸ¿ã‚’与ãˆãŸè¡Œã®æ•°ã€ã¾ãŸã¯0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(短ã„文字列ã¾ãŸã¯æ•°å€¤)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" 最後ã®ã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ãŒå¤±æ•—ã§ã‚ã‚Œã°\"true\"ã€æˆåŠŸã§ã‚ã‚Œã°\"false\"\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" 最後ã«å®Ÿè¡Œã—ãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了ステータス\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" 複åˆå•ã„åˆã‚ã›(\\;)ã®æœ€å¾Œã®çµæžœã®ã¿ã§ã¯ãªãã™ã¹ã¦ã‚’表示ã™ã‚‹\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" メッセージコンテキストフィールドã®è¡¨ç¤ºã‚’制御 [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" セットã—ãŸå ´åˆã€æ”¹è¡Œã¯SQLコマンドを終端ã™ã‚‹ (-S オプションã¨åŒã˜)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" シングルステップモード (-s オプションã¨åŒã˜)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 最後ã®å•ã„åˆã‚ã›ã® SQLSTATEã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ã§ãªã‘ã‚Œã°\"00000\"\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" ç¾åœ¨æŽ¥ç¶šä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" エラー報告ã®è©³ç´°åº¦ã‚’制御 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(é•·ã„文字列ã€çŸ­ã„文字列ã¾ãŸã¯æ•°å€¤)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"表示設定:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=åå‰[=値]\n"
+" ã¾ãŸã¯psql内㧠\\pset åå‰ [値]\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" 境界線ã®ã‚¹ã‚¿ã‚¤ãƒ« (番å·)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" 折り返ã—å½¢å¼ã§ç›®æ¨™ã¨ã™ã‚‹æ¨ªå¹…\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" 拡張出力 [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" éžæ•´åˆ—出力ã§ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åŒºåˆ‡ã‚Šæ–‡å­—(デフォルト㯠\"%s\")\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" éžæ•´åˆ—出力ã§ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰åŒºåˆ‡ã‚Šæ–‡å­—ã‚’ãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" テーブルフッター出力ã®è¦å¦ã‚’設定 [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" 出力フォーマットを設定 [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" 境界線ã®æ画スタイルを設定 [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" null 値ã®ä»£ã‚ã‚Šã«è¡¨ç¤ºã™ã‚‹æ–‡å­—列を設定\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ロケール固有文字ã§ã®æ¡åŒºåˆ‡ã‚Šã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" ã„ã¤å¤–部ページャーを使ã†ã‹ã‚’制御 [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" éžæ•´åˆ—出力ã§ã®ãƒ¬ã‚³ãƒ¼ãƒ‰(è¡Œ)区切り\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" éžæ•´åˆ—出力ã§ãƒ¬ã‚³ãƒ¼ãƒ‰åŒºåˆ‡ã‚Šã«ãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" HTMLフォーマット時ã®tableã‚¿ã‚°ã®å±žæ€§ã€ã‚‚ã—ã㯠latex-longtable\n"
+" フォーマット時ã«å·¦å¯„ã›ã™ã‚‹ãƒ‡ãƒ¼ã‚¿åž‹ã®ç›¸å¯¾ã‚«ãƒ©ãƒ å¹…を指定\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" 以é™ã«è¡¨ç¤ºã•ã‚Œã‚‹è¡¨ã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’設定\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" セットã•ã‚ŒãŸå ´åˆã€å®Ÿéš›ã®ãƒ†ãƒ¼ãƒ–ルデータã®ã¿ã‚’表示\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" Unicode ã«ã‚ˆã‚‹ç·šæ画時ã®ã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定 [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"環境変数:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" åå‰=値 [åå‰=値] psql ...\n"
+" ã¾ãŸã¯psql内㧠\\setenv åå‰ [値]\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set åå‰=値\n"
+" psql ...\n"
+" ã¾ãŸã¯psq内㧠\\setenv åå‰ [値]\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" 折り返ã—書å¼ã«ãŠã‘るカラム数\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" application_name 接続パラメータã¨åŒã˜\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" dbname 接続パラメータã¨åŒã˜\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" host 接続パラメータã¨åŒã˜\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" パスワードファイルå\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 接続用パスワード (推奨ã•ã‚Œã¾ã›ã‚“)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" port 接続パラメータã¨åŒã˜\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" user 接続パラメータã¨åŒã˜\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, \\ev コマンドã§ä½¿ã‚れるエディタ\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" エディタã®èµ·å‹•æ™‚ã«è¡Œç•ªå·ã‚’指定ã™ã‚‹æ–¹æ³•\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" コマンドライン履歴ファイルã®ä»£æ›¿ã®å ´æ‰€\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" 外部ページャープログラムã®åå‰\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" \\watchã§ä½¿ç”¨ã™ã‚‹å¤–部ページャープログラムã®åå‰\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" ユーザー㮠.psqlrc ファイルã®ä»£æ›¿ã®å ´æ‰€\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! コマンドã§ä½¿ã‚れるシェル\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" テンãƒãƒ©ãƒªãƒ•ã‚¡ã‚¤ãƒ«ç”¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "利用å¯èƒ½ãªãƒ˜ãƒ«ãƒ—:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"コマンド: %s\n"
+"説明: %s\n"
+"書å¼:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\"ã®ãƒ˜ãƒ«ãƒ—ãŒã‚ã‚Šã¾ã›ã‚“。\n"
+"引数ãªã—㧠\\h ã¨ã‚¿ã‚¤ãƒ—ã™ã‚‹ã¨ã€ãƒ˜ãƒ«ãƒ—ã®ä¸€è¦§ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "ファイル\"%s\"ã«ãƒ’ストリーをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "ã“ã®ç’°å¢ƒã§ã¯ãƒ’ストリー機能ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: データベースã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ä¸­æ–­ã•ã‚Œã¾ã—ãŸ"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: 未知ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çŠ¶æ…‹"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: 脱出ã—ã¾ã—ãŸ"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "\"\\q\"ã§%sを抜ã‘ã¾ã™ã€‚\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"ã“ã®å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã¯ PostgreSQL ã®ã‚«ã‚¹ã‚¿ãƒ ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã®ãƒ€ãƒ³ãƒ—ã§ã™ã€‚\n"
+"ã“ã®ãƒ€ãƒ³ãƒ—をデータベースã«ãƒªã‚¹ãƒˆã‚¢ã™ã‚‹ã«ã¯ pg_restore コマンドを使ã£ã¦ãã ã•ã„。\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "\\? ã§ãƒ˜ãƒ«ãƒ—ã®è¡¨ç¤ºã€control-C ã§å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã‚’クリアã—ã¾ã™ã€‚"
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr " \\? ã§ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚"
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "PostgreSQL ã¸ã®ã‚³ãƒžãƒ³ãƒ‰ ライン インターフェイスã€psql を使用ã—ã¦ã„ã¾ã™ã€‚"
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"ヒント: \\copyright ã¨ã‚¿ã‚¤ãƒ—ã™ã‚‹ã¨ã€é…布æ¡ä»¶ã‚’表示ã—ã¾ã™ã€‚\n"
+" \\h ã¨ã‚¿ã‚¤ãƒ—ã™ã‚‹ã¨ã€SQLコマンドã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚\n"
+" \\? ã¨ã‚¿ã‚¤ãƒ—ã™ã‚‹ã¨ã€psqlコマンドã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚\n"
+" \\g ã¨æ‰“ã¤ã‹ã‚»ãƒŸã‚³ãƒ­ãƒ³ã§é–‰ã˜ã‚‹ã¨ã€å•ã„åˆã‚ã›ã‚’実行ã—ã¾ã™ã€‚\n"
+" \\q ã§çµ‚了ã—ã¾ã™ã€‚\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "\\q ã§çµ‚了ã—ã¾ã™ã€‚"
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "control-D ã§çµ‚了ã—ã¾ã™ã€‚"
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "control-C ã§çµ‚了ã—ã¾ã™ã€‚"
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "å•ã„åˆã‚ã›ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ; \\endifã‹Ctrl-Cã§ç¾åœ¨ã®\\ifブロックを抜ã‘ã¦ãã ã•ã„"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "ブロックを閉ã˜ã‚‹\\endifを検出中ã«ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®çµ‚端(EOF)ã«é”ã—ã¾ã—ãŸ"
+
+#: psqlscan.l:716
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "変数\"%s\"ã®å†å¸°å±•é–‹ã‚’スキップã—ã¦ã„ã¾ã™"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "文字列ã®å¼•ç”¨ç¬¦ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: メモリä¸è¶³ã§ã™"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "åå‰"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "集約関数ã®ã‚·ã‚°ãƒ‹ãƒãƒ£ãƒ¼"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "æ–°ã—ã„åå‰"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "æ–°ã—ã„所有者"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "æ–°ã—ã„スキーマ"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "集約関数ã®ã‚·ã‚°ãƒ‹ãƒãƒ£ãƒ¼ã«ã¯ä»¥ä¸‹ã®ã‚‚ã®ãŒã‚ã‚Šã¾ã™:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "引数ã®ãƒ¢ãƒ¼ãƒ‰"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "引数ã®åå‰"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "引数ã®åž‹"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "オプション"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "オプションã«ã¯ä»¥ä¸‹ã®ã‚‚ã®ãŒã‚ã‚Šã¾ã™:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "接続ã®å¯å¦(真å½å€¤)"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "最大åŒæ™‚接続数"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "テンプレートã‹ã©ã†ã‹(真å½å€¤)"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "æ–°ã—ã„テーブル空間å"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "設定パラメータ"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "値"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "対象ã®ãƒ­ãƒ¼ãƒ«"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "スキーマå"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "GRANT/REVOKEã®çœç•¥å½¢"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "GRANT/REVOKEã®çœç•¥å½¢ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "ロールå"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "評価å¼"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "ドメイン制約"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "制約å"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "æ–°ã—ã„制約å"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "メンãƒãƒ¼ã‚ªãƒ–ジェクト"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "メンãƒãƒ¼ã‚ªãƒ–ジェクトã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "オブジェクトå"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "集約関数å"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "変æ›å‰ã®åž‹"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "変æ›å¾Œã®åž‹"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "関数å"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "演算å­å"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "左辺ã®åž‹"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "å³è¾ºã®åž‹"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "インデックスメソッド"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "プロシージャå"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "ルーãƒãƒ³å"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "åž‹å"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "言語å"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "集約関数ã®ã‚·ã‚°ãƒ‹ãƒãƒ£ãƒ¼ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "ãƒãƒ³ãƒ‰ãƒ©ãƒ¼é–¢æ•°"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼é–¢æ•°"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "アクション"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "列å"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "æ–°ã—ã„列å"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "アクションã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "データ型"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "ç…§åˆé †åº"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "カラム制約"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "æ•´æ•°"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "属性オプション"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "テーブル制約"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "トリガーå"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "親テーブル"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "æ‹¡å¼µå"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "実行コスト"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "çµæžœã®è¡Œæ•°"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "サãƒãƒ¼ãƒˆé–¢æ•°"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "ロールã®æŒ‡å®š"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "ユーザーå"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "ロール指定ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "グループå"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "テーブル空間å"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "インデックスå"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "ストレージパラメータ"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "列番å·"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "ラージオブジェクトã®OID"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "圧縮方å¼"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "æ–°ã—ã„アクセスメソッド"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "制約é¸æŠžè©•ä¾¡é–¢æ•°"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "çµåˆé¸æŠžè©•ä¾¡é–¢æ•°"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "戦略番å·"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "演算å­ã®åž‹"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "ソートファミリーå"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "サãƒãƒ¼ãƒˆç•ªå·"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "引数ã®åž‹"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "テーブルå"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "USINGå¼"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "CHECKå¼"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "発行オブジェクト"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "パブリケーションパラメータ"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "発行オブジェクトã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "パスワード"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "タイムスタンプ"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "データベースå"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "増分値"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "最å°å€¤"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "最大値"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "開始番å·"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "å†é–‹å§‹ç•ªå·"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "キャッシュ割り当ã¦æ•°"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "æ–°ã—ã„ターゲット"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "接続文字列"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "パブリケーションå"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "パブリケーション・オプション"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "{REFRESH PUBLICATION ã®è¿½åŠ ã‚ªãƒ—ション}"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "{SUBSCRIPTION パラメータå}"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "スキップオプション"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "パーティションå"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "パーティション境界ã®ä»•æ§˜"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "シーケンスオプション"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "シーケンスオプション"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "インデックスを使ã†ãƒ†ãƒ¼ãƒ–ルã®åˆ¶ç´„"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "書ãæ›ãˆãƒ«ãƒ¼ãƒ«å"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "パーティション境界ã®ä»•æ§˜ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "パーティション境界å¼"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "numericリテラル"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "ãã—ã¦ã‚«ãƒ©ãƒ åˆ¶ç´„ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "デフォルト表ç¾"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "生æˆå¼"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "インデックスパラメータ"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "å‚照テーブル"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "å‚照列"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "å‚照動作"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "テーブル制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "除外対象è¦ç´ "
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "演算å­"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "インデックスã®è¿°èªž"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "テーブル制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 制約ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãƒ‘ラメータã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "EXCLUDE 制約ã®é™¤å¤–対象è¦ç´ ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "FOREIGN KEY/REFERENCES制約ã®å‚照動作ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "テーブル空間ã®ã‚ªãƒ—ション"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "トークンã®åž‹"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "辞書å"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "å…ƒã®è¾žæ›¸"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "æ–°ã—ã„辞書"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "属性å"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "æ–°ã—ã„属性å"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "æ–°ã—ã„列挙値"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "隣接ã—ãŸåˆ—挙値"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "既存ã®åˆ—挙値"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "プロパティ"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "サーãƒãƒ¼å"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "ビューã®ã‚ªãƒ—ションå"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "ビューオプションã®å€¤"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "テーブルãŠã‚ˆã³åˆ—"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "オプションã«ã¯ä»¥ä¸‹ã®ã†ã¡ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¾ã™:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "真å½å€¤"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "サイズ"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "ãã—ã¦ãƒ†ãƒ¼ãƒ–ルã¨åˆ—ã®æŒ‡å®šã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "トランザクションã®ãƒ¢ãƒ¼ãƒ‰"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "トランザクションã®ãƒ¢ãƒ¼ãƒ‰ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "引数"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "リレーションå"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "ドメインå"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "ãƒãƒªã‚·ãƒ¼å"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "ルールå"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "文字列リテラル"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "トランザクションID"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "ファイルå"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "コマンド"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "æ¡ä»¶"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "å•ã„åˆã‚ã›"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "フォーマットå"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "区切り文字"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "NULL文字列"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "デフォルト文字列"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "引用符文字"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "エスケープ文字"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "エンコーディングå"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "アクセスメソッドã®åž‹"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "入力データ型"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "状態é·ç§»é–¢æ•°"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "状態データã®åž‹"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "状態データã®ã‚µã‚¤ã‚º"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "終了関数"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "çµåˆé–¢æ•°"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "シリアライズ関数"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "デシリアライズ関数"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "åˆæœŸæ¡ä»¶"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "å‰æ–¹çŠ¶æ…‹é·ç§»é–¢æ•°"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "逆状態é·ç§»é–¢æ•°"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "移動集約モード時ã®çŠ¶æ…‹å€¤ã®ãƒ‡ãƒ¼ã‚¿åž‹"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "移動集約モード時ã®çŠ¶æ…‹å€¤ã®ãƒ‡ãƒ¼ã‚¿ã‚µã‚¤ã‚º"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "移動集約モード時ã®çµ‚了関数"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "移動集約モード時ã®åˆæœŸæ¡ä»¶"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "ソート演算å­"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "ã¾ãŸã¯å¤ã„構文"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "基本ã®åž‹"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "ロケール"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "ç…§åˆé †åº"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "Ctype(変æ›æ¼”ç®—å­)"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "プロãƒã‚¤ãƒ€"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "ルール"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "既存ã®ç…§åˆé †åº"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "変æ›å…ƒã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "変æ›å…ˆã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "テンプレート"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "エンコード"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "ストラテジ"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "ICUロケール"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "ICUルール(群)"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "ロケールプロãƒã‚¤ãƒ€"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "オブジェクトID"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "制約æ¡ä»¶"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "制約æ¡ä»¶ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "イベント"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "フィルター変数"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "フィルター値"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "カラム制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "戻り値ã®åž‹"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "列ã®åž‹"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "定義"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "オブジェクトファイルå"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "リンクシンボル"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "SQL本体"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "UID"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "インデックスメソッド"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹ãƒ‘ラメータ"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "呼ã³å‡ºã—ãƒãƒ³ãƒ‰ãƒ©ãƒ¼"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "インラインãƒãƒ³ãƒ‰ãƒ©ãƒ¼"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³é–¢æ•°"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "交代演算å­"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "å¦å®šæ¼”ç®—å­"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "演算å­æ—ã®åå‰"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "ストレージタイプ"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "イベントã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "スキーマè¦ç´ "
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "サーãƒãƒ¼ã®ã‚¿ã‚¤ãƒ—"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "外部データラッパå"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "統計オブジェクトå"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "統計種別"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "サブスクリプションå"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "コピー元ã®ãƒ†ãƒ¼ãƒ–ル"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "LIKEオプション"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "LIKE オプションã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "ディレクトリ"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "パーサå"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "複製元ã®è¨­å®š"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "開始関数"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "トークンå–得関数"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "終了関数"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "LEXTYPE関数"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "見出ã—関数"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "åˆæœŸå‡¦ç†é–¢æ•°"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "LEXIZE関数"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "{FROM SQL 関数å}"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "{TO SQL 関数å}"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "被å‚照テーブルå"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "移行用リレーションå"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "引数"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "ラベル"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "当該範囲ã®ãƒ‡ãƒ¼ã‚¿åž‹"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "当該範囲ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "æ­£è¦åŒ–関数"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "当該範囲ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®å·®åˆ†æŠ½å‡ºé–¢æ•°"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "複範囲型å"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "入力関数"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "出力関数"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "å—信関数"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "é€ä¿¡é–¢æ•°"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "型修飾å­ã®å…¥åŠ›é–¢æ•°"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "型修飾å­ã®å‡ºåŠ›é–¢æ•°"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "分æžé–¢æ•°"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "添字関数"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "内部長"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "ãƒã‚¤ãƒˆå¢ƒç•Œ"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "ストレージ"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "LIKEã®åž‹"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "カテゴリー"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "優先データ型ã‹ã©ã†ã‹(真å½å€¤)"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "デフォルト"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "è¦ç´ ã®ãƒ‡ãƒ¼ã‚¿åž‹"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "区切り記å·"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "ç…§åˆå¯èƒ½"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "WITHå•ã„åˆã‚ã›"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "別å"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "FROMé …ç›®"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "カーソルå"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "出力表ç¾"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "出力å"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "コードブロック"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "パラメータ"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "æ–‡"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "æ–¹å‘"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "æ–¹å‘ ã¯ä»¥ä¸‹ã®ã†ã¡ã®ã„ãšã‚Œã‹:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "å–り出ã™ä½ç½®ã‚„行数"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "シーケンスå"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "引数å"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "引数ã®åž‹"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "ラージオブジェクトid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "リモートスキーマ"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "ローカルスキーマ"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "競åˆã‚¿ãƒ¼ã‚²ãƒƒãƒˆ"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "競åˆæ™‚アクション"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "競åˆã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "インデックスã®ã‚«ãƒ©ãƒ å"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "インデックス表ç¾"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "インデックスã®è¿°èªž"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "競åˆæ™‚アクションã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "副å•ã„åˆã‚ã›å¥"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "ãƒãƒ£ãƒãƒ«"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "ロックモード"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "ロックモードã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "ターゲットテーブルå"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "ターゲット別å"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "データæº"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "JOINæ¡ä»¶"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "WHENå¥"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "ã“ã“ã§\"データæº\"ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "データæºãƒ†ãƒ¼ãƒ–ルå"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "データæºå•ã„åˆã‚ã›"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "データæºåˆ¥å"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "WHENå¥ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "マージ更新"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "マージ削除"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "マージ挿入"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "ãã—ã¦\"マージ挿入\"ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "ãã—ã¦\"マージ更新\"ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "ãã—ã¦\"マージ削除\"ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "ペイロード"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "å…ƒã®ãƒ­ãƒ¼ãƒ«"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "æ–°ã—ã„ロール"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "セーブãƒã‚¤ãƒ³ãƒˆå"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "グルーピングè¦ç´ "
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "ウィンドウå"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "ウィンドウ定義"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "SELECTå¥"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "FROMé …ç›®ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "列別å"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "サンプリングメソッド"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "乱数シード"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "WITHå•ã„åˆã‚ã›å"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "カラム定義"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "JOINタイプ"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "JOINカラム"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "JOIN用別å"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "グルーピングè¦ç´ ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "WITHå•ã„åˆã‚ã›ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "VALUESå¥"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "INSERTå¥"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "UPDATEå¥"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "DELETEå¥"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "SEARCHé †åºåˆ—å"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "循環識別列å"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "循環識別値"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "循環識別デフォルト"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "循環パス列å"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "æ–°ã—ã„テーブル"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "スナップショットID"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "ソート表ç¾"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’中止ã—ã¾ã™"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "集約関数ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "ç…§åˆé †åºã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "エンコーディング変æ›ãƒ«ãƒ¼ãƒ«ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "データベースを変更ã—ã¾ã™"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "デフォルトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "ドメインã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "イベントトリガーã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "機能拡張ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "外部データラッパã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "外部テーブルã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "関数ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "ロールåã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—を変更ã—ã¾ã™"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "インデックスã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "手続ã言語ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "ラージオブジェクトã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "実体化ビューã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "演算å­ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "演算å­æ—ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "行レベルã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ ãƒãƒªã‚·ãƒ¼ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "プロシージャã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "パブリケーションã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "データベースロールを変更ã—ã¾ã™"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "ルーãƒãƒ³ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "ルールã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "スキーマã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "シーケンス生æˆå™¨ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "外部サーãƒãƒ¼ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "拡張統計情報オブジェクトã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "サブスクリプションã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "サーãƒãƒ¼ã®è¨­å®šãƒ‘ラメータを変更ã—ã¾ã™"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "テーブルã®å®šç¾©ã‚’変更ã—ã¾ã™ã€‚"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "テーブル空間ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "テキスト検索設定ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "テキスト検索辞書ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "テキスト検索パーサーã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "テキスト検索テンプレートã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "トリガーã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "åž‹ã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "ユーザーマッピングã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "ビューã®å®šç¾©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "データベースã®çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "トランザクション区間を開始ã—ã¾ã™"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "プロシージャを実行ã—ã¾ã™"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚’強制的ã«å®Ÿè¡Œã—ã¾ã™"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "カーソルを閉ã˜ã¾ã™"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "インデックスã«å¾“ã£ã¦ãƒ†ãƒ¼ãƒ–ルをクラスタ化ã—ã¾ã™"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "オブジェクトã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’定義ã¾ãŸã¯å¤‰æ›´ã—ã¾ã™"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’コミットã—ã¾ã™"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "二相コミットã®ãŸã‚ã«äº‹å‰ã«æº–å‚™ã•ã‚ŒãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’コミットã—ã¾ã™"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "ファイルã¨ãƒ†ãƒ¼ãƒ–ルã¨ã®é–“ã§ãƒ‡ãƒ¼ã‚¿ã‚’コピーã—ã¾ã™"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "æ–°ã—ã„アクセスメソッドを定義ã—ã¾ã™"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "æ–°ã—ã„集約関数を定義ã—ã¾ã™"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "æ–°ã—ã„型変æ›ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "æ–°ã—ã„ç…§åˆé †åºã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "æ–°ã—ã„エンコーディング変æ›ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "æ–°ã—ã„データベースを作æˆã—ã¾ã™"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "æ–°ã—ã„ドメインを定義ã—ã¾ã™"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "æ–°ã—ã„イベントトリガーを定義ã—ã¾ã™"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "機能拡張をインストールã—ã¾ã™"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "æ–°ã—ã„外部データラッパを定義ã—ã¾ã™"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "æ–°ã—ã„外部テーブルを定義ã—ã¾ã™"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "æ–°ã—ã„関数を定義ã—ã¾ã™"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "æ–°ã—ã„データベースロールを定義ã—ã¾ã™"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "æ–°ã—ã„インデックスを定義ã—ã¾ã™"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "æ–°ã—ã„手続ã言語を定義ã—ã¾ã™"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "æ–°ã—ã„実体化ビューを定義ã—ã¾ã™"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "æ–°ã—ã„演算å­ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "æ–°ã—ã„演算å­ã‚¯ãƒ©ã‚¹ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "æ–°ã—ã„演算å­æ—を定義ã—ã¾ã™"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "テーブルã«å¯¾ã—ã¦æ–°ã—ã„行レベルセキュリティãƒãƒªã‚·ãƒ¼ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "æ–°ã—ã„プロシージャを定義ã—ã¾ã™"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "æ–°ã—ã„パブリケーションを定義ã—ã¾ã™"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "æ–°ã—ã„書ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "æ–°ã—ã„スキーマを定義ã—ã¾ã™"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "æ–°ã—ã„シーケンス生æˆå™¨ã‚’定義ã—ã¾ã™ã€‚"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "æ–°ã—ã„外部サーãƒãƒ¼ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "拡張統計情報を定義ã—ã¾ã™"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "æ–°ã—ã„サブスクリプションを定義ã—ã¾ã™"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "æ–°ã—ã„テーブルを定義ã—ã¾ã™"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "å•ã„åˆã‚ã›ã®çµæžœã‹ã‚‰æ–°ã—ã„テーブルを定義ã—ã¾ã™"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "æ–°ã—ã„テーブル空間を定義ã—ã¾ã™"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "æ–°ã—ã„テキスト検索設定を定義ã—ã¾ã™"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "æ–°ã—ã„テキスト検索辞書を定義ã—ã¾ã™"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "æ–°ã—ã„テキスト検索パーサーを定義ã—ã¾ã™"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "æ–°ã—ã„テキスト検索テンプレートを定義ã—ã¾ã™"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "æ–°ã—ã„データ変æ›ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "æ–°ã—ã„トリガーを定義ã—ã¾ã™"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "æ–°ã—ã„データ型を定義ã—ã¾ã™"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "外部サーãƒãƒ¼ã«å¯¾ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ–°ã—ã„マッピングを定義ã—ã¾ã™ã€‚"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "æ–°ã—ã„ビューを定義ã—ã¾ã™"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "準備ã—ãŸæ–‡ã‚’解放ã—ã¾ã™"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "カーソルを定義ã—ã¾ã™"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "テーブルã®è¡Œã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "セッション状態を破棄ã—ã¾ã™"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "ç„¡åコードブロックを実行ã—ã¾ã™"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "アクセスメソッドを削除ã—ã¾ã™"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "集約関数を削除ã—ã¾ã™"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "型変æ›ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "ç…§åˆé †åºã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "符å·åŒ–æ–¹å¼å¤‰æ›ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "データベースを削除ã—ã¾ã™"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "ドメインを削除ã—ã¾ã™"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "イベントトリガーを削除ã—ã¾ã™"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "機能拡張を削除ã—ã¾ã™"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "外部データラッパを削除ã—ã¾ã™"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "外部テーブルを削除ã—ã¾ã™"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "関数を削除ã—ã¾ã™"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "データベースロールを削除ã—ã¾ã™"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "インデックスを削除ã—ã¾ã™"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "手続ã言語を削除ã—ã¾ã™"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "実体化ビューを削除ã—ã¾ã™"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "演算å­ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "演算å­ã‚¯ãƒ©ã‚¹ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "演算å­æ—を削除ã—ã¾ã™"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "データベースロールãŒæ‰€æœ‰ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクトを削除ã—ã¾ã™"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "テーブルã‹ã‚‰è¡Œãƒ¬ãƒ™ãƒ«ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "プロシージャを削除ã—ã¾ã™"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "パブリケーションを削除ã—ã¾ã™"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "ルーãƒãƒ³ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "書ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "スキーマを削除ã—ã¾ã™"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "シーケンスを削除ã—ã¾ã™"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "外部サーãƒãƒ¼è¨˜è¿°å­ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "拡張統計情報を削除ã—ã¾ã™"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "サブスクリプションを削除ã—ã¾ã™"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "テーブルを削除ã—ã¾ã™"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "テーブル空間を削除ã—ã¾ã™"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "テキスト検索設定を削除ã—ã¾ã™"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "テキスト検索辞書を削除ã—ã¾ã™"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "テキスト検索パーサーを削除ã—ã¾ã™"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "テキスト検索テンプレートを削除ã—ã¾ã™"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "データ変æ›ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "トリガーを削除ã—ã¾ã™"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "データ型を削除ã—ã¾ã™"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "外部サーãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングを削除ã—ã¾ã™"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "ビューを削除ã—ã¾ã™"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "準備ã—ãŸæ–‡ã‚’実行ã—ã¾ã™"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "æ–‡ã®å®Ÿè¡Œè¨ˆç”»ã‚’表示ã—ã¾ã™"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "カーソルを使ã£ã¦å•ã„åˆã‚ã›ã‹ã‚‰è¡Œã‚’å–り出ã—ã¾ã™"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "アクセス権é™ã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "外部サーãƒãƒ¼ã‹ã‚‰ãƒ†ãƒ¼ãƒ–ル定義をインãƒãƒ¼ãƒˆã—ã¾ã™"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "テーブルã«æ–°ã—ã„行を作æˆã—ã¾ã™"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "通知メッセージを監視ã—ã¾ã™"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "共有ライブラリファイルをロードã—ã¾ã™"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "テーブルをロックã—ã¾ã™"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "æ¡ä»¶ã«ã‚ˆã£ã¦ãƒ†ãƒ¼ãƒ–ルã®è¡Œã‚’挿入ã€æ›´æ–°ã¾ãŸã¯å‰Šé™¤ã™ã‚‹"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "カーソルをä½ç½®ã¥ã‘ã¾ã™"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "通知を生æˆã—ã¾ã™"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "実行ã«å‚™ãˆã¦æ–‡ã‚’準備ã—ã¾ã™"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "二相コミットã«å‚™ãˆã¦ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’準備ã—ã¾ã™"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "データベースロールãŒæ‰€æœ‰ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクトã®æ‰€æœ‰æ¨©ã‚’変更ã—ã¾ã™"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "実体化ビューã®å†…容を置ãæ›ãˆã¾ã™"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "インデックスをå†æ§‹ç¯‰ã—ã¾ã™"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "以å‰ã«å®šç¾©ã•ã‚ŒãŸã‚»ãƒ¼ãƒ–ãƒã‚¤ãƒ³ãƒˆã‚’解放ã—ã¾ã™"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "実行時パラメータã®å€¤ã‚’デフォルト値ã«æˆ»ã—ã¾ã™"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "アクセス権é™ã‚’削除ã—ã¾ã™"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "二相コミットã®ãŸã‚ã«äº‹å‰ã«æº–å‚™ã•ã‚ŒãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’キャンセルã—ã¾ã™"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "セーブãƒã‚¤ãƒ³ãƒˆã¾ã§ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¾ã™"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§æ–°ã—ã„セーブãƒã‚¤ãƒ³ãƒˆã‚’定義ã—ã¾ã™"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "オブジェクトã«é©ç”¨ã•ã‚Œã‚‹ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ©ãƒ™ãƒ«ã‚’定義ã¾ãŸã¯å¤‰æ›´ã—ã¾ã™"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "テーブルã¾ãŸã¯ãƒ“ューã‹ã‚‰è¡Œã‚’å–å¾—ã—ã¾ã™"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "実行時パラメータを変更ã—ã¾ã™"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ã„ã¦ã€åˆ¶ç´„ãƒã‚§ãƒƒã‚¯ã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’設定ã—ã¾ã™"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼è­˜åˆ¥å­ã‚’設定ã—ã¾ã™"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "セッションã®ãƒ¦ãƒ¼ã‚¶ãƒ¼è­˜åˆ¥å­ãŠã‚ˆã³ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼è­˜åˆ¥å­ã‚’設定ã—ã¾ã™"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ç‰¹æ€§ã‚’設定ã—ã¾ã™"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "実行時パラメータã®å€¤ã‚’表示ã—ã¾ã™"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "一ã¤ã®ã€ã¾ãŸã¯è¤‡æ•°ã®ãƒ†ãƒ¼ãƒ–ルを空ã«ã—ã¾ã™"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "通知メッセージã®ç›£è¦–を中止ã—ã¾ã™"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "テーブルã®è¡Œã‚’æ›´æ–°ã—ã¾ã™"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "ガーベッジコレクションを行ã„ã€ã¾ãŸå¿…è¦ã«å¿œã˜ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’分æžã—ã¾ã™"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "行セットを計算ã—ã¾ã™"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 ã¯éžå¯¾è©±ãƒ¢ãƒ¼ãƒ‰æ™‚ã§ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"\"help\"ã§ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "表示パラメータ\"%s\"を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "余分ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°\"%s\"ã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸ"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"タブ補完ã®å•ã„åˆã‚ã›ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+"å•ã„åˆã‚ã›:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "\"%2$s\"ã®å€¤\"%1$s\"ãŒèªè­˜ã§ãã¾ã›ã‚“: 真å½å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%2$s\"ã®å€¤\"%1$s\"ãŒä¸æ­£ã§ã™: 整数を指定ã—ã¦ãã ã•ã„"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "変数åãŒä¸æ­£ã§ã™: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%2$s\"ã®å€¤\"%1$s\"ãŒèªè­˜ã§ãã¾ã›ã‚“。\n"
+"有効ãªå€¤ã¯ %3$s。"
diff --git a/src/bin/psql/po/ka.po b/src/bin/psql/po/ka.po
new file mode 100644
index 0000000..108db3c
--- /dev/null
+++ b/src/bin/psql/po/ka.po
@@ -0,0 +1,6577 @@
+# Georgian message translation file for psql
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-01 10:47+0000\n"
+"PO-Revision-Date: 2023-08-01 13:46+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ბრძáƒáƒœáƒ”ბრგáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•áƒ”"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ შეუძლებელიáƒ: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu მწკრივი)"
+msgstr[1] "(%lu მწკრივი)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "შეწყვეტილიáƒ\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე თáƒáƒ•áƒ¡áƒáƒ áƒ—ის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ%d გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე უჯრედის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: უჯრედების რáƒáƒáƒ“ენáƒáƒ‘რ%d-ზე მეტიáƒ.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (შიდრშეცდáƒáƒ›áƒ): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "რეკურსიული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბრცვლáƒáƒ“ისთვის \"%s\""
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ID-ის (%d) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბრძáƒáƒœáƒ”ბრ\\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის სცáƒáƒ“ეთ \\? ."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: დáƒáƒ›áƒáƒ¢áƒ”ბითი áƒáƒ áƒ’უმენტი \"%s\" იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s ბრძáƒáƒœáƒ”ბრგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ; მიმდინáƒáƒ áƒ” \\if ბლáƒáƒ™áƒ˜áƒ“áƒáƒœ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\endif áƒáƒœ Control-C"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის, ID-ით %ld, სáƒáƒ¬áƒ§áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე გáƒáƒ“áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\"-ზე შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" სáƒáƒ™áƒ”ტით \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" (მისáƒáƒ›áƒáƒ áƒ—ით \"%s\") დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის ბáƒáƒ¤áƒ”რის გáƒáƒ áƒ”შე"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ხáƒáƒ–ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "ცვლილებების გáƒáƒ áƒ”შე"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: კáƒáƒ“ირების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი áƒáƒœ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ პრáƒáƒªáƒ”დურრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "წინრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ áƒ”შე."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: áƒáƒ™áƒšáƒ˜áƒ მáƒáƒ áƒ¯áƒ•áƒ”ნრმრგვáƒáƒšáƒ˜ ფრჩხილი"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: áƒáƒ™áƒšáƒ˜áƒ სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒ’უმენტი"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: áƒáƒ  შეიძლებრ\\else -ის შემდეგ იყáƒáƒ¡"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ \\if -ის გáƒáƒ áƒ”შე"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: ვერ გáƒáƒ©áƒœáƒ“ებრ\\else -ის შემდეგ"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ \\if -ის გáƒáƒ áƒ”შე"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ \\if -ის გáƒáƒ áƒ”შე"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ბáƒáƒ¤áƒ”რი ცáƒáƒ áƒ˜áƒ”ლიáƒ."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "შეიყვáƒáƒœáƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის (\"%s\") áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "შეიყვáƒáƒœáƒ”თ კდევ ერთხელ: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევáƒ."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: ცვლáƒáƒ“ის მნიშვნელáƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ბáƒáƒ¤áƒ”რი ცáƒáƒ áƒ˜áƒ”ლიáƒ(გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ“áƒ)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "ისტáƒáƒ áƒ˜áƒ ჩáƒáƒ¬áƒ”რილირფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\".\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის სáƒáƒ®áƒ”ლი \"=\" -ს áƒáƒ  შეიძლებრშეიცáƒáƒ•áƒ“ეს"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "ფუნქციის სáƒáƒ®áƒ”ლი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ხედის სáƒáƒ®áƒ”ლი"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "დრáƒáƒ˜áƒ¡ დáƒáƒ—ვლრჩáƒáƒ áƒ—ულიáƒ."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "დრáƒáƒ˜áƒ¡ დáƒáƒ—ვლრგáƒáƒ›áƒáƒ áƒ—ულიáƒ."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: ინტერვáƒáƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინტერვáƒáƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: იტერáƒáƒªáƒ˜áƒ˜áƒ¡ რáƒáƒáƒ“ენáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იტერáƒáƒªáƒ˜áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რ\"%s\""
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "პáƒáƒ áƒáƒšáƒ˜: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "პáƒáƒ áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის %s: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "შეერთების სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის, ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡áƒ დრდრპáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ  მითითებáƒ"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრების ხელáƒáƒ®áƒšáƒ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "წინრშეერთებრჯერ კიდევ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" სáƒáƒ™áƒ”ტით \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" (მისáƒáƒ›áƒáƒ áƒ—ით \"%s\") დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\"\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, სერვერი %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"გáƒáƒ¤áƒ áƒ—ხილებáƒ: %s ძირითáƒáƒ“ი ვერსირ%s, სერვერის ძირითáƒáƒ“ი ვერსირ%s.\n"
+" psql-ის ზáƒáƒ’იერთმრფუნქციáƒáƒ› შეიძლებრáƒáƒ  იმუშáƒáƒáƒ¡.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL შეერთებრ(პრáƒáƒ“áƒáƒ™áƒáƒšáƒ˜: %s, შიფრáƒáƒªáƒ: %s, შეკუშმვáƒ: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "უცნáƒáƒ‘ი"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ული"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "ჩáƒáƒ áƒ—"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-ით დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜ შეერთებáƒ\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"გáƒáƒ¤áƒ áƒ—ხილებáƒ: კáƒáƒœáƒ¡áƒáƒšáƒ˜áƒ¡ კáƒáƒ“ირებრ(%u) გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ“ებრWindows კáƒáƒ“ირებისგáƒáƒœ(%u)\n"
+" 8-ბიტიáƒáƒœáƒ˜ სიმბáƒáƒšáƒáƒ”ბმრშეიძლებრსწáƒáƒ áƒáƒ“ áƒáƒ  იმუშáƒáƒáƒ¡. მეტი დეტáƒáƒšáƒ”ბისთვის\n"
+" იხილეთ psql-ის დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ გვერდი გვერდი \"შენიშვნები Windows-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისთვის\".\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის PSQL_EDITOR_LINENUMBER_ARG დáƒáƒ§áƒ”ნებრხáƒáƒ–ის ნáƒáƒ›áƒ”რზე"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ: \"%s\""
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "/bin/sh-ის გáƒáƒ¨áƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "დრáƒáƒ”ბითი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მáƒáƒ«áƒ”ბნის შეცდáƒáƒ›áƒ: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: \"%s\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ‘რევიáƒáƒ¢áƒ£áƒ áƒ áƒáƒ áƒ˜áƒ•áƒ”ს, \"%s\"-ს დრ\"%s-ს ემთხვევáƒ\""
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბი ფáƒáƒ áƒ›áƒáƒ¢áƒ”ბიáƒ: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: ხáƒáƒ–ის ნებáƒáƒ“áƒáƒ áƒ—ული სტილებირascii, old-ascii დრunicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: უნიკáƒáƒ“ის სáƒáƒ–ღვრის ხáƒáƒ–ის ნებáƒáƒ“áƒáƒ áƒ—ული სტილებირsingle დრdouble"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: უნიკáƒáƒ“ის სვეტის ხáƒáƒ–ის ნებáƒáƒ“áƒáƒ áƒ—ული სტილებირsingle დრdouble"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset:უნიკáƒáƒ“ის თáƒáƒ•áƒ¡áƒáƒ áƒ—ის ხáƒáƒ–ების ნებáƒáƒ“áƒáƒ áƒ—ულ სტილებირsingle დრdouble"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: xheader_width-ის დáƒáƒ¨áƒ•áƒ”ბული მნიშვნელáƒáƒ‘ებირ\"%s\" (ნáƒáƒ’ულისხმები), \"%s\", \"%s\", áƒáƒœ რიცხვი, რáƒáƒ›áƒ”ლიც ზუსტ სიგáƒáƒœáƒ”ზე მიუთითებს"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep ერთი ერთბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ უნდრიყáƒáƒ¡"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep áƒáƒ  შეიძლებრიყáƒáƒ¡ áƒáƒ áƒ›áƒáƒ’ი ბრჭყáƒáƒšáƒ˜, ხáƒáƒ–ის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ დრკáƒáƒ áƒ”ტის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "სáƒáƒ–ღვრის სტილი: %d\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნის სიგáƒáƒœáƒ” დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნის სიგáƒáƒœáƒ”რ%d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ეკრáƒáƒœáƒ˜ ჩáƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ეკრáƒáƒœáƒ˜ áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ეკრáƒáƒœáƒ˜ გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•áƒ¡áƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ\"%s\".\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•áƒ¡áƒáƒ áƒ—ირ%d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSV-ში ველების გáƒáƒœáƒ›áƒáƒªáƒáƒšáƒ™áƒ”ვებელირ\"%s\".\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "ველების გáƒáƒœáƒ›áƒáƒªáƒáƒšáƒ™áƒ”ვებელი ნულáƒáƒ•áƒáƒœáƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "ველების გáƒáƒœáƒ›áƒáƒªáƒáƒšáƒ™áƒ”ვებელირ\"%s\".\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ზáƒáƒšáƒ˜ ჩáƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "ნáƒáƒ’ულისხმები ქვესáƒáƒ áƒ—ი გáƒáƒ›áƒáƒ áƒ—ულიáƒ\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "ხáƒáƒ–ის სტილირ%s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜áƒ ეკრáƒáƒœáƒ˜áƒ \"%s\".\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "რიცხვების ენáƒáƒ–ე მáƒáƒ áƒ’ებული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ ჩáƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "რიცხვების ენáƒáƒ–ე მáƒáƒ áƒ’ებული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ გáƒáƒ›áƒáƒ áƒ—ულáƒ.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "გრძელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრგვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი ყáƒáƒ•áƒ”ლთვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი %d-ზე ნáƒáƒ™áƒšáƒ”ბ ხáƒáƒ–ზე áƒáƒ  მუშáƒáƒáƒ‘ს.\n"
+msgstr[1] "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი %d-ზე ნáƒáƒ™áƒšáƒ”ბ ხáƒáƒ–ზე áƒáƒ  მუშáƒáƒáƒ‘ს.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ ნული ბáƒáƒ˜áƒ¢áƒ˜áƒ.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ <newline>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ \"%s\".\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "ცხრილის áƒáƒ¢áƒ áƒ˜áƒ‘უტებირ\"%s\".\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "ცხრილის áƒáƒ¢áƒ áƒ˜áƒ‘უტები მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ \"%s\".\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრგáƒáƒ£áƒ¥áƒ›áƒ“áƒ.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "მხáƒáƒšáƒáƒ“ სტრუქტურები ჩáƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "მხáƒáƒšáƒáƒ“ სტრუქტურები გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "უნიკáƒáƒ“ის სáƒáƒ–ღვრის ხáƒáƒ–ის სტილირ\"%s\".\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "უნიკáƒáƒ“ის სვეტის ხáƒáƒ–ის სტილირ\"%s\".\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "უნიკáƒáƒ“ის თáƒáƒ•áƒ¡áƒáƒ áƒ—ის ხáƒáƒ–ის სტილირ\"%s\".\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: შეცდáƒáƒ›áƒ"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch ცáƒáƒ áƒ˜áƒ”ლი მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ— გáƒáƒ›áƒáƒ§áƒ”ნებული ვერ იქნებáƒ"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "დრáƒáƒ˜áƒ¡ áƒáƒ¦áƒ›áƒ áƒ˜áƒªáƒ®áƒ•áƒ”ლის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (ყáƒáƒ•áƒ”ლ %g-ში)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (ყáƒáƒ•áƒ”ლ %g-ში)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "სიგნáƒáƒšáƒ”ბისთვის დáƒáƒšáƒáƒ“ებრშეუძლებელიáƒ: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* მáƒáƒ—ხáƒáƒ•áƒœáƒ **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" ხედი áƒáƒ áƒáƒ"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions მáƒáƒ¡áƒ˜áƒ•áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "გáƒáƒ¥áƒªáƒ”ვრáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ შეერთებს გáƒáƒ áƒ”შე შეუძლებელიáƒ"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბრხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•áƒ¡: \"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "სერვერთáƒáƒœ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ დáƒáƒ™áƒáƒ áƒ’ულიáƒ"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "სერვერთáƒáƒœ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ დáƒáƒ™áƒáƒ áƒ’ულიáƒ. ვეცდები თáƒáƒ•áƒ˜áƒ“áƒáƒœ დáƒáƒ•áƒ˜áƒ¬áƒ§áƒ: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "წáƒáƒ áƒ›áƒáƒ¢áƒ”ბულიáƒ.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "დრáƒ: %.3f მწმ\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "დრáƒ: %.3f მწმ (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "დრáƒ: %.3f მწმ (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "დრáƒ: %.3f მწმ (%.0f დღე %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "მიღებულირáƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ£áƒšáƒ˜ გáƒáƒ¤áƒ áƒ—ხილებრ\"%s\" შემცველáƒáƒ‘ით \"%s\" სერვერის პრáƒáƒªáƒ”სისგáƒáƒœ PID-ით %d.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "მიღებულირáƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ£áƒšáƒ˜ გáƒáƒ¤áƒ áƒ—ხილებრ\"%s\" სერვერის პრáƒáƒªáƒ”სისგáƒáƒœ PID-ით %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "შედეგების ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset -სთვის მწკრივები áƒáƒ  დáƒáƒ‘რუნებულáƒ"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset -სთვის ერთზე მეტი მწკრივი დáƒáƒ‘რუნდáƒ"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "მცდელáƒáƒ‘áƒ, \\gset-ი სპეციáƒáƒšáƒ£áƒ  ცვლáƒáƒ“ზე (\"%s\") ყáƒáƒ¤áƒ˜áƒšáƒ˜áƒ§áƒ გáƒáƒ›áƒáƒ§áƒ”ნებული, იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(ერთნáƒáƒ‘იჯიáƒáƒœáƒ˜ რეჟიმი: გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ ბრძáƒáƒœáƒ”ბáƒ)*******************************************\n"
+"%s\n"
+"***(დáƒáƒáƒ¬áƒ”ქით Enter-ს გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“. გáƒáƒ¡áƒáƒ£áƒ¥áƒ›áƒ”ბლáƒáƒ“ კი x-ს დრშემდეგ Enter-ს )********************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი სტáƒáƒ¢áƒ£áƒ¡áƒ˜ (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "სვეტი"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "ტიპი"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ¡ შედეგები áƒáƒ  áƒáƒ¥áƒ•áƒ¡, áƒáƒœ შედეგებში სვეტები áƒáƒ áƒáƒ.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: სáƒáƒ­áƒ˜áƒ áƒáƒ áƒáƒ áƒ’უმენტები"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ: \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ ხáƒáƒ–ის ბáƒáƒšáƒáƒ¡áƒ—áƒáƒœ"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“(იდáƒáƒœ/ში) კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "გáƒáƒ áƒ” ბრძáƒáƒœáƒ”ბáƒáƒ›áƒ“ე ფáƒáƒ˜áƒ¤áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "შეცდáƒáƒ›áƒ COPY-ის მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒ¬áƒ”რისáƒáƒ¡: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY-ის მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბულირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"შეიყვáƒáƒœáƒ”თ დáƒáƒ¡áƒáƒ™áƒáƒžáƒ˜áƒ áƒ”ბელიმ ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ— დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული მáƒáƒœáƒáƒªáƒ”მები.\n"
+"დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ”თ უკáƒáƒœáƒ ხáƒáƒ–ით დრწერტილით იგივე ხáƒáƒ–ში ხáƒáƒ–ით, áƒáƒœ EOF სიგნáƒáƒšáƒ˜áƒ—."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ“რკითხვის შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბის რეჟიმიდáƒáƒœ გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ მცდელáƒáƒ‘áƒ"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ›áƒ შედეგების სეტი áƒáƒ  დáƒáƒáƒ‘რუნáƒ"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ› სულ ცáƒáƒ¢áƒ, სáƒáƒ›áƒ˜ სვეტი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: ვერტიკáƒáƒšáƒ£áƒ áƒ˜ დრჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒ˜ თáƒáƒ•áƒ¡áƒáƒ áƒ—ები სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•áƒ სვეტებში უნდრიყáƒáƒ¡"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: რáƒáƒªáƒ მáƒáƒ—ხáƒáƒ•áƒœáƒ სáƒáƒ›áƒ–ე მეტ სვეტს áƒáƒ‘რუნებს, áƒáƒ¡áƒ”ვე სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒœáƒáƒªáƒ”მების სვეტის მითითებáƒ"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულირსვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რ(%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგი მáƒáƒœáƒáƒªáƒ”მების მრáƒáƒ•áƒáƒš მნიშვნელáƒáƒ‘áƒáƒ¡ შეიცáƒáƒ•áƒ¡ მწკრივისთვის \"%s\", სვეტი \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: სვეტის რიცხვი %d დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ 1..%d გáƒáƒ áƒ”თáƒáƒ"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: სვეტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: სვეტის სáƒáƒ®áƒ”ლი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "სქემáƒ"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "სáƒáƒ®áƒ”ლი"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "შედეგის მáƒáƒœáƒáƒªáƒ”მების ტიპი"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "áƒáƒ áƒ’უმენტის მáƒáƒœáƒáƒªáƒ”მების ტიპი"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცების სიáƒ"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "სერვერს (ვერსირ%s) წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ."
+
+#: describe.c:168
+msgid "Index"
+msgstr "ინდექსი"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "ცხრილი"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების სიáƒ"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "მფლáƒáƒ‘ელი"
+
+#: describe.c:231
+msgid "Location"
+msgstr "მდებáƒáƒ áƒ”áƒáƒ‘áƒ"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "ზáƒáƒ›áƒ"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "ცხრილის სივრცეების სიáƒ"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df მხáƒáƒšáƒáƒ“ [anptwS+] -ს იღებს პáƒáƒ áƒáƒ›áƒ”ტრáƒáƒ“"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df - áƒáƒ  იღებს \"%c\" პáƒáƒ áƒáƒ›áƒ”ტრს, რáƒáƒªáƒ სერვერის ვერსიáƒáƒ %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "áƒáƒ’"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ფáƒáƒœáƒ¯áƒáƒ áƒ"
+
+#: describe.c:356
+msgid "proc"
+msgstr "პრáƒáƒª"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "ფუნქც"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "ტრიგერი"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "დáƒáƒ£áƒ áƒ¦áƒ•áƒ”ველი"
+
+#: describe.c:387
+msgid "stable"
+msgstr "სტáƒáƒ‘ილური"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "ცვáƒáƒšáƒ”ბáƒáƒ“ი"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "ცვáƒáƒšáƒ”ბáƒáƒ“áƒáƒ‘áƒ"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "შეზღუდულიáƒ"
+
+#: describe.c:398
+msgid "safe"
+msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒ"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "სáƒáƒ®áƒ˜áƒ¤áƒáƒ—áƒ"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "პáƒáƒ áƒáƒšáƒ”ლური"
+
+#: describe.c:405
+msgid "definer"
+msgstr "áƒáƒ¦áƒ›áƒ¬áƒ”რი"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "ჩáƒáƒ›áƒ¬áƒáƒ“ებელი"
+
+#: describe.c:407
+msgid "Security"
+msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბáƒ"
+
+#: describe.c:412
+msgid "Language"
+msgstr "ენáƒ"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "შიდრსáƒáƒ®áƒ”ლი"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "ფუნქციების სიáƒ"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "ელემენტები"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპების სიáƒ"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "მáƒáƒ áƒªáƒ®áƒ”ნრáƒáƒ áƒ’უმენტის ტიპი"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "მáƒáƒ áƒ¯áƒ•áƒ”ნრáƒáƒ áƒ’უმენტის ტიპი"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "შედეგის ტიპი"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "ფუნქციáƒ"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "კáƒáƒ“ირებáƒ"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "ენის მáƒáƒ›áƒ¬áƒáƒ“ებელი"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "დáƒáƒ¨áƒšáƒ"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICU ენáƒ"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "ICU წესები"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "ცხრილების სივრცე"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ების სიáƒ"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "ცხრილი"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "ხედი"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "მიმდევრáƒáƒ‘áƒ"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "გáƒáƒ áƒ” ცხრილი"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "სვეტის წვდáƒáƒ›áƒ”ბი"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "წესები"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "წვდáƒáƒ›áƒ”ბი"
+
+#: describe.c:1195
+msgid "function"
+msgstr "ფუნქციáƒ"
+
+#: describe.c:1197
+msgid "type"
+msgstr "ტიპი"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "სქემáƒ"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "ნáƒáƒ’ულისხმები წვდáƒáƒ›áƒ”ბი"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "áƒáƒ‘იექტი"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "ცხრილის შეზღუდვები"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "დáƒáƒ›áƒ”ნის შეზღუდვები"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "წესი"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "áƒáƒ‘იექტების áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "ურთიერთáƒáƒ‘რსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "ურთიერთáƒáƒ‘ები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "ურთიერთáƒáƒ‘ები, რáƒáƒ›áƒšáƒ˜áƒ¡ OID=%s, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "დáƒáƒ¬áƒ§áƒ”ბáƒ"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "მინიმუმი"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "გáƒáƒ–რდáƒ"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "დიáƒáƒ®"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "áƒáƒ áƒ"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "ციკლები?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "კეში"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "მფლáƒáƒ‘ელი: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტის მიმდევრáƒáƒ‘áƒ: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი მიმდევრáƒáƒ›áƒ \"%s.%s\""
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "მიმდევრáƒáƒ‘რ\"%s.%s\""
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი ცხრილი \"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "ცხრილი \"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "ხედი \"%s.%s\""
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი ინდექსი \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "ინდექსი \"%s.%s\""
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსი \"%s.%s\""
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექი \"%s.%s\""
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST ცხრილი \"%s.%s\""
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "კáƒáƒ›áƒžáƒáƒ–იტის ტიპი \"%s.%s\""
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "გáƒáƒ áƒ” ცხრილი \"%s.%s\""
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი \"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი \"%s.%s\""
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "გáƒáƒœáƒ£áƒšáƒ”ბáƒáƒ“ი"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "ნáƒáƒ’ულისხმევი"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბáƒ"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "FDW -ის მáƒáƒ áƒ’ებáƒ"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "სáƒáƒªáƒáƒ•áƒ˜"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "შეკუმშვáƒ"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვების გáƒáƒ áƒ”შე"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვáƒ: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბი: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "ცხრილის მფლáƒáƒ‘ელი: \"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბი. "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "უნიკáƒáƒšáƒ£áƒ áƒ˜"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " ნულები გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•áƒ”ბული áƒáƒ áƒáƒ"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "ცხრილისთვის \"%s.%s\""
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", პრედიკáƒáƒ¢áƒ˜ (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებული"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", deferrable"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", თáƒáƒ•áƒ˜áƒ“áƒáƒœ გáƒáƒ“áƒáƒ“ებული"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", რეპლიკის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "ინდექსები:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ შეზღუდვები:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "გáƒáƒ áƒ”-გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "ბმული გáƒáƒ áƒ”დáƒáƒœ:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "წესები:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "წესები (მწკრივების გáƒáƒ«áƒšáƒ˜áƒ”რებული დáƒáƒªáƒ•áƒ ჩáƒáƒ áƒ—ულიáƒ):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "წესები (მწკრივების დáƒáƒªáƒ•áƒ ჩáƒáƒ áƒ—ულიáƒ): (áƒáƒ áƒªáƒ”რთი)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "წესები (მწკრივების გáƒáƒ«áƒšáƒ˜áƒ”რებული დáƒáƒªáƒ•áƒ ჩáƒáƒ áƒ—ულიáƒ: (áƒáƒ áƒªáƒ”რთი)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "წესები (მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბრგáƒáƒ›áƒáƒ áƒ—ულიáƒ)"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტები:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "წესები:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ული წესები:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "ყáƒáƒ•áƒ”ლთვის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი წესები:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "მხáƒáƒšáƒáƒ“ რეპლიკáƒáƒ–ე გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი წესები:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მები:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "áƒáƒ¦áƒ¬áƒ”რის ნáƒáƒ®áƒ•áƒ:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "ტრიგერები:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ›áƒáƒ áƒ—ული ტრიგერები:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ული შიდრტრიგერები:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "ყáƒáƒ•áƒ”ლთვის გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი ტრიგერები:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "მხáƒáƒšáƒáƒ“ რეპლიკáƒáƒ–ე გáƒáƒ¨áƒ•áƒ”ბáƒáƒ“ი ტრიგერები:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "სერვერი: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW პáƒáƒ áƒáƒ›áƒ”ტრები: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "მემკვიდრეáƒáƒ‘ით"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის რიცხვი: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის რიცხვი: %d (სიის მისáƒáƒ¦áƒ”ბáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\d+.)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "შვილეული ცხრილების რიცხვი: %d (სიის გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\d+ )"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "შვილეული ცხრილები"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბი"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "ტიპიზირებული ცხრილის ტიპი: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "რეპლიკის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "áƒáƒ¥áƒ•áƒ¡ OID-ები: დიáƒáƒ®"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", ცხრილების სივრცე: \"%s\""
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "რáƒáƒšáƒ”ბის სიáƒ"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტები"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის გáƒáƒ áƒ”შე"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "რáƒáƒšáƒ˜áƒ¡ შექმნáƒ"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "ბáƒáƒ–ის შექმნáƒ"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "შესვლრშეუძლებელიáƒ"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "რეპლიკáƒáƒªáƒ˜áƒ"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "RLS-ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "შეერთებების გáƒáƒ áƒ”შე"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d შეერთებáƒ"
+msgstr[1] "%d შეერთებáƒ"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "პáƒáƒ áƒáƒšáƒ¡ ვáƒáƒ“რ"
+
+#: describe.c:3775
+msgid "Role"
+msgstr "რáƒáƒšáƒ˜"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒ"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "მáƒáƒ áƒ’ებáƒ"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "რáƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\" დრბáƒáƒ–ისთვის \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "რáƒáƒšáƒ˜áƒ¡áƒ—ვის (\"%s\") პáƒáƒ áƒáƒ›áƒ”ტრები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "წáƒáƒ áƒ›áƒáƒáƒ“გენს წევრს"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "მიმნიჭებელი"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "რáƒáƒšáƒ”ბის მინიჭებების სიáƒ"
+
+#: describe.c:3952
+msgid "index"
+msgstr "ინდექსი"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST ცხრილი"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსი"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "მუდმივი"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "დრáƒáƒ”ბითი"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "შენáƒáƒ®áƒ•áƒ"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "ურთიერთáƒáƒ‘ების სიáƒ"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "სერვერს (ვერსირ%s) ცხრილების დეკლáƒáƒ áƒáƒ¢áƒ˜áƒ£áƒš დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსების სიáƒ"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების სიáƒ"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ურთიერთáƒáƒ‘ების სიáƒ"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "მშáƒáƒ‘ლის სáƒáƒ®áƒ”ლი"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "ბáƒáƒšáƒ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ზáƒáƒ›áƒ"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "ჯáƒáƒ›áƒ£áƒ áƒ˜ ზáƒáƒ›áƒ"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "სáƒáƒœáƒ“áƒ"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "შიდრენáƒ"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "შემმáƒáƒ¬áƒ›áƒ”ბელი"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "ჩáƒáƒ“გმული კáƒáƒ“ის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "ენების სიáƒ"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "დáƒáƒ›áƒ”ნების სიáƒ"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "წყáƒáƒ áƒ"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ”ბáƒ"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "ნáƒáƒ’ულისხმები?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის სიáƒ"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "მნიშვნელáƒáƒ‘áƒ"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "კáƒáƒœáƒ¢áƒ”ქსტი"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒáƒœáƒáƒ’ულისხმებáƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "სერვერს (ვერსირ%s) მáƒáƒ•áƒšáƒ”ნის ტრიგერების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "მáƒáƒ•áƒšáƒ”ნáƒ"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "ჩáƒáƒ áƒ—ულიáƒ"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "რეპლიკáƒ"
+
+#: describe.c:4658
+msgid "always"
+msgstr "ყáƒáƒ•áƒ”ლთვის"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ულიáƒ"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "ჩáƒáƒ áƒ—ულიáƒ"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "ჭდეები"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "მáƒáƒ•áƒšáƒ”ნების ტრიგერების სიáƒ"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "სერვერს (ვერსირ%s) გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სიáƒ"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "წყáƒáƒ áƒáƒ¡ ტიპი"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნის ტიპი"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "მინიჭებáƒáƒ¨áƒ˜"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "áƒáƒ¨áƒ™áƒáƒ áƒ?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "კáƒáƒ¡áƒ¢áƒ”ბის სიáƒ"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "სერვისის მáƒáƒ›áƒ¬áƒáƒ“ებელი"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "დეტერმნისტული?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ”ბის სიáƒ"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "სქემების სიáƒ"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "ტექსტური ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლების სიáƒ"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი სáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლები ვერ ვიპáƒáƒ•áƒ”."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის დáƒáƒ¬áƒ§áƒ”ბáƒ"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "მეთáƒáƒ“ი"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "შემდეგი კáƒáƒ“ის მიღებáƒ"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რის მიღებáƒ"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "კáƒáƒ“ის ტიპების მიღებáƒ"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი \"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი \"%s\""
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "კáƒáƒ“ის სáƒáƒ®áƒ”ლი"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "კáƒáƒ“ის ტიპები დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლისთვის \"%s.%s\""
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "კáƒáƒ“ის ტიპები დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლისთვის \"%s\""
+
+#: describe.c:5429
+msgid "Template"
+msgstr "ნიმუში"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ”ბის სიáƒ"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "ერთეული"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "ლექსით გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის სიáƒ"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბის სიáƒ"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ სáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "ტექსტის ძებნის áƒáƒ áƒªáƒ”რთი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ ნáƒáƒžáƒáƒ•áƒœáƒ˜ áƒáƒ áƒáƒ."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "ტáƒáƒ™áƒ”ნი"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "ლექსიკáƒáƒœáƒ”ბი"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ”ბის სიáƒ"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "ვერსიáƒ"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "გáƒáƒ áƒ” სერვერების სიáƒ"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "სერვერი"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მიმáƒáƒ’რებების სიáƒ"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "გáƒáƒ áƒ” ცხრილების სიáƒ"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "დáƒáƒ§áƒ”ნებული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების სიáƒ"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების პáƒáƒ•áƒœáƒ შეუძლებელიáƒ."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "áƒáƒ‘იექტები გáƒáƒ¤áƒáƒ áƒ—ებáƒáƒ¨áƒ˜ \"%s\""
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ბáƒáƒ–ებს შáƒáƒ áƒ˜áƒ¡ ბმულები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "სერვერს (ვერსირ%s) გáƒáƒ›áƒáƒªáƒ”მების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "ყველრცხრილი"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "ჩáƒáƒ¡áƒ›áƒ”ბი"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბები"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "წáƒáƒ¨áƒšáƒ”ბი"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "შეკვეცები"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Root-ის გáƒáƒ•áƒšáƒ˜áƒ—"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მების სიáƒ"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "გáƒáƒ›áƒáƒªáƒ”მრსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "გáƒáƒ›áƒáƒªáƒ”მების გáƒáƒ áƒ”შე."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "პუბლიკáƒáƒªáƒ˜áƒ %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "ცხრილები:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "ცხრილები სქემებიდáƒáƒœ:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "სერვერს (ვერსირ%s) გáƒáƒ›áƒáƒ¬áƒ”რების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "გáƒáƒ›áƒáƒªáƒ”ბáƒ"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "გáƒáƒáƒ“áƒáƒªáƒ”მáƒ"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "áƒáƒ -ფáƒáƒ–იáƒáƒœáƒ˜ გáƒáƒ“áƒáƒªáƒ”მáƒ"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "გáƒáƒ›áƒáƒ áƒ—ვრშეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "პáƒáƒ áƒáƒšáƒ˜ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "გáƒáƒ•áƒ£áƒ¨áƒ•áƒ მფლáƒáƒ‘ელით?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "სინქრáƒáƒœáƒ£áƒšáƒ˜ გáƒáƒ“áƒáƒ’ზáƒáƒ•áƒœáƒ"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "შეერთ. ინფáƒ"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "LSN-ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების სიáƒ"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ტიპი"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "სáƒáƒªáƒáƒ•áƒ˜áƒ¡ ტიპი"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ”ბის სიáƒ"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "გáƒáƒœáƒ™áƒ£áƒ—ვნილი ტიპები"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის სიáƒ"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "სტრáƒáƒ¢áƒ”გიáƒ"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "დáƒáƒšáƒáƒ’ებáƒ"
+
+#: describe.c:6911
+msgid "search"
+msgstr "ძებნáƒ"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "მიზáƒáƒœáƒ˜"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ დáƒáƒšáƒáƒ’ებáƒ"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "რეგისტრირებული მáƒáƒ áƒªáƒ®áƒ”ნრტიპი"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "რეგისტრირებული მáƒáƒ áƒ¯áƒ•áƒ”ნრტიპი"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "რიცხვი"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის ფუნქციების სიáƒ"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "დიდი áƒáƒ‘იექტები"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql PostgreSQL-ის ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ტერმინáƒáƒšáƒ˜áƒ.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი [მáƒáƒ›áƒ®áƒ›áƒ¡áƒáƒ®áƒ”ლი]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=ბრძáƒáƒœáƒ”ბრმხáƒáƒšáƒáƒ“ ერთი (SQL áƒáƒœ შიდáƒ) ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•áƒ”ბრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მისáƒáƒ”რთებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ფáƒáƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი ბრძáƒáƒœáƒ”ბების ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ შესრულებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ ბáƒáƒ–ების სიის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘áƒ\n"
+" psql -ის მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ცვლáƒáƒ“ისთვის მითითებული მნიშვნელáƒáƒ‘ის მინიჭებáƒ\n"
+" (მáƒáƒ’:, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc გáƒáƒ¨áƒ•áƒ”ბისáƒáƒ¡ წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (~/.psqlrc) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" რáƒáƒ’áƒáƒ áƒª ერთი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡, ისე გáƒáƒ¨áƒ•áƒ”ბრ(თუ áƒáƒ áƒáƒ˜áƒœáƒ¢áƒ”რáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=პáƒáƒ áƒáƒ›áƒ”ტრები] áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands \"\\\"-ით დáƒáƒ¬áƒ§áƒ”ბული ბრძáƒáƒœáƒ”ბების ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables გáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებული ცვლáƒáƒ“ების სიის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"შეტáƒáƒœáƒ˜áƒ¡áƒ დრგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all სკრიპტიდáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხულის ეკრáƒáƒœáƒ–ე ჩვენებáƒ\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ›áƒ¢áƒáƒœáƒ˜ ბრძáƒáƒœáƒ”ბების ჩვენებáƒ\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden შიდრბრძáƒáƒœáƒ”ბების მიერ გენერირებული მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME სესიის ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბითი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ (readline) გáƒáƒ›áƒáƒ áƒ—ვáƒ\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგების ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრ(áƒáƒœ |ფáƒáƒ˜áƒ¤áƒ¨áƒ˜)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet ჩუმáƒáƒ“ გáƒáƒ¨áƒ•áƒ”ბრ(შეტყáƒáƒ‘ინებების გáƒáƒ áƒ”შე, მხáƒáƒšáƒáƒ“ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგები)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step ერთნáƒáƒ‘იჯიáƒáƒœáƒ˜ რეჟიმი (თითáƒáƒ”ული მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line ერთხáƒáƒ–იáƒáƒœáƒ˜ რეჟიმი (ხáƒáƒ–ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრSQL-ის ბრძáƒáƒœáƒ”ბáƒáƒ¡áƒáƒª áƒáƒ¡áƒ áƒ£áƒšáƒ”ბს)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ მáƒáƒ áƒ’ებáƒ:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align ცხრილის დáƒáƒ£áƒšáƒáƒ’ებლáƒáƒ“ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV (მძიმით გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ მნიშვნელáƒáƒ‘ები) ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=სტრიქáƒáƒœáƒ˜\n"
+" ველების გáƒáƒ›áƒ§áƒáƒ¤ სიმბáƒáƒšáƒ დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის (ნáƒáƒ’ულისხმები: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=ცვლ[=áƒáƒ áƒ’] ცვლ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒ’-ზე დáƒáƒ§áƒ”ნებრ(იხ, \\pset ბრძáƒáƒœáƒ”ბáƒ)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=სტრიქáƒáƒœáƒ˜\n"
+" ჩáƒáƒœáƒáƒ¬áƒ”რების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის (ნáƒáƒ’ულისხმები: áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ი)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only მხáƒáƒšáƒáƒ“ მწკრივების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=ტექსტი HTML ცხრილის ჭდის áƒáƒ¢áƒ áƒ˜áƒ‘უტების დáƒáƒ§áƒ”ნებრ(მáƒáƒ’: სიგრძე, სáƒáƒ–ღვáƒáƒ áƒ˜)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ცხრილის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒáƒ“ ნულáƒáƒ•áƒáƒœáƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœ ბáƒáƒ˜áƒ¢áƒ–ე დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმები: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტი"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜ (ნáƒáƒ’ულისხმები: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•áƒ”ლთვის კითხვრ(áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ უნდრხდებáƒáƒ“ეს)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"psql-ის შესáƒáƒ®áƒ”ბ დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მისáƒáƒ¦áƒ”ბáƒáƒ“ \n"
+"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ \"\\?\" (შიდრბრძáƒáƒœáƒ”ბებისთვის) áƒáƒœ \"\\help\" (SQL ბრძáƒáƒœáƒ”ბებისთვის), \n"
+"áƒáƒœ გáƒáƒ”ცáƒáƒœáƒ˜áƒ— \"psql\" გáƒáƒœáƒ§áƒáƒ¤áƒ˜áƒšáƒ”ბáƒáƒ¡ PostgreSQL-ის დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "ზáƒáƒ’áƒáƒ“ი\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright áƒáƒ©áƒ•áƒ”ნებს PostgreSQL-ის გáƒáƒ›áƒáƒ§áƒ”ნებისრდრდისტრიბუციის პირáƒáƒ‘ებს\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [სვეტები] შეáƒáƒ¡áƒ áƒ£áƒšáƒ”ბს მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ¡ დრშედეგს crosstab-ში áƒáƒ©áƒ•áƒ”ნებს\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose ბáƒáƒšáƒ შეცდáƒáƒ›áƒ˜áƒ¡ დეტáƒáƒšáƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ ჩვენებáƒ\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(პáƒáƒ áƒáƒ›áƒ”ტრი)] [ფáƒáƒ˜áƒšáƒ˜] მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შესრულებრ(დრშედეგის ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒœ |ფáƒáƒ˜áƒ¤áƒ¨áƒ˜ გáƒáƒ’ზáƒáƒ•áƒœáƒ;\n"
+" \\g áƒáƒ áƒ’უმენტების გáƒáƒ áƒ”შე იგივეáƒ, რáƒáƒª წერტილმძიმე\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგის áƒáƒ¦áƒ¬áƒ”რრმისი შესრულების გáƒáƒ áƒ”შე\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec ჯერ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡, მერე კი მისი თითáƒáƒ”ული შედეგის შესრულებáƒ\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [პრეფიქსი] მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შესრულებრდრშედეგის psql-ის ცვლáƒáƒ“ებში შენáƒáƒ®áƒ•áƒ\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(პáƒáƒ áƒáƒ›áƒ”ტრები)] [ფáƒáƒ˜áƒšáƒ˜] რáƒáƒ’áƒáƒ áƒª \\g, მáƒáƒ’რáƒáƒ› გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი უფრრფáƒáƒ áƒ—რიქნებáƒ\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q psql-დáƒáƒœ გáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ყáƒáƒ•áƒ”ლ SEC წáƒáƒ›áƒ¨áƒ˜ ერთხელ გáƒáƒ¨áƒ•áƒ”ბáƒ, N-ჯერ\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] დáƒáƒ®áƒ›áƒáƒ áƒ”ბრ\"\\\"-ით დáƒáƒ¬áƒ§áƒ”ბული ბრძáƒáƒœáƒ”ბების შესáƒáƒ®áƒ”ბ\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options დáƒáƒ®áƒ›áƒáƒ áƒ”ბრpsql-ის ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრგáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებული ცვლáƒáƒ“ების შესáƒáƒ®áƒ”ბ\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [სáƒáƒ®áƒ”ლი] SQL ბრძáƒáƒœáƒ”ბების დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ, * ყველრბრძáƒáƒœáƒ”ბისთვის\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის ბáƒáƒ¤áƒ”რი\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [ფáƒáƒ˜áƒšáƒ˜] [ხáƒáƒ–ი] მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის ბáƒáƒ¤áƒ”რის (áƒáƒœ ფáƒáƒ˜áƒšáƒ˜áƒ¡) გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ¨áƒ˜ გáƒáƒ®áƒ¡áƒœáƒ\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [ფუნქცსáƒáƒ®áƒ”ლი [ხáƒáƒ–ი]] ფუნქციის áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ¨áƒ˜ ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [ხედისსáƒáƒ®áƒ”ლი [ხáƒáƒ–ი]] ხედის áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ— ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის ბáƒáƒ¤áƒ”რის შემცველáƒáƒ‘ის ჩვენებáƒ\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის ბáƒáƒ¤áƒ”რის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბáƒ\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ფáƒáƒ˜áƒšáƒ˜] ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ჩვენებრáƒáƒœ ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ•áƒ\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბის ბáƒáƒ¤áƒ”რის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "შეტáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... SQL COPY -ის შესრულებრმáƒáƒœáƒáƒªáƒ”მების ნáƒáƒ™áƒáƒ“ით კლიენტის ჰáƒáƒ¡áƒ¢áƒáƒ›áƒ“ე\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [სტრიქáƒáƒœáƒ˜] სტრიქáƒáƒœáƒ˜áƒ¡ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ–ე გáƒáƒ¨áƒ•áƒ”ბáƒ(ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ áƒ”შე -n )\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ბრძáƒáƒœáƒ”ბების ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ შესრულებáƒ\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ფáƒáƒ˜áƒšáƒ˜ იგივე, რáƒáƒª \\i, მáƒáƒ’რáƒáƒ› სკრიპტის მიმდინáƒáƒ áƒ” áƒáƒ“გილიდáƒáƒœ დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებით\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ფáƒáƒ˜áƒšáƒ˜] მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ყველრშედეგის ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒœ |ფáƒáƒ˜áƒ¤áƒ¨áƒ˜ გáƒáƒ’ზáƒáƒ•áƒœáƒ\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [striqoni] სტრიქáƒáƒœáƒ˜áƒ¡ \\o გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ში ჩáƒáƒ¬áƒ”რრ(-n áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ების გáƒáƒ áƒ”შე)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [სტრიქáƒáƒœáƒ˜] სტრიქáƒáƒœáƒ˜áƒ¡ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš შეცდáƒáƒ›áƒáƒ–ე გáƒáƒ“áƒáƒ›áƒáƒ¢áƒáƒœáƒ (-n გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ áƒ”შე)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "პირáƒáƒ‘ითი\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR პირáƒáƒ‘ის შემცველი ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ პირáƒáƒ‘რმიმდინáƒáƒ áƒ” პირáƒáƒ‘ით ბლáƒáƒ™áƒ¨áƒ˜\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else პირáƒáƒ‘ის მიმდინáƒáƒ áƒ” ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ გზáƒ\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif პირáƒáƒ‘ის შემცველი ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (პáƒáƒ áƒáƒ›áƒ”ტრები: S = სისტემური áƒáƒ‘იექტების ჩვენებáƒ, + = დáƒáƒ›áƒáƒ¢áƒ”ბითი დეტáƒáƒšáƒ”ბი)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] ცხრილების, ხედებისრდრმიმდევრáƒáƒ‘ების სიáƒ\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME ცხრილის, ხედის, მიმდევრáƒáƒ‘ის áƒáƒœ ინდექსის áƒáƒ¦áƒ¬áƒ”რáƒ\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] áƒáƒ’რეგáƒáƒ¢áƒ”ბის სიáƒ\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების სიáƒ\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ”ბის სიáƒ\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ¯áƒáƒ®áƒ”ბის სიáƒ\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ¯áƒáƒ®áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქციების სიáƒ\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] ცხრილის სივრცეების სიáƒ\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის სიáƒ\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] კáƒáƒ¡áƒ¢áƒ”ბის სიáƒ\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რის ჩვენებáƒ, რáƒáƒ›áƒ”ლიც სხვáƒáƒ’áƒáƒœ áƒáƒ áƒ¡áƒáƒ“áƒáƒ ნáƒáƒ©áƒ•áƒ”ნები\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] დáƒáƒ›áƒ”ნების სიáƒ\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [შáƒáƒ‘ლáƒáƒœáƒ˜] ნáƒáƒ’ულისხმები პრივილეგიების სიáƒ\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” ცხრილების სიáƒ\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” სერვერების სიáƒ\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” ცხრილების სიáƒ\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სიáƒ\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ”ბის სიáƒ\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" ფუნქციების [მხáƒáƒšáƒáƒ“ agg/normal/procedure/trigger/window] სიáƒ\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბის სიáƒ\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ტექსტის ძებნის ლექსიკáƒáƒœáƒ”ბის სიáƒ\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლების სიáƒ\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის სიáƒ\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რáƒáƒšáƒ”ბის სიáƒ\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ინდექსების სიáƒ\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] დიდი áƒáƒ‘იექტების სიáƒ. იგივე, რáƒáƒª \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] პრáƒáƒªáƒ”დურული ენების სიáƒ\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედების სიáƒ\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] სქემების სიáƒ\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] კáƒáƒšáƒáƒªáƒ˜áƒ”ბის სიáƒ\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] ცხრილის, ხედის დრმიმდევრáƒáƒ‘ის წვდáƒáƒ›áƒ˜áƒ¡ უფლებების სიáƒ\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [შáƒáƒ‘ლáƒáƒœáƒ˜] [მხáƒáƒšáƒáƒ“ ინდექსი/ცხრილი] დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ურთიერთáƒáƒ‘ების სირ[n=ჩáƒáƒ“გმული]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] თითáƒáƒ”ული ბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\dg[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] რáƒáƒšáƒ”ბის მინიჭებების სიáƒ\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒ”მების სიáƒ\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¬áƒ”რების სიáƒ\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მიმდევრáƒáƒ‘ების სიáƒ\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ცხრილების სიáƒ\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒœáƒáƒªáƒ”მის ტიპების სიáƒ\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რáƒáƒšáƒ”ბის სიáƒ\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ხედების სიáƒ\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების სიáƒ\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სიáƒ\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒ•áƒšáƒ”ნის ტრიგერების სიáƒ\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ების სიáƒ\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME ფუნქციის áƒáƒ¦áƒ¬áƒ”რის ჩვენებáƒ\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ხედისსáƒáƒ®áƒ”ლი ხედის áƒáƒ¦áƒ¬áƒ”რის ჩვენებáƒ\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] იგივე, რáƒáƒª \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "დიდი áƒáƒ‘იექტები\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE დიდი áƒáƒ‘იექტის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ფáƒáƒ˜áƒšáƒ˜ [კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜]\n"
+" დიდი áƒáƒ‘იექტის ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვáƒ\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] დიდი áƒáƒ‘იექტების სიáƒ\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID დიდი áƒáƒ‘იექტის წáƒáƒ¨áƒšáƒ\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a სწáƒáƒ áƒ”ბულ დრგáƒáƒ£áƒ¡áƒ¬áƒáƒ áƒ”ბელ რეჟიმებს შáƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვáƒ\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [სტრიქáƒáƒœáƒ˜] ცხრილის სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ. áƒáƒœ წáƒáƒ¨áƒšáƒ, თუ მითითებული áƒáƒ áƒáƒ\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [სტრიქáƒáƒœáƒ˜] მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგის დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრáƒáƒœ ჩვენებáƒ\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმის გáƒáƒ“áƒáƒ áƒ—ვრ(მიმდინáƒáƒ áƒ” %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ]] ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ§áƒ”ნებáƒ\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] მხáƒáƒšáƒáƒ“ მწკრივების ჩვენებáƒ(áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] HTML-ის <table> ჭდის áƒáƒ¢áƒ áƒ˜áƒ‘უტების დáƒáƒ§áƒ”ნებáƒ. áƒáƒœ გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბáƒ, თუ მითითებული áƒáƒ áƒáƒ¤áƒ”რიáƒ\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვრ(áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "შეერთებáƒ\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[ბáƒáƒ–ისსáƒáƒ®áƒ”ლი|- მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი|- ჰáƒáƒ¡áƒ¢áƒ˜|- პáƒáƒ áƒ¢|-] | conninfo}\n"
+" áƒáƒ®áƒáƒš ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრ(მიმდინáƒáƒ áƒ” \"%s\")\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[ბáƒáƒ–ისსáƒáƒ®áƒ”ლი|- მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი|- ჰáƒáƒ¡áƒ¢áƒ˜|- პáƒáƒ áƒ¢|-] | conninfo}\n"
+" áƒáƒ®áƒáƒš ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრ(მიმდინáƒáƒ áƒ” შეერთებრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo მიმდინáƒáƒ áƒ” შეერთების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [კáƒáƒ“ირებáƒ] კლიენტის კáƒáƒ“ირების ჩვენებრáƒáƒœ დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი] მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ შეცვლáƒ\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒšáƒ˜ სისტემáƒ\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [სáƒáƒ¥] მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შეცვლáƒ\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ] გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის დáƒáƒ§áƒ”ნებრáƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] ბრძáƒáƒœáƒ”ბების ტáƒáƒ˜áƒ›áƒ”რის გáƒáƒ“áƒáƒ áƒ—ვრ(áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [ბრძáƒáƒœáƒ”ბáƒ] გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის შესრულებრáƒáƒœ ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ áƒ¡áƒ˜áƒ¡ გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "ცვლáƒáƒ“ები\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [ტექსტი] სáƒáƒ®áƒ”ლი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის შიდრცვლáƒáƒ“ის დáƒáƒ§áƒ”ნების შეთáƒáƒ•áƒáƒ–ებáƒ\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ]] დáƒáƒáƒ§áƒ”ნებს შიდრცვლáƒáƒ“ს, áƒáƒœ, თუ პáƒáƒ áƒáƒ›áƒ”ტრები მითითებული áƒáƒ áƒáƒ, მáƒáƒ— სიáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset სáƒáƒ®áƒ”ლი შიდრცვლáƒáƒ“ის მáƒáƒ®áƒ¡áƒœáƒ (წáƒáƒ¨áƒšáƒ)\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"გáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებულáƒáƒ“ მáƒáƒ¡áƒáƒžáƒ§áƒ áƒáƒ‘ი ცვლáƒáƒ“ების სიáƒ\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql-ის ცვლáƒáƒ“ები:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘áƒ\n"
+" áƒáƒœ \\set სáƒáƒ®áƒ”ლი მნიშვნელáƒáƒ‘რpsql-ის შიგნით\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" iთუ დáƒáƒ§áƒ”ნებულიáƒ, წáƒáƒ áƒ›áƒáƒ¢áƒ”ბული SQL ბრძáƒáƒœáƒ”ბები áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნებრგáƒáƒ“áƒáƒªáƒ”მული\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" გáƒáƒœáƒ¡áƒáƒ–ღვრáƒáƒ•áƒ¡ სიმბáƒáƒšáƒáƒ”ბის ზáƒáƒ›áƒáƒ¡ SQL-ის სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვების დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბისáƒáƒ¡\n"
+" [პáƒáƒ¢áƒáƒ áƒ (lower), upper (დიდი), პáƒáƒ¢áƒáƒ áƒ˜áƒ¡_შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბრ(preserve-lower), დიდის_შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბრ(preserve-upper)]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" ბáƒáƒ–ის სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლთáƒáƒœáƒáƒª áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიერთებული ბრძáƒáƒœáƒ“ებით\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბს, შეყვáƒáƒœáƒ˜áƒšáƒ˜áƒ“áƒáƒœ რრგáƒáƒ›áƒáƒ©áƒœáƒ“ებრსტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ–ე\n"
+" [all(ყველáƒáƒ¤áƒ”რი), errors(შეცდáƒáƒ›áƒ”ბი), none(áƒáƒ áƒáƒ¤áƒ”რი), queries(მáƒáƒ—ხáƒáƒ•áƒœáƒ”ბი)]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" თუ დáƒáƒ§áƒ”ნებულიáƒ, \\-ით დáƒáƒ¬áƒ§áƒ”ბული შიდრმáƒáƒ—ხáƒáƒ•áƒœáƒ”ბი ნáƒáƒ©áƒ•áƒ”ნები იქნებáƒ;\n"
+" თუ მნიშვნელáƒáƒ‘áƒáƒ 'noexe', შიდრბრძáƒáƒœáƒ”ბები ნáƒáƒ©áƒ•áƒ”ნები იქნებáƒ, მáƒáƒ’რáƒáƒ› შესრულებული áƒáƒ áƒ\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" მიმდინáƒáƒ áƒ” კლიენტის სიმბáƒáƒšáƒáƒ”ბის კáƒáƒ“ირებáƒ\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" \"true\" თუ ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•áƒœáƒ áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ იყáƒ. áƒáƒ áƒáƒ“რ\"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" შედეგის გáƒáƒ›áƒáƒ¡áƒáƒ—ხáƒáƒ•áƒ˜ მწკრივების რáƒáƒáƒ“ენáƒáƒ‘რერთი ჩვენებისთვის (0=უსáƒáƒ¡áƒ áƒ£áƒšáƒ)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" თუ დáƒáƒ§áƒ”ნებულáƒ, ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ები ნáƒáƒ©áƒ•áƒ”ნები áƒáƒ  იქნებáƒ\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" თუ ჩáƒáƒ áƒ—ულიáƒ, შეკუმშვის მეთáƒáƒ“ები ნáƒáƒ©áƒ•áƒ”ნები áƒáƒ  იქნებáƒ\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" ბრძáƒáƒœáƒ”ბების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ áƒáƒšáƒ˜[ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" ბრძáƒáƒœáƒ”ბების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიერთებული მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ სესიის დáƒáƒ¡áƒáƒ›áƒ—áƒáƒ•áƒ áƒ”ბლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒ EOF-ების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლáƒáƒ“ შეცვლილი OID-ის მნიშვნელáƒáƒ‘áƒ\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებრდრSQLSTATE. თუ შეცდáƒáƒ›áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, დáƒáƒ‘რუნდებრცáƒáƒ áƒ˜áƒ”ლი სტრიქáƒáƒœáƒ˜ დრ\"00000\"\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" თუ დáƒáƒ§áƒ”ნებულიáƒ, შეცდáƒáƒ›áƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¡ áƒáƒ  გáƒáƒáƒ©áƒ”რებს (გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრáƒáƒ áƒáƒžáƒ˜áƒ áƒ“áƒáƒžáƒ˜áƒ áƒ˜ შესáƒáƒœáƒáƒ®áƒ˜ წერტილები)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" ბრძáƒáƒœáƒ”ბების პáƒáƒ™áƒ”ტის შესრულების შეწყვეტრპირველივე შეცდáƒáƒ›áƒ˜áƒ¡ შემდეგ\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" პáƒáƒ áƒ¢áƒ˜\n"
+" სერვერის პáƒáƒ áƒ¢áƒ˜ მიმდინáƒáƒ áƒ” შეერთებისთვის\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" psql-ის ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ მითითებáƒ, რáƒáƒªáƒ ბრძáƒáƒœáƒ”ბრწინრხáƒáƒ–იდáƒáƒœ გრძელდებáƒ\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" ჩუმი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი(იგივე, რáƒáƒª პáƒáƒ áƒáƒ›áƒ”ტრი -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ მიერ დáƒáƒ‘რუნებული áƒáƒœ შეცვლილი მწკრივები. áƒáƒœ 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" სერვერის ვერსიáƒ(მáƒáƒ™áƒšáƒ” სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒœ რიცხვით ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" \"true\", თუ ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•áƒœáƒ áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ იყáƒ. áƒáƒ áƒáƒ“რ\"false\"\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" გáƒáƒ áƒ¡áƒ˜áƒ¡ ბáƒáƒšáƒ ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" მხáƒáƒšáƒáƒ“ ბáƒáƒšáƒáƒ¡ მáƒáƒ’იერ კáƒáƒ›áƒ‘ინირებული მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ყველრშედეგის ჩვენებრ(\\;)\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" შეტყáƒáƒ‘ინების კáƒáƒœáƒ¢áƒ”ქსტის ველების ჩვენების კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜[never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" iთუ დáƒáƒ§áƒ”ნებულიáƒ, ხáƒáƒ–ის დáƒáƒ‘áƒáƒšáƒáƒ”ბრSQL-ის ბრძáƒáƒœáƒ”ბáƒáƒ¡áƒáƒª დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ”ბს (იგივე, რáƒáƒª -S პáƒáƒ áƒáƒ›áƒ”ტრი)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" ერთნáƒáƒ‘იჯიáƒáƒœáƒ˜ რეჟიმი. (იგივე, რáƒáƒª -s პáƒáƒ áƒáƒ›áƒ”ტრი)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ SQLSTATE. \"00000\", თუ შეცდáƒáƒ›áƒ áƒáƒ  მáƒáƒ›áƒ®áƒ“áƒáƒ áƒ\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" შეცდáƒáƒ›áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ¨áƒ”ბის დეტáƒáƒšáƒ£áƒ áƒáƒ‘ის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜ [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql-ის ვერსირ(სრული ვერსიáƒ, მáƒáƒ™áƒšáƒ” ვერსირთუ რიცხვითი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"ჩვენების პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=სáƒáƒ®[=მნიშვნ]\n"
+" áƒáƒœ \\pset სáƒáƒ® [მიშნვნ] psql-ში\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" სáƒáƒ–ღვრის სტილი (რიცხვი)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" სáƒáƒ›áƒ˜áƒ–ნის სიგáƒáƒœáƒ” გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ—ვის\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ დáƒáƒ£áƒšáƒáƒ’ების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒáƒ—ვის (ნáƒáƒ’ულისხმები \"%s\")\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœ ბáƒáƒ˜áƒ¢áƒ–ე დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" ცხრილის მინáƒáƒ¬áƒ”რების ჩვენების ჩáƒáƒáƒ áƒ—/გáƒáƒ›áƒáƒ áƒ—[on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრ[unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" სáƒáƒ–ღვრის ხáƒáƒ–ის ხáƒáƒ¢áƒ•áƒ˜áƒ¡ სტილი [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" ნულáƒáƒ•áƒáƒœáƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ მიერ ნáƒáƒ©áƒ•áƒ”ნები სიმბáƒáƒšáƒ\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ციფრის ჯგუფების გáƒáƒ¡áƒáƒ§áƒáƒ¤áƒáƒ“ ენის სპეციფიკური სიმბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" გვერდების გáƒáƒ áƒ” გáƒáƒ“áƒáƒ›áƒ áƒ—ველის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ[yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების(ხáƒáƒ–ების) გáƒáƒ›áƒ§áƒáƒ¤áƒ˜\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœ ბáƒáƒ˜áƒ¢áƒ–ე დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" მიუთითებს HTML ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ table ჭდის áƒáƒ¢áƒ áƒ˜áƒ‘უტებს áƒáƒœ სვეტების პáƒáƒžáƒáƒ áƒªáƒ˜áƒ£áƒš სიგáƒáƒœáƒ”ს\n"
+" მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• სწáƒáƒ áƒ”ბული მáƒáƒœáƒáƒªáƒ”მების ტიპებისთვის latex-longtable ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" ცხრილის სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრშემდგáƒáƒ› დáƒáƒ‘ეჭდილი ცხრილებისთვის\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" თუ დáƒáƒ§áƒ”ნებულიáƒ, ნáƒáƒ©áƒ•áƒ”ნები იქნებრმხáƒáƒšáƒáƒ“ მიმდინáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მები\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" უნიკáƒáƒ“ის ხáƒáƒ–ის დáƒáƒ®áƒáƒ¢áƒ•áƒ˜áƒ¡ სტილი [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ები:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘რ[სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘რ] psql ...\n"
+" áƒáƒœ \\setenv სáƒáƒ®áƒ”ლი[მნიშვნელáƒáƒ‘რ] psql-ის სიგნით\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘áƒ\n"
+" psql ...\n"
+" áƒáƒœ \\setenv სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ] psql-ში\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" გáƒáƒ“áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ სვეტების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" იგივე, რáƒáƒª შეერთების პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" იგივე, რáƒáƒª შეერთების dbname პáƒáƒ áƒáƒ›áƒ”ტრი\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" იგივე, რáƒáƒª ჰáƒáƒ¡áƒ¢áƒ˜ შეერთების პáƒáƒ áƒáƒ›áƒ”ტრებში\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" პáƒáƒ áƒáƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" შეერთების პáƒáƒ áƒáƒšáƒ˜ (რეკáƒáƒ›áƒ”ნდებული áƒáƒ áƒáƒ)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" იგივე, რáƒáƒª პáƒáƒ áƒ¢áƒ˜ შეერთების პáƒáƒ áƒáƒ›áƒ”ტრებში\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" იგივე, რáƒáƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი შეერთების პáƒáƒ áƒáƒ›áƒ”ტრებში\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, დრ\\ev ბრძáƒáƒœáƒ”ბის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბისáƒáƒ¡ ხáƒáƒ–ის ნáƒáƒ›áƒ áƒ˜áƒ¡ მითითების ხერხი\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" ბრძáƒáƒœáƒ”ბების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" \\watch-ისთვის გáƒáƒ›áƒáƒ§áƒ”ნებული გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის .psqlrc ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! ბრძáƒáƒœáƒ”ბის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული გáƒáƒ áƒ¡áƒ˜\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"ბრძáƒáƒœáƒ”ბáƒ: %s\n"
+"áƒáƒ¦áƒ¬áƒ”რáƒ: %s\n"
+"სინტáƒáƒ¥áƒ¡áƒ˜:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\"-ისთვის დáƒáƒ®áƒ›áƒáƒ áƒ”ბრმიუწვდáƒáƒ›áƒ”ლიáƒ.\n"
+"ხელმისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜ დáƒáƒ®áƒ›áƒáƒ áƒ”ბის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“ სცáƒáƒ“ეთ \\h .\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შენáƒáƒ®áƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ ისტáƒáƒ áƒ˜áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: -დáƒáƒœ გáƒáƒ›áƒáƒ¡áƒ•áƒšáƒ"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "%s-დáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"\\q\".\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"შეყვáƒáƒœáƒ˜áƒšáƒ˜áƒ PostgreSQL-ის სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ\n"
+"გáƒáƒ›áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ული ბáƒáƒ–ის áƒáƒ¦áƒ¡áƒáƒ“გენáƒáƒ“ CLI-ის ბრძáƒáƒœáƒ”ბრpg_restore გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ .\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\? áƒáƒœ დáƒáƒáƒ¬áƒ”ქით Control-C-ს შეყვáƒáƒœáƒ˜áƒ¡ ბáƒáƒ¤áƒ”რის გáƒáƒ¡áƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბლáƒáƒ“."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\?."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "იყენებთ psql-ს, PostgreSQL-ის ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ ინტერფეისს."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ: \\copyright გáƒáƒ•áƒ áƒªáƒ”ლების წესებისთვის\n"
+" \\h SQL-ის ბრძáƒáƒœáƒ”ბების შესáƒáƒ®áƒ”ბ დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის\n"
+" \\? psql-ის ბრძáƒáƒœáƒ”ბების შესáƒáƒ®áƒ”ბ დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის\n"
+" \\g áƒáƒœ დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ”თ წერტილმძიმით, მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შესáƒáƒ¡áƒ áƒ£áƒšáƒ”ბლáƒáƒ“\n"
+" \\q გáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\q."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ Control-D."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "გáƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ Control-C."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ; მიმდინáƒáƒ áƒ” \\if ბლáƒáƒ™áƒ˜áƒ“áƒáƒœ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ•áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\endif áƒáƒœ Ctrl-C"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "მიღწეულირEOF დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•áƒ˜ \\endif-ების პáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ áƒ”შე"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ ციტáƒáƒ¢áƒ˜áƒ¡ დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი სტრიქáƒáƒœáƒ˜"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლმáƒáƒ¬áƒ”რáƒ"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_მფლáƒáƒ‘ელი"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_სქემáƒ"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "სáƒáƒ“áƒáƒª aggregate_signature áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "áƒáƒ áƒ’რეჟიმი"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "áƒáƒ áƒ’სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "áƒáƒ áƒ’ტიპი"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "მáƒáƒ áƒ’ებáƒ"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "სáƒáƒ“áƒáƒª option შეიძლებრიყáƒáƒ¡:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "შეერთ_ნებáƒáƒ áƒ—ვ"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "შეერთ_ლიმიტი"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜áƒ"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "ცხრილების_áƒáƒ®áƒáƒšáƒ˜_სივრცე"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე_რáƒáƒšáƒ˜"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "სქემის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "შეთáƒáƒ•áƒáƒ–ებáƒ_GRANT_áƒáƒœ_REVOKE"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "სáƒáƒ“áƒáƒª abbreviated_grant_or_revoke ერთ-ერთირსიიდáƒáƒœ:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "რáƒáƒšáƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "გáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "დáƒáƒ›áƒ”ნის_შეზღუდვáƒ"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "შეზღუდვის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_შეზღუდვის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "წევრი_áƒáƒ‘იექტი"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "სáƒáƒ“áƒáƒª member_object áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "áƒáƒ‘იექტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "წყáƒáƒ áƒáƒ¡_ტიპი"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნის_ტიპი"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "ფუნქციის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "მáƒáƒ áƒ¯áƒ•áƒ”ნრტიპი"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "სწáƒáƒ áƒ˜_ტიპი"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "ინდექსის_მეთáƒáƒ“ი"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "პრáƒáƒªáƒ”დურის სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "ტიპის სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "ენის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "დრáƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜_ხელმáƒáƒ¬áƒ”რრáƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი_ფუნქციáƒ"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "შემმáƒáƒ¬áƒ›áƒ”ბელი_ფუნქციáƒ"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "ქმედებáƒ"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "სვეტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_სვეტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "დრრáƒáƒªáƒ ქმედებრáƒáƒ áƒ˜áƒ¡ ერთერთი სიიდáƒáƒœ:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების_ტიპი"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "სვეტის_შეზღუდვáƒ"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "მთელი რიცხვი"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტის პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "ცხრილის_შეზღუდვები"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "ტრიგერის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "მშáƒáƒ‘ელი_ცხრილი"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბის_ფáƒáƒ¡áƒ˜"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "მწკრივები_შედეგში"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”_ფუნქციáƒ"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "რáƒáƒšáƒ˜áƒ¡_შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "სáƒáƒ“áƒáƒª რáƒáƒšáƒ˜áƒ¡_სპეციფიკáƒáƒªáƒ˜áƒ შეიძლებრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "ჯგუფის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "ცხრილების_სივრცის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "ინდექსის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "სáƒáƒªáƒáƒ•áƒ˜áƒ¡_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "სვეტის_ნáƒáƒ›áƒ”რი"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "დიდი_áƒáƒ‘იექტის_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "შეკუმშვის_მეთáƒáƒ“ი"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡_áƒáƒ®áƒáƒšáƒ˜_მეთáƒáƒ“ი"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "შეზღუდვის_პრáƒáƒªáƒ”დურáƒ"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "შეერთების_პრáƒáƒªáƒ”დურáƒ"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "სტრáƒáƒ¢áƒ”გიის_ნáƒáƒ›áƒ”რი"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "áƒáƒž_ტიპი"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "დáƒáƒšáƒáƒ’ების_áƒáƒ¯áƒáƒ®áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”_რიცხვი"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "áƒáƒ áƒ’უმენტის_ტიპი"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "ცხრილის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნების_გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის_შემáƒáƒ¬áƒ›áƒ”ბáƒ"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მის_áƒáƒ‘იექტი"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მის_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "სáƒáƒ“áƒáƒª პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡_áƒáƒ‘იექტი ერთერთირსიიდáƒáƒœ:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "პáƒáƒ áƒáƒšáƒ˜"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "ბáƒáƒ–ის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "გáƒáƒ–რდáƒ"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "მინ_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "მáƒáƒ¥áƒ¡_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "დáƒáƒ¬áƒ§áƒ”ბáƒ"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "გáƒáƒ“áƒáƒ¢áƒ•áƒ áƒ—ვáƒ"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "კეში"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_სáƒáƒ›áƒ˜áƒ–ნე"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "შეერთ_ინფáƒ"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მის_მáƒáƒ áƒ’ებáƒ"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბის_პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის_გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ–ღვრის_მითითებáƒ"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "მიმდევრáƒáƒ‘ის_პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "მიმდევრáƒáƒ‘ის_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "ცხრილის_შეზღუდვáƒ_ინდექსით"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "გáƒáƒ“áƒáƒ¬áƒ”რის_წესის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "დრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ–ღვáƒáƒ áƒ˜áƒ¡_სპეციფიკáƒáƒªáƒ˜áƒ áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ–ღვრის_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "რიცხვითი_მუდმივáƒ"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "დრსვეტის_შეზღუდვრáƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "ნáƒáƒ’ულისხმები_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "გენერირებული_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "ინდექსის_პáƒáƒ áƒáƒ›áƒ”ტრები"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "მიბმების_ცხრილი"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "მიბმული_სვეტი"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "მიბმის_ქმედებები"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "დრtable_constraint áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "ელემენტის_áƒáƒ›áƒáƒ¦áƒ”ბáƒ"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "პრედიკáƒáƒ¢áƒ˜"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "დრtable_constraint_using_index áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "ინდექსის_პáƒáƒ áƒáƒ›áƒ”ტრები UNIQUE, PRIMARY KEY დრEXCLUDE შეზღუდვებში:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "ელემენტის_áƒáƒ›áƒáƒ¦áƒ”ბრEXCLUDE შეზღუდვáƒáƒ¨áƒ˜ წáƒáƒ áƒ›áƒáƒáƒ“გენს:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢_კლáƒáƒ¡áƒ˜"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "მიბმის ქმედებრFOREIGN KEY/REFERENCES შეზღუდვáƒáƒ¨áƒ˜ წáƒáƒ áƒ›áƒáƒáƒ“გენს:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "ცხრილების_სივრცის_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "კáƒáƒ“ის_ტიპი"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "ლექსიკáƒáƒœáƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "ძველი_ლექსიკáƒáƒœáƒ˜"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_ლექსიკáƒáƒœáƒ˜"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_áƒáƒ¢áƒ áƒ˜áƒ‘უტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "áƒáƒ—ვლის_áƒáƒ®áƒáƒšáƒ˜_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "მეზáƒáƒ‘ლáƒáƒ“_áƒáƒ—ვლის_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•áƒ˜áƒ¡_áƒáƒ áƒ¡áƒ”ბული_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "თვისებáƒ"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "სერვერის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "ხედის_პáƒáƒ áƒáƒ›áƒ”ტრის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "ხედის_პáƒáƒ áƒáƒ›áƒ”ტრის_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "ცხრილი_დრსვეტები"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "სáƒáƒ“áƒáƒª option შეიძლებრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "ლáƒáƒ’იკური"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "ზáƒáƒ›áƒ"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "დრtable_and_columns áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡_რეჟიმი"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "სáƒáƒ“áƒáƒª transaction_mode შეიძლებრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "áƒáƒ áƒ’იმენტი"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "ურთიერთáƒáƒ‘ის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "დáƒáƒ›áƒ”ნის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "წესის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "წესის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "სტრიქáƒáƒœáƒ˜_მუდმივáƒ"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡_id"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "ბრძáƒáƒœáƒ”ბáƒ"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "გáƒáƒ›áƒ§áƒáƒ¤áƒ˜_სიმბáƒáƒšáƒ"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜_სტრიქáƒáƒœáƒ˜"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "default_string"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "ციტáƒáƒ¢áƒ˜áƒ¡_სიმბáƒáƒšáƒ"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜_სიმბáƒáƒšáƒ"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "კáƒáƒ“ირების-სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡_მეთáƒáƒ“ის_ტიპი"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "áƒáƒ áƒ’_მáƒáƒœáƒáƒª_ტიპი"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის_ფუნქციáƒ"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის_მáƒáƒœáƒáƒªáƒ”მების_ტიპი"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის_მáƒáƒœáƒáƒªáƒ”მების_ზáƒáƒ›áƒ"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის ფუნქციáƒ"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "კáƒáƒ›áƒ‘ინ_ფუნქც"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "დესერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "დესერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡_ფუნქც"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜_მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "გáƒáƒ“áƒáƒáƒ“გ_მდგáƒáƒ›_ფუნქციáƒ"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "გáƒáƒ“áƒáƒáƒ“გ_მინ_მნიშვნ_ფუნქციáƒ"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "გáƒáƒ“áƒáƒáƒ“გ_მáƒáƒœáƒáƒª_ტიპი"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "გáƒáƒ“áƒáƒáƒ“გ_მáƒáƒœáƒáƒª_ზáƒáƒ›"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "გáƒáƒ“áƒáƒ“გ_დáƒáƒ¡áƒ áƒ£áƒš_ფუნქციáƒ"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "გáƒáƒ“áƒáƒáƒ“გ­_დáƒáƒ¡áƒáƒ¬áƒ§_ფუნქციáƒ"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "დáƒáƒšáƒáƒ’ების_áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "áƒáƒœ ძველი სინტáƒáƒ¥áƒ¡áƒ˜"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "სáƒáƒ‘áƒáƒ–ისáƒ_ტიპი"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "ენáƒ"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "მáƒáƒ›áƒ¬áƒáƒ“ებელი"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "წესები"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "ვერსიáƒ"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "áƒáƒ áƒ¡áƒ”ბული_კáƒáƒšáƒáƒªáƒ˜áƒ"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "წყáƒáƒ áƒáƒ¡_კáƒáƒ“ირებáƒ"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე_კáƒáƒ“ირებáƒ"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "კáƒáƒ“ირებáƒ"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "სტრáƒáƒ¢áƒ”გიáƒ"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "icu_ენáƒ"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "icu_rules"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "ენის_მáƒáƒ›áƒ¬áƒáƒ“ებელი"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსიáƒ"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "შეზღუდვáƒ"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "სáƒáƒ“áƒáƒª constraint áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "მáƒáƒ•áƒšáƒ”ნáƒ"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "ფილტრის_ცვლáƒáƒ“ი"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "ფილტრის_მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "სáƒáƒ“áƒáƒª column_constraint áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "დáƒáƒ‘რუნების_ტიპი"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "სვეტის_ტიპი"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "áƒáƒ‘იექტის_ფáƒáƒ˜áƒšáƒ˜"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "სიმბáƒáƒšáƒáƒ¡_მიბმáƒ"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "sql_ის_სხეული"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "მეთáƒáƒ“ი"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢_კლáƒáƒ¡áƒ˜áƒ¡_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის_დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "ჩáƒáƒ“გმული_კáƒáƒ“ის_დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბელი"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "მნიშვნფუნქციáƒ"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "კáƒáƒ›áƒ£áƒ¢_áƒáƒžáƒ”რ"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "უáƒáƒ áƒ§_áƒáƒžáƒ”რáƒáƒ¢"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "áƒáƒ¯áƒáƒ®áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "სáƒáƒªáƒáƒ•áƒ˜áƒ¡_ტიპი"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "სáƒáƒ“áƒáƒª event შეიძლებრიყáƒáƒ¡ ერთ-ერთი:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "სქემის_ელემენტი"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "სერვერის_ტიპი"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "სერვერის_ვერსიáƒ"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "fdw_name"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡_ტიპი"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "წყáƒáƒ áƒáƒ¡_ცხრილი"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "მსგáƒáƒ•áƒ¡áƒ”ბის_პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "დრlike_option áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "წყáƒáƒ áƒáƒ¡_კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბის_ფუნქციáƒ"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "კáƒáƒ“ის_მიღების_ფუნქციáƒ"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის ფუნქციáƒ"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "ლექს_ტიპების_ფუნქციáƒ"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "headline_function"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "ლექსით_გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "sql_ფუნქციის_სáƒáƒ®áƒ”ლიდáƒáƒœ"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "ფუნქციის_სáƒáƒ®áƒ”ლი_sql_ში"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "მიბმული_ცხრილის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜_ურთიერთáƒáƒ‘ის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "áƒáƒ áƒ’უმენტები"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "ჭდე"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "ქვეტიპი"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "ქვეტიპის_áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡_კლáƒáƒ¡áƒ˜"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "კáƒáƒœáƒáƒœáƒ˜áƒ™áƒ£áƒ áƒ˜_ფუნქციáƒ"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "ქვეტიპის_სხვáƒáƒáƒ‘ის_ფუნქციáƒ"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜_ტიპის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "შეყვáƒáƒœáƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "მიღების_ფუნქციáƒ"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜_მნიშვნელáƒáƒ‘ის_ფუნქციáƒ"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "ტიპის_მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡_შემყვáƒáƒœáƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "ტიპის_მáƒáƒ¢áƒ˜áƒ¤áƒ˜áƒ™áƒáƒ¢áƒáƒ áƒ˜áƒ¡_გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡_ფუნქციáƒ"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "ფუნქციის_áƒáƒœáƒáƒšáƒ˜áƒ–ი"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "ინდექსით_მიმáƒáƒ áƒ—ვის_ფუნქციáƒ"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "შიდáƒáƒ¡áƒ˜áƒ’რძე"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "სწáƒáƒ áƒ”ბáƒ"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "სáƒáƒªáƒáƒ•áƒ˜"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "მსგáƒáƒ•áƒ¡áƒ”ბის_ტიპი"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "რჩეული"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "ნáƒáƒ’ულისხმები"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "ელემენტი"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "გáƒáƒ›áƒ§áƒáƒ¤áƒ˜"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "დáƒáƒšáƒáƒ’ებáƒáƒ“ი"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ—"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "მეტსáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რიდáƒáƒœ"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "კურსáƒáƒ áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "კáƒáƒ“ი"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "Პáƒáƒ áƒáƒ›áƒ”ტრი"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "მიმáƒáƒ áƒ—ულებáƒ"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "სáƒáƒ“áƒáƒª მიმáƒáƒ áƒ—ულებრშეიძლებრიყáƒáƒ¡ ერთ-ერთი:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "რáƒáƒáƒ“ენáƒáƒ‘áƒ"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "მიმდევრáƒáƒ‘ის _სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "áƒáƒ áƒ’_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "áƒáƒ áƒ’_ტიპი"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული_სქემáƒ"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜_სქემáƒ"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡_áƒáƒ‘იექტი"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "ქმედებáƒ_კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡_დრáƒáƒ¡"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "სáƒáƒ“áƒáƒª conflict_target შეიძლებრიყáƒáƒ¡ სიიდáƒáƒœ:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "ინდექსის_სვეტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის_ინდექსი"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "ინდექსის_პრედიკáƒáƒ¢áƒ˜"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "დრconflict_action შეიძლებრიყáƒáƒ¡ სიიდáƒáƒœ:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "ქვე-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "áƒáƒ áƒ®áƒ˜"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "ბლáƒáƒ™áƒ˜áƒ¡_რეჟიმი"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "სáƒáƒ“áƒáƒª lockmode ერთერთირსიიდáƒáƒœ:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე ცხრილის სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე_მეტსáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების_წყáƒáƒ áƒ"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "შეერთების პირáƒáƒ‘áƒ"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "პირáƒáƒ‘áƒ_რáƒáƒ“ის"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "სáƒáƒ“áƒáƒª data_source áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "წყáƒáƒ áƒáƒ¡_ცხრილის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "წყáƒáƒ áƒáƒ¡_მáƒáƒ—ხáƒáƒ•áƒœáƒ"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "წყáƒáƒ áƒáƒ¡_მეტსáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "დრwhen_clause áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბის_შერწყმáƒ"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "წáƒáƒ¨áƒšáƒ˜áƒ¡_შერწყმáƒ"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "ჩáƒáƒ¡áƒ›áƒ˜áƒ¡_შერწყმáƒ"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "დრmerge_insert áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "დრmerge_update áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "დრmerge_delete áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "შემცველáƒáƒ‘áƒ"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "ძველი_რáƒáƒšáƒ˜"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_რáƒáƒšáƒ˜"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "შენáƒáƒ®áƒ•áƒ˜áƒ¡_წერტილის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "დáƒáƒ¯áƒ’უფების_ელემენტი"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡_áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "áƒáƒ áƒ©áƒ”ვáƒ"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "სáƒáƒ“áƒáƒª from_item შეიძლებრიყáƒáƒ¡ სიიდáƒáƒœ ერთი:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "სვეტის_მეტსáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "სემპლინგის_მეთáƒáƒ“ი"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡_სáƒáƒ®áƒ”ლით"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "სვეტის_áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "შეერთების_ტიპი"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "სვეტების შეერთებáƒ"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "მეტსáƒáƒ®áƒ”ლით_შეერთბáƒ"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "დრgrouping_element შეძლებრიყáƒáƒ¡ სიიდáƒáƒœ ერთი:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "დრwith_query áƒáƒ áƒ˜áƒ¡:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "მნიშვნელáƒáƒ‘ები"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "ჩáƒáƒ¡áƒ›áƒ"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "ბáƒáƒšáƒ_ძებნის_სვეტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "ციკლის_ნიშნიáƒáƒœáƒ˜_სვეტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "ციკლის ნიშნის მნიშვნელáƒáƒ‘áƒ"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "ციკლის_ნáƒáƒ’ულისხმები_ნიშáƒáƒœáƒ˜"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "ციკლის_ბილიკის_სვეტის_სáƒáƒ®áƒ”ლი"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "áƒáƒ®áƒáƒšáƒ˜_ცხრილის"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "სწრáƒáƒ¤áƒ˜_áƒáƒ¡áƒšáƒ˜áƒ¡_id"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "დáƒáƒšáƒáƒ’ების_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის áƒáƒ¦áƒ¬áƒ”რის შექმნáƒ"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის შეცვლáƒ"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ ნáƒáƒ’ულისხმები უფლებების áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "დáƒáƒ›áƒ”ნის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "დáƒáƒ›áƒ”ნის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "გáƒáƒ áƒ” ცხრილის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "ფუნქციის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის áƒáƒœ წევრáƒáƒ‘ის შეცვლáƒ"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "ინდექსის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "პრáƒáƒªáƒ”დურული ენის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "დიდი áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "მწკრივის-დáƒáƒœáƒ˜áƒ¡-უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესების áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "პრáƒáƒªáƒ”დურის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ შეცვლáƒ"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "წესის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "სქემის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "მიმდევრáƒáƒ‘ის გენერáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "გáƒáƒ áƒ” სერვერის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "სერვერის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის შეცვლáƒ"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "ცხრილის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "ცხრილების სივრცის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლის áƒáƒ¦áƒ¬áƒ”რს შეცვლáƒ"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "ტრიგერის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "ტიპის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის მიბმის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "ხედის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მáƒáƒ’რáƒáƒ•áƒ”ბáƒ"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბáƒ"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "პრáƒáƒªáƒ”დურის ჩáƒáƒ¬áƒáƒ“ებáƒ"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ ჟურნáƒáƒšáƒ¨áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის დáƒáƒ¡áƒ›áƒ"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "კურსáƒáƒ áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "ცხრილის გáƒáƒ“áƒáƒ¯áƒ’უფებრინდექსის მიხედვით"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "áƒáƒ‘იექტის კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რრáƒáƒœ შეცვლáƒ"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მáƒ"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ  áƒáƒ  ფáƒáƒ–áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მáƒ"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების კáƒáƒžáƒ˜áƒ áƒ”ბრფáƒáƒ˜áƒšáƒ¡áƒ დრცხრილს შáƒáƒ áƒ˜áƒ¡"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ მეთáƒáƒ“ის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "კáƒáƒ“ირების áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის შექმნáƒ"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ დáƒáƒ›áƒ”ნის შექმნáƒ"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "მáƒáƒ•áƒšáƒ”ნის áƒáƒ®áƒáƒšáƒ˜ ტრიგერის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის დáƒáƒ§áƒ”ნებáƒ"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ áƒ” ცხრილის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ ფუნქციის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ ინდექსის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒªáƒ”დურული ენის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "ცხრილისთვის áƒáƒ®áƒáƒšáƒ˜ მწკრივის-დáƒáƒœáƒ˜áƒ¡-უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒªáƒ”დურის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ›áƒáƒªáƒ”მის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ“áƒáƒ¬áƒ”რის წესის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ სქემის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "მიმდევრáƒáƒ‘ის áƒáƒ®áƒáƒšáƒ˜ გენერáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ áƒ” სერვერის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ›áƒáƒ¬áƒ”რის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ ცხრილის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შედეგებიდáƒáƒœ áƒáƒ®áƒáƒšáƒ˜ ცხრილის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "ცხრილების áƒáƒ®áƒáƒšáƒ˜ სივრცის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒšáƒ˜ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒš ლექსიკáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒšáƒ˜ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒšáƒ˜ შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ ტრიგერის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების áƒáƒ®áƒáƒšáƒ˜ ტიპის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ” სერვერთáƒáƒœ áƒáƒ®áƒáƒšáƒ˜ ბმის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ ხედის áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ—áƒáƒ•áƒ˜áƒ¡áƒ£áƒ¤áƒšáƒ”ბáƒ"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "კურსáƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "ცხრილში მწკრივების წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "სესიის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მáƒáƒ¨áƒáƒ áƒ”ბáƒ"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "კáƒáƒ“ის áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡ შესრულებáƒ"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "კáƒáƒ¡áƒ¢áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "დáƒáƒ›áƒ”ნის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "მáƒáƒ•áƒšáƒ”ნის ტრიგერის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "გáƒáƒ áƒ” ცხრილის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "ფუნქციის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "ინდექსის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "პრáƒáƒªáƒ”დურული ენის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ ბáƒáƒ–ის áƒáƒ‘იექტების წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "ცხრილიდáƒáƒœ მწკრივის-დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "პრáƒáƒªáƒ”დურის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "გáƒáƒ›áƒáƒªáƒ”მის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "წესრიგის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "გáƒáƒ“áƒáƒ¬áƒ”რის წესის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "სქემის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "მიმდევრáƒáƒ‘ის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "გáƒáƒ áƒ” სერვერის დესკრიპტáƒáƒ áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "ცხრილის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "ცხრილების სივრცის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბლის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "ტრიგერის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ” სერვერისთვის მიბმის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "ხედის წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "მზრáƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შესრულებáƒ"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შესრულების გეგმის ჩვენებáƒ"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "კურსáƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ“áƒáƒœ მწკრივების მიღებáƒ"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ უფლებების áƒáƒ¦áƒ¬áƒ”რáƒ"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "ცხრილის áƒáƒ¦áƒ¬áƒ”რების უცხრსერვერიდáƒáƒœ შემáƒáƒ¢áƒáƒœáƒ"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "ცხრილში áƒáƒ®áƒáƒšáƒ˜ მწკრივების შექმნáƒ"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "შეტყáƒáƒ‘ინების მáƒáƒšáƒáƒ“ინი"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული ბიბლიáƒáƒ—ეკის ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "ცხრილის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "ცხრილის მწკრივების ჩáƒáƒ¡áƒ›áƒ, გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒœ წáƒáƒ¨áƒšáƒ პირáƒáƒ‘ის მიხედვით"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "კურსáƒáƒ áƒ˜áƒ¡ მáƒáƒ—áƒáƒ•áƒ¡áƒ”ბáƒ"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "შეტყáƒáƒ‘ინების გენერáƒáƒªáƒ˜áƒ"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებáƒ"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ–áƒáƒ“ებრáƒáƒ  ფáƒáƒ–áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მáƒáƒ“"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "ბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ ბáƒáƒ–ის áƒáƒ‘იექტების მფლáƒáƒ‘ელის შეცვლáƒ"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის შემცველáƒáƒ‘ის ჩáƒáƒœáƒáƒªáƒ•áƒšáƒ”ბáƒ"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "ინდექსების თáƒáƒ•áƒ˜áƒ“áƒáƒœ áƒáƒ’ებáƒ"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "áƒáƒ“რე áƒáƒ¦áƒ¬áƒ”რილი შენáƒáƒ®áƒ•áƒ˜áƒ¡ წერტილის მáƒáƒ®áƒ¡áƒœáƒ"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ის სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე áƒáƒ¦áƒ“გენáƒ"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "წვდáƒáƒ›áƒ˜áƒ¡ უფლებების წáƒáƒ¨áƒšáƒ"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "წინáƒáƒ¡áƒ¬áƒáƒ  áƒáƒ  ფáƒáƒ–áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "შენáƒáƒ®áƒ•áƒ˜áƒ¡ წერტილზე დáƒáƒ‘რუნებáƒ"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ შესáƒáƒœáƒáƒ®áƒ˜ წერტილის áƒáƒ¦áƒ¬áƒ”რრმიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "áƒáƒ‘იექტზე გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბული უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდის áƒáƒ¦áƒ¬áƒ”რრáƒáƒœ შეცვლáƒ"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "მწკრივის მიღებრცხრილიდáƒáƒœ áƒáƒœ ხედიდáƒáƒœ"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრის შეცვლáƒ"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბის დრáƒáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "მიმდინáƒáƒ áƒ” სესიის მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ დრმიმდინáƒáƒ áƒ” სესიის მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ თვისებების დáƒáƒ§áƒ”ნებáƒ"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "გáƒáƒ¨áƒ•áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ის ჩვენებáƒ"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "ცხრილის áƒáƒœ ცხრილების სეტის დáƒáƒªáƒáƒ áƒ˜áƒ”ლებáƒ"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "გáƒáƒ¤áƒ áƒ—ხილებების მáƒáƒ¡áƒ›áƒ”ნის შეწყვეტáƒ"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "ცხრილის მწკრივების გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "ნáƒáƒ’ვის-მáƒáƒ’რáƒáƒ•áƒ”ბრდრბáƒáƒ–ის áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულრáƒáƒœáƒáƒšáƒ˜áƒ–ი"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "მწკრივების სეტის გáƒáƒ›áƒáƒ—ვლáƒ"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 მხáƒáƒšáƒáƒ“ áƒáƒ áƒáƒ˜áƒœáƒ¢áƒ”რáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ  რეჟიმში შეიძლებრიყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ \"help\".\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბითი áƒáƒ áƒ’უმენტი \"%s\" იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•áƒ”ბი ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•áƒœáƒ შეუძლებელიáƒ"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"ჩáƒáƒœáƒáƒ áƒ—ის დáƒáƒ‘რუნების მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s\n"
+"მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ ტექსტი:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "მნიშვნელáƒáƒ‘რ\"%s\" \"%s\"-სთვის მიუღებელიáƒ: ველáƒáƒ“ებáƒáƒ“ი ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" \"%s\"-სთვის (უნდრიყáƒáƒ¡ მთელი რიცხვი)"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ცვლáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒáƒ \"%s\"-სთვის\n"
+"შესáƒáƒ«áƒšáƒ მნიშვნელáƒáƒ‘ებიáƒ: %s."
+
+#, c-format
+#~ msgid "Expanded header width is 'column'.\n"
+#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•áƒ¡áƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'column'.\n"
+
+#, c-format
+#~ msgid "Expanded header width is 'full'.\n"
+#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•áƒ¡áƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'full'.\n"
+
+#, c-format
+#~ msgid "Expanded header width is 'page'.\n"
+#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•áƒ¡áƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'page'.\n"
+
+#~ msgid "Source code"
+#~ msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კáƒáƒ“ი"
+
+#~ msgid "User set"
+#~ msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი დáƒáƒ§áƒ”ნებულიáƒ"
+
+#, c-format
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch -ს COPY-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ§áƒ”ნებთ"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m"
+
+#~ msgid "text"
+#~ msgstr "ტექსტი"
+
+#~ msgid "timezone"
+#~ msgstr "დრáƒáƒ˜áƒ¡_სáƒáƒ áƒ¢áƒ§áƒ”ლი"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "სáƒáƒ“áƒáƒª direction შეიძლებრიყáƒáƒ¡ ცáƒáƒ áƒ˜áƒ”ლი, áƒáƒœ ერთ-ერთი სიიდáƒáƒœ::"
diff --git a/src/bin/psql/po/ko.po b/src/bin/psql/po/ko.po
new file mode 100644
index 0000000..4f3c2db
--- /dev/null
+++ b/src/bin/psql/po/ko.po
@@ -0,0 +1,6693 @@
+# Korean message translation file for psql
+# Ioseph Kim. <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:48+0000\n"
+"PO-Revision-Date: 2023-07-20 15:50+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼: %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "실행할 \"%s\" íŒŒì¼ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 실패: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(내부 오류)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "UID %ld 해당하는 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "ì‚¬ìš©ìž ì—†ìŒ"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류번호 %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "명령어를 ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "하위 프로세스가 %d 코드로 종료했ìŒ"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "0x%X ì˜ˆì™¸ì²˜ë¦¬ì— ì˜í•´ 하위 프로세스가 종료ë˜ì—ˆìŒ"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "하위 프로세스가 %d 신호를 받고 종료ë˜ì—ˆìŒ: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "하위 프로세스가 ì•Œ 수 없는 ìƒíƒœ(%d)ë¡œ 종료ë˜ì—ˆìŒ"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "취소 요청 보냄\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "취소 요청 보내기 실패: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu개 행)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "ì¸íŠ¸ëŸ½íŠ¸ë°œìƒ\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "í…Œì´ë¸” ë‚´ìš©ì— í—¤ë”를 추가할 수 ì—†ìŒ: ì—´ 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "í…Œì´ë¸” ë‚´ìš©ì— ì…€ì„ ì¶”ê°€í•  수 ì—†ìŒ: ì´ ì…€ 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ìž˜ëª»ëœ ì¶œë ¥ í˜•ì‹ (내부 오류): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "\"%s\" ë³€ìˆ˜ì˜ ìž¬ê·€ì  í™•ìž¥ì„ ê±´ë„ˆë›°ëŠ” 중"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "UID %d 해당하는 로컬 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "ID %d 로컬 ì‚¬ìš©ìž ì—†ìŒ"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "ìž˜ëª»ëœ ëª…ë ¹: \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "ë„움ë§ì„ 보려면 \\?를 입력하십시오."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: \"%s\" 추가 ì¸ìžê°€ 무시ë˜ì—ˆìŒ"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"\\%s ëª…ë ¹ì€ ë¬´ì‹œí•¨; 현재 \\if 블ë¡ì„ 중지하려면, \\endif 명령ì´ë‚˜ Ctrl-C 키"
+"를 사용하세요."
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "UID %ld 사용ìžì˜ 홈 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: \"%s\" 디렉터리로 ì´ë™í•  수 ì—†ìŒ: %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°ë˜ì–´ìžˆì§€ 않습니다.\n"
+
+#: command.c:664
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 주소=\"%s\", í¬íŠ¸=\"%s\".\n"
+
+#: command.c:667
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 소켓=\"%s\", í¬íŠ¸=\"%s\".\n"
+
+#: command.c:673
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address "
+"\"%s\") at port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\" (주소=\"%s\"), í¬"
+"트=\"%s\".\n"
+
+#: command.c:676
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port "
+"\"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\", í¬íŠ¸=\"%s\".\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "쿼리 버í¼ê°€ ì—†ìŒ"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ìž˜ëª»ëœ ì¤„ 번호: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "변경 ë‚´ìš© ì—†ìŒ"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: ìž˜ëª»ëœ ì¸ì½”딩 ì´ë¦„ ë˜ëŠ” 문ìžì…‹ 변환 프로시저 ì—†ìŒ"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "ì´ì „ 오류가 없습니다."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: 오른쪽 괄호 ë¹ ì¡ŒìŒ"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: 필요한 ì¸ìžê°€ ë¹ ì¡ŒìŒ"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: \\else 구문 ë’¤ì— ì˜¬ 수 ì—†ìŒ"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: \\if 명령과 ì§ì´ 안맞ìŒ"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: \\else 명령 ë’¤ì— ì˜¬ 수 ì—†ìŒ"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: \\if 명령과 ì§ì´ 안맞ìŒ"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: \\if 명령과 ì§ì´ 안맞ìŒ"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "쿼리 버í¼ê°€ 비었ìŒ."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "\"%s\" 사용ìžì˜ 새 암호: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "다시 입력해 주세요:"
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "암호가 서로 틀립니다."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: 변수 ê°’ì„ ì½ì„ 수 ì—†ìŒ"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "쿼리 ë²„í¼ ì´ˆê¸°í™” (비웠ìŒ)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "명령내역(history)ì„ \"%s\" 파ì¼ì— 기ë¡í–ˆìŠµë‹ˆë‹¤.\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: OS 환경 변수 ì´ë¦„ì—는 \"=\" 문ìžê°€ 없어야 함"
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "함수 ì´ë¦„ì´ í•„ìš”í•¨"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "ë·° ì´ë¦„ì´ í•„ìš”í•¨"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "작업수행시간 보임"
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "작업수행시간 숨김"
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: 반복 간격 ê°’ì€ í•˜ë‚˜ë§Œ 지정해야 합니다"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: ìž˜ëª»ëœ ë°˜ë³µ 간격 ê°’ \"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: 최대 반복 회수는 하나만 지정해야 합니다"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: ìž˜ëª»ëœ ìµœëŒ€ 반복 회수 \"%s\""
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: 알수 없는 매개 변수 \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "암호: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "%s 사용ìžì˜ 암호: "
+
+#: command.c:3297
+#, c-format
+msgid ""
+"Do not give user, host, or port separately when using a connection string"
+msgstr ""
+"ì—°ê²° 문ìžì—´ì„ 사용할 때는 user, host, port 를 ë”°ë¡œ ë”°ë¡œ 지정하지 마세요."
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "재접ì†í•  ë°ì´í„°ë² ì´ìŠ¤ ì—°ê²° ì •ë³´ê°€ ì—†ìŒ"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "ì´ì „ ì—°ê²°ì´ ìœ ì§€ë˜ì—ˆìŒ"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\ì—°ê²°: %s"
+
+#: command.c:3700
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 주소=\"%s\", í¬íŠ¸=\"%s\".\n"
+
+#: command.c:3703
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" "
+"at port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 소켓=\"%s\", í¬íŠ¸=\"%s\".\n"
+
+#: command.c:3709
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s"
+"\" (address \"%s\") at port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\" (주소 \"%s\"), í¬"
+"트=\"%s\".\n"
+
+#: command.c:3712
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\", í¬íŠ¸=\"%s\".\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìŠ¤=\"%s\", 사용ìž=\"%s\".\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s(%s, %s 서버)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"경고: %s ë©”ì´ì € 버전 %s, 서버 ë©”ì´ì € 버전 %s.\n"
+" ì¼ë¶€ psql ê¸°ëŠ¥ì´ ìž‘ë™í•˜ì§€ ì•Šì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL 연결정보 (프로토콜: %s, 암호화기법: %s, 압축: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "알수없ìŒ"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "off"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "on"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "ì•”í˜¸í™”ëœ GSSAPI ì—°ê²°\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"경고: 콘솔 코드 페ì´ì§€(%u)ê°€ Windows 코드 페ì´ì§€(%u)와 달ë¼ì„œ\n"
+" 8비트 문ìžê°€ 올바르게 표시ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ psql "
+"참조\n"
+" 페ì´ì§€ \"Notes for Windows users\"를 참조하십시오.\n"
+
+#: command.c:3949
+#, c-format
+msgid ""
+"environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a "
+"line number"
+msgstr ""
+"지정한 줄번호를 사용하기 위해서는 PSQL_EDITOR_LINENUMBER_ARG ì´ë¦„ì˜ OS 환경변"
+"수가 설정ë˜ì–´ 있어야 합니다."
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "\"%s\" 문서 편집기를 실행시킬 수 ì—†ìŒ"
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "/bin/sh ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "ìž„ì‹œ 디렉터리 경로를 ì•Œ 수 ì—†ìŒ: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "\"%s\" ìž„ì‹œ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: \"%s\" ìƒëžµí˜•ì´ \"%s\" ë˜ëŠ” \"%s\" ê°’ ëª¨ë‘ ì„ íƒê°€ëŠ¥í•´ì„œ 모호함"
+
+#: command.c:4414
+#, c-format
+msgid ""
+"\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+msgstr ""
+"\\pset: 허용ë˜ëŠ” 출력 형ì‹: aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: 사용할 수 있는 ì„  ëª¨ì–‘ì€ ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: 사용할 수 있는 유니코드 í…Œë‘리 ëª¨ì–‘ì€ single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: 사용할 수 있는 유니코드 칼럼 ì„  ëª¨ì–‘ì€ single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: 사용할 수 있는 유니코드 í—¤ë” ì„  ëª¨ì–‘ì€ single, double"
+
+#: command.c:4530
+#, c-format
+msgid ""
+"\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", "
+"or a number specifying the exact width"
+msgstr ""
+"\\pset: xheader_width ê°’ì€ \"%s\" (기본값), \"%s\", \"%s\", ë˜ëŠ” 정확한 너비 "
+"ìˆ«ìž ìž…ë‹ˆë‹¤."
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep 문ìžëŠ” 1ë°”ì´íŠ¸ì˜ ë‹¨ì¼ ë¬¸ìžì—¬ì•¼ 함"
+
+#: command.c:4552
+#, c-format
+msgid ""
+"\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage "
+"return"
+msgstr ""
+"\\pset: csv_fieldsep 문ìžë¡œ 따옴표, 줄바꿈(\\n, \\r) 문ìžëŠ” 사용할 수 ì—†ìŒ"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: 알 수 없는 옵션: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "html í…Œì´ë¸”ì˜ í…Œë‘리를 %dë¡œ 지정했습니다.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "ëŒ€ìƒ ë„ˆë¹„ 미지정.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "ëŒ€ìƒ ë„ˆë¹„ëŠ” %d입니다.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "칼럼 단위 보기 기능 켬.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "칼럼 단위 보기 ê¸°ëŠ¥ì„ ìžë™ìœ¼ë¡œ 지정 함.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "칼럼 단위 보기 기능 ë”.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "í™•ìž¥ëœ í—¤ë” ë„ˆë¹„ = \"%s\".\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "í™•ìž¥ëœ í—¤ë” ë„ˆë¹„ëŠ” %d입니다.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSVìš© í•„ë“œ 구분ìž: \"%s\".\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "í•„ë“œ 구분ìžê°€ 0 ë°”ì´íŠ¸ìž…니다.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "í•„ë“œ êµ¬ë¶„ìž \"%s\".\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "기본 ê¼¬ë¦¿ë§ ë³´ê¸° 기능 켬.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "기본 ê¼¬ë¦¿ë§ ë³´ê¸° 기능 ë”.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "현재 출력 형ì‹: %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "선 모양: %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null ê°’ì€ \"%s\" 문ìžë¡œ ë³´ì—¬ì§.\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "ë¡œì¼€ì¼ ë§žì¶¤ ìˆ«ìž í‘œê¸° 기능 켬.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "ë¡œì¼€ì¼ ë§žì¶¤ ìˆ«ìž í‘œê¸° 기능 ë”.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "긴 ì¶œë ¥ì„ ìœ„í•´ 페ì´ì €ê°€ 사용ë¨.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "í•­ìƒ íŽ˜ì´ì €ê°€ 사용ë¨.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "화면단위 보기 기능 ë”(ì „ì²´ ìžë£Œ ëª¨ë‘ ë³´ì—¬ì¤Œ).\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "%d 줄보다 ì ì€ 경우는 페ì´ì§€ 단위 보기가 사용ë˜ì§€ ì•ŠìŒ\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "레코드 구분ìžê°€ 0 ë°”ì´íŠ¸ìž„.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "레코드 구분ìžëŠ” 줄바꿈 문ìžìž…니다.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "레코드 êµ¬ë¶„ìž \"%s\".\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "í…Œì´ë¸” ì†ì„±: \"%s\".\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "í…Œì´ë¸” ì†ì„± ëª¨ë‘ ì§€ì›€.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "출력 í…Œì´ë¸”ì˜ ì œëª©: \"%s\"\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "출력 í…Œì´ë¸”ì˜ ì œëª©ì„ ì§€ì •í•˜ì§€ 않았습니다.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "ìžë£Œë§Œ 보기 기능 켬.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "ìžë£Œë§Œ 보기 기능 ë”.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "유니코드 í…Œë‘리 선문ìž: \"%s\".\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "유니코드 칼럼 선문ìž: \"%s\".\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "유니코드 í—¤ë” ì„ ë¬¸ìž: \"%s\".\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: 실패"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch 명령으로 수행할 쿼리가 없습니다."
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "타ì´ë¨¸ 설정 실패: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (%g초 간격)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (%g초 간격)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "신호를 기다릴 수 없었ìŒ: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********** 쿼리 **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" 뷰(view)가 아님"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "현재 ì ‘ì†í•œ ì—°ê²° ì—†ì´ëŠ” 특수문ìžì²˜ë¦¬ë¥¼ í•  수 ì—†ìŒ"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "쉘 ëª…ë ¹ì˜ ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "서버 ì ‘ì† ëŠê¹€"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "서버로부터 ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤. 다시 ì—°ê²°ì„ ì‹œë„합니다: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "실패.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "성공.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "PQresultStatus ë°˜í™˜ê°’ì´ ìž˜ëª»ë¨: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "작업시간: %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "작업시간: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "작업시간: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "작업시간: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°ë˜ì–´ìžˆì§€ 않습니다."
+
+#: common.c:674
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" with payload \"%s\" received from server "
+"process with PID %d.\n"
+msgstr "\"%s\" 비ë™ê¸° 통지를 ë°›ìŒ, 부가정보: \"%s\", 보낸 프로세스: %d.\n"
+
+#: common.c:677
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "ë™ê¸°í™” 신호 \"%s\" ë°›ìŒ, 해당 서버 프로세스 PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "ê²°ê³¼ í…Œì´ë¸”ì„ ì¶œë ¥í•  수 ì—†ìŒ: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset 해당 ìžë£Œ ì—†ìŒ"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset 실행 결과가 ë‹¨ì¼ ìžë£Œê°€ 아님"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr ""
+"\\gset 작업으로 특수하게 처리ë˜ëŠ” ë³€ìˆ˜ì¸ \"%s\" ë³€ìˆ˜ê°’ì„ ë°”ê¿€ 수 있어 무시함"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify "
+"command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to "
+"cancel)********************\n"
+msgstr ""
+"***(ë‹¨ë… ìˆœì°¨ 모드: 쿼리 확ì¸)*********************************************\n"
+"%s\n"
+"***(Enter: ê³„ì† ì§„í–‰, x Enter: 중지)********************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "명령구문: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "ì•Œ 수 없는 트랜잭션 ìƒíƒœ (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "필드명"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "형태"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "해당 명령 결과가 없거나, ê·¸ ê²°ê³¼ì—는 ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: ì¸ìžê°€ 필요함"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: 구문 오류: \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: 줄 ëì— êµ¬ë¬¸ 오류"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: 디렉터리부터 ë˜ëŠ” 디렉터리로 복사할 수 ì—†ìŒ"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "외부 명령으로 파ì´í”„를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "COPY ìžë£Œë¥¼ 기ë¡í•  수 ì—†ìŒ: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY ìžë£Œ 변환 실패: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "사용ìžì— ì˜í•´ì„œ 취소ë¨"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"í•œ ì¤„ì— í•œ 레코드씩 ë°ì´í„°ë¥¼ 입력하고\n"
+"ìžë£Œìž…ë ¥ì´ ë나면 backslash ì  (\\.) 마지막 줄 처ìŒì— 입력하는 EOF 시그ë„ì„ "
+"보내세요."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "ì½ê¸° 실패로 중지ë¨"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "복사 모드를 종료하는 중"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: 구문 결과가 ì§‘í•©ì„ ë°˜í™˜í•˜ì§€ 않았ìŒ"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: 쿼리 결과는 ì ì–´ë„ 세 ê°œì˜ ì¹¼ëŸ¼ì€ ë°˜í™˜ 해야 함"
+
+#: crosstabview.c:156
+#, c-format
+msgid ""
+"\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: 행과 ì—´ì˜ ì¹¼ëŸ¼ì´ ê°ê° 다른 칼럼ì´ì–´ì•¼ 함"
+
+#: crosstabview.c:172
+#, c-format
+msgid ""
+"\\crosstabview: data column must be specified when query returns more than "
+"three columns"
+msgstr ""
+"\\crosstabview: 처리할 ì¹¼ëŸ¼ì´ ì„¸ê°œë³´ë‹¤ ë§Žì„ ë•ŒëŠ” ìžë£Œë¡œ 사용할 ì¹¼ëŸ¼ì„ ì§€ì •í•´"
+"야 함"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: 최대 칼럼 수 (%d) 초과"
+
+#: crosstabview.c:397
+#, c-format
+msgid ""
+"\\crosstabview: query result contains multiple data values for row \"%s\", "
+"column \"%s\""
+msgstr ""
+"\\crosstabview: \"%s\" 로우, \"%s\" ì¹¼ëŸ¼ì— ëŒ€í•´ 쿼리 결과는 다중값ì´ì–´ì•¼ 함"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: %d 번째 ì—´ì€ 1..%d 범위를 벗어났ìŒ"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: 칼럼 ì´ë¦„ì´ ëª¨í˜¸í•¨: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 칼럼 ì´ë¦„ ì—†ìŒ: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "스키마"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "ì´ë¦„"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "반환 ìžë£Œí˜•"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "ì¸ìž ìžë£Œí˜•"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "설명"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "통계 함수 목ë¡"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "서버(%s 버전)ì—ì„œ ì ‘ê·¼ ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않습니다."
+
+#: describe.c:168
+msgid "Index"
+msgstr "ì¸ë±ìŠ¤"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "í…Œì´ë¸”"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "핸들러"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "ì ‘ê·¼ 방법 목ë¡"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "소유주"
+
+#: describe.c:231
+msgid "Location"
+msgstr "위치"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "옵션"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "í¬ê¸°"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ 목ë¡"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df ëª…ë ¹ì€ [anptwS+]만 추가로 사용함"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df ëª…ë ¹ì€ \"%c\" ì˜µì…˜ì„ %s 버전 서버ì—서는 사용할 수 ì—†ìŒ"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "집계"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "ì°½"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "함수"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "트리거"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "휘발성"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "엄격함"
+
+#: describe.c:398
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "병렬처리"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "보안"
+
+#: describe.c:412
+msgid "Language"
+msgstr "언어"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "내부 ì´ë¦„"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "함수 목ë¡"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "요소"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "ìžë£Œí˜• 목ë¡"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "왼쪽 ì¸ìˆ˜ ìžë£Œí˜•"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "오른쪽 ì¸ìˆ˜ ìžë£Œí˜•"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "반환 ìžë£Œí˜•"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "함수"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "ì—°ì‚°ìž ëª©ë¡"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "ì¸ì½”딩"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "ë¡œì¼€ì¼ ì œê³µìž"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Collate"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICU 로케ì¼"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "ICU 룰"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 목ë¡"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "í…Œì´ë¸”"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "ë·°(view)"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "êµ¬ì²´í™”ëœ ë·°"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "시퀀스"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "외부 í…Œì´ë¸”"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "파티션 í…Œì´ë¸”"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "칼럼 접근권한"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "ì •ì±…"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "액세스 권한"
+
+#: describe.c:1195
+msgid "function"
+msgstr "함수"
+
+#: describe.c:1197
+msgid "type"
+msgstr "type"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "스키마"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "기본 접근권한"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "개체"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "í…Œì´ë¸” 제약 ì¡°ê±´"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "ë„ë©”ì¸ ì œì•½ì¡°ê±´"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "ì—°ì‚°ìž í´ëž˜ìŠ¤"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "룰(rule)"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "개체 설명"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "\"%s\" ì´ë¦„ì„ ë¦´ë ˆì´ì…˜(relation) ì—†ìŒ."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "관련 릴레ì´ì…˜ ì°¾ì„ ìˆ˜ ì—†ìŒ."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "%s oidì˜ ì–´ë–¤ 릴레ì´ì…˜(relation)ë„ ì°¾ì„ ìˆ˜ ì—†ìŒ."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "시작"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "최소값"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "최대값"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "ì¦ê°€ê°’"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "예"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "아니오"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "순환?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "ìºì‰¬"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "소유주: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "ì‹ë³„ 칼럼용 시퀀스: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "\"%s.%s\" 로그 미사용 시퀀스"
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "\"%s.%s\" 시퀀스"
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "로그 미사용 í…Œì´ë¸” \"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "\"%s.%s\" í…Œì´ë¸”"
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "\"%s.%s\" ë·°(view)"
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "트랜잭션 로그를 남기지 ì•Šì€ êµ¬ì²´í™”ëœ ë·° \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materialized ë·° \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "\"%s.%s\" 로그 미사용 ì¸ë±ìŠ¤"
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "\"%s.%s\" ì¸ë±ìŠ¤"
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "\"%s.%s\" 로그 미사용 파티션 ì¸ë±ìŠ¤"
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "\"%s.%s\" 파티션 ì¸ë±ìŠ¤"
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "\"%s.%s\" TOAST í…Œì´ë¸”"
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "\"%s.%s\" 복합ìžë£Œí˜•"
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "\"%s.%s\" 외부 í…Œì´ë¸”"
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "로그 미사용 파티션 í…Œì´ë¸” \"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "\"%s.%s\" 파티션 í…Œì´ë¸”"
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "정렬규칙"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "NULL허용"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "초기값"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Key?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "ì •ì˜"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "FDW 옵션"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "스토리지"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "압축"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "통계수집량"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "ì†Œì† íŒŒí‹°ì…˜: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "파티션 제약 ì¡°ê±´ ì—†ìŒ"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "파티션 제약조건: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "파티션 키: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "ì†Œì† í…Œì´ë¸”: \"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "기본키, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "고유"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "ì ìš©í…Œì´ë¸”: \"%s.%s\""
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicate (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", í´ëŸ¬ìŠ¤ë¨"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", 잘못ë¨"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", 지연가능"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", 트랜잭션단위지연"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", 복제 ì‹ë³„ìž"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "ì¸ë±ìŠ¤ë“¤:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "ì²´í¬ ì œì•½ ì¡°ê±´:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "참조키 제약 조건:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "다ìŒì—ì„œ 참조ë¨:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "ì •ì±…:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "정책 (로우단위 보안정책 강제 활성화):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "ì •ì±… (로우단위 보안정책 활성화): (ì—†ìŒ)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "ì •ì±… (로우단위 보안정책 ê°•ì œ 활성화): (ì—†ìŒ)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "정책 (로우단위 보안정책 비활성화):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "통계정보 ê°ì²´:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "룰(rule)들:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "ì‚¬ìš©ì¤‘ì§€ëœ ê·œì¹™:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "í•­ìƒ ë°œìƒí•˜ëŠ” 규칙:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "복제본ì—서만 ë°œìƒí•˜ëŠ” 규칙:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "발행ìž:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "ë·° ì •ì˜:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "트리거들:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "ì‚¬ìš©ì¤‘ì§€ëœ ì‚¬ìš©ìž íŠ¸ë¦¬ê±°:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "ì‚¬ìš©ì¤‘ì§€ëœ ë‚´ë¶€ 트리거:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "í•­ìƒ ë°œìƒí•˜ëŠ” 트리거:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "복제본ì—서만 ë°œìƒí•˜ëŠ” 트리거:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "서버: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW 옵션들: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "ìƒì†"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "파티션 í…Œì´ë¸” 수: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "파티션 í…Œì´ë¸” 수: %d (\\d+ 명령으로 ë³¼ 수 있ìŒ)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "하위 í…Œì´ë¸” 수: %d (\\d+ 명령으로 ë³¼ 수 있ìŒ)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "하위 í…Œì´ë¸”"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "파티션들"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "ìžë£Œí˜•ì˜ typed í…Œì´ë¸”: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "복제 ì‹ë³„ìž"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "OID 사용: yes"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "접근 방법: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", \"%s\" í…Œì´ë¸”스페ì´ìŠ¤"
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "롤 목ë¡"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "롤 ì´ë¦„"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "ì†ì„±"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "슈í¼ìœ ì €"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "ìƒì† ì—†ìŒ"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "롤 만들기"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "DB 만들기"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "로그ì¸í•  수 ì—†ìŒ"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "복제"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "RLS 통과"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "ì—°ê²° ì—†ìŒ"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d개 연결"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "비밀번호 만료기한: "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "롤"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "설정"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "\"%s\" 롤과 \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— 대한 특정 ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "\"%s\" 롤용 특정 ì„¤ì •ì´ ì—†ìŒ."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "추가 설정 ì—†ìŒ."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "설정 목ë¡"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "ì†Œì† ê·¸ë£¹"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "부여ìž"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "롤 부여 목ë¡"
+
+#: describe.c:3952
+msgid "index"
+msgstr "ì¸ë±ìŠ¤"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST í…Œì´ë¸”"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "파티션_ì¸ë±ìŠ¤"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "ì˜êµ¬"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "임시"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "로깅안함"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "지ì†ì„±"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "접근 방법"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "릴레ì´ì…˜ 목ë¡"
+
+#: describe.c:4130
+#, c-format
+msgid ""
+"The server (version %s) does not support declarative table partitioning."
+msgstr "ì´ ì„œë²„(%s 버전)는 파티션 í…Œì´ë¸” ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "파티션 ì¸ë±ìŠ¤ 목ë¡"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "파티션 í…Œì´ë¸” 목ë¡"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "파티션 릴레ì´ì…˜(relation) 목ë¡"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "ìƒìœ„ ì´ë¦„"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "하위 파티션 í¬ê¸°"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "ì „ì²´ í¬ê¸°"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "신뢰ë¨"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "내부 언어"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "호출 핸들러"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "유효성 검사기"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "ì¸ë¼ì¸ 핸들러"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "언어 목ë¡"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "ì²´í¬"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "ë„ë©”ì¸(domain) 목ë¡"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "소스"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "설명"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "초기값?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "문ìžì½”드변환규칙(conversion) 목ë¡"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "매개변수"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "ê°’"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "컨í…스트"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "환경설정 매개변수 목ë¡"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "ê¸°ë³¸ê°’ì´ ì•„ë‹Œ 값으로 ì§€ì •ëœ í™˜ê²½ì„¤ì • 매개변수 목ë¡"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "ì´ ì„œë²„(%s 버전)는 ì´ë²¤íŠ¸ 트리거를 지ì›í•˜ì§€ 않습니다."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "ì´ë²¤íŠ¸"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "활성화"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4658
+msgid "always"
+msgstr "í•­ìƒ"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "비활성화"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "활성화"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "태그"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "ì´ë²¤íŠ¸ 트리거 목ë¡"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "ì´ ì„œë²„(%s 버전)ì—ì„œ 확장 통계정보를 지ì›í•˜ì§€ 않습니다."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Dependencies"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "확장 통계정보 목ë¡"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Source ìžë£Œí˜•"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Target ìžë£Œí˜•"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "in assignment"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Implicit?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "í˜•ë³€í™˜ìž ëª©ë¡"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "제공ìž"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Deterministic?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "ë¬¸ìž ì •ë ¬ 목ë¡"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "스키마 목ë¡"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "í…스트 검색 파서 목ë¡"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "\"%s\"(ì´)ë¼ëŠ” 전문 검색 분ì„기를 찾지 못했습니다."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "특정 전문 검색 분ì„기를 찾지 못했습니다."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "구문 ë¶„ì„ ì‹œìž‘"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "방법"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "ë‹¤ìŒ í† í° ê°€ì ¸ì˜¤ê¸°"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "구문 ë¶„ì„ ì¢…ë£Œ"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "헤드ë¼ì¸ 가져오기"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "í† í° í˜•ì‹ ê°€ì ¸ì˜¤ê¸°"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "\"%s.%s\" í…스트 검색 파서"
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "\"%s\" í…스트 검색 파서"
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "í† í° ì´ë¦„"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "\"%s.%s\" íŒŒì„œì˜ í† í° í˜•ì‹"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "\"%s\" íŒŒì„œì˜ í† í° í˜•ì‹"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "템플릿"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "초기화 옵션"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "í…스트 검색 사전 목ë¡"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "초기화"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "í…스트 검색 템플릿 목ë¡"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "í…스트 검색 구성 목ë¡"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "\"%s\"(ì´)ë¼ëŠ” í…스트 검색 êµ¬ì„±ì„ ì°¾ì§€ 못했습니다."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "특정 í…스트 검색 êµ¬ì„±ì„ ì°¾ì§€ 못했습니다."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "토í°"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "사전"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "í…스트 검색 구성 \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "í…스트 검색 구성 \"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"파서: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"파서: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "외부 ë°ì´í„° ëž˜í¼ ëª©ë¡"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "외부 ë°ì´í„° 래í¼"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "버전"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "외부 서버 목ë¡"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "서버"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "ì‚¬ìš©ìž ì´ë¦„"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "ì‚¬ìš©ìž ë§¤í•‘ 목ë¡"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "외부 í…Œì´ë¸” 목ë¡"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "ì„¤ì¹˜ëœ í™•ìž¥ê¸°ëŠ¥ 목ë¡"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "\"%s\" ì´ë¦„ì˜ í™•ìž¥ 기능 ëª¨ë“ˆì„ ì°¾ì„ ìˆ˜ 없습니다."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "추가할 확장 기능 ëª¨ë“ˆì´ ì—†ìŒ."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "개체 설명"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "\"%s\" 확장 기능 ì•ˆì— í¬í•¨ëœ ê°ì²´ë“¤"
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ì ë‹¹í•˜ì§€ ì•Šì€ qualified ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ê°„ì˜ ì°¸ì¡°ëŠ” 구현ë˜ì–´ìžˆì§€ 않습니다: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "ì´ ì„œë²„(%s 버전)는 논리 복제 발행 ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "모든 í…Œì´ë¸”"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Inserts"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Updates"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Deletes"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Truncates"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "발행 목ë¡"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ ì—†ìŒ."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "발행 ì—†ìŒ."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "%s 발행"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "í…Œì´ë¸”들:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "ë‹¤ìŒ ìŠ¤í‚¤ë§ˆì˜ ëª¨ë“  í…Œì´ë¸”:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "ì´ ì„œë²„(%s 버전)는 êµ¬ë… ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "발행"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "ë°”ì´ë„ˆë¦¬"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "스트리ë°"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "2단계 커밋"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "오류가 ìƒê¸°ë©´ 비활성"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "오리진"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "비밀번호 필요함"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "소유주 권한으로 실행?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "ë™ê¸°ì‹ 커밋"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "ì—°ê²°ì •ë³´"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "LSN 건너뜀"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "êµ¬ë… ëª©ë¡"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "ìž…ë ¥ ìžë£Œí˜•"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "스토리지 유형"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "ì—°ì‚°ìž í´ëž˜ìŠ¤"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "ì—°ì‚°ìž í´ëž˜ìŠ¤ 목ë¡"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Applicable types"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜ 목ë¡"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "ì—°ì‚°ìž"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "전략번호"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "ordering"
+
+#: describe.c:6911
+msgid "search"
+msgstr "search"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Purpose"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "ì •ë ¬ ì—°ì‚°ìž ë¶€ë¥˜"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜ ì†Œì† ì—°ì‚°ìž ëª©ë¡"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "등ë¡ëœ 왼쪽 ìžë£Œí˜•"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "등ë¡ëœ 오른쪽 ìžë£Œí˜•"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "번호"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜ ì†Œì† ì§€ì› í•¨ìˆ˜ 목ë¡"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "대형 ê°ì²´ë“¤"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psqlì€ PostgreSQL ëŒ€í™”ì‹ í„°ë¯¸ë„입니다.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "ì¼ë°˜ 옵션:\n"
+
+#: help.c:84
+msgid ""
+" -c, --command=COMMAND run only single command (SQL or internal) and "
+"exit\n"
+msgstr ""
+" -c, --command=COMMAND í•˜ë‚˜ì˜ ëª…ë ¹(SQL ë˜ëŠ” 내부 명령)만 실행하고 ë냄\n"
+
+#: help.c:85
+#, c-format
+msgid ""
+" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME ì—°ê²°í•  ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„(기본 ê°’: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME íŒŒì¼ ì•ˆì— ì§€ì •í•œ ëª…ë ¹ì„ ì‹¤í–‰í•˜ê³  ë냄\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr ""
+" -l, --list 사용 가능한 ë°ì´í„°ë² ì´ìŠ¤ 목ë¡ì„ 표시하고 ë냄\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" psql 변수 NAMEì„ VALUEë¡œ 설정\n"
+" (예, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc 시작 파ì¼(~/.psqlrc)ì„ ì½ì§€ ì•ŠìŒ\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-"
+"interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" 명령 파ì¼ì„ í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ìœ¼ë¡œ 실행\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] ì´ ë„움ë§ì„ 표시하고 종료\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr ""
+" --help=commands psql 내장명령어(\\문ìžë¡œ 시작하는)를 표시하고 종"
+"료\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 특별 변수들 보여주고, 종료\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"입출력 옵션:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all 스í¬ë¦½íŠ¸ì˜ 모든 ìž…ë ¥ 표시\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 실패한 명령들 출력\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries 서버로 보낸 명령 표시\n"
+
+#: help.c:104
+msgid ""
+" -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 내부 ëª…ë ¹ì´ ìƒì„±í•˜ëŠ” 쿼리 표시\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME 세션 로그를 파ì¼ë¡œ 보냄\n"
+
+#: help.c:106
+msgid ""
+" -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline í™•ìž¥ëœ ëª…ë ¹í–‰ 편집 ê¸°ëŠ¥ì„ ì‚¬ìš©ì¤‘ì§€í•¨(readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME 쿼리 결과를 파ì¼(ë˜ëŠ” |파ì´í”„)ë¡œ 보냄\n"
+
+#: help.c:108
+msgid ""
+" -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet ìžë™ 실행(메시지 ì—†ì´ ì¿¼ë¦¬ 결과만 표시)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step ë‹¨ë… ìˆœì°¨ 모드(ê° ì¿¼ë¦¬ 확ì¸)\n"
+
+#: help.c:110
+msgid ""
+" -S, --single-line single-line mode (end of line terminates SQL "
+"command)\n"
+msgstr " -S, --single-line í•œ 줄 모드(줄 ëì—ì„œ SQL ëª…ë ¹ì´ ì¢…ë£Œë¨)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"출력 í˜•ì‹ ì˜µì…˜:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align ì •ë ¬ë˜ì§€ ì•Šì€ í‘œ í˜•íƒœì˜ ì¶œë ¥ 모드\n"
+
+#: help.c:114
+msgid ""
+" --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV (쉼표-분리 ìžë£Œ) í…Œì´ë¸” 출력 모드\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: "
+"\"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" unaligned 출력용 í•„ë“œ êµ¬ë¶„ìž ì„¤ì •(기본 ê°’: \"%s"
+"\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML 표 형태 출력 모드\n"
+
+#: help.c:119
+msgid ""
+" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset "
+"command)\n"
+msgstr ""
+" -P, --pset=VAR[=ARG] ì¸ì‡„ 옵션 VARì„ ARGë¡œ 설정(\\pset 명령 참조)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: "
+"newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" unaligned 출력용 레코드 êµ¬ë¶„ìž ì„¤ì •\n"
+" (기본 ê°’: 줄바꿈 문ìž)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only 행만 ì¸ì‡„\n"
+
+#: help.c:123
+msgid ""
+" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, "
+"border)\n"
+msgstr ""
+" -T, --table-attr=TEXT HTML table 태그 ì†ì„± 설정(예: width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded í™•ìž¥ëœ í‘œ 형태로 출력\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" unaligned 출력용 í•„ë“œ 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" unaligned 출력용 레코드 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: help.c:133
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory "
+"(default: \"%s\")\n"
+msgstr ""
+" -h, --host=HOSTNAME ë°ì´í„°ë² ì´ìŠ¤ 서버 호스트 ë˜ëŠ” 소켓 디렉터리\n"
+" (기본값: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "로컬 소켓"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìŠ¤ 서버 í¬íŠ¸(기본 ê°’: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME ë°ì´í„°ë² ì´ìŠ¤ ì‚¬ìš©ìž ì´ë¦„(기본 ê°’: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: help.c:143
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr " -W, --password 암호 ìž…ë ¥ 프롬프트 ë³´ìž„(ìžë™ìœ¼ë¡œ 처리함)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help"
+"\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"ìžì„¸í•œ ë‚´ìš©ì„ ë³´ë ¤ë©´ psql ë‚´ì—ì„œ \"\\?\"(내부 명령) ë˜ëŠ” \"\\help\"(SQL\n"
+"명령)를 입력하거나 PostgreSQL\n"
+"설명서ì—ì„œ psql ì„¹ì…˜ì„ ì°¸ì¡°í•˜ì‹­ì‹œì˜¤.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "ì¼ë°˜\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... 쿼리 매개 변수 지정\n"
+
+#: help.c:193
+msgid ""
+" \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL 사용법 ë° ì €ìž‘ê¶Œ ì •ë³´ 표시\n"
+
+#: help.c:194
+msgid ""
+" \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [칼럼들] 쿼리를 실행하고, 피봇 í…Œì´ë¸” 형태로 ìžë£Œë¥¼ 보여줌\n"
+
+#: help.c:195
+msgid ""
+" \\errverbose show most recent error message at maximum "
+"verbosity\n"
+msgstr ""
+" \\errverbose 최대 ìžì„¸ížˆ 보기 ìƒíƒœì—ì„œ 최근 오류를 다 보여줌\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] 쿼리 실행 (결과는 지정한 파ì¼ë¡œ, ë˜ëŠ” |파ì´í”„ë¡œ);\n"
+" \\g 명령ì—ì„œ ì¸ìžê°€ 없으면 세미콜론과 ê°™ìŒ\n"
+
+#: help.c:198
+msgid ""
+" \\gdesc describe result of query, without executing it\n"
+msgstr ""
+" \\gdesc 쿼리를 실행하지 ì•Šê³  ê·¸ ê²°ê³¼ 칼럼과 ìžë£Œí˜•ì„ 출력\n"
+
+#: help.c:199
+msgid ""
+" \\gexec execute query, then execute each value in its "
+"result\n"
+msgstr " \\gexec 쿼리를 실행하고, ê·¸ 결과를 ê°ê° 실행 함\n"
+
+#: help.c:200
+msgid ""
+" \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] 쿼리 실행 뒤 그 결과를 psql 변수로 저장\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(OPTIONS)] [FILE] \\g 명령과 같으나, ì¶œë ¥ì„ í™•ìž¥ 모드로 강제함\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q psql 종료\n"
+
+#: help.c:203
+msgid ""
+" \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] SEC초 간격, N번 반복\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "ë„움ë§\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] psql 역슬래시 명령어 설명\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options psql 명령행 옵션 ë„ì›€ë§ ë³´ê¸°\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables psql 환경 설정 ë³€ìˆ˜ë“¤ì— ì„¤ëª… 보기\n"
+
+#: help.c:211
+msgid ""
+" \\h [NAME] help on syntax of SQL commands, * for all "
+"commands\n"
+msgstr ""
+" \\h [NAME] SQL 명령 구문 ë„움ë§, 모든 ëª…ë ¹ì„ í‘œì‹œí•˜ë ¤ë©´ * ìž…"
+"ë ¥\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "쿼리 버í¼\n"
+
+#: help.c:215
+msgid ""
+" \\e [FILE] [LINE] edit the query buffer (or file) with external "
+"editor\n"
+msgstr " \\e [FILE] [LINE] 외부 편집기로 쿼리 버í¼(ë˜ëŠ” 파ì¼) 편집\n"
+
+#: help.c:216
+msgid ""
+" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] 외부 편집기로 해당 함수 내용 편집\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] 외부 편집기로 해당 ë·° ì •ì˜ íŽ¸ì§‘\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p 쿼리 버í¼ì˜ ë‚´ìš© 표시\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r 쿼리 ë²„í¼ ì´ˆê¸°í™”(ëª¨ë‘ ì§€ì›€)\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] ê¸°ë¡ í‘œì‹œ ë˜ëŠ” 파ì¼ì— 저장\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE 쿼리 버í¼ë¥¼ 파ì¼ì— 기ë¡\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "입력/출력\n"
+
+#: help.c:227
+msgid ""
+" \\copy ... perform SQL COPY with data stream to the client "
+"host\n"
+msgstr ""
+" \\copy ... í´ë¼ì´ì–¸íŠ¸ í˜¸ìŠ¤íŠ¸ì— ìžˆëŠ” ìžë£Œë¥¼ SQL COPY 명령 실"
+"í–‰\n"
+
+#: help.c:228
+msgid ""
+" \\echo [-n] [STRING] write string to standard output (-n for no "
+"newline)\n"
+msgstr " \\echo [-n] [STRING] 문ìžì—´ì„ 표준 ì¶œë ¥ì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE 파ì¼ì—ì„œ 명령 실행\n"
+
+#: help.c:230
+msgid ""
+" \\ir FILE as \\i, but relative to location of current "
+"script\n"
+msgstr ""
+" \\ir FILE \\i 명령과 같으나, 경로가 현재 위치 기준 ìƒëŒ€ì \n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] 모든 쿼리 결과를 íŒŒì¼ ë˜ëŠ” |파ì´í”„ë¡œ 보냄\n"
+
+#: help.c:232
+msgid ""
+" \\qecho [-n] [STRING] write string to \\o output stream (-n for no "
+"newline)\n"
+msgstr ""
+" \\qecho [-n] [STRING] 문ìžì—´ì„ \\o 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n"
+
+#: help.c:233
+msgid ""
+" \\warn [-n] [STRING] write string to standard error (-n for no "
+"newline)\n"
+msgstr " \\warn [-n] [STRING] 문ìžì—´ì„ stderrì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "조건문\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR 조건문 시작\n"
+
+#: help.c:238
+msgid ""
+" \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR else if 구문 시작\n"
+
+#: help.c:239
+msgid ""
+" \\else final alternative within current conditional "
+"block\n"
+msgstr " \\else ì¡°ê±´ë¬¸ì˜ ê·¸ 외 ì¡°ê±´\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif 조건문 ë\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "정보보기\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (옵션: S = 시스템 개체 표시, + = 추가 ìƒì„¸ ì •ë³´)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] í…Œì´ë¸”, ë·° ë° ì‹œí€€ìŠ¤ 목ë¡\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME í…Œì´ë¸”, ë·°, 시퀀스 ë˜ëŠ” ì¸ë±ìŠ¤ 설명\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] 집계 함수 목ë¡\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] ì ‘ê·¼ 방법 목ë¡\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] ì—°ì‚°ìž í´ëž˜ìŠ¤ 목ë¡\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] ì—°ì‚°ìž ë¶€ë¥˜ 목ë¡\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] ì—°ì‚°ìž ë¶€ë¥˜ ì†Œì† ì—°ì‚°ìž ëª©ë¡\n"
+
+#: help.c:252
+msgid ""
+" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] ì—°ì‚°ìž ê°€ì¡±ì— í¬í•¨ëœ ì§€ì› í•¨ìˆ˜ 목ë¡\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] í…Œì´ë¸”스페ì´ìŠ¤ 목ë¡\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] 문ìžì…‹ ë³€í™˜ìž ëª©ë¡\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] 환경설정 매개변수 목ë¡\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] ìžë£Œí˜• ë³€í™˜ìž ëª©ë¡\n"
+
+#: help.c:257
+msgid ""
+" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [PATTERN] 다른 ê³³ì—서는 ë³¼ 수 없는 ê°ì²´ ì„¤ëª…ì„ ë³´ì—¬ì¤Œ\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] ë„ë©”ì¸ ëª©ë¡\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] 기본 접근권한 목ë¡\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] 외부 í…Œì´ë¸” 목ë¡\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] 외부 서버 목ë¡\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] 외부 í…Œì´ë¸” 목ë¡\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] ì‚¬ìš©ìž ë§¤í•‘ 목ë¡\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] 외부 ë°ì´í„° ëž˜í¼ ëª©ë¡\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] "
+"functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" [agg/normal/procedure/trigger/window 단ì¼] 함수 목"
+"ë¡\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] í…스트 검색 구성 목ë¡\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] í…스트 검색 사전 목ë¡\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] í…스트 검색 파서 목ë¡\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] í…스트 검색 템플릿 목ë¡\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] 롤 목ë¡\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] ì¸ë±ìŠ¤ 목ë¡\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] í° ê°œì²´ 목ë¡, \\lo_list 명령과 ê°™ìŒ\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] 프로시져 언어 목ë¡\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] materialized ë·° 목ë¡\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] 스키마 목ë¡\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" ì—°ì‚°ìž ëª©ë¡\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] collation 목ë¡\n"
+
+#: help.c:280
+msgid ""
+" \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [PATTERN] í…Œì´ë¸”, ë·° ë° ì‹œí€€ìŠ¤ 액세스 권한 목ë¡\n"
+
+#: help.c:281
+msgid ""
+" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations "
+"[n=nested]\n"
+msgstr ""
+" \\dP[itn+] [PATTERN] 파티션 릴레ì´ì…˜ ëª©ë¡ [ì¸ë±ìŠ¤/í…Œì´ë¸”만] [n=nested]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] per-database 롤 설정 목ë¡\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [PATTERN] 롤 부여 목ë¡\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] 복제 발행 목ë¡\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] 복제 êµ¬ë… ëª©ë¡\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] 시퀀스 목ë¡\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] í…Œì´ë¸” 목ë¡\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] ë°ì´í„° í˜•ì‹ ëª©ë¡\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] 롤 목ë¡\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] ë·° 목ë¡\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] 확장 모듈 목ë¡\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] 확장 통계 ì •ë³´ 목ë¡\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] ì´ë²¤íŠ¸ 트리거 목ë¡\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] ë°ì´í„°ë² ì´ìŠ¤ 목ë¡\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] 함수ì´ë¦„ 함수 ì •ì˜ ë³´ê¸°\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ë·°ì´ë¦„ ë·° ì •ì˜ ë³´ê¸°\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [PATTERN] \\dp 와 ê°™ìŒ\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "í° ê°œì²´\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE í° ê°œì²´ë¥¼ 파ì¼ë¡œ 저장\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENT]\n"
+" 파ì¼ì—ì„œ í° ê°œì²´ 가져오기\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] í° ê°œì²´ 목ë¡\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID í° ê°œì²´ ì‚­ì œ\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "출력 형ì‹\n"
+
+#: help.c:309
+msgid ""
+" \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a ì •ë ¬ë˜ì§€ ì•Šì€ ì¶œë ¥ 모드와 ì •ë ¬ëœ ì¶œë ¥ 모드 전환\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [STRING] í…Œì´ë¸” 제목 설정 ë˜ëŠ” ê°’ì´ ì—†ëŠ” 경우 설정 안 함\n"
+
+#: help.c:311
+msgid ""
+" \\f [STRING] show or set field separator for unaligned query "
+"output\n"
+msgstr ""
+" \\f [STRING] unaligned ì¶œë ¥ì— ëŒ€í•´ í•„ë“œ êµ¬ë¶„ìž í‘œì‹œ ë˜ëŠ” 설정\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML 출력 모드 전환(현재 %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [ì´ë¦„ [ê°’]] í…Œì´ë¸” 출력 옵션 설정\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] 행만 표시(현재 %s)\n"
+
+#: help.c:323
+msgid ""
+" \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [STRING] HTML <table> 태그 ì†ì„± 설정 ë˜ëŠ” 비었는 경우 설정 "
+"안 함\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] í™•ìž¥ëœ ì¶œë ¥ 전환 (현재 %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "ìžë™"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "ì—°ê²°\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 새 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† (현재 \"%s\")\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 새 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† (현재 ì ‘ì†í•´ 있지 ì•ŠìŒ)\n"
+
+#: help.c:336
+msgid ""
+" \\conninfo display information about current connection\n"
+msgstr " \\conninfo 현재 ë°ì´í„°ë² ì´ìŠ¤ ì ‘ì† ì •ë³´ 보기\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] í´ë¼ì´ì–¸íŠ¸ ì¸ì½”딩 표시 ë˜ëŠ” 설정\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] ì‚¬ìš©ìž ì•”í˜¸ë¥¼ 안전하게 변경\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "ìš´ì˜ ì²´ì œ\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] 현재 작업 디렉터리 변경\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR 환경 ë³€ìˆ˜ê°’ì„ psql 변수값으로\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] 환경 변수 지정 ë° í•´ì œ\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] 명령 실행 시간 전환(현재 %s)\n"
+
+#: help.c:347
+msgid ""
+" \\! [COMMAND] execute command in shell or start interactive "
+"shell\n"
+msgstr " \\! [COMMAND] ì…¸ 명령 실행 ë˜ëŠ” ëŒ€í™”ì‹ ì…¸ 시작\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "변수\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr ""
+" \\prompt [TEXT] NAME 사용ìžì—게 내부 변수를 설정하ë¼ëŠ” 메시지 표시\n"
+
+#: help.c:352
+msgid ""
+" \\set [NAME [VALUE]] set internal variable, or list all if no "
+"parameters\n"
+msgstr ""
+" \\set [NAME [VALUE]] 내부 변수 설정 ë˜ëŠ” 미지정 경우 모든 변수 ëª©ë¡ í‘œ"
+"시\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME 내부 변수 설정 해제(삭제)\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr "특별한 기능 설정 변수 목ë¡\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql 변수들:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" ë˜ëŠ” psql 명령 모드ì—서는 \\set NAME VALUE\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" 설정 ë˜ë©´, SQL ëª…ë ¹ì´ ì •ìƒ ì‹¤í–‰ ë˜ë©´ ìžë™ 커밋 함\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" SQL 키워드 ìžë™ì™„성ì—ì„œ ëŒ€ì†Œë¬¸ìž ì²˜ë¦¬\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" 현재 ì ‘ì†í•œ ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" ìž…ë ¥ì„ í‘œì¤€ 출력으로 보낼 종류\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" 지정 ë˜ë©´ psql 내장 ëª…ë ¹ì–´ì˜ ë‚´ë¶€ 쿼리를 출력함;\n"
+" \"noexec\" 값으로 설정하면, 실행ë˜ì§€ ì•Šê³  쿼리만 보여줌\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" 현재 í´ë¼ì´ì–¸íŠ¸ ì¸ì½”딩 지정\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" 마지막 쿼리가 실패했으면 \"true\", 아니면 \"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = "
+"unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" 쿼리 ê²°ê³¼ì— ëŒ€í•´ì„œ 출력할 최대 로우 개수 (0=제한없ìŒ)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 지정하면 í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì„ ë³´ì—¬ì£¼ì§€ ì•ŠìŒ\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 지정하면 TOAST 압축 종류 보여주지 ì•ŠìŒ\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" 명령 내역 처리 방법 [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" 명령 ë‚´ì—­ì„ ì €ìž¥í•  íŒŒì¼ ì´ë¦„\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" 명령 내역 최대 보관 개수\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" 현재 ì ‘ì†í•œ ë°ì´í„°ë² ì´ìŠ¤ 서버 호스트\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" 대화형 세션 종료를 위한 EOF 개수\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 마지막 ì˜í–¥ ë°›ì€ OID ê°’\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if "
+"none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 마지막 오류 메시지와 SQLSTATE, ì •ìƒì´ë©´, 빈 문ìžì—´ê³¼ \"00000\"\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" 설정하면 오류 ë°œìƒì‹œì—ë„ íŠ¸ëžœìž­ì…˜ 중지 안함 (savepoint ì•”ë¬µì  ì‚¬ìš©)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" 배치 ìž‘ì—… ì‹œ 오류가 ë°œìƒí•˜ë©´ 중지함\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" 현재 ì ‘ì†í•œ 서버 í¬íŠ¸\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" 기본 psql 프롬프트 ì •ì˜\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous "
+"line\n"
+msgstr ""
+" PROMPT2\n"
+" ì•„ì§ êµ¬ë¬¸ì´ ëœ ëë‚œ ëª…ë ¹í–‰ì˜ í”„ë¡¬í”„íŠ¸\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" COPY ... FROM STDIN ìž‘ì—…ì‹œ ë³´ì¼ í”„ë¡¬í”„íŠ¸\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" 조용히 실행 (-q 옵션과 ê°™ìŒ)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 마지막 쿼리 ìž‘ì—… ëŒ€ìƒ ë¡œìš° 수, ë˜ëŠ” 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" 문ìžì—´ 버전 정보나, ìˆ«ìž í˜•ì‹ ë²„ì „ ì •ë³´\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" 마지막 쉘 ëª…ë ¹ì´ ì‹¤íŒ¨í–ˆìœ¼ë©´ \"true\", 아니면 \"false\"\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" 마지막 쉘 ëª…ë ¹ì˜ ì¢…ë£Œ 코드\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" 여러 쿼리가 ì—°ì†í•˜ëŠ” 경우(\\;) 모든 쿼리 결과를 출력, offë©´ 마지막 ê²°ê³¼"
+"만\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" ìƒí™©ë³„ ìžì„¸í•œ 메시지 ë‚´ìš© 출력 제어 [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" í•œ ì¤„ì— í•˜ë‚˜ì˜ SQL 명령 실행 (-S 옵션과 ê°™ìŒ)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" ê° ëª…ë ¹ì„ í™•ì¸í•˜ë©° 실행 (-s 옵션과 ê°™ìŒ)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 마지막 ì¿¼ë¦¬ì˜ SQLSTATE ê°’, 오류가 없으면 \"00000\"\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" 현재 ì ‘ì†í•œ ë°ì´í„°ë² ì´ìŠ¤ 사용ìž\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" 오류 출력시 ìžì„¸ížˆ ë³¼ ë‚´ìš© 범위 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql 버전 (ìžì„¸í•œ 버전, 단순한 버전, 숫ìží˜• 버전)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"출력 설정들:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" ë˜ëŠ” psql 명령 모드ì—서는 \\pset NAME [VALUE]\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" í…Œë‘리 모양 (숫ìž)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" ì¤„ë°”ê¿ˆì„ ìœ„í•œ 너비 지정\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (ë˜ëŠ” x)\n"
+" í™•ìž¥ëœ ì¶œë ¥ 전환 [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" unaligned 출력용 í•„ë“œ êµ¬ë¶„ìž (초기값 \"%s\"')\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" unaligned 출력용 í•„ë“œ 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" í…Œì´ë¸” ê¼¬ë¦¬ë§ ë³´ì´ê¸° 전환 [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" 출력 ì–‘ì‹ ì§€ì • [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" í…Œë‘리 ì„  모양 지정 [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" null 값 출력 방법\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of "
+"digits\n"
+msgstr ""
+" numericlocale\n"
+" ìˆ«ìž ì¶œë ¥ì—ì„œ ë¡œì¼€ì¼ ê¸°ë°˜ 천ìžë¦¬ 분리 ë¬¸ìž í™œì„±í™” [on, off]\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" 외부 페ì´ì§€ 단위 보기 ë„구 사용 여부 [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" unaligned 출력용 레코드(줄) 구분ìž\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" unaligned 출력용 레코드 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (ë˜ëŠ” T)\n"
+" html í…Œì´ë¸” íƒœê·¸ì— ëŒ€í•œ ì†ì„±ì´ë‚˜,\n"
+" latex-longtable ì–‘ì‹ì—ì„œ 왼쪽 ì •ë ¬ ìžë£Œìš© 칼럼 너비 지정\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" í…Œì´ë¸” 제목 지정\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" 지정ë˜ë©´, ìžë£Œë§Œ ë³´ìž„\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" 유니코드 선 종류 [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"OS 환경 변수들:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" ë˜ëŠ” psql 명령 모드ì—서는 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" ë˜ëŠ” psql 명령 모드ì—서는 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" ë‹¤ìŒ ì¤„ë¡œ 넘어갈 칼럼 수\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" application_name 변수값으로 사용ë¨\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" ì ‘ì†í•  ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" 서버 ì ‘ì†ìš© 호스트 ì´ë¦„\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" 서버 ì ‘ì†ìš© 비밀번호가 ì €ìž¥ëœ íŒŒì¼ ì´ë¦„\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 서버 ì ‘ì† ë¹„ë°€ë²ˆí˜¸ (ë³´ì•ˆì— ì·¨ì•½í•¨)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" 서버 ì ‘ì†ìš© í¬íŠ¸\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" 서버 ì ‘ì†ìš© ë°ì´í„°ë² ì´ìŠ¤ ì‚¬ìš©ìž ì´ë¦„\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, \\ev 명령ì—ì„œ 사용할 외부 편집기 경로\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" 외부 편집기 호출 ì‹œ 사용할 줄번호 ì„ íƒ ì˜µì…˜\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" ì‚¬ìš©ìž .psql_history íŒŒì¼ ìž„ì˜ ì§€ì •\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PAGER\n"
+" 페ì´ì§€ 단위 보기ì—ì„œ 사용할 프로그램\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" \\watch 명령ì—ì„œ 사용할 외장 페ì´ì € 프로그램 ì´ë¦„\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" ì‚¬ìš©ìž .psqlrc 파ì¼ì˜ ìž„ì˜ ì§€ì •\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! 명령ì—ì„œ 사용할 쉘\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" ìž„ì‹œ 파ì¼ì„ 사용할 디렉터리\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "사용 가능한 ë„움ë§:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"명령: %s\n"
+"설명: %s\n"
+"문법:\n"
+"%s\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\" ëª…ë ¹ì— ëŒ€í•œ ë„ì›€ë§ ì—†ìŒ.\n"
+"\\h ëª…ë ¹ì„ ì¸ìž ì—†ì´ í˜¸ì¶œ 하면 사용 가능한 모든 명령 보여줌.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "history를 \"%s\" 파ì¼ë¡œ 저장할 수 ì—†ìŒ: %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "히스토리 ê¸°ëŠ¥ì€ ì´ ì„¤ì¹˜ë³¸ì—서는 지ì›í•˜ì§€ ì•ŠìŒ"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ë˜ì–´ìžˆì§€ ì•ŠìŒ"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: 현재 트랜잭션 중지ë¨"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: ì•Œ 수 없는 트랜잭션 ìƒíƒœ"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escaped"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "마치려면 \"\\q\"를 입력하세요: %s\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"ì´ ìž…ë ¥ì€ PostgreSQL 사용ìžì–‘ì‹ ë¤í”„ 내용입니다.\n"
+"ì´ ë¤í”„ ë‚´ìš©ì„ ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜í•˜ë ¤ë©´,\n"
+"pg_restore 명령행 í´ë¼ì´ì–¸íŠ¸ë¥¼ 사용하세요.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "\\? ë„움ë§, Ctrl-C ìž…ë ¥ ë²„í¼ ë¹„ìš°ê¸°"
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "ë„움ë§ì„ 보려면 \\?를 입력하십시오."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "PostgreSQLì— ëŒ€í•œ 명령행 ì¸í„°íŽ˜ì´ìŠ¤ì¸ psqlì„ ì‚¬ìš©í•˜ê³  있습니다."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"사용법: \\copyright 저작권 정보\n"
+" \\h SQL 명령 ë„움ë§\n"
+" \\? psql 명령 ë„움ë§\n"
+" \\g ë˜ëŠ” 명령 ëì— ì„¸ë¯¸ì½œë¡ (;) 쿼리 실행\n"
+" \\q 마침\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "\\q 마침"
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "ë§ˆì¹¨ì€ Ctrl-D"
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "ë§ˆì¹¨ì€ Ctrl-C"
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"쿼리 무시ë¨; 현재 \\if 블ë¡ì„ ë내려면 \\endif ë˜ëŠ” Ctrl-C 키를 사용하세요."
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "\\endif ì—†ì´ EOF ë„달"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ë¬¸ìžì—´"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: 메모리 부족"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "ì´ë¦„"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "집계함수_ì‹ë³„구문"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "새ì´ë¦„"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "새사용ìž"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "새스키마"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "집계함수_ì‹ë³„구문 사용법:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "ì¸ìžëª¨ë“œ"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "ì¸ìžì´ë¦„"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "ì¸ìžìžë£Œí˜•"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "옵션"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "옵션 사용법:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "ì ‘ì†í—ˆìš©"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "ì ‘ì†ì œí•œ"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "템플릿?"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "새테ì´ë¸”스페ì´ìŠ¤"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "환경설정_매개변수"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "ê°’"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "대ìƒë¡¤"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "스키마ì´ë¦„"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_ë˜ëŠ”_revoke_ë‚´ìš©"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "grant_ë˜ëŠ”_revoke_ë‚´ìš©ì— ì‚¬ìš©ë˜ëŠ” 구문:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "롤ì´ë¦„"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "표현ì‹"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "ë„ë©”ì¸_제약조건"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "제약조건_ì´ë¦„"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "새제약조건_ì´ë¦„"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "새버전"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "맴버_ê°ì²´"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "맴버_ê°ì²´ 사용법:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "ê°ì²´ì´ë¦„"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "집계함수ì´ë¦„"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "기존ìžë£Œí˜•"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "대ìƒìžë£Œí˜•"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "함수ì´ë¦„"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "ì—°ì‚°ìžì´ë¦„"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "왼쪽ì¸ìž_ìžë£Œí˜•"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "오른쪽ì¸ìž_ìžë£Œí˜•"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "색ì¸ë°©ë²•"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "프로시져_ì´ë¦„"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "루틴_ì´ë¦„"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "ìžë£Œí˜•ì´ë¦„"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "언어_ì´ë¦„"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "집계함수_ì‹ë³„구문 사용법:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "핸들러_함수"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "유효성검사_함수"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "ë™ìž‘"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "칼럼ì´ë¦„"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "새칼럼ì´ë¦„"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "ë™ìž‘ 사용법:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "ìžë£Œí˜•"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "collation"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "칼럼_제약조건"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "정수"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "ì†ì„±_옵션"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "í…Œì´ë¸”_제약조건"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "트리거ì´ë¦„"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "ìƒìœ„_í…Œì´ë¸”"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "확장모듈ì´ë¦„"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "실행비용"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "반환ìžë£Œìˆ˜"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "지ì›_함수"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "롤_명세"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "사용ìžì´ë¦„"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "롤_명세 사용법:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "그룹ì´ë¦„"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ì´ë¦„"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "ì¸ë±ìŠ¤ì´ë¦„"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "스토리지_매개변수"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "칼럼번호"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "대형_ê°ì²´_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "압축_방법"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "새_접근_방법"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "전략_번호"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "ì—°ì‚°ìžìžë£Œí˜•"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "ì •ë ¬_가족_ì´ë¦„"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "지ì›_번호"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "ì¸ìžìžë£Œí˜•"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "í…Œì´ë¸”_ì´ë¦„"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "ì²´í¬_표현ì‹"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "발행_ê°ì²´"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "발행_매개변수"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "발행_ê°ì²´ 사용법:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "암호"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "타임스탬프"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤_ì´ë¦„"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "ì¦ê°€ê°’"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "최소값"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "최대값"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "시작"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "재시작"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "ìºì‰¬"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "새대ìƒ"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "ì ‘ì†ì •ë³´"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "발행_ì´ë¦„"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "발행_옵션"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "새로고침_옵션"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "구ë…_매개변수"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "파티션_ì´ë¦„"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "파티션_범위_ì •ì˜"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "시퀀스_옵션"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "시퀀스_옵션"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "색ì¸ì„_사용하는_í…Œì´ë¸”_제약조건"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "rewrite_룰_ì´ë¦„"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "파티션_범위_ì •ì˜ ì‚¬ìš©ë²•:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "파티션_범위_표현ì‹"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "숫ìž"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "칼럼_제약조건 사용법:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "초기값_표현ì‹"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "ìƒì„±_표현ì‹"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "색ì¸_매개변수"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "참조테ì´ë¸”"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "참조칼럼"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "참조_ë°©ì‹"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "í…Œì´ë¸”_제약조건 사용법:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "exclude_요소"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "ì—°ì‚°ìž"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "범위한정구문"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "색ì¸ì„_사용하는_í…Œì´ë¸”_제약조건 사용법:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 제약조건ì—ì„œ 쓰는 색ì¸_매개변수 사용법:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "EXCLUDE 제약조건ì—ì„œ 쓰는 exclude_요소 사용법:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "ì—°ì‚°ìží´ëž˜ìŠ¤"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "FOREIGN KEY/REFERENCES 제약조건ì—ì„œ 쓰는 참조_ë°©ì‹ ì‚¬ìš©ë²•:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤_옵션"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "토í°_종류"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "사전ì´ë¦„"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "옛사전"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "새사전"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "ì†ì„±ì´ë¦„"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "새ì†ì„±ì´ë¦„"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "새_enum_값"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "옆_enum_값"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "기존_enum_값"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "ì†ì„±"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "서버ì´ë¦„"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "ë·°_옵션ì´ë¦„"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "뷰_옵션_값"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "í…Œì´ë¸”ê³¼_칼럼"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "옵션 사용법:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "불린"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "í¬ê¸°"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "í…Œì´ë¸”ê³¼_칼럼 사용법:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "트랜잭션모드"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "트랜잭션모드 사용법:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "ì¸ìž"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "릴레ì´ì…˜ì´ë¦„"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "ë„ë©”ì¸ì´ë¦„"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "ì •ì±…ì´ë¦„"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "룰ì´ë¦„"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "문ìžì—´_리터럴"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "트랜잭션_id"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "파ì¼ì´ë¦„"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "명령어"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "ì¡°ê±´"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "쿼리문"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "입출력양ì‹ì´ë¦„"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "구분문ìž"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "ë„문ìžì—´"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "기본_문ìžì—´"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "ì¸ìš©ë¶€í˜¸"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "ì´ìŠ¤ì¼€ì´í”„ 문ìž"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "ì¸ì½”딩ì´ë¦„"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "접근_방법_종류"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "ì¸ìžìžë£Œí˜•"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "state_data_type"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "initial_condition"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "정렬연산ìž"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "ë˜ëŠ” 옛날 구문"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "기본ìžë£Œí˜•"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "로케ì¼"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "제공ìž"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "룰"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "버전"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "기존_collation"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "ì›ëž˜ì¸ì½”딩"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "대ìƒì¸ì½”딩"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "템플릿"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "ì¸ì½”딩"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "전략번호"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "icu_로케ì¼"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "icu_룰"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "로케ì¼_제공ìž"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "제약조건"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "제약조건 사용법:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "ì´ë²¤íŠ¸"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "필터_변수"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "í•„í„°_ê°’"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "칼럼_제약조건 사용법:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "rettype"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "칼럼_ìžë£Œí˜•"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "함수정ì˜"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "오브ì íŠ¸íŒŒì¼"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "연결할_함수명"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "sql_본문"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "색ì¸ë°©ë²•"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "opclass_매개변수"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "호출_핸들러"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "ì¸ë¼ì¸_핸들러"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "구문검사함수"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "스토리지_유형"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "ì´ë²¤íŠ¸ 사용법:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "스키마_요소"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "서버_종류"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "서버_버전"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "fdw_ì´ë¦„"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "통계정보_ì´ë¦„"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "통계정보_종류"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "구ë…_ì´ë¦„"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "ì›ë³¸í…Œì´ë¸”"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "LIKE구문옵션"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "LIKE구문옵션 사용법:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "디렉터리"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "구문분ì„기_ì´ë¦„"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "ì›ë³¸_설정"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "시작_함수"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "gettoken함수"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "종료_함수"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "lextypes함수"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "headline함수"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "init함수"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "lexize함수"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "sqlì—ì„œ_언어로_바꿀때쓸_함수ì´ë¦„"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "언어ì—ì„œ_sqlë¡œ_바꿀때쓸_함수ì´ë¦„"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "참조ëœ_í…Œì´ë¸”_ì´ë¦„"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "전달_릴레ì´ì…˜_ì´ë¦„"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "ì¸ìžë“¤"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "enum요소"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "subtype"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "canonical_function"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "다중범위_ìžë£Œí˜•_ì´ë¦„"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "입력함수"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "출력함수"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "받는함수"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "주는함수"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "분ì„함수"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "구ë…_함수"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "내부길ì´"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "ì •ë ¬"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "스토리지"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "category"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "preferred"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "기본값"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "요소"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "구분ìž"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "with절_쿼리"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "별칭"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "from절_항목"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "커서ì´ë¦„"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "출력표현ì‹"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "출력_ì´ë¦„"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "코드"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "매개변수"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "명령구문"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "ë°©í–¥"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "방향 사용법:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "출력개수"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "시퀀스ì´ë¦„"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "ì¸ìžì´ë¦„"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "ì¸ìžìžë£Œí˜•"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "í°ê°œì²´_oid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "ì›ê²©_스키마"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "로컬_스키마"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "충ëŒ_대ìƒ"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "충ëŒ_ìž‘ì—…"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "충ëŒ_ëŒ€ìƒ ì‚¬ìš©ë²•:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "ì¸ë±ìŠ¤ì¹¼ëŸ¼ì´ë¦„"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "ì¸ë±ìŠ¤í‘œí˜„ì‹"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "부분ì¸ë±ìŠ¤ì‹"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "충ëŒ_ìž‘ì—… 사용법:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "서브셀렉트"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "채ë„"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "잠금모드"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "잠금모드 사용법:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "대ìƒ_í…Œì´ë¸”_ì´ë¦„"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "대ìƒ_별칭"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "ë°ì´í„°_소스"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "ì¡°ì¸_ì¡°ê±´"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "whenì ˆ"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "ë°ì´í„°_소스 사용법:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "ì›ë³¸_í…Œì´ë¸”_ì´ë¦„"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "소스_쿼리"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "소스_별칭"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "when절 사용법:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "merge_insert 사용법:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "merge_update 사용법:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "merge_delete 사용법:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "기존롤"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "새롤"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "savepoint_name"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "윈ë„ìš°ì´ë¦„"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "ì›ë„ìš°ì •ì˜"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "from절_항목 사용법:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "칼럼별칭"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "표본추출방법"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "withì ˆ_쿼리_ì´ë¦„"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "칼럼정ì˜"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "ì¡°ì¸_종류"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "ì¡°ì¸_칼럼"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "ì¡°ì¸_별칭"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "grouping_element 사용법:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "with절_쿼리 사용법:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "ê°’"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "새테ì´ë¸”"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "스냅샷_id"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "ì •ë ¬_표현ì‹"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "현재 트랜잭션 중지함"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "집계함수 정보 바꾸기"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "collation ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "문ìžì½”ë“œ 변환규칙(conversion) ì •ë³´ 바꾸기"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 변경"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "기본 ì ‘ê·¼ 권한 ì •ì˜"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "ë„ë©”ì¸ ì •ë³´ 바꾸기"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "트리거 정보 바꾸기"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "확장모듈 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "외부 ë°ì´í„° ëž˜í¼ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "외부 í…Œì´ë¸” ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "함수 정보 바꾸기"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "롤 ì´ë¦„ì´ë‚˜ 맴버쉽 바꾸기"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "ì¸ë±ìŠ¤ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "procedural language 정보 바꾸기"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "대형 ê°ì²´ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "materialized ë·° ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "ì—°ì‚°ìž ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "ì—°ì‚°ìž í´ëž˜ìŠ¤ ì •ë³´ 바꾸기"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜ì˜ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "로우 단위 보안 ì •ì±…ì˜ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "프로시져 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "발행 정보 바꾸기"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 롤 변경"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "루틴 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "룰 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "스키마 ì´ë¦„ 바꾸기"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "시퀀스 정보 바꾸기"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "외부 서버 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "확장 통계정보 ê°ì²´ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "êµ¬ë… ì •ë³´ 바꾸기"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "서버 환경 설정 매개 변수 바꾸기"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "í…Œì´ë¸” ì •ë³´ 바꾸기"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "í…스트 검색 구성 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "í…스트 검색 사전 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "í…스트 검색 파서 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "í…스트 검색 템플릿 ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "트리거 정보 바꾸기"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "ìžë£Œí˜• ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "ì‚¬ìš©ìž ë§¤í•‘ ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "ë·° ì •ì˜ ë°”ê¾¸ê¸°"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 사용 통계 정보를 갱신함"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "트랜잭션 ë¸”ëŸ­ì„ ì‹œìž‘í•¨"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "프로시져 호출"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "트랜잭션 로그를 강제로 ì²´í¬í¬ì¸íŠ¸ 함"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "커서 닫기"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "지정한 ì¸ë±ìŠ¤ 기준으로 í…Œì´ë¸” ìžë£Œë¥¼ 다시 저장함"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "해당 ê°œì²´ì˜ ì½”ë©˜íŠ¸ë¥¼ 지정하거나 수정함"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "현재 트랜잭션 commit"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "two-phase ì»¤ë°‹ì„ ìœ„í•´ 먼저 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹í•˜ì„¸ìš”."
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "í…Œì´ë¸”ê³¼ íŒŒì¼ ì‚¬ì´ ìžë£Œë¥¼ 복사함"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "새 ì ‘ì† ë°©ë²• ì •ì˜"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "새 집계합수 만들기"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "새 í˜•ë³€í™˜ìž ë§Œë“¤ê¸°"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "새 collation 만들기"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "새 문ìžì½”드변환규칙(conversion) 만들기"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ìƒì„±"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "새 ë„ë©”ì¸ ë§Œë“¤ê¸°"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "새 ì´ë²¤íŠ¸ 트리거 만들기"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "확장 모듈 설치"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "새 외부 ë°ì´í„° ëž˜í¼ ì •ì˜"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "새 외부 í…Œì´ë¸” ì •ì˜"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "새 함수 만들기"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "새 ë°ì´í„°ë² ì´ìŠ¤ 롤 만들기"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "새 ì¸ë±ìŠ¤ 만들기"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "새 프로시주얼 언어 만들기"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "새 materialized 뷰 만들기"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "새 ì—°ì‚°ìž ë§Œë“¤ê¸°"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "새 ì—°ìž”ìž í´ëž˜ìŠ¤ 만들기"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "새 ì—°ì‚°ìž ë¶€ë¥˜ 만들기"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "특정 í…Œì´ë¸”ì— ë¡œìš° 단위 보안 ì •ì±… ì •ì˜"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "새 프로시져 만들기"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "새 발행 만들기"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "새 룰(rule) 만들기"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "새 스키마(schema) 만들기"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "새 시퀀스 만들기"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "새 외부 서버 ì •ì˜"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "새 확장 통계정보 만들기"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "새 êµ¬ë… ë§Œë“¤ê¸°"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "새 í…Œì´ë¸” 만들기"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "쿼리 결과를 새 í…Œì´ë¸”ë¡œ 만들기"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "새 í…Œì´ë¸”스페ì´ìŠ¤ 만들기"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "새 í…스트 검색 구성 ì •ì˜"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "새 í…스트 검색 사전 ì •ì˜"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "새 í…스트 검색 파서 ì •ì˜"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "새 í…스트 검색 템플릿 ì •ì˜"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "새 transform 만들기"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "새 트리거 만들기"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "새 ìžë£Œí˜• 만들기"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "사용ìžì™€ 외부 서버 ê°„ì˜ ìƒˆ 매핑 ì •ì˜"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "새 view 만들기"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "ì¤€ë¹„ëœ êµ¬ë¬¸(prepared statement) 지우기"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "커서 지정"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "í…Œì´ë¸”ì˜ ìžë£Œ ì‚­ì œ"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "세션 ìƒíƒœ ì‚­ì œ"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "ìž„ì˜ ì½”ë“œ ë¸”ë¡ ì‹¤í–‰"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "접근 방법 삭제"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "집계 함수 삭제"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "í˜•ë³€í™˜ìž ì‚­ì œ"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "collation 삭제"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "문ìžì½”ë“œ 변환규칙(conversion) ì‚­ì œ"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì‚­ì œ"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "ë„ë©”ì¸ ì‚­ì œ"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "ì´ë²¤íŠ¸ 트리거 ì‚­ì œ"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "확장 모듈 삭제"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "외부 ë°ì´í„° ëž˜í¼ ì œê±°"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "외부 í…Œì´ë¸” ì‚­ì œ"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "함수 삭제"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 롤 ì‚­ì œ"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "ì¸ë±ìŠ¤ ì‚­ì œ"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "프로시주얼 언어 삭제"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "materialized 뷰 삭제"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "ì—°ì‚°ìž ì‚­ì œ"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "ì—°ì‚°ìž í´ëž˜ìŠ¤ ì‚­ì œ"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "ì—°ì‚°ìž ë¶€ë¥˜ ì‚­ì œ"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 롤로 ê¶Œí•œì´ ë¶€ì—¬ëœ ë°ì´í„°ë² ì´ìŠ¤ ê°œì²´ë“¤ì„ ì‚­ì œí•˜ì„¸ìš”"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "해당 í…Œì´ë¸”ì— ì •ì˜ëœ 로우 단위 보안 ì •ì±… ì‚­ì œ"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "프로시져 삭제"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "발행 삭제"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "루틴 삭제"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "룰(rule) 삭제"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "스키마(schema) 삭제"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "시퀀스 삭제"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "외부 서버 ì„¤ëª…ìž ì œê±°"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "확장 통계정보 삭제"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "êµ¬ë… ì‚­ì œ"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "í…Œì´ë¸” ì‚­ì œ"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "í…Œì´ë¸”스페ì´ìŠ¤ ì‚­ì œ"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "í…스트 검색 구성 제거"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "í…스트 검색 사전 제거"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "í…스트 검색 파서 제거"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "í…스트 검색 템플릿 제거"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "transform 삭제"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "트리거 삭제"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "ìžë£Œí˜• ì‚­ì œ"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "외부 ì„œë²„ì— ëŒ€í•œ ì‚¬ìš©ìž ë§¤í•‘ 제거"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "뷰(view) 삭제"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "ì¤€ë¹„ëœ êµ¬ë¬¸(prepared statement) 실행"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "쿼리 ì‹¤í–‰ê³„íš ë³´ê¸°"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "해당 커서ì—ì„œ ìžë£Œ 뽑기"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "액세스 권한 지정하기"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "외부 서버로부터 í…Œì´ë¸” ì •ì˜ ê°€ì ¸ì˜¤ê¸°"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "í…Œì´ë¸” ìžë£Œ 삽입"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "특정 서버 메시지 수신함"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "공유 ë¼ì´ë¸ŒëŸ¬ë¦¬ íŒŒì¼ ë¡œë“œ"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "í…Œì´ë¸” 잠금"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "조건부 í…Œì´ë¸” insert, update, delete"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "커서 위치 옮기기"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "특정 서버 메시지 ë°œìƒ"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "ì¤€ë¹„ëœ êµ¬ë¬¸(prepared statement) 만들기"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "two-phase ì»¤ë°‹ì„ ìœ„í•´ 현재 íŠ¸ëžœìž­ì…˜ì„ ì¤€ë¹„í•¨"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 롤로 ê¶Œí•œì´ ë¶€ì—¬ëœ ë°ì´í„°ë² ì´ìŠ¤ ê°œì²´ë“¤ì˜ ì†Œìœ ì£¼ 바꾸기"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "êµ¬ì²´í™”ëœ ë·°ì˜ ë‚´ìš© 수정"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "ì¸ë±ìŠ¤ 다시 만들기"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "ì´ì „ ì •ì˜ëœ savepoint를 지움"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "실시간 환경 ë³€ìˆ˜ê°’ì„ ì´ˆê¸°ê°’ìœ¼ë¡œ 다시 지정"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "액세스 권한 해제하기"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "two-phase ì»¤ë°‹ì„ ìœ„í•´ 먼저 준비ë˜ì—ˆë˜ 트랜잭션 실행취소하기"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "savepoint 파기하기"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "현재 트랜잭션ì—ì„œ 새로운 savepoint 만들기"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "해당 ê°œì²´ì— ë³´ì•ˆ ë¼ë²¨ì„ ì •ì˜í•˜ê±°ë‚˜ 변경"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "í…Œì´ë¸”ì´ë‚˜ ë·°ì˜ ìžë£Œë¥¼ 출력"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "실시간 환경 변수값 바꾸기"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "현재 트랜잭션ì—ì„œ 제약조건 설정"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "현재 ì„¸ì…˜ì˜ í˜„ìž¬ ì‚¬ìš©ìž ì‹ë³„ìžë¥¼ 지정"
+
+#: sql_help.c:6193
+msgid ""
+"set the session user identifier and the current user identifier of the "
+"current session"
+msgstr "현재 ì„¸ì…˜ì˜ ì‚¬ìš©ìž ì¸ì¦ì„ 지정함 - ì‚¬ìš©ìž ì§€ì •"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "현재 íŠ¸ëžœìž­ì…˜ì˜ ì„±ì§ˆì„ ì§€ì •í•¨"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "실시간 환경 ë³€ìˆ˜ê°’ë“¤ì„ ë³´ì—¬ì¤Œ"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "하나 ë˜ëŠ” 지정한 ì—¬ëŸ¬ê°œì˜ í…Œì´ë¸”ì—ì„œ 모든 ìžë£Œ 지움"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "특정 서버 메시지 수신 기능 ë”"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "í…Œì´ë¸” ìžë£Œ 갱신"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "물리ì ì¸ ìžë£Œ 정리 ìž‘ì—… - 쓰레기값 청소"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "compute a set of rows"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 ì˜µì…˜ì€ ë¹„ëŒ€í™”í˜• 모드ì—서만 사용할 수 있ìŒ"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" 잠금파ì¼ì„ ì—´ 수 ì—†ìŒ: %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"ë„움ë§ì„ 보려면 \"help\"를 입력하십시오.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "출력 매개 변수 \"%s\" 지정할 수 ì—†ìŒ"
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "추가 명령행 ì¸ìž \"%s\" 무시ë¨"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "실행 가능한 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"탭 ìžë™ì™„성용 쿼리 실패: %s\n"
+"사용한 쿼리:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "ìž˜ëª»ëœ \"%s\" ê°’ì„ \"%s\" 변수값으로 사용함: 불린형ì´ì–´ì•¼ 함"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%s\" ê°’ì€ \"%s\" 변수값으로 사용할 수 ì—†ìŒ; 정수형ì´ì–´ì•¼ 함"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ìž˜ëª»ëœ ë³€ìˆ˜ ì´ë¦„: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%s\" ê°’ì€ \"%s\" 변수값으로 사용할 수 ì—†ìŒ\n"
+"사용할 수 있는 변수값: %s"
diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build
new file mode 100644
index 0000000..103ed93
--- /dev/null
+++ b/src/bin/psql/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('psql-' + pg_version_major.to_string())]
diff --git a/src/bin/psql/po/pl.po b/src/bin/psql/po/pl.po
new file mode 100644
index 0000000..ee7d023
--- /dev/null
+++ b/src/bin/psql/po/pl.po
@@ -0,0 +1,5762 @@
+# Polish message translation file for psql
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-04-09 21:15+0000\n"
+"PO-Revision-Date: 2017-04-10 17:55+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284
+#, c-format
+msgid "could not identify current directory: %s"
+msgstr "nie można zidentyfikować aktualnego katalogu: %s"
+
+#: ../../common/exec.c:146
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "niepoprawny binarny \"%s\""
+
+#: ../../common/exec.c:195
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "nie można odczytać binarnego \"%s\""
+
+#: ../../common/exec.c:202
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "nie znaleziono \"%s\" do wykonania"
+
+#: ../../common/exec.c:257 ../../common/exec.c:293
+#, c-format
+msgid "could not change directory to \"%s\": %s"
+msgstr "nie można zmienić katalogu na \"%s\": %s"
+
+#: ../../common/exec.c:272
+#, c-format
+msgid "could not read symbolic link \"%s\""
+msgstr "nie można odczytać odwołania symbolicznego \"%s\""
+
+#: ../../common/exec.c:523
+#, c-format
+msgid "pclose failed: %s"
+msgstr "pclose nie powiodło się: %s"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 command.c:612 input.c:227 mainloop.c:82
+#: mainloop.c:276
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nie udało się odnaleźć efektywnego ID użytkownika %ld: %s"
+
+#: ../../common/username.c:45 command.c:559
+msgid "user does not exist"
+msgstr "użytkownik nie istnieje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "niepowodzenie wyszukiwania nazwy użytkownika: kod błędu %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "polecenie nie wykonywalne"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "polecenia nie znaleziono"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "proces potomny zakończył działanie z kodem %d"
+
+#: ../../common/wait_error.c:61
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "proces potomny został zatrzymany przez wyjątek 0x%X"
+
+#: ../../common/wait_error.c:71
+#, c-format
+msgid "child process was terminated by signal %s"
+msgstr "proces potomny został zatrzymany przez sygnał %s"
+
+#: ../../common/wait_error.c:75
+#, c-format
+msgid "child process was terminated by signal %d"
+msgstr "proces potomny został zakończony przez sygnał %d"
+
+#: ../../common/wait_error.c:80
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "proces potomny zakończył działanie z nieznanym stanem %d"
+
+#: ../../fe_utils/print.c:353
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu wiersz)"
+msgstr[1] "(%lu wiersze)"
+msgstr[2] "(%lu wierszy)"
+
+#: ../../fe_utils/print.c:2913
+#, c-format
+msgid "Interrupted\n"
+msgstr "Przerwane\n"
+
+#: ../../fe_utils/print.c:2977
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Nie można dodać nagłówka do zawartości tabeli: przekroczona liczba kolumn %d.\n"
+
+#: ../../fe_utils/print.c:3017
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Nie można dodać komórki do zawartości tabeli: przekroczona liczba komórek %d.\n"
+
+#: ../../fe_utils/print.c:3266
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "niepoprawny format wyjścia (błąd wewnętrzny): %d"
+
+#: ../../fe_utils/psqlscan.l:713
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\"\n"
+msgstr "pomijanie rekurencyjnego rozszerzania zmiennej \"%s\"\n"
+
+#: command.c:227
+#, c-format
+msgid "Invalid command \\%s. Try \\? for help.\n"
+msgstr "Niepoprawne polecenie \\%s. Spróbuj \\? by uzyskać pomoc.\n"
+
+#: command.c:229
+#, c-format
+msgid "invalid command \\%s\n"
+msgstr "niepoprawne polecenie \\%s\n"
+
+#: command.c:247
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored\n"
+msgstr "\\%s: nadmiarowy argument \"%s\" zignorowany\n"
+
+#: command.c:299
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block\n"
+msgstr "\\%s - polecenie pominięte; użyj \\endif lub Ctrl-C by wyjść z bieżącego bloku "
+"\\if\n"
+
+#: command.c:557
+#, c-format
+msgid "could not get home directory for user ID %ld: %s\n"
+msgstr "nie można pobrać folderu domowego dla ID użytkownika %ld: %s\n"
+
+#: command.c:575
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %s\n"
+msgstr "\\%s: nie można zmienić katalogu na \"%s\": %s\n"
+
+#: command.c:600 common.c:648 common.c:706 common.c:1242
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Nie jesteś obecnie połączony do bazy danych.\n"
+
+#: command.c:625
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Jesteś obecnie połączony do bazy danych \"%s\" jako użytkownik \"%s\" przez gniazdo w \"%s\" port \"%s\".\n"
+
+#: command.c:628
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Jesteś obecnie połączony do bazy danych \"%s\" jako użytkownik \"%s\" na serwerze \"%s\" port \"%s\".\n"
+
+#: command.c:916 command.c:1006 command.c:1115 command.c:2524
+#, c-format
+msgid "no query buffer\n"
+msgstr "brak bufora zapytania\n"
+
+#: command.c:949 command.c:4761
+#, c-format
+msgid "invalid line number: %s\n"
+msgstr "nieprawidłowy numer linii: %s\n"
+
+#: command.c:999
+#, c-format
+msgid "The server (version %s) does not support editing function source.\n"
+msgstr "Serwer (wersja %s) nie obsługuje edycji źródła funkcji.\n"
+
+#: command.c:1074 command.c:1155
+msgid "No changes"
+msgstr "Bez zmian"
+
+#: command.c:1108
+#, c-format
+msgid "The server (version %s) does not support editing view definitions.\n"
+msgstr "Serwer (wersja %s) nie obsługuje edycji definicji widoków.\n"
+
+#: command.c:1232
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found\n"
+msgstr "%s: nieprawidłowa nazwa kodowania lub nie znaleziono procedury konwersji\n"
+
+#: command.c:1267 command.c:3165 command.c:4863 common.c:173 common.c:244
+#: common.c:541 common.c:1288 common.c:1316 common.c:1417 copy.c:489
+#: copy.c:699 large_obj.c:156 large_obj.c:191 large_obj.c:253
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1271
+msgid "out of memory"
+msgstr "brak pamięci"
+
+#: command.c:1274
+msgid "There is no previous error."
+msgstr "Nie ma poprzedniego błędu."
+
+#: command.c:1445 command.c:1750 command.c:1764 command.c:1781 command.c:1941
+#: command.c:2178 command.c:2491 command.c:2531
+#, c-format
+msgid "\\%s: missing required argument\n"
+msgstr "\\%s: brakujÄ…cy wymagany argument\n"
+
+#: command.c:1576
+#, c-format
+msgid "\\elif: cannot occur after \\else\n"
+msgstr "\\elif: nie może wystąpić po \\else\n"
+
+#: command.c:1581
+#, c-format
+msgid "\\elif: no matching \\if\n"
+msgstr "\\elif: brak pasujÄ…cego \\if\n"
+
+#: command.c:1645
+#, c-format
+msgid "\\else: cannot occur after \\else\n"
+msgstr "\\else: nie może wystąpić po \\else\n"
+
+#: command.c:1650
+#, c-format
+msgid "\\else: no matching \\if\n"
+msgstr "\\else: brak pasujÄ…cego \\if\n"
+
+#: command.c:1690
+#, c-format
+msgid "\\endif: no matching \\if\n"
+msgstr "\\endif: brak pasujÄ…cego \\if\n"
+
+#: command.c:1845
+msgid "Query buffer is empty."
+msgstr "Bufor zapytania jest pusty."
+
+#: command.c:1867
+msgid "Enter new password: "
+msgstr "Wprowadź nowe hasło: "
+
+#: command.c:1868
+msgid "Enter it again: "
+msgstr "Powtórz podane hasło: "
+
+#: command.c:1872
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Podane hasła różnią się.\n"
+
+#: command.c:1889
+#, c-format
+msgid "Password encryption failed.\n"
+msgstr "Nie udało się zaszyfrować hasła.\n"
+
+#: command.c:1971
+#, c-format
+#| msgid "%s: could not delete variable \"%s\"\n"
+msgid "\\%s: could not read value for variable\n"
+msgstr "\\%s: nie można odczytać wartości zmiennej\n"
+
+#: command.c:2074
+msgid "Query buffer reset (cleared)."
+msgstr "Reset bufora zapytania (wyczyszczony)."
+
+#: command.c:2096
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Zapisano historiÄ™ do pliku \"%s\".\n"
+
+#: command.c:2183
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\"\n"
+msgstr "\\%s: zmienna środowiska nie może zawierać \"=\"\n"
+
+#: command.c:2239
+#, c-format
+msgid "The server (version %s) does not support showing function source.\n"
+msgstr "Serwer (wersja %s) nie obsługuje wyświetlania źródła funkcji.\n"
+
+#: command.c:2246
+#, c-format
+msgid "function name is required\n"
+msgstr "wymagana jest nazwa funkcji\n"
+
+#: command.c:2333
+#, c-format
+msgid "The server (version %s) does not support showing view definitions.\n"
+msgstr "Serwer (wersja %s) nie obsługuje wyświetlania definicji widoków.\n"
+
+#: command.c:2340
+#, c-format
+msgid "view name is required\n"
+msgstr "wymagana jest nazwa widoku\n"
+
+#: command.c:2463
+msgid "Timing is on."
+msgstr "Pomiar czasu włączony."
+
+#: command.c:2465
+msgid "Timing is off."
+msgstr "Pomiar czasu wyłączony."
+
+#: command.c:2550 command.c:2578 command.c:3514 command.c:3517 command.c:3520
+#: command.c:3526 command.c:3528 command.c:3536 command.c:3546 command.c:3555
+#: command.c:3569 command.c:3586 command.c:3644 common.c:69 copy.c:332
+#: copy.c:392 copy.c:405 psqlscanslash.l:760 psqlscanslash.l:771
+#: psqlscanslash.l:781
+#, c-format
+msgid "%s: %s\n"
+msgstr "%s: %s\n"
+
+#: command.c:2957 startup.c:202
+msgid "Password: "
+msgstr "Hasło: "
+
+#: command.c:2962 startup.c:204
+#, c-format
+msgid "Password for user %s: "
+msgstr "Hasło użytkownika %s: "
+
+#: command.c:3012
+#, c-format
+msgid "All connection parameters must be supplied because no database connection exists\n"
+msgstr "Wszystkie parametry połączenia muszą być wskazane ponieważ nie istnieje żadne połączenie do bazy danych\n"
+
+#: command.c:3169
+#, c-format
+msgid "Previous connection kept\n"
+msgstr "Poprzednie połączenie zachowane\n"
+
+#: command.c:3173
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3209
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Jesteś obecnie połączony do bazy danych \"%s\" jako użytkownik \"%s\" przez gniazdo na \"%s\" port \"%s\".\n"
+
+#: command.c:3212
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Jesteś obecnie połączony do bazy danych \"%s\" jako użytkownik \"%s\" na serwerze \"%s\" port \"%s\".\n"
+
+#: command.c:3216
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Jesteś obecnie połączony do bazy danych \"%s\" jako użytkownik \"%s\".\n"
+
+#: command.c:3249
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, serwer %s)\n"
+
+#: command.c:3257
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"OSTRZEŻENIE: %s wersja główna %s, wersja główna serwera %s.\n"
+" Niektóre cechy psql mogą nie działać.\n"
+
+#: command.c:3294
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "Połączenie SSL (protokół: %s, szyfrowanie: %s, bity: %s, kompresja %s)\n"
+
+#: command.c:3295 command.c:3296 command.c:3297
+msgid "unknown"
+msgstr "nieznany"
+
+#: command.c:3298 help.c:45
+msgid "off"
+msgstr "wyłączone"
+
+#: command.c:3298 help.c:45
+msgid "on"
+msgstr "włączone"
+
+#: command.c:3318
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"OSTRZEŻENIE: strona kodowa konsoli (%u) jest różna od kodowania Windows (%u)\n"
+" 8-bitowe znaki mogą nie wyglądać poprawnie. Przejrzyj odnośną\n"
+" stronę \"Notes for Windows users\" by poznać szczegóły.\n"
+
+#: command.c:3403
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number\n"
+msgstr "musi być ustawiona zmienna środowiskowa PSQL_EDITOR_LINENUMBER_ARG by wskazać numer linii\n"
+
+#: command.c:3432
+#, c-format
+msgid "could not start editor \"%s\"\n"
+msgstr "nie można uruchomić edytora \"%s\"\n"
+
+#: command.c:3434
+#, c-format
+msgid "could not start /bin/sh\n"
+msgstr "nie można uruchomić /bin/sh\n"
+
+#: command.c:3472
+#, c-format
+msgid "could not locate temporary directory: %s\n"
+msgstr "nie można utworzyć katalogu tymczasowego: %s\n"
+
+#: command.c:3499
+#, c-format
+msgid "could not open temporary file \"%s\": %s\n"
+msgstr "nie można otworzyć pliku tymczasowego \"%s\": %s\n"
+
+#: command.c:3773
+#, c-format
+msgid "\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n"
+msgstr "\\pset: dostępnymi formatami są unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n"
+
+#: command.c:3791
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n"
+msgstr "\\pset: dostępne style linii to ascii, old-ascii, unicode\n"
+
+#: command.c:3806
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double\n"
+msgstr "\\pset: dostępne Unikodowe style linii ramki to pojedyncza, podwójna\n"
+
+#: command.c:3821
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double\n"
+msgstr "\\pset: dostępne Unikodowe style linii kolumny to pojedyncza, podwójna\n"
+
+#: command.c:3836
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double\n"
+msgstr "\\pset: dostępne Unikodowe style linii nagłówka to pojedyncza, podwójna\n"
+
+#: command.c:4001 command.c:4180
+#, c-format
+msgid "\\pset: unknown option: %s\n"
+msgstr "\\pset: nieznana opcja: %s\n"
+
+#: command.c:4019
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Styl obramowania to %d.\n"
+
+#: command.c:4025
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Szerokość celu nieustawiona.\n"
+
+#: command.c:4027
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Szerokość celu to %d.\n"
+
+#: command.c:4034
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Rozszerzone wyświetlanie jest włączone.\n"
+
+#: command.c:4036
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Rozszerzone wyświetlanie jest stosowane automatycznie.\n"
+
+#: command.c:4038
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Rozszerzone wyświetlanie jest wyłączone.\n"
+
+#: command.c:4045 command.c:4053
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Separatorem pól jest bajt zero.\n"
+
+#: command.c:4047
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Separatorem pól jest \"%s\".\n"
+
+#: command.c:4060
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Domyślna stopka jest włączona.\n"
+
+#: command.c:4062
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Domyślna stopka jest wyłączona.\n"
+
+#: command.c:4068
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Format wyjścia to %s.\n"
+
+#: command.c:4074
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Styl linii to %s.\n"
+
+#: command.c:4081
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Wyświetlanie Null jako \"%s\".\n"
+
+#: command.c:4089
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Dostosowane do lokalizacji wyświetlanie liczb jest włączone.\n"
+
+#: command.c:4091
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Dostosowane do lokalizacji wyświetlanie liczb jest wyłączone.\n"
+
+#: command.c:4098
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Stronicowanie jest używane dla długiego wyjścia.\n"
+
+#: command.c:4100
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Stronicowanie zawsze używane.\n"
+
+#: command.c:4102
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Stronicowanie nigdy nie używane.\n"
+
+#: command.c:4108
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Stronicowanie nie będzie używane dla mniej niż %d linii.\n"
+msgstr[1] "Stronicowanie nie będzie używane dla mniej niż %d linii.\n"
+msgstr[2] "Stronicowanie nie będzie używane dla mniej niż %d linii.\n"
+
+#: command.c:4118 command.c:4128
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Separatorem rekordów jest bajt zero.\n"
+
+#: command.c:4120
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Separatorem rekordów jest <newline>.\n"
+
+#: command.c:4122
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Separatorem rekordów jest \"%s\".\n"
+
+#: command.c:4135
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Atrybuty tabeli to \"%s\".\n"
+
+#: command.c:4138
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Atrybuty tabeli nie sÄ… ustawione.\n"
+
+#: command.c:4145
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Tytuł to \"%s\".\n"
+
+#: command.c:4147
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Tytuł nie jest ustawiony.\n"
+
+#: command.c:4154
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Tylko krotki włączone.\n"
+
+#: command.c:4156
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Tylko krotki wyłączone.\n"
+
+#: command.c:4162
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unikodowy styl linii obramowania to \"%s\".\n"
+
+#: command.c:4168
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unikodowy styl linii kolumn to \"%s\".\n"
+
+#: command.c:4174
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unikodowy styl linii nagłówka to \"%s\".\n"
+
+#: command.c:4334
+#, c-format
+msgid "\\!: failed\n"
+msgstr "\\!: niepowodzenie\n"
+
+#: command.c:4359 common.c:754
+#, c-format
+msgid "\\watch cannot be used with an empty query\n"
+msgstr "\\watch nie może być użyte z pustym zapytaniem\n"
+
+#: command.c:4400
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (każdy %gs)\n"
+
+#: command.c:4403
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (każdy %gs)\n"
+
+#: command.c:4457 command.c:4464 common.c:654 common.c:661 common.c:1271
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* ZAPYTANIE **********\n"
+"%s\n"
+"******************************\n"
+"\n"
+
+#: command.c:4656
+#, c-format
+msgid "\"%s.%s\" is not a view\n"
+msgstr "\"%s.%s\" nie jest widokiem\n"
+
+#: command.c:4672
+#, c-format
+msgid "could not parse reloptions array\n"
+msgstr "nie można przeanalizować tablicy reloptions\n"
+
+#: common.c:158
+#, c-format
+msgid "cannot escape without active connection\n"
+msgstr "nie można uciec bez aktywnego połączenia\n"
+
+#: common.c:199
+#, c-format
+#| msgid "COPY delimiter cannot be newline or carriage return"
+msgid "shell command argument contains a newline or carriage return: \"%s\"\n"
+msgstr "argument polecenia powłoki zawiera znak nowej linii lub powrotu karetki: \"%"
+"s\"\n"
+
+#: common.c:415
+#, c-format
+msgid "connection to server was lost\n"
+msgstr "utracono połączenie z serwerem\n"
+
+#: common.c:419
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Połączenie z serwerem zostało przerwane. Próba resetu: "
+
+#: common.c:424
+#, c-format
+msgid "Failed.\n"
+msgstr "Nieudane.\n"
+
+#: common.c:431
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Udane.\n"
+
+#: common.c:531 common.c:1034 common.c:1206
+#, c-format
+msgid "unexpected PQresultStatus: %d\n"
+msgstr "nieoczekiwany PQresultStatus: %d\n"
+
+#: common.c:593
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Czas: %.3f ms\n"
+
+#: common.c:608
+#, c-format
+#| msgid "Time: %.3f ms\n"
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Czas: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:617
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Czas: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:624
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Czas: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:761
+#, c-format
+msgid "\\watch cannot be used with COPY\n"
+msgstr "\\watch nie może być użyte z COPY\n"
+
+#: common.c:766
+#, c-format
+msgid "unexpected result status for \\watch\n"
+msgstr "nieoczekiwany stan wyniku dla \\watch\n"
+
+#: common.c:795
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchroniczne powiadomienie \"%s\" o Å‚adunku \"%s\" otrzymano z procesu serwera PID %d.\n"
+
+#: common.c:798
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynchroniczne powiadomienie \"%s\" otrzymano z procesu serwera PID %d.\n"
+
+#: common.c:860
+#, c-format
+msgid "no rows returned for \\gset\n"
+msgstr "nie zwrócono żadnych wierszy z \\gset\n"
+
+#: common.c:865
+#, c-format
+msgid "more than one row returned for \\gset\n"
+msgstr "więcej niż jeden wiersz zwrócony z \\gset\n"
+
+#: common.c:1251
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Tryb jednokrokowy: sprawdzenie polecenia)***********************************\n"
+"%s\n"
+"***(wciśnij enter by iść dalej lub x i enter by anulować)***********************\n"
+
+#: common.c:1306
+#, c-format
+msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n"
+msgstr "Serwer (wersja %s) nie obsługuje punktów zapisu dla ON_ERROR_ROLLBACK.\n"
+
+#: common.c:1362
+#, c-format
+msgid "STATEMENT: %s\n"
+msgstr "WYRAŻENIE: %s\n"
+
+#: common.c:1405
+#, c-format
+msgid "unexpected transaction status (%d)\n"
+msgstr "nieoczekiwany status transakcji (%d)\n"
+
+#: copy.c:99
+#, c-format
+msgid "\\copy: arguments required\n"
+msgstr "\\copy: wymagane sÄ… argumenty\n"
+
+#: copy.c:254
+#, c-format
+msgid "\\copy: parse error at \"%s\"\n"
+msgstr "\\copy: błąd analizy przy \"%s\"\n"
+
+#: copy.c:256
+#, c-format
+msgid "\\copy: parse error at end of line\n"
+msgstr "\\copy: błąd analizy na końcu linii\n"
+
+#: copy.c:329
+#, c-format
+msgid "could not execute command \"%s\": %s\n"
+msgstr "nie można wykonać polecenia \"%s\": %s\n"
+
+#: copy.c:345
+#, c-format
+msgid "could not stat file \"%s\": %s\n"
+msgstr "nie można wykonać stat na pliku \"%s\": %s\n"
+
+#: copy.c:349
+#, c-format
+msgid "%s: cannot copy from/to a directory\n"
+msgstr "%s: nie można kopiować z/do folderu\n"
+
+#: copy.c:386
+#, c-format
+msgid "could not close pipe to external command: %s\n"
+msgstr "nie można zamknąć potoku do polecenia zewnętrznego: %s\n"
+
+#: copy.c:452 copy.c:463
+#, c-format
+msgid "could not write COPY data: %s\n"
+msgstr "nie można zapisać danych COPY: %s\n"
+
+#: copy.c:470
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "transfer danych COPY nie powiódł się: %s"
+
+#: copy.c:531
+msgid "canceled by user"
+msgstr "anulowane przez użytkownika"
+
+#: copy.c:542
+msgid ""
+"Enter data to be copied followed by a newline.\n"
+"End with a backslash and a period on a line by itself."
+msgstr ""
+"Wprowadź dane do skopiowania poprzedzone nową linią.\n"
+"Zakończ linią zawierająca tylko odwróconym ukośnikiem i spację."
+
+#: copy.c:671
+msgid "aborted because of read failure"
+msgstr "przerwane na skutek nieudanego odczytu"
+
+#: copy.c:695
+msgid "trying to exit copy mode"
+msgstr "próba wyjścia z trybu kopiowanie"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set\n"
+msgstr "\\crosstabview: polecenie nie utworzyło zbioru wynikowego\n"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns\n"
+msgstr "\\crosstabview: zapytanie musi zwracać co najmniej trzy kolumny\n"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns\n"
+msgstr "\\crosstabview: nagłówki pionowe i poziome muszą być różnymi kolumnami\n"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns\n"
+msgstr "\\crosstabview: kolumna danych musi być wskazana gdy wynik zapytania zwraca więcej niż trzy kolumny\n"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded\n"
+msgstr "\\crosstabview: przekroczona maksymalna liczba kolumn (%d)\n"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"\n"
+msgstr "\\crosstabview: wynik zapytania zawiera wiele wartości danych w wierszu \"%s\", kolumnie \"%s\"\n"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d\n"
+msgstr "\\crosstabview: numer kolumny %d wykracza poza zakres 1..%d\n"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\"\n"
+msgstr "\\crosstabview: wieloznaczna nazwa kolumny: \"%s\"\n"
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\"\n"
+msgstr "\\crosstabview: nie znaleziono nazwy kolumny: \"%s\"\n"
+
+#: describe.c:73 describe.c:342 describe.c:599 describe.c:730 describe.c:874
+#: describe.c:1035 describe.c:1107 describe.c:3294 describe.c:3500
+#: describe.c:3591 describe.c:3839 describe.c:3984 describe.c:4216
+#: describe.c:4291 describe.c:4302 describe.c:4364 describe.c:4784
+#: describe.c:4867
+msgid "Schema"
+msgstr "Schemat"
+
+#: describe.c:74 describe.c:162 describe.c:228 describe.c:236 describe.c:343
+#: describe.c:600 describe.c:731 describe.c:792 describe.c:875 describe.c:1108
+#: describe.c:3295 describe.c:3423 describe.c:3501 describe.c:3592
+#: describe.c:3671 describe.c:3840 describe.c:3909 describe.c:3985
+#: describe.c:4217 describe.c:4292 describe.c:4303 describe.c:4365
+#: describe.c:4557 describe.c:4641 describe.c:4865 describe.c:5032
+#: describe.c:5220
+msgid "Name"
+msgstr "Nazwa"
+
+#: describe.c:75 describe.c:355 describe.c:401 describe.c:418
+msgid "Result data type"
+msgstr "Typ danych wyniku"
+
+#: describe.c:83 describe.c:96 describe.c:100 describe.c:356 describe.c:402
+#: describe.c:419
+msgid "Argument data types"
+msgstr "Typy danych argumentów"
+
+#: describe.c:107 describe.c:172 describe.c:259 describe.c:464 describe.c:648
+#: describe.c:746 describe.c:817 describe.c:1110 describe.c:1746
+#: describe.c:3094 describe.c:3329 describe.c:3454 describe.c:3528
+#: describe.c:3601 describe.c:3684 describe.c:3752 describe.c:3852
+#: describe.c:3918 describe.c:3986 describe.c:4122 describe.c:4162
+#: describe.c:4233 describe.c:4295 describe.c:4304 describe.c:4366
+#: describe.c:4583 describe.c:4663 describe.c:4798 describe.c:4868
+#: large_obj.c:289 large_obj.c:299
+msgid "Description"
+msgstr "Opis"
+
+#: describe.c:125
+msgid "List of aggregate functions"
+msgstr "Lista funkcji agregujÄ…cych"
+
+#: describe.c:149
+#, c-format
+msgid "The server (version %s) does not support access methods.\n"
+msgstr "Serwer (wersja %s) nie obsługuje metod dostępu.\n"
+
+#: describe.c:163
+msgid "Index"
+msgstr "Indeks"
+
+#: describe.c:164 describe.c:362 describe.c:407 describe.c:424 describe.c:882
+#: describe.c:1046 describe.c:1706 describe.c:3304 describe.c:3502
+#: describe.c:4660
+msgid "Type"
+msgstr "Typ"
+
+#: describe.c:171 describe.c:4562
+msgid "Handler"
+msgstr "Uchwyt"
+
+#: describe.c:190
+msgid "List of access methods"
+msgstr "Lista metod dostępu"
+
+#: describe.c:215
+#, c-format
+msgid "The server (version %s) does not support tablespaces.\n"
+msgstr "Serwer (wersja %s) nie obsługuje przestrzeni tabel.\n"
+
+#: describe.c:229 describe.c:237 describe.c:452 describe.c:638 describe.c:793
+#: describe.c:1034 describe.c:3305 describe.c:3427 describe.c:3673
+#: describe.c:3910 describe.c:4558 describe.c:4642 describe.c:5033
+#: describe.c:5221 large_obj.c:288
+msgid "Owner"
+msgstr "Właściciel"
+
+#: describe.c:230 describe.c:238
+msgid "Location"
+msgstr "Położenie"
+
+#: describe.c:249 describe.c:2909
+msgid "Options"
+msgstr "Opcje"
+
+#: describe.c:254 describe.c:611 describe.c:809 describe.c:3321
+#: describe.c:3325
+msgid "Size"
+msgstr "Rozmiar"
+
+#: describe.c:276
+msgid "List of tablespaces"
+msgstr "Lista przestrzeni tabel"
+
+#: describe.c:316
+#, c-format
+msgid "\\df only takes [antwS+] as options\n"
+msgstr "\\df przyjmuje tylko opcje [antwS+]\n"
+
+#: describe.c:324
+#, c-format
+msgid "\\df does not take a \"w\" option with server version %s\n"
+msgstr "\\df nie przyjmuje opcji \"w\" w wersji serwera %s\n"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:358 describe.c:404 describe.c:421
+msgid "agg"
+msgstr "agreg"
+
+#: describe.c:359
+msgid "window"
+msgstr "okno"
+
+#: describe.c:360 describe.c:405 describe.c:422 describe.c:1244
+msgid "trigger"
+msgstr "wyzwalacz"
+
+#: describe.c:361 describe.c:406 describe.c:423
+msgid "normal"
+msgstr "zwykły"
+
+#: describe.c:434
+msgid "immutable"
+msgstr "niezmienny"
+
+#: describe.c:435
+msgid "stable"
+msgstr "stabilny"
+
+#: describe.c:436
+msgid "volatile"
+msgstr "zmienny"
+
+#: describe.c:437
+msgid "Volatility"
+msgstr "Zmienność"
+
+#: describe.c:445
+msgid "restricted"
+msgstr "ograniczony"
+
+#: describe.c:446
+msgid "safe"
+msgstr "bezpieczny"
+
+#: describe.c:447
+msgid "unsafe"
+msgstr "niebezpieczny"
+
+#: describe.c:448
+msgid "Parallel"
+msgstr "Równoległy"
+
+#: describe.c:453
+msgid "definer"
+msgstr "definiujÄ…cy"
+
+#: describe.c:454
+msgid "invoker"
+msgstr "wywołujący"
+
+#: describe.c:455
+msgid "Security"
+msgstr "Zabezpieczenia"
+
+#: describe.c:462
+msgid "Language"
+msgstr "Język"
+
+#: describe.c:463
+msgid "Source code"
+msgstr "Kod źródłowy"
+
+#: describe.c:562
+msgid "List of functions"
+msgstr "Lista funkcji"
+
+#: describe.c:610
+msgid "Internal name"
+msgstr "Nazwa wewnętrzna"
+
+#: describe.c:632
+msgid "Elements"
+msgstr "Elementy"
+
+#: describe.c:689
+msgid "List of data types"
+msgstr "Lista typów danych"
+
+#: describe.c:732
+msgid "Left arg type"
+msgstr "Typ lewego arg"
+
+#: describe.c:733
+msgid "Right arg type"
+msgstr "Typ prawego arg"
+
+#: describe.c:734
+msgid "Result type"
+msgstr "Typ wyniku"
+
+#: describe.c:739 describe.c:3743 describe.c:4121
+msgid "Function"
+msgstr "Funkcja"
+
+#: describe.c:764
+msgid "List of operators"
+msgstr "Lista operatorów"
+
+#: describe.c:794
+msgid "Encoding"
+msgstr "Kodowanie"
+
+#: describe.c:799 describe.c:3841
+msgid "Collate"
+msgstr "Porównanie"
+
+#: describe.c:800 describe.c:3842
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:813
+msgid "Tablespace"
+msgstr "Przestrzeń Tabel"
+
+#: describe.c:835
+msgid "List of databases"
+msgstr "Lista baz danych"
+
+#: describe.c:876 describe.c:881 describe.c:1037 describe.c:3296
+#: describe.c:3303
+msgid "table"
+msgstr "tabela"
+
+#: describe.c:877 describe.c:3297
+msgid "view"
+msgstr "widok"
+
+#: describe.c:878 describe.c:3298
+msgid "materialized view"
+msgstr "widok zmaterializowany"
+
+#: describe.c:879 describe.c:1039 describe.c:3300
+msgid "sequence"
+msgstr "sekwencja"
+
+#: describe.c:880 describe.c:3302
+msgid "foreign table"
+msgstr "tabela obca"
+
+#: describe.c:893
+msgid "Column privileges"
+msgstr "Uprawnienia kolumn"
+
+#: describe.c:924 describe.c:958
+msgid "Policies"
+msgstr "Polityki"
+
+#: describe.c:990 describe.c:5275 describe.c:5279
+msgid "Access privileges"
+msgstr "Uprawnienia dostępu"
+
+#: describe.c:1021
+#, c-format
+msgid "The server (version %s) does not support altering default privileges.\n"
+msgstr "Serwer (wersja %s) nie obsługuje zmiany domyślnych uprawnień.\n"
+
+#: describe.c:1041
+msgid "function"
+msgstr "funkcja"
+
+#: describe.c:1043
+msgid "type"
+msgstr "typ"
+
+#: describe.c:1045
+#| msgid "Schema"
+msgid "schema"
+msgstr "schemat"
+
+#: describe.c:1069
+msgid "Default access privileges"
+msgstr "Domyślne uprawnienia dostępu"
+
+#: describe.c:1109
+msgid "Object"
+msgstr "Obiekt"
+
+#: describe.c:1123
+msgid "table constraint"
+msgstr "ograniczenie tabeli"
+
+#: describe.c:1145
+msgid "domain constraint"
+msgstr "ograniczenie domeny"
+
+#: describe.c:1173
+msgid "operator class"
+msgstr "klasa operatora"
+
+#: describe.c:1202
+msgid "operator family"
+msgstr "rodzina operatora"
+
+#: describe.c:1224
+msgid "rule"
+msgstr "reguła"
+
+#: describe.c:1266
+msgid "Object descriptions"
+msgstr "Opisy obiektów"
+
+#: describe.c:1320
+#, c-format
+msgid "Did not find any relation named \"%s\".\n"
+msgstr "Nie znaleziono żadnej relacji o nazwie \"%s\".\n"
+
+#: describe.c:1529
+#, c-format
+msgid "Did not find any relation with OID %s.\n"
+msgstr "Nie znaleziono żadnej relacji o OID %s.\n"
+
+#: describe.c:1642 describe.c:1691
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Niezalogowany indeks \"%s.%s\""
+
+#: describe.c:1645 describe.c:1694
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabela \"%s.%s\""
+
+#: describe.c:1649
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Widok \"%s.%s\""
+
+#: describe.c:1654
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Niezalogowany widok materializowany \"%s.%s\""
+
+#: describe.c:1657
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Widok materializowany \"%s.%s\""
+
+#: describe.c:1661
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sekwencja \"%s.%s\""
+
+#: describe.c:1666
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Niezalogowany indeks \"%s.%s\""
+
+#: describe.c:1669
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Indeks \"%s.%s\""
+
+#: describe.c:1674
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "Relacja specjalna \"%s.%s\""
+
+#: describe.c:1678
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Tabela TOAST \"%s.%s\""
+
+#: describe.c:1682
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Typ złożony \"%s.%s\""
+
+#: describe.c:1686
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Tabela obca \"%s.%s\""
+
+#: describe.c:1705
+msgid "Column"
+msgstr "Kolumna"
+
+#: describe.c:1716 describe.c:3508
+#| msgid "collation"
+msgid "Collation"
+msgstr "Porównanie"
+
+#: describe.c:1717 describe.c:3515
+#| msgid "collatable"
+msgid "Nullable"
+msgstr "Nullowalne"
+
+#: describe.c:1718 describe.c:3516
+#| msgid "Default?"
+msgid "Default"
+msgstr "Domyślnie"
+
+#: describe.c:1723
+msgid "Value"
+msgstr "Wartość"
+
+#: describe.c:1726
+msgid "Definition"
+msgstr "Definicja"
+
+#: describe.c:1729 describe.c:4578 describe.c:4662 describe.c:4733
+#: describe.c:4797
+msgid "FDW Options"
+msgstr "Opcje FDW"
+
+#: describe.c:1733
+msgid "Storage"
+msgstr "Przechowywanie"
+
+#: describe.c:1738
+msgid "Stats target"
+msgstr "Cel statystyk"
+
+#: describe.c:1876
+#, c-format
+msgid "Partition of: %s %s"
+msgstr "Partycja na: %s %s"
+
+#: describe.c:1897
+#, c-format
+msgid "Partition key: %s"
+msgstr "Klucz partycji: %s"
+
+#: describe.c:1965
+msgid "primary key, "
+msgstr "klucz główny, "
+
+#: describe.c:1967
+msgid "unique, "
+msgstr "klucz unikalny, "
+
+#: describe.c:1973
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "dla tabeli \"%s.%s\""
+
+#: describe.c:1977
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", orzeczenie (%s)"
+
+#: describe.c:1980
+msgid ", clustered"
+msgstr ", klastrowany"
+
+#: describe.c:1983
+msgid ", invalid"
+msgstr ", niepoprawny"
+
+#: describe.c:1986
+msgid ", deferrable"
+msgstr ", odraczalny"
+
+#: describe.c:1989
+msgid ", initially deferred"
+msgstr ", poczÄ…tkowo odroczony"
+
+#: describe.c:1992
+msgid ", replica identity"
+msgstr ", identyczność repliki"
+
+#: describe.c:2027
+#, c-format
+msgid "Owned by: %s"
+msgstr "Właściciel: %s"
+
+#: describe.c:2089
+msgid "Indexes:"
+msgstr "Indeksy:"
+
+#: describe.c:2173
+msgid "Check constraints:"
+msgstr "Ograniczenie kontrolne:"
+
+#: describe.c:2204
+msgid "Foreign-key constraints:"
+msgstr "Ograniczenia kluczy obcych:"
+
+#: describe.c:2235
+msgid "Referenced by:"
+msgstr "Wskazywany przez:"
+
+#: describe.c:2295
+msgid "Policies:"
+msgstr "Polityki:"
+
+#: describe.c:2298
+msgid "Policies (forced row security enabled):"
+msgstr "Polityki (włączone wymuszenie bezpieczeństwa wierszy):"
+
+#: describe.c:2301
+msgid "Policies (row security enabled): (none)"
+msgstr "Polityki (włączono bezpieczeństwo wierszy): (brak)"
+
+#: describe.c:2304
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Polityki (włączono wymuszenie bezpieczeństwa wierszy): (brak)"
+
+#: describe.c:2307
+msgid "Policies (row security disabled):"
+msgstr "Polityki (wyłączone bezpieczeństwo wierszy):"
+
+#: describe.c:2368
+#| msgid "Statistics"
+msgid "Statistics:"
+msgstr "Statystyki:"
+
+#: describe.c:2470 describe.c:2552
+msgid "Rules:"
+msgstr "Reguły:"
+
+#: describe.c:2473
+msgid "Disabled rules:"
+msgstr "Wyłączone reguły:"
+
+#: describe.c:2476
+msgid "Rules firing always:"
+msgstr "Reguły odpalane zawsze:"
+
+#: describe.c:2479
+msgid "Rules firing on replica only:"
+msgstr "Reguły odpalane tylko przy replikacji:"
+
+#: describe.c:2516
+#| msgid "Replication"
+msgid "Publications:"
+msgstr "Publikacje:"
+
+#: describe.c:2535
+msgid "View definition:"
+msgstr "Definicja widoku:"
+
+#: describe.c:2670
+msgid "Triggers:"
+msgstr "Wyzwalacze:"
+
+#: describe.c:2674
+msgid "Disabled user triggers:"
+msgstr "Wyłączone wyzwalacze użytkownika:"
+
+#: describe.c:2676
+msgid "Disabled triggers:"
+msgstr "Wyłączone wyzwalacze:"
+
+#: describe.c:2679
+msgid "Disabled internal triggers:"
+msgstr "Wyłączone wyzwalacze wewnętrzne:"
+
+#: describe.c:2682
+msgid "Triggers firing always:"
+msgstr "Wyzwalacze odpalane zawsze:"
+
+#: describe.c:2685
+msgid "Triggers firing on replica only:"
+msgstr "Wyzwalacze odpalane tylko przy replikacji:"
+
+#: describe.c:2771
+msgid "Inherits"
+msgstr "Dziedziczenia"
+
+#: describe.c:2825
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Liczba tabel podrzędnych: %d (Użyj \\d+ by je wylistować.)"
+
+#: describe.c:2827
+#, c-format
+#| msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Liczba partycji: %d (Użyj \\d+ by je wylistować.)"
+
+#: describe.c:2835
+msgid "Child tables"
+msgstr "Tabele podrzędne"
+
+#: describe.c:2835
+#| msgid "action"
+msgid "Partitions"
+msgstr "Partycje"
+
+#: describe.c:2869
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Tabela typizowana typu: %s"
+
+#: describe.c:2885
+msgid "Replica Identity"
+msgstr "Identyczność Repliki"
+
+#: describe.c:2898
+msgid "Has OIDs: yes"
+msgstr "Zawiera OIDy: tak"
+
+#: describe.c:2982
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Przestrzeń tabel: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:2994
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", przestrzeń tabel \"%s\""
+
+#: describe.c:3087
+msgid "List of roles"
+msgstr "Lista ról"
+
+#: describe.c:3089
+msgid "Role name"
+msgstr "Nazwa roli"
+
+#: describe.c:3090
+msgid "Attributes"
+msgstr "Atrybuty"
+
+#: describe.c:3091
+msgid "Member of"
+msgstr "Element"
+
+#: describe.c:3102
+msgid "Superuser"
+msgstr "Superużytkownik"
+
+#: describe.c:3105
+msgid "No inheritance"
+msgstr "Bez dziedziczenia"
+
+#: describe.c:3108
+msgid "Create role"
+msgstr "Utwórz rolę"
+
+#: describe.c:3111
+msgid "Create DB"
+msgstr "Utwórz DB"
+
+#: describe.c:3114
+msgid "Cannot login"
+msgstr "Nie można zalogować"
+
+#: describe.c:3118
+msgid "Replication"
+msgstr "Replikacja"
+
+#: describe.c:3122
+msgid "Bypass RLS"
+msgstr "Obejście RLS"
+
+#: describe.c:3131
+msgid "No connections"
+msgstr "Brak połączeń"
+
+#: describe.c:3133
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d połączenie"
+msgstr[1] "%d połączenia"
+msgstr[2] "%d połączeń"
+
+#: describe.c:3143
+msgid "Password valid until "
+msgstr "Hasło ważne do "
+
+#: describe.c:3199
+msgid "Role"
+msgstr "Rola"
+
+#: describe.c:3200
+msgid "Database"
+msgstr "Baza danych"
+
+#: describe.c:3201
+msgid "Settings"
+msgstr "Ustawienia"
+
+#: describe.c:3211
+#, c-format
+msgid "No per-database role settings support in this server version.\n"
+msgstr "Brak obsługi oddzielnych ustawień ról dla baz danych w tej wersji serwera.\n"
+
+#: describe.c:3222
+#, c-format
+msgid "No matching settings found.\n"
+msgstr "Nie znaleziono pasujących ustawień.\n"
+
+#: describe.c:3224
+#, c-format
+msgid "No settings found.\n"
+msgstr "Nie znaleziono ustawień.\n"
+
+#: describe.c:3229
+msgid "List of settings"
+msgstr "Lista ustawień"
+
+#: describe.c:3299
+msgid "index"
+msgstr "indeks"
+
+#: describe.c:3301
+msgid "special"
+msgstr "specjalny"
+
+#: describe.c:3310 describe.c:4785
+msgid "Table"
+msgstr "Tabela"
+
+#: describe.c:3387
+#, c-format
+msgid "No matching relations found.\n"
+msgstr "Nie znaleziono pasujÄ…cych relacji.\n"
+
+#: describe.c:3389
+#, c-format
+msgid "No relations found.\n"
+msgstr "Nie znaleziono relacji.\n"
+
+#: describe.c:3394
+msgid "List of relations"
+msgstr "Lista relacji"
+
+#: describe.c:3431
+msgid "Trusted"
+msgstr "Zaufany"
+
+#: describe.c:3439
+msgid "Internal Language"
+msgstr "Język wewnętrzny"
+
+#: describe.c:3440
+msgid "Call Handler"
+msgstr "Uchwyt Wywołania"
+
+#: describe.c:3441 describe.c:4565
+msgid "Validator"
+msgstr "Walidator"
+
+#: describe.c:3444
+msgid "Inline Handler"
+msgstr "Uchwyt Wbudowany"
+
+#: describe.c:3472
+msgid "List of languages"
+msgstr "Lista języków"
+
+#: describe.c:3517
+msgid "Check"
+msgstr "Sprawdzenie"
+
+#: describe.c:3559
+msgid "List of domains"
+msgstr "Lista domen"
+
+#: describe.c:3593
+msgid "Source"
+msgstr "Źródło"
+
+#: describe.c:3594
+msgid "Destination"
+msgstr "Cel"
+
+#: describe.c:3595 describe.c:3744
+msgid "no"
+msgstr "nie"
+
+#: describe.c:3595 describe.c:3746
+msgid "yes"
+msgstr "tak"
+
+#: describe.c:3596
+msgid "Default?"
+msgstr "Domyślnie?"
+
+#: describe.c:3633
+msgid "List of conversions"
+msgstr "Lista przekształceń"
+
+#: describe.c:3672
+msgid "Event"
+msgstr "Zdarzenie"
+
+#: describe.c:3674
+msgid "enabled"
+msgstr "włączony"
+
+#: describe.c:3675
+msgid "replica"
+msgstr "replika"
+
+#: describe.c:3676
+msgid "always"
+msgstr "zawsze"
+
+#: describe.c:3677
+msgid "disabled"
+msgstr "wyłączony"
+
+#: describe.c:3678 describe.c:5222
+msgid "Enabled"
+msgstr "WÅ‚Ä…czony"
+
+#: describe.c:3679
+msgid "Procedure"
+msgstr "Procedura"
+
+#: describe.c:3680
+msgid "Tags"
+msgstr "Znaczniki"
+
+#: describe.c:3699
+msgid "List of event triggers"
+msgstr "Lista wyzwalaczy zdarzeń"
+
+#: describe.c:3741
+msgid "Source type"
+msgstr "Typ źródłowy"
+
+#: describe.c:3742
+msgid "Target type"
+msgstr "Typ docelowy"
+
+#: describe.c:3745
+msgid "in assignment"
+msgstr "przypisanie"
+
+#: describe.c:3747
+msgid "Implicit?"
+msgstr "Bezwarunkowy?"
+
+#: describe.c:3798
+msgid "List of casts"
+msgstr "Lista rzutowań"
+
+#: describe.c:3826
+#, c-format
+msgid "The server (version %s) does not support collations.\n"
+msgstr "Serwer (wersja %s) nie obsługuje porównań.\n"
+
+#: describe.c:3847
+#| msgid "provider"
+msgid "Provider"
+msgstr "Dostawca"
+
+#: describe.c:3882
+msgid "List of collations"
+msgstr "Spis porównań"
+
+#: describe.c:3941
+msgid "List of schemas"
+msgstr "Lista schematów"
+
+#: describe.c:3966 describe.c:4204 describe.c:4275 describe.c:4346
+#, c-format
+msgid "The server (version %s) does not support full text search.\n"
+msgstr "Serwer (wersja %s) nie obsługuje pełnego wyszukiwania tekstowego.\n"
+
+#: describe.c:4001
+msgid "List of text search parsers"
+msgstr "Lista parserów wyszukiwania tekstowego"
+
+#: describe.c:4044
+#, c-format
+msgid "Did not find any text search parser named \"%s\".\n"
+msgstr "Nie znaleziono parsera wyszukiwania tekstowego o nazwie \"%s\".\n"
+
+#: describe.c:4119
+msgid "Start parse"
+msgstr "PoczÄ…tek parsowania"
+
+#: describe.c:4120
+msgid "Method"
+msgstr "Metoda"
+
+#: describe.c:4124
+msgid "Get next token"
+msgstr "Pobierz następny token"
+
+#: describe.c:4126
+msgid "End parse"
+msgstr "Koniec parsowania"
+
+#: describe.c:4128
+msgid "Get headline"
+msgstr "Pobierz nagłówek"
+
+#: describe.c:4130
+msgid "Get token types"
+msgstr "Pobierz typy tokenów"
+
+#: describe.c:4140
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Parser wyszukiwania tekstowego \"%s.%s\""
+
+#: describe.c:4142
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Parser wyszukiwania tekstowego \"%s\""
+
+#: describe.c:4161
+msgid "Token name"
+msgstr "Nazwa tokenu"
+
+#: describe.c:4172
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Typy tokenów dla analizatora \"%s.%s\""
+
+#: describe.c:4174
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Typy tokenów dla parsera \"%s\""
+
+#: describe.c:4227
+msgid "Template"
+msgstr "Szablon"
+
+#: describe.c:4228
+msgid "Init options"
+msgstr "Opcje inicjacji"
+
+#: describe.c:4250
+msgid "List of text search dictionaries"
+msgstr "Lista słowników wyszukiwania tekstowego"
+
+#: describe.c:4293
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:4294
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:4321
+msgid "List of text search templates"
+msgstr "Lista szablonów wyszukiwania tekstowego"
+
+#: describe.c:4381
+msgid "List of text search configurations"
+msgstr "Lista konfiguracji wyszukiwania tekstowego"
+
+#: describe.c:4425
+#, c-format
+msgid "Did not find any text search configuration named \"%s\".\n"
+msgstr "Nie znaleziono konfiguracji wyszukiwania tekstowego o nazwie \"%s\".\n"
+
+#: describe.c:4491
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:4492
+msgid "Dictionaries"
+msgstr "SÅ‚owniki"
+
+#: describe.c:4503
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Konfiguracja wyszukiwania tekstowego \"%s.%s\""
+
+#: describe.c:4506
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Konfiguracja wyszukiwania tekstowego \"%s\""
+
+#: describe.c:4510
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analizator: \"%s.%s\""
+
+#: describe.c:4513
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: \"%s\""
+
+#: describe.c:4547
+#, c-format
+msgid "The server (version %s) does not support foreign-data wrappers.\n"
+msgstr "Serwer (wersja %s) nie obsługuje opakowań danych obcych.\n"
+
+#: describe.c:4605
+msgid "List of foreign-data wrappers"
+msgstr "Lista opakowań danych obcych"
+
+#: describe.c:4630
+#, c-format
+msgid "The server (version %s) does not support foreign servers.\n"
+msgstr "Serwer (wersja %s) nie obsługuje serwerów obcych.\n"
+
+#: describe.c:4643
+msgid "Foreign-data wrapper"
+msgstr "Opakowanie obcych danych"
+
+#: describe.c:4661 describe.c:4866
+msgid "Version"
+msgstr "Wersja"
+
+#: describe.c:4687
+msgid "List of foreign servers"
+msgstr "Lista serwerów obcych"
+
+#: describe.c:4712
+#, c-format
+msgid "The server (version %s) does not support user mappings.\n"
+msgstr "Serwer (wersja %s) nie obsługuje przestrzeni mapowań użytkownika.\n"
+
+#: describe.c:4722 describe.c:4786
+msgid "Server"
+msgstr "Serwer"
+
+#: describe.c:4723
+msgid "User name"
+msgstr "Nazwa użytkownika"
+
+#: describe.c:4748
+msgid "List of user mappings"
+msgstr "Lista mapowań użytkownika"
+
+#: describe.c:4773
+#, c-format
+msgid "The server (version %s) does not support foreign tables.\n"
+msgstr "Serwer (wersja %s) nie obsługuje tabel obcych.\n"
+
+#: describe.c:4826
+msgid "List of foreign tables"
+msgstr "Lista tabel obcych"
+
+#: describe.c:4851 describe.c:4908
+#, c-format
+msgid "The server (version %s) does not support extensions.\n"
+msgstr "Serwer (wersja %s) nie obsługuje rozszerzeń.\n"
+
+#: describe.c:4883
+msgid "List of installed extensions"
+msgstr "Lista zainstalowanych rozszerzeń"
+
+#: describe.c:4936
+#, c-format
+msgid "Did not find any extension named \"%s\".\n"
+msgstr "Nie znaleziono żadnego rozszerzenia o nazwie \"%s\".\n"
+
+#: describe.c:4939
+#, c-format
+msgid "Did not find any extensions.\n"
+msgstr "Nie znaleziono żadnego rozszerzenia.\n"
+
+#: describe.c:4983
+msgid "Object Description"
+msgstr "Opis Obiektu"
+
+#: describe.c:4992
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Obiekty w rozszerzeniu \"%s\""
+
+#: describe.c:5018 describe.c:5080
+#, c-format
+#| msgid "The server (version %s) does not support collations.\n"
+msgid "The server (version %s) does not support publications.\n"
+msgstr "Serwer (wersja %s) nie obsługuje publikacji.\n"
+
+#: describe.c:5034 describe.c:5125
+#| msgid "insert"
+msgid "Inserts"
+msgstr "Wstwienia"
+
+#: describe.c:5035 describe.c:5126
+#| msgid "update"
+msgid "Updates"
+msgstr "Modyfikacje"
+
+#: describe.c:5036 describe.c:5127
+#| msgid "delete"
+msgid "Deletes"
+msgstr "Usunięcia"
+
+#: describe.c:5053
+#| msgid "List of relations"
+msgid "List of publications"
+msgstr "Lista publikacji"
+
+#: describe.c:5122
+#, c-format
+#| msgid "Replication"
+msgid "Publication %s"
+msgstr "Publikacja %s"
+
+#: describe.c:5167
+#| msgid "Table"
+msgid "Tables:"
+msgstr "Tabele:"
+
+#: describe.c:5207
+#, c-format
+#| msgid "The server (version %s) does not support collations.\n"
+msgid "The server (version %s) does not support subscriptions.\n"
+msgstr "Serwer (wersja %s) nie obsługuje subskrypcji.\n"
+
+#: describe.c:5223
+#| msgid "Replication"
+msgid "Publication"
+msgstr "Publikacja"
+
+#: describe.c:5229
+#| msgid "Connection\n"
+msgid "Conninfo"
+msgstr "Połączenie"
+
+#: describe.c:5251
+#| msgid "List of functions"
+msgid "List of subscriptions"
+msgstr "Lista subskrypcji"
+
+#: help.c:62
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: help.c:73
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql jest interaktywnym terminalem PostgreSQL.\n"
+"\n"
+
+#: help.c:74 help.c:342 help.c:376 help.c:403
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: help.c:75
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPCJA]... [NAZWADB [NAZWAUŻYTKOWNIKA]]\n"
+"\n"
+
+#: help.c:77
+#, c-format
+msgid "General options:\n"
+msgstr "Opcje ogólne:\n"
+
+#: help.c:82
+#, c-format
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=POLECENIE wykonuje jedno polecenie (SQL lub wewnętrzne) i kończy\n"
+
+#: help.c:83
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=NAZWADB nazwa bazy danych do połączenia (domyślnie: \"%s\")\n"
+
+#: help.c:84
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=NAZWAPLIKU wykonuje polecenia z pliku i kończy\n"
+
+#: help.c:85
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list listuje dostępne bazy danych i kończy\n"
+
+#: help.c:86
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAZWA=WARTOŚĆ\n"
+" ustala wartość zmiennej psql NAZWA na WARTOŚĆ\n"
+" (np. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:89
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: help.c:90
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc nie czyta pliku startowego (~/.psqlrc)\n"
+
+#: help.c:91
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" wykonuje w jednej transakcji (jeśli nie interaktywnie)\n"
+
+#: help.c:93
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] pokazuje ten ekran pomocy i kończy\n"
+
+#: help.c:94
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands listuje polecenia z bakslaszem i kończy\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables listuje zmienne specjalne i kończy\n"
+
+#: help.c:97
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Opcje wejścia i wyjścia:\n"
+
+#: help.c:98
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all echo wejścia ze skryptu\n"
+
+#: help.c:99
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors wypisuje niepoprawnie wykonane polecenia\n"
+
+#: help.c:100
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries polecenia echo wysyłane na serwer\n"
+
+#: help.c:101
+#, c-format
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden wyświetlenie zapytań tworzonych przez polecenia wewnętrzne\n"
+
+#: help.c:102
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr ""
+" -L, --log-file=NAZWAPLIKU\n"
+" wysyła komunikaty sesji do pliku\n"
+
+#: help.c:103
+#, c-format
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline wyłącza rozszerzoną edycje linii poleceń (readline)\n"
+
+#: help.c:104
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=NAZWAPLIKU wysyła wyniki zapytania do pliku (lub |przewodu)\n"
+
+#: help.c:105
+#, c-format
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet ciche wykonanie (bez komunikatów, tylko wyniki zapytań)\n"
+
+#: help.c:106
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step tryb jednokrokowy (potwierdzenie każdego zapytania)\n"
+
+#: help.c:107
+#, c-format
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line tryb jednoliniowy (koniec linii kończy polecenie SQL)\n"
+
+#: help.c:109
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Opcje formatowania wyjścia:\n"
+
+#: help.c:110
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align tryb braku wyrównania tabeli na wyjściu\n"
+
+#: help.c:111
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=CIĄGZNAKÓW\n"
+" separator pól dla niewyrównanego wyjścia (domyślnie: \"%s\")\n"
+
+#: help.c:114
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html tryb wyjścia tabeli HTML\n"
+
+#: help.c:115
+#, c-format
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=ZMI[=ARG] ustawia opcjÄ™ drukowania ZMI na ARG (patrz polecenie \\pset)\n"
+
+#: help.c:116
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=CIĄGZNAKÓW\n"
+" separator rekordów dla niewyrównanego wyjścia(domyślnie: nowa linia)\n"
+
+#: help.c:118
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only drukuje tylko wiersze\n"
+
+#: help.c:119
+#, c-format
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEKST ustawia atrybuty znaczników tabeli HTML (np., szerokość, ramkę)\n"
+
+#: help.c:120
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded włącza wyjście rozciągniętej tabeli\n"
+
+#: help.c:121
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" ustala separator pól dla niewyrównanego wyjścia na bajt zero\n"
+
+#: help.c:123
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" ustala separator rekordów dla niewyrównanego wyjścia na bajt zero\n"
+
+#: help.c:126
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opcje połączenia:\n"
+
+#: help.c:129
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=NAZWAHOSTA nazwa serwera bazy danych lub katalog gniazda (domyślnie: \"%s\")\n"
+
+#: help.c:130
+msgid "local socket"
+msgstr "lokalne gniazdo sieciowe"
+
+#: help.c:133
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT port na serwerze bazy danych (domyślnie: \"%s\")\n"
+
+#: help.c:139
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr ""
+" -U, --username=NZAWAUZYTKOWNIKA\n"
+" nazwa użytkownika bazy danych (domyślnie: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nie pytaj nigdy o hasło\n"
+
+#: help.c:141
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password wymuś pytanie o hasło (powinno nastąpić automatycznie)\n"
+
+#: help.c:143
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"By uzyskać więcej informacji wpisz \"\\?\" (dla poleceń wewnętrznych) lub \"\\help\" \n"
+"(dal poleceń SQL) w psql, lub sprawdź w rozdziale dotyczącym psql\n"
+"dokumentacji PostgreSQL.\n"
+"\n"
+
+#: help.c:146
+#, c-format
+msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr "Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: help.c:172
+#, c-format
+msgid "General\n"
+msgstr "Informacje ogólne\n"
+
+#: help.c:173
+#, c-format
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright pokazuje warunku użytkowania i dystrybucji PostgreSQL\n"
+
+#: help.c:174
+#, c-format
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose pokazuje najpóźniejszy komunikat błędu show z najszerszym opisem\n"
+
+#: help.c:175
+#, c-format
+msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+msgstr " \\g [PLIK] or ; wykonuje zapytanie (i wysyła wyniki do pliku lub |przewodu)\n"
+
+#: help.c:176
+#, c-format
+#| msgid " \\a toggle between unaligned and aligned output mode\n"
+msgid " \\gx [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [FILE] jak \\g, ale wymusza rozszerzony tryb wyjścia\n"
+
+#: help.c:177
+#, c-format
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec wykonuje zapytanie, po czym wykonuje każdą wartość z jego wyniku\n"
+
+#: help.c:178
+#, c-format
+msgid " \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr " \\gset [PREFIKS] wykonuje zapytanie i zapisuje wyniki do zmiennych psql\n"
+
+#: help.c:179
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q wychodzi z psql\n"
+
+#: help.c:180
+#, c-format
+msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [KOLUMNY] wykonuje polecenie i wyświetla wynik w tabeli odwróconej\n"
+
+#: help.c:181
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] wykonuje zapytanie co SEC sekund\n"
+
+#: help.c:184
+#, c-format
+msgid "Help\n"
+msgstr "Pomoc\n"
+
+#: help.c:186
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [polecenia] pomoc do poleceń psql zaczynających się bakslaszem\n"
+
+#: help.c:187
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? opcje pokazuje pomoc dla opcji linii poleceń psql\n"
+
+#: help.c:188
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? zmienne pokazuje pomoc dla zmiennych konfiguracyjnych psql\n"
+
+#: help.c:189
+#, c-format
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAZWA] pomoc odnośnie składni poleceń SQL, * dla wszystkich poleceń\n"
+
+#: help.c:192
+#, c-format
+msgid "Query Buffer\n"
+msgstr "Bufor Zapytania\n"
+
+#: help.c:193
+#, c-format
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [PLIK] [LINIA] edytuje bufor zapytania (lub plik) edytorem zewnętrznym\n"
+
+#: help.c:194
+#, c-format
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [NAZWAFUNK [LINIA]]\n"
+" edytuje definicję funkcji edytorem zewnętrznym\n"
+
+#: help.c:195
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [NAZWAWIDOKU [LINIA]]\n"
+" edytuje definicję widoku edytorem zewnętrznym\n"
+
+#: help.c:196
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p pokazuje zawartość bufora zapytania\n"
+
+#: help.c:197
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\p resetuje (czyści) zawartość bufora zapytania\n"
+
+#: help.c:199
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [PLIK] wyświetla historię lub zapisuje ja do pliku\n"
+
+#: help.c:201
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w PLIK zapisuje bufor zapytania do pliku\n"
+
+#: help.c:204
+#, c-format
+msgid "Input/Output\n"
+msgstr "Wejście/Wyjście\n"
+
+#: help.c:205
+#, c-format
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... wykonuje SQL COPY strumienia danych na host klienta\n"
+
+#: help.c:206
+#, c-format
+msgid " \\echo [STRING] write string to standard output\n"
+msgstr " \\echo [STRING] zapisuje ciąg znaków do standardowego wyjścia\n"
+
+#: help.c:207
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i PLIK wykonuje polecenia z pliku\n"
+
+#: help.c:208
+#, c-format
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE jak \\i, tylko względnie do położenia bieżącego skryptu\n"
+
+#: help.c:209
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [PLIK] lub ; wysyła wszystkie wyniki zapytania do pliku lub |przewodu\n"
+
+#: help.c:210
+#, c-format
+msgid " \\qecho [STRING] write string to query output stream (see \\o)\n"
+msgstr ""
+" \\qecho [STRING] zapisuje ciąg znaków do strumienia wyjściowego \n"
+" zapytania (patrz \\o)\n"
+
+#: help.c:213
+#, c-format
+#| msgid "condition"
+msgid "Conditional\n"
+msgstr "Warunkowy\n"
+
+#: help.c:214
+#, c-format
+#| msgid " -i enable TCP/IP connections\n"
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if WYRAZENIE rozpoczyna blok warunkowy\n"
+
+#: help.c:215
+#, c-format
+#| msgid " PORT server port of the current connection\n"
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif WYRAŻENIE alternatywa w bieżącym bloku warunkowym\n"
+
+#: help.c:216
+#, c-format
+#| msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else końcowa alternatywa w bieżącym bloku warunkowym\n"
+
+#: help.c:217
+#, c-format
+#| msgid " -i enable TCP/IP connections\n"
+msgid " \\endif end conditional block\n"
+msgstr " \\endif koniec bloku warunkowego\n"
+
+#: help.c:220
+#, c-format
+msgid "Informational\n"
+msgstr "Informacyjne\n"
+
+#: help.c:221
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (opcje: S = pokaż obiekty systemowe, + = dodatkowe szczegóły)\n"
+
+#: help.c:222
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] listuje tabele, widoku i dekwencje\n"
+
+#: help.c:223
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAZWA opisuje tabelÄ™, widok, sekwencjÄ™ lub indeks\n"
+
+#: help.c:224
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [WZORZEC] listuje agregaty\n"
+
+#: help.c:225
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [WZORZEC] listuje metody dostępu\n"
+
+#: help.c:226
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [WZORZEC] listuje przestrzenie tabel\n"
+
+#: help.c:227
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [WZORZEC] listuje konwersje\n"
+
+#: help.c:228
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [WZORZEC] listuje rzutowania\n"
+
+#: help.c:229
+#, c-format
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [WZORZEC] pokazuje komentarze obiektów nie wyświetlane nigdzie indziej\n"
+
+#: help.c:230
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [WZORZEC] listuje domyślne uprawnienia\n"
+
+#: help.c:231
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [WZORZEC] listuje domeny\n"
+
+#: help.c:232
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [WZORZEC] listuje tabele zewnętrzne\n"
+
+#: help.c:233
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [WZORZEC] listuje serwery obce\n"
+
+#: help.c:234
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [WZORZEC] listuje mapowania użytkownika\n"
+
+#: help.c:235
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [WZORZEC] listuje opakowania obcych danych\n"
+
+#: help.c:236
+#, c-format
+msgid " \\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions\n"
+msgstr " \\df[antw][S+] [WZORC] listuje funkcje [tylko agreg/zwykły/wyzwalacz/okno]\n"
+
+#: help.c:237
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [WZORZEC] listuje konfiguracje wyszukiwania tekstowego\n"
+
+#: help.c:238
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [WZORZEC] listuje słowniki wyszukiwania tekstowego\n"
+
+#: help.c:239
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [WZORZEC] listuje analizatory wyszukiwania tekstowego\n"
+
+#: help.c:240
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [WZORZEC] listuje wzorce wyszukiwania tekstowego\n"
+
+#: help.c:241
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [WZORZEC] listuje role\n"
+
+#: help.c:242
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [WZORZEC] listuje indeksy\n"
+
+#: help.c:243
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr " \\dl listuje duże obiekty, to samo, co \\lo_list\n"
+
+#: help.c:244
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [WZORZEC] listuje języki proceduralne\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [WZORZEC] listuje widoki zmaterializowane\n"
+
+#: help.c:246
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [WZORZEC] listuje schematy\n"
+
+#: help.c:247
+#, c-format
+msgid " \\do[S] [PATTERN] list operators\n"
+msgstr " \\do[S] [WZORZEC] listuje operatory\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [WZORZEC] listuje porównania\n"
+
+#: help.c:249
+#, c-format
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp [WZORZEC] listuje uprawnienia dostępu do tabeli, widoku \n"
+" lub sekwencji\n"
+
+#: help.c:250
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [WZORC1 [WZORC2]] listuje ustawienia ról wedle baz danych\n"
+
+#: help.c:251
+#, c-format
+#| msgid " \\dO[S+] [PATTERN] list collations\n"
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [WZORZEC] listuje publikacje replikacji\n"
+
+#: help.c:252
+#, c-format
+#| msgid " \\dx[+] [PATTERN] list extensions\n"
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [WZORZEC] listuje subskrypcje replikacji\n"
+
+#: help.c:253
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [WZORZEC] listuje sekwencje\n"
+
+#: help.c:254
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [WZORZEC] listuje tabele\n"
+
+#: help.c:255
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [WZORZEC] listuje typy danych\n"
+
+#: help.c:256
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [WZORZEC] listuje role\n"
+
+#: help.c:257
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [WZORZEC] listuje widoki\n"
+
+#: help.c:258
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [WZORZEC] listuje tabele obce\n"
+
+#: help.c:259
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [WZORZEC] listuje rozszerzenia\n"
+
+#: help.c:260
+#, c-format
+msgid " \\dy [PATTERN] list event triggers\n"
+msgstr " \\dy [WZORZEC] listuje wyzwalacze zdarzeń\n"
+
+#: help.c:261
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [WZORZEC] listuje bazy danych\n"
+
+#: help.c:262
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] NAZWAFUNK pokazuje definicjÄ™ funkcji\n"
+
+#: help.c:263
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] NAZWAWIDOKU pokazuje definicjÄ™ widoku\n"
+
+#: help.c:264
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [WZORZEC] to samo co \\dp\n"
+
+#: help.c:267
+#, c-format
+msgid "Formatting\n"
+msgstr "Formatowanie\n"
+
+#: help.c:268
+#, c-format
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a przełącza między trybem wyjścia wyrównanym i niewyrównwnym\n"
+
+#: help.c:269
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] ustawia tytuł tabeli lub czyści jeśli brak parametru\n"
+
+#: help.c:270
+#, c-format
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr ""
+" \\f [STRING] pokazuje lub ustawia separator pól dla niewyrównanego\n"
+" wyjścia zapytania\n"
+
+#: help.c:271
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H przełącza tryb wyjścia HTML (obecnie %s)\n"
+
+#: help.c:273
+#, c-format
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (NAME := {format|border|expanded|fieldsep|fieldsep_zero|footer|null|\n"
+" numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager|\n"
+" unicode_border_linestyle|unicode_column_linestyle|unicode_header_linestyle})\n"
+msgstr ""
+" \\pset [NAZWA [WARTOSC]] ustawia opcje wyjścia tabeli\n"
+" (NAZWA := {format|border|expanded|fieldsep|fieldsep_zero|footer|null|\n"
+" numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager|\n"
+" unicode_border_linestyle|unicode_column_linestyle|unicode_header_linestyle})\n"
+
+#: help.c:277
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] pokazywanie tylko wierszy (obecnie %s)\n"
+
+#: help.c:279
+#, c-format
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] ustawia atrybuty znacznika HTML <table>, lub czyści jeśli pusty\n"
+
+#: help.c:280
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] przełącza rozciągnięte wyjście (obecnie %s)\n"
+
+#: help.c:284
+#, c-format
+msgid "Connection\n"
+msgstr "Połączenie\n"
+
+#: help.c:286
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[NAZWADB|- UŻYTK|- HOST|- PORT|-] | conninfo}\n"
+" Å‚Ä…czy do nowej bazy danych (obecnie \"%s\")\n"
+
+#: help.c:290
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[NAZWADB|- UŻYTK|- HOST|- PORT|-] | conninfo}\n"
+" łączy do nowej bazy danych (obecnie bez połączenia)\n"
+
+#: help.c:292
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KODOWANIE] pokazuje lub ustawia kodowanie klienta\n"
+
+#: help.c:293
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [NAZWAUZYT] zmienia w sposób bezpieczny hasło użytkownika\n"
+
+#: help.c:294
+#, c-format
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo wyświetla informację o bieżącym połączeniu\n"
+
+#: help.c:297
+#, c-format
+msgid "Operating System\n"
+msgstr "System Operacyjny\n"
+
+#: help.c:298
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [FDR] zmienia bieżący folder roboczy\n"
+
+#: help.c:299
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr ""
+" \\setenv NAZWA [WARTOŚĆ]\n"
+" ustawia lub usuwa zmienną środowiska\n"
+
+#: help.c:300
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] przełącza pomiar czasu poleceń (obecnie %s)\n"
+
+#: help.c:302
+#, c-format
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [POLECENIE] wykonuje polecenie powłoki lub uruchamia interaktywną powłokę\n"
+
+#: help.c:305
+#, c-format
+msgid "Variables\n"
+msgstr "Zmienne\n"
+
+#: help.c:306
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEKST] NAZWA prosi użytkownika o ustawienie zmiennej wewnętrznej\n"
+
+#: help.c:307
+#, c-format
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr ""
+" \\set [NAZWA [WARTOŚĆ]] ustawia zmienną wewnętrzną lub listuje wszystkie,\n"
+" jeśli brak parametrów\n"
+
+#: help.c:308
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAZWA ustawia jako pustą (usuwa) zmienną wewnętrzną\n"
+
+#: help.c:311
+#, c-format
+msgid "Large Objects\n"
+msgstr "Duże Obiekty\n"
+
+#: help.c:312
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID PLIK\n"
+" \\lo_import PLIK [KOMENTARZ]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID operacje na dużych obiektach\n"
+
+#: help.c:339
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Lista specjalnie traktowanych zmiennych\n"
+"\n"
+
+#: help.c:341
+#, c-format
+msgid "psql variables:\n"
+msgstr "zmienne psql:\n"
+
+#: help.c:343
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAZWA=WARTOÅšC\n"
+" lub \\set NAZWA WARTOŚĆ wewnątrz psql\n"
+"\n"
+
+#: help.c:345
+#, c-format
+msgid " AUTOCOMMIT if set, successful SQL commands are automatically committed\n"
+msgstr " AUTOCOMMIT gdy ustawiony, polecenia SQL zakończone powodzeniem są automatycznie zatwierdzone\n"
+
+#: help.c:346
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE determinuje wielkość liter uzupełniających słowa kluczowe SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:348
+#, c-format
+msgid " DBNAME the currently connected database name\n"
+msgstr " DBNAME nazwa obecnie podłączonej bazy danych\n"
+
+#: help.c:349
+#, c-format
+msgid ""
+" ECHO controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO kontroluje jakie informacje z wejścia są wypisywane na standardowym wyjściu\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:351
+#, c-format
+msgid ""
+" ECHO_HIDDEN if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show without execution\n"
+msgstr ""
+" ECHO_HIDDEN wyświetla wewnętrzne zapytania wykonywane przez polecenia bakslasz;\n"
+" jeśli ustawiono na \"noexec\" tylko pokazuje je bez wykonywania\n"
+
+#: help.c:353
+#, c-format
+msgid " ENCODING current client character set encoding\n"
+msgstr " ENCODING aktualny zestaw znaków kodowania klienta\n"
+
+#: help.c:354
+#, c-format
+msgid ""
+" FETCH_COUNT the number of result rows to fetch and display at a time\n"
+" (default: 0=unlimited)\n"
+msgstr ""
+" FETCH_COUNT liczba wierszy wynikowych do jednorazowego pobrania i wyświetlenia\n"
+" (domyślnie: 0=nieograniczona)\n"
+
+#: help.c:356
+#, c-format
+msgid " HISTCONTROL controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr " HISTCONTROL kontroluje historię poleceń [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:357
+#, c-format
+msgid " HISTFILE file name used to store the command history\n"
+msgstr " HISTFILE nazwa pliku używana do zapisu historii poleceń\n"
+
+#: help.c:358
+#, c-format
+#| msgid " HISTSIZE the number of commands to store in the command history\n"
+msgid " HISTSIZE max number of commands to store in the command history\n"
+msgstr " HISTSIZE maks liczba poleceń przechowywanych w historii poleceń\n"
+
+#: help.c:359
+#, c-format
+msgid " HOST the currently connected database server host\n"
+msgstr " HOST komputer serwera obecnie połączonej bazy danych\n"
+
+#: help.c:360
+#, c-format
+#| msgid " IGNOREEOF if unset, sending an EOF to interactive session terminates application\n"
+msgid " IGNOREEOF number of EOFs needed to terminate an interactive session\n"
+msgstr " IGNOREEOF liczba EOFów wymagana do zakończenia sesji "
+"interaktywnej\n"
+
+#: help.c:361
+#, c-format
+msgid " LASTOID value of the last affected OID\n"
+msgstr " LASTOID wartość ostatnio dotkniętego OID\n"
+
+#: help.c:362
+#, c-format
+msgid " ON_ERROR_ROLLBACK if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr " ON_ERROR_ROLLBACK gdy ustawione, błąd nie zatrzymuje transakcji (używa niejawnych punktów zapisu)\n"
+
+#: help.c:363
+#, c-format
+msgid " ON_ERROR_STOP stop batch execution after error\n"
+msgstr " ON_ERROR_STOP zatrzymuje wykonywanie wsadowe po wystąpieniu błędu\n"
+
+#: help.c:364
+#, c-format
+msgid " PORT server port of the current connection\n"
+msgstr " PORT port aktualnie połączonego serwera\n"
+
+#: help.c:365
+#, c-format
+msgid " PROMPT1 specifies the standard psql prompt\n"
+msgstr " PROMPT1 określa zwykłą zachętę psql\n"
+
+#: help.c:366
+#, c-format
+msgid " PROMPT2 specifies the prompt used when a statement continues from a previous line\n"
+msgstr " PROMPT2 określa zachętę używaną, gdy wyrażenie jest kontynuowane z poprzedniej linii\n"
+
+#: help.c:367
+#, c-format
+msgid " PROMPT3 specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr " PROMPT3 określa zachętę używaną podczas trwania COPY ... FROM STDIN\n"
+
+#: help.c:368
+#, c-format
+msgid " QUIET run quietly (same as -q option)\n"
+msgstr " QUIET działaj cicho (tak samo jak opcja -q)\n"
+
+#: help.c:369
+#, c-format
+msgid " SHOW_CONTEXT controls display of message context fields [never, errors, always]\n"
+msgstr " SHOW_CONTEXT steruje wyświetlaniem pól kontekstu komunikatu [never, errors, always]\n"
+
+#: help.c:370
+#, c-format
+msgid " SINGLELINE end of line terminates SQL command mode (same as -S option)\n"
+msgstr " SINGLELINE tryb kończenia SQL końcem linii (to samo co opcja -S)\n"
+
+#: help.c:371
+#, c-format
+msgid " SINGLESTEP single-step mode (same as -s option)\n"
+msgstr " SINGLESTEP tryb jednokrokowy (to samo co opcja -s)\n"
+
+#: help.c:372
+#, c-format
+msgid " USER the currently connected database user\n"
+msgstr " USER aktualnie połączony użytkownik bazy danych\n"
+
+#: help.c:373
+#, c-format
+msgid " VERBOSITY controls verbosity of error reports [default, verbose, terse]\n"
+msgstr " VERBOSITY kontroluje gadulstwo raportów błędów [default, verbose, terse]\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Ustawienia wyświetlania:\n"
+
+#: help.c:377
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAZWA[=WARTOŚĆ]\n"
+" lub \\set NAZWA [WARTOŚĆ] wewnątrz psql\n"
+"\n"
+
+#: help.c:379
+#, c-format
+msgid " border border style (number)\n"
+msgstr " border styl ramki (liczba)\n"
+
+#: help.c:380
+#, c-format
+msgid " columns target width for the wrapped format\n"
+msgstr " columns szerokość celu w formacie zawijania linii\n"
+
+#: help.c:381
+#, c-format
+msgid " expanded (or x) expanded output [on, off, auto]\n"
+msgstr " expanded (lub x) rozszerzone wyjście [on, off, auto]\n"
+
+#: help.c:382
+#, c-format
+msgid " fieldsep field separator for unaligned output (default \"%s\")\n"
+msgstr " fieldsep separator pól dla niewyrównanego wyjścia (domyślnie \"%s\")\n"
+
+#: help.c:383
+#, c-format
+msgid " fieldsep_zero set field separator for unaligned output to zero byte\n"
+msgstr " fieldsep_zero ustala separator pól dla niewyrównanego wyjścia na bajt zero\n"
+
+#: help.c:384
+#, c-format
+msgid " footer enable or disable display of the table footer [on, off]\n"
+msgstr " footer włącza lub wyłącza wyświetlanie stopki tabeli [on, off]\n"
+
+#: help.c:385
+#, c-format
+msgid " format set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr " format ustala format wyjścia [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:386
+#, c-format
+msgid " linestyle set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr " linestyle ustawia styl rysowania linii granicznej [ascii, old-ascii, unicode]\n"
+
+#: help.c:387
+#, c-format
+msgid " null set the string to be printed in place of a null value\n"
+msgstr " null ustawia ciąg znaków drukowany w miejsce wartości pustej\n"
+
+#: help.c:388
+#, c-format
+msgid ""
+" numericlocale enable or disable display of a locale-specific character to separate\n"
+" groups of digits [on, off]\n"
+msgstr ""
+" numericlocale włącza lub wyłącza wyświetlanie znaku zależnego od ustawień narodowych\n"
+" oddzielajÄ…cego grupy cyfr [on, off]\n"
+
+#: help.c:390
+#, c-format
+msgid " pager control when an external pager is used [yes, no, always]\n"
+msgstr " pager steruje kiedy użyć zewnętrznego stronicowania [yes, no, always]\n"
+
+#: help.c:391
+#, c-format
+msgid " recordsep record (line) separator for unaligned output\n"
+msgstr " recordsep separator rekordów (linii) dla niewyrównanego wyjścia\n"
+
+#: help.c:392
+#, c-format
+msgid " recordsep_zero set record separator for unaligned output to zero byte\n"
+msgstr " recordsep_zero ustala separator rekordów dla niewyrównanego wyjścia na bajt zero\n"
+
+#: help.c:393
+#, c-format
+msgid ""
+" tableattr (or T) specify attributes for table tag in html format or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (lub T) określa atrybuty znacznika tabeli w formacie html lub formatu\n"
+" latex-longtable w kolumnach proporcjonalnej szerokości wyrównanych do lewej\n"
+
+#: help.c:395
+#, c-format
+msgid " title set the table title for any subsequently printed tables\n"
+msgstr " title ustawia tytuł tabeli dla następnie drukowanych tabel\n"
+
+#: help.c:396
+#, c-format
+msgid " tuples_only if set, only actual table data is shown\n"
+msgstr " tuples_only gdy ustawione, pokazywane sÄ… tylko aktualne dane tabeli\n"
+
+#: help.c:397
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" ustawia styl Unikodowego rysowania linii [single, double]\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Zmienne środowiska:\n"
+
+#: help.c:406
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAZWA=WARTOŚĆ [NAZWA=WARTOŚĆ] psql ...\n"
+" lub \\setenv NAME [VALUE] wewnÄ…trz psql\n"
+"\n"
+
+#: help.c:408
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAZWA=WARTOŚĆ\n"
+" psql ...\n"
+" lub \\setenv NAZWA [WARTOŚĆ] wewnątrz psql\n"
+"\n"
+
+#: help.c:411
+#, c-format
+msgid " COLUMNS number of columns for wrapped format\n"
+msgstr " COLUMNS liczba kolumn w formacie zawijania linii\n"
+
+#: help.c:412
+#, c-format
+msgid " PAGER name of external pager program\n"
+msgstr " PAGER nazwa zewnętrznego programu stronicowania\n"
+
+#: help.c:413
+#, c-format
+msgid " PGAPPNAME same as the application_name connection parameter\n"
+msgstr " PGAPPNAME to samo co parametr połączenia application_name\n"
+
+#: help.c:414
+#, c-format
+msgid " PGDATABASE same as the dbname connection parameter\n"
+msgstr " PGDATABASE to samo co parametr połączenia dbname\n"
+
+#: help.c:415
+#, c-format
+msgid " PGHOST same as the host connection parameter\n"
+msgstr " PGHOST to samo co parametr połączenia host\n"
+
+#: help.c:416
+#, c-format
+msgid " PGPORT same as the port connection parameter\n"
+msgstr " PGPORT to samo co parametr połączenia port\n"
+
+#: help.c:417
+#, c-format
+msgid " PGUSER same as the user connection parameter\n"
+msgstr " PGUSER to samo co parametr połączenia user\n"
+
+#: help.c:418
+#, c-format
+msgid " PGPASSWORD connection password (not recommended)\n"
+msgstr " PGPASSWORD hasło połączenia (niezalecane)\n"
+
+#: help.c:419
+#, c-format
+msgid " PGPASSFILE password file name\n"
+msgstr " PGPASSFILE nazwa pliku hasła\n"
+
+#: help.c:420
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" edytor do wykorzystania w poleceniach \\e, \\ef i \\ev\n"
+
+#: help.c:422
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" wskazanie numeru linii podczas wywoływania edytora\n"
+
+#: help.c:424
+#, c-format
+msgid " PSQL_HISTORY alternative location for the command history file\n"
+msgstr " PSQL_HISTORY alternatywne położenie dla pliku historii poleceń\n"
+
+#: help.c:425
+#, c-format
+msgid " PSQLRC alternative location for the user's .psqlrc file\n"
+msgstr " PSQLRC alternatywne połażenie pliku użytkownika .psqlrc\n"
+
+#: help.c:426
+#, c-format
+msgid " SHELL shell used by the \\! command\n"
+msgstr " SHELL powłoka używana przez polecenie \\!\n"
+
+#: help.c:427
+#, c-format
+msgid " TMPDIR directory for temporary files\n"
+msgstr " TMPDIR folder plików tymczasowych\n"
+
+#: help.c:470
+msgid "Available help:\n"
+msgstr "Dostępna pomoc:\n"
+
+#: help.c:554
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+msgstr ""
+"Polecenie: %s\n"
+"Opis: %s\n"
+"Składnia:\n"
+"%s\n"
+"\n"
+
+#: help.c:570
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Brak dostępnej pomocy dla \"%s\".\n"
+"Spróbuj \\h bez argumentów by zobaczyć dostępną pomoc.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %s\n"
+msgstr "nie można czytać z pliku wejścia: %s\n"
+
+#: input.c:471 input.c:510
+#, c-format
+msgid "could not save history to file \"%s\": %s\n"
+msgstr "nie można zapisać historii do pliku \"%s\": %s\n"
+
+#: input.c:530
+#, c-format
+msgid "history is not supported by this installation\n"
+msgstr "historia nie jest obsługiwana przez tą instalację\n"
+
+#: large_obj.c:64
+#, c-format
+msgid "%s: not connected to a database\n"
+msgstr "%s: nie połączono z bazą danych\n"
+
+#: large_obj.c:83
+#, c-format
+msgid "%s: current transaction is aborted\n"
+msgstr "%s: bieżąca transakcja została przerwana\n"
+
+#: large_obj.c:86
+#, c-format
+msgid "%s: unknown transaction status\n"
+msgstr "%s: nieznany status transakcji\n"
+
+#: large_obj.c:287 large_obj.c:298
+msgid "ID"
+msgstr "Identyfikator"
+
+#: large_obj.c:308
+msgid "Large objects"
+msgstr "Duże obiekty"
+
+#: mainloop.c:136
+#, c-format
+msgid "\\if: escaped\n"
+msgstr "\\if: wyjście\n"
+
+#: mainloop.c:183
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Użyj \"\\q\" by opuścić %s.\n"
+
+#: mainloop.c:205
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Wyjście to zrzut w formacie niestandardowym PostgreSQL.\n"
+"Użyj klienta linii poleceń pg_restore by odtworzyć bazę danych ze zrzutu.\n"
+
+#: mainloop.c:225
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Używasz psql, interfejsu wiersza poleceń PostgreSQL."
+
+#: mainloop.c:226
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Wpisz: \\copyright by poznać warunki rozpowszechniania\n"
+" \\h by uzyskać pomoc dla poleceń SQL\n"
+" \\? by uzyskać pomoc poleceń psql\n"
+" \\g lub zakończ średnikiem by wykonać zapytanie\n"
+" \\q by wyjść\n"
+
+#: mainloop.c:339 mainloop.c:476
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block\n"
+msgstr "pominięto zapytanie; użyj \\endif lub Ctrl-C by wyjść z bieżącego bloku \\if\n"
+
+#: mainloop.c:494
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)\n"
+msgstr "napotkano EOF zanim znaleziono zamykajÄ…ce \\endif(y)\n"
+
+#: psqlscanslash.l:614
+#, c-format
+msgid "unterminated quoted string\n"
+msgstr "niezakończona stała łańcuchowa\n"
+
+#: psqlscanslash.l:787
+#, c-format
+msgid "%s: out of memory\n"
+msgstr "%s: brak pamięci\n"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:66 sql_help.c:67
+#: sql_help.c:69 sql_help.c:71 sql_help.c:82 sql_help.c:84 sql_help.c:86
+#: sql_help.c:112 sql_help.c:118 sql_help.c:120 sql_help.c:122 sql_help.c:124
+#: sql_help.c:127 sql_help.c:129 sql_help.c:131 sql_help.c:236 sql_help.c:238
+#: sql_help.c:239 sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:264 sql_help.c:265 sql_help.c:266
+#: sql_help.c:268 sql_help.c:315 sql_help.c:317 sql_help.c:319 sql_help.c:321
+#: sql_help.c:382 sql_help.c:387 sql_help.c:389 sql_help.c:432 sql_help.c:434
+#: sql_help.c:437 sql_help.c:439 sql_help.c:506 sql_help.c:511 sql_help.c:516
+#: sql_help.c:521 sql_help.c:526 sql_help.c:575 sql_help.c:577 sql_help.c:579
+#: sql_help.c:581 sql_help.c:584 sql_help.c:586 sql_help.c:597 sql_help.c:599
+#: sql_help.c:640 sql_help.c:642 sql_help.c:644 sql_help.c:647 sql_help.c:649
+#: sql_help.c:651 sql_help.c:684 sql_help.c:688 sql_help.c:692 sql_help.c:711
+#: sql_help.c:714 sql_help.c:717 sql_help.c:746 sql_help.c:758 sql_help.c:766
+#: sql_help.c:769 sql_help.c:772 sql_help.c:787 sql_help.c:790 sql_help.c:813
+#: sql_help.c:816 sql_help.c:818 sql_help.c:820 sql_help.c:822 sql_help.c:863
+#: sql_help.c:886 sql_help.c:897 sql_help.c:899 sql_help.c:918 sql_help.c:928
+#: sql_help.c:930 sql_help.c:932 sql_help.c:944 sql_help.c:948 sql_help.c:950
+#: sql_help.c:961 sql_help.c:963 sql_help.c:965 sql_help.c:990 sql_help.c:994
+#: sql_help.c:997 sql_help.c:1000 sql_help.c:1002 sql_help.c:1004
+#: sql_help.c:1005 sql_help.c:1095 sql_help.c:1097 sql_help.c:1100
+#: sql_help.c:1103 sql_help.c:1105 sql_help.c:1107 sql_help.c:1110
+#: sql_help.c:1113 sql_help.c:1179 sql_help.c:1181 sql_help.c:1183
+#: sql_help.c:1186 sql_help.c:1207 sql_help.c:1210 sql_help.c:1213
+#: sql_help.c:1216 sql_help.c:1220 sql_help.c:1222 sql_help.c:1224
+#: sql_help.c:1226 sql_help.c:1240 sql_help.c:1243 sql_help.c:1245
+#: sql_help.c:1247 sql_help.c:1257 sql_help.c:1259 sql_help.c:1269
+#: sql_help.c:1271 sql_help.c:1281 sql_help.c:1284 sql_help.c:1306
+#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1313 sql_help.c:1315
+#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1370 sql_help.c:1408
+#: sql_help.c:1411 sql_help.c:1413 sql_help.c:1415 sql_help.c:1417
+#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1462 sql_help.c:1673
+#: sql_help.c:1737 sql_help.c:1756 sql_help.c:1769 sql_help.c:1825
+#: sql_help.c:1831 sql_help.c:1841 sql_help.c:1861 sql_help.c:1886
+#: sql_help.c:1904 sql_help.c:1933 sql_help.c:2026 sql_help.c:2068
+#: sql_help.c:2090 sql_help.c:2110 sql_help.c:2111 sql_help.c:2146
+#: sql_help.c:2166 sql_help.c:2188 sql_help.c:2202 sql_help.c:2223
+#: sql_help.c:2253 sql_help.c:2278 sql_help.c:2324 sql_help.c:2596
+#: sql_help.c:2609 sql_help.c:2626 sql_help.c:2642 sql_help.c:2682
+#: sql_help.c:2734 sql_help.c:2738 sql_help.c:2740 sql_help.c:2746
+#: sql_help.c:2764 sql_help.c:2791 sql_help.c:2826 sql_help.c:2838
+#: sql_help.c:2847 sql_help.c:2891 sql_help.c:2905 sql_help.c:2933
+#: sql_help.c:2941 sql_help.c:2949 sql_help.c:2957 sql_help.c:2965
+#: sql_help.c:2973 sql_help.c:2981 sql_help.c:2989 sql_help.c:2998
+#: sql_help.c:3009 sql_help.c:3017 sql_help.c:3025 sql_help.c:3033
+#: sql_help.c:3041 sql_help.c:3051 sql_help.c:3060 sql_help.c:3069
+#: sql_help.c:3077 sql_help.c:3086 sql_help.c:3094 sql_help.c:3102
+#: sql_help.c:3111 sql_help.c:3119 sql_help.c:3127 sql_help.c:3135
+#: sql_help.c:3143 sql_help.c:3151 sql_help.c:3159 sql_help.c:3167
+#: sql_help.c:3175 sql_help.c:3183 sql_help.c:3191 sql_help.c:3208
+#: sql_help.c:3217 sql_help.c:3225 sql_help.c:3242 sql_help.c:3257
+#: sql_help.c:3525 sql_help.c:3576 sql_help.c:3605 sql_help.c:3613
+#: sql_help.c:4036 sql_help.c:4084 sql_help.c:4225
+msgid "name"
+msgstr "nazwa"
+
+#: sql_help.c:37 sql_help.c:40 sql_help.c:43 sql_help.c:326 sql_help.c:1531
+#: sql_help.c:2906 sql_help.c:3830
+msgid "aggregate_signature"
+msgstr "podpis_agregatu"
+
+#: sql_help.c:38 sql_help.c:68 sql_help.c:83 sql_help.c:119 sql_help.c:251
+#: sql_help.c:269 sql_help.c:390 sql_help.c:438 sql_help.c:515 sql_help.c:561
+#: sql_help.c:576 sql_help.c:598 sql_help.c:648 sql_help.c:713 sql_help.c:768
+#: sql_help.c:789 sql_help.c:864 sql_help.c:888 sql_help.c:898 sql_help.c:931
+#: sql_help.c:951 sql_help.c:964 sql_help.c:1104 sql_help.c:1180
+#: sql_help.c:1223 sql_help.c:1244 sql_help.c:1258 sql_help.c:1270
+#: sql_help.c:1283 sql_help.c:1314 sql_help.c:1371 sql_help.c:1416
+msgid "new_name"
+msgstr "nowa_nazwa"
+
+#: sql_help.c:41 sql_help.c:70 sql_help.c:85 sql_help.c:121 sql_help.c:249
+#: sql_help.c:267 sql_help.c:388 sql_help.c:474 sql_help.c:520 sql_help.c:600
+#: sql_help.c:609 sql_help.c:667 sql_help.c:687 sql_help.c:716 sql_help.c:771
+#: sql_help.c:817 sql_help.c:900 sql_help.c:929 sql_help.c:949 sql_help.c:962
+#: sql_help.c:1001 sql_help.c:1164 sql_help.c:1182 sql_help.c:1225
+#: sql_help.c:1246 sql_help.c:1309 sql_help.c:1414 sql_help.c:2582
+msgid "new_owner"
+msgstr "nowy_właściciel"
+
+#: sql_help.c:44 sql_help.c:72 sql_help.c:87 sql_help.c:253 sql_help.c:318
+#: sql_help.c:440 sql_help.c:525 sql_help.c:650 sql_help.c:691 sql_help.c:719
+#: sql_help.c:774 sql_help.c:933 sql_help.c:966 sql_help.c:1106
+#: sql_help.c:1227 sql_help.c:1248 sql_help.c:1260 sql_help.c:1272
+#: sql_help.c:1316 sql_help.c:1418
+msgid "new_schema"
+msgstr "nowy_schemat"
+
+#: sql_help.c:45 sql_help.c:1587 sql_help.c:2907 sql_help.c:3851
+msgid "where aggregate_signature is:"
+msgstr "gdzie podpis_agregatu to:"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:336 sql_help.c:361
+#: sql_help.c:364 sql_help.c:367 sql_help.c:507 sql_help.c:512 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:1549 sql_help.c:1588
+#: sql_help.c:1591 sql_help.c:1594 sql_help.c:1738 sql_help.c:1757
+#: sql_help.c:1760 sql_help.c:2027 sql_help.c:2908 sql_help.c:2911
+#: sql_help.c:2914 sql_help.c:2999 sql_help.c:3410 sql_help.c:3743
+#: sql_help.c:3836 sql_help.c:3852 sql_help.c:3855 sql_help.c:3858
+msgid "argmode"
+msgstr "trybarg"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:337 sql_help.c:362
+#: sql_help.c:365 sql_help.c:368 sql_help.c:508 sql_help.c:513 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:1550 sql_help.c:1589
+#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1739 sql_help.c:1758
+#: sql_help.c:1761 sql_help.c:2028 sql_help.c:2909 sql_help.c:2912
+#: sql_help.c:2915 sql_help.c:3000 sql_help.c:3837 sql_help.c:3853
+#: sql_help.c:3856 sql_help.c:3859
+msgid "argname"
+msgstr "nazwaarg"
+
+#: sql_help.c:48 sql_help.c:51 sql_help.c:54 sql_help.c:338 sql_help.c:363
+#: sql_help.c:366 sql_help.c:369 sql_help.c:509 sql_help.c:514 sql_help.c:519
+#: sql_help.c:524 sql_help.c:529 sql_help.c:1551 sql_help.c:1590
+#: sql_help.c:1593 sql_help.c:1596 sql_help.c:2029 sql_help.c:2910
+#: sql_help.c:2913 sql_help.c:2916 sql_help.c:3001 sql_help.c:3838
+#: sql_help.c:3854 sql_help.c:3857 sql_help.c:3860
+msgid "argtype"
+msgstr "typarg"
+
+#: sql_help.c:113 sql_help.c:385 sql_help.c:463 sql_help.c:475 sql_help.c:814
+#: sql_help.c:858 sql_help.c:946 sql_help.c:1241 sql_help.c:1365
+#: sql_help.c:1393 sql_help.c:1644 sql_help.c:1650 sql_help.c:1936
+#: sql_help.c:1977 sql_help.c:1984 sql_help.c:1993 sql_help.c:2069
+#: sql_help.c:2225 sql_help.c:2254 sql_help.c:2346 sql_help.c:2359
+#: sql_help.c:2385 sql_help.c:2611 sql_help.c:2792 sql_help.c:2814
+#: sql_help.c:3277 sql_help.c:3444
+msgid "option"
+msgstr "opcja"
+
+#: sql_help.c:114 sql_help.c:815 sql_help.c:859 sql_help.c:1366
+#: sql_help.c:2070 sql_help.c:2226 sql_help.c:2255 sql_help.c:2386
+#: sql_help.c:2793
+msgid "where option can be:"
+msgstr "gdzie opcja może przyjmować:"
+
+#: sql_help.c:115 sql_help.c:1868
+msgid "allowconn"
+msgstr "zezwnapoł"
+
+#: sql_help.c:116 sql_help.c:860 sql_help.c:1367 sql_help.c:1869
+#: sql_help.c:2256 sql_help.c:2794
+msgid "connlimit"
+msgstr "limitpołączeń"
+
+#: sql_help.c:117 sql_help.c:1870
+msgid "istemplate"
+msgstr "czyszablon"
+
+#: sql_help.c:123 sql_help.c:588 sql_help.c:653 sql_help.c:1109
+#: sql_help.c:1157
+msgid "new_tablespace"
+msgstr "nowa_przestrzeńtabel"
+
+#: sql_help.c:125 sql_help.c:128 sql_help.c:130 sql_help.c:534 sql_help.c:536
+#: sql_help.c:537 sql_help.c:867 sql_help.c:871 sql_help.c:874 sql_help.c:1016
+#: sql_help.c:1019 sql_help.c:1373 sql_help.c:1376 sql_help.c:1378
+#: sql_help.c:2038 sql_help.c:3630 sql_help.c:4025
+msgid "configuration_parameter"
+msgstr "parametr_konfiguracji"
+
+#: sql_help.c:126 sql_help.c:386 sql_help.c:458 sql_help.c:464 sql_help.c:476
+#: sql_help.c:535 sql_help.c:583 sql_help.c:659 sql_help.c:665 sql_help.c:868
+#: sql_help.c:947 sql_help.c:1017 sql_help.c:1018 sql_help.c:1139
+#: sql_help.c:1159 sql_help.c:1185 sql_help.c:1242 sql_help.c:1374
+#: sql_help.c:1394 sql_help.c:1937 sql_help.c:1978 sql_help.c:1985
+#: sql_help.c:1994 sql_help.c:2039 sql_help.c:2040 sql_help.c:2098
+#: sql_help.c:2130 sql_help.c:2347 sql_help.c:2360 sql_help.c:2484
+#: sql_help.c:2496 sql_help.c:2509 sql_help.c:2546 sql_help.c:2568
+#: sql_help.c:2585 sql_help.c:2612 sql_help.c:2815 sql_help.c:3445
+#: sql_help.c:4026 sql_help.c:4027
+msgid "value"
+msgstr "wartość"
+
+#: sql_help.c:198
+msgid "target_role"
+msgstr "rola_docelowa"
+
+#: sql_help.c:199 sql_help.c:1920 sql_help.c:2302 sql_help.c:2307
+#: sql_help.c:3392 sql_help.c:3399 sql_help.c:3413 sql_help.c:3419
+#: sql_help.c:3725 sql_help.c:3732 sql_help.c:3746 sql_help.c:3752
+msgid "schema_name"
+msgstr "nazwa_schematu"
+
+#: sql_help.c:200
+msgid "abbreviated_grant_or_revoke"
+msgstr "skrót_przyznania_lub_odebrania_uprawnień"
+
+#: sql_help.c:201
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "gdzie skrót_przyznania_lub_odebrania_uprawnień to jedno z:"
+
+#: sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 sql_help.c:206
+#: sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 sql_help.c:211
+#: sql_help.c:559 sql_help.c:587 sql_help.c:652 sql_help.c:792 sql_help.c:878
+#: sql_help.c:1108 sql_help.c:1381 sql_help.c:2073 sql_help.c:2074
+#: sql_help.c:2075 sql_help.c:2076 sql_help.c:2077 sql_help.c:2204
+#: sql_help.c:2259 sql_help.c:2260 sql_help.c:2261 sql_help.c:2262
+#: sql_help.c:2263 sql_help.c:2797 sql_help.c:2798 sql_help.c:2799
+#: sql_help.c:2800 sql_help.c:2801 sql_help.c:3426 sql_help.c:3427
+#: sql_help.c:3428 sql_help.c:3726 sql_help.c:3730 sql_help.c:3733
+#: sql_help.c:3735 sql_help.c:3737 sql_help.c:3739 sql_help.c:3741
+#: sql_help.c:3747 sql_help.c:3749 sql_help.c:3751 sql_help.c:3753
+#: sql_help.c:3755 sql_help.c:3757 sql_help.c:3758 sql_help.c:3759
+#: sql_help.c:4046
+msgid "role_name"
+msgstr "nazwa_roli"
+
+#: sql_help.c:237 sql_help.c:451 sql_help.c:1124 sql_help.c:1126
+#: sql_help.c:1410 sql_help.c:1889 sql_help.c:1893 sql_help.c:1997
+#: sql_help.c:2001 sql_help.c:2094 sql_help.c:2480 sql_help.c:2492
+#: sql_help.c:2505 sql_help.c:2513 sql_help.c:2524 sql_help.c:2550
+#: sql_help.c:3476 sql_help.c:3491 sql_help.c:3493 sql_help.c:3911
+#: sql_help.c:3912 sql_help.c:3921 sql_help.c:3962 sql_help.c:3963
+#: sql_help.c:3964 sql_help.c:3965 sql_help.c:3966 sql_help.c:3967
+#: sql_help.c:4000 sql_help.c:4001 sql_help.c:4006 sql_help.c:4011
+#: sql_help.c:4150 sql_help.c:4151 sql_help.c:4160 sql_help.c:4201
+#: sql_help.c:4202 sql_help.c:4203 sql_help.c:4204 sql_help.c:4205
+#: sql_help.c:4206 sql_help.c:4253 sql_help.c:4255 sql_help.c:4288
+#: sql_help.c:4344 sql_help.c:4345 sql_help.c:4354 sql_help.c:4395
+#: sql_help.c:4396 sql_help.c:4397 sql_help.c:4398 sql_help.c:4399
+#: sql_help.c:4400
+msgid "expression"
+msgstr "wyrażenie"
+
+#: sql_help.c:240
+msgid "domain_constraint"
+msgstr "ograniczenie_domeny"
+
+#: sql_help.c:242 sql_help.c:244 sql_help.c:247 sql_help.c:466 sql_help.c:467
+#: sql_help.c:1101 sql_help.c:1145 sql_help.c:1146 sql_help.c:1147
+#: sql_help.c:1167 sql_help.c:1537 sql_help.c:1539 sql_help.c:1892
+#: sql_help.c:1996 sql_help.c:2000 sql_help.c:2512 sql_help.c:2523
+#: sql_help.c:3488
+msgid "constraint_name"
+msgstr "nazwa_ograniczenia"
+
+#: sql_help.c:245 sql_help.c:1102
+msgid "new_constraint_name"
+msgstr "nowa_nazwa_ograniczenia"
+
+#: sql_help.c:316 sql_help.c:945
+msgid "new_version"
+msgstr "nowa_wersja"
+
+#: sql_help.c:320 sql_help.c:322
+msgid "member_object"
+msgstr "obiekt_składowy"
+
+#: sql_help.c:323
+msgid "where member_object is:"
+msgstr "gdzie obiekt_składowy to:"
+
+#: sql_help.c:324 sql_help.c:329 sql_help.c:330 sql_help.c:331 sql_help.c:332
+#: sql_help.c:333 sql_help.c:334 sql_help.c:339 sql_help.c:343 sql_help.c:345
+#: sql_help.c:347 sql_help.c:348 sql_help.c:349 sql_help.c:350 sql_help.c:351
+#: sql_help.c:352 sql_help.c:353 sql_help.c:354 sql_help.c:355 sql_help.c:358
+#: sql_help.c:359 sql_help.c:1529 sql_help.c:1534 sql_help.c:1541
+#: sql_help.c:1542 sql_help.c:1543 sql_help.c:1544 sql_help.c:1545
+#: sql_help.c:1546 sql_help.c:1547 sql_help.c:1552 sql_help.c:1554
+#: sql_help.c:1558 sql_help.c:1560 sql_help.c:1564 sql_help.c:1565
+#: sql_help.c:1566 sql_help.c:1569 sql_help.c:1570 sql_help.c:1571
+#: sql_help.c:1572 sql_help.c:1573 sql_help.c:1574 sql_help.c:1575
+#: sql_help.c:1576 sql_help.c:1577 sql_help.c:1578 sql_help.c:1579
+#: sql_help.c:1584 sql_help.c:1585 sql_help.c:3826 sql_help.c:3831
+#: sql_help.c:3832 sql_help.c:3833 sql_help.c:3834 sql_help.c:3840
+#: sql_help.c:3841 sql_help.c:3842 sql_help.c:3843 sql_help.c:3844
+#: sql_help.c:3845 sql_help.c:3846 sql_help.c:3847 sql_help.c:3848
+#: sql_help.c:3849
+msgid "object_name"
+msgstr "nazwa_obiektu"
+
+#: sql_help.c:325 sql_help.c:1530 sql_help.c:3829
+msgid "aggregate_name"
+msgstr "nazwa_agregatu"
+
+#: sql_help.c:327 sql_help.c:1532 sql_help.c:1803 sql_help.c:1807
+#: sql_help.c:1809 sql_help.c:2924
+msgid "source_type"
+msgstr "typ_źródłowy"
+
+#: sql_help.c:328 sql_help.c:1533 sql_help.c:1804 sql_help.c:1808
+#: sql_help.c:1810 sql_help.c:2925
+msgid "target_type"
+msgstr "typ_docelowy"
+
+#: sql_help.c:335 sql_help.c:756 sql_help.c:1548 sql_help.c:1805
+#: sql_help.c:1844 sql_help.c:1907 sql_help.c:2147 sql_help.c:2178
+#: sql_help.c:2688 sql_help.c:3409 sql_help.c:3742 sql_help.c:3835
+#: sql_help.c:3940 sql_help.c:3944 sql_help.c:3948 sql_help.c:3951
+#: sql_help.c:4179 sql_help.c:4183 sql_help.c:4187 sql_help.c:4190
+#: sql_help.c:4373 sql_help.c:4377 sql_help.c:4381 sql_help.c:4384
+msgid "function_name"
+msgstr "nazwa_funkcji"
+
+#: sql_help.c:340 sql_help.c:749 sql_help.c:1555 sql_help.c:2171
+msgid "operator_name"
+msgstr "nazwa_operatora"
+
+#: sql_help.c:341 sql_help.c:685 sql_help.c:689 sql_help.c:693 sql_help.c:1556
+#: sql_help.c:2148 sql_help.c:3042
+msgid "left_type"
+msgstr "typ_lewy"
+
+#: sql_help.c:342 sql_help.c:686 sql_help.c:690 sql_help.c:694 sql_help.c:1557
+#: sql_help.c:2149 sql_help.c:3043
+msgid "right_type"
+msgstr "typ_prawy"
+
+#: sql_help.c:344 sql_help.c:346 sql_help.c:712 sql_help.c:715 sql_help.c:718
+#: sql_help.c:747 sql_help.c:759 sql_help.c:767 sql_help.c:770 sql_help.c:773
+#: sql_help.c:1559 sql_help.c:1561 sql_help.c:2168 sql_help.c:2189
+#: sql_help.c:2529 sql_help.c:3052 sql_help.c:3061
+msgid "index_method"
+msgstr "metoda_indeksowania"
+
+#: sql_help.c:356 sql_help.c:1163 sql_help.c:1580 sql_help.c:2035
+#: sql_help.c:2487 sql_help.c:2655 sql_help.c:3199 sql_help.c:3423
+#: sql_help.c:3756
+msgid "type_name"
+msgstr "nazwa_typu"
+
+#: sql_help.c:357 sql_help.c:1581 sql_help.c:2034 sql_help.c:2656
+#: sql_help.c:2882 sql_help.c:3200 sql_help.c:3415 sql_help.c:3748
+msgid "lang_name"
+msgstr "nazwa_jęz"
+
+#: sql_help.c:360
+msgid "and aggregate_signature is:"
+msgstr "a podpis_agregatu to:"
+
+#: sql_help.c:383 sql_help.c:1675 sql_help.c:1934
+msgid "handler_function"
+msgstr "funkcja_uchwytu"
+
+#: sql_help.c:384 sql_help.c:1935
+msgid "validator_function"
+msgstr "funkcja_walidatora"
+
+#: sql_help.c:433 sql_help.c:510 sql_help.c:641 sql_help.c:1096
+#: sql_help.c:1307 sql_help.c:2520 sql_help.c:2521 sql_help.c:2537
+#: sql_help.c:2538
+msgid "action"
+msgstr "akcja"
+
+#: sql_help.c:435 sql_help.c:442 sql_help.c:446 sql_help.c:447 sql_help.c:450
+#: sql_help.c:452 sql_help.c:453 sql_help.c:454 sql_help.c:456 sql_help.c:459
+#: sql_help.c:461 sql_help.c:462 sql_help.c:645 sql_help.c:655 sql_help.c:657
+#: sql_help.c:660 sql_help.c:662 sql_help.c:927 sql_help.c:1098
+#: sql_help.c:1116 sql_help.c:1120 sql_help.c:1121 sql_help.c:1125
+#: sql_help.c:1127 sql_help.c:1128 sql_help.c:1129 sql_help.c:1131
+#: sql_help.c:1134 sql_help.c:1135 sql_help.c:1137 sql_help.c:1140
+#: sql_help.c:1142 sql_help.c:1409 sql_help.c:1412 sql_help.c:1432
+#: sql_help.c:1536 sql_help.c:1641 sql_help.c:1646 sql_help.c:1660
+#: sql_help.c:1661 sql_help.c:1662 sql_help.c:1975 sql_help.c:1988
+#: sql_help.c:2032 sql_help.c:2093 sql_help.c:2128 sql_help.c:2332
+#: sql_help.c:2361 sql_help.c:2362 sql_help.c:2471 sql_help.c:2479
+#: sql_help.c:2488 sql_help.c:2491 sql_help.c:2500 sql_help.c:2504
+#: sql_help.c:2525 sql_help.c:2527 sql_help.c:2534 sql_help.c:2549
+#: sql_help.c:2566 sql_help.c:2691 sql_help.c:2827 sql_help.c:3394
+#: sql_help.c:3395 sql_help.c:3475 sql_help.c:3490 sql_help.c:3492
+#: sql_help.c:3494 sql_help.c:3727 sql_help.c:3728 sql_help.c:3828
+#: sql_help.c:3971 sql_help.c:4210 sql_help.c:4252 sql_help.c:4254
+#: sql_help.c:4256 sql_help.c:4273 sql_help.c:4276 sql_help.c:4404
+msgid "column_name"
+msgstr "nazwa_kolumny"
+
+#: sql_help.c:436 sql_help.c:646 sql_help.c:1099
+msgid "new_column_name"
+msgstr "nowa_nazwa_kolumny"
+
+#: sql_help.c:441 sql_help.c:531 sql_help.c:654 sql_help.c:1115
+#: sql_help.c:1323
+msgid "where action is one of:"
+msgstr "gdzie akcja to jedna z:"
+
+#: sql_help.c:443 sql_help.c:448 sql_help.c:919 sql_help.c:1117
+#: sql_help.c:1122 sql_help.c:1325 sql_help.c:1329 sql_help.c:1887
+#: sql_help.c:1976 sql_help.c:2167 sql_help.c:2325 sql_help.c:2472
+#: sql_help.c:2736 sql_help.c:3577
+msgid "data_type"
+msgstr "typ_danych"
+
+#: sql_help.c:444 sql_help.c:449 sql_help.c:1118 sql_help.c:1123
+#: sql_help.c:1326 sql_help.c:1330 sql_help.c:1888 sql_help.c:1979
+#: sql_help.c:2095 sql_help.c:2473 sql_help.c:2481 sql_help.c:2493
+#: sql_help.c:2506 sql_help.c:2737 sql_help.c:2743 sql_help.c:3485
+msgid "collation"
+msgstr "porównanie"
+
+#: sql_help.c:445 sql_help.c:1119 sql_help.c:1980 sql_help.c:1989
+#: sql_help.c:2474 sql_help.c:2489 sql_help.c:2501
+msgid "column_constraint"
+msgstr "ograniczenie_kolumny"
+
+#: sql_help.c:455 sql_help.c:656 sql_help.c:1136
+msgid "integer"
+msgstr "liczba_całkowita"
+
+#: sql_help.c:457 sql_help.c:460 sql_help.c:658 sql_help.c:661 sql_help.c:1138
+#: sql_help.c:1141
+msgid "attribute_option"
+msgstr "opcja_atrybutu"
+
+#: sql_help.c:465 sql_help.c:1143 sql_help.c:1981 sql_help.c:1990
+#: sql_help.c:2475 sql_help.c:2490 sql_help.c:2502
+msgid "table_constraint"
+msgstr "ograniczenie_tabeli"
+
+#: sql_help.c:468 sql_help.c:469 sql_help.c:470 sql_help.c:471 sql_help.c:1148
+#: sql_help.c:1149 sql_help.c:1150 sql_help.c:1151 sql_help.c:1582
+msgid "trigger_name"
+msgstr "nazwa_wyzwalacza"
+
+#: sql_help.c:472 sql_help.c:473 sql_help.c:1161 sql_help.c:1162
+#: sql_help.c:1982 sql_help.c:1987 sql_help.c:2478 sql_help.c:2499
+msgid "parent_table"
+msgstr "tabela_nadrzędna"
+
+#: sql_help.c:530 sql_help.c:580 sql_help.c:643 sql_help.c:1286
+#: sql_help.c:1919
+msgid "extension_name"
+msgstr "nazwa_rozszerzenia"
+
+#: sql_help.c:532 sql_help.c:2036
+msgid "execution_cost"
+msgstr "koszt_wykonania"
+
+#: sql_help.c:533 sql_help.c:2037
+msgid "result_rows"
+msgstr "wiersze_wynikowe"
+
+#: sql_help.c:554 sql_help.c:556 sql_help.c:857 sql_help.c:865 sql_help.c:869
+#: sql_help.c:872 sql_help.c:875 sql_help.c:1364 sql_help.c:1372
+#: sql_help.c:1375 sql_help.c:1377 sql_help.c:1379 sql_help.c:2303
+#: sql_help.c:2305 sql_help.c:2308 sql_help.c:2309 sql_help.c:3393
+#: sql_help.c:3397 sql_help.c:3400 sql_help.c:3402 sql_help.c:3404
+#: sql_help.c:3406 sql_help.c:3408 sql_help.c:3414 sql_help.c:3416
+#: sql_help.c:3418 sql_help.c:3420 sql_help.c:3422 sql_help.c:3424
+msgid "role_specification"
+msgstr "specyfikacja_roli"
+
+#: sql_help.c:555 sql_help.c:557 sql_help.c:1391 sql_help.c:1862
+#: sql_help.c:2311 sql_help.c:2812 sql_help.c:3233 sql_help.c:4056
+msgid "user_name"
+msgstr "nazwa_użytkownika"
+
+#: sql_help.c:558 sql_help.c:877 sql_help.c:1380 sql_help.c:2310
+#: sql_help.c:3425
+msgid "where role_specification can be:"
+msgstr "gdzie specyfikacja_roli może przyjmować:"
+
+#: sql_help.c:560
+msgid "group_name"
+msgstr "nazwa_grupy"
+
+#: sql_help.c:578 sql_help.c:1867 sql_help.c:2099 sql_help.c:2131
+#: sql_help.c:2485 sql_help.c:2497 sql_help.c:2510 sql_help.c:2547
+#: sql_help.c:2569 sql_help.c:2581 sql_help.c:3421 sql_help.c:3754
+msgid "tablespace_name"
+msgstr "nazwa_przestrzenitabel"
+
+#: sql_help.c:582 sql_help.c:585 sql_help.c:664 sql_help.c:666 sql_help.c:1158
+#: sql_help.c:1160 sql_help.c:2097 sql_help.c:2129 sql_help.c:2483
+#: sql_help.c:2495 sql_help.c:2508 sql_help.c:2545 sql_help.c:2567
+msgid "storage_parameter"
+msgstr "parametr_przechowywania"
+
+#: sql_help.c:608 sql_help.c:1553 sql_help.c:3839
+msgid "large_object_oid"
+msgstr "oid_dużego_obiektu"
+
+#: sql_help.c:663 sql_help.c:1156 sql_help.c:1165 sql_help.c:1168
+#: sql_help.c:1472
+msgid "index_name"
+msgstr "nazwa_indeksu"
+
+#: sql_help.c:695 sql_help.c:2152
+msgid "res_proc"
+msgstr "proc_res"
+
+#: sql_help.c:696 sql_help.c:2153
+msgid "join_proc"
+msgstr "procedura_złączenia"
+
+#: sql_help.c:748 sql_help.c:760 sql_help.c:2170
+msgid "strategy_number"
+msgstr "numer_strategii"
+
+#: sql_help.c:750 sql_help.c:751 sql_help.c:754 sql_help.c:755 sql_help.c:761
+#: sql_help.c:762 sql_help.c:764 sql_help.c:765 sql_help.c:2172
+#: sql_help.c:2173 sql_help.c:2176 sql_help.c:2177
+msgid "op_type"
+msgstr "typ_op"
+
+#: sql_help.c:752 sql_help.c:2174
+msgid "sort_family_name"
+msgstr "nazwa_rodziny_sortowania"
+
+#: sql_help.c:753 sql_help.c:763 sql_help.c:2175
+msgid "support_number"
+msgstr "numer_obsługi"
+
+#: sql_help.c:757 sql_help.c:1806 sql_help.c:2179 sql_help.c:2658
+#: sql_help.c:2660
+msgid "argument_type"
+msgstr "typ_argumentu"
+
+#: sql_help.c:788 sql_help.c:791 sql_help.c:819 sql_help.c:821 sql_help.c:823
+#: sql_help.c:887 sql_help.c:926 sql_help.c:1282 sql_help.c:1285
+#: sql_help.c:1431 sql_help.c:1471 sql_help.c:1538 sql_help.c:1563
+#: sql_help.c:1568 sql_help.c:1583 sql_help.c:1640 sql_help.c:1645
+#: sql_help.c:1974 sql_help.c:1986 sql_help.c:2091 sql_help.c:2127
+#: sql_help.c:2203 sql_help.c:2224 sql_help.c:2280 sql_help.c:2331
+#: sql_help.c:2363 sql_help.c:2470 sql_help.c:2486 sql_help.c:2498
+#: sql_help.c:2565 sql_help.c:2684 sql_help.c:2861 sql_help.c:3078
+#: sql_help.c:3103 sql_help.c:3209 sql_help.c:3391 sql_help.c:3396
+#: sql_help.c:3441 sql_help.c:3473 sql_help.c:3724 sql_help.c:3729
+#: sql_help.c:3827 sql_help.c:3926 sql_help.c:3928 sql_help.c:3977
+#: sql_help.c:4016 sql_help.c:4165 sql_help.c:4167 sql_help.c:4216
+#: sql_help.c:4250 sql_help.c:4272 sql_help.c:4274 sql_help.c:4275
+#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4410
+msgid "table_name"
+msgstr "nazwa_tabeli"
+
+#: sql_help.c:793 sql_help.c:2205
+msgid "using_expression"
+msgstr "wyrażenie_using"
+
+#: sql_help.c:794 sql_help.c:2206
+msgid "check_expression"
+msgstr "wyrażenie_check"
+
+#: sql_help.c:861 sql_help.c:1368 sql_help.c:2071 sql_help.c:2257
+#: sql_help.c:2795
+msgid "password"
+msgstr "hasło"
+
+#: sql_help.c:862 sql_help.c:1369 sql_help.c:2072 sql_help.c:2258
+#: sql_help.c:2796
+msgid "timestamp"
+msgstr "znacznik_czasu"
+
+#: sql_help.c:866 sql_help.c:870 sql_help.c:873 sql_help.c:876 sql_help.c:3401
+#: sql_help.c:3734
+msgid "database_name"
+msgstr "nazwa_bazydanych"
+
+#: sql_help.c:920 sql_help.c:2326
+msgid "increment"
+msgstr "przyrost"
+
+#: sql_help.c:921 sql_help.c:2327
+msgid "minvalue"
+msgstr "wartośćmin"
+
+#: sql_help.c:922 sql_help.c:2328
+msgid "maxvalue"
+msgstr "wartośćmaks"
+
+#: sql_help.c:923 sql_help.c:2329 sql_help.c:3924 sql_help.c:4014
+#: sql_help.c:4163 sql_help.c:4292 sql_help.c:4357
+msgid "start"
+msgstr "poczÄ…tek"
+
+#: sql_help.c:924 sql_help.c:1133
+msgid "restart"
+msgstr "restart"
+
+#: sql_help.c:925 sql_help.c:2330
+msgid "cache"
+msgstr "pamięć_podręczna"
+
+#: sql_help.c:991
+#| msgid "option"
+msgid "suboption"
+msgstr "podopcja"
+
+#: sql_help.c:992
+#| msgid "where option can be:"
+msgid "where suboption can be:"
+msgstr "gdzie podopcja może przyjmować:"
+
+#: sql_help.c:993 sql_help.c:2387
+#| msgid "object_name"
+msgid "slot_name"
+msgstr "nazwa_gniazda"
+
+#: sql_help.c:995 sql_help.c:2384
+#| msgid "relation_name"
+msgid "publication_name"
+msgstr "nazwa_publikacji"
+
+#: sql_help.c:996 sql_help.c:998
+#| msgid "option"
+msgid "puboption"
+msgstr "podopcja"
+
+#: sql_help.c:999
+#| msgid "where option can be:"
+msgid "where puboption can be:"
+msgstr "gdzie podopcja może przyjmować:"
+
+#: sql_help.c:1003 sql_help.c:2383
+msgid "conninfo"
+msgstr "połączenie"
+
+#: sql_help.c:1111 sql_help.c:1114
+#| msgid "relation_name"
+msgid "partition_name"
+msgstr "nazwa_partycji"
+
+#: sql_help.c:1112 sql_help.c:1991 sql_help.c:2503
+msgid "partition_bound_spec"
+msgstr "spec_powiazana_partycji"
+
+#: sql_help.c:1130 sql_help.c:2515
+#| msgid "sequence_name"
+msgid "sequence_options"
+msgstr "opcje_sekwencji"
+
+#: sql_help.c:1132
+#| msgid "sequence_name"
+msgid "sequence_option"
+msgstr "opcja_sekwencji"
+
+#: sql_help.c:1144
+msgid "table_constraint_using_index"
+msgstr "ograniczenie_tabeli_używające_indeksu"
+
+#: sql_help.c:1152 sql_help.c:1153 sql_help.c:1154 sql_help.c:1155
+msgid "rewrite_rule_name"
+msgstr "nazwa_reguły_przepisania"
+
+#: sql_help.c:1166
+msgid "and table_constraint_using_index is:"
+msgstr "a ograniczenie_tabeli_używające_indeksu to:"
+
+#: sql_help.c:1184 sql_help.c:1187 sql_help.c:2584
+msgid "tablespace_option"
+msgstr "opcja_przestrzeni_tabel"
+
+#: sql_help.c:1208 sql_help.c:1211 sql_help.c:1217 sql_help.c:1221
+msgid "token_type"
+msgstr "typ_tokenu"
+
+#: sql_help.c:1209 sql_help.c:1212
+msgid "dictionary_name"
+msgstr "nazwa_słownika"
+
+#: sql_help.c:1214 sql_help.c:1218
+msgid "old_dictionary"
+msgstr "stary_słownik"
+
+#: sql_help.c:1215 sql_help.c:1219
+msgid "new_dictionary"
+msgstr "nowy_słownik"
+
+#: sql_help.c:1311 sql_help.c:1324 sql_help.c:1327 sql_help.c:1328
+#: sql_help.c:2735
+msgid "attribute_name"
+msgstr "nazwa_atrybutu"
+
+#: sql_help.c:1312
+msgid "new_attribute_name"
+msgstr "nowa_nazwa_atrybutu"
+
+#: sql_help.c:1318 sql_help.c:1322
+msgid "new_enum_value"
+msgstr "nowa_nazwa_wylicz"
+
+#: sql_help.c:1319
+#| msgid "new_enum_value"
+msgid "neighbor_enum_value"
+msgstr "sasiednia_nazwa_wylicz"
+
+#: sql_help.c:1321
+msgid "existing_enum_value"
+msgstr "istniejąca_wartość_wylicz"
+
+#: sql_help.c:1392 sql_help.c:1983 sql_help.c:1992 sql_help.c:2342
+#: sql_help.c:2813 sql_help.c:3234 sql_help.c:3407 sql_help.c:3442
+#: sql_help.c:3740
+msgid "server_name"
+msgstr "nazwa_serwera"
+
+#: sql_help.c:1420 sql_help.c:1423 sql_help.c:2828
+msgid "view_option_name"
+msgstr "nazwa_opcji_przeglÄ…dania"
+
+#: sql_help.c:1421 sql_help.c:2829
+msgid "view_option_value"
+msgstr "wartość_opcji_przeglądania"
+
+#: sql_help.c:1446 sql_help.c:4072 sql_help.c:4074 sql_help.c:4098
+msgid "transaction_mode"
+msgstr "tryb_transakcji"
+
+#: sql_help.c:1447 sql_help.c:4075 sql_help.c:4099
+msgid "where transaction_mode is one of:"
+msgstr "gdzie tryb_transakcji to jeden z:"
+
+#: sql_help.c:1535
+msgid "relation_name"
+msgstr "nazwa_relacji"
+
+#: sql_help.c:1540 sql_help.c:3403 sql_help.c:3736
+msgid "domain_name"
+msgstr "nazwa_domeny"
+
+#: sql_help.c:1562
+msgid "policy_name"
+msgstr "nazwa_polityki"
+
+#: sql_help.c:1567
+msgid "rule_name"
+msgstr "nazwa_reguły"
+
+#: sql_help.c:1586
+msgid "text"
+msgstr "tekst"
+
+#: sql_help.c:1611 sql_help.c:3586 sql_help.c:3774
+msgid "transaction_id"
+msgstr "id_transakcji"
+
+#: sql_help.c:1642 sql_help.c:1648 sql_help.c:3512
+msgid "filename"
+msgstr "nazwa_pliku"
+
+#: sql_help.c:1643 sql_help.c:1649 sql_help.c:2282 sql_help.c:2283
+#: sql_help.c:2284
+msgid "command"
+msgstr "polecenie"
+
+#: sql_help.c:1647 sql_help.c:2132 sql_help.c:2570 sql_help.c:2830
+#: sql_help.c:2848 sql_help.c:3477
+msgid "query"
+msgstr "zapytanie"
+
+#: sql_help.c:1651 sql_help.c:3280
+msgid "where option can be one of:"
+msgstr "gdzie opcja może być jedną z:"
+
+#: sql_help.c:1652
+msgid "format_name"
+msgstr "nazwa_formatu"
+
+#: sql_help.c:1653 sql_help.c:1654 sql_help.c:1657 sql_help.c:3281
+#: sql_help.c:3282 sql_help.c:3283 sql_help.c:3284 sql_help.c:3285
+#: sql_help.c:3286
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1655
+msgid "delimiter_character"
+msgstr "znak_ogranicznika"
+
+#: sql_help.c:1656
+msgid "null_string"
+msgstr "pusty_ciąg_znaków"
+
+#: sql_help.c:1658
+msgid "quote_character"
+msgstr "znak_cytatu"
+
+#: sql_help.c:1659
+msgid "escape_character"
+msgstr "znak_ucieczki"
+
+#: sql_help.c:1663
+msgid "encoding_name"
+msgstr "nazwa_kodowania"
+
+#: sql_help.c:1674
+msgid "access_method_type"
+msgstr "typ_metody_dostępu"
+
+#: sql_help.c:1740 sql_help.c:1759 sql_help.c:1762
+msgid "arg_data_type"
+msgstr "typ_arg_danych"
+
+#: sql_help.c:1741 sql_help.c:1763 sql_help.c:1771
+msgid "sfunc"
+msgstr "sfunk"
+
+#: sql_help.c:1742 sql_help.c:1764 sql_help.c:1772
+msgid "state_data_type"
+msgstr "typ_danych_stanu"
+
+#: sql_help.c:1743 sql_help.c:1765 sql_help.c:1773
+msgid "state_data_size"
+msgstr "rozm_danych_stanu"
+
+#: sql_help.c:1744 sql_help.c:1766 sql_help.c:1774
+msgid "ffunc"
+msgstr "ffunk"
+
+#: sql_help.c:1745 sql_help.c:1775
+msgid "combinefunc"
+msgstr "combinefunk"
+
+#: sql_help.c:1746 sql_help.c:1776
+msgid "serialfunc"
+msgstr "serialfunk"
+
+#: sql_help.c:1747 sql_help.c:1777
+msgid "deserialfunc"
+msgstr "deserialfunk"
+
+#: sql_help.c:1748 sql_help.c:1767 sql_help.c:1778
+msgid "initial_condition"
+msgstr "warunek_poczÄ…tkowy"
+
+#: sql_help.c:1749 sql_help.c:1779
+msgid "msfunc"
+msgstr "msfunk"
+
+#: sql_help.c:1750 sql_help.c:1780
+msgid "minvfunc"
+msgstr "fnwmin"
+
+#: sql_help.c:1751 sql_help.c:1781
+msgid "mstate_data_type"
+msgstr "typ_danych_mstanu"
+
+#: sql_help.c:1752 sql_help.c:1782
+msgid "mstate_data_size"
+msgstr "rozm_danych_mstanu"
+
+#: sql_help.c:1753 sql_help.c:1783
+msgid "mffunc"
+msgstr "mffunk"
+
+#: sql_help.c:1754 sql_help.c:1784
+msgid "minitial_condition"
+msgstr "warunek_mpoczÄ…tkowy"
+
+#: sql_help.c:1755 sql_help.c:1785
+msgid "sort_operator"
+msgstr "operator_sortowania"
+
+#: sql_help.c:1768
+msgid "or the old syntax"
+msgstr "albo stara składnia"
+
+#: sql_help.c:1770
+msgid "base_type"
+msgstr "typ_bazowy"
+
+#: sql_help.c:1826
+msgid "locale"
+msgstr "lokalizacja"
+
+#: sql_help.c:1827 sql_help.c:1865
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:1828 sql_help.c:1866
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:1829 sql_help.c:3825
+msgid "provider"
+msgstr "dostawca"
+
+#: sql_help.c:1830 sql_help.c:1921
+msgid "version"
+msgstr "wersja"
+
+#: sql_help.c:1832
+msgid "existing_collation"
+msgstr "istniejące_porównanie"
+
+#: sql_help.c:1842
+msgid "source_encoding"
+msgstr "kodowanie_źródła"
+
+#: sql_help.c:1843
+msgid "dest_encoding"
+msgstr "kodowanie_celu"
+
+#: sql_help.c:1863 sql_help.c:2610
+msgid "template"
+msgstr "szablon"
+
+#: sql_help.c:1864
+msgid "encoding"
+msgstr "kodowanie"
+
+#: sql_help.c:1890
+msgid "constraint"
+msgstr "ograniczenie"
+
+#: sql_help.c:1891
+msgid "where constraint is:"
+msgstr "gdzie ograniczenie to:"
+
+#: sql_help.c:1905 sql_help.c:2279 sql_help.c:2683
+msgid "event"
+msgstr "zdarzenie"
+
+#: sql_help.c:1906
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:1922
+msgid "old_version"
+msgstr "stara_wersja"
+
+#: sql_help.c:1995 sql_help.c:2511
+msgid "where column_constraint is:"
+msgstr "gdzie ograniczenie_kolumny to:"
+
+#: sql_help.c:1998 sql_help.c:2030 sql_help.c:2514
+msgid "default_expr"
+msgstr "wyrażenie_domyślne"
+
+#: sql_help.c:1999 sql_help.c:2522
+msgid "and table_constraint is:"
+msgstr "a ograniczenie_tabeli to:"
+
+#: sql_help.c:2031
+msgid "rettype"
+msgstr "typ_zwracany"
+
+#: sql_help.c:2033
+msgid "column_type"
+msgstr "typ_kolumny"
+
+#: sql_help.c:2041
+msgid "definition"
+msgstr "definicja"
+
+#: sql_help.c:2042
+msgid "obj_file"
+msgstr "plik_obj"
+
+#: sql_help.c:2043
+msgid "link_symbol"
+msgstr "link_symbolicz"
+
+#: sql_help.c:2044
+msgid "attribute"
+msgstr "atrybut"
+
+#: sql_help.c:2078 sql_help.c:2264 sql_help.c:2802
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2092
+msgid "method"
+msgstr "metoda"
+
+#: sql_help.c:2096 sql_help.c:2482 sql_help.c:2494 sql_help.c:2507
+#: sql_help.c:2551 sql_help.c:3486
+msgid "opclass"
+msgstr "klasa_op"
+
+#: sql_help.c:2100 sql_help.c:2533
+msgid "predicate"
+msgstr "orzeczenie"
+
+#: sql_help.c:2112
+msgid "call_handler"
+msgstr "uchwyt_wywołania"
+
+#: sql_help.c:2113
+msgid "inline_handler"
+msgstr "uchwyt_wbudowany"
+
+#: sql_help.c:2114
+msgid "valfunction"
+msgstr "funkcja_walid"
+
+#: sql_help.c:2150
+msgid "com_op"
+msgstr "op_kom"
+
+#: sql_help.c:2151
+msgid "neg_op"
+msgstr "op_neg"
+
+#: sql_help.c:2169
+msgid "family_name"
+msgstr "nazwa_rodziny"
+
+#: sql_help.c:2180
+msgid "storage_type"
+msgstr "typ_przechowywania"
+
+#: sql_help.c:2281 sql_help.c:2687 sql_help.c:2864 sql_help.c:3496
+#: sql_help.c:3915 sql_help.c:3917 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4154 sql_help.c:4156 sql_help.c:4259 sql_help.c:4348
+#: sql_help.c:4350
+msgid "condition"
+msgstr "warunek"
+
+#: sql_help.c:2285 sql_help.c:2690
+msgid "where event can be one of:"
+msgstr "gdzie zdarzenie może być jednym z:"
+
+#: sql_help.c:2304 sql_help.c:2306
+msgid "schema_element"
+msgstr "element_schematu"
+
+#: sql_help.c:2343
+msgid "server_type"
+msgstr "typ_serwera"
+
+#: sql_help.c:2344
+msgid "server_version"
+msgstr "wersja_serwera"
+
+#: sql_help.c:2345 sql_help.c:3405 sql_help.c:3738
+msgid "fdw_name"
+msgstr "nazwa_fdw"
+
+#: sql_help.c:2358
+#| msgid "Statistics"
+msgid "statistics_name"
+msgstr "nazwa_statystyki"
+
+#: sql_help.c:2382
+#| msgid "function_name"
+msgid "subscription_name"
+msgstr "nazwa_subskrypcji"
+
+#: sql_help.c:2476
+msgid "source_table"
+msgstr "tabela_źródłowa"
+
+#: sql_help.c:2477
+msgid "like_option"
+msgstr "opcja_podobne"
+
+#: sql_help.c:2516 sql_help.c:2517 sql_help.c:2526 sql_help.c:2528
+#: sql_help.c:2532
+msgid "index_parameters"
+msgstr "parametry_indeksu"
+
+#: sql_help.c:2518 sql_help.c:2535
+msgid "reftable"
+msgstr "tabelaref"
+
+#: sql_help.c:2519 sql_help.c:2536
+msgid "refcolumn"
+msgstr "kolumnaref"
+
+#: sql_help.c:2530
+msgid "exclude_element"
+msgstr "element_wyłączany"
+
+#: sql_help.c:2531 sql_help.c:3922 sql_help.c:4012 sql_help.c:4161
+#: sql_help.c:4290 sql_help.c:4355
+msgid "operator"
+msgstr "operator"
+
+#: sql_help.c:2539
+msgid "and like_option is:"
+msgstr "a opcja_podobne to:"
+
+#: sql_help.c:2540
+msgid "and partition_bound_spec is:"
+msgstr "a spec_powiazana_partycji to:"
+
+#: sql_help.c:2541 sql_help.c:2542 sql_help.c:2543
+msgid "bound_literal"
+msgstr "powiazany_literal"
+
+#: sql_help.c:2544
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parametry_indeksu w ograniczeniach UNIQUE, PRIMARY KEY i EXCLUDE to:"
+
+#: sql_help.c:2548
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "element_wyłączany w ograniczeniu EXCLUDE to:"
+
+#: sql_help.c:2583
+msgid "directory"
+msgstr "folder"
+
+#: sql_help.c:2597
+msgid "parser_name"
+msgstr "nazwa_analizatora"
+
+#: sql_help.c:2598
+msgid "source_config"
+msgstr "konfiguracja_źródła"
+
+#: sql_help.c:2627
+msgid "start_function"
+msgstr "funkcja_startowa"
+
+#: sql_help.c:2628
+msgid "gettoken_function"
+msgstr "funkcja_gettoken"
+
+#: sql_help.c:2629
+msgid "end_function"
+msgstr "funkcja_kończąca"
+
+#: sql_help.c:2630
+msgid "lextypes_function"
+msgstr "funkcja_lextypes"
+
+#: sql_help.c:2631
+msgid "headline_function"
+msgstr "funkcja_nagłówkowa"
+
+#: sql_help.c:2643
+msgid "init_function"
+msgstr "funkcja_inicjujÄ…ca"
+
+#: sql_help.c:2644
+msgid "lexize_function"
+msgstr "funkcja_lexize"
+
+#: sql_help.c:2657
+msgid "from_sql_function_name"
+msgstr "nazwa_funkcji_from_sql"
+
+#: sql_help.c:2659
+msgid "to_sql_function_name"
+msgstr "nazwa_funkcji_to_sql"
+
+#: sql_help.c:2685
+msgid "referenced_table_name"
+msgstr "nazwa_tabeli_odwołania"
+
+#: sql_help.c:2686
+#| msgid "relation_name"
+msgid "transition_relation_name"
+msgstr "nazwa_relacji_tranzycji"
+
+#: sql_help.c:2689
+msgid "arguments"
+msgstr "argumenty"
+
+#: sql_help.c:2739 sql_help.c:3850
+msgid "label"
+msgstr "etykieta"
+
+#: sql_help.c:2741
+msgid "subtype"
+msgstr "podtyp"
+
+#: sql_help.c:2742
+msgid "subtype_operator_class"
+msgstr "klasa_operatora_podtypu"
+
+#: sql_help.c:2744
+msgid "canonical_function"
+msgstr "funkcja_kanoniczna"
+
+#: sql_help.c:2745
+msgid "subtype_diff_function"
+msgstr "funkcja_różnicy_podtypu"
+
+#: sql_help.c:2747
+msgid "input_function"
+msgstr "funkcja_wejścia"
+
+#: sql_help.c:2748
+msgid "output_function"
+msgstr "funkcja_wyjścia"
+
+#: sql_help.c:2749
+msgid "receive_function"
+msgstr "funkcja_odbierajÄ…ca"
+
+#: sql_help.c:2750
+msgid "send_function"
+msgstr "funkcja_wysyłająca"
+
+#: sql_help.c:2751
+msgid "type_modifier_input_function"
+msgstr "funkcja_przyjmujÄ…ca_modyfikator_typu"
+
+#: sql_help.c:2752
+msgid "type_modifier_output_function"
+msgstr "funkcja_zwracajÄ…ca_modyfikator_typu"
+
+#: sql_help.c:2753
+msgid "analyze_function"
+msgstr "funkcja_analizy"
+
+#: sql_help.c:2754
+msgid "internallength"
+msgstr "wewnętrzna_długość"
+
+#: sql_help.c:2755
+msgid "alignment"
+msgstr "wyrównanie"
+
+#: sql_help.c:2756
+msgid "storage"
+msgstr "nośnik"
+
+#: sql_help.c:2757
+msgid "like_type"
+msgstr "typ_podobne"
+
+#: sql_help.c:2758
+msgid "category"
+msgstr "kategoria"
+
+#: sql_help.c:2759
+msgid "preferred"
+msgstr "preferowane"
+
+#: sql_help.c:2760
+msgid "default"
+msgstr "domyślnie"
+
+#: sql_help.c:2761
+msgid "element"
+msgstr "element"
+
+#: sql_help.c:2762
+msgid "delimiter"
+msgstr "ogranicznik"
+
+#: sql_help.c:2763
+msgid "collatable"
+msgstr "porównywalne"
+
+#: sql_help.c:2860 sql_help.c:3472 sql_help.c:3910 sql_help.c:3999
+#: sql_help.c:4149 sql_help.c:4249 sql_help.c:4343
+msgid "with_query"
+msgstr "z_kwerendy"
+
+#: sql_help.c:2862 sql_help.c:3474 sql_help.c:3929 sql_help.c:3935
+#: sql_help.c:3938 sql_help.c:3942 sql_help.c:3946 sql_help.c:3954
+#: sql_help.c:4168 sql_help.c:4174 sql_help.c:4177 sql_help.c:4181
+#: sql_help.c:4185 sql_help.c:4193 sql_help.c:4251 sql_help.c:4362
+#: sql_help.c:4368 sql_help.c:4371 sql_help.c:4375 sql_help.c:4379
+#: sql_help.c:4387
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:2863
+msgid "using_list"
+msgstr "lista_użycia"
+
+#: sql_help.c:2865 sql_help.c:3312 sql_help.c:3553 sql_help.c:4260
+msgid "cursor_name"
+msgstr "nazwa_kursora"
+
+#: sql_help.c:2866 sql_help.c:3480 sql_help.c:4261
+msgid "output_expression"
+msgstr "wyrażenie_wyjścia"
+
+#: sql_help.c:2867 sql_help.c:3481 sql_help.c:3913 sql_help.c:4002
+#: sql_help.c:4152 sql_help.c:4262 sql_help.c:4346
+msgid "output_name"
+msgstr "nazwa_wyjścia"
+
+#: sql_help.c:2883
+msgid "code"
+msgstr "kod"
+
+#: sql_help.c:3258
+msgid "parameter"
+msgstr "parametr"
+
+#: sql_help.c:3278 sql_help.c:3279 sql_help.c:3578
+msgid "statement"
+msgstr "wyrażenie"
+
+#: sql_help.c:3311 sql_help.c:3552
+msgid "direction"
+msgstr "kierunek"
+
+#: sql_help.c:3313 sql_help.c:3554
+msgid "where direction can be empty or one of:"
+msgstr "gdzie kierunek może być pusty lub jednym z:"
+
+#: sql_help.c:3314 sql_help.c:3315 sql_help.c:3316 sql_help.c:3317
+#: sql_help.c:3318 sql_help.c:3555 sql_help.c:3556 sql_help.c:3557
+#: sql_help.c:3558 sql_help.c:3559 sql_help.c:3923 sql_help.c:3925
+#: sql_help.c:4013 sql_help.c:4015 sql_help.c:4162 sql_help.c:4164
+#: sql_help.c:4291 sql_help.c:4293 sql_help.c:4356 sql_help.c:4358
+msgid "count"
+msgstr "ilość"
+
+#: sql_help.c:3398 sql_help.c:3731
+msgid "sequence_name"
+msgstr "nazwa_sekwencji"
+
+#: sql_help.c:3411 sql_help.c:3744
+msgid "arg_name"
+msgstr "nazwa_arg"
+
+#: sql_help.c:3412 sql_help.c:3745
+msgid "arg_type"
+msgstr "typ_arg"
+
+#: sql_help.c:3417 sql_help.c:3750
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3440
+msgid "remote_schema"
+msgstr "schemat_zdalny"
+
+#: sql_help.c:3443
+msgid "local_schema"
+msgstr "schemat_lokalny"
+
+#: sql_help.c:3478
+msgid "conflict_target"
+msgstr "cel_konflktu"
+
+#: sql_help.c:3479
+msgid "conflict_action"
+msgstr "akcja_konfliktu"
+
+#: sql_help.c:3482
+msgid "where conflict_target can be one of:"
+msgstr "gdzie cel_konfliktu może być jednym z:"
+
+#: sql_help.c:3483
+msgid "index_column_name"
+msgstr "nazwa_kolumny_indeksu"
+
+#: sql_help.c:3484
+msgid "index_expression"
+msgstr "wyrażenie_indeksu"
+
+#: sql_help.c:3487
+msgid "index_predicate"
+msgstr "predykat_indeksu"
+
+#: sql_help.c:3489
+msgid "and conflict_action is one of:"
+msgstr "gdzie akcja_konfliktu to jedna z:"
+
+#: sql_help.c:3495 sql_help.c:4257
+msgid "sub-SELECT"
+msgstr "pod-SELECT"
+
+#: sql_help.c:3504 sql_help.c:3567 sql_help.c:4233
+msgid "channel"
+msgstr "kanał"
+
+#: sql_help.c:3526
+msgid "lockmode"
+msgstr "tryb_blokady"
+
+#: sql_help.c:3527
+msgid "where lockmode is one of:"
+msgstr "gdzie tryb_blokady jest jednym z:"
+
+#: sql_help.c:3568
+msgid "payload"
+msgstr "Å‚adunek"
+
+#: sql_help.c:3595
+msgid "old_role"
+msgstr "stara_rola"
+
+#: sql_help.c:3596
+msgid "new_role"
+msgstr "nowa_rola"
+
+#: sql_help.c:3621 sql_help.c:3782 sql_help.c:3790
+msgid "savepoint_name"
+msgstr "nazwa_punktu_zapisu"
+
+#: sql_help.c:3914 sql_help.c:3956 sql_help.c:3958 sql_help.c:4004
+#: sql_help.c:4153 sql_help.c:4195 sql_help.c:4197 sql_help.c:4347
+#: sql_help.c:4389 sql_help.c:4391
+msgid "from_item"
+msgstr "element_z"
+
+#: sql_help.c:3916 sql_help.c:3968 sql_help.c:4155 sql_help.c:4207
+#: sql_help.c:4349 sql_help.c:4401
+msgid "grouping_element"
+msgstr "element_grupowania"
+
+#: sql_help.c:3918 sql_help.c:4008 sql_help.c:4157 sql_help.c:4351
+msgid "window_name"
+msgstr "nazwa_okna"
+
+#: sql_help.c:3919 sql_help.c:4009 sql_help.c:4158 sql_help.c:4352
+msgid "window_definition"
+msgstr "definicja_okna"
+
+#: sql_help.c:3920 sql_help.c:3934 sql_help.c:3972 sql_help.c:4010
+#: sql_help.c:4159 sql_help.c:4173 sql_help.c:4211 sql_help.c:4353
+#: sql_help.c:4367 sql_help.c:4405
+msgid "select"
+msgstr "wybierz"
+
+#: sql_help.c:3927 sql_help.c:4166 sql_help.c:4360
+msgid "where from_item can be one of:"
+msgstr "gdzie element_z może być jednym z:"
+
+#: sql_help.c:3930 sql_help.c:3936 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:3955 sql_help.c:4169 sql_help.c:4175 sql_help.c:4178
+#: sql_help.c:4182 sql_help.c:4194 sql_help.c:4363 sql_help.c:4369
+#: sql_help.c:4372 sql_help.c:4376 sql_help.c:4388
+msgid "column_alias"
+msgstr "alias_kolumny"
+
+#: sql_help.c:3931 sql_help.c:4170 sql_help.c:4364
+msgid "sampling_method"
+msgstr "metoda_próbkowania"
+
+#: sql_help.c:3932 sql_help.c:3941 sql_help.c:3945 sql_help.c:3949
+#: sql_help.c:3952 sql_help.c:4171 sql_help.c:4180 sql_help.c:4184
+#: sql_help.c:4188 sql_help.c:4191 sql_help.c:4365 sql_help.c:4374
+#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4385
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:3933 sql_help.c:4172 sql_help.c:4366
+msgid "seed"
+msgstr "ziarno"
+
+#: sql_help.c:3937 sql_help.c:3970 sql_help.c:4176 sql_help.c:4209
+#: sql_help.c:4370 sql_help.c:4403
+msgid "with_query_name"
+msgstr "nazwa_kwerendy_z"
+
+#: sql_help.c:3947 sql_help.c:3950 sql_help.c:3953 sql_help.c:4186
+#: sql_help.c:4189 sql_help.c:4192 sql_help.c:4380 sql_help.c:4383
+#: sql_help.c:4386
+msgid "column_definition"
+msgstr "definicja_kolumny"
+
+#: sql_help.c:3957 sql_help.c:4196 sql_help.c:4390
+msgid "join_type"
+msgstr "typ_złączenia"
+
+#: sql_help.c:3959 sql_help.c:4198 sql_help.c:4392
+msgid "join_condition"
+msgstr "warunek_złączenia"
+
+#: sql_help.c:3960 sql_help.c:4199 sql_help.c:4393
+msgid "join_column"
+msgstr "kolumna_złączana"
+
+#: sql_help.c:3961 sql_help.c:4200 sql_help.c:4394
+msgid "and grouping_element can be one of:"
+msgstr "gdzie element_grupowania może być jednym z:"
+
+#: sql_help.c:3969 sql_help.c:4208 sql_help.c:4402
+msgid "and with_query is:"
+msgstr "a z_kwerendÄ… to:"
+
+#: sql_help.c:3973 sql_help.c:4212 sql_help.c:4406
+msgid "values"
+msgstr "wartości"
+
+#: sql_help.c:3974 sql_help.c:4213 sql_help.c:4407
+msgid "insert"
+msgstr "wstaw"
+
+#: sql_help.c:3975 sql_help.c:4214 sql_help.c:4408
+msgid "update"
+msgstr "modyfikuj"
+
+#: sql_help.c:3976 sql_help.c:4215 sql_help.c:4409
+msgid "delete"
+msgstr "usuń"
+
+#: sql_help.c:4003
+msgid "new_table"
+msgstr "nowa_tabela"
+
+#: sql_help.c:4028
+msgid "timezone"
+msgstr "strefa_czasowa"
+
+#: sql_help.c:4073
+msgid "snapshot_id"
+msgstr "id_migawki"
+
+#: sql_help.c:4258
+msgid "from_list"
+msgstr "z_listy"
+
+#: sql_help.c:4289
+msgid "sort_expression"
+msgstr "wyrażenie_sortowania"
+
+#: sql_help.c:4416 sql_help.c:5201
+msgid "abort the current transaction"
+msgstr "przerywa bieżącą transakcję"
+
+#: sql_help.c:4421
+msgid "change the definition of an aggregate function"
+msgstr "zmienia definicjÄ™ funkcji agregujÄ…cej"
+
+#: sql_help.c:4426
+msgid "change the definition of a collation"
+msgstr "zmienia definicję porównania"
+
+#: sql_help.c:4431
+msgid "change the definition of a conversion"
+msgstr "zmienia definicjÄ™ konwersji"
+
+#: sql_help.c:4436
+msgid "change a database"
+msgstr "zmienia bazÄ™ danych"
+
+#: sql_help.c:4441
+msgid "define default access privileges"
+msgstr "definiuje domyślne uprawnienia dostępu"
+
+#: sql_help.c:4446
+msgid "change the definition of a domain"
+msgstr "zmienia definicjÄ™ domeny"
+
+#: sql_help.c:4451
+msgid "change the definition of an event trigger"
+msgstr "zmienia definicjÄ™ wyzwalacza zdarzenia"
+
+#: sql_help.c:4456
+msgid "change the definition of an extension"
+msgstr "zmienia definicjÄ™ rozszerzenia"
+
+#: sql_help.c:4461
+msgid "change the definition of a foreign-data wrapper"
+msgstr "zmienia definicjÄ™ opakowania obcych danych"
+
+#: sql_help.c:4466
+msgid "change the definition of a foreign table"
+msgstr "zmienia definicjÄ™ tabeli obcej"
+
+#: sql_help.c:4471
+msgid "change the definition of a function"
+msgstr "zmienia definicjÄ™ funkcji"
+
+#: sql_help.c:4476
+msgid "change role name or membership"
+msgstr "zmienia nazwę roli lub przynależność"
+
+#: sql_help.c:4481
+msgid "change the definition of an index"
+msgstr "zmienia definicjÄ™ indeksu"
+
+#: sql_help.c:4486
+msgid "change the definition of a procedural language"
+msgstr "zmienia definicję języka proceduralnego`"
+
+#: sql_help.c:4491
+msgid "change the definition of a large object"
+msgstr "zmienia definicję dużego obiektu"
+
+#: sql_help.c:4496
+msgid "change the definition of a materialized view"
+msgstr "zmienia definicjÄ™ widoku zmaterializowanego"
+
+#: sql_help.c:4501
+msgid "change the definition of an operator"
+msgstr "zmienia definicjÄ™ operatora"
+
+#: sql_help.c:4506
+msgid "change the definition of an operator class"
+msgstr "zmienia definicjÄ™ klasy operatora"
+
+#: sql_help.c:4511
+msgid "change the definition of an operator family"
+msgstr "zmienia definicjÄ™ rodziny operatora"
+
+#: sql_help.c:4516
+msgid "change the definition of a row level security policy"
+msgstr "zmienia definicję polityki bezpieczeństwa na poziomie wierszy"
+
+#: sql_help.c:4521
+#| msgid "change the definition of a function"
+msgid "change the definition of a publication"
+msgstr "zmienia definicjÄ™ publikacji"
+
+#: sql_help.c:4526 sql_help.c:4606
+msgid "change a database role"
+msgstr "zmienia rolÄ™ bazy danych"
+
+#: sql_help.c:4531
+msgid "change the definition of a rule"
+msgstr "zmienia definicję reguły"
+
+#: sql_help.c:4536
+msgid "change the definition of a schema"
+msgstr "zmienia definicjÄ™ schematu"
+
+#: sql_help.c:4541
+msgid "change the definition of a sequence generator"
+msgstr "zmienia definicjÄ™ generatora sekwencji"
+
+#: sql_help.c:4546
+msgid "change the definition of a foreign server"
+msgstr "zmienia definicjÄ™ serwera obcego"
+
+#: sql_help.c:4551
+#| msgid "change the definition of an extension"
+msgid "change the definition of a extended statistics"
+msgstr "zmienia definicjÄ™ rozszerzonych statystyk"
+
+#: sql_help.c:4556
+#| msgid "change the definition of a function"
+msgid "change the definition of a subscription"
+msgstr "zmienia definicjÄ™ subskrypcji"
+
+#: sql_help.c:4561
+msgid "change a server configuration parameter"
+msgstr "zmienia parametr konfiguracji serwera"
+
+#: sql_help.c:4566
+msgid "change the definition of a table"
+msgstr "zmienia definicjÄ™ tabeli"
+
+#: sql_help.c:4571
+msgid "change the definition of a tablespace"
+msgstr "zmienia definicjÄ™ przestrzeni tabel"
+
+#: sql_help.c:4576
+msgid "change the definition of a text search configuration"
+msgstr "zmienia definicjÄ™ konfiguracji wyszukiwania tekstowego"
+
+#: sql_help.c:4581
+msgid "change the definition of a text search dictionary"
+msgstr "zmienia definicję słownika wyszukiwania tekstowego"
+
+#: sql_help.c:4586
+msgid "change the definition of a text search parser"
+msgstr "zmienia definicjÄ™ analizatora wyszukiwania tekstowego"
+
+#: sql_help.c:4591
+msgid "change the definition of a text search template"
+msgstr "zmienia definicjÄ™ szablonu wyszukiwania tekstowego"
+
+#: sql_help.c:4596
+msgid "change the definition of a trigger"
+msgstr "zmienia definicjÄ™ wyzwalacza"
+
+#: sql_help.c:4601
+msgid "change the definition of a type"
+msgstr "zmienia definicjÄ™ typu"
+
+#: sql_help.c:4611
+msgid "change the definition of a user mapping"
+msgstr "zmienia definicję mapowania użytkownika"
+
+#: sql_help.c:4616
+msgid "change the definition of a view"
+msgstr "zmienia definicjÄ™ widoku"
+
+#: sql_help.c:4621
+msgid "collect statistics about a database"
+msgstr "zbiera statystyki na temat bazy danych"
+
+#: sql_help.c:4626 sql_help.c:5266
+msgid "start a transaction block"
+msgstr "poczÄ…tek bloku transakcji"
+
+#: sql_help.c:4631
+msgid "force a transaction log checkpoint"
+msgstr "wymuszenie punkty kontrolne logów transakcji"
+
+#: sql_help.c:4636
+msgid "close a cursor"
+msgstr "zamyka kursor"
+
+#: sql_help.c:4641
+msgid "cluster a table according to an index"
+msgstr "klaster lub tabela zgodna z indeksem"
+
+#: sql_help.c:4646
+msgid "define or change the comment of an object"
+msgstr "definiuje lub zmienia komentarz obiektu"
+
+#: sql_help.c:4651 sql_help.c:5101
+msgid "commit the current transaction"
+msgstr "zatwierdzenie bieżącej transakcji"
+
+#: sql_help.c:4656
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "zatwierdzenie transakcji uprzednio przygotowanej do zatwierdzenia dwufazowego"
+
+#: sql_help.c:4661
+msgid "copy data between a file and a table"
+msgstr "kopiuje dane między plikiem i tabelą"
+
+#: sql_help.c:4666
+msgid "define a new access method"
+msgstr "definiuje nową metodę dostępu"
+
+#: sql_help.c:4671
+msgid "define a new aggregate function"
+msgstr "definiuje nowÄ… funkcjÄ™ agregujÄ…cÄ…"
+
+#: sql_help.c:4676
+msgid "define a new cast"
+msgstr "definiuje nowe rzutowanie"
+
+#: sql_help.c:4681
+msgid "define a new collation"
+msgstr "definiuje nowe porównanie"
+
+#: sql_help.c:4686
+msgid "define a new encoding conversion"
+msgstr "definiuje nowe przekształcenie kodowania"
+
+#: sql_help.c:4691
+msgid "create a new database"
+msgstr "tworzy nowÄ… bazÄ™ danych"
+
+#: sql_help.c:4696
+msgid "define a new domain"
+msgstr "definiuje nowÄ… domenÄ™"
+
+#: sql_help.c:4701
+msgid "define a new event trigger"
+msgstr "definiuje nowy wyzwalacz zdarzenia"
+
+#: sql_help.c:4706
+msgid "install an extension"
+msgstr "instaluje nowe rozszerzenie"
+
+#: sql_help.c:4711
+msgid "define a new foreign-data wrapper"
+msgstr "definiuje nowe opakowania obcych danych"
+
+#: sql_help.c:4716
+msgid "define a new foreign table"
+msgstr "definiuje nowÄ… tabelÄ™ obcÄ…"
+
+#: sql_help.c:4721
+msgid "define a new function"
+msgstr "definiuje nowÄ… funkcjÄ™"
+
+#: sql_help.c:4726 sql_help.c:4771 sql_help.c:4856
+msgid "define a new database role"
+msgstr "definiuje nowÄ… rolÄ™ bazy danych"
+
+#: sql_help.c:4731
+msgid "define a new index"
+msgstr "definiuje nowy indeks"
+
+#: sql_help.c:4736
+msgid "define a new procedural language"
+msgstr "definiuje nowy język proceduralny"
+
+#: sql_help.c:4741
+msgid "define a new materialized view"
+msgstr "definiuje nowy widok zmaterializowany"
+
+#: sql_help.c:4746
+msgid "define a new operator"
+msgstr "definiuje nowy operator"
+
+#: sql_help.c:4751
+msgid "define a new operator class"
+msgstr "definiuje nowÄ… klasÄ™ operatora"
+
+#: sql_help.c:4756
+msgid "define a new operator family"
+msgstr "definiuje nowÄ… rodzinÄ™ operatora"
+
+#: sql_help.c:4761
+msgid "define a new row level security policy for a table"
+msgstr "definiuje nową politykę bezpieczeństwa na poziomie wierszy dla tabeli"
+
+#: sql_help.c:4766
+#| msgid "define a new function"
+msgid "define a new publication"
+msgstr "definiuje nowÄ… publikacjÄ™"
+
+#: sql_help.c:4776
+msgid "define a new rewrite rule"
+msgstr "definiuje nową regułę przepisania"
+
+#: sql_help.c:4781
+msgid "define a new schema"
+msgstr "definiuje nowy schemat"
+
+#: sql_help.c:4786
+msgid "define a new sequence generator"
+msgstr "definiuje nowy generator sekwencji"
+
+#: sql_help.c:4791
+msgid "define a new foreign server"
+msgstr "definiuje nowy serwer obcy"
+
+#: sql_help.c:4796
+#| msgid "define a new cast"
+msgid "define extended statistics"
+msgstr "definiuje rozszerzone statystyki"
+
+#: sql_help.c:4801
+#| msgid "define a new function"
+msgid "define a new subscription"
+msgstr "definiuje nowÄ… subskrypcjÄ™"
+
+#: sql_help.c:4806
+msgid "define a new table"
+msgstr "definiuje nowÄ… tabelÄ™"
+
+#: sql_help.c:4811 sql_help.c:5231
+msgid "define a new table from the results of a query"
+msgstr "definiuje nową tabelę z wyników zapytania"
+
+#: sql_help.c:4816
+msgid "define a new tablespace"
+msgstr "definiuje nową przestrzeń tabel"
+
+#: sql_help.c:4821
+msgid "define a new text search configuration"
+msgstr "definiuje nowÄ… konfiguracjÄ™ wyszukiwania tekstowego"
+
+#: sql_help.c:4826
+msgid "define a new text search dictionary"
+msgstr "definiuje nowy słownik wyszukiwania tekstowego"
+
+#: sql_help.c:4831
+msgid "define a new text search parser"
+msgstr "definiuje nowy analizator wyszukiwania tekstowego"
+
+#: sql_help.c:4836
+msgid "define a new text search template"
+msgstr "definiuje nowy szablon wyszukiwania tekstowego"
+
+#: sql_help.c:4841
+msgid "define a new transform"
+msgstr "definiuje nowÄ… transformacjÄ™"
+
+#: sql_help.c:4846
+msgid "define a new trigger"
+msgstr "definiuje nowy wyzwalacz"
+
+#: sql_help.c:4851
+msgid "define a new data type"
+msgstr "definiuje nowy typ danych"
+
+#: sql_help.c:4861
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definiuje nowe mapowanie użytkownika do serwera obcego"
+
+#: sql_help.c:4866
+msgid "define a new view"
+msgstr "definiuje nowy widok"
+
+#: sql_help.c:4871
+msgid "deallocate a prepared statement"
+msgstr "zwalnia przygotowane wyrażenie"
+
+#: sql_help.c:4876
+msgid "define a cursor"
+msgstr "definiuje kursor"
+
+#: sql_help.c:4881
+msgid "delete rows of a table"
+msgstr "usuwa wiersze z tabeli"
+
+#: sql_help.c:4886
+msgid "discard session state"
+msgstr "odrzuca stan sesji"
+
+#: sql_help.c:4891
+msgid "execute an anonymous code block"
+msgstr "wykonuje anonimowy blok kodu"
+
+#: sql_help.c:4896
+msgid "remove an access method"
+msgstr "usuwa metodę dostępu"
+
+#: sql_help.c:4901
+msgid "remove an aggregate function"
+msgstr "definiuje funkcjÄ™ agregujÄ…cÄ…"
+
+#: sql_help.c:4906
+msgid "remove a cast"
+msgstr "usuwa rzutowanie"
+
+#: sql_help.c:4911
+msgid "remove a collation"
+msgstr "usuwa porównanie"
+
+#: sql_help.c:4916
+msgid "remove a conversion"
+msgstr "usuwa konwersjÄ™"
+
+#: sql_help.c:4921
+msgid "remove a database"
+msgstr "usuwa bazÄ™ danych"
+
+#: sql_help.c:4926
+msgid "remove a domain"
+msgstr "usuwa domenÄ™"
+
+#: sql_help.c:4931
+msgid "remove an event trigger"
+msgstr "usuwa wyzwalacz zdarzenia"
+
+#: sql_help.c:4936
+msgid "remove an extension"
+msgstr "usuwa rozszerzenie"
+
+#: sql_help.c:4941
+msgid "remove a foreign-data wrapper"
+msgstr "usuwa opakowanie obcych danych"
+
+#: sql_help.c:4946
+msgid "remove a foreign table"
+msgstr "usuwa tabelÄ™ obcÄ…"
+
+#: sql_help.c:4951
+msgid "remove a function"
+msgstr "usuwa funkcjÄ™"
+
+#: sql_help.c:4956 sql_help.c:5006 sql_help.c:5086
+msgid "remove a database role"
+msgstr "usuwa rolÄ™ bazy danych"
+
+#: sql_help.c:4961
+msgid "remove an index"
+msgstr "usuwa indeks"
+
+#: sql_help.c:4966
+msgid "remove a procedural language"
+msgstr "usuwa język proceduralny"
+
+#: sql_help.c:4971
+msgid "remove a materialized view"
+msgstr "usuwa widok zmaterializowany"
+
+#: sql_help.c:4976
+msgid "remove an operator"
+msgstr "usuwa operator"
+
+#: sql_help.c:4981
+msgid "remove an operator class"
+msgstr "usuwa klasÄ™ operatora"
+
+#: sql_help.c:4986
+msgid "remove an operator family"
+msgstr "usuwa rodzinÄ™ operatora"
+
+#: sql_help.c:4991
+msgid "remove database objects owned by a database role"
+msgstr "usuwa obiekty bazy danych których właścicielem jest rola bazy danych"
+
+#: sql_help.c:4996
+msgid "remove a row level security policy from a table"
+msgstr "usuwa politykę bezpieczeństwa na poziomie wierszy z tabeli"
+
+#: sql_help.c:5001
+#| msgid "remove a function"
+msgid "remove a publication"
+msgstr "usuwa publikacjÄ™"
+
+#: sql_help.c:5011
+msgid "remove a rewrite rule"
+msgstr "usuwa regułę przepisania"
+
+#: sql_help.c:5016
+msgid "remove a schema"
+msgstr "usuwa schemat"
+
+#: sql_help.c:5021
+msgid "remove a sequence"
+msgstr "usuwa sekwencjÄ™"
+
+#: sql_help.c:5026
+msgid "remove a foreign server descriptor"
+msgstr "usuwa deskryptor serwera obcego"
+
+#: sql_help.c:5031
+#| msgid "remove an extension"
+msgid "remove extended statistics"
+msgstr "usuwa rozszerzonÄ… statystykÄ™"
+
+#: sql_help.c:5036
+#| msgid "remove a function"
+msgid "remove a subscription"
+msgstr "usuwa subskrypcjÄ™"
+
+#: sql_help.c:5041
+msgid "remove a table"
+msgstr "usuwa tabelÄ™"
+
+#: sql_help.c:5046
+msgid "remove a tablespace"
+msgstr "usuwa przestrzeń tabel"
+
+#: sql_help.c:5051
+msgid "remove a text search configuration"
+msgstr "usuwa konfiguracjÄ™ wyszukiwania tekstowego"
+
+#: sql_help.c:5056
+msgid "remove a text search dictionary"
+msgstr "usuwa słownik wyszukiwania tekstowego"
+
+#: sql_help.c:5061
+msgid "remove a text search parser"
+msgstr "usuwa analizator wyszukiwania tekstowego"
+
+#: sql_help.c:5066
+msgid "remove a text search template"
+msgstr "usuwa szablon wyszukiwania tekstowego"
+
+#: sql_help.c:5071
+msgid "remove a transform"
+msgstr "usuwa transformacjÄ™"
+
+#: sql_help.c:5076
+msgid "remove a trigger"
+msgstr "usuwa wyzwalacz"
+
+#: sql_help.c:5081
+msgid "remove a data type"
+msgstr "usuwa typ danych"
+
+#: sql_help.c:5091
+msgid "remove a user mapping for a foreign server"
+msgstr "usuwa mapowanie użytkownika dla serwera obcego"
+
+#: sql_help.c:5096
+msgid "remove a view"
+msgstr "usuwa widok"
+
+#: sql_help.c:5106
+msgid "execute a prepared statement"
+msgstr "wykonuje przygotowane wyrażenie"
+
+#: sql_help.c:5111
+msgid "show the execution plan of a statement"
+msgstr "pokazuje plan wykonania wyrażenia"
+
+#: sql_help.c:5116
+msgid "retrieve rows from a query using a cursor"
+msgstr "pobiera wiersze z zapytania przy użyciu kursora"
+
+#: sql_help.c:5121
+msgid "define access privileges"
+msgstr "definiuje uprawnienia dostępu"
+
+#: sql_help.c:5126
+msgid "import table definitions from a foreign server"
+msgstr "importuje definicje tabel z obcego serwera"
+
+#: sql_help.c:5131
+msgid "create new rows in a table"
+msgstr "tworzy nowe wiersze w tabeli"
+
+#: sql_help.c:5136
+msgid "listen for a notification"
+msgstr "nasłuchuje powiadomień"
+
+#: sql_help.c:5141
+msgid "load a shared library file"
+msgstr "wczytuje współdzieloną bibliotekę plików"
+
+#: sql_help.c:5146
+msgid "lock a table"
+msgstr "blokuje tabelÄ™"
+
+#: sql_help.c:5151
+msgid "position a cursor"
+msgstr "pozycjonuje kursor"
+
+#: sql_help.c:5156
+msgid "generate a notification"
+msgstr "generuje powiadomienie"
+
+#: sql_help.c:5161
+msgid "prepare a statement for execution"
+msgstr "przygotowuje wyrażenie do wykonania"
+
+#: sql_help.c:5166
+msgid "prepare the current transaction for two-phase commit"
+msgstr "przygotowane bieżącej transakcji do zatwierdzenia dwufazowego"
+
+#: sql_help.c:5171
+msgid "change the ownership of database objects owned by a database role"
+msgstr "zmienia posiadacza obiektów bazy danych, których właścicielem jest rola bazy danych"
+
+#: sql_help.c:5176
+msgid "replace the contents of a materialized view"
+msgstr "zastępuje zawartość widoku materializowanego"
+
+#: sql_help.c:5181
+msgid "rebuild indexes"
+msgstr "przebudowuje indeksy"
+
+#: sql_help.c:5186
+msgid "destroy a previously defined savepoint"
+msgstr "usuwa zdefiniowany poprzednio punkt zapisu"
+
+#: sql_help.c:5191
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "przywraca wartość domyślną parametru czasu wykonania"
+
+#: sql_help.c:5196
+msgid "remove access privileges"
+msgstr "usuwa uprawnienia dostępu"
+
+#: sql_help.c:5206
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "anuluje transakcjÄ™ uprzednio przygotowanÄ… do zatwierdzenia dwufazowego"
+
+#: sql_help.c:5211
+msgid "roll back to a savepoint"
+msgstr "wycofanie do punktu zapisu"
+
+#: sql_help.c:5216
+msgid "define a new savepoint within the current transaction"
+msgstr "definiuje punkt zapisu w bieżącej transakcji"
+
+#: sql_help.c:5221
+msgid "define or change a security label applied to an object"
+msgstr "definiuje zmianę etykiety bezpieczeństwa zastosowanych do obiektu"
+
+#: sql_help.c:5226 sql_help.c:5271 sql_help.c:5301
+msgid "retrieve rows from a table or view"
+msgstr "odczytuje wiersza z tabeli lub widoku"
+
+#: sql_help.c:5236
+msgid "change a run-time parameter"
+msgstr "zmienia parametr czasu wykonania"
+
+#: sql_help.c:5241
+msgid "set constraint check timing for the current transaction"
+msgstr "ustawia pomiar czasu ograniczeń sprawdzających dla bieżącej transakcji"
+
+#: sql_help.c:5246
+msgid "set the current user identifier of the current session"
+msgstr "ustawia identyfikator bieżącego użytkownika z bieżącej sesji"
+
+#: sql_help.c:5251
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "ustawia identyfikator użytkownika sesji i identyfikator bieżącego użytkownika z bieżącej sesji"
+
+#: sql_help.c:5256
+msgid "set the characteristics of the current transaction"
+msgstr "ustawia charakterystyki bieżącej transakcji"
+
+#: sql_help.c:5261
+msgid "show the value of a run-time parameter"
+msgstr "pokazuje wartość parametru czasu wykonania"
+
+#: sql_help.c:5276
+msgid "empty a table or set of tables"
+msgstr "opróżnia tabelę lub grupę tabel"
+
+#: sql_help.c:5281
+msgid "stop listening for a notification"
+msgstr "zatrzymuje nasłuchiwania powiadomień"
+
+#: sql_help.c:5286
+msgid "update rows of a table"
+msgstr "modyfikuje wiersze w tabeli"
+
+#: sql_help.c:5291
+msgid "garbage-collect and optionally analyze a database"
+msgstr "porządkuje śmieci i opcjonalnie analizuje bazy danych"
+
+#: sql_help.c:5296
+msgid "compute a set of rows"
+msgstr "oblicza zbiór wierszy"
+
+#: startup.c:184
+#, c-format
+msgid "%s: -1 can only be used in non-interactive mode\n"
+msgstr "%s: -1 może być użyty tylko trybie nieinteraktywnym\n"
+
+#: startup.c:287
+#, c-format
+msgid "%s: could not open log file \"%s\": %s\n"
+msgstr "%s: nie można otworzyć pliku logów \"%s\": %s\n"
+
+#: startup.c:394
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Wpisz \"help\" by uzyskać pomoc.\n"
+"\n"
+
+#: startup.c:543
+#, c-format
+msgid "%s: could not set printing parameter \"%s\"\n"
+msgstr "%s: nie można ustawić parametru wydruku \"%s\"\n"
+
+#: startup.c:645
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: startup.c:662
+#, c-format
+msgid "%s: warning: extra command-line argument \"%s\" ignored\n"
+msgstr "%s: ostrzeżenie: nadmiarowy argument wiersza poleceń \"%s\" zignorowany\n"
+
+#: startup.c:711
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nie można znaleźć programu wykonywalnego\n"
+
+#: tab-complete.c:4092
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s\n"
+msgstr ""
+"nie udało się zakończyć zapytania tabulatorem: %s\n"
+"Zapytanie to:\n"
+"%s\n"
+
+#: variables.c:139
+#, c-format
+#| msgid "unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n"
+msgid "unrecognized value \"%s\" for \"%s\": boolean expected\n"
+msgstr "nierozpoznana wartość \"%s\" dla \"%s\"; oczekiwano typu logicznego\n"
+
+#: variables.c:176
+#, c-format
+#| msgid "invalid value \"%s\" for \"%s\""
+msgid "invalid value \"%s\" for \"%s\": integer expected\n"
+msgstr "nieprawidłowa wartość \"%s\" dla \"%s\": oczekiwano liczby całkowitej\n"
+
+#: variables.c:224
+#, c-format
+#| msgid "invalid locale name: \"%s\""
+msgid "invalid variable name: \"%s\"\n"
+msgstr "nieprawidłowa nazwa zmiennej: \"%s\"\n"
+
+#: variables.c:393
+#, c-format
+#| msgid "unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n"
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s.\n"
+msgstr ""
+"nierozpoznana wartość \"%s\" dla \"%s\"\n"
+"Dostępne wartości to: %s.\n"
+
+#~ msgid "user name lookup failure: %s"
+#~ msgstr "niepowodzenie wyszukiwania nazwy użytkownika: %s"
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "Połączenie SSL (nieznany szyfr)\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Brak wierszy)\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "nie można zmienić katalogu na \"%s\""
+
+#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "%s: pg_strdup: nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#~ msgid " \\l[+] list all databases\n"
+#~ msgstr " \\l[+] listuje wszystkie bazy danych\n"
+
+#~ msgid "input_data_type"
+#~ msgstr "typ_danych_wejściowych"
+
+#~ msgid "agg_type"
+#~ msgstr "typ_agreg"
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "nie udało się uzyskać nazwy bieżącego użytkownika: %s\n"
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Pokazywanie tylko krotek."
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Wyświetlanie dostosowanego do lokalizacji wyjścia numerycznego."
+
+#~ msgid " unicode_column_linestyle\n"
+#~ msgstr " unicode_column_linestyle\n"
+
+#~ msgid " unicode_border_linestyle\n"
+#~ msgstr " unicode_border_linestyle\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Display influencing variables:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Wyświetl zmienne oddziałujące:\n"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "OglÄ…daj co %lds\t%s"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: nie można ustawić zmiennej \"%s\"\n"
+
+#~ msgid "Modifier"
+#~ msgstr "Modyfikator"
+
+#~ msgid "default %s"
+#~ msgstr "domyślnie %s"
+
+#~ msgid "not null"
+#~ msgstr "niepusty"
+
+#~ msgid "collate %s"
+#~ msgstr "porównanie %s"
+
+#~ msgid "Modifiers"
+#~ msgstr "Modyfikatory"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "nie można ustawić zmiennej \"%s\"\n"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s: błąd podczas ustawiania zmiennej\n"
diff --git a/src/bin/psql/po/pt_BR.po b/src/bin/psql/po/pt_BR.po
new file mode 100644
index 0000000..e3374d9
--- /dev/null
+++ b/src/bin/psql/po/pt_BR.po
@@ -0,0 +1,6561 @@
+# Brazilian Portuguese message translation file for psql
+# Copyright (C) 2009 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Euler Taveira de Oliveira <euler@timbira.com>, 2003-2016.
+# Halley Pacheco de Oliveira <halley@vivaldi.net>, 2023-2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-02 12:57-0300\n"
+"PO-Revision-Date: 2024-01-01 05:22-0300\n"
+"Last-Translator: Halley Pacheco de Oliveira <halley@vivaldi.net>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+"X-Generator: Poedit 3.4.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "binário inválido \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "não foi possível ler o binário \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "não foi possível encontrar \"%s\" para executar"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "não foi possível resolver o caminho \"%s\" para a forma absoluta: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() falhou: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "sem memória"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não é possível duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "não foi possível encontrar ID de usuário efetivo %ld: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "o usuário não existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "falha na procura do nome de usuário: código de erro %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "o comando não é executável"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "o comando não foi encontrado"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "o processo filho terminou com código de saída %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "o processo filho foi terminado pela exceção 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "o processo filho foi terminado pelo sinal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "o processo filho terminou com status desconhecido %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requisição de cancelamento enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Não foi possível enviar a requisição de cancelamento: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu linha)"
+msgstr[1] "(%lu linhas)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompido\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Não foi possível adicionar cabeçalho ao conteúdo da tabela:\n"
+"contagem de colunas excedida (%d).\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Não foi possível adicionar células ao conteúdo da tabela:\n"
+"contagem total de células excedida (%d).\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de saída inválido (erro interno): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "ignorada a expansão recursiva da variável \"%s\""
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "não foi possível procurar o ID do usuário local %d: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "o usuário local com ID %d não existe"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "comando inválido \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Tente \\? para obter ajuda."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: argumento extra \"%s\" ignorado"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "Comando \\%s ignorado; use \\endif ou Ctrl-C para sair do bloco \\if corrente"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "não foi possível obter o diretório inicial do usuário com ID %ld: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: não foi possível alterar o diretório para \"%s\": %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "No momento você não está conectado a um banco de dados.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" no endereço \"%s\" na porta \"%s\".\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" via soquete em \"%s\" na porta \"%s\".\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" (endereço %s\") na porta \"%s\".\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" na porta \"%s\".\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "nenhum buffer de consulta"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "número de linha inválido: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Nenhuma alteração"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: nome de codificação inválido ou procedimento de conversão não encontrado"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:721 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "Não há erro anterior."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: está faltando o parêntese direito"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: está faltando um argumento requerido"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: não pode ocorrer depois de \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: sem \\if correspondente"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: não pode ocorrer depois de \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: sem \\if correspondente"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: sem \\if correspondente"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "O buffer de consulta está vazio."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Digite a nova senha para o usuário \"%s\": "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Digite novamente: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "As senhas não correspondem."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: não foi possível ler o valor da variável"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Buffer de consulta reiniciado (limpo)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Histórico escrito para o arquivo \"%s\".\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: o nome da variável de ambiente não deve conter \"=\""
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "é requerido o nome da função"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "é requerido o nome da visão"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Tempo de execução está ativado."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Tempo de execução está desativado."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: o valor do intervalo é especificado mais de uma vez"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: valor do intervalo incorreto \"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: a contagem de iterações é especificada mais de uma vez"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: contagem de iterações incorreta \"%s\""
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: parâmetro não reconhecido \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Senha: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Senha para o usuário %s: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr ""
+"Não forneça usuário, hospedeiro ou porta separadamente\n"
+"ao usar uma cadeia de caracteres de conexão"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Não existe nenhuma conexão de banco de dados para reutilizar os parâmetros dela"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Conexão anterior mantida"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" no endereço \"%s\" na porta \"%s\".\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" via soquete em \"%s\" na porta \"%s\".\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" (endereço \"%s\") na porta \"%s\".\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" na porta \"%s\".\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\".\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, servidor %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ADVERTÊNCIA: %s versão %s, servidor versão %s.\n"
+" Algumas funcionalidades do psql podem não funcionar.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "Conexão SSL (protocolo: %s, encriptação: %s, compactação: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "desconhecido"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "desativado"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "ativado"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Conexão encriptada por GSSAPI\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ADVERTÊNCIA: A página de código da console (%u) difere da página de código do Windows (%u)\n"
+" os caracteres de 8 bits podem não funcionar corretamente. Veja a página de\n"
+" referência do psql \"Notes for Windows users\" para obter detalhes.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "a variável de ambiente PSQL_EDITOR_LINENUMBER_ARG deve ser definida para especificar um número de linha"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "não foi possível iniciar o editor \"%s\""
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "não foi possível iniciar /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "não foi possível localizar o diretório temporário: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "não foi possível abrir o arquivo temporário \"%s\": %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: abreviatura ambígua \"%s\" corresponde a \"%s\" e \"%s\""
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr ""
+"\\pset: os formatos permitidos são\n"
+"aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: os estilos de linha permitidos são ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: os estilos de linha de borda Unicode permitidos são single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: os estilos de linha de coluna Unicode permitidos são single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: os estilos de linha de cabeçalho Unicode permitidos são single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr ""
+"\\pset: os valores para xheader_width permitidos são\n"
+"\"%s\" (padrão), \"%s\", \"%s\", ou um número especificando a largura exata"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep deve ser um único caractere de um byte"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep não pode ser aspas, nova-linha, ou retorno-de-carro"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: opção desconhecida: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "O estilo da borda é %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "A largura do destino não está definida.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "A largura do destino é %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "A exibição expandida está ativada.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "A exibição expandida é usada automaticamente.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "A exibição expandida está desativada.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "A largura do cabeçalho expandido é \"%s\".\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "A largura do cabeçalho expandido é %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "O separador de campos para CSV é \"%s\".\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "O separador de campos é o byte zero.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "O separador de campos é \"%s\".\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "O rodapé padrão está ativado.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "O rodapé padrão está desativado.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "O formato de saída é %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "O estilo da linha é %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "A exibição de nulos é \"%s\".\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "A saída numérica ajustada à localidade está ativada.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "A saída numérica ajustada à localidade está desativada.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "O paginador é usado para a saída longa.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "O paginador é sempre usado.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "O uso do paginador está desativado.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "O paginador não será usado para menos do que %d linha.\n"
+msgstr[1] "O paginador não será usado para menos do que %d linhas.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "O separador de registros é o byte zero.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "O separador de registros é a <novalinha>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "O separador de registros é \"%s\".\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Os atributos de tabela são \"%s\".\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Os atributos de tabela não estão definidos.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "O título é \"%s\".\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "O título não está definido.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Somente-tuplas está ativado.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Somente-tuplas está desativado.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "O estilo de linha de borda Unicode é \"%s\".\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "O estilo de linha de coluna Unicode é \"%s\".\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "O estilo de linha de cabeçalho Unicode é \"%s\".\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: falhou"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch não pode ser usado com uma consulta vazia"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "não foi possível definir a cronometragem: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (cada %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (cada %gs)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "não foi possível esperar por sinais: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"******** CONSULTA ********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" não é uma visão"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "não foi possível analisar a matriz reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "não é possível colocar escapes sem uma conexão ativa"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr ""
+"o argumento do comando do interpretador de comandos contém uma\n"
+"nova-linha ou retorno-de-carro: \"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "a conexão com o servidor foi perdida"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "A conexão com o servidor foi perdida. Tentando redefinir: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Falhou.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Sucesso..\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "um PQresultStatus não esperado: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Tempo: %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Tempo: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "No momento você não está conectado a um banco de dados."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Notificação assíncrona \"%s\" com carga útil \"%s\"\n"
+"recebida do processo servidor com PID %d.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Notificação assíncrona \"%s\" recebida do processo servidor com PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "não foi possível imprimir a tabela de resultados: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "nenhuma linha retornada para \\gset"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "mais de uma linha retornada para \\gset"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "ignorada a tentativa de usar \\gset na variável tratada especialmente \"%s\""
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Modo de passo único: verifique o comando)***********************************\n"
+"%s\n"
+"***(pressione Enter para prosseguir, ou digite x e Enter para cancelar)*********\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "INSTRUÇÃO: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "status de transação não esperado (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Coluna"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Tipo"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "O comando não tem resultado, ou o resultado não tem colunas.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: são requeridos argumentos"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: erro de análise em \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: erro de análise no fim da linha"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "não foi possível executar comando \"%s\": %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "não foi possível executar stat no arquivo \"%s\": %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: não é possível copiar de/para um diretório"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "não foi possível fechar o pipe para comando externo: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "não foi possível escrever os dados do COPY: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "transferência de dados usando o COPY falhou: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "cancelado pelo usuário"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Entre com os dados a serem copiados seguidos de um caractere de nova-linha.\n"
+"Termine com uma contrabarra e um ponto final em uma linha isolada, ou um sinal EOF."
+
+#: copy.c:683
+msgid "aborted because of read failure"
+msgstr "interrompido devido a falha de leitura"
+
+#: copy.c:717
+msgid "trying to exit copy mode"
+msgstr "tentando sair do modo copy"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: a instrução não retornou um conjunto de resultados"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: a consulta deve retornar pelo menos três colunas"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: os cabeçalhos verticais e horizontais devem ser colunas diferentes"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr ""
+"\\crosstabview: quando a consulta retornar mais de três colunas,\n"
+"a coluna de dados deve ser especificada"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: número máximo de colunas (%d) excedido"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: o resultado da consulta contém vários valores de dados para a linha \"%s\", coluna \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: o número da coluna (%d) está fora do intervalo 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: nome de coluna ambíguo: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: nome da coluna não encontrado: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Esquema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Nome"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Tipo de dados do resultado"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Tipo de dados dos argumentos"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "Descrição"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Lista de funções de agregação"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "O servidor (versão %s) não oferece suporte a métodos de acesso."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Ãndice"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Tabela"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Tratador"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista de métodos de acesso"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Dono"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Localização"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Opções"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Tamanho"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Lista dos espaços de tabelas"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df só aceita [anptwS+] como opções"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df não aceita a opção \"%c\" com o servidor versão %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "window"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "gatilho"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "imutável"
+
+#: describe.c:387
+msgid "stable"
+msgstr "estável"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volátil"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Volatilidade"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "restrito"
+
+#: describe.c:398
+msgid "safe"
+msgstr "seguro"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "inseguro"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Paralelo"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definidor"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "chamador"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Segurança"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Linguagem"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Nome interno"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "Lista de funções"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Elementos"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "Lista de tipos de dados"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Tipo de dados do argumento à esquerda"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Tipo de dados do argumento à direita"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Tipo de dados resultante"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "Função"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "Lista de operadores"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Codificação"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "Provedor de localidade"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Ordenação"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "Localidade ICU"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "Regras ICU"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Espaço de tabelas"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "Lista de bancos de dados"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "tabela"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "visão"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "visão materializada"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "sequência"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "tabela estrangeira"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "tabela particionada"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Privilégios de coluna"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Políticas"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Privilégios de acesso"
+
+#: describe.c:1195
+msgid "function"
+msgstr "função"
+
+#: describe.c:1197
+msgid "type"
+msgstr "tipo"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "esquema"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Privilégios de acesso padrão"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Objeto"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "restrição de tabela"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "restrição de domínio"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "classe de operador"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "família de operador"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "regra"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "Descrições de objeto"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Não foi encontrada nenhuma relação chamada \"%s\"."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "Não foi encontrada nenhuma relação."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Não foi encontrada nenhuma relação com OID %s."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Início"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "Máximo"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "Incremento"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "sim"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "não"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "Ciclos?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Pertencente a: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sequência para coluna de identidade: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Sequência não rastreada (sem log) \"%s.%s\""
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sequência \"%s.%s\""
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Tabela não rastreada (sem log) \"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabela \"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Visão \"%s.%s\""
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Visão materializada não rastreada (sem log) \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Visão materializada \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ãndice não rastreado (sem log) \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Ãndice \"%s.%s\""
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ãndice particionado não rastreado (sem log) \"%s.%s\""
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Ãndice particionado \"%s.%s\""
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Tabela TOAST \"%s.%s\""
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Tipo de dados composto \"%s.%s\""
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Tabela estrangeira \"%s.%s\""
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Tabela particionada não rastreada (sem log) \"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Tabela particionada \"%s.%s\""
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "Ordenação"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "Pode ser nulo"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "Padrão"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Chave?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "Definição"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "Opções FDW"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Armazenamento"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Compressão"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Meta de estatísticas"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partição de: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Sem restrição de partição"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Restrição de partição: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Chave de partição: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Tabela dona: \"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "chave primária, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "unicidade"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulos não distintos"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "para a tabela \"%s.%s\""
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicado (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", agrupado"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", inválido"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", postergável"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", inicialmente postergado"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", identidade da réplica"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "Ãndices:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "Restrições de verificação:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "Restrições de chave estrangeira:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "Referenciada por:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Políticas:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Políticas (segurança de linha forçada ativada):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Políticas (segurança de linha ativada): (nenhuma)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Políticas (segurança de linha forçada ativada): (nenhuma)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Políticas (segurança de linha desativada):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Objetos de estatísticas:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Regras:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Regras desativadas:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Regras disparando sempre:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Regras disparando somente na réplica:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Publicações:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Definição da visão:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Gatilhos:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Gatilhos de usuário desativados:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Gatilhos internos desativados:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Gatilhos disparando sempre:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Gatilhos disparando somente na réplica:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Servidor: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Opções FDW: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "Herda de"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Número de partições: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Número de partições: %d (Use \\d+ para listá-las.)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Número de tabelas filhas: %d (Use \\d+ para listá-las.)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Tabelas filhas"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Partições"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Tabela tipada do tipo: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Identidade da réplica"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Têm OIDs: sim"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Método de acesso: %s"
+
+#: describe.c:3585
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Espaço de tabelas: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3597
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", espaço de tabelas \"%s\""
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "Lista de funções de banco de dados (roles)"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Nome da função de banco de dados (role)"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Atributos"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superusuário"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Sem herança"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Cria função de banco de dados (role)"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Cria banco de dados"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Não é possível conectar"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replicação"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Contornar RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Sem conexão"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d conexão"
+msgstr[1] "%d conexões"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Senha valida até "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Função de banco de dados (role)"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "Banco de dados"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Definições"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr ""
+"Nenhuma configuração para a função de banco de dados (role) \"%s\"\n"
+"e banco de dados \"%s\" foi encontrada."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Nenhuma configuração para a função de banco de dados (role) \"%s\" foi encontrada."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Nenhuma configuração foi encontrada."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "Lista de definições"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Membro de"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Concedente"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Lista de concessões de funções de banco de dados (roles)"
+
+#: describe.c:3952
+msgid "index"
+msgstr "índice"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "Tabela TOAST"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "índice particionado"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "permanente"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "temporário"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "sem registro de transações (unlogged)"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "Persistência"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Método de acesso"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "Lista de relações"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "O servidor (versão %s) não oferece suporte a particionamento de tabela declarativo."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "Lista de índices particionados"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "Lista de tabelas particionadas"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "Lista de relações particionadas"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Nome do ascendente"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Tamanho da partição folha"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Tamanho total"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Confiável"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Linguagem interna"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Tratador de chamadas"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Validador"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Tratador em-linha"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "Lista de linguagens"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Verificação"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Lista de domínios"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Origem"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "Destino"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "Padrão?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "Lista de conversões"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Parâmetro"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Valor"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "Contexto"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "Lista de parâmetros de configuração"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "Lista de parâmetros de configuração não-padrão"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "O servidor (versão %s) não oferece suporte a gatilhos de eventos."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Evento"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "ativado"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "réplica"
+
+#: describe.c:4658
+msgid "always"
+msgstr "sempre"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "desativado"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "Ativado"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Marcadores"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "Lista de gatilhos de evento"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "O servidor (versão %s) não oferece suporte a estatísticas estendidas."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Dependências"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV (valores mais comuns)"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "Lista de estatísticas estendidas"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Tipo de dados origem"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Tipo de dados destino"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "em atribuição"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Implícito?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "Lista de conversões explícitas"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "Fornecedor"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Determinista?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "Lista de ordenações"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Lista de esquemas"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "Lista de analisadores de procura de texto"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Nenhum analisador de procura de texto chamado \"%s\" foi encontrado."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Nenhum analisador de procura de texto foi encontrado."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Início da análise"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Método"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Obter o próximo elemento"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Fim da análise"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Obter cabeçalho"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Obter os tipos de elemento"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Analisador de procura de texto \"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Analisador de procura de texto \"%s\""
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Nome do elemento"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Tipos de elemento para o analisador \"%s.%s\""
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Tipos de elemento para o analisador \"%s"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Modelo"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Opções de inicialização"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "Lista de dicionários de procura de texto"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "Inicialização"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Lexicalizar"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "Lista de modelos de procura de texto"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "Lista de configurações de procura de texto"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Nenhuma configuração de procura de texto chamada \"%s\" foi encontrada."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Nenhuma configuração de procura de texto foi encontrada."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Elemento"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Dicionários"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Configuração de procura de texto \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Configuração de procura de texto \"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Analisador: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Analisador: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "Lista de empacotadores de dados estrangeiros"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Empacotador de dados estrangeiros"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "Versão"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "Lista de servidores estrangeiros"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Servidor"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Nome de usuário"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "Lista de mapeamentos de usuários"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "Lista de tabelas estrangeiras"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "Lista de extensões instaladas"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Nenhuma extensão chamada \"%s\" foi encontrada."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Nenhuma extensão foi encontrada."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "Descrição do objeto"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objetos na extensão \"%s\""
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "nome qualificado de forma não apropriada (muitos nomes com pontos): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "não estão implementadas referências cruzadas entre bancos de dados: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "O servidor (versão %s) não oferece suporte a publicações."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Todas as tabelas"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Inserções"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Atualizações"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Exclusões"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Truncamentos"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "Lista de publicações"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Nenhuma publicação chamada \"%s\" foi encontrada."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Nenhuma publicação foi encontrada."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "Publicação %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Tabelas:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Tabelas de esquemas:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "O servidor (versão %s) não oferece suporte a subscrições."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "Publicação"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Binário"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "Fluxo"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Efetivação em duas fases"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "Desativar em caso de erro"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Origem"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Senha requerida"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "Executar como dono?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Efetivação síncrona"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Informações da conexão"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "Saltar LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "Lista de subscrições"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Tipo de entrada"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Tipo de armazenamento"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "Classe de operador"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "Família de operador"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "Lista de classes de operador"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Tipos aplicáveis"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "Lista de famílias de operador"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Operador"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "Estratégia"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "ordenação"
+
+#: describe.c:6911
+msgid "search"
+msgstr "procura"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Finalidade"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "Família de operador de ordenação"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "Lista de operadores de famílias de operador"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "Tipo de dados esquerdo registrado"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "Tipo de dados direito registrado"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "Número"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "Lista de funções de suporte das famílias de operador"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Objetos grandes"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql é o terminal interativo do PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPÇÃO]... [BANCO [USUÃRIO]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Opções gerais:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=COMANDO executa somente um comando (SQL ou interno) e termina\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=BANCO nome do banco de dados ao qual se conectar (padrão: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ARQUIVO executa comandos de um arquivo e termina\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list lista os bancos de dados disponíveis e termina\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NOME=VALOR\n"
+" define a variável do psql NOME com o VALOR\n"
+" (por exemplo, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc não lê o arquivo de inicialização (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"um\"), --single-transaction\n"
+" executa como uma única transação (se não interativo)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] mostra essa ajuda e termina\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " -?, --help=commands lista os comandos de contrabarra e termina\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " -?, --help=variables lista as variáveis especiais e termina\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Opções de entrada e saída:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all mostra toda entrada do script\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors mostra os comandos que falharam\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries mostra os comandos enviados ao servidor\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden mostra as consultas que os comandos internos geram\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=ARQUIVO envia o log da sessão para arquivo\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline desativa a edição de linha de comando melhorada (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=ARQUIVO envia resultados da consulta para um arquivo (ou |pipe)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet executa silenciosamente (sem mensagens, somente a saída da consulta)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step modo passo-a-passo (confirma cada consulta)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line modo de linha-única (fim da linha termina o comando SQL)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Opções para o formato de saída:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align modo de saída em tabela desalinhada\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv Modo de saída da tabela CSV (valores separados por vírgula)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=SEPARADOR\n"
+" define o separador de campos para modo de saída desalinhado (padrão: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html modo de saída em tabela HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] define opção de exibição VAR para ARG (veja comando \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=SEPARADOR\n"
+" define o separador de registros para modo de saída desalinhado\n"
+" (padrão: nova-linha)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only imprime somente tuplas\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXTO define atributos do elemento <table> do HTML (i.e. width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ativa a saída em tabela expandida\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" define o separador de campos para o modo de saída desalinhado como o byte zero\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" define o separador de registros para modo de saída desalinhado como o byte zero\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opções de conexão:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete (padrão: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "soquete local"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados (padrão: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USUÃRIO nome de usuário do banco de dados (padrão: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pede a senha\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password pergunta senha (pode ocorrer automaticamente)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Para obter informações adicionais, digite \"\\?\" (para comandos internos),\n"
+"ou \"\\help\"\n"
+" (para comandos SQL) no psql, ou consulte a seção do psql na\n"
+"documentação do PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros para <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página inicial de %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Geral\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... define parâmetros de consulta\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright mostra os termos de uso e distribuição do PostgreSQL\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLUNAS] executa a consulta e mostra o resultado em uma tabela cruzada\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose mostra a mensagem de erro mais recente com verbosidade máxima\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPÇÕES)] [ARQUIVO] executa a consulta (e envia o resultado para arquivo ou |pipe);\n"
+" \\g sem argumentos é equivalente a ponto e vírgula\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc descreve o resultado da consulta, sem executá-la\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec executa a consulta e executa cada valor em seu resultado\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIXO] executa a consulta e armazena o resultado em variáveis ​​psql\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPÇÕES)] [ARQUIVO] como \\g, mas força o modo de saída expandido\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q sai do psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] executa a consulta a cada SEC segundos, até N vezes\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Ajuda\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] mostra ajuda sobre os comandos de contrabarra\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options mostra ajuda sobre as opções de linha de comando do psql\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables mostra ajuda sobre as variáveis especiais\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NOME] mostra a sintaxe dos comandos SQL, * para todos os comandos\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Buffer de consulta\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [ARQUIVO] [LINHA] edita o buffer de consulta (ou arquivo) com o editor externo\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNÇÃO [LINHA]] edita a definição de função com o editor externo\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VISÃO [LINHA]] edita a definição de visão com o editor externo\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p mostra o conteúdo do buffer de consulta\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r reinicia (apaga) o buffer de consulta\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ARQUIVO] mostra o histórico, ou escreve em um arquivo\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w [ARQUIVO] escreve o buffer de consulta para arquivo\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "Entrada/Saída\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... executa SQL COPY com fluxo de dados para o hospedeiro do cliente\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXTO] escreve a cadeia de caracteres na saída padrão (-n para sem nova-linha)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ARQUIVO executa comandos de um arquivo\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ARQUIVO como \\i, mas relativo ao local do script corrente\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [ARQUIVO] envia todos os resultados da consulta para arquivo ou |pipe\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [TEXTO] escreve a cadeia de caracteres no fluxo de saída \\o (-n para sem nova-linha)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [TEXTO] escreve a cadeia de caracteres na saída de erro padrão (-n para sem nova-linha)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Condicional\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR inicia um bloco condicional\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativa dentro do bloco condicional corrente\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else alternativa final dentro do bloco condicional corrente\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif fim do bloco condicional\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Informações\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (opções: S = mostra os objetos do sistema, + = detalhes adicionais)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] lista as tabelas, visões e sequências\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NOME descreve tabela, visão, sequência ou índice\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PADRÃO] lista as funções de agregação\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PADRÃO] lista os métodos de acesso\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista as classes de operador\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista as famílias de operador\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista os operadores de famílias de operador\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista as funções de suporte de famílias de operador\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PADRÃO] lista os espaços de tabelas\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PADRÃO] lista as conversões\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PADRÃO] lista os parâmetros de configuração\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PADRÃO] lista as conversões de tipo de dados\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PADRÃO] mostra as descrições de objeto não mostradas em outro lugar\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PADRÃO] lista os domínios\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PADRÃO] lista os privilégios padrão\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PADRÃO] lista as tabelas estrangeiras\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PADRÃO] lista os servidores estrangeiros\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PADRÃO] lista as tabelas estrangeiras\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PADRÃO] lista os mapeamentos de usuários\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PADRÃO] lista os empacotadores de dados estrangeiros\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" lista as funções [somente agregação/normal/procedimento/gatilho/janela]\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PADRÃO] lista as configurações de procura de texto\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PADRÃO] lista os dicionários de procura de texto\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PADRÃO] lista os analisadores de procura de texto\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PADRÃO] lista os modelos de procura de texto\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PADRÃO] lista as funções de banco de dados (roles)\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PADRÃO] lista os índices\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] lista os objetos grandes, o mesmo que \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PADRÃO] lista as linguagens procedurais\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PADRÃO] lista as visões materializadas\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PADRÃO] lista os esquemas\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" lista os operadores\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PADRÃO] lista as ordenações\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [PADRÃO] lista os privilégios de acesso à tabela, visão e sequência\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PADRÃO] lista as relações particionadas [somente índice/tabela] [n=aninhadas]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] lista as definições de função de banco de dados (role) por banco de dados\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [PADRÃO] lista as concessões de função de banco de dados (role)\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PADRÃO] lista as publicações de replicação\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PADRÃO] lista as subscrições de replicação\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PADRÃO] lista as sequências\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PADRÃO] lista as tabelas\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PADRÃO] lista os tipos de dados\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PADRÃO] lista as funções de banco de dados (roles)\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PADRÃO] lista as visões\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PADRÃO] lista as extensões\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PADRÃO] lista as estatísticas estendidas\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PADRÃO] lista os gatilhos de eventos\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PADRÃO] lista os bancos de dados\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNÇÃO mostra a definição de uma função\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VISÃO mostra a definição de uma visão\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [PADRÃO] o mesmo que \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Objetos grandes\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID ARQUIVO escreve o objeto grande em um arquivo\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ARQUIVO [COMENTÃRIO]\n"
+" lê um objeto grande do arquivo\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] lista os objetos grandes\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID exclui um objeto grande\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "Formatação\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a alterna entre o modo de saída desalinhado e alinhado\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [TEXTO] define o título da tabela, ou apaga caso nada seja especificado\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [TEXTO] mostra ou define o separador de campos para saída de consulta não alinhada\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H alterna o modo de saída em HTML (no momento %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NOME [VALOR]] define a opção de exibição da tabela\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] mostra somente linhas (no momento %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [TEXTO] define os atributos do marcador HTML <table>, ou apaga se nada for especificado\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] alterna para saída expandida (no momento %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "Conexão\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[BANCO|- USUÃRIO|- HOSPEDEIRO|- PORTA|-] | conninfo}\n"
+" conecta a um novo banco de dados (no momento \"%s\")\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[BANCO|- USUÃRIO|- HOSPEDEIRO|- PORTA|-] | conninfo}\n"
+" conecta a um novo banco de dados (no momento nenhuma conexão)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo mostra informação sobre a conexão corrente\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [CODIFICAÇÃO] mostra ou define a codificação do cliente\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USUÃRIO] muda a senha de um usuário com segurança\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "Sistema Operacional\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIRETÓRIO] muda o diretório de trabalho corrente\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR busca a variável de ambiente\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NOME [VALOR] define ou apaga a variável de ambiente\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] alterna para cronometragem da execução de comandos (no momento %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr ""
+" \\! [COMANDO] executa um comando no interpretador de comandos (shell),\n"
+" ou inicia um interpretador de comandos interativo\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Variáveis\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXTO] NOME pede ao usuário para definir uma variável interna\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NOME [VALOR]] define uma variável interna, ou lista todas se não houver parâmetros\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NOME apaga (exclui) uma variável interna\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Lista de variáveis com tratamento especial\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "variáveis do psql:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NOME=VALOR\n"
+" ou \\set NOME VALOR no psql\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" se definido, os comandos SQL bem-sucedidos serão automaticamente efetivados\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" determina o uso de maiúsculas e minúsculas para completar palavras-chave SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" o nome do banco de dados conectado no momento\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" controla qual entrada é escrita na saída padrão\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" se definido, mostra as consultas internas executadas por comandos de contrabarra;\n"
+" se definido como \"noexec\", mostra somente sem executar\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" codificação do conjunto de caracteres do cliente corrente\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" \"true\" se a última consulta falhou, senão \"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" o número de linhas de resultado a serem buscadas e mostradas por vez (0 = ilimitado)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" se definido, os métodos de acesso à tabela não serão mostrados\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" se definido, os métodos de compressão não serão mostrados\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" controla o histórico de comandos [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" nome do arquivo usado para armazenar o histórico de comandos\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" número máximo de comandos para armazenar no histórico de comandos\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" o hospedeiro do servidor de banco de dados conectado no momento\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" número de EOFs necessários para encerrar uma sessão interativa\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" valor do último OID afetado\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" mensagem e SQLSTATE do último erro, ou uma cadeia de caracteres vazia e \"00000\" se nenhum\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" se definido, um erro não interrompe uma transação (usa pontos de salvamento implícitos)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" termina a execução em lote após erro\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" porta do servidor da conexão corrente\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" especifica o prompt padrão do psql\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" especifica o prompt usado quando uma instrução continua a partir de uma linha anterior\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" especifica o prompt usado durante COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" executa silenciosamente (o mesmo que a opção -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" número de linhas retornadas ou afetadas pela última consulta, ou 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" versão do servidor (uma cadeia de caracteres curta, ou formato numérico)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" \"true\" se o último comando shell falhou, \"false\" se foi bem sucedido\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" status de saída do último comando shell\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" mostra todos os resultados de uma consulta combinada (\\;) em vez de somente o último\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" controla a exibição de campos de contexto de mensagem [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" se definido, o fim da linha encerra os comandos SQL (o mesmo que a opção -S)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" modo de passo-único (o mesmo que a opção -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE da última consulta, ou \"00000\" se não houve erro\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" o usuário do banco de dados conectado no momento\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" controla a verbosidade dos relatórios de erros [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" Versão do psql (em cadeia de caracteres detalhada, cadeia de caracteres curta, ou formato numérico)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Mostra as configurações:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NOME[=VALOR]\n"
+" ou \\pset NOME [VALOR] no psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" estilo de borda (número)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" largura desejada para formato emoldurado\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" saída expandida [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" separador de campos para saída não alinhada (padrão \"%s\")\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" define o separador de campos para a saída não alinhada como o byte zero\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" ativa ou desativr a exibição do rodapé da tabela [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" define o formato de saída [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" define o estilo de desenho da linha de borda [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" define a cadeia de caracteres a ser impressa no lugar de um valor nulo\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" ativa a exibição de um caractere específico de localidade para separar grupos de dígitos\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" controla quando um paginador externo é usado [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" separador de registro (linha) para a saída não alinhada\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" define o separador de registro para a saída não alinhada como o byte zero\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" especifica os atributos para o marcador de tabela no formato html,\n"
+" ou larguras de coluna proporcionais para tipos de dados alinhados\n"
+" à esquerda no formato latex-longtable\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" define o título da tabela para as tabelas impressas posteriormente\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" se definido, serão mostrados somente os dados reais da tabela\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" define o estilo do desenho de linha Unicode [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Variáveis de ambiente:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NOME=VALOR [NOME=VALOR] psql ...\n"
+" ou \\setenv NOME [VALOR] no psql\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set=NOME=VALOR\n"
+" ou \\setenv NOME [VALOR] no psql\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" número de colunas para formato encapsulado\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" o mesmo que o parâmetro de conexão application_name\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" o mesmo que o parâmetro de conexão dbname\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" o mesmo que o parâmetro de conexão do hospedeiro\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" o nome do arquivo de senhas\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" senha de conexão (não recomendado)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" o mesmo que o parâmetro de conexão da porta\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" o mesmo que o parâmetro de conexão do usuário\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor usado pelos comandos \\e, \\ef e \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" como especificar um número de linha ao chamar o editor\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" local alternativo para o arquivo de histórico de comandos\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" nome do programa paginador externo\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" nome do programa paginador externo usado para \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" local alternativo para o arquivo .psqlrc do usuário\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" interpretador de comandos usado pelo comando \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" diretório para arquivos temporários\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "Ajuda disponível:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Comando: %s\n"
+"Descrição: %s\n"
+"Sintaxe:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Nenhuma ajuda disponível para \"%s\".\n"
+"Tente \\h sem argumentos para ver a ajuda disponível.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "não foi possível ler o arquivo de entrada: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "não foi possível salvar o histórico no arquivo \"%s\": %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "o histórico não tem suporte por esta instalação"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: não conectado a um banco de dados"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: a transação corrente foi interrompida"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: status da transação é desconhecido"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escapado"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Use \"\\q\" para sair do %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"A entrada é uma cópia de segurança no formato personalizado do PostgreSQL.\n"
+"Utilize o cliente de linha de comando pg_restore para restaurar essa cópia de segurança para um banco de dados.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Use \\? para obter ajuda, ou tecle Ctrl-C para limpar o buffer de entrada."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Use \\? para obter ajuda."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Você está usando o psql, um cliente de linha de comando do PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Digite: \\copyright para mostrar termos de distribuição\n"
+" \\h para ajuda com comandos SQL\n"
+" \\? para ajuda com comandos do psql\n"
+" \\g ou terminar com ponto-e-vírgula para executar a consulta\n"
+" \\q para sair\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Use \\q para sair."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Use Ctrl-D para sair."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Use Ctrl-C para sair."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "consulta ignorada; use \\endif ou Ctrl-C para sair do bloco \\if corrente"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "atingido EOF sem encontrar \\endif(s) de fechamento"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "a cadeia de caracteres entre aspas não foi terminada"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: sem memória"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1307 sql_help.c:1309
+#: sql_help.c:1312 sql_help.c:1315 sql_help.c:1317 sql_help.c:1319
+#: sql_help.c:1322 sql_help.c:1325 sql_help.c:1442 sql_help.c:1444
+#: sql_help.c:1446 sql_help.c:1449 sql_help.c:1470 sql_help.c:1473
+#: sql_help.c:1476 sql_help.c:1479 sql_help.c:1483 sql_help.c:1485
+#: sql_help.c:1487 sql_help.c:1489 sql_help.c:1503 sql_help.c:1506
+#: sql_help.c:1508 sql_help.c:1510 sql_help.c:1520 sql_help.c:1522
+#: sql_help.c:1532 sql_help.c:1534 sql_help.c:1544 sql_help.c:1547
+#: sql_help.c:1570 sql_help.c:1572 sql_help.c:1574 sql_help.c:1576
+#: sql_help.c:1579 sql_help.c:1581 sql_help.c:1584 sql_help.c:1587
+#: sql_help.c:1638 sql_help.c:1681 sql_help.c:1684 sql_help.c:1686
+#: sql_help.c:1688 sql_help.c:1691 sql_help.c:1693 sql_help.c:1695
+#: sql_help.c:1698 sql_help.c:1750 sql_help.c:1766 sql_help.c:1999
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2100 sql_help.c:2158
+#: sql_help.c:2166 sql_help.c:2176 sql_help.c:2203 sql_help.c:2235
+#: sql_help.c:2253 sql_help.c:2281 sql_help.c:2392 sql_help.c:2438
+#: sql_help.c:2463 sql_help.c:2486 sql_help.c:2490 sql_help.c:2524
+#: sql_help.c:2544 sql_help.c:2566 sql_help.c:2580 sql_help.c:2601
+#: sql_help.c:2630 sql_help.c:2665 sql_help.c:2690 sql_help.c:2737
+#: sql_help.c:3032 sql_help.c:3045 sql_help.c:3062 sql_help.c:3078
+#: sql_help.c:3118 sql_help.c:3172 sql_help.c:3176 sql_help.c:3178
+#: sql_help.c:3185 sql_help.c:3204 sql_help.c:3231 sql_help.c:3266
+#: sql_help.c:3278 sql_help.c:3287 sql_help.c:3331 sql_help.c:3345
+#: sql_help.c:3373 sql_help.c:3381 sql_help.c:3393 sql_help.c:3403
+#: sql_help.c:3411 sql_help.c:3419 sql_help.c:3427 sql_help.c:3435
+#: sql_help.c:3444 sql_help.c:3455 sql_help.c:3463 sql_help.c:3471
+#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3497 sql_help.c:3506
+#: sql_help.c:3515 sql_help.c:3523 sql_help.c:3533 sql_help.c:3544
+#: sql_help.c:3552 sql_help.c:3561 sql_help.c:3572 sql_help.c:3581
+#: sql_help.c:3589 sql_help.c:3597 sql_help.c:3605 sql_help.c:3613
+#: sql_help.c:3621 sql_help.c:3629 sql_help.c:3637 sql_help.c:3645
+#: sql_help.c:3653 sql_help.c:3661 sql_help.c:3678 sql_help.c:3687
+#: sql_help.c:3695 sql_help.c:3712 sql_help.c:3727 sql_help.c:4039
+#: sql_help.c:4149 sql_help.c:4178 sql_help.c:4194 sql_help.c:4196
+#: sql_help.c:4699 sql_help.c:4747 sql_help.c:4905
+msgid "name"
+msgstr "nome"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1847
+#: sql_help.c:3346 sql_help.c:4467
+msgid "aggregate_signature"
+msgstr "assinatura_agregação"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1316 sql_help.c:1443
+#: sql_help.c:1486 sql_help.c:1507 sql_help.c:1521 sql_help.c:1533
+#: sql_help.c:1546 sql_help.c:1573 sql_help.c:1639 sql_help.c:1692
+msgid "new_name"
+msgstr "novo_nome"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1380 sql_help.c:1445 sql_help.c:1488 sql_help.c:1509
+#: sql_help.c:1571 sql_help.c:1687 sql_help.c:3018
+msgid "new_owner"
+msgstr "novo_dono"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1318 sql_help.c:1490 sql_help.c:1511
+#: sql_help.c:1523 sql_help.c:1535 sql_help.c:1575 sql_help.c:1694
+msgid "new_schema"
+msgstr "novo_esquema"
+
+#: sql_help.c:44 sql_help.c:1911 sql_help.c:3347 sql_help.c:4496
+msgid "where aggregate_signature is:"
+msgstr "onde assinatura_agregação é:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2069 sql_help.c:2088
+#: sql_help.c:2091 sql_help.c:2393 sql_help.c:2602 sql_help.c:3348
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3445 sql_help.c:3534
+#: sql_help.c:3562 sql_help.c:3914 sql_help.c:4366 sql_help.c:4473
+#: sql_help.c:4480 sql_help.c:4486 sql_help.c:4497 sql_help.c:4500
+#: sql_help.c:4503
+msgid "argmode"
+msgstr "modo_argumento"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:4474 sql_help.c:4481 sql_help.c:4487
+#: sql_help.c:4498 sql_help.c:4501 sql_help.c:4504
+msgid "argname"
+msgstr "nome_argumento"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2395 sql_help.c:2604
+#: sql_help.c:3350 sql_help.c:3353 sql_help.c:3356 sql_help.c:3447
+#: sql_help.c:3536 sql_help.c:3564 sql_help.c:4475 sql_help.c:4482
+#: sql_help.c:4488 sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argtype"
+msgstr "tipo_argumento"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1504 sql_help.c:1633 sql_help.c:1665
+#: sql_help.c:1718 sql_help.c:1782 sql_help.c:1969 sql_help.c:1976
+#: sql_help.c:2284 sql_help.c:2334 sql_help.c:2341 sql_help.c:2350
+#: sql_help.c:2439 sql_help.c:2666 sql_help.c:2759 sql_help.c:3047
+#: sql_help.c:3232 sql_help.c:3254 sql_help.c:3394 sql_help.c:3750
+#: sql_help.c:3958 sql_help.c:4193 sql_help.c:4195 sql_help.c:4972
+msgid "option"
+msgstr "opção"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1634 sql_help.c:2440
+#: sql_help.c:2667 sql_help.c:3233 sql_help.c:3395
+msgid "where option can be:"
+msgstr "onde opção pode ser:"
+
+#: sql_help.c:116 sql_help.c:2216
+msgid "allowconn"
+msgstr "permite_conexão"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1635 sql_help.c:2217
+#: sql_help.c:2441 sql_help.c:2668 sql_help.c:3234
+msgid "connlimit"
+msgstr "limite_conexão"
+
+#: sql_help.c:118 sql_help.c:2218
+msgid "istemplate"
+msgstr "é_modelo"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1321
+#: sql_help.c:1373 sql_help.c:4199
+msgid "new_tablespace"
+msgstr "novo_espaço_tabelas"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1182 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:2405 sql_help.c:2608
+#: sql_help.c:3926 sql_help.c:4217 sql_help.c:4378 sql_help.c:4687
+msgid "configuration_parameter"
+msgstr "parâmetro_configuração"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1352
+#: sql_help.c:1375 sql_help.c:1423 sql_help.c:1448 sql_help.c:1505
+#: sql_help.c:1589 sql_help.c:1643 sql_help.c:1666 sql_help.c:2285
+#: sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 sql_help.c:2406
+#: sql_help.c:2407 sql_help.c:2471 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2609 sql_help.c:2610 sql_help.c:2633 sql_help.c:2760
+#: sql_help.c:2799 sql_help.c:2909 sql_help.c:2922 sql_help.c:2936
+#: sql_help.c:2977 sql_help.c:3004 sql_help.c:3021 sql_help.c:3048
+#: sql_help.c:3255 sql_help.c:3959 sql_help.c:4688 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691
+msgid "value"
+msgstr "valor"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "role_alvo"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2269 sql_help.c:2638
+#: sql_help.c:2715 sql_help.c:2720 sql_help.c:3889 sql_help.c:3898
+#: sql_help.c:3917 sql_help.c:3929 sql_help.c:4341 sql_help.c:4350
+#: sql_help.c:4369 sql_help.c:4381
+msgid "schema_name"
+msgstr "nome_esquema"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "grant_ou_revoke_abreviado"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "onde grant_ou_revoke_abreviado é um dos seguintes:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1320 sql_help.c:1653 sql_help.c:2444 sql_help.c:2445
+#: sql_help.c:2446 sql_help.c:2447 sql_help.c:2448 sql_help.c:2582
+#: sql_help.c:2671 sql_help.c:2672 sql_help.c:2673 sql_help.c:2674
+#: sql_help.c:2675 sql_help.c:3237 sql_help.c:3238 sql_help.c:3239
+#: sql_help.c:3240 sql_help.c:3241 sql_help.c:3938 sql_help.c:3942
+#: sql_help.c:4390 sql_help.c:4394 sql_help.c:4709
+msgid "role_name"
+msgstr "nome_role"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1336 sql_help.c:1338
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1427 sql_help.c:1683
+#: sql_help.c:2238 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2467 sql_help.c:2637 sql_help.c:2776 sql_help.c:2781
+#: sql_help.c:2783 sql_help.c:2904 sql_help.c:2917 sql_help.c:2931
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:2981 sql_help.c:3990
+#: sql_help.c:4005 sql_help.c:4007 sql_help.c:4094 sql_help.c:4097
+#: sql_help.c:4099 sql_help.c:4560 sql_help.c:4561 sql_help.c:4570
+#: sql_help.c:4617 sql_help.c:4618 sql_help.c:4619 sql_help.c:4620
+#: sql_help.c:4621 sql_help.c:4622 sql_help.c:4662 sql_help.c:4663
+#: sql_help.c:4668 sql_help.c:4673 sql_help.c:4817 sql_help.c:4818
+#: sql_help.c:4827 sql_help.c:4874 sql_help.c:4875 sql_help.c:4876
+#: sql_help.c:4877 sql_help.c:4878 sql_help.c:4879 sql_help.c:4933
+#: sql_help.c:4935 sql_help.c:5003 sql_help.c:5063 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5120 sql_help.c:5121 sql_help.c:5122
+#: sql_help.c:5123 sql_help.c:5124 sql_help.c:5125
+msgid "expression"
+msgstr "expressão"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "restrição_domínio"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1313 sql_help.c:1360 sql_help.c:1361 sql_help.c:1362
+#: sql_help.c:1389 sql_help.c:1401 sql_help.c:1418 sql_help.c:1853
+#: sql_help.c:1855 sql_help.c:2241 sql_help.c:2353 sql_help.c:2358
+#: sql_help.c:2939 sql_help.c:2951 sql_help.c:4002
+msgid "constraint_name"
+msgstr "nome_restrição"
+
+#: sql_help.c:247 sql_help.c:1314
+msgid "new_constraint_name"
+msgstr "novo_nome_restrição"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "nova_versão"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "objeto_membro"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "onde objeto_membro é:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1845 sql_help.c:1850 sql_help.c:1857
+#: sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 sql_help.c:1861
+#: sql_help.c:1862 sql_help.c:1863 sql_help.c:1868 sql_help.c:1870
+#: sql_help.c:1874 sql_help.c:1876 sql_help.c:1880 sql_help.c:1885
+#: sql_help.c:1886 sql_help.c:1893 sql_help.c:1894 sql_help.c:1895
+#: sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 sql_help.c:1899
+#: sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 sql_help.c:1903
+#: sql_help.c:1908 sql_help.c:1909 sql_help.c:4463 sql_help.c:4468
+#: sql_help.c:4469 sql_help.c:4470 sql_help.c:4471 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4483 sql_help.c:4484 sql_help.c:4489
+#: sql_help.c:4490 sql_help.c:4491 sql_help.c:4492 sql_help.c:4493
+#: sql_help.c:4494
+msgid "object_name"
+msgstr "nome_objeto"
+
+#: sql_help.c:329 sql_help.c:1846 sql_help.c:4466
+msgid "aggregate_name"
+msgstr "nome_agregação"
+
+#: sql_help.c:331 sql_help.c:1848 sql_help.c:2134 sql_help.c:2138
+#: sql_help.c:2140 sql_help.c:3364
+msgid "source_type"
+msgstr "tipo_origem"
+
+#: sql_help.c:332 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "target_type"
+msgstr "tipo_destino"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1864 sql_help.c:2136
+#: sql_help.c:2179 sql_help.c:2257 sql_help.c:2525 sql_help.c:2556
+#: sql_help.c:3124 sql_help.c:4365 sql_help.c:4472 sql_help.c:4589
+#: sql_help.c:4593 sql_help.c:4597 sql_help.c:4600 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4854 sql_help.c:4857 sql_help.c:5092
+#: sql_help.c:5096 sql_help.c:5100 sql_help.c:5103
+msgid "function_name"
+msgstr "nome_função"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1871 sql_help.c:2549
+msgid "operator_name"
+msgstr "nome_operador"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1872
+#: sql_help.c:2526 sql_help.c:3488
+msgid "left_type"
+msgstr "tipo_esquerda"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "right_type"
+msgstr "tipo_direita"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1407 sql_help.c:1875 sql_help.c:1877 sql_help.c:2546
+#: sql_help.c:2567 sql_help.c:2957 sql_help.c:3498 sql_help.c:3507
+msgid "index_method"
+msgstr "método_índice"
+
+#: sql_help.c:352 sql_help.c:1881 sql_help.c:4479
+msgid "procedure_name"
+msgstr "nome_procedimento"
+
+#: sql_help.c:356 sql_help.c:1887 sql_help.c:3913 sql_help.c:4485
+msgid "routine_name"
+msgstr "nome_rotina"
+
+#: sql_help.c:368 sql_help.c:1379 sql_help.c:1904 sql_help.c:2401
+#: sql_help.c:2607 sql_help.c:2912 sql_help.c:3091 sql_help.c:3669
+#: sql_help.c:3935 sql_help.c:4387
+msgid "type_name"
+msgstr "nome_tipo"
+
+#: sql_help.c:369 sql_help.c:1905 sql_help.c:2400 sql_help.c:2606
+#: sql_help.c:3092 sql_help.c:3322 sql_help.c:3670 sql_help.c:3920
+#: sql_help.c:4372
+msgid "lang_name"
+msgstr "nome_linguagem"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "e assinatura_agregação é:"
+
+#: sql_help.c:395 sql_help.c:2001 sql_help.c:2282
+msgid "handler_function"
+msgstr "função_tratadora"
+
+#: sql_help.c:396 sql_help.c:2283
+msgid "validator_function"
+msgstr "função_validação"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1308 sql_help.c:1580
+msgid "action"
+msgstr "ação"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1310 sql_help.c:1328 sql_help.c:1332 sql_help.c:1333
+#: sql_help.c:1337 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341
+#: sql_help.c:1342 sql_help.c:1344 sql_help.c:1347 sql_help.c:1348
+#: sql_help.c:1350 sql_help.c:1353 sql_help.c:1355 sql_help.c:1356
+#: sql_help.c:1403 sql_help.c:1405 sql_help.c:1412 sql_help.c:1421
+#: sql_help.c:1426 sql_help.c:1430 sql_help.c:1431 sql_help.c:1682
+#: sql_help.c:1685 sql_help.c:1689 sql_help.c:1727 sql_help.c:1852
+#: sql_help.c:1966 sql_help.c:1972 sql_help.c:1986 sql_help.c:1987
+#: sql_help.c:1988 sql_help.c:2332 sql_help.c:2345 sql_help.c:2398
+#: sql_help.c:2466 sql_help.c:2472 sql_help.c:2505 sql_help.c:2636
+#: sql_help.c:2745 sql_help.c:2780 sql_help.c:2782 sql_help.c:2894
+#: sql_help.c:2903 sql_help.c:2913 sql_help.c:2916 sql_help.c:2926
+#: sql_help.c:2930 sql_help.c:2953 sql_help.c:2955 sql_help.c:2962
+#: sql_help.c:2975 sql_help.c:2980 sql_help.c:2984 sql_help.c:2985
+#: sql_help.c:3001 sql_help.c:3127 sql_help.c:3267 sql_help.c:3892
+#: sql_help.c:3893 sql_help.c:3989 sql_help.c:4004 sql_help.c:4006
+#: sql_help.c:4008 sql_help.c:4093 sql_help.c:4096 sql_help.c:4098
+#: sql_help.c:4344 sql_help.c:4345 sql_help.c:4465 sql_help.c:4626
+#: sql_help.c:4632 sql_help.c:4634 sql_help.c:4883 sql_help.c:4889
+#: sql_help.c:4891 sql_help.c:4932 sql_help.c:4934 sql_help.c:4936
+#: sql_help.c:4991 sql_help.c:5129 sql_help.c:5135 sql_help.c:5137
+msgid "column_name"
+msgstr "nome_coluna"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1311 sql_help.c:1690
+msgid "new_column_name"
+msgstr "novo_nome_coluna"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1327 sql_help.c:1590
+msgid "where action is one of:"
+msgstr "onde ação é uma das:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1329
+#: sql_help.c:1334 sql_help.c:1592 sql_help.c:1596 sql_help.c:2236
+#: sql_help.c:2333 sql_help.c:2545 sql_help.c:2738 sql_help.c:2895
+#: sql_help.c:3174 sql_help.c:4150
+msgid "data_type"
+msgstr "tipo_dados"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1330 sql_help.c:1335
+#: sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 sql_help.c:2336
+#: sql_help.c:2468 sql_help.c:2897 sql_help.c:2905 sql_help.c:2918
+#: sql_help.c:2932 sql_help.c:3175 sql_help.c:3181 sql_help.c:3999
+msgid "collation"
+msgstr "ordenação"
+
+#: sql_help.c:456 sql_help.c:1331 sql_help.c:2337 sql_help.c:2346
+#: sql_help.c:2898 sql_help.c:2914 sql_help.c:2927
+msgid "column_constraint"
+msgstr "restrição_coluna"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1349 sql_help.c:4985
+msgid "integer"
+msgstr "inteiro"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1351
+#: sql_help.c:1354
+msgid "attribute_option"
+msgstr "opção_atributo"
+
+#: sql_help.c:476 sql_help.c:1358 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "table_constraint"
+msgstr "restrição_tabela"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1363
+#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1366 sql_help.c:1906
+msgid "trigger_name"
+msgstr "nome_gatilho"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1377 sql_help.c:1378
+#: sql_help.c:2339 sql_help.c:2344 sql_help.c:2902 sql_help.c:2925
+msgid "parent_table"
+msgstr "tabela_ancestral"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1549 sql_help.c:2268
+msgid "extension_name"
+msgstr "nome_extensão"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2402
+msgid "execution_cost"
+msgstr "custo_execução"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2403
+msgid "result_rows"
+msgstr "linhas_resultado"
+
+#: sql_help.c:547 sql_help.c:2404
+msgid "support_function"
+msgstr "função_suporte"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1632 sql_help.c:1640
+#: sql_help.c:1644 sql_help.c:1647 sql_help.c:1650 sql_help.c:2716
+#: sql_help.c:2718 sql_help.c:2721 sql_help.c:2722 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3895 sql_help.c:3896 sql_help.c:3899
+#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905
+#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911
+#: sql_help.c:3912 sql_help.c:3918 sql_help.c:3919 sql_help.c:3921
+#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927
+#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933
+#: sql_help.c:3934 sql_help.c:3936 sql_help.c:3937 sql_help.c:3939
+#: sql_help.c:3940 sql_help.c:4342 sql_help.c:4343 sql_help.c:4347
+#: sql_help.c:4348 sql_help.c:4351 sql_help.c:4352 sql_help.c:4354
+#: sql_help.c:4355 sql_help.c:4357 sql_help.c:4358 sql_help.c:4360
+#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 sql_help.c:4382
+#: sql_help.c:4383 sql_help.c:4385 sql_help.c:4386 sql_help.c:4388
+#: sql_help.c:4389 sql_help.c:4391 sql_help.c:4392
+msgid "role_specification"
+msgstr "especificação_role"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1663 sql_help.c:2204
+#: sql_help.c:2724 sql_help.c:3252 sql_help.c:3703 sql_help.c:4719
+msgid "user_name"
+msgstr "nome_usuário"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1652 sql_help.c:2723
+#: sql_help.c:3941 sql_help.c:4393
+msgid "where role_specification can be:"
+msgstr "onde especificação_role pode ser:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "nome_grupo"
+
+#: sql_help.c:596 sql_help.c:1424 sql_help.c:2215 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2910 sql_help.c:2923 sql_help.c:2937
+#: sql_help.c:2978 sql_help.c:3005 sql_help.c:3017 sql_help.c:3932
+#: sql_help.c:4384
+msgid "tablespace_name"
+msgstr "nome_espaço_tabelas"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1371 sql_help.c:1381
+#: sql_help.c:1419 sql_help.c:1781 sql_help.c:1784
+msgid "index_name"
+msgstr "nome_índice"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1374
+#: sql_help.c:1376 sql_help.c:1422 sql_help.c:2473 sql_help.c:2507
+#: sql_help.c:2908 sql_help.c:2921 sql_help.c:2935 sql_help.c:2976
+#: sql_help.c:3003
+msgid "storage_parameter"
+msgstr "parâmetro_armazenamento"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "número_coluna"
+
+#: sql_help.c:631 sql_help.c:1869 sql_help.c:4476
+msgid "large_object_oid"
+msgstr "oid_objeto_grande"
+
+#: sql_help.c:690 sql_help.c:1357 sql_help.c:2896
+msgid "compression_method"
+msgstr "método_compressão"
+
+#: sql_help.c:692 sql_help.c:1372
+msgid "new_access_method"
+msgstr "novo_método_acesso"
+
+#: sql_help.c:725 sql_help.c:2530
+msgid "res_proc"
+msgstr "proc_restrição"
+
+#: sql_help.c:726 sql_help.c:2531
+msgid "join_proc"
+msgstr "proc_junção"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2548
+msgid "strategy_number"
+msgstr "número_estratégia"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2550 sql_help.c:2551
+#: sql_help.c:2554 sql_help.c:2555
+msgid "op_type"
+msgstr "tipo_operador"
+
+#: sql_help.c:782 sql_help.c:2552
+msgid "sort_family_name"
+msgstr "nome_família_classificação"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2553
+msgid "support_number"
+msgstr "número_suporte"
+
+#: sql_help.c:787 sql_help.c:2137 sql_help.c:2557 sql_help.c:3094
+#: sql_help.c:3096
+msgid "argument_type"
+msgstr "tipo_argumento"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1726 sql_help.c:1780
+#: sql_help.c:1783 sql_help.c:1854 sql_help.c:1879 sql_help.c:1892
+#: sql_help.c:1907 sql_help.c:1965 sql_help.c:1971 sql_help.c:2331
+#: sql_help.c:2343 sql_help.c:2464 sql_help.c:2504 sql_help.c:2581
+#: sql_help.c:2635 sql_help.c:2692 sql_help.c:2744 sql_help.c:2777
+#: sql_help.c:2784 sql_help.c:2893 sql_help.c:2911 sql_help.c:2924
+#: sql_help.c:3000 sql_help.c:3120 sql_help.c:3301 sql_help.c:3524
+#: sql_help.c:3573 sql_help.c:3679 sql_help.c:3888 sql_help.c:3894
+#: sql_help.c:3955 sql_help.c:3987 sql_help.c:4340 sql_help.c:4346
+#: sql_help.c:4464 sql_help.c:4575 sql_help.c:4577 sql_help.c:4639
+#: sql_help.c:4678 sql_help.c:4832 sql_help.c:4834 sql_help.c:4896
+#: sql_help.c:4930 sql_help.c:4990 sql_help.c:5078 sql_help.c:5080
+#: sql_help.c:5142
+msgid "table_name"
+msgstr "nome_tabela"
+
+#: sql_help.c:823 sql_help.c:2583
+msgid "using_expression"
+msgstr "expressão_using"
+
+#: sql_help.c:824 sql_help.c:2584
+msgid "check_expression"
+msgstr "expressão_check"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2631
+msgid "publication_object"
+msgstr "objeto_publicação"
+
+#: sql_help.c:903 sql_help.c:2632
+msgid "publication_parameter"
+msgstr "parâmetro_publicação"
+
+#: sql_help.c:909 sql_help.c:2634
+msgid "where publication_object is one of:"
+msgstr "onde objeto_publicação é uma das seguintes opções:"
+
+#: sql_help.c:952 sql_help.c:1636 sql_help.c:2442 sql_help.c:2669
+#: sql_help.c:3235
+msgid "password"
+msgstr "senha"
+
+#: sql_help.c:953 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "timestamp"
+msgstr "tempo_absoluto"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:3901
+#: sql_help.c:4353
+msgid "database_name"
+msgstr "nome_banco_dados"
+
+#: sql_help.c:1073 sql_help.c:2739
+msgid "increment"
+msgstr "incremento"
+
+#: sql_help.c:1074 sql_help.c:2740
+msgid "minvalue"
+msgstr "valor_mínimo"
+
+#: sql_help.c:1075 sql_help.c:2741
+msgid "maxvalue"
+msgstr "valor_máximo"
+
+#: sql_help.c:1076 sql_help.c:2742 sql_help.c:4573 sql_help.c:4676
+#: sql_help.c:4830 sql_help.c:5007 sql_help.c:5076
+msgid "start"
+msgstr "início"
+
+#: sql_help.c:1077 sql_help.c:1346
+msgid "restart"
+msgstr "reinício"
+
+#: sql_help.c:1078 sql_help.c:2743
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "novo_destino"
+
+#: sql_help.c:1142 sql_help.c:2796
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2797
+msgid "publication_name"
+msgstr "nome_publicação"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "opção_publicação"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "opção_atualização"
+
+#: sql_help.c:1161 sql_help.c:2798
+msgid "subscription_parameter"
+msgstr "parâmetro_subscrição"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "opção_salto"
+
+#: sql_help.c:1323 sql_help.c:1326
+msgid "partition_name"
+msgstr "nome_partição"
+
+#: sql_help.c:1324 sql_help.c:2348 sql_help.c:2929
+msgid "partition_bound_spec"
+msgstr "espec_limite_partição"
+
+#: sql_help.c:1343 sql_help.c:1393 sql_help.c:2943
+msgid "sequence_options"
+msgstr "opções_sequência"
+
+#: sql_help.c:1345
+msgid "sequence_option"
+msgstr "opção_sequência"
+
+#: sql_help.c:1359
+msgid "table_constraint_using_index"
+msgstr "restrição_tabela_usando_índice"
+
+#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1370
+msgid "rewrite_rule_name"
+msgstr "nome_regra_reescrita"
+
+#: sql_help.c:1382 sql_help.c:2360 sql_help.c:2968
+msgid "and partition_bound_spec is:"
+msgstr "e espec_limite_partição é:"
+
+#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:2361
+#: sql_help.c:2362 sql_help.c:2363 sql_help.c:2969 sql_help.c:2970
+#: sql_help.c:2971
+msgid "partition_bound_expr"
+msgstr "expr_limite_partição"
+
+#: sql_help.c:1386 sql_help.c:1387 sql_help.c:2364 sql_help.c:2365
+#: sql_help.c:2972 sql_help.c:2973
+msgid "numeric_literal"
+msgstr "literal_numérico"
+
+#: sql_help.c:1388
+msgid "and column_constraint is:"
+msgstr "e restrição_coluna é:"
+
+#: sql_help.c:1391 sql_help.c:2355 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:2941
+msgid "default_expr"
+msgstr "expressão_padrão"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2942
+msgid "generation_expr"
+msgstr "expressão_geração"
+
+#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1404 sql_help.c:1406
+#: sql_help.c:1410 sql_help.c:2944 sql_help.c:2945 sql_help.c:2954
+#: sql_help.c:2956 sql_help.c:2960
+msgid "index_parameters"
+msgstr "parâmetros_índice"
+
+#: sql_help.c:1396 sql_help.c:1413 sql_help.c:2946 sql_help.c:2963
+msgid "reftable"
+msgstr "tabela_ref"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "refcolumn"
+msgstr "coluna_ref"
+
+#: sql_help.c:1398 sql_help.c:1399 sql_help.c:1415 sql_help.c:1416
+#: sql_help.c:2948 sql_help.c:2949 sql_help.c:2965 sql_help.c:2966
+msgid "referential_action"
+msgstr "ação_referencial"
+
+#: sql_help.c:1400 sql_help.c:2357 sql_help.c:2950
+msgid "and table_constraint is:"
+msgstr "e restrição_tabela é:"
+
+#: sql_help.c:1408 sql_help.c:2958
+msgid "exclude_element"
+msgstr "elemento_exclusão"
+
+#: sql_help.c:1409 sql_help.c:2959 sql_help.c:4571 sql_help.c:4674
+#: sql_help.c:4828 sql_help.c:5005 sql_help.c:5074
+msgid "operator"
+msgstr "operador"
+
+#: sql_help.c:1411 sql_help.c:2476 sql_help.c:2961
+msgid "predicate"
+msgstr "predicado"
+
+#: sql_help.c:1417
+msgid "and table_constraint_using_index is:"
+msgstr "e restrição_tabela_usando_índice é:"
+
+#: sql_help.c:1420 sql_help.c:2974
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "parâmetros_índice em restrições UNIQUE, PRIMARY KEY e EXCLUDE são:"
+
+#: sql_help.c:1425 sql_help.c:2979
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "elemento_exclusão em uma restrição EXCLUDE é:"
+
+#: sql_help.c:1428 sql_help.c:2469 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:2982 sql_help.c:4000
+msgid "opclass"
+msgstr "classe_operador"
+
+#: sql_help.c:1429 sql_help.c:2983
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "a ação_referencial em uma restrição FOREIGN KEY/REFERENCES é:"
+
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:3020
+msgid "tablespace_option"
+msgstr "opção_espaço_tabelas"
+
+#: sql_help.c:1471 sql_help.c:1474 sql_help.c:1480 sql_help.c:1484
+msgid "token_type"
+msgstr "tipo_elemento"
+
+#: sql_help.c:1472 sql_help.c:1475
+msgid "dictionary_name"
+msgstr "nome_dicionário"
+
+#: sql_help.c:1477 sql_help.c:1481
+msgid "old_dictionary"
+msgstr "dicionário_antigo"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "new_dictionary"
+msgstr "novo_dicionário"
+
+#: sql_help.c:1577 sql_help.c:1591 sql_help.c:1594 sql_help.c:1595
+#: sql_help.c:3173
+msgid "attribute_name"
+msgstr "nome_atributo"
+
+#: sql_help.c:1578
+msgid "new_attribute_name"
+msgstr "novo_nome_atributo"
+
+#: sql_help.c:1582 sql_help.c:1586
+msgid "new_enum_value"
+msgstr "novo_valor_enum"
+
+#: sql_help.c:1583
+msgid "neighbor_enum_value"
+msgstr "valor_enum_vizinho"
+
+#: sql_help.c:1585
+msgid "existing_enum_value"
+msgstr "valor_enum_existente"
+
+#: sql_help.c:1588
+msgid "property"
+msgstr "propriedade"
+
+#: sql_help.c:1664 sql_help.c:2340 sql_help.c:2349 sql_help.c:2755
+#: sql_help.c:3253 sql_help.c:3704 sql_help.c:3910 sql_help.c:3956
+#: sql_help.c:4362
+msgid "server_name"
+msgstr "nome_servidor"
+
+#: sql_help.c:1696 sql_help.c:1699 sql_help.c:3268
+msgid "view_option_name"
+msgstr "nome_opção_visão"
+
+#: sql_help.c:1697 sql_help.c:3269
+msgid "view_option_value"
+msgstr "valor_opção_visão"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4973 sql_help.c:4974
+msgid "table_and_columns"
+msgstr "tabela_e_colunas"
+
+#: sql_help.c:1721 sql_help.c:1785 sql_help.c:1977 sql_help.c:3753
+#: sql_help.c:4197 sql_help.c:4975
+msgid "where option can be one of:"
+msgstr "onde opção pode ser uma das seguintes:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1786 sql_help.c:1979
+#: sql_help.c:1983 sql_help.c:2163 sql_help.c:3754 sql_help.c:3755
+#: sql_help.c:3756 sql_help.c:3757 sql_help.c:3758 sql_help.c:3759
+#: sql_help.c:3760 sql_help.c:3761 sql_help.c:3762 sql_help.c:4198
+#: sql_help.c:4200 sql_help.c:4976 sql_help.c:4977 sql_help.c:4978
+#: sql_help.c:4979 sql_help.c:4980 sql_help.c:4981 sql_help.c:4982
+#: sql_help.c:4983 sql_help.c:4984 sql_help.c:4986 sql_help.c:4987
+msgid "boolean"
+msgstr "booleano"
+
+#: sql_help.c:1724 sql_help.c:4988
+msgid "size"
+msgstr "tamanho"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "and table_and_columns is:"
+msgstr "e tabela_e_colunas é:"
+
+#: sql_help.c:1741 sql_help.c:4735 sql_help.c:4737 sql_help.c:4761
+msgid "transaction_mode"
+msgstr "modo_transação"
+
+#: sql_help.c:1742 sql_help.c:4738 sql_help.c:4762
+msgid "where transaction_mode is one of:"
+msgstr "onde modo_transação é um dos:"
+
+#: sql_help.c:1751 sql_help.c:4581 sql_help.c:4590 sql_help.c:4594
+#: sql_help.c:4598 sql_help.c:4601 sql_help.c:4838 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5084
+#: sql_help.c:5093 sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "argument"
+msgstr "argumento"
+
+#: sql_help.c:1851
+msgid "relation_name"
+msgstr "nome_relação"
+
+#: sql_help.c:1856 sql_help.c:3904 sql_help.c:4356
+msgid "domain_name"
+msgstr "nome_domínio"
+
+#: sql_help.c:1878
+msgid "policy_name"
+msgstr "nome_política"
+
+#: sql_help.c:1891
+msgid "rule_name"
+msgstr "nome_regra"
+
+#: sql_help.c:1910 sql_help.c:4495
+msgid "string_literal"
+msgstr "literal_cadeia_caracteres"
+
+#: sql_help.c:1935 sql_help.c:4159 sql_help.c:4409
+msgid "transaction_id"
+msgstr "id_transação"
+
+#: sql_help.c:1967 sql_help.c:1974 sql_help.c:4026
+msgid "filename"
+msgstr "arquivo"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:2694 sql_help.c:2695
+#: sql_help.c:2696
+msgid "command"
+msgstr "comando"
+
+#: sql_help.c:1970 sql_help.c:2693 sql_help.c:3123 sql_help.c:3304
+#: sql_help.c:4010 sql_help.c:4087 sql_help.c:4090 sql_help.c:4564
+#: sql_help.c:4566 sql_help.c:4667 sql_help.c:4669 sql_help.c:4821
+#: sql_help.c:4823 sql_help.c:4939 sql_help.c:5067 sql_help.c:5069
+msgid "condition"
+msgstr "condição"
+
+#: sql_help.c:1973 sql_help.c:2510 sql_help.c:3006 sql_help.c:3270
+#: sql_help.c:3288 sql_help.c:3991
+msgid "query"
+msgstr "consulta"
+
+#: sql_help.c:1978
+msgid "format_name"
+msgstr "nome_formato"
+
+#: sql_help.c:1980
+msgid "delimiter_character"
+msgstr "caractere_delimitador"
+
+#: sql_help.c:1981
+msgid "null_string"
+msgstr "cadeia_nula"
+
+#: sql_help.c:1982
+msgid "default_string"
+msgstr "cadeia_caracteres_padrão"
+
+#: sql_help.c:1984
+msgid "quote_character"
+msgstr "caractere_separador"
+
+#: sql_help.c:1985
+msgid "escape_character"
+msgstr "caractere_escape"
+
+#: sql_help.c:1989
+msgid "encoding_name"
+msgstr "nome_codificação"
+
+#: sql_help.c:2000
+msgid "access_method_type"
+msgstr "tipo_método_acesso"
+
+#: sql_help.c:2071 sql_help.c:2090 sql_help.c:2093
+msgid "arg_data_type"
+msgstr "tipo_dados_arg"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "sfunc"
+msgstr "função_trans_estado"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "state_data_type"
+msgstr "tipo_dados_estado"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_size"
+msgstr "tamanho_dados_estado"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "ffunc"
+msgstr "função_final"
+
+#: sql_help.c:2076 sql_help.c:2106
+msgid "combinefunc"
+msgstr "função_combinação"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "serialfunc"
+msgstr "função_serial"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "deserialfunc"
+msgstr "função_deserial"
+
+#: sql_help.c:2079 sql_help.c:2098 sql_help.c:2109
+msgid "initial_condition"
+msgstr "condição_inicial"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "msfunc"
+msgstr "função_estado_m"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "minvfunc"
+msgstr "função_inv_m"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "mstate_data_type"
+msgstr "tipo_dados_estado_m"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_size"
+msgstr "tamanho_dados_estado_m"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mffunc"
+msgstr "função_final_m"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "minitial_condition"
+msgstr "condição_inicial_m"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "sort_operator"
+msgstr "operador_classificação"
+
+#: sql_help.c:2099
+msgid "or the old syntax"
+msgstr "ou a sintaxe antiga"
+
+#: sql_help.c:2101
+msgid "base_type"
+msgstr "tipo_base"
+
+#: sql_help.c:2159 sql_help.c:2208
+msgid "locale"
+msgstr "configuração regional"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2162 sql_help.c:4462
+msgid "provider"
+msgstr "fornecedor"
+
+#: sql_help.c:2164
+msgid "rules"
+msgstr "regras"
+
+#: sql_help.c:2165 sql_help.c:2270
+msgid "version"
+msgstr "versão"
+
+#: sql_help.c:2167
+msgid "existing_collation"
+msgstr "ordenação_existente"
+
+#: sql_help.c:2177
+msgid "source_encoding"
+msgstr "codificação_origem"
+
+#: sql_help.c:2178
+msgid "dest_encoding"
+msgstr "codificação_destino"
+
+#: sql_help.c:2205 sql_help.c:3046
+msgid "template"
+msgstr "modelo"
+
+#: sql_help.c:2206
+msgid "encoding"
+msgstr "codificação"
+
+#: sql_help.c:2207
+msgid "strategy"
+msgstr "estratégia"
+
+#: sql_help.c:2211
+msgid "icu_locale"
+msgstr "localidade_icu"
+
+#: sql_help.c:2212
+msgid "icu_rules"
+msgstr "regras_icu"
+
+#: sql_help.c:2213
+msgid "locale_provider"
+msgstr "fornecedor_localidade"
+
+#: sql_help.c:2214
+msgid "collation_version"
+msgstr "versão_ordenação"
+
+#: sql_help.c:2219
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2239
+msgid "constraint"
+msgstr "restrição"
+
+#: sql_help.c:2240
+msgid "where constraint is:"
+msgstr "onde restrição é:"
+
+#: sql_help.c:2254 sql_help.c:2691 sql_help.c:3119
+msgid "event"
+msgstr "evento"
+
+#: sql_help.c:2255
+msgid "filter_variable"
+msgstr "variável_filtro"
+
+#: sql_help.c:2256
+msgid "filter_value"
+msgstr "valor_filtro"
+
+#: sql_help.c:2352 sql_help.c:2938
+msgid "where column_constraint is:"
+msgstr "onde restrição_coluna é:"
+
+#: sql_help.c:2397
+msgid "rettype"
+msgstr "tipo_retornado"
+
+#: sql_help.c:2399
+msgid "column_type"
+msgstr "tipo_coluna"
+
+#: sql_help.c:2408 sql_help.c:2611
+msgid "definition"
+msgstr "definição"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "obj_file"
+msgstr "arquivo_objeto"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "link_symbol"
+msgstr "símbolo_ligação"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "sql_body"
+msgstr "corpo_sql"
+
+#: sql_help.c:2449 sql_help.c:2676 sql_help.c:3242
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2465 sql_help.c:2506 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:3002
+msgid "method"
+msgstr "método"
+
+#: sql_help.c:2470
+msgid "opclass_parameter"
+msgstr "parâmetro_classe_operador"
+
+#: sql_help.c:2487
+msgid "call_handler"
+msgstr "tratador_chamada"
+
+#: sql_help.c:2488
+msgid "inline_handler"
+msgstr "tratador_em_linha"
+
+#: sql_help.c:2489
+msgid "valfunction"
+msgstr "função_validação"
+
+#: sql_help.c:2528
+msgid "com_op"
+msgstr "operador_comutação"
+
+#: sql_help.c:2529
+msgid "neg_op"
+msgstr "operador_negação"
+
+#: sql_help.c:2547
+msgid "family_name"
+msgstr "nome_família"
+
+#: sql_help.c:2558
+msgid "storage_type"
+msgstr "tipo_armazenamento"
+
+#: sql_help.c:2697 sql_help.c:3126
+msgid "where event can be one of:"
+msgstr "onde evento pode ser um dos seguintes:"
+
+#: sql_help.c:2717 sql_help.c:2719
+msgid "schema_element"
+msgstr "elemento_esquema"
+
+#: sql_help.c:2756
+msgid "server_type"
+msgstr "tipo_servidor"
+
+#: sql_help.c:2757
+msgid "server_version"
+msgstr "versão_servidor"
+
+#: sql_help.c:2758 sql_help.c:3907 sql_help.c:4359
+msgid "fdw_name"
+msgstr "nome_fdw"
+
+#: sql_help.c:2775 sql_help.c:2778
+msgid "statistics_name"
+msgstr "nome_estatísticas"
+
+#: sql_help.c:2779
+msgid "statistics_kind"
+msgstr "tipo_estatísticas"
+
+#: sql_help.c:2795
+msgid "subscription_name"
+msgstr "nome_subscrição"
+
+#: sql_help.c:2900
+msgid "source_table"
+msgstr "tabela_origem"
+
+#: sql_help.c:2901
+msgid "like_option"
+msgstr "opção_like"
+
+#: sql_help.c:2967
+msgid "and like_option is:"
+msgstr "e opção_like é:"
+
+#: sql_help.c:3019
+msgid "directory"
+msgstr "diretório"
+
+#: sql_help.c:3033
+msgid "parser_name"
+msgstr "nome_analisador"
+
+#: sql_help.c:3034
+msgid "source_config"
+msgstr "configuração_origem"
+
+#: sql_help.c:3063
+msgid "start_function"
+msgstr "função_início"
+
+#: sql_help.c:3064
+msgid "gettoken_function"
+msgstr "função_gettoken"
+
+#: sql_help.c:3065
+msgid "end_function"
+msgstr "função_fim"
+
+#: sql_help.c:3066
+msgid "lextypes_function"
+msgstr "função_lextypes"
+
+#: sql_help.c:3067
+msgid "headline_function"
+msgstr "função_headline"
+
+#: sql_help.c:3079
+msgid "init_function"
+msgstr "função_init"
+
+#: sql_help.c:3080
+msgid "lexize_function"
+msgstr "função_lexize"
+
+#: sql_help.c:3093
+msgid "from_sql_function_name"
+msgstr "nome_função_sql_from"
+
+#: sql_help.c:3095
+msgid "to_sql_function_name"
+msgstr "nome_função_sql_to"
+
+#: sql_help.c:3121
+msgid "referenced_table_name"
+msgstr "nome_tabela_referenciada"
+
+#: sql_help.c:3122
+msgid "transition_relation_name"
+msgstr "nome_relação_transição"
+
+#: sql_help.c:3125
+msgid "arguments"
+msgstr "argumentos"
+
+#: sql_help.c:3177
+msgid "label"
+msgstr "rótulo"
+
+#: sql_help.c:3179
+msgid "subtype"
+msgstr "subtipo"
+
+#: sql_help.c:3180
+msgid "subtype_operator_class"
+msgstr "classe_operador_subtipo"
+
+#: sql_help.c:3182
+msgid "canonical_function"
+msgstr "função_canônica"
+
+#: sql_help.c:3183
+msgid "subtype_diff_function"
+msgstr "função_diff_subtipo"
+
+#: sql_help.c:3184
+msgid "multirange_type_name"
+msgstr "nome_tipo_multi_intervalo"
+
+#: sql_help.c:3186
+msgid "input_function"
+msgstr "função_entrada"
+
+#: sql_help.c:3187
+msgid "output_function"
+msgstr "função_saída"
+
+#: sql_help.c:3188
+msgid "receive_function"
+msgstr "função_recepção"
+
+#: sql_help.c:3189
+msgid "send_function"
+msgstr "função_envio"
+
+#: sql_help.c:3190
+msgid "type_modifier_input_function"
+msgstr "função_entrada_modificador_tipo"
+
+#: sql_help.c:3191
+msgid "type_modifier_output_function"
+msgstr "função_saída_modificador_tipo"
+
+#: sql_help.c:3192
+msgid "analyze_function"
+msgstr "função_análise"
+
+#: sql_help.c:3193
+msgid "subscript_function"
+msgstr "função_índice"
+
+#: sql_help.c:3194
+msgid "internallength"
+msgstr "tamanho_interno"
+
+#: sql_help.c:3195
+msgid "alignment"
+msgstr "alinhamento"
+
+#: sql_help.c:3196
+msgid "storage"
+msgstr "armazenamento"
+
+#: sql_help.c:3197
+msgid "like_type"
+msgstr "tipo_like"
+
+#: sql_help.c:3198
+msgid "category"
+msgstr "categoria"
+
+#: sql_help.c:3199
+msgid "preferred"
+msgstr "tipo_preferido"
+
+#: sql_help.c:3200
+msgid "default"
+msgstr "valor_padrão"
+
+#: sql_help.c:3201
+msgid "element"
+msgstr "elemento"
+
+#: sql_help.c:3202
+msgid "delimiter"
+msgstr "delimitador"
+
+#: sql_help.c:3203
+msgid "collatable"
+msgstr "ordenável"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4076 sql_help.c:4559
+#: sql_help.c:4661 sql_help.c:4816 sql_help.c:4929 sql_help.c:5062
+msgid "with_query"
+msgstr "consulta_with"
+
+#: sql_help.c:3302 sql_help.c:3988 sql_help.c:4578 sql_help.c:4584
+#: sql_help.c:4587 sql_help.c:4591 sql_help.c:4595 sql_help.c:4603
+#: sql_help.c:4835 sql_help.c:4841 sql_help.c:4844 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4860 sql_help.c:4931 sql_help.c:5081
+#: sql_help.c:5087 sql_help.c:5090 sql_help.c:5094 sql_help.c:5098
+#: sql_help.c:5106
+msgid "alias"
+msgstr "aliás"
+
+#: sql_help.c:3303 sql_help.c:4563 sql_help.c:4605 sql_help.c:4607
+#: sql_help.c:4611 sql_help.c:4613 sql_help.c:4614 sql_help.c:4615
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4862 sql_help.c:4864
+#: sql_help.c:4868 sql_help.c:4870 sql_help.c:4871 sql_help.c:4872
+#: sql_help.c:4938 sql_help.c:5066 sql_help.c:5108 sql_help.c:5110
+#: sql_help.c:5114 sql_help.c:5116 sql_help.c:5117 sql_help.c:5118
+msgid "from_item"
+msgstr "item_from"
+
+#: sql_help.c:3305 sql_help.c:3788 sql_help.c:4126 sql_help.c:4940
+msgid "cursor_name"
+msgstr "nome_cursor"
+
+#: sql_help.c:3306 sql_help.c:3994 sql_help.c:4941
+msgid "output_expression"
+msgstr "expressão_saída"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4562 sql_help.c:4664
+#: sql_help.c:4819 sql_help.c:4942 sql_help.c:5065
+msgid "output_name"
+msgstr "nome_saída"
+
+#: sql_help.c:3323
+msgid "code"
+msgstr "código"
+
+#: sql_help.c:3728
+msgid "parameter"
+msgstr "parâmetro"
+
+#: sql_help.c:3751 sql_help.c:3752 sql_help.c:4151
+msgid "statement"
+msgstr "comando"
+
+#: sql_help.c:3787 sql_help.c:4125
+msgid "direction"
+msgstr "direção"
+
+#: sql_help.c:3789 sql_help.c:4127
+msgid "where direction can be one of:"
+msgstr "onde a direção pode ser uma das seguintes:"
+
+#: sql_help.c:3790 sql_help.c:3791 sql_help.c:3792 sql_help.c:3793
+#: sql_help.c:3794 sql_help.c:4128 sql_help.c:4129 sql_help.c:4130
+#: sql_help.c:4131 sql_help.c:4132 sql_help.c:4572 sql_help.c:4574
+#: sql_help.c:4675 sql_help.c:4677 sql_help.c:4829 sql_help.c:4831
+#: sql_help.c:5006 sql_help.c:5008 sql_help.c:5075 sql_help.c:5077
+msgid "count"
+msgstr "contador"
+
+#: sql_help.c:3897 sql_help.c:4349
+msgid "sequence_name"
+msgstr "nome_sequência"
+
+#: sql_help.c:3915 sql_help.c:4367
+msgid "arg_name"
+msgstr "nome_argumento"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_type"
+msgstr "tipo_argumento"
+
+#: sql_help.c:3923 sql_help.c:4375
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3954
+msgid "remote_schema"
+msgstr "esquema_remoto"
+
+#: sql_help.c:3957
+msgid "local_schema"
+msgstr "esquema_local"
+
+#: sql_help.c:3992
+msgid "conflict_target"
+msgstr "destino_conflito"
+
+#: sql_help.c:3993
+msgid "conflict_action"
+msgstr "ação_conflito"
+
+#: sql_help.c:3996
+msgid "where conflict_target can be one of:"
+msgstr "onde destino_conflito pode ser um dos seguintes:"
+
+#: sql_help.c:3997
+msgid "index_column_name"
+msgstr "nome_coluna_índice"
+
+#: sql_help.c:3998
+msgid "index_expression"
+msgstr "expressão_índice"
+
+#: sql_help.c:4001
+msgid "index_predicate"
+msgstr "predicado_índice"
+
+#: sql_help.c:4003
+msgid "and conflict_action is one of:"
+msgstr "onde ação_conflito é uma das:"
+
+#: sql_help.c:4009 sql_help.c:4937
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4018 sql_help.c:4140 sql_help.c:4913
+msgid "channel"
+msgstr "canal"
+
+#: sql_help.c:4040
+msgid "lockmode"
+msgstr "modo_bloqueio"
+
+#: sql_help.c:4041
+msgid "where lockmode is one of:"
+msgstr "onde modo_bloqueio é um dos seguintes:"
+
+#: sql_help.c:4077
+msgid "target_table_name"
+msgstr "nome_tabela_destino"
+
+#: sql_help.c:4078
+msgid "target_alias"
+msgstr "alias_destino"
+
+#: sql_help.c:4079
+msgid "data_source"
+msgstr "origem_dados"
+
+#: sql_help.c:4080 sql_help.c:4608 sql_help.c:4865 sql_help.c:5111
+msgid "join_condition"
+msgstr "condição_junção"
+
+#: sql_help.c:4081
+msgid "when_clause"
+msgstr "cláusula_when"
+
+#: sql_help.c:4082
+msgid "where data_source is:"
+msgstr "onde fonte_dados é:"
+
+#: sql_help.c:4083
+msgid "source_table_name"
+msgstr "nome_tabela_origem"
+
+#: sql_help.c:4084
+msgid "source_query"
+msgstr "consulta_origem"
+
+#: sql_help.c:4085
+msgid "source_alias"
+msgstr "alias_origem"
+
+#: sql_help.c:4086
+msgid "and when_clause is:"
+msgstr "e cláusula_when é:"
+
+#: sql_help.c:4088
+msgid "merge_update"
+msgstr "mesclagem_atualização"
+
+#: sql_help.c:4089
+msgid "merge_delete"
+msgstr "mesclagem_exclusão"
+
+#: sql_help.c:4091
+msgid "merge_insert"
+msgstr "mesclagem_inserção"
+
+#: sql_help.c:4092
+msgid "and merge_insert is:"
+msgstr "e mesclagem_inserção é:"
+
+#: sql_help.c:4095
+msgid "and merge_update is:"
+msgstr "e mesclagem_atualização é:"
+
+#: sql_help.c:4100
+msgid "and merge_delete is:"
+msgstr "e mesclagem_exclusão é:"
+
+#: sql_help.c:4141
+msgid "payload"
+msgstr "carga útil"
+
+#: sql_help.c:4168
+msgid "old_role"
+msgstr "role_antiga"
+
+#: sql_help.c:4169
+msgid "new_role"
+msgstr "role_nova"
+
+#: sql_help.c:4208 sql_help.c:4417 sql_help.c:4425
+msgid "savepoint_name"
+msgstr "nome_ponto_salvamento"
+
+#: sql_help.c:4565 sql_help.c:4623 sql_help.c:4822 sql_help.c:4880
+#: sql_help.c:5068 sql_help.c:5126
+msgid "grouping_element"
+msgstr "elemento_agrupamento"
+
+#: sql_help.c:4567 sql_help.c:4670 sql_help.c:4824 sql_help.c:5070
+msgid "window_name"
+msgstr "nome_janela"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_definition"
+msgstr "definição_janela"
+
+#: sql_help.c:4569 sql_help.c:4583 sql_help.c:4627 sql_help.c:4672
+#: sql_help.c:4826 sql_help.c:4840 sql_help.c:4884 sql_help.c:5072
+#: sql_help.c:5086 sql_help.c:5130
+msgid "select"
+msgstr "seleção"
+
+#: sql_help.c:4576 sql_help.c:4833 sql_help.c:5079
+msgid "where from_item can be one of:"
+msgstr "onde item_from pode ser um dos seguintes:"
+
+#: sql_help.c:4579 sql_help.c:4585 sql_help.c:4588 sql_help.c:4592
+#: sql_help.c:4604 sql_help.c:4836 sql_help.c:4842 sql_help.c:4845
+#: sql_help.c:4849 sql_help.c:4861 sql_help.c:5082 sql_help.c:5088
+#: sql_help.c:5091 sql_help.c:5095 sql_help.c:5107
+msgid "column_alias"
+msgstr "aliás_coluna"
+
+#: sql_help.c:4580 sql_help.c:4837 sql_help.c:5083
+msgid "sampling_method"
+msgstr "método_amostragem"
+
+#: sql_help.c:4582 sql_help.c:4839 sql_help.c:5085
+msgid "seed"
+msgstr "semente"
+
+#: sql_help.c:4586 sql_help.c:4625 sql_help.c:4843 sql_help.c:4882
+#: sql_help.c:5089 sql_help.c:5128
+msgid "with_query_name"
+msgstr "nome_consulta_with"
+
+#: sql_help.c:4596 sql_help.c:4599 sql_help.c:4602 sql_help.c:4853
+#: sql_help.c:4856 sql_help.c:4859 sql_help.c:5099 sql_help.c:5102
+#: sql_help.c:5105
+msgid "column_definition"
+msgstr "definição_coluna"
+
+#: sql_help.c:4606 sql_help.c:4612 sql_help.c:4863 sql_help.c:4869
+#: sql_help.c:5109 sql_help.c:5115
+msgid "join_type"
+msgstr "tipo_junção"
+
+#: sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_column"
+msgstr "coluna_junção"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_using_alias"
+msgstr "junção_usando_alias"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5119
+msgid "and grouping_element can be one of:"
+msgstr "e elemento_agrupamento pode ser um dos seguintes:"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5127
+msgid "and with_query is:"
+msgstr "e a consulta_with é:"
+
+#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5131
+msgid "values"
+msgstr "valores"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "insert"
+msgstr "inserção"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "update"
+msgstr "atualização"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "delete"
+msgstr "exclusão"
+
+#: sql_help.c:4633 sql_help.c:4890 sql_help.c:5136
+msgid "search_seq_col_name"
+msgstr "nome_col_seq_procura"
+
+#: sql_help.c:4635 sql_help.c:4892 sql_help.c:5138
+msgid "cycle_mark_col_name"
+msgstr "nome_col_marca_ciclo"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_value"
+msgstr "valor_marca_ciclo"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_default"
+msgstr "padrão_marca_ciclo"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_path_col_name"
+msgstr "nome_col_caminho_ciclo"
+
+#: sql_help.c:4665
+msgid "new_table"
+msgstr "tabela_nova"
+
+#: sql_help.c:4736
+msgid "snapshot_id"
+msgstr "id_instantâneeo"
+
+#: sql_help.c:5004
+msgid "sort_expression"
+msgstr "expressão_classificação"
+
+#: sql_help.c:5148 sql_help.c:6132
+msgid "abort the current transaction"
+msgstr "interrompe a transação corrente"
+
+#: sql_help.c:5154
+msgid "change the definition of an aggregate function"
+msgstr "muda a definição de uma função de agregação"
+
+#: sql_help.c:5160
+msgid "change the definition of a collation"
+msgstr "muda a definição de uma ordenação"
+
+#: sql_help.c:5166
+msgid "change the definition of a conversion"
+msgstr "muda a definição de uma conversão"
+
+#: sql_help.c:5172
+msgid "change a database"
+msgstr "muda o banco de dados"
+
+#: sql_help.c:5178
+msgid "define default access privileges"
+msgstr "define os privilégios de acesso padrão"
+
+#: sql_help.c:5184
+msgid "change the definition of a domain"
+msgstr "muda a definição de um domínio"
+
+#: sql_help.c:5190
+msgid "change the definition of an event trigger"
+msgstr "muda a definição de um gatilho de eventos"
+
+#: sql_help.c:5196
+msgid "change the definition of an extension"
+msgstr "muda a definição de uma extensão"
+
+#: sql_help.c:5202
+msgid "change the definition of a foreign-data wrapper"
+msgstr "muda a definição de um empacotador de dados estrangeiros"
+
+#: sql_help.c:5208
+msgid "change the definition of a foreign table"
+msgstr "muda a definição de uma tabela estrangeira"
+
+#: sql_help.c:5214
+msgid "change the definition of a function"
+msgstr "muda a definição de uma função"
+
+#: sql_help.c:5220
+msgid "change role name or membership"
+msgstr "muda o nome da função de banco de dados (role), ou participação"
+
+#: sql_help.c:5226
+msgid "change the definition of an index"
+msgstr "muda a definição de um índice"
+
+#: sql_help.c:5232
+msgid "change the definition of a procedural language"
+msgstr "muda a definição de uma linguagem procedural"
+
+#: sql_help.c:5238
+msgid "change the definition of a large object"
+msgstr "muda a definição de um objeto grande"
+
+#: sql_help.c:5244
+msgid "change the definition of a materialized view"
+msgstr "muda a definição de uma visão materializada"
+
+#: sql_help.c:5250
+msgid "change the definition of an operator"
+msgstr "muda a definição de um operador"
+
+#: sql_help.c:5256
+msgid "change the definition of an operator class"
+msgstr "muda a definição de uma classe de operador"
+
+#: sql_help.c:5262
+msgid "change the definition of an operator family"
+msgstr "muda a definição de uma família de operadores"
+
+#: sql_help.c:5268
+msgid "change the definition of a row-level security policy"
+msgstr "muda a definição de uma política de segurança no nível de linha"
+
+#: sql_help.c:5274
+msgid "change the definition of a procedure"
+msgstr "muda a definição de um procedimento"
+
+#: sql_help.c:5280
+msgid "change the definition of a publication"
+msgstr "muda a definição de uma publicação"
+
+#: sql_help.c:5286 sql_help.c:5388
+msgid "change a database role"
+msgstr "muda uma função de banco de dados (role)"
+
+#: sql_help.c:5292
+msgid "change the definition of a routine"
+msgstr "muda a definição de uma rotina"
+
+#: sql_help.c:5298
+msgid "change the definition of a rule"
+msgstr "muda a definição de uma regra"
+
+#: sql_help.c:5304
+msgid "change the definition of a schema"
+msgstr "muda a definição de um esquema"
+
+#: sql_help.c:5310
+msgid "change the definition of a sequence generator"
+msgstr "muda a definição de um gerador de sequência"
+
+#: sql_help.c:5316
+msgid "change the definition of a foreign server"
+msgstr "muda a definição de um servidor estrangeiro"
+
+#: sql_help.c:5322
+msgid "change the definition of an extended statistics object"
+msgstr "muda a definição de um objeto de estatísticas estendidas"
+
+#: sql_help.c:5328
+msgid "change the definition of a subscription"
+msgstr "muda a definição de uma subscrição"
+
+#: sql_help.c:5334
+msgid "change a server configuration parameter"
+msgstr "muda um parâmetro de configuração do servidor"
+
+#: sql_help.c:5340
+msgid "change the definition of a table"
+msgstr "muda a definição de uma tabela"
+
+#: sql_help.c:5346
+msgid "change the definition of a tablespace"
+msgstr "muda a definição de um espaço de tabelas"
+
+#: sql_help.c:5352
+msgid "change the definition of a text search configuration"
+msgstr "muda a definição de uma configuração de procura de texto"
+
+#: sql_help.c:5358
+msgid "change the definition of a text search dictionary"
+msgstr "muda a definição de um dicionário de procura de texto"
+
+#: sql_help.c:5364
+msgid "change the definition of a text search parser"
+msgstr "muda a definição de um analisador de procura de texto"
+
+#: sql_help.c:5370
+msgid "change the definition of a text search template"
+msgstr "muda a definição de um modelo de procura de texto"
+
+#: sql_help.c:5376
+msgid "change the definition of a trigger"
+msgstr "muda a definição de um gatilho"
+
+#: sql_help.c:5382
+msgid "change the definition of a type"
+msgstr "muda a definição de um tipo"
+
+#: sql_help.c:5394
+msgid "change the definition of a user mapping"
+msgstr "muda a definição de um mapeamento de usuários"
+
+#: sql_help.c:5400
+msgid "change the definition of a view"
+msgstr "muda a definição de uma visão"
+
+#: sql_help.c:5406
+msgid "collect statistics about a database"
+msgstr "coleta estatísticas sobre o banco de dados"
+
+#: sql_help.c:5412 sql_help.c:6210
+msgid "start a transaction block"
+msgstr "inicia um bloco de transação"
+
+#: sql_help.c:5418
+msgid "invoke a procedure"
+msgstr "chama um procedimento"
+
+#: sql_help.c:5424
+msgid "force a write-ahead log checkpoint"
+msgstr "força ponto de controle no WAL"
+
+#: sql_help.c:5430
+msgid "close a cursor"
+msgstr "fecha um cursor"
+
+#: sql_help.c:5436
+msgid "cluster a table according to an index"
+msgstr "agrupa uma tabela de acordo com um índice"
+
+#: sql_help.c:5442
+msgid "define or change the comment of an object"
+msgstr "define ou muda o comentário de um objeto"
+
+#: sql_help.c:5448 sql_help.c:6006
+msgid "commit the current transaction"
+msgstr "efetiva a transação corrente"
+
+#: sql_help.c:5454
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "efetiva uma transação que foi anteriormente preparada para efetivação em duas fases"
+
+#: sql_help.c:5460
+msgid "copy data between a file and a table"
+msgstr "copia os dados de um arquivo para uma tabela"
+
+#: sql_help.c:5466
+msgid "define a new access method"
+msgstr "define um novo método de acesso"
+
+#: sql_help.c:5472
+msgid "define a new aggregate function"
+msgstr "define um nova função de agregação"
+
+#: sql_help.c:5478
+msgid "define a new cast"
+msgstr "define uma nova conversão de tipo"
+
+#: sql_help.c:5484
+msgid "define a new collation"
+msgstr "define uma nova ordenação"
+
+#: sql_help.c:5490
+msgid "define a new encoding conversion"
+msgstr "define uma nova conversão de codificação"
+
+#: sql_help.c:5496
+msgid "create a new database"
+msgstr "cria um banco de dados"
+
+#: sql_help.c:5502
+msgid "define a new domain"
+msgstr "define um novo domínio"
+
+#: sql_help.c:5508
+msgid "define a new event trigger"
+msgstr "define um novo gatilho de eventos"
+
+#: sql_help.c:5514
+msgid "install an extension"
+msgstr "instala uma extensão"
+
+#: sql_help.c:5520
+msgid "define a new foreign-data wrapper"
+msgstr "define um novo empacotador de dados estrangeiros"
+
+#: sql_help.c:5526
+msgid "define a new foreign table"
+msgstr "define uma nova tabela estrangeira"
+
+#: sql_help.c:5532
+msgid "define a new function"
+msgstr "define uma nova função"
+
+#: sql_help.c:5538 sql_help.c:5598 sql_help.c:5700
+msgid "define a new database role"
+msgstr "define uma nova função de banco de dados (role) para o banco de dados"
+
+#: sql_help.c:5544
+msgid "define a new index"
+msgstr "define um novo índice"
+
+#: sql_help.c:5550
+msgid "define a new procedural language"
+msgstr "define uma nova linguagem procedural"
+
+#: sql_help.c:5556
+msgid "define a new materialized view"
+msgstr "define uma nova visão materializada"
+
+#: sql_help.c:5562
+msgid "define a new operator"
+msgstr "define um novo operador"
+
+#: sql_help.c:5568
+msgid "define a new operator class"
+msgstr "define uma nova classe de operador"
+
+#: sql_help.c:5574
+msgid "define a new operator family"
+msgstr "define uma nova família de operadores"
+
+#: sql_help.c:5580
+msgid "define a new row-level security policy for a table"
+msgstr "define uma nova política de segurança no nível de linha para uma tabela"
+
+#: sql_help.c:5586
+msgid "define a new procedure"
+msgstr "define um novo procedimento"
+
+#: sql_help.c:5592
+msgid "define a new publication"
+msgstr "define uma nova publicação"
+
+#: sql_help.c:5604
+msgid "define a new rewrite rule"
+msgstr "define uma nova regra de reescrita"
+
+#: sql_help.c:5610
+msgid "define a new schema"
+msgstr "define um novo esquema"
+
+#: sql_help.c:5616
+msgid "define a new sequence generator"
+msgstr "define um novo gerador de sequência"
+
+#: sql_help.c:5622
+msgid "define a new foreign server"
+msgstr "define um novo servidor estrangeiro"
+
+#: sql_help.c:5628
+msgid "define extended statistics"
+msgstr "define estatísticas estendidas"
+
+#: sql_help.c:5634
+msgid "define a new subscription"
+msgstr "define uma nova subscrição"
+
+#: sql_help.c:5640
+msgid "define a new table"
+msgstr "define uma nova tabela"
+
+#: sql_help.c:5646 sql_help.c:6168
+msgid "define a new table from the results of a query"
+msgstr "cria uma tabela a partir dos resultados de uma consulta"
+
+#: sql_help.c:5652
+msgid "define a new tablespace"
+msgstr "define um novo espaço de tabelas"
+
+#: sql_help.c:5658
+msgid "define a new text search configuration"
+msgstr "define uma nova configuração de procura de texto"
+
+#: sql_help.c:5664
+msgid "define a new text search dictionary"
+msgstr "define um novo dicionário de procura de texto"
+
+#: sql_help.c:5670
+msgid "define a new text search parser"
+msgstr "define um novo analisador de procura de texto"
+
+#: sql_help.c:5676
+msgid "define a new text search template"
+msgstr "define um novo modelo de procura de texto"
+
+#: sql_help.c:5682
+msgid "define a new transform"
+msgstr "define uma nova transformação"
+
+#: sql_help.c:5688
+msgid "define a new trigger"
+msgstr "define um novo gatilho"
+
+#: sql_help.c:5694
+msgid "define a new data type"
+msgstr "define um novo tipo de dado"
+
+#: sql_help.c:5706
+msgid "define a new mapping of a user to a foreign server"
+msgstr "define um novo mapeamento de um usuário para um servidor estrangeiro"
+
+#: sql_help.c:5712
+msgid "define a new view"
+msgstr "define uma nova visão"
+
+#: sql_help.c:5718
+msgid "deallocate a prepared statement"
+msgstr "remove um comando preparado"
+
+#: sql_help.c:5724
+msgid "define a cursor"
+msgstr "define um cursor"
+
+#: sql_help.c:5730
+msgid "delete rows of a table"
+msgstr "apaga linhas de uma tabela"
+
+#: sql_help.c:5736
+msgid "discard session state"
+msgstr "descarta o estado da sessão"
+
+#: sql_help.c:5742
+msgid "execute an anonymous code block"
+msgstr "executa um bloco de código anônimo"
+
+#: sql_help.c:5748
+msgid "remove an access method"
+msgstr "remove um método de acesso"
+
+#: sql_help.c:5754
+msgid "remove an aggregate function"
+msgstr "remove uma função de agregação"
+
+#: sql_help.c:5760
+msgid "remove a cast"
+msgstr "remove uma conversão de tipo"
+
+#: sql_help.c:5766
+msgid "remove a collation"
+msgstr "remove uma ordenação"
+
+#: sql_help.c:5772
+msgid "remove a conversion"
+msgstr "remove uma conversão"
+
+#: sql_help.c:5778
+msgid "remove a database"
+msgstr "remove um banco de dados"
+
+#: sql_help.c:5784
+msgid "remove a domain"
+msgstr "remove um domínio"
+
+#: sql_help.c:5790
+msgid "remove an event trigger"
+msgstr "remove um gatilho de eventos"
+
+#: sql_help.c:5796
+msgid "remove an extension"
+msgstr "remove uma extensão"
+
+#: sql_help.c:5802
+msgid "remove a foreign-data wrapper"
+msgstr "remove um empacotador de dados estrangeiros"
+
+#: sql_help.c:5808
+msgid "remove a foreign table"
+msgstr "remove uma tabela estrangeira"
+
+#: sql_help.c:5814
+msgid "remove a function"
+msgstr "remove uma função"
+
+#: sql_help.c:5820 sql_help.c:5886 sql_help.c:5988
+msgid "remove a database role"
+msgstr "remove uma função de banco de dados (role) do banco de dados"
+
+#: sql_help.c:5826
+msgid "remove an index"
+msgstr "remove um índice"
+
+#: sql_help.c:5832
+msgid "remove a procedural language"
+msgstr "remove uma linguagem procedural"
+
+#: sql_help.c:5838
+msgid "remove a materialized view"
+msgstr "remove uma visão materializada"
+
+#: sql_help.c:5844
+msgid "remove an operator"
+msgstr "remove um operador"
+
+#: sql_help.c:5850
+msgid "remove an operator class"
+msgstr "remove uma classe de operador"
+
+#: sql_help.c:5856
+msgid "remove an operator family"
+msgstr "remove uma família de operadores"
+
+#: sql_help.c:5862
+msgid "remove database objects owned by a database role"
+msgstr "remove objetos do banco de dados cujo dono é uma função de banco de dados (role) do banco de dados"
+
+#: sql_help.c:5868
+msgid "remove a row-level security policy from a table"
+msgstr "remove uma política de segurança no nível de linha de uma tabela"
+
+#: sql_help.c:5874
+msgid "remove a procedure"
+msgstr "remove um procedimento"
+
+#: sql_help.c:5880
+msgid "remove a publication"
+msgstr "remove uma publicação"
+
+#: sql_help.c:5892
+msgid "remove a routine"
+msgstr "remove uma rotina"
+
+#: sql_help.c:5898
+msgid "remove a rewrite rule"
+msgstr "remove uma regra de reescrita"
+
+#: sql_help.c:5904
+msgid "remove a schema"
+msgstr "remove um esquema"
+
+#: sql_help.c:5910
+msgid "remove a sequence"
+msgstr "remove uma sequência"
+
+#: sql_help.c:5916
+msgid "remove a foreign server descriptor"
+msgstr "remove um descritor de servidor estrangeiro"
+
+#: sql_help.c:5922
+msgid "remove extended statistics"
+msgstr "remove estatísticas estendidas"
+
+#: sql_help.c:5928
+msgid "remove a subscription"
+msgstr "remove uma subscrição"
+
+#: sql_help.c:5934
+msgid "remove a table"
+msgstr "remove uma tabela"
+
+#: sql_help.c:5940
+msgid "remove a tablespace"
+msgstr "remove um espaço de tabelas"
+
+#: sql_help.c:5946
+msgid "remove a text search configuration"
+msgstr "remove uma configuração de procura de texto"
+
+#: sql_help.c:5952
+msgid "remove a text search dictionary"
+msgstr "remove um dicionário de procura de texto"
+
+#: sql_help.c:5958
+msgid "remove a text search parser"
+msgstr "remove um analisador de procura de texto"
+
+#: sql_help.c:5964
+msgid "remove a text search template"
+msgstr "remove um modelo de procura de texto"
+
+#: sql_help.c:5970
+msgid "remove a transform"
+msgstr "remove uma transformação"
+
+#: sql_help.c:5976
+msgid "remove a trigger"
+msgstr "remove um gatilho"
+
+#: sql_help.c:5982
+msgid "remove a data type"
+msgstr "remove um tipo de dado"
+
+#: sql_help.c:5994
+msgid "remove a user mapping for a foreign server"
+msgstr "remove um mapeamento de usuários para um servidor estrangeiro"
+
+#: sql_help.c:6000
+msgid "remove a view"
+msgstr "remove uma visão"
+
+#: sql_help.c:6012
+msgid "execute a prepared statement"
+msgstr "executa um comando preparado"
+
+#: sql_help.c:6018
+msgid "show the execution plan of a statement"
+msgstr "mostra o plano de execução de um comando"
+
+#: sql_help.c:6024
+msgid "retrieve rows from a query using a cursor"
+msgstr "recupera linhas de uma consulta usando um cursor"
+
+#: sql_help.c:6030
+msgid "define access privileges"
+msgstr "define privilégios de acesso"
+
+#: sql_help.c:6036
+msgid "import table definitions from a foreign server"
+msgstr "importa definições de tabelas de um servidor estrangeiro"
+
+#: sql_help.c:6042
+msgid "create new rows in a table"
+msgstr "cria novas linhas em uma tabela"
+
+#: sql_help.c:6048
+msgid "listen for a notification"
+msgstr "escuta notificações"
+
+#: sql_help.c:6054
+msgid "load a shared library file"
+msgstr "carrega um arquivo de biblioteca compartilhada"
+
+#: sql_help.c:6060
+msgid "lock a table"
+msgstr "bloqueia uma tabela"
+
+#: sql_help.c:6066
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "insere, atualiza ou exclui condicionalmente linhas de uma tabela"
+
+#: sql_help.c:6072
+msgid "position a cursor"
+msgstr "posiciona um cursor"
+
+#: sql_help.c:6078
+msgid "generate a notification"
+msgstr "gera uma notificação"
+
+#: sql_help.c:6084
+msgid "prepare a statement for execution"
+msgstr "prepara um comando para execução"
+
+#: sql_help.c:6090
+msgid "prepare the current transaction for two-phase commit"
+msgstr "prepara a transação corrente para efetivação em duas fases"
+
+#: sql_help.c:6096
+msgid "change the ownership of database objects owned by a database role"
+msgstr ""
+"muda o dono dos objetos de banco de dados cujo dono é uma\n"
+"função de banco de dados (role) do banco de dados"
+
+#: sql_help.c:6102
+msgid "replace the contents of a materialized view"
+msgstr "substitui o conteúdo de uma visão materializada"
+
+#: sql_help.c:6108
+msgid "rebuild indexes"
+msgstr "reconstrói índices"
+
+#: sql_help.c:6114
+msgid "release a previously defined savepoint"
+msgstr "libera um ponto de salvamento definido anteriormente"
+
+#: sql_help.c:6120
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "restaura o valor do parâmetro em tempo de execução para o valor padrão"
+
+#: sql_help.c:6126
+msgid "remove access privileges"
+msgstr "remove privilégios de acesso"
+
+#: sql_help.c:6138
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "cancela uma transação que foi preparada anteriormente para efetivação em duas fases"
+
+#: sql_help.c:6144
+msgid "roll back to a savepoint"
+msgstr "desfaz até um ponto de salvamento"
+
+#: sql_help.c:6150
+msgid "define a new savepoint within the current transaction"
+msgstr "define um novo ponto de salvamento na transação corrente"
+
+#: sql_help.c:6156
+msgid "define or change a security label applied to an object"
+msgstr "define ou muda um rótulo de segurança aplicado a um objeto"
+
+#: sql_help.c:6162 sql_help.c:6216 sql_help.c:6252
+msgid "retrieve rows from a table or view"
+msgstr "recupera linhas de uma tabela ou visão"
+
+#: sql_help.c:6174
+msgid "change a run-time parameter"
+msgstr "muda um parâmetro em tempo de execução"
+
+#: sql_help.c:6180
+msgid "set constraint check timing for the current transaction"
+msgstr "define o momento de verificação da restrição na transação corrente"
+
+#: sql_help.c:6186
+msgid "set the current user identifier of the current session"
+msgstr "define o identificador do usuário corrente desta sessão"
+
+#: sql_help.c:6192
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr ""
+"define o identificador do usuário da sessão e o\n"
+"identificador do usuário corrente da sessão em curso"
+
+#: sql_help.c:6198
+msgid "set the characteristics of the current transaction"
+msgstr "define as características da transação atual"
+
+#: sql_help.c:6204
+msgid "show the value of a run-time parameter"
+msgstr "mostra o valor de um parâmetro em tempo de execução"
+
+#: sql_help.c:6222
+msgid "empty a table or set of tables"
+msgstr "esvazia uma tabela ou um conjunto de tabelas"
+
+#: sql_help.c:6228
+msgid "stop listening for a notification"
+msgstr "para de esperar por notificação"
+
+#: sql_help.c:6234
+msgid "update rows of a table"
+msgstr "atualiza linhas de uma tabela"
+
+#: sql_help.c:6240
+msgid "garbage-collect and optionally analyze a database"
+msgstr "coleta o lixo e opcionalmente analisa um banco de dados"
+
+#: sql_help.c:6246
+msgid "compute a set of rows"
+msgstr "computa um conjunto de linhas"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 só pode ser usado no modo não interativo"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "não foi possível abrir o arquivo de log \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Digite \"help\" para obter ajuda.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "não foi possível definir o parâmetro de impressão \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter mais informações."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "argumento extra de linha de comando \"%s\" ignorado"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "não foi possível encontrar seu próprio executável"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"falha na completação da consulta por tab: %s\n"
+"A consulta era:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "valor não reconhecido \"%s\" para \"%s\": esperado um valor booleano"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "valor inválido \"%s\" para \"%s\": esperado um número inteiro"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "nome de variável inválido: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"valor não reconhecido \"%s\" para \"%s\"\n"
+"Os valores disponíveis são: %s."
diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po
new file mode 100644
index 0000000..3f5a870
--- /dev/null
+++ b/src/bin/psql/po/ru.po
@@ -0,0 +1,7179 @@
+# Russian message translation file for psql
+# Copyright (C) 2001-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov <mokhov@cs.concordia.ca>, 2001-2005.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004-2005.
+# Sergey Burladyan <eshkinkot@gmail.com>, 2012.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Maxim Yablokov <m.yablokov@postgrespro.ru>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-02-02 18:10+0300\n"
+"PO-Revision-Date: 2023-08-29 13:37+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "неверный иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\""
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "ошибка в %s(): %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "пользователь не ÑущеÑтвует"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команда не найдена"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Сигнал отмены отправлен\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Ñтрока)"
+msgstr[1] "(%lu Ñтроки)"
+msgstr[2] "(%lu Ñтрок)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Прервано\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° таблицы: превышен предел чиÑла Ñтолбцов (%d).\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчейки в таблицу: превышен предел чиÑла Ñчеек (%d).\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "неверный формат вывода (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "рекурÑивное раÑширение переменной \"%s\" пропуÑкаетÑÑ"
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "найти локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ идентификатору (%d) не удалоÑÑŒ: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "локальный пользователь Ñ ID %d не ÑущеÑтвует"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Введите \\? Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: лишний аргумент \"%s\" пропущен"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"команда \\%s игнорируетÑÑ; добавьте \\endif или нажмите Ctrl-C Ð´Ð»Ñ "
+"Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ блока \\if"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "не удалоÑÑŒ получить домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ c ид. %ld: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "В данный момент вы не подключены к базе данных.\n"
+
+#: command.c:664
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ð°Ð´Ñ€ÐµÑ Ñервера "
+"\"%s\", порт \"%s\").\n"
+
+#: command.c:667
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" через Ñокет в "
+"\"%s\", порт \"%s\".\n"
+
+#: command.c:673
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address "
+"\"%s\") at port \"%s\".\n"
+msgstr ""
+"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"%s\": "
+"Ð°Ð´Ñ€ÐµÑ \"%s\", порт \"%s\").\n"
+
+#: command.c:676
+#, c-format
+msgid ""
+"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port "
+"\"%s\".\n"
+msgstr ""
+"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"%s\", "
+"порт \"%s\").\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "нет буфера запроÑов"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "неверный номер Ñтроки: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Изменений нет"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr ""
+"%s: неверное название кодировки Ñимволов или не найдена процедура "
+"перекодировки"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:721 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "Ошибки не было."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: отÑутÑтвует Ð¿Ñ€Ð°Ð²Ð°Ñ Ñкобка"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "отÑутÑтвует необходимый аргумент \\%s"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif не может находитьÑÑ Ð¿Ð¾Ñле \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif без ÑоответÑтвующего \\if"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else не может находитьÑÑ Ð¿Ð¾Ñле \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else без ÑоответÑтвующего \\if"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif без ÑоответÑтвующего \\if"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "Буфер запроÑа пуÑÑ‚."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Введите новый пароль Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Повторите его: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Пароли не Ñовпадают."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: не удалоÑÑŒ прочитать значение переменной"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Буфер запроÑа Ñброшен (очищен)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñана в файл \"%s\".\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ðµ может Ñодержать знак \"=\""
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "требуетÑÑ Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "требуетÑÑ Ð¸Ð¼Ñ Ð¿Ñ€ÐµÐ´ÑтавлениÑ"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Секундомер включён."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Секундомер выключен."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: длительноÑÑ‚ÑŒ интервала указана неоднократно"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ интервала \"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: чиÑло итераций указано неоднократно"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: некорректное чиÑло итераций \"%s\""
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: нераÑпознанный параметр \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Пароль: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s: "
+
+#: command.c:3297
+#, c-format
+msgid ""
+"Do not give user, host, or port separately when using a connection string"
+msgstr ""
+"Ðе указывайте пользователÑ, Ñервер или порт отдельно, когда иÑпользуете "
+"Ñтроку подключениÑ"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr ""
+"Ðет Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе, из которого можно было бы иÑпользовать параметры"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Сохранено предыдущее подключение"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ð°Ð´Ñ€ÐµÑ "
+"Ñервера \"%s\", порт \"%s\").\n"
+
+#: command.c:3703
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" "
+"at port \"%s\".\n"
+msgstr ""
+"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" через Ñокет в "
+"\"%s\", порт \"%s\".\n"
+
+#: command.c:3709
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host "
+"\"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr ""
+"Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер "
+"\"%s\": Ð°Ð´Ñ€ÐµÑ \"%s\", порт \"%s\").\n"
+
+#: command.c:3712
+#, c-format
+msgid ""
+"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at "
+"port \"%s\".\n"
+msgstr ""
+"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"%s\", "
+"порт \"%s\").\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Вы подключены к базе данных \"%s\" как пользователь \"%s\".\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, Ñервер %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: %s имеет базовую верÑию %s, а Ñервер - %s.\n"
+" ЧаÑÑ‚ÑŒ функций psql может не работать.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL-Ñоединение (протокол: %s, шифр: %s, Ñжатие: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "неизвеÑтно"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "выкл."
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "вкл."
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "Соединение зашифровано GSSAPI\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: ÐšÐ¾Ð´Ð¾Ð²Ð°Ñ Ñтраница конÑоли (%u) отличаетÑÑ Ð¾Ñ‚ оÑновной\n"
+" Ñтраницы Windows (%u).\n"
+" 8-битовые (руÑÑкие) Ñимволы могут отображатьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾.\n"
+" Подробнее об Ñтом Ñмотрите документацию psql, раздел\n"
+" \"Notes for Windows users\".\n"
+
+#: command.c:3949
+#, c-format
+msgid ""
+"environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a "
+"line number"
+msgstr ""
+"в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PSQL_EDITOR_LINENUMBER_ARG должен быть указан номер "
+"Ñтроки"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "не удалоÑÑŒ запуÑтить редактор \"%s\""
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "не удалоÑÑŒ запуÑтить /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "не удалоÑÑŒ найти временный каталог: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть временный файл \"%s\": %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr ""
+"\\pset: неоднозначному Ñокращению \"%s\" ÑоответÑтвует и \"%s\", и \"%s\""
+
+#: command.c:4414
+#, c-format
+msgid ""
+"\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+msgstr ""
+"\\pset: допуÑтимые форматы: aligned, asciidoc, csv, html, latex, latex-"
+"longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: допуÑтимые Ñтили линий: ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: допуÑтимые Ñтили Unicode-линий границ: single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: допуÑтимые Ñтили Unicode-линий Ñтолбцов: single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: допуÑтимые Ñтили Unicode-линий заголовков: single, double"
+
+#: command.c:4530
+#, c-format
+msgid ""
+"\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", "
+"or a number specifying the exact width"
+msgstr ""
+"\\pset: допуÑтимые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ xheader_width: \"%s\" (по умолчанию), \"%s\", "
+"\"%s\", а также чиÑло, задающее точную ширину"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: Ñимвол csv_fieldsep должен быть однобайтовым"
+
+#: command.c:4552
+#, c-format
+msgid ""
+"\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage "
+"return"
+msgstr ""
+"\\pset: в качеÑтве csv_fieldsep Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñимвол кавычек, новой Ñтроки "
+"или возврата каретки"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "неизвеÑтный параметр \\pset: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Стиль границ: %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Ширина вывода Ñброшена.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Ширина вывода: %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "РаÑширенный вывод включён.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "РаÑширенный вывод применÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "РаÑширенный вывод выключен.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "Ширина раÑширенного заголовка: \"%s\".\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "Ширина раÑширенного заголовка: %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Разделитель полей Ð´Ð»Ñ CSV: \"%s\".\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Разделитель полей - нулевой байт.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Разделитель полей: \"%s\".\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Строка итогов включена.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Строка итогов выключена.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Формат вывода: %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "УÑтановлен Ñтиль линий: %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null выводитÑÑ ÐºÐ°Ðº: \"%s\".\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Локализованный вывод чиÑел включён.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Локализованный вывод чиÑел выключен.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "ПоÑтраничник иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° длинного текÑта.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "ПоÑтраничник иÑпользуетÑÑ Ð²Ñегда.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "ПоÑтраничник выключен.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "ПоÑтраничник не будет иÑпользоватьÑÑ, еÑли Ñтрок меньше %d\n"
+msgstr[1] "ПоÑтраничник не будет иÑпользоватьÑÑ, еÑли Ñтрок меньше %d\n"
+msgstr[2] "ПоÑтраничник не будет иÑпользоватьÑÑ, еÑли Ñтрок меньше %d\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Разделитель запиÑей - нулевой байт.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Разделитель запиÑей: <Ð½Ð¾Ð²Ð°Ñ Ñтрока>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Разделитель запиÑей: \"%s\".\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Ðтрибуты HTML-таблицы: \"%s\".\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Ðтрибуты HTML-таблицы не заданы.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Заголовок: \"%s\".\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Заголовок не задан.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Режим вывода только кортежей включён.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Режим вывода только кортежей выключен.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Стиль Unicode-линий границ: \"%s\".\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Стиль Unicode-линий Ñтолбцов: \"%s\".\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Стиль Unicode-линий границ: \"%s\".\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: ошибка"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ð¿ÑƒÑтым запроÑом"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "не удалоÑÑŒ уÑтановить таймер: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (обновление: %g Ñ)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (обновление: %g Ñ)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "Ñбой при ожидании Ñигналов: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* ЗÐПРОС *********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" — не предÑтавление"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "не удалоÑÑŒ разобрать маÑÑив reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "Ñкранирование Ñтрок не работает без Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº БД"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr ""
+"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: "
+"\"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "подключение к Ñерверу было потерÑно"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Подключение к Ñерверу потерÑно. Попытка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "неудачна.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "удачна.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "неожиданное значение PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "ВремÑ: %.3f мÑ\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "ВремÑ: %.3f Ð¼Ñ (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "ВремÑ: %.3f Ð¼Ñ (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "ВремÑ: %.3f Ð¼Ñ (%.0f д. %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "В данный момент вы не подключены к базе данных."
+
+#: common.c:674
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" with payload \"%s\" received from server "
+"process with PID %d.\n"
+msgstr ""
+"Получено аÑинхронное уведомление \"%s\" Ñ Ñообщением-нагрузкой \"%s\" от "
+"Ñерверного процеÑÑа Ñ PID %d.\n"
+
+#: common.c:677
+#, c-format
+msgid ""
+"Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr ""
+"Получено аÑинхронное уведомление \"%s\" от Ñерверного процеÑÑа Ñ PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "не удалоÑÑŒ вывеÑти таблицу результатов: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "Ñервер не возвратил Ñтрок Ð´Ð»Ñ \\gset"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "Ñервер возвратил больше одной Ñтроки Ð´Ð»Ñ \\gset"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "попытка выполнить \\gset Ñо Ñпециальной переменной \"%s\" игнорируетÑÑ"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify "
+"command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to "
+"cancel)********************\n"
+msgstr ""
+"***(Пошаговый режим: проверка "
+"команды)******************************************\n"
+"%s\n"
+"***(Enter - выполнение; x и Enter - отмена)**************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ОПЕРÐТОР: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "неожиданное ÑоÑтоÑние транзакции (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Столбец"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Тип"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Команда не выдала результат, либо в результате нет Ñтолбцов.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "укажите аргументы \\copy"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: ошибка разбора аргумента \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: ошибка разбора в конце Ñтроки"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "COPY FROM/TO не может работать Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ (%s)"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "не удалоÑÑŒ закрыть канал Ñообщений Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ командой: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "не удалоÑÑŒ запиÑать данные COPY: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "ошибка передачи данных COPY: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "отменено пользователем"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Вводите данные Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, разделÑÑ Ñтроки переводом Ñтроки.\n"
+"Закончите ввод Ñтрокой '\\.' или Ñигналом EOF."
+
+#: copy.c:683
+msgid "aborted because of read failure"
+msgstr "прерывание из-за ошибки чтениÑ"
+
+#: copy.c:717
+msgid "trying to exit copy mode"
+msgstr "попытка выйти из режима копированиÑ"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: оператор не возвратил результирующий набор"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ возвращать минимум три Ñтолбца"
+
+#: crosstabview.c:156
+#, c-format
+msgid ""
+"\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr ""
+"\\crosstabview: Ð´Ð»Ñ Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… и горизонтальных заголовков должны "
+"задаватьÑÑ Ñ€Ð°Ð·Ð½Ñ‹Ðµ Ñтолбцы"
+
+#: crosstabview.c:172
+#, c-format
+msgid ""
+"\\crosstabview: data column must be specified when query returns more than "
+"three columns"
+msgstr ""
+"\\crosstabview: когда Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ больше трёх Ñтолбцов, необходимо "
+"указать Ñтолбец данных"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: превышен макÑимум чиÑла Ñтолбцов (%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid ""
+"\\crosstabview: query result contains multiple data values for row \"%s\", "
+"column \"%s\""
+msgstr ""
+"\\crosstabview: в результатах запроÑа ÑодержитÑÑ Ð½ÐµÑколько значений данных "
+"Ð´Ð»Ñ Ñтроки \"%s\", Ñтолбца \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: номер Ñтолбца %d выходит за рамки диапазона 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: неоднозначное Ð¸Ð¼Ñ Ñтолбца: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: Ð¸Ð¼Ñ Ñтолбца не найдено: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Схема"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "ИмÑ"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Тип данных результата"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Типы данных аргументов"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "ОпиÑание"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "СпиÑок агрегатных функций"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает методы доÑтупа."
+
+#: describe.c:168
+msgid "Index"
+msgstr "ИндекÑ"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Таблица"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Обработчик"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "СпиÑок методов доÑтупа"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Владелец"
+
+#: describe.c:231
+msgid "Location"
+msgstr "РаÑположение"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Параметры"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Размер"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "СпиÑок табличных проÑтранÑтв"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df принимает в качеÑтве параметров только [anptwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df не поддерживает параметр \"%c\" Ñ Ñервером верÑии %s"
+
+# well-spelled: агр
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "агр."
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "оконнаÑ"
+
+#: describe.c:356
+msgid "proc"
+msgstr "проц."
+
+# well-spelled: функ
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "функ."
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "триггернаÑ"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "поÑтоÑннаÑ"
+
+#: describe.c:387
+msgid "stable"
+msgstr "ÑтабильнаÑ"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "изменчиваÑ"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "ИзменчивоÑÑ‚ÑŒ"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "ограниченнаÑ"
+
+#: describe.c:398
+msgid "safe"
+msgstr "безопаÑнаÑ"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "небезопаÑнаÑ"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "ПараллельноÑÑ‚ÑŒ"
+
+#: describe.c:405
+msgid "definer"
+msgstr "определившего"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "вызывающего"
+
+#: describe.c:407
+msgid "Security"
+msgstr "БезопаÑноÑÑ‚ÑŒ"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Язык"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Внутреннее имÑ"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "СпиÑок функций"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Элементы"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "СпиÑок типов данных"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Тип левого аргумента"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Тип правого аргумента"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Результирующий тип"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "ФункциÑ"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "СпиÑок операторов"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Кодировка"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "Провайдер локали"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "LC_COLLATE"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "LC_CTYPE"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "локаль ICU"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "Правила ICU"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Табл. проÑтранÑтво"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "СпиÑок баз данных"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "таблица"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "предÑтавление"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "материализованное предÑтавление"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "поÑледовательноÑÑ‚ÑŒ"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Права Ð´Ð»Ñ Ñтолбцов"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Политики"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Права доÑтупа"
+
+#: describe.c:1195
+msgid "function"
+msgstr "функциÑ"
+
+#: describe.c:1197
+msgid "type"
+msgstr "тип"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "Ñхема"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Права доÑтупа по умолчанию"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Объект"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "ограничение таблицы"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "ограничение домена"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "ÑемейÑтво операторов"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "правило"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "ОпиÑание объекта"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Отношение \"%s\" не найдено."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "ÐžÑ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ найдены."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Отношение Ñ OID %s не найдено."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Ðачальное_значение"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Минимум"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "МакÑимум"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "Шаг"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "да"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "нет"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "ЗацикливаетÑÑ?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "КешируетÑÑ"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Владелец: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "ПоÑледовательноÑÑ‚ÑŒ Ð´Ð»Ñ Ñтолбца идентификации: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ÐÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ð¿Ð¾ÑледовательноÑÑ‚ÑŒ \"%s.%s\""
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "ПоÑледовательноÑÑ‚ÑŒ \"%s.%s\""
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ÐÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Таблица \"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "ПредÑтавление \"%s.%s\""
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Ðежурналируемое материализованное предÑтавление \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Материализованное предÑтавление \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ðежурналируемый Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ \"%s.%s\""
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ðежурналируемый Ñекционированный Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\""
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Секционированный Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\""
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST-таблица \"%s.%s\""
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "СоÑтавной тип \"%s.%s\""
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "СтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\""
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ÐÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Ð¡ÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\""
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "Правило Ñортировки"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "ДопуÑтимоÑÑ‚ÑŒ NULL"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "По умолчанию"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Ключевой?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "Определение"
+
+# well-spelled: ОСД
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "Параметры ОСД"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Хранилище"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Сжатие"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Цель Ð´Ð»Ñ ÑтатиÑтики"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "СекциÑ: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Ðет Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñекции"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Ограничение Ñекции: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Ключ разбиениÑ: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Принадлежит таблице: \"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "первичный ключ, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "уникальный"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " null не различаютÑÑ"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s.%s\""
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", предикат (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", клаÑтеризованный"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", нерабочий"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", откладываемый"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", изначально отложенный"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", репликационный"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "ИндекÑÑ‹:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "ОграничениÑ-проверки:"
+
+# TO REWVIEW
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ ключа:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "СÑылки извне:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Политики:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Политики (уÑÐ¸Ð»ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° Ñтрок включена):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Политики (защита Ñтрок включена): (Ðет)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Политики (уÑÐ¸Ð»ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° Ñтрок включена): (Ðет)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Политики (защита Ñтрок выключена):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Объекты ÑтатиÑтики:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Правила:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Отключённые правила:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Правила, Ñрабатывающие вÑегда:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Правила, Ñрабатывающие только в реплике:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Публикации:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Определение предÑтавлениÑ:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Триггеры:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Отключённые пользовательÑкие триггеры:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Отключённые внутренние триггеры:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Триггеры, Ñрабатывающие вÑегда:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Триггеры, Ñрабатывающие только в реплике:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Сервер: %s"
+
+# well-spelled: ОСД
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "Параметр ОСД: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "ÐаÑледует"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "ЧиÑло Ñекций: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "ЧиÑло Ñекций: %d (чтобы проÑмотреть их, введите \\d+)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Дочерних таблиц: %d (чтобы проÑмотреть и их, воÑпользуйтеÑÑŒ \\d+)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Дочерние таблицы"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Секции"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Ð¢Ð¸Ð¿Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° типа: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ¸"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Содержит OID: да"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Метод доÑтупа: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", табл. проÑтранÑтво \"%s\""
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "СпиÑок ролей"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð»Ð¸"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Ðтрибуты"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Суперпользователь"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Ðе наÑледуетÑÑ"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Создаёт роли"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Создаёт БД"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Вход запрещён"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "РепликациÑ"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "ПропуÑкать RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Ðет подключений"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d подключение"
+msgstr[1] "%d подключениÑ"
+msgstr[2] "%d подключений"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Пароль дейÑтвует до "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Роль"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "БД"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Параметры"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Параметры Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" и базы данных \"%s\" не найдены."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Параметры Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" не найдены."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Ðикакие параметры не найдены."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "СпиÑок параметров"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Член ролей"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Праводатель"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "СпиÑок назначений ролей"
+
+#: describe.c:3952
+msgid "index"
+msgstr "индекÑ"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST-таблица"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "Ñекционированный индекÑ"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "поÑтоÑнное"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "временное"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "нежурналируемое"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "Хранение"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Метод доÑтупа"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "СпиÑок отношений"
+
+#: describe.c:4130
+#, c-format
+msgid ""
+"The server (version %s) does not support declarative table partitioning."
+msgstr ""
+"Сервер (верÑÐ¸Ñ %s) не поддерживает декларативное Ñекционирование таблиц."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "СпиÑок Ñекционированных индекÑов"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "СпиÑок Ñекционированных таблиц"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "СпиÑок Ñекционированных отношений"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Размер конечной Ñекции"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Общий размер"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Доверенный"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Внутренний Ñзык"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Обработчик вызова"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Обработчик внедрённого кода"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "СпиÑок Ñзыков"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Проверка"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "СпиÑок доменов"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "ИÑточник"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "Ðазначение"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "По умолчанию?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "СпиÑок преобразований"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Параметр"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Значение"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "КонтекÑÑ‚"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "СпиÑок параметров конфигурации"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "СпиÑок изменённых параметров конфигурации"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает Ñобытийные триггеры."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Событие"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "включён"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "реплика"
+
+#: describe.c:4658
+msgid "always"
+msgstr "вÑегда"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "отключён"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "Включён"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Теги"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "СпиÑок Ñобытийных триггеров"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает раÑширенные ÑтатиÑтики."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "ЗавиÑимоÑти"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "СпиÑок раÑширенных ÑтатиÑтик"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "ИÑходный тип"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Целевой тип"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "в приÑваивании"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "ÐеÑвное?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "СпиÑок приведений типов"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "Провайдер"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Детерминированное?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "СпиÑок правил Ñортировки"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "СпиÑок Ñхем"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "СпиÑок анализаторов текÑтового поиÑка"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Ðнализатор текÑтового поиÑка \"%s\" не найден."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Ðикакие анализаторы текÑтового поиÑка не найдены."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Ðачало разбора"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Метод"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Получение Ñледующего фрагмента"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Окончание разбора"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Получение выдержки"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Получение типов фрагментов"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Ðнализатор текÑтового поиÑка \"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Ðнализатор текÑтового поиÑка \"%s\""
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Ð˜Ð¼Ñ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð°"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Типы фрагментов Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° \"%s.%s\""
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Типы фрагментов Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° \"%s\""
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Шаблон"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Параметры инициализации"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "СпиÑок Ñловарей текÑтового поиÑка"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "ИнициализациÑ"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Выделение лекÑем"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "СпиÑок шаблонов текÑтового поиÑка"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "СпиÑок конфигураций текÑтового поиÑка"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" не найдена."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Ðикакие конфигурации текÑтового поиÑка не найдены."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Фрагмент"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Словари"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Ðнализатор: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Ðнализатор: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "СпиÑок обёрток Ñторонних данных"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Обёртка Ñторонних данных"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "ВерÑиÑ"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "СпиÑок Ñторонних Ñерверов"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Сервер"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "СпиÑок ÑопоÑтавлений пользователей"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "СпиÑок Ñторонних таблиц"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "СпиÑок уÑтановленных раÑширений"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "РаÑширение \"%s\" не найдено."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Ðикакие раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ найдены."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "ОпиÑание объекта"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Объекты в раÑширении \"%s\""
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "ÑÑылки между базами не реализованы: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает публикации."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Ð’Ñе таблицы"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "ДобавлениÑ"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "ИзменениÑ"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "УдалениÑ"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "ОпуÑтошениÑ"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Через корень"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "СпиÑок публикаций"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" не найдена."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Ðикакие публикации не найдены."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Таблицы:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Таблицы из Ñхем:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает подпиÑки."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "ПубликациÑ"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "БинарнаÑ"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "ПотоковаÑ"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð°Ñ Ñ„Ð¸ÐºÑациÑ"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "ОтключаетÑÑ Ð¿Ñ€Ð¸ ошибке"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "ИÑточник"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "ТребуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "ИÑпользовать владельца?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð½Ð°Ñ Ñ„Ð¸ÐºÑациÑ"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Строка подключениÑ"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "ПропуÑтить LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "СпиÑок подпиÑок"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "МД"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Входной тип"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Тип хранениÑ"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "КлаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "СемейÑтво операторов"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "СпиÑок клаÑÑов операторов"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Применимые типы"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "СпиÑок ÑемейÑтв операторов"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Оператор"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "СтратегиÑ"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "Ñортировка"
+
+#: describe.c:6911
+msgid "search"
+msgstr "поиÑк"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Ðазначение"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "СемейÑтво Ð´Ð»Ñ Ñортировки"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "СпиÑок операторов из ÑемейÑтв операторов"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "ЗарегиÑтрированный левый тип"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "ЗарегиÑтрированный правый тип"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "Ðомер"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "СпиÑок опорных функций из ÑемейÑтв операторов"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Большие объекты"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql - Ñто интерактивный терминал PostgreSQL.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [ПÐРÐМЕТР]... [БД [ПОЛЬЗОВÐТЕЛЬ]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Общие параметры:\n"
+
+#: help.c:84
+msgid ""
+" -c, --command=COMMAND run only single command (SQL or internal) and "
+"exit\n"
+msgstr ""
+" -c, --command=КОМÐÐДРвыполнить одну команду (SQL или внутреннюю) и "
+"выйти\n"
+
+#: help.c:85
+#, c-format
+msgid ""
+" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr ""
+" -d, --dbname=БД Ð¸Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ð¾Ð¹ базы данных (по умолчанию "
+"\"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=ИМЯ_ФÐЙЛРвыполнить команды из файла и выйти\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list вывеÑти ÑпиÑок баз данных и выйти\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=ИМЯ=ЗÐÐЧЕÐИЕ\n"
+" приÑвоить переменной psql ИМЯ заданное ЗÐÐЧЕÐИЕ\n"
+" (например: -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr ""
+" -X, --no-psqlrc игнорировать файл параметров запуÑка (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-"
+"interactive)\n"
+msgstr ""
+" -1 (\"один\"), --single-transaction\n"
+" выполнить как одну транзакцию\n"
+" (в неинтерактивном режиме)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] показать Ñту Ñправку и выйти\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands перечиÑлить команды Ñ \\ и выйти\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr ""
+" --help=variables перечиÑлить Ñпециальные переменные и выйти\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Параметры ввода/вывода:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all отображать вÑе команды из Ñкрипта\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors отображать команды Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries отображать команды, отправлÑемые Ñерверу\n"
+
+#: help.c:104
+msgid ""
+" -E, --echo-hidden display queries that internal commands generate\n"
+msgstr ""
+" -E, --echo-hidden выводить запроÑÑ‹, порождённые внутренними "
+"командами\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=ИМЯ_ФÐЙЛРÑохранÑÑ‚ÑŒ протокол работы в файл\n"
+
+#: help.c:106
+msgid ""
+" -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr ""
+" -n, --no-readline отключить редактор командной Ñтроки readline\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr ""
+" -o, --output=ИМЯ_ФÐЙЛРнаправить результаты запроÑа в файл (или канал "
+"|)\n"
+
+#: help.c:108
+msgid ""
+" -q, --quiet run quietly (no messages, only query output)\n"
+msgstr ""
+" -q, --quiet показывать только результаты запроÑов, без "
+"Ñообщений\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr ""
+" -s, --single-step пошаговый режим (подтверждение каждого запроÑа)\n"
+
+#: help.c:110
+msgid ""
+" -S, --single-line single-line mode (end of line terminates SQL "
+"command)\n"
+msgstr ""
+" -S, --single-line одноÑтрочный режим (конец Ñтроки завершает "
+"команду)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Параметры вывода:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align режим вывода невыровненной таблицы\n"
+
+#: help.c:114
+msgid ""
+" --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr ""
+" --csv режим вывода в формате CSV (значениÑ, "
+"разделённые\n"
+" запÑтыми)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: "
+"\"%s\")\n"
+msgstr ""
+" -F, --field-separator=СТРОКÐ\n"
+" разделителей полей при невыровненном выводе\n"
+" (по умолчанию: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html вывод таблицы в формате HTML\n"
+
+#: help.c:119
+msgid ""
+" -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset "
+"command)\n"
+msgstr ""
+" -P, --pset=ПÐР[=ЗÐÐЧ] определить параметр печати ПÐР (Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ "
+"ЗÐÐЧЕÐИЕМ)\n"
+" (Ñм. опиÑание \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: "
+"newline)\n"
+msgstr ""
+" -R, --record-separator=СТРОКÐ\n"
+" разделитель запиÑей при невыровненном выводе\n"
+" (по умолчанию: Ð½Ð¾Ð²Ð°Ñ Ñтрока)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only выводить только кортежи\n"
+
+#: help.c:123
+msgid ""
+" -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, "
+"border)\n"
+msgstr ""
+" -T, --table-attr=ТЕКСТ уÑтановить атрибуты HTML-таблицы (width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded включить развёрнутый вывод таблицы\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" Ñделать разделителем полей при невыровненном\n"
+" выводе нулевой байт\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero "
+"byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" Ñделать разделителем запиÑей при невыровненном\n"
+" нулевой байт\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключениÑ:\n"
+
+#: help.c:133
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory "
+"(default: \"%s\")\n"
+msgstr ""
+" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n"
+" (по умолчанию: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "локальный Ñокет"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr ""
+" -p, --port=ПОРТ порт Ñервера баз данных (по умолчанию: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (по умолчанию: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: help.c:143
+msgid ""
+" -W, --password force password prompt (should happen "
+"automatically)\n"
+msgstr ""
+" -W, --password запрашивать пароль вÑегда (обычно не требуетÑÑ)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or "
+"\"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Чтобы узнать больше, введите \"\\?\" (ÑпиÑок внутренних команд) или "
+"\"\\help\"\n"
+"(Ñправка по операторам SQL) в psql, либо обратитеÑÑŒ к разделу psql в\n"
+"документации PostgreSQL.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Общие\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [ПÐРÐМЕТР]... задать параметры запроÑа\n"
+
+# skip-rule: copyright
+#: help.c:193
+msgid ""
+" \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr ""
+" \\copyright уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ раÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ "
+"PostgreSQL\n"
+
+#: help.c:194
+msgid ""
+" \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr ""
+" \\crosstabview [СТОЛБЦЫ] выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸ вывеÑти результат в "
+"перекрёÑтном виде\n"
+
+#: help.c:195
+msgid ""
+" \\errverbose show most recent error message at maximum "
+"verbosity\n"
+msgstr ""
+" \\errverbose вывеÑти макÑимально подробное Ñообщение о "
+"поÑледней ошибке\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(ПÐРÐМЕТРЫ)] [ФÐЙЛ] выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ (и направить результат в файл\n"
+" или канал |); \\g без аргументов равнозначно \";"
+"\"\n"
+
+#: help.c:198
+msgid ""
+" \\gdesc describe result of query, without executing it\n"
+msgstr ""
+" \\gdesc опиÑать результат запроÑа, но не выполнÑÑ‚ÑŒ его\n"
+
+#: help.c:199
+msgid ""
+" \\gexec execute query, then execute each value in its "
+"result\n"
+msgstr ""
+" \\gexec выполнить запроÑ, а затем выполнить каждую Ñтроку "
+"в результате\n"
+
+#: help.c:200
+msgid ""
+" \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr ""
+" \\gset [ПРЕФИКС] выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸ Ñохранить результат в "
+"переменных\n"
+" psql\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr ""
+" \\gx [(ПÐРÐМЕТРЫ)] [ФÐЙЛ] то же, что \\g, но в режиме развёрнутого вывода\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q выйти из psql\n"
+
+#: help.c:203
+msgid ""
+" \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr ""
+" \\watch [[i=]СЕК] [c=N] повторÑÑ‚ÑŒ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‡ÐµÑ€ÐµÐ· заданное чиÑло Ñекунд, не\n"
+" более N раз\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Справка\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] Ñправка по командам psql c \\\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr ""
+" \\? options Ñправка по параметрам командной Ñтроки psql\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables Ñправка по Ñпециальным переменным\n"
+
+#: help.c:211
+msgid ""
+" \\h [NAME] help on syntax of SQL commands, * for all "
+"commands\n"
+msgstr ""
+" \\h [ИМЯ] Ñправка по заданному SQL-оператору; * - по вÑем\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Буфер запроÑа\n"
+
+#: help.c:215
+msgid ""
+" \\e [FILE] [LINE] edit the query buffer (or file) with external "
+"editor\n"
+msgstr ""
+" \\e [ФÐЙЛ] [СТРОКÐ] править буфер запроÑа (или файл) во внешнем "
+"редакторе\n"
+
+#: help.c:216
+msgid ""
+" \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr ""
+" \\ef [ФУÐКЦИЯ [СТРОКÐ]] править определение функции во внешнем редакторе\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr ""
+" \\ev [VIEWNAME [LINE]] править определение предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¾ внешнем "
+"редакторе\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p вывеÑти Ñодержимое буфера запроÑов\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r очиÑтить буфер запроÑа\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [ФÐЙЛ] вывеÑти иÑторию или Ñохранить её в файл\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w ФÐЙЛ запиÑать буфер запроÑа в файл\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "Ввод/Вывод\n"
+
+#: help.c:227
+msgid ""
+" \\copy ... perform SQL COPY with data stream to the client "
+"host\n"
+msgstr " \\copy ... выполнить SQL COPY на Ñтороне клиента\n"
+
+#: help.c:228
+msgid ""
+" \\echo [-n] [STRING] write string to standard output (-n for no "
+"newline)\n"
+msgstr ""
+" \\echo [-n] [СТРОКÐ] запиÑать Ñтроку в поток Ñтандартного вывода\n"
+" (-n отключает перевод Ñтроки)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i ФÐЙЛ выполнить команды из файла\n"
+
+#: help.c:230
+msgid ""
+" \\ir FILE as \\i, but relative to location of current "
+"script\n"
+msgstr ""
+" \\ir ФÐЙЛ подобно \\i, но путь задаётÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно\n"
+" текущего Ñкрипта\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr ""
+" \\o [ФÐЙЛ] выводить вÑе результаты запроÑов в файл или канал "
+"|\n"
+
+#: help.c:232
+msgid ""
+" \\qecho [-n] [STRING] write string to \\o output stream (-n for no "
+"newline)\n"
+msgstr ""
+" \\qecho [-n] [СТРОКÐ] запиÑать Ñтроку в выходной поток \\o\n"
+" (-n отключает перевод Ñтроки)\n"
+
+#: help.c:233
+msgid ""
+" \\warn [-n] [STRING] write string to standard error (-n for no "
+"newline)\n"
+msgstr ""
+" \\warn [-n] [СТРОКÐ] запиÑать Ñтроку в поток вывода ошибок\n"
+" (-n отключает перевод Ñтроки)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "УÑловиÑ\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if ВЫРÐЖЕÐИЕ начало блока уÑловиÑ\n"
+
+#: help.c:238
+msgid ""
+" \\elif EXPR alternative within current conditional block\n"
+msgstr ""
+" \\elif ВЫРÐЖЕÐИЕ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ в текущем блоке уÑловиÑ\n"
+
+#: help.c:239
+msgid ""
+" \\else final alternative within current conditional "
+"block\n"
+msgstr ""
+" \\else Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ в текущем блоке уÑловиÑ\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif конец блока уÑловиÑ\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Информационные\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr ""
+" (дополнениÑ: S = показывать ÑиÑтемные объекты, + = дополнительные "
+"подробноÑти)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr ""
+" \\d[S+] ÑпиÑок таблиц, предÑтавлений и "
+"поÑледовательноÑтей\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr ""
+" \\d[S+] ИМЯ опиÑание таблицы, предÑтавлениÑ, "
+"поÑледовательноÑти\n"
+" или индекÑа\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [ÐœÐСКÐ] ÑпиÑок агрегатных функций\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [ÐœÐСКÐ] ÑпиÑок методов доÑтупа\n"
+
+# well-spelled: МСК
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [МСК_МД [МСК_ТИПÐ]] ÑпиÑок клаÑÑов операторов\n"
+
+# well-spelled: МСК
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [МСК_МД [МСК_ТИПÐ]] ÑпиÑок ÑемейÑтв операторов\n"
+
+# well-spelled: МСК
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr ""
+" \\dAo[+] [МСК_МД [МСК_СОП]] ÑпиÑок операторов из ÑемейÑтв операторов\n"
+
+# well-spelled: МСК
+#: help.c:252
+msgid ""
+" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [МСК_МД [МСК_СОП]] ÑпиÑок опорных функций из ÑемейÑтв\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [ÐœÐСКÐ] ÑпиÑок табличных проÑтранÑтв\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [ÐœÐСКÐ] ÑпиÑок преобразований\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [ÐœÐСКÐ] ÑпиÑок параметров конфигурации\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [ÐœÐСКÐ] ÑпиÑок приведений типов\n"
+
+#: help.c:257
+msgid ""
+" \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr ""
+" \\dd[S] [ÐœÐСКÐ] опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð², не выводимые в других режимах\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [ÐœÐСКÐ] ÑпиÑок доменов\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [ÐœÐСКÐ] ÑпиÑок прав по умолчанию\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [ÐœÐСКÐ] ÑпиÑок Ñторонних таблиц\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [ÐœÐСКÐ] ÑпиÑок Ñторонних Ñерверов\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [ÐœÐСКÐ] ÑпиÑок Ñторонних таблиц\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [ÐœÐСКÐ] ÑпиÑок ÑопоÑтавлений пользователей\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [ÐœÐСКÐ] ÑпиÑок обёрток Ñторонних данных\n"
+
+# well-spelled: МСК, ФУÐК
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] "
+"functions\n"
+msgstr ""
+" \\df[anptw][S+] [МСК_ФУÐК [МСК_ТИПР...]]\n"
+" ÑпиÑок функций [только агрегатных/обычных/процедур/"
+"триггеров/оконных]\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [ÐœÐСКÐ] ÑпиÑок конфигураций текÑтового поиÑка\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [ÐœÐСКÐ] ÑпиÑок Ñловарей текÑтового поиÑка\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [ÐœÐСКÐ] ÑпиÑок анализаторов текÑтового поиÑка\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [ÐœÐСКÐ] ÑпиÑок шаблонов текÑтового поиÑка\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [ÐœÐСКÐ] ÑпиÑок ролей\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [ÐœÐСКÐ] ÑпиÑок индекÑов\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr ""
+" \\dl[+] ÑпиÑок больших объектов (то же, что и \\lo_list)\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [ÐœÐСКÐ] ÑпиÑок Ñзыков процедур\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [ÐœÐСКÐ] ÑпиÑок материализованных предÑтавлений\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [ÐœÐСКÐ] ÑпиÑок Ñхем\n"
+
+# well-spelled: МСК
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [МСК_ОП [МСК_ТИПР[МСК_ТИПÐ]]]\n"
+" ÑпиÑок операторов\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [ÐœÐСКÐ] ÑпиÑок правил Ñортировки\n"
+
+#: help.c:280
+msgid ""
+" \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr ""
+" \\dp[S] [ÐœÐСКÐ] ÑпиÑок прав доÑтупа к таблицам, предÑтавлениÑм и\n"
+" поÑледовательноÑÑ‚Ñм\n"
+
+#: help.c:281
+msgid ""
+" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations "
+"[n=nested]\n"
+msgstr ""
+" \\dP[itn+] [ÐœÐСКÐ] ÑпиÑок Ñекционированных отношений\n"
+" [только индекÑов (i)/таблиц (t)], Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ñтью "
+"(n)\n"
+
+# well-spelled: МСК
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [МСК_РОЛИ [МСК_БД]] ÑпиÑок параметров роли на уровне БД\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [ÐœÐСКÐ] ÑпиÑок назначений ролей\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [ÐœÐСКÐ] ÑпиÑок публикаций Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [ÐœÐСКÐ] ÑпиÑок подпиÑок на репликацию\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [ÐœÐСКÐ] ÑпиÑок поÑледовательноÑтей\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [ÐœÐСКÐ] ÑпиÑок таблиц\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [ÐœÐСКÐ] ÑпиÑок типов данных\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [ÐœÐСКÐ] ÑпиÑок ролей\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [ÐœÐСКÐ] ÑпиÑок предÑтавлений\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [ÐœÐСКÐ] ÑпиÑок раÑширений\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [ÐœÐСКÐ] ÑпиÑок раÑширенных ÑтатиÑтик\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [ÐœÐСКÐ] ÑпиÑок Ñобытийных триггеров\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [ÐœÐСКÐ] ÑпиÑок баз данных\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] ИМЯ_ФУÐКЦИИ показать определение функции\n"
+
+# well-spelled: ПРЕДСТ
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] ИМЯ_ПРЕДСТ показать определение предÑтавлениÑ\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [ÐœÐСКÐ] то же, что и \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Большие объекты\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export OID_БО ФÐЙЛ запиÑать большой объект в файл\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import ФÐЙЛ [КОММЕÐТÐРИЙ]\n"
+" прочитать большой объект из файла\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] ÑпиÑок больших объектов\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink OID_БО удалить большой объект\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "Форматирование\n"
+
+#: help.c:309
+msgid ""
+" \\a toggle between unaligned and aligned output mode\n"
+msgstr ""
+" \\a переключение режимов вывода:\n"
+" неформатированный/выровненный\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr ""
+" \\C [СТРОКÐ] задать заголовок таблицы или убрать, еÑли не "
+"задан\n"
+
+#: help.c:311
+msgid ""
+" \\f [STRING] show or set field separator for unaligned query "
+"output\n"
+msgstr ""
+" \\f [СТРОКÐ] показать или уÑтановить разделитель полей длÑ\n"
+" неформатированного вывода\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr ""
+" \\H переключить режим вывода в HTML (текущий: %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [ИМЯ [ЗÐÐЧЕÐИЕ]] уÑтановить параметр вывода таблицы\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] режим вывода только Ñтрок (ÑейчаÑ: %s)\n"
+
+#: help.c:323
+msgid ""
+" \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr ""
+" \\T [СТРОКÐ] задать атрибуты Ð´Ð»Ñ <table> или убрать, еÑли не "
+"заданы\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr ""
+" \\x [on|off|auto] переключить режим раÑширенного вывода (ÑейчаÑ: "
+"%s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "Соединение\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[БД|- ПОЛЬЗОВÐТЕЛЬ|- СЕРВЕР|- ПОРТ|-] | conninfo}\n"
+" подключитьÑÑ Ðº другой базе данных\n"
+" (текущаÑ: \"%s\")\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[БД|- ПОЛЬЗОВÐТЕЛЬ|- СЕРВЕР|- ПОРТ|-] | conninfo}\n"
+" подключитьÑÑ Ðº другой базе данных\n"
+" (ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚)\n"
+
+#: help.c:336
+msgid ""
+" \\conninfo display information about current connection\n"
+msgstr " \\conninfo Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ текущем Ñоединении\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [КОДИРОВКÐ] показать/уÑтановить клиентÑкую кодировку\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [ИМЯ] безопаÑно Ñменить пароль пользователÑ\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [ПУТЬ] Ñменить текущий каталог\n"
+
+# well-spelled: ОКР
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv ПЕР_PSQL ПЕР_ОКР прочитать переменную окружениÑ\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr ""
+" \\setenv ИМЯ [ЗÐÐЧЕÐИЕ] уÑтановить или ÑброÑить переменную окружениÑ\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] включить/выключить Ñекундомер (ÑейчаÑ: %s)\n"
+
+#: help.c:347
+msgid ""
+" \\! [COMMAND] execute command in shell or start interactive "
+"shell\n"
+msgstr ""
+" \\! [КОМÐÐДÐ] выполнить команду в командной оболочке\n"
+" или запуÑтить интерактивную оболочку\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Переменные\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr ""
+" \\prompt [ТЕКСТ] ИМЯ предложить пользователю задать внутреннюю "
+"переменную\n"
+
+#: help.c:352
+msgid ""
+" \\set [NAME [VALUE]] set internal variable, or list all if no "
+"parameters\n"
+msgstr ""
+" \\set [ИМЯ [ЗÐÐЧЕÐИЕ]] уÑтановить внутреннюю переменную или вывеÑти вÑе,\n"
+" еÑли Ð¸Ð¼Ñ Ð½Ðµ задано\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset ИМЯ ÑброÑить (удалить) внутреннюю переменную\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"СпиÑок Ñпециальных переменных\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "Переменные psql:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=ИМЯ=ЗÐÐЧЕÐИЕ\n"
+" или \\set ИМЯ ЗÐÐЧЕÐИЕ в приглашении psql\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" еÑли уÑтановлен, уÑпешные SQL-команды фикÑируютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" определÑет региÑÑ‚Ñ€ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов SQL\n"
+" [lower (нижний), upper (верхний),\n"
+" preserve-lower (ÑохранÑÑ‚ÑŒ нижний),\n"
+" preserve-upper (ÑохранÑÑ‚ÑŒ верхний)]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ подключённой базы данных\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" определÑет, что выдаётÑÑ Ð½Ð° Ñтандартный вывод\n"
+" [all (вÑÑ‘), errors (ошибки), none (ничего),\n"
+" queries (запроÑÑ‹)]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" еÑли включено, выводит внутренние запроÑÑ‹, порождаемые командами Ñ \\;\n"
+" еÑли уÑтановлено значение \"noexec\", они выводÑÑ‚ÑÑ, но не выполнÑÑŽÑ‚ÑÑ\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° клиентÑкого набора Ñимволов\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" \"true\" в Ñлучае ошибки в поÑледнем запроÑе, иначе — \"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = "
+"unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" чиÑло результирующих Ñтрок, извлекаемых и отображаемых за раз\n"
+" (0 = без ограничений)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" еÑли уÑтановлено, табличные методы доÑтупа не выводÑÑ‚ÑÑ\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" еÑли уÑтановлено, методы ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð½Ðµ выводÑÑ‚ÑÑ\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" управлÑет иÑторией команд [ignorespace (игнорировать пробелы),\n"
+" ignoredups (игнорировать дубли), ignoreboth (и то, и другое)]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, в котором будет ÑохранÑÑ‚ÑŒÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" макÑимальное чиÑло команд, ÑохранÑемых в иÑтории\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" Ñервер баз данных, к которому уÑтановлено подключение\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" количеÑтво EOF Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ ÑеанÑа\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" значение поÑледнего задейÑтвованного OID\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if "
+"none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" Ñообщение и код SQLSTATE поÑледней ошибки, либо пуÑÑ‚Ð°Ñ Ñтрока и "
+"\"00000\",\n"
+" еÑли ошибки не было\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" еÑли уÑтановлено, Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð½Ðµ прекращаетÑÑ Ð¿Ñ€Ð¸ ошибке\n"
+" (иÑпользуютÑÑ Ð½ÐµÑвные точки ÑохранениÑ)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" оÑтанавливать выполнение пакета команд поÑле ошибки\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" порт Ñервера Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑоединениÑ\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" уÑтанавливает Ñтандартное приглашение psql\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous "
+"line\n"
+msgstr ""
+" PROMPT2\n"
+" уÑтанавливает приглашение, которое выводитÑÑ Ð¿Ñ€Ð¸ переноÑе оператора\n"
+" на новую Ñтроку\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" уÑтанавливает приглашение Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" выводить минимум Ñообщений (как и Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" чиÑло Ñтрок, возвращённых или обработанных поÑледним SQL-запроÑом, либо "
+"0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" верÑÐ¸Ñ Ñервера (в коротком текÑтовом и чиÑловом формате)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" \"true\" в Ñлучае ошибки поÑледней команды оболочки, \"false\" в ином "
+"Ñлучае\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледней команды оболочки\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" выводить вÑе результаты объединённых запроÑов (\\;), а не только "
+"поÑледнего\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" управлÑет отображением полей контекÑта Ñообщений\n"
+" [never (не отображать никогда), errors (ошибки), always (вÑегда]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" еÑли уÑтановлено, конец Ñтроки завершает режим ввода SQL-команды\n"
+" (как и Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -S)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" пошаговый режим (как и Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE поÑледнего запроÑа или \"00000\", еÑли он выполнилÑÑ Ð±ÐµÐ· "
+"ошибок\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" текущий пользователь, подключённый к БД\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" управлÑет детализацией отчётов об ошибках [default (по умолчанию),\n"
+" verbose (подробно), terse (кратко), sqlstate (код ÑоÑтоÑниÑ)]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" верÑÐ¸Ñ psql (в развёрнутом, в коротком текÑтовом и в чиÑловом формате)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Параметры отображениÑ:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=ИМЯ[=ЗÐÐЧЕÐИЕ]\n"
+" или \\pset ИМЯ [ЗÐÐЧЕÐИЕ] в приглашении psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" Ñтиль границы (чиÑло)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" Ñ†ÐµÐ»ÐµÐ²Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñом\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (или x)\n"
+" раÑширенный вывод [on (вкл.), off (выкл.), auto (авто)]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" разделитель полей Ð´Ð»Ñ Ð½ÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ вывода (по умолчанию \"%s\")\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" уÑтанавливает ноль разделителем полей при неформатированном выводе\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" включает или выключает вывод подпиÑей таблицы [on (вкл.), off (выкл.)]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" уÑтанавливает формат вывода [unaligned (неформатированный),\n"
+"\n"
+" aligned (выровненный), wrapped (Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñом), html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" задаёт Ñтиль риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¹ границы [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" уÑтанавливает Ñтроку, выводимую вмеÑто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of "
+"digits\n"
+msgstr ""
+" numericlocale\n"
+" отключает вывод заданного локалью Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ цифр\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" определÑет, иÑпользуетÑÑ Ð»Ð¸ внешний поÑтраничник\n"
+" [yes (да), no (нет), always (вÑегда)]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" разделитель запиÑей (Ñтрок) при неформатированном выводе\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" уÑтанавливает ноль разделителем запиÑей при неформатированном выводе\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (или T)\n"
+" задаёт атрибуты Ð´Ð»Ñ Ñ‚ÐµÐ³Ð° table в формате html или пропорциональные\n"
+" ширины Ñтолбцов Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð¾Ð²Ð½ÐµÐ½Ð½Ñ‹Ñ… влево данных, в формате latex-longtable\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" задаёт заголовок таблицы Ð´Ð»Ñ Ð¿Ð¾Ñледовательно печатаемых таблиц\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" еÑли уÑтановлено, выводÑÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ непоÑредÑтвенно табличные данные\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" задаёт Ñтиль риÑуемых линий Unicode [single (одинарные), double "
+"(двойные)]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Переменные окружениÑ:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" ИМЯ=ЗÐÐЧЕÐИЕ [ИМЯ=ЗÐÐЧЕÐИЕ] psql ...\n"
+" или \\setenv ИМЯ [ЗÐÐЧЕÐИЕ] в приглашении psql\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set ИМЯ=ЗÐÐЧЕÐИЕ\n"
+" psql ...\n"
+" или \\setenv ИМЯ ЗÐÐЧЕÐИЕ в приглашении psql\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" чиÑло Ñтолбцов Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñом\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ application_name\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ dbname\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ host\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" пароль Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (иÑпользовать не рекомендуетÑÑ)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ port\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ user\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" редактор, вызываемый командами \\e, \\ef и \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" определÑет ÑпоÑоб передачи номера Ñтроки при вызове редактора\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" альтернативное размещение файла Ñ Ð¸Ñторией команд\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ внешнего поÑтраничника\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ внешнего поÑтраничника Ð´Ð»Ñ \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" альтернативное размещение пользовательÑкого файла .psqlrc\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" оболочка, Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" каталог Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… файлов\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "ИмеющаÑÑÑ Ñправка:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Команда: %s\n"
+"ОпиÑание: %s\n"
+"СинтакÑиÑ:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Ðет Ñправки по команде \"%s\".\n"
+"Попробуйте \\h без аргументов и поÑмотрите, что еÑÑ‚ÑŒ.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не удалоÑÑŒ прочитать входной файл: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "не удалоÑÑŒ Ñохранить иÑторию в файле \"%s\": %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "в данной Ñреде иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ поддерживаетÑÑ"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: нет ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ð°Ð·Ð¾Ð¹ данных"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½Ð°"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: неизвеÑтное ÑоÑтоÑние транзакции"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "выход из блока \\if"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Чтобы выйти из %s, введите \"\\q\".\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Результат выдаётÑÑ Ð² Ñпециальном формате выгрузки PostgreSQL.\n"
+"Чтобы воÑÑтановить базу данных из Ñтого формата, воÑпользуйтеÑÑŒ программой "
+"командной Ñтроки pg_restore.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr ""
+"Введите \\? Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки или нажмите Control-C Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки буфера "
+"ввода."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Введите \\? Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Ð’Ñ‹ иÑпользуете psql - Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñтроки к PostgreSQL."
+
+# skip-rule: copyright
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Ðзы: \\copyright - уÑÐ»Ð¾Ð²Ð¸Ñ Ñ€Ð°ÑпроÑтранениÑ\n"
+" \\h - Ñправка по операторам SQL\n"
+" \\? - Ñправка по командам psql\n"
+" \\g или ; в конце Ñтроки - выполнение запроÑа\n"
+" \\q - выход\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Введите \\q Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Ðажмите Control-D Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Ðажмите Control-C Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð°."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr ""
+"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÐµÑ‚ÑÑ; добавьте \\endif или нажмите Ctrl-C Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ "
+"текущего блока \\if"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "в закончившемÑÑ Ð¿Ð¾Ñ‚Ð¾ÐºÐµ команд не хватает \\endif"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока в кавычках"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: нехватка памÑти"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1307 sql_help.c:1309
+#: sql_help.c:1312 sql_help.c:1315 sql_help.c:1317 sql_help.c:1319
+#: sql_help.c:1322 sql_help.c:1325 sql_help.c:1442 sql_help.c:1444
+#: sql_help.c:1446 sql_help.c:1449 sql_help.c:1470 sql_help.c:1473
+#: sql_help.c:1476 sql_help.c:1479 sql_help.c:1483 sql_help.c:1485
+#: sql_help.c:1487 sql_help.c:1489 sql_help.c:1503 sql_help.c:1506
+#: sql_help.c:1508 sql_help.c:1510 sql_help.c:1520 sql_help.c:1522
+#: sql_help.c:1532 sql_help.c:1534 sql_help.c:1544 sql_help.c:1547
+#: sql_help.c:1570 sql_help.c:1572 sql_help.c:1574 sql_help.c:1576
+#: sql_help.c:1579 sql_help.c:1581 sql_help.c:1584 sql_help.c:1587
+#: sql_help.c:1638 sql_help.c:1681 sql_help.c:1684 sql_help.c:1686
+#: sql_help.c:1688 sql_help.c:1691 sql_help.c:1693 sql_help.c:1695
+#: sql_help.c:1698 sql_help.c:1750 sql_help.c:1766 sql_help.c:1999
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2100 sql_help.c:2158
+#: sql_help.c:2166 sql_help.c:2176 sql_help.c:2203 sql_help.c:2235
+#: sql_help.c:2253 sql_help.c:2281 sql_help.c:2392 sql_help.c:2438
+#: sql_help.c:2463 sql_help.c:2486 sql_help.c:2490 sql_help.c:2524
+#: sql_help.c:2544 sql_help.c:2566 sql_help.c:2580 sql_help.c:2601
+#: sql_help.c:2630 sql_help.c:2665 sql_help.c:2690 sql_help.c:2737
+#: sql_help.c:3032 sql_help.c:3045 sql_help.c:3062 sql_help.c:3078
+#: sql_help.c:3118 sql_help.c:3172 sql_help.c:3176 sql_help.c:3178
+#: sql_help.c:3185 sql_help.c:3204 sql_help.c:3231 sql_help.c:3266
+#: sql_help.c:3278 sql_help.c:3287 sql_help.c:3331 sql_help.c:3345
+#: sql_help.c:3373 sql_help.c:3381 sql_help.c:3393 sql_help.c:3403
+#: sql_help.c:3411 sql_help.c:3419 sql_help.c:3427 sql_help.c:3435
+#: sql_help.c:3444 sql_help.c:3455 sql_help.c:3463 sql_help.c:3471
+#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3497 sql_help.c:3506
+#: sql_help.c:3515 sql_help.c:3523 sql_help.c:3533 sql_help.c:3544
+#: sql_help.c:3552 sql_help.c:3561 sql_help.c:3572 sql_help.c:3581
+#: sql_help.c:3589 sql_help.c:3597 sql_help.c:3605 sql_help.c:3613
+#: sql_help.c:3621 sql_help.c:3629 sql_help.c:3637 sql_help.c:3645
+#: sql_help.c:3653 sql_help.c:3661 sql_help.c:3678 sql_help.c:3687
+#: sql_help.c:3695 sql_help.c:3712 sql_help.c:3727 sql_help.c:4039
+#: sql_help.c:4149 sql_help.c:4178 sql_help.c:4194 sql_help.c:4196
+#: sql_help.c:4699 sql_help.c:4747 sql_help.c:4905
+msgid "name"
+msgstr "имÑ"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1847
+#: sql_help.c:3346 sql_help.c:4467
+msgid "aggregate_signature"
+msgstr "Ñигнатура_агр_функции"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1316 sql_help.c:1443
+#: sql_help.c:1486 sql_help.c:1507 sql_help.c:1521 sql_help.c:1533
+#: sql_help.c:1546 sql_help.c:1573 sql_help.c:1639 sql_help.c:1692
+msgid "new_name"
+msgstr "новое_имÑ"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1380 sql_help.c:1445 sql_help.c:1488 sql_help.c:1509
+#: sql_help.c:1571 sql_help.c:1687 sql_help.c:3018
+msgid "new_owner"
+msgstr "новый_владелец"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1318 sql_help.c:1490 sql_help.c:1511
+#: sql_help.c:1523 sql_help.c:1535 sql_help.c:1575 sql_help.c:1694
+msgid "new_schema"
+msgstr "новаÑ_Ñхема"
+
+#: sql_help.c:44 sql_help.c:1911 sql_help.c:3347 sql_help.c:4496
+msgid "where aggregate_signature is:"
+msgstr "где Ñигнатура_агр_функции:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2069 sql_help.c:2088
+#: sql_help.c:2091 sql_help.c:2393 sql_help.c:2602 sql_help.c:3348
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3445 sql_help.c:3534
+#: sql_help.c:3562 sql_help.c:3914 sql_help.c:4366 sql_help.c:4473
+#: sql_help.c:4480 sql_help.c:4486 sql_help.c:4497 sql_help.c:4500
+#: sql_help.c:4503
+msgid "argmode"
+msgstr "режим_аргумента"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:4474 sql_help.c:4481 sql_help.c:4487
+#: sql_help.c:4498 sql_help.c:4501 sql_help.c:4504
+msgid "argname"
+msgstr "имÑ_аргумента"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2395 sql_help.c:2604
+#: sql_help.c:3350 sql_help.c:3353 sql_help.c:3356 sql_help.c:3447
+#: sql_help.c:3536 sql_help.c:3564 sql_help.c:4475 sql_help.c:4482
+#: sql_help.c:4488 sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argtype"
+msgstr "тип_аргумента"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1504 sql_help.c:1633 sql_help.c:1665
+#: sql_help.c:1718 sql_help.c:1782 sql_help.c:1969 sql_help.c:1976
+#: sql_help.c:2284 sql_help.c:2334 sql_help.c:2341 sql_help.c:2350
+#: sql_help.c:2439 sql_help.c:2666 sql_help.c:2759 sql_help.c:3047
+#: sql_help.c:3232 sql_help.c:3254 sql_help.c:3394 sql_help.c:3750
+#: sql_help.c:3958 sql_help.c:4193 sql_help.c:4195 sql_help.c:4972
+msgid "option"
+msgstr "параметр"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1634 sql_help.c:2440
+#: sql_help.c:2667 sql_help.c:3233 sql_help.c:3395
+msgid "where option can be:"
+msgstr "где допуÑтимые параметры:"
+
+#: sql_help.c:116 sql_help.c:2216
+msgid "allowconn"
+msgstr "разр_подключениÑ"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1635 sql_help.c:2217
+#: sql_help.c:2441 sql_help.c:2668 sql_help.c:3234
+msgid "connlimit"
+msgstr "предел_подключений"
+
+#: sql_help.c:118 sql_help.c:2218
+msgid "istemplate"
+msgstr "Ñто_шаблон"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1321
+#: sql_help.c:1373 sql_help.c:4199
+msgid "new_tablespace"
+msgstr "новое_табл_проÑтранÑтво"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1182 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:2405 sql_help.c:2608
+#: sql_help.c:3926 sql_help.c:4217 sql_help.c:4378 sql_help.c:4687
+msgid "configuration_parameter"
+msgstr "параметр_конфигурации"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1352
+#: sql_help.c:1375 sql_help.c:1423 sql_help.c:1448 sql_help.c:1505
+#: sql_help.c:1589 sql_help.c:1643 sql_help.c:1666 sql_help.c:2285
+#: sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 sql_help.c:2406
+#: sql_help.c:2407 sql_help.c:2471 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2609 sql_help.c:2610 sql_help.c:2633 sql_help.c:2760
+#: sql_help.c:2799 sql_help.c:2909 sql_help.c:2922 sql_help.c:2936
+#: sql_help.c:2977 sql_help.c:3004 sql_help.c:3021 sql_help.c:3048
+#: sql_help.c:3255 sql_help.c:3959 sql_help.c:4688 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691
+msgid "value"
+msgstr "значение"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "целеваÑ_роль"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2269 sql_help.c:2638
+#: sql_help.c:2715 sql_help.c:2720 sql_help.c:3889 sql_help.c:3898
+#: sql_help.c:3917 sql_help.c:3929 sql_help.c:4341 sql_help.c:4350
+#: sql_help.c:4369 sql_help.c:4381
+msgid "schema_name"
+msgstr "имÑ_Ñхемы"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "предложение_GRANT_или_REVOKE"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "где допуÑтимое предложение_GRANT_или_REVOKE:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1320 sql_help.c:1653 sql_help.c:2444 sql_help.c:2445
+#: sql_help.c:2446 sql_help.c:2447 sql_help.c:2448 sql_help.c:2582
+#: sql_help.c:2671 sql_help.c:2672 sql_help.c:2673 sql_help.c:2674
+#: sql_help.c:2675 sql_help.c:3237 sql_help.c:3238 sql_help.c:3239
+#: sql_help.c:3240 sql_help.c:3241 sql_help.c:3938 sql_help.c:3942
+#: sql_help.c:4390 sql_help.c:4394 sql_help.c:4709
+msgid "role_name"
+msgstr "имÑ_роли"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1336 sql_help.c:1338
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1427 sql_help.c:1683
+#: sql_help.c:2238 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2467 sql_help.c:2637 sql_help.c:2776 sql_help.c:2781
+#: sql_help.c:2783 sql_help.c:2904 sql_help.c:2917 sql_help.c:2931
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:2981 sql_help.c:3990
+#: sql_help.c:4005 sql_help.c:4007 sql_help.c:4094 sql_help.c:4097
+#: sql_help.c:4099 sql_help.c:4560 sql_help.c:4561 sql_help.c:4570
+#: sql_help.c:4617 sql_help.c:4618 sql_help.c:4619 sql_help.c:4620
+#: sql_help.c:4621 sql_help.c:4622 sql_help.c:4662 sql_help.c:4663
+#: sql_help.c:4668 sql_help.c:4673 sql_help.c:4817 sql_help.c:4818
+#: sql_help.c:4827 sql_help.c:4874 sql_help.c:4875 sql_help.c:4876
+#: sql_help.c:4877 sql_help.c:4878 sql_help.c:4879 sql_help.c:4933
+#: sql_help.c:4935 sql_help.c:5003 sql_help.c:5063 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5120 sql_help.c:5121 sql_help.c:5122
+#: sql_help.c:5123 sql_help.c:5124 sql_help.c:5125
+msgid "expression"
+msgstr "выражение"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "ограничение_домена"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1313 sql_help.c:1360 sql_help.c:1361 sql_help.c:1362
+#: sql_help.c:1389 sql_help.c:1401 sql_help.c:1418 sql_help.c:1853
+#: sql_help.c:1855 sql_help.c:2241 sql_help.c:2353 sql_help.c:2358
+#: sql_help.c:2939 sql_help.c:2951 sql_help.c:4002
+msgid "constraint_name"
+msgstr "имÑ_ограничениÑ"
+
+#: sql_help.c:247 sql_help.c:1314
+msgid "new_constraint_name"
+msgstr "имÑ_нового_ограничениÑ"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "новаÑ_верÑиÑ"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "Ñлемент_объект"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "где Ñлемент_объект:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1845 sql_help.c:1850 sql_help.c:1857
+#: sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 sql_help.c:1861
+#: sql_help.c:1862 sql_help.c:1863 sql_help.c:1868 sql_help.c:1870
+#: sql_help.c:1874 sql_help.c:1876 sql_help.c:1880 sql_help.c:1885
+#: sql_help.c:1886 sql_help.c:1893 sql_help.c:1894 sql_help.c:1895
+#: sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 sql_help.c:1899
+#: sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 sql_help.c:1903
+#: sql_help.c:1908 sql_help.c:1909 sql_help.c:4463 sql_help.c:4468
+#: sql_help.c:4469 sql_help.c:4470 sql_help.c:4471 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4483 sql_help.c:4484 sql_help.c:4489
+#: sql_help.c:4490 sql_help.c:4491 sql_help.c:4492 sql_help.c:4493
+#: sql_help.c:4494
+msgid "object_name"
+msgstr "имÑ_объекта"
+
+# well-spelled: агр
+#: sql_help.c:329 sql_help.c:1846 sql_help.c:4466
+msgid "aggregate_name"
+msgstr "имÑ_агр_функции"
+
+#: sql_help.c:331 sql_help.c:1848 sql_help.c:2134 sql_help.c:2138
+#: sql_help.c:2140 sql_help.c:3364
+msgid "source_type"
+msgstr "иÑходный_тип"
+
+#: sql_help.c:332 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "target_type"
+msgstr "целевой_тип"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1864 sql_help.c:2136
+#: sql_help.c:2179 sql_help.c:2257 sql_help.c:2525 sql_help.c:2556
+#: sql_help.c:3124 sql_help.c:4365 sql_help.c:4472 sql_help.c:4589
+#: sql_help.c:4593 sql_help.c:4597 sql_help.c:4600 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4854 sql_help.c:4857 sql_help.c:5092
+#: sql_help.c:5096 sql_help.c:5100 sql_help.c:5103
+msgid "function_name"
+msgstr "имÑ_функции"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1871 sql_help.c:2549
+msgid "operator_name"
+msgstr "имÑ_оператора"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1872
+#: sql_help.c:2526 sql_help.c:3488
+msgid "left_type"
+msgstr "тип_Ñлева"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "right_type"
+msgstr "тип_Ñправа"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1407 sql_help.c:1875 sql_help.c:1877 sql_help.c:2546
+#: sql_help.c:2567 sql_help.c:2957 sql_help.c:3498 sql_help.c:3507
+msgid "index_method"
+msgstr "метод_индекÑа"
+
+#: sql_help.c:352 sql_help.c:1881 sql_help.c:4479
+msgid "procedure_name"
+msgstr "имÑ_процедуры"
+
+#: sql_help.c:356 sql_help.c:1887 sql_help.c:3913 sql_help.c:4485
+msgid "routine_name"
+msgstr "имÑ_подпрограммы"
+
+#: sql_help.c:368 sql_help.c:1379 sql_help.c:1904 sql_help.c:2401
+#: sql_help.c:2607 sql_help.c:2912 sql_help.c:3091 sql_help.c:3669
+#: sql_help.c:3935 sql_help.c:4387
+msgid "type_name"
+msgstr "имÑ_типа"
+
+#: sql_help.c:369 sql_help.c:1905 sql_help.c:2400 sql_help.c:2606
+#: sql_help.c:3092 sql_help.c:3322 sql_help.c:3670 sql_help.c:3920
+#: sql_help.c:4372
+msgid "lang_name"
+msgstr "имÑ_Ñзыка"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "и Ñигнатура_агр_функции:"
+
+#: sql_help.c:395 sql_help.c:2001 sql_help.c:2282
+msgid "handler_function"
+msgstr "функциÑ_обработчик"
+
+#: sql_help.c:396 sql_help.c:2283
+msgid "validator_function"
+msgstr "функциÑ_проверки"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1308 sql_help.c:1580
+msgid "action"
+msgstr "дейÑтвие"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1310 sql_help.c:1328 sql_help.c:1332 sql_help.c:1333
+#: sql_help.c:1337 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341
+#: sql_help.c:1342 sql_help.c:1344 sql_help.c:1347 sql_help.c:1348
+#: sql_help.c:1350 sql_help.c:1353 sql_help.c:1355 sql_help.c:1356
+#: sql_help.c:1403 sql_help.c:1405 sql_help.c:1412 sql_help.c:1421
+#: sql_help.c:1426 sql_help.c:1430 sql_help.c:1431 sql_help.c:1682
+#: sql_help.c:1685 sql_help.c:1689 sql_help.c:1727 sql_help.c:1852
+#: sql_help.c:1966 sql_help.c:1972 sql_help.c:1986 sql_help.c:1987
+#: sql_help.c:1988 sql_help.c:2332 sql_help.c:2345 sql_help.c:2398
+#: sql_help.c:2466 sql_help.c:2472 sql_help.c:2505 sql_help.c:2636
+#: sql_help.c:2745 sql_help.c:2780 sql_help.c:2782 sql_help.c:2894
+#: sql_help.c:2903 sql_help.c:2913 sql_help.c:2916 sql_help.c:2926
+#: sql_help.c:2930 sql_help.c:2953 sql_help.c:2955 sql_help.c:2962
+#: sql_help.c:2975 sql_help.c:2980 sql_help.c:2984 sql_help.c:2985
+#: sql_help.c:3001 sql_help.c:3127 sql_help.c:3267 sql_help.c:3892
+#: sql_help.c:3893 sql_help.c:3989 sql_help.c:4004 sql_help.c:4006
+#: sql_help.c:4008 sql_help.c:4093 sql_help.c:4096 sql_help.c:4098
+#: sql_help.c:4344 sql_help.c:4345 sql_help.c:4465 sql_help.c:4626
+#: sql_help.c:4632 sql_help.c:4634 sql_help.c:4883 sql_help.c:4889
+#: sql_help.c:4891 sql_help.c:4932 sql_help.c:4934 sql_help.c:4936
+#: sql_help.c:4991 sql_help.c:5129 sql_help.c:5135 sql_help.c:5137
+msgid "column_name"
+msgstr "имÑ_Ñтолбца"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1311 sql_help.c:1690
+msgid "new_column_name"
+msgstr "новое_имÑ_Ñтолбца"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1327 sql_help.c:1590
+msgid "where action is one of:"
+msgstr "где допуÑтимое дейÑтвие:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1329
+#: sql_help.c:1334 sql_help.c:1592 sql_help.c:1596 sql_help.c:2236
+#: sql_help.c:2333 sql_help.c:2545 sql_help.c:2738 sql_help.c:2895
+#: sql_help.c:3174 sql_help.c:4150
+msgid "data_type"
+msgstr "тип_данных"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1330 sql_help.c:1335
+#: sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 sql_help.c:2336
+#: sql_help.c:2468 sql_help.c:2897 sql_help.c:2905 sql_help.c:2918
+#: sql_help.c:2932 sql_help.c:3175 sql_help.c:3181 sql_help.c:3999
+msgid "collation"
+msgstr "правило_Ñортировки"
+
+#: sql_help.c:456 sql_help.c:1331 sql_help.c:2337 sql_help.c:2346
+#: sql_help.c:2898 sql_help.c:2914 sql_help.c:2927
+msgid "column_constraint"
+msgstr "ограничение_Ñтолбца"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1349 sql_help.c:4985
+msgid "integer"
+msgstr "целое"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1351
+#: sql_help.c:1354
+msgid "attribute_option"
+msgstr "атрибут"
+
+#: sql_help.c:476 sql_help.c:1358 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "table_constraint"
+msgstr "ограничение_таблицы"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1363
+#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1366 sql_help.c:1906
+msgid "trigger_name"
+msgstr "имÑ_триггера"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1377 sql_help.c:1378
+#: sql_help.c:2339 sql_help.c:2344 sql_help.c:2902 sql_help.c:2925
+msgid "parent_table"
+msgstr "таблица_родитель"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1549 sql_help.c:2268
+msgid "extension_name"
+msgstr "имÑ_раÑширениÑ"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2402
+msgid "execution_cost"
+msgstr "ÑтоимоÑÑ‚ÑŒ_выполнениÑ"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2403
+msgid "result_rows"
+msgstr "Ñтрок_в_результате"
+
+#: sql_help.c:547 sql_help.c:2404
+msgid "support_function"
+msgstr "вÑпомогательнаÑ_функциÑ"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1632 sql_help.c:1640
+#: sql_help.c:1644 sql_help.c:1647 sql_help.c:1650 sql_help.c:2716
+#: sql_help.c:2718 sql_help.c:2721 sql_help.c:2722 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3895 sql_help.c:3896 sql_help.c:3899
+#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905
+#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911
+#: sql_help.c:3912 sql_help.c:3918 sql_help.c:3919 sql_help.c:3921
+#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927
+#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933
+#: sql_help.c:3934 sql_help.c:3936 sql_help.c:3937 sql_help.c:3939
+#: sql_help.c:3940 sql_help.c:4342 sql_help.c:4343 sql_help.c:4347
+#: sql_help.c:4348 sql_help.c:4351 sql_help.c:4352 sql_help.c:4354
+#: sql_help.c:4355 sql_help.c:4357 sql_help.c:4358 sql_help.c:4360
+#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 sql_help.c:4382
+#: sql_help.c:4383 sql_help.c:4385 sql_help.c:4386 sql_help.c:4388
+#: sql_help.c:4389 sql_help.c:4391 sql_help.c:4392
+msgid "role_specification"
+msgstr "указание_роли"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1663 sql_help.c:2204
+#: sql_help.c:2724 sql_help.c:3252 sql_help.c:3703 sql_help.c:4719
+msgid "user_name"
+msgstr "имÑ_пользователÑ"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1652 sql_help.c:2723
+#: sql_help.c:3941 sql_help.c:4393
+msgid "where role_specification can be:"
+msgstr "где допуÑтимое указание_роли:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "имÑ_группы"
+
+#: sql_help.c:596 sql_help.c:1424 sql_help.c:2215 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2910 sql_help.c:2923 sql_help.c:2937
+#: sql_help.c:2978 sql_help.c:3005 sql_help.c:3017 sql_help.c:3932
+#: sql_help.c:4384
+msgid "tablespace_name"
+msgstr "табл_проÑтранÑтво"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1371 sql_help.c:1381
+#: sql_help.c:1419 sql_help.c:1781 sql_help.c:1784
+msgid "index_name"
+msgstr "имÑ_индекÑа"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1374
+#: sql_help.c:1376 sql_help.c:1422 sql_help.c:2473 sql_help.c:2507
+#: sql_help.c:2908 sql_help.c:2921 sql_help.c:2935 sql_help.c:2976
+#: sql_help.c:3003
+msgid "storage_parameter"
+msgstr "параметр_хранениÑ"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "номер_Ñтолбца"
+
+#: sql_help.c:631 sql_help.c:1869 sql_help.c:4476
+msgid "large_object_oid"
+msgstr "oid_большого_объекта"
+
+#: sql_help.c:690 sql_help.c:1357 sql_help.c:2896
+msgid "compression_method"
+msgstr "метод_ÑжатиÑ"
+
+#: sql_help.c:692 sql_help.c:1372
+msgid "new_access_method"
+msgstr "новый_метод_доÑтупа"
+
+#: sql_help.c:725 sql_help.c:2530
+msgid "res_proc"
+msgstr "процедура_ограничениÑ"
+
+#: sql_help.c:726 sql_help.c:2531
+msgid "join_proc"
+msgstr "процедура_ÑоединениÑ"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2548
+msgid "strategy_number"
+msgstr "номер_Ñтратегии"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2550 sql_help.c:2551
+#: sql_help.c:2554 sql_help.c:2555
+msgid "op_type"
+msgstr "тип_операции"
+
+#: sql_help.c:782 sql_help.c:2552
+msgid "sort_family_name"
+msgstr "ÑемейÑтво_Ñортировки"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2553
+msgid "support_number"
+msgstr "номер_опорной_процедуры"
+
+#: sql_help.c:787 sql_help.c:2137 sql_help.c:2557 sql_help.c:3094
+#: sql_help.c:3096
+msgid "argument_type"
+msgstr "тип_аргумента"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1726 sql_help.c:1780
+#: sql_help.c:1783 sql_help.c:1854 sql_help.c:1879 sql_help.c:1892
+#: sql_help.c:1907 sql_help.c:1965 sql_help.c:1971 sql_help.c:2331
+#: sql_help.c:2343 sql_help.c:2464 sql_help.c:2504 sql_help.c:2581
+#: sql_help.c:2635 sql_help.c:2692 sql_help.c:2744 sql_help.c:2777
+#: sql_help.c:2784 sql_help.c:2893 sql_help.c:2911 sql_help.c:2924
+#: sql_help.c:3000 sql_help.c:3120 sql_help.c:3301 sql_help.c:3524
+#: sql_help.c:3573 sql_help.c:3679 sql_help.c:3888 sql_help.c:3894
+#: sql_help.c:3955 sql_help.c:3987 sql_help.c:4340 sql_help.c:4346
+#: sql_help.c:4464 sql_help.c:4575 sql_help.c:4577 sql_help.c:4639
+#: sql_help.c:4678 sql_help.c:4832 sql_help.c:4834 sql_help.c:4896
+#: sql_help.c:4930 sql_help.c:4990 sql_help.c:5078 sql_help.c:5080
+#: sql_help.c:5142
+msgid "table_name"
+msgstr "имÑ_таблицы"
+
+#: sql_help.c:823 sql_help.c:2583
+msgid "using_expression"
+msgstr "выражение_иÑпользованиÑ"
+
+#: sql_help.c:824 sql_help.c:2584
+msgid "check_expression"
+msgstr "выражение_проверки"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2631
+msgid "publication_object"
+msgstr "объект_публикации"
+
+#: sql_help.c:903 sql_help.c:2632
+msgid "publication_parameter"
+msgstr "параметр_публикации"
+
+#: sql_help.c:909 sql_help.c:2634
+msgid "where publication_object is one of:"
+msgstr "где объект_публикации:"
+
+#: sql_help.c:952 sql_help.c:1636 sql_help.c:2442 sql_help.c:2669
+#: sql_help.c:3235
+msgid "password"
+msgstr "пароль"
+
+#: sql_help.c:953 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:3901
+#: sql_help.c:4353
+msgid "database_name"
+msgstr "имÑ_БД"
+
+#: sql_help.c:1073 sql_help.c:2739
+msgid "increment"
+msgstr "шаг"
+
+#: sql_help.c:1074 sql_help.c:2740
+msgid "minvalue"
+msgstr "мин_значение"
+
+#: sql_help.c:1075 sql_help.c:2741
+msgid "maxvalue"
+msgstr "макÑ_значение"
+
+#: sql_help.c:1076 sql_help.c:2742 sql_help.c:4573 sql_help.c:4676
+#: sql_help.c:4830 sql_help.c:5007 sql_help.c:5076
+msgid "start"
+msgstr "начальное_значение"
+
+#: sql_help.c:1077 sql_help.c:1346
+msgid "restart"
+msgstr "значение_перезапуÑка"
+
+#: sql_help.c:1078 sql_help.c:2743
+msgid "cache"
+msgstr "кеш"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "новое_имÑ"
+
+#: sql_help.c:1142 sql_help.c:2796
+msgid "conninfo"
+msgstr "Ñтрока_подключениÑ"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2797
+msgid "publication_name"
+msgstr "имÑ_публикации"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "параметр_публикации"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "параметр_обновлениÑ"
+
+#: sql_help.c:1161 sql_help.c:2798
+msgid "subscription_parameter"
+msgstr "параметр_подпиÑки"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "параметр_пропуÑка"
+
+#: sql_help.c:1323 sql_help.c:1326
+msgid "partition_name"
+msgstr "имÑ_Ñекции"
+
+#: sql_help.c:1324 sql_help.c:2348 sql_help.c:2929
+msgid "partition_bound_spec"
+msgstr "указание_границ_Ñекции"
+
+#: sql_help.c:1343 sql_help.c:1393 sql_help.c:2943
+msgid "sequence_options"
+msgstr "параметры_поÑледовательноÑти"
+
+#: sql_help.c:1345
+msgid "sequence_option"
+msgstr "параметр_поÑледовательноÑти"
+
+#: sql_help.c:1359
+msgid "table_constraint_using_index"
+msgstr "ограничение_таблицы_Ñ_индекÑом"
+
+#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1370
+msgid "rewrite_rule_name"
+msgstr "имÑ_правила_перезапиÑи"
+
+#: sql_help.c:1382 sql_help.c:2360 sql_help.c:2968
+msgid "and partition_bound_spec is:"
+msgstr "и указание_границ_Ñекции:"
+
+#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:2361
+#: sql_help.c:2362 sql_help.c:2363 sql_help.c:2969 sql_help.c:2970
+#: sql_help.c:2971
+msgid "partition_bound_expr"
+msgstr "выражение_границ_Ñекции"
+
+#: sql_help.c:1386 sql_help.c:1387 sql_help.c:2364 sql_help.c:2365
+#: sql_help.c:2972 sql_help.c:2973
+msgid "numeric_literal"
+msgstr "чиÑловаÑ_конÑтанта"
+
+#: sql_help.c:1388
+msgid "and column_constraint is:"
+msgstr "и ограничение_Ñтолбца:"
+
+#: sql_help.c:1391 sql_help.c:2355 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:2941
+msgid "default_expr"
+msgstr "выражение_по_умолчанию"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2942
+msgid "generation_expr"
+msgstr "генерирующее_выражение"
+
+#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1404 sql_help.c:1406
+#: sql_help.c:1410 sql_help.c:2944 sql_help.c:2945 sql_help.c:2954
+#: sql_help.c:2956 sql_help.c:2960
+msgid "index_parameters"
+msgstr "параметры_индекÑа"
+
+#: sql_help.c:1396 sql_help.c:1413 sql_help.c:2946 sql_help.c:2963
+msgid "reftable"
+msgstr "целеваÑ_таблица"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "refcolumn"
+msgstr "целевой_Ñтолбец"
+
+#: sql_help.c:1398 sql_help.c:1399 sql_help.c:1415 sql_help.c:1416
+#: sql_help.c:2948 sql_help.c:2949 sql_help.c:2965 sql_help.c:2966
+msgid "referential_action"
+msgstr "ÑÑылочное_дейÑтвие"
+
+#: sql_help.c:1400 sql_help.c:2357 sql_help.c:2950
+msgid "and table_constraint is:"
+msgstr "и ограничение_таблицы:"
+
+#: sql_help.c:1408 sql_help.c:2958
+msgid "exclude_element"
+msgstr "объект_иÑключениÑ"
+
+#: sql_help.c:1409 sql_help.c:2959 sql_help.c:4571 sql_help.c:4674
+#: sql_help.c:4828 sql_help.c:5005 sql_help.c:5074
+msgid "operator"
+msgstr "оператор"
+
+#: sql_help.c:1411 sql_help.c:2476 sql_help.c:2961
+msgid "predicate"
+msgstr "предикат"
+
+#: sql_help.c:1417
+msgid "and table_constraint_using_index is:"
+msgstr "и ограничение_таблицы_Ñ_индекÑом:"
+
+#: sql_help.c:1420 sql_help.c:2974
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "параметры_индекÑа в ограничениÑÑ… UNIQUE, PRIMARY KEY и EXCLUDE:"
+
+#: sql_help.c:1425 sql_help.c:2979
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "объект_иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² ограничении EXCLUDE:"
+
+#: sql_help.c:1428 sql_help.c:2469 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:2982 sql_help.c:4000
+msgid "opclass"
+msgstr "клаÑÑ_оператора"
+
+#: sql_help.c:1429 sql_help.c:2983
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "ÑÑылочное дейÑтвие в ограничении FOREIGN KEY/REFERENCES:"
+
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:3020
+msgid "tablespace_option"
+msgstr "параметр_табл_проÑтранÑтва"
+
+#: sql_help.c:1471 sql_help.c:1474 sql_help.c:1480 sql_help.c:1484
+msgid "token_type"
+msgstr "тип_фрагмента"
+
+#: sql_help.c:1472 sql_help.c:1475
+msgid "dictionary_name"
+msgstr "имÑ_ÑловарÑ"
+
+#: sql_help.c:1477 sql_help.c:1481
+msgid "old_dictionary"
+msgstr "Ñтарый_Ñловарь"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "new_dictionary"
+msgstr "новый_Ñловарь"
+
+#: sql_help.c:1577 sql_help.c:1591 sql_help.c:1594 sql_help.c:1595
+#: sql_help.c:3173
+msgid "attribute_name"
+msgstr "имÑ_атрибута"
+
+#: sql_help.c:1578
+msgid "new_attribute_name"
+msgstr "новое_имÑ_атрибута"
+
+#: sql_help.c:1582 sql_help.c:1586
+msgid "new_enum_value"
+msgstr "новое_значение_перечиÑлениÑ"
+
+#: sql_help.c:1583
+msgid "neighbor_enum_value"
+msgstr "ÑоÑеднее_значение_перечиÑлениÑ"
+
+#: sql_help.c:1585
+msgid "existing_enum_value"
+msgstr "ÑущеÑтвующее_значение_перечиÑлениÑ"
+
+#: sql_help.c:1588
+msgid "property"
+msgstr "ÑвойÑтво"
+
+#: sql_help.c:1664 sql_help.c:2340 sql_help.c:2349 sql_help.c:2755
+#: sql_help.c:3253 sql_help.c:3704 sql_help.c:3910 sql_help.c:3956
+#: sql_help.c:4362
+msgid "server_name"
+msgstr "имÑ_Ñервера"
+
+#: sql_help.c:1696 sql_help.c:1699 sql_help.c:3268
+msgid "view_option_name"
+msgstr "имÑ_параметра_предÑтавлениÑ"
+
+#: sql_help.c:1697 sql_help.c:3269
+msgid "view_option_value"
+msgstr "значение_параметра_предÑтавлениÑ"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4973 sql_help.c:4974
+msgid "table_and_columns"
+msgstr "таблица_и_Ñтолбцы"
+
+#: sql_help.c:1721 sql_help.c:1785 sql_help.c:1977 sql_help.c:3753
+#: sql_help.c:4197 sql_help.c:4975
+msgid "where option can be one of:"
+msgstr "где допуÑтимый параметр:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1786 sql_help.c:1979
+#: sql_help.c:1983 sql_help.c:2163 sql_help.c:3754 sql_help.c:3755
+#: sql_help.c:3756 sql_help.c:3757 sql_help.c:3758 sql_help.c:3759
+#: sql_help.c:3760 sql_help.c:3761 sql_help.c:3762 sql_help.c:4198
+#: sql_help.c:4200 sql_help.c:4976 sql_help.c:4977 sql_help.c:4978
+#: sql_help.c:4979 sql_help.c:4980 sql_help.c:4981 sql_help.c:4982
+#: sql_help.c:4983 sql_help.c:4984 sql_help.c:4986 sql_help.c:4987
+msgid "boolean"
+msgstr "логичеÑкое_значение"
+
+#: sql_help.c:1724 sql_help.c:4988
+msgid "size"
+msgstr "размер"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "and table_and_columns is:"
+msgstr "и таблица_и_Ñтолбцы:"
+
+#: sql_help.c:1741 sql_help.c:4735 sql_help.c:4737 sql_help.c:4761
+msgid "transaction_mode"
+msgstr "режим_транзакции"
+
+#: sql_help.c:1742 sql_help.c:4738 sql_help.c:4762
+msgid "where transaction_mode is one of:"
+msgstr "где допуÑтимый режим_транзакции:"
+
+#: sql_help.c:1751 sql_help.c:4581 sql_help.c:4590 sql_help.c:4594
+#: sql_help.c:4598 sql_help.c:4601 sql_help.c:4838 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5084
+#: sql_help.c:5093 sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "argument"
+msgstr "аргумент"
+
+#: sql_help.c:1851
+msgid "relation_name"
+msgstr "имÑ_отношениÑ"
+
+#: sql_help.c:1856 sql_help.c:3904 sql_help.c:4356
+msgid "domain_name"
+msgstr "имÑ_домена"
+
+#: sql_help.c:1878
+msgid "policy_name"
+msgstr "имÑ_политики"
+
+#: sql_help.c:1891
+msgid "rule_name"
+msgstr "имÑ_правила"
+
+#: sql_help.c:1910 sql_help.c:4495
+msgid "string_literal"
+msgstr "ÑтроковаÑ_конÑтанта"
+
+#: sql_help.c:1935 sql_help.c:4159 sql_help.c:4409
+msgid "transaction_id"
+msgstr "код_транзакции"
+
+#: sql_help.c:1967 sql_help.c:1974 sql_help.c:4026
+msgid "filename"
+msgstr "имÑ_файла"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:2694 sql_help.c:2695
+#: sql_help.c:2696
+msgid "command"
+msgstr "команда"
+
+#: sql_help.c:1970 sql_help.c:2693 sql_help.c:3123 sql_help.c:3304
+#: sql_help.c:4010 sql_help.c:4087 sql_help.c:4090 sql_help.c:4564
+#: sql_help.c:4566 sql_help.c:4667 sql_help.c:4669 sql_help.c:4821
+#: sql_help.c:4823 sql_help.c:4939 sql_help.c:5067 sql_help.c:5069
+msgid "condition"
+msgstr "уÑловие"
+
+#: sql_help.c:1973 sql_help.c:2510 sql_help.c:3006 sql_help.c:3270
+#: sql_help.c:3288 sql_help.c:3991
+msgid "query"
+msgstr "запроÑ"
+
+#: sql_help.c:1978
+msgid "format_name"
+msgstr "имÑ_формата"
+
+#: sql_help.c:1980
+msgid "delimiter_character"
+msgstr "Ñимвол_разделитель"
+
+#: sql_help.c:1981
+msgid "null_string"
+msgstr "предÑтавление_NULL"
+
+#: sql_help.c:1982
+msgid "default_string"
+msgstr "предÑтавление_DEFAULT"
+
+#: sql_help.c:1984
+msgid "quote_character"
+msgstr "Ñимвол_кавычек"
+
+#: sql_help.c:1985
+msgid "escape_character"
+msgstr "ÑпецÑимвол"
+
+#: sql_help.c:1989
+msgid "encoding_name"
+msgstr "имÑ_кодировки"
+
+#: sql_help.c:2000
+msgid "access_method_type"
+msgstr "тип_метода_доÑтупа"
+
+#: sql_help.c:2071 sql_help.c:2090 sql_help.c:2093
+msgid "arg_data_type"
+msgstr "тип_данных_аргумента"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "sfunc"
+msgstr "функциÑ_ÑоÑтоÑниÑ"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "state_data_type"
+msgstr "тип_данных_ÑоÑтоÑниÑ"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_size"
+msgstr "размер_данных_ÑоÑтоÑниÑ"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "ffunc"
+msgstr "функциÑ_завершениÑ"
+
+#: sql_help.c:2076 sql_help.c:2106
+msgid "combinefunc"
+msgstr "комбинирующаÑ_функциÑ"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "serialfunc"
+msgstr "функциÑ_Ñериализации"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "deserialfunc"
+msgstr "функциÑ_деÑериализации"
+
+#: sql_help.c:2079 sql_help.c:2098 sql_help.c:2109
+msgid "initial_condition"
+msgstr "начальное_уÑловие"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "msfunc"
+msgstr "функциÑ_ÑоÑтоÑниÑ_движ"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "minvfunc"
+msgstr "обратнаÑ_функциÑ_движ"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "mstate_data_type"
+msgstr "тип_данных_ÑоÑтоÑниÑ_движ"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_size"
+msgstr "размер_данных_ÑоÑтоÑниÑ_движ"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mffunc"
+msgstr "функциÑ_завершениÑ_движ"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "minitial_condition"
+msgstr "начальное_уÑловие_движ"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "sort_operator"
+msgstr "оператор_Ñортировки"
+
+#: sql_help.c:2099
+msgid "or the old syntax"
+msgstr "или Ñтарый ÑинтакÑиÑ"
+
+#: sql_help.c:2101
+msgid "base_type"
+msgstr "базовый_тип"
+
+#: sql_help.c:2159 sql_help.c:2208
+msgid "locale"
+msgstr "код_локали"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "lc_collate"
+msgstr "код_правила_Ñортировки"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_ctype"
+msgstr "код_клаÑÑификации_Ñимволов"
+
+#: sql_help.c:2162 sql_help.c:4462
+msgid "provider"
+msgstr "провайдер"
+
+#: sql_help.c:2164
+msgid "rules"
+msgstr "правила"
+
+#: sql_help.c:2165 sql_help.c:2270
+msgid "version"
+msgstr "верÑиÑ"
+
+#: sql_help.c:2167
+msgid "existing_collation"
+msgstr "ÑущеÑтвующее_правило_Ñортировки"
+
+#: sql_help.c:2177
+msgid "source_encoding"
+msgstr "иÑходнаÑ_кодировка"
+
+#: sql_help.c:2178
+msgid "dest_encoding"
+msgstr "целеваÑ_кодировка"
+
+#: sql_help.c:2205 sql_help.c:3046
+msgid "template"
+msgstr "шаблон"
+
+#: sql_help.c:2206
+msgid "encoding"
+msgstr "кодировка"
+
+#: sql_help.c:2207
+msgid "strategy"
+msgstr "ÑтратегиÑ"
+
+#: sql_help.c:2211
+msgid "icu_locale"
+msgstr "локаль_icu"
+
+#: sql_help.c:2212
+msgid "icu_rules"
+msgstr "правила_icu"
+
+#: sql_help.c:2213
+msgid "locale_provider"
+msgstr "провайдер_локали"
+
+#: sql_help.c:2214
+msgid "collation_version"
+msgstr "верÑиÑ_правила_Ñортировки"
+
+#: sql_help.c:2219
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2239
+msgid "constraint"
+msgstr "ограничение"
+
+#: sql_help.c:2240
+msgid "where constraint is:"
+msgstr "где ограничение:"
+
+#: sql_help.c:2254 sql_help.c:2691 sql_help.c:3119
+msgid "event"
+msgstr "Ñобытие"
+
+#: sql_help.c:2255
+msgid "filter_variable"
+msgstr "переменнаÑ_фильтра"
+
+#: sql_help.c:2256
+msgid "filter_value"
+msgstr "значение_фильтра"
+
+#: sql_help.c:2352 sql_help.c:2938
+msgid "where column_constraint is:"
+msgstr "где ограничение_Ñтолбца:"
+
+#: sql_help.c:2397
+msgid "rettype"
+msgstr "тип_возврата"
+
+#: sql_help.c:2399
+msgid "column_type"
+msgstr "тип_Ñтолбца"
+
+#: sql_help.c:2408 sql_help.c:2611
+msgid "definition"
+msgstr "определение"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "obj_file"
+msgstr "объектный_файл"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "link_symbol"
+msgstr "Ñимвол_в_ÑкÑпорте"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "sql_body"
+msgstr "тело_sql"
+
+#: sql_help.c:2449 sql_help.c:2676 sql_help.c:3242
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2465 sql_help.c:2506 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:3002
+msgid "method"
+msgstr "метод"
+
+#: sql_help.c:2470
+msgid "opclass_parameter"
+msgstr "параметр_клаÑÑа_оп"
+
+#: sql_help.c:2487
+msgid "call_handler"
+msgstr "обработчик_вызова"
+
+#: sql_help.c:2488
+msgid "inline_handler"
+msgstr "обработчик_внедрённого_кода"
+
+#: sql_help.c:2489
+msgid "valfunction"
+msgstr "функциÑ_проверки"
+
+#: sql_help.c:2528
+msgid "com_op"
+msgstr "коммут_оператор"
+
+#: sql_help.c:2529
+msgid "neg_op"
+msgstr "обратный_оператор"
+
+#: sql_help.c:2547
+msgid "family_name"
+msgstr "имÑ_ÑемейÑтва"
+
+#: sql_help.c:2558
+msgid "storage_type"
+msgstr "тип_хранениÑ"
+
+#: sql_help.c:2697 sql_help.c:3126
+msgid "where event can be one of:"
+msgstr "где допуÑтимое Ñобытие:"
+
+#: sql_help.c:2717 sql_help.c:2719
+msgid "schema_element"
+msgstr "Ñлемент_Ñхемы"
+
+#: sql_help.c:2756
+msgid "server_type"
+msgstr "тип_Ñервера"
+
+#: sql_help.c:2757
+msgid "server_version"
+msgstr "верÑиÑ_Ñервера"
+
+#: sql_help.c:2758 sql_help.c:3907 sql_help.c:4359
+msgid "fdw_name"
+msgstr "имÑ_обёртки_Ñторонних_данных"
+
+#: sql_help.c:2775 sql_help.c:2778
+msgid "statistics_name"
+msgstr "имÑ_ÑтатиÑтики"
+
+#: sql_help.c:2779
+msgid "statistics_kind"
+msgstr "вид_ÑтатиÑтики"
+
+#: sql_help.c:2795
+msgid "subscription_name"
+msgstr "имÑ_подпиÑки"
+
+#: sql_help.c:2900
+msgid "source_table"
+msgstr "иÑходнаÑ_таблица"
+
+#: sql_help.c:2901
+msgid "like_option"
+msgstr "параметр_порождениÑ"
+
+#: sql_help.c:2967
+msgid "and like_option is:"
+msgstr "и параметр_порождениÑ:"
+
+#: sql_help.c:3019
+msgid "directory"
+msgstr "каталог"
+
+#: sql_help.c:3033
+msgid "parser_name"
+msgstr "имÑ_анализатора"
+
+#: sql_help.c:3034
+msgid "source_config"
+msgstr "иÑходнаÑ_конфигурациÑ"
+
+#: sql_help.c:3063
+msgid "start_function"
+msgstr "функциÑ_начала"
+
+#: sql_help.c:3064
+msgid "gettoken_function"
+msgstr "функциÑ_выдачи_фрагмента"
+
+#: sql_help.c:3065
+msgid "end_function"
+msgstr "функциÑ_окончаниÑ"
+
+#: sql_help.c:3066
+msgid "lextypes_function"
+msgstr "функциÑ_лекÑ_типов"
+
+#: sql_help.c:3067
+msgid "headline_function"
+msgstr "функциÑ_ÑозданиÑ_выдержек"
+
+#: sql_help.c:3079
+msgid "init_function"
+msgstr "функциÑ_инициализации"
+
+#: sql_help.c:3080
+msgid "lexize_function"
+msgstr "функциÑ_выделениÑ_лекÑем"
+
+#: sql_help.c:3093
+msgid "from_sql_function_name"
+msgstr "имÑ_функции_из_sql"
+
+#: sql_help.c:3095
+msgid "to_sql_function_name"
+msgstr "имÑ_функции_в_sql"
+
+#: sql_help.c:3121
+msgid "referenced_table_name"
+msgstr "ÑÑылающаÑÑÑ_таблица"
+
+#: sql_help.c:3122
+msgid "transition_relation_name"
+msgstr "имÑ_переходного_отношениÑ"
+
+#: sql_help.c:3125
+msgid "arguments"
+msgstr "аргументы"
+
+#: sql_help.c:3177
+msgid "label"
+msgstr "метка"
+
+#: sql_help.c:3179
+msgid "subtype"
+msgstr "подтип"
+
+#: sql_help.c:3180
+msgid "subtype_operator_class"
+msgstr "клаÑÑ_оператора_подтипа"
+
+#: sql_help.c:3182
+msgid "canonical_function"
+msgstr "каноничеÑкаÑ_функциÑ"
+
+#: sql_help.c:3183
+msgid "subtype_diff_function"
+msgstr "функциÑ_различий_подтипа"
+
+#: sql_help.c:3184
+msgid "multirange_type_name"
+msgstr "имÑ_мультидиапазонного_типа"
+
+#: sql_help.c:3186
+msgid "input_function"
+msgstr "функциÑ_ввода"
+
+#: sql_help.c:3187
+msgid "output_function"
+msgstr "функциÑ_вывода"
+
+#: sql_help.c:3188
+msgid "receive_function"
+msgstr "функциÑ_получениÑ"
+
+#: sql_help.c:3189
+msgid "send_function"
+msgstr "функциÑ_отправки"
+
+#: sql_help.c:3190
+msgid "type_modifier_input_function"
+msgstr "функциÑ_ввода_модификатора_типа"
+
+#: sql_help.c:3191
+msgid "type_modifier_output_function"
+msgstr "функциÑ_вывода_модификатора_типа"
+
+#: sql_help.c:3192
+msgid "analyze_function"
+msgstr "функциÑ_анализа"
+
+#: sql_help.c:3193
+msgid "subscript_function"
+msgstr "функциÑ_обращениÑ_по_индекÑу"
+
+#: sql_help.c:3194
+msgid "internallength"
+msgstr "внутр_длина"
+
+#: sql_help.c:3195
+msgid "alignment"
+msgstr "выравнивание"
+
+#: sql_help.c:3196
+msgid "storage"
+msgstr "хранение"
+
+#: sql_help.c:3197
+msgid "like_type"
+msgstr "тип_образец"
+
+#: sql_help.c:3198
+msgid "category"
+msgstr "категориÑ"
+
+#: sql_help.c:3199
+msgid "preferred"
+msgstr "предпочитаемый"
+
+#: sql_help.c:3200
+msgid "default"
+msgstr "по_умолчанию"
+
+#: sql_help.c:3201
+msgid "element"
+msgstr "Ñлемент"
+
+#: sql_help.c:3202
+msgid "delimiter"
+msgstr "разделитель"
+
+#: sql_help.c:3203
+msgid "collatable"
+msgstr "Ñортируемый"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4076 sql_help.c:4559
+#: sql_help.c:4661 sql_help.c:4816 sql_help.c:4929 sql_help.c:5062
+msgid "with_query"
+msgstr "запроÑ_WITH"
+
+#: sql_help.c:3302 sql_help.c:3988 sql_help.c:4578 sql_help.c:4584
+#: sql_help.c:4587 sql_help.c:4591 sql_help.c:4595 sql_help.c:4603
+#: sql_help.c:4835 sql_help.c:4841 sql_help.c:4844 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4860 sql_help.c:4931 sql_help.c:5081
+#: sql_help.c:5087 sql_help.c:5090 sql_help.c:5094 sql_help.c:5098
+#: sql_help.c:5106
+msgid "alias"
+msgstr "пÑевдоним"
+
+#: sql_help.c:3303 sql_help.c:4563 sql_help.c:4605 sql_help.c:4607
+#: sql_help.c:4611 sql_help.c:4613 sql_help.c:4614 sql_help.c:4615
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4862 sql_help.c:4864
+#: sql_help.c:4868 sql_help.c:4870 sql_help.c:4871 sql_help.c:4872
+#: sql_help.c:4938 sql_help.c:5066 sql_help.c:5108 sql_help.c:5110
+#: sql_help.c:5114 sql_help.c:5116 sql_help.c:5117 sql_help.c:5118
+msgid "from_item"
+msgstr "иÑточник_данных"
+
+#: sql_help.c:3305 sql_help.c:3788 sql_help.c:4126 sql_help.c:4940
+msgid "cursor_name"
+msgstr "имÑ_курÑора"
+
+#: sql_help.c:3306 sql_help.c:3994 sql_help.c:4941
+msgid "output_expression"
+msgstr "выражение_результата"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4562 sql_help.c:4664
+#: sql_help.c:4819 sql_help.c:4942 sql_help.c:5065
+msgid "output_name"
+msgstr "имÑ_результата"
+
+#: sql_help.c:3323
+msgid "code"
+msgstr "внедрённый_код"
+
+#: sql_help.c:3728
+msgid "parameter"
+msgstr "параметр"
+
+#: sql_help.c:3751 sql_help.c:3752 sql_help.c:4151
+msgid "statement"
+msgstr "оператор"
+
+#: sql_help.c:3787 sql_help.c:4125
+msgid "direction"
+msgstr "направление"
+
+#: sql_help.c:3789 sql_help.c:4127
+msgid "where direction can be one of:"
+msgstr "где допуÑтимое направление:"
+
+#: sql_help.c:3790 sql_help.c:3791 sql_help.c:3792 sql_help.c:3793
+#: sql_help.c:3794 sql_help.c:4128 sql_help.c:4129 sql_help.c:4130
+#: sql_help.c:4131 sql_help.c:4132 sql_help.c:4572 sql_help.c:4574
+#: sql_help.c:4675 sql_help.c:4677 sql_help.c:4829 sql_help.c:4831
+#: sql_help.c:5006 sql_help.c:5008 sql_help.c:5075 sql_help.c:5077
+msgid "count"
+msgstr "чиÑло"
+
+#: sql_help.c:3897 sql_help.c:4349
+msgid "sequence_name"
+msgstr "имÑ_поÑледовательноÑти"
+
+#: sql_help.c:3915 sql_help.c:4367
+msgid "arg_name"
+msgstr "имÑ_аргумента"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_type"
+msgstr "тип_аргумента"
+
+#: sql_help.c:3923 sql_help.c:4375
+msgid "loid"
+msgstr "код_БО"
+
+#: sql_help.c:3954
+msgid "remote_schema"
+msgstr "удалённаÑ_Ñхема"
+
+#: sql_help.c:3957
+msgid "local_schema"
+msgstr "локальнаÑ_Ñхема"
+
+#: sql_help.c:3992
+msgid "conflict_target"
+msgstr "объект_конфликта"
+
+#: sql_help.c:3993
+msgid "conflict_action"
+msgstr "дейÑтвие_при_конфликте"
+
+#: sql_help.c:3996
+msgid "where conflict_target can be one of:"
+msgstr "где допуÑтимый объект_конфликта:"
+
+#: sql_help.c:3997
+msgid "index_column_name"
+msgstr "имÑ_Ñтолбца_индекÑа"
+
+#: sql_help.c:3998
+msgid "index_expression"
+msgstr "выражение_индекÑа"
+
+#: sql_help.c:4001
+msgid "index_predicate"
+msgstr "предикат_индекÑа"
+
+#: sql_help.c:4003
+msgid "and conflict_action is one of:"
+msgstr "а допуÑтимое дейÑтвие_при_конфликте:"
+
+#: sql_help.c:4009 sql_help.c:4937
+msgid "sub-SELECT"
+msgstr "вложенный_SELECT"
+
+#: sql_help.c:4018 sql_help.c:4140 sql_help.c:4913
+msgid "channel"
+msgstr "канал"
+
+#: sql_help.c:4040
+msgid "lockmode"
+msgstr "режим_блокировки"
+
+#: sql_help.c:4041
+msgid "where lockmode is one of:"
+msgstr "где допуÑтимый режим_блокировки:"
+
+#: sql_help.c:4077
+msgid "target_table_name"
+msgstr "имÑ_целевой_таблицы"
+
+#: sql_help.c:4078
+msgid "target_alias"
+msgstr "пÑевдоним_назначениÑ"
+
+#: sql_help.c:4079
+msgid "data_source"
+msgstr "иÑточник_данных"
+
+#: sql_help.c:4080 sql_help.c:4608 sql_help.c:4865 sql_help.c:5111
+msgid "join_condition"
+msgstr "уÑловие_ÑоединениÑ"
+
+#: sql_help.c:4081
+msgid "when_clause"
+msgstr "предложение_when"
+
+#: sql_help.c:4082
+msgid "where data_source is:"
+msgstr "где иÑточник_данных:"
+
+#: sql_help.c:4083
+msgid "source_table_name"
+msgstr "имÑ_иÑходной_таблицы"
+
+#: sql_help.c:4084
+msgid "source_query"
+msgstr "иÑходный_запроÑ"
+
+#: sql_help.c:4085
+msgid "source_alias"
+msgstr "пÑевдоним_иÑточника"
+
+#: sql_help.c:4086
+msgid "and when_clause is:"
+msgstr "и предложение_when:"
+
+#: sql_help.c:4088
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4089
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4091
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4092
+msgid "and merge_insert is:"
+msgstr "и merge_insert:"
+
+#: sql_help.c:4095
+msgid "and merge_update is:"
+msgstr "и merge_update:"
+
+#: sql_help.c:4100
+msgid "and merge_delete is:"
+msgstr "и merge_delete:"
+
+#: sql_help.c:4141
+msgid "payload"
+msgstr "Ñообщение_нагрузка"
+
+#: sql_help.c:4168
+msgid "old_role"
+msgstr "ÑтараÑ_роль"
+
+#: sql_help.c:4169
+msgid "new_role"
+msgstr "новаÑ_роль"
+
+#: sql_help.c:4208 sql_help.c:4417 sql_help.c:4425
+msgid "savepoint_name"
+msgstr "имÑ_точки_ÑохранениÑ"
+
+#: sql_help.c:4565 sql_help.c:4623 sql_help.c:4822 sql_help.c:4880
+#: sql_help.c:5068 sql_help.c:5126
+msgid "grouping_element"
+msgstr "Ñлемент_группированиÑ"
+
+#: sql_help.c:4567 sql_help.c:4670 sql_help.c:4824 sql_help.c:5070
+msgid "window_name"
+msgstr "имÑ_окна"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_definition"
+msgstr "определение_окна"
+
+#: sql_help.c:4569 sql_help.c:4583 sql_help.c:4627 sql_help.c:4672
+#: sql_help.c:4826 sql_help.c:4840 sql_help.c:4884 sql_help.c:5072
+#: sql_help.c:5086 sql_help.c:5130
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4576 sql_help.c:4833 sql_help.c:5079
+msgid "where from_item can be one of:"
+msgstr "где допуÑтимый иÑточник_данных:"
+
+#: sql_help.c:4579 sql_help.c:4585 sql_help.c:4588 sql_help.c:4592
+#: sql_help.c:4604 sql_help.c:4836 sql_help.c:4842 sql_help.c:4845
+#: sql_help.c:4849 sql_help.c:4861 sql_help.c:5082 sql_help.c:5088
+#: sql_help.c:5091 sql_help.c:5095 sql_help.c:5107
+msgid "column_alias"
+msgstr "пÑевдоним_Ñтолбца"
+
+#: sql_help.c:4580 sql_help.c:4837 sql_help.c:5083
+msgid "sampling_method"
+msgstr "метод_выборки"
+
+#: sql_help.c:4582 sql_help.c:4839 sql_help.c:5085
+msgid "seed"
+msgstr "начальное_чиÑло"
+
+#: sql_help.c:4586 sql_help.c:4625 sql_help.c:4843 sql_help.c:4882
+#: sql_help.c:5089 sql_help.c:5128
+msgid "with_query_name"
+msgstr "имÑ_запроÑа_WITH"
+
+#: sql_help.c:4596 sql_help.c:4599 sql_help.c:4602 sql_help.c:4853
+#: sql_help.c:4856 sql_help.c:4859 sql_help.c:5099 sql_help.c:5102
+#: sql_help.c:5105
+msgid "column_definition"
+msgstr "определение_Ñтолбца"
+
+#: sql_help.c:4606 sql_help.c:4612 sql_help.c:4863 sql_help.c:4869
+#: sql_help.c:5109 sql_help.c:5115
+msgid "join_type"
+msgstr "тип_ÑоединениÑ"
+
+#: sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_column"
+msgstr "Ñтолбец_ÑоединениÑ"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_using_alias"
+msgstr "пÑевдоним_иÑпользованиÑ_ÑоединениÑ"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5119
+msgid "and grouping_element can be one of:"
+msgstr "где допуÑтимый Ñлемент_группированиÑ:"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5127
+msgid "and with_query is:"
+msgstr "и запроÑ_WITH:"
+
+#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5131
+msgid "values"
+msgstr "значениÑ"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4633 sql_help.c:4890 sql_help.c:5136
+msgid "search_seq_col_name"
+msgstr "имÑ_Ñтолбца_поÑлед_поиÑка"
+
+#: sql_help.c:4635 sql_help.c:4892 sql_help.c:5138
+msgid "cycle_mark_col_name"
+msgstr "имÑ_Ñтолбца_пометки_цикла"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_value"
+msgstr "значение_пометки_цикла"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_default"
+msgstr "пометка_цикла_по_умолчанию"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_path_col_name"
+msgstr "имÑ_Ñтолбца_пути_цикла"
+
+#: sql_help.c:4665
+msgid "new_table"
+msgstr "новаÑ_таблица"
+
+#: sql_help.c:4736
+msgid "snapshot_id"
+msgstr "код_Ñнимка"
+
+#: sql_help.c:5004
+msgid "sort_expression"
+msgstr "выражение_Ñортировки"
+
+#: sql_help.c:5148 sql_help.c:6132
+msgid "abort the current transaction"
+msgstr "прервать текущую транзакцию"
+
+#: sql_help.c:5154
+msgid "change the definition of an aggregate function"
+msgstr "изменить определение агрегатной функции"
+
+#: sql_help.c:5160
+msgid "change the definition of a collation"
+msgstr "изменить определение правила Ñортировки"
+
+#: sql_help.c:5166
+msgid "change the definition of a conversion"
+msgstr "изменить определение преобразованиÑ"
+
+#: sql_help.c:5172
+msgid "change a database"
+msgstr "изменить атрибуты базы данных"
+
+#: sql_help.c:5178
+msgid "define default access privileges"
+msgstr "определить права доÑтупа по умолчанию"
+
+#: sql_help.c:5184
+msgid "change the definition of a domain"
+msgstr "изменить определение домена"
+
+#: sql_help.c:5190
+msgid "change the definition of an event trigger"
+msgstr "изменить определение Ñобытийного триггера"
+
+#: sql_help.c:5196
+msgid "change the definition of an extension"
+msgstr "изменить определение раÑширениÑ"
+
+#: sql_help.c:5202
+msgid "change the definition of a foreign-data wrapper"
+msgstr "изменить определение обёртки Ñторонних данных"
+
+#: sql_help.c:5208
+msgid "change the definition of a foreign table"
+msgstr "изменить определение Ñторонней таблицы"
+
+#: sql_help.c:5214
+msgid "change the definition of a function"
+msgstr "изменить определение функции"
+
+#: sql_help.c:5220
+msgid "change role name or membership"
+msgstr "изменить Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸ или членÑтво"
+
+#: sql_help.c:5226
+msgid "change the definition of an index"
+msgstr "изменить определение индекÑа"
+
+#: sql_help.c:5232
+msgid "change the definition of a procedural language"
+msgstr "изменить определение процедурного Ñзыка"
+
+#: sql_help.c:5238
+msgid "change the definition of a large object"
+msgstr "изменить определение большого объекта"
+
+#: sql_help.c:5244
+msgid "change the definition of a materialized view"
+msgstr "изменить определение материализованного предÑтавлениÑ"
+
+#: sql_help.c:5250
+msgid "change the definition of an operator"
+msgstr "изменить определение оператора"
+
+#: sql_help.c:5256
+msgid "change the definition of an operator class"
+msgstr "изменить определение клаÑÑа операторов"
+
+#: sql_help.c:5262
+msgid "change the definition of an operator family"
+msgstr "изменить определение ÑемейÑтва операторов"
+
+#: sql_help.c:5268
+msgid "change the definition of a row-level security policy"
+msgstr "изменить определение политики защиты на уровне Ñтрок"
+
+#: sql_help.c:5274
+msgid "change the definition of a procedure"
+msgstr "изменить определение процедуры"
+
+#: sql_help.c:5280
+msgid "change the definition of a publication"
+msgstr "изменить определение публикации"
+
+#: sql_help.c:5286 sql_help.c:5388
+msgid "change a database role"
+msgstr "изменить роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”"
+
+#: sql_help.c:5292
+msgid "change the definition of a routine"
+msgstr "изменить определение подпрограммы"
+
+#: sql_help.c:5298
+msgid "change the definition of a rule"
+msgstr "изменить определение правила"
+
+#: sql_help.c:5304
+msgid "change the definition of a schema"
+msgstr "изменить определение Ñхемы"
+
+#: sql_help.c:5310
+msgid "change the definition of a sequence generator"
+msgstr "изменить определение генератора поÑледовательноÑти"
+
+#: sql_help.c:5316
+msgid "change the definition of a foreign server"
+msgstr "изменить определение Ñтороннего Ñервера"
+
+#: sql_help.c:5322
+msgid "change the definition of an extended statistics object"
+msgstr "изменить определение объекта раÑширенной ÑтатиÑтики"
+
+#: sql_help.c:5328
+msgid "change the definition of a subscription"
+msgstr "изменить определение подпиÑки"
+
+#: sql_help.c:5334
+msgid "change a server configuration parameter"
+msgstr "изменить параметр конфигурации Ñервера"
+
+#: sql_help.c:5340
+msgid "change the definition of a table"
+msgstr "изменить определение таблицы"
+
+#: sql_help.c:5346
+msgid "change the definition of a tablespace"
+msgstr "изменить определение табличного проÑтранÑтва"
+
+#: sql_help.c:5352
+msgid "change the definition of a text search configuration"
+msgstr "изменить определение конфигурации текÑтового поиÑка"
+
+#: sql_help.c:5358
+msgid "change the definition of a text search dictionary"
+msgstr "изменить определение ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ñ‚ÐµÐºÑтового поиÑка"
+
+#: sql_help.c:5364
+msgid "change the definition of a text search parser"
+msgstr "изменить определение анализатора текÑтового поиÑка"
+
+#: sql_help.c:5370
+msgid "change the definition of a text search template"
+msgstr "изменить определение шаблона текÑтового поиÑка"
+
+#: sql_help.c:5376
+msgid "change the definition of a trigger"
+msgstr "изменить определение триггера"
+
+#: sql_help.c:5382
+msgid "change the definition of a type"
+msgstr "изменить определение типа"
+
+#: sql_help.c:5394
+msgid "change the definition of a user mapping"
+msgstr "изменить ÑопоÑтавление пользователей"
+
+#: sql_help.c:5400
+msgid "change the definition of a view"
+msgstr "изменить определение предÑтавлениÑ"
+
+#: sql_help.c:5406
+msgid "collect statistics about a database"
+msgstr "Ñобрать ÑтатиÑтику о базе данных"
+
+#: sql_help.c:5412 sql_help.c:6210
+msgid "start a transaction block"
+msgstr "начать транзакцию"
+
+#: sql_help.c:5418
+msgid "invoke a procedure"
+msgstr "вызвать процедуру"
+
+#: sql_help.c:5424
+msgid "force a write-ahead log checkpoint"
+msgstr "произвеÑти контрольную точку в журнале предзапиÑи"
+
+#: sql_help.c:5430
+msgid "close a cursor"
+msgstr "закрыть курÑор"
+
+#: sql_help.c:5436
+msgid "cluster a table according to an index"
+msgstr "перегруппировать таблицу по индекÑу"
+
+#: sql_help.c:5442
+msgid "define or change the comment of an object"
+msgstr "задать или изменить комментарий объекта"
+
+#: sql_help.c:5448 sql_help.c:6006
+msgid "commit the current transaction"
+msgstr "зафикÑировать текущую транзакцию"
+
+#: sql_help.c:5454
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "зафикÑировать транзакцию, ранее подготовленную Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации"
+
+#: sql_help.c:5460
+msgid "copy data between a file and a table"
+msgstr "импорт/ÑкÑпорт данных в файл"
+
+#: sql_help.c:5466
+msgid "define a new access method"
+msgstr "Ñоздать новый метод доÑтупа"
+
+#: sql_help.c:5472
+msgid "define a new aggregate function"
+msgstr "Ñоздать агрегатную функцию"
+
+#: sql_help.c:5478
+msgid "define a new cast"
+msgstr "Ñоздать приведение типов"
+
+#: sql_help.c:5484
+msgid "define a new collation"
+msgstr "Ñоздать правило Ñортировки"
+
+#: sql_help.c:5490
+msgid "define a new encoding conversion"
+msgstr "Ñоздать преобразование кодировки"
+
+#: sql_help.c:5496
+msgid "create a new database"
+msgstr "Ñоздать базу данных"
+
+#: sql_help.c:5502
+msgid "define a new domain"
+msgstr "Ñоздать домен"
+
+#: sql_help.c:5508
+msgid "define a new event trigger"
+msgstr "Ñоздать Ñобытийный триггер"
+
+#: sql_help.c:5514
+msgid "install an extension"
+msgstr "уÑтановить раÑширение"
+
+#: sql_help.c:5520
+msgid "define a new foreign-data wrapper"
+msgstr "Ñоздать обёртку Ñторонних данных"
+
+#: sql_help.c:5526
+msgid "define a new foreign table"
+msgstr "Ñоздать Ñтороннюю таблицу"
+
+#: sql_help.c:5532
+msgid "define a new function"
+msgstr "Ñоздать функцию"
+
+#: sql_help.c:5538 sql_help.c:5598 sql_help.c:5700
+msgid "define a new database role"
+msgstr "Ñоздать роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”"
+
+#: sql_help.c:5544
+msgid "define a new index"
+msgstr "Ñоздать индекÑ"
+
+#: sql_help.c:5550
+msgid "define a new procedural language"
+msgstr "Ñоздать процедурный Ñзык"
+
+#: sql_help.c:5556
+msgid "define a new materialized view"
+msgstr "Ñоздать материализованное предÑтавление"
+
+#: sql_help.c:5562
+msgid "define a new operator"
+msgstr "Ñоздать оператор"
+
+#: sql_help.c:5568
+msgid "define a new operator class"
+msgstr "Ñоздать клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²"
+
+#: sql_help.c:5574
+msgid "define a new operator family"
+msgstr "Ñоздать ÑемейÑтво операторов"
+
+#: sql_help.c:5580
+msgid "define a new row-level security policy for a table"
+msgstr "Ñоздать новую политику защиты на уровне Ñтрок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹"
+
+#: sql_help.c:5586
+msgid "define a new procedure"
+msgstr "Ñоздать процедуру"
+
+#: sql_help.c:5592
+msgid "define a new publication"
+msgstr "Ñоздать публикацию"
+
+#: sql_help.c:5604
+msgid "define a new rewrite rule"
+msgstr "Ñоздать правило перезапиÑи"
+
+#: sql_help.c:5610
+msgid "define a new schema"
+msgstr "Ñоздать Ñхему"
+
+#: sql_help.c:5616
+msgid "define a new sequence generator"
+msgstr "Ñоздать генератор поÑледовательноÑтей"
+
+#: sql_help.c:5622
+msgid "define a new foreign server"
+msgstr "Ñоздать Ñторонний Ñервер"
+
+#: sql_help.c:5628
+msgid "define extended statistics"
+msgstr "Ñоздать раÑширенную ÑтатиÑтику"
+
+#: sql_help.c:5634
+msgid "define a new subscription"
+msgstr "Ñоздать подпиÑку"
+
+#: sql_help.c:5640
+msgid "define a new table"
+msgstr "Ñоздать таблицу"
+
+#: sql_help.c:5646 sql_help.c:6168
+msgid "define a new table from the results of a query"
+msgstr "Ñоздать таблицу из результатов запроÑа"
+
+#: sql_help.c:5652
+msgid "define a new tablespace"
+msgstr "Ñоздать табличное проÑтранÑтво"
+
+#: sql_help.c:5658
+msgid "define a new text search configuration"
+msgstr "Ñоздать конфигурацию текÑтового поиÑка"
+
+#: sql_help.c:5664
+msgid "define a new text search dictionary"
+msgstr "Ñоздать Ñловарь текÑтового поиÑка"
+
+#: sql_help.c:5670
+msgid "define a new text search parser"
+msgstr "Ñоздать анализатор текÑтового поиÑка"
+
+#: sql_help.c:5676
+msgid "define a new text search template"
+msgstr "Ñоздать шаблон текÑтового поиÑка"
+
+#: sql_help.c:5682
+msgid "define a new transform"
+msgstr "Ñоздать преобразование"
+
+#: sql_help.c:5688
+msgid "define a new trigger"
+msgstr "Ñоздать триггер"
+
+#: sql_help.c:5694
+msgid "define a new data type"
+msgstr "Ñоздать тип данных"
+
+#: sql_help.c:5706
+msgid "define a new mapping of a user to a foreign server"
+msgstr "Ñоздать ÑопоÑтавление Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñтороннего Ñервера"
+
+#: sql_help.c:5712
+msgid "define a new view"
+msgstr "Ñоздать предÑтавление"
+
+#: sql_help.c:5718
+msgid "deallocate a prepared statement"
+msgstr "оÑвободить подготовленный оператор"
+
+#: sql_help.c:5724
+msgid "define a cursor"
+msgstr "Ñоздать курÑор"
+
+#: sql_help.c:5730
+msgid "delete rows of a table"
+msgstr "удалить запиÑи таблицы"
+
+#: sql_help.c:5736
+msgid "discard session state"
+msgstr "очиÑтить ÑоÑтоÑние ÑеанÑа"
+
+#: sql_help.c:5742
+msgid "execute an anonymous code block"
+msgstr "выполнить анонимный блок кода"
+
+#: sql_help.c:5748
+msgid "remove an access method"
+msgstr "удалить метод доÑтупа"
+
+#: sql_help.c:5754
+msgid "remove an aggregate function"
+msgstr "удалить агрегатную функцию"
+
+#: sql_help.c:5760
+msgid "remove a cast"
+msgstr "удалить приведение типа"
+
+#: sql_help.c:5766
+msgid "remove a collation"
+msgstr "удалить правило Ñортировки"
+
+#: sql_help.c:5772
+msgid "remove a conversion"
+msgstr "удалить преобразование"
+
+#: sql_help.c:5778
+msgid "remove a database"
+msgstr "удалить базу данных"
+
+#: sql_help.c:5784
+msgid "remove a domain"
+msgstr "удалить домен"
+
+#: sql_help.c:5790
+msgid "remove an event trigger"
+msgstr "удалить Ñобытийный триггер"
+
+#: sql_help.c:5796
+msgid "remove an extension"
+msgstr "удалить раÑширение"
+
+#: sql_help.c:5802
+msgid "remove a foreign-data wrapper"
+msgstr "удалить обёртку Ñторонних данных"
+
+#: sql_help.c:5808
+msgid "remove a foreign table"
+msgstr "удалить Ñтороннюю таблицу"
+
+#: sql_help.c:5814
+msgid "remove a function"
+msgstr "удалить функцию"
+
+#: sql_help.c:5820 sql_help.c:5886 sql_help.c:5988
+msgid "remove a database role"
+msgstr "удалить роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”"
+
+#: sql_help.c:5826
+msgid "remove an index"
+msgstr "удалить индекÑ"
+
+#: sql_help.c:5832
+msgid "remove a procedural language"
+msgstr "удалить процедурный Ñзык"
+
+#: sql_help.c:5838
+msgid "remove a materialized view"
+msgstr "удалить материализованное предÑтавление"
+
+#: sql_help.c:5844
+msgid "remove an operator"
+msgstr "удалить оператор"
+
+#: sql_help.c:5850
+msgid "remove an operator class"
+msgstr "удалить клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²"
+
+#: sql_help.c:5856
+msgid "remove an operator family"
+msgstr "удалить ÑемейÑтво операторов"
+
+#: sql_help.c:5862
+msgid "remove database objects owned by a database role"
+msgstr "удалить объекты базы данных, принадлежащие роли"
+
+#: sql_help.c:5868
+msgid "remove a row-level security policy from a table"
+msgstr "удалить из таблицы политику защиты на уровне Ñтрок"
+
+#: sql_help.c:5874
+msgid "remove a procedure"
+msgstr "удалить процедуру"
+
+#: sql_help.c:5880
+msgid "remove a publication"
+msgstr "удалить публикацию"
+
+#: sql_help.c:5892
+msgid "remove a routine"
+msgstr "удалить подпрограмму"
+
+#: sql_help.c:5898
+msgid "remove a rewrite rule"
+msgstr "удалить правило перезапиÑи"
+
+#: sql_help.c:5904
+msgid "remove a schema"
+msgstr "удалить Ñхему"
+
+#: sql_help.c:5910
+msgid "remove a sequence"
+msgstr "удалить поÑледовательноÑÑ‚ÑŒ"
+
+#: sql_help.c:5916
+msgid "remove a foreign server descriptor"
+msgstr "удалить опиÑание Ñтороннего Ñервера"
+
+#: sql_help.c:5922
+msgid "remove extended statistics"
+msgstr "удалить раÑширенную ÑтатиÑтику"
+
+#: sql_help.c:5928
+msgid "remove a subscription"
+msgstr "удалить подпиÑку"
+
+#: sql_help.c:5934
+msgid "remove a table"
+msgstr "удалить таблицу"
+
+#: sql_help.c:5940
+msgid "remove a tablespace"
+msgstr "удалить табличное проÑтранÑтво"
+
+#: sql_help.c:5946
+msgid "remove a text search configuration"
+msgstr "удалить конфигурацию текÑтового поиÑка"
+
+#: sql_help.c:5952
+msgid "remove a text search dictionary"
+msgstr "удалить Ñловарь текÑтового поиÑка"
+
+#: sql_help.c:5958
+msgid "remove a text search parser"
+msgstr "удалить анализатор текÑтового поиÑка"
+
+#: sql_help.c:5964
+msgid "remove a text search template"
+msgstr "удалить шаблон текÑтового поиÑка"
+
+#: sql_help.c:5970
+msgid "remove a transform"
+msgstr "удалить преобразование"
+
+#: sql_help.c:5976
+msgid "remove a trigger"
+msgstr "удалить триггер"
+
+#: sql_help.c:5982
+msgid "remove a data type"
+msgstr "удалить тип данных"
+
+#: sql_help.c:5994
+msgid "remove a user mapping for a foreign server"
+msgstr "удалить ÑопоÑтавление Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñтороннего Ñервера"
+
+#: sql_help.c:6000
+msgid "remove a view"
+msgstr "удалить предÑтавление"
+
+#: sql_help.c:6012
+msgid "execute a prepared statement"
+msgstr "выполнить подготовленный оператор"
+
+#: sql_help.c:6018
+msgid "show the execution plan of a statement"
+msgstr "показать план Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°"
+
+#: sql_help.c:6024
+msgid "retrieve rows from a query using a cursor"
+msgstr "получить результат запроÑа через курÑор"
+
+#: sql_help.c:6030
+msgid "define access privileges"
+msgstr "определить права доÑтупа"
+
+#: sql_help.c:6036
+msgid "import table definitions from a foreign server"
+msgstr "импортировать Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ† Ñо Ñтороннего Ñервера"
+
+#: sql_help.c:6042
+msgid "create new rows in a table"
+msgstr "добавить Ñтроки в таблицу"
+
+#: sql_help.c:6048
+msgid "listen for a notification"
+msgstr "ожидать уведомлениÑ"
+
+#: sql_help.c:6054
+msgid "load a shared library file"
+msgstr "загрузить файл разделÑемой библиотеки"
+
+#: sql_help.c:6060
+msgid "lock a table"
+msgstr "заблокировать таблицу"
+
+#: sql_help.c:6066
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "добавление, изменение или удаление Ñтрок таблицы по уÑловию"
+
+#: sql_help.c:6072
+msgid "position a cursor"
+msgstr "уÑтановить курÑор"
+
+#: sql_help.c:6078
+msgid "generate a notification"
+msgstr "Ñгенерировать уведомление"
+
+#: sql_help.c:6084
+msgid "prepare a statement for execution"
+msgstr "подготовить оператор Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ"
+
+#: sql_help.c:6090
+msgid "prepare the current transaction for two-phase commit"
+msgstr "подготовить текущую транзакцию Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации"
+
+#: sql_help.c:6096
+msgid "change the ownership of database objects owned by a database role"
+msgstr "изменить владельца объектов БД, принадлежащих заданной роли"
+
+#: sql_help.c:6102
+msgid "replace the contents of a materialized view"
+msgstr "заменить Ñодержимое материализованного предÑтавлениÑ"
+
+#: sql_help.c:6108
+msgid "rebuild indexes"
+msgstr "переÑтроить индекÑÑ‹"
+
+#: sql_help.c:6114
+msgid "release a previously defined savepoint"
+msgstr "оÑвободить ранее определённую точку ÑохранениÑ"
+
+#: sql_help.c:6120
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "воÑÑтановить иÑходное значение параметра выполнениÑ"
+
+#: sql_help.c:6126
+msgid "remove access privileges"
+msgstr "удалить права доÑтупа"
+
+#: sql_help.c:6138
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "отменить транзакцию, подготовленную ранее Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации"
+
+#: sql_help.c:6144
+msgid "roll back to a savepoint"
+msgstr "откатитьÑÑ Ðº точке ÑохранениÑ"
+
+#: sql_help.c:6150
+msgid "define a new savepoint within the current transaction"
+msgstr "определить новую точку ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² текущей транзакции"
+
+#: sql_help.c:6156
+msgid "define or change a security label applied to an object"
+msgstr "задать или изменить метку безопаÑноÑти, применённую к объекту"
+
+#: sql_help.c:6162 sql_help.c:6216 sql_help.c:6252
+msgid "retrieve rows from a table or view"
+msgstr "выбрать Ñтроки из таблицы или предÑтавлениÑ"
+
+#: sql_help.c:6174
+msgid "change a run-time parameter"
+msgstr "изменить параметр выполнениÑ"
+
+#: sql_help.c:6180
+msgid "set constraint check timing for the current transaction"
+msgstr "уÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ограничений Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ транзакции"
+
+#: sql_help.c:6186
+msgid "set the current user identifier of the current session"
+msgstr "задать идентификатор текущего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² текущем ÑеанÑе"
+
+#: sql_help.c:6192
+msgid ""
+"set the session user identifier and the current user identifier of the "
+"current session"
+msgstr ""
+"задать идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑеанÑа и идентификатор текущего "
+"Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² текущем ÑеанÑе"
+
+#: sql_help.c:6198
+msgid "set the characteristics of the current transaction"
+msgstr "задать ÑвойÑтва текущей транзакции"
+
+#: sql_help.c:6204
+msgid "show the value of a run-time parameter"
+msgstr "показать значение параметра выполнениÑ"
+
+#: sql_help.c:6222
+msgid "empty a table or set of tables"
+msgstr "опуÑтошить таблицу или набор таблиц"
+
+#: sql_help.c:6228
+msgid "stop listening for a notification"
+msgstr "прекратить ожидание уведомлений"
+
+#: sql_help.c:6234
+msgid "update rows of a table"
+msgstr "изменить Ñтроки таблицы"
+
+#: sql_help.c:6240
+msgid "garbage-collect and optionally analyze a database"
+msgstr "произвеÑти Ñборку муÑора и проанализировать базу данных"
+
+#: sql_help.c:6246
+msgid "compute a set of rows"
+msgstr "получить набор Ñтрок"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 можно иÑпользовать только в неинтерактивном режиме"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Введите \"help\", чтобы получить Ñправку.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "не удалоÑÑŒ уÑтановить параметр печати \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "лишний аргумент \"%s\" проигнорирован"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "не удалоÑÑŒ найти Ñвой иÑполнÑемый файл"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"ошибка запроÑа Tab-дополнениÑ: %s\n"
+"ЗапроÑ:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr ""
+"нераÑпознанное значение \"%s\" Ð´Ð»Ñ \"%s\": ожидалоÑÑŒ булевÑкое значение"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "неправильное значение \"%s\" Ð´Ð»Ñ \"%s\": ожидалоÑÑŒ целое"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "неправильное Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"нераÑпознанное значение \"%s\" Ð´Ð»Ñ \"%s\"\n"
+"ДопуÑтимые значениÑ: %s."
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m"
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m"
+
+#~ msgid "Source code"
+#~ msgstr "ИÑходный код"
+
+#~ msgid "text"
+#~ msgstr "текÑÑ‚"
+
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ COPY"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "где допуÑтимое направление пуÑтое или:"
+
+#~ msgid "timezone"
+#~ msgstr "чаÑовой_поÑÑ"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "The server (version %s) does not support editing function source."
+#~ msgstr ""
+#~ "Сервер (верÑÐ¸Ñ %s) не поддерживает редактирование иÑходного кода функции."
+
+#~ msgid "The server (version %s) does not support editing view definitions."
+#~ msgstr ""
+#~ "Сервер (верÑÐ¸Ñ %s) не поддерживает редактирование Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ "
+#~ "предÑтавлениÑ."
+
+#~ msgid "The server (version %s) does not support showing function source."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает вывод иÑходного кода функции."
+
+#~ msgid "The server (version %s) does not support showing view definitions."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает вывод Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ñтавлений."
+
+#~ msgid "unexpected result status for \\watch"
+#~ msgstr "неожиданное ÑоÑтоÑние результата Ð´Ð»Ñ \\watch"
+
+#~ msgid ""
+#~ "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+#~ msgstr ""
+#~ "Сервер (верÑÐ¸Ñ %s) не поддерживает точки ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ON_ERROR_ROLLBACK."
+
+#~ msgid "The server (version %s) does not support tablespaces."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает табличные проÑтранÑтва."
+
+#~ msgid ""
+#~ "The server (version %s) does not support altering default privileges."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает изменение прав по умолчанию."
+
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "Специальное отношение \"%s.%s\""
+
+#~ msgid "Disabled triggers:"
+#~ msgstr "Отключённые триггеры:"
+
+#~ msgid "The server (version %s) does not support per-database role settings."
+#~ msgstr ""
+#~ "Сервер (верÑÐ¸Ñ %s) не поддерживает назначение параметров ролей Ð´Ð»Ñ Ð±Ð°Ð· "
+#~ "данных."
+
+# skip-rule: capital-letter-first
+#~ msgid "special"
+#~ msgstr "Ñпец. отношение"
+
+#~ msgid "The server (version %s) does not support collations."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает правила ÑравнениÑ."
+
+#~ msgid "The server (version %s) does not support full text search."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает полнотекÑтовый поиÑк."
+
+#~ msgid "The server (version %s) does not support foreign-data wrappers."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает обёртки Ñторонних данных."
+
+#~ msgid "The server (version %s) does not support foreign servers."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает Ñторонние Ñерверы."
+
+#~ msgid "The server (version %s) does not support user mappings."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает ÑопоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹."
+
+#~ msgid "The server (version %s) does not support foreign tables."
+#~ msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает Ñторонние таблицы."
+
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID ФÐЙЛ\n"
+#~ " \\lo_import ФÐЙЛ [КОММЕÐТÐРИЙ]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID операции Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ объектами\n"
+
+#~ msgid "Enter new password: "
+#~ msgstr "Введите новый пароль: "
+
+#~ msgid ""
+#~ "All connection parameters must be supplied because no database connection "
+#~ "exists"
+#~ msgstr ""
+#~ "Без Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных необходимо указывать вÑе параметры "
+#~ "подключениÑ"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: %s"
+
+#~ msgid "could not connect to server: %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу: %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid ""
+#~ " \\g [FILE] or ; execute query (and send results to file or |"
+#~ "pipe)\n"
+#~ msgstr ""
+#~ " \\g [ФÐЙЛ] или ; выполнить запроÑ\n"
+#~ " (и направить результаты в файл или канал |)\n"
+
+#~ msgid "from_list"
+#~ msgstr "ÑпиÑок_FROM"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %s"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \\%s. Справка по командам: \\?\n"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "normal"
+#~ msgstr "обычнаÑ"
+
+#~ msgid "Procedure"
+#~ msgstr "Процедура"
+
+#~ msgid " SERVER_VERSION_NAME server's version (short string)\n"
+#~ msgstr " SERVER_VERSION_NAME верÑÐ¸Ñ Ñервера (ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ°Ñ Ñтрока)\n"
+
+#~ msgid " VERSION psql's version (verbose string)\n"
+#~ msgstr " VERSION верÑÐ¸Ñ psql (Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ð½ÑƒÑ‚Ð°Ñ Ñтрока)\n"
+
+#~ msgid " VERSION_NAME psql's version (short string)\n"
+#~ msgstr " VERSION_NAME верÑÐ¸Ñ psql (ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ°Ñ Ñтрока)\n"
+
+#~ msgid " VERSION_NUM psql's version (numeric format)\n"
+#~ msgstr " VERSION_NUM верÑÐ¸Ñ psql (в чиÑловом формате)\n"
+
+#~ msgid "attribute"
+#~ msgstr "атрибут"
+
+#~ msgid "statistic_type"
+#~ msgstr "тип_ÑтатиÑтики"
+
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr ""
+#~ "Это верÑÐ¸Ñ Ñервера не поддерживает параметры ролей на уровне базы "
+#~ "данных.\n"
+
+#~ msgid "No matching settings found.\n"
+#~ msgstr "СоответÑтвующие параметры не найдены.\n"
+
+#~ msgid "No settings found.\n"
+#~ msgstr "Параметры не найдены.\n"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "СоответÑтвующие Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ найдены.\n"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "ÐžÑ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ найдены.\n"
+
+#~ msgid "Object Description"
+#~ msgstr "ОпиÑание объекта"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Ошибка при шифровании паролÑ.\n"
+
+#~ msgid "suboption"
+#~ msgstr "подпараметр"
+
+#~ msgid "where suboption can be:"
+#~ msgstr "где допуÑтимые подпараметры:"
+
+#~ msgid "slot_name"
+#~ msgstr "имÑ_Ñлота"
+
+#~ msgid "puboption"
+#~ msgstr "параметр_публикации"
+
+#~ msgid "where puboption can be:"
+#~ msgstr "где допуÑтимый параметр_публикации:"
+
+#~ msgid "+ opt(%d) = |%s|\n"
+#~ msgstr "+ opt(%d) = |%s|\n"
+
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "\\%s: не удалоÑÑŒ уÑтановить переменную\n"
+
+#~ msgid "could not set variable \"%s\"\n"
+#~ msgstr "не удалоÑÑŒ уÑтановить переменную \"%s\"\n"
+
+#~ msgid "Modifiers"
+#~ msgstr "Модификаторы"
+
+#~ msgid "collate %s"
+#~ msgstr "правило Ñортировки %s"
+
+#~ msgid "not null"
+#~ msgstr "NOT NULL"
+
+#~ msgid "default %s"
+#~ msgstr "DEFAULT %s"
+
+#~ msgid "Modifier"
+#~ msgstr "Модификатор"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: не удалоÑÑŒ уÑтановить переменную \"%s\"\n"
+
+#~ msgid "\\crosstabview: query must return results to be shown in crosstab\n"
+#~ msgstr ""
+#~ "\\crosstabview: Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ возвращать результаты Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° в "
+#~ "перекрёÑтном виде\n"
+
+#~ msgid "\\crosstabview: invalid column number: \"%s\"\n"
+#~ msgstr "\\crosstabview: неверный номер Ñтолбца: \"%s\"\n"
+
+#~ msgid "serialtype"
+#~ msgstr "Ñериализованный_тип"
+
+#~ msgid "Watch every %lds\t%s"
+#~ msgstr "Повтор Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‡ÐµÑ€ÐµÐ· %ld Ñек.\t%s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Display influencing variables:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Рабочие параметры:\n"
+
+#~ msgid " unicode_border_linestyle\n"
+#~ msgstr " unicode_border_linestyle\n"
+
+#~ msgid " unicode_column_linestyle\n"
+#~ msgstr " unicode_column_linestyle\n"
+
+#~ msgid "column_name_index"
+#~ msgstr "индекÑ_по_имени_Ñтолбца"
+
+#~ msgid "expression_index"
+#~ msgstr "индекÑ_по_выражению"
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "SSL-Ñоединение (шифр неизвеÑтен)\n"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Ðет запиÑей)\n"
+
+#~ msgid "where view_option_name can be one of:"
+#~ msgstr "где допуÑтимое имÑ_параметра_предÑтавлениÑ:"
+
+#~ msgid "local"
+#~ msgstr "local"
+
+#~ msgid "cascaded"
+#~ msgstr "cascaded"
+
+#~ msgid "Border style (%s) unset.\n"
+#~ msgstr "Стиль границ (%s) Ñброшен.\n"
+
+#~ msgid "Output format (%s) is aligned.\n"
+#~ msgstr "Формат вывода (%s): выровненный.\n"
+
+#~ msgid "invfunc"
+#~ msgstr "обр_функциÑ"
+
+#~ msgid ""
+#~ "change the definition of a tablespace or affect objects of a tablespace"
+#~ msgstr "изменить определение или Ñодержимое табличного проÑтранÑтва"
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "ЧиÑла выводÑÑ‚ÑÑ Ð² локализованном формате."
+
+#~ msgid "Showing only tuples."
+#~ msgstr "ВыводÑÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ кортежи."
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "не удалоÑÑŒ узнать Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ: %s\n"
+
+#~ msgid "agg_name"
+#~ msgstr "агр_функциÑ"
+
+#~ msgid "agg_type"
+#~ msgstr "агр_тип"
+
+#~ msgid "input_data_type"
+#~ msgstr "тип_входных_данных"
+
+#~ msgid "%s: -1 is incompatible with -c and -l\n"
+#~ msgstr "%s: -1 неÑовмеÑтимо Ñ -c и -l\n"
+
+#~ msgid "column"
+#~ msgstr "Ñтолбец"
+
+#~ msgid "new_column"
+#~ msgstr "новаÑ_Ñтолбец"
+
+#~ msgid "tablespace"
+#~ msgstr "табл_проÑтранÑтво"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "ошибка \\%s\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy: %s"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "включает поддержку Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ Ñтроки"
+
+#~ msgid "data type"
+#~ msgstr "тип данных"
diff --git a/src/bin/psql/po/sv.po b/src/bin/psql/po/sv.po
new file mode 100644
index 0000000..2293529
--- /dev/null
+++ b/src/bin/psql/po/sv.po
@@ -0,0 +1,6593 @@
+# Swedish message translation file for psql
+# Peter Eisentraut <peter_e@gmx.net>, 2001, 2009, 2010.
+# Dennis Björklund <db@zigo.dhs.org>, 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+# Use these quotes: "%s"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-02 08:16+0000\n"
+"PO-Revision-Date: 2023-08-02 12:20+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "ogiltig binär \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "kunde inte läsa binär \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "kunde inte hitta en \"%s\" att köra"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() misslyckades: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "kunde inte slå upp effektivt användar-id %ld: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "användaren finns inte"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "misslyckad sökning efter användarnamn: felkod %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "kommandot är inte körbart"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "kommandot kan ej hittas"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "barnprocess avslutade med kod %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "barnprocess terminerades med avbrott 0x%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "barnprocess terminerades av signal %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "barnprocess avslutade med okänd statuskod %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Förfrågan om avbrytning skickad\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Kunde inte skicka förfrågan om avbrytning: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu rad)"
+msgstr[1] "(%lu rader)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Avbruten\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ogiltigt utdataformat (internt fel): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "hoppar över rekursiv expandering av variabeln \"%s\""
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "kunde inte slå upp lokalt användar-id %d: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "lokal användare med ID %d existerar inte"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "ogiltigt kommando \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Försök med \\? för hjälp."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: extra argument \"%s\" ignorerat"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "kommandot \\%s ignorerat; använd \\endif eller Ctrl-C för att avsluta nuvarande \\if-block"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "kunde inte hämta hemkatalog för användar-ID %ld: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: kunde inte byta katalog till \"%s\": %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Du är för närvarande inte uppkopplad mot en databas.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på adress \"%s\" på port \"%s\".\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Du är uppkopplad mot databas \"%s\" som användare \"%s\" via uttag i \"%s\" på port \"%s\".\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på värd \"%s\" (adress \"%s\") på port \"%s\".\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" på värd \"%s\" på port \"%s\".\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "ingen frågebuffert"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "ogiltigt radnummer: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Inga ändringar"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: ogiltigt kodningsnamn eller konverteringsprocedur hittades inte"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "Det finns inget tidigare fel."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: saknar höger parentes"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: obligatoriskt argument saknas"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: kan inte komma efter \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: ingen matchande \\if"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: kan inte komma efter \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: ingen matchande \\if"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: ingen matchande \\if"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "Frågebufferten är tom."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Mata in nytt lösenord för användare \"%s\": "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Mata in det igen: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Lösenorden stämde inte överens."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: kunde inte läsa värde på varibeln"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Frågebufferten har blivit borttagen."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Skrev historiken till fil \"%s\".\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: omgivningsvariabelnamn får ej innehålla \"=\""
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "funktionsnamn krävs"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "vynamn krävs"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Tidtagning är på."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Tidtagning är av."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: värde på intervall angivet mer än en gång"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: inkorrekt intervallvärde \"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: iterationsantal angivet mer än en gång"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: inkorrekt iterationsantal \"%s\""
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: okänd parameter \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Lösenord för användare %s: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Ange inte användare, värd eller port separat tillsammans med en anslutningssträng"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Det finns ingen anslutning att återanvända parametrar från"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Föregående anslutning bevarad"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på adress \"%s\" på port \"%s\".\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" via uttag i \"%s\" på port \"%s\".\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på värd \"%s\" (adress \"%s\") på port \"%s\".\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" på värd \"%s\" på port \"%s\".\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\".\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, server %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"VARNING: %s huvudversion %s, server huvudversion %s.\n"
+" En del psql-finesser kommer kanske inte fungera.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL-anslutning (protokoll: %s, krypto: %s, komprimering: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "okänd"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "av"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "på"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI-krypterad anslutning\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"VARNING: Konsollens \"code page\" (%u) skiljer sig fån Windows \"code page\" (%u)\n"
+" 8-bitars tecken kommer troligen inte fungera korrekt. Se psql:s\n"
+" referensmanual i sektionen \"Notes for Windows users\" för mer detaljer.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "omgivningsvariabeln PSQL_EDITOR_LINENUMBER_ARG måste ange ett radnummer"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "kunde inte starta editorn \"%s\""
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "kunde inte starta /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "kunde inte hitta temp-katalog: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "kunde inte öppna temporär fil \"%s\": %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: tvetydig förkortning \"%s\" matchar både \"%s\" och \"%s\""
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: tillåtna format är aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: tillåtna linjestilar är ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: tillåtna Unicode-ramstilar är single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: tillåtna Unicode-kolumnlinjestilar ärsingle, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: tillåtna Unicode-rubriklinjestilar är single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: tillåtna värden på xheader_width är \"%s\" (standard), \"%s\", \"%s\" eller ett tal som anger exakt vidd"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep måste vara ett ensamt en-byte-tecken"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldset kan inte vara dubbelcitat, nyrad eller vagnretur"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: okänd parameter: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Ramstil är %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Målvidd är inte satt.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Målvidd är %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Utökad visning är på.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Utökad visning används automatiskt.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Utökad visning är av.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "Expanderad rubrikvidd är \"%s\".\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "Expanderad rubrikvidd är %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Fältseparatorn för CSV är \"%s\".\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Fältseparatorn är noll-byte.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Fältseparatorn är \"%s\".\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Standard sidfot är på.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Standard sidfot är av.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Utdataformatet är \"%s\".\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Linjestil är %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null-visare är \"%s\".\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Lokal-anpassad numerisk utdata är på.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Lokal-anpassad numerisk utdata är av.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Siduppdelare är på för lång utdata.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Siduppdelare används alltid.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Siduppdelare är av.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Siduppdelare kommer inte användas för färre än %d linje.\n"
+msgstr[1] "Siduppdelare kommer inte användas för färre än %d linjer.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Postseparatorn är noll-byte.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Postseparatorn är <nyrad>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Postseparatorn är \"%s\".\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Tabellattributen är \"%s\".\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Tabellattributen är ej satta.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Titeln är \"%s\".\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Titeln är inte satt.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Visa bara tupler är på.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Visa bara tupler är av.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode-ramstil är \"%s\".\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode-kolumnLinjestil är \"%s\".\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode-rubriklinjestil är \"%s\".\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: misslyckades"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch kan inte användas på en tom fråga"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "kunde inte sätta timer: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (varje %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (varje %gs)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "kunde inte vänta på signaler: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* FRÃ…GA **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" är inte en vy"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "kunde inte parsa arrayen reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "kan inte escape:a utan en aktiv uppkoppling"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "shell-kommandots argument innehåller nyrad eller vagnretur: \"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "uppkopplingen till servern har brutits"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Anslutningen till servern har brutits. Försöker starta om: "
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Misslyckades.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Lyckades.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "oväntad PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Tid: %.3f ms\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Tid: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Tid: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Tid: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Du är för närvarande inte uppkopplad mot en databas."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "Asynkron notificering \"%s\" mottagen med innehåll \"%s\" från serverprocess med PID %d.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "Asynkron notificering \"%s\" mottagen från serverprocess med PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "kunde inte visa resultatabell: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "inga rader returnerades för \\gset"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "mer än en rad returnerades för \\gset"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "försök att utföra \\gset in i en speciellt hanterad variabel \"%s\" hoppas över"
+
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Stegningsläge: Verifiera kommando)*******************************************\n"
+"%s\n"
+"***(tryck return för att fortsätta eller skriv x och return för att avbryta)*****\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "SATS: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "oväntad transaktionsstatus (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Kolumn"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Typ"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Kommandot hade inget resultat eller så hade resultatet inga kolumner.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: argument krävs"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: parsfel vid \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: parsfel vid radslutet"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "kunde inte köra kommandot \"%s\": %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: kan inte kopiera från/till en katalog"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "kunde inte stänga rör till externt komamndo: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "kunde inte skriva COPY-data: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY-överföring av data misslyckades: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "avbruten av användaren"
+
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"Mata in data som skall kopieras följt av en nyrad.\n"
+"Avsluta med bakstreck och en punkt ensamma på en rad eller av en EOF."
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "avbruten på grund av läsfel"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "försöker avsluta kopieringsläge"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: satsen returnerade ingen resultatmängd"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: frågan måste returnera minst tre kolumner"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: vertikala och horisontala rubriker måste vara olika kolumner"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: datakolumn måste anges när frågan returnerar mer än tre kolumner"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: maximalt antal kolumner (%d) överskridet"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: frågeresultatet innehåller multipla värden för rad \"%s\", kolumn \"%s\""
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: kolumnnummer %d är utanför giltigt intervall 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: tvetydigt kolumnnamn: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: hittar ej kolumnnamn: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Schema"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Namn"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Resultatdatatyp"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Argumentdatatyp"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "Beskrivning"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Lista med aggregatfunktioner"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Servern (version %s) stöder inte accessmetoder."
+
+#: describe.c:168
+msgid "Index"
+msgstr "Index"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "Tabell"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Hanterare"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "Lista med accessmetoder"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "Ägare"
+
+#: describe.c:231
+msgid "Location"
+msgstr "Plats"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Alternativ"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Storlek"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "Lista med tabellutrymmen"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df tar bara [anptwS+] som flaggor"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df tar inte en \"%c\"-flagga med serverversion %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "fönster"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "funk"
+
+# Vi väljer att bevara den engelska termen då det dels refererar till kommandot CREATE TRIGGER
+# och dels för att detta begreppet normalt benäms som triggers i dagligt tal i Sverige.
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "trigger"
+
+# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+# Vi väljer att bevara den engelska termen då det refererar till en del av CREATE FUNCTION-syntaxen
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "Flyktighet"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "begränsad"
+
+#: describe.c:398
+msgid "safe"
+msgstr "säker"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "osäker"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "Parallell"
+
+#: describe.c:405
+msgid "definer"
+msgstr "definierare"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "anropare"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Säkerhet"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Språk"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Internt namn"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "Lista med funktioner"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Element"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "Lista med datatyper"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Vänster argumenttyp"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Höger argumenttyp"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Resultattyp"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "Funktion"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "Lista med operatorer"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "Kodning"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "Lokalleverantör"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Jämförelse"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICU-lokal"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "ICU-regler"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Tabellutrymme"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "Lista med databaser"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "tabell"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "vy"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "materialiserad vy"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "sekvens"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "främmande tabell"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "partitionerad tabell"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Kolumnrättigheter"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Policys"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Åtkomsträttigheter"
+
+#: describe.c:1195
+msgid "function"
+msgstr "funktion"
+
+#: describe.c:1197
+msgid "type"
+msgstr "typ"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "schema"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Standard accessrättigheter"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Objekt"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "tabellvillkor"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "domänvillkor"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "operatorklass"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "operatorfamilj"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "rule"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "Objektbeskrivningar"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Kunde inte hitta en relation med namn \"%s\"."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "Kunde inte hitta några relationer."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Kunde inte hitta en relation med OID %s."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Start"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Minimum"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "Maximum"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "Ökning"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "ja"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "nej"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "Cyklisk?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "Cache"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "Ägd av: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Sekvens för identitetskolumn: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "Ologgat sekvens \"%s.%s\""
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sekvens \"%s.%s\""
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Ologgad tabell \"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tabell \"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "Vy \"%s.%s\""
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Ologgad materialiserad vy \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Materialiserad vy \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ologgat index \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Index \"%s.%s\""
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Ologgat partitionerat index \"%s.%s\""
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Partitionerat index \"%s.%s\""
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST-tabell \"%s.%s\""
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Sammansatt typ \"%s.%s\""
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Främmande tabell \"%s.%s\""
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Ologgad partitionerad tabell \"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Partitionerad tabell \"%s.%s\""
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "Jämförelse"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "Nullbar"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "Standard"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Nyckel?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "Definition"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "FDW-alternativ"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Lagring"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "Komprimering"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "Statistikmål"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Partition av: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "Inget partitioneringsvillkor"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Partitioneringsvillkor: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Partitioneringsnyckel: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "Ägande tabell \"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "primärnyckel, "
+
+#: describe.c:2318
+msgid "unique"
+msgstr "unik"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " null-värden ej distinkta"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "för tabell \"%s.%s\""
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predikat (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", klustrad"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", ogiltig"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", uppskjutbar"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", initialt uppskjuten"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", replikaidentitet"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "Index:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "Kontrollvillkor:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "Främmande nyckel-villkor:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "Refererad av:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Policys:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Policys (tvingad radsäkerhet påslagen):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Policys (radsäkerhet påslagna): (ingen)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Policys (tvingad radsäkerhet påslagen): (ingen)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Policys (radsäkerhet avstängd):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Statistikobjekt:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Regler:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Avstängda regler:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Regler som alltid utförs:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Regler som utförs enbart på replika:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Publiceringar:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Vydefinition:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Triggrar:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Avstängda användartriggrar:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Avstängda interna triggrar:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Triggrar som alltid körs:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Triggrar som enbart körs på replika:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Server: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW-alternativ: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "Ärver"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Antal partitioner: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Antal partitioner: %d (Använd \\d+ för att lista dem.)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "Antal barntabeller: %d (Använd \\d+ för att lista dem.)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Barntabeller"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Partitioner"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Typad tabell av typ: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "Replikaidentitet"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Har OID:er: ja"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Accessmetod: %s"
+
+#: describe.c:3585
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "Tabellutrymme: \"%s\""
+
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3597
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tabellutrymme: \"%s\""
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "Lista med roller"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Rollnamn"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Attribut"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "Superanvändare"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Inget arv"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Skapa roll"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Skapa DB"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Kan inte logga in"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "Replikering"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Hopp över RLS"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Inga uppkopplingar"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d uppkoppling"
+msgstr[1] "%d uppkopplingar"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Lösenord giltigt till "
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Roll"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "Databas"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Inställningar"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Kunde inte hitta några inställningar för roll \"%s\" och databas \"%s\"."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Kunde inte hitta några inställningar för roll \"%s\"."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Kunde inte hitta några inställningar."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "Lista med inställningar"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Medlem av"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Rättighetsutdelare"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Lista med roll-rättigheter"
+
+#: describe.c:3952
+msgid "index"
+msgstr "index"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST-tabell"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "partitionerat index"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "permanent"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "temporär"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "ologgad"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "Persistens"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Accessmetod"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "Lista med relationer"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Servern (version %s) stöder inte deklarativ tabellpartitionering."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "Lista med partitionerade index"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "Lista med partitionerade tabeller"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "Lista med partitionerade relationer"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "Föräldranamn"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Partitionsstorlek av löv"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Total storlek"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Tillförlitlig"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Internt språk"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Anropshanterare"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Validerare"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Inline-hanterare"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "Lista med språk"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Lista med domäner"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Källa"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "MÃ¥l"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "Standard?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "Lista med konverteringar"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Parameter"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "Värde"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "Kontext"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "Lista med konfigurationsparametrar"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "Lista med icke-defaulta konfigurationsparametrar"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Servern (version %s) stöder inte händelsetriggrar."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "Händelse"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "påslagen"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "replika"
+
+#: describe.c:4658
+msgid "always"
+msgstr "alltid"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "avstängd"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "PÃ¥slagen"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Etiketter"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "Lista med händelsetriggrar"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Servern (version %s) stöder inte utökad statistik."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Nunika"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "Beroenden"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "Lista med utökad statistik"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Källtyp"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "MÃ¥ltyp"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "i tilldelning"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Implicit?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "Lista med typomvandlingar"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "Leverantör"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Deterministisk?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "Lista med jämförelser (collations)"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Lista med scheman"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "Lista med textsökparsrar"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Kunde inte hitta en textsökparser med namn \"%s\"."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Kunde inte hitta några textsökparsrar."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Starta parsning"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Metod"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Hämta nästa symbol"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Avsluta parsning"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Hämta rubrik"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Hämta symboltyper"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Textsökparser \"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "Textsökparser \"%s\""
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Symbolnamn"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Symboltyper för parser \"%s.%s\""
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Symboltyper för parser \"%s\""
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Mall"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Initieringsalternativ"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "Lista med textsökordlistor"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Symboluppdelning"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "Lista med textsökmallar"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "Lista med textsökkonfigurationer"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Kunde inte hitta en textsökkonfiguration med namn \"%s\"."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Kunde inte hitta några textsökkonfigurationer."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Symbol"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Ordlistor"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Textsökkonfiguration \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Textsökkonfiguration \"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Parser: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Parser: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "Lista med främmande data-omvandlare"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Främmande data-omvandlare"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "Version"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "Lista med främmande servrar"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Server"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Användarnamn"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "Lista av användarmappningar"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "Lista med främmande tabeller"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "Lista med installerade utökningar"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Kunde inte hitta en utökning med namn \"%s\"."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Kunde inte hitta några utökningar."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "Objektbeskrivning"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Objekt i utökning \"%s\""
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ej korrekt kvalificerat namn (för många namn med punkt): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "referenser till andra databaser är inte implementerat: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Servern (version %s) stöder inte publiceringar."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "Alla tabeller"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Insättningar"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "Uppdateringar"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "Borttagningar"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "Trunkeringar"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "Lista med publiceringar"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Kunde inte hitta någon publicering med namn \"%s\"."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Kunde inte hitta några publiceringar."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "Publicering %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Tabeller:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Tabeller från scheman:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Denna server (version %s) stöder inte prenumerationer."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "Publicering"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Binär"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "Strömmande"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Tvåfas-commit"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "Stäng av vid fel"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Ursprung"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Lösenord krävs"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "Kör som ägare?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Synkron commit"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Anslutningsinfo"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "Skippa LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "Lista med prenumerationer"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Indatatyp"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Lagringstyp"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "Operatorklass"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "Operatorfamilj"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "Lista med operatorklasser"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Applicerbara typer"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "Lista med operatorfamiljer"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Operator"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "Strategi"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "ordning"
+
+#: describe.c:6911
+msgid "search"
+msgstr "sök"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Ändamål"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "Sortering-opfamilj"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "Lista med operatorer i operatorfamiljer"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "Registrerad vänstertyp"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "Registrerad högertyp"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "Nummer"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "Lista med supportfunktioner i operatorfamiljer"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Stora objekt"
+
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql är den interaktiva PostgreSQL-terminalen.\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [FLAGGA]... [DBNAMN [ANVÄNDARNAMN]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "Allmänna flaggor:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=KOMMANDO kör ett kommando (SQL eller internt) och avsluta sedan\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAMN databasnamn att koppla upp mot (standard: \"%s\")\n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILNAMN kör kommandon från fil och avsluta sedan\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list lista befintliga databaser och avsluta sedan\n"
+
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variale=NAMN=VÄRDE\n"
+" sätt psql-variabel NAMN till VÄRDE\n"
+" (t.ex. -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc läs inte startfilen (~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"ett\"), --single-transaction\n"
+" kör kommandofilen som en transaktion (om icke-interaktiv)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=alternativ] visa denna hjälp, avsluta sedan\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands lista bakstreck-kommandon, avsluta sedan\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variabler lista speciella variabler, avsluta sedan\n"
+
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Flaggor för in-/utmatning:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all visa all indata från skript\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors visa misslyckade kommandon\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries visa kommandon som skickas till servern\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden visa frågor som interna kommandon skapar\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME skicka sessions-logg till fil\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline slå av förbättrad kommandoradsredigering (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILNAMN skriv frågeresultat till fil (eller |rör)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet kör tyst (inga meddelanden, endast frågeutdata)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step stegningsläge (bekräfta varje fråga)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line enradsläge (slutet på raden avslutar SQL-kommando)\n"
+
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Flaggor för utdataformat:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align ojusterad utskrift av tabeller\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV-utmarningsläge (kommaseparerade värden)\n"
+
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRÄNG\n"
+" fältseparator för icke justerad utdata (standard: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML-utskrift av tabeller\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] sätt utskriftsvariabel VAR till ARG (se kommando \\pset)\n"
+
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRÄNG\n"
+" sätt postseparator för icke justerad utdata (standard: newline)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only visa endast rader\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT sätt HTML-tabellers flaggor (t.ex. width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded slå på utökad utsrift av tabeller\n"
+
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" sätt fältseparator för icke justerad utdata till noll-byte\n"
+
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator=zero\n"
+" sätt postseparator för icke justerad utdata till noll-byte\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr ""
+" -h, --host=VÄRDNAMN databasens värdnamn eller uttagkatalog (socket)\n"
+" (standard: \"%s\")\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "lokalt uttag (socket)"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT databasens serverport (standard: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=ANVNAMN användarnamn för databasen (standard: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga aldrig efter lösenord\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password fråga om lösenord (borde ske automatiskt)\n"
+
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"För mer information, skriv \"\\?\" (för interna kommandon) eller\n"
+"\"\\help\" (för SQL-kommandon) i psql, eller läs avsnittet om psql\n"
+"i PostgreSQL-dokumentationen.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Allmänna\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... sätt frågeparameter\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright visa PostgreSQL-upphovsrättsinformation\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [KOLUMNER] kör fråga och visa resultatet i en korstabell\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose visa senste felmeddelande vid maximal verbositet\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(FLAGGOR)] [FIL] kör frågan (och skicka resultatet till fil eller |rör);\n"
+" \\g utan argument är samma som ett semikolon\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc beskriv resultatet av fråga utan att köra den\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec kör fråga, kör sen varje värde i resultatet\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] kör frågan och spara resultatet i psql-variabler\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(FLAGGOR)] [FIL] som \\g, men tvinga expanderat utmatningsläge\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q avsluta psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEK] [c=N] kör fråga var SEK sekund, upp till N gånger\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Hjälp\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [kommandon] visa hjälp om backstreckkommandon\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options visa hjälp för psqls kommandoradflaggor\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables visa hjälp om speciella variabler\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAMN] hjälp med syntaxen för SQL-kommandon, * för alla kommandon\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Frågebuffert\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FIL] [RAD] redigera frågebufferten (eller filen) med extern redigerare\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNKNAMN [RAD]] redigera funktionsdefinition med extern redigerare\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [FUNKNAMN [RAD]] redigera vydefinition med extern redigerare\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p visa innehållet i frågebufferten\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r nollställ (radera) frågebufferten\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILNAMN] visa kommandohistorien eller spara den i fil\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILNAMN skriv frågebuffert till fil\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "In-/Utmatning\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... utför SQL COPY med dataström till klientvärden\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [TEXT] skriv text till standard ut (-n för ingen nyrad)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILNAMN kör kommandon från fil\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FIL som \\i, men relativt platsen för aktuellt script\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FIL] skicka frågeresultat till fil eller |rör\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [TEXT] skriv text till \\o-utdataströmmen (-n för ingen nyrad)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [TEXT] skriv text till standard error (-n för ingen nyrad)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Villkor\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR starta villkorsblock\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR alternativ inom aktuellt villkorsblock\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else avslutningsalternativ inom aktuellt villkorsblock\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif avsluta villkorsblock\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Information\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (flaggor: S = lista systemobjekt, + = mer detaljer)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] lista tabeller, vyer och sekvenser\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAMN beskriv tabell, vy, sekvens eller index\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [MALL] lista aggregatfunktioner\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [MALL] lista accessmetoder\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista operatorklasser\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista operatorfamiljer\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista operatorer i operatorfamiljer\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista supportfunktioner i operatorfamiljer\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [MALL] lista tabellutrymmen\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [MALL] lista konverteringar\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [MALL] lista konfigurationsparametrar\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [MALL] lista typomvandlingar\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [MALL] visa objektbeskrivning som inte visas på andra ställen\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [MALL] lista domäner\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [MALL] lista standardrättigheter\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [MALL] lista främmande tabeller\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [MALL] lista främmande servrar\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [MALL] lista främmande tabeller\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [MALL] lista användarmappning\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [MALL] lista främmande data-omvandlare\n"
+
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNKMALL [TYPMALL ...]]\n"
+" lista [endast agg/normala/procedur/trigger/window] funktioner\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [MALL] lista textsökkonfigurationer\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [MALL] lista textsökordlistor\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [MALL] lista textsökparsrar\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [MALL] lista textsökmallar\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [MALL] lista roller\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [MALL] lista index\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] lista stora objekt, samma som \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [MALL] lista procedurspråk\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [MALL] lista materialiserade vyer\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [MALL] lista scheman\n"
+
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPMALL [TYPMALL [TYPMALL]]]\n"
+" lista operatorer\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [MALL] lista jämförelser (collation)\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [MALL] lista åtkomsträttigheter för tabeller, vyer och sekvenser\n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[tin+] [MALL] lista [bara tabell/index] partitionerade relationer [n=nästlad]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr ""
+" \\drds [ROLLMALL1 [DBMALL2]]\n"
+" lista rollinställningar per databas\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [MALL] lista roll-rättigheter\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [MALL] lista replikeringspubliceringar\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [MALL] lista replikeringsprenumerationer\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [MALL] lista sekvenser\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [MALL] lista tabeller\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [MALL] lista datatyper\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [MALL] lista roller\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [MALL] lista vyer\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [MALL] lista utökningar\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [MALL] lista utökad statistik\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [MALL] lista händelsetriggrar\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [MALL] lista databaser\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNKNAMN visa en funktions definition\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VYNAMN visa en vys definition\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [MALL] samma som \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Stora objekt\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FIL skriv stort objekt till fil\n"
+
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FIL [KOMMENTAR]\n"
+" läs stort objekt från fil\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] lista stora objekt\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID ta bort stort objekt\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "Formatering\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a byt mellan ojusterat och justerat utdataformat\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [TEXT] sätt tabelltitel, eller nollställ\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [TEXT] visa eller sätt fältseparatorn för ojusterad utmatning\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H slå på/av HTML-utskriftsläge (för närvarande: %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAMN [VÄRDE]] sätt utmatningsalternativ för tabeller\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] visa endast rader (för närvarande: %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [TEXT] sätt HTML-tabellens <table>-attribut, eller nollställ\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] slå på/av utökad utskrift (för närvarande: %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "Anslutning\n"
+
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n"
+" koppla upp mot ny databas (för närvarande \"%s\")\n"
+
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n"
+" koppla upp mot ny databas (för närvarande ingen uppkoppling)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo visa information om aktuell uppkoppling\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KODNING] visa eller sätt klientens teckenkodning\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [ANVÄNDARNAMN] byt användares lösenord på ett säkert sätt\n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "Operativsystem\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [KATALOG] byt den aktuella katalogen\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR hämta omgivningsvariabel\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAMN [VÄRDE] sätt eller nollställ omgivningsvariabel\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] slå på/av tidstagning av kommandon (för närvarande: %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [KOMMANDO] kör kommando i skal eller starta interaktivt skal\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Variabler\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAMN be användaren att sätta en intern variabel\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAMN [VÄRDE]] sätt intern variabel, eller lista alla om ingen param\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME ta bort intern variabel\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr "Lista av variabler som hanteras speciellt\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql-variabler:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAMN=VÄRDE\n"
+" eller \\set NAMN VÄRDE inne i psql\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" om satt så kommer efterföljande SQL-kommandon commit:as automatiskt\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" bestämmer skiftläge för att komplettera SQL-nyckelord\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" den uppkopplade databasens namn\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" bestämmer vilken indata som skrivs till standard ut\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" om satt, visa interna frågor som körs av backåtstreckkommandon:\n"
+" om satt till \"noexec\", bara visa dem utan att köra\n"
+
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" aktuell teckenkodning för klient\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" \"true\" om sista frågan misslyckades, \"false\" annars\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" antal resultatrader som hämtas och visas åt gången (0=obegränsat)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" om satt så visas inte accessmetoder\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" om satt så visas inte komprimeringsmetoder\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" styr kommandohistoriken [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" filnamn för att spara kommandohistoriken i\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" maximalt antal kommandon som sparas i kommandohistoriken\n"
+
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" den uppkopplade databasens värd\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" antal EOF som behövs för att avsluta en interaktiv session\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" värdet av den senast påverkade OID:en\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" meddelande och SQLSTATE för sista felet eller en tom sträng och \"00000\" om det inte varit fel\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" om satt, ett fel stoppar inte en transaktion (använder implicita sparpunkter)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" avsluta batchkörning vid fel\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" värdport för den aktuella uppkopplingen\n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" anger standardprompten för psql\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" anger den prompt som används om en sats forsätter på efterföljande rad\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" anger den prompt som används för COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" kör tyst (samma som flaggan -q)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" antal rader som returnerades eller påverkades av senaste frågan alternativt 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NUM\n"
+" SERVER_VERSION_NAME\n"
+" serverns version (i kort sträng eller numeriskt format)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" ERROR\n"
+" \"true\" om sista frågan misslyckades, \"false\" annars\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" exit-kod för senaste skalkommandot\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" visa alla resultat från en kombinerad fråga (\\;) istället för bara\n"
+" det sista\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" styr visning av meddelandekontextfält [never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" om satt, slut på raden avslutar SQL-kommandon (samma som flaggan -S )\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" stegningsläge (samma som flaggan -s)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" SQLSTATE för sista frågan eller \"00000\" om det inte varit fel\n"
+
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" den uppkopplade databasanvändaren\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" styr verbositet för felrapporter [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql:s version (i lång sträng, kort sträng eller numeriskt format)\n"
+
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Visningsinställningar:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAMN[=VÄRDE]\n"
+" eller \\pset NAMN [VÄRDE] inne i psql\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" ramstil (nummer)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" målvidd för wrappade format\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (eller x)\n"
+" expanderad utdata [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" fältseparator för ej justerad utdata (standard \"%s\")\n"
+
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" sätt fältseparator för ej justerad utdata till noll-byte\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" slå på/av visning av tabellfot [on, off]\n"
+
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" sätt utdataformat [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" sätt ramlinjestil [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" sätt sträng som visas istället för null-värden\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" slå på visning av lokalspecifika tecken för gruppering av siffror\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" styr när en extern pagenerare används [yes, no, always]\n"
+
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" post (rad) separator för ej justerad utdata\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" sätt postseparator för ej justerad utdata till noll-byte\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (el. T)\n"
+" ange attribut för tabelltaggen i html-format eller proportionella\n"
+" kolumnvidder för vänsterjusterade datatypet i latex-longtable-format\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" sätt tabelltitel för efterkommande tabellutskrifter\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" om satt, bara tabelldatan visas\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" sätter stilen på Unicode-linjer [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Omgivningsvariabler:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAMN=VÄRDE [NAMN=VÄRDE] psql ...\n"
+" eller \\setenv NAMN [VÄRDE] inne psql\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAMN=VÄRDE\n"
+" psql ...\n"
+" eller \\setenv NAMN [VÄRDE] inne i psql\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" antal kolumner i wrappade format\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" samma som anslutningsparametern \"application_name\"\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" samma som anslutningsparametern \"dbname\"\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" samma som anslutningsparametern \"host\"\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" lösenordsfilnamn\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" uppkoppingens lösenord (rekommenderas inte)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" samma som anslutingsparametern \"port\"\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" samma som anslutningsparametern \"user\"\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" redigerare som används av kommanona \\e, \\ef och \\ev\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" hur radnummer anges när redigerare startas\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" alternativ plats för kommandohistorikfilen\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PAGER\n"
+" namnet på den externa pageneraren\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" namn på externt paginerarprogram för \\watch\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" alternativ plats för användarens \".psqlrc\"-fil\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" skalet som används av kommandot \\!\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" katalog för temporärfiler\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "Tillgänglig hjälp:\n"
+
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Kommando: %s\n"
+"Beskrivning: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"Ingen hjälp tillgänglig för \"%s\".\n"
+"Försök med \\h utan argument för att se den tillgängliga hjälpen.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "kunde inte läsa från infilen: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "kunde inte skriva kommandohistorien till \"%s\": %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "historia stöds inte av denna installationen"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: ej uppkopplad mot en databas"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: aktuell transaktion är avbruten"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: okänd transaktionsstatus"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: escape:ad"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Använd \"\\q\" för att lämna %s.\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Indatan är en PostgreSQL-specifik dump.\n"
+"Använd kommandoradsprogrammet pg_restore för att läsa in denna dump till databasen.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Använd \\? för hjälp eller tryck control-C för att nollställa inmatningsbufferten."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Använd \\? för hjälp."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Du använder psql, den interaktiva PostgreSQL-terminalen."
+
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Skriv: \\copyright för upphovsrättsinformation\n"
+" \\h för hjälp om SQL-kommandon\n"
+" \\? för hjälp om psql-kommandon\n"
+" \\g eller avsluta med semikolon för att köra en fråga\n"
+" \\q för att avsluta\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Använd \\q för att avsluta."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "Använd control-D för att avsluta."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "Använd control-C för att avsluta."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "fråga ignorerat; använd \\endif eller Ctrl-C för att avsluta aktuellt \\if-block"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "kom till EOF utan att hitta avslutande \\endif"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "icketerminerad citerad sträng"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: slut på minne"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "namn"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "aggregatsignatur"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "nytt_namn"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "ny_ägare"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "nytt_schema"
+
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "där aggregatsignatur är:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "arg_läge"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "arg_namn"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "arg_typ"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "flaggor"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "där flaggor kan vara:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "tillåtansl"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "anslutningstak"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "ärmall"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "nytt_tabellutrymme"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "konfigurationsparameter"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "värde"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "målroll"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "schemanamn"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "förkortad_grant_eller_revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "där förkortad_grant_eller_revok är en av:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "rollnamn"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "uttryck"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "domain_villkor"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "villkorsnamn"
+
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "nyy_villkorsnamn"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "ny_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "medlemsobjekt"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "där medlemsobjekt är:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "objektnamn"
+
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "aggregatnamn"
+
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "källtyp"
+
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "måltyp"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "funktionsnamn"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "operatornamn"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "vänster_typ"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "höger_typ"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "indexmetod"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "procedurnamn"
+
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "rutinnamn"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "typnamn"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "språknamn"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "och aggregatsignatur är:"
+
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "hanterarfunktion"
+
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "valideringsfunktion"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "aktion"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "kolumnnamn"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "nytt_kolumnnamn"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "där aktion är en av:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "datatyp"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "jämförelse"
+
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "kolumnvillkor"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "heltal"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "attributalternativ"
+
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "tabellvillkor"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "triggernamn"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "föräldertabell"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "utökningsnamn"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "körkostnad"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "resultatrader"
+
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "supportfunktion"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "rollspecifikation"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "användarnamn"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "där rollspecifikation kan vara:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "gruppnamn"
+
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "tabellutrymmesnamn"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "indexnamn"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "lagringsparameter"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "kolumnnummer"
+
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "stort_objekt_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "komprimeringsmetod"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "ny_accessmetod"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "strateginummer"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "op_typ"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "sorteringsfamiljnamn"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "supportnummer"
+
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "argumenttyp"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "tabellnamn"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "using-uttryck"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "check-uttryck"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "publiceringsobject"
+
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "publiceringsparameter"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "där publiceringsobjekt är en av:"
+
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "lösenord"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "tidsstämpel"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "databasnamn"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "ökningsvärde"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "minvärde"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "maxvärde"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "starta om"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "cache"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "nytt_mål"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "anslinfo"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "publiceringsnamn"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publicerings_alternativ"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "refresh_alternativ"
+
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "prenumerationsparameter"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_alternativ"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "partitionsnamn"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "partitionsgränsspec"
+
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "sekvensalternativ"
+
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "sekvensalternativ"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "tabellvillkor_för_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "omskrivningsregelnamn"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "och partitionsgränsspec är:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "partitionsgränsuttryck"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "numerisk_literal"
+
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "och kolumnvillkor är:"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "default_uttryck"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "generatoruttryck"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "indexparametrar"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "reftabell"
+
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "refkolumn"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "referentiell_aktion"
+
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "och tabellvillkor är:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "uteslutelement"
+
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "operator"
+
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "predikat"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "och tabellvillkor_för_index är:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "indexparametrar i UNIQUE-, PRIMARY KEY- och EXCLUDE-villkor är:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "uteslutelement i ett EXCLUDE-villkort är:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "op-klass"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "referentiell_aktion i ett FOREIGN KEY/REFERENCES-villkor är:"
+
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "tabellutrymmesalternativ"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "symboltyp"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "ordlistnamn"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "gammal_ordlista"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "ny_ordlista"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "attributnamn"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "nytt_attributnamn"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "nytt_enumvärde"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "närliggande_enumvärde"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existerande_enumvärde"
+
+#: sql_help.c:1589
+msgid "property"
+msgstr "egenskap"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "servernamn"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "visningsalternativnamn"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "visningsalternativvärde"
+
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "tabell_och_kolumner"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "där flaggor kan vara en av:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "storlek"
+
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "och tabell_och_kolumner är:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "transaktionsläge"
+
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "där transaktionsläge är en av:"
+
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "relationsnamn"
+
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "domännamn"
+
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "policynamn"
+
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "regelnamn"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "sträng_literal"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "transaktions-id"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "filnamn"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "kommando"
+
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "villkor"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "fråga"
+
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "formatnamn"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "avdelartecken"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "null-sträng"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "standard-sträng"
+
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "citattecken"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "escape-tecken"
+
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "kodningsnamn"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "accessmetodtyp"
+
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "arg_datatyp"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "tillståndsdatatyp"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "tillståndsdatastorlek"
+
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "kombinerafunk"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "serialiseringsfunk"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "deserialiseringsfunk"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "startvärde"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "msfunk"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "minvfunk"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "mtillståndsdatatyp"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "ntillståndsstorlek"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "mffunk"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "mstartvärde"
+
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "sorteringsoperator"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "eller gamla syntaxen"
+
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "bastyp"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "lokal"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "leverantör"
+
+#: sql_help.c:2165
+msgid "rules"
+msgstr "regler"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "version"
+
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "existerande_jämförelse"
+
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "källkodning"
+
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "målkodning"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "mall"
+
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "kodning"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "strategi"
+
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "icu_lokal"
+
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "icu_regler"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "lokal_leverantör"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "jämförelse_version"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "villkor"
+
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "där villkor är:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "händelse"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "filtervariabel"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "filtervärde"
+
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "där kolumnvillkor är:"
+
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "rettyp"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "kolumntyp"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "definition"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "obj-fil"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "linksymbol"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "sql-kropp"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "metod"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "anropshanterare"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "inline-hanterare"
+
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "val-funktion"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "familjenamn"
+
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "lagringstyp"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "där händelse kan vara en av:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "schema-element"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "servertyp"
+
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "serverversion"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "fdw-namn"
+
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "statistiknamn"
+
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "statistiksort"
+
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "prenumerationsnamn"
+
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "källtabell"
+
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "like_alternativ"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "och likealternativ är:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "katalog"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "parsernamn"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "källkonfig"
+
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "startfunktion"
+
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "gettoken_funktion"
+
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "slutfunktion"
+
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "symboltypfunktion"
+
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "rubrikfunktion"
+
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "init_funktion"
+
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "symboluppdelningsfunktion"
+
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "från_sql_funktionsnamn"
+
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "till_sql_funktionsnamn"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "refererat_tabellnamn"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "övergångsrelationsnamn"
+
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "argument"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "etikett"
+
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "subtyp"
+
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "subtypoperatorklass"
+
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "kanonisk_funktion"
+
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "subtyp_diff_funktion"
+
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "multirange_typnamn"
+
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "inmatningsfunktion"
+
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "utmatningsfunktion"
+
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "mottagarfunktion"
+
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "sändfunktion"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "typmodifiering_indatafunktion"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "typmodifiering_utdatafunktion"
+
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "analysfunktion"
+
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "arrayindexfunktion"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "internlängd"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "justering"
+
+#: sql_help.c:3197
+msgid "storage"
+msgstr "lagring"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "liketyp"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "kategori"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "föredragen"
+
+#: sql_help.c:3201
+msgid "default"
+msgstr "standard"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "element"
+
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "avskiljare"
+
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "sorterbar"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "with_fråga"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "frånval"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "markörnamn"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "utdatauttryck"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "utdatanamn"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "kod"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "parameter"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "sats"
+
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "riktning"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "där riktning kan vara en av:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "antal"
+
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "sekvensnamn"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "arg_namn"
+
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "arg_typ"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "externt_schema"
+
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "lokalt_schema"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "konfliktmål"
+
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "konfliktaktion"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "där konfliktmål kan vara en av:"
+
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "indexkolumnnamn"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "indexuttryck"
+
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "indexpredikat"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "och konfliktaktion är en av:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "kanal"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "låsläge"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "där låsläge är en av:"
+
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "måltabellnamn"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "målalias"
+
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "datakälla"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "join-villkor"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "when_sats"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "där datakälla är:"
+
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "källtabellnamn"
+
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "källfråga"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "källalias"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "och when_sats är:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "och merge_insert är:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "och merge_update är:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "och merge_delete är:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "innehåll"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "gammal_roll"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "ny_roll"
+
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "sparpunktnamn"
+
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "gruperingselement"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "fönsternamn"
+
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "fönsterdefinition"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "där frånval kan vara en av:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "kolumnalias"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "samplingsmetod"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "frö"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "with_frågenamn"
+
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "kolumndefinition"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "join-typ"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "join-kolumn"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "och grupperingselement kan vara en av:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "och with_fråga är:"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "värden"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "söksekvens_kolumnnamn"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "cykelmarkering_kolumnnamn"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "cykelmarkering_värde"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "cykelmarkering_standard"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "cykelväg_kolumnnamn"
+
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "ny_tabell"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "sorteringsuttryck"
+
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "avbryt aktuell transaktion"
+
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "ändra definitionen av en aggregatfunktion"
+
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "ändra definitionen av en jämförelse"
+
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "ändra definitionen av en konvertering"
+
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "ändra en databas"
+
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "definiera standardaccessrättigheter"
+
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "ändra definitionen av en domän"
+
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "ändra definitionen av en händelsetrigger"
+
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "ändra definitionen av en utökning"
+
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "ändra definitionen av en främmande data-omvandlare"
+
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "ändra definitionen av en främmande tabell"
+
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "ändra definitionen av en funktion"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "ändra rollnamn eller medlemskap"
+
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "ändra definitionen av ett index"
+
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "ändra definitionen av ett procedur-språk"
+
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "ändra definitionen av ett stort objekt"
+
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "ändra definitionen av en materialiserad vy"
+
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "ändra definitionen av en operator"
+
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "ändra definitionen av en operatorklass"
+
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "ändra definitionen av en operatorfamilj"
+
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "ändra definitionen av en säkerhetspolicy på radnivå"
+
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "ändra definitionen av en procedur"
+
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "ändra definitionen av en publicering"
+
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "ändra databasroll"
+
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "ändra definitionen av en rutin"
+
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "ändra definitionen av en regel"
+
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "ändra definitionen av ett schema"
+
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "ändra definitionen av en sekvensgenerator"
+
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "ändra definitionen av en främmande server"
+
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "ändra definitionen av ett utökat statistikobjekt"
+
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "ändra definitionen av en prenumerering"
+
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "ändra en servers konfigurationsparameter"
+
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "ändra definitionen av en tabell"
+
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "ändra definitionen av ett tabellutrymme"
+
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "ändra definitionen av en textsökkonfiguration"
+
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "ändra definitionen av en textsökordlista"
+
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "ändra definitionen av en textsökparser"
+
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "ändra definitionen av en textsökmall"
+
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "ändra definitionen av en trigger"
+
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "ändra definitionen av en typ"
+
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "ändra definitionen av en användarmappning"
+
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "ändra definitionen av en vy"
+
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "samla in statistik om en databas"
+
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "starta ett transaktionsblock"
+
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "anropa en procedur"
+
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "tvinga checkpoint i transaktionsloggen"
+
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "stäng en markör"
+
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "klustra en tabell efter ett index"
+
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "definiera eller ändra en kommentar på ett objekt"
+
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "utför den aktuella transaktionen"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "utför commit på en transaktion som tidigare förberetts för två-fas-commit"
+
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "kopiera data mellan en fil och en tabell"
+
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "definiera en ny accessmetod"
+
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "definiera en ny aggregatfunktion"
+
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "definiera en ny typomvandling"
+
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "definiera en ny jämförelse"
+
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "definiera en ny teckenkodningskonvertering"
+
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "skapa en ny databas"
+
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "definiera en ny domän"
+
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "definiera en ny händelsetrigger"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "installera en utökning"
+
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "definiera en ny främmande data-omvandlare"
+
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "definiera en ny främmande tabell"
+
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "definiera en ny funktion"
+
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "definiera en ny databasroll"
+
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "skapa ett nytt index"
+
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "definiera ett nytt procedur-språk"
+
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "definiera en ny materialiserad vy"
+
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "definiera en ny operator"
+
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "definiera en ny operatorklass"
+
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "definiera en ny operatorfamilj"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "definiera en ny säkerhetspolicy på radnivå för en tabell"
+
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "definiera ett ny procedur"
+
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "definiera en ny publicering"
+
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "definiera en ny omskrivningsregel"
+
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "definiera ett nytt schema"
+
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "definiera en ny sekvensgenerator"
+
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "definiera en ny främmande server"
+
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "definiera utökad statistik"
+
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "definiera en ny prenumeration"
+
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "definiera en ny tabell"
+
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "definiera en ny tabell utifrån resultatet av en fråga"
+
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "definiera ett nytt tabellutrymme"
+
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "definiera en ny textsökkonfiguration"
+
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "definiera en ny textsökordlista"
+
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "definiera en ny textsökparser"
+
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "definiera en ny textsökmall"
+
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "definiera en ny transform"
+
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "definiera en ny trigger"
+
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "definiera en ny datatyp"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "definiera en ny mappning av en användare till en främmande server"
+
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "definiera en ny vy"
+
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "deallokera en förberedd sats"
+
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "definiera en markör"
+
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "radera rader i en tabell"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "släng sessionstillstånd"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "kör ett annonymt kodblock"
+
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "ta bort en accessmetod"
+
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "ta bort en aggregatfunktioner"
+
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "ta bort en typomvandling"
+
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "ta bort en jämförelse"
+
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "ta bort en konvertering"
+
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "ta bort en databas"
+
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "ta bort en domän"
+
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "ta bort en händelsetrigger"
+
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "ta bort en utökning"
+
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "ta bort en frammande data-omvandlare"
+
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "ta bort en främmande tabell"
+
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "ta bort en funktion"
+
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "ta bort en databasroll"
+
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "ta bort ett index"
+
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "ta bort ett procedur-språk"
+
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "ta bort en materialiserad vy"
+
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "ta bort en operator"
+
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "ta bort en operatorklass"
+
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "ta bort en operatorfamilj"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "ta bort databasobjekt som ägs av databasroll"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "ta bort en säkerhetspolicy på radnivå från en tabell"
+
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "ta bort en procedur"
+
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "ta bort en publicering"
+
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "ta bort en rutin"
+
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "ta bort en omskrivningsregel"
+
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "ta bort ett schema"
+
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "ta bort en sekvens"
+
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "ta bort en främmande server-deskriptor"
+
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "ta bort utökad statistik"
+
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "ta bort en prenumeration"
+
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "ta bort en tabell"
+
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "ta bort ett tabellutrymme"
+
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "ta bort en textsökkonfiguration"
+
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "ta bort en textsökordlista"
+
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "ta bort en textsökparser"
+
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "ta bort en textsökmall"
+
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "ta bort en transform"
+
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "ta bort en trigger"
+
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "ta bort en datatyp"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "ta bort en användarmappning för en främmande server"
+
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "ta bort en vy"
+
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "utför en förberedd sats"
+
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "visa körningsplanen för en sats"
+
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "hämta rader från en fråga med hjälp av en markör"
+
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "definera åtkomsträttigheter"
+
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "importera tabelldefinitioner från en främmande server"
+
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "skapa nya rader i en tabell"
+
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "lyssna efter notifiering"
+
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "ladda en delad biblioteksfil (shared library)"
+
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "lås en tabell"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "villkorlig insert, updare eller delete av rader i en tabell"
+
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "flytta en markör"
+
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "generera en notifiering"
+
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "förbered en sats för körning"
+
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "avbryt aktuell transaktion för två-fas-commit"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "byt ägare på databasobjekt som ägs av en databasroll"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "ersätt innehållet av en materialiserad vy"
+
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "Ã¥terskapa index"
+
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "frigör en tidigare definierad sparpunkt"
+
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "återställ värde av körningsparameter till standardvärdet"
+
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "ta bort åtkomsträttigheter"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "avbryt en transaktion som tidigare förberetts för två-fas-commit"
+
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "rulla tillbaka till sparpunkt"
+
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "definera en ny sparpunkt i den aktuella transaktionen"
+
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "definiera eller ändra en säkerhetsetikett på ett objekt"
+
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "hämta rader från en tabell eller vy"
+
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "ändra en körningsparameter"
+
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "sätt integritetsvillkorstiming för nuvarande transaktion"
+
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "sätt användare för den aktiva sessionen"
+
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "sätt sessionsanvändaridentifierare och nuvarande användaridentifierare för den aktiva sessionen"
+
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "sätt inställningar för nuvarande transaktionen"
+
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "visa värde på en körningsparameter"
+
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "töm en eller flera tabeller"
+
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "sluta att lyssna efter notifiering"
+
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "uppdatera rader i en tabell"
+
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "skräpsamla och eventuellt analysera en databas"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "beräkna en mängd rader"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 kan bara användas i icke-interaktivt läge"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "kunde inte öppna loggfil \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Skriv \"help\" för hjälp.\n"
+"\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "kunde inte sätta utskriftsparameter \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "extra kommandoradsargument \"%s\" ignorerad"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "kunde inte hitta det egna programmets körbara fil"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"tab-kompletteringsfråga misslyckades: %s\n"
+"Frågan var:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "okänt värde \"%s\" för \"%s\": förväntade sig en Boolean"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "ogiltigt värde \"%s\" för \"%s\": förväntade sig ett heltal"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "ogiltigt variabelnamn: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"okänt värde \"%s\" för \"%s\"\n"
+"Tillgängliga värden är: %s."
+
+#, c-format
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FIL\n"
+#~ " \\lo_import FIL [KOMMENTAR]\n"
+#~ " \\lo_list[+]\n"
+#~ " \\lo_unlink LOBOID operationer på stora objekt\n"
+
+#~ msgid "Source code"
+#~ msgstr "Källkod"
+
+#, c-format
+#~ msgid "\\watch cannot be used with COPY"
+#~ msgstr "\\watch kan inte användas med COPY"
+
+#, c-format
+#~ msgid "could not change directory to \"%s\": %m"
+#~ msgstr "kunde inte byta katalog till \"%s\": %m"
+
+#, c-format
+#~ msgid "could not identify current directory: %m"
+#~ msgstr "kunde inte identifiera aktuell katalog: %m"
+
+#, c-format
+#~ msgid "could not read binary \"%s\""
+#~ msgstr "kunde inte läsa binär \"%s\""
+
+#, c-format
+#~ msgid "could not read symbolic link \"%s\": %m"
+#~ msgstr "kan inte läsa symbolisk länk \"%s\": %m"
+
+#, c-format
+#~ msgid "invalid binary \"%s\""
+#~ msgstr "ogiltig binär \"%s\""
+
+#~ msgid "match"
+#~ msgstr "match"
+
+#~ msgid "text"
+#~ msgstr "text"
+
+#~ msgid "timezone"
+#~ msgstr "tidszon"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "där riktning kan vara tom eller en av:"
diff --git a/src/bin/psql/po/tr.po b/src/bin/psql/po/tr.po
new file mode 100644
index 0000000..0096ffb
--- /dev/null
+++ b/src/bin/psql/po/tr.po
@@ -0,0 +1,8604 @@
+# translation of psql-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006, 2007.
+# Nicolai Tufar <ntufar@gmail.com>, 2004, 2005, 2006, 2007.
+# Abdullah GÃœLNER <agulner@gmail.com>, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-06-17 21:43+0000\n"
+"PO-Revision-Date: 2019-06-19 12:48+0300\n"
+"Last-Translator: Abdullah Gülner <>\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=0;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"X-Poedit-Basepath: /home/devrim/PostgreSQL/pgsql-cvs/pgsql\n"
+"X-Poedit-Bookmarks: -1,-1,333,-1,-1,-1,-1,-1,-1,-1\n"
+
+#: ../../../src/common/logging.c:188
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/common/logging.c:195
+#, c-format
+msgid "error: "
+msgstr "hata (error): "
+
+#: ../../../src/common/logging.c:202
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/exec.c:138 ../../common/exec.c:255 ../../common/exec.c:301
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "geçerli dizin tespit edilemedi: %m"
+
+#: ../../common/exec.c:157
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "geçersiz ikili (binary) \"%s\""
+
+#: ../../common/exec.c:207
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "\"%s\" ikili (binary) dosyası okunamadı"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "çalıştırılacak \"%s\" bulunamadı"
+
+#: ../../common/exec.c:271 ../../common/exec.c:310
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %m"
+
+#: ../../common/exec.c:288
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "symbolic link \"%s\" okuma hatası: %m"
+
+#: ../../common/exec.c:541
+#, c-format
+msgid "pclose failed: %m"
+msgstr "pclose başarısız oldu: %m"
+
+#: ../../common/exec.c:670 ../../common/exec.c:715 ../../common/exec.c:807
+#: command.c:1218 input.c:228 mainloop.c:82 mainloop.c:386
+#, c-format
+msgid "out of memory"
+msgstr "yetersiz bellek"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "yetersiz bellek\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "geçerli kullanıcı ID si bulunamadı %ld: %s"
+
+#: ../../common/username.c:45 command.c:555
+msgid "user does not exist"
+msgstr "kullanıcı mevcut değil"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "kullanıcı adı arama başarısız: hata kodu %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "komut çalıştırılabilir değil"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "komut bulunamadı"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "alt süreç %d çıkış koduyla sonuçlandırılmıştır"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "alt süreç 0x%X exception tarafından sonlandırılmıştır"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "alt süreç %d bilinmeyen durumu ile sonlandırılmıştır"
+
+#: ../../fe_utils/print.c:353
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu satır)"
+msgstr[1] "(%lu satır)"
+
+#: ../../fe_utils/print.c:3058
+#, c-format
+msgid "Interrupted\n"
+msgstr "kesildi\n"
+
+#: ../../fe_utils/print.c:3122
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Başlık tablo içeriğine eklenemedi: %d kolon sayısı aşıldı.\n"
+
+#: ../../fe_utils/print.c:3162
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Hücre tablo içeriğine eklenemedi: %d olan toplam hücre sayısı aşıldı.\n"
+
+#: ../../fe_utils/print.c:3417
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "geçersiz çıktı biçimi (iç hata): %d"
+
+#: ../../fe_utils/psqlscan.l:729
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "\"%s\" değişkeninin özyinelemeli genişlemesi (recursive expansion) atlanıyor"
+
+#: command.c:221
+#, c-format
+msgid "invalid command \\%s"
+msgstr "geçersiz komut \\%s"
+
+#: command.c:223
+#, c-format
+msgid "Try \\? for help."
+msgstr "Yardım için \\? yazınız."
+
+#: command.c:241
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: \"%s\" parametresi fazla, yok sayıldı"
+
+#: command.c:293
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s komut yok sayıldı; güncel \\if blokundan çıkmak için \\endif veya Ctrl-C kullanınız"
+
+#: command.c:553
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "%ld kullanıcı ID'si için home dizinine ulaşılamadı: %s"
+
+#: command.c:571
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: \"%s\" dizinine geçiş yapılamadı: %m"
+
+#: command.c:596
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Şu anda bir veritabanına bağlı değilsiniz.\n"
+
+#: command.c:609
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" adresi üzrerinden \"%s\" portundan bağlandınız.\n"
+
+#: command.c:612
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" içindeki soket ile \"%s\" portundan bağlandınız.\n"
+
+#: command.c:618
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" sunucusu (\"%s\" adresi) üzerinden \"%s\" portundan bağlandınız.\n"
+
+#: command.c:621
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "\"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" sunucusu üzerinden \"%s\" portundan bağlandınız.\n"
+
+#: command.c:930 command.c:1026 command.c:2411
+#, c-format
+msgid "no query buffer"
+msgstr "sorgu tamponu mevcut deÄŸil"
+
+#: command.c:963 command.c:4824
+#, c-format
+msgid "invalid line number: %s"
+msgstr "geçersiz satır numarası: %s"
+
+#: command.c:1017
+#, c-format
+msgid "The server (version %s) does not support editing function source."
+msgstr "Sunucu (%s sürümü) fonksiyon kaynak kodunu düzenlemeyi (edit) desteklememektedir."
+
+#: command.c:1020
+#, c-format
+msgid "The server (version %s) does not support editing view definitions."
+msgstr "Sunucu (%s sürümü) görünüm tanımlarını düzenlemeyi (edit) desteklememektedir."
+
+#: command.c:1102
+msgid "No changes"
+msgstr "DeÄŸiÅŸiklik yok"
+
+#: command.c:1179
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: dil kodlama adı geçersiz ya da dönüştürme fonksiyonu bulunamadı"
+
+#: command.c:1214 command.c:1853 command.c:3109 command.c:4926 common.c:175
+#: common.c:224 common.c:521 common.c:1362 common.c:1390 common.c:1498
+#: common.c:1601 common.c:1639 copy.c:490 copy.c:709 help.c:63 large_obj.c:157
+#: large_obj.c:192 large_obj.c:254
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1221
+msgid "There is no previous error."
+msgstr "Önceden kalan hata bulunmuyor."
+
+#: command.c:1409 command.c:1714 command.c:1728 command.c:1745 command.c:1905
+#: command.c:2142 command.c:2378 command.c:2418
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: zorunlu argüman eksik"
+
+#: command.c:1540
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: \\else den sonra gelemez"
+
+#: command.c:1545
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: eÅŸleÅŸen \\if bulunmuyor"
+
+#: command.c:1609
+#, fuzzy, c-format
+#| msgid "\\else: cannot occur after \\else\n"
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: \\else den sonra gelemez\n"
+
+#: command.c:1614
+#, fuzzy, c-format
+#| msgid "\\else: no matching \\if\n"
+msgid "\\else: no matching \\if"
+msgstr "\\else: eÅŸleÅŸen \\if bulunmuyor\n"
+
+#: command.c:1654
+#, fuzzy, c-format
+#| msgid "\\endif: no matching \\if\n"
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: eÅŸleÅŸen \\if bulunmuyor\n"
+
+#: command.c:1809
+msgid "Query buffer is empty."
+msgstr "Sorgu tamponu boÅŸ."
+
+#: command.c:1831
+msgid "Enter new password: "
+msgstr "Yeni parola girin:"
+
+#: command.c:1832
+msgid "Enter it again: "
+msgstr "Yeniden girin:"
+
+#: command.c:1836
+#, fuzzy, c-format
+#| msgid "Passwords didn't match.\n"
+msgid "Passwords didn't match."
+msgstr "Parolalar uyuşmıyor.\n"
+
+#: command.c:1935
+#, fuzzy, c-format
+#| msgid "\\%s: could not read value for variable\n"
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: değişken için değer okunamadı\n"
+
+#: command.c:2038
+msgid "Query buffer reset (cleared)."
+msgstr "Sorgu tamponu sıfırlanmış."
+
+#: command.c:2060
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "Geçmiş (history), \"%s\" dosyasına yazıldı.\n"
+
+#: command.c:2147
+#, fuzzy, c-format
+#| msgid "\\%s: environment variable name must not contain \"=\"\n"
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: ortam değişkeni \"=\" içermemelidir\n"
+
+#: command.c:2208
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support showing function source.\n"
+msgid "The server (version %s) does not support showing function source."
+msgstr "Sunucu (%s sürümü) fonksiyon kaynağını görüntülemeyi desteklemiyor.\n"
+
+#: command.c:2211
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support showing view definitions.\n"
+msgid "The server (version %s) does not support showing view definitions."
+msgstr "Sunucu (%s sürümü) görünüm (view) tanımlarını göstermeyi desteklememektedir.\n"
+
+#: command.c:2218
+#, fuzzy, c-format
+#| msgid "function name is required\n"
+msgid "function name is required"
+msgstr "fonksiyon adı gerekli\n"
+
+#: command.c:2220
+#, fuzzy, c-format
+#| msgid "view name is required\n"
+msgid "view name is required"
+msgstr "görünüm (view) adı gerekli\n"
+
+#: command.c:2350
+msgid "Timing is on."
+msgstr "Zamanlama açık."
+
+#: command.c:2352
+msgid "Timing is off."
+msgstr "Zamanlama kapalı."
+
+#: command.c:2437 command.c:2465 command.c:3508 command.c:3511 command.c:3514
+#: command.c:3520 command.c:3522 command.c:3530 command.c:3540 command.c:3549
+#: command.c:3563 command.c:3580 command.c:3638 common.c:71 copy.c:333
+#: copy.c:405 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, fuzzy, c-format
+#| msgid "%s: %s"
+msgid "%s: %m"
+msgstr "%s: %s"
+
+#: command.c:2849 startup.c:240 startup.c:291
+msgid "Password: "
+msgstr "Parola: "
+
+#: command.c:2854 startup.c:288
+#, c-format
+msgid "Password for user %s: "
+msgstr "%s kullanıcısının parolası: "
+
+#: command.c:2925
+#, fuzzy, c-format
+#| msgid "All connection parameters must be supplied because no database connection exists\n"
+msgid "All connection parameters must be supplied because no database connection exists"
+msgstr "Bütün bağlantı parametreleri sağlanmalı çünkü hiçbir veritabanı bağlantısı bulunmuyor\n"
+
+#: command.c:3113
+#, fuzzy, c-format
+#| msgid "Previous connection kept\n"
+msgid "Previous connection kept"
+msgstr "Önceki bağlantı kullanılacaktır\n"
+
+#: command.c:3117
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3159
+#, fuzzy, c-format
+#| msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile \"%s\" sunucusunda \"%s\". porttan bağlısınız.\n"
+
+#: command.c:3162
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısıyla \"%s\" içindeki soket ile \"%s\" port'undan bağlısınız.\n"
+
+#: command.c:3168
+#, fuzzy, c-format
+#| msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile \"%s\" sunucusunda \"%s\". porttan bağlısınız.\n"
+
+#: command.c:3171
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile \"%s\" sunucusunda \"%s\". porttan bağlısınız.\n"
+
+#: command.c:3176
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Şu anda \"%s\" veritabanına \"%s\" kullanıcısı ile bağlısınız.\n"
+
+#: command.c:3209
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, sunucu %s)\n"
+
+#: command.c:3217
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"UYARI: %s ana sürümü %s, sunucu ana sürümü %s.\n"
+" Bazı psql özellikleri çalışmayabilir.\n"
+
+#: command.c:3255
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "SSL bağlantısı (protokol:%s, cipher: %s, bit sayısı: %s, sıkıştırma: %s)\n"
+
+#: command.c:3256 command.c:3257 command.c:3258
+msgid "unknown"
+msgstr "bilinmeyen"
+
+#: command.c:3259 help.c:46
+msgid "off"
+msgstr "kapalı"
+
+#: command.c:3259 help.c:46
+msgid "on"
+msgstr "açık"
+
+#: command.c:3273
+#, c-format
+msgid "GSSAPI Encrypted connection\n"
+msgstr ""
+
+#: command.c:3293
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"UYARI: Uçbirimin kod sayfası (%u), Windows kod sayfasından (%u) farklıdır\n"
+" 8-bitlik karakterler doğru çalışmayabilir. Ayrıntılar için psql referans\n"
+" belgelerinde \"Windows kullanıcılarına notlar\" bölümüne bakın.\n"
+
+#: command.c:3397
+#, fuzzy, c-format
+#| msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number\n"
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "bir satır numarası belirtmek için PSQL_EDITOR_LINENUMBER_ARG çevresel değişkenini ayarlamanız gereklidir\n"
+
+#: command.c:3426
+#, fuzzy, c-format
+#| msgid "could not start editor \"%s\"\n"
+msgid "could not start editor \"%s\""
+msgstr "\"%s\" metin düzenleyicisi çalıştırılamadı\n"
+
+#: command.c:3428
+#, fuzzy, c-format
+#| msgid "could not start /bin/sh\n"
+msgid "could not start /bin/sh"
+msgstr "/bin/sh başlatılamıyor\n"
+
+#: command.c:3466
+#, fuzzy, c-format
+#| msgid "could not locate temporary directory: %s\n"
+msgid "could not locate temporary directory: %s"
+msgstr "geçici dizin bulunamıyor: %s\n"
+
+#: command.c:3493
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "\"%s\" geçici dosya açılamıyor: %m"
+
+#: command.c:3786
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr ""
+
+#: command.c:3806
+#, fuzzy, c-format
+#| msgid "\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n"
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: izin verilen biçimler: unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n"
+
+#: command.c:3825
+#, fuzzy, c-format
+#| msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n"
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: izin verilen çizgi biçimleri: ascii, old-ascii, unicode\n"
+
+#: command.c:3840
+#, fuzzy, c-format
+#| msgid "\\pset: allowed Unicode border line styles are single, double\n"
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: izin verilen Unicode kenar çizgi biçimleri single, double\n"
+
+#: command.c:3855
+#, fuzzy, c-format
+#| msgid "\\pset: allowed Unicode column line styles are single, double\n"
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: izin verilen Unicode sütun çizgi biçimleri: single, double\n"
+
+#: command.c:3870
+#, fuzzy, c-format
+#| msgid "\\pset: allowed Unicode header line styles are single, double\n"
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: izin verilen Unicode üst bilgi çizgi biçimleri: single, double\n"
+
+#: command.c:3913
+#, fuzzy, c-format
+#| msgid "COPY escape must be a single one-byte character"
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "COPY escape bir baytlık tek bir karakter olmalıdır"
+
+#: command.c:3918
+#, fuzzy, c-format
+#| msgid "COPY delimiter cannot be newline or carriage return"
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "COPY ayıracı yeni satır ya da satırbaşı karakteri olamaz"
+
+#: command.c:4055 command.c:4241
+#, fuzzy, c-format
+#| msgid "\\pset: unknown option: %s\n"
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: bilinmeyen seçenek: %s\n"
+
+#: command.c:4073
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Kenar stili: %d.\n"
+
+#: command.c:4079
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Hedef genişlik ayarı kaldırıldı.\n"
+
+#: command.c:4081
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Hedef geniÅŸlik %d.\n"
+
+#: command.c:4088
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Geniş gösterme açık.\n"
+
+#: command.c:4090
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Geniş gösterme otomatik olarak kullanılıyor.\n"
+
+#: command.c:4092
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Geniş gösterme kapalı.\n"
+
+#: command.c:4098
+#, fuzzy, c-format
+#| msgid "Field separator is \"%s\".\n"
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Alan ayıracı: \"%s\".\n"
+
+#: command.c:4106 command.c:4114
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Alan ayıracı sıfır bayttır.\n"
+
+#: command.c:4108
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Alan ayıracı: \"%s\".\n"
+
+#: command.c:4121
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Varsayılan sayfa altbilgisi açık.\n"
+
+#: command.c:4123
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Varsayılan sayfa altbilgisi kapalı.\n"
+
+#: command.c:4129
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Çıktı formatı: %s.\n"
+
+#: command.c:4135
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Satır stili: %s.\n"
+
+#: command.c:4142
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null display is \"%s\".\n"
+
+#: command.c:4150
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Yerel duyarlı sayısal çıktı açık.\n"
+
+#: command.c:4152
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Yerel duyarlı sayısal çıktı kapalı.\n"
+
+#: command.c:4159
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Uzun çıktı için sayfalama kullanılacaktır.\n"
+
+#: command.c:4161
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Sayfalama her zaman kullanılacak.\n"
+
+#: command.c:4163
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Sayfalama kullanımı kapalı.\n"
+
+#: command.c:4169
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "%d sayısından düşük satır için sayfalama kullanılmayacak.\n"
+msgstr[1] "%d sayısından düşük satır için sayfalama kullanılmayacak.\n"
+
+#: command.c:4179 command.c:4189
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Kayıt ayıracı sıfır bayt'tır.\n"
+
+#: command.c:4181
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Kayıt ayıracı <newline>'dır.\n"
+
+#: command.c:4183
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Kayıt ayıracı \"%s\".\n"
+
+#: command.c:4196
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Tablo özellikleri: \"%s\".\n"
+
+#: command.c:4199
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Tablo özellikleri kaldırıldı.\n"
+
+#: command.c:4206
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Başlık \"%s\".\n"
+
+#: command.c:4208
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Başlık kaldırıldı\n"
+
+#: command.c:4215
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Sadece kayıtları gösterme açık.\n"
+
+#: command.c:4217
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Sadece kayıtları gösterme kapalı.\n"
+
+#: command.c:4223
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode kenar çizgi stili: \"%s\".\n"
+
+#: command.c:4229
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode sütun çizgi stili: \"%s\".\n"
+
+#: command.c:4235
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode sayfa üstbilgi çizgi stili: \"%s\".\n"
+
+#: command.c:4397
+#, fuzzy, c-format
+#| msgid "\\!: failed\n"
+msgid "\\!: failed"
+msgstr "\\!: başarısız\n"
+
+#: command.c:4422 common.c:781
+#, fuzzy, c-format
+#| msgid "\\watch cannot be used with an empty query\n"
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch boş bir sorgu ile kullanılamaz\n"
+
+#: command.c:4463
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (her %gs)\n"
+
+#: command.c:4466
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (her %gs)\n"
+
+#: command.c:4520 command.c:4527 common.c:681 common.c:688 common.c:1345
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* SORGU **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:4719
+#, fuzzy, c-format
+#| msgid "\"%s.%s\" is not a view\n"
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" bir görünüm (view) değildir\n"
+
+#: command.c:4735
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "reloptions dizisi (array) ayrıştırılamadı"
+
+#: common.c:160
+#, fuzzy, c-format
+#| msgid "cannot escape without active connection\n"
+msgid "cannot escape without active connection"
+msgstr "aktif bağlantı olmadan vazgeçilemez (escape)\n"
+
+#: common.c:201
+#, fuzzy, c-format
+#| msgid "shell command argument contains a newline or carriage return: \"%s\"\n"
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "kabuk komut argümanı yeni satır ya da satırbaşı karakteri içeriyor: \"%s\"\n"
+
+#: common.c:395
+#, fuzzy, c-format
+#| msgid "connection to server was lost\n"
+msgid "connection to server was lost"
+msgstr "sunucuya bağlantı kesildi\n"
+
+#: common.c:399
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "Sunucuya bağlantı kesildi. Yeniden bağlantı deneniyor:"
+
+#: common.c:404
+#, c-format
+msgid "Failed.\n"
+msgstr "Başarısız.\n"
+
+#: common.c:411
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Başarılı.\n"
+
+#: common.c:511 common.c:1063 common.c:1280
+#, fuzzy, c-format
+#| msgid "unexpected PQresultStatus: %d\n"
+msgid "unexpected PQresultStatus: %d"
+msgstr "beklenmeyen PQresultStatus: %d\n"
+
+#: common.c:620
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "Süre: %.3f milisaniye\n"
+
+#: common.c:635
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "Süre: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:644
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "Süre: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:651
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "Süre: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:675 common.c:733 common.c:1316
+#, fuzzy, c-format
+#| msgid "You are currently not connected to a database.\n"
+msgid "You are currently not connected to a database."
+msgstr "Şu anda bir veritabanına bağlı değilsiniz.\n"
+
+#: common.c:788
+#, fuzzy, c-format
+#| msgid "\\watch cannot be used with COPY\n"
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watch COPY ile birlikte kullanılamaz\n"
+
+#: common.c:793
+#, fuzzy, c-format
+#| msgid "unexpected result status for \\watch\n"
+msgid "unexpected result status for \\watch"
+msgstr "\\watch için beklenmedik sonuç durumu\n"
+
+#: common.c:823
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "PID %3$d olan sunucu sürecinden \"%2$s\" payload'lı \"%1$s\" asenkon bildiri alınmış.\n"
+
+#: common.c:826
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "PID %2$d olan sunucu sürecinden \"%1$s\" asenkon bildiri alınmış.\n"
+
+#: common.c:889
+#, fuzzy, c-format
+#| msgid "no rows returned for \\gset\n"
+msgid "no rows returned for \\gset"
+msgstr "\\gset için hiç bir satır dönmedi\n"
+
+#: common.c:894
+#, fuzzy, c-format
+#| msgid "more than one row returned for \\gset\n"
+msgid "more than one row returned for \\gset"
+msgstr "\\gset için birden fazla satır döndü\n"
+
+#: common.c:1325
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(Tek adım modu: verify command)*******************************************\n"
+"%s\n"
+"***(devam etmek için return, durdurmak için x ve return'e basınız)********************\n"
+
+#: common.c:1380
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n"
+msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+msgstr "Sunucu (%s sürümü) ON_ERROR_ROLLBACK için savepointleri desteklememektedir.\n"
+
+#: common.c:1443
+#, fuzzy, c-format
+#| msgid "STATEMENT: %s\n"
+msgid "STATEMENT: %s"
+msgstr "KOMUT: %s\n"
+
+#: common.c:1486
+#, fuzzy, c-format
+#| msgid "unexpected transaction status (%d)\n"
+msgid "unexpected transaction status (%d)"
+msgstr "beklenmeyen iÅŸlem (transaction) durumu (%d)\n"
+
+#: common.c:1623 describe.c:2002
+msgid "Column"
+msgstr "Kolon"
+
+#: common.c:1624 describe.c:179 describe.c:394 describe.c:412 describe.c:457
+#: describe.c:474 describe.c:963 describe.c:1127 describe.c:1712
+#: describe.c:1736 describe.c:2003 describe.c:3673 describe.c:3858
+#: describe.c:4091 describe.c:5297
+msgid "Type"
+msgstr "Veri tipi"
+
+#: common.c:1673
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Komut sonulç döndürmedi, veya sonuçta hiç sütun yok.\n"
+
+#: copy.c:100
+#, fuzzy, c-format
+#| msgid "\\copy: arguments required\n"
+msgid "\\copy: arguments required"
+msgstr "\\copy: parametre eksik\n"
+
+#: copy.c:255
+#, fuzzy, c-format
+#| msgid "\\copy: parse error at \"%s\"\n"
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: \"%s\" ifadesinde ayrıştırma hatası\n"
+
+#: copy.c:257
+#, fuzzy, c-format
+#| msgid "\\copy: parse error at end of line\n"
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: satır sonunda ayrıştırma hatası\n"
+
+#: copy.c:330
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "\"%s\" komutu yürütülemedi: %m"
+
+#: copy.c:346
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" dosyası durumlanamadı: %m"
+
+#: copy.c:350
+#, fuzzy, c-format
+#| msgid "%s: cannot copy from/to a directory\n"
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: dizinden ya da dizine kopyalanamıyor\n"
+
+#: copy.c:387
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "dış komuta doğru olan pipe kapatılamadı: %m"
+
+#: copy.c:392
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:455 copy.c:465
+#, fuzzy, c-format
+#| msgid "could not write COPY data: %s\n"
+msgid "could not write COPY data: %m"
+msgstr "COPY verisi yazılamadı: %s\n"
+
+#: copy.c:471
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY veri aktarımı başarısız: %s"
+
+#: copy.c:532
+msgid "canceled by user"
+msgstr "kullanıcı tarafından iptal edildi"
+
+#: copy.c:543
+msgid ""
+"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."
+msgstr ""
+"Kopyalanacak veriyi girin ve ardından enter'a basın.\n"
+"Sonuçlandırmak için yeni satırda ters taksim işareti ve nokta veya bir EOF işareti girin."
+
+#: copy.c:671
+msgid "aborted because of read failure"
+msgstr "okuma hatası nedeniyle kesildi"
+
+#: copy.c:705
+msgid "trying to exit copy mode"
+msgstr "copy modundan çıkmaya çalışıyor"
+
+#: crosstabview.c:124
+#, fuzzy, c-format
+#| msgid "\\crosstabview: statement did not return a result set\n"
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: komut bir sonuç kümesi döndürmedi\n"
+
+#: crosstabview.c:130
+#, fuzzy, c-format
+#| msgid "\\crosstabview: query must return at least three columns\n"
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: sorgu en az üç sütun döndürmelidir\n"
+
+#: crosstabview.c:157
+#, fuzzy, c-format
+#| msgid "\\crosstabview: vertical and horizontal headers must be different columns\n"
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crostabview: dikey ve yatayda üstbilgiler farklı sütunlar olmalıdır\n"
+
+#: crosstabview.c:173
+#, fuzzy, c-format
+#| msgid "\\crosstabview: data column must be specified when query returns more than three columns\n"
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: sorgu üçten fazla sütun döndürüyorsa veri sütunu belirtilmelidir\n"
+
+#: crosstabview.c:229
+#, fuzzy, c-format
+#| msgid "\\crosstabview: maximum number of columns (%d) exceeded\n"
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: azami sütun sayısı (%d) aşılmıştır\n"
+
+#: crosstabview.c:398
+#, fuzzy, c-format
+#| msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"\n"
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: sorgu sonucu \"%s\" satırı, \"%s\" sütunu için çoklu veri değerleri içermektedir\n"
+
+#: crosstabview.c:646
+#, fuzzy, c-format
+#| msgid "\\crosstabview: column number %d is out of range 1..%d\n"
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: %d sütun numarası, 1..%d aralığının dışında\n"
+
+#: crosstabview.c:671
+#, fuzzy, c-format
+#| msgid "\\crosstabview: ambiguous column name: \"%s\"\n"
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: belirsiz sütun adı: \"%s\"\n"
+
+#: crosstabview.c:679
+#, fuzzy, c-format
+#| msgid "\\crosstabview: column name not found: \"%s\"\n"
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: sütun adı bulunamadı: \"%s\"\n"
+
+#: describe.c:77 describe.c:374 describe.c:679 describe.c:811 describe.c:955
+#: describe.c:1116 describe.c:1188 describe.c:3662 describe.c:3845
+#: describe.c:4089 describe.c:4180 describe.c:4447 describe.c:4607
+#: describe.c:4848 describe.c:4923 describe.c:4934 describe.c:4996
+#: describe.c:5421 describe.c:5504
+msgid "Schema"
+msgstr "Åžema"
+
+#: describe.c:78 describe.c:176 describe.c:244 describe.c:252 describe.c:375
+#: describe.c:680 describe.c:812 describe.c:873 describe.c:956 describe.c:1189
+#: describe.c:3663 describe.c:3846 describe.c:4012 describe.c:4090
+#: describe.c:4181 describe.c:4260 describe.c:4448 describe.c:4532
+#: describe.c:4608 describe.c:4849 describe.c:4924 describe.c:4935
+#: describe.c:4997 describe.c:5194 describe.c:5278 describe.c:5502
+#: describe.c:5674 describe.c:5899
+msgid "Name"
+msgstr "Adı"
+
+#: describe.c:79 describe.c:387 describe.c:405 describe.c:451 describe.c:468
+msgid "Result data type"
+msgstr "Sonuç veri tipi"
+
+#: describe.c:87 describe.c:100 describe.c:104 describe.c:388 describe.c:406
+#: describe.c:452 describe.c:469
+msgid "Argument data types"
+msgstr "Argüman veri tipi"
+
+#: describe.c:112 describe.c:119 describe.c:187 describe.c:275 describe.c:514
+#: describe.c:728 describe.c:827 describe.c:898 describe.c:1191 describe.c:2021
+#: describe.c:3451 describe.c:3698 describe.c:3892 describe.c:4043
+#: describe.c:4117 describe.c:4190 describe.c:4273 describe.c:4356
+#: describe.c:4475 describe.c:4541 describe.c:4609 describe.c:4750
+#: describe.c:4792 describe.c:4865 describe.c:4927 describe.c:4936
+#: describe.c:4998 describe.c:5220 describe.c:5300 describe.c:5435
+#: describe.c:5505 large_obj.c:290 large_obj.c:300
+msgid "Description"
+msgstr "Açıklama"
+
+#: describe.c:137
+msgid "List of aggregate functions"
+msgstr "Aggregate fonksiyonların listesi"
+
+#: describe.c:162
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support access methods.\n"
+msgid "The server (version %s) does not support access methods."
+msgstr "Bu sunucu (%s sürümü) erişim yöntemlerini desteklememektedir.\n"
+
+#: describe.c:177
+msgid "Index"
+msgstr "Ä°ndeks"
+
+#: describe.c:178 describe.c:3679 describe.c:3871 describe.c:5422
+msgid "Table"
+msgstr "Tablo"
+
+#: describe.c:186 describe.c:5199
+msgid "Handler"
+msgstr "Ä°ÅŸleyici (handler)"
+
+#: describe.c:205
+msgid "List of access methods"
+msgstr "Erişim yöntemlerinin listesi"
+
+#: describe.c:231
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support tablespaces.\n"
+msgid "The server (version %s) does not support tablespaces."
+msgstr "Sunucu (%s sürümü) tablespace'leri desteklememektedir.\n"
+
+#: describe.c:245 describe.c:253 describe.c:502 describe.c:718 describe.c:874
+#: describe.c:1115 describe.c:3674 describe.c:3847 describe.c:4016
+#: describe.c:4262 describe.c:4533 describe.c:5195 describe.c:5279
+#: describe.c:5675 describe.c:5801 describe.c:5900 large_obj.c:289
+msgid "Owner"
+msgstr "Sahibi"
+
+#: describe.c:246 describe.c:254
+msgid "Location"
+msgstr "Yer"
+
+#: describe.c:265 describe.c:3269
+msgid "Options"
+msgstr "Seçenekler"
+
+#: describe.c:270 describe.c:691 describe.c:890 describe.c:3690 describe.c:3694
+msgid "Size"
+msgstr "Boyut"
+
+#: describe.c:292
+msgid "List of tablespaces"
+msgstr "Tablespace listesi"
+
+#: describe.c:334
+#, fuzzy, c-format
+#| msgid "\\df only takes [anptwS+] as options\n"
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df sadece [anptwS+] seçeneklerini alır\n"
+
+#: describe.c:342 describe.c:353
+#, fuzzy, c-format
+#| msgid "\\df does not take a \"%c\" option with server version %s\n"
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df \"%c\" seçeneğini %s sunucu sürümünde almaz\n"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:390 describe.c:408 describe.c:454 describe.c:471
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:391 describe.c:409
+msgid "window"
+msgstr "pencere"
+
+#: describe.c:392
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:393 describe.c:411 describe.c:456 describe.c:473
+msgid "func"
+msgstr "func"
+
+#: describe.c:410 describe.c:455 describe.c:472 describe.c:1325
+msgid "trigger"
+msgstr "tetikleyici (trigger)"
+
+#: describe.c:484
+msgid "immutable"
+msgstr "duraÄŸan"
+
+#: describe.c:485
+msgid "stable"
+msgstr "kararlı"
+
+#: describe.c:486
+msgid "volatile"
+msgstr "oynaklık"
+
+#: describe.c:487
+msgid "Volatility"
+msgstr "Oynaklık"
+
+#: describe.c:495
+msgid "restricted"
+msgstr "kısıtlı"
+
+#: describe.c:496
+msgid "safe"
+msgstr "güvenli"
+
+#: describe.c:497
+msgid "unsafe"
+msgstr "güvensiz"
+
+#: describe.c:498
+msgid "Parallel"
+msgstr "Paralel"
+
+#: describe.c:503
+msgid "definer"
+msgstr "tanımlayıcı"
+
+#: describe.c:504
+msgid "invoker"
+msgstr "çağıran"
+
+#: describe.c:505
+msgid "Security"
+msgstr "Güvenlik"
+
+#: describe.c:512
+msgid "Language"
+msgstr "Dil"
+
+#: describe.c:513
+msgid "Source code"
+msgstr "Kaynak kodu"
+
+#: describe.c:642
+msgid "List of functions"
+msgstr "Fonksiyonların listesi"
+
+#: describe.c:690
+msgid "Internal name"
+msgstr "Dahili adı"
+
+#: describe.c:712
+msgid "Elements"
+msgstr "Elemanlar"
+
+#: describe.c:769
+msgid "List of data types"
+msgstr "Veri tiplerinin listesi"
+
+#: describe.c:813
+msgid "Left arg type"
+msgstr "Sol argüman veri tipi"
+
+#: describe.c:814
+msgid "Right arg type"
+msgstr "Sağ argüman veri tipi"
+
+#: describe.c:815
+msgid "Result type"
+msgstr "Sonuç veri tipi"
+
+#: describe.c:820 describe.c:4268 describe.c:4333 describe.c:4339
+#: describe.c:4749
+msgid "Function"
+msgstr "Fonksiyon"
+
+#: describe.c:845
+msgid "List of operators"
+msgstr "Operatörlerin listesi"
+
+#: describe.c:875
+msgid "Encoding"
+msgstr "Dil Kodlaması"
+
+#: describe.c:880 describe.c:4449
+msgid "Collate"
+msgstr "Sıralama(collate)"
+
+#: describe.c:881 describe.c:4450
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:894
+msgid "Tablespace"
+msgstr "Tablespace"
+
+#: describe.c:916
+msgid "List of databases"
+msgstr "Veritabanlarının listesi"
+
+#: describe.c:957 describe.c:1118 describe.c:3664
+msgid "table"
+msgstr "tablo"
+
+#: describe.c:958 describe.c:3665
+msgid "view"
+msgstr "view"
+
+#: describe.c:959 describe.c:3666
+msgid "materialized view"
+msgstr "maddileştirilmiş görünüm(materialized view)"
+
+#: describe.c:960 describe.c:1120 describe.c:3668
+msgid "sequence"
+msgstr "sequence"
+
+#: describe.c:961 describe.c:3670
+msgid "foreign table"
+msgstr "uzak (foreign) tablosu"
+
+#: describe.c:962 describe.c:3671 describe.c:3856
+#, fuzzy
+#| msgid "\"%s\" is a partitioned table"
+msgid "partitioned table"
+msgstr "\"%s\" bölümlenmiş bir tablodur"
+
+#: describe.c:974
+msgid "Column privileges"
+msgstr "Sütun erişim hakları"
+
+#: describe.c:1005 describe.c:1039
+msgid "Policies"
+msgstr "Ä°lkeler"
+
+#: describe.c:1071 describe.c:5956 describe.c:5960
+msgid "Access privileges"
+msgstr "Erişim hakları"
+
+#: describe.c:1102
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support altering default privileges.\n"
+msgid "The server (version %s) does not support altering default privileges."
+msgstr "Sunucu (%s sürümü) varsayılan (default) hakların değiştirilmesini desteklemiyor.\n"
+
+#: describe.c:1122
+msgid "function"
+msgstr "fonksiyon"
+
+#: describe.c:1124
+msgid "type"
+msgstr "tip"
+
+#: describe.c:1126
+msgid "schema"
+msgstr "ÅŸema"
+
+#: describe.c:1150
+msgid "Default access privileges"
+msgstr "Varsayılan erişim hakları"
+
+#: describe.c:1190
+msgid "Object"
+msgstr "Nesne"
+
+#: describe.c:1204
+msgid "table constraint"
+msgstr "tablo kısıtlaması (constraint)"
+
+#: describe.c:1226
+msgid "domain constraint"
+msgstr "alan kısıtlaması (domain constraint)"
+
+#: describe.c:1254
+msgid "operator class"
+msgstr "operatör sınıfı"
+
+#: describe.c:1283
+msgid "operator family"
+msgstr "operatör ailesi"
+
+#: describe.c:1305
+msgid "rule"
+msgstr "rule"
+
+#: describe.c:1347
+msgid "Object descriptions"
+msgstr "Nesne açıklamaları"
+
+#: describe.c:1403 describe.c:3762
+#, fuzzy, c-format
+#| msgid "Did not find any relation named \"%s\".\n"
+msgid "Did not find any relation named \"%s\"."
+msgstr "\"%s\" adında nesne bulunamadı.\n"
+
+#: describe.c:1406 describe.c:3765
+#, fuzzy, c-format
+#| msgid "Did not find any relations.\n"
+msgid "Did not find any relations."
+msgstr "Hiç bir nesne bulunamadı.\n"
+
+#: describe.c:1661
+#, fuzzy, c-format
+#| msgid "Did not find any relation with OID %s.\n"
+msgid "Did not find any relation with OID %s."
+msgstr "OID %s olan nesne bulunamadı.\n"
+
+#: describe.c:1713 describe.c:1737
+msgid "Start"
+msgstr "BaÅŸlat"
+
+#: describe.c:1714 describe.c:1738
+msgid "Minimum"
+msgstr "Asgari (min)"
+
+#: describe.c:1715 describe.c:1739
+msgid "Maximum"
+msgstr "Azami (max)"
+
+#: describe.c:1716 describe.c:1740
+msgid "Increment"
+msgstr "Artım"
+
+#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4184
+#: describe.c:4350 describe.c:4464 describe.c:4469
+msgid "yes"
+msgstr "evet"
+
+#: describe.c:1718 describe.c:1742 describe.c:1873 describe.c:4184
+#: describe.c:4347 describe.c:4464
+msgid "no"
+msgstr "hayır"
+
+#: describe.c:1719 describe.c:1743
+msgid "Cycles?"
+msgstr "Döngüler?"
+
+#: describe.c:1720 describe.c:1744
+msgid "Cache"
+msgstr "Önbellek"
+
+#: describe.c:1787
+#, c-format
+msgid "Owned by: %s"
+msgstr "Sahibi: %s"
+
+#: describe.c:1791
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "Kimlik (identity) sütunu için sıra (seq.) : %s"
+
+#: describe.c:1798
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "Sequence \"%s.%s\""
+
+#: describe.c:1934
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Loglanmayan tablo \"%s.%s\" "
+
+#: describe.c:1937
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Tablo \"%s.%s\""
+
+#: describe.c:1941
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "View \"%s.%s\""
+
+#: describe.c:1946
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Loglanmayan maddileştirilmiş görünüm (materialized view) \"%s.%s\""
+
+#: describe.c:1949
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "\"%s.%s\" maddileştirilmiş görünümü (materialized view)"
+
+#: describe.c:1954
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Loglanmayan index \"%s.%s\""
+
+#: describe.c:1957
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Ä°ndex \"%s.%s\""
+
+#: describe.c:1962
+#, fuzzy, c-format
+#| msgid "Unlogged index \"%s.%s\""
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Loglanmayan index \"%s.%s\""
+
+#: describe.c:1965
+#, fuzzy, c-format
+#| msgid "Unlogged index \"%s.%s\""
+msgid "Partitioned index \"%s.%s\""
+msgstr "Loglanmayan index \"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "Özel nesne \"%s.%s\""
+
+#: describe.c:1974
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST tablosu \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "BirleÅŸik veri tipi \"%s.%s\""
+
+#: describe.c:1982
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "\"%s.%s\" uzak (foreign) tablosu "
+
+#: describe.c:1987
+#, fuzzy, c-format
+#| msgid "Unlogged table \"%s.%s\""
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Loglanmayan tablo \"%s.%s\" "
+
+#: describe.c:1990
+#, fuzzy, c-format
+#| msgid "Foreign table \"%s.%s\""
+msgid "Partitioned table \"%s.%s\""
+msgstr "\"%s.%s\" uzak (foreign) tablosu "
+
+#: describe.c:2006 describe.c:4097
+msgid "Collation"
+msgstr "Sıralama (collation)"
+
+#: describe.c:2007 describe.c:4104
+msgid "Nullable"
+msgstr "BoÅŸ (null) olabilir"
+
+#: describe.c:2008 describe.c:4105
+msgid "Default"
+msgstr "Varsayılan"
+
+#: describe.c:2011
+msgid "Key?"
+msgstr "Anahtar?"
+
+#: describe.c:2013
+msgid "Definition"
+msgstr "Tanım"
+
+#: describe.c:2015 describe.c:5215 describe.c:5299 describe.c:5370
+#: describe.c:5434
+msgid "FDW options"
+msgstr "FDW Seçenekleri"
+
+#: describe.c:2017
+msgid "Storage"
+msgstr "Saklama"
+
+#: describe.c:2019
+msgid "Stats target"
+msgstr "Stats hedefi"
+
+#: describe.c:2137
+#, c-format
+msgid "Partition of: %s %s"
+msgstr ""
+
+#: describe.c:2145
+msgid "No partition constraint"
+msgstr "Bölümleme kısıtlaması yok"
+
+#: describe.c:2147
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "Bölümleme kısıtlaması: %s"
+
+#: describe.c:2170
+#, c-format
+msgid "Partition key: %s"
+msgstr "Bölümleme anahtarı: %s"
+
+#: describe.c:2239
+msgid "primary key, "
+msgstr "birincil anahtar, "
+
+#: describe.c:2241
+msgid "unique, "
+msgstr "tekil, "
+
+#: describe.c:2247
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "\"%s.%s\" tablosu için "
+
+#: describe.c:2251
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", belirli (%s)"
+
+#: describe.c:2254
+msgid ", clustered"
+msgstr ", clustered"
+
+#: describe.c:2257
+msgid ", invalid"
+msgstr ", geçersiz"
+
+#: describe.c:2260
+msgid ", deferrable"
+msgstr ", ertelenebilir"
+
+#: describe.c:2263
+msgid ", initially deferred"
+msgstr ", başlangıçta ertelenmiş"
+
+#: describe.c:2266
+msgid ", replica identity"
+msgstr ", replika kimliÄŸi "
+
+#: describe.c:2325
+msgid "Indexes:"
+msgstr "Ä°ndeksler:"
+
+#: describe.c:2409
+msgid "Check constraints:"
+msgstr "Check constraints:"
+
+#: describe.c:2477
+msgid "Foreign-key constraints:"
+msgstr "İkincil anahtar sınırlamaları:"
+
+#: describe.c:2540
+msgid "Referenced by:"
+msgstr "Referans veren:"
+
+#: describe.c:2590
+msgid "Policies:"
+msgstr "Ä°lkeler:"
+
+#: describe.c:2593
+msgid "Policies (forced row security enabled):"
+msgstr "İlkeler (zorunlu satır güvenliği etkin):"
+
+#: describe.c:2596
+msgid "Policies (row security enabled): (none)"
+msgstr "İlkeler (satır güvenliği etkin): (hiçbiri)"
+
+#: describe.c:2599
+msgid "Policies (forced row security enabled): (none)"
+msgstr "İlkeler (zorunlu satır güvenliği etkin): (hiçbiri)"
+
+#: describe.c:2602
+msgid "Policies (row security disabled):"
+msgstr "İlkeler (satır güvenliği devre dışı):"
+
+#: describe.c:2665
+msgid "Statistics objects:"
+msgstr "Ä°statistik nesneleri:"
+
+#: describe.c:2774 describe.c:2878
+msgid "Rules:"
+msgstr "Rulelar:"
+
+#: describe.c:2777
+msgid "Disabled rules:"
+msgstr "Devre dışı bırakılmış rule'lar:"
+
+#: describe.c:2780
+msgid "Rules firing always:"
+msgstr "Her zaman çalıştırılan rule'ler:"
+
+#: describe.c:2783
+msgid "Rules firing on replica only:"
+msgstr "Sadece kopyada çalıştırılan rule'ler:"
+
+#: describe.c:2823
+msgid "Publications:"
+msgstr "Yayınlar (publication):"
+
+#: describe.c:2861
+msgid "View definition:"
+msgstr "View tanımı:"
+
+#: describe.c:3000
+msgid "Triggers:"
+msgstr "Tetikleyiciler(Triggers):"
+
+#: describe.c:3004
+msgid "Disabled user triggers:"
+msgstr "Devre dışı kullanıcı tetikleyicileri:"
+
+#: describe.c:3006
+msgid "Disabled triggers:"
+msgstr "Devre dışı bırakılmış tetikleyiciler:"
+
+#: describe.c:3009
+msgid "Disabled internal triggers:"
+msgstr "Devre dışı dahili tetikleyiciler:"
+
+#: describe.c:3012
+msgid "Triggers firing always:"
+msgstr "Her zaman çalıştırılan tetikleyiciler:"
+
+#: describe.c:3015
+msgid "Triggers firing on replica only:"
+msgstr "Sadece kopyada çalıştırılan tetikleyiciler:"
+
+#: describe.c:3074
+#, c-format
+msgid "Server: %s"
+msgstr "Sunucu: %s"
+
+#: describe.c:3082
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW Seçenekleri: (%s)"
+
+#: describe.c:3101
+msgid "Inherits"
+msgstr "Inherits"
+
+#: describe.c:3160
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "Bölümlemelerin (partition) sayısı: %d"
+
+#: describe.c:3169
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "alt tabloların sayısı: %d (Listelemek için \\d+ kullanabilirsiniz.)"
+
+#: describe.c:3171
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "Bölümlemelerin (partition) sayısı: %d (Listelemek için \\d+ kullanabilirsiniz.)"
+
+#: describe.c:3179
+msgid "Child tables"
+msgstr "Alt tablolar"
+
+#: describe.c:3179
+msgid "Partitions"
+msgstr "Bölümlemeler (partition)"
+
+#: describe.c:3222
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "%s tipi için tipli tablo"
+
+#: describe.c:3238
+msgid "Replica Identity"
+msgstr "Replika özdeşliği"
+
+#: describe.c:3251
+msgid "Has OIDs: yes"
+msgstr "OID'ler mevcut: evet"
+
+#: describe.c:3260
+#, fuzzy, c-format
+#| msgid "access method %s"
+msgid "Access method: %s"
+msgstr "%s erişim yöntemi"
+
+#: describe.c:3339
+#, 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:3351
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", tablespace \"%s\""
+
+#: describe.c:3444
+msgid "List of roles"
+msgstr "Veritabanı rolleri listesi"
+
+#: describe.c:3446
+msgid "Role name"
+msgstr "Rol adı"
+
+#: describe.c:3447
+msgid "Attributes"
+msgstr "Özellikler"
+
+#: describe.c:3448
+msgid "Member of"
+msgstr "Ãœyesidir"
+
+#: describe.c:3459
+msgid "Superuser"
+msgstr "Superuser"
+
+#: describe.c:3462
+msgid "No inheritance"
+msgstr "Miras yok"
+
+#: describe.c:3465
+msgid "Create role"
+msgstr "Rol oluÅŸtur"
+
+#: describe.c:3468
+msgid "Create DB"
+msgstr "Veritabanı Oluştur"
+
+#: describe.c:3471
+msgid "Cannot login"
+msgstr "Giriş yapılamıyor"
+
+#: describe.c:3475
+msgid "Replication"
+msgstr "Replikasyon"
+
+#: describe.c:3479
+msgid "Bypass RLS"
+msgstr "RLS'yi atlat"
+
+#: describe.c:3488
+msgid "No connections"
+msgstr "Bağlantı yok"
+
+#: describe.c:3490
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d bağlantı"
+msgstr[1] "1 bağlantı"
+
+#: describe.c:3500
+msgid "Password valid until "
+msgstr "Parola geçerlilik tarihi"
+
+#: describe.c:3550
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support per-database role settings.\n"
+msgid "The server (version %s) does not support per-database role settings."
+msgstr "Bu sunucu (%s sürümü) veritabanlarına özgü rol ayarlarını desteklememektedir.\n"
+
+#: describe.c:3563
+msgid "Role"
+msgstr "Rol"
+
+#: describe.c:3564
+msgid "Database"
+msgstr "Veritabanı"
+
+#: describe.c:3565
+msgid "Settings"
+msgstr "Ayarlar"
+
+#: describe.c:3586
+#, fuzzy, c-format
+#| msgid "Did not find any settings for role \"%s\" and database \"%s\".\n"
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "\"%s\" rolü ve \"%s\" veritabanı için ayar bulunamadı.\n"
+
+#: describe.c:3589
+#, fuzzy, c-format
+#| msgid "Did not find any settings for role \"%s\".\n"
+msgid "Did not find any settings for role \"%s\"."
+msgstr "\"%s\" rolü için ayar bulunamadı.\n"
+
+#: describe.c:3592
+#, fuzzy, c-format
+#| msgid "Did not find any settings.\n"
+msgid "Did not find any settings."
+msgstr "Hiç bir ayar bulunamadı.\n"
+
+#: describe.c:3597
+msgid "List of settings"
+msgstr "Seçeneklerin lsitesi"
+
+#: describe.c:3667
+msgid "index"
+msgstr "indeks"
+
+#: describe.c:3669
+msgid "special"
+msgstr "özel"
+
+#: describe.c:3672 describe.c:3857
+#, fuzzy
+#| msgid "partition_name"
+msgid "partitioned index"
+msgstr "bölümleme(partition)_adı"
+
+#: describe.c:3770
+msgid "List of relations"
+msgstr "Nesnelerin listesi"
+
+#: describe.c:3818
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support collations.\n"
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Bu sunucu (%s sürümü) karşılaştırmaları (collations) desteklememektedir.\n"
+
+#: describe.c:3829
+#, fuzzy
+#| msgid "\"%s\" is not partitioned"
+msgid "List of partitioned indexes"
+msgstr "\"%s\" bölümlendirilmemiş"
+
+#: describe.c:3831
+#, fuzzy
+#| msgid "\"%s\" is a partitioned table"
+msgid "List of partitioned tables"
+msgstr "\"%s\" bölümlenmiş bir tablodur"
+
+#: describe.c:3835
+#, fuzzy
+#| msgid "List of relations"
+msgid "List of partitioned relations"
+msgstr "Nesnelerin listesi"
+
+#: describe.c:3866
+#, fuzzy
+#| msgid "Token name"
+msgid "Parent name"
+msgstr "Token adı"
+
+#: describe.c:3879
+#, fuzzy
+#| msgid "Partitions"
+msgid "Leaf partition size"
+msgstr "Bölümlemeler (partition)"
+
+#: describe.c:3882 describe.c:3888
+msgid "Total size"
+msgstr ""
+
+#: describe.c:4020
+msgid "Trusted"
+msgstr "Güvenilir"
+
+#: describe.c:4028
+msgid "Internal language"
+msgstr "Dahili dil"
+
+#: describe.c:4029
+msgid "Call handler"
+msgstr "Çağrı işleyici"
+
+#: describe.c:4030 describe.c:5202
+msgid "Validator"
+msgstr "Onaylayan"
+
+#: describe.c:4033
+msgid "Inline handler"
+msgstr "Satır içi işleyici"
+
+#: describe.c:4061
+msgid "List of languages"
+msgstr "Dil listesi"
+
+#: describe.c:4106
+msgid "Check"
+msgstr "Check"
+
+#: describe.c:4148
+msgid "List of domains"
+msgstr "Domainlerin listesi"
+
+#: describe.c:4182
+msgid "Source"
+msgstr "Kaynak"
+
+#: describe.c:4183
+msgid "Destination"
+msgstr "Hedef"
+
+#: describe.c:4185
+msgid "Default?"
+msgstr "Varsayılan?"
+
+#: describe.c:4222
+msgid "List of conversions"
+msgstr "Dönüşümlerin listesi"
+
+#: describe.c:4261
+msgid "Event"
+msgstr "Olay"
+
+#: describe.c:4263
+msgid "enabled"
+msgstr "etkin"
+
+#: describe.c:4264
+msgid "replica"
+msgstr "replika"
+
+#: describe.c:4265
+msgid "always"
+msgstr "daima"
+
+#: describe.c:4266
+msgid "disabled"
+msgstr "devre dışı bırakılmış"
+
+#: describe.c:4267 describe.c:5901
+msgid "Enabled"
+msgstr "Etkin"
+
+#: describe.c:4269
+msgid "Tags"
+msgstr "Etiketler (tag)"
+
+#: describe.c:4288
+msgid "List of event triggers"
+msgstr "Olay tetikleyicilerin listesi"
+
+#: describe.c:4317
+msgid "Source type"
+msgstr "Kaynak tipi"
+
+#: describe.c:4318
+msgid "Target type"
+msgstr "Hedef tipi"
+
+#: describe.c:4349
+msgid "in assignment"
+msgstr "in assignment"
+
+#: describe.c:4351
+msgid "Implicit?"
+msgstr "Örtülü mü?"
+
+#: describe.c:4406
+msgid "List of casts"
+msgstr "Castlerin listesi"
+
+#: describe.c:4434
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support collations.\n"
+msgid "The server (version %s) does not support collations."
+msgstr "Bu sunucu (%s sürümü) karşılaştırmaları (collations) desteklememektedir.\n"
+
+#: describe.c:4455 describe.c:4459
+msgid "Provider"
+msgstr "Sağlayıcı"
+
+#: describe.c:4465 describe.c:4470
+msgid "Deterministic?"
+msgstr ""
+
+#: describe.c:4505
+msgid "List of collations"
+msgstr "Karşılaştırma (collations) listesi"
+
+#: describe.c:4564
+msgid "List of schemas"
+msgstr "Şemaların listesi"
+
+#: describe.c:4589 describe.c:4836 describe.c:4907 describe.c:4978
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support full text search.\n"
+msgid "The server (version %s) does not support full text search."
+msgstr "Bu sunucu (%s sürümü) tam metin aramayı desteklememektedir.\n"
+
+#: describe.c:4624
+msgid "List of text search parsers"
+msgstr "Metin arama ayrıştıcılarının listesi"
+
+#: describe.c:4669
+#, fuzzy, c-format
+#| msgid "Did not find any text search parser named \"%s\".\n"
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "\"%s\" adında metin arama ayrıştırıcısı bulunamadı.\n"
+
+#: describe.c:4672
+#, fuzzy, c-format
+#| msgid "Did not find any text search parsers.\n"
+msgid "Did not find any text search parsers."
+msgstr "Metin arama ayrıştırıcısı bulunamadı.\n"
+
+#: describe.c:4747
+msgid "Start parse"
+msgstr "Ayrıştırmayı başlat"
+
+#: describe.c:4748
+msgid "Method"
+msgstr "Yöntem"
+
+#: describe.c:4752
+msgid "Get next token"
+msgstr "Sıradaki tokeni al"
+
+#: describe.c:4754
+msgid "End parse"
+msgstr "Ayrıştırmayı bitir"
+
+#: describe.c:4756
+msgid "Get headline"
+msgstr "Başlığı al"
+
+#: describe.c:4758
+msgid "Get token types"
+msgstr "Token tiplerini al"
+
+#: describe.c:4769
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "Metin arama ayrıştırıcısı \"%s.%s\""
+
+#: describe.c:4772
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "\"%s\" metin arama ayrıştırıcısı"
+
+#: describe.c:4791
+msgid "Token name"
+msgstr "Token adı"
+
+#: describe.c:4802
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "\"%s.%s\" ayrıştırıcısı için token tipleri"
+
+#: describe.c:4805
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "\"%s\" ayrıştırıcısı için token tipleri"
+
+#: describe.c:4859
+msgid "Template"
+msgstr "Åžablon"
+
+#: describe.c:4860
+msgid "Init options"
+msgstr "İnit seçenekleri"
+
+#: describe.c:4882
+msgid "List of text search dictionaries"
+msgstr "Metin arama sözlüklerinin listesi"
+
+#: describe.c:4925
+msgid "Init"
+msgstr "Init"
+
+#: describe.c:4926
+msgid "Lexize"
+msgstr "Lexize"
+
+#: describe.c:4953
+msgid "List of text search templates"
+msgstr "Metin arama şablonlarının listesi"
+
+#: describe.c:5013
+msgid "List of text search configurations"
+msgstr "Metin arama yapılandırmalarının listesi"
+
+#: describe.c:5059
+#, fuzzy, c-format
+#| msgid "Did not find any text search configuration named \"%s\".\n"
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "\"%s\" adında metin arama yapılandırması bulunamadı.\n"
+
+#: describe.c:5062
+#, fuzzy, c-format
+#| msgid "Did not find any text search configurations.\n"
+msgid "Did not find any text search configurations."
+msgstr "Metin arama yapılandırması bulunamadı.\n"
+
+#: describe.c:5128
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5129
+msgid "Dictionaries"
+msgstr "Sözlükler"
+
+#: describe.c:5140
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "Metin arama yapılandırması \"%s.%s\""
+
+#: describe.c:5143
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "Metin arama yapılandırması \"%s\""
+
+#: describe.c:5147
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"Ayrıştırıcı \"%s.%s\""
+
+#: describe.c:5150
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"Ayrıştırıcı: \"%s\""
+
+#: describe.c:5184
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support foreign-data wrappers.\n"
+msgid "The server (version %s) does not support foreign-data wrappers."
+msgstr "Sunucu (%s sürümü) foreign-data wrapperlarını desteklememektedir.\n"
+
+#: describe.c:5242
+msgid "List of foreign-data wrappers"
+msgstr "Foreign-data wrapperlarının listesi"
+
+#: describe.c:5267
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support foreign servers.\n"
+msgid "The server (version %s) does not support foreign servers."
+msgstr "Bu sunucu (%s sürümü) uzak (foreign) sunucuları desteklemiyor.\n"
+
+#: describe.c:5280
+msgid "Foreign-data wrapper"
+msgstr "Foreign-data wrapper"
+
+#: describe.c:5298 describe.c:5503
+msgid "Version"
+msgstr "Sürüm"
+
+#: describe.c:5324
+msgid "List of foreign servers"
+msgstr "Foreign sunucuların listesi"
+
+#: describe.c:5349
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support user mappings.\n"
+msgid "The server (version %s) does not support user mappings."
+msgstr "Sunucu (%s sürümü) kullanıcı haritalamasını desteklememektedir.\n"
+
+#: describe.c:5359 describe.c:5423
+msgid "Server"
+msgstr "Sunucu"
+
+#: describe.c:5360
+msgid "User name"
+msgstr "Kullanıcı adı"
+
+#: describe.c:5385
+msgid "List of user mappings"
+msgstr "Kullanıcı eşlemelerinin listesi"
+
+#: describe.c:5410
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support foreign tables.\n"
+msgid "The server (version %s) does not support foreign tables."
+msgstr "Bu sunucu (%s sürümü) uzak (foreign) tabloları desteklemiyor.\n"
+
+#: describe.c:5463
+msgid "List of foreign tables"
+msgstr "Uzak (foreign) tabloların listesi"
+
+#: describe.c:5488 describe.c:5545
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support extensions.\n"
+msgid "The server (version %s) does not support extensions."
+msgstr "Bu sunucu (%s sürümü) uzantıları (extension) desteklememektedir.\n"
+
+#: describe.c:5520
+msgid "List of installed extensions"
+msgstr "Kurulu uzantıların (extension) listesi"
+
+#: describe.c:5573
+#, fuzzy, c-format
+#| msgid "Did not find any extension named \"%s\".\n"
+msgid "Did not find any extension named \"%s\"."
+msgstr "\"%s\" adında uzantı (extension) bulunamadı.\n"
+
+#: describe.c:5576
+#, fuzzy, c-format
+#| msgid "Did not find any extensions.\n"
+msgid "Did not find any extensions."
+msgstr "Hiç bir uzantı bulunamadı.\n"
+
+#: describe.c:5620
+msgid "Object description"
+msgstr "Nesne açıklaması"
+
+#: describe.c:5630
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "\"%s\" uzantısındaki nesneler"
+
+#: describe.c:5659 describe.c:5730
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support publications.\n"
+msgid "The server (version %s) does not support publications."
+msgstr "Bu sunucu (%s sürümü) yayınları (publication) desteklememektedir.\n"
+
+#: describe.c:5676 describe.c:5802
+msgid "All tables"
+msgstr "Bütün tablolar"
+
+#: describe.c:5677 describe.c:5803
+msgid "Inserts"
+msgstr "Eklemeler (insert)"
+
+#: describe.c:5678 describe.c:5804
+msgid "Updates"
+msgstr "Güncelleştirmeler (update)"
+
+#: describe.c:5679 describe.c:5805
+msgid "Deletes"
+msgstr "Silmeler (delete)"
+
+#: describe.c:5683 describe.c:5807
+msgid "Truncates"
+msgstr "Budamalar (truncate)"
+
+#: describe.c:5700
+msgid "List of publications"
+msgstr "Yayınların (publication) listesi"
+
+#: describe.c:5768
+#, fuzzy, c-format
+#| msgid "Did not find any publication named \"%s\".\n"
+msgid "Did not find any publication named \"%s\"."
+msgstr "\"%s\" adında yayın bulunamadı.\n"
+
+#: describe.c:5771
+#, fuzzy, c-format
+#| msgid "Did not find any publications.\n"
+msgid "Did not find any publications."
+msgstr "Hiç yayın bulunamadı.\n"
+
+#: describe.c:5798
+#, c-format
+msgid "Publication %s"
+msgstr "%s yayını (publication)"
+
+#: describe.c:5842
+msgid "Tables:"
+msgstr "Tablolar:"
+
+#: describe.c:5886
+#, fuzzy, c-format
+#| msgid "The server (version %s) does not support subscriptions.\n"
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Sunucu (%s sürümü) abonelikleri (subscription) desteklememektedir.\n"
+
+#: describe.c:5902
+msgid "Publication"
+msgstr "Yayın (publication)"
+
+#: describe.c:5909
+msgid "Synchronous commit"
+msgstr "Eşzamanlı commit"
+
+#: describe.c:5910
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:5932
+msgid "List of subscriptions"
+msgstr "Aboneliklerin listesi"
+
+#: help.c:74
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql PostgreSQL'in etkilişimli arayüzüdür.\n"
+"\n"
+
+#: help.c:75 help.c:349 help.c:425 help.c:468
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: help.c:76
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [SEÇENEK]... [VERİTABANI ADI [KULLANICI ADI]]\n"
+"\n"
+
+#: help.c:78
+#, c-format
+msgid "General options:\n"
+msgstr "Genel seçenekler:\n"
+
+#: help.c:83
+#, c-format
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=KOMUT tek bir komut çalıştır (SQL ya da dahili) ve çık\n"
+
+#: help.c:84
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME bağlanılacak veritabanının adı (öntanımlı: \"%s\")\n"
+
+#: help.c:85
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=DOSYA ADI dosyadan komutları çalıştır ve çık\n"
+
+#: help.c:86
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list veritabanlarını listele ve çık\n"
+
+#: help.c:87
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=ADI=DEÄžER\n"
+" ADI kısmında belirtilen psql değişkeninin değerini DEĞER ile belirtilen değer olarak ata\n"
+" (örnek, -v ON_ERROR_STOP=1)\n"
+"\n"
+
+#: help.c:90
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: help.c:91
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X , --no-psqlrc başlangıç dosyasını (~/.psqlrc) okuma\n"
+
+#: help.c:92
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" komut dosyasını tek bir transaction olarak çalıştır (interaktif değilse)\n"
+
+#: help.c:94
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] bu yardımı göster, sonra çık\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands \"\\\"komutlarını listele, sonra çık\n"
+
+#: help.c:96
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables özel değişkenleri listele, sonra çık\n"
+
+#: help.c:98
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"Giriş ve çıkış tercihleri:\n"
+
+#: help.c:99
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all betik dosyasının içeriğini yansıt\n"
+
+#: help.c:100
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -e, --echo-errors başarısız komutları yansıt\n"
+
+#: help.c:101
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries sunucuya gönderilen komutları yansıt\n"
+
+#: help.c:102
+#, c-format
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden dahili komutların ürettiği sorguları göster\n"
+
+#: help.c:103
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=DOSYA ADI oturum kaydını dosyaya kaydet\n"
+
+#: help.c:104
+#, c-format
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline gelişmiş komut satırı düzenleyicisini devre dışı bırak (readline)\n"
+
+#: help.c:105
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=DOSYA ADI sorgu sonuçlarını dosyaya aktar (ya da |pipe)\n"
+
+#: help.c:106
+#, c-format
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet sessiz biçim (mesajlar kapalı, sadece sorgu sonuçları açık)\n"
+
+#: help.c:107
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step tek adım biçimi (her sorguyu onaylama)\n"
+
+#: help.c:108
+#, c-format
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line tek satır modu (satır sonu SQL komutunu sonlandırır)\n"
+
+#: help.c:110
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"Çıktı biçimi seçenekleri:\n"
+
+#: help.c:111
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align dizilmemiş tablo çıktı modu\n"
+
+#: help.c:112
+#, fuzzy, c-format
+#| msgid " \\a toggle between unaligned and aligned output mode\n"
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " \\a düzenli ve düzensiz çıktı modu arasında geçiş yap\n"
+
+#: help.c:113
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=DÄ°ZGÄ°\n"
+" hizalanmamış çıktı için alan ayırıcısı (varsayılan: \"%s\")\n"
+
+#: help.c:116
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML tablosu çıktı modu\n"
+
+#: help.c:117
+#, c-format
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] VAR yazma ayarınına ARG değerini ata (\\pset komutuna bak)\n"
+
+#: help.c:118
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=DÄ°ZGÄ°\n"
+" hizalanmamış çıktı için kayıt ayırıcısı (varsayılan: yeni satır)\n"
+
+#: help.c:120
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only sadece satırları yaz\n"
+
+#: help.c:121
+#, c-format
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT HTML tablo tag parametrelerini ayarla (genişlik, kenarlık)\n"
+
+#: help.c:122
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded gelişmiş tablo çıktısını atkinleştir\n"
+
+#: help.c:123
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" hizalanmamış çıktı için alan ayırıcısını sıfır bayt'a ayarla\n"
+
+#: help.c:125
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" hizalanmamış çıktı için kayıt ayırıcısını sıfır bayt'a ayarla\n"
+
+#: help.c:128
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Bağlantı seçenekleri:\n"
+
+#: help.c:131
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host= HOST ADI veritabanı sunucu adresi ya da soket dizini (varsayılan: \"%s\")\n"
+
+#: help.c:132
+msgid "local socket"
+msgstr "yerel soket"
+
+#: help.c:135
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT veritabanı sunucusu port numarası (varsayılan: \"%s\")\n"
+
+#: help.c:141
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=KULLANICI ADI veritabanı kullanıcı adı (varsayılan: \"%s\")\n"
+
+#: help.c:142
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -W, --no-password bağlanmak için kesinlikle parola sorma\n"
+
+#: help.c:143
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W şifre sor (otomatik olarak her zaman açık)\n"
+
+#: help.c:145
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"Daha fazla bilgi için yapsql içinde: \"\\?\" (dahili komutlar için) ya \"\\help\"\n"
+"(SQL komutlar için) yazın, ya da PostgreSQL belgelerinin psql bölümüne \n"
+"bakın.\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr "Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: help.c:174
+#, c-format
+msgid "General\n"
+msgstr "Genel\n"
+
+#: help.c:175
+#, c-format
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright PostgreSQL kullanım ve dağıtım şartlarını göster\n"
+
+#: help.c:176
+#, c-format
+msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] sorguyu çalıştır ve sonuçları çapraz tablo içinde göster\n"
+
+#: help.c:177
+#, c-format
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose en son hata mesajını azami açıklamalı olarak göster\n"
+
+#: help.c:178
+#, c-format
+msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n"
+msgstr " \\g [DOSYA] or ; sorguyu çalıştır (ve sonucu dosyaya ya da |pipe'a gönder)\n"
+
+#: help.c:179
+#, c-format
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc sorguyu çalıştırmadan sonuçlarını tarif et\n"
+
+#: help.c:180
+#, c-format
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr ""
+
+#: help.c:181
+#, c-format
+msgid " \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr " \\gset [PREFIX] sorguyu çalıştır ve sonuçları psql değişkenlerinde sakla\n"
+
+#: help.c:182
+#, c-format
+msgid " \\gx [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [DOSYA] \\g gibi fakat genişletilmiş çıktı modu zorunlu\n"
+
+#: help.c:183
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q psql'den çık\n"
+
+#: help.c:184
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SNY] sorguyu her SNY saniyede bir çalıştır\n"
+
+#: help.c:187
+#, c-format
+msgid "Help\n"
+msgstr "Yardım\n"
+
+#: help.c:189
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [komutlar] \"\\\" komutları için yardım gösterir\n"
+
+#: help.c:190
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr ""
+" \\? options psql komut satırı seçenekleri için yardım göster\n"
+"\n"
+
+#: help.c:191
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables özel değişkenler hakkında yardım göster\n"
+
+#: help.c:192
+#, c-format
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] SQL komutları için sözdizimi yardımı, tüm komutlar için * ekleyin\n"
+
+#: help.c:195
+#, c-format
+msgid "Query Buffer\n"
+msgstr "Sorgu Tamponu (buffer)\n"
+
+#: help.c:196
+#, c-format
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] sorgu tamponunu (ya da dosyasını) harici bir metin düzenleyici ile düzenle\n"
+
+#: help.c:197
+#, c-format
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] fonksiyon tanımını harici bir metin düzenleyici ile düzenle\n"
+
+#: help.c:198
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] görünüm (view) tanımını harici bir metin düzenleyici ile düzenle\n"
+
+#: help.c:199
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p sorgu tamponunun içeriğini göster\n"
+
+#: help.c:200
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r sorgu tamponunu sıfırla (temizle)\n"
+
+#: help.c:202
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [DOSYA] geçmişi göster ya da dosyaya kaydet\n"
+
+#: help.c:204
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w DOSYA sorgu tamponunu dosyaya kaydet\n"
+
+#: help.c:207
+#, c-format
+msgid "Input/Output\n"
+msgstr "Giriş/Çıkış\n"
+
+#: help.c:208
+#, c-format
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... istemci sisteminden veri akımı ile SQL COPY komutunu çalıştır\n"
+
+#: help.c:209
+#, c-format
+msgid " \\echo [STRING] write string to standard output\n"
+msgstr " \\echo [METIN] standart çıktıya bir satır gönder\n"
+
+#: help.c:210
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i DOSYA dosyadaki komutları çalıştıre\n"
+
+#: help.c:211
+#, c-format
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir DOSYA \\i gibi, fakat geçerli betiğin bulunduğu yere göre\n"
+
+#: help.c:212
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [DOSYA] tüm sorgu sonuçlarını dosyaya ya da |pipe'e gönder\n"
+
+#: help.c:213
+#, c-format
+msgid " \\qecho [STRING] write string to query output stream (see \\o)\n"
+msgstr " \\qecho [STRING] sorgu çıktı akımına dizgi yaz (\\o seçeneğine bakınız)\n"
+
+#: help.c:216
+#, c-format
+msgid "Conditional\n"
+msgstr "Şartlı\n"
+
+#: help.c:217
+#, c-format
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR şartlı bloğa başla\n"
+
+#: help.c:218
+#, c-format
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR geçerli şartlı blok içinde alternatif\n"
+
+#: help.c:219
+#, c-format
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else geçerli şartlı blok içinde son alternatif\n"
+
+#: help.c:220
+#, c-format
+msgid " \\endif end conditional block\n"
+msgstr " \\endif şartlı bloğu sonlandır\n"
+
+#: help.c:223
+#, c-format
+msgid "Informational\n"
+msgstr "Bilgi edinme\n"
+
+#: help.c:224
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (seçenekler: S = sistem nesnelerini göster, + = ek ayrıntılar)\n"
+
+#: help.c:225
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] tablo, views, ve sequenceleri listele\n"
+
+#: help.c:226
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+} AD tablo, indeks, sequence, ya da view tanımlarını göster\n"
+
+#: help.c:227
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] aggregateleri listele\n"
+
+#: help.c:228
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] erişim yöntemlerini listele\n"
+
+#: help.c:229
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] tablespaceleri listele\n"
+
+#: help.c:230
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] dönüşümleri listele\n"
+
+#: help.c:231
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] castleri listele\n"
+
+#: help.c:232
+#, c-format
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] başka yerde gösterilmeyen nesne açıklamalarını göster\n"
+
+#: help.c:233
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] domainleri listele\n"
+
+#: help.c:234
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] öntanımlı izinleri listele\n"
+
+#: help.c:235
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] uzak (foreign) tabloları listele\n"
+
+#: help.c:236
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] foreign tabloları listele\n"
+
+#: help.c:237
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] foreign sunucuları listele\n"
+
+#: help.c:238
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] kullanıcı haritalamasını listele\n"
+
+#: help.c:239
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] foreign-data wrapperlarını listele\n"
+
+#: help.c:240
+#, fuzzy, c-format
+#| msgid " \\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions\n"
+msgid " \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions\n"
+msgstr " \\df[antw][S+] [PATRN] [sadece agg/normal/trigger/window] fonksiyonlarını listele\n"
+
+#: help.c:241
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] metin arama yapılandırmalarını listele\n"
+
+#: help.c:242
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] metin arama sözlüklerini listele\n"
+
+#: help.c:243
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] metin arama ayrıştırıcılarını listele\n"
+
+#: help.c:244
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] metin arama şablonlarını listele\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] rolleri listele\n"
+
+#: help.c:246
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] indexleri göster\n"
+
+#: help.c:247
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr " \\dl large objectleri göster; \\lo_list ile aynıdır\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] yordamsal dilleri listele\n"
+
+#: help.c:249
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] maddileştirilmiş görünümleri (materialized view) listele\n"
+
+#: help.c:250
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] şemaları listele\n"
+
+#: help.c:251
+#, c-format
+msgid " \\do[S] [PATTERN] list operators\n"
+msgstr " \\do[S] [PATTERN] operatörleri listele\n"
+
+#: help.c:252
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] collationları listele\n"
+
+#: help.c:253
+#, c-format
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [PATTERN] tablo, view, ve sequence eriÅŸim izinlerini listele\n"
+
+#: help.c:254
+#, fuzzy, c-format
+#| msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgid " \\dP[tin+] [PATTERN] list [only table/index] partitioned relations\n"
+msgstr " \\dRp[+] [PATTERN] replikasyon yayınlarını listele\n"
+
+#: help.c:255
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [PATRN1 [PATRN2]] veritabanı başına rol ayarlarını listele\n"
+
+#: help.c:256
+#, c-format
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] replikasyon yayınlarını listele\n"
+
+#: help.c:257
+#, c-format
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] replikasyon aboneliklerini listele\n"
+
+#: help.c:258
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] sequenceları listele\n"
+
+#: help.c:259
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] tabloları listele\n"
+
+#: help.c:260
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] veri tiplerini listele\n"
+
+#: help.c:261
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] rolleri listele\n"
+
+#: help.c:262
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] viewları listele\n"
+
+#: help.c:263
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] uzantıları listele\n"
+
+#: help.c:264
+#, c-format
+msgid " \\dy [PATTERN] list event triggers\n"
+msgstr " \\dy [PATTERN] olay tetikleyicilerini listele\n"
+
+#: help.c:265
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] veritabanlarını listele\n"
+
+#: help.c:266
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME fonksiyonun tanımını göster\n"
+
+#: help.c:267
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME görünümün (view) tanımını göster\n"
+
+#: help.c:268
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [PATTERN] \\dp ile aynı\n"
+
+#: help.c:271
+#, c-format
+msgid "Formatting\n"
+msgstr "Biçimlendirme:\n"
+
+#: help.c:272
+#, c-format
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a düzenli ve düzensiz çıktı modu arasında geçiş yap\n"
+
+#: help.c:273
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [DİZİ] tablo başlığını ayarla, ya da boş bırakılırsa kaldır\n"
+
+#: help.c:274
+#, c-format
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [DİZİ] düzensiz sorgu çıktısı için alan ayracını göster ya da tanımla\n"
+
+#: help.c:275
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H HTML çıktı modunu değiştir (şu anda %s)\n"
+
+#: help.c:277
+#, fuzzy, c-format
+#| msgid ""
+#| " \\pset [NAME [VALUE]] set table output option\n"
+#| " (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|\n"
+#| " footer|format|linestyle|null|numericlocale|pager|\n"
+#| " pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
+#| " tuples_only|unicode_border_linestyle|\n"
+#| " unicode_column_linestyle|unicode_header_linestyle})\n"
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] tablo çıktı seçeneğini ayarla\n"
+" (NAME := {border|columns|expanded|fieldsep|fieldsep_zero|\n"
+" footer|format|linestyle|null|numericlocale|pager|\n"
+" pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n"
+" tuples_only|unicode_border_linestyle|\n"
+" unicode_column_linestyle|unicode_header_linestyle})\n"
+
+#: help.c:284
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] sadece satırları göster (şu an %s)\n"
+
+#: help.c:286
+#, c-format
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [DİZGİ] HTML <table> parametrelerini tanımla, boş ise tüm parametrelerini kaldır\n"
+
+#: help.c:287
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] geniş çıktı ayarla (şu an %s)\n"
+
+#: help.c:291
+#, c-format
+msgid "Connection\n"
+msgstr "Bağlantı\n"
+
+#: help.c:293
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[VTADI|- KULLANICIADI|- KARÅžISUNUCU|- PORT|-] | conninfo}\n"
+" yeni veritabanına bağlan (geçerli veritabanı \"%s\")\n"
+
+#: help.c:297
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[VTADI|- KULLANICIADI|- KARÅžISUNUCU|- PORT|-] | conninfo}\n"
+" yeni veritabanına bağlan (geçerli bağlantı yok)\n"
+
+#: help.c:299
+#, c-format
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo geçerli bağlantı ile ilgili bilgi göster\n"
+
+#: help.c:300
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [KODLAMA] istemci dil kodlamasını göster\n"
+
+#: help.c:301
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [KULLANICI ADI] kullanıcının parolasını güvenli şekilde değiştir\n"
+
+#: help.c:304
+#, c-format
+msgid "Operating System\n"
+msgstr "iÅŸletim Sistemi\n"
+
+#: help.c:305
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] geçerli çalışma dizinini değiştir\n"
+
+#: help.c:306
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] ortam değişkenini ayarla ya da ayarları sıfırla\n"
+
+#: help.c:307
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] komutların çalışma zamanlamasının gösterilmesini değiştir (şu anda %s)\n"
+
+#: help.c:309
+#, c-format
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [KOMUT] komutu kabukta çalıştır ya da etkileşimli kabuğu başlat\n"
+
+#: help.c:312
+#, c-format
+msgid "Variables\n"
+msgstr "DeÄŸiÅŸkenler\n"
+
+#: help.c:313
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [METİN] AD kullanıcıdan dahili değişkeni değiştirmesini iste\n"
+
+#: help.c:314
+#, c-format
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [AD [DEĞER]] dahili değişkene değer ata, DEĞER boş ise tüm değişkenlerin listesini göster\n"
+
+#: help.c:315
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset AD dahili değişkenleri sıfırla(sil)\n"
+
+#: help.c:318
+#, c-format
+msgid "Large Objects\n"
+msgstr "Large Objectler\n"
+
+#: help.c:319
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID DOSYA\n"
+" \\lo_import DOSYA [YORUM]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operasyonları\n"
+
+#: help.c:346
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"Özel değişkenlerin listesi\n"
+"\n"
+
+#: help.c:348
+#, c-format
+msgid "psql variables:\n"
+msgstr "psql deÄŸiÅŸkenleri:\n"
+
+#: help.c:350
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" veya psql içinde \\set NAME VALUE\n"
+"\n"
+
+#: help.c:352
+#, c-format
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" ayarlanırsa, başarılı SQL komutları otomatik olarak \"commit\" edilir\n"
+
+#: help.c:354
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" SQL anahtar kelimeleri tamamlanırken kullanılacak büyük/küçük harf seçeneğini belirler\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:357
+#, c-format
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" geçerli durumda bağlanılan veritabanının adı\n"
+
+#: help.c:359
+#, c-format
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" hangi girdinin standart çıktıya yazılacağını kontrol eder\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:362
+#, c-format
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" ayarlanırsa ters-taksimli komutlar tarafından çalıştırılan dahili sorguları gösterir ;\n"
+" \"noexec\" olarak ayarlanırsa, çalıştırmadan sadece gösterir \n"
+
+#: help.c:365
+#, c-format
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" geçerli istemci karakter kümesi kodlaması\n"
+
+#: help.c:367
+#, c-format
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" ERROR\n"
+" son sorgu hatalıysa true, değilse false\n"
+
+#: help.c:369
+#, c-format
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" bir defada alınacak ve gösterilecek sonuç satırı sayısı ( 0=sınırsız)\n"
+
+#: help.c:371
+#, c-format
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+
+#: help.c:373
+#, c-format
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL \n"
+" komut geçmişini kontrol eder [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE \n"
+" komut geçmişini saklamak için kullanılacak dosya adı\n"
+
+#: help.c:377
+#, fuzzy, c-format
+#| msgid ""
+#| " HISTSIZE\n"
+#| " max number of commands to store in the command history\n"
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" komut geçmişinde saklanacak komut sayısı üst sınırı\n"
+
+#: help.c:379
+#, c-format
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" geçerli durumda bağlanılan veritabanı sunucu makinesi\n"
+
+#: help.c:381
+#, c-format
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" interaktif bir oturumu sonlandırmak için gereken EOF (dosya sonu) sayısı\n"
+
+#: help.c:383
+#, c-format
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" etkilenen son OID'nin deÄŸeri\n"
+
+#: help.c:385
+#, c-format
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" son hatanın mesajı ve SQLSTATE değeri, veya boş dizgi ve \"00000\" eğer hiçbiri yoksa\n"
+
+#: help.c:388
+#, c-format
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" ayarlanırsa, bir hata bir işlemi (transaction) durdurmaz (örtük kayıt noktaları (savepoint) kullanır)\n"
+
+#: help.c:390
+#, c-format
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" hata sonrası yığın çalıştırmayı durdurur\n"
+
+#: help.c:392
+#, c-format
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" geçerli bağlantının sunucu port'u\n"
+
+#: help.c:394
+#, c-format
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" standart psql komut istemi\n"
+
+#: help.c:396
+#, c-format
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" bir komut önceki satırdan beri devam ediyorsa kullanılan komut istemini belirtir\n"
+
+#: help.c:398
+#, c-format
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" COPY ... FROM STDIN sırasında kullanılan komut istemini belirtir\n"
+
+#: help.c:400
+#, c-format
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" sessizce çalış (-q seçeneğiyle aynı)\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" son sorgu tarafından döndürülen veya etkilenen satır sayısı, veya 0\n"
+
+#: help.c:404
+#, c-format
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" sunucunun sürümü (kısa metin veya sayısal formatta)\n"
+
+#: help.c:407
+#, c-format
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" mesaj bağlam (context) alanlarının gösterimini kontrol eder [never, errors, always]\n"
+
+#: help.c:409
+#, c-format
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" satır sonu SQL komut modunu sonlandırır (-S seçeneğiyle aynı)\n"
+
+#: help.c:411
+#, c-format
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" single-step modu (-s seçeneğiyle aynı)\n"
+
+#: help.c:413
+#, c-format
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" son sorgunun SQLSTATE deÄŸeri, veya eÄŸer hata yoksa \"00000\"\n"
+
+#: help.c:415
+#, c-format
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" mevcut durumda bağlı veritabanı kullanıcısı\n"
+
+#: help.c:417
+#, fuzzy, c-format
+#| msgid ""
+#| " VERBOSITY\n"
+#| " controls verbosity of error reports [default, verbose, terse]\n"
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" hata raporlarının ayrıntı seviyesini kontrol eder [default, verbose, terse]\n"
+
+#: help.c:419
+#, c-format
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql'in sürümü (detaylı metin, kısa metin veya sayısal formatta)\n"
+
+#: help.c:424
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"Görüntüleme ayarları:\n"
+
+#: help.c:426
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" veya psql içinde \\pset NAME [VALUE]\n"
+"\n"
+
+#: help.c:428
+#, c-format
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" kenar biçimi (number)\n"
+
+#: help.c:430
+#, c-format
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" \"wrapped\" biçimi için hedef genişlik\n"
+
+#: help.c:432
+#, c-format
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr " expanded (veya x) genişletilmiş çıktı [on, off, auto]\n"
+
+#: help.c:434
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" hizalanmamış çıktı için alan ayrıcısı (varsayılan \"%s\")\n"
+
+#: help.c:437
+#, c-format
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" hizalanmamış çıktı için alan ayırıcısını sıfır bayt'a ayarla\n"
+
+#: help.c:439
+#, c-format
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" tablo alt bilgi alanının etkinleştirilme veya devre dışı bırakılması [on, off]\n"
+
+#: help.c:441
+#, c-format
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" çıktı biçimini ayarla [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:443
+#, c-format
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" kenar çizgisi biçimini ayarla [ascii, old-ascii, unicode]\n"
+
+#: help.c:445
+#, c-format
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" null değer yerine yazılacak dizgeyi ayarla\n"
+
+#: help.c:447
+#, c-format
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" basamak gruplarını ayırmak için yerel-özel bir karakterin gösterilmesini etkinleştir\n"
+
+#: help.c:449
+#, c-format
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" harici sayfalamanın ne zaman kullanılacağını kontrol eder [yes, no, always]\n"
+
+#: help.c:451
+#, c-format
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" hizalanmamış çıktı için kayıt (satır) ayırıcısı\n"
+
+#: help.c:453
+#, c-format
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" hizalanmamış çıktı için kayıt ayırıcısını sıfır bayt'a ayarla\n"
+
+#: help.c:455
+#, c-format
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+
+#: help.c:458
+#, c-format
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" sonradan basılan tablolar için tablo başlığını ayarla\n"
+
+#: help.c:460
+#, c-format
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" ayarlanırsa, sadece gerçek tablo verisi gösterilir\n"
+
+#: help.c:462
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" Unicode çizgi çizme biçimini ayarlar [single, double]\n"
+
+#: help.c:467
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"Ortam deÄŸiÅŸkenleri:\n"
+
+#: help.c:471
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" veya psql içinde \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:473
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" veya psql içinde \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:476
+#, c-format
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" wrapped biçim için sütun sayısı\n"
+
+#: help.c:478
+#, c-format
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" application_name bağlantı parametresinin aynısı\n"
+
+#: help.c:480
+#, c-format
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" dbname bağlantı parametresinin aynı\n"
+
+#: help.c:482
+#, c-format
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" host bağlantı parametresinin aynı\n"
+
+#: help.c:484
+#, c-format
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" bağlantı parolası (tavsiye edilmez)\n"
+
+#: help.c:486
+#, c-format
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" parola dosya adı\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" port bağlantı parametresiyle aynı\n"
+
+#: help.c:490
+#, c-format
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" kullanıcı bağlantı parametresiyle aynı\n"
+
+#: help.c:492
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, ve \\ev komutları tarafından kullanılan editör\n"
+
+#: help.c:494
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" editörü çağırırken bir satır numarasının nasıl belirtileceği\n"
+
+#: help.c:496
+#, c-format
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" komut geçmişi dosyası için alternatif konum\n"
+
+#: help.c:498
+#, c-format
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" harici sayfalama programının ismi\n"
+
+#: help.c:500
+#, c-format
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" kulanıcının .psqlrc dosyası için alternatif konum\n"
+
+#: help.c:502
+#, c-format
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! komutu tarafından kullanılan kabuk\n"
+
+#: help.c:504
+#, c-format
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" geçici dosyalar için dizin\n"
+
+#: help.c:548
+msgid "Available help:\n"
+msgstr "Yardım:\n"
+
+#: help.c:636
+#, fuzzy, c-format
+#| msgid ""
+#| "Command: %s\n"
+#| "Description: %s\n"
+#| "Syntax:\n"
+#| "%s\n"
+#| "\n"
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"Komut: %s\n"
+"Açıklama: %s\n"
+"Söz dizimi:\n"
+"%s\n"
+"\n"
+
+#: help.c:655
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"\"%s\" için yardım bulunmamaktadır.\n"
+"\\h yazarak yardım konularının listesini görüntüleyin.\n"
+
+#: input.c:218
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "girdi dosyası okuma hatası: %m"
+
+#: input.c:472 input.c:510
+#, fuzzy, c-format
+#| msgid "could not save history to file \"%s\": %s\n"
+msgid "could not save history to file \"%s\": %m"
+msgstr "İşlem geçmişi \"%s\" dosyasına kaydedilemiyor: %s\n"
+
+#: input.c:529
+#, fuzzy, c-format
+#| msgid "history is not supported by this installation\n"
+msgid "history is not supported by this installation"
+msgstr "bu kurulum işlem geçmişini desteklemiyor\n"
+
+#: large_obj.c:65
+#, fuzzy, c-format
+#| msgid "%s: not connected to a database\n"
+msgid "%s: not connected to a database"
+msgstr "%s: veritabanına bağlı değil\n"
+
+#: large_obj.c:84
+#, fuzzy, c-format
+#| msgid "%s: current transaction is aborted\n"
+msgid "%s: current transaction is aborted"
+msgstr "%s: geçerli transaction iptal edildi\n"
+
+#: large_obj.c:87
+#, fuzzy, c-format
+#| msgid "%s: unknown transaction status\n"
+msgid "%s: unknown transaction status"
+msgstr "%s: bilinmeyen transaction durumu\n"
+
+#: large_obj.c:288 large_obj.c:299
+msgid "ID"
+msgstr "ID"
+
+#: large_obj.c:309
+msgid "Large objects"
+msgstr "Large objectler"
+
+#: mainloop.c:136
+#, fuzzy, c-format
+#| msgid "\\if: escaped\n"
+msgid "\\if: escaped"
+msgstr "\\if: yarıda kesildi(escaped)\n"
+
+#: mainloop.c:183
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "%s'den çıkmak için \"\\q\" kullanın.\n"
+
+#: mainloop.c:205
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"Girdi özel formatta bir PostgreSQL dökümüdür (dump).\n"
+"Bu dökümü bir veritabanına geri yüklemek için pg_restore komut satırı istemcisini kullanın.\n"
+
+#: mainloop.c:282
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Yardım için \\? yazınız veya input bufffer'ı temzilemek için kontrol-C'ye basınız."
+
+#: mainloop.c:284
+msgid "Use \\? for help."
+msgstr "Yardım için \\? yazınız."
+
+#: mainloop.c:288
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "PostgreSQL'in komut satırı arabirimi olan psql'i kullanıyorsunuz."
+
+#: mainloop.c:289
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"Komutlar: \\copyright dağıtım koşulları için\n"
+" \\h SQL komutları hakkında yardım için\n"
+" \\? psql dahili komutlarının yardımı için\n"
+" \\g ya da noktalı virgül: sorguyu çalıştırmak için\n"
+" \\q çıkmak için\n"
+
+#: mainloop.c:313
+msgid "Use \\q to quit."
+msgstr "Çıkmak için \\q yazınız."
+
+#: mainloop.c:316 mainloop.c:340
+msgid "Use control-D to quit."
+msgstr "Çıkmak için kontrol-D'ye basınız."
+
+#: mainloop.c:318 mainloop.c:342
+msgid "Use control-C to quit."
+msgstr "Çıkmak için kontrol-C'ye basınız."
+
+#: mainloop.c:449 mainloop.c:591
+#, fuzzy, c-format
+#| msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block\n"
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\sorgu yoksayıldı; güncel \\if blokundan çıkmak için \\endif veya Ctrl-C kullanınız\n"
+
+#: mainloop.c:609
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr ""
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "sonuçlandırılmamış tırnakla sınırlandırılmış satır"
+
+#: psqlscanslash.l:811
+#, fuzzy, c-format
+#| msgid "%s: out of memory\n"
+msgid "%s: out of memory"
+msgstr "%s: yetersiz bellek\n"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123
+#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237
+#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247
+#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265
+#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322
+#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442
+#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525
+#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592
+#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604
+#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662
+#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706
+#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764
+#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805
+#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852
+#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885
+#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980
+#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025
+#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058
+#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078
+#: sql_help.c:1089 sql_help.c:1091 sql_help.c:1093 sql_help.c:1109
+#: sql_help.c:1111 sql_help.c:1115 sql_help.c:1118 sql_help.c:1119
+#: sql_help.c:1120 sql_help.c:1123 sql_help.c:1125 sql_help.c:1258
+#: sql_help.c:1260 sql_help.c:1263 sql_help.c:1266 sql_help.c:1268
+#: sql_help.c:1270 sql_help.c:1273 sql_help.c:1276 sql_help.c:1386
+#: sql_help.c:1388 sql_help.c:1390 sql_help.c:1393 sql_help.c:1414
+#: sql_help.c:1417 sql_help.c:1420 sql_help.c:1423 sql_help.c:1427
+#: sql_help.c:1429 sql_help.c:1431 sql_help.c:1433 sql_help.c:1447
+#: sql_help.c:1450 sql_help.c:1452 sql_help.c:1454 sql_help.c:1464
+#: sql_help.c:1466 sql_help.c:1476 sql_help.c:1478 sql_help.c:1488
+#: sql_help.c:1491 sql_help.c:1513 sql_help.c:1515 sql_help.c:1517
+#: sql_help.c:1520 sql_help.c:1522 sql_help.c:1524 sql_help.c:1527
+#: sql_help.c:1577 sql_help.c:1619 sql_help.c:1622 sql_help.c:1624
+#: sql_help.c:1626 sql_help.c:1628 sql_help.c:1630 sql_help.c:1633
+#: sql_help.c:1683 sql_help.c:1699 sql_help.c:1920 sql_help.c:1989
+#: sql_help.c:2008 sql_help.c:2021 sql_help.c:2078 sql_help.c:2085
+#: sql_help.c:2095 sql_help.c:2115 sql_help.c:2140 sql_help.c:2158
+#: sql_help.c:2187 sql_help.c:2282 sql_help.c:2324 sql_help.c:2347
+#: sql_help.c:2368 sql_help.c:2369 sql_help.c:2406 sql_help.c:2426
+#: sql_help.c:2448 sql_help.c:2462 sql_help.c:2482 sql_help.c:2505
+#: sql_help.c:2535 sql_help.c:2560 sql_help.c:2606 sql_help.c:2884
+#: sql_help.c:2897 sql_help.c:2914 sql_help.c:2930 sql_help.c:2970
+#: sql_help.c:3022 sql_help.c:3026 sql_help.c:3028 sql_help.c:3034
+#: sql_help.c:3052 sql_help.c:3079 sql_help.c:3114 sql_help.c:3126
+#: sql_help.c:3135 sql_help.c:3179 sql_help.c:3193 sql_help.c:3221
+#: sql_help.c:3229 sql_help.c:3237 sql_help.c:3245 sql_help.c:3253
+#: sql_help.c:3261 sql_help.c:3269 sql_help.c:3277 sql_help.c:3286
+#: sql_help.c:3297 sql_help.c:3305 sql_help.c:3313 sql_help.c:3321
+#: sql_help.c:3329 sql_help.c:3339 sql_help.c:3348 sql_help.c:3357
+#: sql_help.c:3365 sql_help.c:3375 sql_help.c:3386 sql_help.c:3394
+#: sql_help.c:3403 sql_help.c:3414 sql_help.c:3423 sql_help.c:3431
+#: sql_help.c:3439 sql_help.c:3447 sql_help.c:3455 sql_help.c:3463
+#: sql_help.c:3471 sql_help.c:3479 sql_help.c:3487 sql_help.c:3495
+#: sql_help.c:3503 sql_help.c:3520 sql_help.c:3529 sql_help.c:3537
+#: sql_help.c:3554 sql_help.c:3569 sql_help.c:3839 sql_help.c:3890
+#: sql_help.c:3919 sql_help.c:3927 sql_help.c:4360 sql_help.c:4408
+#: sql_help.c:4549
+msgid "name"
+msgstr "ad"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1770
+#: sql_help.c:3194 sql_help.c:4146
+msgid "aggregate_signature"
+msgstr "aggregate_imzası"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250
+#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571
+#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786
+#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984
+#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079
+#: sql_help.c:1092 sql_help.c:1126 sql_help.c:1267 sql_help.c:1387
+#: sql_help.c:1430 sql_help.c:1451 sql_help.c:1465 sql_help.c:1477
+#: sql_help.c:1490 sql_help.c:1521 sql_help.c:1578 sql_help.c:1627
+msgid "new_name"
+msgstr "yeni_adı"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248
+#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618
+#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789
+#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057
+#: sql_help.c:1077 sql_help.c:1090 sql_help.c:1124 sql_help.c:1327
+#: sql_help.c:1389 sql_help.c:1432 sql_help.c:1453 sql_help.c:1516
+#: sql_help.c:1625 sql_help.c:2870
+msgid "new_owner"
+msgstr "yeni_sahibi"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319
+#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737
+#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1094
+#: sql_help.c:1269 sql_help.c:1434 sql_help.c:1455 sql_help.c:1467
+#: sql_help.c:1479 sql_help.c:1523 sql_help.c:1629
+msgid "new_schema"
+msgstr "yeni_ÅŸema"
+
+#: sql_help.c:44 sql_help.c:1834 sql_help.c:3195 sql_help.c:4175
+msgid "where aggregate_signature is:"
+msgstr "aggregate_imzası şu şekilde olabilir:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350
+#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516
+#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838
+#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976
+#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1788
+#: sql_help.c:1805 sql_help.c:1811 sql_help.c:1835 sql_help.c:1838
+#: sql_help.c:1841 sql_help.c:1990 sql_help.c:2009 sql_help.c:2012
+#: sql_help.c:2283 sql_help.c:2483 sql_help.c:3196 sql_help.c:3199
+#: sql_help.c:3202 sql_help.c:3287 sql_help.c:3376 sql_help.c:3404
+#: sql_help.c:3724 sql_help.c:4057 sql_help.c:4152 sql_help.c:4159
+#: sql_help.c:4165 sql_help.c:4176 sql_help.c:4179 sql_help.c:4182
+msgid "argmode"
+msgstr ""
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351
+#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839
+#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977
+#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1789
+#: sql_help.c:1806 sql_help.c:1812 sql_help.c:1836 sql_help.c:1839
+#: sql_help.c:1842 sql_help.c:1991 sql_help.c:2010 sql_help.c:2013
+#: sql_help.c:2284 sql_help.c:2484 sql_help.c:3197 sql_help.c:3200
+#: sql_help.c:3203 sql_help.c:3288 sql_help.c:3377 sql_help.c:3405
+#: sql_help.c:4153 sql_help.c:4160 sql_help.c:4166 sql_help.c:4177
+#: sql_help.c:4180 sql_help.c:4183
+msgid "argname"
+msgstr "bağımsız değişken adı"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352
+#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840
+#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978
+#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1790
+#: sql_help.c:1807 sql_help.c:1813 sql_help.c:1837 sql_help.c:1840
+#: sql_help.c:1843 sql_help.c:2285 sql_help.c:2485 sql_help.c:3198
+#: sql_help.c:3201 sql_help.c:3204 sql_help.c:3289 sql_help.c:3378
+#: sql_help.c:3406 sql_help.c:4154 sql_help.c:4161 sql_help.c:4167
+#: sql_help.c:4178 sql_help.c:4181 sql_help.c:4184
+#, fuzzy
+msgid "argtype"
+msgstr "Hedef tipi"
+
+#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926
+#: sql_help.c:1074 sql_help.c:1448 sql_help.c:1572 sql_help.c:1604
+#: sql_help.c:1652 sql_help.c:1891 sql_help.c:1898 sql_help.c:2190
+#: sql_help.c:2232 sql_help.c:2239 sql_help.c:2248 sql_help.c:2325
+#: sql_help.c:2536 sql_help.c:2628 sql_help.c:2899 sql_help.c:3080
+#: sql_help.c:3102 sql_help.c:3590 sql_help.c:3758 sql_help.c:4610
+msgid "option"
+msgstr "seçenek"
+
+#: sql_help.c:113 sql_help.c:927 sql_help.c:1573 sql_help.c:2326
+#: sql_help.c:2537 sql_help.c:3081
+msgid "where option can be:"
+msgstr "seçenek şunlar olabilir:"
+
+#: sql_help.c:114 sql_help.c:2122
+msgid "allowconn"
+msgstr ""
+
+#: sql_help.c:115 sql_help.c:928 sql_help.c:1574 sql_help.c:2123
+#: sql_help.c:2538 sql_help.c:3082
+#, fuzzy
+msgid "connlimit"
+msgstr "sınırsız"
+
+#: sql_help.c:116 sql_help.c:2124
+#, fuzzy
+msgid "istemplate"
+msgstr "Åžablon"
+
+#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1272 sql_help.c:1320
+msgid "new_tablespace"
+msgstr "yeni_tablespace"
+
+#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546
+#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935
+#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005
+#: sql_help.c:1006 sql_help.c:1137 sql_help.c:1140 sql_help.c:1581
+#: sql_help.c:1585 sql_help.c:1588 sql_help.c:2295 sql_help.c:2489
+#: sql_help.c:3944 sql_help.c:4349
+msgid "configuration_parameter"
+msgstr "yapılandırma_parametresi"
+
+#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484
+#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864
+#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075
+#: sql_help.c:1114 sql_help.c:1117 sql_help.c:1122 sql_help.c:1138
+#: sql_help.c:1139 sql_help.c:1302 sql_help.c:1322 sql_help.c:1370
+#: sql_help.c:1392 sql_help.c:1449 sql_help.c:1582 sql_help.c:1605
+#: sql_help.c:2191 sql_help.c:2233 sql_help.c:2240 sql_help.c:2249
+#: sql_help.c:2296 sql_help.c:2297 sql_help.c:2356 sql_help.c:2390
+#: sql_help.c:2490 sql_help.c:2491 sql_help.c:2508 sql_help.c:2629
+#: sql_help.c:2659 sql_help.c:2764 sql_help.c:2777 sql_help.c:2791
+#: sql_help.c:2832 sql_help.c:2856 sql_help.c:2873 sql_help.c:2900
+#: sql_help.c:3103 sql_help.c:3759 sql_help.c:4350 sql_help.c:4351
+msgid "value"
+msgstr "deÄŸer"
+
+#: sql_help.c:197
+msgid "target_role"
+msgstr "hedef_rol"
+
+#: sql_help.c:198 sql_help.c:2174 sql_help.c:2584 sql_help.c:2589
+#: sql_help.c:3706 sql_help.c:3713 sql_help.c:3727 sql_help.c:3733
+#: sql_help.c:4039 sql_help.c:4046 sql_help.c:4060 sql_help.c:4066
+msgid "schema_name"
+msgstr "şema_adı"
+
+#: sql_help.c:199
+msgid "abbreviated_grant_or_revoke"
+msgstr ""
+
+#: sql_help.c:200
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr ""
+
+#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205
+#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210
+#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946
+#: sql_help.c:1271 sql_help.c:1592 sql_help.c:2329 sql_help.c:2330
+#: sql_help.c:2331 sql_help.c:2332 sql_help.c:2333 sql_help.c:2464
+#: sql_help.c:2541 sql_help.c:2542 sql_help.c:2543 sql_help.c:2544
+#: sql_help.c:2545 sql_help.c:3085 sql_help.c:3086 sql_help.c:3087
+#: sql_help.c:3088 sql_help.c:3089 sql_help.c:3740 sql_help.c:3741
+#: sql_help.c:3742 sql_help.c:4040 sql_help.c:4044 sql_help.c:4047
+#: sql_help.c:4049 sql_help.c:4051 sql_help.c:4053 sql_help.c:4055
+#: sql_help.c:4061 sql_help.c:4063 sql_help.c:4065 sql_help.c:4067
+#: sql_help.c:4069 sql_help.c:4071 sql_help.c:4072 sql_help.c:4073
+#: sql_help.c:4370
+msgid "role_name"
+msgstr "rol_adı"
+
+#: sql_help.c:236 sql_help.c:459 sql_help.c:1287 sql_help.c:1289
+#: sql_help.c:1337 sql_help.c:1349 sql_help.c:1374 sql_help.c:1621
+#: sql_help.c:2143 sql_help.c:2147 sql_help.c:2252 sql_help.c:2257
+#: sql_help.c:2351 sql_help.c:2759 sql_help.c:2772 sql_help.c:2786
+#: sql_help.c:2795 sql_help.c:2807 sql_help.c:2836 sql_help.c:3790
+#: sql_help.c:3805 sql_help.c:3807 sql_help.c:4235 sql_help.c:4236
+#: sql_help.c:4245 sql_help.c:4286 sql_help.c:4287 sql_help.c:4288
+#: sql_help.c:4289 sql_help.c:4290 sql_help.c:4291 sql_help.c:4324
+#: sql_help.c:4325 sql_help.c:4330 sql_help.c:4335 sql_help.c:4474
+#: sql_help.c:4475 sql_help.c:4484 sql_help.c:4525 sql_help.c:4526
+#: sql_help.c:4527 sql_help.c:4528 sql_help.c:4529 sql_help.c:4530
+#: sql_help.c:4577 sql_help.c:4579 sql_help.c:4636 sql_help.c:4692
+#: sql_help.c:4693 sql_help.c:4702 sql_help.c:4743 sql_help.c:4744
+#: sql_help.c:4745 sql_help.c:4746 sql_help.c:4747 sql_help.c:4748
+msgid "expression"
+msgstr "ifade"
+
+#: sql_help.c:239
+msgid "domain_constraint"
+msgstr "alan(domain)_kısıtlaması"
+
+#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475
+#: sql_help.c:1264 sql_help.c:1308 sql_help.c:1309 sql_help.c:1310
+#: sql_help.c:1336 sql_help.c:1348 sql_help.c:1365 sql_help.c:1776
+#: sql_help.c:1778 sql_help.c:2146 sql_help.c:2251 sql_help.c:2256
+#: sql_help.c:2794 sql_help.c:2806 sql_help.c:3802
+msgid "constraint_name"
+msgstr "%kısıtlama_adı"
+
+#: sql_help.c:244 sql_help.c:1265
+msgid "new_constraint_name"
+msgstr "yeni_kısıtlama_adı"
+
+#: sql_help.c:317 sql_help.c:1073
+msgid "new_version"
+msgstr "yeni_sürüm"
+
+#: sql_help.c:321 sql_help.c:323
+msgid "member_object"
+msgstr "üye_nesnesi"
+
+#: sql_help.c:324
+msgid "where member_object is:"
+msgstr ""
+
+#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333
+#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346
+#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360
+#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367
+#: sql_help.c:368 sql_help.c:1768 sql_help.c:1773 sql_help.c:1780
+#: sql_help.c:1781 sql_help.c:1782 sql_help.c:1783 sql_help.c:1784
+#: sql_help.c:1785 sql_help.c:1786 sql_help.c:1791 sql_help.c:1793
+#: sql_help.c:1797 sql_help.c:1799 sql_help.c:1803 sql_help.c:1808
+#: sql_help.c:1809 sql_help.c:1816 sql_help.c:1817 sql_help.c:1818
+#: sql_help.c:1819 sql_help.c:1820 sql_help.c:1821 sql_help.c:1822
+#: sql_help.c:1823 sql_help.c:1824 sql_help.c:1825 sql_help.c:1826
+#: sql_help.c:1831 sql_help.c:1832 sql_help.c:4142 sql_help.c:4147
+#: sql_help.c:4148 sql_help.c:4149 sql_help.c:4150 sql_help.c:4156
+#: sql_help.c:4157 sql_help.c:4162 sql_help.c:4163 sql_help.c:4168
+#: sql_help.c:4169 sql_help.c:4170 sql_help.c:4171 sql_help.c:4172
+#: sql_help.c:4173
+msgid "object_name"
+msgstr "nesne_adı"
+
+#: sql_help.c:326 sql_help.c:1769 sql_help.c:4145
+msgid "aggregate_name"
+msgstr "toplam(aggregate)_adı"
+
+#: sql_help.c:328 sql_help.c:1771 sql_help.c:2055 sql_help.c:2059
+#: sql_help.c:2061 sql_help.c:3212
+#, fuzzy
+msgid "source_type"
+msgstr "Kaynak tipi"
+
+#: sql_help.c:329 sql_help.c:1772 sql_help.c:2056 sql_help.c:2060
+#: sql_help.c:2062 sql_help.c:3213
+#, fuzzy
+msgid "target_type"
+msgstr "Hedef tipi"
+
+#: sql_help.c:336 sql_help.c:774 sql_help.c:1787 sql_help.c:2057
+#: sql_help.c:2098 sql_help.c:2161 sql_help.c:2407 sql_help.c:2438
+#: sql_help.c:2976 sql_help.c:4056 sql_help.c:4151 sql_help.c:4264
+#: sql_help.c:4268 sql_help.c:4272 sql_help.c:4275 sql_help.c:4503
+#: sql_help.c:4507 sql_help.c:4511 sql_help.c:4514 sql_help.c:4721
+#: sql_help.c:4725 sql_help.c:4729 sql_help.c:4732
+msgid "function_name"
+msgstr "fonksiyon_adı"
+
+#: sql_help.c:341 sql_help.c:767 sql_help.c:1794 sql_help.c:2431
+msgid "operator_name"
+msgstr "operatör_adı"
+
+#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1795
+#: sql_help.c:2408 sql_help.c:3330
+msgid "left_type"
+msgstr "sol_argüman_veri_tipi"
+
+#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1796
+#: sql_help.c:2409 sql_help.c:3331
+#, fuzzy
+msgid "right_type"
+msgstr "Sağ argüman veri tipi"
+
+#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736
+#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791
+#: sql_help.c:1354 sql_help.c:1798 sql_help.c:1800 sql_help.c:2428
+#: sql_help.c:2449 sql_help.c:2812 sql_help.c:3340 sql_help.c:3349
+msgid "index_method"
+msgstr "index_yöntemi"
+
+#: sql_help.c:349 sql_help.c:1804 sql_help.c:4158
+msgid "procedure_name"
+msgstr "prosedür_adı"
+
+#: sql_help.c:353 sql_help.c:1810 sql_help.c:3723 sql_help.c:4164
+#, fuzzy
+#| msgid "role_name"
+msgid "routine_name"
+msgstr "rol_adı"
+
+#: sql_help.c:365 sql_help.c:1326 sql_help.c:1827 sql_help.c:2291
+#: sql_help.c:2488 sql_help.c:2767 sql_help.c:2943 sql_help.c:3511
+#: sql_help.c:3737 sql_help.c:4070
+msgid "type_name"
+msgstr "tip_adı"
+
+#: sql_help.c:366 sql_help.c:1828 sql_help.c:2290 sql_help.c:2487
+#: sql_help.c:2944 sql_help.c:3170 sql_help.c:3512 sql_help.c:3729
+#: sql_help.c:4062
+msgid "lang_name"
+msgstr "dil_adı"
+
+#: sql_help.c:369
+msgid "and aggregate_signature is:"
+msgstr ""
+
+#: sql_help.c:392 sql_help.c:1922 sql_help.c:2188
+msgid "handler_function"
+msgstr "iÅŸleyici_fonksiyon"
+
+#: sql_help.c:393 sql_help.c:2189
+msgid "validator_function"
+msgstr "doğrulayıcı_fonksiyon"
+
+#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979
+#: sql_help.c:1259 sql_help.c:1514
+msgid "action"
+msgstr "hareket"
+
+#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458
+#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467
+#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675
+#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1261
+#: sql_help.c:1279 sql_help.c:1283 sql_help.c:1284 sql_help.c:1288
+#: sql_help.c:1290 sql_help.c:1291 sql_help.c:1292 sql_help.c:1294
+#: sql_help.c:1297 sql_help.c:1298 sql_help.c:1300 sql_help.c:1303
+#: sql_help.c:1305 sql_help.c:1350 sql_help.c:1352 sql_help.c:1359
+#: sql_help.c:1368 sql_help.c:1373 sql_help.c:1620 sql_help.c:1623
+#: sql_help.c:1660 sql_help.c:1775 sql_help.c:1888 sql_help.c:1894
+#: sql_help.c:1907 sql_help.c:1908 sql_help.c:1909 sql_help.c:2230
+#: sql_help.c:2243 sql_help.c:2288 sql_help.c:2350 sql_help.c:2354
+#: sql_help.c:2387 sql_help.c:2614 sql_help.c:2642 sql_help.c:2643
+#: sql_help.c:2750 sql_help.c:2758 sql_help.c:2768 sql_help.c:2771
+#: sql_help.c:2781 sql_help.c:2785 sql_help.c:2808 sql_help.c:2810
+#: sql_help.c:2817 sql_help.c:2830 sql_help.c:2835 sql_help.c:2853
+#: sql_help.c:2979 sql_help.c:3115 sql_help.c:3708 sql_help.c:3709
+#: sql_help.c:3789 sql_help.c:3804 sql_help.c:3806 sql_help.c:3808
+#: sql_help.c:4041 sql_help.c:4042 sql_help.c:4144 sql_help.c:4295
+#: sql_help.c:4534 sql_help.c:4576 sql_help.c:4578 sql_help.c:4580
+#: sql_help.c:4624 sql_help.c:4752
+msgid "column_name"
+msgstr "sütun_adı"
+
+#: sql_help.c:444 sql_help.c:664 sql_help.c:1262
+msgid "new_column_name"
+msgstr "yeni_sütun_adı"
+
+#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000
+#: sql_help.c:1278 sql_help.c:1530
+msgid "where action is one of:"
+msgstr "hareket aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1280
+#: sql_help.c:1285 sql_help.c:1532 sql_help.c:1536 sql_help.c:2141
+#: sql_help.c:2231 sql_help.c:2427 sql_help.c:2607 sql_help.c:2751
+#: sql_help.c:3024 sql_help.c:3891
+msgid "data_type"
+msgstr "veri_tipi"
+
+#: sql_help.c:452 sql_help.c:457 sql_help.c:1281 sql_help.c:1286
+#: sql_help.c:1533 sql_help.c:1537 sql_help.c:2142 sql_help.c:2234
+#: sql_help.c:2352 sql_help.c:2752 sql_help.c:2760 sql_help.c:2773
+#: sql_help.c:2787 sql_help.c:3025 sql_help.c:3031 sql_help.c:3799
+msgid "collation"
+msgstr "sıralama (collation)"
+
+#: sql_help.c:453 sql_help.c:1282 sql_help.c:2235 sql_help.c:2244
+#: sql_help.c:2753 sql_help.c:2769 sql_help.c:2782
+msgid "column_constraint"
+msgstr "kolon_kısıtlaması"
+
+#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1299
+msgid "integer"
+msgstr "tamsayı"
+
+#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1301
+#: sql_help.c:1304
+msgid "attribute_option"
+msgstr "özellik_seçeneği"
+
+#: sql_help.c:473 sql_help.c:1306 sql_help.c:2236 sql_help.c:2245
+#: sql_help.c:2754 sql_help.c:2770 sql_help.c:2783
+msgid "table_constraint"
+msgstr "tablo_kısıtlaması"
+
+#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1311
+#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1829
+msgid "trigger_name"
+msgstr "tetikleyici_adı"
+
+#: sql_help.c:480 sql_help.c:481 sql_help.c:1324 sql_help.c:1325
+#: sql_help.c:2237 sql_help.c:2242 sql_help.c:2757 sql_help.c:2780
+msgid "parent_table"
+msgstr "üst_tablo"
+
+#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999
+#: sql_help.c:1493 sql_help.c:2173
+msgid "extension_name"
+msgstr "uzantı_adı"
+
+#: sql_help.c:541 sql_help.c:1001 sql_help.c:2292
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:542 sql_help.c:1002 sql_help.c:2293
+msgid "result_rows"
+msgstr "sonuç_satırları"
+
+#: sql_help.c:543 sql_help.c:2294
+#, fuzzy
+#| msgid "start_function"
+msgid "support_function"
+msgstr "başlangıç_fonksiyonu"
+
+#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937
+#: sql_help.c:940 sql_help.c:943 sql_help.c:1571 sql_help.c:1579
+#: sql_help.c:1583 sql_help.c:1586 sql_help.c:1589 sql_help.c:2585
+#: sql_help.c:2587 sql_help.c:2590 sql_help.c:2591 sql_help.c:3707
+#: sql_help.c:3711 sql_help.c:3714 sql_help.c:3716 sql_help.c:3718
+#: sql_help.c:3720 sql_help.c:3722 sql_help.c:3728 sql_help.c:3730
+#: sql_help.c:3732 sql_help.c:3734 sql_help.c:3736 sql_help.c:3738
+msgid "role_specification"
+msgstr "rol_tanımlaması"
+
+#: sql_help.c:565 sql_help.c:567 sql_help.c:1602 sql_help.c:2116
+#: sql_help.c:2593 sql_help.c:3100 sql_help.c:3545 sql_help.c:4380
+msgid "user_name"
+msgstr "kullanıcı_adı"
+
+#: sql_help.c:568 sql_help.c:945 sql_help.c:1591 sql_help.c:2592
+#: sql_help.c:3739
+msgid "where role_specification can be:"
+msgstr "rol tanımlaması şunlar olabilir:"
+
+#: sql_help.c:570
+msgid "group_name"
+msgstr "grup_adı"
+
+#: sql_help.c:591 sql_help.c:1371 sql_help.c:2121 sql_help.c:2357
+#: sql_help.c:2391 sql_help.c:2765 sql_help.c:2778 sql_help.c:2792
+#: sql_help.c:2833 sql_help.c:2857 sql_help.c:2869 sql_help.c:3735
+#: sql_help.c:4068
+msgid "tablespace_name"
+msgstr "tablespace_adı"
+
+#: sql_help.c:593 sql_help.c:681 sql_help.c:1319 sql_help.c:1328
+#: sql_help.c:1366 sql_help.c:1709
+msgid "index_name"
+msgstr "index_adı"
+
+#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1321
+#: sql_help.c:1323 sql_help.c:1369 sql_help.c:2355 sql_help.c:2389
+#: sql_help.c:2763 sql_help.c:2776 sql_help.c:2790 sql_help.c:2831
+#: sql_help.c:2855
+msgid "storage_parameter"
+msgstr "saklama_parametresi"
+
+#: sql_help.c:602
+msgid "column_number"
+msgstr "sütun_sayısı"
+
+#: sql_help.c:626 sql_help.c:1792 sql_help.c:4155
+msgid "large_object_oid"
+msgstr "büyük_nesne_oid"
+
+#: sql_help.c:713 sql_help.c:2412
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:714 sql_help.c:2413
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:766 sql_help.c:778 sql_help.c:2430
+msgid "strategy_number"
+msgstr "strateji_sayısı"
+
+#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779
+#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2432 sql_help.c:2433
+#: sql_help.c:2436 sql_help.c:2437
+msgid "op_type"
+msgstr "operatör_tipi"
+
+#: sql_help.c:770 sql_help.c:2434
+msgid "sort_family_name"
+msgstr "sıralama_family_adı"
+
+#: sql_help.c:771 sql_help.c:781 sql_help.c:2435
+msgid "support_number"
+msgstr "destek_numarası"
+
+#: sql_help.c:775 sql_help.c:2058 sql_help.c:2439 sql_help.c:2946
+#: sql_help.c:2948
+msgid "argument_type"
+msgstr "bağımsız_değişken_tipi"
+
+#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884
+#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1489 sql_help.c:1492
+#: sql_help.c:1659 sql_help.c:1708 sql_help.c:1777 sql_help.c:1802
+#: sql_help.c:1815 sql_help.c:1830 sql_help.c:1887 sql_help.c:1893
+#: sql_help.c:2229 sql_help.c:2241 sql_help.c:2348 sql_help.c:2386
+#: sql_help.c:2463 sql_help.c:2506 sql_help.c:2562 sql_help.c:2613
+#: sql_help.c:2644 sql_help.c:2749 sql_help.c:2766 sql_help.c:2779
+#: sql_help.c:2852 sql_help.c:2972 sql_help.c:3149 sql_help.c:3366
+#: sql_help.c:3415 sql_help.c:3521 sql_help.c:3705 sql_help.c:3710
+#: sql_help.c:3755 sql_help.c:3787 sql_help.c:4038 sql_help.c:4043
+#: sql_help.c:4143 sql_help.c:4250 sql_help.c:4252 sql_help.c:4301
+#: sql_help.c:4340 sql_help.c:4489 sql_help.c:4491 sql_help.c:4540
+#: sql_help.c:4574 sql_help.c:4623 sql_help.c:4707 sql_help.c:4709
+#: sql_help.c:4758
+msgid "table_name"
+msgstr "tablo_adı"
+
+#: sql_help.c:811 sql_help.c:2465
+msgid "using_expression"
+msgstr "using_ifadesi"
+
+#: sql_help.c:812 sql_help.c:2466
+msgid "check_expression"
+msgstr "check_ifadesi"
+
+#: sql_help.c:886 sql_help.c:2507
+msgid "publication_parameter"
+msgstr "yayın_parametresi"
+
+#: sql_help.c:929 sql_help.c:1575 sql_help.c:2327 sql_help.c:2539
+#: sql_help.c:3083
+msgid "password"
+msgstr "parola"
+
+#: sql_help.c:930 sql_help.c:1576 sql_help.c:2328 sql_help.c:2540
+#: sql_help.c:3084
+msgid "timestamp"
+msgstr "timestamp"
+
+#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1580
+#: sql_help.c:1584 sql_help.c:1587 sql_help.c:1590 sql_help.c:3715
+#: sql_help.c:4048
+msgid "database_name"
+msgstr "veritabanı_adı"
+
+#: sql_help.c:1048 sql_help.c:2608
+msgid "increment"
+msgstr "artım"
+
+#: sql_help.c:1049 sql_help.c:2609
+msgid "minvalue"
+msgstr "en düşük değer"
+
+#: sql_help.c:1050 sql_help.c:2610
+msgid "maxvalue"
+msgstr "en yüksek değer"
+
+#: sql_help.c:1051 sql_help.c:2611 sql_help.c:4248 sql_help.c:4338
+#: sql_help.c:4487 sql_help.c:4640 sql_help.c:4705
+msgid "start"
+msgstr "baÅŸlat"
+
+#: sql_help.c:1052 sql_help.c:1296
+msgid "restart"
+msgstr "yeniden baÅŸlat"
+
+#: sql_help.c:1053 sql_help.c:2612
+msgid "cache"
+msgstr "önbellek"
+
+#: sql_help.c:1110 sql_help.c:2656
+msgid "conninfo"
+msgstr "conninfo"
+
+#: sql_help.c:1112 sql_help.c:2657
+msgid "publication_name"
+msgstr "yayın_adı"
+
+#: sql_help.c:1113
+#, fuzzy
+msgid "set_publication_option"
+msgstr "set_publication_option"
+
+#: sql_help.c:1116
+msgid "refresh_option"
+msgstr "tazeleme_seçeneği"
+
+#: sql_help.c:1121 sql_help.c:2658
+msgid "subscription_parameter"
+msgstr "abonelik_parametresi"
+
+#: sql_help.c:1274 sql_help.c:1277
+msgid "partition_name"
+msgstr "bölümleme(partition)_adı"
+
+#: sql_help.c:1275 sql_help.c:2246 sql_help.c:2784
+msgid "partition_bound_spec"
+msgstr ""
+
+#: sql_help.c:1293 sql_help.c:1340 sql_help.c:2798
+msgid "sequence_options"
+msgstr "sequence_seçenekleri"
+
+#: sql_help.c:1295
+msgid "sequence_option"
+msgstr "sequence_seçeneği"
+
+#: sql_help.c:1307
+msgid "table_constraint_using_index"
+msgstr "ve indeks_kullanan_tablo_kısıtlaması şöyledir:"
+
+#: sql_help.c:1315 sql_help.c:1316 sql_help.c:1317 sql_help.c:1318
+msgid "rewrite_rule_name"
+msgstr "rewrite_kural_adı"
+
+#: sql_help.c:1329 sql_help.c:2823
+msgid "and partition_bound_spec is:"
+msgstr "ve partition_bound_spec şöyledir:"
+
+#: sql_help.c:1330 sql_help.c:1331 sql_help.c:1332 sql_help.c:2824
+#: sql_help.c:2825 sql_help.c:2826
+#, fuzzy
+#| msgid "and partition_bound_spec is:"
+msgid "partition_bound_expr"
+msgstr "ve partition_bound_spec şöyledir:"
+
+#: sql_help.c:1333 sql_help.c:1334 sql_help.c:2827 sql_help.c:2828
+msgid "numeric_literal"
+msgstr "sayısal_sabit"
+
+#: sql_help.c:1335
+msgid "and column_constraint is:"
+msgstr "ve kolon_kısıtlaması şöyledir :"
+
+#: sql_help.c:1338 sql_help.c:2253 sql_help.c:2286 sql_help.c:2486
+#: sql_help.c:2796
+msgid "default_expr"
+msgstr "öntanımlı_ifade"
+
+#: sql_help.c:1339 sql_help.c:2254 sql_help.c:2797
+msgid "generation_expr"
+msgstr ""
+
+#: sql_help.c:1341 sql_help.c:1342 sql_help.c:1351 sql_help.c:1353
+#: sql_help.c:1357 sql_help.c:2799 sql_help.c:2800 sql_help.c:2809
+#: sql_help.c:2811 sql_help.c:2815
+msgid "index_parameters"
+msgstr "indeks_parametreleri"
+
+#: sql_help.c:1343 sql_help.c:1360 sql_help.c:2801 sql_help.c:2818
+msgid "reftable"
+msgstr "referans tablosu"
+
+#: sql_help.c:1344 sql_help.c:1361 sql_help.c:2802 sql_help.c:2819
+msgid "refcolumn"
+msgstr "referans kolonu"
+
+#: sql_help.c:1345 sql_help.c:1346 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:2803 sql_help.c:2804 sql_help.c:2820 sql_help.c:2821
+#, fuzzy
+#| msgid "initial_condition"
+msgid "referential_action"
+msgstr "ilk_durum"
+
+#: sql_help.c:1347 sql_help.c:2255 sql_help.c:2805
+msgid "and table_constraint is:"
+msgstr "ve tablo_kısıtlaması şöyledir:"
+
+#: sql_help.c:1355 sql_help.c:2813
+msgid "exclude_element"
+msgstr "hariçtutma(ecxlude)_öğesi"
+
+#: sql_help.c:1356 sql_help.c:2814 sql_help.c:4246 sql_help.c:4336
+#: sql_help.c:4485 sql_help.c:4638 sql_help.c:4703
+msgid "operator"
+msgstr "operatör"
+
+#: sql_help.c:1358 sql_help.c:2358 sql_help.c:2816
+msgid "predicate"
+msgstr "yüklem (predicate)"
+
+#: sql_help.c:1364
+msgid "and table_constraint_using_index is:"
+msgstr "ve indeks_kullanan_tablo_kısıtlaması şöyledir:"
+
+#: sql_help.c:1367 sql_help.c:2829
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "UNIQUE, PRIMARY KEY ve EXCLUDE kısıtlamalarında index_parametreleri şunlar olabilir:"
+
+#: sql_help.c:1372 sql_help.c:2834
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr ""
+
+#: sql_help.c:1375 sql_help.c:2353 sql_help.c:2761 sql_help.c:2774
+#: sql_help.c:2788 sql_help.c:2837 sql_help.c:3800
+msgid "opclass"
+msgstr "opclass"
+
+#: sql_help.c:1391 sql_help.c:1394 sql_help.c:2872
+msgid "tablespace_option"
+msgstr "tablespace_seçeneği"
+
+#: sql_help.c:1415 sql_help.c:1418 sql_help.c:1424 sql_help.c:1428
+msgid "token_type"
+msgstr "token_tipi"
+
+#: sql_help.c:1416 sql_help.c:1419
+msgid "dictionary_name"
+msgstr "sözlük_adı"
+
+#: sql_help.c:1421 sql_help.c:1425
+msgid "old_dictionary"
+msgstr "eski_sözlük"
+
+#: sql_help.c:1422 sql_help.c:1426
+msgid "new_dictionary"
+msgstr "yeni_sözlük"
+
+#: sql_help.c:1518 sql_help.c:1531 sql_help.c:1534 sql_help.c:1535
+#: sql_help.c:3023
+msgid "attribute_name"
+msgstr "özellik_adı"
+
+#: sql_help.c:1519
+msgid "new_attribute_name"
+msgstr "yeni_özellik_adı"
+
+#: sql_help.c:1525 sql_help.c:1529
+msgid "new_enum_value"
+msgstr "yeni_enum_deÄŸeri"
+
+#: sql_help.c:1526
+msgid "neighbor_enum_value"
+msgstr "komÅŸu_enum_deÄŸeri"
+
+#: sql_help.c:1528
+msgid "existing_enum_value"
+msgstr "mevcut_enum_deÄŸeri"
+
+#: sql_help.c:1603 sql_help.c:2238 sql_help.c:2247 sql_help.c:2624
+#: sql_help.c:3101 sql_help.c:3546 sql_help.c:3721 sql_help.c:3756
+#: sql_help.c:4054
+msgid "server_name"
+msgstr "sunucu_adı"
+
+#: sql_help.c:1631 sql_help.c:1634 sql_help.c:3116
+msgid "view_option_name"
+msgstr "seçenek_adı_görüntüle"
+
+#: sql_help.c:1632 sql_help.c:3117
+msgid "view_option_value"
+msgstr "seçenek_değeri_görüntüle"
+
+#: sql_help.c:1653 sql_help.c:1654 sql_help.c:4611 sql_help.c:4612
+msgid "table_and_columns"
+msgstr "tablolar_ve_sütunlar"
+
+#: sql_help.c:1655 sql_help.c:1899 sql_help.c:3593 sql_help.c:4613
+msgid "where option can be one of:"
+msgstr "seçenek aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:1656 sql_help.c:1657 sql_help.c:1901 sql_help.c:1904
+#: sql_help.c:2083 sql_help.c:3594 sql_help.c:3595 sql_help.c:3596
+#: sql_help.c:3597 sql_help.c:3598 sql_help.c:3599 sql_help.c:3600
+#: sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 sql_help.c:4617
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1658 sql_help.c:4622
+msgid "and table_and_columns is:"
+msgstr "ve tablolar_ve_sütunlar şöyledir:"
+
+#: sql_help.c:1674 sql_help.c:4396 sql_help.c:4398 sql_help.c:4422
+msgid "transaction_mode"
+msgstr "transaction_modu"
+
+#: sql_help.c:1675 sql_help.c:4399 sql_help.c:4423
+msgid "where transaction_mode is one of:"
+msgstr "transaction_modu aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:1684 sql_help.c:4256 sql_help.c:4265 sql_help.c:4269
+#: sql_help.c:4273 sql_help.c:4276 sql_help.c:4495 sql_help.c:4504
+#: sql_help.c:4508 sql_help.c:4512 sql_help.c:4515 sql_help.c:4713
+#: sql_help.c:4722 sql_help.c:4726 sql_help.c:4730 sql_help.c:4733
+msgid "argument"
+msgstr "bağımsız değişken"
+
+#: sql_help.c:1774
+msgid "relation_name"
+msgstr "nesne_adı"
+
+#: sql_help.c:1779 sql_help.c:3717 sql_help.c:4050
+msgid "domain_name"
+msgstr "domain_adı"
+
+#: sql_help.c:1801
+msgid "policy_name"
+msgstr "ilke(policy)_adı"
+
+#: sql_help.c:1814
+msgid "rule_name"
+msgstr "kural_adı"
+
+#: sql_help.c:1833
+msgid "text"
+msgstr "metin"
+
+#: sql_help.c:1858 sql_help.c:3900 sql_help.c:4088
+msgid "transaction_id"
+msgstr "iÅŸlem(transaction)_id"
+
+#: sql_help.c:1889 sql_help.c:1896 sql_help.c:3826
+msgid "filename"
+msgstr "dosyaadı"
+
+#: sql_help.c:1890 sql_help.c:1897 sql_help.c:2564 sql_help.c:2565
+#: sql_help.c:2566
+msgid "command"
+msgstr "komut"
+
+#: sql_help.c:1892 sql_help.c:2563 sql_help.c:2975 sql_help.c:3152
+#: sql_help.c:3810 sql_help.c:4239 sql_help.c:4241 sql_help.c:4329
+#: sql_help.c:4331 sql_help.c:4478 sql_help.c:4480 sql_help.c:4583
+#: sql_help.c:4696 sql_help.c:4698
+msgid "condition"
+msgstr "ÅŸart"
+
+#: sql_help.c:1895 sql_help.c:2392 sql_help.c:2858 sql_help.c:3118
+#: sql_help.c:3136 sql_help.c:3791
+msgid "query"
+msgstr "sorgu"
+
+#: sql_help.c:1900
+msgid "format_name"
+msgstr "biçim(format)_adı"
+
+#: sql_help.c:1902
+msgid "delimiter_character"
+msgstr "ayrıştırıcı_karakteri"
+
+#: sql_help.c:1903
+msgid "null_string"
+msgstr "null_dizi"
+
+#: sql_help.c:1905
+msgid "quote_character"
+msgstr " quote_karakteri"
+
+#: sql_help.c:1906
+msgid "escape_character"
+msgstr "kaçış(escape)_karakteri"
+
+#: sql_help.c:1910
+msgid "encoding_name"
+msgstr "dilkodlaması_adı"
+
+#: sql_help.c:1921
+msgid "access_method_type"
+msgstr "erişim_yöntemi_tipi"
+
+#: sql_help.c:1992 sql_help.c:2011 sql_help.c:2014
+msgid "arg_data_type"
+msgstr "arg_veri_tipi"
+
+#: sql_help.c:1993 sql_help.c:2015 sql_help.c:2023
+msgid "sfunc"
+msgstr "sfunc"
+
+#: sql_help.c:1994 sql_help.c:2016 sql_help.c:2024
+msgid "state_data_type"
+msgstr "durum(state)_veri_tipi"
+
+#: sql_help.c:1995 sql_help.c:2017 sql_help.c:2025
+msgid "state_data_size"
+msgstr "durum(state)_veri_boyutu"
+
+#: sql_help.c:1996 sql_help.c:2018 sql_help.c:2026
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:1997 sql_help.c:2027
+msgid "combinefunc"
+msgstr ""
+
+#: sql_help.c:1998 sql_help.c:2028
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:1999 sql_help.c:2029
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2000 sql_help.c:2019 sql_help.c:2030
+msgid "initial_condition"
+msgstr "ilk_durum"
+
+#: sql_help.c:2001 sql_help.c:2031
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2002 sql_help.c:2032
+msgid "minvfunc"
+msgstr "en düşük değer fonksiyonu (minvfunc)"
+
+#: sql_help.c:2003 sql_help.c:2033
+msgid "mstate_data_type"
+msgstr "mstate_veri_tipi"
+
+#: sql_help.c:2004 sql_help.c:2034
+msgid "mstate_data_size"
+msgstr "mstate_veri_boyutu"
+
+#: sql_help.c:2005 sql_help.c:2035
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2006 sql_help.c:2036
+#, fuzzy
+#| msgid "initial_condition"
+msgid "minitial_condition"
+msgstr "ilk_durum"
+
+#: sql_help.c:2007 sql_help.c:2037
+msgid "sort_operator"
+msgstr "sıralama(sort)_operatörü"
+
+#: sql_help.c:2020
+msgid "or the old syntax"
+msgstr "ya da eski sözdizimi"
+
+#: sql_help.c:2022
+#, fuzzy
+msgid "base_type"
+msgstr "Hedef tipi"
+
+#: sql_help.c:2079
+msgid "locale"
+msgstr "yerel ayar"
+
+#: sql_help.c:2080 sql_help.c:2119
+msgid "lc_collate"
+msgstr "lc_collate"
+
+#: sql_help.c:2081 sql_help.c:2120
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2082 sql_help.c:4141
+msgid "provider"
+msgstr "sağlayıcı"
+
+#: sql_help.c:2084 sql_help.c:2175
+msgid "version"
+msgstr "sürüm"
+
+#: sql_help.c:2086
+msgid "existing_collation"
+msgstr "mevcut_sıralama(collation)"
+
+#: sql_help.c:2096
+msgid "source_encoding"
+msgstr "kaynak_dil kodlaması"
+
+#: sql_help.c:2097
+msgid "dest_encoding"
+msgstr "hedef_dil kodlaması"
+
+#: sql_help.c:2117 sql_help.c:2898
+msgid "template"
+msgstr "ÅŸablon"
+
+#: sql_help.c:2118
+msgid "encoding"
+msgstr "dil kodlaması"
+
+#: sql_help.c:2144
+msgid "constraint"
+msgstr "kısıtlama"
+
+#: sql_help.c:2145
+msgid "where constraint is:"
+msgstr "kısıtlama şu şekilde olabilir:"
+
+#: sql_help.c:2159 sql_help.c:2561 sql_help.c:2971
+msgid "event"
+msgstr "olay"
+
+#: sql_help.c:2160
+msgid "filter_variable"
+msgstr "filtre_deÄŸiÅŸkeni"
+
+#: sql_help.c:2176
+msgid "old_version"
+msgstr "eski_sürüm"
+
+#: sql_help.c:2250 sql_help.c:2793
+msgid "where column_constraint is:"
+msgstr "kolon_kısıtlaması aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:2287
+msgid "rettype"
+msgstr "dönüş tipi"
+
+#: sql_help.c:2289
+msgid "column_type"
+msgstr "kolon_tipi"
+
+#: sql_help.c:2298 sql_help.c:2492
+msgid "definition"
+msgstr "tanımı"
+
+#: sql_help.c:2299 sql_help.c:2493
+msgid "obj_file"
+msgstr "obj_file"
+
+#: sql_help.c:2300 sql_help.c:2494
+msgid "link_symbol"
+msgstr "link_sembolü"
+
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:3090
+msgid "uid"
+msgstr "kullanıcı numarası"
+
+#: sql_help.c:2349 sql_help.c:2388 sql_help.c:2762 sql_help.c:2775
+#: sql_help.c:2789 sql_help.c:2854
+msgid "method"
+msgstr "yöntem"
+
+#: sql_help.c:2370
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2371
+msgid "inline_handler"
+msgstr "inline_handler"
+
+#: sql_help.c:2372
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2410
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2411
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2429
+msgid "family_name"
+msgstr "family_name"
+
+#: sql_help.c:2440
+msgid "storage_type"
+msgstr "saklama_tipi"
+
+#: sql_help.c:2567 sql_help.c:2978
+msgid "where event can be one of:"
+msgstr "olay (event) aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:2586 sql_help.c:2588
+msgid "schema_element"
+msgstr "şema_elemanı"
+
+#: sql_help.c:2625
+msgid "server_type"
+msgstr "sunucu_tipi"
+
+#: sql_help.c:2626
+msgid "server_version"
+msgstr "sunucu_sürümü"
+
+#: sql_help.c:2627 sql_help.c:3719 sql_help.c:4052
+msgid "fdw_name"
+msgstr "fdw_adı"
+
+#: sql_help.c:2640
+msgid "statistics_name"
+msgstr "istatistik_adı"
+
+#: sql_help.c:2641
+msgid "statistics_kind"
+msgstr "istatistik_tipi"
+
+#: sql_help.c:2655
+msgid "subscription_name"
+msgstr "abonelik_adı(subsciption)"
+
+#: sql_help.c:2755
+msgid "source_table"
+msgstr "kaynak_tablo"
+
+#: sql_help.c:2756
+msgid "like_option"
+msgstr "like_seçeneği"
+
+#: sql_help.c:2822
+msgid "and like_option is:"
+msgstr "like_seçeneği şu olabilir:"
+
+#: sql_help.c:2871
+msgid "directory"
+msgstr "dizin"
+
+#: sql_help.c:2885
+msgid "parser_name"
+msgstr "ayrıştırıcı_adı"
+
+#: sql_help.c:2886
+msgid "source_config"
+msgstr "source_config"
+
+#: sql_help.c:2915
+msgid "start_function"
+msgstr "başlangıç_fonksiyonu"
+
+#: sql_help.c:2916
+msgid "gettoken_function"
+msgstr "gettoken_fonksiyonu"
+
+#: sql_help.c:2917
+msgid "end_function"
+msgstr "end_fonksiyonu"
+
+#: sql_help.c:2918
+msgid "lextypes_function"
+msgstr "lextypes_fonksiyonu"
+
+#: sql_help.c:2919
+#, fuzzy
+msgid "headline_function"
+msgstr "fonksiyon"
+
+#: sql_help.c:2931
+msgid "init_function"
+msgstr "ilkendirme_fonksiyonu"
+
+#: sql_help.c:2932
+msgid "lexize_function"
+msgstr "lexize_fonksiyonu"
+
+#: sql_help.c:2945
+msgid "from_sql_function_name"
+msgstr "from_sql_fonksiyon_adı"
+
+#: sql_help.c:2947
+msgid "to_sql_function_name"
+msgstr "to_sql_fonksiyon_adı"
+
+#: sql_help.c:2973
+msgid "referenced_table_name"
+msgstr "referans_edilen_tablo_adı"
+
+#: sql_help.c:2974
+#, fuzzy
+msgid "transition_relation_name"
+msgstr "dil_adı"
+
+#: sql_help.c:2977
+msgid "arguments"
+msgstr "argümanlar"
+
+#: sql_help.c:3027 sql_help.c:4174
+msgid "label"
+msgstr "etiket"
+
+#: sql_help.c:3029
+msgid "subtype"
+msgstr "alttip"
+
+#: sql_help.c:3030
+msgid "subtype_operator_class"
+msgstr "alttip_operatör_sınıfı"
+
+#: sql_help.c:3032
+msgid "canonical_function"
+msgstr "canonical_fonksiyon"
+
+#: sql_help.c:3033
+msgid "subtype_diff_function"
+msgstr "subtype-diff_fonksiyonu"
+
+#: sql_help.c:3035
+msgid "input_function"
+msgstr "giriÅŸ_fonksiyonu"
+
+#: sql_help.c:3036
+msgid "output_function"
+msgstr "çıktı_fonksiyonu"
+
+#: sql_help.c:3037
+msgid "receive_function"
+msgstr "alma_fonksiyonu"
+
+#: sql_help.c:3038
+msgid "send_function"
+msgstr "gönderme_fonksiyonu"
+
+#: sql_help.c:3039
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3040
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+#: sql_help.c:3041
+msgid "analyze_function"
+msgstr "analiz_fonksiyonu"
+
+#: sql_help.c:3042
+msgid "internallength"
+msgstr "internallength"
+
+#: sql_help.c:3043
+msgid "alignment"
+msgstr "hizalama"
+
+#: sql_help.c:3044
+msgid "storage"
+msgstr "saklama"
+
+#: sql_help.c:3045
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:3046
+msgid "category"
+msgstr "category"
+
+#: sql_help.c:3047
+msgid "preferred"
+msgstr "tercih edilen"
+
+#: sql_help.c:3048
+msgid "default"
+msgstr "öntanımlı"
+
+#: sql_help.c:3049
+msgid "element"
+msgstr "öğe"
+
+#: sql_help.c:3050
+msgid "delimiter"
+msgstr "sınırlayıcı"
+
+#: sql_help.c:3051
+msgid "collatable"
+msgstr "sıralanabilir"
+
+#: sql_help.c:3148 sql_help.c:3786 sql_help.c:4234 sql_help.c:4323
+#: sql_help.c:4473 sql_help.c:4573 sql_help.c:4691
+msgid "with_query"
+msgstr "with_sorgusu"
+
+#: sql_help.c:3150 sql_help.c:3788 sql_help.c:4253 sql_help.c:4259
+#: sql_help.c:4262 sql_help.c:4266 sql_help.c:4270 sql_help.c:4278
+#: sql_help.c:4492 sql_help.c:4498 sql_help.c:4501 sql_help.c:4505
+#: sql_help.c:4509 sql_help.c:4517 sql_help.c:4575 sql_help.c:4710
+#: sql_help.c:4716 sql_help.c:4719 sql_help.c:4723 sql_help.c:4727
+#: sql_help.c:4735
+msgid "alias"
+msgstr "takma ad"
+
+#: sql_help.c:3151
+msgid "using_list"
+msgstr "using_list"
+
+#: sql_help.c:3153 sql_help.c:3626 sql_help.c:3867 sql_help.c:4584
+msgid "cursor_name"
+msgstr "imleç_adı"
+
+#: sql_help.c:3154 sql_help.c:3794 sql_help.c:4585
+msgid "output_expression"
+msgstr "çıktı_ifadesi"
+
+#: sql_help.c:3155 sql_help.c:3795 sql_help.c:4237 sql_help.c:4326
+#: sql_help.c:4476 sql_help.c:4586 sql_help.c:4694
+msgid "output_name"
+msgstr "output_name"
+
+#: sql_help.c:3171
+msgid "code"
+msgstr "kod"
+
+#: sql_help.c:3570
+msgid "parameter"
+msgstr "deÄŸiÅŸken"
+
+#: sql_help.c:3591 sql_help.c:3592 sql_help.c:3892
+msgid "statement"
+msgstr "ifade"
+
+#: sql_help.c:3625 sql_help.c:3866
+msgid "direction"
+msgstr "yön"
+
+#: sql_help.c:3627 sql_help.c:3868
+msgid "where direction can be empty or one of:"
+msgstr "yön boş ya da şunlardan biri olabilir:"
+
+#: sql_help.c:3628 sql_help.c:3629 sql_help.c:3630 sql_help.c:3631
+#: sql_help.c:3632 sql_help.c:3869 sql_help.c:3870 sql_help.c:3871
+#: sql_help.c:3872 sql_help.c:3873 sql_help.c:4247 sql_help.c:4249
+#: sql_help.c:4337 sql_help.c:4339 sql_help.c:4486 sql_help.c:4488
+#: sql_help.c:4639 sql_help.c:4641 sql_help.c:4704 sql_help.c:4706
+msgid "count"
+msgstr "toplam sayı"
+
+#: sql_help.c:3712 sql_help.c:4045
+msgid "sequence_name"
+msgstr "sequence_adı"
+
+#: sql_help.c:3725 sql_help.c:4058
+msgid "arg_name"
+msgstr "arg_adı"
+
+#: sql_help.c:3726 sql_help.c:4059
+msgid "arg_type"
+msgstr "bağımsız_değişken_tipi"
+
+#: sql_help.c:3731 sql_help.c:4064
+msgid "loid"
+msgstr ""
+
+#: sql_help.c:3754
+msgid "remote_schema"
+msgstr "uzak_ÅŸema"
+
+#: sql_help.c:3757
+msgid "local_schema"
+msgstr "yerel_ÅŸema"
+
+#: sql_help.c:3792
+msgid "conflict_target"
+msgstr "çakışma_hedefi"
+
+#: sql_help.c:3793
+msgid "conflict_action"
+msgstr "çakışma_eylemi"
+
+#: sql_help.c:3796
+msgid "where conflict_target can be one of:"
+msgstr "çakışma_hedefi aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:3797
+msgid "index_column_name"
+msgstr "indeks_sütun_adı"
+
+#: sql_help.c:3798
+msgid "index_expression"
+msgstr "indeks_ifadesi"
+
+#: sql_help.c:3801
+msgid "index_predicate"
+msgstr "index_yüklemi"
+
+#: sql_help.c:3803
+msgid "and conflict_action is one of:"
+msgstr "ve çakışma_eylemi aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:3809 sql_help.c:4581
+msgid "sub-SELECT"
+msgstr "alt-SELECT"
+
+#: sql_help.c:3818 sql_help.c:3881 sql_help.c:4557
+msgid "channel"
+msgstr "kanal"
+
+#: sql_help.c:3840
+msgid "lockmode"
+msgstr "kilitleme modu"
+
+#: sql_help.c:3841
+msgid "where lockmode is one of:"
+msgstr "kilitleme modu ÅŸunlardan biri olabilir:"
+
+#: sql_help.c:3882
+msgid "payload"
+msgstr "yük (payload)"
+
+#: sql_help.c:3909
+msgid "old_role"
+msgstr "eski_rol"
+
+#: sql_help.c:3910
+msgid "new_role"
+msgstr "yeni_rol"
+
+#: sql_help.c:3935 sql_help.c:4096 sql_help.c:4104
+msgid "savepoint_name"
+msgstr "savepoint_adı"
+
+#: sql_help.c:4238 sql_help.c:4280 sql_help.c:4282 sql_help.c:4328
+#: sql_help.c:4477 sql_help.c:4519 sql_help.c:4521 sql_help.c:4695
+#: sql_help.c:4737 sql_help.c:4739
+msgid "from_item"
+msgstr "from_item"
+
+#: sql_help.c:4240 sql_help.c:4292 sql_help.c:4479 sql_help.c:4531
+#: sql_help.c:4697 sql_help.c:4749
+msgid "grouping_element"
+msgstr "gruplama_öğesi"
+
+#: sql_help.c:4242 sql_help.c:4332 sql_help.c:4481 sql_help.c:4699
+msgid "window_name"
+msgstr "pencere_adı"
+
+#: sql_help.c:4243 sql_help.c:4333 sql_help.c:4482 sql_help.c:4700
+msgid "window_definition"
+msgstr "window_tanımı"
+
+#: sql_help.c:4244 sql_help.c:4258 sql_help.c:4296 sql_help.c:4334
+#: sql_help.c:4483 sql_help.c:4497 sql_help.c:4535 sql_help.c:4701
+#: sql_help.c:4715 sql_help.c:4753
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4251 sql_help.c:4490 sql_help.c:4708
+msgid "where from_item can be one of:"
+msgstr "from_öğesi şunlardan biri olabilir"
+
+#: sql_help.c:4254 sql_help.c:4260 sql_help.c:4263 sql_help.c:4267
+#: sql_help.c:4279 sql_help.c:4493 sql_help.c:4499 sql_help.c:4502
+#: sql_help.c:4506 sql_help.c:4518 sql_help.c:4711 sql_help.c:4717
+#: sql_help.c:4720 sql_help.c:4724 sql_help.c:4736
+msgid "column_alias"
+msgstr "kolon_takma_adı"
+
+#: sql_help.c:4255 sql_help.c:4494 sql_help.c:4712
+msgid "sampling_method"
+msgstr "örnekleme_yöntemi"
+
+#: sql_help.c:4257 sql_help.c:4496 sql_help.c:4714
+msgid "seed"
+msgstr "başlangıç değeri"
+
+#: sql_help.c:4261 sql_help.c:4294 sql_help.c:4500 sql_help.c:4533
+#: sql_help.c:4718 sql_help.c:4751
+msgid "with_query_name"
+msgstr "with_sorgu_adı"
+
+#: sql_help.c:4271 sql_help.c:4274 sql_help.c:4277 sql_help.c:4510
+#: sql_help.c:4513 sql_help.c:4516 sql_help.c:4728 sql_help.c:4731
+#: sql_help.c:4734
+msgid "column_definition"
+msgstr "kolon_tanımı"
+
+#: sql_help.c:4281 sql_help.c:4520 sql_help.c:4738
+msgid "join_type"
+msgstr "join_tipi"
+
+#: sql_help.c:4283 sql_help.c:4522 sql_help.c:4740
+msgid "join_condition"
+msgstr "join_şartı"
+
+#: sql_help.c:4284 sql_help.c:4523 sql_help.c:4741
+msgid "join_column"
+msgstr "join_sütunu"
+
+#: sql_help.c:4285 sql_help.c:4524 sql_help.c:4742
+msgid "and grouping_element can be one of:"
+msgstr "ve grouplama-elemanı aşağıdakilerden birisi olabilir:"
+
+#: sql_help.c:4293 sql_help.c:4532 sql_help.c:4750
+msgid "and with_query is:"
+msgstr "ve with_sorgusu :"
+
+#: sql_help.c:4297 sql_help.c:4536 sql_help.c:4754
+msgid "values"
+msgstr "deÄŸerler"
+
+#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4755
+msgid "insert"
+msgstr "ekle (insert)"
+
+#: sql_help.c:4299 sql_help.c:4538 sql_help.c:4756
+msgid "update"
+msgstr "güncelle (update)"
+
+#: sql_help.c:4300 sql_help.c:4539 sql_help.c:4757
+msgid "delete"
+msgstr "sil (delete)"
+
+#: sql_help.c:4327
+msgid "new_table"
+msgstr "yeni_tablo"
+
+#: sql_help.c:4352
+msgid "timezone"
+msgstr "saat dilimi"
+
+#: sql_help.c:4397
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:4582
+msgid "from_list"
+msgstr "from_listesi"
+
+#: sql_help.c:4637
+msgid "sort_expression"
+msgstr "sort_ifadesi"
+
+#: sql_help.c:4764 sql_help.c:5742
+msgid "abort the current transaction"
+msgstr "aktif transcation'ı iptal et"
+
+#: sql_help.c:4770
+msgid "change the definition of an aggregate function"
+msgstr "aggregate fonksiyonunun tanımını değiştir"
+
+#: sql_help.c:4776
+msgid "change the definition of a collation"
+msgstr "karşılaştırma (collation) tanımını değiştir"
+
+#: sql_help.c:4782
+msgid "change the definition of a conversion"
+msgstr "bir dönüşümün tanımını değiştir"
+
+#: sql_help.c:4788
+msgid "change a database"
+msgstr "veritabanını değiştir"
+
+#: sql_help.c:4794
+msgid "define default access privileges"
+msgstr "varsayılan erişim haklarını tanımla"
+
+#: sql_help.c:4800
+msgid "change the definition of a domain"
+msgstr "domain tanımını değiştir"
+
+#: sql_help.c:4806
+msgid "change the definition of an event trigger"
+msgstr "olay tetikleyici tanımını değiştir"
+
+#: sql_help.c:4812
+msgid "change the definition of an extension"
+msgstr "uzantı tanımını değiştir"
+
+#: sql_help.c:4818
+msgid "change the definition of a foreign-data wrapper"
+msgstr "foreign-data wrapper tanımını değiştir"
+
+#: sql_help.c:4824
+msgid "change the definition of a foreign table"
+msgstr "uzak (foreign) tablo tanımını değiştir"
+
+#: sql_help.c:4830
+msgid "change the definition of a function"
+msgstr "fonksiyon tanımını değiştir"
+
+#: sql_help.c:4836
+msgid "change role name or membership"
+msgstr "üyeliği veya rol adını değiştir"
+
+#: sql_help.c:4842
+msgid "change the definition of an index"
+msgstr "index tanımını değiştir"
+
+#: sql_help.c:4848
+msgid "change the definition of a procedural language"
+msgstr "yordamsal dilinin tanımını değiştir"
+
+#: sql_help.c:4854
+msgid "change the definition of a large object"
+msgstr "büyük nesne tanımını değiştir"
+
+#: sql_help.c:4860
+msgid "change the definition of a materialized view"
+msgstr "maddileştirilmiş görünüm (materialized view) tanımını değiştir"
+
+#: sql_help.c:4866
+msgid "change the definition of an operator"
+msgstr "operatör tanımını değiştir"
+
+#: sql_help.c:4872
+msgid "change the definition of an operator class"
+msgstr "operatör sınıfının tanımını değiştir"
+
+#: sql_help.c:4878
+msgid "change the definition of an operator family"
+msgstr "operatör ailesinin tanımını değiştir"
+
+#: sql_help.c:4884
+msgid "change the definition of a row level security policy"
+msgstr "satır seviyesi güvenlik ilkesi tanımını değiştir"
+
+#: sql_help.c:4890
+msgid "change the definition of a procedure"
+msgstr "prosedür tanımını değiştir"
+
+#: sql_help.c:4896
+msgid "change the definition of a publication"
+msgstr "yayın tanımını değiştir"
+
+#: sql_help.c:4902 sql_help.c:5004
+msgid "change a database role"
+msgstr "veritabanı dolünü değiştir"
+
+#: sql_help.c:4908
+msgid "change the definition of a routine"
+msgstr "yordam (routine) tanımını değiştir"
+
+#: sql_help.c:4914
+msgid "change the definition of a rule"
+msgstr "kural tanımını değiştir"
+
+#: sql_help.c:4920
+msgid "change the definition of a schema"
+msgstr "şema tanımını değiştir"
+
+#: sql_help.c:4926
+msgid "change the definition of a sequence generator"
+msgstr "sequence üretecinin tanımını değiştir"
+
+#: sql_help.c:4932
+msgid "change the definition of a foreign server"
+msgstr "foreign server tanımını değiştir"
+
+#: sql_help.c:4938
+msgid "change the definition of an extended statistics object"
+msgstr "genişletilmiş istatistik nesnesinin tanımını değiştir"
+
+#: sql_help.c:4944
+msgid "change the definition of a subscription"
+msgstr "abonelik tanımını değiştir"
+
+#: sql_help.c:4950
+msgid "change a server configuration parameter"
+msgstr "bir sunucu yapılandırma parametresini değiştir"
+
+#: sql_help.c:4956
+msgid "change the definition of a table"
+msgstr "tablonun tanımını değiştir"
+
+#: sql_help.c:4962
+msgid "change the definition of a tablespace"
+msgstr "tablespace tanımını değiştir"
+
+#: sql_help.c:4968
+msgid "change the definition of a text search configuration"
+msgstr "metin arama yapılandırmasının tanımını değiştir"
+
+#: sql_help.c:4974
+msgid "change the definition of a text search dictionary"
+msgstr "metin arama sözlüğünün tanımını değiştir"
+
+#: sql_help.c:4980
+msgid "change the definition of a text search parser"
+msgstr "metin arama ayrıştırıcısının tanımını değiştir"
+
+#: sql_help.c:4986
+msgid "change the definition of a text search template"
+msgstr "metin arama şablonunun tanımını değiştir"
+
+#: sql_help.c:4992
+msgid "change the definition of a trigger"
+msgstr "trigger tanımını değiştir"
+
+#: sql_help.c:4998
+msgid "change the definition of a type"
+msgstr "type tanımını değiştir"
+
+#: sql_help.c:5010
+msgid "change the definition of a user mapping"
+msgstr "kullanıcı haritalama tanımını değiştir"
+
+#: sql_help.c:5016
+msgid "change the definition of a view"
+msgstr "view tanımını değiştir"
+
+#: sql_help.c:5022
+msgid "collect statistics about a database"
+msgstr "database hakkında istatistikleri topla"
+
+#: sql_help.c:5028 sql_help.c:5820
+msgid "start a transaction block"
+msgstr "transaction bloÄŸunu baÅŸlat"
+
+#: sql_help.c:5034
+msgid "invoke a procedure"
+msgstr "bir prosedürü çağır"
+
+#: sql_help.c:5040
+msgid "force a write-ahead log checkpoint"
+msgstr "write-ahead log checkpoint'i gerçekleştir"
+
+#: sql_help.c:5046
+msgid "close a cursor"
+msgstr "cursor'u kapat"
+
+#: sql_help.c:5052
+msgid "cluster a table according to an index"
+msgstr "indexe dayanarak tabloyu cluster iÅŸlemine tabi tut"
+
+#: sql_help.c:5058
+msgid "define or change the comment of an object"
+msgstr "Nesne yorumunu tanımla ya da değiştir"
+
+#: sql_help.c:5064 sql_help.c:5622
+msgid "commit the current transaction"
+msgstr "geçerli transaction'u commit et"
+
+#: sql_help.c:5070
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "daha önce two-phase commit için hazırlanmış transaction'u commit et"
+
+#: sql_help.c:5076
+msgid "copy data between a file and a table"
+msgstr "dosya ile veritabanı tablosu arasında veriyi transfer et"
+
+#: sql_help.c:5082
+msgid "define a new access method"
+msgstr "yeni erişim yöntemi tanımla"
+
+#: sql_help.c:5088
+msgid "define a new aggregate function"
+msgstr "yeni aggregate fonksiyonunu tanımla"
+
+#: sql_help.c:5094
+msgid "define a new cast"
+msgstr "yeni cast tanımla"
+
+#: sql_help.c:5100
+msgid "define a new collation"
+msgstr "yeni karşılaştırma (collation) tanımla"
+
+#: sql_help.c:5106
+msgid "define a new encoding conversion"
+msgstr "yeni kodlama dönüşümü tanımla"
+
+#: sql_help.c:5112
+msgid "create a new database"
+msgstr "yeni veritabanı oluştur"
+
+#: sql_help.c:5118
+msgid "define a new domain"
+msgstr "yeni domaın tanımla"
+
+#: sql_help.c:5124
+msgid "define a new event trigger"
+msgstr "yeni olay tetikleyici tanımla"
+
+#: sql_help.c:5130
+msgid "install an extension"
+msgstr "bir uzantı kur"
+
+#: sql_help.c:5136
+msgid "define a new foreign-data wrapper"
+msgstr "yeni foreign-data wrapper tanımla"
+
+#: sql_help.c:5142
+msgid "define a new foreign table"
+msgstr "yeni uzak (foreign) tablo tanımla"
+
+#: sql_help.c:5148
+msgid "define a new function"
+msgstr "yeni fonksiyonu tanımla"
+
+#: sql_help.c:5154 sql_help.c:5214 sql_help.c:5316
+msgid "define a new database role"
+msgstr "yeni veritabanı rolü tanımla"
+
+#: sql_help.c:5160
+msgid "define a new index"
+msgstr "yeni indeks tanımla"
+
+#: sql_help.c:5166
+msgid "define a new procedural language"
+msgstr "yeni yordamsal dil tanımla"
+
+#: sql_help.c:5172
+msgid "define a new materialized view"
+msgstr "yeni maddileştirilmiş görünüm (materialized view) tanımla"
+
+#: sql_help.c:5178
+msgid "define a new operator"
+msgstr "yeni operator tanımla"
+
+#: sql_help.c:5184
+msgid "define a new operator class"
+msgstr "yeni operator class tanımla"
+
+#: sql_help.c:5190
+msgid "define a new operator family"
+msgstr "yeni operatör ailesini tanımla"
+
+#: sql_help.c:5196
+msgid "define a new row level security policy for a table"
+msgstr "bir tablo için yeni satır-seviyesi güvenlik ilkesi tanımla"
+
+#: sql_help.c:5202
+msgid "define a new procedure"
+msgstr "yeni bir prosedür tanımla"
+
+#: sql_help.c:5208
+msgid "define a new publication"
+msgstr "yeni bir yayın tanımla"
+
+#: sql_help.c:5220
+msgid "define a new rewrite rule"
+msgstr "yeni rewriter rule tanımla"
+
+#: sql_help.c:5226
+msgid "define a new schema"
+msgstr "yeni şema tanımla"
+
+#: sql_help.c:5232
+msgid "define a new sequence generator"
+msgstr "yeni sequence generator tanımla"
+
+#: sql_help.c:5238
+msgid "define a new foreign server"
+msgstr "yeni foreign sunucu tanımla"
+
+#: sql_help.c:5244
+msgid "define extended statistics"
+msgstr "genişletilmiş istatistikleri tanımla"
+
+#: sql_help.c:5250
+msgid "define a new subscription"
+msgstr "yeni abonelik tanımla"
+
+#: sql_help.c:5256
+msgid "define a new table"
+msgstr "yeni tablo tanımla"
+
+#: sql_help.c:5262 sql_help.c:5778
+msgid "define a new table from the results of a query"
+msgstr "sorgu sonuçlarından yeni tablo tanımla"
+
+#: sql_help.c:5268
+msgid "define a new tablespace"
+msgstr "yeni tablespace tanımla"
+
+#: sql_help.c:5274
+msgid "define a new text search configuration"
+msgstr "yeni metin arama yapılandırması tanımla"
+
+#: sql_help.c:5280
+msgid "define a new text search dictionary"
+msgstr "yeni metin arama sözlüğü tanımla"
+
+#: sql_help.c:5286
+msgid "define a new text search parser"
+msgstr "yeni metin arama ayrıştırıcısı tanımla"
+
+#: sql_help.c:5292
+msgid "define a new text search template"
+msgstr "yeni metin arama şablonu tanımla"
+
+#: sql_help.c:5298
+msgid "define a new transform"
+msgstr "yeni bir dönüşüm (transform) tanımla"
+
+#: sql_help.c:5304
+msgid "define a new trigger"
+msgstr "yeni trigger tanımla"
+
+#: sql_help.c:5310
+msgid "define a new data type"
+msgstr "yeni veri tipi tanımla"
+
+#: sql_help.c:5322
+msgid "define a new mapping of a user to a foreign server"
+msgstr "bir foreign sunucuya yeni kullanıcı haritalamasını tanımla"
+
+#: sql_help.c:5328
+msgid "define a new view"
+msgstr "yeni vew tanımla"
+
+#: sql_help.c:5334
+msgid "deallocate a prepared statement"
+msgstr "deallocate a prepared statement"
+
+#: sql_help.c:5340
+msgid "define a cursor"
+msgstr "cursor tanımla"
+
+#: sql_help.c:5346
+msgid "delete rows of a table"
+msgstr "tablodan satırları sil"
+
+#: sql_help.c:5352
+msgid "discard session state"
+msgstr "oturum bilgileri unut"
+
+#: sql_help.c:5358
+msgid "execute an anonymous code block"
+msgstr "bir anonim kod bloğu çalıştır"
+
+#: sql_help.c:5364
+msgid "remove an access method"
+msgstr "bir erişim yöntemini kaldır"
+
+#: sql_help.c:5370
+msgid "remove an aggregate function"
+msgstr "aggregate function'u kaldır"
+
+#: sql_help.c:5376
+msgid "remove a cast"
+msgstr "cast kaldır"
+
+#: sql_help.c:5382
+msgid "remove a collation"
+msgstr "karşılaştırma (collation) kaldır"
+
+#: sql_help.c:5388
+msgid "remove a conversion"
+msgstr "conversion kaldır"
+
+#: sql_help.c:5394
+msgid "remove a database"
+msgstr "veritabanını kaldır"
+
+#: sql_help.c:5400
+msgid "remove a domain"
+msgstr "domain kaldır"
+
+#: sql_help.c:5406
+msgid "remove an event trigger"
+msgstr "olay tetikleyici kaldır"
+
+#: sql_help.c:5412
+msgid "remove an extension"
+msgstr "uzantı kaldır"
+
+#: sql_help.c:5418
+msgid "remove a foreign-data wrapper"
+msgstr "foreign-data wrapper'ını kaldır"
+
+#: sql_help.c:5424
+msgid "remove a foreign table"
+msgstr "uzak (foreign) tablo kaldır"
+
+#: sql_help.c:5430
+msgid "remove a function"
+msgstr "function kaldır"
+
+#: sql_help.c:5436 sql_help.c:5502 sql_help.c:5604
+msgid "remove a database role"
+msgstr "veritabanı rolünü kaldır"
+
+#: sql_help.c:5442
+msgid "remove an index"
+msgstr "indeks kaldır"
+
+#: sql_help.c:5448
+msgid "remove a procedural language"
+msgstr "yordamsal dili kaldır"
+
+#: sql_help.c:5454
+msgid "remove a materialized view"
+msgstr "maddileştirilmiş görünüm (materialized view) kaldır"
+
+#: sql_help.c:5460
+msgid "remove an operator"
+msgstr "opeartor kaldır"
+
+#: sql_help.c:5466
+msgid "remove an operator class"
+msgstr "operator class kaldır"
+
+#: sql_help.c:5472
+msgid "remove an operator family"
+msgstr "opeartör ailesini kaldır"
+
+#: sql_help.c:5478
+msgid "remove database objects owned by a database role"
+msgstr "veritabanı rolüne ait veritabanı nesneleri kaldır"
+
+#: sql_help.c:5484
+msgid "remove a row level security policy from a table"
+msgstr "bir tablodan satır-seviyesi güvenlik politikası kaldır"
+
+#: sql_help.c:5490
+msgid "remove a procedure"
+msgstr "bir prosedür kaldır"
+
+#: sql_help.c:5496
+msgid "remove a publication"
+msgstr "yayın kaldır"
+
+#: sql_help.c:5508
+msgid "remove a routine"
+msgstr "yordam (routine) kaldır"
+
+#: sql_help.c:5514
+msgid "remove a rewrite rule"
+msgstr "rewrite rule kaldır"
+
+#: sql_help.c:5520
+msgid "remove a schema"
+msgstr "şema kaldır"
+
+#: sql_help.c:5526
+msgid "remove a sequence"
+msgstr "sequence kaldır"
+
+#: sql_help.c:5532
+msgid "remove a foreign server descriptor"
+msgstr "foreign sunucu tanımını kaldır"
+
+#: sql_help.c:5538
+msgid "remove extended statistics"
+msgstr "genişletilmiş istatistikleri kaldır"
+
+#: sql_help.c:5544
+msgid "remove a subscription"
+msgstr "abonelik kaldır"
+
+#: sql_help.c:5550
+msgid "remove a table"
+msgstr "tablo kaldır"
+
+#: sql_help.c:5556
+msgid "remove a tablespace"
+msgstr "tablespace kaldır"
+
+#: sql_help.c:5562
+msgid "remove a text search configuration"
+msgstr "metin arama yapılandırmasını kaldır"
+
+#: sql_help.c:5568
+msgid "remove a text search dictionary"
+msgstr "biri metin arama sözlüğünü kaldır"
+
+#: sql_help.c:5574
+msgid "remove a text search parser"
+msgstr "bir metin arama ayrıştırıcısını kaldır"
+
+#: sql_help.c:5580
+msgid "remove a text search template"
+msgstr "bir metin arama şablonunu kaldır"
+
+#: sql_help.c:5586
+msgid "remove a transform"
+msgstr "dönüşüm (transform) kaldır"
+
+#: sql_help.c:5592
+msgid "remove a trigger"
+msgstr "trigger kaldır"
+
+#: sql_help.c:5598
+msgid "remove a data type"
+msgstr "veri tipi kaldır"
+
+#: sql_help.c:5610
+msgid "remove a user mapping for a foreign server"
+msgstr "bir foreign sunucu için kullanıcı haritalamasını kaldır"
+
+#: sql_help.c:5616
+msgid "remove a view"
+msgstr "view kaldır"
+
+#: sql_help.c:5628
+msgid "execute a prepared statement"
+msgstr "hazırlanmış komutu çalıştır"
+
+#: sql_help.c:5634
+msgid "show the execution plan of a statement"
+msgstr "sorgunun execution planını göster"
+
+#: sql_help.c:5640
+msgid "retrieve rows from a query using a cursor"
+msgstr "cursor kullanarak sorgunun sonucundan satırları getir"
+
+#: sql_help.c:5646
+msgid "define access privileges"
+msgstr "erişim haklarını tanımla"
+
+#: sql_help.c:5652
+msgid "import table definitions from a foreign server"
+msgstr "uzak sunucudan (foreign server) tablo tanımlarını al"
+
+#: sql_help.c:5658
+msgid "create new rows in a table"
+msgstr "tabloda yeni satırları ekliyor"
+
+#: sql_help.c:5664
+msgid "listen for a notification"
+msgstr "bildiri bekleme durumuna geç"
+
+#: sql_help.c:5670
+msgid "load a shared library file"
+msgstr "shared library dosyası yükle"
+
+#: sql_help.c:5676
+msgid "lock a table"
+msgstr "tabloyu kilitle"
+
+#: sql_help.c:5682
+msgid "position a cursor"
+msgstr "cursor'u yereÅŸtir"
+
+#: sql_help.c:5688
+msgid "generate a notification"
+msgstr "bildiri üret"
+
+#: sql_help.c:5694
+msgid "prepare a statement for execution"
+msgstr "çalıştırmak için sorguyu hazırla"
+
+#: sql_help.c:5700
+msgid "prepare the current transaction for two-phase commit"
+msgstr "geçerli transaction'u two-phase commit için hazırla"
+
+#: sql_help.c:5706
+msgid "change the ownership of database objects owned by a database role"
+msgstr "veritabanı rolünün sahip olduğu nesnelerinin sahipliğini değiştir"
+
+#: sql_help.c:5712
+msgid "replace the contents of a materialized view"
+msgstr "bir maddileştirilmiş görünümün (materialized view) içeriğini değiştir"
+
+#: sql_help.c:5718
+msgid "rebuild indexes"
+msgstr "indeksleri yeniden oluÅŸtur"
+
+#: sql_help.c:5724
+msgid "destroy a previously defined savepoint"
+msgstr "önceki tanımlanmış savepoint'i kaldır"
+
+#: sql_help.c:5730
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "çalıştırma zamanı parametresini öntanımlı değerine getir"
+
+#: sql_help.c:5736
+msgid "remove access privileges"
+msgstr "erişim hakkını kaldır"
+
+#: sql_help.c:5748
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "daha önce two-phase commit için hazırlanmış transaction'u iptal et"
+
+#: sql_help.c:5754
+msgid "roll back to a savepoint"
+msgstr "savepoint'a rollback"
+
+#: sql_help.c:5760
+msgid "define a new savepoint within the current transaction"
+msgstr "geerli transaction içinde savepoint tanımla"
+
+#: sql_help.c:5766
+msgid "define or change a security label applied to an object"
+msgstr "bir nesneye uygulanan güvenlik etiketini tanımla ya da değiştir"
+
+#: sql_help.c:5772 sql_help.c:5826 sql_help.c:5862
+msgid "retrieve rows from a table or view"
+msgstr "tablo ya da view'dan satırları getir"
+
+#: sql_help.c:5784
+msgid "change a run-time parameter"
+msgstr "çalışma zamanı parametresini değiştir"
+
+#: sql_help.c:5790
+msgid "set constraint check timing for the current transaction"
+msgstr "geçerli işlem (transaction) için kısıtlama doğrulama zamanlamasını belirle"
+
+#: sql_help.c:5796
+msgid "set the current user identifier of the current session"
+msgstr "geçerli oturumun geçerli kullanıcısını tanımla"
+
+#: sql_help.c:5802
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "ilk oturum ve geçerli oturum için kullanıcı tanımla"
+
+#: sql_help.c:5808
+msgid "set the characteristics of the current transaction"
+msgstr "geçerli transcation'ın karakteristiklerini ayarla"
+
+#: sql_help.c:5814
+msgid "show the value of a run-time parameter"
+msgstr "çalıştırma zaman parametresinın değerini göster"
+
+#: sql_help.c:5832
+msgid "empty a table or set of tables"
+msgstr "bir veya birden fazla tabloyu kısalt"
+
+#: sql_help.c:5838
+msgid "stop listening for a notification"
+msgstr "bildiriyi beklemeyi durdur"
+
+#: sql_help.c:5844
+msgid "update rows of a table"
+msgstr "tablodaki satırları güncelle"
+
+#: sql_help.c:5850
+msgid "garbage-collect and optionally analyze a database"
+msgstr "Veritabanındaki çöpleri-toparla ve veritabanını (tercihe başlı) analiz et"
+
+#: sql_help.c:5856
+msgid "compute a set of rows"
+msgstr "compute a set of rows"
+
+#: startup.c:216
+#, fuzzy, c-format
+#| msgid "%s: -1 can only be used in non-interactive mode\n"
+msgid "-1 can only be used in non-interactive mode"
+msgstr "%s: -1 sadece interaktif olmayan modda kullanılabilir\n"
+
+#: startup.c:303
+#, c-format
+msgid "could not connect to server: %s"
+msgstr "sunucuya bağlanamadı: %s"
+
+#: startup.c:331
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" log dosyası açılamadı: %m"
+
+#: startup.c:442
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"Yardım için \"help\" yazınız.\n"
+"\n"
+
+#: startup.c:592
+#, fuzzy, c-format
+#| msgid "%s: could not set printing parameter \"%s\"\n"
+msgid "could not set printing parameter \"%s\""
+msgstr "%s: \"%s\" yazdırma parametrlesi ayarlanamıyor\n"
+
+#: startup.c:697
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın.\n"
+
+#: startup.c:714
+#, fuzzy, c-format
+#| msgid "%s: warning: extra command-line argument \"%s\" ignored\n"
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "%s: uyarı: \"%s\" fazla argümanı atlanmıştır\n"
+
+#: startup.c:763
+#, fuzzy, c-format
+#| msgid "%s: could not find own program executable\n"
+msgid "could not find own program executable"
+msgstr "%s: çalıştırılabilir dosya bulunamadı\n"
+
+#: tab-complete.c:4380
+#, fuzzy, c-format
+#| msgid ""
+#| "tab completion query failed: %s\n"
+#| "Query was:\n"
+#| "%s\n"
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"sekme tamamlama sorgusu başarısız oldu: %s\n"
+"Sorgu ÅŸudur: \n"
+"%s\n"
+
+#: variables.c:141
+#, fuzzy, c-format
+#| msgid "unrecognized value \"%s\" for \"%s\": Boolean expected\n"
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "\"%2$s\" için tanınmayan değer \"%1$s\": Boolean bekleniyor\n"
+
+#: variables.c:178
+#, fuzzy, c-format
+#| msgid "invalid value \"%s\" for \"%s\": integer expected\n"
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%2$s\" için geçersiz değer \"%1$s\": tamsayı bekleniyor\n"
+
+#: variables.c:226
+#, fuzzy, c-format
+#| msgid "invalid variable name: \"%s\"\n"
+msgid "invalid variable name: \"%s\""
+msgstr "geçersiz değişken adı: \"%s\"\n"
+
+#: variables.c:395
+#, fuzzy, c-format
+#| msgid ""
+#| "unrecognized value \"%s\" for \"%s\"\n"
+#| "Available values are: %s.\n"
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%2$s\" için tanınmayan değer \"%1$s\"\n"
+"Mevcut deÄŸerler: %3$s.\n"
+
+#~ msgid "(binary compatible)"
+#~ msgstr "(ikili (binary) uyumlu)"
+
+#~ msgid "%s: Warning: The -u option is deprecated. Use -U.\n"
+#~ msgstr "%s: Uyarı: -u parametresi kullanımdan kalkmıştır. -U kullanın.\n"
+
+#~ msgid "ALTER VIEW name RENAME TO newname"
+#~ msgstr "ALTER VIEW view_adı RENAME TO yeni_ad"
+
+#~ msgid " \"%s\""
+#~ msgstr " \"%s\""
+
+#~ msgid "?%c? \"%s.%s\""
+#~ msgstr "?%c? \"%s.%s\""
+
+#~ msgid "Access privileges for database \"%s\""
+#~ msgstr "\"%s\" veritabanının erişim hakları"
+
+#~ msgid ""
+#~ "WARNING: You are connected to a server with major version %d.%d,\n"
+#~ "but your %s client is major version %d.%d. Some backslash commands,\n"
+#~ "such as \\d, might not work properly.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "UYARI: Üst sürümü %d.%d olan sunucuya bağlısınız,\n"
+#~ "ancak %s istemcinizin sürümü %d.%d. \\d gibi bazı backslash ile başlayan komutlar düzgün çalışmayabilir\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Welcome to %s %s, the PostgreSQL interactive terminal.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "PostgreSQL etkilişimli arayüzü %s %s.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "PostgreSQL etkilişimli arayüzü %s %s(server %s).\n"
+#~ "\n"
+
+#~ msgid "Copy, Large Object\n"
+#~ msgstr "Copy, Large Object\n"
+
+#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n"
+#~ msgstr " \\z [PATTERN] tablo, view, ve sequence erişim haklarını listele (\\dp ile aynı)\n"
+
+#~ msgid " \\l list all databases (add \"+\" for more detail)\n"
+#~ msgstr " \\l tüm veritabanlarını listele (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n"
+#~ msgstr " \\dT [PATTERN] veri tipleri listele (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n"
+#~ msgstr " \\dn [PATTERN] şemaları göster (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n"
+#~ msgstr " \\dFp [PATTERN] metin arama ayrıştırıcılarını listele (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n"
+#~ msgstr " \\dFd [PATTERN] metin arama sözlüklerini listele (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n"
+#~ msgstr " \\df [PATTERN] fonksiyonları göster (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n"
+#~ msgstr " \\db [PATTERN] tablespaceleri listele (daha fazla ayrıntı için \"+\" ekleyin)\n"
+
+#~ msgid ""
+#~ " \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n"
+#~ " list tables/indexes/sequences/views/system tables\n"
+#~ msgstr ""
+#~ " \\d{t|i|s|v|S} [PATTERN] (daha fazla ayrıntı için \"+\" ekleyin)\n"
+#~ " tablolar/indeksler/sequenceler/viewlar/system tablolarını listele\n"
+
+#~ msgid " -W force password prompt (should happen automatically)"
+#~ msgstr " -W şifre sorulmasını sağla (otomatik olarak olmalı)"
+
+#~ msgid ""
+#~ "\n"
+#~ "Connection options:"
+#~ msgstr ""
+#~ "\n"
+#~ "Bağlantı tercihleri:"
+
+#~ msgid " -t print rows only (-P tuples_only)"
+#~ msgstr " -t sadece satırları göster (-P tuples_only)"
+
+#~ msgid " --version output version information, then exit"
+#~ msgstr " --version sürüm bilgisini göster ve çık"
+
+#~ msgid " --help show this help, then exit"
+#~ msgstr " --help yardım metnini göster ve çık"
+
+#~ msgid " -1 (\"one\") execute command file as a single transaction"
+#~ msgstr " -1 (rakamla bir) komutu tek bir transaction olarak iÅŸle"
+
+#~ msgid "General options:"
+#~ msgstr "Genel tercihler:"
+
+#~ msgid "Usage:"
+#~ msgstr "Kullanımı:"
+
+#~ msgid "(1 row)"
+#~ msgid_plural "(%lu rows)"
+#~ msgstr[0] "(%lu satır)"
+#~ msgstr[1] "(1 satır)"
+
+#~ msgid " \"%s\" IN %s %s"
+#~ msgstr " \"%s\", %s %s içinde"
+
+#~ msgid ""
+#~ "VALUES ( expression [, ...] ) [, ...]\n"
+#~ " [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]\n"
+#~ " [ LIMIT { count | ALL } ]\n"
+#~ " [ OFFSET start [ ROW | ROWS ] ]\n"
+#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]"
+#~ msgstr ""
+#~ "VALUES ( expression [, ...] ) [, ...]\n"
+#~ " [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]\n"
+#~ " [ LIMIT { count | ALL } ]\n"
+#~ " [ OFFSET start [ ROW | ROWS ] ]\n"
+#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]"
+
+#~ msgid ""
+#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]\n"
+#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]"
+#~ msgstr ""
+#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]\n"
+#~ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]"
+
+#~ msgid ""
+#~ "UPDATE [ ONLY ] table [ [ AS ] alias ]\n"
+#~ " SET { column = { expression | DEFAULT } |\n"
+#~ " ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]\n"
+#~ " [ FROM fromlist ]\n"
+#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n"
+#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]"
+#~ msgstr ""
+#~ "UPDATE [ ONLY ] table [ [ AS ] alias ]\n"
+#~ " SET { column = { expression | DEFAULT } |\n"
+#~ " ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]\n"
+#~ " [ FROM fromlist ]\n"
+#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n"
+#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]"
+
+#~ msgid "UNLISTEN { name | * }"
+#~ msgstr "UNLISTEN { name | * }"
+
+#~ msgid ""
+#~ "TRUNCATE [ TABLE ] [ ONLY ] name [, ... ]\n"
+#~ " [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]"
+#~ msgstr ""
+#~ "TRUNCATE [ TABLE ] [ ONLY ] ad [, ... ]\n"
+#~ " [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]"
+
+#~ msgid ""
+#~ "START TRANSACTION [ transaction_mode [, ...] ]\n"
+#~ "\n"
+#~ "where transaction_mode is one of:\n"
+#~ "\n"
+#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+#~ " READ WRITE | READ ONLY"
+#~ msgstr ""
+#~ "START TRANSACTION [ transaction_mode [, ...] ]\n"
+#~ "\n"
+#~ "transaction_mode aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+#~ " READ WRITE | READ ONLY"
+
+#~ msgid ""
+#~ "SHOW name\n"
+#~ "SHOW ALL"
+#~ msgstr ""
+#~ "SHOW name\n"
+#~ "SHOW ALL"
+
+#~ msgid ""
+#~ "SET TRANSACTION transaction_mode [, ...]\n"
+#~ "SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]\n"
+#~ "\n"
+#~ "where transaction_mode is one of:\n"
+#~ "\n"
+#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+#~ " READ WRITE | READ ONLY"
+#~ msgstr ""
+#~ "SET TRANSACTION transaction_mode [, ...]\n"
+#~ "SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]\n"
+#~ "\n"
+#~ "transaction_mode aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+#~ " READ WRITE | READ ONLY"
+
+#~ msgid ""
+#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION username\n"
+#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT\n"
+#~ "RESET SESSION AUTHORIZATION"
+#~ msgstr ""
+#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION kullanıcı_adı\n"
+#~ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT\n"
+#~ "RESET SESSION AUTHORIZATION"
+
+#~ msgid ""
+#~ "SET [ SESSION | LOCAL ] ROLE rolename\n"
+#~ "SET [ SESSION | LOCAL ] ROLE NONE\n"
+#~ "RESET ROLE"
+#~ msgstr ""
+#~ "SET [ SESSION | LOCAL ] ROLE rol_adı\n"
+#~ "SET [ SESSION | LOCAL ] ROLE NONE\n"
+#~ "RESET ROLE"
+
+#~ msgid "SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }"
+#~ msgstr "SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }"
+
+#~ msgid ""
+#~ "SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }\n"
+#~ "SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }"
+#~ msgstr ""
+#~ "SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }\n"
+#~ "SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }"
+
+#~ msgid ""
+#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n"
+#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n"
+#~ " * | expression [ [ AS ] output_name ] [, ...]\n"
+#~ " INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table\n"
+#~ " [ FROM from_item [, ...] ]\n"
+#~ " [ WHERE condition ]\n"
+#~ " [ GROUP BY expression [, ...] ]\n"
+#~ " [ HAVING condition [, ...] ]\n"
+#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n"
+#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n"
+#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+#~ " [ LIMIT { count | ALL } ]\n"
+#~ " [ OFFSET start [ ROW | ROWS ] ]\n"
+#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n"
+#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]"
+#~ msgstr ""
+#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n"
+#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n"
+#~ " * | expression [ [ AS ] output_name ] [, ...]\n"
+#~ " INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table\n"
+#~ " [ FROM from_item [, ...] ]\n"
+#~ " [ WHERE condition ]\n"
+#~ " [ GROUP BY expression [, ...] ]\n"
+#~ " [ HAVING condition [, ...] ]\n"
+#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n"
+#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n"
+#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+#~ " [ LIMIT { count | ALL } ]\n"
+#~ " [ OFFSET start [ ROW | ROWS ] ]\n"
+#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n"
+#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]"
+
+#~ msgid ""
+#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n"
+#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n"
+#~ " * | expression [ [ AS ] output_name ] [, ...]\n"
+#~ " [ FROM from_item [, ...] ]\n"
+#~ " [ WHERE condition ]\n"
+#~ " [ GROUP BY expression [, ...] ]\n"
+#~ " [ HAVING condition [, ...] ]\n"
+#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n"
+#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n"
+#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+#~ " [ LIMIT { count | ALL } ]\n"
+#~ " [ OFFSET start [ ROW | ROWS ] ]\n"
+#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n"
+#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]\n"
+#~ "\n"
+#~ "where from_item can be one of:\n"
+#~ "\n"
+#~ " [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n"
+#~ " ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]\n"
+#~ " with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n"
+#~ " function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]\n"
+#~ " function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n"
+#~ " from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]\n"
+#~ "\n"
+#~ "and with_query is:\n"
+#~ "\n"
+#~ " with_query_name [ ( column_name [, ...] ) ] AS ( select )\n"
+#~ "\n"
+#~ "TABLE { [ ONLY ] table_name [ * ] | with_query_name }"
+#~ msgstr ""
+#~ "[ WITH [ RECURSIVE ] with_query [, ...] ]\n"
+#~ "SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]\n"
+#~ " * | expression [ [ AS ] output_name ] [, ...]\n"
+#~ " [ FROM from_item [, ...] ]\n"
+#~ " [ WHERE condition ]\n"
+#~ " [ GROUP BY expression [, ...] ]\n"
+#~ " [ HAVING condition [, ...] ]\n"
+#~ " [ WINDOW window_name AS ( window_definition ) [, ...] ]\n"
+#~ " [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]\n"
+#~ " [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+#~ " [ LIMIT { count | ALL } ]\n"
+#~ " [ OFFSET start [ ROW | ROWS ] ]\n"
+#~ " [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]\n"
+#~ " [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]\n"
+#~ "\n"
+#~ "where from_item can be one of:\n"
+#~ "\n"
+#~ " [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n"
+#~ " ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]\n"
+#~ " with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]\n"
+#~ " function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]\n"
+#~ " function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )\n"
+#~ " from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]\n"
+#~ "\n"
+#~ "and with_query is:\n"
+#~ "\n"
+#~ " with_query_name [ ( column_name [, ...] ) ] AS ( select )\n"
+#~ "\n"
+#~ "TABLE { [ ONLY ] table_name [ * ] | with_query_name }"
+
+#~ msgid "ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name"
+#~ msgstr "ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_adı"
+
+#~ msgid "ROLLBACK PREPARED transaction_id"
+#~ msgstr "ROLLBACK PREPARED transaction_id"
+
+#~ msgid "ROLLBACK [ WORK | TRANSACTION ]"
+#~ msgstr "ROLLBACK [ WORK | TRANSACTION ]"
+
+#~ msgid ""
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON [ TABLE ] tablename [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { SELECT | INSERT | UPDATE | REFERENCES } ( column [, ...] )\n"
+#~ " [,...] | ALL [ PRIVILEGES ] ( column [, ...] ) }\n"
+#~ " ON [ TABLE ] tablename [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { USAGE | SELECT | UPDATE }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SEQUENCE sequencename [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON DATABASE dbname [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN DATA WRAPPER fdwname [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN SERVER servername [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { EXECUTE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON LANGUAGE langname [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SCHEMA schemaname [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { CREATE | ALL [ PRIVILEGES ] }\n"
+#~ " ON TABLESPACE tablespacename [, ...]\n"
+#~ " FROM { [ GROUP ] rolename | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ ADMIN OPTION FOR ]\n"
+#~ " role [, ...] FROM rolename [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]"
+#~ msgstr ""
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON [ TABLE ] tablo adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { SELECT | INSERT | UPDATE | REFERENCES } ( kolon [, ...] )\n"
+#~ " [,...] | ALL [ PRIVILEGES ] ( kolon [, ...] ) }\n"
+#~ " ON [ TABLE ] tablo adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { USAGE | SELECT | UPDATE }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SEQUENCE sequence adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON DATABASE veritabanı adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN DATA WRAPPER fdw adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN SERVER sunucu adu [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { EXECUTE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FUNCTION fonksiyon adı ( [ [ argüman modu ] [ argüman adı ] argüman tipi [, ...] ] ) [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON LANGUAGE dil adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SCHEMA şema adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ GRANT OPTION FOR ]\n"
+#~ " { CREATE | ALL [ PRIVILEGES ] }\n"
+#~ " ON TABLESPACE tablespace adı [, ...]\n"
+#~ " FROM { [ GROUP ] rol adı | PUBLIC } [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]\n"
+#~ "\n"
+#~ "REVOKE [ ADMIN OPTION FOR ]\n"
+#~ " role [, ...] FROM rol adı [, ...]\n"
+#~ " [ CASCADE | RESTRICT ]"
+
+#~ msgid "RELEASE [ SAVEPOINT ] savepoint_name"
+#~ msgstr "RELEASE [ SAVEPOINT ] savepoint_adı"
+
+#~ msgid "REINDEX { INDEX | TABLE | DATABASE | SYSTEM } name [ FORCE ]"
+#~ msgstr "REINDEX { INDEX | TABLE | DATABASE | SYSTEM } adı [ FORCE ]"
+
+#~ msgid "REASSIGN OWNED BY old_role [, ...] TO new_role"
+#~ msgstr "REASSIGN OWNED BY eski_rol [, ...] TO yeni_rol"
+
+#~ msgid "PREPARE TRANSACTION transaction_id"
+#~ msgstr "PREPARE TRANSACTION transaction_id"
+
+#~ msgid "PREPARE name [ ( datatype [, ...] ) ] AS statement"
+#~ msgstr "PREPARE adı [ ( veri_tipi [, ...] ) ] AS ifade"
+
+#~ msgid "NOTIFY name"
+#~ msgstr "NOTIFY ad"
+
+#~ msgid "MOVE [ direction { FROM | IN } ] cursorname"
+#~ msgstr "MOVE [ direction { FROM | IN } ] cursor_adı"
+
+#~ msgid ""
+#~ "LOCK [ TABLE ] [ ONLY ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ]\n"
+#~ "\n"
+#~ "where lockmode is one of:\n"
+#~ "\n"
+#~ " ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE\n"
+#~ " | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE"
+#~ msgstr ""
+#~ "LOCK [ TABLE ] [ ONLY ] ad [, ...] [ IN kilit modu MODE ] [ NOWAIT ]\n"
+#~ "\n"
+#~ "kilit modu aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE\n"
+#~ " | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE"
+
+#~ msgid "LOAD 'filename'"
+#~ msgstr "LOAD 'dosya adı'"
+
+#~ msgid "LISTEN name"
+#~ msgstr "LISTEN ad"
+
+#~ msgid ""
+#~ "INSERT INTO table [ ( column [, ...] ) ]\n"
+#~ " { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }\n"
+#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]"
+#~ msgstr ""
+#~ "IINSERT INTO table [ ( column [, ...] ) ]\n"
+#~ " { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }\n"
+#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]"
+
+#~ msgid ""
+#~ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON [ TABLE ] tablename [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column [, ...] )\n"
+#~ " [,...] | ALL [ PRIVILEGES ] ( column [, ...] ) }\n"
+#~ " ON [ TABLE ] tablename [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { USAGE | SELECT | UPDATE }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SEQUENCE sequencename [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON DATABASE dbname [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN DATA WRAPPER fdwname [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN SERVER servername [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON LANGUAGE langname [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SCHEMA schemaname [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { CREATE | ALL [ PRIVILEGES ] }\n"
+#~ " ON TABLESPACE tablespacename [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT role [, ...] TO rolename [, ...] [ WITH ADMIN OPTION ]"
+#~ msgstr ""
+#~ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON [ TABLE ] tablo adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( kolon [, ...] )\n"
+#~ " [,...] | ALL [ PRIVILEGES ] ( kolon [, ...] ) }\n"
+#~ " ON [ TABLE ] tablo adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { USAGE | SELECT | UPDATE }\n"
+#~ " [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SEQUENCE sequence adı [, ...]\n"
+#~ " TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON DATABASE veritabanı adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN DATA WRAPPER fdw adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FOREIGN SERVER sunucu adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n"
+#~ " ON FUNCTION fonksiyon adı ( [ [ argüman modu ] [ argüman adı ] argüman tipi [, ...] ] ) [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+#~ " ON LANGUAGE dil adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }\n"
+#~ " ON SCHEMA şema adı [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT { CREATE | ALL [ PRIVILEGES ] }\n"
+#~ " ON TABLESPACE tablespacename [, ...]\n"
+#~ " TO { [ GROUP ] rol adı | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+#~ "\n"
+#~ "GRANT role [, ...] TO rol adı [, ...] [ WITH ADMIN OPTION ]"
+
+#~ msgid ""
+#~ "FETCH [ direction { FROM | IN } ] cursorname\n"
+#~ "\n"
+#~ "where direction can be empty or one of:\n"
+#~ "\n"
+#~ " NEXT\n"
+#~ " PRIOR\n"
+#~ " FIRST\n"
+#~ " LAST\n"
+#~ " ABSOLUTE count\n"
+#~ " RELATIVE count\n"
+#~ " count\n"
+#~ " ALL\n"
+#~ " FORWARD\n"
+#~ " FORWARD count\n"
+#~ " FORWARD ALL\n"
+#~ " BACKWARD\n"
+#~ " BACKWARD count\n"
+#~ " BACKWARD ALL"
+#~ msgstr ""
+#~ "FETCH [ direction { FROM | IN } ] cursorname\n"
+#~ "\n"
+#~ "direction boş ya da aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " NEXT\n"
+#~ " PRIOR\n"
+#~ " FIRST\n"
+#~ " LAST\n"
+#~ " ABSOLUTE count\n"
+#~ " RELATIVE count\n"
+#~ " count\n"
+#~ " ALL\n"
+#~ " FORWARD\n"
+#~ " FORWARD count\n"
+#~ " FORWARD ALL\n"
+#~ " BACKWARD\n"
+#~ " BACKWARD count\n"
+#~ " BACKWARD ALL"
+
+#~ msgid "EXPLAIN [ ANALYZE ] [ VERBOSE ] statement"
+#~ msgstr "EXPLAIN [ ANALYZE ] [ VERBOSE ] ifade"
+
+#~ msgid "EXECUTE name [ ( parameter [, ...] ) ]"
+#~ msgstr "EXECUTE adı [ ( parameter [, ...] ) ]"
+
+#~ msgid "END [ WORK | TRANSACTION ]"
+#~ msgstr "END [ WORK | TRANSACTION ]"
+
+#~ msgid "DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP VIEW [ IF EXISTS ] view_adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP USER MAPPING [ IF EXISTS ] FOR { username | USER | CURRENT_USER | PUBLIC } SERVER servername"
+#~ msgstr "DROP USER MAPPING [ IF EXISTS ] FOR { kullanıcı adı | USER | CURRENT_USER | PUBLIC } SERVER sunucu adı"
+
+#~ msgid "DROP USER [ IF EXISTS ] name [, ...]"
+#~ msgstr "DROP USER [ IF EXISTS ] name [, ...]"
+
+#~ msgid "DROP TYPE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TYPE [ IF EXISTS ] tip_adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP TRIGGER [ IF EXISTS ] name ON table [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TRIGGER [ IF EXISTS ] trigger_adı ON tablo_adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP TEXT SEARCH PARSER [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TEXT SEARCH PARSER [ IF EXISTS ] adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP TABLESPACE [ IF EXISTS ] tablespacename"
+#~ msgstr "DROP TABLESPACE [ IF EXISTS ] tablespace_adı"
+
+#~ msgid "DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP TABLE [ IF EXISTS ] tablo_adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP SERVER [ IF EXISTS ] servername [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP SERVER [ IF EXISTS ] sunucu adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP SEQUENCE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP SEQUENCE [ IF EXISTS ] sequence_adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP SCHEMA [ IF EXISTS ] şema_adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP RULE [ IF EXISTS ] name ON relation [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP RULE [ IF EXISTS ] rule_adı ON relation [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP ROLE [ IF EXISTS ] name [, ...]"
+#~ msgstr "DROP ROLE [ IF EXISTS ] name [, ...]"
+
+#~ msgid "DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP OPERATOR FAMILY [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP OPERATOR FAMILY [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP OPERATOR CLASS [ IF EXISTS ] name USING index_method [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP OPERATOR CLASS [ IF EXISTS ] ad USING index_method [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP OPERATOR [ IF EXISTS ] name ( { lefttype | NONE } , { righttype | NONE } ) [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP OPERATOR [ IF EXISTS ] name ( { lefttype | NONE } , { righttype | NONE } ) [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] dil_adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP INDEX [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP INDEX [ IF EXISTS ] index_adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP GROUP [ IF EXISTS ] name [, ...]"
+#~ msgstr "DROP GROUP [ IF EXISTS ] name [, ...]"
+
+#~ msgid ""
+#~ "DROP FUNCTION [ IF EXISTS ] name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " [ CASCADE | RESTRICT ]"
+#~ msgstr ""
+#~ "DROP FUNCTION [ IF EXISTS ] fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP FOREIGN DATA WRAPPER [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP FOREIGN DATA WRAPPER [ IF EXISTS ] ad [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP DOMAIN [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP DOMAIN [ IF EXISTS ] adı [, ...] [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP DATABASE [ IF EXISTS ] name"
+#~ msgstr "DROP DATABASE [ IF EXISTS ] veritabanı_adı"
+
+#~ msgid "DROP CONVERSION [ IF EXISTS ] name [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP CONVERSION [ IF EXISTS ] conversion_adı [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP CAST [ IF EXISTS ] (sourcetype AS targettype) [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP CAST [ IF EXISTS ] (sourcetype AS targettype) [ CASCADE | RESTRICT ]"
+
+#~ msgid "DROP AGGREGATE [ IF EXISTS ] name ( type [ , ... ] ) [ CASCADE | RESTRICT ]"
+#~ msgstr "DROP AGGREGATE [ IF EXISTS ] name ( type [ , ... ] ) [ CASCADE | RESTRICT ]"
+
+#~ msgid "DISCARD { ALL | PLANS | TEMPORARY | TEMP }"
+#~ msgstr "DISCARD { ALL | PLANS | TEMPORARY | TEMP }"
+
+#~ msgid ""
+#~ "DELETE FROM [ ONLY ] table [ [ AS ] alias ]\n"
+#~ " [ USING usinglist ]\n"
+#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n"
+#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]"
+#~ msgstr ""
+#~ "DELETE FROM [ ONLY ] tablo [ [ AS ] takma_adı ]\n"
+#~ " [ USING usinglist ]\n"
+#~ " [ WHERE condition | WHERE CURRENT OF cursor_name ]\n"
+#~ " [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]"
+
+#~ msgid ""
+#~ "DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]\n"
+#~ " CURSOR [ { WITH | WITHOUT } HOLD ] FOR query"
+#~ msgstr ""
+#~ "DECLARE ad [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]\n"
+#~ " CURSOR [ { WITH | WITHOUT } HOLD ] FOR sorgu"
+
+#~ msgid "DEALLOCATE [ PREPARE ] { name | ALL }"
+#~ msgstr "DEALLOCATE [ PREPARE ] { name | ALL }"
+
+#~ msgid ""
+#~ "CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]\n"
+#~ " AS query"
+#~ msgstr ""
+#~ "CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]\n"
+#~ " AS query"
+
+#~ msgid ""
+#~ "CREATE USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }\n"
+#~ " SERVER servername\n"
+#~ " [ OPTIONS ( option 'value' [ , ... ] ) ]"
+#~ msgstr ""
+#~ "CREATE USER MAPPING FOR { kullanıcı adı | USER | CURRENT_USER | PUBLIC }\n"
+#~ " SERVER sunucu adı\n"
+#~ " [ OPTIONS ( seçenek 'değer' [ , ... ] ) ]"
+
+#~ msgid ""
+#~ "CREATE USER name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "where option can be:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT connlimit\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ " | IN ROLE rolename [, ...]\n"
+#~ " | IN GROUP rolename [, ...]\n"
+#~ " | ROLE rolename [, ...]\n"
+#~ " | ADMIN rolename [, ...]\n"
+#~ " | USER rolename [, ...]\n"
+#~ " | SYSID uid"
+#~ msgstr ""
+#~ "CREATE USER name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "seçenek aşağıdakilerden birisi olabilir:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT connlimit\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ " | IN ROLE rolename [, ...]\n"
+#~ " | IN GROUP rolename [, ...]\n"
+#~ " | ROLE rolename [, ...]\n"
+#~ " | ADMIN rolename [, ...]\n"
+#~ " | USER rolename [, ...]\n"
+#~ " | SYSID uid"
+
+#~ msgid ""
+#~ "CREATE TYPE name AS\n"
+#~ " ( attribute_name data_type [, ... ] )\n"
+#~ "\n"
+#~ "CREATE TYPE name AS ENUM\n"
+#~ " ( 'label' [, ... ] )\n"
+#~ "\n"
+#~ "CREATE TYPE name (\n"
+#~ " INPUT = input_function,\n"
+#~ " OUTPUT = output_function\n"
+#~ " [ , RECEIVE = receive_function ]\n"
+#~ " [ , SEND = send_function ]\n"
+#~ " [ , TYPMOD_IN = type_modifier_input_function ]\n"
+#~ " [ , TYPMOD_OUT = type_modifier_output_function ]\n"
+#~ " [ , ANALYZE = analyze_function ]\n"
+#~ " [ , INTERNALLENGTH = { internallength | VARIABLE } ]\n"
+#~ " [ , PASSEDBYVALUE ]\n"
+#~ " [ , ALIGNMENT = alignment ]\n"
+#~ " [ , STORAGE = storage ]\n"
+#~ " [ , LIKE = like_type ]\n"
+#~ " [ , CATEGORY = category ]\n"
+#~ " [ , PREFERRED = preferred ]\n"
+#~ " [ , DEFAULT = default ]\n"
+#~ " [ , ELEMENT = element ]\n"
+#~ " [ , DELIMITER = delimiter ]\n"
+#~ ")\n"
+#~ "\n"
+#~ "CREATE TYPE name"
+#~ msgstr ""
+#~ "CREATE TYPE ad AS\n"
+#~ " ( attribute_name veri tipi [, ... ] )\n"
+#~ "\n"
+#~ "CREATE TYPE ad AS ENUM\n"
+#~ " ( 'label' [, ... ] )\n"
+#~ "\n"
+#~ "CREATE TYPE ad (\n"
+#~ " INPUT = input_function,\n"
+#~ " OUTPUT = output_function\n"
+#~ " [ , RECEIVE = receive_function ]\n"
+#~ " [ , SEND = send_function ]\n"
+#~ " [ , TYPMOD_IN = type_modifier_input_function ]\n"
+#~ " [ , TYPMOD_OUT = type_modifier_output_function ]\n"
+#~ " [ , ANALYZE = analyze_function ]\n"
+#~ " [ , INTERNALLENGTH = { internallength | VARIABLE } ]\n"
+#~ " [ , PASSEDBYVALUE ]\n"
+#~ " [ , ALIGNMENT = alignment ]\n"
+#~ " [ , STORAGE = storage ]\n"
+#~ " [ , LIKE = like_type ]\n"
+#~ " [ , CATEGORY = category ]\n"
+#~ " [ , PREFERRED = preferred ]\n"
+#~ " [ , DEFAULT = default ]\n"
+#~ " [ , ELEMENT = element ]\n"
+#~ " [ , DELIMITER = delimiter ]\n"
+#~ ")\n"
+#~ "\n"
+#~ "CREATE TYPE name"
+
+#~ msgid ""
+#~ "CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }\n"
+#~ " ON table [ FOR [ EACH ] { ROW | STATEMENT } ]\n"
+#~ " EXECUTE PROCEDURE funcname ( arguments )"
+#~ msgstr ""
+#~ "CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }\n"
+#~ " ON table [ FOR [ EACH ] { ROW | STATEMENT } ]\n"
+#~ " EXECUTE PROCEDURE funcname ( arguments )"
+
+#~ msgid ""
+#~ "CREATE TEXT SEARCH TEMPLATE name (\n"
+#~ " [ INIT = init_function , ]\n"
+#~ " LEXIZE = lexize_function\n"
+#~ ")"
+#~ msgstr ""
+#~ "CREATE TEXT SEARCH TEMPLATE ad (\n"
+#~ " [ INIT = init_function , ]\n"
+#~ " LEXIZE = lexize_function\n"
+#~ ")"
+
+#~ msgid ""
+#~ "CREATE TEXT SEARCH PARSER name (\n"
+#~ " START = start_function ,\n"
+#~ " GETTOKEN = gettoken_function ,\n"
+#~ " END = end_function ,\n"
+#~ " LEXTYPES = lextypes_function\n"
+#~ " [, HEADLINE = headline_function ]\n"
+#~ ")"
+#~ msgstr ""
+#~ "CREATE TEXT SEARCH PARSER name (\n"
+#~ " START = start_function ,\n"
+#~ " GETTOKEN = gettoken_function ,\n"
+#~ " END = end_function ,\n"
+#~ " LEXTYPES = lextypes_function\n"
+#~ " [, HEADLINE = headline_function ]\n"
+#~ ")"
+
+#~ msgid ""
+#~ "CREATE TEXT SEARCH DICTIONARY name (\n"
+#~ " TEMPLATE = template\n"
+#~ " [, option = value [, ... ]]\n"
+#~ ")"
+#~ msgstr ""
+#~ "CREATE TEXT SEARCH DICTIONARY ad (\n"
+#~ " TEMPLATE = ÅŸablon\n"
+#~ " [, option = value [, ... ]]\n"
+#~ ")"
+
+#~ msgid ""
+#~ "CREATE TEXT SEARCH CONFIGURATION name (\n"
+#~ " PARSER = parser_name |\n"
+#~ " COPY = source_config\n"
+#~ ")"
+#~ msgstr ""
+#~ "CREATE TEXT SEARCH CONFIGURATION name (\n"
+#~ " PARSER = parser_name |\n"
+#~ " COPY = source_config\n"
+#~ ")"
+
+#~ msgid "CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'"
+#~ msgstr "CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'"
+
+#~ msgid ""
+#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name\n"
+#~ " [ (column_name [, ...] ) ]\n"
+#~ " [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n"
+#~ " [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+#~ " [ TABLESPACE tablespace ]\n"
+#~ " AS query\n"
+#~ " [ WITH [ NO ] DATA ]"
+#~ msgstr ""
+#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE tablo adı\n"
+#~ " [ (kolon adı [, ...] ) ]\n"
+#~ " [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n"
+#~ " [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+#~ " [ TABLESPACE tablespace ]\n"
+#~ " AS sorgu\n"
+#~ " [ WITH [ NO ] DATA ]"
+
+#~ msgid ""
+#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [\n"
+#~ " { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]\n"
+#~ " | table_constraint\n"
+#~ " | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] ... }\n"
+#~ " [, ... ]\n"
+#~ "] )\n"
+#~ "[ INHERITS ( parent_table [, ... ] ) ]\n"
+#~ "[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n"
+#~ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+#~ "[ TABLESPACE tablespace ]\n"
+#~ "\n"
+#~ "where column_constraint is:\n"
+#~ "\n"
+#~ "[ CONSTRAINT constraint_name ]\n"
+#~ "{ NOT NULL | \n"
+#~ " NULL | \n"
+#~ " UNIQUE index_parameters |\n"
+#~ " PRIMARY KEY index_parameters |\n"
+#~ " CHECK ( expression ) |\n"
+#~ " REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n"
+#~ " [ ON DELETE action ] [ ON UPDATE action ] }\n"
+#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+#~ "\n"
+#~ "and table_constraint is:\n"
+#~ "\n"
+#~ "[ CONSTRAINT constraint_name ]\n"
+#~ "{ UNIQUE ( column_name [, ... ] ) index_parameters |\n"
+#~ " PRIMARY KEY ( column_name [, ... ] ) index_parameters |\n"
+#~ " CHECK ( expression ) |\n"
+#~ " FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]\n"
+#~ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }\n"
+#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+#~ "\n"
+#~ "index_parameters in UNIQUE and PRIMARY KEY constraints are:\n"
+#~ "\n"
+#~ "[ WITH ( storage_parameter [= value] [, ... ] ) ]\n"
+#~ "[ USING INDEX TABLESPACE tablespace ]"
+#~ msgstr ""
+#~ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE tablo_adı ( [\n"
+#~ " { kolon_adı veri_tipi [ DEFAULT default_expr ] [ kolon_kısıtlayıcısı [ ... ] ]\n"
+#~ " | tablo_kısıtlayıcısı\n"
+#~ " | LIKE parent_table [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] ... }\n"
+#~ " [, ... ]\n"
+#~ "] )\n"
+#~ "[ INHERITS ( parent_table [, ... ] ) ]\n"
+#~ "[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]\n"
+#~ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+#~ "[ TABLESPACE tablo_uzayı ]\n"
+#~ "\n"
+#~ "kolon_kısıtlayıcısı aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ "im[ CONSTRAINT constraint_name ]\n"
+#~ "{ NOT NULL | \n"
+#~ " NULL | \n"
+#~ " UNIQUE index_parametreleri |\n"
+#~ " PRIMARY KEY index_parametreleri |\n"
+#~ " CHECK ( ifade ) |\n"
+#~ " REFERENCES referans_tablosu [ ( referans_kolonu ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n"
+#~ " [ ON DELETE iÅŸlem ] [ ON UPDATE iÅŸlem ] }\n"
+#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+#~ "\n"
+#~ "ve tablo_kısıtlayıcısı aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ "[ CONSTRAINT constraint_name ]\n"
+#~ "{ UNIQUE ( column_name [, ... ] ) index_parameters |\n"
+#~ " PRIMARY KEY ( column_name [, ... ] ) index_parameters |\n"
+#~ " CHECK ( expression ) |\n"
+#~ " FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]\n"
+#~ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }\n"
+#~ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+#~ "\n"
+#~ "UNIQUE ve PRIMARY KEY kısıtlamalarındaki index parametreleri aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ "[ WITH ( storage_parameter [= value] [, ... ] ) ]\n"
+#~ "[ USING INDEX TABLESPACE tablo_uzayı ]"
+
+#~ msgid ""
+#~ "CREATE SERVER servername [ TYPE 'servertype' ] [ VERSION 'serverversion' ]\n"
+#~ " FOREIGN DATA WRAPPER fdwname\n"
+#~ " [ OPTIONS ( option 'value' [, ... ] ) ]"
+#~ msgstr ""
+#~ "CREATE SERVER sunucu adı [ TYPE 'sunucu tipi' ] [ VERSION 'sunucu sürümü' ]\n"
+#~ " FOREIGN DATA WRAPPER fdw adı\n"
+#~ " [ OPTIONS ( seçenek 'değer' [, ... ] ) ]"
+
+#~ msgid ""
+#~ "CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]\n"
+#~ " [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]\n"
+#~ " [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]\n"
+#~ " [ OWNED BY { table.column | NONE } ]"
+#~ msgstr ""
+#~ "CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]\n"
+#~ " [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]\n"
+#~ " [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]\n"
+#~ " [ OWNED BY { table.column | NONE } ]"
+
+#~ msgid ""
+#~ "CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]\n"
+#~ "CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]"
+#~ msgstr ""
+#~ "CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ TABLESPACE tablespace ] [ schema_element [ ... ] ]\n"
+#~ "CREATE SCHEMA AUTHORIZATION username [ TABLESPACE tablespace ] [ schema_element [ ... ] ]"
+
+#~ msgid ""
+#~ "CREATE [ OR REPLACE ] RULE name AS ON event\n"
+#~ " TO table [ WHERE condition ]\n"
+#~ " DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }"
+#~ msgstr ""
+#~ "CREATE [ OR REPLACE ] RULE name AS ON event\n"
+#~ " TO tablo_adı [ WHERE condition ]\n"
+#~ " DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }"
+
+#~ msgid ""
+#~ "CREATE ROLE name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "where option can be:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT connlimit\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ " | IN ROLE rolename [, ...]\n"
+#~ " | IN GROUP rolename [, ...]\n"
+#~ " | ROLE rolename [, ...]\n"
+#~ " | ADMIN rolename [, ...]\n"
+#~ " | USER rolename [, ...]\n"
+#~ " | SYSID uid"
+#~ msgstr ""
+#~ "CREATE ROLE name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "seçenek aşağıdakilerden birisi olabilir:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT connlimit\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ " | IN ROLE rolename [, ...]\n"
+#~ " | IN GROUP rolename [, ...]\n"
+#~ " | ROLE rolename [, ...]\n"
+#~ " | ADMIN rolename [, ...]\n"
+#~ " | USER rolename [, ...]\n"
+#~ " | SYSID uid"
+
+#~ msgid "CREATE OPERATOR FAMILY name USING index_method"
+#~ msgstr "CREATE OPERATOR FAMILY name USING index_method"
+
+#~ msgid ""
+#~ "CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type\n"
+#~ " USING index_method [ FAMILY family_name ] AS\n"
+#~ " { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ]\n"
+#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )\n"
+#~ " | STORAGE storage_type\n"
+#~ " } [, ... ]"
+#~ msgstr ""
+#~ "CREATE OPERATOR CLASS ad [ DEFAULT ] FOR TYPE veri tipi\n"
+#~ " USING index metodu [ FAMILY family_name ] AS\n"
+#~ " { OPERATOR strategy_number operatör adı [ ( op_type, op_type ) ]\n"
+#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] fonksiyon adı ( argument_type [, ...] )\n"
+#~ " | STORAGE storage_type\n"
+#~ " } [, ... ]"
+
+#~ msgid ""
+#~ "CREATE OPERATOR name (\n"
+#~ " PROCEDURE = funcname\n"
+#~ " [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]\n"
+#~ " [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]\n"
+#~ " [, RESTRICT = res_proc ] [, JOIN = join_proc ]\n"
+#~ " [, HASHES ] [, MERGES ]\n"
+#~ ")"
+#~ msgstr ""
+#~ "CREATE OPERATOR name (\n"
+#~ " PROCEDURE = funcname\n"
+#~ " [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]\n"
+#~ " [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]\n"
+#~ " [, RESTRICT = res_proc ] [, JOIN = join_proc ]\n"
+#~ " [, HASHES ] [, MERGES ]\n"
+#~ ")"
+
+#~ msgid ""
+#~ "CREATE [ PROCEDURAL ] LANGUAGE name\n"
+#~ "CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name\n"
+#~ " HANDLER call_handler [ VALIDATOR valfunction ]"
+#~ msgstr ""
+#~ "CREATE [ PROCEDURAL ] LANGUAGE name\n"
+#~ "CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name\n"
+#~ " HANDLER call_handler [ VALIDATOR valfunction ]"
+
+#~ msgid ""
+#~ "CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]\n"
+#~ " ( { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )\n"
+#~ " [ WITH ( storage_parameter = value [, ... ] ) ]\n"
+#~ " [ TABLESPACE tablespace ]\n"
+#~ " [ WHERE predicate ]"
+#~ msgstr ""
+#~ "CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ]\n"
+#~ " ( { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )\n"
+#~ " [ WITH ( storage_parameter = value [, ... ] ) ]\n"
+#~ " [ TABLESPACE tablespace ]\n"
+#~ " [ WHERE predicate ]"
+
+#~ msgid ""
+#~ "CREATE GROUP name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "where option can be:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ " | IN ROLE rolename [, ...]\n"
+#~ " | IN GROUP rolename [, ...]\n"
+#~ " | ROLE rolename [, ...]\n"
+#~ " | ADMIN rolename [, ...]\n"
+#~ " | USER rolename [, ...]\n"
+#~ " | SYSID uid"
+#~ msgstr ""
+#~ "CREATE GROUP name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "seçenek aşağıdakilerden birisi olabilir:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'ÅŸifre'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ " | IN ROLE rolename [, ...]\n"
+#~ " | IN GROUP rolename [, ...]\n"
+#~ " | ROLE rolename [, ...]\n"
+#~ " | ADMIN rolename [, ...]\n"
+#~ " | USER rolename [, ...]\n"
+#~ " | SYSID uid"
+
+#~ msgid ""
+#~ "CREATE [ OR REPLACE ] FUNCTION\n"
+#~ " name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } defexpr ] [, ...] ] )\n"
+#~ " [ RETURNS rettype\n"
+#~ " | RETURNS TABLE ( colname coltype [, ...] ) ]\n"
+#~ " { LANGUAGE langname\n"
+#~ " | WINDOW\n"
+#~ " | IMMUTABLE | STABLE | VOLATILE\n"
+#~ " | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n"
+#~ " | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+#~ " | COST execution_cost\n"
+#~ " | ROWS result_rows\n"
+#~ " | SET configuration_parameter { TO value | = value | FROM CURRENT }\n"
+#~ " | AS 'definition'\n"
+#~ " | AS 'obj_file', 'link_symbol'\n"
+#~ " } ...\n"
+#~ " [ WITH ( attribute [, ...] ) ]"
+#~ msgstr ""
+#~ "CREATE [ OR REPLACE ] FUNCTION\n"
+#~ " ad ( [ [ argüman modu ] [ argüman adı ] argüman tipi [ { DEFAULT | = } defexpr ] [, ...] ] )\n"
+#~ " [ RETURNS rettype\n"
+#~ " | RETURNS TABLE ( kolon_adı kolon_tipi [, ...] ) ]\n"
+#~ " { LANGUAGE dil adı\n"
+#~ " | WINDOW\n"
+#~ " | IMMUTABLE | STABLE | VOLATILE\n"
+#~ " | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n"
+#~ " | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+#~ " | COST execution_cost\n"
+#~ " | ROWS result_rows\n"
+#~ " | SET yapılandırma parametresi { TO değer | = değer | FROM CURRENT }\n"
+#~ " | AS 'tanım'\n"
+#~ " | AS 'obj_file', 'link_symbol'\n"
+#~ " } ...\n"
+#~ " [ WITH ( attribute [, ...] ) ]"
+
+#~ msgid ""
+#~ "CREATE FOREIGN DATA WRAPPER name\n"
+#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n"
+#~ " [ OPTIONS ( option 'value' [, ... ] ) ]"
+#~ msgstr ""
+#~ "CREATE FOREIGN DATA WRAPPER ad\n"
+#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n"
+#~ " [ OPTIONS ( option 'value' [, ... ] ) ]"
+
+#~ msgid ""
+#~ "CREATE DOMAIN name [ AS ] data_type\n"
+#~ " [ DEFAULT expression ]\n"
+#~ " [ constraint [ ... ] ]\n"
+#~ "\n"
+#~ "where constraint is:\n"
+#~ "\n"
+#~ "[ CONSTRAINT constraint_name ]\n"
+#~ "{ NOT NULL | NULL | CHECK (expression) }"
+#~ msgstr ""
+#~ "CREATE DOMAIN name [ AS ] data_type\n"
+#~ " [ DEFAULT expression ]\n"
+#~ " [ constraint [ ... ] ]\n"
+#~ "\n"
+#~ "constraint aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ "[ CONSTRAINT constraint_name ]\n"
+#~ "{ NOT NULL | NULL | CHECK (expression) }"
+
+#~ msgid ""
+#~ "CREATE DATABASE name\n"
+#~ " [ [ WITH ] [ OWNER [=] dbowner ]\n"
+#~ " [ TEMPLATE [=] template ]\n"
+#~ " [ ENCODING [=] encoding ]\n"
+#~ " [ LC_COLLATE [=] lc_collate ]\n"
+#~ " [ LC_CTYPE [=] lc_ctype ]\n"
+#~ " [ TABLESPACE [=] tablespace ]\n"
+#~ " [ CONNECTION LIMIT [=] connlimit ] ]"
+#~ msgstr ""
+#~ "CREATE DATABASE ad\n"
+#~ " [ [ WITH ] [ OWNER [=] veritabanı sahibi ]\n"
+#~ " [ TEMPLATE [=] ÅŸablon ]\n"
+#~ " [ ENCODING [=] dil kodlaması ]\n"
+#~ " [ LC_COLLATE [=] lc_collate ]\n"
+#~ " [ LC_CTYPE [=] lc_ctype ]\n"
+#~ " [ TABLESPACE [=] tablespace ]\n"
+#~ " [ CONNECTION LIMIT [=] bağlantı sınırı ] ]"
+
+#~ msgid ""
+#~ "CREATE [ DEFAULT ] CONVERSION name\n"
+#~ " FOR source_encoding TO dest_encoding FROM funcname"
+#~ msgstr ""
+#~ "CREATE [ DEFAULT ] CONVERSION name\n"
+#~ " FOR source_encoding TO dest_encoding FROM funcname"
+
+#~ msgid ""
+#~ "CREATE CONSTRAINT TRIGGER name\n"
+#~ " AFTER event [ OR ... ]\n"
+#~ " ON table_name\n"
+#~ " [ FROM referenced_table_name ]\n"
+#~ " { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }\n"
+#~ " FOR EACH ROW\n"
+#~ " EXECUTE PROCEDURE funcname ( arguments )"
+#~ msgstr ""
+#~ "CREATE CONSTRAINT TRIGGER name\n"
+#~ " AFTER event [ OR ... ]\n"
+#~ " ON table_name\n"
+#~ " [ FROM referenced_table_name ]\n"
+#~ " { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }\n"
+#~ " FOR EACH ROW\n"
+#~ " EXECUTE PROCEDURE funcname ( arguments )"
+
+#~ msgid ""
+#~ "CREATE CAST (sourcetype AS targettype)\n"
+#~ " WITH FUNCTION funcname (argtypes)\n"
+#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+#~ "\n"
+#~ "CREATE CAST (sourcetype AS targettype)\n"
+#~ " WITHOUT FUNCTION\n"
+#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+#~ "\n"
+#~ "CREATE CAST (sourcetype AS targettype)\n"
+#~ " WITH INOUT\n"
+#~ " [ AS ASSIGNMENT | AS IMPLICIT ]"
+#~ msgstr ""
+#~ "CREATE CAST (sourcetype AS targettype)\n"
+#~ " WITH FUNCTION funcname (argtypes)\n"
+#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+#~ "\n"
+#~ "CREATE CAST (sourcetype AS targettype)\n"
+#~ " WITHOUT FUNCTION\n"
+#~ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+#~ "\n"
+#~ "CREATE CAST (sourcetype AS targettype)\n"
+#~ " WITH INOUT\n"
+#~ " [ AS ASSIGNMENT | AS IMPLICIT ]"
+
+#~ msgid ""
+#~ "CREATE AGGREGATE name ( input_data_type [ , ... ] ) (\n"
+#~ " SFUNC = sfunc,\n"
+#~ " STYPE = state_data_type\n"
+#~ " [ , FINALFUNC = ffunc ]\n"
+#~ " [ , INITCOND = initial_condition ]\n"
+#~ " [ , SORTOP = sort_operator ]\n"
+#~ ")\n"
+#~ "\n"
+#~ "or the old syntax\n"
+#~ "\n"
+#~ "CREATE AGGREGATE name (\n"
+#~ " BASETYPE = base_type,\n"
+#~ " SFUNC = sfunc,\n"
+#~ " STYPE = state_data_type\n"
+#~ " [ , FINALFUNC = ffunc ]\n"
+#~ " [ , INITCOND = initial_condition ]\n"
+#~ " [ , SORTOP = sort_operator ]\n"
+#~ ")"
+#~ msgstr ""
+#~ "CREATE AGGREGATE name ( input_data_type [ , ... ] ) (\n"
+#~ " SFUNC = sfunc,\n"
+#~ " STYPE = state_data_type\n"
+#~ " [ , FINALFUNC = ffunc ]\n"
+#~ " [ , INITCOND = initial_condition ]\n"
+#~ " [ , SORTOP = sort_operator ]\n"
+#~ ")\n"
+#~ "\n"
+#~ "or the old syntax\n"
+#~ "\n"
+#~ "CREATE AGGREGATE name (\n"
+#~ " BASETYPE = base_type,\n"
+#~ " SFUNC = sfunc,\n"
+#~ " STYPE = state_data_type\n"
+#~ " [ , FINALFUNC = ffunc ]\n"
+#~ " [ , INITCOND = initial_condition ]\n"
+#~ " [ , SORTOP = sort_operator ]\n"
+#~ ")"
+
+#~ msgid ""
+#~ "COPY tablename [ ( column [, ...] ) ]\n"
+#~ " FROM { 'filename' | STDIN }\n"
+#~ " [ [ WITH ] \n"
+#~ " [ BINARY ]\n"
+#~ " [ OIDS ]\n"
+#~ " [ DELIMITER [ AS ] 'delimiter' ]\n"
+#~ " [ NULL [ AS ] 'null string' ]\n"
+#~ " [ CSV [ HEADER ]\n"
+#~ " [ QUOTE [ AS ] 'quote' ] \n"
+#~ " [ ESCAPE [ AS ] 'escape' ]\n"
+#~ " [ FORCE NOT NULL column [, ...] ]\n"
+#~ "\n"
+#~ "COPY { tablename [ ( column [, ...] ) ] | ( query ) }\n"
+#~ " TO { 'filename' | STDOUT }\n"
+#~ " [ [ WITH ] \n"
+#~ " [ BINARY ]\n"
+#~ " [ OIDS ]\n"
+#~ " [ DELIMITER [ AS ] 'delimiter' ]\n"
+#~ " [ NULL [ AS ] 'null string' ]\n"
+#~ " [ CSV [ HEADER ]\n"
+#~ " [ QUOTE [ AS ] 'quote' ] \n"
+#~ " [ ESCAPE [ AS ] 'escape' ]\n"
+#~ " [ FORCE QUOTE column [, ...] ]"
+#~ msgstr ""
+#~ "COPY tablo adı [ ( kolon [, ...] ) ]\n"
+#~ " FROM { 'dosya adı' | STDIN }\n"
+#~ " [ [ WITH ] \n"
+#~ " [ BINARY ]\n"
+#~ " [ OIDS ]\n"
+#~ " [ DELIMITER [ AS ] 'delimiter' ]\n"
+#~ " [ NULL [ AS ] 'null string' ]\n"
+#~ " [ CSV [ HEADER ]\n"
+#~ " [ QUOTE [ AS ] 'quote' ] \n"
+#~ " [ ESCAPE [ AS ] 'escape' ]\n"
+#~ " [ FORCE NOT NULL column [, ...] ]\n"
+#~ "\n"
+#~ "COPY { tablo adı [ ( kolon [, ...] ) ] | ( sorgu ) }\n"
+#~ " TO { 'dosya adı' | STDOUT }\n"
+#~ " [ [ WITH ] \n"
+#~ " [ BINARY ]\n"
+#~ " [ OIDS ]\n"
+#~ " [ DELIMITER [ AS ] 'delimiter' ]\n"
+#~ " [ NULL [ AS ] 'null string' ]\n"
+#~ " [ CSV [ HEADER ]\n"
+#~ " [ QUOTE [ AS ] 'quote' ] \n"
+#~ " [ ESCAPE [ AS ] 'escape' ]\n"
+#~ " [ FORCE QUOTE column [, ...] ]"
+
+#~ msgid "COMMIT PREPARED transaction_id"
+#~ msgstr "COMMIT PREPARED transaction_id"
+
+#~ msgid "COMMIT [ WORK | TRANSACTION ]"
+#~ msgstr "COMMIT [ WORK | TRANSACTION ]"
+
+#~ msgid ""
+#~ "COMMENT ON\n"
+#~ "{\n"
+#~ " TABLE object_name |\n"
+#~ " COLUMN table_name.column_name |\n"
+#~ " AGGREGATE agg_name (agg_type [, ...] ) |\n"
+#~ " CAST (sourcetype AS targettype) |\n"
+#~ " CONSTRAINT constraint_name ON table_name |\n"
+#~ " CONVERSION object_name |\n"
+#~ " DATABASE object_name |\n"
+#~ " DOMAIN object_name |\n"
+#~ " FUNCTION func_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |\n"
+#~ " INDEX object_name |\n"
+#~ " LARGE OBJECT large_object_oid |\n"
+#~ " OPERATOR op (leftoperand_type, rightoperand_type) |\n"
+#~ " OPERATOR CLASS object_name USING index_method |\n"
+#~ " OPERATOR FAMILY object_name USING index_method |\n"
+#~ " [ PROCEDURAL ] LANGUAGE object_name |\n"
+#~ " ROLE object_name |\n"
+#~ " RULE rule_name ON table_name |\n"
+#~ " SCHEMA object_name |\n"
+#~ " SEQUENCE object_name |\n"
+#~ " TABLESPACE object_name |\n"
+#~ " TEXT SEARCH CONFIGURATION object_name |\n"
+#~ " TEXT SEARCH DICTIONARY object_name |\n"
+#~ " TEXT SEARCH PARSER object_name |\n"
+#~ " TEXT SEARCH TEMPLATE object_name |\n"
+#~ " TRIGGER trigger_name ON table_name |\n"
+#~ " TYPE object_name |\n"
+#~ " VIEW object_name\n"
+#~ "} IS 'text'"
+#~ msgstr ""
+#~ "COMMENT ON\n"
+#~ "{\n"
+#~ " TABLE nesne_ado |\n"
+#~ " COLUMN tablo_adı.kolon_adı |\n"
+#~ " AGGREGATE agg_name (agg_type [, ...] ) |\n"
+#~ " CAST (sourcetype AS targettype) |\n"
+#~ " CONSTRAINT constraint_name ON table_name |\n"
+#~ " CONVERSION nesne_adı |\n"
+#~ " DATABASE nesne_adı |\n"
+#~ " DOMAIN nesne_adı |\n"
+#~ " FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |\n"
+#~ " INDEX nesne_adı |\n"
+#~ " LARGE OBJECT large_object_oid |\n"
+#~ " OPERATOR op (leftoperand_type, rightoperand_type) |\n"
+#~ " OPERATOR CLASS nesne_adı USING index_yöntemi |\n"
+#~ " OPERATOR FAMILY nesne_adı USING index_yöntemi |\n"
+#~ " [ PROCEDURAL ] LANGUAGE nesne_adı |\n"
+#~ " ROLE nesne_adı |\n"
+#~ " RULE kural_adı ON tablo_adı |\n"
+#~ " SCHEMA nesne_adı |\n"
+#~ " SEQUENCE nesne_adı |\n"
+#~ " TABLESPACE nesne_adı |\n"
+#~ " TEXT SEARCH CONFIGURATION nesne_adı |\n"
+#~ " TEXT SEARCH DICTIONARY nesne_adı |\n"
+#~ " TEXT SEARCH PARSER nesne_adı |\n"
+#~ " TEXT SEARCH TEMPLATE nesne_adı |\n"
+#~ " TRIGGER tetikleyici_adı ON table_name |\n"
+#~ " TYPE nesne_adı |\n"
+#~ " VIEW nesne_adı\n"
+#~ "} IS 'text'"
+
+#~ msgid ""
+#~ "CLUSTER [VERBOSE] tablename [ USING indexname ]\n"
+#~ "CLUSTER [VERBOSE]"
+#~ msgstr ""
+#~ "CLUSTER [VERBOSE] tablo adı [ USING index adı ]\n"
+#~ "CLUSTER [VERBOSE]"
+
+#~ msgid "CLOSE { name | ALL }"
+#~ msgstr "CLOSE { name | ALL }"
+
+#~ msgid "CHECKPOINT"
+#~ msgstr "CHECKPOINT"
+
+#~ msgid ""
+#~ "BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]\n"
+#~ "\n"
+#~ "where transaction_mode is one of:\n"
+#~ "\n"
+#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+#~ " READ WRITE | READ ONLY"
+#~ msgstr ""
+#~ "BEGIN [ WORK | TRANSACTION ] [ transaction_modu [, ...] ]\n"
+#~ "\n"
+#~ "transaction_modu aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+#~ " READ WRITE | READ ONLY"
+
+#~ msgid "ANALYZE [ VERBOSE ] [ table [ ( column [, ...] ) ] ]"
+#~ msgstr "ANALYZE [ VERBOSE ] [ tablo [ ( kolon [, ...] ) ] ]"
+
+#~ msgid ""
+#~ "ALTER VIEW name ALTER [ COLUMN ] column SET DEFAULT expression\n"
+#~ "ALTER VIEW name ALTER [ COLUMN ] column DROP DEFAULT\n"
+#~ "ALTER VIEW name OWNER TO new_owner\n"
+#~ "ALTER VIEW name RENAME TO new_name\n"
+#~ "ALTER VIEW name SET SCHEMA new_schema"
+#~ msgstr ""
+#~ "ALTER VIEW ad ALTER [ COLUMN ] kolon SET DEFAULT ifade\n"
+#~ "ALTER VIEW ad ALTER [ COLUMN ] kolon DROP DEFAULT\n"
+#~ "ALTER VIEW ad OWNER TO yeni sahibi\n"
+#~ "ALTER VIEW ad RENAME TO yeni adı\n"
+#~ "ALTER VIEW ad SET SCHEMA yeni ÅŸema"
+
+#~ msgid ""
+#~ "ALTER USER MAPPING FOR { username | USER | CURRENT_USER | PUBLIC }\n"
+#~ " SERVER servername\n"
+#~ " OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )"
+#~ msgstr ""
+#~ "ALTER USER MAPPING FOR { kullanıcı adı | USER | CURRENT_USER | PUBLIC }\n"
+#~ " SERVER sunucu adı\n"
+#~ " OPTIONS ( [ ADD | SET | DROP ] seçenek ['değer'] [, ... ] )"
+
+#~ msgid ""
+#~ "ALTER USER name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "where option can be:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT connlimit\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ "\n"
+#~ "ALTER USER name RENAME TO newname\n"
+#~ "\n"
+#~ "ALTER USER name SET configuration_parameter { TO | = } { value | DEFAULT }\n"
+#~ "ALTER USER name SET configuration_parameter FROM CURRENT\n"
+#~ "ALTER USER name RESET configuration_parameter\n"
+#~ "ALTER USER name RESET ALL"
+#~ msgstr ""
+#~ "ALTER USER kullanıcı_adı [ [ WITH ] seçenek [ ... ] ]\n"
+#~ "\n"
+#~ "seçenek aşağıdakilerden birisi olabilir:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT bağlantı_sayısı_sınırı\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ "\n"
+#~ "ALTER USER kullanıcı_adı RENAME TO yeni_adı\n"
+#~ "\n"
+#~ "ALTER USER kullanıcı_adı SET yapılandırma_parametresi { TO | = } { value | DEFAULT }\n"
+#~ "ALTER USER kullanıcı_adı SET yapılandırma_parametresi FROM CURRENT\n"
+#~ "ALTER USER kullanıcı_adı RESET yapılandırma_parametresi\n"
+#~ "ALTER USER kullanıcı_adı RESET ALL"
+
+#~ msgid ""
+#~ "ALTER TYPE name RENAME TO new_name\n"
+#~ "ALTER TYPE name OWNER TO new_owner \n"
+#~ "ALTER TYPE name SET SCHEMA new_schema"
+#~ msgstr ""
+#~ "ALTER TYPE ad RENAME TO yeni adı\n"
+#~ "ALTER TYPE ad OWNER TO yeni sahibi \n"
+#~ "ALTER TYPE ad SET SCHEMA yeni ÅŸema"
+
+#~ msgid "ALTER TRIGGER name ON table RENAME TO newname"
+#~ msgstr "ALTER TRIGGER trigger_adı ON tablo_adı RENAME TO yeni_ad"
+
+#~ msgid "ALTER TEXT SEARCH TEMPLATE name RENAME TO newname"
+#~ msgstr "ALTER TEXT SEARCH TEMPLATE şablon_adı RENAME TO yeni_adı"
+
+#~ msgid "ALTER TEXT SEARCH PARSER name RENAME TO newname"
+#~ msgstr "ALTER TEXT SEARCH PARSER ayrıştırıcı_adı RENAME TO yeni_adı"
+
+#~ msgid ""
+#~ "ALTER TEXT SEARCH DICTIONARY name (\n"
+#~ " option [ = value ] [, ... ]\n"
+#~ ")\n"
+#~ "ALTER TEXT SEARCH DICTIONARY name RENAME TO newname\n"
+#~ "ALTER TEXT SEARCH DICTIONARY name OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER TEXT SEARCH DICTIONARY ad (\n"
+#~ " option [ = value ] [, ... ]\n"
+#~ ")\n"
+#~ "ALTER TEXT SEARCH DICTIONARY ad RENAME TO yeni adı\n"
+#~ "ALTER TEXT SEARCH DICTIONARY ad OWNER TO yeni sahibi"
+
+#~ msgid ""
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ALTER MAPPING REPLACE old_dictionary WITH new_dictionary\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name RENAME TO newname\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ]\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ALTER MAPPING REPLACE old_dictionary WITH new_dictionary\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name\n"
+#~ " DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ]\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name RENAME TO newname\n"
+#~ "ALTER TEXT SEARCH CONFIGURATION name OWNER TO newowner"
+
+#~ msgid ""
+#~ "ALTER TABLESPACE name RENAME TO newname\n"
+#~ "ALTER TABLESPACE name OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER TABLESPACE tablespace_adı RENAME TO yeni_ad\n"
+#~ "ALTER TABLESPACE tablespace_adı OWNER TO yeni_sahip"
+
+#~ msgid ""
+#~ "ALTER TABLE [ ONLY ] name [ * ]\n"
+#~ " action [, ... ]\n"
+#~ "ALTER TABLE [ ONLY ] name [ * ]\n"
+#~ " RENAME [ COLUMN ] column TO new_column\n"
+#~ "ALTER TABLE name\n"
+#~ " RENAME TO new_name\n"
+#~ "ALTER TABLE name\n"
+#~ " SET SCHEMA new_schema\n"
+#~ "\n"
+#~ "where action is one of:\n"
+#~ "\n"
+#~ " ADD [ COLUMN ] column type [ column_constraint [ ... ] ]\n"
+#~ " DROP [ COLUMN ] column [ RESTRICT | CASCADE ]\n"
+#~ " ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ]\n"
+#~ " ALTER [ COLUMN ] column SET DEFAULT expression\n"
+#~ " ALTER [ COLUMN ] column DROP DEFAULT\n"
+#~ " ALTER [ COLUMN ] column { SET | DROP } NOT NULL\n"
+#~ " ALTER [ COLUMN ] column SET STATISTICS integer\n"
+#~ " ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n"
+#~ " ADD table_constraint\n"
+#~ " DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]\n"
+#~ " DISABLE TRIGGER [ trigger_name | ALL | USER ]\n"
+#~ " ENABLE TRIGGER [ trigger_name | ALL | USER ]\n"
+#~ " ENABLE REPLICA TRIGGER trigger_name\n"
+#~ " ENABLE ALWAYS TRIGGER trigger_name\n"
+#~ " DISABLE RULE rewrite_rule_name\n"
+#~ " ENABLE RULE rewrite_rule_name\n"
+#~ " ENABLE REPLICA RULE rewrite_rule_name\n"
+#~ " ENABLE ALWAYS RULE rewrite_rule_name\n"
+#~ " CLUSTER ON index_name\n"
+#~ " SET WITHOUT CLUSTER\n"
+#~ " SET WITH OIDS\n"
+#~ " SET WITHOUT OIDS\n"
+#~ " SET ( storage_parameter = value [, ... ] )\n"
+#~ " RESET ( storage_parameter [, ... ] )\n"
+#~ " INHERIT parent_table\n"
+#~ " NO INHERIT parent_table\n"
+#~ " OWNER TO new_owner\n"
+#~ " SET TABLESPACE new_tablespace"
+#~ msgstr ""
+#~ "ALTER TABLE [ ONLY ] ad [ * ]\n"
+#~ " action [, ... ]\n"
+#~ "ALTER TABLE [ ONLY ] ad [ * ]\n"
+#~ " RENAME [ COLUMN ] kolon TO yeni kolon\n"
+#~ "ALTER TABLE ad\n"
+#~ " RENAME TO yeni ad\n"
+#~ "ALTER TABLE ad\n"
+#~ " SET SCHEMA yeni ÅŸema\n"
+#~ "\n"
+#~ "action aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " ADD [ COLUMN ] kolon kolon_tipi [ kolon kısıtlaması [ ... ] ]\n"
+#~ " DROP [ COLUMN ] kolon [ RESTRICT | CASCADE ]\n"
+#~ " ALTER [ COLUMN ] kolon [ SET DATA ] TYPE type [ USING ifade ]\n"
+#~ " ALTER [ COLUMN ] kolon SET DEFAULT ifade\n"
+#~ " ALTER [ COLUMN ] kolon DROP DEFAULT\n"
+#~ " ALTER [ COLUMN ] kolon { SET | DROP } NOT NULL\n"
+#~ " ALTER [ COLUMN ] kolon SET STATISTICS tamsayı\n"
+#~ " ALTER [ COLUMN ] kolon SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n"
+#~ " ADD tablo kısıtlaması\n"
+#~ " DROP CONSTRAINT kısıtlama adı [ RESTRICT | CASCADE ]\n"
+#~ " DISABLE TRIGGER [ trigger adı | ALL | USER ]\n"
+#~ " ENABLE TRIGGER[ trigger adı | ALL | USER ]\n"
+#~ " ENABLE REPLICA TRIGGER trigger adı\n"
+#~ " ENABLE ALWAYS TRIGGER trigger adı\n"
+#~ " DISABLE RULE rewrite_rule_name\n"
+#~ " ENABLE RULE rewrite_rule_name\n"
+#~ " ENABLE REPLICA RULE rewrite_rule_name\n"
+#~ " ENABLE ALWAYS RULE rewrite_rule_name\n"
+#~ " CLUSTER ON index adı\n"
+#~ " SET WITHOUT CLUSTER\n"
+#~ " SET WITH OIDS\n"
+#~ " SET WITHOUT OIDS\n"
+#~ " SET ( storage_parameter = value [, ... ] )\n"
+#~ " RESET ( storage_parameter [, ... ] )\n"
+#~ " INHERIT üst tablo\n"
+#~ " NO INHERIT üst tablo\n"
+#~ " OWNER TO yeni sahibi\n"
+#~ " SET TABLESPACE yeni tablespace"
+
+#~ msgid ""
+#~ "ALTER SERVER servername [ VERSION 'newversion' ]\n"
+#~ " [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] ) ]\n"
+#~ "ALTER SERVER servername OWNER TO new_owner"
+#~ msgstr ""
+#~ "ALTER SERVER sunucu adı [ VERSION 'yeni sürüm' ]\n"
+#~ " [ OPTIONS ( [ ADD | SET | DROP ] seçenek ['değer'] [, ... ] ) ]\n"
+#~ "ALTER SERVER sunucu adı OWNER TO yeni sahibi"
+
+#~ msgid ""
+#~ "ALTER SEQUENCE name [ INCREMENT [ BY ] increment ]\n"
+#~ " [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]\n"
+#~ " [ START [ WITH ] start ]\n"
+#~ " [ RESTART [ [ WITH ] restart ] ]\n"
+#~ " [ CACHE cache ] [ [ NO ] CYCLE ]\n"
+#~ " [ OWNED BY { table.column | NONE } ]\n"
+#~ "ALTER SEQUENCE name OWNER TO new_owner\n"
+#~ "ALTER SEQUENCE name RENAME TO new_name\n"
+#~ "ALTER SEQUENCE name SET SCHEMA new_schema"
+#~ msgstr ""
+#~ "ALTER SEQUENCE ad [ INCREMENT [ BY ] arttırma miktarı ]\n"
+#~ " [ MINVALUE en az değer | NO MINVALUE ] [ MAXVALUE üst değer | NO MAXVALUE ]\n"
+#~ " [ START [ WITH ] başlama sayısı ]\n"
+#~ " [ RESTART [ [ WITH ] yeniden başlama sayısı ] ]\n"
+#~ " [ CACHE önbellek ] [ [ NO ] CYCLE ]\n"
+#~ " [ OWNED BY { tablo.kolon | NONE } ]\n"
+#~ "ALTER SEQUENCE ad OWNER TO yeni sahibir\n"
+#~ "ALTER SEQUENCE ad RENAME TO yeni adı\n"
+#~ "ALTER SEQUENCE namade SET SCHEMA yeni şeması"
+
+#~ msgid ""
+#~ "ALTER SCHEMA name RENAME TO newname\n"
+#~ "ALTER SCHEMA name OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER SCHEMA şema_adı RENAME TO yeni_ad\n"
+#~ "ALTER SCHEMA şema_adı OWNER TO yeni_sahip"
+
+#~ msgid ""
+#~ "ALTER ROLE name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "where option can be:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT connlimit\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ "\n"
+#~ "ALTER ROLE name RENAME TO newname\n"
+#~ "\n"
+#~ "ALTER ROLE name SET configuration_parameter { TO | = } { value | DEFAULT }\n"
+#~ "ALTER ROLE name SET configuration_parameter FROM CURRENT\n"
+#~ "ALTER ROLE name RESET configuration_parameter\n"
+#~ "ALTER ROLE name RESET ALL"
+#~ msgstr ""
+#~ "ALTER ROLE rol_adı [ [ WITH ] seçenek [ ... ] ]\n"
+#~ "\n"
+#~ "seçenek aşağıdakilerden birisi olabilir:\n"
+#~ " \n"
+#~ " SUPERUSER | NOSUPERUSER\n"
+#~ " | CREATEDB | NOCREATEDB\n"
+#~ " | CREATEROLE | NOCREATEROLE\n"
+#~ " | CREATEUSER | NOCREATEUSER\n"
+#~ " | INHERIT | NOINHERIT\n"
+#~ " | LOGIN | NOLOGIN\n"
+#~ " | CONNECTION LIMIT bağlantı_sayısı_sınırı\n"
+#~ " | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'\n"
+#~ " | VALID UNTIL 'timestamp' \n"
+#~ "\n"
+#~ "ALTER ROLE rol_adı RENAME TO yeni_adı\n"
+#~ "\n"
+#~ "ALTER ROLE rol_adı SET yapılandırma_parametresi { TO | = } { value | DEFAULT }\n"
+#~ "ALTER ROLE rol_adı SET yapılandırma_parametresi FROM CURRENT\n"
+#~ "ALTER ROLE rol_adı RESET yapılandırma_parametresi\n"
+#~ "ALTER ROLE rol_adı RESET ALL"
+
+#~ msgid ""
+#~ "ALTER OPERATOR FAMILY name USING index_method ADD\n"
+#~ " { OPERATOR strategy_number operator_name ( op_type, op_type )\n"
+#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )\n"
+#~ " } [, ... ]\n"
+#~ "ALTER OPERATOR FAMILY name USING index_method DROP\n"
+#~ " { OPERATOR strategy_number ( op_type [ , op_type ] )\n"
+#~ " | FUNCTION support_number ( op_type [ , op_type ] )\n"
+#~ " } [, ... ]\n"
+#~ "ALTER OPERATOR FAMILY name USING index_method RENAME TO newname\n"
+#~ "ALTER OPERATOR FAMILY name USING index_method OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER OPERATOR FAMILY adı USING index_methodu ADD\n"
+#~ " { OPERATOR strategy_number operator_name ( op_type, op_type )\n"
+#~ " | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )\n"
+#~ " } [, ... ]\n"
+#~ "ALTER OPERATOR FAMILY ad USING index_methodu DROP\n"
+#~ " { OPERATOR strategy_number ( op_type [ , op_type ] )\n"
+#~ " | FUNCTION support_number ( op_type [ , op_type ] )\n"
+#~ " } [, ... ]\n"
+#~ "ALTER OPERATOR FAMILY ad USING index_methodu RENAME TO yeni ad\n"
+#~ "ALTER OPERATOR FAMILY ad USING index_methodu OWNER TO yeni sahibi"
+
+#~ msgid ""
+#~ "ALTER OPERATOR CLASS name USING index_method RENAME TO newname\n"
+#~ "ALTER OPERATOR CLASS name USING index_method OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER OPERATOR CLASS ad USING index_method RENAME TO yeni_ad\n"
+#~ "ALTER OPERATOR CLASS ad USING index_method OWNER TO yeni_sahip"
+
+#~ msgid "ALTER OPERATOR name ( { lefttype | NONE } , { righttype | NONE } ) OWNER TO newowner"
+#~ msgstr "ALTER OPERATOR name ( { lefttype | NONE } , { righttype | NONE } ) OWNER TO yeni_sahip"
+
+#~ msgid ""
+#~ "ALTER [ PROCEDURAL ] LANGUAGE name RENAME TO newname\n"
+#~ "ALTER [ PROCEDURAL ] LANGUAGE name OWNER TO new_owner"
+#~ msgstr ""
+#~ "ALTER [ PROCEDURAL ] LANGUAGE name RENAME TO newname\n"
+#~ "ALTER [ PROCEDURAL ] LANGUAGE name OWNER TO new_owner"
+
+#~ msgid ""
+#~ "ALTER INDEX name RENAME TO new_name\n"
+#~ "ALTER INDEX name SET TABLESPACE tablespace_name\n"
+#~ "ALTER INDEX name SET ( storage_parameter = value [, ... ] )\n"
+#~ "ALTER INDEX name RESET ( storage_parameter [, ... ] )"
+#~ msgstr ""
+#~ "ALTER INDEX name RENAME TO new_name\n"
+#~ "ALTER INDEX name SET TABLESPACE tablespace_name\n"
+#~ "ALTER INDEX name SET ( storage_parameter = value [, ... ] )\n"
+#~ "ALTER INDEX name RESET ( storage_parameter [, ... ] )"
+
+#~ msgid ""
+#~ "ALTER GROUP groupname ADD USER username [, ... ]\n"
+#~ "ALTER GROUP groupname DROP USER username [, ... ]\n"
+#~ "\n"
+#~ "ALTER GROUP groupname RENAME TO newname"
+#~ msgstr ""
+#~ "ALTER GROUP grup_adı ADD USER kullanıcı_adı [, ... ]\n"
+#~ "ALTER GROUP grup_adı DROP USER kullanıcı_adı [, ... ]\n"
+#~ "\n"
+#~ "ALTER GROUP grup_adı RENAME TO yeni_ad"
+
+#~ msgid ""
+#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " action [ ... ] [ RESTRICT ]\n"
+#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " RENAME TO new_name\n"
+#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " OWNER TO new_owner\n"
+#~ "ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " SET SCHEMA new_schema\n"
+#~ "\n"
+#~ "where action is one of:\n"
+#~ "\n"
+#~ " CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n"
+#~ " IMMUTABLE | STABLE | VOLATILE\n"
+#~ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+#~ " COST execution_cost\n"
+#~ " ROWS result_rows\n"
+#~ " SET configuration_parameter { TO | = } { value | DEFAULT }\n"
+#~ " SET configuration_parameter FROM CURRENT\n"
+#~ " RESET configuration_parameter\n"
+#~ " RESET ALL"
+#~ msgstr ""
+#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " iÅŸlem [ ... ] [ RESTRICT ]\n"
+#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " RENAME TO yeni_adı\n"
+#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " OWNER TO yeni_sahibi\n"
+#~ "ALTER FUNCTION fonksiyon_adı ( [ [ argmode ] [ argname ] argtype [, ...] ] )\n"
+#~ " SET SCHEMA yeni_ÅŸema\n"
+#~ "\n"
+#~ "işlem aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n"
+#~ " IMMUTABLE | STABLE | VOLATILE\n"
+#~ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+#~ " COST çalıştırma_maliyeti(execution cost)\n"
+#~ " ROWS result_rows\n"
+#~ " SET yapılandırma_parametresi { TO | = } { value | DEFAULT }\n"
+#~ " SET yapılandırma_parametresi FROM CURRENT\n"
+#~ " RESET yapılandırma_parametresi\n"
+#~ " RESET ALL"
+
+#~ msgid ""
+#~ "ALTER FOREIGN DATA WRAPPER name\n"
+#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n"
+#~ " [ OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ]) ]\n"
+#~ "ALTER FOREIGN DATA WRAPPER name OWNER TO new_owner"
+#~ msgstr ""
+#~ "ALTER FOREIGN DATA WRAPPER ad\n"
+#~ " [ VALIDATOR valfunction | NO VALIDATOR ]\n"
+#~ " [ SEÇENEKLER ( [ ADD | SET | DROP ] seçenek ['değer'] [, ... ]) ]\n"
+#~ "ALTER FOREIGN DATA WRAPPER ad OWNER TO yeni sahibi"
+
+#~ msgid ""
+#~ "ALTER DOMAIN name\n"
+#~ " { SET DEFAULT expression | DROP DEFAULT }\n"
+#~ "ALTER DOMAIN name\n"
+#~ " { SET | DROP } NOT NULL\n"
+#~ "ALTER DOMAIN name\n"
+#~ " ADD domain_constraint\n"
+#~ "ALTER DOMAIN name\n"
+#~ " DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]\n"
+#~ "ALTER DOMAIN name\n"
+#~ " OWNER TO new_owner \n"
+#~ "ALTER DOMAIN name\n"
+#~ " SET SCHEMA new_schema"
+#~ msgstr ""
+#~ "ALTER DOMAIN name\n"
+#~ " { SET DEFAULT expression | DROP DEFAULT }\n"
+#~ "ALTER DOMAIN name\n"
+#~ " { SET | DROP } NOT NULL\n"
+#~ "ALTER DOMAIN name\n"
+#~ " ADD domain_constraint\n"
+#~ "ALTER DOMAIN name\n"
+#~ " DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]\n"
+#~ "ALTER DOMAIN name\n"
+#~ " OWNER TO new_owner \n"
+#~ "ALTER DOMAIN name\n"
+#~ " SET SCHEMA new_schema"
+
+#~ msgid ""
+#~ "ALTER DATABASE name [ [ WITH ] option [ ... ] ]\n"
+#~ "\n"
+#~ "where option can be:\n"
+#~ "\n"
+#~ " CONNECTION LIMIT connlimit\n"
+#~ "\n"
+#~ "ALTER DATABASE name RENAME TO newname\n"
+#~ "\n"
+#~ "ALTER DATABASE name OWNER TO new_owner\n"
+#~ "\n"
+#~ "ALTER DATABASE name SET TABLESPACE new_tablespace\n"
+#~ "\n"
+#~ "ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }\n"
+#~ "ALTER DATABASE name SET configuration_parameter FROM CURRENT\n"
+#~ "ALTER DATABASE name RESET configuration_parameter\n"
+#~ "ALTER DATABASE name RESET ALL"
+#~ msgstr ""
+#~ "ALTER DATABASE veritabanı_adı [ [ WITH ] seçenek [ ... ] ]\n"
+#~ "\n"
+#~ "seçenek aşağıdakilerden birisi olabilir:\n"
+#~ "\n"
+#~ " CONNECTION LIMIT bağlantı limiti\n"
+#~ "\n"
+#~ "ALTER DATABASE veritabanı_adı RENAME TO yeni_adı\n"
+#~ "\n"
+#~ "ALTER DATABASE veritabanı_adı OWNER TO yeni_sahibi\n"
+#~ "\n"
+#~ "ALTER DATABASE veritabanı_adı SET yapılandırma_parametresi { TO | = } { değer | DEFAULT }\n"
+#~ "ALTER DATABASE veritabanı_adı SET yapılandırma_parametresi FROM CURRENT\n"
+#~ "ALTER DATABASE veritabanı_adı RESET yapılandırma_parametresi\n"
+#~ "ALTER DATABASE veritabanı_adı RESET ALL"
+
+#~ msgid ""
+#~ "ALTER CONVERSION name RENAME TO newname\n"
+#~ "ALTER CONVERSION name OWNER TO newowner"
+#~ msgstr ""
+#~ "ALTER CONVERSION dönüşüm_adı RENAME TO yeni_ad\n"
+#~ "ALTER CONVERSION dönüşüm_adı OWNER TO yeni_sahip"
+
+#~ msgid ""
+#~ "ALTER AGGREGATE name ( type [ , ... ] ) RENAME TO new_name\n"
+#~ "ALTER AGGREGATE name ( type [ , ... ] ) OWNER TO new_owner\n"
+#~ "ALTER AGGREGATE name ( type [ , ... ] ) SET SCHEMA new_schema"
+#~ msgstr ""
+#~ "ALTER AGGREGATE name ( type [ , ... ] ) RENAME TO new_name\n"
+#~ "ALTER AGGREGATE name ( type [ , ... ] ) OWNER TO new_owner\n"
+#~ "ALTER AGGREGATE name ( type [ , ... ] ) SET SCHEMA new_schema"
+
+#~ msgid "ABORT [ WORK | TRANSACTION ]"
+#~ msgstr "ABORT [ WORK | TRANSACTION ]"
+
+#~ msgid "define a new constraint trigger"
+#~ msgstr "yeni constraint trigger tanımla"
+
+#~ msgid "data type"
+#~ msgstr "veri tipi"
+
+#~ msgid " as user \"%s\""
+#~ msgstr " \"%s\" kullanıcısı"
+
+#~ msgid " at port \"%s\""
+#~ msgstr " \"%s\" portunda"
+
+#~ msgid " on host \"%s\""
+#~ msgstr " \"%s\" sistemi"
+
+#~ msgid "\\%s: error\n"
+#~ msgstr "\\%s: hata\n"
+
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi"
+
+#, fuzzy
+#~ msgid "attribute"
+#~ msgstr "Özellikler"
+
+#, fuzzy
+#~ msgid "tablespace"
+#~ msgstr "Tablespace"
+
+#, fuzzy
+#~ msgid "input_data_type"
+#~ msgstr "veri tipi"
+
+#~ msgid "new_column"
+#~ msgstr "yeni_kolon"
+
+#~ msgid "column"
+#~ msgstr "kolon"
+
+#, fuzzy
+#~ msgid "agg_type"
+#~ msgstr "Hedef tipi"
+
+#, fuzzy
+#~ msgid "Object Description"
+#~ msgstr "Nesne açıklamaları"
+
+#~ msgid "Modifier"
+#~ msgstr "Düzenleyici"
+
+#~ msgid "No relations found.\n"
+#~ msgstr "Nesne bulunamadı.\n"
+
+#~ msgid "No matching relations found.\n"
+#~ msgstr "Eşleşen nesne bulunamadı.\n"
+
+#, fuzzy
+#~ msgid "No settings found.\n"
+#~ msgstr "Nesne bulunamadı.\n"
+
+#, fuzzy
+#~ msgid "No matching settings found.\n"
+#~ msgstr "Eşleşen nesne bulunamadı.\n"
+
+#~ msgid "default %s"
+#~ msgstr "öntanımlı %s"
+
+#~ msgid "not null"
+#~ msgstr "Null deÄŸil"
+
+#~ msgid "Value"
+#~ msgstr "DeÄŸer"
+
+#~ msgid "Modifiers"
+#~ msgstr "Modifiers"
+
+#~ msgid "normal"
+#~ msgstr "normal"
+
+#~ msgid "contains support for command-line editing"
+#~ msgstr "komut satırı düzenleme desteği mevcuttur"
+
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: \"%s\" değişkeni atanamıyor\n"
+
+#~ msgid "(No rows)\n"
+#~ msgstr "(Satır yok)\n"
+
+#~ msgid ""
+#~ " \\pset NAME [VALUE] set table output option\n"
+#~ " (NAME := {format|border|expanded|fieldsep|footer|null|\n"
+#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n"
+#~ msgstr ""
+#~ " \\pset AD [VALUE] tablo çıktısı biçimini ayarla\n"
+#~ " (AD := {format|border|expanded|fieldsep|footer|null|\n"
+#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n"
+
+#~ msgid " \\l[+] list all databases\n"
+#~ msgstr " \\l[+] tüm tablespaceleri listele\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini gösterir ve çıkar\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı gösterir ve çıkar\n"
+
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "geçerli kullanıcı adı alınamadı: %s\n"
+
+#~ msgid "\\copy: unexpected response (%d)\n"
+#~ msgstr "\\copy: beklenmeyen yanıt (%d)\n"
+
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy: %s"
+
+#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "%s: pg_strdup: null pointer duplicate edilemiyor (iç hata)\n"
+
+#~ msgid "Showing only tuples."
+#~ msgstr "Sadece kayıtlar gösteriliyor."
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "Yerel duyarlı sayısal çıktı gösteriliyor."
+
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "SSL bağlantısı (bilinmeyen cipher)\n"
+
+#, fuzzy
+#~ msgid "\\%s: error while setting variable\n"
+#~ msgstr "%s: \"%s\" değişkeni atanamıyor\n"
+
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "Parola şifrleme hatası.\n"
+
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: \"%s\" kayıti dosyası açılamıyor: %s\n"
+
+#~ msgid "string_literal"
+#~ msgstr "dizgi_sabiti"
+
+#~ msgid "unterminated quoted string\n"
+#~ msgstr "sonuçlandırılmamış tırnakla sınırlandırılmış dizgi\n"
+
+#~ msgid "could not read from input file: %s\n"
+#~ msgstr "girdi dosyasından okunamadı: %s\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@postgresql.org>.\n"
+#~ msgstr "Hataları <pgsql-bugs@postgresql.org> adresine bildirebilirsiniz.\n"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "Procedure"
+#~ msgstr "Prosedür"
+
+#~ msgid "could not close pipe to external command: %s\n"
+#~ msgstr "dış komuta doğru olan pipe kapatılamadı: %s\n"
+
+#~ msgid "could not stat file \"%s\": %s\n"
+#~ msgstr "\"%s\" dosyasının durumu görüntülenemedi (stat): %s\n"
+
+#~ msgid "could not execute command \"%s\": %s\n"
+#~ msgstr "\"%s\" komutu yürütülemedi: %s\n"
+
+#~ msgid "could not parse reloptions array\n"
+#~ msgstr "reloptions dizisi (array) ayrıştırılamadı\n"
+
+#~ msgid "could not open temporary file \"%s\": %s\n"
+#~ msgstr "\"%s\" geçici dosya açılamıyor: %s\n"
+
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "Geçersiz komut \\%s. Yardım için \\? yazınız.\n"
+
+#~ msgid "child process was terminated by signal %d"
+#~ msgstr "alt süreç %d sinyali tarafından sonlandırılmıştır"
+
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "alt süreç %s sinyali tarafından sonlandırılmıştır"
+
+#~ msgid "pclose failed: %s"
+#~ msgstr "pclose başarısız oldu: %s"
+
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "sembolik link \"%s\" okuma hatası"
+
+#~ msgid "could not change directory to \"%s\": %s"
+#~ msgstr "çalışma dizini \"%s\" olarak değiştirilemedi: %s"
+
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "geçerli dizin tespit edilemedi: %s"
diff --git a/src/bin/psql/po/uk.po b/src/bin/psql/po/uk.po
new file mode 100644
index 0000000..3d8898f
--- /dev/null
+++ b/src/bin/psql/po/uk.po
@@ -0,0 +1,6287 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:17+0000\n"
+"PO-Revision-Date: 2023-12-19 15:38\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/psql.pot\n"
+"X-Crowdin-File-ID: 981\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "невірний бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m"
+
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() помилка: %m"
+
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, 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
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s"
+
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "кориÑтувача не Ñ–Ñнує"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "неможливо виконати команду"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "команду не знайдено"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: "
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Ñ€Ñдок)"
+msgstr[1] "(%lu Ñ€Ñдки)"
+msgstr[2] "(%lu Ñ€Ñдків)"
+msgstr[3] "(%lu Ñ€Ñдка)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Перервано\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Ðеможливо додати заголовок до вміÑту таблиці: кількіÑÑ‚ÑŒ колонок %d перевищено.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Ðеможливо додати комірку до вміÑту таблиці: перевищено загальну кількіÑÑ‚ÑŒ комірок %d.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "невірний формат виводу (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°): %d"
+
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "пропуÑк рекурÑивного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— \"%s\""
+
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ локального кориÑтувача з ідентифікатором %d: %s"
+
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "локального кориÑтувача з ідентифікатором %d не Ñ–Ñнує"
+
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "Ðевірна команда \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "Спробуйте \\? Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸."
+
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: зайвий аргумент \"%s\" проігноровано"
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s команду проігноровано; ÑкориÑтайтеÑÑŒ \\endif або Ctrl-C, щоб вийти з поточного блоку \\if"
+
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "неможливо отримати домашню директорію Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача ID %ld: %s"
+
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: неможливо змінити директорію на \"%s\": %m"
+
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "Ðа даний момент ви від'єднанні від бази даних.\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" за ареÑою \"%s\" на порту \"%s\".\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" через Ñокет в \"%s\" на порту \"%s\".\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑÑ‚Ñ– \"%s\" (за ареÑою \"%s\") на порту \"%s\".\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑÑ‚Ñ– \"%s\" на порту \"%s\".\n"
+
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "немає буферу запитів"
+
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "невірний номер Ñ€Ñдка: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "Без змін"
+
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: невірне ім'Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ не знайдено процедуру конверÑÑ–Ñ—"
+
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:721 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° відÑутнÑ."
+
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: відÑÑƒÑ‚Ð½Ñ Ð¿Ñ€Ð°Ð²Ð° дужка"
+
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: не виÑтачає обов'Ñзкового аргументу"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: не може йти піÑÐ»Ñ \\else"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: немає відповідного \\if"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: не може йти піÑÐ»Ñ \\else"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: немає відповідного \\if"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: немає відповідного \\if"
+
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "Буфер запиту порожній."
+
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "Введіть новий пароль кориÑтувача \"%s\": "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "Введіть знову: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "Паролі не Ñпівпадають."
+
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—"
+
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "Буфер запитів Ñкинуто (очищено)."
+
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "ІÑторію запиÑано до файлу \"%s\".\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: змінна Ñередовища не повинна міÑтити \"=\""
+
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "необхідне ім'Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—"
+
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "необхідне ім'Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ"
+
+#: command.c:2621
+msgid "Timing is on."
+msgstr "Таймер увімкнено."
+
+#: command.c:2623
+msgid "Timing is off."
+msgstr "Таймер вимкнено."
+
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: інтервал зазначаєтьÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ñ€Ð°Ð·Ð¾Ð²Ð¾"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: неправильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ñƒ \"%s\""
+
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: інтервал зазначаєтьÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ñ€Ð°Ð·Ð¾Ð²Ð¾"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: неправильна кількіÑÑ‚ÑŒ ітерацій \"%s\""
+
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: нерозпізнаний параметр \"%s\""
+
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "Пароль: "
+
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль кориÑтувача %s:"
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "Ðе надайте кориÑтувачеві, хоÑту або порту окремо під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ€Ñдка підключеннÑ"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "Ðе Ñ–Ñнує Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²"
+
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "Попереднє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð²Ð°Ñ”"
+
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" за адреÑою \"%s\" на порту \"%s\".\n"
+
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "Ви тепер під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" через Ñокет в \"%s\" на порту \"%s\".\n"
+
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑÑ‚Ñ– \"%s\" (за адреÑою \"%s\") на порту \"%s\".\n"
+
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "Ви тепер під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑÑ‚Ñ– \"%s\" на порту \"%s\".\n"
+
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "Ви тепер під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\".\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, Ñервер %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid "WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr "УВÐГÐ: мажорна верÑÑ–Ñ %s %s, мажорна верÑÑ–Ñ Ñервера %s.\n"
+" ДеÑкі функції psql можуть не працювати.\n"
+
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SSL (протокол: %s, шифр: %s, компреÑÑ–Ñ: %s)\n"
+
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "невідомо"
+
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "вимк"
+
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "увімк"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¾ GSSAPI\n"
+
+#: command.c:3844
+#, c-format
+msgid "WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr "УВÐГÐ: Кодова Ñторінка конÑолі (%u) відрізнÑєтьÑÑ Ð²Ñ–Ð´ кодової Ñторінки Windows (%u)\n"
+" 8-бітові Ñимволи можуть працювати неправильно. Детальніше у розділі \n"
+" \"Ðотатки Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів Windows\" у документації psql.\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "змінна Ñередовища PSQL_EDITOR_LINENUMBER_ARG має бути вÑтановлена, щоб вказувати номер Ñ€Ñдка"
+
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "неможливо запуÑтити редактор \"%s\""
+
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "неможливо запуÑтити /bin/sh"
+
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "неможливо знайти тимчаÑову директорію: %s"
+
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "неможливо відкрити тимчаÑовий файл \"%s\": %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: неоднозначна абревіатура \"%s\" відповідає обом \"%s\" і \"%s"
+
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: дозволені формати: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: дозволені Ñтилі ліній: ascii, old-ascii, unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: дозволені Ñтилі ліній рамок Unicode: single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: дозволені Ñтилі ліній Ñтовпців Ð´Ð»Ñ Unicode: single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: дозволені Ñтилі ліній заголовків Ð´Ð»Ñ Unicode: single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: дозволені Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ xheader_width Ñ” \"%s\" (за замовчуваннÑм), \"%s\", \"%s\" або чиÑло, Ñке визначає точну ширину"
+
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep повинен бути однобайтовим Ñимволом"
+
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep не може бути подвійною лапкою, новим Ñ€Ñдком або поверненнÑм каретки"
+
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: невідомий параметр: %s"
+
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "Стиль рамки %d.\n"
+
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "Цільова ширина не вÑтановлена.\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "Цільова ширина %d.\n"
+
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "Розширене Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¾.\n"
+
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "Розширене Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтовуєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾.\n"
+
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "Розширене Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¾.\n"
+
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "Розширена ширина заголовка \"%s\".\n"
+
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "Розширена ширина заголовка %d.\n"
+
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "Розділювач полів CSV: \"%s\".\n"
+
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "Розділювач полів - нульовий байт.\n"
+
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "Розділювач полів \"%s\".\n"
+
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "Ðинжній колонтитул увімкнуто за замовчуваннÑм.\n"
+
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "Ðинжній колонтитул вимкнуто за замовчуваннÑм.\n"
+
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "Формат виводу %s.\n"
+
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "Стиль лінії %s.\n"
+
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "Null відображаєтьÑÑ Ñк \"%s\".\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "Локалізоване Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‡Ð¸Ñел ввімкнено.\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "Локалізоване Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‡Ð¸Ñел вимкнено.\n"
+
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "Пейджер викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð³Ð¾Ð³Ð¾ текÑту.\n"
+
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "Завжди викориÑтовуєтьÑÑ Ð¿ÐµÐ¹Ð´Ð¶ÐµÑ€.\n"
+
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "Пейджер не викориÑтовуєтьÑÑ.\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½Ñˆ ніж %d Ñ€Ñдка.\n"
+msgstr[1] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½Ñˆ ніж %d Ñ€Ñдків.\n"
+msgstr[2] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½Ñˆ ніж %d Ñ€Ñдків.\n"
+msgstr[3] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½Ñˆ ніж %d Ñ€Ñдка.\n"
+
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "Розділювач запиÑів - нульовий байт.\n"
+
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "Розділювач запиÑів: <newline>.\n"
+
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "Розділювач запиÑів: \"%s\".\n"
+
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "Табличні атрибути \"%s\".\n"
+
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "Ðтрибути таблиць не задані.\n"
+
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "Заголовок: \"%s\".\n"
+
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "Заголовок не вÑтановлено.\n"
+
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "Увімкнуто тільки кортежі.\n"
+
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "Вимкнуто тільки кортежі.\n"
+
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Стиль ліній рамки Ð´Ð»Ñ Unicode: \"%s\".\n"
+
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Стиль ліній Ñтовпців Ð´Ð»Ñ Unicode: \"%s\".\n"
+
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Стиль ліній заголовків Ð´Ð»Ñ Unicode: \"%s\".\n"
+
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: помилка"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch не може бути викориÑтано із пуÑтим запитом"
+
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "не вдалоÑÑ Ð²Ñтановити таймер: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (кожні %g Ñек)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (кожні %g Ñек)\n"
+
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "не вдалоÑÑ Ð´Ð¾Ñ‡ÐµÐºÐ°Ñ‚Ð¸ÑÑ Ñигналів: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid "********* QUERY **********\n"
+"%s\n"
+"**************************\n\n"
+msgstr "********* ЗÐПИТ **********\n"
+"%s\n"
+"**************************\n\n"
+
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" не Ñ” поданнÑм"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "неможливо розібрати маÑив reloptions"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "не можна вийти без активного з'єднаннÑ"
+
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\""
+
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером втрачено"
+
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером втрачено. Спроба перевÑтановити:"
+
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "Помилка.\n"
+
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "Вдало.\n"
+
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "неочікуваний PQresultStatus: %d"
+
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "ЧаÑ: %.3f мÑ\n"
+
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "ЧаÑ: %.3f Ð¼Ñ (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "ЧаÑ: %.3f Ð¼Ñ (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "ЧаÑ: %.3f Ð¼Ñ (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "Ðа даний момент ви від'єднанні від бази даних."
+
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "ÐÑинхронне ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ \"%s\" з навантаженнÑм \"%s\" отримане від Ñерверного процеÑу з PID %d.\n"
+
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "ÐÑинхронне ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ \"%s\" отримане від Ñерверного процеÑу з PID %d.\n"
+
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ€ÑƒÐºÑƒÐ²Ð°Ñ‚Ð¸ таблицю результатів: %m"
+
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "немає Ñ€Ñдків повернутих Ð´Ð»Ñ \\gset"
+
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "більш, ніж один Ñ€Ñдок повернуто Ð´Ð»Ñ \\gset"
+
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "Ñпробу виконати \\gset в Ñпеціальну змінну \"%s\" проігноровано"
+
+#: common.c:1063
+#, c-format
+msgid "***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr "***(Покроковий режим: перевірка команди)*******************************************\n"
+"%s\n"
+"***(Enter - виповнити; х і Enter - відмінити)********************\n"
+
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "ІÐСТРУКЦІЯ: %s"
+
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "неочікуваний Ñтан транзакції (%d)"
+
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "Стовпець"
+
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "Тип"
+
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "Команда не має результату або результат не має Ñтовпців.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: необхідні аргументи"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: помилка розбору аргументу Ð±Ñ–Ð»Ñ \"%s\""
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: помилка розбору в кінці Ñ€Ñдка"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m"
+
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m"
+
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: не можна копіювати з/до каталогу"
+
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ канал за допомогою зовнішньої команди: %m"
+
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "неможливо запиÑати дані COPY: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "Помилка передачі даних COPY: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "ÑкаÑовано кориÑтувачем"
+
+#: copy.c:539
+msgid "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."
+msgstr "Введіть дані Ð´Ð»Ñ ÐºÐ¾Ð¿ÑŽÐ²Ð°Ð½Ð½Ñ, розділÑючи переноÑом Ñ€Ñдка.\n"
+"Завершіть Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð° допомогою \"\\.\" або за допомогою Ñигналу EOF."
+
+#: copy.c:683
+msgid "aborted because of read failure"
+msgstr "перервано через помилку читаннÑ"
+
+#: copy.c:717
+msgid "trying to exit copy mode"
+msgstr "Ñпроба вийти з режиму копіюваннÑ"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: команда не повернула набір з результатами"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: запит має повернути принаймні три Ñтовпці"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: вертикальні Ñ– горизонтальні заголовки повинні бути різними ÑтовпцÑми"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: необхідно вказати Ñтовпець даних, коли запит повертає більше трьох Ñтовпців"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: МакÑимальна кількіÑÑ‚ÑŒ Ñтовпців (%d) перевищена"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: результат запиту міÑтить кілька значень даних Ð´Ð»Ñ Ñ€Ñдка «%s», ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Â«%s»"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: номер ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %d поза межами 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: неоднозначна назва ÑтовпцÑ: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ знайдено: \"%s\""
+
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Схема"
+
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "Ðазва"
+
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "Тип даних результату"
+
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "Типи даних аргументів"
+
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "ОпиÑ"
+
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "Перелік агрегатних функцій"
+
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "Сервер (верÑÑ–Ñ %s) не підтримує методи доÑтупу."
+
+#: describe.c:168
+msgid "Index"
+msgstr "ІндекÑ"
+
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "ТаблицÑ"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Обробник"
+
+#: describe.c:201
+msgid "List of access methods"
+msgstr "СпиÑок методів доÑтупу"
+
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "ВлаÑник"
+
+#: describe.c:231
+msgid "Location"
+msgstr "РозташуваннÑ"
+
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "Параметри"
+
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "Розмір"
+
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "СпиÑок табличних проÑторів"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df приймає в ÑкоÑÑ‚Ñ– параметрів тільки [anptwS+]"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df не приймає параметр \"%c\" із Ñервером верÑÑ–Ñ— %s"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "агр."
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "вікно"
+
+#: describe.c:356
+msgid "proc"
+msgstr "проц"
+
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "функ"
+
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "тригер"
+
+#: describe.c:386
+msgid "immutable"
+msgstr "поÑтійна"
+
+#: describe.c:387
+msgid "stable"
+msgstr "Ñтабільна"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "мінлива"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "МінливіÑÑ‚ÑŒ"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "обмежений"
+
+#: describe.c:398
+msgid "safe"
+msgstr "безпечний"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "небезпечний"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "ПаралельніÑÑ‚ÑŒ"
+
+#: describe.c:405
+msgid "definer"
+msgstr "визначник"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "викликач"
+
+#: describe.c:407
+msgid "Security"
+msgstr "Безпека"
+
+#: describe.c:412
+msgid "Language"
+msgstr "Мова"
+
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "Внутрішнє назва"
+
+#: describe.c:589
+msgid "List of functions"
+msgstr "СпиÑок функцій"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "Елементи"
+
+#: describe.c:706
+msgid "List of data types"
+msgstr "СпиÑок типів даних"
+
+#: describe.c:809
+msgid "Left arg type"
+msgstr "Тип лівого аргумента"
+
+#: describe.c:810
+msgid "Right arg type"
+msgstr "Тип правого аргумента"
+
+#: describe.c:811
+msgid "Result type"
+msgstr "Результуючий тип"
+
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "ФункціÑ"
+
+#: describe.c:897
+msgid "List of operators"
+msgstr "СпиÑок операторів"
+
+#: describe.c:932
+msgid "Encoding"
+msgstr "КодуваннÑ"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "ПоÑтачальник локалі"
+
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "ПорÑдок ÑортуваннÑ"
+
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "Ð›Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ICU"
+
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "Правила ICU"
+
+#: describe.c:973
+msgid "Tablespace"
+msgstr "Табличний проÑÑ‚Ñ–Ñ€"
+
+#: describe.c:999
+msgid "List of databases"
+msgstr "СпиÑок баз даних"
+
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "таблицÑ"
+
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "поданнÑ"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "матеріалізоване поданнÑ"
+
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "поÑлідовніÑÑ‚ÑŒ"
+
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "Ñекційна таблицÑ"
+
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "Права Ð´Ð»Ñ Ñтовпців"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "Політики"
+
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "Права доÑтупу"
+
+#: describe.c:1195
+msgid "function"
+msgstr "функціÑ"
+
+#: describe.c:1197
+msgid "type"
+msgstr "тип"
+
+#: describe.c:1199
+msgid "schema"
+msgstr "Ñхема"
+
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "Права доÑтупу за замовчуваннÑм"
+
+#: describe.c:1266
+msgid "Object"
+msgstr "Об'єкт"
+
+#: describe.c:1280
+msgid "table constraint"
+msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ"
+
+#: describe.c:1328
+msgid "operator class"
+msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²"
+
+#: describe.c:1352
+msgid "operator family"
+msgstr "ÑімейÑтво операторів"
+
+#: describe.c:1375
+msgid "rule"
+msgstr "правило"
+
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "ÐžÐ¿Ð¸Ñ Ð¾Ð±'єкту"
+
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "Ðе знайдено жодного Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ назвою \"%s\"."
+
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "Ðе знайдено жодного відношеннÑ."
+
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "Ðе знайдено жодного Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %s."
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "Початок"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "Мінімум"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "МакÑимум"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "ПриріÑÑ‚"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "так"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "ні"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "Цикли?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "Кеш"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "ВлаÑник: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "ПоÑлідовніÑÑ‚ÑŒ Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ identity: %s"
+
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "ПоÑлідовніÑÑ‚ÑŒ без Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "ПоÑлідовніÑÑ‚ÑŒ \"%s.%s\""
+
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\""
+
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "Матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "Матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "Ð†Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "Ð†Ð½Ð´ÐµÐºÑ \"%s.%s\""
+
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "Секційний Ñ–Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "Секційний Ñ–Ð½Ð´ÐµÐºÑ \"%s.%s\""
+
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ TOAST \"%s.%s\""
+
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "Композитний тип \"%s.%s\""
+
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\""
+
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "Секційна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\""
+
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "Секційна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\""
+
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "СортуваннÑ"
+
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "ОбнулÑєтьÑÑ"
+
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "За замовчуваннÑм"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "Ключ?"
+
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "ВизначеннÑ"
+
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FDW"
+
+#: describe.c:2041
+msgid "Storage"
+msgstr "Сховище"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "СтиÑканнÑ"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "СтатиÑтична ціль"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "Розділ: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "ВідÑутнє розділове обмеженнÑ"
+
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñекції: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "Ключ розділу: %s"
+
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "ТаблицÑ, що володіє: \"%s.%s\""
+
+#: describe.c:2315
+msgid "primary key, "
+msgstr "первинний ключ,"
+
+#: describe.c:2318
+msgid "unique"
+msgstr "унікальний"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls не відрізнÑÑŽÑ‚ÑŒÑÑ"
+
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\""
+
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", предикат (%s)"
+
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", клаÑтеризовано"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", недійÑний"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", відтермінований"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", від початку відтермінований"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", ідентичніÑÑ‚ÑŒ репліки"
+
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "ІндекÑи:"
+
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸:"
+
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð·Ð¾Ð²Ð½Ñ–:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "Політики:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "Політики (поÑилений захиÑÑ‚ Ñ€Ñдків активовано):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "Політики (захиÑÑ‚ Ñ€Ñдків ввімкнуто): (ні)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "Політики (поÑилений захиÑÑ‚ Ñ€Ñдків ввімкнуто): (ні)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "Політики (захиÑÑ‚ Ñ€Ñдків вимкнуто):"
+
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "Об'єкти ÑтатиÑтики:"
+
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "Правила:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "Вимкнені правила:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "Правила, що завжди працюють:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "Правила, що працюють тільки на репліці:"
+
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "Публікації:"
+
+#: describe.c:3079
+msgid "View definition:"
+msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ:"
+
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "Тригери:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "Вимкнені кориÑтувацькі тригери:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "Вимкнені внутрішні тригери:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "Тригери, що завжди працюють:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "Тригери, що працюють тільки на репліці:"
+
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "Сервер: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FDW: (%s)"
+
+#: describe.c:3354
+msgid "Inherits"
+msgstr "УÑпадковує"
+
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "ЧиÑло Ñекцій: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "КількіÑÑ‚ÑŒ розділів: %d (\\d+ Ð´Ð»Ñ ÑпиÑку)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "КількіÑÑ‚ÑŒ дочірніх таблиць: %d (\\d+ Ð´Ð»Ñ ÑпиÑку)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "Дочірні таблиці"
+
+#: describe.c:3437
+msgid "Partitions"
+msgstr "Розділи"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "Типізована Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñ‚Ð¸Ð¿Ñƒ: %s"
+
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr "ІдентичніÑÑ‚ÑŒ репліки"
+
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "Має OIDs: так"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "Метод доÑтупу: %s"
+
+#: describe.c:3585
+#, 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
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", табличний проÑÑ‚Ñ–Ñ€ \"%s\""
+
+#: describe.c:3670
+msgid "List of roles"
+msgstr "СпиÑок ролей"
+
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "Ім'Ñ Ñ€Ð¾Ð»Ñ–"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "Ðтрибути"
+
+#: describe.c:3684
+msgid "Superuser"
+msgstr "СуперкориÑтувач"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "Без уÑпадкуваннÑ"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "Створити роль"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "Створити базу даних"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "Ðе може увійти"
+
+#: describe.c:3699
+msgid "Replication"
+msgstr "РеплікаціÑ"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "Обхід RLC"
+
+#: describe.c:3712
+msgid "No connections"
+msgstr "Без підключень"
+
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d підключеннÑ"
+msgstr[1] "%d підключеннÑ"
+msgstr[2] "%d підключень"
+msgstr[3] "%d підключеннÑ"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "Пароль дійнÑий до"
+
+#: describe.c:3775
+msgid "Role"
+msgstr "Роль"
+
+#: describe.c:3776
+msgid "Database"
+msgstr "База даних"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "Параметри"
+
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "Ðе знайдено жодного параметра Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\" Ñ– бази даних \"%s\"."
+
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "Ðе знайдено жодного параметру Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\"."
+
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "Ðе знайдено жодного параметру."
+
+#: describe.c:3812
+msgid "List of settings"
+msgstr "СпиÑок параметрів"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "Член"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr "Ðадавач"
+
+#: describe.c:3886
+msgid "List of role grants"
+msgstr "Перелік наданих ролей"
+
+#: describe.c:3952
+msgid "index"
+msgstr "індекÑ"
+
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ TOAST"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "Ñекційний індекÑ"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "поÑтійна"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "тимчаÑова"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "нежурнальована"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "СтійкіÑÑ‚ÑŒ"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "Метод доÑтупу"
+
+#: describe.c:4082
+msgid "List of relations"
+msgstr "СпиÑок відношень"
+
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "Сервер (верÑÑ–Ñ %s) не підтримує декларативне ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ."
+
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "СпиÑок Ñекційних індекÑів"
+
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "СпиÑок Ñекційних таблиць"
+
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "СпиÑок Ñекційних відношень"
+
+#: describe.c:4178
+msgid "Parent name"
+msgstr "БатьківÑька назва"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr "Розмір дочірньої Ñекції"
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "Загальний розмір"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "Ðадійний"
+
+#: describe.c:4334
+msgid "Internal language"
+msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¼Ð¾Ð²Ð°"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr "Обробник виклику"
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr "Оброблювач впровадженого коду"
+
+#: describe.c:4372
+msgid "List of languages"
+msgstr "СпиÑок мов"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "Перевірка"
+
+#: describe.c:4457
+msgid "List of domains"
+msgstr "СпиÑок доменів"
+
+#: describe.c:4491
+msgid "Source"
+msgstr "Джерело"
+
+#: describe.c:4492
+msgid "Destination"
+msgstr "ПризначеннÑ"
+
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "За замовчуваннÑм?"
+
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "СпиÑок перетворень"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "Параметр"
+
+#: describe.c:4565
+msgid "Value"
+msgstr "ЗначеннÑ"
+
+#: describe.c:4572
+msgid "Context"
+msgstr "КонтекÑÑ‚"
+
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "СпиÑок параметрів конфігурації"
+
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "СпиÑок параметрів конфігурації не за замовчуваннÑм"
+
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "Сервер (верÑÑ–Ñ %s) не підтримує тригери подій."
+
+#: describe.c:4654
+msgid "Event"
+msgstr "ПодіÑ"
+
+#: describe.c:4656
+msgid "enabled"
+msgstr "увімкнено"
+
+#: describe.c:4657
+msgid "replica"
+msgstr "репліка"
+
+#: describe.c:4658
+msgid "always"
+msgstr "завжди"
+
+#: describe.c:4659
+msgid "disabled"
+msgstr "вимкнено"
+
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr "Увімкнено"
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "Теги"
+
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "СпиÑок тригерів подій"
+
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "Сервер (верÑÑ–Ñ %s) не підтримує розширену ÑтатиÑтику."
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr "Ndistinct"
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr "ЗалежноÑÑ‚Ñ–"
+
+#: describe.c:4761
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "СпиÑок розширеної ÑтатиÑтики"
+
+#: describe.c:4812
+msgid "Source type"
+msgstr "Початковий тип"
+
+#: describe.c:4813
+msgid "Target type"
+msgstr "Тип цілі"
+
+#: describe.c:4837
+msgid "in assignment"
+msgstr "у призначенні"
+
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "Приховане?"
+
+#: describe.c:4898
+msgid "List of casts"
+msgstr "СпиÑок Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "ПоÑтачальник"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "Детермінований?"
+
+#: describe.c:5017
+msgid "List of collations"
+msgstr "СпиÑок правил ÑортуваннÑ"
+
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "СпиÑок Ñхем"
+
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "СпиÑок парÑерів текÑтового пошуку"
+
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "Ðе знайдено жодного парÑера текÑтового пошуку \"%s\"."
+
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "Ðе знайдено жодного парÑера текÑтового пошуку."
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "Почати розбір"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "Метод"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "Отримати наÑтупний токен"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "Закінчити розбір"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "Отримати заголовок"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "Отримати типи токенів"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "ПарÑер текÑтового пошуку \"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "ПарÑер текÑтового пошуку \"%s\""
+
+#: describe.c:5368
+msgid "Token name"
+msgstr "Ім'Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "Типи токенів Ð´Ð»Ñ Ð¿Ð°Ñ€Ñера \"%s.%s\""
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "Типи токенів Ð´Ð»Ñ Ð¿Ð°Ñ€Ñера \"%s\""
+
+#: describe.c:5429
+msgid "Template"
+msgstr "Шаблон"
+
+#: describe.c:5430
+msgid "Init options"
+msgstr "Параметри ініціалізації"
+
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "СпиÑок Ñловників текÑтового пошуку"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "ІніціалізаціÑ"
+
+#: describe.c:5491
+msgid "Lexize"
+msgstr "Ð’Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð»ÐµÐºÑем"
+
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "СпиÑок шаблонів текÑтового пошуку"
+
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "СпиÑок конфігурацій текÑтового пошуку"
+
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "Ðе знайдено жодної конфігурації текÑтового пошуку під назвою \"%s\"."
+
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "Ðе знайдено жодної конфігурації текÑтвого пошуку."
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Токен"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "Словники"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ текÑту \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ текÑту \"%s\""
+
+#: describe.c:5717
+#, c-format
+msgid "\n"
+"Parser: \"%s.%s\""
+msgstr "\n"
+"ПарÑер: \"%s.%s\""
+
+#: describe.c:5720
+#, c-format
+msgid "\n"
+"Parser: \"%s\""
+msgstr "\n"
+"ПарÑер: \"%s\""
+
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "СпиÑок джерел Ñторонніх даних"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "Джерело Ñторонніх даних"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "ВерÑÑ–Ñ"
+
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "СпиÑок Ñторонніх Ñерверів"
+
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "Сервер"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
+
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "СпиÑок зіÑтавлень кориÑтувачів"
+
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "СпиÑок Ñторонніх таблиць"
+
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "СпиÑок вÑтановлених розширень"
+
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "Ðе знайдено жодного Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ назвою \"%s\"."
+
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "Ðе знайдено жодного розширеннÑ."
+
+#: describe.c:6154
+msgid "Object description"
+msgstr "ÐžÐ¿Ð¸Ñ Ð¾Ð±'єкту"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "Об'єкти в розширенні \"%s\""
+
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "неправильне повне ім'Ñ (забагато компонентів): %s"
+
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "міжбазові поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ реалізовані: %s"
+
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "Сервер (верÑÑ–Ñ %s) не підтримує публікації."
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "УÑÑ– таблиці"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "Ð’Ñтавки"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "ОновленнÑ"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "ВидаленнÑ"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "ОчищеннÑ"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "Через root"
+
+#: describe.c:6300
+msgid "List of publications"
+msgstr "СпиÑок публікацій"
+
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "Ðе знайдено жодної публікації під назвою \"%s\"."
+
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "Ðе знайдено жодної публікації."
+
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ %s"
+
+#: describe.c:6504
+msgid "Tables:"
+msgstr "Таблиці:"
+
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr "Таблиці зі Ñхеми:"
+
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "Сервер (верÑÑ–Ñ %s) не підтримує підпиÑки."
+
+#: describe.c:6576
+msgid "Publication"
+msgstr "ПублікаціÑ"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr "Бінарний"
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "Потокова передача"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "Двофазовий коміт"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "Вимкнути при помилці"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr "Джерело"
+
+#: describe.c:6615
+msgid "Password required"
+msgstr "Потрібен пароль"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "ЗапуÑтити Ñк влаÑник?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "Синхронні затвердженнÑ"
+
+#: describe.c:6622
+msgid "Conninfo"
+msgstr "Conninfo"
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "ПропуÑтити LSN"
+
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "СпиÑок підпиÑок"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr "ÐÐœ"
+
+#: describe.c:6718
+msgid "Input type"
+msgstr "Тип вводу"
+
+#: describe.c:6719
+msgid "Storage type"
+msgstr "Тип Ñховища"
+
+#: describe.c:6720
+msgid "Operator class"
+msgstr "ÐšÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²"
+
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "СімейÑтво операторів"
+
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "СпиÑок клаÑів операторів"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "Типи Ð´Ð»Ñ Ð·Ð°ÑтоÑуваннÑ"
+
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "СпиÑок ÑімейÑтв операторів"
+
+#: describe.c:6908
+msgid "Operator"
+msgstr "Оператор"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "СтратегіÑ"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "упорÑдкуваннÑ"
+
+#: describe.c:6911
+msgid "search"
+msgstr "пошук"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "Ціль"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "СімейÑтво операторів ÑортуваннÑ"
+
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "СпиÑок операторів ÑімейÑтв операторів"
+
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "ЗареєÑтрований лівий тип"
+
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "ЗареєÑтрований правий тип"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "ЧиÑло"
+
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "СпиÑок функцій підтримки ÑімейÑтв операторів"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+#: describe.c:7101
+msgid "Large objects"
+msgstr "Великі об'єкти"
+
+#: help.c:75
+msgid "psql is the PostgreSQL interactive terminal.\n\n"
+msgstr "psql - це інтерактивний термінал PostgreSQL.\n\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: help.c:77
+msgid " psql [OPTION]... [DBNAME [USERNAME]]\n\n"
+msgstr " psql [ОПЦІЯ]... [БД [КОРИСТУВÐЧ]]\n\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "ОÑновні налаштуваннÑ:\n"
+
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=КОМÐÐДРвиконати лише одну команду (SQL або внутрішню) Ñ– вийти\n"
+
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME ім'Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (за замовчаннÑ: \"%s\") \n"
+
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME виконує команди з файлу, потім виходить\n"
+
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list виводить ÑпиÑок доÑтупних баз даних, потім виходить\n"
+
+#: help.c:89
+msgid " -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr " -v, --set=, --variable=NAME=VALUE\n"
+" приÑвоїти змінній psql NAME Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ VALUE\n"
+" (наприклад, -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ігнорувати файл параметрів запуÑка (~/.psqlrc)\n"
+
+#: help.c:94
+msgid " -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr " -1 (\"один\"), --single-transaction\n"
+" виконує Ñк одну транзакцію (Ñкщо не інтерактивна)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help [=options] показати цю довідку, потім вийти\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands перерахувати команди, потім вийти\n"
+
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables перерахувати Ñпеціальні змінні, потім вийти\n"
+
+#: help.c:100
+msgid "\n"
+"Input and output options:\n"
+msgstr "\n"
+"Параметри вводу і виводу:\n"
+
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all відобразити вÑÑ– вхідні дані з Ñкрипта\n"
+
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors відобразити команди з помилками\n"
+
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries відобразити команди, відправлені на Ñервер\n"
+
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden відобразити запити, згенеровані внутрішніми командами\n"
+
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME зберегти протокол роботи у файл\n"
+
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline вимкнути розширене Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð³Ð¾ Ñ€Ñдка (readline)\n"
+
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME надÑилати результати запиту до файлу (або до каналу |)\n"
+
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet тихий запуÑк (ніÑких повідомлень, лише результат запитів)\n"
+
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step покроковий режим (Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту)\n"
+
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line однорÑдковий режим (кінець Ñ€Ñдка завершує команду)\n"
+
+#: help.c:112
+msgid "\n"
+"Output format options:\n"
+msgstr "\n"
+"Параметри формату виводу:\n"
+
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align режим виводу не вирівнÑної таблиці\n"
+
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv режим виводу таблиць CSV (Comma-Separated Values)\n"
+
+#: help.c:115
+#, c-format
+msgid " -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr " -F, --field-separator=СТРОКÐ\n"
+" розділювач полів при не вирівнÑному виводі\n"
+" (за замовчуваннÑм: \"%s\")\n"
+
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html вивід таблиці у форматі HTML\n"
+
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] вÑтановити параметр виводу змінної VAR значенню ARG (див. команду \"\\pset\")\n"
+
+#: help.c:120
+msgid " -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr " -R, --record-separator=СТРОКÐ\n"
+" розділювач запиÑів при не вирівнÑному виводі\n"
+" (за замовчуваннÑм: новий Ñ€Ñдок)\n"
+
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only виводити лише Ñ€Ñдки\n"
+
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=ТЕКСТ вÑтановити атрибути HTML-таблиці (width, border)\n"
+
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded ввімкнути розширене Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–\n"
+
+#: help.c:125
+msgid " -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr " -z, --field-separator-zero\n"
+" вÑтановити розділювач полів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу в нульовий байт\n"
+
+#: help.c:127
+msgid " -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr " -0, --record-separator-zero\n"
+" вÑтановити розділювач запиÑів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу в нульовий байт\n"
+
+#: help.c:130
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n"
+
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів (за замовчуваннÑм: \"%s)\n"
+
+#: help.c:134
+msgid "local socket"
+msgstr "локальний Ñокет"
+
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT порт Ñервера бази даних (за замовчуваннÑм: \"%s\")\n"
+
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача бази даних (за змовчуваннÑм: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password запитувати пароль завжди (повинно траплÑтиÑÑŒ автоматично)\n"
+
+#: help.c:145
+msgid "\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n\n"
+msgstr "\n"
+"Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ, введіть \"\\?\" (Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… команд) або \"\\help\"(Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ SQL) в psql, або звіртеÑÑ Ð· розділом psql документації PostgreSQL. \n\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "ПовідомлÑти про помилки на <%s>.\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: help.c:191
+msgid "General\n"
+msgstr "Загальні\n"
+
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... вÑтановити параметри запиту\n"
+
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright умови викориÑÑ‚Ð°Ð½Ð½Ñ Ñ– розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ PostgreSQL\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] виконати запит Ñ– відобразити результат у перехреÑній таблиці\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose вивеÑти макÑимально докладне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ оÑтанню помилку\n"
+
+#: help.c:196
+msgid " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr " \\g [(OPTIONS)] [FILE] виконати запит (Ñ– надіÑлати результат до файлу або |каналу);\n"
+" \\g без аргументів рівнозначно крапці з комою\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc опиÑати результат запиту без виконаннÑ\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec виконати запит, потім виконати кожне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² його результаті\n"
+
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] виконати запит та зберегти результат в змінних psql \n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] Ñк \\g, але вмикає розширений режим виводу\n"
+
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q вийти з psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] виконувати кожні SEC Ñекунд, не більше N разів\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr "\n"
+
+#: help.c:206
+msgid "Help\n"
+msgstr "Довідка\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] показати довідку по командах з \\\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options показати довідку по параметрах командного Ñ€Ñдку psql\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables показати довідку по Ñпеціальних змінних\n"
+
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] довідка з ÑинтакÑиÑу команд SQL, * Ð´Ð»Ñ Ð²ÑÑ–Ñ… команд\n"
+
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "Буфер запитів\n"
+
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] редагувати буфер запитів (або файл) зовнішнім редактором\n"
+
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] редагувати Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— зовнішнім редактором\n"
+
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] редагувати Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ð¼ редактором\n"
+
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p показати вміÑÑ‚ буфера запитів\n"
+
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r Ñкинути (очиÑтити) буфер запитів\n"
+
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] відобразити Ñ–Ñторію або зберегти Ñ—Ñ— до файлу\n"
+
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE пиÑати буфер запитів до файлу\n"
+
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "Ввід/Вивід\n"
+
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... виконати команду SQL COPY з потоком даних на клієнтÑький хоÑÑ‚\n"
+
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] запиÑати Ñ€Ñдок до Ñтандартного виводу (-n Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку нового Ñ€Ñдка)\n"
+
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE виконати команди з файлу\n"
+
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir ФÐЙЛ те Ñаме, що \\i, але відноÑно Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ñценарію\n"
+
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] надÑилати вÑÑ– результати запитів до файлу або до каналу |\n"
+
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] запиÑати Ñ€Ñдок до вихідного потоку \\o (-n Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку нового Ñ€Ñдка)\n"
+
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] запиÑати Ñ€Ñдок до Ñтандартної помилки (-n Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку нового Ñ€Ñдка)\n"
+
+#: help.c:236
+msgid "Conditional\n"
+msgstr "Умовний\n"
+
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR початок умовного блоку\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR альтернатива в рамках поточного блоку\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else оÑтаточна альтернатива в рамках поточного умовного блоку\n"
+
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif кінець умовного блоку\n"
+
+#: help.c:243
+msgid "Informational\n"
+msgstr "Інформаційний\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (параметри: S = показати ÑиÑтемні об'єкти, + = додаткові деталі)\n"
+
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] вивеÑти таблиці, Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ñ– поÑлідовноÑÑ‚Ñ–\n"
+
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME опиÑати таблицю, поданнÑ, поÑлідовніÑÑ‚ÑŒ або індекÑ\n"
+
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] вивеÑти агрегати\n"
+
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] вивеÑти методи доÑтупу\n"
+
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] ÑпиÑок клаÑів операторів\n"
+
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] ÑпиÑок ÑімейÑтв операторів\n"
+
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] ÑпиÑок операторів ÑімейÑтв операторів\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] ÑпиÑок функцій підтримки ÑімейÑтв операторів\n"
+
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] вивеÑти табличні проÑтори\n"
+
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] вивеÑти перетвореннÑ\n"
+
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] вивеÑти параметри конфігурації\n"
+
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] вивеÑти Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²\n"
+
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] показати Ð¾Ð¿Ð¸Ñ Ð¾Ð±'єкта, що не відображаєтьÑÑ Ð² іншому міÑці\n"
+
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] вивеÑти домени\n"
+
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] вивеÑти привілеї за замовчуваннÑм\n"
+
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] вивеÑти зовнішні таблиці\n"
+
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] вивеÑти зовнішні Ñервери\n"
+
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] вивеÑти зовнішні таблиці\n"
+
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] вивеÑти кориÑтувацькі зіÑтавленнÑ\n"
+
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] ÑпиÑок джерел Ñторонніх даних\n"
+
+#: help.c:265
+msgid " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" ÑпиÑок [лише агрегатних/нормальних/процедурних/тригерних/віконних] функцій\n"
+
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] вивеÑти конфігурації текÑтового пошуку\n"
+
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] вивеÑти Ñловники текÑтового пошуку\n"
+
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] вивеÑти парÑери текÑтового пошуку\n"
+
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] вивеÑти шаблони текÑтового пошуку\n"
+
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] вивеÑти ролі\n"
+
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] вивеÑти індекÑи\n"
+
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] вивеÑти великі об'єкти, те Ñаме, що \\lo_list\n"
+
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] вивеÑти процедурні мови\n"
+
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] вивеÑти матеріалізовані поданнÑ\n"
+
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] вивеÑти Ñхеми\n"
+
+#: help.c:277
+msgid " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" ÑпиÑок операторів\n"
+
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] вивеÑти правила ÑортуваннÑ\n"
+
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [PATTERN] вивеÑти привілеї доÑтупу до таблиць, подань або поÑлідовноÑтей \n"
+
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] вивеÑти [тільки індекÑ/таблицю] Ñекційні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ [n=вкладені]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] вивеÑти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð»ÐµÐ¹ побазово\n"
+
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [PATTERN] вивеÑти надані ролі\n"
+
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] вивеÑти реплікаційні публікації\n"
+
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] вивеÑти реплікаційні підпиÑки\n"
+
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] вивеÑти поÑлідовноÑÑ‚Ñ–\n"
+
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] вивеÑти таблиці\n"
+
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] вивеÑти типи даних\n"
+
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] вивеÑти ролі\n"
+
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] вивеÑти поданнÑ\n"
+
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] вивеÑти розширеннÑ\n"
+
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] ÑпиÑок розширеної ÑтатиÑтики\n"
+
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] вивеÑти тригери подій\n"
+
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] вивеÑти бази даних\n"
+
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME відобразити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—\n"
+
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME відобразити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ\n"
+
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [PATTERN] те Ñаме, що \\dp\n"
+
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "Великі об'єкти\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE запиÑати великий об'єкт в файл\n"
+
+#: help.c:302
+msgid " \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr " \\lo_import FILE [COMMENT]\n"
+" читати великий об'єкт з файлу\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] вивеÑти великі об'єкти\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID видалити великий об’єкт\n"
+
+#: help.c:308
+msgid "Formatting\n"
+msgstr "ФорматуваннÑ\n"
+
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ режимами виводу: unaligned, aligned\n"
+
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] вÑтановити заголовок таблиці або прибрати, Ñкщо не задано\n"
+
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [STRING] показати або вÑтановити розділювач полів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу запиту\n"
+
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H переключити режим виводу HTML (поточний: %s)\n"
+
+#: help.c:314
+msgid " \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr " \\pset [NAME [VALUE]] вÑтановити параметр виводу таблиці\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] показувати лише Ñ€Ñдки (поточно %s)\n"
+
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] вÑтановити атрибути Ð´Ð»Ñ HTML <table> або прибрати, Ñкщо не задані\n"
+
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] переключити розширений вивід (поточний: %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "авто"
+
+#: help.c:328
+msgid "Connection\n"
+msgstr "ПідключеннÑ\n"
+
+#: help.c:330
+#, c-format
+msgid " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатиÑÑ Ð´Ð¾ нової бази даних (поточно \"%s\")\n"
+
+#: help.c:334
+msgid " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатиÑÑ Ð´Ð¾ нової бази даних (зараз з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñутнє)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo показати інформацію про поточне з'єднаннÑ\n"
+
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] показати або вÑтановити ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] безпечно змінити пароль кориÑтувача \n"
+
+#: help.c:341
+msgid "Operating System\n"
+msgstr "Операційна ÑиÑтема\n"
+
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] змінити поточний робочий каталог\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVAR отримати змінну Ñередовища\n"
+
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] вÑтановити або Ñкинути змінну Ñередовища\n"
+
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] переключити таймер команд (поточний: %s)\n"
+
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [COMMAND] виконати команду в оболонці або запуÑтити інтерактивну оболонку\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "Змінні\n"
+
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME запитати кориÑтувача Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ñ— змінної\n"
+
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [VALUE]] вÑтановити внутрішню змінну або вивеÑти вÑÑ–, Ñкщо не задані параметри\n"
+
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME Ñкинути (видалити) Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ñ— змінної\n"
+
+#: help.c:392
+msgid "List of specially treated variables\n\n"
+msgstr "СпиÑок Ñпеціальних змінних\n\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "змінні psql:\n"
+
+#: help.c:396
+msgid " psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n\n"
+msgstr " psql --set=ІМ'Я=ЗÐÐЧЕÐÐЯ\n"
+" або \\set ІМ'Я ЗÐÐЧЕÐÐЯ уÑередині psql\n\n"
+
+#: help.c:398
+msgid " AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr " AUTOCOMMIT\n"
+" Ñкщо вÑтановлений, уÑпішні SQL-команди підтверджуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾\n"
+
+#: help.c:400
+msgid " COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr " COMP_KEYWORD_CASE\n"
+" визначає регіÑÑ‚Ñ€ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів SQL\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid " DBNAME\n"
+" the currently connected database name\n"
+msgstr " DBNAME назва під'єднаної бази даних\n"
+
+#: help.c:405
+msgid " ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr " ECHO контролює ввід, що виводитьÑÑ Ð½Ð° Ñтандартний вивід [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid " ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr " ECHO_HIDDEN\n"
+" Ñкщо ввімкнено, виводить внутрішні запити, виконані за допомогою \"\\\";\n"
+" Ñкщо вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"noexec\", тільки виводÑÑ‚ÑŒÑÑ, але не виконуютьÑÑ\n"
+
+#: help.c:411
+msgid " ENCODING\n"
+" current client character set encoding\n"
+msgstr " ENCODING\n"
+" поточне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ Ñимволів клієнта\n"
+
+#: help.c:413
+msgid " ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr " ERROR\n"
+" \"true\", Ñкщо в оÑтанньому запиті Ñ” помилка, в іншому разі - \"false\"\n"
+
+#: help.c:415
+msgid " FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr " FETCH_COUNT\n"
+" чиÑло Ñ€Ñдків з результатами Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– та Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° один раз (0 = необмежено)\n"
+
+#: help.c:417
+msgid " HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr " HIDE_TABLEAM\n"
+" Ñкщо вказано, методи доÑтупу до таблиць не відображаютьÑÑ\n"
+
+#: help.c:419
+msgid " HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr " HIDE_TOAST_COMPRESSION\n"
+" Ñкщо вÑтановлено, методи ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½Ðµ відображаютьÑÑ\n"
+
+#: help.c:421
+msgid " HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr " HISTCONTROL контролює Ñ–Ñторію команд [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid " HISTFILE\n"
+" file name used to store the command history\n"
+msgstr " HISTFILE ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ–Ñторії команд\n"
+
+#: help.c:425
+msgid " HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr " HISTSIZE макÑимальна кількіÑÑ‚ÑŒ команд Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² Ñ–Ñторії команд\n"
+
+#: help.c:427
+msgid " HOST\n"
+" the currently connected database server host\n"
+msgstr " HOST поточний підключений хоÑÑ‚ Ñервера бази даних\n"
+
+#: help.c:429
+msgid " IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr " IGNOREEOF кількіÑÑ‚ÑŒ EOF Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñ— ÑеÑÑ–Ñ—\n"
+
+#: help.c:431
+msgid " LASTOID\n"
+" value of the last affected OID\n"
+msgstr " LASTOID Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ñтаннього залученого OID\n"
+
+#: help.c:433
+msgid " LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr " LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° код SQLSTATE оÑтанньої помилки, або пуÑтий Ñ€Ñдок та \"00000\", Ñкщо помилки не було\n"
+
+#: help.c:436
+msgid " ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr " ON_ERROR_ROLLBACK\n"
+" Ñкщо вÑтановлено, Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð½Ðµ припинÑєтьÑÑ Ñƒ разі помилки (викориÑтовуютьÑÑ Ð½ÐµÑвні точки збереженнÑ)\n"
+
+#: help.c:438
+msgid " ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr " ON_ERROR_STOP\n"
+" зупинÑти Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ñƒ команд піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸\n"
+
+#: help.c:440
+msgid " PORT\n"
+" server port of the current connection\n"
+msgstr " PORT\n"
+" порт Ñервера Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ з'єднаннÑ\n"
+
+#: help.c:442
+msgid " PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr " PROMPT1\n"
+" визначає Ñтандратне Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ psql \n"
+
+#: help.c:444
+msgid " PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr " PROMPT2\n"
+" визначає запрошеннÑ, Ñке викориÑтовуєтьÑÑ Ð¿Ñ€Ð¸ продовженні команди з попереднього Ñ€Ñдка\n"
+
+#: help.c:446
+msgid " PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr " PROMPT3\n"
+" визначає запрошеннÑ, Ñке виконуєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ COPY ... FROM STDIN\n"
+
+#: help.c:448
+msgid " QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr " QUIET\n"
+" тихий запуÑк ( Ñк із параметром -q)\n"
+
+#: help.c:450
+msgid " ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr " ROW_COUNT\n"
+" чиÑло повернених або оброблених Ñ€Ñдків оÑтаннім запитом, або 0\n"
+
+#: help.c:452
+msgid " SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr " SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" верÑÑ–Ñ Ñеревера (у короткому текÑтовому або чиÑловому форматі)\n"
+
+#: help.c:455
+msgid " SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr " SHELL_ERROR\n"
+" \"true\", Ñкщо оÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° оболонки завершилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾ÑŽ, \"false\", Ñкщо уÑпішно\n"
+
+#: help.c:457
+msgid " SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr " SHEL_EXIT_CODE\n"
+" ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ñтанньої команди оболонки\n"
+
+#: help.c:459
+msgid " SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr " SHOW_ALL_RESULTS\n"
+" показати вÑÑ– результати комбінованого запиту (\\;) заміÑÑ‚ÑŒ тільки оÑтаннього\n"
+
+#: help.c:461
+msgid " SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr " SHOW_CONTEXT\n"
+" керує відображеннÑм полів контекÑту повідомлень [never, errors, always]\n"
+
+#: help.c:463
+msgid " SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr " SINGLELINE\n"
+" Ñкщо вÑтановлено, кінець Ñ€Ñдка завершує режим вводу SQL-команди (Ñк з параметром -S)\n"
+
+#: help.c:465
+msgid " SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr " SINGLESTEP\n"
+" покроковий режим (Ñк з параметром -s)\n"
+
+#: help.c:467
+msgid " SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr " SQLSTATE\n"
+" SQLSTATE оÑтаннього запиту, або \"00000\" Ñкщо немає помилок\n"
+
+#: help.c:469
+msgid " USER\n"
+" the currently connected database user\n"
+msgstr " USER\n"
+" поточний кориÑтувач, підключений до бази даних\n"
+
+#: help.c:471
+msgid " VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr " VERBOSITY\n"
+" контролює докладніÑÑ‚ÑŒ звітів про помилку [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid " VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr " VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql верÑÑ–Ñ (в розгорнутому, в короткому текÑтовому або чиÑловому форматі)\n"
+
+#: help.c:478
+msgid "\n"
+"Display settings:\n"
+msgstr "\n"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€ÐµÐ¶ÐµÐ½Ð½Ñ:\n"
+
+#: help.c:480
+msgid " psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n\n"
+msgstr " psql --pset=NAME[=VALUE]\n"
+" або \\pset ІМ'Я [VALUE] вÑередині psql\n\n"
+
+#: help.c:482
+msgid " border\n"
+" border style (number)\n"
+msgstr " border\n"
+" Ñтиль рамки (чиÑло)\n"
+
+#: help.c:484
+msgid " columns\n"
+" target width for the wrapped format\n"
+msgstr " columns\n"
+" цільова ширина Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ з переноÑом\n"
+
+#: help.c:486
+msgid " expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr " expanded (or x)\n"
+" розширений вивід [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid " fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr " fieldsep\n"
+" розділювач полів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу (за замовчуваннÑм \"%s\")\n"
+
+#: help.c:491
+msgid " fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr " fieldsep_zero\n"
+" вÑтановити розділювач полів Ð´Ð»Ñ Ð½ÐµÐ²Ð¸Ñ€Ñ–Ð²Ð½Ñного виводу на нульовий байт\n"
+
+#: help.c:493
+msgid " footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr " footer\n"
+" вмикає або вимикає вивід підпиÑів таблиці [on, off]\n"
+
+#: help.c:495
+msgid " format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr " format\n"
+" вÑтановити формат виводу [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid " linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr " linestyle\n"
+" вÑтановлює Ñтиль Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ð½Ñ–Ð¹ рамки [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid " null\n"
+" set the string to be printed in place of a null value\n"
+msgstr " null\n"
+" вÑтановлює Ñ€Ñдок, Ñкий буде виведено заміÑÑ‚ÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (null)\n"
+
+#: help.c:501
+msgid " numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr " numericlocale\n"
+" вмикає Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ð½Ð¾Ð³Ð¾ локалью роздільника групи цифр\n"
+
+#: help.c:503
+msgid " pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr " pager\n"
+" контролює викориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ пейджера [yes, no, always]\n"
+
+#: help.c:505
+msgid " recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr " recordsep\n"
+" розділювач запиÑів (Ñ€Ñдків) Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу\n"
+
+#: help.c:507
+msgid " recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr " recordsep_zero\n"
+" вÑтановлює розділювач запиÑів Ð´Ð»Ñ Ð½ÐµÐ²Ð¸Ñ€Ñ–Ð²Ð½Ñного виводу на нульовий байт\n"
+
+#: help.c:509
+msgid " tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr " tableattr (або T)\n"
+" вказує атрибути Ð´Ð»Ñ Ñ‚ÐµÐ³Ñƒ table у html форматі або пропорційні \n"
+" ширини Ñтовпців Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ–Ð²Ð½Ñних вліво даних, у latex-longtable форматі\n"
+
+#: help.c:512
+msgid " title\n"
+" set the table title for subsequently printed tables\n"
+msgstr " title\n"
+" задає заголовок таблиці Ð´Ð»Ñ Ð¿Ð¾Ñлідовно друкованих таблиць\n"
+
+#: help.c:514
+msgid " tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr " tuples_only\n"
+" Ñкщо вÑтановлено, виводÑÑ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ фактичні табличні дані\n"
+
+#: help.c:516
+msgid " unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr " unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" задає Ñтиль Ð¼Ð°Ð»ÑŒÑŽÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ð½Ñ–Ð¹ (Unicode) [single, double]\n"
+
+#: help.c:521
+msgid "\n"
+"Environment variables:\n"
+msgstr "\n"
+"Змінні оточеннÑ:\n"
+
+#: help.c:525
+msgid " NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n\n"
+msgstr " ІМ'Я=ЗÐÐЧЕÐÐЯ [ІМ'Я=ЗÐÐЧЕÐÐЯ] psql ...\n"
+" або \\setenv ІМ'Я [VALUE] вÑередині psql\n\n"
+
+#: help.c:527
+msgid " set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n\n"
+msgstr " вÑтановлює ІМ'Я=ЗÐÐЧЕÐÐЯ\n"
+" psql ...\n"
+" або \\setenv ІМ'Я [VALUE] вÑередині psql\n\n"
+
+#: help.c:530
+msgid " COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr " COLUMNS\n"
+" чиÑло Ñтовпців Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð· переноÑом\n"
+
+#: help.c:532
+msgid " PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr " PGAPPNAME\n"
+" те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ application_name\n"
+
+#: help.c:534
+msgid " PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr " PGDATABASE\n"
+" те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ dbname\n"
+
+#: help.c:536
+msgid " PGHOST\n"
+" same as the host connection parameter\n"
+msgstr " PGHOST\n"
+" те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ host\n"
+
+#: help.c:538
+msgid " PGPASSFILE\n"
+" password file name\n"
+msgstr " PGPASSFILE\n"
+" назва файлу з паролем\n"
+
+#: help.c:540
+msgid " PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr " PGPASSWORD\n"
+" пароль Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (не рекомендуєтьÑÑ)\n"
+
+#: help.c:542
+msgid " PGPORT\n"
+" same as the port connection parameter\n"
+msgstr " PGPORT\n"
+" те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ port\n"
+
+#: help.c:544
+msgid " PGUSER\n"
+" same as the user connection parameter\n"
+msgstr " PGUSER\n"
+" те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ user\n"
+
+#: help.c:546
+msgid " PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr " PSQL_EDITOR, EDITOR, VISUAL\n"
+" редактор Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ \\e, \\ef Ñ– \\ev\n"
+
+#: help.c:548
+msgid " PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr " PSQL_EDITOR_LINENUMBER_ARG\n"
+" Ñк вказати номер Ñ€Ñдка при виклику редактора\n"
+
+#: help.c:550
+msgid " PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr " PSQL_HISTORY\n"
+" альтернативне Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ з Ñ–Ñторією команд\n"
+
+#: help.c:552
+msgid " PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr " PSQL_PAGER, PAGER\n"
+" ім'Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ зовнішнього пейджеру\n"
+
+#: help.c:555
+msgid " PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr " PSQL_WATCH_PAGER\n"
+" назва зовнішньої програми-пейджера Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð· \\watch\n"
+
+#: help.c:558
+msgid " PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr " PSQLRC\n"
+" альтернативне Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацького файла .psqlrc\n"
+
+#: help.c:560
+msgid " SHELL\n"
+" shell used by the \\! command\n"
+msgstr " SHELL\n"
+" оболонка, що викориÑтовуєтьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ \\!\n"
+
+#: help.c:562
+msgid " TMPDIR\n"
+" directory for temporary files\n"
+msgstr " TMPDIR\n"
+" каталог Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових файлів\n"
+
+#: help.c:622
+msgid "Available help:\n"
+msgstr "ДоÑтупна довідка:\n"
+
+#: help.c:717
+#, c-format
+msgid "Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n\n"
+"URL: %s\n\n"
+msgstr "Команда: %s\n"
+"ОпиÑ: %s\n"
+"СинтакÑиÑ:\n"
+"%s\n\n"
+"URL: %s\n\n"
+
+#: help.c:740
+#, c-format
+msgid "No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr "Ðемає доÑтупної довідки по команді \"%s\".\n"
+"Спробуйте \\h без аргументів, щоб подивитиÑÑŒ доÑтупну довідку.\n"
+
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %m"
+
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "не можливо зберегти Ñ–Ñторію в файлі \"%s\": %m"
+
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "Ñ†Ñ ÑƒÑтановка не підтримує Ñ–Ñторію"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: немає з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· базою даних"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: поточна Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð°"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: невідомий Ñтан транзакції"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: вихід"
+
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "Введіть \"\\q\", щоб вийти з %s.\n"
+
+#: mainloop.c:214
+msgid "The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr "Ввід ÑвлÑÑ” Ñобою Ñпеціальний формат дампу PostgreSQL.\n"
+"Щоб відновити базу даних з цього дампу, ÑкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ pg_restore.\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸ введіть \\? або натиÑніть Ñontrol-C Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ñƒ вводу."
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "Введіть \\? Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸."
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "Ви викориÑтовуєте psql — Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð³Ð¾ Ñ€Ñдка до PostgreSQL."
+
+#: mainloop.c:302
+#, c-format
+msgid "Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr "Введіть: \\copyright Ð´Ð»Ñ ÑƒÐ¼Ð¾Ð² розповÑюдженнÑ\n"
+" \\h Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸ по командах SQL\n"
+" \\? Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸ по командах psql\n"
+" \\g або крапку з комою в кінці Ñ€Ñдка Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ\n"
+" \\q Ð´Ð»Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "Введіть \\q, щоб вийти."
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "ÐатиÑніть control-D, щоб вийти."
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "ÐатиÑніть control-C, щоб вийти."
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "запит ігноруєтьÑÑ; введіть \\endif або натиÑніть Ctrl-C Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ \\if блоку"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "доÑÑгнуто ÐºÑ–Ð½Ñ†Ñ Ñ„Ð°Ð¹Ð»Ñƒ без завершального \\endif"
+
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "незавершений Ñ€Ñдок в лапках"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: бракує пам'ÑÑ‚Ñ–"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1307 sql_help.c:1309
+#: sql_help.c:1312 sql_help.c:1315 sql_help.c:1317 sql_help.c:1319
+#: sql_help.c:1322 sql_help.c:1325 sql_help.c:1442 sql_help.c:1444
+#: sql_help.c:1446 sql_help.c:1449 sql_help.c:1470 sql_help.c:1473
+#: sql_help.c:1476 sql_help.c:1479 sql_help.c:1483 sql_help.c:1485
+#: sql_help.c:1487 sql_help.c:1489 sql_help.c:1503 sql_help.c:1506
+#: sql_help.c:1508 sql_help.c:1510 sql_help.c:1520 sql_help.c:1522
+#: sql_help.c:1532 sql_help.c:1534 sql_help.c:1544 sql_help.c:1547
+#: sql_help.c:1570 sql_help.c:1572 sql_help.c:1574 sql_help.c:1576
+#: sql_help.c:1579 sql_help.c:1581 sql_help.c:1584 sql_help.c:1587
+#: sql_help.c:1638 sql_help.c:1681 sql_help.c:1684 sql_help.c:1686
+#: sql_help.c:1688 sql_help.c:1691 sql_help.c:1693 sql_help.c:1695
+#: sql_help.c:1698 sql_help.c:1750 sql_help.c:1766 sql_help.c:1999
+#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2100 sql_help.c:2158
+#: sql_help.c:2166 sql_help.c:2176 sql_help.c:2203 sql_help.c:2235
+#: sql_help.c:2253 sql_help.c:2281 sql_help.c:2392 sql_help.c:2438
+#: sql_help.c:2463 sql_help.c:2486 sql_help.c:2490 sql_help.c:2524
+#: sql_help.c:2544 sql_help.c:2566 sql_help.c:2580 sql_help.c:2601
+#: sql_help.c:2630 sql_help.c:2665 sql_help.c:2690 sql_help.c:2737
+#: sql_help.c:3032 sql_help.c:3045 sql_help.c:3062 sql_help.c:3078
+#: sql_help.c:3118 sql_help.c:3172 sql_help.c:3176 sql_help.c:3178
+#: sql_help.c:3185 sql_help.c:3204 sql_help.c:3231 sql_help.c:3266
+#: sql_help.c:3278 sql_help.c:3287 sql_help.c:3331 sql_help.c:3345
+#: sql_help.c:3373 sql_help.c:3381 sql_help.c:3393 sql_help.c:3403
+#: sql_help.c:3411 sql_help.c:3419 sql_help.c:3427 sql_help.c:3435
+#: sql_help.c:3444 sql_help.c:3455 sql_help.c:3463 sql_help.c:3471
+#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3497 sql_help.c:3506
+#: sql_help.c:3515 sql_help.c:3523 sql_help.c:3533 sql_help.c:3544
+#: sql_help.c:3552 sql_help.c:3561 sql_help.c:3572 sql_help.c:3581
+#: sql_help.c:3589 sql_help.c:3597 sql_help.c:3605 sql_help.c:3613
+#: sql_help.c:3621 sql_help.c:3629 sql_help.c:3637 sql_help.c:3645
+#: sql_help.c:3653 sql_help.c:3661 sql_help.c:3678 sql_help.c:3687
+#: sql_help.c:3695 sql_help.c:3712 sql_help.c:3727 sql_help.c:4039
+#: sql_help.c:4149 sql_help.c:4178 sql_help.c:4194 sql_help.c:4196
+#: sql_help.c:4699 sql_help.c:4747 sql_help.c:4905
+msgid "name"
+msgstr "назва"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1847
+#: sql_help.c:3346 sql_help.c:4467
+msgid "aggregate_signature"
+msgstr "Ñигнатура_агр_функції"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1316 sql_help.c:1443
+#: sql_help.c:1486 sql_help.c:1507 sql_help.c:1521 sql_help.c:1533
+#: sql_help.c:1546 sql_help.c:1573 sql_help.c:1639 sql_help.c:1692
+msgid "new_name"
+msgstr "нова_назва"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1380 sql_help.c:1445 sql_help.c:1488 sql_help.c:1509
+#: sql_help.c:1571 sql_help.c:1687 sql_help.c:3018
+msgid "new_owner"
+msgstr "новий_влаÑник"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1318 sql_help.c:1490 sql_help.c:1511
+#: sql_help.c:1523 sql_help.c:1535 sql_help.c:1575 sql_help.c:1694
+msgid "new_schema"
+msgstr "нова_Ñхема"
+
+#: sql_help.c:44 sql_help.c:1911 sql_help.c:3347 sql_help.c:4496
+msgid "where aggregate_signature is:"
+msgstr "де Ñигнатура_агр_функції:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912
+#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2069 sql_help.c:2088
+#: sql_help.c:2091 sql_help.c:2393 sql_help.c:2602 sql_help.c:3348
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3445 sql_help.c:3534
+#: sql_help.c:3562 sql_help.c:3914 sql_help.c:4366 sql_help.c:4473
+#: sql_help.c:4480 sql_help.c:4486 sql_help.c:4497 sql_help.c:4500
+#: sql_help.c:4503
+msgid "argmode"
+msgstr "режим_аргументу"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:4474 sql_help.c:4481 sql_help.c:4487
+#: sql_help.c:4498 sql_help.c:4501 sql_help.c:4504
+msgid "argname"
+msgstr "ім'Ñ_аргументу"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2395 sql_help.c:2604
+#: sql_help.c:3350 sql_help.c:3353 sql_help.c:3356 sql_help.c:3447
+#: sql_help.c:3536 sql_help.c:3564 sql_help.c:4475 sql_help.c:4482
+#: sql_help.c:4488 sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argtype"
+msgstr "тип_аргументу"
+
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1504 sql_help.c:1633 sql_help.c:1665
+#: sql_help.c:1718 sql_help.c:1782 sql_help.c:1969 sql_help.c:1976
+#: sql_help.c:2284 sql_help.c:2334 sql_help.c:2341 sql_help.c:2350
+#: sql_help.c:2439 sql_help.c:2666 sql_help.c:2759 sql_help.c:3047
+#: sql_help.c:3232 sql_help.c:3254 sql_help.c:3394 sql_help.c:3750
+#: sql_help.c:3958 sql_help.c:4193 sql_help.c:4195 sql_help.c:4972
+msgid "option"
+msgstr "параметр"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1634 sql_help.c:2440
+#: sql_help.c:2667 sql_help.c:3233 sql_help.c:3395
+msgid "where option can be:"
+msgstr "де параметр може бути:"
+
+#: sql_help.c:116 sql_help.c:2216
+msgid "allowconn"
+msgstr "дозвол_підкл"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1635 sql_help.c:2217
+#: sql_help.c:2441 sql_help.c:2668 sql_help.c:3234
+msgid "connlimit"
+msgstr "ліміт_підключень"
+
+#: sql_help.c:118 sql_help.c:2218
+msgid "istemplate"
+msgstr "чи_шаблон"
+
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1321
+#: sql_help.c:1373 sql_help.c:4199
+msgid "new_tablespace"
+msgstr "новий_табл_проÑÑ‚Ñ–Ñ€"
+
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1182 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:2405 sql_help.c:2608
+#: sql_help.c:3926 sql_help.c:4217 sql_help.c:4378 sql_help.c:4687
+msgid "configuration_parameter"
+msgstr "параметр_конфігурації"
+
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1352
+#: sql_help.c:1375 sql_help.c:1423 sql_help.c:1448 sql_help.c:1505
+#: sql_help.c:1589 sql_help.c:1643 sql_help.c:1666 sql_help.c:2285
+#: sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 sql_help.c:2406
+#: sql_help.c:2407 sql_help.c:2471 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2609 sql_help.c:2610 sql_help.c:2633 sql_help.c:2760
+#: sql_help.c:2799 sql_help.c:2909 sql_help.c:2922 sql_help.c:2936
+#: sql_help.c:2977 sql_help.c:3004 sql_help.c:3021 sql_help.c:3048
+#: sql_help.c:3255 sql_help.c:3959 sql_help.c:4688 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691
+msgid "value"
+msgstr "значеннÑ"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "цільова_роль"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2269 sql_help.c:2638
+#: sql_help.c:2715 sql_help.c:2720 sql_help.c:3889 sql_help.c:3898
+#: sql_help.c:3917 sql_help.c:3929 sql_help.c:4341 sql_help.c:4350
+#: sql_help.c:4369 sql_help.c:4381
+msgid "schema_name"
+msgstr "ім'Ñ_Ñхеми"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "Ñкорочено_GRANT_або_REVOKE"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "де Ñкорочено_GRANT_або_REVOKE Ñ” одним з:"
+
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1320 sql_help.c:1653 sql_help.c:2444 sql_help.c:2445
+#: sql_help.c:2446 sql_help.c:2447 sql_help.c:2448 sql_help.c:2582
+#: sql_help.c:2671 sql_help.c:2672 sql_help.c:2673 sql_help.c:2674
+#: sql_help.c:2675 sql_help.c:3237 sql_help.c:3238 sql_help.c:3239
+#: sql_help.c:3240 sql_help.c:3241 sql_help.c:3938 sql_help.c:3942
+#: sql_help.c:4390 sql_help.c:4394 sql_help.c:4709
+msgid "role_name"
+msgstr "ім'Ñ_ролі"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1336 sql_help.c:1338
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1427 sql_help.c:1683
+#: sql_help.c:2238 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2467 sql_help.c:2637 sql_help.c:2776 sql_help.c:2781
+#: sql_help.c:2783 sql_help.c:2904 sql_help.c:2917 sql_help.c:2931
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:2981 sql_help.c:3990
+#: sql_help.c:4005 sql_help.c:4007 sql_help.c:4094 sql_help.c:4097
+#: sql_help.c:4099 sql_help.c:4560 sql_help.c:4561 sql_help.c:4570
+#: sql_help.c:4617 sql_help.c:4618 sql_help.c:4619 sql_help.c:4620
+#: sql_help.c:4621 sql_help.c:4622 sql_help.c:4662 sql_help.c:4663
+#: sql_help.c:4668 sql_help.c:4673 sql_help.c:4817 sql_help.c:4818
+#: sql_help.c:4827 sql_help.c:4874 sql_help.c:4875 sql_help.c:4876
+#: sql_help.c:4877 sql_help.c:4878 sql_help.c:4879 sql_help.c:4933
+#: sql_help.c:4935 sql_help.c:5003 sql_help.c:5063 sql_help.c:5064
+#: sql_help.c:5073 sql_help.c:5120 sql_help.c:5121 sql_help.c:5122
+#: sql_help.c:5123 sql_help.c:5124 sql_help.c:5125
+msgid "expression"
+msgstr "вираз"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "обмеженнÑ_домену"
+
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1313 sql_help.c:1360 sql_help.c:1361 sql_help.c:1362
+#: sql_help.c:1389 sql_help.c:1401 sql_help.c:1418 sql_help.c:1853
+#: sql_help.c:1855 sql_help.c:2241 sql_help.c:2353 sql_help.c:2358
+#: sql_help.c:2939 sql_help.c:2951 sql_help.c:4002
+msgid "constraint_name"
+msgstr "ім'Ñ_обмеженнÑ"
+
+#: sql_help.c:247 sql_help.c:1314
+msgid "new_constraint_name"
+msgstr "ім'Ñ_нового_обмеженнÑ"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "нова_верÑÑ–Ñ"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "елемент_об'єкт"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "де елемент_об'єкт є:"
+
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1845 sql_help.c:1850 sql_help.c:1857
+#: sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 sql_help.c:1861
+#: sql_help.c:1862 sql_help.c:1863 sql_help.c:1868 sql_help.c:1870
+#: sql_help.c:1874 sql_help.c:1876 sql_help.c:1880 sql_help.c:1885
+#: sql_help.c:1886 sql_help.c:1893 sql_help.c:1894 sql_help.c:1895
+#: sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 sql_help.c:1899
+#: sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 sql_help.c:1903
+#: sql_help.c:1908 sql_help.c:1909 sql_help.c:4463 sql_help.c:4468
+#: sql_help.c:4469 sql_help.c:4470 sql_help.c:4471 sql_help.c:4477
+#: sql_help.c:4478 sql_help.c:4483 sql_help.c:4484 sql_help.c:4489
+#: sql_help.c:4490 sql_help.c:4491 sql_help.c:4492 sql_help.c:4493
+#: sql_help.c:4494
+msgid "object_name"
+msgstr "ім'Ñ_об'єкту"
+
+#: sql_help.c:329 sql_help.c:1846 sql_help.c:4466
+msgid "aggregate_name"
+msgstr "ім'Ñ_агр_функції"
+
+#: sql_help.c:331 sql_help.c:1848 sql_help.c:2134 sql_help.c:2138
+#: sql_help.c:2140 sql_help.c:3364
+msgid "source_type"
+msgstr "початковий_тип"
+
+#: sql_help.c:332 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "target_type"
+msgstr "тип_цілі"
+
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1864 sql_help.c:2136
+#: sql_help.c:2179 sql_help.c:2257 sql_help.c:2525 sql_help.c:2556
+#: sql_help.c:3124 sql_help.c:4365 sql_help.c:4472 sql_help.c:4589
+#: sql_help.c:4593 sql_help.c:4597 sql_help.c:4600 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4854 sql_help.c:4857 sql_help.c:5092
+#: sql_help.c:5096 sql_help.c:5100 sql_help.c:5103
+msgid "function_name"
+msgstr "ім'Ñ_функції"
+
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1871 sql_help.c:2549
+msgid "operator_name"
+msgstr "ім'Ñ_оператора"
+
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1872
+#: sql_help.c:2526 sql_help.c:3488
+msgid "left_type"
+msgstr "тип_ліворуч"
+
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "right_type"
+msgstr "тип_праворуч"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1407 sql_help.c:1875 sql_help.c:1877 sql_help.c:2546
+#: sql_help.c:2567 sql_help.c:2957 sql_help.c:3498 sql_help.c:3507
+msgid "index_method"
+msgstr "метод_індекÑу"
+
+#: sql_help.c:352 sql_help.c:1881 sql_help.c:4479
+msgid "procedure_name"
+msgstr "назва_процедури"
+
+#: sql_help.c:356 sql_help.c:1887 sql_help.c:3913 sql_help.c:4485
+msgid "routine_name"
+msgstr "ім'Ñ_підпрограми"
+
+#: sql_help.c:368 sql_help.c:1379 sql_help.c:1904 sql_help.c:2401
+#: sql_help.c:2607 sql_help.c:2912 sql_help.c:3091 sql_help.c:3669
+#: sql_help.c:3935 sql_help.c:4387
+msgid "type_name"
+msgstr "назва_типу"
+
+#: sql_help.c:369 sql_help.c:1905 sql_help.c:2400 sql_help.c:2606
+#: sql_help.c:3092 sql_help.c:3322 sql_help.c:3670 sql_help.c:3920
+#: sql_help.c:4372
+msgid "lang_name"
+msgstr "назва_мови"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "Ñ– Ñигнатура_агр_функції:"
+
+#: sql_help.c:395 sql_help.c:2001 sql_help.c:2282
+msgid "handler_function"
+msgstr "функціÑ_обробник"
+
+#: sql_help.c:396 sql_help.c:2283
+msgid "validator_function"
+msgstr "функціÑ_перевірки"
+
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1308 sql_help.c:1580
+msgid "action"
+msgstr "діÑ"
+
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1310 sql_help.c:1328 sql_help.c:1332 sql_help.c:1333
+#: sql_help.c:1337 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341
+#: sql_help.c:1342 sql_help.c:1344 sql_help.c:1347 sql_help.c:1348
+#: sql_help.c:1350 sql_help.c:1353 sql_help.c:1355 sql_help.c:1356
+#: sql_help.c:1403 sql_help.c:1405 sql_help.c:1412 sql_help.c:1421
+#: sql_help.c:1426 sql_help.c:1430 sql_help.c:1431 sql_help.c:1682
+#: sql_help.c:1685 sql_help.c:1689 sql_help.c:1727 sql_help.c:1852
+#: sql_help.c:1966 sql_help.c:1972 sql_help.c:1986 sql_help.c:1987
+#: sql_help.c:1988 sql_help.c:2332 sql_help.c:2345 sql_help.c:2398
+#: sql_help.c:2466 sql_help.c:2472 sql_help.c:2505 sql_help.c:2636
+#: sql_help.c:2745 sql_help.c:2780 sql_help.c:2782 sql_help.c:2894
+#: sql_help.c:2903 sql_help.c:2913 sql_help.c:2916 sql_help.c:2926
+#: sql_help.c:2930 sql_help.c:2953 sql_help.c:2955 sql_help.c:2962
+#: sql_help.c:2975 sql_help.c:2980 sql_help.c:2984 sql_help.c:2985
+#: sql_help.c:3001 sql_help.c:3127 sql_help.c:3267 sql_help.c:3892
+#: sql_help.c:3893 sql_help.c:3989 sql_help.c:4004 sql_help.c:4006
+#: sql_help.c:4008 sql_help.c:4093 sql_help.c:4096 sql_help.c:4098
+#: sql_help.c:4344 sql_help.c:4345 sql_help.c:4465 sql_help.c:4626
+#: sql_help.c:4632 sql_help.c:4634 sql_help.c:4883 sql_help.c:4889
+#: sql_help.c:4891 sql_help.c:4932 sql_help.c:4934 sql_help.c:4936
+#: sql_help.c:4991 sql_help.c:5129 sql_help.c:5135 sql_help.c:5137
+msgid "column_name"
+msgstr "назва_ÑтовпцÑ"
+
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1311 sql_help.c:1690
+msgid "new_column_name"
+msgstr "нова_назва_ÑтовпцÑ"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1327 sql_help.c:1590
+msgid "where action is one of:"
+msgstr "де допуÑтима діÑ:"
+
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1329
+#: sql_help.c:1334 sql_help.c:1592 sql_help.c:1596 sql_help.c:2236
+#: sql_help.c:2333 sql_help.c:2545 sql_help.c:2738 sql_help.c:2895
+#: sql_help.c:3174 sql_help.c:4150
+msgid "data_type"
+msgstr "тип_даних"
+
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1330 sql_help.c:1335
+#: sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 sql_help.c:2336
+#: sql_help.c:2468 sql_help.c:2897 sql_help.c:2905 sql_help.c:2918
+#: sql_help.c:2932 sql_help.c:3175 sql_help.c:3181 sql_help.c:3999
+msgid "collation"
+msgstr "правила_ÑортуваннÑ"
+
+#: sql_help.c:456 sql_help.c:1331 sql_help.c:2337 sql_help.c:2346
+#: sql_help.c:2898 sql_help.c:2914 sql_help.c:2927
+msgid "column_constraint"
+msgstr "обмеженнÑ_ÑтовпцÑ"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1349 sql_help.c:4985
+msgid "integer"
+msgstr "ціле"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1351
+#: sql_help.c:1354
+msgid "attribute_option"
+msgstr "параметр_атрибуту"
+
+#: sql_help.c:476 sql_help.c:1358 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "table_constraint"
+msgstr "обмеженнÑ_таблиці"
+
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1363
+#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1366 sql_help.c:1906
+msgid "trigger_name"
+msgstr "ім'Ñ_тригеру"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1377 sql_help.c:1378
+#: sql_help.c:2339 sql_help.c:2344 sql_help.c:2902 sql_help.c:2925
+msgid "parent_table"
+msgstr "батьківÑька_таблицÑ"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1549 sql_help.c:2268
+msgid "extension_name"
+msgstr "ім'Ñ_розширеннÑ"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2402
+msgid "execution_cost"
+msgstr "вартіÑÑ‚ÑŒ_виконаннÑ"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2403
+msgid "result_rows"
+msgstr "Ñ€Ñдки_результату"
+
+#: sql_help.c:547 sql_help.c:2404
+msgid "support_function"
+msgstr "функціÑ_підтримки"
+
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1632 sql_help.c:1640
+#: sql_help.c:1644 sql_help.c:1647 sql_help.c:1650 sql_help.c:2716
+#: sql_help.c:2718 sql_help.c:2721 sql_help.c:2722 sql_help.c:3890
+#: sql_help.c:3891 sql_help.c:3895 sql_help.c:3896 sql_help.c:3899
+#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905
+#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911
+#: sql_help.c:3912 sql_help.c:3918 sql_help.c:3919 sql_help.c:3921
+#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927
+#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933
+#: sql_help.c:3934 sql_help.c:3936 sql_help.c:3937 sql_help.c:3939
+#: sql_help.c:3940 sql_help.c:4342 sql_help.c:4343 sql_help.c:4347
+#: sql_help.c:4348 sql_help.c:4351 sql_help.c:4352 sql_help.c:4354
+#: sql_help.c:4355 sql_help.c:4357 sql_help.c:4358 sql_help.c:4360
+#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4370
+#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376
+#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 sql_help.c:4382
+#: sql_help.c:4383 sql_help.c:4385 sql_help.c:4386 sql_help.c:4388
+#: sql_help.c:4389 sql_help.c:4391 sql_help.c:4392
+msgid "role_specification"
+msgstr "вказаннÑ_ролі"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1663 sql_help.c:2204
+#: sql_help.c:2724 sql_help.c:3252 sql_help.c:3703 sql_help.c:4719
+msgid "user_name"
+msgstr "ім'Ñ_кориÑтувача"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1652 sql_help.c:2723
+#: sql_help.c:3941 sql_help.c:4393
+msgid "where role_specification can be:"
+msgstr "де вказаннÑ_ролі може бути:"
+
+#: sql_help.c:575
+msgid "group_name"
+msgstr "ім'Ñ_групи"
+
+#: sql_help.c:596 sql_help.c:1424 sql_help.c:2215 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2910 sql_help.c:2923 sql_help.c:2937
+#: sql_help.c:2978 sql_help.c:3005 sql_help.c:3017 sql_help.c:3932
+#: sql_help.c:4384
+msgid "tablespace_name"
+msgstr "ім'Ñ_табличного_проÑтору"
+
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1371 sql_help.c:1381
+#: sql_help.c:1419 sql_help.c:1781 sql_help.c:1784
+msgid "index_name"
+msgstr "назва_індекÑу"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1374
+#: sql_help.c:1376 sql_help.c:1422 sql_help.c:2473 sql_help.c:2507
+#: sql_help.c:2908 sql_help.c:2921 sql_help.c:2935 sql_help.c:2976
+#: sql_help.c:3003
+msgid "storage_parameter"
+msgstr "параметр_зберіганнÑ"
+
+#: sql_help.c:607
+msgid "column_number"
+msgstr "номер_ÑтовпцÑ"
+
+#: sql_help.c:631 sql_help.c:1869 sql_help.c:4476
+msgid "large_object_oid"
+msgstr "oid_великого_об'єкта"
+
+#: sql_help.c:690 sql_help.c:1357 sql_help.c:2896
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1372
+msgid "new_access_method"
+msgstr "новий_метод_доÑтупа"
+
+#: sql_help.c:725 sql_help.c:2530
+msgid "res_proc"
+msgstr "res_процедура"
+
+#: sql_help.c:726 sql_help.c:2531
+msgid "join_proc"
+msgstr "процедура_приєднаннÑ"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2548
+msgid "strategy_number"
+msgstr "номер_Ñтратегії"
+
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2550 sql_help.c:2551
+#: sql_help.c:2554 sql_help.c:2555
+msgid "op_type"
+msgstr "тип_операції"
+
+#: sql_help.c:782 sql_help.c:2552
+msgid "sort_family_name"
+msgstr "ім'Ñ_родини_ÑортуваннÑ"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2553
+msgid "support_number"
+msgstr "номер_підтримки"
+
+#: sql_help.c:787 sql_help.c:2137 sql_help.c:2557 sql_help.c:3094
+#: sql_help.c:3096
+msgid "argument_type"
+msgstr "тип_аргументу"
+
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1726 sql_help.c:1780
+#: sql_help.c:1783 sql_help.c:1854 sql_help.c:1879 sql_help.c:1892
+#: sql_help.c:1907 sql_help.c:1965 sql_help.c:1971 sql_help.c:2331
+#: sql_help.c:2343 sql_help.c:2464 sql_help.c:2504 sql_help.c:2581
+#: sql_help.c:2635 sql_help.c:2692 sql_help.c:2744 sql_help.c:2777
+#: sql_help.c:2784 sql_help.c:2893 sql_help.c:2911 sql_help.c:2924
+#: sql_help.c:3000 sql_help.c:3120 sql_help.c:3301 sql_help.c:3524
+#: sql_help.c:3573 sql_help.c:3679 sql_help.c:3888 sql_help.c:3894
+#: sql_help.c:3955 sql_help.c:3987 sql_help.c:4340 sql_help.c:4346
+#: sql_help.c:4464 sql_help.c:4575 sql_help.c:4577 sql_help.c:4639
+#: sql_help.c:4678 sql_help.c:4832 sql_help.c:4834 sql_help.c:4896
+#: sql_help.c:4930 sql_help.c:4990 sql_help.c:5078 sql_help.c:5080
+#: sql_help.c:5142
+msgid "table_name"
+msgstr "ім'Ñ_таблиці"
+
+#: sql_help.c:823 sql_help.c:2583
+msgid "using_expression"
+msgstr "вираз_викориÑтаннÑ"
+
+#: sql_help.c:824 sql_help.c:2584
+msgid "check_expression"
+msgstr "вираз_перевірки"
+
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2631
+msgid "publication_object"
+msgstr "об'єкт_публікаціÑ"
+
+#: sql_help.c:903 sql_help.c:2632
+msgid "publication_parameter"
+msgstr "параметр_публікації"
+
+#: sql_help.c:909 sql_help.c:2634
+msgid "where publication_object is one of:"
+msgstr "де об'єкт_Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ” одним з:"
+
+#: sql_help.c:952 sql_help.c:1636 sql_help.c:2442 sql_help.c:2669
+#: sql_help.c:3235
+msgid "password"
+msgstr "пароль"
+
+#: sql_help.c:953 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "timestamp"
+msgstr "мітка чаÑу"
+
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:3901
+#: sql_help.c:4353
+msgid "database_name"
+msgstr "назва_бази_даних"
+
+#: sql_help.c:1073 sql_help.c:2739
+msgid "increment"
+msgstr "інкремент"
+
+#: sql_help.c:1074 sql_help.c:2740
+msgid "minvalue"
+msgstr "мін_значеннÑ"
+
+#: sql_help.c:1075 sql_help.c:2741
+msgid "maxvalue"
+msgstr "макÑ_значеннÑ"
+
+#: sql_help.c:1076 sql_help.c:2742 sql_help.c:4573 sql_help.c:4676
+#: sql_help.c:4830 sql_help.c:5007 sql_help.c:5076
+msgid "start"
+msgstr "початок"
+
+#: sql_help.c:1077 sql_help.c:1346
+msgid "restart"
+msgstr "перезапуÑк"
+
+#: sql_help.c:1078 sql_help.c:2743
+msgid "cache"
+msgstr "кеш"
+
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "нова_ціль"
+
+#: sql_help.c:1142 sql_help.c:2796
+msgid "conninfo"
+msgstr "інформаціÑ_підключеннÑ"
+
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2797
+msgid "publication_name"
+msgstr "назва_публікації"
+
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "опціÑ_оновленнÑ"
+
+#: sql_help.c:1161 sql_help.c:2798
+msgid "subscription_parameter"
+msgstr "параметр_підпиÑки"
+
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "опціÑ_пропуÑка"
+
+#: sql_help.c:1323 sql_help.c:1326
+msgid "partition_name"
+msgstr "ім'Ñ_розділу"
+
+#: sql_help.c:1324 sql_help.c:2348 sql_help.c:2929
+msgid "partition_bound_spec"
+msgstr "ÑпецифікаціÑ_рамок_розділу"
+
+#: sql_help.c:1343 sql_help.c:1393 sql_help.c:2943
+msgid "sequence_options"
+msgstr "опції_поÑлідовноÑÑ‚Ñ–"
+
+#: sql_help.c:1345
+msgid "sequence_option"
+msgstr "опціÑ_поÑлідовноÑÑ‚Ñ–"
+
+#: sql_help.c:1359
+msgid "table_constraint_using_index"
+msgstr "індекÑ_обмеженнÑ_таблиці"
+
+#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1370
+msgid "rewrite_rule_name"
+msgstr "ім'Ñ_правила_перезапиÑу"
+
+#: sql_help.c:1382 sql_help.c:2360 sql_help.c:2968
+msgid "and partition_bound_spec is:"
+msgstr "Ñ– ÑпецифікаціÑ_рамок_розділу:"
+
+#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:2361
+#: sql_help.c:2362 sql_help.c:2363 sql_help.c:2969 sql_help.c:2970
+#: sql_help.c:2971
+msgid "partition_bound_expr"
+msgstr "код_Ñекції"
+
+#: sql_help.c:1386 sql_help.c:1387 sql_help.c:2364 sql_help.c:2365
+#: sql_help.c:2972 sql_help.c:2973
+msgid "numeric_literal"
+msgstr "чиÑловий_літерал"
+
+#: sql_help.c:1388
+msgid "and column_constraint is:"
+msgstr "Ñ– обмеженнÑ_ÑтовпцÑ:"
+
+#: sql_help.c:1391 sql_help.c:2355 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:2941
+msgid "default_expr"
+msgstr "вираз_за_замовчуваннÑм"
+
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2942
+msgid "generation_expr"
+msgstr "код_генерації"
+
+#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1404 sql_help.c:1406
+#: sql_help.c:1410 sql_help.c:2944 sql_help.c:2945 sql_help.c:2954
+#: sql_help.c:2956 sql_help.c:2960
+msgid "index_parameters"
+msgstr "параметри_індекÑу"
+
+#: sql_help.c:1396 sql_help.c:1413 sql_help.c:2946 sql_help.c:2963
+msgid "reftable"
+msgstr "залежна_таблицÑ"
+
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "refcolumn"
+msgstr "залежний_Ñтовпець"
+
+#: sql_help.c:1398 sql_help.c:1399 sql_help.c:1415 sql_help.c:1416
+#: sql_help.c:2948 sql_help.c:2949 sql_help.c:2965 sql_help.c:2966
+msgid "referential_action"
+msgstr "діÑ_поÑиланнÑ"
+
+#: sql_help.c:1400 sql_help.c:2357 sql_help.c:2950
+msgid "and table_constraint is:"
+msgstr "Ñ– обмеженнÑ_таблиці:"
+
+#: sql_help.c:1408 sql_help.c:2958
+msgid "exclude_element"
+msgstr "об'єкт_виключеннÑ"
+
+#: sql_help.c:1409 sql_help.c:2959 sql_help.c:4571 sql_help.c:4674
+#: sql_help.c:4828 sql_help.c:5005 sql_help.c:5074
+msgid "operator"
+msgstr "оператор"
+
+#: sql_help.c:1411 sql_help.c:2476 sql_help.c:2961
+msgid "predicate"
+msgstr "предикат"
+
+#: sql_help.c:1417
+msgid "and table_constraint_using_index is:"
+msgstr "Ñ– індекÑ_обмеженнÑ_таблиці:"
+
+#: sql_help.c:1420 sql_help.c:2974
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "параметри_індекÑу в обмеженнÑÑ… UNIQUE, PRIMARY KEY, EXCLUDE:"
+
+#: sql_help.c:1425 sql_help.c:2979
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "елемент_Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² обмеженні EXCLUDE:"
+
+#: sql_help.c:1428 sql_help.c:2469 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:2982 sql_help.c:4000
+msgid "opclass"
+msgstr "клаÑ_оператора"
+
+#: sql_help.c:1429 sql_help.c:2983
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° дію в обмеженні FOREIGN KEY/REFERENCES:"
+
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:3020
+msgid "tablespace_option"
+msgstr "опціÑ_табличного_проÑтору"
+
+#: sql_help.c:1471 sql_help.c:1474 sql_help.c:1480 sql_help.c:1484
+msgid "token_type"
+msgstr "тип_токену"
+
+#: sql_help.c:1472 sql_help.c:1475
+msgid "dictionary_name"
+msgstr "ім'Ñ_Ñловника"
+
+#: sql_help.c:1477 sql_help.c:1481
+msgid "old_dictionary"
+msgstr "Ñтарий_Ñловник"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "new_dictionary"
+msgstr "новий_Ñловник"
+
+#: sql_help.c:1577 sql_help.c:1591 sql_help.c:1594 sql_help.c:1595
+#: sql_help.c:3173
+msgid "attribute_name"
+msgstr "ім'Ñ_атрибута"
+
+#: sql_help.c:1578
+msgid "new_attribute_name"
+msgstr "нове_ім'Ñ_атрибута"
+
+#: sql_help.c:1582 sql_help.c:1586
+msgid "new_enum_value"
+msgstr "нове_значеннÑ_перерахуваннÑ"
+
+#: sql_help.c:1583
+msgid "neighbor_enum_value"
+msgstr "ÑуÑіднє_значеннÑ_перерахуваннÑ"
+
+#: sql_help.c:1585
+msgid "existing_enum_value"
+msgstr "Ñ–Ñнуюче_значеннÑ_перерахуваннÑ"
+
+#: sql_help.c:1588
+msgid "property"
+msgstr "влаÑтивіÑÑ‚ÑŒ"
+
+#: sql_help.c:1664 sql_help.c:2340 sql_help.c:2349 sql_help.c:2755
+#: sql_help.c:3253 sql_help.c:3704 sql_help.c:3910 sql_help.c:3956
+#: sql_help.c:4362
+msgid "server_name"
+msgstr "назва_Ñерверу"
+
+#: sql_help.c:1696 sql_help.c:1699 sql_help.c:3268
+msgid "view_option_name"
+msgstr "ім'Ñ_параметра_предÑтавленнÑ"
+
+#: sql_help.c:1697 sql_help.c:3269
+msgid "view_option_value"
+msgstr "значеннÑ_параметра_предÑтавленнÑ"
+
+#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4973 sql_help.c:4974
+msgid "table_and_columns"
+msgstr "таблицÑ_Ñ–_Ñтовпці"
+
+#: sql_help.c:1721 sql_help.c:1785 sql_help.c:1977 sql_help.c:3753
+#: sql_help.c:4197 sql_help.c:4975
+msgid "where option can be one of:"
+msgstr "де параметр може бути одним із:"
+
+#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1786 sql_help.c:1979
+#: sql_help.c:1983 sql_help.c:2163 sql_help.c:3754 sql_help.c:3755
+#: sql_help.c:3756 sql_help.c:3757 sql_help.c:3758 sql_help.c:3759
+#: sql_help.c:3760 sql_help.c:3761 sql_help.c:3762 sql_help.c:4198
+#: sql_help.c:4200 sql_help.c:4976 sql_help.c:4977 sql_help.c:4978
+#: sql_help.c:4979 sql_help.c:4980 sql_help.c:4981 sql_help.c:4982
+#: sql_help.c:4983 sql_help.c:4984 sql_help.c:4986 sql_help.c:4987
+msgid "boolean"
+msgstr "логічний"
+
+#: sql_help.c:1724 sql_help.c:4988
+msgid "size"
+msgstr "розмір"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "and table_and_columns is:"
+msgstr "Ñ– таблицÑ_Ñ–_Ñтовпці:"
+
+#: sql_help.c:1741 sql_help.c:4735 sql_help.c:4737 sql_help.c:4761
+msgid "transaction_mode"
+msgstr "режим_транзакції"
+
+#: sql_help.c:1742 sql_help.c:4738 sql_help.c:4762
+msgid "where transaction_mode is one of:"
+msgstr "де режим_транзакції один з:"
+
+#: sql_help.c:1751 sql_help.c:4581 sql_help.c:4590 sql_help.c:4594
+#: sql_help.c:4598 sql_help.c:4601 sql_help.c:4838 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5084
+#: sql_help.c:5093 sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "argument"
+msgstr "аргумент"
+
+#: sql_help.c:1851
+msgid "relation_name"
+msgstr "назва_відношеннÑ"
+
+#: sql_help.c:1856 sql_help.c:3904 sql_help.c:4356
+msgid "domain_name"
+msgstr "назва_домену"
+
+#: sql_help.c:1878
+msgid "policy_name"
+msgstr "назва_політики"
+
+#: sql_help.c:1891
+msgid "rule_name"
+msgstr "назва_правила"
+
+#: sql_help.c:1910 sql_help.c:4495
+msgid "string_literal"
+msgstr "Ñ€Ñдковий_літерал"
+
+#: sql_help.c:1935 sql_help.c:4159 sql_help.c:4409
+msgid "transaction_id"
+msgstr "ідентифікатор_транзакції"
+
+#: sql_help.c:1967 sql_help.c:1974 sql_help.c:4026
+msgid "filename"
+msgstr "ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
+
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:2694 sql_help.c:2695
+#: sql_help.c:2696
+msgid "command"
+msgstr "команда"
+
+#: sql_help.c:1970 sql_help.c:2693 sql_help.c:3123 sql_help.c:3304
+#: sql_help.c:4010 sql_help.c:4087 sql_help.c:4090 sql_help.c:4564
+#: sql_help.c:4566 sql_help.c:4667 sql_help.c:4669 sql_help.c:4821
+#: sql_help.c:4823 sql_help.c:4939 sql_help.c:5067 sql_help.c:5069
+msgid "condition"
+msgstr "умова"
+
+#: sql_help.c:1973 sql_help.c:2510 sql_help.c:3006 sql_help.c:3270
+#: sql_help.c:3288 sql_help.c:3991
+msgid "query"
+msgstr "запит"
+
+#: sql_help.c:1978
+msgid "format_name"
+msgstr "назва_формату"
+
+#: sql_help.c:1980
+msgid "delimiter_character"
+msgstr "Ñимвол_роздільник"
+
+#: sql_help.c:1981
+msgid "null_string"
+msgstr "предÑтавленнÑ_NULL"
+
+#: sql_help.c:1982
+msgid "default_string"
+msgstr "Ñ€Ñдок_за_замовчуваннÑм"
+
+#: sql_help.c:1984
+msgid "quote_character"
+msgstr "Ñимвол_лапок"
+
+#: sql_help.c:1985
+msgid "escape_character"
+msgstr "Ñимвол_екрануваннÑ"
+
+#: sql_help.c:1989
+msgid "encoding_name"
+msgstr "ім'Ñ_кодуваннÑ"
+
+#: sql_help.c:2000
+msgid "access_method_type"
+msgstr "тип_метода_доÑтупа"
+
+#: sql_help.c:2071 sql_help.c:2090 sql_help.c:2093
+msgid "arg_data_type"
+msgstr "тип_даних_аргумента"
+
+#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102
+msgid "sfunc"
+msgstr "функціÑ_Ñтану"
+
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "state_data_type"
+msgstr "тип_даних_Ñтану"
+
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_size"
+msgstr "розмір_даних_Ñтану"
+
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "ffunc"
+msgstr "функціÑ_завершеннÑ"
+
+#: sql_help.c:2076 sql_help.c:2106
+msgid "combinefunc"
+msgstr "комбінуюча_функціÑ"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "serialfunc"
+msgstr "функціÑ_Ñеріалізації"
+
+#: sql_help.c:2078 sql_help.c:2108
+msgid "deserialfunc"
+msgstr "функціÑ_деÑеріалізації"
+
+#: sql_help.c:2079 sql_help.c:2098 sql_help.c:2109
+msgid "initial_condition"
+msgstr "початкова_умова"
+
+#: sql_help.c:2080 sql_help.c:2110
+msgid "msfunc"
+msgstr "функціÑ_Ñтану_рух"
+
+#: sql_help.c:2081 sql_help.c:2111
+msgid "minvfunc"
+msgstr "зворотна_функціÑ_рух"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "mstate_data_type"
+msgstr "тип_даних_Ñтану_рух"
+
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_size"
+msgstr "розмір_даних_Ñтану_рух"
+
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mffunc"
+msgstr "функціÑ_завершеннÑ_рух"
+
+#: sql_help.c:2085 sql_help.c:2115
+msgid "minitial_condition"
+msgstr "початкова_умова_рух"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "sort_operator"
+msgstr "оператор_ÑортуваннÑ"
+
+#: sql_help.c:2099
+msgid "or the old syntax"
+msgstr "або Ñтарий ÑинтакÑиÑ"
+
+#: sql_help.c:2101
+msgid "base_type"
+msgstr "базовий_тип"
+
+#: sql_help.c:2159 sql_help.c:2208
+msgid "locale"
+msgstr "локаль"
+
+#: sql_help.c:2160 sql_help.c:2209
+msgid "lc_collate"
+msgstr "код_правила_ÑортуваннÑ"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_ctype"
+msgstr "код_клаÑифікації_Ñимволів"
+
+#: sql_help.c:2162 sql_help.c:4462
+msgid "provider"
+msgstr "поÑтачальник"
+
+#: sql_help.c:2164
+msgid "rules"
+msgstr "правила"
+
+#: sql_help.c:2165 sql_help.c:2270
+msgid "version"
+msgstr "верÑÑ–Ñ"
+
+#: sql_help.c:2167
+msgid "existing_collation"
+msgstr "Ñ–Ñнуюче_правило_ÑортуваннÑ"
+
+#: sql_help.c:2177
+msgid "source_encoding"
+msgstr "початкове_кодуваннÑ"
+
+#: sql_help.c:2178
+msgid "dest_encoding"
+msgstr "цільве_кодуваннÑ"
+
+#: sql_help.c:2205 sql_help.c:3046
+msgid "template"
+msgstr "шаблон"
+
+#: sql_help.c:2206
+msgid "encoding"
+msgstr "кодуваннÑ"
+
+#: sql_help.c:2207
+msgid "strategy"
+msgstr "ÑтратегіÑ"
+
+#: sql_help.c:2211
+msgid "icu_locale"
+msgstr "icu_locale"
+
+#: sql_help.c:2212
+msgid "icu_rules"
+msgstr "правила_icu"
+
+#: sql_help.c:2213
+msgid "locale_provider"
+msgstr "локаль_провайдер"
+
+#: sql_help.c:2214
+msgid "collation_version"
+msgstr "верÑÑ–Ñ_ÑортуваннÑ"
+
+#: sql_help.c:2219
+msgid "oid"
+msgstr "oid"
+
+#: sql_help.c:2239
+msgid "constraint"
+msgstr "обмеженнÑ"
+
+#: sql_help.c:2240
+msgid "where constraint is:"
+msgstr "де обмеженнÑ:"
+
+#: sql_help.c:2254 sql_help.c:2691 sql_help.c:3119
+msgid "event"
+msgstr "подіÑ"
+
+#: sql_help.c:2255
+msgid "filter_variable"
+msgstr "змінна_фільтру"
+
+#: sql_help.c:2256
+msgid "filter_value"
+msgstr "значеннÑ_фільтру"
+
+#: sql_help.c:2352 sql_help.c:2938
+msgid "where column_constraint is:"
+msgstr "де обмеженнÑ_Ñтовпців:"
+
+#: sql_help.c:2397
+msgid "rettype"
+msgstr "тип_результату"
+
+#: sql_help.c:2399
+msgid "column_type"
+msgstr "тип_ÑтовпцÑ"
+
+#: sql_help.c:2408 sql_help.c:2611
+msgid "definition"
+msgstr "визначеннÑ"
+
+#: sql_help.c:2409 sql_help.c:2612
+msgid "obj_file"
+msgstr "об'єктний_файл"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "link_symbol"
+msgstr "Ñимвол_екÑпорту"
+
+#: sql_help.c:2411 sql_help.c:2614
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2449 sql_help.c:2676 sql_help.c:3242
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2465 sql_help.c:2506 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:3002
+msgid "method"
+msgstr "метод"
+
+#: sql_help.c:2470
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2487
+msgid "call_handler"
+msgstr "обробник_виклику"
+
+#: sql_help.c:2488
+msgid "inline_handler"
+msgstr "обробник_впровадженого_коду"
+
+#: sql_help.c:2489
+msgid "valfunction"
+msgstr "функціÑ_перевірки"
+
+#: sql_help.c:2528
+msgid "com_op"
+msgstr "комут_оператор"
+
+#: sql_help.c:2529
+msgid "neg_op"
+msgstr "зворотній_оператор"
+
+#: sql_help.c:2547
+msgid "family_name"
+msgstr "назва_ÑімейÑтва"
+
+#: sql_help.c:2558
+msgid "storage_type"
+msgstr "тип_зберіганнÑ"
+
+#: sql_help.c:2697 sql_help.c:3126
+msgid "where event can be one of:"
+msgstr "де Ð¿Ð¾Ð´Ñ–Ñ Ð¼Ð¾Ð¶Ðµ бути однією з:"
+
+#: sql_help.c:2717 sql_help.c:2719
+msgid "schema_element"
+msgstr "елемент_Ñхеми"
+
+#: sql_help.c:2756
+msgid "server_type"
+msgstr "тип_Ñерверу"
+
+#: sql_help.c:2757
+msgid "server_version"
+msgstr "верÑÑ–Ñ_Ñерверу"
+
+#: sql_help.c:2758 sql_help.c:3907 sql_help.c:4359
+msgid "fdw_name"
+msgstr "назва_fdw"
+
+#: sql_help.c:2775 sql_help.c:2778
+msgid "statistics_name"
+msgstr "назва_ÑтатиÑтики"
+
+#: sql_help.c:2779
+msgid "statistics_kind"
+msgstr "вид_ÑтатиÑтики"
+
+#: sql_help.c:2795
+msgid "subscription_name"
+msgstr "назва_підпиÑки"
+
+#: sql_help.c:2900
+msgid "source_table"
+msgstr "вихідна_таблицÑ"
+
+#: sql_help.c:2901
+msgid "like_option"
+msgstr "параметр_породженнÑ"
+
+#: sql_help.c:2967
+msgid "and like_option is:"
+msgstr "Ñ– параметр_породженнÑ:"
+
+#: sql_help.c:3019
+msgid "directory"
+msgstr "каталог"
+
+#: sql_help.c:3033
+msgid "parser_name"
+msgstr "назва_парÑера"
+
+#: sql_help.c:3034
+msgid "source_config"
+msgstr "початкова_конфігураціÑ"
+
+#: sql_help.c:3063
+msgid "start_function"
+msgstr "функціÑ_початку"
+
+#: sql_help.c:3064
+msgid "gettoken_function"
+msgstr "функціÑ_видачі_токену"
+
+#: sql_help.c:3065
+msgid "end_function"
+msgstr "функціÑ_завершеннÑ"
+
+#: sql_help.c:3066
+msgid "lextypes_function"
+msgstr "функціÑ_лекÑ_типів"
+
+#: sql_help.c:3067
+msgid "headline_function"
+msgstr "функціÑ_ÑтвореннÑ_заголовків"
+
+#: sql_help.c:3079
+msgid "init_function"
+msgstr "функціÑ_ініціалізації"
+
+#: sql_help.c:3080
+msgid "lexize_function"
+msgstr "функціÑ_виділеннÑ_лекÑем"
+
+#: sql_help.c:3093
+msgid "from_sql_function_name"
+msgstr "ім'Ñ_функції_з_sql"
+
+#: sql_help.c:3095
+msgid "to_sql_function_name"
+msgstr "ім'Ñ_функції_в_sql"
+
+#: sql_help.c:3121
+msgid "referenced_table_name"
+msgstr "ім'Ñ_залежної_таблиці"
+
+#: sql_help.c:3122
+msgid "transition_relation_name"
+msgstr "ім'Ñ_перехідного_відношеннÑ"
+
+#: sql_help.c:3125
+msgid "arguments"
+msgstr "аргументи"
+
+#: sql_help.c:3177
+msgid "label"
+msgstr "мітка"
+
+#: sql_help.c:3179
+msgid "subtype"
+msgstr "підтип"
+
+#: sql_help.c:3180
+msgid "subtype_operator_class"
+msgstr "клаÑ_оператора_підтипу"
+
+#: sql_help.c:3182
+msgid "canonical_function"
+msgstr "канонічна_функціÑ"
+
+#: sql_help.c:3183
+msgid "subtype_diff_function"
+msgstr "функціÑ_розбіжноÑтей_підтипу"
+
+#: sql_help.c:3184
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3186
+msgid "input_function"
+msgstr "функціÑ_вводу"
+
+#: sql_help.c:3187
+msgid "output_function"
+msgstr "функціÑ_виводу"
+
+#: sql_help.c:3188
+msgid "receive_function"
+msgstr "функціÑ_отриманнÑ"
+
+#: sql_help.c:3189
+msgid "send_function"
+msgstr "функціÑ_відправки"
+
+#: sql_help.c:3190
+msgid "type_modifier_input_function"
+msgstr "функціÑ_введеннÑ_модифікатора_типу"
+
+#: sql_help.c:3191
+msgid "type_modifier_output_function"
+msgstr "функціÑ_виводу_модифікатора_типу"
+
+#: sql_help.c:3192
+msgid "analyze_function"
+msgstr "функціÑ_аналізу"
+
+#: sql_help.c:3193
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3194
+msgid "internallength"
+msgstr "внутр_довжина"
+
+#: sql_help.c:3195
+msgid "alignment"
+msgstr "вирівнюваннÑ"
+
+#: sql_help.c:3196
+msgid "storage"
+msgstr "зберіганнÑ"
+
+#: sql_help.c:3197
+msgid "like_type"
+msgstr "тип_зразок"
+
+#: sql_help.c:3198
+msgid "category"
+msgstr "категоріÑ"
+
+#: sql_help.c:3199
+msgid "preferred"
+msgstr "привілейований"
+
+#: sql_help.c:3200
+msgid "default"
+msgstr "за_замовчуваннÑм"
+
+#: sql_help.c:3201
+msgid "element"
+msgstr "елемент"
+
+#: sql_help.c:3202
+msgid "delimiter"
+msgstr "роздільник"
+
+#: sql_help.c:3203
+msgid "collatable"
+msgstr "Ñортувальний"
+
+#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4076 sql_help.c:4559
+#: sql_help.c:4661 sql_help.c:4816 sql_help.c:4929 sql_help.c:5062
+msgid "with_query"
+msgstr "with_запит"
+
+#: sql_help.c:3302 sql_help.c:3988 sql_help.c:4578 sql_help.c:4584
+#: sql_help.c:4587 sql_help.c:4591 sql_help.c:4595 sql_help.c:4603
+#: sql_help.c:4835 sql_help.c:4841 sql_help.c:4844 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4860 sql_help.c:4931 sql_help.c:5081
+#: sql_help.c:5087 sql_help.c:5090 sql_help.c:5094 sql_help.c:5098
+#: sql_help.c:5106
+msgid "alias"
+msgstr "пÑевдонім"
+
+#: sql_help.c:3303 sql_help.c:4563 sql_help.c:4605 sql_help.c:4607
+#: sql_help.c:4611 sql_help.c:4613 sql_help.c:4614 sql_help.c:4615
+#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4862 sql_help.c:4864
+#: sql_help.c:4868 sql_help.c:4870 sql_help.c:4871 sql_help.c:4872
+#: sql_help.c:4938 sql_help.c:5066 sql_help.c:5108 sql_help.c:5110
+#: sql_help.c:5114 sql_help.c:5116 sql_help.c:5117 sql_help.c:5118
+msgid "from_item"
+msgstr "джерело_даних"
+
+#: sql_help.c:3305 sql_help.c:3788 sql_help.c:4126 sql_help.c:4940
+msgid "cursor_name"
+msgstr "ім'Ñ_курÑору"
+
+#: sql_help.c:3306 sql_help.c:3994 sql_help.c:4941
+msgid "output_expression"
+msgstr "вираз_результату"
+
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4562 sql_help.c:4664
+#: sql_help.c:4819 sql_help.c:4942 sql_help.c:5065
+msgid "output_name"
+msgstr "ім'Ñ_результату"
+
+#: sql_help.c:3323
+msgid "code"
+msgstr "код"
+
+#: sql_help.c:3728
+msgid "parameter"
+msgstr "параметр"
+
+#: sql_help.c:3751 sql_help.c:3752 sql_help.c:4151
+msgid "statement"
+msgstr "оператор"
+
+#: sql_help.c:3787 sql_help.c:4125
+msgid "direction"
+msgstr "напрÑмок"
+
+#: sql_help.c:3789 sql_help.c:4127
+msgid "where direction can be one of:"
+msgstr "де напрÑмок може бути одним із:"
+
+#: sql_help.c:3790 sql_help.c:3791 sql_help.c:3792 sql_help.c:3793
+#: sql_help.c:3794 sql_help.c:4128 sql_help.c:4129 sql_help.c:4130
+#: sql_help.c:4131 sql_help.c:4132 sql_help.c:4572 sql_help.c:4574
+#: sql_help.c:4675 sql_help.c:4677 sql_help.c:4829 sql_help.c:4831
+#: sql_help.c:5006 sql_help.c:5008 sql_help.c:5075 sql_help.c:5077
+msgid "count"
+msgstr "кількіÑÑ‚ÑŒ"
+
+#: sql_help.c:3897 sql_help.c:4349
+msgid "sequence_name"
+msgstr "ім'Ñ_поÑлідовноÑÑ‚Ñ–"
+
+#: sql_help.c:3915 sql_help.c:4367
+msgid "arg_name"
+msgstr "ім'Ñ_аргументу"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_type"
+msgstr "тип_аргументу"
+
+#: sql_help.c:3923 sql_help.c:4375
+msgid "loid"
+msgstr "код_вел_об'єкту"
+
+#: sql_help.c:3954
+msgid "remote_schema"
+msgstr "віддалена_Ñхема"
+
+#: sql_help.c:3957
+msgid "local_schema"
+msgstr "локальна_Ñхема"
+
+#: sql_help.c:3992
+msgid "conflict_target"
+msgstr "ціль_конфлікту"
+
+#: sql_help.c:3993
+msgid "conflict_action"
+msgstr "діÑ_при_конфлікті"
+
+#: sql_help.c:3996
+msgid "where conflict_target can be one of:"
+msgstr "де ціль_конфлікту може бути одним з:"
+
+#: sql_help.c:3997
+msgid "index_column_name"
+msgstr "ім'Ñ_ÑтовпцÑ_індекÑу"
+
+#: sql_help.c:3998
+msgid "index_expression"
+msgstr "вираз_індекÑу"
+
+#: sql_help.c:4001
+msgid "index_predicate"
+msgstr "предикат_індекÑу"
+
+#: sql_help.c:4003
+msgid "and conflict_action is one of:"
+msgstr "Ñ– діÑ_при_конфлікті одна з:"
+
+#: sql_help.c:4009 sql_help.c:4937
+msgid "sub-SELECT"
+msgstr "вкладений-SELECT"
+
+#: sql_help.c:4018 sql_help.c:4140 sql_help.c:4913
+msgid "channel"
+msgstr "канал"
+
+#: sql_help.c:4040
+msgid "lockmode"
+msgstr "режим_блокуваннÑ"
+
+#: sql_help.c:4041
+msgid "where lockmode is one of:"
+msgstr "де режим_Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð´Ð¸Ð½ з:"
+
+#: sql_help.c:4077
+msgid "target_table_name"
+msgstr "ім'Ñ_цілі_таблиці"
+
+#: sql_help.c:4078
+msgid "target_alias"
+msgstr "пÑевдонім_цілі"
+
+#: sql_help.c:4079
+msgid "data_source"
+msgstr "джерело_даних"
+
+#: sql_help.c:4080 sql_help.c:4608 sql_help.c:4865 sql_help.c:5111
+msgid "join_condition"
+msgstr "умова_поєднаннÑ"
+
+#: sql_help.c:4081
+msgid "when_clause"
+msgstr "when_твердженнÑ"
+
+#: sql_help.c:4082
+msgid "where data_source is:"
+msgstr "де джерело_даних:"
+
+#: sql_help.c:4083
+msgid "source_table_name"
+msgstr "ім'Ñ_початкова_таблиці"
+
+#: sql_help.c:4084
+msgid "source_query"
+msgstr "джерело_запит"
+
+#: sql_help.c:4085
+msgid "source_alias"
+msgstr "джерело_пÑевдоніма"
+
+#: sql_help.c:4086
+msgid "and when_clause is:"
+msgstr "Ñ– when_clause:"
+
+#: sql_help.c:4088
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4089
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4091
+msgid "merge_insert"
+msgstr "merge_insert"
+
+#: sql_help.c:4092
+msgid "and merge_insert is:"
+msgstr "Ñ– merge_insert:"
+
+#: sql_help.c:4095
+msgid "and merge_update is:"
+msgstr "Ñ– merge_update:"
+
+#: sql_help.c:4100
+msgid "and merge_delete is:"
+msgstr "Ñ– merge_delete:"
+
+#: sql_help.c:4141
+msgid "payload"
+msgstr "зміÑÑ‚"
+
+#: sql_help.c:4168
+msgid "old_role"
+msgstr "Ñтара_роль"
+
+#: sql_help.c:4169
+msgid "new_role"
+msgstr "нова_роль"
+
+#: sql_help.c:4208 sql_help.c:4417 sql_help.c:4425
+msgid "savepoint_name"
+msgstr "ім'Ñ_точки_збереженнÑ"
+
+#: sql_help.c:4565 sql_help.c:4623 sql_help.c:4822 sql_help.c:4880
+#: sql_help.c:5068 sql_help.c:5126
+msgid "grouping_element"
+msgstr "елемент_групуваннÑ"
+
+#: sql_help.c:4567 sql_help.c:4670 sql_help.c:4824 sql_help.c:5070
+msgid "window_name"
+msgstr "назва_вікна"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_definition"
+msgstr "визначеннÑ_вікна"
+
+#: sql_help.c:4569 sql_help.c:4583 sql_help.c:4627 sql_help.c:4672
+#: sql_help.c:4826 sql_help.c:4840 sql_help.c:4884 sql_help.c:5072
+#: sql_help.c:5086 sql_help.c:5130
+msgid "select"
+msgstr "виберіть"
+
+#: sql_help.c:4576 sql_help.c:4833 sql_help.c:5079
+msgid "where from_item can be one of:"
+msgstr "де джерело_даних може бути одним з:"
+
+#: sql_help.c:4579 sql_help.c:4585 sql_help.c:4588 sql_help.c:4592
+#: sql_help.c:4604 sql_help.c:4836 sql_help.c:4842 sql_help.c:4845
+#: sql_help.c:4849 sql_help.c:4861 sql_help.c:5082 sql_help.c:5088
+#: sql_help.c:5091 sql_help.c:5095 sql_help.c:5107
+msgid "column_alias"
+msgstr "пÑевдонім_ÑтовпцÑ"
+
+#: sql_help.c:4580 sql_help.c:4837 sql_help.c:5083
+msgid "sampling_method"
+msgstr "метод_вибірки"
+
+#: sql_help.c:4582 sql_help.c:4839 sql_help.c:5085
+msgid "seed"
+msgstr "початкове_чиÑло"
+
+#: sql_help.c:4586 sql_help.c:4625 sql_help.c:4843 sql_help.c:4882
+#: sql_help.c:5089 sql_help.c:5128
+msgid "with_query_name"
+msgstr "ім'Ñ_запиту_WITH"
+
+#: sql_help.c:4596 sql_help.c:4599 sql_help.c:4602 sql_help.c:4853
+#: sql_help.c:4856 sql_help.c:4859 sql_help.c:5099 sql_help.c:5102
+#: sql_help.c:5105
+msgid "column_definition"
+msgstr "визначеннÑ_ÑтовпцÑ"
+
+#: sql_help.c:4606 sql_help.c:4612 sql_help.c:4863 sql_help.c:4869
+#: sql_help.c:5109 sql_help.c:5115
+msgid "join_type"
+msgstr "тип_поєднаннÑ"
+
+#: sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_column"
+msgstr "Ñтовпець_поєднаннÑ"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5119
+msgid "and grouping_element can be one of:"
+msgstr "Ñ– елемент_Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути одним з:"
+
+#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5127
+msgid "and with_query is:"
+msgstr "і запит_WITH:"
+
+#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5131
+msgid "values"
+msgstr "значеннÑ"
+
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "insert"
+msgstr "вÑтавка"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "update"
+msgstr "оновленнÑ"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "delete"
+msgstr "видаленнÑ"
+
+#: sql_help.c:4633 sql_help.c:4890 sql_help.c:5136
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4635 sql_help.c:4892 sql_help.c:5138
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4665
+msgid "new_table"
+msgstr "нова_таблицÑ"
+
+#: sql_help.c:4736
+msgid "snapshot_id"
+msgstr "код_знімку"
+
+#: sql_help.c:5004
+msgid "sort_expression"
+msgstr "вираз_ÑортуваннÑ"
+
+#: sql_help.c:5148 sql_help.c:6132
+msgid "abort the current transaction"
+msgstr "перервати поточну транзакцію"
+
+#: sql_help.c:5154
+msgid "change the definition of an aggregate function"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ñ— функції"
+
+#: sql_help.c:5160
+msgid "change the definition of a collation"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° ÑортуваннÑ"
+
+#: sql_help.c:5166
+msgid "change the definition of a conversion"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ"
+
+#: sql_help.c:5172
+msgid "change a database"
+msgstr "змінити базу даних"
+
+#: sql_help.c:5178
+msgid "define default access privileges"
+msgstr "визначити права доÑтупу за замовчуваннÑм"
+
+#: sql_help.c:5184
+msgid "change the definition of a domain"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ"
+
+#: sql_help.c:5190
+msgid "change the definition of an event trigger"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ події"
+
+#: sql_help.c:5196
+msgid "change the definition of an extension"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ"
+
+#: sql_help.c:5202
+msgid "change the definition of a foreign-data wrapper"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° Ñторонніх даних"
+
+#: sql_help.c:5208
+msgid "change the definition of a foreign table"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñторонньої таблиці"
+
+#: sql_help.c:5214
+msgid "change the definition of a function"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—"
+
+#: sql_help.c:5220
+msgid "change role name or membership"
+msgstr "змінити назву ролі або членÑтва"
+
+#: sql_help.c:5226
+msgid "change the definition of an index"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу"
+
+#: sql_help.c:5232
+msgid "change the definition of a procedural language"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð½Ð¾Ñ— мови"
+
+#: sql_help.c:5238
+msgid "change the definition of a large object"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту"
+
+#: sql_help.c:5244
+msgid "change the definition of a materialized view"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ‚ÐµÑ€Ñ–Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ поданнÑ"
+
+#: sql_help.c:5250
+msgid "change the definition of an operator"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°"
+
+#: sql_help.c:5256
+msgid "change the definition of an operator class"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñа операторів"
+
+#: sql_help.c:5262
+msgid "change the definition of an operator family"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑімейÑтва операторів"
+
+#: sql_help.c:5268
+msgid "change the definition of a row-level security policy"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ безпеки на рівні Ñ€Ñдків"
+
+#: sql_help.c:5274
+msgid "change the definition of a procedure"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸"
+
+#: sql_help.c:5280
+msgid "change the definition of a publication"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—"
+
+#: sql_help.c:5286 sql_help.c:5388
+msgid "change a database role"
+msgstr "змінити роль бази даних"
+
+#: sql_help.c:5292
+msgid "change the definition of a routine"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸"
+
+#: sql_help.c:5298
+msgid "change the definition of a rule"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°"
+
+#: sql_help.c:5304
+msgid "change the definition of a schema"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñхеми"
+
+#: sql_help.c:5310
+msgid "change the definition of a sequence generator"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñƒ поÑлідовноÑÑ‚Ñ–"
+
+#: sql_help.c:5316
+msgid "change the definition of a foreign server"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñтороннього Ñерверу"
+
+#: sql_help.c:5322
+msgid "change the definition of an extended statistics object"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð±'єкту розширеної ÑтатиÑтики"
+
+#: sql_help.c:5328
+msgid "change the definition of a subscription"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки"
+
+#: sql_help.c:5334
+msgid "change a server configuration parameter"
+msgstr "змінити параметр конфігурації Ñервера"
+
+#: sql_help.c:5340
+msgid "change the definition of a table"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–"
+
+#: sql_help.c:5346
+msgid "change the definition of a tablespace"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору"
+
+#: sql_help.c:5352
+msgid "change the definition of a text search configuration"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— текÑтового пошуку"
+
+#: sql_help.c:5358
+msgid "change the definition of a text search dictionary"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñловника текÑтового пошуку"
+
+#: sql_help.c:5364
+msgid "change the definition of a text search parser"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ñера текÑтового пошуку"
+
+#: sql_help.c:5370
+msgid "change the definition of a text search template"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° текÑтового пошуку"
+
+#: sql_help.c:5376
+msgid "change the definition of a trigger"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ"
+
+#: sql_help.c:5382
+msgid "change the definition of a type"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ"
+
+#: sql_help.c:5394
+msgid "change the definition of a user mapping"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ñ–Ñтавлень кориÑтувачів"
+
+#: sql_help.c:5400
+msgid "change the definition of a view"
+msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ"
+
+#: sql_help.c:5406
+msgid "collect statistics about a database"
+msgstr "зібрати ÑтатиÑтику про базу даних"
+
+#: sql_help.c:5412 sql_help.c:6210
+msgid "start a transaction block"
+msgstr "розпочати транзакцію"
+
+#: sql_help.c:5418
+msgid "invoke a procedure"
+msgstr "викликати процедуру"
+
+#: sql_help.c:5424
+msgid "force a write-ahead log checkpoint"
+msgstr "провеÑти контрольну точку в журналі попереднього запиÑу"
+
+#: sql_help.c:5430
+msgid "close a cursor"
+msgstr "закрити курÑор"
+
+#: sql_help.c:5436
+msgid "cluster a table according to an index"
+msgstr "перегрупувати таблицю за індекÑом"
+
+#: sql_help.c:5442
+msgid "define or change the comment of an object"
+msgstr "задати або змінити коментар об'єкта"
+
+#: sql_help.c:5448 sql_help.c:6006
+msgid "commit the current transaction"
+msgstr "затвердити поточну транзакцію"
+
+#: sql_help.c:5454
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "затвердити транзакцію, раніше підготовлену до двохфазного затвердженнÑ"
+
+#: sql_help.c:5460
+msgid "copy data between a file and a table"
+msgstr "копіювати дані між файлом та таблицею"
+
+#: sql_help.c:5466
+msgid "define a new access method"
+msgstr "визначити новий метод доÑтупу"
+
+#: sql_help.c:5472
+msgid "define a new aggregate function"
+msgstr "визначити нову агрегатну функцію"
+
+#: sql_help.c:5478
+msgid "define a new cast"
+msgstr "визначити Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²"
+
+#: sql_help.c:5484
+msgid "define a new collation"
+msgstr "визначити нове правило ÑортуваннÑ"
+
+#: sql_help.c:5490
+msgid "define a new encoding conversion"
+msgstr "визначити нове Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ"
+
+#: sql_help.c:5496
+msgid "create a new database"
+msgstr "Ñтворити нову базу даних"
+
+#: sql_help.c:5502
+msgid "define a new domain"
+msgstr "визначити новий домен"
+
+#: sql_help.c:5508
+msgid "define a new event trigger"
+msgstr "визначити новий тригер події"
+
+#: sql_help.c:5514
+msgid "install an extension"
+msgstr "вÑтановити розширеннÑ"
+
+#: sql_help.c:5520
+msgid "define a new foreign-data wrapper"
+msgstr "визначити нове джерело Ñторонніх даних"
+
+#: sql_help.c:5526
+msgid "define a new foreign table"
+msgstr "визначити нову Ñторонню таблицю"
+
+#: sql_help.c:5532
+msgid "define a new function"
+msgstr "визначити нову функцію"
+
+#: sql_help.c:5538 sql_help.c:5598 sql_help.c:5700
+msgid "define a new database role"
+msgstr "визначити нову роль бази даних"
+
+#: sql_help.c:5544
+msgid "define a new index"
+msgstr "визначити новий індекÑ"
+
+#: sql_help.c:5550
+msgid "define a new procedural language"
+msgstr "визначити нову процедурну мову"
+
+#: sql_help.c:5556
+msgid "define a new materialized view"
+msgstr "визначити нове матеріалізоване поданнÑ"
+
+#: sql_help.c:5562
+msgid "define a new operator"
+msgstr "визначити новий оператор"
+
+#: sql_help.c:5568
+msgid "define a new operator class"
+msgstr "визначити новий ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°"
+
+#: sql_help.c:5574
+msgid "define a new operator family"
+msgstr "визначити нове ÑімейÑтво операторів"
+
+#: sql_help.c:5580
+msgid "define a new row-level security policy for a table"
+msgstr "визначити нову політику безпеки на рівні Ñ€Ñдків Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–"
+
+#: sql_help.c:5586
+msgid "define a new procedure"
+msgstr "визначити нову процедуру"
+
+#: sql_help.c:5592
+msgid "define a new publication"
+msgstr "визначити нову публікацію"
+
+#: sql_help.c:5604
+msgid "define a new rewrite rule"
+msgstr "визначити нове правило перезапиÑу"
+
+#: sql_help.c:5610
+msgid "define a new schema"
+msgstr "визначити нову Ñхему"
+
+#: sql_help.c:5616
+msgid "define a new sequence generator"
+msgstr "визначити новий генератор поÑлідовноÑтей"
+
+#: sql_help.c:5622
+msgid "define a new foreign server"
+msgstr "визначити новий Ñторонній Ñервер"
+
+#: sql_help.c:5628
+msgid "define extended statistics"
+msgstr "визначити розширену ÑтатиÑтику"
+
+#: sql_help.c:5634
+msgid "define a new subscription"
+msgstr "визначити нову підпиÑку"
+
+#: sql_help.c:5640
+msgid "define a new table"
+msgstr "визначити нову таблицю"
+
+#: sql_help.c:5646 sql_help.c:6168
+msgid "define a new table from the results of a query"
+msgstr "визначити нову таблицю з результатів запиту"
+
+#: sql_help.c:5652
+msgid "define a new tablespace"
+msgstr "визначити новий табличний проÑÑ‚Ñ–Ñ€"
+
+#: sql_help.c:5658
+msgid "define a new text search configuration"
+msgstr "визначити нову конфігурацію текÑтового пошуку"
+
+#: sql_help.c:5664
+msgid "define a new text search dictionary"
+msgstr "визначити новий Ñловник текÑтового пошуку"
+
+#: sql_help.c:5670
+msgid "define a new text search parser"
+msgstr "визначити новий аналізатор текÑтового пошуку"
+
+#: sql_help.c:5676
+msgid "define a new text search template"
+msgstr "визначити новий шаблон текÑтового пошуку"
+
+#: sql_help.c:5682
+msgid "define a new transform"
+msgstr "визначити нове перетвореннÑ"
+
+#: sql_help.c:5688
+msgid "define a new trigger"
+msgstr "визначити новий тригер"
+
+#: sql_help.c:5694
+msgid "define a new data type"
+msgstr "визначити новий тип даних"
+
+#: sql_help.c:5706
+msgid "define a new mapping of a user to a foreign server"
+msgstr "визначити нове зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ñтороннього Ñервера"
+
+#: sql_help.c:5712
+msgid "define a new view"
+msgstr "визначити нове поданнÑ"
+
+#: sql_help.c:5718
+msgid "deallocate a prepared statement"
+msgstr "звільнити підготовлену команду"
+
+#: sql_help.c:5724
+msgid "define a cursor"
+msgstr "визначити курÑор"
+
+#: sql_help.c:5730
+msgid "delete rows of a table"
+msgstr "видалити Ñ€Ñдки таблиці"
+
+#: sql_help.c:5736
+msgid "discard session state"
+msgstr "очиÑтити Ñтан ÑеÑÑ–Ñ—"
+
+#: sql_help.c:5742
+msgid "execute an anonymous code block"
+msgstr "виконати анонімний блок коду"
+
+#: sql_help.c:5748
+msgid "remove an access method"
+msgstr "видалити метод доÑтупу"
+
+#: sql_help.c:5754
+msgid "remove an aggregate function"
+msgstr "видалити агрегатну функцію"
+
+#: sql_help.c:5760
+msgid "remove a cast"
+msgstr "видалити Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²"
+
+#: sql_help.c:5766
+msgid "remove a collation"
+msgstr "видалити правило ÑортуваннÑ"
+
+#: sql_help.c:5772
+msgid "remove a conversion"
+msgstr "видалити перетвореннÑ"
+
+#: sql_help.c:5778
+msgid "remove a database"
+msgstr "видалити базу даних"
+
+#: sql_help.c:5784
+msgid "remove a domain"
+msgstr "видалити домен"
+
+#: sql_help.c:5790
+msgid "remove an event trigger"
+msgstr "видалити тригер події"
+
+#: sql_help.c:5796
+msgid "remove an extension"
+msgstr "видалити розширеннÑ"
+
+#: sql_help.c:5802
+msgid "remove a foreign-data wrapper"
+msgstr "видалити джерело Ñторонніх даних"
+
+#: sql_help.c:5808
+msgid "remove a foreign table"
+msgstr "видалити Ñторонню таблицю"
+
+#: sql_help.c:5814
+msgid "remove a function"
+msgstr "видалити функцію"
+
+#: sql_help.c:5820 sql_help.c:5886 sql_help.c:5988
+msgid "remove a database role"
+msgstr "видалити роль бази даних"
+
+#: sql_help.c:5826
+msgid "remove an index"
+msgstr "видалити індекÑ"
+
+#: sql_help.c:5832
+msgid "remove a procedural language"
+msgstr "видалити процедурну мову"
+
+#: sql_help.c:5838
+msgid "remove a materialized view"
+msgstr "видалити матеріалізоване поданнÑ"
+
+#: sql_help.c:5844
+msgid "remove an operator"
+msgstr "видалити оператор"
+
+#: sql_help.c:5850
+msgid "remove an operator class"
+msgstr "видалити ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²"
+
+#: sql_help.c:5856
+msgid "remove an operator family"
+msgstr "видалити ÑімейÑтво операторів"
+
+#: sql_help.c:5862
+msgid "remove database objects owned by a database role"
+msgstr "видалити об'єкти бази даних, що належать ролі"
+
+#: sql_help.c:5868
+msgid "remove a row-level security policy from a table"
+msgstr "видалити політику безпеки на рівні Ñ€Ñдків з таблиці"
+
+#: sql_help.c:5874
+msgid "remove a procedure"
+msgstr "видалити процедуру"
+
+#: sql_help.c:5880
+msgid "remove a publication"
+msgstr "видалити публікацію"
+
+#: sql_help.c:5892
+msgid "remove a routine"
+msgstr "видалити підпрограму"
+
+#: sql_help.c:5898
+msgid "remove a rewrite rule"
+msgstr "видалити правило перезапиÑу"
+
+#: sql_help.c:5904
+msgid "remove a schema"
+msgstr "видалити Ñхему"
+
+#: sql_help.c:5910
+msgid "remove a sequence"
+msgstr "видалити поÑлідовніÑÑ‚ÑŒ"
+
+#: sql_help.c:5916
+msgid "remove a foreign server descriptor"
+msgstr "видалити Ð¾Ð¿Ð¸Ñ Ñтороннього Ñерверу"
+
+#: sql_help.c:5922
+msgid "remove extended statistics"
+msgstr "видалити розширену ÑтатиÑтику"
+
+#: sql_help.c:5928
+msgid "remove a subscription"
+msgstr "видалити підпиÑку"
+
+#: sql_help.c:5934
+msgid "remove a table"
+msgstr "видалити таблицю"
+
+#: sql_help.c:5940
+msgid "remove a tablespace"
+msgstr "видалити табличний проÑÑ‚Ñ–Ñ€"
+
+#: sql_help.c:5946
+msgid "remove a text search configuration"
+msgstr "видалити конфігурацію тектового пошуку"
+
+#: sql_help.c:5952
+msgid "remove a text search dictionary"
+msgstr "видалити Ñловник тектового пошуку"
+
+#: sql_help.c:5958
+msgid "remove a text search parser"
+msgstr "видалити парÑер тектового пошуку"
+
+#: sql_help.c:5964
+msgid "remove a text search template"
+msgstr "видалити шаблон тектового пошуку"
+
+#: sql_help.c:5970
+msgid "remove a transform"
+msgstr "видалити перетвореннÑ"
+
+#: sql_help.c:5976
+msgid "remove a trigger"
+msgstr "видалити тригер"
+
+#: sql_help.c:5982
+msgid "remove a data type"
+msgstr "видалити тип даних"
+
+#: sql_help.c:5994
+msgid "remove a user mapping for a foreign server"
+msgstr "видалити зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ñтороннього Ñерверу"
+
+#: sql_help.c:6000
+msgid "remove a view"
+msgstr "видалити поданнÑ"
+
+#: sql_help.c:6012
+msgid "execute a prepared statement"
+msgstr "виконати підготовлену команду"
+
+#: sql_help.c:6018
+msgid "show the execution plan of a statement"
+msgstr "показати план Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸"
+
+#: sql_help.c:6024
+msgid "retrieve rows from a query using a cursor"
+msgstr "отримати Ñ€Ñдки запиту з курÑору"
+
+#: sql_help.c:6030
+msgid "define access privileges"
+msgstr "визначити права доÑтупу"
+
+#: sql_help.c:6036
+msgid "import table definitions from a foreign server"
+msgstr "імпортувати Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ зі Ñтороннього Ñерверу"
+
+#: sql_help.c:6042
+msgid "create new rows in a table"
+msgstr "Ñтворити нові Ñ€Ñдки в таблиці"
+
+#: sql_help.c:6048
+msgid "listen for a notification"
+msgstr "очікувати на повідомленнÑ"
+
+#: sql_help.c:6054
+msgid "load a shared library file"
+msgstr "завантажити файл Ñпільної бібліотеки"
+
+#: sql_help.c:6060
+msgid "lock a table"
+msgstr "заблокувати таблицю"
+
+#: sql_help.c:6066
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "умовно вÑтавити, оновити або видалити Ñ€Ñдки таблиці"
+
+#: sql_help.c:6072
+msgid "position a cursor"
+msgstr "розташувати курÑор"
+
+#: sql_help.c:6078
+msgid "generate a notification"
+msgstr "згенерувати повідомленнÑ"
+
+#: sql_help.c:6084
+msgid "prepare a statement for execution"
+msgstr "підготувати команду Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ"
+
+#: sql_help.c:6090
+msgid "prepare the current transaction for two-phase commit"
+msgstr "підготувати поточну транзакцію Ð´Ð»Ñ Ð´Ð²Ð¾Ñ…Ñ„Ð°Ð·Ð½Ð¾Ð³Ð¾ затвердженнÑ"
+
+#: sql_help.c:6096
+msgid "change the ownership of database objects owned by a database role"
+msgstr "змінити влаÑника об'єктів БД, що належать заданій ролі"
+
+#: sql_help.c:6102
+msgid "replace the contents of a materialized view"
+msgstr "замінити вміÑÑ‚ матеріалізованого поданнÑ"
+
+#: sql_help.c:6108
+msgid "rebuild indexes"
+msgstr "перебудувати індекÑи"
+
+#: sql_help.c:6114
+msgid "release a previously defined savepoint"
+msgstr "звільнити раніше визначену точку збереженнÑ"
+
+#: sql_help.c:6120
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "відновити початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ виконаннÑ"
+
+#: sql_help.c:6126
+msgid "remove access privileges"
+msgstr "видалити права доÑтупу"
+
+#: sql_help.c:6138
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "ÑкаÑувати транзакцію, раніше підготовлену до двохфазного затвердженнÑ"
+
+#: sql_help.c:6144
+msgid "roll back to a savepoint"
+msgstr "відкотитиÑÑ Ð´Ð¾ точки збереженнÑ"
+
+#: sql_help.c:6150
+msgid "define a new savepoint within the current transaction"
+msgstr "визначити нову точку Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð² рамках поточної транзакції"
+
+#: sql_help.c:6156
+msgid "define or change a security label applied to an object"
+msgstr "визначити або змінити мітку безпеки, заÑтоÑовану до об'єкта"
+
+#: sql_help.c:6162 sql_help.c:6216 sql_help.c:6252
+msgid "retrieve rows from a table or view"
+msgstr "отримати Ñ€Ñдки з таблиці або поданнÑ"
+
+#: sql_help.c:6174
+msgid "change a run-time parameter"
+msgstr "змінити параметр виконаннÑ"
+
+#: sql_help.c:6180
+msgid "set constraint check timing for the current transaction"
+msgstr "вÑтановити Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— транзакції"
+
+#: sql_help.c:6186
+msgid "set the current user identifier of the current session"
+msgstr "вÑтановити ідентифікатор поточного кориÑтувача в поточній ÑеÑÑ–Ñ—"
+
+#: sql_help.c:6192
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "вÑтановити ідентифікатор кориÑтувача ÑеÑÑ–Ñ— й ідентифікатор поточного кориÑтувача в поточній ÑеÑÑ–Ñ—"
+
+#: sql_help.c:6198
+msgid "set the characteristics of the current transaction"
+msgstr "вÑтановити характериÑтики поточної транзакції"
+
+#: sql_help.c:6204
+msgid "show the value of a run-time parameter"
+msgstr "показати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° виконаннÑ"
+
+#: sql_help.c:6222
+msgid "empty a table or set of tables"
+msgstr "очиÑтити таблицю або декілька таблиць"
+
+#: sql_help.c:6228
+msgid "stop listening for a notification"
+msgstr "припинити Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ"
+
+#: sql_help.c:6234
+msgid "update rows of a table"
+msgstr "змінити Ñ€Ñдки таблиці"
+
+#: sql_help.c:6240
+msgid "garbage-collect and optionally analyze a database"
+msgstr "виконати збір ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ñ– проаналізувати базу даних"
+
+#: sql_help.c:6246
+msgid "compute a set of rows"
+msgstr "отримати набір Ñ€Ñдків"
+
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 можна викориÑтовувати лише в неінтерактивному режимі"
+
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid "Type \"help\" for help.\n\n"
+msgstr "Введіть \"help\", щоб отримати допомогу.\n\n"
+
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "не вдалоÑÑ Ð²Ñтановити параметр друку \"%s\""
+
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "зайвий аргумент \"%s\" проігнорований"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ехе файл влаÑної програми"
+
+#: tab-complete.c:6078
+#, c-format
+msgid "tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr "помилка запиту Tab-доповненнÑ: %s\n"
+"Запит:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\": очікувалоÑÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ðµ значеннÑ"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "неправильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\": очікувалоÑÑ Ñ†Ñ–Ð»Ðµ чиÑло"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "неправильне ім'Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\"\n"
+"ДопуÑтимі значеннÑ: %s."
+
diff --git a/src/bin/psql/po/zh_CN.po b/src/bin/psql/po/zh_CN.po
new file mode 100644
index 0000000..43eff2c
--- /dev/null
+++ b/src/bin/psql/po/zh_CN.po
@@ -0,0 +1,6476 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:45+0000\n"
+"PO-Revision-Date: 2021-08-16 16:00+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Bookmarks: 175,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.5.7\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的:"
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299
+#, c-format
+msgid "could not identify current directory: %m"
+msgstr "无法确认当å‰ç›®å½•: %m"
+
+#: ../../common/exec.c:155
+#, c-format
+msgid "invalid binary \"%s\""
+msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:205
+#, c-format
+msgid "could not read binary \"%s\""
+msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\""
+
+#: ../../common/exec.c:213
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ"
+
+#: ../../common/exec.c:269 ../../common/exec.c:308
+#, c-format
+msgid "could not change directory to \"%s\": %m"
+msgstr "无法跳转到目录 \"%s\" 中: %m"
+
+#: ../../common/exec.c:286
+#, c-format
+msgid "could not read symbolic link \"%s\": %m"
+msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m"
+
+#: ../../common/exec.c:409
+msgid "%s() failed: %m"
+msgstr "%s()失败: %m"
+
+#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659
+#: command.c:1315 command.c:3246 command.c:3295 command.c:3412 input.c:227
+#: mainloop.c:81 mainloop.c:402
+#, 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:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "无法找到有效的用户ID %ld: %s"
+
+#: ../../common/username.c:45 command.c:565
+msgid "user does not exist"
+msgstr "用户ä¸å­˜åœ¨"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "用户å查找失败:错误代ç %lu"
+
+#: ../../common/wait_error.c:45
+#, c-format
+msgid "command not executable"
+msgstr "无法执行命令"
+
+#: ../../common/wait_error.c:49
+#, c-format
+msgid "command not found"
+msgstr "命令没有找到"
+
+#: ../../common/wait_error.c:54
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, 退出ç ä¸º %d"
+
+#: ../../common/wait_error.c:62
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­è¿›ç¨‹è¢«ä¾‹å¤–(exception) 0x%X 终止"
+
+#: ../../common/wait_error.c:66
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­è¿›ç¨‹è¢«ä¿¡å· %d 终止: %s"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­è¿›ç¨‹å·²é€€å‡º, æœªçŸ¥çŠ¶æ€ %d"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "å–消å‘é€çš„请求\n"
+
+#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210
+msgid "Could not send cancel request: "
+msgstr "无法å‘é€å–消请求: "
+
+#: ../../fe_utils/print.c:336
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行记录)"
+
+#: ../../fe_utils/print.c:3039
+#, c-format
+msgid "Interrupted\n"
+msgstr "已中断\n"
+
+#: ../../fe_utils/print.c:3103
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "无法对表的内容增加标题:å·²ç»è¶…过%d列的数é‡.\n"
+
+#: ../../fe_utils/print.c:3143
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "无法对表的内容添加å•å…ƒ: 总共有%d个å•å…ƒè¶…过.\n"
+
+#: ../../fe_utils/print.c:3401
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "æ— æ•ˆçš„è¾“å‡ºæ ¼å¼ (内部错误): %d"
+
+#: ../../fe_utils/psqlscan.l:697
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "跳过å˜é‡ \"%s\"的递归扩展"
+
+#: command.c:230
+#, c-format
+msgid "invalid command \\%s"
+msgstr "无效的命令 \\%s"
+
+#: command.c:232
+#, c-format
+msgid "Try \\? for help."
+msgstr "使用\\?获å–帮助."
+
+#: command.c:250
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s:忽略多余的å‚æ•° \"%s\""
+
+#: command.c:302
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "忽略\\%s命令;使用\\endif或Ctrl-C退出当å‰\\ifå—"
+
+#: command.c:563
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "无法获å–用户ID %ld: %s对应的home 目录"
+
+#: command.c:581
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "\\%s: 无法切æ¢ç›®å½•è‡³ \"%s\": %m"
+
+#: command.c:606
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "ä½ ç›®å‰æ²¡æœ‰è¿žæŽ¥åˆ°æ•°æ®åº“.\n"
+
+#: command.c:616
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份, 在地å€\"%3$s\", 端å£\"%4$s\"连接到数æ®åº“ \"%1$s\"\n"
+
+#: command.c:619
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份,通过套接字\"%3$s\"在端å£\"%4$s\"连接到数æ®åº“ \"%1$s\"\n"
+
+#: command.c:625
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份, 在主机\"%3$s\" (åœ°å€ \"%4$s\"), 端å£\"%5$s\"连接到数æ®åº“ \"%1$s\".\n"
+
+#: command.c:628
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "以用户 \"%2$s\" 的身份, 在主机\"%3$s\", 端å£\"%4$s\"连接到数æ®åº“ \"%1$s\"\n"
+
+#: command.c:1012 command.c:1121 command.c:2602
+#, c-format
+msgid "no query buffer"
+msgstr "没有查询缓存区"
+
+#: command.c:1045 command.c:5304
+#, c-format
+msgid "invalid line number: %s"
+msgstr "è¡Œå·æ— æ•ˆ: %s"
+
+#: command.c:1112
+#, c-format
+msgid "The server (version %s) does not support editing function source."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒç¼–辑函数æºç ."
+
+#: command.c:1115
+#, c-format
+msgid "The server (version %s) does not support editing view definitions."
+msgstr "æœåŠ¡å™¨ï¼ˆç‰ˆæœ¬%s)ä¸æ”¯æŒç¼–辑视图定义."
+
+#: command.c:1197
+msgid "No changes"
+msgstr "没有å‘生更改"
+
+#: command.c:1276
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s:无效的编ç å称或找ä¸åˆ°è½¬æ¢ç¨‹åº"
+
+#: command.c:1311 command.c:2052 command.c:3242 command.c:3434 command.c:5406
+#: common.c:174 common.c:223 common.c:392 common.c:1248 common.c:1276
+#: common.c:1385 common.c:1492 common.c:1530 copy.c:488 copy.c:709 help.c:62
+#: large_obj.c:157 large_obj.c:192 large_obj.c:254 startup.c:298
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.c:1318
+msgid "There is no previous error."
+msgstr "没有之å‰çš„错误。"
+
+#: command.c:1431
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s:缺少一个å³æ‹¬å¼§"
+
+#: command.c:1608 command.c:1913 command.c:1927 command.c:1944 command.c:2106
+#: command.c:2342 command.c:2569 command.c:2609
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s:缺少所需å‚æ•°"
+
+#: command.c:1739
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif:ä¸èƒ½å‡ºçŽ°åœ¨\\else之åŽ"
+
+#: command.c:1744
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: ä¸åŒ¹é…\\if"
+
+#: command.c:1808
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: ä¸èƒ½å‡ºçŽ°åœ¨ \\else"
+
+#: command.c:1813
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: ä¸åŒ¹é…\\if"
+
+#: command.c:1853
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif:ä¸åŒ¹é…\\if"
+
+#: command.c:2008
+msgid "Query buffer is empty."
+msgstr "查询缓存区是空的."
+
+#: command.c:2030
+msgid "Enter new password: "
+msgstr "输入新的密ç ï¼š"
+
+#: command.c:2031
+msgid "Enter it again: "
+msgstr "å†è¾“入一é:"
+
+#: command.c:2035
+#, c-format
+msgid "Passwords didn't match."
+msgstr "å£ä»¤ä¸åŒ¹é…."
+
+#: command.c:2135
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s:无法读å–å˜é‡çš„值"
+
+#: command.c:2238
+msgid "Query buffer reset (cleared)."
+msgstr "查询缓存区é‡ç½®(已清空)."
+
+#: command.c:2260
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "写入历å²è®°å½•åˆ°æ–‡ä»¶ \"%s\".\n"
+
+#: command.c:2347
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: 环境å˜é‡ä¸èƒ½åŒ…å« \"=\""
+
+#: command.c:2399
+#, c-format
+msgid "The server (version %s) does not support showing function source."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒæ˜¾ç¤ºå‡½æ•°æºç ."
+
+#: command.c:2402
+#, c-format
+msgid "The server (version %s) does not support showing view definitions."
+msgstr "æœåŠ¡å™¨ï¼ˆç‰ˆæœ¬%s)ä¸æ”¯æŒæ˜¾ç¤ºè§†å›¾å®šä¹‰."
+
+#: command.c:2409
+#, c-format
+msgid "function name is required"
+msgstr "需è¦å‡½æ•°å"
+
+#: command.c:2411
+#, c-format
+msgid "view name is required"
+msgstr "需è¦è§†å›¾å"
+
+#: command.c:2541
+msgid "Timing is on."
+msgstr "å¯ç”¨è®¡æ—¶åŠŸèƒ½."
+
+#: command.c:2543
+msgid "Timing is off."
+msgstr "åœæ­¢è®¡æ—¶åŠŸèƒ½."
+
+#: command.c:2628 command.c:2656 command.c:3873 command.c:3876 command.c:3879
+#: command.c:3885 command.c:3887 command.c:3913 command.c:3923 command.c:3935
+#: command.c:3949 command.c:3976 command.c:4034 common.c:70 copy.c:331
+#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+#: command.c:3047 startup.c:237 startup.c:287
+msgid "Password: "
+msgstr "å£ä»¤: "
+
+#: command.c:3052 startup.c:284
+#, c-format
+msgid "Password for user %s: "
+msgstr "用户 %s çš„å£ä»¤ï¼š"
+
+#: command.c:3104
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "使用连接字符串时,ä¸è¦å•ç‹¬æ供用户ã€ä¸»æœºæˆ–端å£"
+
+#: command.c:3139
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "ä¸å­˜åœ¨å¯ä»Žä¸­é‡å¤ä½¿ç”¨å‚æ•°çš„æ•°æ®åº“连接"
+
+#: command.c:3440
+#, c-format
+msgid "Previous connection kept"
+msgstr "ä¿ç•™ä¸Šä¸€æ¬¡è¿žæŽ¥"
+
+#: command.c:3446
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\连接:%s"
+
+#: command.c:3502
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "您现在已ç»è¿žæŽ¥åˆ°æ•°æ®åº“ \"%s\", 用户 \"%s\",åœ°å€ \"%s\",端å£å· \"%s\".\n"
+
+#: command.c:3505
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "您现在已ç»è¿žæŽ¥åˆ°æ•°æ®åº“ \"%s\", 用户å \"%s\" , 套接字 \"%s\", 端å£å· \"%s\".\n"
+
+#: command.c:3511
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "您现在已ç»è¿žæŽ¥åˆ°æ•°æ®åº“ \"%s\", 用户 \"%s\",主机 \"%s\"(åœ°å€ \"%s\"),端å£å· \"%s\".\n"
+
+#: command.c:3514
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "您现在已ç»è¿žæŽ¥åˆ°æ•°æ®åº“ \"%s\", 用户 \"%s\",主机 \"%s\",端å£å· \"%s\".\n"
+
+#: command.c:3519
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "您现在已ç»è¿žæŽ¥åˆ°æ•°æ®åº“ \"%s\",用户 \"%s\".\n"
+
+#: command.c:3559
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s, æœåŠ¡å™¨ %s)\n"
+
+#: command.c:3567
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"警告:%s 主版本%s,æœåŠ¡å™¨ä¸»ç‰ˆæœ¬ä¸º%s.\n"
+" 一些psql功能å¯èƒ½æ— æ³•æ­£å¸¸ä½¿ç”¨.\n"
+
+#: command.c:3606
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n"
+msgstr "SSL 连接(å议:%s,密ç ï¼š%s,密钥ä½ï¼š%s,压缩:%s)\n"
+
+#: command.c:3607 command.c:3608 command.c:3609
+msgid "unknown"
+msgstr "未知"
+
+#: command.c:3610 help.c:45
+msgid "off"
+msgstr "关闭"
+
+#: command.c:3610 help.c:45
+msgid "on"
+msgstr "å¼€å¯"
+
+#: command.c:3624
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI加密连接\n"
+
+#: command.c:3644
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"警告:æ¥è‡ª Windows 代ç é¡µ (%u) 的控制å°ä»£ç é¡µ (%u) 的差异\n"
+" 8-bit 字符å¯èƒ½æ— æ³•æ­£å¸¸å·¥ä½œã€‚请查阅 psql å‚考\n"
+" 页 \"Windows 用户注æ„事项\" 的详细说明.\n"
+
+#: command.c:3749
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "必须设置环境å˜é‡ PSQL_EDITOR_LINENUMBER_ARG,用于指定行å·"
+
+#: command.c:3778
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "无法å¯åŠ¨ç¼–辑器 \"%s\""
+
+#: command.c:3780
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "无法å¯åŠ¨ /bin/sh"
+
+#: command.c:3830
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "找ä¸åˆ°ä¸´æ—¶ç›®å½•ï¼š%s"
+
+#: command.c:3857
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "无法打开临时文件 \"%s\": %m"
+
+#: command.c:4193
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset:模糊的缩写\"%s\"åŒæ—¶åŒ¹é…\"%s\"å’Œ\"%s\""
+
+#: command.c:4213
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: å…许的格å¼æ˜¯ aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4232
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: 所å…许使用的文本风格是ascii, old-ascii, unicode"
+
+#: command.c:4247
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset:å…许的 Unicode 边界线型是 single å’Œ double"
+
+#: command.c:4262
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset:å…许的 Unicode 列线型是 single å’Œ double"
+
+#: command.c:4277
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset:å…许的 Unicode 页眉线型是 single å’Œ double"
+
+#: command.c:4320
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep必须是å•å­—节字符"
+
+#: command.c:4325
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsepä¸èƒ½æ˜¯åŒå¼•å·ã€æ¢è¡Œç¬¦æˆ–回车符"
+
+#: command.c:4462 command.c:4650
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: ä¸æ˜Žé€‰é¡¹: %s"
+
+#: command.c:4482
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "边缘风格是 %d.\n"
+
+#: command.c:4488
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "目标宽度未设置.\n"
+
+#: command.c:4490
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "目标宽度为 %d.\n"
+
+#: command.c:4497
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "扩展显示已打开.\n"
+
+#: command.c:4499
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "扩展显示已自动打开.\n"
+
+#: command.c:4501
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "扩展显示已关闭.\n"
+
+#: command.c:4507
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSV的字段分隔符是\"%s\".\n"
+
+#: command.c:4515 command.c:4523
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "æ ä½åˆ†éš”符å·æ˜¯0字节\n"
+
+#: command.c:4517
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "æ ä½åˆ†éš”符å·æ˜¯ \"%s\".\n"
+
+#: command.c:4530
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "打开默认步进器.\n"
+
+#: command.c:4532
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "关闭默认步进器.\n"
+
+#: command.c:4538
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "输出格å¼æ˜¯ %s.\n"
+
+#: command.c:4544
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "文本的风格是%s. \n"
+
+#: command.c:4551
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr " \"%s\" 是空值显示.\n"
+
+#: command.c:4559
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "å¯åŠ¨è¯­è¨€çŽ¯å¢ƒè°ƒæ•´åŽçš„数值输出.\n"
+
+#: command.c:4561
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "关闭语言环境调整åŽçš„数值输出.\n"
+
+#: command.c:4568
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "显示大é‡æ•°æ®æ—¶ä½¿ç”¨åˆ†é¡µå™¨.\n"
+
+#: command.c:4570
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "总是使用分页器.\n"
+
+#: command.c:4572
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "ä¸ä½¿ç”¨åˆ†é¡µå™¨.\n"
+
+#: command.c:4578
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "分页器ä¸èƒ½è¢«ç”¨äºŽå°‘于%dè¡Œ.\n"
+
+#: command.c:4588 command.c:4598
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "记录分隔符å·æ˜¯ 0字节.\n"
+
+#: command.c:4590
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "记录分隔符å·æ˜¯ <newline>.\n"
+
+#: command.c:4592
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "记录分隔符å·æ˜¯ \"%s\".\n"
+
+#: command.c:4605
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "表属性是 \"%s\".\n"
+
+#: command.c:4608
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "未设置数æ®è¡¨å±žæ€§.\n"
+
+#: command.c:4615
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "标题是 \"%s\".\n"
+
+#: command.c:4617
+#, c-format
+msgid "Title is unset.\n"
+msgstr "无标题.\n"
+
+#: command.c:4624
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "å¼€å¯åªæ˜¾ç¤ºå…ƒç»„.\n"
+
+#: command.c:4626
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "关闭åªæ˜¾ç¤ºå…ƒç»„.\n"
+
+#: command.c:4632
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode 边界线型是 \"%s\".\n"
+
+#: command.c:4638
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode 列线型是 \"%s\".\n"
+
+#: command.c:4644
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode 页眉线型是 \"%s\".\n"
+
+#: command.c:4877
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!:失败"
+
+#: command.c:4902 common.c:652
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch命令ä¸èƒ½ç”¨äºŽç©ºæŸ¥è¯¢"
+
+#: command.c:4943
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (æ¯ %gs)\n"
+
+#: command.c:4946
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (æ¯ %gs)\n"
+
+#: command.c:5000 command.c:5007 common.c:552 common.c:559 common.c:1231
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* 查询 **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+#: command.c:5199
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\"ä¸æ˜¯ä¸€ä¸ªè§†å›¾"
+
+#: command.c:5215
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "æ— æ³•è§£æž reloptions 数组"
+
+#: common.c:159
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "没有数æ®åº“连接时无法转义"
+
+#: common.c:200
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "shell命令å‚数包å«æ¢è¡Œç¬¦æˆ–回车符: \"%s\""
+
+#: common.c:304
+#, c-format
+msgid "connection to server was lost"
+msgstr "与数æ®åº“的连接已ç»æ–­å¼€"
+
+#: common.c:308
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "与æœåŠ¡å™¨çš„连接已断开,正在试图é‡ç½®: "
+
+#: common.c:313
+#, c-format
+msgid "Failed.\n"
+msgstr "失败。\n"
+
+#: common.c:330
+#, c-format
+msgid "Succeeded.\n"
+msgstr "完æˆã€‚\n"
+
+#: common.c:382 common.c:949 common.c:1166
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "æ„外的 PQresultStatus: %d"
+
+#: common.c:491
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "时间:%.3f ms\n"
+
+#: common.c:506
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "时间:%.3f ms (%02d:%06.3f)\n"
+
+#: common.c:515
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "时间: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:522
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "时间:%.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+#: common.c:546 common.c:604 common.c:1202
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ä½ ç›®å‰æ²¡æœ‰è¿žæŽ¥åˆ°æ•°æ®åº“."
+
+#: common.c:659
+#, c-format
+msgid "\\watch cannot be used with COPY"
+msgstr "\\watchä¸èƒ½ç”¨äºŽCOPY命令中"
+
+#: common.c:664
+#, c-format
+msgid "unexpected result status for \\watch"
+msgstr "\\Watch出现æ„外的结果状æ€"
+
+#: common.c:694
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "从PID为%3$dçš„æœåŠ¡å™¨è¿›ç¨‹æŽ¥æ”¶åˆ°å¸¦æœ‰å­—节æµé‡\"%2$s\"的异步通知消æ¯\"%1$s\".\n"
+
+#: common.c:697
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "收到æ¥è‡ªæœåŠ¡å™¨ \"%s\" 进程 PID %d éžåŒæ­¥é€šçŸ¥ã€‚\n"
+
+#: common.c:730 common.c:747
+msgid "could not print result table: %m"
+msgstr "无法打å°ç»“果表: %m"
+
+#: common.c:768
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "\\gset没有记录行返回"
+
+#: common.c:773
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "\\gset返回超过1个记录行"
+
+#: common.c:791
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "试图\\gset为ç»è¿‡ç‰¹æ®Šå¤„ç†çš„å˜é‡\"%s\"已忽略"
+
+#: common.c:1211
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(å•æ­¥æ¨¡å¼ï¼šéªŒè¯å‘½ä»¤)*******************************************\n"
+"%s\n"
+"***(按 Enter 键继续或键入 x æ¥å–消)********************\n"
+
+#: common.c:1266
+#, c-format
+msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK."
+msgstr "æœåŠ¡å™¨(版本 %s)ä¸æ”¯æŒä¿å­˜ç‚¹(Savepoint)ON_ERROR_ROLLBACK."
+
+#: common.c:1329
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "语å¥ï¼š %s"
+
+#: common.c:1373
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "æ„外的事务状æ€å€¼ (%d)"
+
+#: common.c:1514 describe.c:2179
+msgid "Column"
+msgstr "æ ä½"
+
+#: common.c:1515 describe.c:178 describe.c:396 describe.c:414 describe.c:459
+#: describe.c:476 describe.c:1128 describe.c:1292 describe.c:1878
+#: describe.c:1902 describe.c:2180 describe.c:4048 describe.c:4271
+#: describe.c:4496 describe.c:5794
+msgid "Type"
+msgstr "类型"
+
+#: common.c:1564
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "命令没有结果,或者结果没有列.\n"
+
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy:需è¦å‚æ•°"
+
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy:在 \"%s\" å‘生解读错误"
+
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy:在行尾å‘生解读错误"
+
+#: copy.c:328
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "无法执行命令 \"%s\": %m"
+
+#: copy.c:344
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "无法å–文件 \"%s\" 的状æ€: %m"
+
+#: copy.c:348
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s:无法从目录å¤åˆ¶æˆ–å¤åˆ¶åˆ°ç›®å½•"
+
+#: copy.c:385
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "无法为外部命令: %m关闭管é“"
+
+#: copy.c:390
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: copy.c:453 copy.c:463
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "无法写入 COPY æ•°æ®ï¼š%m"
+
+#: copy.c:469
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY æ•°æ®è½¬æ¢å¤±è´¥ï¼š%s"
+
+#: copy.c:530
+msgid "canceled by user"
+msgstr "ä¾ç”¨æˆ·å–消"
+
+#: copy.c:541
+msgid ""
+"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."
+msgstr ""
+"输入è¦å¤åˆ¶çš„æ•°æ®å¹¶ä¸”æ¢è¡Œã€‚\n"
+"在独立的一行上输入一个å斜线和一个å¥ç‚¹ç»“æŸï¼Œæˆ–者以一个EOFä¿¡å·ç»“æŸ."
+
+#: copy.c:671
+msgid "aborted because of read failure"
+msgstr "因读å–失败已被中止"
+
+#: copy.c:705
+msgid "trying to exit copy mode"
+msgstr "正在å°è¯•é€€å‡º"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview:语å¥æœªè¿”回结果集"
+
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview:查询必须返回至少三列"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: 垂直和水平表头必须是ä¸åŒçš„列"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: 当查询返回三列以上时,必须指定数æ®åˆ—"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: 超过最大列数(%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: 查询结果包å«è¡Œ\"%s\"ã€åˆ—\"%s\"的多个数æ®å€¼"
+
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: 列å·ç  %d 超出了范围 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: ä¸æ˜Žç¡®çš„列å: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 找ä¸åˆ°åˆ—å: \"%s\""
+
+#: describe.c:76 describe.c:376 describe.c:728 describe.c:924 describe.c:1120
+#: describe.c:1281 describe.c:1353 describe.c:4036 describe.c:4258
+#: describe.c:4494 describe.c:4585 describe.c:4731 describe.c:4944
+#: describe.c:5104 describe.c:5345 describe.c:5420 describe.c:5431
+#: describe.c:5493 describe.c:5918 describe.c:6001
+msgid "Schema"
+msgstr "架构模å¼"
+
+#: describe.c:77 describe.c:175 describe.c:243 describe.c:251 describe.c:377
+#: describe.c:729 describe.c:925 describe.c:1038 describe.c:1121
+#: describe.c:1354 describe.c:4037 describe.c:4259 describe.c:4417
+#: describe.c:4495 describe.c:4586 describe.c:4665 describe.c:4732
+#: describe.c:4945 describe.c:5029 describe.c:5105 describe.c:5346
+#: describe.c:5421 describe.c:5432 describe.c:5494 describe.c:5691
+#: describe.c:5775 describe.c:5999 describe.c:6171 describe.c:6411
+msgid "Name"
+msgstr "å称"
+
+#: describe.c:78 describe.c:389 describe.c:407 describe.c:453 describe.c:470
+msgid "Result data type"
+msgstr "结果数æ®ç±»åž‹"
+
+#: describe.c:86 describe.c:99 describe.c:103 describe.c:390 describe.c:408
+#: describe.c:454 describe.c:471
+msgid "Argument data types"
+msgstr "å‚æ•°æ•°æ®ç±»åž‹"
+
+#: describe.c:111 describe.c:118 describe.c:186 describe.c:274 describe.c:523
+#: describe.c:777 describe.c:940 describe.c:1063 describe.c:1356
+#: describe.c:2200 describe.c:3823 describe.c:4108 describe.c:4305
+#: describe.c:4448 describe.c:4522 describe.c:4595 describe.c:4678
+#: describe.c:4853 describe.c:4972 describe.c:5038 describe.c:5106
+#: describe.c:5247 describe.c:5289 describe.c:5362 describe.c:5424
+#: describe.c:5433 describe.c:5495 describe.c:5717 describe.c:5797
+#: describe.c:5932 describe.c:6002 large_obj.c:290 large_obj.c:300
+msgid "Description"
+msgstr "æè¿°"
+
+#: describe.c:136
+msgid "List of aggregate functions"
+msgstr "èšé›†å‡½æ•°åˆ—表"
+
+#: describe.c:161
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "æœåŠ¡å™¨(版本%s) ä¸æ”¯æŒè®¿é—®æ–¹æ³•."
+
+#: describe.c:176
+msgid "Index"
+msgstr "索引"
+
+#: describe.c:177 describe.c:4056 describe.c:4284 describe.c:5919
+msgid "Table"
+msgstr "æ•°æ®è¡¨"
+
+#: describe.c:185 describe.c:5696
+msgid "Handler"
+msgstr "处ç†å‡½æ•°"
+
+#: describe.c:204
+msgid "List of access methods"
+msgstr "访问方法列表"
+
+#: describe.c:230
+#, c-format
+msgid "The server (version %s) does not support tablespaces."
+msgstr "æœåŠ¡å™¨(版本%s) ä¸æ”¯æŒä½¿ç”¨è¡¨ç©ºé—´."
+
+#: describe.c:244 describe.c:252 describe.c:504 describe.c:767 describe.c:1039
+#: describe.c:1280 describe.c:4049 describe.c:4260 describe.c:4421
+#: describe.c:4667 describe.c:5030 describe.c:5692 describe.c:5776
+#: describe.c:6172 describe.c:6309 describe.c:6412 describe.c:6535
+#: describe.c:6613 large_obj.c:289
+msgid "Owner"
+msgstr "拥有者"
+
+#: describe.c:245 describe.c:253
+msgid "Location"
+msgstr "所在地"
+
+#: describe.c:264 describe.c:3639
+msgid "Options"
+msgstr "选项"
+
+#: describe.c:269 describe.c:740 describe.c:1055 describe.c:4100
+#: describe.c:4104
+msgid "Size"
+msgstr "大å°"
+
+#: describe.c:291
+msgid "List of tablespaces"
+msgstr "表空间列表"
+
+#: describe.c:336
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df åªèƒ½å°† [anptwS+]作为选项"
+
+#: describe.c:344 describe.c:355
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df ä¸èƒ½æœ‰å¸¦ç€æœåŠ¡å™¨ç‰ˆæœ¬%2$s 的选项\"%1$c\""
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:392 describe.c:410 describe.c:456 describe.c:473
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:393 describe.c:411
+msgid "window"
+msgstr "窗å£"
+
+#: describe.c:394
+msgid "proc"
+msgstr "proc"
+
+#: describe.c:395 describe.c:413 describe.c:458 describe.c:475
+msgid "func"
+msgstr "函数"
+
+#: describe.c:412 describe.c:457 describe.c:474 describe.c:1490
+msgid "trigger"
+msgstr "触å‘器"
+
+#: describe.c:486
+msgid "immutable"
+msgstr "ä¸å¯æ›´æ”¹"
+
+#: describe.c:487
+msgid "stable"
+msgstr "稳定"
+
+#: describe.c:488
+msgid "volatile"
+msgstr "ä¸ç¨³å®šæ€§"
+
+#: describe.c:489
+msgid "Volatility"
+msgstr "挥å‘性"
+
+#: describe.c:497
+msgid "restricted"
+msgstr "å—é™åˆ¶çš„"
+
+#: describe.c:498
+msgid "safe"
+msgstr "安全的"
+
+#: describe.c:499
+msgid "unsafe"
+msgstr "ä¸å®‰å…¨çš„"
+
+#: describe.c:500
+msgid "Parallel"
+msgstr "平行"
+
+#: describe.c:505
+msgid "definer"
+msgstr "定义者"
+
+#: describe.c:506
+msgid "invoker"
+msgstr "调用者"
+
+#: describe.c:507
+msgid "Security"
+msgstr "安全"
+
+#: describe.c:512
+msgid "Language"
+msgstr "程åºè¯­è¨€"
+
+#: describe.c:516 describe.c:520
+msgid "Source code"
+msgstr "原始程å¼"
+
+#: describe.c:691
+msgid "List of functions"
+msgstr "函数列表"
+
+#: describe.c:739
+msgid "Internal name"
+msgstr "内部å称"
+
+#: describe.c:761
+msgid "Elements"
+msgstr "æˆå‘˜"
+
+#: describe.c:822
+msgid "List of data types"
+msgstr "æ•°æ®ç±»åž‹åˆ—表"
+
+#: describe.c:926
+msgid "Left arg type"
+msgstr "å·¦å‚数类型"
+
+#: describe.c:927
+msgid "Right arg type"
+msgstr "å³å‚数类型"
+
+#: describe.c:928
+msgid "Result type"
+msgstr "结果类型"
+
+#: describe.c:933 describe.c:4673 describe.c:4830 describe.c:4836
+#: describe.c:5246 describe.c:6784 describe.c:6788
+msgid "Function"
+msgstr "函数"
+
+#: describe.c:1010
+msgid "List of operators"
+msgstr "è¿ç®—å­åˆ—表"
+
+#: describe.c:1040
+msgid "Encoding"
+msgstr "字元编ç "
+
+#: describe.c:1045 describe.c:4946
+msgid "Collate"
+msgstr "校对规则"
+
+#: describe.c:1046 describe.c:4947
+msgid "Ctype"
+msgstr "Ctype"
+
+#: describe.c:1059
+msgid "Tablespace"
+msgstr "表空间"
+
+#: describe.c:1081
+msgid "List of databases"
+msgstr "æ•°æ®åº“列表"
+
+#: describe.c:1122 describe.c:1283 describe.c:4038
+msgid "table"
+msgstr "æ•°æ®è¡¨"
+
+#: describe.c:1123 describe.c:4039
+msgid "view"
+msgstr "视图"
+
+#: describe.c:1124 describe.c:4040
+msgid "materialized view"
+msgstr "物化视图"
+
+#: describe.c:1125 describe.c:1285 describe.c:4042
+msgid "sequence"
+msgstr "åºåˆ—æ•°"
+
+#: describe.c:1126 describe.c:4045
+msgid "foreign table"
+msgstr "所引用的外表"
+
+#: describe.c:1127 describe.c:4046 describe.c:4269
+msgid "partitioned table"
+msgstr "分区表"
+
+#: describe.c:1139
+msgid "Column privileges"
+msgstr "列特æƒ"
+
+#: describe.c:1170 describe.c:1204
+msgid "Policies"
+msgstr "ç­–ç•¥"
+
+#: describe.c:1236 describe.c:6476 describe.c:6480
+msgid "Access privileges"
+msgstr "å­˜å–æƒé™"
+
+#: describe.c:1267
+#, c-format
+msgid "The server (version %s) does not support altering default privileges."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒä¿®æ”¹é»˜è®¤æƒé™."
+
+#: describe.c:1287
+msgid "function"
+msgstr "函数"
+
+#: describe.c:1289
+msgid "type"
+msgstr "类型Ctype"
+
+#: describe.c:1291
+msgid "schema"
+msgstr "架构模å¼"
+
+#: describe.c:1315
+msgid "Default access privileges"
+msgstr "默认的访问æƒé™"
+
+#: describe.c:1355
+msgid "Object"
+msgstr "对象"
+
+#: describe.c:1369
+msgid "table constraint"
+msgstr "表约æŸ"
+
+#: describe.c:1391
+msgid "domain constraint"
+msgstr "域约æŸ"
+
+#: describe.c:1419
+msgid "operator class"
+msgstr "æ“作符类"
+
+#: describe.c:1448
+msgid "operator family"
+msgstr "æ“作符家æ—"
+
+#: describe.c:1470
+msgid "rule"
+msgstr "规则"
+
+#: describe.c:1512
+msgid "Object descriptions"
+msgstr "对象æè¿°"
+
+#: describe.c:1568 describe.c:4175
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "没有找到任何å称为 \"%s\" çš„å…³è”."
+
+#: describe.c:1571 describe.c:4178
+#, c-format
+msgid "Did not find any relations."
+msgstr "没有找到任何关系."
+
+#: describe.c:1827
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "没有找到任何OID为 %s çš„å…³è”."
+
+#: describe.c:1879 describe.c:1903
+msgid "Start"
+msgstr "起始值"
+
+#: describe.c:1880 describe.c:1904
+msgid "Minimum"
+msgstr "最å°å€¼"
+
+#: describe.c:1881 describe.c:1905
+msgid "Maximum"
+msgstr "最大值"
+
+#: describe.c:1882 describe.c:1906
+msgid "Increment"
+msgstr "增é‡"
+
+#: describe.c:1883 describe.c:1907 describe.c:2038 describe.c:4589
+#: describe.c:4847 describe.c:4961 describe.c:4966 describe.c:6523
+msgid "yes"
+msgstr "是"
+
+#: describe.c:1884 describe.c:1908 describe.c:2039 describe.c:4589
+#: describe.c:4844 describe.c:4961 describe.c:6524
+msgid "no"
+msgstr "å¦"
+
+#: describe.c:1885 describe.c:1909
+msgid "Cycles?"
+msgstr "循环?"
+
+#: describe.c:1886 describe.c:1910
+msgid "Cache"
+msgstr "缓存"
+
+#: describe.c:1953
+#, c-format
+msgid "Owned by: %s"
+msgstr "属于: %s"
+
+#: describe.c:1957
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "标识列的åºåˆ—: %s"
+
+#: describe.c:1964
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "åºåˆ—æ•° \"%s.%s\""
+
+#: describe.c:2111
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "ä¸è®°å½•æ—¥å¿—的表 \"%s.%s\""
+
+#: describe.c:2114
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "æ•°æ®è¡¨ \"%s.%s\""
+
+#: describe.c:2118
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "视图 \"%s.%s\""
+
+#: describe.c:2123
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "ä¸è®°å½•æ—¥å¿—的物化视图 \"%s.%s\""
+
+#: describe.c:2126
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "物化视图 \"%s.%s\""
+
+#: describe.c:2131
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "ä¸è®°å½•æ—¥å¿—的索引 \"%s.%s\""
+
+#: describe.c:2134
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "索引 \"%s.%s\""
+
+#: describe.c:2139
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "ä¸è®°å½•æ—¥å¿—的分区索引 \"%s.%s\""
+
+#: describe.c:2142
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "分区索引 \"%s.%s\""
+
+#: describe.c:2147
+#, c-format
+msgid "Special relation \"%s.%s\""
+msgstr "ç‰¹æ®Šå…³è” \"%s.%s\""
+
+#: describe.c:2151
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST æ•°æ®è¡¨ \"%s.%s\""
+
+#: describe.c:2155
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "åˆæˆç±»åž‹ \"%s.%s\""
+
+#: describe.c:2159
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "引用的外部表 \"%s.%s\""
+
+#: describe.c:2164
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "ä¸è®°å½•æ—¥å¿—的分区表 \"%s.%s\""
+
+#: describe.c:2167
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "分区表 \"%s.%s\""
+
+#: describe.c:2183 describe.c:4502
+msgid "Collation"
+msgstr "校对规则"
+
+#: describe.c:2184 describe.c:4509
+msgid "Nullable"
+msgstr "å¯ç©ºçš„"
+
+#: describe.c:2185 describe.c:4510
+msgid "Default"
+msgstr "预设"
+
+#: describe.c:2188
+msgid "Key?"
+msgstr "键值?"
+
+#: describe.c:2190 describe.c:4739 describe.c:4750
+msgid "Definition"
+msgstr "定义"
+
+#: describe.c:2192 describe.c:5712 describe.c:5796 describe.c:5867
+#: describe.c:5931
+msgid "FDW options"
+msgstr "FDW选项"
+
+#: describe.c:2194
+msgid "Storage"
+msgstr "存储"
+
+#: describe.c:2196
+msgid "Compression"
+msgstr "压缩"
+
+#: describe.c:2198
+msgid "Stats target"
+msgstr "统计目标"
+
+#: describe.c:2334
+msgid "Partition of: %s %s%s"
+msgstr "分区: %s %s%s"
+
+#: describe.c:2347
+msgid "No partition constraint"
+msgstr "无分区约æŸ"
+
+#: describe.c:2349
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "分区约æŸ: %s"
+
+#: describe.c:2373
+#, c-format
+msgid "Partition key: %s"
+msgstr "分区键值: %s"
+
+#: describe.c:2399
+msgid "Owning table: \"%s.%s\""
+msgstr "拥有表: \"%s.%s\""
+
+#: describe.c:2470
+msgid "primary key, "
+msgstr "主键(PK),"
+
+#: describe.c:2472
+msgid "unique, "
+msgstr "唯一的,"
+
+#: describe.c:2478
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "给数æ®è¡¨ \"%s.%s\""
+
+#: describe.c:2482
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", å™è¿° (%s)"
+
+#: describe.c:2485
+msgid ", clustered"
+msgstr ", 已丛集"
+
+#: describe.c:2488
+msgid ", invalid"
+msgstr ", 无效的"
+
+#: describe.c:2491
+msgid ", deferrable"
+msgstr ",å¯å»¶è¿Ÿ"
+
+#: describe.c:2494
+msgid ", initially deferred"
+msgstr ",开始被延迟"
+
+#: describe.c:2497
+msgid ", replica identity"
+msgstr ",å¤åˆ¶æ ‡è¯†"
+
+#: describe.c:2564
+msgid "Indexes:"
+msgstr "索引:"
+
+#: describe.c:2648
+msgid "Check constraints:"
+msgstr "检查约æŸé™åˆ¶"
+
+#: describe.c:2716
+msgid "Foreign-key constraints:"
+msgstr "外部键(FK)é™åˆ¶ï¼š"
+
+#: describe.c:2779
+msgid "Referenced by:"
+msgstr "由引用:"
+
+#: describe.c:2829
+msgid "Policies:"
+msgstr "策略:"
+
+#: describe.c:2832
+msgid "Policies (forced row security enabled):"
+msgstr "策略(强制行安全性å¯ç”¨ï¼‰ï¼š"
+
+#: describe.c:2835
+msgid "Policies (row security enabled): (none)"
+msgstr "策略(行安全性å¯ç”¨ï¼‰ï¼šï¼ˆæ— ï¼‰"
+
+#: describe.c:2838
+msgid "Policies (forced row security enabled): (none)"
+msgstr "策略(强制行安全性å¯ç”¨ï¼‰ï¼šï¼ˆæ— ï¼‰"
+
+#: describe.c:2841
+msgid "Policies (row security disabled):"
+msgstr "策略(行安全性ç¦ç”¨ï¼‰ï¼š"
+
+#: describe.c:2902 describe.c:3006
+msgid "Statistics objects:"
+msgstr "统计信æ¯å¯¹è±¡:"
+
+#: describe.c:3120 describe.c:3224
+msgid "Rules:"
+msgstr "规则:"
+
+#: describe.c:3123
+msgid "Disabled rules:"
+msgstr "å·²åœç”¨è§„则:"
+
+#: describe.c:3126
+msgid "Rules firing always:"
+msgstr "永远触å‘规则"
+
+#: describe.c:3129
+msgid "Rules firing on replica only:"
+msgstr "åªæœ‰åœ¨å¤åˆ¶æ—¶è§¦å‘规则:"
+
+#: describe.c:3169
+msgid "Publications:"
+msgstr "å‘布:"
+
+#: describe.c:3207
+msgid "View definition:"
+msgstr "视图定义:"
+
+#: describe.c:3354
+msgid "Triggers:"
+msgstr "触å‘器:"
+
+#: describe.c:3358
+msgid "Disabled user triggers:"
+msgstr "ç¦ç”¨ç”¨æˆ·è§¦å‘器:"
+
+#: describe.c:3360
+msgid "Disabled triggers:"
+msgstr "åœç”¨è§¦å‘器:"
+
+#: describe.c:3363
+msgid "Disabled internal triggers:"
+msgstr "ç¦ç”¨å†…部触å‘器:"
+
+#: describe.c:3366
+msgid "Triggers firing always:"
+msgstr "永远激活触å‘器"
+
+#: describe.c:3369
+msgid "Triggers firing on replica only:"
+msgstr "åªæœ‰åœ¨å¤åˆ¶æ—¶æ¿€æ´»è§¦å‘器"
+
+#: describe.c:3441
+#, c-format
+msgid "Server: %s"
+msgstr "æœåŠ¡å™¨ %s"
+
+#: describe.c:3449
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW选项: (%s)"
+
+#: describe.c:3470
+msgid "Inherits"
+msgstr "继承"
+
+#: describe.c:3543
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "分区数: %d"
+
+#: describe.c:3552
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "分区的数é‡ï¼š%d(å¯ä»¥ä½¿ç”¨ \\d+ æ¥åˆ—出它们)"
+
+#: describe.c:3554
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "å­è¡¨çš„æ•°é‡ï¼š%d(å¯ä»¥ä½¿ç”¨ \\d+ æ¥åˆ—出它们)"
+
+#: describe.c:3561
+msgid "Child tables"
+msgstr "å­è¡¨"
+
+#: describe.c:3561
+msgid "Partitions"
+msgstr "分区"
+
+#: describe.c:3592
+#, c-format
+msgid "Typed table of type: %s"
+msgstr "类型的已确定类型表(typed table):%s"
+
+#: describe.c:3608
+msgid "Replica Identity"
+msgstr "å¤åˆ¶æ ‡è¯†"
+
+#: describe.c:3621
+msgid "Has OIDs: yes"
+msgstr "有 OIDs:yes"
+
+#: describe.c:3630
+#, c-format
+msgid "Access method: %s"
+msgstr "访问方法 %s"
+
+#: describe.c:3710
+#, 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:3722
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", 表空间 \"%s\""
+
+#: describe.c:3815
+msgid "List of roles"
+msgstr "角色列表"
+
+#: describe.c:3817
+msgid "Role name"
+msgstr "角色å称"
+
+#: describe.c:3818
+msgid "Attributes"
+msgstr "属性"
+
+#: describe.c:3820
+msgid "Member of"
+msgstr "æˆå‘˜å±žäºŽ"
+
+#: describe.c:3831
+msgid "Superuser"
+msgstr "超级用户"
+
+#: describe.c:3834
+msgid "No inheritance"
+msgstr "没有继承"
+
+#: describe.c:3837
+msgid "Create role"
+msgstr "建立角色"
+
+#: describe.c:3840
+msgid "Create DB"
+msgstr "建立 DB"
+
+#: describe.c:3843
+msgid "Cannot login"
+msgstr "无法登录"
+
+#: describe.c:3847
+msgid "Replication"
+msgstr "å¤åˆ¶"
+
+#: describe.c:3851
+msgid "Bypass RLS"
+msgstr "绕过RLS"
+
+#: describe.c:3860
+msgid "No connections"
+msgstr "没有连接"
+
+#: describe.c:3862
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d个连接"
+
+#: describe.c:3872
+msgid "Password valid until "
+msgstr "密ç æœ‰æ•ˆç›´è‡³"
+
+#: describe.c:3922
+#, c-format
+msgid "The server (version %s) does not support per-database role settings."
+msgstr "æœåŠ¡å™¨(版本%s) æ¯ä¸ªæ•°æ®åº“角色设置."
+
+#: describe.c:3935
+msgid "Role"
+msgstr "角色"
+
+#: describe.c:3936
+msgid "Database"
+msgstr "æ•°æ®åº“"
+
+#: describe.c:3937
+msgid "Settings"
+msgstr "设置"
+
+#: describe.c:3958
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "找ä¸åˆ°è§’色\"%s\"和数æ®åº“\"%s\"的任何设置."
+
+#: describe.c:3961
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "找ä¸åˆ°è§’色\"%s\"的任何设置."
+
+#: describe.c:3964
+#, c-format
+msgid "Did not find any settings."
+msgstr "找ä¸åˆ°ä»»ä½•è®¾ç½®."
+
+#: describe.c:3969
+msgid "List of settings"
+msgstr "设置的列表"
+
+#: describe.c:4041
+msgid "index"
+msgstr "索引"
+
+#: describe.c:4043
+msgid "special"
+msgstr "特殊"
+
+#: describe.c:4044
+msgid "TOAST table"
+msgstr "TOAST 表"
+
+#: describe.c:4047 describe.c:4270
+msgid "partitioned index"
+msgstr "分区索引"
+
+#: describe.c:4071
+msgid "permanent"
+msgstr "永久的"
+
+#: describe.c:4072
+msgid "temporary"
+msgstr "临时的"
+
+#: describe.c:4073
+msgid "unlogged"
+msgstr "未记录"
+
+#: describe.c:4074
+msgid "Persistence"
+msgstr "æŒç»­çš„"
+
+#: describe.c:4091
+msgid "Access method"
+msgstr "访问方法"
+
+#: describe.c:4183
+msgid "List of relations"
+msgstr "å…³è”列表"
+
+#: describe.c:4231
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒå£°æ˜Žæ€§è¡¨åˆ†åŒº."
+
+#: describe.c:4242
+msgid "List of partitioned indexes"
+msgstr "分区索引列表"
+
+#: describe.c:4244
+msgid "List of partitioned tables"
+msgstr "分区表列表"
+
+#: describe.c:4248
+msgid "List of partitioned relations"
+msgstr "分区关系列表"
+
+#: describe.c:4279
+msgid "Parent name"
+msgstr "父å"
+
+#: describe.c:4292
+msgid "Leaf partition size"
+msgstr "å¶å­åˆ†åŒºå¤§å°"
+
+#: describe.c:4295 describe.c:4301
+msgid "Total size"
+msgstr "总大å°"
+
+#: describe.c:4425
+msgid "Trusted"
+msgstr "ä¿¡ä»»"
+
+#: describe.c:4433
+msgid "Internal language"
+msgstr "内部语言"
+
+#: describe.c:4434
+msgid "Call handler"
+msgstr "调用函数"
+
+#: describe.c:4435 describe.c:5699
+msgid "Validator"
+msgstr "验è¯"
+
+#: describe.c:4438
+msgid "Inline handler"
+msgstr "内è”函数"
+
+#: describe.c:4466
+msgid "List of languages"
+msgstr "语言列表"
+
+#: describe.c:4511
+msgid "Check"
+msgstr "检查"
+
+#: describe.c:4553
+msgid "List of domains"
+msgstr "å…±åŒå€¼åŸŸåˆ—表"
+
+#: describe.c:4587
+msgid "Source"
+msgstr "æ¥æº"
+
+#: describe.c:4588
+msgid "Destination"
+msgstr "目的地"
+
+#: describe.c:4590 describe.c:6525
+msgid "Default?"
+msgstr "预设?"
+
+#: describe.c:4627
+msgid "List of conversions"
+msgstr "字元编ç è½¬æ¢åˆ—表"
+
+#: describe.c:4666
+msgid "Event"
+msgstr "Event"
+
+#: describe.c:4668
+msgid "enabled"
+msgstr "å¯ç”¨"
+
+#: describe.c:4669
+msgid "replica"
+msgstr "replica"
+
+#: describe.c:4670
+msgid "always"
+msgstr "ç»å¸¸"
+
+#: describe.c:4671
+msgid "disabled"
+msgstr "ç¦ç”¨"
+
+#: describe.c:4672 describe.c:6413
+msgid "Enabled"
+msgstr "使能"
+
+#: describe.c:4674
+msgid "Tags"
+msgstr "标签"
+
+#: describe.c:4693
+msgid "List of event triggers"
+msgstr "事件触å‘器列表"
+
+#: describe.c:4720
+msgid "The server (version %s) does not support extended statistics."
+msgstr "æœåŠ¡å™¨(版本%s) ä¸æ”¯æŒä½¿ç”¨æ‰©å±•ç»Ÿè®¡."
+
+#: describe.c:4757
+msgid "Ndistinct"
+msgstr "ç¦æ­¢"
+
+#: describe.c:4758
+msgid "Dependencies"
+msgstr "ä¾èµ–关系"
+
+#: describe.c:4768
+msgid "MCV"
+msgstr "MCV"
+
+#: describe.c:4787
+msgid "List of extended statistics"
+msgstr "扩展统计表"
+
+#: describe.c:4814
+msgid "Source type"
+msgstr "æ¥æºç±»åž‹"
+
+#: describe.c:4815
+msgid "Target type"
+msgstr "目标类型"
+
+#: describe.c:4846
+msgid "in assignment"
+msgstr "在指派中"
+
+#: describe.c:4848
+msgid "Implicit?"
+msgstr "éšå«çš„?"
+
+#: describe.c:4903
+msgid "List of casts"
+msgstr "类型转æ¢åˆ—表"
+
+#: describe.c:4931
+#, c-format
+msgid "The server (version %s) does not support collations."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒæŽ’åºæ ¡å¯¹."
+
+#: describe.c:4952 describe.c:4956
+msgid "Provider"
+msgstr "æ供者"
+
+#: describe.c:4962 describe.c:4967
+msgid "Deterministic?"
+msgstr "确定性?"
+
+#: describe.c:5002
+msgid "List of collations"
+msgstr "校对列表"
+
+#: describe.c:5061
+msgid "List of schemas"
+msgstr "架构模å¼åˆ—表"
+
+#: describe.c:5086 describe.c:5333 describe.c:5404 describe.c:5475
+#, c-format
+msgid "The server (version %s) does not support full text search."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒä½¿ç”¨å…¨æ–‡æœç´¢."
+
+#: describe.c:5121
+msgid "List of text search parsers"
+msgstr "文本剖æžå™¨åˆ—表"
+
+#: describe.c:5166
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "没有找到任何命å为 \"%s\" 的文本剖æžå™¨."
+
+#: describe.c:5169
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "找ä¸åˆ°ä»»ä½•æ–‡æœ¬æœç´¢è§£æžå™¨."
+
+#: describe.c:5244
+msgid "Start parse"
+msgstr "开始剖æž"
+
+#: describe.c:5245
+msgid "Method"
+msgstr "方法"
+
+#: describe.c:5249
+msgid "Get next token"
+msgstr "å–得下一个标志符"
+
+#: describe.c:5251
+msgid "End parse"
+msgstr "结æŸå‰–æž"
+
+#: describe.c:5253
+msgid "Get headline"
+msgstr "å–得首行"
+
+#: describe.c:5255
+msgid "Get token types"
+msgstr "å–得标志符类型"
+
+#: describe.c:5266
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "文本æœç´¢å‰–æžå™¨ \"%s.%s\""
+
+#: describe.c:5269
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "文本æœç´¢å‰–æžå™¨ \"%s\""
+
+#: describe.c:5288
+msgid "Token name"
+msgstr "标志å称"
+
+#: describe.c:5299
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "标志符别型给剖æžå™¨ \"%s.%s\""
+
+#: describe.c:5302
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "标志符类型给剖æžå™¨ \"%s\""
+
+#: describe.c:5356
+msgid "Template"
+msgstr "模版"
+
+#: describe.c:5357
+msgid "Init options"
+msgstr "åˆå§‹é€‰é¡¹"
+
+#: describe.c:5379
+msgid "List of text search dictionaries"
+msgstr "文本æœç´¢å­—典列表"
+
+#: describe.c:5422
+msgid "Init"
+msgstr "åˆå§‹åŒ–"
+
+#: describe.c:5423
+msgid "Lexize"
+msgstr "è¯æ±‡"
+
+#: describe.c:5450
+msgid "List of text search templates"
+msgstr "文本æœç´¢æ ·å¼åˆ—表"
+
+#: describe.c:5510
+msgid "List of text search configurations"
+msgstr "文本æœç´¢ç»„æ€åˆ—表"
+
+#: describe.c:5556
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "没有找到任何命å为 \"%s\" 的文本æœç´¢ç»„æ€."
+
+#: describe.c:5559
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "未找到任何文本æœç´¢é…ç½®."
+
+#: describe.c:5625
+msgid "Token"
+msgstr "标志符"
+
+#: describe.c:5626
+msgid "Dictionaries"
+msgstr "å­—å…¸"
+
+#: describe.c:5637
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "文本æœç´¢ç»„æ€ \"%s.%s\""
+
+#: describe.c:5640
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "文本æœç´¢ç»„æ€ \"%s\""
+
+#: describe.c:5644
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"剖æžå™¨ï¼š\"%s.%s\""
+
+#: describe.c:5647
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"剖æžå™¨ï¼š\"%s\""
+
+#: describe.c:5681
+#, c-format
+msgid "The server (version %s) does not support foreign-data wrappers."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒä½¿ç”¨å¤–部数æ®å°è£…器."
+
+#: describe.c:5739
+msgid "List of foreign-data wrappers"
+msgstr "外部数æ®å°è£…器列表"
+
+#: describe.c:5764
+#, c-format
+msgid "The server (version %s) does not support foreign servers."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒä½¿ç”¨å¤–部æœåŠ¡å™¨."
+
+#: describe.c:5777
+msgid "Foreign-data wrapper"
+msgstr "外部数æ®å°è£…器"
+
+#: describe.c:5795 describe.c:6000
+msgid "Version"
+msgstr "版本"
+
+#: describe.c:5821
+msgid "List of foreign servers"
+msgstr "外部æœåŠ¡å™¨åˆ—表"
+
+#: describe.c:5846
+#, c-format
+msgid "The server (version %s) does not support user mappings."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒä½¿ç”¨ç”¨æˆ·æ˜ å°„."
+
+#: describe.c:5856 describe.c:5920
+msgid "Server"
+msgstr "æœåŠ¡å™¨"
+
+#: describe.c:5857
+msgid "User name"
+msgstr "用户å: "
+
+#: describe.c:5882
+msgid "List of user mappings"
+msgstr "列出用户映射"
+
+#: describe.c:5907
+#, c-format
+msgid "The server (version %s) does not support foreign tables."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒä½¿ç”¨å¼•ç”¨è¡¨."
+
+#: describe.c:5960
+msgid "List of foreign tables"
+msgstr "引用表列表"
+
+#: describe.c:5985 describe.c:6042
+#, c-format
+msgid "The server (version %s) does not support extensions."
+msgstr "æœåŠ¡å™¨(版本%s) ä¸æ”¯æŒä½¿ç”¨æ‰©å±•."
+
+#: describe.c:6017
+msgid "List of installed extensions"
+msgstr "已安装扩展列表"
+
+#: describe.c:6070
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "没有找到任何å称为 \"%s\" 的扩展."
+
+#: describe.c:6073
+#, c-format
+msgid "Did not find any extensions."
+msgstr "没有找到任何扩展."
+
+#: describe.c:6117
+msgid "Object description"
+msgstr "对象æè¿°"
+
+#: describe.c:6127
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "对象用于扩展 \"%s\""
+
+#: describe.c:6156 describe.c:6232
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒå‘布."
+
+#: describe.c:6173 describe.c:6310
+msgid "All tables"
+msgstr "所有表"
+
+#: describe.c:6174 describe.c:6311
+msgid "Inserts"
+msgstr "æ’å…¥"
+
+#: describe.c:6175 describe.c:6312
+msgid "Updates"
+msgstr "æ›´æ–°"
+
+#: describe.c:6176 describe.c:6313
+msgid "Deletes"
+msgstr "删除"
+
+#: describe.c:6180 describe.c:6315
+msgid "Truncates"
+msgstr "截断"
+
+#: describe.c:6184 describe.c:6317
+msgid "Via root"
+msgstr "Via root"
+
+#: describe.c:6201
+msgid "List of publications"
+msgstr "å‘布列表"
+
+#: describe.c:6274
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "没有找到任何å称为 \"%s\" çš„å‘布."
+
+#: describe.c:6277
+#, c-format
+msgid "Did not find any publications."
+msgstr "没有找到任何å‘布."
+
+#: describe.c:6306
+#, c-format
+msgid "Publication %s"
+msgstr "å‘布 %s"
+
+#: describe.c:6354
+msgid "Tables:"
+msgstr "æ•°æ®è¡¨"
+
+#: describe.c:6398
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "æœåŠ¡å™¨(版本%s)ä¸æ”¯æŒè®¢é˜…."
+
+#: describe.c:6414
+msgid "Publication"
+msgstr "å‘布"
+
+#: describe.c:6423
+msgid "Binary"
+msgstr "二进制"
+
+#: describe.c:6424
+msgid "Streaming"
+msgstr "æµ"
+
+#: describe.c:6429
+msgid "Synchronous commit"
+msgstr "åŒæ­¥æ交"
+
+#: describe.c:6430
+msgid "Conninfo"
+msgstr "连接信æ¯"
+
+#: describe.c:6452
+msgid "List of subscriptions"
+msgstr "订阅列表"
+
+#: describe.c:6519 describe.c:6607 describe.c:6692 describe.c:6775
+msgid "AM"
+msgstr "AM"
+
+#: describe.c:6520
+msgid "Input type"
+msgstr "输入类型"
+
+#: describe.c:6521
+msgid "Storage type"
+msgstr "存储类型"
+
+#: describe.c:6522
+msgid "Operator class"
+msgstr "æ“作符类"
+
+#: describe.c:6534 describe.c:6608 describe.c:6693 describe.c:6776
+msgid "Operator family"
+msgstr "æ“作符家æ—"
+
+#: describe.c:6566
+msgid "List of operator classes"
+msgstr "è¿ç®—å­åˆ—表"
+
+#: describe.c:6609
+msgid "Applicable types"
+msgstr "适用类型"
+
+#: describe.c:6647
+msgid "List of operator families"
+msgstr "è¿ç®—å­ç³»åˆ—列表"
+
+#: describe.c:6694
+msgid "Operator"
+msgstr "è¿ç®—å­"
+
+#: describe.c:6695
+msgid "Strategy"
+msgstr "ç­–ç•¥"
+
+#: describe.c:6696
+msgid "ordering"
+msgstr "排åº"
+
+#: describe.c:6697
+msgid "search"
+msgstr "æœç´¢"
+
+#: describe.c:6698
+msgid "Purpose"
+msgstr "目的"
+
+#: describe.c:6703
+msgid "Sort opfamily"
+msgstr "排åºæ“作符家æ—"
+
+#: describe.c:6734
+msgid "List of operators of operator families"
+msgstr "æ“作符集åˆçš„列表"
+
+#: describe.c:6777
+msgid "Registered left type"
+msgstr "注册左型"
+
+#: describe.c:6778
+msgid "Registered right type"
+msgstr "注册å³åž‹"
+
+#: describe.c:6779
+msgid "Number"
+msgstr "æ•°"
+
+#: describe.c:6815
+msgid "List of support functions of operator families"
+msgstr "æ“作符集åˆçš„支æŒåŠŸèƒ½åˆ—表"
+
+#: help.c:73
+#, c-format
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr "psql是PostgreSQL 的交互å¼å®¢æˆ·ç«¯å·¥å…·ã€‚\n"
+
+#: help.c:74 help.c:355 help.c:433 help.c:476
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: help.c:75
+#, c-format
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr " psql [选项]... [æ•°æ®åº“å称 [用户å称]]\n"
+
+#: help.c:77
+#, c-format
+msgid "General options:\n"
+msgstr "通用选项:\n"
+
+#: help.c:82
+#, c-format
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=命令 执行å•ä¸€å‘½ä»¤(SQL或内部指令)然åŽç»“æŸ\n"
+
+#: help.c:83
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME 指定è¦è¿žæŽ¥çš„æ•°æ®åº“ (默认:\"%s\")\n"
+
+#: help.c:84
+#, c-format
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=文件å 从文件中执行命令然åŽé€€å‡º\n"
+
+#: help.c:85
+#, c-format
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list 列出所有å¯ç”¨çš„æ•°æ®åº“,然åŽé€€å‡º\n"
+
+#: help.c:86
+#, c-format
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" 设置psqlå˜é‡NAME为VALUE\n"
+" (例如,-v ON_ERROR_STOP=1)\n"
+
+#: help.c:89
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: help.c:90
+#, c-format
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ä¸è¯»å–å¯åŠ¨æ–‡æ¡£(~/.psqlrc)\n"
+
+#: help.c:91
+#, c-format
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" 作为一个å•ä¸€äº‹åŠ¡æ¥æ‰§è¡Œå‘½ä»¤æ–‡ä»¶(如果是éžäº¤äº’åž‹çš„)\n"
+
+#: help.c:93
+#, c-format
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] 显示此帮助,然åŽé€€å‡º\n"
+
+#: help.c:94
+#, c-format
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands 列出å斜线命令,然åŽé€€å‡º\n"
+
+#: help.c:95
+#, c-format
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 列出特殊å˜é‡ï¼Œç„¶åŽé€€å‡º\n"
+
+#: help.c:97
+#, c-format
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"输入和输出选项:\n"
+
+#: help.c:98
+#, c-format
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all 显示所有æ¥è‡ªäºŽè„šæœ¬çš„输入\n"
+
+#: help.c:99
+#, c-format
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 回显失败的命令\n"
+
+#: help.c:100
+#, c-format
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries 显示å‘é€ç»™æœåŠ¡å™¨çš„命令\n"
+
+#: help.c:101
+#, c-format
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 显示内部命令产生的查询\n"
+
+#: help.c:102
+#, c-format
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=文件å 将会è¯æ—¥å¿—写入文件\n"
+
+#: help.c:103
+#, c-format
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline ç¦ç”¨å¢žå¼ºå‘½ä»¤è¡Œç¼–辑功能(readline)\n"
+
+#: help.c:104
+#, c-format
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME 将查询结果写入文件(或 |管é“)\n"
+
+#: help.c:105
+#, c-format
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet 以沉默模å¼è¿è¡Œ(ä¸æ˜¾ç¤ºæ¶ˆæ¯ï¼Œåªæœ‰æŸ¥è¯¢ç»“æžœ)\n"
+
+#: help.c:106
+#, c-format
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step å•æ­¥æ¨¡å¼ (确认æ¯ä¸ªæŸ¥è¯¢)\n"
+
+#: help.c:107
+#, c-format
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line å•è¡Œæ¨¡å¼ (ä¸€è¡Œå°±æ˜¯ä¸€æ¡ SQL 命令)\n"
+
+#: help.c:109
+#, c-format
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"输出格å¼é€‰é¡¹ :\n"
+
+#: help.c:110
+#, c-format
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align 使用éžå¯¹é½è¡¨æ ¼è¾“出模å¼\n"
+
+#: help.c:111
+#, c-format
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV(逗å·åˆ†éš”值)表输出模å¼\n"
+
+#: help.c:112
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" 为字段设置分隔符,用于ä¸æ•´é½çš„输出(默认:\"%s\")\n"
+
+#: help.c:115
+#, c-format
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML 表格输出模å¼\n"
+
+#: help.c:116
+#, c-format
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=å˜é‡[=å‚æ•°] 设置将å˜é‡æ‰“å°åˆ°å‚数的选项(查阅 \\pset 命令)\n"
+
+#: help.c:117
+#, c-format
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" 为ä¸æ•´é½çš„输出设置字录的分隔符(默认:æ¢è¡Œç¬¦å·)\n"
+
+#: help.c:119
+#, c-format
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only åªæ‰“å°è®°å½•i\n"
+
+#: help.c:120
+#, c-format
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=文本 设定 HTML 表格标记属性(例如,宽度,边界)\n"
+
+#: help.c:121
+#, c-format
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded 打开扩展表格输出\n"
+
+#: help.c:122
+#, c-format
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" 为ä¸æ•´é½çš„输出设置字段分隔符为字节0\n"
+
+#: help.c:124
+#, c-format
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" 为ä¸æ•´é½çš„输出设置记录分隔符为字节0\n"
+
+#: help.c:127
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"è”接选项:\n"
+
+#: help.c:130
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=主机å æ•°æ®åº“æœåŠ¡å™¨ä¸»æœºæˆ–socket目录(默认:\"%s\")\n"
+
+#: help.c:131
+msgid "local socket"
+msgstr "本地接å£"
+
+#: help.c:134
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=ç«¯å£ æ•°æ®åº“æœåŠ¡å™¨çš„端å£(默认:\"%s\")\n"
+
+#: help.c:137
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=用户å 指定数æ®åº“用户å(默认:\"%s\")\n"
+
+#: help.c:138
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远ä¸æ示输入å£ä»¤\n"
+
+#: help.c:139
+#, c-format
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password 强制å£ä»¤æ示 (自动)\n"
+
+#: help.c:141
+#, c-format
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"更多信æ¯ï¼Œè¯·åœ¨psql中输入\"\\?\"(用于内部指令)或者 \"\\help\"(用于SQL命令),\n"
+"或者å‚考PostgreSQL文档中的psql章节.\n"
+"\n"
+
+#: help.c:144
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "臭虫报告至<%s>.\n"
+
+#: help.c:145
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: help.c:171
+#, c-format
+msgid "General\n"
+msgstr "一般性\n"
+
+#: help.c:172
+#, c-format
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright 显示PostgreSQL的使用和å‘行许å¯æ¡æ¬¾\n"
+
+#: help.c:173
+#, c-format
+msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] 执行查询并且以交å‰è¡¨æ˜¾ç¤ºç»“æžœ\n"
+
+#: help.c:174
+#, c-format
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose 以最冗长的形å¼æ˜¾ç¤ºæœ€è¿‘的错误消æ¯\n"
+
+#: help.c:175
+#, c-format
+#: help.c:175
+#, c-format
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] 执行查询(并将结果å‘é€åˆ°æ–‡ä»¶æˆ–|管é“);\n"
+" ä¸å¸¦å‚æ•°çš„\\g等价于分å·\n"
+
+#: help.c:177
+#, c-format
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc æ述查询结果,而ä¸æ‰§è¡Œå®ƒ\n"
+
+#: help.c:178
+#, c-format
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec 执行策略,然åŽæ‰§è¡Œå…¶ç»“果中的æ¯ä¸ªå€¼\n"
+
+#: help.c:179
+#, c-format
+msgid " \\gset [PREFIX] execute query and store results in psql variables\n"
+msgstr " \\gset [PREFIX] 执行查询并把结果存到psqlå˜é‡ä¸­\n"
+
+#: help.c:180
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] å°±åƒ\\g,但强制扩展输出模å¼\n"
+
+#: help.c:181
+#, c-format
+msgid " \\q quit psql\n"
+msgstr " \\q 退出 psql\n"
+
+#: help.c:182
+#, c-format
+msgid " \\watch [SEC] execute query every SEC seconds\n"
+msgstr " \\watch [SEC] æ¯éš”SEC秒执行一次查询\n"
+
+#: help.c:185
+#, c-format
+msgid "Help\n"
+msgstr "帮助\n"
+
+#: help.c:187
+#, c-format
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] 显示å斜线命令的帮助\n"
+
+#: help.c:188
+#, c-format
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options 显示 psql 命令行选项的帮助\n"
+
+#: help.c:189
+#, c-format
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables 显示特殊å˜é‡çš„帮助\n"
+
+#: help.c:190
+#, c-format
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] SQL命令语法上的说明,用*显示全部命令的语法说明\n"
+
+#: help.c:193
+#, c-format
+msgid "Query Buffer\n"
+msgstr "查询缓存区\n"
+
+#: help.c:194
+#, c-format
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] 使用外部编辑器编辑查询缓存区(或文件)\n"
+
+#: help.c:195
+#, c-format
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] 使用外部编辑器编辑函数定义\n"
+
+#: help.c:196
+#, c-format
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] 用外部编辑器编辑视图定义\n"
+
+#: help.c:197
+#, c-format
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p 显示查询缓存区的内容\n"
+
+#: help.c:198
+#, c-format
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r é‡ç½®(清除)查询缓存区\n"
+
+#: help.c:200
+#, c-format
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [文件] 显示历å²è®°å½•æˆ–将历å²è®°å½•ä¿å­˜åœ¨æ–‡ä»¶ä¸­\n"
+
+#: help.c:202
+#, c-format
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w 文件 将查询缓存区的内容写入文件\n"
+
+#: help.c:205
+#, c-format
+msgid "Input/Output\n"
+msgstr "输入/输出\n"
+
+#: help.c:206
+#, c-format
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... 执行 SQL COPY,将数æ®æµå‘é€åˆ°å®¢æˆ·ç«¯ä¸»æœº\n"
+
+#: help.c:207
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] 将字符串写到标准输出(-n表示没有æ¢è¡Œç¬¦)\n"
+
+#: help.c:208
+#, c-format
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i 文件 从文件中执行命令\n"
+
+#: help.c:209
+#, c-format
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE 与 \\i类似, 但是相对于当å‰è„šæœ¬çš„ä½ç½®\n"
+
+#: help.c:210
+#, c-format
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [文件] 将全部查询结果写入文件或 |管é“\n"
+
+#: help.c:211
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] 将字符串写入\\o输出æµ(-n表示无æ¢è¡Œ)\n"
+
+#: help.c:212
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] 将字符串写入标准错误(-n 表示无æ¢è¡Œ)\n"
+
+#: help.c:215
+#, c-format
+msgid "Conditional\n"
+msgstr "æ¡ä»¶\n"
+
+#: help.c:216
+#, c-format
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR 开始æ¡ä»¶å—\n"
+
+#: help.c:217
+#, c-format
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR 当å‰æ¡ä»¶å—内的备选方案\n"
+
+#: help.c:218
+#, c-format
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else 当å‰æ¡ä»¶å—内的最终备选方案\n"
+
+#: help.c:219
+#, c-format
+msgid " \\endif end conditional block\n"
+msgstr " \\endif æ¡ä»¶å—的结尾\n"
+
+#: help.c:222
+#, c-format
+msgid "Informational\n"
+msgstr "资讯性\n"
+
+#: help.c:223
+#, c-format
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (选项: S = 显示系统对象, + = 其余的详细信æ¯)\n"
+
+#: help.c:224
+#, c-format
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] 列出表,视图和åºåˆ—\n"
+
+#: help.c:225
+#, c-format
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] å称 æ述表,视图,åºåˆ—,或索引\n"
+
+#: help.c:226
+#, c-format
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [模å¼] 列出èšåˆå‡½æ•°\n"
+
+#: help.c:227
+#, c-format
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [模å¼] 列出访问方法\n"
+
+#: help.c:228
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 列出è¿ç®—符\n"
+
+#: help.c:229
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 列出è¿ç®—符集åˆ\n"
+
+#: help.c:230
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 列出è¿ç®—符集åˆ\n"
+
+#: help.c:231
+#, c-format
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 列出è¿ç®—符集åˆæ‰€æ”¯æŒçš„功能\n"
+
+#: help.c:232
+#, c-format
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [模å¼] 列出表空间\n"
+
+#: help.c:233
+#, c-format
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [模å¼] 列表转æ¢\n"
+
+#: help.c:234
+#, c-format
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [模å¼] 列出类型强制转æ¢\n"
+
+#: help.c:235
+#, c-format
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [模å¼] 显示没有在别处显示的对象æè¿°\n"
+
+#: help.c:236
+#, c-format
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [模å¼] 列出共åŒå€¼åŸŸ\n"
+
+#: help.c:237
+#, c-format
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [模å¼] 列出默认æƒé™\n"
+
+#: help.c:238
+#, c-format
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [模å¼] 列出引用表\n"
+
+#: help.c:239
+#, c-format
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [模å¼] 列出引用表\n"
+
+#: help.c:240
+#, c-format
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [模å¼] 列出外部æœåŠ¡å™¨\n"
+
+#: help.c:241
+#, c-format
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [模å¼] 列出用户映射\n"
+
+#: help.c:242
+#, c-format
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [模å¼] 列出外部数æ®å°è£…器\n"
+
+#: help.c:243
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" 列出 [only agg/normal/procedure/trigger/window] 函数\n"
+
+#: help.c:245
+#, c-format
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [模å¼] 列出文本æœç´¢é…ç½®\n"
+
+#: help.c:246
+#, c-format
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [模å¼] 列出文本æœç´¢å­—å…¸\n"
+
+#: help.c:247
+#, c-format
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [模å¼] 列出文本æœç´¢è§£æžå™¨\n"
+
+#: help.c:248
+#, c-format
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [模å¼] 列出文本æœç´¢æ¨¡ç‰ˆ\n"
+
+#: help.c:249
+#, c-format
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [模å¼] 列出角色\n"
+
+#: help.c:250
+#, c-format
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [模å¼] 列出索引\n"
+
+#: help.c:251
+#, c-format
+msgid " \\dl list large objects, same as \\lo_list\n"
+msgstr " \\dl 列出大对象, 功能与\\lo_list相åŒ\n"
+
+#: help.c:252
+#, c-format
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [模å¼] 列出所有过程语言\n"
+
+#: help.c:253
+#, c-format
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [模å¼] 列出所有物化视图\n"
+
+#: help.c:254
+#, c-format
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [模å¼] 列出所有模å¼\n"
+
+#: help.c:255
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" 列出è¿ç®—符\n"
+
+#: help.c:257
+#, c-format
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [模å¼] 列出所有校对规则\n"
+
+#: help.c:258
+#, c-format
+msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp [模å¼] 列出表,视图和åºåˆ—的访问æƒé™\n"
+
+#: help.c:259
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] 列出[仅表/索引]分区关系[n=nested]\n"
+
+#: help.c:260
+#, c-format
+msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n"
+msgstr " \\drds [模å¼1 [模å¼2]] 列出æ¯ä¸ªæ•°æ®åº“的角色设置\n"
+
+#: help.c:261
+#, c-format
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [模å¼] 列出å¤åˆ¶å‘布\n"
+
+#: help.c:262
+#, c-format
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [模å¼] 列出å¤åˆ¶è®¢é˜…\n"
+
+#: help.c:263
+#, c-format
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [模å¼] 列出åºåˆ—\n"
+
+#: help.c:264
+#, c-format
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [模å¼] 列出表\n"
+
+#: help.c:265
+#, c-format
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [模å¼] 列出数æ®ç±»åž‹\n"
+
+#: help.c:266
+#, c-format
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [模å¼] 列出角色\n"
+
+#: help.c:267
+#, c-format
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [模å¼] 列出视图\n"
+
+#: help.c:268
+#, c-format
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [模å¼] 列出扩展\n"
+
+#: help.c:269
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] 列出扩展统计信æ¯\n"
+
+#: help.c:270
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] 列出所有事件触å‘器\n"
+
+#: help.c:271
+#, c-format
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [模å¼] 列出所有数æ®åº“\n"
+
+#: help.c:272
+#, c-format
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME 显示一个函数的定义\n"
+
+#: help.c:273
+#, c-format
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME 显示一个视图的定义\n"
+
+#: help.c:274
+#, c-format
+msgid " \\z [PATTERN] same as \\dp\n"
+msgstr " \\z [模å¼] å’Œ\\dp的功能相åŒ\n"
+
+#: help.c:277
+#, c-format
+msgid "Formatting\n"
+msgstr "æ ¼å¼åŒ–\n"
+
+#: help.c:278
+#, c-format
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a 在éžå¯¹é½æ¨¡å¼å’Œå¯¹é½æ¨¡å¼ä¹‹é—´åˆ‡æ¢\n"
+
+#: help.c:279
+#, c-format
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [字符串] 设置表的标题,或如果没有的标题就å–消\n"
+
+#: help.c:280
+#, c-format
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [字符串] 显示或设定éžå¯¹é½æ¨¡å¼æŸ¥è¯¢è¾“出的字段分隔符\n"
+
+#: help.c:281
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H 切æ¢HTMLè¾“å‡ºæ¨¡å¼ (ç›®å‰æ˜¯ %s)\n"
+
+#: help.c:283
+#, c-format
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] 设置表输出选项\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle\n"
+
+#: help.c:290
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [å¼€|å…³] åªæ˜¾ç¤ºè®°å½• (ç›®å‰æ˜¯%s)\n"
+
+#: help.c:292
+#, c-format
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [字符串] 设置HTML <表格>标签属性, 或者如果没有的è¯å–消设置\n"
+
+#: help.c:293
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] 切æ¢æ‰©å±•è¾“出模å¼(ç›®å‰æ˜¯ %s)\n"
+
+#: help.c:297
+#, c-format
+msgid "Connection\n"
+msgstr "连接\n"
+
+#: help.c:299
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 连接到新数æ®åº“(当å‰æ˜¯\"%s\")\n"
+
+#: help.c:303
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 连接到新数æ®åº“(当å‰æ— è¿žæŽ¥ï¼‰\n"
+
+#: help.c:305
+#, c-format
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo 显示当å‰è¿žæŽ¥çš„相关信æ¯\n"
+
+#: help.c:306
+#, c-format
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ç¼–ç å称] 显示或设定客户端编ç \n"
+
+#: help.c:307
+#, c-format
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] 安全地为用户更改å£ä»¤\n"
+
+#: help.c:310
+#, c-format
+msgid "Operating System\n"
+msgstr "æ“作系统\n"
+
+#: help.c:311
+#, c-format
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [目录] 更改目å‰çš„工作目录\n"
+
+#: help.c:312
+#, c-format
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] 设置或清空环境å˜é‡\n"
+
+#: help.c:313
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [å¼€|å…³] 切æ¢å‘½ä»¤è®¡æ—¶å¼€å…³ (ç›®å‰æ˜¯%s)\n"
+
+#: help.c:315
+#, c-format
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [命令] 在 shell中执行命令或å¯åŠ¨ä¸€ä¸ªäº¤äº’å¼shell\n"
+
+#: help.c:318
+#, c-format
+msgid "Variables\n"
+msgstr "å˜é‡\n"
+
+#: help.c:319
+#, c-format
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [文本] å称 æ示用户设定内部å˜é‡\n"
+
+#: help.c:320
+#, c-format
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [å称 [值数]] 设定内部å˜é‡ï¼Œè‹¥æ— å‚数则列出全部å˜é‡\n"
+
+#: help.c:321
+#, c-format
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset å称 清空(删除)内部å˜é‡\n"
+
+#: help.c:324
+#, c-format
+msgid "Large Objects\n"
+msgstr "大对象\n"
+
+#: help.c:325
+#, c-format
+msgid ""
+" \\lo_export LOBOID FILE\n"
+" \\lo_import FILE [COMMENT]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID large object operations\n"
+msgstr ""
+" \\lo_export LOBOID 文件\n"
+" \\lo_import 文件 [注释]\n"
+" \\lo_list\n"
+" \\lo_unlink LOBOID 大对象è¿ç®—\n"
+
+#: help.c:352
+#, c-format
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"特殊对待的å˜é‡çš„列表\n"
+"\n"
+
+#: help.c:354
+#, c-format
+msgid "psql variables:\n"
+msgstr "psqlå˜é‡ï¼š\n"
+
+#: help.c:356
+#, c-format
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" 或者在 psql 中的 \\set NAME VALUE\n"
+"\n"
+
+#: help.c:358
+#, c-format
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" 如果被设置,æˆåŠŸçš„SQL命令将会被自动æ交\n"
+
+#: help.c:360
+#, c-format
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" å†³å®šç”¨äºŽå®Œæˆ SQL 关键è¯çš„大å°å†™\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:363
+#, c-format
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" 当å‰å·²è¿žæŽ¥çš„æ•°æ®åº“å\n"
+
+#: help.c:365
+#, c-format
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" 控制哪些输入被写入到标准输出\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:368
+#, c-format
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" 如果被设置,显示å斜线命令执行的内部命令;\n"
+" 如果被设置为 \"noexec\",åªæ˜¾ç¤ºä½†ä¸æ‰§è¡Œ\n"
+
+#: help.c:371
+#, c-format
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" 当å‰çš„客户端字符集编ç \n"
+
+#: help.c:373
+#, c-format
+msgid ""
+" ERROR\n"
+" true if last query failed, else false\n"
+msgstr ""
+" 错误\n"
+" 如果上次查询失败,则为true,å¦åˆ™ä¸ºfalse\n"
+
+#: help.c:375
+#, c-format
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" 一次å–å¾—å¹¶æ˜¾ç¤ºçš„ç»“æžœè¡Œçš„æ•°é‡ (0=æ— é™)\n"
+
+#: help.c:377
+#, c-format
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 如果设置,则ä¸æ˜¾ç¤ºè¡¨è®¿é—®æ–¹æ³•\n"
+
+#: help.c:379
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 如果设置,ä¸æ˜¾ç¤ºåŽ‹ç¼©æ–¹æ³•\n"
+
+#: help.c:381
+#, c-format
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" æŽ§åˆ¶å‘½ä»¤åŽ†å² [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:383
+#, c-format
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" 用æ¥å­˜å‚¨å‘½ä»¤åŽ†å²çš„文件å\n"
+
+#: help.c:385
+#, c-format
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" ä¿å­˜åœ¨å‘½ä»¤åŽ†å²ä¸­çš„最大命令数\n"
+
+#: help.c:387
+#, c-format
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" 当å‰è¿žæŽ¥çš„æ•°æ®åº“æœåŠ¡å™¨ä¸»æœº\n"
+
+#: help.c:389
+#, c-format
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" 终止交互å¼ä¼šè¯æ‰€éœ€çš„EOFæ•°\n"
+
+#: help.c:391
+#, c-format
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 最åŽä¸€ä¸ªå—å½±å“çš„ OID 的值\n"
+
+#: help.c:393
+#, c-format
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 最åŽä¸€ä¸ªé”™è¯¯çš„消æ¯å’ŒSQL状æ€ï¼Œå¦‚果没有,则为空字符串和\"00000\"\n"
+
+#: help.c:396
+#, c-format
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" 如果被设置,则错误ä¸ä¼šåœæ­¢ä¸€ä¸ªäº‹åŠ¡ï¼ˆä½¿ç”¨éšå¼ä¿å­˜ç‚¹ï¼‰\n"
+
+#: help.c:398
+#, c-format
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" å‘生错误åŽåœæ­¢æ‰¹é‡æ‰§è¡Œ\n"
+
+#: help.c:400
+#, c-format
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" 当å‰è¿žæŽ¥çš„æœåŠ¡å™¨ç«¯å£\n"
+
+#: help.c:402
+#, c-format
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" 指定标准的 psql æ示符\n"
+
+#: help.c:404
+#, c-format
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" 指定在语å¥è·¨è¡Œæ—¶ä½¿ç”¨çš„æ示符\n"
+
+#: help.c:406
+#, c-format
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" 指定 COPY ... FROM STDIN 期间使用的æ示符\n"
+
+#: help.c:408
+#, c-format
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" é™é»˜åœ°è¿è¡Œï¼ˆå’Œ-q选项相åŒï¼‰\n"
+
+#: help.c:410
+#, c-format
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 上一个查询返回或影å“的行数,或0\n"
+
+#: help.c:412
+#, c-format
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" æœåŠ¡å™¨ç‰ˆæœ¬ï¼ˆçŸ­å­—符串或数字格å¼ï¼‰\n"
+
+#: help.c:415
+#, c-format
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" 控制消æ¯ä¸Šä¸‹æ–‡åŸŸçš„显示 [never, errors, always]\n"
+
+#: help.c:417
+#, c-format
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" 设置的è¯ï¼Œè¡Œå°¾ä¼šç»ˆæ­¢SQL命令模å¼ï¼ˆä¸Ž-S选项相åŒï¼‰\n"
+
+#: help.c:419
+#, c-format
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" å•æ­¥æ¨¡å¼ï¼ˆä¸Ž-s选项相åŒï¼‰\n"
+
+#: help.c:421
+#, c-format
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 上次查询的SQL状æ€ï¼Œå¦‚果没有错误,则为\"00000\"\n"
+
+#: help.c:423
+#, c-format
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" 当å‰è¿žæŽ¥ä¸Šçš„æ•°æ®åº“用户\n"
+
+#: help.c:425
+#, c-format
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" 控制错误报告的冗长程度 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:427
+#, c-format
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql版本(详细字符串ã€çŸ­å­—符串或数字格å¼ï¼‰\n"
+
+#: help.c:432
+#, c-format
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"显示设置:\n"
+
+#: help.c:434
+#, c-format
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" 或者 psql 中的 \\pset NAME [VALUE]\n"
+"\n"
+
+#: help.c:436
+#, c-format
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" 边界样å¼ï¼ˆæ•°å­—)\n"
+
+#: help.c:438
+#, c-format
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" 用于回å·æ ¼å¼çš„目标宽度\n"
+
+#: help.c:440
+#, c-format
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" 扩展输出 [on, off, auto]\n"
+
+#: help.c:442
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" 用于éžå¯¹é½è¾“出的域分隔符(默认是 \"%s\")\n"
+
+#: help.c:445
+#, c-format
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" 将用于éžå¯¹é½æ¨¡å¼ä¸­çš„域分隔符设置为零字节\n"
+
+#: help.c:447
+#, c-format
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" å¯ç”¨æˆ–ç¦ç”¨è¡¨æ ¼é¡µè„šçš„显示 [on, off]\n"
+
+#: help.c:449
+#, c-format
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" è®¾ç½®è¾“å‡ºæ ¼å¼ [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:451
+#, c-format
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" 设置边界线绘制风格 [ascii, old-ascii, unicode]\n"
+
+#: help.c:453
+#, c-format
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" 设置代替空值被打å°çš„字符串\n"
+
+#: help.c:455
+#, c-format
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" å…许显示特定于区域设置的字符以分隔数字组\n"
+
+#: help.c:457
+#, c-format
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" 控制何时使用一个外部分页器 [yes, no, always]\n"
+
+#: help.c:459
+#, c-format
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" 用于éžå¯¹é½è¾“出中的记录(行)分隔符\n"
+
+#: help.c:461
+#, c-format
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" 将用于éžå¯¹é½è¾“出中的记录分隔符设置为零字节\n"
+
+#: help.c:463
+#, c-format
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (或者 T)\n"
+" 指定 html æ ¼å¼ä¸­è¡¨æ ‡ç­¾çš„属性\n"
+" 或者 latex-longtable æ ¼å¼ä¸­å·¦å¯¹é½æ•°æ®ç±»åž‹çš„比例列宽\n"
+
+#: help.c:466
+#, c-format
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" 为任何åŽç»­è¢«æ‰“å°çš„表设置表标题\n"
+
+#: help.c:468
+#, c-format
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" 如果被设置,åªæœ‰çœŸå®žçš„表数æ®ä¼šè¢«æ˜¾ç¤º\n"
+
+#: help.c:470
+#, c-format
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" 设置 Unicode 线绘制的风格 [single, double]\n"
+
+#: help.c:475
+#, c-format
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"环境å˜é‡ï¼š\n"
+
+#: help.c:479
+#, c-format
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" 或者 psql 中的 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:481
+#, c-format
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" 或者 psql 中的 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:484
+#, c-format
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" 回å·æ ¼å¼çš„列数\n"
+
+#: help.c:486
+#, c-format
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" å’Œapplication_name连接å‚数相åŒ\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" å’Œdbname连接å‚数相åŒ\n"
+
+#: help.c:490
+#, c-format
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" 与主机连接å‚数相åŒ\n"
+
+#: help.c:492
+#, c-format
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" å£ä»¤æ–‡ä»¶å\n"
+
+#: help.c:494
+#, c-format
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 连接å£ä»¤ï¼ˆä¸æŽ¨è)\n"
+
+#: help.c:496
+#, c-format
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" 与端å£è¿žæŽ¥å‚数相åŒ\n"
+
+#: help.c:498
+#, c-format
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" 与用户连接å‚数相åŒ\n"
+
+#: help.c:500
+#, c-format
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\e, \\ef, 和 \\ev 命令使用的编辑器\n"
+
+#: help.c:502
+#, c-format
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" 调用编辑器时如何指定一个行å·\n"
+
+#: help.c:504
+#, c-format
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" 命令历å²æ–‡ä»¶çš„å¯é€‰ä½ç½®\n"
+
+#: help.c:506
+#, c-format
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" 外部分页程åºçš„å称\n"
+
+#: help.c:508
+#, c-format
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" 用户的.psqlrc文件的å¯é€‰ä½ç½®\n"
+
+#: help.c:510
+#, c-format
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! 命令使用的shell\n"
+
+#: help.c:512
+#, c-format
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" 临时文件的目录\n"
+
+#: help.c:557
+msgid "Available help:\n"
+msgstr "å¯ç”¨çš„说明:\n"
+
+#: help.c:652
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"命令: %s\n"
+"æ述: %s\n"
+"语法:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+
+#: help.c:675
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"没有 \"%s\" 的帮助说明.\n"
+"请å°è¯•ç”¨ä¸å¸¦å‚æ•°çš„ \\h æ¥çœ‹ä¸€ä¸‹æ˜¯å¦æœ‰å¯ä½¿ç”¨çš„帮助信æ¯.\n"
+
+#: input.c:217
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "无法从输入档案读å–:%m"
+
+#: input.c:471 input.c:509
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "无法将历å²è®°å½•å‚¨å­˜åˆ° \"%s\":%m"
+
+#: input.c:528
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "这个安装ä¸æ”¯æ´å‘½ä»¤è®°å½•"
+
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s:尚未与数æ®åº“连接"
+
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s:目å‰çš„事务被中止"
+
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s:ä¸æ˜Žäº‹åŠ¡çŠ¶æ€"
+
+#: large_obj.c:288 large_obj.c:299
+msgid "ID"
+msgstr "ID"
+
+#: large_obj.c:309
+msgid "Large objects"
+msgstr "大型对象"
+
+#: mainloop.c:136
+#, c-format
+msgid "\\if: escaped"
+msgstr "\\if: 逃脱"
+
+#: mainloop.c:195
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "使用 \"\\q\" 离开 %s.\n"
+
+#: mainloop.c:217
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"该输入是一个PostgreSQL自定义格å¼çš„转储.\n"
+"请使用pg_restore命令行客户端æ¥å°†è¿™ä¸ªè½¬å‚¨æ¢å¤åˆ°æ•°æ®åº“.\n"
+
+#: mainloop.c:298
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "使用\\?获得帮助或按control-C清除输入缓冲区."
+
+#: mainloop.c:300
+msgid "Use \\? for help."
+msgstr "使用\\?获å–帮助."
+
+#: mainloop.c:304
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "您正在使用psql, 这是一ç§ç”¨äºŽè®¿é—®PostgreSQL的命令行界é¢."
+
+#: mainloop.c:305
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"键入: \\copyright 显示å‘è¡Œæ¡æ¬¾\n"
+" \\h 显示 SQL 命令的说明\n"
+" \\? 显示 pgsql 命令的说明\n"
+" \\g 或者以分å·(;)结尾以执行查询\n"
+" \\q 退出\n"
+
+#: mainloop.c:329
+msgid "Use \\q to quit."
+msgstr "使用\\q 退出."
+
+#: mainloop.c:332 mainloop.c:356
+msgid "Use control-D to quit."
+msgstr "使用control-D退出."
+
+#: mainloop.c:334 mainloop.c:358
+msgid "Use control-C to quit."
+msgstr "使用control-C退出."
+
+#: mainloop.c:465 mainloop.c:613
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "查询被忽略;使用\\endif或Ctrl-C退出当å‰\\ifå—"
+
+#: mainloop.c:631
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "已到达EOF,但未找到结æŸç¬¦\\endif"
+
+#: psqlscanslash.l:638
+#, c-format
+msgid "unterminated quoted string"
+msgstr "未结æŸçš„引用字符串"
+
+#: psqlscanslash.l:811
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: 内存ä¸è¶³"
+
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123
+#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237
+#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247
+#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265
+#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322
+#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442
+#: sql_help.c:445 sql_help.c:447 sql_help.c:516 sql_help.c:521 sql_help.c:526
+#: sql_help.c:531 sql_help.c:536 sql_help.c:590 sql_help.c:592 sql_help.c:594
+#: sql_help.c:596 sql_help.c:598 sql_help.c:601 sql_help.c:603 sql_help.c:606
+#: sql_help.c:617 sql_help.c:619 sql_help.c:661 sql_help.c:663 sql_help.c:665
+#: sql_help.c:668 sql_help.c:670 sql_help.c:672 sql_help.c:707 sql_help.c:711
+#: sql_help.c:715 sql_help.c:734 sql_help.c:737 sql_help.c:740 sql_help.c:769
+#: sql_help.c:781 sql_help.c:789 sql_help.c:792 sql_help.c:795 sql_help.c:810
+#: sql_help.c:813 sql_help.c:842 sql_help.c:847 sql_help.c:852 sql_help.c:857
+#: sql_help.c:862 sql_help.c:884 sql_help.c:886 sql_help.c:888 sql_help.c:890
+#: sql_help.c:893 sql_help.c:895 sql_help.c:937 sql_help.c:982 sql_help.c:987
+#: sql_help.c:992 sql_help.c:997 sql_help.c:1002 sql_help.c:1021
+#: sql_help.c:1032 sql_help.c:1034 sql_help.c:1053 sql_help.c:1063
+#: sql_help.c:1065 sql_help.c:1067 sql_help.c:1079 sql_help.c:1083
+#: sql_help.c:1085 sql_help.c:1097 sql_help.c:1099 sql_help.c:1101
+#: sql_help.c:1103 sql_help.c:1121 sql_help.c:1123 sql_help.c:1127
+#: sql_help.c:1131 sql_help.c:1135 sql_help.c:1138 sql_help.c:1139
+#: sql_help.c:1140 sql_help.c:1143 sql_help.c:1145 sql_help.c:1280
+#: sql_help.c:1282 sql_help.c:1285 sql_help.c:1288 sql_help.c:1290
+#: sql_help.c:1292 sql_help.c:1295 sql_help.c:1298 sql_help.c:1411
+#: sql_help.c:1413 sql_help.c:1415 sql_help.c:1418 sql_help.c:1439
+#: sql_help.c:1442 sql_help.c:1445 sql_help.c:1448 sql_help.c:1452
+#: sql_help.c:1454 sql_help.c:1456 sql_help.c:1458 sql_help.c:1472
+#: sql_help.c:1475 sql_help.c:1477 sql_help.c:1479 sql_help.c:1489
+#: sql_help.c:1491 sql_help.c:1501 sql_help.c:1503 sql_help.c:1513
+#: sql_help.c:1516 sql_help.c:1539 sql_help.c:1541 sql_help.c:1543
+#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1550 sql_help.c:1553
+#: sql_help.c:1556 sql_help.c:1607 sql_help.c:1650 sql_help.c:1653
+#: sql_help.c:1655 sql_help.c:1657 sql_help.c:1660 sql_help.c:1662
+#: sql_help.c:1664 sql_help.c:1667 sql_help.c:1717 sql_help.c:1733
+#: sql_help.c:1964 sql_help.c:2033 sql_help.c:2052 sql_help.c:2065
+#: sql_help.c:2122 sql_help.c:2129 sql_help.c:2139 sql_help.c:2160
+#: sql_help.c:2186 sql_help.c:2204 sql_help.c:2231 sql_help.c:2328
+#: sql_help.c:2374 sql_help.c:2398 sql_help.c:2421 sql_help.c:2425
+#: sql_help.c:2459 sql_help.c:2479 sql_help.c:2501 sql_help.c:2515
+#: sql_help.c:2536 sql_help.c:2560 sql_help.c:2590 sql_help.c:2615
+#: sql_help.c:2662 sql_help.c:2950 sql_help.c:2963 sql_help.c:2980
+#: sql_help.c:2996 sql_help.c:3036 sql_help.c:3090 sql_help.c:3094
+#: sql_help.c:3096 sql_help.c:3103 sql_help.c:3122 sql_help.c:3149
+#: sql_help.c:3184 sql_help.c:3196 sql_help.c:3205 sql_help.c:3249
+#: sql_help.c:3263 sql_help.c:3291 sql_help.c:3299 sql_help.c:3311
+#: sql_help.c:3321 sql_help.c:3329 sql_help.c:3337 sql_help.c:3345
+#: sql_help.c:3353 sql_help.c:3362 sql_help.c:3373 sql_help.c:3381
+#: sql_help.c:3389 sql_help.c:3397 sql_help.c:3405 sql_help.c:3415
+#: sql_help.c:3424 sql_help.c:3433 sql_help.c:3441 sql_help.c:3451
+#: sql_help.c:3462 sql_help.c:3470 sql_help.c:3479 sql_help.c:3490
+#: sql_help.c:3499 sql_help.c:3507 sql_help.c:3515 sql_help.c:3523
+#: sql_help.c:3531 sql_help.c:3539 sql_help.c:3547 sql_help.c:3555
+#: sql_help.c:3563 sql_help.c:3571 sql_help.c:3579 sql_help.c:3596
+#: sql_help.c:3605 sql_help.c:3613 sql_help.c:3630 sql_help.c:3645
+#: sql_help.c:3947 sql_help.c:3998 sql_help.c:4027 sql_help.c:4042
+#: sql_help.c:4527 sql_help.c:4575 sql_help.c:4726
+msgid "name"
+msgstr "å称"
+
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1814
+#: sql_help.c:3264 sql_help.c:4303
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250
+#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:525 sql_help.c:573
+#: sql_help.c:591 sql_help.c:618 sql_help.c:669 sql_help.c:736 sql_help.c:791
+#: sql_help.c:812 sql_help.c:851 sql_help.c:896 sql_help.c:938 sql_help.c:991
+#: sql_help.c:1023 sql_help.c:1033 sql_help.c:1066 sql_help.c:1086
+#: sql_help.c:1100 sql_help.c:1146 sql_help.c:1289 sql_help.c:1412
+#: sql_help.c:1455 sql_help.c:1476 sql_help.c:1490 sql_help.c:1502
+#: sql_help.c:1515 sql_help.c:1542 sql_help.c:1608 sql_help.c:1661
+msgid "new_name"
+msgstr "æ–°çš„å称"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248
+#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:530 sql_help.c:620
+#: sql_help.c:629 sql_help.c:690 sql_help.c:710 sql_help.c:739 sql_help.c:794
+#: sql_help.c:856 sql_help.c:894 sql_help.c:996 sql_help.c:1035 sql_help.c:1064
+#: sql_help.c:1084 sql_help.c:1098 sql_help.c:1144 sql_help.c:1352
+#: sql_help.c:1414 sql_help.c:1457 sql_help.c:1478 sql_help.c:1540
+#: sql_help.c:1656 sql_help.c:2936
+msgid "new_owner"
+msgstr "新的属主"
+
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319
+#: sql_help.c:448 sql_help.c:535 sql_help.c:671 sql_help.c:714 sql_help.c:742
+#: sql_help.c:797 sql_help.c:861 sql_help.c:1001 sql_help.c:1068
+#: sql_help.c:1102 sql_help.c:1291 sql_help.c:1459 sql_help.c:1480
+#: sql_help.c:1492 sql_help.c:1504 sql_help.c:1544 sql_help.c:1663
+msgid "new_schema"
+msgstr "新的模å¼"
+
+#: sql_help.c:44 sql_help.c:1878 sql_help.c:3265 sql_help.c:4332
+msgid "where aggregate_signature is:"
+msgstr "其中 aggregate_signature 是:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350
+#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:517
+#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:843
+#: sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:863 sql_help.c:983
+#: sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1003 sql_help.c:1832
+#: sql_help.c:1849 sql_help.c:1855 sql_help.c:1879 sql_help.c:1882
+#: sql_help.c:1885 sql_help.c:2034 sql_help.c:2053 sql_help.c:2056
+#: sql_help.c:2329 sql_help.c:2537 sql_help.c:3266 sql_help.c:3269
+#: sql_help.c:3272 sql_help.c:3363 sql_help.c:3452 sql_help.c:3480
+#: sql_help.c:3825 sql_help.c:4205 sql_help.c:4309 sql_help.c:4316
+#: sql_help.c:4322 sql_help.c:4333 sql_help.c:4336 sql_help.c:4339
+msgid "argmode"
+msgstr "å‚数模å¼"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351
+#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:518
+#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:844
+#: sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:864 sql_help.c:984
+#: sql_help.c:989 sql_help.c:994 sql_help.c:999 sql_help.c:1004 sql_help.c:1833
+#: sql_help.c:1850 sql_help.c:1856 sql_help.c:1880 sql_help.c:1883
+#: sql_help.c:1886 sql_help.c:2035 sql_help.c:2054 sql_help.c:2057
+#: sql_help.c:2330 sql_help.c:2538 sql_help.c:3267 sql_help.c:3270
+#: sql_help.c:3273 sql_help.c:3364 sql_help.c:3453 sql_help.c:3481
+#: sql_help.c:4310 sql_help.c:4317 sql_help.c:4323 sql_help.c:4334
+#: sql_help.c:4337 sql_help.c:4340
+msgid "argname"
+msgstr "å‚æ•°å称"
+
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352
+#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:519
+#: sql_help.c:524 sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:845
+#: sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:985
+#: sql_help.c:990 sql_help.c:995 sql_help.c:1000 sql_help.c:1005
+#: sql_help.c:1834 sql_help.c:1851 sql_help.c:1857 sql_help.c:1881
+#: sql_help.c:1884 sql_help.c:1887 sql_help.c:2331 sql_help.c:2539
+#: sql_help.c:3268 sql_help.c:3271 sql_help.c:3274 sql_help.c:3365
+#: sql_help.c:3454 sql_help.c:3482 sql_help.c:4311 sql_help.c:4318
+#: sql_help.c:4324 sql_help.c:4335 sql_help.c:4338 sql_help.c:4341
+msgid "argtype"
+msgstr "å‚数类型"
+
+#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:932
+#: sql_help.c:1081 sql_help.c:1473 sql_help.c:1602 sql_help.c:1634
+#: sql_help.c:1686 sql_help.c:1749 sql_help.c:1935 sql_help.c:1942
+#: sql_help.c:2234 sql_help.c:2276 sql_help.c:2283 sql_help.c:2292
+#: sql_help.c:2375 sql_help.c:2591 sql_help.c:2684 sql_help.c:2965
+#: sql_help.c:3150 sql_help.c:3172 sql_help.c:3312 sql_help.c:3667
+#: sql_help.c:3866 sql_help.c:4041 sql_help.c:4789
+msgid "option"
+msgstr "选项"
+
+#: sql_help.c:113 sql_help.c:933 sql_help.c:1603 sql_help.c:2376
+#: sql_help.c:2592 sql_help.c:3151 sql_help.c:3313
+msgid "where option can be:"
+msgstr "选项å¯ä»¥æ˜¯"
+
+#: sql_help.c:114 sql_help.c:2168
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:115 sql_help.c:934 sql_help.c:1604 sql_help.c:2169
+#: sql_help.c:2377 sql_help.c:2593 sql_help.c:3152
+msgid "connlimit"
+msgstr "连接é™åˆ¶"
+
+#: sql_help.c:116 sql_help.c:2170
+msgid "istemplate"
+msgstr "istemplate"
+
+#: sql_help.c:122 sql_help.c:608 sql_help.c:674 sql_help.c:1294 sql_help.c:1345
+#: sql_help.c:4045
+msgid "new_tablespace"
+msgstr "新的表空间"
+
+#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:545 sql_help.c:547
+#: sql_help.c:548 sql_help.c:868 sql_help.c:870 sql_help.c:871 sql_help.c:941
+#: sql_help.c:945 sql_help.c:948 sql_help.c:1010 sql_help.c:1012
+#: sql_help.c:1013 sql_help.c:1157 sql_help.c:1160 sql_help.c:1611
+#: sql_help.c:1615 sql_help.c:1618 sql_help.c:2341 sql_help.c:2543
+#: sql_help.c:4063 sql_help.c:4516
+msgid "configuration_parameter"
+msgstr "é…ç½®å‚æ•°"
+
+#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484
+#: sql_help.c:546 sql_help.c:600 sql_help.c:680 sql_help.c:688 sql_help.c:869
+#: sql_help.c:892 sql_help.c:942 sql_help.c:1011 sql_help.c:1082
+#: sql_help.c:1126 sql_help.c:1130 sql_help.c:1134 sql_help.c:1137
+#: sql_help.c:1142 sql_help.c:1158 sql_help.c:1159 sql_help.c:1325
+#: sql_help.c:1347 sql_help.c:1395 sql_help.c:1417 sql_help.c:1474
+#: sql_help.c:1558 sql_help.c:1612 sql_help.c:1635 sql_help.c:2235
+#: sql_help.c:2277 sql_help.c:2284 sql_help.c:2293 sql_help.c:2342
+#: sql_help.c:2343 sql_help.c:2406 sql_help.c:2409 sql_help.c:2443
+#: sql_help.c:2544 sql_help.c:2545 sql_help.c:2563 sql_help.c:2685
+#: sql_help.c:2724 sql_help.c:2830 sql_help.c:2843 sql_help.c:2857
+#: sql_help.c:2898 sql_help.c:2922 sql_help.c:2939 sql_help.c:2966
+#: sql_help.c:3173 sql_help.c:3867 sql_help.c:4517 sql_help.c:4518
+msgid "value"
+msgstr "值"
+
+#: sql_help.c:197
+msgid "target_role"
+msgstr "目标角色"
+
+#: sql_help.c:198 sql_help.c:2219 sql_help.c:2640 sql_help.c:2645
+#: sql_help.c:3800 sql_help.c:3809 sql_help.c:3828 sql_help.c:3837
+#: sql_help.c:4180 sql_help.c:4189 sql_help.c:4208 sql_help.c:4217
+msgid "schema_name"
+msgstr "模å¼å称"
+
+#: sql_help.c:199
+msgid "abbreviated_grant_or_revoke"
+msgstr "简写形å¼çš„å¯æŽˆäºˆæˆ–回收的æƒé™"
+
+#: sql_help.c:200
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "简写形å¼çš„å¯æŽˆäºˆæˆ–回收æƒé™æ˜¯ä¸‹åˆ—内容之一:"
+
+#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205
+#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210
+#: sql_help.c:571 sql_help.c:607 sql_help.c:673 sql_help.c:815 sql_help.c:952
+#: sql_help.c:1293 sql_help.c:1622 sql_help.c:2380 sql_help.c:2381
+#: sql_help.c:2382 sql_help.c:2383 sql_help.c:2384 sql_help.c:2517
+#: sql_help.c:2596 sql_help.c:2597 sql_help.c:2598 sql_help.c:2599
+#: sql_help.c:2600 sql_help.c:3155 sql_help.c:3156 sql_help.c:3157
+#: sql_help.c:3158 sql_help.c:3159 sql_help.c:3846 sql_help.c:3850
+#: sql_help.c:4226 sql_help.c:4230 sql_help.c:4537
+msgid "role_name"
+msgstr "角色å称"
+
+#: sql_help.c:236 sql_help.c:459 sql_help.c:1309 sql_help.c:1311
+#: sql_help.c:1362 sql_help.c:1374 sql_help.c:1399 sql_help.c:1652
+#: sql_help.c:2189 sql_help.c:2193 sql_help.c:2296 sql_help.c:2301
+#: sql_help.c:2402 sql_help.c:2701 sql_help.c:2706 sql_help.c:2708
+#: sql_help.c:2825 sql_help.c:2838 sql_help.c:2852 sql_help.c:2861
+#: sql_help.c:2873 sql_help.c:2902 sql_help.c:3898 sql_help.c:3913
+#: sql_help.c:3915 sql_help.c:4394 sql_help.c:4395 sql_help.c:4404
+#: sql_help.c:4446 sql_help.c:4447 sql_help.c:4448 sql_help.c:4449
+#: sql_help.c:4450 sql_help.c:4451 sql_help.c:4491 sql_help.c:4492
+#: sql_help.c:4497 sql_help.c:4502 sql_help.c:4643 sql_help.c:4644
+#: sql_help.c:4653 sql_help.c:4695 sql_help.c:4696 sql_help.c:4697
+#: sql_help.c:4698 sql_help.c:4699 sql_help.c:4700 sql_help.c:4754
+#: sql_help.c:4756 sql_help.c:4816 sql_help.c:4874 sql_help.c:4875
+#: sql_help.c:4884 sql_help.c:4926 sql_help.c:4927 sql_help.c:4928
+#: sql_help.c:4929 sql_help.c:4930 sql_help.c:4931
+msgid "expression"
+msgstr "表达å¼"
+
+#: sql_help.c:239
+msgid "domain_constraint"
+msgstr "域_约æŸ"
+
+#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475
+#: sql_help.c:1286 sql_help.c:1333 sql_help.c:1334 sql_help.c:1335
+#: sql_help.c:1361 sql_help.c:1373 sql_help.c:1390 sql_help.c:1820
+#: sql_help.c:1822 sql_help.c:2192 sql_help.c:2295 sql_help.c:2300
+#: sql_help.c:2860 sql_help.c:2872 sql_help.c:3910
+msgid "constraint_name"
+msgstr "约æŸå称"
+
+#: sql_help.c:244 sql_help.c:1287
+msgid "new_constraint_name"
+msgstr "new_constraint_name(新约æŸå)"
+
+#: sql_help.c:317 sql_help.c:1080
+msgid "new_version"
+msgstr "新版本"
+
+#: sql_help.c:321 sql_help.c:323
+msgid "member_object"
+msgstr "member_object"
+
+#: sql_help.c:324
+msgid "where member_object is:"
+msgstr "member_objectçš„ä½ç½®:"
+
+#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333
+#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346
+#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360
+#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367
+#: sql_help.c:368 sql_help.c:1812 sql_help.c:1817 sql_help.c:1824
+#: sql_help.c:1825 sql_help.c:1826 sql_help.c:1827 sql_help.c:1828
+#: sql_help.c:1829 sql_help.c:1830 sql_help.c:1835 sql_help.c:1837
+#: sql_help.c:1841 sql_help.c:1843 sql_help.c:1847 sql_help.c:1852
+#: sql_help.c:1853 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 sql_help.c:1866
+#: sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 sql_help.c:1870
+#: sql_help.c:1875 sql_help.c:1876 sql_help.c:4299 sql_help.c:4304
+#: sql_help.c:4305 sql_help.c:4306 sql_help.c:4307 sql_help.c:4313
+#: sql_help.c:4314 sql_help.c:4319 sql_help.c:4320 sql_help.c:4325
+#: sql_help.c:4326 sql_help.c:4327 sql_help.c:4328 sql_help.c:4329
+#: sql_help.c:4330
+msgid "object_name"
+msgstr "对象_å称"
+
+#: sql_help.c:326 sql_help.c:1813 sql_help.c:4302
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+#: sql_help.c:328 sql_help.c:1815 sql_help.c:2099 sql_help.c:2103
+#: sql_help.c:2105 sql_help.c:3282
+msgid "source_type"
+msgstr "类型指派中的æºæ•°æ®ç±»åž‹"
+
+#: sql_help.c:329 sql_help.c:1816 sql_help.c:2100 sql_help.c:2104
+#: sql_help.c:2106 sql_help.c:3283
+msgid "target_type"
+msgstr "类型指派中的目标数æ®ç±»åž‹"
+
+#: sql_help.c:336 sql_help.c:779 sql_help.c:1831 sql_help.c:2101
+#: sql_help.c:2142 sql_help.c:2207 sql_help.c:2460 sql_help.c:2491
+#: sql_help.c:3042 sql_help.c:4204 sql_help.c:4308 sql_help.c:4423
+#: sql_help.c:4427 sql_help.c:4431 sql_help.c:4434 sql_help.c:4672
+#: sql_help.c:4676 sql_help.c:4680 sql_help.c:4683 sql_help.c:4903
+#: sql_help.c:4907 sql_help.c:4911 sql_help.c:4914
+msgid "function_name"
+msgstr "函数å称"
+
+#: sql_help.c:341 sql_help.c:772 sql_help.c:1838 sql_help.c:2484
+msgid "operator_name"
+msgstr "æ“作符å称"
+
+#: sql_help.c:342 sql_help.c:708 sql_help.c:712 sql_help.c:716 sql_help.c:1839
+#: sql_help.c:2461 sql_help.c:3406
+msgid "left_type"
+msgstr "æ“作符左边æ“作数的类型"
+
+#: sql_help.c:343 sql_help.c:709 sql_help.c:713 sql_help.c:717 sql_help.c:1840
+#: sql_help.c:2462 sql_help.c:3407
+msgid "right_type"
+msgstr "æ“作符å³è¾¹æ“作数的类型"
+
+#: sql_help.c:345 sql_help.c:347 sql_help.c:735 sql_help.c:738 sql_help.c:741
+#: sql_help.c:770 sql_help.c:782 sql_help.c:790 sql_help.c:793 sql_help.c:796
+#: sql_help.c:1379 sql_help.c:1842 sql_help.c:1844 sql_help.c:2481
+#: sql_help.c:2502 sql_help.c:2878 sql_help.c:3416 sql_help.c:3425
+msgid "index_method"
+msgstr "访问索引的方法"
+
+#: sql_help.c:349 sql_help.c:1848 sql_help.c:4315
+msgid "procedure_name"
+msgstr "程åºå称 "
+
+#: sql_help.c:353 sql_help.c:1854 sql_help.c:3824 sql_help.c:4321
+msgid "routine_name"
+msgstr "程åºå称"
+
+#: sql_help.c:365 sql_help.c:1351 sql_help.c:1871 sql_help.c:2337
+#: sql_help.c:2542 sql_help.c:2833 sql_help.c:3009 sql_help.c:3587
+#: sql_help.c:3843 sql_help.c:4223
+msgid "type_name"
+msgstr "类型å称"
+
+#: sql_help.c:366 sql_help.c:1872 sql_help.c:2336 sql_help.c:2541
+#: sql_help.c:3010 sql_help.c:3240 sql_help.c:3588 sql_help.c:3831
+#: sql_help.c:4211
+msgid "lang_name"
+msgstr "语言å称"
+
+#: sql_help.c:369
+msgid "and aggregate_signature is:"
+msgstr "aggregate_signature指的是:"
+
+#: sql_help.c:392 sql_help.c:1966 sql_help.c:2232
+msgid "handler_function"
+msgstr "handler_function(处ç†_函数)"
+
+#: sql_help.c:393 sql_help.c:2233
+msgid "validator_function"
+msgstr "validator_function(验è¯_函数)"
+
+#: sql_help.c:441 sql_help.c:520 sql_help.c:662 sql_help.c:846 sql_help.c:986
+#: sql_help.c:1281 sql_help.c:1549
+msgid "action"
+msgstr "æ“作"
+
+#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458
+#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467
+#: sql_help.c:469 sql_help.c:470 sql_help.c:666 sql_help.c:676 sql_help.c:678
+#: sql_help.c:681 sql_help.c:683 sql_help.c:684 sql_help.c:1062 sql_help.c:1283
+#: sql_help.c:1301 sql_help.c:1305 sql_help.c:1306 sql_help.c:1310
+#: sql_help.c:1312 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315
+#: sql_help.c:1317 sql_help.c:1320 sql_help.c:1321 sql_help.c:1323
+#: sql_help.c:1326 sql_help.c:1328 sql_help.c:1329 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1384 sql_help.c:1393 sql_help.c:1398
+#: sql_help.c:1651 sql_help.c:1654 sql_help.c:1658 sql_help.c:1694
+#: sql_help.c:1819 sql_help.c:1932 sql_help.c:1938 sql_help.c:1951
+#: sql_help.c:1952 sql_help.c:1953 sql_help.c:2274 sql_help.c:2287
+#: sql_help.c:2334 sql_help.c:2401 sql_help.c:2407 sql_help.c:2440
+#: sql_help.c:2670 sql_help.c:2705 sql_help.c:2707 sql_help.c:2815
+#: sql_help.c:2824 sql_help.c:2834 sql_help.c:2837 sql_help.c:2847
+#: sql_help.c:2851 sql_help.c:2874 sql_help.c:2876 sql_help.c:2883
+#: sql_help.c:2896 sql_help.c:2901 sql_help.c:2919 sql_help.c:3045
+#: sql_help.c:3185 sql_help.c:3803 sql_help.c:3804 sql_help.c:3897
+#: sql_help.c:3912 sql_help.c:3914 sql_help.c:3916 sql_help.c:4183
+#: sql_help.c:4184 sql_help.c:4301 sql_help.c:4455 sql_help.c:4461
+#: sql_help.c:4463 sql_help.c:4704 sql_help.c:4710 sql_help.c:4712
+#: sql_help.c:4753 sql_help.c:4755 sql_help.c:4757 sql_help.c:4804
+#: sql_help.c:4935 sql_help.c:4941 sql_help.c:4943
+msgid "column_name"
+msgstr "列å称"
+
+#: sql_help.c:444 sql_help.c:667 sql_help.c:1284 sql_help.c:1659
+msgid "new_column_name"
+msgstr "new_column_name(新列å)"
+
+#: sql_help.c:449 sql_help.c:541 sql_help.c:675 sql_help.c:867 sql_help.c:1007
+#: sql_help.c:1300 sql_help.c:1559
+msgid "where action is one of:"
+msgstr "æ“作å¯ä»¥æ˜¯ä¸‹åˆ—选项之一"
+
+#: sql_help.c:451 sql_help.c:456 sql_help.c:1054 sql_help.c:1302
+#: sql_help.c:1307 sql_help.c:1561 sql_help.c:1565 sql_help.c:2187
+#: sql_help.c:2275 sql_help.c:2480 sql_help.c:2663 sql_help.c:2816
+#: sql_help.c:3092 sql_help.c:3999
+msgid "data_type"
+msgstr "æ•°æ®_类型"
+
+#: sql_help.c:452 sql_help.c:457 sql_help.c:1303 sql_help.c:1308
+#: sql_help.c:1562 sql_help.c:1566 sql_help.c:2188 sql_help.c:2278
+#: sql_help.c:2403 sql_help.c:2818 sql_help.c:2826 sql_help.c:2839
+#: sql_help.c:2853 sql_help.c:3093 sql_help.c:3099 sql_help.c:3907
+msgid "collation"
+msgstr "校对规则"
+
+#: sql_help.c:453 sql_help.c:1304 sql_help.c:2279 sql_help.c:2288
+#: sql_help.c:2819 sql_help.c:2835 sql_help.c:2848
+msgid "column_constraint"
+msgstr "列约æŸ"
+
+#: sql_help.c:463 sql_help.c:605 sql_help.c:677 sql_help.c:1322 sql_help.c:4801
+msgid "integer"
+msgstr "æ•´æ•°"
+
+#: sql_help.c:465 sql_help.c:468 sql_help.c:679 sql_help.c:682 sql_help.c:1324
+#: sql_help.c:1327
+msgid "attribute_option"
+msgstr "属性选项"
+
+#: sql_help.c:473 sql_help.c:1331 sql_help.c:2280 sql_help.c:2289
+#: sql_help.c:2820 sql_help.c:2836 sql_help.c:2849
+msgid "table_constraint"
+msgstr "表约æŸ"
+
+#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1336
+#: sql_help.c:1337 sql_help.c:1338 sql_help.c:1339 sql_help.c:1873
+msgid "trigger_name"
+msgstr "触å‘器_å称"
+
+#: sql_help.c:480 sql_help.c:481 sql_help.c:1349 sql_help.c:1350
+#: sql_help.c:2281 sql_help.c:2286 sql_help.c:2823 sql_help.c:2846
+msgid "parent_table"
+msgstr "父表"
+
+#: sql_help.c:540 sql_help.c:597 sql_help.c:664 sql_help.c:866 sql_help.c:1006
+#: sql_help.c:1518 sql_help.c:2218
+msgid "extension_name"
+msgstr "extension_name(扩展å)"
+
+#: sql_help.c:542 sql_help.c:1008 sql_help.c:2338
+msgid "execution_cost"
+msgstr "执行函数的开销"
+
+#: sql_help.c:543 sql_help.c:1009 sql_help.c:2339
+msgid "result_rows"
+msgstr "返回记录的数é‡"
+
+#: sql_help.c:544 sql_help.c:2340
+msgid "support_function"
+msgstr "支æŒ_函数"
+
+#: sql_help.c:566 sql_help.c:568 sql_help.c:931 sql_help.c:939 sql_help.c:943
+#: sql_help.c:946 sql_help.c:949 sql_help.c:1601 sql_help.c:1609
+#: sql_help.c:1613 sql_help.c:1616 sql_help.c:1619 sql_help.c:2641
+#: sql_help.c:2643 sql_help.c:2646 sql_help.c:2647 sql_help.c:3801
+#: sql_help.c:3802 sql_help.c:3806 sql_help.c:3807 sql_help.c:3810
+#: sql_help.c:3811 sql_help.c:3813 sql_help.c:3814 sql_help.c:3816
+#: sql_help.c:3817 sql_help.c:3819 sql_help.c:3820 sql_help.c:3822
+#: sql_help.c:3823 sql_help.c:3829 sql_help.c:3830 sql_help.c:3832
+#: sql_help.c:3833 sql_help.c:3835 sql_help.c:3836 sql_help.c:3838
+#: sql_help.c:3839 sql_help.c:3841 sql_help.c:3842 sql_help.c:3844
+#: sql_help.c:3845 sql_help.c:3847 sql_help.c:3848 sql_help.c:4181
+#: sql_help.c:4182 sql_help.c:4186 sql_help.c:4187 sql_help.c:4190
+#: sql_help.c:4191 sql_help.c:4193 sql_help.c:4194 sql_help.c:4196
+#: sql_help.c:4197 sql_help.c:4199 sql_help.c:4200 sql_help.c:4202
+#: sql_help.c:4203 sql_help.c:4209 sql_help.c:4210 sql_help.c:4212
+#: sql_help.c:4213 sql_help.c:4215 sql_help.c:4216 sql_help.c:4218
+#: sql_help.c:4219 sql_help.c:4221 sql_help.c:4222 sql_help.c:4224
+#: sql_help.c:4225 sql_help.c:4227 sql_help.c:4228
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:567 sql_help.c:569 sql_help.c:1632 sql_help.c:2161
+#: sql_help.c:2649 sql_help.c:3170 sql_help.c:3621 sql_help.c:4547
+msgid "user_name"
+msgstr "用户å"
+
+#: sql_help.c:570 sql_help.c:951 sql_help.c:1621 sql_help.c:2648
+#: sql_help.c:3849 sql_help.c:4229
+msgid "where role_specification can be:"
+msgstr "这里role_specificationå¯ä»¥æ˜¯ï¼š"
+
+#: sql_help.c:572
+msgid "group_name"
+msgstr "组å称"
+
+#: sql_help.c:593 sql_help.c:1396 sql_help.c:2167 sql_help.c:2410
+#: sql_help.c:2444 sql_help.c:2831 sql_help.c:2844 sql_help.c:2858
+#: sql_help.c:2899 sql_help.c:2923 sql_help.c:2935 sql_help.c:3840
+#: sql_help.c:4220
+msgid "tablespace_name"
+msgstr "表空间的å称"
+
+#: sql_help.c:595 sql_help.c:686 sql_help.c:1344 sql_help.c:1353
+#: sql_help.c:1391 sql_help.c:1748 sql_help.c:1751
+msgid "index_name"
+msgstr "索引å称"
+
+#: sql_help.c:599 sql_help.c:602 sql_help.c:687 sql_help.c:689 sql_help.c:1346
+#: sql_help.c:1348 sql_help.c:1394 sql_help.c:2408 sql_help.c:2442
+#: sql_help.c:2829 sql_help.c:2842 sql_help.c:2856 sql_help.c:2897
+#: sql_help.c:2921
+msgid "storage_parameter"
+msgstr "存储å‚æ•°"
+
+#: sql_help.c:604
+msgid "column_number"
+msgstr "列数"
+
+#: sql_help.c:628 sql_help.c:1836 sql_help.c:4312
+msgid "large_object_oid"
+msgstr "大对象的OID"
+
+#: sql_help.c:685 sql_help.c:1330 sql_help.c:2817
+msgid "compression_method"
+msgstr "压缩方法"
+
+#: sql_help.c:718 sql_help.c:2465
+msgid "res_proc"
+msgstr "é™åˆ¶é€‰æ‹©æ€§ä¼°ç®—函数"
+
+#: sql_help.c:719 sql_help.c:2466
+msgid "join_proc"
+msgstr "连接选择性估算函数"
+
+#: sql_help.c:771 sql_help.c:783 sql_help.c:2483
+msgid "strategy_number"
+msgstr "访问索引所用方法的编å·"
+
+#: sql_help.c:773 sql_help.c:774 sql_help.c:777 sql_help.c:778 sql_help.c:784
+#: sql_help.c:785 sql_help.c:787 sql_help.c:788 sql_help.c:2485 sql_help.c:2486
+#: sql_help.c:2489 sql_help.c:2490
+msgid "op_type"
+msgstr "æ“作数类型"
+
+#: sql_help.c:775 sql_help.c:2487
+msgid "sort_family_name"
+msgstr "sort_family_name(排åºå®¶æ—å)"
+
+#: sql_help.c:776 sql_help.c:786 sql_help.c:2488
+msgid "support_number"
+msgstr "访问索引所使用函数的编å·"
+
+#: sql_help.c:780 sql_help.c:2102 sql_help.c:2492 sql_help.c:3012
+#: sql_help.c:3014
+msgid "argument_type"
+msgstr "å‚数类型"
+
+#: sql_help.c:811 sql_help.c:814 sql_help.c:885 sql_help.c:887 sql_help.c:889
+#: sql_help.c:1022 sql_help.c:1061 sql_help.c:1514 sql_help.c:1517
+#: sql_help.c:1693 sql_help.c:1747 sql_help.c:1750 sql_help.c:1821
+#: sql_help.c:1846 sql_help.c:1859 sql_help.c:1874 sql_help.c:1931
+#: sql_help.c:1937 sql_help.c:2273 sql_help.c:2285 sql_help.c:2399
+#: sql_help.c:2439 sql_help.c:2516 sql_help.c:2561 sql_help.c:2617
+#: sql_help.c:2669 sql_help.c:2702 sql_help.c:2709 sql_help.c:2814
+#: sql_help.c:2832 sql_help.c:2845 sql_help.c:2918 sql_help.c:3038
+#: sql_help.c:3219 sql_help.c:3442 sql_help.c:3491 sql_help.c:3597
+#: sql_help.c:3799 sql_help.c:3805 sql_help.c:3863 sql_help.c:3895
+#: sql_help.c:4179 sql_help.c:4185 sql_help.c:4300 sql_help.c:4409
+#: sql_help.c:4411 sql_help.c:4468 sql_help.c:4507 sql_help.c:4658
+#: sql_help.c:4660 sql_help.c:4717 sql_help.c:4751 sql_help.c:4803
+#: sql_help.c:4889 sql_help.c:4891 sql_help.c:4948
+msgid "table_name"
+msgstr "表å"
+
+#: sql_help.c:816 sql_help.c:2518
+msgid "using_expression"
+msgstr "使用表达å¼"
+
+#: sql_help.c:817 sql_help.c:2519
+msgid "check_expression"
+msgstr "检查表达å¼"
+
+#: sql_help.c:891 sql_help.c:2562
+msgid "publication_parameter"
+msgstr "å‘布å‚æ•°"
+
+#: sql_help.c:935 sql_help.c:1605 sql_help.c:2378 sql_help.c:2594
+#: sql_help.c:3153
+msgid "password"
+msgstr "å£ä»¤"
+
+#: sql_help.c:936 sql_help.c:1606 sql_help.c:2379 sql_help.c:2595
+#: sql_help.c:3154
+msgid "timestamp"
+msgstr "时间戳"
+
+#: sql_help.c:940 sql_help.c:944 sql_help.c:947 sql_help.c:950 sql_help.c:1610
+#: sql_help.c:1614 sql_help.c:1617 sql_help.c:1620 sql_help.c:3812
+#: sql_help.c:4192
+msgid "database_name"
+msgstr "æ•°æ®åº“å称"
+
+#: sql_help.c:1055 sql_help.c:2664
+msgid "increment"
+msgstr "增é‡"
+
+#: sql_help.c:1056 sql_help.c:2665
+msgid "minvalue"
+msgstr "最å°å€¼"
+
+#: sql_help.c:1057 sql_help.c:2666
+msgid "maxvalue"
+msgstr "最大值"
+
+#: sql_help.c:1058 sql_help.c:2667 sql_help.c:4407 sql_help.c:4505
+#: sql_help.c:4656 sql_help.c:4820 sql_help.c:4887
+msgid "start"
+msgstr "起始值"
+
+#: sql_help.c:1059 sql_help.c:1319
+msgid "restart"
+msgstr "é‡æ–°å¯åŠ¨åŽçš„åºåˆ—值"
+
+#: sql_help.c:1060 sql_help.c:2668
+msgid "cache"
+msgstr "缓存"
+
+#: sql_help.c:1104
+msgid "new_target"
+msgstr "新目标"
+
+#: sql_help.c:1122 sql_help.c:2721
+msgid "conninfo"
+msgstr "连接信æ¯"
+
+#: sql_help.c:1124 sql_help.c:1128 sql_help.c:1132 sql_help.c:2722
+msgid "publication_name"
+msgstr "å‘布å"
+
+#: sql_help.c:1125 sql_help.c:1129 sql_help.c:1133
+msgid "publication_option"
+msgstr "å‘布选项"
+
+#: sql_help.c:1136
+msgid "refresh_option"
+msgstr "refresh选项"
+
+#: sql_help.c:1141 sql_help.c:2723
+msgid "subscription_parameter"
+msgstr "订阅å‚æ•°"
+
+#: sql_help.c:1296 sql_help.c:1299
+msgid "partition_name"
+msgstr "分区å"
+
+#: sql_help.c:1297 sql_help.c:2290 sql_help.c:2850
+msgid "partition_bound_spec"
+msgstr "分区绑定规范"
+
+#: sql_help.c:1316 sql_help.c:1365 sql_help.c:2864
+msgid "sequence_options"
+msgstr "åºåˆ—选项"
+
+#: sql_help.c:1318
+msgid "sequence_option"
+msgstr "åºåˆ—选项"
+
+#: sql_help.c:1332
+msgid "table_constraint_using_index"
+msgstr "table_constraint_using_index(表约æŸä½¿ç”¨ç´¢å¼•)"
+
+#: sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 sql_help.c:1343
+msgid "rewrite_rule_name"
+msgstr "é‡å†™è§„则å称"
+
+#: sql_help.c:1354 sql_help.c:2889
+msgid "and partition_bound_spec is:"
+msgstr "并且分区绑定的规范是:"
+
+#: sql_help.c:1355 sql_help.c:1356 sql_help.c:1357 sql_help.c:2890
+#: sql_help.c:2891 sql_help.c:2892
+msgid "partition_bound_expr"
+msgstr "分区_绑定_表达å¼"
+
+#: sql_help.c:1358 sql_help.c:1359 sql_help.c:2893 sql_help.c:2894
+msgid "numeric_literal"
+msgstr "数字_文字"
+
+#: sql_help.c:1360
+msgid "and column_constraint is:"
+msgstr "并且列的约æŸæ˜¯:"
+
+#: sql_help.c:1363 sql_help.c:2297 sql_help.c:2332 sql_help.c:2540
+#: sql_help.c:2862
+msgid "default_expr"
+msgstr "默认_表达å¼"
+
+#: sql_help.c:1364 sql_help.c:2298 sql_help.c:2863
+msgid "generation_expr"
+msgstr "生æˆè¡¨_è¾¾å¼"
+
+#: sql_help.c:1366 sql_help.c:1367 sql_help.c:1376 sql_help.c:1378
+#: sql_help.c:1382 sql_help.c:2865 sql_help.c:2866 sql_help.c:2875
+#: sql_help.c:2877 sql_help.c:2881
+msgid "index_parameters"
+msgstr "索引å‚æ•°"
+
+#: sql_help.c:1368 sql_help.c:1385 sql_help.c:2867 sql_help.c:2884
+msgid "reftable"
+msgstr "所引用的表"
+
+#: sql_help.c:1369 sql_help.c:1386 sql_help.c:2868 sql_help.c:2885
+msgid "refcolumn"
+msgstr "所引用的列"
+
+#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1387 sql_help.c:1388
+#: sql_help.c:2869 sql_help.c:2870 sql_help.c:2886 sql_help.c:2887
+msgid "referential_action"
+msgstr "å‚考_行动"
+
+#: sql_help.c:1372 sql_help.c:2299 sql_help.c:2871
+msgid "and table_constraint is:"
+msgstr "表约æŸæ˜¯:"
+
+#: sql_help.c:1380 sql_help.c:2879
+msgid "exclude_element"
+msgstr "排除项"
+
+#: sql_help.c:1381 sql_help.c:2880 sql_help.c:4405 sql_help.c:4503
+#: sql_help.c:4654 sql_help.c:4818 sql_help.c:4885
+msgid "operator"
+msgstr "è¿ç®—å­"
+
+#: sql_help.c:1383 sql_help.c:2411 sql_help.c:2882
+msgid "predicate"
+msgstr "è¿°è¯"
+
+#: sql_help.c:1389
+msgid "and table_constraint_using_index is:"
+msgstr "table_constraint_using_index 是:"
+
+#: sql_help.c:1392 sql_help.c:2895
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "在UNIQUE, PRIMARY KEYå’ŒEXCLUDE中的索引å‚数是:"
+
+#: sql_help.c:1397 sql_help.c:2900
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "在EXCLUDE约æŸä¸­çš„排除项是:"
+
+#: sql_help.c:1400 sql_help.c:2404 sql_help.c:2827 sql_help.c:2840
+#: sql_help.c:2854 sql_help.c:2903 sql_help.c:3908
+msgid "opclass"
+msgstr "æ“作符类型的å称"
+
+#: sql_help.c:1416 sql_help.c:1419 sql_help.c:2938
+msgid "tablespace_option"
+msgstr "表空间_选项"
+
+#: sql_help.c:1440 sql_help.c:1443 sql_help.c:1449 sql_help.c:1453
+msgid "token_type"
+msgstr "符å·ç±»åž‹"
+
+#: sql_help.c:1441 sql_help.c:1444
+msgid "dictionary_name"
+msgstr "å­—å…¸å称"
+
+#: sql_help.c:1446 sql_help.c:1450
+msgid "old_dictionary"
+msgstr "旧的字典"
+
+#: sql_help.c:1447 sql_help.c:1451
+msgid "new_dictionary"
+msgstr "æ–°çš„å­—å…¸"
+
+#: sql_help.c:1546 sql_help.c:1560 sql_help.c:1563 sql_help.c:1564
+#: sql_help.c:3091
+msgid "attribute_name"
+msgstr "属性_å称"
+
+#: sql_help.c:1547
+msgid "new_attribute_name"
+msgstr "new_attribute_name(新属性å)"
+
+#: sql_help.c:1551 sql_help.c:1555
+msgid "new_enum_value"
+msgstr "new_enum_value(新枚举å)"
+
+#: sql_help.c:1552
+msgid "neighbor_enum_value"
+msgstr "相邻的枚举值"
+
+#: sql_help.c:1554
+msgid "existing_enum_value"
+msgstr "现有枚举值"
+
+#: sql_help.c:1557
+msgid "property"
+msgstr "属性"
+
+#: sql_help.c:1633 sql_help.c:2282 sql_help.c:2291 sql_help.c:2680
+#: sql_help.c:3171 sql_help.c:3622 sql_help.c:3821 sql_help.c:3864
+#: sql_help.c:4201
+msgid "server_name"
+msgstr "æœåŠ¡å™¨å称"
+
+#: sql_help.c:1665 sql_help.c:1668 sql_help.c:3186
+msgid "view_option_name"
+msgstr "view_option_name(视图选项å)"
+
+#: sql_help.c:1666 sql_help.c:3187
+msgid "view_option_value"
+msgstr "view_option_value(视图选项值)"
+
+#: sql_help.c:1687 sql_help.c:1688 sql_help.c:4790 sql_help.c:4791
+msgid "table_and_columns"
+msgstr "表和列"
+
+#: sql_help.c:1689 sql_help.c:1752 sql_help.c:1943 sql_help.c:3670
+#: sql_help.c:4043 sql_help.c:4792
+msgid "where option can be one of:"
+msgstr "选项å¯ä»¥æ˜¯ä¸‹åˆ—内容之一:"
+
+#: sql_help.c:1690 sql_help.c:1691 sql_help.c:1753 sql_help.c:1945
+#: sql_help.c:1948 sql_help.c:2127 sql_help.c:3671 sql_help.c:3672
+#: sql_help.c:3673 sql_help.c:3674 sql_help.c:3675 sql_help.c:3676
+#: sql_help.c:3677 sql_help.c:3678 sql_help.c:4044 sql_help.c:4046
+#: sql_help.c:4793 sql_help.c:4794 sql_help.c:4795 sql_help.c:4796
+#: sql_help.c:4797 sql_help.c:4798 sql_help.c:4799 sql_help.c:4800
+msgid "boolean"
+msgstr "布尔"
+
+#: sql_help.c:1692 sql_help.c:4802
+msgid "and table_and_columns is:"
+msgstr "并且表和列:"
+
+#: sql_help.c:1708 sql_help.c:4563 sql_help.c:4565 sql_help.c:4589
+msgid "transaction_mode"
+msgstr "事务模å¼"
+
+#: sql_help.c:1709 sql_help.c:4566 sql_help.c:4590
+msgid "where transaction_mode is one of:"
+msgstr "事务模å¼å¯ä»¥æ˜¯ä¸‹åˆ—选项之一:"
+
+#: sql_help.c:1718 sql_help.c:4415 sql_help.c:4424 sql_help.c:4428
+#: sql_help.c:4432 sql_help.c:4435 sql_help.c:4664 sql_help.c:4673
+#: sql_help.c:4677 sql_help.c:4681 sql_help.c:4684 sql_help.c:4895
+#: sql_help.c:4904 sql_help.c:4908 sql_help.c:4912 sql_help.c:4915
+msgid "argument"
+msgstr "å‚æ•°"
+
+#: sql_help.c:1818
+msgid "relation_name"
+msgstr "relation_name(关系å)"
+
+#: sql_help.c:1823 sql_help.c:3815 sql_help.c:4195
+msgid "domain_name"
+msgstr "域_å称"
+
+#: sql_help.c:1845
+msgid "policy_name"
+msgstr "policy_name"
+
+#: sql_help.c:1858
+msgid "rule_name"
+msgstr "规则_å称"
+
+#: sql_help.c:1877
+msgid "text"
+msgstr "文本"
+
+#: sql_help.c:1902 sql_help.c:4008 sql_help.c:4245
+msgid "transaction_id"
+msgstr "事务_ID"
+
+#: sql_help.c:1933 sql_help.c:1940 sql_help.c:3934
+msgid "filename"
+msgstr "文件å"
+
+#: sql_help.c:1934 sql_help.c:1941 sql_help.c:2619 sql_help.c:2620
+#: sql_help.c:2621
+msgid "command"
+msgstr "命令"
+
+#: sql_help.c:1936 sql_help.c:2618 sql_help.c:3041 sql_help.c:3222
+#: sql_help.c:3918 sql_help.c:4398 sql_help.c:4400 sql_help.c:4496
+#: sql_help.c:4498 sql_help.c:4647 sql_help.c:4649 sql_help.c:4760
+#: sql_help.c:4878 sql_help.c:4880
+msgid "condition"
+msgstr "æ¡ä»¶"
+
+#: sql_help.c:1939 sql_help.c:2445 sql_help.c:2924 sql_help.c:3188
+#: sql_help.c:3206 sql_help.c:3899
+msgid "query"
+msgstr "查询"
+
+#: sql_help.c:1944
+msgid "format_name"
+msgstr "æ ¼å¼_å称"
+
+#: sql_help.c:1946
+msgid "delimiter_character"
+msgstr "分隔字符"
+
+#: sql_help.c:1947
+msgid "null_string"
+msgstr "空字符串"
+
+#: sql_help.c:1949
+msgid "quote_character"
+msgstr "引用字符"
+
+#: sql_help.c:1950
+msgid "escape_character"
+msgstr "转义字符"
+
+#: sql_help.c:1954
+msgid "encoding_name"
+msgstr "encoding_name(ç¼–ç å)"
+
+#: sql_help.c:1965
+msgid "access_method_type"
+msgstr "access_method_type"
+
+#: sql_help.c:2036 sql_help.c:2055 sql_help.c:2058
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+#: sql_help.c:2037 sql_help.c:2059 sql_help.c:2067
+msgid "sfunc"
+msgstr "状æ€è½¬æ¢å‡½æ•°å称"
+
+#: sql_help.c:2038 sql_help.c:2060 sql_help.c:2068
+msgid "state_data_type"
+msgstr "状æ€å€¼çš„æ•°æ®ç±»åž‹"
+
+#: sql_help.c:2039 sql_help.c:2061 sql_help.c:2069
+msgid "state_data_size"
+msgstr "state_data_size"
+
+#: sql_help.c:2040 sql_help.c:2062 sql_help.c:2070
+msgid "ffunc"
+msgstr "计算最终结果集的函数å称"
+
+#: sql_help.c:2041 sql_help.c:2071
+msgid "combinefunc"
+msgstr "combinefunc"
+
+#: sql_help.c:2042 sql_help.c:2072
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2043 sql_help.c:2073
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2044 sql_help.c:2063 sql_help.c:2074
+msgid "initial_condition"
+msgstr "åˆå§‹æ¡ä»¶"
+
+#: sql_help.c:2045 sql_help.c:2075
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2046 sql_help.c:2076
+msgid "minvfunc"
+msgstr "minvfunc"
+
+#: sql_help.c:2047 sql_help.c:2077
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+#: sql_help.c:2048 sql_help.c:2078
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+#: sql_help.c:2049 sql_help.c:2079
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2050 sql_help.c:2080
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+#: sql_help.c:2051 sql_help.c:2081
+msgid "sort_operator"
+msgstr "排åº_æ“作符"
+
+#: sql_help.c:2064
+msgid "or the old syntax"
+msgstr "或者是旧的语法"
+
+#: sql_help.c:2066
+msgid "base_type"
+msgstr "基础_类型"
+
+#: sql_help.c:2123 sql_help.c:2164
+msgid "locale"
+msgstr "本地化语言"
+
+#: sql_help.c:2124 sql_help.c:2165
+msgid "lc_collate"
+msgstr "排åºè§„则"
+
+#: sql_help.c:2125 sql_help.c:2166
+msgid "lc_ctype"
+msgstr "字符分类"
+
+#: sql_help.c:2126 sql_help.c:4298
+msgid "provider"
+msgstr "provider(æ供者)"
+
+#: sql_help.c:2128 sql_help.c:2220
+msgid "version"
+msgstr "version(版本)"
+
+#: sql_help.c:2130
+msgid "existing_collation"
+msgstr "existing_collation(当å‰çš„本地化语言)"
+
+#: sql_help.c:2140
+msgid "source_encoding"
+msgstr "æº_ç¼–ç "
+
+#: sql_help.c:2141
+msgid "dest_encoding"
+msgstr "目的_ç¼–ç "
+
+#: sql_help.c:2162 sql_help.c:2964
+msgid "template"
+msgstr "模版"
+
+#: sql_help.c:2163
+msgid "encoding"
+msgstr "字符集编ç "
+
+#: sql_help.c:2190
+msgid "constraint"
+msgstr "约æŸ"
+
+#: sql_help.c:2191
+msgid "where constraint is:"
+msgstr "约æŸæ˜¯:"
+
+#: sql_help.c:2205 sql_help.c:2616 sql_help.c:3037
+msgid "event"
+msgstr "事件"
+
+#: sql_help.c:2206
+msgid "filter_variable"
+msgstr "过滤器å˜é‡"
+
+#: sql_help.c:2294 sql_help.c:2859
+msgid "where column_constraint is:"
+msgstr "列的约æŸæ˜¯:"
+
+#: sql_help.c:2333
+msgid "rettype"
+msgstr "返回类型"
+
+#: sql_help.c:2335
+msgid "column_type"
+msgstr "列的类型"
+
+#: sql_help.c:2344 sql_help.c:2546
+msgid "definition"
+msgstr "定义"
+
+#: sql_help.c:2345 sql_help.c:2547
+msgid "obj_file"
+msgstr "目标文件"
+
+#: sql_help.c:2346 sql_help.c:2548
+msgid "link_symbol"
+msgstr "链接_符å·"
+
+#: sql_help.c:2347 sql_help.c:2549
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2385 sql_help.c:2601 sql_help.c:3160
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2400 sql_help.c:2441 sql_help.c:2828 sql_help.c:2841
+#: sql_help.c:2855 sql_help.c:2920
+msgid "method"
+msgstr "方法"
+
+#: sql_help.c:2405
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2422
+msgid "call_handler"
+msgstr "调用函数"
+
+#: sql_help.c:2423
+msgid "inline_handler"
+msgstr "匿å代ç å—"
+
+#: sql_help.c:2424
+msgid "valfunction"
+msgstr "验è¯å‡½æ•°"
+
+#: sql_help.c:2463
+msgid "com_op"
+msgstr "交æ¢æ“作符"
+
+#: sql_help.c:2464
+msgid "neg_op"
+msgstr "å–è´Ÿæ“作符"
+
+#: sql_help.c:2482
+msgid "family_name"
+msgstr "æ“作符群的å称"
+
+#: sql_help.c:2493
+msgid "storage_type"
+msgstr "存储类型"
+
+#: sql_help.c:2622 sql_help.c:3044
+msgid "where event can be one of:"
+msgstr "事件å¯ä»¥ä¸‹è¿°ä¹‹ä¸€:"
+
+#: sql_help.c:2642 sql_help.c:2644
+msgid "schema_element"
+msgstr "模å¼ä¸­å¯¹è±¡"
+
+#: sql_help.c:2681
+msgid "server_type"
+msgstr "æœåŠ¡å™¨ç±»åž‹"
+
+#: sql_help.c:2682
+msgid "server_version"
+msgstr "æœåŠ¡å™¨ç‰ˆæœ¬"
+
+#: sql_help.c:2683 sql_help.c:3818 sql_help.c:4198
+msgid "fdw_name"
+msgstr "外部数æ®å°è£…器的å称"
+
+#: sql_help.c:2700 sql_help.c:2703
+msgid "statistics_name"
+msgstr "统计信æ¯_å称"
+
+#: sql_help.c:2704
+msgid "statistics_kind"
+msgstr "统计信æ¯_æ–¹å¼"
+
+#: sql_help.c:2720
+msgid "subscription_name"
+msgstr "订阅_å称"
+
+#: sql_help.c:2821
+msgid "source_table"
+msgstr "æºè¡¨"
+
+#: sql_help.c:2822
+msgid "like_option"
+msgstr "like选项"
+
+#: sql_help.c:2888
+msgid "and like_option is:"
+msgstr "like_选项是"
+
+#: sql_help.c:2937
+msgid "directory"
+msgstr "目录"
+
+#: sql_help.c:2951
+msgid "parser_name"
+msgstr "解æžå™¨å称 "
+
+#: sql_help.c:2952
+msgid "source_config"
+msgstr "已存在的文本æœç´¢é…ç½®å称"
+
+#: sql_help.c:2981
+msgid "start_function"
+msgstr "å¯åŠ¨_函数"
+
+#: sql_help.c:2982
+msgid "gettoken_function"
+msgstr "获å–下一个符å·å‡½æ•°çš„å称"
+
+#: sql_help.c:2983
+msgid "end_function"
+msgstr "结æŸ_函数"
+
+#: sql_help.c:2984
+msgid "lextypes_function"
+msgstr "语义类型_函数"
+
+#: sql_help.c:2985
+msgid "headline_function"
+msgstr "标题_函数"
+
+#: sql_help.c:2997
+msgid "init_function"
+msgstr "åˆå§‹åŒ–_函数"
+
+#: sql_help.c:2998
+msgid "lexize_function"
+msgstr "LEXIZE函数"
+
+#: sql_help.c:3011
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+#: sql_help.c:3013
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:3039
+msgid "referenced_table_name"
+msgstr "被引用表的å称"
+
+#: sql_help.c:3040
+msgid "transition_relation_name"
+msgstr "transition_relation_name(转æ¢å…³ç³»å)"
+
+#: sql_help.c:3043
+msgid "arguments"
+msgstr "å‚æ•°"
+
+#: sql_help.c:3095 sql_help.c:4331
+msgid "label"
+msgstr "标签"
+
+#: sql_help.c:3097
+msgid "subtype"
+msgstr "å­ç±»åž‹"
+
+#: sql_help.c:3098
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class(å­ç±»åž‹_æ“作符_ç±»)"
+
+#: sql_help.c:3100
+msgid "canonical_function"
+msgstr "标准_函数"
+
+#: sql_help.c:3101
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function(å­ç±»åž‹_区分_函数)"
+
+#: sql_help.c:3102
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+#: sql_help.c:3104
+msgid "input_function"
+msgstr "输入_函数"
+
+#: sql_help.c:3105
+msgid "output_function"
+msgstr "输出_函数"
+
+#: sql_help.c:3106
+msgid "receive_function"
+msgstr "接收_函数"
+
+#: sql_help.c:3107
+msgid "send_function"
+msgstr "å‘é€_函数"
+
+#: sql_help.c:3108
+msgid "type_modifier_input_function"
+msgstr "类型修改器数组输入函数å称"
+
+#: sql_help.c:3109
+msgid "type_modifier_output_function"
+msgstr "类型修改器输出函数å称"
+
+#: sql_help.c:3110
+msgid "analyze_function"
+msgstr "分æž_函数"
+
+#: sql_help.c:3111
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3112
+msgid "internallength"
+msgstr "内部长度"
+
+#: sql_help.c:3113
+msgid "alignment"
+msgstr "顺åºæŽ’列(alignment)"
+
+#: sql_help.c:3114
+msgid "storage"
+msgstr "存储"
+
+#: sql_help.c:3115
+msgid "like_type"
+msgstr "LIKE类型(like_type)"
+
+#: sql_help.c:3116
+msgid "category"
+msgstr "类型"
+
+#: sql_help.c:3117
+msgid "preferred"
+msgstr "优先"
+
+#: sql_help.c:3118
+msgid "default"
+msgstr "默认"
+
+#: sql_help.c:3119
+msgid "element"
+msgstr "æˆå‘˜é¡¹"
+
+#: sql_help.c:3120
+msgid "delimiter"
+msgstr "分隔符"
+
+#: sql_help.c:3121
+msgid "collatable"
+msgstr "è¦æ ¡å¯¹çš„"
+
+#: sql_help.c:3218 sql_help.c:3894 sql_help.c:4393 sql_help.c:4490
+#: sql_help.c:4642 sql_help.c:4750 sql_help.c:4873
+msgid "with_query"
+msgstr "with查询语å¥(with_query)"
+
+#: sql_help.c:3220 sql_help.c:3896 sql_help.c:4412 sql_help.c:4418
+#: sql_help.c:4421 sql_help.c:4425 sql_help.c:4429 sql_help.c:4437
+#: sql_help.c:4661 sql_help.c:4667 sql_help.c:4670 sql_help.c:4674
+#: sql_help.c:4678 sql_help.c:4686 sql_help.c:4752 sql_help.c:4892
+#: sql_help.c:4898 sql_help.c:4901 sql_help.c:4905 sql_help.c:4909
+#: sql_help.c:4917
+msgid "alias"
+msgstr "别å"
+
+#: sql_help.c:3221 sql_help.c:4397 sql_help.c:4439 sql_help.c:4441
+#: sql_help.c:4495 sql_help.c:4646 sql_help.c:4688 sql_help.c:4690
+#: sql_help.c:4759 sql_help.c:4877 sql_help.c:4919 sql_help.c:4921
+msgid "from_item"
+msgstr "from列表中项"
+
+#: sql_help.c:3223 sql_help.c:3704 sql_help.c:3975 sql_help.c:4761
+msgid "cursor_name"
+msgstr "游标å称"
+
+#: sql_help.c:3224 sql_help.c:3902 sql_help.c:4762
+msgid "output_expression"
+msgstr "输出表达å¼"
+
+#: sql_help.c:3225 sql_help.c:3903 sql_help.c:4396 sql_help.c:4493
+#: sql_help.c:4645 sql_help.c:4763 sql_help.c:4876
+msgid "output_name"
+msgstr "输出å称"
+
+#: sql_help.c:3241
+msgid "code"
+msgstr "ç¼–ç "
+
+#: sql_help.c:3646
+msgid "parameter"
+msgstr "å‚æ•°"
+
+#: sql_help.c:3668 sql_help.c:3669 sql_help.c:4000
+msgid "statement"
+msgstr "语å¥"
+
+#: sql_help.c:3703 sql_help.c:3974
+msgid "direction"
+msgstr "æ–¹å‘"
+
+#: sql_help.c:3705 sql_help.c:3976
+msgid "where direction can be empty or one of:"
+msgstr "æ–¹å‘å¯ä»¥ä¸ºç©ºæˆ–者是下列选项之一:"
+
+#: sql_help.c:3706 sql_help.c:3707 sql_help.c:3708 sql_help.c:3709
+#: sql_help.c:3710 sql_help.c:3977 sql_help.c:3978 sql_help.c:3979
+#: sql_help.c:3980 sql_help.c:3981 sql_help.c:4406 sql_help.c:4408
+#: sql_help.c:4504 sql_help.c:4506 sql_help.c:4655 sql_help.c:4657
+#: sql_help.c:4819 sql_help.c:4821 sql_help.c:4886 sql_help.c:4888
+msgid "count"
+msgstr "计数"
+
+#: sql_help.c:3808 sql_help.c:4188
+msgid "sequence_name"
+msgstr "åºåˆ—å称"
+
+#: sql_help.c:3826 sql_help.c:4206
+msgid "arg_name"
+msgstr "å‚æ•°å称"
+
+#: sql_help.c:3827 sql_help.c:4207
+msgid "arg_type"
+msgstr "å‚数类型"
+
+#: sql_help.c:3834 sql_help.c:4214
+msgid "loid"
+msgstr "loid"
+
+#: sql_help.c:3862
+msgid "remote_schema"
+msgstr "remote_schema"
+
+#: sql_help.c:3865
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3900
+msgid "conflict_target"
+msgstr "冲çªç›®æ ‡"
+
+#: sql_help.c:3901
+msgid "conflict_action"
+msgstr "冲çªè¡ŒåŠ¨"
+
+#: sql_help.c:3904
+msgid "where conflict_target can be one of:"
+msgstr "这里conflict_targetå¯ä»¥æ˜¯ä¸‹åˆ—之一:"
+
+#: sql_help.c:3905
+msgid "index_column_name"
+msgstr "索引列å称"
+
+#: sql_help.c:3906
+msgid "index_expression"
+msgstr "索引表达å¼"
+
+#: sql_help.c:3909
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:3911
+msgid "and conflict_action is one of:"
+msgstr "并且conflict_action是下列之一:"
+
+#: sql_help.c:3917 sql_help.c:4758
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:3926 sql_help.c:3989 sql_help.c:4734
+msgid "channel"
+msgstr "通é“"
+
+#: sql_help.c:3948
+msgid "lockmode"
+msgstr "é”模å¼"
+
+#: sql_help.c:3949
+msgid "where lockmode is one of:"
+msgstr "é”模å¼å¯ä»¥æ˜¯ä¸‹åˆ—选项之一:"
+
+#: sql_help.c:3990
+msgid "payload"
+msgstr "消æ¯ä¸­è´Ÿè½½æµé‡(payload)"
+
+#: sql_help.c:4017
+msgid "old_role"
+msgstr "旧的角色"
+
+#: sql_help.c:4018
+msgid "new_role"
+msgstr "新的角色"
+
+#: sql_help.c:4054 sql_help.c:4253 sql_help.c:4261
+msgid "savepoint_name"
+msgstr "ä¿å­˜ç‚¹å称"
+
+#: sql_help.c:4399 sql_help.c:4452 sql_help.c:4648 sql_help.c:4701
+#: sql_help.c:4879 sql_help.c:4932
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4401 sql_help.c:4499 sql_help.c:4650 sql_help.c:4881
+msgid "window_name"
+msgstr "窗å£å称"
+
+#: sql_help.c:4402 sql_help.c:4500 sql_help.c:4651 sql_help.c:4882
+msgid "window_definition"
+msgstr "窗å£å®šä¹‰"
+
+#: sql_help.c:4403 sql_help.c:4417 sql_help.c:4456 sql_help.c:4501
+#: sql_help.c:4652 sql_help.c:4666 sql_help.c:4705 sql_help.c:4883
+#: sql_help.c:4897 sql_help.c:4936
+msgid "select"
+msgstr "查询"
+
+#: sql_help.c:4410 sql_help.c:4659 sql_help.c:4890
+msgid "where from_item can be one of:"
+msgstr "from 列表中的项å¯ä»¥æ˜¯ä¸‹åˆ—内容之一"
+
+#: sql_help.c:4413 sql_help.c:4419 sql_help.c:4422 sql_help.c:4426
+#: sql_help.c:4438 sql_help.c:4662 sql_help.c:4668 sql_help.c:4671
+#: sql_help.c:4675 sql_help.c:4687 sql_help.c:4893 sql_help.c:4899
+#: sql_help.c:4902 sql_help.c:4906 sql_help.c:4918
+msgid "column_alias"
+msgstr "列的别å"
+
+#: sql_help.c:4414 sql_help.c:4663 sql_help.c:4894
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4416 sql_help.c:4665 sql_help.c:4896
+msgid "seed"
+msgstr "ç§å­"
+
+#: sql_help.c:4420 sql_help.c:4454 sql_help.c:4669 sql_help.c:4703
+#: sql_help.c:4900 sql_help.c:4934
+msgid "with_query_name"
+msgstr "WITH查询语å¥å称(with_query_name)"
+
+#: sql_help.c:4430 sql_help.c:4433 sql_help.c:4436 sql_help.c:4679
+#: sql_help.c:4682 sql_help.c:4685 sql_help.c:4910 sql_help.c:4913
+#: sql_help.c:4916
+msgid "column_definition"
+msgstr "列定义"
+
+#: sql_help.c:4440 sql_help.c:4689 sql_help.c:4920
+msgid "join_type"
+msgstr "连接æ“作的类型"
+
+#: sql_help.c:4442 sql_help.c:4691 sql_help.c:4922
+msgid "join_condition"
+msgstr "用连接æ“作的æ¡ä»¶"
+
+#: sql_help.c:4443 sql_help.c:4692 sql_help.c:4923
+msgid "join_column"
+msgstr "用于连接æ“作的列"
+
+#: sql_help.c:4444 sql_help.c:4693 sql_help.c:4924
+msgid "join_using_alias"
+msgstr "join_using_alia"
+
+#: sql_help.c:4445 sql_help.c:4694 sql_help.c:4925
+msgid "and grouping_element can be one of:"
+msgstr "并且grouping_elementå¯ä»¥æ˜¯ä¸‹åˆ—之一:"
+
+#: sql_help.c:4453 sql_help.c:4702 sql_help.c:4933
+msgid "and with_query is:"
+msgstr "with查询语å¥æ˜¯ï¼š"
+
+#: sql_help.c:4457 sql_help.c:4706 sql_help.c:4937
+msgid "values"
+msgstr "值"
+
+#: sql_help.c:4458 sql_help.c:4707 sql_help.c:4938
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4459 sql_help.c:4708 sql_help.c:4939
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4460 sql_help.c:4709 sql_help.c:4940
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4462 sql_help.c:4711 sql_help.c:4942
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4464 sql_help.c:4713 sql_help.c:4944
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4465 sql_help.c:4714 sql_help.c:4945
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4466 sql_help.c:4715 sql_help.c:4946
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4467 sql_help.c:4716 sql_help.c:4947
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+#: sql_help.c:4494
+msgid "new_table"
+msgstr "新的表"
+
+#: sql_help.c:4519
+msgid "timezone"
+msgstr "时区"
+
+#: sql_help.c:4564
+msgid "snapshot_id"
+msgstr "å¿«ç…§id"
+
+#: sql_help.c:4817
+msgid "sort_expression"
+msgstr "排åºè¡¨è¾¾å¼"
+
+#: sql_help.c:4954 sql_help.c:5932
+msgid "abort the current transaction"
+msgstr "中止目å‰çš„事务"
+
+#: sql_help.c:4960
+msgid "change the definition of an aggregate function"
+msgstr "更改èšé›†å‡½æ•°çš„定义"
+
+#: sql_help.c:4966
+msgid "change the definition of a collation"
+msgstr "更改校对规则的定义"
+
+#: sql_help.c:4972
+msgid "change the definition of a conversion"
+msgstr "更改一个字符编ç è½¬æ¢çš„定义"
+
+#: sql_help.c:4978
+msgid "change a database"
+msgstr "更改一个数æ®åº“"
+
+#: sql_help.c:4984
+msgid "define default access privileges"
+msgstr "定义默认的访问æƒé™"
+
+#: sql_help.c:4990
+msgid "change the definition of a domain"
+msgstr "更改共åŒå€¼åŸŸçš„定义"
+
+#: sql_help.c:4996
+msgid "change the definition of an event trigger"
+msgstr "更改事件触å‘器的定义"
+
+#: sql_help.c:5002
+msgid "change the definition of an extension"
+msgstr "更改扩展的定义"
+
+#: sql_help.c:5008
+msgid "change the definition of a foreign-data wrapper"
+msgstr "更改外部数æ®å°è£…器的定义"
+
+#: sql_help.c:5014
+msgid "change the definition of a foreign table"
+msgstr "更改外部表的定义"
+
+#: sql_help.c:5020
+msgid "change the definition of a function"
+msgstr "更改函数的定义"
+
+#: sql_help.c:5026
+msgid "change role name or membership"
+msgstr "更改角色å称或æˆå‘˜çŠ¶æ€"
+
+#: sql_help.c:5032
+msgid "change the definition of an index"
+msgstr "更改索引的定义"
+
+#: sql_help.c:5038
+msgid "change the definition of a procedural language"
+msgstr "更改程åºè¯­è¨€çš„定义"
+
+#: sql_help.c:5044
+msgid "change the definition of a large object"
+msgstr "更改大对象的定义"
+
+#: sql_help.c:5050
+msgid "change the definition of a materialized view"
+msgstr "更改物化视图的定义"
+
+#: sql_help.c:5056
+msgid "change the definition of an operator"
+msgstr "更改è¿ç®—å­çš„定义"
+
+#: sql_help.c:5062
+msgid "change the definition of an operator class"
+msgstr "更改è¿ç®—å­ç±»åˆ«çš„定义"
+
+#: sql_help.c:5068
+msgid "change the definition of an operator family"
+msgstr "更改一个è¿ç®—å­å®¶æ—的识别"
+
+#: sql_help.c:5074
+msgid "change the definition of a row-level security policy"
+msgstr "更改一æ¡è¡Œçº§å®‰å…¨æ€§ç­–略的定义"
+
+#: sql_help.c:5080
+msgid "change the definition of a procedure"
+msgstr "更改程åºçš„定义"
+
+#: sql_help.c:5086
+msgid "change the definition of a publication"
+msgstr "更改å‘布的定义"
+
+#: sql_help.c:5092 sql_help.c:5194
+msgid "change a database role"
+msgstr "更改数æ®åº“角色"
+
+#: sql_help.c:5098
+msgid "change the definition of a routine"
+msgstr "更改程åºçš„定义"
+
+#: sql_help.c:5104
+msgid "change the definition of a rule"
+msgstr "更改规则的定义"
+
+#: sql_help.c:5110
+msgid "change the definition of a schema"
+msgstr "更改架构模å¼çš„定义"
+
+#: sql_help.c:5116
+msgid "change the definition of a sequence generator"
+msgstr "更改åºåˆ—数产生器的定义"
+
+#: sql_help.c:5122
+msgid "change the definition of a foreign server"
+msgstr "更改外部æœåŠ¡å™¨çš„定义"
+
+#: sql_help.c:5128
+msgid "change the definition of an extended statistics object"
+msgstr "更改扩展统计信æ¯å¯¹è±¡çš„定义"
+
+#: sql_help.c:5134
+msgid "change the definition of a subscription"
+msgstr "更改订阅的定义"
+
+#: sql_help.c:5140
+msgid "change a server configuration parameter"
+msgstr "更改æœåŠ¡å™¨çš„é…ç½®å‚æ•°"
+
+#: sql_help.c:5146
+msgid "change the definition of a table"
+msgstr "更改数æ®è¡¨çš„定义"
+
+#: sql_help.c:5152
+msgid "change the definition of a tablespace"
+msgstr "更改表空间的定义"
+
+#: sql_help.c:5158
+msgid "change the definition of a text search configuration"
+msgstr "更改一个文本æœç´¢ç»„æ€çš„定义"
+
+#: sql_help.c:5164
+msgid "change the definition of a text search dictionary"
+msgstr "更改一个文本æœç´¢å­—典的定义"
+
+#: sql_help.c:5170
+msgid "change the definition of a text search parser"
+msgstr "更改一个文本æœç´¢å‰–æžå™¨çš„定义"
+
+#: sql_help.c:5176
+msgid "change the definition of a text search template"
+msgstr "更改一个文本æœç´¢æ¨¡ç‰ˆçš„定义"
+
+#: sql_help.c:5182
+msgid "change the definition of a trigger"
+msgstr "更改触å‘器的定义"
+
+#: sql_help.c:5188
+msgid "change the definition of a type"
+msgstr "更改数æ®ç±»åž‹çš„定义"
+
+#: sql_help.c:5200
+msgid "change the definition of a user mapping"
+msgstr "更改用户映射的定义"
+
+#: sql_help.c:5206
+msgid "change the definition of a view"
+msgstr "更改视图的定义"
+
+#: sql_help.c:5212
+msgid "collect statistics about a database"
+msgstr "收集数æ®åº“的统计信æ¯"
+
+#: sql_help.c:5218 sql_help.c:6010
+msgid "start a transaction block"
+msgstr "开始一个事务区å—"
+
+#: sql_help.c:5224
+msgid "invoke a procedure"
+msgstr "调用过程"
+
+#: sql_help.c:5230
+msgid "force a write-ahead log checkpoint"
+msgstr "强制一个预写日志检查点"
+
+#: sql_help.c:5236
+msgid "close a cursor"
+msgstr "关闭游标"
+
+#: sql_help.c:5242
+msgid "cluster a table according to an index"
+msgstr "按照索引进行表的èšé›†"
+
+#: sql_help.c:5248
+msgid "define or change the comment of an object"
+msgstr "定义或更改一个对象的注解"
+
+#: sql_help.c:5254 sql_help.c:5812
+msgid "commit the current transaction"
+msgstr "确认目å‰çš„事务"
+
+#: sql_help.c:5260
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "æ交一项事务这是两阶段æ交的先å‰å‡†å¤‡"
+
+#: sql_help.c:5266
+msgid "copy data between a file and a table"
+msgstr "在档案和数æ®è¡¨é—´å¤åˆ¶æ•°æ®"
+
+#: sql_help.c:5272
+msgid "define a new access method"
+msgstr "定义新的访问方法"
+
+#: sql_help.c:5278
+msgid "define a new aggregate function"
+msgstr "定义一个新的èšé›†å‡½æ•°"
+
+#: sql_help.c:5284
+msgid "define a new cast"
+msgstr "建立新的类型转æ¢"
+
+#: sql_help.c:5290
+msgid "define a new collation"
+msgstr "建立新的校对规则"
+
+#: sql_help.c:5296
+msgid "define a new encoding conversion"
+msgstr "定义一个新的字元编ç è½¬æ¢"
+
+#: sql_help.c:5302
+msgid "create a new database"
+msgstr "建立新的数æ®åº“"
+
+#: sql_help.c:5308
+msgid "define a new domain"
+msgstr "建立新的共åŒå€¼åŸŸ"
+
+#: sql_help.c:5314
+msgid "define a new event trigger"
+msgstr "定义新的事件触å‘器"
+
+#: sql_help.c:5320
+msgid "install an extension"
+msgstr "安装一个扩展"
+
+#: sql_help.c:5326
+msgid "define a new foreign-data wrapper"
+msgstr "定义一个新的外部数æ®å°è£…器"
+
+#: sql_help.c:5332
+msgid "define a new foreign table"
+msgstr "建立新的外部表"
+
+#: sql_help.c:5338
+msgid "define a new function"
+msgstr "建立新的函数"
+
+#: sql_help.c:5344 sql_help.c:5404 sql_help.c:5506
+msgid "define a new database role"
+msgstr "定义一个新数æ®åº“角色"
+
+#: sql_help.c:5350
+msgid "define a new index"
+msgstr "建立新的索引"
+
+#: sql_help.c:5356
+msgid "define a new procedural language"
+msgstr "建立新的程åºè¯­è¨€"
+
+#: sql_help.c:5362
+msgid "define a new materialized view"
+msgstr "建立新的物化视图"
+
+#: sql_help.c:5368
+msgid "define a new operator"
+msgstr "建立新的è¿ç®—å­"
+
+#: sql_help.c:5374
+msgid "define a new operator class"
+msgstr "建立新的è¿ç®—å­ç±»åˆ«"
+
+#: sql_help.c:5380
+msgid "define a new operator family"
+msgstr "定义一个新的è¿ç®—å­å®¶æ—"
+
+#: sql_help.c:5386
+msgid "define a new row-level security policy for a table"
+msgstr "为一个表定义一æ¡æ–°çš„行级安全性策略"
+
+#: sql_help.c:5392
+msgid "define a new procedure"
+msgstr "建立新的程åº"
+
+#: sql_help.c:5398
+msgid "define a new publication"
+msgstr "建立新的å‘布"
+
+#: sql_help.c:5410
+msgid "define a new rewrite rule"
+msgstr "建立新的é‡å†™è§„则"
+
+#: sql_help.c:5416
+msgid "define a new schema"
+msgstr "建立新的架构模å¼"
+
+#: sql_help.c:5422
+msgid "define a new sequence generator"
+msgstr "建立新的åºåˆ—数产生器"
+
+#: sql_help.c:5428
+msgid "define a new foreign server"
+msgstr "建立新的触å‘器"
+
+#: sql_help.c:5434
+msgid "define extended statistics"
+msgstr "建立新的扩展统计"
+
+#: sql_help.c:5440
+msgid "define a new subscription"
+msgstr "建立新的订阅"
+
+#: sql_help.c:5446
+msgid "define a new table"
+msgstr "建立新的数æ®è¡¨"
+
+#: sql_help.c:5452 sql_help.c:5968
+msgid "define a new table from the results of a query"
+msgstr "以查询结果建立新的数æ®è¡¨"
+
+#: sql_help.c:5458
+msgid "define a new tablespace"
+msgstr "建立新的表空间"
+
+#: sql_help.c:5464
+msgid "define a new text search configuration"
+msgstr "定义一个新文本æœç´¢ç»„æ€"
+
+#: sql_help.c:5470
+msgid "define a new text search dictionary"
+msgstr "定义一个新文本æœç´¢å­—å…¸"
+
+#: sql_help.c:5476
+msgid "define a new text search parser"
+msgstr "定义一个新文本æœç´¢å‰–æžå™¨"
+
+#: sql_help.c:5482
+msgid "define a new text search template"
+msgstr "定义一个新文本æœç´¢æ¨¡ç‰ˆ"
+
+#: sql_help.c:5488
+msgid "define a new transform"
+msgstr "定义一个新的转æ¢"
+
+#: sql_help.c:5494
+msgid "define a new trigger"
+msgstr "建立新的触å‘器"
+
+#: sql_help.c:5500
+msgid "define a new data type"
+msgstr "建立新的数æ®ç±»åž‹"
+
+#: sql_help.c:5512
+msgid "define a new mapping of a user to a foreign server"
+msgstr "将用户的新映射定义到一个外部æœåŠ¡å™¨"
+
+#: sql_help.c:5518
+msgid "define a new view"
+msgstr "建立新的视图"
+
+#: sql_help.c:5524
+msgid "deallocate a prepared statement"
+msgstr "释放一个已预备好的å™è¿°åŒºå—"
+
+#: sql_help.c:5530
+msgid "define a cursor"
+msgstr "建立一个 cursor"
+
+#: sql_help.c:5536
+msgid "delete rows of a table"
+msgstr "删除数æ®è¡¨ä¸­çš„æ•°æ®åˆ—"
+
+#: sql_help.c:5542
+msgid "discard session state"
+msgstr "抛弃 session 状æ€"
+
+#: sql_help.c:5548
+msgid "execute an anonymous code block"
+msgstr "执行一个匿å代ç å—"
+
+#: sql_help.c:5554
+msgid "remove an access method"
+msgstr "移除一ç§è®¿é—®æ–¹æ³•"
+
+#: sql_help.c:5560
+msgid "remove an aggregate function"
+msgstr "移除一个èšé›†å‡½æ•°"
+
+#: sql_help.c:5566
+msgid "remove a cast"
+msgstr "移除一个类型转æ¢"
+
+#: sql_help.c:5572
+msgid "remove a collation"
+msgstr "移除一个校对规则"
+
+#: sql_help.c:5578
+msgid "remove a conversion"
+msgstr "移除一个字元编ç è½¬æ¢"
+
+#: sql_help.c:5584
+msgid "remove a database"
+msgstr "移除数æ®åº“"
+
+#: sql_help.c:5590
+msgid "remove a domain"
+msgstr "移除一个共åŒå€¼åŸŸ"
+
+#: sql_help.c:5596
+msgid "remove an event trigger"
+msgstr "移除事件触å‘器"
+
+#: sql_help.c:5602
+msgid "remove an extension"
+msgstr "移除一个扩展"
+
+#: sql_help.c:5608
+msgid "remove a foreign-data wrapper"
+msgstr "删除一个外部数æ®å°è£…器"
+
+#: sql_help.c:5614
+msgid "remove a foreign table"
+msgstr "移除外部引用表"
+
+#: sql_help.c:5620
+msgid "remove a function"
+msgstr "移除函数"
+
+#: sql_help.c:5626 sql_help.c:5692 sql_help.c:5794
+msgid "remove a database role"
+msgstr "移除一个数æ®åº“æˆå‘˜"
+
+#: sql_help.c:5632
+msgid "remove an index"
+msgstr "移除一个索引"
+
+#: sql_help.c:5638
+msgid "remove a procedural language"
+msgstr "移除一个程åºè¯­è¨€"
+
+#: sql_help.c:5644
+msgid "remove a materialized view"
+msgstr "移除一个物化视图"
+
+#: sql_help.c:5650
+msgid "remove an operator"
+msgstr "移除è¿ç®—å­"
+
+#: sql_help.c:5656
+msgid "remove an operator class"
+msgstr "移除一个è¿ç®—å­ç±»åˆ«"
+
+#: sql_help.c:5662
+msgid "remove an operator family"
+msgstr "移除一个è¿ç®—å­å®¶æ—"
+
+#: sql_help.c:5668
+msgid "remove database objects owned by a database role"
+msgstr "ä¾ç…§ä¸€ä¸ªæ•°æ®åº“角色拥有的数æ®åº“对象æ¥ç§»é™¤"
+
+#: sql_help.c:5674
+msgid "remove a row-level security policy from a table"
+msgstr "从一个表移除一æ¡è¡Œçº§å®‰å…¨æ€§ç­–ç•¥"
+
+#: sql_help.c:5680
+msgid "remove a procedure"
+msgstr "移除一个程åº"
+
+#: sql_help.c:5686
+msgid "remove a publication"
+msgstr "移除一个å‘布"
+
+#: sql_help.c:5698
+msgid "remove a routine"
+msgstr "移除程åº"
+
+#: sql_help.c:5704
+msgid "remove a rewrite rule"
+msgstr "移除一个é‡å†™è§„则"
+
+#: sql_help.c:5710
+msgid "remove a schema"
+msgstr "移除一个模å¼"
+
+#: sql_help.c:5716
+msgid "remove a sequence"
+msgstr "移除åºåˆ—"
+
+#: sql_help.c:5722
+msgid "remove a foreign server descriptor"
+msgstr "删除一个外部æœåŠ¡å™¨æ述符"
+
+#: sql_help.c:5728
+msgid "remove extended statistics"
+msgstr "移除一个扩展统计"
+
+#: sql_help.c:5734
+msgid "remove a subscription"
+msgstr "移除一个订阅"
+
+#: sql_help.c:5740
+msgid "remove a table"
+msgstr "移除数æ®è¡¨"
+
+#: sql_help.c:5746
+msgid "remove a tablespace"
+msgstr "移除一个表空间"
+
+#: sql_help.c:5752
+msgid "remove a text search configuration"
+msgstr "移除一个文本æœç´¢é…ç½®"
+
+#: sql_help.c:5758
+msgid "remove a text search dictionary"
+msgstr "移除一个文本æœç´¢å­—å…¸"
+
+#: sql_help.c:5764
+msgid "remove a text search parser"
+msgstr "移除一个文本æœç´¢å‰–æžå™¨"
+
+#: sql_help.c:5770
+msgid "remove a text search template"
+msgstr "移除一个文本æœç´¢æ¨¡ç‰ˆ"
+
+#: sql_help.c:5776
+msgid "remove a transform"
+msgstr "移除一个转æ¢"
+
+#: sql_help.c:5782
+msgid "remove a trigger"
+msgstr "移除触å‘器"
+
+#: sql_help.c:5788
+msgid "remove a data type"
+msgstr "移除数æ®ç±»åž‹"
+
+#: sql_help.c:5800
+msgid "remove a user mapping for a foreign server"
+msgstr "为外部æœåŠ¡å™¨åˆ é™¤ç”¨æˆ·æ˜ å°„"
+
+#: sql_help.c:5806
+msgid "remove a view"
+msgstr "移除一个视图"
+
+#: sql_help.c:5818
+msgid "execute a prepared statement"
+msgstr "执行一个已准备好的语å¥å—"
+
+#: sql_help.c:5824
+msgid "show the execution plan of a statement"
+msgstr "显示一个语å¥å—的执行计划"
+
+#: sql_help.c:5830
+msgid "retrieve rows from a query using a cursor"
+msgstr "从使用游标的查询读å–æ•°æ®"
+
+#: sql_help.c:5836
+msgid "define access privileges"
+msgstr "定义存å–æƒé™"
+
+#: sql_help.c:5842
+msgid "import table definitions from a foreign server"
+msgstr "从一个外部æœåŠ¡å™¨å¯¼å…¥è¡¨å®šä¹‰"
+
+#: sql_help.c:5848
+msgid "create new rows in a table"
+msgstr "在表中创建新数æ®è¡Œ"
+
+#: sql_help.c:5854
+msgid "listen for a notification"
+msgstr "等待通知"
+
+#: sql_help.c:5860
+msgid "load a shared library file"
+msgstr "加载一个共享库文件"
+
+#: sql_help.c:5866
+msgid "lock a table"
+msgstr "é”定数æ®è¡¨"
+
+#: sql_help.c:5872
+msgid "position a cursor"
+msgstr "移动游标ä½ç½®"
+
+#: sql_help.c:5878
+msgid "generate a notification"
+msgstr "产生通知"
+
+#: sql_help.c:5884
+msgid "prepare a statement for execution"
+msgstr "预先编译语å¥ä»¥æ‰§è¡Œ"
+
+#: sql_help.c:5890
+msgid "prepare the current transaction for two-phase commit"
+msgstr "准备将当å‰äº‹åŠ¡è¿›è¡ŒäºŒæ®µå¼æ交"
+
+#: sql_help.c:5896
+msgid "change the ownership of database objects owned by a database role"
+msgstr "ä¾ç…§ä¸€ä¸ªæ•°æ®åº“角色拥有的的数æ®åº“对象æ¥æ›´å˜æ‰€æœ‰æƒ"
+
+#: sql_help.c:5902
+msgid "replace the contents of a materialized view"
+msgstr "替æ¢ç‰©åŒ–视图的内容"
+
+#: sql_help.c:5908
+msgid "rebuild indexes"
+msgstr "é‡æ–°å»ºæž„索引"
+
+#: sql_help.c:5914
+msgid "destroy a previously defined savepoint"
+msgstr "删除先å‰å»ºç«‹çš„储存点(Savepoint)"
+
+#: sql_help.c:5920
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "将执行时期å‚数还原æˆé¢„设值"
+
+#: sql_help.c:5926
+msgid "remove access privileges"
+msgstr "移除存å–æƒé™"
+
+#: sql_help.c:5938
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "å–消一个å¯ä»¥ä¸ºä¸¤é˜¶æ®µæ交容易é…置的事务"
+
+#: sql_help.c:5944
+msgid "roll back to a savepoint"
+msgstr "还原至一个储存点(Savepoint)"
+
+#: sql_help.c:5950
+msgid "define a new savepoint within the current transaction"
+msgstr "在当å‰äº‹åŠ¡ä¸­å»ºç«‹æ–°çš„储存点(Savepoint)"
+
+#: sql_help.c:5956
+msgid "define or change a security label applied to an object"
+msgstr "定义或更改一个对象的安全标签"
+
+#: sql_help.c:5962 sql_help.c:6016 sql_help.c:6052
+msgid "retrieve rows from a table or view"
+msgstr "从数æ®è¡¨æˆ–视图中读å–æ•°æ®"
+
+#: sql_help.c:5974
+msgid "change a run-time parameter"
+msgstr "更改一个è¿è¡ŒæœŸå‚æ•°"
+
+#: sql_help.c:5980
+msgid "set constraint check timing for the current transaction"
+msgstr "为当å‰äº‹åŠ¡è®¾å®šçº¦æŸé™åˆ¶æ£€æŸ¥çš„时间模å¼"
+
+#: sql_help.c:5986
+msgid "set the current user identifier of the current session"
+msgstr "为当å‰ä¼šè¯çš„当å‰ç”¨æˆ·çš„设置身份标识"
+
+#: sql_help.c:5992
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "为当å‰ä¼šè¯è®¾ç½®ä¼šè¯ç”¨æˆ·æ ‡è¯†ç¬¦å’Œå½“å‰ç”¨æˆ·æ ‡è¯†ç¬¦"
+
+#: sql_help.c:5998
+msgid "set the characteristics of the current transaction"
+msgstr "设定当å‰äº‹åŠ¡å±žæ€§"
+
+#: sql_help.c:6004
+msgid "show the value of a run-time parameter"
+msgstr "显示è¿è¡ŒæœŸçš„å‚数值"
+
+#: sql_help.c:6022
+msgid "empty a table or set of tables"
+msgstr "空的数æ®è¡¨æˆ–æ•°æ®è¡¨é›†åˆ"
+
+#: sql_help.c:6028
+msgid "stop listening for a notification"
+msgstr "åœæ­¢ç›‘å¬é€šçŸ¥"
+
+#: sql_help.c:6034
+msgid "update rows of a table"
+msgstr "æ›´æ–°æ•°æ®è¡¨ä¸­çš„æ•°æ®åˆ—"
+
+#: sql_help.c:6040
+msgid "garbage-collect and optionally analyze a database"
+msgstr "垃圾收集(GC)并选择地分æžæ•°æ®åº“"
+
+#: sql_help.c:6046
+msgid "compute a set of rows"
+msgstr "计算一个数æ®åˆ—的集åˆ"
+
+#: startup.c:213
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1åªèƒ½åœ¨éžäº¤äº’模å¼ä¸‹ä½¿ç”¨"
+
+#: startup.c:326
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "无法打开事务日志文件 \"%s\": %m"
+
+#: startup.c:438
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"输入 \"help\" æ¥èŽ·å–帮助信æ¯.\n"
+"\n"
+
+#: startup.c:591
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "无法设定列打å°å‚æ•° \"%s\""
+
+#: startup.c:699
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: startup.c:716
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "忽略多余的命令行å‚æ•° \"%s\""
+
+#: startup.c:765
+#, c-format
+msgid "could not find own program executable"
+msgstr "找ä¸åˆ°å¯æ‰§è¡Œæ–‡ä»¶"
+
+#: tab-complete.c:4904
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"自动补全查询失败: %s\n"
+"查询是:\n"
+"%s"
+
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "\"%2$s\"çš„ä¸èƒ½è¯†åˆ«çš„值\"%1$s\":应为布尔值"
+
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "\"%s\"的值\"%s\"无效: 应为整数"
+
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "无效的语言环境å称: \"%s\""
+
+#: variables.c:419
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%2$s\"çš„ä¸èƒ½è¯†åˆ«çš„值\"%1$s\"\n"
+"å¯ç”¨å€¼ä¸º\"%3$s\"."
diff --git a/src/bin/psql/po/zh_TW.po b/src/bin/psql/po/zh_TW.po
new file mode 100644
index 0000000..8958b9b
--- /dev/null
+++ b/src/bin/psql/po/zh_TW.po
@@ -0,0 +1,7811 @@
+# Traditional Chinese message translation file for psql
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the psql (PostgreSQL) package.
+# 2004-12-13 Zhenbang Wei <znbang@gmail.com>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: psql (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-11 20:47+0000\n"
+"PO-Revision-Date: 2023-11-06 08:50+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4.1\n"
+
+# libpq/be-secure.c:294 libpq/be-secure.c:387
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "錯誤: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細內容: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "æ示: "
+
+# command.c:122
+#: ../../common/exec.c:172
+#, c-format
+msgid "invalid binary \"%s\": %m"
+msgstr "無效的執行檔 \"%s\": %m"
+
+# command.c:1103
+#: ../../common/exec.c:215
+#, c-format
+msgid "could not read binary \"%s\": %m"
+msgstr "無法讀å–執行檔 \"%s\": %m"
+
+#: ../../common/exec.c:223
+#, c-format
+msgid "could not find a \"%s\" to execute"
+msgstr "找ä¸åˆ°è¦åŸ·è¡Œçš„ \"%s\""
+
+# utils/error/elog.c:1128
+#: ../../common/exec.c:250
+#, c-format
+msgid "could not resolve path \"%s\" to absolute form: %m"
+msgstr "無法解æžè·¯å¾‘ \"%s\" 為絕å°è·¯å¾‘: %m"
+
+# fe-misc.c:991
+#: ../../common/exec.c:412
+#, c-format
+msgid "%s() failed: %m"
+msgstr "%s() 失敗: %m"
+
+# common.c:123
+#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687
+#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226
+#: mainloop.c:80 mainloop.c:398
+#, c-format
+msgid "out of memory"
+msgstr "記憶體ä¸è¶³"
+
+# command.c:681
+# common.c:85
+# common.c:99
+# mainloop.c:71
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "記憶體ä¸è¶³\n"
+
+# common.c:78
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "無法複製 null 指標(內部錯誤)\n"
+
+# libpq/be-secure.c:689
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "無法查詢有效的使用者ID %ld: %s"
+
+# commands/user.c:899 commands/user.c:1012 commands/user.c:1104
+# commands/user.c:1233 commands/variable.c:664 utils/cache/lsyscache.c:2064
+# utils/init/miscinit.c:335
+#: ../../common/username.c:45 command.c:613
+msgid "user does not exist"
+msgstr "使用者ä¸å­˜åœ¨"
+
+# port/win32/security.c:39
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "使用者å稱查詢失敗: 錯誤碼 %lu"
+
+#: ../../common/wait_error.c:55
+#, c-format
+msgid "command not executable"
+msgstr "無法執行指令"
+
+#: ../../common/wait_error.c:59
+#, c-format
+msgid "command not found"
+msgstr "找ä¸åˆ°æŒ‡ä»¤"
+
+#: ../../common/wait_error.c:64
+#, c-format
+msgid "child process exited with exit code %d"
+msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d"
+
+#: ../../common/wait_error.c:72
+#, c-format
+msgid "child process was terminated by exception 0x%X"
+msgstr "å­é€²ç¨‹è¢«ä¾‹å¤– 0x%X 終止"
+
+#: ../../common/wait_error.c:76
+#, c-format
+msgid "child process was terminated by signal %d: %s"
+msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %d 終止: %s"
+
+#: ../../common/wait_error.c:82
+#, c-format
+msgid "child process exited with unrecognized status %d"
+msgstr "å­é€²ç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ä»£ç¢¼ %d"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "已傳é€å–消請求\n"
+
+# fe-connect.c:1427
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "無法傳é€å–消請求: "
+
+# print.c:1202
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 筆資料)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "已中斷\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "無法將標題新增至表格內容: 欄ä½æ•¸å·²è¶…éŽ %d。\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "無法將儲存格新增至表格內容: ç¸½å„²å­˜æ ¼æ•¸å·²è¶…éŽ %d。\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "無效的輸出格å¼(內部錯誤): %d"
+
+# access/transam/xlog.c:2163
+#: ../../fe_utils/psqlscan.l:717
+#, c-format
+msgid "skipping recursive expansion of variable \"%s\""
+msgstr "ç•¥éŽéžè¿´å±•é–‹è®Šæ•¸ \"%s\""
+
+# utils/fmgr/dfmgr.c:145
+#: ../../port/thread.c:50 ../../port/thread.c:86
+#, c-format
+msgid "could not look up local user ID %d: %s"
+msgstr "無法查詢本地使用者ID %d: %s"
+
+# libpq/hba.c:1481 libpq/hba.c:1512 libpq/hba.c:1582
+#: ../../port/thread.c:55 ../../port/thread.c:91
+#, c-format
+msgid "local user with ID %d does not exist"
+msgstr "本地使用者ID %d ä¸å­˜åœ¨"
+
+# command.c:122
+#: command.c:234
+#, c-format
+msgid "invalid command \\%s"
+msgstr "無效命令 \\%s"
+
+#: command.c:236
+#, c-format
+msgid "Try \\? for help."
+msgstr "用 \\? 顯示說明。"
+
+# command.c:131
+#: command.c:254
+#, c-format
+msgid "\\%s: extra argument \"%s\" ignored"
+msgstr "\\%s: 忽略é¡å¤–çš„åƒæ•¸ \"%s\""
+
+#: command.c:306
+#, c-format
+msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "\\%s 命令被忽略;請使用 \\endif 或 Ctrl-C 退出當å‰çš„ \\if å€å¡Š"
+
+# command.c:240
+#: command.c:611
+#, c-format
+msgid "could not get home directory for user ID %ld: %s"
+msgstr "無法å–得使用者ID %ld 的家目錄: %s"
+
+# command.c:256
+#: command.c:630
+#, c-format
+msgid "\\%s: could not change directory to \"%s\": %m"
+msgstr "%s: 無法變更目錄至 \"%s\": %m"
+
+# common.c:636
+# common.c:871
+#: command.c:654
+#, c-format
+msgid "You are currently not connected to a database.\n"
+msgstr "ç›®å‰æœªé€£ç·šè‡³è³‡æ–™åº«ã€‚\n"
+
+#: command.c:664
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",ä½å€ \"%s\",連接埠 \"%s\"。\n"
+
+#: command.c:667
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",socket \"%s\",連接埠 \"%s\"。\n"
+
+#: command.c:673
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 \"%s†(ä½å€ \"%s\"),連接埠 \"%s\"。\n"
+
+#: command.c:676
+#, c-format
+msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 \"%s\",連接埠 \"%s\"。\n"
+
+# command.c:370
+# command.c:760
+#: command.c:1066 command.c:1159 command.c:2682
+#, c-format
+msgid "no query buffer"
+msgstr "沒有查詢緩存å€"
+
+# commands/user.c:240 commands/user.c:371
+#: command.c:1099 command.c:5689
+#, c-format
+msgid "invalid line number: %s"
+msgstr "無效的行號: %s"
+
+#: command.c:1237
+msgid "No changes"
+msgstr "沒有變更"
+
+# command.c:433
+#: command.c:1315
+#, c-format
+msgid "%s: invalid encoding name or conversion procedure not found"
+msgstr "%s: 無效的編碼å稱或找ä¸åˆ°ç·¨ç¢¼è½‰æ›ç¨‹åº"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795
+#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120
+#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480
+#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192
+#: large_obj.c:254 startup.c:304
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+# parser/analyze.c:3132 parser/parse_coerce.c:221 parser/parse_expr.c:116
+# parser/parse_expr.c:122
+#: command.c:1357
+msgid "There is no previous error."
+msgstr "沒有先å‰çš„錯誤。"
+
+# utils/adt/rowtypes.c:126
+#: command.c:1470
+#, c-format
+msgid "\\%s: missing right parenthesis"
+msgstr "\\%s: 缺少å³æ‹¬è™Ÿ"
+
+# command.c:501
+# command.c:535
+# command.c:549
+# command.c:566
+# command.c:612
+# command.c:740
+# command.c:771
+#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021
+#: command.c:2203 command.c:2444 command.c:2649 command.c:2689
+#, c-format
+msgid "\\%s: missing required argument"
+msgstr "\\%s: 缺少必è¦çš„åƒæ•¸"
+
+#: command.c:1815
+#, c-format
+msgid "\\elif: cannot occur after \\else"
+msgstr "\\elif: ä¸èƒ½å‡ºç¾åœ¨ \\else 之後"
+
+#: command.c:1820
+#, c-format
+msgid "\\elif: no matching \\if"
+msgstr "\\elif: 沒有å°æ‡‰çš„ \\if"
+
+#: command.c:1884
+#, c-format
+msgid "\\else: cannot occur after \\else"
+msgstr "\\else: ä¸èƒ½å‡ºç¾åœ¨ \\else 之後"
+
+#: command.c:1889
+#, c-format
+msgid "\\else: no matching \\if"
+msgstr "\\else: 沒有å°æ‡‰çš„ \\if"
+
+#: command.c:1929
+#, c-format
+msgid "\\endif: no matching \\if"
+msgstr "\\endif: 沒有å°æ‡‰çš„ \\if"
+
+# command.c:598
+#: command.c:2085
+msgid "Query buffer is empty."
+msgstr "查詢緩存å€æ˜¯ç©ºçš„。"
+
+# command.c:915
+# command.c:939
+# startup.c:187
+# startup.c:205
+#: command.c:2128
+#, c-format
+msgid "Enter new password for user \"%s\": "
+msgstr "輸入使用者 \"%s\" 的新密碼: "
+
+#: command.c:2132
+msgid "Enter it again: "
+msgstr "å†æ¬¡è¼¸å…¥: "
+
+#: command.c:2141
+#, c-format
+msgid "Passwords didn't match."
+msgstr "密碼ä¸ä¸€è‡´ã€‚"
+
+# startup.c:492
+#: command.c:2238
+#, c-format
+msgid "\\%s: could not read value for variable"
+msgstr "\\%s: 無法讀å–變數的值"
+
+# command.c:632
+#: command.c:2340
+msgid "Query buffer reset (cleared)."
+msgstr "查詢緩存å€å·²é‡è¨­(已清除)。"
+
+# command.c:646
+#: command.c:2362
+#, c-format
+msgid "Wrote history to file \"%s\".\n"
+msgstr "已將歷å²è¨˜éŒ„寫入檔案 \"%s\"。\n"
+
+#: command.c:2449
+#, c-format
+msgid "\\%s: environment variable name must not contain \"=\""
+msgstr "\\%s: 環境變數å稱ä¸æ‡‰åŒ…å« \"=\""
+
+# copy.c:122
+#: command.c:2497
+#, c-format
+msgid "function name is required"
+msgstr "需è¦å‡½æ•¸å稱"
+
+# copy.c:122
+#: command.c:2499
+#, c-format
+msgid "view name is required"
+msgstr "需è¦æª¢è¦–表å稱"
+
+# command.c:726
+#: command.c:2621
+msgid "Timing is on."
+msgstr "計時功能已啟動。"
+
+# command.c:728
+#: command.c:2623
+msgid "Timing is off."
+msgstr "計時功能已åœæ­¢ã€‚"
+
+# command.c:788
+# command.c:808
+# command.c:1163
+# command.c:1170
+# command.c:1180
+# command.c:1192
+# command.c:1205
+# command.c:1219
+# command.c:1241
+# command.c:1272
+# common.c:170
+# copy.c:530
+# copy.c:575
+#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080
+#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136
+#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329
+#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818
+#, c-format
+msgid "%s: %m"
+msgstr "%s: %m"
+
+# command.c:788
+# command.c:808
+# command.c:1163
+# command.c:1170
+# command.c:1180
+# command.c:1192
+# command.c:1205
+# command.c:1219
+# command.c:1241
+# command.c:1272
+# common.c:170
+# copy.c:530
+# copy.c:575
+#: command.c:2736 copy.c:388
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+# parser/parse_relation.c:356 parser/parse_relation.c:368
+#: command.c:2806 command.c:2852
+#, c-format
+msgid "\\watch: interval value is specified more than once"
+msgstr "\\watch: 間隔值被指定多次"
+
+#: command.c:2816 command.c:2862
+#, c-format
+msgid "\\watch: incorrect interval value \"%s\""
+msgstr "\\watch: 錯誤的間隔值 \"%s\""
+
+# commands/copy.c:2716 parser/parse_target.c:648 parser/parse_target.c:658
+#: command.c:2826
+#, c-format
+msgid "\\watch: iteration count is specified more than once"
+msgstr "\\watch: 迭代次數被指定多次"
+
+#: command.c:2836
+#, c-format
+msgid "\\watch: incorrect iteration count \"%s\""
+msgstr "\\watch: 錯誤的迭代次數 \"%s"
+
+# access/transam/xlog.c:3720
+#: command.c:2843
+#, c-format
+msgid "\\watch: unrecognized parameter \"%s\""
+msgstr "\\watch: 無法識別的åƒæ•¸ \"%s\""
+
+# command.c:915
+# command.c:939
+# startup.c:187
+# startup.c:205
+#: command.c:3236 startup.c:243 startup.c:293
+msgid "Password: "
+msgstr "密碼: "
+
+# command.c:915
+# command.c:939
+# startup.c:187
+# startup.c:205
+#: command.c:3241 startup.c:290
+#, c-format
+msgid "Password for user %s: "
+msgstr "使用者 %s 的密碼: "
+
+#: command.c:3297
+#, c-format
+msgid "Do not give user, host, or port separately when using a connection string"
+msgstr "使用連接字串時,請ä¸è¦åˆ†é–‹æ供使用者ã€ä¸»æ©Ÿæˆ–埠號"
+
+#: command.c:3332
+#, c-format
+msgid "No database connection exists to re-use parameters from"
+msgstr "無資料庫連線å¯ä¾›é‡è¤‡ä½¿ç”¨åƒæ•¸"
+
+# command.c:957
+#: command.c:3638
+#, c-format
+msgid "Previous connection kept"
+msgstr "ä¿ç•™å‰ä¸€å€‹é€£ç·š"
+
+# command.c:969
+#: command.c:3644
+#, c-format
+msgid "\\connect: %s"
+msgstr "\\connect: %s"
+
+# command.c:981
+#: command.c:3700
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",ä½å€ \"%s\",連接埠 \"%s\"。\n"
+
+# command.c:981
+#: command.c:3703
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",socket \"%s\",連接埠 \"%s\"。\n"
+
+# command.c:981
+#: command.c:3709
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 “%s†(ä½å€ \"%s\"),連接埠 \"%s\"。\n"
+
+# command.c:981
+#: command.c:3712
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 “%sâ€ï¼Œé€£æŽ¥åŸ  \"%s\"。\n"
+
+# command.c:981
+#: command.c:3717
+#, c-format
+msgid "You are now connected to database \"%s\" as user \"%s\".\n"
+msgstr "已連線至資料庫 \"%s\",使用者 \"%s\"。\n"
+
+#: command.c:3757
+#, c-format
+msgid "%s (%s, server %s)\n"
+msgstr "%s (%s,伺æœå™¨ %s)\n"
+
+#: command.c:3770
+#, c-format
+msgid ""
+"WARNING: %s major version %s, server major version %s.\n"
+" Some psql features might not work.\n"
+msgstr ""
+"警告: %s 主è¦ç‰ˆæœ¬ %s,伺æœå™¨ä¸»è¦ç‰ˆæœ¬ %s。\n"
+" æŸäº› psql 功能å¯èƒ½ç„¡æ³•é‹ä½œã€‚\n"
+
+# startup.c:652
+#: command.c:3807
+#, c-format
+msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n"
+msgstr "SSL 連線(å”è­°: %s,加密方å¼: %s,壓縮: %s)\n"
+
+# utils/error/elog.c:1350 utils/error/elog.c:1360
+#: command.c:3808 command.c:3809
+msgid "unknown"
+msgstr "unknown"
+
+# help.c:48
+#: command.c:3810 help.c:42
+msgid "off"
+msgstr "off"
+
+# help.c:48
+#: command.c:3810 help.c:42
+msgid "on"
+msgstr "on"
+
+#: command.c:3824
+#, c-format
+msgid "GSSAPI-encrypted connection\n"
+msgstr "GSSAPI 加密連線\n"
+
+#: command.c:3844
+#, c-format
+msgid ""
+"WARNING: Console code page (%u) differs from Windows code page (%u)\n"
+" 8-bit characters might not work correctly. See psql reference\n"
+" page \"Notes for Windows users\" for details.\n"
+msgstr ""
+"警告: console 字碼é (%u)與 Windows 字碼é (%u)ä¸åŒ\n"
+" 8 ä½å…ƒå­—符å¯èƒ½ç„¡æ³•æ­£ç¢ºé‹ä½œã€‚詳細資訊請åƒé–±\n"
+" psql 手冊 \"Windows 使用者注æ„事項\"。\n"
+
+#: command.c:3949
+#, c-format
+msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number"
+msgstr "必須設定環境變數 PSQL_EDITOR_LINENUMBER_ARG 以指定行號"
+
+# command.c:1103
+#: command.c:3979
+#, c-format
+msgid "could not start editor \"%s\""
+msgstr "無法啟動編輯器 \"%s\""
+
+# command.c:1105
+#: command.c:3981
+#, c-format
+msgid "could not start /bin/sh"
+msgstr "無法啟動 /bin/sh"
+
+# command.c:1148
+#: command.c:4031
+#, c-format
+msgid "could not locate temporary directory: %s"
+msgstr "找ä¸åˆ°æš«å­˜ç›®éŒ„: %s"
+
+# command.c:1148
+#: command.c:4058
+#, c-format
+msgid "could not open temporary file \"%s\": %m"
+msgstr "無法開啟暫存檔 \"%s\": %m"
+
+#: command.c:4394
+#, c-format
+msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\""
+msgstr "\\pset: 模稜兩å¯çš„縮寫 \"%s\" åŒæ™‚ç¬¦åˆ \"%s\" å’Œ \"%s\""
+
+# command.c:1340
+#: command.c:4414
+#, c-format
+msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+msgstr "\\pset: å…許的格å¼åŒ…括 aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped"
+
+#: command.c:4433
+#, c-format
+msgid "\\pset: allowed line styles are ascii, old-ascii, unicode"
+msgstr "\\pset: å…許的行樣å¼åŒ…括 asciiã€old-asciiã€unicode"
+
+#: command.c:4448
+#, c-format
+msgid "\\pset: allowed Unicode border line styles are single, double"
+msgstr "\\pset: å…許的 Unicode 邊框線樣å¼åŒ…括 single, double"
+
+#: command.c:4463
+#, c-format
+msgid "\\pset: allowed Unicode column line styles are single, double"
+msgstr "\\pset: å…許的 Unicode 欄線樣å¼åŒ…括 single, double"
+
+#: command.c:4478
+#, c-format
+msgid "\\pset: allowed Unicode header line styles are single, double"
+msgstr "\\pset: å…許的 Unicode 標頭線樣å¼åŒ…括 single, double"
+
+#: command.c:4530
+#, c-format
+msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width"
+msgstr "\\pset: å…許的 xheader_width 值為 \"%s\"(é è¨­ï¼‰ã€\"%s\"ã€\"%s\",或指定確切寬度的數字"
+
+# commands/copy.c:828
+#: command.c:4547
+#, c-format
+msgid "\\pset: csv_fieldsep must be a single one-byte character"
+msgstr "\\pset: csv_fieldsep 必須是一ä½å…ƒçµ„çš„å­—å…ƒ"
+
+# commands/copy.c:828
+#: command.c:4552
+#, c-format
+msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return"
+msgstr "\\pset: csv_fieldsep ä¸èƒ½æ˜¯é›™å¼•è™Ÿã€æ›è¡Œç¬¦è™Ÿæˆ–æ­¸ä½ç¬¦è™Ÿ"
+
+# command.c:1493
+#: command.c:4690 command.c:4891
+#, c-format
+msgid "\\pset: unknown option: %s"
+msgstr "\\pset: ä¸æ˜Žé¸é …: %s"
+
+# command.c:1355
+#: command.c:4710
+#, c-format
+msgid "Border style is %d.\n"
+msgstr "邊框樣å¼ç‚º %d。\n"
+
+# command.c:1436
+#: command.c:4716
+#, c-format
+msgid "Target width is unset.\n"
+msgstr "目標寬度未設定。\n"
+
+#: command.c:4718
+#, c-format
+msgid "Target width is %d.\n"
+msgstr "目標寬度是 %d。\n"
+
+# command.c:1364
+#: command.c:4725
+#, c-format
+msgid "Expanded display is on.\n"
+msgstr "擴展顯示已啟動。\n"
+
+# command.c:1364
+#: command.c:4727
+#, c-format
+msgid "Expanded display is used automatically.\n"
+msgstr "自動使用擴展顯示。\n"
+
+# command.c:1365
+#: command.c:4729
+#, c-format
+msgid "Expanded display is off.\n"
+msgstr "擴展顯示已關閉。\n"
+
+# command.c:1364
+#: command.c:4736 command.c:4738 command.c:4740
+#, c-format
+msgid "Expanded header width is \"%s\".\n"
+msgstr "擴展標頭寬度為 \"%s\"。\n"
+
+# command.c:1364
+#: command.c:4742
+#, c-format
+msgid "Expanded header width is %d.\n"
+msgstr "擴展標頭寬度為 %d。\n"
+
+# command.c:1389
+#: command.c:4748
+#, c-format
+msgid "Field separator for CSV is \"%s\".\n"
+msgstr "CSV 的欄ä½åˆ†éš”符號是 \"%s\"。\n"
+
+# command.c:1389
+#: command.c:4756 command.c:4764
+#, c-format
+msgid "Field separator is zero byte.\n"
+msgstr "欄ä½åˆ†éš”符號為 0 ä½å…ƒçµ„。\n"
+
+# command.c:1389
+#: command.c:4758
+#, c-format
+msgid "Field separator is \"%s\".\n"
+msgstr "欄ä½åˆ†éš”符號是 \"%s\"。\n"
+
+# command.c:1485
+#: command.c:4771
+#, c-format
+msgid "Default footer is on.\n"
+msgstr "é è¨­é å°¾å·²å•Ÿå‹•ã€‚\n"
+
+# command.c:1487
+#: command.c:4773
+#, c-format
+msgid "Default footer is off.\n"
+msgstr "é è¨­é å°¾å·²é—œé–‰ã€‚\n"
+
+# command.c:1345
+#: command.c:4779
+#, c-format
+msgid "Output format is %s.\n"
+msgstr "輸出格å¼ç‚º %s。\n"
+
+# command.c:1355
+#: command.c:4785
+#, c-format
+msgid "Line style is %s.\n"
+msgstr "行樣å¼ç‚º %s。\n"
+
+# command.c:1377
+#: command.c:4792
+#, c-format
+msgid "Null display is \"%s\".\n"
+msgstr "空值顯示為 \"%s\"。\n"
+
+#: command.c:4800
+#, c-format
+msgid "Locale-adjusted numeric output is on.\n"
+msgstr "根據å€åŸŸèª¿æ•´æ•¸å­—輸出已啟動。\n"
+
+#: command.c:4802
+#, c-format
+msgid "Locale-adjusted numeric output is off.\n"
+msgstr "根據å€åŸŸèª¿æ•´æ•¸å­—輸出已關閉。\n"
+
+# command.c:1470
+#: command.c:4809
+#, c-format
+msgid "Pager is used for long output.\n"
+msgstr "分é é¡¯ç¤ºå·²å•Ÿå‹•ã€‚\n"
+
+# command.c:1472
+#: command.c:4811
+#, c-format
+msgid "Pager is always used.\n"
+msgstr "一律使用分é é¡¯ç¤ºã€‚\n"
+
+# command.c:1474
+#: command.c:4813
+#, c-format
+msgid "Pager usage is off.\n"
+msgstr "分é é¡¯ç¤ºå·²é—œé–‰ã€‚\n"
+
+#: command.c:4819
+#, c-format
+msgid "Pager won't be used for less than %d line.\n"
+msgid_plural "Pager won't be used for less than %d lines.\n"
+msgstr[0] "å°‘æ–¼ %d 行時ä¸è¦åˆ†é é¡¯ç¤ºã€‚\n"
+
+# command.c:1405
+#: command.c:4829 command.c:4839
+#, c-format
+msgid "Record separator is zero byte.\n"
+msgstr "記錄分隔符號是 0 ä½å…ƒçµ„。\n"
+
+# command.c:1403
+#: command.c:4831
+#, c-format
+msgid "Record separator is <newline>.\n"
+msgstr "記錄分隔符號是 <newline>。\n"
+
+# command.c:1405
+#: command.c:4833
+#, c-format
+msgid "Record separator is \"%s\".\n"
+msgstr "記錄分隔符號是 \"%s\"。\n"
+
+# command.c:1452
+#: command.c:4846
+#, c-format
+msgid "Table attributes are \"%s\".\n"
+msgstr "表格屬性是 \"%s\"。\n"
+
+# command.c:1454
+#: command.c:4849
+#, c-format
+msgid "Table attributes unset.\n"
+msgstr "表格屬性未設定。\n"
+
+# command.c:1434
+#: command.c:4856
+#, c-format
+msgid "Title is \"%s\".\n"
+msgstr "標題是 \"%s\"。\n"
+
+# command.c:1436
+#: command.c:4858
+#, c-format
+msgid "Title is unset.\n"
+msgstr "標題未設定。\n"
+
+# command.c:1418
+#: command.c:4865
+#, c-format
+msgid "Tuples only is on.\n"
+msgstr "åªé¡¯ç¤ºè³‡æ–™ on\n"
+
+# command.c:1418
+#: command.c:4867
+#, c-format
+msgid "Tuples only is off.\n"
+msgstr "åªé¡¯ç¤ºè³‡æ–™ off\n"
+
+# command.c:1355
+#: command.c:4873
+#, c-format
+msgid "Unicode border line style is \"%s\".\n"
+msgstr "Unicode 邊框樣å¼ç‚º \"%s\"。\n"
+
+# command.c:1355
+#: command.c:4879
+#, c-format
+msgid "Unicode column line style is \"%s\".\n"
+msgstr "Unicode 欄線樣å¼ç‚º \"%s\"。\n"
+
+# command.c:1355
+#: command.c:4885
+#, c-format
+msgid "Unicode header line style is \"%s\".\n"
+msgstr "Unicode 標頭線樣å¼ç‚º \"%s\"。\n"
+
+# command.c:1532
+#: command.c:5134
+#, c-format
+msgid "\\!: failed"
+msgstr "\\!: 失敗"
+
+#: command.c:5168
+#, c-format
+msgid "\\watch cannot be used with an empty query"
+msgstr "\\watch ä¸èƒ½èˆ‡ç©ºæŸ¥è©¢ä¸€èµ·ä½¿ç”¨"
+
+# postmaster/syslogger.c:514 postmaster/syslogger.c:527
+#: command.c:5200
+#, c-format
+msgid "could not set timer: %m"
+msgstr "無法設置計時器: %m"
+
+#: command.c:5269
+#, c-format
+msgid "%s\t%s (every %gs)\n"
+msgstr "%s\t%s (æ¯ %gs)\n"
+
+#: command.c:5272
+#, c-format
+msgid "%s (every %gs)\n"
+msgstr "%s (æ¯ %gs)\n"
+
+# access/transam/xlog.c:5319 access/transam/xlog.c:5439
+#: command.c:5340
+#, c-format
+msgid "could not wait for signals: %m"
+msgstr "無法等待信號: %m"
+
+#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083
+#, c-format
+msgid ""
+"********* QUERY **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+msgstr ""
+"********* 查詢 **********\n"
+"%s\n"
+"**************************\n"
+"\n"
+
+# commands/comment.c:348 commands/view.c:113 tcop/utility.c:88
+#: command.c:5584
+#, c-format
+msgid "\"%s.%s\" is not a view"
+msgstr "\"%s.%s\" ä¸æ˜¯æª¢è¦–表"
+
+#: command.c:5600
+#, c-format
+msgid "could not parse reloptions array"
+msgstr "ç„¡æ³•è§£æž reloption 陣列"
+
+#: common.c:167
+#, c-format
+msgid "cannot escape without active connection"
+msgstr "沒有活動中連線無法 escape"
+
+# commands/copy.c:828
+#: common.c:208
+#, c-format
+msgid "shell command argument contains a newline or carriage return: \"%s\""
+msgstr "shell 命令的åƒæ•¸åŒ…å«æ›è¡Œæˆ–æ­¸ä½ç¬¦è™Ÿ: \"%s\""
+
+# common.c:298
+#: common.c:312
+#, c-format
+msgid "connection to server was lost"
+msgstr "與伺æœå™¨çš„連線已中斷"
+
+# common.c:302
+#: common.c:316
+#, c-format
+msgid "The connection to the server was lost. Attempting reset: "
+msgstr "與伺æœå™¨çš„連線已中斷。嘗試é‡æ–°é€£ç·š: "
+
+# common.c:307
+#: common.c:321
+#, c-format
+msgid "Failed.\n"
+msgstr "失敗。\n"
+
+# common.c:314
+#: common.c:338
+#, c-format
+msgid "Succeeded.\n"
+msgstr "æˆåŠŸã€‚\n"
+
+# fe-exec.c:1204
+#: common.c:390 common.c:1021
+#, c-format
+msgid "unexpected PQresultStatus: %d"
+msgstr "éžé æœŸçš„ PQresultStatus: %d"
+
+# common.c:930
+#: common.c:531
+#, c-format
+msgid "Time: %.3f ms\n"
+msgstr "時間: %.3f ms\n"
+
+# common.c:930
+#: common.c:546
+#, c-format
+msgid "Time: %.3f ms (%02d:%06.3f)\n"
+msgstr "時間: %.3f ms (%02d:%06.3f)\n"
+
+#: common.c:555
+#, c-format
+msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n"
+msgstr "時間: %.3f ms (%02d:%02d:%06.3f)\n"
+
+#: common.c:562
+#, c-format
+msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+msgstr "時間: %.3f ms (%.0f d %02d:%02d:%06.3f)\n"
+
+# common.c:636
+# common.c:871
+#: common.c:586 common.c:643 common.c:1054 describe.c:6214
+#, c-format
+msgid "You are currently not connected to a database."
+msgstr "ç›®å‰å°šæœªé€£ç·šè‡³è³‡æ–™åº«ã€‚"
+
+# common.c:691
+#: common.c:674
+#, c-format
+msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n"
+msgstr "收到來自伺æœå™¨è¡Œç¨‹(PID %3$d)çš„éžåŒæ­¥é€šçŸ¥ \"%1$s\"(資料 \"%2$s\")。\n"
+
+# common.c:691
+#: common.c:677
+#, c-format
+msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n"
+msgstr "收到來自伺æœå™¨è¡Œç¨‹(PID %2$d)çš„éžåŒæ­¥é€šçŸ¥ \"%1$s\"。\n"
+
+# postmaster/syslogger.c:514 postmaster/syslogger.c:527
+#: common.c:708
+#, c-format
+msgid "could not print result table: %m"
+msgstr "無法顯示çµæžœè¡¨æ ¼: %m"
+
+# catalog/pg_aggregate.c:286
+#: common.c:728
+#, c-format
+msgid "no rows returned for \\gset"
+msgstr "沒有回傳資料給 \\gset"
+
+# utils/adt/regproc.c:471 utils/adt/regproc.c:491
+#: common.c:733
+#, c-format
+msgid "more than one row returned for \\gset"
+msgstr "回傳多於一筆資料給 \\gset"
+
+# utils/misc/guc.c:4239
+#: common.c:751
+#, c-format
+msgid "attempt to \\gset into specially treated variable \"%s\" ignored"
+msgstr "嘗試將資料用 \\gset 存入特殊變數 \"%s\" çš„æ“作已被忽略"
+
+# common.c:879
+#: common.c:1063
+#, c-format
+msgid ""
+"***(Single step mode: verify command)*******************************************\n"
+"%s\n"
+"***(press return to proceed or enter x and return to cancel)********************\n"
+msgstr ""
+"***(單步模å¼: 驗證命令)*******************************************\n"
+"%s\n"
+"***(按 Enter éµç¹¼çºŒæˆ–輸入 x 然後按 Enter éµå–消)********************\n"
+"\n"
+
+# utils/error/elog.c:1555
+#: common.c:1146
+#, c-format
+msgid "STATEMENT: %s"
+msgstr "陳述å¼: %s"
+
+# large_obj.c:58
+#: common.c:1182
+#, c-format
+msgid "unexpected transaction status (%d)"
+msgstr "éžé æœŸçš„交易狀態(%d)"
+
+# describe.c:744
+#: common.c:1335 describe.c:2026
+msgid "Column"
+msgstr "欄ä½"
+
+# describe.c:415
+# describe.c:745
+# describe.c:1478
+# describe.c:1587
+#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046
+#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027
+#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571
+#: describe.c:5846
+msgid "Type"
+msgstr "型別"
+
+# tcop/pquery.c:448
+#: common.c:1385
+#, c-format
+msgid "The command has no result, or the result has no columns.\n"
+msgstr "命令沒有çµæžœï¼Œæˆ–çµæžœæ²’有欄ä½ã€‚\n"
+
+# copy.c:122
+#: copy.c:98
+#, c-format
+msgid "\\copy: arguments required"
+msgstr "\\copy: 需è¦åƒæ•¸"
+
+# copy.c:408
+#: copy.c:253
+#, c-format
+msgid "\\copy: parse error at \"%s\""
+msgstr "\\copy: 解æžéŒ¯èª¤ï¼Œä½æ–¼ \"%s\""
+
+# copy.c:410
+#: copy.c:255
+#, c-format
+msgid "\\copy: parse error at end of line"
+msgstr "\\copy: 解æžéŒ¯èª¤ï¼Œä½æ–¼è¡Œå°¾"
+
+#: copy.c:326
+#, c-format
+msgid "could not execute command \"%s\": %m"
+msgstr "無法執行命令 \"%s\": %m"
+
+# access/transam/xlog.c:1936 access/transam/xlog.c:2038
+# access/transam/xlog.c:5291
+#: copy.c:342
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "無法å–得檔案 \"%s\" 的狀態: %m"
+
+# copy.c:541
+#: copy.c:346
+#, c-format
+msgid "%s: cannot copy from/to a directory"
+msgstr "%s: 無法複製至/從目錄"
+
+# access/transam/xlog.c:3154 access/transam/xlog.c:3341
+#: copy.c:383
+#, c-format
+msgid "could not close pipe to external command: %m"
+msgstr "無法關閉å°å¤–部命令的管é“: %m"
+
+# command.c:1103
+#: copy.c:451 copy.c:461
+#, c-format
+msgid "could not write COPY data: %m"
+msgstr "無法寫入 COPY 資料: %m"
+
+#: copy.c:467
+#, c-format
+msgid "COPY data transfer failed: %s"
+msgstr "COPY 資料傳輸失敗: %s"
+
+#: copy.c:528
+msgid "canceled by user"
+msgstr "已被使用者å–消"
+
+# copy.c:668
+#: copy.c:539
+msgid ""
+"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."
+msgstr ""
+"請輸入è¦è¤‡è£½çš„資料,然後加上æ›è¡Œç¬¦è™Ÿã€‚\n"
+"以å斜線和一個ç¨ç«‹çš„å¥é»žçµæŸï¼Œæˆ–者使用 EOF 信號。"
+
+#: copy.c:682
+msgid "aborted because of read failure"
+msgstr "因讀å–失敗而中止"
+
+#: copy.c:716
+msgid "trying to exit copy mode"
+msgstr "試圖退出複製模å¼"
+
+#: crosstabview.c:123
+#, c-format
+msgid "\\crosstabview: statement did not return a result set"
+msgstr "\\crosstabview: 敘述未回傳çµæžœé›†"
+
+# parser/parse_expr.c:492
+#: crosstabview.c:129
+#, c-format
+msgid "\\crosstabview: query must return at least three columns"
+msgstr "\\crosstabview: 查詢至少è¦å›žå‚³ä¸‰å€‹æ¬„ä½"
+
+#: crosstabview.c:156
+#, c-format
+msgid "\\crosstabview: vertical and horizontal headers must be different columns"
+msgstr "\\crosstabview: 垂直和水平標頭必須是ä¸åŒçš„欄ä½"
+
+#: crosstabview.c:172
+#, c-format
+msgid "\\crosstabview: data column must be specified when query returns more than three columns"
+msgstr "\\crosstabview: 當查詢回傳超éŽä¸‰å€‹æ¬„ä½æ™‚,必須指定資料欄ä½"
+
+#: crosstabview.c:228
+#, c-format
+msgid "\\crosstabview: maximum number of columns (%d) exceeded"
+msgstr "\\crosstabview: 超éŽæœ€å¤§æ¬„ä½æ•¸é™åˆ¶(%d)"
+
+#: crosstabview.c:397
+#, c-format
+msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\""
+msgstr "\\crosstabview: 查詢çµæžœåŒ…å«å¤šå€‹è³‡æ–™å€¼ï¼Œåˆ— â€%sâ€ï¼Œæ¬„ â€%sâ€"
+
+# fe-exec.c:1906
+# fe-exec.c:1929
+#: crosstabview.c:645
+#, c-format
+msgid "\\crosstabview: column number %d is out of range 1..%d"
+msgstr "\\crosstabview: 欄ä½ç·¨è™Ÿ %d 超éŽç¯„åœ 1..%d"
+
+#: crosstabview.c:670
+#, c-format
+msgid "\\crosstabview: ambiguous column name: \"%s\""
+msgstr "\\crosstabview: 模稜兩å¯çš„欄ä½å稱: \"%s\""
+
+#: crosstabview.c:678
+#, c-format
+msgid "\\crosstabview: column name not found: \"%s\""
+msgstr "\\crosstabview: 找ä¸åˆ°æ¬„ä½å稱: \"%s\""
+
+# describe.c:82
+# describe.c:177
+# describe.c:247
+# describe.c:320
+# describe.c:415
+# describe.c:469
+# describe.c:1476
+# describe.c:1585
+# describe.c:1633
+#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038
+#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157
+#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932
+#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499
+#: describe.c:5556 describe.c:5960 describe.c:6038
+msgid "Schema"
+msgstr "Schema"
+
+# describe.c:82
+# describe.c:128
+# describe.c:177
+# describe.c:247
+# describe.c:320
+# describe.c:362
+# describe.c:415
+# describe.c:469
+# describe.c:1476
+# describe.c:1586
+# describe.c:1634
+# describe.c:1727
+#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631
+#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265
+#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408
+#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933
+#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489
+#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827
+#: describe.c:6036 describe.c:6265 describe.c:6573
+msgid "Name"
+msgstr "å稱"
+
+# describe.c:177
+#: describe.c:89 describe.c:351 describe.c:369
+msgid "Result data type"
+msgstr "çµæžœè³‡æ–™åž‹åˆ¥"
+
+# describe.c:178
+#: describe.c:90 describe.c:352 describe.c:370
+msgid "Argument data types"
+msgstr "åƒæ•¸è³‡æ–™åž‹åˆ¥"
+
+# describe.c:83
+# describe.c:187
+# describe.c:260
+# describe.c:322
+# describe.c:369
+# describe.c:469
+# describe.c:758
+# describe.c:1488
+# describe.c:1733
+# large_obj.c:256
+#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418
+#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047
+#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347
+#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844
+#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327
+#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501
+#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974
+#: describe.c:6039 describe.c:7093
+msgid "Description"
+msgstr "æè¿°"
+
+# describe.c:97
+#: describe.c:128
+msgid "List of aggregate functions"
+msgstr "èšåˆå‡½æ•¸åˆ—表"
+
+# describe.c:117
+#: describe.c:153
+#, c-format
+msgid "The server (version %s) does not support access methods."
+msgstr "伺æœå™¨(版本 %s)ä¸æ”¯æ´å­˜å–æ–¹å¼ã€‚"
+
+# describe.c:543
+# describe.c:1477
+#: describe.c:168
+msgid "Index"
+msgstr "索引"
+
+# describe.c:1483
+#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961
+msgid "Table"
+msgstr "資料表"
+
+#: describe.c:177 describe.c:5758
+msgid "Handler"
+msgstr "Handler"
+
+# describe.c:1703
+#: describe.c:201
+msgid "List of access methods"
+msgstr "å­˜å–æ–¹å¼æ¸…å–®"
+
+# describe.c:128
+# describe.c:186
+# describe.c:362
+# describe.c:1478
+# describe.c:1727
+#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188
+#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655
+#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266
+#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819
+#: describe.c:7081
+msgid "Owner"
+msgstr "æ“有者"
+
+# describe.c:128
+#: describe.c:231
+msgid "Location"
+msgstr "ä½ç½®"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: describe.c:241 describe.c:3517 describe.c:3858
+msgid "Options"
+msgstr "é¸é …"
+
+# describe.c:257
+#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001
+msgid "Size"
+msgstr "大å°"
+
+# describe.c:150
+#: describe.c:266
+msgid "List of tablespaces"
+msgstr "表空間清單"
+
+#: describe.c:311
+#, c-format
+msgid "\\df only takes [anptwS+] as options"
+msgstr "\\df åªæŽ¥å— [anptwS+] 作為é¸é …"
+
+#: describe.c:319
+#, c-format
+msgid "\\df does not take a \"%c\" option with server version %s"
+msgstr "\\df 伺æœå™¨ç‰ˆæœ¬ %2$s ä¸æŽ¥å— \"%1$c\" é¸é …"
+
+#. translator: "agg" is short for "aggregate"
+#: describe.c:354 describe.c:372
+msgid "agg"
+msgstr "agg"
+
+#: describe.c:355 describe.c:373
+msgid "window"
+msgstr "window"
+
+#: describe.c:356
+msgid "proc"
+msgstr "proc"
+
+# describe.c:498
+#: describe.c:357 describe.c:375
+msgid "func"
+msgstr "func"
+
+# describe.c:575
+#: describe.c:374 describe.c:1397
+msgid "trigger"
+msgstr "trigger"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:386
+msgid "immutable"
+msgstr "immutable"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:387
+msgid "stable"
+msgstr "stable"
+
+#: describe.c:388
+msgid "volatile"
+msgstr "volatile"
+
+#: describe.c:389
+msgid "Volatility"
+msgstr "變動性"
+
+#: describe.c:397
+msgid "restricted"
+msgstr "restricted"
+
+#: describe.c:398
+msgid "safe"
+msgstr "safe"
+
+#: describe.c:399
+msgid "unsafe"
+msgstr "unsafe"
+
+#: describe.c:400
+msgid "Parallel"
+msgstr "並行"
+
+# sql_help.h:221
+#: describe.c:405
+msgid "definer"
+msgstr "definer"
+
+#: describe.c:406
+msgid "invoker"
+msgstr "invoker"
+
+#: describe.c:407
+msgid "Security"
+msgstr "安全性"
+
+# describe.c:186
+#: describe.c:412
+msgid "Language"
+msgstr "語言"
+
+# describe.c:257
+#: describe.c:415 describe.c:652
+msgid "Internal name"
+msgstr "內部å稱"
+
+# describe.c:221
+#: describe.c:589
+msgid "List of functions"
+msgstr "函數清單"
+
+#: describe.c:654
+msgid "Elements"
+msgstr "元素"
+
+# describe.c:289
+#: describe.c:706
+msgid "List of data types"
+msgstr "資料型別清單"
+
+# describe.c:321
+#: describe.c:809
+msgid "Left arg type"
+msgstr "å·¦åƒæ•¸åž‹åˆ¥"
+
+# describe.c:321
+#: describe.c:810
+msgid "Right arg type"
+msgstr "å³åƒæ•¸åž‹åˆ¥"
+
+# describe.c:322
+#: describe.c:811
+msgid "Result type"
+msgstr "çµæžœé¡žåž‹"
+
+# describe.c:1691
+#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326
+#: describe.c:7010 describe.c:7014
+msgid "Function"
+msgstr "函數"
+
+# describe.c:336
+#: describe.c:897
+msgid "List of operators"
+msgstr "é‹ç®—符清單"
+
+# describe.c:365
+#: describe.c:932
+msgid "Encoding"
+msgstr "字元編碼"
+
+#: describe.c:936 describe.c:940
+msgid "Locale Provider"
+msgstr "å€åŸŸæ供者"
+
+# describe.c:128
+#: describe.c:944 describe.c:4947
+msgid "Collate"
+msgstr "Collate"
+
+# describe.c:415
+# describe.c:745
+# describe.c:1478
+# describe.c:1587
+#: describe.c:945 describe.c:4948
+msgid "Ctype"
+msgstr "Ctype"
+
+# help.c:127
+#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957
+msgid "ICU Locale"
+msgstr "ICU å€åŸŸ"
+
+# describe.c:983
+# describe.c:1204
+#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966
+msgid "ICU Rules"
+msgstr "ICU è¦å‰‡"
+
+# describe.c:1342
+#: describe.c:973
+msgid "Tablespace"
+msgstr "表空間"
+
+# describe.c:381
+#: describe.c:999
+msgid "List of databases"
+msgstr "資料庫清單"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:1040 describe.c:1191 describe.c:3949
+msgid "table"
+msgstr "table"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:1041 describe.c:3950
+msgid "view"
+msgstr "view"
+
+#: describe.c:1042 describe.c:3951
+msgid "materialized view"
+msgstr "materialized view"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:1043 describe.c:1193 describe.c:3953
+msgid "sequence"
+msgstr "sequence"
+
+# describe.c:933
+#: describe.c:1044 describe.c:3955
+msgid "foreign table"
+msgstr "foreign table"
+
+#: describe.c:1045 describe.c:3956 describe.c:4168
+msgid "partitioned table"
+msgstr "partitioned table"
+
+# sql_help.h:325
+#: describe.c:1056
+msgid "Column privileges"
+msgstr "欄ä½æ¬Šé™"
+
+#: describe.c:1087 describe.c:1121
+msgid "Policies"
+msgstr "政策"
+
+# describe.c:133
+# describe.c:415
+# describe.c:1733
+#: describe.c:1150 describe.c:4577 describe.c:6678
+msgid "Access privileges"
+msgstr "å­˜å–權é™"
+
+# describe.c:498
+#: describe.c:1195
+msgid "function"
+msgstr "函數"
+
+# describe.c:415
+# describe.c:745
+# describe.c:1478
+# describe.c:1587
+#: describe.c:1197
+msgid "type"
+msgstr "型別"
+
+# describe.c:82
+# describe.c:177
+# describe.c:247
+# describe.c:320
+# describe.c:415
+# describe.c:469
+# describe.c:1476
+# describe.c:1585
+# describe.c:1633
+#: describe.c:1199
+msgid "schema"
+msgstr "schema"
+
+# sql_help.h:325
+#: describe.c:1222
+msgid "Default access privileges"
+msgstr "é è¨­å­˜å–權é™"
+
+# describe.c:469
+#: describe.c:1266
+msgid "Object"
+msgstr "物件"
+
+# catalog/dependency.c:1511
+#: describe.c:1280
+msgid "table constraint"
+msgstr "table constraint"
+
+#: describe.c:1304
+msgid "domain constraint"
+msgstr "domain constraint"
+
+# catalog/dependency.c:1592
+#: describe.c:1328
+msgid "operator class"
+msgstr "operator class"
+
+# sql_help.h:269
+#: describe.c:1352
+msgid "operator family"
+msgstr "operator family"
+
+# describe.c:559
+#: describe.c:1375
+msgid "rule"
+msgstr "rule"
+
+# describe.c:593
+#: describe.c:1421
+msgid "Object descriptions"
+msgstr "物件æè¿°"
+
+# describe.c:641
+#: describe.c:1486 describe.c:4074
+#, c-format
+msgid "Did not find any relation named \"%s\"."
+msgstr "找ä¸åˆ°å為 \"%s\" çš„é—œè¯ã€‚"
+
+# describe.c:641
+#: describe.c:1489 describe.c:4077
+#, c-format
+msgid "Did not find any relations."
+msgstr "找ä¸åˆ°ä»»ä½•é—œè¯ã€‚"
+
+# describe.c:728
+#: describe.c:1685
+#, c-format
+msgid "Did not find any relation with OID %s."
+msgstr "找ä¸åˆ°åˆ° OID 為 %s çš„é—œè¯ã€‚"
+
+#: describe.c:1733 describe.c:1757
+msgid "Start"
+msgstr "開始"
+
+#: describe.c:1734 describe.c:1758
+msgid "Minimum"
+msgstr "最å°"
+
+#: describe.c:1735 describe.c:1759
+msgid "Maximum"
+msgstr "最大"
+
+#: describe.c:1736 describe.c:1760
+msgid "Increment"
+msgstr "增é‡"
+
+#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493
+#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721
+msgid "yes"
+msgstr "是"
+
+#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493
+#: describe.c:4835 describe.c:4971 describe.c:6722
+msgid "no"
+msgstr "å¦"
+
+#: describe.c:1739 describe.c:1763
+msgid "Cycles?"
+msgstr "循環?"
+
+#: describe.c:1740 describe.c:1764
+msgid "Cache"
+msgstr "å¿«å–"
+
+#: describe.c:1805
+#, c-format
+msgid "Owned by: %s"
+msgstr "æ“有者: %s"
+
+#: describe.c:1809
+#, c-format
+msgid "Sequence for identity column: %s"
+msgstr "自動增é‡æ¬„ä½åºåˆ—: %s"
+
+# describe.c:871
+#: describe.c:1817
+#, c-format
+msgid "Unlogged sequence \"%s.%s\""
+msgstr "無日誌åºåˆ— \"%s.%s\""
+
+# describe.c:867
+#: describe.c:1820
+#, c-format
+msgid "Sequence \"%s.%s\""
+msgstr "åºåˆ— \"%s.%s\""
+
+# describe.c:933
+#: describe.c:1963
+#, c-format
+msgid "Unlogged table \"%s.%s\""
+msgstr "無日誌資料表 \"%s.%s\""
+
+# describe.c:859
+#: describe.c:1966
+#, c-format
+msgid "Table \"%s.%s\""
+msgstr "資料表 \"%s.%s\""
+
+# describe.c:863
+#: describe.c:1970
+#, c-format
+msgid "View \"%s.%s\""
+msgstr "檢視表 \"%s.%s\""
+
+# describe.c:933
+#: describe.c:1975
+#, c-format
+msgid "Unlogged materialized view \"%s.%s\""
+msgstr "無日誌實體化檢視表 \"%s.%s\""
+
+# commands/analyze.c:198
+#: describe.c:1978
+#, c-format
+msgid "Materialized view \"%s.%s\""
+msgstr "實體化檢視表 \"%s.%s\""
+
+# describe.c:871
+#: describe.c:1983
+#, c-format
+msgid "Unlogged index \"%s.%s\""
+msgstr "無日誌索引 \"%s.%s\""
+
+# describe.c:871
+#: describe.c:1986
+#, c-format
+msgid "Index \"%s.%s\""
+msgstr "索引 \"%s.%s\""
+
+# describe.c:871
+#: describe.c:1991
+#, c-format
+msgid "Unlogged partitioned index \"%s.%s\""
+msgstr "無日誌分割索引 \"%s.%s\""
+
+# describe.c:871
+#: describe.c:1994
+#, c-format
+msgid "Partitioned index \"%s.%s\""
+msgstr "分割索引 \"%s.%s\""
+
+# describe.c:879
+#: describe.c:1998
+#, c-format
+msgid "TOAST table \"%s.%s\""
+msgstr "TOAST 資料表 \"%s.%s\""
+
+# describe.c:883
+#: describe.c:2002
+#, c-format
+msgid "Composite type \"%s.%s\""
+msgstr "複åˆåž‹åˆ¥ \"%s.%s\""
+
+# describe.c:933
+#: describe.c:2006
+#, c-format
+msgid "Foreign table \"%s.%s\""
+msgstr "外部資料表 \"%s.%s\""
+
+# describe.c:933
+#: describe.c:2011
+#, c-format
+msgid "Unlogged partitioned table \"%s.%s\""
+msgstr "無日誌分割資料表 \"%s.%s\""
+
+# describe.c:933
+#: describe.c:2014
+#, c-format
+msgid "Partitioned table \"%s.%s\""
+msgstr "分割資料表 \"%s.%s\""
+
+# describe.c:128
+#: describe.c:2030 describe.c:4410
+msgid "Collation"
+msgstr "定åº"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:2031 describe.c:4411
+msgid "Nullable"
+msgstr "能å¦ç‚º NULL"
+
+# describe.c:1639
+#: describe.c:2032 describe.c:4412
+msgid "Default"
+msgstr "é è¨­"
+
+#: describe.c:2035
+msgid "Key?"
+msgstr "索引�"
+
+# describe.c:1636
+#: describe.c:2037 describe.c:4732 describe.c:4743
+msgid "Definition"
+msgstr "定義"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914
+#: describe.c:5973
+msgid "FDW options"
+msgstr "FDW é¸é …"
+
+# describe.c:1635
+#: describe.c:2041
+msgid "Storage"
+msgstr "儲存體"
+
+#: describe.c:2043
+msgid "Compression"
+msgstr "壓縮"
+
+#: describe.c:2045
+msgid "Stats target"
+msgstr "統計目標"
+
+#: describe.c:2181
+#, c-format
+msgid "Partition of: %s %s%s"
+msgstr "分割來自: %s %s%s"
+
+#: describe.c:2194
+msgid "No partition constraint"
+msgstr "沒有分割è¦å‰‡"
+
+# catalog/dependency.c:1511
+#: describe.c:2196
+#, c-format
+msgid "Partition constraint: %s"
+msgstr "分割è¦å‰‡: %s"
+
+#: describe.c:2220
+#, c-format
+msgid "Partition key: %s"
+msgstr "分割索引éµ: %s"
+
+# describe.c:933
+#: describe.c:2246
+#, c-format
+msgid "Owning table: \"%s.%s\""
+msgstr "所屬資料表: \"%s.%s\""
+
+# describe.c:925
+#: describe.c:2315
+msgid "primary key, "
+msgstr "primary key, "
+
+# describe.c:927
+#: describe.c:2318
+msgid "unique"
+msgstr "unique"
+
+#: describe.c:2320
+msgid " nulls not distinct"
+msgstr " nulls not distinct"
+
+# fe-protocol3.c:691
+#: describe.c:2321
+msgid ", "
+msgstr ", "
+
+# describe.c:933
+#: describe.c:2328
+#, c-format
+msgid "for table \"%s.%s\""
+msgstr "for table \"%s.%s\""
+
+# describe.c:937
+#: describe.c:2332
+#, c-format
+msgid ", predicate (%s)"
+msgstr ", predicate (%s)"
+
+# describe.c:940
+#: describe.c:2335
+msgid ", clustered"
+msgstr ", clustered"
+
+#: describe.c:2338
+msgid ", invalid"
+msgstr ", invalid"
+
+#: describe.c:2341
+msgid ", deferrable"
+msgstr ", deferrable"
+
+#: describe.c:2344
+msgid ", initially deferred"
+msgstr ", initially deferred"
+
+#: describe.c:2347
+msgid ", replica identity"
+msgstr ", replica identity"
+
+# describe.c:1138
+#: describe.c:2401
+msgid "Indexes:"
+msgstr "索引:"
+
+# describe.c:1174
+#: describe.c:2484
+msgid "Check constraints:"
+msgstr "檢查è¦å‰‡:"
+
+# describe.c:1189
+#: describe.c:2552
+msgid "Foreign-key constraints:"
+msgstr "外éµæª¢æŸ¥è¦å‰‡:"
+
+#: describe.c:2615
+msgid "Referenced by:"
+msgstr "åƒè€ƒè€…:"
+
+#: describe.c:2665
+msgid "Policies:"
+msgstr "政策:"
+
+#: describe.c:2668
+msgid "Policies (forced row security enabled):"
+msgstr "政策(強制列安全性已啟動):"
+
+#: describe.c:2671
+msgid "Policies (row security enabled): (none)"
+msgstr "政策(列安全性已啟動): (none)"
+
+#: describe.c:2674
+msgid "Policies (forced row security enabled): (none)"
+msgstr "政策(強制列安全性已啟動): (none)"
+
+#: describe.c:2677
+msgid "Policies (row security disabled):"
+msgstr "政策(列安全性已關閉):"
+
+# utils/misc/guc.c:279
+#: describe.c:2737 describe.c:2841
+msgid "Statistics objects:"
+msgstr "統計物件:"
+
+# describe.c:983
+# describe.c:1204
+#: describe.c:2943 describe.c:3096
+msgid "Rules:"
+msgstr "è¦å‰‡:"
+
+#: describe.c:2946
+msgid "Disabled rules:"
+msgstr "å·²åœç”¨è¦å‰‡:"
+
+#: describe.c:2949
+msgid "Rules firing always:"
+msgstr "æ°¸é è§¸ç™¼çš„è¦å‰‡:"
+
+#: describe.c:2952
+msgid "Rules firing on replica only:"
+msgstr "åªåœ¨è¤‡æœ¬è§¸ç™¼çš„è¦å‰‡:"
+
+# describe.c:1636
+#: describe.c:3031 describe.c:5109
+msgid "Publications:"
+msgstr "發布:"
+
+# describe.c:977
+#: describe.c:3079
+msgid "View definition:"
+msgstr "檢視表定義:"
+
+# describe.c:1223
+#: describe.c:3242
+msgid "Triggers:"
+msgstr "觸發器:"
+
+#: describe.c:3245
+msgid "Disabled user triggers:"
+msgstr "åœç”¨çš„使用者觸發器:"
+
+#: describe.c:3248
+msgid "Disabled internal triggers:"
+msgstr "åœç”¨çš„內部觸發器:"
+
+#: describe.c:3251
+msgid "Triggers firing always:"
+msgstr "æ°¸é è§¸ç™¼çš„觸發器:"
+
+#: describe.c:3254
+msgid "Triggers firing on replica only:"
+msgstr "åªåœ¨è¤‡æœ¬è§¸ç™¼çš„觸發器:"
+
+# postmaster/postmaster.c:2120 postmaster/postmaster.c:2130
+#: describe.c:3325
+#, c-format
+msgid "Server: %s"
+msgstr "伺æœå™¨: %s"
+
+#: describe.c:3333
+#, c-format
+msgid "FDW options: (%s)"
+msgstr "FDW é¸é …: (%s)"
+
+# describe.c:1245
+#: describe.c:3354
+msgid "Inherits"
+msgstr "繼承"
+
+# utils/adt/array_userfuncs.c:358 utils/adt/arrayfuncs.c:1149
+# utils/adt/arrayfuncs.c:2417
+#: describe.c:3419
+#, c-format
+msgid "Number of partitions: %d"
+msgstr "分割數é‡: %d"
+
+#: describe.c:3428
+#, c-format
+msgid "Number of partitions: %d (Use \\d+ to list them.)"
+msgstr "分割數é‡: %d (用 \\d+ 列舉。)"
+
+#: describe.c:3430
+#, c-format
+msgid "Number of child tables: %d (Use \\d+ to list them.)"
+msgstr "å­è³‡æ–™è¡¨æ•¸é‡: %d (用 \\d+ 列舉。)"
+
+#: describe.c:3437
+msgid "Child tables"
+msgstr "å­è³‡æ–™è¡¨"
+
+# describe.c:498
+#: describe.c:3437
+msgid "Partitions"
+msgstr "分割"
+
+#: describe.c:3470
+#, c-format
+msgid "Typed table of type: %s"
+msgstr ""
+
+# describe.c:1636
+#: describe.c:3486
+msgid "Replica Identity"
+msgstr ""
+
+# describe.c:1259
+#: describe.c:3499
+msgid "Has OIDs: yes"
+msgstr "有 OID: yes"
+
+#: describe.c:3508
+#, c-format
+msgid "Access method: %s"
+msgstr "å­˜å–æ–¹å¼: %s"
+
+# describe.c:1342
+#: describe.c:3585
+#, c-format
+msgid "Tablespace: \"%s\""
+msgstr "表空間: \"%s\""
+
+# describe.c:1342
+#. translator: before this string there's an index description like
+#. '"foo_pkey" PRIMARY KEY, btree (a)'
+#: describe.c:3597
+#, c-format
+msgid ", tablespace \"%s\""
+msgstr ", 表空間 \"%s\""
+
+# describe.c:1431
+#: describe.c:3670
+msgid "List of roles"
+msgstr "角色清單"
+
+# describe.c:1375
+#: describe.c:3672 describe.c:3841
+msgid "Role name"
+msgstr "角色å稱"
+
+#: describe.c:3673
+msgid "Attributes"
+msgstr "屬性"
+
+# describe.c:1377
+#: describe.c:3684
+msgid "Superuser"
+msgstr "超級用戶"
+
+#: describe.c:3687
+msgid "No inheritance"
+msgstr "無繼承"
+
+#: describe.c:3690
+msgid "Create role"
+msgstr "建立角色"
+
+#: describe.c:3693
+msgid "Create DB"
+msgstr "建立資料庫"
+
+#: describe.c:3696
+msgid "Cannot login"
+msgstr "無法登入"
+
+# describe.c:1636
+#: describe.c:3699
+msgid "Replication"
+msgstr "複寫"
+
+#: describe.c:3703
+msgid "Bypass RLS"
+msgstr "忽略 RLS"
+
+# help.c:123
+#: describe.c:3712
+msgid "No connections"
+msgstr "無連線"
+
+# help.c:123
+#: describe.c:3714
+#, c-format
+msgid "%d connection"
+msgid_plural "%d connections"
+msgstr[0] "%d 連線"
+
+#: describe.c:3724
+msgid "Password valid until "
+msgstr "密碼有效期至 "
+
+# describe.c:1375
+#: describe.c:3775
+msgid "Role"
+msgstr "角色"
+
+# catalog/dependency.c:1758
+#: describe.c:3776
+msgid "Database"
+msgstr "資料庫"
+
+#: describe.c:3777
+msgid "Settings"
+msgstr "設定"
+
+# describe.c:641
+#: describe.c:3801
+#, c-format
+msgid "Did not find any settings for role \"%s\" and database \"%s\"."
+msgstr "找ä¸åˆ°è§’色 \"%s\" 和資料庫 \"%s\" 的設定。"
+
+# describe.c:641
+#: describe.c:3804
+#, c-format
+msgid "Did not find any settings for role \"%s\"."
+msgstr "找ä¸åˆ°è§’色 \"%s\" 的設定。"
+
+# describe.c:641
+#: describe.c:3807
+#, c-format
+msgid "Did not find any settings."
+msgstr "找ä¸åˆ°ä»»ä½•è¨­å®šã€‚"
+
+# describe.c:1549
+#: describe.c:3812
+msgid "List of settings"
+msgstr "設定清單"
+
+#: describe.c:3842
+msgid "Member of"
+msgstr "æˆå“¡å±¬æ–¼"
+
+#: describe.c:3859
+msgid "Grantor"
+msgstr ""
+
+# describe.c:1431
+#: describe.c:3886
+msgid "List of role grants"
+msgstr ""
+
+# describe.c:543
+# describe.c:1477
+#: describe.c:3952
+msgid "index"
+msgstr "索引"
+
+# describe.c:879
+#: describe.c:3954
+msgid "TOAST table"
+msgstr "TOAST 資料表"
+
+#: describe.c:3957 describe.c:4169
+msgid "partitioned index"
+msgstr "分割索引"
+
+#: describe.c:3977
+msgid "permanent"
+msgstr "永久"
+
+#: describe.c:3978
+msgid "temporary"
+msgstr "暫時"
+
+#: describe.c:3979
+msgid "unlogged"
+msgstr "無日誌"
+
+#: describe.c:3980
+msgid "Persistence"
+msgstr "永續性"
+
+#: describe.c:3996
+msgid "Access method"
+msgstr "å­˜å–æ–¹å¼"
+
+# describe.c:1549
+#: describe.c:4082
+msgid "List of relations"
+msgstr "é—œè¯æ¸…å–®"
+
+# describe.c:117
+#: describe.c:4130
+#, c-format
+msgid "The server (version %s) does not support declarative table partitioning."
+msgstr "伺æœå™¨(版本%s)ä¸æ”¯æ´è²æ˜Žå¼è³‡æ–™è¡¨åˆ†å‰²ã€‚"
+
+# describe.c:1549
+#: describe.c:4141
+msgid "List of partitioned indexes"
+msgstr "分割索引清單"
+
+# describe.c:1653
+#: describe.c:4143
+msgid "List of partitioned tables"
+msgstr "分割資料表清單"
+
+# describe.c:1549
+#: describe.c:4147
+msgid "List of partitioned relations"
+msgstr "分割關è¯æ¸…å–®"
+
+# describe.c:1375
+#: describe.c:4178
+msgid "Parent name"
+msgstr "所屬å稱"
+
+#: describe.c:4191
+msgid "Leaf partition size"
+msgstr ""
+
+#: describe.c:4194 describe.c:4200
+msgid "Total size"
+msgstr "總大å°"
+
+#: describe.c:4325
+msgid "Trusted"
+msgstr "信任的"
+
+# describe.c:257
+#: describe.c:4334
+msgid "Internal language"
+msgstr "內部語言"
+
+#: describe.c:4335
+msgid "Call handler"
+msgstr ""
+
+#: describe.c:4336 describe.c:5759
+msgid "Validator"
+msgstr "驗證程å¼"
+
+#: describe.c:4337
+msgid "Inline handler"
+msgstr ""
+
+# describe.c:1431
+#: describe.c:4372
+msgid "List of languages"
+msgstr "語言清單"
+
+#: describe.c:4413
+msgid "Check"
+msgstr "檢查"
+
+# describe.c:1602
+#: describe.c:4457
+msgid "List of domains"
+msgstr "Domain 清單"
+
+# describe.c:1635
+#: describe.c:4491
+msgid "Source"
+msgstr "來æº"
+
+# describe.c:1636
+#: describe.c:4492
+msgid "Destination"
+msgstr "目的"
+
+# describe.c:1639
+#: describe.c:4494 describe.c:6723
+msgid "Default?"
+msgstr "é è¨­ï¼Ÿ"
+
+# describe.c:1653
+#: describe.c:4536
+msgid "List of conversions"
+msgstr "編碼轉æ›æ¸…å–®"
+
+#: describe.c:4564
+msgid "Parameter"
+msgstr "åƒæ•¸"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:4565
+msgid "Value"
+msgstr "值"
+
+#: describe.c:4572
+msgid "Context"
+msgstr ""
+
+# sql_help.h:366
+#: describe.c:4605
+msgid "List of configuration parameters"
+msgstr "設定åƒæ•¸æ¸…å–®"
+
+# utils/misc/guc.c:3281 utils/misc/guc.c:3970 utils/misc/guc.c:4006
+# utils/misc/guc.c:4062 utils/misc/guc.c:4399 utils/misc/guc.c:4548
+#: describe.c:4607
+msgid "List of non-default configuration parameters"
+msgstr "éžé è¨­è¨­å®šåƒæ•¸æ¸…å–®"
+
+# describe.c:117
+#: describe.c:4634
+#, c-format
+msgid "The server (version %s) does not support event triggers."
+msgstr "伺æœå™¨(版本 %s)ä¸æ”¯æ´äº‹ä»¶è§¸ç™¼å™¨ã€‚"
+
+#: describe.c:4654
+msgid "Event"
+msgstr "事件"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:4656
+msgid "enabled"
+msgstr ""
+
+# describe.c:1636
+#: describe.c:4657
+msgid "replica"
+msgstr ""
+
+#: describe.c:4658
+msgid "always"
+msgstr ""
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:4659
+msgid "disabled"
+msgstr ""
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: describe.c:4660 describe.c:6575
+msgid "Enabled"
+msgstr ""
+
+#: describe.c:4662
+msgid "Tags"
+msgstr "標籤"
+
+# describe.c:1549
+#: describe.c:4686
+msgid "List of event triggers"
+msgstr "事件觸發器清單"
+
+# describe.c:117
+#: describe.c:4713
+#, c-format
+msgid "The server (version %s) does not support extended statistics."
+msgstr "伺æœå™¨(版本 %s)ä¸æ”¯æ´æ“´å±•çµ±è¨ˆè³‡æ–™ã€‚"
+
+#: describe.c:4750
+msgid "Ndistinct"
+msgstr ""
+
+#: describe.c:4751
+msgid "Dependencies"
+msgstr ""
+
+#: describe.c:4761
+msgid "MCV"
+msgstr ""
+
+# describe.c:1549
+#: describe.c:4785
+msgid "List of extended statistics"
+msgstr "擴展統計資料清單"
+
+# describe.c:1688
+#: describe.c:4812
+msgid "Source type"
+msgstr "來æºé¡žåž‹"
+
+# describe.c:1689
+#: describe.c:4813
+msgid "Target type"
+msgstr "目標類型"
+
+# describe.c:1693
+#: describe.c:4837
+msgid "in assignment"
+msgstr ""
+
+# describe.c:1695
+#: describe.c:4839
+msgid "Implicit?"
+msgstr "éš±å«çš„?"
+
+# describe.c:1703
+#: describe.c:4898
+msgid "List of casts"
+msgstr "轉型清單"
+
+#: describe.c:4938 describe.c:4942
+msgid "Provider"
+msgstr "æ供者"
+
+#: describe.c:4972 describe.c:4977
+msgid "Deterministic?"
+msgstr "確定性?"
+
+# describe.c:1549
+#: describe.c:5017
+msgid "List of collations"
+msgstr "定åºæ¸…å–®"
+
+# describe.c:1753
+#: describe.c:5079
+msgid "List of schemas"
+msgstr "Schema 清單"
+
+# describe.c:150
+#: describe.c:5196
+msgid "List of text search parsers"
+msgstr "文字æœå°‹è§£æžå™¨æ¸…å–®"
+
+# describe.c:641
+#: describe.c:5246
+#, c-format
+msgid "Did not find any text search parser named \"%s\"."
+msgstr "找ä¸åˆ°å為 \"%s\" 的文字æœå°‹è§£æžå™¨ã€‚"
+
+# describe.c:641
+#: describe.c:5249
+#, c-format
+msgid "Did not find any text search parsers."
+msgstr "找ä¸åˆ°ä»»ä½•æ–‡å­—æœå°‹è§£æžå™¨ã€‚"
+
+#: describe.c:5324
+msgid "Start parse"
+msgstr "開始解æž"
+
+#: describe.c:5325
+msgid "Method"
+msgstr "方法"
+
+#: describe.c:5329
+msgid "Get next token"
+msgstr "å–得下一個 token"
+
+#: describe.c:5331
+msgid "End parse"
+msgstr "çµæŸè§£æž"
+
+#: describe.c:5333
+msgid "Get headline"
+msgstr "å–得標題"
+
+#: describe.c:5335
+msgid "Get token types"
+msgstr "å–å¾— token é¡žåž‹"
+
+#: describe.c:5346
+#, c-format
+msgid "Text search parser \"%s.%s\""
+msgstr "文字æœå°‹è§£æžå™¨ \"%s.%s\""
+
+#: describe.c:5349
+#, c-format
+msgid "Text search parser \"%s\""
+msgstr "文字æœå°‹è§£æžå™¨ \"%s\""
+
+# describe.c:1375
+#: describe.c:5368
+msgid "Token name"
+msgstr "Token å稱"
+
+#: describe.c:5382
+#, c-format
+msgid "Token types for parser \"%s.%s\""
+msgstr "解æžå™¨ \"%s.%s\" çš„ token é¡žåž‹"
+
+#: describe.c:5385
+#, c-format
+msgid "Token types for parser \"%s\""
+msgstr "解æžå™¨ \"%s\" çš„ token é¡žåž‹"
+
+#: describe.c:5429
+msgid "Template"
+msgstr "模版"
+
+# help.c:88
+#: describe.c:5430
+msgid "Init options"
+msgstr "åˆå§‹é¸é …"
+
+# describe.c:1549
+#: describe.c:5457
+msgid "List of text search dictionaries"
+msgstr "文字æœå°‹å­—典清單"
+
+#: describe.c:5490
+msgid "Init"
+msgstr "åˆå§‹åŒ–"
+
+# describe.c:257
+#: describe.c:5491
+msgid "Lexize"
+msgstr ""
+
+# describe.c:1753
+#: describe.c:5523
+msgid "List of text search templates"
+msgstr "文字æœå°‹ç¯„本清單"
+
+# describe.c:97
+#: describe.c:5578
+msgid "List of text search configurations"
+msgstr "文字æœå°‹çµ„態清單"
+
+# describe.c:641
+#: describe.c:5629
+#, c-format
+msgid "Did not find any text search configuration named \"%s\"."
+msgstr "找ä¸åˆ°å為 \"%s\" 的文字æœå°‹çµ„態。"
+
+# describe.c:641
+#: describe.c:5632
+#, c-format
+msgid "Did not find any text search configurations."
+msgstr "找ä¸åˆ°ä»»ä½•æ–‡å­—æœå°‹çµ„態。"
+
+#: describe.c:5698
+msgid "Token"
+msgstr "Token"
+
+#: describe.c:5699
+msgid "Dictionaries"
+msgstr "å­—å…¸"
+
+#: describe.c:5710
+#, c-format
+msgid "Text search configuration \"%s.%s\""
+msgstr "文字æœå°‹çµ„æ…‹ \"%s.%s\""
+
+#: describe.c:5713
+#, c-format
+msgid "Text search configuration \"%s\""
+msgstr "文字æœå°‹çµ„æ…‹ \"%s\""
+
+# describe.c:859
+#: describe.c:5717
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s.%s\""
+msgstr ""
+"\n"
+"解æžå™¨: \"%s.%s\""
+
+# describe.c:1342
+#: describe.c:5720
+#, c-format
+msgid ""
+"\n"
+"Parser: \"%s\""
+msgstr ""
+"\n"
+"解æžå™¨: \"%s\""
+
+# describe.c:289
+#: describe.c:5801
+msgid "List of foreign-data wrappers"
+msgstr "外部資料å°è£ç¨‹å¼æ¸…å–®"
+
+#: describe.c:5829
+msgid "Foreign-data wrapper"
+msgstr "外部資料å°è£ç¨‹å¼"
+
+#: describe.c:5847 describe.c:6037
+msgid "Version"
+msgstr "版本"
+
+# describe.c:1653
+#: describe.c:5878
+msgid "List of foreign servers"
+msgstr "外部伺æœå™¨æ¸…å–®"
+
+# describe.c:1377
+#: describe.c:5903 describe.c:5962
+msgid "Server"
+msgstr "伺æœå™¨"
+
+#: describe.c:5904
+msgid "User name"
+msgstr "使用者å稱"
+
+# describe.c:1602
+#: describe.c:5934
+msgid "List of user mappings"
+msgstr "使用者映射清單"
+
+# describe.c:1653
+#: describe.c:6007
+msgid "List of foreign tables"
+msgstr "外部資料表清單"
+
+# describe.c:1653
+#: describe.c:6059
+msgid "List of installed extensions"
+msgstr "已安è£æ“´å……模組清單"
+
+# describe.c:641
+#: describe.c:6107
+#, c-format
+msgid "Did not find any extension named \"%s\"."
+msgstr "找ä¸åˆ°å為 \"%s\" 的擴充模組。"
+
+# describe.c:641
+#: describe.c:6110
+#, c-format
+msgid "Did not find any extensions."
+msgstr "找ä¸åˆ°ä»»ä½•æ“´å……模組。"
+
+# describe.c:593
+#: describe.c:6154
+msgid "Object description"
+msgstr "物件æè¿°"
+
+#: describe.c:6164
+#, c-format
+msgid "Objects in extension \"%s\""
+msgstr "擴充模組 \"%s\" 中的物件"
+
+# catalog/namespace.c:1201 gram.y:2516 gram.y:7422 parser/parse_expr.c:1183
+# parser/parse_target.c:734
+#: describe.c:6205
+#, c-format
+msgid "improper qualified name (too many dotted names): %s"
+msgstr "ä¸åˆé©çš„完整å稱(太多點號å稱): %s"
+
+# catalog/namespace.c:1195 parser/parse_expr.c:1157 parser/parse_target.c:725
+#: describe.c:6219
+#, c-format
+msgid "cross-database references are not implemented: %s"
+msgstr "尚未實作跨資料庫åƒè€ƒ: %s"
+
+# describe.c:117
+#: describe.c:6250 describe.c:6377
+#, c-format
+msgid "The server (version %s) does not support publications."
+msgstr "伺æœå™¨(版本 %s)ä¸æ”¯æ´ç™¼å¸ƒã€‚"
+
+#: describe.c:6267 describe.c:6455
+msgid "All tables"
+msgstr "所有資料表"
+
+#: describe.c:6268 describe.c:6456
+msgid "Inserts"
+msgstr "æ’å…¥"
+
+#: describe.c:6269 describe.c:6457
+msgid "Updates"
+msgstr "æ›´æ–°"
+
+#: describe.c:6270 describe.c:6458
+msgid "Deletes"
+msgstr "刪除"
+
+#: describe.c:6274 describe.c:6460
+msgid "Truncates"
+msgstr "清除"
+
+#: describe.c:6278 describe.c:6462
+msgid "Via root"
+msgstr "經由 root"
+
+# describe.c:1549
+#: describe.c:6300
+msgid "List of publications"
+msgstr "發布清單"
+
+# describe.c:641
+#: describe.c:6424
+#, c-format
+msgid "Did not find any publication named \"%s\"."
+msgstr "找ä¸åˆ°å為 \"%s\" 的發布。"
+
+# describe.c:641
+#: describe.c:6427
+#, c-format
+msgid "Did not find any publications."
+msgstr "找ä¸åˆ°ä»»ä½•ç™¼å¸ƒã€‚"
+
+# catalog/dependency.c:1791
+#: describe.c:6451
+#, c-format
+msgid "Publication %s"
+msgstr "發布 %s"
+
+# describe.c:1483
+#: describe.c:6504
+msgid "Tables:"
+msgstr "資料表:"
+
+# describe.c:1753
+#: describe.c:6516
+msgid "Tables from schemas:"
+msgstr ""
+
+# describe.c:117
+#: describe.c:6560
+#, c-format
+msgid "The server (version %s) does not support subscriptions."
+msgstr "伺æœå™¨(版本 %s)ä¸æ”¯æ´ä½¿ç”¨è€…映射。"
+
+# describe.c:1636
+#: describe.c:6576
+msgid "Publication"
+msgstr "發布"
+
+#: describe.c:6585
+msgid "Binary"
+msgstr ""
+
+#: describe.c:6594 describe.c:6598
+msgid "Streaming"
+msgstr "串æµ"
+
+#: describe.c:6606
+msgid "Two-phase commit"
+msgstr "兩階段æ交"
+
+#: describe.c:6607
+msgid "Disable on error"
+msgstr "錯誤時åœç”¨"
+
+#: describe.c:6614
+msgid "Origin"
+msgstr ""
+
+# command.c:915
+# command.c:939
+# startup.c:187
+# startup.c:205
+#: describe.c:6615
+msgid "Password required"
+msgstr "需è¦å¯†ç¢¼"
+
+#: describe.c:6616
+msgid "Run as owner?"
+msgstr "以æ“有者身分執行?"
+
+#: describe.c:6621
+msgid "Synchronous commit"
+msgstr "åŒæ­¥æ交"
+
+# help.c:123
+#: describe.c:6622
+msgid "Conninfo"
+msgstr ""
+
+#: describe.c:6628
+msgid "Skip LSN"
+msgstr "ç•¥éŽ LSN"
+
+# describe.c:221
+#: describe.c:6655
+msgid "List of subscriptions"
+msgstr "訂閱清單"
+
+#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001
+msgid "AM"
+msgstr ""
+
+# describe.c:322
+#: describe.c:6718
+msgid "Input type"
+msgstr "輸入類型"
+
+# describe.c:1635
+#: describe.c:6719
+msgid "Storage type"
+msgstr "儲存類型"
+
+# catalog/dependency.c:1592
+#: describe.c:6720
+msgid "Operator class"
+msgstr "æ“作符類別"
+
+# sql_help.h:269
+#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002
+msgid "Operator family"
+msgstr "æ“作符æ—群"
+
+# describe.c:336
+#: describe.c:6768
+msgid "List of operator classes"
+msgstr "æ“作符類別清單"
+
+#: describe.c:6815
+msgid "Applicable types"
+msgstr "é©ç”¨é¡žåž‹"
+
+# describe.c:336
+#: describe.c:6857
+msgid "List of operator families"
+msgstr "æ“作符æ—群清單"
+
+# describe.c:512
+#: describe.c:6908
+msgid "Operator"
+msgstr "æ“作符"
+
+#: describe.c:6909
+msgid "Strategy"
+msgstr "ç­–ç•¥"
+
+#: describe.c:6910
+msgid "ordering"
+msgstr "排åº"
+
+#: describe.c:6911
+msgid "search"
+msgstr "æœå°‹"
+
+#: describe.c:6912
+msgid "Purpose"
+msgstr "用途"
+
+#: describe.c:6917
+msgid "Sort opfamily"
+msgstr "æŽ’åº opfamily"
+
+# catalog/aclchk.c:1294
+#: describe.c:6956
+msgid "List of operators of operator families"
+msgstr "æ“作符æ—群æ“作符清單"
+
+# describe.c:322
+#: describe.c:7003
+msgid "Registered left type"
+msgstr "已註冊左å´åž‹åˆ¥"
+
+# describe.c:321
+#: describe.c:7004
+msgid "Registered right type"
+msgstr "已註冊å³å´åž‹åˆ¥"
+
+#: describe.c:7005
+msgid "Number"
+msgstr "編號"
+
+# catalog/aclchk.c:1294
+#: describe.c:7049
+msgid "List of support functions of operator families"
+msgstr "æ“作符æ—群支æ´å‡½æ•¸æ¸…å–®"
+
+#: describe.c:7080
+msgid "ID"
+msgstr "ID"
+
+# large_obj.c:264
+#: describe.c:7101
+msgid "Large objects"
+msgstr "大物件"
+
+# help.c:83
+#: help.c:75
+msgid ""
+"psql is the PostgreSQL interactive terminal.\n"
+"\n"
+msgstr ""
+"psql 是 PostgreSQL 互動å¼æ“作介é¢ã€‚\n"
+"\n"
+
+#: help.c:76 help.c:395 help.c:479 help.c:522
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+# help.c:86
+#: help.c:77
+msgid ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+msgstr ""
+" psql [OPTION]... [DBNAME [USERNAME]]\n"
+"\n"
+
+#: help.c:79
+msgid "General options:\n"
+msgstr "一般é¸é …:\n"
+
+# help.c:94
+#: help.c:84
+msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n"
+msgstr " -c, --command=COMMAND 執行單一命令(SQL 或內部命令)後çµæŸ\n"
+
+# help.c:93
+#: help.c:85
+#, c-format
+msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n"
+msgstr " -d, --dbname=DBNAME 指定連線資料庫å稱(é è¨­: \"%s\")\n"
+
+# help.c:95
+#: help.c:87
+msgid " -f, --file=FILENAME execute commands from file, then exit\n"
+msgstr " -f, --file=FILENAME 執行來自檔案的指令然後çµæŸ\n"
+
+# help.c:96
+#: help.c:88
+msgid " -l, --list list available databases, then exit\n"
+msgstr " -l, --list 列出å¯ç”¨çš„資料庫然後çµæŸ\n"
+
+# help.c:97
+#: help.c:89
+msgid ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" set psql variable NAME to VALUE\n"
+" (e.g., -v ON_ERROR_STOP=1)\n"
+msgstr ""
+" -v, --set=, --variable=NAME=VALUE\n"
+" 設定 psql 變數 NAME 為 VALUE\n"
+" (例如 -v ON_ERROR_STOP=1)\n"
+
+#: help.c:92
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後çµæŸ\n"
+
+# help.c:98
+#: help.c:93
+msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n"
+msgstr " -X, --no-psqlrc ä¸è¦è®€å–啟動檔(~/.psqlrc)\n"
+
+#: help.c:94
+msgid ""
+" -1 (\"one\"), --single-transaction\n"
+" execute as a single transaction (if non-interactive)\n"
+msgstr ""
+" -1 (\"one\"), --single-transaction\n"
+" 以單一交易執行(若為éžäº’動模å¼)\n"
+
+#: help.c:96
+msgid " -?, --help[=options] show this help, then exit\n"
+msgstr " -?, --help[=options] 顯示說明,然後çµæŸ\n"
+
+#: help.c:97
+msgid " --help=commands list backslash commands, then exit\n"
+msgstr " --help=commands 列出å斜線命令然後çµæŸ\n"
+
+# help.c:96
+#: help.c:98
+msgid " --help=variables list special variables, then exit\n"
+msgstr " --help=variables 列出特殊變數然後çµæŸ\n"
+
+# help.c:102
+#: help.c:100
+msgid ""
+"\n"
+"Input and output options:\n"
+msgstr ""
+"\n"
+"輸入和輸出é¸é …:\n"
+
+# help.c:103
+#: help.c:101
+msgid " -a, --echo-all echo all input from script\n"
+msgstr " -a, --echo-all 顯示來自腳本的所有輸入\n"
+
+# help.c:104
+#: help.c:102
+msgid " -b, --echo-errors echo failed commands\n"
+msgstr " -b, --echo-errors 顯示失敗的命令\n"
+
+# help.c:104
+#: help.c:103
+msgid " -e, --echo-queries echo commands sent to server\n"
+msgstr " -e, --echo-queries 顯示傳é€è‡³ä¼ºæœå™¨çš„命令\n"
+
+# help.c:105
+#: help.c:104
+msgid " -E, --echo-hidden display queries that internal commands generate\n"
+msgstr " -E, --echo-hidden 顯示內部命令產生的查詢\n"
+
+# help.c:107
+#: help.c:105
+msgid " -L, --log-file=FILENAME send session log to file\n"
+msgstr " -L, --log-file=FILENAME 將工作階段記錄存檔\n"
+
+# help.c:108
+#: help.c:106
+msgid " -n, --no-readline disable enhanced command line editing (readline)\n"
+msgstr " -n, --no-readline åœç”¨å‘½ä»¤åˆ—編輯(readline)\n"
+
+# help.c:107
+#: help.c:107
+msgid " -o, --output=FILENAME send query results to file (or |pipe)\n"
+msgstr " -o, --output=FILENAME 將查詢çµæžœå‚³é€è‡³æª”案(或 | 管é“)\n"
+
+# help.c:106
+#: help.c:108
+msgid " -q, --quiet run quietly (no messages, only query output)\n"
+msgstr " -q, --quiet éœé»˜åŸ·è¡Œ(無訊æ¯ï¼Œåƒ…查詢輸出)\n"
+
+# help.c:109
+#: help.c:109
+msgid " -s, --single-step single-step mode (confirm each query)\n"
+msgstr " -s, --single-step 單步模å¼(確èªæ¯å€‹æŸ¥è©¢)\n"
+
+# help.c:110
+#: help.c:110
+msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n"
+msgstr " -S, --single-line 單行模å¼(一行就是一個 SQL 命令)\n"
+
+# help.c:112
+#: help.c:112
+msgid ""
+"\n"
+"Output format options:\n"
+msgstr ""
+"\n"
+"輸出格å¼é¸é …:\n"
+
+# help.c:113
+#: help.c:113
+msgid " -A, --no-align unaligned table output mode\n"
+msgstr " -A, --no-align 使用éžå°é½Šè³‡æ–™è¡¨è¼¸å‡ºæ¨¡å¼\n"
+
+# help.c:234
+#: help.c:114
+msgid " --csv CSV (Comma-Separated Values) table output mode\n"
+msgstr " --csv CSV(逗號分隔值)表格輸出模å¼\n"
+
+# help.c:119
+#: help.c:115
+#, c-format
+msgid ""
+" -F, --field-separator=STRING\n"
+" field separator for unaligned output (default: \"%s\")\n"
+msgstr ""
+" -F, --field-separator=STRING\n"
+" éžå°é½Šè¼¸å‡ºçš„欄ä½åˆ†éš”符號(é è¨­: %s)\n"
+
+# help.c:114
+#: help.c:118
+msgid " -H, --html HTML table output mode\n"
+msgstr " -H, --html HTML 表格輸出模å¼\n"
+
+# help.c:118
+#: help.c:119
+msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n"
+msgstr " -P, --pset=VAR[=ARG] 將顯示é¸é … VAR 設為 ARG(åƒé–± \\pset 命令)\n"
+
+# help.c:121
+#: help.c:120
+msgid ""
+" -R, --record-separator=STRING\n"
+" record separator for unaligned output (default: newline)\n"
+msgstr ""
+" -R, --record-separator=STRING\n"
+" éžå°é½Šè¼¸å‡ºçš„記錄分隔符號(é è¨­: æ›è¡Œå­—å…ƒ)\n"
+
+# help.c:115
+#: help.c:122
+msgid " -t, --tuples-only print rows only\n"
+msgstr " -t, --tuples-only åªé¡¯ç¤ºè³‡æ–™\n"
+
+# help.c:116
+#: help.c:123
+msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n"
+msgstr " -T, --table-attr=TEXT 設定 HTML 表格標籤屬性 (例如: widthã€border)\n"
+
+# help.c:117
+#: help.c:124
+msgid " -x, --expanded turn on expanded table output\n"
+msgstr " -x, --expanded 啟動擴展表格輸出模å¼\n"
+
+# help.c:119
+#: help.c:125
+msgid ""
+" -z, --field-separator-zero\n"
+" set field separator for unaligned output to zero byte\n"
+msgstr ""
+" -z, --field-separator-zero\n"
+" å°‡éžå°é½Šè¼¸å‡ºçš„欄ä½åˆ†éš”符設定為 0 ä½å…ƒçµ„\n"
+
+# help.c:121
+#: help.c:127
+msgid ""
+" -0, --record-separator-zero\n"
+" set record separator for unaligned output to zero byte\n"
+msgstr ""
+" -0, --record-separator-zero\n"
+" å°‡éžå°é½Šè¼¸å‡ºçš„記錄分隔符設定為 0 ä½å…ƒçµ„\n"
+
+#: help.c:130
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"連線é¸é …:\n"
+
+# help.c:126
+#: help.c:133
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n"
+msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ– socket 目錄(é è¨­:\"%s\")\n"
+
+# help.c:127
+#: help.c:134
+msgid "local socket"
+msgstr "本機 socket"
+
+# help.c:130
+#: help.c:137
+#, c-format
+msgid " -p, --port=PORT database server port (default: \"%s\")\n"
+msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ (é è¨­: \"%s\")\n"
+
+# help.c:136
+#: help.c:140
+#, c-format
+msgid " -U, --username=USERNAME database user name (default: \"%s\")\n"
+msgstr " -U, --username=USERNAME 資料庫使用者(é è¨­: \"%s\")\n"
+
+#: help.c:142
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ä¸è©¢å•å¯†ç¢¼\n"
+
+#: help.c:143
+msgid " -W, --password force password prompt (should happen automatically)\n"
+msgstr " -W, --password è¦æ±‚輸入密碼(應該是自動的)\n"
+
+# help.c:140
+#: help.c:145
+msgid ""
+"\n"
+"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n"
+"commands) from within psql, or consult the psql section in the PostgreSQL\n"
+"documentation.\n"
+"\n"
+msgstr ""
+"\n"
+"若需更多資訊,請在 psql 輸入 \"\\?\"(內部命令)或 \"\\help\"(SQL 命令)\n"
+"或查閱 PostgreSQL 文件中的 psql 章節。\n"
+"\n"
+
+#: help.c:148
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "回報錯誤至 <%s>。\n"
+
+#: help.c:149
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網é : <%s>\n"
+
+# help.c:174
+#: help.c:191
+msgid "General\n"
+msgstr "一般\n"
+
+# help.c:228
+#: help.c:192
+msgid " \\bind [PARAM]... set query parameters\n"
+msgstr " \\bind [PARAM]... 設定查詢åƒæ•¸\n"
+
+# help.c:179
+#: help.c:193
+msgid " \\copyright show PostgreSQL usage and distribution terms\n"
+msgstr " \\copyright 顯示 PostgreSQL 的使用和發佈æ¢æ¬¾\n"
+
+#: help.c:194
+msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n"
+msgstr " \\crosstabview [COLUMNS] 執行查詢並以樞ç´åˆ†æžè¡¨é¡¯ç¤ºçµæžœ\n"
+
+#: help.c:195
+msgid " \\errverbose show most recent error message at maximum verbosity\n"
+msgstr " \\errverbose 以最大詳細程度顯示最近的錯誤訊æ¯\n"
+
+#: help.c:196
+msgid ""
+" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n"
+" \\g with no arguments is equivalent to a semicolon\n"
+msgstr ""
+" \\g [(OPTIONS)] [FILE] 執行查詢(並將çµæžœç™¼é€åˆ°æª”案或 | 管é“)ï¼›\n"
+" \\g 若無åƒæ•¸ç­‰åŒæ–¼åˆ†è™Ÿ\n"
+
+#: help.c:198
+msgid " \\gdesc describe result of query, without executing it\n"
+msgstr " \\gdesc æ述查詢的çµæžœï¼Œä½†ä¸åŸ·è¡Œè©²æŸ¥è©¢\n"
+
+#: help.c:199
+msgid " \\gexec execute query, then execute each value in its result\n"
+msgstr " \\gexec 執行查詢,然後執行çµæžœä¸­çš„æ¯å€‹å€¼\n"
+
+# help.c:194
+#: help.c:200
+msgid " \\gset [PREFIX] execute query and store result in psql variables\n"
+msgstr " \\gset [PREFIX] 執行查詢並將çµæžœå­˜å„²åœ¨ psql 變數中\n"
+
+#: help.c:201
+msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"
+msgstr " \\gx [(OPTIONS)] [FILE] 與 \\g 相åŒï¼Œä½†å¼·åˆ¶ä½¿ç”¨æ“´å±•è¼¸å‡ºæ¨¡å¼\n"
+
+# help.c:183
+#: help.c:202
+msgid " \\q quit psql\n"
+msgstr " \\q çµæŸ psql\n"
+
+#: help.c:203
+msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"
+msgstr " \\watch [[i=]SEC] [c=N] æ¯éš” SEC 秒執行查詢,最多執行 N 次\n"
+
+#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306
+#: help.c:326 help.c:339 help.c:348
+msgid "\n"
+msgstr ""
+
+#: help.c:206
+msgid "Help\n"
+msgstr "說明\n"
+
+#: help.c:208
+msgid " \\? [commands] show help on backslash commands\n"
+msgstr " \\? [commands] 顯示å斜線命令的說明\n"
+
+#: help.c:209
+msgid " \\? options show help on psql command-line options\n"
+msgstr " \\? options 顯示 psql 命令列é¸é …的說明\n"
+
+#: help.c:210
+msgid " \\? variables show help on special variables\n"
+msgstr " \\? variables 顯示特殊變數的說明\n"
+
+# help.c:182
+#: help.c:211
+msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n"
+msgstr " \\h [NAME] 顯示 SQL 命令語法的說明,用 * 代表所有命令\n"
+
+# help.c:192
+#: help.c:214
+msgid "Query Buffer\n"
+msgstr "查詢暫存å€\n"
+
+# help.c:193
+#: help.c:215
+msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n"
+msgstr " \\e [FILE] [LINE] 使用外部編輯器編輯查詢暫存å€(或檔案)\n"
+
+# help.c:193
+#: help.c:216
+msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n"
+msgstr " \\ef [FUNCNAME [LINE]] 使用外部編輯器編輯函數定義\n"
+
+# help.c:193
+#: help.c:217
+msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n"
+msgstr " \\ev [VIEWNAME [LINE]] 使用外部編輯器編輯檢視表定義\n"
+
+# help.c:195
+#: help.c:218
+msgid " \\p show the contents of the query buffer\n"
+msgstr " \\p 顯示查詢暫存å€çš„內容\n"
+
+# help.c:196
+#: help.c:219
+msgid " \\r reset (clear) the query buffer\n"
+msgstr " \\r é‡è¨­(清空)查詢暫存å€\n"
+
+# help.c:198
+#: help.c:221
+msgid " \\s [FILE] display history or save it to file\n"
+msgstr " \\s [FILE] 顯示歷å²è¨˜éŒ„或存入檔案\n"
+
+# help.c:200
+#: help.c:223
+msgid " \\w FILE write query buffer to file\n"
+msgstr " \\w FILE 將查詢暫存å€å¯«å…¥æª”案\n"
+
+# help.c:203
+#: help.c:226
+msgid "Input/Output\n"
+msgstr "輸入/輸出\n"
+
+# help.c:251
+#: help.c:227
+msgid " \\copy ... perform SQL COPY with data stream to the client host\n"
+msgstr " \\copy ... 用 SQL çš„ COPY 並將資料æµå‚³é€è‡³ç”¨æˆ¶ç«¯\n"
+
+# help.c:204
+#: help.c:228
+msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n"
+msgstr " \\echo [-n] [STRING] 將字串寫入標準輸出(-n 表示ä¸æ›è¡Œ)\n"
+
+# help.c:205
+#: help.c:229
+msgid " \\i FILE execute commands from file\n"
+msgstr " \\i FILE 執行來自檔案的命令\n"
+
+# help.c:206
+#: help.c:230
+msgid " \\ir FILE as \\i, but relative to location of current script\n"
+msgstr " \\ir FILE 與 \\i 類似,但相å°æ–¼ç›®å‰è…³æœ¬çš„ä½ç½®\n"
+
+# help.c:206
+#: help.c:231
+msgid " \\o [FILE] send all query results to file or |pipe\n"
+msgstr " \\o [FILE] 將所有查詢çµæžœå‚³é€è‡³æª”案或 | 管é“\n"
+
+# help.c:207
+#: help.c:232
+msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n"
+msgstr " \\qecho [-n] [STRING] 將字串寫入 \\o 輸出æµ(-n 表示ä¸æ›è¡Œ)\n"
+
+# help.c:204
+#: help.c:233
+msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n"
+msgstr " \\warn [-n] [STRING] 將字串寫入標準錯誤輸出(-n 表示ä¸æ›è¡Œ)\n"
+
+# help.c:123
+#: help.c:236
+msgid "Conditional\n"
+msgstr "æ¢ä»¶å¼\n"
+
+# help.c:205
+#: help.c:237
+msgid " \\if EXPR begin conditional block\n"
+msgstr " \\if EXPR 開始æ¢ä»¶å€å¡Š\n"
+
+#: help.c:238
+msgid " \\elif EXPR alternative within current conditional block\n"
+msgstr " \\elif EXPR ç¾æœ‰æ¢ä»¶å€å¡Šä¸­çš„替代é¸é …\n"
+
+#: help.c:239
+msgid " \\else final alternative within current conditional block\n"
+msgstr " \\else ç¾æœ‰æ¢ä»¶å€å¡Šä¸­çš„最終替代é¸é …\n"
+
+# help.c:183
+#: help.c:240
+msgid " \\endif end conditional block\n"
+msgstr " \\endif çµæŸæ¢ä»¶å€å¡Š\n"
+
+# help.c:211
+#: help.c:243
+msgid "Informational\n"
+msgstr "資訊性\n"
+
+#: help.c:244
+msgid " (options: S = show system objects, + = additional detail)\n"
+msgstr " (é¸é …: S = 顯示系統物件,+ = é¡å¤–資訊)\n"
+
+# help.c:226
+#: help.c:245
+msgid " \\d[S+] list tables, views, and sequences\n"
+msgstr " \\d[S+] 列出資料表ã€æª¢è¦–表ã€åºåˆ—\n"
+
+# help.c:212
+#: help.c:246
+msgid " \\d[S+] NAME describe table, view, sequence, or index\n"
+msgstr " \\d[S+] NAME æ述資料表ã€æª¢è¦–表ã€åºåˆ—ã€ç´¢å¼•\n"
+
+# help.c:215
+#: help.c:247
+msgid " \\da[S] [PATTERN] list aggregates\n"
+msgstr " \\da[S] [PATTERN] 列出èšåˆå‡½æ•¸\n"
+
+# help.c:228
+#: help.c:248
+msgid " \\dA[+] [PATTERN] list access methods\n"
+msgstr " \\dA[+] [PATTERN] 列出存å–æ–¹å¼\n"
+
+# help.c:224
+#: help.c:249
+msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n"
+msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 列出é‹ç®—符類別\n"
+
+# help.c:224
+#: help.c:250
+msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n"
+msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 列出é‹ç®—符æ—群\n"
+
+# help.c:224
+#: help.c:251
+msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n"
+msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 列出é‹ç®—符æ—群的é‹ç®—符\n"
+
+#: help.c:252
+msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n"
+msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 列出é‹ç®—符æ—群的支æ´å‡½æ•¸\n"
+
+# help.c:228
+#: help.c:253
+msgid " \\db[+] [PATTERN] list tablespaces\n"
+msgstr " \\db[+] [PATTERN] 列出表空間\n"
+
+# help.c:217
+#: help.c:254
+msgid " \\dc[S+] [PATTERN] list conversions\n"
+msgstr " \\dc[S+] [PATTERN] 列出編碼轉æ›\n"
+
+# help.c:221
+#: help.c:255
+msgid " \\dconfig[+] [PATTERN] list configuration parameters\n"
+msgstr " \\dconfig[+] [PATTERN] 列出組態åƒæ•¸\n"
+
+# help.c:218
+#: help.c:256
+msgid " \\dC[+] [PATTERN] list casts\n"
+msgstr " \\dC[+] [PATTERN] 列出轉型\n"
+
+# help.c:219
+#: help.c:257
+msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n"
+msgstr " \\dd[S] [PATTERN] 顯示其他地方未顯示的物件æè¿°\n"
+
+# help.c:220
+#: help.c:258
+msgid " \\dD[S+] [PATTERN] list domains\n"
+msgstr " \\dD[S+] [PATTERN] 列出 domain\n"
+
+# help.c:218
+#: help.c:259
+msgid " \\ddp [PATTERN] list default privileges\n"
+msgstr " \\ddp [PATTERN] 列出é è¨­æ¬Šé™\n"
+
+# help.c:228
+#: help.c:260
+msgid " \\dE[S+] [PATTERN] list foreign tables\n"
+msgstr " \\dE[S+] [PATTERN] 列出外部資料表\n"
+
+# help.c:228
+#: help.c:261
+msgid " \\des[+] [PATTERN] list foreign servers\n"
+msgstr " \\des[+] [PATTERN] 列出外部伺æœå™¨\n"
+
+# help.c:228
+#: help.c:262
+msgid " \\det[+] [PATTERN] list foreign tables\n"
+msgstr " \\det[+] [PATTERN] 列出外部資料表\n"
+
+# help.c:228
+#: help.c:263
+msgid " \\deu[+] [PATTERN] list user mappings\n"
+msgstr " \\deu[+] [PATTERN] 列出使用者映射\n"
+
+# help.c:222
+#: help.c:264
+msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n"
+msgstr " \\dew[+] [PATTERN] 列出外部資料å°è£ç¨‹å¼\n"
+
+# help.c:215
+#: help.c:265
+msgid ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" list [only agg/normal/procedure/trigger/window] functions\n"
+msgstr ""
+" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n"
+" 列出[僅èšåˆå‡½æ•¸/一般函數/程åº/觸發器/視窗]函数\n"
+
+# help.c:221
+#: help.c:267
+msgid " \\dF[+] [PATTERN] list text search configurations\n"
+msgstr " \\dF[+] [PATTERN] 列出文字æœå°‹çµ„æ…‹\n"
+
+# help.c:228
+#: help.c:268
+msgid " \\dFd[+] [PATTERN] list text search dictionaries\n"
+msgstr " \\dFd[+] [PATTERN] 列出文字æœå°‹å­—å…¸\n"
+
+# help.c:228
+#: help.c:269
+msgid " \\dFp[+] [PATTERN] list text search parsers\n"
+msgstr " \\dFp[+] [PATTERN] 列出文字æœå°‹è§£æžå™¨\n"
+
+# help.c:228
+#: help.c:270
+msgid " \\dFt[+] [PATTERN] list text search templates\n"
+msgstr " \\dFt[+] [PATTERN] 列出文字æœå°‹ç¯„本\n"
+
+# help.c:222
+#: help.c:271
+msgid " \\dg[S+] [PATTERN] list roles\n"
+msgstr " \\dg[S+] [PATTERN] 列出角色\n"
+
+# help.c:220
+#: help.c:272
+msgid " \\di[S+] [PATTERN] list indexes\n"
+msgstr " \\di[S+] [PATTERN] 列出索引\n"
+
+# help.c:225
+#: help.c:273
+msgid " \\dl[+] list large objects, same as \\lo_list\n"
+msgstr " \\dl[+] åˆ—å‡ºå¤§ç‰©ä»¶ï¼ŒåŒ \\lo_list\n"
+
+# help.c:228
+#: help.c:274
+msgid " \\dL[S+] [PATTERN] list procedural languages\n"
+msgstr " \\dL[S+] [PATTERN] 列出程åºèªžè¨€\n"
+
+# help.c:228
+#: help.c:275
+msgid " \\dm[S+] [PATTERN] list materialized views\n"
+msgstr " \\dm[S+] [PATTERN] 列出實體化檢視表\n"
+
+# help.c:228
+#: help.c:276
+msgid " \\dn[S+] [PATTERN] list schemas\n"
+msgstr " \\dn[S+] [PATTERN] 列出 schema\n"
+
+# help.c:224
+#: help.c:277
+msgid ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" list operators\n"
+msgstr ""
+" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n"
+" 列出é‹ç®—符\n"
+
+# help.c:220
+#: help.c:279
+msgid " \\dO[S+] [PATTERN] list collations\n"
+msgstr " \\dO[S+] [PATTERN] 列出定åº\n"
+
+# help.c:226
+#: help.c:280
+msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"
+msgstr " \\dp[S] [PATTERN] 列出資料表ã€æª¢è¦–表ã€åºåˆ—çš„å­˜å–權é™\n"
+
+# help.c:228
+#: help.c:281
+msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"
+msgstr " \\dP[itn+] [PATTERN] 列出[僅索引/資料表]的分割關è¯[n=巢狀]\n"
+
+#: help.c:282
+msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"
+msgstr " \\drds [ROLEPTRN [DBPTRN]] 列出æ¯å€‹è³‡æ–™åº«çš„角色設定\n"
+
+# help.c:222
+#: help.c:283
+msgid " \\drg[S] [PATTERN] list role grants\n"
+msgstr " \\drg[S] [PATTERN] 列出角色授權\n"
+
+# help.c:220
+#: help.c:284
+msgid " \\dRp[+] [PATTERN] list replication publications\n"
+msgstr " \\dRp[+] [PATTERN] 列出複寫發布\n"
+
+# help.c:217
+#: help.c:285
+msgid " \\dRs[+] [PATTERN] list replication subscriptions\n"
+msgstr " \\dRs[+] [PATTERN] 列出複寫訂閱\n"
+
+# help.c:228
+#: help.c:286
+msgid " \\ds[S+] [PATTERN] list sequences\n"
+msgstr " \\ds[S+] [PATTERN] 列出åºåˆ—\n"
+
+# help.c:228
+#: help.c:287
+msgid " \\dt[S+] [PATTERN] list tables\n"
+msgstr " \\dt[S+] [PATTERN] 列出資料表\n"
+
+# help.c:220
+#: help.c:288
+msgid " \\dT[S+] [PATTERN] list data types\n"
+msgstr " \\dT[S+] [PATTERN] 列出資料型別\n"
+
+# help.c:228
+#: help.c:289
+msgid " \\du[S+] [PATTERN] list roles\n"
+msgstr " \\du[S+] [PATTERN] 列出角色\n"
+
+# help.c:228
+#: help.c:290
+msgid " \\dv[S+] [PATTERN] list views\n"
+msgstr " \\dv[S+] [PATTERN] 列出檢視表\n"
+
+# help.c:217
+#: help.c:291
+msgid " \\dx[+] [PATTERN] list extensions\n"
+msgstr " \\dx[+] [PATTERN] 列出擴充模組\n"
+
+# help.c:218
+#: help.c:292
+msgid " \\dX [PATTERN] list extended statistics\n"
+msgstr " \\dX [PATTERN] 列出擴展統計資料\n"
+
+# help.c:222
+#: help.c:293
+msgid " \\dy[+] [PATTERN] list event triggers\n"
+msgstr " \\dy[+] [PATTERN] 列出事件觸發器\n"
+
+# help.c:228
+#: help.c:294
+msgid " \\l[+] [PATTERN] list databases\n"
+msgstr " \\l[+] [PATTERN] 列出資料庫\n"
+
+# help.c:193
+#: help.c:295
+msgid " \\sf[+] FUNCNAME show a function's definition\n"
+msgstr " \\sf[+] FUNCNAME 顯示函數的定義\n"
+
+# help.c:193
+#: help.c:296
+msgid " \\sv[+] VIEWNAME show a view's definition\n"
+msgstr " \\sv[+] VIEWNAME 顯示檢視表的定義\n"
+
+# help.c:218
+#: help.c:297
+msgid " \\z[S] [PATTERN] same as \\dp\n"
+msgstr " \\z[S] [PATTERN] åŒ \\dp\n"
+
+# large_obj.c:264
+#: help.c:300
+msgid "Large Objects\n"
+msgstr "大物件\n"
+
+#: help.c:301
+msgid " \\lo_export LOBOID FILE write large object to file\n"
+msgstr " \\lo_export LOBOID FILE 將大物件寫入檔案\n"
+
+# help.c:205
+#: help.c:302
+msgid ""
+" \\lo_import FILE [COMMENT]\n"
+" read large object from file\n"
+msgstr ""
+" \\lo_import FILE [COMMENT]\n"
+" 從檔案讀å–大物件\n"
+
+#: help.c:304
+msgid " \\lo_list[+] list large objects\n"
+msgstr " \\lo_list[+] 列出大物件\n"
+
+#: help.c:305
+msgid " \\lo_unlink LOBOID delete a large object\n"
+msgstr " \\lo_unlink LOBOID 刪除大物件\n"
+
+# help.c:233
+#: help.c:308
+msgid "Formatting\n"
+msgstr "æ ¼å¼åŒ–\n"
+
+# help.c:234
+#: help.c:309
+msgid " \\a toggle between unaligned and aligned output mode\n"
+msgstr " \\a 切æ›å°é½Šå’Œéžå°é½Šçš„輸出模å¼\n"
+
+# help.c:235
+#: help.c:310
+msgid " \\C [STRING] set table title, or unset if none\n"
+msgstr " \\C [STRING] 設定表格標題,若無則å–消設定\n"
+
+# help.c:236
+#: help.c:311
+msgid " \\f [STRING] show or set field separator for unaligned query output\n"
+msgstr " \\f [STRING] 顯示或設定éžå°é½ŠæŸ¥è©¢è¼¸å‡ºçš„欄ä½åˆ†éš”符號\n"
+
+# help.c:237
+#: help.c:312
+#, c-format
+msgid " \\H toggle HTML output mode (currently %s)\n"
+msgstr " \\H åˆ‡æ› HTML 輸出模å¼(ç›®å‰æ˜¯ %s)\n"
+
+#: help.c:314
+msgid ""
+" \\pset [NAME [VALUE]] set table output option\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+msgstr ""
+" \\pset [NAME [VALUE]] 設定表格輸出é¸é …\n"
+" (border|columns|csv_fieldsep|expanded|fieldsep|\n"
+" fieldsep_zero|footer|format|linestyle|null|\n"
+" numericlocale|pager|pager_min_lines|recordsep|\n"
+" recordsep_zero|tableattr|title|tuples_only|\n"
+" unicode_border_linestyle|unicode_column_linestyle|\n"
+" unicode_header_linestyle)\n"
+
+# help.c:243
+#: help.c:321
+#, c-format
+msgid " \\t [on|off] show only rows (currently %s)\n"
+msgstr " \\t [on|off] åªé¡¯ç¤ºè³‡æ–™(ç›®å‰æ˜¯ %s)\n"
+
+# help.c:245
+#: help.c:323
+msgid " \\T [STRING] set HTML <table> tag attributes, or unset if none\n"
+msgstr " \\T [STRING] 設定 HTML <table> 標籤屬性,若無則å–消設定\n"
+
+# help.c:246
+#: help.c:324
+#, c-format
+msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n"
+msgstr " \\x [on|off|auto] 切æ›æ“´å±•è¼¸å‡ºæ¨¡å¼(ç›®å‰æ˜¯ %s)\n"
+
+#: help.c:325
+msgid "auto"
+msgstr "auto"
+
+# help.c:123
+#: help.c:328
+msgid "Connection\n"
+msgstr "連線\n"
+
+# help.c:175
+#: help.c:330
+#, c-format
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently \"%s\")\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 連線至新的資料庫(ç›®å‰æ˜¯ \"%s\")\n"
+
+# help.c:175
+#: help.c:334
+msgid ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" connect to new database (currently no connection)\n"
+msgstr ""
+" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n"
+" 連線至新的資料庫(ç›®å‰æ²’有連線)\n"
+
+#: help.c:336
+msgid " \\conninfo display information about current connection\n"
+msgstr " \\conninfo 顯示目å‰é€£ç·šè³‡è¨Š\n"
+
+# help.c:180
+#: help.c:337
+msgid " \\encoding [ENCODING] show or set client encoding\n"
+msgstr " \\encoding [ENCODING] 顯示或設定用戶端編碼\n"
+
+#: help.c:338
+msgid " \\password [USERNAME] securely change the password for a user\n"
+msgstr " \\password [USERNAME] 安全地變更使用者密碼\n"
+
+# utils/error/elog.c:1873
+#: help.c:341
+msgid "Operating System\n"
+msgstr "作業系統\n"
+
+# help.c:178
+#: help.c:342
+msgid " \\cd [DIR] change the current working directory\n"
+msgstr " \\cd [DIR] 變更目å‰çš„工作目錄\n"
+
+#: help.c:343
+msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n"
+msgstr " \\getenv PSQLVAR ENVVAR å–得環境變數\n"
+
+# help.c:188
+#: help.c:344
+msgid " \\setenv NAME [VALUE] set or unset environment variable\n"
+msgstr " \\setenv NAME [VALUE] 設定或å–消環境變數\n"
+
+# help.c:186
+#: help.c:345
+#, c-format
+msgid " \\timing [on|off] toggle timing of commands (currently %s)\n"
+msgstr " \\timing [on|off] 切æ›æŒ‡ä»¤è¨ˆæ™‚功能(ç›®å‰æ˜¯ %s)\n"
+
+# help.c:189
+#: help.c:347
+msgid " \\! [COMMAND] execute command in shell or start interactive shell\n"
+msgstr " \\! [COMMAND] 用 shell åŸ·è¡Œå‘½ä»¤æˆ–å•Ÿå‹•äº’å‹•å¼ shell\n"
+
+#: help.c:350
+msgid "Variables\n"
+msgstr "變數\n"
+
+# help.c:188
+#: help.c:351
+msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n"
+msgstr " \\prompt [TEXT] NAME æ示使用者設定內部變數\n"
+
+# help.c:184
+#: help.c:352
+msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"
+msgstr " \\set [NAME [VALUE]] 設定內部變數,如果沒有åƒæ•¸å‰‡åˆ—出所有內部變數\n"
+
+# help.c:188
+#: help.c:353
+msgid " \\unset NAME unset (delete) internal variable\n"
+msgstr " \\unset NAME å–消(刪除)內部變數\n"
+
+#: help.c:392
+msgid ""
+"List of specially treated variables\n"
+"\n"
+msgstr ""
+"特別變數清單\n"
+"\n"
+
+#: help.c:394
+msgid "psql variables:\n"
+msgstr "psql 變數:\n"
+
+#: help.c:396
+msgid ""
+" psql --set=NAME=VALUE\n"
+" or \\set NAME VALUE inside psql\n"
+"\n"
+msgstr ""
+" psql --set=NAME=VALUE\n"
+" 或在 pgsql 中 \\set NAME VALUE\n"
+"\n"
+
+#: help.c:398
+msgid ""
+" AUTOCOMMIT\n"
+" if set, successful SQL commands are automatically committed\n"
+msgstr ""
+" AUTOCOMMIT\n"
+" 如果設定,æˆåŠŸçš„ SQL 命令將自動æ交\n"
+
+#: help.c:400
+msgid ""
+" COMP_KEYWORD_CASE\n"
+" determines the case used to complete SQL key words\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+msgstr ""
+" COMP_KEYWORD_CASE\n"
+" 決定完æˆSQLé—œéµå­—時使用的大å°å¯«\n"
+" [lower, upper, preserve-lower, preserve-upper]\n"
+
+#: help.c:403
+msgid ""
+" DBNAME\n"
+" the currently connected database name\n"
+msgstr ""
+" DBNAME\n"
+" ç›®å‰é€£ç·šçš„資料庫å稱\n"
+
+#: help.c:405
+msgid ""
+" ECHO\n"
+" controls what input is written to standard output\n"
+" [all, errors, none, queries]\n"
+msgstr ""
+" ECHO\n"
+" 控制寫入標準輸出的輸入內容\n"
+" [all, errors, none, queries]\n"
+
+#: help.c:408
+msgid ""
+" ECHO_HIDDEN\n"
+" if set, display internal queries executed by backslash commands;\n"
+" if set to \"noexec\", just show them without execution\n"
+msgstr ""
+" ECHO_HIDDEN\n"
+" 若設定,顯示由å斜線指令執行的內部查詢;\n"
+" 若設定為 \"noexec\",僅顯示而ä¸åŸ·è¡Œ\n"
+
+# utils/misc/guc.c:1432
+#: help.c:411
+msgid ""
+" ENCODING\n"
+" current client character set encoding\n"
+msgstr ""
+" ENCODING\n"
+" ç›®å‰å®¢æˆ¶ç«¯å­—元集編碼\n"
+
+#: help.c:413
+msgid ""
+" ERROR\n"
+" \"true\" if last query failed, else \"false\"\n"
+msgstr ""
+" ERROR\n"
+" 若上一次查詢失敗,則為 \"true\",å¦å‰‡ç‚º \"false\"\n"
+
+#: help.c:415
+msgid ""
+" FETCH_COUNT\n"
+" the number of result rows to fetch and display at a time (0 = unlimited)\n"
+msgstr ""
+" FETCH_COUNT\n"
+" æ¯æ¬¡æ“·å–和顯示的çµæžœåˆ—數(0 = ç„¡é™åˆ¶)\n"
+
+#: help.c:417
+msgid ""
+" HIDE_TABLEAM\n"
+" if set, table access methods are not displayed\n"
+msgstr ""
+" HIDE_TABLEAM\n"
+" 若設定,則ä¸é¡¯ç¤ºè³‡æ–™è¡¨å­˜å–æ–¹å¼\n"
+
+#: help.c:419
+msgid ""
+" HIDE_TOAST_COMPRESSION\n"
+" if set, compression methods are not displayed\n"
+msgstr ""
+" HIDE_TOAST_COMPRESSION\n"
+" 若設定,則ä¸é¡¯ç¤ºå£“縮方法\n"
+
+#: help.c:421
+msgid ""
+" HISTCONTROL\n"
+" controls command history [ignorespace, ignoredups, ignoreboth]\n"
+msgstr ""
+" HISTCONTROL\n"
+" 控制指令歷å²ç´€éŒ„ [ignorespace, ignoredups, ignoreboth]\n"
+
+#: help.c:423
+msgid ""
+" HISTFILE\n"
+" file name used to store the command history\n"
+msgstr ""
+" HISTFILE\n"
+" 用於儲存指令歷å²ç´€éŒ„的檔案å稱\n"
+
+#: help.c:425
+msgid ""
+" HISTSIZE\n"
+" maximum number of commands to store in the command history\n"
+msgstr ""
+" HISTSIZE\n"
+" 儲存在指令歷å²ç´€éŒ„中的最大指令數é‡\n"
+
+# common.c:636
+# common.c:871
+#: help.c:427
+msgid ""
+" HOST\n"
+" the currently connected database server host\n"
+msgstr ""
+" HOST\n"
+" ç›®å‰é€£ç·šçš„資料庫伺æœå™¨ä¸»æ©Ÿ\n"
+
+#: help.c:429
+msgid ""
+" IGNOREEOF\n"
+" number of EOFs needed to terminate an interactive session\n"
+msgstr ""
+" IGNOREEOF\n"
+" çµæŸäº’å‹•å¼å·¥ä½œéšŽæ®µæ‰€éœ€çš„EOF次數\n"
+
+#: help.c:431
+msgid ""
+" LASTOID\n"
+" value of the last affected OID\n"
+msgstr ""
+" LASTOID\n"
+" 上一個å—影響的OID\n"
+
+#: help.c:433
+msgid ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" message and SQLSTATE of last error, or empty string and \"00000\" if none\n"
+msgstr ""
+" LAST_ERROR_MESSAGE\n"
+" LAST_ERROR_SQLSTATE\n"
+" 上一個錯誤的訊æ¯å’Œ SQLSTATE,若無則為空字串和 \"00000\"\n"
+
+#: help.c:436
+msgid ""
+" ON_ERROR_ROLLBACK\n"
+" if set, an error doesn't stop a transaction (uses implicit savepoints)\n"
+msgstr ""
+" ON_ERROR_ROLLBACK\n"
+" 若設定,錯誤ä¸æœƒåœæ­¢äº¤æ˜“(使用隱å¼ä¿å­˜é»ž)\n"
+
+#: help.c:438
+msgid ""
+" ON_ERROR_STOP\n"
+" stop batch execution after error\n"
+msgstr ""
+" ON_ERROR_STOP\n"
+" 在錯誤發生後åœæ­¢æ‰¹æ¬¡åŸ·è¡Œ\n"
+
+#: help.c:440
+msgid ""
+" PORT\n"
+" server port of the current connection\n"
+msgstr ""
+" PORT\n"
+" ç›®å‰é€£ç·šçš„伺æœå™¨é€£æŽ¥åŸ \n"
+
+#: help.c:442
+msgid ""
+" PROMPT1\n"
+" specifies the standard psql prompt\n"
+msgstr ""
+" PROMPT1\n"
+" 指定標準的psqlæ示符號\n"
+
+#: help.c:444
+msgid ""
+" PROMPT2\n"
+" specifies the prompt used when a statement continues from a previous line\n"
+msgstr ""
+" PROMPT2\n"
+" 指定當一個陳述å¼å¾žå‰ä¸€è¡Œç¹¼çºŒæ™‚所使用的æ示符號\n"
+
+#: help.c:446
+msgid ""
+" PROMPT3\n"
+" specifies the prompt used during COPY ... FROM STDIN\n"
+msgstr ""
+" PROMPT3\n"
+" 指定在執行 COPY ... FROM STDIN 時使用的æ示符號\n"
+
+#: help.c:448
+msgid ""
+" QUIET\n"
+" run quietly (same as -q option)\n"
+msgstr ""
+" QUIET\n"
+" éœé»˜åŸ·è¡Œ(åŒ -q é¸é …)\n"
+
+#: help.c:450
+msgid ""
+" ROW_COUNT\n"
+" number of rows returned or affected by last query, or 0\n"
+msgstr ""
+" ROW_COUNT\n"
+" 上一次查詢所回傳或å—影響的列數,或為 0\n"
+
+#: help.c:452
+msgid ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" server's version (in short string or numeric format)\n"
+msgstr ""
+" SERVER_VERSION_NAME\n"
+" SERVER_VERSION_NUM\n"
+" 伺æœå™¨ç‰ˆæœ¬(以簡短字串或數字格å¼è¡¨ç¤º)\n"
+
+#: help.c:455
+msgid ""
+" SHELL_ERROR\n"
+" \"true\" if the last shell command failed, \"false\" if it succeeded\n"
+msgstr ""
+" SHELL_ERROR\n"
+" 若上一個 shell 指令失敗,為 \"true\",若æˆåŠŸå‰‡ç‚º \"false\"\n"
+
+#: help.c:457
+msgid ""
+" SHELL_EXIT_CODE\n"
+" exit status of the last shell command\n"
+msgstr ""
+" SHELL_EXIT_CODE\n"
+" 上一個 shell 命令的çµæŸç¢¼\n"
+
+#: help.c:459
+msgid ""
+" SHOW_ALL_RESULTS\n"
+" show all results of a combined query (\\;) instead of only the last\n"
+msgstr ""
+" SHOW_ALL_RESULTS\n"
+" 顯示åˆä½µæŸ¥è©¢(\\;)的所有çµæžœï¼Œè€Œä¸åƒ…僅是最後一個çµæžœ\n"
+
+#: help.c:461
+msgid ""
+" SHOW_CONTEXT\n"
+" controls display of message context fields [never, errors, always]\n"
+msgstr ""
+" SHOW_CONTEXT\n"
+" 控制訊æ¯ä¸Šä¸‹æ–‡æ¬„ä½çš„顯示[never, errors, always]\n"
+
+#: help.c:463
+msgid ""
+" SINGLELINE\n"
+" if set, end of line terminates SQL commands (same as -S option)\n"
+msgstr ""
+" SINGLELINE\n"
+" 若設定,SQL命令在行尾çµæŸ(åŒ -S é¸é …)\n"
+
+#: help.c:465
+msgid ""
+" SINGLESTEP\n"
+" single-step mode (same as -s option)\n"
+msgstr ""
+" SINGLESTEP\n"
+" 單步執行模å¼(åŒ -s é¸é …)\n"
+
+#: help.c:467
+msgid ""
+" SQLSTATE\n"
+" SQLSTATE of last query, or \"00000\" if no error\n"
+msgstr ""
+" SQLSTATE\n"
+" 上一個查詢的 SQLSTATE,若無錯誤則為 \"00000\"\n"
+
+# common.c:636
+# common.c:871
+#: help.c:469
+msgid ""
+" USER\n"
+" the currently connected database user\n"
+msgstr ""
+" USER\n"
+" ç›®å‰é€£ç·šçš„資料庫使用者\n"
+
+#: help.c:471
+msgid ""
+" VERBOSITY\n"
+" controls verbosity of error reports [default, verbose, terse, sqlstate]\n"
+msgstr ""
+" VERBOSITY\n"
+" 控制錯誤報告的詳細程度 [default, verbose, terse, sqlstate]\n"
+
+#: help.c:473
+msgid ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql's version (in verbose string, short string, or numeric format)\n"
+msgstr ""
+" VERSION\n"
+" VERSION_NAME\n"
+" VERSION_NUM\n"
+" psql的版本(以詳細字串ã€ç°¡çŸ­å­—串或數字格å¼è¡¨ç¤º)\n"
+
+# describe.c:1549
+#: help.c:478
+msgid ""
+"\n"
+"Display settings:\n"
+msgstr ""
+"\n"
+"顯示設定:\n"
+
+#: help.c:480
+msgid ""
+" psql --pset=NAME[=VALUE]\n"
+" or \\pset NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" psql --pset=NAME[=VALUE]\n"
+" 或在 psql 中 \\pset NAME [VALUE]\n"
+"\n"
+
+#: help.c:482
+msgid ""
+" border\n"
+" border style (number)\n"
+msgstr ""
+" border\n"
+" 邊框樣å¼(數字)\n"
+
+#: help.c:484
+msgid ""
+" columns\n"
+" target width for the wrapped format\n"
+msgstr ""
+" columns\n"
+" å°è£æ ¼å¼çš„目標寬度是 %d。\n"
+
+#: help.c:486
+msgid ""
+" expanded (or x)\n"
+" expanded output [on, off, auto]\n"
+msgstr ""
+" expanded (or x)\n"
+" 展開輸出 [on, off, auto]\n"
+
+#: help.c:488
+#, c-format
+msgid ""
+" fieldsep\n"
+" field separator for unaligned output (default \"%s\")\n"
+msgstr ""
+" fieldsep\n"
+" 用於éžå°é½Šè¼¸å‡ºçš„欄ä½åˆ†éš”符(é è¨­å€¼ \"%s\")\n"
+
+# help.c:236
+#: help.c:491
+msgid ""
+" fieldsep_zero\n"
+" set field separator for unaligned output to a zero byte\n"
+msgstr ""
+" fieldsep_zero\n"
+" 設定éžå°é½Šè¼¸å‡ºçš„欄ä½åˆ†éš”符為 0 ä½å…ƒçµ„\n"
+
+#: help.c:493
+msgid ""
+" footer\n"
+" enable or disable display of the table footer [on, off]\n"
+msgstr ""
+" footer\n"
+" 啟動或åœç”¨é¡¯ç¤ºè¡¨æ ¼é è…³ [on, off]\n"
+
+# command.c:1340
+#: help.c:495
+msgid ""
+" format\n"
+" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+msgstr ""
+" format\n"
+" è¨­å®šè¼¸å‡ºæ ¼å¼ [unaligned, aligned, wrapped, html, asciidoc, ...]\n"
+
+#: help.c:497
+msgid ""
+" linestyle\n"
+" set the border line drawing style [ascii, old-ascii, unicode]\n"
+msgstr ""
+" linestyle\n"
+" 設定邊框線æ¢ç¹ªè£½æ¨£å¼ [ascii, old-ascii, unicode]\n"
+
+#: help.c:499
+msgid ""
+" null\n"
+" set the string to be printed in place of a null value\n"
+msgstr ""
+" null\n"
+" 設定è¦åœ¨ç©ºå€¼ä½ç½®ä¸Šé¡¯ç¤ºçš„字串\n"
+
+#: help.c:501
+msgid ""
+" numericlocale\n"
+" enable display of a locale-specific character to separate groups of digits\n"
+msgstr ""
+" numericlocale\n"
+" 啟動顯示å€åŸŸç‰¹å®šçš„字符來分隔數字群組\n"
+
+#: help.c:503
+msgid ""
+" pager\n"
+" control when an external pager is used [yes, no, always]\n"
+msgstr ""
+" pager\n"
+" 控制何時使用外部分é ç¨‹å¼ [yes, no, always]\n"
+
+# help.c:236
+#: help.c:505
+msgid ""
+" recordsep\n"
+" record (line) separator for unaligned output\n"
+msgstr ""
+" recordsep\n"
+" 用於éžå°é½Šè¼¸å‡ºçš„記錄(è¡Œ)分隔符號\n"
+
+#: help.c:507
+msgid ""
+" recordsep_zero\n"
+" set record separator for unaligned output to a zero byte\n"
+msgstr ""
+" recordsep_zero\n"
+" å°‡éžå°é½Šè¼¸å‡ºçš„記錄分隔符設定為 0 ä½å…ƒçµ„\n"
+
+#: help.c:509
+msgid ""
+" tableattr (or T)\n"
+" specify attributes for table tag in html format, or proportional\n"
+" column widths for left-aligned data types in latex-longtable format\n"
+msgstr ""
+" tableattr (or T)\n"
+" 指定HTMLæ ¼å¼ä¸­è¡¨æ ¼æ¨™ç±¤çš„屬性,或是LaTeX-longtable\n"
+" æ ¼å¼ä¸­å·¦å°é½Šè³‡æ–™åž‹åˆ¥çš„比例列寬\n"
+
+#: help.c:512
+msgid ""
+" title\n"
+" set the table title for subsequently printed tables\n"
+msgstr ""
+" title\n"
+" 設定後續顯示表格的表格標題\n"
+
+#: help.c:514
+msgid ""
+" tuples_only\n"
+" if set, only actual table data is shown\n"
+msgstr ""
+" tuples_only\n"
+" 若設定則åªé¡¯ç¤ºè³‡æ–™\n"
+
+#: help.c:516
+msgid ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" set the style of Unicode line drawing [single, double]\n"
+msgstr ""
+" unicode_border_linestyle\n"
+" unicode_column_linestyle\n"
+" unicode_header_linestyle\n"
+" 設定 Unicode ç·šæ¢ç¹ªè£½æ¨£å¼ [single, double]\n"
+
+#: help.c:521
+msgid ""
+"\n"
+"Environment variables:\n"
+msgstr ""
+"\n"
+"環境變數:\n"
+
+#: help.c:525
+msgid ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" NAME=VALUE [NAME=VALUE] psql ...\n"
+" 或在 psql 中 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:527
+msgid ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" or \\setenv NAME [VALUE] inside psql\n"
+"\n"
+msgstr ""
+" set NAME=VALUE\n"
+" psql ...\n"
+" 或在 psql 中 \\setenv NAME [VALUE]\n"
+"\n"
+
+#: help.c:530
+msgid ""
+" COLUMNS\n"
+" number of columns for wrapped format\n"
+msgstr ""
+" COLUMNS\n"
+" 用於å°è£æ ¼å¼çš„欄ä½æ•¸\n"
+
+#: help.c:532
+msgid ""
+" PGAPPNAME\n"
+" same as the application_name connection parameter\n"
+msgstr ""
+" PGAPPNAME\n"
+" 與連線åƒæ•¸ä¸­çš„ application_name 相åŒ\n"
+
+#: help.c:534
+msgid ""
+" PGDATABASE\n"
+" same as the dbname connection parameter\n"
+msgstr ""
+" PGDATABASE\n"
+" 與連線åƒæ•¸ä¸­çš„ dbname 相åŒ\n"
+
+#: help.c:536
+msgid ""
+" PGHOST\n"
+" same as the host connection parameter\n"
+msgstr ""
+" PGHOST\n"
+" 與連線åƒæ•¸ä¸­çš„ host 相åŒ\n"
+
+#: help.c:538
+msgid ""
+" PGPASSFILE\n"
+" password file name\n"
+msgstr ""
+" PGPASSFILE\n"
+" 密碼檔案å稱\n"
+
+#: help.c:540
+msgid ""
+" PGPASSWORD\n"
+" connection password (not recommended)\n"
+msgstr ""
+" PGPASSWORD\n"
+" 連線密碼(ä¸å»ºè­°ä½¿ç”¨)\n"
+
+#: help.c:542
+msgid ""
+" PGPORT\n"
+" same as the port connection parameter\n"
+msgstr ""
+" PGPORT\n"
+" 與連線åƒæ•¸ä¸­çš„ port 相åŒ\n"
+
+#: help.c:544
+msgid ""
+" PGUSER\n"
+" same as the user connection parameter\n"
+msgstr ""
+" PGUSER\n"
+" 與連線åƒæ•¸ä¸­çš„ user 相åŒ\n"
+
+#: help.c:546
+msgid ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" editor used by the \\e, \\ef, and \\ev commands\n"
+msgstr ""
+" PSQL_EDITOR, EDITOR, VISUAL\n"
+" \\eã€\\efã€\\ev 命令使用的編輯器\n"
+
+#: help.c:548
+msgid ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" how to specify a line number when invoking the editor\n"
+msgstr ""
+" PSQL_EDITOR_LINENUMBER_ARG\n"
+" 在呼å«ç·¨è¼¯å™¨æ™‚如何指定行號\n"
+
+#: help.c:550
+msgid ""
+" PSQL_HISTORY\n"
+" alternative location for the command history file\n"
+msgstr ""
+" PSQL_HISTORY\n"
+" 命令歷å²æª”案的替代ä½ç½®\n"
+
+#: help.c:552
+msgid ""
+" PSQL_PAGER, PAGER\n"
+" name of external pager program\n"
+msgstr ""
+" PSQL_PAGER, PAGER\n"
+" 外部分é ç¨‹å¼çš„å稱\n"
+
+#: help.c:555
+msgid ""
+" PSQL_WATCH_PAGER\n"
+" name of external pager program used for \\watch\n"
+msgstr ""
+" PSQL_WATCH_PAGER\n"
+" 用於 \\watch 的外部分é ç¨‹å¼çš„å稱\n"
+
+#: help.c:558
+msgid ""
+" PSQLRC\n"
+" alternative location for the user's .psqlrc file\n"
+msgstr ""
+" PSQLRC\n"
+" 使用者 .psqlrc 檔案的替代ä½ç½®\n"
+
+#: help.c:560
+msgid ""
+" SHELL\n"
+" shell used by the \\! command\n"
+msgstr ""
+" SHELL\n"
+" \\! 命令使用的 shell\n"
+
+#: help.c:562
+msgid ""
+" TMPDIR\n"
+" directory for temporary files\n"
+msgstr ""
+" TMPDIR\n"
+" 暫存檔案的目錄\n"
+
+# help.c:285
+#: help.c:622
+msgid "Available help:\n"
+msgstr "å¯ç”¨èªªæ˜Ž:\n"
+
+# help.c:344
+#: help.c:717
+#, c-format
+msgid ""
+"Command: %s\n"
+"Description: %s\n"
+"Syntax:\n"
+"%s\n"
+"\n"
+"URL: %s\n"
+"\n"
+msgstr ""
+"命令: %s\n"
+"æè¿°: %s\n"
+"語法:\n"
+"%s\n"
+"\n"
+"網å€: %s\n"
+"\n"
+
+# help.c:357
+#: help.c:740
+#, c-format
+msgid ""
+"No help available for \"%s\".\n"
+"Try \\h with no arguments to see available help.\n"
+msgstr ""
+"沒有 \"%s\" 的說明。\n"
+"用ä¸å¸¶åƒæ•¸çš„ \\h 查看å¯ç”¨çš„說明。\n"
+
+# input.c:210
+#: input.c:216
+#, c-format
+msgid "could not read from input file: %m"
+msgstr "無法從輸入檔讀å–: %m"
+
+# input.c:210
+#: input.c:477 input.c:515
+#, c-format
+msgid "could not save history to file \"%s\": %m"
+msgstr "無法將歷å²è¨˜éŒ„存入檔案 \"%s\": %m"
+
+# input.c:213
+#: input.c:534
+#, c-format
+msgid "history is not supported by this installation"
+msgstr "此安è£ä¸æ”¯æ´æ­·å²è¨˜éŒ„"
+
+# large_obj.c:36
+#: large_obj.c:65
+#, c-format
+msgid "%s: not connected to a database"
+msgstr "%s: 尚未連線至資料庫"
+
+# large_obj.c:55
+#: large_obj.c:84
+#, c-format
+msgid "%s: current transaction is aborted"
+msgstr "%s: ç›®å‰çš„交易已被中止"
+
+# large_obj.c:58
+#: large_obj.c:87
+#, c-format
+msgid "%s: unknown transaction status"
+msgstr "%s: 未知的交易狀態"
+
+#: mainloop.c:133
+#, c-format
+msgid "\\if: escaped"
+msgstr ""
+
+# mainloop.c:172
+#: mainloop.c:192
+#, c-format
+msgid "Use \"\\q\" to leave %s.\n"
+msgstr "用 \"\\q\" 離開 %s。\n"
+
+#: mainloop.c:214
+msgid ""
+"The input is a PostgreSQL custom-format dump.\n"
+"Use the pg_restore command-line client to restore this dump to a database.\n"
+msgstr ""
+"輸入為 PostgreSQL 自訂格å¼çš„備份檔案。\n"
+"用 pg_restore 命令列客戶端將此備份還原到資料庫。\n"
+
+#: mainloop.c:295
+msgid "Use \\? for help or press control-C to clear the input buffer."
+msgstr "用 \\? å–得說明,或按 Control-C 清除輸入緩è¡å€ã€‚"
+
+#: mainloop.c:297
+msgid "Use \\? for help."
+msgstr "用 \\? å–得說明。"
+
+#: mainloop.c:301
+msgid "You are using psql, the command-line interface to PostgreSQL."
+msgstr "您正在使用 psql,這是 PostgreSQL 的命令列界é¢"
+
+# startup.c:292
+#: mainloop.c:302
+#, c-format
+msgid ""
+"Type: \\copyright for distribution terms\n"
+" \\h for help with SQL commands\n"
+" \\? for help with psql commands\n"
+" \\g or terminate with semicolon to execute query\n"
+" \\q to quit\n"
+msgstr ""
+"輸入: \\copyright 顯示發行æ¢æ¬¾\n"
+" \\h 顯示 SQL 命令的說明\n"
+" \\? 顯示 psql 命令的說明\n"
+" \\g 或以分號çµå°¾ä»¥åŸ·è¡ŒæŸ¥è©¢\n"
+" \\q çµæŸ\n"
+
+#: mainloop.c:326
+msgid "Use \\q to quit."
+msgstr "用 \\q çµæŸã€‚"
+
+#: mainloop.c:329 mainloop.c:353
+msgid "Use control-D to quit."
+msgstr "用 Control-D çµæŸã€‚"
+
+#: mainloop.c:331 mainloop.c:355
+msgid "Use control-C to quit."
+msgstr "用 Control-C çµæŸã€‚"
+
+#: mainloop.c:459 mainloop.c:618
+#, c-format
+msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block"
+msgstr "查詢被忽略;使用 \\endif 或按 Ctrl-C 以退出當å‰çš„ \\if å€å¡Š"
+
+#: mainloop.c:636
+#, c-format
+msgid "reached EOF without finding closing \\endif(s)"
+msgstr "å·²é”到 EOF,但找ä¸åˆ°çµå°¾çš„ \\endif"
+
+# scan.l:407
+#: psqlscanslash.l:640
+#, c-format
+msgid "unterminated quoted string"
+msgstr "未完æˆçš„引號字串"
+
+#: psqlscanslash.l:825
+#, c-format
+msgid "%s: out of memory"
+msgstr "%s: 記憶體ä¸è¶³"
+
+# describe.c:1375
+#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66
+#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85
+#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125
+#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238
+#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248
+#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267
+#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323
+#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443
+#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524
+#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595
+#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606
+#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668
+#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714
+#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747
+#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802
+#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859
+#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900
+#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999
+#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019
+#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071
+#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086
+#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116
+#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141
+#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155
+#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163
+#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310
+#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320
+#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445
+#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474
+#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486
+#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507
+#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523
+#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548
+#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577
+#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588
+#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687
+#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696
+#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000
+#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159
+#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236
+#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439
+#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525
+#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602
+#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738
+#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079
+#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179
+#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267
+#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346
+#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404
+#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436
+#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472
+#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507
+#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545
+#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582
+#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614
+#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646
+#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688
+#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040
+#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197
+#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906
+msgid "name"
+msgstr "name"
+
+# describe.c:480
+#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848
+#: sql_help.c:3347 sql_help.c:4468
+msgid "aggregate_signature"
+msgstr "aggregate_signature"
+
+#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253
+#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576
+#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798
+#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008
+#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105
+#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444
+#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534
+#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693
+msgid "new_name"
+msgstr "new_name"
+
+#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251
+#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623
+#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801
+#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052
+#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167
+#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510
+#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019
+msgid "new_owner"
+msgstr "new_owner"
+
+# catalog/dependency.c:1714
+#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322
+#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749
+#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087
+#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512
+#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695
+msgid "new_schema"
+msgstr "new_schema"
+
+# describe.c:1174
+#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497
+msgid "where aggregate_signature is:"
+msgstr "其中 aggregate_signature 是:"
+
+#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353
+#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520
+#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850
+#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000
+#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020
+#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913
+#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089
+#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349
+#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535
+#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474
+#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501
+#: sql_help.c:4504
+msgid "argmode"
+msgstr "argmode"
+
+#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354
+#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521
+#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851
+#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001
+#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021
+#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914
+#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090
+#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350
+#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536
+#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488
+#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505
+msgid "argname"
+msgstr "argname"
+
+# describe.c:1689
+#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355
+#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522
+#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852
+#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002
+#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022
+#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915
+#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605
+#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448
+#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483
+#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506
+msgid "argtype"
+msgstr "argtype"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949
+#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666
+#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977
+#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351
+#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048
+#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751
+#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973
+msgid "option"
+msgstr "option"
+
+#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441
+#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396
+msgid "where option can be:"
+msgstr "其中 option å¯ä»¥æ˜¯:"
+
+#: sql_help.c:116 sql_help.c:2217
+msgid "allowconn"
+msgstr "allowconn"
+
+#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218
+#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235
+msgid "connlimit"
+msgstr "connlimit"
+
+#: sql_help.c:118 sql_help.c:2219
+msgid "istemplate"
+msgstr "istemplate"
+
+# describe.c:1342
+#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322
+#: sql_help.c:1374 sql_help.c:4200
+msgid "new_tablespace"
+msgstr "new_tablespace"
+
+# sql_help.h:366
+#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550
+#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958
+#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029
+#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643
+#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609
+#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688
+msgid "configuration_parameter"
+msgstr "configuration_parameter"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487
+#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876
+#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101
+#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157
+#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182
+#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449
+#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667
+#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352
+#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475
+#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634
+#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923
+#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022
+#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689
+#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692
+msgid "value"
+msgstr "value"
+
+#: sql_help.c:200
+msgid "target_role"
+msgstr "target_role"
+
+#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639
+#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899
+#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351
+#: sql_help.c:4370 sql_help.c:4382
+msgid "schema_name"
+msgstr "schema_name"
+
+#: sql_help.c:202
+msgid "abbreviated_grant_or_revoke"
+msgstr "abbreviated_grant_or_revoke"
+
+#: sql_help.c:203
+msgid "where abbreviated_grant_or_revoke is one of:"
+msgstr "其中 abbreviated_grant_or_revoke å¯ä»¥æ˜¯:"
+
+# describe.c:1375
+#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208
+#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213
+#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969
+#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446
+#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583
+#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675
+#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240
+#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943
+#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710
+msgid "role_name"
+msgstr "role_name"
+
+#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339
+#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684
+#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360
+#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782
+#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932
+#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991
+#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098
+#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571
+#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621
+#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664
+#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819
+#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877
+#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934
+#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065
+#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123
+#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126
+msgid "expression"
+msgstr "expression"
+
+#: sql_help.c:242
+msgid "domain_constraint"
+msgstr "domain_constraint"
+
+# catalog/dependency.c:1511
+#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478
+#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363
+#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854
+#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359
+#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003
+msgid "constraint_name"
+msgstr "constraint_name"
+
+# catalog/dependency.c:1511
+#: sql_help.c:247 sql_help.c:1315
+msgid "new_constraint_name"
+msgstr "new_constraint_name"
+
+#: sql_help.c:320 sql_help.c:1099
+msgid "new_version"
+msgstr "new_version"
+
+#: sql_help.c:324 sql_help.c:326
+msgid "member_object"
+msgstr "member_object"
+
+#: sql_help.c:327
+msgid "where member_object is:"
+msgstr "其中 member_object 是:"
+
+# describe.c:1375
+#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336
+#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349
+#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363
+#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370
+#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858
+#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862
+#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871
+#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886
+#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896
+#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900
+#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904
+#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469
+#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478
+#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490
+#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494
+#: sql_help.c:4495
+msgid "object_name"
+msgstr "object_name"
+
+# describe.c:480
+#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467
+msgid "aggregate_name"
+msgstr "aggregate_name"
+
+# describe.c:1688
+#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139
+#: sql_help.c:2141 sql_help.c:3365
+msgid "source_type"
+msgstr "source_type"
+
+# describe.c:1689
+#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140
+#: sql_help.c:2142 sql_help.c:3366
+msgid "target_type"
+msgstr "target_type"
+
+# describe.c:498
+#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137
+#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557
+#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590
+#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847
+#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093
+#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104
+msgid "function_name"
+msgstr "function_name"
+
+# describe.c:512
+#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550
+msgid "operator_name"
+msgstr "operator_name"
+
+# describe.c:321
+#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873
+#: sql_help.c:2527 sql_help.c:3489
+msgid "left_type"
+msgstr "left_type"
+
+# describe.c:321
+#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874
+#: sql_help.c:2528 sql_help.c:3490
+msgid "right_type"
+msgstr "right_type"
+
+#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748
+#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803
+#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547
+#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508
+msgid "index_method"
+msgstr "index_method"
+
+#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480
+msgid "procedure_name"
+msgstr "procedure_name"
+
+# describe.c:1375
+#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486
+msgid "routine_name"
+msgstr "routine_name"
+
+#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402
+#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670
+#: sql_help.c:3936 sql_help.c:4388
+msgid "type_name"
+msgstr "type_name"
+
+#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607
+#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921
+#: sql_help.c:4373
+msgid "lang_name"
+msgstr "lang_name"
+
+#: sql_help.c:372
+msgid "and aggregate_signature is:"
+msgstr "且 aggregate_signature 是:"
+
+# describe.c:498
+#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283
+msgid "handler_function"
+msgstr "handler_function"
+
+# commands/define.c:279
+#: sql_help.c:396 sql_help.c:2284
+msgid "validator_function"
+msgstr "validator_function"
+
+# describe.c:498
+#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003
+#: sql_help.c:1309 sql_help.c:1581
+msgid "action"
+msgstr "action"
+
+# describe.c:1375
+#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461
+#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470
+#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683
+#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080
+#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334
+#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342
+#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349
+#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357
+#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422
+#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683
+#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853
+#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988
+#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399
+#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637
+#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895
+#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927
+#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963
+#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986
+#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893
+#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007
+#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099
+#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627
+#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890
+#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937
+#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138
+msgid "column_name"
+msgstr "column_name"
+
+# describe.c:1375
+#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691
+msgid "new_column_name"
+msgstr "new_column_name"
+
+#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024
+#: sql_help.c:1328 sql_help.c:1591
+msgid "where action is one of:"
+msgstr "其中 action å¯ä»¥æ˜¯:"
+
+# describe.c:526
+#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330
+#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237
+#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896
+#: sql_help.c:3175 sql_help.c:4151
+msgid "data_type"
+msgstr "data_type"
+
+# describe.c:128
+#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336
+#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337
+#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919
+#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000
+msgid "collation"
+msgstr "collation"
+
+# catalog/dependency.c:1511
+#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347
+#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928
+msgid "column_constraint"
+msgstr "column_constraint"
+
+#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986
+msgid "integer"
+msgstr "integer"
+
+#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352
+#: sql_help.c:1355
+msgid "attribute_option"
+msgstr "attribute_option"
+
+# catalog/dependency.c:1511
+#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348
+#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929
+msgid "table_constraint"
+msgstr "table_constraint"
+
+# describe.c:575
+#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364
+#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907
+msgid "trigger_name"
+msgstr "trigger_name"
+
+#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379
+#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926
+msgid "parent_table"
+msgstr "parent_table"
+
+#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023
+#: sql_help.c:1550 sql_help.c:2269
+msgid "extension_name"
+msgstr "extension_name"
+
+#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403
+msgid "execution_cost"
+msgstr "execution_cost"
+
+#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404
+msgid "result_rows"
+msgstr "result_rows"
+
+# describe.c:498
+#: sql_help.c:547 sql_help.c:2405
+msgid "support_function"
+msgstr "support_function"
+
+# describe.c:1636
+#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960
+#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641
+#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717
+#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891
+#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900
+#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906
+#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912
+#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922
+#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928
+#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934
+#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940
+#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348
+#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355
+#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361
+#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371
+#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377
+#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383
+#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389
+#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393
+msgid "role_specification"
+msgstr "role_specification"
+
+#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205
+#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720
+msgid "user_name"
+msgstr "user_name"
+
+#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724
+#: sql_help.c:3942 sql_help.c:4394
+msgid "where role_specification can be:"
+msgstr "其中 role_specification å¯ä»¥æ˜¯:"
+
+# utils/misc/guc.c:237
+#: sql_help.c:575
+msgid "group_name"
+msgstr "group_name"
+
+# describe.c:1342
+#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476
+#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938
+#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933
+#: sql_help.c:4385
+msgid "tablespace_name"
+msgstr "tablespace_name"
+
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382
+#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785
+msgid "index_name"
+msgstr "index_name"
+
+#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375
+#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508
+#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977
+#: sql_help.c:3004
+msgid "storage_parameter"
+msgstr "storage_parameter"
+
+# describe.c:1375
+#: sql_help.c:607
+msgid "column_number"
+msgstr "column_number"
+
+# large_obj.c:264
+#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477
+msgid "large_object_oid"
+msgstr "large_object_oid"
+
+#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897
+msgid "compression_method"
+msgstr "compression_method"
+
+#: sql_help.c:692 sql_help.c:1373
+msgid "new_access_method"
+msgstr "new_access_method"
+
+#: sql_help.c:725 sql_help.c:2531
+msgid "res_proc"
+msgstr "res_proc"
+
+#: sql_help.c:726 sql_help.c:2532
+msgid "join_proc"
+msgstr "join_proc"
+
+#: sql_help.c:778 sql_help.c:790 sql_help.c:2549
+msgid "strategy_number"
+msgstr "strategy_number"
+
+# describe.c:415
+# describe.c:745
+# describe.c:1478
+# describe.c:1587
+#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791
+#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552
+#: sql_help.c:2555 sql_help.c:2556
+msgid "op_type"
+msgstr "op_type"
+
+#: sql_help.c:782 sql_help.c:2553
+msgid "sort_family_name"
+msgstr "sort_family_name"
+
+#: sql_help.c:783 sql_help.c:793 sql_help.c:2554
+msgid "support_number"
+msgstr "support_number"
+
+# describe.c:1689
+#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095
+#: sql_help.c:3097
+msgid "argument_type"
+msgstr "argument_type"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079
+#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781
+#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893
+#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332
+#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582
+#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778
+#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925
+#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525
+#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895
+#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347
+#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640
+#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897
+#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081
+#: sql_help.c:5143
+msgid "table_name"
+msgstr "table_name"
+
+#: sql_help.c:823 sql_help.c:2584
+msgid "using_expression"
+msgstr "using_expression"
+
+#: sql_help.c:824 sql_help.c:2585
+msgid "check_expression"
+msgstr "check_expression"
+
+# describe.c:1636
+#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632
+msgid "publication_object"
+msgstr "publication_object"
+
+# sql_help.h:366
+#: sql_help.c:903 sql_help.c:2633
+msgid "publication_parameter"
+msgstr "publication_parameter"
+
+#: sql_help.c:909 sql_help.c:2635
+msgid "where publication_object is one of:"
+msgstr "其中 publication_object å¯ä»¥æ˜¯:"
+
+# command.c:915
+# command.c:939
+# startup.c:187
+# startup.c:205
+#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670
+#: sql_help.c:3236
+msgid "password"
+msgstr "password"
+
+#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671
+#: sql_help.c:3237
+msgid "timestamp"
+msgstr "timestamp"
+
+# commands/user.c:240 commands/user.c:371
+#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642
+#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902
+#: sql_help.c:4354
+msgid "database_name"
+msgstr "database_name"
+
+#: sql_help.c:1073 sql_help.c:2740
+msgid "increment"
+msgstr "increment"
+
+#: sql_help.c:1074 sql_help.c:2741
+msgid "minvalue"
+msgstr "minvalue"
+
+#: sql_help.c:1075 sql_help.c:2742
+msgid "maxvalue"
+msgstr "maxvalue"
+
+#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677
+#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077
+msgid "start"
+msgstr "start"
+
+#: sql_help.c:1077 sql_help.c:1347
+msgid "restart"
+msgstr "restart"
+
+#: sql_help.c:1078 sql_help.c:2744
+msgid "cache"
+msgstr "cache"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:1123
+msgid "new_target"
+msgstr "new_target"
+
+#: sql_help.c:1142 sql_help.c:2797
+msgid "conninfo"
+msgstr "conninfo"
+
+# describe.c:498
+#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798
+msgid "publication_name"
+msgstr "publication_name"
+
+# describe.c:1636
+#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153
+msgid "publication_option"
+msgstr "publication_option"
+
+# help.c:88
+#: sql_help.c:1156
+msgid "refresh_option"
+msgstr "refresh_option"
+
+# sql_help.h:366
+#: sql_help.c:1161 sql_help.c:2799
+msgid "subscription_parameter"
+msgstr "subscription_parameter"
+
+# help.c:88
+#: sql_help.c:1164
+msgid "skip_option"
+msgstr "skip_option"
+
+#: sql_help.c:1324 sql_help.c:1327
+msgid "partition_name"
+msgstr "partition_name"
+
+#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930
+msgid "partition_bound_spec"
+msgstr "partition_bound_spec"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944
+msgid "sequence_options"
+msgstr "sequence_options"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:1346
+msgid "sequence_option"
+msgstr "sequence_option"
+
+#: sql_help.c:1360
+msgid "table_constraint_using_index"
+msgstr "table_constraint_using_index"
+
+#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371
+msgid "rewrite_rule_name"
+msgstr "rewrite_rule_name"
+
+#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969
+msgid "and partition_bound_spec is:"
+msgstr "且 partition_bound_spec 是:"
+
+#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362
+#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971
+#: sql_help.c:2972
+msgid "partition_bound_expr"
+msgstr "partition_bound_expr"
+
+#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366
+#: sql_help.c:2973 sql_help.c:2974
+msgid "numeric_literal"
+msgstr "numeric_literal"
+
+# describe.c:1174
+#: sql_help.c:1389
+msgid "and column_constraint is:"
+msgstr "且 column_constraint 是:"
+
+# describe.c:1639
+#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606
+#: sql_help.c:2942
+msgid "default_expr"
+msgstr "default_expr"
+
+#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943
+msgid "generation_expr"
+msgstr "generation_expr"
+
+#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407
+#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955
+#: sql_help.c:2957 sql_help.c:2961
+msgid "index_parameters"
+msgstr "index_parameters"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964
+msgid "reftable"
+msgstr "reftable"
+
+# describe.c:744
+#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965
+msgid "refcolumn"
+msgstr "refcolumn"
+
+#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417
+#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967
+msgid "referential_action"
+msgstr "referential_action"
+
+# catalog/dependency.c:1511
+#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951
+msgid "and table_constraint is:"
+msgstr "且 table_constraint 是:"
+
+#: sql_help.c:1409 sql_help.c:2959
+msgid "exclude_element"
+msgstr "exclude_element"
+
+# describe.c:512
+#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675
+#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075
+msgid "operator"
+msgstr "operator"
+
+# describe.c:937
+#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962
+msgid "predicate"
+msgstr "predicate"
+
+#: sql_help.c:1418
+msgid "and table_constraint_using_index is:"
+msgstr "並且 table_constraint_using_index 是:"
+
+#: sql_help.c:1421 sql_help.c:2975
+msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"
+msgstr "UNIQUE, PRIMARY KEY, and EXCLUDE ç´„æŸæ¢ä»¶ä¸­çš„ index_parameters 是:"
+
+#: sql_help.c:1426 sql_help.c:2980
+msgid "exclude_element in an EXCLUDE constraint is:"
+msgstr "在 EXCLUDE ç´„æŸæ¢ä»¶çš„ exclude_element 是:"
+
+#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920
+#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001
+msgid "opclass"
+msgstr "opclass"
+
+#: sql_help.c:1430 sql_help.c:2984
+msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:"
+msgstr "FOREIGN KEY/REFERENCES ç´„æŸä¸­çš„ referential_action 是:"
+
+# describe.c:1342
+#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021
+msgid "tablespace_option"
+msgstr "tablespace_option"
+
+#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485
+msgid "token_type"
+msgstr "token_type"
+
+#: sql_help.c:1473 sql_help.c:1476
+msgid "dictionary_name"
+msgstr "dictionary_name"
+
+#: sql_help.c:1478 sql_help.c:1482
+msgid "old_dictionary"
+msgstr "old_dictionary"
+
+#: sql_help.c:1479 sql_help.c:1483
+msgid "new_dictionary"
+msgstr "new_dictionary"
+
+#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596
+#: sql_help.c:3174
+msgid "attribute_name"
+msgstr "attribute_name"
+
+#: sql_help.c:1579
+msgid "new_attribute_name"
+msgstr "new_attribute_name"
+
+#: sql_help.c:1583 sql_help.c:1587
+msgid "new_enum_value"
+msgstr "new_enum_value"
+
+#: sql_help.c:1584
+msgid "neighbor_enum_value"
+msgstr "neighbor_enum_value"
+
+#: sql_help.c:1586
+msgid "existing_enum_value"
+msgstr "existing_enum_value"
+
+# describe.c:512
+#: sql_help.c:1589
+msgid "property"
+msgstr "property"
+
+#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756
+#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957
+#: sql_help.c:4363
+msgid "server_name"
+msgstr "server_name"
+
+#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269
+msgid "view_option_name"
+msgstr "view_option_name"
+
+#: sql_help.c:1698 sql_help.c:3270
+msgid "view_option_value"
+msgstr "view_option_value"
+
+# catalog/dependency.c:1511
+#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975
+msgid "table_and_columns"
+msgstr "table_and_columns"
+
+#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754
+#: sql_help.c:4198 sql_help.c:4976
+msgid "where option can be one of:"
+msgstr "其中 option å¯ä»¥æ˜¯:"
+
+#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980
+#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756
+#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760
+#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199
+#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979
+#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983
+#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988
+msgid "boolean"
+msgstr "boolean"
+
+#: sql_help.c:1725 sql_help.c:4989
+msgid "size"
+msgstr "size"
+
+# catalog/dependency.c:1511
+#: sql_help.c:1726 sql_help.c:4990
+msgid "and table_and_columns is:"
+msgstr "且 table_constraint 是:"
+
+#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762
+msgid "transaction_mode"
+msgstr "transaction_mode"
+
+# access/transam/xact.c:2544 access/transam/xact.c:2635
+#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763
+msgid "where transaction_mode is one of:"
+msgstr "其中 transaction_mode å¯ä»¥æ˜¯:"
+
+# gram.y:3496 utils/adt/regproc.c:639
+#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595
+#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848
+#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085
+#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105
+msgid "argument"
+msgstr "argument"
+
+#: sql_help.c:1852
+msgid "relation_name"
+msgstr "relation_name"
+
+# describe.c:1375
+#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357
+msgid "domain_name"
+msgstr "domain_name"
+
+# describe.c:1375
+#: sql_help.c:1879
+msgid "policy_name"
+msgstr "policy_name"
+
+# describe.c:1375
+#: sql_help.c:1892
+msgid "rule_name"
+msgstr "rule_name"
+
+#: sql_help.c:1911 sql_help.c:4496
+msgid "string_literal"
+msgstr "string_literal"
+
+#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410
+msgid "transaction_id"
+msgstr "transaction_id"
+
+# describe.c:1375
+#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027
+msgid "filename"
+msgstr "filename"
+
+#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696
+#: sql_help.c:2697
+msgid "command"
+msgstr "command"
+
+# help.c:123
+#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305
+#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565
+#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822
+#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070
+msgid "condition"
+msgstr "condition"
+
+#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271
+#: sql_help.c:3289 sql_help.c:3992
+msgid "query"
+msgstr "query"
+
+# help.c:211
+#: sql_help.c:1979
+msgid "format_name"
+msgstr "format_name"
+
+#: sql_help.c:1981
+msgid "delimiter_character"
+msgstr "delimiter_character"
+
+#: sql_help.c:1982
+msgid "null_string"
+msgstr "null_string"
+
+#: sql_help.c:1983
+msgid "default_string"
+msgstr "default_string"
+
+# translator: %s represents a digit string
+# fe-protocol3.c:651
+# fe-protocol3.c:659
+#: sql_help.c:1985
+msgid "quote_character"
+msgstr "quote_character"
+
+#: sql_help.c:1986
+msgid "escape_character"
+msgstr "escape_character"
+
+# utils/mb/encnames.c:445
+#: sql_help.c:1990
+msgid "encoding_name"
+msgstr "encoding_name"
+
+#: sql_help.c:2001
+msgid "access_method_type"
+msgstr "access_method_type"
+
+# describe.c:526
+#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094
+msgid "arg_data_type"
+msgstr "arg_data_type"
+
+# describe.c:498
+#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103
+msgid "sfunc"
+msgstr "sfunc"
+
+# describe.c:526
+#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104
+msgid "state_data_type"
+msgstr "state_data_type"
+
+# describe.c:526
+#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105
+msgid "state_data_size"
+msgstr "state_data_size"
+
+# describe.c:498
+#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106
+msgid "ffunc"
+msgstr "ffunc"
+
+#: sql_help.c:2077 sql_help.c:2107
+msgid "combinefunc"
+msgstr "combinefunc"
+
+# describe.c:498
+#: sql_help.c:2078 sql_help.c:2108
+msgid "serialfunc"
+msgstr "serialfunc"
+
+#: sql_help.c:2079 sql_help.c:2109
+msgid "deserialfunc"
+msgstr "deserialfunc"
+
+#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110
+msgid "initial_condition"
+msgstr "initial_condition"
+
+# describe.c:498
+#: sql_help.c:2081 sql_help.c:2111
+msgid "msfunc"
+msgstr "msfunc"
+
+#: sql_help.c:2082 sql_help.c:2112
+msgid "minvfunc"
+msgstr "minvfunc"
+
+# describe.c:526
+#: sql_help.c:2083 sql_help.c:2113
+msgid "mstate_data_type"
+msgstr "mstate_data_type"
+
+# describe.c:526
+#: sql_help.c:2084 sql_help.c:2114
+msgid "mstate_data_size"
+msgstr "mstate_data_size"
+
+# describe.c:498
+#: sql_help.c:2085 sql_help.c:2115
+msgid "mffunc"
+msgstr "mffunc"
+
+#: sql_help.c:2086 sql_help.c:2116
+msgid "minitial_condition"
+msgstr "minitial_condition"
+
+# describe.c:512
+#: sql_help.c:2087 sql_help.c:2117
+msgid "sort_operator"
+msgstr "sort_operator"
+
+#: sql_help.c:2100
+msgid "or the old syntax"
+msgstr "或是舊語法"
+
+# describe.c:1689
+#: sql_help.c:2102
+msgid "base_type"
+msgstr "base_type"
+
+# help.c:127
+#: sql_help.c:2160 sql_help.c:2209
+msgid "locale"
+msgstr "locale"
+
+#: sql_help.c:2161 sql_help.c:2210
+msgid "lc_collate"
+msgstr "lc_collate"
+
+# describe.c:415
+# describe.c:745
+# describe.c:1478
+# describe.c:1587
+#: sql_help.c:2162 sql_help.c:2211
+msgid "lc_ctype"
+msgstr "lc_ctype"
+
+#: sql_help.c:2163 sql_help.c:4463
+msgid "provider"
+msgstr "provider"
+
+# describe.c:559
+#: sql_help.c:2165
+msgid "rules"
+msgstr "rules"
+
+#: sql_help.c:2166 sql_help.c:2271
+msgid "version"
+msgstr "version"
+
+# describe.c:1636
+#: sql_help.c:2168
+msgid "existing_collation"
+msgstr "existing_collation"
+
+# describe.c:187
+#: sql_help.c:2178
+msgid "source_encoding"
+msgstr "source_encoding"
+
+# describe.c:365
+#: sql_help.c:2179
+msgid "dest_encoding"
+msgstr "dest_encoding"
+
+#: sql_help.c:2206 sql_help.c:3047
+msgid "template"
+msgstr "template"
+
+# describe.c:365
+#: sql_help.c:2207
+msgid "encoding"
+msgstr "encoding"
+
+#: sql_help.c:2208
+msgid "strategy"
+msgstr "strategy"
+
+# help.c:127
+#: sql_help.c:2212
+msgid "icu_locale"
+msgstr "icu_locale"
+
+# describe.c:559
+#: sql_help.c:2213
+msgid "icu_rules"
+msgstr "icu_rules"
+
+#: sql_help.c:2214
+msgid "locale_provider"
+msgstr "locale_provider"
+
+#: sql_help.c:2215
+msgid "collation_version"
+msgstr "collation_version"
+
+#: sql_help.c:2220
+msgid "oid"
+msgstr "oid"
+
+# catalog/dependency.c:1511
+#: sql_help.c:2240
+msgid "constraint"
+msgstr "constraint"
+
+# describe.c:1174
+#: sql_help.c:2241
+msgid "where constraint is:"
+msgstr "其中 constraint 是:"
+
+#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120
+msgid "event"
+msgstr "event"
+
+#: sql_help.c:2256
+msgid "filter_variable"
+msgstr "filter_variable"
+
+#: sql_help.c:2257
+msgid "filter_value"
+msgstr "filter_value"
+
+# describe.c:1174
+#: sql_help.c:2353 sql_help.c:2939
+msgid "where column_constraint is:"
+msgstr "其中 column_constraint 是:"
+
+# describe.c:1689
+#: sql_help.c:2398
+msgid "rettype"
+msgstr "rettype"
+
+#: sql_help.c:2400
+msgid "column_type"
+msgstr "column_type"
+
+# describe.c:977
+#: sql_help.c:2409 sql_help.c:2612
+msgid "definition"
+msgstr "definition"
+
+#: sql_help.c:2410 sql_help.c:2613
+msgid "obj_file"
+msgstr "obj_file"
+
+# utils/adt/encode.c:307
+#: sql_help.c:2411 sql_help.c:2614
+msgid "link_symbol"
+msgstr "link_symbol"
+
+#: sql_help.c:2412 sql_help.c:2615
+msgid "sql_body"
+msgstr "sql_body"
+
+#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243
+msgid "uid"
+msgstr "uid"
+
+#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921
+#: sql_help.c:2935 sql_help.c:3003
+msgid "method"
+msgstr "method"
+
+#: sql_help.c:2471
+msgid "opclass_parameter"
+msgstr "opclass_parameter"
+
+#: sql_help.c:2488
+msgid "call_handler"
+msgstr "call_handler"
+
+#: sql_help.c:2489
+msgid "inline_handler"
+msgstr "inline_handler"
+
+# describe.c:498
+#: sql_help.c:2490
+msgid "valfunction"
+msgstr "valfunction"
+
+#: sql_help.c:2529
+msgid "com_op"
+msgstr "com_op"
+
+#: sql_help.c:2530
+msgid "neg_op"
+msgstr "neg_op"
+
+#: sql_help.c:2548
+msgid "family_name"
+msgstr "family_name"
+
+# describe.c:1635
+#: sql_help.c:2559
+msgid "storage_type"
+msgstr "storage_type"
+
+#: sql_help.c:2698 sql_help.c:3127
+msgid "where event can be one of:"
+msgstr "其中 event å¯ä»¥æ˜¯:"
+
+#: sql_help.c:2718 sql_help.c:2720
+msgid "schema_element"
+msgstr "schema_element"
+
+#: sql_help.c:2757
+msgid "server_type"
+msgstr "server_type"
+
+# utils/misc/guc.c:1652
+#: sql_help.c:2758
+msgid "server_version"
+msgstr "server_version"
+
+#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360
+msgid "fdw_name"
+msgstr "fdw_name"
+
+# utils/misc/guc.c:279
+#: sql_help.c:2776 sql_help.c:2779
+msgid "statistics_name"
+msgstr "statistics_name"
+
+# utils/misc/guc.c:279
+#: sql_help.c:2780
+msgid "statistics_kind"
+msgstr "statistics_kind"
+
+# describe.c:498
+#: sql_help.c:2796
+msgid "subscription_name"
+msgstr "subscription_name"
+
+# describe.c:1688
+#: sql_help.c:2901
+msgid "source_table"
+msgstr "source_table"
+
+# help.c:88
+#: sql_help.c:2902
+msgid "like_option"
+msgstr "like_option"
+
+#: sql_help.c:2968
+msgid "and like_option is:"
+msgstr "且 like_option 是:"
+
+#: sql_help.c:3020
+msgid "directory"
+msgstr "directory"
+
+#: sql_help.c:3034
+msgid "parser_name"
+msgstr "parser_name"
+
+#: sql_help.c:3035
+msgid "source_config"
+msgstr "source_config"
+
+# describe.c:498
+#: sql_help.c:3064
+msgid "start_function"
+msgstr "start_function"
+
+# sql_help.h:249
+#: sql_help.c:3065
+msgid "gettoken_function"
+msgstr "gettoken_function"
+
+# describe.c:498
+#: sql_help.c:3066
+msgid "end_function"
+msgstr "end_function"
+
+# describe.c:498
+#: sql_help.c:3067
+msgid "lextypes_function"
+msgstr "lextypes_function"
+
+# describe.c:498
+#: sql_help.c:3068
+msgid "headline_function"
+msgstr "headline_function"
+
+# describe.c:498
+#: sql_help.c:3080
+msgid "init_function"
+msgstr "init_function"
+
+# describe.c:498
+#: sql_help.c:3081
+msgid "lexize_function"
+msgstr "lexize_function"
+
+# describe.c:498
+#: sql_help.c:3094
+msgid "from_sql_function_name"
+msgstr "from_sql_function_name"
+
+# describe.c:498
+#: sql_help.c:3096
+msgid "to_sql_function_name"
+msgstr "to_sql_function_name"
+
+#: sql_help.c:3122
+msgid "referenced_table_name"
+msgstr "referenced_table_name"
+
+#: sql_help.c:3123
+msgid "transition_relation_name"
+msgstr "transition_relation_name"
+
+# utils/adt/regproc.c:644 utils/adt/regproc.c:1276
+#: sql_help.c:3126
+msgid "arguments"
+msgstr "arguments"
+
+#: sql_help.c:3178
+msgid "label"
+msgstr "label"
+
+# describe.c:415
+# describe.c:745
+# describe.c:1478
+# describe.c:1587
+#: sql_help.c:3180
+msgid "subtype"
+msgstr "subtype"
+
+# describe.c:512
+#: sql_help.c:3181
+msgid "subtype_operator_class"
+msgstr "subtype_operator_class"
+
+# describe.c:498
+#: sql_help.c:3183
+msgid "canonical_function"
+msgstr "canonical_function"
+
+# describe.c:498
+#: sql_help.c:3184
+msgid "subtype_diff_function"
+msgstr "subtype_diff_function"
+
+# describe.c:1635
+#: sql_help.c:3185
+msgid "multirange_type_name"
+msgstr "multirange_type_name"
+
+# describe.c:498
+#: sql_help.c:3187
+msgid "input_function"
+msgstr "input_function"
+
+# describe.c:498
+#: sql_help.c:3188
+msgid "output_function"
+msgstr "output_function"
+
+# sql_help.h:249
+#: sql_help.c:3189
+msgid "receive_function"
+msgstr "receive_function"
+
+# describe.c:498
+#: sql_help.c:3190
+msgid "send_function"
+msgstr "send_function"
+
+#: sql_help.c:3191
+msgid "type_modifier_input_function"
+msgstr "type_modifier_input_function"
+
+#: sql_help.c:3192
+msgid "type_modifier_output_function"
+msgstr "type_modifier_output_function"
+
+# describe.c:498
+#: sql_help.c:3193
+msgid "analyze_function"
+msgstr "analyze_function"
+
+# describe.c:498
+#: sql_help.c:3194
+msgid "subscript_function"
+msgstr "subscript_function"
+
+#: sql_help.c:3195
+msgid "internallength"
+msgstr "internallength"
+
+#: sql_help.c:3196
+msgid "alignment"
+msgstr "alignment"
+
+# describe.c:1635
+#: sql_help.c:3197
+msgid "storage"
+msgstr "storage"
+
+#: sql_help.c:3198
+msgid "like_type"
+msgstr "like_type"
+
+#: sql_help.c:3199
+msgid "category"
+msgstr "category"
+
+#: sql_help.c:3200
+msgid "preferred"
+msgstr "preferred"
+
+# describe.c:1639
+#: sql_help.c:3201
+msgid "default"
+msgstr "default"
+
+#: sql_help.c:3202
+msgid "element"
+msgstr "element"
+
+# utils/adt/encode.c:295
+#: sql_help.c:3203
+msgid "delimiter"
+msgstr "delimiter"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:3204
+msgid "collatable"
+msgstr "collatable"
+
+#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560
+#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063
+msgid "with_query"
+msgstr "with_query"
+
+#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585
+#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604
+#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849
+#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082
+#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099
+#: sql_help.c:5107
+msgid "alias"
+msgstr "alias"
+
+#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608
+#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616
+#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865
+#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873
+#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111
+#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119
+msgid "from_item"
+msgstr "from_item"
+
+#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941
+msgid "cursor_name"
+msgstr "cursor_name"
+
+# commands/typecmds.c:637
+#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942
+msgid "output_expression"
+msgstr "output_expression"
+
+#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665
+#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066
+msgid "output_name"
+msgstr "output_name"
+
+#: sql_help.c:3324
+msgid "code"
+msgstr "code"
+
+#: sql_help.c:3729
+msgid "parameter"
+msgstr "parameter"
+
+#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152
+msgid "statement"
+msgstr "statement"
+
+# help.c:123
+#: sql_help.c:3788 sql_help.c:4126
+msgid "direction"
+msgstr "direction"
+
+#: sql_help.c:3790 sql_help.c:4128
+msgid "where direction can be one of:"
+msgstr "其中 direction å¯ä»¥æ˜¯:"
+
+#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794
+#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131
+#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575
+#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832
+#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078
+msgid "count"
+msgstr "count"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:3898 sql_help.c:4350
+msgid "sequence_name"
+msgstr "sequence_name"
+
+#: sql_help.c:3916 sql_help.c:4368
+msgid "arg_name"
+msgstr "arg_name"
+
+# describe.c:1689
+#: sql_help.c:3917 sql_help.c:4369
+msgid "arg_type"
+msgstr "arg_type"
+
+#: sql_help.c:3924 sql_help.c:4376
+msgid "loid"
+msgstr "loid"
+
+# sql_help.h:277
+#: sql_help.c:3955
+msgid "remote_schema"
+msgstr "remote_schema"
+
+# describe.c:82
+# describe.c:177
+# describe.c:247
+# describe.c:320
+# describe.c:415
+# describe.c:469
+# describe.c:1476
+# describe.c:1585
+# describe.c:1633
+#: sql_help.c:3958
+msgid "local_schema"
+msgstr "local_schema"
+
+#: sql_help.c:3993
+msgid "conflict_target"
+msgstr "conflict_target"
+
+# describe.c:128
+#: sql_help.c:3994
+msgid "conflict_action"
+msgstr "conflict_action"
+
+#: sql_help.c:3997
+msgid "where conflict_target can be one of:"
+msgstr "其中 conflict_target å¯ä»¥æ˜¯:"
+
+# describe.c:1375
+#: sql_help.c:3998
+msgid "index_column_name"
+msgstr "index_column_name"
+
+#: sql_help.c:3999
+msgid "index_expression"
+msgstr "index_expression"
+
+# describe.c:937
+#: sql_help.c:4002
+msgid "index_predicate"
+msgstr "index_predicate"
+
+#: sql_help.c:4004
+msgid "and conflict_action is one of:"
+msgstr "其中 conflict_action å¯ä»¥æ˜¯:"
+
+#: sql_help.c:4010 sql_help.c:4938
+msgid "sub-SELECT"
+msgstr "sub-SELECT"
+
+#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914
+msgid "channel"
+msgstr "channel"
+
+#: sql_help.c:4041
+msgid "lockmode"
+msgstr "lockmode"
+
+#: sql_help.c:4042
+msgid "where lockmode is one of:"
+msgstr "其中 lockmode å¯ä»¥æ˜¯:"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:4078
+msgid "target_table_name"
+msgstr "target_table_name"
+
+#: sql_help.c:4079
+msgid "target_alias"
+msgstr "target_alias"
+
+# describe.c:526
+#: sql_help.c:4080
+msgid "data_source"
+msgstr "data_source"
+
+#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112
+msgid "join_condition"
+msgstr "join_condition"
+
+#: sql_help.c:4082
+msgid "when_clause"
+msgstr "when_clause"
+
+#: sql_help.c:4083
+msgid "where data_source is:"
+msgstr "其中 data_source 是:"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:4084
+msgid "source_table_name"
+msgstr "source_table_name"
+
+# describe.c:1688
+#: sql_help.c:4085
+msgid "source_query"
+msgstr "source_query"
+
+#: sql_help.c:4086
+msgid "source_alias"
+msgstr "source_alias"
+
+#: sql_help.c:4087
+msgid "and when_clause is:"
+msgstr "且 when_clause 是:"
+
+#: sql_help.c:4089
+msgid "merge_update"
+msgstr "merge_update"
+
+#: sql_help.c:4090
+msgid "merge_delete"
+msgstr "merge_delete"
+
+#: sql_help.c:4092
+msgid "merge_insert"
+msgstr "merge_insert"
+
+# catalog/dependency.c:1511
+#: sql_help.c:4093
+msgid "and merge_insert is:"
+msgstr "且 merge_insert 是:"
+
+#: sql_help.c:4096
+msgid "and merge_update is:"
+msgstr "且 merge_update 是:"
+
+#: sql_help.c:4101
+msgid "and merge_delete is:"
+msgstr "且 merge_delete 是:"
+
+#: sql_help.c:4142
+msgid "payload"
+msgstr "payload"
+
+#: sql_help.c:4169
+msgid "old_role"
+msgstr "old_role"
+
+#: sql_help.c:4170
+msgid "new_role"
+msgstr "new_role"
+
+# sql_help.h:382
+#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426
+msgid "savepoint_name"
+msgstr "savepoint_name"
+
+# utils/adt/arrayfuncs.c:1168
+#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881
+#: sql_help.c:5069 sql_help.c:5127
+msgid "grouping_element"
+msgstr "grouping_element"
+
+#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071
+msgid "window_name"
+msgstr "window_name"
+
+# describe.c:977
+#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072
+msgid "window_definition"
+msgstr "window_definition"
+
+#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673
+#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073
+#: sql_help.c:5087 sql_help.c:5131
+msgid "select"
+msgstr "select"
+
+#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080
+msgid "where from_item can be one of:"
+msgstr "其中 from_item å¯ä»¥æ˜¯:"
+
+#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593
+#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846
+#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089
+#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108
+msgid "column_alias"
+msgstr "column_alias"
+
+#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084
+msgid "sampling_method"
+msgstr "sampling_method"
+
+#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086
+msgid "seed"
+msgstr "seed"
+
+#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883
+#: sql_help.c:5090 sql_help.c:5129
+msgid "with_query_name"
+msgstr "with_query_name"
+
+# describe.c:977
+#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854
+#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103
+#: sql_help.c:5106
+msgid "column_definition"
+msgstr "column_definition"
+
+#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870
+#: sql_help.c:5110 sql_help.c:5116
+msgid "join_type"
+msgstr "join_type"
+
+#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113
+msgid "join_column"
+msgstr "join_column"
+
+#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114
+msgid "join_using_alias"
+msgstr "join_using_alias"
+
+#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120
+msgid "and grouping_element can be one of:"
+msgstr "其中 grouping_element å¯ä»¥æ˜¯:"
+
+#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128
+msgid "and with_query is:"
+msgstr "且 with_query 是:"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132
+msgid "values"
+msgstr "values"
+
+#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133
+msgid "insert"
+msgstr "insert"
+
+#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134
+msgid "update"
+msgstr "update"
+
+#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135
+msgid "delete"
+msgstr "delete"
+
+#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137
+msgid "search_seq_col_name"
+msgstr "search_seq_col_name"
+
+#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139
+msgid "cycle_mark_col_name"
+msgstr "cycle_mark_col_name"
+
+#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140
+msgid "cycle_mark_value"
+msgstr "cycle_mark_value"
+
+#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141
+msgid "cycle_mark_default"
+msgstr "cycle_mark_default"
+
+#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142
+msgid "cycle_path_col_name"
+msgstr "cycle_path_col_name"
+
+# describe.c:415
+# describe.c:543
+# describe.c:1477
+#: sql_help.c:4666
+msgid "new_table"
+msgstr "new_table"
+
+#: sql_help.c:4737
+msgid "snapshot_id"
+msgstr "snapshot_id"
+
+#: sql_help.c:5005
+msgid "sort_expression"
+msgstr "sort_expression"
+
+# sql_help.h:25
+# sql_help.h:373
+#: sql_help.c:5149 sql_help.c:6133
+msgid "abort the current transaction"
+msgstr "中止目å‰çš„交易"
+
+# sql_help.h:29
+#: sql_help.c:5155
+msgid "change the definition of an aggregate function"
+msgstr "變更èšåˆå‡½æ•¸çš„定義"
+
+# sql_help.h:45
+#: sql_help.c:5161
+msgid "change the definition of a collation"
+msgstr "變更定åºçš„定義"
+
+# sql_help.h:33
+#: sql_help.c:5167
+msgid "change the definition of a conversion"
+msgstr "變更編碼轉æ›çš„定義"
+
+# sql_help.h:37
+#: sql_help.c:5173
+msgid "change a database"
+msgstr "變更資料庫"
+
+# sql_help.h:325
+#: sql_help.c:5179
+msgid "define default access privileges"
+msgstr "定義é è¨­å­˜å–權é™"
+
+# sql_help.h:41
+#: sql_help.c:5185
+msgid "change the definition of a domain"
+msgstr "變更 domain 的定義"
+
+# sql_help.h:85
+#: sql_help.c:5191
+msgid "change the definition of an event trigger"
+msgstr "變更事件觸發器的定義"
+
+# sql_help.h:33
+#: sql_help.c:5197
+msgid "change the definition of an extension"
+msgstr "變更擴充功能的定義"
+
+# sql_help.h:85
+#: sql_help.c:5203
+msgid "change the definition of a foreign-data wrapper"
+msgstr "變更外部資料å°è£ç¨‹å¼çš„定義"
+
+# sql_help.h:85
+#: sql_help.c:5209
+msgid "change the definition of a foreign table"
+msgstr "變更外部資料表的定義"
+
+# sql_help.h:45
+#: sql_help.c:5215
+msgid "change the definition of a function"
+msgstr "變更函數的定義"
+
+#: sql_help.c:5221
+msgid "change role name or membership"
+msgstr "變更角色å稱或æˆå“¡"
+
+# sql_help.h:53
+#: sql_help.c:5227
+msgid "change the definition of an index"
+msgstr "變更索引的定義"
+
+# sql_help.h:57
+#: sql_help.c:5233
+msgid "change the definition of a procedural language"
+msgstr "變更程åºèªžè¨€çš„定義"
+
+# sql_help.h:77
+#: sql_help.c:5239
+msgid "change the definition of a large object"
+msgstr "變更大物件的定義"
+
+# sql_help.h:53
+#: sql_help.c:5245
+msgid "change the definition of a materialized view"
+msgstr "變更實體化檢視表的定義"
+
+# sql_help.h:65
+#: sql_help.c:5251
+msgid "change the definition of an operator"
+msgstr "變更é‹ç®—符的定義"
+
+# sql_help.h:61
+#: sql_help.c:5257
+msgid "change the definition of an operator class"
+msgstr "變更é‹ç®—符類別的定義"
+
+# sql_help.h:65
+#: sql_help.c:5263
+msgid "change the definition of an operator family"
+msgstr "變更é‹ç®—符æ—群的定義"
+
+# sql_help.h:33
+#: sql_help.c:5269
+msgid "change the definition of a row-level security policy"
+msgstr "變更列層級安全政策的定義"
+
+# sql_help.h:57
+#: sql_help.c:5275
+msgid "change the definition of a procedure"
+msgstr "變更程åºçš„定義"
+
+# sql_help.h:45
+#: sql_help.c:5281
+msgid "change the definition of a publication"
+msgstr "變更發布的定義"
+
+# sql_help.h:37
+#: sql_help.c:5287 sql_help.c:5389
+msgid "change a database role"
+msgstr "變更資料庫角色"
+
+# sql_help.h:45
+#: sql_help.c:5293
+msgid "change the definition of a routine"
+msgstr "變更 routine 的定義"
+
+# sql_help.h:77
+#: sql_help.c:5299
+msgid "change the definition of a rule"
+msgstr "變更è¦å‰‡çš„定義"
+
+# sql_help.h:69
+#: sql_help.c:5305
+msgid "change the definition of a schema"
+msgstr "變更 schema 的定義"
+
+# sql_help.h:73
+#: sql_help.c:5311
+msgid "change the definition of a sequence generator"
+msgstr "變更åºåˆ—產生器的定義"
+
+# sql_help.h:85
+#: sql_help.c:5317
+msgid "change the definition of a foreign server"
+msgstr "變更外部伺æœå™¨çš„定義"
+
+# sql_help.h:33
+#: sql_help.c:5323
+msgid "change the definition of an extended statistics object"
+msgstr "變更擴展統計物件的定義"
+
+# sql_help.h:45
+#: sql_help.c:5329
+msgid "change the definition of a subscription"
+msgstr "變更訂閱的定義"
+
+# sql_help.h:366
+#: sql_help.c:5335
+msgid "change a server configuration parameter"
+msgstr "變更伺æœå™¨çµ„æ…‹åƒæ•¸"
+
+# sql_help.h:77
+#: sql_help.c:5341
+msgid "change the definition of a table"
+msgstr "變更資料表的定義"
+
+# sql_help.h:81
+#: sql_help.c:5347
+msgid "change the definition of a tablespace"
+msgstr "變更表空間的定義"
+
+# sql_help.h:33
+#: sql_help.c:5353
+msgid "change the definition of a text search configuration"
+msgstr "變更文字æœå°‹çµ„態的定義"
+
+# sql_help.h:45
+#: sql_help.c:5359
+msgid "change the definition of a text search dictionary"
+msgstr "變更文字æœå°‹å­—典的定義"
+
+# sql_help.h:81
+#: sql_help.c:5365
+msgid "change the definition of a text search parser"
+msgstr "變更文字æœå°‹è§£æžå™¨çš„定義"
+
+# sql_help.h:69
+#: sql_help.c:5371
+msgid "change the definition of a text search template"
+msgstr "變更文字æœå°‹ç¯„本的定義"
+
+# sql_help.h:85
+#: sql_help.c:5377
+msgid "change the definition of a trigger"
+msgstr "變更觸發器的定義"
+
+# sql_help.h:89
+#: sql_help.c:5383
+msgid "change the definition of a type"
+msgstr "變更型別的定義"
+
+# sql_help.h:41
+#: sql_help.c:5395
+msgid "change the definition of a user mapping"
+msgstr "變更使用者映射的定義"
+
+# sql_help.h:53
+#: sql_help.c:5401
+msgid "change the definition of a view"
+msgstr "變更檢視表的定義"
+
+# sql_help.h:97
+#: sql_help.c:5407
+msgid "collect statistics about a database"
+msgstr "收集資料庫的統計資料"
+
+# sql_help.h:101
+# sql_help.h:413
+#: sql_help.c:5413 sql_help.c:6211
+msgid "start a transaction block"
+msgstr "開始交易å€å¡Š"
+
+# sql_help.h:261
+#: sql_help.c:5419
+msgid "invoke a procedure"
+msgstr "呼å«ç¨‹åº"
+
+# sql_help.h:105
+#: sql_help.c:5425
+msgid "force a write-ahead log checkpoint"
+msgstr "強制執行 write-ahead 日誌檢查點"
+
+# sql_help.h:109
+#: sql_help.c:5431
+msgid "close a cursor"
+msgstr "關閉游標"
+
+# sql_help.h:113
+#: sql_help.c:5437
+msgid "cluster a table according to an index"
+msgstr "根據索引å°è³‡æ–™è¡¨é€²è¡Œåˆ†ç¾¤"
+
+# sql_help.h:117
+#: sql_help.c:5443
+msgid "define or change the comment of an object"
+msgstr "建立或修改物件的註解"
+
+# sql_help.h:121
+# sql_help.h:309
+#: sql_help.c:5449 sql_help.c:6007
+msgid "commit the current transaction"
+msgstr "æ交目å‰çš„交易"
+
+#: sql_help.c:5455
+msgid "commit a transaction that was earlier prepared for two-phase commit"
+msgstr "æ交之å‰ç‚ºå…©éšŽæ®µæ交所準備的交易"
+
+# sql_help.h:125
+#: sql_help.c:5461
+msgid "copy data between a file and a table"
+msgstr "在檔案和資料表間複製資料"
+
+# sql_help.h:133
+#: sql_help.c:5467
+msgid "define a new access method"
+msgstr "建立存å–æ–¹å¼"
+
+# sql_help.h:129
+#: sql_help.c:5473
+msgid "define a new aggregate function"
+msgstr "建立èšåˆå‡½æ•¸"
+
+# sql_help.h:133
+#: sql_help.c:5479
+msgid "define a new cast"
+msgstr "建立轉型"
+
+# sql_help.h:153
+#: sql_help.c:5485
+msgid "define a new collation"
+msgstr "建立定åº"
+
+# sql_help.h:141
+#: sql_help.c:5491
+msgid "define a new encoding conversion"
+msgstr "建立編碼轉æ›"
+
+# sql_help.h:145
+#: sql_help.c:5497
+msgid "create a new database"
+msgstr "建立資料庫"
+
+# sql_help.h:149
+#: sql_help.c:5503
+msgid "define a new domain"
+msgstr "建立 domain"
+
+# sql_help.h:201
+#: sql_help.c:5509
+msgid "define a new event trigger"
+msgstr "建立事件觸發器"
+
+#: sql_help.c:5515
+msgid "install an extension"
+msgstr "安è£æ“´å……模組"
+
+# sql_help.h:205
+#: sql_help.c:5521
+msgid "define a new foreign-data wrapper"
+msgstr "建立外部資料å°è£ç¨‹å¼"
+
+# sql_help.h:201
+#: sql_help.c:5527
+msgid "define a new foreign table"
+msgstr "建立外部資料表"
+
+# sql_help.h:153
+#: sql_help.c:5533
+msgid "define a new function"
+msgstr "建立函數"
+
+# sql_help.h:189
+#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701
+msgid "define a new database role"
+msgstr "建立資料庫角色"
+
+# sql_help.h:161
+#: sql_help.c:5545
+msgid "define a new index"
+msgstr "建立索引"
+
+# sql_help.h:165
+#: sql_help.c:5551
+msgid "define a new procedural language"
+msgstr "建立程åºèªžè¨€"
+
+# sql_help.h:213
+#: sql_help.c:5557
+msgid "define a new materialized view"
+msgstr "建立實體化檢視表"
+
+# sql_help.h:173
+#: sql_help.c:5563
+msgid "define a new operator"
+msgstr "建立é‹ç®—符"
+
+# sql_help.h:169
+#: sql_help.c:5569
+msgid "define a new operator class"
+msgstr "建立é‹ç®—符類別"
+
+# sql_help.h:173
+#: sql_help.c:5575
+msgid "define a new operator family"
+msgstr "建立é‹ç®—符æ—群"
+
+#: sql_help.c:5581
+msgid "define a new row-level security policy for a table"
+msgstr "為資料表建立列層級安全政策"
+
+# sql_help.h:165
+#: sql_help.c:5587
+msgid "define a new procedure"
+msgstr "建立程åº"
+
+# sql_help.h:153
+#: sql_help.c:5593
+msgid "define a new publication"
+msgstr "建立發布"
+
+# sql_help.h:177
+#: sql_help.c:5605
+msgid "define a new rewrite rule"
+msgstr "建立é‡å¯«è¦å‰‡"
+
+# sql_help.h:181
+#: sql_help.c:5611
+msgid "define a new schema"
+msgstr "建立 schema"
+
+# sql_help.h:185
+#: sql_help.c:5617
+msgid "define a new sequence generator"
+msgstr "建立åºåˆ—產生器"
+
+# sql_help.h:201
+#: sql_help.c:5623
+msgid "define a new foreign server"
+msgstr "建立外部伺æœå™¨"
+
+# sql_help.h:133
+#: sql_help.c:5629
+msgid "define extended statistics"
+msgstr "建立擴展統計"
+
+# sql_help.h:153
+#: sql_help.c:5635
+msgid "define a new subscription"
+msgstr "建立訂閱"
+
+# sql_help.h:189
+#: sql_help.c:5641
+msgid "define a new table"
+msgstr "建立資料表"
+
+# sql_help.h:193
+# sql_help.h:389
+#: sql_help.c:5647 sql_help.c:6169
+msgid "define a new table from the results of a query"
+msgstr "以查詢çµæžœå»ºç«‹è³‡æ–™è¡¨"
+
+# sql_help.h:197
+#: sql_help.c:5653
+msgid "define a new tablespace"
+msgstr "建立表空間"
+
+# sql_help.h:129
+#: sql_help.c:5659
+msgid "define a new text search configuration"
+msgstr "建立文字æœå°‹çµ„æ…‹"
+
+# sql_help.h:129
+#: sql_help.c:5665
+msgid "define a new text search dictionary"
+msgstr "建立文字æœå°‹å­—å…¸"
+
+# sql_help.h:197
+#: sql_help.c:5671
+msgid "define a new text search parser"
+msgstr "建立文字æœå°‹è§£æžå™¨"
+
+# sql_help.h:181
+#: sql_help.c:5677
+msgid "define a new text search template"
+msgstr "建立文字æœå°‹ç¯„本"
+
+# sql_help.h:173
+#: sql_help.c:5683
+msgid "define a new transform"
+msgstr "建立 transform"
+
+# sql_help.h:201
+#: sql_help.c:5689
+msgid "define a new trigger"
+msgstr "建立觸發器"
+
+# sql_help.h:205
+#: sql_help.c:5695
+msgid "define a new data type"
+msgstr "建立資料型別"
+
+#: sql_help.c:5707
+msgid "define a new mapping of a user to a foreign server"
+msgstr "建立使用者至外部伺æœå™¨çš„映射"
+
+# sql_help.h:213
+#: sql_help.c:5713
+msgid "define a new view"
+msgstr "建立檢視表"
+
+# sql_help.h:217
+#: sql_help.c:5719
+msgid "deallocate a prepared statement"
+msgstr "釋放已編譯陳述å¼"
+
+# sql_help.h:221
+#: sql_help.c:5725
+msgid "define a cursor"
+msgstr "建立游標"
+
+# sql_help.h:225
+#: sql_help.c:5731
+msgid "delete rows of a table"
+msgstr "刪除資料表中的資料列"
+
+#: sql_help.c:5737
+msgid "discard session state"
+msgstr "拋棄工作階段狀態"
+
+#: sql_help.c:5743
+msgid "execute an anonymous code block"
+msgstr "執行匿å程å¼å€å¡Š"
+
+# sql_help.h:233
+#: sql_help.c:5749
+msgid "remove an access method"
+msgstr "刪除存å–æ–¹å¼"
+
+# sql_help.h:229
+#: sql_help.c:5755
+msgid "remove an aggregate function"
+msgstr "刪除èšåˆå‡½æ•¸"
+
+# sql_help.h:233
+#: sql_help.c:5761
+msgid "remove a cast"
+msgstr "刪除轉型"
+
+# sql_help.h:249
+#: sql_help.c:5767
+msgid "remove a collation"
+msgstr "刪除定åº"
+
+# sql_help.h:237
+#: sql_help.c:5773
+msgid "remove a conversion"
+msgstr "刪除編碼轉æ›"
+
+# sql_help.h:241
+#: sql_help.c:5779
+msgid "remove a database"
+msgstr "刪除資料庫"
+
+# sql_help.h:245
+#: sql_help.c:5785
+msgid "remove a domain"
+msgstr "刪除 domain"
+
+# sql_help.h:293
+#: sql_help.c:5791
+msgid "remove an event trigger"
+msgstr "刪除事件觸發器"
+
+# sql_help.h:237
+#: sql_help.c:5797
+msgid "remove an extension"
+msgstr "刪除擴充模組"
+
+# sql_help.h:297
+#: sql_help.c:5803
+msgid "remove a foreign-data wrapper"
+msgstr "刪除外部資料å°è£ç¨‹å¼"
+
+# sql_help.h:285
+#: sql_help.c:5809
+msgid "remove a foreign table"
+msgstr "刪除外部資料表"
+
+# sql_help.h:249
+#: sql_help.c:5815
+msgid "remove a function"
+msgstr "刪除函數"
+
+# sql_help.h:241
+#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989
+msgid "remove a database role"
+msgstr "刪除資料庫角色"
+
+# sql_help.h:257
+#: sql_help.c:5827
+msgid "remove an index"
+msgstr "刪除索引"
+
+# sql_help.h:261
+#: sql_help.c:5833
+msgid "remove a procedural language"
+msgstr "刪除程åºèªžè¨€"
+
+# sql_help.h:305
+#: sql_help.c:5839
+msgid "remove a materialized view"
+msgstr "刪除實體化檢視表"
+
+# sql_help.h:269
+#: sql_help.c:5845
+msgid "remove an operator"
+msgstr "刪除é‹ç®—符"
+
+# sql_help.h:265
+#: sql_help.c:5851
+msgid "remove an operator class"
+msgstr "刪除é‹ç®—符類別"
+
+# sql_help.h:269
+#: sql_help.c:5857
+msgid "remove an operator family"
+msgstr "刪除é‹ç®—符æ—群"
+
+#: sql_help.c:5863
+msgid "remove database objects owned by a database role"
+msgstr "刪除資料庫角色æ“有的資料庫物件"
+
+#: sql_help.c:5869
+msgid "remove a row-level security policy from a table"
+msgstr "刪除資料表的列層級安全政策"
+
+# sql_help.h:261
+#: sql_help.c:5875
+msgid "remove a procedure"
+msgstr "刪除程åº"
+
+# sql_help.h:249
+#: sql_help.c:5881
+msgid "remove a publication"
+msgstr "刪除發布"
+
+# sql_help.h:249
+#: sql_help.c:5893
+msgid "remove a routine"
+msgstr "刪除 routine"
+
+# sql_help.h:273
+#: sql_help.c:5899
+msgid "remove a rewrite rule"
+msgstr "刪除é‡å¯«è¦å‰‡"
+
+# sql_help.h:277
+#: sql_help.c:5905
+msgid "remove a schema"
+msgstr "刪除 schema"
+
+# sql_help.h:281
+#: sql_help.c:5911
+msgid "remove a sequence"
+msgstr "刪除åºåˆ—"
+
+# sql_help.h:237
+#: sql_help.c:5917
+msgid "remove a foreign server descriptor"
+msgstr "刪除外部伺æœå™¨æ述符"
+
+# sql_help.h:237
+#: sql_help.c:5923
+msgid "remove extended statistics"
+msgstr "刪除擴展統計"
+
+# sql_help.h:249
+#: sql_help.c:5929
+msgid "remove a subscription"
+msgstr "刪除訂閱"
+
+# sql_help.h:285
+#: sql_help.c:5935
+msgid "remove a table"
+msgstr "刪除資料表"
+
+# sql_help.h:289
+#: sql_help.c:5941
+msgid "remove a tablespace"
+msgstr "刪除表空間"
+
+# sql_help.h:301
+#: sql_help.c:5947
+msgid "remove a text search configuration"
+msgstr "刪除文字æœå°‹çµ„æ…‹"
+
+# sql_help.h:301
+#: sql_help.c:5953
+msgid "remove a text search dictionary"
+msgstr "刪除文字æœå°‹å­—å…¸"
+
+# sql_help.h:289
+#: sql_help.c:5959
+msgid "remove a text search parser"
+msgstr "刪除文字æœå°‹è§£æžå™¨"
+
+# sql_help.h:277
+#: sql_help.c:5965
+msgid "remove a text search template"
+msgstr "刪除文字æœå°‹ç¯„本"
+
+# sql_help.h:269
+#: sql_help.c:5971
+msgid "remove a transform"
+msgstr "刪除 transform"
+
+# sql_help.h:293
+#: sql_help.c:5977
+msgid "remove a trigger"
+msgstr "刪除觸發器"
+
+# sql_help.h:297
+#: sql_help.c:5983
+msgid "remove a data type"
+msgstr "刪除資料型別"
+
+#: sql_help.c:5995
+msgid "remove a user mapping for a foreign server"
+msgstr "刪除外部伺æœå™¨çš„使用者映射"
+
+# sql_help.h:305
+#: sql_help.c:6001
+msgid "remove a view"
+msgstr "刪除檢視表"
+
+# sql_help.h:313
+#: sql_help.c:6013
+msgid "execute a prepared statement"
+msgstr "執行已編譯陳述å¼"
+
+# sql_help.h:317
+#: sql_help.c:6019
+msgid "show the execution plan of a statement"
+msgstr "顯示陳述å¼çš„執行計劃"
+
+# sql_help.h:321
+#: sql_help.c:6025
+msgid "retrieve rows from a query using a cursor"
+msgstr "使用游標擷å–查詢的資料列"
+
+# sql_help.h:325
+#: sql_help.c:6031
+msgid "define access privileges"
+msgstr "定義存å–權é™"
+
+# sql_help.h:85
+#: sql_help.c:6037
+msgid "import table definitions from a foreign server"
+msgstr "從外部伺æœå™¨åŒ¯å…¥è³‡æ–™è¡¨å®šç¾©"
+
+# sql_help.h:329
+#: sql_help.c:6043
+msgid "create new rows in a table"
+msgstr "在資料表中建立新的資料列"
+
+# sql_help.h:333
+#: sql_help.c:6049
+msgid "listen for a notification"
+msgstr "監è½é€šçŸ¥"
+
+# sql_help.h:337
+#: sql_help.c:6055
+msgid "load a shared library file"
+msgstr "載入共用程å¼åº«æª”案"
+
+# sql_help.h:341
+#: sql_help.c:6061
+msgid "lock a table"
+msgstr "鎖定資料表"
+
+#: sql_help.c:6067
+msgid "conditionally insert, update, or delete rows of a table"
+msgstr "有æ¢ä»¶åœ°æ’å…¥ã€æ›´æ–°æˆ–刪除資料表的資料列"
+
+# sql_help.h:345
+#: sql_help.c:6073
+msgid "position a cursor"
+msgstr "移動游標ä½ç½®"
+
+# sql_help.h:349
+#: sql_help.c:6079
+msgid "generate a notification"
+msgstr "產生通知"
+
+# sql_help.h:353
+#: sql_help.c:6085
+msgid "prepare a statement for execution"
+msgstr "é å…ˆç·¨è­¯é™³è¿°å¼ä»¥åŸ·è¡Œ"
+
+# sql_help.h:25
+# sql_help.h:373
+#: sql_help.c:6091
+msgid "prepare the current transaction for two-phase commit"
+msgstr "為目å‰çš„交易準備兩階段æ交"
+
+#: sql_help.c:6097
+msgid "change the ownership of database objects owned by a database role"
+msgstr "變更由資料庫角色æ“有的資料庫物件的所有權"
+
+#: sql_help.c:6103
+msgid "replace the contents of a materialized view"
+msgstr "替æ›å¯¦é«”化檢視表的內容"
+
+# sql_help.h:357
+#: sql_help.c:6109
+msgid "rebuild indexes"
+msgstr "é‡å»ºç´¢å¼•"
+
+# sql_help.h:361
+#: sql_help.c:6115
+msgid "release a previously defined savepoint"
+msgstr "釋放先å‰å»ºç«‹çš„儲存點"
+
+# sql_help.h:365
+#: sql_help.c:6121
+msgid "restore the value of a run-time parameter to the default value"
+msgstr "將執行時期åƒæ•¸é‚„原æˆé è¨­å€¼"
+
+# sql_help.h:369
+#: sql_help.c:6127
+msgid "remove access privileges"
+msgstr "移除存å–權é™"
+
+#: sql_help.c:6139
+msgid "cancel a transaction that was earlier prepared for two-phase commit"
+msgstr "å–消先å‰ç‚ºå…©éšŽæ交å¯æº–備的交易"
+
+# sql_help.h:377
+#: sql_help.c:6145
+msgid "roll back to a savepoint"
+msgstr "還原至儲存點"
+
+# sql_help.h:381
+#: sql_help.c:6151
+msgid "define a new savepoint within the current transaction"
+msgstr "在目å‰çš„交易中建立新的儲存點"
+
+# sql_help.h:117
+#: sql_help.c:6157
+msgid "define or change a security label applied to an object"
+msgstr "建立或變更物件的安全性標籤"
+
+# sql_help.h:385
+#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253
+msgid "retrieve rows from a table or view"
+msgstr "從資料表或檢視表讀å–資料列"
+
+# sql_help.h:393
+#: sql_help.c:6175
+msgid "change a run-time parameter"
+msgstr "變更執行時期åƒæ•¸"
+
+# sql_help.h:397
+#: sql_help.c:6181
+msgid "set constraint check timing for the current transaction"
+msgstr "設定目å‰äº¤æ˜“çš„ç´„æŸæª¢æŸ¥æ™‚æ©Ÿ"
+
+# sql_help.h:405
+#: sql_help.c:6187
+msgid "set the current user identifier of the current session"
+msgstr "設定目å‰å·¥ä½œéšŽæ®µçš„ç›®å‰ä½¿ç”¨è€…識別碼"
+
+# sql_help.h:401
+#: sql_help.c:6193
+msgid "set the session user identifier and the current user identifier of the current session"
+msgstr "設定目å‰å·¥ä½œéšŽæ®µçš„工作階段使用者識別碼和目å‰ä½¿ç”¨è€…識別碼"
+
+# sql_help.h:405
+#: sql_help.c:6199
+msgid "set the characteristics of the current transaction"
+msgstr "設定目å‰äº¤æ˜“的屬性"
+
+# sql_help.h:409
+#: sql_help.c:6205
+msgid "show the value of a run-time parameter"
+msgstr "顯示執行時期的åƒæ•¸å€¼"
+
+# sql_help.h:425
+#: sql_help.c:6223
+msgid "empty a table or set of tables"
+msgstr "清空資料表或一組資料表"
+
+# sql_help.h:421
+#: sql_help.c:6229
+msgid "stop listening for a notification"
+msgstr "åœæ­¢ç›£è½é€šçŸ¥"
+
+# sql_help.h:425
+#: sql_help.c:6235
+msgid "update rows of a table"
+msgstr "更新資料表中的資料列"
+
+# sql_help.h:429
+#: sql_help.c:6241
+msgid "garbage-collect and optionally analyze a database"
+msgstr "垃圾回收並é¸æ“‡æ€§åˆ†æžè³‡æ–™åº«"
+
+#: sql_help.c:6247
+msgid "compute a set of rows"
+msgstr "計算一組資料列"
+
+# translator: %s represents an SQL statement name
+# access/transam/xact.c:2246
+#: startup.c:220
+#, c-format
+msgid "-1 can only be used in non-interactive mode"
+msgstr "-1 åªèƒ½åœ¨éžäº’動模å¼ä¸‹ä½¿ç”¨"
+
+# utils/init/miscinit.c:533
+#: startup.c:343
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "無法開啟日誌檔 \"%s\": %m"
+
+#: startup.c:460
+#, c-format
+msgid ""
+"Type \"help\" for help.\n"
+"\n"
+msgstr ""
+"輸入 \"help\" 顯示說明。\n"
+"\n"
+
+# startup.c:446
+#: startup.c:612
+#, c-format
+msgid "could not set printing parameter \"%s\""
+msgstr "無法設定顯示åƒæ•¸ \"%s\""
+
+# tcop/postgres.c:2636 tcop/postgres.c:2652
+#: startup.c:719
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "用 \"%s --help\" å–得更多資訊。"
+
+# startup.c:557
+#: startup.c:735
+#, c-format
+msgid "extra command-line argument \"%s\" ignored"
+msgstr "é¡å¤–的命令列åƒæ•¸ \"%s\" 已被忽略"
+
+#: startup.c:783
+#, c-format
+msgid "could not find own program executable"
+msgstr "找ä¸åˆ°è‡ªèº«ç¨‹å¼çš„執行檔"
+
+#: tab-complete.c:6078
+#, c-format
+msgid ""
+"tab completion query failed: %s\n"
+"Query was:\n"
+"%s"
+msgstr ""
+"tab 補全命令失敗: %s\n"
+"查詢如下: \n"
+"%s"
+
+# access/transam/xlog.c:3720
+#: variables.c:139
+#, c-format
+msgid "unrecognized value \"%s\" for \"%s\": Boolean expected"
+msgstr "值 \"%s\" å°æ–¼ \"%s\" 是無法識別的: é æœŸç‚ºå¸ƒæž—值"
+
+# utils/adt/formatting.c:2044
+#: variables.c:176
+#, c-format
+msgid "invalid value \"%s\" for \"%s\": integer expected"
+msgstr "值 \"%s\" å°æ–¼ \"%s\" 是無效的: é æœŸç‚ºæ•´æ•¸"
+
+# commands/user.c:209
+#: variables.c:224
+#, c-format
+msgid "invalid variable name: \"%s\""
+msgstr "無效的變數å稱: \"%s\""
+
+#: variables.c:418
+#, c-format
+msgid ""
+"unrecognized value \"%s\" for \"%s\"\n"
+"Available values are: %s."
+msgstr ""
+"\"%s\" å°æ–¼ \"%s\" 是無法識別的值\n"
+"å¯ç”¨çš„值為: %s。"
+
+#, c-format
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help 顯示說明然後çµæŸ\n"
+
+#, c-format
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version 顯示版本資訊然後çµæŸ\n"
+
+# help.c:252
+#, c-format
+#~ msgid ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID large object operations\n"
+#~ msgstr ""
+#~ " \\lo_export LOBOID FILE\n"
+#~ " \\lo_import FILE [COMMENT]\n"
+#~ " \\lo_list\n"
+#~ " \\lo_unlink LOBOID 大型物件é‹ç®—å­\n"
+
+# help.c:239
+#, c-format
+#~ msgid ""
+#~ " \\pset NAME [VALUE] set table output option\n"
+#~ " (NAME := {format|border|expanded|fieldsep|footer|null|\n"
+#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n"
+#~ msgstr ""
+#~ " \\pset NAME [VALUE] 設定資料表輸出é¸é …\n"
+#~ " (NAME := {format|border|expanded|fieldsep|footer|null|\n"
+#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n"
+
+#~ msgid " as user \"%s\""
+#~ msgstr " 用戶 \"%s\""
+
+#~ msgid " at port \"%s\""
+#~ msgstr " 埠號 \"%s\""
+
+#~ msgid " on host \"%s\""
+#~ msgstr " 在 \"%s\" 主機上"
+
+# command.c:788
+# command.c:808
+# command.c:1163
+# command.c:1170
+# command.c:1180
+# command.c:1192
+# command.c:1205
+# command.c:1219
+# command.c:1241
+# command.c:1272
+# common.c:170
+# copy.c:530
+# copy.c:575
+#, c-format
+#~ msgid "%s: %s\n"
+#~ msgstr "%s: %s\n"
+
+# command.c:1148
+#, c-format
+#~ msgid "%s: could not open log file \"%s\": %s\n"
+#~ msgstr "%s: 無法開啟日誌檔 \"%s\": %s\n"
+
+# startup.c:502
+#, c-format
+#~ msgid "%s: could not set variable \"%s\"\n"
+#~ msgstr "%s: 無法設定變數 \"%s\"\n"
+
+# common.c:78
+#, c-format
+#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "%s: pg_strdup : 無法複製空指標 (內部錯誤)\n"
+
+# print.c:428
+#, c-format
+#~ msgid "(No rows)\n"
+#~ msgstr "(無資料列)\n"
+
+# command.c:915
+# command.c:939
+# startup.c:187
+# startup.c:205
+#~ msgid "Enter new password: "
+#~ msgstr "輸入新密碼: "
+
+# command.c:120
+#, c-format
+#~ msgid "Invalid command \\%s. Try \\? for help.\n"
+#~ msgstr "無效的命令 \\%s,用 \\? 顯示說明。\n"
+
+# describe.c:1588
+#~ msgid "Modifier"
+#~ msgstr "修飾詞"
+
+# describe.c:752
+#~ msgid "Modifiers"
+#~ msgstr "修飾詞"
+
+# describe.c:1542
+#, c-format
+#~ msgid "No matching relations found.\n"
+#~ msgstr "沒有找到符åˆçš„é—œè¯ã€‚\n"
+
+# describe.c:1542
+#, c-format
+#~ msgid "No matching settings found.\n"
+#~ msgstr "沒有找到符åˆçš„設定。\n"
+
+#, c-format
+#~ msgid "No per-database role settings support in this server version.\n"
+#~ msgstr "此伺æœå™¨ç‰ˆæœ¬ä¸æ”¯æ´ç¨ç«‹è³‡æ–™åº« role 設定。\n"
+
+# describe.c:1544
+#, c-format
+#~ msgid "No relations found.\n"
+#~ msgstr "找ä¸åˆ°é—œè¯ã€‚\n"
+
+# describe.c:1544
+#, c-format
+#~ msgid "No settings found.\n"
+#~ msgstr "找ä¸åˆ°è¨­å®šã€‚\n"
+
+# describe.c:593
+#~ msgid "Object Description"
+#~ msgstr "物件æè¿°"
+
+#, c-format
+#~ msgid "Password encryption failed.\n"
+#~ msgstr "密碼加密失敗。\n"
+
+# startup.c:652
+#, c-format
+#~ msgid "SSL connection (unknown cipher)\n"
+#~ msgstr "SSL 連線 (ä¸æ˜Žå¯†æ–‡)\n"
+
+#~ msgid "Showing locale-adjusted numeric output."
+#~ msgstr "顯示å€åŸŸèª¿æ•´å¾Œçš„數字輸出。"
+
+# command.c:1416
+#~ msgid "Showing only tuples."
+#~ msgstr "åªé¡¯ç¤º Tuples。"
+
+# describe.c:187
+#~ msgid "Source code"
+#~ msgstr "原始程å¼"
+
+# describe.c:875
+#, c-format
+#~ msgid "Special relation \"%s.%s\""
+#~ msgstr "ç‰¹æ®Šé—œè¯ \"%s.%s\""
+
+# describe.c:117
+#, c-format
+#~ msgid "The server (version %d.%d) does not support altering default privileges.\n"
+#~ msgstr "伺æœå™¨(版本 %d.%d) ä¸æ”¯æ´ä¿®æ”¹é è¨­æ¬Šé™ã€‚\n"
+
+# describe.c:117
+#, c-format
+#~ msgid "The server (version %d.%d) does not support foreign servers.\n"
+#~ msgstr "伺æœå™¨ (版本 %d.%d) ä¸æ”¯æ´å¤–部伺æœå™¨ã€‚\n"
+
+# describe.c:117
+#, c-format
+#~ msgid "The server (version %d.%d) does not support foreign tables.\n"
+#~ msgstr "伺æœå™¨(版本 %d.%d) ä¸æ”¯æ´ foreign 資料表。\n"
+
+# describe.c:117
+#, c-format
+#~ msgid "The server (version %d.%d) does not support foreign-data wrappers.\n"
+#~ msgstr "伺æœå™¨ (版本 %d.%d) ä¸æ”¯æ´å¤–部資料包è£å‡½å¼ã€‚\n"
+
+# describe.c:117
+#, c-format
+#~ msgid "The server (version %d.%d) does not support full text search.\n"
+#~ msgstr "伺æœå™¨ (版本 %d.%d) ä¸æ”¯æ´æ–‡æœ¬æœå°‹ã€‚\n"
+
+# describe.c:117
+#, c-format
+#~ msgid "The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n"
+#~ msgstr "伺æœå™¨ (版本 %d.%d) ä¸æ”¯æ´ ON_ERROR_ROLLBACK 的儲存點。\n"
+
+# startup.c:533
+# startup.c:539
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "嘗試 \"%s --help\" 以得到更多資訊。\n"
+
+# common.c:636
+# common.c:871
+#, c-format
+#~ msgid "You are not connected.\n"
+#~ msgstr "ç›®å‰æ²’有連線。\n"
+
+# command.c:696
+# command.c:745
+#, c-format
+#~ msgid "\\%s: error\n"
+#~ msgstr "\\%s: 錯誤\n"
+
+# copy.c:562
+#, c-format
+#~ msgid "\\copy: %s"
+#~ msgstr "\\copy: %s"
+
+# copy.c:566
+#, c-format
+#~ msgid "\\copy: unexpected response (%d)\n"
+#~ msgstr "\\copy: æ„外回應 (%d)\n"
+
+#~ msgid "agg_name"
+#~ msgstr "agg_name"
+
+# describe.c:1689
+#~ msgid "agg_type"
+#~ msgstr "agg_type"
+
+#~ msgid "attribute"
+#~ msgstr "屬性"
+
+#, c-format
+#~ msgid "child process was terminated by signal %s"
+#~ msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %s 終止"
+
+#, c-format
+#~ msgid "collate %s"
+#~ msgstr "collate %s"
+
+# describe.c:744
+#~ msgid "column"
+#~ msgstr "column"
+
+# startup.c:629
+#~ msgid "contains support for command-line editing"
+#~ msgstr "包å«å‘½ä»¤åˆ—編輯支æ´"
+
+# command.c:256
+#, c-format
+#~ msgid "could not change directory to \"%s\""
+#~ msgstr "無法切æ›ç›®éŒ„至 \"%s\""
+
+# help.c:70
+#, c-format
+#~ msgid "could not get current user name: %s\n"
+#~ msgstr "無法å–å¾—ç›®å‰ç”¨æˆ¶å稱: %s\n"
+
+# command.c:240
+#, c-format
+#~ msgid "could not identify current directory: %s"
+#~ msgstr "無法識別目å‰ç›®éŒ„: %s"
+
+# command.c:1103
+#, c-format
+#~ msgid "could not read symbolic link \"%s\""
+#~ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\""
+
+# describe.c:526
+#~ msgid "data type"
+#~ msgstr "資料型別"
+
+# describe.c:1639
+#, c-format
+#~ msgid "default %s"
+#~ msgstr "é è¨­å€¼ %s"
+
+#~ msgid "from_list"
+#~ msgstr "from_list"
+
+# describe.c:526
+#~ msgid "input_data_type"
+#~ msgstr "input_data_type"
+
+# describe.c:744
+#~ msgid "new_column"
+#~ msgstr "new_column"
+
+# help.c:211
+#~ msgid "normal"
+#~ msgstr "normal"
+
+#~ msgid "not null"
+#~ msgstr "éž Null"
+
+# describe.c:1478
+#~ msgid "special"
+#~ msgstr "特殊"
+
+# describe.c:1342
+#~ msgid "tablespace"
+#~ msgstr "tablespace"
+
+#~ msgid "timezone"
+#~ msgstr "timezone"
+
+#~ msgid "where direction can be empty or one of:"
+#~ msgstr "其中 direction å¯ä»¥æ˜¯ç©ºçš„或是:"
diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c
new file mode 100644
index 0000000..969cd99
--- /dev/null
+++ b/src/bin/psql/prompt.c
@@ -0,0 +1,384 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/prompt.c
+ */
+#include "postgres_fe.h"
+
+#ifdef WIN32
+#include <io.h>
+#include <win32.h>
+#endif
+
+#include "common.h"
+#include "common/string.h"
+#include "input.h"
+#include "libpq/pqcomm.h"
+#include "prompt.h"
+#include "settings.h"
+
+/*--------------------------
+ * get_prompt
+ *
+ * Returns a statically allocated prompt made by interpolating certain
+ * tcsh style escape sequences into pset.vars "PROMPT1|2|3".
+ * (might not be completely multibyte safe)
+ *
+ * Defined interpolations are:
+ * %M - database server "hostname.domainname", "[local]" for AF_UNIX
+ * sockets, "[local:/dir/name]" if not default
+ * %m - like %M, but hostname only (before first dot), or always "[local]"
+ * %p - backend pid
+ * %> - database server port number
+ * %n - database user name
+ * %/ - current database
+ * %~ - like %/ but "~" when database name equals user name
+ * %w - whitespace of the same width as the most recent output of PROMPT1
+ * %# - "#" if superuser, ">" otherwise
+ * %R - in prompt1 normally =, or ^ if single line mode,
+ * or a ! if session is not connected to a database;
+ * in prompt2 -, *, ', or ";
+ * in prompt3 nothing
+ * %x - transaction status: empty, *, !, ? (unknown or no connection)
+ * %l - The line number inside the current statement, starting from 1.
+ * %? - the error code of the last query (not yet implemented)
+ * %% - a percent sign
+ *
+ * %[0-9] - the character with the given decimal code
+ * %0[0-7] - the character with the given octal code
+ * %0x[0-9A-Fa-f] - the character with the given hexadecimal code
+ *
+ * %`command` - The result of executing command in /bin/sh with trailing
+ * newline stripped.
+ * %:name: - The value of the psql variable 'name'
+ * (those will not be rescanned for more escape sequences!)
+ *
+ * %[ ... %] - tell readline that the contained text is invisible
+ *
+ * If the application-wide prompts become NULL somehow, the returned string
+ * will be empty (not NULL!).
+ *--------------------------
+ */
+
+char *
+get_prompt(promptStatus_t status, ConditionalStack cstack)
+{
+#define MAX_PROMPT_SIZE 256
+ static char destination[MAX_PROMPT_SIZE + 1];
+ char buf[MAX_PROMPT_SIZE + 1];
+ bool esc = false;
+ const char *p;
+ const char *prompt_string = "? ";
+ static size_t last_prompt1_width = 0;
+
+ switch (status)
+ {
+ case PROMPT_READY:
+ prompt_string = pset.prompt1;
+ break;
+
+ case PROMPT_CONTINUE:
+ case PROMPT_SINGLEQUOTE:
+ case PROMPT_DOUBLEQUOTE:
+ case PROMPT_DOLLARQUOTE:
+ case PROMPT_COMMENT:
+ case PROMPT_PAREN:
+ prompt_string = pset.prompt2;
+ break;
+
+ case PROMPT_COPY:
+ prompt_string = pset.prompt3;
+ break;
+ }
+
+ destination[0] = '\0';
+
+ for (p = prompt_string;
+ *p && strlen(destination) < sizeof(destination) - 1;
+ p++)
+ {
+ memset(buf, 0, sizeof(buf));
+ if (esc)
+ {
+ switch (*p)
+ {
+ /* Current database */
+ case '/':
+ if (pset.db)
+ strlcpy(buf, PQdb(pset.db), sizeof(buf));
+ break;
+ case '~':
+ if (pset.db)
+ {
+ const char *var;
+
+ if (strcmp(PQdb(pset.db), PQuser(pset.db)) == 0 ||
+ ((var = getenv("PGDATABASE")) && strcmp(var, PQdb(pset.db)) == 0))
+ strlcpy(buf, "~", sizeof(buf));
+ else
+ strlcpy(buf, PQdb(pset.db), sizeof(buf));
+ }
+ break;
+
+ /* Whitespace of the same width as the last PROMPT1 */
+ case 'w':
+ if (pset.db)
+ memset(buf, ' ',
+ Min(last_prompt1_width, sizeof(buf) - 1));
+ break;
+
+ /* DB server hostname (long/short) */
+ case 'M':
+ case 'm':
+ if (pset.db)
+ {
+ const char *host = PQhost(pset.db);
+
+ /* INET socket */
+ if (host && host[0] && !is_unixsock_path(host))
+ {
+ strlcpy(buf, host, sizeof(buf));
+ if (*p == 'm')
+ buf[strcspn(buf, ".")] = '\0';
+ }
+ /* UNIX socket */
+ else
+ {
+ if (!host
+ || strcmp(host, DEFAULT_PGSOCKET_DIR) == 0
+ || *p == 'm')
+ strlcpy(buf, "[local]", sizeof(buf));
+ else
+ snprintf(buf, sizeof(buf), "[local:%s]", host);
+ }
+ }
+ break;
+ /* DB server port number */
+ case '>':
+ if (pset.db && PQport(pset.db))
+ strlcpy(buf, PQport(pset.db), sizeof(buf));
+ break;
+ /* DB server user name */
+ case 'n':
+ if (pset.db)
+ strlcpy(buf, session_username(), sizeof(buf));
+ break;
+ /* backend pid */
+ case 'p':
+ if (pset.db)
+ {
+ int pid = PQbackendPID(pset.db);
+
+ if (pid)
+ snprintf(buf, sizeof(buf), "%d", pid);
+ }
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ *buf = (char) strtol(p, unconstify(char **, &p), 8);
+ --p;
+ break;
+ case 'R':
+ switch (status)
+ {
+ case PROMPT_READY:
+ if (cstack != NULL && !conditional_active(cstack))
+ buf[0] = '@';
+ else if (!pset.db)
+ buf[0] = '!';
+ else if (!pset.singleline)
+ buf[0] = '=';
+ else
+ buf[0] = '^';
+ break;
+ case PROMPT_CONTINUE:
+ buf[0] = '-';
+ break;
+ case PROMPT_SINGLEQUOTE:
+ buf[0] = '\'';
+ break;
+ case PROMPT_DOUBLEQUOTE:
+ buf[0] = '"';
+ break;
+ case PROMPT_DOLLARQUOTE:
+ buf[0] = '$';
+ break;
+ case PROMPT_COMMENT:
+ buf[0] = '*';
+ break;
+ case PROMPT_PAREN:
+ buf[0] = '(';
+ break;
+ default:
+ buf[0] = '\0';
+ break;
+ }
+ break;
+
+ case 'x':
+ if (!pset.db)
+ buf[0] = '?';
+ else
+ switch (PQtransactionStatus(pset.db))
+ {
+ case PQTRANS_IDLE:
+ buf[0] = '\0';
+ break;
+ case PQTRANS_ACTIVE:
+ case PQTRANS_INTRANS:
+ buf[0] = '*';
+ break;
+ case PQTRANS_INERROR:
+ buf[0] = '!';
+ break;
+ default:
+ buf[0] = '?';
+ break;
+ }
+ break;
+
+ case 'l':
+ snprintf(buf, sizeof(buf), UINT64_FORMAT, pset.stmt_lineno);
+ break;
+
+ case '?':
+ /* not here yet */
+ break;
+
+ case '#':
+ if (is_superuser())
+ buf[0] = '#';
+ else
+ buf[0] = '>';
+ break;
+
+ /* execute command */
+ case '`':
+ {
+ int cmdend = strcspn(p + 1, "`");
+ char *file = pnstrdup(p + 1, cmdend);
+ FILE *fd;
+
+ fflush(NULL);
+ fd = popen(file, "r");
+ if (fd)
+ {
+ if (fgets(buf, sizeof(buf), fd) == NULL)
+ buf[0] = '\0';
+ pclose(fd);
+ }
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(buf);
+
+ free(file);
+ p += cmdend + 1;
+ break;
+ }
+
+ /* interpolate variable */
+ case ':':
+ {
+ int nameend = strcspn(p + 1, ":");
+ char *name = pnstrdup(p + 1, nameend);
+ const char *val;
+
+ val = GetVariable(pset.vars, name);
+ if (val)
+ strlcpy(buf, val, sizeof(buf));
+ free(name);
+ p += nameend + 1;
+ break;
+ }
+
+ case '[':
+ case ']':
+#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE)
+
+ /*
+ * readline >=4.0 undocumented feature: non-printing
+ * characters in prompt strings must be marked as such, in
+ * order to properly display the line during editing.
+ */
+ buf[0] = (*p == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
+ buf[1] = '\0';
+#endif /* USE_READLINE */
+ break;
+
+ default:
+ buf[0] = *p;
+ buf[1] = '\0';
+ break;
+ }
+ esc = false;
+ }
+ else if (*p == '%')
+ esc = true;
+ else
+ {
+ buf[0] = *p;
+ buf[1] = '\0';
+ esc = false;
+ }
+
+ if (!esc)
+ strlcat(destination, buf, sizeof(destination));
+ }
+
+ /* Compute the visible width of PROMPT1, for PROMPT2's %w */
+ if (prompt_string == pset.prompt1)
+ {
+ char *p = destination;
+ char *end = p + strlen(p);
+ bool visible = true;
+
+ last_prompt1_width = 0;
+ while (*p)
+ {
+#if defined(USE_READLINE) && defined(RL_PROMPT_START_IGNORE)
+ if (*p == RL_PROMPT_START_IGNORE)
+ {
+ visible = false;
+ ++p;
+ }
+ else if (*p == RL_PROMPT_END_IGNORE)
+ {
+ visible = true;
+ ++p;
+ }
+ else
+#endif
+ {
+ int chlen,
+ chwidth;
+
+ chlen = PQmblen(p, pset.encoding);
+ if (p + chlen > end)
+ break; /* Invalid string */
+
+ if (visible)
+ {
+ chwidth = PQdsplen(p, pset.encoding);
+
+ if (*p == '\n')
+ last_prompt1_width = 0;
+ else if (chwidth > 0)
+ last_prompt1_width += chwidth;
+ }
+
+ p += chlen;
+ }
+ }
+ }
+
+ return destination;
+}
diff --git a/src/bin/psql/prompt.h b/src/bin/psql/prompt.h
new file mode 100644
index 0000000..af5f84c
--- /dev/null
+++ b/src/bin/psql/prompt.h
@@ -0,0 +1,17 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/prompt.h
+ */
+#ifndef PROMPT_H
+#define PROMPT_H
+
+#include "fe_utils/conditional.h"
+/* enum promptStatus_t is now defined by psqlscan.h */
+#include "fe_utils/psqlscan.h"
+
+char *get_prompt(promptStatus_t status, ConditionalStack cstack);
+
+#endif /* PROMPT_H */
diff --git a/src/bin/psql/psqlrc.sample b/src/bin/psql/psqlrc.sample
new file mode 100644
index 0000000..8152cac
--- /dev/null
+++ b/src/bin/psql/psqlrc.sample
@@ -0,0 +1,8 @@
+--
+-- system-wide psql configuration file
+--
+-- This file is read before the .psqlrc file in the user's home directory.
+--
+-- Copy this to your installation's sysconf directory and rename it psqlrc.
+-- The sysconf directory can be identified via "pg_config --sysconfdir".
+--
diff --git a/src/bin/psql/psqlscanslash.c b/src/bin/psql/psqlscanslash.c
new file mode 100644
index 0000000..a802113
--- /dev/null
+++ b/src/bin/psql/psqlscanslash.c
@@ -0,0 +1,3502 @@
+#line 2 "psqlscanslash.c"
+/*-------------------------------------------------------------------------
+ *
+ * psqlscanslash.l
+ * lexical scanner for psql backslash commands
+ *
+ * XXX Avoid creating backtracking cases --- see the backend lexer for info.
+ *
+ * See fe_utils/psqlscan_int.h for additional commentary.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/psql/psqlscanslash.l
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "psqlscanslash.h"
+
+#include "common/logging.h"
+#include "fe_utils/conditional.h"
+
+#include "libpq-fe.h"
+
+#line 30 "psqlscanslash.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef yy_create_buffer
+#define slash_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer slash_yy_create_buffer
+#endif
+
+#ifdef yy_delete_buffer
+#define slash_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer slash_yy_delete_buffer
+#endif
+
+#ifdef yy_scan_buffer
+#define slash_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer slash_yy_scan_buffer
+#endif
+
+#ifdef yy_scan_string
+#define slash_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string slash_yy_scan_string
+#endif
+
+#ifdef yy_scan_bytes
+#define slash_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes slash_yy_scan_bytes
+#endif
+
+#ifdef yy_init_buffer
+#define slash_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer slash_yy_init_buffer
+#endif
+
+#ifdef yy_flush_buffer
+#define slash_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer slash_yy_flush_buffer
+#endif
+
+#ifdef yy_load_buffer_state
+#define slash_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state slash_yy_load_buffer_state
+#endif
+
+#ifdef yy_switch_to_buffer
+#define slash_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer slash_yy_switch_to_buffer
+#endif
+
+#ifdef yypush_buffer_state
+#define slash_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state slash_yypush_buffer_state
+#endif
+
+#ifdef yypop_buffer_state
+#define slash_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state slash_yypop_buffer_state
+#endif
+
+#ifdef yyensure_buffer_stack
+#define slash_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack slash_yyensure_buffer_stack
+#endif
+
+#ifdef yylex
+#define slash_yylex_ALREADY_DEFINED
+#else
+#define yylex slash_yylex
+#endif
+
+#ifdef yyrestart
+#define slash_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart slash_yyrestart
+#endif
+
+#ifdef yylex_init
+#define slash_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init slash_yylex_init
+#endif
+
+#ifdef yylex_init_extra
+#define slash_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra slash_yylex_init_extra
+#endif
+
+#ifdef yylex_destroy
+#define slash_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy slash_yylex_destroy
+#endif
+
+#ifdef yyget_debug
+#define slash_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug slash_yyget_debug
+#endif
+
+#ifdef yyset_debug
+#define slash_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug slash_yyset_debug
+#endif
+
+#ifdef yyget_extra
+#define slash_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra slash_yyget_extra
+#endif
+
+#ifdef yyset_extra
+#define slash_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra slash_yyset_extra
+#endif
+
+#ifdef yyget_in
+#define slash_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in slash_yyget_in
+#endif
+
+#ifdef yyset_in
+#define slash_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in slash_yyset_in
+#endif
+
+#ifdef yyget_out
+#define slash_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out slash_yyget_out
+#endif
+
+#ifdef yyset_out
+#define slash_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out slash_yyset_out
+#endif
+
+#ifdef yyget_leng
+#define slash_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng slash_yyget_leng
+#endif
+
+#ifdef yyget_text
+#define slash_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text slash_yyget_text
+#endif
+
+#ifdef yyget_lineno
+#define slash_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno slash_yyget_lineno
+#endif
+
+#ifdef yyset_lineno
+#define slash_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno slash_yyset_lineno
+#endif
+
+#ifdef yyget_column
+#define slash_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column slash_yyget_column
+#endif
+
+#ifdef yyset_column
+#define slash_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column slash_yyset_column
+#endif
+
+#ifdef yywrap
+#define slash_yywrap_ALREADY_DEFINED
+#else
+#define yywrap slash_yywrap
+#endif
+
+#ifdef yyget_lval
+#define slash_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval slash_yyget_lval
+#endif
+
+#ifdef yyset_lval
+#define slash_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval slash_yyset_lval
+#endif
+
+#ifdef yyalloc
+#define slash_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc slash_yyalloc
+#endif
+
+#ifdef yyrealloc
+#define slash_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc slash_yyrealloc
+#endif
+
+#ifdef yyfree
+#define slash_yyfree_ALREADY_DEFINED
+#else
+#define yyfree slash_yyfree
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+/* For convenience, these vars (plus the bison vars far below)
+ are macros in the reentrant scanner. */
+#define yyin yyg->yyin_r
+#define yyout yyg->yyout_r
+#define yyextra yyg->yyextra_r
+#define yyleng yyg->yyleng_r
+#define yytext yyg->yytext_r
+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
+#define yy_flex_debug yyg->yy_flex_debug_r
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yyg->yy_start = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yyg->yy_start - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin , yyscanner )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = yyg->yy_hold_char; \
+ YY_RESTORE_YY_MORE_OFFSET \
+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
+
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
+
+static void yyensure_buffer_stack ( yyscan_t yyscanner );
+static void yy_load_buffer_state ( yyscan_t yyscanner );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (yyscanner); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define slash_yywrap(yyscanner) (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+typedef int yy_state_type;
+
+#define yytext_ptr yytext_r
+
+static const flex_int16_t yy_nxt[][22] =
+ {
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+
+ {
+ 19, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20
+ },
+
+ {
+ 19, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20
+ },
+
+ {
+ 19, 21, 22, 23, 21, 21, 21, 21, 21, 21,
+
+ 21, 22, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21
+ },
+
+ {
+ 19, 21, 22, 23, 21, 21, 21, 21, 21, 21,
+ 21, 22, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21
+ },
+
+ {
+ 19, 24, 25, 26, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 27, 24
+ },
+
+ {
+ 19, 24, 25, 26, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+
+ 27, 24
+ },
+
+ {
+ 19, 28, 29, 30, 31, 32, 28, 28, 33, 28,
+ 28, 29, 34, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28
+ },
+
+ {
+ 19, 28, 29, 30, 31, 32, 28, 28, 33, 28,
+ 28, 29, 34, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28
+ },
+
+ {
+ 19, 35, 35, 35, 35, 36, 35, 35, 35, 35,
+ 35, 37, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35
+
+ },
+
+ {
+ 19, 35, 35, 35, 35, 36, 35, 35, 35, 35,
+ 35, 37, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35
+ },
+
+ {
+ 19, 38, 38, 38, 38, 38, 38, 38, 39, 38,
+ 38, 38, 40, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38
+ },
+
+ {
+ 19, 38, 38, 38, 38, 38, 38, 38, 39, 38,
+ 38, 38, 40, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38
+ },
+
+ {
+ 19, 41, 41, 41, 42, 41, 41, 41, 41, 41,
+
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41
+ },
+
+ {
+ 19, 41, 41, 41, 42, 41, 41, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41
+ },
+
+ {
+ 19, 43, 44, 45, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 43, 43
+ },
+
+ {
+ 19, 43, 44, 45, 43, 43, 43, 43, 43, 43,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+
+ 43, 43
+ },
+
+ {
+ 19, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 47, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46
+ },
+
+ {
+ 19, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 47, 46, 46, 46, 46, 46, 46, 46, 46,
+ 46, 46
+ },
+
+ {
+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19,
+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19,
+ -19, -19
+
+ },
+
+ {
+ 19, -20, -20, -20, -20, -20, -20, -20, -20, -20,
+ -20, -20, -20, -20, -20, -20, -20, -20, -20, -20,
+ -20, -20
+ },
+
+ {
+ 19, -21, -21, -21, -21, -21, -21, -21, -21, -21,
+ -21, -21, -21, -21, -21, -21, -21, -21, -21, -21,
+ -21, -21
+ },
+
+ {
+ 19, -22, -22, -22, -22, -22, -22, -22, -22, -22,
+ -22, -22, -22, -22, -22, -22, -22, -22, -22, -22,
+ -22, -22
+ },
+
+ {
+ 19, -23, -23, -23, -23, -23, -23, -23, -23, -23,
+
+ -23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
+ -23, -23
+ },
+
+ {
+ 19, -24, -24, -24, -24, -24, -24, -24, -24, -24,
+ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
+ -24, -24
+ },
+
+ {
+ 19, -25, 48, 48, -25, -25, -25, -25, -25, -25,
+ -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
+ -25, -25
+ },
+
+ {
+ 19, -26, 48, 48, -26, -26, -26, -26, -26, -26,
+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26,
+
+ -26, -26
+ },
+
+ {
+ 19, -27, -27, -27, -27, -27, -27, -27, -27, -27,
+ -27, -27, -27, -27, -27, -27, -27, -27, -27, -27,
+ -27, -27
+ },
+
+ {
+ 19, -28, -28, -28, -28, -28, -28, -28, -28, -28,
+ -28, -28, -28, -28, -28, -28, -28, -28, -28, -28,
+ -28, -28
+ },
+
+ {
+ 19, -29, -29, -29, -29, -29, -29, -29, -29, -29,
+ -29, -29, -29, -29, -29, -29, -29, -29, -29, -29,
+ -29, -29
+
+ },
+
+ {
+ 19, -30, -30, -30, -30, -30, -30, -30, -30, -30,
+ -30, -30, -30, -30, -30, -30, -30, -30, -30, -30,
+ -30, -30
+ },
+
+ {
+ 19, -31, -31, -31, -31, -31, -31, -31, -31, -31,
+ -31, -31, -31, -31, -31, -31, -31, -31, -31, -31,
+ -31, -31
+ },
+
+ {
+ 19, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
+ -32, -32
+ },
+
+ {
+ 19, -33, -33, -33, 49, 50, 51, 51, -33, -33,
+
+ 51, -33, -33, 51, 51, 51, 51, 51, 51, 52,
+ -33, -33
+ },
+
+ {
+ 19, -34, -34, -34, -34, -34, -34, -34, -34, -34,
+ -34, -34, -34, -34, -34, -34, -34, -34, -34, -34,
+ -34, -34
+ },
+
+ {
+ 19, -35, -35, -35, -35, -35, -35, -35, -35, -35,
+ -35, -35, -35, -35, -35, -35, -35, -35, -35, -35,
+ -35, -35
+ },
+
+ {
+ 19, -36, -36, -36, -36, 53, -36, -36, -36, -36,
+ -36, -36, -36, -36, -36, -36, -36, -36, -36, -36,
+
+ -36, -36
+ },
+
+ {
+ 19, 54, 54, -37, 54, 54, 55, 54, 54, 54,
+ 54, 54, 54, 56, 57, 58, 59, 60, 61, 54,
+ 54, 54
+ },
+
+ {
+ 19, -38, -38, -38, -38, -38, -38, -38, -38, -38,
+ -38, -38, -38, -38, -38, -38, -38, -38, -38, -38,
+ -38, -38
+ },
+
+ {
+ 19, -39, -39, -39, -39, 62, 63, 63, -39, -39,
+ 63, -39, -39, 63, 63, 63, 63, 63, 63, -39,
+ -39, -39
+
+ },
+
+ {
+ 19, -40, -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40,
+ -40, -40
+ },
+
+ {
+ 19, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
+ -41, -41
+ },
+
+ {
+ 19, -42, -42, -42, -42, -42, -42, -42, -42, -42,
+ -42, -42, -42, -42, -42, -42, -42, -42, -42, -42,
+ -42, -42
+ },
+
+ {
+ 19, -43, -43, -43, -43, -43, -43, -43, -43, -43,
+
+ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43,
+ -43, -43
+ },
+
+ {
+ 19, -44, 64, 64, -44, -44, -44, -44, -44, -44,
+ -44, -44, -44, -44, -44, -44, -44, -44, -44, -44,
+ -44, -44
+ },
+
+ {
+ 19, -45, 64, 64, -45, -45, -45, -45, -45, -45,
+ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45,
+ -45, -45
+ },
+
+ {
+ 19, -46, -46, -46, -46, -46, -46, -46, -46, -46,
+ -46, -46, -46, -46, -46, -46, -46, -46, -46, -46,
+
+ -46, -46
+ },
+
+ {
+ 19, -47, -47, -47, -47, -47, -47, -47, -47, -47,
+ -47, 65, -47, -47, -47, -47, -47, -47, -47, -47,
+ -47, -47
+ },
+
+ {
+ 19, -48, 48, 48, -48, -48, -48, -48, -48, -48,
+ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48,
+ -48, -48
+ },
+
+ {
+ 19, -49, -49, -49, -49, -49, 66, 66, -49, -49,
+ 66, -49, -49, 66, 66, 66, 66, 66, 66, -49,
+ -49, -49
+
+ },
+
+ {
+ 19, -50, -50, -50, -50, -50, 67, 67, -50, -50,
+ 67, -50, -50, 67, 67, 67, 67, 67, 67, -50,
+ -50, -50
+ },
+
+ {
+ 19, -51, -51, -51, -51, -51, 51, 51, -51, -51,
+ 51, -51, -51, 51, 51, 51, 51, 51, 51, -51,
+ -51, -51
+ },
+
+ {
+ 19, -52, -52, -52, -52, -52, -52, -52, -52, 68,
+ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52,
+ -52, -52
+ },
+
+ {
+ 19, -53, -53, -53, -53, -53, -53, -53, -53, -53,
+
+ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53,
+ -53, -53
+ },
+
+ {
+ 19, -54, -54, -54, -54, -54, -54, -54, -54, -54,
+ -54, -54, -54, -54, -54, -54, -54, -54, -54, -54,
+ -54, -54
+ },
+
+ {
+ 19, -55, -55, -55, -55, -55, 69, -55, -55, -55,
+ -55, -55, -55, -55, -55, -55, -55, -55, -55, -55,
+ -55, -55
+ },
+
+ {
+ 19, -56, -56, -56, -56, -56, -56, -56, -56, -56,
+ -56, -56, -56, -56, -56, -56, -56, -56, -56, -56,
+
+ -56, -56
+ },
+
+ {
+ 19, -57, -57, -57, -57, -57, -57, -57, -57, -57,
+ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
+ -57, -57
+ },
+
+ {
+ 19, -58, -58, -58, -58, -58, -58, -58, -58, -58,
+ -58, -58, -58, -58, -58, -58, -58, -58, -58, -58,
+ -58, -58
+ },
+
+ {
+ 19, -59, -59, -59, -59, -59, -59, -59, -59, -59,
+ -59, -59, -59, -59, -59, -59, -59, -59, -59, -59,
+ -59, -59
+
+ },
+
+ {
+ 19, -60, -60, -60, -60, -60, -60, -60, -60, -60,
+ -60, -60, -60, -60, -60, -60, -60, -60, -60, -60,
+ -60, -60
+ },
+
+ {
+ 19, -61, -61, -61, -61, -61, 70, 70, -61, -61,
+ -61, -61, -61, 70, 70, -61, -61, -61, -61, -61,
+ -61, -61
+ },
+
+ {
+ 19, -62, -62, -62, -62, -62, 71, 71, -62, -62,
+ 71, -62, -62, 71, 71, 71, 71, 71, 71, -62,
+ -62, -62
+ },
+
+ {
+ 19, -63, -63, -63, -63, -63, 63, 63, -63, -63,
+
+ 63, -63, -63, 63, 63, 63, 63, 63, 63, -63,
+ -63, -63
+ },
+
+ {
+ 19, -64, 64, 64, -64, -64, -64, -64, -64, -64,
+ -64, -64, -64, -64, -64, -64, -64, -64, -64, -64,
+ -64, -64
+ },
+
+ {
+ 19, -65, -65, -65, -65, -65, -65, -65, -65, -65,
+ -65, -65, -65, -65, -65, -65, -65, -65, -65, -65,
+ -65, -65
+ },
+
+ {
+ 19, -66, -66, -66, 72, -66, 66, 66, -66, -66,
+ 66, -66, -66, 66, 66, 66, 66, 66, 66, -66,
+
+ -66, -66
+ },
+
+ {
+ 19, -67, -67, -67, -67, 73, 67, 67, -67, -67,
+ 67, -67, -67, 67, 67, 67, 67, 67, 67, -67,
+ -67, -67
+ },
+
+ {
+ 19, -68, -68, -68, -68, -68, 74, 74, -68, -68,
+ 74, -68, -68, 74, 74, 74, 74, 74, 74, -68,
+ -68, -68
+ },
+
+ {
+ 19, -69, -69, -69, -69, -69, 75, -69, -69, -69,
+ -69, -69, -69, -69, -69, -69, -69, -69, -69, -69,
+ -69, -69
+
+ },
+
+ {
+ 19, -70, -70, -70, -70, -70, 76, 76, -70, -70,
+ -70, -70, -70, 76, 76, -70, -70, -70, -70, -70,
+ -70, -70
+ },
+
+ {
+ 19, -71, -71, -71, -71, 77, 71, 71, -71, -71,
+ 71, -71, -71, 71, 71, 71, 71, 71, 71, -71,
+ -71, -71
+ },
+
+ {
+ 19, -72, -72, -72, -72, -72, -72, -72, -72, -72,
+ -72, -72, -72, -72, -72, -72, -72, -72, -72, -72,
+ -72, -72
+ },
+
+ {
+ 19, -73, -73, -73, -73, -73, -73, -73, -73, -73,
+
+ -73, -73, -73, -73, -73, -73, -73, -73, -73, -73,
+ -73, -73
+ },
+
+ {
+ 19, -74, -74, -74, -74, -74, 74, 74, -74, -74,
+ 74, -74, -74, 74, 74, 74, 74, 74, 74, -74,
+ -74, 78
+ },
+
+ {
+ 19, -75, -75, -75, -75, -75, -75, -75, -75, -75,
+ -75, -75, -75, -75, -75, -75, -75, -75, -75, -75,
+ -75, -75
+ },
+
+ {
+ 19, -76, -76, -76, -76, -76, -76, -76, -76, -76,
+ -76, -76, -76, -76, -76, -76, -76, -76, -76, -76,
+
+ -76, -76
+ },
+
+ {
+ 19, -77, -77, -77, -77, -77, -77, -77, -77, -77,
+ -77, -77, -77, -77, -77, -77, -77, -77, -77, -77,
+ -77, -77
+ },
+
+ {
+ 19, -78, -78, -78, -78, -78, -78, -78, -78, -78,
+ -78, -78, -78, -78, -78, -78, -78, -78, -78, -78,
+ -78, -78
+ },
+
+ } ;
+
+static yy_state_type yy_get_previous_state ( yyscan_t yyscanner );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner);
+static int yy_get_next_buffer ( yyscan_t yyscanner );
+static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ yyg->yytext_ptr = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ yyg->yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yyg->yy_c_buf_p = yy_cp;
+#define YY_NUM_RULES 42
+#define YY_END_OF_BUFFER 43
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[79] =
+ { 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 43, 1,
+ 3, 2, 2, 6, 4, 4, 5, 19, 7, 7,
+ 10, 8, 19, 9, 30, 20, 30, 35, 35, 31,
+ 37, 36, 39, 38, 38, 41, 41, 4, 16, 15,
+ 11, 18, 21, 29, 27, 24, 26, 22, 25, 23,
+ 29, 34, 32, 38, 40, 16, 15, 17, 27, 28,
+ 34, 13, 12, 17, 27, 28, 33, 14
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 2, 2, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 1, 4, 1, 1, 1, 1, 5, 1,
+ 1, 1, 1, 1, 1, 1, 1, 6, 6, 6,
+ 6, 6, 6, 6, 6, 7, 7, 8, 1, 1,
+ 1, 1, 9, 1, 7, 7, 7, 7, 7, 7,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 1, 11, 1, 1, 10, 12, 7, 13, 7, 7,
+
+ 7, 14, 10, 10, 10, 10, 10, 10, 10, 15,
+ 10, 10, 10, 16, 10, 17, 10, 10, 10, 18,
+ 10, 10, 19, 20, 21, 1, 1, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10
+ } ;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+#line 1 "psqlscanslash.l"
+
+#line 31 "psqlscanslash.l"
+#include "fe_utils/psqlscan_int.h"
+
+/*
+ * We must have a typedef YYSTYPE for yylex's first argument, but this lexer
+ * doesn't presently make use of that argument, so just declare it as int.
+ */
+typedef int YYSTYPE;
+
+/*
+ * Set the type of yyextra; we use it as a pointer back to the containing
+ * PsqlScanState.
+ */
+#define YY_EXTRA_TYPE PsqlScanState
+
+/*
+ * These variables do not need to be saved across calls. Yeah, it's a bit
+ * of a hack, but putting them into PsqlScanStateData would be klugy too.
+ */
+static enum slash_option_type option_type;
+static char *option_quote;
+static int unquoted_option_chars;
+static int backtick_start_offset;
+
+
+/* Return values from yylex() */
+#define LEXRES_EOL 0 /* end of input */
+#define LEXRES_OK 1 /* OK completion of backslash argument */
+
+
+static void evaluate_backtick(PsqlScanState state);
+
+#define ECHO psqlscan_emit(cur_state, yytext, yyleng)
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int slash_yyget_column(yyscan_t yyscanner);
+extern void slash_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+#line 1199 "psqlscanslash.c"
+/* Except for the prefix, these options should match psqlscan.l */
+#define YY_NO_INPUT 1
+/*
+ * OK, here is a short description of lex/flex rules behavior.
+ * The longest pattern which matches an input string is always chosen.
+ * For equal-length patterns, the first occurring in the rules list is chosen.
+ * INITIAL is the starting state, to which all non-conditional rules apply.
+ * Exclusive states change parsing rules while the state is active. When in
+ * an exclusive state, only those rules defined for that state apply.
+ */
+/* Exclusive states for lexing backslash commands */
+
+/*
+ * Assorted character class definitions that should match psqlscan.l.
+ */
+#line 1215 "psqlscanslash.c"
+
+#define INITIAL 0
+#define xslashcmd 1
+#define xslashargstart 2
+#define xslasharg 3
+#define xslashquote 4
+#define xslashbackquote 5
+#define xslashdquote 6
+#define xslashwholeline 7
+#define xslashend 8
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Holds the entire state of the reentrant scanner. */
+struct yyguts_t
+ {
+
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE yyextra_r;
+
+ /* The rest are the same as the globals declared in the non-reentrant scanner. */
+ FILE *yyin_r, *yyout_r;
+ size_t yy_buffer_stack_top; /**< index of top of stack. */
+ size_t yy_buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
+ char yy_hold_char;
+ int yy_n_chars;
+ int yyleng_r;
+ char *yy_c_buf_p;
+ int yy_init;
+ int yy_start;
+ int yy_did_buffer_switch_on_eof;
+ int yy_start_stack_ptr;
+ int yy_start_stack_depth;
+ int *yy_start_stack;
+ yy_state_type yy_last_accepting_state;
+ char* yy_last_accepting_cpos;
+
+ int yylineno_r;
+ int yy_flex_debug_r;
+
+ char *yytext_r;
+ int yy_more_flag;
+ int yy_more_len;
+
+ YYSTYPE * yylval_r;
+
+ }; /* end struct yyguts_t */
+
+static int yy_init_globals ( yyscan_t yyscanner );
+
+ /* This must go here because YYSTYPE and YYLTYPE are included
+ * from bison output in section 1.*/
+ # define yylval yyg->yylval_r
+
+int yylex_init (yyscan_t* scanner);
+
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( yyscan_t yyscanner );
+
+int yyget_debug ( yyscan_t yyscanner );
+
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
+
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+
+FILE *yyget_in ( yyscan_t yyscanner );
+
+void yyset_in ( FILE * _in_str , yyscan_t yyscanner );
+
+FILE *yyget_out ( yyscan_t yyscanner );
+
+void yyset_out ( FILE * _out_str , yyscan_t yyscanner );
+
+ int yyget_leng ( yyscan_t yyscanner );
+
+char *yyget_text ( yyscan_t yyscanner );
+
+int yyget_lineno ( yyscan_t yyscanner );
+
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
+
+int yyget_column ( yyscan_t yyscanner );
+
+void yyset_column ( int _column_no , yyscan_t yyscanner );
+
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
+
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( yyscan_t yyscanner );
+#else
+extern int yywrap ( yyscan_t yyscanner );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner);
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * , yyscan_t yyscanner);
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( yyscan_t yyscanner );
+#else
+static int input ( yyscan_t yyscanner );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner);
+
+#define YY_DECL int yylex \
+ (YYSTYPE * yylval_param , yyscan_t yyscanner)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yylval = yylval_param;
+
+ if ( !yyg->yy_init )
+ {
+ yyg->yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! yyg->yy_start )
+ yyg->yy_start = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_load_buffer_state( yyscanner );
+ }
+
+ {
+#line 121 "psqlscanslash.l"
+
+
+
+#line 125 "psqlscanslash.l"
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+ PQExpBuffer output_buf = cur_state->output_buf;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+
+
+ /*
+ * We don't really expect to be invoked in the INITIAL state in this
+ * lexer; but if we are, just spit data to the output_buf until EOF.
+ */
+
+#line 1519 "psqlscanslash.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = yyg->yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yyg->yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yyg->yy_start;
+yy_match:
+ while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 )
+ ++yy_cp;
+
+ yy_current_state = -yy_current_state;
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 144 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+/*
+ * Exclusive lexer states to handle backslash command lexing
+ */
+
+/* command name ends at whitespace or backslash; eat all else */
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 153 "psqlscanslash.l"
+{
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 159 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/*
+ * Discard any whitespace before argument, then go to xslasharg state.
+ * An exception is that "|" is only special at start of argument, so we
+ * check for it here.
+ */
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 170 "psqlscanslash.l"
+{ }
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 172 "psqlscanslash.l"
+{
+ if (option_type == OT_FILEPIPE)
+ {
+ /* treat like whole-string case */
+ ECHO;
+ BEGIN(xslashwholeline);
+ }
+ else
+ {
+ /* vertical bar is not special otherwise */
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+ }
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 187 "psqlscanslash.l"
+{
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+ YY_BREAK
+
+
+/*
+ * Default processing of text in a slash command's argument.
+ *
+ * Note: unquoted_option_chars counts the number of characters at the
+ * end of the argument that were not subject to any form of quoting.
+ * psql_scan_slash_option needs this to strip trailing semicolons safely.
+ */
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 203 "psqlscanslash.l"
+{
+ /*
+ * Unquoted space is end of arg; do not eat. Likewise
+ * backslash is end of command or next command, do not eat
+ *
+ * XXX this means we can't conveniently accept options
+ * that include unquoted backslashes; therefore, option
+ * processing that encourages use of backslashes is rather
+ * broken.
+ */
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 218 "psqlscanslash.l"
+{
+ *option_quote = '\'';
+ unquoted_option_chars = 0;
+ BEGIN(xslashquote);
+ }
+ YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 224 "psqlscanslash.l"
+{
+ backtick_start_offset = output_buf->len;
+ *option_quote = '`';
+ unquoted_option_chars = 0;
+ BEGIN(xslashbackquote);
+ }
+ YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 231 "psqlscanslash.l"
+{
+ ECHO;
+ *option_quote = '"';
+ unquoted_option_chars = 0;
+ BEGIN(xslashdquote);
+ }
+ YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 238 "psqlscanslash.l"
+{
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ /*
+ * The variable value is just emitted without any
+ * further examination. This is consistent with the
+ * pre-8.0 code behavior, if not with the way that
+ * variables are handled outside backslash commands.
+ * Note that we needn't guard against recursion here.
+ */
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+
+ *option_quote = ':';
+ }
+ unquoted_option_chars = 0;
+ }
+ YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 275 "psqlscanslash.l"
+{
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_LITERAL);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+ YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 283 "psqlscanslash.l"
+{
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_IDENT);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+ YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 290 "psqlscanslash.l"
+{
+ psqlscan_test_variable(cur_state, yytext, yyleng);
+ }
+ YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 294 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 301 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 308 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 315 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 322 "psqlscanslash.l"
+{
+ unquoted_option_chars++;
+ ECHO;
+ }
+ YY_BREAK
+
+
+/*
+ * single-quoted text: copy literally except for '' and backslash
+ * sequences
+ */
+case 20:
+YY_RULE_SETUP
+#line 335 "psqlscanslash.l"
+{ BEGIN(xslasharg); }
+ YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 337 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\''); }
+ YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 339 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\n'); }
+ YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 340 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\t'); }
+ YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 341 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\b'); }
+ YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 342 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\r'); }
+ YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 343 "psqlscanslash.l"
+{ appendPQExpBufferChar(output_buf, '\f'); }
+ YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 345 "psqlscanslash.l"
+{
+ /* octal case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 1, NULL, 8));
+ }
+ YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 351 "psqlscanslash.l"
+{
+ /* hex case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 2, NULL, 16));
+ }
+ YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 357 "psqlscanslash.l"
+{ psqlscan_emit(cur_state, yytext + 1, 1); }
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 359 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/*
+ * backticked text: copy everything until next backquote (expanding
+ * variable references, but doing nought else), then evaluate.
+ */
+case 31:
+YY_RULE_SETUP
+#line 369 "psqlscanslash.l"
+{
+ /* In an inactive \if branch, don't evaluate the command */
+ if (cur_state->cb_passthrough == NULL ||
+ conditional_active((ConditionalStack) cur_state->cb_passthrough))
+ evaluate_backtick(cur_state);
+ BEGIN(xslasharg);
+ }
+ YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 377 "psqlscanslash.l"
+{
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+ }
+ }
+ YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 404 "psqlscanslash.l"
+{
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SHELL_ARG);
+ }
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 409 "psqlscanslash.l"
+{
+ /* Throw back everything but the colon */
+ yyless(1);
+ ECHO;
+ }
+ YY_BREAK
+case 35:
+/* rule 35 can match eol */
+YY_RULE_SETUP
+#line 415 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/* double-quoted text: copy verbatim, including the double quotes */
+case 36:
+YY_RULE_SETUP
+#line 422 "psqlscanslash.l"
+{
+ ECHO;
+ BEGIN(xslasharg);
+ }
+ YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+#line 427 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/* copy everything until end of input line */
+/* but suppress leading whitespace */
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 435 "psqlscanslash.l"
+{
+ if (output_buf->len > 0)
+ ECHO;
+ }
+ YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 440 "psqlscanslash.l"
+{ ECHO; }
+ YY_BREAK
+
+
+/* at end of command, eat a double backslash, but not anything else */
+case 40:
+YY_RULE_SETUP
+#line 447 "psqlscanslash.l"
+{
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+case 41:
+/* rule 41 can match eol */
+YY_RULE_SETUP
+#line 452 "psqlscanslash.l"
+{
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+ YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(xslashcmd):
+case YY_STATE_EOF(xslashargstart):
+case YY_STATE_EOF(xslasharg):
+case YY_STATE_EOF(xslashquote):
+case YY_STATE_EOF(xslashbackquote):
+case YY_STATE_EOF(xslashdquote):
+case YY_STATE_EOF(xslashwholeline):
+case YY_STATE_EOF(xslashend):
+#line 460 "psqlscanslash.l"
+{
+ if (cur_state->buffer_stack == NULL)
+ {
+ cur_state->start_state = YY_START;
+ return LEXRES_EOL; /* end of input reached */
+ }
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+ YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 475 "psqlscanslash.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+ YY_BREAK
+#line 2013 "psqlscanslash.c"
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = yyg->yy_hold_char;
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
+
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yyg->yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = yyg->yy_c_buf_p;
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ yyg->yy_did_buffer_switch_on_eof = 0;
+
+ if ( yywrap( yyscanner ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p =
+ yyg->yytext_ptr + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ yyg->yy_c_buf_p =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
+
+ yy_current_state = yy_get_previous_state( yyscanner );
+
+ yy_cp = yyg->yy_c_buf_p;
+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = yyg->yytext_ptr;
+ int number_to_move, i;
+ int ret_val;
+
+ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ yyg->yy_n_chars, num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ if ( yyg->yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin , yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ yyg->yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_current_state = yyg->yy_start;
+
+ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
+ {
+ yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
+{
+ int yy_is_jam;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
+
+ yy_current_state = yy_nxt[yy_current_state][1];
+ yy_is_jam = (yy_current_state <= 0);
+
+ (void)yyg;
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (yyscan_t yyscanner)
+#else
+ static int input (yyscan_t yyscanner)
+#endif
+
+{
+ int c;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+
+ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
+ /* This was really a NUL. */
+ *yyg->yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr);
+ ++yyg->yy_c_buf_p;
+
+ switch ( yy_get_next_buffer( yyscanner ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin , yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( yyscanner ) )
+ return 0;
+
+ if ( ! yyg->yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput(yyscanner);
+#else
+ return input(yyscanner);
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( yyscanner );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+static void yy_load_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ yyg->yy_hold_char = *yyg->yy_c_buf_p;
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file , yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * @param yyscanner The scanner object.
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf , yyscanner );
+
+ yyfree( (void *) b , yyscanner );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
+
+{
+ int oerrno = errno;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ yy_flush_buffer( b , yyscanner);
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * @param yyscanner The scanner object.
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( yyscanner );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ * @param yyscanner The scanner object.
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack(yyscanner);
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yyg->yy_c_buf_p = yyg->yy_hold_char;
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ yyg->yy_buffer_stack_top++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+void yypop_buffer_state (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yyg->yy_buffer_stack_top > 0)
+ --yyg->yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( yyscanner );
+ yyg->yy_did_buffer_switch_on_eof = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (yyscan_t yyscanner)
+{
+ yy_size_t num_to_alloc;
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (!yyg->yy_buffer_stack) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ yyg->yy_buffer_stack_top = 0;
+ return;
+ }
+
+ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
+ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
+ (yyg->yy_buffer_stack,
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ , yyscanner);
+ if ( ! yyg->yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
+ yyg->yy_buffer_stack_max = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b , yyscanner );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n , yyscanner );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n , yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = yyg->yy_hold_char; \
+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \
+ *yyg->yy_c_buf_p = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_lineno (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int yyget_column (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_in (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *yyget_out (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int yyget_leng (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *yyget_text (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ * @param yyscanner The scanner object.
+ */
+void yyset_lineno (int _line_number , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
+
+ yylineno = _line_number;
+}
+
+/** Set the current column.
+ * @param _column_no column number
+ * @param yyscanner The scanner object.
+ */
+void yyset_column (int _column_no , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "yyset_column called with no buffer" );
+
+ yycolumn = _column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yyout = _out_str ;
+}
+
+int yyget_debug (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yy_flex_debug = _bdebug ;
+}
+
+/* Accessor methods for yylval and yylloc */
+
+YYSTYPE * yyget_lval (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ return yylval;
+}
+
+void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ yylval = yylval_param;
+}
+
+/* User-visible API */
+
+/* yylex_init is special because it creates the scanner itself, so it is
+ * the ONLY reentrant function that doesn't take the scanner as the last argument.
+ * That's why we explicitly handle the declaration, instead of using our macros.
+ */
+int yylex_init(yyscan_t* ptr_yy_globals)
+{
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+/* yylex_init_extra has the same functionality as yylex_init, but follows the
+ * convention of taking the scanner as the last argument. Note however, that
+ * this is a *pointer* to a scanner, as it will be allocated by this call (and
+ * is the reason, too, why this function also must handle its own declaration).
+ * The user defined value in the first argument will be available to yyalloc in
+ * the yyextra field.
+ */
+int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )
+{
+ struct yyguts_t dummy_yyguts;
+
+ yyset_extra (yy_user_defined, &dummy_yyguts);
+
+ if (ptr_yy_globals == NULL){
+ errno = EINVAL;
+ return 1;
+ }
+
+ *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+
+ if (*ptr_yy_globals == NULL){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ /* By setting to 0xAA, we expose bugs in
+ yy_init_globals. Leave at 0x00 for releases. */
+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
+
+ yyset_extra (yy_user_defined, *ptr_yy_globals);
+
+ return yy_init_globals ( *ptr_yy_globals );
+}
+
+static int yy_init_globals (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ yyg->yy_buffer_stack = NULL;
+ yyg->yy_buffer_stack_top = 0;
+ yyg->yy_buffer_stack_max = 0;
+ yyg->yy_c_buf_p = NULL;
+ yyg->yy_init = 0;
+ yyg->yy_start = 0;
+
+ yyg->yy_start_stack_ptr = 0;
+ yyg->yy_start_stack_depth = 0;
+ yyg->yy_start_stack = NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state(yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ yyfree(yyg->yy_buffer_stack , yyscanner);
+ yyg->yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ yyfree( yyg->yy_start_stack , yyscanner );
+ yyg->yy_start_stack = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( yyscanner);
+
+ /* Destroy the main struct (reentrant only). */
+ yyfree ( yyscanner , yyscanner );
+ yyscanner = NULL;
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s , yyscan_t yyscanner)
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr , yyscan_t yyscanner)
+{
+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+ (void)yyg;
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 475 "psqlscanslash.l"
+
+
+/* LCOV_EXCL_STOP */
+
+/*
+ * Scan the command name of a psql backslash command. This should be called
+ * after psql_scan() returns PSCAN_BACKSLASH. It is assumed that the input
+ * has been consumed through the leading backslash.
+ *
+ * The return value is a malloc'd copy of the command name, as parsed off
+ * from the input.
+ */
+char *
+psql_scan_slash_command(PsqlScanState state)
+{
+ PQExpBufferData mybuf;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /*
+ * Set lexer start state. Note that this is sufficient to switch
+ * state->scanner over to using the tables in this lexer file.
+ */
+ state->start_state = xslashcmd;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return mybuf.data;
+}
+
+/*
+ * Parse off the next argument for a backslash command, and return it as a
+ * malloc'd string. If there are no more arguments, returns NULL.
+ *
+ * type tells what processing, if any, to perform on the option string;
+ * for example, if it's a SQL identifier, we want to downcase any unquoted
+ * letters.
+ *
+ * if quote is not NULL, *quote is set to 0 if no quoting was found, else
+ * the last quote symbol used in the argument.
+ *
+ * if semicolon is true, unquoted trailing semicolon(s) that would otherwise
+ * be taken as part of the option string will be stripped.
+ *
+ * NOTE: the only possible syntax errors for backslash options are unmatched
+ * quotes, which are detected when we run out of input. Therefore, on a
+ * syntax error we just throw away the string and return NULL; there is no
+ * need to worry about flushing remaining input.
+ */
+char *
+psql_scan_slash_option(PsqlScanState state,
+ enum slash_option_type type,
+ char *quote,
+ bool semicolon)
+{
+ PQExpBufferData mybuf;
+ int lexresult PG_USED_FOR_ASSERTS_ONLY;
+ int final_state;
+ char local_quote;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ if (quote == NULL)
+ quote = &local_quote;
+ *quote = 0;
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set up static variables that will be used by yylex */
+ option_type = type;
+ option_quote = quote;
+ unquoted_option_chars = 0;
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ if (type == OT_WHOLE_LINE)
+ state->start_state = xslashwholeline;
+ else
+ state->start_state = xslashargstart;
+
+ /* And lex. */
+ lexresult = yylex(NULL, state->scanner);
+
+ /* Save final state for a moment... */
+ final_state = state->start_state;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ /*
+ * Check the lex result: we should have gotten back either LEXRES_OK
+ * or LEXRES_EOL (the latter indicating end of string). If we were inside
+ * a quoted string, as indicated by final_state, EOL is an error.
+ */
+ Assert(lexresult == LEXRES_EOL || lexresult == LEXRES_OK);
+
+ switch (final_state)
+ {
+ case xslashargstart:
+ /* empty arg */
+ break;
+ case xslasharg:
+ /* Strip any unquoted trailing semi-colons if requested */
+ if (semicolon)
+ {
+ while (unquoted_option_chars-- > 0 &&
+ mybuf.len > 0 &&
+ mybuf.data[mybuf.len - 1] == ';')
+ {
+ mybuf.data[--mybuf.len] = '\0';
+ }
+ }
+
+ /*
+ * If SQL identifier processing was requested, then we strip out
+ * excess double quotes and optionally downcase unquoted letters.
+ */
+ if (type == OT_SQLID || type == OT_SQLIDHACK)
+ {
+ dequote_downcase_identifier(mybuf.data,
+ (type != OT_SQLIDHACK),
+ state->encoding);
+ /* update mybuf.len for possible shortening */
+ mybuf.len = strlen(mybuf.data);
+ }
+ break;
+ case xslashquote:
+ case xslashbackquote:
+ case xslashdquote:
+ /* must have hit EOL inside quotes */
+ pg_log_error("unterminated quoted string");
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ case xslashwholeline:
+ /* always okay */
+ break;
+ default:
+ /* can't get here */
+ fprintf(stderr, "invalid YY_START\n");
+ exit(1);
+ }
+
+ /*
+ * An unquoted empty argument isn't possible unless we are at end of
+ * command. Return NULL instead.
+ */
+ if (mybuf.len == 0 && *quote == 0)
+ {
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ }
+
+ /* Else return the completed string. */
+ return mybuf.data;
+}
+
+/*
+ * Eat up any unused \\ to complete a backslash command.
+ */
+void
+psql_scan_slash_command_end(PsqlScanState state)
+{
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL; /* we won't output anything */
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ state->start_state = xslashend;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * We expect the caller to return to using the regular SQL lexer, so
+ * reselect the appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Fetch current paren nesting depth
+ */
+int
+psql_scan_get_paren_depth(PsqlScanState state)
+{
+ return state->paren_depth;
+}
+
+/*
+ * Set paren nesting depth
+ */
+void
+psql_scan_set_paren_depth(PsqlScanState state, int depth)
+{
+ Assert(depth >= 0);
+ state->paren_depth = depth;
+}
+
+/*
+ * De-quote and optionally downcase a SQL identifier.
+ *
+ * The string at *str is modified in-place; it can become shorter,
+ * but not longer.
+ *
+ * If downcase is true then non-quoted letters are folded to lower case.
+ * Ideally this behavior will match the backend's downcase_identifier();
+ * but note that it could differ if LC_CTYPE is different in the frontend.
+ *
+ * Note that a string like FOO"BAR"BAZ will be converted to fooBARbaz;
+ * this is somewhat inconsistent with the SQL spec, which would have us
+ * parse it as several identifiers. But for psql's purposes, we want a
+ * string like "foo"."bar" to be treated as one option, so there's little
+ * choice; this routine doesn't get to change the token boundaries.
+ */
+void
+dequote_downcase_identifier(char *str, bool downcase, int encoding)
+{
+ bool inquotes = false;
+ char *cp = str;
+
+ while (*cp)
+ {
+ if (*cp == '"')
+ {
+ if (inquotes && cp[1] == '"')
+ {
+ /* Keep the first quote, remove the second */
+ cp++;
+ }
+ else
+ inquotes = !inquotes;
+ /* Collapse out quote at *cp */
+ memmove(cp, cp + 1, strlen(cp));
+ /* do not advance cp */
+ }
+ else
+ {
+ if (downcase && !inquotes)
+ *cp = pg_tolower((unsigned char) *cp);
+ cp += PQmblenBounded(cp, encoding);
+ }
+ }
+}
+
+/*
+ * Evaluate a backticked substring of a slash command's argument.
+ *
+ * The portion of output_buf starting at backtick_start_offset is evaluated
+ * as a shell command and then replaced by the command's output.
+ */
+static void
+evaluate_backtick(PsqlScanState state)
+{
+ PQExpBuffer output_buf = state->output_buf;
+ char *cmd = output_buf->data + backtick_start_offset;
+ PQExpBufferData cmd_output;
+ FILE *fd;
+ bool error = false;
+ int exit_code = 0;
+ char buf[512];
+ size_t result;
+
+ initPQExpBuffer(&cmd_output);
+
+ fflush(NULL);
+ fd = popen(cmd, "r");
+ if (!fd)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ exit_code = -1;
+ }
+
+ if (!error)
+ {
+ do
+ {
+ result = fread(buf, 1, sizeof(buf), fd);
+ if (ferror(fd))
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ break;
+ }
+ appendBinaryPQExpBuffer(&cmd_output, buf, result);
+ } while (!feof(fd));
+ }
+
+ if (fd)
+ {
+ /*
+ * Although pclose's result always sets the shell result variables, we
+ * historically have abandoned the backtick substitution only if it
+ * returns -1.
+ */
+ exit_code = pclose(fd);
+ if (exit_code == -1)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ }
+ }
+
+ if (PQExpBufferDataBroken(cmd_output))
+ {
+ pg_log_error("%s: out of memory", cmd);
+ error = true;
+ }
+
+ /* Now done with cmd, delete it from output_buf */
+ output_buf->len = backtick_start_offset;
+ output_buf->data[output_buf->len] = '\0';
+
+ /* If no error, transfer result to output_buf */
+ if (!error)
+ {
+ /* strip any trailing newline (but only one) */
+ if (cmd_output.len > 0 &&
+ cmd_output.data[cmd_output.len - 1] == '\n')
+ cmd_output.len--;
+ appendBinaryPQExpBuffer(output_buf, cmd_output.data, cmd_output.len);
+ }
+
+ /* And finally, set the shell result variables */
+ SetShellResultVariables(exit_code);
+
+ termPQExpBuffer(&cmd_output);
+}
+
diff --git a/src/bin/psql/psqlscanslash.h b/src/bin/psql/psqlscanslash.h
new file mode 100644
index 0000000..7724242
--- /dev/null
+++ b/src/bin/psql/psqlscanslash.h
@@ -0,0 +1,40 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/psqlscanslash.h
+ */
+#ifndef PSQLSCANSLASH_H
+#define PSQLSCANSLASH_H
+
+#include "fe_utils/psqlscan.h"
+
+
+/* Different ways for scan_slash_option to handle parameter words */
+enum slash_option_type
+{
+ OT_NORMAL, /* normal case */
+ OT_SQLID, /* treat as SQL identifier */
+ OT_SQLIDHACK, /* SQL identifier, but don't downcase */
+ OT_FILEPIPE, /* it's a filename or pipe */
+ OT_WHOLE_LINE /* just snarf the rest of the line */
+};
+
+
+extern char *psql_scan_slash_command(PsqlScanState state);
+
+extern char *psql_scan_slash_option(PsqlScanState state,
+ enum slash_option_type type,
+ char *quote,
+ bool semicolon);
+
+extern void psql_scan_slash_command_end(PsqlScanState state);
+
+extern int psql_scan_get_paren_depth(PsqlScanState state);
+
+extern void psql_scan_set_paren_depth(PsqlScanState state, int depth);
+
+extern void dequote_downcase_identifier(char *str, bool downcase, int encoding);
+
+#endif /* PSQLSCANSLASH_H */
diff --git a/src/bin/psql/psqlscanslash.l b/src/bin/psql/psqlscanslash.l
new file mode 100644
index 0000000..5c020f3
--- /dev/null
+++ b/src/bin/psql/psqlscanslash.l
@@ -0,0 +1,846 @@
+%top{
+/*-------------------------------------------------------------------------
+ *
+ * psqlscanslash.l
+ * lexical scanner for psql backslash commands
+ *
+ * XXX Avoid creating backtracking cases --- see the backend lexer for info.
+ *
+ * See fe_utils/psqlscan_int.h for additional commentary.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/bin/psql/psqlscanslash.l
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "psqlscanslash.h"
+
+#include "common/logging.h"
+#include "fe_utils/conditional.h"
+
+#include "libpq-fe.h"
+}
+
+%{
+#include "fe_utils/psqlscan_int.h"
+
+/*
+ * We must have a typedef YYSTYPE for yylex's first argument, but this lexer
+ * doesn't presently make use of that argument, so just declare it as int.
+ */
+typedef int YYSTYPE;
+
+/*
+ * Set the type of yyextra; we use it as a pointer back to the containing
+ * PsqlScanState.
+ */
+#define YY_EXTRA_TYPE PsqlScanState
+
+/*
+ * These variables do not need to be saved across calls. Yeah, it's a bit
+ * of a hack, but putting them into PsqlScanStateData would be klugy too.
+ */
+static enum slash_option_type option_type;
+static char *option_quote;
+static int unquoted_option_chars;
+static int backtick_start_offset;
+
+
+/* Return values from yylex() */
+#define LEXRES_EOL 0 /* end of input */
+#define LEXRES_OK 1 /* OK completion of backslash argument */
+
+
+static void evaluate_backtick(PsqlScanState state);
+
+#define ECHO psqlscan_emit(cur_state, yytext, yyleng)
+
+/*
+ * Work around a bug in flex 2.5.35: it emits a couple of functions that
+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,
+ * this would cause warnings. Providing our own declarations should be
+ * harmless even when the bug gets fixed.
+ */
+extern int slash_yyget_column(yyscan_t yyscanner);
+extern void slash_yyset_column(int column_no, yyscan_t yyscanner);
+
+/* LCOV_EXCL_START */
+
+%}
+
+/* Except for the prefix, these options should match psqlscan.l */
+%option reentrant
+%option bison-bridge
+%option 8bit
+%option never-interactive
+%option nodefault
+%option noinput
+%option nounput
+%option noyywrap
+%option warn
+%option prefix="slash_yy"
+
+/*
+ * OK, here is a short description of lex/flex rules behavior.
+ * The longest pattern which matches an input string is always chosen.
+ * For equal-length patterns, the first occurring in the rules list is chosen.
+ * INITIAL is the starting state, to which all non-conditional rules apply.
+ * Exclusive states change parsing rules while the state is active. When in
+ * an exclusive state, only those rules defined for that state apply.
+ */
+
+/* Exclusive states for lexing backslash commands */
+%x xslashcmd
+%x xslashargstart
+%x xslasharg
+%x xslashquote
+%x xslashbackquote
+%x xslashdquote
+%x xslashwholeline
+%x xslashend
+
+/*
+ * Assorted character class definitions that should match psqlscan.l.
+ */
+space [ \t\n\r\f]
+quote '
+xeoctesc [\\][0-7]{1,3}
+xehexesc [\\]x[0-9A-Fa-f]{1,2}
+xqdouble {quote}{quote}
+dquote \"
+variable_char [A-Za-z\200-\377_0-9]
+
+other .
+
+%%
+
+%{
+ /* Declare some local variables inside yylex(), for convenience */
+ PsqlScanState cur_state = yyextra;
+ PQExpBuffer output_buf = cur_state->output_buf;
+
+ /*
+ * Force flex into the state indicated by start_state. This has a
+ * couple of purposes: it lets some of the functions below set a new
+ * starting state without ugly direct access to flex variables, and it
+ * allows us to transition from one flex lexer to another so that we
+ * can lex different parts of the source string using separate lexers.
+ */
+ BEGIN(cur_state->start_state);
+%}
+
+ /*
+ * We don't really expect to be invoked in the INITIAL state in this
+ * lexer; but if we are, just spit data to the output_buf until EOF.
+ */
+
+{other}|\n { ECHO; }
+
+ /*
+ * Exclusive lexer states to handle backslash command lexing
+ */
+
+<xslashcmd>{
+ /* command name ends at whitespace or backslash; eat all else */
+
+{space}|"\\" {
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+{other} { ECHO; }
+
+}
+
+<xslashargstart>{
+ /*
+ * Discard any whitespace before argument, then go to xslasharg state.
+ * An exception is that "|" is only special at start of argument, so we
+ * check for it here.
+ */
+
+{space}+ { }
+
+"|" {
+ if (option_type == OT_FILEPIPE)
+ {
+ /* treat like whole-string case */
+ ECHO;
+ BEGIN(xslashwholeline);
+ }
+ else
+ {
+ /* vertical bar is not special otherwise */
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+ }
+
+{other} {
+ yyless(0);
+ BEGIN(xslasharg);
+ }
+
+}
+
+<xslasharg>{
+ /*
+ * Default processing of text in a slash command's argument.
+ *
+ * Note: unquoted_option_chars counts the number of characters at the
+ * end of the argument that were not subject to any form of quoting.
+ * psql_scan_slash_option needs this to strip trailing semicolons safely.
+ */
+
+{space}|"\\" {
+ /*
+ * Unquoted space is end of arg; do not eat. Likewise
+ * backslash is end of command or next command, do not eat
+ *
+ * XXX this means we can't conveniently accept options
+ * that include unquoted backslashes; therefore, option
+ * processing that encourages use of backslashes is rather
+ * broken.
+ */
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+{quote} {
+ *option_quote = '\'';
+ unquoted_option_chars = 0;
+ BEGIN(xslashquote);
+ }
+
+"`" {
+ backtick_start_offset = output_buf->len;
+ *option_quote = '`';
+ unquoted_option_chars = 0;
+ BEGIN(xslashbackquote);
+ }
+
+{dquote} {
+ ECHO;
+ *option_quote = '"';
+ unquoted_option_chars = 0;
+ BEGIN(xslashdquote);
+ }
+
+:{variable_char}+ {
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ /*
+ * The variable value is just emitted without any
+ * further examination. This is consistent with the
+ * pre-8.0 code behavior, if not with the way that
+ * variables are handled outside backslash commands.
+ * Note that we needn't guard against recursion here.
+ */
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+
+ *option_quote = ':';
+ }
+ unquoted_option_chars = 0;
+ }
+
+:'{variable_char}+' {
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_LITERAL);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+
+
+:\"{variable_char}+\" {
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SQL_IDENT);
+ *option_quote = ':';
+ unquoted_option_chars = 0;
+ }
+
+:\{\?{variable_char}+\} {
+ psqlscan_test_variable(cur_state, yytext, yyleng);
+ }
+
+:'{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+:\"{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+:\{\?{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+:\{ {
+ /* Throw back everything but the colon */
+ yyless(1);
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+{other} {
+ unquoted_option_chars++;
+ ECHO;
+ }
+
+}
+
+<xslashquote>{
+ /*
+ * single-quoted text: copy literally except for '' and backslash
+ * sequences
+ */
+
+{quote} { BEGIN(xslasharg); }
+
+{xqdouble} { appendPQExpBufferChar(output_buf, '\''); }
+
+"\\n" { appendPQExpBufferChar(output_buf, '\n'); }
+"\\t" { appendPQExpBufferChar(output_buf, '\t'); }
+"\\b" { appendPQExpBufferChar(output_buf, '\b'); }
+"\\r" { appendPQExpBufferChar(output_buf, '\r'); }
+"\\f" { appendPQExpBufferChar(output_buf, '\f'); }
+
+{xeoctesc} {
+ /* octal case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 1, NULL, 8));
+ }
+
+{xehexesc} {
+ /* hex case */
+ appendPQExpBufferChar(output_buf,
+ (char) strtol(yytext + 2, NULL, 16));
+ }
+
+"\\". { psqlscan_emit(cur_state, yytext + 1, 1); }
+
+{other}|\n { ECHO; }
+
+}
+
+<xslashbackquote>{
+ /*
+ * backticked text: copy everything until next backquote (expanding
+ * variable references, but doing nought else), then evaluate.
+ */
+
+"`" {
+ /* In an inactive \if branch, don't evaluate the command */
+ if (cur_state->cb_passthrough == NULL ||
+ conditional_active((ConditionalStack) cur_state->cb_passthrough))
+ evaluate_backtick(cur_state);
+ BEGIN(xslasharg);
+ }
+
+:{variable_char}+ {
+ /* Possible psql variable substitution */
+ if (cur_state->callbacks->get_variable == NULL)
+ ECHO;
+ else
+ {
+ char *varname;
+ char *value;
+
+ varname = psqlscan_extract_substring(cur_state,
+ yytext + 1,
+ yyleng - 1);
+ value = cur_state->callbacks->get_variable(varname,
+ PQUOTE_PLAIN,
+ cur_state->cb_passthrough);
+ free(varname);
+
+ if (value)
+ {
+ appendPQExpBufferStr(output_buf, value);
+ free(value);
+ }
+ else
+ ECHO;
+ }
+ }
+
+:'{variable_char}+' {
+ psqlscan_escape_variable(cur_state, yytext, yyleng,
+ PQUOTE_SHELL_ARG);
+ }
+
+:'{variable_char}* {
+ /* Throw back everything but the colon */
+ yyless(1);
+ ECHO;
+ }
+
+{other}|\n { ECHO; }
+
+}
+
+<xslashdquote>{
+ /* double-quoted text: copy verbatim, including the double quotes */
+
+{dquote} {
+ ECHO;
+ BEGIN(xslasharg);
+ }
+
+{other}|\n { ECHO; }
+
+}
+
+<xslashwholeline>{
+ /* copy everything until end of input line */
+ /* but suppress leading whitespace */
+
+{space}+ {
+ if (output_buf->len > 0)
+ ECHO;
+ }
+
+{other} { ECHO; }
+
+}
+
+<xslashend>{
+ /* at end of command, eat a double backslash, but not anything else */
+
+"\\\\" {
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+{other}|\n {
+ yyless(0);
+ cur_state->start_state = YY_START;
+ return LEXRES_OK;
+ }
+
+}
+
+<<EOF>> {
+ if (cur_state->buffer_stack == NULL)
+ {
+ cur_state->start_state = YY_START;
+ return LEXRES_EOL; /* end of input reached */
+ }
+
+ /*
+ * We were expanding a variable, so pop the inclusion
+ * stack and keep lexing
+ */
+ psqlscan_pop_buffer_stack(cur_state);
+ psqlscan_select_top_buffer(cur_state);
+ }
+
+%%
+
+/* LCOV_EXCL_STOP */
+
+/*
+ * Scan the command name of a psql backslash command. This should be called
+ * after psql_scan() returns PSCAN_BACKSLASH. It is assumed that the input
+ * has been consumed through the leading backslash.
+ *
+ * The return value is a malloc'd copy of the command name, as parsed off
+ * from the input.
+ */
+char *
+psql_scan_slash_command(PsqlScanState state)
+{
+ PQExpBufferData mybuf;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /*
+ * Set lexer start state. Note that this is sufficient to switch
+ * state->scanner over to using the tables in this lexer file.
+ */
+ state->start_state = xslashcmd;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ return mybuf.data;
+}
+
+/*
+ * Parse off the next argument for a backslash command, and return it as a
+ * malloc'd string. If there are no more arguments, returns NULL.
+ *
+ * type tells what processing, if any, to perform on the option string;
+ * for example, if it's a SQL identifier, we want to downcase any unquoted
+ * letters.
+ *
+ * if quote is not NULL, *quote is set to 0 if no quoting was found, else
+ * the last quote symbol used in the argument.
+ *
+ * if semicolon is true, unquoted trailing semicolon(s) that would otherwise
+ * be taken as part of the option string will be stripped.
+ *
+ * NOTE: the only possible syntax errors for backslash options are unmatched
+ * quotes, which are detected when we run out of input. Therefore, on a
+ * syntax error we just throw away the string and return NULL; there is no
+ * need to worry about flushing remaining input.
+ */
+char *
+psql_scan_slash_option(PsqlScanState state,
+ enum slash_option_type type,
+ char *quote,
+ bool semicolon)
+{
+ PQExpBufferData mybuf;
+ int lexresult PG_USED_FOR_ASSERTS_ONLY;
+ int final_state;
+ char local_quote;
+
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ if (quote == NULL)
+ quote = &local_quote;
+ *quote = 0;
+
+ /* Build a local buffer that we'll return the data of */
+ initPQExpBuffer(&mybuf);
+
+ /* Set up static variables that will be used by yylex */
+ option_type = type;
+ option_quote = quote;
+ unquoted_option_chars = 0;
+
+ /* Set current output target */
+ state->output_buf = &mybuf;
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ if (type == OT_WHOLE_LINE)
+ state->start_state = xslashwholeline;
+ else
+ state->start_state = xslashargstart;
+
+ /* And lex. */
+ lexresult = yylex(NULL, state->scanner);
+
+ /* Save final state for a moment... */
+ final_state = state->start_state;
+
+ /*
+ * In case the caller returns to using the regular SQL lexer, reselect the
+ * appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+
+ /*
+ * Check the lex result: we should have gotten back either LEXRES_OK
+ * or LEXRES_EOL (the latter indicating end of string). If we were inside
+ * a quoted string, as indicated by final_state, EOL is an error.
+ */
+ Assert(lexresult == LEXRES_EOL || lexresult == LEXRES_OK);
+
+ switch (final_state)
+ {
+ case xslashargstart:
+ /* empty arg */
+ break;
+ case xslasharg:
+ /* Strip any unquoted trailing semi-colons if requested */
+ if (semicolon)
+ {
+ while (unquoted_option_chars-- > 0 &&
+ mybuf.len > 0 &&
+ mybuf.data[mybuf.len - 1] == ';')
+ {
+ mybuf.data[--mybuf.len] = '\0';
+ }
+ }
+
+ /*
+ * If SQL identifier processing was requested, then we strip out
+ * excess double quotes and optionally downcase unquoted letters.
+ */
+ if (type == OT_SQLID || type == OT_SQLIDHACK)
+ {
+ dequote_downcase_identifier(mybuf.data,
+ (type != OT_SQLIDHACK),
+ state->encoding);
+ /* update mybuf.len for possible shortening */
+ mybuf.len = strlen(mybuf.data);
+ }
+ break;
+ case xslashquote:
+ case xslashbackquote:
+ case xslashdquote:
+ /* must have hit EOL inside quotes */
+ pg_log_error("unterminated quoted string");
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ case xslashwholeline:
+ /* always okay */
+ break;
+ default:
+ /* can't get here */
+ fprintf(stderr, "invalid YY_START\n");
+ exit(1);
+ }
+
+ /*
+ * An unquoted empty argument isn't possible unless we are at end of
+ * command. Return NULL instead.
+ */
+ if (mybuf.len == 0 && *quote == 0)
+ {
+ termPQExpBuffer(&mybuf);
+ return NULL;
+ }
+
+ /* Else return the completed string. */
+ return mybuf.data;
+}
+
+/*
+ * Eat up any unused \\ to complete a backslash command.
+ */
+void
+psql_scan_slash_command_end(PsqlScanState state)
+{
+ /* Must be scanning already */
+ Assert(state->scanbufhandle != NULL);
+
+ /* Set current output target */
+ state->output_buf = NULL; /* we won't output anything */
+
+ /* Set input source */
+ if (state->buffer_stack != NULL)
+ yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
+ else
+ yy_switch_to_buffer(state->scanbufhandle, state->scanner);
+
+ /* Set lexer start state */
+ state->start_state = xslashend;
+
+ /* And lex. */
+ yylex(NULL, state->scanner);
+
+ /* There are no possible errors in this lex state... */
+
+ /*
+ * We expect the caller to return to using the regular SQL lexer, so
+ * reselect the appropriate initial state.
+ */
+ psql_scan_reselect_sql_lexer(state);
+}
+
+/*
+ * Fetch current paren nesting depth
+ */
+int
+psql_scan_get_paren_depth(PsqlScanState state)
+{
+ return state->paren_depth;
+}
+
+/*
+ * Set paren nesting depth
+ */
+void
+psql_scan_set_paren_depth(PsqlScanState state, int depth)
+{
+ Assert(depth >= 0);
+ state->paren_depth = depth;
+}
+
+/*
+ * De-quote and optionally downcase a SQL identifier.
+ *
+ * The string at *str is modified in-place; it can become shorter,
+ * but not longer.
+ *
+ * If downcase is true then non-quoted letters are folded to lower case.
+ * Ideally this behavior will match the backend's downcase_identifier();
+ * but note that it could differ if LC_CTYPE is different in the frontend.
+ *
+ * Note that a string like FOO"BAR"BAZ will be converted to fooBARbaz;
+ * this is somewhat inconsistent with the SQL spec, which would have us
+ * parse it as several identifiers. But for psql's purposes, we want a
+ * string like "foo"."bar" to be treated as one option, so there's little
+ * choice; this routine doesn't get to change the token boundaries.
+ */
+void
+dequote_downcase_identifier(char *str, bool downcase, int encoding)
+{
+ bool inquotes = false;
+ char *cp = str;
+
+ while (*cp)
+ {
+ if (*cp == '"')
+ {
+ if (inquotes && cp[1] == '"')
+ {
+ /* Keep the first quote, remove the second */
+ cp++;
+ }
+ else
+ inquotes = !inquotes;
+ /* Collapse out quote at *cp */
+ memmove(cp, cp + 1, strlen(cp));
+ /* do not advance cp */
+ }
+ else
+ {
+ if (downcase && !inquotes)
+ *cp = pg_tolower((unsigned char) *cp);
+ cp += PQmblenBounded(cp, encoding);
+ }
+ }
+}
+
+/*
+ * Evaluate a backticked substring of a slash command's argument.
+ *
+ * The portion of output_buf starting at backtick_start_offset is evaluated
+ * as a shell command and then replaced by the command's output.
+ */
+static void
+evaluate_backtick(PsqlScanState state)
+{
+ PQExpBuffer output_buf = state->output_buf;
+ char *cmd = output_buf->data + backtick_start_offset;
+ PQExpBufferData cmd_output;
+ FILE *fd;
+ bool error = false;
+ int exit_code = 0;
+ char buf[512];
+ size_t result;
+
+ initPQExpBuffer(&cmd_output);
+
+ fflush(NULL);
+ fd = popen(cmd, "r");
+ if (!fd)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ exit_code = -1;
+ }
+
+ if (!error)
+ {
+ do
+ {
+ result = fread(buf, 1, sizeof(buf), fd);
+ if (ferror(fd))
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ break;
+ }
+ appendBinaryPQExpBuffer(&cmd_output, buf, result);
+ } while (!feof(fd));
+ }
+
+ if (fd)
+ {
+ /*
+ * Although pclose's result always sets the shell result variables, we
+ * historically have abandoned the backtick substitution only if it
+ * returns -1.
+ */
+ exit_code = pclose(fd);
+ if (exit_code == -1)
+ {
+ pg_log_error("%s: %m", cmd);
+ error = true;
+ }
+ }
+
+ if (PQExpBufferDataBroken(cmd_output))
+ {
+ pg_log_error("%s: out of memory", cmd);
+ error = true;
+ }
+
+ /* Now done with cmd, delete it from output_buf */
+ output_buf->len = backtick_start_offset;
+ output_buf->data[output_buf->len] = '\0';
+
+ /* If no error, transfer result to output_buf */
+ if (!error)
+ {
+ /* strip any trailing newline (but only one) */
+ if (cmd_output.len > 0 &&
+ cmd_output.data[cmd_output.len - 1] == '\n')
+ cmd_output.len--;
+ appendBinaryPQExpBuffer(output_buf, cmd_output.data, cmd_output.len);
+ }
+
+ /* And finally, set the shell result variables */
+ SetShellResultVariables(exit_code);
+
+ termPQExpBuffer(&cmd_output);
+}
diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h
new file mode 100644
index 0000000..1106954
--- /dev/null
+++ b/src/bin/psql/settings.h
@@ -0,0 +1,174 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/settings.h
+ */
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include "fe_utils/print.h"
+#include "variables.h"
+
+#define DEFAULT_CSV_FIELD_SEP ','
+#define DEFAULT_FIELD_SEP "|"
+#define DEFAULT_RECORD_SEP "\n"
+
+#if defined(WIN32) || defined(__CYGWIN__)
+#define DEFAULT_EDITOR "notepad.exe"
+/* no DEFAULT_EDITOR_LINENUMBER_ARG for Notepad */
+#else
+#define DEFAULT_EDITOR "vi"
+#define DEFAULT_EDITOR_LINENUMBER_ARG "+"
+#endif
+
+#define DEFAULT_PROMPT1 "%/%R%x%# "
+#define DEFAULT_PROMPT2 "%/%R%x%# "
+#define DEFAULT_PROMPT3 ">> "
+
+/*
+ * Note: these enums should generally be chosen so that zero corresponds
+ * to the default behavior.
+ */
+
+typedef enum
+{
+ PSQL_ECHO_NONE,
+ PSQL_ECHO_QUERIES,
+ PSQL_ECHO_ERRORS,
+ PSQL_ECHO_ALL
+} PSQL_ECHO;
+
+typedef enum
+{
+ PSQL_ECHO_HIDDEN_OFF,
+ PSQL_ECHO_HIDDEN_ON,
+ PSQL_ECHO_HIDDEN_NOEXEC
+} PSQL_ECHO_HIDDEN;
+
+typedef enum
+{
+ PSQL_ERROR_ROLLBACK_OFF,
+ PSQL_ERROR_ROLLBACK_INTERACTIVE,
+ PSQL_ERROR_ROLLBACK_ON
+} PSQL_ERROR_ROLLBACK;
+
+typedef enum
+{
+ PSQL_COMP_CASE_PRESERVE_UPPER,
+ PSQL_COMP_CASE_PRESERVE_LOWER,
+ PSQL_COMP_CASE_UPPER,
+ PSQL_COMP_CASE_LOWER
+} PSQL_COMP_CASE;
+
+typedef enum
+{
+ hctl_none = 0,
+ hctl_ignorespace = 1,
+ hctl_ignoredups = 2,
+ hctl_ignoreboth = hctl_ignorespace | hctl_ignoredups
+} HistControl;
+
+enum trivalue
+{
+ TRI_DEFAULT,
+ TRI_NO,
+ TRI_YES
+};
+
+typedef struct _psqlSettings
+{
+ PGconn *db; /* connection to backend */
+ int encoding; /* client_encoding */
+ FILE *queryFout; /* where to send the query results */
+ bool queryFoutPipe; /* queryFout is from a popen() */
+
+ FILE *copyStream; /* Stream to read/write for \copy command */
+
+ PGresult *last_error_result; /* most recent error result, if any */
+
+ printQueryOpt popt; /* The active print format settings */
+
+ char *gfname; /* one-shot file output argument for \g */
+ printQueryOpt *gsavepopt; /* if not null, saved print format settings */
+
+ char *gset_prefix; /* one-shot prefix argument for \gset */
+ bool gdesc_flag; /* one-shot request to describe query result */
+ bool gexec_flag; /* one-shot request to execute query result */
+ bool bind_flag; /* one-shot request to use extended query
+ * protocol */
+ int bind_nparams; /* number of parameters */
+ char **bind_params; /* parameters for extended query protocol call */
+ bool crosstab_flag; /* one-shot request to crosstab result */
+ char *ctv_args[4]; /* \crosstabview arguments */
+
+ bool notty; /* stdin or stdout is not a tty (as determined
+ * on startup) */
+ enum trivalue getPassword; /* prompt the user for a username and password */
+ FILE *cur_cmd_source; /* describe the status of the current main
+ * loop */
+ bool cur_cmd_interactive;
+ int sversion; /* backend server version */
+ const char *progname; /* in case you renamed psql */
+ char *inputfile; /* file being currently processed, if any */
+ uint64 lineno; /* also for error reporting */
+ uint64 stmt_lineno; /* line number inside the current statement */
+
+ bool timing; /* enable timing of all queries */
+
+ FILE *logfile; /* session log file handle */
+
+ VariableSpace vars; /* "shell variable" repository */
+
+ /*
+ * If we get a connection failure, the now-unusable PGconn is stashed here
+ * until we can successfully reconnect. Never attempt to do anything with
+ * this PGconn except extract parameters for a \connect attempt.
+ */
+ PGconn *dead_conn; /* previous connection to backend */
+
+ /*
+ * The remaining fields are set by assign hooks associated with entries in
+ * "vars". They should not be set directly except by those hook
+ * functions.
+ */
+ bool autocommit;
+ bool on_error_stop;
+ bool quiet;
+ bool singleline;
+ bool singlestep;
+ bool hide_compression;
+ bool hide_tableam;
+ int fetch_count;
+ int histsize;
+ int ignoreeof;
+ PSQL_ECHO echo;
+ PSQL_ECHO_HIDDEN echo_hidden;
+ PSQL_ERROR_ROLLBACK on_error_rollback;
+ PSQL_COMP_CASE comp_case;
+ HistControl histcontrol;
+ const char *prompt1;
+ const char *prompt2;
+ const char *prompt3;
+ PGVerbosity verbosity; /* current error verbosity level */
+ bool show_all_results;
+ PGContextVisibility show_context; /* current context display level */
+} PsqlSettings;
+
+extern PsqlSettings pset;
+
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+#define EXIT_BADCONN 2
+
+#define EXIT_USER 3
+
+#endif
diff --git a/src/bin/psql/sql_help.c b/src/bin/psql/sql_help.c
new file mode 100644
index 0000000..5baae9c
--- /dev/null
+++ b/src/bin/psql/sql_help.c
@@ -0,0 +1,6259 @@
+/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#define N_(x) (x) /* gettext noop */
+
+#include "postgres_fe.h"
+#include "sql_help.h"
+
+static void
+sql_help_ABORT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ABORT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_ALTER_AGGREGATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER AGGREGATE %s ( %s ) RENAME TO %s\n"
+ "ALTER AGGREGATE %s ( %s )\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER AGGREGATE %s ( %s ) SET SCHEMA %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("name"),
+ _("aggregate_signature"),
+ _("new_name"),
+ _("name"),
+ _("aggregate_signature"),
+ _("new_owner"),
+ _("name"),
+ _("aggregate_signature"),
+ _("new_schema"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_ALTER_COLLATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER COLLATION %s REFRESH VERSION\n"
+ "\n"
+ "ALTER COLLATION %s RENAME TO %s\n"
+ "ALTER COLLATION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER COLLATION %s SET SCHEMA %s",
+ _("name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_CONVERSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER CONVERSION %s RENAME TO %s\n"
+ "ALTER CONVERSION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER CONVERSION %s SET SCHEMA %s",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_DATABASE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER DATABASE %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ALLOW_CONNECTIONS %s\n"
+ " CONNECTION LIMIT %s\n"
+ " IS_TEMPLATE %s\n"
+ "\n"
+ "ALTER DATABASE %s RENAME TO %s\n"
+ "\n"
+ "ALTER DATABASE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER DATABASE %s SET TABLESPACE %s\n"
+ "\n"
+ "ALTER DATABASE %s REFRESH COLLATION VERSION\n"
+ "\n"
+ "ALTER DATABASE %s SET %s { TO | = } { %s | DEFAULT }\n"
+ "ALTER DATABASE %s SET %s FROM CURRENT\n"
+ "ALTER DATABASE %s RESET %s\n"
+ "ALTER DATABASE %s RESET ALL",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("allowconn"),
+ _("connlimit"),
+ _("istemplate"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_tablespace"),
+ _("name"),
+ _("name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("name"),
+ _("configuration_parameter"),
+ _("name"),
+ _("configuration_parameter"),
+ _("name"));
+}
+
+static void
+sql_help_ALTER_DEFAULT_PRIVILEGES(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER DEFAULT PRIVILEGES\n"
+ " [ FOR { ROLE | USER } %s [, ...] ]\n"
+ " [ IN SCHEMA %s [, ...] ]\n"
+ " %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON TABLES\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SEQUENCES\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { FUNCTIONS | ROUTINES }\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPES\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "GRANT { USAGE | CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMAS\n"
+ " TO { [ GROUP ] %s | PUBLIC } [, ...] [ WITH GRANT OPTION ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON TABLES\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SEQUENCES\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { FUNCTIONS | ROUTINES }\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPES\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMAS\n"
+ " FROM { [ GROUP ] %s | PUBLIC } [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("target_role"),
+ _("schema_name"),
+ _("abbreviated_grant_or_revoke"),
+ _("where abbreviated_grant_or_revoke is one of:"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"));
+}
+
+static void
+sql_help_ALTER_DOMAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER DOMAIN %s\n"
+ " { SET DEFAULT %s | DROP DEFAULT }\n"
+ "ALTER DOMAIN %s\n"
+ " { SET | DROP } NOT NULL\n"
+ "ALTER DOMAIN %s\n"
+ " ADD %s [ NOT VALID ]\n"
+ "ALTER DOMAIN %s\n"
+ " DROP CONSTRAINT [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ "ALTER DOMAIN %s\n"
+ " RENAME CONSTRAINT %s TO %s\n"
+ "ALTER DOMAIN %s\n"
+ " VALIDATE CONSTRAINT %s\n"
+ "ALTER DOMAIN %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER DOMAIN %s\n"
+ " RENAME TO %s\n"
+ "ALTER DOMAIN %s\n"
+ " SET SCHEMA %s",
+ _("name"),
+ _("expression"),
+ _("name"),
+ _("name"),
+ _("domain_constraint"),
+ _("name"),
+ _("constraint_name"),
+ _("name"),
+ _("constraint_name"),
+ _("new_constraint_name"),
+ _("name"),
+ _("constraint_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_EVENT_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER EVENT TRIGGER %s DISABLE\n"
+ "ALTER EVENT TRIGGER %s ENABLE [ REPLICA | ALWAYS ]\n"
+ "ALTER EVENT TRIGGER %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER EVENT TRIGGER %s RENAME TO %s",
+ _("name"),
+ _("name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_EXTENSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER EXTENSION %s UPDATE [ TO %s ]\n"
+ "ALTER EXTENSION %s SET SCHEMA %s\n"
+ "ALTER EXTENSION %s ADD %s\n"
+ "ALTER EXTENSION %s DROP %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ACCESS METHOD %s |\n"
+ " AGGREGATE %s ( %s ) |\n"
+ " CAST (%s AS %s) |\n"
+ " COLLATION %s |\n"
+ " CONVERSION %s |\n"
+ " DOMAIN %s |\n"
+ " EVENT TRIGGER %s |\n"
+ " FOREIGN DATA WRAPPER %s |\n"
+ " FOREIGN TABLE %s |\n"
+ " FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " MATERIALIZED VIEW %s |\n"
+ " OPERATOR %s (%s, %s) |\n"
+ " OPERATOR CLASS %s USING %s |\n"
+ " OPERATOR FAMILY %s USING %s |\n"
+ " [ PROCEDURAL ] LANGUAGE %s |\n"
+ " PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " SCHEMA %s |\n"
+ " SEQUENCE %s |\n"
+ " SERVER %s |\n"
+ " TABLE %s |\n"
+ " TEXT SEARCH CONFIGURATION %s |\n"
+ " TEXT SEARCH DICTIONARY %s |\n"
+ " TEXT SEARCH PARSER %s |\n"
+ " TEXT SEARCH TEMPLATE %s |\n"
+ " TRANSFORM FOR %s LANGUAGE %s |\n"
+ " TYPE %s |\n"
+ " VIEW %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("name"),
+ _("new_version"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("member_object"),
+ _("name"),
+ _("member_object"),
+ _("where member_object is:"),
+ _("object_name"),
+ _("aggregate_name"),
+ _("aggregate_signature"),
+ _("source_type"),
+ _("target_type"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("function_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("operator_name"),
+ _("left_type"),
+ _("right_type"),
+ _("object_name"),
+ _("index_method"),
+ _("object_name"),
+ _("index_method"),
+ _("object_name"),
+ _("procedure_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("routine_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("type_name"),
+ _("lang_name"),
+ _("object_name"),
+ _("object_name"),
+ _("and aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_ALTER_FOREIGN_DATA_WRAPPER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER FOREIGN DATA WRAPPER %s\n"
+ " [ HANDLER %s | NO HANDLER ]\n"
+ " [ VALIDATOR %s | NO VALIDATOR ]\n"
+ " [ OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ]) ]\n"
+ "ALTER FOREIGN DATA WRAPPER %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER FOREIGN DATA WRAPPER %s RENAME TO %s",
+ _("name"),
+ _("handler_function"),
+ _("validator_function"),
+ _("option"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_FOREIGN_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " %s [, ... ]\n"
+ "ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER FOREIGN TABLE [ IF EXISTS ] %s\n"
+ " RENAME TO %s\n"
+ "ALTER FOREIGN TABLE [ IF EXISTS ] %s\n"
+ " SET SCHEMA %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ADD [ COLUMN ] %s %s [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " DROP [ COLUMN ] [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " ALTER [ COLUMN ] %s [ SET DATA ] TYPE %s [ COLLATE %s ]\n"
+ " ALTER [ COLUMN ] %s SET DEFAULT %s\n"
+ " ALTER [ COLUMN ] %s DROP DEFAULT\n"
+ " ALTER [ COLUMN ] %s { SET | DROP } NOT NULL\n"
+ " ALTER [ COLUMN ] %s SET STATISTICS %s\n"
+ " ALTER [ COLUMN ] %s SET ( %s = %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s RESET ( %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }\n"
+ " ALTER [ COLUMN ] %s OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ])\n"
+ " ADD %s [ NOT VALID ]\n"
+ " VALIDATE CONSTRAINT %s\n"
+ " DROP CONSTRAINT [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " DISABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE REPLICA TRIGGER %s\n"
+ " ENABLE ALWAYS TRIGGER %s\n"
+ " SET WITHOUT OIDS\n"
+ " INHERIT %s\n"
+ " NO INHERIT %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ " OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ])",
+ _("name"),
+ _("action"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("where action is one of:"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("column_constraint"),
+ _("column_name"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("integer"),
+ _("column_name"),
+ _("attribute_option"),
+ _("value"),
+ _("column_name"),
+ _("attribute_option"),
+ _("column_name"),
+ _("column_name"),
+ _("option"),
+ _("value"),
+ _("table_constraint"),
+ _("constraint_name"),
+ _("constraint_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("parent_table"),
+ _("parent_table"),
+ _("new_owner"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_ALTER_FUNCTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " %s [ ... ] [ RESTRICT ]\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " RENAME TO %s\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " SET SCHEMA %s\n"
+ "ALTER FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT\n"
+ " IMMUTABLE | STABLE | VOLATILE\n"
+ " [ NOT ] LEAKPROOF\n"
+ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " PARALLEL { UNSAFE | RESTRICTED | SAFE }\n"
+ " COST %s\n"
+ " ROWS %s\n"
+ " SUPPORT %s\n"
+ " SET %s { TO | = } { %s | DEFAULT }\n"
+ " SET %s FROM CURRENT\n"
+ " RESET %s\n"
+ " RESET ALL",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("action"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_name"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_owner"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_schema"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("extension_name"),
+ _("where action is one of:"),
+ _("execution_cost"),
+ _("result_rows"),
+ _("support_function"),
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_GROUP(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER GROUP %s ADD USER %s [, ... ]\n"
+ "ALTER GROUP %s DROP USER %s [, ... ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER\n"
+ "\n"
+ "ALTER GROUP %s RENAME TO %s",
+ _("role_specification"),
+ _("user_name"),
+ _("role_specification"),
+ _("user_name"),
+ _("where role_specification can be:"),
+ _("role_name"),
+ _("group_name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_INDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER INDEX [ IF EXISTS ] %s RENAME TO %s\n"
+ "ALTER INDEX [ IF EXISTS ] %s SET TABLESPACE %s\n"
+ "ALTER INDEX %s ATTACH PARTITION %s\n"
+ "ALTER INDEX %s [ NO ] DEPENDS ON EXTENSION %s\n"
+ "ALTER INDEX [ IF EXISTS ] %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER INDEX [ IF EXISTS ] %s RESET ( %s [, ... ] )\n"
+ "ALTER INDEX [ IF EXISTS ] %s ALTER [ COLUMN ] %s\n"
+ " SET STATISTICS %s\n"
+ "ALTER INDEX ALL IN TABLESPACE %s [ OWNED BY %s [, ... ] ]\n"
+ " SET TABLESPACE %s [ NOWAIT ]",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("tablespace_name"),
+ _("name"),
+ _("index_name"),
+ _("name"),
+ _("extension_name"),
+ _("name"),
+ _("storage_parameter"),
+ _("value"),
+ _("name"),
+ _("storage_parameter"),
+ _("name"),
+ _("column_number"),
+ _("integer"),
+ _("name"),
+ _("role_name"),
+ _("new_tablespace"));
+}
+
+static void
+sql_help_ALTER_LANGUAGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER [ PROCEDURAL ] LANGUAGE %s RENAME TO %s\n"
+ "ALTER [ PROCEDURAL ] LANGUAGE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_LARGE_OBJECT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER LARGE OBJECT %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("large_object_oid"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " %s [, ... ]\n"
+ "ALTER MATERIALIZED VIEW %s\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " RENAME TO %s\n"
+ "ALTER MATERIALIZED VIEW [ IF EXISTS ] %s\n"
+ " SET SCHEMA %s\n"
+ "ALTER MATERIALIZED VIEW ALL IN TABLESPACE %s [ OWNED BY %s [, ... ] ]\n"
+ " SET TABLESPACE %s [ NOWAIT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ALTER [ COLUMN ] %s SET STATISTICS %s\n"
+ " ALTER [ COLUMN ] %s SET ( %s = %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s RESET ( %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }\n"
+ " ALTER [ COLUMN ] %s SET COMPRESSION %s\n"
+ " CLUSTER ON %s\n"
+ " SET WITHOUT CLUSTER\n"
+ " SET ACCESS METHOD %s\n"
+ " SET TABLESPACE %s\n"
+ " SET ( %s [= %s] [, ... ] )\n"
+ " RESET ( %s [, ... ] )\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("name"),
+ _("action"),
+ _("name"),
+ _("extension_name"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("role_name"),
+ _("new_tablespace"),
+ _("where action is one of:"),
+ _("column_name"),
+ _("integer"),
+ _("column_name"),
+ _("attribute_option"),
+ _("value"),
+ _("column_name"),
+ _("attribute_option"),
+ _("column_name"),
+ _("column_name"),
+ _("compression_method"),
+ _("index_name"),
+ _("new_access_method"),
+ _("new_tablespace"),
+ _("storage_parameter"),
+ _("value"),
+ _("storage_parameter"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_OPERATOR(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER OPERATOR %s ( { %s | NONE } , %s )\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER OPERATOR %s ( { %s | NONE } , %s )\n"
+ " SET SCHEMA %s\n"
+ "\n"
+ "ALTER OPERATOR %s ( { %s | NONE } , %s )\n"
+ " SET ( { RESTRICT = { %s | NONE }\n"
+ " | JOIN = { %s | NONE }\n"
+ " } [, ... ] )",
+ _("name"),
+ _("left_type"),
+ _("right_type"),
+ _("new_owner"),
+ _("name"),
+ _("left_type"),
+ _("right_type"),
+ _("new_schema"),
+ _("name"),
+ _("left_type"),
+ _("right_type"),
+ _("res_proc"),
+ _("join_proc"));
+}
+
+static void
+sql_help_ALTER_OPERATOR_CLASS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER OPERATOR CLASS %s USING %s\n"
+ " RENAME TO %s\n"
+ "\n"
+ "ALTER OPERATOR CLASS %s USING %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER OPERATOR CLASS %s USING %s\n"
+ " SET SCHEMA %s",
+ _("name"),
+ _("index_method"),
+ _("new_name"),
+ _("name"),
+ _("index_method"),
+ _("new_owner"),
+ _("name"),
+ _("index_method"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_OPERATOR_FAMILY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER OPERATOR FAMILY %s USING %s ADD\n"
+ " { OPERATOR %s %s ( %s, %s )\n"
+ " [ FOR SEARCH | FOR ORDER BY %s ]\n"
+ " | FUNCTION %s [ ( %s [ , %s ] ) ]\n"
+ " %s [ ( %s [, ...] ) ]\n"
+ " } [, ... ]\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s DROP\n"
+ " { OPERATOR %s ( %s [ , %s ] )\n"
+ " | FUNCTION %s ( %s [ , %s ] )\n"
+ " } [, ... ]\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s\n"
+ " RENAME TO %s\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "\n"
+ "ALTER OPERATOR FAMILY %s USING %s\n"
+ " SET SCHEMA %s",
+ _("name"),
+ _("index_method"),
+ _("strategy_number"),
+ _("operator_name"),
+ _("op_type"),
+ _("op_type"),
+ _("sort_family_name"),
+ _("support_number"),
+ _("op_type"),
+ _("op_type"),
+ _("function_name"),
+ _("argument_type"),
+ _("name"),
+ _("index_method"),
+ _("strategy_number"),
+ _("op_type"),
+ _("op_type"),
+ _("support_number"),
+ _("op_type"),
+ _("op_type"),
+ _("name"),
+ _("index_method"),
+ _("new_name"),
+ _("name"),
+ _("index_method"),
+ _("new_owner"),
+ _("name"),
+ _("index_method"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_POLICY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER POLICY %s ON %s RENAME TO %s\n"
+ "\n"
+ "ALTER POLICY %s ON %s\n"
+ " [ TO { %s | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ]\n"
+ " [ USING ( %s ) ]\n"
+ " [ WITH CHECK ( %s ) ]",
+ _("name"),
+ _("table_name"),
+ _("new_name"),
+ _("name"),
+ _("table_name"),
+ _("role_name"),
+ _("using_expression"),
+ _("check_expression"));
+}
+
+static void
+sql_help_ALTER_PROCEDURE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " %s [ ... ] [ RESTRICT ]\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " RENAME TO %s\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " SET SCHEMA %s\n"
+ "ALTER PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " SET %s { TO | = } { %s | DEFAULT }\n"
+ " SET %s FROM CURRENT\n"
+ " RESET %s\n"
+ " RESET ALL",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("action"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_name"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_owner"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_schema"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("extension_name"),
+ _("where action is one of:"),
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_PUBLICATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER PUBLICATION %s ADD %s [, ...]\n"
+ "ALTER PUBLICATION %s SET %s [, ...]\n"
+ "ALTER PUBLICATION %s DROP %s [, ...]\n"
+ "ALTER PUBLICATION %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER PUBLICATION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER PUBLICATION %s RENAME TO %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " TABLE [ ONLY ] %s [ * ] [ ( %s [, ... ] ) ] [ WHERE ( %s ) ] [, ... ]\n"
+ " TABLES IN SCHEMA { %s | CURRENT_SCHEMA } [, ... ]",
+ _("name"),
+ _("publication_object"),
+ _("name"),
+ _("publication_object"),
+ _("name"),
+ _("publication_object"),
+ _("name"),
+ _("publication_parameter"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("where publication_object is one of:"),
+ _("table_name"),
+ _("column_name"),
+ _("expression"),
+ _("schema_name"));
+}
+
+static void
+sql_help_ALTER_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER ROLE %s [ WITH ] %s [ ... ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ "\n"
+ "ALTER ROLE %s RENAME TO %s\n"
+ "\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] SET %s { TO | = } { %s | DEFAULT }\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] SET %s FROM CURRENT\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] RESET %s\n"
+ "ALTER ROLE { %s | ALL } [ IN DATABASE %s ] RESET ALL\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("role_specification"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("name"),
+ _("new_name"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_ALTER_ROUTINE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " %s [ ... ] [ RESTRICT ]\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " RENAME TO %s\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " SET SCHEMA %s\n"
+ "ALTER ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ]\n"
+ " [ NO ] DEPENDS ON EXTENSION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " IMMUTABLE | STABLE | VOLATILE\n"
+ " [ NOT ] LEAKPROOF\n"
+ " [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " PARALLEL { UNSAFE | RESTRICTED | SAFE }\n"
+ " COST %s\n"
+ " ROWS %s\n"
+ " SET %s { TO | = } { %s | DEFAULT }\n"
+ " SET %s FROM CURRENT\n"
+ " RESET %s\n"
+ " RESET ALL",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("action"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_name"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_owner"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("new_schema"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("extension_name"),
+ _("where action is one of:"),
+ _("execution_cost"),
+ _("result_rows"),
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_RULE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER RULE %s ON %s RENAME TO %s",
+ _("name"),
+ _("table_name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SCHEMA %s RENAME TO %s\n"
+ "ALTER SCHEMA %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"));
+}
+
+static void
+sql_help_ALTER_SEQUENCE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SEQUENCE [ IF EXISTS ] %s\n"
+ " [ AS %s ]\n"
+ " [ INCREMENT [ BY ] %s ]\n"
+ " [ MINVALUE %s | NO MINVALUE ] [ MAXVALUE %s | NO MAXVALUE ]\n"
+ " [ START [ WITH ] %s ]\n"
+ " [ RESTART [ [ WITH ] %s ] ]\n"
+ " [ CACHE %s ] [ [ NO ] CYCLE ]\n"
+ " [ OWNED BY { %s.%s | NONE } ]\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s SET { LOGGED | UNLOGGED }\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s RENAME TO %s\n"
+ "ALTER SEQUENCE [ IF EXISTS ] %s SET SCHEMA %s",
+ _("name"),
+ _("data_type"),
+ _("increment"),
+ _("minvalue"),
+ _("maxvalue"),
+ _("start"),
+ _("restart"),
+ _("cache"),
+ _("table_name"),
+ _("column_name"),
+ _("name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_SERVER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SERVER %s [ VERSION '%s' ]\n"
+ " [ OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ] ) ]\n"
+ "ALTER SERVER %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER SERVER %s RENAME TO %s",
+ _("name"),
+ _("new_version"),
+ _("option"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_STATISTICS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER STATISTICS %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER STATISTICS %s RENAME TO %s\n"
+ "ALTER STATISTICS %s SET SCHEMA %s\n"
+ "ALTER STATISTICS %s SET STATISTICS %s",
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("new_target"));
+}
+
+static void
+sql_help_ALTER_SUBSCRIPTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SUBSCRIPTION %s CONNECTION '%s'\n"
+ "ALTER SUBSCRIPTION %s SET PUBLICATION %s [, ...] [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s ADD PUBLICATION %s [, ...] [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s DROP PUBLICATION %s [, ...] [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s REFRESH PUBLICATION [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "ALTER SUBSCRIPTION %s ENABLE\n"
+ "ALTER SUBSCRIPTION %s DISABLE\n"
+ "ALTER SUBSCRIPTION %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER SUBSCRIPTION %s SKIP ( %s = %s )\n"
+ "ALTER SUBSCRIPTION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER SUBSCRIPTION %s RENAME TO %s",
+ _("name"),
+ _("conninfo"),
+ _("name"),
+ _("publication_name"),
+ _("publication_option"),
+ _("value"),
+ _("name"),
+ _("publication_name"),
+ _("publication_option"),
+ _("value"),
+ _("name"),
+ _("publication_name"),
+ _("publication_option"),
+ _("value"),
+ _("name"),
+ _("refresh_option"),
+ _("value"),
+ _("name"),
+ _("name"),
+ _("name"),
+ _("subscription_parameter"),
+ _("value"),
+ _("name"),
+ _("skip_option"),
+ _("value"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"));
+}
+
+static void
+sql_help_ALTER_SYSTEM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER SYSTEM SET %s { TO | = } { %s [, ...] | DEFAULT }\n"
+ "\n"
+ "ALTER SYSTEM RESET %s\n"
+ "ALTER SYSTEM RESET ALL",
+ _("configuration_parameter"),
+ _("value"),
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_ALTER_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " %s [, ... ]\n"
+ "ALTER TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER TABLE [ IF EXISTS ] [ ONLY ] %s [ * ]\n"
+ " RENAME CONSTRAINT %s TO %s\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " RENAME TO %s\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " SET SCHEMA %s\n"
+ "ALTER TABLE ALL IN TABLESPACE %s [ OWNED BY %s [, ... ] ]\n"
+ " SET TABLESPACE %s [ NOWAIT ]\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " ATTACH PARTITION %s { FOR VALUES %s | DEFAULT }\n"
+ "ALTER TABLE [ IF EXISTS ] %s\n"
+ " DETACH PARTITION %s [ CONCURRENTLY | FINALIZE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ADD [ COLUMN ] [ IF NOT EXISTS ] %s %s [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " DROP [ COLUMN ] [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " ALTER [ COLUMN ] %s [ SET DATA ] TYPE %s [ COLLATE %s ] [ USING %s ]\n"
+ " ALTER [ COLUMN ] %s SET DEFAULT %s\n"
+ " ALTER [ COLUMN ] %s DROP DEFAULT\n"
+ " ALTER [ COLUMN ] %s { SET | DROP } NOT NULL\n"
+ " ALTER [ COLUMN ] %s DROP EXPRESSION [ IF EXISTS ]\n"
+ " ALTER [ COLUMN ] %s ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( %s ) ]\n"
+ " ALTER [ COLUMN ] %s { SET GENERATED { ALWAYS | BY DEFAULT } | SET %s | RESTART [ [ WITH ] %s ] } [...]\n"
+ " ALTER [ COLUMN ] %s DROP IDENTITY [ IF EXISTS ]\n"
+ " ALTER [ COLUMN ] %s SET STATISTICS %s\n"
+ " ALTER [ COLUMN ] %s SET ( %s = %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s RESET ( %s [, ... ] )\n"
+ " ALTER [ COLUMN ] %s SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }\n"
+ " ALTER [ COLUMN ] %s SET COMPRESSION %s\n"
+ " ADD %s [ NOT VALID ]\n"
+ " ADD %s\n"
+ " ALTER CONSTRAINT %s [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ " VALIDATE CONSTRAINT %s\n"
+ " DROP CONSTRAINT [ IF EXISTS ] %s [ RESTRICT | CASCADE ]\n"
+ " DISABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE TRIGGER [ %s | ALL | USER ]\n"
+ " ENABLE REPLICA TRIGGER %s\n"
+ " ENABLE ALWAYS TRIGGER %s\n"
+ " DISABLE RULE %s\n"
+ " ENABLE RULE %s\n"
+ " ENABLE REPLICA RULE %s\n"
+ " ENABLE ALWAYS RULE %s\n"
+ " DISABLE ROW LEVEL SECURITY\n"
+ " ENABLE ROW LEVEL SECURITY\n"
+ " FORCE ROW LEVEL SECURITY\n"
+ " NO FORCE ROW LEVEL SECURITY\n"
+ " CLUSTER ON %s\n"
+ " SET WITHOUT CLUSTER\n"
+ " SET WITHOUT OIDS\n"
+ " SET ACCESS METHOD %s\n"
+ " SET TABLESPACE %s\n"
+ " SET { LOGGED | UNLOGGED }\n"
+ " SET ( %s [= %s] [, ... ] )\n"
+ " RESET ( %s [, ... ] )\n"
+ " INHERIT %s\n"
+ " NO INHERIT %s\n"
+ " OF %s\n"
+ " NOT OF\n"
+ " OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ " REPLICA IDENTITY { DEFAULT | USING INDEX %s | FULL | NOTHING }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "IN ( %s [, ...] ) |\n"
+ "FROM ( { %s | MINVALUE | MAXVALUE } [, ...] )\n"
+ " TO ( { %s | MINVALUE | MAXVALUE } [, ...] ) |\n"
+ "WITH ( MODULUS %s, REMAINDER %s )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL |\n"
+ " NULL |\n"
+ " CHECK ( %s ) [ NO INHERIT ] |\n"
+ " DEFAULT %s |\n"
+ " GENERATED ALWAYS AS ( %s ) STORED |\n"
+ " GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( %s ) ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] %s |\n"
+ " PRIMARY KEY %s |\n"
+ " REFERENCES %s [ ( %s ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n"
+ " [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ CHECK ( %s ) [ NO INHERIT ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] ( %s [, ... ] ) %s |\n"
+ " PRIMARY KEY ( %s [, ... ] ) %s |\n"
+ " EXCLUDE [ USING %s ] ( %s WITH %s [, ... ] ) %s [ WHERE ( %s ) ] |\n"
+ " FOREIGN KEY ( %s [, ... ] ) REFERENCES %s [ ( %s [, ... ] ) ]\n"
+ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ CONSTRAINT %s ]\n"
+ " { UNIQUE | PRIMARY KEY } USING INDEX %s\n"
+ " [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ INCLUDE ( %s [, ... ] ) ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "[ USING INDEX TABLESPACE %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ %s | ( %s ) } [ %s ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( %s [, ... ] ) ] | SET DEFAULT [ ( %s [, ... ] ) ] }",
+ _("name"),
+ _("action"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("constraint_name"),
+ _("new_constraint_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("role_name"),
+ _("new_tablespace"),
+ _("name"),
+ _("partition_name"),
+ _("partition_bound_spec"),
+ _("name"),
+ _("partition_name"),
+ _("where action is one of:"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("column_constraint"),
+ _("column_name"),
+ _("column_name"),
+ _("data_type"),
+ _("collation"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("sequence_options"),
+ _("column_name"),
+ _("sequence_option"),
+ _("restart"),
+ _("column_name"),
+ _("column_name"),
+ _("integer"),
+ _("column_name"),
+ _("attribute_option"),
+ _("value"),
+ _("column_name"),
+ _("attribute_option"),
+ _("column_name"),
+ _("column_name"),
+ _("compression_method"),
+ _("table_constraint"),
+ _("table_constraint_using_index"),
+ _("constraint_name"),
+ _("constraint_name"),
+ _("constraint_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("trigger_name"),
+ _("rewrite_rule_name"),
+ _("rewrite_rule_name"),
+ _("rewrite_rule_name"),
+ _("rewrite_rule_name"),
+ _("index_name"),
+ _("new_access_method"),
+ _("new_tablespace"),
+ _("storage_parameter"),
+ _("value"),
+ _("storage_parameter"),
+ _("parent_table"),
+ _("parent_table"),
+ _("type_name"),
+ _("new_owner"),
+ _("index_name"),
+ _("and partition_bound_spec is:"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("numeric_literal"),
+ _("numeric_literal"),
+ _("and column_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("default_expr"),
+ _("generation_expr"),
+ _("sequence_options"),
+ _("index_parameters"),
+ _("index_parameters"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and table_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("column_name"),
+ _("index_parameters"),
+ _("column_name"),
+ _("index_parameters"),
+ _("index_method"),
+ _("exclude_element"),
+ _("operator"),
+ _("index_parameters"),
+ _("predicate"),
+ _("column_name"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and table_constraint_using_index is:"),
+ _("constraint_name"),
+ _("index_name"),
+ _("index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"),
+ _("column_name"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("exclude_element in an EXCLUDE constraint is:"),
+ _("column_name"),
+ _("expression"),
+ _("opclass"),
+ _("referential_action in a FOREIGN KEY/REFERENCES constraint is:"),
+ _("column_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_ALTER_TABLESPACE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TABLESPACE %s RENAME TO %s\n"
+ "ALTER TABLESPACE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TABLESPACE %s SET ( %s = %s [, ... ] )\n"
+ "ALTER TABLESPACE %s RESET ( %s [, ... ] )",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("tablespace_option"),
+ _("value"),
+ _("name"),
+ _("tablespace_option"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_CONFIGURATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ADD MAPPING FOR %s [, ... ] WITH %s [, ... ]\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ALTER MAPPING FOR %s [, ... ] WITH %s [, ... ]\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ALTER MAPPING REPLACE %s WITH %s\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " ALTER MAPPING FOR %s [, ... ] REPLACE %s WITH %s\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s\n"
+ " DROP MAPPING [ IF EXISTS ] FOR %s [, ... ]\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TEXT SEARCH CONFIGURATION %s SET SCHEMA %s",
+ _("name"),
+ _("token_type"),
+ _("dictionary_name"),
+ _("name"),
+ _("token_type"),
+ _("dictionary_name"),
+ _("name"),
+ _("old_dictionary"),
+ _("new_dictionary"),
+ _("name"),
+ _("token_type"),
+ _("old_dictionary"),
+ _("new_dictionary"),
+ _("name"),
+ _("token_type"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_DICTIONARY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH DICTIONARY %s (\n"
+ " %s [ = %s ] [, ... ]\n"
+ ")\n"
+ "ALTER TEXT SEARCH DICTIONARY %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH DICTIONARY %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TEXT SEARCH DICTIONARY %s SET SCHEMA %s",
+ _("name"),
+ _("option"),
+ _("value"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_PARSER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH PARSER %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH PARSER %s SET SCHEMA %s",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TEXT_SEARCH_TEMPLATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TEXT SEARCH TEMPLATE %s RENAME TO %s\n"
+ "ALTER TEXT SEARCH TEMPLATE %s SET SCHEMA %s",
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"));
+}
+
+static void
+sql_help_ALTER_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TRIGGER %s ON %s RENAME TO %s\n"
+ "ALTER TRIGGER %s ON %s [ NO ] DEPENDS ON EXTENSION %s",
+ _("name"),
+ _("table_name"),
+ _("new_name"),
+ _("name"),
+ _("table_name"),
+ _("extension_name"));
+}
+
+static void
+sql_help_ALTER_TYPE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER TYPE %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER TYPE %s RENAME TO %s\n"
+ "ALTER TYPE %s SET SCHEMA %s\n"
+ "ALTER TYPE %s RENAME ATTRIBUTE %s TO %s [ CASCADE | RESTRICT ]\n"
+ "ALTER TYPE %s %s [, ... ]\n"
+ "ALTER TYPE %s ADD VALUE [ IF NOT EXISTS ] %s [ { BEFORE | AFTER } %s ]\n"
+ "ALTER TYPE %s RENAME VALUE %s TO %s\n"
+ "ALTER TYPE %s SET ( %s = %s [, ... ] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ADD ATTRIBUTE %s %s [ COLLATE %s ] [ CASCADE | RESTRICT ]\n"
+ " DROP ATTRIBUTE [ IF EXISTS ] %s [ CASCADE | RESTRICT ]\n"
+ " ALTER ATTRIBUTE %s [ SET DATA ] TYPE %s [ COLLATE %s ] [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("attribute_name"),
+ _("new_attribute_name"),
+ _("name"),
+ _("action"),
+ _("name"),
+ _("new_enum_value"),
+ _("neighbor_enum_value"),
+ _("name"),
+ _("existing_enum_value"),
+ _("new_enum_value"),
+ _("name"),
+ _("property"),
+ _("value"),
+ _("where action is one of:"),
+ _("attribute_name"),
+ _("data_type"),
+ _("collation"),
+ _("attribute_name"),
+ _("attribute_name"),
+ _("data_type"),
+ _("collation"));
+}
+
+static void
+sql_help_ALTER_USER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER USER %s [ WITH ] %s [ ... ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ "\n"
+ "ALTER USER %s RENAME TO %s\n"
+ "\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] SET %s { TO | = } { %s | DEFAULT }\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] SET %s FROM CURRENT\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] RESET %s\n"
+ "ALTER USER { %s | ALL } [ IN DATABASE %s ] RESET ALL\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("role_specification"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("name"),
+ _("new_name"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("database_name"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_ALTER_USER_MAPPING(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER USER MAPPING FOR { %s | USER | CURRENT_ROLE | CURRENT_USER | SESSION_USER | PUBLIC }\n"
+ " SERVER %s\n"
+ " OPTIONS ( [ ADD | SET | DROP ] %s ['%s'] [, ... ] )",
+ _("user_name"),
+ _("server_name"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_ALTER_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ALTER VIEW [ IF EXISTS ] %s ALTER [ COLUMN ] %s SET DEFAULT %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s ALTER [ COLUMN ] %s DROP DEFAULT\n"
+ "ALTER VIEW [ IF EXISTS ] %s OWNER TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }\n"
+ "ALTER VIEW [ IF EXISTS ] %s RENAME [ COLUMN ] %s TO %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s RENAME TO %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s SET SCHEMA %s\n"
+ "ALTER VIEW [ IF EXISTS ] %s SET ( %s [= %s] [, ... ] )\n"
+ "ALTER VIEW [ IF EXISTS ] %s RESET ( %s [, ... ] )",
+ _("name"),
+ _("column_name"),
+ _("expression"),
+ _("name"),
+ _("column_name"),
+ _("name"),
+ _("new_owner"),
+ _("name"),
+ _("column_name"),
+ _("new_column_name"),
+ _("name"),
+ _("new_name"),
+ _("name"),
+ _("new_schema"),
+ _("name"),
+ _("view_option_name"),
+ _("view_option_value"),
+ _("name"),
+ _("view_option_name"));
+}
+
+static void
+sql_help_ANALYZE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ANALYZE [ ( %s [, ...] ) ] [ %s [, ...] ]\n"
+ "ANALYZE [ VERBOSE ] [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " VERBOSE [ %s ]\n"
+ " SKIP_LOCKED [ %s ]\n"
+ " BUFFER_USAGE_LIMIT %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ]",
+ _("option"),
+ _("table_and_columns"),
+ _("table_and_columns"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("boolean"),
+ _("size"),
+ _("and table_and_columns is:"),
+ _("table_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_BEGIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "BEGIN [ WORK | TRANSACTION ] [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+ " READ WRITE | READ ONLY\n"
+ " [ NOT ] DEFERRABLE",
+ _("transaction_mode"),
+ _("where transaction_mode is one of:"));
+}
+
+static void
+sql_help_CALL(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CALL %s ( [ %s ] [, ...] )",
+ _("name"),
+ _("argument"));
+}
+
+static void
+sql_help_CHECKPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CHECKPOINT");
+}
+
+static void
+sql_help_CLOSE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CLOSE { %s | ALL }",
+ _("name"));
+}
+
+static void
+sql_help_CLUSTER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CLUSTER [VERBOSE] %s [ USING %s ]\n"
+ "CLUSTER ( %s [, ...] ) %s [ USING %s ]\n"
+ "CLUSTER [VERBOSE]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " VERBOSE [ %s ]",
+ _("table_name"),
+ _("index_name"),
+ _("option"),
+ _("table_name"),
+ _("index_name"),
+ _("where option can be one of:"),
+ _("boolean"));
+}
+
+static void
+sql_help_COMMENT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COMMENT ON\n"
+ "{\n"
+ " ACCESS METHOD %s |\n"
+ " AGGREGATE %s ( %s ) |\n"
+ " CAST (%s AS %s) |\n"
+ " COLLATION %s |\n"
+ " COLUMN %s.%s |\n"
+ " CONSTRAINT %s ON %s |\n"
+ " CONSTRAINT %s ON DOMAIN %s |\n"
+ " CONVERSION %s |\n"
+ " DATABASE %s |\n"
+ " DOMAIN %s |\n"
+ " EXTENSION %s |\n"
+ " EVENT TRIGGER %s |\n"
+ " FOREIGN DATA WRAPPER %s |\n"
+ " FOREIGN TABLE %s |\n"
+ " FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " INDEX %s |\n"
+ " LARGE OBJECT %s |\n"
+ " MATERIALIZED VIEW %s |\n"
+ " OPERATOR %s (%s, %s) |\n"
+ " OPERATOR CLASS %s USING %s |\n"
+ " OPERATOR FAMILY %s USING %s |\n"
+ " POLICY %s ON %s |\n"
+ " [ PROCEDURAL ] LANGUAGE %s |\n"
+ " PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " PUBLICATION %s |\n"
+ " ROLE %s |\n"
+ " ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " RULE %s ON %s |\n"
+ " SCHEMA %s |\n"
+ " SEQUENCE %s |\n"
+ " SERVER %s |\n"
+ " STATISTICS %s |\n"
+ " SUBSCRIPTION %s |\n"
+ " TABLE %s |\n"
+ " TABLESPACE %s |\n"
+ " TEXT SEARCH CONFIGURATION %s |\n"
+ " TEXT SEARCH DICTIONARY %s |\n"
+ " TEXT SEARCH PARSER %s |\n"
+ " TEXT SEARCH TEMPLATE %s |\n"
+ " TRANSFORM FOR %s LANGUAGE %s |\n"
+ " TRIGGER %s ON %s |\n"
+ " TYPE %s |\n"
+ " VIEW %s\n"
+ "} IS { %s | NULL }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("object_name"),
+ _("aggregate_name"),
+ _("aggregate_signature"),
+ _("source_type"),
+ _("target_type"),
+ _("object_name"),
+ _("relation_name"),
+ _("column_name"),
+ _("constraint_name"),
+ _("table_name"),
+ _("constraint_name"),
+ _("domain_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("function_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("large_object_oid"),
+ _("object_name"),
+ _("operator_name"),
+ _("left_type"),
+ _("right_type"),
+ _("object_name"),
+ _("index_method"),
+ _("object_name"),
+ _("index_method"),
+ _("policy_name"),
+ _("table_name"),
+ _("object_name"),
+ _("procedure_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("routine_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("rule_name"),
+ _("table_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("type_name"),
+ _("lang_name"),
+ _("trigger_name"),
+ _("table_name"),
+ _("object_name"),
+ _("object_name"),
+ _("string_literal"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_COMMIT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COMMIT [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_COMMIT_PREPARED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COMMIT PREPARED %s",
+ _("transaction_id"));
+}
+
+static void
+sql_help_COPY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "COPY %s [ ( %s [, ...] ) ]\n"
+ " FROM { '%s' | PROGRAM '%s' | STDIN }\n"
+ " [ [ WITH ] ( %s [, ...] ) ]\n"
+ " [ WHERE %s ]\n"
+ "\n"
+ "COPY { %s [ ( %s [, ...] ) ] | ( %s ) }\n"
+ " TO { '%s' | PROGRAM '%s' | STDOUT }\n"
+ " [ [ WITH ] ( %s [, ...] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " FORMAT %s\n"
+ " FREEZE [ %s ]\n"
+ " DELIMITER '%s'\n"
+ " NULL '%s'\n"
+ " DEFAULT '%s'\n"
+ " HEADER [ %s | MATCH ]\n"
+ " QUOTE '%s'\n"
+ " ESCAPE '%s'\n"
+ " FORCE_QUOTE { ( %s [, ...] ) | * }\n"
+ " FORCE_NOT_NULL ( %s [, ...] )\n"
+ " FORCE_NULL ( %s [, ...] )\n"
+ " ENCODING '%s'",
+ _("table_name"),
+ _("column_name"),
+ _("filename"),
+ _("command"),
+ _("option"),
+ _("condition"),
+ _("table_name"),
+ _("column_name"),
+ _("query"),
+ _("filename"),
+ _("command"),
+ _("option"),
+ _("where option can be one of:"),
+ _("format_name"),
+ _("boolean"),
+ _("delimiter_character"),
+ _("null_string"),
+ _("default_string"),
+ _("boolean"),
+ _("quote_character"),
+ _("escape_character"),
+ _("column_name"),
+ _("column_name"),
+ _("column_name"),
+ _("encoding_name"));
+}
+
+static void
+sql_help_CREATE_ACCESS_METHOD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE ACCESS METHOD %s\n"
+ " TYPE %s\n"
+ " HANDLER %s",
+ _("name"),
+ _("access_method_type"),
+ _("handler_function"));
+}
+
+static void
+sql_help_CREATE_AGGREGATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] AGGREGATE %s ( [ %s ] [ %s ] %s [ , ... ] ) (\n"
+ " SFUNC = %s,\n"
+ " STYPE = %s\n"
+ " [ , SSPACE = %s ]\n"
+ " [ , FINALFUNC = %s ]\n"
+ " [ , FINALFUNC_EXTRA ]\n"
+ " [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , COMBINEFUNC = %s ]\n"
+ " [ , SERIALFUNC = %s ]\n"
+ " [ , DESERIALFUNC = %s ]\n"
+ " [ , INITCOND = %s ]\n"
+ " [ , MSFUNC = %s ]\n"
+ " [ , MINVFUNC = %s ]\n"
+ " [ , MSTYPE = %s ]\n"
+ " [ , MSSPACE = %s ]\n"
+ " [ , MFINALFUNC = %s ]\n"
+ " [ , MFINALFUNC_EXTRA ]\n"
+ " [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , MINITCOND = %s ]\n"
+ " [ , SORTOP = %s ]\n"
+ " [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]\n"
+ ")\n"
+ "\n"
+ "CREATE [ OR REPLACE ] AGGREGATE %s ( [ [ %s ] [ %s ] %s [ , ... ] ]\n"
+ " ORDER BY [ %s ] [ %s ] %s [ , ... ] ) (\n"
+ " SFUNC = %s,\n"
+ " STYPE = %s\n"
+ " [ , SSPACE = %s ]\n"
+ " [ , FINALFUNC = %s ]\n"
+ " [ , FINALFUNC_EXTRA ]\n"
+ " [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , INITCOND = %s ]\n"
+ " [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]\n"
+ " [ , HYPOTHETICAL ]\n"
+ ")\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "CREATE [ OR REPLACE ] AGGREGATE %s (\n"
+ " BASETYPE = %s,\n"
+ " SFUNC = %s,\n"
+ " STYPE = %s\n"
+ " [ , SSPACE = %s ]\n"
+ " [ , FINALFUNC = %s ]\n"
+ " [ , FINALFUNC_EXTRA ]\n"
+ " [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , COMBINEFUNC = %s ]\n"
+ " [ , SERIALFUNC = %s ]\n"
+ " [ , DESERIALFUNC = %s ]\n"
+ " [ , INITCOND = %s ]\n"
+ " [ , MSFUNC = %s ]\n"
+ " [ , MINVFUNC = %s ]\n"
+ " [ , MSTYPE = %s ]\n"
+ " [ , MSSPACE = %s ]\n"
+ " [ , MFINALFUNC = %s ]\n"
+ " [ , MFINALFUNC_EXTRA ]\n"
+ " [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]\n"
+ " [ , MINITCOND = %s ]\n"
+ " [ , SORTOP = %s ]\n"
+ ")",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("arg_data_type"),
+ _("sfunc"),
+ _("state_data_type"),
+ _("state_data_size"),
+ _("ffunc"),
+ _("combinefunc"),
+ _("serialfunc"),
+ _("deserialfunc"),
+ _("initial_condition"),
+ _("msfunc"),
+ _("minvfunc"),
+ _("mstate_data_type"),
+ _("mstate_data_size"),
+ _("mffunc"),
+ _("minitial_condition"),
+ _("sort_operator"),
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("arg_data_type"),
+ _("argmode"),
+ _("argname"),
+ _("arg_data_type"),
+ _("sfunc"),
+ _("state_data_type"),
+ _("state_data_size"),
+ _("ffunc"),
+ _("initial_condition"),
+ _("or the old syntax"),
+ _("name"),
+ _("base_type"),
+ _("sfunc"),
+ _("state_data_type"),
+ _("state_data_size"),
+ _("ffunc"),
+ _("combinefunc"),
+ _("serialfunc"),
+ _("deserialfunc"),
+ _("initial_condition"),
+ _("msfunc"),
+ _("minvfunc"),
+ _("mstate_data_type"),
+ _("mstate_data_size"),
+ _("mffunc"),
+ _("minitial_condition"),
+ _("sort_operator"));
+}
+
+static void
+sql_help_CREATE_CAST(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE CAST (%s AS %s)\n"
+ " WITH FUNCTION %s [ (%s [, ...]) ]\n"
+ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+ "\n"
+ "CREATE CAST (%s AS %s)\n"
+ " WITHOUT FUNCTION\n"
+ " [ AS ASSIGNMENT | AS IMPLICIT ]\n"
+ "\n"
+ "CREATE CAST (%s AS %s)\n"
+ " WITH INOUT\n"
+ " [ AS ASSIGNMENT | AS IMPLICIT ]",
+ _("source_type"),
+ _("target_type"),
+ _("function_name"),
+ _("argument_type"),
+ _("source_type"),
+ _("target_type"),
+ _("source_type"),
+ _("target_type"));
+}
+
+static void
+sql_help_CREATE_COLLATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE COLLATION [ IF NOT EXISTS ] %s (\n"
+ " [ LOCALE = %s, ]\n"
+ " [ LC_COLLATE = %s, ]\n"
+ " [ LC_CTYPE = %s, ]\n"
+ " [ PROVIDER = %s, ]\n"
+ " [ DETERMINISTIC = %s, ]\n"
+ " [ RULES = %s, ]\n"
+ " [ VERSION = %s ]\n"
+ ")\n"
+ "CREATE COLLATION [ IF NOT EXISTS ] %s FROM %s",
+ _("name"),
+ _("locale"),
+ _("lc_collate"),
+ _("lc_ctype"),
+ _("provider"),
+ _("boolean"),
+ _("rules"),
+ _("version"),
+ _("name"),
+ _("existing_collation"));
+}
+
+static void
+sql_help_CREATE_CONVERSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ DEFAULT ] CONVERSION %s\n"
+ " FOR %s TO %s FROM %s",
+ _("name"),
+ _("source_encoding"),
+ _("dest_encoding"),
+ _("function_name"));
+}
+
+static void
+sql_help_CREATE_DATABASE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE DATABASE %s\n"
+ " [ WITH ] [ OWNER [=] %s ]\n"
+ " [ TEMPLATE [=] %s ]\n"
+ " [ ENCODING [=] %s ]\n"
+ " [ STRATEGY [=] %s ] ]\n"
+ " [ LOCALE [=] %s ]\n"
+ " [ LC_COLLATE [=] %s ]\n"
+ " [ LC_CTYPE [=] %s ]\n"
+ " [ ICU_LOCALE [=] %s ]\n"
+ " [ ICU_RULES [=] %s ]\n"
+ " [ LOCALE_PROVIDER [=] %s ]\n"
+ " [ COLLATION_VERSION = %s ]\n"
+ " [ TABLESPACE [=] %s ]\n"
+ " [ ALLOW_CONNECTIONS [=] %s ]\n"
+ " [ CONNECTION LIMIT [=] %s ]\n"
+ " [ IS_TEMPLATE [=] %s ]\n"
+ " [ OID [=] %s ]",
+ _("name"),
+ _("user_name"),
+ _("template"),
+ _("encoding"),
+ _("strategy"),
+ _("locale"),
+ _("lc_collate"),
+ _("lc_ctype"),
+ _("icu_locale"),
+ _("icu_rules"),
+ _("locale_provider"),
+ _("collation_version"),
+ _("tablespace_name"),
+ _("allowconn"),
+ _("connlimit"),
+ _("istemplate"),
+ _("oid"));
+}
+
+static void
+sql_help_CREATE_DOMAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE DOMAIN %s [ AS ] %s\n"
+ " [ COLLATE %s ]\n"
+ " [ DEFAULT %s ]\n"
+ " [ %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL | NULL | CHECK (%s) }",
+ _("name"),
+ _("data_type"),
+ _("collation"),
+ _("expression"),
+ _("constraint"),
+ _("where constraint is:"),
+ _("constraint_name"),
+ _("expression"));
+}
+
+static void
+sql_help_CREATE_EVENT_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE EVENT TRIGGER %s\n"
+ " ON %s\n"
+ " [ WHEN %s IN (%s [, ... ]) [ AND ... ] ]\n"
+ " EXECUTE { FUNCTION | PROCEDURE } %s()",
+ _("name"),
+ _("event"),
+ _("filter_variable"),
+ _("filter_value"),
+ _("function_name"));
+}
+
+static void
+sql_help_CREATE_EXTENSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE EXTENSION [ IF NOT EXISTS ] %s\n"
+ " [ WITH ] [ SCHEMA %s ]\n"
+ " [ VERSION %s ]\n"
+ " [ CASCADE ]",
+ _("extension_name"),
+ _("schema_name"),
+ _("version"));
+}
+
+static void
+sql_help_CREATE_FOREIGN_DATA_WRAPPER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE FOREIGN DATA WRAPPER %s\n"
+ " [ HANDLER %s | NO HANDLER ]\n"
+ " [ VALIDATOR %s | NO VALIDATOR ]\n"
+ " [ OPTIONS ( %s '%s' [, ... ] ) ]",
+ _("name"),
+ _("handler_function"),
+ _("validator_function"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_FOREIGN_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE FOREIGN TABLE [ IF NOT EXISTS ] %s ( [\n"
+ " { %s %s [ OPTIONS ( %s '%s' [, ... ] ) ] [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ "] )\n"
+ "[ INHERITS ( %s [, ... ] ) ]\n"
+ " SERVER %s\n"
+ "[ OPTIONS ( %s '%s' [, ... ] ) ]\n"
+ "\n"
+ "CREATE FOREIGN TABLE [ IF NOT EXISTS ] %s\n"
+ " PARTITION OF %s [ (\n"
+ " { %s [ WITH OPTIONS ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ ") ]\n"
+ "{ FOR VALUES %s | DEFAULT }\n"
+ " SERVER %s\n"
+ "[ OPTIONS ( %s '%s' [, ... ] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL |\n"
+ " NULL |\n"
+ " CHECK ( %s ) [ NO INHERIT ] |\n"
+ " DEFAULT %s |\n"
+ " GENERATED ALWAYS AS ( %s ) STORED }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "CHECK ( %s ) [ NO INHERIT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "IN ( %s [, ...] ) |\n"
+ "FROM ( { %s | MINVALUE | MAXVALUE } [, ...] )\n"
+ " TO ( { %s | MINVALUE | MAXVALUE } [, ...] ) |\n"
+ "WITH ( MODULUS %s, REMAINDER %s )",
+ _("table_name"),
+ _("column_name"),
+ _("data_type"),
+ _("option"),
+ _("value"),
+ _("collation"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("parent_table"),
+ _("server_name"),
+ _("option"),
+ _("value"),
+ _("table_name"),
+ _("parent_table"),
+ _("column_name"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("partition_bound_spec"),
+ _("server_name"),
+ _("option"),
+ _("value"),
+ _("where column_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("default_expr"),
+ _("generation_expr"),
+ _("and table_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("and partition_bound_spec is:"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("numeric_literal"),
+ _("numeric_literal"));
+}
+
+static void
+sql_help_CREATE_FUNCTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] FUNCTION\n"
+ " %s ( [ [ %s ] [ %s ] %s [ { DEFAULT | = } %s ] [, ...] ] )\n"
+ " [ RETURNS %s\n"
+ " | RETURNS TABLE ( %s %s [, ...] ) ]\n"
+ " { LANGUAGE %s\n"
+ " | TRANSFORM { FOR TYPE %s } [, ... ]\n"
+ " | WINDOW\n"
+ " | { IMMUTABLE | STABLE | VOLATILE }\n"
+ " | [ NOT ] LEAKPROOF\n"
+ " | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }\n"
+ " | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }\n"
+ " | PARALLEL { UNSAFE | RESTRICTED | SAFE }\n"
+ " | COST %s\n"
+ " | ROWS %s\n"
+ " | SUPPORT %s\n"
+ " | SET %s { TO %s | = %s | FROM CURRENT }\n"
+ " | AS '%s'\n"
+ " | AS '%s', '%s'\n"
+ " | %s\n"
+ " } ...",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("default_expr"),
+ _("rettype"),
+ _("column_name"),
+ _("column_type"),
+ _("lang_name"),
+ _("type_name"),
+ _("execution_cost"),
+ _("result_rows"),
+ _("support_function"),
+ _("configuration_parameter"),
+ _("value"),
+ _("value"),
+ _("definition"),
+ _("obj_file"),
+ _("link_symbol"),
+ _("sql_body"));
+}
+
+static void
+sql_help_CREATE_GROUP(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE GROUP %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ " | IN ROLE %s [, ...]\n"
+ " | IN GROUP %s [, ...]\n"
+ " | ROLE %s [, ...]\n"
+ " | ADMIN %s [, ...]\n"
+ " | USER %s [, ...]\n"
+ " | SYSID %s",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("uid"));
+}
+
+static void
+sql_help_CREATE_INDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] %s ] ON [ ONLY ] %s [ USING %s ]\n"
+ " ( { %s | ( %s ) } [ COLLATE %s ] [ %s [ ( %s = %s [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )\n"
+ " [ INCLUDE ( %s [, ...] ) ]\n"
+ " [ NULLS [ NOT ] DISTINCT ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ " [ TABLESPACE %s ]\n"
+ " [ WHERE %s ]",
+ _("name"),
+ _("table_name"),
+ _("method"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("opclass_parameter"),
+ _("value"),
+ _("column_name"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("predicate"));
+}
+
+static void
+sql_help_CREATE_LANGUAGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE %s\n"
+ " HANDLER %s [ INLINE %s ] [ VALIDATOR %s ]\n"
+ "CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE %s",
+ _("name"),
+ _("call_handler"),
+ _("inline_handler"),
+ _("valfunction"),
+ _("name"));
+}
+
+static void
+sql_help_CREATE_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] %s\n"
+ " [ (%s [, ...] ) ]\n"
+ " [ USING %s ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ " [ TABLESPACE %s ]\n"
+ " AS %s\n"
+ " [ WITH [ NO ] DATA ]",
+ _("table_name"),
+ _("column_name"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("query"));
+}
+
+static void
+sql_help_CREATE_OPERATOR(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE OPERATOR %s (\n"
+ " {FUNCTION|PROCEDURE} = %s\n"
+ " [, LEFTARG = %s ] [, RIGHTARG = %s ]\n"
+ " [, COMMUTATOR = %s ] [, NEGATOR = %s ]\n"
+ " [, RESTRICT = %s ] [, JOIN = %s ]\n"
+ " [, HASHES ] [, MERGES ]\n"
+ ")",
+ _("name"),
+ _("function_name"),
+ _("left_type"),
+ _("right_type"),
+ _("com_op"),
+ _("neg_op"),
+ _("res_proc"),
+ _("join_proc"));
+}
+
+static void
+sql_help_CREATE_OPERATOR_CLASS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE OPERATOR CLASS %s [ DEFAULT ] FOR TYPE %s\n"
+ " USING %s [ FAMILY %s ] AS\n"
+ " { OPERATOR %s %s [ ( %s, %s ) ] [ FOR SEARCH | FOR ORDER BY %s ]\n"
+ " | FUNCTION %s [ ( %s [ , %s ] ) ] %s ( %s [, ...] )\n"
+ " | STORAGE %s\n"
+ " } [, ... ]",
+ _("name"),
+ _("data_type"),
+ _("index_method"),
+ _("family_name"),
+ _("strategy_number"),
+ _("operator_name"),
+ _("op_type"),
+ _("op_type"),
+ _("sort_family_name"),
+ _("support_number"),
+ _("op_type"),
+ _("op_type"),
+ _("function_name"),
+ _("argument_type"),
+ _("storage_type"));
+}
+
+static void
+sql_help_CREATE_OPERATOR_FAMILY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE OPERATOR FAMILY %s USING %s",
+ _("name"),
+ _("index_method"));
+}
+
+static void
+sql_help_CREATE_POLICY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE POLICY %s ON %s\n"
+ " [ AS { PERMISSIVE | RESTRICTIVE } ]\n"
+ " [ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ]\n"
+ " [ TO { %s | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ]\n"
+ " [ USING ( %s ) ]\n"
+ " [ WITH CHECK ( %s ) ]",
+ _("name"),
+ _("table_name"),
+ _("role_name"),
+ _("using_expression"),
+ _("check_expression"));
+}
+
+static void
+sql_help_CREATE_PROCEDURE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] PROCEDURE\n"
+ " %s ( [ [ %s ] [ %s ] %s [ { DEFAULT | = } %s ] [, ...] ] )\n"
+ " { LANGUAGE %s\n"
+ " | TRANSFORM { FOR TYPE %s } [, ... ]\n"
+ " | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER\n"
+ " | SET %s { TO %s | = %s | FROM CURRENT }\n"
+ " | AS '%s'\n"
+ " | AS '%s', '%s'\n"
+ " | %s\n"
+ " } ...",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("default_expr"),
+ _("lang_name"),
+ _("type_name"),
+ _("configuration_parameter"),
+ _("value"),
+ _("value"),
+ _("definition"),
+ _("obj_file"),
+ _("link_symbol"),
+ _("sql_body"));
+}
+
+static void
+sql_help_CREATE_PUBLICATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE PUBLICATION %s\n"
+ " [ FOR ALL TABLES\n"
+ " | FOR %s [, ... ] ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " TABLE [ ONLY ] %s [ * ] [ ( %s [, ... ] ) ] [ WHERE ( %s ) ] [, ... ]\n"
+ " TABLES IN SCHEMA { %s | CURRENT_SCHEMA } [, ... ]",
+ _("name"),
+ _("publication_object"),
+ _("publication_parameter"),
+ _("value"),
+ _("where publication_object is one of:"),
+ _("table_name"),
+ _("column_name"),
+ _("expression"),
+ _("schema_name"));
+}
+
+static void
+sql_help_CREATE_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE ROLE %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ " | IN ROLE %s [, ...]\n"
+ " | IN GROUP %s [, ...]\n"
+ " | ROLE %s [, ...]\n"
+ " | ADMIN %s [, ...]\n"
+ " | USER %s [, ...]\n"
+ " | SYSID %s",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("uid"));
+}
+
+static void
+sql_help_CREATE_RULE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] RULE %s AS ON %s\n"
+ " TO %s [ WHERE %s ]\n"
+ " DO [ ALSO | INSTEAD ] { NOTHING | %s | ( %s ; %s ... ) }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SELECT | INSERT | UPDATE | DELETE",
+ _("name"),
+ _("event"),
+ _("table_name"),
+ _("condition"),
+ _("command"),
+ _("command"),
+ _("command"),
+ _("where event can be one of:"));
+}
+
+static void
+sql_help_CREATE_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE SCHEMA %s [ AUTHORIZATION %s ] [ %s [ ... ] ]\n"
+ "CREATE SCHEMA AUTHORIZATION %s [ %s [ ... ] ]\n"
+ "CREATE SCHEMA IF NOT EXISTS %s [ AUTHORIZATION %s ]\n"
+ "CREATE SCHEMA IF NOT EXISTS AUTHORIZATION %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("schema_name"),
+ _("role_specification"),
+ _("schema_element"),
+ _("role_specification"),
+ _("schema_element"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("where role_specification can be:"),
+ _("user_name"));
+}
+
+static void
+sql_help_CREATE_SEQUENCE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] %s\n"
+ " [ AS %s ]\n"
+ " [ INCREMENT [ BY ] %s ]\n"
+ " [ MINVALUE %s | NO MINVALUE ] [ MAXVALUE %s | NO MAXVALUE ]\n"
+ " [ START [ WITH ] %s ] [ CACHE %s ] [ [ NO ] CYCLE ]\n"
+ " [ OWNED BY { %s.%s | NONE } ]",
+ _("name"),
+ _("data_type"),
+ _("increment"),
+ _("minvalue"),
+ _("maxvalue"),
+ _("start"),
+ _("cache"),
+ _("table_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_CREATE_SERVER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE SERVER [ IF NOT EXISTS ] %s [ TYPE '%s' ] [ VERSION '%s' ]\n"
+ " FOREIGN DATA WRAPPER %s\n"
+ " [ OPTIONS ( %s '%s' [, ... ] ) ]",
+ _("server_name"),
+ _("server_type"),
+ _("server_version"),
+ _("fdw_name"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_STATISTICS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE STATISTICS [ [ IF NOT EXISTS ] %s ]\n"
+ " ON ( %s )\n"
+ " FROM %s\n"
+ "\n"
+ "CREATE STATISTICS [ [ IF NOT EXISTS ] %s ]\n"
+ " [ ( %s [, ... ] ) ]\n"
+ " ON { %s | ( %s ) }, { %s | ( %s ) } [, ...]\n"
+ " FROM %s",
+ _("statistics_name"),
+ _("expression"),
+ _("table_name"),
+ _("statistics_name"),
+ _("statistics_kind"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("table_name"));
+}
+
+static void
+sql_help_CREATE_SUBSCRIPTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE SUBSCRIPTION %s\n"
+ " CONNECTION '%s'\n"
+ " PUBLICATION %s [, ...]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]",
+ _("subscription_name"),
+ _("conninfo"),
+ _("publication_name"),
+ _("subscription_parameter"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s ( [\n"
+ " { %s %s [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION %s ] [ COLLATE %s ] [ %s [ ... ] ]\n"
+ " | %s\n"
+ " | LIKE %s [ %s ... ] }\n"
+ " [, ... ]\n"
+ "] )\n"
+ "[ INHERITS ( %s [, ... ] ) ]\n"
+ "[ PARTITION BY { RANGE | LIST | HASH } ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ... ] ) ]\n"
+ "[ USING %s ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ "[ TABLESPACE %s ]\n"
+ "\n"
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s\n"
+ " OF %s [ (\n"
+ " { %s [ WITH OPTIONS ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ ") ]\n"
+ "[ PARTITION BY { RANGE | LIST | HASH } ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ... ] ) ]\n"
+ "[ USING %s ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ "[ TABLESPACE %s ]\n"
+ "\n"
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s\n"
+ " PARTITION OF %s [ (\n"
+ " { %s [ WITH OPTIONS ] [ %s [ ... ] ]\n"
+ " | %s }\n"
+ " [, ... ]\n"
+ ") ] { FOR VALUES %s | DEFAULT }\n"
+ "[ PARTITION BY { RANGE | LIST | HASH } ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ... ] ) ]\n"
+ "[ USING %s ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ "[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ "[ TABLESPACE %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ NOT NULL |\n"
+ " NULL |\n"
+ " CHECK ( %s ) [ NO INHERIT ] |\n"
+ " DEFAULT %s |\n"
+ " GENERATED ALWAYS AS ( %s ) STORED |\n"
+ " GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( %s ) ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] %s |\n"
+ " PRIMARY KEY %s |\n"
+ " REFERENCES %s [ ( %s ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]\n"
+ " [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ CONSTRAINT %s ]\n"
+ "{ CHECK ( %s ) [ NO INHERIT ] |\n"
+ " UNIQUE [ NULLS [ NOT ] DISTINCT ] ( %s [, ... ] ) %s |\n"
+ " PRIMARY KEY ( %s [, ... ] ) %s |\n"
+ " EXCLUDE [ USING %s ] ( %s WITH %s [, ... ] ) %s [ WHERE ( %s ) ] |\n"
+ " FOREIGN KEY ( %s [, ... ] ) REFERENCES %s [ ( %s [, ... ] ) ]\n"
+ " [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE %s ] [ ON UPDATE %s ] }\n"
+ "[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "IN ( %s [, ...] ) |\n"
+ "FROM ( { %s | MINVALUE | MAXVALUE } [, ...] )\n"
+ " TO ( { %s | MINVALUE | MAXVALUE } [, ...] ) |\n"
+ "WITH ( MODULUS %s, REMAINDER %s )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "[ INCLUDE ( %s [, ... ] ) ]\n"
+ "[ WITH ( %s [= %s] [, ... ] ) ]\n"
+ "[ USING INDEX TABLESPACE %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ %s | ( %s ) } [ %s ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( %s [, ... ] ) ] | SET DEFAULT [ ( %s [, ... ] ) ] }",
+ _("table_name"),
+ _("column_name"),
+ _("data_type"),
+ _("compression_method"),
+ _("collation"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("source_table"),
+ _("like_option"),
+ _("parent_table"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("table_name"),
+ _("type_name"),
+ _("column_name"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("table_name"),
+ _("parent_table"),
+ _("column_name"),
+ _("column_constraint"),
+ _("table_constraint"),
+ _("partition_bound_spec"),
+ _("column_name"),
+ _("expression"),
+ _("collation"),
+ _("opclass"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("where column_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("default_expr"),
+ _("generation_expr"),
+ _("sequence_options"),
+ _("index_parameters"),
+ _("index_parameters"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and table_constraint is:"),
+ _("constraint_name"),
+ _("expression"),
+ _("column_name"),
+ _("index_parameters"),
+ _("column_name"),
+ _("index_parameters"),
+ _("index_method"),
+ _("exclude_element"),
+ _("operator"),
+ _("index_parameters"),
+ _("predicate"),
+ _("column_name"),
+ _("reftable"),
+ _("refcolumn"),
+ _("referential_action"),
+ _("referential_action"),
+ _("and like_option is:"),
+ _("and partition_bound_spec is:"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("partition_bound_expr"),
+ _("numeric_literal"),
+ _("numeric_literal"),
+ _("index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:"),
+ _("column_name"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("exclude_element in an EXCLUDE constraint is:"),
+ _("column_name"),
+ _("expression"),
+ _("opclass"),
+ _("referential_action in a FOREIGN KEY/REFERENCES constraint is:"),
+ _("column_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_CREATE_TABLE_AS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] %s\n"
+ " [ (%s [, ...] ) ]\n"
+ " [ USING %s ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) | WITHOUT OIDS ]\n"
+ " [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]\n"
+ " [ TABLESPACE %s ]\n"
+ " AS %s\n"
+ " [ WITH [ NO ] DATA ]",
+ _("table_name"),
+ _("column_name"),
+ _("method"),
+ _("storage_parameter"),
+ _("value"),
+ _("tablespace_name"),
+ _("query"));
+}
+
+static void
+sql_help_CREATE_TABLESPACE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TABLESPACE %s\n"
+ " [ OWNER { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ]\n"
+ " LOCATION '%s'\n"
+ " [ WITH ( %s = %s [, ... ] ) ]",
+ _("tablespace_name"),
+ _("new_owner"),
+ _("directory"),
+ _("tablespace_option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_CONFIGURATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH CONFIGURATION %s (\n"
+ " PARSER = %s |\n"
+ " COPY = %s\n"
+ ")",
+ _("name"),
+ _("parser_name"),
+ _("source_config"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_DICTIONARY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH DICTIONARY %s (\n"
+ " TEMPLATE = %s\n"
+ " [, %s = %s [, ... ]]\n"
+ ")",
+ _("name"),
+ _("template"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_PARSER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH PARSER %s (\n"
+ " START = %s ,\n"
+ " GETTOKEN = %s ,\n"
+ " END = %s ,\n"
+ " LEXTYPES = %s\n"
+ " [, HEADLINE = %s ]\n"
+ ")",
+ _("name"),
+ _("start_function"),
+ _("gettoken_function"),
+ _("end_function"),
+ _("lextypes_function"),
+ _("headline_function"));
+}
+
+static void
+sql_help_CREATE_TEXT_SEARCH_TEMPLATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TEXT SEARCH TEMPLATE %s (\n"
+ " [ INIT = %s , ]\n"
+ " LEXIZE = %s\n"
+ ")",
+ _("name"),
+ _("init_function"),
+ _("lexize_function"));
+}
+
+static void
+sql_help_CREATE_TRANSFORM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] TRANSFORM FOR %s LANGUAGE %s (\n"
+ " FROM SQL WITH FUNCTION %s [ (%s [, ...]) ],\n"
+ " TO SQL WITH FUNCTION %s [ (%s [, ...]) ]\n"
+ ");",
+ _("type_name"),
+ _("lang_name"),
+ _("from_sql_function_name"),
+ _("argument_type"),
+ _("to_sql_function_name"),
+ _("argument_type"));
+}
+
+static void
+sql_help_CREATE_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER %s { BEFORE | AFTER | INSTEAD OF } { %s [ OR ... ] }\n"
+ " ON %s\n"
+ " [ FROM %s ]\n"
+ " [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]\n"
+ " [ REFERENCING { { OLD | NEW } TABLE [ AS ] %s } [ ... ] ]\n"
+ " [ FOR [ EACH ] { ROW | STATEMENT } ]\n"
+ " [ WHEN ( %s ) ]\n"
+ " EXECUTE { FUNCTION | PROCEDURE } %s ( %s )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " INSERT\n"
+ " UPDATE [ OF %s [, ... ] ]\n"
+ " DELETE\n"
+ " TRUNCATE",
+ _("name"),
+ _("event"),
+ _("table_name"),
+ _("referenced_table_name"),
+ _("transition_relation_name"),
+ _("condition"),
+ _("function_name"),
+ _("arguments"),
+ _("where event can be one of:"),
+ _("column_name"));
+}
+
+static void
+sql_help_CREATE_TYPE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE TYPE %s AS\n"
+ " ( [ %s %s [ COLLATE %s ] [, ... ] ] )\n"
+ "\n"
+ "CREATE TYPE %s AS ENUM\n"
+ " ( [ '%s' [, ... ] ] )\n"
+ "\n"
+ "CREATE TYPE %s AS RANGE (\n"
+ " SUBTYPE = %s\n"
+ " [ , SUBTYPE_OPCLASS = %s ]\n"
+ " [ , COLLATION = %s ]\n"
+ " [ , CANONICAL = %s ]\n"
+ " [ , SUBTYPE_DIFF = %s ]\n"
+ " [ , MULTIRANGE_TYPE_NAME = %s ]\n"
+ ")\n"
+ "\n"
+ "CREATE TYPE %s (\n"
+ " INPUT = %s,\n"
+ " OUTPUT = %s\n"
+ " [ , RECEIVE = %s ]\n"
+ " [ , SEND = %s ]\n"
+ " [ , TYPMOD_IN = %s ]\n"
+ " [ , TYPMOD_OUT = %s ]\n"
+ " [ , ANALYZE = %s ]\n"
+ " [ , SUBSCRIPT = %s ]\n"
+ " [ , INTERNALLENGTH = { %s | VARIABLE } ]\n"
+ " [ , PASSEDBYVALUE ]\n"
+ " [ , ALIGNMENT = %s ]\n"
+ " [ , STORAGE = %s ]\n"
+ " [ , LIKE = %s ]\n"
+ " [ , CATEGORY = %s ]\n"
+ " [ , PREFERRED = %s ]\n"
+ " [ , DEFAULT = %s ]\n"
+ " [ , ELEMENT = %s ]\n"
+ " [ , DELIMITER = %s ]\n"
+ " [ , COLLATABLE = %s ]\n"
+ ")\n"
+ "\n"
+ "CREATE TYPE %s",
+ _("name"),
+ _("attribute_name"),
+ _("data_type"),
+ _("collation"),
+ _("name"),
+ _("label"),
+ _("name"),
+ _("subtype"),
+ _("subtype_operator_class"),
+ _("collation"),
+ _("canonical_function"),
+ _("subtype_diff_function"),
+ _("multirange_type_name"),
+ _("name"),
+ _("input_function"),
+ _("output_function"),
+ _("receive_function"),
+ _("send_function"),
+ _("type_modifier_input_function"),
+ _("type_modifier_output_function"),
+ _("analyze_function"),
+ _("subscript_function"),
+ _("internallength"),
+ _("alignment"),
+ _("storage"),
+ _("like_type"),
+ _("category"),
+ _("preferred"),
+ _("default"),
+ _("element"),
+ _("delimiter"),
+ _("collatable"),
+ _("name"));
+}
+
+static void
+sql_help_CREATE_USER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE USER %s [ [ WITH ] %s [ ... ] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " SUPERUSER | NOSUPERUSER\n"
+ " | CREATEDB | NOCREATEDB\n"
+ " | CREATEROLE | NOCREATEROLE\n"
+ " | INHERIT | NOINHERIT\n"
+ " | LOGIN | NOLOGIN\n"
+ " | REPLICATION | NOREPLICATION\n"
+ " | BYPASSRLS | NOBYPASSRLS\n"
+ " | CONNECTION LIMIT %s\n"
+ " | [ ENCRYPTED ] PASSWORD '%s' | PASSWORD NULL\n"
+ " | VALID UNTIL '%s'\n"
+ " | IN ROLE %s [, ...]\n"
+ " | IN GROUP %s [, ...]\n"
+ " | ROLE %s [, ...]\n"
+ " | ADMIN %s [, ...]\n"
+ " | USER %s [, ...]\n"
+ " | SYSID %s",
+ _("name"),
+ _("option"),
+ _("where option can be:"),
+ _("connlimit"),
+ _("password"),
+ _("timestamp"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("role_name"),
+ _("uid"));
+}
+
+static void
+sql_help_CREATE_USER_MAPPING(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE USER MAPPING [ IF NOT EXISTS ] FOR { %s | USER | CURRENT_ROLE | CURRENT_USER | PUBLIC }\n"
+ " SERVER %s\n"
+ " [ OPTIONS ( %s '%s' [ , ... ] ) ]",
+ _("user_name"),
+ _("server_name"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_CREATE_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW %s [ ( %s [, ...] ) ]\n"
+ " [ WITH ( %s [= %s] [, ... ] ) ]\n"
+ " AS %s\n"
+ " [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]",
+ _("name"),
+ _("column_name"),
+ _("view_option_name"),
+ _("view_option_value"),
+ _("query"));
+}
+
+static void
+sql_help_DEALLOCATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DEALLOCATE [ PREPARE ] { %s | ALL }",
+ _("name"));
+}
+
+static void
+sql_help_DECLARE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DECLARE %s [ BINARY ] [ ASENSITIVE | INSENSITIVE ] [ [ NO ] SCROLL ]\n"
+ " CURSOR [ { WITH | WITHOUT } HOLD ] FOR %s",
+ _("name"),
+ _("query"));
+}
+
+static void
+sql_help_DELETE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "DELETE FROM [ ONLY ] %s [ * ] [ [ AS ] %s ]\n"
+ " [ USING %s [, ...] ]\n"
+ " [ WHERE %s | WHERE CURRENT OF %s ]\n"
+ " [ RETURNING * | %s [ [ AS ] %s ] [, ...] ]",
+ _("with_query"),
+ _("table_name"),
+ _("alias"),
+ _("from_item"),
+ _("condition"),
+ _("cursor_name"),
+ _("output_expression"),
+ _("output_name"));
+}
+
+static void
+sql_help_DISCARD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }");
+}
+
+static void
+sql_help_DO(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DO [ LANGUAGE %s ] %s",
+ _("lang_name"),
+ _("code"));
+}
+
+static void
+sql_help_DROP_ACCESS_METHOD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP ACCESS METHOD [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_AGGREGATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP AGGREGATE [ IF EXISTS ] %s ( %s ) [, ...] [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("name"),
+ _("aggregate_signature"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_CAST(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP CAST [ IF EXISTS ] (%s AS %s) [ CASCADE | RESTRICT ]",
+ _("source_type"),
+ _("target_type"));
+}
+
+static void
+sql_help_DROP_COLLATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP COLLATION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_CONVERSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP CONVERSION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_DATABASE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP DATABASE [ IF EXISTS ] %s [ [ WITH ] ( %s [, ...] ) ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " FORCE",
+ _("name"),
+ _("option"),
+ _("where option can be:"));
+}
+
+static void
+sql_help_DROP_DOMAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP DOMAIN [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_EVENT_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP EVENT TRIGGER [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_EXTENSION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP EXTENSION [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_FOREIGN_DATA_WRAPPER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP FOREIGN DATA WRAPPER [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_FOREIGN_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP FOREIGN TABLE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_FUNCTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP FUNCTION [ IF EXISTS ] %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_GROUP(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP GROUP [ IF EXISTS ] %s [, ...]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_INDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_LANGUAGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP MATERIALIZED VIEW [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_OPERATOR(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OPERATOR [ IF EXISTS ] %s ( { %s | NONE } , %s ) [, ...] [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("left_type"),
+ _("right_type"));
+}
+
+static void
+sql_help_DROP_OPERATOR_CLASS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OPERATOR CLASS [ IF EXISTS ] %s USING %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("index_method"));
+}
+
+static void
+sql_help_DROP_OPERATOR_FAMILY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OPERATOR FAMILY [ IF EXISTS ] %s USING %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("index_method"));
+}
+
+static void
+sql_help_DROP_OWNED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP OWNED BY { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_POLICY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP POLICY [ IF EXISTS ] %s ON %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("table_name"));
+}
+
+static void
+sql_help_DROP_PROCEDURE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP PROCEDURE [ IF EXISTS ] %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_PUBLICATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP PUBLICATION [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP ROLE [ IF EXISTS ] %s [, ...]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_ROUTINE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP ROUTINE [ IF EXISTS ] %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_DROP_RULE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP RULE [ IF EXISTS ] %s ON %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("table_name"));
+}
+
+static void
+sql_help_DROP_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SCHEMA [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_SEQUENCE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SEQUENCE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_SERVER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SERVER [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_STATISTICS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP STATISTICS [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_SUBSCRIPTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP SUBSCRIPTION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TABLE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TABLESPACE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TABLESPACE [ IF EXISTS ] %s",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_CONFIGURATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_DICTIONARY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_PARSER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH PARSER [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TEXT_SEARCH_TEMPLATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] %s [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_TRANSFORM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TRANSFORM [ IF EXISTS ] FOR %s LANGUAGE %s [ CASCADE | RESTRICT ]",
+ _("type_name"),
+ _("lang_name"));
+}
+
+static void
+sql_help_DROP_TRIGGER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TRIGGER [ IF EXISTS ] %s ON %s [ CASCADE | RESTRICT ]",
+ _("name"),
+ _("table_name"));
+}
+
+static void
+sql_help_DROP_TYPE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP TYPE [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_USER(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP USER [ IF EXISTS ] %s [, ...]",
+ _("name"));
+}
+
+static void
+sql_help_DROP_USER_MAPPING(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP USER MAPPING [ IF EXISTS ] FOR { %s | USER | CURRENT_ROLE | CURRENT_USER | PUBLIC } SERVER %s",
+ _("user_name"),
+ _("server_name"));
+}
+
+static void
+sql_help_DROP_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "DROP VIEW [ IF EXISTS ] %s [, ...] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_END(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "END [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_EXECUTE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "EXECUTE %s [ ( %s [, ...] ) ]",
+ _("name"),
+ _("parameter"));
+}
+
+static void
+sql_help_EXPLAIN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "EXPLAIN [ ( %s [, ...] ) ] %s\n"
+ "EXPLAIN [ ANALYZE ] [ VERBOSE ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ANALYZE [ %s ]\n"
+ " VERBOSE [ %s ]\n"
+ " COSTS [ %s ]\n"
+ " SETTINGS [ %s ]\n"
+ " GENERIC_PLAN [ %s ]\n"
+ " BUFFERS [ %s ]\n"
+ " WAL [ %s ]\n"
+ " TIMING [ %s ]\n"
+ " SUMMARY [ %s ]\n"
+ " FORMAT { TEXT | XML | JSON | YAML }",
+ _("option"),
+ _("statement"),
+ _("statement"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"));
+}
+
+static void
+sql_help_FETCH(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "FETCH [ %s ] [ FROM | IN ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " NEXT\n"
+ " PRIOR\n"
+ " FIRST\n"
+ " LAST\n"
+ " ABSOLUTE %s\n"
+ " RELATIVE %s\n"
+ " %s\n"
+ " ALL\n"
+ " FORWARD\n"
+ " FORWARD %s\n"
+ " FORWARD ALL\n"
+ " BACKWARD\n"
+ " BACKWARD %s\n"
+ " BACKWARD ALL",
+ _("direction"),
+ _("cursor_name"),
+ _("where direction can be one of:"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"));
+}
+
+static void
+sql_help_GRANT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { [ TABLE ] %s [, ...]\n"
+ " | ALL TABLES IN SCHEMA %s [, ...] }\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( %s [, ...] )\n"
+ " [, ...] | ALL [ PRIVILEGES ] ( %s [, ...] ) }\n"
+ " ON [ TABLE ] %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { SEQUENCE %s [, ...]\n"
+ " | ALL SEQUENCES IN SCHEMA %s [, ...] }\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON DATABASE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON DOMAIN %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN DATA WRAPPER %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN SERVER %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { { FUNCTION | PROCEDURE | ROUTINE } %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA %s [, ...] }\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON LANGUAGE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON LARGE OBJECT %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }\n"
+ " ON PARAMETER %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMA %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON TABLESPACE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPE %s [, ...]\n"
+ " TO %s [, ...] [ WITH GRANT OPTION ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "GRANT %s [, ...] TO %s [, ...]\n"
+ " [ WITH { ADMIN | INHERIT | SET } { OPTION | TRUE | FALSE } ]\n"
+ " [ GRANTED BY %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ GROUP ] %s\n"
+ " | PUBLIC\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("table_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("column_name"),
+ _("column_name"),
+ _("table_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("sequence_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("database_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("domain_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("fdw_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("server_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("routine_name"),
+ _("argmode"),
+ _("arg_name"),
+ _("arg_type"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("lang_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("loid"),
+ _("role_specification"),
+ _("role_specification"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("role_specification"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("tablespace_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("type_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("role_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_IMPORT_FOREIGN_SCHEMA(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "IMPORT FOREIGN SCHEMA %s\n"
+ " [ { LIMIT TO | EXCEPT } ( %s [, ...] ) ]\n"
+ " FROM SERVER %s\n"
+ " INTO %s\n"
+ " [ OPTIONS ( %s '%s' [, ... ] ) ]",
+ _("remote_schema"),
+ _("table_name"),
+ _("server_name"),
+ _("local_schema"),
+ _("option"),
+ _("value"));
+}
+
+static void
+sql_help_INSERT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "INSERT INTO %s [ AS %s ] [ ( %s [, ...] ) ]\n"
+ " [ OVERRIDING { SYSTEM | USER } VALUE ]\n"
+ " { DEFAULT VALUES | VALUES ( { %s | DEFAULT } [, ...] ) [, ...] | %s }\n"
+ " [ ON CONFLICT [ %s ] %s ]\n"
+ " [ RETURNING * | %s [ [ AS ] %s ] [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( { %s | ( %s ) } [ COLLATE %s ] [ %s ] [, ...] ) [ WHERE %s ]\n"
+ " ON CONSTRAINT %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " DO NOTHING\n"
+ " DO UPDATE SET { %s = { %s | DEFAULT } |\n"
+ " ( %s [, ...] ) = [ ROW ] ( { %s | DEFAULT } [, ...] ) |\n"
+ " ( %s [, ...] ) = ( %s )\n"
+ " } [, ...]\n"
+ " [ WHERE %s ]",
+ _("with_query"),
+ _("table_name"),
+ _("alias"),
+ _("column_name"),
+ _("expression"),
+ _("query"),
+ _("conflict_target"),
+ _("conflict_action"),
+ _("output_expression"),
+ _("output_name"),
+ _("where conflict_target can be one of:"),
+ _("index_column_name"),
+ _("index_expression"),
+ _("collation"),
+ _("opclass"),
+ _("index_predicate"),
+ _("constraint_name"),
+ _("and conflict_action is one of:"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("sub-SELECT"),
+ _("condition"));
+}
+
+static void
+sql_help_LISTEN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "LISTEN %s",
+ _("channel"));
+}
+
+static void
+sql_help_LOAD(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "LOAD '%s'",
+ _("filename"));
+}
+
+static void
+sql_help_LOCK(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "LOCK [ TABLE ] [ ONLY ] %s [ * ] [, ...] [ IN %s MODE ] [ NOWAIT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE\n"
+ " | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE",
+ _("name"),
+ _("lockmode"),
+ _("where lockmode is one of:"));
+}
+
+static void
+sql_help_MERGE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH %s [, ...] ]\n"
+ "MERGE INTO [ ONLY ] %s [ * ] [ [ AS ] %s ]\n"
+ "USING %s ON %s\n"
+ "%s [...]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ [ ONLY ] %s [ * ] | ( %s ) } [ [ AS ] %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "{ WHEN MATCHED [ AND %s ] THEN { %s | %s | DO NOTHING } |\n"
+ " WHEN NOT MATCHED [ AND %s ] THEN { %s | DO NOTHING } }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "INSERT [( %s [, ...] )]\n"
+ "[ OVERRIDING { SYSTEM | USER } VALUE ]\n"
+ "{ VALUES ( { %s | DEFAULT } [, ...] ) | DEFAULT VALUES }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "UPDATE SET { %s = { %s | DEFAULT } |\n"
+ " ( %s [, ...] ) = ( { %s | DEFAULT } [, ...] ) } [, ...]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "DELETE",
+ _("with_query"),
+ _("target_table_name"),
+ _("target_alias"),
+ _("data_source"),
+ _("join_condition"),
+ _("when_clause"),
+ _("where data_source is:"),
+ _("source_table_name"),
+ _("source_query"),
+ _("source_alias"),
+ _("and when_clause is:"),
+ _("condition"),
+ _("merge_update"),
+ _("merge_delete"),
+ _("condition"),
+ _("merge_insert"),
+ _("and merge_insert is:"),
+ _("column_name"),
+ _("expression"),
+ _("and merge_update is:"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("and merge_delete is:"));
+}
+
+static void
+sql_help_MOVE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "MOVE [ %s ] [ FROM | IN ] %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " NEXT\n"
+ " PRIOR\n"
+ " FIRST\n"
+ " LAST\n"
+ " ABSOLUTE %s\n"
+ " RELATIVE %s\n"
+ " %s\n"
+ " ALL\n"
+ " FORWARD\n"
+ " FORWARD %s\n"
+ " FORWARD ALL\n"
+ " BACKWARD\n"
+ " BACKWARD %s\n"
+ " BACKWARD ALL",
+ _("direction"),
+ _("cursor_name"),
+ _("where direction can be one of:"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"),
+ _("count"));
+}
+
+static void
+sql_help_NOTIFY(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "NOTIFY %s [ , %s ]",
+ _("channel"),
+ _("payload"));
+}
+
+static void
+sql_help_PREPARE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "PREPARE %s [ ( %s [, ...] ) ] AS %s",
+ _("name"),
+ _("data_type"),
+ _("statement"));
+}
+
+static void
+sql_help_PREPARE_TRANSACTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "PREPARE TRANSACTION %s",
+ _("transaction_id"));
+}
+
+static void
+sql_help_REASSIGN_OWNED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REASSIGN OWNED BY { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...]\n"
+ " TO { %s | CURRENT_ROLE | CURRENT_USER | SESSION_USER }",
+ _("old_role"),
+ _("new_role"));
+}
+
+static void
+sql_help_REFRESH_MATERIALIZED_VIEW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] %s\n"
+ " [ WITH [ NO ] DATA ]",
+ _("name"));
+}
+
+static void
+sql_help_REINDEX(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REINDEX [ ( %s [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] %s\n"
+ "REINDEX [ ( %s [, ...] ) ] { DATABASE | SYSTEM } [ CONCURRENTLY ] [ %s ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " CONCURRENTLY [ %s ]\n"
+ " TABLESPACE %s\n"
+ " VERBOSE [ %s ]",
+ _("option"),
+ _("name"),
+ _("option"),
+ _("name"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("new_tablespace"),
+ _("boolean"));
+}
+
+static void
+sql_help_RELEASE_SAVEPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "RELEASE [ SAVEPOINT ] %s",
+ _("savepoint_name"));
+}
+
+static void
+sql_help_RESET(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "RESET %s\n"
+ "RESET ALL",
+ _("configuration_parameter"));
+}
+
+static void
+sql_help_REVOKE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { [ TABLE ] %s [, ...]\n"
+ " | ALL TABLES IN SCHEMA %s [, ...] }\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | INSERT | UPDATE | REFERENCES } ( %s [, ...] )\n"
+ " [, ...] | ALL [ PRIVILEGES ] ( %s [, ...] ) }\n"
+ " ON [ TABLE ] %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { USAGE | SELECT | UPDATE }\n"
+ " [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON { SEQUENCE %s [, ...]\n"
+ " | ALL SEQUENCES IN SCHEMA %s [, ...] }\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON DATABASE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON DOMAIN %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN DATA WRAPPER %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON FOREIGN SERVER %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { EXECUTE | ALL [ PRIVILEGES ] }\n"
+ " ON { { FUNCTION | PROCEDURE | ROUTINE } %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] [, ...]\n"
+ " | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA %s [, ...] }\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON LANGUAGE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON LARGE OBJECT %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON PARAMETER %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }\n"
+ " ON SCHEMA %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { CREATE | ALL [ PRIVILEGES ] }\n"
+ " ON TABLESPACE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ GRANT OPTION FOR ]\n"
+ " { USAGE | ALL [ PRIVILEGES ] }\n"
+ " ON TYPE %s [, ...]\n"
+ " FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]\n"
+ " %s [, ...] FROM %s [, ...]\n"
+ " [ GRANTED BY %s ]\n"
+ " [ CASCADE | RESTRICT ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ GROUP ] %s\n"
+ " | PUBLIC\n"
+ " | CURRENT_ROLE\n"
+ " | CURRENT_USER\n"
+ " | SESSION_USER",
+ _("table_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("column_name"),
+ _("column_name"),
+ _("table_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("sequence_name"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("database_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("domain_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("fdw_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("server_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("function_name"),
+ _("argmode"),
+ _("arg_name"),
+ _("arg_type"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("lang_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("loid"),
+ _("role_specification"),
+ _("role_specification"),
+ _("configuration_parameter"),
+ _("role_specification"),
+ _("role_specification"),
+ _("schema_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("tablespace_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("type_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("role_name"),
+ _("role_specification"),
+ _("role_specification"),
+ _("where role_specification can be:"),
+ _("role_name"));
+}
+
+static void
+sql_help_ROLLBACK(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ROLLBACK [ WORK | TRANSACTION ] [ AND [ NO ] CHAIN ]");
+}
+
+static void
+sql_help_ROLLBACK_PREPARED(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ROLLBACK PREPARED %s",
+ _("transaction_id"));
+}
+
+static void
+sql_help_ROLLBACK_TO_SAVEPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] %s",
+ _("savepoint_name"));
+}
+
+static void
+sql_help_SAVEPOINT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SAVEPOINT %s",
+ _("savepoint_name"));
+}
+
+static void
+sql_help_SECURITY_LABEL(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SECURITY LABEL [ FOR %s ] ON\n"
+ "{\n"
+ " TABLE %s |\n"
+ " COLUMN %s.%s |\n"
+ " AGGREGATE %s ( %s ) |\n"
+ " DATABASE %s |\n"
+ " DOMAIN %s |\n"
+ " EVENT TRIGGER %s |\n"
+ " FOREIGN TABLE %s\n"
+ " FUNCTION %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " LARGE OBJECT %s |\n"
+ " MATERIALIZED VIEW %s |\n"
+ " [ PROCEDURAL ] LANGUAGE %s |\n"
+ " PROCEDURE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " PUBLICATION %s |\n"
+ " ROLE %s |\n"
+ " ROUTINE %s [ ( [ [ %s ] [ %s ] %s [, ...] ] ) ] |\n"
+ " SCHEMA %s |\n"
+ " SEQUENCE %s |\n"
+ " SUBSCRIPTION %s |\n"
+ " TABLESPACE %s |\n"
+ " TYPE %s |\n"
+ " VIEW %s\n"
+ "} IS { %s | NULL }\n"
+ "\n"
+ "%s\n"
+ "\n"
+ "* |\n"
+ "[ %s ] [ %s ] %s [ , ... ] |\n"
+ "[ [ %s ] [ %s ] %s [ , ... ] ] ORDER BY [ %s ] [ %s ] %s [ , ... ]",
+ _("provider"),
+ _("object_name"),
+ _("table_name"),
+ _("column_name"),
+ _("aggregate_name"),
+ _("aggregate_signature"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("function_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("large_object_oid"),
+ _("object_name"),
+ _("object_name"),
+ _("procedure_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("routine_name"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("object_name"),
+ _("string_literal"),
+ _("where aggregate_signature is:"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"),
+ _("argmode"),
+ _("argname"),
+ _("argtype"));
+}
+
+static void
+sql_help_SELECT(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " [ * | %s [ [ AS ] %s ] [, ...] ]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY [ ALL | DISTINCT ] %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } { ONLY | WITH TIES } ]\n"
+ " [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF %s [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ ONLY ] %s [ * ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ TABLESAMPLE %s ( %s [, ...] ) [ REPEATABLE ( %s ) ] ]\n"
+ " [ LATERAL ] ( %s ) [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) [ AS ] %s ( %s [, ...] )\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) AS ( %s [, ...] )\n"
+ " [ LATERAL ] ROWS FROM( %s ( [ %s [, ...] ] ) [ AS ( %s [, ...] ) ] [, ...] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s %s %s { ON %s | USING ( %s [, ...] ) [ AS %s ] }\n"
+ " %s NATURAL %s %s\n"
+ " %s CROSS JOIN %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( )\n"
+ " %s\n"
+ " ( %s [, ...] )\n"
+ " ROLLUP ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " CUBE ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " GROUPING SETS ( %s [, ...] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( %s | %s | %s | %s | %s )\n"
+ " [ SEARCH { BREADTH | DEPTH } FIRST BY %s [, ...] SET %s ]\n"
+ " [ CYCLE %s [, ...] SET %s [ TO %s DEFAULT %s ] USING %s ]\n"
+ "\n"
+ "TABLE [ ONLY ] %s [ * ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("from_item"),
+ _("condition"),
+ _("grouping_element"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"),
+ _("where from_item can be one of:"),
+ _("table_name"),
+ _("alias"),
+ _("column_alias"),
+ _("sampling_method"),
+ _("argument"),
+ _("seed"),
+ _("select"),
+ _("alias"),
+ _("column_alias"),
+ _("with_query_name"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("alias"),
+ _("column_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("join_condition"),
+ _("join_column"),
+ _("join_using_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("from_item"),
+ _("from_item"),
+ _("and grouping_element can be one of:"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("grouping_element"),
+ _("and with_query is:"),
+ _("with_query_name"),
+ _("column_name"),
+ _("select"),
+ _("values"),
+ _("insert"),
+ _("update"),
+ _("delete"),
+ _("column_name"),
+ _("search_seq_col_name"),
+ _("column_name"),
+ _("cycle_mark_col_name"),
+ _("cycle_mark_value"),
+ _("cycle_mark_default"),
+ _("cycle_path_col_name"),
+ _("table_name"));
+}
+
+static void
+sql_help_SELECT_INTO(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " * | %s [ [ AS ] %s ] [, ...]\n"
+ " INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] %s\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } ONLY ]\n"
+ " [ FOR { UPDATE | SHARE } [ OF %s [, ...] ] [ NOWAIT ] [...] ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("new_table"),
+ _("from_item"),
+ _("condition"),
+ _("expression"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"));
+}
+
+static void
+sql_help_SET(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET [ SESSION | LOCAL ] %s { TO | = } { %s | '%s' | DEFAULT }\n"
+ "SET [ SESSION | LOCAL ] TIME ZONE { %s | '%s' | LOCAL | DEFAULT }",
+ _("configuration_parameter"),
+ _("value"),
+ _("value"),
+ _("value"),
+ _("value"));
+}
+
+static void
+sql_help_SET_CONSTRAINTS(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET CONSTRAINTS { ALL | %s [, ...] } { DEFERRED | IMMEDIATE }",
+ _("name"));
+}
+
+static void
+sql_help_SET_ROLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET [ SESSION | LOCAL ] ROLE %s\n"
+ "SET [ SESSION | LOCAL ] ROLE NONE\n"
+ "RESET ROLE",
+ _("role_name"));
+}
+
+static void
+sql_help_SET_SESSION_AUTHORIZATION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION %s\n"
+ "SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT\n"
+ "RESET SESSION AUTHORIZATION",
+ _("user_name"));
+}
+
+static void
+sql_help_SET_TRANSACTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SET TRANSACTION %s [, ...]\n"
+ "SET TRANSACTION SNAPSHOT %s\n"
+ "SET SESSION CHARACTERISTICS AS TRANSACTION %s [, ...]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+ " READ WRITE | READ ONLY\n"
+ " [ NOT ] DEFERRABLE",
+ _("transaction_mode"),
+ _("snapshot_id"),
+ _("transaction_mode"),
+ _("where transaction_mode is one of:"));
+}
+
+static void
+sql_help_SHOW(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "SHOW %s\n"
+ "SHOW ALL",
+ _("name"));
+}
+
+static void
+sql_help_START_TRANSACTION(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "START TRANSACTION [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }\n"
+ " READ WRITE | READ ONLY\n"
+ " [ NOT ] DEFERRABLE",
+ _("transaction_mode"),
+ _("where transaction_mode is one of:"));
+}
+
+static void
+sql_help_TABLE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " [ * | %s [ [ AS ] %s ] [, ...] ]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY [ ALL | DISTINCT ] %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } { ONLY | WITH TIES } ]\n"
+ " [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF %s [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ ONLY ] %s [ * ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ TABLESAMPLE %s ( %s [, ...] ) [ REPEATABLE ( %s ) ] ]\n"
+ " [ LATERAL ] ( %s ) [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) [ AS ] %s ( %s [, ...] )\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) AS ( %s [, ...] )\n"
+ " [ LATERAL ] ROWS FROM( %s ( [ %s [, ...] ] ) [ AS ( %s [, ...] ) ] [, ...] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s %s %s { ON %s | USING ( %s [, ...] ) [ AS %s ] }\n"
+ " %s NATURAL %s %s\n"
+ " %s CROSS JOIN %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( )\n"
+ " %s\n"
+ " ( %s [, ...] )\n"
+ " ROLLUP ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " CUBE ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " GROUPING SETS ( %s [, ...] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( %s | %s | %s | %s | %s )\n"
+ " [ SEARCH { BREADTH | DEPTH } FIRST BY %s [, ...] SET %s ]\n"
+ " [ CYCLE %s [, ...] SET %s [ TO %s DEFAULT %s ] USING %s ]\n"
+ "\n"
+ "TABLE [ ONLY ] %s [ * ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("from_item"),
+ _("condition"),
+ _("grouping_element"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"),
+ _("where from_item can be one of:"),
+ _("table_name"),
+ _("alias"),
+ _("column_alias"),
+ _("sampling_method"),
+ _("argument"),
+ _("seed"),
+ _("select"),
+ _("alias"),
+ _("column_alias"),
+ _("with_query_name"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("alias"),
+ _("column_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("join_condition"),
+ _("join_column"),
+ _("join_using_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("from_item"),
+ _("from_item"),
+ _("and grouping_element can be one of:"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("grouping_element"),
+ _("and with_query is:"),
+ _("with_query_name"),
+ _("column_name"),
+ _("select"),
+ _("values"),
+ _("insert"),
+ _("update"),
+ _("delete"),
+ _("column_name"),
+ _("search_seq_col_name"),
+ _("column_name"),
+ _("cycle_mark_col_name"),
+ _("cycle_mark_value"),
+ _("cycle_mark_default"),
+ _("cycle_path_col_name"),
+ _("table_name"));
+}
+
+static void
+sql_help_TRUNCATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "TRUNCATE [ TABLE ] [ ONLY ] %s [ * ] [, ... ]\n"
+ " [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]",
+ _("name"));
+}
+
+static void
+sql_help_UNLISTEN(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "UNLISTEN { %s | * }",
+ _("channel"));
+}
+
+static void
+sql_help_UPDATE(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "UPDATE [ ONLY ] %s [ * ] [ [ AS ] %s ]\n"
+ " SET { %s = { %s | DEFAULT } |\n"
+ " ( %s [, ...] ) = [ ROW ] ( { %s | DEFAULT } [, ...] ) |\n"
+ " ( %s [, ...] ) = ( %s )\n"
+ " } [, ...]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s | WHERE CURRENT OF %s ]\n"
+ " [ RETURNING * | %s [ [ AS ] %s ] [, ...] ]",
+ _("with_query"),
+ _("table_name"),
+ _("alias"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("expression"),
+ _("column_name"),
+ _("sub-SELECT"),
+ _("from_item"),
+ _("condition"),
+ _("cursor_name"),
+ _("output_expression"),
+ _("output_name"));
+}
+
+static void
+sql_help_VACUUM(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "VACUUM [ ( %s [, ...] ) ] [ %s [, ...] ]\n"
+ "VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ %s [, ...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " FULL [ %s ]\n"
+ " FREEZE [ %s ]\n"
+ " VERBOSE [ %s ]\n"
+ " ANALYZE [ %s ]\n"
+ " DISABLE_PAGE_SKIPPING [ %s ]\n"
+ " SKIP_LOCKED [ %s ]\n"
+ " INDEX_CLEANUP { AUTO | ON | OFF }\n"
+ " PROCESS_MAIN [ %s ]\n"
+ " PROCESS_TOAST [ %s ]\n"
+ " TRUNCATE [ %s ]\n"
+ " PARALLEL %s\n"
+ " SKIP_DATABASE_STATS [ %s ]\n"
+ " ONLY_DATABASE_STATS [ %s ]\n"
+ " BUFFER_USAGE_LIMIT %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ]",
+ _("option"),
+ _("table_and_columns"),
+ _("table_and_columns"),
+ _("where option can be one of:"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("boolean"),
+ _("integer"),
+ _("boolean"),
+ _("boolean"),
+ _("size"),
+ _("and table_and_columns is:"),
+ _("table_name"),
+ _("column_name"));
+}
+
+static void
+sql_help_VALUES(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "VALUES ( %s [, ...] ) [, ...]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } ONLY ]",
+ _("expression"),
+ _("sort_expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"));
+}
+
+static void
+sql_help_WITH(PQExpBuffer buf)
+{
+ appendPQExpBuffer(buf,
+ "[ WITH [ RECURSIVE ] %s [, ...] ]\n"
+ "SELECT [ ALL | DISTINCT [ ON ( %s [, ...] ) ] ]\n"
+ " [ * | %s [ [ AS ] %s ] [, ...] ]\n"
+ " [ FROM %s [, ...] ]\n"
+ " [ WHERE %s ]\n"
+ " [ GROUP BY [ ALL | DISTINCT ] %s [, ...] ]\n"
+ " [ HAVING %s ]\n"
+ " [ WINDOW %s AS ( %s ) [, ...] ]\n"
+ " [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] %s ]\n"
+ " [ ORDER BY %s [ ASC | DESC | USING %s ] [ NULLS { FIRST | LAST } ] [, ...] ]\n"
+ " [ LIMIT { %s | ALL } ]\n"
+ " [ OFFSET %s [ ROW | ROWS ] ]\n"
+ " [ FETCH { FIRST | NEXT } [ %s ] { ROW | ROWS } { ONLY | WITH TIES } ]\n"
+ " [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF %s [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ]\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " [ ONLY ] %s [ * ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ TABLESAMPLE %s ( %s [, ...] ) [ REPEATABLE ( %s ) ] ]\n"
+ " [ LATERAL ] ( %s ) [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) [ AS ] %s ( %s [, ...] )\n"
+ " [ LATERAL ] %s ( [ %s [, ...] ] ) AS ( %s [, ...] )\n"
+ " [ LATERAL ] ROWS FROM( %s ( [ %s [, ...] ] ) [ AS ( %s [, ...] ) ] [, ...] )\n"
+ " [ WITH ORDINALITY ] [ [ AS ] %s [ ( %s [, ...] ) ] ]\n"
+ " %s %s %s { ON %s | USING ( %s [, ...] ) [ AS %s ] }\n"
+ " %s NATURAL %s %s\n"
+ " %s CROSS JOIN %s\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " ( )\n"
+ " %s\n"
+ " ( %s [, ...] )\n"
+ " ROLLUP ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " CUBE ( { %s | ( %s [, ...] ) } [, ...] )\n"
+ " GROUPING SETS ( %s [, ...] )\n"
+ "\n"
+ "%s\n"
+ "\n"
+ " %s [ ( %s [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( %s | %s | %s | %s | %s )\n"
+ " [ SEARCH { BREADTH | DEPTH } FIRST BY %s [, ...] SET %s ]\n"
+ " [ CYCLE %s [, ...] SET %s [ TO %s DEFAULT %s ] USING %s ]\n"
+ "\n"
+ "TABLE [ ONLY ] %s [ * ]",
+ _("with_query"),
+ _("expression"),
+ _("expression"),
+ _("output_name"),
+ _("from_item"),
+ _("condition"),
+ _("grouping_element"),
+ _("condition"),
+ _("window_name"),
+ _("window_definition"),
+ _("select"),
+ _("expression"),
+ _("operator"),
+ _("count"),
+ _("start"),
+ _("count"),
+ _("table_name"),
+ _("where from_item can be one of:"),
+ _("table_name"),
+ _("alias"),
+ _("column_alias"),
+ _("sampling_method"),
+ _("argument"),
+ _("seed"),
+ _("select"),
+ _("alias"),
+ _("column_alias"),
+ _("with_query_name"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_alias"),
+ _("function_name"),
+ _("argument"),
+ _("alias"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("function_name"),
+ _("argument"),
+ _("column_definition"),
+ _("alias"),
+ _("column_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("join_condition"),
+ _("join_column"),
+ _("join_using_alias"),
+ _("from_item"),
+ _("join_type"),
+ _("from_item"),
+ _("from_item"),
+ _("from_item"),
+ _("and grouping_element can be one of:"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("expression"),
+ _("grouping_element"),
+ _("and with_query is:"),
+ _("with_query_name"),
+ _("column_name"),
+ _("select"),
+ _("values"),
+ _("insert"),
+ _("update"),
+ _("delete"),
+ _("column_name"),
+ _("search_seq_col_name"),
+ _("column_name"),
+ _("cycle_mark_col_name"),
+ _("cycle_mark_value"),
+ _("cycle_mark_default"),
+ _("cycle_path_col_name"),
+ _("table_name"));
+}
+
+
+const struct _helpStruct QL_HELP[] = {
+ {"ABORT",
+ N_("abort the current transaction"),
+ "sql-abort",
+ sql_help_ABORT,
+ 0},
+
+ {"ALTER AGGREGATE",
+ N_("change the definition of an aggregate function"),
+ "sql-alteraggregate",
+ sql_help_ALTER_AGGREGATE,
+ 9},
+
+ {"ALTER COLLATION",
+ N_("change the definition of a collation"),
+ "sql-altercollation",
+ sql_help_ALTER_COLLATION,
+ 4},
+
+ {"ALTER CONVERSION",
+ N_("change the definition of a conversion"),
+ "sql-alterconversion",
+ sql_help_ALTER_CONVERSION,
+ 2},
+
+ {"ALTER DATABASE",
+ N_("change a database"),
+ "sql-alterdatabase",
+ sql_help_ALTER_DATABASE,
+ 19},
+
+ {"ALTER DEFAULT PRIVILEGES",
+ N_("define default access privileges"),
+ "sql-alterdefaultprivileges",
+ sql_help_ALTER_DEFAULT_PRIVILEGES,
+ 59},
+
+ {"ALTER DOMAIN",
+ N_("change the definition of a domain"),
+ "sql-alterdomain",
+ sql_help_ALTER_DOMAIN,
+ 17},
+
+ {"ALTER EVENT TRIGGER",
+ N_("change the definition of an event trigger"),
+ "sql-altereventtrigger",
+ sql_help_ALTER_EVENT_TRIGGER,
+ 3},
+
+ {"ALTER EXTENSION",
+ N_("change the definition of an extension"),
+ "sql-alterextension",
+ sql_help_ALTER_EXTENSION,
+ 40},
+
+ {"ALTER FOREIGN DATA WRAPPER",
+ N_("change the definition of a foreign-data wrapper"),
+ "sql-alterforeigndatawrapper",
+ sql_help_ALTER_FOREIGN_DATA_WRAPPER,
+ 5},
+
+ {"ALTER FOREIGN TABLE",
+ N_("change the definition of a foreign table"),
+ "sql-alterforeigntable",
+ sql_help_ALTER_FOREIGN_TABLE,
+ 33},
+
+ {"ALTER FUNCTION",
+ N_("change the definition of a function"),
+ "sql-alterfunction",
+ sql_help_ALTER_FUNCTION,
+ 24},
+
+ {"ALTER GROUP",
+ N_("change role name or membership"),
+ "sql-altergroup",
+ sql_help_ALTER_GROUP,
+ 10},
+
+ {"ALTER INDEX",
+ N_("change the definition of an index"),
+ "sql-alterindex",
+ sql_help_ALTER_INDEX,
+ 9},
+
+ {"ALTER LANGUAGE",
+ N_("change the definition of a procedural language"),
+ "sql-alterlanguage",
+ sql_help_ALTER_LANGUAGE,
+ 1},
+
+ {"ALTER LARGE OBJECT",
+ N_("change the definition of a large object"),
+ "sql-alterlargeobject",
+ sql_help_ALTER_LARGE_OBJECT,
+ 0},
+
+ {"ALTER MATERIALIZED VIEW",
+ N_("change the definition of a materialized view"),
+ "sql-altermaterializedview",
+ sql_help_ALTER_MATERIALIZED_VIEW,
+ 26},
+
+ {"ALTER OPERATOR",
+ N_("change the definition of an operator"),
+ "sql-alteroperator",
+ sql_help_ALTER_OPERATOR,
+ 9},
+
+ {"ALTER OPERATOR CLASS",
+ N_("change the definition of an operator class"),
+ "sql-alteropclass",
+ sql_help_ALTER_OPERATOR_CLASS,
+ 7},
+
+ {"ALTER OPERATOR FAMILY",
+ N_("change the definition of an operator family"),
+ "sql-alteropfamily",
+ sql_help_ALTER_OPERATOR_FAMILY,
+ 19},
+
+ {"ALTER POLICY",
+ N_("change the definition of a row-level security policy"),
+ "sql-alterpolicy",
+ sql_help_ALTER_POLICY,
+ 5},
+
+ {"ALTER PROCEDURE",
+ N_("change the definition of a procedure"),
+ "sql-alterprocedure",
+ sql_help_ALTER_PROCEDURE,
+ 17},
+
+ {"ALTER PUBLICATION",
+ N_("change the definition of a publication"),
+ "sql-alterpublication",
+ sql_help_ALTER_PUBLICATION,
+ 10},
+
+ {"ALTER ROLE",
+ N_("change a database role"),
+ "sql-alterrole",
+ sql_help_ALTER_ROLE,
+ 27},
+
+ {"ALTER ROUTINE",
+ N_("change the definition of a routine"),
+ "sql-alterroutine",
+ sql_help_ALTER_ROUTINE,
+ 22},
+
+ {"ALTER RULE",
+ N_("change the definition of a rule"),
+ "sql-alterrule",
+ sql_help_ALTER_RULE,
+ 0},
+
+ {"ALTER SCHEMA",
+ N_("change the definition of a schema"),
+ "sql-alterschema",
+ sql_help_ALTER_SCHEMA,
+ 1},
+
+ {"ALTER SEQUENCE",
+ N_("change the definition of a sequence generator"),
+ "sql-altersequence",
+ sql_help_ALTER_SEQUENCE,
+ 11},
+
+ {"ALTER SERVER",
+ N_("change the definition of a foreign server"),
+ "sql-alterserver",
+ sql_help_ALTER_SERVER,
+ 3},
+
+ {"ALTER STATISTICS",
+ N_("change the definition of an extended statistics object"),
+ "sql-alterstatistics",
+ sql_help_ALTER_STATISTICS,
+ 3},
+
+ {"ALTER SUBSCRIPTION",
+ N_("change the definition of a subscription"),
+ "sql-altersubscription",
+ sql_help_ALTER_SUBSCRIPTION,
+ 10},
+
+ {"ALTER SYSTEM",
+ N_("change a server configuration parameter"),
+ "sql-altersystem",
+ sql_help_ALTER_SYSTEM,
+ 3},
+
+ {"ALTER TABLE",
+ N_("change the definition of a table"),
+ "sql-altertable",
+ sql_help_ALTER_TABLE,
+ 117},
+
+ {"ALTER TABLESPACE",
+ N_("change the definition of a tablespace"),
+ "sql-altertablespace",
+ sql_help_ALTER_TABLESPACE,
+ 3},
+
+ {"ALTER TEXT SEARCH CONFIGURATION",
+ N_("change the definition of a text search configuration"),
+ "sql-altertsconfig",
+ sql_help_ALTER_TEXT_SEARCH_CONFIGURATION,
+ 12},
+
+ {"ALTER TEXT SEARCH DICTIONARY",
+ N_("change the definition of a text search dictionary"),
+ "sql-altertsdictionary",
+ sql_help_ALTER_TEXT_SEARCH_DICTIONARY,
+ 5},
+
+ {"ALTER TEXT SEARCH PARSER",
+ N_("change the definition of a text search parser"),
+ "sql-altertsparser",
+ sql_help_ALTER_TEXT_SEARCH_PARSER,
+ 1},
+
+ {"ALTER TEXT SEARCH TEMPLATE",
+ N_("change the definition of a text search template"),
+ "sql-altertstemplate",
+ sql_help_ALTER_TEXT_SEARCH_TEMPLATE,
+ 1},
+
+ {"ALTER TRIGGER",
+ N_("change the definition of a trigger"),
+ "sql-altertrigger",
+ sql_help_ALTER_TRIGGER,
+ 1},
+
+ {"ALTER TYPE",
+ N_("change the definition of a type"),
+ "sql-altertype",
+ sql_help_ALTER_TYPE,
+ 13},
+
+ {"ALTER USER",
+ N_("change a database role"),
+ "sql-alteruser",
+ sql_help_ALTER_USER,
+ 27},
+
+ {"ALTER USER MAPPING",
+ N_("change the definition of a user mapping"),
+ "sql-alterusermapping",
+ sql_help_ALTER_USER_MAPPING,
+ 2},
+
+ {"ALTER VIEW",
+ N_("change the definition of a view"),
+ "sql-alterview",
+ sql_help_ALTER_VIEW,
+ 7},
+
+ {"ANALYZE",
+ N_("collect statistics about a database"),
+ "sql-analyze",
+ sql_help_ANALYZE,
+ 11},
+
+ {"BEGIN",
+ N_("start a transaction block"),
+ "sql-begin",
+ sql_help_BEGIN,
+ 6},
+
+ {"CALL",
+ N_("invoke a procedure"),
+ "sql-call",
+ sql_help_CALL,
+ 0},
+
+ {"CHECKPOINT",
+ N_("force a write-ahead log checkpoint"),
+ "sql-checkpoint",
+ sql_help_CHECKPOINT,
+ 0},
+
+ {"CLOSE",
+ N_("close a cursor"),
+ "sql-close",
+ sql_help_CLOSE,
+ 0},
+
+ {"CLUSTER",
+ N_("cluster a table according to an index"),
+ "sql-cluster",
+ sql_help_CLUSTER,
+ 6},
+
+ {"COMMENT",
+ N_("define or change the comment of an object"),
+ "sql-comment",
+ sql_help_COMMENT,
+ 51},
+
+ {"COMMIT",
+ N_("commit the current transaction"),
+ "sql-commit",
+ sql_help_COMMIT,
+ 0},
+
+ {"COMMIT PREPARED",
+ N_("commit a transaction that was earlier prepared for two-phase commit"),
+ "sql-commit-prepared",
+ sql_help_COMMIT_PREPARED,
+ 0},
+
+ {"COPY",
+ N_("copy data between a file and a table"),
+ "sql-copy",
+ sql_help_COPY,
+ 22},
+
+ {"CREATE ACCESS METHOD",
+ N_("define a new access method"),
+ "sql-create-access-method",
+ sql_help_CREATE_ACCESS_METHOD,
+ 2},
+
+ {"CREATE AGGREGATE",
+ N_("define a new aggregate function"),
+ "sql-createaggregate",
+ sql_help_CREATE_AGGREGATE,
+ 59},
+
+ {"CREATE CAST",
+ N_("define a new cast"),
+ "sql-createcast",
+ sql_help_CREATE_CAST,
+ 10},
+
+ {"CREATE COLLATION",
+ N_("define a new collation"),
+ "sql-createcollation",
+ sql_help_CREATE_COLLATION,
+ 9},
+
+ {"CREATE CONVERSION",
+ N_("define a new encoding conversion"),
+ "sql-createconversion",
+ sql_help_CREATE_CONVERSION,
+ 1},
+
+ {"CREATE DATABASE",
+ N_("create a new database"),
+ "sql-createdatabase",
+ sql_help_CREATE_DATABASE,
+ 16},
+
+ {"CREATE DOMAIN",
+ N_("define a new domain"),
+ "sql-createdomain",
+ sql_help_CREATE_DOMAIN,
+ 8},
+
+ {"CREATE EVENT TRIGGER",
+ N_("define a new event trigger"),
+ "sql-createeventtrigger",
+ sql_help_CREATE_EVENT_TRIGGER,
+ 3},
+
+ {"CREATE EXTENSION",
+ N_("install an extension"),
+ "sql-createextension",
+ sql_help_CREATE_EXTENSION,
+ 3},
+
+ {"CREATE FOREIGN DATA WRAPPER",
+ N_("define a new foreign-data wrapper"),
+ "sql-createforeigndatawrapper",
+ sql_help_CREATE_FOREIGN_DATA_WRAPPER,
+ 3},
+
+ {"CREATE FOREIGN TABLE",
+ N_("define a new foreign table"),
+ "sql-createforeigntable",
+ sql_help_CREATE_FOREIGN_TABLE,
+ 38},
+
+ {"CREATE FUNCTION",
+ N_("define a new function"),
+ "sql-createfunction",
+ sql_help_CREATE_FUNCTION,
+ 19},
+
+ {"CREATE GROUP",
+ N_("define a new database role"),
+ "sql-creategroup",
+ sql_help_CREATE_GROUP,
+ 19},
+
+ {"CREATE INDEX",
+ N_("define a new index"),
+ "sql-createindex",
+ sql_help_CREATE_INDEX,
+ 6},
+
+ {"CREATE LANGUAGE",
+ N_("define a new procedural language"),
+ "sql-createlanguage",
+ sql_help_CREATE_LANGUAGE,
+ 2},
+
+ {"CREATE MATERIALIZED VIEW",
+ N_("define a new materialized view"),
+ "sql-creatematerializedview",
+ sql_help_CREATE_MATERIALIZED_VIEW,
+ 6},
+
+ {"CREATE OPERATOR",
+ N_("define a new operator"),
+ "sql-createoperator",
+ sql_help_CREATE_OPERATOR,
+ 6},
+
+ {"CREATE OPERATOR CLASS",
+ N_("define a new operator class"),
+ "sql-createopclass",
+ sql_help_CREATE_OPERATOR_CLASS,
+ 5},
+
+ {"CREATE OPERATOR FAMILY",
+ N_("define a new operator family"),
+ "sql-createopfamily",
+ sql_help_CREATE_OPERATOR_FAMILY,
+ 0},
+
+ {"CREATE POLICY",
+ N_("define a new row-level security policy for a table"),
+ "sql-createpolicy",
+ sql_help_CREATE_POLICY,
+ 5},
+
+ {"CREATE PROCEDURE",
+ N_("define a new procedure"),
+ "sql-createprocedure",
+ sql_help_CREATE_PROCEDURE,
+ 9},
+
+ {"CREATE PUBLICATION",
+ N_("define a new publication"),
+ "sql-createpublication",
+ sql_help_CREATE_PUBLICATION,
+ 8},
+
+ {"CREATE ROLE",
+ N_("define a new database role"),
+ "sql-createrole",
+ sql_help_CREATE_ROLE,
+ 19},
+
+ {"CREATE RULE",
+ N_("define a new rewrite rule"),
+ "sql-createrule",
+ sql_help_CREATE_RULE,
+ 6},
+
+ {"CREATE SCHEMA",
+ N_("define a new schema"),
+ "sql-createschema",
+ sql_help_CREATE_SCHEMA,
+ 10},
+
+ {"CREATE SEQUENCE",
+ N_("define a new sequence generator"),
+ "sql-createsequence",
+ sql_help_CREATE_SEQUENCE,
+ 5},
+
+ {"CREATE SERVER",
+ N_("define a new foreign server"),
+ "sql-createserver",
+ sql_help_CREATE_SERVER,
+ 2},
+
+ {"CREATE STATISTICS",
+ N_("define extended statistics"),
+ "sql-createstatistics",
+ sql_help_CREATE_STATISTICS,
+ 7},
+
+ {"CREATE SUBSCRIPTION",
+ N_("define a new subscription"),
+ "sql-createsubscription",
+ sql_help_CREATE_SUBSCRIPTION,
+ 3},
+
+ {"CREATE TABLE",
+ N_("define a new table"),
+ "sql-createtable",
+ sql_help_CREATE_TABLE,
+ 87},
+
+ {"CREATE TABLE AS",
+ N_("define a new table from the results of a query"),
+ "sql-createtableas",
+ sql_help_CREATE_TABLE_AS,
+ 7},
+
+ {"CREATE TABLESPACE",
+ N_("define a new tablespace"),
+ "sql-createtablespace",
+ sql_help_CREATE_TABLESPACE,
+ 3},
+
+ {"CREATE TEXT SEARCH CONFIGURATION",
+ N_("define a new text search configuration"),
+ "sql-createtsconfig",
+ sql_help_CREATE_TEXT_SEARCH_CONFIGURATION,
+ 3},
+
+ {"CREATE TEXT SEARCH DICTIONARY",
+ N_("define a new text search dictionary"),
+ "sql-createtsdictionary",
+ sql_help_CREATE_TEXT_SEARCH_DICTIONARY,
+ 3},
+
+ {"CREATE TEXT SEARCH PARSER",
+ N_("define a new text search parser"),
+ "sql-createtsparser",
+ sql_help_CREATE_TEXT_SEARCH_PARSER,
+ 6},
+
+ {"CREATE TEXT SEARCH TEMPLATE",
+ N_("define a new text search template"),
+ "sql-createtstemplate",
+ sql_help_CREATE_TEXT_SEARCH_TEMPLATE,
+ 3},
+
+ {"CREATE TRANSFORM",
+ N_("define a new transform"),
+ "sql-createtransform",
+ sql_help_CREATE_TRANSFORM,
+ 3},
+
+ {"CREATE TRIGGER",
+ N_("define a new trigger"),
+ "sql-createtrigger",
+ sql_help_CREATE_TRIGGER,
+ 14},
+
+ {"CREATE TYPE",
+ N_("define a new data type"),
+ "sql-createtype",
+ sql_help_CREATE_TYPE,
+ 37},
+
+ {"CREATE USER",
+ N_("define a new database role"),
+ "sql-createuser",
+ sql_help_CREATE_USER,
+ 19},
+
+ {"CREATE USER MAPPING",
+ N_("define a new mapping of a user to a foreign server"),
+ "sql-createusermapping",
+ sql_help_CREATE_USER_MAPPING,
+ 2},
+
+ {"CREATE VIEW",
+ N_("define a new view"),
+ "sql-createview",
+ sql_help_CREATE_VIEW,
+ 3},
+
+ {"DEALLOCATE",
+ N_("deallocate a prepared statement"),
+ "sql-deallocate",
+ sql_help_DEALLOCATE,
+ 0},
+
+ {"DECLARE",
+ N_("define a cursor"),
+ "sql-declare",
+ sql_help_DECLARE,
+ 1},
+
+ {"DELETE",
+ N_("delete rows of a table"),
+ "sql-delete",
+ sql_help_DELETE,
+ 4},
+
+ {"DISCARD",
+ N_("discard session state"),
+ "sql-discard",
+ sql_help_DISCARD,
+ 0},
+
+ {"DO",
+ N_("execute an anonymous code block"),
+ "sql-do",
+ sql_help_DO,
+ 0},
+
+ {"DROP ACCESS METHOD",
+ N_("remove an access method"),
+ "sql-drop-access-method",
+ sql_help_DROP_ACCESS_METHOD,
+ 0},
+
+ {"DROP AGGREGATE",
+ N_("remove an aggregate function"),
+ "sql-dropaggregate",
+ sql_help_DROP_AGGREGATE,
+ 6},
+
+ {"DROP CAST",
+ N_("remove a cast"),
+ "sql-dropcast",
+ sql_help_DROP_CAST,
+ 0},
+
+ {"DROP COLLATION",
+ N_("remove a collation"),
+ "sql-dropcollation",
+ sql_help_DROP_COLLATION,
+ 0},
+
+ {"DROP CONVERSION",
+ N_("remove a conversion"),
+ "sql-dropconversion",
+ sql_help_DROP_CONVERSION,
+ 0},
+
+ {"DROP DATABASE",
+ N_("remove a database"),
+ "sql-dropdatabase",
+ sql_help_DROP_DATABASE,
+ 4},
+
+ {"DROP DOMAIN",
+ N_("remove a domain"),
+ "sql-dropdomain",
+ sql_help_DROP_DOMAIN,
+ 0},
+
+ {"DROP EVENT TRIGGER",
+ N_("remove an event trigger"),
+ "sql-dropeventtrigger",
+ sql_help_DROP_EVENT_TRIGGER,
+ 0},
+
+ {"DROP EXTENSION",
+ N_("remove an extension"),
+ "sql-dropextension",
+ sql_help_DROP_EXTENSION,
+ 0},
+
+ {"DROP FOREIGN DATA WRAPPER",
+ N_("remove a foreign-data wrapper"),
+ "sql-dropforeigndatawrapper",
+ sql_help_DROP_FOREIGN_DATA_WRAPPER,
+ 0},
+
+ {"DROP FOREIGN TABLE",
+ N_("remove a foreign table"),
+ "sql-dropforeigntable",
+ sql_help_DROP_FOREIGN_TABLE,
+ 0},
+
+ {"DROP FUNCTION",
+ N_("remove a function"),
+ "sql-dropfunction",
+ sql_help_DROP_FUNCTION,
+ 1},
+
+ {"DROP GROUP",
+ N_("remove a database role"),
+ "sql-dropgroup",
+ sql_help_DROP_GROUP,
+ 0},
+
+ {"DROP INDEX",
+ N_("remove an index"),
+ "sql-dropindex",
+ sql_help_DROP_INDEX,
+ 0},
+
+ {"DROP LANGUAGE",
+ N_("remove a procedural language"),
+ "sql-droplanguage",
+ sql_help_DROP_LANGUAGE,
+ 0},
+
+ {"DROP MATERIALIZED VIEW",
+ N_("remove a materialized view"),
+ "sql-dropmaterializedview",
+ sql_help_DROP_MATERIALIZED_VIEW,
+ 0},
+
+ {"DROP OPERATOR",
+ N_("remove an operator"),
+ "sql-dropoperator",
+ sql_help_DROP_OPERATOR,
+ 0},
+
+ {"DROP OPERATOR CLASS",
+ N_("remove an operator class"),
+ "sql-dropopclass",
+ sql_help_DROP_OPERATOR_CLASS,
+ 0},
+
+ {"DROP OPERATOR FAMILY",
+ N_("remove an operator family"),
+ "sql-dropopfamily",
+ sql_help_DROP_OPERATOR_FAMILY,
+ 0},
+
+ {"DROP OWNED",
+ N_("remove database objects owned by a database role"),
+ "sql-drop-owned",
+ sql_help_DROP_OWNED,
+ 0},
+
+ {"DROP POLICY",
+ N_("remove a row-level security policy from a table"),
+ "sql-droppolicy",
+ sql_help_DROP_POLICY,
+ 0},
+
+ {"DROP PROCEDURE",
+ N_("remove a procedure"),
+ "sql-dropprocedure",
+ sql_help_DROP_PROCEDURE,
+ 1},
+
+ {"DROP PUBLICATION",
+ N_("remove a publication"),
+ "sql-droppublication",
+ sql_help_DROP_PUBLICATION,
+ 0},
+
+ {"DROP ROLE",
+ N_("remove a database role"),
+ "sql-droprole",
+ sql_help_DROP_ROLE,
+ 0},
+
+ {"DROP ROUTINE",
+ N_("remove a routine"),
+ "sql-droproutine",
+ sql_help_DROP_ROUTINE,
+ 1},
+
+ {"DROP RULE",
+ N_("remove a rewrite rule"),
+ "sql-droprule",
+ sql_help_DROP_RULE,
+ 0},
+
+ {"DROP SCHEMA",
+ N_("remove a schema"),
+ "sql-dropschema",
+ sql_help_DROP_SCHEMA,
+ 0},
+
+ {"DROP SEQUENCE",
+ N_("remove a sequence"),
+ "sql-dropsequence",
+ sql_help_DROP_SEQUENCE,
+ 0},
+
+ {"DROP SERVER",
+ N_("remove a foreign server descriptor"),
+ "sql-dropserver",
+ sql_help_DROP_SERVER,
+ 0},
+
+ {"DROP STATISTICS",
+ N_("remove extended statistics"),
+ "sql-dropstatistics",
+ sql_help_DROP_STATISTICS,
+ 0},
+
+ {"DROP SUBSCRIPTION",
+ N_("remove a subscription"),
+ "sql-dropsubscription",
+ sql_help_DROP_SUBSCRIPTION,
+ 0},
+
+ {"DROP TABLE",
+ N_("remove a table"),
+ "sql-droptable",
+ sql_help_DROP_TABLE,
+ 0},
+
+ {"DROP TABLESPACE",
+ N_("remove a tablespace"),
+ "sql-droptablespace",
+ sql_help_DROP_TABLESPACE,
+ 0},
+
+ {"DROP TEXT SEARCH CONFIGURATION",
+ N_("remove a text search configuration"),
+ "sql-droptsconfig",
+ sql_help_DROP_TEXT_SEARCH_CONFIGURATION,
+ 0},
+
+ {"DROP TEXT SEARCH DICTIONARY",
+ N_("remove a text search dictionary"),
+ "sql-droptsdictionary",
+ sql_help_DROP_TEXT_SEARCH_DICTIONARY,
+ 0},
+
+ {"DROP TEXT SEARCH PARSER",
+ N_("remove a text search parser"),
+ "sql-droptsparser",
+ sql_help_DROP_TEXT_SEARCH_PARSER,
+ 0},
+
+ {"DROP TEXT SEARCH TEMPLATE",
+ N_("remove a text search template"),
+ "sql-droptstemplate",
+ sql_help_DROP_TEXT_SEARCH_TEMPLATE,
+ 0},
+
+ {"DROP TRANSFORM",
+ N_("remove a transform"),
+ "sql-droptransform",
+ sql_help_DROP_TRANSFORM,
+ 0},
+
+ {"DROP TRIGGER",
+ N_("remove a trigger"),
+ "sql-droptrigger",
+ sql_help_DROP_TRIGGER,
+ 0},
+
+ {"DROP TYPE",
+ N_("remove a data type"),
+ "sql-droptype",
+ sql_help_DROP_TYPE,
+ 0},
+
+ {"DROP USER",
+ N_("remove a database role"),
+ "sql-dropuser",
+ sql_help_DROP_USER,
+ 0},
+
+ {"DROP USER MAPPING",
+ N_("remove a user mapping for a foreign server"),
+ "sql-dropusermapping",
+ sql_help_DROP_USER_MAPPING,
+ 0},
+
+ {"DROP VIEW",
+ N_("remove a view"),
+ "sql-dropview",
+ sql_help_DROP_VIEW,
+ 0},
+
+ {"END",
+ N_("commit the current transaction"),
+ "sql-end",
+ sql_help_END,
+ 0},
+
+ {"EXECUTE",
+ N_("execute a prepared statement"),
+ "sql-execute",
+ sql_help_EXECUTE,
+ 0},
+
+ {"EXPLAIN",
+ N_("show the execution plan of a statement"),
+ "sql-explain",
+ sql_help_EXPLAIN,
+ 14},
+
+ {"FETCH",
+ N_("retrieve rows from a query using a cursor"),
+ "sql-fetch",
+ sql_help_FETCH,
+ 17},
+
+ {"GRANT",
+ N_("define access privileges"),
+ "sql-grant",
+ sql_help_GRANT,
+ 86},
+
+ {"IMPORT FOREIGN SCHEMA",
+ N_("import table definitions from a foreign server"),
+ "sql-importforeignschema",
+ sql_help_IMPORT_FOREIGN_SCHEMA,
+ 4},
+
+ {"INSERT",
+ N_("create new rows in a table"),
+ "sql-insert",
+ sql_help_INSERT,
+ 19},
+
+ {"LISTEN",
+ N_("listen for a notification"),
+ "sql-listen",
+ sql_help_LISTEN,
+ 0},
+
+ {"LOAD",
+ N_("load a shared library file"),
+ "sql-load",
+ sql_help_LOAD,
+ 0},
+
+ {"LOCK",
+ N_("lock a table"),
+ "sql-lock",
+ sql_help_LOCK,
+ 5},
+
+ {"MERGE",
+ N_("conditionally insert, update, or delete rows of a table"),
+ "sql-merge",
+ sql_help_MERGE,
+ 27},
+
+ {"MOVE",
+ N_("position a cursor"),
+ "sql-move",
+ sql_help_MOVE,
+ 17},
+
+ {"NOTIFY",
+ N_("generate a notification"),
+ "sql-notify",
+ sql_help_NOTIFY,
+ 0},
+
+ {"PREPARE",
+ N_("prepare a statement for execution"),
+ "sql-prepare",
+ sql_help_PREPARE,
+ 0},
+
+ {"PREPARE TRANSACTION",
+ N_("prepare the current transaction for two-phase commit"),
+ "sql-prepare-transaction",
+ sql_help_PREPARE_TRANSACTION,
+ 0},
+
+ {"REASSIGN OWNED",
+ N_("change the ownership of database objects owned by a database role"),
+ "sql-reassign-owned",
+ sql_help_REASSIGN_OWNED,
+ 1},
+
+ {"REFRESH MATERIALIZED VIEW",
+ N_("replace the contents of a materialized view"),
+ "sql-refreshmaterializedview",
+ sql_help_REFRESH_MATERIALIZED_VIEW,
+ 1},
+
+ {"REINDEX",
+ N_("rebuild indexes"),
+ "sql-reindex",
+ sql_help_REINDEX,
+ 7},
+
+ {"RELEASE SAVEPOINT",
+ N_("release a previously defined savepoint"),
+ "sql-release-savepoint",
+ sql_help_RELEASE_SAVEPOINT,
+ 0},
+
+ {"RESET",
+ N_("restore the value of a run-time parameter to the default value"),
+ "sql-reset",
+ sql_help_RESET,
+ 1},
+
+ {"REVOKE",
+ N_("remove access privileges"),
+ "sql-revoke",
+ sql_help_REVOKE,
+ 115},
+
+ {"ROLLBACK",
+ N_("abort the current transaction"),
+ "sql-rollback",
+ sql_help_ROLLBACK,
+ 0},
+
+ {"ROLLBACK PREPARED",
+ N_("cancel a transaction that was earlier prepared for two-phase commit"),
+ "sql-rollback-prepared",
+ sql_help_ROLLBACK_PREPARED,
+ 0},
+
+ {"ROLLBACK TO SAVEPOINT",
+ N_("roll back to a savepoint"),
+ "sql-rollback-to",
+ sql_help_ROLLBACK_TO_SAVEPOINT,
+ 0},
+
+ {"SAVEPOINT",
+ N_("define a new savepoint within the current transaction"),
+ "sql-savepoint",
+ sql_help_SAVEPOINT,
+ 0},
+
+ {"SECURITY LABEL",
+ N_("define or change a security label applied to an object"),
+ "sql-security-label",
+ sql_help_SECURITY_LABEL,
+ 29},
+
+ {"SELECT",
+ N_("retrieve rows from a table or view"),
+ "sql-select",
+ sql_help_SELECT,
+ 46},
+
+ {"SELECT INTO",
+ N_("define a new table from the results of a query"),
+ "sql-selectinto",
+ sql_help_SELECT_INTO,
+ 14},
+
+ {"SET",
+ N_("change a run-time parameter"),
+ "sql-set",
+ sql_help_SET,
+ 1},
+
+ {"SET CONSTRAINTS",
+ N_("set constraint check timing for the current transaction"),
+ "sql-set-constraints",
+ sql_help_SET_CONSTRAINTS,
+ 0},
+
+ {"SET ROLE",
+ N_("set the current user identifier of the current session"),
+ "sql-set-role",
+ sql_help_SET_ROLE,
+ 2},
+
+ {"SET SESSION AUTHORIZATION",
+ N_("set the session user identifier and the current user identifier of the current session"),
+ "sql-set-session-authorization",
+ sql_help_SET_SESSION_AUTHORIZATION,
+ 2},
+
+ {"SET TRANSACTION",
+ N_("set the characteristics of the current transaction"),
+ "sql-set-transaction",
+ sql_help_SET_TRANSACTION,
+ 8},
+
+ {"SHOW",
+ N_("show the value of a run-time parameter"),
+ "sql-show",
+ sql_help_SHOW,
+ 1},
+
+ {"START TRANSACTION",
+ N_("start a transaction block"),
+ "sql-start-transaction",
+ sql_help_START_TRANSACTION,
+ 6},
+
+ {"TABLE",
+ N_("retrieve rows from a table or view"),
+ "sql-select",
+ sql_help_TABLE,
+ 46},
+
+ {"TRUNCATE",
+ N_("empty a table or set of tables"),
+ "sql-truncate",
+ sql_help_TRUNCATE,
+ 1},
+
+ {"UNLISTEN",
+ N_("stop listening for a notification"),
+ "sql-unlisten",
+ sql_help_UNLISTEN,
+ 0},
+
+ {"UPDATE",
+ N_("update rows of a table"),
+ "sql-update",
+ sql_help_UPDATE,
+ 8},
+
+ {"VACUUM",
+ N_("garbage-collect and optionally analyze a database"),
+ "sql-vacuum",
+ sql_help_VACUUM,
+ 22},
+
+ {"VALUES",
+ N_("compute a set of rows"),
+ "sql-values",
+ sql_help_VALUES,
+ 4},
+
+ {"WITH",
+ N_("retrieve rows from a table or view"),
+ "sql-select",
+ sql_help_WITH,
+ 46},
+
+
+ {NULL, NULL, NULL} /* End of list marker */
+};
diff --git a/src/bin/psql/sql_help.h b/src/bin/psql/sql_help.h
new file mode 100644
index 0000000..3fe499a
--- /dev/null
+++ b/src/bin/psql/sql_help.h
@@ -0,0 +1,30 @@
+/*
+ * *** Do not change this file by hand. It is automatically
+ * *** generated from the DocBook documentation.
+ *
+ * generated by src/bin/psql/create_help.pl
+ *
+ */
+
+#ifndef SQL_HELP
+#define SQL_HELP
+
+#include "pqexpbuffer.h"
+
+struct _helpStruct
+{
+ const char *cmd; /* the command name */
+ const char *help; /* the help associated with it */
+ const char *docbook_id; /* DocBook XML id (for generating URL) */
+ void (*syntaxfunc) (PQExpBuffer); /* function that prints the
+ * syntax associated with it */
+ int nl_count; /* number of newlines in syntax (for pager) */
+};
+
+extern const struct _helpStruct QL_HELP[];
+
+#define QL_HELP_COUNT 185 /* number of help items */
+#define QL_MAX_CMD_LEN 32 /* largest strlen(cmd) */
+
+
+#endif /* SQL_HELP */
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
new file mode 100644
index 0000000..5a28b6f
--- /dev/null
+++ b/src/bin/psql/startup.c
@@ -0,0 +1,1268 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/startup.c
+ */
+#include "postgres_fe.h"
+
+#ifndef WIN32
+#include <unistd.h>
+#else /* WIN32 */
+#include <io.h>
+#include <win32.h>
+#endif /* WIN32 */
+
+#include "command.h"
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "describe.h"
+#include "fe_utils/print.h"
+#include "getopt_long.h"
+#include "help.h"
+#include "input.h"
+#include "mainloop.h"
+#include "settings.h"
+
+/*
+ * Global psql options
+ */
+PsqlSettings pset;
+
+#ifndef WIN32
+#define SYSPSQLRC "psqlrc"
+#define PSQLRC ".psqlrc"
+#else
+#define SYSPSQLRC "psqlrc"
+#define PSQLRC "psqlrc.conf"
+#endif
+
+/*
+ * Structures to pass information between the option parsing routine
+ * and the main function
+ */
+enum _actions
+{
+ ACT_SINGLE_QUERY,
+ ACT_SINGLE_SLASH,
+ ACT_FILE
+};
+
+typedef struct SimpleActionListCell
+{
+ struct SimpleActionListCell *next;
+ enum _actions action;
+ char *val;
+} SimpleActionListCell;
+
+typedef struct SimpleActionList
+{
+ SimpleActionListCell *head;
+ SimpleActionListCell *tail;
+} SimpleActionList;
+
+struct adhoc_opts
+{
+ char *dbname;
+ char *host;
+ char *port;
+ char *username;
+ char *logfilename;
+ bool no_readline;
+ bool no_psqlrc;
+ bool single_txn;
+ bool list_dbs;
+ SimpleActionList actions;
+};
+
+static void parse_psql_options(int argc, char *argv[],
+ struct adhoc_opts *options);
+static void simple_action_list_append(SimpleActionList *list,
+ enum _actions action, const char *val);
+static void process_psqlrc(char *argv0);
+static void process_psqlrc_file(char *filename);
+static void showVersion(void);
+static void EstablishVariableSpace(void);
+
+#define NOPAGER 0
+
+static void
+log_pre_callback(void)
+{
+ if (pset.queryFout && pset.queryFout != stdout)
+ fflush(pset.queryFout);
+}
+
+static void
+log_locus_callback(const char **filename, uint64 *lineno)
+{
+ if (pset.inputfile)
+ {
+ *filename = pset.inputfile;
+ *lineno = pset.lineno;
+ }
+ else
+ {
+ *filename = NULL;
+ *lineno = 0;
+ }
+}
+
+#ifndef WIN32
+static void
+empty_signal_handler(SIGNAL_ARGS)
+{
+}
+#endif
+
+/*
+ *
+ * main
+ *
+ */
+int
+main(int argc, char *argv[])
+{
+ struct adhoc_opts options;
+ int successResult;
+ char *password = NULL;
+ bool new_pass;
+
+ pg_logging_init(argv[0]);
+ pg_logging_set_pre_callback(log_pre_callback);
+ pg_logging_set_locus_callback(log_locus_callback);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql"));
+
+ if (argc > 1)
+ {
+ if ((strcmp(argv[1], "-?") == 0) || (argc == 2 && (strcmp(argv[1], "--help") == 0)))
+ {
+ usage(NOPAGER);
+ exit(EXIT_SUCCESS);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ showVersion();
+ exit(EXIT_SUCCESS);
+ }
+ }
+
+ pset.progname = get_progname(argv[0]);
+
+ pset.db = NULL;
+ pset.dead_conn = NULL;
+ setDecimalLocale();
+ pset.encoding = PQenv2encoding();
+ pset.queryFout = stdout;
+ pset.queryFoutPipe = false;
+ pset.copyStream = NULL;
+ pset.last_error_result = NULL;
+ pset.cur_cmd_source = stdin;
+ pset.cur_cmd_interactive = false;
+
+ /* We rely on unmentioned fields of pset.popt to start out 0/false/NULL */
+ pset.popt.topt.format = PRINT_ALIGNED;
+ pset.popt.topt.border = 1;
+ pset.popt.topt.pager = 1;
+ pset.popt.topt.pager_min_lines = 0;
+ pset.popt.topt.start_table = true;
+ pset.popt.topt.stop_table = true;
+ pset.popt.topt.default_footer = true;
+
+ pset.popt.topt.csvFieldSep[0] = DEFAULT_CSV_FIELD_SEP;
+ pset.popt.topt.csvFieldSep[1] = '\0';
+
+ pset.popt.topt.unicode_border_linestyle = UNICODE_LINESTYLE_SINGLE;
+ pset.popt.topt.unicode_column_linestyle = UNICODE_LINESTYLE_SINGLE;
+ pset.popt.topt.unicode_header_linestyle = UNICODE_LINESTYLE_SINGLE;
+
+ refresh_utf8format(&(pset.popt.topt));
+
+ /* We must get COLUMNS here before readline() sets it */
+ pset.popt.topt.env_columns = getenv("COLUMNS") ? atoi(getenv("COLUMNS")) : 0;
+
+ pset.notty = (!isatty(fileno(stdin)) || !isatty(fileno(stdout)));
+
+ pset.getPassword = TRI_DEFAULT;
+
+ EstablishVariableSpace();
+
+ /* Create variables showing psql version number */
+ SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
+ SetVariable(pset.vars, "VERSION_NAME", PG_VERSION);
+ SetVariable(pset.vars, "VERSION_NUM", CppAsString2(PG_VERSION_NUM));
+
+ /* Initialize variables for last error */
+ SetVariable(pset.vars, "LAST_ERROR_MESSAGE", "");
+ SetVariable(pset.vars, "LAST_ERROR_SQLSTATE", "00000");
+
+ /* Default values for variables (that don't match the result of \unset) */
+ SetVariableBool(pset.vars, "AUTOCOMMIT");
+ SetVariable(pset.vars, "PROMPT1", DEFAULT_PROMPT1);
+ SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2);
+ SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3);
+ SetVariableBool(pset.vars, "SHOW_ALL_RESULTS");
+
+ parse_psql_options(argc, argv, &options);
+
+ /*
+ * If no action was specified and we're in non-interactive mode, treat it
+ * as if the user had specified "-f -". This lets single-transaction mode
+ * work in this case.
+ */
+ if (options.actions.head == NULL && pset.notty)
+ simple_action_list_append(&options.actions, ACT_FILE, NULL);
+
+ /* Bail out if -1 was specified but will be ignored. */
+ if (options.single_txn && options.actions.head == NULL)
+ pg_fatal("-1 can only be used in non-interactive mode");
+
+ if (!pset.popt.topt.fieldSep.separator &&
+ !pset.popt.topt.fieldSep.separator_zero)
+ {
+ pset.popt.topt.fieldSep.separator = pg_strdup(DEFAULT_FIELD_SEP);
+ pset.popt.topt.fieldSep.separator_zero = false;
+ }
+ if (!pset.popt.topt.recordSep.separator &&
+ !pset.popt.topt.recordSep.separator_zero)
+ {
+ pset.popt.topt.recordSep.separator = pg_strdup(DEFAULT_RECORD_SEP);
+ pset.popt.topt.recordSep.separator_zero = false;
+ }
+
+ if (pset.getPassword == TRI_YES)
+ {
+ /*
+ * We can't be sure yet of the username that will be used, so don't
+ * offer a potentially wrong one. Typical uses of this option are
+ * noninteractive anyway. (Note: since we've not yet set up our
+ * cancel handler, there's no need to use simple_prompt_extended.)
+ */
+ password = simple_prompt("Password: ", false);
+ }
+
+ /* loop until we have a password if requested by backend */
+ do
+ {
+#define PARAMS_ARRAY_SIZE 8
+ const char **keywords = pg_malloc_array(const char *, PARAMS_ARRAY_SIZE);
+ const char **values = pg_malloc_array(const char *, PARAMS_ARRAY_SIZE);
+
+ keywords[0] = "host";
+ values[0] = options.host;
+ keywords[1] = "port";
+ values[1] = options.port;
+ keywords[2] = "user";
+ values[2] = options.username;
+ keywords[3] = "password";
+ values[3] = password;
+ keywords[4] = "dbname"; /* see do_connect() */
+ values[4] = (options.list_dbs && options.dbname == NULL) ?
+ "postgres" : options.dbname;
+ keywords[5] = "fallback_application_name";
+ values[5] = pset.progname;
+ keywords[6] = "client_encoding";
+ values[6] = (pset.notty || getenv("PGCLIENTENCODING")) ? NULL : "auto";
+ keywords[7] = NULL;
+ values[7] = NULL;
+
+ new_pass = false;
+ pset.db = PQconnectdbParams(keywords, values, true);
+ free(keywords);
+ free(values);
+
+ if (PQstatus(pset.db) == CONNECTION_BAD &&
+ PQconnectionNeedsPassword(pset.db) &&
+ !password &&
+ pset.getPassword != TRI_NO)
+ {
+ /*
+ * Before closing the old PGconn, extract the user name that was
+ * actually connected with --- it might've come out of a URI or
+ * connstring "database name" rather than options.username.
+ */
+ const char *realusername = PQuser(pset.db);
+ char *password_prompt;
+
+ if (realusername && realusername[0])
+ password_prompt = psprintf(_("Password for user %s: "),
+ realusername);
+ else
+ password_prompt = pg_strdup(_("Password: "));
+ PQfinish(pset.db);
+
+ password = simple_prompt(password_prompt, false);
+ free(password_prompt);
+ new_pass = true;
+ }
+ } while (new_pass);
+
+ if (PQstatus(pset.db) == CONNECTION_BAD)
+ {
+ pg_log_error("%s", PQerrorMessage(pset.db));
+ PQfinish(pset.db);
+ exit(EXIT_BADCONN);
+ }
+
+ psql_setup_cancel_handler();
+
+#ifndef WIN32
+
+ /*
+ * do_watch() needs signal handlers installed (otherwise sigwait() will
+ * filter them out on some platforms), but doesn't need them to do
+ * anything, and they shouldn't ever run (unless perhaps a stray SIGALRM
+ * arrives due to a race when do_watch() cancels an itimer).
+ */
+ pqsignal(SIGCHLD, empty_signal_handler);
+ pqsignal(SIGALRM, empty_signal_handler);
+#endif
+
+ PQsetNoticeProcessor(pset.db, NoticeProcessor, NULL);
+
+ SyncVariables();
+
+ if (options.list_dbs)
+ {
+ int success;
+
+ if (!options.no_psqlrc)
+ process_psqlrc(argv[0]);
+
+ success = listAllDbs(NULL, false);
+ PQfinish(pset.db);
+ exit(success ? EXIT_SUCCESS : EXIT_FAILURE);
+ }
+
+ if (options.logfilename)
+ {
+ pset.logfile = fopen(options.logfilename, "a");
+ if (!pset.logfile)
+ pg_fatal("could not open log file \"%s\": %m",
+ options.logfilename);
+ }
+
+ if (!options.no_psqlrc)
+ process_psqlrc(argv[0]);
+
+ /*
+ * If any actions were given by user, process them in the order in which
+ * they were specified. Note single_txn is only effective in this mode.
+ */
+ if (options.actions.head != NULL)
+ {
+ PGresult *res;
+ SimpleActionListCell *cell;
+
+ successResult = EXIT_SUCCESS; /* silence compiler */
+
+ if (options.single_txn)
+ {
+ if ((res = PSQLexec("BEGIN")) == NULL)
+ {
+ if (pset.on_error_stop)
+ {
+ successResult = EXIT_USER;
+ goto error;
+ }
+ }
+ else
+ PQclear(res);
+ }
+
+ for (cell = options.actions.head; cell; cell = cell->next)
+ {
+ if (cell->action == ACT_SINGLE_QUERY)
+ {
+ pg_logging_config(PG_LOG_FLAG_TERSE);
+
+ if (pset.echo == PSQL_ECHO_ALL)
+ puts(cell->val);
+
+ successResult = SendQuery(cell->val)
+ ? EXIT_SUCCESS : EXIT_FAILURE;
+ }
+ else if (cell->action == ACT_SINGLE_SLASH)
+ {
+ PsqlScanState scan_state;
+ ConditionalStack cond_stack;
+
+ pg_logging_config(PG_LOG_FLAG_TERSE);
+
+ if (pset.echo == PSQL_ECHO_ALL)
+ puts(cell->val);
+
+ scan_state = psql_scan_create(&psqlscan_callbacks);
+ psql_scan_setup(scan_state,
+ cell->val, strlen(cell->val),
+ pset.encoding, standard_strings());
+ cond_stack = conditional_stack_create();
+ psql_scan_set_passthrough(scan_state, (void *) cond_stack);
+
+ successResult = HandleSlashCmds(scan_state,
+ cond_stack,
+ NULL,
+ NULL) != PSQL_CMD_ERROR
+ ? EXIT_SUCCESS : EXIT_FAILURE;
+
+ psql_scan_destroy(scan_state);
+ conditional_stack_destroy(cond_stack);
+ }
+ else if (cell->action == ACT_FILE)
+ {
+ successResult = process_file(cell->val, false);
+ }
+ else
+ {
+ /* should never come here */
+ Assert(false);
+ }
+
+ if (successResult != EXIT_SUCCESS && pset.on_error_stop)
+ break;
+ }
+
+ if (options.single_txn)
+ {
+ /*
+ * Rollback the contents of the single transaction if the caller
+ * has set ON_ERROR_STOP and one of the steps has failed. This
+ * check needs to match the one done a couple of lines above.
+ */
+ res = PSQLexec((successResult != EXIT_SUCCESS && pset.on_error_stop) ?
+ "ROLLBACK" : "COMMIT");
+ if (res == NULL)
+ {
+ if (pset.on_error_stop)
+ {
+ successResult = EXIT_USER;
+ goto error;
+ }
+ }
+ else
+ PQclear(res);
+ }
+
+error:
+ ;
+ }
+
+ /*
+ * or otherwise enter interactive main loop
+ */
+ else
+ {
+ pg_logging_config(PG_LOG_FLAG_TERSE);
+ connection_warnings(true);
+ if (!pset.quiet)
+ printf(_("Type \"help\" for help.\n\n"));
+ initializeInput(options.no_readline ? 0 : 1);
+ successResult = MainLoop(stdin);
+ }
+
+ /* clean up */
+ if (pset.logfile)
+ fclose(pset.logfile);
+ if (pset.db)
+ PQfinish(pset.db);
+ if (pset.dead_conn)
+ PQfinish(pset.dead_conn);
+ setQFout(NULL);
+
+ return successResult;
+}
+
+
+/*
+ * Parse command line options
+ */
+
+static void
+parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
+{
+ static struct option long_options[] =
+ {
+ {"echo-all", no_argument, NULL, 'a'},
+ {"no-align", no_argument, NULL, 'A'},
+ {"command", required_argument, NULL, 'c'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"echo-queries", no_argument, NULL, 'e'},
+ {"echo-errors", no_argument, NULL, 'b'},
+ {"echo-hidden", no_argument, NULL, 'E'},
+ {"file", required_argument, NULL, 'f'},
+ {"field-separator", required_argument, NULL, 'F'},
+ {"field-separator-zero", no_argument, NULL, 'z'},
+ {"host", required_argument, NULL, 'h'},
+ {"html", no_argument, NULL, 'H'},
+ {"list", no_argument, NULL, 'l'},
+ {"log-file", required_argument, NULL, 'L'},
+ {"no-readline", no_argument, NULL, 'n'},
+ {"single-transaction", no_argument, NULL, '1'},
+ {"output", required_argument, NULL, 'o'},
+ {"port", required_argument, NULL, 'p'},
+ {"pset", required_argument, NULL, 'P'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"record-separator", required_argument, NULL, 'R'},
+ {"record-separator-zero", no_argument, NULL, '0'},
+ {"single-step", no_argument, NULL, 's'},
+ {"single-line", no_argument, NULL, 'S'},
+ {"tuples-only", no_argument, NULL, 't'},
+ {"table-attr", required_argument, NULL, 'T'},
+ {"username", required_argument, NULL, 'U'},
+ {"set", required_argument, NULL, 'v'},
+ {"variable", required_argument, NULL, 'v'},
+ {"version", no_argument, NULL, 'V'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"expanded", no_argument, NULL, 'x'},
+ {"no-psqlrc", no_argument, NULL, 'X'},
+ {"help", optional_argument, NULL, 1},
+ {"csv", no_argument, NULL, 2},
+ {NULL, 0, NULL, 0}
+ };
+
+ int optindex;
+ int c;
+
+ memset(options, 0, sizeof *options);
+
+ while ((c = getopt_long(argc, argv, "aAbc:d:eEf:F:h:HlL:no:p:P:qR:sStT:U:v:VwWxXz?01",
+ long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ SetVariable(pset.vars, "ECHO", "all");
+ break;
+ case 'A':
+ pset.popt.topt.format = PRINT_UNALIGNED;
+ break;
+ case 'b':
+ SetVariable(pset.vars, "ECHO", "errors");
+ break;
+ case 'c':
+ if (optarg[0] == '\\')
+ simple_action_list_append(&options->actions,
+ ACT_SINGLE_SLASH,
+ optarg + 1);
+ else
+ simple_action_list_append(&options->actions,
+ ACT_SINGLE_QUERY,
+ optarg);
+ break;
+ case 'd':
+ options->dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ SetVariable(pset.vars, "ECHO", "queries");
+ break;
+ case 'E':
+ SetVariableBool(pset.vars, "ECHO_HIDDEN");
+ break;
+ case 'f':
+ simple_action_list_append(&options->actions,
+ ACT_FILE,
+ optarg);
+ break;
+ case 'F':
+ pset.popt.topt.fieldSep.separator = pg_strdup(optarg);
+ pset.popt.topt.fieldSep.separator_zero = false;
+ break;
+ case 'h':
+ options->host = pg_strdup(optarg);
+ break;
+ case 'H':
+ pset.popt.topt.format = PRINT_HTML;
+ break;
+ case 'l':
+ options->list_dbs = true;
+ break;
+ case 'L':
+ options->logfilename = pg_strdup(optarg);
+ break;
+ case 'n':
+ options->no_readline = true;
+ break;
+ case 'o':
+ if (!setQFout(optarg))
+ exit(EXIT_FAILURE);
+ break;
+ case 'p':
+ options->port = pg_strdup(optarg);
+ break;
+ case 'P':
+ {
+ char *value;
+ char *equal_loc;
+ bool result;
+
+ value = pg_strdup(optarg);
+ equal_loc = strchr(value, '=');
+ if (!equal_loc)
+ result = do_pset(value, NULL, &pset.popt, true);
+ else
+ {
+ *equal_loc = '\0';
+ result = do_pset(value, equal_loc + 1, &pset.popt, true);
+ }
+
+ if (!result)
+ pg_fatal("could not set printing parameter \"%s\"", value);
+
+ free(value);
+ break;
+ }
+ case 'q':
+ SetVariableBool(pset.vars, "QUIET");
+ break;
+ case 'R':
+ pset.popt.topt.recordSep.separator = pg_strdup(optarg);
+ pset.popt.topt.recordSep.separator_zero = false;
+ break;
+ case 's':
+ SetVariableBool(pset.vars, "SINGLESTEP");
+ break;
+ case 'S':
+ SetVariableBool(pset.vars, "SINGLELINE");
+ break;
+ case 't':
+ pset.popt.topt.tuples_only = true;
+ break;
+ case 'T':
+ pset.popt.topt.tableAttr = pg_strdup(optarg);
+ break;
+ case 'U':
+ options->username = pg_strdup(optarg);
+ break;
+ case 'v':
+ {
+ char *value;
+ char *equal_loc;
+
+ value = pg_strdup(optarg);
+ equal_loc = strchr(value, '=');
+ if (!equal_loc)
+ {
+ if (!DeleteVariable(pset.vars, value))
+ exit(EXIT_FAILURE); /* error already printed */
+ }
+ else
+ {
+ *equal_loc = '\0';
+ if (!SetVariable(pset.vars, value, equal_loc + 1))
+ exit(EXIT_FAILURE); /* error already printed */
+ }
+
+ free(value);
+ break;
+ }
+ case 'V':
+ showVersion();
+ exit(EXIT_SUCCESS);
+ case 'w':
+ pset.getPassword = TRI_NO;
+ break;
+ case 'W':
+ pset.getPassword = TRI_YES;
+ break;
+ case 'x':
+ pset.popt.topt.expanded = true;
+ break;
+ case 'X':
+ options->no_psqlrc = true;
+ break;
+ case 'z':
+ pset.popt.topt.fieldSep.separator_zero = true;
+ break;
+ case '0':
+ pset.popt.topt.recordSep.separator_zero = true;
+ break;
+ case '1':
+ options->single_txn = true;
+ break;
+ case '?':
+ if (optind <= argc &&
+ strcmp(argv[optind - 1], "-?") == 0)
+ {
+ /* actual help option given */
+ usage(NOPAGER);
+ exit(EXIT_SUCCESS);
+ }
+ else
+ {
+ /* getopt error (unknown option or missing argument) */
+ goto unknown_option;
+ }
+ break;
+ case 1:
+ {
+ if (!optarg || strcmp(optarg, "options") == 0)
+ usage(NOPAGER);
+ else if (optarg && strcmp(optarg, "commands") == 0)
+ slashUsage(NOPAGER);
+ else if (optarg && strcmp(optarg, "variables") == 0)
+ helpVariables(NOPAGER);
+ else
+ goto unknown_option;
+
+ exit(EXIT_SUCCESS);
+ }
+ break;
+ case 2:
+ pset.popt.topt.format = PRINT_CSV;
+ break;
+ default:
+ unknown_option:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.",
+ pset.progname);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ /*
+ * if we still have arguments, use it as the database name and username
+ */
+ while (argc - optind >= 1)
+ {
+ if (!options->dbname)
+ options->dbname = argv[optind];
+ else if (!options->username)
+ options->username = argv[optind];
+ else if (!pset.quiet)
+ pg_log_warning("extra command-line argument \"%s\" ignored",
+ argv[optind]);
+
+ optind++;
+ }
+}
+
+
+/*
+ * Append a new item to the end of the SimpleActionList.
+ * Note that "val" is copied if it's not NULL.
+ */
+static void
+simple_action_list_append(SimpleActionList *list,
+ enum _actions action, const char *val)
+{
+ SimpleActionListCell *cell;
+
+ cell = pg_malloc_object(SimpleActionListCell);
+
+ cell->next = NULL;
+ cell->action = action;
+ if (val)
+ cell->val = pg_strdup(val);
+ else
+ cell->val = NULL;
+
+ if (list->tail)
+ list->tail->next = cell;
+ else
+ list->head = cell;
+ list->tail = cell;
+}
+
+
+/*
+ * Load .psqlrc file, if found.
+ */
+static void
+process_psqlrc(char *argv0)
+{
+ char home[MAXPGPATH];
+ char rc_file[MAXPGPATH];
+ char my_exec_path[MAXPGPATH];
+ char etc_path[MAXPGPATH];
+ char *envrc = getenv("PSQLRC");
+
+ if (find_my_exec(argv0, my_exec_path) < 0)
+ pg_fatal("could not find own program executable");
+
+ get_etc_path(my_exec_path, etc_path);
+
+ snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
+ process_psqlrc_file(rc_file);
+
+ if (envrc != NULL && strlen(envrc) > 0)
+ {
+ /* might need to free() this */
+ char *envrc_alloc = pstrdup(envrc);
+
+ expand_tilde(&envrc_alloc);
+ process_psqlrc_file(envrc_alloc);
+ }
+ else if (get_home_path(home))
+ {
+ snprintf(rc_file, MAXPGPATH, "%s/%s", home, PSQLRC);
+ process_psqlrc_file(rc_file);
+ }
+}
+
+
+
+static void
+process_psqlrc_file(char *filename)
+{
+ char *psqlrc_minor,
+ *psqlrc_major;
+
+#if defined(WIN32) && (!defined(__MINGW32__))
+#define R_OK 4
+#endif
+
+ psqlrc_minor = psprintf("%s-%s", filename, PG_VERSION);
+ psqlrc_major = psprintf("%s-%s", filename, PG_MAJORVERSION);
+
+ /* check for minor version first, then major, then no version */
+ if (access(psqlrc_minor, R_OK) == 0)
+ (void) process_file(psqlrc_minor, false);
+ else if (access(psqlrc_major, R_OK) == 0)
+ (void) process_file(psqlrc_major, false);
+ else if (access(filename, R_OK) == 0)
+ (void) process_file(filename, false);
+
+ free(psqlrc_minor);
+ free(psqlrc_major);
+}
+
+
+
+/* showVersion
+ *
+ * This output format is intended to match GNU standards.
+ */
+static void
+showVersion(void)
+{
+ puts("psql (PostgreSQL) " PG_VERSION);
+}
+
+
+
+/*
+ * Substitute hooks and assign hooks for psql variables.
+ *
+ * This isn't an amazingly good place for them, but neither is anywhere else.
+ *
+ * By policy, every special variable that controls any psql behavior should
+ * have one or both hooks, even if they're just no-ops. This ensures that
+ * the variable will remain present in variables.c's list even when unset,
+ * which ensures that it's known to tab completion.
+ */
+
+static char *
+bool_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ {
+ /* "\unset FOO" becomes "\set FOO off" */
+ newval = pg_strdup("off");
+ }
+ else if (newval[0] == '\0')
+ {
+ /* "\set FOO" becomes "\set FOO on" */
+ pg_free(newval);
+ newval = pg_strdup("on");
+ }
+ return newval;
+}
+
+static bool
+autocommit_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "AUTOCOMMIT", &pset.autocommit);
+}
+
+static bool
+on_error_stop_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "ON_ERROR_STOP", &pset.on_error_stop);
+}
+
+static bool
+quiet_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "QUIET", &pset.quiet);
+}
+
+static bool
+singleline_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "SINGLELINE", &pset.singleline);
+}
+
+static bool
+singlestep_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "SINGLESTEP", &pset.singlestep);
+}
+
+static char *
+fetch_count_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("0");
+ return newval;
+}
+
+static bool
+fetch_count_hook(const char *newval)
+{
+ return ParseVariableNum(newval, "FETCH_COUNT", &pset.fetch_count);
+}
+
+static bool
+histfile_hook(const char *newval)
+{
+ /*
+ * Someday we might try to validate the filename, but for now, this is
+ * just a placeholder to ensure HISTFILE is known to tab completion.
+ */
+ return true;
+}
+
+static char *
+histsize_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("500");
+ return newval;
+}
+
+static bool
+histsize_hook(const char *newval)
+{
+ return ParseVariableNum(newval, "HISTSIZE", &pset.histsize);
+}
+
+static char *
+ignoreeof_substitute_hook(char *newval)
+{
+ int dummy;
+
+ /*
+ * This tries to mimic the behavior of bash, to wit "If set, the value is
+ * the number of consecutive EOF characters which must be typed as the
+ * first characters on an input line before bash exits. If the variable
+ * exists but does not have a numeric value, or has no value, the default
+ * value is 10. If it does not exist, EOF signifies the end of input to
+ * the shell." Unlike bash, however, we insist on the stored value
+ * actually being a valid integer.
+ */
+ if (newval == NULL)
+ newval = pg_strdup("0");
+ else if (!ParseVariableNum(newval, NULL, &dummy))
+ newval = pg_strdup("10");
+ return newval;
+}
+
+static bool
+ignoreeof_hook(const char *newval)
+{
+ return ParseVariableNum(newval, "IGNOREEOF", &pset.ignoreeof);
+}
+
+static char *
+echo_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("none");
+ return newval;
+}
+
+static bool
+echo_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "queries") == 0)
+ pset.echo = PSQL_ECHO_QUERIES;
+ else if (pg_strcasecmp(newval, "errors") == 0)
+ pset.echo = PSQL_ECHO_ERRORS;
+ else if (pg_strcasecmp(newval, "all") == 0)
+ pset.echo = PSQL_ECHO_ALL;
+ else if (pg_strcasecmp(newval, "none") == 0)
+ pset.echo = PSQL_ECHO_NONE;
+ else
+ {
+ PsqlVarEnumError("ECHO", newval, "none, errors, queries, all");
+ return false;
+ }
+ return true;
+}
+
+static bool
+echo_hidden_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "noexec") == 0)
+ pset.echo_hidden = PSQL_ECHO_HIDDEN_NOEXEC;
+ else
+ {
+ bool on_off;
+
+ if (ParseVariableBool(newval, NULL, &on_off))
+ pset.echo_hidden = on_off ? PSQL_ECHO_HIDDEN_ON : PSQL_ECHO_HIDDEN_OFF;
+ else
+ {
+ PsqlVarEnumError("ECHO_HIDDEN", newval, "on, off, noexec");
+ return false;
+ }
+ }
+ return true;
+}
+
+static bool
+on_error_rollback_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "interactive") == 0)
+ pset.on_error_rollback = PSQL_ERROR_ROLLBACK_INTERACTIVE;
+ else
+ {
+ bool on_off;
+
+ if (ParseVariableBool(newval, NULL, &on_off))
+ pset.on_error_rollback = on_off ? PSQL_ERROR_ROLLBACK_ON : PSQL_ERROR_ROLLBACK_OFF;
+ else
+ {
+ PsqlVarEnumError("ON_ERROR_ROLLBACK", newval, "on, off, interactive");
+ return false;
+ }
+ }
+ return true;
+}
+
+static char *
+comp_keyword_case_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("preserve-upper");
+ return newval;
+}
+
+static bool
+comp_keyword_case_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "preserve-upper") == 0)
+ pset.comp_case = PSQL_COMP_CASE_PRESERVE_UPPER;
+ else if (pg_strcasecmp(newval, "preserve-lower") == 0)
+ pset.comp_case = PSQL_COMP_CASE_PRESERVE_LOWER;
+ else if (pg_strcasecmp(newval, "upper") == 0)
+ pset.comp_case = PSQL_COMP_CASE_UPPER;
+ else if (pg_strcasecmp(newval, "lower") == 0)
+ pset.comp_case = PSQL_COMP_CASE_LOWER;
+ else
+ {
+ PsqlVarEnumError("COMP_KEYWORD_CASE", newval,
+ "lower, upper, preserve-lower, preserve-upper");
+ return false;
+ }
+ return true;
+}
+
+static char *
+histcontrol_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("none");
+ return newval;
+}
+
+static bool
+histcontrol_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "ignorespace") == 0)
+ pset.histcontrol = hctl_ignorespace;
+ else if (pg_strcasecmp(newval, "ignoredups") == 0)
+ pset.histcontrol = hctl_ignoredups;
+ else if (pg_strcasecmp(newval, "ignoreboth") == 0)
+ pset.histcontrol = hctl_ignoreboth;
+ else if (pg_strcasecmp(newval, "none") == 0)
+ pset.histcontrol = hctl_none;
+ else
+ {
+ PsqlVarEnumError("HISTCONTROL", newval,
+ "none, ignorespace, ignoredups, ignoreboth");
+ return false;
+ }
+ return true;
+}
+
+static bool
+prompt1_hook(const char *newval)
+{
+ pset.prompt1 = newval ? newval : "";
+ return true;
+}
+
+static bool
+prompt2_hook(const char *newval)
+{
+ pset.prompt2 = newval ? newval : "";
+ return true;
+}
+
+static bool
+prompt3_hook(const char *newval)
+{
+ pset.prompt3 = newval ? newval : "";
+ return true;
+}
+
+static char *
+verbosity_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("default");
+ return newval;
+}
+
+static bool
+verbosity_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "default") == 0)
+ pset.verbosity = PQERRORS_DEFAULT;
+ else if (pg_strcasecmp(newval, "verbose") == 0)
+ pset.verbosity = PQERRORS_VERBOSE;
+ else if (pg_strcasecmp(newval, "terse") == 0)
+ pset.verbosity = PQERRORS_TERSE;
+ else if (pg_strcasecmp(newval, "sqlstate") == 0)
+ pset.verbosity = PQERRORS_SQLSTATE;
+ else
+ {
+ PsqlVarEnumError("VERBOSITY", newval, "default, verbose, terse, sqlstate");
+ return false;
+ }
+
+ if (pset.db)
+ PQsetErrorVerbosity(pset.db, pset.verbosity);
+ return true;
+}
+
+static bool
+show_all_results_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "SHOW_ALL_RESULTS", &pset.show_all_results);
+}
+
+static char *
+show_context_substitute_hook(char *newval)
+{
+ if (newval == NULL)
+ newval = pg_strdup("errors");
+ return newval;
+}
+
+static bool
+show_context_hook(const char *newval)
+{
+ Assert(newval != NULL); /* else substitute hook messed up */
+ if (pg_strcasecmp(newval, "never") == 0)
+ pset.show_context = PQSHOW_CONTEXT_NEVER;
+ else if (pg_strcasecmp(newval, "errors") == 0)
+ pset.show_context = PQSHOW_CONTEXT_ERRORS;
+ else if (pg_strcasecmp(newval, "always") == 0)
+ pset.show_context = PQSHOW_CONTEXT_ALWAYS;
+ else
+ {
+ PsqlVarEnumError("SHOW_CONTEXT", newval, "never, errors, always");
+ return false;
+ }
+
+ if (pset.db)
+ PQsetErrorContextVisibility(pset.db, pset.show_context);
+ return true;
+}
+
+static bool
+hide_compression_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "HIDE_TOAST_COMPRESSION",
+ &pset.hide_compression);
+}
+
+static bool
+hide_tableam_hook(const char *newval)
+{
+ return ParseVariableBool(newval, "HIDE_TABLEAM", &pset.hide_tableam);
+}
+
+static void
+EstablishVariableSpace(void)
+{
+ pset.vars = CreateVariableSpace();
+
+ SetVariableHooks(pset.vars, "AUTOCOMMIT",
+ bool_substitute_hook,
+ autocommit_hook);
+ SetVariableHooks(pset.vars, "ON_ERROR_STOP",
+ bool_substitute_hook,
+ on_error_stop_hook);
+ SetVariableHooks(pset.vars, "QUIET",
+ bool_substitute_hook,
+ quiet_hook);
+ SetVariableHooks(pset.vars, "SINGLELINE",
+ bool_substitute_hook,
+ singleline_hook);
+ SetVariableHooks(pset.vars, "SINGLESTEP",
+ bool_substitute_hook,
+ singlestep_hook);
+ SetVariableHooks(pset.vars, "FETCH_COUNT",
+ fetch_count_substitute_hook,
+ fetch_count_hook);
+ SetVariableHooks(pset.vars, "HISTFILE",
+ NULL,
+ histfile_hook);
+ SetVariableHooks(pset.vars, "HISTSIZE",
+ histsize_substitute_hook,
+ histsize_hook);
+ SetVariableHooks(pset.vars, "IGNOREEOF",
+ ignoreeof_substitute_hook,
+ ignoreeof_hook);
+ SetVariableHooks(pset.vars, "ECHO",
+ echo_substitute_hook,
+ echo_hook);
+ SetVariableHooks(pset.vars, "ECHO_HIDDEN",
+ bool_substitute_hook,
+ echo_hidden_hook);
+ SetVariableHooks(pset.vars, "ON_ERROR_ROLLBACK",
+ bool_substitute_hook,
+ on_error_rollback_hook);
+ SetVariableHooks(pset.vars, "COMP_KEYWORD_CASE",
+ comp_keyword_case_substitute_hook,
+ comp_keyword_case_hook);
+ SetVariableHooks(pset.vars, "HISTCONTROL",
+ histcontrol_substitute_hook,
+ histcontrol_hook);
+ SetVariableHooks(pset.vars, "PROMPT1",
+ NULL,
+ prompt1_hook);
+ SetVariableHooks(pset.vars, "PROMPT2",
+ NULL,
+ prompt2_hook);
+ SetVariableHooks(pset.vars, "PROMPT3",
+ NULL,
+ prompt3_hook);
+ SetVariableHooks(pset.vars, "VERBOSITY",
+ verbosity_substitute_hook,
+ verbosity_hook);
+ SetVariableHooks(pset.vars, "SHOW_ALL_RESULTS",
+ bool_substitute_hook,
+ show_all_results_hook);
+ SetVariableHooks(pset.vars, "SHOW_CONTEXT",
+ show_context_substitute_hook,
+ show_context_hook);
+ SetVariableHooks(pset.vars, "HIDE_TOAST_COMPRESSION",
+ bool_substitute_hook,
+ hide_compression_hook);
+ SetVariableHooks(pset.vars, "HIDE_TABLEAM",
+ bool_substitute_hook,
+ hide_tableam_hook);
+}
diff --git a/src/bin/psql/stringutils.c b/src/bin/psql/stringutils.c
new file mode 100644
index 0000000..0e91387
--- /dev/null
+++ b/src/bin/psql/stringutils.c
@@ -0,0 +1,342 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/stringutils.c
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "common.h"
+#include "stringutils.h"
+
+
+/*
+ * Replacement for strtok() (a.k.a. poor man's flex)
+ *
+ * Splits a string into tokens, returning one token per call, then NULL
+ * when no more tokens exist in the given string.
+ *
+ * The calling convention is similar to that of strtok, but with more
+ * frammishes.
+ *
+ * s - string to parse, if NULL continue parsing the last string
+ * whitespace - set of whitespace characters that separate tokens
+ * delim - set of non-whitespace separator characters (or NULL)
+ * quote - set of characters that can quote a token (NULL if none)
+ * escape - character that can quote quotes (0 if none)
+ * e_strings - if true, treat E'...' syntax as a valid token
+ * del_quotes - if true, strip quotes from the returned token, else return
+ * it exactly as found in the string
+ * encoding - the active character-set encoding
+ *
+ * Characters in 'delim', if any, will be returned as single-character
+ * tokens unless part of a quoted token.
+ *
+ * Double occurrences of the quoting character are always taken to represent
+ * a single quote character in the data. If escape isn't 0, then escape
+ * followed by anything (except \0) is a data character too.
+ *
+ * The combination of e_strings and del_quotes both true is not currently
+ * handled. This could be fixed but it's not needed anywhere at the moment.
+ *
+ * Note that the string s is _not_ overwritten in this implementation.
+ *
+ * NB: it's okay to vary delim, quote, and escape from one call to the
+ * next on a single source string, but changing whitespace is a bad idea
+ * since you might lose data.
+ */
+char *
+strtokx(const char *s,
+ const char *whitespace,
+ const char *delim,
+ const char *quote,
+ char escape,
+ bool e_strings,
+ bool del_quotes,
+ int encoding)
+{
+ static char *storage = NULL; /* store the local copy of the users
+ * string here */
+ static char *string = NULL; /* pointer into storage where to continue on
+ * next call */
+
+ /* variously abused variables: */
+ unsigned int offset;
+ char *start;
+ char *p;
+
+ if (s)
+ {
+ free(storage);
+
+ /*
+ * We may need extra space to insert delimiter nulls for adjacent
+ * tokens. 2X the space is a gross overestimate, but it's unlikely
+ * that this code will be used on huge strings anyway.
+ */
+ storage = pg_malloc(2 * strlen(s) + 1);
+ strcpy(storage, s);
+ string = storage;
+ }
+
+ if (!storage)
+ return NULL;
+
+ /* skip leading whitespace */
+ offset = strspn(string, whitespace);
+ start = &string[offset];
+
+ /* end of string reached? */
+ if (*start == '\0')
+ {
+ /* technically we don't need to free here, but we're nice */
+ free(storage);
+ storage = NULL;
+ string = NULL;
+ return NULL;
+ }
+
+ /* test if delimiter character */
+ if (delim && strchr(delim, *start))
+ {
+ /*
+ * If not at end of string, we need to insert a null to terminate the
+ * returned token. We can just overwrite the next character if it
+ * happens to be in the whitespace set ... otherwise move over the
+ * rest of the string to make room. (This is why we allocated extra
+ * space above).
+ */
+ p = start + 1;
+ if (*p != '\0')
+ {
+ if (!strchr(whitespace, *p))
+ memmove(p + 1, p, strlen(p) + 1);
+ *p = '\0';
+ string = p + 1;
+ }
+ else
+ {
+ /* at end of string, so no extra work */
+ string = p;
+ }
+
+ return start;
+ }
+
+ /* check for E string */
+ p = start;
+ if (e_strings &&
+ (*p == 'E' || *p == 'e') &&
+ p[1] == '\'')
+ {
+ quote = "'";
+ escape = '\\'; /* if std strings before, not any more */
+ p++;
+ }
+
+ /* test if quoting character */
+ if (quote && strchr(quote, *p))
+ {
+ /* okay, we have a quoted token, now scan for the closer */
+ char thisquote = *p++;
+
+ for (; *p; p += PQmblenBounded(p, encoding))
+ {
+ if (*p == escape && p[1] != '\0')
+ p++; /* process escaped anything */
+ else if (*p == thisquote && p[1] == thisquote)
+ p++; /* process doubled quote */
+ else if (*p == thisquote)
+ {
+ p++; /* skip trailing quote */
+ break;
+ }
+ }
+
+ /*
+ * If not at end of string, we need to insert a null to terminate the
+ * returned token. See notes above.
+ */
+ if (*p != '\0')
+ {
+ if (!strchr(whitespace, *p))
+ memmove(p + 1, p, strlen(p) + 1);
+ *p = '\0';
+ string = p + 1;
+ }
+ else
+ {
+ /* at end of string, so no extra work */
+ string = p;
+ }
+
+ /* Clean up the token if caller wants that */
+ if (del_quotes)
+ strip_quotes(start, thisquote, escape, encoding);
+
+ return start;
+ }
+
+ /*
+ * Otherwise no quoting character. Scan till next whitespace, delimiter
+ * or quote. NB: at this point, *start is known not to be '\0',
+ * whitespace, delim, or quote, so we will consume at least one character.
+ */
+ offset = strcspn(start, whitespace);
+
+ if (delim)
+ {
+ unsigned int offset2 = strcspn(start, delim);
+
+ if (offset > offset2)
+ offset = offset2;
+ }
+
+ if (quote)
+ {
+ unsigned int offset2 = strcspn(start, quote);
+
+ if (offset > offset2)
+ offset = offset2;
+ }
+
+ p = start + offset;
+
+ /*
+ * If not at end of string, we need to insert a null to terminate the
+ * returned token. See notes above.
+ */
+ if (*p != '\0')
+ {
+ if (!strchr(whitespace, *p))
+ memmove(p + 1, p, strlen(p) + 1);
+ *p = '\0';
+ string = p + 1;
+ }
+ else
+ {
+ /* at end of string, so no extra work */
+ string = p;
+ }
+
+ return start;
+}
+
+
+/*
+ * strip_quotes
+ *
+ * Remove quotes from the string at *source. Leading and trailing occurrences
+ * of 'quote' are removed; embedded double occurrences of 'quote' are reduced
+ * to single occurrences; if 'escape' is not 0 then 'escape' removes special
+ * significance of next character.
+ *
+ * Note that the source string is overwritten in-place.
+ */
+void
+strip_quotes(char *source, char quote, char escape, int encoding)
+{
+ char *src;
+ char *dst;
+
+ Assert(source != NULL);
+ Assert(quote != '\0');
+
+ src = dst = source;
+
+ if (*src && *src == quote)
+ src++; /* skip leading quote */
+
+ while (*src)
+ {
+ char c = *src;
+ int i;
+
+ if (c == quote && src[1] == '\0')
+ break; /* skip trailing quote */
+ else if (c == quote && src[1] == quote)
+ src++; /* process doubled quote */
+ else if (c == escape && src[1] != '\0')
+ src++; /* process escaped character */
+
+ i = PQmblenBounded(src, encoding);
+ while (i--)
+ *dst++ = *src++;
+ }
+
+ *dst = '\0';
+}
+
+
+/*
+ * quote_if_needed
+ *
+ * Opposite of strip_quotes(). If "source" denotes itself literally without
+ * quoting or escaping, returns NULL. Otherwise, returns a malloc'd copy with
+ * quoting and escaping applied:
+ *
+ * source - string to parse
+ * entails_quote - any of these present? need outer quotes
+ * quote - doubled within string, affixed to both ends
+ * escape - doubled within string
+ * force_quote - if true, quote the output even if it doesn't "need" it
+ * encoding - the active character-set encoding
+ *
+ * Do not use this as a substitute for PQescapeStringConn(). Use it for
+ * strings to be parsed by strtokx() or psql_scan_slash_option().
+ */
+char *
+quote_if_needed(const char *source, const char *entails_quote,
+ char quote, char escape, bool force_quote,
+ int encoding)
+{
+ const char *src;
+ char *ret;
+ char *dst;
+ bool need_quotes = force_quote;
+
+ Assert(source != NULL);
+ Assert(quote != '\0');
+
+ src = source;
+ dst = ret = pg_malloc(2 * strlen(src) + 3); /* excess */
+
+ *dst++ = quote;
+
+ while (*src)
+ {
+ char c = *src;
+ int i;
+
+ if (c == quote)
+ {
+ need_quotes = true;
+ *dst++ = quote;
+ }
+ else if (c == escape)
+ {
+ need_quotes = true;
+ *dst++ = escape;
+ }
+ else if (strchr(entails_quote, c))
+ need_quotes = true;
+
+ i = PQmblenBounded(src, encoding);
+ while (i--)
+ *dst++ = *src++;
+ }
+
+ *dst++ = quote;
+ *dst = '\0';
+
+ if (!need_quotes)
+ {
+ free(ret);
+ ret = NULL;
+ }
+
+ return ret;
+}
diff --git a/src/bin/psql/stringutils.h b/src/bin/psql/stringutils.h
new file mode 100644
index 0000000..afbaf6f
--- /dev/null
+++ b/src/bin/psql/stringutils.h
@@ -0,0 +1,28 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/stringutils.h
+ */
+#ifndef STRINGUTILS_H
+#define STRINGUTILS_H
+
+/* The cooler version of strtok() which knows about quotes and doesn't
+ * overwrite your input */
+extern char *strtokx(const char *s,
+ const char *whitespace,
+ const char *delim,
+ const char *quote,
+ char escape,
+ bool e_strings,
+ bool del_quotes,
+ int encoding);
+
+extern void strip_quotes(char *source, char quote, char escape, int encoding);
+
+extern char *quote_if_needed(const char *source, const char *entails_quote,
+ char quote, char escape, bool force_quote,
+ int encoding);
+
+#endif /* STRINGUTILS_H */
diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl
new file mode 100644
index 0000000..9ac27db
--- /dev/null
+++ b/src/bin/psql/t/001_basic.pl
@@ -0,0 +1,385 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use locale;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('psql');
+program_version_ok('psql');
+program_options_handling_ok('psql');
+
+# Execute a psql command and check its output.
+sub psql_like
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($node, $sql, $expected_stdout, $test_name) = @_;
+
+ my ($ret, $stdout, $stderr) = $node->psql('postgres', $sql);
+
+ is($ret, 0, "$test_name: exit code 0");
+ is($stderr, '', "$test_name: no stderr");
+ like($stdout, $expected_stdout, "$test_name: matches");
+
+ return;
+}
+
+# Execute a psql command and check that it fails and check the stderr.
+sub psql_fails_like
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ my ($node, $sql, $expected_stderr, $test_name) = @_;
+
+ # Use the context of a WAL sender, some of the tests rely on that.
+ my ($ret, $stdout, $stderr) =
+ $node->psql('postgres', $sql, replication => 'database');
+
+ isnt($ret, 0, "$test_name: exit code not 0");
+ like($stderr, $expected_stderr, "$test_name: matches");
+
+ return;
+}
+
+# test --help=foo, analogous to program_help_ok()
+foreach my $arg (qw(commands variables))
+{
+ my ($stdout, $stderr);
+ my $result;
+
+ $result = IPC::Run::run [ 'psql', "--help=$arg" ], '>', \$stdout, '2>',
+ \$stderr;
+ ok($result, "psql --help=$arg exit code 0");
+ isnt($stdout, '', "psql --help=$arg goes to stdout");
+ is($stderr, '', "psql --help=$arg nothing to stderr");
+}
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init(extra => [ '--locale=C', '--encoding=UTF8' ]);
+$node->append_conf(
+ 'postgresql.conf', q{
+wal_level = 'logical'
+max_replication_slots = 4
+max_wal_senders = 4
+});
+$node->start;
+
+psql_like($node, '\copyright', qr/Copyright/, '\copyright');
+psql_like($node, '\help', qr/ALTER/, '\help without arguments');
+psql_like($node, '\help SELECT', qr/SELECT/, '\help with argument');
+
+# Test clean handling of unsupported replication command responses
+psql_fails_like(
+ $node,
+ 'START_REPLICATION 0/0',
+ qr/unexpected PQresultStatus: 8$/,
+ 'handling of unexpected PQresultStatus');
+
+# test \timing
+psql_like(
+ $node,
+ '\timing on
+SELECT 1',
+ qr/^1$
+^Time: \d+[.,]\d\d\d ms/m,
+ '\timing with successful query');
+
+# test \timing with query that fails
+{
+ my ($ret, $stdout, $stderr) =
+ $node->psql('postgres', "\\timing on\nSELECT error");
+ isnt($ret, 0, '\timing with query error: query failed');
+ like(
+ $stdout,
+ qr/^Time: \d+[.,]\d\d\d ms/m,
+ '\timing with query error: timing output appears');
+ unlike(
+ $stdout,
+ qr/^Time: 0[.,]000 ms/m,
+ '\timing with query error: timing was updated');
+}
+
+# test that ENCODING variable is set and that it is updated when
+# client encoding is changed
+psql_like(
+ $node,
+ '\echo :ENCODING
+set client_encoding = LATIN1;
+\echo :ENCODING',
+ qr/^UTF8$
+^LATIN1$/m,
+ 'ENCODING variable is set and updated');
+
+# test LISTEN/NOTIFY
+psql_like(
+ $node,
+ 'LISTEN foo;
+NOTIFY foo;',
+ qr/^Asynchronous notification "foo" received from server process with PID \d+\.$/,
+ 'notification');
+
+psql_like(
+ $node,
+ "LISTEN foo;
+NOTIFY foo, 'bar';",
+ qr/^Asynchronous notification "foo" with payload "bar" received from server process with PID \d+\.$/,
+ 'notification with payload');
+
+# test behavior and output on server crash
+my ($ret, $out, $err) = $node->psql('postgres',
+ "SELECT 'before' AS running;\n"
+ . "SELECT pg_terminate_backend(pg_backend_pid());\n"
+ . "SELECT 'AFTER' AS not_running;\n");
+
+is($ret, 2, 'server crash: psql exit code');
+like($out, qr/before/, 'server crash: output before crash');
+ok($out !~ qr/AFTER/, 'server crash: no output after crash');
+is( $err,
+ 'psql:<stdin>:2: FATAL: terminating connection due to administrator command
+psql:<stdin>:2: server closed the connection unexpectedly
+ This probably means the server terminated abnormally
+ before or while processing the request.
+psql:<stdin>:2: error: connection to server was lost',
+ 'server crash: error message');
+
+# test \errverbose
+#
+# (This is not in the regular regression tests because the output
+# contains the source code location and we don't want to have to
+# update that every time it changes.)
+
+psql_like(
+ $node,
+ 'SELECT 1;
+\errverbose',
+ qr/^1\nThere is no previous error\.$/,
+ '\errverbose with no previous error');
+
+# There are three main ways to run a query that might affect
+# \errverbose: The normal way, using a cursor by setting FETCH_COUNT,
+# and using \gdesc. Test them all.
+
+like(
+ ( $node->psql(
+ 'postgres',
+ "SELECT error;\n\\errverbose",
+ on_error_stop => 0))[2],
+ qr/\A^psql:<stdin>:1: ERROR: .*$
+^LINE 1: SELECT error;$
+^ *^.*$
+^psql:<stdin>:2: error: ERROR: [0-9A-Z]{5}: .*$
+^LINE 1: SELECT error;$
+^ *^.*$
+^LOCATION: .*$/m,
+ '\errverbose after normal query with error');
+
+like(
+ ( $node->psql(
+ 'postgres',
+ "\\set FETCH_COUNT 1\nSELECT error;\n\\errverbose",
+ on_error_stop => 0))[2],
+ qr/\A^psql:<stdin>:2: ERROR: .*$
+^LINE 2: SELECT error;$
+^ *^.*$
+^psql:<stdin>:3: error: ERROR: [0-9A-Z]{5}: .*$
+^LINE 2: SELECT error;$
+^ *^.*$
+^LOCATION: .*$/m,
+ '\errverbose after FETCH_COUNT query with error');
+
+like(
+ ( $node->psql(
+ 'postgres',
+ "SELECT error\\gdesc\n\\errverbose",
+ on_error_stop => 0))[2],
+ qr/\A^psql:<stdin>:1: ERROR: .*$
+^LINE 1: SELECT error$
+^ *^.*$
+^psql:<stdin>:2: error: ERROR: [0-9A-Z]{5}: .*$
+^LINE 1: SELECT error$
+^ *^.*$
+^LOCATION: .*$/m,
+ '\errverbose after \gdesc with error');
+
+# Check behavior when using multiple -c and -f switches.
+# Note that we cannot test backend-side errors as tests are unstable in this
+# case: IPC::Run can complain about a SIGPIPE if psql quits before reading a
+# query result.
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+$node->safe_psql('postgres', "CREATE TABLE tab_psql_single (a int);");
+
+# Tests with ON_ERROR_STOP.
+$node->command_ok(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-c',
+ 'INSERT INTO tab_psql_single VALUES (1)', '-c',
+ 'INSERT INTO tab_psql_single VALUES (2)'
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -c switches');
+my $row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '2',
+ '--single-transaction commits transaction, ON_ERROR_STOP and multiple -c switches'
+);
+
+$node->command_fails(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-c',
+ 'INSERT INTO tab_psql_single VALUES (3)', '-c',
+ "\\copy tab_psql_single FROM '$tempdir/nonexistent'"
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -c switches, error');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '2',
+ 'client-side error rolls back transaction, ON_ERROR_STOP and multiple -c switches'
+);
+
+# Tests mixing files and commands.
+my $copy_sql_file = "$tempdir/tab_copy.sql";
+my $insert_sql_file = "$tempdir/tab_insert.sql";
+append_to_file($copy_sql_file,
+ "\\copy tab_psql_single FROM '$tempdir/nonexistent';");
+append_to_file($insert_sql_file, 'INSERT INTO tab_psql_single VALUES (4);');
+$node->command_ok(
+ [
+ 'psql', '-X', '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-f', $insert_sql_file, '-f',
+ $insert_sql_file
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -f switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '4',
+ '--single-transaction commits transaction, ON_ERROR_STOP and multiple -f switches'
+);
+
+$node->command_fails(
+ [
+ 'psql', '-X', '--single-transaction', '-v',
+ 'ON_ERROR_STOP=1', '-f', $insert_sql_file, '-f',
+ $copy_sql_file
+ ],
+ 'ON_ERROR_STOP, --single-transaction and multiple -f switches, error');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '4',
+ 'client-side error rolls back transaction, ON_ERROR_STOP and multiple -f switches'
+);
+
+# Tests without ON_ERROR_STOP.
+# The last switch fails on \copy. The command returns a failure and the
+# transaction commits.
+$node->command_fails(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-f',
+ $insert_sql_file, '-f',
+ $insert_sql_file, '-c',
+ "\\copy tab_psql_single FROM '$tempdir/nonexistent'"
+ ],
+ 'no ON_ERROR_STOP, --single-transaction and multiple -f/-c switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '6',
+ 'client-side error commits transaction, no ON_ERROR_STOP and multiple -f/-c switches'
+);
+
+# The last switch fails on \copy coming from an input file. The command
+# returns a success and the transaction commits.
+$node->command_ok(
+ [
+ 'psql', '-X', '--single-transaction', '-f',
+ $insert_sql_file, '-f', $insert_sql_file, '-f',
+ $copy_sql_file
+ ],
+ 'no ON_ERROR_STOP, --single-transaction and multiple -f switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '8',
+ 'client-side error commits transaction, no ON_ERROR_STOP and multiple -f switches'
+);
+
+# The last switch makes the command return a success, and the contents of
+# the transaction commit even if there is a failure in-between.
+$node->command_ok(
+ [
+ 'psql', '-X',
+ '--single-transaction', '-c',
+ 'INSERT INTO tab_psql_single VALUES (5)', '-f',
+ $copy_sql_file, '-c',
+ 'INSERT INTO tab_psql_single VALUES (6)'
+ ],
+ 'no ON_ERROR_STOP, --single-transaction and multiple -c switches');
+$row_count =
+ $node->safe_psql('postgres', 'SELECT count(*) FROM tab_psql_single');
+is($row_count, '10',
+ 'client-side error commits transaction, no ON_ERROR_STOP and multiple -c switches'
+);
+
+# Test \copy from with DEFAULT option
+$node->safe_psql(
+ 'postgres',
+ "CREATE TABLE copy_default (
+ id integer PRIMARY KEY,
+ text_value text NOT NULL DEFAULT 'test',
+ ts_value timestamp without time zone NOT NULL DEFAULT '2022-07-05'
+ )"
+);
+
+my $copy_default_sql_file = "$tempdir/copy_default.csv";
+append_to_file($copy_default_sql_file, "1,value,2022-07-04\n");
+append_to_file($copy_default_sql_file, "2,placeholder,2022-07-03\n");
+append_to_file($copy_default_sql_file, "3,placeholder,placeholder\n");
+
+psql_like(
+ $node,
+ "\\copy copy_default from $copy_default_sql_file with (format 'csv', default 'placeholder');
+ SELECT * FROM copy_default",
+ qr/1\|value\|2022-07-04 00:00:00
+2|test|2022-07-03 00:00:00
+3|test|2022-07-05 00:00:00/,
+ '\copy from with DEFAULT');
+
+# Check \watch
+# Note: the interval value is parsed with locale-aware strtod()
+psql_like($node, sprintf('SELECT 1 \watch c=3 i=%g', 0.01),
+ qr/1\n1\n1/, '\watch with 3 iterations');
+
+# Check \watch errors
+psql_fails_like(
+ $node,
+ 'SELECT 1 \watch -10',
+ qr/incorrect interval value "-10"/,
+ '\watch, negative interval');
+psql_fails_like(
+ $node,
+ 'SELECT 1 \watch 10ab',
+ qr/incorrect interval value "10ab"/,
+ '\watch, incorrect interval');
+psql_fails_like(
+ $node,
+ 'SELECT 1 \watch 10e400',
+ qr/incorrect interval value "10e400"/,
+ '\watch, out-of-range interval');
+psql_fails_like(
+ $node,
+ 'SELECT 1 \watch 1 1',
+ qr/interval value is specified more than once/,
+ '\watch, interval value is specified more than once');
+psql_fails_like(
+ $node,
+ 'SELECT 1 \watch c=1 c=1',
+ qr/iteration count is specified more than once/,
+ '\watch, iteration count is specified more than once');
+
+done_testing();
diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl
new file mode 100644
index 0000000..f2d2809
--- /dev/null
+++ b/src/bin/psql/t/010_tab_completion.pl
@@ -0,0 +1,434 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+use Data::Dumper;
+
+# Do nothing unless Makefile has told us that the build is --with-readline.
+if (!defined($ENV{with_readline}) || $ENV{with_readline} ne 'yes')
+{
+ plan skip_all => 'readline is not supported by this build';
+}
+
+# Also, skip if user has set environment variable to command that.
+# This is mainly intended to allow working around some of the more broken
+# versions of libedit --- some users might find them acceptable even if
+# they won't pass these tests.
+if (defined($ENV{SKIP_READLINE_TESTS}))
+{
+ plan skip_all => 'SKIP_READLINE_TESTS is set';
+}
+
+# If we don't have IO::Pty, forget it, because IPC::Run depends on that
+# to support pty connections
+eval { require IO::Pty; };
+if ($@)
+{
+ plan skip_all => 'IO::Pty is needed to run this test';
+}
+
+# start a new server
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+# set up a few database objects
+$node->safe_psql('postgres',
+ "CREATE TABLE tab1 (c1 int primary key, c2 text);\n"
+ . "CREATE TABLE mytab123 (f1 int, f2 text);\n"
+ . "CREATE TABLE mytab246 (f1 int, f2 text);\n"
+ . "CREATE TABLE \"mixedName\" (f1 int, f2 text);\n"
+ . "CREATE TYPE enum1 AS ENUM ('foo', 'bar', 'baz', 'BLACK');\n"
+ . "CREATE PUBLICATION some_publication;\n");
+
+# In a VPATH build, we'll be started in the source directory, but we want
+# to run in the build directory so that we can use relative paths to
+# access the tab_comp_dir subdirectory; otherwise the output from filename
+# completion tests is too variable.
+if ($ENV{TESTDATADIR})
+{
+ chdir $ENV{TESTDATADIR}
+ or die "could not chdir to \"$ENV{TESTDATADIR}\": $!";
+}
+
+# Create some junk files for filename completion testing.
+mkdir "tab_comp_dir";
+my $FH;
+open $FH, ">", "tab_comp_dir/somefile"
+ or die("could not create file \"tab_comp_dir/somefile\": $!");
+print $FH "some stuff\n";
+close $FH;
+open $FH, ">", "tab_comp_dir/afile123"
+ or die("could not create file \"tab_comp_dir/afile123\": $!");
+print $FH "more stuff\n";
+close $FH;
+open $FH, ">", "tab_comp_dir/afile456"
+ or die("could not create file \"tab_comp_dir/afile456\": $!");
+print $FH "other stuff\n";
+close $FH;
+
+# Arrange to capture, not discard, the interactive session's history output.
+# Put it in the test log directory, so that buildfarm runs capture the result
+# for possible debugging purposes.
+my $historyfile = "${PostgreSQL::Test::Utils::log_path}/010_psql_history.txt";
+
+# fire up an interactive psql session
+my $h = $node->interactive_psql('postgres', history_file => $historyfile);
+
+# Simple test case: type something and see if psql responds as expected
+sub check_completion
+{
+ my ($send, $pattern, $annotation) = @_;
+
+ # report test failures from caller location
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ # restart per-command timer
+ $h->{timeout}->start($PostgreSQL::Test::Utils::timeout_default);
+
+ # send the data to be sent and wait for its result
+ my $out = $h->query_until($pattern, $send);
+ my $okay = ($out =~ $pattern && !$h->{timeout}->is_expired);
+ ok($okay, $annotation);
+ # for debugging, log actual output if it didn't match
+ local $Data::Dumper::Terse = 1;
+ local $Data::Dumper::Useqq = 1;
+ diag 'Actual output was ' . Dumper($out) . "Did not match \"$pattern\"\n"
+ if !$okay;
+ return;
+}
+
+# Clear query buffer to start over
+# (won't work if we are inside a string literal!)
+sub clear_query
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ check_completion("\\r\n", qr/Query buffer reset.*postgres=# /s,
+ "\\r works");
+ return;
+}
+
+# Clear current line to start over
+# (this will work in an incomplete string literal, but it's less desirable
+# than clear_query because we lose evidence in the history file)
+sub clear_line
+{
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
+
+ check_completion("\025\n", qr/postgres=# /, "control-U works");
+ return;
+}
+
+# check basic command completion: SEL<tab> produces SELECT<space>
+check_completion("SEL\t", qr/SELECT /, "complete SEL<tab> to SELECT");
+
+clear_query();
+
+# check case variation is honored
+check_completion("sel\t", qr/select /, "complete sel<tab> to select");
+
+# check basic table name completion
+check_completion("* from t\t", qr/\* from tab1 /, "complete t<tab> to tab1");
+
+clear_query();
+
+# check table name completion with multiple alternatives
+# note: readline might print a bell before the completion
+check_completion(
+ "select * from my\t",
+ qr/select \* from my\a?tab/,
+ "complete my<tab> to mytab when there are multiple choices");
+
+# some versions of readline/libedit require two tabs here, some only need one
+check_completion(
+ "\t\t",
+ qr/mytab123 +mytab246/,
+ "offer multiple table choices");
+
+check_completion("2\t", qr/246 /,
+ "finish completion of one of multiple table choices");
+
+clear_query();
+
+# check handling of quoted names
+check_completion(
+ "select * from \"my\t",
+ qr/select \* from "my\a?tab/,
+ "complete \"my<tab> to \"mytab when there are multiple choices");
+
+check_completion(
+ "\t\t",
+ qr/"mytab123" +"mytab246"/,
+ "offer multiple quoted table choices");
+
+# note: broken versions of libedit want to backslash the closing quote;
+# not much we can do about that
+check_completion("2\t", qr/246\\?" /,
+ "finish completion of one of multiple quoted table choices");
+
+# note: broken versions of libedit may leave us in a state where psql
+# thinks there's an unclosed double quote, so that we have to use
+# clear_line not clear_query here
+clear_line();
+
+# check handling of mixed-case names
+# note: broken versions of libedit want to backslash the closing quote;
+# not much we can do about that
+check_completion(
+ "select * from \"mi\t",
+ qr/"mixedName\\?" /,
+ "complete a mixed-case name");
+
+# as above, must use clear_line not clear_query here
+clear_line();
+
+# check case folding
+check_completion("select * from TAB\t", qr/tab1 /, "automatically fold case");
+
+clear_query();
+
+# check case-sensitive keyword replacement
+# note: various versions of readline/libedit handle backspacing
+# differently, so just check that the replacement comes out correctly
+check_completion("\\DRD\t", qr/drds /, "complete \\DRD<tab> to \\drds");
+
+# broken versions of libedit require clear_line not clear_query here
+clear_line();
+
+# check completion of a schema-qualified name
+check_completion("select * from pub\t",
+ qr/public\./, "complete schema when relevant");
+
+check_completion("tab\t", qr/tab1 /, "complete schema-qualified name");
+
+clear_query();
+
+check_completion(
+ "select * from PUBLIC.t\t",
+ qr/public\.tab1 /,
+ "automatically fold case in schema-qualified name");
+
+clear_query();
+
+# check interpretation of referenced names
+check_completion(
+ "alter table tab1 drop constraint \t",
+ qr/tab1_pkey /,
+ "complete index name for referenced table");
+
+clear_query();
+
+check_completion(
+ "alter table TAB1 drop constraint \t",
+ qr/tab1_pkey /,
+ "complete index name for referenced table, with downcasing");
+
+clear_query();
+
+check_completion(
+ "alter table public.\"tab1\" drop constraint \t",
+ qr/tab1_pkey /,
+ "complete index name for referenced table, with schema and quoting");
+
+clear_query();
+
+# check variant where we're completing a qualified name from a refname
+# (this one also checks successful completion in a multiline command)
+check_completion(
+ "comment on constraint tab1_pkey \n on public.\t",
+ qr/public\.tab1/,
+ "complete qualified name from object reference");
+
+clear_query();
+
+# check filename completion
+check_completion(
+ "\\lo_import tab_comp_dir/some\t",
+ qr|tab_comp_dir/somefile |,
+ "filename completion with one possibility");
+
+clear_query();
+
+# note: readline might print a bell before the completion
+check_completion(
+ "\\lo_import tab_comp_dir/af\t",
+ qr|tab_comp_dir/af\a?ile|,
+ "filename completion with multiple possibilities");
+
+# broken versions of libedit require clear_line not clear_query here
+clear_line();
+
+# COPY requires quoting
+# note: broken versions of libedit want to backslash the closing quote;
+# not much we can do about that
+check_completion(
+ "COPY foo FROM tab_comp_dir/some\t",
+ qr|'tab_comp_dir/somefile\\?' |,
+ "quoted filename completion with one possibility");
+
+clear_line();
+
+check_completion(
+ "COPY foo FROM tab_comp_dir/af\t",
+ qr|'tab_comp_dir/afile|,
+ "quoted filename completion with multiple possibilities");
+
+# some versions of readline/libedit require two tabs here, some only need one
+# also, some will offer the whole path name and some just the file name
+# the quotes might appear, too
+check_completion(
+ "\t\t",
+ qr|afile123'? +'?(tab_comp_dir/)?afile456|,
+ "offer multiple file choices");
+
+clear_line();
+
+# check enum label completion
+# some versions of readline/libedit require two tabs here, some only need one
+# also, some versions will offer quotes, some will not
+check_completion(
+ "ALTER TYPE enum1 RENAME VALUE 'ba\t\t",
+ qr|'?bar'? +'?baz'?|,
+ "offer multiple enum choices");
+
+clear_line();
+
+# enum labels are case sensitive, so this should complete BLACK immediately
+check_completion(
+ "ALTER TYPE enum1 RENAME VALUE 'B\t",
+ qr|BLACK|,
+ "enum labels are case sensitive");
+
+clear_line();
+
+# check timezone name completion
+check_completion("SET timezone TO am\t",
+ qr|'America/|, "offer partial timezone name");
+
+check_completion("new_\t", qr|New_York|, "complete partial timezone name");
+
+clear_line();
+
+# check completion of a keyword offered in addition to object names;
+# such a keyword should obey COMP_KEYWORD_CASE
+foreach (
+ [ 'lower', 'CO', 'column' ],
+ [ 'upper', 'co', 'COLUMN' ],
+ [ 'preserve-lower', 'co', 'column' ],
+ [ 'preserve-upper', 'CO', 'COLUMN' ],)
+{
+ my ($case, $in, $out) = @$_;
+
+ check_completion(
+ "\\set COMP_KEYWORD_CASE $case\n",
+ qr/postgres=#/,
+ "set completion case to '$case'");
+ check_completion("alter table tab1 rename $in\t\t\t",
+ qr|$out|,
+ "offer keyword $out for input $in<TAB>, COMP_KEYWORD_CASE = $case");
+ clear_query();
+}
+
+# alternate path where keyword comes from SchemaQuery
+check_completion(
+ "DROP TYPE big\t",
+ qr/DROP TYPE bigint /,
+ "offer keyword from SchemaQuery");
+
+clear_query();
+
+# check create_command_generator
+check_completion(
+ "CREATE TY\t",
+ qr/CREATE TYPE /,
+ "check create_command_generator");
+
+clear_query();
+
+# check words_after_create infrastructure
+check_completion(
+ "CREATE TABLE mytab\t\t",
+ qr/mytab123 +mytab246/,
+ "check words_after_create");
+
+clear_query();
+
+# check VersionedQuery infrastructure
+check_completion(
+ "DROP PUBLIC\t \t\t",
+ qr/DROP PUBLICATION\s+some_publication /,
+ "check VersionedQuery");
+
+clear_query();
+
+# hits ends_with() and logic for completing in multi-line queries
+check_completion("analyze (\n\t\t", qr/VERBOSE/,
+ "check ANALYZE (VERBOSE ...");
+
+clear_query();
+
+# check completions for GUCs
+check_completion(
+ "set interval\t\t",
+ qr/intervalstyle TO/,
+ "complete a GUC name");
+check_completion(" iso\t", qr/iso_8601 /, "complete a GUC enum value");
+
+clear_query();
+
+# same, for qualified GUC names
+check_completion(
+ "DO \$\$begin end\$\$ LANGUAGE plpgsql;\n",
+ qr/postgres=# /,
+ "load plpgsql extension");
+
+check_completion("set plpg\t", qr/plpg\a?sql\./,
+ "complete prefix of a GUC name");
+check_completion(
+ "var\t\t",
+ qr/variable_conflict TO/,
+ "complete a qualified GUC name");
+check_completion(" USE_C\t",
+ qr/use_column/, "complete a qualified GUC enum value");
+
+clear_query();
+
+# check completions for psql variables
+check_completion("\\set VERB\t", qr/VERBOSITY /,
+ "complete a psql variable name");
+check_completion("def\t", qr/default /, "complete a psql variable value");
+
+clear_query();
+
+check_completion(
+ "\\echo :VERB\t",
+ qr/:VERBOSITY /,
+ "complete an interpolated psql variable name");
+
+clear_query();
+
+# check no-completions code path
+check_completion("blarg \t\t", qr//, "check completion failure path");
+
+clear_query();
+
+# check COPY FROM with DEFAULT option
+check_completion(
+ "COPY foo FROM stdin WITH ( DEF\t)",
+ qr/DEFAULT /,
+ "COPY FROM with DEFAULT completion");
+
+clear_line();
+
+# send psql an explicit \q to shut it down, else pty won't close properly
+$h->quit or die "psql returned $?";
+
+# done
+$node->stop;
+done_testing();
diff --git a/src/bin/psql/t/020_cancel.pl b/src/bin/psql/t/020_cancel.pl
new file mode 100644
index 0000000..bf438a3
--- /dev/null
+++ b/src/bin/psql/t/020_cancel.pl
@@ -0,0 +1,80 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+use Time::HiRes qw(usleep);
+
+# Test query canceling by sending SIGINT to a running psql
+#
+# There is, as of this writing, no documented way to get the PID of
+# the process from IPC::Run. As a workaround, we have psql print its
+# own PID (which is the parent of the shell launched by psql) to a
+# file.
+if ($windows_os)
+{
+ plan skip_all => "cancel test requires a Unix shell";
+}
+
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+local %ENV = $node->_get_env();
+
+my ($stdin, $stdout, $stderr);
+
+# Test whether shell supports $PPID. It's part of POSIX, but some
+# pre-/non-POSIX shells don't support it (e.g., NetBSD).
+$stdin = "\\! echo \$PPID";
+IPC::Run::run([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ],
+ '<', \$stdin, '>', \$stdout, '2>', \$stderr);
+$stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID", 2;
+
+# Now start the real test
+my $h = IPC::Run::start([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ],
+ \$stdin, \$stdout, \$stderr);
+
+# Get the PID
+$stdout = '';
+$stderr = '';
+$stdin = "\\! echo \$PPID >$tempdir/psql.pid\n";
+pump $h while length $stdin;
+my $count;
+my $psql_pid;
+until (
+ -s "$tempdir/psql.pid"
+ and
+ ($psql_pid = PostgreSQL::Test::Utils::slurp_file("$tempdir/psql.pid"))
+ =~ /^\d+\n/s)
+{
+ ($count++ < 100 * $PostgreSQL::Test::Utils::timeout_default)
+ or die "pid file did not appear";
+ usleep(10_000);
+}
+
+# Send sleep command and wait until the server has registered it
+$stdin = "select pg_sleep($PostgreSQL::Test::Utils::timeout_default);\n";
+pump $h while length $stdin;
+$node->poll_query_until('postgres',
+ q{SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ '^select pg_sleep') > 0;}
+) or die "timed out";
+
+# Send cancel request
+kill 'INT', $psql_pid;
+
+my $result = finish $h;
+
+ok(!$result, 'query failed as expected');
+like(
+ $stderr,
+ qr/canceling statement due to user request/,
+ 'query was canceled');
+
+done_testing();
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
new file mode 100644
index 0000000..a1aa946
--- /dev/null
+++ b/src/bin/psql/tab-complete.c
@@ -0,0 +1,6361 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/tab-complete.c
+ */
+
+/*----------------------------------------------------------------------
+ * This file implements a somewhat more sophisticated readline "TAB
+ * completion" in psql. It is not intended to be AI, to replace
+ * learning SQL, or to relieve you from thinking about what you're
+ * doing. Also it does not always give you all the syntactically legal
+ * completions, only those that are the most common or the ones that
+ * the programmer felt most like implementing.
+ *
+ * CAVEAT: Tab completion causes queries to be sent to the backend.
+ * The number of tuples returned gets limited, in most default
+ * installations to 1000, but if you still don't like this prospect,
+ * you can turn off tab completion in your ~/.inputrc (or else
+ * ${INPUTRC}) file so:
+ *
+ * $if psql
+ * set disable-completion on
+ * $endif
+ *
+ * See `man 3 readline' or `info readline' for the full details.
+ *
+ * BUGS:
+ * - Quotes, parentheses, and other funny characters are not handled
+ * all that gracefully.
+ *----------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include "input.h"
+#include "tab-complete.h"
+
+/* If we don't have this, we might as well forget about the whole thing: */
+#ifdef USE_READLINE
+
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "catalog/pg_am_d.h"
+#include "catalog/pg_class_d.h"
+#include "common.h"
+#include "common/keywords.h"
+#include "libpq-fe.h"
+#include "mb/pg_wchar.h"
+#include "pqexpbuffer.h"
+#include "settings.h"
+#include "stringutils.h"
+
+/*
+ * Ancient versions of libedit provide filename_completion_function()
+ * instead of rl_filename_completion_function(). Likewise for
+ * [rl_]completion_matches().
+ */
+#ifndef HAVE_RL_FILENAME_COMPLETION_FUNCTION
+#define rl_filename_completion_function filename_completion_function
+#endif
+
+#ifndef HAVE_RL_COMPLETION_MATCHES
+#define rl_completion_matches completion_matches
+#endif
+
+/*
+ * Currently we assume that rl_filename_dequoting_function exists if
+ * rl_filename_quoting_function does. If that proves not to be the case,
+ * we'd need to test for the former, or possibly both, in configure.
+ */
+#ifdef HAVE_RL_FILENAME_QUOTING_FUNCTION
+#define USE_FILENAME_QUOTING_FUNCTIONS 1
+#endif
+
+/* word break characters */
+#define WORD_BREAKS "\t\n@$><=;|&{() "
+
+/*
+ * Since readline doesn't let us pass any state through to the tab completion
+ * callback, we have to use this global variable to let get_previous_words()
+ * get at the previous lines of the current command. Ick.
+ */
+PQExpBuffer tab_completion_query_buf = NULL;
+
+/*
+ * In some situations, the query to find out what names are available to
+ * complete with must vary depending on server version. We handle this by
+ * storing a list of queries, each tagged with the minimum server version
+ * it will work for. Each list must be stored in descending server version
+ * order, so that the first satisfactory query is the one to use.
+ *
+ * When the query string is otherwise constant, an array of VersionedQuery
+ * suffices. Terminate the array with an entry having min_server_version = 0.
+ * That entry's query string can be a query that works in all supported older
+ * server versions, or NULL to give up and do no completion.
+ */
+typedef struct VersionedQuery
+{
+ int min_server_version;
+ const char *query;
+} VersionedQuery;
+
+/*
+ * This struct is used to define "schema queries", which are custom-built
+ * to obtain possibly-schema-qualified names of database objects. There is
+ * enough similarity in the structure that we don't want to repeat it each
+ * time. So we put the components of each query into this struct and
+ * assemble them with the common boilerplate in _complete_from_query().
+ *
+ * We also use this struct to define queries that use completion_ref_object,
+ * which is some object related to the one(s) we want to get the names of
+ * (for example, the table we want the indexes of). In that usage the
+ * objects we're completing might not have a schema of their own, but the
+ * reference object almost always does (passed in completion_ref_schema).
+ *
+ * As with VersionedQuery, we can use an array of these if the query details
+ * must vary across versions.
+ */
+typedef struct SchemaQuery
+{
+ /*
+ * If not zero, minimum server version this struct applies to. If not
+ * zero, there should be a following struct with a smaller minimum server
+ * version; use catname == NULL in the last entry if we should do nothing.
+ */
+ int min_server_version;
+
+ /*
+ * Name of catalog or catalogs to be queried, with alias(es), eg.
+ * "pg_catalog.pg_class c". Note that "pg_namespace n" and/or
+ * "pg_namespace nr" will be added automatically when needed.
+ */
+ const char *catname;
+
+ /*
+ * Selection condition --- only rows meeting this condition are candidates
+ * to display. If catname mentions multiple tables, include the necessary
+ * join condition here. For example, this might look like "c.relkind = "
+ * CppAsString2(RELKIND_RELATION). Write NULL (not an empty string) if
+ * not needed.
+ */
+ const char *selcondition;
+
+ /*
+ * Visibility condition --- which rows are visible without schema
+ * qualification? For example, "pg_catalog.pg_table_is_visible(c.oid)".
+ * NULL if not needed.
+ */
+ const char *viscondition;
+
+ /*
+ * Namespace --- name of field to join to pg_namespace.oid when there is
+ * schema qualification. For example, "c.relnamespace". NULL if we don't
+ * want to join to pg_namespace (then any schema part in the input word
+ * will be ignored).
+ */
+ const char *namespace;
+
+ /*
+ * Result --- the base object name to return. For example, "c.relname".
+ */
+ const char *result;
+
+ /*
+ * In some cases, it's difficult to keep the query from returning the same
+ * object multiple times. Specify use_distinct to filter out duplicates.
+ */
+ bool use_distinct;
+
+ /*
+ * Additional literal strings (usually keywords) to be offered along with
+ * the query results. Provide a NULL-terminated array of constant
+ * strings, or NULL if none.
+ */
+ const char *const *keywords;
+
+ /*
+ * If this query uses completion_ref_object/completion_ref_schema,
+ * populate the remaining fields, else leave them NULL. When using this
+ * capability, catname must include the catalog that defines the
+ * completion_ref_object, and selcondition must include the join condition
+ * that connects it to the result's catalog.
+ *
+ * refname is the field that should be equated to completion_ref_object,
+ * for example "cr.relname".
+ */
+ const char *refname;
+
+ /*
+ * Visibility condition to use when completion_ref_schema is not set. For
+ * example, "pg_catalog.pg_table_is_visible(cr.oid)". NULL if not needed.
+ */
+ const char *refviscondition;
+
+ /*
+ * Name of field to join to pg_namespace.oid when completion_ref_schema is
+ * set. For example, "cr.relnamespace". NULL if we don't want to
+ * consider completion_ref_schema.
+ */
+ const char *refnamespace;
+} SchemaQuery;
+
+
+/* Store maximum number of records we want from database queries
+ * (implemented via SELECT ... LIMIT xx).
+ */
+static int completion_max_records;
+
+/*
+ * Communication variables set by psql_completion (mostly in COMPLETE_WITH_FOO
+ * macros) and then used by the completion callback functions. Ugly but there
+ * is no better way.
+ */
+static char completion_last_char; /* last char of input word */
+static const char *completion_charp; /* to pass a string */
+static const char *const *completion_charpp; /* to pass a list of strings */
+static const VersionedQuery *completion_vquery; /* to pass a VersionedQuery */
+static const SchemaQuery *completion_squery; /* to pass a SchemaQuery */
+static char *completion_ref_object; /* name of reference object */
+static char *completion_ref_schema; /* schema name of reference object */
+static bool completion_case_sensitive; /* completion is case sensitive */
+static bool completion_verbatim; /* completion is verbatim */
+static bool completion_force_quote; /* true to force-quote filenames */
+
+/*
+ * A few macros to ease typing. You can use these to complete the given
+ * string with
+ * 1) The result from a query you pass it. (Perhaps one of those below?)
+ * We support both simple and versioned queries.
+ * 2) The result from a schema query you pass it.
+ * We support both simple and versioned schema queries.
+ * 3) The items from a null-pointer-terminated list (with or without
+ * case-sensitive comparison); if the list is constant you can build it
+ * with COMPLETE_WITH() or COMPLETE_WITH_CS(). The QUERY_LIST and
+ * QUERY_PLUS forms combine such literal lists with a query result.
+ * 4) The list of attributes of the given table (possibly schema-qualified).
+ * 5) The list of arguments to the given function (possibly schema-qualified).
+ *
+ * The query is generally expected to return raw SQL identifiers; matching
+ * to what the user typed is done in a quoting-aware fashion. If what is
+ * returned is not SQL identifiers, use one of the VERBATIM forms, in which
+ * case the query results are matched to the user's text without double-quote
+ * processing (so if quoting is needed, you must provide it in the query
+ * results).
+ */
+#define COMPLETE_WITH_QUERY(query) \
+ COMPLETE_WITH_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_QUERY_LIST(query, list) \
+do { \
+ completion_charp = query; \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_query); \
+} while (0)
+
+#define COMPLETE_WITH_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_QUERY_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_QUERY_VERBATIM(query) \
+ COMPLETE_WITH_QUERY_VERBATIM_LIST(query, NULL)
+
+#define COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list) \
+do { \
+ completion_charp = query; \
+ completion_charpp = list; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_query); \
+} while (0)
+
+#define COMPLETE_WITH_QUERY_VERBATIM_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_QUERY(query) \
+ COMPLETE_WITH_VERSIONED_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list) \
+do { \
+ completion_vquery = query; \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_versioned_query); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_SCHEMA_QUERY(query) \
+ COMPLETE_WITH_SCHEMA_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list) \
+do { \
+ completion_squery = &(query); \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_SCHEMA_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list); \
+} while (0)
+
+#define COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(query) \
+do { \
+ completion_squery = &(query); \
+ completion_charpp = NULL; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(query) \
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, NULL)
+
+#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list) \
+do { \
+ completion_squery = query; \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_versioned_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_PLUS(query, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list); \
+} while (0)
+
+/*
+ * Caution: COMPLETE_WITH_CONST is not for general-purpose use; you probably
+ * want COMPLETE_WITH() with one element, instead.
+ */
+#define COMPLETE_WITH_CONST(cs, con) \
+do { \
+ completion_case_sensitive = (cs); \
+ completion_charp = (con); \
+ matches = rl_completion_matches(text, complete_from_const); \
+} while (0)
+
+#define COMPLETE_WITH_LIST_INT(cs, list) \
+do { \
+ completion_case_sensitive = (cs); \
+ completion_charpp = (list); \
+ matches = rl_completion_matches(text, complete_from_list); \
+} while (0)
+
+#define COMPLETE_WITH_LIST(list) COMPLETE_WITH_LIST_INT(false, list)
+#define COMPLETE_WITH_LIST_CS(list) COMPLETE_WITH_LIST_INT(true, list)
+
+#define COMPLETE_WITH(...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_LIST(list); \
+} while (0)
+
+#define COMPLETE_WITH_CS(...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_LIST_CS(list); \
+} while (0)
+
+#define COMPLETE_WITH_ATTR(relation) \
+ COMPLETE_WITH_ATTR_LIST(relation, NULL)
+
+#define COMPLETE_WITH_ATTR_LIST(relation, list) \
+do { \
+ set_completion_reference(relation); \
+ completion_squery = &(Query_for_list_of_attributes); \
+ completion_charpp = list; \
+ completion_verbatim = false; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+#define COMPLETE_WITH_ATTR_PLUS(relation, ...) \
+do { \
+ static const char *const list[] = { __VA_ARGS__, NULL }; \
+ COMPLETE_WITH_ATTR_LIST(relation, list); \
+} while (0)
+
+/*
+ * libedit will typically include the literal's leading single quote in
+ * "text", while readline will not. Adapt our offered strings to fit.
+ * But include a quote if there's not one just before "text", to get the
+ * user off to the right start.
+ */
+#define COMPLETE_WITH_ENUM_VALUE(type) \
+do { \
+ set_completion_reference(type); \
+ if (text[0] == '\'' || \
+ start == 0 || rl_line_buffer[start - 1] != '\'') \
+ completion_squery = &(Query_for_list_of_enum_values_quoted); \
+ else \
+ completion_squery = &(Query_for_list_of_enum_values_unquoted); \
+ completion_charpp = NULL; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+/*
+ * Timezone completion is mostly like enum label completion, but we work
+ * a little harder since this is a more common use-case.
+ */
+#define COMPLETE_WITH_TIMEZONE_NAME() \
+do { \
+ static const char *const list[] = { "DEFAULT", NULL }; \
+ if (text[0] == '\'') \
+ completion_charp = Query_for_list_of_timezone_names_quoted_in; \
+ else if (start == 0 || rl_line_buffer[start - 1] != '\'') \
+ completion_charp = Query_for_list_of_timezone_names_quoted_out; \
+ else \
+ completion_charp = Query_for_list_of_timezone_names_unquoted; \
+ completion_charpp = list; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_query); \
+} while (0)
+
+#define COMPLETE_WITH_FUNCTION_ARG(function) \
+do { \
+ set_completion_reference(function); \
+ completion_squery = &(Query_for_list_of_arguments); \
+ completion_charpp = NULL; \
+ completion_verbatim = true; \
+ matches = rl_completion_matches(text, complete_from_schema_query); \
+} while (0)
+
+/*
+ * Assembly instructions for schema queries
+ *
+ * Note that toast tables are not included in those queries to avoid
+ * unnecessary bloat in the completions generated.
+ */
+
+static const SchemaQuery Query_for_constraint_of_table = {
+ .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
+ .selcondition = "con.conrelid=c1.oid",
+ .result = "con.conname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_constraint_of_table_not_validated = {
+ .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
+ .selcondition = "con.conrelid=c1.oid and not con.convalidated",
+ .result = "con.conname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_constraint_of_type = {
+ .catname = "pg_catalog.pg_constraint con, pg_catalog.pg_type t",
+ .selcondition = "con.contypid=t.oid",
+ .result = "con.conname",
+ .refname = "t.typname",
+ .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .refnamespace = "t.typnamespace",
+};
+
+static const SchemaQuery Query_for_index_of_table = {
+ .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
+ .selcondition = "c1.oid=i.indrelid and i.indexrelid=c2.oid",
+ .result = "c2.relname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_unique_index_of_table = {
+ .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
+ .selcondition = "c1.oid=i.indrelid and i.indexrelid=c2.oid and i.indisunique",
+ .result = "c2.relname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_list_of_aggregates[] = {
+ {
+ .min_server_version = 110000,
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.prokind = 'a'",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ },
+ {
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.proisagg",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ }
+};
+
+static const SchemaQuery Query_for_list_of_arguments = {
+ .catname = "pg_catalog.pg_proc p",
+ .result = "pg_catalog.oidvectortypes(p.proargtypes)||')'",
+ .refname = "p.proname",
+ .refviscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .refnamespace = "p.pronamespace",
+};
+
+static const SchemaQuery Query_for_list_of_attributes = {
+ .catname = "pg_catalog.pg_attribute a, pg_catalog.pg_class c",
+ .selcondition = "c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
+ .result = "a.attname",
+ .refname = "c.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .refnamespace = "c.relnamespace",
+};
+
+static const SchemaQuery Query_for_list_of_attribute_numbers = {
+ .catname = "pg_catalog.pg_attribute a, pg_catalog.pg_class c",
+ .selcondition = "c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
+ .result = "a.attnum::pg_catalog.text",
+ .refname = "c.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .refnamespace = "c.relnamespace",
+};
+
+static const char *const Keywords_for_list_of_datatypes[] = {
+ "bigint",
+ "boolean",
+ "character",
+ "double precision",
+ "integer",
+ "real",
+ "smallint",
+
+ /*
+ * Note: currently there's no value in offering the following multiword
+ * type names, because tab completion cannot succeed for them: we can't
+ * disambiguate until somewhere in the second word, at which point we
+ * won't have the first word as context. ("double precision" does work,
+ * as long as no other type name begins with "double".) Leave them out to
+ * encourage users to use the PG-specific aliases, which we can complete.
+ */
+#ifdef NOT_USED
+ "bit varying",
+ "character varying",
+ "time with time zone",
+ "time without time zone",
+ "timestamp with time zone",
+ "timestamp without time zone",
+#endif
+ NULL
+};
+
+static const SchemaQuery Query_for_list_of_datatypes = {
+ .catname = "pg_catalog.pg_type t",
+ /* selcondition --- ignore table rowtypes and array types */
+ .selcondition = "(t.typrelid = 0 "
+ " OR (SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
+ " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "
+ "AND t.typname !~ '^_'",
+ .viscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .namespace = "t.typnamespace",
+ .result = "t.typname",
+ .keywords = Keywords_for_list_of_datatypes,
+};
+
+static const SchemaQuery Query_for_list_of_composite_datatypes = {
+ .catname = "pg_catalog.pg_type t",
+ /* selcondition --- only get composite types */
+ .selcondition = "(SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
+ " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid) "
+ "AND t.typname !~ '^_'",
+ .viscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .namespace = "t.typnamespace",
+ .result = "t.typname",
+};
+
+static const SchemaQuery Query_for_list_of_domains = {
+ .catname = "pg_catalog.pg_type t",
+ .selcondition = "t.typtype = 'd'",
+ .viscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .namespace = "t.typnamespace",
+ .result = "t.typname",
+};
+
+static const SchemaQuery Query_for_list_of_enum_values_quoted = {
+ .catname = "pg_catalog.pg_enum e, pg_catalog.pg_type t",
+ .selcondition = "t.oid = e.enumtypid",
+ .result = "pg_catalog.quote_literal(enumlabel)",
+ .refname = "t.typname",
+ .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .refnamespace = "t.typnamespace",
+};
+
+static const SchemaQuery Query_for_list_of_enum_values_unquoted = {
+ .catname = "pg_catalog.pg_enum e, pg_catalog.pg_type t",
+ .selcondition = "t.oid = e.enumtypid",
+ .result = "e.enumlabel",
+ .refname = "t.typname",
+ .refviscondition = "pg_catalog.pg_type_is_visible(t.oid)",
+ .refnamespace = "t.typnamespace",
+};
+
+/* Note: this intentionally accepts aggregates as well as plain functions */
+static const SchemaQuery Query_for_list_of_functions[] = {
+ {
+ .min_server_version = 110000,
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.prokind != 'p'",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ },
+ {
+ .catname = "pg_catalog.pg_proc p",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ }
+};
+
+static const SchemaQuery Query_for_list_of_procedures[] = {
+ {
+ .min_server_version = 110000,
+ .catname = "pg_catalog.pg_proc p",
+ .selcondition = "p.prokind = 'p'",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+ },
+ {
+ /* not supported in older versions */
+ .catname = NULL,
+ }
+};
+
+static const SchemaQuery Query_for_list_of_routines = {
+ .catname = "pg_catalog.pg_proc p",
+ .viscondition = "pg_catalog.pg_function_is_visible(p.oid)",
+ .namespace = "p.pronamespace",
+ .result = "p.proname",
+};
+
+static const SchemaQuery Query_for_list_of_sequences = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_SEQUENCE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_foreign_tables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_FOREIGN_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_tables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_partitioned_tables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_constraint = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_constraint con",
+ .selcondition = "c.oid=con.conrelid and c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "con.conname",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_policy = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_policy p",
+ .selcondition = "c.oid=p.polrelid",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "p.polname",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_rule = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_rewrite r",
+ .selcondition = "c.oid=r.ev_class",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "r.rulename",
+};
+
+static const SchemaQuery Query_for_list_of_tables_for_trigger = {
+ .catname = "pg_catalog.pg_class c, pg_catalog.pg_trigger t",
+ .selcondition = "c.oid=t.tgrelid",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+ .use_distinct = true,
+ .refname = "t.tgname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_configurations = {
+ .catname = "pg_catalog.pg_ts_config c",
+ .viscondition = "pg_catalog.pg_ts_config_is_visible(c.oid)",
+ .namespace = "c.cfgnamespace",
+ .result = "c.cfgname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_dictionaries = {
+ .catname = "pg_catalog.pg_ts_dict d",
+ .viscondition = "pg_catalog.pg_ts_dict_is_visible(d.oid)",
+ .namespace = "d.dictnamespace",
+ .result = "d.dictname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_parsers = {
+ .catname = "pg_catalog.pg_ts_parser p",
+ .viscondition = "pg_catalog.pg_ts_parser_is_visible(p.oid)",
+ .namespace = "p.prsnamespace",
+ .result = "p.prsname",
+};
+
+static const SchemaQuery Query_for_list_of_ts_templates = {
+ .catname = "pg_catalog.pg_ts_template t",
+ .viscondition = "pg_catalog.pg_ts_template_is_visible(t.oid)",
+ .namespace = "t.tmplnamespace",
+ .result = "t.tmplname",
+};
+
+static const SchemaQuery Query_for_list_of_views = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_VIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_matviews = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_MATVIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_indexes = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_INDEX) ", "
+ CppAsString2(RELKIND_PARTITIONED_INDEX) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_partitioned_indexes = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind = " CppAsString2(RELKIND_PARTITIONED_INDEX),
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+
+/* All relations */
+static const SchemaQuery Query_for_list_of_relations = {
+ .catname = "pg_catalog.pg_class c",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* partitioned relations */
+static const SchemaQuery Query_for_list_of_partitioned_relations = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition = "c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE)
+ ", " CppAsString2(RELKIND_PARTITIONED_INDEX) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_operator_families = {
+ .catname = "pg_catalog.pg_opfamily c",
+ .viscondition = "pg_catalog.pg_opfamily_is_visible(c.oid)",
+ .namespace = "c.opfnamespace",
+ .result = "c.opfname",
+};
+
+/* Relations supporting INSERT, UPDATE or DELETE */
+static const SchemaQuery Query_for_list_of_updatables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_VIEW) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting MERGE */
+static const SchemaQuery Query_for_list_of_mergetargets = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ") ",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting SELECT */
+static const SchemaQuery Query_for_list_of_selectables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_SEQUENCE) ", "
+ CppAsString2(RELKIND_VIEW) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting TRUNCATE */
+static const SchemaQuery Query_for_list_of_truncatables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting GRANT are currently same as those supporting SELECT */
+#define Query_for_list_of_grantables Query_for_list_of_selectables
+
+/* Relations supporting ANALYZE */
+static const SchemaQuery Query_for_list_of_analyzables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_FOREIGN_TABLE) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/* Relations supporting index creation */
+static const SchemaQuery Query_for_list_of_indexables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ", "
+ CppAsString2(RELKIND_MATVIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+/*
+ * Relations supporting VACUUM are currently same as those supporting
+ * indexing.
+ */
+#define Query_for_list_of_vacuumables Query_for_list_of_indexables
+
+/* Relations supporting CLUSTER */
+static const SchemaQuery Query_for_list_of_clusterables = {
+ .catname = "pg_catalog.pg_class c",
+ .selcondition =
+ "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_PARTITIONED_TABLE) ", "
+ CppAsString2(RELKIND_MATVIEW) ")",
+ .viscondition = "pg_catalog.pg_table_is_visible(c.oid)",
+ .namespace = "c.relnamespace",
+ .result = "c.relname",
+};
+
+static const SchemaQuery Query_for_list_of_constraints_with_schema = {
+ .catname = "pg_catalog.pg_constraint c",
+ .selcondition = "c.conrelid <> 0",
+ .namespace = "c.connamespace",
+ .result = "c.conname",
+};
+
+static const SchemaQuery Query_for_list_of_statistics = {
+ .catname = "pg_catalog.pg_statistic_ext s",
+ .viscondition = "pg_catalog.pg_statistics_obj_is_visible(s.oid)",
+ .namespace = "s.stxnamespace",
+ .result = "s.stxname",
+};
+
+static const SchemaQuery Query_for_list_of_collations = {
+ .catname = "pg_catalog.pg_collation c",
+ .selcondition = "c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))",
+ .viscondition = "pg_catalog.pg_collation_is_visible(c.oid)",
+ .namespace = "c.collnamespace",
+ .result = "c.collname",
+};
+
+static const SchemaQuery Query_for_partition_of_table = {
+ .catname = "pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i",
+ .selcondition = "c1.oid=i.inhparent and i.inhrelid=c2.oid and c2.relispartition",
+ .viscondition = "pg_catalog.pg_table_is_visible(c2.oid)",
+ .namespace = "c2.relnamespace",
+ .result = "c2.relname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_rule_of_table = {
+ .catname = "pg_catalog.pg_rewrite r, pg_catalog.pg_class c1",
+ .selcondition = "r.ev_class=c1.oid",
+ .result = "r.rulename",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+static const SchemaQuery Query_for_trigger_of_table = {
+ .catname = "pg_catalog.pg_trigger t, pg_catalog.pg_class c1",
+ .selcondition = "t.tgrelid=c1.oid and not t.tgisinternal",
+ .result = "t.tgname",
+ .refname = "c1.relname",
+ .refviscondition = "pg_catalog.pg_table_is_visible(c1.oid)",
+ .refnamespace = "c1.relnamespace",
+};
+
+
+/*
+ * Queries to get lists of names of various kinds of things, possibly
+ * restricted to names matching a partially entered name. Don't use
+ * this method where the user might wish to enter a schema-qualified
+ * name; make a SchemaQuery instead.
+ *
+ * In these queries, there must be a restriction clause of the form
+ * output LIKE '%s'
+ * where "output" is the same string that the query returns. The %s
+ * will be replaced by a LIKE pattern to match the already-typed text.
+ *
+ * There can be a second '%s', which will be replaced by a suitably-escaped
+ * version of the string provided in completion_ref_object. If there is a
+ * third '%s', it will be replaced by a suitably-escaped version of the string
+ * provided in completion_ref_schema. NOTE: using completion_ref_object
+ * that way is usually the wrong thing, and using completion_ref_schema
+ * that way is always the wrong thing. Make a SchemaQuery instead.
+ */
+
+#define Query_for_list_of_template_databases \
+"SELECT d.datname "\
+" FROM pg_catalog.pg_database d "\
+" WHERE d.datname LIKE '%s' "\
+" AND (d.datistemplate OR pg_catalog.pg_has_role(d.datdba, 'USAGE'))"
+
+#define Query_for_list_of_databases \
+"SELECT datname FROM pg_catalog.pg_database "\
+" WHERE datname LIKE '%s'"
+
+#define Query_for_list_of_tablespaces \
+"SELECT spcname FROM pg_catalog.pg_tablespace "\
+" WHERE spcname LIKE '%s'"
+
+#define Query_for_list_of_encodings \
+" SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
+" FROM pg_catalog.pg_conversion "\
+" WHERE pg_catalog.pg_encoding_to_char(conforencoding) LIKE pg_catalog.upper('%s')"
+
+#define Query_for_list_of_languages \
+"SELECT lanname "\
+" FROM pg_catalog.pg_language "\
+" WHERE lanname != 'internal' "\
+" AND lanname LIKE '%s'"
+
+#define Query_for_list_of_schemas \
+"SELECT nspname FROM pg_catalog.pg_namespace "\
+" WHERE nspname LIKE '%s'"
+
+/* Use COMPLETE_WITH_QUERY_VERBATIM with these queries for GUC names: */
+#define Query_for_list_of_alter_system_set_vars \
+"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
+" WHERE context != 'internal' "\
+" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_set_vars \
+"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
+" WHERE context IN ('user', 'superuser') "\
+" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_show_vars \
+"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
+" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_roles \
+" SELECT rolname "\
+" FROM pg_catalog.pg_roles "\
+" WHERE rolname LIKE '%s'"
+
+/* add these to Query_for_list_of_roles in GRANT contexts */
+#define Keywords_for_list_of_grant_roles \
+"PUBLIC", "CURRENT_ROLE", "CURRENT_USER", "SESSION_USER"
+
+#define Query_for_all_table_constraints \
+"SELECT conname "\
+" FROM pg_catalog.pg_constraint c "\
+" WHERE c.conrelid <> 0 "\
+" and conname LIKE '%s'"
+
+#define Query_for_list_of_fdws \
+" SELECT fdwname "\
+" FROM pg_catalog.pg_foreign_data_wrapper "\
+" WHERE fdwname LIKE '%s'"
+
+#define Query_for_list_of_servers \
+" SELECT srvname "\
+" FROM pg_catalog.pg_foreign_server "\
+" WHERE srvname LIKE '%s'"
+
+#define Query_for_list_of_user_mappings \
+" SELECT usename "\
+" FROM pg_catalog.pg_user_mappings "\
+" WHERE usename LIKE '%s'"
+
+#define Query_for_list_of_access_methods \
+" SELECT amname "\
+" FROM pg_catalog.pg_am "\
+" WHERE amname LIKE '%s'"
+
+#define Query_for_list_of_index_access_methods \
+" SELECT amname "\
+" FROM pg_catalog.pg_am "\
+" WHERE amname LIKE '%s' AND "\
+" amtype=" CppAsString2(AMTYPE_INDEX)
+
+#define Query_for_list_of_table_access_methods \
+" SELECT amname "\
+" FROM pg_catalog.pg_am "\
+" WHERE amname LIKE '%s' AND "\
+" amtype=" CppAsString2(AMTYPE_TABLE)
+
+#define Query_for_list_of_extensions \
+" SELECT extname "\
+" FROM pg_catalog.pg_extension "\
+" WHERE extname LIKE '%s'"
+
+#define Query_for_list_of_available_extensions \
+" SELECT name "\
+" FROM pg_catalog.pg_available_extensions "\
+" WHERE name LIKE '%s' AND installed_version IS NULL"
+
+#define Query_for_list_of_available_extension_versions \
+" SELECT version "\
+" FROM pg_catalog.pg_available_extension_versions "\
+" WHERE version LIKE '%s' AND name='%s'"
+
+#define Query_for_list_of_prepared_statements \
+" SELECT name "\
+" FROM pg_catalog.pg_prepared_statements "\
+" WHERE name LIKE '%s'"
+
+#define Query_for_list_of_event_triggers \
+" SELECT evtname "\
+" FROM pg_catalog.pg_event_trigger "\
+" WHERE evtname LIKE '%s'"
+
+#define Query_for_list_of_tablesample_methods \
+" SELECT proname "\
+" FROM pg_catalog.pg_proc "\
+" WHERE prorettype = 'pg_catalog.tsm_handler'::pg_catalog.regtype AND "\
+" proargtypes[0] = 'pg_catalog.internal'::pg_catalog.regtype AND "\
+" proname LIKE '%s'"
+
+#define Query_for_list_of_policies \
+" SELECT polname "\
+" FROM pg_catalog.pg_policy "\
+" WHERE polname LIKE '%s'"
+
+#define Query_for_values_of_enum_GUC \
+" SELECT val FROM ( "\
+" SELECT name, pg_catalog.unnest(enumvals) AS val "\
+" FROM pg_catalog.pg_settings "\
+" ) ss "\
+" WHERE val LIKE '%s'"\
+" and pg_catalog.lower(name)=pg_catalog.lower('%s')"
+
+#define Query_for_list_of_channels \
+" SELECT channel "\
+" FROM pg_catalog.pg_listening_channels() AS channel "\
+" WHERE channel LIKE '%s'"
+
+#define Query_for_list_of_cursors \
+" SELECT name "\
+" FROM pg_catalog.pg_cursors "\
+" WHERE name LIKE '%s'"
+
+#define Query_for_list_of_timezone_names_unquoted \
+" SELECT name "\
+" FROM pg_catalog.pg_timezone_names() "\
+" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_timezone_names_quoted_out \
+"SELECT pg_catalog.quote_literal(name) AS name "\
+" FROM pg_catalog.pg_timezone_names() "\
+" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
+
+#define Query_for_list_of_timezone_names_quoted_in \
+"SELECT pg_catalog.quote_literal(name) AS name "\
+" FROM pg_catalog.pg_timezone_names() "\
+" WHERE pg_catalog.quote_literal(pg_catalog.lower(name)) LIKE pg_catalog.lower('%s')"
+
+/* Privilege options shared between GRANT and REVOKE */
+#define Privilege_options_of_grant_and_revoke \
+"SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", \
+"CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", "SET", "ALTER SYSTEM", \
+"ALL"
+
+/* ALTER PROCEDURE options */
+#define Alter_procedure_options \
+"DEPENDS ON EXTENSION", "EXTERNAL SECURITY", "NO DEPENDS ON EXTENSION", \
+"OWNER TO", "RENAME TO", "RESET", "SECURITY", "SET"
+
+/* ALTER ROUTINE options */
+#define Alter_routine_options \
+Alter_procedure_options, "COST", "IMMUTABLE", "LEAKPROOF", "NOT LEAKPROOF", \
+"PARALLEL", "ROWS", "STABLE", "VOLATILE"
+
+/* ALTER FUNCTION options */
+#define Alter_function_options \
+Alter_routine_options, "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT", \
+"STRICT", "SUPPORT"
+
+/*
+ * These object types were introduced later than our support cutoff of
+ * server version 9.2. We use the VersionedQuery infrastructure so that
+ * we don't send certain-to-fail queries to older servers.
+ */
+
+static const VersionedQuery Query_for_list_of_publications[] = {
+ {100000,
+ " SELECT pubname "
+ " FROM pg_catalog.pg_publication "
+ " WHERE pubname LIKE '%s'"
+ },
+ {0, NULL}
+};
+
+static const VersionedQuery Query_for_list_of_subscriptions[] = {
+ {100000,
+ " SELECT s.subname "
+ " FROM pg_catalog.pg_subscription s, pg_catalog.pg_database d "
+ " WHERE s.subname LIKE '%s' "
+ " AND d.datname = pg_catalog.current_database() "
+ " AND s.subdbid = d.oid"
+ },
+ {0, NULL}
+};
+
+/*
+ * This is a list of all "things" in Pgsql, which can show up after CREATE or
+ * DROP; and there is also a query to get a list of them.
+ */
+
+typedef struct
+{
+ const char *name;
+ /* Provide at most one of these three types of query: */
+ const char *query; /* simple query, or NULL */
+ const VersionedQuery *vquery; /* versioned query, or NULL */
+ const SchemaQuery *squery; /* schema query, or NULL */
+ const char *const *keywords; /* keywords to be offered as well */
+ const bits32 flags; /* visibility flags, see below */
+} pgsql_thing_t;
+
+#define THING_NO_CREATE (1 << 0) /* should not show up after CREATE */
+#define THING_NO_DROP (1 << 1) /* should not show up after DROP */
+#define THING_NO_ALTER (1 << 2) /* should not show up after ALTER */
+#define THING_NO_SHOW (THING_NO_CREATE | THING_NO_DROP | THING_NO_ALTER)
+
+/* When we have DROP USER etc, also offer MAPPING FOR */
+static const char *const Keywords_for_user_thing[] = {
+ "MAPPING FOR",
+ NULL
+};
+
+static const pgsql_thing_t words_after_create[] = {
+ {"ACCESS METHOD", NULL, NULL, NULL, NULL, THING_NO_ALTER},
+ {"AGGREGATE", NULL, NULL, Query_for_list_of_aggregates},
+ {"CAST", NULL, NULL, NULL}, /* Casts have complex structures for names, so
+ * skip it */
+ {"COLLATION", NULL, NULL, &Query_for_list_of_collations},
+
+ /*
+ * CREATE CONSTRAINT TRIGGER is not supported here because it is designed
+ * to be used only by pg_dump.
+ */
+ {"CONFIGURATION", NULL, NULL, &Query_for_list_of_ts_configurations, NULL, THING_NO_SHOW},
+ {"CONVERSION", "SELECT conname FROM pg_catalog.pg_conversion WHERE conname LIKE '%s'"},
+ {"DATABASE", Query_for_list_of_databases},
+ {"DEFAULT PRIVILEGES", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
+ {"DICTIONARY", NULL, NULL, &Query_for_list_of_ts_dictionaries, NULL, THING_NO_SHOW},
+ {"DOMAIN", NULL, NULL, &Query_for_list_of_domains},
+ {"EVENT TRIGGER", NULL, NULL, NULL},
+ {"EXTENSION", Query_for_list_of_extensions},
+ {"FOREIGN DATA WRAPPER", NULL, NULL, NULL},
+ {"FOREIGN TABLE", NULL, NULL, NULL},
+ {"FUNCTION", NULL, NULL, Query_for_list_of_functions},
+ {"GROUP", Query_for_list_of_roles},
+ {"INDEX", NULL, NULL, &Query_for_list_of_indexes},
+ {"LANGUAGE", Query_for_list_of_languages},
+ {"LARGE OBJECT", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
+ {"MATERIALIZED VIEW", NULL, NULL, &Query_for_list_of_matviews},
+ {"OPERATOR", NULL, NULL, NULL}, /* Querying for this is probably not such
+ * a good idea. */
+ {"OR REPLACE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
+ {"OWNED", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_ALTER}, /* for DROP OWNED BY ... */
+ {"PARSER", NULL, NULL, &Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW},
+ {"POLICY", NULL, NULL, NULL},
+ {"PROCEDURE", NULL, NULL, Query_for_list_of_procedures},
+ {"PUBLICATION", NULL, Query_for_list_of_publications},
+ {"ROLE", Query_for_list_of_roles},
+ {"ROUTINE", NULL, NULL, &Query_for_list_of_routines, NULL, THING_NO_CREATE},
+ {"RULE", "SELECT rulename FROM pg_catalog.pg_rules WHERE rulename LIKE '%s'"},
+ {"SCHEMA", Query_for_list_of_schemas},
+ {"SEQUENCE", NULL, NULL, &Query_for_list_of_sequences},
+ {"SERVER", Query_for_list_of_servers},
+ {"STATISTICS", NULL, NULL, &Query_for_list_of_statistics},
+ {"SUBSCRIPTION", NULL, Query_for_list_of_subscriptions},
+ {"SYSTEM", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
+ {"TABLE", NULL, NULL, &Query_for_list_of_tables},
+ {"TABLESPACE", Query_for_list_of_tablespaces},
+ {"TEMP", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMP TABLE
+ * ... */
+ {"TEMPLATE", NULL, NULL, &Query_for_list_of_ts_templates, NULL, THING_NO_SHOW},
+ {"TEMPORARY", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE TEMPORARY
+ * TABLE ... */
+ {"TEXT SEARCH", NULL, NULL, NULL},
+ {"TRANSFORM", NULL, NULL, NULL, NULL, THING_NO_ALTER},
+ {"TRIGGER", "SELECT tgname FROM pg_catalog.pg_trigger WHERE tgname LIKE '%s' AND NOT tgisinternal"},
+ {"TYPE", NULL, NULL, &Query_for_list_of_datatypes},
+ {"UNIQUE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNIQUE
+ * INDEX ... */
+ {"UNLOGGED", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER}, /* for CREATE UNLOGGED
+ * TABLE ... */
+ {"USER", Query_for_list_of_roles, NULL, NULL, Keywords_for_user_thing},
+ {"USER MAPPING FOR", NULL, NULL, NULL},
+ {"VIEW", NULL, NULL, &Query_for_list_of_views},
+ {NULL} /* end of list */
+};
+
+/* Storage parameters for CREATE TABLE and ALTER TABLE */
+static const char *const table_storage_parameters[] = {
+ "autovacuum_analyze_scale_factor",
+ "autovacuum_analyze_threshold",
+ "autovacuum_enabled",
+ "autovacuum_freeze_max_age",
+ "autovacuum_freeze_min_age",
+ "autovacuum_freeze_table_age",
+ "autovacuum_multixact_freeze_max_age",
+ "autovacuum_multixact_freeze_min_age",
+ "autovacuum_multixact_freeze_table_age",
+ "autovacuum_vacuum_cost_delay",
+ "autovacuum_vacuum_cost_limit",
+ "autovacuum_vacuum_insert_scale_factor",
+ "autovacuum_vacuum_insert_threshold",
+ "autovacuum_vacuum_scale_factor",
+ "autovacuum_vacuum_threshold",
+ "fillfactor",
+ "log_autovacuum_min_duration",
+ "parallel_workers",
+ "toast.autovacuum_enabled",
+ "toast.autovacuum_freeze_max_age",
+ "toast.autovacuum_freeze_min_age",
+ "toast.autovacuum_freeze_table_age",
+ "toast.autovacuum_multixact_freeze_max_age",
+ "toast.autovacuum_multixact_freeze_min_age",
+ "toast.autovacuum_multixact_freeze_table_age",
+ "toast.autovacuum_vacuum_cost_delay",
+ "toast.autovacuum_vacuum_cost_limit",
+ "toast.autovacuum_vacuum_insert_scale_factor",
+ "toast.autovacuum_vacuum_insert_threshold",
+ "toast.autovacuum_vacuum_scale_factor",
+ "toast.autovacuum_vacuum_threshold",
+ "toast.log_autovacuum_min_duration",
+ "toast.vacuum_index_cleanup",
+ "toast.vacuum_truncate",
+ "toast_tuple_target",
+ "user_catalog_table",
+ "vacuum_index_cleanup",
+ "vacuum_truncate",
+ NULL
+};
+
+
+/* Forward declaration of functions */
+static char **psql_completion(const char *text, int start, int end);
+static char *create_command_generator(const char *text, int state);
+static char *drop_command_generator(const char *text, int state);
+static char *alter_command_generator(const char *text, int state);
+static char *complete_from_query(const char *text, int state);
+static char *complete_from_versioned_query(const char *text, int state);
+static char *complete_from_schema_query(const char *text, int state);
+static char *complete_from_versioned_schema_query(const char *text, int state);
+static char *_complete_from_query(const char *simple_query,
+ const SchemaQuery *schema_query,
+ const char *const *keywords,
+ bool verbatim,
+ const char *text, int state);
+static void set_completion_reference(const char *word);
+static void set_completion_reference_verbatim(const char *word);
+static char *complete_from_list(const char *text, int state);
+static char *complete_from_const(const char *text, int state);
+static void append_variable_names(char ***varnames, int *nvars,
+ int *maxvars, const char *varname,
+ const char *prefix, const char *suffix);
+static char **complete_from_variables(const char *text,
+ const char *prefix, const char *suffix, bool need_value);
+static char *complete_from_files(const char *text, int state);
+
+static char *pg_strdup_keyword_case(const char *s, const char *ref);
+static char *escape_string(const char *text);
+static char *make_like_pattern(const char *word);
+static void parse_identifier(const char *ident,
+ char **schemaname, char **objectname,
+ bool *schemaquoted, bool *objectquoted);
+static char *requote_identifier(const char *schemaname, const char *objectname,
+ bool quote_schema, bool quote_object);
+static bool identifier_needs_quotes(const char *ident);
+static PGresult *exec_query(const char *query);
+
+static char **get_previous_words(int point, char **buffer, int *nwords);
+
+static char *get_guctype(const char *varname);
+
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+static char *quote_file_name(char *fname, int match_type, char *quote_pointer);
+static char *dequote_file_name(char *fname, int quote_char);
+#endif
+
+
+/*
+ * Initialize the readline library for our purposes.
+ */
+void
+initialize_readline(void)
+{
+ rl_readline_name = (char *) pset.progname;
+ rl_attempted_completion_function = psql_completion;
+
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+ rl_filename_quoting_function = quote_file_name;
+ rl_filename_dequoting_function = dequote_file_name;
+#endif
+
+ rl_basic_word_break_characters = WORD_BREAKS;
+
+ /*
+ * Ideally we'd include '"' in rl_completer_quote_characters too, which
+ * should allow us to complete quoted identifiers that include spaces.
+ * However, the library support for rl_completer_quote_characters is
+ * presently too inconsistent to want to mess with that. (Note in
+ * particular that libedit has this variable but completely ignores it.)
+ */
+ rl_completer_quote_characters = "'";
+
+ /*
+ * Set rl_filename_quote_characters to "all possible characters",
+ * otherwise Readline will skip filename quoting if it thinks a filename
+ * doesn't need quoting. Readline actually interprets this as bytes, so
+ * there are no encoding considerations here.
+ */
+#ifdef HAVE_RL_FILENAME_QUOTE_CHARACTERS
+ {
+ unsigned char *fqc = (unsigned char *) pg_malloc(256);
+
+ for (int i = 0; i < 255; i++)
+ fqc[i] = (unsigned char) (i + 1);
+ fqc[255] = '\0';
+ rl_filename_quote_characters = (const char *) fqc;
+ }
+#endif
+
+ completion_max_records = 1000;
+
+ /*
+ * There is a variable rl_completion_query_items for this but apparently
+ * it's not defined everywhere.
+ */
+}
+
+/*
+ * Check if 'word' matches any of the '|'-separated strings in 'pattern',
+ * using case-insensitive or case-sensitive comparisons.
+ *
+ * If pattern is NULL, it's a wild card that matches any word.
+ * If pattern begins with '!', the result is negated, ie we check that 'word'
+ * does *not* match any alternative appearing in the rest of 'pattern'.
+ * Any alternative can contain '*' which is a wild card, i.e., it can match
+ * any substring; however, we allow at most one '*' per alternative.
+ *
+ * For readability, callers should use the macros MatchAny and MatchAnyExcept
+ * to invoke those two special cases for 'pattern'. (But '|' and '*' must
+ * just be written directly in patterns.)
+ */
+#define MatchAny NULL
+#define MatchAnyExcept(pattern) ("!" pattern)
+
+static bool
+word_matches(const char *pattern,
+ const char *word,
+ bool case_sensitive)
+{
+ size_t wordlen;
+
+#define cimatch(s1, s2, n) \
+ (case_sensitive ? strncmp(s1, s2, n) == 0 : pg_strncasecmp(s1, s2, n) == 0)
+
+ /* NULL pattern matches anything. */
+ if (pattern == NULL)
+ return true;
+
+ /* Handle negated patterns from the MatchAnyExcept macro. */
+ if (*pattern == '!')
+ return !word_matches(pattern + 1, word, case_sensitive);
+
+ /* Else consider each alternative in the pattern. */
+ wordlen = strlen(word);
+ for (;;)
+ {
+ const char *star = NULL;
+ const char *c;
+
+ /* Find end of current alternative, and locate any wild card. */
+ c = pattern;
+ while (*c != '\0' && *c != '|')
+ {
+ if (*c == '*')
+ star = c;
+ c++;
+ }
+ /* Was there a wild card? */
+ if (star)
+ {
+ /* Yes, wildcard match? */
+ size_t beforelen = star - pattern,
+ afterlen = c - star - 1;
+
+ if (wordlen >= (beforelen + afterlen) &&
+ cimatch(word, pattern, beforelen) &&
+ cimatch(word + wordlen - afterlen, star + 1, afterlen))
+ return true;
+ }
+ else
+ {
+ /* No, plain match? */
+ if (wordlen == (c - pattern) &&
+ cimatch(word, pattern, wordlen))
+ return true;
+ }
+ /* Out of alternatives? */
+ if (*c == '\0')
+ break;
+ /* Nope, try next alternative. */
+ pattern = c + 1;
+ }
+
+ return false;
+}
+
+/*
+ * Implementation of TailMatches and TailMatchesCS macros: do the last N words
+ * in previous_words match the variadic arguments?
+ *
+ * The array indexing might look backwards, but remember that
+ * previous_words[0] contains the *last* word on the line, not the first.
+ */
+static bool
+TailMatchesImpl(bool case_sensitive,
+ int previous_words_count, char **previous_words,
+ int narg,...)
+{
+ va_list args;
+
+ if (previous_words_count < narg)
+ return false;
+
+ va_start(args, narg);
+
+ for (int argno = 0; argno < narg; argno++)
+ {
+ const char *arg = va_arg(args, const char *);
+
+ if (!word_matches(arg, previous_words[narg - argno - 1],
+ case_sensitive))
+ {
+ va_end(args);
+ return false;
+ }
+ }
+
+ va_end(args);
+
+ return true;
+}
+
+/*
+ * Implementation of Matches and MatchesCS macros: do all of the words
+ * in previous_words match the variadic arguments?
+ */
+static bool
+MatchesImpl(bool case_sensitive,
+ int previous_words_count, char **previous_words,
+ int narg,...)
+{
+ va_list args;
+
+ if (previous_words_count != narg)
+ return false;
+
+ va_start(args, narg);
+
+ for (int argno = 0; argno < narg; argno++)
+ {
+ const char *arg = va_arg(args, const char *);
+
+ if (!word_matches(arg, previous_words[narg - argno - 1],
+ case_sensitive))
+ {
+ va_end(args);
+ return false;
+ }
+ }
+
+ va_end(args);
+
+ return true;
+}
+
+/*
+ * Implementation of HeadMatches and HeadMatchesCS macros: do the first N
+ * words in previous_words match the variadic arguments?
+ */
+static bool
+HeadMatchesImpl(bool case_sensitive,
+ int previous_words_count, char **previous_words,
+ int narg,...)
+{
+ va_list args;
+
+ if (previous_words_count < narg)
+ return false;
+
+ va_start(args, narg);
+
+ for (int argno = 0; argno < narg; argno++)
+ {
+ const char *arg = va_arg(args, const char *);
+
+ if (!word_matches(arg, previous_words[previous_words_count - argno - 1],
+ case_sensitive))
+ {
+ va_end(args);
+ return false;
+ }
+ }
+
+ va_end(args);
+
+ return true;
+}
+
+/*
+ * Check if the final character of 's' is 'c'.
+ */
+static bool
+ends_with(const char *s, char c)
+{
+ size_t length = strlen(s);
+
+ return (length > 0 && s[length - 1] == c);
+}
+
+/*
+ * The completion function.
+ *
+ * According to readline spec this gets passed the text entered so far and its
+ * start and end positions in the readline buffer. The return value is some
+ * partially obscure list format that can be generated by readline's
+ * rl_completion_matches() function, so we don't have to worry about it.
+ */
+static char **
+psql_completion(const char *text, int start, int end)
+{
+ /* This is the variable we'll return. */
+ char **matches = NULL;
+
+ /* Workspace for parsed words. */
+ char *words_buffer;
+
+ /* This array will contain pointers to parsed words. */
+ char **previous_words;
+
+ /* The number of words found on the input line. */
+ int previous_words_count;
+
+ /*
+ * For compactness, we use these macros to reference previous_words[].
+ * Caution: do not access a previous_words[] entry without having checked
+ * previous_words_count to be sure it's valid. In most cases below, that
+ * check is implicit in a TailMatches() or similar macro, but in some
+ * places we have to check it explicitly.
+ */
+#define prev_wd (previous_words[0])
+#define prev2_wd (previous_words[1])
+#define prev3_wd (previous_words[2])
+#define prev4_wd (previous_words[3])
+#define prev5_wd (previous_words[4])
+#define prev6_wd (previous_words[5])
+#define prev7_wd (previous_words[6])
+#define prev8_wd (previous_words[7])
+#define prev9_wd (previous_words[8])
+
+ /* Match the last N words before point, case-insensitively. */
+#define TailMatches(...) \
+ TailMatchesImpl(false, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match the last N words before point, case-sensitively. */
+#define TailMatchesCS(...) \
+ TailMatchesImpl(true, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match N words representing all of the line, case-insensitively. */
+#define Matches(...) \
+ MatchesImpl(false, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match N words representing all of the line, case-sensitively. */
+#define MatchesCS(...) \
+ MatchesImpl(true, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match the first N words on the line, case-insensitively. */
+#define HeadMatches(...) \
+ HeadMatchesImpl(false, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Match the first N words on the line, case-sensitively. */
+#define HeadMatchesCS(...) \
+ HeadMatchesImpl(true, previous_words_count, previous_words, \
+ VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
+
+ /* Known command-starting keywords. */
+ static const char *const sql_commands[] = {
+ "ABORT", "ALTER", "ANALYZE", "BEGIN", "CALL", "CHECKPOINT", "CLOSE", "CLUSTER",
+ "COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE",
+ "DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN",
+ "FETCH", "GRANT", "IMPORT FOREIGN SCHEMA", "INSERT INTO", "LISTEN", "LOAD", "LOCK",
+ "MERGE INTO", "MOVE", "NOTIFY", "PREPARE",
+ "REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE",
+ "RESET", "REVOKE", "ROLLBACK",
+ "SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START",
+ "TABLE", "TRUNCATE", "UNLISTEN", "UPDATE", "VACUUM", "VALUES", "WITH",
+ NULL
+ };
+
+ /* psql's backslash commands. */
+ static const char *const backslash_commands[] = {
+ "\\a",
+ "\\bind",
+ "\\connect", "\\conninfo", "\\C", "\\cd", "\\copy",
+ "\\copyright", "\\crosstabview",
+ "\\d", "\\da", "\\dA", "\\dAc", "\\dAf", "\\dAo", "\\dAp",
+ "\\db", "\\dc", "\\dconfig", "\\dC", "\\dd", "\\ddp", "\\dD",
+ "\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df",
+ "\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL",
+ "\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt",
+ "\\drds", "\\drg", "\\dRs", "\\dRp", "\\ds",
+ "\\dt", "\\dT", "\\dv", "\\du", "\\dx", "\\dX", "\\dy",
+ "\\echo", "\\edit", "\\ef", "\\elif", "\\else", "\\encoding",
+ "\\endif", "\\errverbose", "\\ev",
+ "\\f",
+ "\\g", "\\gdesc", "\\getenv", "\\gexec", "\\gset", "\\gx",
+ "\\help", "\\html",
+ "\\if", "\\include", "\\include_relative", "\\ir",
+ "\\list", "\\lo_import", "\\lo_export", "\\lo_list", "\\lo_unlink",
+ "\\out",
+ "\\password", "\\print", "\\prompt", "\\pset",
+ "\\qecho", "\\quit",
+ "\\reset",
+ "\\s", "\\set", "\\setenv", "\\sf", "\\sv",
+ "\\t", "\\T", "\\timing",
+ "\\unset",
+ "\\x",
+ "\\warn", "\\watch", "\\write",
+ "\\z",
+ "\\!", "\\?",
+ NULL
+ };
+
+ /*
+ * Temporary workaround for a bug in recent (2019) libedit: it incorrectly
+ * de-escapes the input "text", causing us to fail to recognize backslash
+ * commands. So get the string to look at from rl_line_buffer instead.
+ */
+ char *text_copy = pnstrdup(rl_line_buffer + start, end - start);
+ text = text_copy;
+
+ /* Remember last char of the given input word. */
+ completion_last_char = (end > start) ? text[end - start - 1] : '\0';
+
+ /* We usually want the append character to be a space. */
+ rl_completion_append_character = ' ';
+
+ /* Clear a few things. */
+ completion_charp = NULL;
+ completion_charpp = NULL;
+ completion_vquery = NULL;
+ completion_squery = NULL;
+ completion_ref_object = NULL;
+ completion_ref_schema = NULL;
+
+ /*
+ * Scan the input line to extract the words before our current position.
+ * According to those we'll make some smart decisions on what the user is
+ * probably intending to type.
+ */
+ previous_words = get_previous_words(start,
+ &words_buffer,
+ &previous_words_count);
+
+ /* If current word is a backslash command, offer completions for that */
+ if (text[0] == '\\')
+ COMPLETE_WITH_LIST_CS(backslash_commands);
+
+ /* If current word is a variable interpolation, handle that case */
+ else if (text[0] == ':' && text[1] != ':')
+ {
+ if (text[1] == '\'')
+ matches = complete_from_variables(text, ":'", "'", true);
+ else if (text[1] == '"')
+ matches = complete_from_variables(text, ":\"", "\"", true);
+ else
+ matches = complete_from_variables(text, ":", "", true);
+ }
+
+ /* If no previous word, suggest one of the basic sql commands */
+ else if (previous_words_count == 0)
+ COMPLETE_WITH_LIST(sql_commands);
+
+/* CREATE */
+ /* complete with something you can create */
+ else if (TailMatches("CREATE"))
+ matches = rl_completion_matches(text, create_command_generator);
+
+ /* complete with something you can create or replace */
+ else if (TailMatches("CREATE", "OR", "REPLACE"))
+ COMPLETE_WITH("FUNCTION", "PROCEDURE", "LANGUAGE", "RULE", "VIEW",
+ "AGGREGATE", "TRANSFORM", "TRIGGER");
+
+/* DROP, but not DROP embedded in other commands */
+ /* complete with something you can drop */
+ else if (Matches("DROP"))
+ matches = rl_completion_matches(text, drop_command_generator);
+
+/* ALTER */
+
+ /* ALTER TABLE */
+ else if (Matches("ALTER", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
+ "ALL IN TABLESPACE");
+
+ /* ALTER something */
+ else if (Matches("ALTER"))
+ matches = rl_completion_matches(text, alter_command_generator);
+ /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx */
+ else if (TailMatches("ALL", "IN", "TABLESPACE", MatchAny))
+ COMPLETE_WITH("SET TABLESPACE", "OWNED BY");
+ /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx OWNED BY */
+ else if (TailMatches("ALL", "IN", "TABLESPACE", MatchAny, "OWNED", "BY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx OWNED BY xxx */
+ else if (TailMatches("ALL", "IN", "TABLESPACE", MatchAny, "OWNED", "BY", MatchAny))
+ COMPLETE_WITH("SET TABLESPACE");
+ /* ALTER AGGREGATE,FUNCTION,PROCEDURE,ROUTINE <name> */
+ else if (Matches("ALTER", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
+ COMPLETE_WITH("(");
+ /* ALTER AGGREGATE <name> (...) */
+ else if (Matches("ALTER", "AGGREGATE", MatchAny, MatchAny))
+ {
+ if (ends_with(prev_wd, ')'))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA");
+ else
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ }
+ /* ALTER FUNCTION <name> (...) */
+ else if (Matches("ALTER", "FUNCTION", MatchAny, MatchAny))
+ {
+ if (ends_with(prev_wd, ')'))
+ COMPLETE_WITH(Alter_function_options);
+ else
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ }
+ /* ALTER PROCEDURE <name> (...) */
+ else if (Matches("ALTER", "PROCEDURE", MatchAny, MatchAny))
+ {
+ if (ends_with(prev_wd, ')'))
+ COMPLETE_WITH(Alter_procedure_options);
+ else
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ }
+ /* ALTER ROUTINE <name> (...) */
+ else if (Matches("ALTER", "ROUTINE", MatchAny, MatchAny))
+ {
+ if (ends_with(prev_wd, ')'))
+ COMPLETE_WITH(Alter_routine_options);
+ else
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ }
+ /* ALTER FUNCTION|ROUTINE <name> (...) PARALLEL */
+ else if (Matches("ALTER", "FUNCTION|ROUTINE", MatchAny, MatchAny, "PARALLEL"))
+ COMPLETE_WITH("RESTRICTED", "SAFE", "UNSAFE");
+ /* ALTER FUNCTION|PROCEDURE|ROUTINE <name> (...) [EXTERNAL] SECURITY */
+ else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "SECURITY") ||
+ Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "EXTERNAL", "SECURITY"))
+ COMPLETE_WITH("DEFINER", "INVOKER");
+ /* ALTER FUNCTION|PROCEDURE|ROUTINE <name> (...) RESET */
+ else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "RESET"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
+ "ALL");
+ /* ALTER FUNCTION|PROCEDURE|ROUTINE <name> (...) SET */
+ else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "SET"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
+ "SCHEMA");
+
+ /* ALTER PUBLICATION <name> */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny))
+ COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME TO", "SET");
+ /* ALTER PUBLICATION <name> ADD */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD"))
+ COMPLETE_WITH("TABLES IN SCHEMA", "TABLE");
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") ||
+ (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") &&
+ ends_with(prev_wd, ',')))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+ /*
+ * "ALTER PUBLICATION <name> SET TABLE <name> WHERE (" - complete with
+ * table attributes
+ *
+ * "ALTER PUBLICATION <name> ADD TABLE <name> WHERE (" - complete with
+ * table attributes
+ */
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("WHERE"))
+ COMPLETE_WITH("(");
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("WHERE", "("))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE") &&
+ !TailMatches("WHERE", "(*)"))
+ COMPLETE_WITH(",", "WHERE (");
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny, "ADD|SET", "TABLE"))
+ COMPLETE_WITH(",");
+ /* ALTER PUBLICATION <name> DROP */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "DROP"))
+ COMPLETE_WITH("TABLES IN SCHEMA", "TABLE");
+ /* ALTER PUBLICATION <name> SET */
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "SET"))
+ COMPLETE_WITH("(", "TABLES IN SCHEMA", "TABLE");
+ else if (Matches("ALTER", "PUBLICATION", MatchAny, "ADD|DROP|SET", "TABLES", "IN", "SCHEMA"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
+ " AND nspname NOT LIKE E'pg\\\\_%%'",
+ "CURRENT_SCHEMA");
+ /* ALTER PUBLICATION <name> SET ( */
+ else if (HeadMatches("ALTER", "PUBLICATION", MatchAny) && TailMatches("SET", "("))
+ COMPLETE_WITH("publish", "publish_via_partition_root");
+ /* ALTER SUBSCRIPTION <name> */
+ else if (Matches("ALTER", "SUBSCRIPTION", MatchAny))
+ COMPLETE_WITH("CONNECTION", "ENABLE", "DISABLE", "OWNER TO",
+ "RENAME TO", "REFRESH PUBLICATION", "SET", "SKIP (",
+ "ADD PUBLICATION", "DROP PUBLICATION");
+ /* ALTER SUBSCRIPTION <name> REFRESH PUBLICATION */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("REFRESH", "PUBLICATION"))
+ COMPLETE_WITH("WITH (");
+ /* ALTER SUBSCRIPTION <name> REFRESH PUBLICATION WITH ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("REFRESH", "PUBLICATION", "WITH", "("))
+ COMPLETE_WITH("copy_data");
+ /* ALTER SUBSCRIPTION <name> SET */
+ else if (Matches("ALTER", "SUBSCRIPTION", MatchAny, "SET"))
+ COMPLETE_WITH("(", "PUBLICATION");
+ /* ALTER SUBSCRIPTION <name> SET ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "("))
+ COMPLETE_WITH("binary", "disable_on_error", "origin",
+ "password_required", "run_as_owner", "slot_name",
+ "streaming", "synchronous_commit");
+ /* ALTER SUBSCRIPTION <name> SKIP ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SKIP", "("))
+ COMPLETE_WITH("lsn");
+ /* ALTER SUBSCRIPTION <name> SET PUBLICATION */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "PUBLICATION"))
+ {
+ /* complete with nothing here as this refers to remote publications */
+ }
+ /* ALTER SUBSCRIPTION <name> ADD|DROP|SET PUBLICATION <name> */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("ADD|DROP|SET", "PUBLICATION", MatchAny))
+ COMPLETE_WITH("WITH (");
+ /* ALTER SUBSCRIPTION <name> ADD|DROP|SET PUBLICATION <name> WITH ( */
+ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) &&
+ TailMatches("ADD|DROP|SET", "PUBLICATION", MatchAny, "WITH", "("))
+ COMPLETE_WITH("copy_data", "refresh");
+
+ /* ALTER SCHEMA <name> */
+ else if (Matches("ALTER", "SCHEMA", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO");
+
+ /* ALTER COLLATION <name> */
+ else if (Matches("ALTER", "COLLATION", MatchAny))
+ COMPLETE_WITH("OWNER TO", "REFRESH VERSION", "RENAME TO", "SET SCHEMA");
+
+ /* ALTER CONVERSION <name> */
+ else if (Matches("ALTER", "CONVERSION", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA");
+
+ /* ALTER DATABASE <name> */
+ else if (Matches("ALTER", "DATABASE", MatchAny))
+ COMPLETE_WITH("RESET", "SET", "OWNER TO", "REFRESH COLLATION VERSION", "RENAME TO",
+ "IS_TEMPLATE", "ALLOW_CONNECTIONS",
+ "CONNECTION LIMIT");
+
+ /* ALTER DATABASE <name> SET TABLESPACE */
+ else if (Matches("ALTER", "DATABASE", MatchAny, "SET", "TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+
+ /* ALTER EVENT TRIGGER */
+ else if (Matches("ALTER", "EVENT", "TRIGGER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+
+ /* ALTER EVENT TRIGGER <name> */
+ else if (Matches("ALTER", "EVENT", "TRIGGER", MatchAny))
+ COMPLETE_WITH("DISABLE", "ENABLE", "OWNER TO", "RENAME TO");
+
+ /* ALTER EVENT TRIGGER <name> ENABLE */
+ else if (Matches("ALTER", "EVENT", "TRIGGER", MatchAny, "ENABLE"))
+ COMPLETE_WITH("REPLICA", "ALWAYS");
+
+ /* ALTER EXTENSION <name> */
+ else if (Matches("ALTER", "EXTENSION", MatchAny))
+ COMPLETE_WITH("ADD", "DROP", "UPDATE", "SET SCHEMA");
+
+ /* ALTER EXTENSION <name> ADD|DROP */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "ADD|DROP"))
+ COMPLETE_WITH("ACCESS METHOD", "AGGREGATE", "CAST", "COLLATION",
+ "CONVERSION", "DOMAIN", "EVENT TRIGGER", "FOREIGN",
+ "FUNCTION", "MATERIALIZED VIEW", "OPERATOR",
+ "LANGUAGE", "PROCEDURE", "ROUTINE", "SCHEMA",
+ "SEQUENCE", "SERVER", "TABLE", "TEXT SEARCH",
+ "TRANSFORM FOR", "TYPE", "VIEW");
+
+ /* ALTER EXTENSION <name> ADD|DROP FOREIGN */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "ADD|DROP", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+
+ /* ALTER EXTENSION <name> ADD|DROP OPERATOR */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "ADD|DROP", "OPERATOR"))
+ COMPLETE_WITH("CLASS", "FAMILY");
+
+ /* ALTER EXTENSION <name> ADD|DROP TEXT SEARCH */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "ADD|DROP", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+
+ /* ALTER EXTENSION <name> UPDATE */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "UPDATE"))
+ COMPLETE_WITH("TO");
+
+ /* ALTER EXTENSION <name> UPDATE TO */
+ else if (Matches("ALTER", "EXTENSION", MatchAny, "UPDATE", "TO"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
+ }
+
+ /* ALTER FOREIGN */
+ else if (Matches("ALTER", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+
+ /* ALTER FOREIGN DATA WRAPPER <name> */
+ else if (Matches("ALTER", "FOREIGN", "DATA", "WRAPPER", MatchAny))
+ COMPLETE_WITH("HANDLER", "VALIDATOR", "NO",
+ "OPTIONS", "OWNER TO", "RENAME TO");
+ else if (Matches("ALTER", "FOREIGN", "DATA", "WRAPPER", MatchAny, "NO"))
+ COMPLETE_WITH("HANDLER", "VALIDATOR");
+
+ /* ALTER FOREIGN TABLE <name> */
+ else if (Matches("ALTER", "FOREIGN", "TABLE", MatchAny))
+ COMPLETE_WITH("ADD", "ALTER", "DISABLE TRIGGER", "DROP", "ENABLE",
+ "INHERIT", "NO INHERIT", "OPTIONS", "OWNER TO",
+ "RENAME", "SET", "VALIDATE CONSTRAINT");
+
+ /* ALTER INDEX */
+ else if (Matches("ALTER", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "ALL IN TABLESPACE");
+ /* ALTER INDEX <name> */
+ else if (Matches("ALTER", "INDEX", MatchAny))
+ COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME TO", "SET",
+ "RESET", "ATTACH PARTITION",
+ "DEPENDS ON EXTENSION", "NO DEPENDS ON EXTENSION");
+ else if (Matches("ALTER", "INDEX", MatchAny, "ATTACH"))
+ COMPLETE_WITH("PARTITION");
+ else if (Matches("ALTER", "INDEX", MatchAny, "ATTACH", "PARTITION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ /* ALTER INDEX <name> ALTER */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER"))
+ COMPLETE_WITH("COLUMN");
+ /* ALTER INDEX <name> ALTER COLUMN */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(Query_for_list_of_attribute_numbers);
+ }
+ /* ALTER INDEX <name> ALTER COLUMN <colnum> */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny))
+ COMPLETE_WITH("SET STATISTICS");
+ /* ALTER INDEX <name> ALTER COLUMN <colnum> SET */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny, "SET"))
+ COMPLETE_WITH("STATISTICS");
+ /* ALTER INDEX <name> ALTER COLUMN <colnum> SET STATISTICS */
+ else if (Matches("ALTER", "INDEX", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STATISTICS"))
+ {
+ /* Enforce no completion here, as an integer has to be specified */
+ }
+ /* ALTER INDEX <name> SET */
+ else if (Matches("ALTER", "INDEX", MatchAny, "SET"))
+ COMPLETE_WITH("(", "TABLESPACE");
+ /* ALTER INDEX <name> RESET */
+ else if (Matches("ALTER", "INDEX", MatchAny, "RESET"))
+ COMPLETE_WITH("(");
+ /* ALTER INDEX <foo> SET|RESET ( */
+ else if (Matches("ALTER", "INDEX", MatchAny, "RESET", "("))
+ COMPLETE_WITH("fillfactor",
+ "deduplicate_items", /* BTREE */
+ "fastupdate", "gin_pending_list_limit", /* GIN */
+ "buffering", /* GiST */
+ "pages_per_range", "autosummarize" /* BRIN */
+ );
+ else if (Matches("ALTER", "INDEX", MatchAny, "SET", "("))
+ COMPLETE_WITH("fillfactor =",
+ "deduplicate_items =", /* BTREE */
+ "fastupdate =", "gin_pending_list_limit =", /* GIN */
+ "buffering =", /* GiST */
+ "pages_per_range =", "autosummarize =" /* BRIN */
+ );
+ else if (Matches("ALTER", "INDEX", MatchAny, "NO", "DEPENDS"))
+ COMPLETE_WITH("ON EXTENSION");
+ else if (Matches("ALTER", "INDEX", MatchAny, "DEPENDS"))
+ COMPLETE_WITH("ON EXTENSION");
+
+ /* ALTER LANGUAGE <name> */
+ else if (Matches("ALTER", "LANGUAGE", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO");
+
+ /* ALTER LARGE OBJECT <oid> */
+ else if (Matches("ALTER", "LARGE", "OBJECT", MatchAny))
+ COMPLETE_WITH("OWNER TO");
+
+ /* ALTER MATERIALIZED VIEW */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
+ "ALL IN TABLESPACE");
+
+ /* ALTER USER,ROLE <name> */
+ else if (Matches("ALTER", "USER|ROLE", MatchAny) &&
+ !TailMatches("USER", "MAPPING"))
+ COMPLETE_WITH("BYPASSRLS", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE",
+ "ENCRYPTED PASSWORD", "INHERIT", "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "RENAME TO", "REPLICATION", "RESET", "SET", "SUPERUSER",
+ "VALID UNTIL", "WITH");
+
+ /* ALTER USER,ROLE <name> WITH */
+ else if (Matches("ALTER", "USER|ROLE", MatchAny, "WITH"))
+ /* Similar to the above, but don't complete "WITH" again. */
+ COMPLETE_WITH("BYPASSRLS", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE",
+ "ENCRYPTED PASSWORD", "INHERIT", "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "RENAME TO", "REPLICATION", "RESET", "SET", "SUPERUSER",
+ "VALID UNTIL");
+
+ /* ALTER DEFAULT PRIVILEGES */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES"))
+ COMPLETE_WITH("FOR ROLE", "IN SCHEMA");
+ /* ALTER DEFAULT PRIVILEGES FOR */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR"))
+ COMPLETE_WITH("ROLE");
+ /* ALTER DEFAULT PRIVILEGES IN */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN"))
+ COMPLETE_WITH("SCHEMA");
+ /* ALTER DEFAULT PRIVILEGES FOR ROLE|USER ... */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER",
+ MatchAny))
+ COMPLETE_WITH("GRANT", "REVOKE", "IN SCHEMA");
+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",
+ MatchAny))
+ COMPLETE_WITH("GRANT", "REVOKE", "FOR ROLE");
+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... FOR */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",
+ MatchAny, "FOR"))
+ COMPLETE_WITH("ROLE");
+ /* ALTER DEFAULT PRIVILEGES FOR ROLE|USER ... IN SCHEMA ... */
+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... FOR ROLE|USER ... */
+ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER",
+ MatchAny, "IN", "SCHEMA", MatchAny) ||
+ Matches("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",
+ MatchAny, "FOR", "ROLE|USER", MatchAny))
+ COMPLETE_WITH("GRANT", "REVOKE");
+ /* ALTER DOMAIN <name> */
+ else if (Matches("ALTER", "DOMAIN", MatchAny))
+ COMPLETE_WITH("ADD", "DROP", "OWNER TO", "RENAME", "SET",
+ "VALIDATE CONSTRAINT");
+ /* ALTER DOMAIN <sth> DROP */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "DROP"))
+ COMPLETE_WITH("CONSTRAINT", "DEFAULT", "NOT NULL");
+ /* ALTER DOMAIN <sth> DROP|RENAME|VALIDATE CONSTRAINT */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "DROP|RENAME|VALIDATE", "CONSTRAINT"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_type);
+ }
+ /* ALTER DOMAIN <sth> RENAME */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "RENAME"))
+ COMPLETE_WITH("CONSTRAINT", "TO");
+ /* ALTER DOMAIN <sth> RENAME CONSTRAINT <sth> */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "RENAME", "CONSTRAINT", MatchAny))
+ COMPLETE_WITH("TO");
+
+ /* ALTER DOMAIN <sth> SET */
+ else if (Matches("ALTER", "DOMAIN", MatchAny, "SET"))
+ COMPLETE_WITH("DEFAULT", "NOT NULL", "SCHEMA");
+ /* ALTER SEQUENCE <name> */
+ else if (Matches("ALTER", "SEQUENCE", MatchAny))
+ COMPLETE_WITH("AS", "INCREMENT", "MINVALUE", "MAXVALUE", "RESTART",
+ "START", "NO", "CACHE", "CYCLE", "SET", "OWNED BY",
+ "OWNER TO", "RENAME TO");
+ /* ALTER SEQUENCE <name> AS */
+ else if (TailMatches("ALTER", "SEQUENCE", MatchAny, "AS"))
+ COMPLETE_WITH_CS("smallint", "integer", "bigint");
+ /* ALTER SEQUENCE <name> NO */
+ else if (Matches("ALTER", "SEQUENCE", MatchAny, "NO"))
+ COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
+ /* ALTER SEQUENCE <name> SET */
+ else if (Matches("ALTER", "SEQUENCE", MatchAny, "SET"))
+ COMPLETE_WITH("SCHEMA", "LOGGED", "UNLOGGED");
+ /* ALTER SERVER <name> */
+ else if (Matches("ALTER", "SERVER", MatchAny))
+ COMPLETE_WITH("VERSION", "OPTIONS", "OWNER TO", "RENAME TO");
+ /* ALTER SERVER <name> VERSION <version> */
+ else if (Matches("ALTER", "SERVER", MatchAny, "VERSION", MatchAny))
+ COMPLETE_WITH("OPTIONS");
+ /* ALTER SYSTEM SET, RESET, RESET ALL */
+ else if (Matches("ALTER", "SYSTEM"))
+ COMPLETE_WITH("SET", "RESET");
+ else if (Matches("ALTER", "SYSTEM", "SET|RESET"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_alter_system_set_vars,
+ "ALL");
+ else if (Matches("ALTER", "SYSTEM", "SET", MatchAny))
+ COMPLETE_WITH("TO");
+ /* ALTER VIEW <name> */
+ else if (Matches("ALTER", "VIEW", MatchAny))
+ COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME",
+ "SET SCHEMA");
+ /* ALTER VIEW xxx RENAME */
+ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO");
+ else if (Matches("ALTER", "VIEW", MatchAny, "ALTER|RENAME", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER VIEW xxx ALTER [ COLUMN ] yyy */
+ else if (Matches("ALTER", "VIEW", MatchAny, "ALTER", MatchAny) ||
+ Matches("ALTER", "VIEW", MatchAny, "ALTER", "COLUMN", MatchAny))
+ COMPLETE_WITH("SET DEFAULT", "DROP DEFAULT");
+ /* ALTER VIEW xxx RENAME yyy */
+ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+ /* ALTER VIEW xxx RENAME COLUMN yyy */
+ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", "COLUMN", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+
+ /* ALTER MATERIALIZED VIEW <name> */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("ALTER COLUMN", "CLUSTER ON", "DEPENDS ON EXTENSION",
+ "NO DEPENDS ON EXTENSION", "OWNER TO", "RENAME",
+ "RESET (", "SET");
+ /* ALTER MATERIALIZED VIEW xxx RENAME */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO");
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "ALTER|RENAME", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER MATERIALIZED VIEW xxx RENAME yyy */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+ /* ALTER MATERIALIZED VIEW xxx RENAME COLUMN yyy */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "RENAME", "COLUMN", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+ /* ALTER MATERIALIZED VIEW xxx SET */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET"))
+ COMPLETE_WITH("(", "ACCESS METHOD", "SCHEMA", "TABLESPACE", "WITHOUT CLUSTER");
+ /* ALTER MATERIALIZED VIEW xxx SET ACCESS METHOD */
+ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
+
+ /* ALTER POLICY <name> */
+ else if (Matches("ALTER", "POLICY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ /* ALTER POLICY <name> ON */
+ else if (Matches("ALTER", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ /* ALTER POLICY <name> ON <table> */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
+ }
+ /* ALTER POLICY <name> ON <table> - show options */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("RENAME TO", "TO", "USING (", "WITH CHECK (");
+ /* ALTER POLICY <name> ON <table> TO <role> */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* ALTER POLICY <name> ON <table> USING ( */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "USING"))
+ COMPLETE_WITH("(");
+ /* ALTER POLICY <name> ON <table> WITH CHECK ( */
+ else if (Matches("ALTER", "POLICY", MatchAny, "ON", MatchAny, "WITH", "CHECK"))
+ COMPLETE_WITH("(");
+
+ /* ALTER RULE <name>, add ON */
+ else if (Matches("ALTER", "RULE", MatchAny))
+ COMPLETE_WITH("ON");
+
+ /* If we have ALTER RULE <name> ON, then add the correct tablename */
+ else if (Matches("ALTER", "RULE", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
+ }
+
+ /* ALTER RULE <name> ON <name> */
+ else if (Matches("ALTER", "RULE", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("RENAME TO");
+
+ /* ALTER STATISTICS <name> */
+ else if (Matches("ALTER", "STATISTICS", MatchAny))
+ COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA", "SET STATISTICS");
+ /* ALTER STATISTICS <name> SET */
+ else if (Matches("ALTER", "STATISTICS", MatchAny, "SET"))
+ COMPLETE_WITH("SCHEMA", "STATISTICS");
+
+ /* ALTER TRIGGER <name>, add ON */
+ else if (Matches("ALTER", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+
+ else if (Matches("ALTER", "TRIGGER", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
+ }
+
+ /* ALTER TRIGGER <name> ON <name> */
+ else if (Matches("ALTER", "TRIGGER", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("RENAME TO", "DEPENDS ON EXTENSION",
+ "NO DEPENDS ON EXTENSION");
+
+ /*
+ * If we detect ALTER TABLE <name>, suggest sub commands
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny))
+ COMPLETE_WITH("ADD", "ALTER", "CLUSTER ON", "DISABLE", "DROP",
+ "ENABLE", "INHERIT", "NO", "RENAME", "RESET",
+ "OWNER TO", "SET", "VALIDATE CONSTRAINT",
+ "REPLICA IDENTITY", "ATTACH PARTITION",
+ "DETACH PARTITION", "FORCE ROW LEVEL SECURITY",
+ "OF", "NOT OF");
+ /* ALTER TABLE xxx ADD */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD"))
+ {
+ /* make sure to keep this list and the !Matches() below in sync */
+ COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK", "UNIQUE", "PRIMARY KEY",
+ "EXCLUDE", "FOREIGN KEY");
+ }
+ /* ALTER TABLE xxx ADD [COLUMN] yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN", MatchAny) ||
+ (Matches("ALTER", "TABLE", MatchAny, "ADD", MatchAny) &&
+ !Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|EXCLUDE|FOREIGN")))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ /* ALTER TABLE xxx ADD CONSTRAINT yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny))
+ COMPLETE_WITH("CHECK", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY");
+ /* ALTER TABLE xxx ADD [CONSTRAINT yyy] (PRIMARY KEY|UNIQUE) */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY") ||
+ Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE") ||
+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "PRIMARY", "KEY") ||
+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "UNIQUE"))
+ COMPLETE_WITH("(", "USING INDEX");
+ /* ALTER TABLE xxx ADD PRIMARY KEY USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY", "USING", "INDEX"))
+ {
+ set_completion_reference(prev6_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ADD UNIQUE USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE", "USING", "INDEX"))
+ {
+ set_completion_reference(prev5_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ADD CONSTRAINT yyy PRIMARY KEY USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny,
+ "PRIMARY", "KEY", "USING", "INDEX"))
+ {
+ set_completion_reference(prev8_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ADD CONSTRAINT yyy UNIQUE USING INDEX */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny,
+ "UNIQUE", "USING", "INDEX"))
+ {
+ set_completion_reference(prev7_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
+ }
+ /* ALTER TABLE xxx ENABLE */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE"))
+ COMPLETE_WITH("ALWAYS", "REPLICA", "ROW LEVEL SECURITY", "RULE",
+ "TRIGGER");
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "REPLICA|ALWAYS"))
+ COMPLETE_WITH("RULE", "TRIGGER");
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "RULE"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "RULE"))
+ {
+ set_completion_reference(prev4_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", "TRIGGER"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "TRIGGER"))
+ {
+ set_completion_reference(prev4_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
+ }
+ /* ALTER TABLE xxx INHERIT */
+ else if (Matches("ALTER", "TABLE", MatchAny, "INHERIT"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* ALTER TABLE xxx NO */
+ else if (Matches("ALTER", "TABLE", MatchAny, "NO"))
+ COMPLETE_WITH("FORCE ROW LEVEL SECURITY", "INHERIT");
+ /* ALTER TABLE xxx NO INHERIT */
+ else if (Matches("ALTER", "TABLE", MatchAny, "NO", "INHERIT"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* ALTER TABLE xxx DISABLE */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE"))
+ COMPLETE_WITH("ROW LEVEL SECURITY", "RULE", "TRIGGER");
+ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE", "RULE"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "DISABLE", "TRIGGER"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
+ }
+
+ /* ALTER TABLE xxx ALTER */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "CONSTRAINT");
+
+ /* ALTER TABLE xxx RENAME */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME"))
+ COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "CONSTRAINT", "TO");
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|RENAME", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+
+ /* ALTER TABLE xxx RENAME yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME", MatchAnyExcept("CONSTRAINT|TO")))
+ COMPLETE_WITH("TO");
+
+ /* ALTER TABLE xxx RENAME COLUMN/CONSTRAINT yyy */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RENAME", "COLUMN|CONSTRAINT", MatchAnyExcept("TO")))
+ COMPLETE_WITH("TO");
+
+ /* If we have ALTER TABLE <sth> DROP, provide COLUMN or CONSTRAINT */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DROP"))
+ COMPLETE_WITH("COLUMN", "CONSTRAINT");
+ /* If we have ALTER TABLE <sth> DROP COLUMN, provide list of columns */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DROP", "COLUMN"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER TABLE <sth> ALTER|DROP|RENAME CONSTRAINT <constraint> */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER|DROP|RENAME", "CONSTRAINT"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table);
+ }
+ /* ALTER TABLE <sth> VALIDATE CONSTRAINT <non-validated constraint> */
+ else if (Matches("ALTER", "TABLE", MatchAny, "VALIDATE", "CONSTRAINT"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table_not_validated);
+ }
+ /* ALTER TABLE ALTER [COLUMN] <foo> */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny) ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny))
+ COMPLETE_WITH("TYPE", "SET", "RESET", "RESTART", "ADD", "DROP");
+ /* ALTER TABLE ALTER [COLUMN] <foo> ADD */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD"))
+ COMPLETE_WITH("GENERATED");
+ /* ALTER TABLE ALTER [COLUMN] <foo> ADD GENERATED */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD", "GENERATED") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD", "GENERATED"))
+ COMPLETE_WITH("ALWAYS", "BY DEFAULT");
+ /* ALTER TABLE ALTER [COLUMN] <foo> ADD GENERATED */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD", "GENERATED", "ALWAYS") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD", "GENERATED", "ALWAYS") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "ADD", "GENERATED", "BY", "DEFAULT") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "ADD", "GENERATED", "BY", "DEFAULT"))
+ COMPLETE_WITH("AS IDENTITY");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET"))
+ COMPLETE_WITH("(", "COMPRESSION", "DEFAULT", "GENERATED", "NOT NULL", "STATISTICS", "STORAGE",
+ /* a subset of ALTER SEQUENCE options */
+ "INCREMENT", "MINVALUE", "MAXVALUE", "START", "NO", "CACHE", "CYCLE");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET ( */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "(") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "("))
+ COMPLETE_WITH("n_distinct", "n_distinct_inherited");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET COMPRESSION */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "COMPRESSION") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "COMPRESSION"))
+ COMPLETE_WITH("DEFAULT", "PGLZ", "LZ4");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET GENERATED */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "GENERATED") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "GENERATED"))
+ COMPLETE_WITH("ALWAYS", "BY DEFAULT");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET NO */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "NO") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "NO"))
+ COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET STORAGE */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STORAGE") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "STORAGE"))
+ COMPLETE_WITH("DEFAULT", "PLAIN", "EXTERNAL", "EXTENDED", "MAIN");
+ /* ALTER TABLE ALTER [COLUMN] <foo> SET STATISTICS */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "STATISTICS") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "STATISTICS"))
+ {
+ /* Enforce no completion here, as an integer has to be specified */
+ }
+ /* ALTER TABLE ALTER [COLUMN] <foo> DROP */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "DROP") ||
+ Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "DROP"))
+ COMPLETE_WITH("DEFAULT", "EXPRESSION", "IDENTITY", "NOT NULL");
+ else if (Matches("ALTER", "TABLE", MatchAny, "CLUSTER"))
+ COMPLETE_WITH("ON");
+ else if (Matches("ALTER", "TABLE", MatchAny, "CLUSTER", "ON"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
+ }
+ /* If we have ALTER TABLE <sth> SET, provide list of attributes and '(' */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET"))
+ COMPLETE_WITH("(", "ACCESS METHOD", "LOGGED", "SCHEMA",
+ "TABLESPACE", "UNLOGGED", "WITH", "WITHOUT");
+
+ /*
+ * If we have ALTER TABLE <sth> SET ACCESS METHOD provide a list of table
+ * AMs.
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
+
+ /*
+ * If we have ALTER TABLE <sth> SET TABLESPACE provide a list of
+ * tablespaces
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ /* If we have ALTER TABLE <sth> SET WITHOUT provide CLUSTER or OIDS */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "WITHOUT"))
+ COMPLETE_WITH("CLUSTER", "OIDS");
+ /* ALTER TABLE <foo> RESET */
+ else if (Matches("ALTER", "TABLE", MatchAny, "RESET"))
+ COMPLETE_WITH("(");
+ /* ALTER TABLE <foo> SET|RESET ( */
+ else if (Matches("ALTER", "TABLE", MatchAny, "SET|RESET", "("))
+ COMPLETE_WITH_LIST(table_storage_parameters);
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING", "INDEX"))
+ {
+ set_completion_reference(prev5_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING"))
+ COMPLETE_WITH("INDEX");
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY"))
+ COMPLETE_WITH("FULL", "NOTHING", "DEFAULT", "USING");
+ else if (Matches("ALTER", "TABLE", MatchAny, "REPLICA"))
+ COMPLETE_WITH("IDENTITY");
+
+ /*
+ * If we have ALTER TABLE <foo> ATTACH PARTITION, provide a list of
+ * tables.
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "ATTACH", "PARTITION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* Limited completion support for partition bound specification */
+ else if (TailMatches("ATTACH", "PARTITION", MatchAny))
+ COMPLETE_WITH("FOR VALUES", "DEFAULT");
+ else if (TailMatches("FOR", "VALUES"))
+ COMPLETE_WITH("FROM (", "IN (", "WITH (");
+
+ /*
+ * If we have ALTER TABLE <foo> DETACH PARTITION, provide a list of
+ * partitions of <foo>.
+ */
+ else if (Matches("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION"))
+ {
+ set_completion_reference(prev3_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_partition_of_table);
+ }
+ else if (Matches("ALTER", "TABLE", MatchAny, "DETACH", "PARTITION", MatchAny))
+ COMPLETE_WITH("CONCURRENTLY", "FINALIZE");
+
+ /* ALTER TABLE <name> OF */
+ else if (Matches("ALTER", "TABLE", MatchAny, "OF"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
+
+ /* ALTER TABLESPACE <foo> with RENAME TO, OWNER TO, SET, RESET */
+ else if (Matches("ALTER", "TABLESPACE", MatchAny))
+ COMPLETE_WITH("RENAME TO", "OWNER TO", "SET", "RESET");
+ /* ALTER TABLESPACE <foo> SET|RESET */
+ else if (Matches("ALTER", "TABLESPACE", MatchAny, "SET|RESET"))
+ COMPLETE_WITH("(");
+ /* ALTER TABLESPACE <foo> SET|RESET ( */
+ else if (Matches("ALTER", "TABLESPACE", MatchAny, "SET|RESET", "("))
+ COMPLETE_WITH("seq_page_cost", "random_page_cost",
+ "effective_io_concurrency", "maintenance_io_concurrency");
+
+ /* ALTER TEXT SEARCH */
+ else if (Matches("ALTER", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (Matches("ALTER", "TEXT", "SEARCH", "TEMPLATE|PARSER", MatchAny))
+ COMPLETE_WITH("RENAME TO", "SET SCHEMA");
+ else if (Matches("ALTER", "TEXT", "SEARCH", "DICTIONARY", MatchAny))
+ COMPLETE_WITH("(", "OWNER TO", "RENAME TO", "SET SCHEMA");
+ else if (Matches("ALTER", "TEXT", "SEARCH", "CONFIGURATION", MatchAny))
+ COMPLETE_WITH("ADD MAPPING FOR", "ALTER MAPPING",
+ "DROP MAPPING FOR",
+ "OWNER TO", "RENAME TO", "SET SCHEMA");
+
+ /* complete ALTER TYPE <foo> with actions */
+ else if (Matches("ALTER", "TYPE", MatchAny))
+ COMPLETE_WITH("ADD ATTRIBUTE", "ADD VALUE", "ALTER ATTRIBUTE",
+ "DROP ATTRIBUTE",
+ "OWNER TO", "RENAME", "SET SCHEMA", "SET (");
+ /* complete ALTER TYPE <foo> ADD with actions */
+ else if (Matches("ALTER", "TYPE", MatchAny, "ADD"))
+ COMPLETE_WITH("ATTRIBUTE", "VALUE");
+ /* ALTER TYPE <foo> RENAME */
+ else if (Matches("ALTER", "TYPE", MatchAny, "RENAME"))
+ COMPLETE_WITH("ATTRIBUTE", "TO", "VALUE");
+ /* ALTER TYPE xxx RENAME (ATTRIBUTE|VALUE) yyy */
+ else if (Matches("ALTER", "TYPE", MatchAny, "RENAME", "ATTRIBUTE|VALUE", MatchAny))
+ COMPLETE_WITH("TO");
+
+ /*
+ * If we have ALTER TYPE <sth> ALTER/DROP/RENAME ATTRIBUTE, provide list
+ * of attributes
+ */
+ else if (Matches("ALTER", "TYPE", MatchAny, "ALTER|DROP|RENAME", "ATTRIBUTE"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ /* ALTER TYPE ALTER ATTRIBUTE <foo> */
+ else if (Matches("ALTER", "TYPE", MatchAny, "ALTER", "ATTRIBUTE", MatchAny))
+ COMPLETE_WITH("TYPE");
+ /* complete ALTER TYPE <sth> RENAME VALUE with list of enum values */
+ else if (Matches("ALTER", "TYPE", MatchAny, "RENAME", "VALUE"))
+ COMPLETE_WITH_ENUM_VALUE(prev3_wd);
+ /* ALTER TYPE <foo> SET */
+ else if (Matches("ALTER", "TYPE", MatchAny, "SET"))
+ COMPLETE_WITH("(", "SCHEMA");
+ /* complete ALTER TYPE <foo> SET ( with settable properties */
+ else if (Matches("ALTER", "TYPE", MatchAny, "SET", "("))
+ COMPLETE_WITH("ANALYZE", "RECEIVE", "SEND", "STORAGE", "SUBSCRIPT",
+ "TYPMOD_IN", "TYPMOD_OUT");
+
+ /* complete ALTER GROUP <foo> */
+ else if (Matches("ALTER", "GROUP", MatchAny))
+ COMPLETE_WITH("ADD USER", "DROP USER", "RENAME TO");
+ /* complete ALTER GROUP <foo> ADD|DROP with USER */
+ else if (Matches("ALTER", "GROUP", MatchAny, "ADD|DROP"))
+ COMPLETE_WITH("USER");
+ /* complete ALTER GROUP <foo> ADD|DROP USER with a user name */
+ else if (Matches("ALTER", "GROUP", MatchAny, "ADD|DROP", "USER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+
+/*
+ * ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
+ * ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]
+ */
+ else if (Matches("ANALYZE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
+ "VERBOSE");
+ else if (HeadMatches("ANALYZE", "(*") &&
+ !HeadMatches("ANALYZE", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("VERBOSE", "SKIP_LOCKED", "BUFFER_USAGE_LIMIT");
+ else if (TailMatches("VERBOSE|SKIP_LOCKED"))
+ COMPLETE_WITH("ON", "OFF");
+ }
+ else if (HeadMatches("ANALYZE") && TailMatches("("))
+ /* "ANALYZE (" should be caught above, so assume we want columns */
+ COMPLETE_WITH_ATTR(prev2_wd);
+ else if (HeadMatches("ANALYZE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables);
+
+/* BEGIN */
+ else if (Matches("BEGIN"))
+ COMPLETE_WITH("WORK", "TRANSACTION", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
+/* END, ABORT */
+ else if (Matches("END|ABORT"))
+ COMPLETE_WITH("AND", "WORK", "TRANSACTION");
+/* COMMIT */
+ else if (Matches("COMMIT"))
+ COMPLETE_WITH("AND", "WORK", "TRANSACTION", "PREPARED");
+/* RELEASE SAVEPOINT */
+ else if (Matches("RELEASE"))
+ COMPLETE_WITH("SAVEPOINT");
+/* ROLLBACK */
+ else if (Matches("ROLLBACK"))
+ COMPLETE_WITH("AND", "WORK", "TRANSACTION", "TO SAVEPOINT", "PREPARED");
+ else if (Matches("ABORT|END|COMMIT|ROLLBACK", "AND"))
+ COMPLETE_WITH("CHAIN");
+/* CALL */
+ else if (Matches("CALL"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
+ else if (Matches("CALL", MatchAny))
+ COMPLETE_WITH("(");
+/* CLOSE */
+ else if (Matches("CLOSE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "ALL");
+/* CLUSTER */
+ else if (Matches("CLUSTER"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_clusterables,
+ "VERBOSE");
+ else if (Matches("CLUSTER", "VERBOSE") ||
+ Matches("CLUSTER", "(*)"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables);
+ /* If we have CLUSTER <sth>, then add "USING" */
+ else if (Matches("CLUSTER", MatchAnyExcept("VERBOSE|ON|(|(*)")))
+ COMPLETE_WITH("USING");
+ /* If we have CLUSTER VERBOSE <sth>, then add "USING" */
+ else if (Matches("CLUSTER", "VERBOSE|(*)", MatchAny))
+ COMPLETE_WITH("USING");
+ /* If we have CLUSTER <sth> USING, then add the index as well */
+ else if (Matches("CLUSTER", MatchAny, "USING") ||
+ Matches("CLUSTER", "VERBOSE|(*)", MatchAny, "USING"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
+ }
+ else if (HeadMatches("CLUSTER", "(*") &&
+ !HeadMatches("CLUSTER", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("VERBOSE");
+ }
+
+/* COMMENT */
+ else if (Matches("COMMENT"))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON"))
+ COMPLETE_WITH("ACCESS METHOD", "AGGREGATE", "CAST", "COLLATION",
+ "COLUMN", "CONSTRAINT", "CONVERSION", "DATABASE",
+ "DOMAIN", "EXTENSION", "EVENT TRIGGER",
+ "FOREIGN DATA WRAPPER", "FOREIGN TABLE",
+ "FUNCTION", "INDEX", "LANGUAGE", "LARGE OBJECT",
+ "MATERIALIZED VIEW", "OPERATOR", "POLICY",
+ "PROCEDURE", "PROCEDURAL LANGUAGE", "PUBLICATION", "ROLE",
+ "ROUTINE", "RULE", "SCHEMA", "SEQUENCE", "SERVER",
+ "STATISTICS", "SUBSCRIPTION", "TABLE",
+ "TABLESPACE", "TEXT SEARCH", "TRANSFORM FOR",
+ "TRIGGER", "TYPE", "VIEW");
+ else if (Matches("COMMENT", "ON", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
+ else if (Matches("COMMENT", "ON", "CONSTRAINT"))
+ COMPLETE_WITH_QUERY(Query_for_all_table_constraints);
+ else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables_for_constraint,
+ "DOMAIN");
+ }
+ else if (Matches("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON", "DOMAIN"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
+ else if (Matches("COMMENT", "ON", "EVENT", "TRIGGER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+ else if (Matches("COMMENT", "ON", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+ else if (Matches("COMMENT", "ON", "FOREIGN", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
+ else if (Matches("COMMENT", "ON", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (Matches("COMMENT", "ON", "POLICY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ else if (Matches("COMMENT", "ON", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "POLICY", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
+ }
+ else if (Matches("COMMENT", "ON", "PROCEDURAL", "LANGUAGE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ else if (Matches("COMMENT", "ON", "RULE", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "RULE", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
+ }
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "CONFIGURATION"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "DICTIONARY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "PARSER"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
+ else if (Matches("COMMENT", "ON", "TEXT", "SEARCH", "TEMPLATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
+ else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny))
+ COMPLETE_WITH("LANGUAGE");
+ else if (Matches("COMMENT", "ON", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ }
+ else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("COMMENT", "ON", "TRIGGER", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
+ }
+ else if (Matches("COMMENT", "ON", MatchAny, MatchAnyExcept("IS")) ||
+ Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAnyExcept("IS")) ||
+ Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS")) ||
+ Matches("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS")))
+ COMPLETE_WITH("IS");
+
+/* COPY */
+
+ /*
+ * If we have COPY, offer list of tables or "(" (Also cover the analogous
+ * backslash command).
+ */
+ else if (Matches("COPY|\\copy"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, "(");
+ /* Complete COPY ( with legal query commands */
+ else if (Matches("COPY|\\copy", "("))
+ COMPLETE_WITH("SELECT", "TABLE", "VALUES", "INSERT INTO", "UPDATE", "DELETE FROM", "WITH");
+ /* Complete COPY <sth> */
+ else if (Matches("COPY|\\copy", MatchAny))
+ COMPLETE_WITH("FROM", "TO");
+ /* Complete COPY <sth> FROM|TO with filename */
+ else if (Matches("COPY", MatchAny, "FROM|TO"))
+ {
+ completion_charp = "";
+ completion_force_quote = true; /* COPY requires quoted filename */
+ matches = rl_completion_matches(text, complete_from_files);
+ }
+ else if (Matches("\\copy", MatchAny, "FROM|TO"))
+ {
+ completion_charp = "";
+ completion_force_quote = false;
+ matches = rl_completion_matches(text, complete_from_files);
+ }
+
+ /* Complete COPY <sth> TO <sth> */
+ else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny))
+ COMPLETE_WITH("WITH (");
+
+ /* Complete COPY <sth> FROM <sth> */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny))
+ COMPLETE_WITH("WITH (", "WHERE");
+
+ /* Complete COPY <sth> FROM|TO filename WITH ( */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "("))
+ COMPLETE_WITH("FORMAT", "FREEZE", "DELIMITER", "NULL",
+ "HEADER", "QUOTE", "ESCAPE", "FORCE_QUOTE",
+ "FORCE_NOT_NULL", "FORCE_NULL", "ENCODING", "DEFAULT");
+
+ /* Complete COPY <sth> FROM|TO filename WITH (FORMAT */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "FORMAT"))
+ COMPLETE_WITH("binary", "csv", "text");
+
+ /* Complete COPY <sth> FROM <sth> WITH (<options>) */
+ else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", MatchAny))
+ COMPLETE_WITH("WHERE");
+
+ /* CREATE ACCESS METHOD */
+ /* Complete "CREATE ACCESS METHOD <name>" */
+ else if (Matches("CREATE", "ACCESS", "METHOD", MatchAny))
+ COMPLETE_WITH("TYPE");
+ /* Complete "CREATE ACCESS METHOD <name> TYPE" */
+ else if (Matches("CREATE", "ACCESS", "METHOD", MatchAny, "TYPE"))
+ COMPLETE_WITH("INDEX", "TABLE");
+ /* Complete "CREATE ACCESS METHOD <name> TYPE <type>" */
+ else if (Matches("CREATE", "ACCESS", "METHOD", MatchAny, "TYPE", MatchAny))
+ COMPLETE_WITH("HANDLER");
+
+ /* CREATE COLLATION */
+ else if (Matches("CREATE", "COLLATION", MatchAny))
+ COMPLETE_WITH("(", "FROM");
+ else if (Matches("CREATE", "COLLATION", MatchAny, "FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
+ else if (HeadMatches("CREATE", "COLLATION", MatchAny, "(*"))
+ {
+ if (TailMatches("(|*,"))
+ COMPLETE_WITH("LOCALE =", "LC_COLLATE =", "LC_CTYPE =",
+ "PROVIDER =", "DETERMINISTIC =");
+ else if (TailMatches("PROVIDER", "="))
+ COMPLETE_WITH("libc", "icu");
+ else if (TailMatches("DETERMINISTIC", "="))
+ COMPLETE_WITH("true", "false");
+ }
+
+ /* CREATE DATABASE */
+ else if (Matches("CREATE", "DATABASE", MatchAny))
+ COMPLETE_WITH("OWNER", "TEMPLATE", "ENCODING", "TABLESPACE",
+ "IS_TEMPLATE", "STRATEGY",
+ "ALLOW_CONNECTIONS", "CONNECTION LIMIT",
+ "LC_COLLATE", "LC_CTYPE", "LOCALE", "OID",
+ "LOCALE_PROVIDER", "ICU_LOCALE");
+
+ else if (Matches("CREATE", "DATABASE", MatchAny, "TEMPLATE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_template_databases);
+ else if (Matches("CREATE", "DATABASE", MatchAny, "STRATEGY"))
+ COMPLETE_WITH("WAL_LOG", "FILE_COPY");
+
+ /* CREATE DOMAIN */
+ else if (Matches("CREATE", "DOMAIN", MatchAny))
+ COMPLETE_WITH("AS");
+ else if (Matches("CREATE", "DOMAIN", MatchAny, "AS"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("CREATE", "DOMAIN", MatchAny, "AS", MatchAny))
+ COMPLETE_WITH("COLLATE", "DEFAULT", "CONSTRAINT",
+ "NOT NULL", "NULL", "CHECK (");
+ else if (Matches("CREATE", "DOMAIN", MatchAny, "COLLATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
+
+ /* CREATE EXTENSION */
+ /* Complete with available extensions rather than installed ones. */
+ else if (Matches("CREATE", "EXTENSION"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions);
+ /* CREATE EXTENSION <name> */
+ else if (Matches("CREATE", "EXTENSION", MatchAny))
+ COMPLETE_WITH("WITH SCHEMA", "CASCADE", "VERSION");
+ /* CREATE EXTENSION <name> VERSION */
+ else if (Matches("CREATE", "EXTENSION", MatchAny, "VERSION"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
+ }
+
+ /* CREATE FOREIGN */
+ else if (Matches("CREATE", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+
+ /* CREATE FOREIGN DATA WRAPPER */
+ else if (Matches("CREATE", "FOREIGN", "DATA", "WRAPPER", MatchAny))
+ COMPLETE_WITH("HANDLER", "VALIDATOR", "OPTIONS");
+
+ /* CREATE FOREIGN TABLE */
+ else if (Matches("CREATE", "FOREIGN", "TABLE", MatchAny))
+ COMPLETE_WITH("(", "PARTITION OF");
+
+ /* CREATE INDEX --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ /* First off we complete CREATE UNIQUE with "INDEX" */
+ else if (TailMatches("CREATE", "UNIQUE"))
+ COMPLETE_WITH("INDEX");
+
+ /*
+ * If we have CREATE|UNIQUE INDEX, then add "ON", "CONCURRENTLY", and
+ * existing indexes
+ */
+ else if (TailMatches("CREATE|UNIQUE", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "ON", "CONCURRENTLY");
+
+ /*
+ * Complete ... INDEX|CONCURRENTLY [<name>] ON with a list of relations
+ * that indexes can be created on
+ */
+ else if (TailMatches("INDEX|CONCURRENTLY", MatchAny, "ON") ||
+ TailMatches("INDEX|CONCURRENTLY", "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
+
+ /*
+ * Complete CREATE|UNIQUE INDEX CONCURRENTLY with "ON" and existing
+ * indexes
+ */
+ else if (TailMatches("CREATE|UNIQUE", "INDEX", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "ON");
+ /* Complete CREATE|UNIQUE INDEX [CONCURRENTLY] <sth> with "ON" */
+ else if (TailMatches("CREATE|UNIQUE", "INDEX", MatchAny) ||
+ TailMatches("CREATE|UNIQUE", "INDEX", "CONCURRENTLY", MatchAny))
+ COMPLETE_WITH("ON");
+
+ /*
+ * Complete INDEX <name> ON <table> with a list of table columns (which
+ * should really be in parens)
+ */
+ else if (TailMatches("INDEX", MatchAny, "ON", MatchAny) ||
+ TailMatches("INDEX|CONCURRENTLY", "ON", MatchAny))
+ COMPLETE_WITH("(", "USING");
+ else if (TailMatches("INDEX", MatchAny, "ON", MatchAny, "(") ||
+ TailMatches("INDEX|CONCURRENTLY", "ON", MatchAny, "("))
+ COMPLETE_WITH_ATTR(prev2_wd);
+ /* same if you put in USING */
+ else if (TailMatches("ON", MatchAny, "USING", MatchAny, "("))
+ COMPLETE_WITH_ATTR(prev4_wd);
+ /* Complete USING with an index method */
+ else if (TailMatches("INDEX", MatchAny, MatchAny, "ON", MatchAny, "USING") ||
+ TailMatches("INDEX", MatchAny, "ON", MatchAny, "USING") ||
+ TailMatches("INDEX", "ON", MatchAny, "USING"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_index_access_methods);
+ else if (TailMatches("ON", MatchAny, "USING", MatchAny) &&
+ !TailMatches("POLICY", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny) &&
+ !TailMatches("FOR", MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("(");
+
+ /* CREATE OR REPLACE */
+ else if (Matches("CREATE", "OR"))
+ COMPLETE_WITH("REPLACE");
+
+ /* CREATE POLICY */
+ /* Complete "CREATE POLICY <name> ON" */
+ else if (Matches("CREATE", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ /* Complete "CREATE POLICY <name> ON <table>" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* Complete "CREATE POLICY <name> ON <table> AS|FOR|TO|USING|WITH CHECK" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("AS", "FOR", "TO", "USING (", "WITH CHECK (");
+ /* CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS"))
+ COMPLETE_WITH("PERMISSIVE", "RESTRICTIVE");
+
+ /*
+ * CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE
+ * FOR|TO|USING|WITH CHECK
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny))
+ COMPLETE_WITH("FOR", "TO", "USING", "WITH CHECK");
+ /* CREATE POLICY <name> ON <table> FOR ALL|SELECT|INSERT|UPDATE|DELETE */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR"))
+ COMPLETE_WITH("ALL", "SELECT", "INSERT", "UPDATE", "DELETE");
+ /* Complete "CREATE POLICY <name> ON <table> FOR INSERT TO|WITH CHECK" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR", "INSERT"))
+ COMPLETE_WITH("TO", "WITH CHECK (");
+ /* Complete "CREATE POLICY <name> ON <table> FOR SELECT|DELETE TO|USING" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR", "SELECT|DELETE"))
+ COMPLETE_WITH("TO", "USING (");
+ /* CREATE POLICY <name> ON <table> FOR ALL|UPDATE TO|USING|WITH CHECK */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "FOR", "ALL|UPDATE"))
+ COMPLETE_WITH("TO", "USING (", "WITH CHECK (");
+ /* Complete "CREATE POLICY <name> ON <table> TO <role>" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* Complete "CREATE POLICY <name> ON <table> USING (" */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "USING"))
+ COMPLETE_WITH("(");
+
+ /*
+ * CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * ALL|SELECT|INSERT|UPDATE|DELETE
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR"))
+ COMPLETE_WITH("ALL", "SELECT", "INSERT", "UPDATE", "DELETE");
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * INSERT TO|WITH CHECK"
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR", "INSERT"))
+ COMPLETE_WITH("TO", "WITH CHECK (");
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * SELECT|DELETE TO|USING"
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR", "SELECT|DELETE"))
+ COMPLETE_WITH("TO", "USING (");
+
+ /*
+ * CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE FOR
+ * ALL|UPDATE TO|USING|WITH CHECK
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "FOR", "ALL|UPDATE"))
+ COMPLETE_WITH("TO", "USING (", "WITH CHECK (");
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE TO
+ * <role>"
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+
+ /*
+ * Complete "CREATE POLICY <name> ON <table> AS PERMISSIVE|RESTRICTIVE
+ * USING ("
+ */
+ else if (Matches("CREATE", "POLICY", MatchAny, "ON", MatchAny, "AS", MatchAny, "USING"))
+ COMPLETE_WITH("(");
+
+
+/* CREATE PUBLICATION */
+ else if (Matches("CREATE", "PUBLICATION", MatchAny))
+ COMPLETE_WITH("FOR TABLE", "FOR ALL TABLES", "FOR TABLES IN SCHEMA", "WITH (");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR"))
+ COMPLETE_WITH("TABLE", "ALL TABLES", "TABLES IN SCHEMA");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL"))
+ COMPLETE_WITH("TABLES");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "ALL", "TABLES"))
+ COMPLETE_WITH("WITH (");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES"))
+ COMPLETE_WITH("IN SCHEMA");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE", MatchAny) && !ends_with(prev_wd, ','))
+ COMPLETE_WITH("WHERE (", "WITH (");
+ /* Complete "CREATE PUBLICATION <name> FOR TABLE" with "<table>, ..." */
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+ /*
+ * "CREATE PUBLICATION <name> FOR TABLE <name> WHERE (" - complete with
+ * table attributes
+ */
+ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE"))
+ COMPLETE_WITH("(");
+ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE", "("))
+ COMPLETE_WITH_ATTR(prev3_wd);
+ else if (HeadMatches("CREATE", "PUBLICATION", MatchAny) && TailMatches("WHERE", "(*)"))
+ COMPLETE_WITH(" WITH (");
+
+ /*
+ * Complete "CREATE PUBLICATION <name> FOR TABLES IN SCHEMA <schema>, ..."
+ */
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES", "IN", "SCHEMA"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
+ " AND nspname NOT LIKE E'pg\\\\_%%'",
+ "CURRENT_SCHEMA");
+ else if (Matches("CREATE", "PUBLICATION", MatchAny, "FOR", "TABLES", "IN", "SCHEMA", MatchAny) && (!ends_with(prev_wd, ',')))
+ COMPLETE_WITH("WITH (");
+ /* Complete "CREATE PUBLICATION <name> [...] WITH" */
+ else if (HeadMatches("CREATE", "PUBLICATION") && TailMatches("WITH", "("))
+ COMPLETE_WITH("publish", "publish_via_partition_root");
+
+/* CREATE RULE */
+ /* Complete "CREATE [ OR REPLACE ] RULE <sth>" with "AS ON" */
+ else if (Matches("CREATE", "RULE", MatchAny) ||
+ Matches("CREATE", "OR", "REPLACE", "RULE", MatchAny))
+ COMPLETE_WITH("AS ON");
+ /* Complete "CREATE [ OR REPLACE ] RULE <sth> AS" with "ON" */
+ else if (Matches("CREATE", "RULE", MatchAny, "AS") ||
+ Matches("CREATE", "OR", "REPLACE", "RULE", MatchAny, "AS"))
+ COMPLETE_WITH("ON");
+
+ /*
+ * Complete "CREATE [ OR REPLACE ] RULE <sth> AS ON" with
+ * SELECT|UPDATE|INSERT|DELETE
+ */
+ else if (Matches("CREATE", "RULE", MatchAny, "AS", "ON") ||
+ Matches("CREATE", "OR", "REPLACE", "RULE", MatchAny, "AS", "ON"))
+ COMPLETE_WITH("SELECT", "UPDATE", "INSERT", "DELETE");
+ /* Complete "AS ON SELECT|UPDATE|INSERT|DELETE" with a "TO" */
+ else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE"))
+ COMPLETE_WITH("TO");
+ /* Complete "AS ON <sth> TO" with a table name */
+ else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE", "TO"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+/* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ else if (TailMatches("CREATE", "SEQUENCE", MatchAny) ||
+ TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny))
+ COMPLETE_WITH("AS", "INCREMENT BY", "MINVALUE", "MAXVALUE", "NO",
+ "CACHE", "CYCLE", "OWNED BY", "START WITH");
+ else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "AS") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "AS"))
+ COMPLETE_WITH_CS("smallint", "integer", "bigint");
+ else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "NO") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "NO"))
+ COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE");
+
+/* CREATE SERVER <name> */
+ else if (Matches("CREATE", "SERVER", MatchAny))
+ COMPLETE_WITH("TYPE", "VERSION", "FOREIGN DATA WRAPPER");
+
+/* CREATE STATISTICS <name> */
+ else if (Matches("CREATE", "STATISTICS", MatchAny))
+ COMPLETE_WITH("(", "ON");
+ else if (Matches("CREATE", "STATISTICS", MatchAny, "("))
+ COMPLETE_WITH("ndistinct", "dependencies", "mcv");
+ else if (Matches("CREATE", "STATISTICS", MatchAny, "(*)"))
+ COMPLETE_WITH("ON");
+ else if (HeadMatches("CREATE", "STATISTICS", MatchAny) &&
+ TailMatches("FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+/* CREATE TABLE --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ /* Complete "CREATE TEMP/TEMPORARY" with the possible temp objects */
+ else if (TailMatches("CREATE", "TEMP|TEMPORARY"))
+ COMPLETE_WITH("SEQUENCE", "TABLE", "VIEW");
+ /* Complete "CREATE UNLOGGED" with TABLE or MATVIEW */
+ else if (TailMatches("CREATE", "UNLOGGED"))
+ COMPLETE_WITH("TABLE", "MATERIALIZED VIEW");
+ /* Complete PARTITION BY with RANGE ( or LIST ( or ... */
+ else if (TailMatches("PARTITION", "BY"))
+ COMPLETE_WITH("RANGE (", "LIST (", "HASH (");
+ /* If we have xxx PARTITION OF, provide a list of partitioned tables */
+ else if (TailMatches("PARTITION", "OF"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
+ /* Limited completion support for partition bound specification */
+ else if (TailMatches("PARTITION", "OF", MatchAny))
+ COMPLETE_WITH("FOR VALUES", "DEFAULT");
+ /* Complete CREATE TABLE <name> with '(', OF or PARTITION OF */
+ else if (TailMatches("CREATE", "TABLE", MatchAny) ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny))
+ COMPLETE_WITH("(", "OF", "PARTITION OF");
+ /* Complete CREATE TABLE <name> OF with list of composite types */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "OF") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "OF"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
+ /* Complete CREATE TABLE name (...) with supported options */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") ||
+ TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)"))
+ COMPLETE_WITH("INHERITS (", "PARTITION BY", "USING", "TABLESPACE", "WITH (");
+ else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)"))
+ COMPLETE_WITH("INHERITS (", "ON COMMIT", "PARTITION BY",
+ "TABLESPACE", "WITH (");
+ /* Complete CREATE TABLE (...) USING with table access methods */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)", "USING") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "(*)", "USING"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
+ /* Complete CREATE TABLE (...) WITH with storage parameters */
+ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)", "WITH", "(") ||
+ TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "(*)", "WITH", "("))
+ COMPLETE_WITH_LIST(table_storage_parameters);
+ /* Complete CREATE TABLE ON COMMIT with actions */
+ else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)", "ON", "COMMIT"))
+ COMPLETE_WITH("DELETE ROWS", "DROP", "PRESERVE ROWS");
+
+/* CREATE TABLESPACE */
+ else if (Matches("CREATE", "TABLESPACE", MatchAny))
+ COMPLETE_WITH("OWNER", "LOCATION");
+ /* Complete CREATE TABLESPACE name OWNER name with "LOCATION" */
+ else if (Matches("CREATE", "TABLESPACE", MatchAny, "OWNER", MatchAny))
+ COMPLETE_WITH("LOCATION");
+
+/* CREATE TEXT SEARCH */
+ else if (Matches("CREATE", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (Matches("CREATE", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
+ COMPLETE_WITH("(");
+
+/* CREATE TRANSFORM */
+ else if (Matches("CREATE", "TRANSFORM") ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM"))
+ COMPLETE_WITH("FOR");
+ else if (Matches("CREATE", "TRANSFORM", "FOR") ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny) ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny))
+ COMPLETE_WITH("LANGUAGE");
+ else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE") ||
+ Matches("CREATE", "OR", "REPLACE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ }
+
+/* CREATE SUBSCRIPTION */
+ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny))
+ COMPLETE_WITH("CONNECTION");
+ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION", MatchAny))
+ COMPLETE_WITH("PUBLICATION");
+ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny, "CONNECTION",
+ MatchAny, "PUBLICATION"))
+ {
+ /* complete with nothing here as this refers to remote publications */
+ }
+ else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("PUBLICATION", MatchAny))
+ COMPLETE_WITH("WITH (");
+ /* Complete "CREATE SUBSCRIPTION <name> ... WITH ( <opt>" */
+ else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("WITH", "("))
+ COMPLETE_WITH("binary", "connect", "copy_data", "create_slot",
+ "disable_on_error", "enabled", "origin",
+ "password_required", "run_as_owner", "slot_name",
+ "streaming", "synchronous_commit", "two_phase");
+
+/* CREATE TRIGGER --- is allowed inside CREATE SCHEMA, so use TailMatches */
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> with BEFORE|AFTER|INSTEAD
+ * OF.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny))
+ COMPLETE_WITH("BEFORE", "AFTER", "INSTEAD OF");
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> BEFORE,AFTER with an
+ * event.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER"))
+ COMPLETE_WITH("INSERT", "DELETE", "UPDATE", "TRUNCATE");
+ /* Complete CREATE [ OR REPLACE ] TRIGGER <name> INSTEAD OF with an event */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF"))
+ COMPLETE_WITH("INSERT", "DELETE", "UPDATE");
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> BEFORE,AFTER sth with
+ * OR|ON.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny) ||
+ TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny))
+ COMPLETE_WITH("ON", "OR");
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER <name> BEFORE,AFTER event ON
+ * with a list of tables. EXECUTE FUNCTION is the recommended grammar
+ * instead of EXECUTE PROCEDURE in version 11 and upwards.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER ... INSTEAD OF event ON with a
+ * list of views.
+ */
+ else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON") ||
+ TailMatches("CREATE", "OR", "REPLACE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("ON", MatchAny))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+ "REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+ "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("DEFERRABLE") || TailMatches("INITIALLY", "IMMEDIATE|DEFERRED")))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("REFERENCING"))
+ COMPLETE_WITH("OLD TABLE", "NEW TABLE");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("OLD|NEW", "TABLE"))
+ COMPLETE_WITH("AS");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("REFERENCING", "OLD", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "OLD", "TABLE", MatchAny)))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("REFERENCING", "NEW", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "NEW", "TABLE", MatchAny)))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
+ TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", MatchAny) ||
+ TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", MatchAny)))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("FOR", "WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("FOR", "WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("FOR"))
+ COMPLETE_WITH("EACH", "ROW", "STATEMENT");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("FOR", "EACH"))
+ COMPLETE_WITH("ROW", "STATEMENT");
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ (TailMatches("FOR", "EACH", "ROW|STATEMENT") ||
+ TailMatches("FOR", "ROW|STATEMENT")))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("WHEN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("WHEN (", "EXECUTE PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("WHEN", "(*)"))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("EXECUTE PROCEDURE");
+ }
+
+ /*
+ * Complete CREATE [ OR REPLACE ] TRIGGER ... EXECUTE with
+ * PROCEDURE|FUNCTION.
+ */
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("EXECUTE"))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("FUNCTION");
+ else
+ COMPLETE_WITH("PROCEDURE");
+ }
+ else if ((HeadMatches("CREATE", "TRIGGER") ||
+ HeadMatches("CREATE", "OR", "REPLACE", "TRIGGER")) &&
+ TailMatches("EXECUTE", "FUNCTION|PROCEDURE"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+
+/* CREATE ROLE,USER,GROUP <name> */
+ else if (Matches("CREATE", "ROLE|GROUP|USER", MatchAny) &&
+ !TailMatches("USER", "MAPPING"))
+ COMPLETE_WITH("ADMIN", "BYPASSRLS", "CONNECTION LIMIT", "CREATEDB",
+ "CREATEROLE", "ENCRYPTED PASSWORD", "IN", "INHERIT",
+ "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "REPLICATION", "ROLE", "SUPERUSER", "SYSID",
+ "VALID UNTIL", "WITH");
+
+/* CREATE ROLE,USER,GROUP <name> WITH */
+ else if (Matches("CREATE", "ROLE|GROUP|USER", MatchAny, "WITH"))
+ /* Similar to the above, but don't complete "WITH" again. */
+ COMPLETE_WITH("ADMIN", "BYPASSRLS", "CONNECTION LIMIT", "CREATEDB",
+ "CREATEROLE", "ENCRYPTED PASSWORD", "IN", "INHERIT",
+ "LOGIN", "NOBYPASSRLS",
+ "NOCREATEDB", "NOCREATEROLE", "NOINHERIT",
+ "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD",
+ "REPLICATION", "ROLE", "SUPERUSER", "SYSID",
+ "VALID UNTIL");
+
+ /* complete CREATE ROLE,USER,GROUP <name> IN with ROLE,GROUP */
+ else if (Matches("CREATE", "ROLE|USER|GROUP", MatchAny, "IN"))
+ COMPLETE_WITH("GROUP", "ROLE");
+
+/* CREATE TYPE */
+ else if (Matches("CREATE", "TYPE", MatchAny))
+ COMPLETE_WITH("(", "AS");
+ else if (Matches("CREATE", "TYPE", MatchAny, "AS"))
+ COMPLETE_WITH("ENUM", "RANGE", "(");
+ else if (HeadMatches("CREATE", "TYPE", MatchAny, "AS", "("))
+ {
+ if (TailMatches("(|*,", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatches("(|*,", MatchAny, MatchAnyExcept("*)")))
+ COMPLETE_WITH("COLLATE", ",", ")");
+ }
+ else if (Matches("CREATE", "TYPE", MatchAny, "AS", "ENUM|RANGE"))
+ COMPLETE_WITH("(");
+ else if (HeadMatches("CREATE", "TYPE", MatchAny, "("))
+ {
+ if (TailMatches("(|*,"))
+ COMPLETE_WITH("INPUT", "OUTPUT", "RECEIVE", "SEND",
+ "TYPMOD_IN", "TYPMOD_OUT", "ANALYZE", "SUBSCRIPT",
+ "INTERNALLENGTH", "PASSEDBYVALUE", "ALIGNMENT",
+ "STORAGE", "LIKE", "CATEGORY", "PREFERRED",
+ "DEFAULT", "ELEMENT", "DELIMITER",
+ "COLLATABLE");
+ else if (TailMatches("(*|*,", MatchAnyExcept("*=")))
+ COMPLETE_WITH("=");
+ else if (TailMatches("=", MatchAnyExcept("*)")))
+ COMPLETE_WITH(",", ")");
+ }
+ else if (HeadMatches("CREATE", "TYPE", MatchAny, "AS", "RANGE", "("))
+ {
+ if (TailMatches("(|*,"))
+ COMPLETE_WITH("SUBTYPE", "SUBTYPE_OPCLASS", "COLLATION",
+ "CANONICAL", "SUBTYPE_DIFF",
+ "MULTIRANGE_TYPE_NAME");
+ else if (TailMatches("(*|*,", MatchAnyExcept("*=")))
+ COMPLETE_WITH("=");
+ else if (TailMatches("=", MatchAnyExcept("*)")))
+ COMPLETE_WITH(",", ")");
+ }
+
+/* CREATE VIEW --- is allowed inside CREATE SCHEMA, so use TailMatches */
+ /* Complete CREATE [ OR REPLACE ] VIEW <name> with AS */
+ else if (TailMatches("CREATE", "VIEW", MatchAny) ||
+ TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny))
+ COMPLETE_WITH("AS");
+ /* Complete "CREATE [ OR REPLACE ] VIEW <sth> AS with "SELECT" */
+ else if (TailMatches("CREATE", "VIEW", MatchAny, "AS") ||
+ TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "AS"))
+ COMPLETE_WITH("SELECT");
+
+/* CREATE MATERIALIZED VIEW */
+ else if (Matches("CREATE", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ /* Complete CREATE MATERIALIZED VIEW <name> with AS */
+ else if (Matches("CREATE", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("AS");
+ /* Complete "CREATE MATERIALIZED VIEW <sth> AS with "SELECT" */
+ else if (Matches("CREATE", "MATERIALIZED", "VIEW", MatchAny, "AS"))
+ COMPLETE_WITH("SELECT");
+
+/* CREATE EVENT TRIGGER */
+ else if (Matches("CREATE", "EVENT"))
+ COMPLETE_WITH("TRIGGER");
+ /* Complete CREATE EVENT TRIGGER <name> with ON */
+ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+ /* Complete CREATE EVENT TRIGGER <name> ON with event_type */
+ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON"))
+ COMPLETE_WITH("ddl_command_start", "ddl_command_end", "sql_drop",
+ "table_rewrite");
+
+ /*
+ * Complete CREATE EVENT TRIGGER <name> ON <event_type>. EXECUTE FUNCTION
+ * is the recommended grammar instead of EXECUTE PROCEDURE in version 11
+ * and upwards.
+ */
+ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON", MatchAny))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("WHEN TAG IN (", "EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("WHEN TAG IN (", "EXECUTE PROCEDURE");
+ }
+ else if (HeadMatches("CREATE", "EVENT", "TRIGGER") &&
+ TailMatches("WHEN|AND", MatchAny, "IN", "(*)"))
+ {
+ if (pset.sversion >= 110000)
+ COMPLETE_WITH("EXECUTE FUNCTION");
+ else
+ COMPLETE_WITH("EXECUTE PROCEDURE");
+ }
+ else if (HeadMatches("CREATE", "EVENT", "TRIGGER") &&
+ TailMatches("EXECUTE", "FUNCTION|PROCEDURE"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+
+/* DEALLOCATE */
+ else if (Matches("DEALLOCATE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_prepared_statements,
+ "ALL");
+
+/* DECLARE */
+
+ /*
+ * Complete DECLARE <name> with one of BINARY, ASENSITIVE, INSENSITIVE,
+ * SCROLL, NO SCROLL, and CURSOR.
+ */
+ else if (Matches("DECLARE", MatchAny))
+ COMPLETE_WITH("BINARY", "ASENSITIVE", "INSENSITIVE", "SCROLL", "NO SCROLL",
+ "CURSOR");
+
+ /*
+ * Complete DECLARE ... <option> with other options. The PostgreSQL parser
+ * allows DECLARE options to be specified in any order. But the
+ * tab-completion follows the ordering of them that the SQL standard
+ * provides, like the syntax of DECLARE command in the documentation
+ * indicates.
+ */
+ else if (HeadMatches("DECLARE") && TailMatches("BINARY"))
+ COMPLETE_WITH("ASENSITIVE", "INSENSITIVE", "SCROLL", "NO SCROLL", "CURSOR");
+ else if (HeadMatches("DECLARE") && TailMatches("ASENSITIVE|INSENSITIVE"))
+ COMPLETE_WITH("SCROLL", "NO SCROLL", "CURSOR");
+ else if (HeadMatches("DECLARE") && TailMatches("SCROLL"))
+ COMPLETE_WITH("CURSOR");
+ /* Complete DECLARE ... [options] NO with SCROLL */
+ else if (HeadMatches("DECLARE") && TailMatches("NO"))
+ COMPLETE_WITH("SCROLL");
+
+ /*
+ * Complete DECLARE ... CURSOR with one of WITH HOLD, WITHOUT HOLD, and
+ * FOR
+ */
+ else if (HeadMatches("DECLARE") && TailMatches("CURSOR"))
+ COMPLETE_WITH("WITH HOLD", "WITHOUT HOLD", "FOR");
+ /* Complete DECLARE ... CURSOR WITH|WITHOUT with HOLD */
+ else if (HeadMatches("DECLARE") && TailMatches("CURSOR", "WITH|WITHOUT"))
+ COMPLETE_WITH("HOLD");
+ /* Complete DECLARE ... CURSOR WITH|WITHOUT HOLD with FOR */
+ else if (HeadMatches("DECLARE") && TailMatches("CURSOR", "WITH|WITHOUT", "HOLD"))
+ COMPLETE_WITH("FOR");
+
+/* DELETE --- can be inside EXPLAIN, RULE, etc */
+ /* Complete DELETE with "FROM" */
+ else if (Matches("DELETE"))
+ COMPLETE_WITH("FROM");
+ /* Complete DELETE FROM with a list of tables */
+ else if (TailMatches("DELETE", "FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
+ /* Complete DELETE FROM <table> */
+ else if (TailMatches("DELETE", "FROM", MatchAny))
+ COMPLETE_WITH("USING", "WHERE");
+ /* XXX: implement tab completion for DELETE ... USING */
+
+/* DISCARD */
+ else if (Matches("DISCARD"))
+ COMPLETE_WITH("ALL", "PLANS", "SEQUENCES", "TEMP");
+
+/* DO */
+ else if (Matches("DO"))
+ COMPLETE_WITH("LANGUAGE");
+
+/* DROP */
+ /* Complete DROP object with CASCADE / RESTRICT */
+ else if (Matches("DROP",
+ "COLLATION|CONVERSION|DOMAIN|EXTENSION|LANGUAGE|PUBLICATION|SCHEMA|SEQUENCE|SERVER|SUBSCRIPTION|STATISTICS|TABLE|TYPE|VIEW",
+ MatchAny) ||
+ Matches("DROP", "ACCESS", "METHOD", MatchAny) ||
+ (Matches("DROP", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny) &&
+ ends_with(prev_wd, ')')) ||
+ Matches("DROP", "EVENT", "TRIGGER", MatchAny) ||
+ Matches("DROP", "FOREIGN", "DATA", "WRAPPER", MatchAny) ||
+ Matches("DROP", "FOREIGN", "TABLE", MatchAny) ||
+ Matches("DROP", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* help completing some of the variants */
+ else if (Matches("DROP", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
+ COMPLETE_WITH("(");
+ else if (Matches("DROP", "AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny, "("))
+ COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
+ else if (Matches("DROP", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+ else if (Matches("DROP", "DATABASE", MatchAny))
+ COMPLETE_WITH("WITH (");
+ else if (HeadMatches("DROP", "DATABASE") && (ends_with(prev_wd, '(')))
+ COMPLETE_WITH("FORCE");
+
+ /* DROP INDEX */
+ else if (Matches("DROP", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "CONCURRENTLY");
+ else if (Matches("DROP", "INDEX", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ else if (Matches("DROP", "INDEX", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+ else if (Matches("DROP", "INDEX", "CONCURRENTLY", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP MATERIALIZED VIEW */
+ else if (Matches("DROP", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ else if (Matches("DROP", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (Matches("DROP", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP OWNED BY */
+ else if (Matches("DROP", "OWNED"))
+ COMPLETE_WITH("BY");
+ else if (Matches("DROP", "OWNED", "BY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (Matches("DROP", "OWNED", "BY", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP TEXT SEARCH */
+ else if (Matches("DROP", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+
+ /* DROP TRIGGER */
+ else if (Matches("DROP", "TRIGGER", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("DROP", "TRIGGER", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
+ }
+ else if (Matches("DROP", "TRIGGER", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP ACCESS METHOD */
+ else if (Matches("DROP", "ACCESS"))
+ COMPLETE_WITH("METHOD");
+ else if (Matches("DROP", "ACCESS", "METHOD"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
+
+ /* DROP EVENT TRIGGER */
+ else if (Matches("DROP", "EVENT"))
+ COMPLETE_WITH("TRIGGER");
+ else if (Matches("DROP", "EVENT", "TRIGGER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+
+ /* DROP POLICY <name> */
+ else if (Matches("DROP", "POLICY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_policies);
+ /* DROP POLICY <name> ON */
+ else if (Matches("DROP", "POLICY", MatchAny))
+ COMPLETE_WITH("ON");
+ /* DROP POLICY <name> ON <table> */
+ else if (Matches("DROP", "POLICY", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
+ }
+ else if (Matches("DROP", "POLICY", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP RULE */
+ else if (Matches("DROP", "RULE", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("DROP", "RULE", MatchAny, "ON"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
+ }
+ else if (Matches("DROP", "RULE", MatchAny, "ON", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+ /* DROP TRANSFORM */
+ else if (Matches("DROP", "TRANSFORM"))
+ COMPLETE_WITH("FOR");
+ else if (Matches("DROP", "TRANSFORM", "FOR"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny))
+ COMPLETE_WITH("LANGUAGE");
+ else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny, "LANGUAGE"))
+ {
+ set_completion_reference(prev2_wd);
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ }
+ else if (Matches("DROP", "TRANSFORM", "FOR", MatchAny, "LANGUAGE", MatchAny))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+/* EXECUTE */
+ else if (Matches("EXECUTE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements);
+
+/*
+ * EXPLAIN [ ( option [, ...] ) ] statement
+ * EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
+ */
+ else if (Matches("EXPLAIN"))
+ COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
+ "MERGE INTO", "EXECUTE", "ANALYZE", "VERBOSE");
+ else if (HeadMatches("EXPLAIN", "(*") &&
+ !HeadMatches("EXPLAIN", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("ANALYZE", "VERBOSE", "COSTS", "SETTINGS", "GENERIC_PLAN",
+ "BUFFERS", "WAL", "TIMING", "SUMMARY", "FORMAT");
+ else if (TailMatches("ANALYZE|VERBOSE|COSTS|SETTINGS|GENERIC_PLAN|BUFFERS|WAL|TIMING|SUMMARY"))
+ COMPLETE_WITH("ON", "OFF");
+ else if (TailMatches("FORMAT"))
+ COMPLETE_WITH("TEXT", "XML", "JSON", "YAML");
+ }
+ else if (Matches("EXPLAIN", "ANALYZE"))
+ COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
+ "MERGE INTO", "EXECUTE", "VERBOSE");
+ else if (Matches("EXPLAIN", "(*)") ||
+ Matches("EXPLAIN", "VERBOSE") ||
+ Matches("EXPLAIN", "ANALYZE", "VERBOSE"))
+ COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
+ "MERGE INTO", "EXECUTE");
+
+/* FETCH && MOVE */
+
+ /*
+ * Complete FETCH with one of ABSOLUTE, BACKWARD, FORWARD, RELATIVE, ALL,
+ * NEXT, PRIOR, FIRST, LAST, FROM, IN, and a list of cursors
+ */
+ else if (Matches("FETCH|MOVE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "ABSOLUTE",
+ "BACKWARD",
+ "FORWARD",
+ "RELATIVE",
+ "ALL",
+ "NEXT",
+ "PRIOR",
+ "FIRST",
+ "LAST",
+ "FROM",
+ "IN");
+
+ /*
+ * Complete FETCH BACKWARD or FORWARD with one of ALL, FROM, IN, and a
+ * list of cursors
+ */
+ else if (Matches("FETCH|MOVE", "BACKWARD|FORWARD"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "ALL",
+ "FROM",
+ "IN");
+
+ /*
+ * Complete FETCH <direction> with "FROM" or "IN". These are equivalent,
+ * but we may as well tab-complete both: perhaps some users prefer one
+ * variant or the other.
+ */
+ else if (Matches("FETCH|MOVE", "ABSOLUTE|BACKWARD|FORWARD|RELATIVE",
+ MatchAnyExcept("FROM|IN")) ||
+ Matches("FETCH|MOVE", "ALL|NEXT|PRIOR|FIRST|LAST"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
+ "FROM",
+ "IN");
+ /* Complete FETCH <direction> "FROM" or "IN" with a list of cursors */
+ else if (HeadMatches("FETCH|MOVE") &&
+ TailMatches("FROM|IN"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_cursors);
+
+/* FOREIGN DATA WRAPPER */
+ /* applies in ALTER/DROP FDW and in CREATE SERVER */
+ else if (TailMatches("FOREIGN", "DATA", "WRAPPER") &&
+ !TailMatches("CREATE", MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
+ /* applies in CREATE SERVER */
+ else if (TailMatches("FOREIGN", "DATA", "WRAPPER", MatchAny) &&
+ HeadMatches("CREATE", "SERVER"))
+ COMPLETE_WITH("OPTIONS");
+
+/* FOREIGN TABLE */
+ else if (TailMatches("FOREIGN", "TABLE") &&
+ !TailMatches("CREATE", MatchAny, MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
+
+/* FOREIGN SERVER */
+ else if (TailMatches("FOREIGN", "SERVER"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_servers);
+
+/*
+ * GRANT and REVOKE are allowed inside CREATE SCHEMA and
+ * ALTER DEFAULT PRIVILEGES, so use TailMatches
+ */
+ /* Complete GRANT/REVOKE with a list of roles and privileges */
+ else if (TailMatches("GRANT|REVOKE") ||
+ TailMatches("REVOKE", "ADMIN|GRANT|INHERIT|SET", "OPTION", "FOR"))
+ {
+ /*
+ * With ALTER DEFAULT PRIVILEGES, restrict completion to grantable
+ * privileges (can't grant roles)
+ */
+ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES"))
+ COMPLETE_WITH("SELECT", "INSERT", "UPDATE",
+ "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER",
+ "CREATE", "EXECUTE", "USAGE", "ALL");
+ else if (TailMatches("GRANT"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Privilege_options_of_grant_and_revoke);
+ else if (TailMatches("REVOKE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Privilege_options_of_grant_and_revoke,
+ "GRANT OPTION FOR",
+ "ADMIN OPTION FOR",
+ "INHERIT OPTION FOR",
+ "SET OPTION FOR");
+ else if (TailMatches("REVOKE", "GRANT", "OPTION", "FOR"))
+ COMPLETE_WITH(Privilege_options_of_grant_and_revoke);
+ else if (TailMatches("REVOKE", "ADMIN|INHERIT|SET", "OPTION", "FOR"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ }
+
+ else if (TailMatches("GRANT|REVOKE", "ALTER") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "ALTER"))
+ COMPLETE_WITH("SYSTEM");
+
+ else if (TailMatches("REVOKE", "SET"))
+ COMPLETE_WITH("ON PARAMETER", "OPTION FOR");
+ else if (TailMatches("GRANT", "SET") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "SET") ||
+ TailMatches("GRANT|REVOKE", "ALTER", "SYSTEM") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", "ALTER", "SYSTEM"))
+ COMPLETE_WITH("ON PARAMETER");
+
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "PARAMETER") ||
+ TailMatches("GRANT|REVOKE", MatchAny, MatchAny, "ON", "PARAMETER") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER"))
+ COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_alter_system_set_vars);
+
+ else if (TailMatches("GRANT", MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("GRANT", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny))
+ COMPLETE_WITH("TO");
+
+ else if (TailMatches("REVOKE", MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("REVOKE", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "PARAMETER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, MatchAny, "ON", "PARAMETER", MatchAny))
+ COMPLETE_WITH("FROM");
+
+ /*
+ * Complete GRANT/REVOKE <privilege> with "ON", GRANT/REVOKE <role> with
+ * TO/FROM
+ */
+ else if (TailMatches("GRANT|REVOKE", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny))
+ {
+ if (TailMatches("SELECT|INSERT|UPDATE|DELETE|TRUNCATE|REFERENCES|TRIGGER|CREATE|CONNECT|TEMPORARY|TEMP|EXECUTE|USAGE|ALL"))
+ COMPLETE_WITH("ON");
+ else if (TailMatches("GRANT", MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /*
+ * Complete GRANT/REVOKE <sth> ON with a list of appropriate relations.
+ *
+ * Note: GRANT/REVOKE can get quite complex; tab-completion as implemented
+ * here will only work if the privilege list contains exactly one
+ * privilege.
+ */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON"))
+ {
+ /*
+ * With ALTER DEFAULT PRIVILEGES, restrict completion to the kinds of
+ * objects supported.
+ */
+ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES"))
+ COMPLETE_WITH("TABLES", "SEQUENCES", "FUNCTIONS", "PROCEDURES", "ROUTINES", "TYPES", "SCHEMAS");
+ else
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_grantables,
+ "ALL FUNCTIONS IN SCHEMA",
+ "ALL PROCEDURES IN SCHEMA",
+ "ALL ROUTINES IN SCHEMA",
+ "ALL SEQUENCES IN SCHEMA",
+ "ALL TABLES IN SCHEMA",
+ "DATABASE",
+ "DOMAIN",
+ "FOREIGN DATA WRAPPER",
+ "FOREIGN SERVER",
+ "FUNCTION",
+ "LANGUAGE",
+ "LARGE OBJECT",
+ "PARAMETER",
+ "PROCEDURE",
+ "ROUTINE",
+ "SCHEMA",
+ "SEQUENCE",
+ "TABLE",
+ "TABLESPACE",
+ "TYPE");
+ }
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "ALL"))
+ COMPLETE_WITH("FUNCTIONS IN SCHEMA",
+ "PROCEDURES IN SCHEMA",
+ "ROUTINES IN SCHEMA",
+ "SEQUENCES IN SCHEMA",
+ "TABLES IN SCHEMA");
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN") ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "SERVER");
+
+ /*
+ * Complete "GRANT/REVOKE * ON DATABASE/DOMAIN/..." with a list of
+ * appropriate objects.
+ *
+ * Complete "GRANT/REVOKE * ON *" with "TO/FROM".
+ */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", MatchAny))
+ {
+ if (TailMatches("DATABASE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ else if (TailMatches("DOMAIN"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
+ else if (TailMatches("FUNCTION"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
+ else if (TailMatches("LANGUAGE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ else if (TailMatches("PROCEDURE"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
+ else if (TailMatches("ROUTINE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
+ else if (TailMatches("SCHEMA"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ else if (TailMatches("SEQUENCE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
+ else if (TailMatches("TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
+ else if (TailMatches("TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ else if (TailMatches("TYPE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /*
+ * Complete "GRANT/REVOKE ... TO/FROM" with username, PUBLIC,
+ * CURRENT_ROLE, CURRENT_USER, or SESSION_USER.
+ */
+ else if ((HeadMatches("GRANT") && TailMatches("TO")) ||
+ (HeadMatches("REVOKE") && TailMatches("FROM")))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+
+ /*
+ * Offer grant options after that.
+ */
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny))
+ COMPLETE_WITH("WITH ADMIN",
+ "WITH INHERIT",
+ "WITH SET",
+ "WITH GRANT OPTION",
+ "GRANTED BY");
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH"))
+ COMPLETE_WITH("ADMIN",
+ "INHERIT",
+ "SET",
+ "GRANT OPTION");
+ else if (HeadMatches("GRANT") &&
+ (TailMatches("TO", MatchAny, "WITH", "ADMIN|INHERIT|SET")))
+ COMPLETE_WITH("OPTION", "TRUE", "FALSE");
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH", MatchAny, "OPTION"))
+ COMPLETE_WITH("GRANTED BY");
+ else if (HeadMatches("GRANT") && TailMatches("TO", MatchAny, "WITH", MatchAny, "OPTION", "GRANTED", "BY"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* Complete "ALTER DEFAULT PRIVILEGES ... GRANT/REVOKE ... TO/FROM */
+ else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO|FROM"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ Keywords_for_list_of_grant_roles);
+ /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */
+ else if (HeadMatches("GRANT") && TailMatches("ON", MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else if (HeadMatches("REVOKE") && TailMatches("ON", MatchAny, MatchAny))
+ COMPLETE_WITH("FROM");
+
+ /* Complete "GRANT/REVOKE * ON ALL * IN SCHEMA *" with TO/FROM */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny))
+ {
+ if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /* Complete "GRANT/REVOKE * ON FOREIGN DATA WRAPPER *" with TO/FROM */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN", "DATA", "WRAPPER", MatchAny))
+ {
+ if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+ /* Complete "GRANT/REVOKE * ON FOREIGN SERVER *" with TO/FROM */
+ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny) ||
+ TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "FOREIGN", "SERVER", MatchAny))
+ {
+ if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
+ COMPLETE_WITH("TO");
+ else
+ COMPLETE_WITH("FROM");
+ }
+
+/* GROUP BY */
+ else if (TailMatches("FROM", MatchAny, "GROUP"))
+ COMPLETE_WITH("BY");
+
+/* IMPORT FOREIGN SCHEMA */
+ else if (Matches("IMPORT"))
+ COMPLETE_WITH("FOREIGN SCHEMA");
+ else if (Matches("IMPORT", "FOREIGN"))
+ COMPLETE_WITH("SCHEMA");
+ else if (Matches("IMPORT", "FOREIGN", "SCHEMA", MatchAny))
+ COMPLETE_WITH("EXCEPT (", "FROM SERVER", "LIMIT TO (");
+ else if (TailMatches("LIMIT", "TO", "(*)") ||
+ TailMatches("EXCEPT", "(*)"))
+ COMPLETE_WITH("FROM SERVER");
+ else if (TailMatches("FROM", "SERVER", MatchAny))
+ COMPLETE_WITH("INTO");
+ else if (TailMatches("FROM", "SERVER", MatchAny, "INTO"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ else if (TailMatches("FROM", "SERVER", MatchAny, "INTO", MatchAny))
+ COMPLETE_WITH("OPTIONS (");
+
+/* INSERT --- can be inside EXPLAIN, RULE, etc */
+ /* Complete NOT MATCHED THEN INSERT */
+ else if (TailMatches("NOT", "MATCHED", "THEN", "INSERT"))
+ COMPLETE_WITH("VALUES", "(");
+ /* Complete INSERT with "INTO" */
+ else if (TailMatches("INSERT"))
+ COMPLETE_WITH("INTO");
+ /* Complete INSERT INTO with table names */
+ else if (TailMatches("INSERT", "INTO"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
+ /* Complete "INSERT INTO <table> (" with attribute names */
+ else if (TailMatches("INSERT", "INTO", MatchAny, "("))
+ COMPLETE_WITH_ATTR(prev2_wd);
+
+ /*
+ * Complete INSERT INTO <table> with "(" or "VALUES" or "SELECT" or
+ * "TABLE" or "DEFAULT VALUES" or "OVERRIDING"
+ */
+ else if (TailMatches("INSERT", "INTO", MatchAny))
+ COMPLETE_WITH("(", "DEFAULT VALUES", "SELECT", "TABLE", "VALUES", "OVERRIDING");
+
+ /*
+ * Complete INSERT INTO <table> (attribs) with "VALUES" or "SELECT" or
+ * "TABLE" or "OVERRIDING"
+ */
+ else if (TailMatches("INSERT", "INTO", MatchAny, MatchAny) &&
+ ends_with(prev_wd, ')'))
+ COMPLETE_WITH("SELECT", "TABLE", "VALUES", "OVERRIDING");
+
+ /* Complete OVERRIDING */
+ else if (TailMatches("OVERRIDING"))
+ COMPLETE_WITH("SYSTEM VALUE", "USER VALUE");
+
+ /* Complete after OVERRIDING clause */
+ else if (TailMatches("OVERRIDING", MatchAny, "VALUE"))
+ COMPLETE_WITH("SELECT", "TABLE", "VALUES");
+
+ /* Insert an open parenthesis after "VALUES" */
+ else if (TailMatches("VALUES") && !TailMatches("DEFAULT", "VALUES"))
+ COMPLETE_WITH("(");
+
+/* LOCK */
+ /* Complete LOCK [TABLE] [ONLY] with a list of tables */
+ else if (Matches("LOCK"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
+ "TABLE", "ONLY");
+ else if (Matches("LOCK", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
+ "ONLY");
+ else if (Matches("LOCK", "TABLE", "ONLY") || Matches("LOCK", "ONLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ /* For the following, handle the case of a single table only for now */
+
+ /* Complete LOCK [TABLE] [ONLY] <table> with IN or NOWAIT */
+ else if (Matches("LOCK", MatchAnyExcept("TABLE|ONLY")) ||
+ Matches("LOCK", "TABLE", MatchAnyExcept("ONLY")) ||
+ Matches("LOCK", "ONLY", MatchAny) ||
+ Matches("LOCK", "TABLE", "ONLY", MatchAny))
+ COMPLETE_WITH("IN", "NOWAIT");
+
+ /* Complete LOCK [TABLE] [ONLY] <table> IN with a lock mode */
+ else if (HeadMatches("LOCK") && TailMatches("IN"))
+ COMPLETE_WITH("ACCESS SHARE MODE",
+ "ROW SHARE MODE", "ROW EXCLUSIVE MODE",
+ "SHARE UPDATE EXCLUSIVE MODE", "SHARE MODE",
+ "SHARE ROW EXCLUSIVE MODE",
+ "EXCLUSIVE MODE", "ACCESS EXCLUSIVE MODE");
+
+ /*
+ * Complete LOCK [TABLE][ONLY] <table> IN ACCESS|ROW with rest of lock
+ * mode
+ */
+ else if (HeadMatches("LOCK") && TailMatches("IN", "ACCESS|ROW"))
+ COMPLETE_WITH("EXCLUSIVE MODE", "SHARE MODE");
+
+ /* Complete LOCK [TABLE] [ONLY] <table> IN SHARE with rest of lock mode */
+ else if (HeadMatches("LOCK") && TailMatches("IN", "SHARE"))
+ COMPLETE_WITH("MODE", "ROW EXCLUSIVE MODE",
+ "UPDATE EXCLUSIVE MODE");
+
+ /* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
+ else if (HeadMatches("LOCK") && TailMatches("MODE"))
+ COMPLETE_WITH("NOWAIT");
+
+/* MERGE --- can be inside EXPLAIN */
+ else if (TailMatches("MERGE"))
+ COMPLETE_WITH("INTO");
+ else if (TailMatches("MERGE", "INTO"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets);
+
+ /* Complete MERGE INTO <table> [[AS] <alias>] with USING */
+ else if (TailMatches("MERGE", "INTO", MatchAny))
+ COMPLETE_WITH("USING", "AS");
+ else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAnyExcept("USING|AS")))
+ COMPLETE_WITH("USING");
+
+ /*
+ * Complete MERGE INTO ... USING with a list of relations supporting
+ * SELECT
+ */
+ else if (TailMatches("MERGE", "INTO", MatchAny, "USING") ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING") ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+ /*
+ * Complete MERGE INTO <table> [[AS] <alias>] USING <relations> [[AS]
+ * alias] with ON
+ */
+ else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny))
+ COMPLETE_WITH("AS", "ON");
+ else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, "AS", MatchAny) ||
+ TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
+ TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
+ TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")))
+ COMPLETE_WITH("ON");
+
+ /* Complete MERGE INTO ... ON with target table attributes */
+ else if (TailMatches("INTO", MatchAny, "USING", MatchAny, "ON"))
+ COMPLETE_WITH_ATTR(prev4_wd);
+ else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON"))
+ COMPLETE_WITH_ATTR(prev8_wd);
+ else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON"))
+ COMPLETE_WITH_ATTR(prev6_wd);
+
+ /*
+ * Complete ... USING <relation> [[AS] alias] ON join condition
+ * (consisting of one or three words typically used) with WHEN [NOT]
+ * MATCHED
+ */
+ else if (TailMatches("USING", MatchAny, "ON", MatchAny) ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny) ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny) ||
+ TailMatches("USING", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")))
+ COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
+ else if (TailMatches("USING", MatchAny, "ON", MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
+ TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN"))
+ COMPLETE_WITH("MATCHED", "NOT MATCHED");
+
+ /* Complete ... WHEN [NOT] MATCHED with THEN/AND */
+ else if (TailMatches("WHEN", "MATCHED") ||
+ TailMatches("WHEN", "NOT", "MATCHED"))
+ COMPLETE_WITH("THEN", "AND");
+
+ /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
+ else if (TailMatches("WHEN", "MATCHED", "THEN"))
+ COMPLETE_WITH("UPDATE SET", "DELETE", "DO NOTHING");
+
+ /* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */
+ else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN"))
+ COMPLETE_WITH("INSERT", "DO NOTHING");
+
+/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
+ else if (TailMatches("NOTIFY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_channels);
+
+/* OPTIONS */
+ else if (TailMatches("OPTIONS"))
+ COMPLETE_WITH("(");
+
+/* OWNER TO - complete with available roles */
+ else if (TailMatches("OWNER", "TO"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ "CURRENT_ROLE",
+ "CURRENT_USER",
+ "SESSION_USER");
+
+/* ORDER BY */
+ else if (TailMatches("FROM", MatchAny, "ORDER"))
+ COMPLETE_WITH("BY");
+ else if (TailMatches("FROM", MatchAny, "ORDER", "BY"))
+ COMPLETE_WITH_ATTR(prev3_wd);
+
+/* PREPARE xx AS */
+ else if (Matches("PREPARE", MatchAny, "AS"))
+ COMPLETE_WITH("SELECT", "UPDATE", "INSERT INTO", "DELETE FROM");
+
+/*
+ * PREPARE TRANSACTION is missing on purpose. It's intended for transaction
+ * managers, not for manual use in interactive sessions.
+ */
+
+/* REASSIGN OWNED BY xxx TO yyy */
+ else if (Matches("REASSIGN"))
+ COMPLETE_WITH("OWNED BY");
+ else if (Matches("REASSIGN", "OWNED"))
+ COMPLETE_WITH("BY");
+ else if (Matches("REASSIGN", "OWNED", "BY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (Matches("REASSIGN", "OWNED", "BY", MatchAny))
+ COMPLETE_WITH("TO");
+ else if (Matches("REASSIGN", "OWNED", "BY", MatchAny, "TO"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+
+/* REFRESH MATERIALIZED VIEW */
+ else if (Matches("REFRESH"))
+ COMPLETE_WITH("MATERIALIZED VIEW");
+ else if (Matches("REFRESH", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
+ "CONCURRENTLY");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny))
+ COMPLETE_WITH("WITH");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny))
+ COMPLETE_WITH("WITH");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny, "WITH"))
+ COMPLETE_WITH("NO DATA", "DATA");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny, "WITH"))
+ COMPLETE_WITH("NO DATA", "DATA");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", MatchAny, "WITH", "NO"))
+ COMPLETE_WITH("DATA");
+ else if (Matches("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny, "WITH", "NO"))
+ COMPLETE_WITH("DATA");
+
+/* REINDEX */
+ else if (Matches("REINDEX") ||
+ Matches("REINDEX", "(*)"))
+ COMPLETE_WITH("TABLE", "INDEX", "SYSTEM", "SCHEMA", "DATABASE");
+ else if (Matches("REINDEX", "TABLE") ||
+ Matches("REINDEX", "(*)", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexables,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "INDEX") ||
+ Matches("REINDEX", "(*)", "INDEX"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "SCHEMA") ||
+ Matches("REINDEX", "(*)", "SCHEMA"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "SYSTEM|DATABASE") ||
+ Matches("REINDEX", "(*)", "SYSTEM|DATABASE"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_databases,
+ "CONCURRENTLY");
+ else if (Matches("REINDEX", "TABLE", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "TABLE", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
+ else if (Matches("REINDEX", "INDEX", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "INDEX", "CONCURRENTLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ else if (Matches("REINDEX", "SCHEMA", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "SCHEMA", "CONCURRENTLY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ else if (Matches("REINDEX", "SYSTEM|DATABASE", "CONCURRENTLY") ||
+ Matches("REINDEX", "(*)", "SYSTEM|DATABASE", "CONCURRENTLY"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ else if (HeadMatches("REINDEX", "(*") &&
+ !HeadMatches("REINDEX", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("CONCURRENTLY", "TABLESPACE", "VERBOSE");
+ else if (TailMatches("TABLESPACE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ }
+
+/* SECURITY LABEL */
+ else if (Matches("SECURITY"))
+ COMPLETE_WITH("LABEL");
+ else if (Matches("SECURITY", "LABEL"))
+ COMPLETE_WITH("ON", "FOR");
+ else if (Matches("SECURITY", "LABEL", "FOR", MatchAny))
+ COMPLETE_WITH("ON");
+ else if (Matches("SECURITY", "LABEL", "ON") ||
+ Matches("SECURITY", "LABEL", "FOR", MatchAny, "ON"))
+ COMPLETE_WITH("TABLE", "COLUMN", "AGGREGATE", "DATABASE", "DOMAIN",
+ "EVENT TRIGGER", "FOREIGN TABLE", "FUNCTION",
+ "LARGE OBJECT", "MATERIALIZED VIEW", "LANGUAGE",
+ "PUBLICATION", "PROCEDURE", "ROLE", "ROUTINE", "SCHEMA",
+ "SEQUENCE", "SUBSCRIPTION", "TABLESPACE", "TYPE", "VIEW");
+ else if (Matches("SECURITY", "LABEL", "ON", MatchAny, MatchAny))
+ COMPLETE_WITH("IS");
+
+/* SELECT */
+ /* naah . . . */
+
+/* SET, RESET, SHOW */
+ /* Complete with a variable name */
+ else if (TailMatches("SET|RESET") && !TailMatches("UPDATE", MatchAny, "SET"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
+ "CONSTRAINTS",
+ "TRANSACTION",
+ "SESSION",
+ "ROLE",
+ "TABLESPACE",
+ "ALL");
+ else if (Matches("SHOW"))
+ COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_show_vars,
+ "SESSION AUTHORIZATION",
+ "ALL");
+ else if (Matches("SHOW", "SESSION"))
+ COMPLETE_WITH("AUTHORIZATION");
+ /* Complete "SET TRANSACTION" */
+ else if (Matches("SET", "TRANSACTION"))
+ COMPLETE_WITH("SNAPSHOT", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
+ else if (Matches("BEGIN|START", "TRANSACTION") ||
+ Matches("BEGIN", "WORK") ||
+ Matches("BEGIN") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION"))
+ COMPLETE_WITH("ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "NOT") ||
+ Matches("BEGIN", "NOT") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "NOT"))
+ COMPLETE_WITH("DEFERRABLE");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION") ||
+ Matches("BEGIN", "ISOLATION") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION"))
+ COMPLETE_WITH("LEVEL");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION", "LEVEL") ||
+ Matches("BEGIN", "ISOLATION", "LEVEL") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION", "LEVEL"))
+ COMPLETE_WITH("READ", "REPEATABLE READ", "SERIALIZABLE");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION", "LEVEL", "READ") ||
+ Matches("BEGIN", "ISOLATION", "LEVEL", "READ") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION", "LEVEL", "READ"))
+ COMPLETE_WITH("UNCOMMITTED", "COMMITTED");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "ISOLATION", "LEVEL", "REPEATABLE") ||
+ Matches("BEGIN", "ISOLATION", "LEVEL", "REPEATABLE") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "ISOLATION", "LEVEL", "REPEATABLE"))
+ COMPLETE_WITH("READ");
+ else if (Matches("SET|BEGIN|START", "TRANSACTION|WORK", "READ") ||
+ Matches("BEGIN", "READ") ||
+ Matches("SET", "SESSION", "CHARACTERISTICS", "AS", "TRANSACTION", "READ"))
+ COMPLETE_WITH("ONLY", "WRITE");
+ /* SET CONSTRAINTS */
+ else if (Matches("SET", "CONSTRAINTS"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_constraints_with_schema,
+ "ALL");
+ /* Complete SET CONSTRAINTS <foo> with DEFERRED|IMMEDIATE */
+ else if (Matches("SET", "CONSTRAINTS", MatchAny))
+ COMPLETE_WITH("DEFERRED", "IMMEDIATE");
+ /* Complete SET ROLE */
+ else if (Matches("SET", "ROLE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ /* Complete SET SESSION with AUTHORIZATION or CHARACTERISTICS... */
+ else if (Matches("SET", "SESSION"))
+ COMPLETE_WITH("AUTHORIZATION", "CHARACTERISTICS AS TRANSACTION");
+ /* Complete SET SESSION AUTHORIZATION with username */
+ else if (Matches("SET", "SESSION", "AUTHORIZATION"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ "DEFAULT");
+ /* Complete RESET SESSION with AUTHORIZATION */
+ else if (Matches("RESET", "SESSION"))
+ COMPLETE_WITH("AUTHORIZATION");
+ /* Complete SET <var> with "TO" */
+ else if (Matches("SET", MatchAny))
+ COMPLETE_WITH("TO");
+
+ /*
+ * Complete ALTER DATABASE|FUNCTION|PROCEDURE|ROLE|ROUTINE|USER ... SET
+ * <name>
+ */
+ else if (HeadMatches("ALTER", "DATABASE|FUNCTION|PROCEDURE|ROLE|ROUTINE|USER") &&
+ TailMatches("SET", MatchAny) &&
+ !TailMatches("SCHEMA"))
+ COMPLETE_WITH("FROM CURRENT", "TO");
+
+ /*
+ * Suggest possible variable values in SET variable TO|=, along with the
+ * preceding ALTER syntaxes.
+ */
+ else if (TailMatches("SET", MatchAny, "TO|=") &&
+ !TailMatches("UPDATE", MatchAny, "SET", MatchAny, "TO|="))
+ {
+ /* special cased code for individual GUCs */
+ if (TailMatches("DateStyle", "TO|="))
+ COMPLETE_WITH("ISO", "SQL", "Postgres", "German",
+ "YMD", "DMY", "MDY",
+ "US", "European", "NonEuropean",
+ "DEFAULT");
+ else if (TailMatches("search_path", "TO|="))
+ {
+ /* Here, we want to allow pg_catalog, so use narrower exclusion */
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
+ " AND nspname NOT LIKE E'pg\\\\_toast%%'"
+ " AND nspname NOT LIKE E'pg\\\\_temp%%'",
+ "DEFAULT");
+ }
+ else if (TailMatches("TimeZone", "TO|="))
+ COMPLETE_WITH_TIMEZONE_NAME();
+ else
+ {
+ /* generic, type based, GUC support */
+ char *guctype = get_guctype(prev2_wd);
+
+ /*
+ * Note: if we don't recognize the GUC name, it's important to not
+ * offer any completions, as most likely we've misinterpreted the
+ * context and this isn't a GUC-setting command at all.
+ */
+ if (guctype)
+ {
+ if (strcmp(guctype, "enum") == 0)
+ {
+ set_completion_reference_verbatim(prev2_wd);
+ COMPLETE_WITH_QUERY_PLUS(Query_for_values_of_enum_GUC,
+ "DEFAULT");
+ }
+ else if (strcmp(guctype, "bool") == 0)
+ COMPLETE_WITH("on", "off", "true", "false", "yes", "no",
+ "1", "0", "DEFAULT");
+ else
+ COMPLETE_WITH("DEFAULT");
+
+ free(guctype);
+ }
+ }
+ }
+
+/* START TRANSACTION */
+ else if (Matches("START"))
+ COMPLETE_WITH("TRANSACTION");
+
+/* TABLE, but not TABLE embedded in other commands */
+ else if (Matches("TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+/* TABLESAMPLE */
+ else if (TailMatches("TABLESAMPLE"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablesample_methods);
+ else if (TailMatches("TABLESAMPLE", MatchAny))
+ COMPLETE_WITH("(");
+
+/* TRUNCATE */
+ else if (Matches("TRUNCATE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
+ "TABLE", "ONLY");
+ else if (Matches("TRUNCATE", "TABLE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
+ "ONLY");
+ else if (HeadMatches("TRUNCATE") && TailMatches("ONLY"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables);
+ else if (Matches("TRUNCATE", MatchAny) ||
+ Matches("TRUNCATE", "TABLE|ONLY", MatchAny) ||
+ Matches("TRUNCATE", "TABLE", "ONLY", MatchAny))
+ COMPLETE_WITH("RESTART IDENTITY", "CONTINUE IDENTITY", "CASCADE", "RESTRICT");
+ else if (HeadMatches("TRUNCATE") && TailMatches("IDENTITY"))
+ COMPLETE_WITH("CASCADE", "RESTRICT");
+
+/* UNLISTEN */
+ else if (Matches("UNLISTEN"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_channels, "*");
+
+/* UPDATE --- can be inside EXPLAIN, RULE, etc */
+ /* If prev. word is UPDATE suggest a list of tables */
+ else if (TailMatches("UPDATE"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
+ /* Complete UPDATE <table> with "SET" */
+ else if (TailMatches("UPDATE", MatchAny))
+ COMPLETE_WITH("SET");
+ /* Complete UPDATE <table> SET with list of attributes */
+ else if (TailMatches("UPDATE", MatchAny, "SET"))
+ COMPLETE_WITH_ATTR(prev2_wd);
+ /* UPDATE <table> SET <attr> = */
+ else if (TailMatches("UPDATE", MatchAny, "SET", MatchAnyExcept("*=")))
+ COMPLETE_WITH("=");
+
+/* USER MAPPING */
+ else if (Matches("ALTER|CREATE|DROP", "USER", "MAPPING"))
+ COMPLETE_WITH("FOR");
+ else if (Matches("CREATE", "USER", "MAPPING", "FOR"))
+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
+ "CURRENT_ROLE",
+ "CURRENT_USER",
+ "PUBLIC",
+ "USER");
+ else if (Matches("ALTER|DROP", "USER", "MAPPING", "FOR"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
+ else if (Matches("CREATE|ALTER|DROP", "USER", "MAPPING", "FOR", MatchAny))
+ COMPLETE_WITH("SERVER");
+ else if (Matches("CREATE|ALTER", "USER", "MAPPING", "FOR", MatchAny, "SERVER", MatchAny))
+ COMPLETE_WITH("OPTIONS");
+
+/*
+ * VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
+ * VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
+ */
+ else if (Matches("VACUUM"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "FULL",
+ "FREEZE",
+ "ANALYZE",
+ "VERBOSE");
+ else if (Matches("VACUUM", "FULL"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "FREEZE",
+ "ANALYZE",
+ "VERBOSE");
+ else if (Matches("VACUUM", "FREEZE") ||
+ Matches("VACUUM", "FULL", "FREEZE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "VERBOSE",
+ "ANALYZE");
+ else if (Matches("VACUUM", "VERBOSE") ||
+ Matches("VACUUM", "FULL|FREEZE", "VERBOSE") ||
+ Matches("VACUUM", "FULL", "FREEZE", "VERBOSE"))
+ COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
+ "ANALYZE");
+ else if (HeadMatches("VACUUM", "(*") &&
+ !HeadMatches("VACUUM", "(*)"))
+ {
+ /*
+ * This fires if we're in an unfinished parenthesized option list.
+ * get_previous_words treats a completed parenthesized option list as
+ * one word, so the above test is correct.
+ */
+ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ','))
+ COMPLETE_WITH("FULL", "FREEZE", "ANALYZE", "VERBOSE",
+ "DISABLE_PAGE_SKIPPING", "SKIP_LOCKED",
+ "INDEX_CLEANUP", "PROCESS_MAIN", "PROCESS_TOAST",
+ "TRUNCATE", "PARALLEL", "SKIP_DATABASE_STATS",
+ "ONLY_DATABASE_STATS", "BUFFER_USAGE_LIMIT");
+ else if (TailMatches("FULL|FREEZE|ANALYZE|VERBOSE|DISABLE_PAGE_SKIPPING|SKIP_LOCKED|PROCESS_MAIN|PROCESS_TOAST|TRUNCATE|SKIP_DATABASE_STATS|ONLY_DATABASE_STATS"))
+ COMPLETE_WITH("ON", "OFF");
+ else if (TailMatches("INDEX_CLEANUP"))
+ COMPLETE_WITH("AUTO", "ON", "OFF");
+ }
+ else if (HeadMatches("VACUUM") && TailMatches("("))
+ /* "VACUUM (" should be caught above, so assume we want columns */
+ COMPLETE_WITH_ATTR(prev2_wd);
+ else if (HeadMatches("VACUUM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables);
+
+/* WITH [RECURSIVE] */
+
+ /*
+ * Only match when WITH is the first word, as WITH may appear in many
+ * other contexts.
+ */
+ else if (Matches("WITH"))
+ COMPLETE_WITH("RECURSIVE");
+
+/* WHERE */
+ /* Simple case of the word before the where being the table name */
+ else if (TailMatches(MatchAny, "WHERE"))
+ COMPLETE_WITH_ATTR(prev2_wd);
+
+/* ... FROM ... */
+/* TODO: also include SRF ? */
+ else if (TailMatches("FROM") && !Matches("COPY|\\copy", MatchAny, "FROM"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+/* ... JOIN ... */
+ else if (TailMatches("JOIN"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
+
+/* Backslash commands */
+/* TODO: \dc \dd \dl */
+ else if (TailMatchesCS("\\?"))
+ COMPLETE_WITH_CS("commands", "options", "variables");
+ else if (TailMatchesCS("\\connect|\\c"))
+ {
+ if (!recognized_connection_string(text))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ }
+ else if (TailMatchesCS("\\connect|\\c", MatchAny))
+ {
+ if (!recognized_connection_string(prev_wd))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ }
+ else if (TailMatchesCS("\\da*"))
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates);
+ else if (TailMatchesCS("\\dAc*", MatchAny) ||
+ TailMatchesCS("\\dAf*", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatchesCS("\\dAo*", MatchAny) ||
+ TailMatchesCS("\\dAp*", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families);
+ else if (TailMatchesCS("\\dA*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
+ else if (TailMatchesCS("\\db*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
+ else if (TailMatchesCS("\\dconfig*"))
+ COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_show_vars);
+ else if (TailMatchesCS("\\dD*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
+ else if (TailMatchesCS("\\des*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_servers);
+ else if (TailMatchesCS("\\deu*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
+ 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);
+ else if (HeadMatchesCS("\\df*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+
+ else if (TailMatchesCS("\\dFd*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
+ else if (TailMatchesCS("\\dFp*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
+ else if (TailMatchesCS("\\dFt*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
+ /* must be at end of \dF alternatives: */
+ else if (TailMatchesCS("\\dF*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
+
+ else if (TailMatchesCS("\\di*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
+ else if (TailMatchesCS("\\dL*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_languages);
+ else if (TailMatchesCS("\\dn*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
+ /* no support for completing operators, but we can complete types: */
+ else if (HeadMatchesCS("\\do*", MatchAny))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatchesCS("\\dp") || TailMatchesCS("\\z"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
+ else if (TailMatchesCS("\\dPi*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_indexes);
+ else if (TailMatchesCS("\\dPt*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
+ else if (TailMatchesCS("\\dP*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_relations);
+ else if (TailMatchesCS("\\dRp*"))
+ COMPLETE_WITH_VERSIONED_QUERY(Query_for_list_of_publications);
+ else if (TailMatchesCS("\\dRs*"))
+ COMPLETE_WITH_VERSIONED_QUERY(Query_for_list_of_subscriptions);
+ else if (TailMatchesCS("\\ds*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
+ else if (TailMatchesCS("\\dt*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
+ else if (TailMatchesCS("\\dT*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
+ else if (TailMatchesCS("\\du*") ||
+ TailMatchesCS("\\dg*") ||
+ TailMatchesCS("\\drg*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (TailMatchesCS("\\dv*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+ else if (TailMatchesCS("\\dx*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_extensions);
+ else if (TailMatchesCS("\\dX*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_statistics);
+ else if (TailMatchesCS("\\dm*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
+ else if (TailMatchesCS("\\dE*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
+ else if (TailMatchesCS("\\dy*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
+
+ /* must be at end of \d alternatives: */
+ else if (TailMatchesCS("\\d*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations);
+
+ else if (TailMatchesCS("\\ef"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
+ else if (TailMatchesCS("\\ev"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+
+ else if (TailMatchesCS("\\encoding"))
+ COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_encodings);
+ else if (TailMatchesCS("\\h|\\help"))
+ COMPLETE_WITH_LIST(sql_commands);
+ else if (TailMatchesCS("\\h|\\help", MatchAny))
+ {
+ if (TailMatches("DROP"))
+ matches = rl_completion_matches(text, drop_command_generator);
+ else if (TailMatches("ALTER"))
+ matches = rl_completion_matches(text, alter_command_generator);
+
+ /*
+ * CREATE is recognized by tail match elsewhere, so doesn't need to be
+ * repeated here
+ */
+ }
+ else if (TailMatchesCS("\\h|\\help", MatchAny, MatchAny))
+ {
+ if (TailMatches("CREATE|DROP", "ACCESS"))
+ COMPLETE_WITH("METHOD");
+ else if (TailMatches("ALTER", "DEFAULT"))
+ COMPLETE_WITH("PRIVILEGES");
+ else if (TailMatches("CREATE|ALTER|DROP", "EVENT"))
+ COMPLETE_WITH("TRIGGER");
+ else if (TailMatches("CREATE|ALTER|DROP", "FOREIGN"))
+ COMPLETE_WITH("DATA WRAPPER", "TABLE");
+ else if (TailMatches("ALTER", "LARGE"))
+ COMPLETE_WITH("OBJECT");
+ else if (TailMatches("CREATE|ALTER|DROP", "MATERIALIZED"))
+ COMPLETE_WITH("VIEW");
+ else if (TailMatches("CREATE|ALTER|DROP", "TEXT"))
+ COMPLETE_WITH("SEARCH");
+ else if (TailMatches("CREATE|ALTER|DROP", "USER"))
+ COMPLETE_WITH("MAPPING FOR");
+ }
+ else if (TailMatchesCS("\\h|\\help", MatchAny, MatchAny, MatchAny))
+ {
+ if (TailMatches("CREATE|ALTER|DROP", "FOREIGN", "DATA"))
+ COMPLETE_WITH("WRAPPER");
+ else if (TailMatches("CREATE|ALTER|DROP", "TEXT", "SEARCH"))
+ COMPLETE_WITH("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE");
+ else if (TailMatches("CREATE|ALTER|DROP", "USER", "MAPPING"))
+ COMPLETE_WITH("FOR");
+ }
+ else if (TailMatchesCS("\\l*") && !TailMatchesCS("\\lo*"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_databases);
+ else if (TailMatchesCS("\\password"))
+ COMPLETE_WITH_QUERY(Query_for_list_of_roles);
+ else if (TailMatchesCS("\\pset"))
+ COMPLETE_WITH_CS("border", "columns", "csv_fieldsep", "expanded",
+ "fieldsep", "fieldsep_zero", "footer", "format",
+ "linestyle", "null", "numericlocale",
+ "pager", "pager_min_lines",
+ "recordsep", "recordsep_zero",
+ "tableattr", "title", "tuples_only",
+ "unicode_border_linestyle",
+ "unicode_column_linestyle",
+ "unicode_header_linestyle",
+ "xheader_width");
+ else if (TailMatchesCS("\\pset", MatchAny))
+ {
+ if (TailMatchesCS("format"))
+ COMPLETE_WITH_CS("aligned", "asciidoc", "csv", "html", "latex",
+ "latex-longtable", "troff-ms", "unaligned",
+ "wrapped");
+ else if (TailMatchesCS("xheader_width"))
+ COMPLETE_WITH_CS("full", "column", "page");
+ else if (TailMatchesCS("linestyle"))
+ COMPLETE_WITH_CS("ascii", "old-ascii", "unicode");
+ else if (TailMatchesCS("pager"))
+ COMPLETE_WITH_CS("on", "off", "always");
+ else if (TailMatchesCS("unicode_border_linestyle|"
+ "unicode_column_linestyle|"
+ "unicode_header_linestyle"))
+ COMPLETE_WITH_CS("single", "double");
+ }
+ else if (TailMatchesCS("\\unset"))
+ matches = complete_from_variables(text, "", "", true);
+ else if (TailMatchesCS("\\set"))
+ matches = complete_from_variables(text, "", "", false);
+ else if (TailMatchesCS("\\set", MatchAny))
+ {
+ if (TailMatchesCS("AUTOCOMMIT|ON_ERROR_STOP|QUIET|SHOW_ALL_RESULTS|"
+ "SINGLELINE|SINGLESTEP"))
+ COMPLETE_WITH_CS("on", "off");
+ else if (TailMatchesCS("COMP_KEYWORD_CASE"))
+ COMPLETE_WITH_CS("lower", "upper",
+ "preserve-lower", "preserve-upper");
+ else if (TailMatchesCS("ECHO"))
+ COMPLETE_WITH_CS("errors", "queries", "all", "none");
+ else if (TailMatchesCS("ECHO_HIDDEN"))
+ COMPLETE_WITH_CS("noexec", "off", "on");
+ else if (TailMatchesCS("HISTCONTROL"))
+ COMPLETE_WITH_CS("ignorespace", "ignoredups",
+ "ignoreboth", "none");
+ else if (TailMatchesCS("ON_ERROR_ROLLBACK"))
+ COMPLETE_WITH_CS("on", "off", "interactive");
+ else if (TailMatchesCS("SHOW_CONTEXT"))
+ COMPLETE_WITH_CS("never", "errors", "always");
+ else if (TailMatchesCS("VERBOSITY"))
+ COMPLETE_WITH_CS("default", "verbose", "terse", "sqlstate");
+ }
+ else if (TailMatchesCS("\\sf*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
+ else if (TailMatchesCS("\\sv*"))
+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
+ else if (TailMatchesCS("\\cd|\\e|\\edit|\\g|\\gx|\\i|\\include|"
+ "\\ir|\\include_relative|\\o|\\out|"
+ "\\s|\\w|\\write|\\lo_import"))
+ {
+ completion_charp = "\\";
+ completion_force_quote = false;
+ matches = rl_completion_matches(text, complete_from_files);
+ }
+
+ /*
+ * Finally, we look through the list of "things", such as TABLE, INDEX and
+ * check if that was the previous word. If so, execute the query to get a
+ * list of them.
+ */
+ else
+ {
+ const pgsql_thing_t *wac;
+
+ for (wac = words_after_create; wac->name != NULL; wac++)
+ {
+ if (pg_strcasecmp(prev_wd, wac->name) == 0)
+ {
+ if (wac->query)
+ COMPLETE_WITH_QUERY_LIST(wac->query,
+ wac->keywords);
+ else if (wac->vquery)
+ COMPLETE_WITH_VERSIONED_QUERY_LIST(wac->vquery,
+ wac->keywords);
+ else if (wac->squery)
+ COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(wac->squery,
+ wac->keywords);
+ break;
+ }
+ }
+ }
+
+ /*
+ * If we still don't have anything to match we have to fabricate some sort
+ * of default list. If we were to just return NULL, readline automatically
+ * attempts filename completion, and that's usually no good.
+ */
+ if (matches == NULL)
+ {
+ COMPLETE_WITH_CONST(true, "");
+ /* Also, prevent Readline from appending stuff to the non-match */
+ rl_completion_append_character = '\0';
+#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
+ rl_completion_suppress_quote = 1;
+#endif
+ }
+
+ /* free storage */
+ free(previous_words);
+ free(words_buffer);
+ free(text_copy);
+ free(completion_ref_object);
+ completion_ref_object = NULL;
+ free(completion_ref_schema);
+ completion_ref_schema = NULL;
+
+ /* Return our Grand List O' Matches */
+ return matches;
+}
+
+
+/*
+ * GENERATOR FUNCTIONS
+ *
+ * These functions do all the actual work of completing the input. They get
+ * passed the text so far and the count how many times they have been called
+ * so far with the same text.
+ * If you read the above carefully, you'll see that these don't get called
+ * directly but through the readline interface.
+ * The return value is expected to be the full completion of the text, going
+ * through a list each time, or NULL if there are no more matches. The string
+ * will be free()'d by readline, so you must run it through strdup() or
+ * something of that sort.
+ */
+
+/*
+ * Common routine for create_command_generator and drop_command_generator.
+ * Entries that have 'excluded' flags are not returned.
+ */
+static char *
+create_or_drop_command_generator(const char *text, int state, bits32 excluded)
+{
+ static int list_index,
+ string_length;
+ const char *name;
+
+ /* If this is the first time for this completion, init some values */
+ if (state == 0)
+ {
+ list_index = 0;
+ string_length = strlen(text);
+ }
+
+ /* find something that matches */
+ while ((name = words_after_create[list_index++].name))
+ {
+ if ((pg_strncasecmp(name, text, string_length) == 0) &&
+ !(words_after_create[list_index - 1].flags & excluded))
+ return pg_strdup_keyword_case(name, text);
+ }
+ /* if nothing matches, return NULL */
+ return NULL;
+}
+
+/*
+ * This one gives you one from a list of things you can put after CREATE
+ * as defined above.
+ */
+static char *
+create_command_generator(const char *text, int state)
+{
+ return create_or_drop_command_generator(text, state, THING_NO_CREATE);
+}
+
+/*
+ * This function gives you a list of things you can put after a DROP command.
+ */
+static char *
+drop_command_generator(const char *text, int state)
+{
+ return create_or_drop_command_generator(text, state, THING_NO_DROP);
+}
+
+/*
+ * This function gives you a list of things you can put after an ALTER command.
+ */
+static char *
+alter_command_generator(const char *text, int state)
+{
+ return create_or_drop_command_generator(text, state, THING_NO_ALTER);
+}
+
+/*
+ * These functions generate lists using server queries.
+ * They are all wrappers for _complete_from_query.
+ */
+
+static char *
+complete_from_query(const char *text, int state)
+{
+ /* query is assumed to work for any server version */
+ return _complete_from_query(completion_charp, NULL, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+static char *
+complete_from_versioned_query(const char *text, int state)
+{
+ const VersionedQuery *vquery = completion_vquery;
+
+ /* Find appropriate array element */
+ while (pset.sversion < vquery->min_server_version)
+ vquery++;
+ /* Fail completion if server is too old */
+ if (vquery->query == NULL)
+ return NULL;
+
+ return _complete_from_query(vquery->query, NULL, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+static char *
+complete_from_schema_query(const char *text, int state)
+{
+ /* query is assumed to work for any server version */
+ return _complete_from_query(NULL, completion_squery, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+static char *
+complete_from_versioned_schema_query(const char *text, int state)
+{
+ const SchemaQuery *squery = completion_squery;
+
+ /* Find appropriate array element */
+ while (pset.sversion < squery->min_server_version)
+ squery++;
+ /* Fail completion if server is too old */
+ if (squery->catname == NULL)
+ return NULL;
+
+ return _complete_from_query(NULL, squery, completion_charpp,
+ completion_verbatim, text, state);
+}
+
+
+/*
+ * This creates a list of matching things, according to a query described by
+ * the initial arguments. The caller has already done any work needed to
+ * select the appropriate query for the server's version.
+ *
+ * The query can be one of two kinds:
+ *
+ * 1. A simple query, which must contain a restriction clause of the form
+ * output LIKE '%s'
+ * where "output" is the same string that the query returns. The %s
+ * will be replaced by a LIKE pattern to match the already-typed text.
+ * There can be a second '%s', which will be replaced by a suitably-escaped
+ * version of the string provided in completion_ref_object. If there is a
+ * third '%s', it will be replaced by a suitably-escaped version of the string
+ * provided in completion_ref_schema. Those strings should be set up
+ * by calling set_completion_reference or set_completion_reference_verbatim.
+ * Simple queries should return a single column of matches. If "verbatim"
+ * is true, the matches are returned as-is; otherwise, they are taken to
+ * be SQL identifiers and quoted if necessary.
+ *
+ * 2. A schema query used for completion of both schema and relation names.
+ * This is represented by a SchemaQuery object; see that typedef for details.
+ *
+ * See top of file for examples of both kinds of query.
+ *
+ * In addition to the query itself, we accept a null-terminated array of
+ * literal keywords, which will be returned if they match the input-so-far
+ * (case insensitively). (These are in addition to keywords specified
+ * within the schema_query, if any.)
+ *
+ * If "verbatim" is true, then we use the given text as-is to match the
+ * query results; otherwise we parse it as a possibly-qualified identifier,
+ * and reconstruct suitable quoting afterward.
+ *
+ * "text" and "state" are supplied by Readline. "text" is the word we are
+ * trying to complete. "state" is zero on first call, nonzero later.
+ *
+ * readline will call this repeatedly with the same text and varying
+ * state. On each call, we are supposed to return a malloc'd string
+ * that is a candidate completion. Return NULL when done.
+ */
+static char *
+_complete_from_query(const char *simple_query,
+ const SchemaQuery *schema_query,
+ const char *const *keywords,
+ bool verbatim,
+ const char *text, int state)
+{
+ static int list_index,
+ num_schema_only,
+ num_query_other,
+ num_keywords;
+ static PGresult *result = NULL;
+ static bool non_empty_object;
+ static bool schemaquoted;
+ static bool objectquoted;
+
+ /*
+ * If this is the first time for this completion, we fetch a list of our
+ * "things" from the backend.
+ */
+ if (state == 0)
+ {
+ PQExpBufferData query_buffer;
+ char *schemaname;
+ char *objectname;
+ char *e_object_like;
+ char *e_schemaname;
+ char *e_ref_object;
+ char *e_ref_schema;
+
+ /* Reset static state, ensuring no memory leaks */
+ list_index = 0;
+ num_schema_only = 0;
+ num_query_other = 0;
+ num_keywords = 0;
+ PQclear(result);
+ result = NULL;
+
+ /* Parse text, splitting into schema and object name if needed */
+ if (verbatim)
+ {
+ objectname = pg_strdup(text);
+ schemaname = NULL;
+ }
+ else
+ {
+ parse_identifier(text,
+ &schemaname, &objectname,
+ &schemaquoted, &objectquoted);
+ }
+
+ /* Remember whether the user has typed anything in the object part */
+ non_empty_object = (*objectname != '\0');
+
+ /*
+ * Convert objectname to a LIKE prefix pattern (e.g. 'foo%'), and set
+ * up suitably-escaped copies of all the strings we need.
+ */
+ e_object_like = make_like_pattern(objectname);
+
+ if (schemaname)
+ e_schemaname = escape_string(schemaname);
+ else
+ e_schemaname = NULL;
+
+ if (completion_ref_object)
+ e_ref_object = escape_string(completion_ref_object);
+ else
+ e_ref_object = NULL;
+
+ if (completion_ref_schema)
+ e_ref_schema = escape_string(completion_ref_schema);
+ else
+ e_ref_schema = NULL;
+
+ initPQExpBuffer(&query_buffer);
+
+ if (schema_query)
+ {
+ Assert(simple_query == NULL);
+
+ /*
+ * We issue different queries depending on whether the input is
+ * already qualified or not. schema_query gives us the pieces to
+ * assemble.
+ */
+ if (schemaname == NULL || schema_query->namespace == NULL)
+ {
+ /* Get unqualified names matching the input-so-far */
+ appendPQExpBufferStr(&query_buffer, "SELECT ");
+ if (schema_query->use_distinct)
+ appendPQExpBufferStr(&query_buffer, "DISTINCT ");
+ appendPQExpBuffer(&query_buffer,
+ "%s, NULL::pg_catalog.text FROM %s",
+ schema_query->result,
+ schema_query->catname);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBufferStr(&query_buffer,
+ ", pg_catalog.pg_namespace nr");
+ appendPQExpBufferStr(&query_buffer, " WHERE ");
+ if (schema_query->selcondition)
+ appendPQExpBuffer(&query_buffer, "%s AND ",
+ schema_query->selcondition);
+ appendPQExpBuffer(&query_buffer, "(%s) LIKE '%s'",
+ schema_query->result,
+ e_object_like);
+ if (schema_query->viscondition)
+ appendPQExpBuffer(&query_buffer, " AND %s",
+ schema_query->viscondition);
+ if (schema_query->refname)
+ {
+ Assert(completion_ref_object);
+ appendPQExpBuffer(&query_buffer, " AND %s = '%s'",
+ schema_query->refname, e_ref_object);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s = nr.oid AND nr.nspname = '%s'",
+ schema_query->refnamespace,
+ e_ref_schema);
+ else if (schema_query->refviscondition)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s",
+ schema_query->refviscondition);
+ }
+
+ /*
+ * When fetching relation names, suppress system catalogs
+ * unless the input-so-far begins with "pg_". This is a
+ * compromise between not offering system catalogs for
+ * completion at all, and having them swamp the result when
+ * the input is just "p".
+ */
+ if (strcmp(schema_query->catname,
+ "pg_catalog.pg_class c") == 0 &&
+ strncmp(objectname, "pg_", 3) != 0)
+ {
+ appendPQExpBufferStr(&query_buffer,
+ " AND c.relnamespace <> (SELECT oid FROM"
+ " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')");
+ }
+
+ /*
+ * If the target object type can be schema-qualified, add in
+ * schema names matching the input-so-far.
+ */
+ if (schema_query->namespace)
+ {
+ appendPQExpBuffer(&query_buffer, "\nUNION ALL\n"
+ "SELECT NULL::pg_catalog.text, n.nspname "
+ "FROM pg_catalog.pg_namespace n "
+ "WHERE n.nspname LIKE '%s'",
+ e_object_like);
+
+ /*
+ * Likewise, suppress system schemas unless the
+ * input-so-far begins with "pg_".
+ */
+ if (strncmp(objectname, "pg_", 3) != 0)
+ appendPQExpBufferStr(&query_buffer,
+ " AND n.nspname NOT LIKE E'pg\\\\_%'");
+
+ /*
+ * Since we're matching these schema names to the object
+ * name, handle their quoting using the object name's
+ * quoting state.
+ */
+ schemaquoted = objectquoted;
+ }
+ }
+ else
+ {
+ /* Input is qualified, so produce only qualified names */
+ appendPQExpBufferStr(&query_buffer, "SELECT ");
+ if (schema_query->use_distinct)
+ appendPQExpBufferStr(&query_buffer, "DISTINCT ");
+ appendPQExpBuffer(&query_buffer, "%s, n.nspname "
+ "FROM %s, pg_catalog.pg_namespace n",
+ schema_query->result,
+ schema_query->catname);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBufferStr(&query_buffer,
+ ", pg_catalog.pg_namespace nr");
+ appendPQExpBuffer(&query_buffer, " WHERE %s = n.oid AND ",
+ schema_query->namespace);
+ if (schema_query->selcondition)
+ appendPQExpBuffer(&query_buffer, "%s AND ",
+ schema_query->selcondition);
+ appendPQExpBuffer(&query_buffer, "(%s) LIKE '%s' AND ",
+ schema_query->result,
+ e_object_like);
+ appendPQExpBuffer(&query_buffer, "n.nspname = '%s'",
+ e_schemaname);
+ if (schema_query->refname)
+ {
+ Assert(completion_ref_object);
+ appendPQExpBuffer(&query_buffer, " AND %s = '%s'",
+ schema_query->refname, e_ref_object);
+ if (schema_query->refnamespace && completion_ref_schema)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s = nr.oid AND nr.nspname = '%s'",
+ schema_query->refnamespace,
+ e_ref_schema);
+ else if (schema_query->refviscondition)
+ appendPQExpBuffer(&query_buffer,
+ " AND %s",
+ schema_query->refviscondition);
+ }
+ }
+ }
+ else
+ {
+ Assert(simple_query);
+ /* simple_query is an sprintf-style format string */
+ appendPQExpBuffer(&query_buffer, simple_query,
+ e_object_like,
+ e_ref_object, e_ref_schema);
+ }
+
+ /* Limit the number of records in the result */
+ appendPQExpBuffer(&query_buffer, "\nLIMIT %d",
+ completion_max_records);
+
+ /* Finally, we can issue the query */
+ result = exec_query(query_buffer.data);
+
+ /* Clean up */
+ termPQExpBuffer(&query_buffer);
+ free(schemaname);
+ free(objectname);
+ free(e_object_like);
+ free(e_schemaname);
+ free(e_ref_object);
+ free(e_ref_schema);
+ }
+
+ /* Return the next result, if any, but not if the query failed */
+ if (result && PQresultStatus(result) == PGRES_TUPLES_OK)
+ {
+ int nskip;
+
+ while (list_index < PQntuples(result))
+ {
+ const char *item = NULL;
+ const char *nsp = NULL;
+
+ if (!PQgetisnull(result, list_index, 0))
+ item = PQgetvalue(result, list_index, 0);
+ if (PQnfields(result) > 1 &&
+ !PQgetisnull(result, list_index, 1))
+ nsp = PQgetvalue(result, list_index, 1);
+ list_index++;
+
+ /* In verbatim mode, we return all the items as-is */
+ if (verbatim)
+ {
+ num_query_other++;
+ return pg_strdup(item);
+ }
+
+ /*
+ * In normal mode, a name requiring quoting will be returned only
+ * if the input was empty or quoted. Otherwise the user might see
+ * completion inserting a quote she didn't type, which is
+ * surprising. This restriction also dodges some odd behaviors of
+ * some versions of readline/libedit.
+ */
+ if (non_empty_object)
+ {
+ if (item && !objectquoted && identifier_needs_quotes(item))
+ continue;
+ if (nsp && !schemaquoted && identifier_needs_quotes(nsp))
+ continue;
+ }
+
+ /* Count schema-only results for hack below */
+ if (item == NULL && nsp != NULL)
+ num_schema_only++;
+ else
+ num_query_other++;
+
+ return requote_identifier(nsp, item, schemaquoted, objectquoted);
+ }
+
+ /*
+ * When the query result is exhausted, check for hard-wired keywords.
+ * These will only be returned if they match the input-so-far,
+ * ignoring case.
+ */
+ nskip = list_index - PQntuples(result);
+ if (schema_query && schema_query->keywords)
+ {
+ const char *const *itemp = schema_query->keywords;
+
+ while (*itemp)
+ {
+ const char *item = *itemp++;
+
+ if (nskip-- > 0)
+ continue;
+ list_index++;
+ if (pg_strncasecmp(text, item, strlen(text)) == 0)
+ {
+ num_keywords++;
+ return pg_strdup_keyword_case(item, text);
+ }
+ }
+ }
+ if (keywords)
+ {
+ const char *const *itemp = keywords;
+
+ while (*itemp)
+ {
+ const char *item = *itemp++;
+
+ if (nskip-- > 0)
+ continue;
+ list_index++;
+ if (pg_strncasecmp(text, item, strlen(text)) == 0)
+ {
+ num_keywords++;
+ return pg_strdup_keyword_case(item, text);
+ }
+ }
+ }
+ }
+
+ /*
+ * Hack: if we returned only bare schema names, don't let Readline add a
+ * space afterwards. Otherwise the schema will stop being part of the
+ * completion subject text, which is not what we want.
+ */
+ if (num_schema_only > 0 && num_query_other == 0 && num_keywords == 0)
+ rl_completion_append_character = '\0';
+
+ /* No more matches, so free the result structure and return null */
+ PQclear(result);
+ result = NULL;
+ return NULL;
+}
+
+
+/*
+ * Set up completion_ref_object and completion_ref_schema
+ * by parsing the given word. These variables can then be
+ * used in a query passed to _complete_from_query.
+ */
+static void
+set_completion_reference(const char *word)
+{
+ bool schemaquoted,
+ objectquoted;
+
+ parse_identifier(word,
+ &completion_ref_schema, &completion_ref_object,
+ &schemaquoted, &objectquoted);
+}
+
+/*
+ * Set up completion_ref_object when it should just be
+ * the given word verbatim.
+ */
+static void
+set_completion_reference_verbatim(const char *word)
+{
+ completion_ref_schema = NULL;
+ completion_ref_object = pg_strdup(word);
+}
+
+
+/*
+ * This function returns in order one of a fixed, NULL pointer terminated list
+ * of strings (if matching). This can be used if there are only a fixed number
+ * SQL words that can appear at certain spot.
+ */
+static char *
+complete_from_list(const char *text, int state)
+{
+ static int string_length,
+ list_index,
+ matches;
+ static bool casesensitive;
+ const char *item;
+
+ /* need to have a list */
+ Assert(completion_charpp != NULL);
+
+ /* Initialization */
+ if (state == 0)
+ {
+ list_index = 0;
+ string_length = strlen(text);
+ casesensitive = completion_case_sensitive;
+ matches = 0;
+ }
+
+ while ((item = completion_charpp[list_index++]))
+ {
+ /* First pass is case sensitive */
+ if (casesensitive && strncmp(text, item, string_length) == 0)
+ {
+ matches++;
+ return pg_strdup(item);
+ }
+
+ /* Second pass is case insensitive, don't bother counting matches */
+ if (!casesensitive && pg_strncasecmp(text, item, string_length) == 0)
+ {
+ if (completion_case_sensitive)
+ return pg_strdup(item);
+ else
+
+ /*
+ * If case insensitive matching was requested initially,
+ * adjust the case according to setting.
+ */
+ return pg_strdup_keyword_case(item, text);
+ }
+ }
+
+ /*
+ * No matches found. If we're not case insensitive already, lets switch to
+ * being case insensitive and try again
+ */
+ if (casesensitive && matches == 0)
+ {
+ casesensitive = false;
+ list_index = 0;
+ state++;
+ return complete_from_list(text, state);
+ }
+
+ /* If no more matches, return null. */
+ return NULL;
+}
+
+
+/*
+ * This function returns one fixed string the first time even if it doesn't
+ * match what's there, and nothing the second time. The string
+ * to be used must be in completion_charp.
+ *
+ * If the given string is "", this has the effect of preventing readline
+ * from doing any completion. (Without this, readline tries to do filename
+ * completion which is seldom the right thing.)
+ *
+ * If the given string is not empty, readline will replace whatever the
+ * user typed with that string. This behavior might be useful if it's
+ * completely certain that we know what must appear at a certain spot,
+ * so that it's okay to overwrite misspellings. In practice, given the
+ * relatively lame parsing technology used in this file, the level of
+ * certainty is seldom that high, so that you probably don't want to
+ * use this. Use complete_from_list with a one-element list instead;
+ * that won't try to auto-correct "misspellings".
+ */
+static char *
+complete_from_const(const char *text, int state)
+{
+ Assert(completion_charp != NULL);
+ if (state == 0)
+ {
+ if (completion_case_sensitive)
+ return pg_strdup(completion_charp);
+ else
+
+ /*
+ * If case insensitive matching was requested initially, adjust
+ * the case according to setting.
+ */
+ return pg_strdup_keyword_case(completion_charp, text);
+ }
+ else
+ return NULL;
+}
+
+
+/*
+ * This function appends the variable name with prefix and suffix to
+ * the variable names array.
+ */
+static void
+append_variable_names(char ***varnames, int *nvars,
+ int *maxvars, const char *varname,
+ const char *prefix, const char *suffix)
+{
+ if (*nvars >= *maxvars)
+ {
+ *maxvars *= 2;
+ *varnames = (char **) pg_realloc(*varnames,
+ ((*maxvars) + 1) * sizeof(char *));
+ }
+
+ (*varnames)[(*nvars)++] = psprintf("%s%s%s", prefix, varname, suffix);
+}
+
+
+/*
+ * This function supports completion with the name of a psql variable.
+ * The variable names can be prefixed and suffixed with additional text
+ * to support quoting usages. If need_value is true, only variables
+ * that are currently set are included; otherwise, special variables
+ * (those that have hooks) are included even if currently unset.
+ */
+static char **
+complete_from_variables(const char *text, const char *prefix, const char *suffix,
+ bool need_value)
+{
+ char **matches;
+ char **varnames;
+ int nvars = 0;
+ int maxvars = 100;
+ int i;
+ struct _variable *ptr;
+
+ varnames = (char **) pg_malloc((maxvars + 1) * sizeof(char *));
+
+ for (ptr = pset.vars->next; ptr; ptr = ptr->next)
+ {
+ if (need_value && !(ptr->value))
+ continue;
+ append_variable_names(&varnames, &nvars, &maxvars, ptr->name,
+ prefix, suffix);
+ }
+
+ varnames[nvars] = NULL;
+ COMPLETE_WITH_LIST_CS((const char *const *) varnames);
+
+ for (i = 0; i < nvars; i++)
+ free(varnames[i]);
+ free(varnames);
+
+ return matches;
+}
+
+
+/*
+ * This function wraps rl_filename_completion_function() to strip quotes from
+ * the input before searching for matches and to quote any matches for which
+ * the consuming command will require it.
+ *
+ * Caller must set completion_charp to a zero- or one-character string
+ * containing the escape character. This is necessary since \copy has no
+ * escape character, but every other backslash command recognizes "\" as an
+ * escape character.
+ *
+ * Caller must also set completion_force_quote to indicate whether to force
+ * quotes around the result. (The SQL COPY command requires that.)
+ */
+static char *
+complete_from_files(const char *text, int state)
+{
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+
+ /*
+ * If we're using a version of Readline that supports filename quoting
+ * hooks, rely on those, and invoke rl_filename_completion_function()
+ * without messing with its arguments. Readline does stuff internally
+ * that does not work well at all if we try to handle dequoting here.
+ * Instead, Readline will call quote_file_name() and dequote_file_name()
+ * (see below) at appropriate times.
+ *
+ * ... or at least, mostly it will. There are some paths involving
+ * unmatched file names in which Readline never calls quote_file_name(),
+ * and if left to its own devices it will incorrectly append a quote
+ * anyway. Set rl_completion_suppress_quote to prevent that. If we do
+ * get to quote_file_name(), we'll clear this again. (Yes, this seems
+ * like it's working around Readline bugs.)
+ */
+#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
+ rl_completion_suppress_quote = 1;
+#endif
+
+ /* If user typed a quote, force quoting (never remove user's quote) */
+ if (*text == '\'')
+ completion_force_quote = true;
+
+ return rl_filename_completion_function(text, state);
+#else
+
+ /*
+ * Otherwise, we have to do the best we can.
+ */
+ static const char *unquoted_text;
+ char *unquoted_match;
+ char *ret = NULL;
+
+ /* If user typed a quote, force quoting (never remove user's quote) */
+ if (*text == '\'')
+ completion_force_quote = true;
+
+ if (state == 0)
+ {
+ /* Initialization: stash the unquoted input. */
+ unquoted_text = strtokx(text, "", NULL, "'", *completion_charp,
+ false, true, pset.encoding);
+ /* expect a NULL return for the empty string only */
+ if (!unquoted_text)
+ {
+ Assert(*text == '\0');
+ unquoted_text = text;
+ }
+ }
+
+ unquoted_match = rl_filename_completion_function(unquoted_text, state);
+ if (unquoted_match)
+ {
+ struct stat statbuf;
+ bool is_dir = (stat(unquoted_match, &statbuf) == 0 &&
+ S_ISDIR(statbuf.st_mode) != 0);
+
+ /* Re-quote the result, if needed. */
+ ret = quote_if_needed(unquoted_match, " \t\r\n\"`",
+ '\'', *completion_charp,
+ completion_force_quote,
+ pset.encoding);
+ if (ret)
+ free(unquoted_match);
+ else
+ ret = unquoted_match;
+
+ /*
+ * If it's a directory, replace trailing quote with a slash; this is
+ * usually more convenient. (If we didn't quote, leave this to
+ * libedit.)
+ */
+ if (*ret == '\'' && is_dir)
+ {
+ char *retend = ret + strlen(ret) - 1;
+
+ Assert(*retend == '\'');
+ *retend = '/';
+ /* Prevent libedit from adding a space, too */
+ rl_completion_append_character = '\0';
+ }
+ }
+
+ return ret;
+#endif /* USE_FILENAME_QUOTING_FUNCTIONS */
+}
+
+
+/* HELPER FUNCTIONS */
+
+
+/*
+ * Make a pg_strdup copy of s and convert the case according to
+ * COMP_KEYWORD_CASE setting, using ref as the text that was already entered.
+ */
+static char *
+pg_strdup_keyword_case(const char *s, const char *ref)
+{
+ char *ret,
+ *p;
+ unsigned char first = ref[0];
+
+ ret = pg_strdup(s);
+
+ if (pset.comp_case == PSQL_COMP_CASE_LOWER ||
+ ((pset.comp_case == PSQL_COMP_CASE_PRESERVE_LOWER ||
+ pset.comp_case == PSQL_COMP_CASE_PRESERVE_UPPER) && islower(first)) ||
+ (pset.comp_case == PSQL_COMP_CASE_PRESERVE_LOWER && !isalpha(first)))
+ {
+ for (p = ret; *p; p++)
+ *p = pg_tolower((unsigned char) *p);
+ }
+ else
+ {
+ for (p = ret; *p; p++)
+ *p = pg_toupper((unsigned char) *p);
+ }
+
+ return ret;
+}
+
+
+/*
+ * escape_string - Escape argument for use as string literal.
+ *
+ * The returned value has to be freed.
+ */
+static char *
+escape_string(const char *text)
+{
+ size_t text_length;
+ char *result;
+
+ text_length = strlen(text);
+
+ result = pg_malloc(text_length * 2 + 1);
+ PQescapeStringConn(pset.db, result, text, text_length, NULL);
+
+ return result;
+}
+
+
+/*
+ * make_like_pattern - Convert argument to a LIKE prefix pattern.
+ *
+ * We escape _ and % in the given text by backslashing, append a % to
+ * represent "any subsequent characters", and then pass the string through
+ * escape_string() so it's ready to insert in a query. The result needs
+ * to be freed.
+ */
+static char *
+make_like_pattern(const char *word)
+{
+ char *result;
+ char *buffer = pg_malloc(strlen(word) * 2 + 2);
+ char *bptr = buffer;
+
+ while (*word)
+ {
+ if (*word == '_' || *word == '%')
+ *bptr++ = '\\';
+ if (IS_HIGHBIT_SET(*word))
+ {
+ /*
+ * Transfer multibyte characters without further processing, to
+ * avoid getting confused in unsafe client encodings.
+ */
+ int chlen = PQmblenBounded(word, pset.encoding);
+
+ while (chlen-- > 0)
+ *bptr++ = *word++;
+ }
+ else
+ *bptr++ = *word++;
+ }
+ *bptr++ = '%';
+ *bptr = '\0';
+
+ result = escape_string(buffer);
+ free(buffer);
+ return result;
+}
+
+
+/*
+ * parse_identifier - Parse a possibly-schema-qualified SQL identifier.
+ *
+ * This involves splitting off the schema name if present, de-quoting,
+ * and downcasing any unquoted text. We are a bit laxer than the backend
+ * in that we allow just portions of a name to be quoted --- that's because
+ * psql metacommands have traditionally behaved that way.
+ *
+ * Outputs are a malloc'd schema name (NULL if none), malloc'd object name,
+ * and booleans telling whether any part of the schema and object name was
+ * double-quoted.
+ */
+static void
+parse_identifier(const char *ident,
+ char **schemaname, char **objectname,
+ bool *schemaquoted, bool *objectquoted)
+{
+ size_t buflen = strlen(ident) + 1;
+ bool enc_is_single_byte = (pg_encoding_max_length(pset.encoding) == 1);
+ char *sname;
+ char *oname;
+ char *optr;
+ bool inquotes;
+
+ /* Initialize, making a certainly-large-enough output buffer */
+ sname = NULL;
+ oname = pg_malloc(buflen);
+ *schemaquoted = *objectquoted = false;
+ /* Scan */
+ optr = oname;
+ inquotes = false;
+ while (*ident)
+ {
+ unsigned char ch = (unsigned char) *ident++;
+
+ if (ch == '"')
+ {
+ if (inquotes && *ident == '"')
+ {
+ /* two quote marks within a quoted identifier = emit quote */
+ *optr++ = '"';
+ ident++;
+ }
+ else
+ {
+ inquotes = !inquotes;
+ *objectquoted = true;
+ }
+ }
+ else if (ch == '.' && !inquotes)
+ {
+ /* Found a schema name, transfer it to sname / *schemaquoted */
+ *optr = '\0';
+ free(sname); /* drop any catalog name */
+ sname = oname;
+ oname = pg_malloc(buflen);
+ optr = oname;
+ *schemaquoted = *objectquoted;
+ *objectquoted = false;
+ }
+ else if (!enc_is_single_byte && IS_HIGHBIT_SET(ch))
+ {
+ /*
+ * Transfer multibyte characters without further processing. They
+ * wouldn't be affected by our downcasing rule anyway, and this
+ * avoids possibly doing the wrong thing in unsafe client
+ * encodings.
+ */
+ int chlen = PQmblenBounded(ident - 1, pset.encoding);
+
+ *optr++ = (char) ch;
+ while (--chlen > 0)
+ *optr++ = *ident++;
+ }
+ else
+ {
+ if (!inquotes)
+ {
+ /*
+ * This downcasing transformation should match the backend's
+ * downcase_identifier() as best we can. We do not know the
+ * backend's locale, though, so it's necessarily approximate.
+ * We assume that psql is operating in the same locale and
+ * encoding as the backend.
+ */
+ if (ch >= 'A' && ch <= 'Z')
+ ch += 'a' - 'A';
+ else if (enc_is_single_byte && IS_HIGHBIT_SET(ch) && isupper(ch))
+ ch = tolower(ch);
+ }
+ *optr++ = (char) ch;
+ }
+ }
+
+ *optr = '\0';
+ *schemaname = sname;
+ *objectname = oname;
+}
+
+
+/*
+ * requote_identifier - Reconstruct a possibly-schema-qualified SQL identifier.
+ *
+ * Build a malloc'd string containing the identifier, with quoting applied
+ * as necessary. This is more or less the inverse of parse_identifier;
+ * in particular, if an input component was quoted, we'll quote the output
+ * even when that isn't strictly required.
+ *
+ * Unlike parse_identifier, we handle the case where a schema and no
+ * object name is provided, producing just "schema.".
+ */
+static char *
+requote_identifier(const char *schemaname, const char *objectname,
+ bool quote_schema, bool quote_object)
+{
+ char *result;
+ size_t buflen = 1; /* count the trailing \0 */
+ char *ptr;
+
+ /*
+ * We could use PQescapeIdentifier for some of this, but not all, and it
+ * adds more notational cruft than it seems worth.
+ */
+ if (schemaname)
+ {
+ buflen += strlen(schemaname) + 1; /* +1 for the dot */
+ if (!quote_schema)
+ quote_schema = identifier_needs_quotes(schemaname);
+ if (quote_schema)
+ {
+ buflen += 2; /* account for quote marks */
+ for (const char *p = schemaname; *p; p++)
+ {
+ if (*p == '"')
+ buflen++;
+ }
+ }
+ }
+ if (objectname)
+ {
+ buflen += strlen(objectname);
+ if (!quote_object)
+ quote_object = identifier_needs_quotes(objectname);
+ if (quote_object)
+ {
+ buflen += 2; /* account for quote marks */
+ for (const char *p = objectname; *p; p++)
+ {
+ if (*p == '"')
+ buflen++;
+ }
+ }
+ }
+ result = pg_malloc(buflen);
+ ptr = result;
+ if (schemaname)
+ {
+ if (quote_schema)
+ *ptr++ = '"';
+ for (const char *p = schemaname; *p; p++)
+ {
+ *ptr++ = *p;
+ if (*p == '"')
+ *ptr++ = '"';
+ }
+ if (quote_schema)
+ *ptr++ = '"';
+ *ptr++ = '.';
+ }
+ if (objectname)
+ {
+ if (quote_object)
+ *ptr++ = '"';
+ for (const char *p = objectname; *p; p++)
+ {
+ *ptr++ = *p;
+ if (*p == '"')
+ *ptr++ = '"';
+ }
+ if (quote_object)
+ *ptr++ = '"';
+ }
+ *ptr = '\0';
+ return result;
+}
+
+
+/*
+ * Detect whether an identifier must be double-quoted.
+ *
+ * Note we'll quote anything that's not ASCII; the backend's quote_ident()
+ * does the same. Perhaps this could be relaxed in future.
+ */
+static bool
+identifier_needs_quotes(const char *ident)
+{
+ int kwnum;
+
+ /* Check syntax. */
+ if (!((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_'))
+ return true;
+ if (strspn(ident, "abcdefghijklmnopqrstuvwxyz0123456789_") != strlen(ident))
+ return true;
+
+ /*
+ * Check for keyword. We quote keywords except for unreserved ones.
+ *
+ * It is possible that our keyword list doesn't quite agree with the
+ * server's, but this should be close enough for tab-completion purposes.
+ *
+ * Note: ScanKeywordLookup() does case-insensitive comparison, but that's
+ * fine, since we already know we have all-lower-case.
+ */
+ kwnum = ScanKeywordLookup(ident, &ScanKeywords);
+
+ if (kwnum >= 0 && ScanKeywordCategories[kwnum] != UNRESERVED_KEYWORD)
+ return true;
+
+ return false;
+}
+
+
+/*
+ * Execute a query, returning NULL if there was any error.
+ * This should be the preferred way of talking to the database in this file.
+ */
+static PGresult *
+exec_query(const char *query)
+{
+ PGresult *result;
+
+ if (query == NULL || !pset.db || PQstatus(pset.db) != CONNECTION_OK)
+ return NULL;
+
+ result = PQexec(pset.db, query);
+
+ if (PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ /*
+ * Printing an error while the user is typing would be quite annoying,
+ * so we don't. This does complicate debugging of this code; but you
+ * can look in the server log instead.
+ */
+#ifdef NOT_USED
+ pg_log_error("tab completion query failed: %s\nQuery was:\n%s",
+ PQerrorMessage(pset.db), query);
+#endif
+ PQclear(result);
+ result = NULL;
+ }
+
+ return result;
+}
+
+
+/*
+ * Parse all the word(s) before point.
+ *
+ * Returns a malloc'd array of character pointers that point into the malloc'd
+ * data array returned to *buffer; caller must free() both of these when done.
+ * *nwords receives the number of words found, ie, the valid length of the
+ * return array.
+ *
+ * Words are returned right to left, that is, previous_words[0] gets the last
+ * word before point, previous_words[1] the next-to-last, etc.
+ */
+static char **
+get_previous_words(int point, char **buffer, int *nwords)
+{
+ char **previous_words;
+ char *buf;
+ char *outptr;
+ int words_found = 0;
+ int i;
+
+ /*
+ * If we have anything in tab_completion_query_buf, paste it together with
+ * rl_line_buffer to construct the full query. Otherwise we can just use
+ * rl_line_buffer as the input string.
+ */
+ if (tab_completion_query_buf && tab_completion_query_buf->len > 0)
+ {
+ i = tab_completion_query_buf->len;
+ buf = pg_malloc(point + i + 2);
+ memcpy(buf, tab_completion_query_buf->data, i);
+ buf[i++] = '\n';
+ memcpy(buf + i, rl_line_buffer, point);
+ i += point;
+ buf[i] = '\0';
+ /* Readjust point to reference appropriate offset in buf */
+ point = i;
+ }
+ else
+ buf = rl_line_buffer;
+
+ /*
+ * Allocate an array of string pointers and a buffer to hold the strings
+ * themselves. The worst case is that the line contains only
+ * non-whitespace WORD_BREAKS characters, making each one a separate word.
+ * This is usually much more space than we need, but it's cheaper than
+ * doing a separate malloc() for each word.
+ */
+ previous_words = (char **) pg_malloc(point * sizeof(char *));
+ *buffer = outptr = (char *) pg_malloc(point * 2);
+
+ /*
+ * First we look for a non-word char before the current point. (This is
+ * probably useless, if readline is on the same page as we are about what
+ * is a word, but if so it's cheap.)
+ */
+ for (i = point - 1; i >= 0; i--)
+ {
+ if (strchr(WORD_BREAKS, buf[i]))
+ break;
+ }
+ point = i;
+
+ /*
+ * Now parse words, working backwards, until we hit start of line. The
+ * backwards scan has some interesting but intentional properties
+ * concerning parenthesis handling.
+ */
+ while (point >= 0)
+ {
+ int start,
+ end;
+ bool inquotes = false;
+ int parentheses = 0;
+
+ /* now find the first non-space which then constitutes the end */
+ end = -1;
+ for (i = point; i >= 0; i--)
+ {
+ if (!isspace((unsigned char) buf[i]))
+ {
+ end = i;
+ break;
+ }
+ }
+ /* if no end found, we're done */
+ if (end < 0)
+ break;
+
+ /*
+ * Otherwise we now look for the start. The start is either the last
+ * character before any word-break character going backwards from the
+ * end, or it's simply character 0. We also handle open quotes and
+ * parentheses.
+ */
+ for (start = end; start > 0; start--)
+ {
+ if (buf[start] == '"')
+ inquotes = !inquotes;
+ if (!inquotes)
+ {
+ if (buf[start] == ')')
+ parentheses++;
+ else if (buf[start] == '(')
+ {
+ if (--parentheses <= 0)
+ break;
+ }
+ else if (parentheses == 0 &&
+ strchr(WORD_BREAKS, buf[start - 1]))
+ break;
+ }
+ }
+
+ /* Return the word located at start to end inclusive */
+ previous_words[words_found++] = outptr;
+ i = end - start + 1;
+ memcpy(outptr, &buf[start], i);
+ outptr += i;
+ *outptr++ = '\0';
+
+ /* Continue searching */
+ point = start - 1;
+ }
+
+ /* Release parsing input workspace, if we made one above */
+ if (buf != rl_line_buffer)
+ free(buf);
+
+ *nwords = words_found;
+ return previous_words;
+}
+
+/*
+ * Look up the type for the GUC variable with the passed name.
+ *
+ * Returns NULL if the variable is unknown. Otherwise the returned string,
+ * containing the type, has to be freed.
+ */
+static char *
+get_guctype(const char *varname)
+{
+ PQExpBufferData query_buffer;
+ char *e_varname;
+ PGresult *result;
+ char *guctype = NULL;
+
+ e_varname = escape_string(varname);
+
+ initPQExpBuffer(&query_buffer);
+ appendPQExpBuffer(&query_buffer,
+ "SELECT vartype FROM pg_catalog.pg_settings "
+ "WHERE pg_catalog.lower(name) = pg_catalog.lower('%s')",
+ e_varname);
+
+ result = exec_query(query_buffer.data);
+ termPQExpBuffer(&query_buffer);
+ free(e_varname);
+
+ if (PQresultStatus(result) == PGRES_TUPLES_OK && PQntuples(result) > 0)
+ guctype = pg_strdup(PQgetvalue(result, 0, 0));
+
+ PQclear(result);
+
+ return guctype;
+}
+
+#ifdef USE_FILENAME_QUOTING_FUNCTIONS
+
+/*
+ * Quote a filename according to SQL rules, returning a malloc'd string.
+ * completion_charp must point to escape character or '\0', and
+ * completion_force_quote must be set correctly, as per comments for
+ * complete_from_files().
+ */
+static char *
+quote_file_name(char *fname, int match_type, char *quote_pointer)
+{
+ char *s;
+ struct stat statbuf;
+
+ /* Quote if needed. */
+ s = quote_if_needed(fname, " \t\r\n\"`",
+ '\'', *completion_charp,
+ completion_force_quote,
+ pset.encoding);
+ if (!s)
+ s = pg_strdup(fname);
+
+ /*
+ * However, some of the time we have to strip the trailing quote from what
+ * we send back. Never strip the trailing quote if the user already typed
+ * one; otherwise, suppress the trailing quote if we have multiple/no
+ * matches (because we don't want to add a quote if the input is seemingly
+ * unfinished), or if the input was already quoted (because Readline will
+ * do arguably-buggy things otherwise), or if the file does not exist, or
+ * if it's a directory.
+ */
+ if (*s == '\'' &&
+ completion_last_char != '\'' &&
+ (match_type != SINGLE_MATCH ||
+ (quote_pointer && *quote_pointer == '\'') ||
+ stat(fname, &statbuf) != 0 ||
+ S_ISDIR(statbuf.st_mode)))
+ {
+ char *send = s + strlen(s) - 1;
+
+ Assert(*send == '\'');
+ *send = '\0';
+ }
+
+ /*
+ * And now we can let Readline do its thing with possibly adding a quote
+ * on its own accord. (This covers some additional cases beyond those
+ * dealt with above.)
+ */
+#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
+ rl_completion_suppress_quote = 0;
+#endif
+
+ /*
+ * If user typed a leading quote character other than single quote (i.e.,
+ * double quote), zap it, so that we replace it with the correct single
+ * quote.
+ */
+ if (quote_pointer && *quote_pointer != '\'')
+ *quote_pointer = '\0';
+
+ return s;
+}
+
+/*
+ * Dequote a filename, if it's quoted.
+ * completion_charp must point to escape character or '\0', as per
+ * comments for complete_from_files().
+ */
+static char *
+dequote_file_name(char *fname, int quote_char)
+{
+ char *unquoted_fname;
+
+ /*
+ * If quote_char is set, it's not included in "fname". We have to add it
+ * or strtokx will not interpret the string correctly (notably, it won't
+ * recognize escapes).
+ */
+ if (quote_char == '\'')
+ {
+ char *workspace = (char *) pg_malloc(strlen(fname) + 2);
+
+ workspace[0] = quote_char;
+ strcpy(workspace + 1, fname);
+ unquoted_fname = strtokx(workspace, "", NULL, "'", *completion_charp,
+ false, true, pset.encoding);
+ free(workspace);
+ }
+ else
+ unquoted_fname = strtokx(fname, "", NULL, "'", *completion_charp,
+ false, true, pset.encoding);
+
+ /* expect a NULL return for the empty string only */
+ if (!unquoted_fname)
+ {
+ Assert(*fname == '\0');
+ unquoted_fname = fname;
+ }
+
+ /* readline expects a malloc'd result that it is to free */
+ return pg_strdup(unquoted_fname);
+}
+
+#endif /* USE_FILENAME_QUOTING_FUNCTIONS */
+
+#endif /* USE_READLINE */
diff --git a/src/bin/psql/tab-complete.h b/src/bin/psql/tab-complete.h
new file mode 100644
index 0000000..ae5b6be
--- /dev/null
+++ b/src/bin/psql/tab-complete.h
@@ -0,0 +1,17 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/tab-complete.h
+ */
+#ifndef TAB_COMPLETE_H
+#define TAB_COMPLETE_H
+
+#include "pqexpbuffer.h"
+
+extern PQExpBuffer tab_completion_query_buf;
+
+extern void initialize_readline(void);
+
+#endif /* TAB_COMPLETE_H */
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c
new file mode 100644
index 0000000..1c3841e
--- /dev/null
+++ b/src/bin/psql/variables.c
@@ -0,0 +1,421 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/psql/variables.c
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "variables.h"
+
+/*
+ * Check whether a variable's name is allowed.
+ *
+ * We allow any non-ASCII character, as well as ASCII letters, digits, and
+ * underscore. Keep this in sync with the definition of variable_char in
+ * psqlscan.l and psqlscanslash.l.
+ */
+static bool
+valid_variable_name(const char *name)
+{
+ const unsigned char *ptr = (const unsigned char *) name;
+
+ /* Mustn't be zero-length */
+ if (*ptr == '\0')
+ return false;
+
+ while (*ptr)
+ {
+ if (IS_HIGHBIT_SET(*ptr) ||
+ strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"
+ "_0123456789", *ptr) != NULL)
+ ptr++;
+ else
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * A "variable space" is represented by an otherwise-unused struct _variable
+ * that serves as list header.
+ *
+ * The list entries are kept in name order (according to strcmp). This
+ * is mainly to make the output of PrintVariables() more pleasing.
+ */
+VariableSpace
+CreateVariableSpace(void)
+{
+ struct _variable *ptr;
+
+ ptr = pg_malloc(sizeof *ptr);
+ ptr->name = NULL;
+ ptr->value = NULL;
+ ptr->substitute_hook = NULL;
+ ptr->assign_hook = NULL;
+ ptr->next = NULL;
+
+ return ptr;
+}
+
+/*
+ * Get string value of variable, or NULL if it's not defined.
+ *
+ * Note: result is valid until variable is next assigned to.
+ */
+const char *
+GetVariable(VariableSpace space, const char *name)
+{
+ struct _variable *current;
+
+ if (!space)
+ return NULL;
+
+ for (current = space->next; current; current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ {
+ /* this is correct answer when value is NULL, too */
+ return current->value;
+ }
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ return NULL;
+}
+
+/*
+ * Try to interpret "value" as a boolean value, and if successful,
+ * store it in *result. Otherwise don't clobber *result.
+ *
+ * Valid values are: true, false, yes, no, on, off, 1, 0; as well as unique
+ * prefixes thereof.
+ *
+ * "name" is the name of the variable we're assigning to, to use in error
+ * report if any. Pass name == NULL to suppress the error report.
+ *
+ * Return true when "value" is syntactically valid, false otherwise.
+ */
+bool
+ParseVariableBool(const char *value, const char *name, bool *result)
+{
+ size_t len;
+ bool valid = true;
+
+ /* Treat "unset" as an empty string, which will lead to error below */
+ if (value == NULL)
+ value = "";
+
+ len = strlen(value);
+
+ if (len > 0 && pg_strncasecmp(value, "true", len) == 0)
+ *result = true;
+ else if (len > 0 && pg_strncasecmp(value, "false", len) == 0)
+ *result = false;
+ else if (len > 0 && pg_strncasecmp(value, "yes", len) == 0)
+ *result = true;
+ else if (len > 0 && pg_strncasecmp(value, "no", len) == 0)
+ *result = false;
+ /* 'o' is not unique enough */
+ else if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0)
+ *result = true;
+ else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0)
+ *result = false;
+ else if (pg_strcasecmp(value, "1") == 0)
+ *result = true;
+ else if (pg_strcasecmp(value, "0") == 0)
+ *result = false;
+ else
+ {
+ /* string is not recognized; don't clobber *result */
+ if (name)
+ pg_log_error("unrecognized value \"%s\" for \"%s\": Boolean expected",
+ value, name);
+ valid = false;
+ }
+ return valid;
+}
+
+/*
+ * Try to interpret "value" as an integer value, and if successful,
+ * store it in *result. Otherwise don't clobber *result.
+ *
+ * "name" is the name of the variable we're assigning to, to use in error
+ * report if any. Pass name == NULL to suppress the error report.
+ *
+ * Return true when "value" is syntactically valid, false otherwise.
+ */
+bool
+ParseVariableNum(const char *value, const char *name, int *result)
+{
+ char *end;
+ long numval;
+
+ /* Treat "unset" as an empty string, which will lead to error below */
+ if (value == NULL)
+ value = "";
+
+ errno = 0;
+ numval = strtol(value, &end, 0);
+ if (errno == 0 && *end == '\0' && end != value && numval == (int) numval)
+ {
+ *result = (int) numval;
+ return true;
+ }
+ else
+ {
+ /* string is not recognized; don't clobber *result */
+ if (name)
+ pg_log_error("invalid value \"%s\" for \"%s\": integer expected",
+ value, name);
+ return false;
+ }
+}
+
+/*
+ * Print values of all variables.
+ */
+void
+PrintVariables(VariableSpace space)
+{
+ struct _variable *ptr;
+
+ if (!space)
+ return;
+
+ for (ptr = space->next; ptr; ptr = ptr->next)
+ {
+ if (ptr->value)
+ printf("%s = '%s'\n", ptr->name, ptr->value);
+ if (cancel_pressed)
+ break;
+ }
+}
+
+/*
+ * Set the variable named "name" to value "value",
+ * or delete it if "value" is NULL.
+ *
+ * Returns true if successful, false if not; in the latter case a suitable
+ * error message has been printed, except for the unexpected case of
+ * space or name being NULL.
+ */
+bool
+SetVariable(VariableSpace space, const char *name, const char *value)
+{
+ struct _variable *current,
+ *previous;
+
+ if (!space || !name)
+ return false;
+
+ if (!valid_variable_name(name))
+ {
+ /* Deletion of non-existent variable is not an error */
+ if (!value)
+ return true;
+ pg_log_error("invalid variable name: \"%s\"", name);
+ return false;
+ }
+
+ for (previous = space, current = space->next;
+ current;
+ previous = current, current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ {
+ /*
+ * Found entry, so update, unless assign hook returns false.
+ *
+ * We must duplicate the passed value to start with. This
+ * simplifies the API for substitute hooks. Moreover, some assign
+ * hooks assume that the passed value has the same lifespan as the
+ * variable. Having to free the string again on failure is a
+ * small price to pay for keeping these APIs simple.
+ */
+ char *new_value = value ? pg_strdup(value) : NULL;
+ bool confirmed;
+
+ if (current->substitute_hook)
+ new_value = current->substitute_hook(new_value);
+
+ if (current->assign_hook)
+ confirmed = current->assign_hook(new_value);
+ else
+ confirmed = true;
+
+ if (confirmed)
+ {
+ pg_free(current->value);
+ current->value = new_value;
+
+ /*
+ * If we deleted the value, and there are no hooks to
+ * remember, we can discard the variable altogether.
+ */
+ if (new_value == NULL &&
+ current->substitute_hook == NULL &&
+ current->assign_hook == NULL)
+ {
+ previous->next = current->next;
+ free(current->name);
+ free(current);
+ }
+ }
+ else
+ pg_free(new_value); /* current->value is left unchanged */
+
+ return confirmed;
+ }
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ /* not present, make new entry ... unless we were asked to delete */
+ if (value)
+ {
+ current = pg_malloc(sizeof *current);
+ current->name = pg_strdup(name);
+ current->value = pg_strdup(value);
+ current->substitute_hook = NULL;
+ current->assign_hook = NULL;
+ current->next = previous->next;
+ previous->next = current;
+ }
+ return true;
+}
+
+/*
+ * Attach substitute and/or assign hook functions to the named variable.
+ * If you need only one hook, pass NULL for the other.
+ *
+ * If the variable doesn't already exist, create it with value NULL, just so
+ * we have a place to store the hook function(s). (The substitute hook might
+ * immediately change the NULL to something else; if not, this state is
+ * externally the same as the variable not being defined.)
+ *
+ * The substitute hook, if given, is immediately called on the variable's
+ * value. Then the assign hook, if given, is called on the variable's value.
+ * This is meant to let it update any derived psql state. If the assign hook
+ * doesn't like the current value, it will print a message to that effect,
+ * but we'll ignore it. Generally we do not expect any such failure here,
+ * because this should get called before any user-supplied value is assigned.
+ */
+void
+SetVariableHooks(VariableSpace space, const char *name,
+ VariableSubstituteHook shook,
+ VariableAssignHook ahook)
+{
+ struct _variable *current,
+ *previous;
+
+ if (!space || !name)
+ return;
+
+ if (!valid_variable_name(name))
+ return;
+
+ for (previous = space, current = space->next;
+ current;
+ previous = current, current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ {
+ /* found entry, so update */
+ current->substitute_hook = shook;
+ current->assign_hook = ahook;
+ if (shook)
+ current->value = (*shook) (current->value);
+ if (ahook)
+ (void) (*ahook) (current->value);
+ return;
+ }
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ /* not present, make new entry */
+ current = pg_malloc(sizeof *current);
+ current->name = pg_strdup(name);
+ current->value = NULL;
+ current->substitute_hook = shook;
+ current->assign_hook = ahook;
+ current->next = previous->next;
+ previous->next = current;
+ if (shook)
+ current->value = (*shook) (current->value);
+ if (ahook)
+ (void) (*ahook) (current->value);
+}
+
+/*
+ * Return true iff the named variable has substitute and/or assign hook
+ * functions.
+ */
+bool
+VariableHasHook(VariableSpace space, const char *name)
+{
+ struct _variable *current;
+
+ Assert(space);
+ Assert(name);
+
+ for (current = space->next; current; current = current->next)
+ {
+ int cmp = strcmp(current->name, name);
+
+ if (cmp == 0)
+ return (current->substitute_hook != NULL ||
+ current->assign_hook != NULL);
+ if (cmp > 0)
+ break; /* it's not there */
+ }
+
+ return false;
+}
+
+/*
+ * Convenience function to set a variable's value to "on".
+ */
+bool
+SetVariableBool(VariableSpace space, const char *name)
+{
+ return SetVariable(space, name, "on");
+}
+
+/*
+ * Attempt to delete variable.
+ *
+ * If unsuccessful, print a message and return "false".
+ * Deleting a nonexistent variable is not an error.
+ */
+bool
+DeleteVariable(VariableSpace space, const char *name)
+{
+ return SetVariable(space, name, NULL);
+}
+
+/*
+ * Emit error with suggestions for variables or commands
+ * accepting enum-style arguments.
+ * This function just exists to standardize the wording.
+ * suggestions should follow the format "fee, fi, fo, fum".
+ */
+void
+PsqlVarEnumError(const char *name, const char *value, const char *suggestions)
+{
+ pg_log_error("unrecognized value \"%s\" for \"%s\"\n"
+ "Available values are: %s.",
+ value, name, suggestions);
+}
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h
new file mode 100644
index 0000000..f3e6bc9
--- /dev/null
+++ b/src/bin/psql/variables.h
@@ -0,0 +1,97 @@
+/*
+ * psql - the PostgreSQL interactive terminal
+ *
+ * Copyright (c) 2000-2023, PostgreSQL Global Development Group
+ *
+ * This implements a sort of variable repository. One could also think of it
+ * as a cheap version of an associative array. Each variable has a string
+ * name and a string value. The value can't be NULL, or more precisely
+ * that's not distinguishable from the variable being unset.
+ *
+ * src/bin/psql/variables.h
+ */
+#ifndef VARIABLES_H
+#define VARIABLES_H
+
+/*
+ * Variables can be given "assign hook" functions. The assign hook can
+ * prevent invalid values from being assigned, and can update internal C
+ * variables to keep them in sync with the variable's current value.
+ *
+ * An assign hook function is called before any attempted assignment, with the
+ * proposed new value of the variable (or with NULL, if an \unset is being
+ * attempted). If it returns false, the assignment doesn't occur --- it
+ * should print an error message with pg_log_error() to tell the user why.
+ *
+ * When an assign hook function is installed with SetVariableHooks(), it is
+ * called with the variable's current value (or with NULL, if it wasn't set
+ * yet). But its return value is ignored in this case. The hook should be
+ * set before any possibly-invalid value can be assigned.
+ */
+typedef bool (*VariableAssignHook) (const char *newval);
+
+/*
+ * Variables can also be given "substitute hook" functions. The substitute
+ * hook can replace values (including NULL) with other values, allowing
+ * normalization of variable contents. For example, for a boolean variable,
+ * we wish to interpret "\unset FOO" as "\set FOO off", and we can do that
+ * by installing a substitute hook. (We can use the same substitute hook
+ * for all bool or nearly-bool variables, which is why this responsibility
+ * isn't part of the assign hook.)
+ *
+ * The substitute hook is called before any attempted assignment, and before
+ * the assign hook if any, passing the proposed new value of the variable as a
+ * malloc'd string (or NULL, if an \unset is being attempted). It can return
+ * the same value, or a different malloc'd string, or modify the string
+ * in-place. It should free the passed-in value if it's not returning it.
+ * The substitute hook generally should not complain about erroneous values;
+ * that's a job for the assign hook.
+ *
+ * When a substitute hook is installed with SetVariableHooks(), it is applied
+ * to the variable's current value (typically NULL, if it wasn't set yet).
+ * That also happens before applying the assign hook.
+ */
+typedef char *(*VariableSubstituteHook) (char *newval);
+
+/*
+ * Data structure representing one variable.
+ *
+ * Note: if value == NULL then the variable is logically unset, but we are
+ * keeping the struct around so as not to forget about its hook function(s).
+ */
+struct _variable
+{
+ char *name;
+ char *value;
+ VariableSubstituteHook substitute_hook;
+ VariableAssignHook assign_hook;
+ struct _variable *next;
+};
+
+/* Data structure representing a set of variables */
+typedef struct _variable *VariableSpace;
+
+
+VariableSpace CreateVariableSpace(void);
+const char *GetVariable(VariableSpace space, const char *name);
+
+bool ParseVariableBool(const char *value, const char *name,
+ bool *result);
+
+bool ParseVariableNum(const char *value, const char *name,
+ int *result);
+
+void PrintVariables(VariableSpace space);
+
+bool SetVariable(VariableSpace space, const char *name, const char *value);
+bool SetVariableBool(VariableSpace space, const char *name);
+bool DeleteVariable(VariableSpace space, const char *name);
+
+void SetVariableHooks(VariableSpace space, const char *name,
+ VariableSubstituteHook shook,
+ VariableAssignHook ahook);
+bool VariableHasHook(VariableSpace space, const char *name);
+
+void PsqlVarEnumError(const char *name, const char *value, const char *suggestions);
+
+#endif /* VARIABLES_H */
diff --git a/src/bin/scripts/.gitignore b/src/bin/scripts/.gitignore
new file mode 100644
index 0000000..0f23fe0
--- /dev/null
+++ b/src/bin/scripts/.gitignore
@@ -0,0 +1,10 @@
+/clusterdb
+/createdb
+/createuser
+/dropdb
+/dropuser
+/reindexdb
+/vacuumdb
+/pg_isready
+
+/tmp_check/
diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile
new file mode 100644
index 0000000..a7a9d0f
--- /dev/null
+++ b/src/bin/scripts/Makefile
@@ -0,0 +1,62 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/scripts
+#
+# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# src/bin/scripts/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "PostgreSQL utility"
+PGAPPICON=win32
+
+subdir = src/bin/scripts
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+PROGRAMS = createdb createuser dropdb dropuser clusterdb vacuumdb reindexdb pg_isready
+
+override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+all: $(PROGRAMS)
+
+createdb: createdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+createuser: createuser.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+dropdb: dropdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+dropuser: dropuser.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+clusterdb: clusterdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+vacuumdb: vacuumdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+reindexdb: reindexdb.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+pg_isready: pg_isready.o common.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils
+
+install: all installdirs
+ $(INSTALL_PROGRAM) createdb$(X) '$(DESTDIR)$(bindir)'/createdb$(X)
+ $(INSTALL_PROGRAM) dropdb$(X) '$(DESTDIR)$(bindir)'/dropdb$(X)
+ $(INSTALL_PROGRAM) createuser$(X) '$(DESTDIR)$(bindir)'/createuser$(X)
+ $(INSTALL_PROGRAM) dropuser$(X) '$(DESTDIR)$(bindir)'/dropuser$(X)
+ $(INSTALL_PROGRAM) clusterdb$(X) '$(DESTDIR)$(bindir)'/clusterdb$(X)
+ $(INSTALL_PROGRAM) vacuumdb$(X) '$(DESTDIR)$(bindir)'/vacuumdb$(X)
+ $(INSTALL_PROGRAM) reindexdb$(X) '$(DESTDIR)$(bindir)'/reindexdb$(X)
+ $(INSTALL_PROGRAM) pg_isready$(X) '$(DESTDIR)$(bindir)'/pg_isready$(X)
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(addsuffix $(X), $(PROGRAMS)))
+
+clean distclean maintainer-clean:
+ rm -f $(addsuffix $(X), $(PROGRAMS)) $(addsuffix .o, $(PROGRAMS))
+ rm -f common.o $(WIN32RES)
+ rm -rf tmp_check
+
+export with_icu
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
new file mode 100644
index 0000000..58a7740
--- /dev/null
+++ b/src/bin/scripts/clusterdb.c
@@ -0,0 +1,286 @@
+/*-------------------------------------------------------------------------
+ *
+ * clusterdb
+ *
+ * Portions Copyright (c) 2002-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/clusterdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+
+static void cluster_one_database(const ConnParams *cparams, const char *table,
+ const char *progname, bool verbose, bool echo);
+static void cluster_all_databases(ConnParams *cparams, const char *progname,
+ bool verbose, bool echo, bool quiet);
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"all", no_argument, NULL, 'a'},
+ {"table", required_argument, NULL, 't'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"maintenance-db", required_argument, NULL, 2},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool quiet = false;
+ bool alldb = false;
+ bool verbose = false;
+ SimpleStringList tables = {NULL, NULL};
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "clusterdb", help);
+
+ while ((c = getopt_long(argc, argv, "ad:eh:p:qt:U:vwW", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ alldb = true;
+ break;
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 't':
+ simple_string_list_append(&tables, optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dbname == NULL)
+ {
+ dbname = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ if (alldb)
+ {
+ if (dbname)
+ pg_fatal("cannot cluster all databases and a specific one at the same time");
+
+ if (tables.head != NULL)
+ pg_fatal("cannot cluster specific table(s) in all databases");
+
+ cparams.dbname = maintenance_db;
+
+ cluster_all_databases(&cparams, progname, verbose, echo, quiet);
+ }
+ else
+ {
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ if (tables.head != NULL)
+ {
+ SimpleStringListCell *cell;
+
+ for (cell = tables.head; cell; cell = cell->next)
+ {
+ cluster_one_database(&cparams, cell->val,
+ progname, verbose, echo);
+ }
+ }
+ else
+ cluster_one_database(&cparams, NULL,
+ progname, verbose, echo);
+ }
+
+ exit(0);
+}
+
+
+static void
+cluster_one_database(const ConnParams *cparams, const char *table,
+ const char *progname, bool verbose, bool echo)
+{
+ PQExpBufferData sql;
+
+ PGconn *conn;
+
+ conn = connectDatabase(cparams, progname, echo, false, false);
+
+ initPQExpBuffer(&sql);
+
+ appendPQExpBufferStr(&sql, "CLUSTER");
+ if (verbose)
+ appendPQExpBufferStr(&sql, " VERBOSE");
+ if (table)
+ {
+ appendPQExpBufferChar(&sql, ' ');
+ appendQualifiedRelation(&sql, table, conn, echo);
+ }
+ appendPQExpBufferChar(&sql, ';');
+
+ if (!executeMaintenanceCommand(conn, sql.data, echo))
+ {
+ if (table)
+ pg_log_error("clustering of table \"%s\" in database \"%s\" failed: %s",
+ table, PQdb(conn), PQerrorMessage(conn));
+ else
+ pg_log_error("clustering of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+ PQfinish(conn);
+ termPQExpBuffer(&sql);
+}
+
+
+static void
+cluster_all_databases(ConnParams *cparams, const char *progname,
+ bool verbose, bool echo, bool quiet)
+{
+ PGconn *conn;
+ PGresult *result;
+ int i;
+
+ conn = connectMaintenanceDatabase(cparams, progname, echo);
+ result = executeQuery(conn,
+ "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
+ echo);
+ PQfinish(conn);
+
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ char *dbname = PQgetvalue(result, i, 0);
+
+ if (!quiet)
+ {
+ printf(_("%s: clustering database \"%s\"\n"), progname, dbname);
+ fflush(stdout);
+ }
+
+ cparams->override_dbname = dbname;
+
+ cluster_one_database(cparams, NULL, progname, verbose, echo);
+ }
+
+ PQclear(result);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s clusters all previously clustered tables in a database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --all cluster all databases\n"));
+ printf(_(" -d, --dbname=DBNAME database to cluster\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -q, --quiet don't write any messages\n"));
+ printf(_(" -t, --table=TABLE cluster specific table(s) only\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nRead the description of the SQL command CLUSTER for details.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c
new file mode 100644
index 0000000..4c52fb6
--- /dev/null
+++ b/src/bin/scripts/common.c
@@ -0,0 +1,167 @@
+/*-------------------------------------------------------------------------
+ *
+ * common.c
+ * Common support routines for bin/scripts/
+ *
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/common.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <signal.h>
+#include <unistd.h>
+
+#include "common.h"
+#include "common/connect.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/string_utils.h"
+
+/*
+ * Split TABLE[(COLUMNS)] into TABLE and [(COLUMNS)] portions. When you
+ * finish using them, pg_free(*table). *columns is a pointer into "spec",
+ * possibly to its NUL terminator.
+ */
+void
+splitTableColumnsSpec(const char *spec, int encoding,
+ char **table, const char **columns)
+{
+ bool inquotes = false;
+ const char *cp = spec;
+
+ /*
+ * Find the first '(' not identifier-quoted. Based on
+ * dequote_downcase_identifier().
+ */
+ while (*cp && (*cp != '(' || inquotes))
+ {
+ if (*cp == '"')
+ {
+ if (inquotes && cp[1] == '"')
+ cp++; /* pair does not affect quoting */
+ else
+ inquotes = !inquotes;
+ cp++;
+ }
+ else
+ cp += PQmblenBounded(cp, encoding);
+ }
+ *table = pnstrdup(spec, cp - spec);
+ *columns = cp;
+}
+
+/*
+ * Break apart TABLE[(COLUMNS)] of "spec". With the reset_val of search_path
+ * in effect, have regclassin() interpret the TABLE portion. Append to "buf"
+ * the qualified name of TABLE, followed by any (COLUMNS). Exit on failure.
+ * We use this to interpret --table=foo under the search path psql would get,
+ * in advance of "ANALYZE public.foo" under the always-secure search path.
+ */
+void
+appendQualifiedRelation(PQExpBuffer buf, const char *spec,
+ PGconn *conn, bool echo)
+{
+ char *table;
+ const char *columns;
+ PQExpBufferData sql;
+ PGresult *res;
+ int ntups;
+
+ splitTableColumnsSpec(spec, PQclientEncoding(conn), &table, &columns);
+
+ /*
+ * Query must remain ABSOLUTELY devoid of unqualified names. This would
+ * be unnecessary given a regclassin() variant taking a search_path
+ * argument.
+ */
+ initPQExpBuffer(&sql);
+ appendPQExpBufferStr(&sql,
+ "SELECT c.relname, ns.nspname\n"
+ " FROM pg_catalog.pg_class c,"
+ " pg_catalog.pg_namespace ns\n"
+ " WHERE c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n"
+ " AND c.oid OPERATOR(pg_catalog.=) ");
+ appendStringLiteralConn(&sql, table, conn);
+ appendPQExpBufferStr(&sql, "::pg_catalog.regclass;");
+
+ executeCommand(conn, "RESET search_path;", echo);
+
+ /*
+ * One row is a typical result, as is a nonexistent relation ERROR.
+ * regclassin() unconditionally accepts all-digits input as an OID; if no
+ * relation has that OID; this query returns no rows. Catalog corruption
+ * might elicit other row counts.
+ */
+ res = executeQuery(conn, sql.data, echo);
+ ntups = PQntuples(res);
+ if (ntups != 1)
+ {
+ pg_log_error(ngettext("query returned %d row instead of one: %s",
+ "query returned %d rows instead of one: %s",
+ ntups),
+ ntups, sql.data);
+ PQfinish(conn);
+ exit(1);
+ }
+ appendPQExpBufferStr(buf,
+ fmtQualifiedId(PQgetvalue(res, 0, 1),
+ PQgetvalue(res, 0, 0)));
+ appendPQExpBufferStr(buf, columns);
+ PQclear(res);
+ termPQExpBuffer(&sql);
+ pg_free(table);
+
+ PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, echo));
+}
+
+
+/*
+ * Check yes/no answer in a localized way. 1=yes, 0=no, -1=neither.
+ */
+
+/* translator: abbreviation for "yes" */
+#define PG_YESLETTER gettext_noop("y")
+/* translator: abbreviation for "no" */
+#define PG_NOLETTER gettext_noop("n")
+
+bool
+yesno_prompt(const char *question)
+{
+ char prompt[256];
+
+ /*------
+ translator: This is a question followed by the translated options for
+ "yes" and "no". */
+ snprintf(prompt, sizeof(prompt), _("%s (%s/%s) "),
+ _(question), _(PG_YESLETTER), _(PG_NOLETTER));
+
+ for (;;)
+ {
+ char *resp;
+
+ resp = simple_prompt(prompt, true);
+
+ if (strcmp(resp, _(PG_YESLETTER)) == 0)
+ {
+ free(resp);
+ return true;
+ }
+ if (strcmp(resp, _(PG_NOLETTER)) == 0)
+ {
+ free(resp);
+ return false;
+ }
+ free(resp);
+
+ printf(_("Please answer \"%s\" or \"%s\".\n"),
+ _(PG_YESLETTER), _(PG_NOLETTER));
+ }
+}
diff --git a/src/bin/scripts/common.h b/src/bin/scripts/common.h
new file mode 100644
index 0000000..b463b1b
--- /dev/null
+++ b/src/bin/scripts/common.h
@@ -0,0 +1,26 @@
+/*
+ * common.h
+ * Common support routines for bin/scripts/
+ *
+ * Copyright (c) 2003-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/common.h
+ */
+#ifndef COMMON_H
+#define COMMON_H
+
+#include "common/username.h"
+#include "fe_utils/connect_utils.h"
+#include "getopt_long.h" /* pgrminclude ignore */
+#include "libpq-fe.h"
+#include "pqexpbuffer.h" /* pgrminclude ignore */
+
+extern void splitTableColumnsSpec(const char *spec, int encoding,
+ char **table, const char **columns);
+
+extern void appendQualifiedRelation(PQExpBuffer buf, const char *spec,
+ PGconn *conn, bool echo);
+
+extern bool yesno_prompt(const char *question);
+
+#endif /* COMMON_H */
diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c
new file mode 100644
index 0000000..9ca86a3
--- /dev/null
+++ b/src/bin/scripts/createdb.c
@@ -0,0 +1,316 @@
+/*-------------------------------------------------------------------------
+ *
+ * createdb
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/createdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"owner", required_argument, NULL, 'O'},
+ {"tablespace", required_argument, NULL, 'D'},
+ {"template", required_argument, NULL, 'T'},
+ {"encoding", required_argument, NULL, 'E'},
+ {"strategy", required_argument, NULL, 'S'},
+ {"lc-collate", required_argument, NULL, 1},
+ {"lc-ctype", required_argument, NULL, 2},
+ {"locale", required_argument, NULL, 'l'},
+ {"maintenance-db", required_argument, NULL, 3},
+ {"locale-provider", required_argument, NULL, 4},
+ {"icu-locale", required_argument, NULL, 5},
+ {"icu-rules", required_argument, NULL, 6},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ char *comment = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ char *owner = NULL;
+ char *tablespace = NULL;
+ char *template = NULL;
+ char *encoding = NULL;
+ char *strategy = NULL;
+ char *lc_collate = NULL;
+ char *lc_ctype = NULL;
+ char *locale = NULL;
+ char *locale_provider = NULL;
+ char *icu_locale = NULL;
+ char *icu_rules = NULL;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "createdb", help);
+
+ while ((c = getopt_long(argc, argv, "D:eE:h:l:O:p:S:T:U:wW", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'D':
+ tablespace = pg_strdup(optarg);
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'E':
+ encoding = pg_strdup(optarg);
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'l':
+ locale = pg_strdup(optarg);
+ break;
+ case 'O':
+ owner = pg_strdup(optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'S':
+ strategy = pg_strdup(optarg);
+ break;
+ case 'T':
+ template = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 1:
+ lc_collate = pg_strdup(optarg);
+ break;
+ case 2:
+ lc_ctype = pg_strdup(optarg);
+ break;
+ case 3:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 4:
+ locale_provider = pg_strdup(optarg);
+ break;
+ case 5:
+ icu_locale = pg_strdup(optarg);
+ break;
+ case 6:
+ icu_rules = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ break;
+ case 1:
+ dbname = argv[optind];
+ break;
+ case 2:
+ dbname = argv[optind];
+ comment = argv[optind + 1];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 2]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (encoding)
+ {
+ if (pg_char_to_encoding(encoding) < 0)
+ pg_fatal("\"%s\" is not a valid encoding name", encoding);
+ }
+
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ /* No point in trying to use postgres db when creating postgres db. */
+ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
+ maintenance_db = "template1";
+
+ cparams.dbname = maintenance_db;
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ initPQExpBuffer(&sql);
+
+ appendPQExpBuffer(&sql, "CREATE DATABASE %s",
+ fmtId(dbname));
+
+ if (owner)
+ appendPQExpBuffer(&sql, " OWNER %s", fmtId(owner));
+ if (tablespace)
+ appendPQExpBuffer(&sql, " TABLESPACE %s", fmtId(tablespace));
+ if (encoding)
+ {
+ appendPQExpBufferStr(&sql, " ENCODING ");
+ appendStringLiteralConn(&sql, encoding, conn);
+ }
+ if (strategy)
+ appendPQExpBuffer(&sql, " STRATEGY %s", fmtId(strategy));
+ if (template)
+ appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template));
+ if (locale)
+ {
+ appendPQExpBufferStr(&sql, " LOCALE ");
+ appendStringLiteralConn(&sql, locale, conn);
+ }
+ if (lc_collate)
+ {
+ appendPQExpBufferStr(&sql, " LC_COLLATE ");
+ appendStringLiteralConn(&sql, lc_collate, conn);
+ }
+ if (lc_ctype)
+ {
+ appendPQExpBufferStr(&sql, " LC_CTYPE ");
+ appendStringLiteralConn(&sql, lc_ctype, conn);
+ }
+ if (locale_provider)
+ appendPQExpBuffer(&sql, " LOCALE_PROVIDER %s", locale_provider);
+ if (icu_locale)
+ {
+ appendPQExpBufferStr(&sql, " ICU_LOCALE ");
+ appendStringLiteralConn(&sql, icu_locale, conn);
+ }
+ if (icu_rules)
+ {
+ appendPQExpBufferStr(&sql, " ICU_RULES ");
+ appendStringLiteralConn(&sql, icu_rules, conn);
+ }
+
+ appendPQExpBufferChar(&sql, ';');
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("database creation failed: %s", PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+
+ if (comment)
+ {
+ printfPQExpBuffer(&sql, "COMMENT ON DATABASE %s IS ", fmtId(dbname));
+ appendStringLiteralConn(&sql, comment, conn);
+ appendPQExpBufferChar(&sql, ';');
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("comment creation failed (database was created): %s",
+ PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ }
+
+ PQfinish(conn);
+
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s creates a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME] [DESCRIPTION]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -D, --tablespace=TABLESPACE default tablespace for the database\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -E, --encoding=ENCODING encoding for the database\n"));
+ printf(_(" -l, --locale=LOCALE locale settings for the database\n"));
+ printf(_(" --lc-collate=LOCALE LC_COLLATE setting for the database\n"));
+ printf(_(" --lc-ctype=LOCALE LC_CTYPE setting for the database\n"));
+ printf(_(" --icu-locale=LOCALE ICU locale setting for the database\n"));
+ printf(_(" --icu-rules=RULES ICU rules setting for the database\n"));
+ printf(_(" --locale-provider={libc|icu}\n"
+ " locale provider for the database's default collation\n"));
+ printf(_(" -O, --owner=OWNER database user to own the new database\n"));
+ printf(_(" -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"));
+ printf(_(" -T, --template=TEMPLATE template database to copy\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nBy default, a database with the same name as the current user is created.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c
new file mode 100644
index 0000000..0709491
--- /dev/null
+++ b/src/bin/scripts/createuser.c
@@ -0,0 +1,456 @@
+/*-------------------------------------------------------------------------
+ *
+ * createuser
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/createuser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"with-admin", required_argument, NULL, 'a'},
+ {"connection-limit", required_argument, NULL, 'c'},
+ {"createdb", no_argument, NULL, 'd'},
+ {"no-createdb", no_argument, NULL, 'D'},
+ {"echo", no_argument, NULL, 'e'},
+ {"encrypted", no_argument, NULL, 'E'},
+ {"role", required_argument, NULL, 'g'},
+ {"member-of", required_argument, NULL, 'g'},
+ {"host", required_argument, NULL, 'h'},
+ {"inherit", no_argument, NULL, 'i'},
+ {"no-inherit", no_argument, NULL, 'I'},
+ {"login", no_argument, NULL, 'l'},
+ {"no-login", no_argument, NULL, 'L'},
+ {"with-member", required_argument, NULL, 'm'},
+ {"port", required_argument, NULL, 'p'},
+ {"pwprompt", no_argument, NULL, 'P'},
+ {"createrole", no_argument, NULL, 'r'},
+ {"no-createrole", no_argument, NULL, 'R'},
+ {"superuser", no_argument, NULL, 's'},
+ {"no-superuser", no_argument, NULL, 'S'},
+ {"username", required_argument, NULL, 'U'},
+ {"valid-until", required_argument, NULL, 'v'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"replication", no_argument, NULL, 1},
+ {"no-replication", no_argument, NULL, 2},
+ {"interactive", no_argument, NULL, 3},
+ {"bypassrls", no_argument, NULL, 4},
+ {"no-bypassrls", no_argument, NULL, 5},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+ const char *newuser = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ SimpleStringList roles = {NULL, NULL};
+ SimpleStringList members = {NULL, NULL};
+ SimpleStringList admins = {NULL, NULL};
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool interactive = false;
+ int conn_limit = -2; /* less than minimum valid value */
+ bool pwprompt = false;
+ char *newpassword = NULL;
+ char *pwexpiry = NULL;
+
+ /* Tri-valued variables. */
+ enum trivalue createdb = TRI_DEFAULT,
+ superuser = TRI_DEFAULT,
+ createrole = TRI_DEFAULT,
+ inherit = TRI_DEFAULT,
+ login = TRI_DEFAULT,
+ replication = TRI_DEFAULT,
+ bypassrls = TRI_DEFAULT;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "createuser", help);
+
+ while ((c = getopt_long(argc, argv, "a:c:dDeEg:h:iIlLm:p:PrRsSU:v:wW",
+ long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ simple_string_list_append(&admins, optarg);
+ break;
+ case 'c':
+ if (!option_parse_int(optarg, "-c/--connection-limit",
+ -1, INT_MAX, &conn_limit))
+ exit(1);
+ break;
+ case 'd':
+ createdb = TRI_YES;
+ break;
+ case 'D':
+ createdb = TRI_NO;
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'E':
+ /* no-op, accepted for backward compatibility */
+ break;
+ case 'g':
+ simple_string_list_append(&roles, optarg);
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'i':
+ inherit = TRI_YES;
+ break;
+ case 'I':
+ inherit = TRI_NO;
+ break;
+ case 'l':
+ login = TRI_YES;
+ break;
+ case 'L':
+ login = TRI_NO;
+ break;
+ case 'm':
+ simple_string_list_append(&members, optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'P':
+ pwprompt = true;
+ break;
+ case 'r':
+ createrole = TRI_YES;
+ break;
+ case 'R':
+ createrole = TRI_NO;
+ break;
+ case 's':
+ superuser = TRI_YES;
+ break;
+ case 'S':
+ superuser = TRI_NO;
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'v':
+ pwexpiry = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 1:
+ replication = TRI_YES;
+ break;
+ case 2:
+ replication = TRI_NO;
+ break;
+ case 3:
+ interactive = true;
+ break;
+ case 4:
+ bypassrls = TRI_YES;
+ break;
+ case 5:
+ bypassrls = TRI_NO;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ break;
+ case 1:
+ newuser = argv[optind];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (newuser == NULL)
+ {
+ if (interactive)
+ {
+ newuser = simple_prompt("Enter name of role to add: ", true);
+ }
+ else
+ {
+ if (getenv("PGUSER"))
+ newuser = getenv("PGUSER");
+ else
+ newuser = get_user_name_or_exit(progname);
+ }
+ }
+
+ if (pwprompt)
+ {
+ char *pw2;
+
+ newpassword = simple_prompt("Enter password for new role: ", false);
+ pw2 = simple_prompt("Enter it again: ", false);
+ if (strcmp(newpassword, pw2) != 0)
+ {
+ fprintf(stderr, _("Passwords didn't match.\n"));
+ exit(1);
+ }
+ free(pw2);
+ }
+
+ if (superuser == TRI_DEFAULT)
+ {
+ if (interactive && yesno_prompt("Shall the new role be a superuser?"))
+ superuser = TRI_YES;
+ else
+ superuser = TRI_NO;
+ }
+
+ if (superuser == TRI_YES)
+ {
+ /* Not much point in trying to restrict a superuser */
+ createdb = TRI_YES;
+ createrole = TRI_YES;
+ }
+
+ if (createdb == TRI_DEFAULT)
+ {
+ if (interactive && yesno_prompt("Shall the new role be allowed to create databases?"))
+ createdb = TRI_YES;
+ else
+ createdb = TRI_NO;
+ }
+
+ if (createrole == TRI_DEFAULT)
+ {
+ if (interactive && yesno_prompt("Shall the new role be allowed to create more new roles?"))
+ createrole = TRI_YES;
+ else
+ createrole = TRI_NO;
+ }
+
+ if (bypassrls == TRI_DEFAULT)
+ bypassrls = TRI_NO;
+
+ if (replication == TRI_DEFAULT)
+ replication = TRI_NO;
+
+ if (inherit == TRI_DEFAULT)
+ inherit = TRI_YES;
+
+ if (login == TRI_DEFAULT)
+ login = TRI_YES;
+
+ cparams.dbname = NULL; /* this program lacks any dbname option... */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ initPQExpBuffer(&sql);
+
+ printfPQExpBuffer(&sql, "CREATE ROLE %s", fmtId(newuser));
+ if (newpassword)
+ {
+ char *encrypted_password;
+
+ appendPQExpBufferStr(&sql, " PASSWORD ");
+
+ encrypted_password = PQencryptPasswordConn(conn,
+ newpassword,
+ newuser,
+ NULL);
+ if (!encrypted_password)
+ pg_fatal("password encryption failed: %s",
+ PQerrorMessage(conn));
+ appendStringLiteralConn(&sql, encrypted_password, conn);
+ PQfreemem(encrypted_password);
+ }
+ if (superuser == TRI_YES)
+ appendPQExpBufferStr(&sql, " SUPERUSER");
+ if (superuser == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOSUPERUSER");
+ if (createdb == TRI_YES)
+ appendPQExpBufferStr(&sql, " CREATEDB");
+ if (createdb == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOCREATEDB");
+ if (createrole == TRI_YES)
+ appendPQExpBufferStr(&sql, " CREATEROLE");
+ if (createrole == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOCREATEROLE");
+ if (inherit == TRI_YES)
+ appendPQExpBufferStr(&sql, " INHERIT");
+ if (inherit == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOINHERIT");
+ if (login == TRI_YES)
+ appendPQExpBufferStr(&sql, " LOGIN");
+ if (login == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOLOGIN");
+ if (replication == TRI_YES)
+ appendPQExpBufferStr(&sql, " REPLICATION");
+ if (replication == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOREPLICATION");
+ if (bypassrls == TRI_YES)
+ appendPQExpBufferStr(&sql, " BYPASSRLS");
+ if (bypassrls == TRI_NO)
+ appendPQExpBufferStr(&sql, " NOBYPASSRLS");
+ if (conn_limit >= -1)
+ appendPQExpBuffer(&sql, " CONNECTION LIMIT %d", conn_limit);
+ if (pwexpiry != NULL)
+ {
+ appendPQExpBufferStr(&sql, " VALID UNTIL ");
+ appendStringLiteralConn(&sql, pwexpiry, conn);
+ }
+ if (roles.head != NULL)
+ {
+ SimpleStringListCell *cell;
+
+ appendPQExpBufferStr(&sql, " IN ROLE ");
+
+ for (cell = roles.head; cell; cell = cell->next)
+ {
+ if (cell->next)
+ appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
+ else
+ appendPQExpBufferStr(&sql, fmtId(cell->val));
+ }
+ }
+ if (members.head != NULL)
+ {
+ SimpleStringListCell *cell;
+
+ appendPQExpBufferStr(&sql, " ROLE ");
+
+ for (cell = members.head; cell; cell = cell->next)
+ {
+ if (cell->next)
+ appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
+ else
+ appendPQExpBufferStr(&sql, fmtId(cell->val));
+ }
+ }
+ if (admins.head != NULL)
+ {
+ SimpleStringListCell *cell;
+
+ appendPQExpBufferStr(&sql, " ADMIN ");
+
+ for (cell = admins.head; cell; cell = cell->next)
+ {
+ if (cell->next)
+ appendPQExpBuffer(&sql, "%s,", fmtId(cell->val));
+ else
+ appendPQExpBufferStr(&sql, fmtId(cell->val));
+ }
+ }
+
+ appendPQExpBufferChar(&sql, ';');
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("creation of new role failed: %s", PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ PQfinish(conn);
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s creates a new PostgreSQL role.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [ROLENAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+ " option\n"));
+ printf(_(" -c, --connection-limit=N connection limit for role (default: no limit)\n"));
+ printf(_(" -d, --createdb role can create new databases\n"));
+ printf(_(" -D, --no-createdb role cannot create databases (default)\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -g, --member-of=ROLE new role will be a member of ROLE\n"));
+ printf(_(" --role=ROLE (same as --member-of, deprecated)\n"));
+ printf(_(" -i, --inherit role inherits privileges of roles it is a\n"
+ " member of (default)\n"));
+ printf(_(" -I, --no-inherit role does not inherit privileges\n"));
+ printf(_(" -l, --login role can login (default)\n"));
+ printf(_(" -L, --no-login role cannot login\n"));
+ printf(_(" -m, --with-member=ROLE ROLE will be a member of new role\n"));
+ printf(_(" -P, --pwprompt assign a password to new role\n"));
+ printf(_(" -r, --createrole role can create new roles\n"));
+ printf(_(" -R, --no-createrole role cannot create roles (default)\n"));
+ printf(_(" -s, --superuser role will be superuser\n"));
+ printf(_(" -S, --no-superuser role will not be superuser (default)\n"));
+ printf(_(" -v, --valid-until=TIMESTAMP\n"
+ " password expiration date and time for role\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --interactive prompt for missing role name and attributes rather\n"
+ " than using defaults\n"));
+ printf(_(" --bypassrls role can bypass row-level security (RLS) policy\n"));
+ printf(_(" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+ " (default)\n"));
+ printf(_(" --replication role can initiate replication\n"));
+ printf(_(" --no-replication role cannot initiate replication (default)\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as (not the one to create)\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c
new file mode 100644
index 0000000..8d0f432
--- /dev/null
+++ b/src/bin/scripts/dropdb.c
@@ -0,0 +1,190 @@
+/*-------------------------------------------------------------------------
+ *
+ * dropdb
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/dropdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static int if_exists = 0;
+
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"interactive", no_argument, NULL, 'i'},
+ {"if-exists", no_argument, &if_exists, 1},
+ {"maintenance-db", required_argument, NULL, 2},
+ {"force", no_argument, NULL, 'f'},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ char *dbname = NULL;
+ char *maintenance_db = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool interactive = false;
+ bool force = false;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "dropdb", help);
+
+ while ((c = getopt_long(argc, argv, "efh:ip:U:wW", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'e':
+ echo = true;
+ break;
+ case 'f':
+ force = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'i':
+ interactive = true;
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 0:
+ /* this covers the long options */
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ pg_log_error("missing required argument database name");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ case 1:
+ dbname = argv[optind];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (interactive)
+ {
+ printf(_("Database \"%s\" will be permanently removed.\n"), dbname);
+ if (!yesno_prompt("Are you sure?"))
+ exit(0);
+ }
+
+ initPQExpBuffer(&sql);
+
+ appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;",
+ (if_exists ? "IF EXISTS " : ""),
+ fmtId(dbname),
+ force ? " WITH (FORCE)" : "");
+
+ /* Avoid trying to drop postgres db while we are connected to it. */
+ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0)
+ maintenance_db = "template1";
+
+ cparams.dbname = maintenance_db;
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("database removal failed: %s", PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ PQfinish(conn);
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s removes a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... DBNAME\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -f, --force try to terminate other connections before dropping\n"));
+ printf(_(" -i, --interactive prompt before deleting anything\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --if-exists don't report error if database doesn't exist\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c
new file mode 100644
index 0000000..8aad932
--- /dev/null
+++ b/src/bin/scripts/dropuser.c
@@ -0,0 +1,187 @@
+/*-------------------------------------------------------------------------
+ *
+ * dropuser
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/dropuser.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "common/string.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/string_utils.h"
+
+
+static void help(const char *progname);
+
+
+int
+main(int argc, char *argv[])
+{
+ static int if_exists = 0;
+
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"interactive", no_argument, NULL, 'i'},
+ {"if-exists", no_argument, &if_exists, 1},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ char *dropuser = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool interactive = false;
+
+ PQExpBufferData sql;
+
+ PGconn *conn;
+ PGresult *result;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "dropuser", help);
+
+ while ((c = getopt_long(argc, argv, "eh:ip:U:wW", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'e':
+ echo = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'i':
+ interactive = true;
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 0:
+ /* this covers the long options */
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ switch (argc - optind)
+ {
+ case 0:
+ break;
+ case 1:
+ dropuser = argv[optind];
+ break;
+ default:
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ if (dropuser == NULL)
+ {
+ if (interactive)
+ {
+ dropuser = simple_prompt("Enter name of role to drop: ", true);
+ }
+ else
+ {
+ pg_log_error("missing required argument role name");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (interactive)
+ {
+ printf(_("Role \"%s\" will be permanently removed.\n"), dropuser);
+ if (!yesno_prompt("Are you sure?"))
+ exit(0);
+ }
+
+ cparams.dbname = NULL; /* this program lacks any dbname option... */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ conn = connectMaintenanceDatabase(&cparams, progname, echo);
+
+ initPQExpBuffer(&sql);
+ appendPQExpBuffer(&sql, "DROP ROLE %s%s;",
+ (if_exists ? "IF EXISTS " : ""), fmtId(dropuser));
+
+ if (echo)
+ printf("%s\n", sql.data);
+ result = PQexec(conn, sql.data);
+
+ if (PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ pg_log_error("removal of role \"%s\" failed: %s",
+ dropuser, PQerrorMessage(conn));
+ PQfinish(conn);
+ exit(1);
+ }
+
+ PQclear(result);
+ PQfinish(conn);
+ exit(0);
+}
+
+
+static void
+help(const char *progname)
+{
+ printf(_("%s removes a PostgreSQL role.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [ROLENAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -i, --interactive prompt before deleting anything, and prompt for\n"
+ " role name if not specified\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" --if-exists don't report error if user doesn't exist\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as (not the one to drop)\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build
new file mode 100644
index 0000000..5b4f8a6
--- /dev/null
+++ b/src/bin/scripts/meson.build
@@ -0,0 +1,62 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+scripts_common = static_library('libscripts_common',
+ files('common.c'),
+ dependencies: [frontend_code, libpq],
+ kwargs: internal_lib_args,
+)
+
+binaries = [
+ 'createdb',
+ 'dropdb',
+ 'createuser',
+ 'dropuser',
+ 'clusterdb',
+ 'vacuumdb',
+ 'reindexdb',
+ 'pg_isready',
+]
+
+foreach binary : binaries
+ binary_sources = files('@0@.c'.format(binary))
+
+ if host_system == 'windows'
+ binary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', binary,
+ '--FILEDESC', '@0@ - PostgreSQL utility'.format(binary),])
+ endif
+
+ binary = executable(binary,
+ binary_sources,
+ link_with: [scripts_common],
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+ )
+ bin_targets += binary
+endforeach
+
+tests += {
+ 'name': 'scripts',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/010_clusterdb.pl',
+ 't/011_clusterdb_all.pl',
+ 't/020_createdb.pl',
+ 't/040_createuser.pl',
+ 't/050_dropdb.pl',
+ 't/070_dropuser.pl',
+ 't/080_pg_isready.pl',
+ 't/090_reindexdb.pl',
+ 't/091_reindexdb_all.pl',
+ 't/100_vacuumdb.pl',
+ 't/101_vacuumdb_all.pl',
+ 't/102_vacuumdb_stages.pl',
+ 't/200_connstr.pl',
+ ],
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk
new file mode 100644
index 0000000..5fe63fa
--- /dev/null
+++ b/src/bin/scripts/nls.mk
@@ -0,0 +1,22 @@
+# src/bin/scripts/nls.mk
+CATALOG_NAME = pgscripts
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ createdb.c \
+ createuser.c \
+ dropdb.c \
+ dropuser.c \
+ clusterdb.c \
+ vacuumdb.c \
+ reindexdb.c \
+ pg_isready.c \
+ common.c \
+ ../../fe_utils/parallel_slot.c \
+ ../../fe_utils/cancel.c \
+ ../../fe_utils/print.c \
+ ../../fe_utils/connect_utils.c \
+ ../../fe_utils/option_utils.c \
+ ../../fe_utils/query_utils.c \
+ ../../common/fe_memutils.c \
+ ../../common/username.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt yesno_prompt
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c
new file mode 100644
index 0000000..64bbffb
--- /dev/null
+++ b/src/bin/scripts/pg_isready.c
@@ -0,0 +1,242 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_isready --- checks the status of the PostgreSQL server
+ *
+ * Copyright (c) 2013-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/pg_isready.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+#include "common.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+
+#define DEFAULT_CONNECT_TIMEOUT "3"
+
+static void
+ help(const char *progname);
+
+int
+main(int argc, char **argv)
+{
+ int c;
+
+ const char *progname;
+
+ const char *pghost = NULL;
+ const char *pgport = NULL;
+ const char *pguser = NULL;
+ const char *pgdbname = NULL;
+ const char *connect_timeout = DEFAULT_CONNECT_TIMEOUT;
+
+ const char *pghost_str = NULL;
+ const char *pghostaddr_str = NULL;
+ const char *pgport_str = NULL;
+
+#define PARAMS_ARRAY_SIZE 7
+
+ const char *keywords[PARAMS_ARRAY_SIZE];
+ const char *values[PARAMS_ARRAY_SIZE];
+
+ bool quiet = false;
+
+ PGPing rv;
+ PQconninfoOption *opts = NULL;
+ PQconninfoOption *defs = NULL;
+ PQconninfoOption *opt;
+ PQconninfoOption *def;
+ char *errmsg = NULL;
+
+ /*
+ * We accept user and database as options to avoid useless errors from
+ * connecting with invalid params
+ */
+
+ static struct option long_options[] = {
+ {"dbname", required_argument, NULL, 'd'},
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"timeout", required_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
+ {NULL, 0, NULL, 0}
+ };
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+ handle_help_version_opts(argc, argv, progname, help);
+
+ while ((c = getopt_long(argc, argv, "d:h:p:qt:U:", long_options, NULL)) != -1)
+ {
+ switch (c)
+ {
+ case 'd':
+ pgdbname = pg_strdup(optarg);
+ break;
+ case 'h':
+ pghost = pg_strdup(optarg);
+ break;
+ case 'p':
+ pgport = pg_strdup(optarg);
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 't':
+ connect_timeout = pg_strdup(optarg);
+ break;
+ case 'U':
+ pguser = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+
+ /*
+ * We need to make sure we don't return 1 here because someone
+ * checking the return code might infer unintended meaning
+ */
+ exit(PQPING_NO_ATTEMPT);
+ }
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+
+ /*
+ * We need to make sure we don't return 1 here because someone
+ * checking the return code might infer unintended meaning
+ */
+ exit(PQPING_NO_ATTEMPT);
+ }
+
+ keywords[0] = "host";
+ values[0] = pghost;
+ keywords[1] = "port";
+ values[1] = pgport;
+ keywords[2] = "user";
+ values[2] = pguser;
+ keywords[3] = "dbname";
+ values[3] = pgdbname;
+ keywords[4] = "connect_timeout";
+ values[4] = connect_timeout;
+ keywords[5] = "fallback_application_name";
+ values[5] = progname;
+ keywords[6] = NULL;
+ values[6] = NULL;
+
+ /*
+ * Get the host and port so we can display them in our output
+ */
+ if (pgdbname &&
+ (strncmp(pgdbname, "postgresql://", 13) == 0 ||
+ strncmp(pgdbname, "postgres://", 11) == 0 ||
+ strchr(pgdbname, '=') != NULL))
+ {
+ opts = PQconninfoParse(pgdbname, &errmsg);
+ if (opts == NULL)
+ {
+ pg_log_error("%s", errmsg);
+ exit(PQPING_NO_ATTEMPT);
+ }
+ }
+
+ defs = PQconndefaults();
+ if (defs == NULL)
+ {
+ pg_log_error("could not fetch default options");
+ exit(PQPING_NO_ATTEMPT);
+ }
+
+ for (opt = opts, def = defs; def->keyword; def++)
+ {
+ if (strcmp(def->keyword, "host") == 0)
+ {
+ if (opt && opt->val)
+ pghost_str = opt->val;
+ else if (pghost)
+ pghost_str = pghost;
+ else if (def->val)
+ pghost_str = def->val;
+ else
+ pghost_str = DEFAULT_PGSOCKET_DIR;
+ }
+ else if (strcmp(def->keyword, "hostaddr") == 0)
+ {
+ if (opt && opt->val)
+ pghostaddr_str = opt->val;
+ else if (def->val)
+ pghostaddr_str = def->val;
+ }
+ else if (strcmp(def->keyword, "port") == 0)
+ {
+ if (opt && opt->val)
+ pgport_str = opt->val;
+ else if (pgport)
+ pgport_str = pgport;
+ else if (def->val)
+ pgport_str = def->val;
+ }
+
+ if (opt)
+ opt++;
+ }
+
+ rv = PQpingParams(keywords, values, 1);
+
+ if (!quiet)
+ {
+ printf("%s:%s - ",
+ pghostaddr_str != NULL ? pghostaddr_str : pghost_str,
+ pgport_str);
+
+ switch (rv)
+ {
+ case PQPING_OK:
+ printf(_("accepting connections\n"));
+ break;
+ case PQPING_REJECT:
+ printf(_("rejecting connections\n"));
+ break;
+ case PQPING_NO_RESPONSE:
+ printf(_("no response\n"));
+ break;
+ case PQPING_NO_ATTEMPT:
+ printf(_("no attempt\n"));
+ break;
+ default:
+ printf(_("unknown\n"));
+ }
+ }
+
+ exit(rv);
+}
+
+static void
+help(const char *progname)
+{
+ printf(_("%s issues a connection check to a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]...\n"), progname);
+
+ printf(_("\nOptions:\n"));
+ printf(_(" -d, --dbname=DBNAME database name\n"));
+ printf(_(" -q, --quiet run quietly\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"), DEFAULT_CONNECT_TIMEOUT);
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/po/LINGUAS b/src/bin/scripts/po/LINGUAS
new file mode 100644
index 0000000..e75500a
--- /dev/null
+++ b/src/bin/scripts/po/LINGUAS
@@ -0,0 +1 @@
+cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN
diff --git a/src/bin/scripts/po/cs.po b/src/bin/scripts/po/cs.po
new file mode 100644
index 0000000..6b4a45a
--- /dev/null
+++ b/src/bin/scripts/po/cs.po
@@ -0,0 +1,1267 @@
+# Czech translation of pgscripts messages.
+#
+# pgtranslation Id: pgscripts.po,v 1.3 2009/10/14 21:08:40 petere Exp $
+#
+# Karel Žák, 2001-2003, 2004.
+# Zdeněk Kotala, 2009, 2011, 2012, 2013.
+# Tomáš Vondra <tv@fuzzy.cz>, 2012, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts-cs (PostgreSQL 9.3)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:16+0000\n"
+"PO-Revision-Date: 2023-09-05 07:31+0200\n"
+"Last-Translator: Tomas Vondra <tv@fuzzy.cz>\n"
+"Language-Team: Czech <info@cspug.cx>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: ../../../src/common/logging.c:236
+#, c-format
+msgid "fatal: "
+msgstr "fatal: "
+
+#: ../../../src/common/logging.c:243
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:250
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "paměť vyÄerpána\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nelze duplikovat nulový ukazatel (interní chyba)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nelze nalézt effective user ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "uživatel neexistuje"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "chyba vyhledávání jména uživatele: chybový kód %lu"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "Požadavek na zrušení byl poslán\n"
+
+#: ../../fe_utils/cancel.c:165
+msgid "Could not send cancel request: "
+msgstr "Nelze poslat požadavek na zrušení: "
+
+#: ../../fe_utils/cancel.c:210
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "Nelze poslat požadavek na zrušení: %s"
+
+#: ../../fe_utils/print.c:350
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu řádka)"
+msgstr[1] "(%lu řádky)"
+msgstr[2] "(%lu řádek)"
+
+#: ../../fe_utils/print.c:3055
+#, c-format
+msgid "Interrupted\n"
+msgstr "Přerušeno\n"
+
+#: ../../fe_utils/print.c:3119
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Nelze pÅ™idat hlaviÄku k obsahu tabulky: pÅ™ekroÄen poÄet sloupců %d.\n"
+
+#: ../../fe_utils/print.c:3159
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Nelze pÅ™idat buňku do obsahu tabulky: pÅ™ekroÄen celkový poÄet bunÄ›k %d.\n"
+
+#: ../../fe_utils/print.c:3414
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "specifikován neplatný formát výstupu (interní chyba): %d"
+
+#: clusterdb.c:110 clusterdb.c:129 createdb.c:122 createdb.c:141
+#: createuser.c:172 createuser.c:187 dropdb.c:102 dropdb.c:111 dropdb.c:119
+#: dropuser.c:93 dropuser.c:108 dropuser.c:123 pg_isready.c:95 pg_isready.c:109
+#: reindexdb.c:166 reindexdb.c:185 vacuumdb.c:225 vacuumdb.c:244
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: clusterdb.c:127 createdb.c:139 createuser.c:185 dropdb.c:117 dropuser.c:106
+#: pg_isready.c:107 reindexdb.c:183 vacuumdb.c:242
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "příliš mnoho parametrů příkazové řádky (první je \"%s\")"
+
+#: clusterdb.c:146
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "nelze provést cluster ve všech databázích a zároveň specifikovat jen jednu"
+
+#: clusterdb.c:152
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "nelze provést cluster specifické tabulky ve všech databázích"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "clusterování tabulky \"%s\" v databázi \"%s\" selhalo: %s"
+
+#: clusterdb.c:221
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "clusterování databáze \"%s\" selhalo: %s"
+
+#: clusterdb.c:249
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: provádí se cluster databáze \"%s\"\n"
+
+#: clusterdb.c:265
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s vytváří cluster všech již dříve clusterovaných tabulek v databázi.\n"
+"\n"
+
+#: clusterdb.c:266 createdb.c:266 createuser.c:354 dropdb.c:170 dropuser.c:170
+#: pg_isready.c:224 reindexdb.c:750 vacuumdb.c:911
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: clusterdb.c:267 reindexdb.c:751 vacuumdb.c:912
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [DATABÃZE]\n"
+
+#: clusterdb.c:268 createdb.c:268 createuser.c:356 dropdb.c:172 dropuser.c:172
+#: pg_isready.c:227 reindexdb.c:752 vacuumdb.c:913
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"PÅ™epínaÄe:\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all clusterovat všechny databáze\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DATABÃZE databáze pro cluster\n"
+
+#: clusterdb.c:271 createuser.c:360 dropdb.c:173 dropuser.c:173 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo ukazovat příkazy posílané na server\n"
+
+#: clusterdb.c:272 reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet nevypisovat žádné zprávy\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABULKA provést cluster pro danou tabulku\n"
+
+#: clusterdb.c:274 reindexdb.c:763
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: clusterdb.c:275 createuser.c:372 dropdb.c:176 dropuser.c:176 reindexdb.c:764
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informaci o verzi a skonÄí\n"
+
+#: clusterdb.c:276 createuser.c:377 dropdb.c:178 dropuser.c:178 reindexdb.c:765
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovÄ›du a skonÄí\n"
+
+#: clusterdb.c:277 createdb.c:279 createuser.c:378 dropdb.c:179 dropuser.c:179
+#: pg_isready.c:233 reindexdb.c:766 vacuumdb.c:934
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Parametry spojení:\n"
+
+#: clusterdb.c:278 createuser.c:379 dropdb.c:180 dropuser.c:180 reindexdb.c:767
+#: vacuumdb.c:935
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresáře se soketem\n"
+
+#: clusterdb.c:279 createuser.c:380 dropdb.c:181 dropuser.c:181 reindexdb.c:768
+#: vacuumdb.c:936
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: clusterdb.c:280 dropdb.c:182 reindexdb.c:769 vacuumdb.c:937
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení se serverem\n"
+
+#: clusterdb.c:281 createuser.c:382 dropdb.c:183 dropuser.c:183 reindexdb.c:770
+#: vacuumdb.c:938
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password neptá se na heslo\n"
+
+#: clusterdb.c:282 createuser.c:383 dropdb.c:184 dropuser.c:184 reindexdb.c:771
+#: vacuumdb.c:939
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password vynutí dotaz na heslo\n"
+
+#: clusterdb.c:283 dropdb.c:185 reindexdb.c:772 vacuumdb.c:940
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternativní maintenance databáze\n"
+
+#: clusterdb.c:284
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Pro detaily ÄtÄ›te popis SQL příkazu CLUSTER.\n"
+
+#: clusterdb.c:285 createdb.c:287 createuser.c:384 dropdb.c:186 dropuser.c:185
+#: pg_isready.c:238 reindexdb.c:774 vacuumdb.c:942
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: clusterdb.c:286 createdb.c:288 createuser.c:385 dropdb.c:187 dropuser.c:186
+#: pg_isready.c:239 reindexdb.c:775 vacuumdb.c:943
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: common.c:80 common.c:138
+msgid "Password: "
+msgstr "Heslo: "
+
+#: common.c:125
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "nelze navázat spojení s databází %s: nedotatek paměti"
+
+#: common.c:152
+#, c-format
+msgid "could not connect to database %s: %s"
+msgstr "nelze navázat spojení s databází %s: %s"
+
+#: common.c:231 common.c:256
+#, c-format
+msgid "query failed: %s"
+msgstr "dotaz selhal: %s"
+
+#: common.c:232 common.c:257
+#, c-format
+msgid "query was: %s"
+msgstr "dotaz byl: %s"
+
+#: common.c:329
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "zpracování databáze \"%s\" selhalo: %s"
+
+#: common.c:423
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "dotaz vrátil %d řádku namísto jedné: %s"
+msgstr[1] "dotaz vrátil %d řádky namísto jedné: %s"
+msgstr[2] "dotaz vrátil %d řádek namísto jedné: %s"
+
+# translator: Make sure the (y/n) prompts match the translation of this.
+#. translator: abbreviation for "yes"
+#: common.c:447
+msgid "y"
+msgstr "a"
+
+# translator: Make sure the (y/n) prompts match the translation of this.
+#. translator: abbreviation for "no"
+#: common.c:449
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:459
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:473
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Prosím odpovězte \"%s\" nebo \"%s\".\n"
+
+#: createdb.c:149
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "--locale a --lc-ctype nelze zvolit souÄasnÄ›"
+
+#: createdb.c:154
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "--locale a --lc-collate nelze zvolit souÄasnÄ›"
+
+#: createdb.c:165
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" není platné jméno kódování znaků"
+
+#: createdb.c:228
+#, c-format
+msgid "database creation failed: %s"
+msgstr "vytvoření databáze selhalo: %s"
+
+#: createdb.c:247
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "tvorba komentáře selhala (databáze byla vytvořena): %s"
+
+#: createdb.c:265
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s vytvoří PostgreSQL databázi.\n"
+"\n"
+
+#: createdb.c:267
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [DATABÃZE] [POPIS]\n"
+
+#: createdb.c:269
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=PROSTOR výchozí prostor tabulek pro databázi\n"
+
+#: createdb.c:270
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo ukázat příkazy posílané na server\n"
+
+#: createdb.c:271
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KÓDOVÃNà kódování znaků databáze\n"
+
+#: createdb.c:272
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE nastavení locale pro databázi\n"
+
+#: createdb.c:273
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE nastavení LC_COLLATE pro databázi\n"
+
+#: createdb.c:274
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE nastavení LC_CTYPE pro databázi\n"
+
+#: createdb.c:275
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=VLASTNÃK uživatel, který má být vlastníkem nové databáze\n"
+
+#: createdb.c:276
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=ŠABLONA šablona databáze ke kopírování\n"
+
+#: createdb.c:277
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informaci o verzi a skonÄí\n"
+
+#: createdb.c:278
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovÄ›du a skonÄí\n"
+
+#: createdb.c:280
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresáře se soketem\n"
+
+#: createdb.c:281
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: createdb.c:282
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení se serverem\n"
+
+#: createdb.c:283
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password neptá se na heslo\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password vynutí dotaz na heslo\n"
+
+#: createdb.c:285
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternativní maintenance databáze\n"
+
+#: createdb.c:286
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Implicitně je vytvořena databáze stejného jména jako je jméno aktuálního uživatele.\n"
+
+#: createuser.c:151
+#, c-format
+msgid "invalid value for --connection-limit: %s"
+msgstr "chybná hodnota pro volbu --connection-limit: %s"
+
+#: createuser.c:195
+msgid "Enter name of role to add: "
+msgstr "Vložte jméno role, kterou chete přidat: "
+
+#: createuser.c:212
+msgid "Enter password for new role: "
+msgstr "Vložte heslo nové role: "
+
+#: createuser.c:214
+msgid "Enter it again: "
+msgstr "Zadejte znova: "
+
+#: createuser.c:217
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Hesla se neshodují.\n"
+
+#: createuser.c:225
+msgid "Shall the new role be a superuser?"
+msgstr "Má být nová role superuživatel?"
+
+#: createuser.c:240
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Měla by mít nová role právo vytvářet databáze?"
+
+#: createuser.c:248
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Měla by mít nová role právo vytvářet další nové role?"
+
+#: createuser.c:284
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "šifrování hesla selhalo: %s"
+
+#: createuser.c:339
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "tvorba nové role selhala: %s"
+
+#: createuser.c:353
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s vytvoří novou PostgreSQL roli.\n"
+"\n"
+
+#: createuser.c:355 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [PŘEPÃNAÄŒ]... [JMÉNO ROLE]\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limit poÄtu konexí pro role (implicitnÄ›: bez limitu)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb role může vytvářet nové databáze\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb role nemůže vytvářet nové databáze (výchozí)\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE nová role bude Älenem této role\n"
+
+#: createuser.c:362
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit role dÄ›dí práva rolí, kterých je Älenem\n"
+" (implicitnÄ›)\n"
+
+#: createuser.c:364
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit role nedědí práva\n"
+
+#: createuser.c:365
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login role se může přihlásit (implicitně)\n"
+
+#: createuser.c:366
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login role se nemůže přihlásit\n"
+
+#: createuser.c:367
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt nastavit heslo pro novou roli\n"
+
+#: createuser.c:368
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole role může vytvářet nové role\n"
+
+#: createuser.c:369
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole role nemůže vytvářet nové role (výchozí)\n"
+
+#: createuser.c:370
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser role bude superuživatel\n"
+
+#: createuser.c:371
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser role nebude superuživatel (výchozí)\n"
+
+#: createuser.c:373
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive zeptej se na chybějící jméno role a atributy namísto\n"
+" použití výchozích hodnot\n"
+
+#: createuser.c:375
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication role může inicializovat replikaci\n"
+
+#: createuser.c:376
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication role nemůže inicializovat replikaci\n"
+
+#: createuser.c:381
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení (ne pro tvorbu)\n"
+
+#: dropdb.c:110
+#, c-format
+msgid "missing required argument database name"
+msgstr "chybí vyžadovaný parametr jméno databáze"
+
+#: dropdb.c:125
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Databáze \"%s\" bude trvale odstraněna.\n"
+
+#: dropdb.c:126 dropuser.c:131
+msgid "Are you sure?"
+msgstr "UrÄitÄ›?"
+
+#: dropdb.c:155
+#, c-format
+msgid "database removal failed: %s"
+msgstr "odstraňování databáze selhalo: %s"
+
+#: dropdb.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s odstraňuje PostgreSQL databázi.\n"
+"\n"
+
+#: dropdb.c:171
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [PŘEPÃNAÄŒ]... DATABÃZE\n"
+
+#: dropdb.c:174
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force pokus se přerušit ostatní spojení před smazáním\n"
+
+#: dropdb.c:175
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive zeptej se pÅ™ed smazáním Äehokoli\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists nevypisuj chybu pokud databáze neexistuje\n"
+
+#: dropuser.c:116
+msgid "Enter name of role to drop: "
+msgstr "Vložte jméno role pro odstranění: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "chybí povinný parametr jméno role"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Role \"%s\" bude trvale odstraněna.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "odstraňování role \"%s\" selhalo: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s odstraňuje PostgreSQL roli.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive pÅ™ed smazáním Äehokoliv se zeptá, a také na jméno\n"
+" role pokud není zadáno\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists nevypisuj chybu pokud uživatel neexistuje\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro spojení (ne pro odstranění)\n"
+
+#: pg_isready.c:144
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_isready.c:152
+#, c-format
+msgid "could not fetch default options"
+msgstr "nelze naÄíst výchozí volby"
+
+#: pg_isready.c:201
+#, c-format
+msgid "accepting connections\n"
+msgstr "server přijímá spojení\n"
+
+#: pg_isready.c:204
+#, c-format
+msgid "rejecting connections\n"
+msgstr "server odmítá spojení\n"
+
+#: pg_isready.c:207
+#, c-format
+msgid "no response\n"
+msgstr "žádná odpovÄ›Ä\n"
+
+#: pg_isready.c:210
+#, c-format
+msgid "no attempt\n"
+msgstr "žádný pokus\n"
+
+#: pg_isready.c:213
+#, c-format
+msgid "unknown\n"
+msgstr "neznámo\n"
+
+#: pg_isready.c:223
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s provede kontrolu spojení k PostgreSQL databázi.\n"
+"\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [PŘEPÃNAÄŒ]...\n"
+
+#: pg_isready.c:228
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DATABÃZE databáze k reindexaci\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet nevypisovat žádné zprávy\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informaci o verzi a skonÄí\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tuto nápovÄ›du a skonÄí\n"
+
+#: pg_isready.c:234
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME jméno databázového serveru nebo adresáře se soketem\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port databázového serveru\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS poÄet vteÅ™in Äekání pÅ™i pokusu o spojení, 0 toto omezení vypne (výchozí: %s)\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UŽIVATEL jméno uživatele pro připojení\n"
+
+#: reindexdb.c:152 vacuumdb.c:184
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "poÄet paralelních jobů musí být alespoň 1"
+
+#: reindexdb.c:202
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "nelze reindexovat vÅ¡echny databáze a souÄasnÄ› zvolenou databázi"
+
+#: reindexdb.c:207
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "nelze reindexovat vÅ¡echny databáze a souÄasnÄ› systemový katalog"
+
+#: reindexdb.c:212
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "nelze reindexovat vybrané schema ve všech databázích"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "nelze reindexovat vybranou tabulku ve všech databázích"
+
+#: reindexdb.c:222
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "nelze reindexovat vybraný index ve všech databázích"
+
+#: reindexdb.c:235
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "nelze reindexovat vybraná schemata a souÄasnÄ› sytémové katalogy"
+
+#: reindexdb.c:240
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "nelze reindexovat vybranou tabulku a souÄasnÄ› sytémové katalogy"
+
+#: reindexdb.c:245
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "nelze reindexovat vybraný index a souÄasnÄ› sytémový katalog"
+
+#: reindexdb.c:251
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "pro reindexování systémových katalogů nelze použít více jobů"
+
+#: reindexdb.c:280
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "pro reindexování nelze použít více paralelních jobů"
+
+#: reindexdb.c:344 vacuumdb.c:413 vacuumdb.c:421 vacuumdb.c:428 vacuumdb.c:435
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "volbu \"%s\" nelze použít na serverech starších než PostgreSQL %s"
+
+#: reindexdb.c:384
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "katalogy nelze reindexovat v \"concurrent\" módu, přeskakuji."
+
+#: reindexdb.c:564
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "reindexace databáze \"%s\" selhala: %s"
+
+#: reindexdb.c:568
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexace indexu \"%s\" v databázi \"%s\" selhala: %s"
+
+#: reindexdb.c:572
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexace schematu \"%s\" v databázi \"%s\" selhala: %s"
+
+#: reindexdb.c:576
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "reindexování systémových katalogů v databázi \"%s\" selhalo: %s"
+
+#: reindexdb.c:580
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexace tabulky \"%s\" v databázi \"%s\" selhala: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindexace databáze \"%s\"\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s vytvoří PostgreSQL databázi.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindexovat všechny databáze\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindex concurrently\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DATABÃZE databáze k reindexaci\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=JMÉNO obnovit pouze vybraný index\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM použij tento poÄet paralelních jobů pro reindexování\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system reindexace systémového katalogu\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA reindexace pouze zadaných schemat\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABULKA reidexace pouze vybranou tabulku\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Pro detaily ÄtÄ›te popis SQL příkazu REINDEX.\n"
+
+#: scripts_parallel.c:232
+#, c-format
+msgid "too many jobs for this platform -- try %d"
+msgstr "příliš mnoho jobů pro tuto platformu -- zkuste %d"
+
+#: vacuumdb.c:192
+#, c-format
+msgid "parallel vacuum degree must be a non-negative integer"
+msgstr "parallel vacuum degree musí být nezáporné celé Äíslo"
+
+#: vacuumdb.c:212
+#, c-format
+msgid "minimum transaction ID age must be at least 1"
+msgstr "minimální stáří transaction ID musí být alespoň 1"
+
+#: vacuumdb.c:220
+#, c-format
+msgid "minimum multixact ID age must be at least 1"
+msgstr "minimální stáří multixact ID musí být alespoň 1"
+
+#: vacuumdb.c:252 vacuumdb.c:258 vacuumdb.c:264 vacuumdb.c:276
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "při provádění jen analyze nelze použít volbu \"%s\""
+
+#: vacuumdb.c:282
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "při provádění full vacuum nelze použít volbu \"%s\""
+
+#: vacuumdb.c:305
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "nelze provádět vacuum všech databází a zároveň specifikovat jen jednu"
+
+#: vacuumdb.c:310
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "nelze provést vacuum specifické tabulky (tabulek) ve všech databázích"
+
+#: vacuumdb.c:400
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generuji minimální statistiky optimizéru (1 cíl)"
+
+#: vacuumdb.c:401
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generuji minimální statistiky optimizéru (1 cílů)"
+
+#: vacuumdb.c:402
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generuji výchozí (plné) statistiky optimizéru"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: zpracovávám databázi \"%s\" : %s\n"
+
+#: vacuumdb.c:453
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: provádí se VACUUM databáze \"%s\"\n"
+
+#: vacuumdb.c:899
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "provádění VACUUM tabulky \"%s\" v databázi \"%s\" selhalo: %s"
+
+#: vacuumdb.c:902
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "provádění VACUUM databáze \"%s\" selhalo: %s"
+
+#: vacuumdb.c:910
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s proÄiÅ¡Å¥uje a analyzuje PostgreSQL databázi.\n"
+"\n"
+
+#: vacuumdb.c:914
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all provést VACUUM všech databází\n"
+
+#: vacuumdb.c:915
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DATABÃZE jméno databáze k provedení příkazu VACUUM\n"
+
+#: vacuumdb.c:916
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping vypne veškeré přeskakování stránek\n"
+
+#: vacuumdb.c:917
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo ukázat příkazy posílané na server\n"
+
+#: vacuumdb.c:918
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full provést plné (FULL) VACUUM\n"
+
+#: vacuumdb.c:919
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze zmrazí transakÄní informace záznamů\n"
+
+#: vacuumdb.c:920
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM použij tento poÄet paralelních jobů pro vacuum\n"
+
+#: vacuumdb.c:921
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE minimální stáří multixact ID tabulek pro vacuum\n"
+
+#: vacuumdb.c:922
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE minimání stáří transaction ID pro vacuum\n"
+
+#: vacuumdb.c:923
+#, c-format
+msgid " -P, --parallel=PARALLEL_DEGREE use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_DEGREE použij tento poÄet pracovních procesů pro vacuum, pokud je to možné\n"
+
+#: vacuumdb.c:924
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet tichý mód\n"
+
+#: vacuumdb.c:925
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked pÅ™eskoÄí relace které nemohou být ihned zamknuty\n"
+
+#: vacuumdb.c:926
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABULKA[(SLOUPCE)]' provést VACUUM pouze u specifikované tabulky\n"
+
+#: vacuumdb.c:927
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose vypisovat více informací\n"
+
+#: vacuumdb.c:928
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ukáže informace o verzi a skonÄí\n"
+
+#: vacuumdb.c:929
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aktualizace statistik optimalizéru\n"
+
+#: vacuumdb.c:930
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only pouze aktualizaze statistik optimalizéru; bez vacuum\n"
+
+#: vacuumdb.c:931
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages pouze aktualizuje statistiky optimizéru, v několika\n"
+" fázích pro rychlejší výsledky; bez vacuum\n"
+
+#: vacuumdb.c:933
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ukáže tento text a skonÄí\n"
+
+#: vacuumdb.c:941
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Pro detaily ÄtÄ›te popis SQL příkazu VACUUM.\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: dotaz selhal: %s"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: dotaz byl: %s\n"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s: dotaz vrátil %d řádek namísto jedné: %s\n"
+#~ msgstr[1] "%s: dotaz vrátil %d řádky namísto jedné: %s\n"
+#~ msgstr[2] "%s: dotaz vrátil %d řádek namísto jedné: %s\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr "%s: vyžadováno příliš mnoho paralelních jobů (maximum: %d)\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Je-li použit jeden z parametrů -d, -D, -r, -R, -s, -S, a jméno role\n"
+#~ "není zadáno, budete dotázán/a interaktivně.\n"
+
+#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n"
+#~ msgstr "%s: stále je %s funkcí definováno v jazyce \"%s\"; jazyk nebyl odstraněn.\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version ukáže informace o verzi a skonÄí\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help ukáže tento text a skonÄí\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: nedostatek paměti\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr "%s: při provádění jen analyze nelze použít volbu \"freeze\"\n"
+
+#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr " -d, --dbname=DATABÃZE databáze, ze které bude jazyk odstranÄ›n\n"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s odstraňuje procedurální jazyk z databáze.\n"
+#~ "\n"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s: odstraňování jazyka selhalo: %s"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s: jazyk \"%s\" není v databázi \"%s\" instalován\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted uložit heslo v otevřeném tvaru\n"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted uložit heslo v zašifrované podobě\n"
+
+#~ msgid " -l, --list show a list of currently installed languages\n"
+#~ msgstr " -l, --list ukáže seznam již nainstalovaných jazyků\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr " -d, --dbname=DATABÃZE databáze do které bude jazyk instalován\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [PŘEPÃNAÄŒ]... JAZYK [DATABÃZE]\n"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s instaluje procedurální jazyk do PostgreSQL databáze.\n"
+#~ "\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s: instalace jazyka selhala: %s"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s: jazyk \"%s\" je již v databázi \"%s\" instalován\n"
+
+#~ msgid "%s: missing required argument language name\n"
+#~ msgstr "%s: chybí povinný parametr jméno jazyka\n"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Procedurální jazyky"
+
+#~ msgid "Trusted?"
+#~ msgstr "Důvěryhodný?"
+
+#~ msgid "yes"
+#~ msgstr "ano"
+
+#~ msgid "no"
+#~ msgstr "ne"
+
+#~ msgid "Name"
+#~ msgstr "Jméno"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: nelze získat aktuální uživatelské jméno: %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: nelze získat informace o aktuálním uživateli: %s\n"
+
+#~ msgid "reindexing of system catalogs failed: %s"
+#~ msgstr "reindexace systémového katalogu selhala: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
diff --git a/src/bin/scripts/po/de.po b/src/bin/scripts/po/de.po
new file mode 100644
index 0000000..3e0003d
--- /dev/null
+++ b/src/bin/scripts/po/de.po
@@ -0,0 +1,1304 @@
+# German message translation file for "scripts".
+# Peter Eisentraut <peter@eisentraut.org>, 2003 - 2023.
+#
+# Use these quotes: »%s«
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 13:19+0000\n"
+"PO-Revision-Date: 2023-11-03 10:50-0400\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "Speicher aufgebraucht\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "Benutzer existiert nicht"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Abbruchsanforderung gesendet\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Konnte Abbruchsanforderung nicht senden: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Passwort: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: ../../fe_utils/parallel_slot.c:317
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "zu viele Jobs für diese Plattform: %d"
+
+#: ../../fe_utils/parallel_slot.c:326
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "Socket-Dateideskriptor außerhalb des gültigen Bereichs für select(): %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Versuchen Sie es mit weniger Jobs."
+
+#: ../../fe_utils/parallel_slot.c:553
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "Verarbeitung der Datenbank »%s« fehlgeschlagen: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Zeile)"
+msgstr[1] "(%lu Zeilen)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Unterbrochen\n"
+
+#: ../../fe_utils/print.c:3218
+#, 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:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ungültiges Ausgabeformat (interner Fehler): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "Anfrage fehlgeschlagen: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Anfrage war: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig clustern"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken clustern"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "Clustern der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "Clustern der Datenbank »%s« fehlgeschlagen: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: clustere Datenbank »%s«\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s clustert alle vorher geclusterten Tabellen in einer Datenbank.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all clustere alle Datenbanken\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME zu clusternde Datenbank\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, 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"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet unterdrücke alle Mitteilungen\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELLE clustere nur bestimmte Tabelle(n)\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Verbindungsoptionen:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, 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:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password Passwortfrage erzwingen\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Für weitere Informationen lesen Sie bitte die Beschreibung des\n"
+"SQL-Befehls CLUSTER.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "Anfrage ergab %d Zeile anstatt einer: %s"
+msgstr[1] "Anfrage ergab %d Zeilen anstatt einer: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "j"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Bitte antworten Sie »%s« oder »%s«.\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "»%s« ist kein gültiger Kodierungsname"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "Erzeugen der Datenbank ist fehlgeschlagen: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "Erzeugen des Kommentars ist fehlgeschlagen (Datenbank wurde erzeugt): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s erzeugt eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPTION]... [DBNAME] [BESCHREIBUNG]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE Standard-Tablespace der Datenbank\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, 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:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KODIERUNG Kodierung für die Datenbank\n"
+
+#: createdb.c:294
+#, 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:295
+#, 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:296
+#, 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:297
+#, 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:298
+#, 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:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" Locale-Provider für Standardsortierfolge der Datenbank\n"
+
+#: createdb.c:301
+#, 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:302
+#, 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:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE zu kopierende Template-Datenbank\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, 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:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password niemals nach Passwort fragen\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password Passwortfrage erzwingen\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Wenn nichts anderes angegeben ist, dann wird eine Datenbank mit dem Namen\n"
+"des aktuellen Benutzers erzeugt.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Geben Sie den Namen der neuen Rolle ein: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Geben Sie das Passwort der neuen Rolle ein: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Geben Sie es noch einmal ein: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Passwörter stimmten nicht überein.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "Soll die neue Rolle ein Superuser sein?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Soll die neue Rolle Datenbanken erzeugen dürfen?"
+
+#: createuser.c:268
+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
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "Passwortverschlüsselung ist fehlgeschlagen: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "Erzeugen der neuen Rolle fehlgeschlagen: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s erzeugt eine neue PostgreSQL-Rolle.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPTION]... [ROLLENNAME]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --with-admin=ROLLE ROLLE wird Mitglied der neuen Rolle mit\n"
+" Admin-Option\n"
+
+#: createuser.c:420
+#, 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
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb Rolle kann neue Datenbanken erzeugen\n"
+
+#: createuser.c:422
+#, 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
+#, 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
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLLE (gleich --member-of, veraltet)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit Rolle erbt alle Privilegien von Rollen, deren\n"
+" Mitglied sie ist (Voreinstellung)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit Rolle erbt keine Privilegien\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login Rolle kann sich anmelden (Voreinstellung)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login Rolle kann sich nicht anmelden\n"
+
+#: createuser.c:431
+#, 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
+#, 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
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole Rolle kann neue Rollen erzeugen\n"
+
+#: createuser.c:434
+#, 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
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser Rolle wird Superuser\n"
+
+#: createuser.c:436
+#, 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
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIMESTAMP\n"
+" Ablaufdatum und -zeit des Passworts der Rolle\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive nach fehlenden Rollennamen und -attributen fragen\n"
+" anstatt Vorgabewerte zu nehmen\n"
+
+#: createuser.c:442
+#, 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
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls Rolle kann Policy für Sicherheit auf Zeilenebene (RLS)\n"
+" nicht umgehen (Voreinstellung)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication Rolle kann Replikation einleiten\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication Rolle kann Replikation nicht einleiten (Voreinstellung)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=NAME Datenbankbenutzername für die Verbindung\n"
+" (nicht der Name des neuen Benutzers)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "Datenbankname als Argument fehlt"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Datenbank »%s« wird unwiderruflich gelöscht werden.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Sind Sie sich sicher?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "Löschen der Datenbank fehlgeschlagen: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s löscht eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPTION]... DBNAME\n"
+
+#: dropdb.c:176
+#, 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
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive frage nach, bevor irgendetwas gelöscht wird\n"
+
+#: dropdb.c:179
+#, 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"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Geben Sie den Namen der zu löschenden Rolle ein: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "Rollenname als Argument fehlt"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Rolle »%s« wird unwiderruflich gelöscht werden.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "Löschen der Rolle »%s« fehlgeschlagen: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s löscht eine PostgreSQL-Rolle.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive nachfragen, bevor irgendetwas gelöscht wird, und\n"
+" nach Rollennamen fragen, wenn nicht angegeben\n"
+
+#: dropuser.c:177
+#, 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
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=NAME Datenbankbenutzername für die Verbindung\n"
+" (nicht der Name des zu löschenden Benutzers)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "konnte Standardoptionen nicht ermitteln"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "Verbindungen werden angenommen\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "Verbindungen werden abgelehnt\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "keine Antwort\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "kein Verbindungsversuch\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "unbekannt\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s führt eine Verbindungsprüfung gegen eine PostgreSQL-Datenbank aus.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME Datenbankname\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet weniger ausgeben\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT Port des Datenbankservers\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEK Sekunden auf Verbindung warten, 0 schaltet aus (Vorgabe: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAME Datenbankbenutzername\n"
+
+#: reindexdb.c:209
+#, 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:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "kann nicht alle Datenbanken und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "kann nicht bestimmte Schemas in allen Datenbanken reindizieren"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken reindizieren"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "kann nicht bestimmte Indexe in allen Datenbanken reindizieren"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "kann nicht bestimmte Schemas und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "kann nicht bestimmte Tabelle(n) und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "kann nicht bestimmte Indexe und Systemkataloge gleichzeitig reindizieren"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "kann nicht mehrere Jobs verwenden, um Systemkataloge zu reindizieren"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "kann nicht mehrere Jobs verwenden, um Indexe zu reindizieren"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 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:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "Reindizieren der Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "Reindizieren des Index »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "Reindizieren des Schemas »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "Reindizieren der Systemkataloge in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "Reindizieren der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindiziere Datenbank »%s«\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s reindiziert eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all alle Datenbanken reindizieren\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently nebenläufig reindizieren\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME zu reindizierende Datenbank\n"
+
+#: reindexdb.c:757
+#, 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:758
+#, 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:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet unterdrücke alle Mitteilungen\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system nur Systemkataloge reindizieren\n"
+
+#: reindexdb.c:761
+#, 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:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELLE nur bestimmte Tabelle(n) reindizieren\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE Tablespace wo Indexe neu gebaut werden\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Für weitere Informationen lesen Sie bitte die Beschreibung des\n"
+"SQL-Befehls REINDEX.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "kann Option »%s« nicht verwenden, wenn nur Analyze durchgeführt wird"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "kann Option »%s« nicht verwenden, wenn volles Vacuum durchgeführt wird"
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "kann Option »%s« nicht mit der Option »%s« verwenden"
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig vacuumen"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken vacuumen"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "kann nicht bestimmte Schemas in allen Datenbanken vacuumen"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "kann nicht bestimmte Schemas in allen Datenbanken ausschließen"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "kann nicht alle Tabellen in Schemas und bestimmte Tabellen gleichzeitig vacuumen"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "kann nicht bestimmte Tabelle(n) vacuumen und gleichzeitig Schemas ausschließen"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "kann nicht alle Tabellen in Schemas vacuumen und gleichzeitig Schemas ausschließen"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "Erzeuge volle Optimierer-Statistiken"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: bearbeite Datenbank »%s«: %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: führe Vacuum in Datenbank »%s« aus\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "Vacuum der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "Vacuum der Datenbank »%s« fehlgeschlagen: %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s säubert und analysiert eine PostgreSQL-Datenbank.\n"
+"\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all führe Vacuum in allen Datenbanken aus\n"
+
+#: vacuumdb.c:1160
+#, 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:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME führe Vacuum in dieser Datenbank aus\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping Page-Skipping-Verhalten abschalten\n"
+
+#: vacuumdb.c:1163
+#, 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:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full führe volles Vacuum durch\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze Zeilentransaktionsinformationen einfrieren\n"
+
+#: vacuumdb.c:1166
+#, 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:1167
+#, 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:1168
+#, 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:1169
+#, 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:1170
+#, 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:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main die Hauptrelation überspringen\n"
+
+#: vacuumdb.c:1172
+#, 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:1173
+#, 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:1174
+#, 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:1175
+#, 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:1176
+#, 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:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet unterdrücke alle Mitteilungen\n"
+
+#: vacuumdb.c:1178
+#, 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:1179
+#, 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:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose erzeuge viele Meldungen\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aktualisiere Statistiken für den Optimierer\n"
+
+#: vacuumdb.c:1183
+#, 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:1184
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages aktualisiere nur Statistiken für den Optimierer,\n"
+" in mehreren Phasen für schnellere Ergebnisse;\n"
+" kein Vacuum\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Für weitere Information lesen Sie bitte die Beschreibung des\n"
+"SQL-Befehls VACUUM.\n"
diff --git a/src/bin/scripts/po/el.po b/src/bin/scripts/po/el.po
new file mode 100644
index 0000000..321de27
--- /dev/null
+++ b/src/bin/scripts/po/el.po
@@ -0,0 +1,1286 @@
+# Greek message translation file for pgscripts
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pgscripts (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-14 23:19+0000\n"
+"PO-Revision-Date: 2023-08-15 16:06+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "Ï€Ïοειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέÏεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "έλλειψη μνήμης\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "δεν ήταν δυνατή η αναζήτηση ενεÏγής ταυτότητας χÏήστη %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ο χÏήστης δεν υπάÏχει"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Αίτηση ακÏÏωσης εστάλη\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακÏÏωσης: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Κωδικός Ï€Ïόσβασης: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "δεν ήταν δυνατή η σÏνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:299
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "πάÏα πολλές εÏγασίες για την παÏοÏσα πλατφόÏμα"
+
+#: ../../fe_utils/parallel_slot.c:520
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "η επεξεÏγασία της βάσης δεδομένων «%s» απέτυχε: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu σειÏά)"
+msgstr[1] "(%lu σειÏές)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Διακόπηκε\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη κεφαλίδας σε πεÏιεχόμενο πίνακα: υπέÏβαση του πλήθους στηλών %d.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη ÎºÎµÎ»Î¹Î¿Ï ÏƒÎµ πεÏιεχόμενο πίνακα: υπέÏβαση του ÏƒÏ…Î½Î¿Î»Î¹ÎºÎ¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï ÎºÎµÎ»Î¹ÏŽÎ½ %d.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "μη έγκυÏη μοÏφή εξόδου (εσωτεÏικό σφάλμα): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "το εÏώτημα απέτυχε: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Το εÏώτημα ήταν: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάÏα πολλοί παÏαμέτÏοι εισόδου από την γÏαμμή εντολών (ο Ï€Ïώτη είναι η «%s»)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "δεν είναι δυνατή η ομαδοποίηση όλων των βάσεων δεδομένων και μιας συγκεκÏιμένης ταυτόχÏονα"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "δεν είναι δυνατή η ομαδοποίηση συγκεκÏιμένων πινάκων σε όλες τις βάσεις δεδομένων"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "η ομαδοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "η ομαδοποίηση της βάσης δεδομένων «%s» απέτυχε: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: ομαδοποιείται η βάση δεδομένων «%s»\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s: ομαδοποιεί όλους του Ï€ÏοηγοÏμενα ομαδοποιημένους πίνακες σε μία βάση δεδομένων\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1127
+#, c-format
+msgid "Usage:\n"
+msgstr "ΧÏήση:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1128
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1129
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all ομαδοποίησε όλες τις βάσεις δεδομένων\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για ομαδοποίηση\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE να ομαδοποιήσεις μόνο συγκεκÏιμένους πίνακες\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Επιλογές σÏνδεσης:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1161
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1164
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήÏησης\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Διαβάστε την πεÏιγÏαφή της SQL εντολής CLUSTER για λεπτομέÏειες.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1166
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1167
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αÏχική σελίδα: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "το εÏώτημα επέστÏεψε %d σειÏά αντί μίας: %s"
+msgstr[1] "το εÏώτημα επέστÏεψε %d σειÏές αντί μίας: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "ΠαÏακαλώ απαντήστε «%s» ή «%s».\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "«%s» δεν είναι έγκυÏο όνομα κωδικοποίησης"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "η δημιουÏγία βάσης δεδομένων απέτυχε: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "η δημιουÏγία σχολίων απέτυχε (δημιουÏγήθηκε βάση δεδομένων): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s δημιουÏγεί μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME] [ΠΕΡΙΓΡΑΦΗ]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE Ï€Ïοεπιλεγμένος πινακοχώÏος για τη βάση δεδομένων\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING κωδικοποίηση για την βάση δεδομένων\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE Ïυθμίσεις εντοπιότητας για τη βάση δεδομένων\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE ÏÏθμιση LC_COLLATE για την βάση δεδομένων\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-collate=LOCALE ÏÏθμιση LC_CTYPE για την βάση δεδομένων\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE ICU Ïυθμίσεις εντοπιότητας για τη βάση δεδομένων\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=RULES ICU Ïυθμίσεις κανόνων για τη βάση δεδομένων\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" πάÏοχος εντοπιότητας για την Ï€Ïοεπιλεγμένη συÏÏαφή της βάσης\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER όνομα χÏήστη που θα κατέχει την νέα βάση δεδομένων\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGY δημιουÏγία στÏατηγικής wal_log βάσης δεδομένων ή flle_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE Ï€Ïωτότυπη βάση δεδομένων για αντιγÏαφή\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης και, στη συνέχεια, έξοδος\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήÏησης\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Από Ï€Ïοεπιλογή, δημιουÏγείται μια βάση δεδομένων με το ίδιο όνομα με τον Ï„Ïέχοντα χÏήστη.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Εισαγάγετε το όνομα του Ïόλου για να Ï€Ïοσθέσετε: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Εισαγάγετε κωδικό Ï€Ïόσβασης για νέο Ïόλο: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Εισάγετε ξανά: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Οι κωδικοί Ï€Ïόσβασης δεν είναι ίδιοι.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "Îα είναι ο νέος Ïόλος υπεÏχÏήστης;"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Îα επιτÏαπεί στον νέο Ïόλο η δημιουÏγία βάσεων δεδομένων;"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Îα επιτÏαπεί στον νέο Ïόλο να δημιουÏγήσει πεÏισσότεÏους νέους Ïόλους;"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "η κÏυπτογÏάφηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης απέτυχε: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "η δημιουÏγία νέου Ïόλου απέτυχε: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s δημιουÏγεί ένα νέο Ïόλο PostgreSQL.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [ROLENAME]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --with-admin=ROLE Ο Ρόλος θα είναι μέÏος του καινοÏÏιου Ïόλου με\n"
+" επιλογές διαχειÏιστή\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N ÏŒÏιο σÏνδεσης για το Ïόλο (Ï€Ïοεπιλογή: κανένα ÏŒÏιο)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb ο Ïόλος μποÏεί να δημιουÏγήσει νέες βάσεις δεδομένων\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb ο Ïόλος δεν μποÏεί να δημιουÏγήσει βάσεις δεδομένων (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROLE ο καινοÏÏιος Ïόλος να αποτελεί μέλος Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Ρόλου\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLE (το ίδιο όπως --member-of, παÏωχημένο)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit ο Ïόλος να κληÏονομεί τα Ï€Ïονόμια των Ïόλων των\n"
+" οποίων είναι μέλος τους (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit ο Ïόλος δεν κληÏονομεί Ï€Ïονόμια\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login ο Ïόλος μποÏεί να συνδεθεί (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login ο Ïόλος δεν μποÏεί να συνδεθεί\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROLE Ο Ïόλος να αποτελεί μέλος του καινοÏÏιου Ïόλου\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt αντιστοιχίσε έναν κωδικό Ï€Ïόσβασης στο νέο Ïόλο\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole ο Ïόλος μποÏεί να δημιουÏγεί νέους Ïόλους\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole ο Ïόλος δεν μποÏεί να δημιουÏγεί νέους Ïόλους (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser ο Ïόλος θα είναι υπεÏχÏήστης\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser ο Ïόλος δεν θα είναι υπεÏχÏήστης (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIMESTAMP\n"
+" ημεÏομηνία και ÏŽÏα για την εκπνοή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης του Ïόλου\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive να Ï€ÏοτÏέψει για το όνομα Ïόλου και τα χαÏακτηÏιστικά αντί\n"
+" να χÏησιμοποιήσει Ï€Ïοεπιλογές\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls ο Ïόλος μποÏεί να παÏακάμψει την πολιτική ασφάλειας επιπέδου σειÏάς (RLS)\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls ο Ïόλος δεν μποÏεί να παÏακάμψει την πολιτική ασφάλειας\n"
+" επιπέδου σειÏάς (RLS) (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication ο Ïόλος μποÏεί να εκκινήσει αναπαÏαγωγή\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication ο Ïόλος να μην μποÏεί να εκκινήσει αναπαÏαγωγή (Ï€Ïοεπιλογή)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη για να συνδεθεί ως (όχι αυτό που θα δημιουÏγηθεί)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "λείπει αναγκαία παÏάμετÏος ονόματος βάσης δεδομένων"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Η βάση δεδομένων «%s» θα αφαιÏεθεί οÏιστικά.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Είστε βέβαιος;"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "η αφαίÏεση της βάσης δεδομένων απέτυχε: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s αφαιÏεί μία βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force να Ï€Ïοσπαθήσει να τεÏματίσει άλλες συνδέσεις Ï€Ïιν την εγκατάληψη\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive να Ï€ÏοτÏέψει Ï€Ïιν να διαγÏάψει οτιδήποτε\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists να μην αναφέÏει σφάλμα εάν η βάση δεδομένων δεν υπάÏχει\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Εισαγάγετε το όνομα του Ïόλου για να αποÏÏίψετε: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "λείπει η απαιτοÏμενη παÏάμετÏος ονόματος Ïόλου"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Ο Ïόλος «%s» θα αφαιÏεθεί οÏιστικά.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "η αφαίÏεση του Ïόλου «%s» απέτυχε: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s αφαιÏεί ένα Ïόλο PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive να Ï€ÏοτÏέψει Ï€Ïιν να διαγÏάψει οτιδήποτε, και να Ï€ÏοτÏέψει για\n"
+" το όνομα του Ïόλου, εάν αυτό δεν έχει καθοÏιστεί\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists να μην αναφέÏει σφάλμα εάν ο χÏήστης δεν υπάÏχει\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί (όχι αυτό που θα αφαιÏέσει)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "δεν ήταν δυνατή η λήψη Ï€Ïοεπιλεγμένων Ïυθμίσεων"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "αποδέχεται συνδέσεις\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "αποÏÏίπτει συνδέσεις\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "καμία απάντηση\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "καμία Ï€Ïοσπάθεια\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "άγνωστο\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s εκτελεί ένα έλεγχο σÏνδεσης σε μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME ονομασία βάσης δεδομένων\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet εκτέλεσε σιωπηλά\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SECS πόσα δευτεÏόλεπτα να πεÏιμένει όταν Ï€Ïοσπαθεί να συνδεθεί,\n"
+" 0 το απενεÏγοποιεί (Ï€Ïοεπιλογή: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση όλων των βάσεων δεδομένων και μιας συγκεκÏιμένης ταυτόχÏονα"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση όλων των βάσεων δεδομένων και των καταλόγων συστήματος ταυτόχÏονα"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση συγκεκÏιμένων σχημάτων σε όλες τις βάσεις δεδομένων"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση συγκεκÏιμένων πινάκων σε όλες τις βάσεις δεδομένων"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση συγκεκÏιμένων ευÏετηÏίων σε όλες τις βάσεις δεδομένων"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση συγκεκÏιμένων σχημάτων και καταλόγων συστήματος ταυτόχÏονα"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση συγκεκÏιμένων πινάκων και καταλόγων συστήματος ταυτόχÏονα"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "δεν είναι δυνατή η επαναευÏετηÏιοποίηση συγκεκÏιμένων ευÏετηÏίων και καταλόγων συστήματος ταυτόχÏονα"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "δεν είναι δυνατή η χÏήση πολλαπλών εÏγασιών για την επαναευÏετηÏιοποίηση καταλόγων συστήματος"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "δεν είναι δυνατή η χÏήση πολλαπλών εÏγασιών για την επαναευÏετηÏιοποίηση ευÏετηÏίων"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523
+#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556
+#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» σε εκδόσεις διακομιστών παλαιότεÏες από την PostgreSQL %s"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "επαναευÏετηÏιοποίηση της βάσης δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "η επανενεξάγηση του ευÏετηÏίου «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "η επαναευÏετηÏιοποίηση του σχήματος «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "η επαναευÏετηÏιοποίηση καταλόγων συστήματος στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "η επαναευÏετηÏιοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: επαναευÏετηÏιοποίηση της βάσης δεδομένων «%s»\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s επαναευÏετηÏιοποιεί μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all επαναευÏετηÏιοποίηση όλων των βάσεων δεδομένων\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " -a, --all ταυτόχÏονη επαναευÏετηÏιοποίηση\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για επαναευÏετηÏιοποίηση\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX δημιοÏÏγησε συγκεκÏιμένο(ους) πίνακα(ες) μόνο\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM χÏησιμοποιήσε τόσες πολλές ταυτόχÏονες συνδέσεις με το διακομιστή\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system επαναευÏετηÏιοποίηση μόνο καταλόγων συστήματος\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA επαναευÏετηÏιοποίησε συγκεκÏιμένο(-α) σχήμα(-τα) μόνο\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE επαναευÏετηÏιοποίησε συγκεκÏιμένο(-ους) πίνακα(-ες) μόνο\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE πινακοχώÏος όπου επαναδημιουÏγοÏνται τα ευÏετήÏια\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Διαβάστε την πεÏιγÏαφή της SQL εντολής REINDEX για λεπτομέÏειες.\n"
+
+#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322
+#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» κατά την εκτέλεση μόνο της ανάλυσης"
+
+#: vacuumdb.c:343
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» κατά την εκτέλεση full vacuum"
+
+#: vacuumdb.c:349 vacuumdb.c:357
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» μαζί με την επιλογή«%s»"
+
+#: vacuumdb.c:428
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "δεν είναι δυνατό το vacuum σε όλες τις βάσεις δεδομένων και μια συγκεκÏιμένη ταυτόχÏονα"
+
+#: vacuumdb.c:432
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "δεν είναι δυνατό το vacuum συγκεκÏιμένων πινάκων σε όλες τις βάσεις δεδομένων"
+
+#: vacuumdb.c:436
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "δεν είναι δυνατό το vacuum συγκεκÏιμένων σχημάτων σε όλες τις βάσεις δεδομένων"
+
+#: vacuumdb.c:440
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "δεν είναι δυνατή να αποκλίσει συγκεκÏιμένα σχήματα σε όλες τις βάσεις δεδομένων"
+
+#: vacuumdb.c:444
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "δεν είναι δυνατό το vacuum όλων των πινάκων σε σχήμα(τα) και συγκεκÏιμένων πινάκων ταυτόχÏονα"
+
+#: vacuumdb.c:448
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "δεν είναι δυνατό το vacuum συγκεκÏιμένων πινάκων και καταλόγων συστήματος ταυτόχÏονα"
+
+#: vacuumdb.c:452
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "δεν είναι δυνατό το vacuum όλων των πινάκων σε σχήμα(τα) και η εξαίÏεση συγκεκÏιμένων σχημάτων ταυτόχÏονα"
+
+#: vacuumdb.c:496
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "ΔημιουÏγία ελάχιστων στατιστικών βελτιστοποιητή (1 στόχος)"
+
+#: vacuumdb.c:497
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "ΔημιουÏγία μεσαίων στατιστικών βελτιστοποιητή (10 στόχοι)"
+
+#: vacuumdb.c:498
+msgid "Generating default (full) optimizer statistics"
+msgstr "ΔημιουÏγία Ï€Ïοεπιλεγμένων (πλήÏων) στατιστικών βελτιστοποιητή"
+
+#: vacuumdb.c:577
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: επεξεÏγάζεται τη βάση δεδομένων «%s»: %s\n"
+
+#: vacuumdb.c:580
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: εκτελεί vacuum στη βάση δεδομένων «%s»\n"
+
+#: vacuumdb.c:1115
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "η εκτέλεση vacuum στον πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: vacuumdb.c:1118
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "η εκτέλεση vacuum στη βάση δεδομένων «%s» απέτυχε: %s"
+
+#: vacuumdb.c:1126
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s καθαÏίζει και αναλÏει μια βάση δεδομένων PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:1130
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all εκτέλεσε vacuum σε όλες τις βάσεις δεδομένων\n"
+
+#: vacuumdb.c:1131
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=SIZE μέγεθος δακτυλίου ενδιάμεσης μνήμης για vacuum\n"
+
+#: vacuumdb.c:1132
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME βάση δεδομένων για vacuum\n"
+
+#: vacuumdb.c:1133
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping απενεÏγοποιήστε κάθε συμπεÏιφοÏά παÏάλειψης σελίδας\n"
+
+#: vacuumdb.c:1134
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n"
+
+#: vacuumdb.c:1135
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full να εκτελέσει πλήÏες vacuum\n"
+
+#: vacuumdb.c:1136
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze πάγωσε τις πληÏοφοÏίες σειÏάς συναλλαγής\n"
+
+#: vacuumdb.c:1137
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup αφαιÏεί πάντα καταχωÏήσεις ευÏετηÏίου που οδηγοÏν σε νεκÏές πλειάδες\n"
+
+#: vacuumdb.c:1138
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM χÏησιμοποιήσε τόσες πολλές ταυτόχÏονες συνδέσεις με το διακομιστή\n"
+
+#: vacuumdb.c:1139
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE ελάχιστη ηλικία multixact ID πινάκων για vacuum\n"
+
+#: vacuumdb.c:1140
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE ελάχιστη ηλικία transaction ID πινάκων για vacuum\n"
+
+#: vacuumdb.c:1141
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup να μην αφαιÏέσει καταχωÏήσεις ευÏετηÏίου που οδηγοÏν σε νεκÏές πλειάδες\n"
+
+#: vacuumdb.c:1142
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main παÏάλειψε την κÏÏια σχέση\n"
+
+#: vacuumdb.c:1143
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast παÏάλειψε τον πίνακα TOAST που σχετίζεται με τον πίνακα που εκτελείται vacuum\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate να μην πεÏικόψει άδειες σελίδες από το τέλος του πίνακα\n"
+
+#: vacuumdb.c:1145
+#, c-format
+msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=PATTERN vacuum πίνακες μόνο για τα καθοÏισμένα σχήματα\n"
+
+#: vacuumdb.c:1146
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=PATTERN να μην κάνει vacuum πίνακες στα καθοÏισμένα σχήματα\n"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLEL_WORKERS χÏησιμοποίησε τόσους πολλοÏÏ‚ εÏγάτες παÏασκηνίου\n"
+" για την εκτέλεση vacuum, εάν αυτοί είναι διαθέσιμοι\n"
+
+#: vacuumdb.c:1148
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n"
+
+#: vacuumdb.c:1149
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked να παÏαλείψει σχέσεις που δεν μποÏοÏν να κλειδωθοÏν άμεσα\n"
+
+#: vacuumdb.c:1150
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' να εκτελέσει vacuum μόνο σε συγκεκÏιμένους πίνακες\n"
+
+#: vacuumdb.c:1151
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n"
+
+#: vacuumdb.c:1152
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: vacuumdb.c:1153
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze ενημέÏωσε τα στατιστικά του βελτιστοποιητή\n"
+
+#: vacuumdb.c:1154
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -z, --analyze μόνο ενημέÏωσε τα στατιστικά του βελτιστοποιητή· χωÏίς vacuum\n"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages ενημέÏωσε μόνο τα στατιστικά στοιχεία βελτιστοποίησης, σε πολλαπλά\n"
+" στάδια για ταχÏτεÏα αποτελέσματα· χωÏίς vacuum\n"
+
+#: vacuumdb.c:1157
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Διαβάστε την πεÏιγÏαφή της SQL εντολής VACUUM για λεπτομέÏειες.\n"
+
+#~ msgid "cannot reindex system catalogs concurrently, skipping all"
+#~ msgstr "δεν είναι δυνατή η ταυτόχÏονη επαναευÏετηÏιοποίηση καταλόγων συστήματος, παÏακάμπτονται όλοι"
+
+#~ msgid "fatal: "
+#~ msgstr "κÏίσιμο: "
+
+#~ msgid "invalid value for --connection-limit: %s"
+#~ msgstr "άκυÏη τιμή για --connection-limit: %s"
+
+#~ msgid "minimum multixact ID age must be at least 1"
+#~ msgstr "η ελάχιστη ηλικία multixact ID Ï€Ïέπει να είναι τουλάχιστον 1"
+
+#~ msgid "minimum transaction ID age must be at least 1"
+#~ msgstr "η ελάχιστη ηλικία transaction ID Ï€Ïέπει να είναι τουλάχιστον 1"
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "ο αÏιθμός παÏάλληλων εÏγασιών Ï€Ïέπει να είναι τουλάχιστον 1"
+
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "μόνο ένα από τα --locale και --lc-collate μποÏεί να καθοÏιστεί"
+
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "μόνο ένα από τα --locale και --lc-ctype μποÏεί να καθοÏιστεί"
+
+#~ msgid "parallel workers for vacuum must be greater than or equal to zero"
+#~ msgstr "οι παÏάλληλοι εÏγάτες για vacuum Ï€Ïέπει να είναι πεÏισσότεÏοι ή ίσοι με μηδέν"
diff --git a/src/bin/scripts/po/es.po b/src/bin/scripts/po/es.po
new file mode 100644
index 0000000..82ffa20
--- /dev/null
+++ b/src/bin/scripts/po/es.po
@@ -0,0 +1,1283 @@
+# pgscripts spanish translation
+#
+# Copyright (c) 2003-2021, PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Alvaro Herrera, <alvherre@alvh.no-ip.org>, 2003-2013
+# Jaime Casanova, <systemguards@gmail.com>, 2005
+# Carlos Chapi <carlos.chapi@2ndquadrant.com>, 2013-2014, 2021
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:20+0000\n"
+"PO-Revision-Date: 2023-10-03 16:25+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria agotada\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "no se puede duplicar un puntero nulo (error interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "el usuario no existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Petición de cancelación enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "No se pudo enviar el paquete de cancelación: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "no se pudo conectar a la base de datos %s: memoria agotada"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:299
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "demasiados procesos para esta plataforma"
+
+#: ../../fe_utils/parallel_slot.c:520
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "falló el procesamiento de la base de datos «%s»: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu fila)"
+msgstr[1] "(%lu filas)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrumpido\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de salida no válido (error interno): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "la consulta falló: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "La consulta era: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "no se puede reordenar todas las bases de datos y una de ellas en particular simultáneamente"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "no es posible reordenar tablas específicas en todas las bases de datos"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "falló el reordenamiento de la tabla «%s» en la base de datos «%s»: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "falló el reordenamiento de la base de datos «%s»: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: reordenando la base de datos «%s»\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s reordena todas las tablas previamente reordenadas\n"
+"en una base de datos.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all reordenar todas las bases de datos\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=BASE base de datos a reordenar\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes a medida que se ejecutan\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet no escribir ningún mensaje\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLA reordenar sólo esta(s) tabla(s)\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opciones de conexión:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forzar la petición de contraseña\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Lea la descripción de la orden CLUSTER de SQL para obtener mayores detalles.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la consulta retornó %d fila en lugar de una: %s"
+msgstr[1] "la consulta retornó %d filas en lugar de una: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "s"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Por favor conteste «%s» o «%s».\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "«%s» no es un nombre válido de codificación"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "falló la creación de la base de datos: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "falló la creación del comentario (la base de datos fue creada): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s crea una base de datos PostgreSQL.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPCIÓN]... [NOMBRE] [DESCRIPCIÓN]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TBLSPC tablespace por omisión de la base de datos\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=CODIF codificación para la base de datos\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE configuración regional para la base de datos\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE configuración LC_COLLATE para la base de datos\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE configuración LC_CTYPE para la base de datos\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE configuración regional ICU para la base de datos\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=REGLAS configuración de reglas ICU para la base de datos\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" proveedor de configuración regional para el ordenamiento\n"
+" por omisión de las bases de datos\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=DUEÑO usuario que será dueño de la base de datos\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr ""
+" -S, --strategy=ESTRATEGIA estrategia de creación de bases de datos\n"
+" wal_log o file_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=PATRÓN base de datos patrón a copiar\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pedir contraseña\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forzar la petición de contraseña\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Si no se especifica, se creará una base de datos con el mismo nombre que\n"
+"el usuario actual.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Ingrese el nombre del rol a agregar: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Ingrese la contraseña para el nuevo rol: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Ingrésela nuevamente: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Las contraseñas no coinciden.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "¿Será el nuevo rol un superusuario?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "¿Debe permitírsele al rol la creación de bases de datos?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "¿Debe permitírsele al rol la creación de otros roles?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "el cifrado de la contraseña falló: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "falló la creación del nuevo rol: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s crea un nuevo rol de PostgreSQL.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPCIÓN]... [ROL]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr " -a, --with-admin=ROL ROL será miembro del nuevo rol con “opción de adminâ€\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N límite de conexiones para el rol\n"
+" (predeterminado: sin límite)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb el rol podrá crear bases de datos\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb el rol no podrá crear bases de datos (predeterm.)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROL el nuevo rol será un miembro de ROL\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROL (lo mismo que --member-of; obsoleto)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit el rol heredará los privilegios de los roles de\n"
+" los cuales es miembro (predeterminado)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rol no heredará privilegios\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login el rol podrá conectarse (predeterminado)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login el rol no podrá conectarse\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROL ROL será miembro del nuevo rol\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt asignar una contraseña al nuevo rol\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole el rol podrá crear otros roles\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole el rol no podrá crear otros roles (predeterminado)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser el rol será un superusuario\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser el rol no será un superusuario (predeterminado)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIEMPO\n"
+" fecha/hora de expiración de contraseña para el rol\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive preguntar los nombres y atributos de rol faltantes\n"
+" en lugar de asumir los valores por omisión\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr ""
+" --bypassrls el rol puede sobrepasar la política de\n"
+" seguridad de registros (RLS)\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls el rol no puede sobrepasar la política de seguridad\n"
+" de registros (por omisión)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication el rol podrá iniciar replicación\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication el rol no puede iniciar replicación (por omisión)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=NOMBRE nombre de usuario con el cual conectarse\n"
+" (no el usuario a crear)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "falta el nombre de base de datos requerido"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "La base de datos «%s» será eliminada permanentemente.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "falló la eliminación de la base de datos: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s elimina una base de datos de PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPCIÓN]... BASE-DE-DATOS\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force intentar cancelar otras conexiones antes de borrar\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive preguntar antes de eliminar\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists no reportar error si la base de datos no existe\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Ingrese el nombre del rol a eliminar: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "falta el nombre de rol requerido"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "El rol «%s» será eliminado permanentemente.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "falló la eliminación del rol «%s»: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s elimina un rol de PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive preguntar antes de eliminar cualquier cosa, y\n"
+" preguntar el nombre de rol si no se especifica\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists no reportar error si el usuario no existe\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=USUARIO nombre del usuario con el cual conectarse\n"
+" (no el usuario a eliminar)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "no se pudo extraer las opciones por omisión"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "aceptando conexiones\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "rechazando conexiones\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "sin respuesta\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "sin intentos\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "desconocido\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s emite una prueba de conexión a una base de datos PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCIÓN]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME nombre de la base de datos\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet ejecutar de forma silenciosa\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PUERTO puerto del servidor\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SEGUNDOS segundos a esperar al intentar conectarse\n"
+" 0 lo deshabilita (por omisión: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "no se puede reindexar todas las bases de datos y una de ellas en particular simultáneamente"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "no se puede reindexar todas las bases de datos y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "no es posible reindexar esquemas específicos en todas las bases de datos"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "no es posible reindexar tablas específicas en todas las bases de datos"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "no es posible reindexar índices específicos en todas las bases de datos"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "no es posible reindexar esquemas específicos y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "no es posible reindexar tablas específicas y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "no es posible reindexar índices específicos y los catálogos del sistema simultáneamente"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "no se puede usar múltiples procesos para reindexar índices de sistema"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "no se puede usar múltiples procesos para reindexar índices"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "no se puede usar la opción «%s» cuando con versiones más antiguas que PostgreSQL %s"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "falló la reindexación de la base de datos «%s»: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la reindexación del índice «%s» en la base de datos «%s»: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la reindexación del esquema «%s» en la base de datos «%s»: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "falló la reindexación de los catálogos de sistema en la base de datos «%s»: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la reindexación de la tabla «%s» en la base de datos «%s»: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindexando la base de datos «%s»\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s reindexa una base de datos PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindexar todas las bases de datos\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindexar en modo concurrente\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=BASE-DATOS base de datos a reindexar\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=ÃNDICE recrear sólo este o estos índice(s)\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NÚM usar esta cantidad de conexiones concurrentes\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet no desplegar mensajes\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system sólo reindexar los catálogos del sistema\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=ESQUEMA reindexar sólo este o estos esquemas\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLA reindexar sólo esta(s) tabla(s)\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE tablespace donde se reconstruirán los índices\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Lea la descripción de la orden REINDEX de SQL para obtener mayores detalles.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "no se puede usar la opción «%s» cuando se está sólo actualizando estadísticas"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "no se puede usar la opción «%s» cuando se está ejecutando vacuum full"
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "no se puede usar la opción «%s» junto con la opción «%s»"
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "no se puede limpiar todas las bases de datos y una de ellas en particular simultáneamente"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "no es posible limpiar tablas específicas en todas las bases de datos"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "no es posible limpiar esquemas específicos en todas las bases de datos"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "no es posible excluir esquemas específicos en todas las bases de datos"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "no se puede limpiar todas las tablas en esquema(s) y tabla(s) específicas simultáneamente"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "no es posible limpiar tablas específicas y excluir esquema(s) simultáneamente"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "no se puede limpiar todas las tablas en esquema(s) y excluir esquema(s) simultáneamente"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generando estadísticas mínimas para el optimizador (tamaño = 1)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generando estadísticas medias para el optimizador (tamaño = 10)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generando estadísticas predeterminadas (completas) para el optimizador"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: procesando la base de datos «%s»: %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: limpiando la base de datos «%s»\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "falló la limpieza de la tabla «%s» en la base de datos «%s»: %s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "falló la limpieza de la base de datos «%s»: %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s limpia (VACUUM) y analiza una base de datos PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all limpia todas las bases de datos\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=SZ tamaño de anillo de búfers a usar para vacuum\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=BASE base de datos a limpiar\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping desactiva todo comportamiento de saltar páginas\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full usar «vacuum full»\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze usar «vacuum freeze»\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup siempre eliminar entradas de índice que apunten a tuplas muertas\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=EDAD_MXID edad de multixact ID mínima de tablas a limpiar\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=EDAD_XID edad de ID de transacción mínima de tablas a limpiar\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup no eliminar entradas de índice que apunten a tuplas muertas\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main omitir la relación principal\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast omitir la tabla TOAST asociada con la tabla a la que se hará vacuum\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate no truncar las páginas vacías al final de la tabla\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=ESQUEMA limpia sólo tablas en el/los esquemas especificados\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=ESQUEMA no limpia tablas en el/los esquemas especificados\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=NPROCS usar esta cantidad de procesos para vacuum, si están disponibles\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet no desplegar mensajes\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked ignorar relaciones que no pueden bloquearse inmediatamente\n"
+
+#: vacuumdb.c:1179
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr ""
+" -t, --table='TABLA[(COLUMNAS)]'\n"
+" limpiar sólo esta(s) tabla(s)\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose desplegar varios mensajes informativos\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze actualizar las estadísticas del optimizador\n"
+
+#: vacuumdb.c:1183
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr ""
+" -Z, --analyze-only sólo actualizar las estadísticas del optimizador;\n"
+" no hacer vacuum\n"
+
+#: vacuumdb.c:1184
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages sólo actualizar las estadísticas del optimizador,\n"
+" en múltiples etapas para resultados más rápidos;\n"
+" no hacer vacuum\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Lea la descripción de la orden VACUUM de SQL para obtener mayores detalles.\n"
diff --git a/src/bin/scripts/po/fr.po b/src/bin/scripts/po/fr.po
new file mode 100644
index 0000000..f17e176
--- /dev/null
+++ b/src/bin/scripts/po/fr.po
@@ -0,0 +1,1538 @@
+# LANGUAGE message translation file for pgscripts
+# Copyright (C) 2004-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pgscripts (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2004-2009.
+# Stéphane Schildknecht <stephane.schildknecht@dalibo.com>, 2009.
+# Guillaume Lelarge <guillaume@lelarge.info>, 2010-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-29 17:19+0000\n"
+"PO-Revision-Date: 2023-10-30 13:38+0100\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.4\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "mémoire épuisée\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utilisateur n'existe pas"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requête d'annulation envoyée\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "N'a pas pu envoyer la requête d'annulation : "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: ../../fe_utils/parallel_slot.c:317
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "trop de jobs pour cette plateforme : %d"
+
+#: ../../fe_utils/parallel_slot.c:326
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "descripteur de fichier socket hors d'échelle pour select() : %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Essayez moins de jobs."
+
+#: ../../fe_utils/parallel_slot.c:553
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "le traitement de la base de données « %s » a échoué : %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu ligne)"
+msgstr[1] "(%lu lignes)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompu\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n"
+"%d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n"
+"cellules %d est dépassé.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "format de sortie invalide (erreur interne) : %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "échec de la requête : %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "La requête était : %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "ne peut pas réorganiser à la fois toutes les bases de données et une base spécifique via la commande CLUSTER"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "ne peut pas réorganiser la(les) table(s) spécifique(s) dans toutes les bases de données"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "la réorganisation de la table « %s » de la base de données « %s » avec la commande CLUSTER a échoué : %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "la réorganisation de la base de données « %s » via la commande CLUSTER a échoué : %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s : réorganisation de la base de données « %s » via la commande CLUSTER\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s réorganise toutes les tables précédemment réorganisées au sein d'une\n"
+"base de données via la commande CLUSTER.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [BASE]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all réorganise toutes les bases de données\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=BASE réorganise la base de données spécifiée\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet n'écrit aucun message\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE réorganise uniquement la table spécifiée\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Options de connexion :\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password empêche la demande d'un mot de passe\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password force la demande d'un mot de passe\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE indique une autre base par défaut\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Lire la description de la commande SQL CLUSTER pour de plus amples détails.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s"
+msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "o"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Merci de répondre « %s » ou « %s ».\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "« %s » n'est pas un nom d'encodage valide"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "la création de la base de données a échoué : %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "l'ajout du commentaire a échoué (la base de données a été créée) : %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s crée une base de données PostgreSQL.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPTION]... [BASE] [DESCRIPTION]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE tablespace par défaut de la base de données\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODAGE encodage de la base de données\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE paramètre de la locale pour la base de données\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE paramètre LC_COLLATE pour la base de données\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE paramètre LC_CTYPE pour la base de données\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE paramètre de la locale ICU pour la base de données\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=RÈGLES configuration des règles ICU pour la base de données\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" fournisseur de locale pour la collation par défaut de la base de données\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr ""
+" -O, --owner=PROPRIÉTAIRE nom du propriétaire de la nouvelle base de\n"
+" données\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGIE stratégie de création de base (wal_log ou file_copy)\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=MODÈLE base de données modèle à copier\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données\n"
+" ou répertoire des sockets\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password empêche la demande d'un mot de passe\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password force la demande d'un mot de passe\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=BASE indique une autre base par défaut\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Par défaut, la base de donnée créée porte le nom de l'utilisateur courant.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Saisir le nom du rôle à ajouter : "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Saisir le mot de passe pour le nouveau rôle : "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Saisir le mot de passe à nouveau : "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Les mots de passe ne sont pas identiques.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "Le nouveau rôle est-il super-utilisateur ?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Le nouveau rôle est-il autorisé à créer des bases de données ?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Le nouveau rôle est-il autorisé à créer de nouveaux rôles ?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "échec du chiffrement du mot de passe : %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "la création du nouveau rôle a échoué : %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s crée un nouvel rôle PostgreSQL.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPTION]... [RÔLE]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr " -a, --with-admin=ROLE ROLE sera un membre du nouveau rôle avec l'option admin\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N nombre maximum de connexions pour le rôle (par\n"
+" défaut sans limite)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb le rôle peut créer des bases de données\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb le rôle ne peut pas créer de bases de données\n"
+" (par défaut)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROLE le nouveau rôle sera un membre de ROLE\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLE (identique à --member-of, obsolète)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit le rôle hérite des droits des rôles dont il est\n"
+" membre (par défaut)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit le rôle n'hérite pas des droits\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login le rôle peut se connecter (par défaut)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login le rôle ne peut pas se connecter\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROLE ROLE sera un membre du nouveau rôle\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt affecte un mot de passe au nouveau rôle\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole le rôle peut créer des rôles\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole le rôle ne peut pas créer de rôles (par défaut)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser le rôle est super-utilisateur\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr ""
+" -S, --no-superuser le rôle n'est pas super-utilisateur (par\n"
+" défaut)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIMESTAMP\n"
+" date et heure d'expiration du mot de passe pour le rôle\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive demande le nom du rôle et les attributs\n"
+" plutôt qu'utiliser des valeurs par défaut\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls le rôle peut contourner la politique de sécurité niveau ligne (RLS)\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls le rôle ne peut pas contourner la politique de sécurité niveau ligne (RLS)\n"
+" (par défaut)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr ""
+" --replication le rôle peut initier une connexion de\n"
+" réplication\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr ""
+" --no-replication le rôle ne peut pas initier de connexion de\n"
+" réplication (par défaut)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=UTILISATEUR nom de l'utilisateur pour la connexion (pas\n"
+" celui à créer)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "argument nom de la base de données requis mais manquant"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "La base de données « %s » sera définitivement supprimée.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Êtes-vous sûr ?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "la suppression de la base de données a échoué : %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s supprime une base de données PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPTION]... BASE\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr ""
+" -f, --force essaie d'arrêter les autres connexions avant de\n"
+" supprimer\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr ""
+" -i, --interactive demande confirmation avant de supprimer quoi\n"
+" que ce soit\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists ne renvoie pas d'erreur si la base\n"
+" n'existe pas\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Saisir le nom du rôle à supprimer : "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "argument nom du rôle requis mais manquant"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Le rôle « %s » sera définitivement supprimé.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "la suppression du rôle « %s » a échoué : %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s supprime un rôle PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive demande confirmation avant de supprimer quoi\n"
+" que ce soit, et demande le nom du rôle s'il\n"
+" n'est pas indiqué\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr ""
+" --if-exists ne renvoie pas d'erreur si l'utilisateur\n"
+" n'existe pas\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=UTILISATEUR nom de l'utilisateur pour la connexion (pas\n"
+" celui à supprimer)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "n'a pas pu récupérer les options par défaut"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "acceptation des connexions\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "rejet des connexions\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "pas de réponse\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "pas de tentative\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "inconnu\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s réalise un test de connexion à une base de données PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=BASE base de données\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet s'exécute sans affichage\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HÔTE hôte du serveur de bases de données ou\n"
+" répertoire des sockets\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT port du serveur de bases de données\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SECS durée en secondes à attendre lors d'une tentative\n"
+" de connexion ; 0 pour désactiver (défaut: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "ne peut pas réindexer toutes les bases de données et une base spécifique en même temps"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "ne peut pas réindexer toutes les bases de données et les catalogues système en même temps"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) dans toutes les bases de données"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) dans toutes les bases de données"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "ne peut pas réindexer un (des) index spécifique(s) dans toutes les bases de données"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) et les catalogues système en même temps"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) etles catalogues système en même temps"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "ne peut pas réindexer un (des) index spécifique(s) et les catalogues système en même temps"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les catalogues systèmes"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les index"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "ne peut utiliser l'option « %s » sur des versions serveurs plus anciennes que PostgreSQL %s"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "la réindexation de la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "la réindexation de l'index « %s » dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "la réindexation du schéma « %s » dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "la réindexation des catalogues systèmes dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "la réindexation de la table « %s » dans la base de données « %s » a échoué : %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s : réindexation de la base de données « %s »\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s réindexe une base de données PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all réindexe toutes les bases de données\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently réindexation en concurrence\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=BASE réindexe la base de données spécifiée\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX réindexe uniquement l'index spécifié\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n"
+" pour l'opération de réindexation\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet n'écrit aucun message\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system réindexe seulement les catalogues système\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHÉMA réindexe uniquement le schéma spécifié\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE réindexe uniquement la table spécifiée\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=TABLESPACE précise le tablespace où les index seront\n"
+" reconstruits\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Lire la description de la commande SQL REINDEX pour plus d'informations.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un ANALYZE seul"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un VACUUM FULL"
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "ne peut pas utiliser l'option « %s » lors de l'option « %s »"
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "ne peut pas exécuter VACUUM sur toutes les bases de données et sur une base spécifique en même temps"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "ne peut pas exécuter VACUUM sur une(des) table(s) spécifique(s) dans toutes les bases de données"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "ne peut pas exécuter VACUUM sur les schémas spécifiques dans toutes les bases de données"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "ne peut pas exclure des schémas dans toutes les bases de données"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "ne peut pas exécuter VACUUM sur toutes les tables des schémas et sur des tables spécifiques en même temps"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "ne peut pas exécuter VACUUM sur des tables spécifiques et exclure des schémas en même temps"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "ne peut pas exécuter VACUUM sur toutes les tables et exclure des schémas en même temps"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Génération de statistiques minimales pour l'optimiseur (une cible)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Génération de statistiques moyennes pour l'optimiseur (dix cibles)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "Génération de statistiques complètes pour l'optimiseur"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s : traitement de la base de données « %s » %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s : exécution de VACUUM sur la base de données « %s »\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "l'exécution de VACUUM sur la table « %s » dans la base de données « %s » a échoué : %s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "l'exécution de VACUUM sur la base de données « %s » a échoué : %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s nettoie et analyse une base de données PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all exécute VACUUM sur toutes les bases de données\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=TAILLE taille du buffer spécialisé pour VACUUM\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=BASE exécute VACUUM sur cette base de données\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping désactive le comportement page-skipping\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo affiche les commandes envoyées au serveur\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full exécute VACUUM en mode FULL\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze gèle les informations de transactions des\n"
+" lignes\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr ""
+" --force-index-cleanup supprime toujours les enregistrements dans\n"
+" l'index pointant vers des lignes mortes\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr ""
+" -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n"
+" pour le VACUUM\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE âge minimum des identifiants de\n"
+" multitransactions pour les tables à nettoyer\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE âge minimum des identifiants de transactions\n"
+" pour les tables à nettoyer\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr ""
+" --no-index-cleanup ne supprime pas les enregistrements dans\n"
+" l'index pointant vers des lignes mortes\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main ignore la relation principale\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr ""
+" --no-process-toast ignore la table TOAST associée à la table à\n"
+" traiter\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr ""
+" --no-truncate ne supprime pas les pages vides à la fin de\n"
+" la table\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=MOTIF exécute VACUUM uniquement sur les tables des schémas indiqués\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MOTIF n'exécute pas VACUUM sur les tables des schémas indiqués\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=NOMBRE utilise ce nombre de processus en tâche de\n"
+" fond pour le VACUUM, si possible\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet n'écrit aucun message\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr ""
+" --skip-locked ignore les relations qui ne peuvent pas être\n"
+" verrouillées immédiatement\n"
+
+#: vacuumdb.c:1179
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLONNES)]' exécute VACUUM sur cette table\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mode verbeux\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze met à jour les statistiques de l'optimiseur\n"
+
+#: vacuumdb.c:1183
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr ""
+" -Z, --analyze-only met seulement à jour les statistiques de\n"
+" l'optimiseur ; pas de VACUUM\n"
+
+#: vacuumdb.c:1184
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages met seulement à jour les statistiques de\n"
+" l'optimiseur, en plusieurs étapes pour de\n"
+" meilleurs résultats ; pas de VACUUM\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Lire la description de la commande SQL VACUUM pour plus d'informations.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Si une des options -d, -D, -r, -R, -s, -S et RÔLE n'est pas précisée,\n"
+#~ "elle sera demandée interactivement.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [OPTION]... NOMLANGAGE [BASE]\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help affiche cette aide et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version affiche la version et quitte\n"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted chiffre le mot de passe stocké\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted ne chiffre pas le mot de passe stocké\n"
+
+#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr ""
+#~ " -d, --dbname=BASE base de données à partir de laquelle\n"
+#~ " supprimer le langage\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr " -d, --dbname=BASE base sur laquelle installer le langage\n"
+
+#~ msgid " -l, --list show a list of currently installed languages\n"
+#~ msgstr ""
+#~ " -l, --list affiche la liste des langages déjà\n"
+#~ " installés\n"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s installe un langage de procédures dans une base de données PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s supprime un langage procédural d'une base de données.\n"
+#~ "\n"
+
+#~ msgid "%s: \"%s\" is not a valid encoding name\n"
+#~ msgstr "%s : « %s » n'est pas un nom d'encodage valide\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s : %s"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr ""
+#~ "%s : ne peut utiliser l'option « freeze » lors de l'exécution d'un ANALYZE\n"
+#~ "seul\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s : n'a pas pu récupérer le nom de l'utilisateur actuel : %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s : n'a pas pu obtenir les informations concernant l'utilisateur actuel : %s\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s : socket invalide : %s"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s : le langage « %s » est déjà installé sur la base de données « %s »\n"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s : le langage « %s » n'est pas installé dans la base de données « %s »\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s : l'installation du langage a échoué : %s"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s : la suppression du langage a échoué : %s"
+
+#~ msgid "%s: missing required argument language name\n"
+#~ msgstr "%s : argument nom du langage requis mais manquant\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s : mémoire épuisée\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s : échec de la requête : %s"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s : la requête a renvoyé %d ligne au lieu d'une seule : %s\n"
+#~ msgstr[1] "%s : la requête a renvoyé %d lignes au lieu d'une seule : %s\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s : la requête était : %s\n"
+
+#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n"
+#~ msgstr ""
+#~ "%s : il existe encore %s fonctions déclarées dans le langage « %s » ;\n"
+#~ "langage non supprimé\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr "%s : trop de jobs en parallèle demandés (maximum %d)\n"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s"
+
+#~ msgid "Name"
+#~ msgstr "Nom"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Langages procéduraux"
+
+#~ msgid "Trusted?"
+#~ msgstr "De confiance (trusted) ?"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayer « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "cannot reindex system catalogs concurrently, skipping all"
+#~ msgstr "ne peut pas réindexer les catalogues système de manière concurrente, ignore tout"
+
+#~ msgid "could not connect to database %s: %s"
+#~ msgstr "n'a pas pu se connecter à la base de données %s : %s"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid value for --connection-limit: %s"
+#~ msgstr "valeur invalide pour --connection-limit : %s"
+
+#, c-format
+#~ msgid "minimum multixact ID age must be at least 1"
+#~ msgstr "l'âge minimum de l'identifiant de multitransaction doit au moins être 1"
+
+#, c-format
+#~ msgid "minimum transaction ID age must be at least 1"
+#~ msgstr "l'identifiant de la transaction (-x) doit valoir au moins 1"
+
+#~ msgid "no"
+#~ msgstr "non"
+
+#, c-format
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "une seule des options --locale et --lc-collate peut être indiquée"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "une seule des options --locale et --lc-ctype peut être indiquée"
+
+#~ msgid "parallel vacuum degree must be a non-negative integer"
+#~ msgstr "le degré de parallélisation du VACUUM doit être un entier non négatif"
+
+#, c-format
+#~ msgid "parallel workers for vacuum must be greater than or equal to zero"
+#~ msgstr "le nombre de processus parallélisés pour l VACUUM doit être supérieur à zéro"
+
+#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "pg_strdup : ne peut pas dupliquer un pointeur nul (erreur interne)\n"
+
+#~ msgid "reindexing of system catalogs failed: %s"
+#~ msgstr "la réindexation des catalogues système a échoué : %s"
+
+#~ msgid "yes"
+#~ msgstr "oui"
diff --git a/src/bin/scripts/po/he.po b/src/bin/scripts/po/he.po
new file mode 100644
index 0000000..ccd7597
--- /dev/null
+++ b/src/bin/scripts/po/he.po
@@ -0,0 +1,1079 @@
+# Hewbrew message translation file for pgscripts
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Michael Goldberg <mic.goldbrg@gmail.com>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2017-05-03 10:36+0300\n"
+"PO-Revision-Date: 2017-05-04 10:59+0300\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.1\n"
+"Last-Translator: Michael Goldberg <mic.goldbrg@gmail.com>\n"
+"Language: he_IL\n"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "×ין זיכרון פנוי\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "×œ× × ×™×ª×Ÿ לשכפל מצביע ריק (שגי××” פנימית)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "×œ× ×™×›×•×œ לחפש יעיל ×ת המשתמש ×¢× ×ž×–×”×” % ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "משתמש ×œ× ×§×™×™×"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "כישלון בדיקה עבור ×©× ×”×ž×©×ª×ž×©: קוד שגי××” % lu"
+
+#: ../../fe_utils/print.c:353
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(% lu שורה)"
+msgstr[1] "(% lu שורות)"
+
+#: ../../fe_utils/print.c:2913
+#, c-format
+msgid "Interrupted\n"
+msgstr "הופסק\n"
+
+#: ../../fe_utils/print.c:2977
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "×ין ×פשרות להוסיף כותרת לתוכן בטבלה: סה\"×› חריגה של %d העמודות.\n"
+
+#: ../../fe_utils/print.c:3017
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "×œ× × ×™×ª×Ÿ להוסיף ×ª× ×œ×ª×•×›×Ÿ בטבלה: סה\"×› חריגה של %d הת××™×.\n"
+
+#: ../../fe_utils/print.c:3266
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "תבנית הפלט ×œ× ×ª×™×§× ×™×ª (שגי××” פנימית): %d"
+
+#: clusterdb.c:111 clusterdb.c:130 createdb.c:119 createdb.c:138
+#: createuser.c:171 createuser.c:186 dropdb.c:94 dropdb.c:103 dropdb.c:111
+#: dropuser.c:90 dropuser.c:105 dropuser.c:120 pg_isready.c:93 pg_isready.c:107
+#: reindexdb.c:131 reindexdb.c:150 vacuumdb.c:213 vacuumdb.c:232
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "נסה '%s - עזרה' לקבלת מידע נוסף.\n"
+
+#: clusterdb.c:128 createdb.c:136 createuser.c:184 dropdb.c:109 dropuser.c:103
+#: pg_isready.c:105 reindexdb.c:148 vacuumdb.c:230
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: יותר מדי ××¨×’×•×ž× ×˜×™× ×©×œ שורת הפקודה (הר×שון ×”×•× \"%s\")\n"
+
+#: clusterdb.c:140
+#, c-format
+msgid "%s: cannot cluster all databases and a specific one at the same time\n"
+msgstr "%s: ×œ× ×™×›×•×œ ל'בץ ×ת כל מסדי ×”× ×ª×•× ×™× ×•×חד ספציפי ×–×” בו זמנית\n"
+
+#: clusterdb.c:147
+#, c-format
+msgid "%s: cannot cluster specific table(s) in all databases\n"
+msgstr "%s: ×œ× ×™×›×•×œ לקבץ טבל×ות ספציפיות / טבלה ספציפית בתוך כל מסדי הנתוני×\n"
+
+#: clusterdb.c:212
+#, c-format
+msgid "%s: clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: התקבצות של \"%s\" הטבלה במסד ×”× ×ª×•× ×™× '%s' נכשלה: %s"
+
+#: clusterdb.c:215
+#, c-format
+msgid "%s: clustering of database \"%s\" failed: %s"
+msgstr "%s: התקבצות של מסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: קיבוץ ב×שכולות מסד ×”× ×ª×•× ×™× '%s'. \n"
+
+#: clusterdb.c:269
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr "%s מקבץ ×ת כל הטבל×ות המקובצות בעבר במסד נתוני×.\n"
+
+#: clusterdb.c:270 createdb.c:252 createuser.c:354 dropdb.c:155 dropuser.c:161
+#: pg_isready.c:222 reindexdb.c:401 vacuumdb.c:952
+#, c-format
+msgid "Usage:\n"
+msgstr "שימוש:\n"
+
+#: clusterdb.c:271 reindexdb.c:402 vacuumdb.c:953
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr ""
+
+#: clusterdb.c:272 createdb.c:254 createuser.c:356 dropdb.c:157 dropuser.c:163
+#: pg_isready.c:225 reindexdb.c:403 vacuumdb.c:954
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"×פשרויות:\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all לקבץ ×ת כל מסדי הנתוני×\n"
+
+#: clusterdb.c:274
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME לקבץ ×ת מסד הנתוני×\n"
+
+#: clusterdb.c:275 createuser.c:360 dropdb.c:158 dropuser.c:164 reindexdb.c:406
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo להציג ×ת הפקודות הנשלחות לשרת\n"
+
+#: clusterdb.c:276 reindexdb.c:408
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ×ל תכתוב ×©×•× ×”×•×“×¢×•×ª\n"
+
+#: clusterdb.c:277
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE לקבץ ×ת הטבלה(×ות) ספציפית(יות) בלבד\n"
+
+#: clusterdb.c:278 reindexdb.c:412
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose לכתוב הרבה פלט מפורט\n"
+
+#: clusterdb.c:279 createuser.c:374 dropdb.c:160 dropuser.c:167 reindexdb.c:413
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: clusterdb.c:280 createuser.c:379 dropdb.c:162 dropuser.c:169 reindexdb.c:414
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: clusterdb.c:281 createdb.c:265 createuser.c:380 dropdb.c:163 dropuser.c:170
+#: pg_isready.c:231 reindexdb.c:415 vacuumdb.c:970
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"×פשרויות חיבור:\n"
+
+#: clusterdb.c:282 createuser.c:381 dropdb.c:164 dropuser.c:171 reindexdb.c:416
+#: vacuumdb.c:971
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME שרת מ×רח של מסד ×”× ×ª×•× ×™× ×ו ספריית שקע\n"
+
+#: clusterdb.c:283 createuser.c:382 dropdb.c:165 dropuser.c:172 reindexdb.c:417
+#: vacuumdb.c:972
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT יצי×ת שרת מסד נתוני×\n"
+
+#: clusterdb.c:284 dropdb.c:166 reindexdb.c:418 vacuumdb.c:973
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ×©× ×”×ž×©×ª×ž×© להתחבר ×יתו\n"
+
+#: clusterdb.c:285 createuser.c:384 dropdb.c:167 dropuser.c:174 reindexdb.c:419
+#: vacuumdb.c:974
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ×œ×¢×•×œ× ×œ× ×œ×‘×§×© סיסמה\n"
+
+#: clusterdb.c:286 createuser.c:385 dropdb.c:168 dropuser.c:175 reindexdb.c:420
+#: vacuumdb.c:975
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password נדרשת בקשת סיסמה\n"
+
+#: clusterdb.c:287 dropdb.c:169 reindexdb.c:421 vacuumdb.c:976
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME מסד × ×ª×•× ×™× ×ª×—×–×•×§×” חלופי\n"
+
+#: clusterdb.c:288
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"×ª×§×¨× ×ת התי×ור של הפקודת CLUSTER לקבלת פרטי×.\n"
+
+#: clusterdb.c:289 createdb.c:273 createuser.c:386 dropdb.c:170 dropuser.c:176
+#: pg_isready.c:236 reindexdb.c:423 vacuumdb.c:978
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"לדווח על ב××’×™× ×œ <pgsql-bugs@postgresql.org>\n"
+
+#: common.c:80 common.c:126
+msgid "Password: "
+msgstr "סיסמה: "
+
+#: common.c:113
+#, c-format
+msgid "%s: could not connect to database %s: out of memory\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ להתחבר ×ל מסד ×”× ×ª×•× ×™× %s: ×ין מספיק זיכרון\n"
+
+#: common.c:140
+#, c-format
+msgid "%s: could not connect to database %s: %s"
+msgstr "%s: ×œ× × ×™×ª×Ÿ להתחבר ×ל מסד × ×ª×•× ×™× %s: %s"
+
+#: common.c:189 common.c:217
+#, c-format
+msgid "%s: query failed: %s"
+msgstr "%s: ש×ילתה נכשלה: %s"
+
+#: common.c:191 common.c:219
+#, c-format
+msgid "%s: query was: %s\n"
+msgstr "%s: ש×ילתה היתה: %s\n"
+
+#. translator: abbreviation for "yes"
+#: common.c:260
+msgid "y"
+msgstr ""
+
+#. translator: abbreviation for "no"
+#: common.c:262
+msgid "n"
+msgstr ""
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:272
+#, c-format
+msgid "%s (%s/%s) "
+msgstr ""
+
+#: common.c:286
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "× × ×œ×¢× ×•×ª \"%s\" ×ו \"%s\".\n"
+
+#: common.c:365 common.c:402
+#, c-format
+msgid "Cancel request sent\n"
+msgstr "בקשת ביטול נשלחה\n"
+
+#: common.c:368 common.c:406
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "×œ× × ×™×ª×Ÿ לשלוח ×ת בקשת ביטול: %s"
+
+#: createdb.c:146
+#, c-format
+msgid "%s: only one of --locale and --lc-ctype can be specified\n"
+msgstr "%s: ניתן לציין רק ×חד מ --locale ו --lc-ctype\n"
+
+#: createdb.c:152
+#, c-format
+msgid "%s: only one of --locale and --lc-collate can be specified\n"
+msgstr "%s: ניתן לציין רק ×חד מ --locale ו --lc-collate\n"
+
+#: createdb.c:164
+#, c-format
+msgid "%s: \"%s\" is not a valid encoding name\n"
+msgstr "%s: \"%s\" ×ינו ×©× ×§×™×“×•×“ חוקי\n"
+
+#: createdb.c:213
+#, c-format
+msgid "%s: database creation failed: %s"
+msgstr "%s: יצירה של מסד ×”× ×ª×•× ×™× × ×›×©×œ: %s"
+
+#: createdb.c:233
+#, c-format
+msgid "%s: comment creation failed (database was created): %s"
+msgstr "%s: יצירת הערה נכשלה (מסד × ×ª×•× ×™× × ×•×¦×¨): %s"
+
+#: createdb.c:251
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr "%s יוצר מסד × ×ª×•× ×™× PostgreSQL.\n"
+
+#: createdb.c:253
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr ""
+
+#: createdb.c:255
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr ""
+" -D, --tablespace=TABLESPACE מרחב טבל×ות ברירת מחדל עבור מסד הנתוני×\n"
+
+#: createdb.c:256
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo להציג ×ת הפקודות הנשלחות לשרת\n"
+
+#: createdb.c:257
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING קידוד של מסד הנתוני×\n"
+
+#: createdb.c:258
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE הגדרות ×זוריות של מסד הנתוני×\n"
+
+#: createdb.c:259
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE LC_COLLATE הגדרות עבור מסד הנתוני×\n"
+
+#: createdb.c:260
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE LC_CTYPE הגדרה עבור מסד הנתוני×\n"
+
+#: createdb.c:261
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr ""
+" -O, --owner=OWNER משתמש מסד ×”× ×ª×•× ×™× ×”×‘×¢×œ×™× ×©×œ מסד ×”× ×ª×•× ×™× ×”×—×“×©\n"
+
+#: createdb.c:262
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE תבנית מסד ×”× ×ª×•× ×™× ×œ×”×¢×ª×§×”\n"
+
+#: createdb.c:263
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: createdb.c:264
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: createdb.c:266
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME שרת מ×רח של מסד ×”× ×ª×•× ×™× ×ו ספריית שקע\n"
+
+#: createdb.c:267
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT יצי×ת שרת מסד נתוני×\n"
+
+#: createdb.c:268
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ×©× ×”×ž×©×ª×ž×© להתחבר ×יתו\n"
+
+#: createdb.c:269
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ×œ×¢×•×œ× ×œ× ×œ×‘×§×© סיסמה\n"
+
+#: createdb.c:270
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password נדרשת בקשת סיסמה\n"
+
+#: createdb.c:271
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME מסד × ×ª×•× ×™× ×ª×—×–×•×§×” חלופי\n"
+
+#: createdb.c:272
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"כברירת מחדל, מסד × ×ª×•× ×™× × ×•×¦×¨ ×¢× ×©× ×–×”×” לזה המשתמש הנוכחי.\n"
+
+#: createuser.c:194
+msgid "Enter name of role to add: "
+msgstr "הזן ×©× ×©×œ תפקיד כדי להוסיף: "
+
+#: createuser.c:211
+msgid "Enter password for new role: "
+msgstr "הזן סיסמה עבור תפקיד חדש: "
+
+#: createuser.c:213
+msgid "Enter it again: "
+msgstr "הזן שוב: "
+
+#: createuser.c:216
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "סיסמ×ות ×ינן תו×מות.\n"
+
+#: createuser.c:224
+msgid "Shall the new role be a superuser?"
+msgstr "יהיה התפקיד החדש משתמש על?"
+
+#: createuser.c:239
+msgid "Shall the new role be allowed to create databases?"
+msgstr "התפקיד החדש ×™×”×™×” רש××™ ליצור מסדי נתוני×?"
+
+#: createuser.c:247
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "התפקיד החדש ×™×”×™×” רש××™ ליצור ×ª×¤×§×™×“×™× ×—×“×©×™×?"
+
+#: createuser.c:281
+#, c-format
+msgid "Password encryption failed.\n"
+msgstr "הצפנת סיסמה נכשל.\n"
+
+#: createuser.c:338
+#, c-format
+msgid "%s: creation of new role failed: %s"
+msgstr "%s: יצירת תפקיד חדש נכשלה: %s"
+
+#: createuser.c:353
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s יוצר תפקיד PostgreSQL חדש.\n"
+"\n"
+
+#: createuser.c:355 dropuser.c:162
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr ""
+
+#: createuser.c:357
+#, c-format
+msgid ""
+" -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N מגבלת ×”×—×™×‘×•×¨×™× ×¢×‘×•×¨ תפקיד (ברירת מחדל: ×ין "
+"גבול)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb תפקיד יכול ליצור מסדי × ×ª×•× ×™× ×—×“×©×™×\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb תפקיד ×œ× ×™×›×•×œ ליצור מסדי × ×ª×•× ×™× ×—×“×©×™× (ברירת "
+"מחדל)\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -E, --encrypted encrypt stored password\n"
+msgstr " -E, --encrypted להצפין סיסמה מ×וחסנת\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE תפקיד חדש יהיה חבר של תפקיד זה\n"
+
+#: createuser.c:363
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit תפקיד יורש הרש×ות מתפקידי×\n"
+" ×שר ×”×•× ×—×‘×¨ ×‘×”× (ברירת מחדל)\n"
+
+#: createuser.c:365
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit תפקיד ×ינו יורש הרש×ות\n"
+
+#: createuser.c:366
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login תפקיד יכול להתחבר (ברירת מחדל)\n"
+
+#: createuser.c:367
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login תפקיד ×œ× ×›×•×œ להתחבר\n"
+
+#: createuser.c:368
+#, c-format
+msgid " -N, --unencrypted do not encrypt stored password\n"
+msgstr " -N, --unencrypted ×œ× ×œ×ž×¦×¤×™×Ÿ ×ת הסיסמה המ×וחסנת\n"
+
+#: createuser.c:369
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt להקצות סיסמה לתפקיד חדש\n"
+
+#: createuser.c:370
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole תפקיד יכול ליצור ×ª×¤×§×™×“×™× ×—×“×©×™×\n"
+
+#: createuser.c:371
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole תפקיד ×œ× ×™×›×•×š ליצור ×ª×¤×§×™×“×™× (ברירת מחדל)\n"
+
+#: createuser.c:372
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser תפקיד יהיה משתמש על\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser תפקיד ×œ× ×™×”×™×” משתמש על (ברירת מחדל)\n"
+
+#: createuser.c:375
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes "
+"rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive לבקש ×ת ×©× ×”×ª×¤×§×™×“ ותכונות החסרות במקו×\n"
+" שימוש בברירת מחדל\n"
+
+#: createuser.c:377
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication תפקיד יכול ×œ×™×–×•× ×©×›×¤×•×œ\n"
+
+#: createuser.c:378
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication תפקיד ×œ× ×™×›×•×œ ×œ×™×–×•× ×©×›×¤×•×œ\n"
+
+#: createuser.c:383
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME ×©× ×”×ž×©×ª×ž×© להתחבר ×יתו (×œ× ×חד כדי ליצור)\n"
+
+#: dropdb.c:102
+#, c-format
+msgid "%s: missing required argument database name\n"
+msgstr "%s: חסר ×©× ×ž×¡×“ ×”× ×ª×•× ×™× ×©×œ ×רגומנט נדרש\n"
+
+#: dropdb.c:117
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "מסד ×”× ×ª×•× ×™× '%s' יוסר לצמיתות.\n"
+
+#: dropdb.c:118 dropuser.c:128
+msgid "Are you sure?"
+msgstr "×”×× ×תה בטוח?"
+
+#: dropdb.c:139
+#, c-format
+msgid "%s: database removal failed: %s"
+msgstr "%s: הסרת מסד ×”× ×ª×•× ×™× × ×›×©×œ×”: %s"
+
+#: dropdb.c:154
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr "%s מסיר מסד × ×ª×•× ×™× PostgreSQL.\n"
+
+#: dropdb.c:156
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr ""
+
+#: dropdb.c:159
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive לבקש ×ישור לפני מחיקת כל דבר\n"
+
+#: dropdb.c:161
+#, c-format
+msgid ""
+" --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists ×œ× ×œ×“×•×•×— על שגי××” ×× ×ž×¡×“ ×”× ×ª×•× ×™× ×ינו קיי×\n"
+
+#: dropuser.c:113
+msgid "Enter name of role to drop: "
+msgstr "הזן ×©× ×©×œ תפקיד על מנת למחוק: "
+
+#: dropuser.c:119
+#, c-format
+msgid "%s: missing required argument role name\n"
+msgstr "%s: חסר ×רגומנט נדרש ×©× ×ª×¤×§×™×“\n"
+
+#: dropuser.c:127
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "תפקיד \"%s\" יוסר לצמיתות.\n"
+
+#: dropuser.c:145
+#, c-format
+msgid "%s: removal of role \"%s\" failed: %s"
+msgstr "%s: הסרת תפקיד \"%s\" נכשלה: %s"
+
+#: dropuser.c:160
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s מסיר תפקיד של PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:165
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive לבקש ×ישור לפני מחיקת כל דבר, ×œ× ×œ×‘×§×©\n"
+" ×©× ×ª×¤×§×™×“ ×× ×œ× ×¦×•×™×Ÿ\n"
+
+#: dropuser.c:168
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists ×œ× ×œ×“×•×•×— שגי××” ×× ×”×ž×©×ª×ž×© ×ינו קיי×\n"
+
+#: dropuser.c:173
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=USERNAME ×©× ×”×ž×©×ª×ž×© להתחבר ×יתו (×œ× ×חד ×©×¦×¨×™×›×™× ×œ×ž×—×•×§)\n"
+
+#: pg_isready.c:142
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: pg_isready.c:150
+#, c-format
+msgid "%s: could not fetch default options\n"
+msgstr "%s: ×œ× ×™×›×•×œ ×œ×”×‘×™× ×ת ×פשרויות ברירת המחדל\n"
+
+#: pg_isready.c:199
+#, c-format
+msgid "accepting connections\n"
+msgstr "קבלת חיבורי×\n"
+
+#: pg_isready.c:202
+#, c-format
+msgid "rejecting connections\n"
+msgstr "דחיית חיבורי×\n"
+
+#: pg_isready.c:205
+#, c-format
+msgid "no response\n"
+msgstr "×ין תגובה\n"
+
+#: pg_isready.c:208
+#, c-format
+msgid "no attempt\n"
+msgstr "×ין ניסיון\n"
+
+#: pg_isready.c:211
+#, c-format
+msgid "unknown\n"
+msgstr "×œ× ×™×“×•×¢\n"
+
+#: pg_isready.c:221
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s מתחיל בדיקת חיבור למסד × ×ª×•× ×™× PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:223
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr ""
+
+#: pg_isready.c:226
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME ×©× ×ž×¡×“ הנתוני×\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet לרוץ בשקט\n"
+
+#: pg_isready.c:228
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME שרת מ×רח של מסד ×”× ×ª×•× ×™× ×ו ספריית שקע\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT יצי×ת שרת מסד נתוני×\n"
+
+#: pg_isready.c:234
+#, c-format
+msgid ""
+" -t, --timeout=SECS seconds to wait when attempting connection, 0 "
+"disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=SECS שניות שיש להמתין בעת ניסיון ההתקשרות, 0 משבית "
+"(ברירת המחדל: %s)\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ×©× ×”×ž×©×ª×ž×© להתחבר ×יתו\n"
+
+#: reindexdb.c:160
+#, c-format
+msgid "%s: cannot reindex all databases and a specific one at the same time\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור כל מסדי ×”× ×ª×•× ×™× ×•×¢×‘×•×¨ ×”×חד הספציפי בו "
+"זמנית\n"
+
+#: reindexdb.c:165
+#, c-format
+msgid "%s: cannot reindex all databases and system catalogs at the same time\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור כל מסדי ×”× ×ª×•× ×™× ×•×›×œ ×§×˜×œ×•×’×™× ×©×œ מערכת בו "
+"זמנית\n"
+
+#: reindexdb.c:170
+#, c-format
+msgid "%s: cannot reindex specific schema(s) in all databases\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור סכימה(ות) ספציפית(יות) בכל מסדי הנתוני×\n"
+
+#: reindexdb.c:175
+#, c-format
+msgid "%s: cannot reindex specific table(s) in all databases\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור טבלה(ות) ספציפית(יות) בכל מסדי הנתוני×\n"
+
+#: reindexdb.c:180
+#, c-format
+msgid "%s: cannot reindex specific index(es) in all databases\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור ×ינדקס(×™×) ספציפי(×™×) בכל מסדי הנתוני×\n"
+
+#: reindexdb.c:191
+#, c-format
+msgid ""
+"%s: cannot reindex specific schema(s) and system catalogs at the same time\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור סכימה(ות) ספציפית(יות) ×•×§×˜×œ×•×’×™× ×©×œ מערכת "
+"בו זמנית\n"
+
+#: reindexdb.c:196
+#, c-format
+msgid ""
+"%s: cannot reindex specific table(s) and system catalogs at the same time\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור טבלה(ות) ספציפית(יות) ×•×§×˜×œ×•×’×™× ×©×œ מערכת "
+"בו זמנית\n"
+
+#: reindexdb.c:201
+#, c-format
+msgid ""
+"%s: cannot reindex specific index(es) and system catalogs at the same time\n"
+msgstr ""
+"%s: ×œ× × ×™×ª×Ÿ ליצור ×ינדקס מחדש עבור ×ינדקס(×™×) ספציפי(×™×) ×•×§×˜×œ×•×’×™× ×©×œ מערכת "
+"בו זמנית\n"
+
+#: reindexdb.c:307
+#, c-format
+msgid "%s: reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: יוצר ×ינדקס מחדש של הטבלה \"%s\" במסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: reindexdb.c:310
+#, c-format
+msgid "%s: reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: יוצר ×ינדקס מחדש של ×ינדקס \"%s\" במסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: reindexdb.c:313
+#, c-format
+msgid "%s: reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: יוצר ×ינדקס מחדש של סכימה \"%s\" במסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: reindexdb.c:316
+#, c-format
+msgid "%s: reindexing of database \"%s\" failed: %s"
+msgstr "%s: יוצר ×ינדקס מחדש של מסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: reindexdb.c:349
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: יצור ×ינדקס מחדש ×ת מסד ×”× ×ª×•× ×™× '%s'. \n"
+
+#: reindexdb.c:388
+#, c-format
+msgid "%s: reindexing of system catalogs failed: %s"
+msgstr "%s: יוצר ×ינדקס מחדש של קטלוג המערכת נכשל: %s"
+
+#: reindexdb.c:400
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s יוצר ×ינדקס מחדש עובר מסד × ×ª×•× ×™× PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:404
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all ל×נדקס מחדש ×ת כל מסדי הנתוני×\n"
+
+#: reindexdb.c:405
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME מסד × ×ª×•× ×™× ×œ×™×¦×™×¨×ª ×ינדקס מחדש\n"
+
+#: reindexdb.c:407
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX ,תשחזר רק ×ינדקס(×™×) ספציפי(×™×) בלבד\n"
+
+#: reindexdb.c:409
+#, c-format
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system מ×נדקס מחדש ×ת ×§×˜×œ×•×’×™× ×©×œ מערכת\n"
+
+#: reindexdb.c:410
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr ""
+" -S, --schema=SCHEMA ל×נדקס מחדש ×ת הסכימה(ות) ספציפי(ות) בלבד\n"
+
+#: reindexdb.c:411
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr ""
+" -t, --table=TABLE ל×נדקס מחדש ×ת הטבלה(×ות) ספציפית(יות) בלבד\n"
+
+#: reindexdb.c:422
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"×ª×§×¨× ×ת התי×ור של הפקודה REINDEX לפרטי×.\n"
+
+#: vacuumdb.c:195
+#, c-format
+msgid "%s: number of parallel jobs must be at least 1\n"
+msgstr "%s: מספר משימות מקבילות חייב להיות לפחות 1\n"
+
+#: vacuumdb.c:201
+#, c-format
+msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+msgstr "%s: משימות מקבילות רבות מדי המבוקש ( מספר מרבי: %d)\n"
+
+#: vacuumdb.c:240 vacuumdb.c:246
+#, c-format
+msgid "%s: cannot use the \"%s\" option when performing only analyze\n"
+msgstr "%s: ×œ× × ×™×ª×Ÿ להשתמש ב×פשרות \"%s\" בעת ביצוע ניתוח בלבד\n"
+
+#: vacuumdb.c:263
+#, c-format
+msgid "%s: cannot vacuum all databases and a specific one at the same time\n"
+msgstr "%s: ×œ× ×™×›×•×œ לנקות ×ת כל מסדי ×”× ×ª×•× ×™× ×•×חד ספציפי ×–×” בו זמנית\n"
+
+#: vacuumdb.c:269
+#, c-format
+msgid "%s: cannot vacuum specific table(s) in all databases\n"
+msgstr "%s: ×œ× ×™×›×•×œ לנקות טבל×ות ספציפיות / טבלה ספציפית בכל מסדי הנתוני×\n"
+
+#: vacuumdb.c:355
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "הפקת הסטטיסטיקה מינימלי ת עובר ×”×ופטימיזציה (יעד 1)"
+
+#: vacuumdb.c:356
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "הפקת הסטטיסטיקה מינימלי ת עובר ×”×ופטימיזציה (10 יעדי×)"
+
+#: vacuumdb.c:357
+msgid "Generating default (full) optimizer statistics"
+msgstr "הפקת הסטטיסטיקות ברירת המחדל (מל×ות) עבור ×”×ופטימיזציה"
+
+#: vacuumdb.c:369
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: מעבד מסד ×”× ×ª×•× ×™× '%s': %s\n"
+
+#: vacuumdb.c:372
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: מנקה מסד ×”× ×ª×•× ×™× '%s'\n"
+
+#: vacuumdb.c:708
+#, c-format
+msgid "%s: vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: ניקוי של \"%s\" הטבלה במסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: vacuumdb.c:711 vacuumdb.c:828
+#, c-format
+msgid "%s: vacuuming of database \"%s\" failed: %s"
+msgstr "%s: ניקוי של מסד ×”× ×ª×•× ×™× '%s' נכשל: %s"
+
+#: vacuumdb.c:942
+#, c-format
+msgid "%s: invalid socket: %s"
+msgstr "%s: שקע ×œ× ×—×•×§×™×ª: %s"
+
+#: vacuumdb.c:951
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s מנקה ומנתח PostgreSQL מסד נתוני×.\n"
+"\n"
+
+#: vacuumdb.c:955
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all לנקות כל מסדי נתוני×\n"
+
+#: vacuumdb.c:956
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME מסד × ×ª×•× ×™× ×œ× ×™×§×•×™\n"
+
+#: vacuumdb.c:957
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo להציג ×ת הפקודות הנשלחות לשרת\n"
+
+#: vacuumdb.c:958
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full תעשה ניקוי מל×\n"
+
+#: vacuumdb.c:959
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze ×œ×”×§×¤×™× × ×ª×•× ×™ הטרנס×קציה של שורה\n"
+
+#: vacuumdb.c:960
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"vacuum\n"
+msgstr ""
+" -j, --jobs=NUM להשתמש ×‘×—×™×‘×•×¨×™× ×ž×§×‘×™×œ×™× ×¨×‘×™× ×œ× ×™×§×•×™\n"
+
+#: vacuumdb.c:961
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ×ל תכתוב ×©×•× ×”×•×“×¢×•×ª\n"
+
+#: vacuumdb.c:962
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' ו××§×•× ×˜×‘×œ×ות ספציפיות בלבד\n"
+
+#: vacuumdb.c:963
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose לכתוב הרבה פלט מפורט\n"
+
+#: vacuumdb.c:964
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version להציג מידע על הגירסה, ול×חר מכן לצ×ת\n"
+
+#: vacuumdb.c:965
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr ""
+" -z, --analyze לעדכן ×ת הסטטיסטיקה עבור ×”×ופטימיזציה\n"
+
+#: vacuumdb.c:966
+#, c-format
+msgid ""
+" -Z, --analyze-only only update optimizer statistics; no "
+"vacuum\n"
+msgstr ""
+" -Z, --analyze-only רק לעדכן ×ת הסטטיסטיקה עובר ×”×ופטימיזציה; "
+"×ין ניקוי\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in "
+"multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages רק לעדכן ×ת סטטיסטיקה עבור ×”×ופטימיזציה, "
+"×‘×©×œ×‘×™× ×ž×¨×•×‘×™× \n"
+" עבור תוצ×ות מהירות יותר; ×ין ניקוי\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help להציג עזרה זו, ול×חר מכן לצ×ת\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"×ª×§×¨× ×ת התי×ור של הפקודה VACUUM לפרטי×.\n"
diff --git a/src/bin/scripts/po/it.po b/src/bin/scripts/po/it.po
new file mode 100644
index 0000000..bf906ad
--- /dev/null
+++ b/src/bin/scripts/po/it.po
@@ -0,0 +1,1228 @@
+#
+# pgscripts.po
+# Italian message translation file for pgscripts
+#
+# For development and bug report please use:
+# https://github.com/dvarrazzo/postgresql-it
+#
+# Copyright (C) 2012-2017 PostgreSQL Global Development Group
+# Copyright (C) 2010, Associazione Culturale ITPUG
+#
+# Daniele Varrazzo <daniele.varrazzo@gmail.com>, 2012-2017.
+# Emanuele Zamprogno <ez@medicinaopen.info>, 2009.
+# Mirko Tebaldi <mirko.tebaldi@libero.it>, 2004.
+# Fabrizio Mazzoni <veramente@libero.it>, 2003.
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:19+0000\n"
+"PO-Revision-Date: 2023-09-05 08:41+0200\n"
+"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
+"Language-Team: https://github.com/dvarrazzo/postgresql-it\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "memoria esaurita\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "impossibile duplicare il puntatore nullo (errore interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "impossibile cercare l'ID utente effettivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "l'utente non esiste"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ricerca del nome utente fallita: codice di errore %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Richiesta di annullamento inviata\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Impossibile inviare la richiesta di annullamento: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Password: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "impossibile connettersi al database %s: memoria insufficiente"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "troppi lavori per questa piattaforma"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "elaborazione del database \"%s\" non riuscita: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu riga)"
+msgstr[1] "(%lu righe)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrotto\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Impossibile aggiungere l'intestazione al contenuto della tabella: numero di colonne è più di %d.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Impossibile aggiungere la cella al contenuto della tabella: il numero totale di celle è più di %d.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato di output non valido (errore interno): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "query fallita: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "La richiesta era: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 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:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "non può raggruppare tutti i database e uno specifico contemporaneamente"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "impossibile raggruppare tabelle specifiche in tutti i database"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "raggruppamento della tabella \"%s\" nel database \"%s\" non riuscito: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "raggruppamento del database \"%s\" non riuscito: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: riordino del database \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s raggruppa tutte le tabelle precedentemente raggruppate in un database.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPZIONE]... [NOMEDB]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all raggruppa tutti i database\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=NOMEDB database da raggruppare\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi inviati al server\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet non stampare alcun messaggio\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELLA raggruppa solo le tabelle specificate\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra un output completo\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opzioni di connessione:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del server database o directory socket\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta del server database\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTENTE nome utente da utilizzare per la connessione\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non richiedere mai una password\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forza la richiesta di una password\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEDB database di manutenzione alternativo\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Consulta la descrizione del comando SQL CLUSTER per maggiori informazioni.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Segnala i bug a <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "la query ha restituito %d riga anziché una: %s"
+msgstr[1] "le query hanno restituito %d righe invece di una: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "s"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Prego rispondere \"%s\" o \"%s\".\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" non è un nome di codifica valido"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "creazione del database non riuscita: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "creazione commento non riuscita (database creato): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s crea un database PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPZIONE]... [NOMEDB] [DESCRIZIONE]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE tablespace predefinito per il database\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi che vengono inviati al server\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING codifica del database\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE impostazioni di localizzazione del database\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE impostazione LC_COLLATE per il database\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE impostazione LC_CTYPE per il database\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE impostazione locale ICU per il database\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" provider delle impostazioni locali per le regole di confronto predefinite del database\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER utente database proprietario del nuovo database\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=strategia di creazione del database STRATEGIA wal_log o file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE modello database da copiare\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME host del server database o directory socket\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT porta del server database\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME nome utente da usare per connettersi\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password non richiedere mai una password\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password forza la richiesta di una password\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEDB database di manutenzione alternativo\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Se il nome non è specificato verrà creato un database con lo stesso nome\n"
+"dell'utente corrente.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Inserisci il nome del ruolo da aggiungere: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Inserisci la password per il nuovo ruolo: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Conferma password: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Le password non corrispondono.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "Il nuovo ruolo dev'essere un superutente?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Il nuovo ruolo può creare database?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Il nuovo ruolo può creare altri ruoli?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "crittografia della password non riuscita: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "creazione di un nuovo ruolo non riuscita: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s crea un nuovo ruolo PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPZIONI]... [NOME_RUOLO]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limite di connessione per un ruolo (predefinito: nessun limite)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb il ruolo può creare nuovi database\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb il ruolo non può creare database (predefinito)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=RUOLO il nuovo ruolo sarà membro di questo ruolo\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit il ruolo eredita i privilegi dei ruoli di cui\n"
+" è membro (predefinito)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit il ruolo non eredita privilegi\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login il ruolo può accedere al database (predefinito)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login il ruolo non può accedere al database\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt assegna una password al nuovo ruolo\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole il ruolo può creare nuovi ruoli\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole il ruolo non può creare ruoli (predefinito)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser il ruolo sarà un superutente\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser il ruolo non sarà un superutente (predefinito)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive richiedi i nomi ed attributi dei ruoli mancanti\n"
+" invece di usare i valori predefiniti\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication il ruolo può avviare una replica\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication il ruolo non può avviare una replica\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=UTENTE nome utente con cui collegarsi\n"
+" (non quello da creare)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "nome del database dell'argomento richiesto mancante"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Il database \"%s\" sarà eliminato definitivamente.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Sei sicuro?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "rimozione del database non riuscita: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s elimina un database PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPZIONE]... NOMEDB\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force prova a terminare altre connessioni prima di cadere\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive chiedi conferma prima di cancellare qualunque cosa\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists non riportare errori se il database non esiste\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Inserisci il nome del ruolo da eliminare: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "nome del ruolo dell'argomento richiesto mancante"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Il ruolo \"%s\" sarà eliminato definitivamente.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "rimozione del ruolo \"%s\" non riuscita: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s elimina un ruolo PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive chiedi conferma prima cancellare qualunque cosa\n"
+" e richiedi i nomi dei ruoli se non specificati\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists non riportare errori se l'utente non esiste\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=UTENTE nome utente con cui collegarsi\n"
+" (non quello da eliminare)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "impossibile recuperare le opzioni predefinite"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "le connessioni sono accettate\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "le connessioni sono rifiutate\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "nessuna risposta\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "nessun tentativo\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "sconosciuto\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s effettua una connessione di controllo ad un database PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPZIONE]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=NOMEDB nome database\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet esegui silenziosamente\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NOMEHOST host server del database o directory socket\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta del server database\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEC secondi di attesa tentando una connessione, 0 disabilita (predefinito: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=UTENTE nome utente con cui connettersi\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "non può reindicizzare tutti i database e uno specifico contemporaneamente"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "non può reindicizzare tutti i database e i cataloghi di sistema contemporaneamente"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "non può reindicizzare schemi specifici in tutti i database"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "impossibile reindicizzare tabelle specifiche in tutti i database"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "non può reindicizzare indici specifici in tutti i database"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "non può reindicizzare contemporaneamente schemi e cataloghi di sistema specifici"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "non può reindicizzare tabelle specifiche e cataloghi di sistema contemporaneamente"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "non può reindicizzare contemporaneamente indici specifici e cataloghi di sistema"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "non è possibile utilizzare più lavori per reindicizzare i cataloghi di sistema"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "non è possibile utilizzare più lavori per reindicizzare gli indici"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "non è possibile utilizzare l'opzione \"%s\" su versioni del server precedenti a PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "impossibile reindicizzare i cataloghi di sistema contemporaneamente, saltando tutto"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "reindicizzazione del database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "reindicizzazione dell'indice \"%s\" nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "reindicizzazione dello schema \"%s\" nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "reindicizzazione dei cataloghi di sistema nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "reindicizzazione della tabella \"%s\" nel database \"%s\" non riuscita: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: re-indicizzazione del database \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s re-indicizza un database PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindicizza tutti i database\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindecizza in contemporanea\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME database da reindicizzare\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX ricrea solo indici specifici\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee per reindicizzare\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet non scrive alcun messaggio\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system reindex solo i cataloghi di sistema\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA reindicizza solo gli schemi specifici\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE solo per tabelle specifiche per reindicizzare\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE tablespace in cui vengono ricostruiti gli indici\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose scrive molto output\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Consulta la descrizione del comando SQL REINDEX per maggiori informazioni.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "non è possibile utilizzare l'opzione \"%s\" quando si esegue solo l'analisi"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "non è possibile utilizzare l'opzione \"%s\" quando si esegue il vuoto completo"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "non è possibile utilizzare l'opzione \"%s\" con l'opzione \"%s\"."
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "non è possibile fare il vacuum di tutti i database e uno specifico contemporaneamente"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "non può aspirare tabelle specifiche in tutti i database"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generazione di statistiche ottimizzatore minime (1 obiettivo)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generazione di statistiche ottimizzatore medie (10 obiettivi)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generazione di statistiche ottimizzatore di default (completo)"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: elaborazione del database \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: pulizia del database \"%s\"\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "svuotamento della tabella \"%s\" nel database \"%s\" non riuscito: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "svuotamento del database \"%s\" non riuscito: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s pulisce ed analizza un database PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all pulisci tutti i database\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=NOMEDB database da pulire\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping disabilita tutti i comportamenti di salto di pagina\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra i comandi inviati al server\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full esegui una pulizia completa\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze congela le informazioni per la transazione\n"
+" sulla riga\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup rimuove sempre le voci di indice che puntano a tuple morte\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr ""
+" -j, --jobs=NUM usa questo numero di connessioni concorrenti\n"
+" per effetturare il vacuum\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE età minima dell'ID multixact delle tabelle da aspirare\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE minimo ID transazione età delle tabelle da aspirare\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup non rimuove le voci di indice che puntano a tuple morte\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast salta la tabella TOAST associata alla tabella da aspirare\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate non tronca le pagine vuote alla fine della tabella\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_WORKERS usa questo numero di lavoratori in background per il vuoto, se disponibile\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet non stampare alcun messaggio\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked salta le relazioni che non possono essere bloccate immediatamente\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABELLA[(COLONNE)]' ripulisci solo le tabelle specificate\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra molti messaggi\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aggiorna le statistiche per l'ottimizzatore\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only aggiorna solo le statistiche; niente vacuum\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages aggiorna solo le statistiche, in fasi multiple\n"
+" per maggiore velocità, niente vacuum\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Consulta la descrizione del comando SQL VACUUM per maggiori informazioni.\n"
+
+#~ msgid "%s: \"%s\" is not a valid encoding name\n"
+#~ msgstr "%s: \"%s\" non è un nome di codifica valido\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "%s: could not connect to database %s: %s"
+#~ msgstr "%s: connessione al database %s fallita: %s"
+
+#~ msgid "%s: number of parallel jobs must be at least 1\n"
+#~ msgstr "%s: il numero dei lavori paralleli dev'essere almeno 1\n"
+
+#~ msgid "%s: only one of --locale and --lc-collate can be specified\n"
+#~ msgstr "%s: solo uno tra --locale e --lc-collate può essere specificato\n"
+
+#~ msgid "%s: only one of --locale and --lc-ctype can be specified\n"
+#~ msgstr "%s: solo uno tra --locale e --lc-ctype può essere specificato\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: query fallita: %s"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s: la query ha restituito %d righe invece di una: %s\n"
+#~ msgstr[1] "%s: la query ha restituito %d righe invece di una: %s\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: la query era: %s\n"
+
+#~ msgid "%s: reindexing of system catalogs failed: %s"
+#~ msgstr "%s: la re-indicizzazione dei cataloghi di sistema è fallita: %s"
+
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr "%s: troppi lavori in parallelo richiesti (massimo: %d)\n"
+
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Prova \"%s --help\" per maggiori informazioni.\n"
diff --git a/src/bin/scripts/po/ja.po b/src/bin/scripts/po/ja.po
new file mode 100644
index 0000000..8a78f15
--- /dev/null
+++ b/src/bin/scripts/po/ja.po
@@ -0,0 +1,1283 @@
+# pgscripts.po
+# Japanese message translation file for scripts
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: scripts (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-16 10:46+0900\n"
+"PO-Revision-Date: 2023-10-16 11:03+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: jpug-doc <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "メモリä¸è¶³ã§ã™\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nullãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "実効ユーザーID %ldãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ユーザーåã®æ¤œç´¢ã«å¤±æ•—: エラーコード%lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "キャンセルè¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "キャンセルè¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "パスワード: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "データベース%sã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: メモリä¸è¶³ã§ã™"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション %2$s ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"
+
+#: ../../fe_utils/parallel_slot.c:317
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "ã“ã®ãƒ—ラットフォームã«å¯¾ã—ã¦ã‚¸ãƒ§ãƒ–æ•°ãŒå¤šã™ãŽã¾ã™: %d"
+
+#: ../../fe_utils/parallel_slot.c:326
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "socket() ã®ã‚½ã‚±ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ãŒç¯„囲外ã§ã™: %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "Try fewer jobs."
+msgstr "ジョブ数を減らã—ã¦ã¿ã¦ãã ã•ã„。"
+
+#: ../../fe_utils/parallel_slot.c:553
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"ã®å‡¦ç†ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "中断ã•ã‚Œã¾ã—ãŸ\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "テーブルã®å†…容ã«è¦‹å‡ºã—を追加ã§ãã¾ã›ã‚“ã§ã—ãŸï¼šåˆ—æ•°%dãŒåˆ¶é™ã‚’越ãˆã¦ã„ã¾ã™ã€‚\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "テーブルã®å†…容ã«ã‚»ãƒ«ã‚’追加ã§ãã¾ã›ã‚“ã§ã—ãŸï¼šå…¨ã‚»ãƒ«æ•°%dãŒåˆ¶é™ã‚’越ãˆã¦ã„ã¾ã™ã€‚\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "出力フォーマットãŒç„¡åŠ¹(内部エラー):%d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "å•ã„åˆã‚ã›: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。"
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’åŒæ™‚ã«ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç‰¹å®šã®ãƒ†ãƒ¼ãƒ–ル(群)ã¯ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã§ãã¾ã›ã‚“"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"ã®ãƒ†ãƒ¼ãƒ–ル\"%1$s\"ã®ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"ã®ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: データベース\"%s\"をクラスタ化ã—ã¦ã„ã¾ã™\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr "%sã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã§äº‹å‰ã«ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã•ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルをクラスタ化ã—ã¾ã™ã€‚\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [オプション]... [データベースå]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’クラスタ化\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME クラスタ化ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーãƒãƒ¼ã¸é€ä¿¡ã•ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet メッセージを何も出力ã—ãªã„\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=テーブルå 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã¿ã‚’クラスタ化\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多é‡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"接続オプション:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n"
+" ディレクトリ\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§æŽ¥ç¶š\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力をè¦æ±‚ã—ãªã„\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password パスワードプロンプトを強制表示\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 別ã®ä¿å®ˆç”¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"詳細㯠SQL コマンド㮠CLUSTER ã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "å•ã„åˆã‚ã›ãŒ1è¡Œã§ã¯ãªã%d行返ã—ã¾ã—ãŸ: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s)"
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr " \"%s\" ã¾ãŸã¯ \"%s\" ã«ç­”ãˆã¦ãã ã•ã„\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" ã¯æœ‰åŠ¹ãªç¬¦å·åŒ–æ–¹å¼åã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "データベースã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸï¼š%s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "コメントã®ç”Ÿæˆã«å¤±æ•—(データベースã¯ç”Ÿæˆã•ã‚Œã¾ã—ãŸ): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベースを生æˆã—ã¾ã™ã€‚\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [オプション]... [データベースå] [説明]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE データベースã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ†ãƒ¼ãƒ–ルスペースå\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーãƒãƒ¼ã¸é€ä¿¡ã•ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING データベースã®ç¬¦å·åŒ–æ–¹å¼\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE データベースã®ãƒ­ã‚±ãƒ¼ãƒ«è¨­å®š\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE データベースã®LC_COLLATE設定\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE データベースã®LC_CTYPE設定\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE データベースã®ICUロケール設定\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=RULES データベースã®ICUルール(群)を設定\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" データベースã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆç…§åˆé †åºã®ãƒ­ã‚±ãƒ¼ãƒ«\n"
+" プロãƒã‚¤ãƒ€\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER æ–°ã—ã„データベースを所有ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGY データベース生æˆæ–¹æ³• wal_log ã¾ãŸã¯ file_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE コピーã™ã‚‹ãƒ†ãƒ³ãƒ—レートデータベース\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーãƒãƒ¼ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n"
+" ディレクトリ\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 接続ã™ã‚‹éš›ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password パスワード入力をè¦æ±‚ã—ãªã„\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password パスワードプロンプトを強制\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 別ã®ä¿å®ˆç”¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"デフォルトã§ã¯ã€ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨åŒåã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒç”Ÿæˆã•ã‚Œã¾ã™\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "追加ã—ãŸã„ロールåを入力:"
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "æ–°ã—ã„ロールã®ãŸã‚ã®ãƒ‘スワード: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "ã‚‚ã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„:"
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "パスワードãŒãƒžãƒƒãƒã—ã¾ã›ã‚“。\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "æ–°ã—ã„ロールをスーパーユーザーã«ã—ã¾ã™ã‹ï¼Ÿ"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "æ–°ã—ã„ロールã«å¯¾ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’作æˆã™ã‚‹æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "æ–°ã—ã„ロールã«å¯¾ã—ã¦åˆ¥ã®ãƒ­ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "パスワードã®æš—å·åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "æ–°ã—ã„ロールã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%sã¯æ–°ã—ã„PostgreSQLロールを作æˆã—ã¾ã™ã€‚\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [オプション]... [ロールå]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --with-admin=ROLE ROLEã¯æ–°ã—ã„ロールã®ADMINオプション付ãã®\n"
+" メンãƒãƒ¼ã¨ãªã‚‹\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N ロールã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³æ•°åˆ¶é™(デフォルト: 制é™ãªã—)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb ロールã¯æ–°ã—ã„データベースを作æˆå¯\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb ロールã¯æ–°ã—ã„データベースを作æˆä¸å¯(デフォルト)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROLE æ–°ã—ã„ロールをROLEã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã‚‹\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLE (--member-ofã«åŒã˜ã€éžæŽ¨å¥¨)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit ロールãŒãƒ¡ãƒ³ãƒãƒ¼ã¨ãªã‚‹ãƒ­ãƒ¼ãƒ«ç¾¤ã‹ã‚‰æ¨©é™ã‚’継承\n"
+" (デフォルト)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit 権é™ã‚’継承ã—ãªã„\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login ロールã¯ãƒ­ã‚°ã‚¤ãƒ³å¯èƒ½(デフォルト)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login ロールã¯ãƒ­ã‚°ã‚¤ãƒ³ä¸å¯\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROLE ROLEã¯æ–°ã—ã„ロールã®ãƒ¡ãƒ³ãƒã¨ãªã‚‹\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt æ–°ã—ã„ロールã«ãƒ‘スワードを割り当ã¦ã‚‹\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole ロールã¯åˆ¥ã®ãƒ­ãƒ¼ãƒ«ã‚’作æˆå¯\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole ロールã¯åˆ¥ã®ãƒ­ãƒ¼ãƒ«ã‚’作æˆä¸å¯(デフォルト)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser ロールをスーパーユーザーã«ã™ã‚‹\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser ロールをスーパーユーザーã«ã—ãªã„(デフォルト)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIMESTAMP\n"
+" ã“ã®ãƒ­ãƒ¼ãƒ«ã®ãƒ‘スワード有効期é™æ—¥æ™‚\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr " --interactive デフォルトを使ã‚ãšæœªæŒ‡å®šã®ãƒ­ãƒ¼ãƒ«åや属性ã¯å…¥åŠ›ã‚’促ã™\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls ロールã¯è¡Œã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼(RLS)を迂回ã§ãã‚‹\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls ロールã¯è¡Œã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼(RLS)を迂回ã§ããªã„\n"
+" (デフォルト)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication ロールã¯ãƒ¬ãƒ—リケーションを開始å¯èƒ½\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication ロールã¯ãƒ¬ãƒ—リケーションを開始ä¸å¯ (デフォルト)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦æŽ¥ç¶š(作æˆå¯¾è±¡ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ãªã„)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "å¿…é ˆã®å¼•æ•°ã§ã‚るデータベースåãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "データベース\"%s\"ã¯æ°¸ä¹…ã«å‰Šé™¤ã•ã‚Œã¾ã™ã€‚\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "実行ã—ã¾ã™ã‹ï¼Ÿ"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "データベースã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベースを削除ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [オプション]... [データベースå]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force 削除å‰ã«ä»–ã®æŽ¥ç¶šã®çµ‚了を試行\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive 何ã‹ã‚’削除ã™ã‚‹å‰ã«è­¦å‘Šã™ã‚‹\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists データベースãŒå­˜åœ¨ã—ãªã„å ´åˆã«ã‚¨ãƒ©ãƒ¼ã‚’報告ã—ãªã„\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "削除ã—ãŸã„ロールåを入力:"
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "å¿…é ˆã®å¼•æ•°ã§ã‚るロールåãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "ロール\"%s\"ã¯æ°¸ä¹…ã«å‰Šé™¤ã•ã‚Œã¾ã™\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "ロール\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLã®ãƒ­ãƒ¼ãƒ«ã‚’削除ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive 何ã‹ã‚’削除ã™ã‚‹å‰ã«å…¥åŠ›ã‚’促ã—ã€ã¾ãŸãƒ­ãƒ¼ãƒ«åãŒæŒ‡å®š\n"
+" ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ãã®å…¥åŠ›ã‚’促ã™\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists ユーザーãŒå­˜åœ¨ã—ãªã„å ´åˆã«ã‚¨ãƒ©ãƒ¼ã‚’報告ã—ãªã„\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¨ã—ã¦æŽ¥ç¶š(削除対象ユーザーã§ã¯ãªã„)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "デフォルトã®ã‚ªãƒ—ションをå–り出ã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "接続をå—ã‘付ã‘ã¦ã„ã¾ã™\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "接続を拒絶ã—ã¦ã„ã¾ã™\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "レスãƒãƒ³ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "施行ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "unknown\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベースã«å¯¾ã—ã¦æŽ¥ç¶šæ¤œæŸ»ã‚’発行ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME データベースå\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet メッセージを出力ã›ãšã«å®Ÿè¡Œã™ã‚‹\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n"
+" ディレクトリ\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS 接続試行時ã®å¾…機秒数ã€ã‚¼ãƒ­ã§ç„¡åŠ¹åŒ–(デフォルト: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§æŽ¥ç¶šã™ã‚‹\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "全データベースã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã®ä¸¡æ–¹ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "全データベースã«ãŠã‘る特定ã®ã‚¹ã‚­ãƒ¼ãƒž(群)ã®å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "全データベースã«ãŠã‘る特定ã®ãƒ†ãƒ¼ãƒ–ル(群)ã®å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "全データベースã«ãŠã‘る特定ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹(群)ã®å†ä½œæˆã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "特定ã®ã‚¹ã‚­ãƒ¼ãƒž(群)ã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "特定ã®ãƒ†ãƒ¼ãƒ–ル(群)ã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "特定ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "システムカタログã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã§ã¯è¤‡æ•°ã‚¸ãƒ§ãƒ–を使用ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "インデックスå†æ§‹ç¯‰ã«ã¯è¤‡æ•°ã‚¸ãƒ§ãƒ–を使用ã§ãã¾ã›ã‚“"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "PostgreSQL %2$sよりもå¤ã„サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯\"%1$s\"オプションã¯ä½¿ãˆã¾ã›ã‚“"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"中ã«ã‚るインデックス\"%1$s\"ã®å†ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"中ã«ã‚るスキーマ\"%1$s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "データベース\"%s\"中ã®ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース\"%2$s\"中ã«ã‚るテーブル\"%1$s\"ã®ã‚¤ãƒ³ã§ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: データベース\"%s\"ã‚’å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã—ã¦ã„ã¾ã™\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%sã¯PostgreSQLデータベースをå†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all 全データベースã§ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã‚’è¡Œã†\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently 並行インデックスå†æ§‹ç¯‰\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME インデックスå†æ§‹ç¯‰å¯¾è±¡ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX 指定ã—ãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹(群)ã®ã¿ã‚’å†æ§‹ç¯‰\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM インデックスå†æ§‹ç¯‰ã«ã“ã®æ•°ã®ä¸¦åˆ—接続を使用\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet メッセージを一切出力ã—ãªã„\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system システムカタログã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ã¿ã‚’å†æ§‹ç¯‰\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(群)ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ã¿ã‚’å†æ§‹ç¯‰\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å†æ§‹ç¯‰\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " -D, --tablespace=TABLESPACE インデックスå†æ§‹ç¯‰å…ˆã®ãƒ†ãƒ¼ãƒ–ル空間\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多é‡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"詳細ã¯SQLコマンドREINDEXã«é–¢ã™ã‚‹èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "analyzeã®ã¿ã‚’実行ã™ã‚‹å ´åˆ\"%s\"ã¯ä½¿ãˆã¾ã›ã‚“"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "完全(full)VACUUMを実行ã™ã‚‹å ´åˆã¯\"%s\"オプションã¯ä½¿ãˆã¾ã›ã‚“"
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "\"%s\"オプションã¯\"%s\"ã¨åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“"
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’åŒæ™‚ã«VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "全データベースã®ç‰¹å®šã®ãƒ†ãƒ¼ãƒ–ル(群)ã‚’VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "全データベースã®ç‰¹å®šã®ã‚¹ã‚­ãƒ¼ãƒž(群)ã‚’VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "全データベースã®ç‰¹å®šã®ã‚¹ã‚­ãƒ¼ãƒž(群)を除外ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "スキーマ(郡)ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルã¨ã€ç‰¹å®šã®ãƒ†ãƒ¼ãƒ–ル(郡)ã¨ã‚’åŒæ™‚ã«VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "特定ã®ãƒ†ãƒ¼ãƒ–ル(郡)ã®VACUUMã¨åŒæ™‚ã«ã‚¹ã‚­ãƒ¼ãƒž(郡)ã®é™¤å¤–ã‚’è¡Œã†ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "スキーマ(郡)ã®ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルã®VACUUMã¨åŒæ™‚ã«ã‚¹ã‚­ãƒ¼ãƒž(郡)ã®é™¤å¤–ã‚’è¡Œã†ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "メモリä¸è¶³ã§ã™"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "最é©åŒ–ã®ãŸã‚ã®æƒ…報を最å°é™ç”Ÿæˆã—ã¾ã™(1対象)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "最é©åŒ–ã®ãŸã‚ã®æƒ…報を複数生æˆã—ã¾ã™(10対象)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "最é©åŒ–ã®ãŸã‚ã®æƒ…報をデフォルト数(å…¨ã¦)生æˆã—ã¾ã™"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: データベース\"%s\"ã®å‡¦ç†ä¸­ã§ã™: %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: データベース\"%s\"ã‚’VACUUMã—ã¦ã„ã¾ã™\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "データベース \"%2$s\"ã®ãƒ†ãƒ¼ãƒ–ル\"%1$sã®VACUUMã«å¤±æ•—ã—ã¾ã—ãŸï¼š %3$s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "データベース\"%s\"ã®VACUUMã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr "%sã¯PostgreSQLデータベースã®ã‚´ãƒŸå›žåŽãŠã‚ˆã³åˆ†æžã‚’è¡Œã„ã¾ã™ã€‚\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all 全データベースをVACUUM\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=SIZE VACUUMã§ä½¿ç”¨ã™ã‚‹ãƒªãƒ³ã‚°ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME VACUUMã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã‚¹ã‚­ãƒƒãƒ—動作をç¦æ­¢\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo サーãƒãƒ¼ã¸é€ä¿¡ã•ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full VACUUM FULLを実行\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze 行トランザクション情報をå‡çµ\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr ""
+" --force-index-cleanup デッドタプルを指ã™ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã‚’常ã«\n"
+" 除去ã™ã‚‹\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM ãƒã‚­ãƒ¥ãƒ¼ãƒ æ™‚ã«æŒ‡å®šã—ãŸåŒæ™‚接続数を使用\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE VACUUM対象ã¨ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルã®æœ€å°ã®ãƒžãƒ«ãƒ\n"
+" トランザクションID差分\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE VACUUM対象ã¨ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルã®æœ€å°ã®\n"
+" トランザクションID差分\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr ""
+" --no-index-cleanup デッドタプルを指ã™ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã‚’\n"
+" 削除ã—ãªã„\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main メインリレーションをスキップ\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr ""
+" --no-process-toast テーブルã«é–¢é€£ã¥ãTOASTテーブルã®VACUUMã‚’\n"
+" スキップ\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate テーブル終端ã®ç©ºãƒšãƒ¼ã‚¸ã®åˆ‡ã‚Šè©°ã‚ã‚’è¡Œã‚ãªã„\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(郡)ã®ãƒ†ãƒ¼ãƒ–ルã®ã¿ã‚’VACUUMã™ã‚‹\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(郡)ã®ãƒ†ãƒ¼ãƒ–ルをVACUUMã—ãªã„\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLEL_WORKERS å¯èƒ½ã§ã‚ã‚Œã°VACUUMã§æŒ‡å®šã®æ•°ã®ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰\n"
+" ワーカーを使用\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet メッセージを出力ã—ãªã„\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked ç›´ã¡ã«ãƒ­ãƒƒã‚¯ã§ããªã‹ã£ãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’スキップ\n"
+
+#: vacuumdb.c:1179
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(複数å¯)ã®ã¿ã‚’VACUUM\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 多é‡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze 最é©åŒ–用統計情報を更新\n"
+
+#: vacuumdb.c:1183
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only 最é©åŒ–用統計情報ã®ã¿æ›´æ–°; ãƒã‚­ãƒ¥ãƒ¼ãƒ ã¯è¡Œã‚ãªã„\n"
+
+#: vacuumdb.c:1184
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages 高速化ã®ãŸã‚最é©åŒ–用統計情報ã®ã¿ã‚’複数段階ã§\n"
+" æ›´æ–°; VACUUMã¯è¡Œã‚ãªã„\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"詳細ã¯SQLコマンドã®VACUUMã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
diff --git a/src/bin/scripts/po/ka.po b/src/bin/scripts/po/ka.po
new file mode 100644
index 0000000..35eef33
--- /dev/null
+++ b/src/bin/scripts/po/ka.po
@@ -0,0 +1,1282 @@
+# Georgian message translation file for pgscripts
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pgscripts (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-04 08:19+0000\n"
+"PO-Revision-Date: 2024-01-05 09:30+0100\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდáƒáƒ›áƒ: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "warning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტáƒáƒšáƒ”ბი: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნებáƒ: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•áƒ”ნებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜áƒ\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•áƒœáƒ შეუძლებელიáƒ: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "პáƒáƒ áƒáƒšáƒ˜: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ (%s) მიერთებრშეუძლებელიáƒ: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე"
+
+#: ../../fe_utils/parallel_slot.c:317
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "მეტისმეტáƒáƒ“ ბევრი დáƒáƒ•áƒáƒšáƒ”ბრáƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ˜áƒ¡áƒ—ვის: %d"
+
+#: ../../fe_utils/parallel_slot.c:326
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "სáƒáƒ™áƒ”ტის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დესკრიპტáƒáƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•áƒ”ბ შუáƒáƒšáƒ”დს გáƒáƒ áƒ”თáƒáƒ ფუნქციისთვის select(): %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "Try fewer jobs."
+msgstr "სცáƒáƒ“ეთ ნáƒáƒ™áƒšáƒ”ბი დáƒáƒ•áƒáƒšáƒ”ბáƒ."
+
+#: ../../fe_utils/parallel_slot.c:553
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "ბáƒáƒ–ის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბის შეცდáƒáƒ›áƒ:%s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu მწკრივი)"
+msgstr[1] "(%lu მწკრივი)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "შეწყვეტილიáƒ\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე თáƒáƒ•áƒ¡áƒáƒ áƒ—ის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ%d გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე უჯრედის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: უჯრედების რáƒáƒáƒ“ენáƒáƒ‘რ%d-ზე მეტიáƒ.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (შიდრშეცდáƒáƒ›áƒ): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "მáƒáƒ—ხáƒáƒ•áƒœáƒ˜áƒ¡ შინáƒáƒáƒ áƒ¡áƒ˜: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "მითითებული ცხრილების ყველრბáƒáƒ–áƒáƒ¨áƒ˜ დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "ცხრილის (\"%s\"), ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რების პრáƒáƒ‘ლემáƒ: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "ბáƒáƒ–ის (\"%s\") დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რების შეცდáƒáƒ›áƒ: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: ბáƒáƒ–ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებáƒ: \"%s\"\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s áƒáƒšáƒáƒ’ებს ბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ“რე დáƒáƒšáƒáƒ’ებული ცხრილებს.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all ყველრბáƒáƒ–ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებáƒ\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი დáƒáƒ¡áƒáƒ™áƒšáƒáƒ¡áƒ”რებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ შეტყáƒáƒ‘ინებები\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=ცხრილი მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებáƒ\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•áƒ”ლთვის კითხვáƒ\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ სáƒáƒáƒ•áƒáƒ áƒ˜áƒ ბáƒáƒ–áƒ\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რების შესáƒáƒ®áƒ”ბ მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებრSQL ბრძáƒáƒœáƒ”ბის, CLUSTER, დეტáƒáƒšáƒ”ბში შეგიძლიáƒáƒ—.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ› %d მწკრივი დáƒáƒáƒ‘რუნáƒ, ერთის მáƒáƒ’იერ: %s"
+msgstr[1] "მáƒáƒ—ხáƒáƒ•áƒœáƒáƒ› %d მწკრივი დáƒáƒáƒ‘რუნáƒ, ერთის მáƒáƒ’იერ: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "ნáƒáƒœáƒ"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "უპáƒáƒ¡áƒ£áƒ®áƒ”თ \"%s\" áƒáƒœ \"%s\".\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" კáƒáƒ“ირების სწáƒáƒ  სáƒáƒ®áƒ”ლს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "ბáƒáƒ–ის შექმნის შეცდáƒáƒ›áƒ:%s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ (ბáƒáƒ–რშეიქმნáƒ): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის ბáƒáƒ–áƒáƒ¡ ქმნის.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი] [áƒáƒ¦áƒ¬áƒ”რáƒ]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=ცხრილებისსივრცე მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ცხრილების ნáƒáƒ’ულისხმები სივრცე\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " \\encoding [კáƒáƒ“ირებáƒ] კლიენტის კáƒáƒ“ირების ჩვენებრáƒáƒœ დáƒáƒ§áƒ”ნებáƒ\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=ენრბáƒáƒ–ის ენის პáƒáƒ áƒáƒ›áƒ”ტრები\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=ენრბáƒáƒ–ის LC_COLLATE პáƒáƒ áƒáƒ›áƒ”ტრი\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=ენრბáƒáƒ–ის LC_CTYPE პáƒáƒ áƒáƒ›áƒ”ტრი\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=ენრბáƒáƒ–ის ICU ენის პáƒáƒ áƒáƒ›áƒ”ტრი\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=წესი ბáƒáƒ–ის ICU წესის პáƒáƒ áƒáƒ›áƒ”ტრი\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ბáƒáƒ–ის ნáƒáƒ’ულისხმები კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ენის მáƒáƒ›áƒ¬áƒáƒ“ებელი\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=მფლáƒáƒ‘ელი áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ის მფლáƒáƒ‘ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=სტრáƒáƒ¢áƒ”გირბáƒáƒ–ის შექმნის სტრáƒáƒ¢áƒ”გიáƒ: wal_log áƒáƒœ file_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=შáƒáƒ‘ლáƒáƒœáƒ˜ ბáƒáƒ–ის დáƒáƒ¡áƒáƒ™áƒáƒžáƒ˜áƒ áƒ”ბელი შáƒáƒ‘ლáƒáƒœáƒ˜\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•áƒ”ლთვის კითხვáƒ\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ სáƒáƒáƒ•áƒáƒ áƒ˜áƒ ბáƒáƒ–áƒ\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"ნáƒáƒ’ულისხმებáƒáƒ“ შექმნილი ბáƒáƒ–ის სáƒáƒ®áƒ”ლáƒáƒ“ მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "შეიყვáƒáƒœáƒ”თ დáƒáƒ¡áƒáƒ›áƒáƒ¢áƒ”ბელი რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "შეყვáƒáƒœáƒ”თ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ˜: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "შეიყვáƒáƒœáƒ”თ კდევ ერთხელ: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევáƒ.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "იქნებრáƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "ექნებრáƒáƒ®áƒáƒš რáƒáƒšáƒ¡ ბáƒáƒ–ების შექმნის უფლებáƒ?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "ექნებრáƒáƒ®áƒáƒš რáƒáƒšáƒ¡ სხვრრáƒáƒšáƒ”ბის შექმნს უფლებáƒ?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ•áƒ áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL-ის რáƒáƒšáƒ¡ ქმნის.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [რáƒáƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --admin=რáƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ, áƒáƒ“მინისტრირების\n"
+" პáƒáƒ áƒáƒ›áƒ”ტრით\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N რáƒáƒšáƒ˜áƒ¡ შეერთებების ლიმიტი (ნáƒáƒ’ულისხმები: ლიმიტის გáƒáƒ áƒ”შე)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb რáƒáƒšáƒ¡ შეუძლირáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების შექმნáƒ\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb რáƒáƒšáƒ¡ ბáƒáƒ–ების შექმნრáƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ› რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=რáƒáƒšáƒ˜ (იგივე, რáƒáƒª --member-of, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•áƒ”ლებულიáƒ)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit რáƒáƒ›áƒšáƒ˜ მემკვიდრეáƒáƒ‘ით იღებს იმ რáƒáƒšáƒ”ბსáƒáƒª, რáƒáƒ›áƒšáƒ˜áƒ¡\n"
+" წევრიც თვითáƒáƒœáƒáƒ (ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit რáƒáƒšáƒ˜ პრივილეგიებს მემკვიდრეáƒáƒ‘ით áƒáƒ  მიიღებს\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login რáƒáƒšáƒ˜áƒ— შესვლრშეიძლებრ(ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login რáƒáƒšáƒ¡ შესვლრáƒáƒ  შეუძლიáƒ\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=რáƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt რáƒáƒšáƒ˜áƒ¡áƒ—ვის პáƒáƒ áƒáƒšáƒ˜áƒ¡ მინიჭებáƒ\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole რáƒáƒšáƒ¡ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ”ბის შექმნრშეუძლიáƒ\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole რáƒáƒšáƒ¡ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ”ბის შექმნრáƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი იქნებáƒ\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser რáƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  იქნებრ(ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=დრáƒáƒ˜áƒ¡áƒ¨áƒ¢áƒáƒ›áƒžáƒ˜\n"
+" პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•áƒ˜áƒ¡ თáƒáƒ áƒ˜áƒ¦áƒ˜ დრდრრრáƒáƒšáƒ˜áƒ¡áƒ—ვის\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive ნáƒáƒ’ულისხმები მნიშვნელáƒáƒ‘ების გáƒáƒ›áƒáƒ§áƒ”ნების მáƒáƒ’იერ რáƒáƒšáƒ˜áƒ¡ \n"
+" ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ სáƒáƒ®áƒ”ლისრდრáƒáƒ¢áƒ áƒ˜áƒ‘უტების ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒáƒ“ კითხვáƒs\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls რáƒáƒšáƒ¡ შეუძლირáƒáƒ˜áƒªáƒ˜áƒšáƒáƒ¡ მწკრივის დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის (RLS) წესები\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls რáƒáƒšáƒ¡ მწკრივის დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესების (RLS) áƒáƒªáƒ˜áƒšáƒ”ბáƒ\n"
+" áƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication რáƒáƒšáƒ¡ შეუძლირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ინიცირებáƒ\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication რáƒáƒšáƒ¡ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ინიცირებრáƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი სერვერთáƒáƒœ მიერთების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ის áƒáƒ áƒ, რáƒáƒ›áƒ”ლსáƒáƒª ქმნით)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "áƒáƒ™áƒšáƒ˜áƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი áƒáƒ áƒ’უმენტი: ბáƒáƒ–ის სáƒáƒ®áƒ”ლი"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ბრძáƒáƒœáƒ“ებით?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "ბáƒáƒ–ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ:%s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s წáƒáƒ¨áƒšáƒ˜áƒ¡ PostgreSQL ბáƒáƒ–áƒáƒ¡.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force შეერთებების დáƒáƒ®áƒ£áƒ áƒ•áƒ მáƒáƒ— გáƒáƒ—იშვáƒáƒ›áƒ“ე\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive გკითხáƒáƒ•, სáƒáƒœáƒáƒ› რáƒáƒ›áƒ”ს წáƒáƒ•áƒ¨áƒšáƒ˜\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists თუ ბáƒáƒ–რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, შეცდáƒáƒ›áƒ áƒáƒ  áƒáƒ›áƒáƒáƒ’დáƒ\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "შეიყვáƒáƒœáƒ”თ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლი რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "áƒáƒ™áƒšáƒ˜áƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი áƒáƒ áƒ’უმენტი: რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "რáƒáƒšáƒ˜ \"%s\" სáƒáƒ›áƒ£áƒ“áƒáƒ›áƒáƒ“ წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s წáƒáƒ¨áƒšáƒ˜áƒ¡ PostgreSQL-ის რáƒáƒšáƒ¡.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive გკითხáƒáƒ•, სáƒáƒœáƒáƒ› რáƒáƒ›áƒ”ს წáƒáƒ•áƒ¨áƒšáƒ˜\n"
+" დრგკითხáƒáƒ• რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლსáƒáƒª, თუ მითითბული áƒáƒ áƒáƒ\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists თუ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, შეცდáƒáƒ›áƒ áƒáƒ  áƒáƒ›áƒáƒáƒ’დáƒ\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი სერვერთáƒáƒœ მიერთების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ის áƒáƒ áƒ, რáƒáƒ›áƒ”ლსáƒáƒª შლით)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "ნáƒáƒ’ულისხმები პáƒáƒ áƒáƒ›áƒ”ტრების გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ˜áƒ¡ შეცდáƒáƒ›áƒ"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "მზáƒáƒ“áƒáƒ შეერთებისთვის\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "უáƒáƒ áƒ§áƒáƒ¤áƒ¡ შეერთებáƒáƒ¡\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒ áƒ”შე\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "მცდელáƒáƒ‘ის გáƒáƒ áƒ”შე\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "უცნáƒáƒ‘ი\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ კáƒáƒ•áƒ¨áƒ˜áƒ áƒ¡ áƒáƒ›áƒáƒ¬áƒ›áƒ”ბს.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet ჩუმáƒáƒ“ გáƒáƒ¨áƒ•áƒ”ბáƒ\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=წáƒáƒ›áƒ˜ შეერთების ლáƒáƒ“ინის ვáƒáƒ“áƒ, წáƒáƒ›áƒ”ბში. 0 გáƒáƒ—იშáƒáƒ•áƒ¡ (ნáƒáƒ’ულისხმები: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "ყველრბáƒáƒ–ის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "მითითებული სქემის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "მითითებული ცხრილის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "მითითებული ინდექსის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "მითითებული სქემის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "მითითებული ცხრილის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "მითითებული ინდექსის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების რეინდექსისთვის ბევრი დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "ინდექსების რეინდექსისთვის ბევრი დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრPostgreSQL-ის ვერსიáƒáƒ¨áƒ˜ \"%s\" áƒáƒœ უფრრძველში"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "ბáƒáƒ–ის (\"%s\") რეინდექსის პრáƒáƒ‘ლემáƒ: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "რეინდექსის შეცდáƒáƒ›áƒ ინდექსისთვის \"%s\" ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "რეინდექსის შეცდáƒáƒ›áƒ სქემისთვის \"%s\" ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების რეინდექსის შეცდáƒáƒ›áƒ ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "რეინდექსის შეცდáƒáƒ›áƒ ცხრილისთვის \"%s\" ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: ბáƒáƒ–ის თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებრ\"%s\"\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ბáƒáƒ–ის თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებáƒ.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all ყველრბáƒáƒ–ის თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებáƒ\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently ერთდრáƒáƒ£áƒšáƒ˜ ინდექსირებáƒ\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი დáƒáƒ¡áƒáƒ˜áƒœáƒ“ექსებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=ინდექსი მითითებული ინდექს(ებ)-ი თáƒáƒ•áƒ˜áƒ“áƒáƒœ შეიქმნებáƒ\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=რიცხვი თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებისთვის მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის შეერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ შეტყáƒáƒ‘ინებები\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system მáƒáƒ®áƒ“ებრმხáƒáƒšáƒáƒ“ სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებáƒ\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=სქემრმáƒáƒ®áƒ“ებრმხáƒáƒšáƒáƒ“ მითითებული სქემების თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებáƒ\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=ცხრილი მáƒáƒ®áƒ“ებრმხáƒáƒšáƒáƒ“ მითითებული ცხრილების თáƒáƒ•áƒ˜áƒ“áƒáƒœ ინდექსირებáƒ\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=ცხრილებისსივრცე ცხრილების სივრცე, სáƒáƒ“áƒáƒª რეინდექსი მáƒáƒ®áƒ“ებáƒ\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"მეტი დეტáƒáƒšáƒ”ბისთვის იხილეთ SQL-ის ბრძáƒáƒœáƒ”ბის, REINDEX-ის დეტáƒáƒšáƒ”ბი.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "მხáƒáƒšáƒáƒ“ áƒáƒœáƒáƒšáƒ˜áƒ–ის დრáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "სრული დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დრáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრთáƒáƒœ ერთáƒáƒ“ \"%s\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ"
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "მითითებული ცხრილების ყველრბáƒáƒ–áƒáƒ¨áƒ˜ დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "ყველრბáƒáƒ–áƒáƒ¨áƒ˜ მითითებულ სქემებს ვერ მáƒáƒ•áƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბ"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "ყველრბáƒáƒ–იდáƒáƒœ მითითებულ სქემებს ვერ áƒáƒ›áƒáƒ•áƒ˜áƒ¦áƒ”ბ"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "სქემებში ყველრცხრილის დრმითითებული ცხრილების ერთდრáƒáƒ£áƒšáƒ˜ მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "მითითებულ ცხრილების მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრდრსქემების გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•áƒ ერთდრáƒáƒ£áƒšáƒáƒ“ შეუძლებელიáƒ"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "სქემებში ყველრცხრილის მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრდრáƒáƒ›áƒáƒ•áƒ” დრáƒáƒ¡ სქემების გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•áƒ შეუძლებელიáƒ"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ მინიმáƒáƒšáƒ£áƒ áƒ˜ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ (1 სáƒáƒ›áƒ˜áƒ–ნე)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ (10 სáƒáƒ›áƒ˜áƒ–ნე)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ ნáƒáƒ’ულისხმები (სრული) სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: ბáƒáƒ–ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•áƒ”ბრ\"%s\": %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: ბáƒáƒ–ის \"%s\" დáƒáƒ›áƒ¢áƒ•áƒ”რáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "ცხრილის (\"%s\") (ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\") დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის პრáƒáƒ‘ლემáƒ: %s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "ბáƒáƒ–ის (\"%s\") დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის პრáƒáƒ‘ლემáƒ: %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL ბáƒáƒ–ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ”ბრდრáƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒ.\n"
+"\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all ყველრბáƒáƒ–ის დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=ზáƒáƒ›áƒ მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის გáƒáƒ›áƒáƒ§áƒ”ნებული რგáƒáƒšáƒ˜áƒ¡ ბáƒáƒ¤áƒ”რის ზáƒáƒ›áƒ\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი დáƒáƒ¡áƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბელი ბáƒáƒ–ები\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping გვერდის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბის ყველრვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვáƒ\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ˜áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full სრული დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze მწკრივის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ§áƒ˜áƒœáƒ•áƒ\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup ინდექსის ჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც მკვდáƒáƒ  მáƒáƒœáƒáƒªáƒ”მებზე მიუთითებენ, ყáƒáƒ•áƒ”ლთვის წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=რიცხვი დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის შეერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE დáƒáƒ¡áƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბელი ცხრილების მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¡áƒáƒ™áƒ˜\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE დáƒáƒ¡áƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბელი ცხრილების ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის ID-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¡áƒáƒ™áƒ˜\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup ინდექსის ჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც მკვდáƒáƒ  მáƒáƒœáƒáƒªáƒ”მებზე მიუთითებენ, áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main მთáƒáƒ•áƒáƒ áƒ˜ ურთიერთáƒáƒ‘ის გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ ცხრილთáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული TOAST cxrilis gamotoveba\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate ცხრილის ბáƒáƒšáƒáƒ¨áƒ˜ ცáƒáƒ áƒ˜áƒ”ლი გვერდები áƒáƒ  მáƒáƒ˜áƒ™áƒ•áƒ”თებáƒ\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=სქემრცხრილების, მხáƒáƒšáƒáƒ“, მითითებულ სქემებში მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=სქემრმითითებული სქემებში ცხრილები მáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბული áƒáƒ  იქნებáƒ\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=პáƒáƒ áƒáƒšáƒ”ლური_დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”_პრáƒáƒªáƒ”სი დáƒáƒ¡áƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბლáƒáƒ“ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ, თუ ეს შესáƒáƒ«áƒšáƒ”ბელიáƒ\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ შეტყáƒáƒ‘ინებები\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბული იქნებრურთიერთáƒáƒ‘ები, რáƒáƒ›áƒšáƒ˜áƒ¡ მáƒáƒ¨áƒ˜áƒœáƒ•áƒ” ჩáƒáƒ™áƒ”ტვáƒáƒª შეუძლებელიáƒ\n"
+
+#: vacuumdb.c:1179
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='ცხრილი[(სვეტები)]' მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n"
+
+#: vacuumdb.c:1183
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only მხáƒáƒšáƒáƒ“ áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ; დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის გáƒáƒ áƒ”შე\n"
+
+#: vacuumdb.c:1184
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages უკეთესი შედეგებისთვის áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡\n"
+" მრáƒáƒ•áƒáƒšáƒ¡áƒáƒ¤áƒ”ხურიáƒáƒœáƒ˜ რეჟიმი; დáƒáƒ›áƒ¢áƒ•áƒ”რსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის გáƒáƒ áƒ”შე\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•áƒšáƒ\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის იხილეთ SQL ბრძáƒáƒœáƒ”ბის, VACUUM -ის დეტáƒáƒšáƒ”ბი.\n"
+
+#, c-format
+#~ msgid "cannot reindex system catalogs concurrently, skipping all"
+#~ msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ. ყველáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•áƒ”ბáƒ"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "--locale დრ--lc-collate მხáƒáƒšáƒáƒ“ ერთ ერთი შეიძლებრიყáƒáƒ¡ მითითებული"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "--locale დრ--lc-ctype მხáƒáƒšáƒáƒ“ ერთ ერთი შეიძლებრიყáƒáƒ¡ მითითებული"
diff --git a/src/bin/scripts/po/ko.po b/src/bin/scripts/po/ko.po
new file mode 100644
index 0000000..9df2d7b
--- /dev/null
+++ b/src/bin/scripts/po/ko.po
@@ -0,0 +1,1347 @@
+# Korean message translation file for PostgreSQL pgscripts
+# Ioseph Kim <ioseph@uri.sarang.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:51+0000\n"
+"PO-Revision-Date: 2023-05-26 13:22+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "ìƒì„¸ì •ë³´: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "메모리 부족\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(내부 오류)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "UID %ld 해당하는 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "ì‚¬ìš©ìž ì—†ìŒ"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류번호 %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "취소 ìš”ì²­ì„ ì „ì†¡í•¨\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "취소 ìš”ì²­ì„ ì „ì†¡í•  수 ì—†ìŒ: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "암호:"
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²° í•  수 ì—†ìŒ: 메모리 부족"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" ê°’ì€ \"%s\" 옵션 값으로 유효하지 ì•ŠìŒ"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다."
+
+#: ../../fe_utils/parallel_slot.c:299
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "ì´ ìš´ì˜ì²´ì œì—서는 너무 ë§Žì€ ë™ì‹œ ìž‘ì—…ìž„"
+
+#: ../../fe_utils/parallel_slot.c:520
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ ìž‘ì—… 실패: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu개 행)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "ì¸íŠ¸ëŸ½íŠ¸ë°œìƒ\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "í…Œì´ë¸” ë‚´ìš©ì— í—¤ë”를 추가할 수 ì—†ìŒ: ì—´ 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "í…Œì´ë¸” ë‚´ìš©ì— ì…€ì„ ì¶”ê°€í•  수 ì—†ìŒ: ì´ ì…€ 수가 %d개를 초과했습니다.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ìž˜ëª»ëœ ì¶œë ¥ í˜•ì‹ (내부 오류): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "쿼리 실패: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "사용한 쿼리: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "명령행 ì¸ìžë¥¼ 너무 ë§Žì´ ì§€ì •í–ˆìŠµë‹ˆë‹¤ (시작: \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "모든 DB ìž‘ì—…ê³¼ 특정 DB ìž‘ì—…ì€ ë™ì‹œì— í•  수 없습니다."
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "모든 DB를 대ìƒìœ¼ë¡œ 특정 í…Œì´ë¸”ë“¤ì„ í´ëŸ¬ìŠ¤í„°í•  수 ì—†ìŒ"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" í…Œì´ë¸”(해당DB: \"%s\") í´ëŸ¬ìŠ¤í„° ìž‘ì—… 실패: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„° 실패: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìŠ¤ í´ëŸ¬ìŠ¤í„° ìž‘ì—… 중\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ DB 안ì—ì„œ ì´ì „ì— í´ëŸ¬ìŠ¤í„°ëœ 모든 í…Œì´ë¸”ì„ ì°¾ì•„\n"
+"다시 í´ëŸ¬ìŠ¤í„° ìž‘ì—…ì„ í•©ë‹ˆë‹¤.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1127
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1128
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [옵션]... [DBì´ë¦„]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1129
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œ\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME í´ëŸ¬ìŠ¤í„° ìž‘ì—…í•  DB\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 서버로 보내는 ìž‘ì—… ëª…ë ¹ì„ ë³´ì—¬ì¤Œ\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ì–´ë– í•œ ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ ì•ŠìŒ\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE 지정한 í…Œì´ë¸”들만 í´ëŸ¬ìŠ¤í„°\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose ë§Žì€ ì¶œë ¥ 작성\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"연결 옵션들:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME ë°ì´í„°ë² ì´ìŠ¤ 서버 호스트 ë˜ëŠ” 소켓 디렉터리\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìŠ¤ 서버 í¬íŠ¸\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1161
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ì ‘ì†í•  사용ìžì´ë¦„\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 암호 프롬프트 표시함\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1164
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 대체용 관리 ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"보다 ìžì„¸í•œ ë‚´ìš©ì€ CLUSTER SQL 명령어 설명서를 참조하십시오.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1166
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"ë¬¸ì œì  ë³´ê³  주소: <%s>\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1167
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페ì´ì§€: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "쿼리ì—ì„œ í•œ 개가 ì•„ë‹Œ %dê°œì˜ í–‰ì„ ë°˜í™˜: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "\"%s\" ë˜ëŠ” \"%s\" 만 허용합니다.\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" ì´ë¦„ì€ ìž˜ëª»ëœ ì¸ì½”딩 ì´ë¦„ìž„"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ 만들기 실패: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "코멘트 추가하기 실패 (ë°ì´í„°ë² ì´ìŠ¤ëŠ” 만들어졌ìŒ): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만듭니다.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [옵션]... [DBì´ë¦„] [설명]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr ""
+" -D, --tablespace=TABLESPACE ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 위한 기본 í…Œì´ë¸”스페ì´ìŠ¤\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 서버로 보내는 ìž‘ì—… ëª…ë ¹ë“¤ì„ ë³´ì—¬ì¤Œ\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING ë°ì´í„°ë² ì´ìŠ¤ ì¸ì½”딩\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE ë°ì´í„°ë² ì´ìŠ¤ì˜ 로캘 설정\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE ë°ì´í„°ë² ì´ìŠ¤ì˜ LC_COLLATE 설정\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE ë°ì´í„°ë² ì´ìŠ¤ì˜ LC_CTYPE 설정\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE ë°ì´í„°ë² ì´ìŠ¤ ICU 로캘 설정\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=RULES ë°ì´í„°ë² ì´ìŠ¤ ICU 룰 설정\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default "
+"collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" ë°ì´í„°ë² ì´ìŠ¤ 기본 ë¬¸ìž ì •ë ¬ì„ ìœ„í•œ ë¡œì¼€ì¼ ì œê³µ"
+"ìž\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER ë°ì´í„°ë² ì´ìŠ¤ 소유주\n"
+
+#: createdb.c:302
+#, c-format
+msgid ""
+" -S, --strategy=STRATEGY database creation strategy wal_log or "
+"file_copy\n"
+msgstr ""
+" -S, --strategy=STRATEGY ë°ì´í„°ë² ì´ìŠ¤ 만드는 ì „ëžµ(wal_log ë˜ëŠ” "
+"file_copy)\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE 복사할 템플릿 ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME ë°ì´í„°ë² ì´ìŠ¤ 서버 호스트나 소켓 디렉터리\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìŠ¤ 서버 í¬íŠ¸\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ì ‘ì†í•  사용ìž\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 암호 프롬프트 표시함\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 대체용 관리 ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"초기값으로, DBì´ë¦„ì„ ì§€ì •í•˜ì§€ 않으면, 현재 사용ìžì˜ ì´ë¦„ê³¼ ê°™ì€ ë°ì´í„°ë² ì´ìŠ¤"
+"가 만들어집니다.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "추가할 새 롤(role)ì´ë¦„: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "새 ë¡¤ì˜ ì•”í˜¸: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "암호 확ì¸: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "암호가 서로 틀림.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "새 ë¡¤ì„ superuser 권한으로 지정할까요?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "ì´ ìƒˆ 롤ì—게 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있는 ê¶Œí• ì„ ì¤„ê¹Œìš”?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "ì´ ìƒˆ 롤ì—게 ë˜ ë‹¤ë¥¸ ë¡¤ì„ ë§Œë“¤ 수 있는 ê¶Œí•œì„ ì¤„ê¹Œìš”?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "암호 암호화 실패: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "새 롤 만들기 실패: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë¡¤ì„ ë§Œë“­ë‹ˆë‹¤.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [옵션]... [롤ì´ë¦„]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --with-admin=ROLE 지정한 ë¡¤ì´ ìƒˆë¡œ 만들어질 ë¡¤ì˜ ê´€ë¦¬ 권한있는\n"
+" 소ì†ì›ì´ ë¨\n"
+
+#: createuser.c:420
+#, c-format
+msgid ""
+" -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N 연결 제한 수 (초기값: 무제한)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb 새 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있ìŒ\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있는 권한 ì—†ìŒ (초기값)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROLE 만들어지는 ë¡¤ì´ ì´ ROLEì˜ êµ¬ì„±ì›ì´ ë¨\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLE (--member-of와 ê°™ìŒ, 옛날 옵션)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit ë¡¤ì˜ ê¶Œí•œì„ ìƒì†í•  수 있ìŒ\n"
+" (초기값)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit ì´ ë¡¤ì˜ ê¶Œí•œì„ ìƒì†í•  수 ì—†ìŒ\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login ë¡œê·¸ì¸ í—ˆìš© (초기값)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login ë¡œê·¸ì¸ í•  수 ì—†ìŒ\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROLE ROLEì´ ìƒˆë¡œ 만들 ë¡¤ì˜ ì†Œì†ì›ì´ ë¨\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt 새 ë¡¤ì˜ ì•”í˜¸ 지정\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole 새 ë¡¤ì„ ë§Œë“¤ 수 있ìŒ\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole 롤 만들 수 있는 권한 ì—†ìŒ (초기값)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser superuser 권한으로 지정\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser 슈í¼ìœ ì € 권한 ì—†ìŒ (초기값)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIMESTAMP\n"
+" 비밀번호 유효기한 지정\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes "
+"rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive 롤 ì´ë¦„ê³¼ ì†ì„±ì„ ì´ˆê¸°ê°’ì„ ì“°ì§€ ì•Šê³ \n"
+" ê°ê° ì§ì ‘ ìž…ë ¥ ì„ íƒ í•¨\n"
+
+#: createuser.c:442
+#, c-format
+msgid ""
+" --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls ë¡¤ì´ í–‰ 단위 보안 (RLS) ì •ì±…ì„ ë¬´ì‹œí•¨\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) "
+"policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls ë¡¤ì´ í–‰ 단위 보안 (RLS) ì •ì±…ì„ ë¬´ì‹œ 못함\n"
+" (기본값)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication 복제 기능 ì´ìš©í•  수 있는 롤\n"
+
+#: createuser.c:446
+#, c-format
+msgid ""
+" --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication 복제 권한 ì—†ìŒ (기본값)\n"
+
+#: createuser.c:451
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=USERNAME ì„œë²„ì— ì ‘ì†í•  사용ìž\n"
+" (사용ìžë§Œë“¤ê¸° ìž‘ì—…ì„ í•  사용ìž)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "필수 í•­ëª©ì¸ ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ê°€ 완전히 ì‚­ì œ ë  ê²ƒìž…ë‹ˆë‹¤.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "ì •ë§ ê³„ì† í• ê¹Œìš”? (y/n) "
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "ë°ì´í„°ë² ì´ìŠ¤ ì‚­ì œ 실패: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 삭제합니다.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [옵션]... DBì´ë¦„\n"
+
+#: dropdb.c:176
+#, c-format
+msgid ""
+" -f, --force try to terminate other connections before "
+"dropping\n"
+msgstr " -f, --force ì‚­ì œ ì „ì— ì ‘ì†í•œ 다른 세션들 강제로 ëŠìŒ\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive 지우기 ì „ì— í•œ 번 ë” ë¬¼ì–´ë´„\n"
+
+#: dropdb.c:179
+#, c-format
+msgid ""
+" --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists 해당 ë°ì´í„°ë² ì´ìŠ¤ê°€ ì—†ì–´ë„ ì˜¤ë¥˜ë¥¼ 보고하지 ì•ŠìŒ\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "삭제할 롤 ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "롤 ì´ë¦„ì€ í•„ìˆ˜ ìž…ë ¥ ì¸ìžìž…니다"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" ë¡¤ì€ ì˜êµ¬ížˆ ì‚­ì œë  ê²ƒìž…ë‹ˆë‹¤.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "\"%s\" 롤 삭제 실패: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë¡¤ì„ ì‚­ì œí•©ë‹ˆë‹¤.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive 롤 ì´ë¦„ì„ ìž…ë ¥í•˜ì§€ 않았다면,\n"
+" 해당 ì´ë¦„ì„ ë¬¼ì–´ë´„\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists 해당 ë¡¤ì´ ì—†ì–´ë„ ì˜¤ë¥˜ë¥¼ 보고하지 ì•ŠìŒ\n"
+
+#: dropuser.c:182
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME ì´ ìž‘ì—…ì„ ì§„í–‰í•  DBì— ì ‘ì†í•  사용ìž\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "기본 옵션 ê°’ì„ ê°€ì ¸ì˜¬ 수 ì—†ìŒ"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "ì ‘ì†ì„ 받아드리는 중\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "ì ‘ì†ì„ 거절하는 중\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "ì‘답 ì—†ìŒ\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "ì‹œë„ ì—†ìŒ\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "알수없ìŒ\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ ì ‘ì†ì„ 검사합니다.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [옵션]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME ë°ì´í„°ë² ì´ìŠ¤ ì´ë¦„\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet 조용히 실행함\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=HOSTNAME ì ‘ì†í•  ë°ì´í„°ë² ì´ìŠ¤ 서버 ë˜ëŠ” 소켓 디렉터리\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìŠ¤ 서버 í¬íŠ¸\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid ""
+" -t, --timeout=SECS seconds to wait when attempting connection, 0 "
+"disables (default: %s)\n"
+msgstr " -t, --timeout=초 연결 제한 시간, 0 무제한 (초기값: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME ì ‘ì†í•  사용ìžì´ë¦„\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr ""
+"모든 ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ê³¼ 특정 ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행"
+"할 수 없습니다"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr ""
+"모든 ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ê³¼ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 "
+"수 없습니다"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr ""
+"모든 ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—ì„œ 특정 ìŠ¤í‚¤ë§ˆë“¤ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 ì—†"
+"습니다"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr ""
+"모든 ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—ì„œ 특정 í…Œì´ë¸”ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 없습"
+"니다"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr ""
+"모든 ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—ì„œ 특정 ì¸ë±ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 없습니"
+"다"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "특정 스키마와 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "특정 í…Œì´ë¸”ê³¼ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "특정 ì¸ë±ìŠ¤ì™€ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë³‘ë ¬ë¡œ 처리할 수 ì—†ìŒ"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "ì¸ë±ìŠ¤ 다시 만들기ì—서는 다중 ìž‘ì—…ì„ ì‚¬ìš©í•  수 ì—†ìŒ"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523
+#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556
+#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568
+#, c-format
+msgid ""
+"cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "\"%s\" ì˜µì…˜ì€ PostgreSQL %s 버전보다 ì˜¤ëž˜ëœ ì„œë²„ì—서는 사용할 수 ì—†ìŒ"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" ì¸ë±ìŠ¤(해당DB: \"%s\") ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" 스키마(해당DB: \"%s\") ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" í…Œì´ë¸”(해당DB: \"%s\") ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—… 중\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•©ë‹ˆë‹¤.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìŠ¤ 재색ì¸\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently í…Œì´ë¸” 잠그지 않는 재색ì¸\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME 지정한 ë°ì´í„°ë² ì´ìŠ¤ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX 지정한 ì¸ë±ìŠ¤ë“¤ë§Œ 다시 만듬\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"reindex\n"
+msgstr ""
+" -j, --jobs=NUM ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì—¬ëŸ¬ê°œì˜ ì—°ê²°ë¡œ ë™ì‹œì— 작업함\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ì–´ë– í•œ ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ ì•ŠìŒ\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system 시스템 카탈로그 재색ì¸\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA 지정한 스키마들 ìžë£Œë§Œ ë¤í”„\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE 지정한 í…Œì´ë¸”들만 ìž¬ìƒ‰ì¸ ìž‘ì—…\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=TABLESPACE ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 위한 기본 í…Œì´ë¸”스페ì´ìŠ¤\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose ìž‘ì—…ë‚´ì—­ì˜ ìžì„¸í•œ 출력\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"보다 ìžì„¸í•œ ë‚´ìš©ì€ REINDEX SQL 명령어 설명서를 참조하십시오.\n"
+
+#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322
+#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "통계 수집 ì „ìš© ìž‘ì—…ì—서는 \"%s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ"
+
+#: vacuumdb.c:343
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "full vacuum ìž‘ì—…ì—서는 \"%s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ"
+
+#: vacuumdb.c:349 vacuumdb.c:357
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "\"%s\" 옵션과 \"%s\" ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 ì—†ìŒ"
+
+#: vacuumdb.c:428
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr ""
+"-a ì˜µì…˜ì´ ìžˆì„ ê²½ìš°ëŠ” í•œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다."
+
+#: vacuumdb.c:432
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” 특정 í…Œì´ë¸”ë“¤ì„ ì²­ì†Œí•  수는 ì—†ìŒ"
+
+#: vacuumdb.c:436
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” 특정 ìŠ¤í‚¤ë§ˆë“¤ì„ ì²­ì†Œí•  수는 ì—†ìŒ"
+
+#: vacuumdb.c:440
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” 특정 스키마를 제외할 수 ì—†ìŒ"
+
+#: vacuumdb.c:444
+#, c-format
+msgid ""
+"cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr ""
+"스키마 ì•ˆì— ìžˆëŠ” 모든 í…Œì´ë¸”ì„ ì²­ì†Œí•˜ëŠ” 것과 특정 í…Œì´ë¸”만 청소하는 ê²ƒì„ ë™ì‹œ"
+"ì— í•  수 ì—†ìŒ"
+
+#: vacuumdb.c:448
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "특정 í…Œì´ë¸”만 청소하는 것과 스키마를 제외하는 ê²ƒì€ ë™ì‹œì— í•  수 ì—†ìŒ"
+
+#: vacuumdb.c:452
+#, c-format
+msgid ""
+"cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr ""
+"스키마 안 모든 í…Œì´ë¸”만 청소하는 것과 스키마를 제외하는 ê²ƒì€ ë™ì‹œì— í•  수 ì—†"
+"ìŒ"
+
+#: vacuumdb.c:496
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "최소 최ì í™” 통계 수집 수행 중 (1% 대ìƒ)"
+
+#: vacuumdb.c:497
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "ì¼ë°˜ 최ì í™” 통계 수집 수행 중 (10% 대ìƒ)"
+
+#: vacuumdb.c:498
+msgid "Generating default (full) optimizer statistics"
+msgstr "최대 최ì í™” 통계 수집 수행중 (모든 ìžë£Œ 대ìƒ)"
+
+#: vacuumdb.c:577
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìŠ¤ ìž‘ì—… 중: %s\n"
+
+#: vacuumdb.c:580
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 청소 중\n"
+
+#: vacuumdb.c:1115
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%s\" í…Œì´ë¸” (해당 DB: \"%s\") 청소하기 실패: %s"
+
+#: vacuumdb.c:1118
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ 청소하기 실패: %s"
+
+#: vacuumdb.c:1126
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ ìžë£Œ 정리 ë°\n"
+"퀴리 최ì í™”ê¸°ì˜ ì°¸ê³  ìžë£Œë¥¼ 갱신합니다.\n"
+"\n"
+
+#: vacuumdb.c:1130
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìŠ¤ 청소\n"
+
+#: vacuumdb.c:1131
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=SIZE 청소를 위한 ë§ ë²„ì»¤ í¬ê¸°\n"
+
+#: vacuumdb.c:1132
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME DBNAME ë°ì´í„°ë² ì´ìŠ¤ 청소\n"
+
+#: vacuumdb.c:1133
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping 모든 page-skipping 기능 비활성화\n"
+
+#: vacuumdb.c:1134
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr " -e, --echo 서버로 보내는 ëª…ë ¹ë“¤ì„ ë³´ì—¬ì¤Œ\n"
+
+#: vacuumdb.c:1135
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full 대청소\n"
+
+#: vacuumdb.c:1136
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze í–‰ 트랜잭션 ì •ë³´ ë™ê²°\n"
+
+#: vacuumdb.c:1137
+#, c-format
+msgid ""
+" --force-index-cleanup always remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --force-index-cleanup ì‚­ì œëœ íŠœí”Œ ëŒ€ìƒ ì¸ë±ìŠ¤ 항목 í•­ìƒ ì‚­ì œ\n"
+
+#: vacuumdb.c:1138
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"vacuum\n"
+msgstr ""
+" -j, --jobs=NUM 청소 ìž‘ì—…ì„ ì—¬ëŸ¬ê°œì˜ ì—°ê²°ë¡œ ë™ì‹œì— 작업함\n"
+
+#: vacuumdb.c:1139
+#, c-format
+msgid ""
+" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-mxid-age=MXID_AGE 청소할 í…Œì´ë¸”ì˜ ìµœì†Œ multixact ID 나ì´\n"
+
+#: vacuumdb.c:1140
+#, c-format
+msgid ""
+" --min-xid-age=XID_AGE minimum transaction ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-xid-age=XID_AGE 청소할 í…Œì´ë¸”ì˜ ìµœì†Œ 트랜잭션 ID 나ì´\n"
+
+#: vacuumdb.c:1141
+#, c-format
+msgid ""
+" --no-index-cleanup don't remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --no-index-cleanup ì‚­ì œëœ íŠœí”Œ ëŒ€ìƒ ì¸ë±ìŠ¤ 항목 지우지 ì•ŠìŒ\n"
+
+#: vacuumdb.c:1142
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main ë©”ì¸ ë¦´ë ˆì´ì…˜ 건너뜀\n"
+
+#: vacuumdb.c:1143
+#, c-format
+msgid ""
+" --no-process-toast skip the TOAST table associated with the "
+"table to vacuum\n"
+msgstr ""
+" --no-process-toast vacuum ëŒ€ìƒ í…Œì´ë¸”ê³¼ ê´€ë ¨ëœ TOAST í…Œì´ë¸” ê±´"
+"너뜀\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid ""
+" --no-truncate don't truncate empty pages at the end of "
+"the table\n"
+msgstr ""
+" --no-truncate í…Œì´ë¸” ëì— ìžˆëŠ” 빈 페ì´ì§€ë¥¼ 지우지 ì•ŠìŒ\n"
+
+#: vacuumdb.c:1145
+#, c-format
+msgid ""
+" -n, --schema=PATTERN vacuum tables in the specified schema(s) "
+"only\n"
+msgstr ""
+" -n, --schema=PATTERN 지정한 스키마 ì•ˆì— ìžˆëŠ” í…Œì´ë¸”만 청소함\n"
+
+#: vacuumdb.c:1146
+#, c-format
+msgid ""
+" -N, --exclude-schema=PATTERN do not vacuum tables in the specified "
+"schema(s)\n"
+msgstr ""
+" -N, --exclude-schema=PATTERN 지정한 스키마 ì•ˆì— ìžˆëŠ” í…Œì´ë¸”만 청소안함\n"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid ""
+" -P, --parallel=PARALLEL_WORKERS use this many background workers for "
+"vacuum, if available\n"
+msgstr ""
+" -P, --parallel=병렬작업수 vacuum ìž‘ì—…ì„ ë³‘ë ¬ë¡œ 처리 í•  수 있는 경우\n"
+" 백그ë¼ìš´ë“œ ìž‘ì—… 프로세스 수\n"
+
+#: vacuumdb.c:1148
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ì–´ë– í•œ ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ ì•ŠìŒ\n"
+
+#: vacuumdb.c:1149
+#, c-format
+msgid ""
+" --skip-locked skip relations that cannot be immediately "
+"locked\n"
+msgstr ""
+" --skip-locked 즉시 잠글 수 없는 릴레ì´ì…˜ì€ 건너 뜀\n"
+
+#: vacuumdb.c:1150
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' 지정한 특정 í…Œì´ë¸”들만 청소\n"
+
+#: vacuumdb.c:1151
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose ìž‘ì—…ë‚´ì—­ì˜ ìžì„¸í•œ 출력\n"
+
+#: vacuumdb.c:1152
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: vacuumdb.c:1153
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze 쿼리최ì í™” 통계 정보를 갱신함\n"
+
+#: vacuumdb.c:1154
+#, c-format
+msgid ""
+" -Z, --analyze-only only update optimizer statistics; no "
+"vacuum\n"
+msgstr ""
+" -Z, --analyze-only 청소 ìž‘ì—… ì—†ì´ ì¿¼ë¦¬ìµœì í™” 통계 정보만 갱신"
+"함\n"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in "
+"multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages 보다 빠른 결과를 위해 다중 스테ì´ì§€ì—ì„œ\n"
+" 최ì í™” 통계치만 갱신함;청소 안함\n"
+
+#: vacuumdb.c:1157
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ì´ ë„움ë§ì„ 표시하고 종료\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"보다 ìžì„¸í•œ ë‚´ìš©ì€ VACUUM SQL 명령어 설명서를 참조하십시오.\n"
diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build
new file mode 100644
index 0000000..00a9f20
--- /dev/null
+++ b/src/bin/scripts/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pgscripts-' + pg_version_major.to_string())]
diff --git a/src/bin/scripts/po/pl.po b/src/bin/scripts/po/pl.po
new file mode 100644
index 0000000..a9b5aba
--- /dev/null
+++ b/src/bin/scripts/po/pl.po
@@ -0,0 +1,1146 @@
+# Polish message translation file for pgscripts
+# Copyright (C) 2011 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Begina Felicysym <begina.felicysym@wp.eu>, 2011, 2012, 2013.
+# grzegorz <begina.felicysym@wp.eu>, 2014, 2015, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL 9.1)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2016-07-03 03:14+0000\n"
+"PO-Revision-Date: 2016-07-03 18:03+0200\n"
+"Last-Translator: grzegorz <begina.felicysym@wp.eu>\n"
+"Language-Team: begina.felicysym@wp.eu\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "brak pamięci\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "nie można powielić pustego wskazania (błąd wewnętrzny)\n"
+
+#: ../../common/username.c:45
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "nie udało się odnaleźć efektywnego ID użytkownika %ld: %s"
+
+#: ../../common/username.c:47
+msgid "user does not exist"
+msgstr "użytkownik nie istnieje"
+
+#: ../../common/username.c:62
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "niepowodzenie wyszukiwania nazwy użytkownika: kod błędu %lu"
+
+#: ../../fe_utils/print.c:354
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu wiersz)"
+msgstr[1] "(%lu wiersze)"
+msgstr[2] "(%lu wierszy)"
+
+#: ../../fe_utils/print.c:2906
+#, c-format
+msgid "Interrupted\n"
+msgstr "Przerwane\n"
+
+#: ../../fe_utils/print.c:2970
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Nie można dodać nagłówka do zawartości tabeli: przekroczona liczba kolumn %d.\n"
+
+#: ../../fe_utils/print.c:3010
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Nie można dodać komórki do zawartości tabeli: przekroczona liczba komórek %d.\n"
+
+#: ../../fe_utils/print.c:3259
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "niepoprawny format wyjścia (błąd wewnętrzny): %d"
+
+#: clusterdb.c:110 clusterdb.c:129 createdb.c:119 createdb.c:138
+#: createlang.c:89 createlang.c:119 createlang.c:174 createuser.c:169
+#: createuser.c:184 dropdb.c:94 dropdb.c:103 dropdb.c:111 droplang.c:88
+#: droplang.c:118 droplang.c:174 dropuser.c:89 dropuser.c:104 dropuser.c:115
+#: pg_isready.c:93 pg_isready.c:107 reindexdb.c:131 reindexdb.c:150
+#: vacuumdb.c:209 vacuumdb.c:228
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Spróbuj \"%s --help\" aby uzyskać więcej informacji.\n"
+
+#: clusterdb.c:127 createdb.c:136 createlang.c:117 createuser.c:182
+#: dropdb.c:109 droplang.c:116 dropuser.c:102 pg_isready.c:105 reindexdb.c:148
+#: vacuumdb.c:226
+#, c-format
+msgid "%s: too many command-line arguments (first is \"%s\")\n"
+msgstr "%s: za duża ilość parametrów wiersza poleceń (pierwszy to \"%s\")\n"
+
+#: clusterdb.c:139
+#, c-format
+msgid "%s: cannot cluster all databases and a specific one at the same time\n"
+msgstr "%s: nie można klastrować wszystkich baz danych i jednej wskazanej w tym samym czasie\n"
+
+#: clusterdb.c:146
+#, c-format
+msgid "%s: cannot cluster specific table(s) in all databases\n"
+msgstr "%s: nie można klastrować wskazanych tabel we wszystkich bazach danych\n"
+
+#: clusterdb.c:211
+#, c-format
+msgid "%s: clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: klastrowanie tabeli \"%s\" w bazie danych \"%s\" nie udało się: %s"
+
+#: clusterdb.c:214
+#, c-format
+msgid "%s: clustering of database \"%s\" failed: %s"
+msgstr "%s: klastrowanie bazy danych \"%s\" nie udało się: %s"
+
+#: clusterdb.c:245
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: klastrowanie bazy danych \"%s\"\n"
+
+#: clusterdb.c:261
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s klastruje wszystkie poprzednio sklastrowane tabele w bazie danych.\n"
+"\n"
+
+#: clusterdb.c:262 createdb.c:252 createlang.c:236 createuser.c:349
+#: dropdb.c:155 droplang.c:237 dropuser.c:156 pg_isready.c:222 reindexdb.c:393
+#: vacuumdb.c:939
+#, c-format
+msgid "Usage:\n"
+msgstr "Składnia:\n"
+
+#: clusterdb.c:263 reindexdb.c:394 vacuumdb.c:940
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPCJA]... [NAZWADB]\n"
+
+#: clusterdb.c:264 createdb.c:254 createlang.c:238 createuser.c:351
+#: dropdb.c:157 droplang.c:239 dropuser.c:158 pg_isready.c:225 reindexdb.c:395
+#: vacuumdb.c:941
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opcje:\n"
+
+#: clusterdb.c:265
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all sklastruj wszystkie bazy danych\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=NAZWADB baza danych do klastrowania\n"
+
+#: clusterdb.c:267 createlang.c:240 createuser.c:355 dropdb.c:158
+#: droplang.c:241 dropuser.c:159 reindexdb.c:398
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo pokazuje polecenia przesyłane do serwera\n"
+
+#: clusterdb.c:268 reindexdb.c:400
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet nie wypisuj komunikatów\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELA klastruj tylko wskazane tabele\n"
+
+#: clusterdb.c:270 reindexdb.c:404
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose wypisuje dużo danych wyjściowych\n"
+
+#: clusterdb.c:271 createlang.c:242 createuser.c:369 dropdb.c:160
+#: droplang.c:243 dropuser.c:162 reindexdb.c:405
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: clusterdb.c:272 createlang.c:243 createuser.c:374 dropdb.c:162
+#: droplang.c:244 dropuser.c:164 reindexdb.c:406
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: clusterdb.c:273 createdb.c:265 createlang.c:244 createuser.c:375
+#: dropdb.c:163 droplang.c:245 dropuser.c:165 pg_isready.c:231 reindexdb.c:407
+#: vacuumdb.c:957
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opcje połączenia:\n"
+
+#: clusterdb.c:274 createlang.c:245 createuser.c:376 dropdb.c:164
+#: droplang.c:246 dropuser.c:166 reindexdb.c:408 vacuumdb.c:958
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NAZWAHOSTA host serwera bazy danych lub katalog gniazda\n"
+
+#: clusterdb.c:275 createlang.c:246 createuser.c:377 dropdb.c:165
+#: droplang.c:247 dropuser.c:167 reindexdb.c:409 vacuumdb.c:959
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT numer portu na serwera bazy dnaych\n"
+
+#: clusterdb.c:276 createlang.c:247 dropdb.c:166 droplang.c:248
+#: reindexdb.c:410 vacuumdb.c:960
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAZWAUZYTK nazwa użytkownika do połączenia\n"
+
+#: clusterdb.c:277 createlang.c:248 createuser.c:379 dropdb.c:167
+#: droplang.c:249 dropuser.c:169 reindexdb.c:411 vacuumdb.c:961
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nie pytaj nigdy o hasło\n"
+
+#: clusterdb.c:278 createlang.c:249 createuser.c:380 dropdb.c:168
+#: droplang.c:250 dropuser.c:170 reindexdb.c:412 vacuumdb.c:962
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password wymuś pytanie o hasło\n"
+
+#: clusterdb.c:279 dropdb.c:169 reindexdb.c:413 vacuumdb.c:963
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NAZWADB alternatywna serwisowa baza danych\n"
+
+#: clusterdb.c:280
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Przeczytaj opis polecenia SQL CLUSTER by uzyskać informacje szczegółowe.\n"
+
+#: clusterdb.c:281 createdb.c:273 createlang.c:250 createuser.c:381
+#: dropdb.c:170 droplang.c:251 dropuser.c:171 pg_isready.c:236 reindexdb.c:415
+#: vacuumdb.c:965
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Błędy proszę przesyłać na adres <pgsql-bugs@postgresql.org>.\n"
+
+#: common.c:82 common.c:128
+msgid "Password: "
+msgstr "Hasło: "
+
+#: common.c:113
+#, c-format
+msgid "%s: could not connect to database %s: out of memory\n"
+msgstr "%s: nie można połączyć się do bazy danych %s: brak pamięci\n"
+
+#: common.c:141
+#, c-format
+msgid "%s: could not connect to database %s: %s"
+msgstr "%s: nie można połączyć się do bazy danych %s: %s"
+
+#: common.c:190 common.c:218
+#, c-format
+msgid "%s: query failed: %s"
+msgstr "%s: zapytanie nie powiodło się: %s"
+
+#: common.c:192 common.c:220
+#, c-format
+msgid "%s: query was: %s\n"
+msgstr "%s: zapytanie brzmiało: %s\n"
+
+#. translator: abbreviation for "yes"
+#: common.c:261
+msgid "y"
+msgstr "t"
+
+#. translator: abbreviation for "no"
+#: common.c:263
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:273
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:294
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Wymagana jest odpowiedź \"%s\" lub \"%s\".\n"
+
+#: common.c:373 common.c:410
+#, c-format
+msgid "Cancel request sent\n"
+msgstr "Wysłano żądanie anulowania\n"
+
+#: common.c:376 common.c:414
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "Nie udało się wysłać żądania anulowania: %s"
+
+#: createdb.c:146
+#, c-format
+msgid "%s: only one of --locale and --lc-ctype can be specified\n"
+msgstr "%s: tylko jedna z --locale i --lc-ctype może być wskazany\n"
+
+#: createdb.c:152
+#, c-format
+msgid "%s: only one of --locale and --lc-collate can be specified\n"
+msgstr "%s: tylko jedna z --locale i --lc-collate może być wskazany\n"
+
+#: createdb.c:164
+#, c-format
+msgid "%s: \"%s\" is not a valid encoding name\n"
+msgstr "%s: \"%s\" nie jest poprawnÄ… nazwÄ… kodowania serwera\n"
+
+#: createdb.c:213
+#, c-format
+msgid "%s: database creation failed: %s"
+msgstr "%s: nie udało się utworzyć bazy danych: %s"
+
+#: createdb.c:233
+#, c-format
+msgid "%s: comment creation failed (database was created): %s"
+msgstr "%s: nie udało się utworzyć notatki (baza danych została utworzona): %s"
+
+#: createdb.c:251
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s tworzy bazÄ™ danych PostgreSQL.\n"
+"\n"
+
+#: createdb.c:253
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPCJA]... [NAZWA] [OPIS]\n"
+
+#: createdb.c:255
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE domyślna przestrzeń tabel dla bazy danych\n"
+
+#: createdb.c:256
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo pokazuje polecenia przesyłane do serwera\n"
+
+#: createdb.c:257
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KODOWANIE ustawia domyślne kodowanie dla bazy danych\n"
+
+#: createdb.c:258
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOKALIZACJA ustawienia regionalne dla bazy danych\n"
+
+#: createdb.c:259
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOKALIZACJA ustawienie LC_COLLATE dla bazy danych\n"
+
+#: createdb.c:260
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOKALIZACJA ustawienie LC_CTYPE dla bazy danych\n"
+
+#: createdb.c:261
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=WÅAÅšCICIEL użytkownik bazy danych bÄ™dÄ…cy wÅ‚aÅ›cicielem nowej bazy\n"
+
+#: createdb.c:262
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=SZABLON szablon bazy do skopiowania\n"
+
+#: createdb.c:263
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: createdb.c:264
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: createdb.c:266
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NAZWAHOSTA host serwera bazy danych lub katalog gniazda\n"
+
+#: createdb.c:267
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT numer portu na serwera bazy dnaych\n"
+
+#: createdb.c:268
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAZWAUZYTK nazwa użytkownika do połączenia\n"
+
+#: createdb.c:269
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nie pytaj nigdy o hasło\n"
+
+#: createdb.c:270
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password wymuś pytanie o hasło\n"
+
+#: createdb.c:271
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NAZWADB alternatywna serwisowa baza danych\n"
+
+#: createdb.c:272
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Domyślnie, jest tworzona baza danych o tej samej nazwie co bieżący użytkownik.\n"
+
+#: createlang.c:149 droplang.c:148
+msgid "Name"
+msgstr "Nazwa"
+
+#: createlang.c:150 droplang.c:149
+msgid "no"
+msgstr "nie"
+
+#: createlang.c:150 droplang.c:149
+msgid "yes"
+msgstr "tak"
+
+#: createlang.c:151 droplang.c:150
+msgid "Trusted?"
+msgstr "Zaufany?"
+
+#: createlang.c:160 droplang.c:159
+msgid "Procedural Languages"
+msgstr "Języki Proceduralne"
+
+#: createlang.c:173 droplang.c:172
+#, c-format
+msgid "%s: missing required argument language name\n"
+msgstr "%s: brak wymaganego argumentu nazwy języka\n"
+
+#: createlang.c:197
+#, c-format
+msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+msgstr "%s: język \"%s\" jest już zainstalowany w bazie danych \"%s\"\n"
+
+#: createlang.c:219
+#, c-format
+msgid "%s: language installation failed: %s"
+msgstr "%s: instalacja języka nie powiodła się: %s"
+
+#: createlang.c:235
+#, c-format
+msgid ""
+"%s installs a procedural language into a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s instaluje język proceduralny w bazie danych PostgreSQL.\n"
+"\n"
+
+#: createlang.c:237 droplang.c:238
+#, c-format
+msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+msgstr " %s [OPCJA]... NAZWAJĘZYKA [NAZWADB]\n"
+
+#: createlang.c:239
+#, c-format
+msgid " -d, --dbname=DBNAME database to install language in\n"
+msgstr " -d, --dbname=NAZWADB baza danych do zainstalowania języka\n"
+
+#: createlang.c:241 droplang.c:242
+#, c-format
+msgid " -l, --list show a list of currently installed languages\n"
+msgstr " -l, --list pokazuje listę aktualnie zainstalowanych języków\n"
+
+#: createuser.c:191
+msgid "Enter name of role to add: "
+msgstr "Wpisz nazwÄ™ roli do dodania: "
+
+#: createuser.c:206
+msgid "Enter password for new role: "
+msgstr "Podaj hasło dla nowej roli: "
+
+#: createuser.c:207
+msgid "Enter it again: "
+msgstr "Powtórz podane hasło: "
+
+#: createuser.c:210
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Podane hasła różnią się.\n"
+
+#: createuser.c:219
+msgid "Shall the new role be a superuser?"
+msgstr "Czy nowa rola ma być superużytkownikiem?"
+
+#: createuser.c:234
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Czy nowa rola ma mieć możliwość tworzenia nowych baz danych?"
+
+#: createuser.c:242
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Czy nowa rola ma mieć możliwość tworzenia nowych ról?"
+
+#: createuser.c:276
+#, c-format
+msgid "Password encryption failed.\n"
+msgstr "Nie udało się zaszyfrować hasła.\n"
+
+#: createuser.c:333
+#, c-format
+msgid "%s: creation of new role failed: %s"
+msgstr "%s: utworzenie nowej roli nie powiodło się: %s"
+
+#: createuser.c:348
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s tworzy nowÄ… rolÄ™ PostgreSQL.\n"
+"\n"
+
+#: createuser.c:350 dropuser.c:157
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPCJA]... [NAZWAROLI]\n"
+
+#: createuser.c:352
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limit połączeń dla roli (domyślnie: bez limitu)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb rola może tworzyć nowe bazy danych\n"
+
+#: createuser.c:354
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb rola nie może tworzyć baz danych (domyślnie)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -E, --encrypted encrypt stored password\n"
+msgstr " -E, --encrypted szyfruje zapisane hasło\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLA nowa rola będzie członkiem tej roli\n"
+
+#: createuser.c:358
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit rola dziedziczy uprawnienia od ról, których\n"
+" jest członkiem (domyślnie)\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rola nie dziedziczy uprawnień\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login rola może się logować (domyślnie)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login rola nie może się logować\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -N, --unencrypted do not encrypt stored password\n"
+msgstr " -N, --unencrypted nie szyfruje zapisanego hasła\n"
+
+#: createuser.c:364
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt przypisuje hasło do nowej roli\n"
+
+#: createuser.c:365
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole rola może tworzyć nowe role\n"
+
+#: createuser.c:366
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole rola nie może tworzyć ról (domyślnie)\n"
+
+#: createuser.c:367
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser rola będzie superużytkownikiem\n"
+
+#: createuser.c:368
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser rola nie będzie superużytkownikiem (domyślnie)\n"
+
+#: createuser.c:370
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive monituje o brakujÄ…cÄ… nazwÄ™ roli, zamiast\n"
+" używać domyślnych\n"
+
+#: createuser.c:372
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication rola może rozpoczynać replikacje\n"
+
+#: createuser.c:373
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication rola nie może rozpoczynać replikacji\n"
+
+#: createuser.c:378
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME nazwa użytkownika do połączenia z bazą (nie tego do utworzenia)\n"
+
+#: dropdb.c:102
+#, c-format
+msgid "%s: missing required argument database name\n"
+msgstr "%s: brak wymaganego argumentu nazwy bazy danych\n"
+
+#: dropdb.c:117
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Baza danych \"%s\" zostanie usunięta na stałe.\n"
+
+#: dropdb.c:118 dropuser.c:123
+msgid "Are you sure?"
+msgstr "Czy na pewno?"
+
+#: dropdb.c:139
+#, c-format
+msgid "%s: database removal failed: %s"
+msgstr "%s: usunięcie bazy danych nie powiodło się: %s"
+
+#: dropdb.c:154
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s usuwa bazÄ™ danych PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:156
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPCJA]... NAZWADB\n"
+
+#: dropdb.c:159
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive monit przed usunięciem czegokolwiek\n"
+
+#: dropdb.c:161
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists nie zgłasza błędu jeśli baza danych nie istnieje\n"
+
+#: droplang.c:203
+#, c-format
+msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+msgstr "%s: język \"%s\" nie jest zainstalowany w bazie danych \"%s\"\n"
+
+#: droplang.c:221
+#, c-format
+msgid "%s: language removal failed: %s"
+msgstr "%s: usunięcie języka nie powiodło się: %s"
+
+#: droplang.c:236
+#, c-format
+msgid ""
+"%s removes a procedural language from a database.\n"
+"\n"
+msgstr ""
+"%s usuwa język proceduralny z bazy danych.\n"
+"\n"
+
+#: droplang.c:240
+#, c-format
+msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+msgstr " -d, --dbname=NAZWADB baza danych z której usunie się język\n"
+
+#: dropuser.c:111
+msgid "Enter name of role to drop: "
+msgstr "Wpisz nazwÄ™ roli do skasowania: "
+
+#: dropuser.c:114
+#, c-format
+msgid "%s: missing required argument role name\n"
+msgstr "%s: brak wymaganego argumentu nazwy roli\n"
+
+#: dropuser.c:122
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Rola \"%s\" zostanie usunięta na stałe.\n"
+
+#: dropuser.c:140
+#, c-format
+msgid "%s: removal of role \"%s\" failed: %s"
+msgstr "%s: usunięcie roli \"%s\" nie powiodło się: %s"
+
+#: dropuser.c:155
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s usuwa rolÄ™ PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:160
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive monit przed usunięciem czegokolwiek oraz monit\n"
+" o nazwę roli jeśli nie wskazano\n"
+
+#: dropuser.c:163
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists nie zgłasza błędu jeśli użytkownik nie istnieje\n"
+
+#: dropuser.c:168
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME nazwa użytkownika do połączenia z bazą (nie tego do skasowania)\n"
+
+#: pg_isready.c:142
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: pg_isready.c:150
+#, c-format
+msgid "%s: could not fetch default options\n"
+msgstr "%s: nie można pobrać opcji domyślnych\n"
+
+#: pg_isready.c:199
+#, c-format
+msgid "accepting connections\n"
+msgstr "akceptowanie połączeń\n"
+
+#: pg_isready.c:202
+#, c-format
+msgid "rejecting connections\n"
+msgstr "odrzucanie połaczeń\n"
+
+#: pg_isready.c:205
+#, c-format
+msgid "no response\n"
+msgstr "brak odpowiedzi\n"
+
+#: pg_isready.c:208
+#, c-format
+msgid "no attempt\n"
+msgstr "nie próbowano\n"
+
+#: pg_isready.c:211
+#, c-format
+msgid "unknown\n"
+msgstr "nieznany\n"
+
+#: pg_isready.c:221
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s zgłasza sprawdzenie połączenia do bazy danych PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:223
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPCJA]...\n"
+
+#: pg_isready.c:226
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=NAZWADB nazwa bazy danych\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet cicha praca\n"
+
+#: pg_isready.c:228
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=NAZWAHOSTA host serwera bazy danych lub katalog gniazda\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT portu na serwerze bazy dnaych\n"
+
+#: pg_isready.c:234
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEKUNDY sekundy oczekiwania podczas podczas próby połączenia, 0 wyłącza (domyślnie: %s)\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=NAZWAUZYTK nazwa użytkownika do połączenia\n"
+
+#: reindexdb.c:160
+#, c-format
+msgid "%s: cannot reindex all databases and a specific one at the same time\n"
+msgstr "%s: nie można przeindeksować wszystkich baz danych i jednej wskazanej w tym samym czasie\n"
+
+#: reindexdb.c:165
+#, c-format
+msgid "%s: cannot reindex all databases and system catalogs at the same time\n"
+msgstr "%s: nie można przeindeksować wszystkich baz danych i katalogów systemowych w tym samym czasie\n"
+
+#: reindexdb.c:170
+#, c-format
+msgid "%s: cannot reindex specific schema(s) in all databases\n"
+msgstr "%s: nie można przeindeksować wskazanych indeksów we wszystkich bazach danych\n"
+
+#: reindexdb.c:175
+#, c-format
+msgid "%s: cannot reindex specific table(s) in all databases\n"
+msgstr "%s: nie można przeindeksować wskazanych tabel/tabeli we wszystkich bazach danych\n"
+
+#: reindexdb.c:180
+#, c-format
+msgid "%s: cannot reindex specific index(es) in all databases\n"
+msgstr "%s: nie można przeindeksować wskazanych indeksów we wszystkich bazach danych\n"
+
+#: reindexdb.c:191
+#, c-format
+msgid "%s: cannot reindex specific schema(s) and system catalogs at the same time\n"
+msgstr "%s: nie można przeindeksować wskazanych schematów i katalogów systemowych w tym samym czasie\n"
+
+#: reindexdb.c:196
+#, c-format
+msgid "%s: cannot reindex specific table(s) and system catalogs at the same time\n"
+msgstr "%s: nie można przeindeksować wskazanych tabel i katalogów systemowych w tym samym czasie\n"
+
+#: reindexdb.c:201
+#, c-format
+msgid "%s: cannot reindex specific index(es) and system catalogs at the same time\n"
+msgstr "%s: nie można przeindeksować wskazanych indeksów i katalogów systemowych w tym samym czasie\n"
+
+#: reindexdb.c:307
+#, c-format
+msgid "%s: reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: przeindeksowanie tabeli \"%s\" w bazie danych \"%s\" nie udało się: %s"
+
+#: reindexdb.c:310
+#, c-format
+msgid "%s: reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: przeindeksowanie indeksu \"%s\" w bazie danych \"%s\" nie udało się: %s"
+
+#: reindexdb.c:313
+#, c-format
+msgid "%s: reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: przeindeksowanie schematu \"%s\" w bazie danych \"%s\" nie udało się: %s"
+
+#: reindexdb.c:316
+#, c-format
+msgid "%s: reindexing of database \"%s\" failed: %s"
+msgstr "%s: przeindeksowanie bazy danych \"%s\" nie udało się: %s"
+
+#: reindexdb.c:347
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: przeindeksowanie bazy danych \"%s\"\n"
+
+#: reindexdb.c:380
+#, c-format
+msgid "%s: reindexing of system catalogs failed: %s"
+msgstr "%s: przeindeksowanie katalogów systemowych nie udało się: %s"
+
+#: reindexdb.c:392
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s przeindeksowuje bazÄ™ danych PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:396
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all przeindeksuj wszystkie bazy danych\n"
+
+#: reindexdb.c:397
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=NAZWADB baza danych do przeindeksowania\n"
+
+#: reindexdb.c:399
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEKS odtwórz tylko wskazane indeksy\n"
+
+#: reindexdb.c:401
+#, c-format
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system przeindeksuj katalogi systemowe\n"
+
+#: reindexdb.c:402
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMAT przeindeksuj tylko wskazany schemat(y)\n"
+
+#: reindexdb.c:403
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELA przeindeksuj tylko wskazane tabele\n"
+
+#: reindexdb.c:414
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Przeczytaj opis polecenia SQL REINDEX by uzyskać informacje szczegółowe.\n"
+
+#: vacuumdb.c:191
+#, c-format
+msgid "%s: number of parallel jobs must be at least 1\n"
+msgstr "%s: liczba zadań współbieżnych musi być co najmniej 1\n"
+
+#: vacuumdb.c:197
+#, c-format
+msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+msgstr "%s: za dużo żądanych zadań współbieżnych (maksimum: %d)\n"
+
+#: vacuumdb.c:236 vacuumdb.c:242
+#, c-format
+msgid "%s: cannot use the \"%s\" option when performing only analyze\n"
+msgstr "%s: nie można używać opcji \"%s\" podczas wykonywania wyłącznie analizy\n"
+
+#: vacuumdb.c:259
+#, c-format
+msgid "%s: cannot vacuum all databases and a specific one at the same time\n"
+msgstr "%s: nie można odkurzyć wszystkich baz danych i jednej wskazanej w tym samym czasie\n"
+
+#: vacuumdb.c:265
+#, c-format
+msgid "%s: cannot vacuum specific table(s) in all databases\n"
+msgstr "%s: nie można odkurzyć wskazanych tabel we wszystkich bazach danych\n"
+
+#: vacuumdb.c:351
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Generacja minimalnej statystyki optymalizatora (1 cel)"
+
+#: vacuumdb.c:352
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Generacja pośredniej statystyki optymalizatora (10 celów)"
+
+#: vacuumdb.c:353
+msgid "Generating default (full) optimizer statistics"
+msgstr "Generowanie domyślnej (pełnej) statystyki optymalizatora"
+
+#: vacuumdb.c:362
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: przetwarzanie bazy danych \"%s\": %s\n"
+
+#: vacuumdb.c:365
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: odkurzenie bazy danych \"%s\"\n"
+
+#: vacuumdb.c:695
+#, c-format
+msgid "%s: vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "%s: odkurzenie tabeli \"%s\" w bazie danych \"%s\" nie udało się: %s"
+
+#: vacuumdb.c:698 vacuumdb.c:815
+#, c-format
+msgid "%s: vacuuming of database \"%s\" failed: %s"
+msgstr "%s: odkurzenie bazy danych \"%s\" nie udało się: %s"
+
+#: vacuumdb.c:929
+#, c-format
+#| msgid "%s: invalid argument: %s\n"
+msgid "%s: invalid socket: %s"
+msgstr "%s: niepoprawne gniazdo: %s"
+
+#: vacuumdb.c:938
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s czyści bazę danych PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:942
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all odkurza wszystkie bazy danych\n"
+
+#: vacuumdb.c:943
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=NAZWADB baza danych do odkurzenia\n"
+
+#: vacuumdb.c:944
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo pokazuje polecenia przesyłane do serwera\n"
+
+#: vacuumdb.c:945
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full wykonuje pełne odkurzenie\n"
+
+#: vacuumdb.c:946
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze zamraża informację transakcji wiersza\n"
+
+#: vacuumdb.c:947
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM użycie tylu jednoczesnych połączeń do odkurzania\n"
+
+#: vacuumdb.c:948
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet nie wypisuje komunikatów\n"
+
+#: vacuumdb.c:949
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' odkurza tylko określone tabele\n"
+
+#: vacuumdb.c:950
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose wypisuje dużo danych wyjściowych\n"
+
+#: vacuumdb.c:951
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version pokaż informacje o wersji i zakończ\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze aktualizuje statystyki optymalizatora\n"
+
+#: vacuumdb.c:953
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only aktualizuje tylko statystyki optymalizatora; bez odkurzania\n"
+
+#: vacuumdb.c:954
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages tylko aktualizuj statystyki optymalizatora, przy\n"
+" wielostopniowych dla szybszych wyników; bez odkurzania\n"
+
+#: vacuumdb.c:956
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help pokaż tą pomoc i zakończ działanie\n"
+
+#: vacuumdb.c:964
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Przeczytaj opis polecenia SQL VACUUM by uzyskać informacje szczegółowe.\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: nie można uzyskać informacji o bieżącym użytkowniku: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: nie można pobrać nazwy bieżącego użytkownika: %s\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: brak pamięci\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr "%s: nie można używać opcji \"freeze\" podczas wykonywania wyłącznie analizy\n"
+
+#~ msgid "user name lookup failure: %s"
+#~ msgstr "niepowodzenie wyszukiwania nazwy użytkownika: %s"
diff --git a/src/bin/scripts/po/pt_BR.po b/src/bin/scripts/po/pt_BR.po
new file mode 100644
index 0000000..0eccd72
--- /dev/null
+++ b/src/bin/scripts/po/pt_BR.po
@@ -0,0 +1,1169 @@
+# Brazilian Portuguese message translation file for pgscripts
+#
+# Copyright (C) 2003-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2003-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2023-08-17 16:32+0200\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n>1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "sem memória\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "não pode duplicar ponteiro nulo (erro interno)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "não pôde encontrar ID de usuário efetivo %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "usuário não existe"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "falhou ao pesquisar nome de usuário: código de erro %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Requisição de cancelamento enviada\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Não pôde enviar requisição de cancelamento: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104
+msgid "Password: "
+msgstr "Senha: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "não pôde conectar ao banco de dados %s: sem memória"
+
+#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valor \"%s\" é inválido para opção %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve estar no intervalo de %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:301
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "muitas tarefas para esta plataforma"
+
+#: ../../fe_utils/parallel_slot.c:519
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "processamento do banco de dados \"%s\" falhou: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu registro)"
+msgstr[1] "(%lu registros)"
+
+#: ../../fe_utils/print.c:3109
+#, c-format
+msgid "Interrupted\n"
+msgstr "Interrompido\n"
+
+#: ../../fe_utils/print.c:3173
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Não pode adicionar cabeçalho a conteúdo de tabela: quantidade de colunas %d foi excedida.\n"
+
+#: ../../fe_utils/print.c:3213
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Não pode adicionar célula a conteúdo de tabela: quantidade total de células %d foi excedida.\n"
+
+#: ../../fe_utils/print.c:3471
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "formato de saída inválido (erro interno): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "consulta falhou: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Consulta foi: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158
+#: createuser.c:170 createuser.c:185 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:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "não pode agrupar todos os bancos de dados e um específico ao mesmo tempo"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "não pode agrupar tabela(s) específica(s) em todos os bancos de dados"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "agrupamento da tabela \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "agrupamento do banco de dados \"%s\" falhou: %s"
+
+#: clusterdb.c:246
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: agrupando banco de dados \"%s\"\n"
+
+#: clusterdb.c:262
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s agrupa todas as tabelas agrupadas anteriormente no banco de dados.\n"
+"\n"
+
+#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPÇÃO]... [NOMEBD]\n"
+
+#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: clusterdb.c:266
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all agrupa todos os bancos de dados\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser agrupado\n"
+
+#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra os comandos enviados ao servidor\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet não exibe nenhuma mensagem\n"
+
+#: clusterdb.c:270
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELA agrupa somente a(s) tabela(s) especificada(s)\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra muitas mensagens\n"
+
+#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Opções de conexão:\n"
+
+#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados\n"
+
+#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUÃRIO nome do usuário para se conectar\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pergunta senha\n"
+
+#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password pergunta senha\n"
+
+#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEBD especifica um banco de dados para manutenção\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Leia a descrição do comando SQL CLUSTER para obter detalhes.\n"
+
+#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Relate erros a <%s>.\n"
+
+#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Página web do %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "consulta retornou %d registro ao invés de um: %s"
+msgstr[1] "consulta retornou %d registros ao invés de um: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "s"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Por favor responda \"%s\" ou \"%s\".\n"
+
+#: createdb.c:173
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" não é um nome de codificação válido"
+
+#: createdb.c:243
+#, c-format
+msgid "database creation failed: %s"
+msgstr "criação do banco de dados falhou: %s"
+
+#: createdb.c:262
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "criação de comentário falhou (banco de dados foi criado): %s"
+
+#: createdb.c:280
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s cria um banco de dados PostgreSQL.\n"
+"\n"
+
+#: createdb.c:282
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPÇÃO]... [NOMEBD] [DESCRIÇÃO]\n"
+
+#: createdb.c:284
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE tablespace padrão para o banco de dados\n"
+
+#: createdb.c:285 reindexdb.c:766
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra os comandos enviados ao servidor\n"
+
+#: createdb.c:286
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=CODIFICAÇÃO codificação para o banco de dados\n"
+
+#: createdb.c:287
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE configurações regionais para o banco de dados\n"
+
+#: createdb.c:288
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE configuração LC_COLLATE para o banco de dados\n"
+
+#: createdb.c:289
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE configuração LC_CTYPE para o banco de dados\n"
+
+#: createdb.c:290
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE configuração regional ICU para o banco de dados\n"
+
+#: createdb.c:291
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" provedor de configuração regional para ordenação padrão de bancos de dados\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=DONO usuário do banco que será dono do novo banco de dados\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=ESTRATÉGIA estratégia de criação do banco de dados wal_log ou file_copy\n"
+
+#: createdb.c:295
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=MODELO modelo de banco de dados para copiar\n"
+
+#: createdb.c:296 reindexdb.c:775
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: createdb.c:297 reindexdb.c:776
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: createdb.c:299 reindexdb.c:778
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: createdb.c:300 reindexdb.c:779
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados\n"
+
+#: createdb.c:301 reindexdb.c:780
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUÃRIO nome do usuário para se conectar\n"
+
+#: createdb.c:302 reindexdb.c:781
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password nunca pergunta senha\n"
+
+#: createdb.c:303 reindexdb.c:782
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password pergunta senha\n"
+
+#: createdb.c:304 reindexdb.c:783
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=NOMEBD especifica um banco de dados para manutenção\n"
+
+#: createdb.c:305
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Por padrão, um banco de dados com o mesmo nome do usuário é criado.\n"
+
+#: createuser.c:193
+msgid "Enter name of role to add: "
+msgstr "Digite o nome da role a ser adicionada: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Digite a senha para a nova role: "
+
+#: createuser.c:209
+msgid "Enter it again: "
+msgstr "Digite-a novamente: "
+
+#: createuser.c:212
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Senhas não correspondem.\n"
+
+#: createuser.c:220
+msgid "Shall the new role be a superuser?"
+msgstr "A nova role poderá criar um super-usuário?"
+
+#: createuser.c:235
+msgid "Shall the new role be allowed to create databases?"
+msgstr "A nova role poderá criar bancos de dados?"
+
+#: createuser.c:243
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "A nova role poderá criar novas roles?"
+
+#: createuser.c:278
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "criptografia de senha falhou: %s"
+
+#: createuser.c:331
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "criação de nova role falhou: %s"
+
+#: createuser.c:345
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s cria uma nova role do PostgreSQL.\n"
+"\n"
+
+#: createuser.c:347 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPÇÃO]... [NOME_ROLE]\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N limite de conexão por role (padrão: ilimitado)\n"
+
+#: createuser.c:350
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb role pode criar novos bancos de dados\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb role não pode criar novos bancos de dados (padrão)\n"
+
+#: createuser.c:353
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE nova role será um membro desta role\n"
+
+#: createuser.c:354
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit role herda privilégios de roles das quais ela\n"
+" é um membro (padrão)\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit role não herda privilégios\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login role pode efetuar login (padrão)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login role não pode efetuar login\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt atribui uma senha a nova role\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole role pode criar novas roles\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole role não pode criar novas roles (padrão)\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser role será super-usuário\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser role não será super-usuário (padrão)\n"
+
+#: createuser.c:365
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive pergunta pelo nome e atributos não informados da role\n"
+" ao invés de utilizar o padrão\n"
+
+#: createuser.c:367
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication role pode iniciar replicação\n"
+
+#: createuser.c:368
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication role não pode iniciar replicação\n"
+
+#: createuser.c:373
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USUÃRIO nome do usuário para se conectar (não é o usuário a ser criado)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "nome do banco de dados é um argumento requerido"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Banco de dados \"%s\" será permanentemente removido.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Você tem certeza?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "remoção do banco de dados falhou: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s remove um banco de dados PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPÇÃO]... NOMEBD]\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force tenta terminar outras conexões antes de remover\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive pergunta antes de apagar algo\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists não relata erro se banco de dados não existir\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Digite o nome da role a ser removida: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "nome da role é um argumento requerido"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Role \"%s\" será permanentemente removida.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "remoção da role \"%s\" falhou: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s remove uma role do PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive pergunta antes de apagar algo, e pergunta o nome\n"
+" da role se não for especificado\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists não relata erro se usuário não existir\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USUÃRIO nome do usuário para se conectar (não é o usuário a ser removido)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "não pôde obter opções padrão"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "aceitando conexões\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "rejeitando conexões\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "nenhuma resposta\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "nenhuma tentativa\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "desconhecido\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s envia uma verificação de conexão para um banco de dados PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [OPÇÃO]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=NOMEBD nome do banco de dados\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet executa silenciosamente\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORTA porta do servidor de banco de dados\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEGS segundos a esperar ao tentar conexão, 0 desabilita (padrão: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USUÃRIO nome do usuário para se conectar\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "não pode reindexar todos os bancos de dados e um específico ao mesmo tempo"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "não pode reindexar todos os bancos de dados e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "não pode reindexar esquema(s) específico(s) em todos os bancos de dados"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "não pode reindexar tabela(s) específica(s) em todos os bancos de dados"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "não pode reindexar índice(s) específico(s) em todos os bancos de dados"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "não pode reindexar esquema(s) específico(s) e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "não pode reindexar tabela(s) específica(s) e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "não pode reindexar índice(s) específico(s) e os catálogos do sistema ao mesmo tempo"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "não pode utilizar múltiplas tarefas ao reindexar os catálogos do sistema"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "não pode utilizar múltiplas tarefas ao reindexar índices"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439
+#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469
+#: vacuumdb.c:473
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "não pode utilizar a opção \"%s\" em versões do servidor mais antigas do que PostgreSQL %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "não pode reindexar catálogos do sistemas concorrentemente, ignorando todos"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "reindexação do banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexação do índice \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:581
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexação do esquema \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:585
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "reindexação de catálogos do sistema no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:589
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "reindexação da tabela \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: reindexdb.c:742
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: reindexando banco de dados \"%s\"\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s reindexa um banco de dados PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all reindexa todos os bancos de dados\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently reindexa concorrentemente\n"
+
+#: reindexdb.c:765
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser reindexado\n"
+
+#: reindexdb.c:767
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=ÃNDICE reindexa somente índice(s) especificado(s)\n"
+
+#: reindexdb.c:768
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM usa esse número de conexões concorrentes para reindexar\n"
+
+#: reindexdb.c:769
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet não exibe nenhuma mensagem\n"
+
+#: reindexdb.c:770
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system reindexa os catálogos do sistema\n"
+
+#: reindexdb.c:771
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=ESQUEMA reindexa somente esquema(s) especificado(s)\n"
+
+#: reindexdb.c:772
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELA reindexa somente tabela(s) especificada(s)\n"
+
+#: reindexdb.c:773
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE tablespace onde índices serão reconstruídos\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra muitas mensagens\n"
+
+#: reindexdb.c:784
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Leia a descrição do comando SQL REINDEX para obter detalhes.\n"
+
+#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279
+#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "não pode utilizar a opção \"%s\" ao executar somente analyze"
+
+#: vacuumdb.c:297
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "não pode utilizar a opção \"%s\" ao executar vacuum full"
+
+#: vacuumdb.c:303
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "não pode utilizar a opção \"%s\" com a opção \"%s\""
+
+#: vacuumdb.c:322
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "não pode limpar todos os bancos de dados e um específico ao mesmo tempo"
+
+#: vacuumdb.c:324
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "não pode limpar tabela(s) específica(s) em todos os bancos de dados"
+
+#: vacuumdb.c:412
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Gerando estatísticas mínimas para otimizador (1 alvo)"
+
+#: vacuumdb.c:413
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Gerando estatísticas parciais para otimizador (10 alvos)"
+
+#: vacuumdb.c:414
+msgid "Generating default (full) optimizer statistics"
+msgstr "Gerando estatísticas padrão (completa) para otimizador"
+
+#: vacuumdb.c:479
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: processando banco de dados \"%s\": %s\n"
+
+#: vacuumdb.c:482
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: limpando banco de dados \"%s\"\n"
+
+#: vacuumdb.c:952
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "limpeza na tabela \"%s\" no banco de dados \"%s\" falhou: %s"
+
+#: vacuumdb.c:955
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "limpeza no banco de dados \"%s\" falhou: %s"
+
+#: vacuumdb.c:963
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s limpa e analisa um banco de dados PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:967
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all limpa todos bancos de dados\n"
+
+#: vacuumdb.c:968
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=NOMEBD banco de dados a ser limpo\n"
+
+#: vacuumdb.c:969
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping desabilita comportamento de ignorar páginas\n"
+
+#: vacuumdb.c:970
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo mostra os comandos enviados ao servidor\n"
+
+#: vacuumdb.c:971
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full faz uma limpeza completa\n"
+
+#: vacuumdb.c:972
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze congela informação sobre transação de registros\n"
+
+#: vacuumdb.c:973
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup sempre remove entradas de índice que apontam para tuplas mortas\n"
+
+#: vacuumdb.c:974
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM usa esse número de conexões concorrentes para limpar\n"
+
+#: vacuumdb.c:975
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=IDADE_MXID idade mínima do ID de multixact das tabelas para limpar\n"
+
+#: vacuumdb.c:976
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=IDADE_XID idade mínima do ID de transação das tabelas para limpar\n"
+
+#: vacuumdb.c:977
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup não remove entradas de índice que apontam para tuplas mortas\n"
+
+#: vacuumdb.c:978
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast ignora a tabela TOAST associada a tabela para limpar\n"
+
+#: vacuumdb.c:979
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate não truncar páginas vazias ao final da tabela\n"
+
+#: vacuumdb.c:980
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=QTDE_PROCESSOS use essa quantidade de processos filho em segundo plano para limpar, se disponível\n"
+
+#: vacuumdb.c:981
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet não exibe nenhuma mensagem\n"
+
+#: vacuumdb.c:982
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked ignora relações que não podem ser bloqueadas imediatamente\n"
+
+#: vacuumdb.c:983
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABELA[(COLUNAS)]' limpa somente tabela(s) específica(s)\n"
+
+#: vacuumdb.c:984
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose mostra muitas mensagens\n"
+
+#: vacuumdb.c:985
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: vacuumdb.c:986
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze atualiza estatísticas do otimizador\n"
+
+#: vacuumdb.c:987
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only atualiza somente estatísticas do otimizador; sem limpeza\n"
+
+#: vacuumdb.c:988
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages atualiza somente estatísticas do otimizador, em\n"
+" múltiplos estágios para resultados mais rápidos; sem limpeza\n"
+
+#: vacuumdb.c:990
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: vacuumdb.c:998
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Leia a descrição do comando SQL VACUUM para obter detalhes.\n"
diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po
new file mode 100644
index 0000000..5ae3272
--- /dev/null
+++ b/src/bin/scripts/po/ru.po
@@ -0,0 +1,1589 @@
+# Russian message translation file for pgscripts
+# Copyright (C) 2003-2016 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Serguei A. Mokhov, <mokhov@cs.concordia.ca>, 2003-2004.
+# Oleg Bartunov <oleg@sai.msu.su>, 2004.
+# Alexander Lakhin <exclusion@gmail.com>, 2012-2017, 2019, 2020, 2021, 2022, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL current)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:08+0300\n"
+"PO-Revision-Date: 2023-11-03 10:36+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробноÑти: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подÑказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "нехватка памÑти\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "пользователь не ÑущеÑтвует"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Сигнал отмены отправлен\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Пароль: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе %s (нехватка памÑти)"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:317
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "Ñлишком много заданий Ð´Ð»Ñ Ñтой платформы: %d"
+
+#: ../../fe_utils/parallel_slot.c:326
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "деÑкриптор файла Ñокета вне диапазона, допуÑтимого Ð´Ð»Ñ select(): %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Попробуйте уменьшить количеÑтво заданий."
+
+#: ../../fe_utils/parallel_slot.c:553
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "ошибка при обработке базы \"%s\": %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Ñтрока)"
+msgstr[1] "(%lu Ñтроки)"
+msgstr[2] "(%lu Ñтрок)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Прервано\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr ""
+"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° таблицы: превышен предел чиÑла Ñтолбцов (%d).\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr ""
+"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчейки в таблицу: превышен предел чиÑла Ñчеек (%d).\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "неверный формат вывода (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "ошибка при выполнении запроÑа: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "ВыполнÑлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ»Ð°Ñтеризовать вÑе базы и одну конкретную одновременно"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ»Ð°Ñтеризовать указанную таблицу(Ñ‹) во вÑех базах"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "клаÑтеризовать таблицу \"%s\" в базе \"%s\" не удалоÑÑŒ: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "клаÑтеризовать базу \"%s\" не удалоÑÑŒ: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ \"%s\"\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s упорÑдочивает данные вÑех клаÑтеризованных таблиц в базе данных.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "ИÑпользование:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all клаÑтеризовать вÑе базы\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=ИМЯ_БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ð´Ð»Ñ ÐºÐ»Ð°Ñтеризации\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo отображать команды, отправлÑемые Ñерверу\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не выводить никакие ÑообщениÑ\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr ""
+" -t, --table=ТÐБЛИЦРклаÑтеризовать только указанную таблицу(Ñ‹)\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Параметры подключениÑ:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запроÑить пароль\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ИМЯ_БД Ñменить опорную базу данных\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Подробнее о клаÑтеризации вы можете узнать в опиÑании SQL-команды CLUSTER.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках Ñообщайте по адреÑу <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтроку вмеÑто одной: %s"
+msgstr[1] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтроки вмеÑто одной: %s"
+msgstr[2] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтрок вмеÑто одной: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s - да/%s - нет) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "ПожалуйÑта, введите \"%s\" или \"%s\".\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" не ÑвлÑетÑÑ Ð²ÐµÑ€Ð½Ñ‹Ð¼ названием кодировки"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "Ñоздать базу данных не удалоÑÑŒ: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "Ñоздать комментарий не удалоÑÑŒ (база данных была Ñоздана): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s Ñоздаёт базу данных PostgreSQL.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД] [ОПИСÐÐИЕ]\n"
+
+# well-spelled: ПРОСТР
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr ""
+" -D, --tablespace=ТÐБЛ_ПРОСТР табличное проÑтранÑтво по умолчанию Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ "
+"данных\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the server\n"
+msgstr ""
+" -e, --echo отображать команды, отправлÑемые Ñерверу\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=КОДИРОВКРкодировка базы данных\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=ЛОКÐЛЬ локаль Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=ЛОКÐЛЬ параметр LC_COLLATE Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=ЛОКÐЛЬ параметр LC_CTYPE Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=ЛОКÐЛЬ локаль ICU Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr ""
+" --icu-rules=ПРÐВИЛРнаÑтройка правил Ñортировки ICU Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ "
+"данных\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default "
+"collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" провайдер локали Ð´Ð»Ñ Ð¾Ñновного правила "
+"Ñортировки БД\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr ""
+" -O, --owner=ВЛÐДЕЛЕЦ пользователь-владелец новой базы данных\n"
+
+#: createdb.c:302
+#, c-format
+msgid ""
+" -S, --strategy=STRATEGY database creation strategy wal_log or "
+"file_copy\n"
+msgstr ""
+" -S, --strategy=STRATEGY ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных: wal_log или "
+"file_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=ШÐБЛОРиÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð±Ð°Ð·Ð° данных Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid ""
+" -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password не запрашивать пароль\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запроÑить пароль\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=ИМЯ_БД Ñменить опорную базу данных\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"По умолчанию именем базы данных ÑчитаетÑÑ Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ роли: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Введите пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ роли: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Повторите его: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Пароли не Ñовпадают.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "Должна ли Ð½Ð¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ иметь Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñ ÑуперпользователÑ?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ должна иметь право Ñоздавать базы данных?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ должна иметь право Ñоздавать другие роли?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "ошибка при шифровании паролÑ: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "Ñоздать роль не удалоÑÑŒ: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s Ñоздаёт роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_РОЛИ]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --with-admin=РОЛЬ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет членом новой роли Ñ "
+"привилегией\n"
+" ADMIN\n"
+
+#: createuser.c:420
+#, c-format
+msgid ""
+" -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr ""
+" -c, --connection-limit=N предел подключений Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸\n"
+" (по умолчанию предела нет)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb роль Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð· данных\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr ""
+" -D, --no-createdb роль без права ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð· данных (по "
+"умолчанию)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=РОЛЬ Ð½Ð¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет членом заданной роли\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=РОЛЬ (уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð° --member-of)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit роль наÑледует права ролей (групп), в которые "
+"она\n"
+" включена (по умолчанию)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit роль не наÑледует права\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr ""
+" -l, --login роль Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу (по "
+"умолчанию)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login роль без права подключениÑ\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=РОЛЬ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет членом новой роли\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt назначить пароль новой роли\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole роль Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… ролей\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr ""
+" -R, --no-createrole роль без права ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ¹ (по умолчанию)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser роль Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñми ÑуперпользователÑ\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr ""
+" -S, --no-superuser роль без полномочий ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (по "
+"умолчанию)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=ДÐТÐ_ВРЕМЯ\n"
+" дата и Ð²Ñ€ÐµÐ¼Ñ Ð¸ÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes "
+"rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive запрашивать отÑутÑтвующие атрибуты и Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸,\n"
+" а не иÑпользовать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию\n"
+
+#: createuser.c:442
+#, c-format
+msgid ""
+" --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr ""
+" --bypassrls роль не будет подчинÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ°Ð¼ защиты на\n"
+" уровне Ñтрок (RLS)\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) "
+"policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls роль будет подчинÑÑ‚ÑŒÑÑ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ°Ð¼ защиты на\n"
+" уровне Ñтрок (по умолчанию)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication роль может инициировать репликацию\n"
+
+#: createuser.c:446
+#, c-format
+msgid ""
+" --no-replication role cannot initiate replication (default)\n"
+msgstr ""
+" --no-replication роль не может инициировать репликацию\n"
+" (по умолчанию)\n"
+
+#: createuser.c:451
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr ""
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+" (но не Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ роли)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "отÑутÑтвует необходимый аргумент: Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "База данных \"%s\" будет удалена безвозвратно.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Вы уверены? (y/n)"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "ошибка при удалении базы данных: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s удалÑет базу данных PostgreSQL.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [ПÐРÐМЕТР]... БД\n"
+
+#: dropdb.c:176
+#, c-format
+msgid ""
+" -f, --force try to terminate other connections before "
+"dropping\n"
+msgstr ""
+" -f, --force пытатьÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ‚ÑŒ другие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ "
+"удалением\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive подтвердить операцию удалениÑ\n"
+
+#: dropdb.c:179
+#, c-format
+msgid ""
+" --if-exists don't report error if database doesn't exist\n"
+msgstr ""
+" --if-exists не Ñчитать ошибкой отÑутÑтвие базы данных\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Введите Ð¸Ð¼Ñ ÑƒÐ´Ð°Ð»Ñемой роли: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "отÑутÑтвует необходимый аргумент: Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Роль \"%s\" будет удалена безвозвратно.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "ошибка при удалении роли \"%s\": %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s удалÑет роль PostgreSQL.\n"
+"\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive подтверждать операцию ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ запрашивать\n"
+" Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸, еÑли оно не указано\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr ""
+" --if-exists не Ñчитать ошибкой отÑутÑтвие пользователÑ\n"
+
+#: dropuser.c:182
+#, c-format
+msgid ""
+" -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr ""
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+" (но не Ð¸Ð¼Ñ ÑƒÐ´Ð°Ð»Ñемой роли)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "не удалоÑÑŒ получить параметры по умолчанию"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "принимает подключениÑ\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "отвергает подключениÑ\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "нет ответа\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "проверка не выполнÑлаÑÑŒ\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "неизвеÑтно\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s проверÑет подключение к базе данных PostgreSQL.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [ПÐРÐМЕТР]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet не выводить никакие ÑообщениÑ\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr ""
+" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid ""
+" -t, --timeout=SECS seconds to wait when attempting connection, 0 "
+"disables (default: %s)\n"
+msgstr ""
+" -t, --timeout=СЕК Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ попытке подключениÑ;\n"
+" 0 - без Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ (по умолчанию: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr ""
+" -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать вÑе базы данных и одну конкретную одновременно"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать вÑе базы данных и ÑиÑтемные каталоги одновременно"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную Ñхему(Ñ‹) во вÑех базах"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную таблицу(Ñ‹) во вÑех базах"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанный индекÑ(Ñ‹) во вÑех базах"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную Ñхему(Ñ‹) и ÑиÑтемные каталоги одновременно"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную таблицу(Ñ‹) и ÑиÑтемные каталоги "
+"одновременно"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанный индекÑ(Ñ‹) и ÑиÑтемные каталоги "
+"одновременно"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´ÐµÐ¹Ñтвовать неÑколько заданий Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемных "
+"каталогов"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´ÐµÐ¹Ñтвовать неÑколько заданий Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid ""
+"cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr ""
+"параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ñерверами PostgreSQL верÑии Ñтарее %s"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "переиндекÑировать базу данных \"%s\" не удалоÑÑŒ: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "переÑтроить Ð¸Ð½Ð´ÐµÐºÑ \"%s\" в базе \"%s\" не удалоÑÑŒ: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "переиндекÑировать Ñхему \"%s\" в базе \"%s\" не удалоÑÑŒ: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "переиндекÑировать ÑиÑтемные каталоги в базе \"%s\" не удалоÑÑŒ: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "переиндекÑировать таблицу \"%s\" в базе \"%s\" не удалоÑÑŒ: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: переиндекÑÐ°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\"\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s переиндекÑирует базу данных PostgreSQL.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all переиндекÑировать вÑе базы данных\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr ""
+" --concurrently переиндекÑировать в неблокирующем режиме\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑации\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr ""
+" -i, --index=ИÐДЕКС переÑоздать только указанный индекÑ(Ñ‹)\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"reindex\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО запуÑкать Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑации заданное чиÑло\n"
+" заданий\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не выводить ÑообщениÑ\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr ""
+" -s, --system переиндекÑировать только ÑиÑтемные каталоги\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr ""
+" -S, --schema=СХЕМРпереиндекÑировать только указанную Ñхему(Ñ‹)\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr ""
+" -t, --table=ТÐБЛИЦРпереиндекÑировать только указанную "
+"таблицу(ы)\n"
+
+# well-spelled: ПРОСТР
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr ""
+" --tablespace=ТÐБЛ_ПРОСТР табличное проÑтранÑтво, в котором будут\n"
+" переÑтраиватьÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ‹\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Подробнее о переиндекÑации вы можете узнать в опиÑании SQL-команды REINDEX.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "при выполнении только анализа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать параметр \"%s\""
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "при выполнении полной очиÑтки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать параметр \"%s\""
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ÑовмеÑтно Ñ \"%s\""
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить вÑе базы данных и одну конкретную одновременно"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить только указанную таблицу(Ñ‹) во вÑех базах"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить только указанную Ñхему(Ñ‹) во вÑех базах"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñключить указанную Ñхему(Ñ‹) во вÑех базах"
+
+#: vacuumdb.c:446
+#, c-format
+msgid ""
+"cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить вÑе таблицы в Ñхеме(ах) и одну конкретную таблицу "
+"одновременно"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить конкретную таблицу(Ñ‹) и иÑключить Ñхему(Ñ‹) одновременно"
+
+#: vacuumdb.c:454
+#, c-format
+msgid ""
+"cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить вÑе таблицы в Ñхеме(ах) и иÑключить Ñхему(Ñ‹) одновременно"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памÑти"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "ВычиÑление минимальной ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° (1 запиÑÑŒ)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "ВычиÑление Ñредней ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° (10 запиÑей)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "ВычиÑление Ñтандартной (полной) ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: обработка базы данных \"%s\": %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: очиÑтка базы данных \"%s\"\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "очиÑтить таблицу \"%s\" в базе \"%s\" не удалоÑÑŒ: %s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "очиÑтить базу данных \"%s\" не удалоÑÑŒ: %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s очищает и анализирует базу данных PostgreSQL.\n"
+"\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all очиÑтить вÑе базы данных\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr ""
+" --buffer-usage-limit=РÐЗМЕР размер кольцевого буфера, иÑпользуемого "
+"при\n"
+" очиÑтке\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=ИМЯ_БД очиÑтить указанную базу данных\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr ""
+" --disable-page-skipping иÑключить вÑе варианты пропуÑка Ñтраниц\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid ""
+" -e, --echo show the commands being sent to the "
+"server\n"
+msgstr ""
+" -e, --echo отображать команды, отправлÑемые Ñерверу\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full произвеÑти полную очиÑтку\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr ""
+" -F, --freeze заморозить информацию о транзакциÑÑ… в "
+"Ñтроках\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid ""
+" --force-index-cleanup always remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --force-index-cleanup вÑегда удалÑÑ‚ÑŒ Ñлементы индекÑа, "
+"указывающие\n"
+" на мёртвые кортежи\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid ""
+" -j, --jobs=NUM use this many concurrent connections to "
+"vacuum\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО запуÑкать Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки заданное чиÑло "
+"заданий\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid ""
+" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-mxid-age=ВОЗРÐСТ минимальный возраÑÑ‚ мультитранзакций длÑ\n"
+" таблиц, подлежащих очиÑтке\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid ""
+" --min-xid-age=XID_AGE minimum transaction ID age of tables to "
+"vacuum\n"
+msgstr ""
+" --min-xid-age=ВОЗРÐСТ минимальный возраÑÑ‚ транзакций Ð´Ð»Ñ "
+"таблиц,\n"
+" подлежащих очиÑтке\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid ""
+" --no-index-cleanup don't remove index entries that point to "
+"dead tuples\n"
+msgstr ""
+" --no-index-cleanup не удалÑÑ‚ÑŒ Ñлементы индекÑа, указывающие\n"
+" на мёртвые кортежи\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main пропуÑкать оÑновное отношение\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid ""
+" --no-process-toast skip the TOAST table associated with the "
+"table to vacuum\n"
+msgstr ""
+" --no-process-toast пропуÑкать TOAST-таблицу, ÑвÑзанную\n"
+" Ñ Ð¾Ñ‡Ð¸Ñ‰Ð°ÐµÐ¼Ð¾Ð¹ таблицей\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid ""
+" --no-truncate don't truncate empty pages at the end of "
+"the table\n"
+msgstr ""
+" --no-truncate не отÑекать пуÑтые Ñтраницы в конце "
+"таблицы\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid ""
+" -n, --schema=SCHEMA vacuum tables in the specified schema(s) "
+"only\n"
+msgstr ""
+" -n, --schema=СХЕМРочищать таблицы только в указанной "
+"Ñхеме(ах)\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid ""
+" -N, --exclude-schema=SCHEMA do not vacuum tables in the specified "
+"schema(s)\n"
+msgstr ""
+" -N, --exclude-schema=СХЕМРне очищать таблицы в указанной Ñхеме(ах)\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid ""
+" -P, --parallel=PARALLEL_WORKERS use this many background workers for "
+"vacuum, if available\n"
+msgstr ""
+" -P, --parallel=ПÐРÐЛЛЕЛЬÐЫЕ_ИСПОЛÐИТЕЛИ\n"
+" по возможноÑти иÑпользовать Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки\n"
+" заданное чиÑло фоновых процеÑÑов\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не выводить ÑообщениÑ\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid ""
+" --skip-locked skip relations that cannot be immediately "
+"locked\n"
+msgstr ""
+" --skip-locked пропуÑкать отношениÑ, которые не удаётÑÑ\n"
+" заблокировать немедленно\n"
+
+#: vacuumdb.c:1179
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr ""
+" -t, --table='ТÐБЛ[(СТОЛБЦЫ)]' очиÑтить только указанную таблицу(Ñ‹)\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid ""
+" -V, --version output version information, then exit\n"
+msgstr " -V, --version показать верÑию и выйти\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze обновить ÑтатиÑтику оптимизатора\n"
+
+#: vacuumdb.c:1183
+#, c-format
+msgid ""
+" -Z, --analyze-only only update optimizer statistics; no "
+"vacuum\n"
+msgstr ""
+" -Z, --analyze-only только обновить ÑтатиÑтику оптимизатора,\n"
+" не очищать БД\n"
+
+#: vacuumdb.c:1184
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in "
+"multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages только переÑчитать ÑтатиÑтику Ð´Ð»Ñ "
+"оптимизатора\n"
+" (в неÑколько проходов Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ "
+"ÑкороÑти), без очиÑтки\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать Ñту Ñправку и выйти\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Подробнее об очиÑтке вы можете узнать в опиÑании SQL-команды VACUUM.\n"
+
+#, c-format
+#~ msgid "cannot reindex system catalogs concurrently, skipping all"
+#~ msgstr ""
+#~ "вÑе ÑиÑтемные каталоги пропуÑкаютÑÑ, так как их Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать "
+#~ "неблокирующим ÑпоÑобом"
+
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "можно указать только --locale или --lc-ctype"
+
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "можно указать только --locale и --lc-collate"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "number of parallel jobs must be at least 1"
+#~ msgstr "чиÑло параллельных заданий должно быть не меньше 1"
+
+#~ msgid "parallel workers for vacuum must be greater than or equal to zero"
+#~ msgstr ""
+#~ "чиÑло параллельных иÑполнителей Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‡Ð¸Ñтки должно быть "
+#~ "неотрицательным"
+
+#~ msgid "minimum transaction ID age must be at least 1"
+#~ msgstr "минимальный возраÑÑ‚ транзакций должен быть не меньше 1"
+
+#~ msgid "minimum multixact ID age must be at least 1"
+#~ msgstr "минимальный возраÑÑ‚ мультитранзакций должен быть не меньше 1"
+
+#~ msgid "could not connect to database %s: %s"
+#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе %s: %s"
+
+#~ msgid "parallel vacuum degree must be a non-negative integer"
+#~ msgstr ""
+#~ "Ñтепень параллельноÑти Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки должна задаватьÑÑ Ð½ÐµÐ¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ целым"
+
+#~ msgid "Could not send cancel request: %s"
+#~ msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках Ñообщайте по адреÑу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "reindexing of system catalogs failed: %s"
+#~ msgstr "переиндекÑировать ÑиÑтемные каталоги не удалоÑÑŒ: %s"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#, fuzzy
+#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n"
+#~ msgstr ""
+#~ "%s: запрошено Ñлишком много параллельных заданий (при макÑимуме: %d)\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s: неверный Ñокет: %s"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted зашифровать Ñохранённый пароль\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted не шифровать Ñохранённый пароль\n"
+
+#~ msgid "Name"
+#~ msgstr "ИмÑ"
+
+#~ msgid "no"
+#~ msgstr "нет"
+
+#~ msgid "yes"
+#~ msgstr "да"
+
+#~ msgid "Trusted?"
+#~ msgstr "Доверенный?"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Процедурные Ñзыки"
+
+#~ msgid "%s: missing required argument language name\n"
+#~ msgstr "%s: отÑутÑтвует необходимый аргумент: название Ñзыка\n"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s: поддержка Ñзыка \"%s\" уже имеетÑÑ Ð² базе \"%s\"\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s: уÑтановить поддержку Ñзыка не удалоÑÑŒ: %s"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s уÑтанавливает поддержку процедурного Ñзыка в базу PostgreSQL.\n"
+#~ "\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [ПÐРÐМЕТР]... ЯЗЫК [ИМЯ_БД]\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr ""
+#~ " -d, --dbname=ИМЯ_БД база данных, куда будет уÑтановлен Ñзык\n"
+
+#~ msgid ""
+#~ " -l, --list show a list of currently installed languages\n"
+#~ msgstr " -l, --list показать ÑпиÑок уÑтановленных Ñзыков\n"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s: поддержка Ñзыка \"%s\" не уÑтановлена в базе данных\"%s\"\n"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s: ошибка при удалении поддержки Ñзыка: %s"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s удалÑет процедурный Ñзык из базы данных.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr ""
+#~ " -d, --dbname=ИМЯ_БД база данных, из которой будет удалён Ñзык\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr ""
+#~ "%s: при выполнении только анализа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать только \"freeze\"\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ получить информацию о текущем пользователе: %s\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: не удалоÑÑŒ узнать Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ: %s\n"
+
+#~ msgid " -U, --username=USERNAME database username\n"
+#~ msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: нехватка памÑти\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you "
+#~ "will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ЕÑли параметры -d, -D, -r, -R, -s, -S или ИМЯ_РОЛИ не определены, вам "
+#~ "будет\n"
+#~ "предложено ввеÑти их интерактивно.\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help показать Ñту Ñправку и выйти\n"
+
+#~ msgid ""
+#~ " --version output version information, then exit\n"
+#~ msgstr " --version показать верÑию и выйти\n"
diff --git a/src/bin/scripts/po/sv.po b/src/bin/scripts/po/sv.po
new file mode 100644
index 0000000..5003a93
--- /dev/null
+++ b/src/bin/scripts/po/sv.po
@@ -0,0 +1,1275 @@
+# Swedish message translation file for postgresql
+# Dennis Björklund <db@zigo.dhs.org>, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Peter Eisentraut <peter_e@gmx.net>, 2013.
+# Mats Erik Andersson <bsd@gisladisker.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-23 02:50+0000\n"
+"PO-Revision-Date: 2023-08-02 07:51+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "slut på minne\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "kan inte duplicera null-pekare (internt fel)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "kunde inte slå upp effektivt användar-id %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "användaren finns inte"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "misslyckad sökning efter användarnamn: felkod %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Förfrågan om avbrytning skickad\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Kunde inte skicka förfrågan om avbrytning: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "kunde inte ansluta till databas %s: slut på minne"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:299
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "för många jobb för denna plattform"
+
+#: ../../fe_utils/parallel_slot.c:520
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "processande av databas \"%s\" misslyckades: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu rad)"
+msgstr[1] "(%lu rader)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Avbruten\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Kan inte lägga till rubrik till tabellinnehåll: antal kolumner (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Kan inte lägga till cell till tabellinnehåll: totala cellantalet (%d) överskridet.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "ogiltigt utdataformat (internt fel): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "fråga misslyckades: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Frågan var: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "kan inte klustra alla databaser och en angiven på samma gång"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "kan inte klustra angivna tabeller i alla databaser"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "klustring av tabell \"%s\" i databas \"%s\" misslyckades: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "klustring av databas \"%s\" misslyckades: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: klustring av databas \"%s\"\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s klustrar alla tidigare klustrade tabeller i en databas.\n"
+"\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1150
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1151
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [FLAGGA]... [DBNAMN]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1152
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all klustra alla databaser\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME databas att klustra\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABELL klustra enbart ingivna tabeller\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1181
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Flaggor för anslutning:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1182
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1183
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1184
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1185
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga ej efter lösenord\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1186
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password framtvinga fråga om lösenord\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1187
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAMN annat val av underhållsdatabas\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Läs beskrivningen av SQL-kommandot CLUSTER för detaljer.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1189
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1190
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "fråga gav %d rad istället för en: %s"
+msgstr[1] "fråga gav %d rader istället för en: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "j"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Var vänlig att svara \"%s\" eller \"%s\".\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" är inte ett giltigt kodningsnamn"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "misslyckades att skapa databas: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "misslyckades att skapa kommentar (databasen skapades): %s"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s skapar en PostgreSQL-databas.\n"
+"\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [FLAGGA]... [DBNAMN] [BESKRIVNING]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABELLRYMD förvalt tabellutrymme för databasen\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=KODNING teckenkodning för databasen\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOKAL lokalnamn för databasen\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOKAL värde på LC_COLLATE för databasen\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOKAL värde på LC_CTYPE för databasen\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOKAL värde på ICU-lokal för databasen\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-rules=REGLER ICU-regler för databasen\n"
+
+#: createdb.c:299
+#, c-format
+msgid ""
+" --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr ""
+" --locale-provider={libc|icu}\n"
+" lokalleverantör av databasens standardjämförelser\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=ÄGARE databasanvändare som äger nya databasen\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr ""
+" -S, --strategy=STRATEGI strategi för att skapa en databas, wal_log\n"
+" eller file_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=MALL databasmall att kopiera\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password fråga ej efter lösenord\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password framtvinga fråga om lösenord\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAMN annat val av underhållsdatabas\n"
+
+#: createdb.c:313
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Som standard skapas en databas med samma namn som den nuvarande användares namn.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Mata in namn på den roll som skall läggas till: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Mata in lösenord för den nya rollen: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Mata in det igen: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Lösenorden stämde inte överens.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "Skall den nya rollen vara en superuser?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Skall den nya rollen tillåtas skapa databaser?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Skall den nya rollen tillåtas skapa fler nya roller?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "misslyckades med lösenordskryptering: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "misslyckades med att skapa ny roll: %s"
+
+#: createuser.c:414
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s skapar en ny PostgreSQL-roll.\n"
+"\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [FLAGGA]... [ROLLNAMN]\n"
+
+#: createuser.c:418
+#, c-format
+msgid ""
+" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr ""
+" -a, --with-admin=ROLL ROLL kommer bli en medlem i nya rollen med\n"
+" adminrättigheter\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N anslutningsgräns för roll (standard: ingen gräns)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb rollen kan skapa nya databaser\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb rollen kan inte skapa databaser (standard)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROLL nya rollen kommer bli medlem i ROLL\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLL (samma som --member-of, obsolet)\n"
+
+#: createuser.c:426
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit rollen ärver rättigheter från roller den\n"
+" är medlem i (standard)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rollen ärver inga rättigheter\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login rollen kan logga in (standard)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login rollen kan inte logga in\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROLL ROLL kommer bli medlem i den nya rollen\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt tilldela den nya rollen ett lösenord\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole rollen kan skapa nya roller\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole rollen kan inte skapa roller (standard)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser rollen blir en superuser\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser rollen blir inte superuser (standard)\n"
+
+#: createuser.c:437
+#, c-format
+msgid ""
+" -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr ""
+" -v, --valid-until=TIMESTAMP\n"
+" datum och tid när rollens lösenord går ut\n"
+
+#: createuser.c:440
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive fråga efter rollnamn och egenskaper, snarare än\n"
+" att falla tillbaka på förval\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls rollen kan gå förbi säkerhet på radnivå (RLS)\n"
+
+#: createuser.c:443
+#, c-format
+msgid ""
+" --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr ""
+" --no-bypassrls rollen kan inte gå förbi säkerhet på radnivå (RLS)\n"
+" (standard)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication rollen kan starta replikering\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication rollen får inte starta replikering (standard)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som (ej den som skapas)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "saknar nödvändigt databasnamn"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "Databasen \"%s\" kommer att tas bort permanent.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Är du säker?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "borttagning av databas misslyckades: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s tar bort en PostgreSQL-databas.\n"
+"\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [FLAGGA]... DBNAMN\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force försöka stänga andra uppkopplingar innan radering\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive fråga innan något tas bort\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists felrapportera ej om databasen saknas\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Mata inn namnet på den roll som skall tas bort: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "saknar ett nödvändigt rollnamn"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Rollen \"%s\" kommer att tas bort permanent.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "borttagning av rollen \"%s\" misslyckades: %s"
+
+#: dropuser.c:169
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr "%s tar bort en PostgreSQL-roll.\n"
+
+#: dropuser.c:174
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive fråga innan något tas bort och fråga efter\n"
+" rollnamn om sådant saknas\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists felrapportera ej om användaren saknas\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=ANVÄNDARE användare som ansluter (inte den som tas bort)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "kunde inte hämta förvalda värde."
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "accepterar anslutningar\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "vägrar anslutningar\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "inget svar\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "inget försök\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "okänt\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s utför en anslutningskontroll mot en PostgreSQL-databas.\n"
+"\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [FLAGGA]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAMN databasens namn\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet tyst körning\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT databasserverns port\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SEK sekunder att vänta på anslutning; 0 stänger av (förval: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "kan inte omindexera alla databaser och samtidigt en specifik databas"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "kan inte omindexera alla databaser samtidigt med systemkatalogerna"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "kan inte omindexera angivna scheman i alla databaser"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "Kan inte indexera specifik tabell i alla databaser"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "Kan inte omindexera angivet index i alla databaser"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "kan inte omindexera angivna scheman och systemkataloger på samma gång"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "kan inte omindexera specifik tabell och systemkatalogerna samtidigt"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "kan inte omindexera angivna index och systemkatalogerna samtidigt."
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "kan inte använda multipla jobb för att omindexera systemkataloger"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "kan inte använda multipla jobb för att omindexera index"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "flaggan \"%s\" kan inte användas på serverversioner äldre än PostgreSQL %s"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "omindexering av databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "omindexering av index \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "omindexering av schemat \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "omindexering av systemkataloger i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "omindexering av tabell \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: omindexering av databasen \"%s\"\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s indexerar om en PostgreSQL-databas.\n"
+"\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all indexera om alla databaser\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently indexera om utan att låsa\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME databas att indexera om\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX återskapa enbart angivna index\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr ""
+" -j, --jobs=NUM använd så här många samtida anslutningar\n"
+" för omindexering\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system indexera enbart om systemkataloger\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA indexera enbart om angivna scheman\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABELL indexera enbart om angivna tabeller\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABELLRYMD tabellutrymme där index byggs om\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Läs beskrivningen av SQL-kommandot REINDEX för detaljer.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "flaggan \"%s\" kan inte användas vid enbart analys"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "flaggan \"%s\" kan inte användas vid \"full vacuum\""
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "flaggan \"%s\" kan inte användas tillsammans med flaggan \"%s\""
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "kan inte städa alla databaser och endast en angiven på samma gång"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "kan inte städa en specifik tabell i alla databaser."
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "kan inte städa en angivna scheman i alla databaser."
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "kan inte exkludera angivna scheman i alla databaser"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "kan inte städa alla tabeller i scheman samt angivna tabeller på samma gång"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "kan inte städa angivna scheman och exkludera scheman på samma gång"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "kan inte städa alla tabeller i scheman och exkludera scheman på samma gång"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Skapar minimal optimeringsstatistik (1 mål)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Skapar medium optimeringsstatistik (10 mål)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "Skapar förvald (full) optimeringsstatistik"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: processar databasen \"%s\": %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: städar databasen \"%s\".\n"
+
+#: vacuumdb.c:1138
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "städning av tabell \"%s\" i databasen \"%s\" misslyckades: %s"
+
+#: vacuumdb.c:1141
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "städning av databasen \"%s\" misslyckades: %s"
+
+#: vacuumdb.c:1149
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s städar och analyserar en PostgreSQL-databas.\n"
+"\n"
+
+#: vacuumdb.c:1153
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all städa i alla databaser\n"
+
+#: vacuumdb.c:1154
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=STORLEK storlek på ringbuffert som används vid städning\n"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAMN databas att städa i\n"
+
+#: vacuumdb.c:1156
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping stäng av alla sidöverhoppande beteeenden\n"
+
+#: vacuumdb.c:1157
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo visa kommandon som skickas till servern\n"
+
+#: vacuumdb.c:1158
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full utför full städning\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze frys information om radtransaktioner\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup ta alltid bort indexposter som pekar på döda tupler\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM använd så här många samtida anslutningar för städning\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_ÅLDER minimal multixact-ID-ålder i tabeller som skall städas\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_ÅLDER minimal transaktions-ID-ålder i tabeller som skall städas\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup ta inte bort indexposter som pekar på döda tupler\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main skippa huvudrelationen\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast hoppa över TOAST-tabellen som hör ihop med tabellen som städas\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate trunkera inte tomma sidor i slutet av tabellen\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=MALL städa enbart tabeller i angiva scheman\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=MALL städa inte tabeller i angivna scheman\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr ""
+" -P, --parallel=PARALLELLA_ARBETARE\n"
+" använda så här många bakgrundsarbetare för städning, om det finns\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet skriv inte ut några meddelanden\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked hoppa äver relationer som inte kan låsas direkt\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABELL[(KOLUMNER)]' städa enbart i dessa tabeller\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose skriv massor med utdata\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze uppdatera optimeringsstatistik\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only uppdatera bara optimeringsstatistik; ingen städning\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages uppdatera bara optimeringsstatistik, men i\n"
+" flera steg för snabbare resultat; ingen städning\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: vacuumdb.c:1188
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Läs beskrivningen av SQL-kommandot VACUUM för detaljer.\n"
+
+#, c-format
+#~ msgid "cannot reindex system catalogs concurrently, skipping all"
+#~ msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-collate can be specified"
+#~ msgstr "endast en av --locale och --lc-collate kan anges"
+
+#, c-format
+#~ msgid "only one of --locale and --lc-ctype can be specified"
+#~ msgstr "endast en av --locale och --lc-ctype kan anges"
diff --git a/src/bin/scripts/po/tr.po b/src/bin/scripts/po/tr.po
new file mode 100644
index 0000000..0565244
--- /dev/null
+++ b/src/bin/scripts/po/tr.po
@@ -0,0 +1,1223 @@
+# translation of pgscripts-tr.po to Turkish
+# Devrim GUNDUZ <devrim@CommandPrompt.com>, 2004, 2005, 2006, 2007.
+# Nicolai Tufar <ntufar@gmail.org>, 2005, 2006, 2007.
+# İbrahim Edib Kökdemir <>, 2018.
+# Abdullah G. GÃœLNER <>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts-tr\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2019-04-26 13:47+0000\n"
+"PO-Revision-Date: 2021-09-16 09:36+0200\n"
+"Last-Translator: Abdullah G. GüLNER\n"
+"Language-Team: Turkish <ceviri@postgresql.org.tr>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Basepath: /home/ntufar/pg/pgsql/src/bin/scripts\n"
+"X-Poedit-SearchPath-0: /home/ntufar/pg/pgsql/src/bin/scripts\n"
+
+#: ../../../src/fe_utils/logging.c:182
+#, c-format
+msgid "fatal: "
+msgstr "ölümcül (fatal): "
+
+#: ../../../src/fe_utils/logging.c:189
+#, c-format
+msgid "error: "
+msgstr "hata: "
+
+#: ../../../src/fe_utils/logging.c:196
+#, c-format
+msgid "warning: "
+msgstr "uyarı: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: ../../common/fe_memutils.c:92
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "null pointer duplicate edilemiyor (iç hata)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "geçerli kullanıcı ID si bulunamadı %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "kullanıcı mevcut değil"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "kullanıcı adı arama başarısız: hata kodu %lu"
+
+#: ../../fe_utils/print.c:353
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu satır)"
+msgstr[1] "(%lu satır)"
+
+#: ../../fe_utils/print.c:3058
+#, c-format
+msgid "Interrupted\n"
+msgstr "kesildi\n"
+
+#: ../../fe_utils/print.c:3122
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "B aşlık tablo içeriğine eklenemedi: %d kolon sayısı aşıldı.\n"
+
+#: ../../fe_utils/print.c:3162
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Hücre tablo içeriğine eklenemedi: %d olan toplan hücre sayısı açıldı.\n"
+
+#: ../../fe_utils/print.c:3417
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "geçersiz çıktı biçimi (iç hata): %d"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:121 createdb.c:140
+#: createuser.c:168 createuser.c:183 dropdb.c:96 dropdb.c:105 dropdb.c:113
+#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 pg_isready.c:109
+#: reindexdb.c:139 reindexdb.c:158 vacuumdb.c:246 vacuumdb.c:265
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" komutunu deneyiniz.\n"
+
+#: clusterdb.c:130 createdb.c:138 createuser.c:181 dropdb.c:111 dropuser.c:105
+#: pg_isready.c:107 reindexdb.c:156 vacuumdb.c:263
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "çok sayıda komut satırı argümanı (ilki \"%s\")"
+
+#: clusterdb.c:142
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "aynı anda tüm veritabanları ve de belirli bir tanesi cluster edilemez"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli tablo(lar) cluster edilemez"
+
+#: clusterdb.c:216
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\"tablosunun cluster işlemi başarısız oldu: %3$s"
+
+#: clusterdb.c:219
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanının cluster işlemi başarısız oldu: %s"
+
+#: clusterdb.c:252
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: \"%s\" veritabanı cluster ediliyor\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s komutu bir veritabanında daha önceden cluster edilmiş tüm tabloları cluster eder.\n"
+"\n"
+
+#: clusterdb.c:274 createdb.c:250 createuser.c:344 dropdb.c:157 dropuser.c:163
+#: pg_isready.c:224 reindexdb.c:425 vacuumdb.c:1213
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: clusterdb.c:275 reindexdb.c:426 vacuumdb.c:1214
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [SEÇENEK]... [VERİTABANI_ADI]\n"
+
+#: clusterdb.c:276 createdb.c:252 createuser.c:346 dropdb.c:159 dropuser.c:165
+#: pg_isready.c:227 reindexdb.c:427 vacuumdb.c:1215
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Seçenekler:\n"
+
+#: clusterdb.c:277
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all tüm veritabanlarını cluster eder\n"
+
+#: clusterdb.c:278
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=VERİTABANI_ADI cluster edilecek veritabanı adı\n"
+
+#: clusterdb.c:279 createuser.c:350 dropdb.c:160 dropuser.c:166 reindexdb.c:431
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo sunucuya gönderilen komutları göster\n"
+
+#: clusterdb.c:280 reindexdb.c:433
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet hiçbir ileti yazma\n"
+
+#: clusterdb.c:281
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLO_ADI sadece belirli (bir) tabloyu/tabloları cluster eder\n"
+
+#: clusterdb.c:282 reindexdb.c:437
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose bolca çıktı yaz\n"
+
+#: clusterdb.c:283 createuser.c:362 dropdb.c:162 dropuser.c:169 reindexdb.c:438
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: clusterdb.c:284 createuser.c:367 dropdb.c:164 dropuser.c:171 reindexdb.c:439
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: clusterdb.c:285 createdb.c:263 createuser.c:368 dropdb.c:165 dropuser.c:172
+#: pg_isready.c:233 reindexdb.c:440 vacuumdb.c:1235
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"Bağlantı seçenekleri:\n"
+
+#: clusterdb.c:286 createuser.c:369 dropdb.c:166 dropuser.c:173 reindexdb.c:441
+#: vacuumdb.c:1236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: clusterdb.c:287 createuser.c:370 dropdb.c:167 dropuser.c:174 reindexdb.c:442
+#: vacuumdb.c:1237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT veritabanı sunucusunun portu\n"
+
+#: clusterdb.c:288 dropdb.c:168 reindexdb.c:443 vacuumdb.c:1238
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: clusterdb.c:289 createuser.c:372 dropdb.c:169 dropuser.c:176 reindexdb.c:444
+#: vacuumdb.c:1239
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password parola sorma\n"
+
+#: clusterdb.c:290 createuser.c:373 dropdb.c:170 dropuser.c:177 reindexdb.c:445
+#: vacuumdb.c:1240
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password parola sorulmasını sağla\n"
+
+#: clusterdb.c:291 dropdb.c:171 reindexdb.c:446 vacuumdb.c:1241
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=VTADI alternatif bakım veritabanı\n"
+
+#: clusterdb.c:292
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"Ayrıntılar için bir SQL komutu olan CLUSTER'in açıklamasını okuyabilirsiniz.\n"
+
+#: clusterdb.c:293 createdb.c:271 createuser.c:374 dropdb.c:172 dropuser.c:178
+#: pg_isready.c:238 reindexdb.c:448 vacuumdb.c:1243
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@lists.postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: common.c:84 common.c:130
+msgid "Password: "
+msgstr "Parola: "
+
+#: common.c:117
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "%s veritabanına bağlanılamadı: bellek yetersiz"
+
+#: common.c:144
+#, c-format
+msgid "could not connect to database %s: %s"
+msgstr "%s veritabanına bağlanılamadı: %s"
+
+#: common.c:197 common.c:223
+#, c-format
+msgid "query failed: %s"
+msgstr "sorgu başarısız oldu: %s"
+
+#: common.c:198 common.c:224
+#, c-format
+msgid "query was: %s"
+msgstr "sorgu ÅŸu idi: %s"
+
+#: common.c:347
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "sorgu 1 yerine %d satır döndürdü: %s"
+msgstr[1] "sorgu 1 yerine %d satır döndürdü: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:372
+msgid "y"
+msgstr "e"
+
+#. translator: abbreviation for "no"
+#: common.c:374
+msgid "n"
+msgstr "h"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:384
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:398
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Lütfen yanıtlayınız: \"%s\" veya \"%s\".\n"
+
+#: common.c:477 common.c:514
+#, c-format
+msgid "Cancel request sent\n"
+msgstr "İptal isteği gönderildi\n"
+
+#: common.c:480 common.c:518
+#, c-format
+msgid "Could not send cancel request: %s"
+msgstr "İptal isteği gönderilemedi: %s"
+
+#: createdb.c:148
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "--locale ve --lc-ctype seçeneklerinden sadece birisi belirtilebilir"
+
+#: createdb.c:153
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "--locale ve --lc-collate seçeneklerinden sadece birisi belirtilebilir"
+
+#: createdb.c:164
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" geçerli bir dil kodlaması adı değildir"
+
+#: createdb.c:212
+#, c-format
+msgid "database creation failed: %s"
+msgstr "veritabanı yaratma başarısız oldu: %s"
+
+#: createdb.c:231
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "yorum yaratma işlemi başarısız oldu (veritabanı yaratıldı): %s"
+
+#: createdb.c:249
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanı yaratır.\n"
+"\n"
+
+#: createdb.c:251
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [SEÇENEK]... [VERİTABANI_ADI] [TANIM]\n"
+
+#: createdb.c:253
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE veritabanı için öntanımlı tablo uzayı\n"
+
+#: createdb.c:254
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo sunucuya gönderilen komutları göster\n"
+
+#: createdb.c:255
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING veritabanı için dil kodlaması\n"
+
+#: createdb.c:256
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE veritabanı için yerel ayarları\n"
+
+#: createdb.c:257
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE Veritabanı için LC_COLLATE ayarı\n"
+
+#: createdb.c:258
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE Veritabanı için LC_CTYPE ayarı\n"
+
+#: createdb.c:259
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER yeni veritabanının sahibi olacak veritabanı kullanıcısı\n"
+
+#: createdb.c:260
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE kopyalanacak şablon veritabanı\n"
+
+#: createdb.c:261
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: createdb.c:262
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonra çık\n"
+
+#: createdb.c:264
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: createdb.c:265
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT veritabanı sunucu portu\n"
+
+#: createdb.c:266
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: createdb.c:267
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password asla parola sorma\n"
+
+#: createdb.c:268
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password parola sormasını sağla\n"
+
+#: createdb.c:269
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=VTADI alternatif bakım veritabanı\n"
+
+#: createdb.c:270
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"Öntanımlı olarak , mevcut kullanıcı ile aynı adda veritabanı yaratılır.\n"
+
+#: createuser.c:191
+msgid "Enter name of role to add: "
+msgstr "Eklenecek rol adını girin: "
+
+#: createuser.c:208
+msgid "Enter password for new role: "
+msgstr "Yeni rol için parola girin: "
+
+#: createuser.c:210
+msgid "Enter it again: "
+msgstr "Yeniden girin: "
+
+#: createuser.c:213
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Parolalar uyuşmadı.\n"
+
+#: createuser.c:221
+msgid "Shall the new role be a superuser?"
+msgstr "Yeni rol superuser olsun mu?"
+
+#: createuser.c:236
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Yeni rol, veritabanı oluşturabilsin mi?"
+
+#: createuser.c:244
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Yeni rol, baÅŸka yeni roller oluÅŸturabilsin mi?"
+
+#: createuser.c:274
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "parola şifreleme hatası: %s"
+
+#: createuser.c:329
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "yeni rol oluşturma işlemi başarısız oldu: %s"
+
+#: createuser.c:343
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s yeni bir PostgreSQL rol oluÅŸturur.\n"
+"\n"
+
+#: createuser.c:345 dropuser.c:164
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [SEÇENEKLER]... [ROL_ADI]\n"
+
+#: createuser.c:347
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N rol için azami bağlantı sayısı (varsayılan: sınırsız)\n"
+
+#: createuser.c:348
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb rol yeni veritabanı oluşturabiliyor\n"
+
+#: createuser.c:349
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb rol veritabanı oluşturamaz (varsayılan)\n"
+
+#: createuser.c:351
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROL yeni rol bu rolün üyesi olacaktır\n"
+
+#: createuser.c:352
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit rol, üye olduğu rollerin yetkilerini \n"
+" miras alır (varsayılan)\n"
+
+#: createuser.c:354
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit rol, hiçbir yetkiyi miras almaz\n"
+
+#: createuser.c:355
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login rol giriÅŸ yapabiliyor\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login role giriÅŸ yapamaz\n"
+
+#: createuser.c:357
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt yeni role bir ÅŸifre atar\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole rol yeni rol oluÅŸturabiliyor\n"
+
+#: createuser.c:359
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole rol başka bir rol oluşturamaz (varsayılan)\n"
+
+#: createuser.c:360
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser rol, superuser olacaktır\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser rol, superuser olmayacaktır (varsayılan)\n"
+
+#: createuser.c:363
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive varsayılanları kullanmaktansa eksik rol ve niteliklerin\n"
+" girilmesini saÄŸla\n"
+
+#: createuser.c:365
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication rol replikasyon baÅŸlatabilir\n"
+
+#: createuser.c:366
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication rol replikasyon baÅŸlatamaz\n"
+
+#: createuser.c:371
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı (yaratılacak değil)\n"
+
+#: dropdb.c:104
+#, c-format
+msgid "missing required argument database name"
+msgstr "gerekli argüman eksik: veritabanı adı"
+
+#: dropdb.c:119
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" veritabanı kalıcı olarak silinecektir.\n"
+
+#: dropdb.c:120 dropuser.c:130
+msgid "Are you sure?"
+msgstr "Emin misiniz?"
+
+#: dropdb.c:142
+#, c-format
+msgid "database removal failed: %s"
+msgstr "veritabanı silme işlemi başarısız oldu: %s"
+
+#: dropdb.c:156
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL veritabanını siler.\n"
+"\n"
+
+#: dropdb.c:158
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [SEÇENEK]... VERİTABANI_ADI\n"
+
+#: dropdb.c:161
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive herhangi birşeyi silmeden önce uyarı verir\n"
+
+#: dropdb.c:163
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists don't report error if database doesn't exist\n"
+
+#: dropuser.c:115
+msgid "Enter name of role to drop: "
+msgstr "Silinecek rolün adını giriniz: "
+
+#: dropuser.c:121
+#, c-format
+msgid "missing required argument role name"
+msgstr "gerekli bir argüman olan rol adı eksik"
+
+#: dropuser.c:129
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "\"%s\" rolü kalıcı olarak silinecektir.\n"
+
+#: dropuser.c:147
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "\"%s\" rolünün silinmesi başarısız oldu: %s"
+
+#: dropuser.c:162
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL rolünü siler.\n"
+"\n"
+
+#: dropuser.c:167
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive herhangi birşeyi silmeden önce uyarı ver, ve\n"
+" belirtilmemişse rol adının girilmesini iste\n"
+
+#: dropuser.c:170
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists kullanıcı mevcut değilse bildirimde bulunma\n"
+
+#: dropuser.c:175
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=KULLANICI _ADI bağlanırken kullanılacak kullanıcı adı (silinecek olan değil)\n"
+
+#: pg_isready.c:144
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: pg_isready.c:152
+#, c-format
+msgid "could not fetch default options"
+msgstr "varsayılan seçenekler getirilemedi"
+
+#: pg_isready.c:201
+#, c-format
+msgid "accepting connections\n"
+msgstr "bağlantılar kabul ediliyor\n"
+
+#: pg_isready.c:204
+#, c-format
+msgid "rejecting connections\n"
+msgstr "bağlantılar reddediliyor\n"
+
+#: pg_isready.c:207
+#, c-format
+msgid "no response\n"
+msgstr "cevap yok\n"
+
+#: pg_isready.c:210
+#, c-format
+msgid "no attempt\n"
+msgstr "deneme yok\n"
+
+#: pg_isready.c:213
+#, c-format
+msgid "unknown\n"
+msgstr "bilinmeyen\n"
+
+#: pg_isready.c:223
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanına bağlantı kontrolü sağlar.\n"
+"\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [SEÇENEK]...\n"
+
+#: pg_isready.c:228
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=VERİTABANI_ADI veritabanı adı\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet sessizce çalış\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini gösterir ve sonra çıkar\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı gösterir ve sonra çıkar\n"
+
+#: pg_isready.c:234
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME veritabanı sunucusu adresi ya da soket dizini\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT veritabanı sunucusunun portu\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SANİYE bağlantı denenirken beklenecek saniye, 0 devre dışı bırakır (vrsayılan: %s)\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=KULLANICI_ADI bağlanılacak kullanıcı adı\n"
+
+#: reindexdb.c:168
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "aynı anda hem tüm veritabanları hem belirli bir veritabanı tekrar indekslenemez"
+
+#: reindexdb.c:173
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "aynı anda tüm veritabanları ve sistem katalogları reindex edilemez"
+
+#: reindexdb.c:178
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli şema(lar) tekrar indekslenemez"
+
+#: reindexdb.c:183
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli tablo(lar) tekrar indekslenemez"
+
+#: reindexdb.c:188
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "tüm veritabanlarındaki belirli ndeks(ler) tekrar indekslenemez"
+
+#: reindexdb.c:199
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "aynı anda belirli şema(lar) ve sistem katalogları tekrar indekslenemez"
+
+#: reindexdb.c:204
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "aynı anda belirli tablo(lar) ve sistem katalogları tekrar indekslenemez"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "aynı anda belirli indeks(ler) ve sistem katalogları tekrar indekslenemez"
+
+#: reindexdb.c:298
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "PostgreSQL %2$s den eski sunucu sürümlerinde \"%1$s\" seçeneği kullanılamaz"
+
+#: reindexdb.c:326
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" tablosunun tekrar indeksleme işlemi başarısız: %3$s"
+
+#: reindexdb.c:329
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" indeksinin yeniden oluşturulması başarısız: %3$s"
+
+#: reindexdb.c:332
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" şemasının tekrar indeksleme işlemi başarısız: %3$s"
+
+#: reindexdb.c:335
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanının yeniden indekslenmesi başarısız oldu: %s"
+
+#: reindexdb.c:369
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: \"%s\" veritabanı yeniden indeksleniyor\n"
+
+#: reindexdb.c:412
+#, c-format
+msgid "reindexing of system catalogs failed: %s"
+msgstr "sistem kataloglarının yeniden indekslemesi başarısız: %s"
+
+#: reindexdb.c:424
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s PostgreSQL veritabanını yeniden indeksler.\n"
+"\n"
+
+#: reindexdb.c:428
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all tüm veritabanlarını yeniden indeksle\n"
+
+#: reindexdb.c:429
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently eşzamanlı olarak yeniden indeksle\n"
+
+#: reindexdb.c:430
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=VERİTABANI_ADI yeniden indekslenecek veritabanı adı\n"
+
+#: reindexdb.c:432
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX sadece belirli indeks(ler)i yeniden oluÅŸtur\n"
+
+#: reindexdb.c:434
+#, c-format
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system sistem kataloglarını yeniden indeksle\n"
+
+#: reindexdb.c:435
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=ŞEMA sadece belirtilen şema veya şemaları tekrar indeksle\n"
+
+#: reindexdb.c:436
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLO_ADI sadece belirli bir tablonun veya tabloların indekslerini yeniden oluştur\n"
+
+#: reindexdb.c:447
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"Ayrıntılar için bir REINDEX SQL komutunun açıklamasını okuyabilirsiniz.\n"
+
+#: vacuumdb.c:207
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "paralel iş sayısı en azından 1 olmalı"
+
+#: vacuumdb.c:212
+#, c-format
+msgid "too many parallel jobs requested (maximum: %d)"
+msgstr "çok fazla paralel iş talep edildi (azami: %d)"
+
+#: vacuumdb.c:233
+#, c-format
+msgid "minimum transaction ID age must be at least 1"
+msgstr "asgari transaction ID yaşı en az 1 olmalı"
+
+#: vacuumdb.c:241
+#, c-format
+msgid "minimum multixact ID age must be at least 1"
+msgstr "asgari multixact ID yaşı en az 1 olmalı"
+
+#: vacuumdb.c:273 vacuumdb.c:279 vacuumdb.c:285
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "sadece analyze gerçekleştirilirken \"%s\" seçeneği kullanılamaz"
+
+#: vacuumdb.c:302
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "aynı anda tüm veritabanları ve de belirli bir tanesi vakumlanamaz"
+
+#: vacuumdb.c:307
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "tüm veritabanlarındaki belirli (bir) tablo(lar) vakumlanamaz"
+
+#: vacuumdb.c:398
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Minimal optimizer istatistikleri oluÅŸturuluyor (1 hedef)"
+
+#: vacuumdb.c:399
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Orta ölçekte optimizer istatistikleri oluşturuluyor (10 hedef)"
+
+#: vacuumdb.c:400
+msgid "Generating default (full) optimizer statistics"
+msgstr "Varsayılan (tam) optimizer istatistikleri oluşturuluyor"
+
+#: vacuumdb.c:412 vacuumdb.c:427 vacuumdb.c:434
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL 9.6"
+msgstr "PostgreSQL 9,6'dan eski sunucu sürümlerinde \"%s\" seçeneği kullanılamaz"
+
+#: vacuumdb.c:420
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL 12"
+msgstr "PostgreSQL 12'den eski sunucu sürümlerinde \"%s\" seçeneği kullanılamaz"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: \"%s\" veritabanı üzerinde işlem yapılıyor: %s\n"
+
+#: vacuumdb.c:445
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: \"%s\" veritabanı vakumlanıyor\n"
+
+#: vacuumdb.c:939
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "\"%2$s\" veritabanındaki \"%1$s\" tablosunun vakumlama işlemi başarısız oldu: %3$s"
+
+#: vacuumdb.c:942 vacuumdb.c:1077
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "\"%s\" veritabanının vakumlanması başarısız oldu: %s"
+
+#: vacuumdb.c:1212
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s bir PostgreSQL veritabanını temizler ve analiz eder.\n"
+"\n"
+
+#: vacuumdb.c:1216
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all tüm veritabanlarını vakumlar\n"
+
+#: vacuumdb.c:1217
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=VERİTABANI_ADI vakumlanacak veritabanı\n"
+
+#: vacuumdb.c:1218
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping bütün sayfa atlama davranışını devre dışı bırak\n"
+
+#: vacuumdb.c:1219
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo sunucuya gönderilen komutları yaz\n"
+
+#: vacuumdb.c:1220
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full tam (FULL) vakumlama yap\n"
+
+#: vacuumdb.c:1221
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze Dondurulan satır transaction bilgisi\n"
+
+#: vacuumdb.c:1222
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=SAYI vakum için bu sayı kadar eşzamanlı bağlantı kullan\n"
+
+#: vacuumdb.c:1223
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE vakumlanacak tabloların asgari multixact ID yaşı\n"
+
+#: vacuumdb.c:1224
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE vakumlanacak tabloların asgari transaction ID yaşı\n"
+
+#: vacuumdb.c:1225
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet hiçbir mesaj yazma\n"
+
+#: vacuumdb.c:1226
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked hemen kilitlenemeyecek tabloları atla\n"
+
+#: vacuumdb.c:1227
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLO[(KOLONLAR)]' sadece belirli bir tabloyu / tabloları vakumlar\n"
+
+#: vacuumdb.c:1228
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose bolca çıktı yaz\n"
+
+#: vacuumdb.c:1229
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini göster, sonra çık\n"
+
+#: vacuumdb.c:1230
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze optimizer istatistiklerini güncelle\n"
+
+#: vacuumdb.c:1231
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -z, --analyze-only sadece optimizer bilgilerini güncelle; vakum işlemi yok\n"
+
+#: vacuumdb.c:1232
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages sadece optimizer istatistiklerini güncelle, daha hızlı\n"
+" sonuç için birden fazla aşamada; vakum işlemi yok\n"
+
+#: vacuumdb.c:1234
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonrasında çık\n"
+
+#: vacuumdb.c:1242
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"Ayrıntılar için, bir SQL komutu olan VACUUM'un tanımlarını okuyun.\n"
+
+#~ msgid "%s: invalid socket: %s"
+#~ msgstr "%s: geçersiz soket: %s"
+
+#~ msgid "Could not send cancel request: %s\n"
+#~ msgstr "İptal isteği gönderilemedi: %s\n"
+
+#~ msgid " -q, --quiet don't write any messages\n"
+#~ msgstr " -q, --quiet Hiç bir mesaj yazma\n"
+
+#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n"
+#~ msgstr "pg_strdup: null pointer duplicate edilemiyor (iç hata)\n"
+
+#~ msgid "%s: out of memory\n"
+#~ msgstr "%s: yetersiz bellek\n"
+
+#~ msgid "%s: could not get current user name: %s\n"
+#~ msgstr "%s: geçerli kullanıcı adı alınamadı: %s\n"
+
+#~ msgid "%s: could not obtain information about current user: %s\n"
+#~ msgstr "%s: geçerli kullanıcı hakkında bilgi alınamadı: %s\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n"
+#~ msgstr "%s: sadece analyze işlemi yapıldığında \"freeze\" seçeneğini kullanamaz\n"
+
+#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n"
+#~ msgstr " -d, --dbname=VERİTABANI_ADI dilin sileneceği veritabanının adı\n"
+
+#~ msgid ""
+#~ "%s removes a procedural language from a database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s veritabanından yordamsal bir dili siler.\n"
+#~ "\n"
+
+#~ msgid "%s: language removal failed: %s"
+#~ msgstr "%s: dil silme işlemi başarısız oldu: %s"
+
+#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n"
+#~ msgstr "%s: %s fonksiyon, \"%s\" dilinde tanımlanmış durumda; dil kaldırılamadı\n"
+
+#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n"
+#~ msgstr "%s: \"%s\" dili \"%s\" veritabanında kurulu değil \n"
+
+#~ msgid ""
+#~ "\n"
+#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n"
+#~ "be prompted interactively.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "EÄŸer -d, -D, -r, -R, -s, -S ve ROLENAME'den birisi belirtilmezse, bunlar size\n"
+#~ "etkileşimli olarak sorulacaktır.\n"
+
+#~ msgid " -N, --unencrypted do not encrypt stored password\n"
+#~ msgstr " -N, --unencrypted saklanmış şifreyi kriptolamaz\n"
+
+#~ msgid " -E, --encrypted encrypt stored password\n"
+#~ msgstr " -E, --encrypted saklanan ÅŸifreleri encrypt eder\n"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid " -l, --list show a list of currently installed languages\n"
+#~ msgstr " -l, --list Şu anda kurulu olan dilleri göster\n"
+
+#~ msgid " -d, --dbname=DBNAME database to install language in\n"
+#~ msgstr " -d, --dbname=VERİTABANI_ADI dilin kurulacağı veritabanının adı\n"
+
+#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n"
+#~ msgstr " %s [SEÇENEK]... DİL_ADI [VERİTABANI_ADI]\n"
+
+#~ msgid ""
+#~ "%s installs a procedural language into a PostgreSQL database.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s Bir PostgreSQL veritabanına yordamsal bir dil kurar.\n"
+#~ "\n"
+
+#~ msgid "%s: language installation failed: %s"
+#~ msgstr "%s: Dil kurulumu başarısız oldu: %s"
+
+#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n"
+#~ msgstr "%s: \"%s\" dili daha önceden veritabanına yüklenmiştir \"%s\"\n"
+
+#~ msgid "Procedural Languages"
+#~ msgstr "Yordamsal Diller"
+
+#~ msgid "Trusted?"
+#~ msgstr "Güvenilir mi?"
+
+#~ msgid "no"
+#~ msgstr "hayır"
+
+#~ msgid "yes"
+#~ msgstr "evet"
+
+#~ msgid "Name"
+#~ msgstr "Adı"
+
+#~ msgid " --version output version information, then exit\n"
+#~ msgstr " --version sürüm bilgisini göster ve çık\n"
+
+#~ msgid " --help show this help, then exit\n"
+#~ msgstr " --help bu yardımı göster ve çık\n"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#~ msgid "%s: \"%s\" is not a valid encoding name\n"
+#~ msgstr "%s: \"%s\" geçerli bir dil kodlaması değil\n"
+
+#~ msgid "%s: query returned %d row instead of one: %s\n"
+#~ msgid_plural "%s: query returned %d rows instead of one: %s\n"
+#~ msgstr[0] "%s: sorgu bir yerine %d satır döndürdü: %s\n"
+#~ msgstr[1] "%s: sorgu bir yerine %d satır döndürdü: %s\n"
+
+#~ msgid "%s: query was: %s\n"
+#~ msgstr "%s: sorgu ÅŸu idi: %s\n"
+
+#~ msgid "%s: query failed: %s"
+#~ msgstr "%s: sorgu başarısız oldu: %s"
diff --git a/src/bin/scripts/po/uk.po b/src/bin/scripts/po/uk.po
new file mode 100644
index 0000000..9d8769a
--- /dev/null
+++ b/src/bin/scripts/po/uk.po
@@ -0,0 +1,1210 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:19+0000\n"
+"PO-Revision-Date: 2023-12-20 11:53\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pgscripts.pot\n"
+"X-Crowdin-File-ID: 967\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередженнÑ: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161
+#, c-format
+msgid "out of memory\n"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "кориÑтувача не Ñ–Ñнує"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu"
+
+#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238
+msgid "Cancel request sent\n"
+msgstr "Запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹\n"
+
+#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239
+msgid "Could not send cancel request: "
+msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103
+msgid "Password: "
+msgstr "Пароль: "
+
+#: ../../fe_utils/connect_utils.c:91
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "не можливо під'єднатиÑÑ Ð´Ð¾ бази даних %s: не виÑтачає пам'ÑÑ‚Ñ–"
+
+#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: ../../fe_utils/parallel_slot.c:317
+#, c-format
+msgid "too many jobs for this platform: %d"
+msgstr "занадто багато завдань Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи: %d"
+
+#: ../../fe_utils/parallel_slot.c:326
+#, c-format
+msgid "socket file descriptor out of range for select(): %d"
+msgstr "деÑкриптор файлу Ñокету поза діапазоном Ð´Ð»Ñ select(): %d"
+
+#: ../../fe_utils/parallel_slot.c:328
+#, c-format
+msgid "Try fewer jobs."
+msgstr "Спробуйте менше робочих завдань."
+
+#: ../../fe_utils/parallel_slot.c:553
+#, c-format
+msgid "processing of database \"%s\" failed: %s"
+msgstr "обробка бази даних \"%s\" не вдалаÑÑŒ: %s"
+
+#: ../../fe_utils/print.c:406
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu Ñ€Ñдок)"
+msgstr[1] "(%lu Ñ€Ñдки)"
+msgstr[2] "(%lu Ñ€Ñдків)"
+msgstr[3] "(%lu Ñ€Ñдка)"
+
+#: ../../fe_utils/print.c:3154
+#, c-format
+msgid "Interrupted\n"
+msgstr "Перервано\n"
+
+#: ../../fe_utils/print.c:3218
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "Ðеможливо додати заголовок до вміÑту таблиці: кількіÑÑ‚ÑŒ колонок %d перевищено.\n"
+
+#: ../../fe_utils/print.c:3258
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "Ðеможливо додати комірку до вміÑту таблиці: перевищено загальну кількіÑÑ‚ÑŒ комірок %d.\n"
+
+#: ../../fe_utils/print.c:3516
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "невірний формат виводу (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "запит не вдавÑÑ: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "Query was: %s"
+msgstr "Запит був: %s"
+
+#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163
+#: 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:174 reindexdb.c:193 vacuumdb.c:279 vacuumdb.c:299
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації."
+
+#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108
+#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:297
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "неможливо клаÑтеризувати вÑÑ– бази даних Ñ– одну вказану одночаÑно"
+
+#: clusterdb.c:151
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "неможливо клаÑтеризувати вказані таблиці у вÑÑ–Ñ… базах даних"
+
+#: clusterdb.c:215
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "клаÑтеризувати таблицю \"%s\" у базі даних \"%s\" не вдалоÑÑ: %s"
+
+#: clusterdb.c:218
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "клаÑтеризувати базу даних \"%s\" не вдалоÑÑ: %s"
+
+#: clusterdb.c:248
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"\n"
+
+#: clusterdb.c:264
+#, c-format
+msgid "%s clusters all previously clustered tables in a database.\n\n"
+msgstr "%s клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ ÑƒÑÑ–Ñ… попередньо клаÑтеризованих таблиць в базі даних.\n\n"
+
+#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170
+#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1156
+#, c-format
+msgid "Usage:\n"
+msgstr "ВикориÑтаннÑ:\n"
+
+#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1157
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [OPTION]... [DBNAME]\n"
+
+#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172
+#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1158
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: clusterdb.c:268
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ ÑƒÑÑ–Ñ… баз даних\n"
+
+#: clusterdb.c:269
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=ІМ'Я_БД база даних Ð´Ð»Ñ ÐºÐ»Ð°Ñтеризації\n"
+
+#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не виводити жодних повідомлень\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=ТÐБЛИЦЯ клаÑтеризувати тільки вказані таблиці\n"
+
+#: clusterdb.c:273
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато інформації\n"
+
+#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179
+#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1187
+#, c-format
+msgid "\n"
+"Connection options:\n"
+msgstr "\n"
+"ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n"
+
+#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1188
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n"
+
+#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1189
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT порт Ñервера бази даних\n"
+
+#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1190
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ІМ'Я_КОРИСТУВÐЧРім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n"
+
+#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1191
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1192
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запроÑити пароль\n"
+
+#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1193
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME альтернативна бази даних Ð´Ð»Ñ Ð¾Ð±ÑлуговуваннÑ\n"
+
+#: clusterdb.c:283
+#, c-format
+msgid "\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr "\n"
+"Ð”Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ читайте Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ SQL CLUSTER.\n"
+
+#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1195
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"ПовідомлÑти про помилки на <%s>.\n"
+
+#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186
+#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1196
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "запит повернув %d Ñ€Ñдок заміÑÑ‚ÑŒ одного: %s"
+msgstr[1] "запит повернув %d Ñ€Ñдки заміÑÑ‚ÑŒ одного: %s"
+msgstr[2] "запит повернув %d Ñ€Ñдків заміÑÑ‚ÑŒ одного: %s"
+msgstr[3] "запит повернув %d Ñ€Ñдків заміÑÑ‚ÑŒ одного: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "Відповідь має бути \"%s\" або \"%s\".\n"
+
+#: createdb.c:170
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" не Ñ” невірним ім'Ñм кодуваннÑ"
+
+#: createdb.c:250
+#, c-format
+msgid "database creation failed: %s"
+msgstr "Ñтворити базу даних не вдалоÑÑ: %s"
+
+#: createdb.c:269
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "не вдалоÑÑ Ñтворити коментарі (база даних була Ñтворена): %s"
+
+#: createdb.c:287
+#, c-format
+msgid "%s creates a PostgreSQL database.\n\n"
+msgstr "%s Ñтворює базу даних PostgreSQL.\n\n"
+
+#: createdb.c:289
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+
+#: createdb.c:291
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=ТÐБЛИЧÐИЙ_ПРОСТІР табличний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм\n"
+
+#: createdb.c:292 reindexdb.c:756
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n"
+
+#: createdb.c:293
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=КОДУВÐÐÐЯ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: createdb.c:294
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=ЛОКÐЛЬ параметри локалі бази даних\n"
+
+#: createdb.c:295
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=ЛОКÐЛЬ параметр LC_COLLATE Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: createdb.c:296
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=ЛОКÐЛЬ параметр LC_CTYPE Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: createdb.c:297
+#, c-format
+msgid " --icu-locale=LOCALE ICU locale setting for the database\n"
+msgstr " --icu-locale=LOCALE параметр локалі ICU бази даних\n"
+
+#: createdb.c:298
+#, c-format
+msgid " --icu-rules=RULES ICU rules setting for the database\n"
+msgstr " --icu-locale=RULES правила ICU Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: createdb.c:299
+#, c-format
+msgid " --locale-provider={libc|icu}\n"
+" locale provider for the database's default collation\n"
+msgstr " --locale-provider={libc|icu}\n"
+" провайдер локалі Ð´Ð»Ñ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм\n"
+
+#: createdb.c:301
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --влаÑник=ВЛÐСÐИК кориÑтувач-влаÑник нової бази даних\n"
+
+#: createdb.c:302
+#, c-format
+msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n"
+msgstr " -S, --strategy=STRATEGY ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ wal_log або file_copy\n"
+
+#: createdb.c:303
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --шаблон=ШÐБЛОРшаблонна база даних Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ\n"
+
+#: createdb.c:304 reindexdb.c:765
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: createdb.c:305 reindexdb.c:766
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: createdb.c:307 reindexdb.c:768
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=ІМ'Я_ХОСТРхоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n"
+
+#: createdb.c:308 reindexdb.c:769
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт Ñервера бази даних\n"
+
+#: createdb.c:309 reindexdb.c:770
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ІМ'Я_КОРИСТУВÐЧРім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n"
+
+#: createdb.c:310 reindexdb.c:771
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password ніколи не запитувати пароль\n"
+
+#: createdb.c:311 reindexdb.c:772
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password запроÑити пароль\n"
+
+#: createdb.c:312 reindexdb.c:773
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME альтернативна бази даних Ð´Ð»Ñ Ð¾Ð±ÑлуговуваннÑ\n"
+
+#: createdb.c:313
+#, c-format
+msgid "\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr "\n"
+"За замовчуваннÑм ім'Ñм бази даних вважаєтьÑÑ Ñ–Ð¼'Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ кориÑтувача.\n"
+
+#: createuser.c:218
+msgid "Enter name of role to add: "
+msgstr "Введіть ім'Ñ Ð½Ð¾Ð²Ð¾Ñ— ролі: "
+
+#: createuser.c:233
+msgid "Enter password for new role: "
+msgstr "Введіть пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— ролі: "
+
+#: createuser.c:234
+msgid "Enter it again: "
+msgstr "Введіть знову: "
+
+#: createuser.c:237
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "Паролі не Ñпівпадають.\n"
+
+#: createuser.c:245
+msgid "Shall the new role be a superuser?"
+msgstr "Чи буде нова роль ÑуперкориÑтувачем?"
+
+#: createuser.c:260
+msgid "Shall the new role be allowed to create databases?"
+msgstr "Чи дозволено новій ролі Ñтворювати бази даних?"
+
+#: createuser.c:268
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "Чи дозволено новій ролі Ñтворювати інші нові ролі?"
+
+#: createuser.c:309
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "помилка ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ: %s"
+
+#: createuser.c:400
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "не вдалоÑÑ Ñтворити нову роль: %s"
+
+#: createuser.c:414
+#, c-format
+msgid "%s creates a new PostgreSQL role.\n\n"
+msgstr "%s Ñтворює нову роль PostgreSQL.\n\n"
+
+#: createuser.c:416 dropuser.c:171
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [OPTION]... [ROLENAME]\n"
+
+#: createuser.c:418
+#, c-format
+msgid " -a, --with-admin=ROLE ROLE will be a member of new role with admin\n"
+" option\n"
+msgstr " -a, --with-admin=ROLE ROLE Ñтане членом нової ролі з правом\n"
+" адмініÑтратора\n"
+
+#: createuser.c:420
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N ліміт під'єднань Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– (за замовчуваннÑм ліміту немає)\n"
+
+#: createuser.c:421
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb роль може Ñтворювати нові бази даних\n"
+
+#: createuser.c:422
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb роль не може Ñтворювати нові бази даних (за замовчуваннÑм)\n"
+
+#: createuser.c:424
+#, c-format
+msgid " -g, --member-of=ROLE new role will be a member of ROLE\n"
+msgstr " -g, --member-of=ROLE нова роль буде членом ROLE\n"
+
+#: createuser.c:425
+#, c-format
+msgid " --role=ROLE (same as --member-of, deprecated)\n"
+msgstr " --role=ROLE (те Ñаме, що --member-of, заÑтаріло)\n"
+
+#: createuser.c:426
+#, c-format
+msgid " -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr " -i, --inherit роль переймає права від ролей до Ñких вона\n"
+" включена (за замовчуваннÑм)\n"
+
+#: createuser.c:428
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit роль не переймає права\n"
+
+#: createuser.c:429
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login роль може увійти (за замовчуваннÑм)\n"
+
+#: createuser.c:430
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login роль не може увійти\n"
+
+#: createuser.c:431
+#, c-format
+msgid " -m, --with-member=ROLE ROLE will be a member of new role\n"
+msgstr " -m, --with-member=ROLE ROLE буде членом нової ролі\n"
+
+#: createuser.c:432
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— ролі\n"
+
+#: createuser.c:433
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole роль може Ñтворювати нові ролі\n"
+
+#: createuser.c:434
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole роль не може Ñтворювати нові бази даних (за замовчуваннÑм)\n"
+
+#: createuser.c:435
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser роль буде ÑуперкориÑтувачем\n"
+
+#: createuser.c:436
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser роль не буде ÑуперкориÑтувачем (за замовчуваннÑм)\n"
+
+#: createuser.c:437
+#, c-format
+msgid " -v, --valid-until=TIMESTAMP\n"
+" password expiration date and time for role\n"
+msgstr " -v, --valid-until=TIMESTAMP\n"
+" термін дії Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ–\n"
+
+#: createuser.c:440
+#, c-format
+msgid " --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr " --interactive запитати пропущені Ñ–Ð¼â€™Ñ Ñ€Ð¾Ð»Ñ– та атрибути, а не викориÑтовувати Ñтандартні\n"
+
+#: createuser.c:442
+#, c-format
+msgid " --bypassrls role can bypass row-level security (RLS) policy\n"
+msgstr " --bypassrls роль може обійти політику безпеки на рівні Ñ€Ñдків (RLS)\n"
+
+#: createuser.c:443
+#, c-format
+msgid " --no-bypassrls role cannot bypass row-level security (RLS) policy\n"
+" (default)\n"
+msgstr " --no-bypassrls роль не може обходити політику на рівні Ñ€Ñдків (RLS)\n"
+" (за замовчуваннÑм)\n"
+
+#: createuser.c:445
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication роль може ініціювати реплікацію\n"
+
+#: createuser.c:446
+#, c-format
+msgid " --no-replication role cannot initiate replication (default)\n"
+msgstr " --no-replication роль не може ініціювати реплікацію (за замовчуваннÑм)\n"
+
+#: createuser.c:451
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (не Ð´Ð»Ñ ÑтвореннÑ)\n"
+
+#: dropdb.c:112
+#, c-format
+msgid "missing required argument database name"
+msgstr "немає запитаного аргументу: імені бази даних"
+
+#: dropdb.c:127
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "База даних \"%s\" буде назавжди видалена.\n"
+
+#: dropdb.c:128 dropuser.c:131
+msgid "Are you sure?"
+msgstr "Ви впевнені?"
+
+#: dropdb.c:157
+#, c-format
+msgid "database removal failed: %s"
+msgstr "помилка при видаленні бази даних: %s"
+
+#: dropdb.c:171
+#, c-format
+msgid "%s removes a PostgreSQL database.\n\n"
+msgstr "%s видалÑÑ” базу даних PostgreSQL.\n\n"
+
+#: dropdb.c:173
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [OPTION]... ІМ'Я_БД\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force Ñпробувати завершити інші Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ видаленнÑм\n"
+
+#: dropdb.c:177
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive запитувати перед видаленнÑм чого-небудь\n"
+
+#: dropdb.c:179
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists не повідомлÑти про помилку, Ñкщо бази даних не Ñ–Ñнує\n"
+
+#: dropuser.c:118
+msgid "Enter name of role to drop: "
+msgstr "Введіть ім'Ñ Ñ€Ð¾Ð»Ñ– Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ: "
+
+#: dropuser.c:122
+#, c-format
+msgid "missing required argument role name"
+msgstr "немає запитаного аргументу: імені ролі"
+
+#: dropuser.c:130
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "Роль \"%s\" буде назавжди видалена.\n"
+
+#: dropuser.c:154
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "помилка при видаленні ролі \"%s\": %s"
+
+#: dropuser.c:169
+#, c-format
+msgid "%s removes a PostgreSQL role.\n\n"
+msgstr "%s видалÑÑ” роль PostgreSQL.\n\n"
+
+#: dropuser.c:174
+#, c-format
+msgid " -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr " -i, --interactive запитувати перед видаленнÑм чого-небудь Ñ– запитувати\n"
+" ім'Ñ Ñ€Ð¾Ð»Ñ–, Ñкщо не вказано\n"
+
+#: dropuser.c:177
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists не повідомлÑти про помилку, Ñкщо кориÑтувача не Ñ–Ñнує\n"
+
+#: dropuser.c:182
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (не Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¸Ð²Ð°Ð½Ð½Ñ)\n"
+
+#: pg_isready.c:154
+#, c-format
+msgid "could not fetch default options"
+msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ параметри за замовчуваннÑм"
+
+#: pg_isready.c:203
+#, c-format
+msgid "accepting connections\n"
+msgstr "Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½ÑŒ\n"
+
+#: pg_isready.c:206
+#, c-format
+msgid "rejecting connections\n"
+msgstr "Ð²Ñ–Ð´Ñ‚Ð¾Ñ€Ð³Ð½ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½ÑŒ\n"
+
+#: pg_isready.c:209
+#, c-format
+msgid "no response\n"
+msgstr "відповіді немає\n"
+
+#: pg_isready.c:212
+#, c-format
+msgid "no attempt\n"
+msgstr "немає Ñпроб\n"
+
+#: pg_isready.c:215
+#, c-format
+msgid "unknown\n"
+msgstr "невідомо\n"
+
+#: pg_isready.c:225
+#, c-format
+msgid "%s issues a connection check to a PostgreSQL database.\n\n"
+msgstr "%s: перевірка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних PostgreSQL.\n\n"
+
+#: pg_isready.c:227
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s: [OPTION]...\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=ІМ'Я_БД ім'Ñ Ð±Ð°Ð·Ð¸ даних\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet тихий запуÑк\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n"
+
+#: pg_isready.c:233
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñерверу баз даних або каталог Ñокетів\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=ПОРТ порт Ñервера бази даних\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS Ñекунд Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ Ñпробі підключеннÑ, 0 без обмежень (за замовчуваннÑм: %s)\n"
+
+#: pg_isready.c:239
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=ІМ'Я_КОРИСТУВÐЧРім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n"
+
+#: reindexdb.c:209
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "неможливо переіндекÑувати вÑÑ– бази даних Ñ– одну вказану одночаÑно"
+
+#: reindexdb.c:211
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "не можливо переіндекÑувати вÑÑ– бази даних Ñ– ÑиÑтемні каталоги одночаÑно"
+
+#: reindexdb.c:213
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "неможливо переіндекÑувати вказані Ñхеми в уÑÑ–Ñ… базах даних"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "неможливо переіндекÑувати вказані таблиці в уÑÑ–Ñ… базах даних"
+
+#: reindexdb.c:217
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "неможливо переіндекÑувати вказані індекÑи в уÑÑ–Ñ… базах даних"
+
+#: reindexdb.c:227
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "не можливо переіндекÑувати вказані Ñхеми Ñ– ÑиÑтемні каталоги одночаÑно"
+
+#: reindexdb.c:229
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "не можливо переіндекÑувати вказані таблиці Ñ– ÑиÑтемні каталоги одночаÑно"
+
+#: reindexdb.c:231
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "не можливо переіндекÑувати вказані індекÑи Ñ– ÑиÑтемні каталоги одночаÑно"
+
+#: reindexdb.c:234
+#, c-format
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "не можна викориÑтовувати декілька завдань Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтемних каталогів"
+
+#: reindexdb.c:260
+#, c-format
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "не можна викориÑтовувати декілька завдань Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑів"
+
+#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:525 vacuumdb.c:532 vacuumdb.c:539
+#: vacuumdb.c:546 vacuumdb.c:553 vacuumdb.c:560 vacuumdb.c:567 vacuumdb.c:572
+#: vacuumdb.c:576 vacuumdb.c:580 vacuumdb.c:584
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "не можна викориÑтовувати параметр \"%s\" на Ñерверній верÑÑ–Ñ— Ñтарішій за PostgreSQL %s"
+
+#: reindexdb.c:561
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "переіндекÑувати базу даних \"%s\" не вдалоÑÑ: %s"
+
+#: reindexdb.c:565
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "переіндекÑувати індекÑи \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s"
+
+#: reindexdb.c:569
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "переіндекÑувати Ñхему \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s"
+
+#: reindexdb.c:573
+#, c-format
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "переіндекÑÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтемних каталогів в базі даних \"%s\" не вдалоÑÑ: %s"
+
+#: reindexdb.c:577
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "переіндекÑувати таблиці \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s"
+
+#: reindexdb.c:732
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: переіндекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"\n"
+
+#: reindexdb.c:749
+#, c-format
+msgid "%s reindexes a PostgreSQL database.\n\n"
+msgstr "%s переіндекÑовує базу даних PostgreSQL.\n\n"
+
+#: reindexdb.c:753
+#, c-format
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all переіндекÑувати вÑÑ– бази даних\n"
+
+#: reindexdb.c:754
+#, c-format
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently переіндекÑувати одночаÑно\n"
+
+#: reindexdb.c:755
+#, c-format
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME база даних Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑуваннÑ\n"
+
+#: reindexdb.c:757
+#, c-format
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX повторно Ñтворити лише вказані індекÑи\n"
+
+#: reindexdb.c:758
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM викориÑтати цю кількіÑÑ‚ÑŒ паралельних підключень Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑуваннÑ\n"
+
+#: reindexdb.c:759
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не пиÑати жодних повідомлень\n"
+
+#: reindexdb.c:760
+#, c-format
+msgid " -s, --system reindex system catalogs only\n"
+msgstr " -s, --system переіндекÑувати тільки ÑиÑтемні каталоги\n"
+
+#: reindexdb.c:761
+#, c-format
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA переіндекÑувати лише вказані Ñхеми\n"
+
+#: reindexdb.c:762
+#, c-format
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE переіндекÑувати лише вказані таблиці\n"
+
+#: reindexdb.c:763
+#, c-format
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE табличний проÑÑ‚Ñ–Ñ€ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ… індекÑів\n"
+
+#: reindexdb.c:764
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато повідомлень\n"
+
+#: reindexdb.c:774
+#, c-format
+msgid "\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr "\n"
+"Ð”Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ читайте Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ SQL REINDEX.\n"
+
+#: vacuumdb.c:312 vacuumdb.c:315 vacuumdb.c:318 vacuumdb.c:321 vacuumdb.c:324
+#: vacuumdb.c:327 vacuumdb.c:330 vacuumdb.c:333 vacuumdb.c:342
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "не можна викориÑтовувати параметр \"%s\" під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð»Ð¸ÑˆÐµ аналіза"
+
+#: vacuumdb.c:345
+#, c-format
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "не можна викориÑтовувати параметр \"%s\" під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ VACUUM FULL"
+
+#: vacuumdb.c:351 vacuumdb.c:359
+#, c-format
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "викориÑтовувати параметр \"%s\" з параметром \"%s\" не можна"
+
+#: vacuumdb.c:430
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "неможливо очиÑтити вÑÑ– бази даних Ñ– одну вказану одночаÑно"
+
+#: vacuumdb.c:434
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "неможливо очиÑтити вказані таблиці в уÑÑ–Ñ… базах даних"
+
+#: vacuumdb.c:438
+#, c-format
+msgid "cannot vacuum specific schema(s) in all databases"
+msgstr "неможливо очиÑтити вказані Ñхеми в уÑÑ–Ñ… базах даних"
+
+#: vacuumdb.c:442
+#, c-format
+msgid "cannot exclude specific schema(s) in all databases"
+msgstr "неможливо виключити вказані Ñхеми в уÑÑ–Ñ… базах даних"
+
+#: vacuumdb.c:446
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time"
+msgstr "неможливо очиÑтити вÑÑ– таблиці в Ñхемах та вказані таблиці одночаÑно"
+
+#: vacuumdb.c:450
+#, c-format
+msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time"
+msgstr "неможливо очиÑтити вказані таблиці Ñ– виключити Ñхеми одночаÑно"
+
+#: vacuumdb.c:454
+#, c-format
+msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"
+msgstr "неможливо очиÑтити вÑÑ– таблиці в Ñхемах та виключити Ñхеми одночаÑно"
+
+#: vacuumdb.c:467
+#, c-format
+msgid "out of memory"
+msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#: vacuumdb.c:512
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "Ð“ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ð¾Ñ— ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ñ–Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° (1 мета)"
+
+#: vacuumdb.c:513
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "Ð“ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñередньої ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° (10 цілей)"
+
+#: vacuumdb.c:514
+msgid "Generating default (full) optimizer statistics"
+msgstr "Ð“ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° за замовчуваннÑм (повніÑÑ‚ÑŽ)"
+
+#: vacuumdb.c:593
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s: обробка бази даних \"%s\": %s\n"
+
+#: vacuumdb.c:596
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"\n"
+
+#: vacuumdb.c:1144
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "очиÑтити таблиці \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s"
+
+#: vacuumdb.c:1147
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "очиÑтити базу даних \"%s\" не вдалоÑÑ: %s"
+
+#: vacuumdb.c:1155
+#, c-format
+msgid "%s cleans and analyzes a PostgreSQL database.\n\n"
+msgstr "%s очищує й аналізує базу даних PostgreSQL.\n\n"
+
+#: vacuumdb.c:1159
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all очиÑтити уÑÑ– бази даних\n"
+
+#: vacuumdb.c:1160
+#, c-format
+msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"
+msgstr " --buffer-usage-limit=SIZE розмір кільцевого буферу Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки\n"
+
+#: vacuumdb.c:1161
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=ІМ'Я_БД база даних Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ\n"
+
+#: vacuumdb.c:1162
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping відключити пропуÑк Ñторінок\n"
+
+#: vacuumdb.c:1163
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n"
+
+#: vacuumdb.c:1164
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full зробити повне очищеннÑ\n"
+
+#: vacuumdb.c:1165
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze заморозити інформацію щодо транзакцій в Ñ€Ñдках\n"
+
+#: vacuumdb.c:1166
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup завжди видалÑти запиÑи індекÑів, Ñкі вказують на мертві кортежі\n"
+
+#: vacuumdb.c:1167
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=ЧИСЛО викориÑтати ці паралельні Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ\n"
+
+#: vacuumdb.c:1168
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери мультитранзакції таблиць Ð´Ð»Ñ Ð²Ð°ÐºÑƒÑƒÐ¼Ñƒ\n"
+
+#: vacuumdb.c:1169
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери транзакції таблиць Ð´Ð»Ñ Ð²Ð°ÐºÑƒÑƒÐ¼Ñƒ\n"
+
+#: vacuumdb.c:1170
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup не видалÑти запиÑи індекÑів, Ñкі вказують на мертві кортежі\n"
+
+#: vacuumdb.c:1171
+#, c-format
+msgid " --no-process-main skip the main relation\n"
+msgstr " --no-process-main пропуÑтити головне відношеннÑ\n"
+
+#: vacuumdb.c:1172
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast пропуÑкати таблицю TOAST, пов'Ñзану з таблицею Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ\n"
+
+#: vacuumdb.c:1173
+#, c-format
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate не Ñкорочувати пуÑÑ‚Ñ– Ñторінки наприкінці таблиці\n"
+
+#: vacuumdb.c:1174
+#, c-format
+msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n"
+msgstr " -n, --schema=SCHEMA очиÑтити тільки таблиці у вказаних Ñхемах\n"
+
+#: vacuumdb.c:1175
+#, c-format
+msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n"
+msgstr " -N, --exclude-schema=SCHEMA не очищати таблиці у вказаних Ñхемах\n"
+
+#: vacuumdb.c:1176
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_WORKERS викориÑтати таку кількіÑÑ‚ÑŒ фонових робітників Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, Ñкщо вони доÑтупні\n"
+
+#: vacuumdb.c:1177
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet не пиÑати жодних повідомлень\n"
+
+#: vacuumdb.c:1178
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked пропуÑтити відношеннÑ, що не можуть бути заблоковані негайно\n"
+
+#: vacuumdb.c:1179
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='ТÐБЛИЦЯ[(СТОВПЦІ)]' очиÑтити тільки вказані таблиці\n"
+
+#: vacuumdb.c:1180
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose виводити багато інформації\n"
+
+#: vacuumdb.c:1181
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n"
+
+#: vacuumdb.c:1182
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze оновити ÑтатиÑтику Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð°\n"
+
+#: vacuumdb.c:1183
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only оновити лише ÑтатиÑтику Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð°, не очищати\n"
+
+#: vacuumdb.c:1184
+#, c-format
+msgid " --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr " --analyze-in-stages оновити лише ÑтатиÑтику Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð°, у декілька Ñтадій Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÑˆÐ¸Ñ… результатів, не очищати\n"
+
+#: vacuumdb.c:1186
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю Ñправку, потім вийти\n"
+
+#: vacuumdb.c:1194
+#, c-format
+msgid "\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr "\n"
+"Ð”Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ читайте Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ SQL VACUUM.\n"
+
diff --git a/src/bin/scripts/po/zh_CN.po b/src/bin/scripts/po/zh_CN.po
new file mode 100644
index 0000000..12c7560
--- /dev/null
+++ b/src/bin/scripts/po/zh_CN.po
@@ -0,0 +1,1147 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pgscripts (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:47+0000\n"
+"PO-Revision-Date: 2021-08-15 18:30+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.7\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../../src/common/logging.c:259
+#, c-format
+msgid "fatal: "
+msgstr "致命的: "
+
+#: ../../../src/common/logging.c:266
+#, c-format
+msgid "error: "
+msgstr "错误: "
+
+#: ../../../src/common/logging.c:273
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75
+#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162
+#, c-format
+msgid "out of memory\n"
+msgstr "内存ä¸è¶³\n"
+
+#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154
+#, c-format
+msgid "cannot duplicate null pointer (internal error)\n"
+msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n"
+
+#: ../../common/username.c:43
+#, c-format
+msgid "could not look up effective user ID %ld: %s"
+msgstr "无法找到有效的用户ID %ld: %s"
+
+#: ../../common/username.c:45
+msgid "user does not exist"
+msgstr "用户ä¸å­˜åœ¨"
+
+#: ../../common/username.c:60
+#, c-format
+msgid "user name lookup failure: error code %lu"
+msgstr "用户å查找失败:错误代ç %lu"
+
+#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206
+msgid "Cancel request sent\n"
+msgstr "å–消å‘é€çš„请求\n"
+
+#: ../../fe_utils/cancel.c:165 ../../fe_utils/cancel.c:210
+msgid "Could not send cancel request: "
+msgstr "无法å‘é€å–消请求: "
+
+#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:107
+msgid "Password: "
+msgstr "å£ä»¤: "
+
+#: ../../fe_utils/connect_utils.c:92
+#, c-format
+msgid "could not connect to database %s: out of memory"
+msgstr "无法连接到数æ®åº“ %s:内存ä¸è¶³"
+
+#: ../../fe_utils/connect_utils.c:120 pg_isready.c:145
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../../fe_utils/parallel_slot.c:302
+#, c-format
+msgid "too many jobs for this platform"
+msgstr "此平å°çš„作业太多"
+
+#: ../../fe_utils/parallel_slot.c:522
+msgid "processing of database \"%s\" failed: %s"
+msgstr "处ç†æ•°æ®åº“\"%s\"失败:%s"
+
+#: ../../fe_utils/print.c:336
+#, c-format
+msgid "(%lu row)"
+msgid_plural "(%lu rows)"
+msgstr[0] "(%lu 行记录)"
+msgstr[1] "(%lu 行记录)"
+
+#: ../../fe_utils/print.c:3039
+#, c-format
+msgid "Interrupted\n"
+msgstr "已中断\n"
+
+#: ../../fe_utils/print.c:3103
+#, c-format
+msgid "Cannot add header to table content: column count of %d exceeded.\n"
+msgstr "无法对表的内容增加标题:å·²ç»è¶…过%d列的数é‡.\n"
+
+#: ../../fe_utils/print.c:3143
+#, c-format
+msgid "Cannot add cell to table content: total cell count of %d exceeded.\n"
+msgstr "无法对表的内容添加å•å…ƒ: 总共有%d个å•å…ƒè¶…过.\n"
+
+#: ../../fe_utils/print.c:3401
+#, c-format
+msgid "invalid output format (internal error): %d"
+msgstr "æ— æ•ˆçš„è¾“å‡ºæ ¼å¼ (内部错误): %d"
+
+#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58
+#, c-format
+msgid "query failed: %s"
+msgstr "查询失败: %s"
+
+#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59
+#, c-format
+msgid "query was: %s"
+msgstr "查询是: %s"
+
+#: clusterdb.c:112 clusterdb.c:131 createdb.c:123 createdb.c:142
+#: createuser.c:172 createuser.c:187 dropdb.c:103 dropdb.c:112 dropdb.c:120
+#: dropuser.c:94 dropuser.c:109 dropuser.c:122 pg_isready.c:96 pg_isready.c:110
+#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:251 vacuumdb.c:270
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获å–更多的信æ¯.\n"
+
+#: clusterdb.c:129 createdb.c:140 createuser.c:185 dropdb.c:118 dropuser.c:107
+#: pg_isready.c:108 reindexdb.c:191 vacuumdb.c:268
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令行å‚数太多 (第一个是 \"%s\")"
+
+#: clusterdb.c:148
+#, c-format
+msgid "cannot cluster all databases and a specific one at the same time"
+msgstr "无法对所有数æ®åº“和一个指定的数æ®åº“åŒæ—¶å»ºç°‡"
+
+#: clusterdb.c:154
+#, c-format
+msgid "cannot cluster specific table(s) in all databases"
+msgstr "无法在所有数æ®åº“中对指定表进行建簇"
+
+#: clusterdb.c:220
+#, c-format
+msgid "clustering of table \"%s\" in database \"%s\" failed: %s"
+msgstr "在数æ®åº“ \"%2$s\" 中的表 \"%1$s\" 建簇失败: %3$s"
+
+#: clusterdb.c:223
+#, c-format
+msgid "clustering of database \"%s\" failed: %s"
+msgstr "æ•°æ®åº“ \"%s\" 建簇失败: %s"
+
+#: clusterdb.c:251
+#, c-format
+msgid "%s: clustering database \"%s\"\n"
+msgstr "%s: 对数æ®åº“ \"%s\" 进行建簇\n"
+
+#: clusterdb.c:267
+#, c-format
+msgid ""
+"%s clusters all previously clustered tables in a database.\n"
+"\n"
+msgstr ""
+"%s 对一个数æ®åº“中先å‰å·²ç»å»ºè¿‡ç°‡çš„表进行建簇.\n"
+"\n"
+
+#: clusterdb.c:268 createdb.c:267 createuser.c:351 dropdb.c:171 dropuser.c:169
+#: pg_isready.c:225 reindexdb.c:792 vacuumdb.c:1025
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: clusterdb.c:269 reindexdb.c:793 vacuumdb.c:1026
+#, c-format
+msgid " %s [OPTION]... [DBNAME]\n"
+msgstr " %s [选项]... [æ•°æ®åº“åå­—]\n"
+
+#: clusterdb.c:270 createdb.c:269 createuser.c:353 dropdb.c:173 dropuser.c:171
+#: pg_isready.c:228 reindexdb.c:794 vacuumdb.c:1027
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"选项:\n"
+
+#: clusterdb.c:271
+#, c-format
+msgid " -a, --all cluster all databases\n"
+msgstr " -a, --all 对所有数æ®åº“建簇\n"
+
+#: clusterdb.c:272
+#, c-format
+msgid " -d, --dbname=DBNAME database to cluster\n"
+msgstr " -d, --dbname=DBNAME 对数æ®åº“ DBNAME 建簇\n"
+
+#: clusterdb.c:273 createuser.c:357 dropdb.c:174 dropuser.c:172
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示å‘é€åˆ°æœåŠ¡ç«¯çš„命令\n"
+
+#: clusterdb.c:274
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ä¸å†™ä»»ä½•ä¿¡æ¯\n"
+
+#: clusterdb.c:275
+#, c-format
+msgid " -t, --table=TABLE cluster specific table(s) only\n"
+msgstr " -t, --table=TABLE åªå¯¹æŒ‡å®šçš„表建簇\n"
+
+#: clusterdb.c:276
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大é‡çš„输出\n"
+
+#: clusterdb.c:277 createuser.c:369 dropdb.c:177 dropuser.c:175
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: clusterdb.c:278 createuser.c:374 dropdb.c:179 dropuser.c:177
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: clusterdb.c:279 createdb.c:280 createuser.c:375 dropdb.c:180 dropuser.c:178
+#: pg_isready.c:234 reindexdb.c:809 vacuumdb.c:1052
+#, c-format
+msgid ""
+"\n"
+"Connection options:\n"
+msgstr ""
+"\n"
+"è”接选项:\n"
+
+#: clusterdb.c:280 createuser.c:376 dropdb.c:181 dropuser.c:179 vacuumdb.c:1053
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAM æ•°æ®åº“æœåŠ¡å™¨æ‰€åœ¨æœºå™¨çš„主机å或套接字目录\n"
+
+#: clusterdb.c:281 createuser.c:377 dropdb.c:182 dropuser.c:180 vacuumdb.c:1054
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT æ•°æ®åº“æœåŠ¡å™¨ç«¯å£å·\n"
+
+#: clusterdb.c:282 dropdb.c:183 vacuumdb.c:1055
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME è”接的用户å\n"
+
+#: clusterdb.c:283 createuser.c:379 dropdb.c:184 dropuser.c:182 vacuumdb.c:1056
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远ä¸æ示输入å£ä»¤\n"
+
+#: clusterdb.c:284 createuser.c:380 dropdb.c:185 dropuser.c:183 vacuumdb.c:1057
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 强制æ示输入å£ä»¤\n"
+
+#: clusterdb.c:285 dropdb.c:186 vacuumdb.c:1058
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 更改维护数æ®åº“\n"
+
+#: clusterdb.c:286
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command CLUSTER for details.\n"
+msgstr ""
+"\n"
+"阅读 SQL 命令 CLUSTER çš„æè¿°ä¿¡æ¯, 以便获得更详细的信æ¯.\n"
+
+#: clusterdb.c:287 createdb.c:288 createuser.c:381 dropdb.c:187 dropuser.c:184
+#: pg_isready.c:239 reindexdb.c:817 vacuumdb.c:1060
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: clusterdb.c:288 createdb.c:289 createuser.c:382 dropdb.c:188 dropuser.c:185
+#: pg_isready.c:240 reindexdb.c:818 vacuumdb.c:1061
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: common.c:107
+#, c-format
+msgid "query returned %d row instead of one: %s"
+msgid_plural "query returned %d rows instead of one: %s"
+msgstr[0] "查询返回了%dæ¡è®°å½•ï¼Œè€Œä¸æ˜¯ä¸€æ¡è®°å½•: %s"
+msgstr[1] "查询返回了%dæ¡è®°å½•ï¼Œè€Œä¸æ˜¯ä¸€æ¡è®°å½•: %s"
+
+#. translator: abbreviation for "yes"
+#: common.c:131
+msgid "y"
+msgstr "y"
+
+#. translator: abbreviation for "no"
+#: common.c:133
+msgid "n"
+msgstr "n"
+
+#. translator: This is a question followed by the translated options for
+#. "yes" and "no".
+#: common.c:143
+#, c-format
+msgid "%s (%s/%s) "
+msgstr "%s (%s/%s) "
+
+#: common.c:164
+#, c-format
+msgid "Please answer \"%s\" or \"%s\".\n"
+msgstr "请回答\"%s\"或\"%s\".\n"
+
+#: createdb.c:150
+#, c-format
+msgid "only one of --locale and --lc-ctype can be specified"
+msgstr "åªèƒ½æŒ‡å®š--localeå’Œ--lc-ctype这两个选项之一"
+
+#: createdb.c:155
+#, c-format
+msgid "only one of --locale and --lc-collate can be specified"
+msgstr "åªèƒ½æŒ‡å®š--localeå’Œ--lc-collate这两个选项之一"
+
+#: createdb.c:166
+#, c-format
+msgid "\"%s\" is not a valid encoding name"
+msgstr "\"%s\" 是一个无效编ç å"
+
+#: createdb.c:229
+#, c-format
+msgid "database creation failed: %s"
+msgstr "创建数æ®åº“失败: %s"
+
+#: createdb.c:248
+#, c-format
+msgid "comment creation failed (database was created): %s"
+msgstr "创建注释失败 (æ•°æ®åº“已创建): %s"
+
+#: createdb.c:266
+#, c-format
+msgid ""
+"%s creates a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 创建一个 PostgreSQL æ•°æ®åº“.\n"
+"\n"
+
+#: createdb.c:268
+#, c-format
+msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n"
+msgstr " %s [选项]... [æ•°æ®åº“å称] [æè¿°]\n"
+
+#: createdb.c:270
+#, c-format
+msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n"
+msgstr " -D, --tablespace=TABLESPACE æ•°æ®åº“默认表空间\n"
+
+#: createdb.c:271 reindexdb.c:798
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示å‘é€åˆ°æœåŠ¡ç«¯çš„命令\n"
+
+#: createdb.c:272
+#, c-format
+msgid " -E, --encoding=ENCODING encoding for the database\n"
+msgstr " -E, --encoding=ENCODING æ•°æ®åº“ç¼–ç \n"
+
+#: createdb.c:273
+#, c-format
+msgid " -l, --locale=LOCALE locale settings for the database\n"
+msgstr " -l, --locale=LOCALE æ•°æ®åº“的本地化设置\n"
+
+#: createdb.c:274
+#, c-format
+msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n"
+msgstr " --lc-collate=LOCALE æ•°æ®åº“çš„LC_COLLATE设置\n"
+
+#: createdb.c:275
+#, c-format
+msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n"
+msgstr " --lc-ctype=LOCALE æ•°æ®åº“çš„LC_CTYPE设置\n"
+
+#: createdb.c:276
+#, c-format
+msgid " -O, --owner=OWNER database user to own the new database\n"
+msgstr " -O, --owner=OWNER æ–°æ•°æ®åº“的所属用户\n"
+
+#: createdb.c:277
+#, c-format
+msgid " -T, --template=TEMPLATE template database to copy\n"
+msgstr " -T, --template=TEMPLATE è¦æ‹·è´çš„æ•°æ®åº“模æ¿\n"
+
+#: createdb.c:278 reindexdb.c:807
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: createdb.c:279 reindexdb.c:808
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: createdb.c:281 reindexdb.c:810
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=HOSTNAME æ•°æ®åº“æœåŠ¡å™¨æ‰€åœ¨æœºå™¨çš„主机å或套接字目录\n"
+
+#: createdb.c:282 reindexdb.c:811
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT æ•°æ®åº“æœåŠ¡å™¨ç«¯å£å·\n"
+
+#: createdb.c:283 reindexdb.c:812
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME è”接的用户å\n"
+
+#: createdb.c:284 reindexdb.c:813
+#, c-format
+msgid " -w, --no-password never prompt for password\n"
+msgstr " -w, --no-password 永远ä¸æ示输入å£ä»¤\n"
+
+#: createdb.c:285 reindexdb.c:814
+#, c-format
+msgid " -W, --password force password prompt\n"
+msgstr " -W, --password 强制æ示输入å£ä»¤\n"
+
+#: createdb.c:286 reindexdb.c:815
+#, c-format
+msgid " --maintenance-db=DBNAME alternate maintenance database\n"
+msgstr " --maintenance-db=DBNAME 更改维护数æ®åº“\n"
+
+#: createdb.c:287
+#, c-format
+msgid ""
+"\n"
+"By default, a database with the same name as the current user is created.\n"
+msgstr ""
+"\n"
+"默认情况下, 以当å‰ç”¨æˆ·çš„用户å创建数æ®åº“.\n"
+
+#: createuser.c:151
+msgid "invalid value for --connection-limit: %s"
+msgstr "--connection-limit的值无效: %s"
+
+#: createuser.c:195
+msgid "Enter name of role to add: "
+msgstr "输入è¦å¢žåŠ çš„角色å称: "
+
+#: createuser.c:210
+msgid "Enter password for new role: "
+msgstr "为新角色输入的å£ä»¤: "
+
+#: createuser.c:211
+msgid "Enter it again: "
+msgstr "å†è¾“入一é: "
+
+#: createuser.c:214
+#, c-format
+msgid "Passwords didn't match.\n"
+msgstr "å£ä»¤ä¸åŒ¹é….\n"
+
+#: createuser.c:222
+msgid "Shall the new role be a superuser?"
+msgstr "新的角色是å¦æ˜¯è¶…级用户?"
+
+#: createuser.c:237
+msgid "Shall the new role be allowed to create databases?"
+msgstr "新的角色å…许创建数æ®åº“å—?"
+
+#: createuser.c:245
+msgid "Shall the new role be allowed to create more new roles?"
+msgstr "新角色å…许创建其它新的角色å—? "
+
+#: createuser.c:281
+#, c-format
+msgid "password encryption failed: %s"
+msgstr "密ç åŠ å¯†å¤±è´¥: %s"
+
+#: createuser.c:336
+#, c-format
+msgid "creation of new role failed: %s"
+msgstr "创建新用户失败: %s"
+
+#: createuser.c:350
+#, c-format
+msgid ""
+"%s creates a new PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s 创建一个新的 PostgreSQL 用户.\n"
+"\n"
+
+#: createuser.c:352 dropuser.c:170
+#, c-format
+msgid " %s [OPTION]... [ROLENAME]\n"
+msgstr " %s [选项]... [用户å]\n"
+
+#: createuser.c:354
+#, c-format
+msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n"
+msgstr " -c, --connection-limit=N 角色的连接é™åˆ¶(缺çœ: 没有é™åˆ¶)\n"
+
+#: createuser.c:355
+#, c-format
+msgid " -d, --createdb role can create new databases\n"
+msgstr " -d, --createdb 此角色å¯ä»¥åˆ›å»ºæ–°æ•°æ®åº“\n"
+
+#: createuser.c:356
+#, c-format
+msgid " -D, --no-createdb role cannot create databases (default)\n"
+msgstr " -D, --no-createdb 此角色ä¸å¯ä»¥åˆ›å»ºæ–°æ•°æ®åº“(默认)\n"
+
+#: createuser.c:358
+#, c-format
+msgid " -g, --role=ROLE new role will be a member of this role\n"
+msgstr " -g, --role=ROLE 新的角色必须是这个角色的æˆå‘˜\n"
+
+#: createuser.c:359
+#, c-format
+msgid ""
+" -i, --inherit role inherits privileges of roles it is a\n"
+" member of (default)\n"
+msgstr ""
+" -i, --inherit 角色能够继承它所属角色的æƒé™\n"
+" (这是缺çœæƒ…况)\n"
+
+#: createuser.c:361
+#, c-format
+msgid " -I, --no-inherit role does not inherit privileges\n"
+msgstr " -I, --no-inherit 角色ä¸ç»§æ‰¿æƒé™\n"
+
+#: createuser.c:362
+#, c-format
+msgid " -l, --login role can login (default)\n"
+msgstr " -l, --login 角色能够登录(这是缺çœæƒ…况)\n"
+
+#: createuser.c:363
+#, c-format
+msgid " -L, --no-login role cannot login\n"
+msgstr " -L, --no-login 角色ä¸èƒ½ç™»å½•\n"
+
+#: createuser.c:364
+#, c-format
+msgid " -P, --pwprompt assign a password to new role\n"
+msgstr " -P, --pwprompt 给新角色指定å£ä»¤\n"
+
+#: createuser.c:365
+#, c-format
+msgid " -r, --createrole role can create new roles\n"
+msgstr " -r, --createrole 这个角色å¯ä»¥åˆ›å»ºæ–°çš„角色\n"
+
+#: createuser.c:366
+#, c-format
+msgid " -R, --no-createrole role cannot create roles (default)\n"
+msgstr " -R, --no-createrole 这个角色没有创建其它角色的æƒé™(默认)\n"
+
+#: createuser.c:367
+#, c-format
+msgid " -s, --superuser role will be superuser\n"
+msgstr " -s, --superuser 角色将是超级用户\n"
+
+#: createuser.c:368
+#, c-format
+msgid " -S, --no-superuser role will not be superuser (default)\n"
+msgstr " -S, --no-superuser 角色ä¸èƒ½æ˜¯è¶…级用户(默认)\n"
+
+#: createuser.c:370
+#, c-format
+msgid ""
+" --interactive prompt for missing role name and attributes rather\n"
+" than using defaults\n"
+msgstr ""
+" --interactive æ示缺少角色ååŠå…¶å±žæ€§\n"
+" 而ä¸æ˜¯ä½¿ç”¨é»˜è®¤å€¼\n"
+
+#: createuser.c:372
+#, c-format
+msgid " --replication role can initiate replication\n"
+msgstr " --replication 角色能å¯åŠ¨å¤åˆ¶\n"
+
+#: createuser.c:373
+#, c-format
+msgid " --no-replication role cannot initiate replication\n"
+msgstr " --no-replication 角色ä¸èƒ½å¯åŠ¨å¤åˆ¶\n"
+
+#: createuser.c:378
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n"
+msgstr " -U, --username=USERNAME è”接用户 (ä¸æ˜¯è¦åˆ›å»ºçš„用户å)\n"
+
+#: dropdb.c:111
+#, c-format
+msgid "missing required argument database name"
+msgstr "缺少需è¦çš„æ•°æ®åº“åå‚æ•°"
+
+#: dropdb.c:126
+#, c-format
+msgid "Database \"%s\" will be permanently removed.\n"
+msgstr "æ•°æ®åº“ \"%s\" 将被永久的删除.\n"
+
+#: dropdb.c:127 dropuser.c:130
+msgid "Are you sure?"
+msgstr "您确定� (y/n) "
+
+#: dropdb.c:156
+#, c-format
+msgid "database removal failed: %s"
+msgstr "æ•°æ®åº“删除失败: %s"
+
+#: dropdb.c:170
+#, c-format
+msgid ""
+"%s removes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 删除一个 PostgreSQL æ•°æ®åº“.\n"
+"\n"
+
+#: dropdb.c:172
+#, c-format
+msgid " %s [OPTION]... DBNAME\n"
+msgstr " %s [选项]... æ•°æ®åº“å\n"
+
+#: dropdb.c:175
+msgid " -f, --force try to terminate other connections before dropping\n"
+msgstr " -f, --force 强å°è¯•åœ¨åˆ é™¤ä¹‹å‰ç»ˆæ­¢å…¶ä»–连接\n"
+
+#: dropdb.c:176
+#, c-format
+msgid " -i, --interactive prompt before deleting anything\n"
+msgstr " -i, --interactive 删除任何东西之å‰ç»™äºˆæ示\n"
+
+#: dropdb.c:178
+#, c-format
+msgid " --if-exists don't report error if database doesn't exist\n"
+msgstr " --if-exists 如果数æ®åº“ä¸å­˜åœ¨åˆ™ä¸æŠ¥å‘Šé”™è¯¯\n"
+
+#: dropuser.c:117
+msgid "Enter name of role to drop: "
+msgstr "输入è¦åˆ é™¤çš„用户å: "
+
+#: dropuser.c:121
+#, c-format
+msgid "missing required argument role name"
+msgstr "缺少需è¦çš„å‚数角色å"
+
+#: dropuser.c:129
+#, c-format
+msgid "Role \"%s\" will be permanently removed.\n"
+msgstr "用户 \"%s\" 将被永久删除.\n"
+
+#: dropuser.c:153
+#, c-format
+msgid "removal of role \"%s\" failed: %s"
+msgstr "删除用户 \"%s\" 失败: %s"
+
+#: dropuser.c:168
+#, c-format
+msgid ""
+"%s removes a PostgreSQL role.\n"
+"\n"
+msgstr ""
+"%s 删除一个 PostgreSQL 用户.\n"
+"\n"
+
+#: dropuser.c:173
+#, c-format
+msgid ""
+" -i, --interactive prompt before deleting anything, and prompt for\n"
+" role name if not specified\n"
+msgstr ""
+" -i, --interactive 删除任何东西之å‰ç»™äºˆæ示, 如果没有指定\n"
+" 角色å也给予æ示\n"
+
+#: dropuser.c:176
+#, c-format
+msgid " --if-exists don't report error if user doesn't exist\n"
+msgstr " --if-exists 用户åä¸å­˜åœ¨æ—¶åˆ™ä¸æŠ¥å‘Šé”™è¯¯\n"
+
+#: dropuser.c:181
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n"
+msgstr " -U, --username=USERNAME è”接用户 (ä¸æ˜¯è¦åˆ é™¤çš„用户å)\n"
+
+#: pg_isready.c:153
+#, c-format
+msgid "could not fetch default options"
+msgstr "无法å–得缺çœé€‰é¡¹"
+
+#: pg_isready.c:202
+#, c-format
+msgid "accepting connections\n"
+msgstr "接å—连接\n"
+
+#: pg_isready.c:205
+#, c-format
+msgid "rejecting connections\n"
+msgstr "æ‹’ç»è¿žæŽ¥\n"
+
+#: pg_isready.c:208
+#, c-format
+msgid "no response\n"
+msgstr "没有å“应\n"
+
+#: pg_isready.c:211
+#, c-format
+msgid "no attempt\n"
+msgstr "没有å°è¯•\n"
+
+#: pg_isready.c:214
+#, c-format
+msgid "unknown\n"
+msgstr "未知\n"
+
+#: pg_isready.c:224
+#, c-format
+msgid ""
+"%s issues a connection check to a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s å‘起一个到指定 PostgreSQLæ•°æ®åº“的连接检查.\n"
+"\n"
+
+#: pg_isready.c:226
+#, c-format
+msgid " %s [OPTION]...\n"
+msgstr " %s [选项]...\n"
+
+#: pg_isready.c:229
+#, c-format
+msgid " -d, --dbname=DBNAME database name\n"
+msgstr " -d, --dbname=DBNAME æ•°æ®åº“å\n"
+
+#: pg_isready.c:230
+#, c-format
+msgid " -q, --quiet run quietly\n"
+msgstr " -q, --quiet é™é»˜è¿è¡Œ\n"
+
+#: pg_isready.c:231
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: pg_isready.c:232
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助, 然åŽé€€å‡º\n"
+
+#: pg_isready.c:235
+#, c-format
+msgid " -h, --host=HOSTNAME database server host or socket directory\n"
+msgstr " -h, --host=主机å æ•°æ®åº“æœåŠ¡å™¨çš„主机å或套接字目录\n"
+
+#: pg_isready.c:236
+#, c-format
+msgid " -p, --port=PORT database server port\n"
+msgstr " -p, --port=PORT æ•°æ®åº“æœåŠ¡å™¨ç«¯å£\n"
+
+#: pg_isready.c:237
+#, c-format
+msgid " -t, --timeout=SECS seconds to wait when attempting connection, 0 disables (default: %s)\n"
+msgstr " -t, --timeout=SECS å°è¯•è¿žæŽ¥æ—¶è¦ç­‰å¾…的秒数, 值为ï¼è¡¨ç¤ºç¦ç”¨(缺çœå€¼: %s)\n"
+
+#: pg_isready.c:238
+#, c-format
+msgid " -U, --username=USERNAME user name to connect as\n"
+msgstr " -U, --username=USERNAME 连接的用户å\n"
+
+#: reindexdb.c:157 vacuumdb.c:198
+#, c-format
+msgid "number of parallel jobs must be at least 1"
+msgstr "并行工作的数é‡å¿…须至少为1"
+
+#: reindexdb.c:210
+#, c-format
+msgid "cannot reindex all databases and a specific one at the same time"
+msgstr "无法对所有数æ®åº“和一个指定的索引åŒæ—¶è¿›è¡Œç´¢å¼•é‡å»ºæ“作"
+
+#: reindexdb.c:215
+#, c-format
+msgid "cannot reindex all databases and system catalogs at the same time"
+msgstr "无法对所有数æ®åº“和系统目录åŒæ—¶è¿›è¡Œç´¢å¼•é‡å»ºæ“作"
+
+#: reindexdb.c:220
+#, c-format
+msgid "cannot reindex specific schema(s) in all databases"
+msgstr "无法在所有数æ®åº“中对指定模å¼ä¸Šçš„索引进行é‡å»º"
+
+#: reindexdb.c:225
+#, c-format
+msgid "cannot reindex specific table(s) in all databases"
+msgstr "无法在所有数æ®åº“中对指定表上的索引进行é‡å»º"
+
+#: reindexdb.c:230
+#, c-format
+msgid "cannot reindex specific index(es) in all databases"
+msgstr "无法在所有数æ®åº“中对指定的索引进行é‡å»º"
+
+#: reindexdb.c:243
+#, c-format
+msgid "cannot reindex specific schema(s) and system catalogs at the same time"
+msgstr "无法对指定的模å¼å’Œç³»ç»Ÿç›®å½•åŒæ—¶è¿›è¡Œç´¢å¼•é‡å»º"
+
+#: reindexdb.c:248
+#, c-format
+msgid "cannot reindex specific table(s) and system catalogs at the same time"
+msgstr "无法对指定的表和系统视图åŒæ—¶è¿›è¡Œç´¢å¼•é‡å»ºæ“作"
+
+#: reindexdb.c:253
+#, c-format
+msgid "cannot reindex specific index(es) and system catalogs at the same time"
+msgstr "无法对指定索引和系统视图åŒæ—¶è¿›è¡Œç´¢å¼•é‡å»ºæ“作"
+
+#: reindexdb.c:259
+msgid "cannot use multiple jobs to reindex system catalogs"
+msgstr "无法使用多个作业é‡æ–°ç´¢å¼•ç³»ç»Ÿç›®å½•"
+
+#: reindexdb.c:288
+msgid "cannot use multiple jobs to reindex indexes"
+msgstr "无法使用多个作业é‡æ–°ç´¢å¼•ç´¢å¼•"
+
+#: reindexdb.c:353 reindexdb.c:361 vacuumdb.c:471 vacuumdb.c:479 vacuumdb.c:487
+#: vacuumdb.c:495 vacuumdb.c:503 vacuumdb.c:511 vacuumdb.c:518 vacuumdb.c:525
+#: vacuumdb.c:532
+#, c-format
+msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s"
+msgstr "ä¸èƒ½åœ¨PostgreSQL %2$s之å‰çš„æœåŠ¡å™¨ç‰ˆæœ¬ä¸Šä½¿ç”¨ \"%1$s\" 选项"
+
+#: reindexdb.c:401
+msgid "cannot reindex system catalogs concurrently, skipping all"
+msgstr "无法åŒæ—¶é‡æ–°ç´¢å¼•ç³»ç»Ÿç›®å½•ï¼Œè·³è¿‡æ‰€æœ‰"
+
+#: reindexdb.c:605
+#, c-format
+msgid "reindexing of database \"%s\" failed: %s"
+msgstr "在数æ®åº“\"%s\"上é‡æ–°åˆ›å»ºç´¢å¼•å¤±è´¥: %s"
+
+#: reindexdb.c:609
+#, c-format
+msgid "reindexing of index \"%s\" in database \"%s\" failed: %s"
+msgstr "在数æ®åº“\"%2$s\"中对索引\"%1$s\"é‡æ–°åˆ›å»ºå¤±è´¥: %3$s"
+
+#: reindexdb.c:613
+#, c-format
+msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s"
+msgstr "在数æ®åº“\"%2$s\"中对模å¼\"%1$s\"的索引é‡å»ºå¤±è´¥ï¼š%3$s"
+
+#: reindexdb.c:617
+msgid "reindexing of system catalogs in database \"%s\" failed: %s"
+msgstr "在数æ®åº“\"%s\"中é‡æ–°ç´¢å¼•ç³»ç»Ÿç›®å½•å¤±è´¥: %s"
+
+#: reindexdb.c:621
+#, c-format
+msgid "reindexing of table \"%s\" in database \"%s\" failed: %s"
+msgstr "在数æ®åº“\"%2$s\"中对表\"%1$s\"上的索引é‡æ–°åˆ›å»ºå¤±è´¥: %3$s"
+
+#: reindexdb.c:774
+#, c-format
+msgid "%s: reindexing database \"%s\"\n"
+msgstr "%s: 对数æ®åº“ \"%s\" é‡æ–°åˆ›å»ºç´¢å¼•\n"
+
+#: reindexdb.c:791
+#, c-format
+msgid ""
+"%s reindexes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 对一个PostgreSQL æ•°æ®åº“é‡æ–°åˆ›å»ºç´¢å¼•.\n"
+"\n"
+
+#: reindexdb.c:795
+msgid " -a, --all reindex all databases\n"
+msgstr " -a, --all 对所有数æ®åº“进行é‡å»ºç´¢å¼•æ“作\n"
+
+#: reindexdb.c:796
+msgid " --concurrently reindex concurrently\n"
+msgstr " --concurrently åŒæ—¶é‡æ–°ç´¢å¼•\n"
+
+#: reindexdb.c:797
+msgid " -d, --dbname=DBNAME database to reindex\n"
+msgstr " -d, --dbname=DBNAME 对数æ®åº“中的索引进行é‡å»º\n"
+
+#: reindexdb.c:799
+msgid " -i, --index=INDEX recreate specific index(es) only\n"
+msgstr " -i, --index=INDEX ä»…é‡æ–°åˆ›å»ºæŒ‡å®šçš„索引\n"
+
+#: reindexdb.c:800
+msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n"
+msgstr " -j, --jobs=NUM 使用这么多并å‘连接æ¥é‡æ–°åˆ›å»ºç´¢å¼•\n"
+
+#: reindexdb.c:801
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ä¸å†™ä»»ä½•ä¿¡æ¯\n"
+
+#: reindexdb.c:802
+msgid " -s, --system reindex system catalogs\n"
+msgstr " -s, --system 对系统视图é‡æ–°åˆ›å»ºç´¢å¼•\n"
+
+#: reindexdb.c:803
+msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n"
+msgstr " -S, --schema=SCHEMA åªå¯¹æŒ‡å®šæ¨¡å¼é‡å»ºç´¢å¼•\n"
+
+#: reindexdb.c:804
+msgid " -t, --table=TABLE reindex specific table(s) only\n"
+msgstr " -t, --table=TABLE åªå¯¹æŒ‡å®šçš„表é‡æ–°åˆ›å»ºç´¢å¼•\n"
+
+#: reindexdb.c:805
+msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"
+msgstr " --tablespace=TABLESPACE é‡å»ºç´¢å¼•çš„表空间\n"
+
+#: reindexdb.c:806
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大é‡çš„输出\n"
+
+#: reindexdb.c:816
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command REINDEX for details.\n"
+msgstr ""
+"\n"
+"阅读SQL命令REINDEXçš„æè¿°ä¿¡æ¯, 以便获得更详细的信æ¯.\n"
+
+#: vacuumdb.c:206
+msgid "parallel workers for vacuum must be greater than or equal to zero"
+msgstr "真空平行工作必须大于或等于零"
+
+#: vacuumdb.c:226
+#, c-format
+msgid "minimum transaction ID age must be at least 1"
+msgstr "最å°äº‹åŠ¡ID必须至少为1"
+
+#: vacuumdb.c:234
+#, c-format
+msgid "minimum multixact ID age must be at least 1"
+msgstr "最å°å¤šäº‹åŠ¡ID必须至少为1"
+
+#: vacuumdb.c:278 vacuumdb.c:284 vacuumdb.c:290 vacuumdb.c:296 vacuumdb.c:302
+#: vacuumdb.c:308 vacuumdb.c:314 vacuumdb.c:326
+#, c-format
+msgid "cannot use the \"%s\" option when performing only analyze"
+msgstr "在åªæ‰§è¡Œåˆ†æžçš„时候,无法使用\"%s\"选项"
+
+#: vacuumdb.c:332
+msgid "cannot use the \"%s\" option when performing full vacuum"
+msgstr "执行完全真空时,无法使用\"%s\"选项"
+
+#: vacuumdb.c:341
+msgid "cannot use the \"%s\" option with the \"%s\" option"
+msgstr "无法将\"%s\"选项与\"%s\"选项一起使用"
+
+#: vacuumdb.c:363
+#, c-format
+msgid "cannot vacuum all databases and a specific one at the same time"
+msgstr "无法对所有数æ®åº“和一个指定的数æ®åº“åŒæ—¶æ¸…ç†"
+
+#: vacuumdb.c:368
+#, c-format
+msgid "cannot vacuum specific table(s) in all databases"
+msgstr "无法在所有数æ®åº“中对指定的表进行清ç†"
+
+#: vacuumdb.c:458
+msgid "Generating minimal optimizer statistics (1 target)"
+msgstr "产生最å°ä¼˜åŒ–器统计(一个目标)"
+
+#: vacuumdb.c:459
+msgid "Generating medium optimizer statistics (10 targets)"
+msgstr "产生中等优化器统计(10个目标)"
+
+#: vacuumdb.c:460
+msgid "Generating default (full) optimizer statistics"
+msgstr "产生缺çœ(完全)优化器统计"
+
+#: vacuumdb.c:540
+#, c-format
+msgid "%s: processing database \"%s\": %s\n"
+msgstr "%s:处ç†æ•°æ®åº“\"%s\":%s\n"
+
+#: vacuumdb.c:543
+#, c-format
+msgid "%s: vacuuming database \"%s\"\n"
+msgstr "%s: 清ç†æ•°æ®åº“ \"%s\"\n"
+
+#: vacuumdb.c:1013
+#, c-format
+msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s"
+msgstr "在数æ®åº“ \"%2$s\" 中的表 \"%1$s\" 清ç†å¤±è´¥: %3$s"
+
+#: vacuumdb.c:1016
+#, c-format
+msgid "vacuuming of database \"%s\" failed: %s"
+msgstr "æ•°æ®åº“ \"%s\" 清ç†å¤±è´¥: %s"
+
+#: vacuumdb.c:1024
+#, c-format
+msgid ""
+"%s cleans and analyzes a PostgreSQL database.\n"
+"\n"
+msgstr ""
+"%s 清ç†å¹¶ä¸”优化一个 PostgreSQL æ•°æ®åº“.\n"
+"\n"
+
+#: vacuumdb.c:1028
+#, c-format
+msgid " -a, --all vacuum all databases\n"
+msgstr " -a, --all 清ç†æ‰€æœ‰çš„æ•°æ®åº“\n"
+
+#: vacuumdb.c:1029
+#, c-format
+msgid " -d, --dbname=DBNAME database to vacuum\n"
+msgstr " -d, --dbname=DBNAME 清ç†æ•°æ®åº“ DBNAME\n"
+
+#: vacuumdb.c:1030
+#, c-format
+msgid " --disable-page-skipping disable all page-skipping behavior\n"
+msgstr " --disable-page-skipping ç¦ç”¨æ‰€æœ‰é¡µé¢è·³è¿‡è¡Œä¸º\n"
+
+#: vacuumdb.c:1031
+#, c-format
+msgid " -e, --echo show the commands being sent to the server\n"
+msgstr " -e, --echo 显示å‘é€åˆ°æœåŠ¡ç«¯çš„命令\n"
+
+#: vacuumdb.c:1032
+#, c-format
+msgid " -f, --full do full vacuuming\n"
+msgstr " -f, --full 完全清ç†\n"
+
+#: vacuumdb.c:1033
+#, c-format
+msgid " -F, --freeze freeze row transaction information\n"
+msgstr " -F, --freeze 冻结记录的事务信æ¯\n"
+
+#: vacuumdb.c:1034
+#, c-format
+msgid " --force-index-cleanup always remove index entries that point to dead tuples\n"
+msgstr " --force-index-cleanup 始终删除指å‘死元组的索引项\n"
+
+#: vacuumdb.c:1035
+#, c-format
+msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n"
+msgstr " -j, --jobs=NUM 使用这么多个并å‘连接进行清ç†\n"
+
+#: vacuumdb.c:1036
+#, c-format
+msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"
+msgstr " --min-mxid-age=MXID_AGE 清ç†è¡¨çš„最å°å¤šäº‹åŠ¡ID\n"
+
+#: vacuumdb.c:1037
+#, c-format
+msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"
+msgstr " --min-xid-age=XID_AGE 清ç†è¡¨çš„最å°äº‹åŠ¡ID\n"
+
+#: vacuumdb.c:1038
+#, c-format
+msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n"
+msgstr " --no-index-cleanup ä¸è¦åˆ é™¤æŒ‡å‘死元组的索引项\n"
+
+#: vacuumdb.c:1039
+#, c-format
+msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n"
+msgstr " --no-process-toast 跳过与该表关è”çš„TOAST表以使用真空\n"
+
+#: vacuumdb.c:1040
+msgid " --no-truncate don't truncate empty pages at the end of the table\n"
+msgstr " --no-truncate ä¸è¦æˆªæ–­è¡¨æœ«å°¾çš„空白页\n"
+
+#: vacuumdb.c:1041
+#, c-format
+msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"
+msgstr " -P, --parallel=PARALLEL_WORKERS 如果å¯ä»¥çš„è¯ï¼Œç”¨è¿™ä¹ˆå¤šçš„åŽå°å·¥ä½œæ¥åˆ¶ä½œçœŸç©º\n"
+
+#: vacuumdb.c:1042
+#, c-format
+msgid " -q, --quiet don't write any messages\n"
+msgstr " -q, --quiet ä¸å†™ä»»ä½•ä¿¡æ¯\n"
+
+#: vacuumdb.c:1043
+#, c-format
+msgid " --skip-locked skip relations that cannot be immediately locked\n"
+msgstr " --skip-locked 跳过ä¸èƒ½ç«‹å³é”定的关系\n"
+
+#: vacuumdb.c:1044
+#, c-format
+msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"
+msgstr " -t, --table='TABLE[(COLUMNS)]' åªæ¸…ç†æŒ‡å®šçš„表\n"
+
+#: vacuumdb.c:1045
+#, c-format
+msgid " -v, --verbose write a lot of output\n"
+msgstr " -v, --verbose 写大é‡çš„输出\n"
+
+#: vacuumdb.c:1046
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 输出版本信æ¯, 然åŽé€€å‡º\n"
+
+#: vacuumdb.c:1047
+#, c-format
+msgid " -z, --analyze update optimizer statistics\n"
+msgstr " -z, --analyze 更新优化器统计\n"
+
+#: vacuumdb.c:1048
+#, c-format
+msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n"
+msgstr " -Z, --analyze-only åªæ›´æ–°ä¼˜åŒ–器统计信æ¯ï¼Œä½†ä¸åšæ¸…ç†\n"
+
+#: vacuumdb.c:1049
+#, c-format
+msgid ""
+" --analyze-in-stages only update optimizer statistics, in multiple\n"
+" stages for faster results; no vacuum\n"
+msgstr ""
+" --analyze-in-stages åªæ›´æ–°ä¼˜åŒ–器统计, 为了更快得到结果分多阶段;\n"
+" ä¸åšæ¸…ç†\n"
+
+#: vacuumdb.c:1051
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助信æ¯, 然åŽé€€å‡º\n"
+
+#: vacuumdb.c:1059
+#, c-format
+msgid ""
+"\n"
+"Read the description of the SQL command VACUUM for details.\n"
+msgstr ""
+"\n"
+"阅读 SQL 命令 VACUUM çš„æè¿°ä¿¡æ¯, 以便获得更详细的信æ¯.\n"
+
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
new file mode 100644
index 0000000..5b297d1
--- /dev/null
+++ b/src/bin/scripts/reindexdb.c
@@ -0,0 +1,777 @@
+/*-------------------------------------------------------------------------
+ *
+ * reindexdb
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ *
+ * src/bin/scripts/reindexdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "catalog/pg_class_d.h"
+#include "common.h"
+#include "common/connect.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/parallel_slot.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+typedef enum ReindexType
+{
+ REINDEX_DATABASE,
+ REINDEX_INDEX,
+ REINDEX_SCHEMA,
+ REINDEX_SYSTEM,
+ REINDEX_TABLE
+} ReindexType;
+
+
+static SimpleStringList *get_parallel_object_list(PGconn *conn,
+ ReindexType type,
+ SimpleStringList *user_list,
+ bool echo);
+static void reindex_one_database(ConnParams *cparams, ReindexType type,
+ SimpleStringList *user_list,
+ const char *progname,
+ bool echo, bool verbose, bool concurrently,
+ int concurrentCons, const char *tablespace);
+static void reindex_all_databases(ConnParams *cparams,
+ const char *progname, bool echo,
+ bool quiet, bool verbose, bool concurrently,
+ int concurrentCons, const char *tablespace);
+static void run_reindex_command(PGconn *conn, ReindexType type,
+ const char *name, bool echo, bool verbose,
+ bool concurrently, bool async,
+ const char *tablespace);
+
+static void help(const char *progname);
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"schema", required_argument, NULL, 'S'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"all", no_argument, NULL, 'a'},
+ {"system", no_argument, NULL, 's'},
+ {"table", required_argument, NULL, 't'},
+ {"index", required_argument, NULL, 'i'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"concurrently", no_argument, NULL, 1},
+ {"maintenance-db", required_argument, NULL, 2},
+ {"tablespace", required_argument, NULL, 3},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ const char *host = NULL;
+ const char *port = NULL;
+ const char *username = NULL;
+ const char *tablespace = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool syscatalog = false;
+ bool alldb = false;
+ bool echo = false;
+ bool quiet = false;
+ bool verbose = false;
+ bool concurrently = false;
+ SimpleStringList indexes = {NULL, NULL};
+ SimpleStringList tables = {NULL, NULL};
+ SimpleStringList schemas = {NULL, NULL};
+ int concurrentCons = 1;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "reindexdb", help);
+
+ /* process command-line options */
+ while ((c = getopt_long(argc, argv, "ad:eh:i:j:qp:sS:t:U:vwW", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ alldb = true;
+ break;
+ case 'd':
+ dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'i':
+ simple_string_list_append(&indexes, optarg);
+ break;
+ case 'j':
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &concurrentCons))
+ exit(1);
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 's':
+ syscatalog = true;
+ break;
+ case 'S':
+ simple_string_list_append(&schemas, optarg);
+ break;
+ case 't':
+ simple_string_list_append(&tables, optarg);
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 1:
+ concurrently = true;
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 3:
+ tablespace = pg_strdup(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dbname == NULL)
+ {
+ dbname = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ if (alldb)
+ {
+ if (dbname)
+ pg_fatal("cannot reindex all databases and a specific one at the same time");
+ if (syscatalog)
+ pg_fatal("cannot reindex all databases and system catalogs at the same time");
+ if (schemas.head != NULL)
+ pg_fatal("cannot reindex specific schema(s) in all databases");
+ if (tables.head != NULL)
+ pg_fatal("cannot reindex specific table(s) in all databases");
+ if (indexes.head != NULL)
+ pg_fatal("cannot reindex specific index(es) in all databases");
+
+ cparams.dbname = maintenance_db;
+
+ reindex_all_databases(&cparams, progname, echo, quiet, verbose,
+ concurrently, concurrentCons, tablespace);
+ }
+ else if (syscatalog)
+ {
+ if (schemas.head != NULL)
+ pg_fatal("cannot reindex specific schema(s) and system catalogs at the same time");
+ if (tables.head != NULL)
+ pg_fatal("cannot reindex specific table(s) and system catalogs at the same time");
+ if (indexes.head != NULL)
+ pg_fatal("cannot reindex specific index(es) and system catalogs at the same time");
+
+ if (concurrentCons > 1)
+ pg_fatal("cannot use multiple jobs to reindex system catalogs");
+
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ reindex_one_database(&cparams, REINDEX_SYSTEM, NULL,
+ progname, echo, verbose,
+ concurrently, 1, tablespace);
+ }
+ else
+ {
+ /*
+ * Index-level REINDEX is not supported with multiple jobs as we
+ * cannot control the concurrent processing of multiple indexes
+ * depending on the same relation.
+ */
+ if (concurrentCons > 1 && indexes.head != NULL)
+ pg_fatal("cannot use multiple jobs to reindex indexes");
+
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ if (schemas.head != NULL)
+ reindex_one_database(&cparams, REINDEX_SCHEMA, &schemas,
+ progname, echo, verbose,
+ concurrently, concurrentCons, tablespace);
+
+ if (indexes.head != NULL)
+ reindex_one_database(&cparams, REINDEX_INDEX, &indexes,
+ progname, echo, verbose,
+ concurrently, 1, tablespace);
+
+ if (tables.head != NULL)
+ reindex_one_database(&cparams, REINDEX_TABLE, &tables,
+ progname, echo, verbose,
+ concurrently, concurrentCons, tablespace);
+
+ /*
+ * reindex database only if neither index nor table nor schema is
+ * specified
+ */
+ if (indexes.head == NULL && tables.head == NULL && schemas.head == NULL)
+ reindex_one_database(&cparams, REINDEX_DATABASE, NULL,
+ progname, echo, verbose,
+ concurrently, concurrentCons, tablespace);
+ }
+
+ exit(0);
+}
+
+static void
+reindex_one_database(ConnParams *cparams, ReindexType type,
+ SimpleStringList *user_list,
+ const char *progname, bool echo,
+ bool verbose, bool concurrently, int concurrentCons,
+ const char *tablespace)
+{
+ PGconn *conn;
+ SimpleStringListCell *cell;
+ bool parallel = concurrentCons > 1;
+ SimpleStringList *process_list = user_list;
+ ReindexType process_type = type;
+ ParallelSlotArray *sa;
+ bool failed = false;
+ int items_count = 0;
+
+ conn = connectDatabase(cparams, progname, echo, false, false);
+
+ if (concurrently && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "concurrently", "12");
+ }
+
+ if (tablespace && PQserverVersion(conn) < 140000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "tablespace", "14");
+ }
+
+ if (!parallel)
+ {
+ switch (process_type)
+ {
+ case REINDEX_DATABASE:
+ case REINDEX_SYSTEM:
+
+ /*
+ * Database and system reindexes only need to work on the
+ * database itself, so build a list with a single entry.
+ */
+ Assert(user_list == NULL);
+ process_list = pg_malloc0(sizeof(SimpleStringList));
+ simple_string_list_append(process_list, PQdb(conn));
+ break;
+
+ case REINDEX_INDEX:
+ case REINDEX_SCHEMA:
+ case REINDEX_TABLE:
+ Assert(user_list != NULL);
+ break;
+ }
+ }
+ else
+ {
+ switch (process_type)
+ {
+ case REINDEX_DATABASE:
+
+ /* Build a list of relations from the database */
+ process_list = get_parallel_object_list(conn, process_type,
+ user_list, echo);
+ process_type = REINDEX_TABLE;
+
+ /* Bail out if nothing to process */
+ if (process_list == NULL)
+ return;
+ break;
+
+ case REINDEX_SCHEMA:
+ Assert(user_list != NULL);
+
+ /* Build a list of relations from all the schemas */
+ process_list = get_parallel_object_list(conn, process_type,
+ user_list, echo);
+ process_type = REINDEX_TABLE;
+
+ /* Bail out if nothing to process */
+ if (process_list == NULL)
+ return;
+ break;
+
+ case REINDEX_SYSTEM:
+ case REINDEX_INDEX:
+ /* not supported */
+ Assert(false);
+ break;
+
+ case REINDEX_TABLE:
+
+ /*
+ * Fall through. The list of items for tables is already
+ * created.
+ */
+ break;
+ }
+ }
+
+ /*
+ * Adjust the number of concurrent connections depending on the items in
+ * the list. We choose the minimum between the number of concurrent
+ * connections and the number of items in the list.
+ */
+ for (cell = process_list->head; cell; cell = cell->next)
+ {
+ items_count++;
+
+ /* no need to continue if there are more elements than jobs */
+ if (items_count >= concurrentCons)
+ break;
+ }
+ concurrentCons = Min(concurrentCons, items_count);
+ Assert(concurrentCons > 0);
+
+ Assert(process_list != NULL);
+
+ sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, NULL);
+ ParallelSlotsAdoptConn(sa, conn);
+
+ cell = process_list->head;
+ do
+ {
+ const char *objname = cell->val;
+ ParallelSlot *free_slot = NULL;
+
+ if (CancelRequested)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ free_slot = ParallelSlotsGetIdle(sa, NULL);
+ if (!free_slot)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
+ run_reindex_command(free_slot->connection, process_type, objname,
+ echo, verbose, concurrently, true, tablespace);
+
+ cell = cell->next;
+ } while (cell != NULL);
+
+ if (!ParallelSlotsWaitCompletion(sa))
+ failed = true;
+
+finish:
+ if (process_list != user_list)
+ {
+ simple_string_list_destroy(process_list);
+ pg_free(process_list);
+ }
+
+ ParallelSlotsTerminate(sa);
+ pfree(sa);
+
+ if (failed)
+ exit(1);
+}
+
+static void
+run_reindex_command(PGconn *conn, ReindexType type, const char *name,
+ bool echo, bool verbose, bool concurrently, bool async,
+ const char *tablespace)
+{
+ const char *paren = "(";
+ const char *comma = ", ";
+ const char *sep = paren;
+ PQExpBufferData sql;
+ bool status;
+
+ Assert(name);
+
+ /* build the REINDEX query */
+ initPQExpBuffer(&sql);
+
+ appendPQExpBufferStr(&sql, "REINDEX ");
+
+ if (verbose)
+ {
+ appendPQExpBuffer(&sql, "%sVERBOSE", sep);
+ sep = comma;
+ }
+
+ if (tablespace)
+ {
+ appendPQExpBuffer(&sql, "%sTABLESPACE %s", sep, fmtId(tablespace));
+ sep = comma;
+ }
+
+ if (sep != paren)
+ appendPQExpBufferStr(&sql, ") ");
+
+ /* object type */
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ appendPQExpBufferStr(&sql, "DATABASE ");
+ break;
+ case REINDEX_INDEX:
+ appendPQExpBufferStr(&sql, "INDEX ");
+ break;
+ case REINDEX_SCHEMA:
+ appendPQExpBufferStr(&sql, "SCHEMA ");
+ break;
+ case REINDEX_SYSTEM:
+ appendPQExpBufferStr(&sql, "SYSTEM ");
+ break;
+ case REINDEX_TABLE:
+ appendPQExpBufferStr(&sql, "TABLE ");
+ break;
+ }
+
+ /*
+ * Parenthesized grammar is only supported for CONCURRENTLY since
+ * PostgreSQL 14. Since 12, CONCURRENTLY can be specified after the
+ * object type.
+ */
+ if (concurrently)
+ appendPQExpBufferStr(&sql, "CONCURRENTLY ");
+
+ /* object name */
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ case REINDEX_SYSTEM:
+ appendPQExpBufferStr(&sql, fmtId(name));
+ break;
+ case REINDEX_INDEX:
+ case REINDEX_TABLE:
+ appendQualifiedRelation(&sql, name, conn, echo);
+ break;
+ case REINDEX_SCHEMA:
+ appendPQExpBufferStr(&sql, name);
+ break;
+ }
+
+ /* finish the query */
+ appendPQExpBufferChar(&sql, ';');
+
+ if (async)
+ {
+ if (echo)
+ printf("%s\n", sql.data);
+
+ status = PQsendQuery(conn, sql.data) == 1;
+ }
+ else
+ status = executeMaintenanceCommand(conn, sql.data, echo);
+
+ if (!status)
+ {
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ pg_log_error("reindexing of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_INDEX:
+ pg_log_error("reindexing of index \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_SCHEMA:
+ pg_log_error("reindexing of schema \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_SYSTEM:
+ pg_log_error("reindexing of system catalogs in database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ break;
+ case REINDEX_TABLE:
+ pg_log_error("reindexing of table \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
+ break;
+ }
+ if (!async)
+ {
+ PQfinish(conn);
+ exit(1);
+ }
+ }
+
+ termPQExpBuffer(&sql);
+}
+
+/*
+ * Prepare the list of objects to process by querying the catalogs.
+ *
+ * This function will return a SimpleStringList object containing the entire
+ * list of tables in the given database that should be processed by a parallel
+ * database-wide reindex (excluding system tables), or NULL if there's no such
+ * table.
+ */
+static SimpleStringList *
+get_parallel_object_list(PGconn *conn, ReindexType type,
+ SimpleStringList *user_list, bool echo)
+{
+ PQExpBufferData catalog_query;
+ PQExpBufferData buf;
+ PGresult *res;
+ SimpleStringList *tables;
+ int ntups,
+ i;
+
+ initPQExpBuffer(&catalog_query);
+
+ /*
+ * The queries here are using a safe search_path, so there's no need to
+ * fully qualify everything.
+ */
+ switch (type)
+ {
+ case REINDEX_DATABASE:
+ Assert(user_list == NULL);
+ appendPQExpBufferStr(&catalog_query,
+ "SELECT c.relname, ns.nspname\n"
+ " FROM pg_catalog.pg_class c\n"
+ " JOIN pg_catalog.pg_namespace ns"
+ " ON c.relnamespace = ns.oid\n"
+ " WHERE ns.nspname != 'pg_catalog'\n"
+ " AND c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ")\n"
+ " ORDER BY c.relpages DESC;");
+ break;
+
+ case REINDEX_SCHEMA:
+ {
+ SimpleStringListCell *cell;
+ bool nsp_listed = false;
+
+ Assert(user_list != NULL);
+
+ /*
+ * All the tables from all the listed schemas are grabbed at
+ * once.
+ */
+ appendPQExpBufferStr(&catalog_query,
+ "SELECT c.relname, ns.nspname\n"
+ " FROM pg_catalog.pg_class c\n"
+ " JOIN pg_catalog.pg_namespace ns"
+ " ON c.relnamespace = ns.oid\n"
+ " WHERE c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ")\n"
+ " AND ns.nspname IN (");
+
+ for (cell = user_list->head; cell; cell = cell->next)
+ {
+ const char *nspname = cell->val;
+
+ if (nsp_listed)
+ appendPQExpBufferStr(&catalog_query, ", ");
+ else
+ nsp_listed = true;
+
+ appendStringLiteralConn(&catalog_query, nspname, conn);
+ }
+
+ appendPQExpBufferStr(&catalog_query, ")\n"
+ " ORDER BY c.relpages DESC;");
+ }
+ break;
+
+ case REINDEX_SYSTEM:
+ case REINDEX_INDEX:
+ case REINDEX_TABLE:
+ Assert(false);
+ break;
+ }
+
+ res = executeQuery(conn, catalog_query.data, echo);
+ termPQExpBuffer(&catalog_query);
+
+ /*
+ * If no rows are returned, there are no matching tables, so we are done.
+ */
+ ntups = PQntuples(res);
+ if (ntups == 0)
+ {
+ PQclear(res);
+ PQfinish(conn);
+ return NULL;
+ }
+
+ tables = pg_malloc0(sizeof(SimpleStringList));
+
+ /* Build qualified identifiers for each table */
+ initPQExpBuffer(&buf);
+ for (i = 0; i < ntups; i++)
+ {
+ appendPQExpBufferStr(&buf,
+ fmtQualifiedId(PQgetvalue(res, i, 1),
+ PQgetvalue(res, i, 0)));
+
+ simple_string_list_append(tables, buf.data);
+ resetPQExpBuffer(&buf);
+ }
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ return tables;
+}
+
+static void
+reindex_all_databases(ConnParams *cparams,
+ const char *progname, bool echo, bool quiet, bool verbose,
+ bool concurrently, int concurrentCons,
+ const char *tablespace)
+{
+ PGconn *conn;
+ PGresult *result;
+ int i;
+
+ conn = connectMaintenanceDatabase(cparams, progname, echo);
+ result = executeQuery(conn,
+ "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
+ echo);
+ PQfinish(conn);
+
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ char *dbname = PQgetvalue(result, i, 0);
+
+ if (!quiet)
+ {
+ printf(_("%s: reindexing database \"%s\"\n"), progname, dbname);
+ fflush(stdout);
+ }
+
+ cparams->override_dbname = dbname;
+
+ reindex_one_database(cparams, REINDEX_DATABASE, NULL,
+ progname, echo, verbose, concurrently,
+ concurrentCons, tablespace);
+ }
+
+ PQclear(result);
+}
+
+static void
+help(const char *progname)
+{
+ printf(_("%s reindexes a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --all reindex all databases\n"));
+ printf(_(" --concurrently reindex concurrently\n"));
+ printf(_(" -d, --dbname=DBNAME database to reindex\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -i, --index=INDEX recreate specific index(es) only\n"));
+ printf(_(" -j, --jobs=NUM use this many concurrent connections to reindex\n"));
+ printf(_(" -q, --quiet don't write any messages\n"));
+ printf(_(" -s, --system reindex system catalogs only\n"));
+ printf(_(" -S, --schema=SCHEMA reindex specific schema(s) only\n"));
+ printf(_(" -t, --table=TABLE reindex specific table(s) only\n"));
+ printf(_(" --tablespace=TABLESPACE tablespace where indexes are rebuilt\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nRead the description of the SQL command REINDEX for details.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
diff --git a/src/bin/scripts/t/010_clusterdb.pl b/src/bin/scripts/t/010_clusterdb.pl
new file mode 100644
index 0000000..715207f
--- /dev/null
+++ b/src/bin/scripts/t/010_clusterdb.pl
@@ -0,0 +1,38 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('clusterdb');
+program_version_ok('clusterdb');
+program_options_handling_ok('clusterdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ ['clusterdb'],
+ qr/statement: CLUSTER;/,
+ 'SQL CLUSTER run');
+
+$node->command_fails([ 'clusterdb', '-t', 'nonexistent' ],
+ 'fails with nonexistent table');
+
+$node->safe_psql('postgres',
+ 'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a); CLUSTER test1 USING test1x'
+);
+$node->issues_sql_like(
+ [ 'clusterdb', '-t', 'test1' ],
+ qr/statement: CLUSTER public\.test1;/,
+ 'cluster specific table');
+
+$node->command_ok([qw(clusterdb --echo --verbose dbname=template1)],
+ 'clusterdb with connection string');
+
+done_testing();
diff --git a/src/bin/scripts/t/011_clusterdb_all.pl b/src/bin/scripts/t/011_clusterdb_all.pl
new file mode 100644
index 0000000..35f0b18
--- /dev/null
+++ b/src/bin/scripts/t/011_clusterdb_all.pl
@@ -0,0 +1,38 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+# clusterdb -a is not compatible with -d, hence enforce environment variable
+# correctly.
+$ENV{PGDATABASE} = 'postgres';
+
+$node->issues_sql_like(
+ [ 'clusterdb', '-a' ],
+ qr/statement: CLUSTER.*statement: CLUSTER/s,
+ 'cluster all databases');
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'clusterdb', '-a' ],
+ 'invalid database not targeted by clusterdb -a');
+
+# Doesn't quite belong here, but don't want to waste time by creating an
+# invalid database in 010_clusterdb.pl as well.
+$node->command_fails_like([ 'clusterdb', '-d', 'regression_invalid'],
+ qr/FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'clusterdb cannot target invalid database');
+
+done_testing();
diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl
new file mode 100644
index 0000000..4029192
--- /dev/null
+++ b/src/bin/scripts/t/020_createdb.pl
@@ -0,0 +1,195 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('createdb');
+program_version_ok('createdb');
+program_options_handling_ok('createdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'createdb', 'foobar1' ],
+ qr/statement: CREATE DATABASE foobar1/,
+ 'SQL CREATE DATABASE run');
+$node->issues_sql_like(
+ [ 'createdb', '-l', 'C', '-E', 'LATIN1', '-T', 'template0', 'foobar2' ],
+ qr/statement: CREATE DATABASE foobar2 ENCODING 'LATIN1'/,
+ 'create database with encoding');
+
+if ($ENV{with_icu} eq 'yes')
+{
+ # This fails because template0 uses libc provider and has no ICU
+ # locale set. It would succeed if template0 used the icu
+ # provider. XXX Maybe split into multiple tests?
+ $node->command_fails(
+ [
+ 'createdb', '-T', 'template0', '-E', 'UTF8',
+ '--locale-provider=icu', 'foobar4'
+ ],
+ 'create database with ICU fails without ICU locale specified');
+
+ $node->issues_sql_like(
+ [
+ 'createdb', '-T',
+ 'template0', '-E',
+ 'UTF8', '--locale-provider=icu',
+ '--locale=C', '--icu-locale=en',
+ 'foobar5'
+ ],
+ qr/statement: CREATE DATABASE foobar5 .* LOCALE_PROVIDER icu ICU_LOCALE 'en'/,
+ 'create database with ICU locale specified');
+
+ $node->command_fails(
+ [
+ 'createdb', '-T', 'template0', '-E', 'UTF8',
+ '--locale-provider=icu',
+ '--icu-locale=@colNumeric=lower', 'foobarX'
+ ],
+ 'fails for invalid ICU locale');
+
+ $node->command_fails_like(
+ [
+ 'createdb', '-T',
+ 'template0', '--locale-provider=icu',
+ '--encoding=SQL_ASCII', 'foobarX'
+ ],
+ qr/ERROR: encoding "SQL_ASCII" is not supported with ICU provider/,
+ 'fails for encoding not supported by ICU');
+
+ # additional node, which uses the icu provider
+ my $node2 = PostgreSQL::Test::Cluster->new('icu');
+ $node2->init(extra => [ '--locale-provider=icu', '--icu-locale=en' ]);
+ $node2->start;
+
+ $node2->command_ok(
+ [
+ 'createdb', '-T',
+ 'template0', '--locale-provider=libc',
+ 'foobar55'
+ ],
+ 'create database with libc provider from template database with icu provider'
+ );
+
+ $node2->command_ok(
+ [
+ 'createdb', '-T', 'template0', '--icu-locale', 'en-US',
+ 'foobar56'
+ ],
+ 'create database with icu locale from template database with icu provider'
+ );
+
+ $node2->command_ok(
+ [
+ 'createdb', '-T',
+ 'template0', '--locale-provider',
+ 'icu', '--locale',
+ 'en', '--lc-collate',
+ 'C', '--lc-ctype',
+ 'C', 'foobar57'
+ ],
+ 'create database with locale as ICU locale');
+}
+else
+{
+ $node->command_fails(
+ [ 'createdb', '-T', 'template0', '--locale-provider=icu', 'foobar4' ],
+ 'create database with ICU fails since no ICU support');
+}
+
+$node->command_fails([ 'createdb', 'foobar1' ],
+ 'fails if database already exists');
+
+$node->command_fails(
+ [ 'createdb', '-T', 'template0', '--locale-provider=xyz', 'foobarX' ],
+ 'fails for invalid locale provider');
+
+# Check use of templates with shared dependencies copied from the template.
+my ($ret, $stdout, $stderr) = $node->psql(
+ 'foobar2',
+ 'CREATE ROLE role_foobar;
+CREATE TABLE tab_foobar (id int);
+ALTER TABLE tab_foobar owner to role_foobar;
+CREATE POLICY pol_foobar ON tab_foobar FOR ALL TO role_foobar;');
+$node->issues_sql_like(
+ [ 'createdb', '-l', 'C', '-T', 'foobar2', 'foobar3' ],
+ qr/statement: CREATE DATABASE foobar3 TEMPLATE foobar2 LOCALE 'C'/,
+ 'create database with template');
+($ret, $stdout, $stderr) = $node->psql(
+ 'foobar3',
+ "SELECT pg_describe_object(classid, objid, objsubid) AS obj,
+ pg_describe_object(refclassid, refobjid, 0) AS refobj
+ FROM pg_shdepend s JOIN pg_database d ON (d.oid = s.dbid)
+ WHERE d.datname = 'foobar3' ORDER BY obj;", on_error_die => 1);
+chomp($stdout);
+like(
+ $stdout,
+ qr/^policy pol_foobar on table tab_foobar\|role role_foobar
+table tab_foobar\|role role_foobar$/,
+ 'shared dependencies copied over to target database');
+
+# Check quote handling with incorrect option values.
+$node->command_checks_all(
+ [ 'createdb', '--encoding', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [qr/^createdb: error: "foo'; SELECT '1" is not a valid encoding name/s],
+ 'createdb with incorrect --encoding');
+$node->command_checks_all(
+ [ 'createdb', '--lc-collate', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid LC_COLLATE locale name|^createdb: error: database creation failed: ERROR: new collation \(foo'; SELECT '1\) is incompatible with the collation of the template database/s
+ ],
+ 'createdb with incorrect --lc-collate');
+$node->command_checks_all(
+ [ 'createdb', '--lc-ctype', "foo'; SELECT '1", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid LC_CTYPE locale name|^createdb: error: database creation failed: ERROR: new LC_CTYPE \(foo'; SELECT '1\) is incompatible with the LC_CTYPE of the template database/s
+ ],
+ 'createdb with incorrect --lc-ctype');
+
+$node->command_checks_all(
+ [ 'createdb', '--strategy', "foo", 'foobar2' ],
+ 1,
+ [qr/^$/],
+ [
+ qr/^createdb: error: database creation failed: ERROR: invalid create database strategy "foo"/s
+ ],
+ 'createdb with incorrect --strategy');
+
+# Check database creation strategy
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-S', 'wal_log', 'foobar6' ],
+ qr/statement: CREATE DATABASE foobar6 STRATEGY wal_log TEMPLATE foobar2/,
+ 'create database with WAL_LOG strategy');
+
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-S', 'file_copy', 'foobar7' ],
+ qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/,
+ 'create database with FILE_COPY strategy');
+
+# Create database owned by role_foobar.
+$node->issues_sql_like(
+ [ 'createdb', '-T', 'foobar2', '-O', 'role_foobar', 'foobar8' ],
+ qr/statement: CREATE DATABASE foobar8 OWNER role_foobar TEMPLATE foobar2/,
+ 'create database with owner role_foobar');
+($ret, $stdout, $stderr) =
+ $node->psql('foobar2', 'DROP OWNED BY role_foobar;', on_error_die => 1,);
+ok($ret == 0, "DROP OWNED BY role_foobar");
+($ret, $stdout, $stderr) =
+ $node->psql('foobar2', 'DROP DATABASE foobar8;', on_error_die => 1,);
+ok($ret == 0, "DROP DATABASE foobar8");
+
+done_testing();
diff --git a/src/bin/scripts/t/040_createuser.pl b/src/bin/scripts/t/040_createuser.pl
new file mode 100644
index 0000000..9ca2821
--- /dev/null
+++ b/src/bin/scripts/t/040_createuser.pl
@@ -0,0 +1,83 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('createuser');
+program_version_ok('createuser');
+program_options_handling_ok('createuser');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'createuser', 'regress_user1' ],
+ qr/statement: CREATE ROLE regress_user1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS;/,
+ 'SQL CREATE USER run');
+$node->issues_sql_like(
+ [ 'createuser', '-L', 'regress_role1' ],
+ qr/statement: CREATE ROLE regress_role1 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS;/,
+ 'create a non-login role');
+$node->issues_sql_like(
+ [ 'createuser', '-r', 'regress user2' ],
+ qr/statement: CREATE ROLE "regress user2" NOSUPERUSER NOCREATEDB CREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS;/,
+ 'create a CREATEROLE user');
+$node->issues_sql_like(
+ [ 'createuser', '-s', 'regress_user3' ],
+ qr/statement: CREATE ROLE regress_user3 SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS;/,
+ 'create a superuser');
+$node->issues_sql_like(
+ [
+ 'createuser', '-a',
+ 'regress_user1', '-a',
+ 'regress user2', 'regress user #4'
+ ],
+ qr/statement: CREATE ROLE "regress user #4" NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS ADMIN regress_user1,"regress user2";/,
+ 'add a role as a member with admin option of the newly created role');
+$node->issues_sql_like(
+ [
+ 'createuser', '-m',
+ 'regress_user3', '-m',
+ 'regress user #4', 'REGRESS_USER5'
+ ],
+ qr/statement: CREATE ROLE "REGRESS_USER5" NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS ROLE regress_user3,"regress user #4";/,
+ 'add a role as a member of the newly created role');
+$node->issues_sql_like(
+ [ 'createuser', '-v', '2029 12 31', 'regress_user6' ],
+ qr/statement: CREATE ROLE regress_user6 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS VALID UNTIL \'2029 12 31\';/,
+ 'create a role with a password expiration date');
+$node->issues_sql_like(
+ [ 'createuser', '--bypassrls', 'regress_user7' ],
+ qr/statement: CREATE ROLE regress_user7 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION BYPASSRLS;/,
+ 'create a BYPASSRLS role');
+$node->issues_sql_like(
+ [ 'createuser', '--no-bypassrls', 'regress_user8' ],
+ qr/statement: CREATE ROLE regress_user8 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS;/,
+ 'create a role without BYPASSRLS');
+$node->issues_sql_like(
+ [ 'createuser', '--with-admin', 'regress_user1', 'regress_user9' ],
+ qr/statement: CREATE ROLE regress_user9 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS ADMIN regress_user1;/,
+ '--with-admin');
+$node->issues_sql_like(
+ [ 'createuser', '--with-member', 'regress_user1', 'regress_user10' ],
+ qr/statement: CREATE ROLE regress_user10 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS ROLE regress_user1;/,
+ '--with-member');
+$node->issues_sql_like(
+ [ 'createuser', '--role', 'regress_user1', 'regress_user11' ],
+ qr/statement: CREATE ROLE regress_user11 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS IN ROLE regress_user1;/,
+ '--role');
+$node->issues_sql_like(
+ [ 'createuser', '--member-of', 'regress_user1', 'regress_user12' ],
+ qr/statement: CREATE ROLE regress_user12 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS IN ROLE regress_user1;/,
+ '--member-of');
+
+$node->command_fails([ 'createuser', 'regress_user1' ],
+ 'fails if role already exists');
+
+done_testing();
diff --git a/src/bin/scripts/t/050_dropdb.pl b/src/bin/scripts/t/050_dropdb.pl
new file mode 100644
index 0000000..3ed670b
--- /dev/null
+++ b/src/bin/scripts/t/050_dropdb.pl
@@ -0,0 +1,43 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('dropdb');
+program_version_ok('dropdb');
+program_options_handling_ok('dropdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->safe_psql('postgres', 'CREATE DATABASE foobar1');
+$node->issues_sql_like(
+ [ 'dropdb', 'foobar1' ],
+ qr/statement: DROP DATABASE foobar1/,
+ 'SQL DROP DATABASE run');
+
+$node->safe_psql('postgres', 'CREATE DATABASE foobar2');
+$node->issues_sql_like(
+ [ 'dropdb', '--force', 'foobar2' ],
+ qr/statement: DROP DATABASE foobar2 WITH \(FORCE\);/,
+ 'SQL DROP DATABASE (FORCE) run');
+
+$node->command_fails([ 'dropdb', 'nonexistent' ],
+ 'fails with nonexistent database');
+
+# check that invalid database can be dropped with dropdb
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'dropdb', 'regression_invalid' ],
+ 'invalid database can be dropped');
+
+done_testing();
diff --git a/src/bin/scripts/t/070_dropuser.pl b/src/bin/scripts/t/070_dropuser.pl
new file mode 100644
index 0000000..95c24c4
--- /dev/null
+++ b/src/bin/scripts/t/070_dropuser.pl
@@ -0,0 +1,28 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('dropuser');
+program_version_ok('dropuser');
+program_options_handling_ok('dropuser');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->safe_psql('postgres', 'CREATE ROLE regress_foobar1');
+$node->issues_sql_like(
+ [ 'dropuser', 'regress_foobar1' ],
+ qr/statement: DROP ROLE regress_foobar1/,
+ 'SQL DROP ROLE run');
+
+$node->command_fails([ 'dropuser', 'regress_nonexistent' ],
+ 'fails with nonexistent user');
+
+done_testing();
diff --git a/src/bin/scripts/t/080_pg_isready.pl b/src/bin/scripts/t/080_pg_isready.pl
new file mode 100644
index 0000000..8f53aef
--- /dev/null
+++ b/src/bin/scripts/t/080_pg_isready.pl
@@ -0,0 +1,25 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_isready');
+program_version_ok('pg_isready');
+program_options_handling_ok('pg_isready');
+
+command_fails(['pg_isready'], 'fails with no server running');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->command_ok(
+ [ 'pg_isready', "--timeout=$PostgreSQL::Test::Utils::timeout_default" ],
+ 'succeeds with server running');
+
+done_testing();
diff --git a/src/bin/scripts/t/090_reindexdb.pl b/src/bin/scripts/t/090_reindexdb.pl
new file mode 100644
index 0000000..b663d0e
--- /dev/null
+++ b/src/bin/scripts/t/090_reindexdb.pl
@@ -0,0 +1,265 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('reindexdb');
+program_version_ok('reindexdb');
+program_options_handling_ok('reindexdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$ENV{PGOPTIONS} = '--client-min-messages=WARNING';
+
+# Create a tablespace for testing.
+my $tbspace_path = $node->basedir . '/regress_reindex_tbspace';
+mkdir $tbspace_path or die "cannot create directory $tbspace_path";
+my $tbspace_name = 'reindex_tbspace';
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE $tbspace_name LOCATION '$tbspace_path';");
+
+# Use text as data type to get a toast table.
+$node->safe_psql('postgres',
+ 'CREATE TABLE test1 (a text); CREATE INDEX test1x ON test1 (a);');
+# Collect toast table and index names of this relation, for later use.
+my $toast_table = $node->safe_psql('postgres',
+ "SELECT reltoastrelid::regclass FROM pg_class WHERE oid = 'test1'::regclass;"
+);
+my $toast_index = $node->safe_psql('postgres',
+ "SELECT indexrelid::regclass FROM pg_index WHERE indrelid = '$toast_table'::regclass;"
+);
+
+# Set of SQL queries to cross-check the state of relfilenodes across
+# REINDEX operations. A set of relfilenodes is saved from the catalogs
+# and then compared with pg_class.
+$node->safe_psql('postgres',
+ 'CREATE TABLE index_relfilenodes (parent regclass, indname text, indoid oid, relfilenode oid);'
+);
+# Save the relfilenode of a set of toast indexes, one from the catalog
+# pg_constraint and one from the test table.
+my $fetch_toast_relfilenodes =
+ qq{SELECT b.oid::regclass, c.oid::regclass::text, c.oid, c.relfilenode
+ FROM pg_class a
+ JOIN pg_class b ON (a.oid = b.reltoastrelid)
+ JOIN pg_index i on (a.oid = i.indrelid)
+ JOIN pg_class c on (i.indexrelid = c.oid)
+ WHERE b.oid IN ('pg_constraint'::regclass, 'test1'::regclass)};
+# Same for relfilenodes of normal indexes. This saves the relfilenode
+# from an index of pg_constraint, and from the index of the test table.
+my $fetch_index_relfilenodes =
+ qq{SELECT i.indrelid, a.oid::regclass::text, a.oid, a.relfilenode
+ FROM pg_class a
+ JOIN pg_index i ON (i.indexrelid = a.oid)
+ WHERE a.relname IN ('pg_constraint_oid_index', 'test1x')};
+my $save_relfilenodes =
+ "INSERT INTO index_relfilenodes $fetch_toast_relfilenodes;"
+ . "INSERT INTO index_relfilenodes $fetch_index_relfilenodes;";
+
+# Query to compare a set of relfilenodes saved with the contents of pg_class.
+# Note that this does not join using OIDs, as CONCURRENTLY would change them
+# when reindexing. A filter is applied on the toast index names, even if this
+# does not make a difference between the catalog and normal ones. The ordering
+# based on the name is enough to ensure a fixed output, where the name of the
+# parent table is included to provide more context.
+my $compare_relfilenodes = qq(SELECT b.parent::regclass,
+ regexp_replace(b.indname::text, '(pg_toast.pg_toast_)\\d+(_index)', '\\1<oid>\\2'),
+ CASE WHEN a.oid = b.indoid THEN 'OID is unchanged'
+ ELSE 'OID has changed' END,
+ CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged'
+ ELSE 'relfilenode has changed' END
+ FROM index_relfilenodes b
+ JOIN pg_class a ON b.indname::text = a.oid::regclass::text
+ ORDER BY b.parent::text, b.indname::text);
+
+# Save the set of relfilenodes and compare them.
+$node->safe_psql('postgres', $save_relfilenodes);
+$node->issues_sql_like(
+ [ 'reindexdb', 'postgres' ],
+ qr/statement: REINDEX DATABASE postgres;/,
+ 'SQL REINDEX run');
+my $relnode_info = $node->safe_psql('postgres', $compare_relfilenodes);
+is( $relnode_info,
+ qq(pg_constraint|pg_constraint_oid_index|OID is unchanged|relfilenode is unchanged
+pg_constraint|pg_toast.pg_toast_<oid>_index|OID is unchanged|relfilenode is unchanged
+test1|pg_toast.pg_toast_<oid>_index|OID is unchanged|relfilenode has changed
+test1|test1x|OID is unchanged|relfilenode has changed),
+ 'relfilenode change after REINDEX DATABASE');
+
+# Re-save and run the second one.
+$node->safe_psql('postgres',
+ "TRUNCATE index_relfilenodes; $save_relfilenodes");
+$node->issues_sql_like(
+ [ 'reindexdb', '-s', 'postgres' ],
+ qr/statement: REINDEX SYSTEM postgres;/,
+ 'reindex system tables');
+$relnode_info = $node->safe_psql('postgres', $compare_relfilenodes);
+is( $relnode_info,
+ qq(pg_constraint|pg_constraint_oid_index|OID is unchanged|relfilenode has changed
+pg_constraint|pg_toast.pg_toast_<oid>_index|OID is unchanged|relfilenode has changed
+test1|pg_toast.pg_toast_<oid>_index|OID is unchanged|relfilenode is unchanged
+test1|test1x|OID is unchanged|relfilenode is unchanged),
+ 'relfilenode change after REINDEX SYSTEM');
+
+$node->issues_sql_like(
+ [ 'reindexdb', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX TABLE public\.test1;/,
+ 'reindex specific table');
+$node->issues_sql_like(
+ [ 'reindexdb', '-t', 'test1', '--tablespace', $tbspace_name, 'postgres' ],
+ qr/statement: REINDEX \(TABLESPACE $tbspace_name\) TABLE public\.test1;/,
+ 'reindex specific table on tablespace');
+$node->issues_sql_like(
+ [ 'reindexdb', '-i', 'test1x', 'postgres' ],
+ qr/statement: REINDEX INDEX public\.test1x;/,
+ 'reindex specific index');
+$node->issues_sql_like(
+ [ 'reindexdb', '-S', 'pg_catalog', 'postgres' ],
+ qr/statement: REINDEX SCHEMA pg_catalog;/,
+ 'reindex specific schema');
+$node->issues_sql_like(
+ [ 'reindexdb', '-v', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX \(VERBOSE\) TABLE public\.test1;/,
+ 'reindex with verbose output');
+$node->issues_sql_like(
+ [
+ 'reindexdb', '-v', '-t', 'test1',
+ '--tablespace', $tbspace_name, 'postgres'
+ ],
+ qr/statement: REINDEX \(VERBOSE, TABLESPACE $tbspace_name\) TABLE public\.test1;/,
+ 'reindex with verbose output and tablespace');
+
+# Same with --concurrently.
+# Save the state of the relations and compare them after the DATABASE
+# rebuild.
+$node->safe_psql('postgres',
+ "TRUNCATE index_relfilenodes; $save_relfilenodes");
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', 'postgres' ],
+ qr/statement: REINDEX DATABASE CONCURRENTLY postgres;/,
+ 'SQL REINDEX CONCURRENTLY run');
+$relnode_info = $node->safe_psql('postgres', $compare_relfilenodes);
+is( $relnode_info,
+ qq(pg_constraint|pg_constraint_oid_index|OID is unchanged|relfilenode is unchanged
+pg_constraint|pg_toast.pg_toast_<oid>_index|OID is unchanged|relfilenode is unchanged
+test1|pg_toast.pg_toast_<oid>_index|OID has changed|relfilenode has changed
+test1|test1x|OID has changed|relfilenode has changed),
+ 'OID change after REINDEX DATABASE CONCURRENTLY');
+
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX TABLE CONCURRENTLY public\.test1;/,
+ 'reindex specific table concurrently');
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-i', 'test1x', 'postgres' ],
+ qr/statement: REINDEX INDEX CONCURRENTLY public\.test1x;/,
+ 'reindex specific index concurrently');
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-S', 'public', 'postgres' ],
+ qr/statement: REINDEX SCHEMA CONCURRENTLY public;/,
+ 'reindex specific schema concurrently');
+$node->command_fails([ 'reindexdb', '--concurrently', '-s', 'postgres' ],
+ 'reindex system tables concurrently');
+$node->issues_sql_like(
+ [ 'reindexdb', '--concurrently', '-v', '-t', 'test1', 'postgres' ],
+ qr/statement: REINDEX \(VERBOSE\) TABLE CONCURRENTLY public\.test1;/,
+ 'reindex with verbose output concurrently');
+$node->issues_sql_like(
+ [
+ 'reindexdb', '--concurrently', '-v', '-t',
+ 'test1', '--tablespace', $tbspace_name, 'postgres'
+ ],
+ qr/statement: REINDEX \(VERBOSE, TABLESPACE $tbspace_name\) TABLE CONCURRENTLY public\.test1;/,
+ 'reindex concurrently with verbose output and tablespace');
+
+# REINDEX TABLESPACE on toast indexes and tables fails. This is not
+# part of the main regression test suite as these have unpredictable
+# names, and CONCURRENTLY cannot be used in transaction blocks, preventing
+# the use of TRY/CATCH blocks in a custom function to filter error
+# messages.
+$node->command_checks_all(
+ [
+ 'reindexdb', '-t', $toast_table, '--tablespace',
+ $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast table with tablespace');
+$node->command_checks_all(
+ [
+ 'reindexdb', '--concurrently', '-t', $toast_table,
+ '--tablespace', $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast table concurrently with tablespace');
+$node->command_checks_all(
+ [
+ 'reindexdb', '-i', $toast_index, '--tablespace',
+ $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast index with tablespace');
+$node->command_checks_all(
+ [
+ 'reindexdb', '--concurrently', '-i', $toast_index,
+ '--tablespace', $tbspace_name, 'postgres'
+ ],
+ 1,
+ [],
+ [qr/cannot move system relation/],
+ 'reindex toast index concurrently with tablespace');
+
+# connection strings
+$node->command_ok([qw(reindexdb --echo --table=pg_am dbname=template1)],
+ 'reindexdb table with connection string');
+$node->command_ok(
+ [qw(reindexdb --echo dbname=template1)],
+ 'reindexdb database with connection string');
+$node->command_ok(
+ [qw(reindexdb --echo --system dbname=template1)],
+ 'reindexdb system with connection string');
+
+# parallel processing
+$node->safe_psql(
+ 'postgres', q|
+ CREATE SCHEMA s1;
+ CREATE TABLE s1.t1(id integer);
+ CREATE INDEX ON s1.t1(id);
+ CREATE SCHEMA s2;
+ CREATE TABLE s2.t2(id integer);
+ CREATE INDEX ON s2.t2(id);
+ -- empty schema
+ CREATE SCHEMA s3;
+|);
+
+$node->command_fails(
+ [ 'reindexdb', '-j', '2', '-s', 'postgres' ],
+ 'parallel reindexdb cannot process system catalogs');
+$node->command_fails(
+ [ 'reindexdb', '-j', '2', '-i', 'i1', 'postgres' ],
+ 'parallel reindexdb cannot process indexes');
+# Note that the ordering of the commands is not stable, so the second
+# command for s2.t2 is not checked after.
+$node->issues_sql_like(
+ [ 'reindexdb', '-j', '2', '-S', 's1', '-S', 's2', 'postgres' ],
+ qr/statement:\ REINDEX TABLE s1.t1;/,
+ 'parallel reindexdb for schemas does a per-table REINDEX');
+$node->command_ok(
+ [ 'reindexdb', '-j', '2', '-S', 's3' ],
+ 'parallel reindexdb with empty schema');
+$node->command_ok(
+ [ 'reindexdb', '-j', '2', '--concurrently', '-d', 'postgres' ],
+ 'parallel reindexdb on database, concurrently');
+
+done_testing();
diff --git a/src/bin/scripts/t/091_reindexdb_all.pl b/src/bin/scripts/t/091_reindexdb_all.pl
new file mode 100644
index 0000000..7f3e081
--- /dev/null
+++ b/src/bin/scripts/t/091_reindexdb_all.pl
@@ -0,0 +1,35 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$ENV{PGOPTIONS} = '--client-min-messages=WARNING';
+
+$node->issues_sql_like(
+ [ 'reindexdb', '-a' ],
+ qr/statement: REINDEX.*statement: REINDEX/s,
+ 'reindex all databases');
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'reindexdb', '-a' ],
+ 'invalid database not targeted by reindexdb -a');
+
+# Doesn't quite belong here, but don't want to waste time by creating an
+# invalid database in 090_reindexdb.pl as well.
+$node->command_fails_like([ 'reindexdb', '-d', 'regression_invalid'],
+ qr/FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'reindexdb cannot target invalid database');
+
+done_testing();
diff --git a/src/bin/scripts/t/100_vacuumdb.pl b/src/bin/scripts/t/100_vacuumdb.pl
new file mode 100644
index 0000000..925079b
--- /dev/null
+++ b/src/bin/scripts/t/100_vacuumdb.pl
@@ -0,0 +1,212 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('vacuumdb');
+program_version_ok('vacuumdb');
+program_options_handling_ok('vacuumdb');
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'vacuumdb', 'postgres' ],
+ qr/statement: VACUUM.*;/,
+ 'SQL VACUUM run');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-f', 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, FULL\).*;/,
+ 'vacuumdb -f');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-F', 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, FREEZE\).*;/,
+ 'vacuumdb -F');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-zj2', 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, ANALYZE\).*;/,
+ 'vacuumdb -zj2');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-Z', 'postgres' ],
+ qr/statement: ANALYZE.*;/,
+ 'vacuumdb -Z');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--disable-page-skipping', 'postgres' ],
+ qr/statement: VACUUM \(DISABLE_PAGE_SKIPPING, SKIP_DATABASE_STATS\).*;/,
+ 'vacuumdb --disable-page-skipping');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--skip-locked', 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, SKIP_LOCKED\).*;/,
+ 'vacuumdb --skip-locked');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--skip-locked', '--analyze-only', 'postgres' ],
+ qr/statement: ANALYZE \(SKIP_LOCKED\).*;/,
+ 'vacuumdb --skip-locked --analyze-only');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--disable-page-skipping', 'postgres' ],
+ '--analyze-only and --disable-page-skipping specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-index-cleanup', 'postgres' ],
+ qr/statement: VACUUM \(INDEX_CLEANUP FALSE, SKIP_DATABASE_STATS\).*;/,
+ 'vacuumdb --no-index-cleanup');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-index-cleanup', 'postgres' ],
+ '--analyze-only and --no-index-cleanup specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-truncate', 'postgres' ],
+ qr/statement: VACUUM \(TRUNCATE FALSE, SKIP_DATABASE_STATS\).*;/,
+ 'vacuumdb --no-truncate');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-truncate', 'postgres' ],
+ '--analyze-only and --no-truncate specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-process-main', 'postgres' ],
+ qr/statement: VACUUM \(PROCESS_MAIN FALSE, SKIP_DATABASE_STATS\).*;/,
+ 'vacuumdb --no-process-main');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-process-main', 'postgres' ],
+ '--analyze-only and --no-process-main specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--no-process-toast', 'postgres' ],
+ qr/statement: VACUUM \(PROCESS_TOAST FALSE, SKIP_DATABASE_STATS\).*;/,
+ 'vacuumdb --no-process-toast');
+$node->command_fails(
+ [ 'vacuumdb', '--analyze-only', '--no-process-toast', 'postgres' ],
+ '--analyze-only and --no-process-toast specified together');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-P', 2, 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, PARALLEL 2\).*;/,
+ 'vacuumdb -P 2');
+$node->issues_sql_like(
+ [ 'vacuumdb', '-P', 0, 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, PARALLEL 0\).*;/,
+ 'vacuumdb -P 0');
+$node->command_ok([qw(vacuumdb -Z --table=pg_am dbname=template1)],
+ 'vacuumdb with connection string');
+
+$node->command_fails(
+ [qw(vacuumdb -Zt pg_am;ABORT postgres)],
+ 'trailing command in "-t", without COLUMNS');
+
+# Unwanted; better if it failed.
+$node->command_ok(
+ [qw(vacuumdb -Zt pg_am(amname);ABORT postgres)],
+ 'trailing command in "-t", with COLUMNS');
+
+$node->safe_psql(
+ 'postgres', q|
+ CREATE TABLE "need""q(uot" (")x" text);
+ CREATE TABLE vactable (a int, b int);
+ CREATE VIEW vacview AS SELECT 1 as a;
+
+ CREATE FUNCTION f0(int) RETURNS int LANGUAGE SQL AS 'SELECT $1 * $1';
+ CREATE FUNCTION f1(int) RETURNS int LANGUAGE SQL AS 'SELECT f0($1)';
+ CREATE TABLE funcidx (x int);
+ INSERT INTO funcidx VALUES (0),(1),(2),(3);
+ CREATE INDEX i0 ON funcidx ((f1(x)));
+ CREATE SCHEMA "Foo";
+ CREATE TABLE "Foo".bar(id int);
+ CREATE SCHEMA "Bar";
+ CREATE TABLE "Bar".baz(id int);
+|);
+$node->command_ok([qw|vacuumdb -Z --table="need""q(uot"(")x") postgres|],
+ 'column list');
+$node->command_fails(
+ [qw|vacuumdb -Zt funcidx postgres|],
+ 'unqualified name via functional index');
+
+$node->command_fails(
+ [ 'vacuumdb', '--analyze', '--table', 'vactable(c)', 'postgres' ],
+ 'incorrect column name with ANALYZE');
+$node->command_fails([ 'vacuumdb', '-P', -1, 'postgres' ],
+ 'negative parallel degree');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze', '--table', 'vactable(a, b)', 'postgres' ],
+ qr/statement: VACUUM \(SKIP_DATABASE_STATS, ANALYZE\) public.vactable\(a, b\);/,
+ 'vacuumdb --analyze with complete column list');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze-only', '--table', 'vactable(b)', 'postgres' ],
+ qr/statement: ANALYZE public.vactable\(b\);/,
+ 'vacuumdb --analyze-only with partial column list');
+$node->command_checks_all(
+ [ 'vacuumdb', '--analyze', '--table', 'vacview', 'postgres' ],
+ 0,
+ [qr/^.*vacuuming database "postgres"/],
+ [qr/^WARNING.*cannot vacuum non-tables or special system tables/s],
+ 'vacuumdb with view');
+$node->command_fails(
+ [ 'vacuumdb', '--table', 'vactable', '--min-mxid-age', '0', 'postgres' ],
+ 'vacuumdb --min-mxid-age with incorrect value');
+$node->command_fails(
+ [ 'vacuumdb', '--table', 'vactable', '--min-xid-age', '0', 'postgres' ],
+ 'vacuumdb --min-xid-age with incorrect value');
+$node->issues_sql_like(
+ [
+ 'vacuumdb', '--table', 'vactable', '--min-mxid-age',
+ '2147483000', 'postgres'
+ ],
+ qr/GREATEST.*relminmxid.*2147483000/,
+ 'vacuumdb --table --min-mxid-age');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--min-xid-age', '2147483001', 'postgres' ],
+ qr/GREATEST.*relfrozenxid.*2147483001/,
+ 'vacuumdb --table --min-xid-age');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--schema', '"Foo"', 'postgres' ],
+ qr/VACUUM \(SKIP_DATABASE_STATS\) "Foo".bar/,
+ 'vacuumdb --schema');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--schema', '"Foo"', '--schema', '"Bar"', 'postgres' ],
+ qr/VACUUM\ \(SKIP_DATABASE_STATS\)\ "Foo".bar
+ .*VACUUM\ \(SKIP_DATABASE_STATS\)\ "Bar".baz
+ /sx,
+ 'vacuumdb multiple --schema switches');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--exclude-schema', '"Foo"', 'postgres' ],
+ qr/^(?!.*VACUUM \(SKIP_DATABASE_STATS\) "Foo".bar).*$/s,
+ 'vacuumdb --exclude-schema');
+$node->issues_sql_like(
+ [ 'vacuumdb', '--exclude-schema', '"Foo"', '--exclude-schema', '"Bar"', 'postgres' ],
+ qr/^(?!.*VACUUM\ \(SKIP_DATABASE_STATS\)\ "Foo".bar
+ | VACUUM\ \(SKIP_DATABASE_STATS\)\ "Bar".baz).*$/sx,
+ 'vacuumdb multiple --exclude-schema switches');
+$node->command_fails_like(
+ [ 'vacuumdb', '-N', 'pg_catalog', '-t', 'pg_class', 'postgres', ],
+ qr/cannot vacuum specific table\(s\) and exclude schema\(s\) at the same time/,
+ 'cannot use options -N and -t at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-n', 'pg_catalog', '-t', 'pg_class', 'postgres' ],
+ qr/cannot vacuum all tables in schema\(s\) and specific table\(s\) at the same time/,
+ 'cannot use options -n and -t at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-n', 'pg_catalog', '-N', '"Foo"', 'postgres' ],
+ qr/cannot vacuum all tables in schema\(s\) and exclude schema\(s\) at the same time/,
+ 'cannot use options -n and -N at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-a', '-N', '"Foo"' ],
+ qr/cannot exclude specific schema\(s\) in all databases/,
+ 'cannot use options -a and -N at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-a', '-n', '"Foo"' ],
+ qr/cannot vacuum specific schema\(s\) in all databases/,
+ 'cannot use options -a and -n at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-a', '-t', '"Foo".bar' ],
+ qr/cannot vacuum specific table\(s\) in all databases/,
+ 'cannot use options -a and -t at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-a', '-d', 'postgres' ],
+ qr/cannot vacuum all databases and a specific one at the same time/,
+ 'cannot use options -a and -d at the same time');
+$node->command_fails_like(
+ [ 'vacuumdb', '-a', 'postgres' ],
+ qr/cannot vacuum all databases and a specific one at the same time/,
+ 'cannot use option -a and a dbname as argument at the same time');
+
+done_testing();
diff --git a/src/bin/scripts/t/101_vacuumdb_all.pl b/src/bin/scripts/t/101_vacuumdb_all.pl
new file mode 100644
index 0000000..8d7c3ab
--- /dev/null
+++ b/src/bin/scripts/t/101_vacuumdb_all.pl
@@ -0,0 +1,33 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'vacuumdb', '-a' ],
+ qr/statement: VACUUM.*statement: VACUUM/s,
+ 'vacuum all databases');
+
+$node->safe_psql(
+ 'postgres', q(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+$node->command_ok([ 'vacuumdb', '-a' ],
+ 'invalid database not targeted by vacuumdb -a');
+
+# Doesn't quite belong here, but don't want to waste time by creating an
+# invalid database in 010_vacuumdb.pl as well.
+$node->command_fails_like([ 'vacuumdb', '-d', 'regression_invalid'],
+ qr/FATAL: cannot connect to invalid database "regression_invalid"/,
+ 'vacuumdb cannot target invalid database');
+
+done_testing();
diff --git a/src/bin/scripts/t/102_vacuumdb_stages.pl b/src/bin/scripts/t/102_vacuumdb_stages.pl
new file mode 100644
index 0000000..64d7ed1
--- /dev/null
+++ b/src/bin/scripts/t/102_vacuumdb_stages.pl
@@ -0,0 +1,40 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->start;
+
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze-in-stages', 'postgres' ],
+ qr/statement:\ SET\ default_statistics_target=1;\ SET\ vacuum_cost_delay=0;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=10;\ RESET\ vacuum_cost_delay;
+ .*statement:\ ANALYZE
+ .*statement:\ RESET\ default_statistics_target;
+ .*statement:\ ANALYZE/sx,
+ 'analyze three times');
+
+$node->issues_sql_like(
+ [ 'vacuumdb', '--analyze-in-stages', '--all' ],
+ qr/statement:\ SET\ default_statistics_target=1;\ SET\ vacuum_cost_delay=0;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=1;\ SET\ vacuum_cost_delay=0;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=10;\ RESET\ vacuum_cost_delay;
+ .*statement:\ ANALYZE
+ .*statement:\ SET\ default_statistics_target=10;\ RESET\ vacuum_cost_delay;
+ .*statement:\ ANALYZE
+ .*statement:\ RESET\ default_statistics_target;
+ .*statement:\ ANALYZE
+ .*statement:\ RESET\ default_statistics_target;
+ .*statement:\ ANALYZE/sx,
+ 'analyze more than one database in stages');
+
+done_testing();
diff --git a/src/bin/scripts/t/200_connstr.pl b/src/bin/scripts/t/200_connstr.pl
new file mode 100644
index 0000000..53c5e21
--- /dev/null
+++ b/src/bin/scripts/t/200_connstr.pl
@@ -0,0 +1,44 @@
+
+# Copyright (c) 2021-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+# Tests to check connection string handling in utilities
+
+# We're going to use byte sequences that aren't valid UTF-8 strings. Use
+# LATIN1, which accepts any byte and has a conversion from each byte to UTF-8.
+$ENV{LC_ALL} = 'C';
+$ENV{PGCLIENTENCODING} = 'LATIN1';
+
+# Create database names covering the range of LATIN1 characters and
+# run the utilities' --all options over them.
+my $dbname1 = generate_ascii_string(1, 63); # contains '='
+my $dbname2 =
+ generate_ascii_string(67, 129); # skip 64-66 to keep length to 62
+my $dbname3 = generate_ascii_string(130, 192);
+my $dbname4 = generate_ascii_string(193, 255);
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init(extra => [ '--locale=C', '--encoding=LATIN1' ]);
+$node->start;
+
+foreach my $dbname ($dbname1, $dbname2, $dbname3, $dbname4, 'CamelCase')
+{
+ $node->run_log([ 'createdb', $dbname ]);
+}
+
+$node->command_ok(
+ [qw(vacuumdb --all --echo --analyze-only)],
+ 'vacuumdb --all with unusual database names');
+$node->command_ok([qw(reindexdb --all --echo)],
+ 'reindexdb --all with unusual database names');
+$node->command_ok(
+ [qw(clusterdb --all --echo --verbose)],
+ 'clusterdb --all with unusual database names');
+
+done_testing();
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
new file mode 100644
index 0000000..d682573
--- /dev/null
+++ b/src/bin/scripts/vacuumdb.c
@@ -0,0 +1,1197 @@
+/*-------------------------------------------------------------------------
+ *
+ * vacuumdb
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/scripts/vacuumdb.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <limits.h>
+
+#include "catalog/pg_class_d.h"
+#include "common.h"
+#include "common/connect.h"
+#include "common/logging.h"
+#include "fe_utils/cancel.h"
+#include "fe_utils/option_utils.h"
+#include "fe_utils/parallel_slot.h"
+#include "fe_utils/query_utils.h"
+#include "fe_utils/simple_list.h"
+#include "fe_utils/string_utils.h"
+
+
+/* vacuum options controlled by user flags */
+typedef struct vacuumingOptions
+{
+ bool analyze_only;
+ bool verbose;
+ bool and_analyze;
+ bool full;
+ bool freeze;
+ bool disable_page_skipping;
+ bool skip_locked;
+ int min_xid_age;
+ int min_mxid_age;
+ int parallel_workers; /* >= 0 indicates user specified the
+ * parallel degree, otherwise -1 */
+ bool no_index_cleanup;
+ bool force_index_cleanup;
+ bool do_truncate;
+ bool process_main;
+ bool process_toast;
+ bool skip_database_stats;
+ char *buffer_usage_limit;
+} vacuumingOptions;
+
+/* object filter options */
+typedef enum
+{
+ OBJFILTER_NONE = 0, /* no filter used */
+ OBJFILTER_ALL_DBS = (1 << 0), /* -a | --all */
+ OBJFILTER_DATABASE = (1 << 1), /* -d | --dbname */
+ OBJFILTER_TABLE = (1 << 2), /* -t | --table */
+ OBJFILTER_SCHEMA = (1 << 3), /* -n | --schema */
+ OBJFILTER_SCHEMA_EXCLUDE = (1 << 4) /* -N | --exclude-schema */
+} VacObjFilter;
+
+VacObjFilter objfilter = OBJFILTER_NONE;
+
+static void vacuum_one_database(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ int stage,
+ SimpleStringList *objects,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet);
+
+static void vacuum_all_databases(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ bool analyze_in_stages,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet);
+
+static void prepare_vacuum_command(PQExpBuffer sql, int serverVersion,
+ vacuumingOptions *vacopts, const char *table);
+
+static void run_vacuum_command(PGconn *conn, const char *sql, bool echo,
+ const char *table);
+
+static void help(const char *progname);
+
+void check_objfilter(void);
+
+static char *escape_quotes(const char *src);
+
+/* For analyze-in-stages mode */
+#define ANALYZE_NO_STAGE -1
+#define ANALYZE_NUM_STAGES 3
+
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"host", required_argument, NULL, 'h'},
+ {"port", required_argument, NULL, 'p'},
+ {"username", required_argument, NULL, 'U'},
+ {"no-password", no_argument, NULL, 'w'},
+ {"password", no_argument, NULL, 'W'},
+ {"echo", no_argument, NULL, 'e'},
+ {"quiet", no_argument, NULL, 'q'},
+ {"dbname", required_argument, NULL, 'd'},
+ {"analyze", no_argument, NULL, 'z'},
+ {"analyze-only", no_argument, NULL, 'Z'},
+ {"freeze", no_argument, NULL, 'F'},
+ {"all", no_argument, NULL, 'a'},
+ {"table", required_argument, NULL, 't'},
+ {"full", no_argument, NULL, 'f'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"parallel", required_argument, NULL, 'P'},
+ {"schema", required_argument, NULL, 'n'},
+ {"exclude-schema", required_argument, NULL, 'N'},
+ {"maintenance-db", required_argument, NULL, 2},
+ {"analyze-in-stages", no_argument, NULL, 3},
+ {"disable-page-skipping", no_argument, NULL, 4},
+ {"skip-locked", no_argument, NULL, 5},
+ {"min-xid-age", required_argument, NULL, 6},
+ {"min-mxid-age", required_argument, NULL, 7},
+ {"no-index-cleanup", no_argument, NULL, 8},
+ {"force-index-cleanup", no_argument, NULL, 9},
+ {"no-truncate", no_argument, NULL, 10},
+ {"no-process-toast", no_argument, NULL, 11},
+ {"no-process-main", no_argument, NULL, 12},
+ {"buffer-usage-limit", required_argument, NULL, 13},
+ {NULL, 0, NULL, 0}
+ };
+
+ const char *progname;
+ int optindex;
+ int c;
+ const char *dbname = NULL;
+ const char *maintenance_db = NULL;
+ char *host = NULL;
+ char *port = NULL;
+ char *username = NULL;
+ enum trivalue prompt_password = TRI_DEFAULT;
+ ConnParams cparams;
+ bool echo = false;
+ bool quiet = false;
+ vacuumingOptions vacopts;
+ bool analyze_in_stages = false;
+ SimpleStringList objects = {NULL, NULL};
+ int concurrentCons = 1;
+ int tbl_count = 0;
+
+ /* initialize options */
+ memset(&vacopts, 0, sizeof(vacopts));
+ vacopts.parallel_workers = -1;
+ vacopts.buffer_usage_limit = NULL;
+ vacopts.no_index_cleanup = false;
+ vacopts.force_index_cleanup = false;
+ vacopts.do_truncate = true;
+ vacopts.process_main = true;
+ vacopts.process_toast = true;
+
+ pg_logging_init(argv[0]);
+ progname = get_progname(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
+
+ handle_help_version_opts(argc, argv, "vacuumdb", help);
+
+ while ((c = getopt_long(argc, argv, "ad:efFh:j:n:N:p:P:qt:U:vwWzZ", long_options, &optindex)) != -1)
+ {
+ switch (c)
+ {
+ case 'a':
+ objfilter |= OBJFILTER_ALL_DBS;
+ break;
+ case 'd':
+ objfilter |= OBJFILTER_DATABASE;
+ dbname = pg_strdup(optarg);
+ break;
+ case 'e':
+ echo = true;
+ break;
+ case 'f':
+ vacopts.full = true;
+ break;
+ case 'F':
+ vacopts.freeze = true;
+ break;
+ case 'h':
+ host = pg_strdup(optarg);
+ break;
+ case 'j':
+ if (!option_parse_int(optarg, "-j/--jobs", 1, INT_MAX,
+ &concurrentCons))
+ exit(1);
+ break;
+ case 'n':
+ objfilter |= OBJFILTER_SCHEMA;
+ simple_string_list_append(&objects, optarg);
+ break;
+ case 'N':
+ objfilter |= OBJFILTER_SCHEMA_EXCLUDE;
+ simple_string_list_append(&objects, optarg);
+ break;
+ case 'p':
+ port = pg_strdup(optarg);
+ break;
+ case 'P':
+ if (!option_parse_int(optarg, "-P/--parallel", 0, INT_MAX,
+ &vacopts.parallel_workers))
+ exit(1);
+ break;
+ case 'q':
+ quiet = true;
+ break;
+ case 't':
+ objfilter |= OBJFILTER_TABLE;
+ simple_string_list_append(&objects, optarg);
+ tbl_count++;
+ break;
+ case 'U':
+ username = pg_strdup(optarg);
+ break;
+ case 'v':
+ vacopts.verbose = true;
+ break;
+ case 'w':
+ prompt_password = TRI_NO;
+ break;
+ case 'W':
+ prompt_password = TRI_YES;
+ break;
+ case 'z':
+ vacopts.and_analyze = true;
+ break;
+ case 'Z':
+ vacopts.analyze_only = true;
+ break;
+ case 2:
+ maintenance_db = pg_strdup(optarg);
+ break;
+ case 3:
+ analyze_in_stages = vacopts.analyze_only = true;
+ break;
+ case 4:
+ vacopts.disable_page_skipping = true;
+ break;
+ case 5:
+ vacopts.skip_locked = true;
+ break;
+ case 6:
+ if (!option_parse_int(optarg, "--min-xid-age", 1, INT_MAX,
+ &vacopts.min_xid_age))
+ exit(1);
+ break;
+ case 7:
+ if (!option_parse_int(optarg, "--min-mxid-age", 1, INT_MAX,
+ &vacopts.min_mxid_age))
+ exit(1);
+ break;
+ case 8:
+ vacopts.no_index_cleanup = true;
+ break;
+ case 9:
+ vacopts.force_index_cleanup = true;
+ break;
+ case 10:
+ vacopts.do_truncate = false;
+ break;
+ case 11:
+ vacopts.process_toast = false;
+ break;
+ case 12:
+ vacopts.process_main = false;
+ break;
+ case 13:
+ vacopts.buffer_usage_limit = escape_quotes(optarg);
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /*
+ * Non-option argument specifies database name as long as it wasn't
+ * already specified with -d / --dbname
+ */
+ if (optind < argc && dbname == NULL)
+ {
+ objfilter |= OBJFILTER_DATABASE;
+ dbname = argv[optind];
+ optind++;
+ }
+
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /*
+ * Validate the combination of filters specified in the command-line
+ * options.
+ */
+ check_objfilter();
+
+ if (vacopts.analyze_only)
+ {
+ if (vacopts.full)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "full");
+ if (vacopts.freeze)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "freeze");
+ if (vacopts.disable_page_skipping)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "disable-page-skipping");
+ if (vacopts.no_index_cleanup)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-index-cleanup");
+ if (vacopts.force_index_cleanup)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "force-index-cleanup");
+ if (!vacopts.do_truncate)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-truncate");
+ if (!vacopts.process_main)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-process-main");
+ if (!vacopts.process_toast)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "no-process-toast");
+ /* allow 'and_analyze' with 'analyze_only' */
+ }
+
+ /* Prohibit full and analyze_only options with parallel option */
+ if (vacopts.parallel_workers >= 0)
+ {
+ if (vacopts.analyze_only)
+ pg_fatal("cannot use the \"%s\" option when performing only analyze",
+ "parallel");
+ if (vacopts.full)
+ pg_fatal("cannot use the \"%s\" option when performing full vacuum",
+ "parallel");
+ }
+
+ /* Prohibit --no-index-cleanup and --force-index-cleanup together */
+ if (vacopts.no_index_cleanup && vacopts.force_index_cleanup)
+ pg_fatal("cannot use the \"%s\" option with the \"%s\" option",
+ "no-index-cleanup", "force-index-cleanup");
+
+ /*
+ * buffer-usage-limit is not allowed with VACUUM FULL unless ANALYZE is
+ * included too.
+ */
+ if (vacopts.buffer_usage_limit && vacopts.full && !vacopts.and_analyze)
+ pg_fatal("cannot use the \"%s\" option with the \"%s\" option",
+ "buffer-usage-limit", "full");
+
+ /* fill cparams except for dbname, which is set below */
+ cparams.pghost = host;
+ cparams.pgport = port;
+ cparams.pguser = username;
+ cparams.prompt_password = prompt_password;
+ cparams.override_dbname = NULL;
+
+ setup_cancel_handler(NULL);
+
+ /* Avoid opening extra connections. */
+ if (tbl_count && (concurrentCons > tbl_count))
+ concurrentCons = tbl_count;
+
+ if (objfilter & OBJFILTER_ALL_DBS)
+ {
+ cparams.dbname = maintenance_db;
+
+ vacuum_all_databases(&cparams, &vacopts,
+ analyze_in_stages,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ else
+ {
+ if (dbname == NULL)
+ {
+ if (getenv("PGDATABASE"))
+ dbname = getenv("PGDATABASE");
+ else if (getenv("PGUSER"))
+ dbname = getenv("PGUSER");
+ else
+ dbname = get_user_name_or_exit(progname);
+ }
+
+ cparams.dbname = dbname;
+
+ if (analyze_in_stages)
+ {
+ int stage;
+
+ for (stage = 0; stage < ANALYZE_NUM_STAGES; stage++)
+ {
+ vacuum_one_database(&cparams, &vacopts,
+ stage,
+ &objects,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ }
+ else
+ vacuum_one_database(&cparams, &vacopts,
+ ANALYZE_NO_STAGE,
+ &objects,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+
+ exit(0);
+}
+
+/*
+ * Verify that the filters used at command line are compatible.
+ */
+void
+check_objfilter(void)
+{
+ if ((objfilter & OBJFILTER_ALL_DBS) &&
+ (objfilter & OBJFILTER_DATABASE))
+ pg_fatal("cannot vacuum all databases and a specific one at the same time");
+
+ if ((objfilter & OBJFILTER_ALL_DBS) &&
+ (objfilter & OBJFILTER_TABLE))
+ pg_fatal("cannot vacuum specific table(s) in all databases");
+
+ if ((objfilter & OBJFILTER_ALL_DBS) &&
+ (objfilter & OBJFILTER_SCHEMA))
+ pg_fatal("cannot vacuum specific schema(s) in all databases");
+
+ if ((objfilter & OBJFILTER_ALL_DBS) &&
+ (objfilter & OBJFILTER_SCHEMA_EXCLUDE))
+ pg_fatal("cannot exclude specific schema(s) in all databases");
+
+ if ((objfilter & OBJFILTER_TABLE) &&
+ (objfilter & OBJFILTER_SCHEMA))
+ pg_fatal("cannot vacuum all tables in schema(s) and specific table(s) at the same time");
+
+ if ((objfilter & OBJFILTER_TABLE) &&
+ (objfilter & OBJFILTER_SCHEMA_EXCLUDE))
+ pg_fatal("cannot vacuum specific table(s) and exclude schema(s) at the same time");
+
+ if ((objfilter & OBJFILTER_SCHEMA) &&
+ (objfilter & OBJFILTER_SCHEMA_EXCLUDE))
+ pg_fatal("cannot vacuum all tables in schema(s) and exclude schema(s) at the same time");
+}
+
+/*
+ * Returns a newly malloc'd version of 'src' with escaped single quotes and
+ * backslashes.
+ */
+static char *
+escape_quotes(const char *src)
+{
+ char *result = escape_single_quotes_ascii(src);
+
+ if (!result)
+ pg_fatal("out of memory");
+ return result;
+}
+
+/*
+ * vacuum_one_database
+ *
+ * Process tables in the given database. If the 'tables' list is empty,
+ * process all tables in the database.
+ *
+ * Note that this function is only concerned with running exactly one stage
+ * when in analyze-in-stages mode; caller must iterate on us if necessary.
+ *
+ * If concurrentCons is > 1, multiple connections are used to vacuum tables
+ * in parallel. In this case and if the table list is empty, we first obtain
+ * a list of tables from the database.
+ */
+static void
+vacuum_one_database(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ int stage,
+ SimpleStringList *objects,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet)
+{
+ PQExpBufferData sql;
+ PQExpBufferData buf;
+ PQExpBufferData catalog_query;
+ PGresult *res;
+ PGconn *conn;
+ SimpleStringListCell *cell;
+ ParallelSlotArray *sa;
+ SimpleStringList dbtables = {NULL, NULL};
+ int i;
+ int ntups;
+ bool failed = false;
+ bool objects_listed = false;
+ bool has_where = false;
+ const char *initcmd;
+ const char *stage_commands[] = {
+ "SET default_statistics_target=1; SET vacuum_cost_delay=0;",
+ "SET default_statistics_target=10; RESET vacuum_cost_delay;",
+ "RESET default_statistics_target;"
+ };
+ const char *stage_messages[] = {
+ gettext_noop("Generating minimal optimizer statistics (1 target)"),
+ gettext_noop("Generating medium optimizer statistics (10 targets)"),
+ gettext_noop("Generating default (full) optimizer statistics")
+ };
+
+ Assert(stage == ANALYZE_NO_STAGE ||
+ (stage >= 0 && stage < ANALYZE_NUM_STAGES));
+
+ conn = connectDatabase(cparams, progname, echo, false, true);
+
+ if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "disable-page-skipping", "9.6");
+ }
+
+ if (vacopts->no_index_cleanup && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-index-cleanup", "12");
+ }
+
+ if (vacopts->force_index_cleanup && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "force-index-cleanup", "12");
+ }
+
+ if (!vacopts->do_truncate && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-truncate", "12");
+ }
+
+ if (!vacopts->process_main && PQserverVersion(conn) < 160000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-process-main", "16");
+ }
+
+ if (!vacopts->process_toast && PQserverVersion(conn) < 140000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "no-process-toast", "14");
+ }
+
+ if (vacopts->skip_locked && PQserverVersion(conn) < 120000)
+ {
+ PQfinish(conn);
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "skip-locked", "12");
+ }
+
+ if (vacopts->min_xid_age != 0 && PQserverVersion(conn) < 90600)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--min-xid-age", "9.6");
+
+ if (vacopts->min_mxid_age != 0 && PQserverVersion(conn) < 90600)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--min-mxid-age", "9.6");
+
+ if (vacopts->parallel_workers >= 0 && PQserverVersion(conn) < 130000)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--parallel", "13");
+
+ if (vacopts->buffer_usage_limit && PQserverVersion(conn) < 160000)
+ pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "--buffer-usage-limit", "16");
+
+ /* skip_database_stats is used automatically if server supports it */
+ vacopts->skip_database_stats = (PQserverVersion(conn) >= 160000);
+
+ if (!quiet)
+ {
+ if (stage != ANALYZE_NO_STAGE)
+ printf(_("%s: processing database \"%s\": %s\n"),
+ progname, PQdb(conn), _(stage_messages[stage]));
+ else
+ printf(_("%s: vacuuming database \"%s\"\n"),
+ progname, PQdb(conn));
+ fflush(stdout);
+ }
+
+ /*
+ * Prepare the list of tables to process by querying the catalogs.
+ *
+ * Since we execute the constructed query with the default search_path
+ * (which could be unsafe), everything in this query MUST be fully
+ * qualified.
+ *
+ * First, build a WITH clause for the catalog query if any tables were
+ * specified, with a set of values made of relation names and their
+ * optional set of columns. This is used to match any provided column
+ * lists with the generated qualified identifiers and to filter for the
+ * tables provided via --table. If a listed table does not exist, the
+ * catalog query will fail.
+ */
+ initPQExpBuffer(&catalog_query);
+ for (cell = objects ? objects->head : NULL; cell; cell = cell->next)
+ {
+ char *just_table = NULL;
+ const char *just_columns = NULL;
+
+ if (!objects_listed)
+ {
+ appendPQExpBufferStr(&catalog_query,
+ "WITH listed_objects (object_oid, column_list) "
+ "AS (\n VALUES (");
+ objects_listed = true;
+ }
+ else
+ appendPQExpBufferStr(&catalog_query, ",\n (");
+
+ if (objfilter & (OBJFILTER_SCHEMA | OBJFILTER_SCHEMA_EXCLUDE))
+ {
+ appendStringLiteralConn(&catalog_query, cell->val, conn);
+ appendPQExpBufferStr(&catalog_query, "::pg_catalog.regnamespace, ");
+ }
+
+ if (objfilter & OBJFILTER_TABLE)
+ {
+ /*
+ * Split relation and column names given by the user, this is used
+ * to feed the CTE with values on which are performed pre-run
+ * validity checks as well. For now these happen only on the
+ * relation name.
+ */
+ splitTableColumnsSpec(cell->val, PQclientEncoding(conn),
+ &just_table, &just_columns);
+
+ appendStringLiteralConn(&catalog_query, just_table, conn);
+ appendPQExpBufferStr(&catalog_query, "::pg_catalog.regclass, ");
+ }
+
+ if (just_columns && just_columns[0] != '\0')
+ appendStringLiteralConn(&catalog_query, just_columns, conn);
+ else
+ appendPQExpBufferStr(&catalog_query, "NULL");
+
+ appendPQExpBufferStr(&catalog_query, "::pg_catalog.text)");
+
+ pg_free(just_table);
+ }
+
+ /* Finish formatting the CTE */
+ if (objects_listed)
+ appendPQExpBufferStr(&catalog_query, "\n)\n");
+
+ appendPQExpBufferStr(&catalog_query, "SELECT c.relname, ns.nspname");
+
+ if (objects_listed)
+ appendPQExpBufferStr(&catalog_query, ", listed_objects.column_list");
+
+ appendPQExpBufferStr(&catalog_query,
+ " FROM pg_catalog.pg_class c\n"
+ " JOIN pg_catalog.pg_namespace ns"
+ " ON c.relnamespace OPERATOR(pg_catalog.=) ns.oid\n"
+ " LEFT JOIN pg_catalog.pg_class t"
+ " ON c.reltoastrelid OPERATOR(pg_catalog.=) t.oid\n");
+
+ /* Used to match the tables or schemas listed by the user */
+ if (objects_listed)
+ {
+ appendPQExpBufferStr(&catalog_query, " LEFT JOIN listed_objects"
+ " ON listed_objects.object_oid"
+ " OPERATOR(pg_catalog.=) ");
+
+ if (objfilter & OBJFILTER_TABLE)
+ appendPQExpBufferStr(&catalog_query, "c.oid\n");
+ else
+ appendPQExpBufferStr(&catalog_query, "ns.oid\n");
+
+ if (objfilter & OBJFILTER_SCHEMA_EXCLUDE)
+ appendPQExpBuffer(&catalog_query,
+ " WHERE listed_objects.object_oid IS NULL\n");
+ else
+ appendPQExpBuffer(&catalog_query,
+ " WHERE listed_objects.object_oid IS NOT NULL\n");
+ has_where = true;
+ }
+
+ /*
+ * If no tables were listed, filter for the relevant relation types. If
+ * tables were given via --table, don't bother filtering by relation type.
+ * Instead, let the server decide whether a given relation can be
+ * processed in which case the user will know about it.
+ */
+ if ((objfilter & OBJFILTER_TABLE) == 0)
+ {
+ appendPQExpBuffer(&catalog_query,
+ " %s c.relkind OPERATOR(pg_catalog.=) ANY (array["
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) "])\n",
+ has_where ? "AND" : "WHERE");
+ has_where = true;
+ }
+
+ /*
+ * For --min-xid-age and --min-mxid-age, the age of the relation is the
+ * greatest of the ages of the main relation and its associated TOAST
+ * table. The commands generated by vacuumdb will also process the TOAST
+ * table for the relation if necessary, so it does not need to be
+ * considered separately.
+ */
+ if (vacopts->min_xid_age != 0)
+ {
+ appendPQExpBuffer(&catalog_query,
+ " %s GREATEST(pg_catalog.age(c.relfrozenxid),"
+ " pg_catalog.age(t.relfrozenxid)) "
+ " OPERATOR(pg_catalog.>=) '%d'::pg_catalog.int4\n"
+ " AND c.relfrozenxid OPERATOR(pg_catalog.!=)"
+ " '0'::pg_catalog.xid\n",
+ has_where ? "AND" : "WHERE", vacopts->min_xid_age);
+ has_where = true;
+ }
+
+ if (vacopts->min_mxid_age != 0)
+ {
+ appendPQExpBuffer(&catalog_query,
+ " %s GREATEST(pg_catalog.mxid_age(c.relminmxid),"
+ " pg_catalog.mxid_age(t.relminmxid)) OPERATOR(pg_catalog.>=)"
+ " '%d'::pg_catalog.int4\n"
+ " AND c.relminmxid OPERATOR(pg_catalog.!=)"
+ " '0'::pg_catalog.xid\n",
+ has_where ? "AND" : "WHERE", vacopts->min_mxid_age);
+ has_where = true;
+ }
+
+ /*
+ * Execute the catalog query. We use the default search_path for this
+ * query for consistency with table lookups done elsewhere by the user.
+ */
+ appendPQExpBufferStr(&catalog_query, " ORDER BY c.relpages DESC;");
+ executeCommand(conn, "RESET search_path;", echo);
+ res = executeQuery(conn, catalog_query.data, echo);
+ termPQExpBuffer(&catalog_query);
+ PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, echo));
+
+ /*
+ * If no rows are returned, there are no matching tables, so we are done.
+ */
+ ntups = PQntuples(res);
+ if (ntups == 0)
+ {
+ PQclear(res);
+ PQfinish(conn);
+ return;
+ }
+
+ /*
+ * Build qualified identifiers for each table, including the column list
+ * if given.
+ */
+ initPQExpBuffer(&buf);
+ for (i = 0; i < ntups; i++)
+ {
+ appendPQExpBufferStr(&buf,
+ fmtQualifiedId(PQgetvalue(res, i, 1),
+ PQgetvalue(res, i, 0)));
+
+ if (objects_listed && !PQgetisnull(res, i, 2))
+ appendPQExpBufferStr(&buf, PQgetvalue(res, i, 2));
+
+ simple_string_list_append(&dbtables, buf.data);
+ resetPQExpBuffer(&buf);
+ }
+ termPQExpBuffer(&buf);
+ PQclear(res);
+
+ /*
+ * Ensure concurrentCons is sane. If there are more connections than
+ * vacuumable relations, we don't need to use them all.
+ */
+ if (concurrentCons > ntups)
+ concurrentCons = ntups;
+ if (concurrentCons <= 0)
+ concurrentCons = 1;
+
+ /*
+ * All slots need to be prepared to run the appropriate analyze stage, if
+ * caller requested that mode. We have to prepare the initial connection
+ * ourselves before setting up the slots.
+ */
+ if (stage == ANALYZE_NO_STAGE)
+ initcmd = NULL;
+ else
+ {
+ initcmd = stage_commands[stage];
+ executeCommand(conn, initcmd, echo);
+ }
+
+ /*
+ * Setup the database connections. We reuse the connection we already have
+ * for the first slot. If not in parallel mode, the first slot in the
+ * array contains the connection.
+ */
+ sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, initcmd);
+ ParallelSlotsAdoptConn(sa, conn);
+
+ initPQExpBuffer(&sql);
+
+ cell = dbtables.head;
+ do
+ {
+ const char *tabname = cell->val;
+ ParallelSlot *free_slot;
+
+ if (CancelRequested)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ free_slot = ParallelSlotsGetIdle(sa, NULL);
+ if (!free_slot)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ prepare_vacuum_command(&sql, PQserverVersion(free_slot->connection),
+ vacopts, tabname);
+
+ /*
+ * Execute the vacuum. All errors are handled in processQueryResult
+ * through ParallelSlotsGetIdle.
+ */
+ ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
+ run_vacuum_command(free_slot->connection, sql.data,
+ echo, tabname);
+
+ cell = cell->next;
+ } while (cell != NULL);
+
+ if (!ParallelSlotsWaitCompletion(sa))
+ {
+ failed = true;
+ goto finish;
+ }
+
+ /* If we used SKIP_DATABASE_STATS, mop up with ONLY_DATABASE_STATS */
+ if (vacopts->skip_database_stats && stage == ANALYZE_NO_STAGE)
+ {
+ const char *cmd = "VACUUM (ONLY_DATABASE_STATS);";
+ ParallelSlot *free_slot = ParallelSlotsGetIdle(sa, NULL);
+
+ if (!free_slot)
+ {
+ failed = true;
+ goto finish;
+ }
+
+ ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
+ run_vacuum_command(free_slot->connection, cmd, echo, NULL);
+
+ if (!ParallelSlotsWaitCompletion(sa))
+ failed = true;
+ }
+
+finish:
+ ParallelSlotsTerminate(sa);
+ pg_free(sa);
+
+ termPQExpBuffer(&sql);
+
+ if (failed)
+ exit(1);
+}
+
+/*
+ * Vacuum/analyze all connectable databases.
+ *
+ * In analyze-in-stages mode, we process all databases in one stage before
+ * moving on to the next stage. That ensure minimal stats are available
+ * quickly everywhere before generating more detailed ones.
+ */
+static void
+vacuum_all_databases(ConnParams *cparams,
+ vacuumingOptions *vacopts,
+ bool analyze_in_stages,
+ int concurrentCons,
+ const char *progname, bool echo, bool quiet)
+{
+ PGconn *conn;
+ PGresult *result;
+ int stage;
+ int i;
+
+ conn = connectMaintenanceDatabase(cparams, progname, echo);
+ result = executeQuery(conn,
+ "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
+ echo);
+ PQfinish(conn);
+
+ if (analyze_in_stages)
+ {
+ /*
+ * When analyzing all databases in stages, we analyze them all in the
+ * fastest stage first, so that initial statistics become available
+ * for all of them as soon as possible.
+ *
+ * This means we establish several times as many connections, but
+ * that's a secondary consideration.
+ */
+ for (stage = 0; stage < ANALYZE_NUM_STAGES; stage++)
+ {
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ cparams->override_dbname = PQgetvalue(result, i, 0);
+
+ vacuum_one_database(cparams, vacopts,
+ stage,
+ NULL,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < PQntuples(result); i++)
+ {
+ cparams->override_dbname = PQgetvalue(result, i, 0);
+
+ vacuum_one_database(cparams, vacopts,
+ ANALYZE_NO_STAGE,
+ NULL,
+ concurrentCons,
+ progname, echo, quiet);
+ }
+ }
+
+ PQclear(result);
+}
+
+/*
+ * Construct a vacuum/analyze command to run based on the given options, in the
+ * given string buffer, which may contain previous garbage.
+ *
+ * The table name used must be already properly quoted. The command generated
+ * depends on the server version involved and it is semicolon-terminated.
+ */
+static void
+prepare_vacuum_command(PQExpBuffer sql, int serverVersion,
+ vacuumingOptions *vacopts, const char *table)
+{
+ const char *paren = " (";
+ const char *comma = ", ";
+ const char *sep = paren;
+
+ resetPQExpBuffer(sql);
+
+ if (vacopts->analyze_only)
+ {
+ appendPQExpBufferStr(sql, "ANALYZE");
+
+ /* parenthesized grammar of ANALYZE is supported since v11 */
+ if (serverVersion >= 110000)
+ {
+ if (vacopts->skip_locked)
+ {
+ /* SKIP_LOCKED is supported since v12 */
+ Assert(serverVersion >= 120000);
+ appendPQExpBuffer(sql, "%sSKIP_LOCKED", sep);
+ sep = comma;
+ }
+ if (vacopts->verbose)
+ {
+ appendPQExpBuffer(sql, "%sVERBOSE", sep);
+ sep = comma;
+ }
+ if (vacopts->buffer_usage_limit)
+ {
+ Assert(serverVersion >= 160000);
+ appendPQExpBuffer(sql, "%sBUFFER_USAGE_LIMIT '%s'", sep,
+ vacopts->buffer_usage_limit);
+ sep = comma;
+ }
+ if (sep != paren)
+ appendPQExpBufferChar(sql, ')');
+ }
+ else
+ {
+ if (vacopts->verbose)
+ appendPQExpBufferStr(sql, " VERBOSE");
+ }
+ }
+ else
+ {
+ appendPQExpBufferStr(sql, "VACUUM");
+
+ /* parenthesized grammar of VACUUM is supported since v9.0 */
+ if (serverVersion >= 90000)
+ {
+ if (vacopts->disable_page_skipping)
+ {
+ /* DISABLE_PAGE_SKIPPING is supported since v9.6 */
+ Assert(serverVersion >= 90600);
+ appendPQExpBuffer(sql, "%sDISABLE_PAGE_SKIPPING", sep);
+ sep = comma;
+ }
+ if (vacopts->no_index_cleanup)
+ {
+ /* "INDEX_CLEANUP FALSE" has been supported since v12 */
+ Assert(serverVersion >= 120000);
+ Assert(!vacopts->force_index_cleanup);
+ appendPQExpBuffer(sql, "%sINDEX_CLEANUP FALSE", sep);
+ sep = comma;
+ }
+ if (vacopts->force_index_cleanup)
+ {
+ /* "INDEX_CLEANUP TRUE" has been supported since v12 */
+ Assert(serverVersion >= 120000);
+ Assert(!vacopts->no_index_cleanup);
+ appendPQExpBuffer(sql, "%sINDEX_CLEANUP TRUE", sep);
+ sep = comma;
+ }
+ if (!vacopts->do_truncate)
+ {
+ /* TRUNCATE is supported since v12 */
+ Assert(serverVersion >= 120000);
+ appendPQExpBuffer(sql, "%sTRUNCATE FALSE", sep);
+ sep = comma;
+ }
+ if (!vacopts->process_main)
+ {
+ /* PROCESS_MAIN is supported since v16 */
+ Assert(serverVersion >= 160000);
+ appendPQExpBuffer(sql, "%sPROCESS_MAIN FALSE", sep);
+ sep = comma;
+ }
+ if (!vacopts->process_toast)
+ {
+ /* PROCESS_TOAST is supported since v14 */
+ Assert(serverVersion >= 140000);
+ appendPQExpBuffer(sql, "%sPROCESS_TOAST FALSE", sep);
+ sep = comma;
+ }
+ if (vacopts->skip_database_stats)
+ {
+ /* SKIP_DATABASE_STATS is supported since v16 */
+ Assert(serverVersion >= 160000);
+ appendPQExpBuffer(sql, "%sSKIP_DATABASE_STATS", sep);
+ sep = comma;
+ }
+ if (vacopts->skip_locked)
+ {
+ /* SKIP_LOCKED is supported since v12 */
+ Assert(serverVersion >= 120000);
+ appendPQExpBuffer(sql, "%sSKIP_LOCKED", sep);
+ sep = comma;
+ }
+ if (vacopts->full)
+ {
+ appendPQExpBuffer(sql, "%sFULL", sep);
+ sep = comma;
+ }
+ if (vacopts->freeze)
+ {
+ appendPQExpBuffer(sql, "%sFREEZE", sep);
+ sep = comma;
+ }
+ if (vacopts->verbose)
+ {
+ appendPQExpBuffer(sql, "%sVERBOSE", sep);
+ sep = comma;
+ }
+ if (vacopts->and_analyze)
+ {
+ appendPQExpBuffer(sql, "%sANALYZE", sep);
+ sep = comma;
+ }
+ if (vacopts->parallel_workers >= 0)
+ {
+ /* PARALLEL is supported since v13 */
+ Assert(serverVersion >= 130000);
+ appendPQExpBuffer(sql, "%sPARALLEL %d", sep,
+ vacopts->parallel_workers);
+ sep = comma;
+ }
+ if (vacopts->buffer_usage_limit)
+ {
+ Assert(serverVersion >= 160000);
+ appendPQExpBuffer(sql, "%sBUFFER_USAGE_LIMIT '%s'", sep,
+ vacopts->buffer_usage_limit);
+ sep = comma;
+ }
+ if (sep != paren)
+ appendPQExpBufferChar(sql, ')');
+ }
+ else
+ {
+ if (vacopts->full)
+ appendPQExpBufferStr(sql, " FULL");
+ if (vacopts->freeze)
+ appendPQExpBufferStr(sql, " FREEZE");
+ if (vacopts->verbose)
+ appendPQExpBufferStr(sql, " VERBOSE");
+ if (vacopts->and_analyze)
+ appendPQExpBufferStr(sql, " ANALYZE");
+ }
+ }
+
+ appendPQExpBuffer(sql, " %s;", table);
+}
+
+/*
+ * Send a vacuum/analyze command to the server, returning after sending the
+ * command.
+ *
+ * Any errors during command execution are reported to stderr.
+ */
+static void
+run_vacuum_command(PGconn *conn, const char *sql, bool echo,
+ const char *table)
+{
+ bool status;
+
+ if (echo)
+ printf("%s\n", sql);
+
+ status = PQsendQuery(conn, sql) == 1;
+
+ if (!status)
+ {
+ if (table)
+ pg_log_error("vacuuming of table \"%s\" in database \"%s\" failed: %s",
+ table, PQdb(conn), PQerrorMessage(conn));
+ else
+ pg_log_error("vacuuming of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
+ }
+}
+
+static void
+help(const char *progname)
+{
+ printf(_("%s cleans and analyzes a PostgreSQL database.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DBNAME]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" -a, --all vacuum all databases\n"));
+ printf(_(" --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n"));
+ printf(_(" -d, --dbname=DBNAME database to vacuum\n"));
+ printf(_(" --disable-page-skipping disable all page-skipping behavior\n"));
+ printf(_(" -e, --echo show the commands being sent to the server\n"));
+ printf(_(" -f, --full do full vacuuming\n"));
+ printf(_(" -F, --freeze freeze row transaction information\n"));
+ printf(_(" --force-index-cleanup always remove index entries that point to dead tuples\n"));
+ printf(_(" -j, --jobs=NUM use this many concurrent connections to vacuum\n"));
+ printf(_(" --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n"));
+ printf(_(" --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n"));
+ printf(_(" --no-index-cleanup don't remove index entries that point to dead tuples\n"));
+ printf(_(" --no-process-main skip the main relation\n"));
+ printf(_(" --no-process-toast skip the TOAST table associated with the table to vacuum\n"));
+ printf(_(" --no-truncate don't truncate empty pages at the end of the table\n"));
+ printf(_(" -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n"));
+ printf(_(" -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n"));
+ printf(_(" -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n"));
+ printf(_(" -q, --quiet don't write any messages\n"));
+ printf(_(" --skip-locked skip relations that cannot be immediately locked\n"));
+ printf(_(" -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n"));
+ printf(_(" -v, --verbose write a lot of output\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -z, --analyze update optimizer statistics\n"));
+ printf(_(" -Z, --analyze-only only update optimizer statistics; no vacuum\n"));
+ printf(_(" --analyze-in-stages only update optimizer statistics, in multiple\n"
+ " stages for faster results; no vacuum\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nConnection options:\n"));
+ printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
+ printf(_(" -p, --port=PORT database server port\n"));
+ printf(_(" -U, --username=USERNAME user name to connect as\n"));
+ printf(_(" -w, --no-password never prompt for password\n"));
+ printf(_(" -W, --password force password prompt\n"));
+ printf(_(" --maintenance-db=DBNAME alternate maintenance database\n"));
+ printf(_("\nRead the description of the SQL command VACUUM for details.\n"));
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}